diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index b35b0a4cf7fcb6..09c3b2a4c26a85 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -143,6 +143,7 @@ # Actions /.github/workflows/* @nodejs/actions +/.github/workflows/create-release-proposal.yml @nodejs/releasers /tools/actions/* @nodejs/actions # Test runner diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 33aaa6304fee00..b9770e23a2e353 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -8,7 +8,7 @@ updates: interval: monthly commit-message: prefix: meta - open-pull-requests-limit: 10 + open-pull-requests-limit: ${{secrets.OPEN_PR_LIMIT}} - package-ecosystem: npm directory: /tools/eslint @@ -16,7 +16,7 @@ updates: interval: monthly commit-message: prefix: tools - open-pull-requests-limit: 10 + open-pull-requests-limit: ${{secrets.OPEN_PR_LIMIT}} groups: eslint: applies-to: version-updates @@ -29,7 +29,7 @@ updates: interval: monthly commit-message: prefix: tools - open-pull-requests-limit: 10 + open-pull-requests-limit: ${{secrets.OPEN_PR_LIMIT}} groups: lint-md: applies-to: version-updates diff --git a/.github/label-pr-config.yml b/.github/label-pr-config.yml index ea3f1d145e414c..809ec49eb029e7 100644 --- a/.github/label-pr-config.yml +++ b/.github/label-pr-config.yml @@ -125,6 +125,8 @@ exlusiveLabels: /^test\/es-module\//: test, esm /^test\/fixtures\/wpt\/streams\//: test, web streams /^test\/fixtures\/typescript/: test, strip-types + /^test\/module-hooks\//: test, module, loaders + /^test\/fixtures/module-hooks\//: test, module, loaders /^test\//: test diff --git a/.github/workflows/coverage-linux-without-intl.yml b/.github/workflows/coverage-linux-without-intl.yml index ddd85fb8a4ff0e..1977eda3f97e03 100644 --- a/.github/workflows/coverage-linux-without-intl.yml +++ b/.github/workflows/coverage-linux-without-intl.yml @@ -79,7 +79,6 @@ jobs: - name: Clean tmp run: rm -rf coverage/tmp && rm -rf out - name: Upload - uses: codecov/codecov-action@b9fd7d16f6d7d1b5d2bec1a2887e65ceed900238 # v4.6.0 + uses: codecov/codecov-action@015f24e6818733317a2da2edd6290ab26238649a # v5.0.7 with: directory: ./coverage - token: ${{ secrets.CODECOV_TOKEN }} diff --git a/.github/workflows/coverage-linux.yml b/.github/workflows/coverage-linux.yml index 153504ba4280d6..164c0b540a9f45 100644 --- a/.github/workflows/coverage-linux.yml +++ b/.github/workflows/coverage-linux.yml @@ -79,7 +79,6 @@ jobs: - name: Clean tmp run: rm -rf coverage/tmp && rm -rf out - name: Upload - uses: codecov/codecov-action@b9fd7d16f6d7d1b5d2bec1a2887e65ceed900238 # v4.6.0 + uses: codecov/codecov-action@015f24e6818733317a2da2edd6290ab26238649a # v5.0.7 with: directory: ./coverage - token: ${{ secrets.CODECOV_TOKEN }} diff --git a/.github/workflows/coverage-windows.yml b/.github/workflows/coverage-windows.yml index 84feb7b09018de..fada006e321520 100644 --- a/.github/workflows/coverage-windows.yml +++ b/.github/workflows/coverage-windows.yml @@ -71,7 +71,6 @@ jobs: - name: Clean tmp run: npx rimraf ./coverage/tmp - name: Upload - uses: codecov/codecov-action@b9fd7d16f6d7d1b5d2bec1a2887e65ceed900238 # v4.6.0 + uses: codecov/codecov-action@015f24e6818733317a2da2edd6290ab26238649a # v5.0.7 with: directory: ./coverage - token: ${{ secrets.CODECOV_TOKEN }} diff --git a/.github/workflows/create-release-proposal.yml b/.github/workflows/create-release-proposal.yml new file mode 100644 index 00000000000000..f3add22090cbc0 --- /dev/null +++ b/.github/workflows/create-release-proposal.yml @@ -0,0 +1,82 @@ +# This action requires the following secrets to be set on the repository: +# GH_USER_TOKEN: GitHub user token, to be used by ncu and to push changes + +name: Create Release Proposal + +on: + workflow_dispatch: + inputs: + release-line: + required: true + type: number + description: 'The release line (without dots or prefix). e.g: 22' + release-date: + required: true + type: string + description: The release date in YYYY-MM-DD format + +concurrency: ${{ github.workflow }} + +env: + NODE_VERSION: lts/* + +permissions: + contents: write + pull-requests: write + +jobs: + releasePrepare: + env: + STAGING_BRANCH: v${{ inputs.release-line }}.x-staging + RELEASE_BRANCH: v${{ inputs.release-line }}.x + RELEASE_DATE: ${{ inputs.release-date }} + RELEASE_LINE: ${{ inputs.release-line }} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + ref: ${{ env.STAGING_BRANCH }} + persist-credentials: false + + # Install dependencies + - name: Install Node.js + uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 + with: + node-version: ${{ env.NODE_VERSION }} + + - name: Install @node-core/utils + run: npm install -g @node-core/utils + + - name: Configure @node-core/utils + run: | + ncu-config set branch "${RELEASE_BRANCH}" + ncu-config set upstream origin + ncu-config set username "$GITHUB_ACTOR" + ncu-config set token "$GH_TOKEN" + ncu-config set repo "$(echo "$GITHUB_REPOSITORY" | cut -d/ -f2)" + ncu-config set owner "${GITHUB_REPOSITORY_OWNER}" + env: + GH_TOKEN: ${{ github.token }} + + - name: Set up ghauth config (Ubuntu) + run: | + mkdir -p "${XDG_CONFIG_HOME:-~/.config}/changelog-maker" + echo '{}' | jq '{user: env.GITHUB_ACTOR, token: env.TOKEN}' > "${XDG_CONFIG_HOME:-~/.config}/changelog-maker/config.json" + env: + TOKEN: ${{ github.token }} + + - name: Setup git author + run: | + git config --local user.email "github-bot@iojs.org" + git config --local user.name "Node.js GitHub Bot" + + - name: Start git node release prepare + # The curl command is to make sure we run the version of the script corresponding to the current workflow. + run: | + git update-index --assume-unchanged tools/actions/create-release.sh + curl -fsSLo tools/actions/create-release.sh https://github.com/${GITHUB_REPOSITORY}/raw/${GITHUB_SHA}/tools/actions/create-release.sh + ./tools/actions/create-release.sh "${RELEASE_DATE}" "${RELEASE_LINE}" "${GITHUB_ACTOR}" + env: + GH_TOKEN: ${{ github.token }} + # We want the bot to push the push the release commit so CI runs on it. + BOT_TOKEN: ${{ secrets.GH_USER_TOKEN }} diff --git a/.github/workflows/lint-release-proposal.yml b/.github/workflows/lint-release-proposal.yml new file mode 100644 index 00000000000000..1ea2b4b1b173e2 --- /dev/null +++ b/.github/workflows/lint-release-proposal.yml @@ -0,0 +1,62 @@ +name: Linters (release proposals) + +on: + push: + branches: + - v[0-9]+.[0-9]+.[0-9]+-proposal + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +env: + PYTHON_VERSION: '3.12' + NODE_VERSION: lts/* + +permissions: + contents: read + +jobs: + lint-release-commit: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: false + - name: Lint release commit title format + run: | + EXPECTED_TITLE='^[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}, Version [[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+ (\(Current|'.+' \(LTS)\)$' + echo "Expected commit title format: $EXPECTED_TITLE" + COMMIT_SUBJECT="$(git --no-pager log -1 --format=%s)" + echo "Actual: $ACTUAL" + echo "$COMMIT_SUBJECT" | grep -q -E "$EXPECTED_TITLE" + echo "COMMIT_SUBJECT=$COMMIT_SUBJECT" >> "$GITHUB_ENV" + - name: Lint release commit message trailers + run: | + EXPECTED_TRAILER="^PR-URL: $GITHUB_SERVER_URL/$GITHUB_REPOSITORY/pull/[[:digit:]]+\$" + echo "Expected trailer format: $EXPECTED_TRAILER" + ACTUAL="$(git --no-pager log -1 --format=%b | git interpret-trailers --parse --no-divider)" + echo "Actual: $ACTUAL" + echo "$ACTUAL" | grep -E -q "$EXPECTED_TRAILER" + + PR_URL="${ACTUAL:8}" + PR_HEAD="$(gh pr view "$PR_URL" --json headRefOid -q .headRefOid)" + echo "Head of $PR_URL: $PR_HEAD" + echo "Current commit: $GITHUB_SHA" + [ "$PR_HEAD" = "$GITHUB_SHA" ] + env: + GH_TOKEN: ${{ github.token }} + - name: Validate CHANGELOG + id: releaser-info + run: | + EXPECTED_CHANGELOG_TITLE_INTRO="## $COMMIT_SUBJECT, @" + echo "Expected CHANGELOG section title: $EXPECTED_CHANGELOG_TITLE_INTRO" + CHANGELOG_TITLE="$(grep "$EXPECTED_CHANGELOG_TITLE_INTRO" "doc/changelogs/CHANGELOG_V${COMMIT_SUBJECT:20:2}.md")" + echo "Actual: $CHANGELOG_TITLE" + [ "${CHANGELOG_TITLE%%@*}@" = "$EXPECTED_CHANGELOG_TITLE_INTRO" ] + - name: Verify NODE_VERSION_IS_RELEASE bit is correctly set + run: | + grep -q '^#define NODE_VERSION_IS_RELEASE 1$' src/node_version.h + - name: Check for placeholders in documentation + run: | + ! grep "REPLACEME" doc/api/*.md diff --git a/.github/workflows/major-release.yml b/.github/workflows/major-release.yml new file mode 100644 index 00000000000000..a90be1798fac85 --- /dev/null +++ b/.github/workflows/major-release.yml @@ -0,0 +1,48 @@ +name: Major Release + +on: + schedule: + - cron: 0 0 15 2,8 * # runs at midnight UTC every 15 February and 15 August + +permissions: + contents: read + +jobs: + create-issue: + runs-on: ubuntu-latest + permissions: + issues: write + steps: + - name: Check for release schedule + id: check-date + run: | + # Get the current month and day + MONTH=$(date +'%m') + DAY=$(date +'%d') + # We'll create the reminder issue two months prior the release + if [[ "$MONTH" == "02" || "$MONTH" == "08" ]] && [[ "$DAY" == "15" ]]; then + echo "create_issue=true" >> "$GITHUB_ENV" + fi + - name: Retrieve next major release info from nodejs/Release + if: env.create_issue == 'true' + run: | + curl -L https://github.com/nodejs/Release/raw/HEAD/schedule.json | \ + jq -r 'to_entries | map(select(.value.start | strptime("%Y-%m-%d") | mktime > now)) | first | "VERSION=" + .key + "\nRELEASE_DATE=" + .value.start' >> "$GITHUB_ENV" + - name: Compute max date for landing semver-major PRs + if: env.create_issue == 'true' + run: | + echo "PR_MAX_DATE=$(date -d "$RELEASE_DATE -1 month" +%Y-%m-%d)" >> "$GITHUB_ENV" + - name: Create release announcement issue + if: env.create_issue == 'true' + run: | + gh issue create --repo "${GITHUB_REPOSITORY}" \ + --title "Upcoming Node.js Major Release ($VERSION)" \ + --body-file -< temp-output - # cat temp-output - # tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true - # rm temp-output + - id: libuv + subsystem: deps + label: dependencies + run: | + ./tools/dep_updaters/update-libuv.sh > temp-output + cat temp-output + tail -n1 temp-output | grep "NEW_VERSION=" >> "$GITHUB_ENV" || true + rm temp-output - id: llhttp subsystem: deps label: dependencies diff --git a/.github/workflows/update-wpt.yml b/.github/workflows/update-wpt.yml new file mode 100644 index 00000000000000..72ec030e9d645a --- /dev/null +++ b/.github/workflows/update-wpt.yml @@ -0,0 +1,83 @@ +name: WPT update + +on: + schedule: + # Run once a week at 12:00 AM UTC on Sunday. + - cron: 0 0 * * * + workflow_dispatch: + inputs: + subsystems: + description: Subsystem to run the update for + required: false + default: '["url", "WebCryptoAPI"]' + +permissions: + contents: read + +env: + NODE_VERSION: lts/* + +jobs: + wpt-subsystem-update: + if: github.repository == 'nodejs/node' || github.event_name == 'workflow_dispatch' + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + subsystem: ${{ fromJSON(github.event.inputs.subsystems || '["url", "WebCryptoAPI"]') }} + + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: false + + - name: Install Node.js + uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 + with: + node-version: ${{ env.NODE_VERSION }} + + - name: Install @node-core/utils + run: npm install -g @node-core/utils + + - name: Setup @node-core/utils + run: | + ncu-config set username "$USERNAME" + ncu-config set token "$GH_TOKEN" + ncu-config set owner "${GITHUB_REPOSITORY_OWNER}" + ncu-config set repo "$(echo "$GITHUB_REPOSITORY" | cut -d/ -f2)" + env: + USERNAME: ${{ secrets.JENKINS_USER }} + GH_TOKEN: ${{ secrets.GH_USER_TOKEN }} + + - name: Update WPT for subsystem ${{ matrix.subsystem }} + run: | + git node wpt "$SUBSYSTEM" + env: + SUBSYSTEM: ${{ matrix.subsystem }} + + - name: Retrieve new version commit + run: | + new_version="$( + node -p 'require("./test/fixtures/wpt/versions.json")[process.argv[1]].commit' "$SUBSYSTEM" + )" + { + echo "long_version=$new_version" + echo "short_version=${new_version:0:10}" + } >> "$GITHUB_ENV" + env: + SUBSYSTEM: ${{ matrix.subsystem }} + + - name: Open or update PR for the subsystem update + uses: gr2m/create-or-update-pull-request-action@77596e3166f328b24613f7082ab30bf2d93079d5 + with: + branch: actions/update-wpt-${{ matrix.subsystem }} + author: Node.js GitHub Bot + title: 'test: update WPT for ${{ matrix.subsystem }} to ${{ env.short_version }}' + commit-message: 'test: update WPT for ${{ matrix.subsystem }} to ${{ env.short_version }}' + labels: test + update-pull-request-title-and-body: true + body: > + This is an automated update of the WPT for ${{ matrix.subsystem }} to + https://github.com/web-platform-tests/wpt/commit/${{ env.long_version }}. + env: + GITHUB_TOKEN: ${{ secrets.GH_USER_TOKEN }} diff --git a/BUILDING.md b/BUILDING.md index 1ccd594f00b311..eab25373225045 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -162,8 +162,8 @@ Binaries at are produced on: | Binary package | Platform and Toolchain | | ----------------------- | ------------------------------------------------------------------------------------------------------------- | | aix-ppc64 | AIX 7.2 TL04 on PPC64BE with GCC 12[^5] | -| darwin-x64 | macOS 11, Xcode 13 with -mmacosx-version-min=11.0 | -| darwin-arm64 (and .pkg) | macOS 11 (arm64), Xcode 13 with -mmacosx-version-min=11.0 | +| darwin-x64 | macOS 13, Xcode 16 with -mmacosx-version-min=11.0 | +| darwin-arm64 (and .pkg) | macOS 13 (arm64), Xcode 14 with -mmacosx-version-min=11.0 | | linux-arm64 | RHEL 8 with gcc-toolset-12[^6] | | linux-armv7l | Cross-compiled on RHEL 9 x64 with a [custom GCC toolchain](https://github.com/rvagg/rpi-newer-crosstools)[^7] | | linux-ppc64le | RHEL 8 with gcc-toolset-12[^6] | @@ -683,7 +683,7 @@ easily. These files will install the following To install Node.js prerequisites from Powershell Terminal: ```powershell -winget configure .\configuration.dsc.yaml +winget configure .\configurations\configuration.dsc.yaml ``` Alternatively, you can use [Dev Home](https://learn.microsoft.com/en-us/windows/dev-home/) diff --git a/CHANGELOG.md b/CHANGELOG.md index a0feaefe99141d..79a4ce72b717c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,12 +38,17 @@ release. 18 (LTS) -23.2.0
+ +23.5.0
+23.4.0
+23.3.0
+23.2.0
23.1.0
23.0.0
-22.11.0
+22.12.0
+22.11.0
22.10.0
22.9.0
22.8.0
@@ -59,7 +64,8 @@ release. 22.0.0
-20.18.0
+20.18.1
+20.18.0
20.17.0
20.16.0
20.15.1
diff --git a/Makefile b/Makefile index c16998280f91b1..bd2d866e3beb73 100644 --- a/Makefile +++ b/Makefile @@ -311,7 +311,7 @@ v8: ## Build deps/v8. tools/make-v8.sh $(V8_ARCH).$(BUILDTYPE_LOWER) $(V8_BUILD_OPTIONS) .PHONY: jstest -jstest: build-addons build-js-native-api-tests build-node-api-tests ## Run addon tests and JS tests. +jstest: build-addons build-js-native-api-tests build-node-api-tests build-sqlite-tests ## Run addon tests and JS tests. $(PYTHON) tools/test.py $(PARALLEL_ARGS) --mode=$(BUILDTYPE_LOWER) \ $(TEST_CI_ARGS) \ --skip-tests=$(CI_SKIP_TESTS) \ @@ -337,6 +337,7 @@ test: all ## Run default tests, linters, and build docs. $(MAKE) -s build-addons $(MAKE) -s build-js-native-api-tests $(MAKE) -s build-node-api-tests + $(MAKE) -s build-sqlite-tests $(MAKE) -s cctest $(MAKE) -s jstest @@ -345,6 +346,7 @@ test-only: all ## Run default tests, without linters or building the docs. $(MAKE) build-addons $(MAKE) build-js-native-api-tests $(MAKE) build-node-api-tests + $(MAKE) build-sqlite-tests $(MAKE) cctest $(MAKE) jstest $(MAKE) tooltest @@ -355,6 +357,7 @@ test-cov: all ## Run coverage tests. $(MAKE) build-addons $(MAKE) build-js-native-api-tests $(MAKE) build-node-api-tests + $(MAKE) build-sqlite-tests $(MAKE) cctest CI_SKIP_TESTS=$(COV_SKIP_TESTS) $(MAKE) jstest @@ -500,6 +503,23 @@ benchmark/napi/.buildstamp: $(ADDONS_PREREQS) \ $(BENCHMARK_NAPI_BINDING_GYPS) $(BENCHMARK_NAPI_BINDING_SOURCES) @$(call run_build_addons,"$$PWD/benchmark/napi",$@) +SQLITE_BINDING_GYPS := $(wildcard test/sqlite/*/binding.gyp) + +SQLITE_BINDING_SOURCES := \ + $(wildcard test/sqlite/*/*.c) + +# Implicitly depends on $(NODE_EXE), see the build-sqlite-tests rule for rationale. +test/sqlite/.buildstamp: $(ADDONS_PREREQS) \ + $(SQLITE_BINDING_GYPS) $(SQLITE_BINDING_SOURCES) + @$(call run_build_addons,"$$PWD/test/sqlite",$@) + +.PHONY: build-sqlite-tests +# .buildstamp needs $(NODE_EXE) but cannot depend on it +# directly because it calls make recursively. The parent make cannot know +# if the subprocess touched anything so it pessimistically assumes that +# .buildstamp is out of date and need a rebuild. +build-sqlite-tests: | $(NODE_EXE) test/sqlite/.buildstamp ## Build SQLite tests. + .PHONY: clear-stalled clear-stalled: ## Clear any stalled processes. $(info Clean up any leftover processes but don't error if found.) @@ -510,7 +530,7 @@ clear-stalled: ## Clear any stalled processes. fi .PHONY: test-build -test-build: | all build-addons build-js-native-api-tests build-node-api-tests ## Build all tests. +test-build: | all build-addons build-js-native-api-tests build-node-api-tests build-sqlite-tests ## Build all tests. .PHONY: test-build-js-native-api test-build-js-native-api: all build-js-native-api-tests ## Build JS Native-API tests. @@ -518,6 +538,10 @@ test-build-js-native-api: all build-js-native-api-tests ## Build JS Native-API t .PHONY: test-build-node-api test-build-node-api: all build-node-api-tests ## Build Node-API tests. +.PHONY: test-build-sqlite +test-build-sqlite: all build-sqlite-tests ## Build SQLite tests. + + .PHONY: test-all test-all: test-build ## Run default tests with both Debug and Release builds. $(PYTHON) tools/test.py $(PARALLEL_ARGS) --mode=debug,release @@ -545,7 +569,7 @@ endif # Related CI job: node-test-commit-arm-fanned test-ci-native: LOGLEVEL := info ## Build and test addons without building anything else. -test-ci-native: | benchmark/napi/.buildstamp test/addons/.buildstamp test/js-native-api/.buildstamp test/node-api/.buildstamp +test-ci-native: | benchmark/napi/.buildstamp test/addons/.buildstamp test/js-native-api/.buildstamp test/node-api/.buildstamp test/sqlite/.buildstamp $(PYTHON) tools/test.py $(PARALLEL_ARGS) -p tap --logfile test.tap \ --mode=$(BUILDTYPE_LOWER) --flaky-tests=$(FLAKY_TESTS) \ $(TEST_CI_ARGS) $(CI_NATIVE_SUITES) @@ -568,7 +592,7 @@ test-ci-js: | clear-stalled ## Build and test JavaScript with building anything .PHONY: test-ci # Related CI jobs: most CI tests, excluding node-test-commit-arm-fanned test-ci: LOGLEVEL := info ## Build and test everything (CI). -test-ci: | clear-stalled bench-addons-build build-addons build-js-native-api-tests build-node-api-tests doc-only +test-ci: | clear-stalled bench-addons-build build-addons build-js-native-api-tests build-node-api-tests build-sqlite-tests doc-only out/Release/cctest --gtest_output=xml:out/junit/cctest.xml $(PYTHON) tools/test.py $(PARALLEL_ARGS) -p tap --logfile test.tap \ --mode=$(BUILDTYPE_LOWER) --flaky-tests=$(FLAKY_TESTS) \ @@ -607,6 +631,10 @@ test-debug: BUILDTYPE_LOWER=debug ## Run tests on a debug build. test-release test-debug: test-build ## Run tests on a release or debug build. $(PYTHON) tools/test.py $(PARALLEL_ARGS) --mode=$(BUILDTYPE_LOWER) +.PHONY: test-test426 +test-test426: all ## Run the Web Platform Tests. + $(PYTHON) tools/test.py $(PARALLEL_ARGS) test426 + .PHONY: test-wpt test-wpt: all ## Run the Web Platform Tests. $(PYTHON) tools/test.py $(PARALLEL_ARGS) wpt @@ -675,6 +703,16 @@ test-node-api-clean: ## Remove Node-API testing artifacts. $(RM) -r test/node-api/*/build $(RM) test/node-api/.buildstamp +.PHONY: test-sqlite +test-sqlite: test-build-sqlite ## Run SQLite tests. + $(PYTHON) tools/test.py $(PARALLEL_ARGS) --mode=$(BUILDTYPE_LOWER) sqlite + +.PHONY: test-sqlite-clean +.NOTPARALLEL: test-sqlite-clean +test-sqlite-clean: ## Remove SQLite testing artifacts. + $(RM) -r test/sqlite/*/build + $(RM) test/sqlite/.buildstamp + .PHONY: test-addons test-addons: test-build test-js-native-api test-node-api ## Run addon tests. $(PYTHON) tools/test.py $(PARALLEL_ARGS) --mode=$(BUILDTYPE_LOWER) addons @@ -932,6 +970,9 @@ else ifeq ($(findstring riscv64,$(UNAME_M)),riscv64) DESTCPU ?= riscv64 else +ifeq ($(findstring loongarch64,$(UNAME_M)),loongarch64) +DESTCPU ?= loong64 +else DESTCPU ?= x86 endif endif @@ -945,6 +986,7 @@ endif endif endif endif +endif ifeq ($(DESTCPU),x64) ARCH=x64 else @@ -969,6 +1011,9 @@ else ifeq ($(DESTCPU),riscv64) ARCH=riscv64 else +ifeq ($(DESTCPU),loong64) +ARCH=loong64 +else ARCH=x86 endif endif @@ -978,6 +1023,7 @@ endif endif endif endif +endif # node and v8 use different arch names (e.g. node 'x86' vs v8 'ia32'). # pass the proper v8 arch name to $V8_ARCH based on user-specified $DESTCPU. @@ -1432,6 +1478,7 @@ LINT_CPP_FILES = $(filter-out $(LINT_CPP_EXCLUDE), $(wildcard \ test/cctest/*.h \ test/embedding/*.cc \ test/embedding/*.h \ + test/sqlite/*/*.c \ test/fixtures/*.c \ test/js-native-api/*/*.cc \ test/node-api/*/*.cc \ @@ -1455,6 +1502,7 @@ FORMAT_CPP_FILES += $(wildcard \ test/js-native-api/*/*.h \ test/node-api/*/*.c \ test/node-api/*/*.h \ + test/sqlite/*/*.c \ ) # Code blocks don't have newline at the end, diff --git a/README.md b/README.md index 69777ccb2dad40..563e89a2807b9a 100644 --- a/README.md +++ b/README.md @@ -180,8 +180,6 @@ For information about the governance of the Node.js project, see **Matteo Collina** <> (he/him) * [mhdawson](https://github.com/mhdawson) - **Michael Dawson** <> (he/him) -* [MoLow](https://github.com/MoLow) - - **Moshe Atlow** <> (he/him) * [RafaelGSS](https://github.com/RafaelGSS) - **Rafael Gonzaga** <> (he/him) * [richardlau](https://github.com/richardlau) - @@ -211,6 +209,8 @@ For information about the governance of the Node.js project, see **Shelley Vohr** <> (she/her) * [GeoffreyBooth](https://github.com/GeoffreyBooth) - **Geoffrey Booth** <> (he/him) +* [MoLow](https://github.com/MoLow) - + **Moshe Atlow** <> (he/him) * [Trott](https://github.com/Trott) - **Rich Trott** <> (he/him) @@ -379,6 +379,8 @@ For information about the governance of the Node.js project, see **Nitzan Uziely** <> * [LiviaMedeiros](https://github.com/LiviaMedeiros) - **LiviaMedeiros** <> +* [ljharb](https://github.com/ljharb) - + **Jordan Harband** <> * [lpinca](https://github.com/lpinca) - **Luigi Pinca** <> (he/him) * [lukekarrys](https://github.com/lukekarrys) - @@ -449,8 +451,6 @@ For information about the governance of the Node.js project, see **Vladimir Morozov** <> (he/him) * [VoltrexKeyva](https://github.com/VoltrexKeyva) - **Mohammed Keyvanzadeh** <> (he/him) -* [watilde](https://github.com/watilde) - - **Daijiro Wachi** <> (he/him) * [zcbenz](https://github.com/zcbenz) - **Cheng Zhao** <> (he/him) * [ZYSzys](https://github.com/ZYSzys) - @@ -705,6 +705,8 @@ For information about the governance of the Node.js project, see **Vladimir Kurchatkin** <> * [vsemozhetbyt](https://github.com/vsemozhetbyt) - **Vse Mozhet Byt** <> (he/him) +* [watilde](https://github.com/watilde) - + **Daijiro Wachi** <> (he/him) * [watson](https://github.com/watson) - **Thomas Watson** <> * [whitlockjc](https://github.com/whitlockjc) - @@ -757,8 +759,6 @@ maintaining the Node.js project. **Mert Can Altin** <> * [preveen-stack](https://github.com/preveen-stack) - **Preveen Padmanabhan** <> (he/him) -* [RedYetiDev](https://github.com/RedYetiDev) - - **Aviv Keller** <> (they/them) * [VoltrexKeyva](https://github.com/VoltrexKeyva) - **Mohammed Keyvanzadeh** <> (he/him) diff --git a/SECURITY.md b/SECURITY.md index fc95e1941698e6..b8f54307d5ed5b 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -82,23 +82,23 @@ Vulnerabilities related to this case may be fixed by a documentation update. **Node.js does NOT trust**: -1. Data received from the remote end of inbound network connections - that are accepted through the use of Node.js APIs and - which is transformed/validated by Node.js before being passed - to the application. This includes: - * HTTP APIs (all flavors) server APIs. -2. The data received from the remote end of outbound network connections - that are created through the use of Node.js APIs and - which is transformed/validated by Node.js before being passed - to the application EXCEPT with respect to payload length. Node.js trusts - that applications make connections/requests which will avoid payload - sizes that will result in a Denial of Service. - * HTTP APIs (all flavors) client APIs. - * DNS APIs. -3. Consumers of data protected through the use of Node.js APIs (for example, - people who have access to data encrypted through the Node.js crypto APIs). -4. The file content or other I/O that is opened for reading or writing by the - use of Node.js APIs (ex: stdin, stdout, stderr). +* Data received from the remote end of inbound network connections + that are accepted through the use of Node.js APIs and + which is transformed/validated by Node.js before being passed + to the application. This includes: + * HTTP APIs (all flavors) server APIs. +* The data received from the remote end of outbound network connections + that are created through the use of Node.js APIs and + which is transformed/validated by Node.js before being passed + to the application EXCEPT with respect to payload length. Node.js trusts + that applications make connections/requests which will avoid payload + sizes that will result in a Denial of Service. + * HTTP APIs (all flavors) client APIs. + * DNS APIs. +* Consumers of data protected through the use of Node.js APIs (for example, + people who have access to data encrypted through the Node.js crypto APIs). +* The file content or other I/O that is opened for reading or writing by the + use of Node.js APIs (ex: stdin, stdout, stderr). In other words, if the data passing through Node.js to/from the application can trigger actions other than those documented for the APIs, there is likely @@ -108,23 +108,23 @@ lead to a loss of confidentiality, integrity, or availability. **Node.js trusts everything else**. Examples include: -1. The developers and infrastructure that runs it. -2. The operating system that Node.js is running under and its configuration, - along with anything under control of the operating system. -3. The code it is asked to run, including JavaScript and native code, even if - said code is dynamically loaded, e.g., all dependencies installed from the - npm registry. - The code run inherits all the privileges of the execution user. -4. Inputs provided to it by the code it is asked to run, as it is the - responsibility of the application to perform the required input validations, - e.g. the input to `JSON.parse()`. -5. Any connection used for inspector (debugger protocol) regardless of being - opened by command line options or Node.js APIs, and regardless of the remote - end being on the local machine or remote. -6. The file system when requiring a module. - See . -7. The `node:wasi` module does not currently provide the comprehensive file - system security properties provided by some WASI runtimes. +* The developers and infrastructure that runs it. +* The operating system that Node.js is running under and its configuration, + along with anything under control of the operating system. +* The code it is asked to run, including JavaScript, WASM and native code, even + if said code is dynamically loaded, e.g., all dependencies installed from the + npm registry. + The code run inherits all the privileges of the execution user. +* Inputs provided to it by the code it is asked to run, as it is the + responsibility of the application to perform the required input validations, + e.g. the input to `JSON.parse()`. +* Any connection used for inspector (debugger protocol) regardless of being + opened by command line options or Node.js APIs, and regardless of the remote + end being on the local machine or remote. +* The file system when requiring a module. + See . +* The `node:wasi` module does not currently provide the comprehensive file + system security properties provided by some WASI runtimes. Any unexpected behavior from the data manipulation from Node.js Internal functions may be considered a vulnerability if they are exploitable via @@ -218,7 +218,7 @@ as any other stable feature. Security notifications will be distributed via the following methods. * -* +* ## Comments on this policy diff --git a/benchmark/fixtures/simple-error-stack.js b/benchmark/fixtures/simple-error-stack.js index 0057807795b072..74aae191800778 100644 --- a/benchmark/fixtures/simple-error-stack.js +++ b/benchmark/fixtures/simple-error-stack.js @@ -1,15 +1,16 @@ 'use strict'; -exports.__esModule = true; -exports.simpleErrorStack = void 0; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.simpleErrorStack = simpleErrorStack; // Compile with `tsc --inlineSourceMap benchmark/fixtures/simple-error-stack.ts`. var lorem = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'; function simpleErrorStack() { - try { - lorem.BANG(); - } - catch (e) { - return e.stack; - } + [1].map(function () { + try { + lorem.BANG(); + } + catch (e) { + return e.stack; + } + }); } -exports.simpleErrorStack = simpleErrorStack; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxlLWVycm9yLXN0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2ltcGxlLWVycm9yLXN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7O0FBRWIsaUZBQWlGO0FBRWpGLElBQU0sS0FBSyxHQUFHLCtiQUErYixDQUFDO0FBRTljLFNBQVMsZ0JBQWdCO0lBQ3ZCLElBQUk7UUFDRCxLQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7S0FDdkI7SUFBQyxPQUFPLENBQUMsRUFBRTtRQUNWLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQztLQUNoQjtBQUNILENBQUM7QUFHQyw0Q0FBZ0IifQ== +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxlLWVycm9yLXN0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2ltcGxlLWVycm9yLXN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7QUFpQlgsNENBQWdCO0FBZmxCLGlGQUFpRjtBQUVqRixJQUFNLEtBQUssR0FBRywrYkFBK2IsQ0FBQztBQUU5YyxTQUFTLGdCQUFnQjtJQUN2QixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUNOLElBQUksQ0FBQztZQUNGLEtBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN4QixDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUNqQixDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDIn0= \ No newline at end of file diff --git a/benchmark/fixtures/simple-error-stack.ts b/benchmark/fixtures/simple-error-stack.ts index 58034e92f24b98..1335df3478b99b 100644 --- a/benchmark/fixtures/simple-error-stack.ts +++ b/benchmark/fixtures/simple-error-stack.ts @@ -5,11 +5,13 @@ const lorem = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'; function simpleErrorStack() { - try { - (lorem as any).BANG(); - } catch (e) { - return e.stack; - } + [1].map(() => { + try { + (lorem as any).BANG(); + } catch (e) { + return e.stack; + } + }) } export { diff --git a/benchmark/fs/readfile-permission-enabled.js b/benchmark/fs/readfile-permission-enabled.js index 46f20be6a0b06e..c688e9eecb0e00 100644 --- a/benchmark/fs/readfile-permission-enabled.js +++ b/benchmark/fs/readfile-permission-enabled.js @@ -17,7 +17,7 @@ const bench = common.createBenchmark(main, { concurrent: [1, 10], }, { flags: [ - '--experimental-permission', + '--permission', '--allow-fs-read=*', '--allow-fs-write=*', '--allow-child-process', diff --git a/benchmark/permission/permission-processhas-fs-read.js b/benchmark/permission/permission-processhas-fs-read.js index c2c90636aa1f62..ea06aed4bc27a9 100644 --- a/benchmark/permission/permission-processhas-fs-read.js +++ b/benchmark/permission/permission-processhas-fs-read.js @@ -11,7 +11,7 @@ const rootPath = path.resolve(__dirname, '../../..'); const options = { flags: [ - '--experimental-permission', + '--permission', `--allow-fs-read=${rootPath}`, '--allow-child-process', '--no-warnings', diff --git a/benchmark/permission/permission-startup.js b/benchmark/permission/permission-startup.js index 08326909aa4e41..6a197cdff56111 100644 --- a/benchmark/permission/permission-startup.js +++ b/benchmark/permission/permission-startup.js @@ -48,7 +48,7 @@ function spawnProcess(script, bench, state) { function main({ count, script, nFiles, prefixPath }) { script = path.resolve(__dirname, '../../', `${script}.js`); const optionsWithScript = [ - '--experimental-permission', + '--permission', `--allow-fs-read=${script}`, ...mockFiles(nFiles, prefixPath).map((file) => '--allow-fs-read=' + file), script, diff --git a/benchmark/ts/strip-typescript.js b/benchmark/ts/strip-typescript.js index 7a7155c568b613..29c81f5a750bae 100644 --- a/benchmark/ts/strip-typescript.js +++ b/benchmark/ts/strip-typescript.js @@ -12,7 +12,7 @@ const bench = common.createBenchmark(main, { filepath: [ts, js], n: [1e4], }, { - flags: ['--experimental-strip-types', '--disable-warning=ExperimentalWarning'], + flags: ['--disable-warning=ExperimentalWarning'], }); async function main({ n, filepath }) { diff --git a/benchmark/util/text-decoder.js b/benchmark/util/text-decoder.js index dd4f02016df077..1aa60f2dd0bcd6 100644 --- a/benchmark/util/text-decoder.js +++ b/benchmark/util/text-decoder.js @@ -3,7 +3,7 @@ const common = require('../common.js'); const bench = common.createBenchmark(main, { - encoding: ['utf-8', 'latin1', 'iso-8859-3'], + encoding: ['utf-8', 'windows-1252', 'iso-8859-3'], ignoreBOM: [0, 1], fatal: [0, 1], len: [256, 1024 * 16, 1024 * 128], diff --git a/common.gypi b/common.gypi index 23196aae451f6a..a6a79adcc2fb4f 100644 --- a/common.gypi +++ b/common.gypi @@ -36,7 +36,7 @@ # Reset this number to 0 on major V8 upgrades. # Increment by one for each non-official patch applied to deps/v8. - 'v8_embedder_string': '-node.11', + 'v8_embedder_string': '-node.12', ##### V8 defaults for Node.js ##### diff --git a/configure.py b/configure.py index a4e210261e2e76..c361676637c1cb 100755 --- a/configure.py +++ b/configure.py @@ -131,6 +131,12 @@ default=None, help='use the prefix to look for pre-installed headers') +parser.add_argument('--use_clang', + action='store_true', + dest='use_clang', + default=None, + help='use clang instead of gcc') + parser.add_argument('--dest-os', action='store', dest='dest_os', @@ -1407,6 +1413,10 @@ def configure_node(o): o['variables']['target_arch'] = target_arch o['variables']['node_byteorder'] = sys.byteorder + # Allow overriding the compiler - needed by embedders. + if options.use_clang: + o['variables']['clang'] = 1 + cross_compiling = (options.cross_compiling if options.cross_compiling is not None else target_arch != host_arch) @@ -1675,6 +1685,9 @@ def configure_v8(o, configs): raise Exception( 'Only one of the --v8-enable-object-print or --v8-disable-object-print options ' 'can be specified at a time.') + if sys.platform != 'darwin': + if o['variables']['v8_enable_webassembly'] and o['variables']['target_arch'] == 'x64': + o['variables']['v8_enable_wasm_simd256_revec'] = 1 def configure_openssl(o): variables = o['variables'] diff --git a/deps/amaro/dist/index.js b/deps/amaro/dist/index.js index 147648d2c6201a..9ca8c78ce23f0f 100644 --- a/deps/amaro/dist/index.js +++ b/deps/amaro/dist/index.js @@ -38,11 +38,6 @@ var require_wasm = __commonJS({ imports["__wbindgen_placeholder__"] = module2.exports; var wasm; var { TextDecoder, TextEncoder } = require("util"); - var heap = new Array(128).fill(void 0); - heap.push(void 0, null, true, false); - function getObject(idx) { - return heap[idx]; - } var cachedTextDecoder = new TextDecoder("utf-8", { ignoreBOM: true }); cachedTextDecoder.decode(); var cachedUint8ArrayMemory0 = null; @@ -56,6 +51,8 @@ var require_wasm = __commonJS({ ptr = ptr >>> 0; return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); } + var heap = new Array(128).fill(void 0); + heap.push(void 0, null, true, false); var heap_next = heap.length; function addHeapObject(obj) { if (heap_next === heap.length) heap.push(heap.length + 1); @@ -64,6 +61,9 @@ var require_wasm = __commonJS({ heap[idx] = obj; return idx; } + function getObject(idx) { + return heap[idx]; + } var WASM_VECTOR_LEN = 0; var cachedTextEncoder = new TextEncoder("utf-8"); var encodeString = typeof cachedTextEncoder.encodeInto === "function" ? function(arg, view) { @@ -247,11 +247,6 @@ ${val.stack}`; function __wbg_adapter_57(arg0, arg1, arg2, arg3) { wasm.__wbindgen_export_5(arg0, arg1, addHeapObject(arg2), addHeapObject(arg3)); } - module2.exports.__wbindgen_boolean_get = function(arg0) { - const v = getObject(arg0); - const ret = typeof v === "boolean" ? v ? 1 : 0 : 2; - return ret; - }; module2.exports.__wbindgen_string_new = function(arg0, arg1) { const ret = getStringFromWasm0(arg0, arg1); return addHeapObject(ret); @@ -281,7 +276,7 @@ ${val.stack}`; const ret = getObject(arg0) in getObject(arg1); return ret; }; - module2.exports.__wbg_new_b85e72ed1bfd57f9 = function(arg0, arg1) { + module2.exports.__wbg_new_1073970097e5a420 = function(arg0, arg1) { try { var state0 = { a: arg0, b: arg1 }; var cb0 = (arg02, arg12) => { @@ -307,66 +302,71 @@ ${val.stack}`; const ret = getObject(arg0)[getObject(arg1)]; return addHeapObject(ret); }; - module2.exports.__wbg_length_ae22078168b726f5 = function(arg0) { + module2.exports.__wbg_length_f217bbbf7e8e4df4 = function(arg0) { const ret = getObject(arg0).length; return ret; }; - module2.exports.__wbg_get_3baa728f9d58d3f6 = function(arg0, arg1) { + module2.exports.__wbg_get_5419cf6b954aa11d = function(arg0, arg1) { const ret = getObject(arg0)[arg1 >>> 0]; return addHeapObject(ret); }; - module2.exports.__wbg_new_525245e2b9901204 = function() { + module2.exports.__wbg_new_e69b5f66fda8f13c = function() { const ret = new Object(); return addHeapObject(ret); }; module2.exports.__wbg_set_f975102236d3c502 = function(arg0, arg1, arg2) { getObject(arg0)[takeObject(arg1)] = takeObject(arg2); }; - module2.exports.__wbg_self_3093d5d1f7bcb682 = function() { + module2.exports.__wbindgen_object_drop_ref = function(arg0) { + takeObject(arg0); + }; + module2.exports.__wbindgen_boolean_get = function(arg0) { + const v = getObject(arg0); + const ret = typeof v === "boolean" ? v ? 1 : 0 : 2; + return ret; + }; + module2.exports.__wbg_self_bf91bf94d9e04084 = function() { return handleError(function() { const ret = self.self; return addHeapObject(ret); }, arguments); }; - module2.exports.__wbg_window_3bcfc4d31bc012f8 = function() { + module2.exports.__wbg_window_52dd9f07d03fd5f8 = function() { return handleError(function() { const ret = window.window; return addHeapObject(ret); }, arguments); }; - module2.exports.__wbg_globalThis_86b222e13bdf32ed = function() { + module2.exports.__wbg_globalThis_05c129bf37fcf1be = function() { return handleError(function() { const ret = globalThis.globalThis; return addHeapObject(ret); }, arguments); }; - module2.exports.__wbg_global_e5a3fe56f8be9485 = function() { + module2.exports.__wbg_global_3eca19bb09e9c484 = function() { return handleError(function() { const ret = global.global; return addHeapObject(ret); }, arguments); }; - module2.exports.__wbg_newnoargs_76313bd6ff35d0f2 = function(arg0, arg1) { + module2.exports.__wbg_newnoargs_1ede4bf2ebbaaf43 = function(arg0, arg1) { var v0 = getCachedStringFromWasm0(arg0, arg1); const ret = new Function(v0); return addHeapObject(ret); }; - module2.exports.__wbg_call_1084a111329e68ce = function() { + module2.exports.__wbg_call_a9ef466721e824f2 = function() { return handleError(function(arg0, arg1) { const ret = getObject(arg0).call(getObject(arg1)); return addHeapObject(ret); }, arguments); }; - module2.exports.__wbindgen_object_drop_ref = function(arg0) { - takeObject(arg0); - }; - module2.exports.__wbg_call_89af060b4e1523f2 = function() { + module2.exports.__wbg_call_3bfa248576352471 = function() { return handleError(function(arg0, arg1, arg2) { const ret = getObject(arg0).call(getObject(arg1), getObject(arg2)); return addHeapObject(ret); }, arguments); }; - module2.exports.__wbg_length_8339fcf5d8ecd12e = function(arg0) { + module2.exports.__wbg_length_9254c4bd3b9f23c4 = function(arg0) { const ret = getObject(arg0).length; return ret; }; @@ -374,15 +374,15 @@ ${val.stack}`; const ret = wasm.memory; return addHeapObject(ret); }; - module2.exports.__wbg_buffer_b7b08af79b0b0974 = function(arg0) { + module2.exports.__wbg_buffer_ccaed51a635d8a2d = function(arg0) { const ret = getObject(arg0).buffer; return addHeapObject(ret); }; - module2.exports.__wbg_new_ea1883e1e5e86686 = function(arg0) { + module2.exports.__wbg_new_fec2611eb9180f95 = function(arg0) { const ret = new Uint8Array(getObject(arg0)); return addHeapObject(ret); }; - module2.exports.__wbg_set_d1e79e2388520f18 = function(arg0, arg1, arg2) { + module2.exports.__wbg_set_ec2fcf81bc573fd9 = function(arg0, arg1, arg2) { getObject(arg0).set(getObject(arg1), arg2 >>> 0); }; module2.exports.__wbindgen_error_new = function(arg0, arg1) { @@ -399,7 +399,7 @@ ${val.stack}`; getDataViewMemory0().setFloat64(arg0 + 8 * 1, isLikeNone(ret) ? 0 : ret, true); getDataViewMemory0().setInt32(arg0 + 4 * 0, !isLikeNone(ret), true); }; - module2.exports.__wbg_instanceof_Uint8Array_247a91427532499e = function(arg0) { + module2.exports.__wbg_instanceof_Uint8Array_df0761410414ef36 = function(arg0) { let result; try { result = getObject(arg0) instanceof Uint8Array; @@ -409,7 +409,7 @@ ${val.stack}`; const ret = result; return ret; }; - module2.exports.__wbg_instanceof_ArrayBuffer_61dfc3198373c902 = function(arg0) { + module2.exports.__wbg_instanceof_ArrayBuffer_74945570b4a62ec7 = function(arg0) { let result; try { result = getObject(arg0) instanceof ArrayBuffer; @@ -419,7 +419,7 @@ ${val.stack}`; const ret = result; return ret; }; - module2.exports.__wbg_entries_7a0e06255456ebcd = function(arg0) { + module2.exports.__wbg_entries_c02034de337d3ee2 = function(arg0) { const ret = Object.entries(getObject(arg0)); return addHeapObject(ret); }; @@ -437,14 +437,14 @@ ${val.stack}`; module2.exports.__wbindgen_throw = function(arg0, arg1) { throw new Error(getStringFromWasm0(arg0, arg1)); }; - module2.exports.__wbg_then_95e6edc0f89b73b1 = function(arg0, arg1) { + module2.exports.__wbg_then_748f75edfb032440 = function(arg0, arg1) { const ret = getObject(arg0).then(getObject(arg1)); return addHeapObject(ret); }; - module2.exports.__wbg_queueMicrotask_12a30234db4045d3 = function(arg0) { + module2.exports.__wbg_queueMicrotask_c5419c06eab41e73 = function(arg0) { queueMicrotask(getObject(arg0)); }; - module2.exports.__wbg_queueMicrotask_48421b3cc9052b68 = function(arg0) { + module2.exports.__wbg_queueMicrotask_848aa4969108a57e = function(arg0) { const ret = getObject(arg0).queueMicrotask; return addHeapObject(ret); }; @@ -452,7 +452,7 @@ ${val.stack}`; const ret = typeof getObject(arg0) === "function"; return ret; }; - module2.exports.__wbg_resolve_570458cb99d56a43 = function(arg0) { + module2.exports.__wbg_resolve_0aad7c1484731c99 = function(arg0) { const ret = Promise.resolve(getObject(arg0)); return addHeapObject(ret); }; @@ -465,12 +465,12 @@ ${val.stack}`; const ret = false; return ret; }; - module2.exports.__wbindgen_closure_wrapper7250 = function(arg0, arg1, arg2) { - const ret = makeMutClosure(arg0, arg1, 687, __wbg_adapter_38); + module2.exports.__wbindgen_closure_wrapper7281 = function(arg0, arg1, arg2) { + const ret = makeMutClosure(arg0, arg1, 685, __wbg_adapter_38); return addHeapObject(ret); }; var { Buffer: Buffer2 } = require("node:buffer"); - var bytes = Buffer2.from("AGFzbQEAAAABzwRJYAJ/fwBgAX8AYAJ/fwF/YAN/f38Bf2ADf39/AGABfwF/YAR/f39/AGAFf39/f38AYAZ/f39/f38AYAR/f39/AX9gAAF/YAd/f39/f39/AGADf39/AX5gA39+fwBgBX9/f39/AX9gAX8BfmACf38BfmACfn8AYAd/f39/f39/AX9gA39+fgBgAABgBn9/f39/fwF/YAJ/fgBgA39+fgF/YAF+AX5gAn5+AGAEf35/fwBgBH9/f34AYAN/f34Bf2ABfgBgBH98f38Bf2ANf39/f39/f39/f39/fwBgAn98AGAGf39/f35/AGAPf39/f39/f39/f39/f39/AX9gBH9/fn8AYAZ/f39+f38AYAN/fn8Bf2ACf34Bf2AEfn5/fwF+YAN+f38AYAJ+fwF/YAJ+fgF+YAN/f34AYA5/f39/f39/f39/f39/fwF/YAh/f39/f39/fwF/YAp/f39/f39/f39/AGAEf35/fgF+YAl/f39/f39+fn4AYAV/f39/fwF8YAF8AXxgBn9/fn9+fwBgA35/fwF/YAF/AXxgBX9/f39+AGADf39/AXxgF39/f39/f39/f39/f39/f39/f39/f39/AX9gE39/f39/f39/f39/f39/f39/f38Bf2ALf39/f39/f39/f38Bf2AEf39/fABgAXwBf2AEfn5+fwF+YAR/fn5/AGAEf39/fwF8YAd+fn5/f39/AX5gAAF+YAJ+fwF+YAN/fH8AYAV/f31/fwBgBH99f38AYAV/f3x/fwBgBH98f38AYAV/f35/fwACphIrGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxZfX3diaW5kZ2VuX2Jvb2xlYW5fZ2V0AAUYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fFV9fd2JpbmRnZW5fc3RyaW5nX25ldwACGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxVfX3diaW5kZ2VuX3N0cmluZ19nZXQAABhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18UX193YmluZGdlbl9pc19zdHJpbmcABRhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18UX193YmluZGdlbl9pc19vYmplY3QABRhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18XX193YmluZGdlbl9pc191bmRlZmluZWQABRhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18NX193YmluZGdlbl9pbgACGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19uZXdfYjg1ZTcyZWQxYmZkNTdmOQACGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxNfX3diaW5kZ2VuX2lzX2ZhbHN5AAUYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fJF9fd2JnX2dldHdpdGhyZWZrZXlfZWRjMmM4OTYwZjBmMTE5MQACGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXx1fX3diZ19sZW5ndGhfYWUyMjA3ODE2OGI3MjZmNQAFGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19nZXRfM2JhYTcyOGY5ZDU4ZDNmNgACGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19uZXdfNTI1MjQ1ZTJiOTkwMTIwNAAKGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19zZXRfZjk3NTEwMjIzNmQzYzUwMgAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxtfX3diZ19zZWxmXzMwOTNkNWQxZjdiY2I2ODIAChhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18dX193Ymdfd2luZG93XzNiY2ZjNGQzMWJjMDEyZjgAChhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18hX193YmdfZ2xvYmFsVGhpc184NmIyMjJlMTNiZGYzMmVkAAoYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fHV9fd2JnX2dsb2JhbF9lNWEzZmU1NmY4YmU5NDg1AAoYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fIF9fd2JnX25ld25vYXJnc183NjMxM2JkNmZmMzVkMGYyAAIYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fG19fd2JnX2NhbGxfMTA4NGExMTEzMjllNjhjZQACGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diaW5kZ2VuX29iamVjdF9kcm9wX3JlZgABGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxtfX3diZ19jYWxsXzg5YWYwNjBiNGUxNTIzZjIAAxhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18dX193YmdfbGVuZ3RoXzgzMzlmY2Y1ZDhlY2QxMmUABRhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18RX193YmluZGdlbl9tZW1vcnkAChhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18dX193YmdfYnVmZmVyX2I3YjA4YWY3OWIwYjA5NzQABRhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18aX193YmdfbmV3X2VhMTg4M2UxZTVlODY2ODYABRhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18aX193Ymdfc2V0X2QxZTc5ZTIzODg1MjBmMTgABBhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18UX193YmluZGdlbl9lcnJvcl9uZXcAAhhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18ZX193YmluZGdlbl9qc3ZhbF9sb29zZV9lcQACGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxVfX3diaW5kZ2VuX251bWJlcl9nZXQAABhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18sX193YmdfaW5zdGFuY2VvZl9VaW50OEFycmF5XzI0N2E5MTQyNzUzMjQ5OWUABRhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18tX193YmdfaW5zdGFuY2VvZl9BcnJheUJ1ZmZlcl82MWRmYzMxOTgzNzNjOTAyAAUYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fHl9fd2JnX2VudHJpZXNfN2EwZTA2MjU1NDU2ZWJjZAAFGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxtfX3diaW5kZ2VuX29iamVjdF9jbG9uZV9yZWYABRhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18XX193YmluZGdlbl9kZWJ1Z19zdHJpbmcAABhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18QX193YmluZGdlbl90aHJvdwAAGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxtfX3diZ190aGVuXzk1ZTZlZGMwZjg5YjczYjEAAhhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18lX193YmdfcXVldWVNaWNyb3Rhc2tfMTJhMzAyMzRkYjQwNDVkMwABGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXyVfX3diZ19xdWV1ZU1pY3JvdGFza180ODQyMWIzY2M5MDUyYjY4AAUYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fFl9fd2JpbmRnZW5faXNfZnVuY3Rpb24ABRhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18eX193YmdfcmVzb2x2ZV81NzA0NThjYjk5ZDU2YTQzAAUYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fEl9fd2JpbmRnZW5fY2JfZHJvcAAFGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXx5fX3diaW5kZ2VuX2Nsb3N1cmVfd3JhcHBlcjcyNTAAAwP0LfItCAgAAAAEBgQEBAYGBAQHBwcSFQYGHgAGBAAEBgIHBAQAAAAEBAADAAAAAggABAAACAcHBAAFBAQGBgQIBAAGAgACBgAACwsIAAYGAAIGAgYABgYGCQAAAAgEBAYIAAAAAAIADgkfHwAGBgYEBAICBwgIBAQCAAAECAcECwAHAAYAAAAICAggAAAFAgUGBAAGBAAEISEHCwgGBAIBBAAAAAQCBAQLBAYIAAMLAAAHEgcHBwcAAAAAAAcCAAAHAAAAAAQEAAAEBAAECAIGBgYAAA4FAAQFCQIBBAAABgYAAAECBQABAQgACAAGBgQCCAcHAAQEAAoBAQEAAAEEBAsHAQAGAAAABwQBAQQEBgcGAAMBBAEIBgECBgQAAAEBAgcGAAABAAAEAQQECAQEBAYAAQEBAQABAQUDAQAGBgAGBgABAAAABAALCQEJAAQAAAALBAQFIgcHAAcCAiwHAwIGAAAACwYEBgYAAQQJAgQLAAECAAUBCwAAAQsDAwcAAQgAAAcCAQAtABIGAgAFAAAJAAYEBgAEBAQACQABAAgHBgcAAQAABAIBAQQBAAAHAgYFAQEABwECBAYABAMDBwcAAAceAgEABAMHAAAABAQGAAICAgAFAAAAFQMICAAFBgYELgMADgMJAQABAAQEBgQGAwYBBgYACAMDBgAAAgEAAAMCBAAEAAQABAYGCAAECAAAAwIAAAAICAYBAQQECxoEAAIJAAEACAAAAAAAAAAAAQEAAgAVCAYGAAYCAAAvAAEEAgEBAQEBAQEBAAEBAwEAAwIBAQAAAgQCAQEBAQEBAQEBAQEBARUAAAAAAQQEAAEEAAQLAAIIAAAHAAQAAwEBBgsHAQAABwYDAQ8TAgEBCQAEAggAAAACCAcABQUFAAEBAQEBAQEBAAEEAAUGBAABBwERAQAABAECBgIEBAMABwAAAAEAAAAAAAgABAIwBAACCAAAAQAEBwUKBAAEGgIAAgEABAQGAgQECAYGBgEEBAIBAAAEAgYGAAMABBIABAAAAQAGBgEBBgAPADEGBAAGBgYCAAAEAhUEBQUFAAICBAYCBAAHAQABMgIEBgAABAQIBQAAAgYSAAAzBAQAAAYCAQEBAQ4EBQQLDwEjAzQbBAYHBQIGBwIAAAIICAMEAAIEAgMIBAAAAwIHNQAHAAEBBAQAAAcEAgIABAAGCAQABAIAAAcHBgYCBQIAAQQABAQEAAICAAEAAAAEBAYGAAAENgABAAIAAAIBBwEICQQBBwIGBgIAAgMBAQYEBQEkAAEAAgAAAAQACQICCQIDADcEAQgAAAACBQgABQEBCAAEBAcDAwgCAAkIBAABBQIEAAAIAAgEAAQAJAQCAAAEDQABBQEDAAEAAAIEBAkEAAAPAgIBACUBAQAAAQAECBICAAQADQQEAAYCBwIEAAIAAgIBAQABAgQEAQIABAAEAQQCAAYGAAABBQAEBAABBAICBAIAAAgIAgAABgEAAAECBAEACAAGBAQAAAIAAAgECQkEAAAAAAEACAgABAQBBAECAAEEBgAACQAAAAECAgABFgEDAQAEAAEGAQAAAAYEAAABAQEBAQEEAQAGBAQBAwEBAAQFAAECBwEBAgYECQABAAACBAcEBgYABAQDAQQGABYAAgQACDgAAQcABAAAAAMABAYBAQIEBAIHBgAJBAgBAgAEAAQACAEEAAQCAgQBAgABBRIGAwICAgA5CRAEAwEECQACBAYAAQEEBAEADgABAgcCAAABAAIEAAMGAgAFAgYHBAAAAAIiAgADBgQCAgIBAQMCAgYCCwIEBAYCAAYEAAAGBiYAAAAGAgQDAAUDBAAEBQQIAgI6AAEAAQUFBAEJAAMFCAYGBgYDBQAAAAADAwAAAgUFCAgCAAYCAgYEAAAAAAADAAUAAAACEgQCAAECAgACBAABAQEBAAAAAAUFAAUWDhAGBgICAQYGAgAAAAYAAAYGAgECAgEAAQEAAQYIBQUFAAAAAAAAAQAAAQEEBQQAAAAAAAAGAQAAAwYGAwACAAUCDwAAAAAAAAAAAAAEBAEHBQQFAgAAAgICAgAAAAABAgIFBgIAAAAFAAICAQMHAAAABQACAAICAgIAAQMDBAALAAUCAAABBQABAgECAAsCAgICAgICAgICAgICAgICAQAEAgEGAQAABAIAAAAAAgICAgIJAAAACQICAgIAAgIABAQEAgICAgAABAICAgICAgICAgICAgICAgICBQAAAAAAAAAAAAQEBgYGAAAAAgUFBQAFAAoFBAIEAwYCAAAAAAICDgEEBgIFAQUFBQYECQIFAgIWAgAAAQgBCAEIBgYBAAECAAEHAQMCDAIDCAAHCQIEAQIAAgACAgEBAgAGAg0AAQIAAAQFBAAGBAAGBAUAAgQBAAAAAQcCOwAFAAAAAAAAAAMAEwcDBAAAAAYCADwGAAADBAAHCAg9AAUGBgYGCAIFCQABAAEEBQQAAAEFBQEIHAAAAgUCAgABBQUAAgADAAUCAAQBCQUEAQUDAAUFCAEFBAUDBwkABAUFAgAFAAAAAAYABgAHAAUCCAICAAInJwAFAwAAAAAAAAAAAAAAAAAABQAAAAAAAAACAwAAAAAAAAQACAQAAgEAAAAABgABBAQACQAAAAAEABMCAAUAAAUBAAAGAgICAgIBBgECBwQABwAJAAAHAQICAgICAgICAgICAgAHAAAAAAcAAgIEBQQEBAQABAQABAQIAAMCAAUBAAAAAQgAAAANAQABAQIACAkECQcBBAIAAwAcAQADBQEAAhwBBgACAAECBAAFAgIBAwcCAwICAAUBBAABBgYGAgEFAQEBAQEBAQEBBAEAAgQAAQYDAQEAAgUPAQACAgICAgICAgICAAAAAAAABQAUAAAAPgAAAAQBCQkABQUBAAcCAgICAgAAAAAAAQAABgABAAQCAgIIBgAAAAYCAgEABQQCAgUFBAAFBQQAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQANAAQDAgAABgABAQEBAQEBAAAAAAEBAQABAAAAAAEBAQABAAYBAAACAAIEAgEYAAAHAgMIAQABAQcBAQAAAAAABAQFAgACAgICAgEAAAEABQQEBAIAAAYAAgQAAAICAgIGAAICAgICAAACAgICAgACAAAQAAAFAAQCAgICAgIAAAQBAAAABAkABQQCAwEACAAFBgYABAQEBAUCAAEABwQEBQUAAQIHBwABAgICAgICAgIDAgAAAgcHBAEBBQICAgICAgICAgICAgICAgICAgICAgICAAAAAAAADwEBAAAAAAACBAQCAgICBAACAAQEAgUCBQIAAQEBAgUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgABAAAAAAEAAQABAQAAAgYABAQCBQEKCAUEBwICAgECAAIBAQECAgICAgECAgEBASgBAgAAAQEBAQIHAQEABAQCAgEEAAEBAAAAAgIAAQQEAAYBBAADBAUFBQUGAAAGBgICAAABAQAABQUAAQABBAAEAAAAAwoBAAYEAAQBAAcJBAQAAQAAAQEBAAAAAAAAAAEHBgQAAQQABgQBBQEABQAEAQ8AAQEGAAQAAQ0FAQACAgICAAYCAAAAAAAAAAAAAwgAAAEAAwECCAUEBQQBAQICAgEABAEBAQABAQEBAQEBAgACAgECAgICAgQEAgICAQECBAICAQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAQICAgIBBQABAAEBAQEBAQQBARABAQEBCAEBAwMCAQEBAQAAAQEBBAIBAQUBAQcBCgEBBQEBAQEBAAEBAQEBAAE/AQAAAAAAAAAAAAAAAAAAAAAAAgIHAgICAQIAAAIHCQYBAgICAgICAgIACAICAgABBwECAAICAgIBAQAAAAEFAQEBAQABAgAAAQICAQEBAAEBAQEBAQAAAAcAAAUABAEFBQQBBQEFAAAAAAUCAgAAAAABAAABAAABQAICAQEAAgACAgEBDQQAAAAFBAAEAAkEBAIIAAYCAgIFAQUFAwUFBQUFBQUFBQEBAQEBAQEBAAEpAQEBAQUBAQEFAQEBAQIAAgsGAEEEBAEJBAkABAcDAQIFAAEAHQEBAQEBAQAAAAEAAAAAAQ0AAQEMAAEBAAAAAAAAAAEBAQEBAQEBAAEBAQQAAAAAAQABAQECBAUCDwICAgQJBgEBAAsCAAwMAQUAAwIEAAEBAQEBBQkCBgICBgUBAQEBBgEAAQABAQEAAQYAFxcCAgUAAwYOAgAAAAECAgQAAAICAAAAAAICBQUBAgIAAAAAAAAAAgwGBgYGAgICAgICAgAAAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUHAgcEAgIQEAIFAgAGAgICAgIFAAICAgIGAAICAQYEAgIAAAUdBgAMGAECAAACAgECAgEBAQABAQANAAEBAQEBAgEBAQEBAQEBAQEBAQUABBMBFwIAAgAUFAECAQEUFAAAIAAFAxQUBQIBAQIDAgICAgkCABYCAgICAgIAAgIGAwACAgABAgUFAAEFAAUBAgEBEQAAAgUCAgIHBwUGAgICBgcCAgICAgICAgACAgAEBAcABwIAAgMCAQIFBQIHBwUBAQMCKgICBQEBAQEAAQEBAQACBQAABQICAgABAQEBAAAAAAAAAQEBAUIBAAAAKAAAAQUBAQEFBQEBAQABAQEGAAQAAwAAAAQAAAABBwEJAAUAAAAAAAUEKgAAAQAAAAAEAAUAAAAFAQAFAgIEAgEAAQABAAEEBAAEEwABAQIbBwAFEAABAQEMAAACBwYCBwUFAQEBAQEBBgEBAQEABQEAARsFAA0BAQEBAQAABAQBAAIHAgUAAgIjKwEBAgkBAgICAAEBAgIBAAACAgICAQEBAAAACgEBCgEAAgICCwYECQQFAQEEAAQCAgICAgsGBgYCAgAAAAAAAQEBBQEBBgYGBgEBAAAAAAEBAQEBAgICAQMAAAEHBgQFCQYCAgEBBwIEBwEFBQYpAgIMBgAAAAEFAgICAgIFBgICAAEBAQAAAAABAAIGAAABCAIBAAEAAAAAAAcACQIBAQEBAQAAAAAGAQUAAAEBAAAJAwUCAAEDAwYAAAABAQABEAEBAAADAAAAAAAABQEAAgQAAAAAAAAAAAAYAQAAAAAAQwAAAQAQAAAAAAAAAAMJCQkJAQkDBwcBARUEAwkDAysBAwMDAwMHCQIWCQIJBgIFDAAFBAEBDAIBAAwCCQQJAQABCQQFBAABCQcOREZIAAMBAQUFBRABBAICAgMBBAQGBgYBAQEBDAIBAQABAQEBAQEBAQEEAAQAAAUABgQECgoCAgkCFxcGAAEBAQEABQIAAQUAAAAAABEFAgUBAQEBAQoBAQEBAQEBAQAAAQICAhEBAgUEBQEBAQEEBAUEBAQKAQUFBAQAAAECAAIDCQAEAwECAAUCAgQDBwQMAQEBAQUFAQEFAQEBAQEKAQEMAQEBAQEAAAEBAAAAAQEBAAEMAQEBAQEBAQEBAQoBAQEBAQoFAQEFAQEAAQEEAgQCAQEECQkBAQICBQQDAgABAQEBBQEBAQECAQEBBgYBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAQBAQEAAAABAQQAAQEBAAAAAAAABAEBAQEAAAAAAAAAAAAAAQEBAQwEAQEBAQEBAQEBAQEBAQEBAQAAAQEBAQEBAAEEAQEAAAAAAAAAAAAAAQEBAQABAQEBAQYAAgEBAQEBAQEHAwEBAAEAAAEBAAQBBAIBBAoKAAoKCgoKCgoKCgoKAQEAAQEBAQEPCgIBAQEBAQUBAQEBAAAMDAEBAQEAAAABAQIBAQEBAAAAAQICAgICAQUFCgMBAAQEAwcMAgIFGAABAQERDQEBAQEKAQEBAQoKCgoKAQQBAQEBAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQAAAAEAAAAAAAEAAAACAAAAAAAAAAABAQAAAQAAAQIAAAABAQEBAQEBAAIAAAAAAAAAAAAAAAAAAQECAgIBBAADAAICAgIEAgICARMTAAACAAEAAgICAgICAgACBAECAQEBAgEBAQEBAQEBAQABBQEBAQEBAQEBAQEBAgEBAQEBAQICAgICAgICBQUBAQEBAQEBAQEFAQEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAEBAAAAAQAAAAABAQEBAQAAAAAAAAAAAAAAAAAAAAEBAQEBAAEBAQEBAQEAAQEBAQEAAAAAAAAAAQEBAQEBAQEBAAAAAQEBAQEBAQEAAAEAAQEBAQEBAQEBAAAAAAEBAQAAAAAAAQEBAAABAQEBAQEAAQEBAQEBAQEBBAMBAwAAAAQAAAAAAAAAAAAAAQEAAAAAAQEBAQEBAgEFBQUDBQIHAgABAQEBAQIFAQABAwEGAQEBAQEBAQEBAQEBAQEdAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQkBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEZAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAABAAEBAQEBAQEBAQEBAAABAAICAgICAgIBAAAAAAEAAAACBAYBAQEBAQIDAAEBAQEAAgEEAQEBAQEBAQEBAQEFAQEEAQUBAQEB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JAJ/IAUEQCACQfgCahCGFkEBDAELIAsgAikD+AI3AgAgC0EYaiACQZADaikDADcCACALQRBqIAJBiANqKQMANwIAIAtBCGogGikDADcCAEHwAEEIEIwgIg5BCjYCACAOQQRqIAJB6AZqQSQQ9gYaIA4gAzYCKEEAIQNBAAshBSACQcgHahDvJAwSCyAGQQFxBEAgAkH9ADoA6AYgASAJIAggAkHoBmoQqRkLQQAhBgJAIAJBmANqQaCx4ABBBRCxG0UNACAHEMgNIgRFDQAgBCgCAEEURw0AIAQtAARBDUcNACANIAwpAgA3AgAgASgCyAIhBCABQSU2AsgCIAEgASkD4AI3A5gDIA1BCGogDEEIaikCADcCACANQRBqIAxBEGooAgA2AgAgAiAENgLoBiACQegGahC+CkEBIQYLIAJB6AZqIgggARCtASACKALsBiERIAIoAugGIhZBBUcEQCACQdgDaiIdIBApAwAiMjcDACACQdADaiIeIAopAwAiMzcDACACIA8pAwAiNDcDyAMgHCA0NwMAIBxBCGogMzcDACAcQRBqIDI3AwAgAiARNgKsAyACIBY2AqgDIAJBkAFqIAJBqANqEIccIAIgAikDkAE3AuADICFBFWogE0EVaiIEKQAANwAAICFBEGogE0EQaiIDKQEANwEAICFBCGogE0EIaiIFKQEANwEAICEgEykBADcBACACQQA6APoGIAJBAToAgQcgAiABLQDGAjoAhAcgAiABKQGqAjcA6AYgAiABKQGyAjcA8AYgAiABLwG6AjsA+AYgAiABKAC9AjYA+wYgAiABLwDBAjsA/wYgAiABLwHEAjsAggcgByAIEMgIIAIgATYC6AMgAkGIAWogAkGYA2oQkQwCQAJAIAIoAogBIgggAigCjAEiCUH6ruAAQQMQzR9FBEAgCCAJQf2u4ABBAxDNHw0BIAggCUGgseAAQQUQzR8NAkG54+AAQShBgKTgABDaFwALIAIoAvQCIQZBACEIIAJBADsA1wQgAkEAOgDMBSACQQA6AI8IIAIgBjYC2AYgAiABLQCwAjoA1gQgAiABKAGqAjYA0AQgAiABLwGuAjsA1AQgAiABKQCzAjcA2QQgAiABKQC7AjcA4QQgAiABKADDAjYA6QQgFEEVaiAEKQAANwAAIBRBEGogAykBADcBACAUQQhqIAUpAQA3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KAIQIgIQsx8NAQJAIAEtAAtBAXFFBEAgA0HIAGogAUEgakHYrMMAEJ4dIAMoAkwhBSADKAJIIQQgA0FAayABQeAAakHorMMAEJ4dIAMoAkQhASADQYADaiAEIAMoAkAQwgYgA0HQAWoiBCADQYwDaigCADYCACADIAMpAoQDNwPIASADKAKAAyIGQSpHDQEgA0H4AGogBCgCADYCACADIAMpA8gBNwNwIAwgAkEDdGohAgNAIAIgDEYEQCAAIANB8ABqEOcGIAEgASgCAEEBajYCACAFIAUoAgBBAWo2AgAMDQsgA0HIAWogDCgCACAMKAIEENIcIAxBCGohDANAIANB4AJqIANByAFqEO4CIAMtAOACQQRGBEAgAygCyAEgAygCzAEQyikMAgsgA0H4AmogA0HoAmotAAA6AAAgAyADKQDgAjcD8AIgA0E4aiADQfACahCaICADQYADaiIEIANB8ABqIAMoAjggAygCPBDgBCADKAKAAyIGQSpGDQALCyAAQQRqIARBBHJBPBD2BhogACAGNgIAIAMoAsgBIAMoAswBEMopDAYLAkACQCABLQAMQQFxRQRAIAEoAtgBDQIgAUF/NgLYASABQdwBaiEFIAEoAuQBRQ0BIAEgAS8B7AFBAWoiBDsB7AEgBEH//wNxIARGDQcgA0EANgKIAyADQgA3A4ADIANBADsBjAMgA0HIAWogA0GAA2ogASgC6AEQ7wcgASgC3AEgAUHgAWooAgAQySkgBUEIaiADQdABaigCADYCACAFIAMpAsgBNwIADAcLIAEoAoQBRQRAIAFBfzYChAEgAUGIAWoiEBCYByABQaABaiEYIAFBrAFqIRkgDCACQQN0aiEdIANBzAFqIQ8gA0HwAGpBAnIhFCADQeECaiEaIAFBsAFqIR4gAUGQAWohFSABQYwBaiEWIANB1AFqIR8gA0HOAWohICADQdEBaiEhIAFBpAFqISICQAJAA0ACQCAMIB1GBEAgA0EQaiABQSBqQYitwwAQnh0gAygCFCEFIAMoAhAhAiADQQhqIAFB4ABqQZitwwAQnh0gAygCDCEGIANBgANqIAIgAygCCBDCBiADQdABaiICIANBjANqKAIANgIAIAMgAykChAM3A8gBIAMoAoADIgRBKkcNASADQfgAaiACKAIANgIAIAMgAykDyAE3A3AgASgCuAEN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BQwCCyADQYADaiICIA4gFCASEMMNIANBwANqIAIQ1BUMAgsgASgCoAEgIigCABDKKSAYQQhqIANB2ANqKAIANgIAIBggAykD0AM3AgAMAQsgECADQcADaiAUIBIQxxghBAsgFSgCACECIBYoAgAhCQJAAkAgCEUEQCAJIAIgCyATIAogBSAEEOgMDAELIAkgAiATELAfIgIoAggiCCALTQ0BIAIoAgQgC0EDdGoiAiAFOgAFIAIgCjoABCACIAQ2AgBBACEICyAGQQNqIQYgC0EBaiELDAELCwsLIAsgCEGgosMAEJsQAAtBkLHDAEEkQcChwwAQ2hcACyACQQRBuKPDABCdEAALQQEgB0HI6+AAEJsQAAsgASgCrAEgHigCABDJKSAZQQhqIANByANqKAIANgIAIBkgAykDwAM3AgAMAQsACwALCyAAQRBqIANBkANqQTAQ9gYaIABBDGogAigCADYCACAAIAMpA8gBNwIEDAgLQYChwwAQ2xQAC0HwoMMAENsUAAtB+KzDABDbFAALIANBADYCiAMgA0IANwOAAyADQQA7AYwDIANByAFqIANBgANqIAEoAugBEO8HIAEoAtwBIAFB4AFqKAIAEMkpIAVBCGogA0HQAWooAgA2AgAgBSADKQLIATcCAAwFC0HIrcMAENsUAAsgAEEQaiADQZADakEwEPYGGiAAQQxqIAQoAgA2AgAgACADKQPIATcCBCAAIAY2AgAMBAsgA0GAA2ogARCmFyADKAKEAyEFIAMoAoADIgRBKkYEQCADQbwBaiACKAIQIgQQ/REgBEEBdCEEIAWtISYgAigCDCECA0AgBARAIANBvAFqIAIxAAFCKIYgAjEAAEIghoQgJoQQphsgBEECayEEIAJBAmohAgwBBSADQYADaiABIANBvAFqEOIWIAMoAoQDIQEgAygCgAMiAkEqRgRAIAAgBTYCCCAAIAE2AgQgAEEqNgIADAwLIABBCGogA0GIA2pBOBD2BhogACABNgIEIAAgAjYCAAwLCwALAAsgAEEIaiADQYgDakE4EPYGGiAAIAU2AgQgACAENgIADAgLIANBgANqIAEQphcgAygChAMhBSADKAKAAyIEQSpHBEAgAEEIaiADQYgDakE4EPYGGiAAIAU2AgQgACAENgIADAgLIANBsAFqIAIQ/REgAkEDdCECIAWtISYC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Ug0CCwJAIAUtAERFDQAgA0EANgJAIANBKGogASADQUBrQcWo4ABBARCUEyADLQAoQQRGDQAgAykDKCITQv8Bg0IEUg0CCyADQUBrIAIgARCjByADLQBAQQRGDQAgAykDQCITQv8Bg0IEUg0BCyADQUBrIAEgBCgCIBD2AyADLQBAQQRGDQcgAykDQCITQv8Bg0IEUQ0HCyATQv8Bg0IEUg0FDAYLIANBKGogASAEKAIoIgJBABDRAQJAIAMtAChBBEcEQCADKQMoIhNC/wGDQgRSDQELIANBEGogBEEIaiIHELQcIANBKGogASADKAIQQQAQ0QEgAy0AKEEERwRAIAMpAygiE0L/AYNCBFINAQsCQCACRQ0AIANBKGogASACELMcIAMtAChBBEYNACADKQMoIhNC/wGDQgRSDQELIAQoAjAiAigCFEEMbCEGIAIoAhAhBQJAA0ACQCAGRQRAIANBKGogASAELQA5EIgIIAMtAChBBEcEQCADKQMoIhNC/wGDQgRSDQULIAQtADQNAQwDCyADQShqIAEgBRC/BiADLQAoQQRHBEAgAykDKCITQv8Bg0IEUg0ECyAFQQxqIQUgBkEMayEGDAELCyADQQA2AiggA0E4aiABIANBKGpBzLzgAEEGEJQTIAMtADhBBEcEQCADKQM4IhNC/wGDQgRSDQILAkAgBC0AOA0AIAItAEUNACACLQBERQRAQQEgBygCAHRBFXENAQsgAS0ATQ0BIANBKGogARC4ESADLQAoQQRGDQEgAykDKCITQv8Bg0IEUQ0BDAILIANBKGogARC4ESADLQAoQQRGDQAgAykDKCITQv8Bg0IEUg0BCwJAIAQtADVFDQAgA0EANgIoIANBOGogASADQShqQe+u4ABBCBCUEyADLQA4QQRHBEAgAykDOCITQv8Bg0IEUg0CCyADQShqIAEQuBEgAy0AKEEERg0AIAMpAygiE0L/AYNCBFINAQsCQCAELQA3RQ0AIANBADYCKCADQThqIAEgA0EoakGcvOAAQQgQlBMgAy0AOEEERwRAIAMpAzgiE0L/AYNCBFINAgsgA0EoaiABELgRIAMtAChBBEYNACADKQMoIhNC/wGDQgRSDQELAkACQAJAAkACQAJAAkACQAJAIAQtADhBAWsOAgABAgsgA0EANgIoIANBOGogASADQShqQfqu4ABB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IAQoAqgBQRBGDQ0gBEGoA2ogBEHAAWooAgA2AgAgBEGgA2ogBEG4AWopAgA3AwAgBEGYA2ogBEGwAWopAgA3AwAgBCAEKQKoASIWNwOQAyAWp0EPRw0OIARBkANqEOgUIARBvAJqIARByAJqEKkQDAELCyAEQQg2AsgCCyAEQcgCahDOJCAEKALAAiAEKALEAhCkCCAEQagBaiIBIARBvAJqEFogAyABEIoYDBMLIARBADYCnAIgBEKAgICAwAA3ApQCIAEoAgAhBSAEQZQDaiEBIARBrAFqIQMDQCAEQagBaiAFEJIMAkACQCAEKAKoASICQRBHBEAgASADKQIANwIAIAFBEGogA0EQaikCADcCACABQQhqIgYgA0EIaikCADcCACAEIAI2ApADAkACQAJAAkACQAJAAkACQAJAAkAgAkEHa0EAIAJBCE8bQQFrDggAAQIDBAUGBwgLIARBgANqIAYoAgA2AgAgBCABKQIANwP4AiAEQaACaiAEQfgCahDIEAwICyAEQQE2AqwBIARBzL7EADYCqAEgBEIANwK0ASAEIARB0ABqNgKwASAEQagBakHUvsQAEKEdAAsgBEEBNgKsASAEQbi/xAA2AqgBIARCADcCtAEgBCAEQdAAajYCsAEgBEGoAWpBwL/EABChHQALIARBATYCrAEgBEGkwMQANgKoASAEQgA3ArQBIAQgBEHQAGo2ArABIARBqAFqQazAxAAQoR0ACyAEQQE2AqwBIARBiMHEADYCqAEgBEIANwK0ASAEIARB0ABqNgKwASAEQagBakGQwcQAEKEdAAsgBEEINgKgAgwDCyAEQQE2AqwBIARB9MHEADYCqAEgBEIANwK0ASAEIARB0ABqNgKwASAEQagBakH8wcQAEKEdAAsgBEEBNgKsASAEQeTCxAA2AqgBIARCADcCtAEgBCAEQdAAajYCsAEgBEGoAWpB7MLEABChHQALIARBuAJqIARBqANqKAIANgIAIARBsAJqIARBoANqKQIANwMAIARBqAJqIARBmANqKQIANwMAIAQgBCkCkAM3A6ACCyACQQlPBEAgBEGQA2oQ6BQLIAQoAqACQQhGDQEgBEHAAWogBEG4AmooAgA2AgAgBEG4AWogBEGwAmopAwA3AwAgBEGwAWogBEGoAmopAwA3AwAgBCAEKQOgAiIWNwOoASAWp0UN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AkEANgKEAiACQoCAgIAQNwL8ASABKALQASEGDAILQQAhAyACQQA2AtgBIAIgBjYC1AEgAiAENgLQAUEBIQcDQCACQfgAaiACQdABahDgDyACKAJ8IgVBgIDEAEYNAyACKAJ4IQgCQCAHBEAgBRDPEQ0BDAULIAUQ0BEgBUEtRg0ARQ0ECwJ/QQEgBUGAAUkNABpBAiAFQYAQSQ0AGkEDQQQgBUGAgARJGwsgCGohA0EAIQcMAAsACyAIEJwVQSIhBwwLCwJAAn8DQCABKALAASABKALEARDcHCIDQYCAxABGBEAgASgCnAEhBCACQRs6ANABIAEgBCACQdABahC0IyABKALQASEEDAMLIAEoAtABIQQgA0HcAEYEQCACQZABaiAIIAYgBBC8FSACQfwBaiIEIAIoApABIAIoApQBENYdIARB3AAQ9wcgCBCcFSABKALQASEGDAELIAMgBUYNAiADQSZGBEAgAkGYAWogCCAGIAQQvBUgAkH8AWoiAyACKAKYASACKAKcARDWHSACQdABaiABEEEgAigC1AEiByACKALQASIEQYCAxABGDQIaIAIoAtgBIQkgAyAEEPcHIAEoAtABIQYgByAJEKckDAELIAMQ7B1FBEAgCBCcFQwBCyACQaABaiAIIAYgBBC8FSACQfwBaiIHIAIoAqABIAIoAqQBENYdIAJB0AFqIAFBABCjDSACKALQAUUEQCACKALYASEGAkAgAigC1AEiCQRAIAcgCSAGENYdDAELIAJB/AFqIAYQ9wcLAn9BASADQYABSQ0AGkECIANBgBBJDQAaQQNBBCADQYCABEkbCyAEaiEGDAELCyACKALUAQshBSACKAL8ASACKAKAAhCnJAwNCyACKAKEAiEDIAJBiAFqIAggBiAEELwVIAIoAowBIQQgAigCiAEhBQJ+IAMEQCACQfwBaiIGIAUgBBDWHSABKALoAUEIaiAGENsLDAELIAEoAugBQQhqIAUgBBDmGQshFCABKALAASABKALEARCLHEGAgMQARwRAIAgQnBULIAJBgAFqIAggCiABKALQARC8FSABKALoAUEIaiACKAKAASACKAKEARDmGSEVIANFBEAgAigC/AEgAigCgAIQpyQLIAIgFTcDuAEgAiAUNwOwAUEbIQcMCgsgASAGNgLEASABIAMgBGo2AsABIAEgAyAKajYC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IT0gA0Guwd8AQQEQuRo3A7gBIANCADcDwAEgA0HgJmoiBCADQbgBahCDHCADQaABaiIHIAQpAwA3AwAgA0GoAWoiCCADQegmaikDADcDACADQbABaiIEIANB8CZqKQMANwMAIANCADcDmAFB1ZnaAEEjELkaITxByAAQzSAiBUIANwM4IAVBADoANCAFIAk2AjAgBUIANwMoIAUgPTcDICAFQRhqIAQpAwA3AwAgBUEQaiAIKQMANwMAIAVBCGogBykDADcDACAFIAMpA5gBNwMAIAVBQGtBADoAACADQQE2AuQmIAMgBTYC4CYgA0EBNgLcJkEYEM0gIgRCADcDCCAEIDw3AwAgA0HyJmpCADcBACAEQRBqQgA3AwAgA0IANwLsJiADIAQ2AugmIANBADYC2CYgECADQdgmahDfGQsgCy0ABARAIA8oAgAQhwQhCUH4mdoAQRgQuRohPSADQa7B3wBBARC5GjcD6AEgA0IANwPwASADQeAmaiIEIANB6AFqEIMcIANB0AFqIgcgBCkDADcDACADQdgBaiIIIANB6CZqKQMANwMAIANB4AFqIgQgA0HwJmopAwA3AwAgA0IANwPIAUGQmtoAQScQuRohPEHIABDNICIFQgA3AzggBUEAOgA0IAUgCTYCMCAFQgA3AyggBSA9NwMgIAVBGGogBCkDADcDACAFQRBqIAgpAwA3AwAgBUEIaiAHKQMANwMAIAUgAykDyAE3AwAgBUFAa0EAOgAAIANBATYC5CYgAyAFNgLgJiADQQE2AtwmQRgQzSAiBEIANwMIIAQgPDcDACADQfImakIANwEAIARBEGpCADcDACADQgA3AuwmIAMgBDYC6CYgA0EANgLYJiAQIANB2CZqEN8ZCyALLQAFBEAgDygCABCHBCEJQbea2gBBEBC5GiE9IANBrsHfAEEBELkaNwOYAiADQgA3A6ACIANB4CZqIgQgA0GYAmoQgxwgA0GAAmoiByAEKQMANwMAIANBiAJqIgggA0HoJmopAwA3AwAgA0GQAmoiBCADQfAmaikDADcDACADQgA3A/gBQcea2gBBHxC5GiE8QcgAEM0gIgVCADcDOCAFQQA6ADQgBSAJNgIwIAVCADcDKCAFID03AyAgBUEYaiAEKQMANwMAIAVBEGogCCkDADcDACAFQQhqIAcpAwA3AwAgBSADKQP4ATcDACAFQUBrQQA6AAAgA0EBNgLkJiADIAU2AuAmIANBATYC3CZBGBDNICIEQgA3AwggBCA8NwMAIANB8iZqQgA3AQAgBEEQakIANwMAIANCADcC7CYgAyAENgLoJiADQQA2AtgmIBAgA0HYJmoQ3xkLIAstAAYEQCAPKAIAEIcEIQlB5praAEEZELkaIT0gA0Guwd8AQQEQuRo3A8gCIANCADcD0AIgA0HgJmoiBCADQcgCahCDHCADQbACaiIHIAQpAwA3AwAgA0G4AmoiCCADQegmaikDADcDACADQcACaiIEIANB8CZqKQMANwMAIANCADcDqAJB/5raAEEoELkaITxByAAQzSAiBUIANwM4IAVBADoANCAFIAk2AjAgBUIANwMoIAUgPTcDICAFQRhqIAQpAwA3AwAgBUEQaiAIKQMANwMAIAVBCGogBykDADcDACAFIAMpA6gCNwMAIAVBQGtBADoAACADQQE2AuQmIAMgBTYC4CYgA0EBNgLcJkEYEM0gIgRCADcDCCAEIDw3AwAgA0HyJmpCADcBACAEQRBqQgA3AwAgA0IANwLsJiADIAQ2AugmIANBADYC2CYgECADQdgmahDfGQsgCy0ABwRAIA8oAgAQhwQhCUGnm9oAQQ8QuRohPSADQa7B3wBBARC5GjcD+AIgA0IANwOAAyADQeAmaiIEIANB+AJqEIMcIANB4AJqIgcgBCkDADcDACADQegCaiIIIANB6CZqKQMANwMAIANB8AJqIgQgA0HwJmopAwA3AwAgA0IANwPYAkG2m9oAQR4QuRohPEHIABDNICIFQgA3AzggBUEAOgA0IAUgCTYCMCAFQgA3AyggBSA9NwMgIAVBGGogBCkDADcDACAFQRBqIAgpAwA3AwAgBUEIaiAHKQMANwMAIAUgAykD2AI3AwAgBUFAa0EAOgAAIANBATYC5CYgAyAFNgLgJiADQQE2AtwmQRgQzSAiBEIANwMIIAQgPDcDACADQfImakIANwEAIARBEGpCADcDACADQgA3AuwmIAMgBDYC6CYgA0EANgLYJiAQIANB2CZqEN8ZCyALLQAIBEAgDygCABCHBCEJQdSb2gBBExC5GiE9IANBrsHfAEEBELkaNwOoAyADQgA3A7ADIANB4CZqIgQgA0GoA2oQgxwgA0GQA2oiByAEKQMANwMAIANBmANqIgggA0HoJmopAwA3AwAgA0GgA2oiBCADQfAmaikDADcDACADQgA3A4gDQeeb2gBBIhC5GiE8QcgAEM0gIgVCADcDOCAFQQA6ADQgBSAJNgIwIAVCADcDKCAFID03AyAgBUEYaiAEKQMANwMAIAVBEGogCCkDADcDACAFQQhqIAcpAwA3AwAgBSADKQOIAzcDACAFQUBrQQA6AAAgA0EBNgLkJiADIAU2AuAmIANBATYC3CZBGBDNICIEQgA3AwggBCA8NwMAIANB8iZqQgA3AQAgBEEQakIANwMAIANCADcC7CYgAyAENgLoJiADQQA2AtgmIBAgA0HYJmoQ3xkLIAstAAkEQCAPKAIAEIcEIQlBiZzaAEEWELkaIT0gA0Guwd8AQQEQuRo3A9gDIANCADcD4AMgA0HgJmoiBCADQdgDahCDHCADQcADaiIHIAQpAwA3AwAgA0HIA2oiCCADQegmaikDADcDACADQdADaiIEIANB8CZqKQMANwMAIANCADcDuANBn5zaAEElELkaITxByAAQzSAiBUIANwM4IAVBADoANCAFIAk2AjAgBUIANwMoIAUgPTcDICAFQRhqIAQpAwA3AwAgBUEQaiAIKQMANwMAIAVBCGogBykDADcDACAFIAMpA7gDNwMAIAVBQGtBADoAACADQQE2AuQmIAMgBTYC4CYgA0EBNgLcJkEYEM0gIgRCADcDCCAEIDw3AwAgA0HyJmpCADcBACAEQRBqQgA3AwAgA0IANwLsJiADIAQ2AugmIANBADYC2CYgECADQdgmahDfGQsgCy0ACgRAIA8oAgAQhwQhCUHEnNoAQQwQuRohPSADQa7B3wBBARC5GjcDiAQgA0IANwOQBCADQeAmaiIEIANBiARqEIMcIANB8ANqIgcgBCkDADcDACADQfgDaiIIIANB6CZqKQMANwMAIANBgARqIgQgA0HwJmopAwA3AwAgA0IANwPoA0HQnNoAQRsQuRohPEHIABDNICIFQgA3AzggBUEAOgA0IAUgCTYCMCAFQgA3AyggBSA9NwMgIAVBGGogBCkDADcDACAFQRBqIAgpAwA3AwAgBUEIaiAHKQMANwMAIAUgAykD6AM3AwAgBUFAa0EAOgAAIANBATYC5CYgAyAFNgLgJiADQQE2AtwmQRgQzSAiBEIANwMIIAQgPDcDACADQfImakIANwEAIARBEGpCADcDACADQgA3AuwmIAMgBDYC6CYgA0EANgLYJiAQIANB2CZqEN8ZCyALLQALBEAgDygCABCHBCEJQeuc2gBBCxC5GiE9IANBrsHfAEEBELkaNwO4BCADQgA3A8AEIANB4CZqIgQgA0G4BGoQgxwgA0GgBGoiByAEKQMANwMAIANBqARqIgggA0HoJmopAwA3AwAgA0GwBGoiBCADQfAmaikDADcDACADQgA3A5gEQfac2gBBGhC5GiE8QcgAEM0gIgVCADcDOCAFQQA6ADQgBSAJNgIwIAVCADcDKCAFID03AyAgBUEYaiAEKQMANwMAIAVBEGogCCkDADcDACAFQQhqIAcpAwA3AwAgBSADKQOYBDcDACAFQUBrQQA6AAAgA0EBNgLkJiADIAU2AuAmIANBATYC3CZBGBDNICIEQgA3AwggBCA8NwMAIANB8iZqQgA3AQAgBEEQakIANwMAIANCADcC7CYgAyAENgLoJiADQQA2AtgmIBAgA0HYJmoQ3xkLIAstAAwEQCAPKAIAEIcEIQlBkJ3aAEEcELkaIT0gA0Guwd8AQQEQuRo3A+gEIANCADcD8AQgA0HgJmoiBCADQegEahCDHCADQdAEaiIHIAQpAwA3AwAgA0HYBGoiCCADQegmaikDADcDACADQeAEaiIEIANB8CZqKQMANwMAIANCADcDyARBrJ3aAEErELkaITxByAAQzSAiBUIANwM4IAVBADoANCAFIAk2AjAgBUIANwMoIAUgPTcDICAFQRhqIAQpAwA3AwAgBUEQaiAIKQMANwMAIAVBCGogBykDADcDACAFIAMpA8gENwMAIAVBQGtBADoAACADQQE2AuQmIAMgBTYC4CYgA0EBNgLcJkEYEM0gIgRCADcDCCAEIDw3AwAgA0HyJmpCADcBACAEQRBqQgA3AwAgA0IANwLsJiADIAQ2AugmIANBADYC2CYgECADQdgmahDfGQsgCy0ADQRAIA8oAgAQhwQhCUHXndoAQSMQuRohPSADQa7B3wBBARC5GjcDmAUgA0IANwOgBSADQeAmaiIEIANBmAVqEIMcIANBgAVqIgcgBCkDADcDACADQYgFaiIIIANB6CZqKQMANwMAIANBkAVqIgQgA0HwJmopAwA3AwAgA0IANwP4BEH6ndoAQTIQuRohPEHIABDNICIFQgA3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AwA3AwAgA0GICGoiCCADQegmaikDADcDACADQZAIaiIEIANB8CZqKQMANwMAIANCADcD+AdBt6LaAEEnELkaITxByAAQzSAiBUIANwM4IAVBADoANCAFIAk2AjAgBUIANwMoIAUgPTcDICAFQRhqIAQpAwA3AwAgBUEQaiAIKQMANwMAIAVBCGogBykDADcDACAFIAMpA/gHNwMAIAVBQGtBADoAACADQQE2AuQmIAMgBTYC4CYgA0EBNgLcJkEYEM0gIgRCADcDCCAEIDw3AwAgA0HyJmpCADcBACAEQRBqQgA3AwAgA0IANwLsJiADIAQ2AugmIANBADYC2CYgECADQdgmahDfGQsgCy0AFgRAIA8oAgAQhwQhCUHeotoAQRkQuRohPSADQa7B3wBBARC5GjcDyAggA0IANwPQCCADQeAmaiIEIANByAhqEIMcIANBsAhqIgcgBCkDADcDACADQbgIaiIIIANB6CZqKQMANwMAIANBwAhqIgQgA0HwJmopAwA3AwAgA0IANwOoCEH3otoAQSgQuRohPEHIABDNICIFQgA3AzggBUEAOgA0IAUgCTYCMCAFQgA3AyggBSA9NwMgIAVBGGogBCkDADcDACAFQRBqIAgpAwA3AwAgBUEIaiAHKQMANwMAIAUgAykDqAg3AwAgBUFAa0EAOgAAIANBATYC5CYgAyAFNgLgJiADQQE2AtwmQRgQzSAiBEIANwMIIAQgPDcDACADQfImakIANwEAIARBEGpCADcDACADQgA3AuwmIAMgBDYC6CYgA0EANgLYJiAQIANB2CZqEN8ZCyALLQAXBEAgDygCABCHBCEJQZ+j2gBBHxC5GiE9IANBrsHfAEEBELkaNwP4CCADQgA3A4AJIANB4CZqIgQgA0H4CGoQgxwgA0HgCGoiByAEKQMANwMAIANB6AhqIgggA0HoJmopAwA3AwAgA0HwCGoiBCADQfAmaikDADcDACADQgA3A9gIQb6j2gBBLhC5GiE8QcgAEM0gIgVCADcDOCAFQQA6ADQgBSAJNgIwIAVCADcDKCAFID03AyAgBUEYaiAEKQMANwMAIAVBEGogCCkDADcDACAFQQhqIAcpAwA3AwAgBSADKQPYCDcDACAFQUBrQQA6AAAgA0EBNgLkJiADIAU2AuAmIANBATYC3CZBGBDNICIEQgA3AwggBCA8NwMAIANB8iZqQgA3AQAgBEEQakIANwMAIANCADcC7CYgAyAENgLoJiADQQA2AtgmIBAgA0HYJmoQ3xkLIAstABgEQCAPKAIAEIcEIQlB7KPaAEEeELkaIT0gA0Guwd8AQQEQuRo3A6gJIANCADcDsAkgA0HgJmoiBCADQagJahCDHCADQZAJaiIHIAQpAwA3AwAgA0GYCWoiCCADQegmaikDADcDACADQaAJaiIEIANB8CZqKQMANwMAIANCADcDiAlBiqTaAEEtELkaITxByAAQzSAiBUIANwM4IAVBADoANCAFIAk2AjAgBUIANwMoIAUgPTcDICAFQRhqIAQpAwA3AwAgBUEQaiAIKQMANwMAIAVBCGogBykDADcDACAFIAMpA4gJNwMAIAVBQGtBADoAACADQQE2AuQmIAMgBTYC4CYgA0EBNgLcJkEYEM0gIgRCADcDCCAEIDw3AwAgA0HyJmpCADcBACAEQRBqQgA3AwAgA0IANwLsJiADIAQ2AugmIANBADYC2CYgECADQdgmahDfGQsgCy0AGQRAIA8oAgAQhwQhCUG3pNoAQRgQuRohPSADQa7B3wBBARC5GjcD2AkgA0IANwPgCSADQeAmaiIEIANB2AlqEIMcIANBwAlqIgcgBCkDADcDACADQcgJaiIIIANB6CZqKQMANwMAIANB0AlqIgQgA0HwJmopAwA3AwAgA0IANwO4CUHPpNoAQScQuRohPEHIABDNICIFQgA3AzggBUEAOgA0IAUgCTYCMCAFQgA3AyggBSA9NwMgIAVBGGogBCkDADcDACAFQRBqIAgpAwA3AwAgBUEIaiAHKQMANwMAIAUgAykDuAk3AwAgBUFAa0EAOgAAIANBATYC5CYgAyAFNgLgJiADQQE2AtwmQRgQzSAiBEIANwMIIAQgPDcDACADQfImakIANwEAIARBEGpCADcDACADQgA3AuwmIAMgBDYC6CYgA0EANgLYJiAQIANB2CZqEN8ZCyALLQAaBEAgDygCABCHBCEJQfak2gBBGxC5GiE9IANBrsHfAEEBELkaNwOICiADQgA3A5AKIANB4CZqIgQgA0GICmoQgxwgA0HwCWoiByAEKQMANwMAIANB+AlqIgggA0HoJmopAwA3AwAgA0GACmoiBCADQfAmaikDADcDACADQgA3A+gJQZGl2gBBKhC5GiE8QcgAEM0gIgVCADcDOCAFQQA6ADQgBSAJNgIwIAVCADcDKCAFID03AyAgBUEYaiAEKQMANwMAIAVBEGogCCkDADcDACAFQQhqIAcpAwA3AwAgBSADKQPoCTcDACAFQUBrQQA6AAAgA0EBNgLkJiADIAU2AuAmIANBATYC3CZBGBDNICIEQgA3AwggBCA8NwMAIANB8iZqQgA3AQAgBEEQakIANwMAIANCADcC7CYgAyAENgLoJiADQQA2AtgmIBAgA0HYJmoQ3xkLIAstABsEQCAPKAIAEIcEIQlBu6XaAEEZELkaIT0gA0Guwd8AQQEQuRo3A7gKIANCADcDwAogA0HgJmoiBCADQbgKahCDHCADQaAKaiIHIAQpAwA3AwAgA0GoCmoiCCADQegmaikDADcDACADQbAKaiIEIANB8CZqKQMANwMAIANCADcDmApB1KXaAEEoELkaITxByAAQzSAiBUIANwM4IAVBADoANCAFIAk2AjAgBUIANwMoIAUgPTcDICAFQRhqIAQpAwA3AwAgBUEQaiAIKQMANwMAIAVBCGogBykDADcDACAFIAMpA5gKNwMAIAVBQGtBADoAACADQQE2AuQmIAMgBTYC4CYgA0EBNgLcJkEYEM0gIgRCADcDCCAEIDw3AwAgA0HyJmpCADcBACAEQRBqQgA3AwAgA0IANwLsJiADIAQ2AugmIANBADYC2CYgECADQdgmahDfGQsgCy0AHARAIA8oAgAQhwQhCUH8pdoAQRoQuRohPSADQa7B3wBBARC5GjcD6AogA0IANwPwCiADQeAmaiIEIANB6ApqEIMcIANB0ApqIgcgBCkDADcDACADQdgKaiIIIANB6CZqKQMANwMAIANB4ApqIgQgA0HwJmopAwA3AwAgA0IANwPICkGWptoAQSkQuRohPEHIABDNICIFQgA3AzggBUEAOgA0IAUgCTYCMCAFQgA3AyggBSA9NwMgIAVBGGogBCkDADcDACAFQRBqIAgpAwA3AwAgBUEIaiAHKQMANwMAIAUgAykDyAo3AwAgBUFAa0EAOgAAIANBATYC5CYgAyAFNgLgJiADQQE2AtwmQRgQzSAiBEIANwMIIAQgPDcDACADQfImakIANwEAIARBEGpCADcDACADQgA3AuwmIAMgBDYC6CYgA0EANgLYJiAQIANB2CZqEN8ZCyALLQAd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IANB8AxqIgcgBCkDADcDACADQfgMaiIIIANB6CZqKQMANwMAIANBgA1qIgQgA0HwJmopAwA3AwAgA0IANwPoDEGxqdoAQRwQuRohPEHIABDNICIFQgA3AzggBUEAOgA0IAUgCTYCMCAFQgA3AyggBSA9NwMgIAVBGGogBCkDADcDACAFQRBqIAgpAwA3AwAgBUEIaiAHKQMANwMAIAUgAykD6Aw3AwAgBUFAa0EAOgAAIANBATYC5CYgAyAFNgLgJiADQQE2AtwmQRgQzSAiBEIANwMIIAQgPDcDACADQfImakIANwEAIARBEGpCADcDACADQgA3AuwmIAMgBDYC6CYgA0EANgLYJiAQIANB2CZqEN8ZCyALLQAjBEAgDygCABCHBCEJQc2p2gBBCRC5GiE9IANBrsHfAEEBELkaNwO4DSADQgA3A8ANIANB4CZqIgQgA0G4DWoQgxwgA0GgDWoiByAEKQMANwMAIANBqA1qIgggA0HoJmopAwA3AwAgA0GwDWoiBCADQfAmaikDADcDACADQgA3A5gNQdap2gBBGBC5GiE8QcgAEM0gIgVCADcDOCAFQQA6ADQgBSAJNgIwIAVCADcDKCAFID03AyAgBUEYaiAEKQMANwMAIAVBEGogCCkDADcDACAFQQhqIAcpAwA3AwAgBSADKQOYDTcDACAFQUBrQQA6AAAgA0EBNgLkJiADIAU2AuAmIANBATYC3CZBGBDNICIEQgA3AwggBCA8NwMAIANB8iZqQgA3AQAgBEEQakIANwMAIANCADcC7CYgAyAENgLoJiADQQA2AtgmIBAgA0HYJmoQ3xkLIAstACQEQCAPKAIAEIcEIQlB7qnaAEEJELkaIT0gA0Guwd8AQQEQuRo3A+gNIANCADcD8A0gA0HgJmoiBCADQegNahCDHCADQdANaiIHIAQpAwA3AwAgA0HYDWoiCCADQegmaikDADcDACADQeANaiIEIANB8CZqKQMANwMAIANCADcDyA1B96naAEEYELkaITxByAAQzSAiBUIANwM4IAVBADoANCAFIAk2AjAgBUIANwMoIAUgPTcDICAFQRhqIAQpAwA3AwAgBUEQaiAIKQMANwMAIAVBCGogBykDADcDACAFIAMpA8gNNwMAIAVBQGtBADoAACADQQE2AuQmIAMgBTYC4CYgA0EBNgLcJkEYEM0gIgRCADcDCCAEIDw3AwAgA0HyJmpCADcBACAEQRBqQgA3AwAgA0IANwLsJiADIAQ2AugmIANBADYC2CYgECADQdgmahDfGQsgCy0AJQRAIA8oAgAQhwQhCUGPqtoAQR0QuRohPSADQa7B3wBBARC5GjcDmA4gA0IANwOgDiADQeAmaiIEIANBmA5qEIMcIANBgA5qIgcgBCkDADcDACADQYgOaiIIIANB6CZqKQMANwMAIANBkA5qIgQgA0HwJmopAwA3AwAgA0IANwP4DUGsqtoAQSwQuRohPEHIABDNICIFQgA3AzggBUEAOgA0IAUgCTYCMCAFQgA3AyggBSA9NwMgIAVBGGogBCkDADcDACAFQRBqIAgpAwA3AwAgBUEIaiAHKQMANwMAIAUgAykD+A03AwAgBUFAa0EAOgAAIANBATYC5CYgAyAFNgLgJiADQQE2AtwmQRgQzSAiBEIANwMIIAQgPDcDACADQfImakIANwEAIARBEGpCADcDACADQgA3AuwmIAMgBDYC6CYgA0EANgLYJiAQIANB2CZqEN8ZCyALLQAmBEAgDygCABCHBCEJQdiq2gBBEBC5GiE9IANBrsHfAEEBELkaNwPIDiADQgA3A9AOIANB4CZqIgQgA0HIDmoQgxwgA0GwDmoiByAEKQMANwMAIANBuA5qIgggA0HoJmopAwA3AwAgA0HADmoiBCADQfAmaikDADcDACADQgA3A6gOQeiq2gBBHxC5GiE8QcgAEM0gIgVCADcDOCAFQQA6ADQgBSAJNgIwIAVCADcDKCAFID03AyAgBUEYaiAEKQMANwMAIAVBEGogCCkDADcDACAFQQhqIAcpAwA3AwAgBSADKQOoDjcDACAFQUBrQQA6AAAgA0EBNgLkJiADIAU2AuAmIANBATYC3CZBGBDNICIEQgA3AwggBCA8NwMAIANB8iZqQgA3AQAgBEEQakIANwMAIANCADcC7CYgAyAENgLoJiADQQA2AtgmIBAgA0HYJmoQ3xkLIAstACcEQCAPKAIAEIcEIQlBh6vaAEEMELkaIT0gA0Guwd8AQQEQuRo3A/gOIANCADcDgA8gA0HgJmoiBCADQfgOahCDHCADQeAOaiIHIAQpAwA3AwAgA0HoDmoiCCADQegmaikDADcDACADQfAOaiIEIANB8CZqKQMANwMAIANCADcD2A5Bk6vaAEEbELkaITxByAAQzSAiBUIANwM4IAVBADoANCAFIAk2AjAgBUIANwMoIAUgPTcDICAFQRhqIAQpAwA3AwAgBUEQaiAIKQMANwMAIAVBCGogBykDADcDACAFIAMpA9gONwMAIAVBQGtBADoAACADQQE2AuQmIAMgBTYC4CYgA0EBNgLcJkEYEM0gIgRCADcDCCAEIDw3AwAgA0HyJmpCADcBACAEQRBqQgA3AwAgA0IANwLsJiADIAQ2AugmIANBADYC2CYgECADQdgmahDfGQsgCy0AKARAIA8oAgAQhwQhCUGuq9oAQQgQuRohPSADQa7B3wBBARC5GjcDqA8gA0IANwOwDyADQeAmaiIEIANBqA9qEIMcIANBkA9qIgcgBCkDADcDACADQZgPaiIIIANB6CZqKQMANwMAIANBoA9qIgQgA0HwJmopAwA3AwAgA0IANwOID0G2q9oAQRcQuRohPEHIABDNICIFQgA3AzggBUEAOgA0IAUgCTYCMCAFQgA3AyggBSA9NwMgIAVBGGogBCkDADcDACAFQRBqIAgpAwA3AwAgBUEIaiAHKQMANwMAIAUgAykDiA83AwAgBUFAa0EAOgAAIANBATYC5CYgAyAFNgLgJiADQQE2AtwmQRgQzSAiBEIANwMIIAQgPDcDACADQfImakIANwEAIARBEGpCADcDACADQgA3AuwmIAMgBDYC6CYgA0EANgLYJiAQIANB2CZqEN8ZCyALLQApBEAgDygCABCHBCEJQc2r2gBBBBC5GiE9IANBrsHfAEEBELkaNwPYDyADQgA3A+APIANB4CZqIgQgA0HYD2oQgxwgA0HAD2oiByAEKQMANwMAIANByA9qIgggA0HoJmopAwA3AwAgA0HQD2oiBCADQfAmaikDADcDACADQgA3A7gPQdGr2gBBExC5GiE8QcgAEM0gIgVCADcDOCAFQQA6ADQgBSAJNgIwIAVCADcDKCAFID03AyAgBUEYaiAEKQMANwMAIAVBEGogCCkDADcDACAFQQhqIAcpAwA3AwAgBSADKQO4DzcDACAFQUBrQQA6AAAgA0EBNgLkJiADIAU2AuAmIANBATYC3CZBGBDNICIEQgA3AwggBCA8NwMAIANB8iZqQgA3AQAgBEEQakIANwMAIANCADcC7CYgAyAENgLoJiADQQA2AtgmIBAgA0HYJmoQ3xkLIAstACoEQCAPKAIAEIcEIQlB5KvaAEERELkaIT0gA0Guwd8AQQEQuRo3A4gQIANCADcDkBAgA0HgJmoiBCADQYgQahCDHCADQfAPaiIHIAQpAwA3AwAgA0H4D2oiCCADQegmaikDADcDACADQYAQaiIEIANB8CZqKQMANwMAIANCADcD6A9B9avaAEEgELkaITxByAAQzSAiBUIANwM4IAVBADoANCAFIAk2AjAgBUIANwMoIAUgPTcDICAFQRhqIAQpAwA3AwAgBUEQaiAIKQMANwMAIAVBCGogBykDADcDACAFIAMpA+gPNwMAIAVBQGtBADoAACADQQE2AuQmIAMgBTYC4CYgA0EBNgLcJkEYEM0gIgRCADcDCCAEIDw3AwAgA0HyJmpCADcBACAEQRBqQgA3AwAgA0IANwLsJiADIAQ2AugmIANBADYC2CYgECADQdgmahDfGQsgCy0AKwRAIA8oAgAQhwQhCUGVrNoAQQkQuRohPSADQa7B3wBBARC5GjcDuBAgA0IANwPAECADQeAmaiIEIANBuBBqEIMcIANBoBBqIgcgBCkDADcDACADQagQaiIIIANB6CZqKQMANwMAIANBsBBqIgQgA0HwJmopAwA3AwAgA0IANwOYEEGerNoAQRgQuRohPEHIABDNICIFQgA3AzggBUEAOgA0IAUgCTYCMCAFQgA3AyggBSA9NwMgIAVBGGogBCkDADcDACAFQRBqIAgpAwA3AwAgBUEIaiAHKQMANwMAIAUgAykDmBA3AwAgBUFAa0EAOgAAIANBATYC5CYgAyAFNgLgJiADQQE2AtwmQRgQzSAiBEIANwMIIAQgPDcDACADQfImakIANwEAIARBEGpCADcDACADQgA3AuwmIAMgBDYC6CYgA0EANgLYJiAQIANB2CZqEN8ZCyALLQAsBEAgDygCABCHBCEJQbas2gBBDxC5GiE9IANBrsHfAEEBELkaNwPoECADQgA3A/AQIANB4CZqIgQgA0HoEGoQgxwgA0HQEGoiByAEKQMANwMAIANB2BBqIgggA0HoJmopAwA3AwAgA0HgEGoiBCADQfAmaikDADcDACADQgA3A8gQQcWs2gBBHhC5GiE8QcgAEM0gIgVCADcDOCAFQQA6ADQgBSAJNgIwIAVCADcDKCAFID03AyAgBUEYaiAEKQMANwMAIAVBEGogCCkDADcDACAFQQhqIAcpAwA3AwAgBSADKQPIEDcDACAFQUBrQQA6AAAgA0EBNgLkJiADIAU2AuAmIANBATYC3CZBGBDNICIEQgA3AwggBCA8NwMAIANB8iZqQgA3AQAgBEEQakIANwMAIANCADcC7CYgAyAENgLoJiADQQA2AtgmIBAgA0HYJmoQ3xkLIAstAC0EQCAPKAIAEIcEIQlB46zaAEEcELkaIT0gA0Guwd8AQQEQuRo3A5gRIANCADcDoBEgA0HgJmoiBCADQZgRahCDHCADQYARaiIHIAQpAwA3AwAgA0GIEWoiCCADQegmaikDADcDACADQZARaiIEIANB8CZqKQMANwMAIANCADcD+BBB/6zaAEErELkaITxByAAQzSAiBUIANwM4IAVBADoANCAFIAk2AjAgBUIANwMoIAUgPTcDICAFQRhqIAQpAwA3AwAgBUEQaiAIKQMANwMAIAVBCGogBykDADcDACAFIAMpA/gQNwMAIAVBQGtBADoAACADQQE2AuQmIAMgBTYC4CYgA0EBNgLcJkEYEM0gIgRCADcDCCAEIDw3AwAgA0HyJmpCADcBACAEQRBqQgA3AwAgA0IANwLsJiADIAQ2AugmIANBADYC2CYgECADQdgmahDfGQsgCy0ALgRAIA8oAgAQhwQhCUGqrdoAQRsQuRohPSADQa7B3wBBARC5GjcDyBEgA0IANwPQESADQeAmaiIEIANByBFqEIMcIANBsBFqIgcgBCkDADcDACADQbgRaiIIIANB6CZqKQMANwMAIANBwBFqIgQgA0HwJmopAwA3AwAgA0IANwOoEUHFrdoAQSoQuRohPEHIABDNICIFQgA3AzggBUEAOgA0IAUgCTYCMCAFQgA3AyggBSA9NwMgIAVBGGogBCkDADcDACAFQRBqIAgpAwA3AwAgBUEIaiAHKQMANwMAIAUgAykDqBE3AwAgBUFAa0EAOgAAIANBATYC5CYgAyAFNgLgJiADQQE2AtwmQRgQzSAiBEIANwMIIAQgPDcDACADQfImakIANwEAIARBEGpCADcDACADQgA3AuwmIAMgBDYC6CYgA0EANgLYJiAQIANB2CZqEN8ZCyALLQAvBEAgDygCABCHBCEJQe+t2gBBCxC5GiE9IANBrsHfAEEBELkaNwP4ESADQgA3A4ASIANB4CZqIgQgA0H4EWoQgxwgA0HgEWoiByAEKQMANwMAIANB6BFqIgggA0HoJmopAwA3AwAgA0HwEWoiBCADQfAmaikDADcDACADQgA3A9gRQfqt2gBBGhC5GiE8QcgAEM0gIgVCADcDOCAFQQA6ADQgBSAJNgIwIAVCADcDKCAFID03AyAgBUEYaiAEKQMANwMAIAVBEGogCCkDADcDACAFQQhqIAcpAwA3AwAgBSADKQPYETcDACAFQUBrQQA6AAAgA0EBNgLkJiADIAU2AuAmIANBATYC3CZBGBDNICIEQgA3AwggBCA8NwMAIANB8iZqQgA3AQAgBEEQakIANwMAIANCADcC7CYgAyAENgLoJiADQQA2AtgmIBAgA0HYJmoQ3xkLIAstADAEQCAPKAIAEIcEIQlBlK7aAEEYELkaIT0gA0Guwd8AQQEQuRo3A6gSIANCADcDsBIgA0HgJmoiBCADQagSahCDHCADQZASaiIHIAQpAwA3AwAgA0GYEmoiCCADQegmaikDADcDACADQaASaiIEIANB8CZqKQMANwMAIANCADcDiBJBrK7aAEEnELkaITxByAAQzSAiBUIANwM4IAVBADoANCAFIAk2AjAgBUIANwMoIAUgPTcDICAFQRhqIAQpAwA3AwAgBUEQaiAIKQMANwMAIAVBCGogBykDADcDACAFIAMpA4gSNwMAIAVBQGtBADoAACADQQE2AuQmIAMgBTYC4CYgA0EBNgLcJkEYEM0gIgRCADcDCCAEIDw3AwAgA0HyJmpCADcBACAEQRBqQgA3AwAgA0IANwLsJiADIAQ2AugmIANBADYC2CYgECADQdgmahDfGQsgCy0AMQRAIA8oAgAQhwQhCUHTrtoAQRkQuRohPSADQa7B3wBBARC5GjcD2BIgA0IANwPgEiADQeAmaiIEIANB2BJqEIMcIANBwBJqIgcgBCkDADcDACADQcgSaiIIIANB6CZqKQMANwMAIANB0BJqIgQgA0HwJmopAwA3AwAgA0IANwO4EkHsrtoAQSgQuRohPEHIABDNICIFQgA3AzggBUEAOgA0IAUgCTYCMCAFQgA3AyggBSA9NwMgIAVBGGogBCkDADcDACAFQRBqIAgpAwA3AwAgBUEIaiAHKQMANwMAIAUgAykDuBI3AwAgBUFAa0EAOgAAIANBATYC5CYgAyAFNgLgJiADQQE2AtwmQRgQzSAiBEIANwMIIAQgPDcDACADQfImakIANwEAIARBEGpCADcDACADQgA3AuwmIAMgBDYC6CYgA0EANgLYJiAQIANB2CZqEN8ZCyALLQAyBEAgDygCABCHBCEJQZSv2gBBExC5GiE9IANBrsHfAEEBELkaNwOIEyADQgA3A5ATIANB4CZqIgQgA0GIE2oQgxwgA0HwEmoiByAEKQMANwMAIANB+BJqIgggA0HoJmopAwA3AwAgA0GAE2oiBCADQfAmaikDADcDACADQgA3A+gSQaev2gBBIhC5GiE8QcgAEM0gIgVCADcDOCAFQQA6ADQgBSAJNgIwIAVCADcDKCAFID03AyAgBUEYaiAEKQMANwMAIAVBEGogCCkDADcDACAFQQhqIAcpAwA3AwAgBSADKQPoEjcDACAFQUBrQQA6AAAgA0EBNgLkJiADIAU2AuAmIANBATYC3CZBGBDNICIEQgA3AwggBCA8NwMAIANB8iZqQgA3AQAgBEEQakIANwMAIANCADcC7CYgAyAENgLoJiADQQA2AtgmIBAgA0HYJmoQ3xkLIAstADMEQCAPKAIAEIcEIQlBya/aAEESELkaIT0gA0Guwd8AQQEQuRo3A7gTIANCADcDwBMgA0HgJmoiBCADQbgTahCDHCADQaATaiIHIAQpAwA3AwAgA0GoE2oiCCADQegmaikDADcDACADQbATaiIEIANB8CZqKQMANwMAIANCADcDmBNB26/aAEEhELkaITxByAAQzSAiBUIANwM4IAVBADoANCAFIAk2AjAgBUIANwMoIAUgPTcDICAFQRhqIAQpAwA3AwAgBUEQaiAIKQMANwMAIAVBCGogBykDADcDACAFIAMpA5gTNwMAIAVBQGtBADoAACADQQE2AuQmIAMgBTYC4CYgA0EBNgLcJkEYEM0gIgRCADcDCCAEIDw3AwAgA0HyJmpCADcBACAEQRBqQgA3AwAgA0IANwLsJiADIAQ2AugmIANBADYC2CYgECADQdgmahDfGQsgCy0ANARAIA8oAgAQhwQhCUH8r9oAQRgQuRohPSADQa7B3wBBARC5GjcD6BMgA0IANwPwEyADQeAmaiIEIANB6BNqEIMcIANB0BNqIgcgBCkDADcDACADQdgTaiIIIANB6CZqKQMANwMAIANB4BNqIgQgA0HwJmopAwA3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ADcD8BYgA0HgJmoiBCADQegWahCDHCADQdAWaiIHIAQpAwA3AwAgA0HYFmoiCCADQegmaikDADcDACADQeAWaiIEIANB8CZqKQMANwMAIANCADcDyBZBurPaAEEjELkaITxByAAQzSAiBUIANwM4IAVBADoANCAFIAk2AjAgBUIANwMoIAUgPTcDICAFQRhqIAQpAwA3AwAgBUEQaiAIKQMANwMAIAVBCGogBykDADcDACAFIAMpA8gWNwMAIAVBQGtBADoAACADQQE2AuQmIAMgBTYC4CYgA0EBNgLcJkEYEM0gIgRCADcDCCAEIDw3AwAgA0HyJmpCADcBACAEQRBqQgA3AwAgA0IANwLsJiADIAQ2AugmIANBADYC2CYgECADQdgmahDfGQsgCy0APQRAIA8oAgAQhwQhCUHds9oAQRoQuRohPSADQa7B3wBBARC5GjcDmBcgA0IANwOgFyADQeAmaiIEIANBmBdqEIMcIANBgBdqIgcgBCkDADcDACADQYgXaiIIIANB6CZqKQMANwMAIANBkBdqIgQgA0HwJmopAwA3AwAgA0IANwP4FkH3s9oAQSkQuRohPEHIABDNICIFQgA3AzggBUEAOgA0IAUgCTYCMCAFQgA3AyggBSA9NwMgIAVBGGogBCkDADcDACAFQRBqIAgpAwA3AwAgBUEIaiAHKQMANwMAIAUgAykD+BY3AwAgBUFAa0EAOgAAIANBATYC5CYgAyAFNgLgJiADQQE2AtwmQRgQzSAiBEIANwMIIAQgPDcDACADQfImakIANwEAIARBEGpCADcDACADQgA3AuwmIAMgBDYC6CYgA0EANgLYJiAQIANB2CZqEN8ZCyALLQA+BEAgDygCABCHBCEJQaC02gBBIBC5GiE9IANBrsHfAEEBELkaNwPIFyADQgA3A9AXIANB4CZqIgQgA0HIF2oQgxwgA0GwF2oiByAEKQMANwMAIANBuBdqIgggA0HoJmopAwA3AwAgA0HAF2oiBCADQfAmaikDADcDACADQgA3A6gXQcC02gBBLxC5GiE8QcgAEM0gIgVCADcDOCAFQQA6ADQgBSAJNgIwIAVCADcDKCAFID03AyAgBUEYaiAEKQMANwMAIAVBEGogCCkDADcDACAFQQhqIAcpAwA3AwAgBSADKQOoFzcDACAFQUBrQQA6AAAgA0EBNgLkJiADIAU2AuAmIANBATYC3CZBGBDNICIEQgA3AwggBCA8NwMAIANB8iZqQgA3AQAgBEEQakIANwMAIANCADcC7CYgAyAENgLoJiADQQA2AtgmIBAgA0HYJmoQ3xkLIAstAD8EQCAPKAIAEIcEIQlB77TaAEEcELkaIT0gA0Guwd8AQQEQuRo3A/gXIANCADcDgBggA0HgJmoiBCADQfgXahCDHCADQeAXaiIHIAQpAwA3AwAgA0HoF2oiCCADQegmaikDADcDACADQfAXaiIEIANB8CZqKQMANwMAIANCADcD2BdBi7XaAEErELkaITxByAAQzSAiBUIANwM4IAVBADoANCAFIAk2AjAgBUIANwMoIAUgPTcDICAFQRhqIAQpAwA3AwAgBUEQaiAIKQMANwMAIAVBCGogBykDADcDACAFIAMpA9gXNwMAIAVBQGtBADoAACADQQE2AuQmIAMgBTYC4CYgA0EBNgLcJkEYEM0gIgRCADcDCCAEIDw3AwAgA0HyJmpCADcBACAEQRBqQgA3AwAgA0IANwLsJiADIAQ2AugmIANBADYC2CYgECADQdgmahDfGQsgCy0AQARAIA8oAgAQhwQhCUG2tdoAQRAQuRohPSADQa7B3wBBARC5GjcDqBggA0IANwOwGCADQeAmaiIEIANBqBhqEIMcIANBkBhqIgcgBCkDADcDACADQZgYaiIIIANB6CZqKQMANwMAIANBoBhqIgQgA0HwJmopAwA3AwAgA0IANwOIGEHGtdoAQR8QuRohPEHIABDNICIFQgA3AzggBUEAOgA0IAUgCTYCMCAFQgA3AyggBSA9NwMgIAVBGGogBCkDADcDACAFQRBqIAgpAwA3AwAgBUEIaiAHKQMANwMAIAUgAykDiBg3AwAgBUFAa0EAOgAAIANBATYC5CYgAyAFNgLgJiADQQE2AtwmQRgQzSAiBEIANwMIIAQgPDcDACADQfImakIANwEAIARBEGpCADcDACADQgA3AuwmIAMgBDYC6CYgA0EANgLYJiAQIANB2CZqEN8ZCyALLQBBBEAgDygCABCHBCEJQeW12gBBBBC5GiE9IANBrsHfAEEBELkaNwPYGCADQgA3A+AYIANB4CZqIgQgA0HYGGoQgxwgA0HAGGoiByAEKQMANwMAIANByBhqIgggA0HoJmopAwA3AwAgA0HQGGoiBCADQfAmaikDADcDACADQgA3A7gYQem12gBBExC5GiE8QcgAEM0gIgVCADcDOCAFQQA6ADQgBSAJNgIwIAVCADcDKCAFID03AyAgBUEYaiAEKQMANwMAIAVBEGogCCkDADcDACAFQQhqIAcpAwA3AwAgBSADKQO4GDcDACAFQUBrQQA6AAAgA0EBNgLkJiADIAU2AuAmIANBATYC3CZBGBDNICIEQgA3AwggBCA8NwMAIANB8iZqQgA3AQAgBEEQakIANwMAIANCADcC7CYgAyAENgLoJiADQQA2AtgmIBAgA0HYJmoQ3xkLIAstAEIEQCAPKAIAEIcEIQlB/LXaAEERELkaIT0gA0Guwd8AQQEQuRo3A4gZIANCADcDkBkgA0HgJmoiBCADQYgZahCDHCADQfAYaiIHIAQpAwA3AwAgA0H4GGoiCCADQegmaikDADcDACADQYAZaiIEIANB8CZqKQMANwMAIANCADcD6BhBjbbaAEEgELkaITxByAAQzSAiBUIANwM4IAVBADoANCAFIAk2AjAgBUIANwMoIAUgPTcDICAFQRhqIAQpAwA3AwAgBUEQaiAIKQMANwMAIAVBCGogBykDADcDACAFIAMpA+gYNwMAIAVBQGtBADoAACADQQE2AuQmIAMgBTYC4CYgA0EBNgLcJkEYEM0gIgRCADcDCCAEIDw3AwAgA0HyJmpCADcBACAEQRBqQgA3AwAgA0IANwLsJiADIAQ2AugmIANBADYC2CYgECADQdgmahDfGQsgCy0AQwRAIA8oAgAQhwQhCUGtttoAQRoQuRohPSADQa7B3wBBARC5GjcDuBkgA0IANwPAGSADQeAmaiIEIANBuBlqEIMcIANBoBlqIgcgBCkDADcDACADQagZaiIIIANB6CZqKQMANwMAIANBsBlqIgQgA0HwJmopAwA3AwAgA0IANwOYGUHHttoAQSkQuRohPEHIABDNICIFQgA3AzggBUEAOgA0IAUgCTYCMCAFQgA3AyggBSA9NwMgIAVBGGogBCkDADcDACAFQRBqIAgpAwA3AwAgBUEIaiAHKQMANwMAIAUgAykDmBk3AwAgBUFAa0EAOgAAIANBATYC5CYgAyAFNgLgJiADQQE2AtwmQRgQzSAiBEIANwMIIAQgPDcDACADQfImakIANwEAIARBEGpCADcDACADQgA3Auwm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ARC5GjcD2BsgA0IANwPgGyADQeAmaiIEIANB2BtqEIMcIANBwBtqIgcgBCkDADcDACADQcgbaiIIIANB6CZqKQMANwMAIANB0BtqIgQgA0HwJmopAwA3AwAgA0IANwO4G0GZudoAQRUQuRohPEHIABDNICIFQgA3AzggBUEAOgA0IAUgCTYCMCAFQgA3AyggBSA9NwMgIAVBGGogBCkDADcDACAFQRBqIAgpAwA3AwAgBUEIaiAHKQMANwMAIAUgAykDuBs3AwAgBUFAa0EAOgAAIANBATYC5CYgAyAFNgLgJiADQQE2AtwmQRgQzSAiBEIANwMIIAQgPDcDACADQfImakIANwEAIARBEGpCADcDACADQgA3AuwmIAMgBDYC6CYgA0EANgLYJiAQIANB2CZqEN8ZCyALLQBKBEAgDygCABCHBCEJQa652gBBCRC5GiE9IANBrsHfAEEBELkaNwOIHCADQgA3A5AcIANB4CZqIgQgA0GIHGoQgxwgA0HwG2oiByAEKQMANwMAIANB+BtqIgggA0HoJmopAwA3AwAgA0GAHGoiBCADQfAmaikDADcDACADQgA3A+gbQbe52gBBGBC5GiE8QcgAEM0gIgVCADcDOCAFQQA6ADQgBSAJNgIwIAVCADcDKCAFID03AyAgBUEYaiAEKQMANwMAIAVBEGogCCkDADcDACAFQQhqIAcpAwA3AwAgBSADKQPoGzcDACAFQUBrQQA6AAAgA0EBNgLkJiADIAU2AuAmIANBATYC3CZBGBDNICIEQgA3AwggBCA8NwMAIANB8iZqQgA3AQAgBEEQakIANwMAIANCADcC7CYgAyAENgLoJiADQQA2AtgmIBAgA0HYJmoQ3xkLIAstAEsEQCAPKAIAEIcEIQlBz7naAEEUELkaIT0gA0Guwd8AQQEQuRo3A7gcIANCADcDwBwgA0HgJmoiBCADQbgcahCDHCADQaAcaiIHIAQpAwA3AwAgA0GoHGoiCCADQegmaikDADcDACADQbAcaiIEIANB8CZqKQMANwMAIANCADcDmBxB47naAEEjELkaITxByAAQzSAiBUIANwM4IAVBADoANCAFIAk2AjAgBUIANwMoIAUgPTcDICAFQRhqIAQpAwA3AwAgBUEQaiAIKQMANwMAIAVBCGogBykDADcDACAFIAMpA5gcNwMAIAVBQGtBADoAACADQQE2AuQmIAMgBTYC4CYgA0EBNgLcJkEYEM0gIgRCADcDCCAEIDw3AwAgA0HyJmpCADcBACAEQRBqQgA3AwAgA0IANwLsJiADIAQ2AugmIANBADYC2CYgECADQdgmahDfGQsgCy0ATARAIA8oAgAQhwQhCUGGutoAQQ0QuRohPSADQa7B3wBBARC5GjcD6BwgA0IANwPwHCADQeAmaiIEIANB6BxqEIMcIANB0BxqIgcgBCkDADcDACADQdgcaiIIIANB6CZqKQMANwMAIANB4BxqIgQgA0HwJmopAwA3AwAgA0IANwPIHEGTutoAQRwQuRohPEHIABDNICIFQgA3AzggBUEAOgA0IAUgCTYCMCAFQgA3AyggBSA9NwMgIAVBGGogBCkDADcDACAFQRBqIAgpAwA3AwAgBUEIaiAHKQMANwMAIAUgAykDyBw3AwAgBUFAa0EAOgAAIANBATYC5CYgAyAFNgLgJiADQQE2AtwmQRgQzSAiBEIANwMIIAQgPDcDACADQfImakIANwEAIARBEGpCADcDACADQgA3AuwmIAMgBDYC6CYgA0EANgLYJiAQIANB2CZqEN8ZCyALLQBNBEAgDygCABCHBCEJQa+62gBBEBC5GiE9IANBrsHfAEEBELkaNwOYHSADQgA3A6AdIANB4CZqIgQgA0GYHWoQgxwgA0GAHWoiByAEKQMANwMAIANBiB1qIgggA0HoJmopAwA3AwAgA0GQHWoiBCADQfAmaikDADcDACADQgA3A/gcQb+62gBBHxC5GiE8QcgAEM0gIgVCADcDOCAFQQA6ADQgBSAJNgIwIAVCADcDKCAFID03AyAgBUEYaiAEKQMANwMAIAVBEGogCCkDADcDACAFQQhqIAcpAwA3AwAgBSADKQP4HDcDACAFQUBrQQA6AAAgA0EBNgLkJiADIAU2AuAmIANBATYC3CZBGBDNICIEQgA3AwggBCA8NwMAIANB8iZqQgA3AQAgBEEQakIANwMAIANCADcC7CYgAyAENgLoJiADQQA2AtgmIBAgA0HYJmoQ3xkLIAstAE4EQCAPKAIAEIcEIQlB3rraAEEHELkaIT0gA0Guwd8AQQEQuRo3A8gdIANCADcD0B0gA0HgJmoiBCADQcgdahCDHCADQbAdaiIHIAQpAwA3AwAgA0G4HWoiCCADQegmaikDADcDACADQcAdaiIEIANB8CZqKQMANwMAIANCADcDqB1B5braAEEWELkaITxByAAQzSAiBUIANwM4IAVBADoANCAFIAk2AjAgBUIANwMoIAUgPTcDICAFQRhqIAQpAwA3AwAgBUEQaiAIKQMANwMAIAVBCGogBykDADcDACAFIAMpA6gdNwMAIAVBQGtBADoAACADQQE2AuQmIAMgBTYC4CYgA0EBNgLcJkEYEM0gIgRCADcDCCAEIDw3AwAgA0HyJmpCADcBACAEQRBqQgA3AwAgA0IANwLsJiADIAQ2AugmIANBADYC2CYgECADQdgmahDfGQsgCy0ATwRAIA8oAgAQhwQhCUH7utoAQQgQuRohPSADQa7B3wBBARC5GjcD+B0gA0IANwOAHiADQeAmaiIEIANB+B1qEIMcIANB4B1qIgcgBCkDADcDACADQegdaiIIIANB6CZqKQMANwMAIANB8B1qIgQgA0HwJmopAwA3AwAgA0IANwPYHUGDu9oAQRcQuRohPEHIABDNICIFQgA3AzggBUEAOgA0IAUgCTYCMCAFQgA3AyggBSA9NwMgIAVBGGogBCkDADcDACAFQRBqIAgpAwA3AwAgBUEIaiAHKQMANwMAIAUgAykD2B03AwAgBUFAa0EAOgAAIANBATYC5CYgAyAFNgLgJiADQQE2AtwmQRgQzSAiBEIANwMIIAQgPDcDACADQfImakIANwEAIARBEGpCADcDACADQgA3AuwmIAMgBDYC6CYgA0EANgLYJiAQIANB2CZqEN8ZCyALLQBQBEAgDygCABCHBCEJQZq72gBBHhC5GiE9IANBrsHfAEEBELkaNwOoHiADQgA3A7AeIANB4CZqIgQgA0GoHmoQgxwgA0GQHmoiByAEKQMANwMAIANBmB5qIgggA0HoJmopAwA3AwAgA0GgHmoiBCADQfAmaikDADcDACADQgA3A4geQbi72gBBLRC5GiE8QcgAEM0gIgVCADcDOCAFQQA6ADQgBSAJNgIwIAVCADcDKCAFID03AyAgBUEYaiAEKQMANwMAIAVBEGogCCkDADcDACAFQQhqIAcpAwA3AwAgBSADKQOIHjcDACAFQUBrQQA6AAAgA0EBNgLkJiADIAU2AuAmIANBATYC3CZBGBDNICIEQgA3AwggBCA8NwMAIANB8iZqQgA3AQAgBEEQakIANwMAIANCADcC7CYgAyAENgLoJiADQQA2AtgmIBAgA0HYJmoQ3xkLIAstAFEEQCAPKAIAEIcEIQlB5bvaAEEVELkaIT0gA0Guwd8AQQEQuRo3A9geIANCADcD4B4gA0HgJmoiBCADQdgeahCDHCADQcAeaiIHIAQpAwA3AwAgA0HIHmoiCCADQegmaikDADcDACADQdAeaiIEIANB8CZqKQMANwMAIANCADcDuB5B+rvaAEEkELkaITxByAAQzSAiBUIANwM4IAVBADoANCAFIAk2AjAgBUIANwMoIAUgPTcDICAFQRhqIAQpAwA3AwAgBUEQaiAIKQMANwMAIAVBCGogBykDADcDACAFIAMpA7geNwMAIAVBQGtBADoAACADQQE2AuQmIAMgBTYC4CYgA0EBNgLcJkEYEM0gIgRCADcDCCAEIDw3AwAgA0HyJmpCADcBACAEQRBqQgA3AwAgA0IANwLsJiADIAQ2AugmIANBADYC2CYgECADQdgmahDfGQsgCy0AUgRAIA8oAgAQhwQhCUGevNoAQRIQuRohPSADQa7B3wBBARC5GjcDiB8gA0IANwOQHyADQeAmaiIEIANBiB9qEIMcIANB8B5qIgcgBCkDADcDACADQfgeaiIIIANB6CZqKQMANwMAIANBgB9qIgQgA0HwJmopAwA3AwAgA0IANwPoHkGwvNoAQSEQuRohPEHIABDNICIFQgA3AzggBUEAOgA0IAUgCTYCMCAFQgA3AyggBSA9NwMgIAVBGGogBCkDADcDACAFQRBqIAgpAwA3AwAgBUEIaiAHKQMANwMAIAUgAykD6B43AwAgBUFAa0EAOgAAIANBATYC5CYgAyAFNgLgJiADQQE2AtwmQRgQzSAiBEIANwMIIAQgPDcDACADQfImakIANwEAIARBEGpCADcDACADQgA3AuwmIAMgBDYC6CYgA0EANgLYJiAQIANB2CZqEN8ZCyALLQBTBEAgDygCABCHBCEJQdG82gBBERC5GiE9IANBrsHfAEEBELkaNwO4HyADQgA3A8AfIANB4CZqIgQgA0G4H2oQgxwgA0GgH2oiByAEKQMANwMAIANBqB9qIgggA0HoJmopAwA3AwAgA0GwH2oiBCADQfAmaikDADcDACADQgA3A5gfQeK82gBBIBC5GiE8QcgAEM0gIgVCADcDOCAFQQA6ADQgBSAJNgIwIAVCADcDKCAFID03AyAgBUEYaiAEKQMANwMAIAVBEGogCCkDADcDACAFQQhqIAcpAwA3AwAgBSADKQOYHzcDACAFQUBrQQA6AAAgA0EBNgLkJiADIAU2AuAmIANBATYC3CZBGBDNICIEQgA3AwggBCA8NwMAIANB8iZqQgA3AQAgBEEQakIANwMAIANCADcC7CYgAyAENgLoJiADQQA2AtgmIBAgA0HYJmoQ3xkLIAstAFQEQCAPKAIAEIcEIQlBgr3aAEEgELkaIT0gA0Guwd8AQQEQuRo3A+gfIANCADcD8B8gA0HgJmoiBCADQegfahCDHCADQdAfaiIHIAQpAwA3AwAgA0HYH2oiCCADQegmaikDADcDACADQeAfaiIEIANB8CZqKQMANwMAIANCADcDyB9Bor3aAEEvELkaITxByAAQzSAiBUIANwM4IAVBADoANCAFIAk2AjAgBUIANwMoIAUgPTcDICAFQRhqIAQpAwA3AwAgBUEQaiAIKQMANwMAIAVBCGogBykDADcDACAFIAMpA8gfNwMAIAVBQGtBADoAACADQQE2AuQmIAMgBTYC4CYgA0EBNgLcJkEYEM0gIgRCADcDCCAEIDw3AwAgA0HyJmpCADcBACAEQRBqQgA3AwAgA0IANwLsJiADIAQ2AugmIANBADYC2CYgECADQdgmahDfGQsgCy0AVQRAIA8oAgAQhwQhCUHRvdoAQScQuRohPSADQa7B3wBBARC5GjcDmCAgA0IANwOgICADQeAmaiIEIANBmCBqEIMcIANBgCBqIgcgBCkDADcDACADQYggaiIIIANB6CZqKQMANwMAIANBkCBqIgQgA0HwJmopAwA3AwAgA0IANwP4H0H4vdoAQTYQuRohPEHIABDNICIFQgA3AzggBUEAOgA0IAUgCTYCMCAFQgA3AyggBSA9NwMgIAVBGGogBCkDADcDACAFQRBqIAgpAwA3AwAgBUEIaiAHKQMANwMAIAUgAykD+B83AwAgBUFAa0EAOgAAIANBATYC5CYgAyAFNgLgJiADQQE2AtwmQRgQzSAiBEIANwMIIAQgPDcDACADQfImakIANwEAIARBEGpCADcDACADQgA3AuwmIAMgBDYC6CYgA0EANgLYJiAQIANB2CZqEN8ZCyALLQBWBEAgDygCABCHBCEJQa6+2gBBIBC5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NgLYJiAQIANB2CZqEN8ZCyALLQBcBEAgDygCABCHBCEIQb7B2gBBDRC5GiE9IANBrsHfAEEBELkaNwPoIiADQgA3A/AiIANB0CJqIgQgA0HoImoQgxwgA0IANwPIIkHLwdoAQRwQuRohPEHIABDNICIHQgA3AzggB0EAOgA0IAcgCDYCMCAHQgA3AyggByA9NwMgIAdBGGogA0HgImopAwA3AwAgB0EQaiADQdgiaikDADcDACAHQQhqIAQpAwA3AwAgByADKQPIIjcDACAHQUBrQQA6AAAgA0EBNgLkJiADIAc2AuAmIANBATYC3CZBGBDNICIEQgA3AwggBCA8NwMAIANB8iZqQgA3AQAgBEEQakIANwMAIANCADcC7CYgAyAENgLoJiADQQA2AtgmIBAgA0HYJmoQ3xkLIAstAF0EQCAPKAIAEIcEIQhB58HaAEEMELkaIT0gA0Guwd8AQQEQuRo3A5gjIANCADcDoCMgA0GAI2oiBCADQZgjahCDHCADQgA3A/giQfPB2gBBGxC5GiE8QcgAEM0gIgdCADcDOCAHQQA6ADQgByAINgIwIAdCADcDKCAHID03AyAgB0EYaiADQZAjaikDADcDACAHQRBqIANBiCNqKQMANwMAIAdBCGogBCkDADcDACAHIAMpA/giNwMAIAdBQGtBADoAACADQQE2AuQmIAMgBzYC4CYgA0EBNgLcJkEYEM0gIgRCADcDCCAEIDw3AwAgA0HyJmpCADcBACAEQRBqQgA3AwAgA0IANwLsJiADIAQ2AugmIANBADYC2CYgECADQdgmahDfGQsgCy0AXgRAIA8oAgAQhwQhCEGOwtoAQQkQuRohPSADQa7B3wBBARC5GjcDyCMgA0IANwPQIyADQbAjaiIEIANByCNqEIMcIANCADcDqCNBl8LaAEEYELkaITxByAAQzSAiB0IANwM4IAdBADoANCAHIAg2AjAgB0IANwMoIAcgPTcDICAHQRhqIANBwCNqKQMANwMAIAdBEGogA0G4I2opAwA3AwAgB0EIaiAEKQMANwMAIAcgAykDqCM3AwAgB0FAa0EAOgAAIANBATYC5CYgAyAHNgLgJiADQQE2AtwmQRgQzSAiBEIANwMIIAQgPDcDACADQfImakIANwEAIARBEGpCADcDACADQgA3AuwmIAMgBDYC6CYgA0EANgLYJiAQIANB2CZqEN8ZCyALLQBfBEAgDygCABCHBCEIQa/C2gBBChC5GiE9IANBrsHfAEEBELkaNwP4IyADQgA3A4AkIANB4CNqIgQgA0H4I2oQgxwgA0IANwPYI0G5wtoAQRkQuRohPEHIABDNICIHQgA3AzggB0EAOgA0IAcgCDYCMCAHQgA3AyggByA9NwMgIAdBGGogA0HwI2opAwA3AwAgB0EQaiADQegjaikDADcDACAHQQhqIAQpAwA3AwAgByADKQPYIzcDACAHQUBrQQA6AAAgA0EBNgLkJiADIAc2AuAmIANBATYC3CZBGBDNICIEQgA3AwggBCA8NwMAIANB8iZqQgA3AQAgBEEQakIANwMAIANCADcC7CYgAyAENgLoJiADQQA2AtgmIBAgA0HYJmoQ3xkLIAstAGAEQCAPKAIAEIcEIQhB0sLaAEEbELkaIT0gA0Guwd8AQQEQuRo3A6gkIANCADcDsCQgA0GQJGoiBCADQagkahCDHCADQgA3A4gkQe3C2gBBKhC5GiE8QcgAEM0gIgdCADcDOCAHQQA6ADQgByAINgIwIAdCADcDKCAHID03AyAgB0EYaiADQaAkaikDADcDACAHQRBqIANBmCRqKQMANwMAIAdBCGogBCkDADcDACAHIAMpA4gkNwMAIAdBQGtBADoAACADQQE2AuQmIAMgBzYC4CYgA0EBNgLcJkEYEM0gIgRCADcDCCAEIDw3AwAgA0HyJmpCADcBACAEQRBqQgA3AwAgA0IANwLsJiADIAQ2AugmIANBADYC2CYgECADQdgmahDfGQsgCy0AYQRAIA8oAgAQhwQhCEGXw9oAQRUQuRohPSADQa7B3wBBARC5GjcD2CQgA0IANwPgJCADQcAkaiIEIANB2CRqEIMcIANCADcDuCRBrMPaAEEkELkaITxByAAQzSAiB0IANwM4IAdBADoANCAHIAg2AjAgB0IANwMoIAcgPTcDICAHQRhqIANB0CRqKQMANwMAIAdBEGogA0HIJGopAwA3AwAgB0EIaiAEKQMANwMAIAcgAykDuCQ3AwAgB0FAa0EAOgAAIANBATYC5CYgAyAHNgLgJiADQQE2AtwmQRgQzSAiBEIANwMIIAQgPDcDACADQfImakIANwEAIARBEGpCADcDACADQgA3AuwmIAMgBDYC6CYgA0EANgLYJiAQIANB2CZqEN8ZCyALLQBiBEAgDygCABCHBCEIQdDD2gBBEhC5GiE9IANBrsHfAEEBELkaNwOIJSADQgA3A5AlIANB8CRqIgQgA0GIJWoQgxwgA0IANwPoJEHiw9oAQSEQuRohPEHIABDNICIHQgA3AzggB0EAOgA0IAcgCDYCMCAHQgA3AyggByA9NwMgIAdBGGogA0GAJWopAwA3AwAgB0EQaiADQfgkaikDADcDACAHQQhqIAQpAwA3AwAgByADKQPoJDcDACAHQUBrQQA6AAAgA0EBNgLkJiADIAc2AuAmIANBATYC3CZBGBDNICIEQgA3AwggBCA8NwMAIANB8iZqQgA3AQAgBEEQakIANwMAIANCADcC7CYgAyAENgLoJiADQQA2AtgmIBAgA0HYJmoQ3xkLIAstAGMEQCAPKAIAEIcEIQhBg8TaAEEJELkaIT0gA0Guwd8AQQEQuRo3A7glIANCADcDwCUgA0GgJWoiBCADQbglahCDHCADQgA3A5glQYzE2gBBGBC5GiE8QcgAEM0gIgdCADcDOCAHQQA6ADQgByAINgIwIAdCADcDKCAHID03AyAgB0EYaiADQbAlaikDADcDACAHQRBqIANBqCVqKQMANwMAIAdBCGogBCkDADcDACAHIAMpA5glNwMAIAdBQGtBADoAACADQQE2AuQmIAMgBzYC4CYgA0EBNgLcJkEYEM0gIgRCADcDCCAEIDw3AwAgA0HyJmpCADcBACAEQRBqQgA3AwAgA0IANwLsJiADIAQ2AugmIANBADYC2CYgECADQdgmahDfGQsgCy0AZARAIA8oAgAQhwQhCEGkxNoAQQgQuRohPSADQa7B3wBBARC5GjcD6CUgA0IANwPwJSADQdAlaiIEIANB6CVqEIMcIANCADcDyCVBrMTaAEEXELkaITxByAAQzSAiB0IANwM4IAdBADoANCAHIAg2AjAgB0IANwMoIAcgPTcDICAHQRhqIANB4CVqKQMANwMAIAdBEGogA0HYJWopAwA3AwAgB0EIaiAEKQMANwMAIAcgAykDyCU3AwAgB0FAa0EAOgAAIANBATYC5CYgAyAHNgLgJiADQQE2AtwmQRgQzSAiBEIANwMIIAQgPDcDACADQfImakIANwEAIARBEGpCADcDACADQgA3AuwmIAMgBDYC6CYgA0EANgLYJiAQIANB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CyAKQYCAgIB4NgI8IAogAjYCACAEQTRqEOsmIBwQuiggExC2FwwBCyAKIAQpAjQ3AjwgCkHEAGogBEE8aigCADYCACABKAJ8IQIgCiATQTAQ9gYiBSAUOgBIIAUgHDYCOCAFIA4gAiACIA5JGzYCNCAFIA4gAiACIA5LGzYCMAsgBEGgCWokAAwBC0G54+AAQShB1PrfABDaFwALIAMoAoQDIhNBgICAgHhGBEAgAygCyAIhDgwCCyADKALMAiEQIAMoAsgCIREgA0HoBWogA0HQAmpBNBD2BhogA0HoBGogA0GQA2opAwA3AwAgAyADKQOIAzcD4AQMAwsgA0GYBWoQiiYLIABBgYCAgHg2ApABIAAgDjYCAAwCCyABKAIoIQUgAUElNgIoIAEgASkDQDcDeCADQdQCaiANQQhqKQIANwIAIANB3AJqIA1BEGooAgA2AgAgAyANKQIANwLMAiADIAU2AsgCIANByAJqEL8KIAIgASgCfCIFIAIgBUkbIREgAiAFIAIgBUsbIRBBgICAgHghEwsgAyAQNgKEASADQYgBaiADQegFakE0EPYGGiADQcgBaiADQegEaiIJKQMANwMAIAMgAykD4AQ3A8ABIAMgETYCgAEgAyATNgK8ASADQQA2AtwBIANCgICAgIABNwLUASADQQc6AJQCAkACQCATQYCAgIB4Rg0AIAMtAMgBQQFHDQBBByEGQQAhDiADKALkASEKDAELIANB0AJqIRkgA0HIAmpBBHIhByADQcwCaiEPIANBmARqIQQgA0HwA2ohEiADQewCaiEWIANB3ANqIRpBACECQQAhDgJAAkADQCAIEOMNIgVFBEAgASgC2AIhASADQQA6AMgCIAEgASADQcgCahDrFCEFDAMLAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAUoAgAiBUEgaw4FBAUCAgABCyABIAEpA0A3A3ggASgCKCABQSU2AihBJEYND0G54+AAQShB8PffABDaFwALIAVBDUYNAQsgA0HUAmogCBDmCyADQQhqIAgQnxQgA0EgNgLQAiADQeD43wA2AswCIANBMDoAyAIgAygCCCADKAIMIANByAJqEOsUIQUgCBDjDSICRQ0OIAIoAgBBJEcNDiABIAEpA0A3A3ggASgCKCABQSU2AihBJEcNBiABIAEoAiwQggwM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AmogDUEIaikCADcCACADQdwCaiANQRBqKAIANgIAIAMgDSkCADcCzAIgAyACNgLIAiADQcgCahC/CiALIAEoAnwiAiACIAtLGyEWIAsgAiACIAtJGyEKQQYhBgwGC0GgAUEIEIwgIgYgBTYCACAGIAcpAgA3AgQgBkEMaiAHQQhqKQIANwIAIAZBFGogB0EQaikCADcCACAGQRxqIAdBGGopAgA3AgAgBkEkaiAWQewAEPYGGiAGIAs2ApABIAYgGikCADcClAEgBkGcAWogGkEIaigCADYCACAGIQVBAwshBiASIAMpA+gFNwMAIBJBGGogA0GABmopAwA3AwAgEkEQaiADQfgFaikDADcDACASQQhqIANB8AVqKQMANwMAIAMgBTYC7AMgAyAGNgLoAyADQegDaiEKDAcLQbnj4ABBKEHY+d8AENoXAAsgASgCKCECIAFBJTYCKCABIAEpA0A3A3ggA0HUAmogDUEIaikCADcCACADQdwCaiANQRBqKAIANgIAIAMgDSkCADcCzAIgAyACNgLIAiADQcgCahC/CiABKAJ8IQIgA0GYBWogA0HoBWpBLBD2BhogA0GqBmogA0GVBmoiBUECai0AADoAACADIAUvAAA7AagGIAsgAiACIAtLGyEWIAsgAiACIAtJGyEKDAILQbnj4ABBKEGw+t8AENoXAAtBuePgAEEoQYD53wAQ2hcACyADQZwCaiICIANBmAVqQSwQ9gYaIANBmgJqIgUgA0GqBmotAAA6AAAgAyADLwGoBjsBmAIgA0HgAWoQ8SAgAyAKNgLkASADIBY2AuABIANB6AFqIAJBLBD2BhogA0GXAmogBS0AADoAACADIAY6AJQCIAMgAy8BmAI7AJUCDAcLIANB6AVqELYXDAULIAEoAtgCIQEgA0EAOgDIAiABIAEgA0HIAmoQ6xQhBQwECyADKALUASAORgRAIANB1AFqEPgWCyADKALYASACaiAKQSgQ9gYaIAMgDkEBaiIONgLcASACQShqIQIMAQsLIANB6AVqEJgpDAELIAEoAiwhBQsgAEGBgICAeDYCkAEgACAFNgIAIANB4AFqEPEgIANB1AFqEMkmIBNBgICAgHhGDQEgA0GAAWoQrCMMAQsgGyABKAJ8IgUgBSAbSxshAiAbIAUgBSAbSRshBSADQZUCaiELIANB6AFqIRICQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgE0GAgICAeEYEQCAGQQZrDgICAQMLIANBwAFqIQ4gA0GIAWohByAGQQZrDgIEAwULQbnj4ABBKEGw+N8AENoXAAtBgICAgHghASADKALYASEHIAMoAtQBIQYgAiEZIAUhGgwMCyADIAo2AswCIAMgFjYCyAIgA0HQAmogEkEsEPYGIQIgA0H/AmogC0ECai0AADoAACADIAY6APwCIAMgCy8AADsA/QIgA0HXADoA6AUgFiAKIANB6AVqEOsUIQUgCBDjDSIGRQ0JIAYoAgBBJEcNCSABIAEpA0A3A3ggASgCKCABQSU2AihBJEcNAyABIAEoAiwQggwMCQsgA0GYBWogB0E0EPYGGiADQZAFaiAOQQhqKQMANwMAIAMgDikDADcDiAVBBiENIAMpAtgBIS8gAygC1AEhASARIQsgECESIAIhBiAFIQcMCgsgAyAQNgLMAiADIBE2AsgCIANB0AJqIAdBNBD2BhogA0GQA2ogDkEIaikDADcDACADIBM2AoQDIAMgDikDADcDiAMgA0HIAmoQuAghLCADQdgAOgDoBSADICw3A/AFIBYgCiADQegFahDrFCECIAgQ4w0iBUUNBiAFKAIAQSRHDQYgASABKQNANwN4IAEoAiggAUElNgIoQSRHDQIgASABKAIsEIIMDAYLIAMgEDYCzAIgAyARNgLIAiADQdACaiAHQTQQ9gYhECADQZADaiAOQQhqKQMANwMAIAMgEzYChAMgAyAOKQMANwOIAyADIAo2AuwFIAMgFjYC6AUgA0HwBWogEkEsEPYGIQcgA0GfBmogC0ECai0AADoAACADIAY6AJwGIAMgCy8AADsAnQYgAyAHELgINwOgBiADIANByAJqELgIIiw3A6gGIANBoAZqIANBqAZqIgYQrwsgLBDWGiADKQOgBhDWGg0EIAMoAuwFIQIgAygC6AUgA0HIAmoQuAghLCADQdgAOgCoBiADICw3A7AGIAIgBhDrFCECIAgQ4w0iBUUNAyAFKAIAQSRHDQMgASABKQNANwN4IAEoAiggAUElNgIoQSRHDQIgASABKAIsEIIMDAMLQbnj4ABBKEGg+N8AENoXAAtBuePgAEEoQcD43wAQ2hcAC0G54+AAQShB0PjfABDaFwALIABBgYCAgHg2ApABIAAgAjYCACAHELYXIANByAJqEKwjDAMLIAMoAswCIRIgAygCyAIhCyADQZgFaiAQQTQQ9gYaIANBkAVqIANBiANqIgFBCGopAwA3AwAgA0HYBWogA0GMBmopAgA3AwAgA0HgBWogA0GUBmopAgA3AwAgAyABKQMANwOIBSADIAMpAoQGNwPQBSADKAKEAyETIAMoAtQBIQEgAykC2AEhLyADKALoBSEOIAMoAuwFIRkgAygC8AUhGiADKAL0BSERIAMoAvgFIRAgAygC/AUhFiADKAKABiEKIANBzgVqIANBnQZqIgZBAmotAAA6AAAgAyAGLwAAOwHMBSADLQCcBiENIAIhBiAFIQcMAwsgAEGBgICAeDYCkAEgACACNgIAIANByAJqEKwjDAELIABBgYCAgHg2ApABIAAgBTYCACACELYXCyADQdQBahDJJgwBCyAAIAo2AiAgACAWNgIcIAAgEDYCGCAAIBE2AhQgACAaNgIQIAAgGTYCDCAAIA42AgggACAHNgIEIAAgBjYCACAAIAMpA9AFNwIkIAAgDToAPCAAIAMvAcwFOwA9IABBLGogA0HYBWopAwA3AgAgAEE0aiADQeAFaikDADcCACAAQT9qIANBzgVqLQAAOgAAIAAgEjYCRCAAIAs2AkAgAEHIAGogA0GYBWpBNBD2BhogACATNgJ8IAAgLzcClAEgACABNgKQASAAIAMpA4gFNwOAASAAQYgBaiADQZAFaikDADcDAAsgA0HcAGoQiiYMAQtBuePgAEEoQeD33wAQ2hcACyADQcAGaiQAC8hLAih/BX4jAEHABmsiAyQAAkAgAUEoaiIIEMgNIgVFBEAgASgCgAIhASADQQA6AMgCIAEgASADQcgCahDrFCEBIABBgYCAgHg2ApABIAAgATYCAAwBCwJAAn8CQAJAIAUoAgBBJEYEQCABIAEpA+ACNwOYAyABKALIAiABQSU2AsgCQSRGDQFBuePgAEEoQdD33wAQ2hcACyAIEKUgIRsgA0HUAmogAUHUAmopAgA3AgAgA0HcAmogAUHcAmooAgA2AgAgASgCyAIhBSABQSU2AsgCIAEgASkD4AI3A5gDIAMgASkCzAI3AswCIAMgBTYCyAIgBUEURg0BIAVBIUcNA0EADAILIAEoAswCIQEgAEGBgICAeDYCkAEgACABNgIADAMLIAMtAMwCQQRHDQFBAQshBSABQcwCaiENIANByAJqEL4KIANBADoATCADIAU6AFcgAyABLQC2AjoASyADIAEpAaoCNwA/IAMgAUGyAmoiBSgBADYARyADIAEpA7gCNwBNIAMgAS8BwAI7AFUgAyABKADDAjYAWCADQfUAaiABQb8CaikAADcAACADQfAAaiABQboCaikBADcCACADQegAaiAFKQEANwIAIAMgASkBqgI3AmAgCCADQT9qEMgIIAMgATYCXAJAAkACQCAIEMgNIgUEQCAFKAIAQSJGDQELIANBADoAqQIgAyABLQC2AjoAqAIgAyABLQDGAjoAuAIgAyABKQGqAjcAnAIgAyABKAGyAjYApAIgAyABKQO4AjcAqgIgAyABKALAAjYAsgIgAyABLwHEAjsAtgIgA0GxBWogAUGqAmoiBUEVaikAADcAACADQawFaiAFQRBqKQEANwIAIANBpAVqIAVBCGopAQA3AgAgAyAFKQEANwKcBSAIIANBnAJqEMgIIAMgATYCmAUgA0HIAmoiCiABEKoDIAMoAsgCIQ4CQCADLQD0AiIFQQZHBEAgA0HgAWoiE0EEciAKQQRyQSgQ9gYaIANBjwJqIANB9wJqLQAAOgAAIAMgAy8A9QI7AI0CIAMgBToAjAIgAyAONgLgASADQZgFahDvJCACIQ4jAEGQCWsiBCQAIAFBKGohCQJAIAEtAKACQQJHDQAgCRDIDSICRQ0AIAIoAgBBFEcNACACLQAEQQRHDQAgAS0AoAJBAkcNACABLQCqAiEFIARBkAFqIgIgARCcAyAEQQE6APsHIAQgASkAqwI3APwHIAQgASkAswI3AIQIIAQgASkAuwI3AIwIIAQgASgAwwI2AJQIIARBuAFqIARB+wdqEMgIIARBKGogAhDuASAEIAQoAiwiHDYC/AggBCAEKAIoIg82AvgIIA8EQCAEQfgIahDwHyACEMsQQQAhHAwBCyAEQbAEaiICIARBkAFqQaADEPYGGiABEMsQIAEgAkGgAxD2BiECIAQgBToAsAggBCACKQCrAjcAsQggBCACKQCzAjcAuQggBCACKQC7AjcAwQggBCACKADDAjYAyQggCSAEQbAIahDICAsgBEKAgICAgAE3AjQgAUGqAmohHyABQcwCaiEPIARB3AhqISYgBEG4BGohGCAEQcQFaiEnIARB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AmogDUEIaikCADcCACADQdwCaiANQRBqKAIANgIAIAMgDSkCADcCzAIgAyAFNgLIAiADQcgCahC+CiACIAEoApwDIgUgAiAFSRshESACIAUgAiAFSxshEEGAgICAeCETCyADIBA2AoQBIANBiAFqIANB6AVqQTQQ9gYaIANByAFqIANB6ARqIgkpAwA3AwAgAyADKQPgBDcDwAEgAyARNgKAASADIBM2ArwBIANBADYC3AEgA0KAgICAgAE3AtQBIANBBzoAlAICQAJAIBNBgICAgHhGDQAgAy0AyAFBAUcNAEEHIQZBACEOIAMoAuQBIQoMAQsgA0HQAmohGSADQcgCakEEciEHIANBzAJqIQ8gA0GYBGohBCADQfADaiESIANB7AJqIRYgA0HcA2ohGkEAIQJBACEOAkACQANAIAgQyA0iBUUEQCABKAKAAiEBIANBADoAyAIgASABIANByAJqEOsUIQUMAwsCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgBSgCACIFQSBrDgUEBQICAAELIAEgASkD4AI3A5gDIAEoAsgCIAFBJTYCyAJBJEYND0G54+AAQShB8PffABDaFwALIAVBDUYNAQsgA0HUAmogCBCAECADQQhqIAgQ6hMgA0EgNgLQAiADQeD43wA2AswCIANBMDoAyAIgAygCCCADKAIMIANByAJqEOsUIQUgCBDIDSICRQ0OIAIoAgBBJEcNDiABIAEpA+ACNwOYAyABKALIAiABQSU2AsgCQSRHDQYgASABKALMAhD7CwwOCyAIEKUgGgJAAkACQCAIEI8TIgUEQCAFKAIAQQdGDQELIANByAJqIAEQ/wMgAygCyAIiBUECRg0BIAkgDykCADcCACAJQQhqIA9BCGopAgA3AgAgAyAFNgLkBCADQQE2AuAEIANB4ARqIQoMDAsgCBClICELAkACQAJAAkACQCAIEMgNIgUEQCAFKAIAQQ1GDQELIANB0AJqIAgQgBAgA0EQaiAIEOoTIANB4NnfADYCzAIgA0E0OgDIAiADKAIQIAMoAhQgA0HIAmoQ6xQhBSAIEMgNIgJFDRQgAigCAEEkRw0UIAEgASkD4AI3A5gDIAEoAsgCIAFBJTYCyAJBJEYNAUG54+AAQShB+PnfABDaFwALIAcgDSkCADcCACABKALIAiEFIAFBJTYCyAIgASABKQPgAjcDmAMgB0EIaiIGIA1BCGoiCikCADcCACAHQRBqIgwgDUEQaiIVKAIANgIAIAMgBTYCyAIgA0HIAmoQvgogCBDIDSIFBEAgBSgCAEEHRg0CCyADQdACaiAIEIAQIANBGGogCBDqEyADQaj23wA2AswCIANBNDoAyAIgAygCGCADKAIcIANByAJqEOsUIQUgCBDIDSICRQ0TIAIoAgBBJEcNEyABIAEpA+ACNwOYAyABKALIAiABQSU2AsgCQSRHDQILIAEgASgCzAIQ+wsMEgsgByANKQIANwIAIAEoAsgCIQUgAUElNgLIAiABIAEpA+ACNwOYAyAGIAopAgA3AgAgDCAVKAIANgIAIAMgBTYCyAIgA0HIAmoQvgogA0EoaiABEIkGIAMoAiwhBSADKAIoDREgAyAFNgLoBSAIEMgNIhQEQCAUKAIAQQ5GDQILIBkgCBCAECADQSBqIAgQ6hMgA0G42d8ANgLMAiADQTQ6AMgCIAMoAiAgAygCJCADQcgCahDrFCEFIAgQyA0iAkUNDiACKAIAQSRHDQ4gASABKQPgAjcDmAMgASgCyAIgAUElNgLIAkEkRw0GIAEgASgCzAIQ+wsMDgtBuePgAEEoQej53wAQ2hcACyAHIA0pAgA3AgAgASgCyAIhFCABQSU2AsgCIAEgASkD4AI3A5gDIAYgCikCADcCACAMIBUoAgA2AgAgAyAUNgLIAiADQcgCahC+CiALIAEoApwDIgogCiALSxshBiAFDQEgBiEFDA8LIAMoAswCIQUMDgsgAyALIAogCiALSRs2AsQEIAMgBjYCwAQgAyAFNgK8BCADQQI2ArgEIANBuARqIQoMCQsgA0HIAmogARDSESADKQPIAlBFBEAgBCADKQPIAjcDACAEQRBqIANB2AJqKQMANwMAIARBCGogGSkDADcDACADQQA2ApAEIANBkARqIQoMCQsgAygC0AIhBQwMCyAIEKUgIQsCfwJAAkACQCAIEI8TIgVFDQAgBSgCAEEURw0AIAUtAARBDkYNAQsgA0HIAmogASALEEogAygCyAIhBSADKALYAyILQYGAgIB4Rg0OIAtBgICAgHhHDQEgA0GABmogB0EYaikCADcDACADQfgFaiAHQRBqKQIANwMAIANB8AVqIAdBCGopAgA3AwAgAyAHKQIANwPoBUEEDAILIAEoAsgCIQIgAUElNgLIAiABIAEpA+ACNwOYAyADQdQCaiANQQhqKQIANwIAIANB3AJqIA1BEGooAgA2AgAgAyANKQIANwLMAiADIAI2AsgCIANByAJqIgIQvgogCBDIDSIFRQRAIAEoAoACIQEgA0EAOgDIAiABIAEgAhDrFCEFDA4LIAUoAgBBJEYEQCABIAEpA+ACNwOYAyABKALIAiABQSU2AsgCQSRGDQ1BuePgAEEoQYD43wAQ2hcACyAIEMgNIgJFDQggAigCAEEkRgRAIAEgASkD4AI3A5gDIAEoAsgCIAFBJTYCyAJBJEYNDUG54+AAQShBkPjfABDaFwALIAEoAsgCIQIgAUElNgLIAiABIAEpA+ACNwOYAyADQdQCaiANQQhqKQIANwIAIANB3AJqIA1BEGooAgA2AgAgAyANKQIANwLMAiADIAI2AsgCIANByAJqEL4KAkAgCBDIDSICBEAgAigCAEEiRg0BCyADQcgCaiICIAEQqgMgAygCyAIhBSADLQD0AiIGQQZGDQ4gA0HoBWpBBHIgAkEEckEoEPYGGiADQZcGaiADQfcCai0AADoAACADIAMvAPUCOwCVBiADIAY6AJQGIAMgBTYC6AUgCBDIDSICBEAgAigCAEEiRg0FCyADQdACaiAIEIAQIANBMGogCBDqEyADQZj63wA2AswCIANBNDoAyAIgAygCMCADKAI0IANByAJqEOsUIQUgCBDIDSICRQ0IIAIoAgBBJEcNCCABIAEpA+ACNwOYAyABKALIAiABQSU2AsgCQSRHDQUgASABKALMAhD7CwwICyABKALIAiECIAFBJTYCyAIgASABKQPgAjcDmAMgA0HUAmogDUEIaikCADcCACADQdwCaiANQRBqKAIANgIAIAMgDSkCADcCzAIgAyACNgLIAiADQcgCahC+CiALIAEoApwDIgIgAiALSxshFiALIAIgAiALSRshCkEGIQYMBgtBoAFBCBCMICIGIAU2AgAgBiAHKQIANwIEIAZBDGogB0EIaikCADcCACAGQRRqIAdBEGopAgA3AgAgBkEcaiAHQRhqKQIANwIAIAZBJGogFkHsABD2BhogBiALNgKQASAGIBopAgA3ApQBIAZBnAFqIBpBCGooAgA2AgAgBiEFQQMLIQYgEiADKQPoBTcDACASQRhqIANBgAZqKQMANwMAIBJBEGogA0H4BWopAwA3AwAgEkEIaiADQfAFaikDADcDACADIAU2AuwDIAMgBjYC6AMgA0HoA2ohCgwHC0G54+AAQShB2PnfABDaFwALIAEoAsgCIQIgAUElNgLIAiABIAEpA+ACNwOYAyADQdQCaiANQQhqKQIANwIAIANB3AJqIA1BEGooAgA2AgAgAyANKQIANwLMAiADIAI2AsgCIANByAJqEL4KIAEoApwDIQIgA0GYBWogA0HoBWpBLBD2BhogA0GqBmogA0GVBmoiBUECai0AADoAACADIAUvAAA7AagGIAsgAiACIAtLGyEWIAsgAiACIAtJGyEKDAILQbnj4ABBKEGw+t8AENoXAAtBuePgAEEoQYD53wAQ2hcACyADQZwCaiICIANBmAVqQSwQ9gYaIANBmgJqIgUgA0GqBmotAAA6AAAgAyADLwGoBjsBmAIgA0HgAWoQ8SAgAyAKNgLkASADIBY2AuABIANB6AFqIAJBLBD2BhogA0GXAmogBS0AADoAACADIAY6AJQCIAMgAy8BmAI7AJUCDAcLIANB6AVqELYXDAULIAEoAoACIQEgA0EAOgDIAiABIAEgA0HIAmoQ6xQhBQwECyADKALUASAORgRAIANB1AFqEPgWCyADKALYASACaiAKQSgQ9gYaIAMgDkEBaiIONgLcASACQShqIQIMAQsLIANB6AVqEL8oDAELIAEoAswCIQULIABBgYCAgHg2ApABIAAgBTYCACADQeABahDxICADQdQBahDJJiATQYCAgIB4Rg0BIANBgAFqEKwjDAELIBsgASgCnAMiBSAFIBtLGyECIBsgBSAFIBtJGyEFIANBlQJqIQsgA0HoAWohEgJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCATQYCAgIB4RgRAIAZBBmsOAgIBAwsgA0HAAWohDiADQYgBaiEHIAZBBmsOAgQDBQtBuePgAEEoQbD43wAQ2hcAC0GAgICAeCEBIAMoAtgBIQcgAygC1AEhBiACIRkgBSEaDAwLIAMgCjYCzAIgAyAWNgLIAiADQdACaiASQSwQ9gYhAiADQf8CaiALQQJqLQAAOgAAIAMgBjoA/AIgAyALLwAAOwD9AiADQdcAOgDoBSAWIAogA0HoBWoQ6xQhBSAIEMgNIgZFDQkgBigCAEEkRw0JIAEgASkD4AI3A5gDIAEoAsgCIAFBJTYCyAJBJEcNAyABIAEoAswCEPsLDAkLIANBmAVqIAdBNBD2BhogA0GQBWogDkEIaikDADcDACADIA4pAwA3A4gFQQYhDSADKQLYASEuIAMoAtQBIQEgESELIBAhEiACIQYgBSEHDAoLIAMgEDYCzAIgAyARNgLIAiADQdACaiAHQTQQ9gYaIANBkANqIA5BCGopAwA3AwAgAyATNgKEAyADIA4pAwA3A4gDIANByAJqELgIISsgA0HYADoA6AUgAyArNwPwBSAWIAogA0HoBWoQ6xQhAiAIEMgNIgVFDQYgBSgCAEEkRw0GIAEgASkD4AI3A5gDIAEoAsgCIAFBJTYCyAJBJEcNAiABIAEoAswCEPsLDAYLIAMgEDYCzAIgAyARNgLIAiADQdACaiAHQTQQ9gYhECADQZADaiAOQQhqKQMANwMAIAMgEzYChAMgAyAOKQMANwOIAyADIAo2AuwFIAMgFjYC6AUgA0HwBWogEkEsEPYGIQcgA0GfBmogC0ECai0AADoAACADIAY6AJwGIAMgCy8AADsAnQYgAyAHELgINwOgBiADIANByAJqELgIIis3A6gGIANBoAZqIANBqAZqIgYQrwsgKxDWGiADKQOgBhDWGg0EIAMoAuwFIQIgAygC6AUgA0HIAmoQuAghKyADQdgAOgCoBiADICs3A7AGIAIgBhDrFCECIAgQyA0iBUUNAyAFKAIAQSRHDQMgASABKQPgAjcDmAMgASgCyAIgAUElNgLIAkEkRw0CIAEgASgCzAIQ+wsMAwtBuePgAEEoQaD43wAQ2hcAC0G54+AAQShBwPjfABDaFwALQbnj4ABBKEHQ+N8AENoXAAsgAEGBgICAeDYCkAEgACACNgIAIAcQthcgA0HIAmoQrCMMAwsgAygCzAIhEiADKALIAiELIANBmAVqIBBBNBD2BhogA0GQBWogA0GIA2oiAUEIaikDADcDACADQdgFaiADQYwGaikCADcDACADQeAFaiADQZQGaikCADcDACADIAEpAwA3A4gFIAMgAykChAY3A9AFIAMoAoQDIRMgAygC1AEhASADKQLYASEuIAMoAugFIQ4gAygC7AUhGSADKALwBSEaIAMoAvQFIREgAygC+AUhECADKAL8BSEWIAMoAoAGIQogA0HOBWogA0Gd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M2o2AmAgAyADQTRqNgJcIANB0ABqENgLIgJFBEAgA0EANgLcASADQoCAgIDAADcC1AEgA0HUAWohAgwJCyADQQRBBEEEEOcUIAMoAgAhBSADKAIEIgQgAjYCACADQQE2AtwBIAMgBDYC2AEgAyAFNgLUASADQaABaiADQeAAaigCADYCACADQZgBaiADQdgAaikCADcDACADIAMpAlA3A5ABQQQhBUEBIQgDQCADIANBkAFqENgLIgI2AjggAgRAIAMoAtQBIAhGBEAgA0HUAWpBARDwHiADKALYASEECyAEIAVqIAI2AgAgAyAIQQFqIgg2AtwBIAVBBGohBQwBCwsgA0E4ahCdJyADKALcAUEBRg0GIANB1AFqIQIMCAsDQCACIAdGBEAgAygCTEEBRwRAIANBxABqIQIMCgsgA0EANgJMIANBkAFqIgAgAygCSCgCACICQcAAEPYGGiABEKgDIAEgAEHAABD2BhogA0HEAGoMCAUgBkEBaiEGIAJBBGoCQAJAAkAgAigCACIFKAIAQRlHBEAgAhD2HiECIAYgCkYNASADQcQAaiACIANBM2oQ3AQQyA4MAwsgBSgCDCENIAVBADYCDCAFKAIEIQggBSgCCCECIAVCgICAgMAANwIEIAIgDUECdCIFaiEMIAYgCkcEQCADIAw2ApwBIAMgCDYCmAEgAyACNgKUASADIAI2ApABIAMgA0EzajYCoAEDQCACIAxGDQMgAigCACACQQRqIQIgA0EzahDcBCIIRQ0AIAMoAkwiBSADKAJERgRAIANBxABqQQEQ8B4LIAMoAkggBUECdGogCDYCACADIAVBAWo2AkwMAAsACyADIAw2ApwBIAMgCDYCmAEgAyACNgKQASANQQFrIQggDUH/////A3EhCQNAIAUEQCACKAIAIQ0CQCAIBEAgA0HEAGogDSADQTNqENwEEMgODAELIANBxABqIA0QshsLIAJBBGohAiAFQQRrIQUgCEEBayEIDAEFIAMgCTYCoAEgAyAMNgKUASADQZABahDKFwwECwALAAsgA0HEAGogAhCyGwwBCyADQQA2AlAgAyAMNgKUASADQdAAahCdJyADQQA2AjggA0E4ahCdJyADQZABahDKFwshAgwBCwALAAsgBCADKAKYARC+KQALIAEoAigiASgCAEEbRg0GDAgLIAJBGUYNAQsgAkEMayIFQSVLIAVBB0ZyDQAgAkEPRw0GAkAgEEEBaw4DAAcHAQsgEUEBcQ0FCyAAIAQQyQEMBQsgA0EANgLcASADQZABaiIAIAMoAtgBKAIAIgJBwAAQ9gYaIAEQqAMgASAAQcAAEPYGGiADQdQBagsgAhDwKhDOJgwDCyADQThqIQpBACEGIwBBIGsiBSQAIAUgAigCCCIENgIAAkAgBEECTQRAIAogAikCADcCACAKQQhqIAJBCGooAgA2AgAMAQsgAigCACEMIAIoAgQhAkEAIQggBUEANgIUIAUgAiAEQQJ0IgdqIgk2AhAgBSAMNgIMIAUgAjYCBCAFIAU2AhggAiEEA0ACQAJAIAcgCEcEQCAFIAIgCGooAgAiDTYCHAJAAkACQAJAIA0oAgAiC0Ebaw4EAgMDAQALIAtBD0cNAiAFKAIYKAIAIAZBAWpHDQQMAgsgBSgCGCgCACAGQQFqRg0BDAMLIAUoAhgoAgAgBkEBakcNAgsgBCANNgIAIARBBGohBCAFKAIUIQYMAgsgBSAJNgIIIAVBBGoiBhCMEiAKIAQgAmtBAnY2AgggCiACNgIEIAogDDYCACAGEMoXDAMLIAVBHGoQjgILIAUgBkEBaiIGNgIUIAhBBGohCAwACwALIAVBIGokAAJAIAAtACQgAC0AJUEAIAMQjhpFDQAgAygCQEUNACADKAI8KAIAIgIoAgBBF0cNACACLQAYQQVHDQAgAigCECICKAIAQQ9HDQAgACACEMkBIAAtACQhEAsgA0HcAGogA0FAaygCADYCACADIAMpAjg3AlQgA0EZNgJQIAMgASkDEDcDYCAQQQJGBEAgACADQdAAahDJAQsgA0GQAWoiACADQdAAakHAABD2BhogARCoAyABIABBwAAQ9gYaDAILIAEoAghBA0cNASABKwMYIiQgJGJEAAAAAAAA8D8gJKZEAAAAAAAA8L9icg0BIAAgARDJAQwBCyAAIAEQyQELIANB4AFqJAAPCyADQQhqIAAgAkEBEMQJIAMoAggiAkGBgICAeEYNACACIAMoAgwQvikACyAAKAIAIQUgACgCCCECCyACIAVGBEAgABDtFgsgACACQQFqNgIIIAAoAgQgAkEUbGoiAiAYNgIQIAIgFzYCDCACIBY2AgggAiAVNgIEIAIgFDYCAAwACwAL1SoCF38BfiMAQYADayIDJAACQCABQShqIgQQ4w0iBkUEQCABKALYAiEBIANBADoAkAEgASABIANBkAFqEOsUIQEgAEEHNgIAIAAgATYCBAwBCwJAAkACQAJAAkACQAJAAkACQAJAAkACQCAGKAIAIgZBC2sOAwEJAgALIAZBAkcEQCAGQSRHDQkgASABKQNANwN4IAEoAiggAUElNgIoQSRHDQggASgCLCEBIABBBzYCACAAIAE2AgQMDAsgA0HIAWogASACEJgEIAACfyADLQDcAUECRwRAIANBrAFqIANB4AFqKQMANwIAIANBpAFqIANB2AFqKQMANwIAIANBnAFqIANB0AFqKQMANwIAIAMgAykDyAE3ApQBIABBBGogA0GQAWpBJBD2BhpBAAwBCyAAIAMoAsgBNgIEQQcLNgIADAsLIAQQvyAhDCAEEOMNIgJFBEAgASgC2AIhASADQQA6AJABIAEgASADQZABahDrFCEBIABBBzYCACAAIAE2AgQMCwsgAigCAEEkRgRAIAEgASkDQDcDeCABKAIoIAFBJTYCKEEkRw0GIAEoAiwhASAAQQc2AgAgACABNgIEDAsLIAEoAighAiABQSU2AiggASABKQNANwN4IANBnAFqIAFBNGopAgA3AgAgA0GkAWogAUE8aigCADYCACADIAEpAiw3ApQBIAMgAjYCkAEgA0GQAWoiAhC/CiADQQA2AmggA0KAgICAgAE3AmAgAUEsaiEGIAJBBHIhCSADQdABaiEOIANBmAFqIQpBACECAkADQCACIA1yRSACQf7/e0tyIQhBACEFAkACfwJAAkACQANAIAQQ4w0iC0UNASADQQA2AuACIAMgCzYC5AIgA0HgAmoQ/CMgBBDjDSILBEAgCygCAEEMRg0DCyAIRQRAIANBOzoAkAEgASACIA0gA0GQAWoQvBkLAkAgBBDjDSILRQ0AIAsoAgBBEEcNACAJIAYpAgA3AgAgASgCKCELIAFBJTYCKCABIAEpA0A3A3ggCUEIaiAGQQhqKQIANwIAIAlBEGogBkEQaigCADYCACADIAs2ApABIAVBAWohBSADQZABahC/CgwBCwsgBQRAIAMgBTYCuAEgA0EHNgKQASADQeAAaiADQZABahCDCQsgBBC/ICEFIAQQ4w0iCARAIAgoAgBBB0YNAwsgA0GQAWogARDmBCADKAKUASEFIAMoApABIghBB0YNCyAOIAopAwA3AwAgDkEYaiAKQRhqKQMANwMAIA5BEGogCkEQaikDADcDACAOQQhqIApBCGopAwA3AwAgAyAFNgLMASADIAg2AsgBIANB4ABqIANByAFqEOIZQQAMAwsgASgC2AIhAiADQQA6AJABIAMgAiACIANBkAFqEOsUNgLkAiADQQE2AuACIANB4AJqEPwjCyAEEOMNIgJFDQIgAigCAEEMRw0CIAEoAighAiABQSU2AiggASABKQNANwN4IANBnAFqIAZBCGopAgA3AgAgA0GkAWogBkEQaigCADYCACADIAYpAgA3ApQBIAMgAjYCkAEgA0GQAWoQvwogAS0A+AJBAkYEQCABLQD7AkEBcQ0FC0EAIQIgAS0AkANBAXENBAwOCyAJIAYpAgA3AgAgASgCKCECIAFBJTYCKCABIAEpA0A3A3ggCUEIaiAGQQhqKQIANwIAIAlBEGogBkEQaigCADYCACADIAI2ApABIANBkAFqIg8QvwogASgCfCECIA8gAUEAEE4gAygCkAEiDUEHRg0HIANBwAJqIgcgCkEIaikDADcDACADQcgCaiIRIApBEGopAwA3AwAgA0HQAmoiEiAKQRhqKQMANwMAIAMgCikDADcDuAIgAygClAEhECABKAJ8IQtBKEEIEIwgIgggEDYCBCAIIA02AgAgCCADKQO4AjcDCCAIQRBqIAcpAwA3AwAgCEEYaiARKQMANwMAIAhBIGogEikDADcDACADQQA2AqgBIAMgBSACIAIgBUkbNgKkASADIAUgAiACIAVLGzYCoAEgAyAFIAsgBSALSxsiDTYCnAEgAyAFIAsgBSALSRsiAjYCmAEgAyAINgKUASADQQI2ApABIANB4ABqIA8Q4hlBAQsgBBDjDSIIBEAgCCgCAEEMRg0CCwJAIAQQ4w0iCARAIAgoAgBBEEYNAQsgA0GYAWogBBDmCyADQRBqIAQQnxQgA0HYvOAANgKUASADQTQ6AJABIAMoAhAgAygCFCADQZABahDrFCEFIAQQ4w0iAkUNCCACKAIAQSRHDQggASABKQNANwN4IAEoAiggAUElNgIoQSRHDQYgASABKAIsEIIMDAgLIAkgBikCADcCACABKAIoIQggAUElNgIoIAEgASkDQDcDeCAJQQhqIAZBCGopAgA3AgAgCUEQaiAGQRBqKAIANgIAIAMgCDYCkAEgA0GQAWoiEBC/CkUNASAEEOMNIgVFDQEgBSgCAEEMRw0BIAEoAnwhBSABKAJ4IQggA0E6OgCQASABIAggBSAQELwZDAELCyADQZgBaiAEEOYLIANBCGogBBCfFCADQeDc3wA2ApQBIANBNDoAkAEgAygCCCADKAIMIANBkAFqEOsUIQUgBBDjDSICRQ0FIAIoAgBBJEcNBSABIAEpA0A3A3ggASgCKCABQSU2AihBJEcNAiABIAEoAiwQggwMBQtBACECIAQQ4w0iBEUNCSAEKAIAQRdHDQkgASgCKCECIAFBJTYCKCABIAEpA0A3A3ggA0GcAWogBkEIaikCADcCACADQaQBaiAGQRBqKAIANgIAIAMgBikCADcClAEgAyACNgKQASADQZABahC/CkEBIQIMCQsgA0EAOgBTIAMgASkBggM3AEMgAyABKQCTAzcAVCADIAEoAJsDNgBcIAMgAUGKA2oiAikBADcASyADQfkAaiABQZcDaikAADcAACADQfQAaiABQZIDaikBADcCACADQewAaiACKQEANwIAIAMgASkBggM3AmQgAUGAAWogA0HDAGoQwAggAyABNgJgIAQQvyAhDiAEEOMNIgJFBEAgASgC2AIhASADQQA6AJABIAEgASADQZABahDrFCEBIABBBzYCACAAIAE2AgQMCAsCQCACKAIAQSRGBEAgASABKQNANwN4IAEoAiggAUElNgIoQSRGDQFBuePgAEEoQcCk4AAQ2hcACyABKAIoIQIgAUElNgIoIAEgASkDQDcDeCADQZwBaiABQTRqKQIANwIAIANBpAFqIAFBPGooAgA2AgAgAyABKQIsNwKUASADIAI2ApABIANBkAFqIgIQvwogA0EANgKMASADQoCAgICAATcChAEgAUEsaiEGIAJBBHIhCyADQbgCakEEciEJIANBxAJqIRcgA0G8AmohDSADQcACaiEKIANBoAJqIQwgA0GgAWohGCADQZgBaiEZQQghEANAIAhBOGwhEgJAA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAEEOMNIgIEQCACKAIAQQ5GDQELIAQQvyAhBQJAAkACQAJAIAQQ4w0iAgRAIAIoAgBBB0YNAQsgA0G4AmogARCsASADKAK8AiECIAMoArgCIgdBBUYNDSAMIAopAwA3AwAgDEEQaiAKQRBqIg8pAwA3AwAgDEEIaiAKQQhqIhQpAwA3AwAgAyACNgKcAiADIAc2ApgCIAQQ4w0iAgRAIAIoAgBBE0YNAgsgBw0CQQAhAgJAIAQQ4w0iB0UNACAHKAIAQRVHDQAgBy0ABA0AIAkgBikCADcCACABKAIoIQIgAUElNgIoIAEgASkDQDcDeCAJQQhqIAZBCGopAgA3AgAgCUEQaiAGQRBqKAIANgIAIAMgAjYCuAIgA0G4AmoiDxC/CiAPIAFBARDHEiADQSBqIAMoArgCEKcGIAMoAiQhAiADKAIgIA8QiiYNBAsgASgCfCEHIBggDBDhIiADIAI2AsABQQEhAiADQQE2ApABIAMgBSAHIAUgB0sbNgKcASADIAUgByAFIAdJGzYCmAEMDAsgCSAGKQIANwIAIAEoAighAiABQSU2AiggASABKQNANwN4IAlBCGogBkEIaikCADcCACAJQRBqIAZBEGooAgA2AgAgAyACNgK4AiADQbgCaiICEL8KIAEoAnwhByACIAFBABBOIAMoArgCIg9BB0cEQCADQYACaiIUIApBCGopAwA3AwAgA0GIAmoiFSAKQRBqKQMANwMAIANBkAJqIhYgCkEYaikDADcDACADIAopAwA3A/gBIAMoArwCIRNBKEEIEIwgIgIgEzYCBCACIA82AgAgAiADKQP4ATcDCCACQRBqIBQpAwA3AwAgAkEYaiAVKQMANwMAIAJBIGogFikDADcDACADQQA2AqgBIAMgBSAHIAUgB0sbNgKkASADIAUgByAFIAdJGzYCoAEgAyACNgKUAUECIQIgA0ECNgKQASADIAUgASgCfCIHIAUgB0sbNgKcASADIAUgByAFIAdJGzYCmAEMDAsgAygCvAIhAgwMCyAJIAYpAgA3AgAgASgCKCECIAFBJTYCKCABIAEpA0A3A3ggCUEIaiAGQQhqKQIANwIAIAlBEGogBkEQaigCADYCACADIAI2ArgCIANBuAJqIhMQvwogEyABEOYEIAMoArwCIQIgAygCuAIiFUEHRg0DIANB+AJqIgcgCkEYaikDADcDACADQfACaiIWIA8pAwA3AwAgA0HoAmoiDyAUKQMANwMAIAMgCikDADcD4AJBKEEIEIwgIgUgAjYCBCAFIBU2AgAgBSADKQPgAjcDCCAFQRBqIA8pAwA3AwAgBUEYaiAWKQMANwMAIAVBIGogBykDADcDACANQRhqIANBsAJqKQMANwIAIA1BEGogA0GoAmopAwA3AgAgDUEIaiAMKQMANwIAIA0gAykDmAI3AgBBACECIANBADYCkAEgCyATQSQQ9gYaIAMgBTYCuAEMCgsgFyAEEOYLIANBKGogBBCfFCADQQ02AsACIANBpKLgADYCvAIgA0EwOgC4AiADKAIoIAMoAiwgA0G4AmoQ6xQhAgJAIAQQ4w0iBEUNACAEKAIAQSRHDQAgASABKQNANwN4IAEoAiggAUElNgIoQSRHDQUgASABKAIsEIIMCyADIAI2ApQBDAMLIAMpA6ACENYaDAkLIAEoAighAiABQSU2AiggASABKQNANwN4IANBnAFqIAZBCGopAgA3AgAgA0GkAWogBkEQaigCADYCACADIAYpAgA3ApQBIAMgAjYCkAEgA0GQAWoQvwogDiABKAJ8IgIgAiAOSxshCiAOIAIgAiAOSRshDCADKAKMASICQThsIQUgAkEBayEIIBpCIIinIQ4gGqchCyADKAKIASECIBFBAXEhDQNAIAVFBEACQCABLQD4AkECRgRAIAEtAPsCQQFxDQELQQAhAiABLQCQA0EBcUUNCAtBACECIAQQ4w0iBEUNByAEKAIAQRdHDQcgASgCKCECIAFBJTYCKCABIAEpA0A3A3ggA0GcAWogBkEIaikCADcCACADQaQBaiAGQRBqKAIANgIAIAMgBikCADcClAEgAyACNgKQASADQZABahC/CkEBIQIMBwsgAigCACEJAkACQCAIBEAgCUECRw0BIANBOGogAhCgDyADKAI8IQkgAygCOCEHIANBOzoAkAEgASAHIAkgA0GQAWoQvBkMAQsgCUECRw0AIAIoAgQoAgANASANRQ0AIANBOjoAkAEgASALIA4gA0GQAWoQvBkLIAJBOGohAiAIQQFrIQggBUE4ayEFDAELCyADQTBqIAIQoA8gAygCNCECIAMoAjAgA0HtADoAkAEgAiADQZABahDrFCECIAQQ4w0iBEUNBCAEKAIAQSRHDQQgASABKQNANwN4IAEoAiggAUElNgIoQSRHDQMgASABKAIsEIIMDAQLIAMgAjYClAEgB0UNBQsgA0GYAmoQyhYgAygClAEhAgwGC0G54+AAQShBtKLgABDaFwALQbnj4ABBKEGUouAAENoXAAsgAEEHNgIAIAAgAjYCBCADQYQBahDvJgwSCyAAIAMpAoQBNwIEIAAgAjoAHCAAQQA2AhggACAMNgIUIAAgCjYCECAAQQM2AgAgAEEMaiADQYwBaigCADYCAAwRCyADKQOgAhDWGgwBCyADKAKUASEHIANByAFqIBlBMBD2BhogAygChAEgCEYEQCADQYQBahD3FiADKAKIASEQCyAQIBJqIgUgAjYCACAFQQRqIAc2AgAgBUEIaiADQcgBakEwEPYGGiADIAhBAWoiCDYCjAEgBBDjDSICBEAgAigCAEEORg0DCyAEEOMNIgIEQCACKAIAQRBGDQILIANBmAFqIAQQ5gsgA0EYaiAEEJ8UIANB2LzgADYClAEgA0E0OgCQASADKAIYIAMoAhwgA0GQAWoQ6xQhAiAEEOMNIgRFDQAgBCgCAEEkRw0AIAEgASkDQDcDeCABKAIoIAFBJTYCKEEkRw0FIAEgASgCLBCCDAsgAEEHNgIAIAAgAjYCBCADQYQBahDvJgwOCyALIAYpAgA3AgAgASgCKCECIAFBJTYCKCABIAEpA0A3A3ggC0EIaiAGQQhqKQIANwIAIAtBEGogBkEQaigCADYCACADIAI2ApABIANBkAFqEL8KIAQQ4w0iAg0BCyASQThqIRIMAQsLQQEgESACKAIAQQ5GIgIbIREgASkDeCAaIAIbIRoMAQsLQbnj4ABBKEHQpOAAENoXAAsgASgCLCEBIABBBzYCACAAIAE2AgQMBwtBuePgAEEoQdz83wAQ2hcAC0G54+AAQShBzPzfABDaFwALIAMoApQBIQULIABBBzYCACAAIAU2AgQgA0HgAGoQ7iYMBQtBuePgAEEoQbz83wAQ2hcAC0G54+AAQShBnP3fABDaFwALIANBnAFqIAQQ5gsgAyAEEJ8UIANBHDYCmAEgA0Gs/d8ANgKUASADQTA6AJABIAMoAgAgAygCBCADQZABahDrFCECAkAgBBDjDSIERQ0AIAQoAgBBJEcNACABIAEpA0A3A3ggASgCKCABQSU2AihBJEYEQCABIAEoAiwQggwMAQtBuePgAEEoQcj93wAQ2hcACyAAQQc2AgAgACACNgIEDAILIANB4ABqEIomDAELIAAgAykCYDcCBCAAIAI6ABwgAEEANgIYIABBATYCACAAQQxqIANB6ABqKAIANgIAIAAgDCABKAJ8IgEgASAMSRs2AhQgACAMIAEgASAMSxs2AhALIANBgANqJAALxCsCF38BfiMAQYADayIDJAACQCABQShqIgQQyA0iBkUEQCABKAKAAiEBIANBADoAkAEgASABIANBkAFqEOsUIQEgAEEHNgIAIAAgATYCBAwBCwJAAkACQAJAAkACQAJAAkACQAJAAkACQCAGKAIAIgZBC2sOAwEJAgALIAZBAkcEQCAGQSRHDQkgASABKQPgAjcDmAMgASgCyAIgAUElNgLIAkEkRw0IIAEoAswCIQEgAEEHNgIAIAAgATYCBAwMCyADQcgBaiABIAIQlgQgAAJ/IAMtANwBQQJHBEAgA0GsAWogA0HgAWopAwA3AgAgA0GkAWogA0HYAWopAwA3AgAgA0GcAWogA0HQAWopAwA3AgAgAyADKQPIATcClAEgAEEEaiADQZABakEkEPYGGkEADAELIAAgAygCyAE2AgRBBws2AgAMCwsgBBClICEMIAQQyA0iAkUEQCABKAKAAiEBIANBADoAkAEgASABIANBkAFqEOsUIQEgAEEHNgIAIAAgATYCBAwLCyACKAIAQSRGBEAgASABKQPgAjcDmAMgASgCyAIgAUElNgLIAkEkRw0GIAEoAswCIQEgAEEHNgIAIAAgATYCBAwLCyABKALIAiECIAFBJTYCyAIgASABKQPgAjcDmAMgA0GcAWogAUHUAmopAgA3AgAgA0GkAWogAUHcAmooAgA2AgAgAyABKQLMAjcClAEgAyACNgKQASADQZABaiICEL4KIANBADYCaCADQoCAgICAATcCYCABQcwCaiEGIAJBBHIhCSADQdABaiEOIANBmAFqIQpBACECAkADQCACIA1yRSACQf7/e0tyIQhBACEFAkACfwJAAkACQANAIAQQyA0iC0UNASADQQA2AuACIAMgCzYC5AIgA0HgAmoQpiMgBBDIDSILBEAgCygCAEEMRg0DCyAIRQRAIANBOzoAkAEgASACIA0gA0GQAWoQqRkLAkAgBBDIDSILRQ0AIAsoAgBBEEcNACAJIAYpAgA3AgAgASgCyAIhCyABQSU2AsgCIAEgASkD4AI3A5gDIAlBCGogBkEIaikCADcCACAJQRBqIAZBEGooAgA2AgAgAyALNgKQASAFQQFqIQUgA0GQAWoQvgoMAQsLIAUEQCADIAU2ArgBIANBBzYCkAEgA0HgAGogA0GQAWoQgwkLIAQQpSAhBSAEEMgNIggEQCAIKAIAQQdGDQMLIANBkAFqIAEQ5QQgAygClAEhBSADKAKQASIIQQdGDQsgDiAKKQMANwMAIA5BGGogCkEYaikDADcDACAOQRBqIApBEGopAwA3AwAgDkEIaiAKQQhqKQMANwMAIAMgBTYCzAEgAyAINgLIASADQeAAaiADQcgBahDiGUEADAMLIAEoAoACIQIgA0EAOgCQASADIAIgAiADQZABahDrFDYC5AIgA0EBNgLgAiADQeACahCmIwsgBBDIDSICRQ0CIAIoAgBBDEcNAiABKALIAiECIAFBJTYCyAIgASABKQPgAjcDmAMgA0GcAWogBkEIaikCADcCACADQaQBaiAGQRBqKAIANgIAIAMgBikCADcClAEgAyACNgKQASADQZABahC+CiABLQCgAkECRgRAIAEtAKMCQQFxDQULQQAhAiABLQC4AkEBcQ0EDA4LIAkgBikCADcCACABKALIAiECIAFBJTYCyAIgASABKQPgAjcDmAMgCUEIaiAGQQhqKQIANwIAIAlBEGogBkEQaigCADYCACADIAI2ApABIANBkAFqIg8QvgogASgCnAMhAiAPIAFBABBPIAMoApABIg1BB0YNByADQcACaiIHIApBCGopAwA3AwAgA0HIAmoiESAKQRBqKQMANwMAIANB0AJqIhIgCkEYaikDADcDACADIAopAwA3A7gCIAMoApQBIRAgASgCnAMhC0EoQQgQjCAiCCAQNgIEIAggDTYCACAIIAMpA7gCNwMIIAhBEGogBykDADcDACAIQRhqIBEpAwA3AwAgCEEgaiASKQMANwMAIANBADYCqAEgAyAFIAIgAiAFSRs2AqQBIAMgBSACIAIgBUsbNgKgASADIAUgCyAFIAtLGyINNgKcASADIAUgCyAFIAtJGyICNgKYASADIAg2ApQBIANBAjYCkAEgA0HgAGogDxDiGUEBCyAEEMgNIggEQCAIKAIAQQxGDQILAkAgBBDIDSIIBEAgCCgCAEEQRg0BCyADQZgBaiAEEIAQIANBEGogBBDqEyADQdi84AA2ApQBIANBNDoAkAEgAygCECADKAIUIANBkAFqEOsUIQUgBBDIDSICRQ0IIAIoAgBBJEcNCCABIAEpA+ACNwOYAyABKALIAiABQSU2AsgCQSRHDQYgASABKALMAhD7CwwICyAJIAYpAgA3AgAgASgCyAIhCCABQSU2AsgCIAEgASkD4AI3A5gDIAlBCGogBkEIaikCADcCACAJQRBqIAZBEGooAgA2AgAgAyAINgKQASADQZABaiIQEL4KRQ0BIAQQyA0iBUUNASAFKAIAQQxHDQEgASgCnAMhBSABKAKYAyEIIANBOjoAkAEgASAIIAUgEBCpGQwBCwsgA0GYAWogBBCAECADQQhqIAQQ6hMgA0Hg3N8ANgKUASADQTQ6AJABIAMoAgggAygCDCADQZABahDrFCEFIAQQyA0iAkUNBSACKAIAQSRHDQUgASABKQPgAjcDmAMgASgCyAIgAUElNgLIAkEkRw0CIAEgASgCzAIQ+wsMBQtBACECIAQQyA0iBEUNCSAEKAIAQRdHDQkgASgCyAIhAiABQSU2AsgCIAEgASkD4AI3A5gDIANBnAFqIAZBCGopAgA3AgAgA0GkAWogBkEQaigCADYCACADIAYpAgA3ApQBIAMgAjYCkAEgA0GQAWoQvgpBASECDAkLIANBADoAUyADIAEpAaoCNwBDIAMgASkAuwI3AFQgAyABKADDAjYAXCADIAFBsgJqIgIpAQA3AEsgA0H5AGogAUG/AmopAAA3AAAgA0H0AGogAUG6AmopAQA3AgAgA0HsAGogAikBADcCACADIAEpAaoCNwJkIAQgA0HDAGoQyAggAyABNgJgIAQQpSAhDiAEEMgNIgJFBEAgASgCgAIhASADQQA6AJABIAEgASADQZABahDrFCEBIABBBzYCACAAIAE2AgQMCAsCQCACKAIAQSRGBEAgASABKQPgAjcDmAMgASgCyAIgAUElNgLIAkEkRg0BQbnj4ABBKEHApOAAENoXAAsgASgCyAIhAiABQSU2AsgCIAEgASkD4AI3A5gDIANBnAFqIAFB1AJqKQIANwIAIANBpAFqIAFB3AJqKAIANgIAIAMgASkCzAI3ApQBIAMgAjYCkAEgA0GQAWoiAhC+CiADQQA2AowBIANCgICAgIABNwKEASABQcwCaiEGIAJBBHIhCyADQbgCakEEciEJIANBxAJqIRcgA0G8AmohDSADQcACaiEKIANBoAJqIQwgA0GgAWohGCADQZgBaiEZQQghEANAIAhBOGwh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AgAgAygCBCADQZABahDrFCECAkAgBBDIDSIERQ0AIAQoAgBBJEcNACABIAEpA+ACNwOYAyABKALIAiABQSU2AsgCQSRGBEAgASABKALMAhD7CwwBC0G54+AAQShByP3fABDaFwALIABBBzYCACAAIAI2AgQMAgsgA0HgAGoQ7yQMAQsgACADKQJgNwIEIAAgAjoAHCAAQQA2AhggAEEBNgIAIABBDGogA0HoAGooAgA2AgAgACAMIAEoApwDIgEgASAMSRs2AhQgACAMIAEgASAMSxs2AhALIANBgANqJAALwCoDHn8CfgF8IwBBoARrIgIkACAAIAEQnhogAkHYAGogAUGIAWoiAygCADYCACADQQA2AgAgASkCgAEhICABQoCAgICAATcDgAEgASkCjAEhISABQoCAgIDAADcCjAEgAUGUAWoiAygCACEGIANBADYCACACQegAaiAGNgIAIAIgIDcDUCACICE3A2AgAUGMAWohCiABQYABaiEMIABBDGohEyAAKAIQIgcgACgCFEHYAGxqIRQgAkGoAmohFSACQbwDaiERIAJBmAFqIRYDQAJAAkACQAJAAkACQCAUIAciA0cEQCADQdgAaiEHAkAgAygCACIGQQRrQQAgBkEFa0EISRtBAWsOCAcGBQQICAMCAAsgAygCSEEGdCEXIAMoAkQhGkEAIQgDQAJAAn8CQCAIIBdHBEAgCCAaaiIGKAIAQQdHDQMgBkEIaiEJIAZBHGoiEi0AAEECRwRAIAJBQGsgCSkDACAGQRhqKAIAEKQjIAIoAkghBCACKQNAISAgAkHIA2oiDSAJELUbQQAhCyACQQA2ApADIAIgAikD0AM3A6ADIAIgAikDyAM3A5gDIBYgCRC1GyACQRo2ApABIAJBsANqIAkQtRtBACEFIAZBIGooAgAiDwRAENkiIQUgDykCBCEhENUiIQ4gDSAPKAIAEKcBIA4gDUHYABD2BiENIAUgITcCBCAFIA02AgALIAJB0ANqIBFBCGooAgA2AgAgAiARKQIANwPIAyACKAK4AyENIAIoArQDIQ8gAigCsAMhECACQZADaiACQZABahCmBAwDCyAJKAIAIgsoAgBFDQEgAkEBNgLMAyACQey03wA2AsgDIAJCADcC1AMgAiACQZADajYC0AMgAkHIA2pB9LTfABChHQALIAMoAkQiBiAD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AsgDIAIgBCALaiIDNgLMAyACQcgDahDVCiIIQYCAxABGDQIgCBDPEUUNAgNAIAJByANqENUKIghBgIDEAEYNBSAIENARDQALDAILIBIgB0EQahC1ISACQQA2AugBDAQLIAJByANqIgMgC0EBahC2EiADQd8AEPcHIAMgBCALENYdDAELIAJByANqIAtBAmoQthIgAiADNgKkAiACIAQ2AqACQQAhBQNAIAJBoAJqENUKIgNBgIDEAEYEQCACKALQAyIIRQRAIAJByANqQd8AEPcHIAIoAtADIQgLIAIoAswDIgMgCBDcGUUNAiACQYQDaiIFIAhBAWoQthIgBUHfABD3ByAFIAMgCBDWHSACKALIAyADEKckIAJB0ANqIAJBjANqKAIANgIAIAIgAikChAM3A8gDDAILAkAgBUEBcQ0AIAMQzxFFDQAgAkHIA2ogAxD3B0EBIQUMAQsgAxDQEUUNACACQcgDaiADEPcHDAALAAsgAikCzAMhICACKALIAyIDQYCAgIB4Rg0AIAIoApADIAIoApQDEKckIAIgAzYCkAMgAiAgNwKUAyAgQiCIpyELICCnIQQLIAQgC0HfABCZC0UEQCACQQE2AswDIAJB0MHfADYCyAMgAkIBNwLUAyACQT42AoADIAIgAkH8Amo2AtADIAIgAkGQA2o2AvwCIAJBoAJqIAJByANqEPgUIAIoApADIAIoApQDEKckIAJBmANqIAJBqAJqKAIANgIAIAIgAikCoAI3A5ADCyACQdADaiACQZgDaigCADYCACACIAIpA5ADNwPIAyACQcgDaiIDEIsZISAgAiANNgKYAiACIBc2ApQCIAIgFjYCkAIgAkEAOgCcAiACICA3A4gCIAJBIGogICANEKQjIA8gAikDICACKAIoEOIYIAdBDGoQ9h4hCCACQaACaiIEIAJBiAJqIgUQtRsgAyAEEJ4PIAcoAgwQ8wIgBygCDCADQTAQ9gYiA0EAOgA8IAMgCDYCOCADQgA3AzAgAyACLwCgAjsAPSADQT9qIAJBogJqLQAAOgAAIAcpAhAhICAFEO0UIQMgAiAgNwPwASACIAM2AuwBIAJBAzYC6AELIAcoAjwhAyAHQQA2AjwgAwRAIAJByANqIgcgA0HAABD2BhogAkGAAWogAkHoAWogBxCmBBCyGyADEPAqDAILQcC13wAQvCkACyACQRhqIAcQxBYgAikDGCEgIAJByANqIAdB2AAQ9gYaIAcgIDcCBCAHQQo2AgACQCACKALIAyIEQQRNBEAgAkGgAmogFUHUABD2BhoMAQsgAkHIA2oQqQlBBSEECyACKAKQAUEFRwRAIAJBkAFqEMMfCyACIAQ2ApABIBQgAkGgAmpB1AAQ9gYaIAMhCQwACwALIAJB8ABqEM4mIAJBsANqEPMiDAMLIAAoAhRB2ABsIQggACgCEEHYAGshCgJAA0AgCCIDRQ0BIANB2ABrIQggCkHYAGoiCigCAEEESw0ACyAKIAJB8ABqEOMDCyACQcgDaiIGIBMQuhkgAiARNgLkAyACIAw2AuADIAIgDDYC3AMgAiAMIA5BBHRqNgLoAyAGEOwGIAJCiICAgIABNwLIAyACQdwDaiEGIAIoAtADIQkCQCACKALYA0UEQCAJIAYQ7AcMAQsgCSACKALUAyAGEOcFRQ0AIAICfyACKALoAyIKIAIoAuADIglGBEAgCgwBCyACQcgDaiAKIAlrQQR2EJcRIAIoAtADIAIoAtQDIAYQ5wVFDQEgAigC4AMhCiACKALoAwsgCmtBBHZBCEHYABClFCACQQA2ApgBIAIgAikDADcCkAEgAkGQAWogBhDsByACIAIoApABNgKoAiACIAIoApQBIgk2AqACIAIgCTYCpAIgAiAJIAIoApgBIgdB2ABsajYCrAIgBwRAIAJByANqIAcQlxEgAigC0AMgAigC1AMgAkGgAmoQgQsLIAJBoAJqEPQGCyACQcgDahDMFCAGEP0WIAMNAiACQfAAagwBCyACQcgDaiIDIBMQuhkgAiARNgLkAyACIAw2AuADIAIgDDYC3AMgAiAMIA5BBHRqNgLoAyADEOwGIAJCiICAgIABNwLIAyACQdwDaiEDIAIoAtADIQYCQCACKALYA0UEQCAGIAMQ7AcMAQsgBiACKALUAyADEOcFRQ0AIAJBCGoCfyACKALoAyIKIAIoAuADIgZGBEAgCgwBCyACQcgDaiAKIAZrQQR2EJcRIAIoAtADIAIoAtQDIAMQ5wVFDQEgAigC4AMhCiACKALoAwsgCmtBBHZBCEHYABClFCACQQA2ApgDIAIgAikDCDcCkAMgAkGQA2ogAxDsByACIAIoApADNgKoAiACIAIoApQDIgY2AqACIAIgBjYCpAIgAiAGIAIoApgDIglB2ABsajYCrAIgCQRAIAJByANqIAkQlxEgAigC0AMgAigC1AMgAkGgAmoQgQsLIAJBoAJqEPQGCyACQcgDahDMFCADEP0WIARBBUcNASACQYABagsQziYLIABBMGogARDDJSACQaAEaiQADwsgAygCCEEFRwRAIANBCGogARD9IQsgA0E8aiABEMMlIANBMGogARCeGgwFCyABIANBBGoQ4gYMBAsgA0EkaiABEMMlIANBLGogARCeGgwDCyADQQhqIAEQ/SEgA0E8aiABEMMlIANBMGogARCeGgwCCyADQSBqIAEQ+ywMAQsgA0EIaiABEP0hIANBMGogARD7LAwACwALjSwCF38IfiMAQeACayIDJAACQAJAIAIoAgQiBSACKAIIIgRB//0DEJkLRQ0AQQMgBEG0v9gAENogGgJAIARBBE8EQCAFLAADQb9/Sg0BDAMLIARBA0cNAiACQQA2AggMAQsgAkEANgIIIAUgBUEDaiAEQQNrIgQQuC0aIAIgBDYCCAtBFEEEEIwgIhBCgYCAgBA3AgAgECACKQIANwIIIBBBEGogAkEIaigCADYCACABIAEoAgAiAkEBajYCACADIAE2AjQCQCACQQBIDQAgASILKAIIIhdBAkYEQCAAKAJQIhggACgCVEEYbGohDSADQckBaiEVIANBqQJqIREgASgCFCEPIAEoAhAhEgJAA0AgGCANIgpHIhlFBEAgA0GgAmogEiAPEN8TDAILIApBEGsoAgAhAkEAIQkgDwRAIBItAABBL0YhCQsgCkEUaygCACEEIApBGGshDSADIAIEfyAELQAAQS9GBUEACzoA3gFBBiEFIANBBjoAyAEgAyACNgLEASADIAQ2AsABIANBgAQ7AdwBQQAhCEECIQsgDyEEIBIhBgJAA0AgBUH/AXEiDkEGRiITRQRAIANBtwFqIANB3wBqKAAANgAAIANBsAFqIANB2ABqKQAANwMAIAMgAykAUDcDqAELIBEgAykDqAE3AAAgEUEIaiIUIANBsAFqKQMANwAAIBFBD2oiFiADQbcBaigAADYAACADIAU6AKgCIAMgBDYCpAIgAyAGNgKgAiADIAk6AL4CIAMgCzoAvQIgAyAIOgC8AiADQegAaiADQaACahCBAyADQYgBaiADQcABahCBAyADLQCIASECAkACQAJAIAMt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DQIMAQsgBCAFRw0BIAcgBiAEEIoVDQELIANB2ABqIBQpAAA3AwAgA0HfAGogFigAADYAACADIBEpAAA3A1AgAy0AvgIhCSADLQC9AiELIAMtALwCIQggAy0AqAIhBSADKAKkAiEEIAMoAqACIQYMAQsLQQAhBwsgB0UNAAsgA0GgAmogCkEIaygCACAKQQRrKAIAIAcgBBDTBwsgA0HIAWoiAiADQagCaigCADYCACADIAMpAqACNwPAAUHQAEEEEIwgIgtBAjYCCCALQoGAgIAQNwIAIAsgAykDwAE3AgwgC0EUaiACKAIANgIACyAAQeAAahC6HyEMIAAgACgCgAEiBiAQKAIQakEBajYCgAEgA0H4AWpCADcDACADQfABakIANwMAIANB6AFqQgA3AwAgA0IANwPgASADQvPK0cunjNmy9AA3A9gBIANCg9+R85bM3LfkADcD0AEgA0Lh5JXz1uzZvOwANwPIASADQvXKzYPXrNu38wA3A8ABIANBwAFqIgIgECgCDCISIBAoAhAiBxDlCCADQSBqIAIQrAkgA0EoaikDACEaIAMpAyAhGyADQdgCakIANwMAIANB0AJqQgA3AwAgA0HIAmpCADcDACADQgA3A8ACIANC88rRy6eM2bL0ADcDuAIgA0KD35Hzlszct+QANwOwAiADQuHklfPW7Nm87AA3A6gCIANC9crNg9es27fzADcDoAIgCyADQaACaiICELkEIANBEGogAhCsCSADQRhqKQMAIRwgAykDECEeQQQQzSAiAiAGNgIAIANBATYCsAEgAyACNgKsASADQQE2AqgBIANBADYCcCADQoCAgIDAADcCaCADQQA2ApABIANCgICAgMAANwKIASAAQYABaiEOIAYgB2ohD0EEIQ1BACEJQQAhAgNAAkACQCADQYgBagJ/AkACQAJAAkACQAJAAkACQAJAAkACQCACIAdJBEAgAiASaiIFLQAAIgRBIEkNAUEBIQggBEH+AE0NDSACQQAgBMBBv39MGw0CAkACQCAEwEEATg0AIAUtAAFBP3EhCiAEQR9xIQgCQCAEQd8BTQRAIAhBBnQgCnIhBAwBCyAFLQACQT9xIApBBnRyIQogBEHwAUkEQCAKIAhBDHRyIQQMAQsgCEESdEGAgPAAcSAFLQADQT9xIApBBnRyciIEQYCAxABGDQYLIARB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EMoUIAIpAygiF1ANACACKAIwIQQgAiAXNwPgAiACIAQ2AugCIAJBiANqIAJB4AJqEOkJBEAgAikD4AIQ1hoMAgUgAkHIAmogFxC3CQwCCwALC0IAENYmIAJB2AFqEJwUCyACKAKABEGBgICAeEcEQCACQdgBaiAPQTAQ9gYaA0AgAkEYaiACQdgBahDKFCACKQMYIhdQRQRAIAJByAJqIBcQtwkMAQsLQgAQ1iYgAkHYAWoQnBQLIA0gAykDADcDACACIAIpA8gCNwPYASACQYgDahDnCiACQbgCaiACQdgBahCdByACQbACaiACQcACaikCADcDACACIAIpArgCNwOoAgJAIAEoAhwiBEUNACACQagCahCXEyEHIA4oAgAiBSkDACAHIARBAWpBAXYgBCACKAK0AhsgFBDcISAFQQhqIQNCf4VCgIGChIiQoMCAf4MhFwNAIBdQRQRAIAcgBSAXeqdBAXRB8AFxa0EQaykDABDaGhC3CSAEQQFrIQQgF0IBfSAXgyEXDAELIARFDQEgBUGAAWshBSADKQMAQn+FQoCBgoSIkKDAgH+DIRcgA0EIaiEDDAALAAsgAkEANgK4AyAIIBg3AwAgAiAZNwOoAyACQawBaiACQZgCaiASIAJBqANqIgMgDiACQagCaiACKAKsAiACKAKoAhsQrgEgAxDCCCABKAIARQ0BIAEgAigCpAIQpCkgAigCmAIiAykDACEXIAIoApwCIQQgAiACKAKkAjYC8AEgAiADNgLoASACIAMgBGpBAWo2AuQBIAIgA0EIajYC4AEgAiAXQn+FQoCBgoSIkKDAgH+DNwPYAQNAIAJBEGogAkHYAWoQohUgAigCECIDRQ0CIAIgAigCFCIENgKIAyACIAMpAwAgA0EIaigCABCkIyACQagDaiIFIAEgAikDACACKAIIEPUGIAIpA6gDUA0HIAUgBCkDABDaGhDZCwwACwALIAMgARClIiABIAZBKGoQhSQgACEDDAQLIA0gESkDADcDACACIAIpA5gCNwPYASACQagCahD+JyACQawBahDKHyACKALkAQRAIAJBADYCsAMgAkKAgICAgAE3AqgDIAIgATUCQCABMQBGQjCGIAExAEVCKIaEIAExAERCIIaEhDcCtAMgAiACQdgBajYCvAMgBigCCCAGQQxqKAIAIAJBqANqIgMQmSYg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NwNwIAIgCDYCeCACQZABaiABQZABahCqBkEGIQQgAS0APEEGRwRAIAEpAwghDSACQeABaiABQRBqEJgVIAIgDTcD2AEgAkGgAWogAkHYAWpBNBD2BhogAkGeAWogAkGPAmotAAA6AAAgAiACLwCNAjsBnAEgAi0AjAIhBAsgAyAFNgIEIAMgBzYCACADQQhqIAJBoAFqQTQQ9gYaIAMgBDoAPCADIAIvAZwBOwA9IANBP2ogAkGeAWotAAA6AAAgA0FAayACQUBrQdAAEPYGGiADQZgBaiACQZgBaigCADYCACADIAIpA5ABNwOQASAAQSc2AgAgACADNgIEDA8LIAEpAxAhDSABKQMYIQ4gAkFAayIEIAFBBGoQqgYgAiAONwJUIAIgDTcCTCACIAEpAyA3AlwgAEEEaiAEQSQQ9gYaIABBKDYCAAwOCyACQUBrIAFBBGoQ5x0gAEEpNgIAIABBDGogAkHIAGopAgA3AgAgACACKQJANwIEDA0LIAEpAwghDSABQQRqENgcIQEgACANNwMIIAAgATYCBCAAQSo2AgAMDAsgAkFAayABQQRqENMiIABBKzYCACAAQQxqIAJByABqKAIANgIAIAAgAikCQDcCBAwLCyACQUBrIAFBBGoQ5x0gAEEsNgIAIABBDGogAkHIAGopAgA3AgAgACACKQJANwIEDAoLIAJBQGsgAUEEahDoHSAAQS02AgAgAEEMaiACQcgAaikCADcCACAAIAIpAkA3AgQMCQsgAkFAayABQQRqEOcdIABBLjYCACAAQQxqIAJByABqKQIANwIAIAAgAikCQDcCBAwICyACQUBrIAFBCGoQtSEgAEEvNgIAIABBEGogAkHIAGopAwA3AwAgACACKQNANwMIDAcLIAJBQGsgAUEEahDIByAAQTA2AgAgAEEMaiACQcgAaikCADcCACAAIAIpAkA3AgQMBgsgAEExNgIAIAAgASkCBDcCBAwFCwALIAIoAkwhCCACKAJIIQUgAigCQCEJIAIoAkQMAgsgAkFAayABQQRqENMiIAIoAkghBSACKAJAIQkgAigCRAwBCyACQZgCaiACQdQAaikCADcDACACIAIpAkw3A5ACIAIoAkghCCACKAJEIQUgAigCXCEGIAIpA2AhDSACKAJACyEHIAFBOGoQ2BwhASAAIAg2AhAgACAFNgIMIAAgBzYCCCAAIAk2AgQgACAENgIAIAAgCjoAPCAAIAE2AjggACALNgI0IAAgDDYCMCAAIA03AyggACAGNgIkIAAgAikDkAI3AhQgAEEcaiACQZgCaikDADcCAAsgAkGgAmokAAugLgEBfyMAQRBrIgIkAAJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCACIALQAAQQFrDroBAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f4ABgQGCAYMBhAGFAYYBhwGIAYkBigGLAYwBjQGOAY8BkAGRAZIBkwGUAZUBlgGXAZgBmQGaAZsBnAGdAZ4BnwGgAaEBogGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwG4AbkBugEACyABKAIUQfL22QBBAyABKAIYKAIMEQMADLoBCyABKAIUQfX22QBBDiABKAIYKAIMEQMADLkBCyABKAIUQYP32QBBEyABKAIYKAIMEQMADLgBCyABKAIUQZb32QBBHyABKAIYKAIMEQMADLcBCyABKAIUQbX32QBBEyABKAIYKAIMEQMADLYBCyABKAIUQcj32QBBFiABKAIYKAIMEQMADLUBCyABKAIUQd732QBBGCABKAIYKAIMEQMADLQBCyABKAIUQfb32QBBFiABKAIYKAIMEQMADLMBCyABKAIUQYz42QBBECABKAIYKAIMEQMADLIBCyABKAIUQZz42QBBDCABKAIYKAIMEQMADLEBCyABKAIUQaj42QBBFyABKAIYKAIMEQMADLABCyABKAIUQb/42QBBECABKAIYKAIMEQMADK8BCyABKAIUQc/42QBBDSABKAIYKAIMEQMADK4BCyABKAIUQdz42QBBDyABKAIYKAIMEQMADK0BCyABKAIUQev42QBBECABKAIYKAIMEQMADKwBCyABKAIUQfv42QBBHCABKAIYKAIMEQMADKsBCyABKAIUQZf52QBBHCABKAIYKAIMEQMADKoBCyABKAIUQbP52QBBCyABKAIYKAIMEQMADKkBCyABKAIUQb752QBBCyABKAIYKAIMEQMADKgBCyABKAIUQcn52QBBFSABKAIYKAIMEQMADKcBCyABKAIUQd752QBBDSABKAIYKAIMEQMADKYBCyABKAIUQev52QBBCyABKAIYKAIMEQMADKUBCyABKAIUQfb52QBBECABKAIYKAIMEQMADKQBCyACIABBAWo2AgwgAUGG+tkAQQ1Bk/rZAEEFIAJBDGpBEhDCCwyjAQsgASgCFEGY+tkAQRMgASgCGCgCDBEDAAyiAQsgASgCFEGr+tkAQQ8gASgCGCgCDBEDAAyhAQsgASgCFEG6+tkAQRggASgCGCgCDBEDAAygAQsgASgCFEHS+tkAQRIgASgCGCgCDBEDAAyfAQsgASgCFEHk+tkAQRUgASgCGCgCDBEDAAyeAQsgAiAAQQhqNgIMIAFB+frZAEEUQY372QBBBCACQQxqQYcDEMILDJ0BCyABKAIUQZH72QBBEiABKAIYKAIMEQMADJwBCyABKAIUQaP72QBBDyABKAIYKAIMEQMADJsBCyABKAIUQbL72QBBDSABKAIYKAIMEQMADJoBCyACIABBBGo2AgwgAUG/+9kAQQ5BzfvZAEEBIAJBDGpB/QQQwgsMmQELIAEoAhRBzvvZAEEQIAEoAhgoAgwRAwAMmAELIAEoAhRB3vvZAEEUIAEoAhgoAgwRAwAMlwELIAIgAEEEajYCDCABQfL72QBBGkGM/NkAQQggAkEMakHcARDC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IQQgAkG4A2oiAxC7ESACIAQ2ArACIAJBADoAtAIgAiACLQD1AzoAtQIgAiACLwH2AzsBtgIgAkH4AWoiBCADQSwQ9gYaIAJBrAJqIAJB7ANqKAIANgIAIAIgAikC5AM3AqQCIAAoAiAgBBCvAyACQcwBaiIFIARBLBD2BhogAkGkAmoQ8yIgBRCuCCACQcACakHYluMAKQMAIgs3AwAgAkHQluMAKQMAIgw3A7gCIAJByAJqIAFBIGoQ4gggAkHAA2oiBSALNwMAIAIgDDcDuAMgByADEPQiIAJBkANqIAUpAwA3AwAgAiACKQO4AzcDiAMgAkHIA2oiBSALNwIAIAJB2ANqIgYgCzcCACACIAw3AsADIAIgDDcC0AMgAkEAOgDgAyACQQA2ArgDIAMgBxCHIyACQYACaiAFKQIAIg43AwAgAkGQAmogBikCACINNwMAIAJBsANqIA03AwAgAiACKQLAAyINNwP4ASACIAIpAtADIg83A4gCIAJBoANqIA43AwAgAiAPNwOoAyACIA03A5gDIAMgAkGIA2oQ0gsgAkHwA2oiBSACQagDahDSCyACIAJBmANqNgLoAyACQeACaiALNwMAIAIgDDcD2AIgBCADEL4OIAJB2AJqIAIoAvgBIAJB6AJqENwhIAIoAtgDQYGAgIB4RwRAIAQgA0EwEPYGGgNAAkAgAkEwaiACQfgBahDKFCACKQMwIgtQDQAgAigCOCEDIAIgCzcD8AIgAiADNgL4AiACQZgDaiACQfACahDpCQRAIAIpA/ACENYaBSACQdgCaiALELcJCwwBCwtCABDWJiACQfgBahCcFAsgAigCkARBgYCAgHhHBEAgAkH4AWogBUEwEPYGGgNAIAJBIGogAkH4AWoQyhQgAikDICILUEUEQCACQdgCaiALELcJDAELC0IAENYmIAJB+AFqEJwUCyACQYACaiACQeACaikDADcDACACIAIpA9gCNwP4ASACQZgDahDnCiACQcgCaiACQfgBahCdByACQbADaiACQdACaikCADcDACACIAIpAsgCNwOoAwJAIAEoAhwiBUUNACACQagDahCXEyEGIAgoAgAiBCkDACAGIAVBAWpBAXYgBSAGKAIMGyAGQRBqENwhIARBCGohA0J/hUKAgYKEiJCgwIB/gyELA0AgC1BFBEAgBiAEIAt6p0EBdEHw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FSACKAJwIgNFDQIgAiACKAJ0IgQ2AogDIAJB4ABqIAMpAwAgA0EIaigCABCkIyACQbgDaiIFIAEgAikDYCACKAJoEPUGIAIpA7gDUA0MIAUgBCkDABDaGhDZCwwACwALIABBIGogARCdLQwJCyACQYACaiACQcACaikDADcDACACIAIpA7gCNwP4ASACQagDahD+JyACQcwBahDKHyAJDQUMBgsgAEEEaiABEJwtDAcLIABBBGogARCcLQwGCyAAKAIEIgAoAihBMGwhAyAAKAIkIQQDQCADRQ0GIARBKGogARCYJiADQTBrIQMgBEEwaiEEDAALAAsgACgCBCIALQBFQQNGDQQgAEEgaiEAA0AgAC0AJUECRgRAAkAgACgCCEE4bCEDIAAoAgQhAANAIANFDQEgACABEMMMIANBOGshAyAAQThqIQAMAAsACwUgACgCICEADAELCwwECyAIIAJBuAFqEMYGDAILIAggAkG4AWoQxgYLIAIoAoQCBEAgAkEANgLAAyACQoCAgICAATcCuAMgAiABNQJAIAExAEZCMIYgATEARUIohoQgATEAREIghoSENwLEAyACIAJB+AFqIgE2AswDIAEgBxD2BRogACgCICACQbgDaiIAEPQtIAAQ8CYLIAJB+AFqEMIKIAIpA7gBENYaDAELAkAgAigChAJFDQAgAkEANgLAAyACQoCAgICAATcCuAMgAiABNQJAIAExAEZCMIYgATEARUIohoQgATEAREIghoSENwLEAyACIAJB+AFqIgE2AswDIAEgBxD2BRogACgCICIFQQRqKAIAIAVBCGooAgAgAkG4A2oQuRwgBSgCECIBIAUoAhRB2ABsaiEHA0ACQAJAIAcgASIARwRAIABB2ABqIQECQAJAAkACQAJAAkAgACgCACIDQQRrQQAgA0EFa0EISRtBAWsOCAECAwQFCQgHAAsgACACQbgDahDbCgwICyAAQQhqIAJBuANqEIgjDAcLIAAoAiAgAkG4A2oQ9C0MBgsgACgCCCAAQQxqKAIAIAJBuANqIgMQmSYgACgCPCADEP8nIABBNGooAgAgAEE4aigCACADELkcDAULIAAoAiQgAkG4A2oiAxD/JyAAQTBqKAIAIABBNGooAgAgAxC5HAwECyAAKAIIIgMgACgCDEEobGohBgNAIAMgBkYNBCADQShqAkAC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A0HwAWoiCSkCADcCACADQYwDaiADQegBaiINKQIANwIAIAMgAykC4AE3AoQDIANBHDYCgAMgAyADQYADaiIPEL0oNgKMAiADQQI2AogCIAUoAgAhCyADKAKYASEOIAMoApwBIQggAyADKAKkATYCoAIgAyAKNgKYAiADIAogB0EFdGo2AqQCIAMgCjYCnAIgB0UNBiANIApBCGopAwA3AwAgCSAKQRBqKQMANwMAIAMgCkEgajYCnAIgAyAKKQMANwPgASADIAooABk2AtgCIAMgCkEcaigAADYA2wIgCi0AGCIHQQJGDQYgBCADKADbAjYAACADQZADaiIFIAkpAwA3AwAgA0GIA2oiBCANKQMANwMAIAMgAykD4AE3A4ADIAMgBzoAmAMgAyADKALYAjYAmQMgA0HAAmogDxC3DSADKQOAAyAFKQMAEPgsIAMoAsACQYCAgIB4Rg0GIANBsAJqIANByAJqIgYoAgA2AgAgAyADKQLAAjcDqAIgBCADQaACaikCADcDACADIAMpApgCNwOAAyADQQA2AqgDIANCADcDoAMgAyAIIAtBAnQiC2o2ApwDIAMgDjYCmAMgAyAINgKUAyADIAg2ApADIAMoAoQDIQcgAygCjAMhDCADQfkBaiIKQQNqIQ8DQAJAAkAgByAMRg0AIAMgB0EgaiIFNgKEAyAHLQAYIg5BAkYNACALDQEgBykDACAHKQMQEPgsCyADQYADahCGKSADQagCahCLGSEZIABBADYCACAAIBk3AwggA0GIAmoQ/R8MCQsgBiAHQQhqKQMAIhs3AwAgA0HQAmogB0EQaikDACIaNwMAIAMgCEEEaiIENgKUAyADIAcpAwAiGTcDwAIgAyAHKAAZNgK4AiADIAdBHGooAAA2ALsCIAgoAgAhByAJIBo3AwAgDSAbNwMAIAogAygCuAI2AAAgDyADKAC7AjYAACADIBk3A+ABIAMgDjoA+AEgA0HYAmogASAHEFgCQAJAAkACQCADKALYAiIODgIBAgALIAAgAykDiAI3AwAgAEEIaiADQZACaikDADcDACADQdgCahD9HyADKQPgASADKQPwARD4LCADQYADahCGKSADKAKoAiADKAKsAhC4KQwLCyADIAMpA+ACNwP4AiADQewCaiADQfgCahC3DSADKQP4AhDWGgwBCyADQewCaiADKwPg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aigCACACQegCahDqHAwBCyABQQRqKAIAIAJB6AJqEPUCCyAAKAIgIgAEQCAAQQRqKAIAIABBCGooAgAgAigC/AIQgRsLIAJB6AJqEPAmCyACQagBahDCCgwOCyAAQQhqIAEQpC0MDQsgACgCDEUNDCAAQQxqIAEQmi0MDAsgAEEEaiABEJotDAsLIABBBGogARCaLQwKCyAAQQhqEOQhDAkLIAAoAgQgARCkDAwICyAAQQRqIAEQyg8MBwsgAEEEaiABEJotDAYLIABBBGogARCaLQwFCyAAQQRqIAEQmi0MBAsgAEEEaiABEJotDAMLIABBBGogARCaLQwCCyAAQQRqIAEQmi0MAQsgAEEEaiABELocCyACQdADaiQADwsgAigC8AIhACACQQM2AowCIAJBuNLgADYCiAIgAkIDNwKUAiACQesENgK0AiACQesENgKsAiACQcUCNgKkAiACIAM2AqACIAIgAEEIazYCyAIgAiACQaACajYCkAIgAiACQbgCajYCsAIgAiACQcgCajYCqAIgAkGIAmpBwNPgABChHQALpCICHX8BfiMAQbACayICJAAgAkEwaiABKAIIIgNBBEEcEOcUIAJBADYCQCACIAIpAzA3AjggASgCACEFIAIgASgCBCIBIANBHGwiA2oiCzYCvAEgAiAFNgK4ASACIAE2ArABIAFBHGohByACQcgAaiERAkACQAJAAkACQAJAA0ACQAJAIAIgAwR/IAEoAgAiBUEIRw0BIAcFIAsLNgK0ASACQbABahCsFwJAAkACQCACKAJAIgUOAgQAAQsgAkEANgJAIAIoAjwiAygCACIBQQhGDQEgACABNgIAIAAgAykCBDcCBCAAQQxqIANBDGopAgA3AgAgAEEUaiADQRRqKQIANwIADAULIAIoAjwhAUEAIQMgAkEANgKYAiACQoCAgIDAADcCkAIgBUEcbCEEQQQhDQJAAkADQCAEBEAgASgCAEEBRw0CIAJBwAFqIAEoAgQgASgCCCIGEIAGIAItAMABIgVBAkcgBXNBAXFFDQICf0EBIAIoAsQBIgVBgAFJDQAaQQIgBUGAEEkNABpBA0EEIAVBgIAESRsLIAZHDQIgAUEcaiEBIAIoApACIAhGBEAgAkGQAmoQ5RYgAigClAIhDQsgAyANaiAFNgIAIAIgCEEBaiIINgKYAiAEQRxrIQQgA0EEaiEDDAELCyACKAKQAiIKQYCAgIB4Rg0BIAIoApQCIQUgAkEoaiAIQQRBCBDnFCACQQA2ApgCIAIgAikDKDcDkAIgAkGQAmogCBDjHiACKAKYAiIBIAhqIQkgAigClAIgAUEDdGohASAFIQQDQCADBEAgAUEEaiAEKAIAIgY2AgAgASAGNgIAIAFBCGohASADQQRrIQMgBEEEaiEEDAELCyAKIAUQuykgAikDkAIhHyACQcgBaiIBIAk2AgAgAiAJRToAzAEgAiAfNwPAASACQcABahCDBSACQZwCaiABKQMANwIAIAIgAikDwAE3ApQCIAJBADYCkAIgACACQZACahC+CwwGCyACKAKQAiANELspCyACKAI8IQEgAigCQEEAIQMgAkEANgKYAiACQoCAgIAQNwKQAkEcbCEEQQEhBwJAAkADQCAEBEAgASgCAEEBRw0CIAEoAghBAUcNAiABKAIELQAAIQUgAUEcaiEBIAIoApACIANGBEAgAkGQAmoQ5BYgAigClAIhBwsgAyAHaiAFOgAAIAIgA0EBaiIDNgKYAiAEQRxrIQQMAQsLIAIoApQCIQcgAigCkAIiCkGAgICAeEYNASACQSBqIANBAUECEOcUQQAhASACQQA2ApgCIAIgAikDIDcDkAIgAkGQAmogAxDkHiACKAKUAiACKAKYAiIGQQF0aiEEA0AgASADRwRAIARBAWogASAHai0AACIFOgAAIAQgBToAACAEQQJqIQQgAUEBaiEBDAELCyAKIAcQuCkgAikDkAIhHyACQcgBaiIDIAEgBmoiATYCACACIAFFOgDMASACIB83A8ABIAJBwAFqEPgEIAJBnAJqIAMpAwA3AgAgAiACKQPAATcClAIgAkEBNgKQAiAAIAJBkAJqEL4LDAYLIAIoApACIAcQuCkLQYCAgIB4IAcQliQgAigCPCEGIAIoAkAhDiACQQA2ApgCIAJCgICAgMAANwKQAiAGIA5BHGxqIQ8gAkGwAWogAkGQAmoiARCqEyABQQRyIQsgAkHEAWohCSAGIQMCQAJAA0AgAyAPRg0BIAMoAgBBAkcNAiADQRxqIQUgAygCBEUEQCACQbABaiADQQhqEPIXIAUhAwwBCwJAIANBDGooAgAiASADQRBqKAIAIgQQth9FDQAgAkEYaiAEQQRBCBDnFCACQQA2ApgCIAIgAikDGDcDkAIgAkGQAmogBBDjHiACKAKYAiEDIAQEQCADIARqIAIoApQCIANBA3RqIQMDQCADIAEtAAA2AgAgA0EEaiABQQFqLQAANgIAIAFBAmohASADQQhqIQMgBEEBayIEDQALIQMLIAIgAikDkAI3A5ACIAIgAzYCmAIgAiADRToAnAIgAkGQAmoQgwUgAkH4AWoiASALQQhqKAIANgIAIAIgCykCADcD8AEgAigCkAIiA0GAgICAeEYNACAJIAIpA/ABNwIAIAlBCGogASgCADYCACACIAM2AsABIAJBsAFqIAJBwAFqEPIXIAMgAigCxAEQyikgBSEDDAELCwwBCyACQewAaiACQbgBaikCADcCACACIAIpArABNwJkIAJBADYCYCAAIAJB4ABqEL4LDAULIAJBAjYCYCACKAKwASACKAK0ARDKKSACQeAAahDJJCACQQA2ApgCIAJCgICAgBA3ApACIAJBsAFqIAJBkAJqIgEQqxMgAUEEciEQIAJBxAFqIQsgBiEDA0ACQAJAAkACQAJAIAMgD0cEQCADKAIAQQJHDQEgA0EcaiEFIAMoAgQNBAJAIANBDGooAgAiASADQRBqKAIAIgQQsx9FDQAgAkEQaiAEQQFBAhDnFCACQQA2ApgCIAIgAikDEDcDkAIgAkGQAmogBBDkHiACKAKYAiEIIAQEQCACKAKUAiAIQQF0aiEDA0AgASgCACIJQYACTw0FIAFBBGooAgAiCkGAAk8NBiADIAk6AAAgA0EBaiAKOgAAIAFBCGohASADQQJqIQMgCEEBaiEIIARBAWsiBA0ACwsgAiACKQOQAjcDkAIgAiAINgKYAiACIAhFOgCcAiACQZACahD4BCACQfgBaiIBIBBBCGooAgA2AgAgAiAQKQIANwPwASACKAKQAiIDQYCAgIB4Rg0AIAsgAikD8AE3AgAgC0EIaiABKAIANgIAIAIgAzYCwAEgAkGwAWogAkHAAWoQ8xcgAyACKALEARDWKSAFIQMMBwsMAQsgAkGAAWogAkG4AWopAgA3AgAgAiACKQKwATcCeCACQQE2AnQgACACQfQAahC+CwwKCyACQQI2AnQgAigCsAEgAigCtAEQ1ikgAkH0AGoQySQgAigCOCENIA5BAkkNCyAGKAIAQQZHDQsgBigCDCIHRQ0LIAYoAgghCkEAIQEgBiEFQQEhAwNAAkAgAUEBcQRAIA8gBSIBRw0BDA0LIA8gBWtBHG4gA00NDCAFIANBHGxqIQELIAEoAgBBBkcNDCABQRxqIQUgByABKAIMIgMgAyAHSxshCSABKAIIIQNBACEBIAohBAJ/A0AgCSABIAlGDQEaIAQgAxDgAwRAIARBHGohBCADQRxqIQMgAUEBaiEBDAELCyABIAdLDQUgAQshB0EAIQNBASEBIAcNAAsMCwtB9OHgAEErIAJBmAFqQZC2xwBB/MXHABDADgALQfTh4ABBKyACQZgBakGQtscAQYzGxwAQwA4ACyACQbABaiADQQhqEPMXIAUhAwwBCwsgASAHQcCtxAAQnRAAC0HYrMQAELwpAAsgESABKQIENwIAIBFBCGogAUEMaikCADcCACARQRBqIAFBFGopAgA3AgAgAiAFNgJEIAJBkAJqIgkgAkHEAGoQtRUgAkHQAWoiCiACQaACaiIEKQIANwMAIAJByAFqIgYgAkGYAmoiBSkCADcDACACIAIpApACIh83A8ABIAIoAqgCIRACQCAfp0EHRwRAIAQgCikDADcDACAFIAYpAwA3AwAgAiACKQPAATcDkAIgAiAQNgKoAiACQThqIAkQqRAMAQsgAigCzAEhBiACKALIASEEIAIgAigCxAE2ApgCIAIgBDYCkAIgAiAENgKUAiACQThqIAYQzh4gAigCPCACKAJAIgVBHGxqIAQgBkEcbBD2BhogAiAENgKcAiACIAUgBmo2AkAgAkGQAmoQrBcgEBDWKgsgAUEcaiEBIAdBHGohByADQRxrIQMMAQsLIAAQoxELIAJBOGoQvSYMBAsgAkEANgKgASACQoCAgIDAADcCmAEgAkEANgKsASACQoCAgIDAADcCpAEgAiAPNgK8ASACIA02ArgBIAIgBjYCtAEgAiAGNgKwASACQZQCaiELIAJBxAFqIglBEGohBANAAkAgBiAPRwRAIAIgBkEcajYCtAEgBigCACIBQQhHDQELIAJBsAFqEKwXIAJBiAJqIAJBoAFqKAIANgIAIAIgAikDmAE3A4ACIAJBkAJqIgMgAkGkAWoQWiACQYACaiIBIAMQqRAgAyABEKsBIAJBkAFqIgMgAkGoAmooAgA2AgAgAiACKQKgAjcDiAEgAigCnAIhDiACKAKYAiEGIAIoApQCIQ0gAigCkAIiAUEIRg0CIAAgAikDiAE3AhAgACAONgIMIAAgBjYCCCAAIA02AgQgACABNgIAIABBGGogAygCADYCAAwFCyAJIAYpAgQ3AgAgCUEIaiAGQQxqKQIANwIAIAQgBkEUaikCADcCACACIAE2AsABIAJBkAJqIgogAkHAAWoQyRkgAigCkAJBBkcNAyACQegBaiIFIAtBCGooAgAiATYCACACIAspAgA3A+ABIAEgB0kNAiACQQhqIAEgB2siBkEEQRwQ5xQgAiAHNgLoASACKAIIIQMgAigCDCACKALkASAHQRxsaiAGQRxsEPYGIQEgAiAGNgL4ASACIAE2AvQBIAIgAzYC8AEgCiACQfABahCrASACQaQBaiAKEKkQAkAgAigCoAFFBEAgAkGYAWoQvSYgAkGgAWogBSgCADYCACACIAIpA+ABNwOYAQwBCyACQeABahC9JgsgAigCtAEhBiACKAK8ASEPDAALAAsgAiAGNgI8IAIgDTYCOCACIA42AkAgAiAGIA5BHGxqNgKcAiACIAY2ApgCQQAhAyACQQA2ApACIAJBkAJqEMsRIQUgAkGQAmoQyxEiAQR/IAEoAgAoAgAiASgCFCEXIAEoAhAFQQALIRMgAigCkAIhBCACKAKcAiEaIAIoApgCIQ4gAigClAIhCUEBIQhBASEHQQAhD0EAIQ1Bf0EAIAUbIgYhFEEAIQEDQEEAIQUDQCABIQsDQCAFAn8CQAJAAkAgBEEBcUUEQCAOIBpGDQIgDkEYaiEBIA5BHGohDgwBCyAJIgFFDQELIAEoAgAhDCAHQQFxQQAhBwRAIAwtADAhBwsgDCgCLCEEAkACQCATQQFxIgVFIAwoAhAiAUVyRQRAIBcgDCgCFEcNAQwCCyAFDQAgAUUNAQtBACETCyADIARqIRggCEEBcUEAIQgEQCAMLQAxIQgLIAwoAighGyAMKAIkIRwgDCgCICEdIAwoAhwhESAMKAIYIRAgAyAYSyEEQQEhBSAeRQRAIAwoAgANAkEAIRILQQEMAgtBNEEEEIwgIgEgCEEBcToAMiABQQA6ADEgASAHQQFxOgAwIAEgAzYCLCABIA82AiggASANNgIkIAEgBjYCICABIBQ2AhwgASAZNgIYIAEgFzYCFCABIBM2AhAgASAVNgIMIAEgCzYCCCABIBY2AgQgASASNgIAIABBDGogAkFAaygCADYCACAAIAIpAjg3AgQgACABNgIYIABBBzYCAAwHCyASQQEgEiAMKAIEIgMgFk9xIgEbIRIgFiADIAEbIRZBAAshHiAPIBtyIQ8gDSAcciENIAYgHXEhBiARIBRxIRQgECAZciEZQX8gGCAEGyEDQQAhBEEBcQ0AC0EAIQEgDCgCCEUNAAsgC0EBIAsgDCgCDCIEIBVNcSIFGyEBIBUgBCAFGyEVQQAhBAwACwALIwBBMGsiACQAIAAgATYCBCAAIAc2AgAgAEEDNgIMIABByLrAADYCCCAAQgI3AhQgACAAQQRqrUKAgICAkAGENwMoIAAgAK1CgICAgJABhDcDICAAIABBIGo2AhAgAEEIakGsqcQAEKEdAAtBuePgAEEoQbCtxAAQ2hcACyACQbACaiQAC/AfAgZ/AX4jAEFAaiIGJAAgBkEwaiACIAVBwQAgBRDVFwJAIAYtADBBBUcEQCAAIAYpAzA3AgAMAQsgBigCNBoCQAJAAkAgBUUEQCABLQBNRQ0BDAMLIAEtAE1BAUYNASAGQTBqIAEQmxEgBi0AMEEERg0BIAYpAzAiDEL/AYNCBFENASAAIAw3AgAMAwsgBkEwaiABEJsRIAYtADBBBEYNASAGKQMwIgxC/wGDQgRRDQEgACAMNwIADAILIAZBADoABiABLQBNRQRAIAEgASgCLEEBajYCLAsgBkEAOgAHIAUhCgNAAkACQCAKRQRAIAZBMGogASACIANBwQAgByAJENUBIAYtADBBBEYNBCAGKQMwIgxC/wGDQgRRDQQMAQsgBkEwaiABIANBwQAgByAJIARBBCAEKAIAQQRrIgcgB0EHTxsiB0ECdCIJQYDp4wBqKAIAaigCACAEIAlBnOnjAGooAgBqKAIAIgkgBkEHaiAGQQZqEIsEIAYtADBBBEcEQCAGKQMwIgxC/wGDQgRSDQELAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAdBAWsOBgECAwQFBgALIARBFGooAgAhByAGQSBqIAEgBEEQaigCACIIQQAQ0QECQCAGLQAgQQRHBEAgBikDICIMQv8Bg0IEUg0BCyAGQSBqIARBHGogARDEICAGLQAgQQRHBEAgBikDICIMQv8Bg0IEUg0BCyAGQQA2AjAgBkEgaiABIAZBMGpBha3gAEEBEJQTIAYtACBBBEcEQCAGKQMgIgxC/wGDQgRSDQELIAZBIGogASAIIAcgBEEIaigCACAEQQxqKAIAELgEIAYtACBBBEcEQCAGKQMgIgxC/wGDQgRSDQELIAZBIGogASAGQTBqQfCX4wBBARCUEyAGLQAgQQRHBEAgBikDICIMQv8Bg0IEUg0BCyAEQRhqIgcoAgBFDRIgBkEgaiABELgRIAYtACBBBEcEQCAGKQMgIgxC/wGDQgRSDQELIAZBIGogASAGQTBqQcit4ABBARCUEyAGLQAgQQRHBEAgBikDICIMQv8Bg0IEUg0BCyAGQSBqIAEQuBEgBi0AIEEERwRAIAYpAyAiDEL/AYNCBFINAQsgBkEgaiAHIAEQ3g0gBi0AIEEERg0SIAYpAyAiDEL/AYNCBFENEgsgDEL/AYNCBFENEQwSCyAEQRRqKAIAIQcgBkEgaiABIARBEGooAgAiCEEAENEBIAYtACBBBEcEQCAGKQMgIgxC/wGDQgRSDRALIAZBADYCMCAGQSBqIAEgBkEwakH3ruAAQQMQlBMgBi0AIEEERwRAIAYpAyAiDEL/AYNCBFINEAsgBEEcaiILKAIARQ0OIAYgCzYCCCAGQSBqIAEQuBEgBi0AIEEERwRAIAYpAyAiDEL/AYNCBFINEAsgBkEgaiAGQQhqIAEQoSkgBi0AIEEERw0FDA4LIAZBMGogASAEQQRqKAIAQQAQ0QEgBi0AMEEERwRAIAYpAzAiDEL/AYNCBFINDQsgBEEUai0AAEUNCyAGQQA2AjAgBkEIaiABIAZBMGpB163gAEEIEJQTIAYtAAhBBEcEQCAGKQMIIgxC/wGDQgRSDQ0LIAZBMGogARC4ESAGLQAwQQRGDQsgBikDMCIMQv8Bg0IEUQ0LDAwLIAZBADYCMCAGQSBqIAEgBkEwakH6ruAAQQMQlBMgBi0AIEEERwRAIAYpAyAiDEL/AYNCBFINCgsgBkEgaiABELgRIAYtACBBBEcEQCAGKQMgIgxC/wGDQgRSDQoLIARBBGohByAEQRRqLQAARQRAIAZBIGogByABEKMqIAYtACBBBEYNCSAGKQMgIgxC/wGDQgRSDQoMCQsgBkEgaiABIAZBMGpB0K3gAEEBEJQTIAYtACBBBEcEQCAGKQMgIgxC/wGDQgRSDQoLIAZBIGogByABEKMqIAYtACBBBEcEQCAGKQMgIgxC/wGDQgRSDQoLIAZBIGogASAGQTBqQdGt4ABBARCUEyAGLQAgQQRGDQggBikDICIMQv8Bg0IEUQ0IDAkLIAZBADYCMCAGQSBqIAEgBkEwakH9ruAAQQMQlBMgBi0AIEEERwRAIAYpAyAiDEL/AYNCBFINBwsgBkEgaiABELgRIAYtACBBBEcEQCAGKQMgIgxC/wGDQgRSDQcLIARBNGotAABFBEAgBkEgaiAEQTBqIAEQoyogBi0AIEEERg0GIAYpAyAiDEL/AYNCBFINBwwGCyAGQSBqIAEgBkEwakHQreAAQQEQlBMgBi0AIEEERwRAIAYpAyAiDEL/AYNCBFINBwsgBkEgaiAEQTBqIAEQoyogBi0AIEEERwRAIAYpAyAiDEL/AYNCBFINBwsgBkEgaiABIAZBMGpB0a3gAEEBEJQTIAYtACBBBEYNBSAGKQMgIgxC/wGDQgRRDQUMBgsgBEEYaigCACEHIAZBIGogASAEQRRqKAIAIghBABDRASAGLQAgQQRHBEAgBikDICIMQv8Bg0IEUg0ECyAEQSRqLQAARQRAIAZBIGogBEEQaiABEKMqIAYtACBBBEYNAyAGKQMgIgxC/wGDQgRSDQQMAwsgBkEANgIIIAZBIGogASAGQQhqQdCt4ABBARCUEyAGLQAgQQRHBEAgBikDICIMQv8Bg0IEUg0ECyAGQSBqIARBEGogARCjKiAGLQAgQQRHBEAgBikDICIMQv8Bg0IEUg0ECyAGQSBqIAEgBkEIakHRreAAQQEQlBMgBi0AIEEERg0CIAYpAyAiDEL/AYNCBFENAgwDCyAGQTBqIAEgBEEEahCsBCAGLQAwQQRGDQsgBikDMCIMQv8Bg0IEUg0MDAsLIAYpAyAiDEL/AYNCBFENCAwJCwJAIARBJWotAABFDQAgBkEANgIgIAZBGGogASAGQSBqQcet4ABBARCUEyAGLQAYQQRGDQAgBikDGCIMQv8Bg0IEUg0BCwJAIARBIGoiCygCAEUNACAGIAs2AhggBkEgaiAGQRhqIAEQoSkgBi0AIEEERg0AIAYpAyAiDEL/AYNCBFINAQsgBkEANgIwIAZBIGogASAGQTBqQYWt4ABBARCUEyAGLQAgQQRHBEAgBikDICIMQv8Bg0IEUg0BCyAGQSBqIAEgCCAHIARBCGooAgAgBEEMaigCABC4BCAGLQAgQQRHBEAgBikDICIMQv8Bg0IEUg0BCyAGQSBqIAEgBkEwakHwl+MAQQEQlBMgBi0AIEEERwRAIAYpAyAiDEL/AYNCBFINAQsgBEEcaiIHKAIARQ0JIAZBIGogASAGQTBqQcit4ABBARCUEyAGLQAgQQRHBEAgBikDICIMQv8Bg0IEUg0BCwJAIAEtAE0NACAGQSBqIAEQuBEgBi0AIEEERg0AIAYpAyAiDEL/AYNCBFINAQsgBkEgaiAHIAEQ3g0gBi0AIEEERg0JIAYpAyAiDEL/AYNCBFENCQsgDEL/AYNCBFENCAwJCyAGQSBqIAEgBkEwakGFreAAQQEQlBMgBi0AIEEERwRAIAYpAyAiDEL/AYNCBFINAQsgBkEgaiAEIAEQ5wggBi0AIEEERwRAIAYpAyAiDEL/AYNCBFINAQsgBkEgaiABIAZBMGpB8JfjAEEBEJQTIAYtACBBBEYNByAGKQMgIgxC/wGDQgRRDQcLIAxC/wGDQgRRDQYMBwsgBkEgaiABIAZBMGpBha3gAEEBEJQTIAYtACBBBEcEQCAGKQMgIgxC/wGDQgRSDQELIAZBIGogASAGQTBqQfCX4wBBARCUEyAGLQAgQQRHBEAgBikDICIMQv8Bg0IEUg0BCyAEQRBqKAIAIgdFDQUgBkEgaiABIAZBMGpByK3gAEEBEJQTIAYtACBBBEcEQCAGKQMgIgxC/wGDQgRSDQELAkAgAS0ATQ0AIAZBIGogARC4ESAGLQAgQQRGDQAgBikDICIMQv8Bg0IEUg0BCyAGQSBqIAcgARA3IAYtACBBBEYNBSAGKQMgIgxC/wGDQgRRDQULIAxC/wGDQgRRDQQMBQsCQCAEQRVqLQAARQRAIAZBMGogBEEQaiABEKMqIAYtADBBBEYNASAGKQMwIgxC/wGDQgRSDQIMAQsgBkEANgIgIAZBMGogASAGQSBqQdCt4ABBARCUEyAGLQAwQQRHBEAgBikDMCIMQv8Bg0IEUg0CCyAGQTBqIARBEGogARCjKiAGLQAwQQRHBEAgBikDMCIMQv8Bg0IEUg0CCyAGQTBqIAEgBkEgakHRreAAQQEQlBMgBi0AMEEERg0AIAYpAzAiDEL/AYNCBFINAQsCQCAEQRZqLQAARQ0AIAZBADYCMCAGQQhqIAEgBkEwakHHreAAQQEQlBMgBi0ACEEERg0AIAYpAwgiDEL/AYNCBFINAQsgBEEMaiIHKAIARQ0DIAZBADYCMCAGQQhqIAEgBkEwakHIreAAQQEQlBMgBi0ACEEERwRAIAYpAwgiDEL/AYNCBFINAQsCQCABLQBNDQAgBkEwaiABELgRIAYtADBBBEYNACAGKQMwIgxC/wGDQgRSDQELIAZBMGogByABEN4NIAYtADBBBEYNAyAGKQMwIgxC/wGDQgRRDQMLIAxC/wGDQgRRDQIMAwsgBkEgaiABIAZBMGpBha3gAEEBEJQTIAYtACBBBEcEQCAGKQMgIgxC/wGDQgRSDQELIAZBIGogASAIIAcgBEEIaigCACAEQQxqKAIAELgEIAYtACBBBEcEQCAGKQMgIgxC/wGDQgRSDQELIAZBIGogASAGQTBqQfCX4wBBARCUEyAGLQAgQQRHBEAgBikDICIMQv8Bg0IEUg0BCyAEQRhqIgcoAgBFDQEgBkEgaiABIAZBMGpByK3gAEEBEJQTIAYtACBBBEcEQCAGKQMgIgxC/wGDQgRSDQELIAZBIGogARC4ESAGLQAgQQRHBEAgBikDICIMQv8Bg0IEUg0BCyAGQSBqIAcgARDeDSAGLQAgQQRGDQEgBikDICIMQv8Bg0IEUQ0BCyAMQv8Bg0IEUg0BCyAGQQA2AjAgBkEgaiABIAZBMGoQlRMgBi0AIEEERg0BIAYpAyAiDEL/AYNCBFENAQsgDEL/AYNCBFINAQsgBi0ABkUEQCAGQQE6AAYMAgsgASgCREUNASAGQTBqIAEgBEEEIAQoAgBBBGsiByAHQQdPG0ECdEG46eMAaigCAGooAgBBABDoAiAGLQAwQQRGDQEgBikDMCIMQv8Bg0IEUQ0BCyAAIAw3AgAMAwsgBi0ABwRAIAEgASgCLEEBazYCLCAGQQA6AAcLIApBAWshCiAEQThqIQRBASEHDAALAAsgBkEwaiABIAMgBUVBwQAQoQ8CQCAGLQAwQQRHBEAgBikDMCIMQv8Bg0IEUg0BCyAAQQQ6AAAMAQsgACAMNwIACyAGQUBrJAALgqkCAjR/An4jAEHAA2siCCQAIAggBDoAMyAIIAI2AiwgCEHNAGogAUGXA2opAAA3AAAgCEHIAGogAUGSA2opAQA3AgAgCEFAayABQYoDaikBADcCACAIQQE6AOsCIAggAS0AhAM6AOoCIAggAS0AngM6AIQDIAggAS8BggM7AOgCIAggASkBhgM3AOwCIAggASkBjgM3APQCIAggASkBlgM3APwCIAggASkBggM3AjggAUGAAWoiLCAIQegCahDACCAIIAE2AjQgCEHgAGogA0EIaigCADYCACAIIAMpAgA3A1ggCCAIQSxqNgJoIAggCEEzajYCZAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAUEoaiIZEOMNIgJFDQAgAigCAEECRw0AIAItAAhBAkcNACACLQAJQRlGDQELIAhB8AJqIBkQ5gsgCCAZEJ8UIAhB0PDfADYC7AIgCEE0OgDoAiAIKAIAIAgoAgQgCEHoAmoQ6xQhAiAZEOMNIgNFDQ0gAygCAEEkRg0BDA0LIAEoAighAiABQSU2AiggASABKQNANwN4IAhB9AJqIgQgAUE0aikCADcCACAIQfwCaiABQTxqKAIANgIAIAggASkCLDcC7AIgCCACNgLoAiAIQegCaiICEL8KIAIgASAILQAzQQEQnQQgCCgC6AIhAiAILQD8AiIDQQNGDQEgCEGYAWoiCSAEKQIANwMAIAhBjgFqIgQgCEH/AmotAAA6AAAgCCAIKQLsAjcDkAEgCCAILwD9AjsBjAEgA0ECRwRAIAhB/ABqIAkpAwA3AgAgCEGHAWogBC0AADoAACAIIAI2AnAgCCAIKQOQATcCdCAIIAgvAYwBOwCFAQsgCCADOgCEAUEAIQMgAS0A+AJBAkcNBSAIQZACaiAIQfAAahDHCSAIKAKQAg0CDAQLIAEgASkDQDcDeCABKAIoIAFBJTYCKEEkRw0CIAEgASgCLBCCDAwLCyAAQQM6ABQgACACNgIADAsLIAgoApgCIQIgCCgClAIhBCAIQawBOgDoAiABIAQgAiAIQegCahC8GQwBC0G54+AAQShB6PDfABDaFwALIAEtAPgCQQJHDQAgCEEgaiABQQFBARDKDiAIKAIkISggCCgCIA0BCyABQSxqIRggGRDjDSIERQ0CIAQoAgBBAkcNAiAELQAIQQJHDQJBACECIAQtAAlBGkcNAyABKAIoIQIgAUElNgIoIAEgASkDQDcDeCAIQfQCaiIJIBhBCGopAgA3AgAgCEH8AmoiBiAYQRBqKAIANgIAIAggGCkCADcC7AIgCCACNgLoAiAIQegCaiIEEL8KIAQgARCxCSAIKALsAiECIAgoAugCIgNFDQEgCCADNgLsASABLQD4AkECRw0DIBkQ4w0iCkUNAyAKKAIAQRBHDQMgASgCKCEKIAFBJTYCKCABIAEpA0A3A3ggCSAYQQhqKQIANwIAIAYgGEEQaigCADYCACAIIBgpAgA3AuwCIAggCjYC6AIgBBC/CiAEIAEQzgIgCCgC7AIhBCAIKALoAiIJQYCAgIB4RwRAIAggCCgC8AIiBjYCmAIgCCAENgKUAiAIIAk2ApACIAZBBHQhCQNAIAkEQCAEKAIIIQYgBCgCBCEKIAhBlwE6AOgCIAEgCiAGIAhB6AJqELwZIAlBEGshCSAEQRBqIQQMAQUgCEGQAmoQ2CYMBgsACwALIABBAzoAFCAAIAQ2AgAgAhC6KCAIQewBahCYKQwECyAAQQM6ABQgACAoNgIADAQLIABBAzoAFCAAIAI2AgAMAgtBACECCyAIIAM2AqABAkAgCAJ/AkACQAJAAkAgGRDjDSIERQ0AIAQoAgBBAkcNACAELQAIQQJHDQAgBC0ACUEaRw0AIAEoAighBCABQSU2AiggASABKQNANwN4IAhB9AJqIBhBCGopAgA3AgAgCEH8AmogGEEQaigCADYCACAIIBgpAgA3AuwCIAggBDYC6AIgCEHoAmoiBBC/CiABKAJ8IQkgASgCeCEGIAhBlQE6AOgCIAEgBiAJIAQQvBkgBCABELEJIAgoAuwCIQQgCCgC6AIiCUUNASAIIAQ2ApQCIAggCTYCkAIgCEGQAmoQmCkgBBC6KAtBBCEEQQAhCSABLQD4AkECRg0BDAILIABBAzoAFCAAIAQ2AgAMAwsgGRDjDSIGRQ0AIAYoAgBBAkcNACAGLQAIDQBBACAGLQAJQRNHDQEaIAEoAighBCABQSU2AiggASABKQNANwN4IAhB9AJqIBhBCGopAgA3AgAgCEH8AmogGEEQaigCADYCACAIIBgpAgA3AuwCIAggBDYC6AIgCEHoAmoiBBC/CiAEIAEQzgIgCCgC7AIhBCAIKALoAiIJQYCAgIB4RwRAIAgoAvACDAILIABBAzoAFCAAIAQ2AgAMAgtBAAs2AqwBIAggBDYCqAEgCCAJNgKkAQJAAkACQCABLQD4AkECRw0AAkAgGRDjDSIERQ0AIAQoAgBBAkcNACAELQAIDQAgBC0ACUETRw0AIAEoAighBCABQSU2AiggASABKQNANwN4IAhB9AJqIBhBCGopAgA3AgAgCEH8AmogGEEQaigCADYCACAIIBgpAgA3AuwCIAggBDYC6AIgCEHoAmoiBBC/CiABKAJ8IQkgASgCeCEGIAhBmAE6AOgCIAEgBiAJIAQQvBkgBCABEM4CIAgoAuwCIQQgCCgC6AIiCUGAgICAeEcEQCAIIAgoAvACNgKYAiAIIAQ2ApQCIAggCTYCkAIgCEGQAmoQ2CYMAQsgAEEDOgAUIAAgBDYCAAwDCyABLQD4AkECRw0AIBkQ4w0iBEUNACAEKAIAQQJHDQAgBC0ACEECRw0AIAQtAAlBGkcNACABKAIoIQQgAUElNgIoIAEgASkDQDcDeCAIQfQCaiAYQQhqKQIANwIAIAhB/AJqIBhBEGooAgA2AgAgCCAYKQIANwLsAiAIIAQ2AugCIAhB6AJqIgQQvwogASgCfCEJIAEoAnghBiAIQZYBOgDoAiABIAYgCSAEELwZIAQgARCxCSAIKALsAiEJIAgoAugCIgQEQCAIIAQ2AugCIANFBEAgCEGgAWoQ9CcgCCAENgKgASAJBEAgAhC6KCAJIQIMBAtBABC6KAwDCyAJELooIAhB6AJqEJgpDAELIABBAzoAFCAAIAk2AgAMAgsgAyEECwJAIBkQ4w0iA0UNACADKAIAQQ1HDQAgASgCKCEDIAFBJTYCKCABIAEpA0A3A3ggCEH0AmogGEEIaiIyKQIANwIAIAhB/AJqIBhBEGoiMygCADYCACAIIBgpAgA3AuwCIAggAzYC6AIgCEHoAmoiAxC/CiAIQdUBaiABQYIDaiIkQRVqIjQpAAA3AAAgCEHQAWogJEEQaiI1KQEANwIAIAhByAFqICRBCGoiNikBADcCACAIIARBAEc6AP4CIAggASkBggM3AOgCIAggASkBigM3APACIAggASgBkgM2APgCIAggAS8BlgM7APwCIAggASgAmQM2AP8CIAggAS8AnQM7AIMDIAggJCkBADcCwAEgLCADEMAIIAggATYCvAEgCEEANgLoASAIQoCAgICAATcC4AEgCEHwAWohJSAIQZACakEEciEpIAhB8AJqITcgCEGYAmohOANAAkACQAJAAkACQAJAAkACQAJAIBkQ4w0iAwRAIAhBADYC7AEgCCADNgLwASAIQewBahD8IyAZEOMNIgMEQCADKAIAQQ5GDQILAkAgGRDjDSIDRQ0AIAMoAgBBD0cNACApIBgpAgA3AgAgASgCKCEDIAFBJTYCKCABIAEpA0A3A3ggKUEIaiAyKQIANwIAIClBEGogMygCADYCACAIIAM2ApACIAhBkAJqIgkQvwogASgCfCEDIAEoAnghBCAIQQo2ApACIAggBCADIAMgBEkbNgKYAiAIIAQgAyADIARLGzYClAIgCEHgAWogCRDjGQwLCyAlQRVqIDQpAAA3AAAgJUEQaiA1KQEANwEAICVBCGogNikBADcBACAlICQpAQA3AQAgCEEBOgCpAiAIIAEtAJoDOgCoAiAIIAEtAJ4DOgCsAiAIIAEpAYIDNwCQAiAIIAEpAYoDNwCYAiAIIAEpAZIDNwCgAiAIIAEvAZwDOwCqAiAsIAhBkAJqIgcQwAggCCABNgLsAUEAIQlBACEKQQAhDkEAIRFBACETQQAhFEEAIRZBACEaQQAhG0EAIRxBACEdQQAhHkEAIR9BACEgQQAhIUEAISJBACEqQQAhLUEAIS4jAEHQCGsiBSQAIAFBKGoiCxC/ICEMIAVB8ARqIAFBABC4ASAFKAL0BCEDAkACQAJAAkACQAJAAkACQCAFKALwBCIEQYCAgIB4RwRAIAUgBSgC+AQ2AtQDIAUgAzYC0AMgBSAENgLMA0EDIRIgAS0A+AJBAkcNAwJAAkACQCALEOMNIgNFDQAgAygCAEECRw0AIAMtAAgNACADLQAJQQxGDQELIAEtAPgCQQJGDQEMBgsgASgCKCEDIAFBJTYCKCABIAEpA0A3A3ggBUH8BGogAUE0aikCADcCACAFQYQFaiABQTxqKAIANgIAIAUgASkCLDcC9AQgBSADNgLwBCAFQfAEahC/CkEBIRogAS0A+AJBAkcNAwsgBUHwBGogARCDCiAFLQDwBEUEQCAFLQDxBCESIBpFDQIMAwsgBSgC9AQhAyAHQQ02AgAgByADNgIEIAVBzANqENcmDAULIAdBDTYCACAHIAM2AgQMBAsgAS0A+AJBAkcNASALEOMNIgNFDQEgAygCAEECRw0BIAMtAAgNASADLQAJQQxHDQEgASgCKCEDIAFBJTYCKCABIAEpA0A3A3ggBUH8BGogAUE0aikCADcCACAFQYQFaiABQTxqKAIANgIAIAUgASkCLDcC9AQgBSADNgLwBCAFQfAEahC/CgsCQAJAIAEQ3A5FBEAgAUEBEOoKRQRAIAEtAPgCQQJHDQMgCxDjDSIDRQ0DIAMoAgBBF0cNAwsgBUGKreAAQQcQuRo3A+ADIAVBADYC2AMgBSAMIAEoAnwiAyADIAxJGzYC7AMgBSAMIAMgAyAMSxs2AugDQQAhAyABLQD4AkECRw0BIAsQ4w0iBEUNASAEKAIAQRdHDQEgASgCKCEDIAFBJTYCKCABIAEpA0A3A3ggBUH8BGogAUE0aikCADcCACAFQYQFaiABQTxqKAIANgIAIAUgASkCLDcC9AQgBSADNgLwBCAFQfAEahC/CkEBIQMMAQtBiq3gAEEHELkaITkgDCABKAJ8IgMgAyAMSxshBCAMIAMgAyAMSRshAwJ/QQAgAS0A+AJBAkcNABpBACALEOMNIgZFDQAaQQAgBigCAEEXRw0AGiABKAIoIQYgAUElNgIoIAEgASkDQDcDeCAFQfwEaiABQTRqKQIANwIAIAVBhAVqIAFBPGooAgA2AgAgBSABKQIsNwL0BCAFIAY2AvAEIAVB8ARqEL8KQQELIQ4gBUGcBWogBUHUA2oiBigCADYCACAFIAUpAswDNwKUBSAFIBI6AKwFIAUgDDYCkAUgBUEAOgCwBSAFIA46AK8FIAVBADYCoAUgBUEAOwCxBSAFQQA7AK0FIAUgAzYChAUgBSAENgKABSAFIDk3A/gEIAVBADYC8AQgBUH5B2ogAUGXA2oiCikAADcAACAFQfQHaiABQZIDaiIDKQEANwIAIAVB7AdqIAFBigNqIg0pAQAiOTcCACAFQQA6AMIGIAVBAToAyQYgBSABLQCeAzoAzAYgBSABKQGCAyI6NwCwBiAFIDk3ALgGIAUgAy8BADsAwAYgBSABKACVAzYAwwYgBSABLwCZAzsAxwYgBSABLwGcAzsAygYgBSA6NwLkByABQYABaiIEIAVBsAZqIhAQwAggBSABNgLgByAFQQA7ANcEIAVBADoAmAcgBUEAOgDEBCAFIAw2AvAFIAUgAS0AiAM6ANYEIAUgASgBggM2ANAEIAUgAS8BhgM7ANQEIAUgASkAiwM3ANkEIAUgASkAkwM3AOEEIAUgASgAmwM2AOkEIAVBwQhqIAopAAA3AAAgBUG8CGogAykBADcCACAFQbQIaiANKQEANwIAIAUgASkBggM3AqwIIAQgBUHQBGoQwAggBSABNgKoCCAFQZAIaiAGKAIANgIAIAUgBSkCzAM3A4gIIAUgBUHwBWo2ApwIIAUgBUGYB2o2ApgIIAUgBUHEBGo2ApQIAn8CQCABLQD4AkECRgRAIBAgARDEFQJAAkACQAJAIAUoArAGIgNBKGoiBhDjDSIJRQ0AIAkoAgBBFEcNACAJLQAEQQRGDQELQQAhCSAGEOMNIgZFDQIgBigCAEEhRw0CIANBlAFqIgkQ+RcgCRD5FyAFQSBqIANBAEEBEJQBIAUoAiQhCSAFKAIgDQEMAgsgBUEoaiADQQBBARCUASAFKAIsIQkgBSgCKEUNAQsgBUGwBmoQiiYgCSEEDAILIAVBsAZqEIomCwJAAkACQCALEOMNIgMEQCADKAIAQQlGDQELIAVBuAZqIAsQ5gsgBUEIaiALEJ8UIAVB+N3fADYCtAYgBUE0OgCwBiAFKAIIIAUoAgwgBUGwBmoQ6xQhBCALEOMNIgNFDQEgAygCAEEkRw0BIAEgASkDQDcDeCABKAIoIAFBJTYCKEEkRw0LIAEgASgCLBCCDAwBCyABKAIoIQMgAUElNgIoIAEgASkDQDcDeCAFQbwGaiIGIAFBNGopAgA3AgAgBUHEBmoiCiABQTxqKAIANgIAIAUgASkCLDcCtAYgBSADNgKwBiAFQbAGaiINEL8KIAVBADoA4wUgBUEBOgDlBSAFIAUtAMQEOgDXBSAFIAUtAJgHOgDYBSAFIAEtAIgDOgDWBSAFIAEtAJYDOgDkBSAFIAEtAJ4DOgDsBSAFIAEoAYIDNgDQBSAFIAEvAYYDOwDUBSAFIAEpAIsDNwDZBSAFIAEvAJMDOwDhBSAFIAEoApgDNgDmBSAFIAEvAZwDOwDqBSAFQckGaiABQYIDaiIDQRVqKQAANwAAIAogA0EQaikBADcCACAGIANBCGopAQA3AgAgBSADKQEANwK0BiAEIAVB0AVqEMAIIAUgATYCsAYgBUHAB2ogARCzASAFKALEByEDIAUoAsAHIgRBgICAgHhHBEAgBSAFKALIByIGNgKAByAFIAM2AvwGIAUgBDYC+AYgDRCKJgJAAkAgCxDjDSIEBEAgBCgCAEEKRg0BCyAFQbgGaiALEOYLIAVBEGogCxCfFCAFQdDd3wA2ArQGIAVBNDoAsAYgBSgCECAFKAIUIAVBsAZqEOsUIQQgCxDjDSIDRQ0BIAMoAgBBJEcNASABIAEpA0A3A3ggASgCKCABQSU2AihBJEcNDCABIAEoAiwQggwMAQsgASgCKCEKIAFBJTYCKCABIAEpA0A3A3ggBUG8BmogAUEsaiIEQQhqKQIANwIAIAVBxAZqIARBEGooAgA2AgAgBSAEKQIANwK0BiAFIAo2ArAGIAVBsAZqEL8KQQAhBAJAIAEtAPgCQQJHDQAgCxDjDSIKRQ0AIAooAgBBE0cNACAFQRhqIAFBqNjfABDzASAFKAIcIQQgBSgCGA0BCyAFIAQ2AqgHIAVBsAZqIAEgBSgClAgiES0AACAFKAKYCCIPLQAAIAMgBhCoGRCmAyAFKAK0BiEKIAUoArAGIhBBgYCAgHhHBEAgBUHIB2oiFSAFQcAGaiITKQIANwMAIAUgBSkCuAY3A8AHIAEtAPgCQQJHIBBBgICAgHhHcg0EIAZBBnQhBgNAIAZFDQUgAygCAEEERgRAIAMoAhAhDSADKAIMIRQgBUGpAToAsAYgASAUIA0gBUGwBmoQvBkLIANBQGshAyAGQUBqIQYMAAsACyAFQagHahD1JyAKIQQLIAVB+AZqEOEmDAELIAVBsAZqEIomIAMhBAsgCRC+KAwBCyAFQcQGaiAFQZAIaigCADYCACAFQbgGaiIUIAVBgAdqKAIANgIAIAUgBSkDiAg3ArwGIAUgBSkC+AY3A7AGIAEoAnwhBiAFKAKcCCgCACENIA8tAAAhDyARLQAAIRFByABBBBCMICIDIAo2AhwgAyAQNgIYIAMgEToARSADIA86AEQgAyAENgJAIAMgCTYCPCADQQA2AjggAyANIAYgBiANSRs2AjQgAyANIAYgBiANSxs2AjAgA0EQaiATKQMANwIAIANBCGogFCkDADcCACADIAUpA7AGNwIAIAMgBSkDwAc3AiAgA0EoaiAVKQMANwIAQQEMAQsgBUGICGoQ1yYgBCEDQQALIQQgBUGoCGoQiiYCQCAEBEAgBUHgB2oQiiYgBSgC8ARBBUcNASAMIAEoAnwiBiAGIAxLGyEEIAUoAoQFIQkgEkEDRwRAIAVBtQE6ALAGIAEgBCAJIAQgCUkbIAQgCSAEIAlLGyAFQbAGahC8GQsgBUG8BmogBUH4BGoiCkEIaigCADYCACAHQQY2AgAgB0EAOgApIAcgDjoAKCAHQQA6ACcgB0EAOwAlIAcgEjoAJCAHIAM2AiAgByAMIAYgBiAMSRs2AhwgByAENgIYIAcgCTYCFCAFIAopAgA3ArQGIAcgBSkCsAY3AgQgB0EMaiAFQbgGaikCADcCAAwGCyAHQQ02AgAgByADNgIEIAVB4AdqEIomIAVB8ARqEKAhDAULIAEoAnwhBCAFQcwGaiAFQYgFaikDADcCACAFQcQGaiAFQYAFaikDADcCACAFQbwGaiAFQfgEaikDADcCACAHQQU2AgAgBSAFKQPwBDcCtAYgB0EEaiAFQbAGakEkEPYGGiAHIBI6ADkgB0EAOwA3IAcgDjoANiAHQQA7ATQgByADNgIwIAcgDCAEIAQgDEkbNgIsIAcgDCAEIAQgDEsbNgIoDAQLIAVBADYC8AQgByABIAwgBUHMA2ogEiAFQdgDakEAIAVB8ARqIANBAEEAQQBBABCQAQwDCyAMIAEoAnwiAyADIAxLGyEiIAwgAyADIAxJGyEhQQEhGgwBC0EAIRoLIAsQvyAhAwJ/QQAgCxDjDSIERQ0AGkEAIAQoAgBBAkcNABpBACAELQAIDQAaQQAgBC0ACUEHRw0AGiABKAIoIQQgAUElNgIoIAEgASkDQDcDeCAFQfwEaiABQTRqKQIANwIAIAVBhAVqIAFBPGooAgA2AgAgBSABKQIsNwL0BCAFIAQ2AvAEIAVB8ARqEL8KIAMgASgCfCIEIAMgBEkbIR8gAyAEIAMgBEsbISBBAQshFQJAIAEtAPgCQQJHBEAgAS0AgANBAXFFDQELIAsQvyAhAyALEOMNIgRFDQAgBCgCAEECRw0AIAQtAAgNACAELQAJQSNHDQAgASgCKCEEIAFBJTYCKCABIAEpA0A3A3ggBUH8BGogAUE0aikCADcCACAFQYQFaiABQTxqKAIANgIAIAUgASkCLDcC9AQgBSAENgLwBCAFQfAEahC/CiADIAEoAnwiBCADIARJGyEcIAMgBCADIARLGyEdIAFBLGohBgJAIAEQ3A5FBEBBASEbIAFBARDqCkUEQCABLQD4AkECRw0DIAsQ4w0iA0UNAyADKAIAQRdHDQMLQfqy4ABBCBC5GiE5IAUgHTYCjAQgBSAcNgKIBCAFIDk3A4AEIAVBADYC+ANBACEDIAEtAPgCQQJHDQEgCxDjDSIERQ0BIAQoAgBBF0cNASABKAIoIQMgAUElNgIoIAEgASkDQDcDeCAFQfwEaiAGQQhqKQIANwIAIAVBhAVqIAZBEGooAgA2AgAgBSAGKQIANwL0BCAFIAM2AvAEIAVB8ARqEL8KQQEhAwwBC0H6suAAQQgQuRohOUEAIQQCf0EAIAEtAPgCQQJHDQAaQQAgCxDjDSIDRQ0AGkEAIAMoAgBBF0cNABogASgCKCEDIAFBJTYCKCABIAEpA0A3A3ggBUH8BGogBkEIaikCADcCACAFQYQFaiAGQRBqKAIANgIAIAUgBikCADcC9AQgBSADNgLwBCAFQfAEahC/CkEBCyEOIAVBnAVqIAVB1ANqIgooAgA2AgAgBSAFKQLMAzcClAUgBSASOgCsBSAFIAw2ApAFIAVBADoAsAUgBSAOOgCvBSAFICA2AqgFIAUgHzYCpAUgBSAVNgKgBSAFQQA7ALEFIAVBADsArQUgBSAdNgKEBSAFIBw2AoAFIAUgOTcD+AQgBUEANgLwBCAFQfkHaiABQZcDaiINKQAANwAAIAVB9AdqIAFBkgNqIgMpAQA3AgAgBUHsB2ogAUGKA2oiECkBACI5NwIAIAVBADoAwgYgBUEBOgDJBiAFIAEtAJ4DOgDMBiAFIAEpAYIDIjo3ALAGIAUgOTcAuAYgBSADLwEAOwDABiAFIAEoAJUDNgDDBiAFIAEvAJkDOwDHBiAFIAEvAZwDOwDKBiAFIDo3AuQHIAFBgAFqIgkgBUGwBmoiERDACCAFIAE2AuAHIAVBADsA1wQgBUEAOgCYByAFQQA6AMQEIAUgDDYC8AUgBSABLQCIAzoA1gQgBSABKAGCAzYA0AQgBSABLwGGAzsA1AQgBSABKQCLAzcA2QQgBSABKQCTAzcA4QQgBSABKACbAzYA6QQgBUHBCGogDSkAADcAACAFQbwIaiADKQEANwIAIAVBtAhqIBApAQA3AgAgBSABKQGCAzcCrAggCSAFQdAEahDACCAFIAE2AqgIIAVBkAhqIAooAgA2AgAgBSAFKQLMAzcDiAggBSAFQfAFajYCnAggBSAFQZgHajYCmAggBSAFQcQEajYClAgCfwJAIAEtAPgCQQJGBEAgESABEMQVAkACQAJAAkAgBSgCsAYiA0EoaiIKEOMNIgRFDQAgBCgCAEEURw0AIAQtAARBBEYNAQtBACEEIAoQ4w0iCkUNAiAKKAIAQSFHDQIgA0GUAWoiBBD5FyAEEPkXIAVBuANqIANBAEEBEJQBIAUoArwDIQQgBSgCuAMNAQwCCyAFQcADaiADQQBBARCUASAFKALEAyEEIAUoAsADRQ0BCyAFQbAGahCKJiAEIQkMAgsgBUGwBmoQiiYLAkACQAJAIAsQ4w0iAwRAIAMoAgBBCUYNAQsgBUG4BmogCxDmCyAFQaADaiALEJ8UIAVB+N3fADYCtAYgBUE0OgCwBiAFKAKgAyAFKAKkAyAFQbAGahDrFCEJIAsQ4w0iA0UNASADKAIAQSRHDQEgASABKQNANwN4IAEoAiggAUElNgIoQSRHDQkgASABKAIsEIIMDAELIAEoAighAyABQSU2AiggASABKQNANwN4IAVBvAZqIgogBkEIaikCADcCACAFQcQGaiINIAZBEGooAgA2AgAgBSAGKQIANwK0BiAFIAM2ArAGIAVBsAZqIhAQvwogBUEAOgDjBSAFQQE6AOUFIAUgBS0AxAQ6ANcFIAUgBS0AmAc6ANgFIAUgAS0AiAM6ANYFIAUgAS0AlgM6AOQFIAUgAS0AngM6AOwFIAUgASgBggM2ANAFIAUgAS8BhgM7ANQFIAUgASkAiwM3ANkFIAUgAS8AkwM7AOEFIAUgASgCmAM2AOYFIAUgAS8BnAM7AOoFIAVByQZqIAFBggNqIgNBFWopAAA3AAAgDSADQRBqKQEANwIAIAogA0EIaikBADcCACAFIAMpAQA3ArQGIAkgBUHQBWoQwAggBSABNgKwBiAFQcAHaiABELMBIAUoAsQHIQMgBSgCwAciCUGAgICAeEcEQCAFIAUoAsgHIg02AoAHIAUgAzYC/AYgBSAJNgL4BiAQEIomAkACQCALEOMNIgkEQCAJKAIAQQpGDQELIAVBuAZqIAsQ5gsgBUGoA2ogCxCfFCAFQdDd3wA2ArQGIAVBNDoAsAYgBSgCqAMgBSgCrAMgBUGwBmoQ6xQhCSALEOMNIgNFDQEgAygCAEEkRw0BIAEgASkDQDcDeCABKAIoIAFBJTYCKEEkRw0KIAEgASgCLBCCDAwBCyABKAIoIQkgAUElNgIoIAEgASkDQDcDeCAFQbwGaiAGQQhqKQIANwIAIAVBxAZqIAZBEGooAgA2AgAgBSAGKQIANwK0BiAFIAk2ArAGIAVBsAZqEL8KQQAhCQJAIAEtAPgCQQJHDQAgCxDjDSIGRQ0AIAYoAgBBE0cNACAFQbADaiABQajY3wAQ8wEgBSgCtAMhCSAFKAKwAw0BCyAFIAk2AqgHIAVBsAZqIAEgBSgClAgiES0AACAFKAKYCCIPLQAAIAMgDRCoGRCmAyAFKAK0BiEKIAUoArAGIhBBgYCAgHhHBEAgBUHIB2oiEyAFQcAGaiIUKQIANwMAIAUgBSkCuAY3A8AHIAEtAPgCQQJHIBBBgICAgHhHcg0EIA1BBnQhBgNAIAZFDQUgAygCAEEERgRAIAMoAhAhDSADKAIMIQsgBUGpAToAsAYgASALIA0gBUGwBmoQvBkLIANBQGshAyAGQUBqIQYMAAsACyAFQagHahD1JyAKIQkLIAVB+AZqEOEmDAELIAVBsAZqEIomIAMhCQsgBBC+KAwBCyAFQcQGaiAFQZAIaigCADYCACAFQbgGaiILIAVBgAdqKAIANgIAIAUgBSkDiAg3ArwGIAUgBSkC+AY3A7AGIAEoAnwhBiAFKAKcCCgCACENIA8tAAAhDyARLQAAIRFByABBBBCMICIDIAo2AhwgAyAQNgIYIAMgEToARSADIA86AEQgAyAJNgJAIAMgBDYCPCADQQA2AjggAyANIAYgBiANSRs2AjQgAyANIAYgBiANSxs2AjAgA0EQaiAUKQMANwIAIANBCGogCykDADcCACADIAUpA7AGNwIAIAMgBSkDwAc3AiAgA0EoaiATKQMANwIAQQEMAQsgBUGICGoQ1yYgCSEDQQALIQQgBUGoCGoQiiYCQCAEBEAgBUHgB2oQiiYgBSgC8ARBBUcNASAMIAEoAnwiBiAGIAxLGyEEIAUoAoQFIQkgEkEDRwRAIAVBtQE6ALAGIAEgBCAJIAQgCUkbIAQgCSAEIAlLGyAFQbAGahC8GQsgBUG8BmogBUH4BGoiCkEIaigCADYCACAHQQY2AgAgB0EAOgApIAcgDjoAKCAHQQA6ACcgByAVOgAmIAdBADoAJSAHIBI6ACQgByADNgIgIAcgDCAGIAYgDEkbNgIcIAcgBDYCGCAHIAk2AhQgBSAKKQIANwK0BiAHIAUpArAGNwIEIAdBDGogBUG4BmopAgA3AgAMBAsgB0ENNgIAIAcgAzYCBCAFQeAHahCKJiAFQfAEahCgIQwDCyABKAJ8IQQgBUHMBmogBUGIBWopAwA3AgAgBUHEBmogBUGABWopAwA3AgAgBUG8BmogBUH4BGopAwA3AgAgB0EFNgIAIAUgBSkD8AQ3ArQGIAdBBGogBUGwBmpBJBD2BhogByASOgA5IAdBADsANyAHIA46ADYgB0EAOgA1IAcgFToANCAHIAM2AjAgByAMIAQgBCAMSRs2AiwgByAMIAQgBCAMSxs2AigMAgsgBUEANgLwBCAHIAEgDCAFQcwDaiASIAVB+ANqIBUgBUHwBGogA0EAIBpBAEEAEJABDAELAkAgFUUNAAJAIAEQ3A5FBEAgAUEAEOoKRQRAIAEtAPgCQQJHDQMgCxDjDSIDRQ0DIAMoAgBBF0cNAwsgCxDjDSIDBEAgAygCAEENRg0DC0HMvOAAQQYQuRohOSAFICA2AqwEIAUgHzYCqAQgBSA5NwOgBCAFQQA2ApgEQQAhAyABLQD4AkECRw0BIAsQ4w0iBEUNASAEKAIAQRdHDQEgASgCKCEDIAFBJTYCKCABIAEpA0A3A3ggBUH8BGogAUE0aikCADcCACAFQYQFaiABQTxqKAIANgIAIAUgASkCLDcC9AQgBSADNgLwBCAFQfAEahC/CkEBIQMMAQtBzLzgAEEGELkaITkCf0EAIAEtAPgCQQJHDQAaQQAgCxDjDSIDRQ0AGkEAIAMoAgBBF0cNABogASgCKCEDIAFBJTYCKCABIAEpA0A3A3ggBUH8BGogAUE0aikCADcCACAFQYQFaiABQTxqKAIANgIAIAUgASkCLDcC9AQgBSADNgLwBCAFQfAEahC/CkEBCyEOIAVBnAVqIAVB1ANqIgYoAgA2AgAgBSAFKQLMAzcClAUgBSASOgCsBSAFIAw2ApAFIAVBADoAsAUgBSAOOgCvBSAFQQA2AqAFIAVBADsAsQUgBUEAOwCtBSAFICA2AoQFIAUgHzYCgAUgBSA5NwP4BCAFQQA2AvAEIAVB+QdqIAFBlwNqIgopAAA3AAAgBUH0B2ogAUGSA2oiAykBADcCACAFQewHaiABQYoDaiINKQEAIjk3AgAgBUEAOgDCBiAFQQE6AMkGIAUgAS0AngM6AMwGIAUgASkBggMiOjcAsAYgBSA5NwC4BiAFIAMvAQA7AMAGIAUgASgAlQM2AMMGIAUgAS8AmQM7AMcGIAUgAS8BnAM7AMoGIAUgOjcC5AcgAUGAAWoiBCAFQbAGaiIQEMAIIAUgATYC4AcgBUEAOwDXBCAFQQA6AJgHIAVBADoAxAQgBSAMNgLwBSAFIAEtAIgDOgDWBCAFIAEoAYIDNgDQBCAFIAEvAYYDOwDUBCAFIAEpAIsDNwDZBCAFIAEpAJMDNwDhBCAFIAEoAJsDNgDpBCAFQcEIaiAKKQAANwAAIAVBvAhqIAMpAQA3AgAgBUG0CGogDSkBADcCACAFIAEpAYIDNwKsCCAEIAVB0ARqEMAIIAUgATYCqAggBUGQCGogBigCADYCACAFIAUpAswDNwOICCAFIAVB8AVqNgKcCCAFIAVBmAdqNgKYCCAFIAVBxARqNgKUCAJ/AkAgAS0A+AJBAkYEQCAQIAEQxBUCQAJAAkACQCAFKAKwBiIDQShqIgYQ4w0iCUUNACAJKAIAQRRHDQAgCS0ABEEERg0BC0EAIQkgBhDjDSIGRQ0CIAYoAgBBIUcNAiADQZQBaiIJEPkXIAkQ+RcgBUHIAGogA0EAQQEQlAEgBSgCTCEJIAUoAkgNAQwCCyAFQdAAaiADQQBBARCUASAFKAJUIQkgBSgCUEUNAQsgBUGwBmoQiiYgCSEEDAILIAVBsAZqEIomCwJAAkACQCALEOMNIgMEQCADKAIAQQlGDQELIAVBuAZqIAsQ5gsgBUEwaiALEJ8UIAVB+N3fADYCtAYgBUE0OgCwBiAFKAIwIAUoAjQgBUGwBmoQ6xQhBCALEOMNIgNFDQEgAygCAEEkRw0BIAEgASkDQDcDeCABKAIoIAFBJTYCKEEkRw0JIAEgASgCLBCCDAwBCyABKAIoIQMgAUElNgIoIAEgASkDQDcDeCAFQbwGaiIGIAFBNGopAgA3AgAgBUHEBmoiCiABQTxqKAIANgIAIAUgASkCLDcCtAYgBSADNgKwBiAFQbAGaiINEL8KIAVBADoA4wUgBUEBOgDlBSAFIAUtAMQEOgDXBSAFIAUtAJgHOgDYBSAFIAEtAIgDOgDWBSAFIAEtAJYDOgDkBSAFIAEtAJ4DOgDsBSAFIAEoAYIDNgDQBSAFIAEvAYYDOwDUBSAFIAEpAIsDNwDZBSAFIAEvAJMDOwDhBSAFIAEoApgDNgDmBSAFIAEvAZwDOwDqBSAFQckGaiABQYIDaiIDQRVqKQAANwAAIAogA0EQaikBADcCACAGIANBCGopAQA3AgAgBSADKQEANwK0BiAEIAVB0AVqEMAIIAUgATYCsAYgBUHAB2ogARCzASAFKALEByEDIAUoAsAHIgRBgICAgHhHBEAgBSAFKALIByIGNgKAByAFIAM2AvwGIAUgBDYC+AYgDRCKJgJAAkAgCxDjDSIEBEAgBCgCAEEKRg0BCyAFQbgGaiALEOYLIAVBOGogCxCfFCAFQdDd3wA2ArQGIAVBNDoAsAYgBSgCOCAFKAI8IAVBsAZqEOsUIQQgCxDjDSIDRQ0BIAMoAgBBJEcNASABIAEpA0A3A3ggASgCKCABQSU2AihBJEcNCiABIAEoAiwQggwMAQsgASgCKCEKIAFBJTYCKCABIAEpA0A3A3ggBUG8BmogAUEsaiIEQQhqKQIANwIAIAVBxAZqIARBEGooAgA2AgAgBSAEKQIANwK0BiAFIAo2ArAGIAVBsAZqEL8KQQAhBAJAIAEtAPgCQQJHDQAgCxDjDSIKRQ0AIAooAgBBE0cNACAFQUBrIAFBqNjfABDzASAFKAJEIQQgBSgCQA0BCyAFIAQ2AqgHIAVBsAZqIAEgBSgClAgiES0AACAFKAKYCCIPLQAAIAMgBhCoGRCmAyAFKAK0BiEKIAUoArAGIhBBgYCAgHhHBEAgBUHIB2oiFSAFQcAGaiITKQIANwMAIAUgBSkCuAY3A8AHIAEtAPgCQQJHIBBBgICAgHhHcg0EIAZBBnQhBgNAIAZFDQUgAygCAEEERgRAIAMoAhAhDSADKAIMIRQgBUGpAToAsAYgASAUIA0gBUGwBmoQvBkLIANBQGshAyAGQUBqIQYMAAsACyAFQagHahD1JyAKIQQLIAVB+AZqEOEmDAELIAVBsAZqEIomIAMhBAsgCRC+KAwBCyAFQcQGaiAFQZAIaigCADYCACAFQbgGaiIUIAVBgAdqKAIANgIAIAUgBSkDiAg3ArwGIAUgBSkC+AY3A7AGIAEoAnwhBiAFKAKcCCgCACENIA8tAAAhDyARLQAAIRFByABBBBCMICIDIAo2AhwgAyAQNgIYIAMgEToARSADIA86AEQgAyAENgJAIAMgCTYCPCADQQA2AjggAyANIAYgBiANSRs2AjQgAyANIAYgBiANSxs2AjAgA0EQaiATKQMANwIAIANBCGogFCkDADcCACADIAUpA7AGNwIAIAMgBSkDwAc3AiAgA0EoaiAVKQMANwIAQQEMAQsgBUGICGoQ1yYgBCEDQQALIQQgBUGoCGoQiiYCQCAEBEAgBUHgB2oQiiYgBSgC8ARBBUcNASAMIAEoAnwiBiAGIAxLGyEEIAUoAoQFIQkgEkEDRwRAIAVBtQE6ALAGIAEgBCAJIAQgCUkbIAQgCSAEIAlLGyAFQbAGahC8GQsgBUG8BmogBUH4BGoiCkEIaigCADYCACAHQQY2AgAgB0EAOgApIAcgDjoAKCAHQQA6ACcgB0EAOwAlIAcgEjoAJCAHIAM2AiAgByAMIAYgBiAMSRs2AhwgByAENgIYIAcgCTYCFCAFIAopAgA3ArQGIAcgBSkCsAY3AgQgB0EMaiAFQbgGaikCADcCAAwECyAHQQ02AgAgByADNgIEIAVB4AdqEIomIAVB8ARqEKAhDAMLIAEoAnwhBCAFQcwGaiAFQYgFaikDADcCACAFQcQGaiAFQYAFaikDADcCACAFQbwGaiAFQfgEaikDADcCACAHQQU2AgAgBSAFKQPwBDcCtAYgB0EEaiAFQbAGakEkEPYGGiAHIBI6ADkgB0EAOwA3IAcgDjoANiAHQQA7ATQgByADNgIwIAcgDCAEIAQgDEkbNgIsIAcgDCAEIAQgDEsbNgIoDAILIAUgHTYC+AQgBSAcNgL0BCAFIBs2AvAEIAcgASAMIAVBzANqIBIgBUGYBGpBACAFQfAEaiADQQAgGkEAQQAQkAEMAQsgBUHABGogBUHUA2ooAgA2AgAgBSAFKQLMAzcDuAQgAUGCA2ohD0EAIQMgFSEQAkACQAJAAkADQAJAIAMhBCAJIQYgCiENIAVB8ARqIiMgAUGI8t8AQQRBARCwAiAFKAL0BCEXAkACQAJAIAUoAvAERQRAAkACQAJAAkAgFwRAIAEoAnwhEyABKAJ4IRQgFyAFKAL4BCIeQe+u4ABBCBDNHw0DIBcgHkGcvOAAQQgQzR8NAiAXIB5B163gAEEIEM0fDQEgFyAeQcy84ABBBhDNHyIEIBByIRBBASEeIAQgDnFFDQpBzLzgAEEGELkaITkgBUGcvOAAQQgQuRo3A4AFIAUgOTcD+AQgBUH5ADoA8AQgASAUIBMgIxC8GUEBIQ5BASEQDAoLAkAgG0UEQEEAIQMCQCABLQD4AkECRwRAIAEtAIADQQFxRQ0BCyAEQQFxDQAgCxC/ICEJIAsQ4w0iCkUNACAKKAIAQQJHDQAgCi0ACA0AIAotAAlBI0cNACABKAIoIQMgAUElNgIoIAEgASkDQDcDeCAFQfwEaiABQTRqKQIANwIAIAVBhAVqIAFBPGooAgA2AgAgBSABKQIsNwL0BCAFIAM2AvAEIAVB8ARqEL8KIAUgCSABKAJ8IgMgAyAJSRs2AswEIAUgCSADIAMgCUsbNgLIBEEBIQMLIAUgAzYCxAQMAQsgBSAdNgLMBCAFIBw2AsgEIAUgGzYCxAQLIBBBAXENAwwIC0EBIR4gEyEKIBQhCUEBIQMgBEEBcUUNCEHXreAAQQgQuRohOSAFQfoAOgDwBCAFIDk3A/gEIAEgCSAKIAVB8ARqELwZIA0hCiAGIQkgBCEDDAgLAkACQCAOQQFxRQRAIARBAXENASAaDQJBASEeQQEhDiABLQCYA0EBcQ0KIAVBswE6APAEIAEgFCATIAVB8ARqELwZDAgLQZy84ABBCBC5GiE5IAVB+gA6APAEIAUgOTcD+AQMBgtBnLzgAEEIELkaITkgBUHXreAAQQgQuRo3A4AFIAUgOTcD+AQgBUH5ADoA8AQMBQtBnLzgAEEIELkaITkgBUGKreAAQQcQuRo3A4AFIAUgOTcD+AQgBUGfAToA8AQMBAsgFg0CQQEhHiAOQQFxQQAhDkEBIRZFDQZB767gAEEIELkaITkgBUGcvOAAQQgQuRo3A4AFIAUgOTcD+AQgBUH5ADoA8AQgASAUIBMgBUHwBGoQvBlBASEODAYLIAsQ4w0iA0UNBCADKAIAQQ1HDQQgGgRAIAVBmgE6APAEIAEgIiAhIAVB8ARqELwZCyASQQNGDQYgBUGYA2ogCxCfFCAFKAKcAyEDIAUoApgDIQQgBUGaAToA8AQgASAEIAMgBUHwBGoQvBkMBgsgB0ENNgIAIAcgFzYCBAwHC0HvruAAQQgQuRohOSAFQfoAOgDwBCAFIDk3A/gEIAEgFCATIAVB8ARqELwZQQEhHkEBIRYMAwsgASAUIBMgBUHwBGoQvBlBASEeC0EBIQ4MAQsLIAsQ4w0iA0UNASADKAIAQQJHDQEgAy0ACA0BIAMtAAlBB0cNASALEMYSIgNFDQEgAygCAEENRw0BIB4EQCAFQZoBOgDwBCABIBQgEyAFQfAEahC8GQsgFQRAIAVBmgE6APAEIAEgHyAgIAVB8ARqELwZCyABKAIoIQMgAUElNgIoIAEgASkDQDcDeCAFQfwEaiABQTRqKQIANwIAIAVBhAVqIAFBPGooAgA2AgAgBSABKQIsNwL0BCAFIAM2AvAEIAVB8ARqEL8KCyMAQeAAayIJJAAgCUEoaiABQYoDaiIDKQEANwIAIAlBMGogAUGSA2opAQA3AgAgCUE1aiABQZcDaikAADcAACAJQQE6AEwgCUEBOgBVIAlBAToAXyAJIAMtAAA6AEsgCSABLQCdAzoAXiAJIAEpAYIDIjk3AEMgCSABKQKMAzcATSAJIAEpAJUDNwBWIAkgOTcCICABQYABaiAJQcMAahDACCAJIAE2AhwgCUEEaiABQQAQkgYgCSgCCCEDIAcCfyAJKAIEIgRBgICAgHhHBEAgByAJKQIMNwIMIAdBFGogCUEUaikCADcCACAJQRxqEIomIAcgAzYCCCAHIAwgASgCfCIDIAMgDEkbNgIgIAcgDCADIAMgDEsbNgIcQQsMAQsgCUEcahCKJiADIQRBDQs2AgAgByAENgIEIAlB4ABqJAAMAQsCQCAOIBZyQQFxIAEtAPgCQQJHIBJBA0dycg0AIAVB8ARqIAEgDCAEQQFxIBBBAXEQpAEgBSgC9AQhAyAHAn8gBSgC8AQiCUGBgICAeEcEQCAFQcgGaiIKIAVBiAVqKAIANgIAIAVBwAZqIhcgBUGABWopAgA3AgAgBSAFKQL4BDcCuAYgBSADNgK0BiAFIAk2ArAGIAlBgICAgHhHBEAgByAFKQKwBjcCBCAHQRxqIAooAgA2AgAgB0EUaiAXKQIANwIAIAdBDGogBUG4BmopAgA3AgBBCQwCCyAFQbAGahCdIQwCCyAHIAM2AgRBDQs2AgAMAQsCQAJAAkACQAJAAkACQCALEOMNIgNFDQAgAygCAEEURw0AIAMtAARBDUYNAQsgBEEBcUUNAQJAIAsQ4w0iAwRAIAMoAgBBCEYNAQsgCxDjDSIDRQ0CIAMoAgBBE0cNAgtB163gAEEIELkaITkgBSANNgLkBCAFIAY2AuAEIAUgOTcD2AQgBUEANgLQBAwCCyABKAIoIQMgAUElNgIoIAEgASkDQDcDeCAFQfwEaiABQTRqKQIANwIAIAVBhAVqIAFBPGooAgA2AgAgBSABKQIsNwL0BCAFIAM2AvAEIAVB8ARqIgkQvwogCSABEO0HIAUoAvQEIQYgBSgC8AQiCkEGRg0CIAVBiAdqIAVBiAVqKQMAIjk3AwAgBUGAB2ogBUGABWopAwAiOjcDACAFQeAFaiA6NwMAIAVB6AVqIDk3AwAgBSAFKQP4BCI5NwP4BiAFIAY2AtQFIAUgCjYC0AUgBSA5NwPYBSAEQQFxBEAgASgCfCEDIAVB4wA6APAEIAEgDCADIAMgDEsbIAwgAyADIAxJGyAJELwZCyAFQdAFahDhFUUNBiABKAJ8IQMgBUHkADoA8AQgASAMIAMgAyAMSxsgDCADIAMgDEkbIAVB8ARqELwZDAYLIAVB8ARqIAEQ7QcgBSgC9AQhAyAFKALwBCIJQQZGDQIgBUHoBGogBUGIBWopAwA3AwAgBUHgBGogBUGABWopAwA3AwAgBSAFKQP4BDcD2AQgBSADNgLUBCAFIAk2AtAEC0EAIRcgAS0A+AJBAkcNAiALEOMNIgNFDQIgAygCAEEXRw0CIAEoAighAyABQSU2AiggASABKQNANwN4IAVB/ARqIAFBNGopAgA3AgAgBUGEBWogAUE8aigCADYCACAFIAEpAiw3AvQEIAUgAzYC8AQgBUHwBGoQvwpBASEXDAILIAdBDTYCACAHIAY2AgQMAgsgB0ENNgIAIAcgAzYCBAwBCwJAAkACQAJAAkACQAJ/AkACQAJAAn8CQAJAAkACQAJAAkACQAJAAkACQCABENwORQRAQQAhCQJAIAsQmyFFDQAgCxDjDSIDRQ0AIAMoAgBBFEcNACADLQAEQQ1GIQkLAkACQCAFKALQBA0AIAVB2ARqIgNB+q7gAEEDELEbRQRAIANB/a7gAEEDELEbRQ0BC0EAIQogAUEAEOoKIAlyQQFHDQELQQAhA0EBIQogAUEBEOoKDQQLIAUoAtAEDRAgBUHYBGpBoLHgAEEFELEbRQ0QIAsQmyENEEEBIQMgBUHwBGoiBiABQaS84ABBAUEAELACIAUoAvQEIQkgBSgC8AQNASAJBEAgASgCfCEDIAEoAnghCUGcvOAAQQgQuRohOSAFQaCx4ABBBRC5GjcDgAUgBSA5NwP4BCAFQfkAOgDwBCABIAkgAyAGELwZQQEhDgtBACEDAkAgCxDjDSIJRQ0AIAkoAgBBFEcNACAJLQAEQQ1HDQAgASgCKCEDIAFBJTYCKCABIAEpA0A3A3ggBUH8BGogAUE0aikCADcCACAFQYQFaiABQTxqKAIANgIAIAUgASkCLDcC9AQgBSADNgLwBCAFQfAEahC/CkEBIQMLIAVB8ARqIgYgARDtByAFKAL0BCEJAkAgBSgC8AQiCkEGRwRAIAVB6AVqIAVBiAVqKQMANwMAIAVB4AVqIAVBgAVqKQMANwMAIAUgBSkD+AQ3A9gFIAUgCTYC1AUgBSAKNgLQBQJAAkACQAJAAkACQCAFQdAFahDhFUUEQEEBIQogBEEBcQ0BAkAgFw0AQQAhCiABLQD4AkECRw0AIAsQ4w0iBEUNACAEKAIAQRdHDQAgASgCKCEEIAFBJTYCKCABIAEpA0A3A3ggBUH8BGogAUE0aikCADcCACAFQYQFaiABQTxqKAIANgIAIAUgASkCLDcC9AQgBSAENgLwBCAGEL8KQQEhCgsgBUGIBWogBUHoBWopAwA3AwAgBUGABWogBUHgBWopAwA3AwAgBUH4BGogBUHYBWopAwA3AwAgBUGcBWogBUHABGoiBigCADYCACAFIAUpA9AFNwPwBCAFIAUpA7gENwKUBSAFIBI6AKwFIAUgDDYCkAUgBSAKOgCvBSAFICA2AqgFIAUgHzYCpAUgBSAVNgKgBSAFIBY6AK4FIAUgDkEBcSIQOgCwBSAFIAM6ALIFIAVBAToAsQVBACEJIAVBADoArQUgBUH5B2ogD0EVaiINKQAANwAAIAVB9AdqIA9BEGoiDikBADcCACAFQewHaiAPQQhqIhEpAQA3AgAgBUEAOgDCBiAFQQE6AMkGIAUgAS0AngM6AMwGIAUgASkBggM3ALAGIAUgASkBigM3ALgGIAUgAS8BkgM7AMAGIAUgASgAlQM2AMMGIAUgAS8AmQM7AMcGIAUgAS8BnAM7AMoGIAUgDykBADcC5AcgAUGAAWoiBCAFQbAGaiITEMAIIAUgATYC4AcgBUEBOgDHByAFIAM6AMgHIAUgAzoApAcgBUEBOgDwBiAFIAw2AsgFIAUgAS0AiAM6AMYHIAUgASgBggM2AMAHIAUgAS8BhgM7AMQHIAUgASkAiwM3AMkHIAUgASkAkwM3ANEHIAUgASgAmwM2ANkHIAVBwQhqIA0pAAA3AAAgBUG8CGogDikBADcCACAFQbQIaiARKQEANwIAIAUgDykBADcCrAggBCAFQcAHahDACCAFIAE2AqgIIAVBgAdqIAYoAgA2AgAgBSAFKQO4BDcD+AYgBSAFQcgFajYCjAcgBSAFQaQHajYCiAcgBSAFQfAGajYChAcgAS0A+AJBAkcNFiATIAEQxBUCQCAFKAKwBiIDQShqIgYQ4w0iCUUNACAJKAIAQRRHDQAgCS0ABEEERg0FC0EAIQkgBhDjDSIGRQ0VIAYoAgBBIUcNFSADQZQBaiIJEPkXIAkQ+RcgBUHgAmogA0EAQQEQlAEgBSgC5AIhCSAFKALgAg0FDBULIAVBwAJqIAVB0AVqEJMTIAUoAsQCIQMgBSgCwAIgBUHeADoA8AQgAyAFQfAEahDrFCEDIAsQ4w0iBEUNAiAEKAIAQSRHDQIgASABKQNANwN4IAEoAiggAUElNgIoQSRGDQFBuePgAEEoQbjy3wAQ2hcACyABKAJ8IQMgBUHjADoA8AQgDCADIAMgDEsbIAwgAyADIAxJGyAFQfAEahDrFCEDIAsQ4w0iBEUNASAEKAIAQSRHDQEgASABKQNANwN4IAEoAiggAUElNgIoQSRHDQQLIAEgASgCLBCCDAsgB0ENNgIAIAcgAzYCBCAFQdAFahCgIQwECyAFQegCaiADQQBBARCUASAFKALsAiEJIAUoAugCRQ0QCyAFQbAGahCKJiAJIQQMEQtBuePgAEEoQajy3wAQ2hcACyAHQQ02AgAgByAJNgIEC0EBIQkMFAsgGgRAIAVB+wA6APAEIAEgIiAhIAVB8ARqELwZCyAEQQFxDQEgBUHQBGoQ4RVFBEAgBUGcBWogBUHABGoiAygCADYCACAFQfgEaiAFQdgEaikDADcDACAFQYAFaiAFQeAEaikDADcDACAFQYgFaiAFQegEaikDADcDACAFIAUpA7gENwKUBSAFIAUpA9AENwPwBCAFIBI6AKwFIAUgDDYCkAUgBSAXOgCvBSAFICA2AqgFIAUgHzYCpAUgBSAVNgKgBSAFIBY6AK4FIAUgDkEBcSIOOgCwBUEAIQogBUEAOwCxBSAFQQA6AK0FIAVB+QdqIA9BFWoiCSkAADcAACAFQfQHaiAPQRBqIgYpAQA3AgAgBUHsB2ogD0EIaiINKQEANwIAIAVBADoAwgYgBUEBOgDJBiAFIAEtAJ4DOgDMBiAFIAEpAYIDNwCwBiAFIAEpAYoDNwC4BiAFIAEvAZIDOwDABiAFIAEoAJUDNgDDBiAFIAEvAJkDOwDHBiAFIAEvAZwDOwDKBiAFIA8pAQA3AuQHIAFBgAFqIgQgBUGwBmoiEBDACCAFIAE2AuAHIAVBADsAjwggBUEAOgDIBSAFQQA6AKQHIAUgDDYCmAcgBSABLQCIAzoAjgggBSABKAGCAzYAiAggBSABLwGGAzsAjAggBSABKQCLAzcAkQggBSABKQCTAzcAmQggBSABKACbAzYAoQggBUHBCGogCSkAADcAACAFQbwIaiAGKQEANwIAIAVBtAhqIA0pAQA3AgAgBSAPKQEANwKsCCAEIAVBiAhqEMAIIAUgATYCqAggBUHIB2ogAygCADYCACAFIAUpA7gENwPAByAFIAVBmAdqNgLUByAFIAVByAVqNgLQByAFIAVBpAdqNgLMByABLQD4AkECRw0JIBAgARDEFQJAAkACQCAFKAKwBiIDQShqIgYQ4w0iCUUNACAJKAIAQRRHDQAgCS0ABEEERg0BCyAGEOMNIglFDQogCSgCAEEhRw0KIANBlAFqIgkQ+RcgCRD5FyAFQbABaiADQQBBARCUASAFKAK0ASEKIAUoArABDQEMCgsgBUG4AWogA0EAQQEQlAEgBSgCvAEhCiAFKAK4AUUNCQsgBUGwBmoQiiYgCiEJDAoLIAEtAPgCIgNBAkYgDnENAwwGCyAHQQ02AgAgByAJNgIEDBALIAEoAnwhAyAFQeMAOgDwBCAMIAMgAyAMSxsgDCADIAMgDEkbIAVB8ARqEOsUIQMgCxDjDSIERQ0DIAQoAgBBJEcNAyABIAEpA0A3A3ggASgCKCABQSU2AihBJEcNAiABIAEoAiwQggwMAwsgBUGIBWogBUHoBGopAwA3AwAgBUGABWogBUHgBGopAwA3AwAgBUH4BGogBUHYBGopAwA3AwAgBSAFKQPQBDcD8AQgByABIAwgBUG4BGogEiAFQfAEaiAQQQFxIAVBxARqIBcgBEEBcSAaIBYgDkEBcRCQAQwUCyABKAJ8IQNBnLzgAEEIELkaITkgBUGCAToA8AQgBSA5NwP4BCABIAwgAyADIAxLGyAMIAMgAyAMSRsgBUHwBGoQvBkgAS0A+AIhAwwCC0G54+AAQShBzPTfABDaFwALIAdBDTYCACAHIAM2AgQMCgsCQCADQf8BcUECRw0AIAsQ4w0iA0UNACADKAIAQRRHDQAgAy0ABEEERw0AIAsQvyAhAwJAAkACQAJAAkACQAJAAkAgCxDGEiIERQ0AIAQoAgBBFEcNACAELQAEQQZGDQELQQEhAyAFQZABaiABQQBBARDKDiAFKAKUASEEIAUoApABDQEgBEUNByAEKAIIIQkgBCgCBCEDIAUgBCgCADYCsAggBSADNgKoCCAFIAMgCUEwbCIKaiIGNgK0CCADQTBqIQkgBUGbBWoiDUEEaiEOA0ACQCAFIAoEfyADLQAqIhBBAkcNASAJBSAGCzYCrAggBUGoCGoQvxcgBBD3KgwJCyAFQfAEaiIbIANBKhD2BhogDSADKAArNgAAIA4gA0Evai0AADoAACAFIBA6AJoFIAUoAvAEIRAgBSgC9AQhGiAFQYMBOgCwBiABIBAgGiAFQbAGahC8GSAJQTBqIQkgCkEwayEKIBsQoSIgA0EwaiEDDAALAAsgCxDjDSIERQ0FIAQoAgBBJEYEQCABIAEpA0A3A3ggASgCKCABQSU2AihBJEcNAiABKAIsIQMgB0ENNgIAIAcgAzYCBAwRCyABKAIoIQQgAUElNgIoIAEgASkDQDcDeCAFQfwEaiABQTRqKQIANwIAIAVBhAVqIAFBPGooAgA2AgAgBSABKQIsNwL0BCAFIAQ2AvAEIAVB8ARqEL8KIAsQvyAhBCALEOMNIglFDQQgCSgCAEEkRw0CIAEgASkDQDcDeCABKAIoIAFBJTYCKEEkRw0DIAEoAiwhAyAHQQ02AgAgByADNgIEDBALIAdBDTYCACAHIAQ2AgQMEAtBuePgAEEoQZzz3wAQ2hcACyABKAIoIQYgAUElNgIoIAEgASkDQDcDeCAFQfwEaiABQSxqIglBCGopAgA3AgAgBUGEBWogCUEQaigCADYCACAFIAkpAgA3AvQEIAUgBjYC8AQgBUHwBGoiBhC/CiABKAJ8IQkgBUGFAToA8AQgASADIAkgAyAJSRsgAyAJIAMgCUsbIAYQvBkgASgCfCEDIAVBgwE6APAEIAEgBCADIAMgBEsbIAQgAyADIARJGyAGELwZDAMLQbnj4ABBKEGs898AENoXAAsgASgC2AIhAyAFQQA6APAEIAMgAyAFQfAEahDrFCEDIAdBDTYCACAHIAM2AgQMCwsgASgC2AIhAyAFQQA6APAEIAMgAyAFQfAEahDrFCEDIAdBDTYCACAHIAM2AgQMCgsCQAJAAkAgCxDjDSIDRQ0AIAMoAgBBCUcNACABKAIoIQMgAUElNgIoIAEgASkDQDcDeCAFQfwEaiABQTRqKQIANwIAIAVBhAVqIAFBPGooAgA2AgAgBSABKQIsNwL0BCAFIAM2AvAEIAVB8ARqEL8KIAVBADYCyAcgBUKAgICAgAE3AsAHIAFBLGohGiAFQbAGakEEciEcIAVBoAVqIS8gBUGNBWohMCAFQc0GaiEdIAVB4AZqITEgBUGQBmohIyAFQbgGaiEnQQAhDQNAAkACQAJAAkACQAJAAkACQAJAAkACQCALEOMNIgMEQCAFQQA2AqgIIAUgAzYCrAggBUGoCGoQ/CMgCxDjDSIDBEAgAygCAEEKRg0CCyANICpyRSANQf7/e0tyRQRAIAVB9wA6ALAGIAEgDSAqIAVBsAZqELwZCyALEL8gIQMgBUGwBmogAUEAELgBIAUoArQGIQYgBSgCsAYiBEGAgICAeEYNDiAFIAUoArgGNgKQCCAFIAY2AowIIAUgBDYCiAggCxC/ICEEAkACQCALEOMNIgkEQCAJKAIAQQdGDQELIAVB6AdqIAVBkAhqIiEoAgA2AgAgBSAFKQKICDcD4AcCQAJ+AkACQAJAIAEtAPgCQQJHDQAgBUGwBmoiBCABEIMKIAUtALAGDQYgBS0AsQYhCiAEIAFBpLzgAEEBQQAQsAIgBSgCtAYhBCAFKAKwBgRAIAQhBgwRCyAFQbAGaiABQcDf3wBBAUEAELACIAUoArQGIQkgBSgCsAYEQCAJIQYMEQsgCkH/AXFBA0cgBHIgCXJFDQAgBUGwBmogARDhASAFKAK0BiEGIAUoArAGIhBBB0YNECAFIB0pAAA3A/gGIAUgHUEHaigAADYA/wYgBS0AzAYhGyAFKALIBiErIAUoAsQGIREgBSkCvAYhOSAFKAK4BiEOIBAOBQEEBAQCBAsgBUGwBmogARDhASAFKAK0BiEPIAUoArAGIiJBB0cEQCAFQdgFaiAhKAIANgIAIAUgHSkAADcD8AUgBSAdQQdqKAAANgD3BSAFIAUpAogINwPQBSAFLQDMBiEbIAUoAsgGISsgBSkDwAYhOSAFKAK8BiEQIAUoArgGIQ4gAyABKAJ8IgQgAyAESRshISADIAQgAyAESxshAyARIQoMEQsgDyEGDA8LIAUgBSgA/wY2AK8HIAUgBSkD+AY3A6gHIDmnIRAgEa1CIIYgOUIgiIQMAQtBAiEbIA4hECAGIQ4gOQshOSAFQdgFaiAhKAIANgIAIAUgBSkCiAg3A9AFIAUgBSkDqAc3A/AFIAUgBSgArwc2APcFIAMgASgCfCIGIAMgBkkbISEgAyAGIAMgBksbIQMgCUEARyEtIARBAEchLkEHISIgCiERDA0LIB0gBSkD+AY3AAAgHUEHaiAFKAD/BjYAACAFIBs6AMwGIAUgKzYCyAYgBSARNgLEBiAFIDk3ArwGIAUgDjYCuAYgBSAGNgK0BiAFIBA2ArAGIAVB+ABqIAVBsAZqEIwMIAUoAnwhAyAFKAJ4IAVB3AA6AKgIIAMgBUGoCGoQ6xQhBiALEOMNIgNFDQogAygCAEEkRw0KIAEgASkDQDcDeCABKAIoIAFBJTYCKEEkRw0EIAEgASgCLBCCDAwKCyAcIBopAgA3AgAgASgCKCEJIAFBJTYCKCABIAEpA0A3A3ggHEEIaiAaQQhqKQIANwIAIBxBEGogGkEQaigCADYCACAFIAk2ArAGIAVBsAZqIgYQvwogASgCfCEJIAYgAUEAEE4gBSgCtAYhBgJAIAUoArAGIgpBB0cEQCAjICcpAwA3AwAgI0EYaiAnQRhqKQMANwMAICNBEGogJ0EQaikDADcDACAjQQhqICdBCGopAwA3AwAgBSAGNgKMBiAFIAo2AogGQQAhG0EAIQYgAS0A+AJBAkcNASALEOMNIgpFDQEgCigCAEETRw0BIAVBiAFqIAFBASALEL8gEP4GIAUoAowBIQYgBSgCiAFFDQEgBUGIBmoQmBILIAVBiAhqENcmDBALIAEoAnwhCkEoQQgQjCAgBUGIBmpBKBD2BiEOIDEgBSkCiAg3AgAgMUEIaiAFQZAIaigCADYCACAFIAY2AsgGIAUgBCAJIAQgCUsbNgLEBiAFIAQgCSAEIAlJGzYCwAYgBSAEIAogBCAKSxsiKjYCvAYgBSAEIAogBCAKSRsiDTYCuAYgBSAONgK0BiAFQQI2ArAGIAUgAyABKAJ8IgQgAyAESxs2AtwGIAUgAyAEIAMgBEkbNgLYBiAFQcAHaiAFQbAGahDkGQwMCyAFKAK0BiEGDAkLIAEoAtgCIQMgBUEAOgCwBiAFIAMgAyAFQbAGahDrFDYCrAggBUEBNgKoCCAFQagIahD8IwsgBSgCxAchBiAFKALAByIDQYCAgIB4Rg0NIAUgBSgCyAciBDYCsAggBSAGNgKsCCAFIAM2AqgIAkACQCALEOMNIgNFDQAgAygCAEEKRw0AIAEoAighAyABQSU2AiggASABKQNANwN4IAVB/ARqIBpBCGopAgA3AgAgBUGEBWogGkEQaigCADYCACAFIBopAgA3AvQEIAUgAzYC8AQgBUHwBGoQvwogAS0A+AJBAkcNBSALEOMNIgMNAQwFCyAFQfgEaiALEOYLIAVB4ABqIAsQnxQgBUHQ3d8ANgL0BCAFQTQ6APAEIAUoAmAgBSgCZCAFQfAEahDrFCEDIAsQ4w0iBEUNAyAEKAIAQSRHDQMgASABKQNANwN4IAEoAiggAUElNgIoQSRHDQIgASABKAIsEIIMDAMLIAMoAgBBE0cNAyAFQfAAaiABQQEgCxC/IBD+BiAFKAJ0IQMgBSgCcEUEQCAFIAM2ArAGIAVB6ABqIAMoAgAQrgUgBSgCbCEDIAUoAmghCSAFQZwBOgDwBCABIAkgAyAFQfAEahC8GSAFQbAGahCMJgwECyAHQQ02AgAgByADNgIEDAQLQbnj4ABBKEHs/N8AENoXAAtBuePgAEEoQczz3wAQ2hcACyAHQQ02AgAgByADNgIEDAELIAVB8ARqIAFBAEEAIAYgBBD9FxCmAyAFKAL0BCEOAkAgBSgC8AQiDUGBgICAeEcEQCAFQbgGaiAFQYAFaikCADcDACAFIAUpAvgENwOwBiANQYCAgIB4Rw0DIARBBnQhCiAGIQMDQCAKRQ0CIAMoAgBBB0YEQCADKAIoIQkgAygCLCEQIAVBqAE6APAEIAEgCSAQIAVB8ARqELwZCyADQUBrIQMgCkFAaiEKDAALAAsgB0ENNgIAIAcgDjYCBAwBCyABLQD4AkECRyANQYCAgIB4R3INASAEQQZ0IQMDQCADRQ0CQRAhCkEMIQkCQAJAAkAgBigCAEEEaw4EAQICAAILIAYtABxBAkcNAUEUIQpBECEJCyAGIApqKAIAIQQgBiAJaigCACEJIAVBqQE6APAEIAEgCSAEIAVB8ARqELwZCyAGQUBrIQYgA0FAaiEDDAALAAsgBUGoCGoQ8SYMEgsgFQRAQcy84ABBBhC5GiE5IAVBggE6APAEIAUgOTcD+AQgASAfICAgBUHwBGoQvBkLIBYgHnEEQCAFQZ4BOgDwBCABIBQgEyAFQfAEahC8GQsgBSgC0ARBBUcEQCAHIAUpA9AENwMAIAcgBSkCqAg3AkAgB0EIaiAFQdgEaikDADcDACAHQRBqIAVB4ARqKQMANwMAIAdBGGogBUHoBGopAwA3AwAgB0HIAGogBUGwCGooAgA2AgAgASgCfCEEEMEYITkgByASOgBRIAcgFzoAUEEAIQMgB0EANgJMIAcgDCAEIAQgDEkbNgI8IAcgDCAEIAQgDEsbNgI4IAcgDjYCJCAHIA02AiAgByAFKQOwBjcCKCAHQTBqIAVBuAZqKQMANwIAIAVCADcDgAUgBSA5NwP4BCAFQgA3A6gFIAVBADYC8AQgBUIANwO4BSAFQoCAgICAATcDsAUgBUGAgICAeDYCkAUgBUGABjsBwAUgBUHwBGoQyhYgBUGwBWoQ8SYgBUGQBWoQ5CQMEwsgBUEBNgL0BCAFQbT03wA2AvAEIAVCADcC/AQgBSAFQeAHajYC+AQgBUHwBGpBvPTfABChHQALIAVBsAZqEJgSCyAFQeAHahDXJgwECyAwIAUpA/AFNwAAIDBBB2ogBSgA9wU2AAAgLyAFKQPQBTcDACAvQQhqIAVB2AVqKAIANgIAIAUgGzoAjAUgBSArNgKIBSAFIDk3A4AFIAUgEDYC/AQgBSAONgL4BCAFIAM2ApwFIAUgITYCmAUgBSAKOgCuBSAFIC06AK0FIAUgLjoArAUgBSAPNgL0BCAFICI2AvAEIAVBwAdqIAVB8ARqEOQZQQEhGwsgCxDjDSIDBEAgAygCAEEKRg0BCwJAAkAgCxDjDSIDBEAgAygCAEEQRg0BCyAFQbgGaiALEOYLIAVBgAFqIAsQnxQgBUHYvOAANgK0BiAFQTQ6ALAGIAUoAoABIAUoAoQBIAVBsAZqEOsUIQYgCxDjDSIDRQ0EIAMoAgBBJEcNBCABIAEpA0A3A3ggASgCKCABQSU2AihBJEcNASABIAEoAiwQggwMBAsgHCAaKQIANwIAIAEoAighAyABQSU2AiggASABKQNANwN4IBxBCGogGkEIaikCADcCACAcQRBqIBpBEGooAgA2AgAgBSADNgKwBiAFQbAGaiIDEL8KIAsQ4w0iBEUNASAbIAQoAgBBCkdyDQEgASgCfCEEIAEoAnghCSAFQTo6ALAGIAEgCSAEIAMQvBkMAQsLQbnj4ABBKEH8/N8AENoXAAsgBUH4BGogCxDmCyAFQdgAaiALEJ8UIAVB+N3fADYC9AQgBUE0OgDwBCAFKAJYIAUoAlwgBUHwBGoQ6xQhAwJAIAsQ4w0iBEUNACAEKAIAQSRHDQAgASABKQNANwN4IAEoAiggAUElNgIoQSRGBEAgASABKAIsEIIMDAELQbnj4ABBKEG8898AENoXAAsgB0ENNgIAIAcgAzYCBAwLCyAFQcAHahDxJgsgB0ENNgIAIAcgBjYCBAwJCyAFQbAGahCKJgsCQAJAAkAgCxDjDSIDBEAgAygCAEEJRg0BCyAFQbgGaiALEOYLIAVBmAFqIAsQnxQgBUH43d8ANgK0BiAFQTQ6ALAGIAUoApgBIAUoApwBIAVBsAZqEOsUIQkgCxDjDSIDRQ0BIAMoAgBBJEcNASABIAEpA0A3A3ggASgCKCABQSU2AihBJEcNEyABIAEoAiwQggwMAQsgASgCKCEDIAFBJTYCKCABIAEpA0A3A3ggBUG8BmoiCSABQTRqKQIANwIAIAVBxAZqIgYgAUE8aigCADYCACAFIAEpAiw3ArQGIAUgAzYCsAYgBUGwBmoiDRC/CiAFQQA6AOMFIAVBAToA5QUgBSAFLQCkBzoA1wUgBSAFLQDIBToA2AUgBSABLQCIAzoA1gUgBSABLQCWAzoA5AUgBSABLQCeAzoA7AUgBSABKAGCAzYA0AUgBSABLwGGAzsA1AUgBSABKQCLAzcA2QUgBSABLwCTAzsA4QUgBSABKAKYAzYA5gUgBSABLwGcAzsA6gUgBUHJBmogD0EVaikAADcAACAGIA9BEGopAQA3AgAgCSAPQQhqKQEANwIAIAUgDykBADcCtAYgBCAFQdAFahDACCAFIAE2ArAGIAVB+AZqIAEQswEgBSgC/AYhAyAFKAL4BiIEQYCAgIB4RwRAIAUgBSgCgAciBjYCsAcgBSADNgKsByAFIAQ2AqgHIA0QiiYCQAJAIAsQ4w0iBARAIAQoAgBBCkYNAQsgBUG4BmogCxDmCyAFQaABaiALEJ8UIAVB0N3fADYCtAYgBUE0OgCwBiAFKAKgASAFKAKkASAFQbAGahDrFCEJIAsQ4w0iA0UNASADKAIAQSRHDQEgASABKQNANwN4IAEoAiggAUElNgIoQSRHDRQgASABKAIsEIIMDAELIAEoAighCSABQSU2AiggASABKQNANwN4IAVBvAZqIAFBLGoiBEEIaikCADcCACAFQcQGaiAEQRBqKAIANgIAIAUgBCkCADcCtAYgBSAJNgKwBiAFQbAGahC/CkEAIQkCQCABLQD4AkECRw0AIAsQ4w0iBEUNACAEKAIAQRNHDQAgBUGoAWogAUGo2N8AEPMBIAUoAqwBIQkgBSgCqAENAQsgBSAJNgLwBSAFQbAGaiABIAUoAswHIhEtAAAgBSgC0AciDy0AACADIAYQqBkQpgMgBSgCtAYhBCAFKAKwBiIQQYGAgIB4RwRAIAVBgAdqIhMgBUHABmoiFCkCADcDACAFIAUpArgGNwP4BiABLQD4AkECRyAQQYCAgIB4R3INBCAGQQZ0IQYDQCAGRQ0FIAMoAgBBBEYEQCADKAIQIQ0gAygCDCELIAVBqQE6ALAGIAEgCyANIAVBsAZqELwZCyADQUBrIQMgBkFAaiEGDAALAAsgBUHwBWoQ9ScgBCEJCyAFQagHahDhJgwBCyAFQbAGahCKJiADIQkLIAoQvigMAQsgBUHEBmogBUHIB2ooAgA2AgAgBUG4BmoiCyAFQbAHaigCADYCACAFIAUpA8AHNwK8BiAFIAUpAqgHNwOwBiABKAJ8IQYgBSgC1AcoAgAhDSAPLQAAIQ8gES0AACERQcgAQQQQjCAiAyAENgIcIAMgEDYCGCADIBE6AEUgAyAPOgBEIAMgCTYCQCADIAo2AjwgA0EANgI4IAMgDSAGIAYgDUkbNgI0IAMgDSAGIAYgDUsbNgIwIANBEGogFCkDADcCACADQQhqIAspAwA3AgAgAyAFKQOwBjcCACADIAUpA/gGNwIgIANBKGogEykDADcCAEEBDAELIAVBwAdqENcmIAkhA0EACyEEIAVBqAhqEIomAkAgBARAIAVB4AdqEIomIAUoAvAEQQVGBEAgDCABKAJ8IgYgBiAMSxshBCAFKAKEBSEJIBJBA0cEQCAFQbUBOgCwBiABIAQgCSAEIAlJGyAEIAkgBCAJSxsgBUGwBmoQvBkLIAVBvAZqIAVB+ARqIgpBCGooAgA2AgAgB0EGNgIAIAcgDjoAKSAHIBc6ACggByAWOgAnIAcgFToAJiAHQQA6ACUgByASOgAkIAcgAzYCICAHIAwgBiAGIAxJGzYCHCAHIAQ2AhggByAJNgIUIAUgCikCADcCtAYgByAFKQKwBjcCBCAHQQxqIAVBuAZqKQIANwIADA8LIAwgASgCfCIEIAQgDEsbIQkgDCAEIAQgDEkbIQQgFkUNASADKAIYQYCAgIB4Rg0BIAVBoQE6ALAGIAEgCSAEIAVBsAZqELwZDAELIAdBDTYCACAHIAM2AgQgBUHgB2oQiiYgBUHwBGoQoCEMDQsgB0EFNgIAIAVBzAZqIAVBiAVqKQMANwIAIAVBxAZqIAVBgAVqKQMANwIAIAVBvAZqIAVB+ARqKQMANwIAIAUgBSkD8AQ3ArQGIAdBBGogBUGwBmpBJBD2BhogByASOgA5IAdBADoAOCAHIA46ADcgByAXOgA2IAcgFjoANSAHIBU6ADQgByADNgIwIAcgBDYCLCAHIAk2AigMDAsgBUGwBmoQiiYLAkACQAJAIAsQ4w0iAwRAIAMoAgBBCUYNAQsgBUG4BmogCxDmCyAFQcgCaiALEJ8UIAVB+N3fADYCtAYgBUE0OgCwBiAFKALIAiAFKALMAiAFQbAGahDrFCEEIAsQ4w0iA0UNASADKAIAQSRHDQEgASABKQNANwN4IAEoAiggAUElNgIoQSRHDQ8gASABKAIsEIIMDAELIAEoAighAyABQSU2AiggASABKQNANwN4IAVBvAZqIgYgAUE0aikCADcCACAFQcQGaiINIAFBPGooAgA2AgAgBSABKQIsNwK0BiAFIAM2ArAGIAVBsAZqIg4QvwogBUEAOgCbCCAFQQE6AJ0IIAUgBS0A8AY6AI8IIAUgBS0ApAc6AJAIIAUgAS0AiAM6AI4IIAUgAS0AlgM6AJwIIAUgAS0AngM6AKQIIAUgASgBggM2AIgIIAUgAS8BhgM7AIwIIAUgASkAiwM3AJEIIAUgAS8AkwM7AJkIIAUgASgCmAM2AJ4IIAUgAS8BnAM7AKIIIAVByQZqIA9BFWopAAA3AAAgDSAPQRBqKQEANwIAIAYgD0EIaikBADcCACAFIA8pAQA3ArQGIAQgBUGICGoQwAggBSABNgKwBiAFQagHaiABELMBIAUoAqwHIQMgBSgCqAciBEGAgICAeEcEQCAFIAUoArAHIgY2AvgFIAUgAzYC9AUgBSAENgLwBSAOEIomAkACQCALEOMNIgQEQCAEKAIAQQpGDQELIAVBuAZqIAsQ5gsgBUHQAmogCxCfFCAFQdDd3wA2ArQGIAVBNDoAsAYgBSgC0AIgBSgC1AIgBUGwBmoQ6xQhBCALEOMNIgNFDQEgAygCAEEkRw0BIAEgASkDQDcDeCABKAIoIAFBJTYCKEEkRw0QIAEgASgCLBCCDAwBCyABKAIoIQ0gAUElNgIoIAEgASkDQDcDeCAFQbwGaiABQSxqIgRBCGopAgA3AgAgBUHEBmogBEEQaigCADYCACAFIAQpAgA3ArQGIAUgDTYCsAYgBUGwBmoQvwpBACEEAkAgAS0A+AJBAkcNACALEOMNIg1FDQAgDSgCAEETRw0AIAVB2AJqIAFBqNjfABDzASAFKALcAiEEIAUoAtgCDQELIAUgBDYCmAcgBUGwBmogASAFKAKEByIPLQAAIAUoAogHIhMtAAAgAyAGEKgZEKYDIAUoArQGIQ0gBSgCsAYiEUGBgICAeEcEQCAFQbAHaiIUIAVBwAZqIgspAgA3AwAgBSAFKQK4BjcDqAcgAS0A+AJBAkcgEUGAgICAeEdyDQQgBkEGdCEGA0AgBkUNBSADKAIAQQRGBEAgAygCECEOIAMoAgwhFyAFQakBOgCwBiABIBcgDiAFQbAGahC8GQsgA0FAayEDIAZBQGohBgwACwALIAVBmAdqEPUnIA0hBAsgBUHwBWoQ4SYMAQsgBUGwBmoQiiYgAyEECyAJEL4oDAELIAVBxAZqIAVBgAdqKAIANgIAIAVBuAZqIhcgBUH4BWooAgA2AgAgBSAFKQP4BjcCvAYgBSAFKQLwBTcDsAYgASgCfCEGIAUoAowHKAIAIQ4gEy0AACETIA8tAAAhD0HIAEEEEIwgIgMgDTYCHCADIBE2AhggAyAPOgBFIAMgEzoARCADIAQ2AkAgAyAJNgI8IANBADYCOCADIA4gBiAGIA5JGzYCNCADIA4gBiAGIA5LGzYCMCADQRBqIAspAwA3AgAgA0EIaiAXKQMANwIAIAMgBSkDsAY3AgAgAyAFKQOoBzcCICADQShqIBQpAwA3AgBBAQwBCyAFQfgGahDXJiAEIQNBAAshBCAFQagIahCKJgJAAkAgBARAIAVB4AdqEIomIAUoAvAEQQVGBEAgDCABKAJ8IgYgBiAMSxshBCAFKAKEBSEJIBJBA0cEQCAFQbUBOgCwBiABIAQgCSAEIAlJGyAEIAkgBCAJSxsgBUGwBmoQvBkLIAVBvAZqIAVB+ARqIg1BCGooAgA2AgAgB0EGNgIAIAcgEDoAKSAHIAo6ACggByAWOgAnIAcgFToAJiAHQQA6ACUgByASOgAkIAcgAzYCICAHIAwgBiAGIAxJGzYCHCAHIAQ2AhggByAJNgIUIAUgDSkCADcCtAYgByAFKQKwBjcCBCAHQQxqIAVBuAZqKQIANwIADAMLIAwgASgCfCIEIAQgDEsbIQkgDCAEIAQgDEkbIQQgFkUNASADKAIYQYCAgIB4Rg0BIAVBoQE6ALAGIAEgCSAEIAVBsAZqELwZDAELIAdBDTYCACAHIAM2AgQgBUHgB2oQiiYgBUHwBGoQoCEMAQsgB0EFNgIAIAVBzAZqIAVBiAVqKQMANwIAIAVBxAZqIAVBgAVqKQMANwIAIAVBvAZqIAVB+ARqKQMANwIAIAUgBSkD8AQ3ArQGIAdBBGogBUGwBmpBJBD2BhogByASOgA5IAdBADoAOCAHIBA6ADcgByAKOgA2IAcgFjoANSAHIBU6ADQgByADNgIwIAcgBDYCLCAHIAk2AigLQQAhCQwECyAKRQRAIAVBuAJqIAVB0ARqEJMTIAUgBSgCvAIiDTYCzAUgBSAFKAK4AiIQNgLIBSAFQfAEaiIRIAEQ7QcgBSgC9AQhBgJAIAUoAvAEIgpBBkYiCUUEQCAFQYAGaiAFQYgFaikDACI5NwMAIAVB+AVqIAVBgAVqKQMAIjo3AwAgBUHgBWogOjcDACAFQegFaiA5NwMAIAUgBSkD+AQiOTcD8AUgBSAGNgLUBSAFIAo2AtAFIAUgOTcD2AUgBEEBcQRAIAVBDzoA8AQgASAQIA0gERC8GQsgBUHQBWoQ4RUNAQwFCyAHQQ02AgAgByAGNgIEDAULIAVB4gA6APAEIAEgECANIAVB8ARqELwZDAMLIAVB/ARqIAsQ5gsgBUHAAWogCxCfFCAFQTE2AvgEIAVB2PLfADYC9AQgBUEwOgDwBCAFKALAASAFKALEASAFQfAEahDrFCEDAkAgCxDjDSIERQ0AIAQoAgBBJEcNACABIAEpA0A3A3ggASgCKCABQSU2AihBJEYEQCABIAEoAiwQggwMAQtBuePgAEEoQYzz3wAQ2hcACyAHQQ02AgAgByADNgIEC0EBIQMLQQEhCQwCCyAFQbACaiADEJEMAn8CQAJAAkACQCAFKAKwAiIDIAUoArQCIgRB+q7gAEEDEM0fRQRAIAMgBEH9ruAAQQMQzR8NAUG54+AAQShByPLfABDaFwALIAVBnAVqIAVBwARqIgMoAgA2AgAgBUGABWogBUH4BWopAwA3AwAgBUGIBWogBUGABmopAwA3AwAgBSAFKQO4BDcClAUgBSASOgCsBSAFIAw2ApAFIAUgFzoArwUgBSAgNgKoBSAFIB82AqQFIAUgFTYCoAUgBSAGNgL0BCAFIAo2AvAEIAUgBSkD8AU3A/gEIAUgFjoArgUgBSAOQQFxIhA6ALAFQQAhDSAFQQA7ALEFIAVBAToArQUgBUH5B2ogD0EVaiIGKQAANwAAIAVB9AdqIA9BEGoiCikBADcCACAFQewHaiAPQQhqIg4pAQA3AgAgBUEAOgDCBiAFQQE6AMkGIAUgAS0AngM6AMwGIAUgASkBggM3ALAGIAUgASkBigM3ALgGIAUgAS8BkgM7AMAGIAUgASgAlQM2AMMGIAUgAS8AmQM7AMcGIAUgAS8BnAM7AMoGIAUgDykBADcC5AcgAUGAAWoiBCAFQbAGaiIREMAIIAUgATYC4AcgBUEAOwDHByAFQQA6APcGIAVBADoA9gYgBSAMNgLwBiAFIAEtAIgDOgDGByAFIAEoAYIDNgDAByAFIAEvAYYDOwDEByAFIAEpAIsDNwDJByAFIAEpAJMDNwDRByAFIAEoAJsDNgDZByAFQcEIaiAGKQAANwAAIAVBvAhqIAopAQA3AgAgBUG0CGogDikBADcCACAFIA8pAQA3AqwIIAQgBUHAB2oQwAggBSABNgKoCCAFQYAHaiADKAIANgIAIAUgBSkDuAQ3A/gGIAUgBUHwBmo2ApAHIAUgBUHIBWo2AowHIAUgBUH3Bmo2AogHIAUgBUH2Bmo2AoQHIAEtAPgCQQJHDQIgESABEMQVAkACQAJAIAUoArAGIgNBKGoiChDjDSIGRQ0AIAYoAgBBFEcNACAGLQAEQQRGDQELIAoQ4w0iBkUNAyAGKAIAQSFHDQMgA0GUAWoiBhD5FyAGEPkXIAVB6AFqIANBAEEBEJQBIAUoAuwBIQ0gBSgC6AENAQwDCyAFQfABaiADQQBBARCUASAFKAL0ASENIAUoAvABRQ0CCyAFQbAGahCKJiANIQYMAwsgBUGcBWogBUHABGoiAygCADYCACAFQYAFaiAFQfgFaikDADcDACAFQYgFaiAFQYAGaikDADcDACAFIAUpA7gENwKUBSAFIBI6AKwFIAUgDDYCkAUgBSAXOgCvBSAFICA2AqgFIAUgHzYCpAUgBSAVNgKgBSAFIAY2AvQEIAUgCjYC8AQgBSAFKQPwBTcD+AQgBSAWOgCuBSAFIA5BAXEiEToAsAVBACENIAVBADsAsQUgBUECOgCtBSAFQfkHaiAPQRVqIgYpAAA3AAAgBUH0B2ogD0EQaiIKKQEANwIAIAVB7AdqIA9BCGoiDikBADcCACAFQQA6AMIGIAVBAToAyQYgBSABLQCeAzoAzAYgBSABKQGCAzcAsAYgBSABKQGKAzcAuAYgBSABLwGSAzsAwAYgBSABKACVAzYAwwYgBSABLwCZAzsAxwYgBSABLwGcAzsAygYgBSAPKQEANwLkByABQYABaiIEIAVBsAZqIhAQwAggBSABNgLgByAFQQA7AMcHIAVBADoA9wYgBUEAOgD2BiAFIAw2AvAGIAUgAS0AiAM6AMYHIAUgASgBggM2AMAHIAUgAS8BhgM7AMQHIAUgASkAiwM3AMkHIAUgASkAkwM3ANEHIAUgASgAmwM2ANkHIAVBwQhqIAYpAAA3AAAgBUG8CGogCikBADcCACAFQbQIaiAOKQEANwIAIAUgDykBADcCrAggBCAFQcAHahDACCAFIAE2AqgIIAVBgAdqIAMoAgA2AgAgBSAFKQO4BDcD+AYgBSAFQfAGajYCkAcgBSAFQcgFajYCjAcgBSAFQfcGajYCiAcgBSAFQfYGajYChAcCfwJAIAEtAPgCQQJGBEAgECABEMQVAkACQAJAAkAgBSgCsAYiA0EoaiIKEOMNIgZFDQAgBigCAEEURw0AIAYtAARBBEYNAQsgChDjDSIGRQ0CIAYoAgBBIUcNAiADQZQBaiIGEPkXIAYQ+RcgBUGgAmogA0EAQQEQlAEgBSgCpAIhDSAFKAKgAg0BDAILIAVBqAJqIANBAEEBEJQBIAUoAqwCIQ0gBSgCqAJFDQELIAVBsAZqEIomIA0hBgwCCyAFQbAGahCKJgsCQAJAAkAgCxDjDSIDBEAgAygCAEEJRg0BCyAFQbgGaiALEOYLIAVBgAJqIAsQnxQgBUH43d8ANgK0BiAFQTQ6ALAGIAUoAoACIAUoAoQCIAVBsAZqEOsUIQYgCxDjDSIDRQ0BIAMoAgBBJEcNASABIAEpA0A3A3ggASgCKCABQSU2AihBJEcNDyABIAEoAiwQggwMAQsgASgCKCEDIAFBJTYCKCABIAEpA0A3A3ggBUG8BmoiBiABQTRqKQIANwIAIAVBxAZqIgogAUE8aigCADYCACAFIAEpAiw3ArQGIAUgAzYCsAYgBUGwBmoQvwogBUEAOgCbCCAFQQE6AJ0IIAUgBS0A9gY6AI8IIAUgBS0A9wY6AJAIIAUgAS0AiAM6AI4IIAUgAS0AlgM6AJwIIAUgAS0AngM6AKQIIAUgASgBggM2AIgIIAUgAS8BhgM7AIwIIAUgASkAiwM3AJEIIAUgAS8AkwM7AJkIIAUgASgCmAM2AJ4IIAUgAS8BnAM7AKIIIAVByQZqIA9BFWopAAA3AAAgCiAPQRBqKQEANwIAIAYgD0EIaikBADcCACAFIA8pAQA3ArQGIAQgBUGICGoQwAggBSABNgKwBiAFKAKMByEQIAVBqAdqIAEQswEgBSgCrAchBCAFKAKoByIPQYCAgIB4RwRAAkAgBSgCsAciDgRAQQAhBiAEIQMgDiEKA0AgAxDfFSAGaiEGIANBQGshAyAKQQFrIgoNAAsgBkEBRwRAIBAoAgQhAyAQKAIAIQYgBUESOgCoByABIAYgAyAFQagHahC8GQsgBCAOQdz03wAQkyMiAygCAEECRw0BIAVBmAJqIAMgDkHs9N8AEJMjEIwMIAUoApwCIQMgBSgCmAIhBiAFQRk6AKgHIAEgBiADIAVBqAdqELwZDAELIBAoAgQhAyAQKAIAIQYgBUESOgCoByABIAYgAyAFQagHahC8GQsgBSAONgKgByAFIAQ2ApwHIAUgDzYCmAcgBUGwBmoQiiYCQAJAIAsQ4w0iAwRAIAMoAgBBCkYNAQsgBUG4BmogCxDmCyAFQYgCaiALEJ8UIAVB0N3fADYCtAYgBUE0OgCwBiAFKAKIAiAFKAKMAiAFQbAGahDrFCEGIAsQ4w0iA0UNASADKAIAQSRHDQEgASABKQNANwN4IAEoAiggAUElNgIoQSRHDRAgASABKAIsEIIMDAELIAEoAighBiABQSU2AiggASABKQNANwN4IAVBvAZqIAFBLGoiA0EIaikCADcCACAFQcQGaiADQRBqKAIANgIAIAUgAykCADcCtAYgBSAGNgKwBiAFQbAGahC/CkEAIQYCQCABLQD4AkECRw0AIAsQ4w0iA0UNACADKAIAQRNHDQAgBUGQAmogAUGo2N8AEPMBIAUoApQCIQYgBSgCkAINAQsgBSAGNgKkByAFQbAGaiABIAUoAoQHIg8tAAAgBSgCiAciEy0AACAEIA4QqBkQpgMgBSgCtAYhCiAFKAKwBiIQQYGAgIB4RwRAIAVBsAdqIhQgBUHABmoiCykCADcDACAFIAUpArgGNwOoByABLQD4AkECRyAQQYCAgIB4R3INBCAOQQZ0IQMDQCADRQ0FIAQoAgBBBEYEQCAEKAIQIQ4gBCgCDCEbIAVBqQE6ALAGIAEgGyAOIAVBsAZqELwZCyAEQUBrIQQgA0FAaiEDDAALAAsgBUGkB2oQ9ScgCiEGCyAFQZgHahDhJgwBCyAFQbAGahCKJiAEIQYLIA0QvigMAQsgBUHEBmogBUGAB2ooAgA2AgAgBUG4BmoiGyAFQaAHaigCADYCACAFIAUpA/gGNwK8BiAFIAUpApgHNwOwBiABKAJ8IQQgBSgCkAcoAgAhDiATLQAAIRMgDy0AACEPQcgAQQQQjCAiAyAKNgIcIAMgEDYCGCADIA86AEUgAyATOgBEIAMgBjYCQCADIA02AjwgA0EANgI4IAMgDiAEIAQgDkkbNgI0IAMgDiAEIAQgDksbNgIwIANBEGogCykDADcCACADQQhqIBspAwA3AgAgAyAFKQOwBjcCACADIAUpA6gHNwIgIANBKGogFCkDADcCAEEBDAELIAVB+AZqENcmIAYhA0EACyEEIAVBqAhqEIomAkACQCAEBEAgBUHgB2oQiiYgAS0A+AJBAkcNAiABLQCfA0UNAQwCCyAHQQ02AgAgByADNgIEIAVB4AdqEIomIAVB8ARqEKAhDAYLIAVB+AFqIAVB8ARqEJMTIAUoAvwBIQQgBSgC+AEhBiAFQYABOgCwBiABIAYgBCAFQbAGahC8GQsgBSgC8ARBBUYEQCAMIAEoAnwiCiAKIAxLGyEEIAUoAoQFIQYgEkEDRwRAIAVBtQE6ALAGIAEgBCAGIAQgBkkbIAQgBiAEIAZLGyAFQbAGahC8GQsgBUG8BmogBUH4BGoiDUEIaigCADYCACAHQQY2AgAgByAROgApIAcgFzoAKCAHIBY6ACcgByAVOgAmIAdBAjoAJSAHIBI6ACQgByADNgIgIAcgDCAKIAogDEkbNgIcIAcgBDYCGCAHIAY2AhQgBSANKQIANwK0BiAHIAUpArAGNwIEIAdBDGogBUG4BmopAgA3AgAMBQsgDCABKAJ8IgQgBCAMSxshBiAMIAQgBCAMSRshBAJAIBZFDQAgAygCGEGAgICAeEYNACAFQaEBOgCwBiABIAYgBCAFQbAGahC8GQsgB0EFNgIAIAVBzAZqIAVBiAVqKQMANwIAIAVBxAZqIAVBgAVqKQMANwIAIAVBvAZqIAVB+ARqKQMANwIAIAUgBSkD8AQ3ArQGIAdBBGogBUGwBmpBJBD2BhogByASOgA5IAdBAjoAOCAHIBE6ADcgByAXOgA2IAcgFjoANSAHIBU6ADQgByADNgIwIAcgBDYCLCAHIAY2AigMBAsgBUGwBmoQiiYLAkACQAJAIAsQ4w0iAwRAIAMoAgBBCUYNAQsgBUG4BmogCxDmCyAFQdABaiALEJ8UIAVB+N3fADYCtAYgBUE0OgCwBiAFKALQASAFKALUASAFQbAGahDrFCEGIAsQ4w0iA0UNASADKAIAQSRHDQEgASABKQNANwN4IAEoAiggAUElNgIoQSRHDQsgASABKAIsEIIMDAELIAEoAighAyABQSU2AiggASABKQNANwN4IAVBvAZqIgYgAUE0aikCADcCACAFQcQGaiIKIAFBPGooAgA2AgAgBSABKQIsNwK0BiAFIAM2ArAGIAVBsAZqEL8KIAVBADoAmwggBUEBOgCdCCAFIAUtAPYGOgCPCCAFIAUtAPcGOgCQCCAFIAEtAIgDOgCOCCAFIAEtAJYDOgCcCCAFIAEtAJ4DOgCkCCAFIAEoAYIDNgCICCAFIAEvAYYDOwCMCCAFIAEpAIsDNwCRCCAFIAEvAJMDOwCZCCAFIAEoApgDNgCeCCAFIAEvAZwDOwCiCCAFQckGaiAPQRVqKQAANwAAIAogD0EQaikBADcCACAGIA9BCGopAQA3AgAgBSAPKQEANwK0BiAEIAVBiAhqEMAIIAUgATYCsAYgBSgCjAchESAFQagHaiABELMBIAUoAqwHIQQgBSgCqAciD0GAgICAeEcEQAJAIAUoArAHIg5FDQBBACEGIAQhAyAOIQoDQCADEN8VIAZqIQYgA0FAayEDIApBAWsiCg0ACyAGRQ0AIBEoAgQhAyARKAIAIQYgBUEROgCoByABIAYgAyAFQagHahC8GQsgBSAONgKgByAFIAQ2ApwHIAUgDzYCmAcgBUGwBmoQiiYCQAJAIAsQ4w0iAwRAIAMoAgBBCkYNAQsgBUG4BmogCxDmCyAFQdgBaiALEJ8UIAVB0N3fADYCtAYgBUE0OgCwBiAFKALYASAFKALcASAFQbAGahDrFCEGIAsQ4w0iA0UNASADKAIAQSRHDQEgASABKQNANwN4IAEoAiggAUElNgIoQSRHDQwgASABKAIsEIIMDAELIAEoAighBiABQSU2AiggASABKQNANwN4IAVBvAZqIAFBLGoiA0EIaikCADcCACAFQcQGaiADQRBqKAIANgIAIAUgAykCADcCtAYgBSAGNgKwBiAFQbAGahC/CkEAIQYCQCABLQD4AkECRw0AIAsQ4w0iA0UNACADKAIAQRNHDQAgBUHgAWogAUGo2N8AEPMBIAUoAuQBIQYgBSgC4AENAQsgBSAGNgKkByAFQbAGaiABIAUoAoQHIg8tAAAgBSgCiAciEy0AACAEIA4QqBkQpgMgBSgCtAYhCiAFKAKwBiIRQYGAgIB4RwRAIAVBsAdqIhQgBUHABmoiCykCADcDACAFIAUpArgGNwOoByABLQD4AkECRyARQYCAgIB4R3INBCAOQQZ0IQMDQCADRQ0FIAQoAgBBBEYEQCAEKAIQIQ4gBCgCDCEbIAVBqQE6ALAGIAEgGyAOIAVBsAZqELwZCyAEQUBrIQQgA0FAaiEDDAALAAsgBUGkB2oQ9ScgCiEGCyAFQZgHahDhJgwBCyAFQbAGahCKJiAEIQYLIA0QvigMAQsgBUHEBmogBUGAB2ooAgA2AgAgBUG4BmoiGyAFQaAHaigCADYCACAFIAUpA/gGNwK8BiAFIAUpApgHNwOwBiABKAJ8IQQgBSgCkAcoAgAhDiATLQAAIRMgDy0AACEPQcgAQQQQjCAiAyAKNgIcIAMgETYCGCADIA86AEUgAyATOgBEIAMgBjYCQCADIA02AjwgA0EANgI4IAMgDiAEIAQgDkkbNgI0IAMgDiAEIAQgDksbNgIwIANBEGogCykDADcCACADQQhqIBspAwA3AgAgAyAFKQOwBjcCACADIAUpA6gHNwIgIANBKGogFCkDADcCAEEBDAELIAVB+AZqENcmIAYhA0EACyEEIAVBqAhqEIomAkACQCAEBEAgBUHgB2oQiiYgAS0A+AJBAkcNAiABLQCfA0UNAQwCCyAHQQ02AgAgByADNgIEIAVB4AdqEIomIAVB8ARqEKAhDAILIAVByAFqIAVB8ARqEJMTIAUoAswBIQQgBSgCyAEhBiAFQYABOgCwBiABIAYgBCAFQbAGahC8GQsgBSgC8ARBBUYEQCAMIAEoAnwiCiAKIAxLGyEEIAUoAoQFIQYgEkEDRwRAIAVBtQE6ALAGIAEgBCAGIAQgBkkbIAQgBiAEIAZLGyAFQbAGahC8GQsgBUG8BmogBUH4BGoiDUEIaigCADYCACAHQQY2AgAgByAQOgApIAcgFzoAKCAHIBY6ACcgByAVOgAmIAdBAToAJSAHIBI6ACQgByADNgIgIAcgDCAKIAogDEkbNgIcIAcgBDYCGCAHIAY2AhQgBSANKQIANwK0BiAHIAUpArAGNwIEIAdBDGogBUG4BmopAgA3AgAMAQsgDCABKAJ8IgQgBCAMSxshBiAMIAQgBCAMSRshBAJAIBZFDQAgAygCGEGAgICAeEYNACAFQaEBOgCwBiABIAYgBCAFQbAGahC8GQsgB0EFNgIAIAVBzAZqIAVBiAVqKQMANwIAIAVBxAZqIAVBgAVqKQMANwIAIAVBvAZqIAVB+ARqKQMANwIAIAUgBSkD8AQ3ArQGIAdBBGogBUGwBmpBJBD2BhogByASOgA5IAdBAToAOCAHIBA6ADcgByAXOgA2IAcgFjoANSAHIBU6ADQgByADNgIwIAcgBDYCLCAHIAY2AigLQQEhAwsCQAJAIAUoAtAEQQVHBEAgAw0BDAILIAVB0ARqEKAhDAELIAVB0ARqEMoWCyAJRQ0CCyAFQbgEahDXJgwBCyAFQZwFaiAFQcAEaiIDKAIANgIAIAVBgAVqIAVBgAdqKQMANwMAIAVBiAVqIAVBiAdqKQMANwMAIAUgBSkDuAQ3ApQFIAUgEjoArAUgBSAMNgKQBUEAIQkgBUEAOgCvBSAFICA2AqgFIAUgHzYCpAUgBSAVNgKgBSAFIAY2AvQEIAUgCjYC8AQgBSAFKQP4BjcD+AQgBSAWOgCuBSAFIA5BAXEiDjoAsAUgBUGAAjsAsQUgBUEAOgCtBSAFQfkHaiAPQRVqIgQpAAA3AAAgBUH0B2ogD0EQaiIKKQEANwIAIAVB7AdqIA9BCGoiDSkBADcCACAFQQA6AMIGIAVBAToAyQYgBSABLQCeAzoAzAYgBSABKQGCAzcAsAYgBSABKQGKAzcAuAYgBSABLwGSAzsAwAYgBSABKACVAzYAwwYgBSABLwCZAzsAxwYgBSABLwGcAzsAygYgBSAPKQEANwLkByABQYABaiIGIAVBsAZqIhAQwAggBSABNgLgByAFQYACOwCPCCAFQQE6AKQHIAVBADoA8AYgBSAMNgLIBSAFIAEtAIgDOgCOCCAFIAEoAYIDNgCICCAFIAEvAYYDOwCMCCAFIAEpAIsDNwCRCCAFIAEpAJMDNwCZCCAFIAEoAJsDNgChCCAFQcEIaiAEKQAANwAAIAVBvAhqIAopAQA3AgAgBUG0CGogDSkBADcCACAFIA8pAQA3AqwIIAYgBUGICGoQwAggBSABNgKoCCAFQcgHaiADKAIANgIAIAUgBSkDuAQ3A8AHIAUgBUHIBWo2AtQHIAUgBUGkB2o2AtAHIAUgBUHwBmo2AswHAn8CQCABLQD4AkECRgRAIBAgARDEFQJAAkACQAJAIAUoArAGIgNBKGoiChDjDSIERQ0AIAQoAgBBFEcNACAELQAEQQRGDQELIAoQ4w0iBEUNAiAEKAIAQSFHDQIgA0GUAWoiBBD5FyAEEPkXIAVBiANqIANBAEEBEJQBIAUoAowDIQkgBSgCiAMNAQwCCyAFQZADaiADQQBBARCUASAFKAKUAyEJIAUoApADRQ0BCyAFQbAGahCKJiAJIQoMAgsgBUGwBmoQiiYLAkACQAJAIAsQ4w0iAwRAIAMoAgBBCUYNAQsgBUG4BmogCxDmCyAFQfACaiALEJ8UIAVB+N3fADYCtAYgBUE0OgCwBiAFKALwAiAFKAL0AiAFQbAGahDrFCEKIAsQ4w0iA0UNASADKAIAQSRHDQEgASABKQNANwN4IAEoAiggAUElNgIoQSRHDQcgASABKAIsEIIMDAELIAEoAighAyABQSU2AiggASABKQNANwN4IAVBvAZqIgogAUEsaiIEQQhqKQIANwIAIAVBxAZqIg0gBEEQaigCADYCACAFIAQpAgA3ArQGIAUgAzYCsAYgBUGwBmoiEBC/CiAFQQA6AOMEIAVBAToA5QQgBSAFLQDwBjoA1wQgBSAFLQCkBzoA2AQgBSABLQCIAzoA1gQgBSABLQCWAzoA5AQgBSABLQCeAzoA7AQgBSABKAGCAzYA0AQgBSABLwGGAzsA1AQgBSABKQCLAzcA2QQgBSABLwCTAzsA4QQgBSABKAKYAzYA5gQgBSABLwGcAzsA6gQgBUHJBmogD0EVaikAADcAACANIA9BEGopAQA3AgAgCiAPQQhqKQEANwIAIAUgDykBADcCtAYgBiAFQdAEahDACCAFIAE2ArAGIAVBqAdqIAEQswEgBSgCrAchAyAFKAKoByIKQYCAgIB4RwRAIAUgBSgCsAciBjYC+AUgBSADNgL0BSAFIAo2AvAFIBAQiiYCQAJAIAsQ4w0iCgRAIAooAgBBCkYNAQsgBUG4BmogCxDmCyAFQfgCaiALEJ8UIAVB0N3fADYCtAYgBUE0OgCwBiAFKAL4AiAFKAL8AiAFQbAGahDrFCEKIAsQ4w0iA0UNASADKAIAQSRHDQEgASABKQNANwN4IAEoAiggAUElNgIoQSRHDQggASABKAIsEIIMDAELIAEoAighCiABQSU2AiggASABKQNANwN4IAVBvAZqIARBCGopAgA3AgAgBUHEBmogBEEQaigCADYCACAFIAQpAgA3ArQGIAUgCjYCsAYgBUGwBmoQvwpBACEKAkAgAS0A+AJBAkcNACALEOMNIgRFDQAgBCgCAEETRw0AIAVBgANqIAFBqNjfABDzASAFKAKEAyEKIAUoAoADDQELIAUgCjYCmAcgBUGwBmogASAFKALMByIRLQAAIAUoAtAHIg8tAAAgAyAGEKgZEKYDIAUoArQGIQQgBSgCsAYiEEGBgICAeEcEQCAFQbAHaiITIAVBwAZqIhQpAgA3AwAgBSAFKQK4BjcDqAcgAS0A+AJBAkcgEEGAgICAeEdyDQQgBkEGdCEGA0AgBkUNBSADKAIAQQRGBEAgAygCECENIAMoAgwhCyAFQakBOgCwBiABIAsgDSAFQbAGahC8GQsgA0FAayEDIAZBQGohBgwACwALIAVBmAdqEPUnIAQhCgsgBUHwBWoQ4SYMAQsgBUGwBmoQiiYgAyEKCyAJEL4oDAELIAVBxAZqIAVByAdqKAIANgIAIAVBuAZqIgsgBUH4BWooAgA2AgAgBSAFKQPABzcCvAYgBSAFKQLwBTcDsAYgASgCfCEGIAUoAtQHKAIAIQ0gDy0AACEPIBEtAAAhEUHIAEEEEIwgIgMgBDYCHCADIBA2AhggAyAROgBFIAMgDzoARCADIAo2AkAgAyAJNgI8IANBADYCOCADIA0gBiAGIA1JGzYCNCADIA0gBiAGIA1LGzYCMCADQRBqIBQpAwA3AgAgA0EIaiALKQMANwIAIAMgBSkDsAY3AgAgAyAFKQOoBzcCICADQShqIBMpAwA3AgBBAQwBCyAFQcAHahDXJiAKIQNBAAshBCAFQagIahCKJgJAIAQEQCAFQeAHahCKJiAFKALwBEEFRgRAIAwgASgCfCIGIAYgDEsbIQQgBSgChAUhCSASQQNHBEAgBUG1AToAsAYgASAEIAkgBCAJSRsgBCAJIAQgCUsbIAVBsAZqELwZCyAFQbwGaiAFQfgEaiIKQQhqKAIANgIAIAdBBjYCACAHIA46ACkgB0EAOgAoIAcgFjoAJyAHIBU6ACYgB0EAOgAlIAcgEjoAJCAHIAM2AiAgByAMIAYgBiAMSRs2AhwgByAENgIYIAcgCTYCFCAFIAopAgA3ArQGIAcgBSkCsAY3AgQgB0EMaiAFQbgGaikCADcCAAwDCyAMIAEoAnwiBCAEIAxLGyEJIAwgBCAEIAxJGyEEIBZFDQEgAygCGEGAgICAeEYNASAFQaEBOgCwBiABIAkgBCAFQbAGahC8GQwBCyAHQQ02AgAgByADNgIEIAVB4AdqEIomIAVB8ARqEKAhDAELIAdBBTYCACAFQcwGaiAFQYgFaikDADcCACAFQcQGaiAFQYAFaikDADcCACAFQbwGaiAFQfgEaikDADcCACAFIAUpA/AENwK0BiAHQQRqIAVBsAZqQSQQ9gYaIAcgEjoAOSAHQQA6ADggByAOOgA3IAdBADoANiAHIBY6ADUgByAVOgA0IAcgAzYCMCAHIAQ2AiwgByAJNgIoCyAFQdAIaiQADAILQbnj4ABBKEH48N8AENoXAAtBuePgAEEoQYjx3wAQ2hcACyAIKAKUAiEDIAgoApACIgRBDUYNAiA3IDhB0AAQ9gYaIAggAzYC7AIgCCAENgLoAiABLQCQA0EBcQ0JIAgoAogDQYCAgIB4RyAEQQVJcSIDICZxRQRAIAMgJnIhJgwKCyAIKAKgAyEDIAgoAqQDIQQgCEHlADoAkAIgASADIAQgCEGQAmoQvBlBASEmDAkLIAEoAtgCIQMgCEEAOgCQAiAIIAMgAyAIQZACahDrFDYC8AEgCEEBNgLsASAIQewBahD8IwsgCCgC5AEhAyAIKALgASIEQYCAgIB4Rg0BIAggCCgC6AE2ArgBIAggAzYCtAEgCCAENgKwASAIQbwBahCKJiAZEOMNRQ0DIBkQ4w0iA0UNAiADKAIAQQ5HDQIgASgCKCEDIAFBJTYCKCABIAEpA0A3A3ggCEH0AmogGEEIaikCADcCACAIQfwCaiAYQRBqKAIANgIAIAggGCkCADcC7AIgCCADNgLoAiAIQegCahC/CgwECyAIQewBahCKJiAIQeABahDsJgsgAEEDOgAUIAAgAzYCACAIQbwBahCKJgwICyAIQfACaiAZEOYLIAhBGGogGRCfFCAIQbjZ3wA2AuwCIAhBNDoA6AIgCCgCGCAIKAIcIAhB6AJqEOsUIQMgGRDjDSIERQ0DIAQoAgBBJEcNAyABIAEpA0A3A3ggASgCKCABQSU2AihBJEcNAiABIAEoAiwQggwMAwsgCEHwAmogGRDmCyAIQRBqIBkQnxQgCEG42d8ANgLsAiAIQTQ6AOgCIAEgCCgCECAIKAIUIAhB6AJqELwZCyAAIAgpA3A3AwAgAEEIaiAIQfgAaikDADcDACAAQRBqIAhBgAFqKQMANwMAIAEoAnwhAyAIQZgCaiAIQeAAaigCADYCACAIQaQCaiAIQbgBaigCADYCACAIIAgpA1g3A5ACIAggCCkCsAE3ApwCIAgoAmgoAgAhBCAIKAKgASEJIAhBsAJqIAhBrAFqKAIANgIAIAggCCkCpAE3A6gCIAhBnQNqQgA3AAAgCEEANgKUAyAIQgA3AowDIAhCADcCmAMgCEEANgKAAyAIQgg3AvgCIAhCADcC8AIgCEKAgICAwAA3AugCIAhCBDcChANBwABBBBCMICAIQZACakEkEPYGIgFBADoAPCABIAI2AjggASAoNgI0IAEgCTYCMCABQQA2AiwgASAEIAMgAyAESRs2AiggASAEIAMgAyAESxs2AiQgACABNgIYIAhB6AJqEJkdDAsLQbnj4ABBKEG88N8AENoXAAsgAEEDOgAUIAAgAzYCACAIQbABahDsJgwDCyAIQeABaiAIQegCahDjGSAIQewBahCKJgwACwALIAhB8AJqIBkQ5gsgCEEIaiAZEJ8UIAhB4NnfADYC7AIgCEE0OgDoAiAIKAIIIAgoAgwgCEHoAmoQ6xQhAwJAIBkQ4w0iBEUNACAEKAIAQSRHDQAgASABKQNANwN4IAEoAiggAUElNgIoQSRGBEAgASABKAIsEIIMDAELQbnj4ABBKEGs8N8AENoXAAsgAEEDOgAUIAAgAzYCAAsgCEGkAWoQ2CYLIAIQuiggCEGgAWoQ9CcLICgQvigLIAgpA3AgCC0AhAEQoyMMAQsgAEEDOgAUIAAgAjYCAAsgCEHYAGoQ1yYLIAhBNGoQiiYgCEHAA2okAAuZrAICM38CfiMAQcADayIIJAAgCCAEOgAzIAggAjYCLCAIQc0AaiABQb8CaikAADcAACAIQcgAaiABQboCaikBADcCACAIQUBrIAFBsgJqKQEANwIAIAhBAToA6wIgCCABLQCsAjoA6gIgCCABLQDGAjoAhAMgCCABLwGqAjsA6AIgCCABKQGuAjcA7AIgCCABKQG2AjcA9AIgCCABKQG+AjcA/AIgCCABKQGqAjcCOCABQShqIhUgCEHoAmoQyAggCCABNgI0IAhB4ABqIANBCGooAgA2AgAgCCADKQIANwNYIAggCEEsajYCaCAIIAhBM2o2AmQCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIBUQyA0iAkUNACACKAIAQQJHDQAgAi0ACEECRw0AIAItAAlBGUYNAQsgCEHwAmogFRCAECAIIBUQ6hMgCEHQ8N8ANgLsAiAIQTQ6AOgCIAgoAgAgCCgCBCAIQegCahDrFCECIBUQyA0iA0UNDSADKAIAQSRGDQEMDQsgASgCyAIhAiABQSU2AsgCIAEgASkD4AI3A5gDIAhB9AJqIgQgAUHUAmopAgA3AgAgCEH8AmogAUHcAmooAgA2AgAgCCABKQLMAjcC7AIgCCACNgLoAiAIQegCaiICEL4KIAIgASAILQAzQQEQmwQgCCgC6AIhAiAILQD8AiIDQQNGDQEgCEGYAWoiBiAEKQIANwMAIAhBjgFqIgQgCEH/AmotAAA6AAAgCCAIKQLsAjcDkAEgCCAILwD9AjsBjAEgA0ECRwRAIAhB/ABqIAYpAwA3AgAgCEGHAWogBC0AADoAACAIIAI2AnAgCCAIKQOQATcCdCAIIAgvAYwBOwCFAQsgCCADOgCEAUEAIQMgAS0AoAJBAkcNBSAIQZACaiAIQfAAahDHCSAIKAKQAg0CDAQLIAEgASkD4AI3A5gDIAEoAsgCIAFBJTYCyAJBJEcNAiABIAEoAswCEPsLDAsLIABBAzoAFCAAIAI2AgAMCwsgCCgCmAIhAiAIKAKUAiEEIAhBrAE6AOgCIAEgBCACIAhB6AJqEKkZDAELQbnj4ABBKEHo8N8AENoXAAsgAS0AoAJBAkcNACAIQSBqIAFBAUEBEMYOIAgoAiQhKCAIKAIgDQELIAFBzAJqIRggFRDIDSIERQ0CIAQoAgBBAkcNAiAELQAIQQJHDQJBACECIAQtAAlBGkcNAyABKALIAiECIAFBJTYCyAIgASABKQPgAjcDmAMgCEH0AmoiBiAYQQhqKQIANwIAIAhB/AJqIgsgGEEQaigCADYCACAIIBgpAgA3AuwCIAggAjYC6AIgCEHoAmoiBBC+CiAEIAEQrQkgCCgC7AIhAiAIKALoAiIDRQ0BIAggAzYC7AEgAS0AoAJBAkcNAyAVEMgNIgpFDQMgCigCAEEQRw0DIAEoAsgCIQogAUElNgLIAiABIAEpA+ACNwOYAyAGIBhBCGopAgA3AgAgCyAYQRBqKAIANgIAIAggGCkCADcC7AIgCCAKNgLoAiAEEL4KIAQgARDMAiAIKALsAiEEIAgoAugCIgZBgICAgHhHBEAgCCAIKALwAiILNgKYAiAIIAQ2ApQCIAggBjYCkAIgC0EEdCEGA0AgBgRAIAQoAgghCyAEKAIEIQogCEGXAToA6AIgASAKIAsgCEHoAmoQqRkgBkEQayEGIARBEGohBAwBBSAIQZACahDYJgwGCwALAAsgAEEDOgAUIAAgBDYCACACELooIAhB7AFqEL8oDAQLIABBAzoAFCAAICg2AgAMBAsgAEEDOgAUIAAgAjYCAAwCC0EAIQILIAggAzYCoAECQCAIAn8CQAJAAkACQCAVEMgNIgRFDQAgBCgCAEECRw0AIAQtAAhBAkcNACAELQAJQRpHDQAgASgCyAIhBCABQSU2AsgCIAEgASkD4AI3A5gDIAhB9AJqIBhBCGopAgA3AgAgCEH8AmogGEEQaigCADYCACAIIBgpAgA3AuwCIAggBDYC6AIgCEHoAmoiBBC+CiABKAKcAyEGIAEoApgDIQsgCEGVAToA6AIgASALIAYgBBCpGSAEIAEQrQkgCCgC7AIhBCAIKALoAiIGRQ0BIAggBDYClAIgCCAGNgKQAiAIQZACahC/KCAEELooC0EEIQRBACEGIAEtAKACQQJGDQEMAgsgAEEDOgAUIAAgBDYCAAwDCyAVEMgNIgtFDQAgCygCAEECRw0AIAstAAgNAEEAIAstAAlBE0cNARogASgCyAIhBCABQSU2AsgCIAEgASkD4AI3A5gDIAhB9AJqIBhBCGopAgA3AgAgCEH8AmogGEEQaigCADYCACAIIBgpAgA3AuwCIAggBDYC6AIgCEHoAmoiBBC+CiAEIAEQzAIgCCgC7AIhBCAIKALoAiIGQYCAgIB4RwRAIAgoAvACDAILIABBAzoAFCAAIAQ2AgAMAgtBAAs2AqwBIAggBDYCqAEgCCAGNgKkAQJAAkACQCABLQCgAkECRw0AAkAgFRDIDSIERQ0AIAQoAgBBAkcNACAELQAIDQAgBC0ACUETRw0AIAEoAsgCIQQgAUElNgLIAiABIAEpA+ACNwOYAyAIQfQCaiAYQQhqKQIANwIAIAhB/AJqIBhBEGooAgA2AgAgCCAYKQIANwLsAiAIIAQ2AugCIAhB6AJqIgQQvgogASgCnAMhBiABKAKYAyELIAhBmAE6AOgCIAEgCyAGIAQQqRkgBCABEMwCIAgoAuwCIQQgCCgC6AIiBkGAgICAeEcEQCAIIAgoAvACNgKYAiAIIAQ2ApQCIAggBjYCkAIgCEGQAmoQ2CYMAQsgAEEDOgAUIAAgBDYCAAwDCyABLQCgAkECRw0AIBUQyA0iBEUNACAEKAIAQQJHDQAgBC0ACEECRw0AIAQtAAlBGkcNACABKALIAiEEIAFBJTYCyAIgASABKQPgAjcDmAMgCEH0AmogGEEIaikCADcCACAIQfwCaiAYQRBqKAIANgIAIAggGCkCADcC7AIgCCAENgLoAiAIQegCaiIEEL4KIAEoApwDIQYgASgCmAMhCyAIQZYBOgDoAiABIAsgBiAEEKkZIAQgARCtCSAIKALsAiEGIAgoAugCIgQEQCAIIAQ2AugCIANFBEAgCEGgAWoQ5SYgCCAENgKgASAGBEAgAhC6KCAGIQIMBAtBABC6KAwDCyAGELooIAhB6AJqEL8oDAELIABBAzoAFCAAIAY2AgAMAgsgAyEECwJAIBUQyA0iA0UNACADKAIAQQ1HDQAgASgCyAIhAyABQSU2AsgCIAEgASkD4AI3A5gDIAhB9AJqIBhBCGoiMSkCADcCACAIQfwCaiAYQRBqIjIoAgA2AgAgCCAYKQIANwLsAiAIIAM2AugCIAhB6AJqIgMQvgogCEHVAWogAUGqAmoiJEEVaiIzKQAANwAAIAhB0AFqICRBEGoiNCkBADcCACAIQcgBaiAkQQhqIjUpAQA3AgAgCCAEQQBHOgD+AiAIIAEpAaoCNwDoAiAIIAEpAbICNwDwAiAIIAEoAboCNgD4AiAIIAEvAb4COwD8AiAIIAEoAMECNgD/AiAIIAEvAMUCOwCDAyAIICQpAQA3AsABIBUgAxDICCAIIAE2ArwBIAhBADYC6AEgCEKAgICAgAE3AuABIAhBkAJqQQRyISkgCEHwAmohNiAIQZgCaiE3IAhB8AFqISUDQAJAAkACQAJAAkACQAJAAkACQCAVEMgNIgMEQCAIQQA2AuwBIAggAzYC8AEgCEHsAWoQpiMgFRDIDSIDBEAgAygCAEEORg0CCwJAIBUQyA0iA0UNACADKAIAQQ9HDQAgKSAYKQIANwIAIAEoAsgCIQMgAUElNgLIAiABIAEpA+ACNwOYAyApQQhqIDEpAgA3AgAgKUEQaiAyKAIANgIAIAggAzYCkAIgCEGQAmoiBhC+CiABKAKcAyEDIAEoApgDIQQgCEEKNgKQAiAIIAQgAyADIARJGzYCmAIgCCAEIAMgAyAESxs2ApQCIAhB4AFqIAYQ4xkMCwsgJUEVaiAzKQAANwAAICVBEGogNCkBADcBACAlQQhqIDUpAQA3AQAgJSAkKQEANwEAIAhBAToAqQIgCCABLQDCAjoAqAIgCCABLQDGAjoArAIgCCABKQGqAjcAkAIgCCABKQGyAjcAmAIgCCABKQG6AjcAoAIgCCABLwHEAjsAqgIgFSAIQZACaiIHEMgIIAggATYC7AFBACEKQQAhC0EAIQ5BACEQQQAhEkEAIRNBACEWQQAhGUEAIRpBACEbQQAhHEEAIR1BACEeQQAhH0EAISBBACEhQQAhIkEAISpBACEsQQAhLSMAQdAIayIFJAAgAUEoaiIJEKUgIQwgBUHwBGogAUEAELsBIAUoAvQEIQMCQAJAAkACQAJAAkACQAJAIAUoAvAEIgRBgICAgHhHBEAgBSAFKAL4BDYC1AMgBSADNgLQAyAFIAQ2AswDQQMhESABLQCgAkECRw0DAkACQAJAIAkQyA0iA0UNACADKAIAQQJHDQAgAy0ACA0AIAMtAAlBDEYNAQsgAS0AoAJBAkYNAQwGCyABKALIAiEDIAFBJTYCyAIgASABKQPgAjcDmAMgBUH8BGogAUHUAmopAgA3AgAgBUGEBWogAUHcAmooAgA2AgAgBSABKQLMAjcC9AQgBSADNgLwBCAFQfAEahC+CkEBIRogAS0AoAJBAkcNAwsgBUHwBGogARCBCiAFLQDwBEUEQCAFLQDxBCERIBpFDQIMAwsgBSgC9AQhAyAHQQ02AgAgByADNgIEIAVBzANqENcmDAULIAdBDTYCACAHIAM2AgQMBAsgAS0AoAJBAkcNASAJEMgNIgNFDQEgAygCAEECRw0BIAMtAAgNASADLQAJQQxHDQEgASgCyAIhAyABQSU2AsgCIAEgASkD4AI3A5gDIAVB/ARqIAFB1AJqKQIANwIAIAVBhAVqIAFB3AJqKAIANgIAIAUgASkCzAI3AvQEIAUgAzYC8AQgBUHwBGoQvgoLAkACQCABENUORQRAIAFBARDlCkUEQCABLQCgAkECRw0DIAkQyA0iA0UNAyADKAIAQRdHDQMLIAVBiq3gAEEHELkaNwPgAyAFQQA2AtgDIAUgDCABKAKcAyIDIAMgDEkbNgLsAyAFIAwgAyADIAxLGzYC6ANBACEDIAEtAKACQQJHDQEgCRDIDSIERQ0BIAQoAgBBF0cNASABKALIAiEDIAFBJTYCyAIgASABKQPgAjcDmAMgBUH8BGogAUHUAmopAgA3AgAgBUGEBWogAUHcAmooAgA2AgAgBSABKQLMAjcC9AQgBSADNgLwBCAFQfAEahC+CkEBIQMMAQtBiq3gAEEHELkaITggDCABKAKcAyIDIAMgDEsbIQQgDCADIAMgDEkbIQMCf0EAIAEtAKACQQJHDQAaQQAgCRDIDSIGRQ0AGkEAIAYoAgBBF0cNABogASgCyAIhBiABQSU2AsgCIAEgASkD4AI3A5gDIAVB/ARqIAFB1AJqKQIANwIAIAVBhAVqIAFB3AJqKAIANgIAIAUgASkCzAI3AvQEIAUgBjYC8AQgBUHwBGoQvgpBAQshDiAFQZwFaiAFQdQDaiIGKAIANgIAIAUgBSkCzAM3ApQFIAUgEToArAUgBSAMNgKQBSAFQQA6ALAFIAUgDjoArwUgBUEANgKgBSAFQQA7ALEFIAVBADsArQUgBSADNgKEBSAFIAQ2AoAFIAUgODcD+AQgBUEANgLwBCAFQfkHaiABQb8CaiIEKQAANwAAIAVB9AdqIAFBugJqIgMpAQA3AgAgBUHsB2ogAUGyAmoiCikBACI4NwIAIAVBADoAwgYgBUEBOgDJBiAFIAEtAMYCOgDMBiAFIAEpAaoCIjk3ALAGIAUgODcAuAYgBSADLwEAOwDABiAFIAEoAL0CNgDDBiAFIAEvAMECOwDHBiAFIAEvAcQCOwDKBiAFIDk3AuQHIAkgBUGwBmoiDRDICCAFIAE2AuAHIAVBADsA1wQgBUEAOgCYByAFQQA6AMQEIAUgDDYC8AUgBSABLQCwAjoA1gQgBSABKAGqAjYA0AQgBSABLwGuAjsA1AQgBSABKQCzAjcA2QQgBSABKQC7AjcA4QQgBSABKADDAjYA6QQgBUHBCGogBCkAADcAACAFQbwIaiADKQEANwIAIAVBtAhqIAopAQA3AgAgBSABKQGqAjcCrAggCSAFQdAEahDICCAFIAE2AqgIIAVBkAhqIAYoAgA2AgAgBSAFKQLMAzcDiAggBSAFQfAFajYCnAggBSAFQZgHajYCmAggBSAFQcQEajYClAgCfwJAIAEtAKACQQJGBEAgDSABELkVAkACQAJAAkAgBSgCsAYiA0EoaiIGEMgNIgRFDQAgBCgCAEEURw0AIAQtAARBBEYNAQsgBhDIDSIERQ0CIAQoAgBBIUcNAiADQTxqIgQQ+RcgBBD5FyAFQSBqIANBAEEBEJMBIAUoAiQhCyAFKAIgDQEMAgsgBUEoaiADQQBBARCTASAFKAIsIQsgBSgCKEUNAQsgBUGwBmoQ7yQgCyEEDAILIAVBsAZqEO8kCwJAAkACQCAJEMgNIgMEQCADKAIAQQlGDQELIAVBuAZqIAkQgBAgBUEIaiAJEOoTIAVB+N3fADYCtAYgBUE0OgCwBiAFKAIIIAUoAgwgBUGwBmoQ6xQhBCAJEMgNIgNFDQEgAygCAEEkRw0BIAEgASkD4AI3A5gDIAEoAsgCIAFBJTYCyAJBJEcNCyABIAEoAswCEPsLDAELIAEoAsgCIQMgAUElNgLIAiABIAEpA+ACNwOYAyAFQbwGaiIEIAFB1AJqKQIANwIAIAVBxAZqIgYgAUHcAmooAgA2AgAgBSABKQLMAjcCtAYgBSADNgKwBiAFQbAGaiIKEL4KIAVBADoA4wUgBUEBOgDlBSAFIAUtAMQEOgDXBSAFIAUtAJgHOgDYBSAFIAEtALACOgDWBSAFIAEtAL4COgDkBSAFIAEtAMYCOgDsBSAFIAEoAaoCNgDQBSAFIAEvAa4COwDUBSAFIAEpALMCNwDZBSAFIAEvALsCOwDhBSAFIAEoAsACNgDmBSAFIAEvAcQCOwDqBSAFQckGaiABQaoCaiIDQRVqKQAANwAAIAYgA0EQaikBADcCACAEIANBCGopAQA3AgAgBSADKQEANwK0BiAJIAVB0AVqEMgIIAUgATYCsAYgBUHAB2ogARCyASAFKALEByEDIAUoAsAHIgRBgICAgHhHBEAgBSAFKALIByIGNgKAByAFIAM2AvwGIAUgBDYC+AYgChDvJAJAAkAgCRDIDSIEBEAgBCgCAEEKRg0BCyAFQbgGaiAJEIAQIAVBEGogCRDqEyAFQdDd3wA2ArQGIAVBNDoAsAYgBSgCECAFKAIUIAVBsAZqEOsUIQQgCRDIDSIDRQ0BIAMoAgBBJEcNASABIAEpA+ACNwOYAyABKALIAiABQSU2AsgCQSRHDQwgASABKALMAhD7CwwBCyABKALIAiEKIAFBJTYCyAIgASABKQPgAjcDmAMgBUG8BmogAUHMAmoiBEEIaikCADcCACAFQcQGaiAEQRBqKAIANgIAIAUgBCkCADcCtAYgBSAKNgKwBiAFQbAGahC+CkEAIQQCQCABLQCgAkECRw0AIAkQyA0iCkUNACAKKAIAQRNHDQAgBUEYaiABQajY3wAQ8QEgBSgCHCEEIAUoAhgNAQsgBSAENgKoByAFQbAGaiABIAUoApQIIhAtAAAgBSgCmAgiFC0AACADIAYQqBkQrAMgBSgCtAYhCiAFKAKwBiIPQYGAgIB4RwRAIAVByAdqIhIgBUHABmoiEykCADcDACAFIAUpArgGNwPAByAPQYCAgIB4Rw0EIAEtAKACQQJHDQQgBkEGdCEGA0AgBkUNBSADKAIAQQRGBEAgAygCECENIAMoAgwhGSAFQakBOgCwBiABIBkgDSAFQbAGahCpGQsgA0FAayEDIAZBQGohBgwACwALIAVBqAdqEOAmIAohBAsgBUH4BmoQ4SYMAQsgBUGwBmoQ7yQgAyEECyALEL4oDAELIAVBxAZqIAVBkAhqKAIANgIAIAVBuAZqIhkgBUGAB2ooAgA2AgAgBSAFKQOICDcCvAYgBSAFKQL4BjcDsAYgASgCnAMhBiAFKAKcCCgCACENIBQtAAAhFCAQLQAAIRBByABBBBCMICIDIAo2AhwgAyAPNgIYIAMgEDoARSADIBQ6AEQgAyAENgJAIAMgCzYCPCADQQA2AjggAyANIAYgBiANSRs2AjQgAyANIAYgBiANSxs2AjAgA0EQaiATKQMANwIAIANBCGogGSkDADcCACADIAUpA7AGNwIAIAMgBSkDwAc3AiAgA0EoaiASKQMANwIAQQEMAQsgBUGICGoQ1yYgBCEDQQALIQQgBUGoCGoQ7yQCQCAEBEAgBUHgB2oQ7yQgBSgC8ARBBUcNASAMIAEoApwDIgsgCyAMSxshBCAFKAKEBSEGIBFBA0cEQCAFQbUBOgCwBiABIAQgBiAEIAZJGyAEIAYgBCAGSxsgBUGwBmoQqRkLIAVBvAZqIAVB+ARqIgpBCGooAgA2AgAgB0EGNgIAIAdBADoAKSAHIA46ACggB0EAOgAnIAdBADsAJSAHIBE6ACQgByADNgIgIAcgDCALIAsgDEkbNgIcIAcgBDYCGCAHIAY2AhQgBSAKKQIANwK0BiAHIAUpArAGNwIEIAdBDGogBUG4BmopAgA3AgAMBgsgB0ENNgIAIAcgAzYCBCAFQeAHahDvJCAFQfAEahDwIAwFCyABKAKcAyEEIAVBzAZqIAVBiAVqKQMANwIAIAVBxAZqIAVBgAVqKQMANwIAIAVBvAZqIAVB+ARqKQMANwIAIAdBBTYCACAFIAUpA/AENwK0BiAHQQRqIAVBsAZqQSQQ9gYaIAcgEToAOSAHQQA7ADcgByAOOgA2IAdBADsBNCAHIAM2AjAgByAMIAQgBCAMSRs2AiwgByAMIAQgBCAMSxs2AigMBAsgBUEANgLwBCAHIAEgDCAFQcwDaiARIAVB2ANqQQAgBUHwBGogA0EAQQBBAEEAEJEBDAMLIAwgASgCnAMiAyADIAxLGyEiIAwgAyADIAxJGyEhQQEhGgwBC0EAIRoLIAkQpSAhAwJ/QQAgCRDIDSIERQ0AGkEAIAQoAgBBAkcNABpBACAELQAIDQAaQQAgBC0ACUEHRw0AGiABKALIAiEEIAFBJTYCyAIgASABKQPgAjcDmAMgBUH8BGogAUHUAmopAgA3AgAgBUGEBWogAUHcAmooAgA2AgAgBSABKQLMAjcC9AQgBSAENgLwBCAFQfAEahC+CiADIAEoApwDIgQgAyAESRshHyADIAQgAyAESxshIEEBCyEUAkAgAS0AoAJBAkcEQCABLQCoAkEBcUUNAQsgCRClICEDIAkQyA0iBEUNACAEKAIAQQJHDQAgBC0ACA0AIAQtAAlBI0cNACABKALIAiEEIAFBJTYCyAIgASABKQPgAjcDmAMgBUH8BGogAUHUAmopAgA3AgAgBUGEBWogAUHcAmooAgA2AgAgBSABKQLMAjcC9AQgBSAENgLwBCAFQfAEahC+CiADIAEoApwDIgQgAyAESRshHCADIAQgAyAESxshHSABQcwCaiEEAkAgARDVDkUEQEEBIRsgAUEBEOUKRQRAIAEtAKACQQJHDQMgCRDIDSIDRQ0DIAMoAgBBF0cNAwtB+rLgAEEIELkaITggBSAdNgKMBCAFIBw2AogEIAUgODcDgAQgBUEANgL4A0EAIQMgAS0AoAJBAkcNASAJEMgNIgZFDQEgBigCAEEXRw0BIAEoAsgCIQMgAUElNgLIAiABIAEpA+ACNwOYAyAFQfwEaiAEQQhqKQIANwIAIAVBhAVqIARBEGooAgA2AgAgBSAEKQIANwL0BCAFIAM2AvAEIAVB8ARqEL4KQQEhAwwBC0H6suAAQQgQuRohOAJ/QQAgAS0AoAJBAkcNABpBACAJEMgNIgNFDQAaQQAgAygCAEEXRw0AGiABKALIAiEDIAFBJTYCyAIgASABKQPgAjcDmAMgBUH8BGogBEEIaikCADcCACAFQYQFaiAEQRBqKAIANgIAIAUgBCkCADcC9AQgBSADNgLwBCAFQfAEahC+CkEBCyEOIAVBnAVqIAVB1ANqIgYoAgA2AgAgBSAFKQLMAzcClAUgBSAROgCsBSAFIAw2ApAFIAVBADoAsAUgBSAOOgCvBSAFICA2AqgFIAUgHzYCpAUgBSAUNgKgBSAFQQA7ALEFIAVBADsArQUgBSAdNgKEBSAFIBw2AoAFIAUgODcD+AQgBUEANgLwBCAFQfkHaiABQb8CaiIKKQAANwAAIAVB9AdqIAFBugJqIgMpAQA3AgAgBUHsB2ogAUGyAmoiDSkBACI4NwIAIAVBADoAwgYgBUEBOgDJBiAFIAEtAMYCOgDMBiAFIAEpAaoCIjk3ALAGIAUgODcAuAYgBSADLwEAOwDABiAFIAEoAL0CNgDDBiAFIAEvAMECOwDHBiAFIAEvAcQCOwDKBiAFIDk3AuQHIAkgBUGwBmoiDxDICCAFIAE2AuAHIAVBADsA1wQgBUEAOgCYByAFQQA6AMQEIAUgDDYC8AUgBSABLQCwAjoA1gQgBSABKAGqAjYA0AQgBSABLwGuAjsA1AQgBSABKQCzAjcA2QQgBSABKQC7AjcA4QQgBSABKADDAjYA6QQgBUHBCGogCikAADcAACAFQbwIaiADKQEANwIAIAVBtAhqIA0pAQA3AgAgBSABKQGqAjcCrAggCSAFQdAEahDICCAFIAE2AqgIIAVBkAhqIAYoAgA2AgAgBSAFKQLMAzcDiAggBSAFQfAFajYCnAggBSAFQZgHajYCmAggBSAFQcQEajYClAgCfwJAIAEtAKACQQJGBEAgDyABELkVAkACQAJAAkAgBSgCsAYiA0EoaiIKEMgNIgZFDQAgBigCAEEURw0AIAYtAARBBEYNAQsgChDIDSIGRQ0CIAYoAgBBIUcNAiADQTxqIgYQ+RcgBhD5FyAFQbgDaiADQQBBARCTASAFKAK8AyELIAUoArgDDQEMAgsgBUHAA2ogA0EAQQEQkwEgBSgCxAMhCyAFKALAA0UNAQsgBUGwBmoQ7yQgCyEEDAILIAVBsAZqEO8kCwJAAkACQCAJEMgNIgMEQCADKAIAQQlGDQELIAVBuAZqIAkQgBAgBUGgA2ogCRDqEyAFQfjd3wA2ArQGIAVBNDoAsAYgBSgCoAMgBSgCpAMgBUGwBmoQ6xQhBCAJEMgNIgNFDQEgAygCAEEkRw0BIAEgASkD4AI3A5gDIAEoAsgCIAFBJTYCyAJBJEcNCSABIAEoAswCEPsLDAELIAEoAsgCIQMgAUElNgLIAiABIAEpA+ACNwOYAyAFQbwGaiIGIARBCGopAgA3AgAgBUHEBmoiCiAEQRBqKAIANgIAIAUgBCkCADcCtAYgBSADNgKwBiAFQbAGaiINEL4KIAVBADoA4wUgBUEBOgDlBSAFIAUtAMQEOgDXBSAFIAUtAJgHOgDYBSAFIAEtALACOgDWBSAFIAEtAL4COgDkBSAFIAEtAMYCOgDsBSAFIAEoAaoCNgDQBSAFIAEvAa4COwDUBSAFIAEpALMCNwDZBSAFIAEvALsCOwDhBSAFIAEoAsACNgDmBSAFIAEvAcQCOwDqBSAFQckGaiABQaoCaiIDQRVqKQAANwAAIAogA0EQaikBADcCACAGIANBCGopAQA3AgAgBSADKQEANwK0BiAJIAVB0AVqEMgIIAUgATYCsAYgBUHAB2ogARCyASAFKALEByEDIAUoAsAHIgpBgICAgHhHBEAgBSAFKALIByIGNgKAByAFIAM2AvwGIAUgCjYC+AYgDRDvJAJAAkAgCRDIDSIKBEAgCigCAEEKRg0BCyAFQbgGaiAJEIAQIAVBqANqIAkQ6hMgBUHQ3d8ANgK0BiAFQTQ6ALAGIAUoAqgDIAUoAqwDIAVBsAZqEOsUIQQgCRDIDSIDRQ0BIAMoAgBBJEcNASABIAEpA+ACNwOYAyABKALIAiABQSU2AsgCQSRHDQogASABKALMAhD7CwwBCyABKALIAiEKIAFBJTYCyAIgASABKQPgAjcDmAMgBUG8BmogBEEIaikCADcCACAFQcQGaiAEQRBqKAIANgIAIAUgBCkCADcCtAYgBSAKNgKwBiAFQbAGahC+CkEAIQQCQCABLQCgAkECRw0AIAkQyA0iCkUNACAKKAIAQRNHDQAgBUGwA2ogAUGo2N8AEPEBIAUoArQDIQQgBSgCsAMNAQsgBSAENgKoByAFQbAGaiABIAUoApQIIhAtAAAgBSgCmAgiEi0AACADIAYQqBkQrAMgBSgCtAYhCiAFKAKwBiIPQYGAgIB4RwRAIAVByAdqIhMgBUHABmoiGSkCADcDACAFIAUpArgGNwPAByAPQYCAgIB4Rw0EIAEtAKACQQJHDQQgBkEGdCEGA0AgBkUNBSADKAIAQQRGBEAgAygCECENIAMoAgwhCSAFQakBOgCwBiABIAkgDSAFQbAGahCpGQsgA0FAayEDIAZBQGohBgwACwALIAVBqAdqEOAmIAohBAsgBUH4BmoQ4SYMAQsgBUGwBmoQ7yQgAyEECyALEL4oDAELIAVBxAZqIAVBkAhqKAIANgIAIAVBuAZqIgkgBUGAB2ooAgA2AgAgBSAFKQOICDcCvAYgBSAFKQL4BjcDsAYgASgCnAMhBiAFKAKcCCgCACENIBItAAAhEiAQLQAAIRBByABBBBCMICIDIAo2AhwgAyAPNgIYIAMgEDoARSADIBI6AEQgAyAENgJAIAMgCzYCPCADQQA2AjggAyANIAYgBiANSRs2AjQgAyANIAYgBiANSxs2AjAgA0EQaiAZKQMANwIAIANBCGogCSkDADcCACADIAUpA7AGNwIAIAMgBSkDwAc3AiAgA0EoaiATKQMANwIAQQEMAQsgBUGICGoQ1yYgBCEDQQALIQQgBUGoCGoQ7yQCQCAEBEAgBUHgB2oQ7yQgBSgC8ARBBUcNASAMIAEoApwDIgsgCyAMSxshBCAFKAKEBSEGIBFBA0cEQCAFQbUBOgCwBiABIAQgBiAEIAZJGyAEIAYgBCAGSxsgBUGwBmoQqRkLIAVBvAZqIAVB+ARqIgpBCGooAgA2AgAgB0EGNgIAIAdBADoAKSAHIA46ACggB0EAOgAnIAcgFDoAJiAHQQA6ACUgByAROgAkIAcgAzYCICAHIAwgCyALIAxJGzYCHCAHIAQ2AhggByAGNgIUIAUgCikCADcCtAYgByAFKQKwBjcCBCAHQQxqIAVBuAZqKQIANwIADAQLIAdBDTYCACAHIAM2AgQgBUHgB2oQ7yQgBUHwBGoQ8CAMAwsgASgCnAMhBCAFQcwGaiAFQYgFaikDADcCACAFQcQGaiAFQYAFaikDADcCACAFQbwGaiAFQfgEaikDADcCACAHQQU2AgAgBSAFKQPwBDcCtAYgB0EEaiAFQbAGakEkEPYGGiAHIBE6ADkgB0EAOwA3IAcgDjoANiAHQQA6ADUgByAUOgA0IAcgAzYCMCAHIAwgBCAEIAxJGzYCLCAHIAwgBCAEIAxLGzYCKAwCCyAFQQA2AvAEIAcgASAMIAVBzANqIBEgBUH4A2ogFCAFQfAEaiADQQAgGkEAQQAQkQEMAQsCQCAURQ0AAkAgARDVDkUEQCABQQAQ5QpFBEAgAS0AoAJBAkcNAyAJEMgNIgNFDQMgAygCAEEXRw0DCyAJEMgNIgMEQCADKAIAQQ1GDQMLQcy84ABBBhC5GiE4IAUgIDYCrAQgBSAfNgKoBCAFIDg3A6AEIAVBADYCmARBACEDIAEtAKACQQJHDQEgCRDIDSIERQ0BIAQoAgBBF0cNASABKALIAiEDIAFBJTYCyAIgASABKQPgAjcDmAMgBUH8BGogAUHUAmopAgA3AgAgBUGEBWogAUHcAmooAgA2AgAgBSABKQLMAjcC9AQgBSADNgLwBCAFQfAEahC+CkEBIQMMAQtBzLzgAEEGELkaITgCf0EAIAEtAKACQQJHDQAaQQAgCRDIDSIDRQ0AGkEAIAMoAgBBF0cNABogASgCyAIhAyABQSU2AsgCIAEgASkD4AI3A5gDIAVB/ARqIAFB1AJqKQIANwIAIAVBhAVqIAFB3AJqKAIANgIAIAUgASkCzAI3AvQEIAUgAzYC8AQgBUHwBGoQvgpBAQshDiAFQZwFaiAFQdQDaiIEKAIANgIAIAUgBSkCzAM3ApQFIAUgEToArAUgBSAMNgKQBSAFQQA6ALAFIAUgDjoArwUgBUEANgKgBSAFQQA7ALEFIAVBADsArQUgBSAgNgKEBSAFIB82AoAFIAUgODcD+AQgBUEANgLwBCAFQfkHaiABQb8CaiIGKQAANwAAIAVB9AdqIAFBugJqIgMpAQA3AgAgBUHsB2ogAUGyAmoiCikBACI4NwIAIAVBADoAwgYgBUEBOgDJBiAFIAEtAMYCOgDMBiAFIAEpAaoCIjk3ALAGIAUgODcAuAYgBSADLwEAOwDABiAFIAEoAL0CNgDDBiAFIAEvAMECOwDHBiAFIAEvAcQCOwDKBiAFIDk3AuQHIAkgBUGwBmoiDRDICCAFIAE2AuAHIAVBADsA1wQgBUEAOgCYByAFQQA6AMQEIAUgDDYC8AUgBSABLQCwAjoA1gQgBSABKAGqAjYA0AQgBSABLwGuAjsA1AQgBSABKQCzAjcA2QQgBSABKQC7AjcA4QQgBSABKADDAjYA6QQgBUHBCGogBikAADcAACAFQbwIaiADKQEANwIAIAVBtAhqIAopAQA3AgAgBSABKQGqAjcCrAggCSAFQdAEahDICCAFIAE2AqgIIAVBkAhqIAQoAgA2AgAgBSAFKQLMAzcDiAggBSAFQfAFajYCnAggBSAFQZgHajYCmAggBSAFQcQEajYClAgCfwJAIAEtAKACQQJGBEAgDSABELkVAkACQAJAAkAgBSgCsAYiA0EoaiIGEMgNIgRFDQAgBCgCAEEURw0AIAQtAARBBEYNAQsgBhDIDSIERQ0CIAQoAgBBIUcNAiADQTxqIgQQ+RcgBBD5FyAFQcgAaiADQQBBARCTASAFKAJMIQsgBSgCSA0BDAILIAVB0ABqIANBAEEBEJMBIAUoAlQhCyAFKAJQRQ0BCyAFQbAGahDvJCALIQQMAgsgBUGwBmoQ7yQLAkACQAJAIAkQyA0iAwRAIAMoAgBBCUYNAQsgBUG4BmogCRCAECAFQTBqIAkQ6hMgBUH43d8ANgK0BiAFQTQ6ALAGIAUoAjAgBSgCNCAFQbAGahDrFCEEIAkQyA0iA0UNASADKAIAQSRHDQEgASABKQPgAjcDmAMgASgCyAIgAUElNgLIAkEkRw0JIAEgASgCzAIQ+wsMAQsgASgCyAIhAyABQSU2AsgCIAEgASkD4AI3A5gDIAVBvAZqIgQgAUHUAmopAgA3AgAgBUHEBmoiBiABQdwCaigCADYCACAFIAEpAswCNwK0BiAFIAM2ArAGIAVBsAZqIgoQvgogBUEAOgDjBSAFQQE6AOUFIAUgBS0AxAQ6ANcFIAUgBS0AmAc6ANgFIAUgAS0AsAI6ANYFIAUgAS0AvgI6AOQFIAUgAS0AxgI6AOwFIAUgASgBqgI2ANAFIAUgAS8BrgI7ANQFIAUgASkAswI3ANkFIAUgAS8AuwI7AOEFIAUgASgCwAI2AOYFIAUgAS8BxAI7AOoFIAVByQZqIAFBqgJqIgNBFWopAAA3AAAgBiADQRBqKQEANwIAIAQgA0EIaikBADcCACAFIAMpAQA3ArQGIAkgBUHQBWoQyAggBSABNgKwBiAFQcAHaiABELIBIAUoAsQHIQMgBSgCwAciBEGAgICAeEcEQCAFIAUoAsgHIgY2AoAHIAUgAzYC/AYgBSAENgL4BiAKEO8kAkACQCAJEMgNIgQEQCAEKAIAQQpGDQELIAVBuAZqIAkQgBAgBUE4aiAJEOoTIAVB0N3fADYCtAYgBUE0OgCwBiAFKAI4IAUoAjwgBUGwBmoQ6xQhBCAJEMgNIgNFDQEgAygCAEEkRw0BIAEgASkD4AI3A5gDIAEoAsgCIAFBJTYCyAJBJEcNCiABIAEoAswCEPsLDAELIAEoAsgCIQogAUElNgLIAiABIAEpA+ACNwOYAyAFQbwGaiABQcwCaiIEQQhqKQIANwIAIAVBxAZqIARBEGooAgA2AgAgBSAEKQIANwK0BiAFIAo2ArAGIAVBsAZqEL4KQQAhBAJAIAEtAKACQQJHDQAgCRDIDSIKRQ0AIAooAgBBE0cNACAFQUBrIAFBqNjfABDxASAFKAJEIQQgBSgCQA0BCyAFIAQ2AqgHIAVBsAZqIAEgBSgClAgiEC0AACAFKAKYCCIULQAAIAMgBhCoGRCsAyAFKAK0BiEKIAUoArAGIg9BgYCAgHhHBEAgBUHIB2oiEiAFQcAGaiITKQIANwMAIAUgBSkCuAY3A8AHIA9BgICAgHhHDQQgAS0AoAJBAkcNBCAGQQZ0IQYDQCAGRQ0FIAMoAgBBBEYEQCADKAIQIQ0gAygCDCEZIAVBqQE6ALAGIAEgGSANIAVBsAZqEKkZCyADQUBrIQMgBkFAaiEGDAALAAsgBUGoB2oQ4CYgCiEECyAFQfgGahDhJgwBCyAFQbAGahDvJCADIQQLIAsQvigMAQsgBUHEBmogBUGQCGooAgA2AgAgBUG4BmoiGSAFQYAHaigCADYCACAFIAUpA4gINwK8BiAFIAUpAvgGNwOwBiABKAKcAyEGIAUoApwIKAIAIQ0gFC0AACEUIBAtAAAhEEHIAEEEEIwgIgMgCjYCHCADIA82AhggAyAQOgBFIAMgFDoARCADIAQ2AkAgAyALNgI8IANBADYCOCADIA0gBiAGIA1JGzYCNCADIA0gBiAGIA1LGzYCMCADQRBqIBMpAwA3AgAgA0EIaiAZKQMANwIAIAMgBSkDsAY3AgAgAyAFKQPABzcCICADQShqIBIpAwA3AgBBAQwBCyAFQYgIahDXJiAEIQNBAAshBCAFQagIahDvJAJAIAQEQCAFQeAHahDvJCAFKALwBEEFRw0BIAwgASgCnAMiCyALIAxLGyEEIAUoAoQFIQYgEUEDRwRAIAVBtQE6ALAGIAEgBCAGIAQgBkkbIAQgBiAEIAZLGyAFQbAGahCpGQsgBUG8BmogBUH4BGoiCkEIaigCADYCACAHQQY2AgAgB0EAOgApIAcgDjoAKCAHQQA6ACcgB0EAOwAlIAcgEToAJCAHIAM2AiAgByAMIAsgCyAMSRs2AhwgByAENgIYIAcgBjYCFCAFIAopAgA3ArQGIAcgBSkCsAY3AgQgB0EMaiAFQbgGaikCADcCAAwECyAHQQ02AgAgByADNgIEIAVB4AdqEO8kIAVB8ARqEPAgDAMLIAEoApwDIQQgBUHMBmogBUGIBWopAwA3AgAgBUHEBmogBUGABWopAwA3AgAgBUG8BmogBUH4BGopAwA3AgAgB0EFNgIAIAUgBSkD8AQ3ArQGIAdBBGogBUGwBmpBJBD2BhogByAROgA5IAdBADsANyAHIA46ADYgB0EAOwE0IAcgAzYCMCAHIAwgBCAEIAxJGzYCLCAHIAwgBCAEIAxLGzYCKAwCCyAFIB02AvgEIAUgHDYC9AQgBSAbNgLwBCAHIAEgDCAFQcwDaiARIAVBmARqQQAgBUHwBGogA0EAIBpBAEEAEJEBDAELIAVBwARqIAVB1ANqKAIANgIAIAUgBSkCzAM3A7gEQQAhAyAUIQ8CQAJAAkACQANAAkAgAyEEIAshBiAKIQ0gBUHwBGoiIyABQYjy3wBBBEEBELcCIAUoAvQEIRcCQAJAAkAgBSgC8ARFBEACQAJAAkACQCAXBEAgASgCnAMhEiABKAKYAyETIBcgBSgC+AQiHkHvruAAQQgQzR8NAyAXIB5BnLzgAEEIEM0fDQIgFyAeQdet4ABBCBDNHw0BIBcgHkHMvOAAQQYQzR8iBCAPciEPQQEhHiAEIA5xRQ0KQcy84ABBBhC5GiE4IAVBnLzgAEEIELkaNwOABSAFIDg3A/gEIAVB+QA6APAEIAEgEyASICMQqRlBASEOQQEhDwwKCwJAIBtFBEBBACEDAkAgAS0AoAJBAkcEQCABLQCoAkEBcUUNAQsgBEEBcQ0AIAkQpSAhCyAJEMgNIgpFDQAgCigCAEECRw0AIAotAAgNACAKLQAJQSNHDQAgASgCyAIhAyABQSU2AsgCIAEgASkD4AI3A5gDIAVB/ARqIAFB1AJqKQIANwIAIAVBhAVqIAFB3AJqKAIANgIAIAUgASkCzAI3AvQEIAUgAzYC8AQgBUHwBGoQvgogBSALIAEoApwDIgMgAyALSRs2AswEIAUgCyADIAMgC0sbNgLIBEEBIQMLIAUgAzYCxAQMAQsgBSAdNgLMBCAFIBw2AsgEIAUgGzYCxAQLIA9BAXENAwwIC0EBIR4gEiEKIBMhC0EBIQMgBEEBcUUNCEHXreAAQQgQuRohOCAFQfoAOgDwBCAFIDg3A/gEIAEgCyAKIAVB8ARqEKkZIA0hCiAGIQsgBCEDDAgLAkACQCAOQQFxRQRAIARBAXENASAaDQJBASEeQQEhDiABLQDAAkEBcQ0KIAVBswE6APAEIAEgEyASIAVB8ARqEKkZDAgLQZy84ABBCBC5GiE4IAVB+gA6APAEIAUgODcD+AQMBgtBnLzgAEEIELkaITggBUHXreAAQQgQuRo3A4AFIAUgODcD+AQgBUH5ADoA8AQMBQtBnLzgAEEIELkaITggBUGKreAAQQcQuRo3A4AFIAUgODcD+AQgBUGfAToA8AQMBAsgFg0CQQEhHiAOQQFxQQAhDkEBIRZFDQZB767gAEEIELkaITggBUGcvOAAQQgQuRo3A4AFIAUgODcD+AQgBUH5ADoA8AQgASATIBIgBUHwBGoQqRlBASEODAYLIAkQyA0iA0UNBCADKAIAQQ1HDQQgGgRAIAVBmgE6APAEIAEgIiAhIAVB8ARqEKkZCyARQQNGDQYgBUGYA2ogCRDqEyAFKAKcAyEDIAUoApgDIQQgBUGaAToA8AQgASAEIAMgBUHwBGoQqRkMBgsgB0ENNgIAIAcgFzYCBAwHC0HvruAAQQgQuRohOCAFQfoAOgDwBCAFIDg3A/gEIAEgEyASIAVB8ARqEKkZQQEhHkEBIRYMAwsgASATIBIgBUHwBGoQqRlBASEeC0EBIQ4MAQsLIAkQyA0iA0UNASADKAIAQQJHDQEgAy0ACA0BIAMtAAlBB0cNASAJEI8TIgNFDQEgAygCAEENRw0BIB4EQCAFQZoBOgDwBCABIBMgEiAFQfAEahCpGQsgFARAIAVBmgE6APAEIAEgHyAgIAVB8ARqEKkZCyABKALIAiEDIAFBJTYCyAIgASABKQPgAjcDmAMgBUH8BGogAUHUAmopAgA3AgAgBUGEBWogAUHcAmooAgA2AgAgBSABKQLMAjcC9AQgBSADNgLwBCAFQfAEahC+CgsjAEHgAGsiBiQAIAZBKGogAUGyAmoiAykBADcCACAGQTBqIAFBugJqKQEANwIAIAZBNWogAUG/AmopAAA3AAAgBkEBOgBMIAZBAToAVSAGQQE6AF8gBiADLQAAOgBLIAYgAS0AxQI6AF4gBiABKQGqAiI4NwBDIAYgASkCtAI3AE0gBiABKQC9AjcAViAGIDg3AiAgAUEoaiAGQcMAahDICCAGIAE2AhwgBkEEaiABQQAQkQYgBigCCCEEIAcCfyAGKAIEIgNBgICAgHhHBEAgByAGKQIMNwIMIAdBFGogBkEUaikCADcCACAGQRxqEO8kIAcgBDYCCCAHIAwgASgCnAMiBCAEIAxJGzYCICAHIAwgBCAEIAxLGzYCHEELDAELIAZBHGoQ7yQgBCEDQQ0LNgIAIAcgAzYCBCAGQeAAaiQADAELAkAgEUEDRw0AIAEtAKACQQJHIBZyIA5yQQFxDQAgBUHwBGogASAMIARBAXEgD0EBcRCoASAFKAL0BCEDIAcCfyAFKALwBCILQYGAgIB4RwRAIAVByAZqIgogBUGIBWooAgA2AgAgBUHABmoiFyAFQYAFaikCADcCACAFIAUpAvgENwK4BiAFIAM2ArQGIAUgCzYCsAYgC0GAgICAeEcEQCAHIAUpArAGNwIEIAdBHGogCigCADYCACAHQRRqIBcpAgA3AgAgB0EMaiAFQbgGaikCADcCAEEJDAILIAVBsAZqEO8gDAILIAcgAzYCBEENCzYCAAwBCwJAAkACQAJAAkACQAJAIAkQyA0iA0UNACADKAIAQRRHDQAgAy0ABEENRg0BCyAEQQFxRQ0BAkAgCRDIDSIDBEAgAygCAEEIRg0BCyAJEMgNIgNFDQIgAygCAEETRw0CC0HXreAAQQgQuRohOCAFIA02AuQEIAUgBjYC4AQgBSA4NwPYBCAFQQA2AtAEDAILIAEoAsgCIQMgAUElNgLIAiABIAEpA+ACNwOYAyAFQfwEaiABQdQCaikCADcCACAFQYQFaiABQdwCaigCADYCACAFIAEpAswCNwL0BCAFIAM2AvAEIAVB8ARqIgsQvgogCyABEOgHIAUoAvQEIQYgBSgC8AQiCkEGRg0CIAVBiAdqIAVBiAVqKQMAIjg3AwAgBUGAB2ogBUGABWopAwAiOTcDACAFQeAFaiA5NwMAIAVB6AVqIDg3AwAgBSAFKQP4BCI4NwP4BiAFIAY2AtQFIAUgCjYC0AUgBSA4NwPYBSAEQQFxBEAgASgCnAMhAyAFQeMAOgDwBCABIAwgAyADIAxLGyAMIAMgAyAMSRsgCxCpGQsgBUHQBWoQ4RVFDQYgASgCnAMhAyAFQeQAOgDwBCABIAwgAyADIAxLGyAMIAMgAyAMSRsgBUHwBGoQqRkMBgsgBUHwBGogARDoByAFKAL0BCEDIAUoAvAEIgZBBkYNAiAFQegEaiAFQYgFaikDADcDACAFQeAEaiAFQYAFaikDADcDACAFIAUpA/gENwPYBCAFIAM2AtQEIAUgBjYC0AQLQQAhFyABLQCgAkECRw0CIAkQyA0iA0UNAiADKAIAQRdHDQIgASgCyAIhAyABQSU2AsgCIAEgASkD4AI3A5gDIAVB/ARqIAFB1AJqKQIANwIAIAVBhAVqIAFB3AJqKAIANgIAIAUgASkCzAI3AvQEIAUgAzYC8AQgBUHwBGoQvgpBASEXDAILIAdBDTYCACAHIAY2AgQMAgsgB0ENNgIAIAcgAzYCBAwBCwJAAkACQAJAAkACQAJ/AkACQAJAAn8CQAJAAkACQAJAAkACQAJAAkACQCABENUORQRAQQAhCwJAIAkQ6yBFDQAgCRDIDSIDRQ0AIAMoAgBBFEcNACADLQAEQQ1GIQsLAkACQCAFKALQBA0AIAVB2ARqIgNB+q7gAEEDELEbRQRAIANB/a7gAEEDELEbRQ0BC0EAIQogAUEAEOUKIAtyQQFHDQELQQAhA0EBIQogAUEBEOUKDQQLIAUoAtAEDRAgBUHYBGpBoLHgAEEFELEbRQ0QIAkQ6yANEEEBIQMgBUHwBGoiCyABQaS84ABBAUEAELcCIAUoAvQEIQYgBSgC8AQNASAGBEAgASgCnAMhAyABKAKYAyEGQZy84ABBCBC5GiE4IAVBoLHgAEEFELkaNwOABSAFIDg3A/gEIAVB+QA6APAEIAEgBiADIAsQqRlBASEOC0EAIQMCQCAJEMgNIgZFDQAgBigCAEEURw0AIAYtAARBDUcNACABKALIAiEDIAFBJTYCyAIgASABKQPgAjcDmAMgBUH8BGogAUHUAmopAgA3AgAgBUGEBWogAUHcAmooAgA2AgAgBSABKQLMAjcC9AQgBSADNgLwBCAFQfAEahC+CkEBIQMLIAVB8ARqIgsgARDoByAFKAL0BCEGAkAgBSgC8AQiCkEGRwRAIAVB6AVqIAVBiAVqKQMANwMAIAVB4AVqIAVBgAVqKQMANwMAIAUgBSkD+AQ3A9gFIAUgBjYC1AUgBSAKNgLQBQJAAkACQAJAAkACQCAFQdAFahDhFUUEQEEBIQogBEEBcQ0BAkAgFw0AQQAhCiABLQCgAkECRw0AIAkQyA0iBEUNACAEKAIAQRdHDQAgASgCyAIhBCABQSU2AsgCIAEgASkD4AI3A5gDIAVB/ARqIAFB1AJqKQIANwIAIAVBhAVqIAFB3AJqKAIANgIAIAUgASkCzAI3AvQEIAUgBDYC8AQgCxC+CkEBIQoLIAVBiAVqIAVB6AVqKQMANwMAIAVBgAVqIAVB4AVqKQMANwMAIAVB+ARqIAVB2AVqKQMANwMAIAVBnAVqIAVBwARqIgYoAgA2AgAgBSAFKQPQBTcD8AQgBSAFKQO4BDcClAUgBSAROgCsBSAFIAw2ApAFIAUgCjoArwUgBSAgNgKoBSAFIB82AqQFIAUgFDYCoAUgBSAWOgCuBSAFIA5BAXEiDzoAsAUgBSADOgCyBSAFQQE6ALEFQQAhCyAFQQA6AK0FIAVB+QdqIAFBvwJqIg0pAAA3AAAgBUH0B2ogAUG6AmoiBCkBADcCACAFQewHaiABQbICaiIOKQEAIjg3AgAgBUEAOgDCBiAFQQE6AMkGIAUgAS0AxgI6AMwGIAUgASkBqgIiOTcAsAYgBSA4NwC4BiAFIAQvAQA7AMAGIAUgASgAvQI2AMMGIAUgAS8AwQI7AMcGIAUgAS8BxAI7AMoGIAUgOTcC5AcgCSAFQbAGaiIQEMgIIAUgATYC4AcgBUEBOgDHByAFIAM6AMgHIAUgAzoApAcgBUEBOgDwBiAFIAw2AsgFIAUgAS0AsAI6AMYHIAUgASgBqgI2AMAHIAUgAS8BrgI7AMQHIAUgASkAswI3AMkHIAUgASkAuwI3ANEHIAUgASgAwwI2ANkHIAVBwQhqIA0pAAA3AAAgBUG8CGogBCkBADcCACAFQbQIaiAOKQEANwIAIAUgASkBqgI3AqwIIAkgBUHAB2oQyAggBSABNgKoCCAFQYAHaiAGKAIANgIAIAUgBSkDuAQ3A/gGIAUgBUHIBWo2AowHIAUgBUGkB2o2AogHIAUgBUHwBmo2AoQHIAEtAKACQQJHDRYgECABELkVAkAgBSgCsAYiA0EoaiIGEMgNIgRFDQAgBCgCAEEURw0AIAQtAARBBEYNBQsgBhDIDSIERQ0VIAQoAgBBIUcNFSADQTxqIgQQ+RcgBBD5FyAFQeACaiADQQBBARCTASAFKALkAiELIAUoAuACDQUMFQsgBUHAAmogBUHQBWoQkRMgBSgCxAIhAyAFKALAAiAFQd4AOgDwBCADIAVB8ARqEOsUIQMgCRDIDSIERQ0CIAQoAgBBJEcNAiABIAEpA+ACNwOYAyABKALIAiABQSU2AsgCQSRGDQFBuePgAEEoQbjy3wAQ2hcACyABKAKcAyEDIAVB4wA6APAEIAwgAyADIAxLGyAMIAMgAyAMSRsgBUHwBGoQ6xQhAyAJEMgNIgRFDQEgBCgCAEEkRw0BIAEgASkD4AI3A5gDIAEoAsgCIAFBJTYCyAJBJEcNBAsgASABKALMAhD7CwsgB0ENNgIAIAcgAzYCBCAFQdAFahDwIAwECyAFQegCaiADQQBBARCTASAFKALsAiELIAUoAugCRQ0QCyAFQbAGahDvJCALIQQMEQtBuePgAEEoQajy3wAQ2hcACyAHQQ02AgAgByAGNgIEC0EBIQsMFAsgGgRAIAVB+wA6APAEIAEgIiAhIAVB8ARqEKkZCyAEQQFxDQEgBUHQBGoQ4RVFBEAgBUGcBWogBUHABGoiBCgCADYCACAFQfgEaiAFQdgEaikDADcDACAFQYAFaiAFQeAEaikDADcDACAFQYgFaiAFQegEaikDADcDACAFIAUpA7gENwKUBSAFIAUpA9AENwPwBCAFIBE6AKwFIAUgDDYCkAUgBSAXOgCvBSAFICA2AqgFIAUgHzYCpAUgBSAUNgKgBSAFIBY6AK4FIAUgDkEBcSIOOgCwBUEAIQogBUEAOwCxBSAFQQA6AK0FIAVB+QdqIAFBvwJqIgYpAAA3AAAgBUH0B2ogAUG6AmoiAykBADcCACAFQewHaiABQbICaiILKQEAIjg3AgAgBUEAOgDCBiAFQQE6AMkGIAUgAS0AxgI6AMwGIAUgASkBqgIiOTcAsAYgBSA4NwC4BiAFIAMvAQA7AMAGIAUgASgAvQI2AMMGIAUgAS8AwQI7AMcGIAUgAS8BxAI7AMoGIAUgOTcC5AcgCSAFQbAGaiINEMgIIAUgATYC4AcgBUEAOwCPCCAFQQA6AMgFIAVBADoApAcgBSAMNgKYByAFIAEtALACOgCOCCAFIAEoAaoCNgCICCAFIAEvAa4COwCMCCAFIAEpALMCNwCRCCAFIAEpALsCNwCZCCAFIAEoAMMCNgChCCAFQcEIaiAGKQAANwAAIAVBvAhqIAMpAQA3AgAgBUG0CGogCykBADcCACAFIAEpAaoCNwKsCCAJIAVBiAhqEMgIIAUgATYCqAggBUHIB2ogBCgCADYCACAFIAUpA7gENwPAByAFIAVBmAdqNgLUByAFIAVByAVqNgLQByAFIAVBpAdqNgLMByABLQCgAkECRw0JIA0gARC5FQJAAkACQCAFKAKwBiIDQShqIgYQyA0iBEUNACAEKAIAQRRHDQAgBC0ABEEERg0BCyAGEMgNIgRFDQogBCgCAEEhRw0KIANBPGoiBBD5FyAEEPkXIAVBsAFqIANBAEEBEJMBIAUoArQBIQogBSgCsAENAQwKCyAFQbgBaiADQQBBARCTASAFKAK8ASEKIAUoArgBRQ0JCyAFQbAGahDvJCAKIQsMCgsgAS0AoAIiA0ECRiAOcQ0DDAYLIAdBDTYCACAHIAY2AgQMEAsgASgCnAMhAyAFQeMAOgDwBCAMIAMgAyAMSxsgDCADIAMgDEkbIAVB8ARqEOsUIQMgCRDIDSIERQ0DIAQoAgBBJEcNAyABIAEpA+ACNwOYAyABKALIAiABQSU2AsgCQSRHDQIgASABKALMAhD7CwwDCyAFQYgFaiAFQegEaikDADcDACAFQYAFaiAFQeAEaikDADcDACAFQfgEaiAFQdgEaikDADcDACAFIAUpA9AENwPwBCAHIAEgDCAFQbgEaiARIAVB8ARqIA9BAXEgBUHEBGogFyAEQQFxIBogFiAOQQFxEJEBDBQLIAEoApwDIQNBnLzgAEEIELkaITggBUGCAToA8AQgBSA4NwP4BCABIAwgAyADIAxLGyAMIAMgAyAMSRsgBUHwBGoQqRkgAS0AoAIhAwwCC0G54+AAQShBzPTfABDaFwALIAdBDTYCACAHIAM2AgQMCgsCQCADQf8BcUECRw0AIAkQyA0iA0UNACADKAIAQRRHDQAgAy0ABEEERw0AIAkQpSAhAwJAAkACQAJAAkACQAJAAkAgCRCPEyIERQ0AIAQoAgBBFEcNACAELQAEQQZGDQELQQEhAyAFQZABaiABQQBBARDGDiAFKAKUASEEIAUoApABDQEgBEUNByAEKAIIIQYgBCgCBCEDIAUgBCgCADYCsAggBSADNgKoCCAFIAMgBkEwbCIKaiIGNgK0CCADQTBqIQsgBUGbBWoiDUEEaiEOA0ACQCAFIAoEfyADLQAqIg9BAkcNASALBSAGCzYCrAggBUGoCGoQvxcgBBD3KgwJCyAFQfAEaiIbIANBKhD2BhogDSADKAArNgAAIA4gA0Evai0AADoAACAFIA86AJoFIAUoAvAEIQ8gBSgC9AQhGiAFQYMBOgCwBiABIA8gGiAFQbAGahCpGSALQTBqIQsgCkEwayEKIBsQwiEgA0EwaiEDDAALAAsgCRDIDSIERQ0FIAQoAgBBJEYEQCABIAEpA+ACNwOYAyABKALIAiABQSU2AsgCQSRHDQIgASgCzAIhAyAHQQ02AgAgByADNgIEDBELIAEoAsgCIQQgAUElNgLIAiABIAEpA+ACNwOYAyAFQfwEaiABQdQCaikCADcCACAFQYQFaiABQdwCaigCADYCACAFIAEpAswCNwL0BCAFIAQ2AvAEIAVB8ARqEL4KIAkQpSAhBCAJEMgNIgZFDQQgBigCAEEkRw0CIAEgASkD4AI3A5gDIAEoAsgCIAFBJTYCyAJBJEcNAyABKALMAiEDIAdBDTYCACAHIAM2AgQMEAsgB0ENNgIAIAcgBDYCBAwQC0G54+AAQShBnPPfABDaFwALIAEoAsgCIQsgAUElNgLIAiABIAEpA+ACNwOYAyAFQfwEaiABQcwCaiIGQQhqKQIANwIAIAVBhAVqIAZBEGooAgA2AgAgBSAGKQIANwL0BCAFIAs2AvAEIAVB8ARqIgsQvgogASgCnAMhBiAFQYUBOgDwBCABIAMgBiADIAZJGyADIAYgAyAGSxsgCxCpGSABKAKcAyEDIAVBgwE6APAEIAEgBCADIAMgBEsbIAQgAyADIARJGyALEKkZDAMLQbnj4ABBKEGs898AENoXAAsgASgCgAIhAyAFQQA6APAEIAMgAyAFQfAEahDrFCEDIAdBDTYCACAHIAM2AgQMCwsgASgCgAIhAyAFQQA6APAEIAMgAyAFQfAEahDrFCEDIAdBDTYCACAHIAM2AgQMCgsCQAJAAkAgCRDIDSIDRQ0AIAMoAgBBCUcNACABKALIAiEDIAFBJTYCyAIgASABKQPgAjcDmAMgBUH8BGogAUHUAmopAgA3AgAgBUGEBWogAUHcAmooAgA2AgAgBSABKQLMAjcC9AQgBSADNgLwBCAFQfAEahC+CiAFQQA2AsgHIAVCgICAgIABNwLAByABQcwCaiEaIAVBsAZqQQRyIRwgBUGgBWohLiAFQY0FaiEvIAVBzQZqIR0gBUHgBmohMCAFQZAGaiEjIAVBuAZqISdBACENA0ACQAJAAkACQAJAAkACQAJAAkACQAJAIAkQyA0iAwRAIAVBADYCqAggBSADNgKsCCAFQagIahCmIyAJEMgNIgMEQCADKAIAQQpGDQILIA0gKnJFIA1B/v97S3JFBEAgBUH3ADoAsAYgASANICogBUGwBmoQqRkLIAkQpSAhAyAFQbAGaiABQQAQuwEgBSgCtAYhBiAFKAKwBiIEQYCAgIB4Rg0OIAUgBSgCuAY2ApAIIAUgBjYCjAggBSAENgKICCAJEKUgIQQCQAJAIAkQyA0iBgRAIAYoAgBBB0YNAQsgBUHoB2ogBUGQCGoiISgCADYCACAFIAUpAogINwPgBwJAAn4CQAJAAkAgAS0AoAJBAkcNACAFQbAGaiIEIAEQgQogBS0AsAYNBiAFLQCxBiEKIAQgAUGkvOAAQQFBABC3AiAFKAK0BiEEIAUoArAGBEAgBCEGDBELIAVBsAZqIAFBwN/fAEEBQQAQtwIgBSgCtAYhCyAFKAKwBgRAIAshBgwRCyAKQf8BcUEDRyAEciALckUNACAFQbAGaiABEOABIAUoArQGIQYgBSgCsAYiD0EHRg0QIAUgHSkAADcD+AYgBSAdQQdqKAAANgD/BiAFLQDMBiEbIAUoAsgGISsgBSgCxAYhECAFKQK8BiE4IAUoArgGIQ4gDw4FAQQEBAIECyAFQbAGaiABEOABIAUoArQGIRkgBSgCsAYiIkEHRwRAIAVB2AVqICEoAgA2AgAgBSAdKQAANwPwBSAFIB1BB2ooAAA2APcFIAUgBSkCiAg3A9AFIAUtAMwGIRsgBSgCyAYhKyAFKQPABiE4IAUoArwGIQ8gBSgCuAYhDiADIAEoApwDIgQgAyAESRshISADIAQgAyAESxshAyAQIQoMEQsgGSEGDA8LIAUgBSgA/wY2AK8HIAUgBSkD+AY3A6gHIDinIQ8gEK1CIIYgOEIgiIQMAQtBAiEbIA4hDyAGIQ4gOAshOCAFQdgFaiAhKAIANgIAIAUgBSkCiAg3A9AFIAUgBSkDqAc3A/AFIAUgBSgArwc2APcFIAMgASgCnAMiBiADIAZJGyEhIAMgBiADIAZLGyEDIAtBAEchLCAEQQBHIS1BByEiIAohEAwNCyAdIAUpA/gGNwAAIB1BB2ogBSgA/wY2AAAgBSAbOgDMBiAFICs2AsgGIAUgEDYCxAYgBSA4NwK8BiAFIA42ArgGIAUgBjYCtAYgBSAPNgKwBiAFQfgAaiAFQbAGahCMDCAFKAJ8IQMgBSgCeCAFQdwAOgCoCCADIAVBqAhqEOsUIQYgCRDIDSIDRQ0KIAMoAgBBJEcNCiABIAEpA+ACNwOYAyABKALIAiABQSU2AsgCQSRHDQQgASABKALMAhD7CwwKCyAcIBopAgA3AgAgASgCyAIhBiABQSU2AsgCIAEgASkD4AI3A5gDIBxBCGogGkEIaikCADcCACAcQRBqIBpBEGooAgA2AgAgBSAGNgKwBiAFQbAGaiIGEL4KIAEoApwDIQsgBiABQQAQTyAFKAK0BiEGAkAgBSgCsAYiCkEHRwRAICMgJykDADcDACAjQRhqICdBGGopAwA3AwAgI0EQaiAnQRBqKQMANwMAICNBCGogJ0EIaikDADcDACAFIAY2AowGIAUgCjYCiAZBACEbQQAhBiABLQCgAkECRw0BIAkQyA0iCkUNASAKKAIAQRNHDQEgBUGIAWogAUEBIAkQpSAQ+gYgBSgCjAEhBiAFKAKIAUUNASAFQYgGahCCEgsgBUGICGoQ1yYMEAsgASgCnAMhCkEoQQgQjCAgBUGIBmpBKBD2BiEOIDAgBSkCiAg3AgAgMEEIaiAFQZAIaigCADYCACAFIAY2AsgGIAUgBCALIAQgC0sbNgLEBiAFIAQgCyAEIAtJGzYCwAYgBSAEIAogBCAKSxsiKjYCvAYgBSAEIAogBCAKSRsiDTYCuAYgBSAONgK0BiAFQQI2ArAGIAUgAyABKAKcAyIEIAMgBEsbNgLcBiAFIAMgBCADIARJGzYC2AYgBUHAB2ogBUGwBmoQ5BkMDAsgBSgCtAYhBgwJCyABKAKAAiEDIAVBADoAsAYgBSADIAMgBUGwBmoQ6xQ2AqwIIAVBATYCqAggBUGoCGoQpiMLIAUoAsQHIQYgBSgCwAciA0GAgICAeEYNDSAFIAUoAsgHIgQ2ArAIIAUgBjYCrAggBSADNgKoCAJAAkAgCRDIDSIDRQ0AIAMoAgBBCkcNACABKALIAiEDIAFBJTYCyAIgASABKQPgAjcDmAMgBUH8BGogGkEIaikCADcCACAFQYQFaiAaQRBqKAIANgIAIAUgGikCADcC9AQgBSADNgLwBCAFQfAEahC+CiABLQCgAkECRw0FIAkQyA0iAw0BDAULIAVB+ARqIAkQgBAgBUHgAGogCRDqEyAFQdDd3wA2AvQEIAVBNDoA8AQgBSgCYCAFKAJkIAVB8ARqEOsUIQMgCRDIDSIERQ0DIAQoAgBBJEcNAyABIAEpA+ACNwOYAyABKALIAiABQSU2AsgCQSRHDQIgASABKALMAhD7CwwDCyADKAIAQRNHDQMgBUHwAGogAUEBIAkQpSAQ+gYgBSgCdCEDIAUoAnBFBEAgBSADNgKwBiAFQegAaiADKAIAEK4FIAUoAmwhAyAFKAJoIQsgBUGcAToA8AQgASALIAMgBUHwBGoQqRkgBUGwBmoQ8CQMBAsgB0ENNgIAIAcgAzYCBAwEC0G54+AAQShB7PzfABDaFwALQbnj4ABBKEHM898AENoXAAsgB0ENNgIAIAcgAzYCBAwBCyAFQfAEaiABQQBBACAGIAQQ/RcQrAMgBSgC9AQhDQJAIAUoAvAEIg5BgYCAgHhHBEAgBUG4BmogBUGABWopAgA3AwAgBSAFKQL4BDcDsAYgDkGAgICAeEcNAyAEQQZ0IQogBiEDA0AgCkUNAiADKAIAQQdGBEAgAygCKCELIAMoAiwhDyAFQagBOgDwBCABIAsgDyAFQfAEahCpGQsgA0FAayEDIApBQGohCgwACwALIAdBDTYCACAHIA02AgQMAQsgAS0AoAJBAkcNASAEQQZ0IQMDQCADRQ0CQRAhCkEMIQsCQAJAAkAgBigCAEEEaw4EAQICAAILIAYtABxBAkcNAUEUIQpBECELCyAGIApqKAIAIQQgBiALaigCACELIAVBqQE6APAEIAEgCyAEIAVB8ARqEKkZCyAGQUBrIQYgA0FAaiEDDAALAAsgBUGoCGoQ8SYMEgsgFARAQcy84ABBBhC5GiE4IAVBggE6APAEIAUgODcD+AQgASAfICAgBUHwBGoQqRkLIBYgHnEEQCAFQZ4BOgDwBCABIBMgEiAFQfAEahCpGQsgBSgC0ARBBUcEQCAHIAUpA9AENwMAIAcgBSkCqAg3AkAgB0EIaiAFQdgEaikDADcDACAHQRBqIAVB4ARqKQMANwMAIAdBGGogBUHoBGopAwA3AwAgB0HIAGogBUGwCGooAgA2AgAgASgCnAMhBBDBGCE4IAcgEToAUSAHIBc6AFBBACEDIAdBADYCTCAHIAwgBCAEIAxJGzYCPCAHIAwgBCAEIAxLGzYCOCAHIA02AiQgByAONgIgIAcgBSkDsAY3AiggB0EwaiAFQbgGaikDADcCACAFQgA3A4AFIAUgODcD+AQgBUIANwOoBSAFQQA2AvAEIAVCADcDuAUgBUKAgICAgAE3A7AFIAVBgICAgHg2ApAFIAVBgAY7AcAFIAVB8ARqEIYWIAVBsAVqEPEmIAVBkAVqEOQkDBMLIAVBATYC9AQgBUG09N8ANgLwBCAFQgA3AvwEIAUgBUHgB2o2AvgEIAVB8ARqQbz03wAQoR0ACyAFQbAGahCCEgsgBUHgB2oQ1yYMBAsgLyAFKQPwBTcAACAvQQdqIAUoAPcFNgAAIC4gBSkD0AU3AwAgLkEIaiAFQdgFaigCADYCACAFIBs6AIwFIAUgKzYCiAUgBSA4NwOABSAFIA82AvwEIAUgDjYC+AQgBSADNgKcBSAFICE2ApgFIAUgCjoArgUgBSAsOgCtBSAFIC06AKwFIAUgGTYC9AQgBSAiNgLwBCAFQcAHaiAFQfAEahDkGUEBIRsLIAkQyA0iAwRAIAMoAgBBCkYNAQsCQAJAIAkQyA0iAwRAIAMoAgBBEEYNAQsgBUG4BmogCRCAECAFQYABaiAJEOoTIAVB2LzgADYCtAYgBUE0OgCwBiAFKAKAASAFKAKEASAFQbAGahDrFCEGIAkQyA0iA0UNBCADKAIAQSRHDQQgASABKQPgAjcDmAMgASgCyAIgAUElNgLIAkEkRw0BIAEgASgCzAIQ+wsMBAsgHCAaKQIANwIAIAEoAsgCIQMgAUElNgLIAiABIAEpA+ACNwOYAyAcQQhqIBpBCGopAgA3AgAgHEEQaiAaQRBqKAIANgIAIAUgAzYCsAYgBUGwBmoiAxC+CiAJEMgNIgRFDQEgGyAEKAIAQQpHcg0BIAEoApwDIQQgASgCmAMhBiAFQTo6ALAGIAEgBiAEIAMQqRkMAQsLQbnj4ABBKEH8/N8AENoXAAsgBUH4BGogCRCAECAFQdgAaiAJEOoTIAVB+N3fADYC9AQgBUE0OgDwBCAFKAJYIAUoAlwgBUHwBGoQ6xQhAwJAIAkQyA0iBEUNACAEKAIAQSRHDQAgASABKQPgAjcDmAMgASgCyAIgAUElNgLIAkEkRgRAIAEgASgCzAIQ+wsMAQtBuePgAEEoQbzz3wAQ2hcACyAHQQ02AgAgByADNgIEDAsLIAVBwAdqEPEmCyAHQQ02AgAgByAGNgIEDAkLIAVBsAZqEO8kCwJAAkACQCAJEMgNIgMEQCADKAIAQQlGDQELIAVBuAZqIAkQgBAgBUGYAWogCRDqEyAFQfjd3wA2ArQGIAVBNDoAsAYgBSgCmAEgBSgCnAEgBUGwBmoQ6xQhCyAJEMgNIgNFDQEgAygCAEEkRw0BIAEgASkD4AI3A5gDIAEoAsgCIAFBJTYCyAJBJEcNEyABIAEoAswCEPsLDAELIAEoAsgCIQMgAUElNgLIAiABIAEpA+ACNwOYAyAFQbwGaiIEIAFB1AJqKQIANwIAIAVBxAZqIgYgAUHcAmooAgA2AgAgBSABKQLMAjcCtAYgBSADNgKwBiAFQbAGaiILEL4KIAVBADoA4wUgBUEBOgDlBSAFIAUtAKQHOgDXBSAFIAUtAMgFOgDYBSAFIAEtALACOgDWBSAFIAEtAL4COgDkBSAFIAEtAMYCOgDsBSAFIAEoAaoCNgDQBSAFIAEvAa4COwDUBSAFIAEpALMCNwDZBSAFIAEvALsCOwDhBSAFIAEoAsACNgDmBSAFIAEvAcQCOwDqBSAFQckGaiABQaoCaiIDQRVqKQAANwAAIAYgA0EQaikBADcCACAEIANBCGopAQA3AgAgBSADKQEANwK0BiAJIAVB0AVqEMgIIAUgATYCsAYgBUH4BmogARCyASAFKAL8BiEDIAUoAvgGIgRBgICAgHhHBEAgBSAFKAKAByIGNgKwByAFIAM2AqwHIAUgBDYCqAcgCxDvJAJAAkAgCRDIDSIEBEAgBCgCAEEKRg0BCyAFQbgGaiAJEIAQIAVBoAFqIAkQ6hMgBUHQ3d8ANgK0BiAFQTQ6ALAGIAUoAqABIAUoAqQBIAVBsAZqEOsUIQsgCRDIDSIDRQ0BIAMoAgBBJEcNASABIAEpA+ACNwOYAyABKALIAiABQSU2AsgCQSRHDRQgASABKALMAhD7CwwBCyABKALIAiELIAFBJTYCyAIgASABKQPgAjcDmAMgBUG8BmogAUHMAmoiBEEIaikCADcCACAFQcQGaiAEQRBqKAIANgIAIAUgBCkCADcCtAYgBSALNgKwBiAFQbAGahC+CkEAIQsCQCABLQCgAkECRw0AIAkQyA0iBEUNACAEKAIAQRNHDQAgBUGoAWogAUGo2N8AEPEBIAUoAqwBIQsgBSgCqAENAQsgBSALNgLwBSAFQbAGaiABIAUoAswHIhAtAAAgBSgC0AciEi0AACADIAYQqBkQrAMgBSgCtAYhBCAFKAKwBiIPQYGAgIB4RwRAIAVBgAdqIhMgBUHABmoiGSkCADcDACAFIAUpArgGNwP4BiAPQYCAgIB4Rw0EIAEtAKACQQJHDQQgBkEGdCEGA0AgBkUNBSADKAIAQQRGBEAgAygCECENIAMoAgwhCSAFQakBOgCwBiABIAkgDSAFQbAGahCpGQsgA0FAayEDIAZBQGohBgwACwALIAVB8AVqEOAmIAQhCwsgBUGoB2oQ4SYMAQsgBUGwBmoQ7yQgAyELCyAKEL4oDAELIAVBxAZqIAVByAdqKAIANgIAIAVBuAZqIgkgBUGwB2ooAgA2AgAgBSAFKQPABzcCvAYgBSAFKQKoBzcDsAYgASgCnAMhBiAFKALUBygCACENIBItAAAhEiAQLQAAIRBByABBBBCMICIDIAQ2AhwgAyAPNgIYIAMgEDoARSADIBI6AEQgAyALNgJAIAMgCjYCPCADQQA2AjggAyANIAYgBiANSRs2AjQgAyANIAYgBiANSxs2AjAgA0EQaiAZKQMANwIAIANBCGogCSkDADcCACADIAUpA7AGNwIAIAMgBSkD+AY3AiAgA0EoaiATKQMANwIAQQEMAQsgBUHAB2oQ1yYgCyEDQQALIQQgBUGoCGoQ7yQCQCAEBEAgBUHgB2oQ7yQgBSgC8ARBBUYEQCAMIAEoApwDIgsgCyAMSxshBCAFKAKEBSEGIBFBA0cEQCAFQbUBOgCwBiABIAQgBiAEIAZJGyAEIAYgBCAGSxsgBUGwBmoQqRkLIAVBvAZqIAVB+ARqIgpBCGooAgA2AgAgB0EGNgIAIAcgDjoAKSAHIBc6ACggByAWOgAnIAcgFDoAJiAHQQA6ACUgByAROgAkIAcgAzYCICAHIAwgCyALIAxJGzYCHCAHIAQ2AhggByAGNgIUIAUgCikCADcCtAYgByAFKQKwBjcCBCAHQQxqIAVBuAZqKQIANwIADA8LIAwgASgCnAMiBCAEIAxLGyEGIAwgBCAEIAxJGyEEIBZFDQEgAygCGEGAgICAeEYNASAFQaEBOgCwBiABIAYgBCAFQbAGahCpGQwBCyAHQQ02AgAgByADNgIEIAVB4AdqEO8kIAVB8ARqEPAgDA0LIAdBBTYCACAFQcwGaiAFQYgFaikDADcCACAFQcQGaiAFQYAFaikDADcCACAFQbwGaiAFQfgEaikDADcCACAFIAUpA/AENwK0BiAHQQRqIAVBsAZqQSQQ9gYaIAcgEToAOSAHQQA6ADggByAOOgA3IAcgFzoANiAHIBY6ADUgByAUOgA0IAcgAzYCMCAHIAQ2AiwgByAGNgIoDAwLIAVBsAZqEO8kCwJAAkACQCAJEMgNIgMEQCADKAIAQQlGDQELIAVBuAZqIAkQgBAgBUHIAmogCRDqEyAFQfjd3wA2ArQGIAVBNDoAsAYgBSgCyAIgBSgCzAIgBUGwBmoQ6xQhBCAJEMgNIgNFDQEgAygCAEEkRw0BIAEgASkD4AI3A5gDIAEoAsgCIAFBJTYCyAJBJEcNDyABIAEoAswCEPsLDAELIAEoAsgCIQMgAUElNgLIAiABIAEpA+ACNwOYAyAFQbwGaiIEIAFB1AJqKQIANwIAIAVBxAZqIgYgAUHcAmooAgA2AgAgBSABKQLMAjcCtAYgBSADNgKwBiAFQbAGaiINEL4KIAVBADoAmwggBUEBOgCdCCAFIAUtAPAGOgCPCCAFIAUtAKQHOgCQCCAFIAEtALACOgCOCCAFIAEtAL4COgCcCCAFIAEtAMYCOgCkCCAFIAEoAaoCNgCICCAFIAEvAa4COwCMCCAFIAEpALMCNwCRCCAFIAEvALsCOwCZCCAFIAEoAsACNgCeCCAFIAEvAcQCOwCiCCAFQckGaiABQaoCaiIDQRVqKQAANwAAIAYgA0EQaikBADcCACAEIANBCGopAQA3AgAgBSADKQEANwK0BiAJIAVBiAhqEMgIIAUgATYCsAYgBUGoB2ogARCyASAFKAKsByEDIAUoAqgHIgRBgICAgHhHBEAgBSAFKAKwByIGNgL4BSAFIAM2AvQFIAUgBDYC8AUgDRDvJAJAAkAgCRDIDSIEBEAgBCgCAEEKRg0BCyAFQbgGaiAJEIAQIAVB0AJqIAkQ6hMgBUHQ3d8ANgK0BiAFQTQ6ALAGIAUoAtACIAUoAtQCIAVBsAZqEOsUIQQgCRDIDSIDRQ0BIAMoAgBBJEcNASABIAEpA+ACNwOYAyABKALIAiABQSU2AsgCQSRHDRAgASABKALMAhD7CwwBCyABKALIAiENIAFBJTYCyAIgASABKQPgAjcDmAMgBUG8BmogAUHMAmoiBEEIaikCADcCACAFQcQGaiAEQRBqKAIANgIAIAUgBCkCADcCtAYgBSANNgKwBiAFQbAGahC+CkEAIQQCQCABLQCgAkECRw0AIAkQyA0iDUUNACANKAIAQRNHDQAgBUHYAmogAUGo2N8AEPEBIAUoAtwCIQQgBSgC2AINAQsgBSAENgKYByAFQbAGaiABIAUoAoQHIhItAAAgBSgCiAciEy0AACADIAYQqBkQrAMgBSgCtAYhDSAFKAKwBiIQQYGAgIB4RwRAIAVBsAdqIhkgBUHABmoiCSkCADcDACAFIAUpArgGNwOoByAQQYCAgIB4Rw0EIAEtAKACQQJHDQQgBkEGdCEGA0AgBkUNBSADKAIAQQRGBEAgAygCECEOIAMoAgwhFyAFQakBOgCwBiABIBcgDiAFQbAGahCpGQsgA0FAayEDIAZBQGohBgwACwALIAVBmAdqEOAmIA0hBAsgBUHwBWoQ4SYMAQsgBUGwBmoQ7yQgAyEECyALEL4oDAELIAVBxAZqIAVBgAdqKAIANgIAIAVBuAZqIhcgBUH4BWooAgA2AgAgBSAFKQP4BjcCvAYgBSAFKQLwBTcDsAYgASgCnAMhBiAFKAKMBygCACEOIBMtAAAhEyASLQAAIRJByABBBBCMICIDIA02AhwgAyAQNgIYIAMgEjoARSADIBM6AEQgAyAENgJAIAMgCzYCPCADQQA2AjggAyAOIAYgBiAOSRs2AjQgAyAOIAYgBiAOSxs2AjAgA0EQaiAJKQMANwIAIANBCGogFykDADcCACADIAUpA7AGNwIAIAMgBSkDqAc3AiAgA0EoaiAZKQMANwIAQQEMAQsgBUH4BmoQ1yYgBCEDQQALIQQgBUGoCGoQ7yQCQAJAIAQEQCAFQeAHahDvJCAFKALwBEEFRgRAIAwgASgCnAMiCyALIAxLGyEEIAUoAoQFIQYgEUEDRwRAIAVBtQE6ALAGIAEgBCAGIAQgBkkbIAQgBiAEIAZLGyAFQbAGahCpGQsgBUG8BmogBUH4BGoiDUEIaigCADYCACAHQQY2AgAgByAPOgApIAcgCjoAKCAHIBY6ACcgByAUOgAmIAdBADoAJSAHIBE6ACQgByADNgIgIAcgDCALIAsgDEkbNgIcIAcgBDYCGCAHIAY2AhQgBSANKQIANwK0BiAHIAUpArAGNwIEIAdBDGogBUG4BmopAgA3AgAMAwsgDCABKAKcAyIEIAQgDEsbIQYgDCAEIAQgDEkbIQQgFkUNASADKAIYQYCAgIB4Rg0BIAVBoQE6ALAGIAEgBiAEIAVBsAZqEKkZDAELIAdBDTYCACAHIAM2AgQgBUHgB2oQ7yQgBUHwBGoQ8CAMAQsgB0EFNgIAIAVBzAZqIAVBiAVqKQMANwIAIAVBxAZqIAVBgAVqKQMANwIAIAVBvAZqIAVB+ARqKQMANwIAIAUgBSkD8AQ3ArQGIAdBBGogBUGwBmpBJBD2BhogByAROgA5IAdBADoAOCAHIA86ADcgByAKOgA2IAcgFjoANSAHIBQ6ADQgByADNgIwIAcgBDYCLCAHIAY2AigLQQAhCwwECyAKRQRAIAVBuAJqIAVB0ARqEJETIAUgBSgCvAIiDTYCzAUgBSAFKAK4AiIPNgLIBSAFQfAEaiIQIAEQ6AcgBSgC9AQhBgJAIAUoAvAEIgpBBkYiC0UEQCAFQYAGaiAFQYgFaikDACI4NwMAIAVB+AVqIAVBgAVqKQMAIjk3AwAgBUHgBWogOTcDACAFQegFaiA4NwMAIAUgBSkD+AQiODcD8AUgBSAGNgLUBSAFIAo2AtAFIAUgODcD2AUgBEEBcQRAIAVBDzoA8AQgASAPIA0gEBCpGQsgBUHQBWoQ4RUNAQwFCyAHQQ02AgAgByAGNgIEDAULIAVB4gA6APAEIAEgDyANIAVB8ARqEKkZDAMLIAVB/ARqIAkQgBAgBUHAAWogCRDqEyAFQTE2AvgEIAVB2PLfADYC9AQgBUEwOgDwBCAFKALAASAFKALEASAFQfAEahDrFCEDAkAgCRDIDSIERQ0AIAQoAgBBJEcNACABIAEpA+ACNwOYAyABKALIAiABQSU2AsgCQSRGBEAgASABKALMAhD7CwwBC0G54+AAQShBjPPfABDaFwALIAdBDTYCACAHIAM2AgQLQQEhAwtBASELDAILIAVBsAJqIAMQkQwCfwJAAkACQAJAIAUoArACIgMgBSgCtAIiBEH6ruAAQQMQzR9FBEAgAyAEQf2u4ABBAxDNHw0BQbnj4ABBKEHI8t8AENoXAAsgBUGcBWogBUHABGoiBCgCADYCACAFQYAFaiAFQfgFaikDADcDACAFQYgFaiAFQYAGaikDADcDACAFIAUpA7gENwKUBSAFIBE6AKwFIAUgDDYCkAUgBSAXOgCvBSAFICA2AqgFIAUgHzYCpAUgBSAUNgKgBSAFIAY2AvQEIAUgCjYC8AQgBSAFKQPwBTcD+AQgBSAWOgCuBSAFIA5BAXEiDzoAsAVBACENIAVBADsAsQUgBUEBOgCtBSAFQfkHaiABQb8CaiIGKQAANwAAIAVB9AdqIAFBugJqIgMpAQA3AgAgBUHsB2ogAUGyAmoiCikBACI4NwIAIAVBADoAwgYgBUEBOgDJBiAFIAEtAMYCOgDMBiAFIAEpAaoCIjk3ALAGIAUgODcAuAYgBSADLwEAOwDABiAFIAEoAL0CNgDDBiAFIAEvAMECOwDHBiAFIAEvAcQCOwDKBiAFIDk3AuQHIAkgBUGwBmoiDhDICCAFIAE2AuAHIAVBADsAxwcgBUEAOgD3BiAFQQA6APYGIAUgDDYC8AYgBSABLQCwAjoAxgcgBSABKAGqAjYAwAcgBSABLwGuAjsAxAcgBSABKQCzAjcAyQcgBSABKQC7AjcA0QcgBSABKADDAjYA2QcgBUHBCGogBikAADcAACAFQbwIaiADKQEANwIAIAVBtAhqIAopAQA3AgAgBSABKQGqAjcCrAggCSAFQcAHahDICCAFIAE2AqgIIAVBgAdqIAQoAgA2AgAgBSAFKQO4BDcD+AYgBSAFQfAGajYCkAcgBSAFQcgFajYCjAcgBSAFQfcGajYCiAcgBSAFQfYGajYChAcgAS0AoAJBAkcNAiAOIAEQuRUCQAJAAkAgBSgCsAYiA0EoaiIGEMgNIgRFDQAgBCgCAEEURw0AIAQtAARBBEYNAQsgBhDIDSIERQ0DIAQoAgBBIUcNAyADQTxqIgQQ+RcgBBD5FyAFQegBaiADQQBBARCTASAFKALsASENIAUoAugBDQEMAwsgBUHwAWogA0EAQQEQkwEgBSgC9AEhDSAFKALwAUUNAgsgBUGwBmoQ7yQgDSEGDAMLIAVBnAVqIAVBwARqIgQoAgA2AgAgBUGABWogBUH4BWopAwA3AwAgBUGIBWogBUGABmopAwA3AwAgBSAFKQO4BDcClAUgBSAROgCsBSAFIAw2ApAFIAUgFzoArwUgBSAgNgKoBSAFIB82AqQFIAUgFDYCoAUgBSAGNgL0BCAFIAo2AvAEIAUgBSkD8AU3A/gEIAUgFjoArgUgBSAOQQFxIg86ALAFQQAhDSAFQQA7ALEFIAVBAjoArQUgBUH5B2ogAUG/AmoiBikAADcAACAFQfQHaiABQboCaiIDKQEANwIAIAVB7AdqIAFBsgJqIgopAQAiODcCACAFQQA6AMIGIAVBAToAyQYgBSABLQDGAjoAzAYgBSABKQGqAiI5NwCwBiAFIDg3ALgGIAUgAy8BADsAwAYgBSABKAC9AjYAwwYgBSABLwDBAjsAxwYgBSABLwHEAjsAygYgBSA5NwLkByAJIAVBsAZqIg4QyAggBSABNgLgByAFQQA7AMcHIAVBADoA9wYgBUEAOgD2BiAFIAw2AvAGIAUgAS0AsAI6AMYHIAUgASgBqgI2AMAHIAUgAS8BrgI7AMQHIAUgASkAswI3AMkHIAUgASkAuwI3ANEHIAUgASgAwwI2ANkHIAVBwQhqIAYpAAA3AAAgBUG8CGogAykBADcCACAFQbQIaiAKKQEANwIAIAUgASkBqgI3AqwIIAkgBUHAB2oQyAggBSABNgKoCCAFQYAHaiAEKAIANgIAIAUgBSkDuAQ3A/gGIAUgBUHwBmo2ApAHIAUgBUHIBWo2AowHIAUgBUH3Bmo2AogHIAUgBUH2Bmo2AoQHAn8CQCABLQCgAkECRgRAIA4gARC5FQJAAkACQAJAIAUoArAGIgNBKGoiBhDIDSIERQ0AIAQoAgBBFEcNACAELQAEQQRGDQELIAYQyA0iBEUNAiAEKAIAQSFHDQIgA0E8aiIEEPkXIAQQ+RcgBUGgAmogA0EAQQEQkwEgBSgCpAIhDSAFKAKgAg0BDAILIAVBqAJqIANBAEEBEJMBIAUoAqwCIQ0gBSgCqAJFDQELIAVBsAZqEO8kIA0hBgwCCyAFQbAGahDvJAsCQAJAAkAgCRDIDSIDBEAgAygCAEEJRg0BCyAFQbgGaiAJEIAQIAVBgAJqIAkQ6hMgBUH43d8ANgK0BiAFQTQ6ALAGIAUoAoACIAUoAoQCIAVBsAZqEOsUIQYgCRDIDSIDRQ0BIAMoAgBBJEcNASABIAEpA+ACNwOYAyABKALIAiABQSU2AsgCQSRHDQ8gASABKALMAhD7CwwBCyABKALIAiEDIAFBJTYCyAIgASABKQPgAjcDmAMgBUG8BmoiBCABQdQCaikCADcCACAFQcQGaiIGIAFB3AJqKAIANgIAIAUgASkCzAI3ArQGIAUgAzYCsAYgBUGwBmoQvgogBUEAOgCbCCAFQQE6AJ0IIAUgBS0A9gY6AI8IIAUgBS0A9wY6AJAIIAUgAS0AsAI6AI4IIAUgAS0AvgI6AJwIIAUgAS0AxgI6AKQIIAUgASgBqgI2AIgIIAUgAS8BrgI7AIwIIAUgASkAswI3AJEIIAUgAS8AuwI7AJkIIAUgASgCwAI2AJ4IIAUgAS8BxAI7AKIIIAVByQZqIAFBqgJqIgNBFWopAAA3AAAgBiADQRBqKQEANwIAIAQgA0EIaikBADcCACAFIAMpAQA3ArQGIAkgBUGICGoQyAggBSABNgKwBiAFQagHaiABELIBIAUoAqwHIQQgBSgCqAciEEGAgICAeEcEQAJAIAUoArAHIg4EQEEAIQYgBCEDIA4hCgNAIAMQ3xUgBmohBiADQUBrIQMgCkEBayIKDQALIAZBAUcEQCAFKALMBSEDIAUoAsgFIQYgBUESOgCoByABIAYgAyAFQagHahCpGQsgBCAOQdz03wAQkyMiAygCAEECRw0BIAVBmAJqIAMgDkHs9N8AEJMjEIwMIAUoApwCIQMgBSgCmAIhBiAFQRk6AKgHIAEgBiADIAVBqAdqEKkZDAELIAUoAswFIQMgBSgCyAUhBiAFQRI6AKgHIAEgBiADIAVBqAdqEKkZCyAFIA42AqAHIAUgBDYCnAcgBSAQNgKYByAFQbAGahDvJAJAAkAgCRDIDSIDBEAgAygCAEEKRg0BCyAFQbgGaiAJEIAQIAVBiAJqIAkQ6hMgBUHQ3d8ANgK0BiAFQTQ6ALAGIAUoAogCIAUoAowCIAVBsAZqEOsUIQYgCRDIDSIDRQ0BIAMoAgBBJEcNASABIAEpA+ACNwOYAyABKALIAiABQSU2AsgCQSRHDRAgASABKALMAhD7CwwBCyABKALIAiEGIAFBJTYCyAIgASABKQPgAjcDmAMgBUG8BmogAUHMAmoiA0EIaikCADcCACAFQcQGaiADQRBqKAIANgIAIAUgAykCADcCtAYgBSAGNgKwBiAFQbAGahC+CkEAIQYCQCABLQCgAkECRw0AIAkQyA0iA0UNACADKAIAQRNHDQAgBUGQAmogAUGo2N8AEPEBIAUoApQCIQYgBSgCkAINAQsgBSAGNgKkByAFQbAGaiABIAUoAoQHIhItAAAgBSgCiAciEy0AACAEIA4QqBkQrAMgBSgCtAYhCiAFKAKwBiIQQYGAgIB4RwRAIAVBsAdqIhkgBUHABmoiCSkCADcDACAFIAUpArgGNwOoByAQQYCAgIB4Rw0EIAEtAKACQQJHDQQgDkEGdCEDA0AgA0UNBSAEKAIAQQRGBEAgBCgCECEOIAQoAgwhGyAFQakBOgCwBiABIBsgDiAFQbAGahCpGQsgBEFAayEEIANBQGohAwwACwALIAVBpAdqEOAmIAohBgsgBUGYB2oQ4SYMAQsgBUGwBmoQ7yQgBCEGCyANEL4oDAELIAVBxAZqIAVBgAdqKAIANgIAIAVBuAZqIhsgBUGgB2ooAgA2AgAgBSAFKQP4BjcCvAYgBSAFKQKYBzcDsAYgASgCnAMhBCAFKAKQBygCACEOIBMtAAAhEyASLQAAIRJByABBBBCMICIDIAo2AhwgAyAQNgIYIAMgEjoARSADIBM6AEQgAyAGNgJAIAMgDTYCPCADQQA2AjggAyAOIAQgBCAOSRs2AjQgAyAOIAQgBCAOSxs2AjAgA0EQaiAJKQMANwIAIANBCGogGykDADcCACADIAUpA7AGNwIAIAMgBSkDqAc3AiAgA0EoaiAZKQMANwIAQQEMAQsgBUH4BmoQ1yYgBiEDQQALIQQgBUGoCGoQ7yQCQAJAIAQEQCAFQeAHahDvJCABLQCgAkECRw0CIAEtAMcCRQ0BDAILIAdBDTYCACAHIAM2AgQgBUHgB2oQ7yQgBUHwBGoQ8CAMBgsgBUH4AWogBUHwBGoQkRMgBSgC/AEhBCAFKAL4ASEGIAVBgAE6ALAGIAEgBiAEIAVBsAZqEKkZCyAFKALwBEEFRgRAIAwgASgCnAMiCiAKIAxLGyEEIAUoAoQFIQYgEUEDRwRAIAVBtQE6ALAGIAEgBCAGIAQgBkkbIAQgBiAEIAZLGyAFQbAGahCpGQsgBUG8BmogBUH4BGoiDUEIaigCADYCACAHQQY2AgAgByAPOgApIAcgFzoAKCAHIBY6ACcgByAUOgAmIAdBAjoAJSAHIBE6ACQgByADNgIgIAcgDCAKIAogDEkbNgIcIAcgBDYCGCAHIAY2AhQgBSANKQIANwK0BiAHIAUpArAGNwIEIAdBDGogBUG4BmopAgA3AgAMBQsgDCABKAKcAyIEIAQgDEsbIQYgDCAEIAQgDEkbIQQCQCAWRQ0AIAMoAhhBgICAgHhGDQAgBUGhAToAsAYgASAGIAQgBUGwBmoQqRkLIAdBBTYCACAFQcwGaiAFQYgFaikDADcCACAFQcQGaiAFQYAFaikDADcCACAFQbwGaiAFQfgEaikDADcCACAFIAUpA/AENwK0BiAHQQRqIAVBsAZqQSQQ9gYaIAcgEToAOSAHQQI6ADggByAPOgA3IAcgFzoANiAHIBY6ADUgByAUOgA0IAcgAzYCMCAHIAQ2AiwgByAGNgIoDAQLIAVBsAZqEO8kCwJAAkACQCAJEMgNIgMEQCADKAIAQQlGDQELIAVBuAZqIAkQgBAgBUHQAWogCRDqEyAFQfjd3wA2ArQGIAVBNDoAsAYgBSgC0AEgBSgC1AEgBUGwBmoQ6xQhBiAJEMgNIgNFDQEgAygCAEEkRw0BIAEgASkD4AI3A5gDIAEoAsgCIAFBJTYCyAJBJEcNCyABIAEoAswCEPsLDAELIAEoAsgCIQMgAUElNgLIAiABIAEpA+ACNwOYAyAFQbwGaiIEIAFB1AJqKQIANwIAIAVBxAZqIgYgAUHcAmooAgA2AgAgBSABKQLMAjcCtAYgBSADNgKwBiAFQbAGahC+CiAFQQA6AJsIIAVBAToAnQggBSAFLQD2BjoAjwggBSAFLQD3BjoAkAggBSABLQCwAjoAjgggBSABLQC+AjoAnAggBSABLQDGAjoApAggBSABKAGqAjYAiAggBSABLwGuAjsAjAggBSABKQCzAjcAkQggBSABLwC7AjsAmQggBSABKALAAjYAngggBSABLwHEAjsAogggBUHJBmogAUGqAmoiA0EVaikAADcAACAGIANBEGopAQA3AgAgBCADQQhqKQEANwIAIAUgAykBADcCtAYgCSAFQYgIahDICCAFIAE2ArAGIAVBqAdqIAEQsgEgBSgCrAchBCAFKAKoByIQQYCAgIB4RwRAAkAgBSgCsAciDkUNAEEAIQYgBCEDIA4hCgNAIAMQ3xUgBmohBiADQUBrIQMgCkEBayIKDQALIAZFDQAgBSgCzAUhAyAFKALIBSEGIAVBEToAqAcgASAGIAMgBUGoB2oQqRkLIAUgDjYCoAcgBSAENgKcByAFIBA2ApgHIAVBsAZqEO8kAkACQCAJEMgNIgMEQCADKAIAQQpGDQELIAVBuAZqIAkQgBAgBUHYAWogCRDqEyAFQdDd3wA2ArQGIAVBNDoAsAYgBSgC2AEgBSgC3AEgBUGwBmoQ6xQhBiAJEMgNIgNFDQEgAygCAEEkRw0BIAEgASkD4AI3A5gDIAEoAsgCIAFBJTYCyAJBJEcNDCABIAEoAswCEPsLDAELIAEoAsgCIQYgAUElNgLIAiABIAEpA+ACNwOYAyAFQbwGaiABQcwCaiIDQQhqKQIANwIAIAVBxAZqIANBEGooAgA2AgAgBSADKQIANwK0BiAFIAY2ArAGIAVBsAZqEL4KQQAhBgJAIAEtAKACQQJHDQAgCRDIDSIDRQ0AIAMoAgBBE0cNACAFQeABaiABQajY3wAQ8QEgBSgC5AEhBiAFKALgAQ0BCyAFIAY2AqQHIAVBsAZqIAEgBSgChAciEi0AACAFKAKIByITLQAAIAQgDhCoGRCsAyAFKAK0BiEKIAUoArAGIhBBgYCAgHhHBEAgBUGwB2oiGSAFQcAGaiIJKQIANwMAIAUgBSkCuAY3A6gHIBBBgICAgHhHDQQgAS0AoAJBAkcNBCAOQQZ0IQMDQCADRQ0FIAQoAgBBBEYEQCAEKAIQIQ4gBCgCDCEbIAVBqQE6ALAGIAEgGyAOIAVBsAZqEKkZCyAEQUBrIQQgA0FAaiEDDAALAAsgBUGkB2oQ4CYgCiEGCyAFQZgHahDhJgwBCyAFQbAGahDvJCAEIQYLIA0QvigMAQsgBUHEBmogBUGAB2ooAgA2AgAgBUG4BmoiGyAFQaAHaigCADYCACAFIAUpA/gGNwK8BiAFIAUpApgHNwOwBiABKAKcAyEEIAUoApAHKAIAIQ4gEy0AACETIBItAAAhEkHIAEEEEIwgIgMgCjYCHCADIBA2AhggAyASOgBFIAMgEzoARCADIAY2AkAgAyANNgI8IANBADYCOCADIA4gBCAEIA5JGzYCNCADIA4gBCAEIA5LGzYCMCADQRBqIAkpAwA3AgAgA0EIaiAbKQMANwIAIAMgBSkDsAY3AgAgAyAFKQOoBzcCICADQShqIBkpAwA3AgBBAQwBCyAFQfgGahDXJiAGIQNBAAshBCAFQagIahDvJAJAAkAgBARAIAVB4AdqEO8kIAEtAKACQQJHDQIgAS0AxwJFDQEMAgsgB0ENNgIAIAcgAzYCBCAFQeAHahDvJCAFQfAEahDwIAwCCyAFQcgBaiAFQfAEahCREyAFKALMASEEIAUoAsgBIQYgBUGAAToAsAYgASAGIAQgBUGwBmoQqRkLIAUoAvAEQQVGBEAgDCABKAKcAyIKIAogDEsbIQQgBSgChAUhBiARQQNHBEAgBUG1AToAsAYgASAEIAYgBCAGSRsgBCAGIAQgBksbIAVBsAZqEKkZCyAFQbwGaiAFQfgEaiINQQhqKAIANgIAIAdBBjYCACAHIA86ACkgByAXOgAoIAcgFjoAJyAHIBQ6ACYgB0EBOgAlIAcgEToAJCAHIAM2AiAgByAMIAogCiAMSRs2AhwgByAENgIYIAcgBjYCFCAFIA0pAgA3ArQGIAcgBSkCsAY3AgQgB0EMaiAFQbgGaikCADcCAAwBCyAMIAEoApwDIgQgBCAMSxshBiAMIAQgBCAMSRshBAJAIBZFDQAgAygCGEGAgICAeEYNACAFQaEBOgCwBiABIAYgBCAFQbAGahCpGQsgB0EFNgIAIAVBzAZqIAVBiAVqKQMANwIAIAVBxAZqIAVBgAVqKQMANwIAIAVBvAZqIAVB+ARqKQMANwIAIAUgBSkD8AQ3ArQGIAdBBGogBUGwBmpBJBD2BhogByAROgA5IAdBAToAOCAHIA86ADcgByAXOgA2IAcgFjoANSAHIBQ6ADQgByADNgIwIAcgBDYCLCAHIAY2AigLQQEhAwsCQAJAIAUoAtAEQQVHBEAgAw0BDAILIAVB0ARqEPAgDAELIAVB0ARqEIYWCyALRQ0CCyAFQbgEahDXJgwBCyAFQZwFaiAFQcAEaiIEKAIANgIAIAVBgAVqIAVBgAdqKQMANwMAIAVBiAVqIAVBiAdqKQMANwMAIAUgBSkDuAQ3ApQFIAUgEToArAUgBSAMNgKQBUEAIQsgBUEAOgCvBSAFICA2AqgFIAUgHzYCpAUgBSAUNgKgBSAFIAY2AvQEIAUgCjYC8AQgBSAFKQP4BjcD+AQgBSAWOgCuBSAFIA5BAXEiDjoAsAUgBUGAAjsAsQUgBUEAOgCtBSAFQfkHaiABQb8CaiIGKQAANwAAIAVB9AdqIAFBugJqIgMpAQA3AgAgBUHsB2ogAUGyAmoiCikBACI4NwIAIAVBADoAwgYgBUEBOgDJBiAFIAEtAMYCOgDMBiAFIAEpAaoCIjk3ALAGIAUgODcAuAYgBSADLwEAOwDABiAFIAEoAL0CNgDDBiAFIAEvAMECOwDHBiAFIAEvAcQCOwDKBiAFIDk3AuQHIAkgBUGwBmoiDRDICCAFIAE2AuAHIAVBgAI7AI8IIAVBAToApAcgBUEAOgDwBiAFIAw2AsgFIAUgAS0AsAI6AI4IIAUgASgBqgI2AIgIIAUgAS8BrgI7AIwIIAUgASkAswI3AJEIIAUgASkAuwI3AJkIIAUgASgAwwI2AKEIIAVBwQhqIAYpAAA3AAAgBUG8CGogAykBADcCACAFQbQIaiAKKQEANwIAIAUgASkBqgI3AqwIIAkgBUGICGoQyAggBSABNgKoCCAFQcgHaiAEKAIANgIAIAUgBSkDuAQ3A8AHIAUgBUHIBWo2AtQHIAUgBUGkB2o2AtAHIAUgBUHwBmo2AswHAn8CQCABLQCgAkECRgRAIA0gARC5FQJAAkACQAJAIAUoArAGIgNBKGoiBhDIDSIERQ0AIAQoAgBBFEcNACAELQAEQQRGDQELIAYQyA0iBEUNAiAEKAIAQSFHDQIgA0E8aiIEEPkXIAQQ+RcgBUGIA2ogA0EAQQEQkwEgBSgCjAMhCyAFKAKIAw0BDAILIAVBkANqIANBAEEBEJMBIAUoApQDIQsgBSgCkANFDQELIAVBsAZqEO8kIAshCgwCCyAFQbAGahDvJAsCQAJAAkAgCRDIDSIDBEAgAygCAEEJRg0BCyAFQbgGaiAJEIAQIAVB8AJqIAkQ6hMgBUH43d8ANgK0BiAFQTQ6ALAGIAUoAvACIAUoAvQCIAVBsAZqEOsUIQogCRDIDSIDRQ0BIAMoAgBBJEcNASABIAEpA+ACNwOYAyABKALIAiABQSU2AsgCQSRHDQcgASABKALMAhD7CwwBCyABKALIAiEDIAFBJTYCyAIgASABKQPgAjcDmAMgBUG8BmoiBiABQcwCaiIEQQhqKQIANwIAIAVBxAZqIgogBEEQaigCADYCACAFIAQpAgA3ArQGIAUgAzYCsAYgBUGwBmoiDRC+CiAFQQA6AOMEIAVBAToA5QQgBSAFLQDwBjoA1wQgBSAFLQCkBzoA2AQgBSABLQCwAjoA1gQgBSABLQC+AjoA5AQgBSABLQDGAjoA7AQgBSABKAGqAjYA0AQgBSABLwGuAjsA1AQgBSABKQCzAjcA2QQgBSABLwC7AjsA4QQgBSABKALAAjYA5gQgBSABLwHEAjsA6gQgBUHJBmogAUGqAmoiA0EVaikAADcAACAKIANBEGopAQA3AgAgBiADQQhqKQEANwIAIAUgAykBADcCtAYgCSAFQdAEahDICCAFIAE2ArAGIAVBqAdqIAEQsgEgBSgCrAchAyAFKAKoByIKQYCAgIB4RwRAIAUgBSgCsAciBjYC+AUgBSADNgL0BSAFIAo2AvAFIA0Q7yQCQAJAIAkQyA0iCgRAIAooAgBBCkYNAQsgBUG4BmogCRCAECAFQfgCaiAJEOoTIAVB0N3fADYCtAYgBUE0OgCwBiAFKAL4AiAFKAL8AiAFQbAGahDrFCEKIAkQyA0iA0UNASADKAIAQSRHDQEgASABKQPgAjcDmAMgASgCyAIgAUElNgLIAkEkRw0IIAEgASgCzAIQ+wsMAQsgASgCyAIhCiABQSU2AsgCIAEgASkD4AI3A5gDIAVBvAZqIARBCGopAgA3AgAgBUHEBmogBEEQaigCADYCACAFIAQpAgA3ArQGIAUgCjYCsAYgBUGwBmoQvgpBACEKAkAgAS0AoAJBAkcNACAJEMgNIgRFDQAgBCgCAEETRw0AIAVBgANqIAFBqNjfABDxASAFKAKEAyEKIAUoAoADDQELIAUgCjYCmAcgBUGwBmogASAFKALMByIQLQAAIAUoAtAHIhItAAAgAyAGEKgZEKwDIAUoArQGIQQgBSgCsAYiD0GBgICAeEcEQCAFQbAHaiITIAVBwAZqIhkpAgA3AwAgBSAFKQK4BjcDqAcgD0GAgICAeEcNBCABLQCgAkECRw0EIAZBBnQhBgNAIAZFDQUgAygCAEEERgRAIAMoAhAhDSADKAIMIQkgBUGpAToAsAYgASAJIA0gBUGwBmoQqRkLIANBQGshAyAGQUBqIQYMAAsACyAFQZgHahDgJiAEIQoLIAVB8AVqEOEmDAELIAVBsAZqEO8kIAMhCgsgCxC+KAwBCyAFQcQGaiAFQcgHaigCADYCACAFQbgGaiIJIAVB+AVqKAIANgIAIAUgBSkDwAc3ArwGIAUgBSkC8AU3A7AGIAEoApwDIQYgBSgC1AcoAgAhDSASLQAAIRIgEC0AACEQQcgAQQQQjCAiAyAENgIcIAMgDzYCGCADIBA6AEUgAyASOgBEIAMgCjYCQCADIAs2AjwgA0EANgI4IAMgDSAGIAYgDUkbNgI0IAMgDSAGIAYgDUsbNgIwIANBEGogGSkDADcCACADQQhqIAkpAwA3AgAgAyAFKQOwBjcCACADIAUpA6gHNwIgIANBKGogEykDADcCAEEBDAELIAVBwAdqENcmIAohA0EACyEEIAVBqAhqEO8kAkAgBARAIAVB4AdqEO8kIAUoAvAEQQVGBEAgDCABKAKcAyILIAsgDEsbIQQgBSgChAUhBiARQQNHBEAgBUG1AToAsAYgASAEIAYgBCAGSRsgBCAGIAQgBksbIAVBsAZqEKkZCyAFQbwGaiAFQfgEaiIKQQhqKAIANgIAIAdBBjYCACAHIA46ACkgB0EAOgAoIAcgFjoAJyAHIBQ6ACYgB0EAOgAlIAcgEToAJCAHIAM2AiAgByAMIAsgCyAMSRs2AhwgByAENgIYIAcgBjYCFCAFIAopAgA3ArQGIAcgBSkCsAY3AgQgB0EMaiAFQbgGaikCADcCAAwDCyAMIAEoApwDIgQgBCAMSxshBiAMIAQgBCAMSRshBCAWRQ0BIAMoAhhBgICAgHhGDQEgBUGhAToAsAYgASAGIAQgBUGwBmoQqRkMAQsgB0ENNgIAIAcgAzYCBCAFQeAHahDvJCAFQfAEahDwIAwBCyAHQQU2AgAgBUHMBmogBUGIBWopAwA3AgAgBUHEBmogBUGABWopAwA3AgAgBUG8BmogBUH4BGopAwA3AgAgBSAFKQPwBDcCtAYgB0EEaiAFQbAGakEkEPYGGiAHIBE6ADkgB0EAOgA4IAcgDjoANyAHQQA6ADYgByAWOgA1IAcgFDoANCAHIAM2AjAgByAENgIsIAcgBjYCKAsgBUHQCGokAAwCC0G54+AAQShB+PDfABDaFwALQbnj4ABBKEGI8d8AENoXAAsgCCgClAIhAyAIKAKQAiIEQQ1GDQIgNiA3QdAAEPYGGiAIIAM2AuwCIAggBDYC6AIgAS0AuAJBAXENCSAIKAKIA0GAgICAeEcgBEEFSXEiAyAmcUUEQCADICZyISYMCgsgCCgCoAMhAyAIKAKkAyEEIAhB5QA6AJACIAEgAyAEIAhBkAJqEKkZQQEhJgwJCyABKAKAAiEDIAhBADoAkAIgCCADIAMgCEGQAmoQ6xQ2AvABIAhBATYC7AEgCEHsAWoQpiMLIAgoAuQBIQMgCCgC4AEiBEGAgICAeEYNASAIIAgoAugBNgK4ASAIIAM2ArQBIAggBDYCsAEgCEG8AWoQ7yQgFRDIDUUNAyAVEMgNIgNFDQIgAygCAEEORw0CIAEoAsgCIQMgAUElNgLIAiABIAEpA+ACNwOYAyAIQfQCaiAYQQhqKQIANwIAIAhB/AJqIBhBEGooAgA2AgAgCCAYKQIANwLsAiAIIAM2AugCIAhB6AJqEL4KDAQLIAhB7AFqEO8kIAhB4AFqEOwmCyAAQQM6ABQgACADNgIAIAhBvAFqEO8kDAgLIAhB8AJqIBUQgBAgCEEYaiAVEOoTIAhBuNnfADYC7AIgCEE0OgDoAiAIKAIYIAgoAhwgCEHoAmoQ6xQhAyAVEMgNIgRFDQMgBCgCAEEkRw0DIAEgASkD4AI3A5gDIAEoAsgCIAFBJTYCyAJBJEcNAiABIAEoAswCEPsLDAMLIAhB8AJqIBUQgBAgCEEQaiAVEOoTIAhBuNnfADYC7AIgCEE0OgDoAiABIAgoAhAgCCgCFCAIQegCahCpGQsgACAIKQNwNwMAIABBCGogCEH4AGopAwA3AwAgAEEQaiAIQYABaikDADcDACABKAKcAyEDIAhBmAJqIAhB4ABqKAIANgIAIAhBpAJqIAhBuAFqKAIANgIAIAggCCkDWDcDkAIgCCAIKQKwATcCnAIgCCgCaCgCACEEIAgoAqABIQYgCEGwAmogCEGsAWooAgA2AgAgCCAIKQKkATcDqAIgCEGdA2pCADcAACAIQQA2ApQDIAhCADcCjAMgCEIANwKYAyAIQQA2AoADIAhCCDcC+AIgCEIANwLwAiAIQoCAgIDAADcC6AIgCEIENwKEA0HAAEEEEIwgIAhBkAJqQSQQ9gYiAUEAOgA8IAEgAjYCOCABICg2AjQgASAGNgIwIAFBADYCLCABIAQgAyADIARJGzYCKCABIAQgAyADIARLGzYCJCAAIAE2AhggCEHoAmoQhx0MCwtBuePgAEEoQbzw3wAQ2hcACyAAQQM6ABQgACADNgIAIAhBsAFqEOwmDAMLIAhB4AFqIAhB6AJqEOMZIAhB7AFqEO8kDAALAAsgCEHwAmogFRCAECAIQQhqIBUQ6hMgCEHg2d8ANgLsAiAIQTQ6AOgCIAgoAgggCCgCDCAIQegCahDrFCEDAkAgFRDIDSIERQ0AIAQoAgBBJEcNACABIAEpA+ACNwOYAyABKALIAiABQSU2AsgCQSRGBEAgASABKALMAhD7CwwBC0G54+AAQShBrPDfABDaFwALIABBAzoAFCAAIAM2AgALIAhBpAFqENgmCyACELooIAhBoAFqEOUmCyAoEL4oCyAIKQNwIAgtAIQBEKMjDAELIABBAzoAFCAAIAI2AgALIAhB2ABqENcmCyAIQTRqEO8kIAhBwANqJAALpSUCFH8BfiMAQfAGayIDJAAgA0EgaiABEJEMIANB+ABqIAMoAiAgAygCJEHw5uAAQQJB8ubgAEEBEMcEIANBLGogAygCfCIEIAMoAoABQQ1B8ubgAEEBEK0LIAMoAnggBBC4KQJAAkACQAJAIAItAE1FBEAgAi0ATEUNASADQRhqIAEQkQwgAygCGCADKAIcEMELDQELIAItAEwgAygCMCEHIANBEGogAygCNCIEELYUIANBADYCXCADIAMpAxA3AlQgAyAEIAdqNgJAIAMgBzYCPCADQYGAxAA2AjhBAXEhBQNAQQAhDgNAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCADQThqEKceIgRB3ABHBEAgBEGAgMQARg0BDAoLAkACQAJAAkAgA0E4ahCnHiIEQe4Aaw4ODgEBAQIBDwICAQMBAQYACwJAIARBCmsOBAIBAQIACyAEQajAAGtBAkkNFyAEQSRGDQQgBEHcAEYgBEHgAEZyIARB4gBGIARB5gBGcnINASAEQYCAxABHDQBB3AAhBAwWCyAEQfj//wBxQTBHDQsLIANB1ABqIgZB3AAQ3Q8gBiAEEN0PDBULQQAhB0ECIQQDQCADQThqEKceIgZBgIDEAEYEQCADIAc2AmRBgIDEACEEIAdFDQUMBgsCQAJAIAQEQCAGQTBrIgtBCkkNAUF/IAZBIHIiCUHXAGsiCiAKIAlB4QBrSRsiC0EQSQ0BCyADIAc2AmQgBiEEIAcNByAEQTFrQQhLDQYgA0EANgKIASADQQE2AnwgA0Hs2NgANgJ4IANCBDcCgAEgA0HUAGogA0H4AGoQ7SQNAQwICyAEQQFrIQQgCyAHQQR0ciEHDAELC0H04eAAQSsgA0HvBmpB3NbYAEH02NgAEMAOAAsgAygCVCEUIAEoAgwhFiABKAIIIRUgA0E4akEKIAMoAlgiDyADKAJcIhEQmhJBxIHkACgCAEECRwRAIANBtIHkADYCbCADQbSB5AA2AlQgAyADQe8GajYCgAEgAyADQdQAajYCfCADIANB7ABqNgJ4QcSB5AAgA0H4AGpBmNDgABDqBAsgAygCNCEGIAMoAjAhBEG4geQAKAIAIQUCQAJ/EM4NKAIAIgcgBSgC+AUiAUcEQAJAAkAgAUUEQCAFIAUoAvgFIgFBASABGzYC+AUgAUUNAQsgBSgChAYiAQ0BQaS/4AAQjhsACyADQfgAaiAFKALwBSAFKAL0BSgCFBEAAAJAIAUoAgBBAkYNACAFKAIUIgEgASgCACIBQQFrNgIAIAFBAUYEQCAFQRRqEKsUCyAFKAIIIAVBDGooAgAQuykgBSgC6AQiAUGAgICAeEcEQCABIAVB7ARqKAIAEL8pIAVB9ARqEPonIAVBpAVqEPonCyAFKALUBSIBQYCAgIB4RwRAIAEgBUHYBWooAgAQvykgBSgC4AUgBUHkBWooAgAQ8SoLIAUoAtgEIgFBgICAgHhHBEAgASAFQdwEaigCABC7KQsgBSgCyARBAkcEQCAFQdgBahCMDiAFQZgDahCMDgsgBSgCyAFBAkYNACAFQRhqEIwOCyAFIANB+ABqQfAFEPYGGkEAIQlBASEODAMLIAUoAoAGIAcgAXBBBnRqIgotAABBASEJIApBAToAAEUEQCAKKAIMIgEEQCAKIAFBAWsiATYCDCAKKAIIIAFBAnRqKAIAIQcgCkEAOgAAQQAMAwsgCkEAOgAAIANB+ABqIgEgBSgC8AUgBSgC9AUoAhQRAABB8AVBCBCMICIHIAFB8AUQ9gYaQQAMAgsgA0H4AGoiASAFKALwBSAFKAL0BSgCFBEAAEHwBUEIEIwgIgcgAUHwBRD2BhpBACEODAILIAVBATYC+AVBAQshDkEAIQkLIANBhwFqIANB1gBqLQAAOgAAIANBqwFqIANB7gBqLQAAOgAAIAMgCToAhAEgAyAFNgKAASADIAc2AnwgAyAONgJ4IAMgAy8AVDsAhQEgA0EAOgCoASADIAY2AqQBIANBADYCoAEgAyAGNgKcASADIAQ2ApgBIANBADYCkAEgAyADLwBsOwCpASADQcABaiADQUBrKQIANwIAIANByAFqIANByABqKQIANwIAIANB0AFqIANB0ABqKAIANgIAIAMgAykCODcCuAEgA0EANgKIASADQbSB5AA2AqwBIAMgBDYCsAEgAyAGNgK0ASADQQA2AtwBIANCADcC1AEgA0GQAWohDiADQYgBaiEKIANBuAFqIQVBACEHQQAhBAJAAkACQANAIANBOGogBRDtCAJAAkAgAygCOEUNAAJ/IAMoAnhFBEAgAygCfAwBCyADKAKAAQshCSADKAI8IRMgAygCrAEiBigCACISKAIQIQwgAygCoAEiAQRAIAwoAlgtABxBAXENAQsgDCgCWCENIAMoAqQBIgsgAygCnAEiDEkEQCANLQAgQQJxDQELAkAgDSgCAEUNACALIAFrIgFBACABIAtNGyIBIA0oAgRJDQEgAygCkAFBAWtBAk8EQCANLQAcQQFxRQ0BCyANLQAgQQJxRQ0AIA0oAghFDQAgASANKAIMSw0BCyADQThqIBIoAgggEigCDCIBKAIIQQFrQXhxakEIaiAJIA4gASgCNBEGACADKAI8IQkCQAJAIAMoAjgOAwIAAQALIAkgAykCQKciAUkNAiADKAKIAUEBRw0CIAMoAowBIAFHDQIgA0E4aiENIANB+ABqIQwjAEFAaiIIJAACQAJAAkAgASAJTQRAIAooAhgiCUF/Rg0BIAggCigCHCILNgIQIAggCUEBaiISNgIMIAooAhQiASALSSALQQFqIAlNcg0CIAogEjYCGAJ/IAwoAgBFBEAgDCgCBAwBCyAMKAIICyEJAkACQCAGKAIAIgwoAhAoAlgiEC0AHEEBcQ0AIAEgC0sEQCAQLQAgQQJxDQELIApBCGohBgJAIBAoAgBFDQAgCyASayIBQQAgASALTRsiASAQKAIESQ0BIAYoAgBBAWtBAk8EQCAQLQAcQQFxRQ0BCyAQLQAgQQJxRQ0AIBAoAghFDQAgASAQKAIMSw0BCyAIIAwoAgggDEEMaigCABClHyAIQRRqIAgoAgAgCSAGIAgoAgQoAjQRBgAMAQsgCEEANgIUCyANIAgpAhQ3AgAgDUEIaiAIQRxqKQIANwIAIAhBQGskAAwDC0Hc2cMAQR5B/NnDABDaFwALQYzawwAQvCkACyAIQQI2AhggCEH8q+AANgIUIAhCAjcCICAIQQk2AjggCEH6ADYCMCAIIAE2AjwgCCAIQSxqNgIcIAggCEE8ajYCNCAIIAhBDGo2AiwgCEEUakGMrOAAEKEdAAsgAygCOCIBQQJHBEAgAUUNAiADKQJApyEBIAMoApwBIQwgAygCpAEhCwwDCyADKAI8IQkLIAMgCTYCbCADQQI2AjwgA0GcquAANgI4IANCATcCRCADQfsANgJYIAMgA0HUAGo2AkAgAyADQewAajYCVCADQThqQayq4AAQoR0ACyADQfgAaiIBENgHIAEgAiAHIBVqELMcAkAgAy0AeEEERg0AIAMpA3giF0L/AYNCBFENACAAIBc3AgAMBQsgA0EIaiAEIA8gEUH4r+AAENAUIANB+ABqIAJBAEEAIAMoAgggAygCDBCKDwJAIAMtAHhBBEcEQCADKQN4IhdC/wGDQgRSDQELIANB+ABqIAIgFhCzHAJAIAMtAHhBBEcEQCADKQN4IhdC/wGDQgRSDQELIBQgDxC4KSADKAIwIQQMHgsgACAXNwIADAULIAAgFzcCAAwECyADIAE2AmwgAyALNgJwIAsgDE0gC0EBaiABT3FFBEAgA0ECNgI8IANB/KvgADYCOCADQgI3AkQgA0EJNgJgIANB+gA2AlggAyAMNgJoIAMgA0HUAGo2AkAgAyADQegAajYCXCADIANB7ABqNgJUIANBOGpBjKzgABChHQALIAMgATYCoAEgAyABNgKMASADQQE2AogBAkAgEwRAIANBOGogAiAHIBVqELMcIAMtADhBBEcEQCADKQM4IhdC/wGDQgRSDQILIBNBf0YNAwsgE0EBaiIGIARJDQMCQCAERQ0AIAQgEUkEQCAEIA9qLAAAQb9/Sg0BDAULIAQgEUcNBAsCQCAGIBFJBEAgBiAPaiwAAEG/f0oNAQwFCyAGIBFHDQQLIANBOGogAkEAQQAgBCAPaiAGIARrEIoPIAMtADhBBEcEQCABIQcgBiEEIAMpAzgiF0L/AYNCBFINAQwCCyABIQcgBiEEDAELCyAAIBc3AgAgA0H4AGoQ2AcMAgtBiLDgABCNGwALIA8gESAEIAZBiLDgABC4JgALIBQgDxC4KSADKAIwIQQMFgsgA0E4ahCCHUGo2NgAELYdRQ0LIANB1ABqIgRB3AAQ3Q8gBEEkEN0PDBILIA5FBEBB+wAhBAwRCyADQdQAaiIEQdwAEN0PIARB+wAQ3Q8MEgsgA0EANgKIASADQQE2AnwgA0HU2NgANgJ4IANCBDcCgAEgA0HUAGogA0H4AGoQ7SQEQEH04eAAQSsgA0HvBmpB3NbYAEHc2NgAEMAOAAsgBkGAgMQARg0QDAELAkAgB0EBa0EPTwRAIAdBIGtB3wBJDQEgA0EBNgJ8IANBzNjYADYCeCADQgE3AoQBIANB1QE2AnAgAyADQewAajYCgAEgAyADQeQAajYCbCADQdQAaiADQfgAahDtJA0EIAZBgIDEAEYNEQwCCyADQQE2AnwgA0Go2dgANgJ4IANCATcChAEgA0HVATYCcCADIANB7ABqNgKAASADIANB5ABqNgJsIANB1ABqIANB+ABqEO0kDQIgBkGAgMQARg0QDAELIAMgBzYCaCADQQE2AnwgA0Go7uAANgJ4IANCATcChAEgA0HhADYCcCADIANB7ABqNgKAASADIANB6ABqNgJsIANB1ABqIANB+ABqEO0kDQMgBkGAgMQARg0PCyADQdQAaiAEEN0PDA4LQfTh4ABBKyADQe8GakHc1tgAQbDZ2AAQwA4AC0H04eAAQSsgA0HvBmpB3NbYAEGE2dgAEMAOAAtB9OHgAEErIANB7wZqQdzW2ABBlNnYABDADgALIAQODQcICAgICAgIBAEABgUCCyADQdQAakEKEN0PDAkLIANB1ABqQQkQ3Q8MCAsgBEEkRw0FCyADQdQAakEkEN0PQQEhDgwGCyADQdQAakGy2NgAQQIQ1h0MBQsgA0HUAGpBtNjYAEECENYdDAQLIANB1ABqQbbY2ABBAhDWHQwDCwJAIANBOGoQgh0iBARAIAQoAgBBMWtBCUkNAQsgA0HUAGpBsNjYAEECENYdDAMLIANB1ABqQazY2ABBBBDWHQwCCyAEQSBrQd8ASQ0AAkACQAJAAkACQCAEQf8Aa0GBAU8EQCAEQajAAGsOAgIDAQsgA0EBNgJ8IANBzNjYADYCeCADQgE3AoQBIANB1AE2AnAgAyAEOgBoIAMgA0HsAGo2AoABIAMgA0HoAGo2AmwgA0HUAGogA0H4AGoQ7SQaDAYLIARB//0DRg0CIARBgAFPIAVxDQMgA0HUAGogBBDdDwwFCyADQdQAakG42NgAQQYQ1h0MBAsgA0HUAGpBvtjYAEEGENYdDAMLIANB1ABqQcTY2ABBBhDWHQwCCyADQe4AakEAOgAAIANB9ABqIgcgBEEPcUGklOMAai0AADoAACADQQA7AWwgAyAEQRR2QaSU4wBqLQAAOgBvIAMgBEEEdkEPcUGklOMAai0AADoAcyADIARBCHZBD3FBpJTjAGotAAA6AHIgAyAEQQx2QQ9xQaSU4wBqLQAAOgBxIAMgBEEQdkEPcUGklOMAai0AADoAcCAEQQFyZ0ECdiIKIANB7ABqIgZqIgRB+wA6AAAgBEEBa0H1ADoAACAGIApBAmsiBGpB3AA6AAAgA0H9ADoAdSADQYABaiAHLwEAOwEAIAMgAykBbDcDeCADQdQAakEMIAprENgeIANBCjoAgwEgAyAEOgCCASAEQf8BcSEEA0AgBEEKRg0CQfUAIANB+ABqIARqLQAAIgZB3wBxIAYgBkHhAGtBGkkbIAZB9QBGGyEGIAMoAlwiByADKAJURgRAIANB1ABqEOQWCyADKAJYIAdqIAY6AAAgAyAHQQFqNgJcIARBAWohBAwACwALIANB1ABqIAQQ3Q8MAAsACwALIANB+ABqIAIgASgCCCABKAIMIAMoAjAiBCADKAI0EIoPIAMtAHhBBEYNASADKQN4IhdC/wGDQgRRDQEgACAXNwIACyADKAIsIAQQuCkMAQsgAygCLCAEELgpIABBBDoAAAsgA0HwBmokAAusIQIGfwJ+IwBBwAFrIgIkAAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgBBAWsOEg8PAQIDDw8EBQYHCAkKCwwNDgALIAEgAEEEahDUBAwOCyAAQQRqIAEQwisgAEEIaiABENorDA0LIABBDGogARCgJQwMCyAAQShqIAEQ2isMCwsgAEEEaiABEMIrIABBCGogARDaKyAAKAIURQ0KIABBFGogARDaKwwKCyAAQRBqIAEQwisgACgCDEEYbCEDIAAoAgghAANAIANFDQogAEEUaiABEKAlIAAgARCBGiADQRhrIQMgAEEYaiEADAALAAsgAEEEaiABEMIrDAgLIAEgACgCBCIEQcgAahDUBAJAIAQoAgBBCEYNACACQZQBakHYluMAKQMANwIAIAJBADoAvwEgAkEAOwC9ASACQQA2ArQBIAJCgICAgIABNwKsASACQQE6AKgBIAJBADYCpAEgAkKAgICAwAA3ApwBIAJBADYCiAEgAkKAgICAgAE3AoABIAJB0JbjACkDADcCjAEgAiABLQA8OgC8ASACIAEoAjg2ArgBIAEtAD0hACAEQShqIAJBgAFqIgMQgRogAkEBOgC/ASACQQE6AL0BIAQoAgBBB0cEQCAEIAMQkxELIAJBrAFqIQUgAkEAOgC/ASACIAA6AL0BAkAgAigCtAEiAARAIAFBDGogABDiKCACQdAAaiACKAKwASACKAK0ARCZCiACIAIoAlA2AgggAiACKAJUIgA2AgAgAiAAIAIoAlhBBHQiA2oiBjYCDANAIANFDQIgAkGAAWogACkDACAAKAIIELQQIANBEGshAyAAQRBqIQAMAAsACyABQRxqIAIgAkGAAWpBLBD2BhCCGiAFEPMiDAELIAIgBjYCBCACEP0WIAEtAChFBEAgASACKAK0ARD4HSACIAIoAqwBNgIIIAIgAigCsAEiADYCACACIAAgAigCtAFBBHQiA2oiBTYCDANAIAMEQCABIAApAwAgACgCCEEBEIcGIANBEGshAyAAQRBqIQAMAQsLIAIgBTYCBCACEP0WIAFBHGogAiACQYABakEsEPYGEIIaDAELIAJBCGogBUEIaigCADYCACACIAUpAgA3AwAgAUEsaiACEI8QIAFBHGogAiACQYABakEsEPYGEIIaCyAEQeAAaiABEMojDAcLIABBBGogARDCKyAAQQhqIAEQ2isMBgsgAEEEaiABEMIrIABBCGogARDaKwwFCyACQRRqQdiW4wApAwAiCDcCACACQQA7AT4gAkEANgI0IAJCgICAgIABNwIsIAJBAToAKCACQQA2AiQgAkKAgICAwAA3AhwgAkEANgIIIAJCgICAgIABNwIAIAJB0JbjACkDACIJNwIMIAIgAS8BPDsBPCACIAEoAjg2AjgCQCAAKAIEIgRBAkYNACAAQQhqIQMgBEEBcUUEQCADIAIQ2ysMAQsgAyACEMIrCyACQSxqIQQgAkEcaiEFIABBGGogAhCgJSAAQRxqIAIQoCUgAkGUAWogCDcCACACIAk3AowBIAJBADsBvgEgAiACLwE8OwG8ASACIAIoAjg2ArgBIAJBADYCtAEgAkKAgICAgAE3AqwBIAJBAToAqAEgAkEANgKkASACQoCAgIDAADcCnAEgAkEANgKIASACQoCAgICAATcCgAEgAkGAAWogACgCDBC0ICACQawBaiEGAkACQCACKAK0ASIABEAgAkEMaiAAEOIoIAJBxABqIAIoArABIAIoArQBEJkKIAIgAigCRDYCWCACIAIoAkgiADYCUCACIAAgAigCTEEEdCIDaiIHNgJcA0AgA0UNAiACQYABaiAAKQMAIAAoAggQtBAgA0EQayEDIABBEGohAAwACwALIAJB0ABqIgAgAkGAAWpBLBD2BhogBSAAEIIaIAYQ8yIMAQsgAiAHNgJUIAJB0ABqEP0WIAItAChFBEAgAiACKAK0ARD4HSACIAIoAqwBNgJYIAIgAigCsAEiADYCUCACIAAgAigCtAFBBHQiA2oiBjYCXANAIAMEQCACIAApAwAgACgCCEEBEIcGIANBEGshAyAAQRBqIQAMAQsLIAIgBjYCVCACQdAAaiIAEP0WIAAgAkGAAWpBLBD2BhogBSAAEIIaDAELIAJB2ABqIAZBCGooAgA2AgAgAiAGKQIANwNQIAQgAkHQAGoiABCPECAAIAJBgAFqQSwQ9gYaIAUgABCCGgsCQCACKAI0IgAEQCABQQxqIAAQ4iggAkHQAGogAigCMCACKAI0EJkKIAIgAigCUDYCiAEgAiACKAJUIgA2AoABIAIgACACKAJYQQR0IgNqIgU2AowBA0AgA0UNAiACIAApAwAgACgCCBC0ECADQRBrIQMgAEEQaiEADAALAAsgAkGAAWoiACACQSwQ9gYaIAFBHGogABCCGiAEEPMiDAULIAIgBTYChAEgAkGAAWoQ/RYgAS0AKEUEQCABIAIoAjQQ+B0gAiACKAIsNgKIASACIAIoAjAiADYCgAEgAiAAIAIoAjRBBHQiA2oiBDYCjAEDQCADBEAgASAAKQMAIAAoAghBARCHBiADQRBrIQMgAEEQaiEADAELCyACIAQ2AoQBIAJBgAFqIgAQ/RYgACACQSwQ9gYaIAFBHGogABCCGgwFCyACQYgBaiAEQQhqKAIANgIAIAIgBCkCADcDgAEgAUEsaiACQYABaiIAEI8QIAAgAkEsEPYGGiABQRxqIAAQghoMBAsgAkEUakHYluMAKQMAIgg3AgAgAkEAOwE+IAJBADYCNCACQoCAgICAATcCLCACQQE6ACggAkEANgIkIAJCgICAgMAANwIcIAJBADYCCCACQoCAgICAATcCACACQdCW4wApAwAiCTcCDCACIAEvATw7ATwgAiABKAI4NgI4IABBBGogAhCWHCAAQQxqIAIQwisgAkGUAWogCDcCACACIAk3AowBIAJBADsBvgEgAiACLwE8OwG8ASACIAIoAjg2ArgBIAJBADYCtAEgAkKAgICAgAE3AqwBIAJBAToAqAEgAkEANgKkASACQoCAgIDAADcCnAEgAkEANgKIASACQoCAgICAATcCgAEgAkGAAWogACgCEBC0ICACQawBaiEFIAJBLGohBCACQRxqIQYCQAJAIAIoArQBIgAEQCACQQxqIAAQ4iggAkHEAGogAigCsAEgAigCtAEQmQogAiACKAJENgJYIAIgAigCSCIANgJQIAIgACACKAJMQQR0IgNqIgc2AlwDQCADRQ0CIAJBgAFqIAApAwAgACgCCBC0ECADQRBrIQMgAEEQaiEADAALAAsgAkHQAGoiACACQYABakEsEPYGGiAGIAAQghogBRDzIgwBCyACIAc2AlQgAkHQAGoQ/RYgAi0AKEUEQCACIAIoArQBEPgdIAIgAigCrAE2AlggAiACKAKwASIANgJQIAIgACACKAK0AUEEdCIDaiIFNgJcA0AgAwRAIAIgACkDACAAKAIIQQEQhwYgA0EQayEDIABBEGohAAwBCwsgAiAFNgJUIAJB0ABqIgAQ/RYgACACQYABakEsEPYGGiAGIAAQghoMAQsgAkHYAGogBUEIaigCADYCACACIAUpAgA3A1AgBCACQdAAaiIAEI8QIAAgAkGAAWpBLBD2BhogBiAAEIIaCwJAIAIoAjQiAARAIAFBDGogABDiKCACQdAAaiACKAIwIAIoAjQQmQogAiACKAJQNgKIASACIAIoAlQiADYCgAEgAiAAIAIoAlhBBHQiA2oiBTYCjAEDQCADRQ0CIAIgACkDACAAKAIIELQQIANBEGshAyAAQRBqIQAMAAsACyACQYABaiIAIAJBLBD2BhogAUEcaiAAEIIaIAQQ8yIMBAsgAiAFNgKEASACQYABahD9FiABLQAoRQRAIAEgAigCNBD4HSACIAIoAiw2AogBIAIgAigCMCIANgKAASACIAAgAigCNEEEdCIDaiIENgKMAQNAIAMEQCABIAApAwAgACgCCEEBEIcGIANBEGshAyAAQRBqIQAMAQsLIAIgBDYChAEgAkGAAWoiABD9FiAAIAJBLBD2BhogAUEcaiAAEIIaDAQLIAJBiAFqIARBCGooAgA2AgAgAiAEKQIANwOAASABQSxqIAJBgAFqIgAQjxAgACACQSwQ9gYaIAFBHGogABCCGgwDCyACQRRqQdiW4wApAwAiCDcCACACQQA7AT4gAkEANgI0IAJCgICAgIABNwIsIAJBAToAKCACQQA2AiQgAkKAgICAwAA3AhwgAkEANgIIIAJCgICAgIABNwIAIAJB0JbjACkDACIJNwIMIAIgAS8BPDsBPCACIAEoAjg2AjggAEEEaiACEJYcIABBDGogAhDCKyACQZQBaiAINwIAIAIgCTcCjAEgAkEAOwG+ASACIAIvATw7AbwBIAIgAigCODYCuAEgAkEANgK0ASACQoCAgICAATcCrAEgAkEBOgCoASACQQA2AqQBIAJCgICAgMAANwKcASACQQA2AogBIAJCgICAgIABNwKAASACQYABaiAAKAIQELQgIAJBrAFqIQUgAkEsaiEEIAJBHGohBgJAAkAgAigCtAEiAARAIAJBDGogABDiKCACQcQA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NgLcASADIANB9ABqNgKAASADQQM6AKwBIANBCDYCqAEgA0IgNwKgASADQoCAgIDAADcCmAEgA0ECNgKQASADIANBkAFqNgLgASADIANBgAFqNgLYASADQdwAaiADQdABahDtJBoMEAsgDQ0LIANB3ABqIAEQ3Q8MDwsgA0HQAWoiASADKAJgIAMoAmRBJ0Ha2tgAEM4GIANBPjYChAEgA0ECNgKUASADQdza2AA2ApABCyADQgE3ApwBIAMgATYCgAEgAyADQYABajYCmAEgA0HQAGogA0GQAWoQ6hQgAygC0AEgAygC1AEQuCkgAygCXCADKAJgELgpIAItAFBFDQggAygCVCEEIAMoAlghASADQQg2AmggAyABNgLsASADIAQ2AugBIANBADYC4AEgAyABIARqNgLcASADIAQ2AtgBIANBAjYC0AEgAyADQegAajYC5AEgA0EQaiADQdgBaiIFEOEGIAMgAygCFDYC1AEgAyADKAIQIgY2AtABIAZBAXEEQCADQQhqIAEQthQgAygCCCEHIAMoAgwiBiAEIAEQ9gYhBCADIAE2AogBIAMgBDYChAEgAyAHNgKAASADQagBaiADQegBaikCADcDACADQaABaiADQeABaikCADcDACADQZgBaiIHIAUpAgA3AwAgAyADKQLQATcDkAEgA0EANgKwAQNAIAMoApABIQQgA0ECNgKQAQJ/IARBAkcEQCADKAKUAQwBCyADIAcQ4QYgAygCACEEIAMoAgQLIQUgBEUNByADIAMoArABIghBAWoiBDYCsAECQCAEIAVqIgRFDQAgASAESwRAIAQgBmosAABBv39KDQEMCwsgASAERw0KCyADKAKAASABRgRAIANBgAFqIAFBARDPCiADKAKEASEGCyAEIAZqIgRBAWogBCAFIAhqQX9zIAFqELgtGiAEQdwAOgAAIAMgAUEBaiIBNgKIAQwACwALQYCAgIB4IQUgBAwGCyADQdABaiIBEKceGiABEIIdIQEMCQsgA0EBNgKUASADQajZ2AA2ApABIANCATcCnAEgA0HUATYC1AEgAyABOgCAASADIANB0AFqNgKYASADIANBgAFqNgLQASADQdwAaiADQZABahDtJBoMCwsgA0EBNgKUASADQczY2AA2ApABIANCATcCnAEgA0HUATYC1AEgAyABOgCAASADIANB0AFqNgKYASADIANBgAFqNgLQASADQdwAaiADQZABahDtJBoMCgsgA0HcAGogARDdDwwJCyADIAFBgIAEa0EKdkGAsANqNgJ8IAMgAUH/B3FBgLgDcjYCdCADQcsANgKMASADQcsANgKEASADQQI2AuQBIANBAjYC1AEgA0HI2tgANgLQASADIANB9ABqNgKIASADIANB/ABqNgKAASADQQM6AMwBIANBCDYCyAEgA0KggICAEDcCwAEgA0KAgICAwAA3ArgBIANBAjYCsAEgA0EDOgCsASADQQg2AqgBIANCIDcCoAEgA0KAgICAwAA3ApgBIANBAjYCkAEgAyADQZABajYC4AEgA0ECNgLcASADIANBgAFqNgLYASADQdwAaiADQdABahDtJBoMCAsgAygCgAEhBSADKAJUIQQgAygChAELIgYgAUG+seAAQQRBwrHgAEEHEMcEIANB0AFqIAMoApQBIgEgAygCmAFBybHgAEEDQcyx4ABBBhDHBCADKAJQIAQQuCkgA0HYAGogA0HYAWooAgA2AgAgAyADKQLQATcDUCADKAKQASABELgpIAUgBhCWJAwBC0H81tgAQSxBqNfYABDaFwALIANBkAFqIAJBAEEAIAMoAlQiASADKAJYEIoPAkAgAy0AkAFBBEcEQCADKQOQASIOQv8Bg0IEUg0BCyADKAJQIAEQuCkgAEEEOgAADAcLIAAgDjcCACADKAJQIAEQuCkMBgsgA0EBNgKUASADQczY2AA2ApABIANCATcCnAEgA0HUATYC1AEgAyABOgCAASADIANB0AFqNgKYASADIANBgAFqNgLQASADQdwAaiADQZABahDtJBoMAwsCQAJAAkACQCABBEAgASgCAEEgckHkAEYNAQsgCQ0BIANB3ABqQdwAEN0PDAYLIANBADYCmAEgA0KAgICAEDcCkAEgA0GQAWoiBEHcABDdDyAEQfUAEN0PIAkNAQwCCyADQdwAakHU2dgAQQIQ1h0MBAsgA0GQAWpB+wAQ3Q8LIANBkAFqIAEoAgAQ3Q8gA0HQAWoQpx4aQQMhBAJAAkACQAJAAkACQANAIARFBEAgCUUNAgwDCyADQdABahCnHiIBQYCAxABGIAFBMGtBCkkgAUHhAGtBBklyRSABQcEAa0EFS3FyRQRAIANBkAFqIAEQ3Q8gBEEBayEEDAELCyAJDQEMAgtBBiEIQQIhASADKAKYASEGIAMoApQBIQQMAgsgA0GQAWpB/QAQ3Q8gBA0AQQMhASADKAKUASEEIAMoApgBIgZBAWsiCEEDTw0BDAMLIANB3ABqQdTZ2ABBAhDWHSADKAKUASEEDAELAkAgASAGSQRAIAEgBGosAABBv39MDQMMAQsgASAGRw0CCwJAIAYgCEsEQCAEIAhqLAAAQb9/TA0DDAELIAYgCEcNAgsgAyAIIAFrIgg2AnggAyABIARqIgE2AnQgA0GAAWogASAIQRAQwgQgAy0AgAFBAUcEQCADKAKEASIBQf//A00EQCABQYDwA3FBgLADRwRAIANB3ABqQdTZ2ABBAhDWHQwDCyADQdwAakHcABDdDwwCCyADQdwAaiAEIAYQ1h1BB0EFIAkbIQEDQCABRQ0CIAFBAWshASADQegAahCnHhoMAAsACyADLQCBASEBIwBBMGsiACQAIAAgAToAByAAQQI2AgwgAEG429gANgIIIABCAjcCFCAAQbECNgIsIABBAjYCJCAAIANB9ABqNgIgIAAgAEEgajYCECAAIABBB2o2AiggAEEIakHI29gAEKEdAAsgAygCkAEgBBC4KQwDCyAEIAYgASAIQbja2AAQuCYACyADQegAahCCHSIBBEAgASgCAEEwa0EKSQ0BCyADQdwAakGw2NgAQQIQ1h0MAQsgA0HcAGpBrNjYAEEEENYdDAALAAsgACAONwIACyADQfABaiQAC489Ahp/An4jAEGwA2siAiQAIAIgARC8DCIFNgIMAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgBUHcAEYEQCACQRhqIgUgASgCACIEQdgAaigCADYCACACIAQpAlA3AxAgBEHQAGohBiABEO8IRQRAIAJBrANqIAZBCGooAgA2AgAgAkGgA2ogBSgCADYCACACIAIpAxA3A5gDIAIgBikCADcCpAMgAkEKNgKYASACQaQCaiIFIAEoAgQgASgCCCACQZgDaiACQZgBahCQDyAAIAVBwAAQ9gYaDB0LIAEQvAwiBUH4//8AcUEwRwRAAkACQAJAAkACQCAFQf7//wBxQThHBEACQAJAIAVB8ABrDgkFAwMBAwQDAQQACwJAIAVB0ABrDggFAwMBAwQDAQAL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KQMQNwNAIAQgAykCADcCTCAEQQo2AlwgBSABKAIEIAsgBEFAayAEQdwAahCQDwwDCyAEQQA2AlwgBEE8akHMpMQAIARB3ABqQdCkxAAQzxoACyAEQdQAaiADQQhqKAIANgIAIARByABqIARBGGooAgA2AgAgBCAEKQMQNwNAIAQgAykCADcCTCAEQQc2AlwgBSABKAIEIAogBEFAayAEQdwAahCQDwwBCyAEQYABaiIBIARBKGooAgA2AgAgBEGMAWogA0EIaigCADYCACAFIAg2AgQgBSAEKQMgIhw3AgggBSAGOgAhIAVBBToAICAEIAMpAgA3AoQBIAVBEGogASkDADcCACAFQRhqIARBiAFqKQMANwIAIAQgHDcDeCAFQSI2AgALIAkgCSgCAEEBajYCACAEQZABaiQACyAHQUBrJAAgAkGgAWoiASACQbACaikCADcDACACQagBaiIFIAJBuAJqKQIANwMAIAJBsAFqIgYgAkHAAmopAgA3AwAgAiACKQKoAjcDmAEgAigCpAIiBEEiRg0HIAAgAikCyAI3AiQgAEE8aiACQeACaigCADYCACAAQTRqIAJB2AJqKQIANwIAIABBLGogAkHQAmopAgA3AgAgAEEcaiAGKQMANwIAIABBFGogBSkDADcCACAAQQxqIAEpAwA3AgAgACACKQOYATcCBAwICyACQaQCaiEIQQAhBSMAQYACayIDJAACQAJ/AkACQAJAIAEQvAxB8ABHBEAgARC8DEHQAEcNAQsgA0HYAGogASgCACILQUBrQeSmxAAQnh0gAygCXCERIAMoAlgiBkEANgIIIAEQvAwhEyABEJUeRQRAIANBlAFqIAtB2ABqKAIAIgU2AgAgA0GIAWogBTYCACADIAspAlAiHDcCjAEgAyAcNwOAASADQQo2AsABIAggASgCBCABKAIIIANBgAFqIANBwAFqEJAPDAULIAEQvAxB+wBGBEAgA0HAAWogARDgCiADQegAaiADQdQBaigCADYCACADIAMpAswBNwNgA0AgARCVHkUNBCABELwMQf0ARg0EIAYgARC8DBCWDQwACwALIANB+ABqIAtB2ABqKAIANgIAIAMgCykCUDcDcCABELwMIgdB3ABGDQEgARCVHhpBgICAgHghASADQfAAagwDC0Hkp8QAQTpBoKjEABDaFwALIANBgAFqIgUgARDgCiADQR82AsABIAggASgCBCABKAIIIAUgA0HAAWoQkA8MAgsCQAJAIAsoAlAiBSABKAIIRwRAIAMgARC8DCIFNgJsIAVB/QBHBEAgA0EANgLAASADQewAakHMpMQAIANBwAFqQdSnxAAQzxoACyABEO8IGiADQcABaiAGKAIEIgkgBigCCCIKQbCo4ABBAhDbAQJAIAMoAsABRQRAIAMtAM4BDQMgAygC9AEhBSADKALwASEGIAMtAMwBIQEgAygCxAEhBwNAIAMgAUF/c0EBcToAzAEgA0HQAGogByAGIAUQiBMgAygCUCIERQ0CIAMoAlQhDCADIAQ2AoABIAMgBCAMajYChAEgA0HIAGogA0GAAWoQ9gkgAygCSEUEQCABQQFxRQ0FDAYLIAFBAXENBSADLQDMAUEBcSEBAn9BASADKAJMIgRBgAFJDQAaQQNBBCAEQYCABEkbIARBgBBPDQAaQQILIAdqIQcMAAsACyADKAL8ASINIAMoAtgBIhRrIQUgDUEBayEVIAMoAtABIQYgAykDyAEhHCADKALcASEHIAMoAvgBIRIgAygC9AEhDCADKALwASEPIAMoAuQBIhYhAQNAIAYgBiABIAEgBkkbIBZBf0YiEBsiBCANIAQgDUsbIRdBACABIBAbIRgDQCAHIBVqIgEgDE8NBAJ/IBwgASAPajEAAIhCAYNQRQRAIAcgD2ohDiAEIQECQAJAAkADQCABIBdGBEAgBiEBA0AgASAYTQ0NIAFBAWsiASANTw0DIAEgB2oiDiAMTw0EIAEgEmotAAAgDiAPai0AAEYNAAsgByAUaiEHIBANByAFIQEMCAsgASAHaiIZIAxPDQMgASAOaiEaIAEgEmogAUEBaiEBLQAAIBotAABGDQALIBkgBmtBAWoMBAsgASANQbTh4AAQmxAACyAOIAxBxOHgABCbEAALIAwgBCAHaiIAIAAgDEkbIAxB1OHgABCbEAALIAcgDWoLIQcgEA0AC0EAIQEMAAsACyAGIAUgByAFQaDi4AAQuCYACyADQZQBaiALQdAAaiIGQQhqKAIAIgQ2AgAgA0GIAWogBDYCACADIAYpAgAiHDcCjAEgAyAcNwOAASADQQo2AsABIAggASgCBCAFIANBgAFqIANBwAFqEJAPDAMLIANBQGsgCSAKQToQ6AZBASEFIAMoAkBBAUYEQCADQSBqIAkgCiADKAJEIgFBlKfEABCUFSADQYABaiADKAIgIAMoAiQQohEgA0EYaiAJIAogAUEBakGkp8QAELAUIANBwAFqIAMoAhggAygCHBCiESADNQKIASADNQLAAUIghoQhHCADKQLEASEdIAMoAoQBIQcgAygCgAEhASADQeAAagwCCyADQThqIAkgCkE9EOgGIAMoAjhBAUYEQCADQTBqIAkgCiADKAI8IgFBtKfEABCUFSADQYABaiADKAIwIAMoAjQQohEgA0EoaiAJIAogAUEBakHEp8QAELAUIANBwAFqIAMoAiggAygCLBCiESADNQKIASADNQLAAUIghoQhHCADKQLEASEdIAMoAoQBIQcgAygCgAEhAUEAIQUgA0HgAGoMAgsgA0HAAWogCSAKEKIRIAMpAsQBIRwgAygCwAEhB0EAIQVBgYCAgHghASADQeAAagwBCyADQRBqIAkgCiAHQfSmxAAQlBUgA0GAAWogAygCECADKAIUEKIRQQIhBSADQQhqIAkgCiAHQQJqQYSnxAAQsBQgA0HAAWogAygCCCADKAIMEKIRIAM1AogBIAM1AsABQiCGhCEcIAMpAsQBIR0gAygChAEhByADKAKAASEBIANB4ABqCyEGIANBoAFqIgQgBkEIaigCACIJNgIAIANBrAFqIAtB2ABqKAIANgIAIAggBToAHCAIIB03AhQgCCAcNwIMIAggBzYCCCAIIAE2AgQgCCAGKQIAIhw3AiAgA0G4AWogCTYCACADIAspAlA3AqQBIAhBKGogBCkDADcCACAIQTBqIANBqAFqKQMANwIAIAMgHDcDsAEgAyAcNwOYASAIQSI2AgAgCCATQdAARjoAOAsgESARKAIAQQFqNgIAIANBgAJqJAAgAigCpAIhASACQZgBaiIFIAJBqAJqQTgQ9gYaIAFBIkYNBCACKALgAiEGIABBBGogBUE4EPYGGiAAIAY2AjwMBQsgAkGYA2ogARDgCiACQZwCaiACQawDaigCADYCACACQZACaiACQRhqKAIANgIAIAIgAikCpAM3ApQCIAIgAikDEDcDiAIgAkEgNgKYASACQaQCaiIFIAEoAgQgASgCCCACQYgCaiACQZgBahCQDyAAIAVBwAAQ9gYaDB4LQQEgA3RB65uAgAFxRQ0GDAcLIAQtAGVFBEAgAkGYA2ogARDgCiACQZwCaiACQawDaigCADYCACACQZACaiACQRhqKAIANgIAIAIgAikCpAM3ApQCIAIgAikDEDcDiAIgAkEgNgKYASACQaQCaiIFIAEoAgQgASgCCCACQYgCaiACQZgBahCQDyAAIAVBwAAQ9gYaDB0LIAJBIGohBiMAQSBrIgUkAAJAAkAgASgCACIELQBlBEAgARC8DEEwSQ0BIAEQvAxBOE8NASAEKQJUIRwgBCgCUCEDA0AgARDvCEUNAyABELwMQTBJDQMgARC8DEE3Sw0DIAQoAlAgA2tBA0kNAAsMAgtB8KHEAEElQZiixAAQ2hcAC0GoosQAQTpB5KLEABDaFwALIAQpAlQhHSAFQQhqIAEoAgQgASgCCCADIAQoAlAiAUH0osQAEPQNIAVBFGogBSgCCCAFKAIMQQgQwgQCQAJAIAUtABRBAUcEQCAFKAIYIgRBgLADc0GAgMQAa0H/j7x/TQ0BIAZBAzoAHCAGIB03AhQgBiABNgIQIAYgHDcCCCAGIAM2AgQgBiAENgIAIAVBIGokAAwCCyAFIAUtABU6AB9BhKPEAEESIAVBH2pBmJjEAEGYo8QAEMAOAAtBqKPEAEEUQbyjxAAQoRIACyACQSxqIAJBGGooAgA2AgAgAEKigICAoICAgIB/NwIAIABBGGogAkEwaikCADcCACAAQSBqIAJBOGopAgA3AgAgAiACKQMQNwIkIAAgAikCIDcCCCAAQRBqIAJBKGopAgA3AgAMHAsgAkEANgKkAiACQQxqQaihxAAgAkGkAmpBrKHEABDPGgALIAJB4ABqIgUgAkGYAWpBOBD2BhogAkGEAWogAkEYaigCADYCACACIAIpAxA3AnwgAEEEaiAFQTgQ9gYaCyAAIAE2AgAMGQsgAkHIAGoiAyABKQMANwMAIAJB0ABqIAUpAwAiHDcDACACQdgAaiAGKQMAIh03AwAgAkHMAGogAkEYaigCADYCACACIAIpA5gBNwNAIABBgoCAgHg2AgQgAEEYaiAcNwIAIABBIGogHTcCACACIAIpAxA3AkQgACACKQNANwIIIABBEGogAykDADcCAAsgACAENgIADBcLIAVB2wBrQQRJIAVB+wBrQQRJcg0AIAVBMGtBCkkgBUH/AEtyIAVBwQBrQRpJIAVB4QBrQRpJcnJFIAVB/QBxQTxHcQ0CIAVBPGsOBw8EEAQECw4BCyAAIAIpA/ABNwIMIABBAToAJCAAIAU2AgggAEKigICAoICAgIB/NwIAIABBHGogAkGAAmopAwA3AgAgAEEUaiACQfgBaikDADcCAAwVCwJAIAVB8gBrDgkIAwYDCQMDAwsACyAFQeEAaw4GAwsCAgIEAQsgACACKQPwATcCDCAAQQI6ACQgACAFNgIIIABCooCAgKCAgICAfzcCACAAQRxqIAJBgAJqKQMANwIAIABBFGogAkH4AWopAwA3AgAMEwsgBUHuAEYNBAsgAkELNgKYASACQaQCaiIFIAEoAgQgASgCCCACQfABaiACQZgBahCQDyAAIAVBwAAQ9gYaDBELIAAgAikD8AE3AgwgAEEGOwEkIABBBzYCCCAAQqKAgICggICAgH83AgAgAEEcaiACQYACaikDADcCACAAQRRqIAJB+AFqKQMANwIADBALIAAgAikD8AE3AgwgAEGGAjsBJCAAQQw2AgggAEKigICAoICAgIB/NwIAIABBHGogAkGAAmopAwA3AgAgAEEUaiACQfgBaikDADcCAAwPCyAAIAIpA/ABNwIMIABBhgQ7ASQgAEEJNgIIIABCooCAgKCAgICAfzcCACAAQRxqIAJBgAJqKQMANwIAIABBFGogAkH4AWopAwA3AgAMDgsgACACKQPwATcCDCAAQYYGOwEkIABBCjYCCCAAQqKAgICggICAgH83AgAgAEEcaiACQYACaikDADcCACAAQRRqIAJB+AFqKQMANwIADA0LIAAgAikD8AE3AgwgAEGGCDsBJCAAQQ02AgggAEKigICAoICAgIB/NwIAIABBHGogAkGAAmopAwA3AgAgAEEUaiACQfgBaikDADcCAAwMCyAAIAIpA/ABNwIMIABBhgo7ASQgAEELNgIIIABCooCAgKCAgICAfzcCACAAQRxqIAJBgAJqKQMANwIAIABBFGogAkH4AWopAwA3AgAMCwsgACACKQPwATcCCCAAQQI6ACAgAEKigICAsICAgIB/NwIAIABBGGogAkGAAmopAwA3AgAgAEEQaiACQfgBaikDADcCAAwKCyAAIAIpA/ABNwIIIABBAzoAICAAQqKAgICwgICAgH83AgAgAEEYaiACQYACaikDADcCACAAQRBqIAJB+AFqKQMANwIADAkLIAJBmAJqIgogAkGAAmopAwA3AwAgAkGQAmoiCyACQfgBaikDADcDACACIAIpA/ABNwOIAkEEIQUgASgCCCIDIAYoAgBGDQcgARC8DEH7AEcNByACIAEQvAwiBzYC5AIgB0H7AEcNBCACQfACaiAGQQhqIgcoAgA2AgAgAiAGKQIANwPoAiABEJUeDQMgAkGsA2ogBygCADYCACACQaADaiACQRhqKAIANgIAIAIgAikDEDcDmAMgAiAGKQIANwKkAyACQR42ApgBIAJBpAJqIAEoAgQgAyACQZgDaiACQZgBahCQDwwGCyAAIAIpA/ABNwIIIABBBToAICAAQqKAgICwgICAgH83AgAgAEEYaiACQYACaikDADcCACAAQRBqIAJB+AFqKQMANwIADAcLIAAgAikD8AE3AgggAEEIOgAgIABCooCAgLCAgICAfzcCACAAQRhqIAJBgAJqKQMANwIAIABBEGogAkH4AWopAwA3AgAMBgsgACACKQPwATcCCCAAQQk6ACAgAEKigICAsICAgIB/NwIAIABBGGogAkGAAmopAwA3AgAgAEEQaiACQfgBaikDADcCAAwFCyACQYADaiAHKAIANgIAIAIgBikCADcD+AIgARC8DCIHQS1GIAdB3///AHFBwQBrQRpJckUEQCAGIAIpA+gCNwIAIAZBCGogAkHwAmooAgA2AgAMBAsgAiAEQUBrQbyhxAAQnh0gAigCBCEEIAIoAgAiB0EANgIIA0ACQAJAAkACQCAGKAIAIANGDQAgARC8DCIIQS1GIAhB3///AHFBwQBrQRpJcg0DIAYoAgAgA0YNACABELwMQf0ARg0BCyACQawDaiAGQQhqKAIANgIAIAJBoANqIAJB8AJqKAIANgIAIAIgAikD6AI3A5gDIAIgBikCADcCpAMgAkEcNgKYAQwBCyACQZADaiAGQQhqKAIANgIAIAIgBikCADcDiAMgARDvCBogBygCBCIIIAcoAggiCUH5rMQAQQUQzR8EQEEGIQcMBQsgCCAJQf6sxABBAxDNHwRAQQchBwwFC0EKIQcgCCAJQcyhxABBChDNHw0EIAggCUHWocQAQQgQzR8EQEELIQcMBQsgAkGgA2ogAkGAA2ooAgA2AgAgAkGsA2ogAkGQA2ooAgA2AgAgAiACKQP4AjcDmAMgAiACKQOIAzcCpAMgAkEdNgKYAQsgAkGkAmog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ASkDAFAEQCAHIAFBCGoQvwsgAkIANwOwAQwBCyABKQMYIS8gAkGwAWogARDlHSACIC83A8gBCyAIIAIpA7ABNwMAIAggFDYCJCAIIBE2AiAgCCACKQNgNwMoIAggCjoAQSAIIA06AEAgCEEYaiACQcgBaikDADcDACAIQRBqIAJBwAFqKQMANwMAIAhBCGogBykDADcDACAIQTBqIBIpAwA3AwAgCEE4aiACQfAAaikDADcDAAwFCyADKAIMIQYgAygCCCEPIANBBGoQ2BwhCAwECyADKQIIIS8gByADQRBqELUbIAIgAi8BygE7ARggL0IgiKchBiACKAK4ASEFIAIoArwBIQkgAigCwAEhBCACKALEASEMIAItAMgBIQsgAi0AyQEhECAvpyEPIDAhLyACKALMAQwECyACQbABaiADQQhqEG8gAiACLwHKATsBYCACLQDIASERIAIoAsQBIR0gAigCwAEhHiACKAK8ASEfIAIoArgBISAgAikDsAEhMSACKALMASEBIAIpA9ABIS8gAigC2AEhDSACKALcASEKIAItAMkBDAcLIAAgGTYCCCAAIBo2AgQgACAiNgIAIAJBgAJqJAAPCwALIDAhLyAcCyEBICshCiAsIQ0MAgsgAiABOgDMASACIAIvAcIBOwFgIAIoArABIQUgAigCtAEhCSACKAK8ASEMIAItAMABIQsgAi0AwQEhECACKALEASEtIAIpA8gBITIgLiEGIAIoArgBCyEEIAIgAi8BYDsBGCAQISQgMiEvIC0hASAGIS4gBSElIAkhJiAEISkgDCEnIAshKAsgAiACLwEYOwFgIA+tIAatQiCGhCExIC8hMCABIRwgBSEgIAkhHyAEIR4gDCEdIAshESAKISsgDSEsIBALIRQgF0EBayEXIANBOGohAyACIAIvAWA7AbABIBogGEE4bGoiDiAUOgAhIA4gEToAICAOIB02AhwgDiAeNgIYIA4gHzYCFCAOICA2AhAgDiAxNwIIIA4gCDYCBCAOIBs2AgAgDiAKNgI0IA4gDTYCMCAOIC83AiggDiABNgIkIA4gAi8BsAE7ACIgGEEBaiEYDAALAAvMGQIOfwJ+IwBBsAJrIgIkAAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABKAIAQQFrDhIBAgMEBQYHCAkKCwwNDg8QERIACyACQSBqIAFBBGoQvB8gAEEANgIAIABBFGogAkEwaikCADcCACAAQQxqIAJBKGopAgA3AgAgACACKQIgNwIEDBILIABBATYCACAAIAEpAgQ3AgQMEQsgAEECNgIAIAAgASkCBDcCBAwQCyABKQIMIRAgAUEEahDYHCEDIAFBCGoQphkhASAAIBA3AgwgACABNgIIIAAgAzYCBCAAQQM2AgAMDwsgASkCBCEQIAAgAUEMahDeJDYCDCAAIBA3AgQgAEEENgIADA4LIAEpAwghECACQSBqIAFBEGoQtRsgAUEoahCmGSEBIAAgEDcDCCAAIAE2AiggAEEFNgIAIAAgAikDIDcDECAAQRhqIAJBKGopAwA3AwAgAEEgaiACQTBqKQMANwMADA0LIAEpAwghECACQShqIgMgAUEQahChICAAIBA3AwggAEEGNgIAIABBEGogAykDADcDACAAQRhqIAJBMGopAwA3AwAgAEEgaiACQThqKQMANwMADAwLIAEpAwghECACQShqIgMgAUEQahChICAAIBA3AwggAEEHNgIAIABBEGogAykDADcDACAAQRhqIAJBMGopAwA3AwAgAEEgaiACQThqKQMANwMADAsLIAEoAhAhAyABKAIMIQQgAUEEahDYHCEGIAFBCGoQphkhBSAAIAEoAhQEfyABQRRqEKYZBUEACzYCFCAAIAM2AhAgACAENgIMIAAgBTYCCCAAIAY2AgQgAEEINgIADAoLIAEoAhghByABKAIUIQkgAUEQahDYHCEKIAEoAgghCyACQQhqIAEoAgwiBEEEQRgQ5xQgAigCCCIGIARB/////wFxIgEgASAGSxshA0EAIQEgAigCDCEFA0AgAwRAIAEgC2oiCEEMaikCACEQIAhBFGoQ3iQhDCACQSBqIAgQiwwgAiAQNwIsIAIgDDYCNCACQShqKQIAIRAgAikCICERIAEgBWoiCEEQaiACQTBqKQIANwIAIAhBCGogEDcCACAIIBE3AgAgA0EBayEDIAFBGGohAQwBCwsgACAHNgIYIAAgCTYCFCAAIAo2AhAgACAENgIMIAAgBTYCCCAAIAY2AgQgAEEJNgIADAkLIAEpAwghECABQQRqENgcIQEgACAQNwMIIAAgATYCBCAAQQo2AgAMCAtBCCEDQQhBgAEQlSgiBEUNCCAB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0gIgAigC8AghAyACLQCECSIIQQNGDQEgAkH0AmogAkH8CGoiCikCADcCACACQf8CaiACQYcJai0AADoAACACIAIpAvQINwLsAiACIAIvAIUJOwD9AiACIAg6APwCIAIgAzYC6AJBACEDAkAgBxDrIA0AIAcQyA0iCEUNACAIKAIAQRRHDQAgCC0ABEEERw0AIAJBADoAvQUgAiABLQC2AjoAvAUgAiABLQDGAjoAzAUgAiABKQGqAjcAsAUgAiABKQO4AjcAvgUgAiABKALAAjYAxgUgAiABLwHEAjsAygUgAiABQbICaiIDKAEANgC4BSACQYkJaiABQb8CaikAADcAACACQYQJaiABQboCaikBADcCACAKIAMpAQA3AgAgAiABKQGqAjcC9AggByACQbAFahDICCACIAE2AvAIIAJBGGogARDuASACKAIcIQMgAigCGCAEEO8kRQ0AIAJB6AJqELYbDAILQQFxBEAgASgCnAMhBCACQagBOgDwCCABIAUgBCAEIAVLGyAFIAQgBCAFSRsgAkHwCGoQqRkLIAJB0AJqIgkgAkHwAmopAwA3AwAgAkHYAmoiCiACQfgCaigCADYCACACQcYCaiILIAJB/QJqIgRBAmotAAA6AAAgAiACKQPoAjcDyAIgAiAELwAAOwHEAiAFIAEoApwDIgggBSAISRshBEEDIQcgAi0A/AIiDUEDRgRAIAQhAwwCCyACQYgJaiAJKQMANwMAIAJBkAlqIAooAgA2AgAgAkGXCWogCy0AADoAACACIAUgCCAFIAhLGzYC/AggAiAENgL4CCACIAIpA8gCNwOACSACIA06AJQJIAIgAi8BxAI7AJUJIAIgAzYCmAkMAgsgAigC9AghAwsgAiADNgL0CEEUIQcLIAIgBzYC8AggAkEQaiACQfAIahD8FyACKAIUIQMgAigCECEFDAwLIAEoAsgCIQMgAUElNgLIAiABIAEpA+ACNwOYAyACQfwIaiABQdQCaikCADcCACACQYQJaiABQdwCaigCADYCACACIAEpAswCNwL0CCACIAM2AvAIIAJB8AhqEL4KIAEoApwDIQhB2ABBCBCMICIDIAU6AAxBACEFIANBADYCACADIAQgCCAEIAhLGzYCCCADIAQgCCAEIAhJGzYCBAwLCyAHEKUgIQogAgJ/AkACQAJAAkACQAJAAkAC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NwAAIAJB5ABqIANBEGopAQA3AgAgAkHcAGogA0EIaikBADcCACACIAMpAQA3AlQgCyACQeABahDACCACIAE2AlAgAkHAAmoiByABEKIqIAJBGGogBxDdGiACKAIcIQogAigCGCACQdAAahCKJkUEQCACIAo2AkwgAS0AnANBAXENCiACQQA2AoQBIAJBxAJqIQkgB0EEciEMIAJBjAFqIQ8gAkGMAmohECABLQCeAyERIAEtAJ0DIRIgAS0AmwMhEyABLQCaAyEUIAEtAJkDIRUgAS0AmAMhFiABLQCXAyEXIAEtAJYDIRggAS0AlQMhGSABLQCUAyEaIAEtAJMDIRsgAS0AkgMhHCABLQCRAyEdIAEtAJADIR4gAS0AjwMhHyABLQCOAyEgIAEtAI0DISEgAS0AjAMhIiABLQCLAyEjIAEtAIoDISQgAS0AiQMhJSABLQCIAyEmIAEtAIcDIScgAS0AhgMhKCABLQCFAyEpIAEtAIQDISogAS0AgwMhKyABLQCCAyEsA0BBASENQRMhBSAEEOMNIgdFDQogBygCAEECRw0KIActAAhBAkcNCiAHLQAJQQhHDQogDCAGKQIANwIAIAEoAighCCABQSU2AiggASABKQNANwN4IAxBCGogBkEIaikCADcCACAMQRBqIAZBEGooAgA2AgAgAiAINgLAAiACQcACahC/CgJAAkAgBBDjDSIIRQ0AIAgoAgBBAkcNACAILQAIQQJHDQAgCC0ACUEMRg0BC0EAIQ0gAkEAOgDdASACIAEpAYIDNwDDASACIAEpAYoDNwDLASACIAEpAZIDNwDTASACIAEvAZoDOwDbASACIAEvAJ0DOwDeASACQfkBaiADQRVqKQAANwAAIAJB9AFqIANBEGopAQA3AgAgAkHsAWogA0EIaikBADcCACACIAMpAQA3AuQBIAsgAkHDAWoQwAggAiABNgLgASACQcACaiABEKIqIAIoAsQCIQggAigCwAIiBUETRwRAIAJBmAFqIAJByAJqQSgQ9gYaIAJB4AFqEIomDAwLIABBADYCACAAIAg2AgQgAkHgAWoQiiYMCgsgAiAROgD8ASACIBI6APsBIAJBAToA+gEgAiATOgD5ASACIBQ6APgBIAIgFToA9wEgAiAWOgD2ASACIBc6APUBIAIgGDoA9AEgAiAZOgDzASACIBo6APIBIAIgGzoA8QEgAiAcOgDwASACIB06AO8BIAIgHjoA7gEgAiAfOgDtASACICA6AOwBIAIgIToA6wEgAiAiOgDqASACICM6AOkBIAIgJDoA6AEgAiAlOgDnASACICY6AOYBIAIgJzoA5QEgAiAoOgDkASACICk6AOMBIAIgKjoA4gEgAiArOgDhASACICw6AOABIAlBFWogA0EVaikAADcAACAJQRBqIANBEGopAQA3AQAgCUEIaiADQQhqKQEANwEAIAkgAykBADcBACALIAJB4AFqEMAIIAIgATYCwAIgAkGEAmogARCBASACKAKIAiEHIAIoAoQCIghFDQYgAkGgAmoiDSAQQQhqKAIANgIAIAIgECkCADcDmAIgAkHAAmoQiiYgAigChAEEQEEwQQgQjCAiBSAHNgIIIAUgCDYCBCAFQQg2AgAgBSACKQOYAjcCDCAFQRRqIA0oAgA2AgAgASgCfCACQYQBaiAFEMgSBSACQYQBahD4JyAPIAIpA5gCNwIAIA9BCGogDSgCADYCACACIAc2AogBIAIgCDYChAELDAALAAsgAEEANgIAIAAgCjYCBAwLCyABIAEpA0A3A3ggASgCKCABQSU2AihBJEcNBCABIAEoAiwQggwMCQsgASABKQNANwN4IAEoAiggAUElNgIoQSRHDQQgASABKAIsEIIMDAoLQbnj4ABBKEG4luAAENoXAAsgAygCBCEBIAMoAgBBBEEEEIwgIgYgAzYCACACIAY2AuwBIAJBMDYC9AEgAkHoluAANgLwASACIAU2AugBIAIgCTYC5AEgAkG4AToA4AEgASACQeABahDrFCEBIABBADYCACAAIAE2AgQgAkHQAGoQiiYgAkHAAmoQiiYMCQsgAEEANgIAIAAgBzYCBCACQcACahCKJgwCC0G54+AAQShByJbgABDaFwALQbnj4ABBKEHYluAAENoXAAsgAkGEAWoQ+CcgAkHMAGoQ0QYMAwsCQCACKAKEAQRAIAJBuAJqIgMgAkGUAWooAgA2AgAgAkGwAmoiBiACQYwBaikCADcDACACIAIpAoQBNwOoAiANRQRAQTBBCBCMICIEIAg2AgQgBCAFNgIAIARBCGogAkGYAWpBKBD2BhogASgCfCACQagCaiAEEMgSCyACQeQAaiADKAIANgIAIAJBCDYCUCACQdwAaiAGKQMANwIA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QQE2AiwgA0EsahD8IwsgASgCeCEEIAEoAnwhCCADQfYAOgCoASABIAggBCAIIAxGGyAEIAQgEEYbIAggA0GoAWoQvBkLIAINAiAJEOMNIgINAQwCCyADQSxqEIomIANBIGoQ2SZBASEFDAILAkACQCACKAIAQQ5rDgICAAELIAEoAighAiABQSU2AiggASABKQNANwN4IANBtAFqIAVBCGopAgA3AgAgA0G8AWogBUEQaigCADYCACADIAUpAgA3AqwBIAMgAjYCqAEgA0GoAWoQvwoMAQsgCRCbIQ0AIANBCGogCRCfFCADKAIMIQIgAygCCCEEIANB9QA6AKgBIAEgBCACIANBqAFqELwZIAMgARCMBiADIAMoAgQ2AqwBIAMgAygCACIENgKoASADQawBaiECAkAgBEUEQCACEJgpDAELIAIQgCMLIANBqAFqQQRyIQIDQCAJEOMNIgRFDQECQAJAIAQoAgBBDmsOAgMAAQsgASgCKCECIAFBJTYCKCABIAEpA0A3A3ggA0G0AWogBUEIaikCADcCACADQbwBaiAFQRBqKAIANgIAIAMgBSkCADcCrAEgAyACNgKoASADQagBahC/CgwCCyAJEJshDQEgAiAFKQIANwIAIAEoAighBCABQSU2AiggASABKQNANwN4IAJBCGogBUEIaikCADcCACACQRBqIAVBEGooAgA2AgAgAyAENgKoASADQagBahC/CiAJEOMNIgRFDQAgBCgCAEEkRw0ACwsgASgCfCEBIANBugFqQgA3AQAgA0IANwK0ASADQoCAgICAATcCqAFBACEFIANBADYCsAFBHEEEEIwgIgQgCzoAGSAEQQA6ABggBEEANgIUIAQgByABIAEgB0kbNgIQIAQgByABIAEgB0sbNgIMIARBCGogA0EoaigCADYCACAEIAMpAiA3AgAgA0GoAWoQ2SYLIAAgBDYCBCAAIAU2AgAgA0HQBGokAAuLFgErfyMAQdAEayIDJAAgAUEoaiIHEKUgIQggA0G8AWogAUHUAmopAgA3AgAgA0HEAWogAUHcAmooAgA2AgAgASgCyAIhBCABQSU2AsgCIAEgASkD4AI3A5gDIAMgASkCzAI3ArQBIAMgBDYCsAECQAJAAkACQAJAAkACQAJAIARBAkcNACADLQC4AUECRw0AIAMtALkBQRFrIgtB/wFx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aiANQQhqKQMANwMAIAJB+ARqIA1BEGopAwA3AwAgAkGABWogDUEYaikDADcDACACIA0pAwA3A+gEIAYgASgCfCIDIAMgBksbIRYgBiADIAMgBkkbIRUgAigCjAUhBSACKAKIBSEJDAELIAogCykCADcCACABKAIoIQMgAUElNgIoIAEgASkDQDcDeCAKQQhqIAtBCGopAgA3AgAgCkEQaiALQRBqKAIANgIAIAIgAzYC+AggAkH4CGoQvwogAkHwBGogDUEIaikDADcDACACQfgEaiANQRBqKQMANwMAIAJBgAVqIA1BGGopAwA3AwAgAiANKQMANwPoBCABKAJ8IRAgAigCiAUhCSACKAKMBSEFQdgAQQgQjCAiAyAGIBAgBiAQSxsiFTYCDCADIAYgECAGIBBJGyIWNgIIIAMgBDYCBCADQQg2AgAgAyEECyAJQQhGDRsgAkHgBGoiECACQYAFaikDADcDACACQdgEaiIUIAJB+ARqKQMANwMAIAJB0ARqIhcgAkHwBGopAwA3AwAgAiACKQPoBDcDyAQgAigCxAQiEyACKAK8BEYEQCACQbwEahD3FgsgAigCwAQiBiATQThsaiIDIAU2AgQgAyAJNgIAIAMgAikDyAQ3AgggAyAENgIwIAMgFTYCLCADIBY2AiggA0EQaiAXKQMANwIAIANBGGogFCkDADcCACADQSBqIBApAwA3AgAgAiATQQFqIgk2AsQEAkAgBxDjDSIDBEAgAygCAEEQRg0BCyACQfgIaiABQQIQzQggAi0A+AgNASACLQD5CA0dIAcQ4w0iAwRAIAMoAgBBEEYNAwsgAkGACWogBxDmCyACQbABaiAHEJ8UIAJB2LzgADYC/AggAkE0OgD4CCACKAKwASACKAK0ASACQfgIahDrFCEFIAcQ4w0iA0UNHCADKAIAQSRHDRwgASABKQNANwN4IAEoAiggAUElNgIoQSRHDQMgASABKAIsEIIMDBwLIAogCykCADcCACABKAIoIQMgAUElNgIoIAEgASkDQDcDeCAKQQhqIAtBCGopAgA3AgAgCkEQaiALQRBqKAIANgIAIAIgAzYC+AggAkH4CGoQvwogBCEDDAMLIAIoAvwIIQUMGgsgCiALKQIANwIAIAEoAighAyABQSU2AiggASABKQNANwN4IApBCGogC0EIaikCADcCACAK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4+AAQShBvO/fABDaFwALIAEoAsgCIQQgAUElNgLIAiABIAEpA+ACNwOYAyANQeQBaiABQdQCaikCADcCACANQewBaiABQdwCaigCADYCACANIAEpAswCNwLcASANIAQ2AtgBIA1B2AFqEL4KIA1BEGogARCyBiANKAIUIQUgDSgCEEUNAwsgDUGgAWogDUHUAWogAEENNgIAIAAgBTYCBAJAIA0oAoABQQVGBEAgDSkDiAEQ1hoMAQsgDUGAAWoQhhYLEOAmENcmDAMLIABBDTYCACAAIAs2AgQLIAUQ8CAgAxDXJgwCCwJAIAIQyA0iBEUNAAJAAkAgBCgCAEEOaw4CAgABCyABKALIAiECIAFBJTYCyAIgASABKQPgAjcDmAMgDUHkAWogAUHUAmopAgA3AgAgDUHsAWogAUHcAmooAgA2AgAgDSABKQLMAjcC3AEgDSACNgLYASANQdgBahC+CgwBCyACEOsgDQAgDUEIaiACEOoTIA0oAgwhAiANKAIIIQQgDUH1ADoA2AEgASAEIAIgDUHYAWoQqRkLIAcoAgBFBEACfwJAAkACQAJAIA0oAoABQQVGBEBBAyEEQQghCCANQYgBaiEDIA0oApQBIQogDS0AN0EDRw0BDAQLIA0oAjAiAiABKAKcAyIDIAIgA0kbIQYgAiADIAIgA0sbIQIgDS0APCEDIA0oApwBIQ4gDSgCmAEhByANKAKUASEMIA0oApABIQkgDSgCjAEhCiAFRQ0CIANBAXENAQwCCyABKAKcAyECIA0oAjAhBCANQbUBOgDYASABIAQgAiACIARLGyICIAogAiAKSRsgAiAKIAIgCksbIA1B2AFqEKkZIA0tADchBAwCCyANQaIBOgDYASABIAYgAiANQdgBahCpGSANLQA8IQMLIA1B5AFqIA1BiAFqKAIANgIAIA0gDSkDgAE3AtwBIAVBEHYhEkEHIQggDS0APiETIA0tADshFCANLQA6IRUgDS0APSEWIA0tADkhFyANLQA3IRggDS0AqwEhDyANLQCqASEQIA0tAKkBIREgDS0AqAEhBCANKQOgASEaIA0tADghGSAFQQh2DAELIA1B5AFqIANBCGooAgA2AgAgDSADKQIANwLcASANKAIwIgMgASgCnAMiASABIANLGyEJIAMgASABIANJGyEMQQAhByANLQA9IQ8gDS0A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6AFBAUYEQCACQQhqIAIoAuwBQQRBEBDnFEEAIQQgAkEANgLgASACIAIoAgwiADYC3AEgAiACKAIIIgU2AtgBIAJBuAFqIAYQkhAgAigCvAFBAUYEQCAFIAIoAsABIgVJBEAgAkHYAWpBACAFQQRBEBCtFyACKALgASEEIAIoAtwBIQALIAJB+ABqQQRyIQUgAkHoAGohBiAAIARBBHRqIQADQCACIAM2ArgBIAMEQCAAQQA2AgAgAEEMaiADNgIAIABBEGohACAEQQFqIQRBACEDDAELCyACQQA2AuQBIAJBuAFqEOwnIAJB5AFqEOwnIAJBwAFqIAZBCGopAgA3AwAgAiAGKQIANwO4ASAEIAIoAsQBIgQgAigCvAEiA2tBAnZqIQYDQCADIARGDQQgAEEMaiADKAIANgIAIABBADYCACAAQRBqIQAgA0EEaiEDDAALAAsgAkEANgLIASACQQE2ArwBIAJB7MHfADYCuAEgAkIENwLAASACQbgBakHkwt8AEKEdAAsgAkEANgLIASACQQE2ArwBIAJB7MHfADYCuAEgAkIENwLAASACQbgBakHUwt8AEKEdAAsgAiAGNgLMASACIAc2AsgBIAIgADYCxAEgAiAANgLAASACIAQ2ArwBIAJBATYCuAEgAkHgAGogAkG4AWoiABCSECACKAJkQQFGBEAgAiACKAJoQQRBBBDnFCACQQA2AuwBIAIgAikDADcC5AEgAkH4AGogABCSECACKAJ8QQFGBEAgAkHAAWohBSACQeQBaiACKAKAARDwHiACKALoASACKALsASIEQQJ0aiEAA0AgAiADNgJ4IAMEQCAAIAM2AgAgAEEEaiEAIARBAWohBEEAIQMMAQsLIAJBADYCYCACQfgAahDsJyACQeAAahDsJyACQYABaiAFQQhqKQIANwMAIAIgBSkCADcDeCAEIAIoAoQBIgQgAigCfCIDa0ECdmohBQNAIAMgBEZFBEAgACADKAIANgIAIABBBGohACADQQRqIQMMAQsLIAIgBTYC7AEgAiADNgJ8IAJB+ABqEMoXIAIpAugBIQggAigC5AEhAEEZDAMLIAJBADYCiAEgAkEBNgJ8IAJB7MHfADYCeCACQgQ3AoABIAJB+ABqQeTC3wAQoR0ACyACQQA2AogBIAJBATYCfCACQezB3wA2AnggAkIENwKAASAC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aiADQeADaigCADYCAAwBCyADQdgDahDAJCAAQYeAgIB4NgIACyADQZASaiQAC6URAQh/IwBB8ABrIgMkAAJAAkACQAJAAkACQAJAA0ACQAJAAkACQAJAIAIoAgBBAWsOBwEGAAIDCAQACyADQQE6AFQgA0EANgJQIANCgICAgBA3AkggACADQcgAahDTGQwLCyACKAIEIQQgA0EIaiACKAIIIgJBAUEBEOcUIAMoAgghBiADKAIMIAQgAhD2BiEEIANBAToAVCADIAI2AlAgAyAENgJMIAMgBjYCSCADQShqIgIgA0HIAGoQ0xkgASgCCCABLQAQIAIQ4SAgAEEIaiADQTBqKAIANgIAIAAgAykCKDcCAAwKCyADQRxqIAEgAigCDBCXASACKAIEIQYgAigCECIERQRAIAItABQCQCAGBEAgAigCCEEBRg0BCyADQRxqEK4XC0EAIQIgA0EANgJQIANCgICAgBA3AkggA0EBOgBUIANBKGogA0HIAGoQ0xlBAXENBQNAIAJBDEYNBiADQRxqIAJqIgQoAgAhBiAEIANBKGogAmoiBCgCADYCACAEIAY2AgAgAkEEaiECDAALAAsgBCABKAIEIgcgBCAHSRshBQJAIAZFDQAgBCACKAIIRw0AIANBAToAVCADQQA2AlAgA0KAgICAEDcCSCADQTxqIANByABqENMZA0ACQCAFRQ0AIANBPGoiBhDoDw0AIANBMGogA0HEAGooAgA2AgAgAyADKQI8NwMoIANByABqIgIgA0EcahDBCSAGIAEgA0EoaiACEPYBIAVBAWshBSACELkkDAELCyAEIAdNDQkgA0E8ahCuFwwJCyADQQE6AFQgA0EANgJQIANCgICAgBA3AkggA0E8aiADQcgAahDTGQNAIAVFDQggA0E8aiIEEOgPDQggA0EwaiADQcQAaigCADYCACADIAMpAjw3AyggA0HIAGoiAiADQRxqEMEJIAQgASADQShqIAIQ9gEgBUEBayEFIAIQuSQMAAsACyACKAIEIQIMAQsLIAIoAgxBHGwhBSABLQAQIQggASgCDCEKIAIoAgghB0EEIQRBACECA0AgBUUgAkGAgICAeEZyRQRAIAMgBjYCMCADIAQ2AiwgAyACNgIoIANByABqIgkgASAHEJcBIANBPGogCiAIIANBKGogCRCBBiAFQRxrIQUgB0EcaiEHIAMoAjwhAiADKAJAIQQgAygCRCEGIAkQuSQMAQsLIAAgBjYCCCAAIAQ2AgQgACACNgIADAYLIAIoAgQNAiACKAIMIgQgAigCEEEDdCIFaiEIIAEoAgAhBiAEIQICQANAIAUEQCAGIAdJDQIgBUEIayEFIAIoAgQgAigCAGsgB2pBAWohByACQQhqIQIMAQsLIAYgB0kNACADQQA2AiQgA0KAgICAwAA3AhwDQCAEIAhGBEAgASgCCCABLQAQIANBHGoQ4SAgAEEIaiADQSRqKAIANgIAIAAgAykCHDcCAAwIBSAEQQhqIAQoAgQhByAEKAIAIQJBACEFAkADQCAFQQFxIAIgB0tyDQEgA0EANgI4IANBEGogAiADQThqENkJIAMoAhQhBCADKAIQIANBADYCRCADQoCAgIAQNwI8IANBAzoAaCADQSA2AlggA0EANgJkIANBxK/EADYCYCADQQA2AlAgA0EANgJIIAMgA0E8ajYCXCAEIANByABqENcqRQRAIANBMGogA0HEAGooAgA2AgAgAyADKQI8NwMoIANBAToANCACQYDAAyACQQFqIAJB/68DRhsgAiAHTyIFGyECIANBHGogA0EoahD+DgwBCwtB3LXgAEE3IANBKGpB3K/EAEHgtuAAEMAOAAshBAwBCwALAAsgAEGAgICAeDYCAAwFCyADQdAAaiADQSRqKAIANgIAIAMgAykCHDcDSCAAIAEoAgwgAS0AECADQcgAaiADQShqIgAQgQYgABC5JAwECyACKAIMIQQgAigCCCEFIAEtABBFBEAgA0EBOgBUIANBADYCUCADQoCAgIAQNwJIIARBHGwhAiADQTxqIANByABqENMZA0ACQCACRQ0AIANBPGoiBhDoDw0AIANBMGogA0HEAGooAgA2AgAgAyADKQI8NwMoIANByABqIgQgASAFEJcBIAYgASADQShqIAQQ9gEgAkEcayECIAVBHGohBSAEELkkDAELCyAAIAMpAjw3AgAgAEEIaiADQcQAaigCADYCAAwECyADQQE6AFQgA0EANgJQIANCgICAgBA3AkggBEEcbCECIAVBHGshBCADQTxqIANByABqENMZA0ACQCACRQ0AIANBPGoiBRDoDw0AIANBMGogA0HEAGooAgA2AgAgAyADKQI8NwMoIANByABqIgYgASACIARq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IANBvARqIAZBEGooAgA2AgAgAygCcCECIANBJTYCcCADIAI2AqgEIAMgAykDiAE3A8ABIAMgBikCADcCrAQgA0GoBGoQvwpBACECAkACQCAFEOMNIgRFDQAgBCgCAEETRw0AIANBEGogA0HIAGpBqNjfABDzASADKAIUIQIgAygCEA0BCyADIAI2ApAIIAUQ4w0iBARAIAQoAgBBA0YNBQsgA0GwBGogBRDmCyADQejq3wA2AqwEIANBNDoAqAQgA0HAAWogA0GIAWogAygCcEElRiICGygCACIBIANBxAFqIANBjAFqIAIbKAIAIgIgASACSRsgASACIAEgAksbIANBqARqEOsUIQEgBRDjDSICRQ0LIAIoAgBBJEcNCyADIAMpA4gBNwPAASADKAJwIANBJTYCcEEkRw0IIANByABqIAMoAnQQggwMCwsgA0GBgICAeDYCkAQgAyACNgKUBAwMCyADIAMpA4gBNwPAASADKAJwIANBJTYCcEEkRw0HIANByABqIAMoAnQQggwMCgsgAyAENgKUBCADQYGAgIB4NgKQBAwMCyADIAMpA4gBNwPAASADKAJwIANBJTYCcEEkRw0GIANByABqIAMoAnQQggwMCgsgA0G0BGogBkEIaikCADcCACADQbwEaiAGQRBqKAIANgIAIAMoAnAhBCADQSU2AnAgAyAENgKoBCADIAMpA4gBNwPAASADIAYpAgA3AqwEIANBqARqEL8KIANBmARqIANB/AdqKAIANgIAIAMgAjYCoAQgAyAHNgKcBCADIAMpAvQHIhQ3A5AEIBSnIgRBgICAgHhrDgIMCwELIANBgYCAgHg2ApAEIAMgBzYClAQMCgsgAykClAQhFCADQagEaiIGIANByABqQagDEPYGGiABEPUPIAEgBkGoAxD2BiEBIAMgDjoA1wcgAyABKQCDAzcA2AcgAyABKQCLAzcA4AcgAyABKQCTAzcA6AcgAyABKACbAzYA8AcgDCADQdcHahDACCADQQE7ADIgAyABLQCIAzoAMSADIAEoAYIDNgArIAMgAS8BhgM7AC8gAyABKQCLAzcANCADIAEpAJMDNwA8IAMgASgAmwM2AEQgA0HhAGogCkEVaikAADcAACADQdwAaiAKQRBqKQEANwIAIANB1ABqIApBCGopAQA3AgAgAyAKKQEANwJMIAwgA0ErahDACCADIAE2AkggAyACNgKkCCADIAc2AqAIIAMgFDcClAggAyAENgKQCCADIANBJGo2ApwIIANBCGogAUEBIBSnIBRCIIinEKoZELsDIAMoAgwhBQJAIAMoAghFBEAgACADKQKQCDcCACAAQQhqIANBmAhqKAIANgIAIAEoAnwhASADKAIkIQQgBhC6FCAAQQE7ASQgACACNgIgIAAgBzYCHCAAIAQgASABIARJGzYCFCAAIAQgASABIARLGzYCECAAIAU2AgwgACADKALABDYCGCAGEMIgDAELIABBgYCAgHg2AgAgACAFNgIEIANBkAhqEOomIAcQ9CogA0GkCGoQ9ScLIANByABqEIomDAwLAAtBuePgAEEoQdjs3wAQ2hcAC0G54+AAQShB6OzfABDaFwALQbnj4ABBKEH47N8AENoXAAsgA0GBgICAeDYCkAQgAyABNgKUBCADQZAIahD1JwwBCyADQYGAgIB4NgKQBCADIAE2ApQECyADQfQHahDqJgwBCyADQYGAgIB4NgKQBCADIAE2ApQECyAHEPQqCyADQZAEakEEchCAIwsgA0HIAGoQ9Q8LIABBgICAgHg2AgALIANB0AhqJAALtRICEX8BfiMAQcAIayIDJAAgAyACNgIkAkACQAJAAkAgAUEoaiIMEMgNIgJFDQAgAigCAEEURw0AIAItAARBBEYNAQsgDBDIDSICRQ0BIAIoAgBBIUcNAQsgAS0AoAJBAkcNACABLQCqAiEOIANByABqIgIgARCcAyADQQE6AOsDIAMgASkAqwI3AOwDIAMgASkAswI3APQDIAMgASkAuwI3APwDIAMgASgAwwI2AIQEIANB8ABqIgUgA0HrA2oQyAggA0EYaiACQQBBABCTASADKAIcIQcCQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAygCGEUEQAJAAkACQCAFEMgNIgIEQCACKAIAQQlGDQELIANBqARqIAUQgBAgA0H43d8ANgKkBCADQTQ6AKAEIANB4ANqIANBqANqIAMoApADQSVGIgIbKAIAIgEgA0HkA2ogA0GsA2ogAhsoAgAiAiABIAJJGyABIAIgASACSxsgA0GgBGoQ6xQhASAFEMgNIgJFDQwgAigCAEEkRg0BDAwLIANBrARqIANBnANqKQIANwIAIANBtARqIANBpANqKAIANgIAIAMoApADIQIgA0ElNgKQAyADIAMpApQDNwKkBCADIAI2AqAEIAMgAykDqAM3A+ADIANBoARqIgIQvgogAiADQcgAahCyASADKAKkBCEEIAMoAqAEIglBgICAgHhHBEAgAUGqAmohCiADQZQDaiEGIAMoAqgEIQIgAyAENgLwByADIAQgAkEGdCIPaiIQNgL8ByADIAk2AvgHIAlBBnQhCyADQdAEaiERQQAhAgNAIAQgCGohDSACIA9GRQRAIANBgAhqIhIgAiAEaiITQcAAEPYGGiADQaAEaiATQcAAEPYGGiARENcmIA0gEkEoEPYGGiAIQShqIQggAkFAayECDAELCyADIBA2AvQHIAtBKG4hCCADQfAHahCDEiAEIQICQCAJRQ0AIAsgCEEobCIJRg0AIAtFBEBBCCECDAELIAQgC0EIIAkQ9AIiAkUNBgsgAyACNgLoByADIAg2AuQHIAMgDSAEa0EobjYC7AcgA0HwB2oQvBcCQAJAIAUQyA0iAgRAIAIoAgBBCkYNAQsgA0GoBGogBRCAECADQdDd3wA2AqQEIANBNDoAoAQgA0HgA2ogA0GoA2ogAygCkANBJUYiAhsoAgAiASADQeQDaiADQawDaiACGygCACICIAEgAkkbIAEgAiABIAJLGyADQaAEahDrFCEBIAUQyA0iAkUNDCACKAIAQSRGDQEMDAsgA0GsBGogBkEIaikCADcCACADQbQEaiAGQRBqKAIANgIAIAMoApADIQIgA0ElNgKQAyADIAI2AqAEIAMgAykDqAM3A+ADIAMgBikCADcCpAQgA0GgBGoQvgpBACECAkACQCAFEMgNIgRFDQAgBCgCAEETRw0AIANBEGogA0HIAGpBqNjfABDxASADKAIUIQIgAygCEA0BCyADIAI2AoAIIAUQyA0iBARAIAQoAgBBA0YNBQsgA0GoBGogBRCAECADQejq3wA2AqQEIANBNDoAoAQgA0HgA2ogA0GoA2ogAygCkANBJUYiAhsoAgAiASADQeQDaiADQawDaiACGygCACICIAEgAkkbIAEgAiABIAJLGyADQaAEahDrFCEBIAUQyA0iAkUNCyACKAIAQSRHDQsgAyADKQOoAzcD4AMgAygCkAMgA0ElNgKQA0EkRw0IIANByABqIAMoApQDEPsLDAsLIANBgYCAgHg2AogEIAMgAjYCjAQMDAsgAyADKQOoAzcD4AMgAygCkAMgA0ElNgKQA0EkRw0HIANByABqIAMoApQDEPsLDAoLIAMgBDYCjAQgA0GBgICAeDYCiAQMDAsgAyADKQOoAzcD4AMgAygCkAMgA0ElNgKQA0EkRw0GIANByABqIAMoApQDEPsLDAoLIANBrARqIAZBCGopAgA3AgAgA0G0BGogBkEQaigCADYCACADKAKQAyEEIANBJTYCkAMgAyAENgKgBCADIAMpA6gDNwPgAyADIAYpAgA3AqQEIANBoARqEL4KIANBkARqIANB7AdqKAIANgIAIAMgAjYCmAQgAyAHNgKUBCADIAMpAuQHIhQ3A4gEIBSnIgRBgICAgHhrDgIMCwELIANBgYCAgHg2AogEIAMgBzYCjAQMCgsgAykCjAQhFCADQaAEaiIGIANByABqQaADEPYGGiABEMsQIAEgBkGgAxD2BiEBIAMgDjoAxwcgAyABKQCrAjcAyAcgAyABKQCzAjcA0AcgAyABKQC7AjcA2AcgAyABKADDAjYA4AcgDCADQccHahDICCADQQE7ADIgAyABLQCwAjoAMSADIAEoAaoCNgArIAMgAS8BrgI7AC8gAyABKQCzAjcANCADIAEpALsCNwA8IAMgASgAwwI2AEQgA0HhAGogCkEVaikAADcAACADQdwAaiAKQRBqKQEANwIAIANB1ABqIApBCGopAQA3AgAgAyAKKQEANwJMIAwgA0ErahDICCADIAE2AkggAyACNgKUCCADIAc2ApAIIAMgFDcChAggAyAENgKACCADIANBJGo2AowIIANBCGogAUEBIBSnIBRCIIinEKoZEL0DIAMoAgwhBQJAIAMoAghFBEAgACADKQKACDcCACAAQQhqIANBiAhqKAIANgIAIAEoApwDIQEgAygCJCEEIAYQuhQgAEEBOwEkIAAgAjYCICAAIAc2AhwgACAEIAEgASAESRs2AhQgACAEIAEgASAESxs2AhAgACAFNgIMIAAgAygCuAQ2AhggBhCpIAwBCyAAQYGAgIB4NgIAIAAgBTYCBCADQYAIahDqJiAHEPQqIANBlAhqEOAmCyADQcgAahDvJAwMCwALQbnj4ABBKEHY7N8AENoXAAtBuePgAEEoQejs3wAQ2hcAC0G54+AAQShB+OzfABDaFwALIANBgYCAgHg2AogEIAMg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KQMANwMAIAcgBSkDADcDACACIAIpA0g3A9ABIAIgCTYC6AEgAkEEaiACQdABahCpECAKIQMMBAsgAigCVCEBIAIoAlAhAyACIAIoAkw2AmwgAiADNgJkIAIgAyABQRxsIgFqIg42AnAgA0EcaiEFA0ACQCACIAEEfyADKAIAIghBCEcNASAFBSAOCzYCaCACQeQAahCsFyAJENYqIAohAyAPQQFGIA9BBkZyDQUMAgsgBiADKQIENwIAIAZBCGogA0EMaikCADcCACAGQRBqIANBFGopAgA3AgAgAiAINgJ0IAJB0AFqIhUgAkH0AGoQtRUgAkGgAWoiDCANKQIANwMAIAJBmAFqIhEgBykCADcDACACIAIpAtABIhc3A5ABIAIoAugBIRACQCAXp0EBRwRAIAIoAhAhCCACQYCAgIB4NgIQIAhBgICAgHhHBEAgAiACKQIUNwKwASACIAg2AqwBIBUgAkGsAWoQyhEgAkEEaiAVEKkQCyANIAwpAwA3AwAgByARKQMANwMAIAIgAikDkAE3A9ABIAIgEDYC6AEgAkEEaiACQdABahCpEAwBCyACKAKYASEIIAIoApQBIQwCQCACKAIQQYCAgIB4RwRAIAJBEGogDCAIENYdDAELIAJB0AFqIAwgCBC2FUGAgICAeCACKAIUEJYkIAJBGGogBygCADYCACACIAIpAtABNwMQCyAMIAgQwSQgEBDWKgsgA0EcaiEDIAVBHGohBSABQRxrIQEMAAsACyACQcgAahDJESAKIQMMAgsgAigCUCEBIAIoAkwhAwJAIAIoAhBBgICAgHhHBEAgAkEQaiADIAEQ1h0MAQsgAkHQAWogAyABELYVQYCAgIB4IAIoAhQQliQgAkEYaiAHKAIANgIAIAIgAikC0AE3AxALIAMgARDBJCAJENYqIAohAwwBCwsgABCrKAtBgICAgHggFhCWJCACQQRqEL0mCyACQfABaiQAC5oQAgh/BH4jAEGAAWsiAiQAIAFBigNqIgQpAQAhCyABQZIDaiIDKAEAIQUgASkBggMhCiABLwGWAyEGIAEtAJgDIQggASgBmgMhByABLQCeAyEJIAJBMGogBCkBADcCACACQThqIAMpAQA3AgAgAkE9aiABQZcDaikAADcAACACIAk6AHQgAiAHNgBwIAJBAToAbyACIAg6AG4gAiAGOwBs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AygCKCADKAIsELIhIAMoAoABQYCAgIB4RgRAIANBgICAgHg2AnAgA0EBOgB0DAcLIANB+ABqIANBiAFqKQIANwMAIAMgAykCgAE3A3AMBgsgA0EwakHwndUAQRIgByAGENgKIANBgAFqIAMoAjAgAygCNBCyISADKAKAAUGAgICAeEYEQCADQYCAgIB4NgJwIANBAToAdAwGCyADQfgAaiADQYgBaikCADcDACADIAMpAoABNwNwDAULIANBgICAgHg2AnAgA0EBOgB0IAMoAqgBIAMoAqwBEMopDAQLIARBoANqIQVBgJjKACEEA0AgBQRAIANBgAFqIgYgBCgCCCAEKAIMENkKIANBqAFqIAYQ8hcgAygCgAEgAygChAEQyikgBUEQayEFIARBEGohBAwBBSADQfgAaiADQbABaikCADcDACADIAMpAqgBNwNwDAULAAsACyADQRBqQaDnzQBBowEgBSAEENgKIANBgAFqIAMoAhAgAygCFBCyISADKAKAAUGAgICAeEYEQCADQYCAgIB4NgJwIANBAToAdAwDCyADQfgAaiADQYgBaikCADcDACADIAMpAoABNwNwDAILIANB8ABqIAUgBBCnBwwBCyAFIARB/MrIAEEOEM0fRQRAIAUgBEGjncgAQQsQzR9FBEAgA0EIakHI/dMAQTwgBSAEENgKIANBgAFqIAMoAgggAygCDBCyISADKAKAAUGAgICAeEYEQCADQYCAgIB4NgJwIANBADoAdAwDCyADQfgAaiADQYgBaikCADcDACADIAMpAoABNwNwDAILIANB8ABqENkqDAELIANB8ABqENoqCyADQcgAaiABKAIEIAEoAgggCCADQfAAahDpFgJAIAMoAkhBgICAgHhGBEAgA0GAAWogCiACLQA0IANBzABqEN8dIAMoAoABIgFBgICAgHhHDQELIAAgA0HIAGpBKBD2BhoMAQsgAEEEaiADQYQBakEkEPYGGiAAIAE2AgAgAygCSCIAQYCAgIB4RgRAIAMoAkwgAygCUBDKKQwBCyAAIAMoAkwQuCkLIANB0AFqJAALkw4CD38CfiMAQdABayICJAAgAS0APSEOIAFBAToAPSABLQA5IQYgAUEBOgA5IAAoAgAiACABEIcaIAFBAToAOSAAQTBqIAEQnCUgAUEAOgA5IABBNGogARC2DSABQQE6ADkgAEE4aiABELkjIAFBAToAOSAAQRhqIAEQlBEgASAGOgA5IAFBLGohByAAKAIQIgwgACgCFEHYAGxqIQ8gAkH8AGohCCACQeAAaiEJA0ACQAJAIA8gDCIDRwRAIANB2ABqIQwCQAJAAkACQAJAAkACQAJAIAMoAgAiAEEEa0EAIABBBWtBCEkbQQFrDggBAgMEBQsGBwALIAMoAkQiBiADKAJIQQZ0IgBqIQ0gBiEEA0AgAARAIARBMGogARCHGiAAQUBqIQAgBEFAayEEDAEFAkAgASgCMBCnESEAIAlBCGpB2JbjACkDACIRNwIAIAlB0JbjACkDACISNwIAIAJB2ABqIBE3AwAgCCAHKQIANwIAIAhBCGogB0EIaigCADYCACACQQE6AHggAiABNgJwIAIgADYCdCACIBI3A1AgAiABLQA8OgCMASACIAEvATo7AYoBIAEtADghACACIAEtAD06AI0BIAIgADoAiAEgAkEAOgCJASACIA02AkwgAiAGNgJIIAJBADYCOCACQQA2AiggAkEYaiACQShqIgAQ7AgCfyACKQMYIhFQBEAgABDeKEEAIQRBACEFQQgMAQsgAigCICEAIAJBnAFqIgogAkEoaiIQELIQQQEhBCACQRBqQQQgAigCnAFBAWoiBUF/IAUbIgUgBUEETRtBCEEQEOcUIAIoAhAhCyACKAIUIgUgADYCCCAFIBE3AwAgAkEBNgKYASACIAU2ApQBIAIgCzYCkAEgCiAQQSgQ9gYaQRghAANAIAIgAkGcAWoiChDsCCACKQMAIhFQRQRAIAIoAgghCyACKAKQASAERgRAIAJBxAFqIAoQshAgAkGQAWogAigCxAFBAWoiBUF/IAUbEPseIAIoApQBIQULIAAgBWoiCiALNgIAIApBCGsgETcDACACIARBAWoiBDYCmAEgAEEQaiEADAELC0IAENYmIAJBnAFqEN4oIAIoApABIQUgAigClAELIQAgAiAFNgKkASACIAA2ApwBIAIgACAEQQR0IgRqIgU2AqgBA0AgBARAIAJB0ABqIAApAwBBARDLCCAEQRBrIQQgAEEQaiEADAEFIAIgBTYCoAEgAkGcAWoQ/RYDQCAGIA1GDQMgBkFAayEFIAYoAgBBB0YEQCAGKAI4QQxsIQAgBigCNCEEA0AgAARAIABBDGshACAEIAJB0ABqELsrIARBDGohBAwBCwsgAkEAOgCJASAGQQhqIQAgBi0AHEECRwRAIAJB0ABqIAAQtBkgBSEGDAILIAJB0ABqIAAQsSUFIAJB0ABqIAYQgRcLIAUhBgwACwALAAsACwsLIAJBAToAiQEgAygCIEGAgICAeEcNCAwJCyABIANBCGoQ4CEgA0EwaiADKAIwIgUoAghBBnQhACAFKAIEIQQDQCAABEAgBEEwaiABEIcaIABBQGohACAEQUBrIQQMAQsLIAEoAjAQpxEhACAJQQhqQdiW4wApAwAiETcCACAJQdCW4wApAwAiEjcCACACQdgAaiARNwMAIAggBykCADcCACAIQQhqIAdBCGooAgA2AgAgAkEBOgB4IAIgATYCcCACIAA2AnQgAkEBOgCJASACIBI3A1AgAiABLQA8OgCMASACIAEvATo7AYoBIAEtADghACACIAEtAD06AI0BIAIgADoAiAEgAkHQAGoiABDVAyAAEOEoDAkLIAEoAjAQpxEhACAJQQhqQdiW4wApAwAiETcCACAJQdCW4wApAwAiEjcCACACQdgAaiARNwMAIAggBykCADcCACAIQQhqIAdBCGooAgA2AgAgAkEBOgB4IAIgATYCcCACIAA2AnQgAkEBOgCJASACIBI3A1AgAiABLQA8OgCMASACIAEvATo7AYoBIAEtADghACACIAEtAD06AI0BIAIgADoAiAEgA0EgaiACQdAAaiIAENUDIAAQ4SgMCAsgA0EwaiABEIcaIAEtADkhACADKAIIQQNGBEAgAUEAOgA5IANBDGogARC7KwsgAUEBOgA5IANBPGogARCcJSABIAA6ADkgA0FAayABELAlDAcLIANBJGogARCcJSADQShqIAEQzyMgA0EsaiABEIcaDAYLIAEgA0EEahCfFQwFCyABIANBBGoQuAsMBAsgAygCCEEFRwRAIAEgA0EIahDgIQsgA0E8aiABEJwlIANBQGsgARDPIyADQTBqIAEQhxoMAwsgASAOOgA9IAJB0AFqJAAPCyACKAJ0IANBNGoQ2yEgAkHQAGogA0EgahCjCwsgAkHQAGoQ4SgMAAsAC8wNAgx/A34jAEHgAGsiBiQAAkACQCAALQAoRQRAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJA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EGogABC/KyABKAIMQRhsIQIgASgCCCEBA0AgAkUNDCABQRRqIAAQoSUgASAAEIMaIAJBGGshAiABQRhqIQEMAAsACyABQQRqIAAQvysMCgsgACABKAIEIgFByABqEIIhIAEoAgBBCEcEQCABIAAQwSMgACABQShqEIIhCyABQeAAaiAAEMsjDAkLIAFBBGogABC/KyABQQhqIAAQ0SsMCAsgAUEEaiAAEL8rIAFBCGogABDRKwwHCyAALQAmIQMgAEEBOgAmAkAgASgCBCIFQQJGDQAgAUEIaiECIAVBAXFFBEAgAiAAENIrDAELIAIgABC/KwsgACADOgAmIAFBGGogABChJSABQRxqIAAQoSUgACABKAIMEMoBDAYLIAAgAUEEahDCFiABQQxqIAAQvysgAUEQaiAAENErDAULIAAgAUEEaiIFEMIWIAFBDGoiByAAEL8rIAFBEGogABDRKyABLQAcDQMgASgCBEECRw0DIAEoAggiAigCACIDBH8gAwUgBCACQQhqEJEMIAQoAgAgBCgCBEGgseAAQQUQzR8EQBDaIiEDIARBMGoiBiACENsEIAYgAyAGQSgQ9gYiAkEoEPYGGiAEKAIwDQQgBEEoaiACQSBqKQMANwMAIARBIGogAkEYaikDADcDACAEQRhqIAJBEGopAwA3AwAgBCACKQMINwMQIARBADYCCCACENEsIARBCGoQ/ykhAiAFEJIdIAEgAjYCCCABQQI2AgQLIAIoAgALQQZHDQMgAigCBEGgseAAQQUQ7x5FDQMgACACKAIEEMkBDAMLIAFBCGogABC2DAwDCyAAQQA6ACQgAUEEaiAAEL8rIAAgCDoAJSAAQQM6ACQgACABKAIEEPoMDAILIARBATYCDCAEQeys3wA2AgggBEIBNwIUIARBtQI2AlwgBCAEQdgAajYCECAEIARBMGo2AlggBEEIakHQrd8AEKEdAAsgBygCACIBKAIAIgJBGUcgAkEiR3ENACAAIAEQyQELIAAgCDoAJSAAIAk6ACQgBEHgAGokAAunDQIIfwF+IwBB0ABrIgMkACABKAIAKAIAIQQgA0EANgIYIANBQGsgAiADQRhqQbio4ABBARCUEwJAAkACQAJAAkAgAy0AQEEERwRAIAMpA0AiC0L/AYNCBFINAQsgA0FAayAEQUBrIAIQjgogAy0AQEEERwRA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IAJBATYCHCACQaS3xwA2AhggAkIENwIgIAEoAhQgASgCGCACQRhqEJUkDCALIAJBADYCKCACQQE2AhwgAkHot8cANgIYIAJCBDcCICABKAIUIAEoAhggAkEYahCVJAwfCyACQQA2AiggAkEBNgIcIAJBnLjHADYCGCACQgQ3AiAgASgCFCABKAIYIAJBGGoQlSQMHgsgAkEANgIoIAJBATYCHCACQby4xwA2AhggAkIENwIgIAEoAhQgASgCGCACQRhqEJUkDB0LIAJBADYCKCACQQE2AhwgAkHcuMcANgIYIAJCBDcCICABKAIUIAEoAhggAkEYahCVJAwcCyACQQA2AiggAkEBNgIcIAJB/LjHADYCGCACQgQ3AiAgASgCFCABKAIYIAJBGGoQlSQMGwsgAkEANgIoIAJBATYCHCACQaC5xwA2AhggAkIENwIgIAEoAhQgASgCGCACQRhqEJUkDBoLIAJBADYCKCACQQE2AhwgAkHcuccANgIYIAJCBDcCICABKAIUIAEoAhggAkEYahCVJAwZCyACQQA2AiggAkEBNgIcIAJBgLrHADYCGCACQgQ3AiAgASgCFCABKAIYIAJBGGoQlSQMGAsgAkEANgIoIAJBATYCHCACQci6xwA2AhggAkIENwIgIAEoAhQgASgCGCACQRhqEJUkDBcLIAJBADYCKCACQQE2AhwgAkHsuscANgIYIAJCBDcCICABKAIUIAEoAhggAkEYahCVJAwWCyACQQA2AiggAkEBNgIcIAJBlLvHADYCGCACQgQ3AiAgASgCFCABKAIYIAJBGGoQlSQMFQsgAkEANgIoIAJBATYCHCACQay7xwA2AhggAkIENwIgIAEoAhQgASgCGCACQRhqEJUkDBQLIAJBADYCKCACQQE2AhwgAkHUu8cANgIYIAJCBDcCICABKAIUIAEoAhggAkEYahCVJAwTCyACQQA2AiggAkEBNgIcIAJBgLzHADYCGCACQgQ3AiAgASgCFCABKAIYIAJBGGoQlSQMEgsgAkEANgIoIAJBATYCHCACQZy8xwA2AhggAkIENwIgIAEoAhQgASgCGCACQRhqEJUkDBELIAJBADYCKCACQQE2AhwgAkHAvMcANgIYIAJCBDcCICABKAIUIAEoAhggAkEYahCVJAwQCyACQQA2AiggAkEBNgIcIAJB4LzHADYCGCACQgQ3AiAgASgCFCABKAIYIAJBGGoQlSQMDwsgAkEANgIoIAJBATYCHCACQYi9xwA2AhggAkIENwIgIAEoAhQgASgCGCACQRhqEJUkDA4LIAJBADYCKCACQQE2AhwgAkGsvccANgIYIAJCBDcCICABKAIUIAEoAhggAkEYahCVJAwNCyACQQA2AiggAkEBNgIcIAJBxL3HADYCGCACQgQ3AiAgASgCFCABKAIYIAJBGGoQlSQMDAsgAkEANgIoIAJBATYCHCACQdy9xwA2AhggAkIENwIgIAEoAhQgASgCGCACQRhqEJUkDAsLIAIgACgCBDYCDCACQQI2AhwgAkGgvscANgIYIAJCATcCJCACQQk2AhQgAiACQRBqNgIgIAIgAkEMajYCECABKAIUIAEoAhggAkEYahCVJAwKCyACQQA2AiggAkEBNgIcIAJB7L7HADYCGCACQgQ3AiAgASgCFCABKAIYIAJBGGoQlSQMCQsgAkEANgIoIAJBATYCHCACQaS/xwA2AhggAkIENwIgIAEoAhQgASgCGCACQRhqEJUkDAgLIAJBADYCKCACQQE2AhwgAkHIv8cANgIYIAJCBDcCICABKAIUIAEoAhggAkEYahCVJAwHCyACQQA2AiggAkEBNgIcIAJB+L/HADYCGCACQgQ3AiAgASgCFCABKAIYIAJBGGoQlSQMBgsgAkEANgIoIAJBATYCHCACQdTAxwA2AhggAkIENwIgIAEoAhQgASgCGCACQRhqEJUkDAULIAJBADYCKCACQQE2AhwgAkHAwccANgIYIAJCBDcCICABKAIUIAEoAhggAkEYahCVJAwECyACQQA2AiggAkEBNgIcIAJBzMLHADYCGCACQgQ3AiAgASgCFCABKAIYIAJBGGoQlSQMAwsgAkEANgIoIAJBATYCHCACQfTCxwA2AhggAkIENwIgIAEoAhQgASgCGCACQRhqEJUkDAILIAJBADYCKCACQQE2AhwgAkGcw8cANgIYIAJCBDcCICABKAIUIAEoAhggAkEYahCVJAwBCyACQQA2AiggAkEBNgIcIAJB6MPHADYCGCACQgQ3AiAgASgCFCABKAIYIAJBGGoQlSQLIAJBMGokAAuaDgEOfyMAQbABayIDJAAgAUEoaiIFEKUgIQsCQCAFEMgNIgRFBEAgASgCgAIhASADQQA6AGggASABIANB6ABqEOsUIQEgAEGAgICAeDYCACAAIAE2AgQMAQsCQAJAAkACQAJAAkACQAJAAkACQAJAIAQoAgBBJEYEQCABIAEpA+ACNwOYAyABKALIAiABQSU2AsgCQSRGDQFBuePgAEEoQbiM4AAQ2hcACyABKALIAiEEIAFBJTYCyAIgASABKQPgAjcDmAMgA0H0AGoiBiABQdQCaikCADcCACADQfwAaiIIIAFB3AJqKAIANgIAIAMgASkCzAI3AmwgAyAENgJoIANB6ABqIgoQvgogA0EANgI8IANCgICAgMAANwI0IAogASACEMUEIAMoAmghBCADLQCAASIHQQJGDQUgAUHMAmohCSADQdgAaiIMIAgoAgA2AgAgA0HQAGoiCCAGKQIANwMAIAMgAykCbDcDSCADIAMoAIEBNgJAIAMgA0GEAWooAAA2AENBIEEIEIwgIgYgBDYCACAGIAc6ABggBiADKQNINwIEIAZBDGogCCkDADcCACAGQRRqIAwoAgA2AgAgBiADKAJANgAZIAZBHGogAygAQzYAACADQQE2AmQgAyAGNgJgIANBATYCXCAKQQRyIQYgA0GpAWohDCADQZABakEEciEIIANBgQFqIQoDQCAHQQFxRQRAAkAgBRDIDSIEBEAgBCgCAEEWRg0BCyADQfAAaiAFEIAQIANBEGogBRDqEyADQcjn3wA2AmwgA0E0OgBoIAMoAhAgAygCFCADQegAahDrFCEEIAUQyA0iAkUNByACKAIAQSRHDQcgASABKQPgAjcDmAMgASgCyAIgAUElNgLIAkEkRw0LIAEgASgCzAIQ+wsMBwsgBiAJKQIANwIAIAEoAsgCIQQgAUElNgLIAiABIAEpA+ACNwOYAyAGQQhqIg0gCUEIaiIHKQIANwIAIAZBEGoiDiAJQRBqIhAoAgA2AgAgAyAENgJoIANB6ABqIg8QvgogDyABQQEQtxIgA0EgaiADKAJoEIkGIAMoAiQhBCADKAIgDQUgA0E0aiAEELIbIA8Q7yQCQCAFEMgNIgQEQCAEKAIAQQ5GDQELIANB8ABqIAUQgBAgA0EYaiAFEOoTIANBuNnfADYCbCADQTQ6AGggAygCGCADKAIcIANB6ABqEOsUIQQgBRDIDSICRQ0HIAIoAgBBJEcNByABIAEpA+ACNwOYAyABKALIAiABQSU2AsgCQSRHDQogASABKALMAhD7CwwHCyAGIAkpAgA3AgAgASgCyAIhBCABQSU2AsgCIAEgASkD4AI3A5gDIA0gBykCADcCACAOIBAoAgA2AgAgAyAENgJoIANB6ABqIgQQvgogBCABIAIQxQQgAygCaCEEIAMtAIABIgdBAkYNBiAIIAYpAgA3AgAgDCAKKAAANgAAIAhBEGogDigCADYCACAIQQhqIA0pAgA3AgAgDEEDaiAKQQNqKAAANgAAIAMgBzoAqAEgAyAENgKQASADQdwAaiADQZABahCuEAwBCwsgA0EwaiICIANB5ABqKAIANgIAIAMgAykCXDcDKCADKAI4IQQgAygCNCIGQYCAgIB4Rg0GIAMoAjwhByADQZgBaiACKAIANgIAIAMgAykDKDcDkAEgAyAHNgJQIAMgBDYCTCADIAY2AkggBRDIDSICBEAgAigCAEERRg0CCyADQfAAaiAFEIAQIANBCGogBRDqEyADQejh3wA2AmwgA0E0OgBoIAMoAgggAygCDCADQegAahDrFCECIAUQyA0iBUUNCiAFKAIAQSRGDQIMCgsgASgCzAIhASAAQYCAgIB4NgIAIAAgATYCBAwKCyABKALIAiECIAFBJTYCyAIgASABKQPgAjcDmAMgA0H0AGogCUEIaikCADcCACADQfwAaiIFIAlBEGooAgA2AgAgAyAJKQIANwJsIAMgAjYCaCADQegAahC+CiABKAKcAyEBIANB8ABqIgIgA0HQAGooAgA2AgAgBSADQZgBaigCADYCACAAIAMpAkg3AgAgACALIAEgASALSRs2AhwgACALIAEgASALSxs2AhggAyADKQOQATcCdCAAQQhqIAIpAwA3AgAgAEEQaiADQfgAaikDADcCAAwJCyABIAEpA+ACNwOYAyABKALIAiABQSU2AsgCQSRHDQYgASABKALMAhD7CwwHCyADQegAahDvJAsgA0HcAGoQ3yILIANBNGoQziYLIABBgICAgHg2AgAgACAENgIEDAQLQbnj4ABBKEGQhuAAENoXAAtBuePgAEEoQaCG4AAQ2hcAC0G54+AAQShByIzgABDaFwALIABBgICAgHg2AgAgACACNgIEIANBkAFqEN8iIANByABqEM4mCyADQbABaiQAC/ENAQ5/IwBBsAFrIgMkACABQShqIgUQvyAhCwJAIAUQ4w0iBEUEQCABKALYAiEBIANBADoAaCABIAEgA0HoAGoQ6xQhASAAQYCAgIB4NgIAIAAgATYCBAwBCwJAAkACQAJAAkACQAJAAkACQAJAAkAgBCgCAEEkRgRAIAEgASkDQDcDeCABKAIoIAFBJTYCKEEkRg0BQbnj4ABBKEG4jOAAENoXAAsgASgCKCEEIAFBJTYCKCABIAEpA0A3A3ggA0H0AGoiBiABQTRqKQIANwIAIANB/ABqIgggAUE8aigCADYCACADIAEpAiw3AmwgAyAENgJoIANB6ABqIgoQvwogA0EANgI8IANCgICAgMAANwI0IAogASACEMYEIAMoAmghBCADLQCAASIHQQJGDQUgAUEsaiEJIANB2ABqIgwgCCgCADYCACADQdAAaiIIIAYpAgA3AwAgAyADKQJsNwNIIAMgAygAgQE2AkAgAyADQYQBaigAADYAQ0EgQQgQjCAiBiAENgIAIAYgBzoAGCAGIAMpA0g3AgQgBkEMaiAIKQMANwIAIAZBFGogDCgCADYCACAGIAMoAkA2ABkgBkEcaiADKABDNgAAIANBATYCZCADIAY2AmAgA0EBNgJcIApBBHIhBiADQakBaiEMIANBkAFqQQRyIQggA0GBAWohCgNAIAdBAXFFBEACQCAFEOMNIgQEQCAEKAIAQRZGDQELIANB8ABqIAUQ5gsgA0EQaiAFEJ8UIANByOffADYCbCADQTQ6AGggAygCECADKAIUIANB6ABqEOsUIQQgBRDjDSICRQ0HIAIoAgBBJEcNByABIAEpA0A3A3ggASgCKCABQSU2AihBJEcNCyABIAEoAiwQggwMBwsgBiAJKQIANwIAIAEoAighBCABQSU2AiggASABKQNANwN4IAZBCGoiDSAJQQhqIgcpAgA3AgAgBkEQaiIOIAlBEGoiECgCADYCACADIAQ2AmggA0HoAGoiDxC/CiAPIAFBARDHEiADQSBqIAMoAmgQjAYgAygCJCEEIAMoAiANBSADQTRqIAQQshsgDxCKJgJAIAUQ4w0iBARAIAQoAgBBDkYNAQsgA0HwAGogBRDmCyADQRhqIAUQnxQgA0G42d8ANgJsIANBNDoAaCADKAIYIAMoAhwgA0HoAGoQ6xQhBCAFEOMNIgJFDQcgAigCAEEkRw0HIAEgASkDQDcDeCABKAIoIAFBJTYCKEEkRw0KIAEgASgCLBCCDAwHCyAGIAkpAgA3AgAgASgCKCEEIAFBJTYCKCABIAEpA0A3A3ggDSAHKQIANwIAIA4gECgCADYCACADIAQ2AmggA0HoAGoiBBC/CiAEIAEgAhDGBCADKAJoIQQgAy0AgAEiB0ECRg0GIAggBikCADcCACAMIAooAAA2AAAgCEEQaiAOKAIANgIAIAhBCGogDSkCADcCACAMQQNqIApBA2ooAAA2AAAgAyAHOgCoASADIAQ2ApABIANB3ABqIANBkAFqEK4QDAELCyADQTBqIgIgA0HkAGooAgA2AgAgAyADKQJcNwMoIAMoAjghBCADKAI0IgZBgICAgHhGDQYgAygCPCEHIANBmAFqIAIoAgA2AgAgAyADKQMoNwOQASADIAc2AlAgAyAENgJMIAMgBjYCSCAFEOMNIgIEQCACKAIAQRFGDQILIANB8ABqIAUQ5gsgA0EIaiAFEJ8UIANB6OHfADYCbCADQTQ6AGggAygCCCADKAIMIANB6ABqEOsUIQIgBRDjDSIFRQ0KIAUoAgBBJEYNAgwKCyABKAIsIQEgAEGAgICAeDYCACAAIAE2AgQMCgsgASgCKCECIAFBJTYCKCABIAEpA0A3A3ggA0H0AGogCUEIaikCADcCACADQfwAaiIFIAlBEGooAgA2AgAgAyAJKQIANwJsIAMgAjYCaCADQegAahC/CiABKAJ8IQEgA0HwAGoiAiADQdAAaigCADYCACAFIANBmAFqKAIANgIAIAAgAykCSDcCACAAIAsgASABIAtJGzYCHCAAIAsgASABIAtLGzYCGCADIAMpA5ABNwJ0IABBCGogAikDADcCACAAQRBqIANB+ABqKQMANwIADAkLIAEgASkDQDcDeCABKAIoIAFBJTYCKEEkRw0GIAEgASgCLBCCDAwHCyADQegAahCKJgsgA0HcAGoQ3yILIANBNGoQziYLIABBgICAgHg2AgAgACAENgIEDAQLQbnj4ABBKEGQhuAAENoXAAtBuePgAEEoQaCG4AAQ2hcAC0G54+AAQShByIzgABDaFwALIABBgICAgHg2AgAgACACNgIEIANBkAFqEN8iIANByABqEM4mCyADQbABaiQAC4EMAQ1/IwBBMGsiCyQAIAJBBGshEwJAAkADQAJAAkACQAJAIAFBIU8EQCAEDQEgACABIAIgA0EB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IgYgB0EQaigCADYCACACIAcpAgA3AlwgAiADNgJYIAwQvwogAkEBOgD7ASACIAEpAYIDNwDvASACIAFBigNqIgMoAQA2APcBIAIgASkAjwM3APwBIAIgAUGXA2oiCCkAADcAhAIgAkHxAGogCCkAADcAACAGIAFBkgNqKQEANwIAIAUgAykBADcCACACIAEpAYIDNwJcIAFBgAFqIAJB7wFqEMAIIAIgATYCWCACQQhqIAEQkQIgAigCDCEGIAIoAghFBEAgDSEDIA4hBSACIAY2AowCIAwQiiYCQAJAAkAgAigCwAEiCEEBaw4GAAAAAgICAQsgBSEDCyABKAJ8IQVBDEEEEIwgIgkgBjYCACAJIAsgBSAFIAtJGzYCCCAJIAsgBSAFIAtLGzYCBCADEPUnIAMgCTYCAAwCCyACQYwCahC4BQwBCyACQdgAahCKJgwBCyAEEOMNIgMEQCADKAIAQQpGDQILIAJB4ABqIAQQ5gsgAiAEEJ8UIAJB0N3fADYCXCACQTQ6AFggAigCACACKAIEIAJB2ABqEOsUIQYgBBDjDSIDRQ0AIAMoAgBBJEcNACABIAEpA0A3A3ggASgCKCABQSU2AihBJEcNBCABIAEoAiwQggwLIAJBwAFqEJgSDAILIAEoAighAyABQSU2AiggASABKQNANwN4IAJB5ABqIAdBCGopAgA3AgAgAkHsAGogB0EQaigCADYCACACIAcpAgA3AlwgAiADNgJYIAJB2ABqEL8KIAJBIGogAkHIAWoiA0EIaikDADcDACACQShqIANBEGopAwA3AwAgAkEwaiADQRhqKQMANwMAIAIgAykDADcDGCACKALEASEGCyACQdAAaiIDIAJBMGopAwA3AwAgAkHIAGoiBSACQShqKQMANwMAIAJBQGsiByACQSBqKQMANwMAIAIgAikDGDcDOCACQcABaiABQQAQkgYgAkHoAGogBykDADcDACACQfAAaiAFKQMANwMAIAJB+ABqIAMpAwA3AwAgAiAENgKEASACIAY2AlwgAiAINgJYIAIgAikDODcDYCACKALAASACIAJBFGo2AoABQYCAgIB4RwRAIAJBoAFqIAMpAwA3AwAgAkGYAWogBSkDADcDACACQZABaiAHKQMANwMAIAJBsAFqIAJByAFqKQIANwMAIAJBuAFqIAJB0AFqKQIANwMA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aiACQUBrEP0PIAIoAhAhASACKAIUIgQEQCAAIAEgBBCEDjYCGCAAIAQ2AgggACABNgIEIABBATYCAAwDCyAAEKsoIAFBABDBJAwCCyAAIAJBLGoQ5Qc2AhggAEECNgIAIABBFGogAkE8aigCADYCACAAQQxqIAJBNGopAgA3AgAgACACKQIsNwIEDAoLIAJB6ABqEPYcIAJBATYCZCAAIAJB5ABqEOUHNgIYIABBAjYCACAAQRRqIAJB9ABqKAIANgIAIABBDGogAkHsAGopAgA3AgAgACACKQJkNwIECyACQSxqEJQeDAgLIAAgASgCBCIBEK4UNgIYIAAgATYCBCAAQQM2AgAMBwsgAkHkAGogASgCDBDqASABKAIEIQQgASgCCCEGIAEtABQhByABKAIQIQVBHEEEEIwgIgNBGGoiASACQfwAaigCADYCACADQRBqIAJB9ABqKQIANwIAIANBCGogAkHsAGopAgA3AgAgAyACKQJkNwIAIAIgBTYCOCACIAc6ADwgAiAGNgIwIAIgBDYCLCACIAM2AjQgASgCACIBKAIIQQFHDQQgASgCDA0EIAJBATYCLCACIAVBAEciBTYCOCACIARBAXMgBkEAR3IiBjYCMEEBDAULIAEoAgQhAQwBCwsgASgCCCEFIAJBGGogASgCDCIDQRwQqBQgAkEANgJUIAIgAikDGDcCTCACQcwAaiADEM4eIAIoAlQhASACIAMEfyABIANqIAIoAlAgAUEcbGohAQNAIAJB5ABqIAUQ6gEgAUEYaiACQfwAaigCADYCACABQRBqIAJB9ABqKQIANwIAIAFBCGogAkHsAGopAgA3AgAgASACKQJkNwIAIAFBHGohASAFQRxqIQUgA0EBayIDDQALBSABCzYCVCAAIAJBzABqEKsBDAMLIAEoAgghBSACQSBqIAEoAgwiA0EcEKgUIAJBADYCYCACIAIpAyA3AlggAkHYAGogAxDOHiACKAJgIQEgAiADBH8gASADaiACKAJcIAFBHGxqIQEDQCACQeQAaiAFEOoBIAFBGGogAkH8AGooAgA2AgAgAUEQaiACQfQAaikCADcCACABQQhqIAJB7ABqKQIANwIAIAEgAikCZDcCACABQRxqIQEgBUEcaiEFIANBAWsiAw0ACwUgAQs2AmAgACACQdgAahBaDAILIAQLIQECQAJAAkACQCAFDgIAAQILIAFFIAZyDQEgABCrKCADEJQjDAILIAFFIAZBAUdyDQAgACADKQIANwIAIABBGGogA0EYaigCADYCACAAQRBqIANBEGopAgA3AgAgAEEIaiADQQhqKQIANwIADAELIAAgAkEsahDwBjYCGCAAQQQ2AgAgACACKQIsNwIEIABBFGogAkE8aigCADYCACAAQQxqIAJBNGopAgA3AgAMAQsgAxDSKgsgAkGAAWokAAv8CgEHfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQEEHIAAoAgAiAkEMayIEIARBJk8bQQFrDiQAAQIUFQMEBQYHCAkWExMWCgsMDRMUFA4TEw8QFxQUFxEXExITCyAAKAIMQQR0IQMgACgCCCEAA0AgA0UNEyAAKAIAQQJHBEAgAEEMaiABEOMsCyAAQRBqIQAgA0EQayEDDAALAAsgAEEEaiABEPsJDwsgACgCICABEJEQDwsgAEEEaiABEOMsIABBCGogARDjLA8LIABBOGoCQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAkEBaw4LAQIDBAUGBwgJCwoACyAAKQMIIAAoAhggARCgHAwKCyAAQQhqIAEQhx8MCQsgAEEIaiABEPchDAgLIABBBGogARDjLAwHCyAAQQRqIAEQ7RgMBgsgAEEEaiABEMklDAULIABBBGogARDJJQwECyAAQQRqIAEQ4ywMAwsgAEEEaiABEMklDAILIABBBGogARDKJQwBCyAAQQhqIQICQAJAIAAoAgRBAWsOAgECAAsgAiABEIAVDAELIAIgARC5CwsgARDjLA8LIABBCGogARCHHw8LIABBCGogARD3IQ8LIABBBGogARDjLCAAQQhqIAEQ4ywMDQsgAC0AGEEFRgRAIABBEGogARDjLAsgAEEEaiABEO4YIABBKGogARDjIw8LIABBEGogARDjLCAAKAIEQYCAgIB4RwRAIABBBGogARDuGAsgAEEgaiABEOMjDwsgAEEEaiABEOMsIABBGGogARDjIyAAKAIIIAEQkhoPCyAAKAIMQShsIQMgACgCCCECA0AgAwRAIAIgARCVESADQShrIQMgAkEoaiECDAELCyAAKAIQIgIoAgBBgICAgHhGBEAgAkEEaiABEOMsCyAAKAIgIgIE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C0L/AYNCBFINAQsgA0EANgIcIANBMGogAiADQRxqQYit4ABBARCUEwJAIAMtADBBBEYNACADKQMwIgtC/wGDQgRRDQAgACALNwIADAkLIAIgAigCLEEBajYCLCAEQQJHDQEgASgCBCABKAIQIQYgA0EwaiABKAIMIgggASgCCCIEQYGABCAEENUXIAMtADBBBUcEQCADKQMwIQsMBQsgAygCNBogBEUNAgJAIAItAE0NACADQTBqIAIQmxEgAy0AMEEERg0AIAMpAzAiC0L/AYNCBFINBQsgA0EAOgA/IANBADoAKEE0aiEBIAQhBQNAIAVFBEAgA0EwaiACIAggBkGBgAQgCSAKENUBIAMtADBBBEYNBSADKQMwIgtC/wGDQgRSDQYMBQsgA0EQaiABQTRrIgcQuhEgA0EwaiACIAZBgYAEIAkgCiADKAIQIAMoAhQgA0EoaiADQT9qEIsEIAMtADBBBEcEQCADKQMwIgtC/wGDQgRSDQYLIANBMGogByACEDMgAy0AMEEERwRAIAMpAzAiC0L/AYNCBFINBgsCQCADLQA/RQRAIANBAToAPwwBCyACKAJERQ0AIANBMGogAgJ/AkACQAJAAkACQAJAAkACQAJAIAcoAgBBAWsOCQIBAgMEBQYHCAALIAFBHGsoAgAMCAsgAUEgaygCAAwHCyABKAIADAYLIAFBKGsoAgAMBQsgAUEoaygCAAwECyABQTBrKAIAKAIkDAMLIAFBKGsoAgAMAgsgAUEoaygCAAwBCyADQQhqIAFBLGsQpQQgAygCDAtBABDoAiADLQAwQQRGDQAgAykDMCILQv8Bg0IEUg0GCyADLQAoBEAgAiACKAIsQQFrNgIsIANBADoAKAsgAyAHELoRIAVBAWshBSABQThqIQFBASEJIAMoAgQhCgwACwALIAAgCzcCAAwHCyADQTBqIAIgASgCAEEAENEBAkAgAy0AMEEERwRAIAMpAzAiC0L/AYNCBFINAQsCQCABLQAkRQ0AIANBADYCMCADQShqIAIgA0EwakGKreAAQQcQlBMgAy0AKEEERwRAIAMpAygiC0L/AYNCBFINAgsgA0EwaiACELgRIAMtADBBBEYNACADKQMwIgtC/wGDQgRSDQELIANBADYCMCADQShqIAIgA0EwakGRreAAQQkQlBMgAy0AKEEERwRAIAMpAygiC0L/AYNCBFINAQsgA0EwaiACELgRIAMtADBBBEcEQCADKQMwIgtC/wGDQgRSDQELIANBMGogAUEIaiACEMkSIAMtADBBBEcEQCADKQMwIgtC/wGDQgRSDQELAkAgAi0ATQ0AIANBMGogAhC4ESADLQAwQQRGDQAgAykDMCILQv8Bg0IEUg0BCyADQTBqIAEoAiAgAhDwASADLQAwQQRGDQYgAykDMCILQv8Bg0IEUQ0GCyALQv8Bg0IEUQ0FIAAgCzcCAAwGCyACLQBNDQAgA0EwaiACEJsRIAMtADBBBEYNACADKQMwIgtC/wGDQgRSDQELIANBMGogAiAGIARFQYGABBChDyADLQAwQQRGDQEgAykDMCILQv8Bg0IEUQ0BCyALQv8Bg0IEUg0BCyADQTBqIAIgCEEAENEBIAMtADBBBEYNASADKQMwIgtC/wGDQgRRDQELIAtC/wGDQgRRDQAgACALNwIADAELIAIgAigCLEEBazYCLCADQTBqIAIgA0EcakGJreAAQQEQlBMCQCADLQAwQQRHBEAgAykDMCILQv8Bg0IEUg0BCyAAQQQ6AAAMAQsgACALNwIACyADQUBrJAAL4QsCCH8BfiMAQdABayIDJAAgA0EkaiABELkVIAMoAiQiAUEoaiIEEKUgIQcCQAJAAkACQCAEIAIQlg9FBEAgBBDIDSIFRQRAIAEoAoACIQUgA0EAOgBoIAUgBSADQegAahDrFBCYGCEFCyADQbQCNgKcASADIAU2ArgBQQEhCCADQQE2AkwgA0Go7uAANgJIIANCATcCVCADIANBuAFqNgKYASADIANBmAFqNgJQIANB8ABqIANByABqEOYUIANBGGogBBDqEyADIAI2AmwgA0E0OgBoIAMoAhggAygCHCADQegAahDrFCECIAQQyA0iBEUNBCAEKAIAQSRHDQQgASABKQPgAjcDmAMgASgCyAIgAUElNgLIAkEkRw0BIAEgASgCzAIQ+wsMBAsgBBClICEJIAQQyA0iAkUNASACKAIAQQJHDQEgAi0ACA0BIAItAAlBFEcNASADQd0AaiABQb8CaikAADcAACADQdgAaiABQboCaikAADcDACADQdAAaiABQbICaikAADcDACADIAEpAKoCNwNIIAQQjxMiAkUNASACKAIAQQJHDQEgA0HIAGogAi0ACCACQQlqLQAAENUJDQEgBBDIDSICRQRAIAEoAoACIQEgA0EAOgBoIAEgASADQegAahDrFCECDAMLIAIoAgBBJEYEQCABIAEpA+ACNwOYAyABKALIAiABQSU2AsgCQSRGBEAgASgCzAIhAgwEC0G54+AAQShBuOzfABDaFwALIAEoAsgCIQIgAUElNgLIAiABIAEpA+ACNwOYAyADQfQAaiABQdQCaikCADcCACADQfwAaiABQdwCaigCADYCACADIAEpAswCNwJsIAMgAjYCaCADQegAaiICEL4KQQEhBSAEEMgNDQEgASgCgAIhASADQQA6AGggASABIAIQ6xQhAgwCC0G54+AAQShBqOzfABDaFwALIANB/QBqIAFBvwJqKQAANwAAIANB+ABqIAFBugJqKQAANwMAIANB8ABqIAFBsgJqKQAANwMAIAMgASkAqgI3A2gCQCAEEMgNIgJFDQAgAigCAEECRw0AIANB6ABqIAItAAggAkEJai0AABDVCQ0AIAQQjxMiAkUNACACKAIAQQJHDQAgAi0ACA0AIAItAAlBDkcNACAEEOogQQFzIQYLIAUgBnJFBEAgA0EQaiABQQAgBxD6BiADKAIUIQIgAygCECEIDAILIANBmAFqIgogARDNBCADKAKgASECIAMpA5gBIgtQDQAgAyADKAKkATYClAEgAyACNgKQASADIAs3A4gBQQAhAgJAAkAgBgRAIAQQyA0iAkUEQCABKAKAAiEBIANBADoAmAEgASABIAoQ6xQhAgwDCyACKAIAQSRGBEAgASABKQPgAjcDmAMgASgCyAIgAUElNgLIAkEkRw0CIAEoAswCIQIMAwsgASgCyAIhAiABQSU2AsgCIAEgASkD4AI3A5gDIANBpAFqIAFB1AJqKQIANwIAIANBrAFqIAFB3AJqKAIANgIAIAMgASkCzAI3ApwBIAMgAjYCmAEgA0GYAWoQvgogA0EIaiABQQAgBBClIBD6BiADKAIMIQIgAygCCA0CCyABKAKcAyEGIANBuAFqIANBiAFqEIMcIANBrAFqIANByAFqKQMANwIAIANBpAFqIANBwAFqKQMANwIAIAMgAykDuAE3ApwBQdgAQQgQjCAiBEESNgIAIAQgBToALCAEIAI2AiggBCAJIAYgBiAJSRs2AiQgBCAJIAYgBiAJSxs2AiAgBCADKQKYATcCBCAEQQxq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6ABqEOsUELYYIQULIANBtAI2ApwBIAMgBTYCuAFBASEIIANBATYCTCADQaju4AA2AkggA0IBNwJUIAMgA0G4AWo2ApgBIAMgA0GYAWo2AlAgA0HwAGogA0HIAGoQ3RQgA0EYaiAEEJ8UIAMgAjYCbCADQTQ6AGggAygCGCADKAIcIANB6ABqEOsUIQIgBBDjDSIERQ0EIAQoAgBBJEcNBCABIAEpA0A3A3ggASgCKCABQSU2AihBJEcNASABIAEoAiwQggwMBAsgBBC/ICEJIAQQ4w0iAkUNASACKAIAQQJHDQEgAi0ACA0BIAItAAlBFEcNASADQd0AaiABQZcDaikAADcAACADQdgAaiABQZIDaikAADcDACADQdAAaiABQYoDaikAADcDACADIAEpAIIDNwNIIAQQxhIiAkUNASACKAIAQQJHDQEgA0HIAGogAi0ACCACQQlqLQAAENUJDQEgBBDjDSICRQRAIAEoAtgCIQEgA0EAOgBoIAEgASADQegAahDrFCECDAMLIAIoAgBBJEYEQCABIAEpA0A3A3ggASgCKCABQSU2AihBJEYEQCABKAIsIQIMBAtBuePgAEEoQbjs3wAQ2hcACyABKAIoIQIgAUElNgIoIAEgASkDQDcDeCADQfQAaiABQTRqKQIANwIAIANB/ABqIAFBPGooAgA2AgAgAyABKQIsNwJsIAMgAjYCaCADQegAaiICEL8KQQEhBSAEEOMNDQEgASgC2AIhASADQQA6AGggASABIAIQ6xQhAgwCC0G54+AAQShBqOzfABDaFwALIANB/QBqIAFBlwNqKQAANwAAIANB+ABqIAFBkgNqKQAANwMAIANB8ABqIAFBigNqKQAANwMAIAMgASkAggM3A2gCQCAEEOMNIgJFDQAgAigCAEECRw0AIANB6ABqIAItAAggAkEJai0AABDVCQ0AIAQQxhIiAkUNACACKAIAQQJHDQAgAi0ACA0AIAItAAlBDkcNACAEEJ4hQQFzIQYLIAUgBnJFBEAgA0EQaiABQQAgBxD+BiADKAIUIQIgAygCECEIDAILIANBmAFqIgogARDPBCADKAKgASECIAMpA5gBIgtQDQAgAyADKAKkATYClAEgAyACNgKQASADIAs3A4gBQQAhAgJAAkAgBgRAIAQQ4w0iAkUEQCABKALYAiEBIANBADoAmAEg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IAAoAgQQiwMgASAFKAIUIgIgACgCDCIDIAIgA0kbIAIgAyACIANLGxDGGCAAQQRqIAEQlS0MBwsgASAAQQRqELgcDAYLIAEgAEEEahDMDgwFCyABIABBBGoQiRUMBAsgASAAQQRqEMwODAMLIABBBGogARC9GQwCCyACIANBvLzgABCbEAALIAAoAiAiAgRAIAEgAkEMaigCACACQRBqKAIAEJctCyAAKAIMQShsIQIgACgCCCEDA0AgAgRAIAMgARCWECACQShrIQIgA0EoaiEDDAELCyAAKAIQIgAoAgBBgICAgHhHBEAgACABEKcaDAELIABBBGogARCVLQsgBUEgaiQAC4YMAgl/A34jAEGgB2siAyQAIANB+ABqQdiW4wApAwAiDTcCACADQQA2AmwgA0KAgICAwAA3AmQgA0EAOgBgIANBATYCgAEgA0GUutgANgJcIANCgICAgBA3AlQgA0KAgICAwAA3AkwgA0ELNgIAIANB0JbjACkDACIONwJwIANBxANqQfzU2gBBBRCiESADQQo2AsADIANBwANqIgUQjx0hBCAFIAEgAhCiESADIAMgBCAFEFEiBjYChAEgA0GQAWpBADsBACADQgA3A4gBIANBADYCnAEgA0KAgICAwAA3ApQBIAUgBkEIahCmESADQaABaiIBIANBiAFqQQEgBUEAEMMFIAMgAy0AmwMgAy0AmANBAkZxOgDuBiADIAMpAaIDNwDgBiADIAMoAaoDNgDoBiADIAMvAa4DOwDsBiADIAMpALEDNwDvBiADIAMoALkDNgD3BiADIAMvAL0DOwD7BiABIANB4AZqIgQQyAggA0HoA2ogAUH0ARD2BiEBIAMoApQDIQIgA0HgBWogA0GYA2pBKBD2BhogA0HcA2ogDTcCACADIAI2AtwGIAMgAjYC2AYgAyACNgLcBSADQSU2ArAGIANBJTYCiAYgA0EANgLQAyADQoCAgICAATcDyAMgA0EANgLAAyADQQA6AOQDIAMgDjcC1AMgAyADLQDqBToA4AYgA0EAOgDhBiADIAMtAIYGOgD8BiADIAMpAuwFNwDiBiADIAMpAvQFNwDqBiADIAMpAvwFNwDyBiADIAMvAYQGOwD6BiABIAQQyAggARClICECAkACQCABEMgNIgFFBEAgAygCwAUhASADQQA6AIgHIAMgASABIANBiAdqEOsUNgKEByADQQE2AoAHDAELIANBADYCgAcgAyABNgKEByABKAIAQSNHDQAgAyADKQOgBjcD2AYgAygCiAYgA0ElNgKIBkEjRw0BIAMpA5AGIQwLIANBgAdqEKYjIANBiAdqIANBwANqQQFBAUEAEIYDAkAgAygCiAciB0GAgICAeEcEQCACIAMoAtwGIgEgASACSxshAiADKAKQByEJIAMoAowHIQoMAQsgAygCjAchAiAMENYmQYCAgIB4IQcLIANBsAZqIANBiAZqIANB4AZqIAMoAsQFEOYQIAMoAuQGIQEgA0GUAWogAygC6AYiBBDwHiADKAKYASADKAKcASILQQJ0aiABIARBAnQQ9gYaIANBADYC6AYgAyAEIAtqNgKcASABQQAQ8h4gAygC4AYgARC7KSADKALMAyADKALQAxCrHiADKALIAyADKALMAxDPKSADKALUAyADKALYAxD0FgJAIAMoAugDRQ0AIAMoAuwDBEAgA0HsA2oQuBQLIAMoAvADRQ0AIANB8ANqELkUCyADQfwDahCmICADKALEBRDsEyADKALIBRDsEyADKALMBRC9FyADKALQBRDTGBCmCRCmCQJAIAdBgICAgHhHBEAgA0HwAGohCCADQRBqIQQgA0EEaiEFIAlBMGwhAiAKIQEDQCACRQ0CIAJBMGshAiABEJwEIAFBMGohAQwACwALIAMgAjYC4AYgA0EBNgLEAyADQcDW2gA2AsADIANCATcCzAMgA0GOBTYCpAEgAyADQaABajYCyAMgAyADQeAGajYCoAEgA0HAA2pByNbaABChHQALIAwQ1iYgACAJNgIIIAAgCjYCBCAAIAc2AgAgBiAGKAIAIgBBAWs2AgAgAEEBRgRAIANBhAFqENALCyADKAJoIAMoAmwQuBcgAygCZCADKAJoELspIAgQggkgAygCWCEAIAMoAlwiASgCACICBEAgACACEQEACyABKAIEIgIEQCAAIAIgASgCCBC9EQsgAygCUCADKAJUELcXIAMoAkwgAygCUBDRKQJAIAMoAgAiAEELRg0AAkACQEEGIABBAmsiACAAQQlPG0ECaw4FAgICAgEACyAFIQQLIAQoAgAgBEEEaigCABCnJAsgAygCmAEiACADKAKcARDyHiADKAKUASAAELspIANBoAdqJAAPC0G54+AAQShBnPXfABDaFwALogoBB38jAEHgAGsiASQAAn8CQCAAKAIAIgVFDQACQCAAKAIIIgIgACgCBCIETw0AIAIgBWotAABB1QBHDQBBASEGIAAgAkEBaiICNgIICwJAAkACQCACIARJBEAgAiAFai0AAEHLAEYNAQsgBkUNAwwBCyAAIAJBAWoiAzYCCAJAAkAgAyAETw0AIAMgBWotAABBwwBHDQAgACACQQJqNgIIQQEhBEGQy9YAIQMMAQsgAUEoaiAAEL4DIAEoAigiAwRAIAEoAiwiBARAIAEoAjRFDQILAkAgACgCECICRQ0AIAJBuNDWAEEQEKUDRQ0AQQEMBgsgAEEAOgAEIABBADYCAEEADAULIAAoAhAhAgJAIAEtACwiBUUEQCACRQ0BIAJBuNDWAEEQEKUDRQ0BQQEMBgsgAkUNACACQcjQ1gBBGRClA0UNAEEBDAULIAAgBToABCAAQQA2AgBBAAwECyAGRQ0BCwJAIAAoAhAiAkUNACACQYzR1gBBBxClA0UNAEEBDAMLIANFDQELAkAgACgCECICRQ0AIAJBk9HWAEEIEKUDRQ0AQQEMAgsgAUEBOwEkIAEgBDYCICABQQA2AhwgAUEBOgAYIAFB3wA2AhQgASAENgIQIAFBADYCDCABIAQ2AgggASADNgIEIAFB3wA2AgAgAUEoaiABEKIFAn8gASgCKEUEQAJAIAEtACUNACABQQE6ACUCQCABLQAkQQFGBEAgASgCICEGIAEoAhwhBAwBCyABKAIgIgYgASgCHCIERg0BCyABKAIEIARqIQMgBiAEawwCC0Gc0dYAELwpAAsgASgCHCEFIAEgASgCMDYCHCADIAVqIQMgASgCLCAFawshBAJAIAIEQCACIAMgBBClAw0BCyABQcgAaiABQSBqKQIANwMAIAFBQGsgAUEYaikCADcDACABQThqIAFBEGopAgA3AwAgAUEwaiABQQhqKQIANwMAIAEgASkCADcDKAJAIAEtAE0EQCACIQUMAQsgAiEFIAIhAwNAIAEoAiwhBiABQdQAaiABQShqEKIFAn8gASgCVEUEQCABLQBNDQMgAUEBOgBNAkAgAS0ATEEBRgRAIAEoAkghBiABKAJEIQQMAQsgASgCSCIGIAEoAkQiBEYNBAsgASgCLCAEaiEHIAYgBGsMAQsgASgCRCEEIAEgASgCXDYCRCAEIAZqIQcgASgCWCAEawshBAJAIANFBEBBACEDDAELIANB+NrgAEEBEKUDDQMgAkUEQEEAIQVBACEDDAELIAIhBSACIQMgAiAHIAQQpQMNAwsgAS0ATUUNAAsLIAVFDQEgBUGs0dYAQQIQpQNFDQELQQEMAQsCQCAAKAIQIgJFDQAgAkGu0dYAQQMQpQNFDQBBAQwBCwJAAkACQCAAKAIAIgNFBEBBACEDDAELQQAhAgNAAkAgACgCCCIFIAAoAgRPDQAgAyAFai0AAEHFAEcNACAAIAVBAWo2AggMAgsCQCACRQ0AIAAoAhAiBUUNACAFQYDf4ABBAhClA0UNAEEBDAULIAAQjAINAiACQQFrIQIgACgCACIDDQALQQAhAwsgACgCECIFBEBBASAFQfCX4wBBARClAw0DGiAAKAIAIQMLIANFDQEgACgCCCICIAAoAgRPDQEgAiADai0AAEH1AEcNASAAIAJBAWo2AghBAAwCC0EBDAELAkAgACgCECICRQ0AIAJBsdHWAEEEEKUDRQ0AQQEMAQsgABCMAgsgAUHgAGokAAv3CwEEfyMAQcABayIEJAACQAJAAkACQCACIAMoAjARBQBB/wFxQQFrDgMCAAABCyAEQThqIABBkAFqLwAAOwEAIAQgACkAiAE3AzAMAgsgBEE4aiAAQaQBai8AADsBACAEIAApAJwBNwMwDAELIARBOGogAEGaAWovAAA7AQAgBCAAKQCSATcDMAsgBEEANgJEIARCgICAgBA3AjwCfwJAAkACQAJAAkACQAJAAkACQAJAIAAtAPMBIgVBAUYEQCAEQShqIAIgAygCOCIGEQAAIAQoAigiByAEKAIsELomIAcNAQsgBEEQaiACIAMoAiwRAAAgBCgCECIGRQ0JIAQoAhQhByAEIAY2AmQgBCAHNgJoIARB/ABqIARBOGovAQA7AQAgBEEBNgKsASAEQaju4AA2AqgBIARCATcCtAEgBEHcADYCnAEgBCAEKQMwNwJ0IAQgBEGYAWo2ArABIAQgBEHwAGo2ApgBIAQgBEHkAGo2AnAgBEE8aiAEQagBahCwJA0HIAVBAkcNBiAEQQhqIAIgAygCOCIDEQAAIAQoAggiBSAEKAIMELomIAUNAQwGCyAEQSBqIAIgBhEAACAEKAIgIgVFDQMgBCgCJCEGIAQgBTYCSCAEIAY2AkwgBEEYaiACIAMoAiwRAAAgBCgCGCICRQ0BIAQoAhwhAyAEIAI2ApgBIAQgAzYCnAEgBEECNgKsASAEQfzG3wA2AqgBIARCATcCtAEgBEHdADYCdCAEIARB8ABqNgKwASAEIARBmAFqNgJwIARB0ABqIARBqAFqEN0UIAQoApgBIAQoApwBEPIcDAILIAQgAiADEQAAIAQoAgAiAkUNAyAEKAIEIQMgBCACNgKIASAEIAM2AowBIARB/ABqIABBuAFqLwEAOwEAIARBAjYCrAEgBEHUxt8ANgKoASAEQgE3ArQBIARB3AA2ApwBIAQgACkCsAE3AnQgBCAEQZgBajYCsAEgBCAEQfAAajYCmAEgBCAEQYgBajYCcCAEQTxqIARBqAFqELAkIAQoAogBIAQoAowBEPIcRQ0EDAULIARB0ABqQQFBABCsFQsgBEEGIAAoAtgBIAAoAtABQYCAgIB4RiICGzYCYCAEQYzH3wAgACgC1AEgAhs2AlwgBEGUAWogBEE4ai8BADsBACAEIAQpAzA3AowBIAQgBEHQAGo2AogBIARBpAFqIABBuAFqLwEAOwEAIARB3gA2ArwBIARB3wA2ArQBIARB3QA2AqwBIAQgACkCsAE3ApwBIAQgBEGYAWo2ArgBIAQgBEGIAWo2ArABIAQgBEHIAGo2AqgBIAQgBEHcAGo2ApgBIARBADYCgAEgBEEENgJ0IARBoMffADYCcCAEQQM2AnwgBCAEQagBaiIANgJ4IARB5ABqIgMgBEHwAGoiAhDdFCAEQQE2AqwBIARBqO7gADYCqAEgBEIBNwK0ASAEQT42AnQgBCACNgKwASAEIAM2AnACQCAEQTxqIgMgABCwJA0AIARBAjYCrAEgBEHkxd8ANgKoASAEQgE3ArQBIARBPjYCdCAEIAI2ArABIAQgAzYCcCABIAAQsCQNACAEQQA2ArgBIARBATYCrAEgBEHkxt8ANgKoASAEQgQ3ArABIAEgBEGoAWoQsCQNACAEKAJkIAQoAmgQuCkgBCgCUCAEKAJUELgpIAQoAkggBCgCTBDyHAwGCyAEKAJkIAQoAmgQuCkgBCgCUCAEKAJUELgpIAQoAkggBCgCTBDyHAwEC0Hsxt8AELwpAAtBwMbfABC8KQALIARBAjYCrAEgBEHkxd8ANgKoASAEQgE3ArQBIARBPjYCdCAEIARB8ABqNgKwASAEIARBPGo2AnAgASAEQagBahCwJA0AIARBADYCuAEgBEEBNgKsASAEQeTG3wA2AqgBIARCBDcCsAEgASAEQagBahCwJA0AIAQoAmQgBCgCaBDyHAwCCyAEKAJkIAQoAmgQ8hwLIAQoAjwgBCgCQBC4KUEBDAELIAQoAjwgBCgCQBC4KUEACyAEQcABaiQAC4YLAQJ/IwBBEGsiAiQAAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAQQcgACgCACIAKAIAQQxrIgMgA0EmTxtBAWsOJQECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUACyACIABBBGo2AgwgAUHJodkAQQQgAkEMakHGAhDECgwlCyACIABBBGo2AgwgAUHFpuAAQQUgAkEMakHHAhDECgwkCyACIABBBGo2AgwgAUHOpuAAQQYgAkEMakHIAhDECgwjCyACIABBCGo2AgwgAUHhs98AQQIgAkEMakHJAhDECgwiCyACIABBBGo2AgwgAUHNodkAQQUgAkEMakHKAhDECgwhCyACIABBBGo2AgwgAUHSodkAQQYgAkEMakHLAhDECgwgCyACIABBBGo2AgwgAUHYodkAQQMgAkEMakHMAhDECgwfCyACIAA2AgwgAUHUpuAAQQYgAkEMakHNAhDECgweCyACIABBCGo2AgwgAUHbodkAQQYgAkEMakHOAhDECgwdCyACIABBCGo2AgwgAUHhodkAQQkgAkEMakHPAhDECgwcCyACIABBBGo2AgwgAUHqodkAQQQgAkEMakHQAhDECgwbCyACIABBBGo2AgwgAUHuodkAQQQgAkEMakHRAhDECgwaCyACIABBBGo2AgwgAUHyodkAQQMgAkEMakHSAhDECgwZCyACIABBBGo2AgwgAUH1odkAQQMgAkEMakHTAhDECgwYCyACIABBCGo2AgwgAUHApuAAQQUgAkEMakHUAhDECgwXCyACIABBCGo2AgwgAUH4odkAQQMgAkEMakHVAhDECgwWCyACIABBBGo2AgwgAUG7odkAQQMgAkEMakHWAhDECgwVCyACIABBBGo2AgwgAUH7odkAQQkgAkEMakHXAhDECgwUCyACIABBBGo2AgwgAUGEotkAQQUgAkEMakHYAhDECgwTCyACIABBCGo2AgwgAUHcs98AQQUgAkEMakHZAhDECgwSCyACIABBBGo2AgwgAUGJotkAQQUgAkEMakHaAhDECgwRCyACIABBBGo2AgwgAUGOotkAQQggAkEMakHbAhDECgwQCyACIABBBGo2AgwgAUGWotkAQQUgAkEMakHcAhDECgwPCyACIABBBGo2AgwgAUGbotkAQQUgAkEMakHdAhDECgwOCyACIABBCGo2AgwgAUGgotkAQQkgAkEMakHeAhDECgwNCyACIABBCGo2AgwgAUGpotkAQREgAkEMakHfAhDECgwMCyACIABBBGo2AgwgAUG6otkAQQggAkEMakHgAhDECgwLCyACIABBBGo2AgwgAUHCotkAQQogAkEMakHhAhDECgwKCyACIABBBGo2AgwgAUHMotkAQQsgAkEMakHiAhDECgwJCyACIABBBGo2AgwgAUHXotkAQQ8gAkEMakHjAhDECgwICyACIABBBGo2AgwgAUHmotkAQRAgAkEMakHkAhDECgwHCyACIABBBGo2AgwgAUH2otkAQQkgAkEMakHlAhDECgwGCyACIABBBGo2AgwgAUH/otkAQQQgAkEMakHmAhDECgwFCyACIABBBGo2AgwgAUGDo9kAQQ8gAkEMakHnAhDECgwECyACIABBBGo2AgwgAUGSo9kAQQsgAkEMakHoAhDECgwDCyACIABBCGo2AgwgAUGgltoAQQsgAkEMakHpAhDECgwCCyACIABBBGo2AgwgAUGdo9kAQQggAkEMakHqAhDECgwBCyACIABBBGo2AgwgAUHapuAAQQcgAkEMakG/AhDECgsgAkEQaiQAC+0KAg5/AX4jAEHQAGsiASQAAkACQAJAAkACQAJAAkACQAJAAkAgACgC/AUiByAAKAKABiICSQRAIAEgAjYCHCACQQNHDQEgAUEQaiAAKAKsAyIEQQRBBBClFCABQQA2AiggASABKQMQNwIgIAFBIGogBBC4HiABKAIkIAEoAigiBkECdGohAgNAIAMgBEZFBEAgAiADNgIAIAJBBGohAiADQQFqIQMMAQsLIAFBQGsgAyAGajYCACABIAEpAiA3AzggAUEANgJEIAAoAqgDIQhBBCEFQQQhAwNAIAMgBCADIARLGyEGAkAD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IQsgBEH3ADoAuAEgASALIAggBEG4AWoQvBkgBwRAIAkQmCkFIARBMGoQmBILDAALAAsgAhDqIgsgBEHgAWokAAuRCgILfwN+IwBB4AFrIgIkAAJAIAEtABRBAkcEQCABKAIYIQQgAkE0akHYluMAKQMAIg03AgAgAkHQluMAKQMAIg43AiwgAkEAOwFeIAJBADYCVCACQoCAgICAATcCTCACQQA6AEggAkEANgJEIAJCgICAgMAANwI8IAJBADYCKCACQoCAgICAATcCICACIAAvATw7AVwgAiAAKAI4NgJYIAJBEGogASkDACIPIAEoAhAiCBCkIyACQSBqIAIpAxAgAigCGEEBEIcGIAJB9ABqIA03AgAgAkEANgKUASACQoCAgICAATcCjAEgAkEAOgCIASACQQA2AoQBIAJCgICAgMAANwJ8IAJBADYCaCACIA43AmwgAkEAOwGeASACIAIvAVw7AZwBIAIgAigCWDYCmAEgAkKAgICAgAE3AmAgBEEYaiEJIARBDGogBCgCCEEGdCEBIAJBjAFqIQYgAkHMAGohBSACQTxqIQcgAkEsaiELIAQoAgQhAwJAA0AgAUUNASADKAIAIQwgAUFAaiEBIANBQGshAwJAIAxBAmsOAwABAAELCyACIA8gCBCkIyACQeAAaiACKQMAIAIoAggQtBALIAJB4ABqIgEQiBogBCABEI0aIAEgCRDdIwJAAkAgAigClAEiAQRAIAsgARDiKCACQaQBaiACKAKQASACKAKUARCZCiACIAIoAqQBNgK4ASACIAIoAqgBIgE2ArABIAIgASACKAKsAUEEdCIDaiIENgK8AQNAIANFDQIgAkHgAGogASkDACABKAIIELQQIANBEGshAyABQRBqIQEMAAsACyACQbABaiIBIAJB4ABqQSwQ9gYaIAcgARCCGiAGEPMiDAELIAIgBDYCtAEgAkGwAWoQ/RYgAi0ASEUEQCACQSBqIAIoApQBEPgdIAIgAigCjAE2ArgBIAIgAigCkAEiATYCsAEgAiABIAIoApQBQQR0IgNqIgQ2ArwBA0AgAwRAIAJBIGogASkDACABKAIIQQEQhwYgA0EQayEDIAFBEGohAQwBCwsgAiAENgK0ASACQbABaiIBEP0WIAEgAkHgAGpBLBD2BhogByABEIIaDAELIAJBuAFqIAZBCGooAgA2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IAJBCGogASgCKBCNAgJAIAIoAghBgICAgHhGBEAgAkEANgI4IAJCgICAgBA3AzAMAQsgAkE4aiACQRBqKAIANgIAIAIgAikCCDcDMAsgAkHQAGogASgCDBCNAgJAIAIoAlBBgICAgHhGBEAgAkEANgJIIAJCgICAgBA3A0AMAQsgAkHIAGogAkHYAGooAgA2AgAgAiACKQJQNwNACyACQT42AiwgAkE+NgIkIAJBAjYCDCACQbDB3wA2AgggAkICNwIUIAIgAkFAazYCKCACIAJBMGo2AiAgAiACQSBqNgIQIAAgAkEIahD4FCACKAJAIAIoAkQQpyQgAigCMCACKAI0EKckDAkLIAEoAghFBEAgAkEBNgIMIAJByMHfADYCCCACQgE3AhQgAkHFAjYCJCACIAFBEGo2AiAgAiACQSBqNgIQIAAgAkEIahD4FAwJCyACQSBqIAEoAgwQjQICQCACKAIgQYCAgIB4RgRAIAJBADYCWCACQoCAgIAQNwNQDAELIAJB2ABqIAJBKGooAgA2AgAgAiACKQIgNwNQCyACQT42AkQgAkEBNgIMIAJByMHfADYCCCACQgE3AhQgAiACQdAAajYCQCACIAJBQGs2AhAgACACQQhqEPgUIAIoAlAgAigCVBCnJAwICyABLQAYQQVHDQYLIAEoAhAhAQwBCwsgASgCCA0DIAAgAUEQahC4DQwECyACQdAAaiABKAIgEI0CAkAgAigCUEGAgICAeEYEQCACQQA2AkggAkKAgICAEDcDQAwBCyACQcgAaiACQdgAaigCADYCACACIAIpAlA3A0ALIAJBxQI2AiwgAkE+NgIkIAJBAjYCDCACQbDB3wA2AgggAkICNwIUIAIgAUEIajYCKCACIAJBQGs2AiAgAiACQSBqNgIQIAAgAkEIahD4FCACKAJAIAIoAkQQpyQMAwsgAkEIaiABKAIgEI0CAkAgAigCCEGAgICAeEYEQCACQQA2AjggAkKAgICAEDcDMAwBCyACQThqIAJBEGooAgA2AgAgAiACKQIINwMwCyACQdAAaiABKAIEEI0CAkAgAigCUEGAgICAeEYEQCACQQA2AkggAkKAgICAEDcDQAwBCyACQcgAaiACQdgAaigCADYCACACIAIpAlA3A0ALIAJBPjYCLCACQT42AiQgAkECNgIMIAJBsMHfADYCCCAC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GkEBIAAtAA4NABpBASAALQAPDQAaQQEgAC0AEA0AGkEBIAAtABENABpBASAALQASDQAaQQEgAC0AEw0AGkEBIAAtABQNABpBASAALQAVDQAaQQEgAC0AFg0AGkEBIAAtABcNABpBASAALQAYDQAaQQEgAC0AGQ0AGkEBIAAtABoNABpBASAALQAbDQAaQQEgAC0AHA0AGkEBIAAtAB0NABpBASAALQAeDQAaQQEgAC0AHw0AGkEBIAAtACANABpBASAALQAhDQAaQQEgAC0AIg0AGkEBIAAtACMNABpBASAALQAkDQAaQQEgAC0AJQ0AGkEBIAAtACYNABpBASAALQAnDQAaQQEgAC0AKA0AGkEBIAAtACkNABpBASAALQAqDQAaQQEgAC0AKw0AGkEBIAAtACwNABpBASAALQAtDQAaQQEgAC0ALg0AGkEBIAAtAC8NABpBASAALQAwDQAaQQEgAC0AMQ0AGkEBIAAtADINABpBASAALQAzDQAaQQEgAC0ANA0AGkEBIAAtADUNABpBASAALQA2DQAaQQEgAC0ANw0AGkEBIAAtADgNABpBASAALQA5DQAaQQEgAC0AOg0AGkEBIAAtADsNABpBASAALQA8DQAaQQEgAC0APQ0AGkEBIAAtAD4NABpBASAALQA/DQAaQQEgAC0AQA0AGkEBIAAtAEENABpBASAALQBCDQAaQQEgAC0AQw0AGkEBIAAtAEQNABpBASAALQBFDQAaQQEgAC0ARg0AGkEBIAAtAEcNABpBASAALQBIDQAaQQEgAC0ASQ0AGkEBIAAtAEoNABpBASAALQBLDQAaQQEgAC0ATA0AGkEBIAAtAE0NABpBASAALQBODQAaQQEgAC0ATw0AGkEBIAAtAFANABpBASAALQBRDQAaQQEgAC0AUg0AGkEBIAAtAFMNABpBASAALQBUDQAaQQEgAC0AVQ0AGkEBIAAtAFYNABpBASAALQBXDQAaQQEgAC0AWA0AGkEBIAAtAFkNABpBASAALQBaDQAaQQEgAC0AWw0AGkEBIAAtAFwNABpBASAALQBdDQAaQQEgAC0AXg0AGkEBIAAtAF8NABpBASAALQBgDQAaQQEgAC0AYQ0AGkEBIAAtAGINABpBASAALQBjDQAaQQEgAC0AZA0AGkEBIAAtAGUNABogAC0AZgsgAiACKAIAQQFrNgIA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AAMLIABBAWoMAQsgBUEANgIYQQEhAiAFQQE2AgwgBUHAssIANgIIIAVCBDcCECABKAIUIAEoAhggBUEIahCVJA0BIAAoAgQLIgAsAAkiBCAALQABIgZBBEdyIAAtAAAiB0EBcSAALQAFIghBBEdyckUEQEEAIQIMAQtBASECIAEoAhQiA0GwssIAQQIgASgCGCIJKAIMIgERAwANAAJAAkAgBkEERgRAIAhBBEYNAiAFIAAoAAU2AggMAQsgBSAAKAABNgIIIAVBCGogAyAJEPYHDQIgCEEERg0BIAUgACgABTYCCCADQeen4ABBASABEQMADQILIAVBCGogAyAJEOAHDQELAkAgBEEARyAHckEBcUUNAAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAdBAXFFBEAgBEUNGiAEQQFxRQRAIARBAnENAiAGQQRHIQIMCAsgBkEERw0EDAULIAZBBEcNAQwCCyAGQQRHDQQMBgsgA0Hnp+AAQQEgAREDAA0YCyADQbKywgBBASABEQMADRcgBEUNFiAEQQFxDQAgBEECcQ0CDAMLIANB56fgAEEBIAERAwANFgsgA0GzssIAQQEgAREDAA0VIARBAnFFDQELIANB56fgAEEBIAERAwBFDQEMFAsgBEEEcQ0BIARBCHFFDQYgAg0EDAcLIANBtLLCAEEBIAERAwANEiAEQQRxDQEgBEEIcQ0DDAQLIAJFDQELQQEhAiADQeen4ABBASABEQMADRALQQEhAiADQbWywgBBASABEQMADQ8gBEEIcUUNAQtBASECIANB56fgAEEBIAERAwBFDQIMDgsLIARBEHFFBEAgBEEgcUUNByACDQUMCAsgAg0BDAMLQQEhAiADQbaywgBBASABEQMADQsgBEEQcUUNAQtBASECIANB56fgAEEBIAERAwBFDQEMCgsgBEEgcQ0BDAILQQEhAiADQbeywgBBASABEQMADQggBEEgcUUNAQtBASECIANB56fgAEEBIAERAwBFDQIMBwsLIARBwABxRQ0DIAINAQwCC0EBIQIgA0G4ssIAQQEgAREDAA0EIARBwABxRQ0CC0EBIQIgA0Hnp+AAQQEgAREDAA0DC0EBIQIgA0G5ssIAQQEgAREDAA0CCyAEQQBODQAgAgRAQQEhAiAD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DQELIANBADYCGCADQShqIAIgA0EYakGIreAAQQEQlBMgAy0AKEEERwRAIAMpAygiB0L/AYNCBFINAQsgA0EoaiACIAUgBCABKAIoIAEoAiwQWyADLQAoQQRHBEAgAykDKCIHQv8Bg0IEUg0BCyADQShqIAIgA0EYakGJreAAQQEQlBMgAy0AKEEERg0BIAMpAygiB0L/AYNCBFENAQsgB0L/AYNCBFINAQsgAEEEOgAADAgLIAAgBzcCAAwHCyAAIAc3AgAMBgsgACAHNwIADAULIAAgBzcCAAwECyAAIAc3AgAMAwsgACAHNwIADAILIAAgBzcCAAwBCyAAIAc3AgALIANBMGokAAu3CAIJfwF+IwBBoAFrIgEkACABQgA3AiggAUKAgICAwAA3AiAgAUIINwIYIAFCADcCECABQoCAgIDAADcCCAJAAkACQANAIAJBAXEEQCABQYgBaiABKAIMIAEoAhAQ5AcgASgCiAEiA0GEgICAeEYEQCABQQhqEJggIQMgAEGEgICAeDYCACAAIAM2AgQMBQsgACABKQKMATcCBCAAQQxqIAFBlAFqKAIANgIAIAAgAzYCAAwDCyABQYgBaiIEIAIQwRwCQAJ/AkAgASgCiAFFBEAgASgCjAEhAyABQQA2AkAgAUKAgICAEDcDOCABQgA3AzAgBCABQTBqEMUQIAEoAogBDQFBgoCAgHgMAgsgACABKQOQATcDCCAAIAM2AgQgAEGAgICAeDYCAAwFCyABKAKQAUUNAUGDgICAeAshBCAAIAM2AgQgACAENgIADAMLIAFBCGogAxCeBSABQdgAaiABQUBrKAIANgIAIAFB0ABqIAFBOGopAwA3AwAgASABKQMwNwNIIANBA3QhCQNAIAFB4ABqIAFByABqEMUQIAEoAmBFBEBBASECDAILAkACQAJAAkACQAJAIAEoAmQiBEH+////B00EQCABKAJsIQYgASgCaCECIAEoAgwgASgCECIFIAMQrB8iBygCBEECaiIIQf7///8HSw0CIAcgCDYCBCACRQ0EIAEgAiAGEMIOIAEgASgCBCIFNgJ0IAEgASgCACICNgJwIAEoAhgiBiABKAIcIgcgAxCtHyACQQhqIgggBRCGBw0BIAYgByADEK4fIAIgAigCACIHQQFqNgIAIAdBAEgNBSACIAEoAnQiByAEENsHIAEo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AGshCSAGQdgAaiEGIAVBAWohBSABQdgAaiEBDAALAAsgAkHsAGoQgREgAigCECEDIAIoAhQhAQwACwALIAJBsAJqJAALiAgCCH8CfiMAQUBqIgIkACABQSxqIQUgACgCCEE4bCEIIAJBLGohBiACQRBqIQcgACgCBCEJQQAhAANAAkACQCAAIAhHBEAgAS0ANEEBRw0CAkACQAJAAkACQAJAAkBBBCAAIAlqIgMoAgBBBGsiBCAEQQdPG0EBaw4GAQIDBAUGAAsgASgCMBCnESEEIAdBCGpB2JbjACkDACIKNwIAIAdB0JbjACkDACILNwIAIAJBCGogCjcDACAGIAUpAgA3AgAgBkEIaiAFQQhqKAIANgIAIAJBAToAKCACIAE2AiAgAiAENgIkIAJBAToAOSACIAs3AwAgAiABLwA7OwA7IAEtADghBCACIAEtAD06AD0gAiAEOgA4IAJBAToAOiADQRxqIAIQtg0gA0EEaiACEIsaIANBGGogAhCwJSACEOEoDAgLIAEoAjAQpxEhBCAHQQhqQdiW4wApAwAiCjcCACAHQdCW4wApAwAiCzcCACACQQhqIAo3AwAgBiAFKQIANwIAIAZBCGogBUEIaigCADYCACACQQE6ACggAiABNgIgIAIgBDYCJCACQQE6ADkgAiALNwMAIAIgAS8AOzsAOyABLQA4IQQgAiABLQA9OgA9IAIgBDoAOCACQQE6ADogA0EcaiACELYNIANBBGogAhCLGiADQRhqIAIQsCUgAhDhKAwHCyADQRVqLQAARQ0FIANBEGogARC7KwwFCyADQRRqLQAAQQFGBEAgA0EEaiABELsrCyADQRBqIAEQsCUMBQsgA0E0ai0AAEEBRgRAIANBMGogARC7KwsgASADEKAVDAQLIAEoAjAQpxEhBCAHQQhqQdiW4wApAwAiCjcCACAHQdCW4wApAwAiCzcCACACQQhqIAo3AwAgBiAFKQIANwIAIAZBCGogBUEIaigCADYCACACQQE6ACggAiABNgIgIAIgBDYCJCACQQE6ADkgAiALNwMAIAIgAS8AOzsAOyABLQA4IQQgAiABLQA9OgA9IAIgBDoAOCACQQE6ADogA0EgaiACELYNIANBJGotAABBAUYEQCADQRBqIAIQuysLIANBBGogAhCLGiADQRxqIAIQsCUgAhDhKAwDCyAB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mSANAyADKAIUQZSr2ABBAiADKAIYKAIMEQMADQMLIAJBADoABCACQQE6AAYgAigCACIEKAIcIgBBBHFFBEBBASEAIAJBLGogBBCkGw0DDAILIAIgBjYCOCACIAQpAhQ3AjAgAkHE8cAANgJUIAIgBCkCCDcCRCAEKQIAIQcgAiAANgJYIAIgBCgCEDYCTCACIAQtACA6AFwgAiAHNwI8IAIgAkEwajYCUCACQSxqIAJBPGoQpBsNACACKAJQQd/xwABBAiACKAJUKAIMEQMARQ0BC0EBIQAMAQtBACEAIAJBADoABgsgAkEBOgAFIAIgADoABAwACwALigcCF38EfiMAQeAEayICJAAgAkEQaiABKAIMIAEoAhAQigsgASkDACEZIAEtACQhByACQRxqIAFBFGoQwQwgAiAHOgAsIAIgGTcCCCABKAKYAiELIAEoApQCIQwCQAJAIAEoAihBAUcEQEEAIQcMAQsgASgCLCIIBEAgCCAIKAIAQQFqIgQ2AgAgBEUNAgsgASgCMCIERQRAQQEhB0EAIQQMAQtBASEHIAQgBCgCAEEBaiIDNgIAIANFDQELIAEoApwCIQ0gASgCgAIhDiABKAL8ASEPIAEoAvQBIRAgASgC8AEhESABKALsASESIAEoAugBIRMgASgC+AEhFCABKQLEASEZIAEpAswBIRogASgC1AEhBSABKQI0IRsgAS8A5QEhBiABLQDnASEJIAEtAOQBIRUgAkG0A2ogAUE8ahCtECACQdgEaiABQeABai8BADsBACABLQDHAiEWIAEtAOIBIRcgAS8B4gEhAyABKQLYASEcIAEoAoQCIgogCigCAEEBaiIYNgIAIAIgFToA3AQgAiAJOgDfBCACIAY7AN0EIAIgGzcCrAMgAiAFNgLMBCACIBo3AsQEIAIgGTcCvAQgAiAcNwLQBCACIANBgP4DcUEPIAMgF0EPRhtB/wFxcjsB2gQgGEUNACABKAKIAiIDIAMoAgBBAWoiBTYCACAFRQ0AIAEoAowCIgUgBSgCAEEBaiIGNgIAIAZFDQAgASgCkAIiBiAGKAIAQQFqIgk2AgAgCUUNACACQccCaiABQb8CaikAADcAACACQcICaiABQboCaikBADcBACACQboCaiABQbICaikBADcBACACIAEpAaoCNwGyAiACQTxqIAJBrANqQbQBEPYG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AAA3AAAgBkEIaiAIQQhqKQAANwAAIARBAWshBCAQQgF9IBCDIRAMAAsACyAAIAJBEGpBmQVBIBCzBAtBAAsaIAJBQGskAAwBCxCPGwALCyADIAA2AkwgAyADQcQAajYCSCADQQhqIAEoAhAgASgCFCASIANByABqQZcFEOcHIAEoAhAhACADKAIMIQICQCADKAIIRQRAIAAgAkEFdGsiAEEIayALNgIAIABBEGsiACkDACEQIAAgETcDACADKQMwENYaDAELIAAgAmoiBC0AACEFIAMpAzAhECADKAI4IQcgBCASQhmIpyIEOgAAIAAgASgCFCACQQhrcWpBCGogBDoAACABIAEoAhxBAWo2AhwgASABKAIYIAVBAXFrNgIYIAAgAkEFdGsiAEEIayALNgIAIABBEGsgETcDACAAQRhrIAc2AgAgAEEgayAQNwMAQgAhEAsgEBDWJgwECyABIAIpAwAgAkEQaigCABCWHSABIAApAyggAEE4aigCABCWHQwDCyAAQRBqIAEQ8SMMAgsgAEEEaiABEOYsDAELAkACQCAAKAIIQQFrDgIBAgALIABBKGogARDrBQwBCyAAQShqIAEQ6ywLIANB0ABqJAALgQcBA38gAC0AKCEEIABBADoAKAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAQQcgASgCACICQQxrIgMgA0EmTxtBAWsOJAABAgMEBQYHCAkKCwweHg0ODxARHhITFB4eFRYXGBkaGxweHR4LIAEoAgxBBHQhAiABKAIIIQEDQCACRQ0eIAEoAgBBAkcEQCABQQxqIAAQpi0LIAFBEGohASACQRBrIQIMAAsACyABQQRqIAAQ1AsMHAsgACABQQhqEJMfDBsLIAFBBGogABCmLQwaCyABQQxqIAAQpi0MGQsgAUEEaiAAEKYtIAFBCGogABCmLQwYCyABQThqAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAJBAWsOCwECAwQFBgcICQsKAAsgAUEIaiAAEIQYDAoLIAFBCGogABCXHwwJCyABQQhqIAAQqSIMCAsgAUEEaiAAEKYtDAcLIAFBBGogABC8HAwGCyABQQRqIAAQpi0MBQsgAUEEaiAAEKYtDAQLIAFBBGogABCmLQwD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IgBFDQAgAEEFdCELIABBAWtB////P3FBAWohByACKAIIIQUgAigCACEAA0AgAEEEaigCACIBBEAgAygCICAAKAIAIAEgAygCJCgCDBEDAA0DCyADIAggCmoiAUEQaigCADYCHCADIAFBHGotAAA6ACwgAyABQRhqKAIANgIoIAFBDGooAgAhBEEAIQlBACEGAkACQAJAIAFBCGooAgBBAWsOAgACAQsgBEEDdCAFaiIMKAIADQEgDCgCBCEEC0EBIQYLIAMgBDYCECADIAY2AgwgAUEEaigCACEEAkACQAJAIAEoAgBBAWsOAgACAQsgBEEDdCAFaiIGKAIADQEgBigCBCEEC0EBIQkLIAMgBDYCGCADIAk2AhQgBSABQRRqKAIAQQN0aiIBKAIAIANBDGogASgCBBECAA0CIABBCGohACALIAhBIGoiCEcNAAsLIAcgAigCBE8NASADKAIgIAIoAgAgB0EDdGoiACgCACAAKAIEIAMoAiQoAgwRAwBFDQELQQEMAQtBAAsgA0EwaiQAC9cEAgx/An4jAEHwAGsiAiQAIAJBADYCECACQoCAgICAATcCCCABKAIEIQMgAUEANgIEIAIgAzYCFCACQTBqIQkgAkEYakEEciEHIAJBKWoiCkEHaiELQQghBEEAIQEDQAJAAkACQCADBEAgAygCAEEBRgRAIANBADYCACACQdAAaiIMIANBFGooAgA2AgAgAiADKQIMNwNIIAIgAykAGTcDOCACIANBIGopAAA3AD8gAy0AGCEIIAMoAgghBQJAIANBf0YNACADIAMoAgRBAWsiDTYCBCANDQAgA0EoQQgQvRELIAhBAkcNAiAFIQMLIAIgAzYCVCACQdgAaiADQQhqEIcRIAMoAiAiAwRAIAMgAygCAEEBaiIFNgIAIAVFDQMLIAJBKGogAkHoAGopAwA3AwAgAkEgaiACQeAAaikDADcDACACIAIpA1g3AxggAiADNgIwIAJB1ABqELkUDAMLIAAgAigCCDYCCCAAIAQ2AgQgACAENgIAIAAgBCABQRhsajYCDCACQRRqEJQnIAJB8ABqJAAPCyAHIAIpA0g3AgAgCiACKQM4NwAAIAsgAikAPzcAACAHQQhqIAwoAgA2AgAgAiAIOgAoIAIgBTYCGAwBCwALIAIoAgggAUYEQCACQQhqEPAWIAIoAgwhBAsg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NgJEIAJBMDoAQCACKAIAIAIoAgQgAkFAaxDrFCEDIAQQ4w0iBEUNByAEKAIAQSRGDQIMBwsgAkFAayABEM8EIAIoAkghASACKQNAIgVQRQRAIAIgAigCTDYCbCACIAE2AmggAiAFNwNgIAJBCGogAkHgAGoQgxxCACEFDAYLIABCAjcDACAAIAE2AggMBwsgAkFAayABEMUCIAIoAkAiAUEHRg0BIAJBOGoiBCACQdgAaikDADcDACACQTBqIgMgAkHQAGopAwA3AwAgAiACKQNINwMoIAENAiACQRhqIAQpAwA3AwAgAkEQaiADKQMANwMAIAIgAikDKDcDCEIBIQUMBAsgASABKQNANwN4IAEoAiggAUElNgIoQSRHDQIgASABKAIsEIIMDAQLIAIoAkQhASAAQgI3AwAgACABNgIIDAQLQbnj4ABBKEH0oOAAENoXAAtBuePgAEEoQZih4AAQ2hcACyACQSBqEPwjIAAgBTcDACAAIAIpAwg3AwggAEEQaiACQRBqKQMANwMAIABBGGogAkEYaikDADcDAAwCCyAAQgI3AwAgACADNgIICyACQSBqEPwjCyACQfAAaiQAC/oEAQJ/IwBBMGsiAyQAAn8CQAJAAkACQAJAAkACQAJAAkBBBiAAKAIAQQJrIgQgBEEJTxtBAWsOCAECAwQFBgcIAAsgA0EBNgIUIANBqO7gADYCECADQgE3AhwgA0GpAjYCDCADIAApAgg3AiggAyADQQhqNgIYIAMgA0EoajYCCCABIAIgA0EQahCVJAwICyADIABBBGo2AgggA0ECNgIUIANBpMXYADYCECADQgE3AhwgA0EINgIsIAMgA0EoajYCGCADIANBCGo2AiggASACIANBEGoQlSQMBwsgA0EANgIgIANBATYCFCADQcjF2AA2AhAgA0IENwIYIAEgAiADQRBqEJUkDAYLIANBADYCICADQQE2AhQgA0HYxdgANgIQIANCBDcCGCABIAIgA0EQahCVJAwFCyADQQA2AiAgA0EBNgIUIANB9MXYADYCECADQgQ3AhggASACIANBEGoQlSQMBAsgA0EANgIgIANBATYCFCADQZTG2AA2AhAgA0IENwIYIAEgAiADQRBqEJUkDAMLIAMgADYCCCADQQE2AhQgA0Go7uAANgIQIANCATcCHCADQaoCNgIsIAMgA0Eo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DAMLIARBnApBrNXAABCcEAALIANBAWshAwwBC0GABkGABkG81cAAEJsQAAsgAEEHaiIEIANqIQUgCK0hDgNAIAIiAUEBayECAkACQCABQYEGSQRAIAEgBGoxAAAgDoYgDXwiCyALQgqAIg1Cdn58IQwgAiADakGABkkNASAMUA0CIABBAToAiAYMAgsgAkGABkG8ycAAEJsQAAsgASAFaiAMPAAACyACDQALIAtCCloEQCADQQdqIQIDQCANIgsgC0IKgCINQnZ+fCEMAkAgAkEIa0GABk8EQCAMUA0BIABBAToAiAYMAQsgACACaiAMPAAACyACQQFrIQIgC0IKWg0ACwsgACAAKAIEIANqNgIEIABBgAYgACgCACADaiIBIAFBgAZPGyICNgIAIAFFDQAgAkEHaiECA0AgACACai0AAA0BIAAgAkEIazYCACACQQFrIgJBB0cNAAsLC+wEAgZ/AX4jAEHQAGsiAyQAIANBOGogARDNBCADKAJAIQQCQAJAAkACQAJAAkAgAykDOCIJUEUEQCADIAMoAkQ2AiwgAyAENgIoIAMgCTcDIEEBIQYgA0EYaiABQQFBABDGDiADKAIcIQcgAygCGARAIAchBAwFCyADQRBqIAFBgNzfAEGHqOAAQQEQrQcgAygCFCEIIAMoAhAEQCAIIQQMBAsgAyAINgI0IAFBKGoiBRDIDSIERQ0FAkACQCAEKAIAQQ5rDgIHAAELIAEoAsgCIQQgAUElNgLIAiABIAEpA+ACNwOYAyADQcQAaiABQdQCaikCADcCACADQcwAaiABQdwCaigCADYCACADIAEpAswCNwI8IAMgBDYCOCADQThqEL4KDAYLIAUQ6yANBSADQUBrIAUQgBAgA0EIaiAFEOoTIANB0LvgADYCPCADQTQ6ADggAygCCCADKAIMIANBOGoQ6xQhBCAFEMgNIgJFDQIgAigCAEEkRw0CIAEgASkD4AI3A5gDIAEoAsgCIAFBJTYCyAJBJEcNASABIAEoAswCEPsLDAILQQEhBgwFC0G54+AAQShBqObfABDaFwALIANBNGoQtwULIAcQvigLIAkQ1hoMAQsgASgCnAMhASADQThqIANBIGoQgxxBMEEIEIwgIgQgAiABIAEgAkkbNgIEIAQgAiABIAEgAksbNgIAQQAhBiAEQQA6ACggBCAINgIkIAQgBzYCICAEIAMpAzg3AwggBEEQaiADQUBrKQMANwMAIARBGGogA0HIAGopAwA3AwALIAAgBDYCBCAAIAY2AgAgA0HQAGokAAvMBAEEfyMAQYABayICJAAgASAAENkhIAEoAighASACQRhqQdiW4wApAwA3AgAgAkHQluMAKQMANwIQIAJBADsBQiACQQA2AjggAkKAgICAgAE3AjAgAkEAOgAsIAJBADYCKCACQoCAgIDAADcCICACQQA2AgwgAkKAgICAgAE3AgQgAiAALwE8OwFAIAIgACgCODYCPCABQQxqIAJBBGoiAxCIGiABIAMQjRogAyABQRhqEN0jIAJBMGohBAJAAkAgAigCOCIBBEAgAEEMaiABEOIoIAJBxABqIAIoAjQgAigCOBCZCiACIAIoAkQ2AlggAiACKAJIIgE2AlAgAiABIAIoAkxBBHQiA2oiBTYCXANAIANFDQIgAkEEaiABKQMAIAEoAggQtBAgA0EQayEDIAFBEGohAQwACwALIAJB0ABqIgEgAkEEakEsEPYGGiAAQRxqIAEQghogBBDzIgwBCyACIAU2AlQgAkHQAGoQ/RYgAC0AKEUEQCAAIAIoAjgQ+B0gAiACKAIwNgJYIAIgAigCNCIBNgJQIAIgASACKAI4QQR0IgNqIgQ2AlwDQCADBEAgACABKQMAIAEoAghBARCHBiADQRBrIQMgAUEQaiEBDAELCyACIAQ2AlQgAkHQAGoiARD9FiABIAJBBGpBLBD2BhogAEEcaiABEIIaDAELIAJB2ABqIARBCGooAgA2AgAgAiAEKQIANwNQIABBLGogAkHQAGoiARCPECABIAJBBGpBLBD2BhogAEEcaiABEIIaCyACQYABaiQAC98EAgZ/AX4jAEHQAGsiAyQAIANBOGogARDPBCADKAJAIQQCQAJAAkACQAJAAkAgAykDOCIJUEUEQCADIAMoAkQ2AiwgAyAENgIoIAMgCTcDIEEBIQYgA0EYaiABQQFBABDKDiADKAIcIQcgAygCGARAIAchBAwFCyADQRBqIAFBgNzfAEGHqOAAQQEQrgcgAygCFCEIIAMoAhAEQCAIIQQMBAsgAyAINgI0IAFBKGoiBRDjDSIERQ0FAkACQCAEKAIAQQ5rDgIHAAELIAEoAighBCABQSU2AiggASABKQNANwN4IANBxABqIAFBNGop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ahCBGiACQTBqIQQCQAJAIAIoAjgiAQRAIABBDGogARDiKCACQcQAaiACKAI0IAIoAjgQmQogAiACKAJENgJYIAIgAigCSCIBNgJQIAIgASACKAJMQQR0IgNqIgU2AlwDQCADRQ0CIAJBBGogASkDACABKAIIELQQIANBEGshAyABQRBqIQEMAAsACyACQdAAaiIBIAJBBGpBLBD2BhogAEEcaiABEIIaIAQQ8yIMAQsgAiAFNgJUIAJB0ABqEP0WIAAtAChFBEAgACACKAI4EPgdIAIgAigCMDYCWCACIAIoAjQiATYCUCACIAEgAigCOEEEdCIDaiIENgJcA0AgAwRAIAAgASkDACABKAIIQQEQhwYgA0EQayEDIAFBEGohAQwBCwsgAiAENgJUIAJB0ABqIgEQ/RYgASACQQRqQSwQ9gYaIABBHGogARCCGgwBCyACQdgAaiAEQQhqKAIANgIAIAIgBCkCADcDUCAAQSxqIAJB0ABqIgEQjxAgASACQQRqQSwQ9gYaIABBHGogARCCGgsgAkGAAWokAAvCBAIFfwJ+IwBBgAFrIgIkACABKAIYQQxqIAAQhxogAEEsaiEDIAFBGGohBAJAIAEtABRBAkcEQCAAKAIwEKcRIQUgAkEYakHYluMAKQMAIgc3AwAgAkEIaiAHNwMAIAJBNGoiBiADQQhqKAIANgIAIAJBAToAKCACIAA2AiAgAiAFNgIkIAJBAToAOSACQdCW4wApAwAiCDcDECACIAg3AwAgAiADKQIANwIsIAIgAC0APDoAPCACIAAvATo7ATogAC0AOCEDIAIgAC0APToAPSACIAM6ADggAiABQQMQ6hUgAigCMBCnESEAIAJB2ABqIAc3AwAgAkHIAGogBzcDACACQfQAaiAGKAIANgIAIAJBAToAaCACIAA2AmQgAkEBOgB5IAIgCDcDUCACIAg3A0AgAiACKQIsNwJsIAIgAi0APDoAfCACIAIvATo7AXogAiACNgJgIAItADghACACIAItAD06AH0gAiAAOgB4IAQgAkFAayIAENUDIAAQ4SggAhDhKAwBCyAAKAIwEKcRIQEgAkHYAGpB2JbjACkDACIHNwMAIAJByABqIAc3AwAgAkH0AGogA0EIaigCADYCACACQQE6AGggAiAANgJgIAIgATYCZCACQQE6AHkgAkHQluMAKQMA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AwsgACgCBCICKAIsKAIAQQZNDQMMAgsgACgCBCICKAIIDQEMAgsgACgCBCICKAIIRQ0BC0EIEM0gIQMgABDrFjYCBCAAQQA2AgAgAyACNgIEIAMgBDYCACABQQE2AhAgASADNgIMIAFBATYCCANAIAEgAUEIahDYFQJAAkACQAJAAkAgASgCACICQQxHBEAgASABKAIEIgA2AhggASACNgIUIAJBCGsOBAECAwQFCyABQQhqEL4mDAYLIAAoAiQhABDrFiECIAAoAgQhAyAAIAI2AgQgACgCACECIABBADYCACABQQhqIAIgAxDDGAwDCyAAKAIsIQAQ6xYhAiAAKAIEIQMgACACNgIEIAAoAgAhAiAAQQA2AgAgAUEIaiACIAMQwxgMAgsgACgCCCECIABBADYCCCABQQA2AiwgASAANgIkIAEgAjYCKCABIAAoAgQiADYCHCABIAAgAkEDdGo2AiAgAUEIaiABQRxqEMMJDAELIAAoAgghAiAAQQA2AgggAUEANgIsIAEgADYCJCABIAI2AiggASAAKAIEIgA2AhwgASAAIAJBA3RqNgIgIAFBCGogAUEcahDDCQsgAUEUahDmBwwACwALIAFBMGokAAvZAwICfwN+IwBBgAJrIgQkAAJAIAIoAgBFBEAgAi0ARUEDRw0BC0G54+AAQShBhLXfABDaFwALIARBGGogAkEQaikDADcDACAEQSBqIAJBGGopAwAiBjcDACAEIAIpAwgiBzcDECACKQNIIQggBCAHIAanEKQjIARBKGoiBSAEKQMAIAQoAgggAkEgahDIBCAEQUBrIARBEGoiAkEAQQAgAUEQaiABKQMQUCIBG0EAIAMbIAEbEOYFQcAAQQgQjCAgBEHQAGoiAyACELUbIARBkAFqIgIgAxDuFSACQcAAEPYGIQEgBEEBNgJYIAQgATYCVCAEQQE2AlAgAiADIAUQmwpBEEEEEIwgIgFBCGogBEHIAGopAgA3AgAgASAEKQJANwIAIARBATYCXCAEIAE2AlggBEEBNgJUIAIQwhUhASAEQfQAakIANwIAIARCADcCbCAEQQU6AGggBCABNgJgIARBFzYCUCAEQgA3AvABIARBAzoA7AEgBEEANgLoASAEQgA3AvgBIARCADcC4AEgBEKAgICAwAA3AtgBIARB5AFqEMElIARB2AFqEMwmIAMQ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IB8tAD0hCSAfKAIEId4BIB8oAgAhNiAfKAIUIUUgHygCECE3IB8oAgwhCiAfKAIIIRcgHy0AQiEOIANB4ABqIB8oAkgiBSgCBCAFKAIIEMIOIAMoAmQh7wQgAygCYCHrBCADQc0BakGCBDsAACADQYKEiBA2AMkBIANBCjoAzwEgA0EBOgDIASADQvoBNwLQASADQQM6AMYBIANCgoSIkKDAgIECNwG+ASADQQA6ALwBIANBAzoAuAEgA0ECNgKkASADQQI2ApwBIANBAjYClAEgA0ECNgKMASADQQA2AoQBIAMgBjYCsAQgAyAjNgKsBCADIBg2AqgEIAMgEjoAtAQgEkEDRgRAIANBqARqELIkQQMhEgsgA0HJAWoh3wEgAygCkAEhCCADKAKYASEQIAMoAqABIeMBIAMoAqgBIeABIAMtAL0BIQsgAygCiAEhBSADQawBaiLzBBCyJCADIEA6ANQBIAMgDjoAxgEgAyAPOgDFASADIN0BOgDEASADIB46AMMBIAMgBDoAwgEgAyAJOgDBASADIBk6AMABIANBgQI7Ab4BIAMgEjoAuAEgAyAGNgK0ASADICM2ArABIAMgGDYCrAEgAyA2NgKEASADIN4BIAUgNhs2AogBIAMgBzoAvAEgAyBEIAsgB0EBcRs6AL0BIAMgEzYCpAEgAyDgASAMIBNBAkYbNgKoASADIBY2ApwBIAMg4wEgHSAWQQJGGzYCoAEgAyA3NgKUASADIBAgRSA3QQJGGzYCmAEgAyAXNgKMASADIAggCiAXQQJGGzYCkAEgAyAiOgDVASADIBE2AtABIANBAkEAIBVBAXEbOgDNASADQQFBAiAgQQFxGzoAzgEgA0EBQQIgJkEBcRs6AMoBIANBAUECICtBAXEbOgDJASADICE6AM8BIANBAUECIENBAXEbOgDLASADQQFBAiANQQFxGzoAzAEgA0EBOgDIASADIO8ENgLcASADIOsEQQhqNgLYASADQQA2AugBIANCgICAgMAANwLgASADQQA2AvQBIANCgICAgMAANwLsASADQoCAgIAQNwLICiADIANB4AFqIkM2AsQKIAMgA0HYAWo2AsAKIANB1ARqIS4gA0HYBGohQCADQbQEaiE2IANBsARqITogA0HsBGohJiADQaADaiE3IANBmAJqISsgA0GIAmohIQNAIANB2ABqIANBwApqEKgPIAMoAlwiBUUEQCADQoCAgIAQNwLAAyADIEM2ArwDIANBADYC2AMgA0IANwLQAyADIAMoAuQBIgU2AsgDIAMgBSADKALoAUEDdGo2AswDIAMgA0HYAWo2ArgDIANBrARqISEgA0GMAmohHSADQbwEaiERIANBsARqIQwgA0G0CmohBCADQaADaiEJIANBiANqIQogA0H8AWohHgNAIANBMGogA0G4A2oQqA8gA0HkAmohBQJ/QQAgAygCNCIGRQ0AGkEAIAMoAsgDIgsgAygCzANGDQAaIAMoAjAhDSADIAY2AuQCIAMgC0EIajYCyAMgA0HgAmohBSALCyEGIAUgBjYCACADKALkAiIFRQRAQQMhCyADLQDAASEbIAMtAL8BIRwgAy0AvgEhKCADKAL0ASEYIAMoAvABIQUgAy0AuAEiB0EDRwRAIAdBAkcEQCADKAKsASLeASDeASgCACINQQFqNgIAIA1BAEgNBiADKAKwASHjASADKAK0ASHgAQsgByELCyADLQC9ASEuIAMtALwBITIgAy0AxQEhOCADLQDEASE6IAMtAMMBIRMgAygCqAEhFiADKAKkASE2IAMoAqABITcgAygCnAEhFyADLQDCASHfASADLQDBASEZIAMoAogBISIgAygChAEhFSADKAKYASFAIAMoApQBISAgAygCkAEhQyADKAKMASEmIAMtAMYBISsgA0EIaiAYQQQQqBRBACENIANBADYCsAQgAyADKAIMIuwENgKsBCADIAMoAggi6AQ2AqgEAkACQCAYIOgESwRAIANBqARqQQAgGEEEQQQQkRcgAygCsAQhDSADKAKsBCHsBAwBCyAYRQ0BCyANIBhqIOwEIA1BAnRqIRIDQCASIAU2AgAgBUEcaiEFIBJBBGohEiAYQQFrIhgNAAsgAygCrAQh7AQgAygCqAQh6AQhDQtBACEYIANBADYCpAQgA0KAgICAwAA3ApwEIA1BAnQhB0EEISNBACEGA0AgByAYRgRAIAMgAygCoAQiBTYCsARBACESIANBADYCqAQgAyAFIAZBAnRqNgK0BCADQagEahD/EiEHIANBqARqEP8SIgUEfyAFKAIAKAIAIgUoAhQh3QEgBSgCEAVBAAshOyADKAKoBCEYIAMoArQEISEgAygCsAQhCCADKAKsBCEQQQEhBkEBISNB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LQAAIVAgAkH3DmotAAAhUSACQf8Oai0AACFSIAJBhw9qLQAAIVMgAkGPD2otAAAhVCACQZcPai0AACFVIAJBnw9qLQAAIVYgAkGnD2otAAAhVyACQa8Pai0AACFYIAJBtw9qLQAAIVkgAkG/D2otAAAhWiACQccPai0AACFbIAJBzw9qLQAAIVwgAkHXD2otAAAhXSACQd8Pai0AACFeIAJB5w9qLQAAIV8gAkHvD2otAAAhYCACQfcPai0AACFhIAJB/w9qLQAAIWIgAkGHEGotAAAhYyACQY8Qai0AACFkIAJBlxBqLQAAIWUgAkGfEGotAAAhZiACQacQai0AACFnIAJBrxBqLQAAIWggAkG3EGotAAAhaSACQb8Qai0AACFqIAJBxxBqLQAAIWsgAkHPEGotAAAhbCACQdcQai0AACFtIAJB3xBqLQAAIW4gAkHnEGotAAAhbyACQe8Qai0AACFwIAJB9xBqLQAAIXEgAkH/EGotAAAhciACQYcRai0AACFzIAJBjxFqLQAAIXQgAkGXEWotAAAhdSACQZ8Rai0AACF2IAJBpxFqLQAAIXcgAkGvEWotAAAheCACQbcRai0AACF5IAJBvxFqLQAAIXogAkHHEWotAAAheyACQc8Rai0AACF8IAJB1xFqLQAAIX0gAkHfEWotAAAhfiACQecRai0AACF/IAItAOQRIbwCIAIoAuARIb0CIAItANwRIb4CIAIoAtgRIb8CIAItANQRIcACIAIoAtARIcECIAItAMwRIcICIAIoAsgRIcMCIAItAMQRIcQCIAIoAsARIcUCIAItALwRIcYCIAIoArgRIccCIAItALQRIcgCIAIoArARIckCIAItAKwRIcoCIAIoAqgRIcsCIAItAKQRIcwCIAIoAqARIc0CIAItAJwRIc4CIAIoApgRIc8CIAItAJQRIdACIAIoApARIdECIAItAIwRIdICIAIoAogRIdMCIAItAIQRIdQCIAIoAoARIdUCIAItAPwQIdYCIAIoAvgQIdcCIAItAPQQIdgCIAIoAvAQIdkCIAItAOwQIdoCIAIoAugQIdsCIAItAOQQIdwCIAIoAuAQId0CIAItANwQId4CIAIoAtgQId8CIAItANQQIeACIAIoAtAQIeECIAItAMwQIeICIAIoAsgQIeMCIAItAMQQIeQCIAIoAsAQIeUCIAItALwQIeYCIAIoArgQIecCIAItALQQIegCIAIoArAQIekCIAItAKwQIeoCIAIoAqgQIesCIAItAKQQIewCIAIoAqAQIe0CIAItAJwQIe4CIAIoApgQIe8CIAItAJQQIfACIAIoApAQIfECIAItAIwQIfICIAIoAogQIfMCIAItAIQQIfQCIAIoAoAQIfUCIAItAPwPIfYCIAIoAvgPIfcCIAItAPQPIfgCIAIoAvAPIfkCIAItAOwPIfoCIAIoAugPIfsCIAItAOQPIfwCIAIoAuAPIf0CIAItANwPIf4CIAIoAtgPIf8CIAItANQPIYADIAIoAtAPIYEDIAItAMwPIYIDIAIoAsgPIYMDIAItAMQPIYQDIAIoAsAPIYUDIAItALwPIYYDIAIoArgPIYcDIAItALQPIYgDIAIoArAPIYkDIAItAKwPIYoDIAIoAqgPIYsDIAItAKQPIYwDIAIoAqAPIY0DIAItAJwPIY4DIAIoApgPIY8DIAItAJQPIZADIAIoApAPIZEDIAItAIwPIZIDIAIoAogPIZMDIAItAIQPIZQDIAIoAoAPIZUDIAItAPwOIZYDIAIoAvgOIZcDIAItAPQOIZgDIAIoAvAOIZkDIAItAOwOIZoDIAIoAugOIZsDIAItAOQOIZwDIAIoAuAOIZ0DIAItANwOIZ4DIAIoAtgOIZ8DIAItANQOIaADIAIoAtAOIaEDIAItAMwOIaIDIAIoAsgOIaMDIAItAMQOIaQDIAIoAsAOIaUDIAItALwOIaYDIAIoArgOIacDIAItALQOIagDIAIoArAOIakDIAItAKwOIaoDIAIoAqgOIasDIAItAKQOIawDIAIoAqAOIa0DIAItAJwOIa4DIAIoApgOIa8DIAItAJQOIbADIAIoApAOIbEDIAItAIwOIbIDIAIoAogOIbMDIAItAIQOIbQDIAIoAoAOIbUDIAItAPwNIbYDIAIoAvgNIbcDIAItAPQNIbgDIAIoAvANIbkDIAItAOwNIboDIAIoAugNIbsDIAItAOQNIbwDIAIoAuANIb0DIAItANwNIb4DIAIoAtgNIb8DIAItANQNIcADIAIoAtANIcEDIAItAMwNIcIDIAIoAsgNIcMDIAItAMQNIcQDIAIoAsANIcUDIAItALwNIcYDIAIoArgNIccDIAItALQNIcgDIAIoArANIckDIAItAKwNIcoDIAIoAqgNIcsDIAItAKQNIcwDIAIoAqANIc0DIAItAJwNIc4DIAIoApgNIc8DIAItAJQNIdADIAIoApANIdEDIAItAIwNIdIDIAIoAogNIdMDIAItAIQNIdQDIAIoAoANIdUDIAItAPwMIdYDIAIoAvgMIdcDIAItAPQMIdgDIAIoAvAMIdkDIAItAOwMIdoDIAIoAugMIdsDIAIvAO0MIAIvAPUMIAIvAP0MIAIvAIUNIAIvAI0NIAIvAJUNIAIvAJ0NIAIvAKUNIAIvAK0NIAIvALUNIAIvAL0NIAIvAMUNIAIvAM0NIAIvANUNIAIvAN0NIAIvAOUNIAIvAO0NIAIvAPUNIAIvAP0NIAIvAIUOIAIvAI0OIAIvAJUOIAIvAJ0OIAIvAKUOIAIvAK0OIAIvALUOIAIvAL0OIAIvAMUOIAIvAM0OIAIvANUOIAIvAN0OIAIvAOUOIAIvAO0OIAIvAPUOIAIvAP0OIAIvAIUPIAIvAI0PIAIvAJUPIAIvAJ0PIAIvAKUPIAIvAK0PIAIvALUPIAIvAL0PIAIvAMUPIAIvAM0PIAIvANUPIAIvAN0PIAIvAOUPIAIvAO0PIAIvAPUPIAIvAP0PIAIvAIUQIAIvAI0QIAIvAJUQIAIvAJ0QIAIvAKUQIAIvAK0QIAIvALUQIAIvAL0QIAIvAMUQIAIvAM0QIAIvANUQIAIvAN0QIAIvAOUQIAIvAO0QIAIvAPUQIAIvAP0QIAIvAIURIAIvAI0RIAIvAJURIAIvAJ0RIAIvAKURIAIvAK0RIAIvALURIAIvAL0RIAIvAMURIAIvAM0RIAIvANURIAIvAN0RIAIvAOURIPIEEMQYIAJBjwdqLQAAIfAEIAJBlwdqLQAAIfEEIAJBnwdqLQAAIUIgAkGnB2otAAAh5wEgAkGvB2otAAAhMSACQbcHai0AACGFAiACQb8Hai0AACHuBCACQccHai0AACESIAJBzwdqLQAAISMgAkHXB2otAAAhLCACQd8Hai0AACEtIAJB5wdqLQAAIS8gAkHvB2otAAAhMyACQfcHai0AACE7IAJB/wdqLQAAIUEgAkGHCGotAAAhPCACQY8Iai0AACFEIAJBlwhqLQAAIUUgAkGfCGotAAAhzwEgAkGnCGotAAAh0AEgAkGvCGotAAAh0QEgAkG3CGotAAAh0gEgAkG/CGotAAAh0wEgAkHHCGotAAAh1AEgAkHPCGotAAAh1QEgAkHXCGotAAAh1gEgAkHfCGotAAAh1wEgAkHnCGotAAAh2AEgAkHvCGotAAAh2QEgAkH3CGotAAAh2gEgAkH/CGotAAAh2wEgAkGHCWotAAAh3QEgAkGPCWotAAAh3gEgAkGXCWotAAAh4QEgAkGfCWotAAAh4wEgAkGnCWotAAAh4AEgAkGvCWotAAAh5AEgAkG3CWotAAAh5QEgAkG/CWotAAAh6AEgAkHHCWotAAAh6QEgAkHPCWotAAAh6gEgAkHXCWotAAAh6wEgAkHfCWotAAAh7AEgAkHnCWotAAAh7QEgAkHvCWotAAAh7gEgAkH3CWotAAAh7wEgAkH/CWotAAAh8AEgAkGHCmotAAAh8QEgAkGPCmotAAAh8gEgAkGXCmotAAAh8wEgAkGfCmotAAAh9AEgAkGnCmotAAAh9QEgAkGvCmotAAAh9gEgAkG3CmotAAAh9wEgAkG/CmotAAAh+AEgAkHHCmotAAAh+QEgAkHPCmotAAAh+gEgAkHXCmotAAAh+wEgAkHfCmotAAAh/AEgAkHnCmotAAAh/QEgAkHvCmotAAAh/gEgAkH3CmotAAAh/wEgAkH/CmotAAAhgAIgAkGHC2otAAAhMCACQY8Lai0AACGCAiACQZcLai0AACGGAiACQZ8Lai0AACGHAiACQacLai0AACGIAiACQa8Lai0AACGJAiACQbcLai0AACGKAiACQb8Lai0AACGLAiACQccLai0AACGMAiACQc8Lai0AACGNAiACQdcLai0AACGOAiACQd8Lai0AACGPAiACLQDcCyHcAyACKALYCyHdAyACLQDUCyHeAyACKALQCyHfAyACLQDMCyHgAyACKALICyHhAyACLQDECyHiAyACKALACyHjAyACLQC8CyHkAyACKAK4CyHlAyACLQC0CyHmAyACKAKwCyHnAyACLQCsCyHoAyACKAKoCyHpAyACLQCkCyHqAyACKAKgCyHrAyACLQCcCyHsAyACKAKYCyHtAyACLQCUCyHuAyACKAKQCyHvAyACLQCMCyHwAyACKAKICyHxAyACLQCECyHyAyACKAKACyHzAyACLQD8CiH0AyACKAL4CiH1AyACLQD0CiH2AyACKALwCiH3AyACLQDsCiH4AyACKALoCiH5AyACLQDkCiH6AyACKALgCiH7AyACLQDcCiH8AyACKALYCiH9AyACLQDUCiH+AyACKALQCiH/AyACLQDMCiGABCACKALICiGBBCACLQDECiGCBCACKALACiGDBCACLQC8CiGEBCACKAK4CiGFBCACLQC0CiGGBCACKAKwCiGHBCACLQCsCiGIBCACKAKoCiGJBCACLQCkCiGKBCACKAKgCiGLBCACLQCcCiGMBCACKAKYCiGNBCACLQCUCiGOBCACKAKQCiGPBCACLQCMCiGQBCACKAKICiGRBCACLQCECiGSBCACKAKACiGTBCACLQD8CSGUBCACKAL4CSGVBCACLQD0CSGWBCACKALwCSGXBCACLQDsCSGYBCACKALoCSGZBCACLQDkCSGaBCACKALgCSGbBCACLQDcCSGcBCACKALYCSGdBCACLQDUCSGeBCACKALQCSGfBCACLQDMCSGgBCACKALICSGhBCACLQDECSGiBCACKALACSGjBCACLQC8CSGkBCACKAK4CSGlBCACLQC0CSGmBCACKAKwCSGnBCACLQCsCSGoBCACKAKoCSGpBCACLQCkCSGqBCACKAKgCSGrBCACLQCcCSGsBCACKAKYCSGtBCACLQCUCSGuBCACKAKQCSGvBCACLQCMCSGwBCACKAKICSGxBCACLQCECSGyBCACKAKACSGzBCACLQD8CCG0BCACKAL4CCG1BCACLQD0CCG2BCACKALwCCG3BCACLQDsCCG4BCACKALoCCG5BCACLQDkCCG6BCACKALgCCG7BCACLQDcCCG8BCACKALYCCG9BCACLQDUCCG+BCACKALQCCG/BCACLQDMCCHABCACKALICCHBBCACLQDECCHCBCACKALACCHDBCACLQC8CCHEBCACKAK4CCHFBCACLQC0CCHGBCACKAKwCCHHBCACLQCsCCHIBCACKAKoCCHJBCACLQCkCCHKBCACKAKgCCHLBCACLQCcCCHMBCACKAKYCCHNBCACLQCUCCHOBCACKAKQCCHPBCACLQCMCCHQBCACKAKICCHRBCACLQCECCHSBCACKAKACCHTBCACLQD8ByHUBCACKAL4ByHVBCACLQD0ByHWBCACKALwByHXBCACLQDsByHYBCACKALoByHZBCACLQDkByHaBCACKALgByHbBCACLQDcByHcBCACKALYByHdBCACLQDUByHeBCACKALQByHfBCACLQDMByHgBCACKALIByHhBCACLQDEByHiBCACKALAByHjBCACLQC8ByHkBCACKAK4ByHlBCACLQC0ByHmBCACKAKwByHnBCACLQCsByHpBCACKAKoByHqBCACLQCkByFGIAIoAqAHITkgAi0AnAch4gEgAigCmAchPyACLQCUByEQIAIoApAHISogAi0AjAchPiACKAKIByEKIAIoAoQHIeYBIAIoAoAHITUgAigC/AYhHSACKAL4BiE0IAIoAvQGIQcgAigC8AYhJyACKALsBiEMIAIoAugGIQQgAigC5AYhhAIgAigC4AYhPSACKQPYBiGLBSACLwCNByGQAiACLwCVByGRAiACLwCdByGSAiACLwClByGTAiACLwCtByGUAiACLwC1ByGVAiACLwC9ByGWAiACLwDFByGXAiACLwDNByGYAiACLwDVByGZAiACLwDdByGaAiACLwDlByGbAiACLwDtByGcAiACLwD1ByGdAiACLwD9ByGeAiACLwCFCCGfAiACLwCNCCGgAiACLwCVCCGhAiACLwCdCCGiAiACLwClCCGjAiACLwCtCCGkAiACLwC1CCGlAiACLwC9CCGmAiACLwDFCCGnAiACLwDNCCGoAiACLwDVCCGpAiACLwDdCCGqAiACLwDlCCGrAiACLwDtCCGsAiACLwD1CCGtAiACLwD9CCGuAiACLwCFCSGvAiACLwCNCSGwAiACLwCVCSGxAiACLwCdCSGyAiACLwClCSGzAiACLwCtCSG0AiACLwC1CSG1AiACLwC9CSG2AiACLwDFCSG3AiACLwDNCSG4AiACLwDVCSG5AiACLwDdCSG6AiACLwDlCSG7AiACLwDtCSEUIAIvAPUJIRogAi8A/QkhGyACLwCFCiEcIAIvAI0KISggAi8AlQohLiACLwCdCiEyIAIvAKUKITggAi8ArQohOiACLwC1CiETIAIvAL0KIRYgAi8AxQohNiACLwDNCiE3IAIvANUKIRcgAi8A3Qoh3wEgAi8A5QohGSACLwDtCiEiIAIvAPUKIRUgAi8A/QohQCACLwCFCyEgIAIvAI0LIUMgAi8AlQshJiACLwCdCyErIAIvAKULIREgAi8ArQshDyACLwC1CyEJIAIvAL0LIQ4gAi8AxQshCCACLwDNCyELIAIv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AM0KIAEg+QE7AMUKIAEg+gE7AL0KIAEg+wE7ALUKIAEg/AE7AK0KIAEg/QE7AKUKIAEg/gE7AJ0KIAEgfzsAlQogASB+OwCNCiABIH07AIUKIAEgfDsA/QkgASB7OwD1CSABIHo7AO0JIAEgeTsA5QkgASB4OwDdCSABIHc7ANUJIAEgdjsAzQkgASB1OwDFCSABIHQ7AL0JIAEgczsAtQkgASByOwCtCSABIHE7AKUJIAEgcDsAnQkgASBvOwCVCSABIG47AI0JIAEgbTsAhQkgASBsOwD9CCABIGs7APUIIAEgajsA7QggASBpOwDlCCABIGg7AN0IIAEgZzsA1QggASBmOwDNCCABIGU7AMUIIAEgZDsAvQggASBjOwC1CCABIGI7AK0IIAEgYTsApQggASBgOwCdCCABIF87AJUIIAEgXjsAjQggASBdOwCFCCABIFw7AP0HIAEgWzsA9QcgASBaOwDtByABIFk7AOUHIAEgWDsA3QcgASBXOwDVByABIFY7AM0HIAEgVTsAxQcgASBUOwC9ByABIFM7ALUHIAEgUjsArQcgASBROwClByABIFA7AJ0HIAEgTzsAlQcgASBOOwCNByABIE07AIUHIAEgTDsA/QYgASBLOwD1BiABIEo7AO0GIAEgSTsA5QYgASBIOwDdBiABIEc7ANUGIAEglgE7AM0GIAEglQE7AMUGIAEglAE7AL0GIAEgkwE7ALUGIAEgkgE7AK0GIAEgkQE7AKUGIAEgkAE7AJ0GIAEgjwE7AJUGIAEgjgE7AI0GIAEgjQE7AIUGIAEgjAE7AP0FIAEgiwE7APUFIAEgigE7AO0FIAEgiQE7AOUFIAEgiAE7AN0FIAEghwE7ANUFIAEghgE7AM0FIAEghQE7AMUFIAEghAE7AL0FIAEggwE7ALUFIAEgggE7AK0FIAEggQE7AKUFIAEggAE7AJ0FIAFBADsAlQUgASDcATsAjQUgASCXATsAhQUgASCYATsA/QQgASCZATsA9QQgASCaATsA7QQgASCbATsA5QQgASCcATsA3QQgASCdATsA1QQgASCeATsAzQQgASCfATsAxQQgASCgATsAvQQgASChATsAtQQgASCiATsArQQgASCjATsApQQgASCkATsAnQQgASClATsAlQQgASCmATsAjQQgASCnATsAhQQgASCoATsA/QMgASCpATsA9QMgASCqATsA7QMgASCrATsA5QMgASCsATsA3QMgASCtATsA1QMgASCuATsAzQMgASCvATsAxQMgASCwATsAvQMgASCxATsAtQMgASCyATsArQMgASCzATsApQMgASC0ATsAnQMgASC1ATsAlQMgASC2ATsAjQMgASC3ATsAhQMgASC4ATsA/QIgASC5ATsA9QIgASC6ATsA7QIgASC7ATsA5QIgASC8ATsA3QIgASC9ATsA1QIgASC+ATsAzQIgASC/ATsAxQIgASDAATsAvQIgASDBATsAtQIgASDCATsArQIgASDDATsApQIgASDEATsAnQIgASDFATsAlQIgASDGATsAjQIgASDHATsAhQIgASDIATsA/QEgASDJATsA9QEgASDKATsA7QEgASDLATsA5QEgASDMATsA3QEgASDNATsA1QEgASDOATsAzQEgASDPATsAxQEgASDbATsAvQEgASDaATsAtQEgASDZATsArQEgASDYATsApQEgASDXATsAnQEgASDWATsAlQEgASDVATsAjQEgASDUATsAhQEgASDTATsAfSABINIBOwB1IAEg0QE7AG0gASDQATsAZSABIIACOwBdIAEgDzsAVSABIA07AE0gASAFOwBFIAFBADoApA0gASCBAjYCoA0gASCFAjYCnA0gASAsNgKYDSABIIYCNgKUDSABIIcCNgKQDSABIIgCNgKMDSABIIkCNgKIDSABIIoCNgKEDSABIIsCNgKADSABIIwCNgL8DCABII0CNgL4DCABII4CNgL0DCABII8CNgLwDCABIJACNgLsDCABIJECNgLoDCABIJICNgLkDCABIJMCNgLgDCABIJQCNgLcDCABIJUCNgLYDCABIJYCNgLUDCABIJcCNgLQDCABIJgCNgLMDCABIJkCNgLIDCABIJoCNgLEDCABIJsCNgLADCABIJwCNgK8DCABIJ0CNgK4DCABIJ4CNgK0DCABIJ8CNgKwDCABIKACNgKsDCABIKECNgKoDCABIKICNgKkDCABIKMCNgKgDCABIKQCNgKcDCABIKUCNgKYDCABIKYCNgKUDCABIKcCNgKQDCABIKgCNgKMDCABIKkCNgKIDCABIKoCNgKEDCABIKsCNgKADCABIKwCNgL8CyABIK0CNgL4CyABIK4CNgL0CyABIK8CNgLwCyABILACNgLsCyABILECNgLoCyABILICNgLkCyABILMCNgLgCyABIBE2AtwLIAEgtAI2AtgLIAEg5wE6ANQLIAEgtQI2AtALIAEgtgI6AMwLIAEgtwI2AsgLIAEguAI6AMQLIAEguQI2AsALIAEgugI6ALwLIAEguwI2ArgLIAEgFDoAtAsgASASNgKwCyABICM6AKwLIAEgGjYCqAsgASAtOgCkCyABIDs2AqALIAEgQToAnAsgASBENgKYCyABIEU6AJQLIAEgPDYCkAsgASDdAToAjAsgASDeATYCiAsgASDjAToAhAsgASDgATYCgAsgASDhAToA/AogASDkATYC+AogASDlAToA9AogASAbNgLwCiABIBw6AOwKIAEgKDYC6AogASAuOgDkCiABIDI2AuAKIAEgODoA3AogASA6NgLYCiABIBM6ANQKIAEgFjYC0AogASA2OgDMCiABIDc2AsgKIAEgFzoAxAogASDfATYCwAogASAZOgC8CiABICI2ArgKIAEgFToAtAogASBANgKwCiABIC86AKwKIAEgIDYCqAogASD/AToApAogASBDNgKgCiABICY6AJwKIAEgKzYCmAogASC8AjoAlAogASC9AjYCkAogASC+AjoAjAogASC/AjYCiAogASDAAjoAhAogASDBAjYCgAogASDCAjoA/AkgASDDAjYC+AkgASDEAjoA9AkgASDFAjYC8AkgASDGAjoA7AkgASDHAjYC6AkgASDIAjoA5AkgASDJAjYC4AkgASDKAjoA3AkgASDLAjYC2AkgASDMAjoA1AkgASDNAjYC0AkgASDOAjoAzAkgASDPAjYCyAkgASDQAjoAxAkgASDRAjYCwAkgASDSAjoAvAkgASDTAjYCuAkgASDUAjoAtAkgASDVAjYCsAkgASDWAjoArAkgASDXAjYCqAkgASDYAjoApAkgASDZAjYCoAkgASDaAjoAnAkgASDbAjYCmAkgASDcAjoAlAkgASDdAjYCkAkgASDeAjoAjAkgASDfAjYCiAkgASDgAjoAhAkgASDhAjYCgAkgASDiAjoA/AggASDjAjYC+AggASDkAjoA9AggASDlAjYC8AggASDmAjoA7AggASDnAjYC6AggASDoAjoA5AggASDpAjYC4AggASDqAjoA3AggASDrAjYC2AggASDsAjoA1AggASDtAjYC0AggASDuAjoAzAggASDvAjYCyAggASDwAjoAxAggASDxAjYCwAggASDyAjoAvAggASDzAjYCuAggASD0AjoAtAggASD1AjYCsAggASD2AjoArAggASD3AjYCqAggASD4AjoApAggASD5AjYCoAggASD6AjoAnAggASD7AjYCmAggASD8AjoAlAggASD9AjYCkAggASD+AjoAjAggASD/AjYCiAggASCAAzoAhAggASCBAzYCgAggASCCAzoA/AcgASCDAzYC+AcgASCEAzoA9AcgASCFAzYC8AcgASCGAzoA7AcgASCHAzYC6AcgASCIAzoA5AcgASCJAzYC4AcgASCKAzoA3AcgASCLAzYC2AcgASCMAzoA1AcgASCNAzYC0AcgASCOAzoAzAcgASCPAzYCyAcgASCQAzoAxAcgASCRAzYCwAcgASCSAzoAvAcgASCTAzYCuAcgASCUAzoAtAcgASCVAzYCsAcgASCWAzoArAcgASCXAzYCqAcgASCYAzoApAcgASCZAzYCoAcgASCaAzoAnAcgASCbAzYCmAcgASCcAzoAlAcgASCdAzYCkAcgASCeAzoAjAcgASCfAzYCiAcgASCgAzoAhAcgASChAzYCgAcgASCiAzoA/AYgASCjAzYC+AYgASCkAzoA9AYgASClAzYC8AYgASCmAzoA7AYgASCnAzYC6AYgASCoAzoA5AYgASCpAzYC4AYgASCqAzoA3AYgASCrAzYC2AYgASCsAzoA1AYgASCtAzYC0AYgASCuAzoAzAYgASCvAzYCyAYgASCwAzoAxAYgASCxAzYCwAYgASCyAzoAvAYgASCzAzYCuAYgASC0AzoAtAYgASC1AzYCsAYgASC2AzoArAYgASC3AzYCqAYgASC4AzoApAYgASC5AzYCoAYgASC6AzoAnAYgASC7AzYCmAYgASC8AzoAlAYgASC9AzYCkAYgASC+AzoAjAYgASC/AzYCiAYgASDAAzoAhAYgASDBAzYCgAYgASDCAzoA/AUgASDDAzYC+AUgASDEAzoA9AUgASDFAzYC8AUgASDGAzoA7AUgASDHAzYC6AUgASDIAzoA5AUgASDJAzYC4AUgASDKAzoA3AUgASDLAzYC2AUgASDMAzoA1AUgASDNAzYC0AUgASDOAzoAzAUgASDPAzYCyAUgASDQAzoAxAUgASDRAzYCwAUgASDSAzoAvAUgASDTAzYCuAUgASDUAzoAtAUgASDVAzYCsAUgASDWAzoArAUgASDXAzYCqAUgASDYAzoApAUgASDZAzYCoAUgASDaAzoAnAUgASDbAzYCmAUgAUEAOgCUBSABIIICNgKQBSABINwDOgCMBSABIN0DNgKIBSABIN4DOgCEBSABIN8DNgKABSABIOADOgD8BCABIOEDNgL4BCABIOIDOgD0BCABIOMDNgLwBCABIOQDOgDsBCABIOUDNgLoBCABIOYDOgDkBCABIOcDNgLgBCABIOgDOgDcBCABIOkDNgLYBCABIOoDOgDUBCABIOsDNgLQBCABIOwDOgDMBCABIO0DNgLIBCABIO4DOgDEBCABIO8DNgLABCABIPADOgC8BCABIPEDNgK4BCABIPIDOgC0BCABIPMDNgKwBCABIPQDOgCsBCABIPUDNgKoBCABIPYDOgCkBCABIPcDNgKgBCABIPgDOgCcBCABIPkDNgKYBCABIPoDOgCUBCABIPsDNgKQBCABIPwDOgCMBCABIP0DNgKIBCABIP4DOgCEBCABIP8DNgKABCABIIAEOgD8AyABIIEENgL4AyABIIIEOgD0AyABIIMENgLwAyABIIQEOgDsAyABIIUENgLoAyABIIYEOgDkAyABIIcENgLgAyABIIgEOgDcAyABIIkENgLYAyABIIoEOgDUAyABIIsENgLQAyABIIwEOgDMAyABII0ENgLIAyABII4EOgDEAyABII8ENgLAAyABIJAEOgC8AyABIJEENgK4AyABIJIEOgC0AyABIJMENgKwAyABIJQEOgCsAyABIJUENgKoAyABIJYEOgCkAyABIJcENgKgAyABIJgEOgCcAyABIJkENgKYAyABIJoEOgCUAyABIJsENgKQAyABIJwEOgCMAyABIJ0ENgKIAyABIJ4EOgCEAyABIJ8ENgKAAyABIKAEOgD8AiABIKEENgL4AiABIKIEOgD0AiABIKMENgLwAiABIKQEOgDsAiABIKUENgLoAiABIKYEOgDkAiABIKcENgLgAiABIKgEOgDcAiABIKkENgLYAiABIKoEOgDUAiABIKsENgLQAiABIKwEOgDMAiABIK0ENgLIAiABIK4EOgDEAiABIK8ENgLAAiABILAEOgC8AiABILEENgK4AiABILIEOgC0AiABILMENgKwAiABILQEOgCsAiABILUENgKoAiABILYEOgCkAiABILcENgKgAiABILgEOgCcAiABILkENgKYAiABILoEOgCUAiABILsENgKQAiABILwEOgCMAiABIL0ENgKIAiABIL4EOgCEAiABIL8ENgKAAiABIMAEOgD8ASABIMEENgL4ASABIMIEOgD0ASABIMMENgLwASABIMQEOgDsASABIMUENgLoASABIMYEOgDkASABIMcENgLgASABIMgEOgDcASABIMkENgLYASABIMoEOgDUASABIMsENgLQASABIMwEOgDMASABIM0ENgLIASABIM4EOgDEASABIM8ENgLAASABINAEOgC8ASABINEENgK4ASABINIEOgC0ASABINMENgKwASABINQEOgCsASABINUENgKoASABINYEOgCkASABINcENgKgASABINgEOgCcASABINkENgKYASABINoEOgCUASABINsENgKQASABINwEOgCMASABIN0ENgKIASABIN4EOgCEASABIN8ENgKAASABIOAEOgB8IAEg4QQ2AnggASDiBDoAdCABIOMENgJwIAEg5AQ6AGwgASDlBDYCaCABIOYEOgBkIAEg5wQ2AmAgASDpBDoAXCABIOoENgJYIAEgRjoAVCABIDk2AlAgASDiAToATCABID82AkggASAQOgBEIAEgKjYCQCABIAo2AjggASDmATYCNCABIDU2AjAgASAdNgIsIAEgNDYCKCABIAc2AiQgASAnNgIgIAEgDDYCHCABIAQ2AhggASCEAjYCFCABID02AhAgASCLBTcDCCABQQE2AgQgAUEBNgIAIAFB1wtqIEJBEHY6AAAgAUHPC2og6QFBEHY6AAAgAUHHC2og6gFBEHY6AAAgAUG/C2og6wFBEHY6AAAgAUG3C2og7AFBEHY6AAAgAUGvC2og7QFBEHY6AAAgAUGnC2og7gFBEHY6AAAgAUGfC2og7wFBEHY6AAAgAUGXC2og8AFBEHY6AAAgAUGPC2og8QFBEHY6AAAgAUGHC2og8gFBEHY6AAAgAUH/Cmog8wFBEHY6AAAgAUH3Cmog9AFBEHY6AAAgAUHvCmog9QFBEHY6AAAgAUHnCmog9gFBEHY6AAAgAUHfCmog6AFBEHY6AAAgAUHXCmog9wFBEHY6AAAgAUHPCmog+AFBEHY6AAAgAUHHCmog+QFBEHY6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EMoeCyACQaABahDMHgwBCyACLQBfIQ4gAigCWCEIIAItAFwhCyACKQNgIYoFIAIvAF0hBiACQaABahDMHkG4DUEIEIwgIgEgBjsArQ0gASDwBDsA3QsgASBCOwDVCyABIOkBOwDNCyABIOoBOwDFCyABIOsBOwC9CyABIOwBOwC1CyABIO0BOwCtCyABIO4BOwClCyABIO8BOwCdCyABIPABOwCVCyABIPEBOwCNCyABIPIBOwCFCyABIPMBOwD9CiABIPQBOwD1CiABIPUBOwDtCiABIPYBOwDlCiABIOgBOwDdCiABIPcBOwDVCiABIPgBOwDNCiABIPkBOwDFCiABIPoBOwC9CiABIPsBOwC1CiABIPwBOwCtCiABIP0BOwClCiABIP4BOwCdCiABIH87AJUKIAEgfjsAjQogASB9OwCFCiABIHw7AP0JIAEgezsA9QkgASB6OwDtCSABIHk7AOUJIAEgeDsA3QkgASB3OwDVCSABIHY7AM0JIAEgdTsAxQkgASB0OwC9CSABIHM7ALUJIAEgcjsArQkgASBxOwClCSABIHA7AJ0JIAEgbzsAlQkgASBuOwCNCSABIG07AIUJIAEgbDsA/QggASBrOwD1CCABIGo7AO0IIAEgaTsA5QggASBoOwDdCCABIGc7ANUIIAEgZjsAzQggASBlOwDFCCABIGQ7AL0IIAEgYzsAtQggASBiOwCtCCABIGE7AKUIIAEgYDsAnQggASBfOwCVCCABIF47AI0IIAEgXTsAhQggASBcOwD9ByABIFs7APUHIAEgWjsA7QcgASBZOwDlByABIFg7AN0HIAEgVzsA1QcgASBWOwDNByABIFU7AMUHIAEgVDsAvQcgASBTOwC1ByABIFI7AK0HIAEgUTsApQcgASBQOwCdByABIE87AJUHIAEgTjsAjQcgASBNOwCFByABIEw7AP0GIAEgSzsA9QYgASBKOwDtBiABIEk7AOUGIAEgSDsA3QYgASBHOwDVBiABIJYBOwDNBiABIJUBOwDFBiABIJQBOwC9BiABIJMBOwC1BiABIJIBOwCtBiABIJEBOwClBiABIJABOwCdBiABII8BOwCVBiABII4BOwCNBiABII0BOwCFBiABIIwBOwD9BSABIIsBOwD1BSABIIoBOwDtBSABIIkBOwDlBSABIIgBOwDdBSABIIcBOwDV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INACOgDECSABINECNgLACSABINICOgC8CSABINMCNgK4CSABINQCOgC0CSABINUCNgKwCSABINYCOgCsCSABINcCNgKoCSABINgCOgCkCSABINkCNgKgCSABINoCOgCcCSABINsCNgKYCSABINwCOgCUCSABIN0CNgKQCSABIN4COgCMCSABIN8CNgKICSABIOACOgCECSABIOECNgKACSABIOICOgD8CCABIOMCNgL4CCABIOQCOgD0CCABIOUCNgLwCCABIOYCOgDsCCABIOcCNgLoCCABIOgCOgDkCCABIOkCNgLgCCABIOoCOgDcCCABIOsCNgLYCCABIOwCOgDUCCABIO0CNgLQCCABIO4COgDMCCABIO8CNgLICCABIPACOgDECCABIPECNgLACCABIPICOgC8CCABIPMCNgK4CCABIPQCOgC0CCABIPUCNgKwCCABIPYCOgCsCCABIPcCNgKoCCABIPgCOgCkCCABIPkCNgKgCCABIPoCOgCcCCABIPsCNgKYCCABIPwCOgCUCCABIP0CNgKQCCABIP4COgCMCCABIP8CNgKICCABIIADOgCECCABIIEDNgKACCABIIIDOgD8ByABIIMDNgL4ByABIIQDOgD0ByABIIUDNgLwByABIIYDOgDsByABIIcDNgLoByABIIgDOgDkByABIIkDNgLgByABIIoDOgDcByABIIsDNgLYByABIIwDOgDUByABII0DNgLQByABII4DOgDMByABII8DNgLIByABIJADOgDEByABIJEDNgLAByABIJIDOgC8ByABIJMDNgK4ByABIJQDOgC0ByABIJUDNgKwByABIJYDOgCsByABIJcDNgKoByABIJgDOgCkByABIJkDNgKgByABIJoDOgCcByABIJsDNgKYByABIJwDOgCUByABIJ0DNgKQByABIJ4DOgCMByABIJ8DNgKIByABIKADOgCEByABIKEDNgKAByABIKIDOgD8BiABIKMDNgL4BiABIKQDOgD0BiABIKUDNgLwBiABIKYDOgDsBiABIKcDNgLoBiABIKgDOgDkBiABIKkDNgLgBiABIKoDOgDcBiABIKsDNgLYBiABIKwDOgDUBiABIK0DNgLQBiABIK4DOgDMBiABIK8DNgLIBiABILADOgDEBiABILEDNgLABiABILIDOgC8BiABILMDNgK4BiAB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CyABIOoBOwDFCyABIOsBOwC9CyABIOwBOwC1CyABIO0BOwCtCyABIO4BOwClCyABIO8BOwCdCyABIPABOwCVCyABIPEBOwCNCyABIPIBOwCFCyABIPMBOwD9CiABIPQBOwD1CiABIPUBOwDtCiABIPYBOwDlCiABIOgBOwDdCiABIPcBOwDVCiABIPgBOwDNCiABIPkBOwDFCiABIPoBOwC9CiABIPsBOwC1CiABIPwBOwCtCiABIP0BOwClCiABIP4BOwCdCiABIH87AJUKIAEgfjsAjQogASB9OwCFCiABIHw7AP0JIAEgezsA9QkgASB6OwDtCSABIHk7AOUJIAEgeDsA3QkgASB3OwDVCSABIHY7AM0JIAEgdTsAxQkgASB0OwC9CSABIHM7ALUJIAEgcjsArQkgASBxOwClCSABIHA7AJ0JIAEgbzsAlQkgASBuOwCNCSABIG07AIUJIAEgbDsA/QggASBrOwD1CCABIGo7AO0IIAEgaTsA5QggASBoOwDdCCABIGc7ANUIIAEgZjsAzQggASBlOwDFCCABIGQ7AL0IIAEgYzsAtQggASBiOwCtCCABIGE7AKUIIAEgYDsAnQggASBfOwCVCCABIF47AI0IIAEgXTsAhQggASBcOwD9ByABIFs7APUHIAEgWjsA7QcgASBZOwDlByABIFg7AN0HIAEgVzsA1QcgASBWOwDNByABIFU7AMUHIAEgVDsAvQcgASBTOwC1ByABIFI7AK0HIAEgUTsApQcgASBQOwCdByABIE87AJUHIAEgTjsAjQcgASBNOwCFByABIEw7AP0GIAEgSzsA9QYgASBKOwDtBiABIEk7AOUGIAEgSDsA3QYgASBHOwDVBiABIJYBOwDNBiABIJUBOwDFBiABIJQBOwC9BiABIJMBOwC1BiABIJIBOwCtBiABIJEBOwClBiABIJABOwCdBiABII8BOwCVBiABII4BOwCNBiABII0BOwCFBiABIIwBOwD9BSABIIsBOwD1BSABIIoBOwDtBSABIIkBOwDlBSABIIgBOwDdBSABIIcBOwDVBSABIIYBOwDNBSABIIUBOwDFBSABIIQBOwC9BSABIIMBOwC1BSABIIIBOwCtBSABIIEBOwClBSABIIABOwCdBSABQQA7AJUFIAEg3AE7AI0FIAEglwE7AIUFIAEgmAE7AP0EIAEgmQE7APUEIAEgmgE7AO0EIAEgmwE7AOUEIAEgnAE7AN0EIAEgnQE7ANUEIAEgngE7AM0EIAEgnwE7AMUEIAEgoAE7AL0EIAEgoQE7ALUEIAEgogE7AK0EIAEgowE7AKUEIAEgpAE7AJ0EIAEgpQE7AJUEIAEgpgE7AI0EIAEgpwE7AIUEIAEgqAE7AP0DIAEgqQE7APUDIAEgqgE7AO0DIAEgqwE7AOUDIAEgrAE7AN0DIAEgrQE7ANUDIAEgrgE7AM0DIAEgrwE7AMUDIAEgsAE7AL0DIAEgsQE7ALUDIAEgsgE7AK0DIAEgswE7AKUDIAEgtAE7AJ0DIAEgtQE7AJUDIAEgtgE7AI0DIAEgtwE7AIUDIAEguAE7AP0CIAEguQE7APUCIAEgugE7AO0CIAEguwE7AOUCIAEgvAE7AN0CIAEgvQE7ANUCIAEgvgE7AM0CIAEgvwE7AMUCIAEgwAE7AL0CIAEgwQE7ALUCIAEgwgE7AK0CIAEgwwE7AKUCIAEgxAE7AJ0CIAEgxQE7AJUCIAEgxgE7AI0CIAEgxwE7AIUCIAEgyAE7AP0BIAEgyQE7APUBIAEgygE7AO0BIAEgywE7AOUBIAEgzAE7AN0BIAEgzQE7ANUBIAEgzgE7AM0BIAEgzwE7AMUBIAEg2wE7AL0BIAEg2gE7ALUBIAEg2QE7AK0BIAEg2AE7AKUBIAEg1wE7AJ0BIAEg1gE7AJUBIAEg1QE7AI0BIAEg1AE7AIUBIAEg0wE7AH0gASDSATsAdSABINEBOwBtIAEg0AE7AGUgASCAAjsAXSABIA87AFUgASANOwBNIAEgBTsARSABQQA6AKwNIAEgCDYCqA0gAUEANgKkDSABIIECNgKgDSABIIUCNgKcDSABICw2ApgNIAEghgI2ApQNIAEghwI2ApANIAEgiAI2AowNIAEgiQI2AogNIAEgigI2AoQNIAEgiwI2AoANIAEgjAI2AvwMIAEgjQI2AvgMIAEgjgI2AvQMIAEgjwI2AvAMIAEgkAI2AuwMIAEgkQI2AugMIAEgkgI2AuQMIAEgkwI2AuAMIAEglAI2AtwMIAEglQI2AtgMIAEglgI2AtQMIAEglwI2AtAMIAEgmAI2AswMIAEgmQI2AsgMIAEgmgI2AsQMIAEgmwI2AsAMIAEgnAI2ArwMIAEgnQI2ArgMIAEgngI2ArQMIAEgnwI2ArAMIAEgoAI2AqwMIAEgoQI2AqgMIAEgogI2AqQMIAEgowI2AqAMIAEgpAI2ApwMIAEgpQI2ApgMIAEgpgI2ApQMIAEgpwI2ApAMIAEgqAI2AowMIAEgqQI2AogMIAEgqgI2AoQMIAEgqwI2AoAMIAEgrAI2AvwLIAEgrQI2AvgLIAEgrgI2AvQLIAEgrwI2AvALIAEgsAI2AuwLIAEgsQI2AugLIAEgsgI2AuQLIAEgswI2AuALIAEgETYC3AsgASC0AjYC2AsgASDnAToA1AsgASC1AjYC0AsgASC2AjoAzAsgASC3AjYCyAsgASC4AjoAxAsgASC5AjYCwAsgASC6AjoAvAsgASC7AjYCuAsgASAUOgC0CyABIBI2ArALIAEgIzoArAsgASAaNgKoCyABIC06AKQLIAEgOzYCoAsgASBBOgCcCyABIEQ2ApgLIAEgRToAlAsgASA8NgKQCyABIN0BOgCMCyABIN4BNgKICyABIOMBOgCECyABIOABNgKACyABIOEBOgD8CiABIOQBNgL4CiABIOUBOgD0CiABIBs2AvAKIAEgHDoA7AogASAoNgLoCiABIC46AOQKIAEgMjYC4AogASA4OgDcCiABIDo2AtgKIAEgEzoA1AogASAWNgLQCiABIDY6AMwKIAEgNzYCyAogASAXOgDECiABIN8BNgLACiABIBk6ALwKIAEgIjYCuAogASAVOgC0CiABIEA2ArAKIAEgLzoArAogASAgNgKoCiABIP8BOgCkCiABIEM2AqAKIAEgJjoAnAogASArNgKYCiABILwCOgCUCiABIL0CNgKQCiABIL4COgCMCiABIL8CNgKICiABIMACOgCECiABIMECNgKACiABIMICOgD8CSABIMMCNgL4CSABIMQCOgD0CSABIMUCNgLwCSABIMYCOgDsCSABIMcCNgLoCSABIMgCOgDkCSABIMkCNgLgCSABIMoCOgDcCSABIMsCNgLYCSABIMwCOgDUCSABIM0CNgLQCSABIM4COgDMCSABIM8CNgLICSABINACOgDECSABINECNgLACSABINICOgC8CSABINMCNgK4CSABINQCOgC0CSABINUCNgKwCSABINYCOgCsCSABINcCNgKoCSABINgCOgCkCSABINkCNgKgCSABINoCOgCcCSABINsCNgKYCSABINwCOgCUCSABIN0CNgKQCSABIN4COgCMCSABIN8CNgKICSABIOACOgCECSABIOECNgKACSABIOICOgD8CCABIOMCNgL4CCABIOQCOgD0CCABIOUCNgLwCCABIOYCOgDsCCABIOcCNgLoCCABIOgCOgDkCCABIOkCNgLgCCABIOoCOgDcCCABIOsCNgLYCCABIOwCOgDUCCABIO0CNgLQCCABIO4COgDMCCABIO8CNgLICCABIPACOgDECCABIPECNgLACCABIPICOgC8CCABIPMCNgK4CCABIPQCOgC0CCABIPUCNgKwCCABIPYCOgCsCCABIPcCNgKoCCABIPgCOgCkCCABIPkCNgKgCCABIPoCOgCcCCABIPsCNgKYCCABIPwCOgCUCCABIP0CNgKQCCABIP4COgCMCCABIP8CNgKICCABIIADOgCECCABIIEDNgKACCABIIIDOgD8ByABIIMDNgL4ByABIIQDOgD0ByABIIUDNgLwByABIIYDOgDsByABIIcDNgLoByABIIgDOgDkByABIIkDNgLgByABIIoDOgDcByABIIsDNgLYByABIIwDOgDUByABII0DNgLQByABII4DOgDMByABII8DNgLIByABIJADOgDEByABIJEDNgLAByABIJIDOgC8ByABIJMDNgK4ByABIJQDOgC0ByABIJUDNgKwByABIJYDOgCsByABIJcDNgKoByABIJgDOgCkByABIJkDNgKgByABIJoDOgCcByABIJsDNgKYByABIJwDOgCUByABIJ0DNgKQByABIJ4DOgCMByABIJ8DNgKIByABIKADOgCEByABIKEDNgKAByABIKIDOgD8BiABIKMDNgL4BiABIKQDOgD0BiABIKUDNgLwBiABIKYDOgDsBiABIKcDNgLoBiABIKgDOgDkBiABIKkDNgLgBiABIKoDOgDcBiABIKsDNgLYBiABIKwDOgDUBiABIK0DNgLQBiABIK4DOgDMBiABIK8DNgLIBiABILADOgDEBiABILEDNgLABiABILIDOgC8BiABILMDNgK4BiABILQDOgC0BiABILUDNgKwBiABILYDOgCsBiABILcDNgKoBiABILgDOgCkBiABILkDNgKgBiABILoDOgCcBiABILsDNgKYBiABILwDOgCUBiABIL0DNgKQBiABIL4DOgCMBiABIL8DNgKIBiABIMAD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QbcDaiCxAUEQdjoAACABQa8DaiCyAUEQdjoAACABQacDaiCzAUEQdjoAACABQZ8DaiC0AUEQdjoAACABQZcDaiC1AUEQdjoAACABQY8DaiC2AUEQdjoAACABQYcDaiC3AUEQdjoAACABQf8CaiC4AUEQdjoAACABQfcCaiC5AUEQdjoAACABQe8CaiC6AUEQdjoAACABQecCaiC7AUEQdjoAACABQd8CaiC8AUEQdjoAACABQdcCaiC9AUEQdjoAACABQc8CaiC+AUEQdjoAACABQccCaiC/AUEQdjoAACABQb8CaiDAAUEQdjoAACABQbcCaiDBAUEQdjoAACABQa8CaiDCAUEQdjoAACABQacCaiDDAUEQdjoAACABQZ8CaiDEAUEQdjoAACABQZcCaiDFAUEQdjoAACABQY8CaiDGAUEQdjoAACABQYcCaiDHAUEQdjoAACABQf8BaiDIAUEQdjoAACABQfcBaiDJAUEQdjoAACABQe8BaiDKAUEQdjoAACABQecBaiDLAUEQdjoAACABQd8BaiDMAUEQdjoAACABQdcBaiDNAUEQdjoAACABQc8BaiDOAUEQdjoAACABQccBaiDPAUEQdjoAACABQb8BaiDbAUEQdjoAACABQbcBaiDaAUEQdjoAACABQa8BaiDZAUEQdjoAACABQacBaiDYAUEQdjoAACABQZ8BaiDXAUEQdjoAACABQZcBaiDWAUEQdjoAACABQY8BaiDVAUEQdjoAACABQYcBaiDUAUEQdjoAACABQf8AaiDTAUEQdjoAACABQfcAaiDSAUEQdjoAACABQe8AaiDRAUEQdjoAACABQecAaiDQAUEQdjoAACABQd8AaiCAAkEQdjoAACABQdcAaiAPQRB2OgAAIAFBzwBqIA1BEHY6AAAgAUHHAGogBUEQdjoAACABID5B/wFxIAtBCHRyNgI8IAFBsA1qIAJBuAFqQZAFEPYGGiABQQA6AMQSIAEgMDYCwBIgJEHk+8IANgIICyAkIAE2AgRBAiE9CyAkID02AgAgAkE4ahC2JAwBCyAkQQI2AgAgAkHoEmoQzB4LIAJB0ClqJAAMAQsgAkHoDGogAkHYIWopAwA3AwAgAiACKQPQITcD4AxB9OHgAEErIAJB4AxqQbj4wgBB6P3CABDADgALIAMoArAEIQcgAygCrAQhDQJAAkAg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aiILIAetIBitQiCGhDcCACADIAU2AqQKIAMgEDYCoAogA0GgCmoQmRsgISADKQKgCjcCACAhQQhqIAspAgA3AgAgAyAGNgKoBCADQZQDaiADQagEahDSEiEGDAULIAMgGDYCqAMLIANBqARqIANBlApqIAYoAgAgBkEEaigCABBCIAMoAqgEIgVBgICAgHhGBEAgAygCnAMiBUEBayEYIAMoApgDIAVBFGxqQRRrIRIDQAJAAkACQAJAIBhBf0YEQEEAIRgMAQsgEkEEaigCACIFQQRHDQELIAMgGDYCnAMgAygClAoiBigCACIHQf////8HTw0BIAYgB0EBajYCACADIAYoAgwiBTYC4AoCQCAFQQFGBEAgBiAHNgIAIANBqARqIAYQkgwgAygCqARBEEcNAUH4ucQAELwpAAsgA0EANgKoBCADQeAKakHUmtgAIANBqARqQYi6xAAQvhoACyADQZAEaiADQcAEaigCADYCACADQYgEaiADQbgEaikCADcDACADQYAEaiAMKQIANwMAIAMgAykCqAQ3A/gDIB4gA0H4A2oQkgpBgICAgHghBUEBDAYLIBIoAgAhCyAEIBJBCGopAgA3AgAgBEEIaiASQRBqKAIANgIAIAMgBTYCsAogA0H4A2ogA0GwCmoQzAsgAygC+ANBBEcEQCADQcgKaiADQYAEaiIFKQIANwMAIAMgGDYCnAMgAyADKQL4AyKMBTcDwAogjAWnQQNHDQcgA0EPNgKoBCADKAKUCiADQagEahCKGAwHCyADQagEaiADQZQKaiALKAIAIAtBBGooAgAQQiADKAKoBCIFQYCAgIB4Rg0BIAMgGDYCnAMgHiAhQSQQ9gYaDAQLQei5xAAQ3BQACyASQRRrIRIgGEEBayEYDAALAAsgHiAhQSQQ9gYaC0EACyADQZQDahDbHyADKAL8ASESBEAgAygClAIhCCADKAKQAiEHIAMoAowCIRAgAygCiAIhCyADKAKEAiEGIAMoAoACIQUgA0H4AmoQqQwgAygC9AEiDiADKALsAUYEQCADQewBahDfFgsgAygC8AEgDkEcbGoiDyAINgIYIA8gBzYCFCAPIBA2AhAgDyALNgIMIA8gBjYCCCAPIAU2AgQgDyASNgIAIAMgDkEBajYC9AEMAwsgA0H4AGogA0HwAmopAgA3AwAgAyADKQLoAjcD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hYDEADYCACAaIAspAgA3AgQgGkEcaiALQRhqKAIANgIAIBpBFGogC0EQaikCADcCACAaQQxqIAtBCGopAgA3AgAMBgsgGiAHNgIEIBpBhIDEADYCACAaIAspAgA3AgggGiAGKQIANwIoIBpBEGogC0EIaikCADcCACAaQRhqIAtBEGopAgA3AgAgGkEgaiALQRhqKQIANwIAIBpBMGogBkEIaikCADcCACAaQThqIAZBEGooAgA2AgAMBQsgFCgCxAIhBSAaQQhqIBRByAJqQTgQ9gYaIBogBTYCQCAaIAc2AgQgGkGIgMQANgIADAQLIBQoAsQCIQUgGkEIaiAUQcgCakE4EPYGGiAaIAU2AkAgGiAHNgIEDAILIBogFCkCrAI3AiggGkFAayAUQcQCaigCADYCACAaQThqIBRBvAJqKQIANwIAIBpBMGogFEG0AmopAgA3AgAgGkEkaiAHKAIANgIAIBpBHGogBikDADcCACAaQRRqIAspAwA3AgAgGiAUKQPIATcCDCAaIBU2AgggGiAFNgIEIBpBiIDEADYCACAUQUBrEMwiDAILIBogFCkCrAI3AiggGkFAayAUQcQCaigCADYCACAaQThqIBRBvAJqKQIANwIAIBpBMGogFEG0AmopAgA3AgAgGkEkaiAUQYACaigCADYCACAaQRxqIBRB+AFqKQMANwIAIBpBFGogFEHwAWopAwA3AgAgGiAUKQPoATcCDCAaIBA2AgggGiAFNgIEIBpBiIDEADYCAAwBCyAaQYiAxAA2AgAgFEEIahDMIgsgFEGAA2okACAbKAKgASEHIBtBMGoiBSAyQcAAEPYGGiAHQYiAxABHBEAgFyAZKQIANwIAIBdBEGogGUEQaigCADYCACAXQQhqIBlBCGopAgA3AgAgGyAHNgK4AiAdIAVBwAAQ9gYaIBtBDGogG0G4AmoQ7g4MAQsLIChBBGogG0EwakHAABD2BhoLIChBiYDEADYCACAbQQxqEMImDAELIBtBADYCoAEgG0EIakHEnMQAIBtBoAFqQaCmxAAQzxoACyAbQZADaiQAIANBgARqIg4gQEEIaikCADcDACADIEApAgA3A/gDIAMoAugEIR4gAygC1AQhKSADKQLMBCGMBSADKQLEBCGOBSADKALABCEGIAMoArwEIRggAygCuAQhIyADKAK0BCESIAMo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A2oiBRCiBiADKAKUAyADKAKYAxDUG0UEQCADQQA2AogCIANBATYC/AEgA0G0utYANgL4ASADQgQ3AoACIANBoApqIg1B9PbCACADQfgBaiIIEJUkDQsgCCAFEKIGIANB+ANqIgcgCBDEAyAIEJ8TIANBATYC/AEgA0Go7uAANgL4ASADQgE3AoQCIANBPjYC5AogAyADQeAKaiIFNgKAAiADIAc2AuAKAkAgDUH09sIAIAgQlSQNACADQQE2AvwBIANBxLrWADYC+AEgA0IBNwKEAiADQecANgLkCiADIAY2AuAKIAMgBTYCgAIgDUH09sIAIAgQlSQNACADKAL4AyADKAL8AxC4KQwKCyADKAL4AyADKAL8AxC4KQwLCyADQbAKakH+AEHPABCkECADQQA2AogCIANBATYC/AEgA0G0utYANgL4ASADQgQ3AoACIANBoApqQfT2wgAgA0H4AWoQlSRFDQUMBgsgA0EANgKkAyADQRAgA0HABGogLUEBcSIFGzYCoAMgA0EoIANB2ARqIAUbNgKcAyADQQwgA0G8BGogBRsoAgA2ApgDIANBCCADQbgEaiAFGygCADYClAMgA0GcA2ohBiADQbgDaiADQZQDaiIFEKIGIAMoApQDIAMoApgDENQbRQRAIANBADYCiAIgA0EBNgL8ASADQbS61gA2AvgBIANCBDcCgAIgA0GgCmoiDUH09sIAIANB+AFqIggQlSQNCiAIIAUQogYgA0H4A2oiByAIEMQDIAgQnxMgA0EBNgL8ASADQaju4AA2AvgBIANCATcChAIgA0E+NgLkCiADIANB4ApqIgU2AoACIAMgBzYC4AoCQCANQfT2wgAgCBCVJA0AIANBATYC/AEgA0HEutYANgL4ASADQgE3AoQCIANB6AA2AuQKIAMgBjYC4AogAyAFNgKAAiANQfT2wgAgCBCVJA0AIAMoAvgDIAMoAvwDELgpDAkLIAMoAvgDIAMoAvwDELgpDAoLIANBsApqQf4AQc8AEKQQIANBADYCiAIgA0EBNgL8ASADQbS61gA2AvgBIANCBDcCgAIgA0GgCmpB9PbCACADQfgBahCVJEUNAQwCCyADQQA2AsADIANCgICAgBA3ArgDIANBADYCiAIgA0EBNgL8ASADQaCewwA2AvgBIANCBDcCgAIgA0G4A2pB9PbCACADQfgBahCVJEUEQCAQIAMpArgDNwIAIBBBCGogA0HAA2ooAgA2AgAMCAsMCwsgA0ECNgL8ASADQeTF3wA2AvgBIANCATcChAIgA0E+NgL8AyADIANB+ANqIg02AoACIAMgA0GwCmoiBzYC+AMgA0GgCmpB9PbCACADQfgBahCVJA0AIANBwApqIgUgA0G4A2oQxAMgA0EBNgL8ASADQaju4AA2AvgBIANCATcChAIgA0E+NgL8AyADIA02AoACIAMgBTYC+AMCQCADQaAKakH09sIAIANB+AFqEJUkDQAgA0ECNgL8ASADQeTF3wA2AvgBIANCATcChAIgA0E+NgL8AyADIA02AoACIAMgBzYC+AMgA0GgCmpB9PbCACADQfgBahCVJA0AIAMoAswDIgUEQCADQQA2AtgKIANCgICAgMAANwLQCiAFQRhsIRIgAygCyAMiGEEQaiEFA0AgEgRAIANBBTYC/AMgA0HMu9YANgL4AyADQgQ3AoQEIANBCTYChAIgA0EJNgL8ASAYKAIUIQcgA0EJNgKUAiADQQk2AowCIAMgBTYCiAIgAyAFQQhrNgKAAiADIAVBDGs2AvgBIAMgB0EBazYC6AIgEkEYayESIBhBGGohGCAFQRhqIQUgAyADQfgBajYCgAQgAyADQegCajYCkAIgA0HgCmoiByADQfgDahDoCyADQdAKaiAHEMwVDAEFIANB+ANqIgUgAygC1AogAygC2ApB8ubgAEEBEOcDIANBPjYC5AogA0ECNgL8ASADQeTF3wA2AvgBIANCATcChAIgAyAFNgLgCiADIANB4ApqNgKAAiADQaAKakH09sIAIANB+AFqEJUkIAMoAvgDIAMoAvwDELgpIANB0ApqELAVDQMLCwsgA0EBNgL8ASADQcS61gA2AvgBIANCATcChAIgA0HoADYC/AMgAyAGNgL4AyADIANB+ANqNgKAAiADQaAKakH09sIAIANB+AFqEJUkRQ0CCyADKALACiADKALEChC4KQsgAygCsAogAygCtAoQuCkMBgsgAygCwAogAygCxAoQuCkgAygCsAogAygCtAoQuCkMAwsgA0ECNgL8ASADQeTF3wA2AvgBIANCATcChAIgA0E+NgL8AyADIANB+ANqIg02AoACIAMgA0GwCmoiBzYC+AMgA0GgCmpB9PbCACADQfgBahCVJA0AIANBwApqIgUgA0G4A2oQxAMgA0EBNgL8ASADQaju4AA2AvgBIANCATcChAIgA0E+NgL8AyADIA02AoACIAMgBTYC+AMCQCADQaAKakH09sIAIANB+AFqEJUkDQAgA0ECNgL8ASADQeTF3wA2AvgBIANCATcChAIgA0E+NgL8AyADIA02AoACIAMgBzYC+AMgA0GgCmpB9PbCACADQfgBahCVJA0AIAMoAswDIgUEQCADQQA2AtgKIANCgICAgMAANwLQCiAFQRhsIRIgAygCyAMiGEEQaiEFA0AgEgRAIANBBTYC/AMgA0HMu9YANgL4AyADQgQ3AoQEIANBCTYChAIgA0EJNgL8ASAYKAIUIQcgA0EJNgKUAiADQQk2AowCIAMgBTYCiAIgAyAFQQhrNgKAAiADIAVBDGs2AvgBIAMgB0EBazYC6AIgEkEYayESIBhBGGohGCAFQRhqIQUgAyADQfgBajYCgAQgAyADQegCajYCkAIgA0HgCmoiByADQfgDahDoCyADQdAKaiAHEMwVDAEFIANB+ANqIgUgAygC1AogAygC2ApB8ubgAEEBEOcDIANBPjYC5AogA0ECNgL8ASADQeTF3wA2AvgBIANCATcChAIgAyAFNgLgCiADIANB4ApqNgKAAiADQaAKakH09sIAIANB+AFqEJUkIAMoAvgDIAMoAvwDELgpIANB0ApqELAVDQMLCwsgA0EBNgL8ASADQcS61gA2AvgBIANCATcChAIgA0HnADYC/AMgAyAGNgL4AyADIANB+ANqNgKAAiADQaAKakH09sIAIANB+AFqEJUkRQ0CCyADKALACiADKALEChC4KQsgAygCsAogAygCtAoQuCkMAwsgAygCwAogAygCxAoQuCkgAygCsAogAygCtAoQuCkLIANBuANqEJ8TIBAgAykCoAo3AgAgEEEIaiADQagKaigCADYCAAsgAygCqAQhLQwBCyADQbgDahCfEwwCCwJAAkAgLUUNAAJAIAMoArAEIgVBImtBACAFQSNrQQdJGw4CAQACCyADKAK4BCIFQYSAgIB4SA0BIAUgAygCvAQQuCkMAQsgC0EEQRwgCygCAEEiRhtqIgUoAgAgBUEEaigCABC4KQsggwJBADYCAAsCQCADLQC4ASIFQQNGIAVBAkZyDQAgAygCrAEiBSAFKAIAIgVBAWs2AgAgBUEB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vQEgBiEDCyAFIAMQyyggACgC0AEhAQJAIAAoAgBBAUcNACAAQQRqIQMgAiAFIAggARC8FSAAKALoAUEIaiACKAIAIAIoAgQQ5hkhDCACIAQgASABIARJGzYCHCACIAQgASABIARLGzYCGCACQQA6ACAgAiAMNwMQIAdBAXFFBEAgAkEwaiACQRhqKQMANwMAIAJBOGogAkEgaikDADcDACACQQE6AEQgAiACKQMQNwMoIAIgACgCqAE2AkAgAyACQShqEMwQDAELIAMgAkEQahC7EgsgBSABELkdIAJB0ABqJAALywMCAn8BfiMAQSBrIgMkACADQRBqIAEgAigCGCIEQQAQ0QECQAJAAkACQCADLQAQQQRHBEAgAykDECIFQv8Bg0IEUg0BCwJAAkACQAJAAkACQCAERQ0AIANBEGogASAEELMcIAMtABBBBEYNACADKQMQIgVC/wGDQgRSDQELIANBEGogAigCICACKAIkIAEQ9g8gAy0AEEEERwRAIAMpAxAiBUL/AYNCBFINAgsgAigCAA0CAkAgAigCECIERQ0AIANBEGogASAEQQFrQQAQ0QEgAy0AEEEERg0AIAMpAxAiBUL/AYNCBFINBwsgA0EANgIQIANBCGogASADQRBqQeit4ABBARCUEyADLQAIQQRHBEAgAykDCCIFQv8Bg0IEUg0ICyADQRBqIAJBCGogARD3EiADLQAQQQRGDQMgAykDECIFQv8Bg0IEUQ0DIAAgBTcCAAwICyAAIAU3AgAMBwsgACAFNwIADAYLIANBEGogASACQQRqEKkHIAMtABBBBEYNACADKQMQIgVC/wGDQgRSDQELIABBBDoAAAwECyAAIAU3AgAMAwsgACAFNwIADAILIAAgBTcCAAwBCyAAIAU3AgALIANBIGokAAuLDwIUfwR+IwBBIGsiBCQAAkBBuILkACgCACICDQAgBEEIaiIHQdiW4wApAwA3AwAgBEHQluMAKQMANwMAQbyC5ABBADYCAEG4guQAQQE2AgBBxILkACgCACEFQcCC5AAoAgAhA0HAguQAIAQpAwA3AgBBzILkACgCACEIQciC5AAgBykDADcCACACRSAFRXINAAJAIAhFDQAgA0EIaiEHIAMpAwBCf4VCgIGChIiQoMCAf4MhF0EBIQYgAyECA0AgBkUNASAXIRYDQCAWUARAIAJB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NgIACyACQSBqJAALxQMBB38jAEHQAGsiAiQAIABBGGohBQJAIAAtACxBAkYEQCAFKAIAIAEQvwUMAQsgASgCAEUNACACQQhqIgMgASAFEIIKIAItADQiCEEGRg0AIAItABwhBiACKAIIIQcgAkEdaiEEIANBBHIhAwJAAkACQAJAQQEgCEEDayIBIAFBA08bQf8BcUEBaw4CAAECC0EwEM0gIgEgBzYCACABIAY6ABQgASAIOgAsIAEgAykCADcCBCABQQxqIANBCGopAgA3AgAgASAELwAAOwAVQQIhBiABQRdqIARBAmotAAA6AAAgASACKQMgNwMYIAFBIGogAkEoaikDADcDACABQShqIAJBMGooAgA2AgAgAUEvaiACQTdqLQAAOgAAIAEgAi8ANTsALSABIQcMAgtB7LbfAEEPQfy23wAQ2hcACyACQcgAaiADQQhqKQIANwMAIAJBPmogBEECai0AADoAACACIAMpAgA3A0AgAiAELwAAOwE8CyAFEPwdIAAgBzYCGCAAIAY6ACwgACACKQNANwIcIABBJGogAkHIAGopAwA3AgAgACACLwE8OwAtIABBL2ogAkE+ai0AADoAAAsgAkHQAGokAAvaAwEIfyMAQSBrIgMkAAJAAkAgASgCAEUEQCAAQQA2AgAMAQsCQAJAAn8gASgCBCICIAEoAgxHBEAgASACQQRqNgIEIAEoAhQhBCABKAIQIQUCQCACKAIAIgJFDQAgAiAESQRAIAIgBWosAABBv39KDQEMBwsgAiAERw0GCyAFIAJBLRCmHyEGIANBGGogBSAEIAEoAiwiByACQdja4AAQ9A0gAygCHCEJIAMoAhghCCADQRBqIAUgBCAHIAJB6NrgABD0DSADKAIQIAMoAhQQnwYhBCABIAI2AixBAUH42uAAIAYbIQUgBkEBcyEGQQAhB0EBDAELIAEoAiwiBEUgBCABKAIUIgJJckUNASADQQhqIAEoAhAiBSACIARB/NrgABCcEyADKAIMIQkgAygCCCEIIAMgBSACIARBjNvgABCcEyADKAIAIAMoAgQQnwYhBCABIAJBAWo2AiwgASgCJCEGIAEoAiAhBSABKAIcIQcgASgCGAshAiAIDQELIAEQuyZBACEIIAFBADYCAAsgACAENgIYIAAgBjYCFCAAIAU2AhAgACAHNgIMIAAgAjYC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QT9xIAVBBnRyIQUgAUFwSQRAIAUgAkEMdHIhAiADQQNqDAELIAJBEnRBgIDwAHEgAy0AA0E/cSAFQQZ0cnIhAiADQQRqCyEDAkAgAkEwayIBQQpPBEBBfyACQSByIgFB1wBrIgIgAiABQeEAa0kbIgFBEE8NAQsgAa0gB0IEhoQhByADIAZGDQIMAQsLQeDN1gAQvCkACyAAIAc3AwggACAINwMAIARB0ABqJAAL2wMCAn8DfiMAQeABayIDJAAgA0EQaiACEJUdIAMCfyADKQMQIgVQBEAgA0EoaiABELUbQRoMAQsgAygCGCEEIANByAFqIAEQtRsgAykDyAEhBiADKQPQASEHIAMgBSAEEK0YNgJIIANCADcDQCADIAc3AzggAyAGNwMwIANBADYCKEEUCzYCICADIAIQlR0CQCADKQMAIgVQBEAgA0EANgLEASADQgA3ArwBIANCgICAgMAANwK0ASADQcgBaiICIAEQtRsgA0HgAGogAhCeDyADQbQBahD+FCECDAELIAMoAgghAiADQQA2AsQBIANCADcCvAEgA0KAgICAwAA3ArQBIANByAFqIAEQtRsgAykDyAEhBiADKQPQASEHIAUgAhCtGCEBIANBtAFqEP4UIQIgAyABNgKIASADQgA3A4ABIAMgBzcDeCADIAY3A3AgA0EANgJoIANBATYCYAsgA0EAOgCcASADIAI2ApgBIANCADcDkAEgA0EgahC9KCEBIANB4ABqEL0oIQIgA0HIAWoiBBD7HSADQRM6ALABIAMgAjYCpAEgAyABNgKgASADIAMpAtABNwKoASAEEO8oIAAgA0GgAWoQ/xQ2AgwgAEEANgIAIANB4AFqJAAL1QMCDH8DfiMAQfABayIDJAAgAUHYAGwgACgCCEHYAGwiBGshASAAKAIEIARqIQUgA0EwaiEJIANBDGohBCADQdABaiEKIANBiAFqQQRyIQYDQAJAIAEEQCADQYgBaiIHIAIoAgQiCCACKAIMRgR/QQUFIAdCADcDECACIAhBEGo2AgQgByAIKQMANwMIQQALNgIAIAMoAogBIgdBBUcNASADQQ02AgAgAxDoJQsgA0HwAWokACABRQ8LIANBgAFqIgggBkEYaigCADYCACADQfgAaiILIAZBEGopAgA3AwAgA0HwAGoiDCAGQQhqKQIANwMAIAMgBikCADcDaCADQagBaiINEMwXIANB4ABqIg4gCkEIaigCADYCACADIAopAwA3A1ggAykDyAEhDyADKQLcASEQIAMpAuQBIREgDRDDFiAEQRhqIAgoAgA2AgAgBEEQaiALKQMANwIAIARBCGogDCkDADcCACAEIAMpA2g3AgAgCSADKQNYNwMAIAlBCGogDigCADYCACADIBE3AkQgAyAQNwI8IAMgDzcDKCADIAc2AgggA0EHNgIAIAUgA0HYABD2BiAAIAAoAghBAWo2AgggAUHYAGshAUHYAGohBQwACwAL8gMBBn8jAEEwayICJAAgAS0ABCEDIAJBHGpBgAIQ+BEgAkEsakEAOwEAIAJBADYCKCACQRhqIgVBADsBACACQRBqIgYgAkEkaikCADcDACACIAIpAhw3AwggAi0ALyEHIAEtAAYhBCAAQewDahCLDyAAQfwFakIANwIAIABCADcC9AUgAEIANwMAIABBCGpCADcDACAAQRBqQgA3AwAgAEEYakIANwMAIABBgICAgHg2AiAgAEEkakEAQbICEIULGiAAQQA6AIUDIAAgA0EDdEHQnOMAaikDADcA/QIgAEEAOgD8AiAAQQA2AvgCIABCgICAgHA3A/ACIABCgICAgMAANwPoAiAAQgQ3A+ACIAAgA0ECdEHAnOMAaigCADYC3AIgAEEANgLYAiAAQQE6ANcCIAAgBDoA1gIgACACKQMINwOIAyAAQZADaiAGKQMANwMAIABBmANqIAUvAQA7AQAgACADOgCEBiAAQv////8PNwLsBSAAQgA3AtwDIABCgICAgMAANwLUAyAAQgQ3AswDIABCADcCxAMgAEKAgICAwAA3ArwDIABCATcCtAMgAEIANwKsAyAAQoCAgIDAADcCpAMgACABNgKgAyAAQQE6AJ0DIAAgBDoAnAMgACAHOgCbAyAAIAQ6AJoDIAJBMGokAAuhAwEHfwJAIARBAEwNACADIARqIQYCQCAEQQNNBEAgAUH/AXEhASADIQQDQCAEIAZPDQMgBC0AACIFIAFGIAUgAkH/AXFGcg0CIARBAWohBAwACwALAkBBgIKECCADIgQoAAAiBSABQf8BcUGBgoQIbCIKcyIHayAHckGAgYKEeHFBgIGChHhHDQBBgIKECCAFIAJB/wFxQYGChAhsIgdzIgVrIAVyQYCBgoR4cUGAgYKEeEcNACAGQQRrIQUgBEF8cUEEaiEEA0ACQAJAIAQgBUsNAEGAgoQIIAQoAgAiCCAKcyILayALckGAgYKEeHFBgIGChHhHDQBBgIKECCAHIAhzIghrIAhyQYCBgoR4cUGAgYKEeEYNAQsgAUH/AXEhAQNAIAQgBk8NBSAELQAAIgUgAUYgBSACQf8BcUZyDQQgBEEBaiEEDAALAAsgBEEEaiEEDAALAAsDQCAEIAZPDQIgBC0AACIFIAFB/wFxRiAFIAJB/wFxRnINASAEQQFqIQQMAAsACyAEIANrIQRBASEJCyAAIAQ2AgQgACAJNgIAC9cDAQZ/IwBB0ABrIgIkACABKAIEIQMgASgCDCEFIAEoAhQhBgJAAkACQAJAAkADQCADIAVGDQQgAkEQaiADQSgQ9gYaIAEgA0EoaiIDNgIEAkACQAJAAkACQAJAAkACQCACKAIQQQFrDgcCAQIDBAUHAAsgAigCICEDIAIoAjAiBEUEQCACKAIkIQQMBgsgAyAEKAIIIgUgAyAFSxshBCADIAUgAyAFSRshAwwFCyACKAIcIQQgAigCGCEDDAQLIAIoAiQhBCACKAIgIQMMAwsgAigCICEEIAIoAhwhAwwCCyACKAIYIQQgAigCFCEDDAELIAJBCGogAigCFBCLAyACKAIMIQQgAigCCCEDCyACQT86ADggAyAEIAJBOGoQ6xQhBCABKAIQIgFBKGoQyQ0iA0UNAyADKAIAQSRHDQMgASABKQPgAjcDmAMgASgCyAIgAUElNgLIAkEkRw0CIAEgASgCzAIQ+wsMAwsgAigCGCEEAkAgAigCFCIHQQJrDgIEAQALCyAAIAIpAhw3AgggACAENgIEIAAgBzYCAAwEC0G54+AAQShB2MLgABDaFwALIAJBEGoQrCALIAYQ+SYgBiAENgIACyAAQQI2AgALIAJB0ABqJAALrAMBCH8gACgCACIEIAEQoBogBCgCECIGIAQoAhRB2ABsaiEIA0AgCCAGIgJHBEAgAkHYAGohBgJAAkACQAJAAkACQAJAIAIoAgAiAEEEa0EAIABBBWtBCEkbQQFrDggBAgMECAgFBgALIAIgARD8ISACKAJEIgcgAigCSEEGdGohCQNAIAkgByIDRwRAIANBQGshByADKAIAQQdGBEAgAygCOEEMbCEAIAMoAjQhBQNAIAAEQCAFIAEQ5iwgAEEMayEAIAVBDGohBQwBCwsgAy0AHEECRw0CIANBCGogARDkJQwCBSADIAEQ9CUMAgsACwsgAigCIEGAgICAeEYNByACQSBqIAEQmRoMBwsgAkEIaiABEPwhIAJBMGogARDrLAwGCyACQSBqIAEQ6ywMBQsgAkEIaiABEPwhIAJBPGogARD5JSACQTBqIAEQoBoMBAsgAkEkaiABEPklIAJBLGogARCgGgwDCyACQQRqIAEQmRoMAgsgAigCCEEFRwRAIAJBCGogARD8IQsgAkE8aiABEPklIAJBMGogARCgGgwBCwsgBEEwaiABEPklC6wDAgd/AX4jAEEgayICJAAgAUEoaiIDEKUgIQQgAkEIaiABEL4FIAIoAgghBQJAAkAgAi0AHEECRwRAIAIoAhQhByACKAIQIQggAigCDCEGAkAgAxDIDSIDBEAgAygCAEETRg0BCyAAIAc2AhwgACAINgIYIABCADcDCCAAQQA2AgAgACAFrSAGrUIghoQ3AxAMAwsgASgCyAIhAyABQSU2AsgCIAEgASkD4AI3A5gDIAJBFGogAUHUAmopAgA3AgAgAkEcaiABQdwCaigCADYCACACIAEpAswCNwIMIAIgAzYCCCACQQhqIgMQvgogAyABEL4FIAItABxBAkYEQCACKAIIIQEMAgsgAigCECEBIAIpAwgiCVANASAAIAIoAhQiAzYCJCAAIAE2AiAgACAJNwMYIAAgBzYCFCAAIAg2AhAgAEEANgIAIAAgBCADIAMgBEkbNgIsIAAgBCADIAMgBEsbNgIoIAAgBa0gBq1CIIaENwMIDAILIABBATYCACAAIAU2AgQMAQsgAEEBNgIAIAAgATYCBCAFrSAGrUIghoQQ1hoLIAJBIGokAAuNBAEFfyAAKAIEIQIgACgCACEBIABCiICAgIABNwIAIAIgAWtBOG4hAwJAIAEgAkYNAANAIANFDQECQCABKAIAIgJBCUcEQAJAAkACQAJAAkACQAJAAkACQCACDggBAgMEBQYHCAALIAFBEGopAwAQ1hoMCQsgAUEIaiICKAIAIAFBDGooAgAQ7Q8gAUEEaigCACACKAIAEPYpIAFBEGooAgAQ2iggAUEcaigCABDmIgwICyABQQhqENYJDAcLIAFBCGoiAigCACABQQxqKAIAEOIQIAFBBGooAgAgAigCABD3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BBAUCyABQZABaiQAQZSC5AAoAgAQISIEECYiABAnIQIgABCxJiAEELEmQYABECghACAHIAcoAgBBAWoiBDYCACAERQ0BQcCN5AAtAAAaQQQQYCIERQ0BIAQgBzYCACAEQbiY4wBBrQUQKiEBQYABELEmQeCB5AAtAABBAkZB4IHkACACQQFGOgAAQeGB5AAgCy8BDDsAAEHcgeQAKAIAIQJB3IHkACAANgIAQdiB5AAoAgAhAEHYgeQAIAE2AgBB1IHkACgCACEBQdSB5ABBuJjjADYCAEHQgeQAKAIAIQVB0IHkACAENgIAQcyB5AAoAgAhBEHMgeQAIAc2AgBB44HkACALQQ5qLQAAOgAADQAgBBDcCCACELEmIAAQKUUNACAFIAEQ8hwLIAtBEGokAEHMgeQADwsAC6kDAQR/IwBBIGsiAyQAAkAgAi0ADCIEQQFGBEAgACABKQIANwIAIABBCGogAUEIaikCADcCACACKAIAIAIoAgQQuykMAQsCQAJAAkACQAJAAkACQAJAAkAgAS0ADCIFQQFrDgIAAgELIAAgAikCADcCACAAQQIgBGs6AAwgACACLwANOwANIABBCGogAkEIaigCADYCACAAQQ9qIAJBD2otAAA6AAAgASgCBCEEDAcLIARFDQEMAgsgBEUNAQsgASgCBCIEIAEoAgggAigCBCIGIAIoAggQ0ylB/wFxDgICAwELIANBEGoiBCABIAIQ5w0gACAFIAQQ0BIMBAsgA0EYaiACQQhqKAIANgIAIAMgAikCADcDECADQQRqIgIgA0EQaiABENkgIABBAiAFayACENASDAMLIABBCGpBrP/BACkCADcCACAAQaT/wQApAgA3AgAgAigCACAGELspDAELIANBGGogAUEIaigCADYCACADIAEpAgA3AxAgA0EEaiIBIANBEGogAhDZICAAIAUgARDQEgwBCyABKAIAIAQQuykLIANBIGokAAv0AgIGfwJ+IwBBEGsiBCQAIAACfwJAAkAgASgCCCIDIAEoAgQiBUkEQCABKAIAIgYgA2otAABB8wBGDQELIABCADcDCAwBCyABIANBAWoiAjYCCAJAAkACQCACIAVPDQAgAiAGai0AAEHfAEcNACABIANBAmo2AggMAQsCQAJAA0ACQCACIAVJBEAgAiAGai0AAEHfAEYNAQsgAiAFRg0C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KQIANwMAIANBFGoiASADIAIoAgQgAigCCBDrCCAAIAUgARDQEgwECyADQQhqIAFBCGooAgA2AgAgAyABKQIANwMAIANBFGoiASAGIAIgAxCeBCAAQQIgBWsgARDQEgwDCyAAQQhqQaz/wQApAgA3AgAgAEGk/8EAKQIANwIADAELIANBCGogAUEIaigCADYCACADIAEpAgA3AwAgA0EUaiIBIAMgBiACENIbIAAgBSABENASDAELIAEoAgAgBBC7KQsgA0EgaiQAC4sDAQh/IwBBMGsiAyQAAkACQCABKAIAIgotABQiBEECRiAEQQFxckUEQCADQQhqIAItABhBAnRBoNXjAGooAgAtAAAQ1RwgAyADKAIMIgcgAygCCCIFa0EBdiIGQQFBAhDnFCADQQA2AiwgAyADKQMANwIkIANBJGogBhDkHiADKAIsIQQgAyAFIAdHBH8gBCAGaiADKAIoIARBAXRqIQQDQCAEQQFqIAUtAAAiCCAFQQFqLQAAIgkgCCAJSxs6AAAgBCAIIAkgCCAJSRs6AAAgBUECaiEFIARBAmohBCAGQQFrIgYNAAsFIAQLNgIsIANBFGogA0EkahCrEyACLQAZDQEMAgtBscjEAEEpQdzIxAAQ2hcACyADQRRqEJQICwJAAkAgCi0AFwRAIAMoAhggAygCHBC2H0UNAQsgACADKQIUNwIEIABBgICAgHg2AgAgAEEMaiADQRxqKQIANwIADAELIAAgASgCBCABKAIIIAJBARDKGCADKAIUIAMoAhgQ1ikLIANBMGokAAuyAwEBfyMAQUBqIgIkAAJAAkACQAJAAkACQCAALQAAQQFrDgMBAgMACyACIAAoAgQ2AgRBwI3kAC0AABpBFBBgIgBFDQQgAEEQakGus9gAKAAANgAAIABBCGpBprPYACkAADcAACAAQZ6z2AApAAA3AAAgAkEUNgIQIAIgADYCDCACQRQ2AgggAkEDNgIsIAJB/KrYADYCKCACQgI3AjQgAiACQQRqrUKAgICA0B6ENwMgIAIgAkEIaq1CgICAgOAehDcDGCACIAJBGGo2AjAgASgCFCABKAIYIAJBKGoQjAQhACACKAIIIgFFDQMgAigCDCABQQEQvREMAwsgAC0AASEAIAJBATYCLCACQaju4AA2AiggAkIBNwI0IAIgAkEYaq1CgICAgLABhDcD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IAcgAygCCCAIQRB0cjYCACAEQQRrIQQMAAsACyADQQA2AiggA0EBNgIcIANBgKjCADYCGCADQgQ3AiAgA0EYakGIqMIAEKEdAAsgBEECdCEEIAVBBGshBiACrSEJQQAhBQNAIARFDQEgBCAGaiICIAI1AgAgBa1CIIaEIgogCYAiCz4CACAKIAkgC359pyEFIARBBGshBAwACwALIANBIGogAUEIaigCADYCACADIAEpAgA3AxggACADQRhqENAJIAAgBTYCDCADQTBqJAAL9QIBAn8jAEEQayIGJAACQAJAAkACQAJAIAEoAiQiBy0A2gJFBEAgBkEIaiABIAIgAyAEIAUQwgEgBigCDCEBIAYoAggiAkECRg0BIAINAwwECyAHLQDbAiEHIAZBCGogASACIAMgBCAFEMIBIAYoAgwhASAGKAIIDgMDAQABCyAAQQI2AgAgACABNgIEDAMLIAdBAXFFDQACQAJAAkAgBSABQQF0IgJLBEAgBCACQQJ0aigCACIHBEAgAkEBciICIAVPDQMgBCACQQJ0aigCACICRQ0CIAIgB0cNBAJAIAMoAgwiBCAHQQFrIgJNBEAgAiAERg0GDAELIAMoAgggAmosAABBv39KDQULIABBADYCAAwHC0GgksMAELwpAAsgAiAFQZCSwwAQmxAAC0HAksMAELwpAAsgAiAFQbCSwwAQmxAACyAAIAE2AgQgAEEBNgIADAILIAAgATYCBCAAQQE2AgAMAQsgAEEANgIACyAGQRBqJAAL2QIBCX8jAEEwayIBJAACfyAAKAIAIgItAGRFBEAgABCtDAwBC0GAgMQAIAIoAlAiBCAAKAIIIgdGDQAaAn9BASAAELwMIgJBgAFJDQAaQQIgAkGAEEkNABpBA0EEIAJBgIAESRsLIQMgAUEYaiAAKAIEIgggByADIARqIgVB+JrEABCwFCABKAIcIQMgASgCGCEAQQAhAiABQQA2AiwgASAAIANqIgM2AiggASAANgIkAkADQCABQRBqIAFBJGoQ9gkgASgCEEUNASABKAIUIQYgASABKAIsIgkgA2ogACABKAIoIgNqayABKAIkIgBqNgIsIAYQhwwNACACIQQgAkUgBkEjRnEhAiAGQQpBIyAEG0YNAAsgBSAJaiEFCyABQQhqIAggByAFQYibxAAQsBQgASABKAIIIgA2AiQg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GyICQRBqKQIANwIAIAFBOGogAkEIaikCADcCACABIAIpAgA3AjAgASADIAAgBBsiACkCADcCSCABQdAAaiAAQQhqKQIANwIAIAFB2ABqIABBEGopAgA3AgAL1QIBBX8jAEEwayICJAACQCAAKAIAIgAEQCABKAIYIQQgASgCFCEFA0BBACEDIABFDQICQCAAQQAgAGtxIgFBAWsiBkEfTUEAQQEgBnRBi4GCgHhxGyABQcAARiABQYABRnJyIAFBgAJGIAFBgARGciABQYAIRiABQYAQRnJycg0AIAFBgCBGIAFBgMAARnIgAUGAgAFGIAFBgIACRnJyIAFBgIAIRnINACABQYCABEcNAwtBASEDIAJBATYCECACQaju4AA2AgwgAkIBNwIYIAJB4QA2AiggAiAAaEECdEGQ0uMAaigCADYCLCAAIAFzIQAgAiACQSRqNgIUIAIgAkEsajYCJCAFIAQgAkEMahCVJEUNAAsMAQsgAkEANgIcIAJBATYCECACQaitxAA2AgwgAkIENwIUIAEoAhQgASgCGCACQQxqEJUkIQMLIAJBMGokACADC60CAQh/IAIgAUEEdEEQayIDaiEFIAAgA2ohBiAAIAFBAXYiCEEEdGoiA0EQayEEA0AgCARAIAIgAyAAIAMgABDNGSIHGyIJKQIANwIAIAJBCGogCUEIaikCADcCACAFIAQgBiAGIAQQzRkiCRsiCikCADcCACAFQQhqIApBCGopAgA3AgAgCEEBayEIIAVBEGshBSACQRBqIQIgAyAHQQR0aiEDIAAgB0EBc0EEdGohACAEIAlBBHQiB2shBCAGIAdqQRBrIQYMAQUCQCAEQRBqIQQgAUEBcQR/IAIgACADIAAgBEkiARsiBSkCADcCACACQQhqIAVBCGopAgA3AgAgAyAAIARPQQR0aiEDIAAgAUEEdGoFIAALIARGIAMgBkEQakZxDQAQiRsACwsLC9UCAQV/IwBBMGsiAiQAAkAgACgCACIABEAgASgCGCEEIAEoAhQhBQNAQQAhAyAARQ0CAkAgAEEAIABrcSIBQQFrIgZBH01BAEEBIAZ0QYuBgoB4cRsgAUHAAEYgAUGAAUZyciABQYACRiABQYAERnIgAUGACEYgAUGAEEZycnINACABQYAgRiABQYDAAEZyIAFBgIABRiABQYCAAkZyciABQYCACEZyDQAgAUGAgARHDQMLQQEhAyACQQE2AhAgAkGo7uAANgIMIAJCATcCGCACQeEANgIoIAIgAGhBAnRB2NTjAGooAgA2AiwgACABcyEAIAIgAkEkajYCFCACIAJBLGo2AiQgBSAEIAJBDGoQlSRFDQALDAELIAJBADYCHCACQQE2AhAgAkGorcQANgIMIAJCBDcCFCABKAIUIAEoAhggAkEMahCVJCEDCyACQTBqJAAgAwu+AgEGfyMAQRBrIgQkAEEKIQMCQCAAQZDOAEkEQCAAIQUMAQsDQCAEQQZqIANqIgZBBGsgAEGQzgBuIgVB8LEDbCAAaiIHQf//A3FB5ABuIghBAXRB8I3YAGovAAA7AAAgBkECayAIQZx/bCAHakH//wNxQQF0QfCN2ABqLwAAOwAAIANBBGshAyAAQf/B1y9LIAUhAA0ACwsCQCAFQeMATQRAIAUhAAwBCyADQQJrIgMgBEEGamogBUH//wNxQeQAbiIAQZx/bCAFakH//wNxQQF0QfCN2ABqLwAAOwAACwJAIABBCk8EQCADQQJrIgMgBEEGamogAEEBdEHwjdgAai8AADsAAAwBCyADQQFrIgMgBEEGamogAEEwcjoAAAsgAiABQQFBACAEQQZqIANqQQogA2sQggQgBEEQaiQAC+0CAQN/IwBBQGoiBiQAAkACQAJAAkACQCABKAIAIgctANoCQQFGBEAgBy0A2wINAQsgBkEoaiABIAIgAyAEIAUQkQggBigCKEUNAQwDCyAHKAK8AigCEEEBdCIIIAVLDQEgBkEoaiABIAIgAyAEIAUQkQggBigCKA0CC0EAIQUMAgsgBygC1AJBAUcEQCAGQShqIAgQ2BIgBkE0aiABIAIgAyAGKAIsIgIgBigCMCIBEJEIIAZBEGogAiABIAVBvIrDABDEHiAEIAUgBigCECAGKAIUQcyKwwAQkB4gBigCOCEBIAYoAjQhBSAGKAIoIAIQuykMAgsgBkIANwIoIAZBHGogASACIAMgBkEoaiIBQQIQkQggBkEIaiABIAVBnIrDABDRHiAEIAUgBigCCCAGKAIMQayKwwAQkB4gBigCICEBIAYoAhwhBQwBCyAGKAIsIQFBASEFCyAAIAE2AgQgACAFNgIAIAZBQGskAAviAgECfyMAQeAAayIDJAACQAJAIAEoAgAtABQiBEECRyAEQQFxRXFFBEACQAJAAkACQCACLQAYQQFrDgIBAgALIANBCGoQ2ioMAgsgA0EIahDZKgwBCyADQQhqQaTJxwBBgwYQ2QoLIANBOGogASgCBCABKAIIIAIgA0EIahDpFiADQTBqIgEgA0HEAGopAgA3AwAgAyADKQI8NwMoIAMoAjgiBEGAgICAeEYEQCADQSBqIAEpAwA3AwAgAyADKQMoNwMYIAItABlFDQIgA0EYahCrCAwCCyAAIAMpAkw3AhQgAEEkaiADQdwAaigCADYCACAAQRxqIANB1ABqKQIANwIAIABBDGogASkDADcCACAAIAMpAyg3AgQgACAENgIADAILQfjHxABBKEGgyMQAENoXAAsgACADKQMYNwIEIABBgICAgHg2AgAgAEEMaiADQSBqKQMANwIACyADQeAAaiQAC9sCAgN/AX4jAEEgayICJAACQAJAAkACQAJAIAEoAgBBAWsOAwECAwALIABBCGogAUEIahCfIyAAQQA2AgAMAwsgASkDECEFIAJBBGogAUEEahCwDCABLQAcIQMgAUEYahD5GyEBIAJBHGoiBCADOgAAIABBATYCACAAIAIpAgQ3AgQgAiAFNwIQIABBDGogAkEMaikCADcCACACIAE2AhggAEEUaiACQRRqKQIANwIAIABBHGogBCgCADYCAAwCCyAAQQRqIAFBBGoQoBkgAEECNgIADAELIAEpAxAhBSACQQRqIAFBBGoQqAcgAS0AHCEDIAFBGGoQ+RshASACQRxqIgQgAzoAACAAQQM2AgAgACACKQIENwIEIAIgBTcCECAAQQxqIAJBDGopAgA3AgAgAiABNgIYIABBFGogAkEUaikCADcCACAAQRxqIAQoAgA2AgALIAJBIGokAAvCAgEEfyMAQTBrIgIkACABKAIIIQMgASgCBCEBIAIgADYCECACIAE2AgggAiABIANBMGxqNgIMAn8gAkEIahD1ESIBRQRAQQAhAUEEDAELIAJBBEEEQQQQ5xQgAigCACEDIAIoAgQiBCABNgIAIAJBATYCHCACIAQ2AhggAiADNgIUIAJBKGogAkEQaigCADYCACACIAIpAgg3AyBBBCEDQQEhAQNAIAJBIGoQ9REiBQRAIAIoAhQgAUYEQCACQRRqIAFBAUEEQQQQrRcgAigCGCEECyADIARqIAU2AgAgAiABQQFq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QcgAahCrDkEIIQEgA0EYaiIEIANBOGoiBikDADcDACADQSBqIgUgA0FAayIHKQMANwMAIAMgAykDMDcDEAJAIAMoAihFBEAgA0HYAGogBSkDACIINwMAIANB0ABqIAQpAwAiCTcDACADIAMpAxAiCjcDSCADQTxqIAg3AgAgA0E0aiAJNwIAIAMgCjcCLCAAQRxqIAcoAgA2AgAgAEEUaiAGKQIANwIAIABBDGogA0EwaikCADcCACAAIAMpAig3AgQgAEEAOgAkIAAgAjYCIEEBIQEMAQsgACADKQMQNwMIIABBGGogBSkDADcDACAAQRBqIAQpAwA3AwAgA0EMahDFFwsgACABNgIAIANB4ABqJAAL1AIBA38jAEEwayICJAACQAJAIAEoAsABIAEoAsQBEN8cIgNB3ABGDQACQCADQf8ATQRAIANBgOnYAGotAAANAgwBCyADQQN2QT9xQYDq2AAgA0EJdkHY7+AAaiADQf/HDEsbLQAAQQV0akGAgeEAai0AACADQQdxdkEBcQ0BCyABKALQASEEIAFBwAFqEJ0VIAJBIToAGCACIAM2AhwgAiAEIAQgAkEYahDEISACKAIEIQEgAigCACIDQSdHBEAgACACKQMINwMIIABBEGogAkEQaikDADcDACAAIAE2AgQgACADNgIADAILIABBJjYCACAAIAE2AgQMAQsgAkEYaiABEN0DIAIoAhhBJUcEQCAAIAIpAxg3AwAgAEEQaiACQShqKQMANwMAIABBCGogAkEgaikDADcDAAwBCyAAIAIoAhw2AgQgAEEmNgIACyACQTBqJAALzQICBX8CfiMAQTBrIgIkACABKAIAIgNBCGohBSADIAEoAgQiBGpBAWohBiADKQMAQn+FQoCBgoSIkKDAgH+DIQggASgCDCEBAn8gBEUEQEEADAELIAJBCCAEQQFqEM4OIAI1AgQgAyACKAIIa61CIIaEIQcgAigCAAshBCAAIAFBAWpBAXYgASAAKAIMGyAAQRBqENwhIAIgBzcCJCACIAQ2AiAgAiABNgIYIAIgAzYCECACIAY2AgwgAiAFNgIIIAIgCDcDAAJAA0AgAUUNASACEL0PIQMgAiACKAIYQQFrIgE2AhggAwRAIAAgA0EIaykDABC3CQwBCwsgAUUNAANAIAIQvQ8hACACIAIoAhhBAWsiATYCGCAARQ0BIABBCGspAwAQ1hogAQ0ACwsgAigCICIABEAgAigCKCAAIAIoAiQQmyQLIAJBMGokAAvBAgEEfyMAQSBrIgUkACAEIAIgBGsiByAEIAdLGyEIQQEhBgJAAkAgBEEBdCACTw0AAkAgAiAETwRAIAMgB0sNASADIARJDQIgBSADIARrIAEgBGogA0G4+8EAEPEcIAUoAgQgBEcNAiAFKAIAIQIDQAJAIARBA00EQCAEQQFLBEAgAi8AACABLwAARw0GIARBAmshBCACQQJqIQIgAUECaiEBCyAEDQFBACEGDAYLIAIoAAAgASgAAEcNBCAEQQRrIQQgAUEEaiEBIAJBBGohAgwBCwsgCCADIAItAAAgAS0AAEciBhshAwwDCyAFQQA2AhggBUEBNgIMIAVBmL7gADYCCCAFQgQ3AhAgBUEIakGo+sEAEKEdAAsgAyAHQbj6wQAQnRAACyAIIQMLIAAgAzYCBCAAIAY2AgAgBUEgaiQAC8wCAQh/IwBB0ABrIgMkACACQQFqIQggASgCACEJIANBFGohBiABKAIIIQIgASgCBCIEQRxqIQcgBEEYaiEKAkACQAJAA0AgBygCACIBIAhNBEAgAUUNAiAEQRhqKAIAIAEgAUEBa0HgssMAEKcfIAIQhBMgAEEqNgIADAQLIAcgAUEBayIBNgIAIAooAgAgAUEEdGoiASgCACIFQYCAgIB4Rg0CIAYgASkCBDcCACAGQQhqIAFBDGooAgA2AgAgAyAFNgIQIANBEGoiASACEIQTIANBCGogA0EYaiIFKAIANgIAIAMgAykCEDcDACABIAkgBCADEOEEIAMoAhQhAiADKAIQIgFBKkYNAAsgAEEIaiAFQTgQ9gYaIAAgAjYCBCAAIAE2AgAMAgtB9K/DAEEPQdCywwAQoRIAC0HEscMAELwpAAsgA0HQAGokAAu1AgEGfyMAQTBrIgMkAEEKIQICQCAAQZDOAEkEQCAAIQQMAQsDQCADQQhqIAJqIgVBBGsgACAAQZDOAG4iBEGQzgBsayIGQf//A3FB5ABuIgdBAXRB8I3YAGovAAA7AAAgBUECayAGIAdB5ABsa0H//wNxQQF0QfCN2ABqLwAAOwAAIAJBBGshAiAAQf/B1y9LIAQhAA0ACwsCQCAEQeMATQRAIAQhAAwBCyACQQJrIgIgA0EIamogBCAEQeQAbiIAQeQAbGtBAXRB8I3YAGovAAA7AAALAkAgAEEKTwRAIAJBAmsiAiADQQhqaiAAQQF0QfCN2ABqLwAAOwAADAELIAJBAWsiAiADQQhqaiAAQTByOgAACyADIAEgA0EIaiACakEKIAJrELAbIAMQzhggA0EwaiQAC+gCAQF/IwBBEGsiAiQAAn8CQAJAAkACQAJAAkACQAJAAkAgACgCACIAKAIAQQFrDggBAgMEBQYHCAALIAIgAEEEajYCDCABQYKN2QBBBiACQQxqQc8EEMQKDAgLIAIgAEEIajYCDCABQfmL2QBBCiACQQxqQdAEEMQKDAcLIAIgAEEEajYCDCABQYiN2QBBCyACQQxqQdEEEMQKDAYLIAIgAEEIajYCDCABQZON2QBBESACQQxqQdIEEMQKDAULIAIgAEEEajYCDCABQaSN2QBBESACQQxqQdMEEMQKDAQLIAIgAEEEajYCDCABQeSL2QBBCSACQQxqQdQEEMQKDAMLIAIgAEEEajYCDCABQbWN2QBBDiACQQxqQdUEEMQKDAILIAIgAEEEajYCDCABQcON2QBBEiACQQxqQdYEEMQKDAELIAIgAEEIajYCDCABQdWN2QBBESACQQxqQdcEEMQKCyACQRBqJAALzAIBCH8jAEEgayICJAAgAkEUaiABKAIEIAEoAghBEBCVASACKAIcIQMCQCABLQAMBEAgAigCGCEEDAELIAIoAhQgA0YEQCACQRRqEOQWCyACKAIYIgQgA2pBLToAACACIANBAWoiAzYCHAsgAkEIaiADQQF2IgEgBCABQajr4AAQhh4gAigCDCEFIAIoAgghByACIAEgAyAEaiABayABQbjr4AAQhh4gAUEBayEBQQAhAyACKAIEIQQgAigCACEIAkACQANAIAFBf0YNASADIAVGDQIgASAESQRAIAMgB2oiBi0AACEJIAYgASAIaiIGLQAAOgAAIAYgCToAACABQQFrIQEgA0EBaiEDDAELCyABIARB2OvgABCbEAALIAAgAikCFDcCACAAQQhqIAJBHGooAgA2AgAgAkEgaiQADwsgBSAFQcjr4AAQmxAAC9ACAgN/AX4jAEEgayIDJAAgASgCDCEFIANBEGogAiABKAIIIgRBABDRAQJAAkACQAJAAkAgAy0AEEEERwRAIAMpAxAiBkL/AYNCBFINAQsCQCAERQ0AIANBEGogAiAEELMcIAMtABBBBEYNACADKQMQIgZC/wGDQgRSDQILIANBADYCECADQQhqIAIgA0EQakHjsuAAQQEQlBMgAy0ACEEERwRAIAMpAwgiBkL/AYNCBFINAwsgA0EQaiACIAQgAUEAEKwFIAMtABBBBEcEQCADKQMQIgZC/wGDQgRSDQQLAkACQCAFRQ0AIANBEGogAiAFELMcIAMtABBBBEYNACADKQMQIgZC/wGDQgRSDQELIABBBDoAAAwFCyAAIAY3AgAMBAsgACAGNwIADAMLIAAgBjcCAAwCCyAAIAY3AgAMAQsgACAGNwIACyADQSBqJAALpwICBn8BfiMAQSBrIgMkACABKAIcIgUgAUEMaygCAEkgASgCGCIEIAFBEGsoAgAiAkkgAiAERhtBAUYEQCADQRhqIAFBEGopAwA3AwAgA0EQaiABQQhqKQMANwMAIAMgASkDADcDCCABQThrIQIgASkDICEIAn8CQANAIAIiAUE4aiABQRBqIgYiAkEoEPYGGiAAIAJGDQEgAUEoayECIAUgAUEEaigCAEkgBCABKAIAIgdJIAQgB0YbDQALIAYhAiABQThqDAELIAFBEGohAiABQThqCyEBIAIgAykDCDcDACACQRBqIANBGGopAwA3AwAgAkEIaiADQRBqKQMANwMAIAFBCGsgCDcDACABQQxrIAU2AgAgAUEQayAENgIACyADQSBqJAAL2QIBCH8jAEEgayIEJAACQCADQQFHDQBBACEDIAAoAgAtAABBAUYNACAAKAIEKAIMIgZFDQAgACgCCCIFIAFB/wFxIgFqQcgAaiEJIAVBCGohByAFQQRqIQggBUEgaiEKIAVBHGohCwNAAkACfyAIKAIAIAcoAgAgBkH8jMQAEJofKAIEIgMEQCALKAIAIAooAgAgAyAJLQAAakGMjcQAEJkfKAIADAELIAQgBSAGEIcgIAQgBCkDADcCDANAIARBFmogBEEMahD3DiAELQAWRQ0CIAQtABciAyABSQ0ACyABIANHDQEgBCgAGAsiA0EBRw0CCyAIKAIAIAcoAgAgBkGokcQAEJofKAIMIQYMAAsACyAAKAIUKAIAKAIAIQEgACgCDCIFQQRqKAIAIAVBCGooAgAgACgCECgCACACQf8BcWpBkJnAABCZHyADIAF0NgIAIARBIGokAAvhAgEDfyMAQTBrIgYkAAJAAkAgASgCJCIHLQDaAkEBRw0AIActANsCRQ0AIAcoArwCKAIQQQF0IgggBU0NACAHKALUAkEBRgRAIAZCADcCKCAGQRxqIAEgAiADIAZBKGoiA0ECENoGIAYoAiAhASAGKAIcIgJBAkcEQCAGQQhqIAMgBUHI+MIAENEeIAQgBSAGKAIIIAYoAgxB2PjCABCQHgsgACACNgIAIAAgATYCBAwCCyAGQRxqIAgQ2BIgBkEoaiABIAIgAyAGKAIgIgEgBigCJCIDENoGIAYoAiwhAiAGKAIoIgdBAkcEQCAGQRBqIAEgAyAFQej4wgAQxB4gBCAFIAYoAhAgBigCFEH4+MIAEJAeIAAgAjYCBCAAIAc2AgAgBigCHCABELspDAILIABBAjYCACAAIAI2AgQgBigCHCABELspDAELIAAgASACIAMgBCAFENoGCyAGQTBqJAAL7QIBAX8jAEEwayIDJAACQAJAAkAgASACQfzKyABBDhDNH0UEQCABIAJBrP7HAEEFEM0fDQEgASACQbn+xwBBAxDNHw0CIAEgAkGx/scAQQgQzR9FBEAgA0EIakGAp80AQSUgASACENgKIANBIGogAygCCCADKAIMELIhIAMoAiBBgICAgHhGBEAgAEGAgICAeDYCACAAQQE6AAQMBQsgACADKQIgNwIAIABBCGogA0EoaikCADcCAAwECyADQSBqQenByABBChCnByADLQAkIQEgAygCICICQYCAgIB4RwRAIANBHGogA0EsaigAADYAACADIAMpACU3ABUgAyABOgAUIAMgAjYCECADQRBqEKsIIABBCGogA0EYaikCADcCACAAIAMpAhA3AgAMBAsgAEGAgICAeDYCACAAIAE6AAQMAwsgABDaKgwCCyAAQdirzQBBARDZCgwBCyAAQdCrzQBBARDZCgsgA0EwaiQAC8QCAgx/AX4jAEHwAGsiAiQAIAEoAgQhCCACIAEoAggiBUEIQTgQ5xQgBUE4bCEJIAJBEGohBiACQcgAaiEKIAJBCGpBBHIhCyACKAIEIQdBACEBIAIoAgAiDCEEA0AgBEUgASAJRnJFBEACQAJAAkACQCABIAhqIgMoAgBBAWsOAgECAAsgAkFAayINIANBCGoQxQ4gAiADQShqENoZNgJgIAYgDUEoEPYGGiACQQA2AggM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IQMgBCgCAAsgAxCSIEGAASEGAn8gBygCACIFQYABTQRAIABBAWohCCAFDAELIABBBGohByAAKAIIIQggBSEGIAAoAgQLIQMCQANAIAMgBk8EQCAHIAM2AgADQCABIAJGDQMgACABLQAAEKkOIAFBAWohAQwACwALIAEgAkcEQCADIAhqIAEtAAA6AAAgA0EBaiEDIAFBAWohAQwBCwsgByADNgIACyAEQRBqJAALygICBH8BfiMAQUBqIgIkAAJAAkACQCABKAIAIgQgASgCBEYNACABIARBGGo2AgACQCABKAIQIgMgASgCFEYNACABIANBCmo2AhAgAy0AACIFQQJGDQAgAkEoaiADQQlqLQAAOgAAIAIgAykAATcDIAwCCyABIAEoAgwiBTYCFCABIAEoAggiAzYCECADIAVGDQAgASADQQpqNgIQIAJBKGogA0EJai0AADoAACACIAMpAAE3AyAgAy0AACIFQQJHDQELIABBgYCAgHg2AgAMAQsgAkEYaiACQShqLQAAOgAAIAIgAikDICIGNwMQIAJBLGogAigAFzYAACACIAU6ACQgAiAENgIgIAIgBjcAJSACQQhqIAQQ2R8gAkE0aiIBIAIoAgggAigCDBCqISAAIAEgBCgCDCAEKAIQIAJBJGoQsAULIAJBQGskAAvzRQEHfyMAQTBrIgUkAAJAAkACQAJAAkACQCABLQAIQbgBRgRAIAEoAhAhAyABKAIMIQQgASgCHCEGIAEoAhghByAFIAEoAhQiCCgCACACELgHIAAgBSAEIAMgByAGENwNIgIpAgA3AgAgAEEIaiACQQhqKAIANgIAIAgQuSsgAS0ACEG4AUcNAQwFCyABKAIEIQcgASgCACEIIAUgARCMHCAFQRhqIQMgBSEBIwBB0ABrIgQkAAJAAkACfwJAAkACQAJAAkACQANAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABLQAAQQFrDroBAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wwQExMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gAGBAYIBgwGEAYUBhgGHAYgBiQGKAYsBjAGNAY4BjwGQAZEBkgGTAZQBlQGWAZcBmAGZAZoBmwGcAZ0BngGfAaABoQGiAaMBpAGlAaYBpwGoAakBqgGrAawBrQGuAa8BsAGxAbIBswG0AbUBtgG3AbgBugEACyADQQ42AgggA0HErNkANgIEIANBgICAgHg2AgAMwQELIANBGjYCCCADQbOt2QA2AgQgA0GAgICAeDYCAAzAAQsgA0EgNgIIIANBza3ZADYCBCADQYCAgIB4NgIADL8BCyADQS82AgggA0HtrdkANgIEIANBgICAgHg2AgAMvgELIANB0wA2AgggA0GcrtkANgIEIANBgICAgHg2AgAMvQELIANBKTYCCCADQe+u2QA2AgQgA0GAgICAeDYCAAy8AQsgA0EmNgIIIANBmK/ZADYCBCADQYCAgIB4NgIADLsBCyADQSo2AgggA0G+r9kANgIEIANBgICAgHg2AgAMugELIANBETYCCCADQeiv2QA2AgQgA0GAgICAeDYCAAy5AQsgA0EXNgIIIANB+a/ZADYCBCADQYCAgIB4NgIADLgBCyADQSw2AgggA0GQsNkANgIEIANBgICAgHg2AgAMtwELIANB4gA2AgggA0G8sNkANgIEIANBgICAgHg2AgAMtgELIANBGjYCCCADQZ6x2QA2AgQgA0GAgICAeDYCAAy1AQsgA0ElNgIIIANBuLHZADYCBCADQYCAgIB4NgIADLQBCyADQRw2AgggA0HdsdkANgIEIANBgICAgHg2AgAMswELIANBJzYCCCADQfmx2QA2AgQgA0GAgICAeDYCAAyyAQsgA0EnNgIIIANBoLLZADYCBCADQYCAgIB4NgIADLEBCyADQSc2AgggA0HHstkANgIEIANBgICAgHg2AgAMsAELIANBMDYCCCADQe6y2QA2AgQgA0GAgICAeDYCAAyvAQsgA0EpNgIIIANBnrPZADYCBCADQYCAgIB4NgIADK4BCyADQTU2AgggA0HHs9kANgIEIANBgICAgHg2AgAMrQELIANBMzYCCCADQfyz2QA2AgQgA0GAgICAeDYCAAysAQsgA0EfNgIIIANBr7TZADYCBCADQYCAgIB4NgIADKsBCyABLQABQQJrIgFBB3QgAUH+AXFBAXZyQf8BcQ4IpAGjAaMBpQGmAaMBowGnAaMBCyADQSg2AgggA0GktdkANgIEIANBgICAgHg2AgAMqQELIANBJTYCCCADQcy12QA2AgQgA0GAgICAeDYCAAyoAQsgA0EaNgIIIANB8bXZADYCBCADQYCAgIB4NgIADKcBCyADQRw2AgggA0GLttkANgIEIANBgICAgHg2AgAMpgELIANBFzYCCCADQae22QA2AgQgA0GAgICAeDYCAAylAQsgBCABQQhqNgIgIARBATYCPCAEQey22QA2AjggBEIBNwJEIARB6wQ2AjAgBCAEQSxqNgJAIAQgBEEgajYCLCAEQRBqIARBOGoQ+BQgA0EIaiAEQRhqKAIANgIAIAMgBCkCEDcCAAykAQsgA0EbNgIIIANB9LbZADYCBCADQYCAgIB4NgIADKMBCyADQRU2AgggA0GPt9kANgIEIANBgICAgHg2AgAMogELIANBHzYCCCADQaS32QA2AgQgA0GAgICAeDYCAAyhAQsgBCABQQRqNgIgIARBATYCPCAEQdi32QA2AjggBEIBNwJEIARB/QQ2AjAgBCAEQSxqNgJAIAQgBEEgajYCLCAEQRBqIARBOGoQ+BQgA0EIaiAEQRhqKAIANgIAIAMgBCkCEDcCAAygAQsgA0EVNgIIIANB4LfZADYCBCADQYCAgIB4NgIADJ8BCyADQRY2AgggA0H1t9kANgIEIANBgICAgHg2AgAMngELIAQgAUEEajYCICAEQQE2AjwgBEG0uNkANgI4IARCATcCRCAEQcgANgIwIAQgBEEsajYCQCAEIARBIGo2AiwgBEEQaiAEQThqEPgUIANBCGogBEEYaigCADYCACADIAQpAhA3AgAMnQELIANBJjYCCCADQby42QA2AgQgA0GAgICAeDYCAAycAQsgA0EtNgIIIANB4rjZADYCBCADQYCAgIB4NgIADJsBCyAEIAFBCGo2AiAgBEECNgI8IARBwLnZADYCOCAEQgE3AkQgBEHrBDYCMCAEIARBLGo2AkAgBCAEQSBqNgIsIARBEGogBEE4ahD4FCADQQhqIARBGGooAgA2AgAgAyAEKQIQNwIADJoBCyADQTs2AgggA0HQudkANgIEIANBgICAgHg2AgAMmQELIANBzAA2AgggA0GLutkANgIEIANBgICAgHg2AgAMmAELIANBOjYCCCADQde62QA2AgQgA0GAgICAeDYCAAyXAQsgA0HKADYCCCADQZG72QA2AgQgA0GAgICAeDYCAAyWAQsgA0ExNgIIIANB27vZADYCBCADQYCAgIB4NgIADJUBCyADQRQ2AgggA0GMvNkANgIEIANBgICAgHg2AgAMlAELIANBHzYCCCADQaC82QA2AgQgA0GAgICAeDYCAAyTAQsgA0EyNgIIIANBv7zZADYCBCADQYCAgIB4NgIADJIBCyAEIAFBDGo2AgwgBCABQQRqNgIgIARBAjYCPCAEQZC92QA2AjggBEICNwJEIARByAA2AhwgBEEINgIUIAQgBEEQajYCQCAEIARBIGo2AhggBCAEQQxqNgIQIARBLGogBEE4ahD4FCADQQhqIARBNGooAgA2AgAgAyAEKQIsNwIADJEBCyADQR42AgggA0HkvdkANgIEIANBgICAgHg2AgAMkAELIANBJTYCCCADQYK+2QA2AgQgA0GAgICAeDYCAAyPAQsgBCABQQRqNgIMIAQgAUEIajYCICAEQQM2AjwgBEG8vtkANgI4IARCAjcCRCAEQQg2AhwgBEG2AjYCFCAEIARBEGo2AkAgBCAEQSBqNgIYIAQgBEEMajYCECAEQSxqIARBOGoQ+BQgA0EIaiAEQTRqKAIANgIAIAMgBCkCLDcCAAyOAQsgA0EaNgIIIANB1L7ZADYCBCADQYCAgIB4NgIADI0BCyADQdUANgIIIANB7r7ZADYCBCADQYCAgIB4NgIADIwBCyADQTI2AgggA0HDv9kANgIEIANBgICAgHg2AgAMiwELIANB0gA2AgggA0H1v9kANgIEIANBgICAgHg2AgAMigELIANBLDYCCCADQcfA2QA2AgQgA0GAgICAeDYCAAyJAQsgA0EzNgIIIANB88DZADYCBCADQYCAgIB4NgIADIgBCyADQSI2AgggA0GmwdkANgIEIANBgICAgHg2AgAMhwELIANBNzYCCCADQcjB2QA2AgQgA0GAgICAeDYCAAyGAQsgA0EoNgIIIANB/8HZADYCBCADQYCAgIB4NgIADIUBCyADQQ02AgggA0GnwtkANgIEIANBgICAgHg2AgAMhAELIANBETYCCCADQbTC2QA2AgQgA0GAgICAeDYCAAyDAQsgA0EVNgIIIANBxcLZADYCBCADQYCAgIB4NgIADIIBCyADQRk2AgggA0HawtkANgIEIANBgICAgHg2AgAMgQELIANBDjYCCCADQfPC2QA2AgQgA0GAgICAeDYCAAyAAQsgA0EaNgIIIANBgcPZADYCBCADQYCAgIB4NgIADH8LIAQgAUEIajYCICAEQQI2AjwgBEG4w9kANgI4IARCATcCRCAEQesENgIwIAQgBEEsajYCQCAEIARBIGo2AiwgBEEQaiAEQThqEPgUIANBCGogBEEYaigCADYCACADIAQpAhA3AgAMfgsgA0ElNgIIIANByMPZADYCBCADQYCAgIB4NgIADH0LIANBLTYCCCADQe3D2QA2AgQgA0GAgICAeDYCAAx8CyADQTw2AgggA0GaxNkANgIEIANBgICAgHg2AgAMewsgA0E0NgIIIANB1sTZADYCBCADQYCAgIB4NgIADHoLIANBKzYCCCADQYrF2QA2AgQgA0GAgICAeDYCAAx5CyADQS02AgggA0G1xdkANgIEIANBgICAgHg2AgAMeAsgA0EkNgIIIANB4sXZADYCBCADQYCAgIB4NgIADHcLIANBHTYCCCADQYbG2QA2AgQgA0GAgICAeDYCAAx2CyADQSg2AgggA0GjxtkANgIEIANBgICAgHg2AgAMdQsgA0EuNgIIIANBy8bZADYCBCADQYCAgIB4NgIADHQLIANBKjYCCCADQfnG2QA2AgQgA0GAgICAeDYCAAxzCyADQTY2AgggA0Gjx9kANgIEIANBgICAgHg2AgAMcgsgA0E+NgIIIANB2cfZADYCBCADQYCAgIB4NgIADHELIANBMzYCCCADQZfI2QA2AgQgA0GAgICAeDYCAAxwCyADQSk2AgggA0HKyNkANgIEIANBgICAgHg2AgAMbwsgA0EZNgIIIANB88jZADYCBCADQYCAgIB4NgIADG4LIANBOzYCCCADQYzJ2QA2AgQgA0GAgICAeDYCAAxtCyADQT02AgggA0HHydkANgIEIANBgICAgHg2AgAMbAsgA0EtNgIIIANBhMrZADYCBCADQYCAgIB4NgIADGsLIAQgAUEIajYCICAEQQI2AjwgBEHgytkANgI4IARCATcCRCAEQesENgIwIAQgBEEsajYCQCAEIARBIGo2AiwgBEEQaiAEQThqEPgUIANBCGogBEEYaigCADYCACADIAQpAhA3AgAMagsgA0E6NgIIIANB8MrZADYCBCADQYCAgIB4NgIADGkLIANB8AA2AgggA0Gqy9kANgIEIANBgICAgHg2AgAMaAsgA0E1NgIIIANBmszZADYCBCADQYCAgIB4NgIADGcLIANByQA2AgggA0HPzNkANgIEIANBgICAgHg2AgAMZgsgA0EpNgIIIANBmM3ZADYCBCADQYCAgIB4NgIADGULIANBJjYCCCADQcHN2QA2AgQgA0GAgICAeDYCAAxkCyADQTs2AgggA0HnzdkANgIEIANBgICAgHg2AgAMYwsgA0E4NgIIIANBos7ZADYCBCADQYCAgIB4NgIADGILIAQgAUEIajYCICAEQQI2AjwgBEGQz9kANgI4IARCATcCRCAEQesENgIwIAQgBEEsajYCQCAEIARBIGo2AiwgBEEQaiAEQThqEPgUIANBCGogBEEYaigCADYCACADIAQpAhA3AgAMYQsgA0EnNgIIIANBoM/ZADYCBCADQYCAgIB4NgIADGALIANBGzYCCCADQcfP2QA2AgQgA0GAgICAeDYCAAxfCyADQSE2AgggA0Hiz9kANgIEIANBgICAgHg2AgAMXgsgA0ElNgIIIANBg9DZADYCBCADQYCAgIB4NgIADF0LIANBzgA2AgggA0Go0NkANgIEIANBgICAgHg2AgAMXAsgA0EdNgIIIANB9tDZADYCBCADQYCAgIB4NgIADFsLIANBOTYCCCADQZPR2QA2AgQgA0GAgICAeDYCAAxaCyADQTk2AgggA0HM0dkANgIEIANBgICAgHg2AgAMWQsgA0E5NgIIIANBhdLZADYCBCADQYCAgIB4NgIADFgLIANBLjYCCCADQb7S2QA2AgQgA0GAgICAeDYCAAxXCyAEIAFBCGo2AiAgBEECNgI8IARBlNPZADYCOCAEQgE3AkQgBEHrBDYCMCAEIARBLGo2AkAgBCAEQSBqNgIsIARBEGogBEE4ahD4FCADQQhqIARBGGooAgA2AgAgAyAEKQIQNwIADFYLIANBPzYCCCADQaTT2QA2AgQgA0GAgICAeDYCAAxVCyADQTY2AgggA0Hj09kANgIEIANBgICAgHg2AgAMVAsgBCABQQhqNgIgIARBAjYCPCAEQfjU2QA2AjggBEIBNwJEIARB6wQ2AjAgBCAEQSxqNgJAIAQgBEEgajYCLCAEQRBqIARBOGoQ+BQgA0EIaiAEQRhqKAIANgIAIAMgBCkCEDcCAAxTCyADQcYANgIIIANBiNXZADYCBCADQYCAgIB4NgIADFILIANBKDYCCCADQc7V2QA2AgQgA0GAgICAeDYCAAxRCyAEIAFBBGo2AiAgBEECNgI8IARBnNbZADYCOCAEQgE3AkQgBEGBBTYCMCAEIARBLGo2AkAgBCAEQSBqNgIsIARBEGogBEE4ahD4FCADQQhqIARBGGooAgA2AgAgAyAEKQIQNwIADFALIANBITYCCCADQazW2QA2AgQgA0GAgICAeDYCAAxPCyADQRY2AgggA0HN1tkANgIEIANBgICAgHg2AgAMTgsgA0EUNgIIIANB49bZADYCBCADQYCAgIB4NgIADE0LIANBHTYCCCADQffW2QA2AgQgA0GAgICAeDYCAAxMCyADQTE2AgggA0GU19kANgIEIANBgICAgHg2AgAMSwsgA0EzNgIIIANBxdfZADYCBCADQYCAgIB4NgIADEoLIAQgAUEIajYCDCAEIAFBEGo2AiAgBEEDNgI8IARBnNjZADYCOCAEQgI3AkQgBEHrBDYCHCAEQesENgIUIAQgBEEQajYCQCAEIARBIGo2AhggBCAEQQxqNgIQIARBLGogBEE4ahD4FCADQQhqIARBNGooAgA2AgAgAyAEKQIsNwIADEkLIAQgAUEIajYCICAEQQI2AjwgBEHM2NkANgI4IARCATcCRCAEQesENgIwIAQgBEEsajYCQCAEIARBIGo2AiwgBEEQaiAEQThqEPgUIANBCGogBEEYaigCADYCACADIAQpAhA3AgAMSAsgA0E/NgIIIANB3NjZADYCBCADQYCAgIB4NgIADEcLIANBxQA2AgggA0Gb2dkANgIEIANBgICAgHg2AgAMRgsgA0EkNgIIIANB4NnZADYCBCADQYCAgIB4NgIADEULIANBIzYCCCADQYTa2QA2AgQgA0GAgICAeDYCAAxECyADQSs2AgggA0Gn2tkANgIEIANBgICAgHg2AgAMQwsgA0E4NgIIIANB0trZADYCBCADQYCAgIB4NgIADEILIANBzgA2AgggA0GK29kANgIEIANBgICAgHg2AgAMQQsgBCABQQhqNgIgIARBAjYCPCAEQZDc2QA2AjggBEIBNwJEIARB6wQ2AjAgBCAEQSxqNgJAIAQgBEEgajYCLCAEQRBqIARBOGoQ+BQgA0EIaiAEQRhqKAIANgIAIAMgBCkCEDcCAAxACyADQTo2AgggA0Gg3NkANgIEIANBgICAgHg2AgAMPwsgA0EyNgIIIANB2tzZADYCBCADQYCAgIB4NgIADD4LIANBIzYCCCADQYzd2QA2AgQgA0GAgICAeDYCAAw9CyADQSk2AgggA0Gv3dkANgIEIANBgICAgHg2AgAMPAsgA0E5NgIIIANB2N3ZADYCBCADQYCAgIB4NgIADDsLIANB1gA2AgggA0GR3tkANgIEIANBgICAgHg2AgAMOgsgA0E/NgIIIANB597ZADYCBCADQYCAgIB4NgIADDkLIANBKjYCCCADQabf2QA2AgQgA0GAgICAeDYCAAw4CyADQRM2AgggA0HQ39kANgIEIANBgICAgHg2AgAMNwsgA0ENNgIIIANB49/ZADYCBCADQYCAgIB4NgIADDYLIANBDzYCCCADQfDf2QA2AgQgA0GAgICAeDYCAAw1CyADQdMANgIIIANB/9/ZADYCBCADQYCAgIB4NgIADDQLIANBxgA2AgggA0HS4NkANgIEIANBgICAgHg2AgAMMwsgA0EpNgIIIANBmOHZADYCBCADQYCAgIB4NgIADDILIANBMjYCCCADQcHh2QA2AgQgA0GAgICAeDYCAAwxCyADQSw2AgggA0Hz4dkANgIEIANBgICAgHg2AgAMMAsgA0EwNgIIIANBn+LZADYCBCADQYCAgIB4NgIADC8LIANBPTYCCCADQc/i2QA2AgQgA0GAgICAeDYCAAwuCyADQR42AgggA0GM49kANgIEIANBgICAgHg2AgAMLQsgA0EyNgIIIANBquPZADYCBCADQYCAgIB4NgIADCwLIANBJjYCCCADQdzj2QA2AgQgA0GAgICAeDYCAAwrCyADQSA2AgggA0GC5NkANgIEIANBgICAgHg2AgAMKgsgA0E4NgIIIANBouTZADYCBCADQYCAgIB4NgIADCkLIANBHDYCCCADQdrk2QA2AgQgA0GAgICAeDYCAAwoCyADQSI2AgggA0H25NkANgIEIANBgICAgHg2AgAMJwsgA0E6NgIIIANBmOXZADYCBCADQYCAgIB4NgIADCYLIANBMzYCCCADQdLl2QA2AgQgA0GAgICAeDYCAAwlCyADQcQANgIIIANBhebZADYCBCADQYCAgIB4NgIADCQLIAQgAUEIajYCDCAEIAFBEGo2AiAgBEEDNgI8IARB7ObZADYCOCAEQgI3AkQgBEHrBDYCHCAEQesENgIUIAQgBEEQajYCQCAEIARBIGo2AhggBCAEQQxqNgIQIARBLGogBEE4ahD4FCADQQhqIARBNGooAgA2AgAgAyAEKQIsNwIADCMLIANBOjYCCCADQYTn2QA2AgQgA0GAgICAeDYCAAwiCyADQS42AgggA0G+59kANgIEIANBgICAgHg2AgAMIQsgA0EtNgIIIANB7OfZADYCBCADQYCAgIB4NgIADCALIAQgAUEIajYCICAEQQI2AjwgBEHI6NkANgI4IARCATcCRCAEQesENgIwIAQgBEEsajYCQCAEIARBIGo2AiwgBEEQaiAEQThqEPgUIANBCGogBEEYaigCADYCACADIAQpAhA3AgAMHwsgBCABQQhqNgIgIARBAjYCPCAEQazp2QA2AjggBEIBNwJEIARB6wQ2AjAgBCAEQSxqNgJAIAQgBEEgajYCLCAEQRBqIARBOGoQ+BQgA0EIaiAEQRhqKAIANgIAIAMgBCkCEDcCAAweCyAEIAFBCGo2AiAgBEECNgI8IARBjOrZADYCOCAEQgE3AkQgBEHrBDYCMCAEIARBLGo2AkAgBCAEQSBqNgIsIARBEGogBEE4ahD4FCADQQhqIARBGGooAgA2AgAgAyAEKQIQNwIADB0LIANB6AA2AgggA0Gc6tkANgIEIANBgICAgHg2AgAMHAsgA0HoADYCCCADQYTr2QA2AgQgA0GAgICAeDYCAAwbCyADQcQANgIIIANB7OvZADYCBCADQYCAgIB4NgIADBoLIANB0wA2AgggA0Gw7NkANgIEIANBgICAgHg2AgAMGQsgA0HXADYCCCADQYPt2QA2AgQgA0GAgICAeDYCAAwYCyADQdoANgIIIANB2u3ZADYCBCADQYCAgIB4NgIADBcLIANBEjYCCCADQbTu2QA2AgQgA0GAgICAeDYCAAwWCyADQRk2AgggA0HG7tkANgIEIANBgICAgHg2AgAMFQsgA0EpNgIIIANB3+7ZADYCBCADQYCAgIB4NgIADBQLIANByQA2AgggA0GI79kANgIEIANBgICAgHg2AgAMEwsgA0HOADYCCCADQdHv2QA2AgQgA0GAgICAeDYCAAwSCyADQdcANgIIIANBn/DZADYCBCADQYCAgIB4NgIADBELIANBPjYCCCADQfbw2QA2AgQgA0GAgICAeDYCAAwQCyADQeoANgIIIANBtPHZADYCBCADQYCAgIB4NgIADA8LIANB4QA2AgggA0Ge8tkANgIEIANBgICAgHg2AgAMDgsgA0HDADYCCCADQf/y2QA2AgQgA0GAgICAeDYCAAwNCyADQTU2AgggA0HC89kANgIEIANBgICAgHg2AgAMDAsgBCABQQhqNgIgIARBAjYCPCAEQbT02QA2AjggBEIBNwJEIARB6wQ2AjAgBCAEQSxqNgJAIAQgBEEgajYCLCAEQRBqIARBOGoQ+BQgA0EIaiAEQRhqKAIANgIAIAMgBCkCEDcCAAwLCyABKAIMKAIAQQhqIQEMAQsLIANB4QA2AgggA0HE9NkANgIEIANBgICAgHg2AgAMCAsgA0HuADYCCCADQaX12QA2AgQgA0GAgICAeDYCAAwHC0G54+AAQShBlLXZABDaFwALIARBzrTZADYCLEEIDAMLIARB1rTZADYCLEEIDAILIARB3rTZADYCLEEJDAELIARB57TZADYCLEENCyEBIARBAjYCJCAEIAE2AjAgBEECNgI8IARBhLXZADYCOCAEQgE3AkQgBCAEQSxqNgIgIAQgBEEgajYCQCAEQRBqIARBOGoQ+BQgA0EIaiAEQRhqKAIANgIAIAMgBCkCEDcCAAwBCwJAIAEoAgwiBkEDTwRAIARBLGoiCSABKAIIIgEgBkEBayIGQaC92QBBAxDeAyAEQQE2Ajwg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xMzgADYCiAEgAkGsp8MANgKAASACQaynwwA2AnggAkGsp8MANgJwIAJB3KfDADYCaCACQdynwwA2AmAgAkGsp8MANgJYIAJBrKfDADYCUCACQeynwwA2AkggAkHcp8MANgJAIAJB3KfDADYCOCACQcynwwA2AjAgAkG8p8MANgIoIAJBrKfDADYCICACQaynwwA2AhggAkGcp8MANgIQIAIgADYCRCACIABBwQBqNgJ8IAIgAEFAazYCdCACIABBP2o2AmwgAiAAQSBqNgJkIAIgAEEYajYCXCACIABBPmo2AlQgAiAAQT1qNgJMIAIgAEEQajYCPCACIABBCGo2AjQgAiAAQcIAajYCLCACIABBKGo2AiQgAiAAQTxqNgIcIAIgAEE7ajYCFCACIABBOmo2AgwgAiAAQThqNgKMASACIAJBjAFqNgKEASABQZL9wwBBBkGYqcMAQRAgAkEMakEQEMYIIAJBkAFqJAALggMCBX8DfiMAQTBrIgMkACAAIAEoAgQgASgCAGtBHG4Qzh4gACgCBCAAKAIIIQQgA0EQaiABQRBqKAIANgIAIANBCGogAUEIaikCADcDACADIAEpAgAiBzcDACAEQRxsaiECIAenIQEgAygCBCEFAkADQCABIAVGDQEgASgCACIGQQhHBEAgAUEUaikCACEHIAFBDGopAgAhCCABKQIEIQkgAiAGNgIAIAJBBGogCTcCACACQQxqIAg3AgAgAkEUaiAHNwIAIAJBHGohAiAEQQFqIQQgAUEcaiEBDAELCyABQRxqIQELIAAgBDYCCCADQoSAgIDAADcDACAFIAFrQRxuIQICQCABIAVGDQADQCACRQ0BIAJBAWshAiABEM4LIAFBHGohAQwACwALIAMoAhAiAARAIAMoAgwiBCADKAIIIgEoAggiAkcEQCABKAIEIgUgAkEcbGogBSAEQRxsaiAAQRxsELgtGiADKAIQIQALIAEgACACajYCCAsgA0EwaiQAC8ECAQR/IAAoAggiAyAAKAIMEMwcIAAoAgQgAxDUKSAAKAIcIQIgACgCGCIDIQEDQCACBEACQCABKAIAQYCAgIB4RwRAIAEQviYgAUEkahDuFwwBCyABQQRqEL4mCyACQQFrIQIgAUHwAGohAQwBCwsgACgCFCADQQRB8AAQtiIgACgCLCECQQAhAyAAKAIoIgQh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ADoACCAAIAEgASADQQhqEOsUNgIEQQEhBQsgACAFOgAAIANBIGokAAuHAgEEfyMAQSBrIgMkAAJAAkAgAAJ/QQAgAS0A+AJBAkcNABogAUEoaiIEEOMNIgJFDQFBACACKAIAQQJHDQAaQQAgAi0ACA0AGiACLQAJIgJBKGtBA08EQEEAIAJBCUcNARoLAkAgBBDGEiICBEAgAigCAEECRg0BCyAEEMYSIgIEQCACKAIAQQ1GDQELQQAgBBDGEiIERQ0BGkEAIAQoAgBBC0cNARoLIANBCGogAUHk+t8AQQRBABCwAiADKAIIBEAgA0EMahCAIwtBAQs6AAEMAQsgASgC2AIhASADQQA6AAggACABIAEgA0EIahDrFDYCBEEBIQULIAAgBToAACADQSBqJAALjgICBn8BfiMAQTBrIgMkACABKAIEIAEoAgBrQQR2IgIgACgCACAAKAIIIgRrSwRAIAAgBCACQQRBEBCtFyAAKAIIIQQLIAAoAgQgA0EYaiABQRBqKAIANgIAIANBEGogAUEIaikCADcDACADIAEpAgAiCDcDCCAEQQR0aiECIAinIQEgAygCDCEFAkADQCABIAVGDQEgASgCACIGQYCAgIB4RwRAIAFBDGooAgAhByABKQIEIQggAiAGNgIAIAJBBGogCDcCACACQQxqIAc2AgAgAkEQaiECIARBAWohBCABQRBqIQEMAQsLIAFBEGohAQsgACAENgIIIAMgATYCCCADQQhqEKsSIANBMGokAAu4AgEBfyMAQRBrIgIkAAJ/AkACQAJAAkACQAJAAkACQCAAKAIAQQFrDgcBAgMEBQYHAAsgASgCFEHgk+MAQQUgASgCGCgCDBEDAAwHCyACIABBBGo2AgwgAUGEtMcAQQcgAkEMakHOARDECgwGCyACIABBBGo2AgwgAUHcs98AQQUgAkEMakHPARDECgwFCyACIABBBGo2AgwgAUHQrcQAQQQgAkEMakHQARDECgwECyACIABBBGo2AgwgAUGhtMcAQQogAkEMakHRARDECgwDCyACIABBBGo2AgwgAUHUrcQAQQcgAkEMakHSARDECgwCCyACIABBBGo2AgwgAUG5tMcAQQYgAkEMakHTARDECgwBCyACIABBBGo2AgwgAUG/tMcAQQsgAkEMakHTARDECgsgAkEQaiQAC+ICAQR/QQEh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CCAJGyIAQQhqKQIANwIAIAEgACkCADcCECABQShqIAggByAJGyIAQQhqKQIANwIAIAEgACkCADcCICABIAMgBSAGGyIAKQIANwIwIAFBOGogAEEIaikCADcCAAugAgEEfyMAQTBrIgIkAEGAgICAeCEEAkACQCABQShqEMgNIgNFDQAgAygCAEECRw0AIAMtAAhBAkcNACADLQAJQQlHDQAgASgCyAIhAyABQSU2AsgCIAEgASkD4AI3A5gDIAJBJGogAUHUAmopAgA3AgAgAkEsaiABQdwCaigCADYCACACIAEpAswCNwIcIAIgAzYCGCACQRhqIgMQvgogAyABQQAQkQYgAigCHCEFIAIoAhgiBEGAgICAeEcEQCACQRBqIAJBKGopAgA3AwAgAiACKQIgNwMIDAELIABBgYCAgHg2AgAgACAFNgIEDAELIAAgBTYCBCAAIAQ2AgAgACACKQMINwIIIABBEGogAkEQaikDADcCAAsgAkEwaiQAC5YCAgJ/AX4jAEFAaiIBJAACfgJAAkACQEEBIAAtACxBA2siAiACQf8BcUEDTxtB/wFxQQFrDgIBAgALIAApAwAQ2hoMAgsgAEEYahCcDCEDIAFBxQI2AjQgASAANgIwIAFBxQI2AiwgASADNwM4IAFBAjYCFCABQaST2QA2AhAgAUICNwIcIAEgAUE4aiIANgIoIAEgAUEoajYCGCABQQRqIgIgAUEQahDoCyAAEK4ZIAIQixkMAQsgAUECNgIUIAFBtJPZADYCECABQgI3AhwgAUHFAjYCNCABQcUCNgIsIAEgADYCKCABIABBEGo2AjAgASABQShqNgIYIAFBBGoiACABQRBqEOgLIAAQixkLIAFBQGskAAugAgEBfyMAQRBrIgIkAAJ/AkACQAJAAkACQAJAAkAgACgCACIAKAIAQQFrDgYBAgMEBQYACyACIABBCGo2AgwgAUGbj9oAQQMgAkEMakHrAxDECgwGCyACIABBBGo2AgwgAUGB6tgAQQQgAkEMakHuAxDECgwFCyACIABBBGo2AgwgAUGF6tgAQQQgAkEMakGNBBDECgwECyACIABBCGo2AgwgAUGej9oAQQMgAkEMakHtAxDECgwDCyACIABBCGo2AgwgAUGpj9oAQQYgAkEMakHvAxDECgwCCyACIABBCGo2AgwgAUGJ6tgAQQUg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IgM3AwAgACAEQhWJIAOFNwMYIAAgAUINiSAChSIBQhGJIAEgBXwiAYU3AxAgACABQiCJNwMIC68IAgZ/AX4CQAJAAkACQAJAAkACQAJAAkAgACgCAEEBaw4HAQIDBAUGBwALIABCADcDECAAKAIgEJEEDwsgAEIANwMQIAAoAiAQ5w4PCyAAKAIEEIwqDwsgACgCBBCMKg8LIABBBGoQixIPCyAAKAIEIgBCADcDECAAQgA3AwAgAEEgahC5JSAAQSRqEO4DDwsgACgCBCIAQgA3AxggAEIANwMIIAAoAihBMGwhASAAKAIkIQNBACEAA0AgACABRg0CIAAgA2oiAkEQakIANwIAIAJBIGpCADcCACACQShqIgIoAgAEQCACEMYtCyAAQTBqIQAMAAsACyAAKAIEIgBCADcDSCAAQgA3AxAgAC0ARUEDRg0AIABBIGohAQNAIAEtACVBAkYEQAJAIAFCADcCDCABKAIEIgAgASgCCEE4bGohBgNAAkACQAJAAkACQAJAAkAgACAGRwRAIABBOGohAiAAKAIAIgFBCUYNAQJAAkACQCABQQFrDggBAgoJCAcGBQALIABCADcCFCAAKAIMQcgAbCEEIAAoAgghBUEAIQEDQCABIARHBEACQAJAAkACQCABIAVqIgMpAwBCA30iB6dBAWpBACAHQgJUG0EBaw4CAQIACyADQShqQgA3AgAgA0E4akIANwIAIAMQ2CMMAgsgA0EYakIANwIAIANBCGpCADcCAAwBCyADQRhqQgA3AgAgA0EIakIANwIACyABQcgAaiEBDAELCyAAKAIQQgA3AwggAEEcahC6JSACIQAMCgsgAEIANwIwIABBCGoQ2gggAiEADAkLIABCADcCECAAKAIMQdAAbCEEIAAoAgghBUEAIQEDQAJAIAEgBEcEQAJAAkACQEICIAEgBWoiAykDAEICfSIHIAdCAlobp0EBaw4CAQIACyADQRhqQgA3AgAgA0EoakIANwIADAMLIANBEGpCADcCAAwCCyADQRBqQgA3AgAgA0FAa0IANwIAIANBIGoQ2CMMAQsgACgCGCIBBEAgAUIANwIICyAAQRxqELolIAIhAAwKCyABQdAAaiEBDAALAAsMCAsgAEEIahCcBCACIQAMBgsgAEIANwIYIABCADcCCCACIQAMBQsgAEIANwIIIABBBGoQxi0gAiEADAQLIAAoAgQiAEIANwMwIABCADcDICAAKQMAUARAIABBCGoQ+R0gAiEADAQLIABCADcDCCAAQgA3AxggAiEADAMLIABCADcCCCAAKAIEQgA3AwggAEEQahC6JSACIQAMAgsgAEIANwIIIABBBGoQxi0gAiEADAELIABCADcCMAJAAkACQCAAKAIIQQFrDgIBAgALIABBEGoQ/CAgAiEADAILIABBEGoQ+yAgAiEADAELIABBDGoQixIgAiEADAALAAsFIAFCADcDECABQgA3AwAgASgCICEBDAELCwsLkAIBA38gACgCCEEMbCEDIAAoAgQhAANAIAMEQAJAIAAoAgAEQCAAIAEQ5iwMAQsCQAJAAkACQAJAAkBBBCAAKAIEIgIoAgBBBWsiBCAEQQZPG0EBaw4FAQIDBAUACyABIAIpAwggAkEYaigCABCWHQwFCyACQQhqIAEQ/CEgAkEoaiABEOYsDAQLIAEgAikDECACQSBqKAIAEJYdIAJBKGogARDmLAwDCyACQQhqIAEQ/CEgAkEoaiABEOcjDAILIAIgARD8ISACQSBqIAEQ6CMgAkHoAGogARDsLCACQcgAaiABEOcjDAELIAJBCGogARD8ISACKAIoIAEQkRILIABBDGohACADQQxrIQMMAQsLC+wBAQV/IAAgACgCAEEBayIBNgIAAkAgAQ0AAkAgACgCGCICRQRAQQAhAQwBCyAAKAIMIgEgACgCFCIDIAFBACABIANNG2siA2siBSACSQRAIAIgBWshBAwBCyACIANqIQELIABBEGooAgAiAiADQQJ0aiEFIAEgA2shAQNAIAEEQCAFKAIAEOoOIAFBAWshASAFQQRqIQUMAQUDQCAEBEAgAigCABDqDiAEQQFrIQQgAkEEaiECDAELCyAAKAIMIABBEGooAgBBBEEEELYiIAAgACgCBEEBayIBNgIEIAENAiAAQSBBBBC9EQsLCwumAgECfyMAQRBrIgIkAAJ/AkACQAJAAkACQEEEIAAoAgAiACgCAEGAgICAeHMiAyADQQRPG0EBaw4EAQIDBAALIAIgAEEIajYCDCABQfGZwwBBD0GAmsMAQQMgAkEMakGYARDCCwwECyACIABBCGo2AgwgAUGDmsMAQQ1BkJrDAEEHIABBBGpBmQFBl5rDAEEHIAJBDGpBIRCOCwwDCyAC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FGoiByABIAMoAgggAygCDCAGIAIQwREgAkEEaiAHENwbDAELIAJBADYCBAtBASEDAkAgAigCBEEBRgRAIAIoAhAhASAFRQ0BIAIoAgwhBiAEIAIoAghBAWo2AgAgBUEBRg0BIAQgBkEBajYCBAwBC0EAIQMLIAAgATYCBCAAIAM2AgAgAkEgaiQAC4kCAQJ/IwBBEGsiAiQAAn8CQAJAAkACQAJAAkBBBCAAKAIAKAIAIgAoAgBBBWsiAyADQQZPG0EBaw4FAQIDBAUACyACIABBCGo2AgwgAUGlo9kAQQkgAkEMakHUAhDECgwFCyACIABBCGo2AgwgAUHKltoAQQggAkEMakG/BBDECgwECyACIABBCGo2AgwgAUHUpuAAQQYgAkEMakHABBDECgwDCyACIABBCGo2AgwgAUHbktoAQQYgAkEMakHBBBDECgwCCyACIAA2AgwgAUHhktoAQQYgAkEMakHCBBDECgwBCyACIABBCGo2AgwgAUHVktoAQQYgAkEMakHDBBDECgsgAkEQaiQAC4ACAQN/IAAoAghBDGwhAyAAKAIEIQADQCADBEACQCAAKAIABEAgACABEL0rDAELAkACQAJAAkACQAJAQQQgACgCBCICKAIAQQVrIgQgBEEGTxtBAWsOBQECAwQFAAsgASACQQhqEPoIDAULIAEgAkEIahDTISACQShqIAEQvSsMBAsgASACQRBqEPoIIAJBKGogARC9KwwDCyABIAJBCGoQ0yEgASACQShqELwjDAILIAEgAhDTISACQSBqIAEQvSMgAkHoAGogARC+KyABIAJByABqELwjDAELIAEgAkEIahDTISACKAIoIAEQhxILIABBDGohACADQQxrIQMMAQsLC4sCAQN/AkACQAJAAkACQAJAAkAgACgCAEEBaw4GAAECBgUDBAsgACgCDEEobCECIAAoAgghAANAIAJFDQQgACgCAEEHRwRAIAAgARCACQsgAEEoaiEAIAJBKGshAgwACwALIABBBGogARDwLQ8LIAAoAgxBOGwhAyAAKAIIIQRBACEAA0AgACADRg0CAkACQAJAAkAgACAEaiICKAIAQQFrDgIBAgALIAEgAkEIahClCyACQShqIAEQjS0MAgsgAkEwaiICKAIARQ0BIAIgARCDLQwBCyACQQRqIAEQ8C0LIABBOGohAAwACwAL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0wEBA38jAEEgayIBJAACQCACKAIQIgQgAigCFCIFTQRAIAIoAgBBAWtBAk8EQCABQRRqIgYgAEEEaiACKAIIIAIoAgwgBCAFEMIFIAFBBGogBhDcGwwCC0EAIQUCQCAEIAIoAgxPDQAgAigCCCAEai0AACICIAAtAARHBEAgAC0ABSACRw0BCyABIAQ2AhhBASEFIAEgBEEBajYCHAsgASAFNgIUIAFBBGogAUEUahDcGwwBCyABQQA2AgQLIAEoAgRBAUYEQCADELIVCyABQSBqJAAL4wECAn8BfiMAQTBrIgMkACADQQhqIAEgAhDjCiADKQIMIQUCQAJAIAMoAggiBEGAgICAeEYEQCAFp0EBcQ0BIAVCgICAgIAQWgRAIAAgASgCBCABKAIIIAJBBGpBABDKGAwDCyAAQYCAgIB4NgIAIAAgBUIgiDwABAwCCyAAIAMpAhQ3AgwgAEEkaiADQSxqKAIANgIAIABBHGogA0EkaikCADcCACAAQRRqIANBHGopAgA3AgAgACAFNwIEIAAgBDYCAAwBCyAAQYCAgIB4NgIAIAAgBUIIiDwABAsgA0EwaiQAC98BAQR/IAMoAgghBCADKAIEIQUCQAJAIAIgAygCAEkEQANAIARFBEBBACEGDAQLIAAgASAEQQFrIgZBjLzYABCcHyIHKAIAIAJJDQIgBUECIActAAQiBEEBayAEQQRGG0H/AXFrIQUgBiEEDAALAAsgBCABIAEgBEkbIQYDQCAEIAZGDQIgACABIARBnLzYABCcHyIHKAIAIAJPDQEgBUECIActAAQiB0EBayAHQQRGG0H/AXFqIQUgBEEBaiEEDAALAAsgBCEGCyADIAY2AgggAyAFNgIEIAMgAjYCACAFC+cBAQN/IAAoAghBDGwhAyAAKAIEIQADQCADBEACQCAAKAIABEAgACABELwrDAELAkACQAJAAkACQEEEIAAoAgQiAigCAEEFayIEIARBBk8bQQFrDgUAAQIDBAULIAJBCGogARDaISACQShqIAEQvCsMBAsgAkEoaiABELwrDAMLIAJBCGogARDaISABIAJBKGoQvyMMAgsgAiABENohIAJBIGogARDAIyACQegAaiABEMcrIAEgAkHIAGoQvyMMAQsgAkEIaiABENohIAIoAiggARCJEgsgAEEMaiEAIANBDGshAwwBCwsL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EPYGGiADKAIIQQ1HDQILIANBCGoQ6CULIANB4ABqJAAPCyAFIAFB2AAQuC0aIAAgACgCCEEBajYCCCAEQdgAayEEIAchASAFQdgAaiEFDAALAAuwAQEGfyABQThsIAAoAghBOGwiA2shASACKAJ0IAIoAnAiBWshBiACIAVBOGxqIQQgACgCBCADaiEDA0AgAUUhBwJAIAEEQCAGRQRAQQAPCyACIAVBAWoiBTYCcCAEKAIAIghBCkcNAQsgBw8LIAMgCDYCACADQQRqIARBBGpBNBD2BhogACAAKAIIQQFqNgIIIAFBOGshASAEQThqIQQgBkEBayEGIANBOGohAwwACwALuQEBAn8jAEEQayICJAACQAJAIAFBKGoQ4w0iAwRAIAMoAgBBBEYNAQsgAiABEM8EIAACfiACKQMAUEUEQCAAIAIpAwA3AwggAEEQaiACQQhqKQMANwMAQgEMAQsgACACKAIINgIIQgILNwMADAELIAIgARCmBSAAAn4gAikDAFBFBEAgACACKQMANwMIIABBEGogAkEIaikDADcDAEIADAELIAAgAigCCDYCCEICCzcDAAsgAkEQaiQAC8UBAQN/IwBBMGsiASQAIAAoAgwhAgJAAkACfwJAAkAgACgCBA4CAAEDCyACDQJBAQwBCyACDQEgACgCACIAKAIEIQMgACgCAAshAiABQRhqELsiQSQQzSAiAEHAv8AANgIAIAAgAzYCICAAIAI2AhwgACABKQIYNwIEIABBDGogAUEgaikCADcCACAAQRRqIAFBKGopAgA3AgAMAQsgAUEMaiICIAAQqQYgAUEYaiIAELsiIAIgABDhEyEACyABQTBqJAAgAAurAQEDfwJAIAJBEEkEQCAAIQMMAQsgAEEAIABrQQNxIgRqIQUgBARAIAAhAwNAIAMgAToAACADQQFqIgMgBUkNAAsLIAUgAiAEayICQXxxIgRqIQMgBEEASgRAIAFB/wFxQYGChAhsIQQDQCAFIAQ2AgAgBUEEaiIFIANJDQALCyACQQNxIQILIAIEQCACIANqIQIDQCADIAE6AAAgA0EBaiIDIAJJDQALCyAAC9QBAQR/IwBBEGsiAyQAIAJB/////wdJBEAgAyABKAIIIgQQwRwCQCADKAIARQRAIAMoAgQhBSABKALYAiEGIAEoAgAgBEYEQCABENIWCyAAIAU2AgQgAEEDNgIAIAEgBEEBajYCCCABKAIEIARBFGxqIgAgAjYCECAAIAY2AgwgAEEANgIIIABCADcCAAwBCyAAIAMpAwg3AxAgAEL+////BzcDCCAAQQA2AgALIANBEGokAA8LIAMgAq03AwBBzInAAEE0IANB8ILAAEGAisAAEMAOAAu4AgEDfwJ/IAEoAgQiAiABKAIQRwRAIABBDGogARDREiAAQRRqIQEgAEEQagwBCyAAKAIEIgMgACgCCCIAIAJBAWsiAkH0u9YAEJ4fIAEQ0RIgAyAAIAJBhLzWABCeHyIAQQhqIQEgAEEEagshAgJAIAEoAgAiAEECSQ0AIAIoAgAhAiAAQRVPBEAjAEGQIGsiASQAAkAgAEEBdiIDQZWsFCAAIABBlawUTxsiBCADIARLGyIDQasBTwRAIAFBCGogA0EEQRgQ5xQgAiAAIAEoAgwiAiABKAIIIgMgAEHBAEkQ2AEgAyACENEpDAELIAIgACABQRBqQaoBIABBwQBJENgBCyABQZAgaiQADAELIABBGGwhAEEYIQEDQCAAIAFGDQEgAiABIAJqENsJIAFBGGohAQwACwALC74BAQN/IwBBEGsiAyQAIAAoAgAhBAJAA0AgAkEDTQRAAkAgAkEBSw0ADAMLBSABKAAAIANBBCABIAJB2M/YABDxHCAEQQV3c0G5893xeWwhBCADKAIEIQIgAygCACEBDAELCyABLwAAIANBCGpBAiABIAJByM/YABDxHCAEQQV3c0G5893xeWwhBCADKAIMIQIgAygCCCEBCyAAIAIEfyABLQAAIARBBXdzQbnz3fF5bAUgBAs2AgAgA0EQaiQAC8oBAQV/IwBBIGsiASQAIAAoAgghBCAAKAIEIQVBBSECQQEhAwJAAkACQCAAKAIAQQFrDgIAAgELQQMhAwsgAUEQaiAAQRxqKAIANgIAIAFBCGogAEEUaikCADcDACABIAApAgw3AwAgAyECC0EoQQgQuCIiACAENgIIIAAgBTYCBCAAIAI2AgAgACABKQMANwIMIABBFGogAUEIaikDADcCACAAQRxqIAFBEGopAwA3AgAgAEEkaiABQRhqKAIANgIAIAFBIGokACAAC6wBAgd/AX4jAEEQayIEJAAgBEEIaiACQQhBCBDnFCACQQN0IQggBCgCDCEHIAQoAggiCSEFAkADQCAFRSADIAhGckUEQCABIANqKQMAIgpCA4NQBEAgCqdBCGsiBiAGKAIAIgZBAWo2AgAgBkEASA0DCyADIAdqIAo3AwAgBUEBayEFIANBCGohAwwBCwsgACACNgIIIAAgBzYCBCAAIAk2AgAgBEEQaiQADwsAC7gBAQR/IwBBEGsiBiQAIAEtAIICIQcgAS0AgQIhCCABLQCAAiEJIAZBCGogAiADIAQgBUGslMAAENMWIAYgCSAIIAcgBigCCCAGKAIMEN8EIAACfwJAIAYoAgBBAXEEQCAGKAIEIARqIgUgA0kNASAFIANBvJTAABCbEAALQQAMAQsgACAEIAUgASACIAVqLQAAai0AAGsiAUEAIAEgBU0bIgEgASAESRs2AgRBAgs2AgAgBkEQaiQAC7oBAQJ/IAAgAC0ADSABLQANIgIgAkEDRhs6AA0gACAALQAMIAEtAAwiAiACQQJGGzoADCAAIAAtAAsgAS0ACyICIAJBAkYbOgALIAAgAC0ACiABLQAKIgIgAkECRhs6AAogACABQQlqIABBCWogAS0ACCICGy0AADoACSAAIAAoAgAgASgCACIDIANBAkYiAxs2AgAgACACIAAtAAhyQQFxOgAIIAAgAEEEaiABQQRqIAMbKAIANgIEIAALwQEBAn8jAEEwayICJAAgAkEANgIgIAJBATYCFCACQdSWwwA2AhAgAkIENwIYAn9BASABKAIUIgMgASgCGCIBIAJBEGoQlSQNABogAiAAKAIANgIIA0AgAiACQQhqEJcZQQAgAigCAEUNARogAiACKAIENgIMIAJBATYCFCACQbSWwwA2AhAgAkIBNwIcIAJBEDYCLCACIAJBKGo2AhggAiACQQxqNgIoIAMgASACQRBqEJUkRQ0AC0EBCyACQTBqJAALxwEBAX8jAEEQayILJAAgACgCFCABIAIgACgCGCgCDBEDACEBIAtBADoADSALIAE6AAwgCyAANgIIIAtBCGogAyAEIAUgBhDuBiAHIAggCSAKEO4GIQEgCy0ADSICIAstAAwiA3IhAAJAIANBAXEgAkEBR3INACABKAIAIgAtABxBBHFFBEAgACgCFEG70dYAQQIgACgCGCgCDBEDACEADAELIAAoAhRBia3gAEEBIAAoAhgoAgwRAwAhAAsgC0EQaiQAIABBAXELtQEBBX8jAEEgayIC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DAALAAvTAQEBfyMAQfAAayIDJAAgAyACNgIsIANBADYCKCADQeEANgIkIAMgAEEcajYCICADQQI2AhwgA0Go7uAANgIYIANBAjYCFCADQQM2AgQgA0HUxN8ANgIAIANBAzoAbCADQQA2AmggA0KggICAEDcCYCADQoKAgIAgNwJYIANBAjYCUCADQQM6AEwgA0EANgJIIANCIDcCQCADQoGAgIAgNwI4IANBAjYCMCADIANBMGo2AhAgA0EDNgIMIAMgA0EYajYCCCABIAMQsCQgA0HwAGokAAvDAQEDfyMAQbAHayICJAAgASgClA0oArwCIgMgAygCACIEQQFqNgIAIARBAE4EQCACIAMQ5BcgAkHoBGogASgCoAoQzx4gAkHUBWogASgCuAoQ0B4gAkHYBGogASgC1AogASgC+AoQ4g4gAkHYAWogARCNFQJAIAEpA6ANQgJRBEAgAkECNgKgBwwBCyACQfAFaiABQaANahCLCQsgAkEYaiACQfAFakHAARD2BhogACACQfAFEPYGGiACQbAHaiQADwsAC6gBAQN/AkACQCABKAIAIgMgAUEIaygCACICRgRAIAEoAgQiAiABQQRrKAIASQ0BDAILIAIgA00NASABKAIEIQILIAFBEGshAQNAAkAgAUEQaiABQQhqIgQpAgA3AgAgACAERg0AAkAgASgCACIEIANGBEAgAiABQQRqKAIASQ0BDAILIAMgBE8NAQsgAUEIayEBDAELCyABQQhqIAOtIAKtQiCGhDcCAAsLvQEBA38jAEFAaiICJAAgAiABNgIIIAJBADYCMCACQgA3AiggAiAAKAJIIAAoAkwgASACQShqIgQQ5AkiAzYCDCADIAAoAihqIgMgAUsEQCACQQM2AhQgAkHku9gANgIQIAJCAzcCHCACQZYCNgI8IAJBCTYCNCACQZYCNgIsIAIgAEEoajYCKCACIAQ2AhggAiACQQhqNgI4IAIgAkEMajYCMCACQRBqQfy72AAQoR0ACyACQUBrJAAgASADawu9AQEDfyMAQSBrIgEkACAAKAIAIgIoAgAhAyACQQA2AgAgAygCECECIANBADYCECACBEAgAUEIaiACEQEAIAAoAgQiAygCACIAKAIAIgJBgoCAgHhOBEAgAiAAQQRqKAIAEKckIAMoAgAhAAsgACABKQIINwIAIABBCGog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BGogARD1LAwDCyACQQRqIAEQvw8MAgsgAkEEaiABEOMsDAELIAAoAngiAgRAIAIgARCVGgsgBCABEL8PIAAtADxBBkcEQCAAQRBqELYgCw8LIAJB2ABqIQIgA0HYAGshAwwACwALrAEBBX8jAEEwayIDJAAgAUEwbCAAKAIIQTBsIgFrIQQgACgCBCABaiEFIAIoAgQhASACKAIMIQYCQANAIARFDQEgASAGRwRAIAIgAUEEaiIHNgIEIANCADcDCCADQRI2AgAgAyABKAIANgIEIAUgA0EwEPYGIAAgACgCCEEBajYCCCAEQTBrIQRBMGohBSAHIQEMAQsLIANBEzYCACADEIMmCyADQTBqJAAgBEULugECBH8BfiMAQSBrIgMkACAAKAIIQThsIQQgACgCBCEFQQAhAANAAkAgACAERwRAAkACQAJAIAAgBWoiAigCAEEBaw4CAQIACyACQQhqIAEQpiIgAkEoaiABEKgtDAMLIAJBMGogARCHJCABLQAoQQFHDQIgA0EIaiACQRBqELUbIAEgAykDCCIGIAMoAhgQ9xEgBhDWGgwCCyACQQRqIAEQqC0MAQsgA0EgaiQADwsgAEE4aiEADAALAAu6AQIDfwF+IwBBIGsiASQAIAAoAggiA0H+////B00EQAJAAkAgACgCFCICRQ0AIAAgAkEBayICNgIUIAAoAhAgAkEMbGopAgAiBKdBgICAgHhGDQAgAUEANgIQIAEgBDcDCAwBCyABQQA2AhAgAUKAgICAwAA3AggLIAAgAUEIahDTFSABQSBqJAAgAw8LIAFBADYCGCABQQE2AgwgAUH4ocMANgIIIAFCBDcCECABQQhqQYCiwwAQoR0AC7cBAQF/IwBBIGsiAiQAAkACQCABEMAtRQRAIAJBBGogARDQByACKAIEQYCAgIB4RwRAIAJBGGogAkEMaigCADYCACACIAIpAgQ3AxAgACACQRBqEMoRDAILQYCAgIB4IAIoAggQliQgACABEOUHNgIYIABBAjYCACAAQRRqIAFBEGooAgA2AgAgAEEMaiABQQhqKQIANwIAIAAgASkCADcCBAwCCyAAEKMRCyABEJQeCyACQSBqJAALrgECAn8BfiMAQTBrIgIkAAJAIAEtABRBAkYEQBDXIiEDIAEoAgAiASkDECEEIAJBCGogAUEYahC/CyACQSBqIAEQtSEgAyAENwMQIANBCGogAkEoaikDADcDACADIAIpAyA3AwAgAyACKQMINwMYIANBIGogAkEQaikDADcDACADQShqIAJBGGopAwA3AwAgAEECOgAUIAAgAzYCAAwBCyAAIAEQtRsLIAJBMGokAAvBAQEDfyAAQUBrELYgIABBkAFqIQQgACgChAFB2ABsIQMgACgCgAEhAgNAAkAgAwRAAkACQAJAAkACQCACKAIAQQFrDgUBAgMGBAALIAIoAgggAkEYaisDACABEIsfDAULIAJBBGogARCdIgwECyACQQRqIAEQii0MAwsgAkEEaiABEMMPDAILIAFBADoABAwBCyAEIAEQww8gAC0APEEGRwRAIABBEGoQtiALDwsgAkHYAGohAiADQdgAayEDDAALAAuhAQECfwJAIAFBA00EQCAAQQFrIQADQCABRSEDIAFFDQIgACABaiABQQFrIQEsAABBAE4NAAsMAQsgACgAAEGAgYKEeHENAEEEIABBA2pBfHEiAiAAayAAIAJGGyECIAFBBGshAQNAIAEgAk0EQCAAIAFqKAAAQYCBgoR4cUUhAwwCCyAAIAJqKAIAQYCBgoR4cQ0BIAJBBGohAgwACwALIAMLvAEBAX8jAEEQayIHJAAgACgCFCABIAIgACgCGCgCDBEDACEBIAdBADoADSAHIAE6AAwgByAANgIIIAdBCGogAyAEIAUgBhDuBiEBIActAA0iAiAHLQAMIgNyIQACQCADQQFxIAJBAUdyDQAgASgCACIALQAcQQRxRQRAIAAoAhRBu9HWAEECIAAoAhgoAgwRAwAhAAwBCyAAKAIUQYmt4ABBASAAKAIYKAIMEQMAIQALIAdBEGokACAAQQFxC7oBAAJAAkACQCABQQFxRQRAIAIoAgBBhoDEAGsOAgIDAQsgACACNgIEIABBAjYCACAAIAIpAgA3AggPCyAAQQQ2AgAPCyACKAIEIgEoAgBBiIDEAEcEQCAAQgQ3AgggACABNgIEIABBADYCAA8LIABBATYCACAAIAFBBGo2AgQPCyACKAIMIgEEQCAAQQA2AgAgACABQQFrNgIMIAAgAigCCCIBNgIEIAAgAUHYAGo2AggPCyAAQQQ2AgALzgEBAX8jAEFAaiICJAAgACgCACEAIAJBrI3EADYCOCACQbDnwwA2AjAgAiAAQdgEajYC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QRBrIgMkACABKAIMIQICQAJAAkACQAJAAkAgASgCBA4CAAECCyACDQFBASECQQAhAQwCCyACDQAgASgCACICKAIEIQEgAigCACECDAELIAAgARCpBgwBCyADQQRqIAEQlg4gAygCCCEEIAMoAgRBAUYNASADKAIMIAIgARD2BiECIAAgATYCCCAAIAI2AgQgACAENgIACyADQRBqJAAPCyAEIAMoAgwQvikAC58BAQd/IwBB0ABrIgIkACABKAIEIQcgAkEIaiABKAIIIgRBCEHAABDnFCACKAIIIgUgBEH///8fcSIBIAEgBUsbIQNBACEBIAIoAgwhBgNAIAMEQCACQRBqIgggASAHahDuHiABIAZqIAhBwAAQ9gYaIANBAWshAyABQUBrIQEMAQsLIAAgBDYCCCAAIAY2AgQgACAFNgIAIAJB0ABqJAALmwEBB38jAEFAaiICJAAgASgCBCEHIAJBCGogASgCCCIEQQhBMBDnFCACKAIIIgUgBEH/////AHEiASABIAVLGyEDQQAhASACKAIMIQYDQCADBEAgAkEQaiIIIAEgB2oQbyABIAZqIAhBMBD2BhogA0EBayEDIAFBMGohAQwBCwsgACAENgIIIAAgBjYCBCAAIAU2AgAgAkFAayQAC68BAQJ/IwBBEGsiAiQAIAACfwJAAkACQAJAAkACQCABKAIAQQFrDgYCAQIDBAUACyACIAFBCGoQmhUgAigCBCEDIAIoAgAMBQsgASgCDCEDIAEoAggMBAsgASgCFCEDIAEoAhAMAwsgASgCECEDIAEoAgwMAgsgASgCCCEDIAEoAgQMAQsgAkEIaiABKAIEEIsDIAIoAgwhAyACKAIICzYCACAAIAM2AgQgAkEQaiQAC/oBAQF/AkACQAJAAkACQAJAAkAgACgCAEEBaw4HAQIDBgYEBQALIABBCGogARDEKw8LIABBCGogARDDKw8LIAAoAgQgARDNEw8LIAAoAgQgARDNEw8LIAAoAgQiACgCKEEwbCECIAAoAiRBKGohAANAIAJFDQIgACgCAARAIAAgARDAKwsgAkEwayECIABBMGohAAwACwALIAAoAgQiAC0ARUEDRg0AIABBIGohAANAIAAtACVBAkYEQAJAIAAoAghBOGwhAiAAKAIEIQADQCACRQ0BIAAgARDKDCACQThrIQIgAEE4aiEA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AgBBAWsOBQABAgUDBQsgAkEEaiABENEhDAQLIAJBBGogARDYLAwDCyACQQRqIAEQug8MAgsgAkEEaiABELwrDAELIAQgARC6DyAALQA8QQZHBEAgAEEQahC2IAsPCyACQdgAaiECIANB2ABrIQMMAAsAC60BAQN/IABBQGsQtiAgAEGQAWohBCAAKAKEAUHYAGwhAyAAKAKAASECA0ACQCADBEACQAJAAkACQCACKAIAQQFrDgUAAQIFAwULIAJBBGogARDsIQwECyACQQRqIAEQ1SwMAwsgAkEEaiABELsPDAILIAJBBGogARDCKwwBCyAEIAEQuw8gAC0APEEGRwRAIABBEGoQtiALDwsgAkHYAGohAiADQdgAayEDDAALAAutAQEDfyAAQUBrELYgIABBkAFqIQQgACgChAFB2ABsIQMgACgCgAEhAgNAAkAgAwRAAkACQAJAAkAgAigCAEEBaw4FAAECBQMFCyACQQRqIAEQ7SEMBAsgAkEEaiABENYsDAMLIAJBBGogARC8DwwCCyABIAJBBGoQhyEMAQsgBCABELwPIAAtADxBBkcEQCAAQRBqELYgCw8LIAJB2ABqIQIgA0HYAGshAwwACwALrQEBA38gAEFAaxC2ICAAQZABaiEEIAAoAoQBQdgAbCEDIAAoAoABIQIDQAJAIAMEQAJAAkACQAJAIAIoAgBBAWsOBQABAgUDBQsgAkEEaiABEPkhDAQLIAJBBGogARDzLAwDCyACQQRqIAEQwA8MAgsgAkEEaiABEOcsDAELIAQgARDADyAALQA8QQZHBEAgAEEQahC2IAsPCyACQdgAaiECIANB2ABrIQMMAAsAC60BAQN/IABBQGsQtiAgAEGQAWohBCAAKAKEAUHYAGwhAyAAKAKAASECA0ACQCADBEACQAJAAkACQCACKAIAQQFrDgUAAQIFAwULIAJBBGogARD2IQwECyACQQRqIAEQ9ywMAwsgAkEEaiABEMIPDAILIAJBBGogARDiLAwBCyAEIAEQwg8gAC0APEEGRwRAIABBEGoQtiALDwsgAkHYAGohAiADQdgAayEDDAALAAutAQEDfyAAQUBrELYgIABBkAFqIQQgACgChAFB2ABsIQMgACgCgAEhAgNAAkAgAwRAAkACQAJAAkAgAigCAEEBaw4FAAECBQMFCyACQQRqIAEQlSIMBAsgAkEEaiABEIstDAMLIAJBBGogARDEDwwCCyACQQRqIAEQgi0MAQsgBCABEMQPIAAtADxBBkcEQCAAQRBqELYgCw8LIAJB2ABqIQIgA0HYAGshAwwACwALrQEBA38gAEFAaxC2ICAAQZABaiEEIAAoAoQBQdgAbCEDIAAoAoABIQIDQAJAIAMEQAJAAkACQAJAIAIoAgBBAWsOBQABAgUDBQsgAkEEaiABEKciDAQLIAJBBGogARCxLQwDCyACQQRqIAEQyg8MAgsgAkEEaiABEJotDAELIAQgARDKDyAALQA8QQZHBEAgAEEQahC2IAsPCyACQdgAaiECIANB2ABrIQMMAAsAC60BAQN/IABBQGsQtiAgAEGQAWohBCAAKAKEAUHYAGwhAyAAKAKAASECA0ACQCADBEACQAJAAkACQCACKAIAQQFrDgUAAQIFAwULIAJBBGogARCpIgwECyACQQRqIAEQry0MAwsgAkEEaiABEMsPDAILIAJBBGogARCmLQwBCyAEIAEQyw8gAC0APEEGRwRAIABBEGoQtiALDwsgAkHYAGohAiADQdgAayEDDAALAAuWAQEEfyMAQRBrIgIkACABKAIwIQQgASgCACEFAn8gASgCYCIDRQRAQQEhAUEBDAELIAJBBGogAyABKAJkKAIQEQAAIAIoAgggAigCBEVxIQEgAigCDEULIQMgAAJ/QQAgBA0AGkEAIAUNABpBACABRQ0AGkEAIANFDQAaIABBADYCCEEBCzYCBCAAQQA2AgAgAkEQaiQAC6YBAgZ/An4gASgCACACKAIMIgRBGGxqIgFBEGoiBSkCACEJIAFBCGoiBikCACEKIAAoAgwhByACKAIIIgAoAgwhCCACKAIAIgMgASkCADcCACADQQhqIAo3AgAgA0EQaiAJNwIAIAEgACkCADcCACAGIABBCGopAgA3AgAgBSAAQRBqKQIANwIAIAIgBCAHIAhLajYCDCACIAA2AgAgAiAAQRhqNgIIC6YBAgZ/An4gASgCACACKAIMIgRBGGxqIgFBEGoiBSkCACEJIAFBCGoiBikCACEKIAAoAgwhByACKAIIIgAoAgwhCCACKAIAIgMgASkCADcCACADQQhqIAo3AgAgA0EQaiAJNwIAIAEgACkCADcCACAGIABBCGopAgA3AgAgBSAAQRBqKQIANwIAIAIgBCAHIAhPajYCDCACIAA2AgAgAiAAQRhqNgIIC6YBAQR/IAAoAgwhAiAAKAIIIgMhAQNAIAIEQAJAAkACQAJAAkAgASgCACIEQQdrQQAgBEEITxsOBAABAgMECyABEM0LDAMLIAFBBGooAgAgAUEIaigCABC4KQwCCyABQQRqKAIAIAFBCGooAgAQyikMAQsgAUEEaigCACABQQhqKAIAENYpCyACQQFrIQIgAUEcaiEBDAELCyAAKAIEIANBBEEcELYiC6QBAQJ/IwBBQGoiBSQAIAEoAiAhBgJAAkAgAkEBcUUEQCAGRQ0BQbqQwwBBLEHokMMAENoXAAsgBiADQQFqRw0BCyAFIAEgBBCGDCAFKAIEIQICQCAFKAIAIgNBMEYEQCABQRhqIAIQiBsMAQsgAEEIaiAFQQhqQTgQ9gYaCyAAIAM2AgAgACACNgIEIAVBQGskAA8LQfiQwwBBOUG0kcMAENoXAAuaAQEFfyAAKAKQDSgCVCAALQCcCkECRwRAIAAoApAKIAAoApQKEJ0bIQMLIAAoApQNELEVIQUgACgCmA0iAQRAIAEQsRUhAgtBACEBIAAoAtQKQQNHBEAgACgC9ApBAnQgACgC6ApBA3RqIQELIAAtAJwNQQFGBEBBuePgAEEoQcTtwwAQ2hcAC0E0bCADaiAFaiACaiABakE0aguhAQECfyMAQUBqIgMkACADIAI2AhAgAyABNgIMIAEgAkEBak0gACgCDCIEIAJPcUUEQCADQQI2AhggA0H8q+AANgIUIANCAjcCICADQQk2AjggA0H6ADYCMCADIAQ2AjwgAyADQSxqNgIcIAMgA0E8ajYCNCADIANBDGo2AiwgA0EUakGMrOAAEKEdAAsgACACNgIUIAAgATYCECADQUBrJAALkwEBBH8jAEEQayIBJABBgIDEACECIAAoAgAoAlAiAyAAKAIIIgRHBEAgASAAKAIEIAQCf0EBIAAQvAwiAEGAAUkNABpBAiAAQYAQSQ0AGkEDQQQgAEGAgARJGwsgA2pB6JrEABCwFCABIAEoAgAiADYCCCABIAAgASgCBGo2AgwgAUEIahC7GiECCyABQRBqJAAgAgu0AQEBfyMAQUBqIgIkACAAKAIAIQAgAkHstMcANgI4IAJB3LTHADYCMCACIABBBGo2AiwgAkHctMcANgIoIAIgAEEDajYCJCACQdy0xwA2AiAgAiAAQQJqNgIcIAJB3LTHADYCGCACIABBAWo2AhQgAkHctMcANgIQIAIgADYCDCACIABBBWo2AjwgAiACQTxqNgI0IAFB8LXHAEEFQcC1xwBBBiACQQxqQQYQxgggAkFAayQAC5kBAQd/IwBBMGsiAiQAIAEoAgQhByACIAEoAggiBEEIQSgQ5xQgAigCACIFIARB/////wFxIgEgASAFSxshA0EAIQEgAigCBCEGA0AgAwRAIAJBCGoiCCABIAdqEI8HIAEgBmogCEEoEPYGGiADQQFrIQMgAUEoaiEBDAELCyAAIAQ2AgggACAGNgIEIAAgBTYCACACQTBqJAALmQEBB38jAEEwayICJAAgASgCBCEHIAIgASgCCCIEQQhBKBDnFCACKAIAIgUgBEH/////AXEiASABIAVLGyEDQQAhASACKAIEIQYDQCADBEAgAkEIaiIIIAEgB2oQniAgASAGaiAIQSgQ9gYaIANBAWshAyABQShqIQEMAQsLIAAgBDYCCCAAIAY2AgQgACAFNgIAIAJBMGokAAu1AQEBfyMAQUBqIgIkACAAKAIAIQAgAkGQ7tgANgI4IAJBrO/YADYCMCACIABBwQBqNgIsIAJBgO7YADYCKCACIABBOGo2AiQgAkG879gANgIgIAIgAEEIajYCHCACQazv2AA2AhggAiAAQUBrNgIUIAJBvI3aADYCECACIAA2AgwgAiAAQTxqNgI8IAIgAkE8ajYCNCABQcyo2QBBDEHY79gAQQYgAkEMakEGEMYIIAJBQGskAAu0AQEBfyMAQUBqIgIkACAAKAIAIQAgAkH8jdoANgI4IAJBmO3YADYCMCACIABBEmo2AiwgAkGY7dgANgIoIAIgAEERajYCJCACQdDr2AA2AiAgAiAAQQxqNgIcIAJBmO3YADYCGCACIABBEGo2AhQgAkG8jdoANgIQIAIgADYCDCACIABBCGo2AjwgAiACQTxqNgI0IAFB4vDYAEETQej02ABBBiACQQxqQQYQxgggAkFAayQAC7QBAQF/IwBBQGoiAiQAIAAoAgAhACACQajt2AA2AjggAkGY7dgANgIwIAIgAEE1ajYCLCACQZjt2AA2AiggAiAAQTRqNgIkIAJBiO3YADYCICACIABBNmo2AhwgAkG46tgANgIYIAIgAEEoajYCFCAC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3wA2AhggAiAAQRBqNgIUIAJBrNPfADYCECACIABBzABqNgIMIAIgAEFAazYCPCACIAJBPGo2AjQgAUHg1N8AQQpBsNTfAEEGIAJBDGpBBhDGCCACQUBrJAALsgEBAX8jAEEwayICJAAgAgJ/AkACQAJAAkACQCAALQAAQQFrDgMBAgMACyACQdnzwQA2AghBDgwECyACQefzwQA2AghBDgwDCyACQfXzwQA2AggMAQsgAkGL9MEANgIIC0EWCzYCDCACQQE2AhQgAkGo7uAANgIQIAJCATcCHCACQQI2AiwgAiACQShqNgIYIAIgAkEIajYCKCABKAIUIAEoAhggAkEQahCVJCACQTBqJAALqwEBAn8jAEFAaiIBJAAgASAAKAIAKAJQIgI2AhQgAUEIaiAAKAIEIAAoAgggAkHMmcQAELAUIAEgASgCCCIANgIYIAEgACABKAIMajYCHCABQRhqELsaIgBBgIDEAEYEQCABQQE2AiQgAUH0mcQANgIgIAFCATcCLCABQQk2AjwgASABQThqNgIoIAEgAUEUajYCOCABQSBqQfyZxAAQoR0ACyABQUBrJAAgAAukAQECfyMAQSBrIgQkAAJAIAEtAJwNQQFHBEACQAJAIAEpAwBCAlENACACKALIBEECRg0DIARBEGoiBSABIAJB2AFqIAMQsQUgBCAFEOUXIAQoAgBBAkYNACAAIAQpAgA3AgAgAEEIaiAEQQhqKQIANwIADAELIAAgASACIAMQowQLIARBIGokAA8LQbnj4ABBKEHMiMMAENoXAAtB7IfDABC8KQALpwEBAX8jAEEwayICJAACfyAALQAARQRAIAAtAAEhACACQQE2AhwgAkGo7uAANgIYIAJCATcCJCACQaQBNgIQIAIgADoAFyACIAJBDGo2AiAgAiACQRdqNgIMIAEoAhQgASgCGCACQRhqEJUkDAELIAJBADYCKCACQQE2AhwgAkHEpMMANgIYIAJCBDcCICABKAIUIAEoAhggAkEYahCVJAsgAkEwaiQAC5wBAQN/IwBB4ABrIgIkACACQQhqIAFBIGpBiK/DABCeHSACKAIMIQEgAigCCCEDIAJBCDYCUCACQRBqIAMgAkHQAGoQ3gggASABKAIAQQFqNgIAIABBCGohASACKAIUIQMCQCACKAIQIgRBKkYEQCABIAM2AgAMAQsg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KAIIIAAoAgAQzSkLkQEBAn8jAEEQayICJAAgASABQRBrIgMQzRkEQCACQQhqIAFBCGopAgA3AwAgAiABKQIANwMAA0ACQCADIgFBEGogASkCADcCACABQRhqIAFBCGopAgA3AgAgACABRg0AIAIgAUEQayIDEM0ZDQELCyABIAIpAwA3AgAgAUEIaiACQQhqKQMANwIACyACQRBqJAALiQECAn4BfyABIAEoAjhBBGo2AjggASABKQMwIACtIgMgASgCPCIAQQN0QThxrYaEIgI3AzAgAQJ/QQggAGsiBEEETQRAIAEgASkDGCAChTcDGCABEJILIAEpAzAhAiABIAMgBEEDdK2INwMwIAEgAiABKQMAhTcDACAAQQRrDAELIABBBGoLNgI8C4sBAQJ/IwBBEGsiBCQAAkACQAJ/IAEoAgAiA0EBakF+cSADRgRAIAEoAggMAQsgBEEIaiABENQaIAQoAgghAyAEKAIMCyIBQQNPBEAgAywAAkG/f0wNAQwCCyABQQJGDQELIAMgAUECIAEgAhC4JgALIAAgAUECazYCBCAAIANBAmo2AgAgBEEQaiQAC50BAgF/AX4jAEEQayICJAACfwJAAkACQEICIAAoAgAiACkDAEICfSIDIANCAlobp0EBaw4CAQIACyACIABBCGo2AgQgAUGGjtkAQQkgAkEEakGrAxDECgwCCyACIABBCGo2AgggAUGPjtkAQQcgAkEIakGsAxDECgwBCyACIAA2AgwgAUGWjtkAQQUgAkEMakGtAxDECgsgAkEQaiQAC5UBAQR/IAAoAghBOGwhBCAAKAIEIQUDQAJAIAMgBEcEQAJAAkACQCADIAVqIgIoAgBBAWsOAgECAAsgASACQQhqEOAhIAJBKGogARDlKwwDCyABIAJBEGoQtBkgAkEwaiICKAIARQ0CIAIgARC7KwwCCyABIAJBBGoQtCUMAQsgAEEUaiABEM8jDwsgA0E4aiEDDAALAAuaAQEDfyAAKAIIQThsIQMgACgCBCEEQQAhAANAAkAgACADRwRAAkACQAJAIAAgBGoiAigCAEEBaw4CAQIACyACQQhqIAEQ2SEgAkEoaiABENkrDAMLIAJBEGopAwAgAkEgaigCACABEMYUIAJBMGoiAigCAEUNAiACIAEQwisMAgsgAkEEaiABENgtDAELDwsgAEE4aiEADAALAAuYAQEDfyAAKAIIQQxsIQMgACgCBCEAA0AgAwRAAkAgACgCAARAIAAgARCCLQwBCwJAAkACQEEEIAAoAgQiAigCAEEFayIEIARBBk8bQQFrDgUAAQMDAgMLIAJBCGogARCWIiACQShqIAEQgi0MAgsgAkEoaiABEIItDAELIAJBCGogARCWIgsgAEEMaiEAIANBDGshAwwBCwsLmgEBBH8jAEEQayICJAAgAiABKAIUIgMQwRwCQCACKAIARQRAIAIoAgQhBCABQQxqIgUoAgAgA0YEQCAFENAWCyAAIAQ2AgQgAEEDNgIAIAEgA0EBajYCFCABKAIQIANBCWxqIgBCADcAACAAQQhqQQA6AAAMAQsgACACKQMINwMQIABC/v///wc3AwggAEEANgIACyACQRBqJAALiQEBA38jAEEQayICJAAgACgCBCEDIAAoAgggASgCFEHQreAAQQEgASgCGCgCDBEDACEEIAJBADoACSACIAQ6AAggAiABNgIEQQJ0IQEDQCABBEAgAiADNgIMIAJBBGogAkEMakEcEPkHIAFBBGshASADQQRqIQMMAQsLIAJBBGoQwhwgAkEQaiQAC4kBAQN/IwBBEGsiAiQAIAAoAgQhAyAAKAIIIAEoAhRB0K3gAEEBIAEoAhgoAgwRAwAhBCACQQA6AAkgAiAEOgAIIAIgATYCBEECdCEBA0AgAQRAIAIgAzYCDCACQQRqIAJBDGpBKhD5ByABQQRrIQEgA0EEaiEDDAELCyACQQRqEMIcIAJBEGokAAuJAQEDfyMAQRBrIgIkACAAKAIEIQMgACgCCCABKAIUQdCt4ABBASABKAIYKAIMEQMAIQQgAkEAOgAJIAIgBDoACCACIAE2AgRBDGwhAQNAIAEEQCACIAM2AgwgAkEEaiACQQxqQSsQ+QcgAUEMayEBIANBDGohAwwBCwsgAkEEahDCHCACQRBqJAALiQEBA38jAEEQayICJAAgACgCBCEDIAAoAgggASgCFEHQreAAQQEgASgCGCgCDBEDACEEIAJBADoACSACIAQ6AAggAiABNgIEQQxsIQEDQCABBEAgAiADNgIMIAJBBGogAkEMakEsEPkHIAFBDGshASADQQxqIQMMAQsLIAJBBGoQwhwgAkEQaiQAC4cBAQV/IwBBgAFrIgQkAEH/ACECA0AgBCACIgNqIgUgAEEPcSICQTByIAJBN2ogAkEKSRs6AAAgA0EBayECIABB/wFxIgZBBHYhACAGQRBPDQALIANBgQFPBEAgA0GAAUG488AAEJwQAAsgAUEBQYyx4ABBAiAFQYABIANrEIIEIARBgAFqJAALhAEBAn8gA0H4////AXEEQCAAIAAgA0EDdiIDQQR0IgRqIAAgA0EcbCIFaiADEI0NIQAgASABIARqIAEgBWogAxCNDSEBIAIgAiAEaiACIAVqIAMQjQ0hAgsgACACIAEgACgCACIAIAEoAgAiAUkiAyABIAIoAgAiAklzGyADIAAgAklzGwugAQEBfyMAQUBqIgIkACACQQA2AhQgAkKAgICAEDcCDCACQQM6ADggAkEgNgIoIAJBADYCNCACQZT8wQA2AjAgAkEANgIgIAJBADYCGCACIAJBDGo2AiwgASACQRhqEJkXRQRAIAAgAikCDDcCACAAQQhqIAJBFGooAgA2AgAgAkFAayQADwtB3LXgAEE3IAJBP2pBrPzBAEHgtuAAEMAOAAugAQEBfyMAQUBqIgIkACACQQA2AhQgAkKAgICAEDcCDCACQQM6ADggAkEgNgIoIAJBADYCNCACQZT8wQA2AjAgAkEANgIgIAJBADYCGCACIAJBDGo2AiwgASACQRhqEI0ZRQRAIAAgAikCDDcCACAAQQhqIAJBFGooAgA2AgAgAkFAayQADwtB3LXgAEE3IAJBP2pBrPzBAEHgtuAAEMAOAAugAQEBfyMAQUBqIgIkACACQQA2AhQgAkKAgICAEDcCDCACQQM6ADggAkEgNgIoIAJBADYCNCACQcD9wQA2AjAgAkEANgIgIAJBADYCGCACIAJBDGo2AiwgASACQRhqEJkXRQRAIAAgAikCDDcCACAAQQhqIAJBFGooAgA2AgAgAkFAayQADwtB3LXgAEE3IAJBP2pB2P3BAEHgtuAAEMAOAAuGAQECfyADQfj///8BcQRAIAAgACADQQN2IgNB4ABsIgRqIAAgA0GoAWwiBWogAxCRDSEAIAEgASAEaiABIAVqIAMQkQ0hASACIAIgBGogAiAFaiADEJENIQILIAAgAiABIAAoAgwiACABKAIMIgFJIgMgASACKAIMIgJJcxsgAyAAIAJJcxsLigEBA38jAEEQayICJAAgACgCBCEDIAAoAgggASgCFEHQreAA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+QcgAUEMayEBIANBDGohAwwBCwsgAkEEahDCHCACQRBqJAALigEBA38jAEEQayICJAAgACgCBCEDIAAoAgggASgCFEHQreAAQQEgASgCGCgCDBEDACEEIAJBADoACSACIAQ6AAggAiABNgIEQQR0IQEDQCABBEAgAiADNgIMIAJBBGogAkEMakGjAhD5ByABQRBrIQEgA0EQaiEDDAELCyACQQRqEMIcIAJBEGokAAuKAQEDfyMAQRBrIgIkACAAKAIEIQMgACgCCCABKAIUQdCt4ABBASABKAIYKAIMEQMAIQQgAkEAOgAJIAIgBDoACCACIAE2AgRBA3QhAQNAIAEEQCACIAM2AgwgAkEEaiACQQxqQaUCEPkHIAFBCGshASADQQhqIQMMAQsLIAJBBGoQwhwgAkEQaiQAC5ABAQZ/IwBBEGsiAiQAIAEoAgQhByACQQhqIAEoAggiBEEEQQQQ5xQgAigCCCIFIARB/////wNxIgEgASAFSxshA0EAIQEgAigCDCEGA0AgAwRAIAEgBmogASAHahDZGTYCACADQQFrIQMgAUEEaiEBDAELCyAAIAQ2AgggACAGNgIEIAAgBTYCACACQRBqJAALkAEBBn8jAEEQayICJAAgASgCBCEHIAJBCGogASgCCCIEQQRBBBDnFCACKAIIIgUgBEH/////A3EiASABIAVLGyEDQQAhASACKAIMIQYDQCADBEAgASAGaiABIAdqENgcNgIAIANBAWshAyABQQRqIQEMAQsLIAAgBDYCCCAAIAY2AgQgACAFNgIAIAJBEGokAAuoAQECfyABKALAASABKALEARDcHCIDQYCAxABHBEAgAUHAAWoiBBCcFQJ/QQAgA0ENRw0AGkENIQNBACABKALAASABKALEARDcHEEKRw0AGiAEEJwVQQFBAiACGyEDQfLm4ABB8ObgACACGwshAiAAIAM2AgggACACNgIEIABBADYCACABIAEoAtABNgKkASABIAEoAqABQQFqNgKgAQ8LQZTi2AAQvCkAC4oBAQN/IwBBEGsiAiQAIAAoAgQhAyAAKAIIIAEoAhRB0K3gAEEBIAEoAhgoAgwRAwAhBCACQQA6AAkgAiAEOgAIIAIgATYCBEEEdCEBA0AgAQRAIAIgAzYCDCACQQRqIAJBDGpBlAMQ+QcgAUEQayEBIANBEGohAwwB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IAAoAjwiAkEDdCIDQThxrYaEIgQ3AzACQCACQQhNBEAgACAAKQMYIASFNwMYIAAQkgsgACkDMCEEIAAgAUHAACADa62IQgAgAhs3AzAgACAEIAApAwCFNwMADAELIAJBCGohAgsgACACNgI8C3QBBX8gAEH/AXEiBUENRiICIAFB/wFxIgYiA0ENRnEhBAJAIAIgA0ENRnINAEEAIQRBAyAAQQJrIgIgAkH/AXFBC08bQf8BcSICQQMgAUECayIDIANB/wFxQQtPG0H/AXFHDQAgBSAGRiACQQNHciEECyAEC48BAQN/IAAoAghBOGwhAyAAKAIEIQRBACEAA0ACQCAAIANHBEACQAJAAkAgACAEaiICKAIAQQFrDgIBAgALIAEgAkEIahDTISACQShqIAEQvisMAwsgAkEQaiABEMgtIAJBMGoiAigCAEUNAiACIAEQvSsMAgsgAkEEaiABENstDAELDwsgAEE4aiEADAALAAuPAQEDfyAAKAIIQThsIQMgACgCBCEEQQAhAANAAkAgACADRwRAAkACQAJAIAAgBGoiAigCAEEBaw4CAQIACyABIAJBCGoQ1iEgAkEoaiABENYrDAMLIAJBEGogARDgKCACQTBqIgIoAgBFDQIgAiABEMErDAILIAJBBGogARDXLQwBCw8LIABBOGohAAwACwALkwEBA38gACgCCEEobCECIAAoAgQhA0EAIQADQAJAIAAgAkcEQAJAAkACQAJAAkAgACADaiIBKAIAQQFrDgQBAgMEAAsgAUEYakIANwIADAULIAFBBGoQwB8MBAsgAUEIakIANwIAIAFBBGoQxi0MAwsgAUEEahDVLQwCCyABQQRqELIgDAELDwsgAEEoaiEADAALAAuDAQECfyMAQRBrIgYkACABLQAAIQcgBkEIaiACIAMgBCAFQfyTwAAQ0xYgBiAHIAYoAgggBigCDBCgBkEAIQUgACAGKAIAQQFxBH8gACAEIAYoAgQgBGoiAiABLQABayIBQQAgASACTRsiASABIARJGzYCBEECBSAFCzYCACAGQRBqJAALfQEDfyAAKAIAIQEgACgCBCICKAIIIQAgAigCACIDBEAgASAAQQFrQXhxakEIaiADEQEACwJAIAFBf0YNACABIAEoAgQiA0EBazYCBCADQQFHDQBBBCAAIABBBE0bIgAgAigCBGpB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QQhqEMMhCyADQSBqJAALdAECfwJAIABBBWtB/wFxIgFBAWpBACABQSJJGyIBQR5LDQACQEEBIAF0QeLV6Y8EcUUEQCABRQ0BIAFBEkcNAgtBASECDAELIABB/wFxDQAgAEEIdkH/AXEiAEEjTw0AQsXDgqL+ACAArYinIQILIAJBAXELhQEBA38gACgCCEE4bCEDIAAoAgQhBEEAIQADQAJAIAAgA0cEQAJAAkACQCAAIARqIgIoAgBBAWsOAgECAAsgASACQQhqENghIAJBKGogARDTKwwDCyACQTBqIgIoAgBFDQIgAiABEMArDAILIAJBBGogARDZLQwBCw8LIABBOGohAAwACwALhQEBA38gACgCCEE4bCEDIAAoAgQhBEEAIQADQAJAIAAgA0cEQAJAAkACQCAAIARqIgIoAgBBAWsOAgECAAsgAkEIaiABENohIAJBKGogARDHKwwDCyACQTBqIgIoAgBFDQIgAiABELwrDAILIAJBBGogARDcLQwBCw8LIABBOGohAAwACwALhQEBA38gACgCCEE4bCEDIAAoAgQhBEEAIQADQAJAIAAgA0cEQAJAAkACQCAAIARqIgIoAgBBAWsOAgECAAsgAkEIaiABEPshIAJBKGogARDqLAwDCyACQTBqIgIoAgBFDQIgAiABEOcsDAILIAJBBGogARDoLQwBCw8LIABBOGohAAwACwALhQEBA38gACgCCEE4bCEDIAAoAgQhBEEAIQADQAJAIAAgA0cEQAJAAkACQCAAIARqIgIoAgBBAWsOAgECAAsgAkEIaiABEPwhIAJBKGogARDsLAwDCyACQTBqIgIoAgBFDQIgAiABEOYsDAILIAJBBGogARDnLQwBCw8LIABBOGohAAwACwALhQEBA38gACgCCEE4bCEDIAAoAgQhBEEAIQADQAJAIAAgA0cEQAJAAkACQCAAIARqIgIoAgBBAWsOAgECAAsgAkEIaiABEP4hIAJBKGogARDuLAwDCyACQTBqIgIoAgBFDQIgAiABEOIsDAILIAJBBGogARDpLQwBCw8LIABBOGohAAwACwALhQEBA38gACgCCEE4bCEDIAAoAgQhBEEAIQADQAJAIAAgA0cEQAJAAkACQCAAIARqIgIoAgBBAWsOAgECAAsgAkEIaiABEJYiIAJBKGogARCOLQwDCyACQTBqIgIo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AwAgAEEIaiACQRBqKQMANwMADAELIAAgAigCDDYCBCAAQSY2AgALIAJBIGokAAtsAQF/IwBBIGsiAiQAIAJBCGogAUH8ABClBgJAIAIoAghBJUcEQCAAIAIpAwg3AwAgAEEQaiACQRhqKQMANwMAIABBCGogAkEQaikDADcDAAwBCyAAIAIoAgw2AgQgAEEmNgIACyACQSBqJAALcQECfyMAQRBrIgQkACAEQQhqIAIgAyABKAIIIgMQshkgBCgCDCECIAEgBCgCCCIFNgIIIAAgAjYCDCAAIAE2AgggACADIAJrNgIQIAAgASgCBCIBIAJBOGxqNgIEIAAgASAFQThsajYCACAEQRBqJAALcgEBfyMAQdAAayICJAAgAkEIaiABENEYIAJByABqIAJBIGopAwA3AgAgAkFAayACQRhqKQMANwIAIAJBOGogAkEQaikDADcCACAAQQA2AgAgAiACKQMINwIwIABBBGogAkEsakEkEPYGGiACQdAAaiQAC3EBAn8jAEEQayIEJAAgBEEIaiACIAMgASgCCCIDELIZIAQoAgwhAiABIAQoAggiBTYCCCAAIAI2AgwgACABNgIIIAAgAyACazYCECAAIAEoAgQiASACQTBsajYCBCAAIAEgBUEwbGo2AgAgBEEQaiQAC3oBA38jAEEQayIDJAACQAJAAkAgASgCAEEBaw4CAQEACyADQQhqIAFBCGoQshwgAygCCCICIAEoAigQmA8iBCACIARJGyEBIAIgBCACIARLGyECDAELIAEoAgwhAiABKAIIIQELIAAgAjYCBCAAIAE2AgAgA0EQaiQAC3gCAX8BfiMAQRBrIgUkAAJAAkAgBEGAPHFBgDxGBEAgA0UNASAFQQhqIAEgAkEBENEBIAUtAAhBBEYNASAFKQMIIgZC/wGDQgRRDQEgACAGNwIADAILIABBBDoAAAwBC0G54+AAQShBtNbYABDaFwALIAVBEGokAAt9AQF/IwBBEGsiAiQAIAJBBGogASgCBCABKAIIEM8DAkAgAigCBEUEQCAAQYCAgIB4NgIAIAAgASkCADcCBCAAQQxqIAFBCGooAgA2AgAMAQsgACACKQIINwIMIAAgASkCADcCACAAQQhqIAFBCGooAgA2AgALIAJBEGokAAuIAQEBf0EBIQECQAJAAkACQAJAAkACQCAAKAIAQQFr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AkQhASACKAJAIQUgAkH4AGoiByAEIAhBCBDvDwwECyACQe4AOgB4IAMgByACQfgAahC0IwsgBRCcFQwACwALIAlBJTYCACAJIAE2AgQMAwsgAkHoAGogBxC6GyAGIAQQpyRBEBDNICIEQQhqIAJB8ABqKQIANwIAIAQgAikCaDcCACADKALoAUEIaiAFIAEQ5hkhDSACIAQ2AnggAisDeCEQQR4MAQsgBiAEEKckQR0LIQEgCSAQOQMQIAkgDTcDCCAJIAE2AgALIAJBkAFqJAAMAQtBuePgAEEoQYTl2AAQ2hcACwJAIAsoAghBJUcEQCAAIAspAwg3AwAgAEEQaiALQRhqKQMANwMAIABBCGogC0EQaikDADcDAAwBCyAAIAsoAgw2AgQgAEEmNgIACyALQSBqJAALcgEBfyMAQSBrIgIkACABQcABahCcFSACQQhqQRM2AgACQCACKAIIQSVHBEAgACACKQMINwMAIABBEGogAkEYaikDADcDACAAQQhqIAJBEGopAwA3AwAMAQsgACACKAIMNgIEIABBJjYCAAsgAkEgaiQAC9MBAQR/IwBBIGsiAiQAIAJBCGohAyABKALAASABKALEARCJHCEFIAFBwAFqIgQQnBUCQCAFQT9HBEAgA0EXNgIADAELIAQQnBUgASgCwAEgASgCxAEQ3BxBPUcEQCADQRY6AAQgA0EUNgIADAELIAQQnBUgA0EPOgAEIANBFTYCAAsCQCACKAIIQSVHBEAgACACKQMINwMAIABBEGogAkEYaikDADcDACAAQQhqIAJBEGopAwA3AwAMAQsgACACKAIMNgIEIABBJjYCAAsgAkEgaiQAC2oBA38gAUECdCECAkACfyABQf////8DSwRAQQEhAUEIIQNBBAwBC0EAIQFBBCEDIAJB/P///wdLBEBBACECQQEhAQwCCyACIQRBBCECQQgLIABqIAQ2AgALIAAgA2ogAjYCACAAIAE2AgALeQEBfyAAKAIIQShsIQIgACgCBCEAA0AgAgRAAkACQAJAAkACQCAAKAIAQQFrDgQAAQIDBAsgAEEEaiABEO4hDAMLIABBBGogARC9KwwCCyAAQQRqIAEQ1ywMAQsgAEEEaiABELUPCyAAQShqIQAgAkEoayECDAELCwt5AQF/IAAoAghBKGwhAiAAKAIEIQADQCACBEACQAJAAkACQAJAIAAoAgBBAWsOBAABAgMECyAAQQRqIAEQ6iEMAwsgAEEEaiABEMErDAILIABBBGogARDTLAwBCyAAQQRqIAEQtg8LIABBKGohACACQShrIQIMAQsLC3kBAX8gACgCCEEobCECIAAoAgQhAANAIAIEQAJAAkACQAJAAkAgACgCAEEBaw4EAAECAwQLIABBBGogARDrIQwDCyAAQQRqIAEQwCsMAgsgAEEEaiABENQsDAELIABBBGogARC3DwsgAEEoaiEAIAJBKGshAgwBCwsLgAEBAX8jAEEQayICJAACQCAAKAIQDQACQAJAIAEtADlBAWsOAgECAAsgASAAIAEtADgQ6hUMAQsgAkEIaiABIABBABDfBiACKAIIQQFGBEAgACACKAIMEIcENgIQDAELIAAgASgCLBCHBDYCECABIAAgAS0AOBDqFQsgAkEQaiQAC3kBAX8gACgCCEEobCECIAAoAgQhAANAIAIEQAJAAkACQAJAAkAgACgCAEEBaw4EAAECAwQLIABBBGogARDvIQwDCyAAQQRqIAEQuysMAgsgAEEEaiABENksDAELIABBBGogARC5DwsgAEEoaiEAIAJBKGshAgwBCwsLeQEBfyAAKAIIQShsIQIgACgCBCEAA0AgAgRAAkACQAJAAkACQCAAKAIAQQFrDgQAAQIDBAsgAEEEaiABENEhDAMLIABBBGogARC8KwwCCyAAQQRqIAEQ2CwMAQsgAEEEaiABELoPCyAAQShqIQAgAkEoayECDAELCwt5AQF/IAAoAghBKGwhAiAAKAIEIQADQCACBEACQAJAAkACQAJAIAAoAgBBAWsOBAABAgMECyAAQQRqIAEQ7CEMAwsgAEEEaiABEMIrDAILIABBBGogARDVLAwBCyAAQQRqIAEQuw8LIABBKGohACACQShrIQIMAQsLC3kBAX8gACgCCEEobCECIAAoAgQhAANAIAIEQAJAAkACQAJAAkAgACgCAEEBaw4EAAECAwQLIABBBGogARDtIQwDCyAAQQRqIAEQvysMAgsgAEEEaiABENYsDAELIABBBGogARC8DwsgAEEoaiEAIAJBKGshAgwBCwsLdgIBfgN/IAAoAhAhAiAAKAIIIQMgACkDACEBA38gAVAEfyAAIAJBQGoiAjYCECAAIANBCGoiBDYCCCAAIAMpAwBCf4VCgIGChIiQoMCAf4MiATcDACAEIQMMAQUgACABQgF9IAGDNwMAIAIgAXqnQfgAcWsLCwt5AQF/IAAoAghBKGwhAiAAKAIEIQADQCACBEACQAJAAkACQAJAIAAoAgBBAWsOBAABAgMECyAAQQRqIAEQ9SEMAwsgAEEEaiABEN8sDAILIABBBGogARD2LAwBCyAAQQRqIAEQvg8LIABBKGohACACQShrIQIMAQsLC3kBAX8gACgCCEEobCECIAAoAgQhAANAIAIEQAJAAkACQAJAAkAgACgCAEEBaw4EAAECAwQLIABBBGogARD3IQwDCyAAQQRqIAEQ4ywMAgsgAEEEaiABEPUsDAELIABBBGogARC/DwsgAEEoaiEAIAJBKGshAgwBCwsLeQEBfyAAKAIIQShsIQIgACgCBCEAA0AgAgRAAkACQAJAAkACQCAAKAIAQQFrDgQAAQIDBAsgAEEEaiABEPkhDAMLIABBBGogARDnLAwCCyAAQQRqIAEQ8ywMAQsgAEEEaiABEMAPCyAAQShqIQAgAkEoayECDAELCwt5AQF/IAAoAghBKGwhAiAAKAIEIQADQCACBEACQAJAAkACQAJAIAAoAgBBAWsOBAABAgMECyAAQQRqIAEQ+iEMAwsgAEEEaiABEOYsDAILIABBBGogARD0LAwBCyAAQQRqIAEQwQ8LIABBKGohACACQShrIQIMAQsLC3kBAX8gACgCCEEobCECIAAoAgQhAANAIAIEQAJAAkACQAJAAkAgACgCAEEBaw4EAAECAwQLIABBBGogARD2IQwDCyAAQQRqIAEQ4iwMAgsgAEEEaiABEPcsDAELIABBBGogARDCDwsgAEEoaiEAIAJBKGshAgwBCwsLeQEBfyAAKAIIQShsIQIgACgCBCEAA0AgAgRAAkACQAJAAkACQCAAKAIAQQFrDgQAAQIDBAsgAEEEaiABEJ0iDAMLIABBBGogARCDLQwCCyAAQQRqIAEQii0MAQsgAEEEaiABEMMPCyAAQShqIQAgAkEoayECDAELCwt5AQF/IAAoAghBKGwhAiAAKAIEIQADQCACBEACQAJAAkACQAJAIAAoAgBBAWsOBAABAgMECyAAQQRqIAEQlSIMAwsgAEEEaiABEIItDAILIABBBGogARCLLQwBCyAAQQRqIAEQxA8LIABBKGohACACQShrIQIMAQsLC3IBAn8jAEEQayICJAACQCABQYABTwRAIAJBADYCDCACIAEgAkEMahDZCSAAIAIoAgAgAigCBBDWHQwBCyAAKAIIIgMgACgCAEYEQCAAEOQWCyAAIANBAWo2AgggACgCBCADaiABOgAACyACQRBqJABBAAteAQJ/AkAgAUUNAAN/IAFBAU0EfyAAIANBKGxqKAIYIgAgAkYNAiADIAAgAklqBSADIAFBAXYiBCADaiIDIAAgA0EobGooAhggAksbIQMgASAEayEBDAELCyEDCyADC3kBAX8gACgCCEEobCECIAAoAgQhAANAIAIEQAJAAkACQAJAAkAgACgCAEEBaw4EAAECAwQLIABBBGogARCoIgwDCyAAQQRqIAEQlS0MAgsgAEEEaiABEK4tDAELIABBBGogARDHDwsgAEEoaiEAIAJBKGshAgwBCwsLeQEBfyAAKAIIQShsIQIgACgCBCEAA0AgAgRAAkACQAJAAkACQCAAKAIAQQFrDgQAAQIDBAsgAEEEaiABELAiDAMLIABBBGogARCgLQwCCyAAQQRqIAEQsC0MAQsgAEEEaiABEMgPCyAAQShqIQAgAkEoayECDAELCwt2AQF/IAAoAghBOGwhAiAAKAIEIQADQAJAIAIEQAJAAkACQCAAKAIAQQFrDgIBAgALIABBCGogARClIiAAQShqIAEQny0MAwsgAEEwaiABEJgmDAILIABBBGogARCfLQwBCw8LIABBOGohACACQThrIQIMAAsAC3kBAX8gACgCCEEobCECIAAoAgQhAANAIAIEQAJAAkACQAJAAkAgACgCAEEBaw4EAAECAwQLIABBBGogARCnIgwDCyAAQQRqIAEQmi0MAgsgAEEEaiABELEtDAELIABBBGogARDKDwsgAEEoaiEAIAJBKGshAgwBCwsLeQEBfyAAKAIIQShsIQIgACgCBCEAA0AgAgRAAkACQAJAAkACQCAAKAIAQQFrDgQAAQIDBAsgAEEEaiABEKkiDAMLIABBBGogARCmLQwCCyAAQQRqIAEQry0MAQsgAEEEaiABEMsPCyAAQShqIQAgAkEoayECDAELCwtpAQN/IwBBEGsiAiQAIAIgATYCCAJAQQFBAiABEAAiA0EBRhtBACADGyIDQQJHBEAgACADOgABDAELIAAgAkEIaiACQQ9qQdDBwAAQ+gQ2AgRBASEECyAAIAQ6AAAgARCxJiACQRBqJAALYgEFfyABQTRqIQcgAS8BMiEGA0AgBEEBcSADIAZLckUEQCAHIANBAnRqKAIAIgUgAzsBMCAFIAE2AgAgBEEBIAMgBkkiBRshBCADIAVqIQMMAQsLIAAgAjYCBCAAIAE2AgALZAEBfyMAQSBrIgIkACACQQhqIAFBpANqQQBBABC7BiACKAIIIgFBA0cEQCAAIAIpAgw3AgQgAEEUaiACQRxqKAIANgIAIABBDGogAkEUaikCADcCAAsgACABNgIAIAJBIGokAAtwAQJ/IwBBEGsiBiQAIAEtAAEhByABLQAAIQEgBkEIaiACIAMgBCAFQeiVwAAQ0xYgBiABIAcgBigCCCAGKAIMEOkFQQAhASAAIAYoAgBBAXEEfyAAIAYoAgQgBGo2AgRBAgUgAQs2AgAgBkEQaiQAC3gBAX8jAEEgayIDJAACQCABIAAoAgBNBEAgAyAAIAFBBCACEPkPIAMoAgAiAEGBgICAeEcNASADQSBqJAAPCyADQQA2AhggA0EBNgIMIANBhJfjADYCCCADQgQ3AhAgA0EIakHYl+MAEKEdAAsgACADKAIEEL4pAAt4AQF/IwBBIGsiAiQAAkAgASAAKAIATQRAIAIgACABQQRBBBD5DyACKAIAIgBBgYCAgHhHDQEgAkEgaiQADwsgAkEANgIYIAJBATYCDCACQYSX4wA2AgggAkIENwIQIAJBCGpB2JfjABChHQALIAAgAigCBBC+KQALdQEBfyMAQRBrIgIkACACIAAoAgAiAEEkajYCDCABQdK1wABBCEH4k9oAQQQgAEEoakEuQdq1wABBBSAAQQhqQS9B37XAAEEFIABBFGpBMEHgjcQAQQsgAEEgakEQQeS1wABBEyACQQxqQSEQ/QkgAkEQaiQAC2YBBX4gACAAKQMYIgFCEIkgASAAKQMIfCIBhSICIAApAxAiAyAAKQMAfCIEQiCJfCIFNwMAIAAgAkIViSAFhTcDGCAAIAEgA0INiSAEhSICfCIBIAJCEYmFNwMQIAAgAUIgiTcDCAtwAQJ/IwBBEGsiAiQAAkAgAUGAAU8EQCACQQA2AgwgAiABIAJBDGoQ2QkgACACKAIAIAIoAgQQ0h0MAQsgACgCCCIDIAAoAgBGBEAgABDaFgsgACADQQFqNgIIIAAoAgQgA2ogAToAAAsgAkEQaiQAC2wBA38DQAJAIAEEQCAAKAIAIABBBGooAgAQliQgAEEYaigCACEDIABBHGooAgAiBCgCACICBEAgAyACEQEACyAEKAIEIgJFDQEgAyACIAQoAggQvREMAQsPCyABQQFrIQEgAEEgaiEADAALAAt0AANAIAEEQAJAAkACQAJAIAAoAgBBAmsOBgADAwMBAgMLIABBBGooAgAgAEEIaigCABDKKQwCCyAAQQRqKAIAIABBCGooAgAQuykMAQsgAEEEaigCACAAQQhqKAIAELspCyABQQFrIQEgAEEQaiEADAELCwtxAQJ/AkACQCABIAAoAgAgACgCCCICa0sEQCAAIAIgAUEEQQQQkRcgACgCCCECDAELIAFFDQELIAEgAmohAyAAKAIEIAJBAnRqIQIDQCACQYCAgIB4NgIAIAJBBGohAiABQQFrIgENAAsgACADNgIICwt4AQF/IwBBIGsiBCQAAkAgASAAKAIATQRAIAQgACABIAIgAxD5DyAEKAIAIgBBgYCAgHhHDQEgBEEgaiQADwsgBEEANgIYIARBATYCDCAEQYSX4wA2AgggBEIENwIQIARBCGpB2JfjABChHQALIAAgBCgCBBC+KQALagEDf0EDIQICQCAAIAEtAAwiBEEDRwR/IARBAkcEQCABKAIAIgIgAigCACIDQQFqNgIAIANBAEgNAiABKAIIIQMgASgCBCEBCyAAIAM2AgggACABNgIEIAAgAjYCACAEBSACCzoADA8LAAt5AQJ/QRAhAQJAAkACQEEGIAAoAgAiACgCCEECayICIAJBCU8bQQJrDgUCAgICAQALQQQhAQsgAEEIaiABaiIBKAIAIAFBBGooAgAQpyQLAkAgAEF/Rg0AIAAgACgCBCIBQQFrNgIEIAFBAUcNACAAQdAAQQQQvRELC3kBAX8jAEEQayIDJAAgAyACNgIMIAMgASgCAEEIakHQwtgAENAaIAMoAgQhAQJAIAMoAgAgA0EMahDYCCICRQRAIABBgICAgHg2AgAMAQsgACACQQRqKAIAIAJBCGooAgAQoggLIAEgASgCAEEBazYCACADQRBqJAALeQEBfyMAQRBrIgMkACADIAI2AgwgAyABKAIEQQhqQbDD2AAQ0BogAygCBCEBAkAgAygCACADQQxqENgIIgJFBEAgAEGAgICA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A0ICNwIUIANCgICAgJABIgQgA0EEaq2ENwMoIAMgBCADrYQ3AyAgAyADQSBqNgIQIANBCGogAhChHQALagIBfwF+IwBBMGsiAyQAIAMgADYCACADIAE2AgQgA0ECNgIMIANB5PbAADYCCCADQgI3AhQgA0KAgICAkAEiBCADQQRqrYQ3AyggAyAEIAOthDcDICADIANBIGo2AhAgA0EIaiACEKEdAAtqAgF/AX4jAEEwayIDJAAgAyAANgIAIAMgATYCBCADQQI2AgwgA0GY98AANgIIIANCAjcCFCADQoCAgICQASIEIANBBGqthDcDKCADIAQgA62ENwMgIAMgA0EgajYCECADQQhqIAIQoR0AC24BAX8jAEEwayICJAAgAiABNgIEIAIgADYCACACQQM2AgwgAkHsucAANgIIIAJCAjcCFCACIAJBBGqtQoCAgICQAYQ3AyggAiACrUKAgICAkAGENwMgIAIgAkEgajYCECACQQhqQajY4AAQoR0AC2oCAX8BfiMAQTBrIgMkACADIAE2AgQgAyAANgIAIANBAzYCDCADQZi6wAA2AgggA0ICNwIUIANCgICAgJABIgQgA0EEaq2ENwMoIAMgBCADrYQ3AyAgAyADQSBqNgIQIANBCGogAhChHQALagIBfwF+IwBBMGsiAyQAIAMgATYCBCADIAA2AgAgA0EDNgIMIANB6PfAADYCCCADQgI3AhQgA0KAgICAkAEiBCADrYQ3AyggAyAEIANBBGqthDcDICADIANBIGo2AhAgA0EIaiACEKEdAAukAQEDfyAAKAIIIgMgACgCAEYEQCMAQRBrIgIkACACQQhqIAAgACgCAEEBQQRBIBCaCCACKAIIIgRBgYCAgHhHBEAgBCACKAIMEL4pAAsgAkEQaiQACyAAIANBAWo2AgggACgCBCADQQV0aiIAIAEpAgA3AgAgAEEIaiABQQhqKQIANwIAIABBEGogAUEQaikCADcCACAAQRhqIAFBGGopAgA3AgALawECfyMAQRBrIgMkAANAAkAgAyABNgIIIAMgASACIgRqNgIMIAMgA0EIahDYCSADKAIARQRAQQAhBAwBCyADKAIMIAMoAghrIQIgAygCBEEgRg0BCwsgACAENgIEIAAgATYCACADQRBqJAALZQEBfyMAQRBrIgMkACADQQA2AgwgA0KAgICAEDcCBCADQQRqIAIQ2B4gAgRAA0AgA0EEaiABEPcHIAJBAWsiAg0ACwsgACADKQIENwIAIABBCGogA0EMaigCADYCACADQRBqJAALagEDfyMAQRBrIgYkACABKAJAIQcgASgCPCEIIAZBCGogAiADIAQgBUH4ucMAENMWQQAhASAAIAYoAgggBigCDCAIIAcQ0x8EfyAAIAQ2AgQgACAEIAdqNgIIQQEFIAELNgIAIAZBEGokAAtyAQF/IwBBIGsiAiQAIAFBAEgEQCACQQE2AgQgAkHk9sMANgIAIAJCATcCDCACQRA2AhwgAkG89sMANgIYIAIgAkEYajYCCCACQdj3wwAQoR0ACyAAQQA2AhggACABEM0eIABBDGogARDNHiACQSBqJAALbwECfyMAQRBrIgMkACADQQhqIAAoAgQgACgCCCAAKAIAKAJQQbyaxAAQsBQCQCADKAIIIAMoAgwgASACENMfIgRFDQAgASACEN8KIQIDQCACRQ0BIAAQ7wgaIAJBAWshAgwACwALIANBEGokACAEC2ABA38CQCAAKAIAIgIoAggiAyABKAIAIgAoAghHDQAgACgCBCEAIAIoAgQhAiADQQFqIQEDQCABQQFrIgFFIQQgAUUNASACIAAQ4AMgAkEcaiECIABBHGohAA0ACwsgBAtoAQF/IAAoAggiAiAAKAIARgRAIAAQ3xYLIAAgAkEBajYCCCAAKAIEIAJBHGxqIgAgASkCADcCACAAQQhqIAFBCGopAgA3AgAgAEEQaiABQRBqKQIANwIAIABBGGogAUEYaigCADYCAAtcAQR/IwBBEGsiASQAIAFBCGogABDZHwJAIAEoAggiAkUEQAwBCyABKAIMQQR0IQADQCAARSEDIABFDQEgAEEQayEAIAItAAwgAkEQaiECDQALCyABQRBqJAAgAwtsAQF/IAAoAgghASAAKAIEIQADQCABBEACQAJAAkACQCAAKAIADgIBAgALIABBBGoQtSgMAgsgAEEIahCFFiAAQShqEOMkDAELIABBEGoQyyYgAEEwahDRJgsgAUEBayEBIABBOGohAAwBCwsLZAEDfyABKAIAIQIgAUEANgIAAkAgAgRAIAEoAgghAyABKAIEIQIMAQsgASgCDCIEIAEoAhBGDQAgASAEQQFqNgIMIAEgASgCFCICQQFqNgIUIAQhAwsg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AiAENgIAIAAgAygCCCICRSACQQFxRXIEf0EABSAAIAEpAgA3AgggACABKAIQIgA2AgQgASAAQQFqNgIQQQELNgIAIANBEGokAAtZAQN/IwBBEGsiBCQAIAKnIQMDQCAEQQhqIAEgACABIANxIgNqKQAAIAMQqR0gBCgCCEEBRkUEQCAFQQhqIgUgA2ohAwwBCwsgACAEKAIMENsdIARBEGokAAtsAgN/AX4jAEEwayIBJAAgAUEANgIcIAFCgICAgBA3AhQgAUEkaiICIAFBFGoiAxDeHiADIAIQlwwgAUEIaiABKAIYIgIgASgCHBDOGSABKQMIIQQgASgCFCACELgpIAAgBDcDACABQTBqJAALawECfyMAQRBrIgIkACACQQhqIAEQ/Q8gAigCCCEBAkAgAigCDCIDBEAgACABIAMQhA42AhggACADNgIIIAAgATYCBCAAQQE2AgAMAQsgABCsFDYCGCAAQQA2AgAgAUEAEMEkCyACQRBqJAALZQEBfyMAQRBrIgAkAAJ/IAIoAgAEQEH0rdgAIQNBCQwBCyAAQQRqIAIoAgQgAigCCBDPA0H0rdgAIAAoAgggACgCBCICGyEDQQkgACgCDCACGwshAiADIAIgARCgCyAAQRBqJAALagECfwJAAkACQAJAIABBBWtB/wFxIgJBAWpBACACQSJJGyICQQlrDgMBAwEACyACDQIgAEH/AXEOBQECAgIAAgtBASEBDAELIABBgP4DcUEIdiIAQR1LDQBBgYCQgAIgAHYhAQsgAUEBcQtwACAAEKcjAkAgACgCKEUNACAAKAIsBEAgAEEsahC4FAsgACgCMEUNACAAQTBqELkUCyAAQTxqEKYgIAAoAoQCEOwTIAAoAogCEOwTIAAoAowCEL0XIAAoApACENMYIABByAJqEO4kIABB8AJqEO4kC3EBAn8gACgCACEDIABBADYCAEEwQQgQuCIiAkKBgICAEDcDACACIAM2AiggAiABKQMANwMIIAJBEGogAUEIaikDADcDACACQRhqIAFBEGopAwA3AwAgAkEgaiABQRhqKQMANwMAIAAQ9CYgACACNgIAC3IBAX8jAEEQayICJAAgAiAAQThqNgIMIAFBhanZAEERQauW2gBBBCAAQfgEQZPQ4ABBBCAAQTBqQfoAQZap2QBBBSAAQTxqQfkEQZup2QBBDCAA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fyABIAAoAggiAigCACAAKAIQIgQgACgCDCIDaiIFa0sEQCACIAUgAUEIQTAQrRcLIAIoAgQiAiABIANqIgFBMGxqIAIgA0EwbGogBEEwbBC4LRogACABNgIMC28BAX8jAEEgayIAJABBrIHkACgCAEECRwRAIABBpIHkADYCCCAAQaSB5AA2AgwgACAAQR9qNgIYIAAgAEEMajYCFCAAIABBCGo2AhBBrIHkACAAQRBqQYTD3wAQ6gQLQaiB5AAoAgAaIABBIGokAAtrAQJ/IAEoAgAhAiABQQA2AgACQCABLQA8DQAgASgCBCEDIAEoAiggASgCECABKAIUEMwIIAEoAjgEQCABQQA2AjQgASABKAIwQQFqNgIwCyABQQE6ADwgAkUNACABIAMQlAQLIABBBDoAAAtkAQJ/IwBBEGsiAiQAAn8gASgCACIDBEAgAkEIaiADIAEoAgQQyxYgAigCCCEDIAIoAgwMAQsgAiABKAIEEPgJIAIoAgAhAyACKAIECyEBIAAgAzYCACAAIAE2AgQgAkEQaiQAC2wAAkACQAJAAkACQAJAAkAgACgCAEEBaw4GAQIDBAYFAAsgAEEIaiABKAIUEJ4tDwsgAEEEaiABEIwXDwsgAEEEaiABEKMtDwsgAEEEaiABEK0EDwsgAEEEaiABEKMmDwsgAEEEaiABEKAtCwtWAQF+AkAgA0HAAHFFBEAgA0UNASACQQAgA2tBP3GthiABIANBP3GtIgSIhCEBIAIgBIghAgwBCyACIANBP3GtiCEBQgAhAgsgACABNwMAIAAgAjcDCAthAQN/AkAgASgCBCICBH8gASgCACIDKAIsIgQgAk0NASABIAMoAiggAkEDdGoiASgCBDYCBCABKAIAIQJBAQVBAAshASAAIAI2AgQgACABNgIADwsgAiAEQeyMxAAQmxAAC2cBAX8jAEEQayICJAAgAiAANgIMIAIgATYCCCAAQSBqEMgiIABBADYCICACQQhqEJMEIABBMGogASgC+AQoAsgCIgEQphAgAEHMAGogARCmECAAQQA2ArABIABBADYCbCACQRBqJAALYwECfwJAIAEoAhQiAkUEQCABKAIIIQNBACECDAELIAEoAggiAyABKAIQIAJBA3RqQQRrKAIAIgJPDQAgAiADQdyTxAAQnBAACyAAIAMgAms2AgQgACABKAIEIAJBA3RqNgIAC2IBAn8jAEEQayIDJAAgA0EEaiACQQFBARCfCyADKAIIIQQgAygCBEEBRgRAIAQgAygCDBC+KQALIAMoAgwgASACEPYGIQEgACACNgIIIAAgATYCBCAAIAQ2AgAgA0EQaiQAC2EBAX8jAEEgayIBJAAgAUEQahD2HCABQQE2AgwgACABQQxqEOUHNgIYIABBAjYCACAAQRRqIAFBHGooAgA2AgAgAEEMaiABQRRqKQIANwIAIAAgASkCDDcCBCABQSBqJAALYgEBfyMAQRBrIgQkAAJAIAAgASACEN8QIgINACAEQQhqIgEgACgCACIAKAIAEO0pIAEQzhgiAg0AIAMgACgCABC5HyICDQAgBEEEOgAIIARBCGoQzhghAgsgBEEQaiQAIAILYgEBfyMAQRBrIgQkAAJAIAAgASACEN8QIgINACAEQQhqIgEgACgCACIAKAIAEO0pIAEQzhgiAg0AIAMgACgCABCgByICDQAgBEEEOgAIIARBCGoQzhghAgsgBEEQaiQAIAILbQEDfyABKAIoIgIgASgCLCIESwRAQZTA2ABBHkGQwdgAENoXAAsgASgCNCIBKAIQIQMgASgCDCEBIAAgBDYCGCAAIAI2AhQgACADNgIMIAAgATYCCCAAIAE2AgAgACACNgIQIAAgASADajYCBAthAQN/QeCG5AAoAgAiAQRAIAFBIGoiAxDSHyABKAIsIgIgASgCJEYEQCABQSRqEOUWCyABKAIoIAJBAnRqIAA2AgAgASACQQFqNgIsIAMQvh4gAg8LQazQ4ABByAAQ3ioAC2QCBH8BfiMAQeAAayICJAACQCAAKAIAIgFFBEBBACEADAELENkiIQAgASkCBCEFENUiIAJBCGoiBCABKAIAEKcBIARB2AAQ9gYhASAAIAU3AgQgACABNgIACyACQeAAaiQAIAALYwECfyAAKAIEIQEgACgCACECIABChICAgMAANwIAAkAgASACRg0AIAEgAmtBBHYhAQNAIAFFDQEgAigCAEECRwRAIAJBDGoQxQMLIAFBAWshASACQRBqIQIMAAsACyAAELASC2ABAn8jAEEQayICJAACfyABKAIAQQdGBEAgAiABQQRqEO4PIAIoAgAhAyACKAIEDAELIAJBCGogARCMDCACKAIIIQMgAigCDAshASAAIAM2AgAgACAB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AEEkajYCDCABQdPO2ABBDUGM1N8AQQUgAEE8akGdAkGR1N8AQQcgAEGeAkGT0OAAQQQgAEEMakGfAkHgztgAQQsgAkEMakGgAhCxCiACQRBqJAALVwACfyAAQYABTwRAIABBA3ZBP3FBgOrYACAAQQl2Qdjv4ABqIABB/8cMSxstAABBBXRqQYCB4QBqLQAAIABBB3F2QQFxDAELIABBgOnYAGotAAALQQFxC1cAAn8gAEGAAU8EQCAAQQN2QT9xQYDq2AAgAEEJdkHw8uAAaiAAQf+DOEsbLQAAQQV0akGAgeEAai0AACAAQQdxdkEBcQwBCyAAQYDe2ABqLQAAC0EBcQtiAQF/IwBBQGoiAyQAIANBGGogAUEQaikDADcDACADQRBqIAFBCGopAwA3AwAgAyACNgIgIANBDzYCACADIAEpAwA3AwggAxC9KCEBIABBuwE6AAAgACABNgIEIANBQGskAAtyAgN/An4gASABKALkAiICNgKcAyABIAEoAuACIgM2ApgDIAEoAsgCIAFBJTYCyAJBIEcEQEG54+AAQShB0PbfABDaFwALIAEpA9gCIQUgASkD0AIhBiAAIAI2AhQgACADNgIQIAAgBTcDCCAAIAY3AwALWgEBfyMAQUBqIgEkACABQRRqIABBEGopAgA3AgAgAUEMaiAAQQhqKQIANwIAIAFBGDYCACABQRxqIABBGGopAgA3AgAgASAAKQIANwIEIAEQvSggAUFAayQAC1oBAX8jAEFAaiIBJAAgAUEgaiAAQRhqKQMANwMAIAFBGGogAEEQaikDADcDACABQRBqIABBCGopAwA3AwAgAUEbNgIAIAEgACkDADcDCCABEL0oIAFBQGskAAtiAQF/IwBBQGoiAyQAIANBGGogAUEQaikDADcDACADQRBqIAFBCGopAwA3AwAgAyACNgIgIANBHzYCACADIAEpAwA3AwggAxC9KCEBIABBuwE6AAAgACABNgIEIANBQGskAAtkAQF/An8gASgCAEGBgICAeEcEQEEYQQQQjCAiAkEQaiABQRBqKQIANwIAIAJBCGogAUEIaikCADcCACACIAEpAgA3AgBBAAwBCyABKAIEIQJBAQshASAAIAI2AgQgACABNgIAC2cBAX8jAEEQayICJAAgAiAAKAIAIgBBFGo2AgwgAUG5jtoAQQhBk9DgAEEEIABBDGpB+gBBwY7aAEEFIABBwgJB843aAEEIIABBGGpBD0GgjtoAQQggAkEMakHBAhCxCiACQRBqJAALaAEBfyMAQRBrIgIkACACIAAoAgAiAEEUajYCDCABQYyO2gBBB0GT0OAAQQQgAEEEakH6AEGTjtoAQQogAEEMakH6AEGdjtoAQQMgAEHDAkGgjtoAQQggAkEMakHBAhCxCiACQRBqJAALZwEBfyMAQRBrIgIkACACIAAoAgAiAEEUajYCDCABQY2P2gBBCUGT0OAAQQQgAEEMakH6AEGWj9oAQQUgAEHEAkHzjdoAQQggAEEYakEPQaCO2gBBCCACQQxqQcECELEKIAJBEGokAAtnAQF/IwBBEGsiAiQAIAIgACgCACIANgIMIAFB6f/YAEEKQZPQ4ABBBCAAQQhqQfoAQfP/2ABBBCAAQRhqQQ9B9//YAEEGIABBEGpBhgNBuKHZAEEDIAJBDGpBhwMQsQogAkEQaiQAC2gBAX8jAEEQayICJAAgAiAAKAIAIgBBNGo2AgwgAUHMl9oAQQ1Bk9DgAEEEIABBKGpB+gBBq5baAEEEIABBtQJB847aAEEEIABBMGpBmQNBpJHaAEEIIAJBDGpBjwEQsQogAkEQaiQAC1sBAX8jAEEQayICJAACfyAAKQMAUARAIAIgAEEIajYCCCABQcCm4ABBBSACQQhqQdsDEMQKDAELIAIgADYCDCABQami2QBBESACQQxqQd8CEMQKCyACQRBqJAALaAEBfyMAQRBrIgIkACACIAAoAgAiAEE4ajYCDCABQfCo2QBBDEGT0OAAQQQgAEH6AEGdjtoAQQMgAEEIakHeA0Gg79gAQQkgAEEgakHfA0GnqdkAQQkgAkEMakGdAxCxCiACQRBqJAALXwECfyMAQRBrIgIkACAAQQhqIQMCfyAAKAIARQRAIAIgAzYCCCABQcCm4ABBBSACQQhqQdQCEMQKDAELIAIgAzYCDCABQZuP2gBBAyACQQxqQesDEMQKCyACQRBqJAALaAEBfyMAQRBrIgIkACACIAAoAgAiAEEYajYCDCABQcrw2ABBGEGT0OAAQQQgAEEMakH6AEHwlNoAQQYgAEH1A0GgjtoAQQggAEEUakH2A0GrpNkAQQsgAkEMakH3AxCxCiACQRBqJAALZwEBfyMAQRBrIgIkACACIAAoAgAiAEEMajYCDCABQfXw2ABBEUGT0OAAQQQgAEEEakH6AEHgkNoAQQMgAEG3AkGa8tgAQQggAEEQakEPQaCO2gBBCCACQQxqQcECELEKIAJBEGokAAtoAQF/IwBBEGsiAiQAIAIgACgCACIAQRhqNgIMIAFBt/DYAEETQZPQ4ABBBCAAQQxqQfoAQfCU2gBBBiAAQfUDQaCO2gBBCCAAQRRqQfYDQauk2QBBCyACQQxqQfcDELEKIAJBEGokAAtoAQF/IwBBEGsiAiQAIAIgACgCACIAQRxqNgIMIAFBzKLZAEELQZPQ4ABBBCAAQQxqQfoAQcel2QBBByAAQRRqQYMEQZzU3wBBCCAAQYEEQc6l2QBBByACQQxqQYQEELEKIAJBEGokAAtnAQF/IwBBEGsiAiQAIAIgACgCACIANgIMIAFBhvHYAEERQZPQ4ABBBCAAQShqQfoAQeCQ2gBBAyAAQTBqQbcCQZry2ABBCCAAQTRqQQ9B8pLaAEEFIAJBDGpBwwMQsQogAkEQaiQAC18BAX8jAEEQayICJAACfyAAKAIAIgAtACVBAkYEQCACIAA2AgggAUHTqtkAQQ0gAkEIakGIBBDECgwBCyACIAA2AgwgAUHgqtkAQQ8gAkEMakGJBBDECgsgAkEQaiQAC2cBAX8jAEEQayICJAAgAiAAKAIAIgBBIGo2AgwgAUHhqNkAQQ9Bk9DgAEEEIABBGGpB+gBB4q7gAEEHIABBJGpBD0HW8dgAQQogAEGLBEGgjtoAQQggAkEMakHBAhCxCiACQRBqJAALXwEBfyMAQRBrIgIkAAJ/IAAoAgAiAC0AFEECRwRAIAIgADYCCCABQcCm4ABBBSACQQhqQboCEMQKDAELIAIgADYCDCABQdSm4ABBBiACQQxqQb4CEMQKCyACQRBqJAALZwEBfyMAQRBrIgIkACACIAAoAgAiAEEEajYCDCABQbmo2QBBE0GT0OAAQQQgAEEIakH6AEHXreAAQQggAEEQakEPQdT02ABBCCAAQY8EQdz02ABBCiACQQxqQZYDELEKIAJBEGokAAtoAQF/IwBBEGsiAiQAIAIgACgCACIAQSBqNgIMIAFB/OrYAEEKQZPQ4ABBBCAAQThqQfoAQeCQ2gBBAyAAQfIDQaCO2gBBCCAAQUBrQfYDQfeO2gBBBCACQQxqQaUEELEKIAJBEGokAAtoAQF/IwBBEGsiAiQAIAIgACgCACIAQQxqNgIMIAFB+OvYAEEIQZPQ4ABBBCAAQRBqQfoAQfCU2gBBBiAAQfUDQauk2QBBCyAAQRhqQagEQaCO2gBBCCACQQxqQfgDELEKIAJBEGokAAtnAQF/IwBBEGsiAiQAIAIgACgCACIAQQhqNgIMIAFB/f/YAEEKQZPQ4ABBBCAAQfoAQdL92ABBAiAAQQxqQbYEQYeA2QBBBiAAQQ1qQQ9BnY7aAEEDIAJBDGpBuQIQsQogAkEQaiQAC2gBAX8jAEEQayICJAAgAiAAKAIAIgBBOGo2AgwgAUHV/9gAQQpBk9DgAEEEIABBMGpB+gBB0v3YAEECIABBPGpBxwRBhI/aAEEEIABByARBiI/aAEEFIAJBDGpBuQIQsQogAkEQaiQAC10BAX8jAEEQayICJAACfyAAKAIAQQtHBEAgAiAANgIIIAFBmoDZAEEGIAJBCGpByQQQxAoMAQsgAiAAQQRqNgIMIAFB1o7aAEEDIAJBDGpBygQQxAoLIAJBEGokAAtoAQF/IwBBEGsiAiQAIAIgACgCACIAQQhqNgIMIAFBg/7YAEEIQZPQ4ABBBCAAQQxqQfoAQa6O2gBBBCAAQbcCQbKO2gBBBCAAQQRqQbcCQbaO2gBBAyACQQxqQbkCELEKIAJBEGokAAtoAQF/IwBBEGsiAiQAIAIgACgCACIAQQRqNgIMIAFBy/3YAEEHQZPQ4ABBBCAAQQhqQfoAQdL92ABBAiAAQRBqQc0EQYSP2gBBBCAAQbcCQYiP2gBBBSACQQxqQbkCELEKIAJBEGokAAtnAQF/IwBBEGsiAiQAIAIgACgCACIAQQxqNgIMIAFB5IvZAEEJQZPQ4ABBBCAAQQRqQfoAQe2L2QBBAyAAQdwEQfCL2QBBCSAAQRBqQQ9Bp7DgAEEEIAJBDGpB2gQQsQogAkEQaiQAC2kBAX8jAEEQayICJAAgAiAAKAIAIgBByABqNgIMIAFBm47ZAEEUQZPQ4ABBBCAAQUBrQfoAQa+O2QBBBCAAQYkDQbOO2QBBCCAAQSBqQekEQair2QBBDCACQQxqQY8BELEKIAJBEGokAAtoAQF/IwBBEGsiAiQAIAIgACgCACIAQUBrNgIMIAFBu47ZAEEUQZPQ4ABBBCAAQThqQfoAQc+O2QBBBSAAQSBqQcACQdSO2QBBCCAAQekEQair2QBBDCACQQxqQY8BELEKIAJBEGokAAtoAQF/IwBBEGsiAiQAIAIgACgCACIAQRBqNgIMIAFBqI7aAEEGQZPQ4ABBBCAAQQhqQfoAQa6O2gBBBCAAQbcCQbKO2gBBBCAAQQRqQfECQbaO2gBBAyACQQxqQYYFELEKIAJBEGokAAtoAQF/IwBBEGsiAiQAIAIgACgCACIAQQxqNgIMIAFB9I/aAEEJQZPQ4ABBBCAAQRBqQfoAQYSP2gBBBCAAQYIFQYiP2gBBBSAAQQhqQbcCQfeO2gBBBCACQQxqQYMFELEKIAJBEGokAAtdAQF/IwBBEGsiAiQAAn8gACgCAEEFRgRAIAIgAEEIajYCCCABQbuM2gBBByACQQhqQekCEMQKDAELIAIgADYCDCABQcKM2gBBBiACQQxqQYsFEMQKCyACQRBqJAALXwEEfyAAKAIIIQIgACgCACEBIAAoAgQhAwNAAkAgASADRgRAQQAhAQwBCyAAIAFBMGoiBDYCACABKAIAQRFHDQAgASgCCEEBa0EBSw0AIAEgAhDCAyAEIQEMAQsLIAELagIDfwJ+IAEgASgCRCICNgJ8IAEgASgCQCIDNgJ4IAEoAiggAUElNgIoQSBHBEBBuePgAEEoQdD23wAQ2hcACyABKQM4IQUgASkDMCEGIAAgAjYCFCAAIAM2AhAgACAFNwMIIAAgBjcDAAtWAQN/IAAoAgQhBCAAKAIAIQUCQCABQgODQgBSDQAgAadBCGsiAyADKAIAIgNBAWo2AgAgA0EATg0AAAsgAEEYQQggAiAERhtBCCAFG2ogASACEL0IGgtdAQN/IwBBEGsiAiQAIAJBBGogAUEBQQFBARCQCiACKAIIIQMgAigCBEEBRgRAIAMgAigCDBC+KQALIAIoAgwhBCAAIAE2AgggACAENgIEIAAgAzYCACACQRBqJAALWQEBfwJ/IAIoAgQEQAJAIAIoAggiA0UEQAwBCyACKAIAIANBASABEPQCDAILC0HAjeQALQAAGiABEGALIQIgACABNgIIIAAgAkEBIAIbNgIEIAAgAkU2AgALWgECfyAAKAIAIgAgAC0ACCIDQQEgAxs6AAggAEEIaiEEIAMEQCAEEMwDCyAAQQxqIAEgAhDMCCAAQQAgAC0ACCIAIABBAUYiABs6AAggAEUEQCAEEOUMC0EAC10BAX8jAEEwayICJAAgAiABNgIMIAIgADYCCCACQQI2AhQgAkHUx8AANgIQIAJCATcCHCACQQI2AiwgAiACQShqNgIYIAIgAkEIajYCKCACQRBqEIkZIAJBMGokAAtdAQN/IwBBEGsiAiQAIAJBBGogAUEBQQRBBBCQCiACKAIIIQMgAigCBEEBRgRAIAMgAigCDBC+KQALIAIoAgwhBCAAIAE2AgggACAENgIEIAAgAzYCACACQRBqJAALXQECfyMAQRBrIgIkACACQQRqIAFBAEEEQQgQkAogAigCCCEBIAIoAgRBAUYEQCABIAIoAgwQvikACyACKAIMIQMgAEEANgIIIAAgAzYCBCAAIAE2AgAgAkEQaiQAC1sBAn8jAEEgayIEJAAgBEEANgIYIARBADoAHCAEQQA2AgwgBCAAQdgCajYCFANAIARBDGoQqggiBUH/AXFBAkYEQCAEQSBqJAAFIAAgASACIAUgAxDRCAwBCwsLXgEBfwJAIAAoAgBBgICAgHhGDQAgACgCCEEEdCECIAAoAgRBCGohAANAIAJFDQEgASAAKAIASQRAIAAgATYCACAAQQRqQQA6AAALIAJBEGshAiAAQRBqIQAMAAsACwujAQEBfyMAQRBrIgEkAAJAAkBB5IbkACgCAEH/////B3EEQEG0huQAKAIADQELIAAoAgQtAExBB0cNAQsgAUEQaiQADwsgAUEEaiIBIAAoAgBBAEHzx9gAQSEQgAogARDGASMAQSBrIgAkACAAQQE2AgQgAEGo7uAANgIAIABCATcCDCAAQtTvwICwATcDGCAAIABBGGo2AgggAEGEydgAEKEdAAteAgF/AX4gACgCCCEBIAAoAgQhAANAIAEEQCAAQQhqKQMAIQICQCAAKAIARQRAIAIQ1hoMAQsgAiAAQRhqKQMAEO8qCyAAQShqENEmIAFBAWshASAAQTBqIQAMAQsLC2IAAkACQAJAAkACQAJAAkAgACgCAA4GAQIDBAUGAAsgAEEEahC/KA8LIABBCGoQ7SYPCyAAQQRqEMcoDwsgAEEEahDJKA8LIABBBGoQyCgPCyAAQQRqEPckIABBCGoQvygLC1gBAn8gAEEANgIIIABBCDYCACAAKAIMIAAoAgQhAUEAQQgQ9SkgAEEINgIMIABBCDYCBCABa0EGdiEAA0AgAARAIABBAWshACABENMoIAFBQGshAQwBCwsLYgACQAJAAkACQAJAAkACQCAAKAIADgYBAgMEBQYACyAAQQRqEM8oDwsgAEEIahD6Jg8LIABBBGoQyCEPCyAAQQRqENAoDwsgAEEEahDJIQ8LIABBBGoQ/yQgAEEIahDPKAsLXQEEfyAAKAIAIQECQCAAKAIIIgJFBEAgACgCDCEADAELIAEoAgQiBCAAKAIEIgMgAmtB2ABsaiAEIANB2ABsaiAAKAIMIgAgA2tB2ABsELgtGgsgASAAIAJrNgIIC2UAAkACQAJAAkACQAJAAkAgACgCAEEBaw4GAQIDBAUGAAsgAEEIahCgJw8LIABBBGoQwxQPCyAAQQRqEPcfDwsgAEEEahDgDA8LIABBBGoQ0SMPCyAAQgA3AgQPCyAAQQRqEMYtC1cBA38gAEEMaiAAKAIIQQZ0IQIgACgCBCEDA0AgAgRAIAEgAxDDHSACQUBqIQIgA0FAayEDDAELCyABEIQaIAAoAhhBgICAgHhHBEAgAEEYaiABEPcZCwtXAQN/IABBDGogACgCCEEGdCECIAAoAgQhAwNAIAIEQCADIAEQqSUgAkFAaiECIANBQGshAwwBCwsgARCJGiAAKAIYQYCAgIB4RwRAIABBGGogARD5GQsLVwEDfyAAQQxqIAAoAghBBnQhAiAAKAIEIQMDQCACBEAgAyABEK8lIAJBQGohAiADQUBrIQMMAQsLIAEQhhogACgCGEGAgICAeEcEQCAAQRhqIAEQgBoLC1cBA38gAEEMaiAAKAIIQQZ0IQIgACgCBCEDA0AgAgRAIAMgARCsJSACQUBqIQIgA0FAayEDDAELCyABEIoaIAAoAhhBgICAgHhHBEAgAEEYaiABEPwZCwtcAQJ/IAAoAgAiAUIANwMQIAFCADcDACABQSBqELklIAEoAkBBBHQhACABKAI8IQIDQCAABEAgAEEQayEAIAIQ1CMgAkEQaiECDAELCyABQgA3AzAgAUEkahDMBwtYAQJ/IABBADYCCCAAQQQ2AgAgACgCDCAAKAIEIQFBAEEEELspIABBBDYCDCAAQQQ2AgQgAWtBAnYhAANAIAAEQCAAQQFrIQAgARCOAiABQQRqIQEMAQsLC2IAAkACQAJAAkACQAJAAkAgACgCAA4GAQIDBAUGAAsgAEEEahDtKA8LIABBCGoQuycPCyAAQQRqEPIhDwsgAEEEahC+JSAAQRhqELwnDwsgAEEEahDzIQ8LIABBBGoQ7igLC28BA38jAEFAaiICJAACQAJAAkACQCABKAIAIgNBAWsOAwECAwALIAAgASkDCBDaGjcDCAwCCyAAIAErAwg5AwgMAQsQ0SIhBCACIAEoAgQQVCAAIAQgAkHAABD2BjYCBAsgACADNgIAIAJBQGskAAtiAAJAAkACQAJAAkACQAJAIAAoAgAOBgECAwQFBgALIABBBGoQ9SgPCyAAQQhqEM8nDwsgAEEEahCGIg8LIABBBGoQ+ygPCyAAQQRqEIciDwsgAEEEahDRJSAAQQhqEPUoCwtXAQN/IABBDGogACgCCEEGdCECIAAoAgQhAwNAIAIEQCADIAEQ8yUgAkFAaiECIANBQGshAwwBCwsgARCfGiAAKAIYQYCAgIB4RwRAIABBGGogARCYGgsLVwEDfyAAQQxqIAAoAghBBnQhAiAAKAIEIQMDQCACBEAgAyABEPQlIAJBQGohAiADQUBrIQMMAQsLIAEQoBogACgCGEGAgICAeEcEQCAAQRhqIAEQmRoLC1cBA38gAEEMaiAAKAIIQQZ0IQIgACgCBCEDA0AgAgRAIAMgARDyJSACQUBqIQIgA0FAayEDDAELCyABEJ4aIAAoAhhBgICAgHhHBEAgASAAQRhqEOIGCwtXAQN/IABBDGogACgCCEEGdCECIAAoAgQhAwNAIAIEQCADIAEQ8SUgAkFAaiECIANBQGshAwwBCwsgARCdGiAAKAIYQYCAgIB4RwRAIABBGGogARCcGgsLXQEEfyAAKAIAIQECQCAAKAIIIgJFBEAgACgCDCEADAELIAEoAgQiBCAAKAIEIgMgAmtByABsaiAEIANByABsaiAAKAIMIgAgA2tByABsELgtGgsgASAAIAJrNgIIC10BBH8gACgCACEBAkAgACgCCCICRQRAIAAoAgwhAAwBCyABKAIEIgQgACgCBCIDIAJrQdAAbGogBCADQdAAbGogACgCDCIAIANrQdAAbBC4LRoLIAEgACACazYCCAtaAQR/IAAoAgAhAQJAIAAoAggiAkUEQCAAKAIMIQAMAQsgASgCBCIEIAAoAgQiAyACa0E4bGogBCADQThsaiAAKAIMIgAgA2tBOGwQuC0aCyABIAAgAms2AggLZQACQAJAAkACQAJAAkAgACgCAEEBaw4GAAECAwUEBQsgAEEEaiABEIoXDwsgAEEEaiABEPEtDwsgAEEEaiABELsODwsgAEEEaiABEI4tIABBCGogARCCLQ8LIABBBGogARCCLQsLYgACQAJAAkACQAJAAkACQCAAKAIADgYBAgMEBQYACyAAQQRqEJgpDwsgAEEIahD3Jw8LIABBBGoQnSkPCyAAQQRqEJ8pDwsgAEEEahCeKQ8LIABBBGoQjSYgAEEIahCYKQsLWgECfyMAQRBrIgIkACAAAn8gASgCAEEFRwRAIAEoAiwhAyABKAIoDAELIAJBCGogASgCBCABKAIIEMsWIAIoAgwhAyACKAIICzYCACAAIAM2AgQgAkEQaiQAC2IBAn8jAEEQayIEJAAgBEEANgIMIAQgASAEQQxqENkJIAQoAgQhBSAAIAM2AhAgAEEANgIMIAAgAzYCCCAAIAI2AgQgACAFOgAYIAAgATYCACAAIAQoAgw2AhQgBEEQaiQAC2IAAkACQAJAAkACQAJAAkAgACgCAA4GAQIDBAUGAAsgAEEEahDfAg8LIABBCGoQiSgPCyAAQQRqELIiDwsgAEEEahC3KQ8LIABBBGoQsyIPCyAAQQRqEK4mIABBCGoQ3wILC10BAn8jAEEQayICJAAgAkEEaiABQQBBBEEEEJAKIAIoAgghASACKAIEQQFGBEAgASACKAIMEL4pAAsgAigCDCEDIABBADYCCCAAIAM2AgQgACABNgIAIAJBEGokAAtiAQJ/IwBBEGsiAiQAIAJBCGogARACAkAgAigCCCIBRQRAQYCAgIB4IQEMAQsgAiABIAIoAgwQ3hcgAigCACEDIAAgAigCBCIBNgIIIAAgAzYCBAsgACABNgIAIAJBEGokAAtiAQF/IwBBEGsiAiQAIAIgAEGCAmo2AgwgAUHFlsAAQQ5BuZbAAEEHIABBGkGolsAAQQUgAEGAAmpBGEHAlsAAQQUgAEGBAmpBGEHTlsAAQQUgAkEMakESELEKIAJBEGokAAumAQICfwJ+IwBBEGsiAiQAQgEhBAJAIAFB/wBxIgNBwABxRQRAIANFDQFCACADQT9xrSIEhkIBQQAgA2tBP3GtiIQhBUIBIASGIQQMAQtCASADQT9xrYYhBUIAIQQLIAIgBDcDACACIAU3AwggACABQYABcUEDdmoiACAAKQMAIAIpAwCENwMAIABBCGoiACAAKQMAIAJBCGopAwCENwMAIAJBEGokAAtfAQF/IwBBEGsiAiQAIAIgAEEUajYCDCABQfCNxABBCUHEjcQAQQggAEEMakEeQbCPxABBByAAQTFBt4/EAEEIIABBEGpBEEG/j8QAQQkgAkEMakEhELEKIAJBEGokAAtbAQF/IwBBMGsiAyQAIAMgATYCDCADIAA2AgggA0EBNgIUIANBqO7gADYCECADQgE3AhwgAyADQQhqrUKAgICAsAGENwMoIAMgA0EoajYCGCADQRBqIAIQoR0AC1YBAX8jAEEgayICJAAgAkEAOgAYIAIgATYCFCACIAA2AhAgAkEBNgIMIAIgAkEMajYCHCACQRxqQdyAwAAQByACKAIMBEAgAkEQahC0IgsgAkEgaiQAC5ABACAAQcgAakH4ABDfFCAAQdQAakEhEN8UIABB4ABqQT4Q3xQgAEL8gICA4As3AkAgAEL8gICAwA83AjggAELbgICA0As3AjAgAEKngICA4As3AiggAEKugICAgAw3AiAgAEKsgICA4A43AhggAELegICA4Ac3AhAgAEKrgICAoAc3AgggAEKtgICAwA83AgALZgECfyMAQSBrIgEkAAJAAkACQCAApyICQQNxQQFrDgICAAELIAFBATYCCCABQYT3wQA2AgQgAUIANwIQIAEgAUEcajYCDCABQQRqQYz3wQAQoR0ACyACKQMIIQALIAFBIGokACAAC1YBAX8jAEEgayICJAAgAkEANgIQIAJBCGogASACQRBqENkJIAJBFGogAigCCCACKAIMEKwVIABBCGogAkEcaigCADYCACAAIAIpAhQ3AgAgAkEgaiQAC1YBAX8jAEEgayICJAAgAkEANgIQIAJBCGogASACQRBqENkJIAJBFGogAigCCCACKAIMEPsQIABBCGogAkEcaigCADYCACAAIAIpAhQ3AgAgAkEgaiQAC1MBAn8jAEEQayIFJAACQCACIARJBEAgBUEEaiIGIAMgBBCvFSAAIAYgASACEOsIDAELIAVBBGoiBiABIAIQrxUgACAGIAMgBBDrCAsgBUEQaiQAC18BAX8jAEEQayICJAAgAiAAQSxqNgIMIAFBvI3EAEEIQcSNxABBCCAAQRhqQR5BzI3EAEEJIABBH0HVjcQAQQsgAEEcakEgQeCNxABBCyAC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QAJAAkACQAJAIAAoAgBBAWsOBgECAwQGBQALIABBCGoQ1ScPCyAAQQRqEMsUDwsgAEEEahD/KA8LIABBBGoQ3Q0PCyAAQQRqEIApDwsgAEEEahDhLQsLUAEBfyAAKAIIQThsIQIgACgCBEEwaiEAA0ACQCACBEAgAEEwayABEJsUIAAoAgBFDQEgACABEOYsDAELDwsgAkE4ayECIABBOGohAAwACwALUAEBfyAAKAIIQThsIQIgACgCBEEwaiEAA0ACQCACBEAgAEEwayABEJoUIAAoAgBFDQEgACABEOcsDAELDwsgAkE4ayECIABBOGohAAwACwALUAEBfyAAKAIIQThsIQIgACgCBEEwaiEAA0ACQCACBEAgAEEwayABEJ0UIAAoAgBFDQEgACABEOIsDAELDwsgAkE4ayECIABBOGohAAwACwALUAEBfyAAKAIIQThsIQIgACgCBEEwaiEAA0ACQCACBEAgAEEwayABEJcSIAAoAgBFDQEgACABEIItDAELDwsgAkE4ayECIABBOGohAAwACwALUAEBfyAAKAIIQThsIQIgACgCBEEwaiEAA0ACQCACBEAgAEEwayABEIAJIAAoAgBFDQEgACABEIMtDAELDwsgAkE4ayECIABBOGohAAwACwALVgEBfyMAQRBrIgIkAAJ/IAAoAgBBAkYEQCABKAIUQejm4ABBBCABKAIYKAIMEQMADAELIAIgADYCDCABQezm4ABBBCACQQxqQaAFEMQKCyACQRBqJAALVAIBfwF+IwBBEGsiAyQAIANBCGogAiABQQAQfQJAAkAgAy0ACEEERwRAIAMpAwgiBEL/AYNCBFINAQsgAEEEOgAADAELIAAgBDcCAAsgA0EQaiQAC1UCAX8BfiMAQRBrIgMkACADQQhqIAEgAkEAEOMEAkACQCADLQAIQQRHBEAgAykDCCIEQv8Bg0IEUg0BCyAAQQQ6AAAMAQsgACAENwIACyADQRBqJAALRQEDfyMAQSBrIgMkAAJAA0AgASACRg0BIANBBGogABDYBSADKAIEBEAgAkEBaiECDAELCyABIAJrIQQLIANBIGokACAEC0UBA38jAEEgayIDJAACQANAIAEgAkYNASADQQRqIAAQwwogAygCBARAIAJBAWohAgwBCwsgASACayEECyADQSBqJAAgBAtSAQF/IwBBEGsi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ADYCACAAC0kAQQAhBQJAIAMgBE0NACACIARqLQAAIgIgAS0AAEcEQCABLQABIAJHDQELIAAgBDYCBEEBIQUgACAEQQFqNgIICyAAIAU2AgALWgEBf0E0QQQQjCAiAUEAOgAyIAFBATsBMCABQQA2AiwgASAANgIoIAEgADYCJCABIAA2AiAgASAANgIcIAEgADYCGCABQgE3AhAgAUIBNwIIIAFCATcCACABC1UBAX8jAEEQayIDJAAgA0EIaiABKAIEIAEoAgggASgCDCACbCICIAIgASgCEGpB2PPDABDWFSADKAIMIQEgACADKAIINgIAIAAgATYCBCADQRBqJAALUAECfyMAQRBrIgUkACAFQQhqIAMgASACEIgTIAUoAggiBkUEQCABIAIgAyACIAQQuCYACyAFKAIMIQEgACAGNgIAIAAgATYCBCAFQRBqJAALTAECfyAAIAFBHGxqIQJBACEBA0AgACACRgRAQQIPCyAALQAYIQMgAEEcaiEAAkACQCADQQZrDgIBAAILQQEhAQwBCwsgAUF/c0EBcQtUAQF/IwBBEGsiAiQAAn8gACgCAEUEQCABKAIUQejm4ABBBCABKAIYKAIMEQMADAELIAIgADYCDCABQezm4ABBBCACQQxqQdwBEMQKCyACQRBqJAALUwEBfyMAQSBrIgIkACACQQE2AgQgAkHAj9kANgIAIAJCATcCDCACQQk2AhwgAiAANgIYIAIgAkEYajYCCCABKAIUIAEoAhggAhCMBCACQSBqJAALZQACQAJAAkACQAJAAkAgACgCAA4GAQICAwQFAAsgACkDCCAAKQMQEO4qDwsgACkDCCAAKQMYEO8qCw8LIAApAxgQ1iYPCyAAKQMQIAAoAhgQoiAPCyAAKQMIENYaIAApAxAQ1hoLUQEBfwJAIABBEkcNACABKAIAQRtHDQAgASgCCA0AIAEpAyBQDQAgAUEgaiIAQdTR2ABBDBCxG0UEQCAAQeDR2ABBDBCxG0UNAQtBASECCyACC1EBAX8jAEEQayICJAAgAkEEaiABQQBBAUEBEJAKIAIoAgghASACKAIERQRAIAAgAigCDDYCBCAAIAE2AgAgAkEQaiQADwsgASACKAIMEL4pAAtUAQF/IwBBEGsiAiQAAn8gACgCAEUEQCABKAIUQejm4ABBBCABKAIYKAIMEQMADAEL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AgggACABNgIEIAAgBDYCACADQRBqJAALUgEBf0HAjeQALQAAGkEgEGAiA0UEQAALIAMgATYCBCADIAA2AgAgAyACKQMANwMIIANBEGogAkEIaikDADcDACADQRhqIAJBEGopAwA3AwAgAwtRACAAIAEpAaoCNwEEIABBGWogAUG/AmopAAA3AAAgAEEUaiABQboCaikBADcBACAAQQxqIAFBsgJqKQEANwEAIAFBKGogAhDICCAAIAE2AgALSgEBfyMAQUBqIgEkACABQRhqIABBEGopAwA3AwAgAUEQaiAAQQhqKQMANwMAIAFBGjYCACABIAApAwA3AwggARC9KCABQUBrJAALSgEBfyMAQUBqIgEkACABQRRqIABBEGooAgA2AgAgAUEMaiAAQQhqKQIANwIAIAFBGTYCACABIAApAgA3AgQgARC9KCABQUBrJAALSgEBfyMAQUBqIgEkACABQRRqIABBEGooAgA2AgAgAUEMaiAAQQhqKQIANwIAIAFBFjYCACABIAApAgA3AgQgARC9KCABQUBrJAALSgEBfyMAQUBqIgEkACABQRRqIABBEGopAgA3AgAgAUEMaiAAQQhqKQIANwIAIAFBHTYCACABIAApAgA3AgQgARC9KCABQUBrJAALSwEBfyMAQRBrIgQkACAEQQA2AgwgBCADOgAMIAEgAiAEQQxqQQEQ0x8hAyAAIAJBAWs2AgQgACABQQFqQQAgAxs2AgAgBEEQaiQAC1kBAX8gASgCDCECAkACQAJAAkAgASgCBA4CAAECCyACDQFBASEBQQAhAgwCCyACDQAgASgCACIBKAIEIQIgASgCACEBDAELIAAgARCpBg8LIAAgASACEIgWC08BAX8jAEEQayICJAAgAkEEaiABQQFBARCfCyACKAIIIQEgAigCBEUEQCAAIAIoAgw2AgQgACABNgIAIAJBEGokAA8LIAEgAigCDBC+KQALWwACQCACIANBibLgAEEFEM0fRQRAIAIgA0GLruAAQQcQzR8NASACIANBkq7gAEEGEM0fRQRAIABBBjoAAA8LIABBgDw7AQAPCyAAQYICOwEADwsgAEGAPjsBAAtbAAJAIAIgA0GksuAAQQYQzR9FBEAgAiADQdet4ABBCBDNHw0BIAIgA0GAr+AAQQcQzR9FBEAgAEEGOgAADwsgAEGAKjsBAA8LIABBgho7AQAPCyAAQYASOwEAC1QBAX8jAEEQayICJAAgAiAAQRBqNgIMIAFBm4/aAEEDQZPQ4ABBBCAAQQhqQfoAQczF4ABBBSAAQeADQbih2QBBAyACQQxqQeEDEN4KIAJBEGokAAtUAQF/IwBBEGsiAiQAIAIgADYCDCABQc+P2gBBCUGT0OAAQQQgAEEMakH6AEHsjdoAQQQgAEEUakHsA0HYj9oAQQUgAkEMakGfAxDeCiACQRBqJAALWQEBfyABKAIMIQICQAJAAkACQCABKAIEDgIAAQILIAINAUEBIQFBACECDAILIAINACABKAIAIgEoAgQhAiABKAIAIQEMAQsgACABEKkGDwsgACABIAIQohELSQECfyAAKAIIQShsIQMgACgCBCECA0AgAwRAIAIoAgBBB0cEQCACIAEQtRELIAJBKGohAiADQShrIQMMAQsLIABBFGogARDPIwtGAQF/IAAoAgwEQCAAKAIEIgEEQCAAKAIAQf8BIAFBCWoQhQsaCyAAQQA2AgwgACABIAFBAWpBA3ZBB2wgAUEISRs2AggLC1UBAX8CQAJAAkBBASAALQAsQQNrIgEgAUH/AXFBA08bQf8BcUEBaw4CAQIACyAAQgA3AwgPCyAAEI0dDwsgAEIANwMYIABCADcDCCAAQSBqQgA3AwALVwEBf0HAjeQALQAAGkEcEGAiAkUEQAALIAJCADcCCCACQoCAgICAATcCACACQRBqQgA3AgAgAkEYakEAOwEAIAAgAUEoEPYGGiABIAI2AgQgAUECNgIAC1gCAX8BfiMAQRBrIgIkACABKAIAQQFGBEBBsLbfAEEqQdy23wAQoRIACyACIAEpAwggASgCGBCkIyACKQMAIQMgACACKAIINgIIIAAgAzcDACACQRBqJAALSgEBfyMAQUBqIgEkACABQRRqIABBEGooAgA2AgAgAUEMaiAAQQhqKQIANwIAIAFBDjYCACABIAApAgA3AgQgARC9KCABQUBrJAALSgEBfyMAQUBqIgEkACABQRRqIABBEGooAgA2AgAgAUEMaiAAQQhqKQIANwIAIAFBEjYCACABIAApAgA3AgQgARC9KCABQUBrJAALSQECfyAAKAIIQShsIQMgACgCBCECA0AgAwRAIAIoAgBBB0cEQCACIAEQlRELIAJBKGohAiADQShrIQMMAQsLIABBFGogARDkIwtMAQJ/IwBBEGsiASQAIAAoAgQiAgRAIAAQgQwgAUEEakEgQQggAkEBahDmDSAAKAIAIAEoAgxrIAEoAgQgASgCCBCbJAsgAUEQaiQAC4ABAgJ+An9B8IbkACkDAFAEQEEBQQAQuRohAkHwhuQAKQMAQfCG5AAgAjcDABDSGAtB8IbkACkDABDaGiECIABBEGogAUEQaiIEKQMANwMAIABBCGogAUEIaiIFKQMANwMAIAAgASkDADcDACAFQgA3AwAgASACNwMAIARCADcDAAtOAQJ/IAAoAgwgACgCBCIBa0EFdiECA0AgAgRAIAFBEGopAwAQ1iYgASkDABDWGiACQQFrIQIgAUEgaiEBDAELCyAAKAIIIAAoAgAQ2CkLTwEBfyMAQRBrIgMkACADQQRqIAFBBCACEJ8LIAMoAgghASADKAIERQRAIAAgAygCDDYCBCAAIAE2AgAgA0EQaiQADwsgASADKAIMEL4pAAtTAQN/IAEoAgAhAyABKAIEIQQCQANAIAMiAiAERg0BIAEgAkFAayIDNgIAIAItADxBBkYNAAsgACACNgIIIAAgASgCCCkCADcCAA8LIABBADYCAAtSACAAIAEpAYIDNwEEIABBGWogAUGXA2opAAA3AAAgAEEUaiABQZIDaikBADcBACAAQQxqIAFBigNqKQEANwEAIAFBgAFqIAIQwAggACABNgIAC0QBAn8jAEEQayICJAAgACABKAIAQQdHBH8gAkEIaiABEIwMIAIoAgghAyACKAIMBSADCzYCBCAAIAM2AgAgAkEQaiQAC0QBAn8jAEEQayICJAAgACABKAIAQQJHBH8gAkEIaiABEO4PIAIoAgghAyACKAIMBSADCzYCBCAAIAM2AgAgAkEQaiQAC0sBA38jAEEQayICJAAgAkEIaiABKAIAEIsDIAAgAigCDCIDIAEoAgwiBCADIARJGyADIAQgAyAESxsQxhggASAAEJUtIAJBEGokAAtDAQN/AkAgAkUNAANAIAAtAAAiBCABLQAAIgVGBEAgAEEBaiEAIAFBAWohASACQQFrIgINAQwCCwsgBCAFayEDCyADC1IBA39BA0EAEIgGIQBBnILkAEGcguQAKAIAIgEgACABGzYCACABRQRAIAAPCyAAKAIEIgIEQCAAKAIAIAJBBnRBwAAQvRELIABBEEEEEL0RIAELjwEBBH8gACgCACIAQTBqEJMZIABBzABqIgMoAgghASADKAIEIgQhAgNAIAEEQCACKAIAQTRBBBC9ESABQQFrIQEgAkEEaiECDAELCyADKAIAIARBBEEEELYiIAAoAlhBNEEEEL0RAkAgAEF/Rg0AIAAgACgCBCIBQQFrNgIEIAFBAUcNACAAQdwAQQQQvRELC08BAX8jAEGAA2siAiQAAkAgASkDAEICUQRAIAJBAjYC8AIMAQsgAiABEIsJIAJBwAFqIAFBiAVqEIsJCyAAIAJBgAMQ9gYaIAJBgANqJAALSwEBfyMAQRBrIgQkACAEIAEgAiADEKMEQQEhAwJAIAQoAgBBAUYEQCAAIAQpAghCIIk3AgQMAQtBACEDCyAAIAM2AgAgBEEQaiQAC00BAn8jAEEQayIDJAAgA0EIaiACQQgQqBQgAygCCCEEIAMoAgwgASACQQN0EPYGIQEgACACNgIIIAAgATYCBCAAIAQ2AgAgA0EQaiQAC0kBA38CQCABKAIQIgJFDQAgAkEBayICIAEoAgxPDQAgASgCCCACai0AACEEQQEhAwsgACAEOgAJIAAgAzoACCAAIAEpAgA3AgALTQECfyMAQRBrIgMkACADQQhqIAJBBBCoFCADKAIIIQQgAygCDCABIAJBAnQQ9gYhASAAIAI2AgggACABNgIEIAAgBDYCACADQRBqJAALSwECfyMAQRBrIgEkAEHAjeQALQAAGiABQQA6AA9BARBgIgJFBEAACyACQQFBARC9ESAAIAKtNwMIIAAgAUEPaq03AwAgAUEQaiQAC08BAn8gACgCsAFBAXEEQCAAIAAoAnAgACgCtAEiAiAAKAK4ASIDayADIAJrIAIgA0sbajYCcAsgACABNgK4ASAAIAE2ArQBIABBATYCsAELSAACQCADRQ0AAkAgAiADSwRAIAEgA2osAABBv39MDQEMAgsgAiADRg0BCyABIAJBACADIAQQuCYACyAAIAM2AgQgACABNgIAC0cBAn8jAEEQayIEJAAgASADTwRAIARBCGogASADayAAIAFBhMTWABDxHCACIAMgBCgCCCAEKAIMEM0fIQULIARBEGokACAFC1ABAX8jAEEQayIDJAAgAyACNgIMIAMgASgCAEEIakHAwtgAEJ4dIAMoAgQhASAAIAMoAgAgA0EMahD1BSABIAEoAgBBAWo2AgAgA0EQaiQAC1ABAX8jAEEQayIDJAAgAyACNgIMIAMgASgCBEEIakGgw9gAEJ4dIAMoAgQhASAAIAMoAgAgA0EMahD1BSABIAEoAgBBAWo2AgAgA0EQaiQAC1QBAX8CQAJAAkBBASABLQAsQQNrIgIgAkH/AXFBA08bQf8BcUEBaw4CAQIACyAAIAEQtRsgAEEDOgAsDwsgACABEPMIDwsgACABEO0eIABBBToALAtOACAAKAIAIgAQ1yYgAEEMahC1ByAAKAIMIABBEGooAgAQ8ikgAEEwahDRJiAAQTRqELQdIABBOGoQzSYgAEEYahDYJiAAQcAAQQQQvRELTQECfyABKAIIIQICQCABKAIYIgNFBEAgASgCDCEDDAELIAIgAygCCCIBIAEgAkkbIQMgAiABIAEgAksbIQILIAAgAzYCBCAAIAI2AgALSQEBfyABKAIIIgIEQCAAIAEoAgQiAEHAABD2BhogACAAQUBrIAJBBnRBQGoQuC0aIAEgAkEBazYCCA8LQQBBAEGQpOAAEKAQAAs/AQJ/IAAQuxohASAAKAIQIQIgAAJ/QQEgAUGAAUkNABpBAiABQYAQSQ0AGkEDQQQgAUGAgARJGwsgAmo2AhALPwECfyAAENUKIQEgACgCECECIAACf0EBIAFBgAFJDQAaQQIgAUGAEEkNABpBA0EEIAFBgIAESRsLIAJqNgIQC04AIAAoAgAiABDXJiAAQQxqELUHIAAoAgwgAEEQaigCABDyKSAAQTBqEJEnIABBNGoQtB0gAEE4ahCIJSAAQRhqENgmIABBwABBBBC9EQtGAQJ/IAAtADQEQCABKAIIQShsIQIgASgCBCEDA0AgAgRAIAAgAxCgFSACQShrIQIgA0EoaiEDDAELCyABQQxqIAAQzyMLC08AIAAtADQEQAJAAkACQAJAIAEoAgBBAWsOAwECAwALIAAgAUEIahC0GQ8LIAFBBGogABD5FA8LIAAgAUEEahC0JQ8LIAFBBGogABCEDQsLSQECfyMAQRBrIgIkACACQQhqIAEQtBwgACACKAIIIgMgASgCIBCYDyIBIAEgA0kbNgIEIAAgAyABIAEgA0sbNgIAIAJBEGokAAtEAQJ/AkAgASgCGEUNACABEOkOIQIgASABKAIYQQFrNgIYIAJFDQAgAkEIayEBIAJBGGshAwsgACABNgIEIAAgAzYCAAtIAQJ/IAAoAghBBnQhAiAAKAIEIQMDQCACBEAgASADELceIAJBQGohAiADQUBrIQMMAQsLIABBDGogARCtGiAAQRhqIAEQiCQLSAECfyAAKAIIQQZ0IQIgACgCBCEDA0AgAgRAIAMgARCeJiACQUBqIQIgA0FAayEDDAELCyAAQQxqIAEQrxogAEEYaiABEIYkC0gBAn8gACgCCEEGdCECIAAoAgQhAwNAIAIEQCADIAEQnyYgAkFAaiECIANBQGshAwwBCwsgAEEMaiABEK4aIABBGGogARCMJAtKAQN/IAAoAgAiAgRAIAAoAgQiAygCACIBBEAgAiABEQEACyADKAIEIgEEQCACIAEgAygCCBC9EQsgACgCDCAAKAIIKAIMEQEACwtOACABKAIEIAEoAgggAkHwg8AAEJofIQIgACADQQFxBH8gASgCECABKAIUIARBgITAABCbH0EFagUgAgsoAAAiATYCBCAAIAFBAEc2AgALPQEBfyABIAJBAWoiBEsEQCAAIARBAnRqIAAgAkECdGogAkF/cyABakECdBC4LRoLIAAgAkECdGogAzYCAAtQAAJ/AkACQCACRQRAIAEoAtACIgFFDQEMAgsgASgC1AIiAQ0BQQAQtiYhAUEBDAILQQEQtiYhAUEBDAELQQALIQIgACABNgIEIAAgAjYCAAtQAQF/IwBBEGsiAiQAIAJBCGogASABKAIAKAIEEQAAIAIgAigCCCACKAIMKAIYEQAAIAIoAgQhASAAIAIoAgA2AgAgACABNgIEIAJBEGokAAtSAQJ/IwBBEGsiASQAQZjw4wBBmPDjACgCACICQQFqNgIAIAFBwAAQxQogAEEIaiABQQhqKQIANwIAIAAgASkCADcCACAAIAI2AhAgAUEQaiQAC0wBAn8jAEEQayIDJAAgA0EIaiACQQFBARClFCADKAIIIQQgAygCDCABIAIQ9gYhASAAIAI2AgggACABNgIEIAAgBDYCACADQRBqJAALTAECfyMAQRBrIgIkACACQQhqIgMgAUEIaigCADYCACACIAEpAgA3AwAgAhDGCiAAQQhqIAMoAgA2AgAgACACKQMANwIAIAJBEGokAAtDAQJ/IwBBEGsiBCQAIARBBGoiBSABIAIQrxUgBSADEMcHIABBCGogBEEMaigCADYCACAAIAQpAgQ3AgAgBEEQaiQAC0sBAn8jAEEQayIDJAAgA0EIaiACEKYUIAMoAgghBCADKAIMIAEgAkECdBD2BiEBIAAgAjYCCCAAIAE2AgQgACAENgIAIANBEGokAAtKAQN/IAAoAgghAiAAKAIEIgMhAQNAIAIEQCABKAIAIAFBBGooAgAQuCkgAkEBayECIAFBDGohAQwBCwsgACgCACADQQRBDBC2IgtHACAAKAK4AiAAKALIAkEUbCAAKALUAkECdGogACgCvAIiACgCEEEDdGogACgCHEEFdGogACgCKEEMbGogACgCLGpqQYADagtPAQF/IwBBIGsiASQAIAFBDGogAEEAEMEQIAEtAAxBAUYEQCABIAEpAhA3AhhBnNrDAEEqIAFBGGpB/NjDAEHI2sMAEMAOAAsgAUEgaiQAC0gBAX8gASAAKAIMayICQQF0IAJBH3VzIQIDQCACQYABSUUEQCAAIAJBgH9yENMcIAJBB3YhAgwBCwsgACACENMcIAAgATYCDAtUAQF/IwBBEGsiASQAQQIgACgC/AR0IgBBgICAwABPBEAgASAArTcDCEH04eAAQSsgAUEIakHQ3cMAQeziwwAQwA4ACyABQRBqJAAgAEGAgICAAnILUAEBfyAAIAEpAgA3AgAgAUEANgIAIABBEGogAUEQaikCADcCACAAQQhqIAFBCGopAgA3AgAQrBQhAiAAIAEoAhg2AhggASACNgIYIAEQxCYLTAECfyMAQRBrIgMkACADQQhqIAJBAUEBEOcUIAMoAgghBCADKAIMIAEgAhD2BiEBIAAgAjYCCCAAIAE2AgQgACAENgIAIANBEGokAAtlAQF/AkACQAJAAkBBAiAAKAIAQYCAxABrIgEgAUEITxtBBGsOBAIBAwABCyAAQQRqEOobIAAoAgQgACgCCBDkKQsPCyAAQQRqENkVDwsgAEEEaigCACIAEK8dIABB9ABBBBC9EQtLAQF/IwBBEGsiASQAIAEgACgCAEG5893xeWw2AgwgAUEMaiAAKAIIIAAoAgwQiAsgASgCDCABQRBqJABBBXdB/wFzQbnz3fF5bK0LUwEBfyMAQSBrIgIkACACQQE6AA8gAiABKQGqAjcAAyACIAEoAbICNgALIAIgASkAtwI3ABAgAiABKQC/AjcAGCAAIAEgAkEDahDsFCACQSBqJAALRwEEfyAAKAIoIQMDQCABQShGRQRAIAEgA2oiAigCACEEIAIgACABaiICKAIANgIAIAIgBDYCACABQQRqIQEMAQsLIAAQpyMLRwECfyAAKAIEIgFBDGohAiAAKAIMIAFrQQR2IQEDQCABBEAgAUEBayEBIAIQzyggAkEQaiECDAELCyAAKAIIIAAoAgAQySkLSgEBfyABIAM2AhAgASABKAIIIgQgASgCDGo2AgQgASAEIAMgASgCFCIBayIDajYCACAAIAMgAiABayIBazYCBCAAIAEgBGo2AgALUAEEfyABQcABaiIEELsbQRQhAkERIQMCQCABKALAASIFIAEoAsQBRg0AIAUtAABBPUcNACAEELsbQRUhAkEKIQMLIAAgAzoABCAAIAI2AgALQQACQCABQQFxRQRAQQAhAQwBC0F/IAJBAWtndkEAIAJBAk8bIgJBf0chASACQQFqIQILIAAgAjYCBCAAIAE2AgALSQECfyAALQAmIQMgAEEAOgAmIAEoAghBBHQhAiABKAIEIQEDQCACBEAgACABEJEdIAJBEGshAiABQRBqIQEMAQsLIAAgAzoAJgu/sQECD38CfiMAQRBrIg0kACANQQxqIg9BADYCACANQoCAgICAATcCBCANQQRqIQUjAEHwAGsiAyQAAkBBgIzkACgCACIMBEAgA0EIaiAMQQRqEOcaIAMoAgwhDiADKAIIIgstAABFDQFBmPHjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIIDAELQazQ4ABByAAQ3ioACyALLQABBEBBrPHjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQACBEBBwPHjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQADBEBB1PHjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQAEBEBB6PHjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQAFBEBB/PHjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQAGBEBBkPLjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQAHBEBBpPLjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQAIBEBBuPLjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQAJBEBBzPLjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQAKBEBB4PLjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQALBEBB9PLjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQAMBEBBiPPjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQANBEBBnPPjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQAOBEBBsPPjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQAPBEBBxPPjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQAQBEBB2PPjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQARBEBB7PPjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQASBEBBgPTjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQATBEBBlPTjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQAUBEBBqPTjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQAVBEBBvPTjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQAWBEBB0PTjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQAXBEBB5PTjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQAYBEBB+PTjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQAZBEBBjPXjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQAaBEBBoPXjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQAbBEBBtPXjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQAcBEBByPXjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQAdBEBB3PXjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQAeBEBB8PXjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQAfBEBBhPbjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQAgBEBBmPbjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQAhBEBBrPbjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQAiBEBBwPbjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQAjBEBB1PbjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQAkBEBB6PbjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQAlBEBB/PbjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQAmBEBBkPfjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQAnBEBBpPfjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQAoBEBBuPfjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQApBEBBzPfjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQAqBEBB4PfjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQArBEBB9PfjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQAsBEBBiPjjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQAtBEBBnPjjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQAuBEBBsPjjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQAvBEBBxPjjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQAwBEBB2PjjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQAxBEBB7PjjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQAyBEBBgPnjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQAzBEBBlPnjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQA0BEBBqPnjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQA1BEBBvPnjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQA2BEBB0PnjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQA3BEBB5PnjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQA4BEBB+PnjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQA5BEBBjPrjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQA6BEBBoPrjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQA7BEBBtPrjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQA8BEBByPrjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQA9BEBB3PrjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQA+BEBB8PrjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQA/BEBBhPvjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQBABEBBmPvjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQBBBEBBrPvjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQBCBEBBwPvjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQBDBEBB1PvjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQBEBEBB6PvjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQBFBEBB/PvjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQBGBEBBkPzjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQBHBEBBpPzjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQBIBEBBuPzjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQBJBEBBzPzjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQBKBEBB4PzjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQBLBEBB9PzjABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQBMBEBBiP3jABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQBNBEBBnP3jABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQBOBEBBsP3jABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQBPBEBBxP3jABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQBQBEBB2P3jABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQBRBEBB7P3jABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQBSBEBBgP7jABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQBTBEBBlP7jABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQBUBEBBqP7jABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQBVBEBBvP7jABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQBWBEBB0P7jABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQBXBEBB5P7jABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQBYBEBB+P7jABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQBZBEBBjP/jABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQBaBEBBoP/jABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQBbBEBBtP/jABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQBcBEBByP/jABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQBdBEBB3P/jABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQBeBEBB8P/jABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQBfBEBBhIDkABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQBgBEBBmIDkABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQBhBEBBrIDkABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQBiBEBBwIDkABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQBjBEBB1IDkABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQBkBEBB6IDkABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQBlBEBB/IDkABDtECIBKAIEIQYgBSABKAIIIgEQ+B4gBSgCCCECIAUgAQR/IAEgAmogBSgCBCACQTBsaiECIANBGGohCUHYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayIHIAYQbyAMKAIAEIcEIQRBABCnERCHBCEKIAkgEDcDACADIAQ2AiAgAyAKNgIkIAMgETcDECAHIANBEGoiBBDTBCAEEOcKIAQgB0EwEPYGGiACIARBMBD2BkEwaiECIAZBMGohBiABQQFrIgENAAsFIAILNgIICyALLQBmBEBBkIHkABDtECIBKAIEIQIgBSABKAIIIgYQ+B4gBSgCCCEBIAUgBgR/IAEgBmogBSgCBCABQTBsaiEBIANBGGohB0HYluMAKQMAIRBB0JbjACkDACERA0AgA0FAayILIAIQbyAMKAIAEIcEIQVBABCnERCHBCEIIAcgEDcDACADIAU2AiAgAyAINgIkIAMgETcDECALIANBEGoiBRDTBCAFEOcKIAUgC0EwEPYGGiABIAVBMBD2BkEwaiEBIAJBMGohAiAGQQFrIgYNAAsFIAELNgIICyAOIA4oAgBBAWs2AgAgA0HwAGokACAAQQhqIA8oAgA2AgAgACANKQIENwIAIA1BEGokAAtCAQF/IwBBEGsiAyQAIAFQBH5CAAUgAyABIAIQpCMgAygCCCECIAMpAwALIQEgACACNgIIIAAgATcDACADQRBqJAALSwECfyMAQUBqIgEkAEHAjeQALQAAGkHIABBgIgJFBEAACyABIAIgAEHIABD2BjYCICABQQI6ABwgAUEPNgIAIAEQvSggAUFAayQAC0UBAn8gACgCCEEobCECIAAoAgQhAQNAIAIEQCABKAIAQQdHBEAgARDREwsgAUEoaiEBIAJBKGshAgwBCwsgAEEUahDmJQtTAQF/IwBBIGsiAiQAIAJBAToADyAC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QCADIARNDQAgAS0AACACIARqLQAARw0AIAAgBDYCBEEBIQUgACAEQQFqNgIICyAAIAU2AgALQQEBf0EYEM0gIgJBEGogAUEQaikCADcCACACQQhqIAFBCGopAgA3AgAgAiABKQIANwIAIAAgAjYCBCAAQQA2AgALOgACQCACIANNBEBBACEDDAELIAEgA0EDdGoiASgCAEEIaiEDIAEoAgQhAgsgACACNgIEIAAgAzYCAAs8AQF/IwBBEGsiAiQAIAIgACgCACIANgIMIAFB3MfYAEEQIABBDGpB+gAgAkEMakGbARCqCiACQRBqJAALPAEBfyMAQRBrIgIkACACIAAoAgAiAEEMajYCDCABQcjO2ABBByAAQeEBIAJBDGpBpAIQqgogAkEQaiQACzsBAX8gACgCACgCACICKQMAIAAoAgQoAgAgAUEEdGtBEGsiACkDAIUgAkEIaikDACAAQQhqKQMAhYRQC0UBAX9B4IbkACgCACIBRQRAQazQ4ABByAAQ3ioACyABENIfIAFBCGooAgAgAUEMaigCACAAQdjE2AAQnh8oAgAgARC+Hgs9AAJAIAAoAgAiACgCAEEDRwRAIAAQ+hsMAQsgAEEQahCaAyAAQQRqEMwmIABBIGoQzSYLIABBKEEIEL0RCzgBAX8gACgChAEiAUGAAU0EfyAAQQFqBSAAKAIEIQEgACgCCAsgAUUEQEEAQQBB+NjfABCbEAALCywBAX8jAEEQayIBJAAgASAANgIMIAFBATYCCCABQQhqEKYjIAFBEGokAEEACzIBAn8gAkEDdCECA0AgAiIDBEAgAkEIayECIAEgABCvCyABQQhqIQFFDQELCyADQQBHCzoBAX8jAEFAaiIBJAAgAUEMaiAAQQhqKQIANwIAIAFBIDYCACABIAApAgA3AgQgARC9KCABQUBrJAALOgEBfyMAQUBqIgEkACABQQxqIABBCGooAgA2AgAgAUEqNgIAIAEgACkCADcCBCABEL0oIAFBQGskAAs6AQF/IwBBQGoiASQAIAFBDGogAEEIaikCADcCACABQRE2AgAgASAAKQIANwIEIAEQvSggAUFAayQACzoBAX8jAEFAaiIBJAAgAUEMaiAAQQhqKQIANwIAIAFBMDYCACABIAApAgA3AgQgARC9KCABQUBrJAALOgEBfyMAQUBqIgEkACABQQxq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AQN/IAAgASgCFCICIAEoAgwiA0kEfyABKAIIIAJqLQAABSAECzoACSAAIAIgA0k6AAggACABKQIANwIAC3gBA38gACgCCCIEIAAoAgBGBEAjAEEQayIDJAAgA0EIaiAAIAAoAgBBAUEBQQIQnAggAygCCCIFQYGAgIB4RwRAIAUgAygCDBC+KQALIANBEGokAAsgACAEQQFqNgIIIAAoAgQgBEEBdGoiACACOgABIAAgAToAAAs8ACAAIAEgAhCiESAAIAQ6ACQgACADKQIANwIMIABBFGogA0EIaikCADcCACAAQRxqIANBEGopAgA3AgALOAEBfyMAQRBrIgMkACADQQA2AgwgAyACIANBDGoQ2QkgACABIAMoAgAgAygCBBCVFSADQRBqJAALRwACQAJAAkACQCAALQAADgUBAQECAwALIABBBGoQwwQLDwsgACgCBCAAKAIIELgpDwsgAEEEahDyGyAAKAIEIAAoAggQ6CkLPAEBfyAAKAIAKAIAIQAgASgCHCICQRBxRQRAIAJBIHFFBEAgACABEL0pDwsgACABENAMDwsgACABENEMCzUBAn8jAEEQayIBJAAgAC0AAEEERwRAIAEgACkCADcDCCABQQhqEPEbIQILIAFBEGokACACCzcBAn8gAEEIaiECIAFBCGohAyAAAn4gASgCAEUEQCACIAMQtRtCAAwBCyACIAMQ5R1CAQs3AwALPQACQCAAKAIAIgAoAgBBA0cEQCAAEIIcDAELIABBEGoQuSggAEEEahDMJiAAKAIgELooCyAAQShBCBC9EQs7AQF+EMEYIABBADYCGCAAIAEpAwA3AwAgAEEQaiABQRBqKQMANwMAIABBCGogAUEIaikDADcDABDWGgs1AQJ/AkAgAEIDg1BFIABQcg0AIACnQQhrIgEgASgCACICQQFrNgIAIAJBAUcNACABEKMfCws+AQF/IAAgACgCAEEBayIBNgIAAkAgAQ0AIABBCGoQ+gcgACAAKAIEQQFrIgE2AgQgAQ0AIABBHEEEEL0RCws9AAJAIAAoAgAiACgCAEEDRwRAIAAQjRwMAQsgAEEQahDaAiAAQQRqEMwmIAAoAiAQuigLIABBKEEIEL0RCz0AAkAgACgCACIAKAIAQQNHBEAgABCOHAwBCyAAQRBqEM8oIABBBGoQzCYgACgCIBC6KAsgAEEo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AiQAIAIgACgCADYCDCABQd6W2gBBDEGT0OAAQQQgAkEMakGlAhDCCyACQRBqJAALNAEBfyABKAIIQQJ0IQIgASgCBCEBA0AgAgRAIAEgABC9KyACQQRrIQIgAUEEaiEBDAELCws0AQF/IAAoAghBMGwhAiAAKAIEIQADQCACBEAgACABENMEIAJBMGshAiAAQTBqIQAMAQsLCzQBAX8gACgCCEECdCECIAAoAgQhAANAIAIEQCAAIAEQwSsgAkEEayECIABBBGohAAwBCwsLNAEBfyAAKAIIQTBsIQIgACgCBCEAA0AgAgRAIAAgARDRBCACQTBrIQIgAEEwaiEADAELCws0AQF/IAAoAghBAnQhAiAAKAIEIQADQCACBEAgACABEMArIAJBBGshAiAAQQRqIQAMAQsLCzQBAX8gACgCCEECdCECIAAoAgQhAANAIAIEQCAAIAEQwisgAkEEayECIABBBGohAAwBCwsLNAEBfyAAKAIIQTBsIQIgACgCBCEAA0AgAgRAIAAgARD5BCACQTBrIQIgAEEwaiEADAELCws0AQF/IAAoAghBAnQhAiAAKAIEIQADQCACBEAgACABELwrIAJBBGshAiAAQQRqIQAMAQsLCzQBAX8gACgCCEECdCECIAAoAgQhAANAIAIEQCAAIAEQuysgAkEEayECIABBBGohAAwBCwsLNAEBfyAAKAIIQQJ0IQIgACgCBCEAA0AgAgRAIAAgARC/KyACQQRrIQIgAEEEaiEADAELCws0AQF/IAAoAghBMGwhAiAAKAIEIQADQCACBEAgACABEJEFIAJBMGshAiAAQTBqIQAMAQsLCzMBAX8gACgCCEEwbCECIAAoAgQhAANAIAIEQCAAIAEQXyACQTBrIQIgAEEwaiEADAELCwtyAQN/IAAoAggiAyAAKAIARgRAIwBBEGsiAiQAIAJBCGogACAAKAIAQQFBBEEsEJwIIAIoAggiBEGBgICAeEcEQCAEIAIoAgwQvikACyACQRBqJAALIAAoAgQgA0EsbGogAUEsEPYGGiAAIANBAWo2AggLNAEBfyAAKAIIQTBsIQIgACgCBCEAA0AgAgRAIAEgABDKASACQTBrIQIgAEEwaiEADAELCws0AQF/IAAoAghBDGwhAiAAKAIEIQADQCACBEAgACABEL0rIAJBDGshAiAAQQxqIQAM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AAsvAQF/AkAgAEUNACAAKAIAQRJHDQAgACgCBCIAKAIAQRtHDQAgACgCCEUhAQsgAQs+AQF/IABBBGohAgJAAkACQCAAKAIAQQFrDgIBAgALIAIgARDPKw8LIAEgAigCABCDIQ8LIAIoAgAgARC1EQstAQF/IwBBQGoiASQAIAFBCGogAEEoEPYGGiABQRQ2AgAgARC9KCABQUBrJAALNwAgAC0AJUECRgRAIAAQmwYgACgCACAAKAIEEPMpDwsgACkDCBDWGiAAKAIgIgAQvxsgABDRLAsvAQF/AkAgACABEK8LRQ0AIAAoAgggASgCCEcNACAAQRBqIAFBEGoQrwshAgsgAgswACAAKAIAIgAoAgBBA0cEQCAAEPkfDwsgAEEQahDfLSAAQQRqELcZIABBIGoQxSULMAAgACgCACIAKAIAQQNHBEAgABD6Hw8LIABBEGoQ4S0gAEEEahC4GSAAQSBqEPQoCzAAIAEgABCkEiIAQiCIpyAApyABKAIAQQV3c0G5893xeWxBBXdzQbnz3fF5bDYCAAs0AQF/IAEoAhQiASgCAEECRwRAQQQQzSAiAiABQQRqNgIACyAAQdDO3wA2AgQgACACNgIACzgBAX8CQCABKAIAIgIgASgCBEYEQEEAIQIMAQsgASACQQxqNgIACyAAQcjP3wA2AgQgACACNgIACy0BA38gACgCACICIAEoAgAiA3JFIQQgAkUgA0VyBH8gBAUgACABEKEqC0EBcwstAQF/IwBBMGsiASQAIAFBEGogABDRGCABQQA2AgggAUEIahD/KSABQTBqJAALLgEBfyMAQRBrIgIkACACIAA2AgwgAUHUycMAQQwgAkEMakENEMQKIAJBEGokAAsuAQF/IwBBEGsiAiQAIAIgADYCDCABQYiWwABBBiACQQxqQR0QxAogAkEQaiQACy4BAX8jAEEQayICJAAgAiAANgIMIAFB2JfEAEEGIAJBDGpBIhDECiACQRBqJAALKwAgAiADSQRAIAMgAiAEEJwQAAsgACACIANrNgIEIAAgASADQQJ0ajYCAAsrACABIANLBEAgASADIAQQnBAACyAAIAMgAWs2AgQgACACIAFBAnRqNgIACy0AIAAoAiQgACgCFEEMbGogACgCICAAKAIIakECdGogACgCMEEAIAAoAigbagsuACABIANLBEAgASADQbC+4AAQnBAACyAAIAMgAWs2AgQgACACIAFBAnRqNgIACy4BAX8jAEEQayICJAAgAiAANgIMIAFBxLXAAEEIIAJBDGpBNRDECiACQRBqJAALLgEBfyMAQRBrIgIkACACIAA2AgwgAUGAvcMAQQ8gAkEMakE5EMQKIAJBEGokAAsuAQF/IwBBEGsiAiQAIAIgADYCDCABQcP92QBBBCACQQxqQTsQxAogAkEQaiQACzYBAX8gASgCBCABQQhqIgQoAgAgAiADENYFIAEQxgogAEEIaiAEKAIANgIAIAAgASkCADcCAAstAQJ/IwBBEGsiBSQAIAVBBGoiBiABIAIQrxUgACAGIAMgBBDSGyAFQRBqJAALKgEBfyMAQRBrIgIkACACQQhqQQogACABENQNIAIoAgggAkEQaiQAQQFGCy8BAX8jAEEQayICJAAgAiAANgIMIAFBq43DAEEGIAJBDGpB6wAQxAogAkEQaiQACy8BAX8jAEEQayICJAAgAiAANgIMIAFBpI3DAEEHIAJBDGpB7QAQxAogAkEQaiQACy8BAX8jAEEQayICJAAgAiAANgIMIAFBhsHDAEESIAJBDGpB7wAQxAogAkEQaiQACy8BAX8jAEEQayICJAAgAiAANgIMIAFBov3DAEEGIAJBDGpB8QAQxAogAkEQaiQACy8BAX8jAEEQayICJAAgAiAANgIMIAFB7IrDAEEJIAJBDGpB9QAQxAogAkEQaiQACy8BAX8jAEEQayICJAAgAiAANgIMIAFB+Y3EAEEKIAJBDGpB/AAQxAogAkEQaiQACy8BAX8jAEEQayICJAAgAiAANgIMIAFBsY3DAEENIAJBDGpBgwEQxAogAkEQaiQACy0BAX8gACABKAIAQQFGBH8gAEEEakEAIAEoAgQgASgCCBDXEkEBBSACCzYCAAsvAQF/IwBBEGsiAiQAIAIgADYCDCABQa2XxABBByACQQxqQY4BEMQKIAJBEGokAAsuAQF/IwBBEGsiAiQAIAIgADYCDCABQcSXxABBBiACQQxqQRIQxAogAkEQaiQACzQBAX8gACABKAIIIgIgASgCAEkEfyABIAJBBBDQDyABKAIIBSACCzYCBCAAIAEoAgQ2AgALMQEBfyMAQRBrIgMkACACIAAgARDjCCADQf8BOgAPIAIgA0EPakEBEOMIIANBEGokAAswAQF/IwBBEGsiAyQAIAMgATYCDCACIANBDGpBBBDjCCACIAAgARDjCCADQRBqJAALKwAgASADSwRAIAEgAyAEEJwQAAsgACADIAFrNgIEIAAgAiABQQR0ajYCAAsxAQF/IAEoAgAiAiABKAIERgRAIABBKzYCAA8LIAEgAkEcajYCACAAIAEoAgggAhAwCysAIAEgA0sEQCABIAMgBBCcEAALIAAgAyABazYCBCAAIAIgAUEBdGo2AgALLwEBfyMAQRBrIgIkACACIAA2AgwgAUH5jcQAQQogAkEMakG9ARDECiACQRBqJAALLwEBfyMAQRBrIgIkACACIAEpAgA3AgggACACQQhqIgAQyxogABDKHiACQRBqJAALLgEBfyMAQRBrIgIkACACIAA2AgwgAUGg68MAQQsgAkEMakE7EMQKIAJBEGokAAsqAQF/IAJB////P3EiAiABKAJ8SQR/IAJBfyAAKAL8BHRBf3NxRQUgAwsLLgEBfyMAQRBrIgIkACACIAA2AgwgAUGE68MAQQogAkEMakE5EMQKIAJBEGokAAswAQF/IAAoAgghASAAKAIEIQADQCABBEAgAUEBayEBIAAQ9BcgAEHYAGohAAwBCwsLMAEBfwJAIAAoAgAgASgCAEcNACAAKAIEIAEoAgRHDQAgACgCCCABKAIIRiECCyACCyIBAX9BASAAQcEAa0EGSSAAQTBrQQpJIABB4QBrQQZJchsLOwEBf0GAwAMhAQJAIABB/68DRg0AIABBAWoiAUGAsANzQYCAxABrQf+PvH9LDQBBvMPWABC8KQALIAELLgEBfyMAQRBrIgIkACACIAA2AgwgAUGgtscAQRAgAkEMakE5EMQKIAJBEGokAAsrACABIANLBEAgASADIAQQnBAACyAAIAMgAWs2AgQgACACIAFBA3RqNgIACysAIAEgA0sEQCABIAMgBBCcEAALIAAgAyABazYCBCAAIAIgAUEYbGo2AgALNgEBfkHAjeQALQAAGiAAKQIAIQFBFBBgIgBFBEAACyAAQgA3AgwgACABNwIEIABBATYCACAACy8BAX8gACgCCCEBIAAoAgQhAANAIAEEQCABQQFrIQEgABDMGCAAQRhqIQAMAQsLCzwAAkACQAJAAkAgAC0AAA4HAwMDAQIAAwALIABBBGoQwwQPCyAAKAIEIAAoAggQpyQPCyAAQQRqEMYmCwspAQJ/IwBBEGsiAyQAIANBCGoiBCAAIAEgAhD4AyAEEM4YIANBEGokAAstAQF/IwBBEGsiAiQAIAJBCGogABCRDCABIAIoAgggAigCDBClAyACQRBqJAALSgECfyMAQRBrIgIkACACQQA2AgwjAEEQayIDJAAgAyABNwMIIAMgADcDACACQQxqIANBEBCICyADQRBqJAAgAjUCDCACQRBqJAALLwEBfyMAQRBrIgIkACACIAA2AgwgAUHsvNgAQQkgAkEMakGVAhDECiACQRBqJAALLgEBfyMAQRBrIgIkACACIAA2AgwgAUHsx9gAQQcgAkEMakE7EMQKIAJBEGokAAs3AgF/AX4gACgCACIBRQRAQQAPCxDZIiEAIAEpAgQhAiABENkZIQEgACACNwIEIAAgATYCACAACzcAIABBIGoQmgMCQAJAAkAgACgCAA4CAQIACyAAQQRqEJoDDwsgACkDCBDWGg8LIAApAwgQ1hoLLwEBfyAAKAIIIQEgACgCBCEAA0AgAQRAIAFBAWshASAAELETIABBKGohAAwBCwsLNwEBfwJAIAAtACxBAkYEQCAAKAIYIgEQ/BsgAUEwQQgQvREMAQsgACkDGBDWGgsgACkDABDWGgsvAQF/IAAoAgghASAAKAIEIQADQCABBEAgAUEBayEBIAAQuCEgAEEwaiEADAELCwstAANAIAEEQCAAQRBqKQMAENYmIAApAwAQ1hogAUEBayEBIABBIGohAAwBCwsLLwEBfyAAKAIIIQEgACgCBCEAA0AgAQRAIAFBAWshASAAEOIkIABBKGohAAwBCwsLLwEBfyAAKAIIIQEgACgCBCEAA0AgAQRAIAFBAWshASAAELgoIABBQGshAAwBCwsLLwEBfyAAKAIIIQEgACgCBCEAA0AgAQRAIAFBAWshASAAEN0FIABBMGohAAwBCwsLNwAgAEEgahC5KAJAAkACQCAAKAIADgIBAgALIABBBGoQuSgPCyAAKQMIENYaDwsgACkDCBDWGgs0AQN+IAEpAwAhAiABKQMIIQMQwRggAEEANgIQIAAgAzcDCCAAQQA6ABQgACACNwMAENYaCy4BAX8jAEFAaiICJAAgAiABNgIIIAIgADYCBCACQTE2AgAgAhC9KCACQUBrJAALMAEBfyMAQRBrIgEkACABQQhqIAAQkQxByJTZACABKAIIIAEoAgwQgwQgAUEQaiQACzAAIAACfyABLQAARQRAIAAgAS0AAToAAUEADAELIAAgASkDCBDaGjcDCEEBCzoAAAs4AQF/IAAgASABKAIAQQJ0IgJB1NvjAGooAgBqKAIANgIEIAAgASACQcDb4wBqKAIAaigCADYCAAswAQF/IwBBEGsiASQAIAFBCGogABCRDEHglNkAIAEoAgggASgCDBCDBCABQRBqJAALLAEBfyMAQRBrIgIkACACIAE2AgwgAiAANgIIIAJBCGpBARCzEyACQRBqJAALKwEBfyMAQRBrIgIkACACQQhqQd8AIAAgARDUDSACKAIIIAJBEGokAEEBRgssAQF/IwBBEGsiAiQAIAIgATYCDCACIAA2AgggAkEIakECELMTIAJBEGokAAsxACAAIAEpAwg3AwAgAEEQaiABQRhqKQMANwMAIABBCGogAUEQaikDADcDACABELorCzcAIABBIGoQ2gICQAJAAkAgACgCAA4CAQIACyAAQQRqENoCDwsgACkDCBDWGg8LIAApAwgQ1hoLNwAgAEEgahDPKAJAAkACQCAAKAIADgIBAgALIABBBGoQzygPCyAAKQMIENYaDwsgACkDCBDWGgs3ACAAQSBqEMUDAkACQAJAIAAoAgAOAgECAAsgAEEEahDFAw8LIAApAwgQ1hoPCyAAKQMIENYaCzcAIABBIGoQogICQAJAAkAgACgCAA4CAQIACyAAQQRqEKICDwsgACkDCBDWGg8LIAApAwgQ1hoLLgAgACgCACIAKAIAQQNHBEAgACABEP0eDwsgAEEQaiABELwrIABBBGogARDbGAsuACAAKAIAIgAoAgBBA0cEQCAAIAEQ/h4PCyAAQRBqIAEQvSsgAEEEaiABEN0YCy4AIAAoAgAiACgCAEEDRwRAIAAgARD/Hg8LIABBEGogARDBKyAAQQRqIAEQ3hgLLgAgACgCACIAKAIAQQNHBEAgASAAEIAfDwsgAEEQaiABEMIrIABBBGogARDfGAsuACAAKAIAIgAoAgBBA0cEQCAAIAEQgR8PCyAAQRBqIAEQwCsgAEEEaiABEOAYCzsBAX8gAEEEaiECAkACQAJAIAAoAgBBAWsOAgECAAsgAiABENsrDwsgAigCACABEMUSDwsgAiABENkrCzcAIABBIGoQ2wICQAJA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QRhBBBC9EQsvACAAENcmIABBDGoQ7CYgAEEwahD0JyAAKAI0EL4oIAAoAjgQuiggAEEYahDYJgs1AQF/IABBBGohAQJAAkACQCAAKAIADgIBAgALIAEQjSYPCyABKAIAEPgqDwsgASgCABDBKAssAQF/IAAoAgAiAUECRwRAIABBBGohACABRQRAIAAoAgAQ+CoPCyAAEJgpCwsuAQF/A0AgAEEYaiECIAAtACxBAkdFBEAgAigCACEADAELCyABKAIUIAIQ9gUaCzABAX8gAUEIayICIAIoAgBBAWoiAjYCACACRQRAAAsgACABNgIEIABBoJzjADYCAAsqACABKAIARQRAIAFBfzYCACAAIAE2AgQgACABQQRqNgIADwsgAhDbFAALKgEBfyMAQRBrIgMkACADIAAoAgA2AgwgA0EMaiABIAIQ9QggA0EQaiQACywBAX8CQCAAKAIAIgFFDQAgASABKAIAIgFBAWs2AgAgAUEBRw0AIAAQsA4LC+4BAgJ/AX4jAEEQayICJAAgAkEBOwEMIAIgATYCCCACIAA2AgQjAEEQayIBJAAgAkEEaiIAKQIAIQQgASAANgIMIAEgBDcCBCMAQRBrIgAkACABQQRqIgEoAgAiAigCDCEDAkACQAJAAkAgAigCBA4CAAECCyADDQFBASECQQAhAwwCCyADDQAgAigCACICKAIEIQMgAigCACECDAELIABBgICAgHg2AgAgACABNgIMIABBkQIgASgCCCIALQAIIAAtAAkQiRMACyAAIAM2AgQgACACNgIAIABBkgIgASgCCCIALQAIIAAtAAkQiRMACzMAIAEoAhQgACgCAC0AAEECdCIAQcyd4wBqKAIAIABBvJ3jAGooAgAgASgCGCgCDBEDAAsoACABIAIgAyAEENMfIQMgACACIARrNgIEIAAgASAEakEAIAMbNgIACzMAIAEoAhQgACgCAC0AAEECdCIAQbzU4wBqKAIAIABBoNTjAGooAgAgASgCGCgCDBEDAAsnAQF/IwBBEGsiASQAIAFBCGogACgC1AIQwxEgASgCDCABQRBqJAALLgAgACgCAEGAgICAeEYEQEGE7cMAELwpAAsgAEEMaiABENcLIABBPGogARDXCwszACABKAIUIAAoAgAtAABBAnQiAEHk0uMAaigCACAAQdjS4wBqKAIAIAEoAhgoAgwRAwALMwAgASgCFCAAKAIALQAAQQJ0IgBB5M/jAGooAgAgAEHYz+MAaigCACABKAIYKAIMEQMACywAIAAgAkKAgYKEiJCgwIB/gyICQgBSNgIAIAAgAnqnQQN2IANqIAFxNgIECysBAX8jAEEQayIDJAAgA0EBNgIAIAMgAjcCBCAAIAEgAxDeCCADQRBqJAALLAEBfwJAIAAoAgAiAUUNACABIAEoAgAiAUEBazYCACABQQFHDQAgABDhFwsLKwAgABDjAiAAKAIAQYiAxABHBEAgABD0Fw8LIABBBGoQyiQgAEEIahDKJAszACABKAIUIAAoAgAtAABBAnQiAEG81uMAaigCACAAQajW4wBqKAIAIAEoAhgoAgwRAwALIQBBfyAAIAJHIAAgAkkbIgBBfyABIANHIAEgA0kbIAAbCysAIAAQ4wIgACgCAEGIgMQARwRAIAAQtxUPCyAAQQRqENAkIABBCGoQ0CQLMwAgASgCFCAAKAIALQAAQQJ0IgBBuNPWAGooAgAgAEGk09YAaigCACABKAIYKAIMEQMACzMAIAEoAhQgACgCAC0AAEECdCIAQeDW4wBqKAIAIABB0NbjAGooAgAgASgCGCgCDBEDAAszACABKAIUIAAoAgAtAABBAnQiAEGU1+MAaigCACAAQfDW4wBqKAIAIAEoAhgoAgwRAwALMQECfiABKQIMIQIgASkCFCEDIAAgARCqBiAAIAM3AhQgACACNwIMIAAgASkCHDcCHAsqACAAKAIAIgAEQCAAEP0bIAAoAgAgAEEEaigCABD0KSAAQRRBBBC9EQsLKgAgACkDCCAAKQMYEO8qIAAtADRBA0cEQCAAQSBqELYbCyAAQThqEM0mCyQBAX8gACABckUhAiAARSABRXIEfyACBSAAKAIAIAEoAgBGCwszACABKAIUIAAoAgAtAABBAnQiAEHU7+MAaigCACAAQcDv4wBqKAIAIAEoAhgoAgwRAwALLAAgABDhJiAAQQxqENcmIABBGGoQ5CQgACgCPBC+KCAAQUBrEOAmIAAQ8yoLLQEBfyAAIAE2AhAgACAAKAIIIgIgACgCDGo2AgQgACACIAEgACgCFGtqNgIACy0AIAEoAgBFBEAgAUF/NgIAIAAgATYCBCAAIAFBBGo2AgAPC0GQ59gAENsUAAszACABKAIUIAAoAgAtAABBAnQiAEGs3OMAaigCACAAQaDc4wBqKAIAIAEoAhgoAgwRAwALMwAgASgCFCAAKAIALQAAQQJ0IgBB7NzjAGooAgAgAEG43OMAaigCACABKAIYKAIMEQMACzMAIAEoAhQgACgCAC0AAEECdCIAQazd4wBqKAIAIABBoN3jAGooAgAgASgCGCgCDBEDAAszACABKAIUIAAoAgAtAABBAnQiAEHE3eMAaigCACAAQbjd4wBqKAIAIAEoAhgoAgwRAwALLAAgACkDCBDWGiAAQSBqELQdIABBOGoQ2CYgAEEkahDUJiAAQcgAQQgQvRELKgAgACgCACIABEAgABC2CSAAKAIAIABBBGooAgAQvykgAEEUQQQQvRELCygAIAAoAgAiACgCAEEDRwRAIAAQ8x8PCyAAQRBqEMUtIABBBGoQsxkLLAADQCAALQAUQQJHRQRAIAAoAgBBGGohAAwBCwsgASAAKQMAIAAoAhAQ6xoLLgAgASgCAEUEQCAAIAEpAwgQ2hogACgCFBCnCAsgAUEwaiAAEIQaIAEgABCyEQsrAANAIAAtABRBAkdFBEAgAUEBOgA5IAAoAgBBGGohAAwBCwsgACABELgPCycBAn8jAEFAaiIAJAAgAEEANgIIIABCDDcDACAAEL0oIABBQGskAAs1AQF/IABBBGohAQJAAkACQCAAKAIAQQFrDgIBAgALIAEQ7C0PCyABKAIAEM4UDwsgARDiLQssACAAEOEmIABBDGoQ1yYgAEEYahDkJCAAKAI8EL4oIABBQGsQ9ScgABDzKgs6AQF/QRwQzSAiAEEANgIIIABCgYCAgBA3AgAgAEHQluMAKQMANwIMIABBFGpB2JbjACkDADcCACAACywBAX8CQCAAKAIAIgFFDQAgASABKAIAIgFBAWs2AgAgAUEBRw0AIAAQ3BULCygAIAAgARCVLSAAKAIMIgAEQCABIABBDGooAgAgAEEQaigCABCBIAsLMAAgASgCFCAALQAAQQJ0IgBB9JzjAGooAgAgAEHonOMAaigCACABKAIYKAIMEQMACzAAIAEoAhQgAC0AAEECdCIAQZid4wBqKAIAIABBjJ3jAGooAgAgASgCGCgCDBEDAAswACABKAIUIAAtAABBAnQiAEGwneMAaigCACAAQaSd4wBqKAIAIAEoAhgoAgwRAwALJQAgACABIAIoAghBAWtBeHFqQQhqIAMgBCAFIAYgAigCEBEIAAsnACACIANNBEAgAyACQdCqwAAQmxAACyAAIAEgA0EMbGopAgQ3AwALKgEBfyAAIAIQ0R8gACgCCCIDIAAoAgRqIAEgAhD2BhogACACIANqNgIICyABAX8gASADTwR/IAIgAyAAIAEgA2tqIAMQzR8FIAQLCyoBAX8gACACEMIeIAAoAggiAyAAKAIEaiABIAIQ9gYaIAAgAiADajYCCAsjAQF/IwBBEGsiASQAIAFBCGogABCJCSABKAIMIAFBEGokAAuXAgEEfyAAIAAoAgAiAUEBazYCACABQQJxIAFBBElyRQRAAkAgACICKAIAIQADQCAAQQJxIAAiAUEESXINASACIABBAnIgAigCACIAIAAgAUYbNgIAIAAgAUcNAAsDQAJAIAFBfHEiBCEAA0AgACgCACIDBEACQCAEIAM2AgAgAUEBcUUEQCADKAIEIgAEQCAEIAA2AgAgAiACKAIAQX1xNgIADAULA0AgAiABQQFxIAIoAgAiACAAIAFGIgEbNgIAIAENBSAAIQEgAEEESQ0ACwwBCyACIAFBfXEgAigCACIAIAAgAUYiARs2AgAgAUUNAAwFCwUgACgCCCIDIAA2AgQgAyEADAELCyAAIQEMAQsLEJgbAAsLCyoAAkAgACgCAEGJgMQARwRAIABB9ABqEMImDAELIABBBGohAAsgABCAEQsqAQF/IAAgAhDYHiAAKAIIIgMgACgCBGogASACEPYGGiAAIAIgA2o2AggLLAACQCABQQJHBEAgACgCAEGAgICAeEYNASAAQQA2AhQLDwtBlO3DABC8KQALLAACQCABQQNHBEAgACgCAEGAgICAeEYNASAAIAIQlSMLDwtBpO3DABC8KQALKQEBfyABIAAoAggiAk8EQCABIAJBsKLDABCbEAALIAAoAgQgAUEMbGoLMAAgASgCFCAALQAAQQJ0IgBBwM/jAGooAgAgAEGoz+MAaigCACABKAIYKAIMEQMACykAIAAgAWosAABBAE4EfyAAKQMAQoCBgoSIkKDAgH+DeqdBA3YFIAELCysBAX8gASAAKALIAiICTwRAIAEgAkGs8MMAEJsQAAsgACgCxAIgAUEUbGoLLAEBf0EBIQICQCABQYCAgIB4Rg0AIAAQ5hMgAUYNACAAELQVIAFGIQILIAILJQAgACABIAIoAghBAWtBeHFqQQhqIAMgBCAFIAYgAigCIBEIAAsnACABLQAQQQFxBEAgAxDUAwsgAgRAIAMQqwgLIABBgICAgHg2AgALJgAgAkUEQEEBQQAgAxCcEAALIAAgAkEBazYCBCAAIAFBCGo2AgALIwAgACACQQdxIANBA3RyNgIEIAAgAkH4AXFBA3YgAXI2AgALMAAgASgCFCAALQAAQQJ0IgBBnLjYAGooAgAgAEH0ttgAaigCACABKAIYKAIMEQMACzAAIAEoAhQgAC0AAEECdCIAQdzX4wBqKAIAIABBuNfjAGooAgAgASgCGCgCDBEDAAswAQJ+IAEpAxAhAiABKQMAENoaIQMgACABKQMIENoaNwMIIAAgAzcDACAAIAI3AxALMAECfiABKQMIIQIgASkDABDaGiEDIAAgASkDEBCeIzcDECAAIAM3AwAgACACNwMICy8CAX4BfyABKQIAIQIgASgCCCEDIAAgAUEMahDYHDYCDCAAIAM2AgggACACNwIACy8CAX4BfyABKQIIIQIgARDYHCEDIAAgAUEEahDZGTYCBCAAIAM2AgAgACACNwIICy8CAX4BfyABKQIIIQIgARDYHCEDIAAgAUEEahDjEDYCBCAAIAM2AgAgACACNwIICyoAIAApAwggACkDGBDvKiAALQA0QQNHBEAgAEEgahC2GwsgACgCOBC6KAsqACAAKQMIIAApAxgQ7yogAC0ANEEDRwRAIABBIGoQthsLIAAoAjgQ4CILLwACQAJAAkAgACgCAA4CAQIACyAAQQRqEL8oDwsgACkDCBDWGg8LIAApAwgQ1hoLKwEBfwJAAkACQCAAQQprDgQBAgIBAAsgAEGowABrQQJPDQELQQEhAQsgAQssAQF/IABBBGohASAAKAIAIgBBgICAgHhHBEAgACABKAIAEKckDwsgARDsIgssACAAKQMIENYaIAAoAiAQoB4gAEE4ahDYJiAAQSRqENQmIABByABBCBC9EQsoAEEGIQEgACACIANBv67gAEEFEM0fBH8gAEELOgABQQAFIAELOgAACygAQQYhASAAIAIgA0Hsp+AAQQMQzR8EfyAAQRI6AAFBAgUgAQs6AAALKABBBiEBIAAgAiADQayD4ABBBBDNHwR/IABBJDoAAUEABSABCzoAAAsoAEEGIQEgACACIANBnbLgAEEFEM0fBH8gAEEdOgABQQIFIAELOgAACyUAIABBCGoQjycgAC0ANEEDRwRAIABBIGoQthsLIABBOGoQiCULJQAgAEEIahDVKCAALQA0QQNHBEAgAEEgahDgHAsgAEE4ahCIJQsqAQF/A0AgAEEYaiECIAAtACxBAkdFBEAgAigCACEADAELCyABIAIQ+ggLKQAgASAAENYhIABBIGogARDJIyAAQegAaiABENYrIABByABqIAEQyCMLKQAgASAAENghIABBIGogARDHIyAAQegAaiABENMrIABByABqIAEQxiMLKAACQCAALQAoRQRAIABBDGogARDiKAwBCyAAQSxqIQALIAAgARD7HgsoACAALQAUQQJGBEAgACgCACIAQgA3AxAgAEEYahD5HQsgAEIANwMICyoAIAApAwggACkDGBDvKiAALQA0QQNHBEAgAEEgahDkHAsgACgCOBC6KAstAQJ/EOgiIQEQ6CIhAiAAQRBqQQA6AAAgAEIANwIIIAAgAjYCBCAAIAE2AgALKQAgAC0AFEECRgRAIAAoAgAiABDOJyAAQTBBCBC9EQ8LIAApAwAQ1hoLLwACQAJAAkAgACgCAA4CAQIACyAAQQRqEIUpDwsgACkDCBDWGg8LIAApAwgQ1hoLLgAgACgCCCIAQQRqKAIAIABBCGooAgBBwNDfABCTIyIAKAIEIAAoAgggARDXKgsuACAAKAIUIgBBFGooAgAgAEEYaigCAEGU0N8AEJMjIgAoAgQgACgCCCABENcqCzAAIAEoAhQgAC0AAEECdCIAQezn4wBqKAIAIABByOfjAGooAgAgASgCGCgCDBEDAAsvAAJAAkACQCAAKAIADgIBAgALIABBBGoQmCkPCyAAKQMIENYaDwsgACkDCBDWGgskACACRQRAIAEEQCAAIAFBCBC9EQtBCA8LIAAgAUEIIAIQ9AILJwEBfyMAQSBrIgIkACACQQg2AgggACABIAJBCGoQyB8gAkEgaiQACycBAX8jAEEgayICJAAgAkEXNgIIIAAgASACQQhqEMgfIAJBIGokAAsmAQF/IAAtABQgAEEBOgAUIABBCGshAEUEQCAAELYtDwsgABDqDgsjACABIANNBEAgACABNgIEIAAgAjYCAA8LIAEgAyAEEJ0QAAsnACABIANHBEBBjJ/AAEEoQbSfwAAQ2hcACyACIAAgAUECdBD2BhoLJgAgAUELTQRAIAAgATYCBCAAIAI2AgAPCyABQQtBxJ/AABCdEAALHgEBf0EBQSAgAEEBcmdrQQF2IgF0IAAgAXZqQQF2CykAIAAoAgQgACgCCCAAIANB/wFxakFAay0AACACakHgjsQAEJkfKAIACyUAIAAgAiADEKEKIABBEGogAkEQaiADEKEKIAJBCCABIAMQxgcLJQAgACgCACAAKAIEIgAoAghBAWtBeHFqQQhqIAEgACgCDBECAAslACAAKAIAIAAoAgQiACgCCEEBa0F4cWpBCGogASAAKAJQEQIAC14BAX8gACgCACIBIAEoAgAiAUEBazYCACABQQFGBEAgACgCACIAKAIMIABBEGooAgAQuCkCQCAAQX9GDQAgACAAKAIEIgFBAWs2AgQgAUEBRw0AIABBGEEEEL0RCwsLJwAgACgCAEGAgICAeEcEQCAAEL4mIABBJGoQ8RcPCyAAQQRqEL4mCyEAIAEgA0cEQCABIAMgBBChEAALIAAgAiABQQJ0EPYGGgsuACABKAIUQejdwwBBvd3DACAAKAIALQAAIgAbQQ1BAyAAGyABKAIYKAIMEQMACycAIAIEQEHAjeQALQAAGiACIAEQpSEhAQsgACACNgIEIAAgATYCAAsjACABIANNBEAgACABNgIEIAAgAjYCAA8LQQJBASAEEJ0QAAsqAQJ/IAAoAgghASAAKAIEIQIgACgCAEUEQCACIAEQyikPCyACIAEQ1ikLIgEBfyAAEO8IBH8gABDbBSAAKAIAKAJQIAAoAghHBSABCwspAQF/IABBBCAAKAIAQf7///8HaiIBIAFBBE8bQQJ0QfDS4wBqKAIAagslACACIAMgAUEBEJUVIQEgACADQQFrNgIEIAAgAkEAIAEbNgIACzMBAX9BfyECA0AgAkEBaiECIABCzZmz5syZs+ZMfiIAQrTmzJmz5syZM1QNAAsgASACTQspACAAIAAtAAQgAUEuRnI6AAQgACgCACIAKAIUIAEgACgCGCgCEBECAAssAQF/QQEhAiABKAIUQYjF2ABBAiABKAIYKAIMEQMABH8gAgUgACABEIUbCwsgACABKAIAIAJBaGxqQRhrIgApAwAgAEEIaikDABD2GwslACACIAMgAUEBENEdIQEgACADQQFrNgIEIAAgAkEAIAEbNgIACy8C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AgAgAiABKAIAdkHclsMAEJkfKAIACykAIAAoAhAgACgCFCAAKAK0AiABIAAoArACdGpB4JPDABCcHyACNwMACyoBAX8gACgCBCIBIAAoAggQwxwgACgCACABEL8pIAAoAgwgACgCEBC7KQsfACABIAJNBEAgAiABQcSXwwAQmxAACyAAIAJBA3RqCx8AIAEgAk0EQCACIAFB1JfDABCbEAALIAAgAkEFdGoLHwAgASACTQRAIAIgAUHkl8MAEJsQAAsgACACQQV0agsfACABIAJNBEAgAiABQaSYwwAQmxAACyAAIAJBDGxqCx8AIAEgAk0EQCACIAFBwKLDABCbEAALIAAgAkEMbGoLHQAgACABIAIgAyABQQFyZ0EBdEE+c0EAIAQQpgELHAAgASACTQRAIAIgASADEJsQAAsgACACQRhsagsdACABRQRAQQEPCyABQQN0IABqQQRrKAIAQYABSQsnAQJ/IABBADYCrAEgACgCqAEhAiAAKAKkASAAIAE3AqQBIAIQuCkLHAAgASACTQRAIAIgASADEJsQAAsgACACQRxsagscACABRQRAQQEPCyABQQF0IABqQQFrLAAAQQBOCxwAIAEgAk0EQCACIAEgAxCbEAALIAAgAkEBdGoLIQAgASADRwRAIAEgA0H8kdgAEKEQAAsgACACIAEQ9gYaCyYAIAAoAgBBgICAgHhGBEAgARCBHQ8LIAAoAgQgACgCCCABEOcqCyEBAX8gACAALQAAIgFBASABGzoAACABBEAgABDMAwsgAAsgACABKAIAIAJBBHRrQRBrIgApAwAgAEEIaikDABD2GwspAgF+AX8gASkCDCECIAEoAhQhAyAAIAEQiwwgACADNgIUIAAgAjcCDAsiAQF/IABBgLADc0GAgMQAa0GAkLx/TwR/IAAQ0BEFIAELCyEAAkAgAQ0AIAItABlBAWtB/wFxQQFNDQAgAiAAEM4tCwsgAQF/IAAtACwiAUEESyABQQNGckUEQCAAQRhqELMgCwsiACAAQgA3AgwgACgCAEUEQCAAQgA3AgQPCyAAQQRqEMYtCyAAIAEoAgAgAkEEdGsiAEEQaykDACAAQQhrKAIAEJscCxwBAX8gACABEK8LBH8gACgCCCABKAIIRgUgAgsLJAAgABDDFiAAQUBrEOwPIAAoAkAgACgCRBD1KSAAQSBqEOQk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ENYaDwsgAEEEahDtKAsLHQAgAEEgahDfLSAAKAIAQQJPBEAgAEEEahDfLQsLHQAgAEEgahDhLSAAKAIAQQJPBEAgAEEEahDhLQsLHQAgAC0ANEEDRwRAIABBIGoQsyALIABBOGoQyCcLIQADQCAALQAsQQJHRQRAIAAoAhghAAwBCwsgAEEAOgAsCycAAkACQAJAIAAoAgAOAwACAQILIAApAwgQ1hoPCyAAQQRqEIUpCwsiAQF/IABBBGohASAAKAIARQRAIAEoAgAQuigPCyABEIAjCyIAIAEoAgBBgICAgHhGBEAgAEEEOgAADwsgACACIAEQ2hMLHAAgAARAIAEgAEEMaigCACAAQRBqKAIAEJctCwsbACAAIAEgAiABIAJJGyABIAIgASACSxsQxhgLHAAgAARAIAEgAEEEaigCACAAQQhqKAIAEJctCwscACAABEAgAEEEaigCACAAQQhqKAIAIAEQgRsLCxoBAX8gACgCAEERRgR/IABBCGoQow8FIAELCxwAIAAEQCABIABBDGooAgAgAEEQaigCABCBIAsLGwAgACABIAIgAyABQQFyZ0EBdEE+c0EAENIBCyUAIAAgASgCBCABKAIIIAJB0IPAABCaHygCADYCBCAAIAE2AgALJQAgACABKAIEIAEoAgggAkHgg8AAEJofKAIINgIEIAAgATYCAAsgAQF/QTQQuy0iAEUEQAALIABBADsBMiAAQQA2AgAgAAshAQF/QeQAELstIgBFBEAACyAAQQA7ATIgAEEANgIAIAALJAAgAC0AAEUEQCABQei04ABBBRClAw8LIAFB7bTgAEEEEKUDCxsAQcCN5AAtAAAaIAAgARClISIABEAgAA8LAAsZACABIAJNBEAgAiABIAMQmxAACyAAIAJqCyIAIAAoAhAgACgCFCABIAAoAjx2QQJrQaCPxAAQnh8oAggLKAAgAEEcakEAIAJCjJav3d3Ku9mKf1EbQQAgAULz47aq2cO3glBRGwspACAAQRxqQQAgAkLtuq22zYXU9eMAURtBACABQviCmb2V7sbFuX9RGwshACAARQRAQYSY4wBBMhCtKgALIAAgAiADIAEoAhARBAALJAAgAEGBgICAeEcEQCAARQRAQdjB3wBBEUGo9MIAENoXCwALCx8BAX8gACgCCCIBIAAoAgBJBEAgACABQQRBFBDY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CwsRACAAKAIABEAgACABEOYsCwsRACAAKAIABEAgACABEOcsCwsRACAAKAIABEAgACABEIItCwsRACAAKAIABEAgACABEIMtCwsVACAAKAIAIgAQ9RAgAEEoQQgQvRELFQAgACgCACIAEI0FIABBDEEEEL0RCxUAIAAoAgAiABDbAyAAQTBBCBC9EQsTACAAQTBqIAEQpRogACABEIAJCxMAIAAgARCNLSAAQQRqIAEQgy0LFQAgACgCACIAEI4FIABBDEEEEL0RCxIAIAAoAgBBE0cEQCAAENwDCwsVACAAKAIAIgAQ3AMgAEEwQQgQvRELFQAgACgCACIAEPYQIABBKEEIEL0RCxYAIAAoAgAiABChAiAAQcAAQQgQvRELFQAgACgCACIAEPUEIABBDEEEEL0RCxUAIABBgYCAgHhHBEAgACABEK8kCwsSACAAKAIAQSVHBEAgABC/CgsLEwAgACgCAEGAAWogAEEEahDACAsSACAALQAIQQVGBEAgABCYKQsLFQAgACgCACIAELgFIABBDEEEEL0RCxUAIAAoAgAiABCYEiAAQShBCBC9EQsSACAAKAIAQSVHBEAgABDfCQsLEgAgACgCAEEHRwRAIAAQmBILCxYAIAAoAgBBgICAgHhHBEAgABDCIAsLEgAgACgCAEEIRwRAIAAQqAoLCxYAIAAgASgCACACIAEoAgQoAiARBAALFwAgACABIAAgASACEMYPQZC74AAQyR8LEgAgACgCAEElRwRAIAAQ4AkLCxcAIAAgASAAIAEgAhC9DkGgu+AAEMkfCxMAIABBMGogARCoGiAAIAEQlhALEQAgACgCAARAIAAgARCVLQsLEQAgACgCAARAIAAgARCaLQsLEQAgAEEDRgRAIAEgAhD1AgsLEQAgACgCAARAIAAgARCgLQsLEwAgACABEKYiIABBIGogARCIJAsTACAAIAEQpiIgAEEgaiABEKktCxEAIAAoAgAEQCAAIAEQpi0LCxMAIABBMGogARCvGiAAIAEQnRELEwAgAEEwaiABEK4aIAAgARCjFAsTACAAIAEQpiIgAEEoaiABEKktCxMAIAAgARCoLSAAQQRqIAEQpi0LEwAgACABEJ8tIABBBGogARCaLQsTACAAIAEQoy0gAEEEaiABEKAtCxUAIAAoAgAiABD4ECAAQShBCBC9EQsVACAAKAIAIgAQ9gQgAEEMQQQQvRELFgAgAEHIz+AANgIEIAAgAUEIajYCAAsWACAAQeTI4AA2AgQgACABQQhqNgIACxYAIABBxM3gADYCBCAAIAFBHGo2AgALFgAgAEGAzuAANgIEIAAgAUEcajYCAAsSACAAQQRqELUiIABBJGoQ0hQLFQAgACgCACIAEI8FIABBDEEEEL0RCxcAIAApAwAgAC0AFBCjIyAAKAIYELoYCxIAIAAoAgBBB0cEQCAAEJsSCwsVACAAKAIAIgAQmxIgAEEoQQgQvRELFQAgACgCACIAENIFIABBMEEIEL0RCxkAIAEoAhRBrOPgAEENIAEoAhgoAgwRAwALDwAgAEGEAU8EQCAAEBQLCw8AIABBPGpBACAAKAI8GwsPACAAQRxqQQAgACgCHBsLDwAgAEEoakEAIAAoAigbCxEAIAAoAgAgAiABEMQZQQFzCxQBAX9BAkEBELgiIgEgADoAACABCxQAIAAoAgAgASAAKAIEKAIQEQIAC8YIAQV/IwBB8ABrIgUkACAFIAM2AgwgBSACNgIIAkACQAJAAkACQAJAAn8gAAJ/AkAgAUGBAk8EQEEDIAAsAIACQb9/Sg0CGiAALAD/AUG/f0wNAUECDAILIAUgATYCFCAFIAA2AhBBAQwCCyAALAD+AUG/f0oLQf0BaiIGaiwAAEG/f0wNASAFIAY2AhQgBSAANgIQQQUhB0GM+sAACyEGIAUgBzYCHCAFIAY2AhggASACSSIHIAEgA0lyRQRAIAIgA0sNAiACRSABIAJNckUEQCADIAIgACACaiwAAEG/f0obIQMLIAUgAzYCICADIAEiAkkEQCADQQFqIgggA0EDayICQQAgAiADTRsiAkkNBAJAIAIgCEYNACAIIAJrIQcgACADaiwAAEG/f0oEQCAHQQFrIQYMAQsgAiADRg0AIAAgCGoiA0ECayIJLAAAQb9/SgRAIAdBAmshBgwBCyAJIAAgAmoiCEYNACADQQNrIgksAABBv39KBEAgB0EDayEGDAELIAggCUYNACADQQRrIgMsAABBv39KBEAgB0EEayEGDAELIAMgCEYNACAHQQVrIQYLIAIgBmohAgsCQCACRQ0AIAEgAksEQCAAIAJqLAAAQb9/Sg0BDAcLIAEgAkcNBgsgASACRg0EAn8CQAJAIAAgAmoiASwAACIAQQBIBEAgAS0AAUE/cSEGIABBH3EhAyAAQV9LDQEgA0EGdCAGciEADAILIAUgAEH/AXE2AiRBAQwCCyABLQACQT9xIAZBBnRyIQYgAEFwSQRAIAYgA0EMdHIhAAwBCyADQRJ0QYCA8ABxIAEtAANBP3EgBkEGdHJyIgBBgIDEAEYNBgsgBSAANgIkQQEgAEGAAUkNABpBAiAAQYAQSQ0AGkEDQQQgAEGAgARJGwshACAFIAI2AiggBSAAIAJqNgIsIAVBBTYCNCAFQZT7wAA2AjAgBUIFNwI8IAUgBUEYaq1CgICAgLABhDcDaCAFIAVBEGqtQoCAgICwAYQ3A2AgBSAFQShqrUKAgICAwAmENwNYIAUgBUEkaq1CgICAgNAJhDcDUCAFIAVBIGqtQoCAgICQAYQ3A0gMBgsgBSACIAMgBxs2AiggBUEDNgI0IAVB1PvAADYCMCAFQgM3AjwgBSAFQRhqrUKAgICAsAGENwNYIAUgBUEQaq1CgICAgLABhDcDUCAFIAVBKGqtQoCAgICQAYQ3A0gMBQsgACABQQAgBiAEELgmAAsgBUEENgI0IAVBtPrAADYCMCAFQgQ3AjwgBSAFQRhqrUKAgICAsAGENwNgIAUgBUEQaq1CgICAgLABhDcDWCAFIAVBDGqtQoCAgICQAYQ3A1AgBSAFQQhqrUKAgICAkAGENwNIDAMLIAIgCEGA/MAAEJ4QAAsgBBC8KQALIAAgASACIAEgBBC4JgALIAUgBUHIAGo2AjggBUEwaiAEEKEdAAsUACAAKAIAIAEgACgCBCgCDBECAAsOACAABEAgACABEPIcCwsPACAAKAIABEAgABDMKQsLDwAgACgCAARAIAAQyB4LCzwBAn8gACgCCCEBIAAoAgQhAgNAIAEEQCABQQFrIQEgAhDNCyACQRxqIQIMAQsLIAAoAgAgACgCBBDIKQs8AQJ/IAAoAgghASAAKAIEIQIDQCABBEAgAUEBayEBIAIQwAkgAkEIaiECDAELCyAAKAIAIAAoAgQQyikLDwAgACgCAARAIAAQyR4LCxQAIAAoAgAgASgCFCABKAIYEIcDC38CAn8BfkHgjOQAKAIARQRAIwBBEGsiASQAQfCM5AACfgJAIABFDQAgACgCACAAQgA3AwBBAXFFDQAgACkDCCEDIAApAxAMAQsgARCSFSABKQMAIQMgASkDCAs3AwBB6IzkACADNwMAQeCM5ABCATcDACABQRBqJAALQeiM5AALFAAgABDqGyAAKAIAIAAoAgQQ5CkLFwAgACABEI4PNgIIIABCgoCAgBA3AgALFAAgABCuAyAAEMkRIAAoAhgQ1ioLEAAgACABIAJBAhDNH0EBcwsUACAAEPIbIAAoAgAgACgCBBDoKQsaACAAQYCAgIB4NgIAIABBsMzYACkDADcCBAsPACAAKAIABEAgABDrHgsLkAEBAn8gACgCCCECIAAoAgQhAQNAIAIEQAJAAkACQAJAAkACQCABKAIADgQBAgMEAAsgAUEEahDJJgwECyABQQhqKQMAIAFBEGopAwAQ7ioMAwsgAUEEahCgIwwCCyABQQRqEJoDDAELIAFBBGoQsBMLIAJBAWshAiABQShqIQEMAQsLIAAoAgAgACgCBBDxKQsUACAAELYJIAAoAgAgACgCBBC/KQsSACAAKQMAENYaIABBGGoQ0CYLFAAgABDbGiAAKAIAIAAoAgQQySkLDwAgACgCAARAIAAQ4CQLCzwBAn8gACgCCCEBIAAoAgQhAgNAIAEEQCABQQFrIQEgAhCaAyACQQRqIQIMAQsLIAAoAgAgACgCBBC7KQsUACAAEIEcIAAoAgAgACgCBBD0KQsPACAAKAIABEAgABDhJAsLDwAgACgCAARAIAAQmgMLCzwBAn8gACgCCCEBIAAoAgQhAgNAIAEEQCABQQFrIQEgAhD9BCACQQRqIQIMAQsLIAAoAgAgACgCBBC7KQs8AQJ/IAAoAgghASAAKAIEIQIDQCABBEAgAUEBayEBIAIQohkgAkEoaiECDAELCyAAKAIAIAAoAgQQ8SkLFAAgABC6CSAAKAIAIAAoAgQQ8ykLDwAgACgCAARAIAAQ/QQLCw4AIABQRQRAIAAQ1hoLCzwBAn8gACgCCCEBIAAoAgQhAgNAIAEEQCABQQFrIQEgAhCaAyACQQxqIQIMAQsLIAAoAgAgACgCBBC/KQsUACAAEKMZIAAoAgAgACgCBBDJKQsUACAAEKUZIAAoAgAgACgCBBDzKQsSACAAKQMAENYaIABBGGoQ2yYLDwAgACgCAARAIAAQ6yQLCw8AIAAoAgAEQCAAEOwECwsPACAAKAIABEAgABC5KAsLDwAgACgCAARAIAAQ7CQLCw8AIAAoAgAEQCAAEMQECwsPACAAKAIABEAgABDwJAsLFAAgABCAHCAAKAIAIAAoAgQQ9SkLFAAgABChGSAAKAIAIAAoAgQQ8ykLDwAgACgCAARAIAAQtwULCxQAIAAQ/RsgACgCACAAKAIEEPQpCw8AIAAoAgAEQCAAEL8oCwsUACAAEKQZIAAoAgAgACgCBBDRKQsPACAAKAIABEAgABDrIgsLFAAgABCBEiAAKAIAIAAoAgQQ9CkLFAAgABC1FyAAKAIAIAAoAgQQySkLFAAgABD7GyAAKAIAIAAoAgQQ8SkLFAAgABDgCyAAKAIAIAAoAgQQ8ikLFAAgABC1ByAAKAIAIAAoAgQQ8ikLEgAgACkDABDWGiAAQRhqEOAmCxQAIAAQ/xsgACgCACAAKAIEEPEpCxQAIAAQqxAgACgCACAAKAIEEPMpCxQAIAAQmwYgACgCACAAKAIEEPMpCxQAIAAQ7A8gACgCACAAKAIEEPUpCw8AIAAoAgAEQCAAEM8GCwsQACAAIAEgAGsgAiADENMfCw8AIAAoAgAEQCAAELgUCwsSACAAKQMAENYaIABBGGoQ9iYLDwAgACgCAARAIAAQ/SQLCw8AIAAoAgAEQCAAENoCCwsPACAAKAIABEAgABCEBQsLDwAgACgCAARAIAAQrwYLCxIAIAApAwAQ1hogAEEYahD7JgsPACAAKAIABEAgABCAJQsLDwAgACgCAARAIAAQhQULCw8AIAAoAgAEQCAAEM8oCwsSACAAKQMIENYaIABBIGoQzygLEgAgAUHAAWoQuxsgAEElNgIACxIAIAFBwAFqEJwVIABBBDYCAAsSACABQcABahC7GyAAQQk2AgALEgAgAUHAAWoQuxsgAEEKNgIACxIAIAFBwAFqELsbIABBEDYCAAsSACABQcABahC7GyAAQQ82AgALEgAgAUHAAWoQuxsgAEEFNgIACxIAIAFBwAFqELsbIABBCzYCAAsSACABQcABahC7GyAAQQw2AgALEgAgAUHAAWoQuxsgAEERNgIACxIAIAFBwAFqELsbIABBDTYCAAsSACABQcABahC7GyAAQQ42AgALEgAgAUHAAWoQuxsgAEEaNgIACw8AIAAoAgAEQCAAEIclCwsPACAAKAIABEAgABCgAgsLDwAgACgCAARAIAAQrQULCxIAIAApAwAQ1hogAEEQahC3IwsPACAAKAIABEAgABCJJQsLDwAgACgCAARAIAAQxQMLCxIAIAApAwAQ1hogAEEYahCQJwsPACAAKAIABEAgABCVBQsLDwAgACgCAARAIAAQuRQLCw8AIAAoAgAEQCAAEI0lCwsPACAAKAIABEAgABC7AgsLDwAgACgCAARAIAAQ/AQLCxIAIAAoAhAQyyEgAEEIahCEJQsPACAAKAIABEAgABCPJQsLDwAgACgCAARAIAAQzQILCw8AIAAoAgAEQCAAEJkFCwsPACAAKAIABEAgABD9FgsLDwAgACgCAARAIAAQogILCw8AIAAoAgAEQCAAEJAlCwsPACAAKAIABEAgABDtBAsLEQAgAEIANwMIIABBGGoQoiULEwAgACABEL4jIAAoAhggARDIBQsTACAAIAEQ/iAgACgCGCABEIgSCxMAIAAgARD+ICAAKAIYIAEQrQgLEwAgASAAENYhIAAoAiAgARCIEgsTACABIAAQ2CEgACgCICABEIoSCw8AIAAoAgAEQCAAEMUtCwsPACAAKAIABEAgABDGLQsLEgAgACkDABDWGiAAQRhqEKknCw8AIAAoAgAEQCAAEKYlCwsPACAAKAIABEAgABDbAgsLDwAgACgCAARAIAAQhgULCxQAIAEgACkDABDaGiAAKAIQEOIYCw8AIAAoAgAEQCAAELglCwsPACAAKAIABEAgABC3JQsLDwAgACgCAARAIAAQ7gQLCw8AIAAoAgAEQCAAENMtCwsPACAAKAIABEAgABDuAwsLDwAgACgCAARAIAAQ0i0LCw8AIAAoAgAEQCAAELwlCwsPACAAKAIABEAgABDoKAsLEgAgACkDABDWGiAAQRhqELMnCw8AIAAoAgAEQCAAEIcFCwsRACAAQQxqEPoUIABBADYCCAsPACAAKAIABEAgABC9JQsLDwAgACgCAARAIAAQjgILCw8AIAAoAgAEQCAAEO8ECwsSACAAKQMAENYaIABBGGoQvCcLDwAgACgCAARAIAAQvyULCw8AIAAoAgAEQCAAEIgFCwsPACAAKAIABEAgABDtKAsLDgAgAFBFBEAgARDWJgsLDwAgACgCAARAIAAQiwoLCw8AIAAoAgAEQCAAENwCCwsPACAAKAIABEAgABDfJQsLDwAgACgCAARAIAAQzRcLCxIAIAApAwAQ1hogAEEYahDFJwsPACAAKAIABEAgABDYJQsLDwAgACgCAARAIAAQiQULCw8AIAAoAgAEQCAAELICCwsPACAAKAIABEAgABDkLQsLDwAgACgCAARAIAAQ/gULCw8AIAAoAgAEQCAAEOMtCwsPACAAKAIABEAgABDeJQsLDwAgACgCAARAIAAQjwILCw8AIAAoAgAEQCAAEPAECwsSACAAQRhqEPwdIAApAwAQ1hoLEgAgACkDABDWGiAAQRhqEMInCw8AIAAoAgAEQCAAEPUoCwsPACAAKAIABEAgABCKBQsLEgAgACkDABDWGiAAQRhqENMnCw8AIAAoAgAEQCAAEOIlCwsPACAAKAIABEAgABDxBAsLEQAgAEEAOgAUIABBGGoQkioLDwAgACgCAARAIAAQswILCw8AIAAoAgAEQCAAEOklCwsPACAAKAIABEAgABDyBAsLEgAgACkDABDWGiAAQRhqENcnCw8AIAAoAgAEQCAAEN0CCwsPACAAKAIABEAgABDrJQsLDwAgACgCAARAIAAQiwULCxIAIAApAwAQ1hogAEEYahDbJwsOACAABEAgACABEPsJCwsPACAAKAIABEAgABDvJQsLDwAgACgCAARAIAAQhSkLCw8AIAAoAgAEQCAAEPMECwsPACAAKAIABEAgABDwJQsLDwAgACgCAARAIAAQjAULCw8AIAAoAgAEQCAAEOEtCwsPACAAKAIABEAgABCLKQsLEgAgACkDABDWGiAAQRhqEOInCw8AIAAoAgAEQCAAEN8tCwsSACAAKQMAENYaIABBGGoQ6ScLDwAgACgCAARAIAAQ/iULCw8AIAAoAgAEQCAAEMYCCwsPACAAKAIABEAgABCNBQsLDwAgACgCAARAIAAQxwILCxIAIAApAwAQ1hogAEEYahDuJwsPACAAKAIABEAgABCCJgsLDwAgACgCAARAIAAQjgULCw8AIAAoAgAEQCAAEIcmCwsPACAAKAIABEAgABCGJgsLDwAgACgCAARAIAAQ9QQLCxMAIAAoAgAgACgCBEEEQQwQtiILDwAgACgCAARAIAAQmCkLCw8AIAAoAgAEQCAAEIwmCwsPACAAKAIABEAgABC4BQsLEgAgACkDABDWGiAAQRhqEPUnCw8AIAAoAgAEQCAAEIIjCwsPACAAKAIABEAgABDRBgsLFAAgABDjIiAAKAIcIAAoAiAQuykLEwAgACgCCCAAKAIAQQRBBBC2IgsOACAABEAgACABEP8ECwsTACAAIAEQmC0gACgCFCABEIIgCw8AIAAoAgAEQCAAEOgKCwsOACAABEAgACABEPctCwsSACAAKQMAENYaIABBGGoQgSgLDwAgACgCAARAIAAQpSYLCw8AIAAoAgAEQCAAELAGCwsPACAAKAIABEAgABD2BAsLDwAgACgCAARAIAAQpSkLCxIAIAApAwgQ1hogAEEgahClKQsPACAAKAIABEAgABDfAgsLDwAgACgCAARAIAAQqyYLCw8AIAAoAgAEQCAAEI8FCwsSACAAKQMAENYaIABBGGoQhygLEwAgACgCCCAAKAIAQQRBCBC2IgshACAAQqyhz+ic4aiYaDcDCCAAQovesJ3mpLfHvH83AwALIAAgAELK14GglbrTzmc3AwggAEK/g4uk2oGAuX03AwALEAAgABCSJCAAQSxBBBC9EQsTACAAQbSCwAA2AgQgACABNgIACxEAIAEgACgCBCAAKAIIEKUDCxEAIAAoAgQgACgCCCABEMEOCxEAIAEgACgCACAAKAIEEKUDCw4AIAAoAtQCIAFBAWtLCw4AIAAoArgCIAFBAWtLCw4AIAAoAswCIAFBAWtLCxIAQcCN5AAtAAAaIAEgABClIQslAQF/IABBDGoQuR4gACgCBCIBIAAoAggQhhsgACgCACABEL8pCyEAIABCtoH8lMmz8IupfzcDCCAAQp+psYiVgKi5XzcDAAshACAAQrPwz9+I/O/tezcDCCAAQsSHvJOT+aadnX83AwALIQAgAEKjoszPrJvpw8IANwMIIABCl4yP9qPR0tkJNwMACyEAIABC4tTj4d7R1ciSfzcDCCAAQu7Dq4/uiKy0VDcDAAsQACAAEI8jIABBKEEEEL0RCxMAIABB8LzAADYCBCAAIAE2AgALEwAgAEGsvcAANgIEIAAgATYCAAsMACAABEAgARCxJgsLEQAgASgCFCABKAIYIAAQjAQLEAAgACACNgIEIAAgATYCAAsTACAAQaD+wQA2AgQgAEEBNgIACw8AIABBBGoQtSQgABDJHgsQACAAEJ0XIABBoA1qEMoeCw8AIABBBGoQyh4gABDSHgt1AQJ/IAAQwyIgAEEwaiIBKAIAIAEoAgQQuykgASgCECICIAEoAhQQxBwgASgCDCACEL8pIAEoAhggASgCHBC7KQJAIAEoAigi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AwALEAAgABCNJCAAQThBBBC9EQsQACAAEKomIABBMEEEEL0RCxMAIABBvM7gADYCBCAAIAE2AgALEwAgAEH4zuAANgIEIAAgATYCAAsPACAAEN8CIABBBGoQjwULDwAgABCuJiAAQRRqEIcoCw0AIAAgAUEBQQEQtiILDgAgACgCDCABIAIQmRALzhIBEH8gACEEIwBBsAFrIgMkACACQQA2AgACQAJAAkAgASIAKAIAIgUgASgCBCIJSw0AIAJBBGohBwJAAkACQCAEKAI8IggEQCABLQAQQQFHDQELAkACQCACKAIQRQRAIARB3AJB2AIgAC0AEBtqKAIAIgFFDQQgASAEKALUAk0NAQwECyACKAIUIQEgAigCGA0BIAIoAiAhBQwECyACKAIcIQYgAigCGCEIIANBQGsgBCABEIggIAMoAkAgAygCRBDGFSAGQQAgCBsiBk0NAiACQQE2AhggAiAGQQFqNgIcIANBOGogBCABEIggIAMgAykDODcCmAEgA0EwaiADQZgBaiIAIAYQ+g8gAygCMEEBcUUNBSAAIAMoAjQiACAFIARBNGooAgAgBEE4aigCACAAQbiRxAAQmR8oAgBrIAUQzRIgAkEBNgIAIAcgAykCmAE3AgAgB0EIaiADQaABaigCADYCAAwECyACKAIcIQUgA0EoaiAEIAEQiCAgAygCKCADKAIsEMYVIAVNBEAgAkEANgIYIAJBADYCACACIAIoAiBBAWoiBTYCIAwDCyACQQE2AhggAiAFQQFqNgIcIAIoAiAhACADQQhqIAQgARCIICADIAMpAwg3ApgBIAMgA0GYAWoiASAFEPoPIAMoAgBBAXFFDQQgASADKAIEIgEgAEEBaiIAIARBNGooAgAgBEE4aigCACABQbiRxAAQmR8oAgBrIAAQzRIgAkEBNgIAIAcgAykCmAE3AgAgB0EIaiADQaABaigCADYCAAwDCwJAAkACQAJAIAIoAhBFBEAgBCgC2AIiAUUNAyABIAQoAtQCTQ0BDAMLIAIoAhQhASACKAIYDQEgAigCICEFDAMLIAIoAhwhBiACKAIYIQogA0GQAWogBCABEIggIAMoApABIAMoApQBEMYVIAZBACAKGyIGTQ0BIAJBATYCGCACIAZBAWo2AhwgA0GIAWogBCABEIggIAMgAykDiAE3ApgBIANBgAFqIANBmAFqIgAgBhD6DyADKAKAAUEBcUUNBiAAIAMoAoQBIgAgBSAEQTRqKAIAIARBOGooAgAgAEG4kcQAEJkfKAIAayAFEM0SIAJBATYCACAHIAMpApgBNwIAIAdBCGogA0GgAWooAgA2AgAMBQsgAigCHCEFIANB+ABqIAQgARCIICADKAJ4IAMoAnwQxhUgBU0EQCACQQA2AhggAkEANgIAIAIgAigCIEEBaiIFNgIgDAILIAJBATYCGCACIAVBAWo2AhwgAigCICEAIANB0ABqIAQgARCIICADIAMpA1A3ApgBIANByABqIANBmAFqIgEgBRD6DyADKAJIQQFxRQ0FIAEgAygCTCIBIABBAWoiACAEQTRqKAIAIARBOGooAgAgAUG4kcQAEJkfKAIAayAAEM0SIAJBATYCACAHIAMpApgBNwIAIAdBCGogA0GgAWooAgA2AgAMBAsgAkEANgIYIAIgATYCFCACQQE2AhAgAiAFNgIgIAJBADYCAAsgBEE8akEAIAgbIQggBEHIAGohDiAAKAIMIQYgACgCCCEKIARBCGohCyAEQQRqIQwgBEEgaiEPIARBHGohEANAIAUgCU8EQCACIAE2AhQgAkEBNgIQDAQLAkACQAJAIAUgBkkEQCAOIAUgCmotAAAiDWohESABIQADQAJAAkACfyAMKAIAIAsoAgAgAEH8jMQAEJofKAIEIgEEQCAQKAIAIA8oAgAgASARLQAAakGMjcQAEJkfKAIADAELIANB8ABqIAQgABCHICADIAMpA3A3AqgBA0AgA0GYAWogA0GoAWoQ9w4gAy0AmAFFDQIgAy0AmQEiASANSQ0ACyABIA1HDQEgAygAmgELIgFBAUcNAQsgDCgCACALKAIAIABBqJHEABCaHygCDCEADAELCyABIAQoAtACTQ0BIAUhAAwCCyAFIAZB0KnAABCbEAALIAIgATYCFCACQQE2AhAgAUUNBQJAIAQoAtQCIAFPBEAgAkKBgICAEDcCGCADQegAaiAEIAEQiCAgAyADKQNoNwKYASADQeAAaiADQZgBaiIAQQAQ+g8gAygCYEEBcUUNASAAIAMoAmQiACAFQQFqIgEgBEE0aigCACAEQThqKAIAIABBuJHEABCZHygCAGsgARDNEiACQQE2AgAgByADKQKYATcCACAHQQhqIANBoAFqKAIANgIADAcL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IgsNACAAIAFBCEEIELYiCw0AIAAgASACENIdQQALDQAgACABQQRBGBC2IgsMACAAIAEQpw9BAXMLDQAgACABIAIgAxCQGQsNACAAIAFBBEEkELYiCw8AIAAoAgAgACgCBBC4KQsNACAAIAFBAUECELYiCw4AIAAoAgBBDEEEEL0RCw0AIAAgAUEIQSAQtiILDAAgACABEMUVQQFzCw0AIAAgASACIAIQ6gsLDQAgACABKAIAIAIQMAsOACAAKAIAQQJBARC9EQsPACAAKAIEIAAoAggQyBoLDAAgAEEIaiABEOMfCwwAIABBCGogARDIGgsMACAAQQhqIAEQxxoLDwAgAEHghMQAQSAQihVFCw4AIAAgASAAKAIUEKwMCxAAQcQAEM0gIABBxAAQ9gYLDgAgACABQQRB2AAQtiILDwAgACgCACgCACABEP8HCw8AIAAoAgAgASgCABDgAwsSACAAELkkIABBgICAgHg2AgALDQAgACABQQhBGBC2IgsPACAAKAIAIAAoAgQQpyQLEAAgACABQdGt4ABBARCwGwsQACAAIAFBra7gAEEEELAbCxAAIAAgAUGJreAAQQEQsBsLEAAgACABQcit4ABBARCwGwsNACAAIAEgAhDWHUEACw0AIAAgASACIAMQzR8LDQAgASAAQf8BcRCdIAsNACAAIAFBCEEoELYiCw4AIAAgAUEIQdgAELYiCw0AIAAgAUEIQTgQtiILDQAgACABQQhBMBC2IgsOACAAIAFBCEHAABC2IgsOACAAIAFBCEHIABC2IgsOACAAIAFBCEHQABC2IgsPACAAELkoIAAoAgQQvCgLDAAgACABELYdQQFzCw8AIAAoAgAgASgCABD6AwsNACAAIAFBAEEAELgCCxAAQYABEO8iIABBgAEQ9gYLEABB2AAQ7yIgAEHYABD2BgsPACAAEL8oIAAoAgQQvCgLDgBBKBDvIiAAQSgQ9gYLDwAgABDaAiAAKAIEELwoCw8AIAAQzyggACgCBBC8KAsPACAAEKACIAAoAgQQvCgLDwAgABC4IyAAKAIYEP8XCw8AIAAQxQMgACgCBBC8KAsPACAAELsCIAAoAgQQvCgLDwAgABDNAiAAKAIEELwoCw8AIAAQogIgACgCBBC8KAsOACAAQgA3AgQgABDGLQsOACAAQgA3AgwgABDzGgsOACAAQgA3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IAggB0HAqcAAEJsQAAsCQCABIAQoAtACSw0AQQAgAUUNAxogASAEKALUAksNACADQThqIAQgARCIICADIAMpAzg3AuABIANBMGogA0HgAWpBABD6DyADKAIwQQFxBEAgA0HsAWogAygCNCIAIAVBAWoiASAEQTRqKAIAIARBOGooAgAgAEG4kcQAEJkfKAIAayABEM0SDAMLDAsLIAVBAWohBQwACwALIAYgAykC7AE3AgQgBkEMaiADQfQBaigCADYCAEEBCzYCAAwGCwJAIAQoAtgCIgFFDQAgASAEKALUAksNACADQagBaiAEIAEQiCAgAyADKQOoATcC7AEgA0GgAWogA0HsAWpBABD6DyADKAKgAUEBcUUNByADQeABaiADKAKkASIAIAUgBEE0aigCACAEQThqKAIAIABBuJHEABCZHygCAGsgBRDNEiAGQQE2AgAgBkEMaiADQegBaigCADYCACAGIAMpAuABNwIEDAYLIANB7AFqIAAgBEFAayILKAIAIAIoAggiCCACKAIMIgcgBSAMEM4dAkACQAJAIAMoAuwBIgBBAWsOAgEAAgsgBEHIAGohDSADKALwASECIARBCGohCSAEQQRqIQogBEEgaiEOIARBHGohDwNAIAwgAiIFTQRAIAZBADYCAAwJCwJAIAUgB0kEQCANIAUgCGotAAAiAmohECABIQADQAJAAn8gCigCACAJKAIAIABB/IzEABCaHygCBCIBBEAgDygCACAOKAIAIAEgEC0AAGpBjI3EABCZHygCAAwBCyADQZgBaiAEIAAQhyAgAyADKQOYATcChAIDQCADQewBaiADQYQCahD3DiADLQDsAUUNAiADLQDtASIBIAJJDQALIAEgAkcNASADKADuAQsiAUEBRw0DCyAKKAIAIAkoAgAgAEGokcQAEJofKAIMIQAMAAsACyAFIAdBwKnAABCbEAALAkAgASAEKALQAksNACABBEACQCAEKALUAiABTwRAIANBkAFqIAQgARCIICADIAMpA5ABNwLsASADQYgBaiADQewBakEAEPoPIAMoAogBQQFxDQEMDQsgA0HsAWogBCgCPCALKAIAIAggByAFIAwQzh0gA0GAAWogAygC7AEgAygC8AEQpiEgAygCgAFFBEAgBkEANgIADAwLIAMoAoQBIgIgBUsNAwwCCyADQeABaiADKAKMASIAIAVBAWoiASAEQTRqKAIAIARBOGooAgAgAEG4kcQAEJkfKAIAayABEM0SIAZBATYCACAGQQxqIANB6AFqKAIANgIAIAYgAykC4AE3AgQMCgsgBkEANgIADAkLIAVBAWohAgwACwALIAYgAykC8AE3AgQgBkEMaiADQfgBaigCADYCAAsgBiAANgIADAULIAYgAykC8AE3AgQgBkEMaiADQfgBaigCADYCAAsgBiAANgIADAMLIARByABqIQ4gAygC8AEhAiAEQQhqIQogBEEEaiELIARBOGohDyAEQTRqIRAgBEEgaiERIARBHGohEgNAAkACQCAMIAIiBUsEQAJAIAUgCEkEQCAOIAUgCWotAAAiAmohEyABIQADQAJAAn8gCygCACAKKAIAIABB/IzEABCaHygCBCIBBEAgEigCACARKAIAIAEgEy0AAGpBjI3EABCZHygCAAwBCyADQcgBaiAEIAAQhyAgAyADKQPIATcChAIDQCADQewBaiADQYQCahD3DiADLQDsAUUNAiADLQDtASIBIAJJDQALIAEgAkcNASADKADuAQsiAUEBRw0DCyALKAIAIAooAgAgAEGokcQAEJofKAIMIQAMAAsACyAFIAhBwKnAABCbEAALIAQoAtACIAFPBEAgAUUNAyAEKALUAiABTwRAIANBwAFqIAQgARCIICADIAMpA8ABNwLsASADQbgBaiADQewBakEAEPoPIAMoArgBQQFxDQMMCQsgA0HsAWogBCgCPCANKAIAIAkgCCAFIAwQzh0gA0GwAWogAygC7AEgAygC8AEQpiEgAygCsAFFBEAgBkEANgIADAgLIAMoArQBIgIgBUsNBAsgBUEBaiECDAMLIAYgAykC4AE3AgQgBiAHNgIAIAZBDGogA0HoAWooAgA2AgAMBQtBASEHIANB4AFqIAMoArwBIgAgBUEBaiICIBAoAgAgDygCACAAQbiRxAAQmR8oAgBrIAIQzRIMAQsLIAYgAykC4AE3AgQgBiAHNgIAIAZBDGogA0HoAWooAgA2AgAMAgsgA0HgAWohAgsgBiAHNgIAIAYgAikCADcCBCAGQQxqIAJBCGooAgA2AgALIANBkAJqJAAMAQtByJHEABC8KQALCwwAIAAoAgAgARDBGQu1FgETfyAAIQUgASEDIwBBMGsiBCQAAkACQAJAAkAC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DQsgAygCVCIAIAJLDQILIAJBAWohAAwBCwsgBkH/////B3ELIgEgAkEBaiIAIAVBEGooAgAgBUEUaigCACABQfiQxAAQmR8oAgBrIAAQzRIgCEEBNgIAIAhBDGogA0GYAWooAgA2AgAgCCADKQKQATcCBAwICyAIQQA2AgAMBwsMDAsgCCADKQKkATcCBCAIQQxqIANBrAFqKAIANgIACyAIIAA2AgAMBAsgAEECagsiBCANTw0FIANBkAFqAn8gDiAEQQJ0aigCACIAQQBOBEAgDSAEQQFqIgRLBEAgDiAEQQJ0aigCAAwCCwwFCyAAQf////8HcQsiACAGIAVBEGooAgAgBUEUaigCACAAQfiQxAAQmR8oAgBrIAYQzRIgBSgCHCEEQQEhCQsgA0GgAWogBCAFQSBqIhQoAgAgAigCCCISIAIoAgwiDyAGIBUQzh0CQAJAAkACQCADKAKgASIAQQFrDgIBAAILIAVBLGohEyADKAKkASEAIAVBCGohCyAFQQRqIREgBUEUaiEODAILIAggAykCpAE3AgQgCEEMaiADQawBaigCADYCAAsgCCAANgIADAILAkADQAJAAkAgFSAAIgJLBEAgACAPSQRAIBMgACASai0AAGotAAAiB0ECaiEGIAEhAANAAkACQAJAAkACQAJAAkAgESgCACALKAIAIABByI/EABCZHygCACIBQf8BcUH+AWsOAgECAAsgA0GAAWogESgCACALKAIAIABBAmoiDEHYj8QAEMsbIAFBAnZBP3EgAUEDcUEAR2oiCiADKAKEASIBSw0SIAMoAoABIQ0gCkECdCEEQX8hAQNAIARFDQYgAUEBaiEBIAcgDSgCACIQQf8BcUYNAyAHIBBBCHZB/wFxRg0EIAcgEEEQdkH/AXFGDQUgDUEEaiENIARBBGshBCAHIBBBGHZHDQALIBEoAgAgCygCACAKIAxqIAFBAnRqQQNqQfiPxAAQmR8oAgAhAQwKCyAHIBEoAgAgCygCACAAQbiQxAAQmR8tAAFGDQgMBAsgESgCACALKAIAIAAgBmpB2JDEABCZHygCACIBQQFGDQMMCAsgESgCACALKAIAIAogDGogAUECdGpBqJDEABCZHygCACEBDAcLIBEoAgAgCygCACAKIAxqIAFBAnRqQQFqQZiQxAAQmR8oAgAhAQwGCyARKAIAIAso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IAEQ9hQLDAAgACgCACABEK0KCwwAIAAoAgAgARCjFgsMACAAKAIAIAEQ5goLDAAgACgCACABELsUCwwAIAAoAgAgARDFEwsMACAAKAIAIAEQ4xoLDAAgACgCACABEIsUCwwAIAAoAgAgARDeEQsMACAAKAIAIAEQ+SoLDAAgACgCACABEPUbCwwAIAAoAgAgARCKGQsMACAAKAIAIAEQ/SoLCwAgAEEBOgAMQQELDAAgACgCACABENoHCwwAIAAoAgAgARDtAwsMACAAKAIAIAEQuggLCwAgAEEEQQQQvRELCwAgAEEgQQgQvRELkBACDH8BfiAAKAIAIQIjAEHwAWsiACQAIAEtADkhCiABQQE6ADkgAEEDNgIwAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkBBByACKAIAIgNBDGsiBCAEQSZPG0EBaw4kAAECAwQFBgcICQoLDA0hDg8QERIhExQVISEWFxgZGhscHSEeIQsgAigCDEEEdCEDIAIoAgghAgNAIANFDSEgAigCAEECRwRAIAJBDGogARC7KwsgAkEQaiECIANBEGshAwwACwALIAEgAkEEahC1AwwfCyABIAJBCGoQ1QQMHgsgAkEEaiABELsrDB0LIAJBDGogARC7KwwcCyACQQRqIAEQuysgAkEIaiABELsrDBsLIAJBOGoCQAJAAkACQAJAAkACQAJAAkACQAJAAkAgA0EBaw4LAQIDBAUGBwgJCwoACyABIAJBCGoQtBkMCgsgAkEIaiABEPweDAkLIAEgAkEIahDhIQwICyACQQRqIAEQuysMBwsgAkEEaiABENkYDAYLIAEgAkEEahC1IAwFCyABIAJBBGoQtSAMBAsgAkEEaiABELsrDAMLIAEgAkEEahC1IAwCCyACQQRqIAEQsyUMAQsgAkEIaiEDAkACQCACKAIEQQFrDgIBAgALIAMgARD5FAwBCyADIAEQhA0LIAEQuysMGgsgAkEIaiABEPweDBkLIAEgAkEIahDhIQwYCyACQQRqIAEQuysgAkEIaiABELsrIAJBDGogARC7KwwXCyACLQAYQQVGBEAgAkEQaiABELsrCyACQQRqIAEQ2hggAkEoaiABELkjDBYLIAJBEGogARC7KyACKAIEQYCAgIB4RwRAIAJBBGogARDaGAsgAkEgaiABELkjDBULIAJBBGogARD+GQwUCyACQQhqIAEQuA8MEwsgAkEEaiABEP4ZDBILIAJBBGogARC7KyACQRhqIAEQuSMgAigCCCABEP4ZDBELIAIoAhAhB0EYIQhBACEEIAEoAjAQpxEhBSAAQeAAakHYluMAKQMAIg43AwBBCCEDIABB0ABqIA43AwAgAEH8AGogAUE0aigCADYCACAAQQE6AHAgACABNgJoIAAgBTYCbCAAQQE6AIEBIABB0JbjACkDACIONwNYIAAgDjcDSCAAIAEpAiw3AnQgACABLQA8OgCEASAAIAEvATo7AYIBIAEtADghBSAAIAEtAD06AIUBIAAgBToAgAEgAkEgaiAAQcgAahC2DSAALQCBASELIABBADoAgQEgACACKAIIIgUgAigCDCIMQShsajYCrAEgACAFNgKoASAAQQA2ApgBIABBADYCiAEgAEEYaiAAQYgBaiIGEJAJIAACfyAAKQMYIg5QBEAgBhDeKEEADAELIAAoAiAhBCAAQbwBaiIGIABBiAFqIgkQshAgAEEQakEEIAAoArwBQQFqIgNBfyADGyIDIANBBE0bQQhBEBDnFCAAKAIQIQ0gACgCFCIDIAQ2AgggAyAONwMAIABBATYCuAEgACADNgK0ASAAIA02ArABIAYgCUEoEPYGGkEBIQQDQCAAIABBvAFqIgYQkAkgACkDACIOUEUEQCAAKAIIIQkgACgCsAEgBEYEQCAAQeQBaiAGELIQIABBsAFqIAAoAuQBQQFqIgNBfyADGxD7HiAAKAK0ASEDCyADIAhqIgYgCTYCACAGQQhrIA43AwAgACAEQQFqIgQ2ArgBIAhBEGohCAwBCwtCABDWJiAAQbwBahDeKCAAKAK0ASEDIAAoArABCzYCxAEgACADNgK8ASAAIAMgBEEEdCIEaiIINgLIAQNAIAQEQCAAQcgAaiADKQMAQQEQywggBEEQayEEIANBEGohAwwBBQJAIAAgCDYCwAEgDEEobCEDIABBvAFqEP0WA0AgA0UNASADQShrIQMgBSAAQcgAahC1ESAFQShqIQUMAAsACwsLIAAgCzoAgQEgBygCAEGAgICAeEYNDiAAKAJsIAdBFGoQ2yEgAC0AhQEiA0UEQCAAIAcoAggEfyAHKAIEIgQoAgAgBEEEaigCABC1FAVBAAs6AIUBCyAAQcgAaiAHEKMLIAAgAzoAhQEMDwsjAEFAaiIDJAAgAkEIaiICKAIYQTBqIAEQnCUgASgCMBCnESEEIANBGGpB2JbjACkDACIONwMAIANBCGogDjcDACADQTRqIAFBNGooAgA2AgAgA0EBOgAoIAMgATYCICADIAQ2AiQgA0HQluMAKQMAIg43AxAgAyAONwMAIAMgASkCLDcCLCADIAEtADw6ADwgAyABLwE6OwE6IAEtADghBCADIAEtAD06AD0gAyAEOgA4IANBADoAOSACIAMQwiMgA0EBOgA5IAJBGGogAxDIASADEOEoIANBQGskAAwPCyACKAIMRQ0OIAJBDGogARC7KwwOCyACQQRqIAEQuysMDQsgAkEEaiABELsrDAwLIAJBIGogARCDHwwLCyACKAIEIAEQpAsMCgsgAkEEaiABELkPDAkLIAEgAkEEahC1IAwICyACQQRqIAEQuysMBwsgAkEEaiABELsrDAYLIAEgAkEEahC1IAwFCyACQQRqIAEQsyUMBAsgASACQQRqELUgDAMLIAJBBGogARDZGAwCCyAHQQRqIABByABqELsrCyACQSRqIABByABqIgIQsCUgAhDhKAsgASAKOgA5IABBKGoQxxQgAEHwAWokAAuoBwICfwJ+AkAgACgCACIAKAIAIgJBGkYEQCABKAIAQQFHDQEgASgCBCICIAAoAhhHDQEgACkDCBDaGiEEIAApAxAhBSAALQAcIQNBwABBCBCMICIBIAM6ABwgASACNgIYIAFCADcDECABIAQ3AwggAUEaNgIAQa7B3wBBARC5GiEEIAAQpQIgACABNgIoIAAgBTcDICAAQgA3AxggACAENwMQIABBADYCCCAAQRQ2AgAMAQsCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQEEHIAJBDGsiAyADQSZPG0EBaw4kAAECEhMDBAUGBwgJFRYWFQoLDA0WEhIOFhYPEBISEhISEhYRFgsgACgCDEEEdCECIAAoAgghAANAIAJFDRYgACgCAEECRwRAIABBDGogARC8KwsgAEEQaiEAIAJBEGshAgwACwALIABBBGogARDlCQwUCyAAQQhqIAEQyCsMEwsgAEEEaiABELwrIABBCGogARC8KwwSCyAAQThqAkACQAJAAkACQAJAAkACQAJAAkACQCACQQFrDgsAAQIDBAUGBwgKCQoLIABBCGogARD9HgwJCyAAQQhqIAEQ0SEMCAsgAEEEaiABELwrDAcLIABBBGogARCRHAwGCyAAQQRqIAEQvCsMBQsgAEEEaiABELwrDAQLIABBBGogARC8KwwDCyAAQQRqIAEQvCsMAgsgAEEEaiABELwrDAELIABBCGohAgJAAkAgACgCBEEBaw4CAQIACyACIAEQghcMAQsgAiABELcOCyABELwrDBELIABBCGogARD9HgwQCyAAQQhqIAEQ0SEMDwsgAEEEaiABELwrIABBCGogARC8KwwLCyAALQAYQQVGBEAgAEEQaiABELwrCwwLCyAAQRBqIAEQvCsgACgCBEGAgICAeEYNDAwKCyAAQQRqIAEQvCsgACgCCCABEP0ZDAsLIAAoAgxBKGwhAiAAKAIIIQMDQCACBEAgAyABEJgUIAJBKGshAiADQShqIQMMAQsLIAAoAhAiACgCAEGAgICAeEcEQCAAIAEQgBoMCwsMBgsgAEEIaiABEMkrDAkLIAAoAgxFDQgMBQsgAEEIahDkIQwHCyAAKAIEIAEQngwMBgsgAEEEaiABELoPDAULIABBBGogARCRHAwECyAAQQRqIAEQvCsMAwsgAEEMaiABELwrDAILIABBBGogARDbGAwBCyAAQQRqIAEQ/RkLC6UGAQJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAQQcgACgCACIAKAIAIgJBDGsiAyADQSZPG0EBaw4kAAECExQDBAUGBwgJFgoXFgsMDQ4XExMPFxcQERMTExMTExcSFwsgACgCDEEEdCECIAAoAgghAANAIAJFDRcgACgCAEECRwRAIABBDGogARC9KwsgAEEQaiEAIAJBEGshAgwACwALIABBBGogARD/CAwVCyABIABBCGoQsREMFAsgAEEEaiABEL0rIABBCGogARC9KwwTCyAAQThqAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAJBAWsOCwECAwQFBgcICQsKAAsgAEEIaiABEMgtDAoLIABBCGogARD+HgwJCyABIABBCGoQ0iEMCAsgAEEEaiABEL0rDAcLIABBBGogARCSHAwGCyAAQQRqIAEQvSsMBQsgAEEEaiABEL0rDAQLIABBBGogARC9KwwDCyAAQQRqIAEQvSsMAgsgAEEEaiABEL0rDAELIABBCGohAgJAAkAgACgCBEEBaw4CAQIACyACIAEQ/hYMAQsgAiABEO8NCyABEL0rDBILIABBCGogARD+HgwRCyABIABBCGoQ0iEMEAsgAEEEaiABEL0rIABBCGogARC9KwwMCyAALQAYQQVGBEAgAEEQaiABEL0rCwwMCyAAQRBqIAEQvSsgACgCBEGAgICAeEYNDQwLCyABIABBCGoQ+ggMDAsgAEEEaiABEL0rIAEgACgCCBD2GQwLCyAAKAIMQShsIQIgACgCCCEDA0AgAgRAIAMgARCyESACQShrIQIgA0EoaiEDDAELCyAAKAIQIgAoAgBBgICAgHhHBEAgACABEPcZDAsLDAYLIABBCGogARChJwwJCyAAKAIMRQ0IDAULIABBCGogARD1HQwHCyAAKAIEIAEQ/QsMBgsgAEEEaiABELUPDAULIABBBGogARCSHAwECyAAQQRqIAEQvSsMAwsgAEEMaiABEL0rDAILIABBBGogARDdGAwBCyABIABBBGoQ9hkLCwwAIAAoAgAgARCyEQsLACABIAAoAgAQTQvkBQECfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAQQcgACgCACIAKAIAIgJBDGsiAyADQSZPG0EBaw4kAAECEhMDBAUGBwgJFBUVFAoLDA0VEhIOFRUPEBISEhISEhURFQsgACgCDEEEdCECIAAoAgghAANAIAJFDRUgACgCAEECRwRAIABBDGogARDAKwsgAEEQaiEAIAJBEGshAgwACwALIABBBGogARDRCwwTCyAAQQhqIAEQwysMEgsgAEEEaiABEMArIABBCGogARDAKwwRCyAAQThqAkACQAJAAkACQAJAAkACQAJAAkACQCACQQFrDgsAAQIDBAUGBwgKCQoLIABBCGogARCBHwwJCyABIABBCGoQ1yEMCAsgAEEEaiABEMArDAcLIABBBGogARCVHAwGCyAAQQRqIAEQwCsMBQsgAEEEaiABEMArDAQLIABBBGogARDAKwwDCyAAQQRqIAEQwCsMAgsgAEEEaiABEMArDAELIABBCGohAgJAAkAgACgCBEEBaw4CAQIACyACIAEQgBcMAQsgAiABELYOCyABEMArDBALIABBCGogARCBHwwPCyABIABBCGoQ1yEMDgsgAEEEaiABEMArIABBCGogARDAKwwLCyAAQQRqAkAgAC0AGEEFRw0AIABBEGoiACABEMArIAAoAgBBlMfgAEEEEO8eRQ0AIAFBAToAAAsgARDgGAwMCyAAQRBqIAEQwCsgACgCBEGAgICAeEYNCyAAQQRqIAEQ4BgMCwsgAEEEaiABEMArIAAoAgggARD6GQwKCyAAQQRqIAEQwxIMCQsgAEEIaiABEMQrDAgLIAAoAgxFDQcMBQsgAEEgahCzIAwGCyAAKAIEIAEQnQwMBQsgAEEEaiABELcPDAQLIABBBGogARCVHAwDCyAAQQRqIAEQwCsMAgsgAEEMaiABEMArDAELIABBBGogARD6GQsL5wUBAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkBBByAAKAIAIgAoAgAiAkEMayIDIANBJk8bQQFrDiQAAQITFAMEBQYHCAkWChcWCwwNDhcTEw8XFxARExMTExMTFxIXCyAAKAIMQQR0IQIgACgCCCEAA0AgAkUNFyAAKAIAQQJHBEAgAEEMaiABEMErCyAAQRBqIQAgAkEQayECDAALAAsgAEEEaiABEKcKDBULIABBCGogARCiJwwUCyAAQQRqIAEQwSsgAEEIaiABEMErDBMLIABBOGoCQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAkEBaw4LAQIDBAUGBwgJCwoACyAAQQhqIAEQ4CgMCgsgAEEIaiABEP8eDAkLIAEgAEEIahDVIQwICyAAQQRqIAEQwSsMBwsgAEEEaiABEJMcDAYLIABBBGogARDBKwwFCyAAQQRqIAEQwSsMBAsgAEEEaiABEMErDAMLIABBBGogARDBKwwCCyAAQQRqIAEQwSsMAQsgAEEIaiECAkACQCAAKAIEQQFrDgIBAgALIAIgARD/FgwBCyACIAEQ8A0LIAEQwSsMEgsgAEEIaiABEP8eDBELIAEgAEEIahDVIQwQCyAAQQRqIAEQwSsgAEEIaiABEMErDAwLIAAtABhBBUYEQCAAQRBqIAEQwSsLDAwLIABBEGogARDBKyAAKAIEQYCAgIB4Rg0NDAsLIAEgACkDCCAAKAIYEOsaDAwLIABBBGogARDBKyAAKAIIIAEQ+BkMCwsgAEEEaiABEMISDAoLIABBCGogARCjJwwJCyAAKAIMRQ0IDAULIABBIGogARDCHQwHCyAAKAIEIAEQ/gsMBgsgAEEEaiABELYPDAULIABBBGogARCTHAwECyAAQQRqIAEQwSsMAwsgAEEMaiABEMErDAILIABBBGogARDeGAwBCyAAQQRqIAEQ+BkLCwwAIAEgACgCABDyAQsMACAAKAIYIAEQihILjwIBBX8gACgCGCIDIAEQihogAygCFEHYAGwhBSADKAIQIQYDQCACIAVHBEACQAJAAkACQAJAAkACQAJAIAIgBmoiACgCACIEQQRrQQAgBEEFa0EISRtBAWsOCAECAwQHBwUGAAsgACABEOQLDAYLIABBCGogARCqJQwFCyAAQSBqIAEQ4CsMBAsgASAAQQhqENghIABBPGogARCeJSAAQTBqIAEQihoMAwsgAEEkaiABEJ4lIABBLGogARCKGgwCCyAAQQRqIAEQ/BkMAQsgAEEIaiIEKAIAQQVHBEAgASAEENghCyAAQTxqIAEQniUgAEEwaiABEIoaCyACQdgAaiECDAELCyADQTBqIAEQniULDAAgACgCGCABEOEPCwwAIAEgACgCGBCnAwsMACAAKAIAIAEQmBQLDAAgACgCGCABEIkSCwwAIAAoAhggARDvBQsMACAAKAIAIAEQ0wQLDAAgACgCACABEIQJCwwAIAAoAgAgARCRBQsMACAAKAIAIAEQyxMLDAAgACgCACABEPkBCwwAIAEgACgCABCCHwsMACAAKAIAIAEQwgMLDAAgASAAKAIAEMoBCwwAIAAoAgAgARDMEwsMACAAKAIAIAEQlhQLDAAgACgCACABEPkECwwAIAAoAgAgARDNEwsMACAAKAIAIAEQtBELDAAgACgCACABENEECwwAIAAoAgAgARDOEwsMACAAKAIAIAEQkxELCwAgACgCACABEF8LDAAgASAAKAIAEPUfCwwAIAAoAgAgARCZFAsMACAAKAIAIAEQrwMLDAAgACgCACABEIgSCwwAIAEgACgCGBC6BAsMACAAKAIAIAEQihILDAAgACgCACABEIcSCwwAIAAoAgAgARDhDwsMACAAKAIAIAEQiRILDAAgASAAKAIAELEeCwwAIAAoAgAgARC1EQuBCAIFfwF+IAAoAgAhACMAQUBqIgIkACABLQA0BEAgAS0AOiEEIAEtADkhBSABQYECOwA5AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCAEECaw4SAAECAwQFERAPDg0MCwoJCAcGEgsgACgCBEGAgICAeEYEQCABKAIwEKcRIQMgAkEYakHYluMAKQMAIgc3AwAgAkEIaiAHNwMAIAJBNGogAUE0aigCADYCACACQQE6ACggAiABNgIgIAIgAzYCJCACQQE6ADkgAkHQluMAKQMAIgc3AxAgAiAHNwMAIAIgASkCLDcCLCACIAEvADs7ADsgAS0AOCEDIAIgAS0APToAPSACIAM6ADggAkEBOgA6IABBIGogAhC2DSAAQQhqIAIQixogAEEUaiACEOQrIAIQ4SgMEgsgASgCMBCnESEDIAJBGGpB2JbjACkDACIHNwMAIAJBCGogBzcDACACQTRqIAFBNGooAgA2AgAgAkEBOgAoIAIgATYCICACIAM2AiQgAkEBOgA5IAJB0JbjACkDACIHNwMQIAIgBzcDACACIAEpAiw3AiwgAiABLwA7OwA7IAEtADghAyACIAEtAD06AD0gAiADOgA4IAJBAToAOiAAQRxqIAIQtg0gAEEEaiACEIsaIABBEGogAhDkKyACEOEoDBELIABBEGogARDEHSAAQShqIAEQsiUMEAsgAEHQAGogAEEQaiEDAkAgAC0AREEERgRAIAMgARDEHQwBCyABIAMQ4iELIAFBgQI7ADkgARCyJQwPCyAAQQRqIAEQ5AIMDgsgAEEEaiABEOYrDA0LIAAoAgxBOGwhAyAAKAIIQTBqIQADQCADRQ0NIAEtADQEQCABQQE6ADkgACABEOYrCyADQThrIQMgAEE4aiEADAALAAsgASAAQQhqEOIhDAsLIAAtABxBAkcEQCAAQQhqIAEQuA8LIAFBgQI7ADkgAEEoaiABEM8jDAoLIAAoAghBhICAgHhIDQkgAEEIaiABEIwaDAkLIAFBADoAOSABIABBEGoQ4xggAUEBOgA5IABBQGsgARC1JSABQQE6ADkgAEHEAGogARC1JQwICyAAQQRqIAEQ5isgAEEIaiABEOYrDAcLIABBBGogARDmKyABQYECOwA5DAYLIABBBGogARDmKwwFCyABIABBEGoQ4xggAUEBOgA5DAQLIABB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DAMLIABBDGogARDnLAwCCyAAQQRqIAEQ7xgMAQsgAEEEaiABEJYaCwsMACAAKAIYIAEQkBILDAAgACgCGCABEPAFCwwAIAAoAgAgARCaFAsMACAAKAIAIAEQkRILDAAgACgCACABEJsUCwwAIAEgACgCABCoCQsMACAAKAIAIAEQnRQLDAAgACgCGCABEJMSCwwAIAAoAhggARDxBQsMACAAKAIAIAEQzgMLDAAgACgCACABEJUaCwwAIAAoAgAgARChDAsMACAAKAIAIAEQgAwLDAAgACgCACABELoLCwwAIAAoAgAgARD/CwsMACAAKAIAIAEQogwLDAAgARDWJiAAENYaCwwAIAAoAgAgARCQEgsMACAAKAIAIAEQkxILDAAgACgCACABEJISCwwAIAAoAgAgARCSBQsMACAAKAIAIAEQ1RMLDAAgACgCACABENIECwwAIAAoAgAgARDTEwsMACAAKAIAIAEQkwULDAAgACgCACABENQTCwwAIAEgACgCABCSAQsMACABIAAoAgAQ1gMLTQECfyAAKAIAIgAoAghBBnQhAiAAKAIEIQMDQCACBEAgAyABEIAmIAJBQGohAiADQUBrIQMMAQsLIABBDGogARClGiAAQRhqIAEQ9CMLDAAgACgCGCABEJIJCwwAIAAoAgAgARDWBAsMACAAKAIAIAEQ1hMLDAAgACgCACABEPQECwwAIAAoAgAgARDXEwsMACAAKAIAIAEQwAsLDAAgACgCACABEKMMCwoAIAAQ6A4aQQELDAAgACgCACABEIAJCwwAIAAoAgAgARCXEgsLACAAIAEQ3Q9BAAsMACAAIAEpAhA3AwALDAAgARD3IyAAENYmCwoAIAAgASACEGcLDAAgASAAKAIYEOIBCwwAIAAoAhggARD3CgsMACAAKAIAIAEQ/QELDAAgACgCACABEPcKCwsAIAAgASACEMYYCwwAIAAoAgAgARCWEAt6AQJ/IAAoAgAiACgCCEE4bCECIAAoAgQiAEEUaiEDA0AgAgRAAkAgAC0ANEEBRw0AIAAoAgANACABIAEoAhwgASgCICADKAIAEMYPEIMeCyAAIAEQlhAgAEEwaiABEJcmIAJBOGshAiADQThqIQMgAEE4aiEADAELCwsLACAAKAIAIAEQWQsMACAAKAIAIAEQlAULQwEBfyAAKAIAIgAoAghB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AAAAAAAIAAAABAAAAD0DAAA+AwAABAAAAAQAAAA/AwAAQAMAAEEDAABCAwAABAEAAAQAAABDAwAARAMAAGVycm9yIHN0cmluZyBzaG91bGQgYmUgdXRmOC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3N3Y19lcnJvcl9yZXBvcnRlcnMtMi4wLjAvc3JjL2hhbmRsZXIucnMAAM8hEABnAAAAbwAAACwAAABFAwAAFAAAAAQAAACqAgAAYmluZGluZ190eXBlc2NyaXB0X3dhc20vc3JjL2xpYi5ycwAAWCIQACIAAAAhAAAAIwAAAHRzeACMIhAAAwAAAGyIFgAKAAAAdmVyYmF0aW1Nb2R1bGVTeW50YXhuYXRpdmVDbGFzc1Byb3BlcnRpZXNpbXBvcnROb3RVc2VkQXNWYWx1ZXNub0VtcHR5RXhwb3J0aW1wb3J0RXhwb3J0QXNzaWduQ29uZmlndHNFbnVtSXNNdXRhYmxlcmVtb3ZlcHJlc2VydmUSIxAABgAAABgjEAAIAAAAQ2xhc3NpY1ByZXNlcnZlTm9kZU5leHRFc05leHQAAAAwIxAABwAAADcjEAAIAAAAPyMQAAgAAABHIxAABgAAAKAiEAAUAAAAtCIQABUAAADJIhAAFQAAAN4iEAANAAAA6yIQABgAAAADIxAADwAAAGludmFsaWQgbGVuZ3RoIACgIxAADwAAAIYDFgALAAAAZHVwbGljYXRlIGZpZWxkIGAAAADAIxAAEQAAAJoWGAABAAAAdW5rbm93biB2YXJpYW50IGBgLCBleHBlY3RlZCAAAADkIxAAEQAAAPUjEAAMAAAARgMAAEcDAABIAwAASQMAAEoDAABjYWxsZWQgYE9wdGlvbjo6dW53cmFwX3Rocm93KClgIG9uIGEgYE5vbmVgIHZhbHVlY2FsbGVkIGBSZXN1bHQ6OnVud3JhcF90aHJvdygpYCBvbiBhbiBgRXJyYCB2YWx1ZWNvcmUvc3JjL251bS9kZWMyZmx0L2RlY2ltYWwucnMAAACKJBAAHwAAAFEAAAAnAAAAiiQQAB8AAAB9AAAAEwAAAIokEAAfAAAAoQAAACAAAACKJBAAHwAAALgAAAAlAAAAiiQQAB8AAADlAAAAFQAA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LXplcm8gdHJhaWxpbmcgYml0c2ludmFsaWQgcGFkZGluZyBsZW5ndGggYXQgAAAAAQAAAAAAAAAhehAABAAAAExlbmd0aFRyYWlsaW5nUGFkZGluZ0RlY29kZUVycm9ycG9zaXRpb24vcnVzdC9kZXBzL2hhc2hicm93bi0wLjE1LjAvc3JjL3Jhdy9tb2QucnMAAGB6EAAqAAAAVAAAACgAAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9oc3RyLTAuMi4xMi9zcmMvZ2xvYmFsX3N0b3JlLnJzAACcehAAXgAAAAsAAAAgAAAAL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvaHN0ci0wLjIuMTIvc3JjL2xpYi5yc25vdCB5ZXQgaW1wbGVtZW50ZWQ6IHN0YXRpYyBoYXNoAAAAYXsQACAAAAAMexAAVQAAAOsAAAARAAAAbm90IHlldCBpbXBsZW1lbnRlZDogc3RhdGljIGFzX3N0cgAAnHsQACIAAAAMexAAVQAAAPsAAAARAAAADHsQAFUAAAAAAQAAPAAAAHJldHVybiB0aGlzADcuFgBqAAAATQAAAC4AAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9tZW1jaHItMi43LjQvc3JjL2FyY2gvYWxsL3R3b3dheS5ycwAABHwQAGIAAAC/AAAALgAAAAR8EABiAAAAxwAAACkAAAAEfBAAYgAAAMwAAAA0AAAABHwQAGIAAADUAAAAJAAAAAR8EABiAAAA1AAAADEAAAAEfBAAYgAAANcAAAAiAAAABHwQAGIAAADXAAAAMwAAAAR8EABiAAAA8QAAAC4AAAAEfBAAYgAAAPgAAAApAAAABHwQAGIAAAD9AAAANAAAAAR8EABiAAAABAEAABgAAAAEfBAAYgAAAAQBAAAlAAAABHwQAGIAAADCAQAAHQAAAAR8EABiAAAAwwEAABkAAAAEfBAAYgAAAAoCAAAbAAAAL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvbWVtY2hyLTIuNy40L3NyYy9hcmNoL2FsbC9tb2QucnMAWH0QAF8AAAAsAAAAHgAAADxzZWFyY2hlciBmdW5jdGlvbj4AyH0QABMAAABjYWxsPHNlYXJjaGVyIGtpbmQgdW5pb24+AAAA6H0QABUAAABGaW5kZXJoYXNoAAAXAwAADAAAAAQAAABQAwAAUQMAAFIDAEG0/MEAC6IBAQAAABsDAAAAAAAACAAAAAQAAADYAgAAYXNzZXJ0aW9uIGZhaWxlZDogbGluZV9yYW5nZS5jb250YWlucygmb2Zmc2V0KQAAbOIXAGUAAADJAwAACQAAAGziFwBlAAAA0wMAAB4AAABCYWQgdXRmOCBkZXRlY3RlZAAAAGziFwBlAAAApwQAAEAAAAAXAwAADAAAAAQAAABQAwAAUwMAAFIDAEHg/cEACy4BAAAAGwMAAGziFwBlAAAArQMAAC4AAAAXAwAADAAAAAQAAABQAwAAVAMAAFIDAEGY/sEACwYBAAAAVQMAQaj+wQALxQcBAAAAVgMAAElvRXJyb3JPdXRPZkJvdW5kcwAA3JUQAGcAAABoAAAAQgAAANyVEABnAAAAaQAAADQAAADclRAAZwAAAGoAAAAiAAAAVJYQAGoAAACEAAAAMQAAAFSWEABqAAAAhQAAADQAAABUlhAAagAAAIcAAAAlAAAAAAAAAAQAAAAAAAAAAQAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL251bS1iaWdpbnQtMC40LjYvc3JjL2JpZ3VpbnQvbXVsdGlwbGljYXRpb24ucnMAAAC0fxAAbQAAACwAAAAcAAAAY2Fycnkgb3ZlcmZsb3cgZHVyaW5nIG11bHRpcGxpY2F0aW9uIQAAADSAEAAlAAAAtH8QAG0AAAA5AAAABQAAALR/EABtAAAARwAAABMAAAC0fxAAbQAAAEgAAAAbAAAAtH8QAG0AAABPAAAAEwAAALR/EABtAAAAUAAAABsAAAC0fxAAbQAAAC0BAAAmAAAAtH8QAG0AAAAuAQAAJgAAALR/EABtAAAAMQEAACYAAAC0fxAAbQAAADIBAAAmAAAAtH8QAG0AAAAzAQAAJgAAALR/EABtAAAAkwEAACcAAAC0fxAAbQAAAJIBAAAmAAAAtH8QAG0AAADmAAAAGgAAALR/EABtAAAA5wAAABoAAAC0fxAAbQAAAPQAAAAWAAAAtH8QAG0AAAD1AAAAFgAAALR/EABtAAAAAAEAABYAAAC0fxAAbQAAABIBAAAeAAAAtH8QAG0AAAAPAQAAHgAAALR/EABtAAAAoAAAAB8AAAC0fxAAbQAAAKQAAAAWAAAAtH8QAG0AAABoAAAAHwAAALR/EABtAAAAuQEAAA8AAAC0fxAAbQAAALwBAAAPAAAAAJMQAFwAAAAfBAAAAQAAAGNodW5rIHNpemUgbXVzdCBiZSBub24temVybwD0gRAAGwAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL251bS1iaWdpbnQtMC40LjYvc3JjL2JpZ3VpbnQvY29udmVydC5ycwAAGIIQAGYAAAAzAAAACgAAABiCEABmAAAAfQAAAA0AAAAYghAAZgAAAH8AAAAaAAAAGIIQAGYAAACHAAAAFwAAABiCEABmAAAAFgEAACYAAAAYghAAZgAAAGsCAAAXAAAAGIIQAGYAAADlAgAAHABBiIbCAAsFkRvUzxQAQZiGwgALFZVzwkgNAAAAABC/gQwAAACXnNt1CwBBuIbCAAs1kRvUzwoAAAAAypo7CQAAACtti4wJAAAAAAChGQgAAAAhEJ8wCAAAAADB9lcIAAAAgZvCmAgAQfiGwgALdXFFdRgHAAAAgLx9JAcAAAB7Zkc1BwAAAABAS0wHAAAAHW5aawcAAACA4ayUBwAAAGeD8coHAAAAAABkCwYAAABRSo0OBgAAAECuaRIGAAAASZEXFwYAAAAAELkcBgAAAJlIdCMGAAAAQKhzKwYAAABBO+Y0BgBB+IfCAAv1AcE8+kwGAAAAQNgTXAYAAAAZtZFtBgAAAAAQv4EGAAAAyeDtmAYAAABAPnezBgAAANHEu9EGAAAAAAAk9AYAAABJ0+cGBQAAAKAwygcFAAAAuyvDCAUAAAAAbNQJBQAAAP2s/woFAAAA4L5GDAUAAADvhqsNBQAAAAAAMA8FAAAA8TrWEAUAAAAgX6ASBQAAAOOqkBQFAAAAAHSpFgUAAAAlKO0YBQAAAGBNXhsFAAAAl4L/HQUAAAAAgNMgBQAAAJkX3SMFAAAAoDUfJwUAAAAL4ZwqBQAAAAA8WS4FAAAATYRXMgUAAADgE5s2BQAAAD9hJzsFAEH4icIAC/UDQaEoRQUAAAAgFKVKBQAAADNGeVAFAAAAAESpVgUAAAB1OTldBQAAAGByLWQFAAAA51qKawUAAAAAgFRzBQAAAOmPkHsFAAAAoFpDhAUAAABb0nGNBQAAAAAMIZcFAAAAnT9WoQUAAADgyBasBQAAAI8naLcFAAAAAABQwwUAAACRG9TPBQAAACBp+twFAAAAg/3I6gUAAAAAFEb5BQAAALGEHAMEAAAAEKtCAwQAAAAhLGoDBAAAAAAQkwMEAAAA4V69AwQAAAAQIekDBAAAAPFeFgQEAAAAACFFBAQAAADRb3UEBAAAABBUpwQEAAAAgdbaBAQAAAAAABAFBAAAAIHZRgUEAAAAEGx/BQQAAADRwLkFBAAAAADh9QUEAAAA8dUzBgQAAAAQqXMGBAAAAOFjtQYEAAAAABD5BgQAAAAhtz4HBAAAABBjhgcEAAAAsR3QBwQAAAAA8RsIBAAAABHnaQgEAAAAEAq6CAQAAABBZAwJBAAAAAAAYQkEAAAAwee3CQQAAAAQJhEKBAAAAJHFbAoEAAAAANHKCgQAAAAxUysLBAAAABBXjgsEAAAAoefzCwQAAAAAEFwMBAAAAGHbxgwEAAAAEFU0DQQAAABxiKQNBAAAAACBFw4EAAAAUUqNDgQAAAAQ8AUPBAAAAAF+gQ8EAEH4jcIAC/UHAYKBEAQAAAAQEAYRBAAAAFG2jREEAAAAAIEYEgQAAABxfKYSBAAAABC1NxMEAAAAYTfMEwQAAAAAEGQUBAAAAKFL/xQEAAAAEPedFQQAAAAxH0AWBAAAAADR5RYEAAAAkRmPFwQAAAAQBjwYBAAAAMGj7BgEAAAAAAChGQQAAABBKFkaBAAAABAqFRsEAAAAERPVGwQAAAAA8ZgcBAAAALHRYB0EAAAAEMMsHgQAAAAh0/weBAAAAAAQ0R8EAAAA4YepIAQAAAAQSYYhBAAAAPFhZyIEAAAAAOFMIwQAAADR1DYkBAAAABBMJSUEAAAAgVUYJgQAAAAAABAnBAAAAIFaDCgEAAAAEHQNKQQAAADRWxMqBAAAAAAhHisEAAAA8dItLAQAAAAQgUItBAAAAOE6XC4EAAAAABB7LwQAAAAhEJ8wBAAAABBLyDEEAAAAsdD2MgQAAAAAsSo0BAAAABH8YzUEAAAAEMKiNgQAAABBE+c3BAAAAAAAMTkEAAAAwZiAOgQAAAAQ7tU7BAAAAJEQMT0EAAAAABGSPgQAAAAxAPk/BAAAABDvZUEEAAAAoe7YQgQAAAAAEFJEBAAAAGFk0UUEAAAAEP1WRwQAAABx6+JIBAAAAABBdUoEAAAAUQ8OTAQAAAAQaK1NBAAAAAFdU08EAAAAAAAAUQQAAAABY7NSBAAAABCYbVQEAAAAUbEuVgQAAAAAwfZXBAAAAHHZxVkEAAAAEA2cWwQAAABhbnldBAAAAAAQXl8EAAAAoQRKYQQAAAAQXz1jBAAAADEyOGUEAAAAAJE6ZwQAAACRjkRpBAAAABA+VmsEAAAAwbJvbQQAAAAAAJFvBAAAAEE5unEEAAAAEHLrcwQAAAARviR2BAAAAAAxZngEAAAAsd6vegQAAAAQ2wF9BAAAACE6XH8EAAAAABC/gQQAAADhcCqEBAAAABBxnoYEAAAA8SQbiQQAAAAAoaCLBAAAANH5Lo4EAAAAEETGkAQAAACBlGaTBAAAAAAAEJYEAAAAgZvCmAQAAAAQfH6bBAAAANG2Q54EAAAAAGESoQQAAADxj+qjBAAAABBZzKYEAAAA4dG3qQQAAAAAEK2sBAAAACEprK8EAAAAEDO1sgQAAACxQ8i1BAAAAABx5bgEAAAAEdEMvAQAAAAQej6/BAAAAEGCesIEAAAAAADBxQQAAADBCRLJBAAAABC2bcwEAAAAkRvUzwQAAAAAUUXTBAAAADFtwdYEAAAAEIdI2gQAAAChtdrdBAAAAAAQeOEEAAAAYa0g5QQAAAAQpdToBAAAAHEOlOwEAAAAAAFf8AQAAABRlDX0BAAAABDgF/gEAAAAAfwF/AQAQZCWwgALBanmAAAKAEGglsIACxUJPQAABgAAAEC2AAAGAAAAp0EAAAUAQcCWwgALNanmAAAFAAAAECcAAAQAAAAxOQAABAAAAABRAAAEAAAAkW8AAAQAAAAQlgAABAAAAMHFAAAEAEGAl8IAC3UxEwAAAwAAAMgWAAADAAAAyxoAAAMAAABAHwAAAwAAAC0kAAADAAAAmCkAAAMAAACHLwAAAwAAAAA2AAADAAAACT0AAAMAAACoRAAAAwAAAONMAAADAAAAwFUAAAMAAABFXwAAAwAAAHhpAAADAAAAX3QAAAMAQYCYwgAL9QFhjAAAAwAAAIiZAAADAAAAe6cAAAMAAABAtgAAAwAAAN3FAAADAAAAWNYAAAMAAAC35wAAAwAAAAD6AAADAAAAkQYAAAIAAADkBgAAAgAAADkHAAACAAAAkAcAAAIAAADpBwAAAgAAAEQIAAACAAAAoQgAAAIAAAAACQAAAgAAAGEJAAACAAAAxAkAAAIAAAApCgAAAgAAAJAKAAACAAAA+QoAAAIAAABkCwAAAgAAANELAAACAAAAQAwAAAIAAACxDAAAAgAAACQNAAACAAAAmQ0AAAIAAAAQDgAAAgAAAIkOAAACAAAABA8AAAIAAACBDwAAAgBBgJrCAAv1A4EQAAACAAAABBEAAAIAAACJEQAAAgAAABASAAACAAAAmRIAAAIAAAAkEwAAAgAAALETAAACAAAAQBQAAAIAAADRFAAAAgAAAGQVAAACAAAA+RUAAAIAAACQFgAAAgAAACkXAAACAAAAxBcAAAIAAABhGAAAAgAAAAAZAAACAAAAoRkAAAIAAABEGgAAAgAAAOkaAAACAAAAkBsAAAIAAAA5HAAAAgAAAOQcAAACAAAAkR0AAAIAAABAHgAAAgAAAPEeAAACAAAApB8AAAIAAABZIAAAAgAAABAhAAACAAAAySEAAAIAAACEIgAAAgAAAEEjAAACAAAAACQAAAIAAADBJAAAAgAAAIQlAAACAAAASSYAAAIAAAAQJwAAAgAAANknAAACAAAApCgAAAIAAABxKQAAAgAAAEAqAAACAAAAESsAAAIAAADkKwAAAgAAALksAAACAAAAkC0AAAIAAABpLgAAAgAAAEQvAAACAAAAITAAAAIAAAAAMQAAAgAAAOExAAACAAAAxDIAAAIAAACpMwAAAgAAAJA0AAACAAAAeTUAAAIAAABkNgAAAgAAAFE3AAACAAAAQDgAAAIAAAAxOQAAAgAAACQ6AAACAAAAGTsAAAIAAAAQPAAAAgAAAAk9AAACAAAABD4AAAIAAAABPwAAAgBBgJ7CAAv1BwFBAAACAAAABEIAAAIAAAAJQwAAAgAAABBEAAACAAAAGUUAAAIAAAAkRgAAAgAAADFHAAACAAAAQEgAAAIAAABRSQAAAgAAAGRKAAACAAAAeUsAAAIAAACQTAAAAgAAAKlNAAACAAAAxE4AAAIAAADhTwAAAgAAAABRAAACAAAAIVIAAAIAAABEUwAAAgAAAGlUAAACAAAAkFUAAAIAAAC5VgAAAgAAAORXAAACAAAAEVkAAAIAAABAWgAAAgAAAHFbAAACAAAApFwAAAIAAADZXQAAAgAAABBfAAACAAAASWAAAAIAAACEYQAAAgAAAMFiAAACAAAAAGQAAAIAAABBZQAAAgAAAIRmAAACAAAAyWcAAAIAAAAQaQAAAgAAAFlqAAACAAAApGsAAAIAAADxbAAAAgAAAEBuAAACAAAAkW8AAAIAAADkcAAAAgAAADlyAAACAAAAkHMAAAIAAADpdAAAAgAAAER2AAACAAAAoXcAAAIAAAAAeQAAAgAAAGF6AAACAAAAxHsAAAIAAAApfQAAAgAAAJB+AAACAAAA+X8AAAIAAABkgQAAAgAAANGCAAACAAAAQIQAAAIAAACxhQAAAgAAACSHAAACAAAAmYgAAAIAAAAQigAAAgAAAImLAAACAAAABI0AAAIAAACBjgAAAgAAAACQAAACAAAAgZEAAAIAAAAEkwAAAgAAAImUAAACAAAAEJYAAAIAAACZlwAAAgAAACSZAAACAAAAsZoAAAIAAABAnAAAAgAAANGdAAACAAAAZJ8AAAIAAAD5oAAAAgAAAJCiAAACAAAAKaQAAAIAAADEpQAAAgAAAGGnAAACAAAAAKkAAAIAAAChqgAAAgAAAESsAAACAAAA6a0AAAIAAACQrwAAAgAAADmxAAACAAAA5LIAAAIAAACRtAAAAgAAAEC2AAACAAAA8bcAAAIAAACkuQAAAgAAAFm7AAACAAAAEL0AAAIAAADJvgAAAgAAAITAAAACAAAAQcIAAAIAAAAAxAAAAgAAAMHFAAACAAAAhMcAAAIAAABJyQAAAgAAABDLAAACAAAA2cwAAAIAAACkzgAAAgAAAHHQAAACAAAAQNIAAAIAAAAR1AAAAgAAAOTVAAACAAAAudcAAAIAAACQ2QAAAgAAAGnbAAACAAAARN0AAAIAAAAh3wAAAgAAAADhAAACAAAA4eIAAAIAAADE5AAAAgAAAKnmAAACAAAAkOgAAAIAAAB56gAAAgAAAGTsAAACAAAAUe4AAAIAAABA8AAAAgAAADHyAAACAAAAJPQAAAIAAAAZ9gAAAgAAABD4AAACAAAACfoAAAIAAAAE/AAAAgAAAAH+AAACAEGApsIAC4pRL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvbnVtLWludGVnZXItMC4xLjQ2L3NyYy9saWIucnMAkxAAXAAAAB4EAAABAAAAL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvbnVtLWJpZ2ludC0wLjQuNi9zcmMvYmlndWludC9kaXZpc2lvbi5ycwBskxAAZwAAABwAAAAGAAAAYXR0ZW1wdCB0byBkaXZpZGUgYnkgemVybwAAAOSTEAAZAAAAbJMQAGcAAABXAAAACQAAAGyTEABnAAAA3QAAADkAAABskxAAZwAAANIAAAAJAAAAbJMQAGcAAAAVAQAADgAAAGyTEABnAAAAFgEAAA4AAABskxAAZwAAACABAAAhAAAAbJMQAGcAAAAhAQAAGAAAAGyTEABnAAAAQgEAADwAAABskxAAZwAAAEYBAAApAAAAbJMQAGcAAABLAQAADwAAAGyTEABnAAAATgEAABsAAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9udW0tYmlnaW50LTAuNC42L3NyYy9iaWd1aW50L3NoaWZ0LnJzuJQQAGQAAAAoAAAAGQAAALiUEABkAAAASgAAACMAAABuZWdhdGl2ZSB2YWx1ZXMgYXJlIG5vbi16ZXJvL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvbnVtLWJpZ2ludC0wLjQuNi9zcmMvYmlnaW50L3NoaWZ0LnJzAFiVEABjAAAAZgAAACgAAAAAAAAABAAAAAQAAAA7AAAAL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvbnVtLWJpZ2ludC0wLjQuNi9zcmMvYmlndWludC9hZGRpdGlvbi5ycwDclRAAZwAAADsAAAAaAAAAL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvbnVtLWJpZ2ludC0wLjQuNi9zcmMvYmlndWludC9zdWJ0cmFjdGlvbi5ycwAAVJYQAGoAAAA0AAAAGgAAAFSWEABqAAAANQAAABoAAABDYW5ub3Qgc3VidHJhY3QgYiBmcm9tIGEgYmVjYXVzZSBiIGlzIGxhcmdlciB0aGFuIGEu4JYQADQAAABUlhAAagAAAEUAAAAFAAAAVJYQAGoAAABdAAAAGgAAAFSWEABqAAAAXgAAABoAAABhc3NlcnRpb24gZmFpbGVkOiBhX2hpLmlzX2VtcHR5KCkAAABUlhAAagAAAGIAAAAFAAAAVJYQAGoAAABlAAAABQAAAC9ydXN0Yy81NWEyMmQyYTYzMzM0ZTBmYWZmMDIwMmI3MmEzMWNlODMyYjU2MTI1L2xpYnJhcnkvY29yZS9zcmMvc2xpY2UvaXRlci5ycwAAkJcQAE4AAADxBQAAFQAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL251bS1pbnRlZ2VyLTAuMS40Ni9zcmMvcm9vdHMucnMAAPCXEABeAAAAgwEAAAEAAAAAAAAABAAAAAQAAAA7AAAAL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvb25jZV9jZWxsLTEuMTkuMC9zcmMvaW1wX3N0ZC5ycwAAcJgQAF4AAAChAAAANgAAAHCYEABeAAAAmwAAAAkAAAAzODsyOwAAAPCYEAAFAAAA5xMYAAEAAADnExgAAQAAADQ4OzI7AAAAEJkQAAUAAADnExgAAQAAAOcTGAABAAAAG1sxMjM0NTY3ODkbWzBtADuZEAAEAAAAMzAzMTMyMzMzNDM1MzYzNzM5OTA5MTkyOTM5NDk1OTY5NzQwNDE0MjQzNDQ0NTQ2NDc0OTEwMDEwMTEwMjEwMzEwNDEwNTEwNjEwNzM4OzI7MjQwOzI0ODsyNTUzODsyOzI1MDsyMzU7MjE1Mzg7MjswMDA7MjU1OzI1NTM4OzI7MTI3OzI1NTsyMTIzODsyOzI0MDsyNTU7MjU1Mzg7MjsyNDU7MjQ1OzIyMDM4OzI7MjU1OzIyODsxOTYzODsyOzAwMDswMDA7MDAwMzg7MjsyNTU7MjM1OzIwNTM4OzI7MDAwOzAwMDsyNTUzODsyOzEzODswNDM7MjI2Mzg7MjsxNjU7MDQyOzA0MjM4OzI7MjIyOzE4NDsxMzUzODsyOzA5NTsxNTg7MTYwMzg7MjsxMjc7MjU1OzAwMDM4OzI7MjEwOzEwNTswMzAzODsyOzI1NTsxMjc7MDgwMzg7MjsxMDA7MTQ5OzIzNzM4OzI7MjU1OzI0ODsyMjAzODsyOzIyMDswMjA7MDYwMzg7MjswMDA7MDAwOzEzOTM4OzI7MDAwOzEzOTsxMzkzODsyOzE4NDsxMzQ7MDExMzg7MjsxNjk7MTY5OzE2OTM4OzI7MDAwOzEwMDswMDAzODsyOzE4OTsxODM7MTA3Mzg7MjsxMzk7MDAwOzEzOTM4OzI7MDg1OzEwNzswNDczODsyOzI1NTsxNDA7MDAwMzg7MjsxNTM7MDUwOzIwNDM4OzI7MTM5OzAwMDswMDAzODsyOzIzMzsxNTA7MTIyMzg7MjsxNDM7MTg4OzE0MzM4OzI7MDcyOzA2MTsxMzkzODsyOzA0NzswNzk7MDc5Mzg7MjswMDA7MjA2OzIwOTM4OzI7MTQ4OzAwMDsyMTEzODsyOzI1NTswMjA7MTQ3Mzg7MjswMDA7MTkxOzI1NTM4OzI7MTA1OzEwNTsxMDUzODsyOzAzMDsxNDQ7MjU1Mzg7MjsxNzg7MDM0OzAzNDM4OzI7MjU1OzI1MDsyNDAzODsyOzAzNDsxMzk7MDM0Mzg7MjsyNTU7MDAwOzI1NTM4OzI7MjIwOzIyMDsyMjAzODsyOzI0ODsyNDg7MjU1Mzg7MjsyNTU7MjE1OzAwMDM4OzI7MjE4OzE2NTswMzIzODsyOzEyODsxMjg7MTI4Mzg7MjswMDA7MTI4OzAwMDM4OzI7MTczOzI1NTswNDczODsyOzI0MDsyNTU7MjQwMzg7MjsyNTU7MTA1OzE4MDM4OzI7MjA1OzA5MjswOTIzODsyOzA3NTswMDA7MTMwMzg7MjsyNTU7MjU1OzI0MDM4OzI7MjQwOzIzMDsxNDAzODsyOzIzMDsyMzA7MjUwMzg7MjsyNTU7MjQwOzI0NTM4OzI7MTI0OzI1MjswMDAzODsyOzI1NTsyNTA7MjA1Mzg7MjsxNzM7MjE2OzIzMDM4OzI7MjQwOzEyODsxMjgzODsyOzIyNDsyNTU7MjU1Mzg7MjsyNTA7MjUwOzIxMDM4OzI7MjExOzIxMTsyMTEzODsyOzE0NDsyMzg7MTQ0Mzg7MjsyNTU7MTgyOzE5MzM4OzI7MjU1OzE2MDsxMjIzODsyOzAzMjsxNzg7MTcwMzg7MjsxMzU7MjA2OzI1MDM4OzI7MTE5OzEzNjsxNTMzODsyOzE3NjsxOTY7MjIyMzg7MjsyNTU7MjU1OzIyNDM4OzI7MDAwOzI1NTswMDAzODsyOzA1MDsyMDU7MDUwMzg7MjsyNTA7MjQwOzIzMDM4OzI7MTI4OzAwMDswMDAzODsyOzEwMjsyMDU7MTcwMzg7MjswMDA7MDAwOzIwNTM4OzI7MTg2OzA4NTsyMTEzODsyOzE0NzsxMTI7MjE5Mzg7MjswNjA7MTc5OzExMzM4OzI7MTIzOzEwNDsyMzgzODsyOzAwMDsyNTA7MTU0Mzg7MjswNzI7MjA5OzIwNDM4OzI7MTk5OzAyMTsxMzMzODsyOzAyNTswMjU7MTEyMzg7MjsyNDU7MjU1OzI1MDM4OzI7MjU1OzIyODsyMjUzODsyOzI1NTsyMjg7MTgxMzg7MjsyNTU7MjIyOzE3MzM4OzI7MDAwOzAwMDsxMjgzODsyOzI1MzsyNDU7MjMwMzg7MjsxMjg7MTI4OzAwMDM4OzI7MTA3OzE0MjswMzUzODsyOzI1NTsxNjU7MDAwMzg7MjsyNTU7MDY5OzAwMDM4OzI7MjE4OzExMjsyMTQzODsyOzIzODsyMzI7MTcwMzg7MjsxNTI7MjUxOzE1MjM4OzI7MTc1OzIzODsyMzgzODsyOzIxOTsxMTI7MTQ3Mzg7MjsyNTU7MjM5OzIxMzM4OzI7MjU1OzIxODsxODUzODsyOzIwNTsxMzM7MDYzMzg7MjsyNTU7MTkyOzIwMzM4OzI7MjIxOzE2MDsyMjEzODsyOzE3NjsyMjQ7MjMwMzg7MjsxMjg7MDAwOzEyODM4OzI7MTAyOzA1MTsxNTMzODsyOzI1NTswMDA7MDAwMzg7MjsxODg7MTQzOzE0MzM4OzI7MDY1OzEwNTsyMjUzODsyOzEzOTswNjk7MDE5Mzg7MjsyNTA7MTI4OzExNDM4OzI7MjQ0OzE2NDswOTYzODsyOzA0NjsxMzk7MDg3Mzg7MjsyNTU7MjQ1OzIzODM4OzI7MTYwOzA4MjswNDUzODsyOzE5MjsxOTI7MTkyMzg7MjsxMzU7MjA2OzIzNTM4OzI7MTA2OzA5MDsyMDUzODsyOzExMjsxMjg7MTQ0Mzg7MjsyNTU7MjUwOzI1MDM4OzI7MDAwOzI1NTsxMjczODsyOzA3MDsxMzA7MTgwMzg7MjsyMTA7MTgwOzE0MDM4OzI7MDAwOzEyODsxMjgzODsyOzIxNjsxOTE7MjE2Mzg7MjsyNTU7MDk5OzA3MTM4OzI7MDY0OzIyNDsyMDgzODsyOzIzODsxMzA7MjM4Mzg7MjsyNDU7MjIyOzE3OTM4OzI7MjU1OzI1NTsyNTUzODsyOzI0NTsyNDU7MjQ1Mzg7MjsyNTU7MjU1OzAwMDM4OzI7MTU0OzIwNTswNTA0ODsyOzI0MDsyNDg7MjU1NDg7MjsyNTA7MjM1OzIxNTQ4OzI7MDAwOzI1NTsyNTU0ODsyOzEyNzsyNTU7MjEyNDg7MjsyNDA7MjU1OzI1NTQ4OzI7MjQ1OzI0NTsyMjA0ODsyOzI1NTsyMjg7MTk2NDg7MjswMDA7MDAwOzAwMDQ4OzI7MjU1OzIzNTsyMDU0ODsyOzAwMDswMDA7MjU1NDg7MjsxMzg7MDQzOzIyNjQ4OzI7MTY1OzA0MjswNDI0ODsyOzIyMjsxODQ7MTM1NDg7MjswOTU7MTU4OzE2MDQ4OzI7MTI3OzI1NTswMDA0ODsyOzIxMDsxMDU7MDMwNDg7MjsyNTU7MTI3OzA4MDQ4OzI7MTAwOzE0OTsyMzc0ODsyOzI1NTsyNDg7MjIwNDg7MjsyMjA7MDIwOzA2MDQ4OzI7MDAwOzAwMDsxMzk0ODsyOzAwMDsxMzk7MTM5NDg7MjsxODQ7MTM0OzAxMTQ4OzI7MTY5OzE2OTsxNjk0ODsyOzAwMDsxMDA7MDAwNDg7MjsxODk7MTgzOzEwNzQ4OzI7MTM5OzAwMDsxMzk0ODsyOzA4NTsxMDc7MDQ3NDg7MjsyNTU7MTQwOzAwMDQ4OzI7MTUzOzA1MDsyMDQ0ODsyOzEzOTswMDA7MDAwNDg7MjsyMzM7MTUwOzEyMjQ4OzI7MTQzOzE4ODsxNDM0ODsyOzA3MjswNjE7MTM5NDg7MjswNDc7MDc5OzA3OTQ4OzI7MDAwOzIwNjsyMDk0ODsyOzE0ODswMDA7MjExNDg7MjsyNTU7MDIwOzE0NzQ4OzI7MDAwOzE5MTsyNTU0ODsyOzEwNTsxMDU7MTA1NDg7MjswMzA7MTQ0OzI1NTQ4OzI7MTc4OzAzNDswMzQ0ODsyOzI1NTsyNTA7MjQwNDg7MjswMzQ7MTM5OzAzNDQ4OzI7MjU1OzAwMDsyNTU0ODsyOzIyMDsyMjA7MjIwNDg7MjsyNDg7MjQ4OzI1NTQ4OzI7MjU1OzIxNTswMDA0ODsyOzIxODsxNjU7MDMyNDg7MjsxMjg7MTI4OzEyODQ4OzI7MDAwOzEyODswMDA0ODsyOzE3MzsyNTU7MDQ3NDg7MjsyNDA7MjU1OzI0MDQ4OzI7MjU1OzEwNTsxODA0ODsyOzIwNTswOTI7MDkyNDg7MjswNzU7MDAwOzEzMDQ4OzI7MjU1OzI1NTsyNDA0ODsyOzI0MDsyMzA7MTQwNDg7MjsyMzA7MjMwOzI1MDQ4OzI7MjU1OzI0MDsyNDU0ODsyOzEyNDsyNTI7MDAwNDg7MjsyNTU7MjUwOzIwNTQ4OzI7MTczOzIxNjsyMzA0ODsyOzI0MDsxMjg7MTI4NDg7MjsyMjQ7MjU1OzI1NTQ4OzI7MjUwOzI1MDsyMTA0ODsyOzIxMTsyMTE7MjExNDg7MjsxNDQ7MjM4OzE0NDQ4OzI7MjU1OzE4MjsxOTM0ODsyOzI1NTsxNjA7MTIyNDg7MjswMzI7MTc4OzE3MDQ4OzI7MTM1OzIwNjsyNTA0ODsyOzExOTsxMzY7MTUzNDg7MjsxNzY7MTk2OzIyMjQ4OzI7MjU1OzI1NTsyMjQ0ODsyOzAwMDsyNTU7MDAwNDg7MjswNTA7MjA1OzA1MDQ4OzI7MjUwOzI0MDsyMzA0ODsyOzEyODswMDA7MDAwNDg7MjsxMDI7MjA1OzE3MDQ4OzI7MDAwOzAwMDsyMDU0ODsyOzE4NjswODU7MjExNDg7MjsxNDc7MTEyOzIxOTQ4OzI7MDYwOzE3OTsxMTM0ODsyOzEyMzsxMDQ7MjM4NDg7MjswMDA7MjUwOzE1NDQ4OzI7MDcyOzIwOTsyMDQ0ODsyOzE5OTswMjE7MTMzNDg7MjswMjU7MDI1OzExMjQ4OzI7MjQ1OzI1NTsyNTA0ODsyOzI1NTsyMjg7MjI1NDg7MjsyNTU7MjI4OzE4MTQ4OzI7MjU1OzIyMjsxNzM0ODsyOzAwMDswMDA7MTI4NDg7MjsyNTM7MjQ1OzIzMDQ4OzI7MTI4OzEyODswMDA0ODsyOzEwNzsxNDI7MDM1NDg7MjsyNTU7MTY1OzAwMDQ4OzI7MjU1OzA2OTswMDA0ODsyOzIxODsxMTI7MjE0NDg7MjsyMzg7MjMyOzE3MDQ4OzI7MTUyOzI1MTsxNTI0ODsyOzE3NTsyMzg7MjM4NDg7MjsyMTk7MTEyOzE0NzQ4OzI7MjU1OzIzOTsyMTM0ODsyOzI1NTsyMTg7MTg1NDg7MjsyMDU7MTMzOzA2MzQ4OzI7MjU1OzE5MjsyMDM0ODsyOzIyMTsxNjA7MjIxNDg7MjsxNzY7MjI0OzIzMDQ4OzI7MTI4OzAwMDsxMjg0ODsyOzEwMjswNTE7MTUzNDg7MjsyNTU7MDAwOzAwMDQ4OzI7MTg4OzE0MzsxNDM0ODsyOzA2NTsxMDU7MjI1NDg7MjsxMzk7MDY5OzAxOTQ4OzI7MjUwOzEyODsxMTQ0ODsyOzI0NDsxNjQ7MDk2NDg7MjswNDY7MTM5OzA4NzQ4OzI7MjU1OzI0NTsyMzg0ODsyOzE2MDswODI7MDQ1NDg7MjsxOTI7MTkyOzE5MjQ4OzI7MTM1OzIwNjsyMzU0ODsyOzEwNjswOTA7MjA1NDg7MjsxMTI7MTI4OzE0NDQ4OzI7MjU1OzI1MDsyNTA0ODsyOzAwMDsyNTU7MTI3NDg7MjswNzA7MTMwOzE4MDQ4OzI7MjEwOzE4MDsxNDA0ODsyOzAwMDsxMjg7MTI4NDg7MjsyMTY7MTkxOzIxNjQ4OzI7MjU1OzA5OTswNzE0ODsyOzA2NDsyMjQ7MjA4NDg7MjsyMzg7MTMwOzIzODQ4OzI7MjQ1OzIyMjsxNzk0ODsyOzI1NTsyNTU7MjU1NDg7MjsyNDU7MjQ1OzI0NTQ4OzI7MjU1OzI1NTswMDA0ODsyOzE1NDsyMDU7MDUwMzg7NTswMzg7NTsxMzg7NTsyMzg7NTszMzg7NTs0Mzg7NTs1Mzg7NTs2Mzg7NTs3Mzg7NTs4Mzg7NTs5Mzg7NTsxMDM4OzU7MTEzODs1OzEyMzg7NTsxMzM4OzU7MTQzODs1OzE1Mzg7NTsxNjM4OzU7MTczODs1OzE4Mzg7NTsxOTM4OzU7MjAzODs1OzIxMzg7NTsyMjM4OzU7MjMzODs1OzI0Mzg7NTsyNTM4OzU7MjYzODs1OzI3Mzg7NTsyODM4OzU7MjkzODs1OzMwMzg7NTszMTM4OzU7MzIzODs1OzMzMzg7NTszNDM4OzU7MzUzODs1OzM2Mzg7NTszNzM4OzU7MzgzODs1OzM5Mzg7NTs0MDM4OzU7NDEzODs1OzQyMzg7NTs0MzM4OzU7NDQzODs1OzQ1Mzg7NTs0NjM4OzU7NDczODs1OzQ4Mzg7NTs0OTM4OzU7NTAzODs1OzUxMzg7NTs1MjM4OzU7NTMzODs1OzU0Mzg7NTs1NTM4OzU7NTYzODs1OzU3Mzg7NTs1ODM4OzU7NTkzODs1OzYwMzg7NTs2MTM4OzU7NjIzODs1OzYzMzg7NTs2NDM4OzU7NjUzODs1OzY2Mzg7NTs2NzM4OzU7NjgzODs1OzY5Mzg7NTs3MDM4OzU7NzEzODs1OzcyMzg7NTs3MzM4OzU7NzQzODs1Ozc1Mzg7NTs3NjM4OzU7NzczODs1Ozc4Mzg7NTs3OTM4OzU7ODAzODs1OzgxMzg7NTs4MjM4OzU7ODMzODs1Ozg0Mzg7NTs4NTM4OzU7ODYzODs1Ozg3Mzg7NTs4ODM4OzU7ODkzODs1OzkwMzg7NTs5MTM4OzU7OTIzODs1OzkzMzg7NTs5NDM4OzU7OTUzODs1Ozk2Mzg7NTs5NzM4OzU7OTgzODs1Ozk5Mzg7NTsxMDAzODs1OzEwMTM4OzU7MTAyMzg7NTsxMDMzODs1OzEwNDM4OzU7MTA1Mzg7NTsxMDYzODs1OzEwNzM4OzU7MTA4Mzg7NTsxMDkzODs1OzExMDM4OzU7MTExMzg7NTsxMTIzODs1OzExMzM4OzU7MTE0Mzg7NTsxMTUzODs1OzExNjM4OzU7MTE3Mzg7NTsxMTgzODs1OzExOTM4OzU7MTIwMzg7NTsxMjEzODs1OzEyMjM4OzU7MTIzMzg7NTsxMjQzODs1OzEyNTM4OzU7MTI2Mzg7NTsxMjczODs1OzEyODM4OzU7MTI5Mzg7NTsxMzAzODs1OzEzMTM4OzU7MTMyMzg7NTsxMzMzODs1OzEzNDM4OzU7MTM1Mzg7NTsxMzYzODs1OzEzNzM4OzU7MTM4Mzg7NTsxMzkzODs1OzE0MDM4OzU7MTQxMzg7NTsxNDIzODs1OzE0MzM4OzU7MTQ0Mzg7NTsxNDUzODs1OzE0NjM4OzU7MTQ3Mzg7NTsxNDgzODs1OzE0OTM4OzU7MTUwMzg7NTsxNTEzODs1OzE1MjM4OzU7MTUzMzg7NTsxNTQzODs1OzE1NTM4OzU7MTU2Mzg7NTsxNTczODs1OzE1ODM4OzU7MTU5Mzg7NTsxNjAzODs1OzE2MTM4OzU7MTYyMzg7NTsxNjMzODs1OzE2NDM4OzU7MTY1Mzg7NTsxNjYzODs1OzE2NzM4OzU7MTY4Mzg7NTsxNjkzODs1OzE3MDM4OzU7MTcxMzg7NTsxNzIzODs1OzE3MzM4OzU7MTc0Mzg7NTsxNzUzODs1OzE3NjM4OzU7MTc3Mzg7NTsxNzgzODs1OzE3OTM4OzU7MTgwMzg7NTsxODEzODs1OzE4MjM4OzU7MTgzMzg7NTsxODQzODs1OzE4NTM4OzU7MTg2Mzg7NTsxODczODs1OzE4ODM4OzU7MTg5Mzg7NTsxOTAzODs1OzE5MTM4OzU7MTkyMzg7NTsxOTMzODs1OzE5NDM4OzU7MTk1Mzg7NTsxOTYzODs1OzE5NzM4OzU7MTk4Mzg7NTsxOTkzODs1OzIwMDM4OzU7MjAxMzg7NTsyMDIzODs1OzIwMzM4OzU7MjA0Mzg7NTsyMDUzODs1OzIwNjM4OzU7MjA3Mzg7NTsyMDgzODs1OzIwOTM4OzU7MjEwMzg7NTsyMTEzODs1OzIxMjM4OzU7MjEzMzg7NTsyMTQzODs1OzIxNTM4OzU7MjE2Mzg7NTsyMTczODs1OzIxODM4OzU7MjE5Mzg7NTsyMjAzODs1OzIyMTM4OzU7MjIyMzg7NTsyMjMzODs1OzIyNDM4OzU7MjI1Mzg7NTsyMjYzODs1OzIyNzM4OzU7MjI4Mzg7NTsyMjkzODs1OzIzMDM4OzU7MjMxMzg7NTsyMzIzODs1OzIzMzM4OzU7MjM0Mzg7NTsyMzUzODs1OzIzNjM4OzU7MjM3Mzg7NTsyMzgzODs1OzIzOTM4OzU7MjQwMzg7NTsyNDEzODs1OzI0MjM4OzU7MjQzMzg7NTsyNDQzODs1OzI0NTM4OzU7MjQ2Mzg7NTsyNDczODs1OzI0ODM4OzU7MjQ5Mzg7NTsyNTAzODs1OzI1MTM4OzU7MjUyMzg7NTsyNTMzODs1OzI1NDM4OzU7MjU1NDg7NTswNDg7NTsxNDg7NTsyNDg7NTszNDg7NTs0NDg7NTs1NDg7NTs2NDg7NTs3NDg7NTs4NDg7NTs5NDg7NTsxMDQ4OzU7MTE0ODs1OzEyNDg7NTsxMzQ4OzU7MTQ0ODs1OzE1NDg7NTsxNjQ4OzU7MTc0ODs1OzE4NDg7NTsxOTQ4OzU7MjA0ODs1OzIxNDg7NTsyMjQ4OzU7MjM0ODs1OzI0NDg7NTsyNTQ4OzU7MjY0ODs1OzI3NDg7NTsyODQ4OzU7Mjk0ODs1OzMwNDg7NTszMTQ4OzU7MzI0ODs1OzMzNDg7NTszNDQ4OzU7MzU0ODs1OzM2NDg7NTszNzQ4OzU7Mzg0ODs1OzM5NDg7NTs0MDQ4OzU7NDE0ODs1OzQyNDg7NTs0MzQ4OzU7NDQ0ODs1OzQ1NDg7NTs0NjQ4OzU7NDc0ODs1OzQ4NDg7NTs0OTQ4OzU7NTA0ODs1OzUxNDg7NTs1MjQ4OzU7NTM0ODs1OzU0NDg7NTs1NTQ4OzU7NTY0ODs1OzU3NDg7NTs1ODQ4OzU7NTk0ODs1OzYwNDg7NTs2MTQ4OzU7NjI0ODs1OzYzNDg7NTs2NDQ4OzU7NjU0ODs1OzY2NDg7NTs2NzQ4OzU7Njg0ODs1OzY5NDg7NTs3MDQ4OzU7NzE0ODs1OzcyNDg7NTs3MzQ4OzU7NzQ0ODs1Ozc1NDg7NTs3NjQ4OzU7Nzc0ODs1Ozc4NDg7NTs3OTQ4OzU7ODA0ODs1OzgxNDg7NTs4MjQ4OzU7ODM0ODs1Ozg0NDg7NTs4NTQ4OzU7ODY0ODs1Ozg3NDg7NTs4ODQ4OzU7ODk0ODs1OzkwNDg7NTs5MTQ4OzU7OTI0ODs1OzkzNDg7NTs5NDQ4OzU7OTU0ODs1Ozk2NDg7NTs5NzQ4OzU7OTg0ODs1Ozk5NDg7NTsxMDA0ODs1OzEwMTQ4OzU7MTAyNDg7NTsxMDM0ODs1OzEwNDQ4OzU7MTA1NDg7NTsxMDY0ODs1OzEwNzQ4OzU7MTA4NDg7NTsxMDk0ODs1OzExMDQ4OzU7MTExNDg7NTsxMTI0ODs1OzExMzQ4OzU7MTE0NDg7NTsxMTU0ODs1OzExNjQ4OzU7MTE3NDg7NTsxMTg0ODs1OzExOTQ4OzU7MTIwNDg7NTsxMjE0ODs1OzEyMjQ4OzU7MTIzNDg7NTsxMjQ0ODs1OzEyNTQ4OzU7MTI2NDg7NTsxMjc0ODs1OzEyODQ4OzU7MTI5NDg7NTsxMzA0ODs1OzEzMTQ4OzU7MTMyNDg7NTsxMzM0ODs1OzEzNDQ4OzU7MTM1NDg7NTsxMzY0ODs1OzEzNzQ4OzU7MTM4NDg7NTsxMzk0ODs1OzE0MDQ4OzU7MTQxNDg7NTsxNDI0ODs1OzE0MzQ4OzU7MTQ0NDg7NTsxNDU0ODs1OzE0NjQ4OzU7MTQ3NDg7NTsxNDg0ODs1OzE0OTQ4OzU7MTUwNDg7NTsxNTE0ODs1OzE1MjQ4OzU7MTUzNDg7NTsxNTQ0ODs1OzE1NTQ4OzU7MTU2NDg7NTsxNTc0ODs1OzE1ODQ4OzU7MTU5NDg7NTsxNjA0ODs1OzE2MTQ4OzU7MTYyNDg7NTsxNjM0ODs1OzE2NDQ4OzU7MTY1NDg7NTsxNjY0ODs1OzE2NzQ4OzU7MTY4NDg7NTsxNjk0ODs1OzE3MDQ4OzU7MTcxNDg7NTsxNzI0ODs1OzE3MzQ4OzU7MTc0NDg7NTsxNzU0ODs1OzE3NjQ4OzU7MTc3NDg7NTsxNzg0ODs1OzE3OTQ4OzU7MTgwNDg7NTsxODE0ODs1OzE4MjQ4OzU7MTgzNDg7NTsxODQ0ODs1OzE4NTQ4OzU7MTg2NDg7NTsxODc0ODs1OzE4ODQ4OzU7MTg5NDg7NTsxOTA0ODs1OzE5MTQ4OzU7MTkyNDg7NTsxOTM0ODs1OzE5NDQ4OzU7MTk1NDg7NTsxOTY0ODs1OzE5NzQ4OzU7MTk4NDg7NTsxOTk0ODs1OzIwMDQ4OzU7MjAxNDg7NTsyMDI0ODs1OzIwMzQ4OzU7MjA0NDg7NTsyMDU0ODs1OzIwNjQ4OzU7MjA3NDg7NTsyMDg0ODs1OzIwOTQ4OzU7MjEwNDg7NTsyMTE0ODs1OzIxMjQ4OzU7MjEzNDg7NTsyMTQ0ODs1OzIxNTQ4OzU7MjE2NDg7NTsyMTc0ODs1OzIxODQ4OzU7MjE5NDg7NTsyMjA0ODs1OzIyMTQ4OzU7MjIyNDg7NTsyMjM0ODs1OzIyNDQ4OzU7MjI1NDg7NTsyMjY0ODs1OzIyNzQ4OzU7MjI4NDg7NTsyMjk0ODs1OzIzMDQ4OzU7MjMxNDg7NTsyMzI0ODs1OzIzMzQ4OzU7MjM0NDg7NTsyMzU0ODs1OzIzNjQ4OzU7MjM3NDg7NTsyMzg0ODs1OzIzOTQ4OzU7MjQwNDg7NTsyNDE0ODs1OzI0MjQ4OzU7MjQzNDg7NTsyNDQ0ODs1OzI0NTQ4OzU7MjQ2NDg7NTsyNDc0ODs1OzI0ODQ4OzU7MjQ5NDg7NTsyNTA0ODs1OzI1MTQ4OzU7MjUyNDg7NTsyNTM0ODs1OzI1NDQ4OzU7MjU1OLoQAGkAAABrAQAAFwAAAC5LFgBZAAAAQQEAADYAAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9wYXJraW5nX2xvdF9jb3JlLTAuOS4xMC9zcmMvcGFya2luZ19sb3QucnMAAAA4uhAAaQAAAEoBAAAMAAAAUGFya2luZyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0AALS6EAAmAAAAL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvcGFya2luZ19sb3RfY29yZS0wLjkuMTAvc3JjL3RocmVhZF9wYXJrZXIvd2FzbS5yc+S6EABwAAAAGgAAAAkAAADkuhAAcAAAACoAAAAJAAAAFwMAAAwAAAAEAAAAVwMAAFgDAABZAwBBlPfCAAuyIwEAAAAbAwAAL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvcmVnZXgtMS4xMC42L3NyYy9idWlsZGVycy5ycwCcuxAAWwAAAEcAAAAJAAAAU3ludGF4KAoIvBAACAAAAENvbXBpbGVkVG9vQmlnAABaAwAABAAAAAQAAABbAwAAXAMAABAAAAAIAAAAXQMAANzGEABmAAAAxwcAACoAAADcxhAAZgAAAMcHAAATAAAA3MYQAGYAAADOBwAAJgAAANzGEABmAAAAzgcAAA8AAAByZXZlcnNlIHNlYXJjaCBtdXN0IG1hdGNoIGlmIGZvcndhcmQgc2VhcmNoIGRvZXMvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvaHlicmlkL3Jl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YWxpZElucHV0QW5jaG9yZWRJbnZhbGlkSW5wdXRVbmFuY2hvcmVkVW5zdXBwb3J0ZWRTdHJlYW1VbnN1cHBvcnRlZE92ZXJsYXBwaW5nVW5zdXBwb3J0ZWRFbXB0eWVycm9yIGJ1aWxkaW5nIE5GQQAADM8QABIAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBmb3VuZCBpbXBvc3NpYmxlIGVycm9yIGluIG1ldGEgZW5naW5lOiAAAAAozxAAUQAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy9tZXRhL2Vycm9yLnJzAAAAhM8QAGUAAADtAAAAEQAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy9uZmEvdGhvbXBzb24vcmFuZ2VfdHJpZS5ycwAA/M8QAHIAAAD6AAAAKQAAAPzPEAByAAAA/AAAACsAAAD8zxAAcgAAAA8BAAArAAAA/M8QAHIAAABLAQAAOwAAAPzPEAByAAAAiQEAADsAAAD8zxAAcgAAADEBAAANAAAAdG9vIG1hbnkgc2VxdWVuY2VzIGFkZGVkIHRvIHJhbmdlIHRyaWUAANDQEAAmAAAA/M8QAHIAAAC0AQAAEQAAAPzPEAByAAAA4AEAADcAAAD8zxAAcgAAABkCAAAsAAAA/M8QAHIAAAAeAgAAFQAAAPzPEAByAAAAIwIAABkAAAD8zxAAcgAAAEkCAAAaAAAAYXNzZXJ0aW9uIGZhaWxlZDogbGVuID4gMAAAAPzPEAByAAAAhgIAAAkAAABhc3NlcnRpb24gZmFpbGVkOiBsZW4gPD0gNAAA/M8QAHIAAACHAgAACQAAAPzPEAByAAAApwIAABUAAAD8zxAAcgAAAEUDAAANAAAAL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL3V0aWwvYWxwaGFiZXQucnNFT0kAQNIQAAMAAABCeXRlQ2xhc3NlcyhM0hAADAAAACA9PiBbAAAAAQAAAAAAAABg0hAABQAAAAEAAAAAAAAAeC0YAAEAAABCeXRlQ2xhc3Nlcyh7c2luZ2xldG9uc30pAAAAiNIQABkAAADY0RAAaAAAABoCAAAuAAAA2NEQAGgAAAA2AgAANAAAANjREABoAAAA3AIAAC4AAADY0RAAaAAAAIMDAAAvAAAAU3RhcnRCeXRlTWFwewAAAOzSEAANAAAATm9uV29yZEJ5dGVXb3JkQnl0ZVRleHRMaW5lTEZMaW5lQ1JDdXN0b21MaW5lVGVybWluYXRvclF1aXRieXRlR2F2ZVVwSGF5c3RhY2tUb29Mb25nbGVuVW5zdXBwb3J0ZWRBbmNob3JlZG1vZGUAQfymwwAL2wMBAAAA3gMAAFJlZ2V4SW5mb0lwcm9wc191bmlvbgAAAAAAAAABAAAAAQAAAMoAAAAAAAAAAQAAAAEAAADfAwAA4AMAABAAAAAEAAAAvwAAAAAAAAABAAAAAQAAAOEDAAAAAAAACAAAAAQAAADiAwAAAAAAAAgAAAAEAAAA3AMAAHV0ZjhfZW1wdHlhdXRvcHJld2hpY2hfY2FwdHVyZXNuZmFfc2l6ZV9saW1pdG9uZXBhc3Nfc2l6ZV9saW1pdGh5YnJpZF9jYWNoZV9jYXBhY2l0eWh5YnJpZGRmYWRmYV9zaXplX2xpbWl0ZGZhX3N0YXRlX2xpbWl0b25lcGFzc2JhY2t0cmFja2xpbmVfdGVybWluYXRvcgAAAJj+EAAKAAAA/NMQAAoAAAAG1BAABwAAAAAMEQADAAAADdQQAA4AAAAb1BAADgAAACnUEAASAAAAO9QQABUAAABQ1BAABgAAAFbUEAADAAAAWdQQAA4AAABn1BAADwAAAHbUEAAHAAAAfdQQAAkAAACr9BAADAAAAIbUEAAPAAAAR3JvdXBJbmZvSW5uZXJzbG90X3Jhbmdlc25hbWVfdG9faW5kZXhpbmRleF90b19uYW1lbWVtb3J5X2V4dHJhAEHgqsMAC8kQAQAAABADAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvbmZhL3Rob21wc29uL2NvbXBpbGVyLnJzaNUQAHAAAAC1AwAAFgAAAGjVEABwAAAAtgMAABYAAABo1RAAcAAAALcDAAAWAAAAaNUQAHAAAAC5AwAADgAAAGjVEABwAAAAvAMAAA4AAABo1RAAcAAAAN0DAAAOAAAAaNUQAHAAAAAwBAAAKAAAAGjVEABwAAAALAQAABYAAABo1RAAcAAAAJ0FAAAsAAAAaNUQAHAAAACeBQAAMgAAAGjVEABwAAAAhQUAADAAAABo1RAAcAAAAI4FAAAwAAAAaNUQAHAAAACPBQAANgAAAGjVEABwAAAAbAUAAD8AAABo1RAAcAAAAG0FAAA7AAAAaNUQAHAAAADtBQAAKgAAAGjVEABwAAAATwYAABYAAABo1RAAcAAAAFMGAAAWAAAAaNUQAHAAAABaBgAAFgAAAGjVEABwAAAAXgYAABYAAABo1RAAcAAAAGIGAAAWAAAAaNUQAHAAAABtBgAAFgAAAGjVEABwAAAAdAYAABYAAABo1RAAcAAAAHgGAAAWAAAAaNUQAHAAAAB8BgAAFgAAAGjVEABwAAAAhQYAABYAAABo1RAAcAAAAJAGAAAWAAAAaNUQAHAAAACUBgAAFgAAAGjVEABwAAAAmAYAABYAAABhc3NlcnRpb24gZmFpbGVkOiBwcmVmaXhfbGVuIDwgcmFuZ2VzLmxlbigpAGjVEABwAAAA/gYAAAkAAABo1RAAcAAAAAAHAAAgAAAAbm9uLWVtcHR5IG5vZGVzAGjVEABwAAAAIgcAAA4AAABo1RAAcAAAACMHAAAmAAAAYXNzZXJ0aW9uIGZhaWxlZDogc2VsZi5zdGF0ZS51bmNvbXBpbGVkW2xhc3RdLmxhc3QuaXNfbm9uZSgpaNUQAHAAAAAjBwAACQAAAGjVEABwAAAAJAcAAB4AAABo1RAAcAAAACgHAAAZAAAAYXNzZXJ0aW9uIGZhaWxlZDogIXJhbmdlcy5pc19lbXB0eSgpaNUQAHAAAAAcBwAACQAAAGjVEABwAAAANQcAADoAAABo1RAAcAAAADwHAAAmAAAAYXNzZXJ0aW9uIGZhaWxlZDogc2VsZi5zdGF0ZS51bmNvbXBpbGVkWzBdLmxhc3QuaXNfbm9uZSgpAAAAaNUQAHAAAAA8BwAACQAAAGjVEABwAAAAPQcAACUAAABo1RAAcAAAADsHAAAJAAAAaNUQAHAAAABGBwAADgAAAGjVEABwAAAARwcAAB4AAABJbXBsaWNpdGV4cGVjdGVkIG51bWJlciBvZiBwYXR0ZXJucyB0byBtYXRjaCBwYXR0ZXJuIElEAHjZEAAvAAAA8AURAGoAAAA0BAAADQAAAPAFEQBqAAAAVQQAADkAAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9haG8tY29yYXNpY2stMS4xLjMvc3JjL3V0aWwvc2VhcmNoLnJz0NkQAGQAAABOAQAACQAAAGludmFsaWQgbWF0Y2ggc3BhbgAARNoQABIAAADQ2RAAZAAAAFsDAAAJAAAAL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvYWhvLWNvcmFzaWNrLTEuMS4zL3NyYy9wYWNrZWQvYXBpLnJzAHDaEABjAAAAGQIAABwAAABw2hAAYwAAAB8CAAAxAAAA4wMAAAQAAAAEAAAA5AMAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy91dGlsL3ByZWZpbHRlci9ieXRlc2V0LnJzAAAABNsQAHEAAAAjAAAAEQAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy91dGlsL3ByZWZpbHRlci9tZW1jaHIucnOI2xAAcAAAACcAAAAtAAAAiNsQAHAAAABVAAAAFgAAAIjbEABwAAAAVgAAABYAAACI2xAAcAAAAGQAAAA2AAAAiNsQAHAAAACSAAAAFgAAAIjbEABwAAAAkwAAABYAAACI2xAAcAAAAJQAAAAWAAAAiNsQAHAAAACiAAAAPgAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy91dGlsL3ByZWZpbHRlci9tZW1tZW0ucnN43BAAcAAAACsAAAAnAAAAeNwQAHAAAAA7AAAAGAAAAGFoby1jb3Jhc2ljayBERkEgc2hvdWxkIG5ldmVyIGZhaWwvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvdXRpbC9wcmVmaWx0ZXIvdGVkZHkucnMAAAAq3RAAbwAAAHEAAAASAEG0u8MAC8kZAQAAABADAAAAAAAACAAAAAQAAADYAgAAAAAAAAQAAAAEAAAAEAAAADcuFgBqAAAAvAAAACoAAAA3LhYAagAAALkAAAAqAAAANy4WAGoAAAA6AAAAFQAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL21lbWNoci0yLjcuNC9zcmMvbWVtbWVtL3NlYXJjaGVyLnJzAAAM3hAAYgAAAHQCAAAbAAAAVHJ5RnJvbUludEVycm9yL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL25mYS90aG9tcHNvbi9iYWNrdHJhY2sucnOP3hAAcQAAAKIFAAAaAAAAj94QAHEAAAAHBgAAKgAAAI/eEABxAAAACQYAAB4AAACP3hAAcQAAACEHAAAXAAAAL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL3V0aWwvZXNjYXBlLnJzAABA3xAAZgAAACgAAAA9AAAAQN8QAGYAAAAlAAAADQAAAPj5EABkAAAAbgMAADUAAADlAwAAWAAAAAgAAADmAwAA0AMAAAQAAAAEAAAAgAAAAAAAAAAgAAAACAAAAOcDAAAAAAAAAQAAAAEAAADKAAAA4AMAABAAAAAEAAAAvwAAAAAAAAABAAAAAQAAAN8DAAAAAAAAKAAAAAgAAADoAwAAAAAAAAgAAAAEAAAA3AMAAAAAAAAIAAAABAAAAOIDAABmb3J3YXJkcmV2ZXJzZXZpc2l0ZWRfY2FwYWNpdHlCb3VuZGVkQmFja3RyYWNrZXIAAAAACAAAAAgAAADFAgAAwPcQAGsAAAAIBQAAIgAAAMD3EABrAAAAVQUAACQAAADA9xAAawAAAGQFAAAyAAAAwPcQAGsAAACrBQAAKQAAAMD3EABrAAAArAUAACsAAADA9xAAawAAAK4FAAAdAAAAdGhvbXBzb246Ok5GQSgKAAjhEAAPAAAAdHJhbnNpdGlvbiBlcXVpdmFsZW5jZSBjbGFzc2VzOiAg4RAAIAAAAHIzGAABAAAAKQoAAFDhEAACAAAAwPcQAGsAAADEBQAALQAAAFNUQVJUKAAAbOEQAAYAAAC05BcAAwAAAHIzGAABAAAAAQAAAAAAAAABAAAAAAAAAJQVFgACAAAAcjMYAAEAAADA9xAAawAAAKEGAAAjAAAAwPcQAGsAAAClBgAAIwAAAMD3EABrAAAAqgYAACEAAADA9xAAawAAAK0GAAA+AAAAwPcQAGsAAACwBgAAIQAAAMD3EABrAAAAtAYAAB4AAADA9xAAawAAALUGAAAeAAAAwPcQAGsAAAC3BgAAQQAAAHNwYXJzZSgALOIQAAcAAADwyxgAAQAAAGRlbnNlKAAAROIQAAYAAACALxgAAgAAACA9PiABAAAAAAAAAFziEAAEAAAAdW5pb24oAABw4hAABgAAAPDLGAABAAAAYmluYXJ5LXVuaW9uKAAAAIjiEAANAAAAgC8YAAIAAADwyxgAAQAAAGNhcHR1cmUocGlkPSwgZ3JvdXA9LCBzbG90PSkgPT4gsOIQAAwAAAC84hAACAAAAMTiEAAHAAAAy+IQAAUAAABGQUlM8OIQAAQAAABNQVRDSCgAAPziEAAGAAAA8MsYAAEAAAABAAAAAAAAAHgtGAABAAAAXOIQAAQAAABhc3NlcnRpb24gZmFpbGVkOiBzdGFjay5pc19lbXB0eSgpL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL3V0aWwvZGV0ZXJtaW5pemUvbW9kLnJzAAAATuMQAG8AAAB4AQAABQAAAFNtYWxsSW5kZXhQYXR0ZXJuSURjYW5ub3QgY3JlYXRlIGl0ZXJhdG9yIGZvciBQYXR0ZXJuSUQgd2hlbiBudW1iZXIgb2YgZWxlbWVudHMgZXhjZWVkIADj4xAARAAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy91dGlsL3ByaW1pdGl2ZXMucnMAADDkEABqAAAA8QIAAAEAAABQYXR0ZXJuSURFcnJvclN0YXRlSUQAAAAw5BAAagAAAPICAAABAAAAU3RhdGVJREVycm9yAAAAAAgAAAAIAAAAxAIAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy9kZmEvcmVtYXBwZXIucnMA8OQQAGcAAABuAAAAEgAAAPDkEABnAAAAiAAAACQAAADw5BAAZwAAAI0AAAAgAAAA8OQQAGcAAACPAAAAHQAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy9uZmEvdGhvbXBzb24vYnVpbGRlci5ycwCY5RAAbwAAAIkAAAAgAAAAmOUQAG8AAACOAAAAIAAAAG11c3QgY2FsbCAnZmluaXNoX3BhdHRlcm4nIGZpcnN0KOYQACAAAACY5RAAbwAAAJ8BAAAJAAAAmOUQAG8AAAAyAgAAGAAAAJjlEABvAAAAOwIAAC8AAACY5RAAbwAAAD4CAAAkAAAAmOUQAG8AAAA+AgAAEgAAAJjlEABvAAAAPwIAABUAAACY5RAAbwAAAEgCAAAvAAAAmOUQAG8AAABJAgAAJQAAAJjlEABvAAAASQIAABYAAACY5RAAbwAAAEoCAAAZAAAAmOUQAG8AAADGAQAAGgAAAJjlEABvAAAAyQEAABoAAACY5RAAbwAAANcBAAAaAAAAaW52YWxpZCBjYXB0dXJlIGluZGV4AAAAmOUQAG8AAADfAQAAGgAAAGEgc21h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LCBvciBoZXVyaXN0aWNhbGx5IGVuYWJsZSBVbmljb2RlIHdvcmQgYm91bmRhcmllcyBvciB1c2UgYSBkaWZmZXJlbnQgcmVnZXggZW5naW5lL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL21ldGEvbGl0ZXJhbC5ycy3yEABnAAAAHgAAAA0AAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBleHBlY3RlZCBsaXRlcmFsLCBnb3QgpPIQAEAAAAAt8hAAZwAAADgAAAAeAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZXhwZWN0ZWQgbGl0ZXJhbCBvciBjb25jYXQsIGdvdCAAAPzyEABKAAAALfIQAGcAAAA8AAAAEgAAAOUDAABYAAAACAAAAPEDAADQAwAABAAAAAQAAACAAAAAAAAAAAQAAAAEAAAAEAAAAAAAAAAAAQAAAQAAAPIDAAAAAAAAAAEAAAEAAAC1AAAAAAAAACAAAAAIAAAA5wMAAHN0cmlkZTJzdGFydF9tYXBjbGFzc2VzcXVpdHNldGNhY2hlX2NhcGFjaXR5qP4QAAYAAACu/hAAAwAAAMDzEAAHAAAAx/MQAAkAAADQ8xAABwAAANfzEAAHAAAA3vMQAA4AAAAAAAAAAQAAAAEAAADKAAAA4AMAABAAAAAEAAAAvwAAAAAAAAABAAAAAQAAAN8DAAAAAAAAKAAAAAgAAADoAwAAAAAAAAgAAAAEAAAA3AMAAAAAAAAIAAAABAAAAOIDAAAAAAAABAAAAAQAAADzAwAAc3RhcnRzX2Zvcl9lYWNoX3BhdHRlcm5ieXRlX2NsYXNzZXN1bmljb2RlX3dvcmRfYm91bmRhcnlzcGVjaWFsaXplX3N0YXJ0X3N0YXRlc3NraXBfY2FjaGVfY2FwYWNpdHlfY2hlY2ttaW5pbXVtX2NhY2hlX2NsZWFyX2NvdW50bWluaW11bV9ieXRlc19wZXJfc3RhdGWY/hAACgAAAAAMEQADAAAAlPQQABcAAACr9BAADAAAALf0EAAVAAAA1/MQAAcAAADM9BAAFwAAAN7zEAAOAAAA4/QQABkAAAD89BAAGQAAABX1EAAXAAAAQ2FjaGVFcnJvcgAAAAAAAAQAAAAEAAAAOwAAAExhenlTdGF0ZUlETGF6eVN0YXRlSURFcnJvcmF0dGVtcHRlZGJpdHNyZWdleDogdGhyZWFkIElEIGFsbG9jYXRpb24gc3BhY2UgZXhoYXVzdGVkAMj1EAArAAAAQB8YAGQAAABeAQAAEQAAAFoDAAAEAAAABAAAAFsDAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvbWV0YS93cmFwcGVycy5ycxz2EABoAAAAiQAAABkAAAAc9hAAaAAAAEUBAAAdAAAAHPYQAGgAAAD7AQAAHQAAABz2EABoAAAAHwMAAB0AAAAc9hAAaAAAACwEAAANAAAAHPYQAGgAAAC0BAAAHQAAABz2EABoAAAARAUAAA0AAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvbmZhL3Rob21wc29uL21hcC5ycwD09hAAawAAAJYAAAAJAAAA9PYQAGsAAACfAAAAHgAAAPT2EABrAAAAtgAAABEAAAD09hAAawAAAAgBAAAJAAAA9PYQAGsAAAAUAQAAHgAAAPT2EABrAAAAJQEAABEAAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvbmZhL3Rob21wc29uL25mYS5ycwDA9xAAawAAAHkCAAAXAAAAwPcQAGsAAACDBwAAFABB2PDDAAutCAIAAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvbmZhL3Rob21wc29uL3Bpa2V2bS5ycwAAXPgQAG4AAACFBAAACgAAAGJ5dGUgc2xpY2UgbGVuZ3RocyBtdXN0IGJlIGxlc3MgdGhhbiB1c2l6ZSBNQVgAANz4EAAuAAAAXPgQAG4AAADYBAAACQAAAFz4EABuAAAAhwUAAAkAAABc+BAAbgAAAMwFAAATAAAAXPgQAG4AAABcBgAAHwAAAFz4EABuAAAAzAYAAC8AAABc+BAAbgAAAM8GAABGAAAAXPgQAG4AAADPBgAAIwAAAFz4EABuAAAAnAYAADQAAABc+BAAbgAAADAIAAAuAAAAc2xvdCB0YWJsZSBsZW5ndGggZG9lc24ndCBvdmVyZmxvdwAAXPgQAG4AAAA9CAAADgAAAFz4EABuAAAAZQgAABgAAABc+BAAbgAAAG4IAAAYAAAAL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL3V0aWwvbG9vay5yc/j5EABkAAAApAMAACgAAAD4+RAAZAAAALADAAAmAAAA+PkQAGQAAAC9AwAAEAAAAPj5EABkAAAAzAMAABAAAAD4+RAAZAAAANoDAAA4AAAA+PkQAGQAAAA3BAAAMQAAAPj5EABkAAAAPAQAACwAAAD4+RAAZAAAAEwEAAA4AAAA+PkQAGQAAABbBAAAOAAAAPj5EABkAAAAngQAADgAAAD4+RAAZAAAAMgEAAAxAAAA+PkQAGQAAADnBAAALAAAAPj5EABkAAAAMgYAACgAAAD4+RAAZAAAAEEGAAAtAAAA////f3NwYXJzZSBzZXQgY2FwYWNpdHkgY2Fubm90IGV4Y2NlZCAAAED7EAAiAAAAL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL3V0aWwvc3BhcnNlX3NldC5ycwAAbPsQAGoAAACCAAAACQAAACBleGNlZWRzIGNhcGFjaXR5IG9mICB3aGVuIGluc2VydGluZyAAAAABAAAAAAAAAOj7EAAVAAAA/fsQABAAAABs+xAAagAAALIAAAAJAAAAbPsQAGoAAAC8AAAAEwAAAGz7EABqAAAAvQAAABQAAABs+xAAagAAAMUAAAAgAAAAbPsQAGoAAADGAAAANAAAAGz7EABqAAAA0QAAACEAQbj5wwALSwEBAQEBAQEBAQEAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBBiPvDAAvVCS91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy91dGlsL3V0ZjgucnOI/RAAZAAAAEMAAAArAAAAiP0QAGQAAABVAAAAOAAAAIj9EABkAAAAWAAAABgAAABQaWtlVk1FbmdpbmVCb3VuZGVkQmFja3RyYWNrZXJFbmdpbmVPbmVQYXNzRW5naW5lSHlicmlkRW5naW5lREZBREZBRW5naW5lUmV2ZXJzZUh5YnJpZEVuZ2luZVJldmVyc2VERkFSZXZlcnNlREZBRW5naW5lQ29uZmlnbWF0Y2hfa2luZFBpa2VWTWNvbmZpZ25mYS91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy9oeWJyaWQvZGZhLnJzAACx/hAAZQAAAMcEAAAeAAAAsf4QAGUAAADpBQAAHgAAAG5vIHF1aXQgaW4gc3RhcnQgd2l0aG91dCBsb29rLWJlaGluZLH+EABlAAAARQYAABYAAABhc3NlcnRpb24gZmFpbGVkOiBpZC5pc19tYXRjaCgpALH+EABlAAAAtQYAAAkAAABubyBpbi1wcm9ncmVzcyBzZWFyY2ggdG8gdXBkYXRlALH+EABlAAAAtwcAACQAAABubyBpbi1wcm9ncmVzcyBzZWFyY2ggdG8gZmluaXNoALH+EABlAAAAwwcAACIAAACx/hAAZQAAAI4KAAAdAAAAL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL2h5YnJpZC9zZWFyY2gucnMMABEAaAAAAFkAAAApAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogc2lkIGJlaW5nIHVua25vd24gaXMgYSBidWeEABEARAAAAAwAEQBoAAAAHQEAABEAAAAMABEAaAAAABoBAAAtAAAADAARAGgAAABXAQAAKQAAAAwAEQBoAAAArQEAABEAAAAMABEAaAAAAKoBAAAtAAAADAARAGgAAAD7AQAAJQAAAAwAEQBoAAAAIgIAABEAAAAMABEAaAAAAB0CAAAVAAAADAARAGgAAADiAgAAFAAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy9tZXRhL2xpbWl0ZWQucnMAYAERAGcAAACOAAAAJQAAAGABEQBnAAAA6AAAABQAAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvbWV0YS9zdG9wYXQucnMAAOgBEQBmAAAAbgAAACUAQYCFxAAL6RovdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvdXRpbC9lbXB0eS5ycwAAAIACEQBlAAAA+QAAADoAAABBaG9Db3Jhc2ljazo6dHJ5X2ZpbmQgaXMgbm90IGV4cGVjdGVkIHRvIGZhaWwvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9haG8tY29yYXNpY2stMS4xLjMvc3JjL2Fob2NvcmFzaWNrLnJzAAAAJQMRAGQAAACWAQAADgAAAP0CAABkAQAABAAAAP4CAAD9AgAAZAEAAAQAAAD9AgAAZAEAAAQAAAD/AgAAAAMAAAEDAADdAgAAAgMAAAMDAAAEAwAABQMAAAYDAAAHAwAACAMAAAkDAAAKAwAACwMAAAwDAAANAwAADgMAAP4CAACcAxEArAMRAKwDEQCsAxEArAMRAOsCAABIAQAABAAAAOwCAADrAgAASAEA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bmljb2RlLWF3YXJlIGNhc2UgaW5zZW5zaXRpdml0eSBtYXRjaGluZyBpcyBub3QgYXZhaWxhYmxlIChtYWtlIHN1cmUgdGhlIHVuaWNvZGUtY2FzZSBmZWF0dXJlIGlzIGVuYWJsZWQpAJziEQBgAAAA8gEAAB4AAACc4hEAYAAAAE8CAAAeAAAAQ2xhc3NVbmljb2RlUmFuZ2VzdGFydGVuZAAAAJziEQBgAAAAOgYAADYAAABDbGFzc0J5dGVzUmFuZ2XiiIUAAKMWEQADAAAAnOIRAGAAAAD3CwAAEgAAAJziEQBgAAAA6AsAABkAAABMb29rQ2FwdHVyZVN0YXJ0RW5kU3RhcnRMRkVuZExGU3RhcnRDUkxGRW5kQ1JMRldvcmRBc2NpaVdvcmRBc2NpaU5lZ2F0ZVdvcmRVbmljb2RlV29yZFVuaWNvZGVOZWdhdGVXb3JkU3RhcnRBc2NpaVdvcmRFbmRBc2NpaVdvcmRTdGFydFVuaWNvZGVXb3JkRW5kVW5pY29kZVdvcmRTdGFydEhhbGZBc2NpaVdvcmRFbmRIYWxmQXNjaWlXb3JkU3RhcnRIYWxmVW5pY29kZVdvcmRFbmRIYWxmVW5pY29kZWluZGV4bWlubWF4Z3JlZWR5FwMAAAwAAAAEAAAAVwMAAA0EAABZAwBB5K/EAAuqhgMBAAAAGwMAAAEAAAABAAAAL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvcmVnZXgtc3ludGF4LTAuOC40L3NyYy9oaXIvbGl0ZXJhbC5yc2Fzc2VydGlvbiBmYWlsZWQ6IHNlcTEubGVuKCkubWFwX29yKHRydWUsIHx4fCB4IDw9IHNlbGYubGltaXRfdG90YWwp9BcRAGQAAAA5AgAACQAAAPQXEQBkAAAAZgIAAAkAAAD0FxEAZAAAAGcGAAAYAAAA9BcRAGQAAAB0BgAAEwAAAPQXEQBkAAAAbQYAABoAAAD0FxEAZAAAAJwGAAAYAAAA9BcRAGQAAACqBgAAEwAAAPQXEQBkAAAAowYAABoAAAD0FxEAZAAAAHgHAAARAAAABQAAAAoAAAAEAAAACgAAAAMAAABAAAAAAgAAAEAAAAABAAAACgAAAPQXEQBkAAAAzggAABUAAAD0FxEAZAAAAN4IAAAoAAAA9BcRAGQAAADyCAAAFQAAAPQXEQBkAAAA4ggAAB4AAAD0FxEAZAAAAOQIAAAnAAAA9BcRAGQAAADkCAAAMwAAAPQXEQBkAAAA5QgAADQAAAD0FxEAZAAAAOsIAAAgAAAANzQzMjEwLy4tZ/JCQ+UsKyopKCcmJSQjIiE4IB8eHRz/lKSViKCbrd3ehnroytfg0NzMu7ezsaiyyOLDmriufni/ncKqvaKhlsGOiauwuae6cK/AvJyMj3uFgJOKknLfl/nY7uz949rm94e08en29OeL9fP768nE8NaYts21fxvU09LV5MWpn4OsaVBiYGFRz5F0c5CCmXlrhG1ufG9SbHaNcYF3faV1XGpTSGNdQU+m7aPHvuHRy8bZ287q+J7v/////////////////////////////////////////////////////////////////////////////////////3RyaWVkIHRvIHVud3JhcCBleHByIGZyb20gSGlyRnJhbWUsIGdvdDogAAAA1BoRACkAAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9yZWdleC1zeW50YXgtMC44LjQvc3JjL2hpci90cmFuc2xhdGUucnMAAAgbEQBmAAAAAQEAABIAAAB0cmllZCB0byB1bndyYXAgVW5pY29kZSBjbGFzcyBmcm9tIEhpckZyYW1lLCBnb3Q6IAAAgBsRADIAAAAIGxEAZgAAAAoBAAASAAAAdHJpZWQgdG8gdW53cmFwIGJ5dGUgY2xhc3MgZnJvbSBIaXJGcmFtZSwgZ290OiAAzBsRAC8AAAAIGxEAZgAAABcBAAASAAAAdHJpZWQgdG8gdW53cmFwIHJlcGV0aXRpb24gZnJvbSBIaXJGcmFtZSwgZ290OiAAFBwRAC8AAAAIGxEAZgAAACUBAAARAAAAdHJpZWQgdG8gdW53cmFwIGdyb3VwIGZyb20gSGlyRnJhbWUsIGdvdDogAABcHBEAKgAAAAgbEQBmAAAANAEAABEAAAB0cmllZCB0byB1bndyYXAgYWx0IHBpcGUgZnJvbSBIaXJGcmFtZSwgZ290OiAAAACgHBEALQAAAAgbEQBmAAAAPwEAABEAAAAIGxEAZgAAAE4BAAAnAAAACBsRAGYAAABPAQAAFwAAAAgbEQBmAAAATgEAAAkAAAAIGxEAZgAAAKwBAAAuAAAACBsRAGYAAACjAQAALgAAAAgbEQBmAAAAtwEAACcAAAAIGxEAZgAAALgBAAAcAAAACBsRAGYAAAC8AQAAJwAAAAgbEQBmAAAAvQEAACwAAAAIGxEAZgAAAM4BAAAgAAAACBsRAGYAAAD+AQAALgAAAAgbEQBmAAAA+gEAAC4AAAAIGxEAZgAAAAoCAAAuAAAACBsRAGYAAAAGAgAALgAAAAgbEQBmAAAAGQIAAC4AAAAIGxEAZgAAABQCAAAuAAAACBsRAGYAAAAgAgAAKgAAAAgbEQBmAAAALAIAAC4AAAAIGxEAZgAAACcCAAAuAAAACBsRAGYAAAA+AgAALwAAAAgbEQBmAAAARQIAAC8AAAAIGxEAZgAAADMCAAAvAAAACBsRAGYAAAA6AgAALwAAAAgbEQBmAAAAjAIAACYAAAAIGxEAZgAAAI0CAAAmAAAACBsRAGYAAACOAgAAJgAAAAgbEQBmAAAAcwIAACYAAAAIGxEAZgAAAHQCAAAmAAAACBsRAGYAAAB1AgAAJgAAAAgbEQBmAAAAuAIAABwAAAAIGxEAZgAAAMMCAAAsAAAACBsRAGYAAADRAgAALAAAAAgbEQBmAAAA2wIAABwAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBleHBlY3RlZCBleHByIG9yIGNvbmNhdCwgZ290IFVuaWNvZGUgY2xhc3P4HhEAVAAAAAgbEQBmAAAA6QIAABEAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBleHBlY3RlZCBleHByIG9yIGNvbmNhdCwgZ290IGJ5dGUgY2xhc3MAAABkHxEAUQAAAAgbEQBmAAAA7AIAABEAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBleHBlY3RlZCBleHByIG9yIGNvbmNhdCwgZ290IHJlcGV0aXRpb24AAADQHxEAUQAAAAgbEQBmAAAA7wIAABEAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBleHBlY3RlZCBleHByIG9yIGNvbmNhdCwgZ290IGdyb3VwPCARAEwAAAAIGxEAZgAAAPICAAARAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZXhwZWN0ZWQgZXhwciBvciBjb25jYXQsIGdvdCBhbHQgbWFya2VyAAAAoCARAFEAAAAIGxEAZgAAAPUCAAARAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZXhwZWN0ZWQgZXhwciBvciBjb25jYXQsIGdvdCBhbHQgYnJhbmNoIG1hcmtlcgwhEQBYAAAACBsRAGYAAAD4AgAAEQAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGV4cGVjdGVkIGV4cHIgb3IgYWx0LCBnb3QgVW5pY29kZSBjbGFzcwAAAHwhEQBRAAAACBsRAGYAAAAIAwAAEQAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGV4cGVjdGVkIGV4cHIgb3IgYWx0LCBnb3QgYnl0ZSBjbGFzcwAA6CERAE4AAAAIGxEAZgAAAAsDAAARAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZXhwZWN0ZWQgZXhwciBvciBhbHQsIGdvdCByZXBldGl0aW9uAABQIhEATgAAAAgbEQBmAAAADgMAABEAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBleHBlY3RlZCBleHByIG9yIGFsdCwgZ290IGdyb3VwAAAAuCIRAEkAAAAIGxEAZgAAABEDAAARAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZXhwZWN0ZWQgZXhwciBvciBhbHQsIGdvdCBjb25jYXQgbWFya2VyAAAAHCMRAFEAAAAIGxEAZgAAABQDAAARAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZXhwZWN0ZWQgZXhwciBvciBhbHQsIGdvdCBhbHQgYnJhbmNoIG1hcmtlcgAAAIgjEQBVAAAACBsRAGYAAAAXAwAAEQAAAGFzc2VydGlvbiBmYWlsZWQ6IHNlbGYuZmxhZ3MoKS51bmljb2RlKCkIGxEAZgAAAEMEAAAJAAAABWFzc2VydGlvbiBmYWlsZWQ6ICFzZWxmLmZsYWdzKCkudW5pY29kZSgpAAAIGxEAZgAAAFkEAAAJAAAAMDlBWmF6QVphegB/CQkgIAAff38wOSF+YXogfiEvOkBbYHt+CQkKCgsLDAwNDSAgQVowOUFaX19hejA5QUZhZmEAAABiAAAAYwAAAGUAAABmAAAAZwAAAGgAAABpAAAAagAAAGsAAAAqIQAAbAAAAG0AAABuAAAAbwAAAHAAAABxAAAAcgAAAHMAAAB/AQAAdAAAAHUAAAB2AAAAdwAAAHgAAAB5AAAAegAAAEEAAABCAAAAQwAAAEUAAABGAAAARwAAAEgAAABJAAAASgAAAEsAAAAqIQAATAAAAE0AAABOAAAATwAAAFAAAABRAAAAUgAAAFMAAAB/AQAAVAAAAFUAAABWAAAAVwAAAFgAAABZAAAAWgAAAJwDAAC8AwAA4AAAAOEAAADiAAAA4wAAAOQAAADlAAAAKyEAAOYAAADnAAAA6AAAAOkAAADqAAAA6wAAAOwAAADtAAAA7gAAAO8AAADwAAAA8QAAAPIAAADzAAAA9AAAAPUAAAD2AAAA+AAAAPkAAAD6AAAA+wAAAPwAAAD9AAAA/gAAAJ4eAADAAAAAwQAAAMIAAADDAAAAxAAAAMUAAAArIQAAxgAAAMcAAADIAAAAyQAAAMoAAADLAAAAzAAAAM0AAADOAAAAzwAAANAAAADRAAAA0gAAANMAAADUAAAA1QAAANYAAADYAAAA2QAAANoAAADbAAAA3AAAAN0AAADeAAAAeAEAAAEBAAAAAQAAAwEAAAIBAAAFAQAABAEAAAcBAAAGAQAACQEAAAgBAAALAQAACgEAAA0BAAAMAQAADwEAAA4BAAARAQAAEAEAABMBAAASAQAAFQEAABQBAAAXAQAAFgEAABkBAAAYAQAAGwEAABoBAAAdAQAAHAEAAB8BAAAeAQAAIQEAACABAAAjAQAAIgEAACUBAAAkAQAAJwEAACYBAAApAQAAKAEAACsBAAAqAQAALQEAACwBAAAvAQAALgEAADMBAAAyAQAANQEAADQBAAA3AQAANgEAADoBAAA5AQAAPAEAADsBAAA+AQAAPQEAAEABAAA/AQAAQgEAAEEBAABEAQAAQwEAAEYBAABFAQAASAEAAEcBAABLAQAASgEAAE0BAABMAQAATwEAAE4BAABRAQAAUAEAAFMBAABSAQAAVQEAAFQBAABXAQAAVgEAAFkBAABYAQAAWwEAAFoBAABdAQAAXAEAAF8BAABeAQAAYQEAAGABAABjAQAAYgEAAGUBAABkAQAAZwEAAGYBAABpAQAAaAEAAGsBAABqAQAAbQEAAGwBAABvAQAAbgEAAHEBAABwAQAAcwEAAHIBAAB1AQAAdAEAAHcBAAB2AQAA/wAAAHoBAAB5AQAAfAEAAHsBAAB+AQAAfQEAAFMAAABzAAAAQwIAAFMCAACDAQAAggEAAIUBAACEAQAAVAIAAIgBAACHAQAAVgIAAFcCAACMAQAAiwEAAN0BAABZAgAAWwIAAJIBAACRAQAAYAIAAGMCAAD2AQAAaQIAAGgCAACZAQAAmAEAAD0CAABvAgAAcgIAACACAAB1AgAAoQEAAKABAACjAQAAogEAAKUBAACkAQAAgAIAAKgBAACnAQAAgwIAAK0BAACsAQAAiAIAALABAACvAQAAigIAAIsCAAC0AQAAswEAALYBAAC1AQAAkgIAALkBAAC4AQAAvQEAALwBAAD3AQAAxQEAAMYBAADEAQAAxgEAAMQBAADFAQAAyAEAAMkBAADHAQAAyQEAAMcBAADIAQAAywEAAMwBAADKAQAAzAEAAMoBAADLAQAAzgEAAM0BAADQAQAAzwEAANIBAADRAQAA1AEAANMBAADWAQAA1QEAANgBAADXAQAA2gEAANkBAADcAQAA2wEAAI4BAADfAQAA3gEAAOEBAADgAQAA4wEAAOIBAADlAQAA5AEAAOcBAADmAQAA6QEAAOgBAADrAQAA6gEAAO0BAADsAQAA7wEAAO4BAADyAQAA8wEAAPEBAADzAQAA8QEAAPIBAAD1AQAA9AEAAJUBAAC/AQAA+QEAAPgBAAD7AQAA+gEAAP0BAAD8AQAA/wEAAP4BAAABAgAAAAIAAAMCAAACAgAABQIAAAQCAAAHAgAABgIAAAkCAAAIAgAACwIAAAoCAAANAgAADAIAAA8CAAAOAgAAEQIAABACAAATAgAAEgIAABUCAAAUAgAAFwIAABYCAAAZAgAAGAIAABsCAAAaAgAAHQIAABwCAAAfAgAAHgIAAJ4BAAAjAgAAIgIAACUCAAAkAgAAJwIAACYCAAApAgAAKAIAACsCAAAqAgAALQIAACwCAAAvAgAALgIAADECAAAwAgAAMwIAADICAABlLAAAPAIAADsCAACaAQAAZiwAAH4sAAB/LAAAQgIAAEECAACAAQAAiQIAAIwCAABHAgAARgIAAEkCAABIAgAASwIAAEoCAABNAgAATAIAAE8CAABOAgAAbywAAG0sAABwLAAAgQEAAIYBAACJAQAAigEAAI8BAACQAQAAq6cAAJMBAACspwAAlAEAAI2nAACqpwAAlwEAAJYBAACupwAAYiwAAK2nAACcAQAAbiwAAJ0BAACfAQAAZCwAAKYBAADFpwAAqQEAALGnAACuAQAARAIAALEBAACyAQAARQIAALcBAACypwAAsKcAAJkDAAC5AwAAvh8AAHEDAABwAwAAcwMAAHIDAAB3AwAAdgMAAP0DAAD+AwAA/wMAAPMDAACsAwAArQMAAK4DAACvAwAAzAMAAM0DAADOAwAAsQMAALIDAADQAwAAswMAALQDAAC1AwAA9QMAALYDAAC3AwAAuAMAANEDAAD0AwAARQMAALkDAAC+HwAAugMAAPADAAC7AwAAtQAAALwDAAC9AwAAvgMAAL8DAADAAwAA1gMAAMEDAADxAwAAwgMAAMMDAADEAwAAxQMAAMYDAADVAwAAxwMAAMgDAADJAwAAJiEAAMoDAADLAwAAhgMAAIgDAACJAwAAigMAAJEDAACSAwAA0AMAAJMDAACUAwAAlQMAAPUDAACWAwAAlwMAAJgDAADRAwAA9AMAAEUDAACZAwAAvh8AAJoDAADwAwAAmwMAALUAAACcAwAAnQMAAJ4DAACfAwAAoAMAANYDAAChAwAA8QMAAKMDAADDAwAAowMAAMIDAACkAwAApQMAAKYDAADVAwAApwMAAKgDAACpAwAAJiEAAKoDAACrAwAAjAMAAI4DAACPAwAA1wMAAJIDAACyAwAAmAMAALgDAAD0AwAApgMAAMYDAACgAwAAwAMAAM8DAADZAwAA2AMAANsDAADaAwAA3QMAANwDAADfAwAA3gMAAOEDAADgAwAA4wMAAOIDAADlAwAA5AMAAOcDAADmAwAA6QMAAOgDAADrAwAA6gMAAO0DAADsAwAA7wMAAO4DAACaAwAAugMAAKED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AAAZHgAAGB4AABseAAAaHgAAHR4AABweAAAfHgAAHh4AACEeAAAgHgAAIx4AACIeAAAlHgAAJB4AACceAAAmHgAAKR4AACgeAAArHgAAKh4AAC0eAAAsHgAALx4AAC4eAAAxHgAAMB4AADMeAAAyHgAANR4AADQeAAA3HgAANh4AADkeAAA4HgAAOx4AADoeAAA9HgAAPB4AAD8eAAA+HgAAQR4AAEAeAABDHgAAQh4AAEUeAABEHgAARx4AAEYeAABJHgAASB4AAEseAABKHgAATR4AAEweAABPHgAATh4AAFEeAABQHgAAUx4AAFIeAABVHgAAVB4AAFceAABWHgAAWR4AAFgeAABbHgAAWh4AAF0eAABcHgAAXx4AAF4eAABhHgAAmx4AAGAeAACbHgAAYx4AAGIeAABlHgAAZB4AAGceAABmHgAAaR4AAGgeAABrHgAAah4AAG0eAABsHgAAbx4AAG4eAABxHgAAcB4AAHMeAAByHgAAdR4AAHQeAAB3HgAAdh4AAHkeAAB4HgAAex4AAHoeAAB9HgAAfB4AAH8eAAB+HgAAgR4AAIAeAACDHgAAgh4AAIUeAACEHgAAhx4AAIYeAACJHgAAiB4AAIseAACKHgAAjR4AAIweAACPHgAAjh4AAJEeAACQHgAAkx4AAJIeAACVHgAAlB4AAGAeAABhHgAA3wAAAKEeAACgHgAAox4AAKIeAAClHgAApB4AAKceAACmHgAAqR4AAKgeAACrHgAAqh4AAK0eAACsHgAArx4AAK4eAACxHgAAsB4AALMeAACyHgAAtR4AALQeAAC3HgAAth4AALkeAAC4HgAAux4AALoeAAC9HgAAvB4AAL8eAAC+HgAAwR4AAMAeAADDHgAAwh4AAMUeAADEHgAAxx4AAMYeAADJHgAAyB4AAMseAADKHgAAzR4AAMweAADPHgAAzh4AANEeAADQHgAA0x4AANIeAADVHgAA1B4AANceAADWHgAA2R4AANgeAADbHgAA2h4AAN0eAADcHgAA3x4AAN4eAADhHgAA4B4AAOMeAADiHgAA5R4AAOQeAADnHgAA5h4AAOkeAADoHgAA6x4AAOoeAADtHgAA7B4AAO8eAADuHgAA8R4AAPAeAADzHgAA8h4AAPUeAAD0HgAA9x4AAPYeAAD5HgAA+B4AAPseAAD6HgAA/R4AAPweAAD/HgAA/h4AAAgfAAAJHwAACh8AAAsfAAAMHwAADR8AAA4fAAAPHwAAAB8AAAEfAAACHwAAAx8AAAQfAAAFHwAABh8AAAcfAAAYHwAAGR8AABofAAAbHwAAHB8AAB0fAAAQHwAAER8AABIfAAATHwAAFB8AABUfAAAoHwAAKR8AACofAAArHwAALB8AAC0fAAAuHwAALx8AACAfAAAhHwAAIh8AACMfAAAkHwAAJR8AACYfAAAnHwAAOB8AADkfAAA6HwAAOx8AADwfAAA9HwAAPh8AAD8fAAAwHwAAMR8AADIfAAAzHwAANB8AADUfAAA2HwAANx8AAEgfAABJHwAASh8AAEsfAABMHwAATR8AAEAfAABBHwAAQh8AAEMfAABEHwAARR8AAFkfAABbHwAAXR8AAF8fAABRHwAAUx8AAFUfAABXHwAAaB8AAGkfAABqHwAAax8AAGwfAABtHwAAbh8AAG8fAABgHwAAYR8AAGIfAABjHwAAZB8AAGUfAABmHwAAZx8AALofAAC7HwAAyB8AAMkfAADKHwAAyx8AANofAADbHwAA+B8AAPkfAADqHwAA6x8AAPofAAD7HwAAiB8AAIkfAACKHwAAix8AAIwfAACNHwAAjh8AAI8fAACAHwAAgR8AAIIfAACDHwAAhB8AAIUfAACGHwAAhx8AAJgfAACZHwAAmh8AAJsfAACcHwAAnR8AAJ4fAACfHwAAkB8AAJEfAACSHwAAkx8AAJQfAACVHwAAlh8AAJcfAACoHwAAqR8AAKofAACrHwAArB8AAK0fAACuHwAArx8AAKAfAAChHwAAoh8AAKMfAACkHwAApR8AAKYfAACnHwAAuB8AALkfAAC8HwAAsB8AALEfAABwHwAAcR8AALMfAABFAwAAmQMAALkDAADMHwAAch8AAHMfAAB0HwAAdR8AAMMfAADYHwAA2R8AANAfAADRHwAAdh8AAHcfAADoHwAA6R8AAOwfAADgHwAA4R8AAHofAAB7HwAA5R8AAPwfAAB4HwAAeR8AAHwfAAB9HwAA8x8AAKkDAADJAwAASwAAAGsAAADFAAAA5QAAAE4hAAAyIQAAcCEAAHEhAAByIQAAcyEAAHQhAAB1IQAAdiEAAHchAAB4IQAAeSEAAHohAAB7IQAAfCEAAH0hAAB+IQAAfyEAAGAhAABhIQAAYiEAAGMhAABkIQAAZSEAAGYhAABnIQAAaCEAAGkhAABqIQAAayEAAGwhAABtIQAAbiEAAG8hAACEIQAAgyEAANAkAADRJAAA0iQAANMkAADUJAAA1SQAANYkAADXJAAA2CQAANkkAADaJAAA2yQAANwkAADdJAAA3iQAAN8kAADgJAAA4SQAAOIkAADjJAAA5CQAAOUkAADmJAAA5yQAAOgkAADpJAAAtiQAALckAAC4JAAAuSQAALokAAC7JAAAvCQAAL0kAAC+JAAAvyQAAMAkAADBJAAAwiQAAMMkAADEJAAAxSQAAMYkAADHJAAAyCQAAMkkAADKJAAAyyQAAMwkAADNJAAAziQAAM8kAAAwLAAAMSwAADIsAAAzLAAANCwAADUsAAA2LAAANywAADgsAAA5LAAAOiwAADssAAA8LAAAPSwAAD4sAAA/LAAAQCwAAEEsAABCLAAAQywAAEQsAABFLAAARiwAAEcsAABILAAASSwAAEosAABLLAAATCwAAE0sAABOLAAATywAAFAsAABRLAAAUiwAAFMsAABULAAAVSwAAFYsAABXLAAAWCwAAFksAABaLAAAWywAAFwsAABdLAAAXiwAAF8sAAAALAAAASwAAAIsAAADLAAABCwAAAUsAAAGLAAABywAAAgsAAAJLAAACiwAAAssAAAMLAAADSwAAA4sAAAPLAAAECwAABEsAAASLAAAEywAABQsAAAVLAAAFiwAABcsAAAYLAAAGSwAABosAAAbLAAAHCwAAB0sAAAeLAAAHywAACAsAAAhLAAAIiwAACMsAAAkLAAAJSwAACYsAAAnLAAAKCwAACksAAAqLAAAKywAACwsAAAtLAAALiwAAC8sAABhLAAAYCwAAGsCAAB9HQAAfQIAADoCAAA+AgAAaCwAAGcsAABqLAAAaSwAAGwsAABrLAAAUQIAAHECAABQAgAAUgIAAHMsAAByLAAAdiwAAHUsAAA/AgAAQAIAAIEsAACALAAAgywAAIIsAACFLAAAhCwAAIcsAACGLAAAiSwAAIgsAACLLAAAiiwAAI0sAACMLAAAjywAAI4sAACRLAAAkCwAAJMsAACSLAAAlSwAAJQsAACXLAAAliwAAJksAACYLAAAmywAAJosAACdLAAAnCwAAJ8sAACeLAAAoSwAAKAsAACjLAAAoiwAAKUsAACkLAAApywAAKYsAACpLAAAqCwAAKssAACqLAAArSwAAKwsAACvLAAAriwAALEsAACwLAAAsywAALIsAAC1LAAAtCwAALcsAAC2LAAAuSwAALgsAAC7LAAAuiwAAL0sAAC8LAAAvywAAL4sAADBLAAAwCwAAMMsAADCLAAAxSwAAMQsAADHLAAAxiwAAMksAADILAAAyywAAMosAADNLAAAzCwAAM8sAADOLAAA0SwAANAsAADTLAAA0iwAANUsAADULAAA1ywAANYsAADZLAAA2CwAANssAADaLAAA3SwAANwsAADfLAAA3iwAAOEsAADgLAAA4ywAAOIsAADsLAAA6ywAAO4sAADtLAAA8ywAAPIsAACgEAAAoRAAAKIQAACjEAAApBAAAKUQAACmEAAApxAAAKgQAACpEAAAqhAAAKsQAACsEAAArRAAAK4QAACvEAAAsBAAALEQAACyEAAAsxAAALQQAAC1EAAAthAAALcQAAC4EAAAuRAAALoQAAC7EAAAvBAAAL0QAAC+EAAAvxAAAMAQAADBEAAAwhAAAMMQAADEEAAAxRAAAMcQAADNEAAAQaYAAECmAABDpgAAQqYAAEWmAABEpgAAR6YAAEamAABJpgAASKYAAIgcAABLpgAAiBwAAEqmAABNpgAATKYAAE+mAABOpgAAUaYAAFCmAABTpgAAUqYAAFWmAABUpgAAV6YAAFamAABZpgAAWKYAAFumAABapgAAXaYAAFymAABfpgAAXqYAAGGmAABgpgAAY6YAAGKmAABlpgAAZKYAAGemAABmpgAAaaYAAGimAABrpgAAaqYAAG2mAABspgAAgaYAAICmAACDpgAAgqYAAIWmAACEpgAAh6YAAIamAACJpgAAiKYAAIumAACKpgAAjaYAAIymAACPpgAAjqYAAJGmAACQpgAAk6YAAJKmAACVpgAAlKYAAJemAACWpgAAmaYAAJimAACbpgAAmqYAACOnAAAipwAAJacAACSnAAAnpwAAJqcAACmnAAAopwAAK6cAACqnAAAtpwAALKcAAC+nAAAupwAAM6cAADKnAAA1pwAANKcAADenAAA2pwAAOacAADinAAA7pwAAOqcAAD2nAAA8pwAAP6cAAD6nAABBpwAAQKcAAEOnAABCpwAARacAAESnAABHpwAARqcAAEmnAABIpwAAS6cAAEqnAABNpwAATKcAAE+nAABOpwAAUacAAFCnAABTpwAAUqcAAFWnAABUpwAAV6cAAFanAABZpwAAWKcAAFunAABapwAAXacAAFynAABfpwAAXqcAAGGnAABgpwAAY6cAAGKnAABlpwAAZKcAAGenAABmpwAAaacAAGinAABrpwAAaqcAAG2nAABspwAAb6cAAG6nAAB6pwAAeacAAHynAAB7pwAAeR0AAH+nAAB+pwAAgacAAICnAACDpwAAgqcAAIWnAACEpwAAh6cAAIanAACMpwAAi6cAAGUCAACRpwAAkKcAAJOnAACSpwAAxKcAAJenAACWpwAAmacAAJinAACbpwAAmqcAAJ2nAACcpwAAn6cAAJ6nAAChpwAAoKcAAKOnAACipwAApacAAKSnAACnpwAApqcAAKmnAACopwAAZgIAAFwCAABhAgAAbAIAAGoCAACeAgAAhwIAAJ0CAABTqwAAtacAALSnAAC3pwAAtqcAALmnAAC4pwAAu6cAALqnAAC9pwAAvKcAAL+nAAC+pwAAwacAAMCnAADDpwAAwqcAAJSnAACCAgAAjh0AAMinAADHpwAAyqcAAMmnAADRpwAA0KcAANenAADWpwAA2acAANinAAD2pwAA9acAALOnAACgEwAAoRMAAKITAACjEwAApBMAAKUTAACmEwAApxMAAKgTAACpEwAAqhMAAKsTAACsEwAArRMAAK4TAACvEwAAsBMAALETAACyEwAAsxMAALQTAAC1EwAAthMAALcTAAC4EwAAuRMAALoTAAC7EwAAvBMAAL0TAAC+EwAAvxMAAMATAADBEwAAwhMAAMMTAADEEwAAxRMAAMYTAADHEwAAyBMAAMkTAADKEwAAyxMAAMwTAADNEwAAzhMAAM8TAADQEwAA0RMAANITAADTEwAA1BMAANUTAADWEwAA1xMAANgTAADZEwAA2hMAANsTAADcEwAA3RMAAN4TAADfEwAA4BMAAOETAADiEwAA4xMAAOQTAADlEwAA5hMAAOcTAADoEwAA6RMAAOoTAADrEwAA7BMAAO0TAADuEwAA7xMAAEH/AABC/wAAQ/8AAET/AABF/wAARv8AAEf/AABI/wAASf8AAEr/AABL/wAATP8AAE3/AABO/wAAT/8AAFD/AABR/wAAUv8AAFP/AABU/wAAVf8AAFb/AABX/wAAWP8AAFn/AABa/wAAIf8AACL/AAAj/wAAJP8AACX/AAAm/wAAJ/8AACj/AAAp/wAAKv8AACv/AAAs/wAALf8AAC7/AAAv/wAAMP8AADH/AAAy/wAAM/8AADT/AAA1/wAANv8AADf/AAA4/wAAOf8AADr/AAAoBAEAKQQBACoEAQArBAEALAQBAC0EAQAuBAEALwQBADAEAQAxBAEAMgQBADMEAQA0BAEANQQBADYEAQA3BAEAOAQBADkEAQA6BAEAOwQBADwEAQA9BAEAPgQBAD8EAQBABAEAQQQBAEIEAQBDBAEARAQBAEUEAQBGBAEARwQBAEgEAQBJBAEASgQBAEsEAQBMBAEATQQBAE4EAQBPBAEAAAQBAAEEAQACBAEAAwQBAAQEAQAFBAEABgQBAAcEAQAIBAEACQQBAAoEAQALBAEADAQBAA0EAQAOBAEADwQBABAEAQARBAEAEgQBABMEAQAUBAEAFQQBABYEAQAXBAEAGAQBABkEAQAaBAEAGwQBABwEAQAdBAEAHgQBAB8EAQAgBAEAIQQBACIEAQAjBAEAJAQBACUEAQAmBAEAJwQBANgEAQDZBAEA2gQBANsEAQDcBAEA3QQBAN4EAQDfBAEA4AQBAOEEAQDiBAEA4wQBAOQEAQDlBAEA5gQBAOcEAQDoBAEA6QQBAOoEAQDrBAEA7AQBAO0EAQDuBAEA7wQBAPAEAQDxBAEA8gQBAPMEAQD0BAEA9QQBAPYEAQD3BAEA+AQBAPkEAQD6BAEA+wQBALAEAQCxBAEAsgQBALMEAQC0BAEAtQQBALYEAQC3BAEAuAQBALkEAQC6BAEAuwQBALwEAQC9BAEAvgQBAL8EAQDABAEAwQQBAMIEAQDDBAEAxAQBAMUEAQDGBAEAxwQBAMgEAQDJBAEAygQBAMsEAQDMBAEAzQQBAM4EAQDPBAEA0AQBANEEAQDSBAEA0wQBAJcFAQCYBQEAmQUBAJoFAQCbBQEAnAUBAJ0FAQCeBQEAnwUBAKAFAQChBQEAowUBAKQFAQClBQEApgUBAKcFAQCoBQEAqQUBAKoFAQCrBQEArAUBAK0FAQCuBQEArwUBALAFAQCxBQEAswUBALQFAQC1BQEAtgUBALcFAQC4BQEAuQUBALsFAQC8BQEAcAUBAHEFAQByBQEAcwUBAHQFAQB1BQEAdgUBAHcFAQB4BQEAeQUBAHoFAQB8BQEAfQUBAH4FAQB/BQEAgAUBAIEFAQCCBQEAgwUBAIQFAQCFBQEAhgUBAIcFAQCIBQEAiQUBAIoFAQCMBQEAjQUBAI4FAQCPBQEAkAUBAJEFAQCSBQEAlAUBAJUFAQDADAEAwQwBAMIMAQDDDAEAxAwBAMUMAQDGDAEAxwwBAMgMAQDJDAEAygwBAMsMAQDMDAEAzQwBAM4MAQDPDAEA0AwBANEMAQDSDAEA0wwBANQMAQDVDAEA1gwBANcMAQDYDAEA2QwBANoMAQDbDAEA3AwBAN0MAQDeDAEA3wwBAOAMAQDhDAEA4gwBAOMMAQDkDAEA5QwBAOYMAQDnDAEA6AwBAOkMAQDqDAEA6wwBAOwMAQDtDAEA7gwBAO8MAQDwDAEA8QwBAPIMAQCADAEAgQwBAIIMAQCDDAEAhAwBAIUMAQCGDAEAhwwBAIgMAQCJDAEAigwBAIsMAQCMDAEAjQwBAI4MAQCPDAEAkAwBAJEMAQCSDAEAkwwBAJQMAQCVDAEAlgwBAJcMAQCYDAEAmQwBAJoMAQCbDAEAnAwBAJ0MAQCeDAEAnwwBAKAMAQChDAEAogwBAKMMAQCkDAEApQwBAKYMAQCnDAEAqAwBAKkMAQCqDAEAqwwBAKwMAQCtDAEArgwBAK8MAQCwDAEAsQwBALIMAQDAGAEAwRgBAMIYAQDDGAEAxBgBAMUYAQDGGAEAxxgBAMgYAQDJGAEAyhgBAMsYAQDMGAEAzRgBAM4YAQDPGAEA0BgBANEYAQDSGAEA0xgBANQYAQDVGAEA1hgBANcYAQDYGAEA2RgBANoYAQDbGAEA3BgBAN0YAQDeGAEA3xgBAKAYAQChGAEAohgBAKMYAQCkGAEApRgBAKYYAQCnGAEAqBgBAKkYAQCqGAEAqxgBAKwYAQCtGAEArhgBAK8YAQCwGAEAsRgBALIYAQCzGAEAtBgBALUYAQC2GAEAtxgBALgYAQC5GAEAuhgBALsYAQC8GAEAvRgBAL4YAQC/GAEAYG4BAGFuAQBibgEAY24BAGRuAQBlbgEAZm4BAGduAQBobgEAaW4BAGpuAQBrbgEAbG4BAG1uAQBubgEAb24BAHBuAQBxbgEAcm4BAHNuAQB0bgEAdW4BAHZuAQB3bgEAeG4BAHluAQB6bgEAe24BAHxuAQB9bgEAfm4BAH9uAQBAbgEAQW4BAEJuAQBDbgEARG4BAEVuAQBGbgEAR24BAEhuAQBJbgEASm4BAEtuAQBMbgEATW4BAE5uAQBPbgEAUG4BAFFuAQBSbgEAU24BAFRuAQBVbgEAVm4BAFduAQBYbgEAWW4BAFpuAQBbbgEAXG4BAF1uAQBebgEAX24BACLpAQAj6QEAJOkBACXpAQAm6QEAJ+kBACjpAQAp6QEAKukBACvpAQAs6QEALekBAC7pAQAv6QEAMOkBADHpAQAy6QEAM+kBADTpAQA16QEANukBADfpAQA46QEAOekBADrpAQA76QEAPOkBAD3pAQA+6QEAP+kBAEDpAQBB6QEAQukBAEPpAQAA6QEAAekBAALpAQAD6QEABOkBAAXpAQAG6QEAB+kBAAjpAQAJ6QEACukBAAvpAQAM6QEADekBAA7pAQAP6QEAEOkBABHpAQAS6QEAE+kBABTpAQAV6QEAFukBABfpAQAY6QEAGekBABrpAQAb6QEAHOkBAB3pAQAe6QEAH+kBACDpAQAh6QEAQQAAAKwkEQABAAAAQgAAALAkEQABAAAAQwAAALQkEQABAAAARAAAADQtFgABAAAARQAAALgkEQABAAAARgAAALwkEQABAAAARwAAAMAkEQABAAAASAAAAMQkEQABAAAASQAAAMgkEQABAAAASgAAAMwkEQABAAAASwAAANAkEQACAAAATAAAANgkEQABAAAATQAAANwkEQABAAAATgAAAOAkEQABAAAATwAAAOQkEQABAAAAUAAAAOgkEQABAAAAUQAAAOwkEQABAAAAUgAAAPAkEQABAAAAUwAAAPQkEQACAAAAVAAAAPwkEQABAAAAVQAAAAAlEQABAAAAVgAAAAQlEQABAAAAVwAAAAglEQABAAAAWAAAAAwlEQABAAAAWQAAABAlEQABAAAAWgAAABQlEQABAAAAYQAAABglEQABAAAAYgAAABwlEQABAAAAYwAAACAlEQABAAAAZAAAADAtFgABAAAAZQAAACQlEQABAAAAZgAAACglEQABAAAAZwAAACwlEQABAAAAaAAAADAlEQABAAAAaQAAADQlEQABAAAAagAAADglEQABAAAAawAAADwlEQACAAAAbAAAAEQlEQABAAAAbQAAAEglEQABAAAAbgAAAEwlEQABAAAAbwAAAFAlEQABAAAAcAAAAFQlEQABAAAAcQAAAFglEQABAAAAcgAAAFwlEQABAAAAcwAAAGAlEQACAAAAdAAAAGglEQABAAAAdQAAAGwlEQABAAAAdgAAAHAlEQABAAAAdwAAAHQlEQABAAAAeAAAAHglEQABAAAAeQAAAHwlEQABAAAAegAAAIAlEQABAAAAtQAAAIQlEQACAAAAwAAAAIwlEQABAAAAwQAAAJAlEQABAAAAwgAAAJQlEQABAAAAwwAAAJglEQABAAAAxAAAAJwlEQABAAAAxQAAAKAlEQACAAAAxgAAAKglEQABAAAAxwAAAKwlEQABAAAAyAAAALAlEQABAAAAyQAAALQlEQABAAAAygAAALglEQABAAAAywAAALwlEQABAAAAzAAAAMAlEQABAAAAzQAAAMQlEQABAAAAzgAAAMglEQABAAAAzwAAAMwlEQABAAAA0AAAANAlEQABAAAA0QAAANQlEQABAAAA0gAAANglEQABAAAA0wAAANwlEQABAAAA1AAAAOAlEQABAAAA1QAAAOQlEQABAAAA1gAAAOglEQABAAAA2AAAAOwlEQABAAAA2QAAAPAlEQABAAAA2gAAAPQlEQABAAAA2wAAAPglEQABAAAA3AAAAPwlEQABAAAA3QAAAAAmEQABAAAA3gAAAAQmEQABAAAA3wAAAAgmEQABAAAA4AAAAAwmEQABAAAA4QAAABAmEQABAAAA4gAAABQmEQABAAAA4wAAABgmEQABAAAA5AAAABwmEQABAAAA5QAAACAmEQACAAAA5gAAACgmEQABAAAA5wAAACwmEQABAAAA6AAAADAmEQABAAAA6QAAADQmEQABAAAA6gAAADgmEQABAAAA6wAAADwmEQABAAAA7AAAAEAmEQABAAAA7QAAAEQmEQABAAAA7gAAAEgmEQABAAAA7wAAAEwmEQABAAAA8AAAAFAmEQABAAAA8QAAAFQmEQABAAAA8gAAAFgmEQABAAAA8wAAAFwmEQABAAAA9AAAAGAmEQABAAAA9QAAAGQmEQABAAAA9gAAAGgmEQABAAAA+AAAAGwmEQABAAAA+QAAAHAmEQABAAAA+gAAAHQmEQABAAAA+wAAAHgmEQABAAAA/AAAAHwmEQABAAAA/QAAAIAmEQABAAAA/gAAAIQmEQABAAAA/wAAAIgmEQABAAAAAAEAAIwmEQABAAAAAQEAAJAmEQABAAAAAgEAAJQmEQABAAAAAwEAAJgmEQABAAAABAEAAJwmEQABAAAABQEAAKAmEQABAAAABgEAAKQmEQABAAAABwEAAKgmEQABAAAACAEAAKwmEQABAAAACQEAALAmEQABAAAACgEAALQmEQABAAAACwEAALgmEQABAAAADAEAALwmEQABAAAADQEAAMAmEQABAAAADgEAAMQmEQABAAAADwEAAMgmEQABAAAAEAEAAMwmEQABAAAAEQEAANAmEQABAAAAEgEAANQmEQABAAAAEwEAANgmEQABAAAAFAEAANwmEQABAAAAFQEAAOAmEQABAAAAFgEAAOQmEQABAAAAFwEAAOgmEQABAAAAGAEAAOwmEQABAAAAGQEAAPAmEQABAAAAGgEAAPQmEQABAAAAGwEAAPgmEQABAAAAHAEAAPwmEQABAAAAHQEAAAAnEQABAAAAHgEAAAQnEQABAAAAHwEAAAgnEQABAAAAIAEAAAwnEQABAAAAIQEAABAnEQABAAAAIgEAABQnEQABAAAAIwEAABgnEQABAAAAJAEAABwnEQABAAAAJQEAACAnEQABAAAAJgEAACQnEQABAAAAJwEAACgnEQABAAAAKAEAACwnEQABAAAAKQEAADAnEQABAAAAKgEAADQnEQABAAAAKwEAADgnEQABAAAALAEAADwnEQABAAAALQEAAEAnEQABAAAALgEAAEQnEQABAAAALwEAAEgnEQABAAAAMgEAAEwnEQABAAAAMwEAAFAnEQABAAAANAEAAFQnEQABAAAANQEAAFgnEQABAAAANgEAAFwnEQABAAAANwEAAGAnEQABAAAAOQEAAGQnEQABAAAAOgEAAGgnEQABAAAAOwEAAGwnEQABAAAAPAEAAHAnEQABAAAAPQEAAHQnEQABAAAAPgEAAHgnEQABAAAAPwEAAHwnEQABAAAAQAEAAIAnEQABAAAAQQEAAIQnEQABAAAAQgEAAIgnEQABAAAAQwEAAIwnEQABAAAARAEAAJAnEQABAAAARQEAAJQnEQABAAAARgEAAJgnEQABAAAARwEAAJwnEQABAAAASAEAAKAnEQABAAAASgEAAKQnEQABAAAASwEAAKgnEQABAAAATAEAAKwnEQABAAAATQEAALAnEQABAAAATgEAALQnEQABAAAATwEAALgnEQABAAAAUAEAALwnEQABAAAAUQEAAMAnEQABAAAAUgEAAMQnEQABAAAAUwEAAMgnEQABAAAAVAEAAMwnEQABAAAAVQEAANAnEQABAAAAVgEAANQnEQABAAAAVwEAANgnEQABAAAAWAEAANwnEQABAAAAWQEAAOAnEQABAAAAWgEAAOQnEQABAAAAWwEAAOgnEQABAAAAXAEAAOwnEQABAAAAXQEAAPAnEQABAAAAXgEAAPQnEQABAAAAXwEAAPgnEQABAAAAYAEAAPwnEQABAAAAYQEAAAAoEQABAAAAYgEAAAQoEQABAAAAYwEAAAgoEQABAAAAZAEAAAwoEQABAAAAZQEAABAoEQABAAAAZgEAABQoEQABAAAAZwEAABgoEQABAAAAaAEAABwoEQABAAAAaQEAACAoEQABAAAAagEAACQoEQABAAAAawEAACgoEQABAAAAbAEAACwoEQABAAAAbQEAADAoEQABAAAAbgEAADQoEQABAAAAbwEAADgoEQABAAAAcAEAADwoEQABAAAAcQEAAEAoEQABAAAAcgEAAEQoEQABAAAAcwEAAEgoEQABAAAAdAEAAEwoEQABAAAAdQEAAFAoEQABAAAAdgEAAFQoEQABAAAAdwEAAFgoEQABAAAAeAEAAFwoEQABAAAAeQEAAGAoEQABAAAAegEAAGQoEQABAAAAewEAAGgoEQABAAAAfAEAAGwoEQABAAAAfQEAAHAoEQABAAAAfgEAAHQoEQABAAAAfwEAAHgoEQACAAAAgAEAAIAoEQABAAAAgQEAAIQoEQABAAAAggEAAIgoEQABAAAAgwEAAIwoEQABAAAAhAEAAJAoEQABAAAAhQEAAJQoEQABAAAAhgEAAJgoEQABAAAAhwEAAJwoEQABAAAAiAEAAKAoEQABAAAAiQEAAKQoEQABAAAAigEAAKgoEQABAAAAiwEAAKwoEQABAAAAjAEAALAoEQABAAAAjgEAALQoEQABAAAAjwEAALgoEQABAAAAkAEAALwoEQABAAAAkQEAAMAoEQABAAAAkgEAAMQoEQABAAAAkwEAAMgoEQABAAAAlAEAAMwoEQABAAAAlQEAANAoEQABAAAAlgEAANQoEQABAAAAlwEAANgoEQABAAAAmAEAANwoEQABAAAAmQEAAOAoEQABAAAAmgEAAOQoEQABAAAAnAEAAOgoEQABAAAAnQEAAOwoEQABAAAAngEAAPAoEQABAAAAnwEAAPQoEQABAAAAoAEAAPgoEQABAAAAoQEAAPwoEQABAAAAogEAAAApEQABAAAAowEAAAQpEQABAAAApAEAAAgpEQABAAAApQEAAAwpEQABAAAApgEAABApEQABAAAApwEAABQpEQABAAAAqAEAABgpEQABAAAAqQEAABwpEQABAAAArAEAACApEQABAAAArQEAACQpEQABAAAArgEAACgpEQABAAAArwEAACwpEQABAAAAsAEAADApEQABAAAAsQEAADQpEQABAAAAsgEAADgpEQABAAAAswEAADwpEQABAAAAtAEAAEApEQABAAAAtQEAAEQpEQABAAAAtgEAAEgpEQABAAAAtwEAAEwpEQABAAAAuAEAAFApEQABAAAAuQEAAFQpEQABAAAAvAEAAFgpEQABAAAAvQEAAFwpEQABAAAAvwEAAGApEQABAAAAxAEAAGQpEQACAAAAxQEAAGwpEQACAAAAxgEAAHQpEQACAAAAxwEAAHwpEQACAAAAyAEAAIQpEQACAAAAyQEAAIwpEQACAAAAygEAAJQpEQACAAAAywEAAJwpEQACAAAAzAEAAKQpEQACAAAAzQEAAKwpEQABAAAAzgEAALApEQABAAAAzwEAALQpEQABAAAA0AEAALgpEQABAAAA0QEAALwpEQABAAAA0gEAAMApEQABAAAA0wEAAMQpEQABAAAA1AEAAMgpEQABAAAA1QEAAMwpEQABAAAA1gEAANApEQABAAAA1wEAANQpEQABAAAA2AEAANgpEQABAAAA2QEAANwpEQABAAAA2gEAAOApEQABAAAA2wEAAOQpEQABAAAA3AEAAOgpEQABAAAA3QEAAOwpEQABAAAA3gEAAPApEQABAAAA3wEAAPQpEQABAAAA4AEAAPgpEQABAAAA4QEAAPwpEQABAAAA4gEAAAAqEQABAAAA4wEAAAQqEQABAAAA5AEAAAgqEQABAAAA5QEAAAwqEQABAAAA5gEAABAqEQABAAAA5wEAABQqEQABAAAA6AEAABgqEQABAAAA6QEAABwqEQABAAAA6gEAACAqEQABAAAA6wEAACQqEQABAAAA7AEAACgqEQABAAAA7QEAACwqEQABAAAA7gEAADAqEQABAAAA7wEAADQqEQABAAAA8QEAADgqEQACAAAA8gEAAEAqEQACAAAA8wEAAEgqEQACAAAA9AEAAFAqEQABAAAA9QEAAFQqEQABAAAA9gEAAFgqEQABAAAA9wEAAFwqEQABAAAA+AEAAGAqEQABAAAA+QEAAGQqEQABAAAA+gEAAGgqEQABAAAA+wEAAGwqEQABAAAA/AEAAHAqEQABAAAA/QEAAHQqEQABAAAA/gEAAHgqEQABAAAA/wEAAHwqEQABAAAAAAIAAIAqEQABAAAAAQIAAIQqEQABAAAAAgIAAIgqEQABAAAAAwIAAIwqEQABAAAABAIAAJAqEQABAAAABQIAAJQqEQABAAAABgIAAJgqEQABAAAABwIAAJwqEQABAAAACAIAAKAqEQABAAAACQIAAKQqEQABAAAACgIAAKgqEQABAAAACwIAAKwqEQABAAAADAIAALAqEQABAAAADQIAALQqEQABAAAADgIAALgqEQABAAAADwIAALwqEQABAAAAEAIAAMAqEQABAAAAEQIAAMQqEQABAAAAEgIAAMgqEQABAAAAEwIAAMwqEQABAAAAFAIAANAqEQABAAAAFQIAANQqEQABAAAAFgIAANgqEQABAAAAFwIAANwqEQABAAAAGAIAAOAqEQABAAAAGQIAAOQqEQABAAAAGgIAAOgqEQABAAAAGwIAAOwqEQABAAAAHAIAAPAqEQABAAAAHQIAAPQqEQABAAAAHgIAAPgqEQABAAAAHwIAAPwqEQABAAAAIAIAAAArEQABAAAAIgIAAAQrEQABAAAAIwIAAAgrEQABAAAAJAIAAAwrEQABAAAAJQIAABArEQABAAAAJgIAABQrEQABAAAAJwIAABgrEQABAAAAKAIAABwrEQABAAAAKQIAACArEQABAAAAKgIAACQrEQABAAAAKwIAACgrEQABAAAALAIAACwrEQABAAAALQIAADArEQABAAAALgIAADQrEQABAAAALwIAADgrEQABAAAAMAIAADwrEQABAAAAMQIAAEArEQABAAAAMgIAAEQrEQABAAAAMwIAAEgrEQABAAAAOgIAAEwrEQABAAAAOwIAAFArEQABAAAAPAIAAFQrEQABAAAAPQIAAFgrEQABAAAAPgIAAFwrEQABAAAAPwIAAGArEQABAAAAQAIAAGQrEQABAAAAQQIAAGgrEQABAAAAQgIAAGwrEQABAAAAQwIAAHArEQABAAAARAIAAHQrEQABAAAARQIAAHgrEQABAAAARgIAAHwrEQABAAAARwIAAIArEQABAAAASAIAAIQrEQABAAAASQIAAIgrEQABAAAASgIAAIwrEQABAAAASwIAAJArEQABAAAATAIAAJQrEQABAAAATQIAAJgrEQABAAAATgIAAJwrEQABAAAATwIAAKArEQABAAAAUAIAAKQrEQABAAAAUQIAAKgrEQABAAAAUgIAAKwrEQABAAAAUwIAALArEQABAAAAVAIAALQrEQABAAAAVgIAALgrEQABAAAAVwIAALwrEQABAAAAWQIAAMArEQABAAAAWwIAAMQrEQABAAAAXAIAAMgrEQABAAAAYAIAAMwrEQABAAAAYQIAANArEQABAAAAYwIAANQrEQABAAAAZQIAANgrEQABAAAAZgIAANwrEQABAAAAaAIAAOArEQABAAAAaQIAAOQrEQABAAAAagIAAOgrEQABAAAAawIAAOwrEQABAAAAbAIAAPArEQABAAAAbwIAAPQrEQABAAAAcQIAAPgrEQABAAAAcgIAAPwrEQABAAAAdQIAAAAsEQABAAAAfQIAAAQsEQABAAAAgAIAAAgsEQABAAAAggIAAAwsEQABAAAAgwIAABAsEQABAAAAhwIAABQsEQABAAAAiAIAABgsEQABAAAAiQIAABwsEQABAAAAigIAACAsEQABAAAAiwIAACQsEQABAAAAjAIAACgsEQABAAAAkgIAACwsEQABAAAAnQIAADAsEQABAAAAngIAADQsEQABAAAARQMAADgsEQADAAAAcAMAAEQsEQABAAAAcQMAAEgsEQABAAAAcgMAAEwsEQABAAAAcwMAAFAsEQABAAAAdgMAAFQsEQABAAAAdwMAAFgsEQABAAAAewMAAFwsEQABAAAAfAMAAGAsEQABAAAAfQMAAGQsEQABAAAAfwMAAGgsEQABAAAAhgMAAGwsEQABAAAAiAMAAHAsEQABAAAAiQMAAHQsEQABAAAAigMAAHgsEQABAAAAjAMAAHwsEQABAAAAjgMAAIAsEQABAAAAjwMAAIQsEQABAAAAkQMAAIgsEQABAAAAkgMAAIwsEQACAAAAkwMAAJQsEQABAAAAlAMAAJgsEQABAAAAlQMAAJwsEQACAAAAlgMAAKQsEQABAAAAlwMAAKgsEQABAAAAmAMAAKwsEQADAAAAmQMAALgsEQADAAAAmgMAAMQsEQACAAAAmwMAAMwsEQABAAAAnAMAANAsEQACAAAAnQMAANgsEQABAAAAngMAANwsEQABAAAAnwMAAOAsEQABAAAAoAMAAOQsEQACAAAAoQMAAOwsEQACAAAAowMAAPQsEQACAAAApAMAAPwsEQABAAAApQMAAAAtEQABAAAApgMAAAQtEQACAAAApwMAAAwtEQABAAAAqAMAABAtEQABAAAAqQMAABQtEQACAAAAqgMAABwtEQABAAAAqwMAACAtEQABAAAArAMAACQtEQABAAAArQMAACgtEQABAAAArgMAACwtEQABAAAArwMAADAtEQABAAAAsQMAADQtEQABAAAAsgMAADgtEQACAAAAswMAAEAtEQABAAAAtAMAAEQtEQABAAAAtQMAAEgtEQACAAAAtgMAAFAtEQABAAAAtwMAAFQtEQABAAAAuAMAAFgtEQADAAAAuQMAAGQtEQADAAAAugMAAHAtEQACAAAAuwMAAHgtEQABAAAAvAMAAHwtEQACAAAAvQMAAIQtEQABAAAAvgMAAIgtEQABAAAAvwMAAIwtEQABAAAAwAMAAJAtEQACAAAAwQMAAJgtEQACAAAAwgMAAKAtEQACAAAAwwMAAKgtEQACAAAAxAMAALAtEQABAAAAxQMAALQtEQABAAAAxgMAALgtEQACAAAAxwMAAMAtEQABAAAAyAMAAMQtEQABAAAAyQMAAMgtEQACAAAAygMAANAtEQABAAAAywMAANQtEQABAAAAzAMAANgtEQABAAAAzQMAANwtEQABAAAAzgMAAOAtEQABAAAAzwMAAOQtEQABAAAA0AMAAOgtEQACAAAA0QMAAPAtEQADAAAA1QMAAPwtEQACAAAA1gMAAAQuEQACAAAA1wMAAAwuEQABAAAA2AMAABAuEQABAAAA2QMAABQuEQABAAAA2gMAABguEQABAAAA2wMAABwuEQABAAAA3AMAACAuEQABAAAA3QMAACQuEQABAAAA3gMAACguEQABAAAA3wMAACwuEQABAAAA4AMAADAuEQABAAAA4QMAADQuEQABAAAA4gMAADguEQABAAAA4wMAADwuEQABAAAA5AMAAEAuEQABAAAA5QMAAEQuEQABAAAA5gMAAEguEQABAAAA5wMAAEwuEQABAAAA6AMAAFAuEQABAAAA6QMAAFQuEQABAAAA6gMAAFguEQABAAAA6wMAAFwuEQABAAAA7AMAAGAuEQABAAAA7QMAAGQuEQABAAAA7gMAAGguEQABAAAA7wMAAGwuEQABAAAA8AMAAHAuEQACAAAA8QMAAHguEQACAAAA8gMAAIAuEQABAAAA8wMAAIQuEQABAAAA9AMAAIguEQADAAAA9QMAAJQuEQACAAAA9wMAAJwuEQABAAAA+AMAAKAuEQABAAAA+QMAAKQuEQABAAAA+gMAAKguEQABAAAA+wMAAKwuEQABAAAA/QMAALAuEQABAAAA/gMAALQuEQABAAAA/wMAALguEQABAAAAAAQAALwuEQABAAAAAQQAAMAuEQABAAAAAgQAAMQuEQABAAAAAwQAAMguEQABAAAABAQAAMwuEQABAAAABQQAANAuEQABAAAABgQAANQuEQABAAAABwQAANguEQABAAAACAQAANwuEQABAAAACQQAAOAuEQABAAAACgQAAOQuEQABAAAACwQAAOguEQABAAAADAQAAOwuEQABAAAADQQAAPAuEQABAAAADgQAAPQuEQABAAAADwQAAPguEQABAAAAEAQAAPwuEQABAAAAEQQAAAAvEQABAAAAEgQAAAQvEQACAAAAEwQAAAwvEQABAAAAFAQAABAvEQACAAAAFQQAABgvEQABAAAAFgQAABwvEQABAAAAFwQAACAvEQABAAAAGAQAACQvEQABAAAAGQQAACgvEQABAAAAGgQAACwvEQABAAAAGwQAADAvEQABAAAAHAQAADQvEQABAAAAHQQAADgvEQABAAAAHgQAADwvEQACAAAAHwQAAEQvEQABAAAAIAQAAEgvEQABAAAAIQQAAEwvEQACAAAAIgQAAFQvEQADAAAAIwQAAGAvEQABAAAAJAQAAGQvEQABAAAAJQQAAGgvEQABAAAAJgQAAGwvEQABAAAAJwQAAHAvEQABAAAAKAQAAHQvEQABAAAAKQQAAHgvEQABAAAAKgQAAHwvEQACAAAAKwQAAIQvEQABAAAALAQAAIgvEQABAAAALQQAAIwvEQABAAAALgQAAJAvEQABAAAALwQAAJQvEQABAAAAMAQAAJgvEQABAAAAMQQAAJwvEQABAAAAMgQAAKAvEQACAAAAMwQAAKgvEQABAAAANAQAAKwvEQACAAAANQQAALQvEQABAAAANgQAALgvEQABAAAANwQAALwvEQABAAAAOAQAAMAvEQABAAAAOQQAAMQvEQABAAAAOgQAAMgvEQABAAAAOwQAAMwvEQABAAAAPAQAANAvEQABAAAAPQQAANQvEQABAAAAPgQAANgvEQACAAAAPwQAAOAvEQABAAAAQAQAAOQvEQABAAAAQQQAAOgvEQACAAAAQgQAAPAvEQADAAAAQwQAAPwvEQABAAAARAQAAAAwEQABAAAARQQAAAQwEQABAAAARgQAAAgwEQABAAAARwQAAAwwEQABAAAASAQAABAwEQABAAAASQQAABQwEQABAAAASgQAABgwEQACAAAASwQAACAwEQABAAAATAQAACQwEQABAAAATQQAACgwEQABAAAATgQAACwwEQABAAAATwQAADAwEQABAAAAUAQAADQwEQABAAAAUQQAADgwEQABAAAAUgQAADwwEQABAAAAUwQAAEAwEQABAAAAVAQAAEQwEQABAAAAVQQAAEgwEQABAAAAVgQAAEwwEQABAAAAVwQAAFAwEQABAAAAWAQAAFQwEQABAAAAWQQAAFgwEQABAAAAWgQAAFwwEQABAAAAWwQAAGAwEQABAAAAXAQAAGQwEQABAAAAXQQAAGgwEQABAAAAXgQAAGwwEQABAAAAXwQAAHAwEQABAAAAYAQAAHQwEQABAAAAYQQAAHgwEQABAAAAYgQAAHwwEQACAAAAYwQAAIQwEQACAAAAZAQAAIwwEQABAAAAZQQAAJAwEQABAAAAZgQAAJQwEQABAAAAZwQAAJgwEQABAAAAaAQAAJwwEQABAAAAaQQAAKAwEQABAAAAagQAAKQwEQABAAAAawQAAKgwEQABAAAAbAQAAKwwEQABAAAAbQQAALAwEQABAAAAbgQAALQwEQABAAAAbwQAALgwEQABAAAAcAQAALwwEQABAAAAcQQAAMAwEQABAAAAcgQAAMQwEQABAAAAcwQAAMgwEQABAAAAdAQAAMwwEQABAAAAdQQAANAwEQABAAAAdgQAANQwEQABAAAAdwQAANgwEQABAAAAeAQAANwwEQABAAAAeQQAAOAwEQABAAAAegQAAOQwEQABAAAAewQAAOgwEQABAAAAfAQAAOwwEQABAAAAfQQAAPAwEQABAAAAfgQAAPQwEQABAAAAfwQAAPgwEQABAAAAgAQAAPwwEQABAAAAgQQAAAAxEQABAAAAigQAAAQxEQABAAAAiwQAAAgxEQABAAAAjAQAAAwxEQABAAAAjQQAABAxEQABAAAAjgQAABQxEQABAAAAjwQAABgxEQABAAAAkAQAABwxEQABAAAAkQQAACAxEQABAAAAkgQAACQxEQABAAAAkwQAACgxEQABAAAAlAQAACwxEQABAAAAlQQAADAxEQABAAAAlgQAADQxEQABAAAAlwQAADgxEQABAAAAmAQAADwxEQABAAAAmQQAAEAxEQABAAAAmgQAAEQxEQABAAAAmwQAAEgxEQABAAAAnAQAAEwxEQABAAAAnQQAAFAxEQABAAAAngQAAFQxEQABAAAAnwQAAFgxEQABAAAAoAQAAFwxEQABAAAAoQQAAGAxEQABAAAAogQAAGQxEQABAAAAowQAAGgxEQABAAAApAQAAGwxEQABAAAApQQAAHAxEQABAAAApgQAAHQxEQABAAAApwQAAHgxEQABAAAAqAQAAHwxEQABAAAAqQQAAIAxEQABAAAAqgQAAIQxEQABAAAAqwQAAIgxEQABAAAArAQAAIwxEQABAAAArQQAAJAxEQABAAAArgQAAJQxEQABAAAArwQAAJgxEQABAAAAsAQAAJwxEQABAAAAsQQAAKAxEQABAAAAsgQAAKQxEQABAAAAswQAAKgxEQABAAAAtAQAAKwxEQABAAAAtQQAALAxEQABAAAAtgQAALQxEQABAAAAtwQAALgxEQABAAAAuAQAALwxEQABAAAAuQQAAMAxEQABAAAAugQAAMQxEQABAAAAuwQAAMgxEQABAAAAvAQAAMwxEQABAAAAvQQAANAxEQABAAAAvgQAANQxEQABAAAAvwQAANgxEQABAAAAwAQAANwxEQABAAAAwQQAAOAxEQABAAAAwgQAAOQxEQABAAAAwwQAAOgxEQABAAAAxAQAAOwxEQABAAAAxQQAAPAxEQABAAAAxgQAAPQxEQABAAAAxwQAAPgxEQABAAAAyAQAAPwxEQABAAAAyQQAAAAyEQABAAAAygQAAAQyEQABAAAAywQAAAgyEQABAAAAzAQAAAwyEQABAAAAzQQAABAyEQABAAAAzgQAABQyEQABAAAAzwQAABgyEQABAAAA0AQAABwyEQABAAAA0QQAACAyEQABAAAA0gQAACQyEQABAAAA0wQAACgyEQABAAAA1AQAACwyEQABAAAA1QQAADAyEQABAAAA1gQAADQyEQABAAAA1wQAADgyEQABAAAA2AQAADwyEQABAAAA2QQAAEAyEQABAAAA2gQAAEQyEQABAAAA2wQAAEgyEQABAAAA3AQAAEwyEQABAAAA3QQAAFAyEQABAAAA3gQAAFQyEQABAAAA3wQAAFgyEQABAAAA4AQAAFwyEQABAAAA4QQAAGAyEQABAAAA4gQAAGQyEQABAAAA4wQAAGgyEQABAAAA5AQAAGwyEQABAAAA5QQAAHAyEQABAAAA5gQAAHQyEQABAAAA5wQAAHgyEQABAAAA6AQAAHwyEQABAAAA6QQAAIAyEQABAAAA6gQAAIQyEQABAAAA6wQAAIgyEQABAAAA7AQAAIwyEQABAAAA7QQAAJAyEQABAAAA7gQAAJQyEQABAAAA7wQAAJgyEQABAAAA8AQAAJwyEQABAAAA8QQAAKAyEQABAAAA8gQAAKQyEQABAAAA8wQAAKgyEQABAAAA9AQAAKwyEQABAAAA9QQAALAyEQABAAAA9gQAALQyEQABAAAA9wQAALgyEQABAAAA+AQAALwyEQABAAAA+QQAAMAyEQABAAAA+gQAAMQyEQABAAAA+wQAAMgyEQABAAAA/AQAAMwyEQABAAAA/QQAANAyEQABAAAA/gQAANQyEQABAAAA/wQAANgyEQABAAAAAAUAANwyEQABAAAAAQUAAOAyEQABAAAAAgUAAOQyEQABAAAAAwUAAOgyEQABAAAABAUAAOwyEQABAAAABQUAAPAyEQABAAAABgUAAPQyEQABAAAABwUAAPgyEQABAAAACAUAAPwyEQABAAAACQUAAAAzEQABAAAACgUAAAQzEQABAAAACwUAAAgzEQABAAAADAUAAAwzEQABAAAADQUAABAzEQABAAAADgUAABQzEQABAAAADwUAABgzEQABAAAAEAUAABwzEQABAAAAEQUAACAzEQABAAAAEgUAACQzEQABAAAAEwUAACgzEQABAAAAFAUAACwzEQABAAAAFQUAADAzEQABAAAAFgUAADQzEQABAAAAFwUAADgzEQABAAAAGAUAADwzEQABAAAAGQUAAEAzEQABAAAAGgUAAEQzEQABAAAAGwUAAEgzEQABAAAAHAUAAEwzEQABAAAAHQUAAFAzEQABAAAAHgUAAFQzEQABAAAAHwUAAFgzEQABAAAAIAUAAFwzEQABAAAAIQUAAGAzEQABAAAAIgUAAGQzEQABAAAAIwUAAGgzEQABAAAAJAUAAGwzEQABAAAAJQUAAHAzEQABAAAAJgUAAHQzEQABAAAAJwUAAHgzEQABAAAAKAUAAHwzEQABAAAAKQUAAIAzEQABAAAAKgUAAIQzEQABAAAAKwUAAIgzEQABAAAALAUAAIwzEQABAAAALQUAAJAzEQABAAAALgUAAJQzEQABAAAALwUAAJgzEQABAAAAMQUAAJwzEQABAAAAMgUAAKAzEQABAAAAMwUAAKQzEQABAAAANAUAAKgzEQABAAAANQUAAKwzEQABAAAANgUAALAzEQABAAAANwUAALQzEQABAAAAOAUAALgzEQABAAAAOQUAALwzEQABAAAAOgUAAMAzEQABAAAAOwUAAMQzEQABAAAAPAUAAMgzEQABAAAAPQUAAMwzEQABAAAAPgUAANAzEQABAAAAPwUAANQzEQABAAAAQAUAANgzEQABAAAAQQUAANwzEQABAAAAQgUAAOAzEQABAAAAQwUAAOQzEQABAAAARAUAAOgzEQABAAAARQUAAOwzEQABAAAARgUAAPAzEQABAAAARwUAAPQzEQABAAAASAUAAPgzEQABAAAASQUAAPwzEQABAAAASgUAAAA0EQABAAAASwUAAAQ0EQABAAAATAUAAAg0EQABAAAATQUAAAw0EQABAAAATgUAABA0EQABAAAATwUAABQ0EQABAAAAUAUAABg0EQABAAAAUQUAABw0EQABAAAAUgUAACA0EQABAAAAUwUAACQ0EQABAAAAVAUAACg0EQABAAAAVQUAACw0EQABAAAAVgUAADA0EQABAAAAYQUAADQ0EQABAAAAYgUAADg0EQABAAAAYwUAADw0EQABAAAAZAUAAEA0EQABAAAAZQUAAEQ0EQABAAAAZgUAAEg0EQABAAAAZwUAAEw0EQABAAAAaAUAAFA0EQABAAAAaQUAAFQ0EQABAAAAagUAAFg0EQABAAAAawUAAFw0EQABAAAAbAUAAGA0EQABAAAAbQUAAGQ0EQABAAAAbgUAAGg0EQABAAAAbwUAAGw0EQABAAAAcAUAAHA0EQABAAAAcQUAAHQ0EQABAAAAcgUAAHg0EQABAAAAcwUAAHw0EQABAAAAdAUAAIA0EQABAAAAdQUAAIQ0EQABAAAAdgUAAIg0EQABAAAAdwUAAIw0EQABAAAAeAUAAJA0EQABAAAAeQUAAJQ0EQABAAAAegUAAJg0EQABAAAAewUAAJw0EQABAAAAfAUAAKA0EQABAAAAfQUAAKQ0EQABAAAAfgUAAKg0EQABAAAAfwUAAKw0EQABAAAAgAUAALA0EQABAAAAgQUAALQ0EQABAAAAggUAALg0EQABAAAAgwUAALw0EQABAAAAhAUAAMA0EQABAAAAhQUAAMQ0EQABAAAAhgUAAMg0EQABAAAAoBAAAMw0EQABAAAAoRAAANA0EQABAAAAohAAANQ0EQABAAAAoxAAANg0EQABAAAApBAAANw0EQABAAAApRAAAOA0EQABAAAAphAAAOQ0EQABAAAApxAAAOg0EQABAAAAqBAAAOw0EQABAAAAqRAAAPA0EQABAAAAqhAAAPQ0EQABAAAAqxAAAPg0EQABAAAArBAAAPw0EQABAAAArRAAAAA1EQABAAAArhAAAAQ1EQABAAAArxAAAAg1EQABAAAAsBAAAAw1EQABAAAAsRAAABA1EQABAAAAshAAABQ1EQABAAAAsxAAABg1EQABAAAAtBAAABw1EQABAAAAtRAAACA1EQABAAAAthAAACQ1EQABAAAAtxAAACg1EQABAAAAuBAAACw1EQABAAAAuRAAADA1EQABAAAAuhAAADQ1EQABAAAAuxAAADg1EQABAAAAvBAAADw1EQABAAAAvRAAAEA1EQABAAAAvhAAAEQ1EQABAAAAvxAAAEg1EQABAAAAwBAAAEw1EQABAAAAwRAAAFA1EQABAAAAwhAAAFQ1EQABAAAAwxAAAFg1EQABAAAAxBAAAFw1EQABAAAAxRAAAGA1EQABAAAAxxAAAGQ1EQABAAAAzRAAAGg1EQABAAAA0BAAAGw1EQABAAAA0RAAAHA1EQABAAAA0hAAAHQ1EQABAAAA0xAAAHg1EQABAAAA1BAAAHw1EQABAAAA1RAAAIA1EQABAAAA1hAAAIQ1EQABAAAA1xAAAIg1EQABAAAA2BAAAIw1EQABAAAA2RAAAJA1EQABAAAA2hAAAJQ1EQABAAAA2xAAAJg1EQABAAAA3BAAAJw1EQABAAAA3RAAAKA1EQABAAAA3hAAAKQ1EQABAAAA3xAAAKg1EQABAAAA4BAAAKw1EQABAAAA4RAAALA1EQABAAAA4hAAALQ1EQABAAAA4xAAALg1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EQABAAAApxwAAEA4EQABAAAAqBwAAEQ4EQABAAAAqRwAAEg4EQABAAAAqhwAAEw4EQABAAAAqxwAAFA4EQABAAAArBwAAFQ4EQABAAAArRwAAFg4EQABAAAArhwAAFw4EQABAAAArxwAAGA4EQABAAAAsBwAAGQ4EQABAAAAsRwAAGg4EQABAAAAshwAAGw4EQABAAAAsxwAAHA4EQABAAAAtBwAAHQ4EQABAAAAtRwAAHg4EQABAAAAthwAAHw4EQABAAAAtxwAAIA4EQABAAAAuBwAAIQ4EQABAAAAuRwAAIg4EQABAAAAuhwAAIw4EQABAAAAvRwAAJA4EQABAAAAvhwAAJQ4EQABAAAAvxwAAJg4EQABAAAAeR0AAJw4EQABAAAAfR0AAKA4EQABAAAAjh0AAKQ4EQABAAAAAB4AAKg4EQABAAAAAR4AAKw4EQABAAAAAh4AALA4EQABAAAAAx4AALQ4EQABAAAABB4AALg4EQABAAAABR4AALw4EQABAAAABh4AAMA4EQABAAAABx4AAMQ4EQABAAAACB4AAMg4EQABAAAACR4AAMw4EQABAAAACh4AANA4EQABAAAACx4AANQ4EQABAAAADB4AANg4EQABAAAADR4AANw4EQABAAAADh4AAOA4EQABAAAADx4AAOQ4EQABAAAAEB4AAOg4EQABAAAAER4AAOw4EQABAAAAEh4AAPA4EQABAAAAEx4AAPQ4EQABAAAAFB4AAPg4EQABAAAAFR4AAPw4EQABAAAAFh4AAAA5EQABAAAAFx4AAAQ5EQABAAAAGB4AAAg5EQABAAAAGR4AAAw5EQABAAAAGh4AABA5EQABAAAAGx4AABQ5EQABAAAAHB4AABg5EQABAAAAHR4AABw5EQABAAAAHh4AACA5EQABAAAAHx4AACQ5EQABAAAAIB4AACg5EQABAAAAIR4AACw5EQABAAAAIh4AADA5EQABAAAAIx4AADQ5EQABAAAAJB4AADg5EQABAAAAJR4AADw5EQABAAAAJh4AAEA5EQABAAAAJx4AAEQ5EQABAAAAKB4AAEg5EQABAAAAKR4AAEw5EQABAAAAKh4AAFA5EQABAAAAKx4AAFQ5EQABAAAALB4AAFg5EQABAAAALR4AAFw5EQABAAAALh4AAGA5EQABAAAALx4AAGQ5EQABAAAAMB4AAGg5EQABAAAAMR4AAGw5EQABAAAAMh4AAHA5EQABAAAAMx4AAHQ5EQABAAAANB4AAHg5EQABAAAANR4AAHw5EQABAAAANh4AAIA5EQABAAAANx4AAIQ5EQABAAAAOB4AAIg5EQABAAAAOR4AAIw5EQABAAAAOh4AAJA5EQABAAAAOx4AAJQ5EQABAAAAPB4AAJg5EQABAAAAPR4AAJw5EQABAAAAPh4AAKA5EQABAAAAPx4AAKQ5EQABAAAAQB4AAKg5EQABAAAAQR4AAKw5EQABAAAAQh4AALA5EQABAAAAQx4AALQ5EQABAAAARB4AALg5EQABAAAARR4AALw5EQABAAAARh4AAMA5EQABAAAARx4AAMQ5EQABAAAASB4AAMg5EQABAAAASR4AAMw5EQABAAAASh4AANA5EQABAAAASx4AANQ5EQABAAAATB4AANg5EQABAAAATR4AANw5EQABAAAATh4AAOA5EQABAAAATx4AAOQ5EQABAAAAUB4AAOg5EQABAAAAUR4AAOw5EQABAAAAUh4AAPA5EQABAAAAUx4AAPQ5EQABAAAAVB4AAPg5EQABAAAAVR4AAPw5EQABAAAAVh4AAAA6EQABAAAAVx4AAAQ6EQABAAAAWB4AAAg6EQABAAAAWR4AAAw6EQABAAAAWh4AABA6EQABAAAAWx4AABQ6EQABAAAAXB4AABg6EQABAAAAXR4AABw6EQABAAAAXh4AACA6EQABAAAAXx4AACQ6EQABAAAAYB4AACg6EQACAAAAYR4AADA6EQACAAAAYh4AADg6EQABAAAAYx4AADw6EQABAAAAZB4AAEA6EQABAAAAZR4AAEQ6EQABAAAAZh4AAEg6EQABAAAAZx4AAEw6EQABAAAAaB4AAFA6EQABAAAAaR4AAFQ6EQABAAAAah4AAFg6EQABAAAAax4AAFw6EQABAAAAbB4AAGA6EQABAAAAbR4AAGQ6EQABAAAAbh4AAGg6EQABAAAAbx4AAGw6EQABAAAAcB4AAHA6EQABAAAAcR4AAHQ6EQABAAAAch4AAHg6EQABAAAAcx4AAHw6EQABAAAAdB4AAIA6EQABAAAAdR4AAIQ6EQABAAAAdh4AAIg6EQABAAAAdx4AAIw6EQABAAAAeB4AAJA6EQABAAAAeR4AAJQ6EQABAAAAeh4AAJg6EQABAAAAex4AAJw6EQABAAAAfB4AAKA6EQABAAAAfR4AAKQ6EQABAAAAfh4AAKg6EQABAAAAfx4AAKw6EQABAAAAgB4AALA6EQABAAAAgR4AALQ6EQABAAAAgh4AALg6EQABAAAAgx4AALw6EQABAAAAhB4AAMA6EQABAAAAhR4AAMQ6EQABAAAAhh4AAMg6EQABAAAAhx4AAMw6EQABAAAAiB4AANA6EQABAAAAiR4AANQ6EQABAAAAih4AANg6EQABAAAAix4AANw6EQABAAAAjB4AAOA6EQABAAAAjR4AAOQ6EQABAAAAjh4AAOg6EQABAAAAjx4AAOw6EQABAAAAkB4AAPA6EQABAAAAkR4AAPQ6EQABAAAAkh4AAPg6EQABAAAAkx4AAPw6EQABAAAAlB4AAAA7EQABAAAAlR4AAAQ7EQABAAAAmx4AAAg7EQACAAAAnh4AABA7EQABAAAAoB4AABQ7EQABAAAAoR4AABg7EQABAAAAoh4AABw7EQABAAAAox4AACA7EQABAAAApB4AACQ7EQABAAAApR4AACg7EQABAAAAph4AACw7EQABAAAApx4AADA7EQABAAAAqB4AADQ7EQABAAAAqR4AADg7EQABAAAAqh4AADw7EQABAAAAqx4AAEA7EQABAAAArB4AAEQ7EQABAAAArR4AAEg7EQABAAAArh4AAEw7EQABAAAArx4AAFA7EQABAAAAsB4AAFQ7EQABAAAAsR4AAFg7EQABAAAAsh4AAFw7EQABAAAAsx4AAGA7EQABAAAAtB4AAGQ7EQABAAAAtR4AAGg7EQABAAAAth4AAGw7EQABAAAAtx4AAHA7EQABAAAAuB4AAHQ7EQABAAAAuR4AAHg7EQABAAAAuh4AAHw7EQABAAAAux4AAIA7EQABAAAAvB4AAIQ7EQABAAAAvR4AAIg7EQABAAAAvh4AAIw7EQABAAAAvx4AAJA7EQABAAAAwB4AAJQ7EQABAAAAwR4AAJg7EQABAAAAwh4AAJw7EQABAAAAwx4AAKA7EQABAAAAxB4AAKQ7EQABAAAAxR4AAKg7EQABAAAAxh4AAKw7EQABAAAAxx4AALA7EQABAAAAyB4AALQ7EQABAAAAyR4AALg7EQABAAAAyh4AALw7EQABAAAAyx4AAMA7EQABAAAAzB4AAMQ7EQABAAAAzR4AAMg7EQABAAAAzh4AAMw7EQABAAAAzx4AANA7EQABAAAA0B4AANQ7EQABAAAA0R4AANg7EQABAAAA0h4AANw7EQABAAAA0x4AAOA7EQABAAAA1B4AAOQ7EQABAAAA1R4AAOg7EQABAAAA1h4AAOw7EQABAAAA1x4AAPA7EQABAAAA2B4AAPQ7EQABAAAA2R4AAPg7EQABAAAA2h4AAPw7EQABAAAA2x4AAAA8EQABAAAA3B4AAAQ8EQABAAAA3R4AAAg8EQABAAAA3h4AAAw8EQABAAAA3x4AABA8EQABAAAA4B4AABQ8EQABAAAA4R4AABg8EQABAAAA4h4AABw8EQABAAAA4x4AACA8EQABAAAA5B4AACQ8EQABAAAA5R4AACg8EQABAAAA5h4AACw8EQABAAAA5x4AADA8EQABAAAA6B4AADQ8EQABAAAA6R4AADg8EQABAAAA6h4AADw8EQABAAAA6x4AAEA8EQABAAAA7B4AAEQ8EQABAAAA7R4AAEg8EQABAAAA7h4AAEw8EQABAAAA7x4AAFA8EQABAAAA8B4AAFQ8EQABAAAA8R4AAFg8EQABAAAA8h4AAFw8EQABAAAA8x4AAGA8EQABAAAA9B4AAGQ8EQABAAAA9R4AAGg8EQABAAAA9h4AAGw8EQABAAAA9x4AAHA8EQABAAAA+B4AAHQ8EQABAAAA+R4AAHg8EQABAAAA+h4AAHw8EQABAAAA+x4AAIA8EQABAAAA/B4AAIQ8EQABAAAA/R4AAIg8EQABAAAA/h4AAIw8EQABAAAA/x4AAJA8EQABAAAAAB8AAJQ8EQABAAAAAR8AAJg8EQABAAAAAh8AAJw8EQABAAAAAx8AAKA8EQABAAAABB8AAKQ8EQABAAAABR8AAKg8EQABAAAABh8AAKw8EQABAAAABx8AALA8EQABAAAACB8AALQ8EQABAAAACR8AALg8EQABAAAACh8AALw8EQABAAAACx8AAMA8EQABAAAADB8AAMQ8EQABAAAADR8AAMg8EQABAAAADh8AAMw8EQABAAAADx8AANA8EQABAAAAEB8AANQ8EQABAAAAER8AANg8EQABAAAAEh8AANw8EQABAAAAEx8AAOA8EQABAAAAFB8AAOQ8EQABAAAAFR8AAOg8EQABAAAAGB8AAOw8EQABAAAAGR8AAPA8EQABAAAAGh8AAPQ8EQABAAAAGx8AAPg8EQABAAAAHB8AAPw8EQABAAAAHR8AAAA9EQABAAAAIB8AAAQ9EQABAAAAIR8AAAg9EQABAAAAIh8AAAw9EQABAAAAIx8AABA9EQABAAAAJB8AABQ9EQABAAAAJR8AABg9EQABAAAAJh8AABw9EQABAAAAJx8AACA9EQABAAAAKB8AACQ9EQABAAAAKR8AACg9EQABAAAAKh8AACw9EQABAAAAKx8AADA9EQABAAAALB8AADQ9EQABAAAALR8AADg9EQABAAAALh8AADw9EQABAAAALx8AAEA9EQABAAAAMB8AAEQ9EQABAAAAMR8AAEg9EQABAAAAMh8AAEw9EQABAAAAMx8AAFA9EQABAAAANB8AAFQ9EQABAAAANR8AAFg9EQABAAAANh8AAFw9EQABAAAANx8AAGA9EQABAAAAOB8AAGQ9EQABAAAAOR8AAGg9EQABAAAAOh8AAGw9EQABAAAAOx8AAHA9EQABAAAAPB8AAHQ9EQABAAAAPR8AAHg9EQABAAAAPh8AAHw9EQABAAAAPx8AAIA9EQABAAAAQB8AAIQ9EQABAAAAQR8AAIg9EQABAAAAQh8AAIw9EQABAAAAQx8AAJA9EQABAAAARB8AAJQ9EQABAAAARR8AAJg9EQABAAAASB8AAJw9EQABAAAASR8AAKA9EQABAAAASh8AAKQ9EQABAAAASx8AAKg9EQABAAAATB8AAKw9EQABAAAATR8AALA9EQABAAAAUR8AALQ9EQABAAAAUx8AALg9EQABAAAAVR8AALw9EQABAAAAVx8AAMA9EQABAAAAWR8AAMQ9EQABAAAAWx8AAMg9EQABAAAAXR8AAMw9EQABAAAAXx8AANA9EQABAAAAYB8AANQ9EQABAAAAYR8AANg9EQABAAAAYh8AANw9EQABAAAAYx8AAOA9EQABAAAAZB8AAOQ9EQABAAAAZR8AAOg9EQABAAAAZh8AAOw9EQABAAAAZx8AAPA9EQABAAAAaB8AAPQ9EQABAAAAaR8AAPg9EQABAAAAah8AAPw9EQABAAAAax8AAAA+EQABAAAAbB8AAAQ+EQABAAAAbR8AAAg+EQABAAAAbh8AAAw+EQABAAAAbx8AABA+EQABAAAAcB8AABQ+EQABAAAAcR8AABg+EQABAAAAch8AABw+EQABAAAAcx8AACA+EQABAAAAdB8AACQ+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EQABAAAAySQAAJRAEQABAAAAyiQAAJhAEQABAAAAyyQAAJxAEQABAAAAzCQAAKBAEQABAAAAzSQAAKRAEQABAAAAziQAAKhAEQABAAAAzyQAAKxAEQABAAAA0CQAALBAEQABAAAA0SQAALRAEQABAAAA0iQAALhAEQABAAAA0yQAALxAEQABAAAA1CQAAMBAEQABAAAA1SQAAMRAEQABAAAA1iQAAMhAEQABAAAA1yQAAMxAEQABAAAA2CQAANBAEQABAAAA2SQAANRAEQABAAAA2iQAANhAEQABAAAA2yQAANxAEQABAAAA3CQAAOBAEQABAAAA3SQAAORAEQABAAAA3iQAAOhAEQABAAAA3yQAAOxAEQABAAAA4CQAAPBAEQABAAAA4SQAAPRAEQABAAAA4iQAAPhAEQABAAAA4yQAAPxAEQABAAAA5CQAAABBEQABAAAA5SQAAARBEQABAAAA5iQAAAhBEQABAAAA5yQAAAxBEQABAAAA6CQAABBBEQABAAAA6SQAABRBEQABAAAAACwAABhBEQABAAAAASwAABxBEQABAAAAAiwAACBBEQABAAAAAywAACRBEQABAAAABCwAAChBEQABAAAABSwAACxBEQABAAAABiwAADBBEQABAAAABywAADRBEQABAAAACCwAADhBEQABAAAACSwAADxBEQABAAAACiwAAEBBEQABAAAACywAAERBEQABAAAADCwAAEhBEQABAAAADSwAAExBEQABAAAADiwAAFBBEQABAAAADywAAFRBEQABAAAAECwAAFhBEQABAAAAESwAAFxBEQABAAAAEiwAAGBBEQABAAAAEywAAGRBEQABAAAAFCwAAGhBEQABAAAAFSwAAGxBEQABAAAAFiwAAHBBEQABAAAAFywAAHRBEQABAAAAGCwAAHhBEQABAAAAGSwAAHxBEQABAAAAGiwAAIBBEQABAAAAGywAAIRBEQABAAAAHCwAAIhBEQABAAAAHSwAAIxBEQABAAAAHiwAAJBBEQABAAAAHywAAJRBEQABAAAAICwAAJhBEQABAAAAISwAAJxBEQABAAAAIiwAAKBBEQABAAAAIywAAKRBEQABAAAAJCwAAKhBEQABAAAAJSwAAKxBEQABAAAAJiwAALBBEQABAAAAJywAALRBEQABAAAAKCwAALhBEQABAAAAKSwAALxBEQABAAAAKiwAAMBBEQABAAAAKywAAMRBEQABAAAALCwAAMhBEQABAAAALSwAAMxBEQABAAAALiwAANBBEQABAAAALywAANRBEQABAAAAMCwAANhBEQABAAAAMSwAANxBEQABAAAAMiwAAOBBEQABAAAAMywAAORBEQABAAAANCwAAOhBEQABAAAANSwAAOxBEQABAAAANiwAAPBBEQABAAAANywAAPRBEQABAAAAOCwAAPhBEQABAAAAOSwAAPxBEQABAAAAOiwAAABCEQABAAAAOywAAARCEQABAAAAPCwAAAhCEQABAAAAPSwAAAxCEQABAAAAPiwAABBCEQABAAAAPywAABRCEQABAAAAQCwAABhCEQABAAAAQSwAABxCEQABAAAAQiwAACBCEQABAAAAQywAACRCEQABAAAARCwAAChCEQABAAAARSwAACxCEQABAAAARiwAADBCEQABAAAARywAADRCEQABAAAASCwAADhCEQABAAAASSwAADxCEQABAAAASiwAAEBCEQABAAAASywAAERCEQABAAAATCwAAEhCEQABAAAATSwAAExCEQABAAAATiwAAFBCEQABAAAATywAAFRCEQABAAAAUCwAAFhCEQABAAAAUSwAAFxCEQABAAAAUiwAAGBCEQABAAAAUywAAGRCEQABAAAAVCwAAGhCEQABAAAAVSwAAGxCEQABAAAAViwAAHBCEQABAAAAVywAAHRCEQABAAAAWCwAAHhCEQABAAAAWSwAAHxCEQABAAAAWiwAAIBCEQABAAAAWywAAIRCEQABAAAAXCwAAIhCEQABAAAAXSwAAIxCEQABAAAAXiwAAJBCEQABAAAAXywAAJRCEQABAAAAYCwAAJhCEQABAAAAYSwAAJxCEQABAAAAYiwAAKBCEQABAAAAYywAAKRCEQABAAAAZCwAAKhCEQABAAAAZSwAAKxCEQABAAAAZiwAALBCEQABAAAAZywAALRCEQABAAAAaCwAALhCEQABAAAAaSwAALxCEQABAAAAaiwAAMBCEQABAAAAaywAAMRCEQABAAAAbCwAAMhCEQABAAAAbSwAAMxCEQABAAAAbiwAANBCEQABAAAAbywAANRCEQABAAAAcCwAANhCEQABAAAAciwAANxCEQABAAAAcywAAOBCEQABAAAAdSwAAORCEQABAAAAdiwAAOhCEQABAAAAfiwAAOxCEQABAAAAfywAAPBCEQABAAAAgCwAAPRCEQABAAAAgSwAAPhCEQABAAAAgiwAAPxCEQABAAAAgywAAABDEQABAAAAhCwAAARDEQABAAAAhSwAAAhDEQABAAAAhiwAAAxDEQABAAAAhywAABBDEQABAAAAiCwAABRDEQABAAAAiSwAABhDEQABAAAAiiwAABxDEQABAAAAiywAACBDEQABAAAAjCwAACRDEQABAAAAjSwAAChDEQABAAAAjiwAACxDEQABAAAAjywAADBDEQABAAAAkCwAADRDEQABAAAAkSwAADhDEQABAAAAkiwAADxDEQABAAAAkywAAEBDEQABAAAAlCwAAERDEQABAAAAlSwAAEhDEQABAAAAliwAAExDEQABAAAAlywAAFBDEQABAAAAmCwAAFRDEQABAAAAmSwAAFhDEQABAAAAmiwAAFxDEQABAAAAmywAAGBDEQABAAAAnCwAAGRDEQABAAAAnSwAAGhDEQABAAAAniwAAGxDEQABAAAAnywAAHBDEQABAAAAoCwAAHRDEQABAAAAoSwAAHhDEQABAAAAoiwAAHxDEQABAAAAoywAAIBDEQABAAAApCwAAIRDEQABAAAApSwAAIhDEQABAAAApiwAAIxDEQABAAAApywAAJBDEQABAAAAqCwAAJRDEQABAAAAqSwAAJhDEQABAAAAqiwAAJxDEQABAAAAqywAAKBDEQABAAAArCwAAKRDEQABAAAArSwAAKhDEQABAAAAriwAAKxDEQABAAAArywAALBDEQABAAAAsCwAALRDEQABAAAAsSwAALhDEQABAAAAsiwAALxDEQABAAAAsywAAMBDEQABAAAAtCwAAMRDEQABAAAAtSwAAMhDEQABAAAAtiwAAMxDEQABAAAAtywAANBDEQABAAAAuCwAANRDEQABAAAAuSwAANhDEQABAAAAuiwAANxDEQABAAAAuywAAOBDEQABAAAAvCwAAORDEQABAAAAvSwAAOhDEQABAAAAviwAAOxDEQABAAAAvywAAPBDEQABAAAAwCwAAPRDEQABAAAAwSwAAPhDEQABAAAAwiwAAPxDEQABAAAAwywAAABEEQABAAAAxCwAAAREEQABAAAAxSwAAAhEEQABAAAAxiwAAAxEEQABAAAAxywAABBEEQABAAAAyCwAABREEQABAAAAySwAABhEEQABAAAAyiwAABxEEQABAAAAyywAACBEEQABAAAAzCwAACREEQABAAAAzSwAAChEEQABAAAAziwAACxEEQABAAAAzywAADBEEQABAAAA0CwAADREEQABAAAA0SwAADhEEQABAAAA0iwAADxEEQABAAAA0ywAAEBEEQABAAAA1CwAAEREEQABAAAA1SwAAEhEEQABAAAA1iwAAExEEQABAAAA1ywAAFBEEQABAAAA2CwAAFREEQABAAAA2SwAAFhEEQABAAAA2iwAAFxEEQABAAAA2ywAAGBEEQABAAAA3CwAAGREEQABAAAA3SwAAGhEEQABAAAA3iwAAGxEEQABAAAA3ywAAHBEEQABAAAA4CwAAHREEQABAAAA4SwAAHhEEQABAAAA4iwAAHxEEQABAAAA4ywAAIBEEQABAAAA6ywAAIREEQABAAAA7CwAAIhEEQABAAAA7SwAAIxEEQABAAAA7iwAAJBEEQABAAAA8iwAAJREEQABAAAA8ywAAJhEEQABAAAAAC0AAJxEEQABAAAAAS0AAKBEEQABAAAAAi0AAKREEQABAAAAAy0AAKhEEQABAAAABC0AAKxEEQABAAAABS0AALBEEQABAAAABi0AALREEQABAAAABy0AALhEEQABAAAACC0AALxEEQABAAAACS0AAMBEEQABAAAACi0AAMREEQABAAAACy0AAMhEEQABAAAADC0AAMxEEQABAAAADS0AANBEEQABAAAADi0AANREEQABAAAADy0AANhEEQABAAAAEC0AANxEEQABAAAAES0AAOBEEQABAAAAEi0AAOREEQABAAAAEy0AAOhEEQABAAAAFC0AAOxEEQABAAAAFS0AAPBEEQABAAAAFi0AAPREEQABAAAAFy0AAPhEEQABAAAAGC0AAPxEEQABAAAAGS0AAABFEQABAAAAGi0AAARFEQABAAAAGy0AAAhFEQABAAAAHC0AAAxFEQABAAAAHS0AABBFEQABAAAAHi0AABRFEQABAAAAHy0AABhFEQABAAAAIC0AABxFEQABAAAAIS0AACBFEQABAAAAIi0AACRFEQABAAAAIy0AAChFEQABAAAAJC0AACxFEQABAAAAJS0AADBFEQABAAAAJy0AADRFEQABAAAALS0AADhFEQABAAAAQKYAADxFEQABAAAAQaYAAEBFEQABAAAAQqYAAERFEQABAAAAQ6YAAEhFEQABAAAARKYAAExFEQABAAAARaYAAFBFEQABAAAARqYAAFRFEQABAAAAR6YAAFhFEQABAAAASKYAAFxFEQABAAAASaYAAGBFEQABAAAASqYAAGRFEQACAAAAS6YAAGxFEQACAAAATKYAAHRFEQABAAAATaYAAHhFEQABAAAATqYAAHxFEQABAAAAT6YAAIBFEQABAAAAUKYAAIRFEQABAAAAUaYAAIhFEQABAAAAUqYAAIxFEQABAAAAU6YAAJBFEQABAAAAVKYAAJRFEQABAAAAVaYAAJhFEQABAAAAVqYAAJxFEQABAAAAV6YAAKBFEQABAAAAWKYAAKRFEQABAAAAWaYAAKhFEQABAAAAWqYAAKxFEQABAAAAW6YAALBFEQABAAAAXKYAALRFEQABAAAAXaYAALhFEQABAAAAXqYAALxFEQABAAAAX6YAAMBFEQABAAAAYKYAAMRFEQABAAAAYaYAAMhFEQABAAAAYqYAAMxFEQABAAAAY6YAANBFEQABAAAAZKYAANRFEQABAAAAZaYAANhFEQABAAAAZqYAANxFEQABAAAAZ6YAAOBFEQABAAAAaKYAAORFEQABAAAAaaYAAOhFEQABAAAAaqYAAOxFEQABAAAAa6YAAPBFEQABAAAAbKYAAPRFEQABAAAAbaYAAPhFEQABAAAAgKYAAPxFEQABAAAAgaYAAABGEQABAAAAgqYAAARGEQABAAAAg6YAAAhGEQABAAAAhKYAAAxGEQABAAAAhaYAABBGEQABAAAAhqYAABRGEQABAAAAh6YAABhGEQABAAAAiKYAABxGEQABAAAAiaYAACBGEQABAAAAiqYAACRGEQABAAAAi6YAAChGEQABAAAAjKYAACxGEQABAAAAjaYAADBGEQABAAAAjqYAADRGEQABAAAAj6YAADhGEQABAAAAkKYAADxGEQABAAAAkaYAAEBGEQABAAAAkqYAAERGEQABAAAAk6YAAEhGEQABAAAAlKYAAExGEQABAAAAlaYAAFBGEQABAAAAlqYAAFRGEQABAAAAl6YAAFhGEQABAAAAmKYAAFxGEQABAAAAmaYAAGBGEQABAAAAmqYAAGRGEQABAAAAm6YAAGhGEQABAAAAIqcAAGxGEQABAAAAI6cAAHBGEQABAAAAJKcAAHRGEQABAAAAJacAAHhGEQABAAAAJqcAAHxGEQABAAAAJ6cAAIBGEQABAAAAKKcAAIRGEQABAAAAKacAAIhGEQABAAAAKqcAAIxGEQABAAAAK6cAAJBGEQABAAAALKcAAJRGEQABAAAALacAAJhGEQABAAAALqcAAJxGEQABAAAAL6cAAKBGEQABAAAAMqcAAKRGEQABAAAAM6cAAKhGEQABAAAANKcAAKxGEQABAAAANacAALBGEQABAAAANqcAALRGEQABAAAAN6cAALhGEQABAAAAOKcAALxGEQABAAAAOacAAMBGEQABAAAAOqcAAMRGEQABAAAAO6cAAMhGEQABAAAAPKcAAMxGEQABAAAAPacAANBGEQABAAAAPqcAANRGEQABAAAAP6cAANhGEQABAAAAQKcAANxGEQABAAAAQacAAOBGEQABAAAAQqcAAORGEQABAAAAQ6cAAOhGEQABAAAARKcAAOxGEQABAAAARacAAPBGEQABAAAARqcAAPRGEQABAAAAR6cAAPhGEQABAAAASKcAAPxGEQABAAAASacAAABHEQABAAAASqcAAARHEQABAAAAS6cAAAhHEQABAAAATKcAAAxHEQABAAAATacAABBHEQABAAAATqcAABRHEQABAAAAT6cAABhHEQABAAAAUKcAABxHEQABAAAAUacAACBHEQABAAAAUqcAACRHEQABAAAAU6cAAChHEQABAAAAVKcAACxHEQABAAAAVacAADBHEQABAAAAVqcAADRHEQABAAAAV6cAADhHEQABAAAAWKcAADxHEQABAAAAWacAAEBHEQABAAAAWqcAAERHEQABAAAAW6cAAEhHEQABAAAAXKcAAExHEQABAAAAXacAAFBHEQABAAAAXqcAAFRHEQABAAAAX6cAAFhHEQABAAAAYKcAAFxHEQABAAAAYacAAGBHEQABAAAAYqcAAGRHEQABAAAAY6cAAGhHEQABAAAAZKcAAGxHEQABAAAAZacAAHBHEQABAAAAZqcAAHRHEQABAAAAZ6cAAHhHEQABAAAAaKcAAHxHEQABAAAAaacAAIBHEQABAAAAaqcAAIRHEQABAAAAa6cAAIhHEQABAAAAbKcAAIxHEQABAAAAbacAAJBHEQABAAAAbqcAAJRHEQABAAAAb6cAAJhHEQABAAAAeacAAJxHEQABAAAAeqcAAKBHEQABAAAAe6cAAKRHEQABAAAAfKcAAKhHEQABAAAAfacAAKxHEQABAAAAfqcAALBHEQABAAAAf6cAALRHEQABAAAAgKcAALhHEQABAAAAgacAALxHEQABAAAAgqcAAMBHEQABAAAAg6cAAMRHEQABAAAAhKcAAMhHEQABAAAAhacAAMxHEQABAAAAhqcAANBHEQABAAAAh6cAANRHEQABAAAAi6cAANhHEQABAAAAjKcAANxHEQABAAAAjacAAOBHEQABAAAAkKcAAORHEQABAAAAkacAAOhHEQABAAAAkqcAAOxHEQABAAAAk6cAAPBHEQABAAAAlKcAAPRHEQABAAAAlqcAAPhHEQABAAAAl6cAAPxHEQABAAAAmKcAAABIEQABAAAAmacAAARIEQABAAAAmqcAAAhIEQABAAAAm6cAAAxIEQABAAAAnKcAABBIEQABAAAAnacAABRIEQABAAAAnqcAABhIEQABAAAAn6cAABxIEQABAAAAoKcAACBIEQABAAAAoacAACRIEQABAAAAoqcAAChIEQABAAAAo6cAACxIEQABAAAApKcAADBIEQABAAAApacAADRIEQABAAAApqcAADhIEQABAAAAp6cAADxIEQABAAAAqKcAAEBIEQABAAAAqacAAERIEQABAAAAqqcAAEhIEQABAAAAq6cAAExIEQABAAAArKcAAFBIEQABAAAAracAAFRIEQABAAAArqcAAFhIEQABAAAAsKcAAFxIEQABAAAAsacAAGBIEQABAAAAsqcAAGRIEQABAAAAs6cAAGhIEQABAAAAtKcAAGxIEQABAAAAtacAAHBIEQABAAAAtqcAAHRIEQABAAAAt6cAAHhIEQABAAAAuKcAAHxIEQABAAAAuacAAIBIEQABAAAAuqcAAIRIEQABAAAAu6cAAIhIEQABAAAAvKcAAIxIEQABAAAAvacAAJBIEQABAAAAvqcAAJRIEQABAAAAv6cAAJhIEQABAAAAwKcAAJxIEQABAAAAwacAAKBIEQABAAAAwqcAAKRIEQABAAAAw6cAAKhIEQABAAAAxKcAAKxIEQABAAAAxacAALBIEQABAAAAxqcAALRIEQABAAAAx6cAALhIEQABAAAAyKcAALxIEQABAAAAyacAAMBIEQABAAAAyqcAAMRIEQABAAAA0KcAAMhIEQABAAAA0acAAMxIEQABAAAA1qcAANBIEQABAAAA16cAANRIEQABAAAA2KcAANhIEQABAAAA2acAANxIEQABAAAA9acAAOBIEQABAAAA9qcAAORIEQABAAAAU6sAAOhIEQABAAAAcKsAAOxIEQABAAAAcasAAPBIEQABAAAAcqsAAPRIEQABAAAAc6sAAPhIEQABAAAAdKsAAPxIEQABAAAAdasAAABJEQABAAAAdqsAAARJEQABAAAAd6sAAAhJEQABAAAAeKsAAAxJEQABAAAAeasAABBJEQABAAAAeqsAABRJEQABAAAAe6sAABhJEQABAAAAfKsAABxJEQABAAAAfasAACBJEQABAAAAfqsAACRJEQABAAAAf6sAAChJEQABAAAAgKsAACxJEQABAAAAgasAADBJEQABAAAAgqsAADRJEQABAAAAg6sAADhJEQABAAAAhKsAADxJEQABAAAAhasAAEBJEQABAAAAhqsAAERJEQABAAAAh6sAAEhJEQABAAAAiKsAAExJEQABAAAAiasAAFBJEQABAAAAiqsAAFRJEQABAAAAi6sAAFhJEQABAAAAjKsAAFxJEQABAAAAjasAAGBJEQABAAAAjqsAAGRJEQABAAAAj6sAAGhJEQABAAAAkKsAAGxJEQABAAAAkasAAHBJEQABAAAAkqsAAHRJEQABAAAAk6sAAHhJEQABAAAAlKsAAHxJEQABAAAAlasAAIBJEQABAAAAlqsAAIRJEQABAAAAl6sAAIhJEQABAAAAmKsAAIxJEQABAAAAmasAAJBJEQABAAAAmqsAAJRJEQABAAAAm6sAAJhJEQABAAAAnKsAAJxJEQABAAAAnasAAKBJEQABAAAAnqsAAKRJEQABAAAAn6sAAKhJEQABAAAAoKsAAKxJEQABAAAAoasAALBJEQABAAAAoqsAALRJEQABAAAAo6sAALhJEQABAAAApKsAALxJEQABAAAApasAAMBJEQABAAAApqsAAMRJEQABAAAAp6sAAMhJEQABAAAAqKsAAMxJEQABAAAAqasAANBJEQABAAAAqqsAANRJEQABAAAAq6sAANhJEQABAAAArKsAANxJEQABAAAArasAAOBJEQABAAAArqsAAORJEQABAAAAr6sAAOhJEQABAAAAsKsAAOxJEQABAAAAsasAAPBJEQABAAAAsqsAAPRJEQABAAAAs6sAAPhJEQABAAAAtKsAAPxJEQABAAAAtasAAABKEQABAAAAtqsAAARKEQABAAAAt6sAAAhKEQABAAAAuKsAAAxKEQABAAAAuasAABBKEQABAAAAuqsAABRKEQABAAAAu6sAABhKEQABAAAAvKsAABxKEQABAAAAvasAACBKEQABAAAAvqsAACRKEQABAAAAv6sAAChKEQABAAAAIf8AACxKEQABAAAAIv8AADBKEQABAAAAI/8AADRKEQABAAAAJP8AADhKEQABAAAAJf8AADxKEQABAAAAJv8AAEBKEQABAAAAJ/8AAERKEQABAAAAKP8AAEhKEQABAAAAKf8AAExKEQABAAAAKv8AAFBKEQABAAAAK/8AAFRKEQABAAAALP8AAFhKEQABAAAALf8AAFxKEQABAAAALv8AAGBKEQABAAAAL/8AAGRKEQABAAAAMP8AAGhKEQABAAAAMf8AAGxKEQABAAAAMv8AAHBKEQABAAAAM/8AAHRKEQABAAAANP8AAHhKEQABAAAANf8AAHxKEQABAAAANv8AAIBKEQABAAAAN/8AAIRKEQABAAAAOP8AAIhKEQABAAAAOf8AAIxKEQABAAAAOv8AAJBKEQABAAAAQf8AAJRKEQABAAAAQv8AAJhKEQABAAAAQ/8AAJxKEQABAAAARP8AAKBKEQABAAAARf8AAKRKEQABAAAARv8AAKhKEQABAAAAR/8AAKxKEQABAAAASP8AALBKEQABAAAASf8AALRKEQABAAAASv8AALhKEQABAAAAS/8AALxKEQABAAAATP8AAMBKEQABAAAATf8AAMRKEQABAAAATv8AAMhKEQABAAAAT/8AAMxKEQABAAAAUP8AANBKEQABAAAAUf8AANRKEQABAAAAUv8AANhKEQABAAAAU/8AANxKEQABAAAAVP8AAOBKEQABAAAAVf8AAORKEQABAAAAVv8AAOhKEQABAAAAV/8AAOxKEQABAAAAWP8AAPBKEQABAAAAWf8AAPRKEQABAAAAWv8AAPhKEQABAAAAAAQBAPxKEQABAAAAAQQBAABLEQABAAAAAgQBAARLEQABAAAAAwQBAAhLEQABAAAABAQBAAxLEQABAAAABQQBABBLEQABAAAABgQBABRLEQABAAAABwQBABhLEQABAAAACAQBABxLEQABAAAACQQBACBLEQABAAAACgQBACRLEQABAAAACwQBAChLEQABAAAADAQBACxLEQABAAAADQQBADBLEQABAAAADgQBADRLEQABAAAADwQBADhLEQABAAAAEAQBADxLEQABAAAAEQQBAEBLEQABAAAAEgQBAERLEQABAAAAEwQBAEhLEQABAAAAFAQBAExLEQABAAAAFQQBAFBLEQABAAAAFgQBAFRLEQABAAAAFwQBAFhLEQABAAAAGAQBAFxLEQABAAAAGQQBAGBLEQABAAAAGgQBAGRLEQABAAAAGwQBAGhLEQABAAAAHAQBAGxLEQABAAAAHQQBAHBLEQABAAAAHgQBAHRLEQABAAAAHwQBAHhLEQABAAAAIAQBAHxLEQABAAAAIQQBAIBLEQABAAAAIgQBAIRLEQABAAAAIwQBAIhLEQABAAAAJAQBAIxLEQABAAAAJQQBAJBLEQABAAAAJgQBAJRLEQABAAAAJwQBAJhLEQABAAAAKAQBAJxLEQABAAAAKQQBAKBLEQABAAAAKgQBAKRLEQABAAAAKwQBAKhLEQABAAAALAQBAKxLEQABAAAALQQBALBLEQABAAAALgQBALRLEQABAAAALwQBALhLEQABAAAAMAQBALxLEQABAAAAMQQBAMBLEQABAAAAMgQBAMRLEQABAAAAMwQBAMhLEQABAAAANAQBAMxLEQABAAAANQQBANBLEQABAAAANgQBANRLEQABAAAANwQBANhLEQABAAAAOAQBANxLEQABAAAAOQQBAOBLEQABAAAAOgQBAORLEQABAAAAOwQBAOhLEQABAAAAPAQBAOxLEQABAAAAPQQBAPBLEQABAAAAPgQBAPRLEQABAAAAPwQBAPhLEQABAAAAQAQBAPxLEQABAAAAQQQBAABMEQABAAAAQgQBAARMEQABAAAAQwQBAAhMEQABAAAARAQBAAxMEQABAAAARQQBABBMEQABAAAARgQBABRMEQABAAAARwQBABhMEQABAAAASAQBABxMEQABAAAASQQBACBMEQABAAAASgQBACRMEQABAAAASwQBAChMEQABAAAATAQBACxMEQABAAAATQQBADBMEQABAAAATgQBADRMEQABAAAATwQBADhMEQABAAAAsAQBADxMEQABAAAAsQQBAEBMEQABAAAAsgQBAERMEQABAAAAswQBAEhMEQABAAAAtAQBAExMEQABAAAAtQQBAFBMEQABAAAAtgQBAFRMEQABAAAAtwQBAFhMEQABAAAAuAQBAFxMEQABAAAAuQQBAGBMEQABAAAAugQBAGRMEQABAAAAuwQBAGhMEQABAAAAvAQBAGxMEQABAAAAvQQBAHBMEQABAAAAvgQBAHRMEQABAAAAvwQBAHhMEQABAAAAwAQBAHxMEQABAAAAwQQBAIBMEQABAAAAwgQBAIRMEQABAAAAwwQBAIhMEQABAAAAxAQBAIxMEQABAAAAxQQBAJBMEQABAAAAxgQBAJRMEQABAAAAxwQBAJhMEQABAAAAyAQBAJxMEQABAAAAyQQBAKBMEQABAAAAygQBAKRMEQABAAAAywQBAKhMEQABAAAAzAQBAKxMEQABAAAAzQQBALBMEQABAAAAzgQBALRMEQABAAAAzwQBALhMEQABAAAA0AQBALxMEQABAAAA0QQBAMBMEQABAAAA0gQBAMRMEQABAAAA0wQBAMhMEQABAAAA2AQBAMxMEQABAAAA2QQBANBMEQABAAAA2gQBANRMEQABAAAA2wQBANhMEQABAAAA3AQBANxMEQABAAAA3QQBAOBMEQABAAAA3gQBAORMEQABAAAA3wQBAOhMEQABAAAA4AQBAOxMEQABAAAA4QQBAPBMEQABAAAA4gQBAPRMEQABAAAA4wQBAPhMEQABAAAA5AQBAPxMEQABAAAA5QQBAABNEQABAAAA5gQBAARNEQABAAAA5wQBAAhNEQABAAAA6AQBAAxNEQABAAAA6QQBABBNEQABAAAA6gQBABRNEQABAAAA6wQBABhNEQABAAAA7AQBABxNEQABAAAA7QQBACBNEQABAAAA7gQBACRNEQABAAAA7wQBAChNEQABAAAA8AQBACxNEQABAAAA8QQBADBNEQABAAAA8gQBADRNEQABAAAA8wQBADhNEQABAAAA9AQBADxNEQABAAAA9QQBAEBNEQABAAAA9gQBAERNEQABAAAA9wQBAEhNEQABAAAA+AQBAExNEQABAAAA+QQBAFBNEQABAAAA+gQBAFRNEQABAAAA+wQBAFhNEQABAAAAcAUBAFxNEQABAAAAcQUBAGBNEQABAAAAcgUBAGRNEQABAAAAcwUBAGhNEQABAAAAdAUBAGxNEQABAAAAdQUBAHBNEQABAAAAdgUBAHRNEQABAAAAdwUBAHhNEQABAAAAeAUBAHxNEQABAAAAeQUBAIBNEQABAAAAegUBAIRNEQABAAAAfAUBAIhNEQABAAAAfQUBAIxNEQABAAAAfgUBAJBNEQABAAAAfwUBAJRNEQABAAAAgAUBAJhNEQABAAAAgQUBAJxNEQABAAAAggUBAKBNEQABAAAAgwUBAKRNEQABAAAAhAUBAKhNEQABAAAAhQUBAKxNEQABAAAAhgUBALBNEQABAAAAhwUBALRNEQABAAAAiAUBALhNEQABAAAAiQUBALxNEQABAAAAigUBAMBNEQABAAAAjAUBAMRNEQABAAAAjQUBAMhNEQABAAAAjgUBAMxNEQABAAAAjwUBANBNEQABAAAAkAUBANRNEQABAAAAkQUBANhNEQABAAAAkgUBANxNEQABAAAAlAUBAOBNEQABAAAAlQUBAORNEQABAAAAlwUBAOhNEQABAAAAmAUBAOxNEQABAAAAmQUBAPBNEQABAAAAmgUBAPRNEQABAAAAmwUBAPhNEQABAAAAnAUBAPxNEQABAAAAnQUBAABOEQABAAAAngUBAAROEQABAAAAnwUBAAhOEQABAAAAoAUBAAxOEQABAAAAoQUBABBOEQABAAAAowUBABROEQABAAAApAUBABhOEQABAAAApQUBABxOEQABAAAApgUBACBOEQABAAAApwUBACROEQABAAAAqAUBAChOEQABAAAAqQUBACxOEQABAAAAqgUBADBOEQABAAAAqwUBADROEQABAAAArAUBADhOEQABAAAArQUBADxOEQABAAAArgUBAEBOEQABAAAArwUBAEROEQABAAAAsAUBAEhOEQABAAAAsQUBAExOEQABAAAAswUBAFBOEQABAAAAtAUBAFROEQABAAAAtQUBAFhOEQABAAAAtgUBAFxOEQABAAAAtwUBAGBOEQABAAAAuAUBAGROEQABAAAAuQUBAGhOEQABAAAAuwUBAGxOEQABAAAAvAUBAHBOEQABAAAAgAwBAHROEQABAAAAgQwBAHhOEQABAAAAggwBAHxOEQABAAAAgwwBAIBOEQABAAAAhAwBAIROEQABAAAAhQwBAIhOEQABAAAAhgwBAIxOEQABAAAAhwwBAJBOEQABAAAAiAwBAJROEQABAAAAiQwBAJhOEQABAAAAigwBAJxOEQABAAAAiwwBAKBOEQABAAAAjAwBAKROEQABAAAAjQwBAKhOEQABAAAAjgwBAKxOEQABAAAAjwwBALBOEQABAAAAkAwBALROEQABAAAAkQwBALhOEQABAAAAkgwBALxOEQABAAAAkwwBAMBOEQABAAAAlAwBAMROEQABAAAAlQwBAMhOEQABAAAAlgwBAMxOEQABAAAAlwwBANBOEQABAAAAmAwBANROEQABAAAAmQwBANhOEQABAAAAmgwBANxOEQABAAAAmwwBAOBOEQABAAAAnAwBAOROEQABAAAAnQwBAOhOEQABAAAAngwBAOxOEQABAAAAnwwBAPBOEQABAAAAoAwBAPROEQABAAAAoQwBAPhOEQABAAAAogwBAPxOEQABAAAAowwBAABPEQABAAAApAwBAARPEQABAAAApQwBAAhPEQABAAAApgwBAAxPEQABAAAApwwBABBPEQABAAAAqAwBABRPEQABAAAAqQwBABhPEQABAAAAqgwBABxPEQABAAAAqwwBACBPEQABAAAArAwBACRPEQABAAAArQwBAChPEQABAAAArgwBACxPEQABAAAArwwBADBPEQABAAAAsAwBADRPEQABAAAAsQwBADhPEQABAAAAsgwBADxPEQABAAAAwAwBAEBPEQABAAAAwQwBAERPEQABAAAAwgwBAEhPEQABAAAAwwwBAExPEQABAAAAxAwBAFBPEQABAAAAxQwBAFRPEQABAAAAxgwBAFhPEQABAAAAxwwBAFxPEQABAAAAyAwBAGBPEQABAAAAyQwBAGRPEQABAAAAygwBAGhPEQABAAAAywwBAGxPEQABAAAAzAwBAHBPEQABAAAAzQwBAHRPEQABAAAAzgwBAHhPEQABAAAAzwwBAHxPEQABAAAA0AwBAIBPEQABAAAA0QwBAIRPEQABAAAA0gwBAIhPEQABAAAA0wwBAIxPEQABAAAA1AwBAJBPEQABAAAA1QwBAJRPEQABAAAA1gwBAJhPEQABAAAA1wwBAJxPEQABAAAA2AwBAKBPEQABAAAA2QwBAKRPEQABAAAA2gwBAKhPEQABAAAA2wwBAKxPEQABAAAA3AwBALBPEQABAAAA3QwBALRPEQABAAAA3gwBALhPEQABAAAA3wwBALxPEQABAAAA4AwBAMBPEQABAAAA4QwBAMRPEQABAAAA4gwBAMhPEQABAAAA4wwBAMxPEQABAAAA5AwBANBPEQABAAAA5QwBANRPEQABAAAA5gwBANhPEQABAAAA5wwBANxPEQABAAAA6AwBAOBPEQABAAAA6QwBAORPEQABAAAA6gwBAOhPEQABAAAA6wwBAOxPEQABAAAA7AwBAPBPEQABAAAA7QwBAPRPEQABAAAA7gwBAPhPEQABAAAA7wwBAPxPEQABAAAA8AwBAABQEQABAAAA8QwBAARQEQABAAAA8gwBAAhQEQABAAAAoBgBAAxQEQABAAAAoRgBABBQEQABAAAAohgBABRQEQABAAAAoxgBABhQEQABAAAApBgBABxQEQABAAAApRgBACBQEQABAAAAphgBACRQEQABAAAApxgBAChQEQABAAAAqBgBACxQEQABAAAAqRgBADBQEQABAAAAqhgBADRQEQABAAAAqxgBADhQEQABAAAArBgBADxQEQABAAAArRgBAEBQEQABAAAArhgBAERQEQABAAAArxgBAEhQEQABAAAAsBgBAExQEQABAAAAsRgBAFBQEQABAAAAshgBAFRQEQABAAAAsxgBAFhQEQABAAAAtBgBAFxQEQABAAAAtRgBAGBQEQABAAAAthgBAGRQEQABAAAAtxgBAGhQEQABAAAAuBgBAGxQEQABAAAAuRgBAHBQEQABAAAAuhgBAHRQEQABAAAAuxgBAHhQEQABAAAAvBgBAHxQEQABAAAAvRgBAIBQEQABAAAAvhgBAIRQEQABAAAAvxgBAIhQEQABAAAAwBgBAIxQEQABAAAAwRgBAJBQEQABAAAAwhgBAJRQEQABAAAAwxgBAJhQEQABAAAAxBgBAJxQEQABAAAAxRgBAKBQEQABAAAAxhgBAKRQEQABAAAAxxgBAKhQEQABAAAAyBgBAKxQEQABAAAAyRgBALBQEQABAAAAyhgBALRQEQABAAAAyxgBALhQEQABAAAAzBgBALxQEQABAAAAzRgBAMBQEQABAAAAzhgBAMRQEQABAAAAzxgBAMhQEQABAAAA0BgBAMxQEQABAAAA0RgBANBQEQABAAAA0hgBANRQEQABAAAA0xgBANhQEQABAAAA1BgBANxQEQABAAAA1RgBAOBQEQABAAAA1hgBAORQEQABAAAA1xgBAOhQEQABAAAA2BgBAOxQEQABAAAA2RgBAPBQEQABAAAA2hgBAPRQEQABAAAA2xgBAPhQEQABAAAA3BgBAPxQEQABAAAA3RgBAABREQABAAAA3hgBAARREQABAAAA3xgBAAhREQABAAAAQG4BAAxREQABAAAAQW4BABBREQABAAAAQm4BABRREQABAAAAQ24BABhREQABAAAARG4BABxREQABAAAARW4BACBREQABAAAARm4BACRREQABAAAAR24BAChREQABAAAASG4BACxREQABAAAASW4BADBREQABAAAASm4BADRREQABAAAAS24BADhREQABAAAATG4BADxREQABAAAATW4BAEBREQABAAAATm4BAERREQABAAAAT24BAEhREQABAAAAUG4BAExREQABAAAAUW4BAFBREQABAAAAUm4BAFRREQABAAAAU24BAFhREQABAAAAVG4BAFxREQABAAAAVW4BAGBREQABAAAAVm4BAGRREQABAAAAV24BAGhREQABAAAAWG4BAGxREQABAAAAWW4BAHBREQABAAAAWm4BAHRREQABAAAAW24BAHhREQABAAAAXG4BAHxREQABAAAAXW4BAIBREQABAAAAXm4BAIRREQABAAAAX24BAIhREQABAAAAYG4BAIxREQABAAAAYW4BAJBREQABAAAAYm4BAJRREQABAAAAY24BAJhREQABAAAAZG4BAJxREQABAAAAZW4BAKBREQABAAAAZm4BAKRREQABAAAAZ24BAKhREQABAAAAaG4BAKxREQABAAAAaW4BALBREQABAAAAam4BALRREQABAAAAa24BALhREQABAAAAbG4BALxREQABAAAAbW4BAMBREQABAAAAbm4BAMRREQABAAAAb24BAMhREQABAAAAcG4BAMxREQABAAAAcW4BANBREQABAAAAcm4BANRREQABAAAAc24BANhREQABAAAAdG4BANxREQABAAAAdW4BAOBREQABAAAAdm4BAORREQABAAAAd24BAOhREQABAAAAeG4BAOxREQABAAAAeW4BAPBREQABAAAAem4BAPRREQABAAAAe24BAPhREQABAAAAfG4BAPxREQABAAAAfW4BAABSEQABAAAAfm4BAARSEQABAAAAf24BAAhSEQABAAAAAOkBAAxSEQABAAAAAekBABBSEQABAAAAAukBABRSEQABAAAAA+kBABhSEQABAAAABOkBABxSEQABAAAABekBACBSEQABAAAABukBACRSEQABAAAAB+kBAChSEQABAAAACOkBACxSEQABAAAACekBADBSEQABAAAACukBADRSEQABAAAAC+kBADhSEQABAAAADOkBADxSEQABAAAADekBAEBSEQABAAAADukBAERSEQABAAAAD+kBAEhSEQABAAAAEOkBAExSEQABAAAAEekBAFBSEQABAAAAEukBAFRSEQABAAAAE+kBAFhSEQABAAAAFOkBAFxSEQABAAAAFekBAGBSEQABAAAAFukBAGRSEQABAAAAF+kBAGhSEQABAAAAGOkBAGxSEQABAAAAGekBAHBSEQABAAAAGukBAHRSEQABAAAAG+kBAHhSEQABAAAAHOkBAHxSEQABAAAAHekBAIBSEQABAAAAHukBAIRSEQABAAAAH+kBAIhSEQABAAAAIOkBAIxSEQABAAAAIekBAJBSEQABAAAAIukBAJRSEQABAAAAI+kBAJhSEQABAAAAJOkBAJxSEQABAAAAJekBAKBSEQABAAAAJukBAKRSEQABAAAAJ+kBAKhSEQABAAAAKOkBAKxSEQABAAAAKekBALBSEQABAAAAKukBALRSEQABAAAAK+kBALhSEQABAAAALOkBALxSEQABAAAALekBAMBSEQABAAAALukBAMRSEQABAAAAL+kBAMhSEQABAAAAMOkBAMxSEQABAAAAMekBANBSEQABAAAAMukBANRSEQABAAAAM+kBANhSEQABAAAANOkBANxSEQABAAAANekBAOBSEQABAAAANukBAORSEQABAAAAN+kBAOhSEQABAAAAOOkBAOxSEQABAAAAOekBAPBSEQABAAAAOukBAPRSEQABAAAAO+kBAPhSEQABAAAAPOkBAPxSEQABAAAAPekBAABTEQABAAAAPukBAARTEQABAAAAP+kBAAhTEQABAAAAQOkBAAxTEQABAAAAQekBABBTEQABAAAAQukBABRTEQABAAAAQ+kBABhTEQABAAAATGl0ZXJhbENsYXNzVW5pY29kZUNsYXNzQnl0ZXNSZXBldGl0aW9uR3JvdXBvbGRfZmxhZ3NDb25jYXRBbHRlcm5hdGlvbkFsdGVybmF0aW9uQnJhbmNoAAAAAAABAAAAAQAAAN8DAAAAAAAABAAAAAQAAAAOBAAAY2FzZV9pbnNlbnNpdGl2ZW11bHRpX2xpbmVkb3RfbWF0Y2hlc19uZXdfbGluZXN3YXBfZ3JlZWR1bmljb2RlY3JsZgB82hEAEAAAAIzaEQAKAAAAltoRABQAAACq2hEACgAAALTaEQAHAAAAu9oRAAQAAABGbGFncwAAABcDAAAMAAAABAAAAFcDAAAPBAAAWQMAQZi2xwAL9oMPAQAAABAEAABUcnlGcm9tQ2hhckVycm9yZXhjZWVkZWQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNhcHR1cmluZyBncm91cHMgKAAAADDbEQAxAAAA8MsYAAEAAABpbnZhbGlkIGVzY2FwZSBzZXF1ZW5jZSBmb3VuZCBpbiBjaGFyYWN0ZXIgY2xhc3N02xEAMAAAAGludmFsaWQgY2hhcmFjdGVyIGNsYXNzIHJhbmdlLCB0aGUgc3RhcnQgbXVzdCBiZSA8PSB0aGUgZW5kAKzbEQA7AAAAaW52YWxpZCByYW5nZSBib3VuZGFyeSwgbXVzdCBiZSBhIGxpdGVyYWwAAADw2xEAKQAAAHVuY2xvc2VkIGNoYXJhY3RlciBjbGFzcyTcEQAYAAAAZGVjaW1hbCBsaXRlcmFsIGVtcHR5AAAARNwRABUAAABkZWNpbWFsIGxpdGVyYWwgaW52YWxpZABk3BEAFwAAAGhleGFkZWNpbWFsIGxpdGVyYWwgZW1wdHkAAACE3BEAGQAAAGhleGFkZWNpbWFsIGxpdGVyYWwgaXMgbm90IGEgVW5pY29kZSBzY2FsYXIgdmFsdWUAAACo3BEAMQAAAGludmFsaWQgaGV4YWRlY2ltYWwgZGlnaXQAAADk3BEAGQAAAGluY29tcGxldGUgZXNjYXBlIHNlcXVlbmNlLCByZWFjaGVkIGVuZCBvZiBwYXR0ZXJuIHByZW1hdHVyZWx5AAAI3REAPgAAAHVucmVjb2duaXplZCBlc2NhcGUgc2VxdWVuY2VQ3REAHAAAAGRhbmdsaW5nIGZsYWcgbmVnYXRpb24gb3BlcmF0b3IAdN0RAB8AAABkdXBsaWNhdGUgZmxhZwAAnN0RAA4AAABmbGFnIG5lZ2F0aW9uIG9wZXJhdG9yIHJlcGVhdGVkALTdEQAfAAAAZXhwZWN0ZWQgZmxhZyBidXQgZ290IGVuZCBvZiByZWdleAAA3N0RACIAAAB1bnJlY29nbml6ZWQgZmxhZwAAAAjeEQARAAAAZHVwbGljYXRlIGNhcHR1cmUgZ3JvdXAgbmFtZSTeEQAcAAAAZW1wdHkgY2FwdHVyZSBncm91cCBuYW1lSN4RABgAAABpbnZhbGlkIGNhcHR1cmUgZ3JvdXAgY2hhcmFjdGVyAGjeEQAfAAAAdW5jbG9zZWQgY2FwdHVyZSBncm91cCBuYW1lAJDeEQAbAAAAdW5jbG9zZWQgZ3JvdXAAALTeEQAOAAAAdW5vcGVuZWQgZ3JvdXAAAMzeEQAOAAAAZXhjZWVkIHRoZSBtYXhpbXVtIG51bWJlciBvZiBuZXN0ZWQgcGFyZW50aGVzZXMvYnJhY2tldHMgKAAA5N4RADoAAADwyxgAAQAAAGludmFsaWQgcmVwZXRpdGlvbiBjb3VudCByYW5nZSwgdGhlIHN0YXJ0IG11c3QgYmUgPD0gdGhlIGVuZDDfEQA8AAAAcmVwZXRpdGlvbiBxdWFudGlmaWVyIGV4cGVjdHMgYSB2YWxpZCBkZWNpbWFsAAAAdN8RAC0AAAB1bmNsb3NlZCBjb3VudGVkIHJlcGV0aXRpb24ArN8RABsAAAByZXBldGl0aW9uIG9wZXJhdG9yIG1pc3NpbmcgZXhwcmVzc2lvbgAA0N8RACYAAABzcGVjaWFsIHdvcmQgYm91bmRhcnkgYXNzZXJ0aW9uIGlzIGVpdGhlciB1bmNsb3NlZCBvciBjb250YWlucyBhbiBpbnZhbGlkIGNoYXJhY3RlcgAA4BEAUwAAAHVucmVjb2duaXplZCBzcGVjaWFsIHdvcmQgYm91bmRhcnkgYXNzZXJ0aW9uLCB2YWxpZCBjaG9pY2VzIGFyZTogc3RhcnQsIGVuZCwgc3RhcnQtaGFsZiBvciBlbmQtaGFsZgBc4BEAYwAAAGZvdW5kIGVpdGhlciB0aGUgYmVnaW5uaW5nIG9mIGEgc3BlY2lhbCB3b3JkIGJvdW5kYXJ5IG9yIGEgYm91bmRlZCByZXBldGl0aW9uIG9uIGEgXGIgd2l0aCBhbiBvcGVuaW5nIGJyYWNlLCBidXQgbm8gY2xvc2luZyBicmFjZQAAAMjgEQCBAAAAaW52YWxpZCBVbmljb2RlIGNoYXJhY3RlciBjbGFzcwBU4REAHwAAAGJhY2tyZWZlcmVuY2VzIGFyZSBub3Qgc3VwcG9ydGVkfOERACAAAABsb29rLWFyb3VuZCwgaW5jbHVkaW5nIGxvb2stYWhlYWQgYW5kIGxvb2stYmVoaW5kLCBpcyBub3Qgc3VwcG9ydGVkAKThEQBDAAAAL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvcmVnZXgtc3ludGF4LTAuOC40L3NyYy9hc3QvbW9kLnJz8OERAGAAAAB/AgAAIgAAAPDhEQBgAAAAmAIAACIAAABhbG51bWJsYW5rZ3JhcGhwcmludHhkaWdpdAAA8OERAGAAAADzBAAAIwAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3JlZ2V4LXN5bnRheC0wLjguNC9zcmMvaGlyL21vZC5yc5ziEQBgAAAAvwQAAC4AAACc4hEAYAAAAMAEAAAqAAAARQMAABQAAAAEAAAAEQQAAC4uPQAs4xEAAwAAACAoZXhoYXVzdGVkKTjjEQAMAAAAZ290IGNvZGVwb2ludCBVKyB3aGljaCBvY2N1cnMgYmVmb3JlIGxhc3QgY29kZXBvaW50IFUrAABM4xEAEAAAAFzjEQAmAAAAL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvcmVnZXgtc3ludGF4LTAuOC40L3NyYy91bmljb2RlLnJzlOMRAGAAAAB+AAAADQAAAGFzc2VydGlvbiBmYWlsZWQ6IGkgPiBzZWxmLm5leHQAlOMRAGAAAACbAAAAEQAAAJTjEQBgAAAAtQAAAAkAAABHZW5lcmFsX0NhdGVnb3J5U2NyaXB0Y2ZzY2xjQWdlU2NyaXB0X0V4dGVuc2lvbnNHcmFwaGVtZV9DbHVzdGVyX0JyZWFrU2VudGVuY2VfQnJlYWtXb3JkX0JyZWFrAAAwAAAAOQAAAEEAAABaAAAAXwAAAF8AAABhAAAAegAAAKoAAACqAAAAtQAAALUAAAC6AAAAugAAAMAAAADWAAAA2AAAAPYAAAD4AAAAwQIAAMYCAADRAgAA4AIAAOQCAADsAgAA7AIAAO4CAADuAgAAAAMAAHQDAAB2AwAAdwMAAHoDAAB9AwAAfwMAAH8DAACGAwAAhgMAAIgDAACKAwAAjAMAAIwD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AABJHAAAUBwAAFkcAAAgpgAAKaYAANCoAADZqAAAAKkAAAmpAADQqQAA2akAAPCpAAD5qQAAUKoAAFmqAADwqwAA+asAABD/AAAZ/wAAoAQBAKkEAQAwDQEAOQ0BAGYQAQBvEAEA8BABAPkQAQA2EQEAPxEBANARAQDZEQEA8BIBAPkSAQBQFAEAWRQBANAUAQDZFAEAUBYBAFkWAQDAFgEAyRYBADAXAQA5FwEA4BgBAOkYAQBQGQEAWRkBAFAcAQBZHAEAUB0BAFkdAQCgHQEAqR0BAFAfAQBZHwEAYGoBAGlqAQDAagEAyWoBAFBrAQBZawEAztcBAP/XAQBA4QEASeEBAPDiAQD54gEA8OQBAPnkAQBQ6QEAWekBAPD7AQD5+wEAYXNzaWduZWRhc2NpaQAAAJTjEQBgAAAA/QEAAEAAAABBU0NJSUFzc2lnbmVkQW55lOMRAGAAAAAGAgAALgAAAGFnZWFoZXhBU0NJSV9IZXhfRGlnaXRBbHBoYWJldGljYWxwaGFiZXRpY2FzY2lpaGV4ZGlnaXRiY0JpZGlfQ2xhc3NiaWRpY0JpZGlfQ29udHJvbGJpZGljbGFzc2JpZGljb250cm9sYmlkaW1CaWRpX01pcnJvcmVkYmlkaW1pcnJvcmVkYmlkaW1pcnJvcmluZ2dseXBoQmlkaV9NaXJyb3JpbmdfR2x5cGhiaWRpcGFpcmVkYnJhY2tldEJpZGlfUGFpcmVkX0JyYWNrZXRiaWRpcGFpcmVkYnJhY2tldHR5cGVCaWRpX1BhaXJlZF9CcmFja2V0X1R5cGVibGtibWdicGJicHRjYW5vbmljYWxjb21iaW5pbmdjbGFzc0Nhbm9uaWNhbF9Db21iaW5pbmdfQ2xhc3NjYXNlZENhc2VkY2FzZWZvbGRpbmdDYXNlX0ZvbGRpbmdjYXNlaWdub3JhYmxlQ2FzZV9JZ25vcmFibGVjY2NjZUNvbXBvc2l0aW9uX0V4Y2x1c2lvbmNoYW5nZXN3aGVuY2FzZWZvbGRlZENoYW5nZXNfV2hlbl9DYXNlZm9sZGVkY2hhbmdlc3doZW5jYXNlbWFwcGVkQ2hhbmdlc19XaGVuX0Nhc2VtYXBwZWRjaGFuZ2Vzd2hlbmxvd2VyY2FzZWRDaGFuZ2VzX1doZW5fTG93ZXJjYXNlZGNoYW5nZXN3aGVubmZrY2Nhc2Vmb2xkZWRDaGFuZ2VzX1doZW5fTkZLQ19DYXNlZm9sZGVkY2hhbmdlc3doZW50aXRsZWNhc2VkQ2hhbmdlc19XaGVuX1RpdGxlY2FzZWRjaGFuZ2Vzd2hlbnVwcGVyY2FzZWRDaGFuZ2VzX1doZW5fVXBwZXJjYXNlZGNpY2prYWNjb3VudGluZ251bWVyaWNrQWNjb3VudGluZ051bWVyaWNjamtjb21wYXRpYmlsaXR5dmFyaWFudGtDb21wYXRpYmlsaXR5VmFyaWFudGNqa2lpY29yZWtJSUNvcmVjamtpcmdnc291cmNla0lSR19HU291cmNlY2praXJnaHNvdXJjZWtJUkdfSFNvdXJjZWNqa2lyZ2pzb3VyY2VrSVJHX0pTb3VyY2VjamtpcmdrcHNvdXJjZWtJUkdfS1BTb3VyY2Vjamtpcmdrc291cmNla0lSR19LU291cmNlY2praXJnbXNvdXJjZWtJUkdfTVNvdXJjZWNqa2lyZ3Nzb3VyY2VrSVJHX1NTb3VyY2Vjamtpcmd0c291cmNla0lSR19UU291cmNlY2praXJndWtzb3VyY2VrSVJHX1VLU291cmNlY2praXJndXNvdXJjZWtJUkdfVVNvdXJjZWNqa2lyZ3Zzb3VyY2VrSVJHX1ZTb3VyY2VjamtvdGhlcm51bWVyaWNrT3RoZXJOdW1lcmljY2prcHJpbWFyeW51bWVyaWNrUHJpbWFyeU51bWVyaWNjamtyc3VuaWNvZGVrUlNVbmljb2RlY29tcGV4RnVsbF9Db21wb3NpdGlvbl9FeGNsdXNpb25jb21wb3NpdGlvbmV4Y2x1c2lvbmN3Y2Zjd2NtY3drY2Zjd2xjd3Rjd3VkYXNoRGFzaGRlY29tcG9zaXRpb25tYXBwaW5nRGVjb21wb3NpdGlvbl9NYXBwaW5nZGVjb21wb3NpdGlvbnR5cGVEZWNvbXBvc2l0aW9uX1R5cGVkZWZhdWx0aWdub3JhYmxlY29kZXBvaW50RGVmYXVsdF9JZ25vcmFibGVfQ29kZV9Qb2ludGRlcERlcHJlY2F0ZWRkZXByZWNhdGVkZGlkaWFEaWFjcml0aWNkaWFjcml0aWNkbWR0ZWFFYXN0X0FzaWFuX1dpZHRoZWFzdGFzaWFud2lkdGhlYmFzZUVtb2ppX01vZGlmaWVyX0Jhc2VlY29tcEVtb2ppX0NvbXBvbmVudGVtb2RFbW9qaV9Nb2RpZmllcmVtb2ppRW1vamllbW9qaWNvbXBvbmVudGVtb2ppbW9kaWZpZXJlbW9qaW1vZGlmaWVyYmFzZWVtb2ppcHJlc2VudGF0aW9uRW1vamlfUHJlc2VudGF0aW9uZXByZXNlcXVpZGVvRXF1aXZhbGVudF9VbmlmaWVkX0lkZW9ncmFwaGVxdWl2YWxlbnR1bmlmaWVkaWRlb2dyYXBoZXhwYW5kc29ubmZjRXhwYW5kc19Pbl9ORkNleHBhbmRzb25uZmRFeHBhbmRzX09uX05GRGV4cGFuZHNvbm5ma2NFeHBhbmRzX09uX05GS0NleHBhbmRzb25uZmtkRXhwYW5kc19Pbl9ORktEZXh0RXh0ZW5kZXJleHRlbmRlZHBpY3RvZ3JhcGhpY0V4dGVuZGVkX1BpY3RvZ3JhcGhpY2V4dGVuZGVyZXh0cGljdGZjbmZrY0ZDX05GS0NfQ2xvc3VyZWZjbmZrY2Nsb3N1cmVmdWxsY29tcG9zaXRpb25leGNsdXNpb25nY2djYmdlbmVyYWxjYXRlZ29yeWdyYXBoZW1lYmFzZUdyYXBoZW1lX0Jhc2VncmFwaGVtZWNsdXN0ZXJicmVha2dyYXBoZW1lZXh0ZW5kR3JhcGhlbWVfRXh0ZW5kZ3JhcGhlbWVsaW5rR3JhcGhlbWVfTGlua2dyYmFzZWdyZXh0Z3JsaW5raGFuZ3Vsc3lsbGFibGV0eXBlSGFuZ3VsX1N5bGxhYmxlX1R5cGVoZXhIZXhfRGlnaXRoZXhkaWdpdGhzdGh5cGhlbkh5cGhlbmlkY0lEX0NvbnRpbnVlaWRjb250aW51ZWlkZW9JZGVvZ3JhcGhpY2lkZW9ncmFwaGljaWRzSURfU3RhcnRpZHNiSURTX0JpbmFyeV9PcGVyYXRvcmlkc2JpbmFyeW9wZXJhdG9yaWRzdElEU19UcmluYXJ5X09wZXJhdG9yaWRzdGFydGlkc3RyaW5hcnlvcGVyYXRvcmluZGljcG9zaXRpb25hbGNhdGVnb3J5SW5kaWNfUG9zaXRpb25hbF9DYXRlZ29yeWluZGljc3lsbGFiaWNjYXRlZ29yeUluZGljX1N5bGxhYmljX0NhdGVnb3J5aW5wY2luc2Npc2NJU09fQ29tbWVudGphbW9zaG9ydG5hbWVKYW1vX1Nob3J0X05hbWVqZ0pvaW5pbmdfR3JvdXBqb2luY0pvaW5fQ29udHJvbGpvaW5jb250cm9sam9pbmluZ2dyb3Vwam9pbmluZ3R5cGVKb2luaW5nX1R5cGVqc25qdGthY2NvdW50aW5nbnVtZXJpY2tjb21wYXRpYmlsaXR5dmFyaWFudGtpaWNvcmVraXJnZ3NvdXJjZWtpcmdoc291cmNla2lyZ2pzb3VyY2VraXJna3Bzb3VyY2VraXJna3NvdXJjZWtpcmdtc291cmNla2lyZ3Nzb3VyY2VraXJndHNvdXJjZWtpcmd1a3NvdXJjZWtpcmd1c291cmNla2lyZ3Zzb3VyY2Vrb3RoZXJudW1lcmlja3ByaW1hcnludW1lcmlja3JzdW5pY29kZWxiTGluZV9CcmVha0xvd2VyY2FzZV9NYXBwaW5nbGluZWJyZWFrbG9lTG9naWNhbF9PcmRlcl9FeGNlcHRpb25sb2dpY2Fsb3JkZXJleGNlcHRpb25sb3dlckxvd2VyY2FzZWxvd2VyY2FzZWxvd2VyY2FzZW1hcHBpbmdtYXRoTWF0aG5hTmFtZW5hMVVuaWNvZGVfMV9OYW1lbmFtZWFsaWFzTmFtZV9BbGlhc25jaGFyTm9uY2hhcmFjdGVyX0NvZGVfUG9pbnRuZmNxY05GQ19RdWlja19DaGVja25mY3F1aWNrY2hlY2tuZmRxY05GRF9RdWlja19DaGVja25mZHF1aWNrY2hlY2tuZmtjY2FzZWZvbGRORktDX0Nhc2Vmb2xkbmZrY2NmbmZrY3FjTkZLQ19RdWlja19DaGVja25ma2NxdWlja2NoZWNrbmZrZHFjTkZLRF9RdWlja19DaGVja25ma2RxdWlja2NoZWNrbm9uY2hhcmFjdGVyY29kZXBvaW50bnROdW1lcmljX1R5cGVudW1lcmljdHlwZW51bWVyaWN2YWx1ZU51bWVyaWNfVmFsdWVudm9hbHBoYU90aGVyX0FscGhhYmV0aWNvY29tbWVudG9kaU90aGVyX0RlZmF1bHRfSWdub3JhYmxlX0NvZGVfUG9pbnRvZ3JleHRPdGhlcl9HcmFwaGVtZV9FeHRlbmRvaWRjT3RoZXJfSURfQ29udGludWVvaWRzT3RoZXJfSURfU3RhcnRvbG93ZXJPdGhlcl9Mb3dlcmNhc2VvbWF0aE90aGVyX01hdGhvdGhlcmFscGhhYmV0aWNvdGhlcmRlZmF1bHRpZ25vcmFibGVjb2RlcG9pbnRvdGhlcmdyYXBoZW1lZXh0ZW5kb3RoZXJpZGNvbnRpbnVlb3RoZXJpZHN0YXJ0b3RoZXJsb3dlcmNhc2VvdGhlcm1hdGhvdGhlcnVwcGVyY2FzZU90aGVyX1VwcGVyY2FzZW91cHBlcnBhdHN5blBhdHRlcm5fU3ludGF4cGF0dGVybnN5bnRheHBhdHRlcm53aGl0ZXNwYWNlUGF0dGVybl9XaGl0ZV9TcGFjZXBhdHdzcGNtUHJlcGVuZGVkX0NvbmNhdGVuYXRpb25fTWFya3ByZXBlbmRlZGNvbmNhdGVuYXRpb25tYXJrcW1hcmtRdW90YXRpb25fTWFya3F1b3RhdGlvbm1hcmtyYWRpY2FsUmFkaWNhbHJlZ2lvbmFsaW5kaWNhdG9yUmVnaW9uYWxfSW5kaWNhdG9ycmlzYnNjZlNpbXBsZV9DYXNlX0ZvbGRpbmdzY3JpcHRzY3JpcHRleHRlbnNpb25zc2N4c2RTb2Z0X0RvdHRlZHNlbnRlbmNlYnJlYWtzZW50ZW5jZXRlcm1pbmFsU2VudGVuY2VfVGVybWluYWxzZmNzaW1wbGVjYXNlZm9sZGluZ3NpbXBsZWxvd2VyY2FzZW1hcHBpbmdTaW1wbGVfTG93ZXJjYXNlX01hcHBpbmdzaW1wbGV0aXRsZWNhc2VtYXBwaW5nU2ltcGxlX1RpdGxlY2FzZV9NYXBwaW5nc2ltcGxldXBwZXJjYXNlbWFwcGluZ1NpbXBsZV9VcHBlcmNhc2VfTWFwcGluZ3NsY3NvZnRkb3R0ZWRzcGFjZVdoaXRlX1NwYWNlc3Rjc3Rlcm1zdWN0Y1RpdGxlY2FzZV9NYXBwaW5ndGVybVRlcm1pbmFsX1B1bmN0dWF0aW9udGVybWluYWxwdW5jdHVhdGlvbnRpdGxlY2FzZW1hcHBpbmd1Y1VwcGVyY2FzZV9NYXBwaW5ndWlkZW9VbmlmaWVkX0lkZW9ncmFwaHVuaWNvZGUxbmFtZXVuaWNvZGVyYWRpY2Fsc3Ryb2tldW5pZmllZGlkZW9ncmFwaHVwcGVyVXBwZXJjYXNldXBwZXJjYXNldXBwZXJjYXNlbWFwcGluZ3Vyc3ZhcmlhdGlvbnNlbGVjdG9yVmFyaWF0aW9uX1NlbGVjdG9ydmVydGljYWxvcmllbnRhdGlvblZlcnRpY2FsX09yaWVudGF0aW9udm92c3did2hpdGVzcGFjZXdvcmRicmVha3dzcGFjZXhpZGNYSURfQ29udGludWV4aWRjb250aW51ZXhpZHNYSURfU3RhcnR4aWRzdGFydHhvbmZjeG9uZmR4b25ma2N4b25ma2QAAABM/xEAAwAAAGDkEQADAAAAT/8RAAQAAABT/xEADwAAALVDFgAFAAAAYv8RAAoAAABs/xEACgAAAGL/EQAKAAAAdv8RAA0AAABT/xEADwAAAIP/EQACAAAAhf8RAAoAAACP/xEABQAAAJT/EQAMAAAAoP8RAAkAAACF/xEACgAAAKn/EQALAAAAlP8RAAwAAAC0/xEABQAAALn/EQANAAAAxv8RAAwAAAC5/xEADQAAANL/EQASAAAA5P8RABQAAAD4/xEAEQAAAAkAEgATAAAAHAASABUAAAAxABIAGAAAAEkAEgADAAAASIYWAAUAAACcUhYABQAAAEiGFgAFAAAATAASAAMAAADk/xEAFAAAAE8AEgADAAAACQASABMAAABSABIAAwAAADEAEgAYAAAAVQASABcAAABsABIAGQAAAIUAEgAFAAAAigASAAUAAACPABIACwAAAJoAEgAMAAAApgASAA0AAACzABIADgAAAMEAEgADAAAAbAASABkAAADEABIAAgAAAMYAEgAVAAAAWuQRAAIAAACaABIADAAAANsAEgAVAAAA8AASABcAAAAHARIAFQAAABwBEgAXAAAAMwESABUAAABIARIAFwAAAF8BEgAZAAAAeAESABwAAACUARIAFQAAAKkBEgAXAAAAwAESABUAAADVARIAFwAAAOwBEgACAAAAswASAA4AAADuARIAFAAAAAICEgASAAAAFAISABcAAAArAhIAFQAAAEACEgAJAAAASQISAAcAAABQAhIADQAAAF0CEgAMAAAAaQISAA0AAAB2AhIADAAAAIICEgANAAAAjwISAAwAAACbAhIADgAAAKkCEgANAAAAtgISAA0AAADDAhIADAAAAM8CEgANAAAA3AISAAwAAADoAhIADQAAAPUCEgAMAAAAAQMSAA0AAAAOAxIADAAAABoDEgAOAAAAKAMSAA0AAAA1AxIADQAAAEIDEgAMAAAATgMSAA0AAABbAxIADAAAAGcDEgAPAAAAdgMSAA0AAACDAxIAEQAAAJQDEgAPAAAAowMSAAwAAACvAxIACgAAALkDEgAGAAAAvwMSABoAAADZAxIAFAAAAMYAEgAVAAAA7QMSAAQAAADwABIAFwAAAPEDEgAEAAAAHAESABcAAAD1AxIABQAAAHgBEgAcAAAA+gMSAAMAAABIARIAFwAAAP0DEgADAAAAqQESABcAAAAABBIAAwAAANUBEgAXAAAAAwQSAAQAAAAHBBIABAAAAAsEEgAUAAAAHwQSABUAAAA0BBIAEQAAAEUEEgASAAAAVwQSABkAAABwBBIAHAAAAIwEEgADAAAAjwQSAAoAAACZBBIACgAAAI8EEgAKAAAAowQSAAIAAABwBBIAHAAAAKUEEgADAAAAqAQSAAkAAACxBBIACQAAAKgEEgAJAAAAugQSAAIAAAAfBBIAFQAAALwEEgACAAAARQQSABIAAAC+BBIAAgAAAMAEEgAQAAAA0AQSAA4AAADABBIAEAAAAN4EEgAFAAAA4wQSABMAAAD2BBIABQAAAPsEEgAPAAAACgUSAAQAAAAOBRIADgAAABwFEgAFAAAAIQUSAAUAAAAmBRIADgAAAPsEEgAPAAAANAUSAA0AAAAOBRIADgAAAEEFEgARAAAA4wQSABMAAABSBRIAEQAAAGMFEgASAAAAdQUSAAUAAABjBRIAEgAAAHoFEgAHAAAAgQUSABwAAACdBRIAGgAAAIEFEgAcAAAAtwUSAAwAAADDBRIADgAAANEFEgAMAAAA3QUSAA4AAADrBRIADQAAAPgFEgAPAAAABwYSAA0AAAAUBhIADwAAACMGEgADAAAAJgYSAAgAAAAuBhIAFAAAAEIGEgAVAAAAVwYSAAgAAAAmBhIACAAAAF8GEgAHAAAAQgYSABUAAABmBhIABgAAAGwGEgAPAAAAewYSAA0AAABsBhIADwAAAIgGEgAYAAAAvwMSABoAAACgBhIAAgAAAETkEQAQAAAAogYSAAMAAAB05BEAFgAAAKUGEgAPAAAAROQRABAAAAC0BhIADAAAAMAGEgANAAAAzQYSABQAAAB05BEAFgAAAOEGEgAOAAAA7wYSAA8AAAD+BhIADAAAAAoHEgANAAAAFwcSAAYAAADABhIADQAAAB0HEgAFAAAA7wYSAA8AAAAiBxIABgAAAAoHEgANAAAAKAcSABIAAAA6BxIAFAAAAE4HEgADAAAAUQcSAAkAAABaBxIACAAAAFEHEgAJAAAAYgcSAAMAAAA6BxIAFAAAAGUHEgAGAAAAawcSAAYAAABxBxIAAwAAAHQHEgALAAAAfwcSAAoAAAB0BxIACwAAAIkHEgAEAAAAjQcSAAsAAACYBxIACwAAAI0HEgALAAAAowcSAAMAAACmBxIACAAAAK4HEgAEAAAAsgcSABMAAADFBxIAEQAAALIHEgATAAAA1gcSAAQAAADaBxIAFAAAAO4HEgAHAAAApgcSAAgAAAD1BxIAEgAAANoHEgAUAAAABwgSABcAAAAeCBIAGQAAADcIEgAVAAAATAgSABcAAABjCBIABAAAAB4IEgAZAAAAZwgSAAQAAABMCBIAFwAAAGsIEgADAAAAbggSAAsAAAB5CBIADQAAAIYIEgAPAAAAlQgSAAIAAACXCBIADQAAAKQIEgAFAAAAqQgSAAwAAAC1CBIACwAAAKkIEgAMAAAAwAgSAAwAAACXCBIADQAAAMwIEgALAAAA1wgSAAwAAADjCBIAAwAAAIYIEgAPAAAA5ggSAAIAAADXCBIADAAAAOgIEgASAAAAAgISABIAAAD6CBIAFQAAACsCEgAVAAAADwkSAAcAAABJAhIABwAAABYJEgALAAAAXQISAAwAAAAhCRIACwAAAHYCEgAMAAAALAkSAAsAAACPAhIADAAAADcJEgAMAAAAqQISAA0AAABDCRIACwAAAMMCEgAMAAAATgkSAAsAAADcAhIADAAAAFkJEgALAAAA9QISAAwAAABkCRIACwAAAA4DEgAMAAAAbwkSAAwAAAAoAxIADQAAAHsJEgALAAAAQgMSAAwAAACGCRIACwAAAFsDEgAMAAAAkQkSAA0AAAB2AxIADQAAAJ4JEgAPAAAAlAMSAA8AAACtCRIACgAAAK8DEgAKAAAAtwkSAAIAAAC5CRIACgAAAF7kEQACAAAAwwkSABEAAADUCRIACQAAALkJEgAKAAAA3QkSAAMAAADgCRIAFwAAAPcJEgAVAAAA4AkSABcAAAAMChIABQAAABEKEgAJAAAAGgoSAAkAAAARChIACQAAACMKEgAQAAAAwwkSABEAAAAzChIABAAAADcKEgAEAAAAOwoSAAIAAAA9ChIABAAAAEEKEgADAAAARAoSAA4AAAArixYABAAAAD0KEgAEAAAAUgoSAAkAAABbChIACgAAAGUKEgAFAAAAagoSABcAAACBChIABQAAAIYKEgAPAAAAlQoSAA0AAACGChIADwAAAKIKEgAFAAAApwoSAA8AAAC2ChIADQAAAKcKEgAPAAAAwwoSAAwAAADPChIADQAAANwKEgAGAAAAzwoSAA0AAADiChIABgAAAOgKEgAQAAAA+AoSAA4AAADoChIAEAAAAAYLEgAGAAAADAsSABAAAAAcCxIADgAAAAwLEgAQAAAAKgsSABUAAABqChIAFwAAAD8LEgACAAAAQQsSAAwAAABNCxIACwAAAEELEgAMAAAAWAsSAAwAAABkCxIADQAAAHELEgACAAAAZAsSAA0AAABzCxIABgAAAHkLEgAQAAAAiQsSAAgAAABuCBIACwAAAJELEgADAAAAlAsSACIAAAC2CxIABgAAALwLEgAVAAAA0QsSAAQAAADVCxIAEQAAAOYLEgAEAAAA6gsSAA4AAAD4CxIABgAAAP4LEgAPAAAADQwSAAUAAAASDBIACgAAABwMEgAPAAAAeQsSABAAAAArDBIAHgAAAJQLEgAiAAAASQwSABMAAAC8CxIAFQAAAFwMEgAPAAAA1QsSABEAAABrDBIADAAAAOoLEgAOAAAAdwwSAA4AAAD+CxIADwAAAIUMEgAJAAAAEgwSAAoAAACODBIADgAAAJwMEgAPAAAAqwwSAAYAAACcDBIADwAAALEMEgAGAAAAtwwSAA4AAADFDBIADQAAALcMEgAOAAAA0gwSABEAAADjDBIAEwAAAPYMEgAFAAAA4wwSABMAAAD7DBIAAwAAAP4MEgAcAAAAGg0SABoAAAD+DBIAHAAAADQNEgAFAAAAOQ0SAA4AAABHDRIADQAAADkNEgAOAAAAVA0SAAcAAABbDRIABwAAAGINEgARAAAAcw0SABIAAACFDRIAAgAAAHMNEgASAAAAhw0SAAIAAACK5BEADgAAAFzkEQACAAAAVOQRAAYAAACJDRIAAwAAAIwNEgATAAAAnw0SAAYAAABU5BEABgAAAKUNEgAQAAAAY+QRABEAAAC1DRIAAwAAAGPkEQARAAAAuA0SAAIAAAC6DRIACwAAAMUNEgANAAAAiuQRAA4AAADSDRIAEAAAAOINEgARAAAA8w0SAAMAAACMDRIAEwAAAPYNEgARAAAAjA0SABMAAAAHDhIAFgAAAB0OEgAYAAAANQ4SABYAAABLDhIAGAAAAGMOEgAWAAAAeQ4SABgAAACRDhIAAwAAAB0OEgAYAAAAlA4SAAoAAAC6DRIACwAAAJ4OEgAFAAAAow4SAAsAAACuDhIAAwAAAEsOEgAYAAAAsQ4SAAUAAADiDRIAEQAAALYOEgADAAAAeQ4SABgAAAC5DhIAAgAAALsOEgARAAAAzA4SAAQAAADQDhIAFAAAAOQOEgATAAAA0A4SABQAAAD3DhIAEAAAALsOEgARAAAABw8SAAIAAAAJDxIAEQAAABoPEgAFAAAAHw8SABEAAAAwDxIADAAAAEQKEgAOAAAAPA8SABQAAACvAxIACgAAAFAPEgAQAAAAHw8SABEAAABgDxIABQAAAGUPEgAJAAAAbg8SAAkAAABlDxIACQAAAHcPEgAQAAAACQ8SABEAAACHDxIAAwAAAK8DEgAKAAAAig8SABEAAACbDxIAEgAAAK0PEgATAAAAwA8SABQAAADUDxIAAgAAAMAPEgAUAAAA1g8SAAIAAACbDxIAEgAAANgPEgACAAAAmOQRAAoAAADaDxIACgAAAKMOEgALAAAA5A8SAAkAAACY5BEACgAAAO0PEgAGAAAAow4SAAsAAADzDxIABAAAAPcPEgAMAAAAAxASAAsAAAD3DxIADAAAAA4QEgAEAAAAEhASAAkAAAAbEBIACAAAABIQEgAJAAAAIxASAAUAAADDBRIADgAAACgQEgAFAAAA3QUSAA4AAAAtEBIABgAAAPgFEgAPAAAAMxASAAYAAAAUBhIADwAAAJTjEQBgAAAALwIAABYAAAAxLjFWMV8xMTAuMFYxMF8wMTEuMFYxMV8wMTIuMFYxMl8wMTIuMVYxMl8xMTMuMFYxM18wMTQuMFYxNF8wMTUuMFYxNV8wMi4wVjJfMDIuMVYyXzEzLjBWM18wMy4xVjNfMTMuMlYzXzI0LjBWNF8wNC4xVjRfMTUuMFY1XzA1LjFWNV8xNS4yVjVfMjYuMFY2XzA2LjFWNl8xNi4yVjZfMjYuM1Y2XzM3LjBWN18wOC4wVjhfMDkuMFY5XzBVbmFzc2lnbmVkdW5hc3NpZ25lZHYxMDB2MTF2MTEwdjEyMHYxMjF2MTMwdjE0MHYxNTB2MjB2MjF2MzB2MzF2MzJ2NDB2NDF2NTB2NTF2NTJ2NjB2NjF2NjJ2NjN2NzB2ODB2OTAALCASAAMAAAAvIBIABAAAADMgEgAEAAAANyASAAUAAAA8IBIABAAAAEAgEgAFAAAARSASAAQAAABJIBIABQAAAE4gEgAEAAAAUiASAAUAAABXIBIABAAAAFsgEgAFAAAAYCASAAQAAABkIBIABQAAAGkgEgAEAAAAbSASAAUAAAByIBIAAwAAAHUgEgAEAAAAeSASAAMAAAB8IBIABAAAAIAgEgADAAAAgyASAAQAAACHIBIAAwAAAIogEgAEAAAAjiASAAMAAACRIBIABAAAAJUgEgADAAAAmCASAAQAAACcIBIAAwAAAJ8gEgAEAAAAoyASAAMAAACmIBIABAAAAKogEgADAAAArSASAAQAAACxIBIAAwAAALQgEgAEAAAAuCASAAMAAAC7IBIABAAAAL8gEgADAAAAwiASAAQAAADGIBIAAwAAAMkgEgAEAAAAzSASAAMAAADQIBIABAAAANQgEgADAAAA1yASAAQAAADbIBIAAwAAAN4gEgAEAAAA4iASAAMAAADlIBIABAAAADsKEgACAAAA6SASAAoAAADzIBIACgAAAOkgEgAKAAAA/SASAAQAAAA3IBIABQAAAAEhEgADAAAALyASAAQAAAAEIRIABAAAAEAgEgAFAAAACCESAAQAAABJIBIABQAAAAwhEgAEAAAAUiASAAUAAAAQIRIABAAAAFsgEgAFAAAAFCESAAQAAABkIBIABQAAABghEgAEAAAAbSASAAUAAAAcIRIAAwAAAHUgEgAEAAAAHyESAAMAAAB8IBIABAAAACIhEgADAAAAgyASAAQAAAAlIRIAAwAAAIogEgAEAAAAKCESAAMAAACRIBIABAAAACshEgADAAAAmCASAAQAAAAuIRIAAwAAAJ8gEgAEAAAAMSESAAMAAACmIBIABAAAADQhEgADAAAArSASAAQAAAA3IRIAAwAAALQgEgAEAAAAOiESAAMAAAC7IBIABAAAAD0hEgADAAAAwiASAAQAAABAIRIAAwAAAMkgEgAEAAAAQyESAAMAAADQIBIABAAAAEYhEgADAAAA1yASAAQAAABJIRIAAwAAAN4gEgAEAAAATCESAAMAAADlIBIABAAAAGNhc2VkbGV0dGVyQ2FzZWRfTGV0dGVyY2NDb250cm9sRm9ybWF0Y2xvc2VwdW5jdHVhdGlvbkNsb3NlX1B1bmN0dWF0aW9uY25jbnRybGNvUHJpdmF0ZV9Vc2Vjb21iaW5pbmdtYXJrY29ubmVjdG9ycHVuY3R1YXRpb25Db25uZWN0b3JfUHVuY3R1YXRpb25jb250cm9sY3NTdXJyb2dhdGVjdXJyZW5jeXN5bWJvbEN1cnJlbmN5X1N5bWJvbGRhc2hwdW5jdHVhdGlvbkRhc2hfUHVuY3R1YXRpb25kZWNpbWFsbnVtYmVyRGVjaW1hbF9OdW1iZXJkaWdpdGVuY2xvc2luZ21hcmtFbmNsb3NpbmdfTWFya2ZpbmFscHVuY3R1YXRpb25GaW5hbF9QdW5jdHVhdGlvbmZvcm1hdGluaXRpYWxwdW5jdHVhdGlvbkluaXRpYWxfUHVuY3R1YXRpb25sTGV0dGVybGV0dGVybGV0dGVybnVtYmVyTGV0dGVyX051bWJlcmxpbmVzZXBhcmF0b3JMaW5lX1NlcGFyYXRvcmxsTG93ZXJjYXNlX0xldHRlcmxtTW9kaWZpZXJfTGV0dGVybG9PdGhlcl9MZXR0ZXJsb3dlcmNhc2VsZXR0ZXJUaXRsZWNhc2VfTGV0dGVybHVVcHBlcmNhc2VfTGV0dGVybW1hcmttYXRoc3ltYm9sTWF0aF9TeW1ib2xtY1NwYWNpbmdfTWFya21lbW5Ob25zcGFjaW5nX01hcmttb2RpZmllcmxldHRlcm1vZGlmaWVyc3ltYm9sTW9kaWZpZXJfU3ltYm9sbmRubG5vT3RoZXJfTnVtYmVybm9uc3BhY2luZ21hcmtvcGVucHVuY3R1YXRpb25PcGVuX1B1bmN0dWF0aW9ub3RoZXJvdGhlcmxldHRlcm90aGVybnVtYmVyb3RoZXJwdW5jdHVhdGlvbk90aGVyX1B1bmN0dWF0aW9ub3RoZXJzeW1ib2xPdGhlcl9TeW1ib2xwUHVuY3R1YXRpb25wYXJhZ3JhcGhzZXBhcmF0b3JQYXJhZ3JhcGhfU2VwYXJhdG9ycGNwZHBlcGZwb3ByaXZhdGV1c2Vwc3B1bmN0cHVuY3R1YXRpb25zU3ltYm9sc2VwYXJhdG9yU2VwYXJhdG9yc2tzbXNvc3BhY2VzZXBhcmF0b3JT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EgAHAAAA2S0SAAcAAADSLRIABwAAAGINEgARAAAAcw0SABIAAACFDRIAAgAAAHMNEgASAAAAAygSAAIAAADgLRIACwAAACQoEgALAAAA4C0SAAsAAADrLRIAAQAAAOwtEgABAAAA7S0SAAEAAADuLRIAAQAAAO8tEgACAAAAjBkWAAUAAABBRBYAAwAAAPEtEgADAAAAYWRsYW1BZGxhbWFkbG1hZ2hiQ2F1Y2FzaWFuX0FsYmFuaWFuYWhvbUFob21hbmF0b2xpYW5oaWVyb2dseXBoc0FuYXRvbGlhbl9IaWVyb2dseXBoc2FyYWJBcmFiaWNhcmFiaWNhcm1lbmlhbkFybWVuaWFuYXJtaUltcGVyaWFsX0FyYW1haWNhcm1uYXZlc3RhbkF2ZXN0YW5hdnN0YmFsaUJhbGluZXNlYmFsaW5lc2ViYW11QmFtdW1iYW11bWJhc3NCYXNzYV9WYWhiYXNzYXZhaGJhdGFrQmF0YWtiYXRrYmVuZ0JlbmdhbGliZW5nYWxpYmhhaWtzdWtpQmhhaWtzdWtpYmhrc2JvcG9Cb3BvbW9mb2JvcG9tb2ZvYnJhaEJyYWhtaWJyYWhtaWJyYWlCcmFpbGxlYnJhaWxsZWJ1Z2lCdWdpbmVzZWJ1Z2luZXNlYnVoZEJ1aGlkYnVoaWRjYWttQ2hha21hY2FuYWRpYW5hYm9yaWdpbmFsQ2FuYWRpYW5fQWJvcmlnaW5hbGNhbnNjYXJpQ2FyaWFuY2FyaWFuY2F1Y2FzaWFuYWxiYW5pYW5jaGFrbWFjaGFtQ2hhbWNoZXJDaGVyb2tlZWNoZXJva2VlY2hvcmFzbWlhbkNob3Jhc21pYW5jaHJzY29tbW9uQ29tbW9uY29wdENvcHRpY2NvcHRpY2NwbW5DeXByb19NaW5vYW5jcHJ0Q3lwcmlvdGN1bmVpZm9ybUN1bmVpZm9ybWN5cHJpb3RjeXByb21pbm9hbmN5cmlsbGljQ3lyaWxsaWNjeXJsZGVzZXJldERlc2VyZXRkZXZhRGV2YW5hZ2FyaWRldmFuYWdhcmlkaWFrRGl2ZXNfQWt1cnVkaXZlc2FrdXJ1ZG9nckRvZ3JhZG9ncmFkc3J0ZHVwbER1cGxveWFuZHVwbG95YW5lZ3lwRWd5cHRpYW5fSGllcm9nbHlwaHNlZ3lwdGlhbmhpZXJvZ2x5cGhzZWxiYUVsYmFzYW5lbGJhc2FuZWx5bUVseW1haWNlbHltYWljZXRoaUV0aGlvcGljZXRoaW9waWNnZW9yR2VvcmdpYW5nZW9yZ2lhbmdsYWdHbGFnb2xpdGljZ2xhZ29saXRpY2dvbmdHdW5qYWxhX0dvbmRpZ29ubU1hc2FyYW1fR29uZGlnb3RoR290aGljZ290aGljZ3JhbkdyYW50aGFncmFudGhhZ3JlZWtHcmVla2dyZWtndWphcmF0aUd1amFyYXRpZ3Vqcmd1bmphbGFnb25kaWd1cm11a2hpR3VybXVraGlndXJ1aGFuSGFuaGFuZ0hhbmd1bGhhbmd1bGhhbmloYW5pZmlyb2hpbmd5YUhhbmlmaV9Sb2hpbmd5YWhhbm9IYW51bm9vaGFudW5vb2hhdHJIYXRyYW5oYXRyYW5oZWJySGVicmV3aGVicmV3aGlyYUhpcmFnYW5haGlyYWdhbmFobHV3aG1uZ1BhaGF3aF9IbW9uZ2htbnBOeWlha2VuZ19QdWFjaHVlX0htb25naHJrdEthdGFrYW5hX09yX0hpcmFnYW5haHVuZ09sZF9IdW5nYXJpYW5pbXBlcmlhbGFyYW1haWNpbmhlcml0ZWRJbmhlcml0ZWRpbnNjcmlwdGlvbmFscGFobGF2aUluc2NyaXB0aW9uYWxfUGFobGF2aWluc2NyaXB0aW9uYWxwYXJ0aGlhbkluc2NyaXB0aW9uYWxfUGFydGhpYW5pdGFsT2xkX0l0YWxpY2phdmFKYXZhbmVzZWphdmFuZXNla2FpdGhpS2FpdGhpa2FsaUtheWFoX0xpa2FuYUthdGFrYW5ha2FubmFkYUthbm5hZGFrYXRha2FuYWthdGFrYW5hb3JoaXJhZ2FuYWthd2lLYXdpa2F5YWhsaWtoYXJLaGFyb3NodGhpa2hhcm9zaHRoaWtoaXRhbnNtYWxsc2NyaXB0S2hpdGFuX1NtYWxsX1NjcmlwdGtobWVyS2htZXJraG1ya2hvaktob2praWtob2praWtodWRhd2FkaUtodWRhd2FkaWtpdHNrbmRha3RoaWxhbmFUYWlfVGhhbWxhb0xhb2xhb29sYXRpbkxhdGlubGF0bmxlcGNMZXBjaGFsZXBjaGFsaW1iTGltYnVsaW1idWxpbmFMaW5lYXJfQWxpbmJMaW5lYXJfQmxpbmVhcmFsaW5lYXJibGlzdUxpc3VseWNpTHljaWFubHljaWFubHlkaUx5ZGlhbmx5ZGlhbm1haGFqYW5pTWFoYWphbmltYWhqbWFrYU1ha2FzYXJtYWthc2FybWFsYXlhbGFtTWFsYXlhbGFtbWFuZE1hbmRhaWNtYW5kYWljbWFuaU1hbmljaGFlYW5tYW5pY2hhZWFubWFyY01hcmNoZW5tYXJjaGVubWFzYXJhbWdvbmRpbWVkZWZhaWRyaW5NZWRlZmFpZHJpbm1lZGZtZWV0ZWltYXlla01lZXRlaV9NYXlla21lbmRNZW5kZV9LaWtha3VpbWVuZGVraWtha3VpbWVyY01lcm9pdGljX0N1cnNpdmVtZXJvTWVyb2l0aWNfSGllcm9nbHlwaHNtZXJvaXRpY2N1cnNpdmVtZXJvaXRpY2hpZXJvZ2x5cGhzbWlhb01pYW9tbHltbW9kaU1vZGltb25nTW9uZ29saWFubW9uZ29saWFubXJvTXJvbXJvb210ZWltdWx0TXVsdGFuaW11bHRhbmlteWFubWFyTXlhbm1hcm15bXJuYWJhdGFlYW5OYWJhdGFlYW5uYWdtTmFnX011bmRhcmluYWdtdW5kYXJpbmFuZE5hbmRpbmFnYXJpbmFuZGluYWdhcmluYXJiT2xkX05vcnRoX0FyYWJpYW5uYmF0bmV3YU5ld2FuZXd0YWlsdWVOZXdfVGFpX0x1ZW5rb05rb25rb29uc2h1TnVzaHVudXNodW55aWFrZW5ncHVhY2h1ZWhtb25nb2dhbU9naGFtb2doYW1vbGNoaWtpT2xfQ2hpa2lvbGNrb2xkaHVuZ2FyaWFub2xkaXRhbGljb2xkbm9ydGhhcmFiaWFub2xkcGVybWljT2xkX1Blcm1pY29sZHBlcnNpYW5PbGRfUGVyc2lhbm9sZHNvZ2RpYW5PbGRfU29nZGlhbm9sZHNvdXRoYXJhYmlhbk9sZF9Tb3V0aF9BcmFiaWFub2xkdHVya2ljT2xkX1R1cmtpY29sZHV5Z2h1ck9sZF9VeWdodXJvcml5YU9yaXlhb3JraG9yeWFvc2FnZU9zYWdlb3NnZW9zbWFPc21hbnlhb3NtYW55YW91Z3JwYWhhd2hobW9uZ3BhbG1QYWxteXJlbmVwYWxteXJlbmVwYXVjUGF1X0Npbl9IYXVwYXVjaW5oYXVwZXJtcGhhZ1BoYWdzX1BhcGhhZ3NwYXBobGlwaGxwUHNhbHRlcl9QYWhsYXZpcGhueFBob2VuaWNpYW5waG9lbmljaWFucGxyZHBydGlwc2FsdGVycGFobGF2aXFhYWNxYWFpcmVqYW5nUmVqYW5ncmpuZ3JvaGdydW5pY1J1bmljcnVucnNhbWFyaXRhblNhbWFyaXRhbnNhbXJzYXJic2F1clNhdXJhc2h0cmFzYXVyYXNodHJhc2dud1NpZ25Xcml0aW5nc2hhcmFkYVNoYXJhZGFzaGF2aWFuU2hhdmlhbnNoYXdzaHJkc2lkZFNpZGRoYW1zaWRkaGFtc2lnbndyaXRpbmdzaW5kc2luaFNpbmhhbGFzaW5oYWxhc29nZFNvZ2RpYW5zb2dkaWFuc29nb3NvcmFTb3JhX1NvbXBlbmdzb3Jhc29tcGVuZ3NveW9Tb3lvbWJvc295b21ib3N1bmRTdW5kYW5lc2VzdW5kYW5lc2VzeWxvU3lsb3RpX05hZ3Jpc3lsb3RpbmFncmlzeXJjU3lyaWFjc3lyaWFjdGFnYWxvZ1RhZ2Fsb2d0YWdiVGFnYmFud2F0YWdiYW53YXRhaWxlVGFpX0xldGFpdGhhbXRhaXZpZXRUYWlfVmlldHRha3JUYWtyaXRha3JpdGFsZXRhbHV0YW1pbFRhbWlsdGFtbHRhbmdUYW5ndXR0YW5nc2FUYW5nc2F0YW5ndXR0YXZ0dGVsdVRlbHVndXRlbHVndXRmbmdUaWZpbmFnaHRnbGd0aGFhVGhhYW5hdGhhYW5hdGhhaVRoYWl0aWJldGFuVGliZXRhbnRpYnR0aWZpbmFnaHRpcmhUaXJodXRhdGlyaHV0YXRuc2F0b3RvVG90b3VnYXJVZ2FyaXRpY3VnYXJpdGljVW5rbm93bnZhaVZhaXZhaWl2aXRoVml0aGt1cWl2aXRoa3VxaXdhbmNob1dhbmNob3dhcmFXYXJhbmdfQ2l0aXdhcmFuZ2NpdGl3Y2hveHBlb3hzdXh5ZXppWWV6aWRpeWV6aWRpeWlZaXlpaWl6YW5hYmF6YXJzcXVhcmVaYW5hYmF6YXJfU3F1YXJlemFuYnppbmh6eXl5enp6erQvEgAFAAAAuS8SAAUAAAC+LxIABAAAALkvEgAFAAAAwi8SAAQAAADGLxIAEgAAANgvEgAEAAAA3C8SAAQAAADgLxIAFAAAAPQvEgAVAAAACTASAAQAAAANMBIABgAAABMwEgAGAAAADTASAAYAAAAZMBIACAAAACEwEgAIAAAAKTASAAQAAAAtMBIAEAAAAD0wEgAEAAAAITASAAgAAABBMBIABwAAAEgwEgAHAAAATzASAAQAAABIMBIABwAAAFMwEgAEAAAAVzASAAgAAABfMBIACAAAAFcwEgAIAAAAZzASAAQAAABrMBIABQAAAHAwEgAFAAAAazASAAUAAAB1MBIABAAAAHkwEgAJAAAAgjASAAgAAAB5MBIACQAAAIowEgAFAAAAjzASAAUAAACUMBIABAAAAI8wEgAFAAAAmDASAAQAAACcMBIABwAAAKMwEgAHAAAAnDASAAcAAACqMBIACQAAALMwEgAJAAAAvDASAAQAAACzMBIACQAAAMAwEgAEAAAAxDASAAgAAADMMBIACAAAAMQwEgAIAAAA1DASAAQAAADYMBIABgAAAN4wEgAGAAAA2DASAAYAAADkMBIABAAAAOgwEgAHAAAA7zASAAcAAADoMBIABwAAAPYwEgAEAAAA+jASAAgAAAACMRIACAAAAPowEgAIAAAACjESAAQAAAAOMRIABQAAABMxEgAFAAAADjESAAUAAAAYMRIABAAAABwxEgAGAAAAIjESABIAAAA0MRIAEwAAAEcxEgAEAAAANDESABMAAABLMRIABAAAAE8xEgAGAAAAVTESAAYAAABPMRIABgAAAFsxEgARAAAAxi8SABIAAABsMRIABgAAABwxEgAGAAAAcjESAAQAAAB2MRIABAAAAHoxEgAEAAAAfjESAAgAAACGMRIACAAAAH4xEgAIAAAAjjESAAoAAACYMRIACgAAAKIxEgAEAAAAmDESAAoAAACmMRIABgAAAKwxEgAGAAAAsjESAAQAAAC2MRIABgAAALwxEgAGAAAAtjESAAYAAADCMRIABAAAAMYxEgAMAAAA0jESAAQAAADWMRIABwAAAN0xEgAJAAAA5jESAAkAAADvMRIABwAAANYxEgAHAAAA9jESAAsAAADGMRIADAAAAAEyEgAIAAAACTISAAgAAAARMhIABAAAAAkyEgAIAAAAFTISAAcAAAAcMhIABwAAACMyEgAEAAAAJzISAAoAAAAxMhIACgAAACcyEgAKAAAAOzISAAQA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AADVHgAA1x4AANceAADZHgAA2R4AANseAADbHgAA3R4AAN0eAADfHgAA3x4AAOEeAADhHgAA4x4AAOMeAADlHgAA5R4AAOceAADnHgAA6R4AAOkeAADrHgAA6x4AAO0eAADtHgAA7x4AAO8eAADxHgAA8R4AAPMeAADzHgAA9R4AAPUeAAD3HgAA9x4AAPkeAAD5HgAA+x4AAPseAAD9HgAA/R4AAP8eAAAHHwAAEB8AABUfAAAgHwAAJx8AADAfAAA3HwAAQB8AAEUfAABQHwAAVx8AAGAfAABnHwAAcB8AAH0fAACAHwAAhx8AAJAfAACXHwAAoB8AAKcfAACwHwAAtB8AALYfAAC3HwAAvh8AAL4fAADCHwAAxB8AAMYfAADHHwAA0B8AANMfAADWHwAA1x8AAOAfAADnHwAA8h8AAPQfAAD2HwAA9x8AAAohAAAKIQAADiEAAA8hAAATIQAAEyEAAC8hAAAvIQAANCEAADQhAAA5IQAAOSEAADwhAAA9IQAARiEAAEkhAABOIQAATiEAAIQhAACEIQAAMCwAAF8sAABhLAAAYSwAAGUsAABmLAAAaCwAAGgsAABqLAAAaiwAAGwsAABsLAAAcSwAAHEsAABzLAAAdCwAAHYsAAB7LAAAgSwAAIEsAACDLAAAgywAAIUsAACFLAAAhywAAIcsAACJLAAAiSwAAIssAACLLAAAjSwAAI0sAACPLAAAjywAAJEsAACRLAAAkywAAJMsAACVLAAAlSwAAJcsAACXLAAAmSwAAJksAACbLAAAmywAAJ0sAACdLAAAnywAAJ8sAAChLAAAoSwAAKMsAACjLAAApSwAAKUsAACnLAAApywAAKksAACpLAAAqywAAKssAACtLAAArSwAAK8sAACvLAAAsSwAALEsAACzLAAAsywAALUsAAC1LAAAtywAALcsAAC5LAAAuSwAALssAAC7LAAAvSwAAL0sAAC/LAAAvywAAMEsAADBLAAAwywAAMMsAADFLAAAxSwAAMcsAADHLAAAySwAAMksAADLLAAAyywAAM0sAADNLAAAzywAAM8sAADRLAAA0SwAANMsAADTLAAA1SwAANUsAADXLAAA1ywAANksAADZLAAA2ywAANssAADdLAAA3SwAAN8sAADfLAAA4SwAAOEsAADjLAAA5CwAAOwsAADsLAAA7iwAAO4sAADzLAAA8ywAAAAtAAAlLQAAJy0AACctAAAtLQAALS0AAEGmAABBpgAAQ6YAAEOmAABFpgAARaYAAEemAABHpgAASaYAAEmmAABLpgAAS6YAAE2mAABNpgAAT6YAAE+mAABRpgAAUaYAAFOmAABTpgAAVaYAAFWmAABXpgAAV6YAAFmmAABZpgAAW6YAAFumAABdpgAAXaYAAF+mAABfpgAAYaYAAGGmAABjpgAAY6YAAGWmAABlpgAAZ6YAAGemAABppgAAaaYAAGumAABrpgAAbaYAAG2mAACBpgAAgaYAAIOmAACDpgAAhaYAAIWmAACHpgAAh6YAAImmAACJpgAAi6YAAIumAACNpgAAjaYAAI+mAACPpgAAkaYAAJGmAACTpgAAk6YAAJWmAACVpgAAl6YAAJemAACZpgAAmaYAAJumAACbpgAAI6cAACOnAAAlpwAAJacAACenAAAnpwAAKacAACmnAAArpwAAK6cAAC2nAAAtpwAAL6cAADGnAAAzpwAAM6cAADWnAAA1pwAAN6cAADenAAA5pwAAOacAADunAAA7pwAAPacAAD2nAAA/pwAAP6cAAEGnAABBpwAAQ6cAAEOnAABFpwAARacAAEenAABHpwAASacAAEmnAABLpwAAS6cAAE2nAABNpwAAT6cAAE+nAABRpwAAUacAAFOnAABTpwAAVacAAFWnAABXpwAAV6cAAFmnAABZpwAAW6cAAFunAABdpwAAXacAAF+nAABfpwAAYacAAGGnAABjpwAAY6cAAGWnAABlpwAAZ6cAAGenAABppwAAaacAAGunAABrpwAAbacAAG2nAABvpwAAb6cAAHGnAAB4pwAAeqcAAHqnAAB8pwAAfKcAAH+nAAB/pwAAgacAAIGnAACDpwAAg6cAAIWnAACFpwAAh6cAAIenAACMpwAAjKcAAI6nAACOpwAAkacAAJGnAACTpwAAlacAAJenAACXpwAAmacAAJmnAACbpwAAm6cAAJ2nAACdpwAAn6cAAJ+nAAChpwAAoacAAKOnAACjpwAApacAAKWnAACnpwAAp6cAAKmnAACppwAAr6cAAK+nAAC1pwAAtacAALenAAC3pwAAuacAALmnAAC7pwAAu6cAAL2nAAC9pwAAv6cAAL+nAADBpwAAwacAAMOnAADDpwAAyKcAAMinAADKpwAAyqcAANGnAADRpwAA06cAANOnAADVpwAA1acAANenAADXpwAA2acAANmnAAD2pwAA9qcAAPqnAAD6pwAAMKsAAFqrAABgqwAAaKsAAHCrAAC/qwAAAPsAAAb7AAAT+wAAF/sAAEH/AABa/wAAKAQBAE8EAQDYBAEA+wQBAJcFAQChBQEAowUBALEFAQCzBQEAuQUBALsFAQC8BQEAwAwBAPIMAQDAGAEA3xgBAGBuAQB/bgEAGtQBADPUAQBO1AEAVNQBAFbUAQBn1AEAgtQBAJvUAQC21AEAudQBALvUAQC71AEAvdQBAMPUAQDF1AEAz9QBAOrUAQAD1QEAHtUBADfVAQBS1QEAa9UBAIbVAQCf1QEAutUBANPVAQDu1QEAB9YBACLWAQA71gEAVtYBAG/WAQCK1gEApdYBAMLWAQDa1gEA3NYBAOHWAQD81gEAFNcBABbXAQAb1wEANtcBAE7XAQBQ1wEAVdcBAHDXAQCI1wEAitcBAI/XAQCq1wEAwtcBAMTXAQDJ1wEAy9cBAMvXAQAA3wEACd8BAAvfAQAe3wEAJd8BACrfAQAi6QEAQ+kBAAADAABvAwAAgwQAAIkEAACRBQAAvQUAAL8FAAC/BQAAwQUAAMIFAADEBQAAxQUAAMcFAADHBQAAEAYAABoGAABLBgAAXwYAAHAGAABwBgAA1gYAANwGAADfBgAA5AYAAOcGAADoBgAA6gYAAO0GAAARBwAAEQcAADAHAABKBwAApgcAALAHAADrBwAA8wcAAP0HAAD9BwAAFggAABkIAAAbCAAAIwgAACUIAAAnCAAAKQgAAC0IAABZCAAAWwgAAJgIAACfCAAAyggAAOEIAADjCAAAAwkAADoJAAA8CQAAPgkAAE8JAABRCQAAVwkAAGIJAABjCQAAgQkAAIMJAAC8CQAAvAkAAL4JAADECQAAxwkAAMgJAADLCQAAzQkAANcJAADXCQAA4gkAAOMJAAD+CQAA/gkAAAEKAAADCgAAPAoAADwKAAA+CgAAQgoAAEcKAABICgAASwoAAE0KAABRCgAAUQoAAHAKAABxCgAAdQoAAHUKAACBCgAAgwoAALwKAAC8CgAAvgoAAMUKAADHCgAAyQoAAMsKAADNCgAA4goAAOMKAAD6CgAA/woAAAELAAADCwAAPAsAADwLAAA+CwAARAsAAEcLAABICwAASwsAAE0LAABVCwAAVwsAAGILAABjCwAAggsAAIILAAC+CwAAwgsAAMYLAADICwAAygsAAM0LAADXCwAA1wsAAAAMAAAEDAAAPAwAADwMAAA+DAAARAwAAEYMAABIDAAASgwAAE0MAABVDAAAVgwAAGIMAABjDAAAgQwAAIMMAAC8DAAAvAwAAL4MAADEDAAAxgwAAMgMAADKDAAAzQwAANUMAADWDAAA4gwAAOMMAADzDAAA8wwAAAANAAADDQAAOw0AADwNAAA+DQAARA0AAEYNAABIDQAASg0AAE0NAABXDQAAVw0AAGINAABjDQAAgQ0AAIMNAADKDQAAyg0AAM8NAADUDQAA1g0AANYNAADYDQAA3w0AAPINAADzDQAAMQ4AADEOAAA0DgAAOg4AAEcOAABODgAAsQ4AALEOAAC0DgAAvA4AAMgOAADODgAAGA8AABkPAAA1DwAANQ8AADcPAAA3DwAAOQ8AADkPAAA+DwAAPw8AAHEPAACEDwAAhg8AAIcPAACNDwAAlw8AAJkPAAC8DwAAxg8AAMYPAAArEAAAPhAAAFYQAABZEAAAXhAAAGAQAABiEAAAZBAAAGcQAABtEAAAcRAAAHQQAACCEAAAjRAAAI8QAACPEAAAmhAAAJ0QAABdEwAAXxMAABIXAAAVFwAAMhcAADQXAABSFwAAUxcAAHIXAABzFwAAtBcAANMXAADdFwAA3RcAAAsYAAANGAAADxgAAA8YAACFGAAAhhgAAKkYAACpGAAAIBkAACsZAAAwGQAAOxkAABcaAAAbGgAAVRoAAF4aAABgGgAAfBoAAH8aAAB/GgAAsBoAAM4aAAAAGwAABBsAADQbAABEGwAAaxsAAHMbAACAGwAAghsAAKEbAACtGwAA5hsAAPMbAAAkHAAANxwAANAcAADSHAAA1BwAAOgcAADtHAAA7RwAAPQcAAD0HAAA9xwAAPkcAADAHQAA/x0AANAgAADwIAAA7ywAAPEsAAB/LQAAfy0AAOAtAAD/LQAAKjAAAC8wAACZMAAAmjAAAG+mAABypgAAdKYAAH2mAACepgAAn6YAAPCmAADxpgAAAqgAAAKoAAAGqAAABqgAAAuoAAALqAAAI6gAACeoAAAsqAAALKgAAICoAACBqAAAtKgAAMWoAADgqAAA8agAAP+oAAD/qAAAJqkAAC2pAABHqQAAU6kAAICpAACDqQAAs6kAAMCpAADlqQAA5akAACmqAAA2qgAAQ6oAAEOqAABMqgAATaoAAHuqAAB9qgAAsKoAALCqAACyqgAAtKoAALeqAAC4qgAAvqoAAL+qAADBqgAAwaoAAOuqAADvqgAA9aoAAPaqAADjqwAA6qsAAOyrAADtqwAAHvsAAB77AAAA/gAAD/4AACD+AAAv/gAA/QEBAP0BAQDgAgEA4AIBAHYDAQB6AwEAAQoBAAMKAQAFCgEABgoBAAwKAQAPCgEAOAoBADoKAQA/CgEAPwoBAOUKAQDmCgEAJA0BACcNAQCrDgEArA4BAP0OAQD/DgEARg8BAFAPAQCCDwEAhQ8BAAAQAQACEAEAOBABAEYQAQBwEAEAcBABAHMQAQB0EAEAfxABAIIQAQCwEAEAuhABAMIQAQDCEAEAABEBAAIRAQAnEQEANBEBAEURAQBGEQEAcxEBAHMRAQCAEQEAghEBALMRAQDAEQEAyREBAMwRAQDOEQEAzxEBACwSAQA3EgEAPhIBAD4SAQBBEgEAQRIBAN8SAQDqEgEAABMBAAMTAQA7EwEAPBMBAD4TAQBEEwEARxMBAEgTAQBLEwEATRMBAFcTAQBXEwEAYhMBAGMTAQBmEwEAbBMBAHATAQB0EwEANRQBAEYUAQBeFAEAXhQBALAUAQDDFAEArxUBALUVAQC4FQEAwBUBANwVAQDdFQEAMBYBAEAWAQCrFgEAtxYBAB0XAQArFwEALBgBADoYAQAwGQEANRkBADcZAQA4GQEAOxkBAD4ZAQBAGQEAQBkBAEIZAQBDGQEA0RkBANcZAQDaGQEA4BkBAOQZAQDkGQEAARoBAAoaAQAzGgEAORoBADsaAQA+GgEARxoBAEcaAQBRGgEAWxoBAIoaAQCZGgEALxwBADYcAQA4HAEAPxwBAJIcAQCnHAEAqRwBALYcAQAxHQEANh0BADodAQA6HQEAPB0BAD0dAQA/HQEARR0BAEcdAQBHHQEAih0BAI4dAQCQHQEAkR0BAJMdAQCXHQEA8x4BAPYeAQAAHwEAAR8BAAMfAQADHwEANB8BADofAQA+HwEAQh8BAEA0AQBANAEARzQBAFU0AQDwagEA9GoBADBrAQA2awEAT28BAE9vAQBRbwEAh28BAI9vAQCSbwEA5G8BAORvAQDwbwEA8W8BAJ28AQCevAEAAM8BAC3PAQAwzwEARs8BAGXRAQBp0QEAbdEBAHLRAQB70QEAgtEBAIXRAQCL0QEAqtEBAK3RAQBC0gEARNIBAADaAQA22gEAO9oBAGzaAQB12gEAddoBAITaAQCE2gEAm9oBAJ/aAQCh2gEAr9oBAADgAQAG4AEACOABABjgAQAb4AEAIeABACPgAQAk4AEAJuABACrgAQCP4AEAj+ABADDhAQA24QEAruIBAK7iAQDs4gEA7+IBAOzkAQDv5AEA0OgBANboAQBE6QEASukBAAABDgDvAQ4AKwAAACsAAAA8AAAAPgAAAHwAAAB8AAAAfgAAAH4AAACsAAAArAAAALEAAACxAAAA1wAAANcAAAD3AAAA9wAAAPYDAAD2AwAABgYAAAgGAABEIAAARCAAAFIgAABSIAAAeiAAAHwgAACKIAAAjCAAABghAAAYIQAAQCEAAEQhAABLIQAASyEAAJAhAACUIQAAmiEAAJshAACgIQAAoCEAAKMhAACjIQAApiEAAKYhAACuIQAAriEAAM4hAADPIQAA0iEAANIhAADUIQAA1CEAAPQhAAD/IgAAICMAACEjAAB8IwAAfCMAAJsjAACzIwAA3CMAAOEjAAC3JQAAtyUAAMElAADBJQAA+CUAAP8lAABvJgAAbyYAAMAnAADEJwAAxycAAOUnAADwJwAA/ycAAAApAACCKQAAmSkAANcpAADcKQAA+ykAAP4pAAD/KgAAMCsAAEQrAABHKwAATCsAACn7AAAp+wAAYv4AAGL+AABk/gAAZv4AAAv/AAAL/wAAHP8AAB7/AABc/wAAXP8AAF7/AABe/wAA4v8AAOL/AADp/wAA7P8AAMHWAQDB1gEA29YBANvWAQD71gEA+9YBABXXAQAV1wEANdcBADXXAQBP1wEAT9cBAG/XAQBv1wEAidcBAInXAQCp1wEAqdcBAMPXAQDD1wEA8O4BAPHuAQCwAgAAwQIAAMYCAADRAgAA4AIAAOQCAADsAgAA7AIAAO4CAADuAgAAdAMAAHQDAAB6AwAAegMAAFkFAABZBQAAQAYAAEAGAADlBgAA5gYAAPQHAAD1BwAA+gcAAPoHAAAaCAAAGggAACQIAAAkCAAAKAgAACgIAADJCAAAyQgAAHEJAABxCQAARg4AAEYOAADGDgAAxg4AAPwQAAD8EAAA1xcAANcXAABDGAAAQxgAAKcaAACnGgAAeBwAAH0cAAAsHQAAah0AAHgdAAB4HQAAmx0AAL8dAABxIAAAcSAAAH8gAAB/IAAAkCAAAJwgAAB8LAAAfSwAAG8tAABvLQAALy4AAC8uAAAFMAAABTAAADEwAAA1MAAAOzAAADswAACdMAAAnjAAAPwwAAD+MAAAFaAAABWgAAD4pAAA/aQAAAymAAAMpgAAf6YAAH+mAACcpgAAnaYAABenAAAfpwAAcKcAAHCnAACIpwAAiKcAAPKnAAD0pwAA+KcAAPmnAADPqQAAz6kAAOapAADmqQAAcKoAAHCqAADdqgAA3aoAAPOqAAD0qgAAXKsAAF+rAABpqwAAaasAAHD/AABw/wAAnv8AAJ//AACABwEAhQcBAIcHAQCwBwEAsgcBALoHAQBAawEAQ2sBAJNvAQCfbwEA4G8BAOFvAQDjbwEA428BAPCvAQDzrwEA9a8BAPuvAQD9rwEA/q8BADDgAQBt4AEAN+EBAD3hAQDr5AEA6+QBAEvpAQBL6QEAXgAAAF4AAABgAAAAYAAAAKgAAACoAAAArwAAAK8AAAC0AAAAtAAAALgAAAC4AAAAwgIAAMUCAADSAgAA3wIAAOUCAADrAgAA7QIAAO0CAADvAgAA/wIAAHUDAAB1AwAAhAMAAIUDAACICAAAiAgAAL0fAAC9HwAAvx8AAMEfAADNHwAAzx8AAN0fAADfHwAA7R8AAO8fAAD9HwAA/h8AAJswAACcMAAAAKcAABanAAAgpwAAIacAAImnAACKpwAAW6sAAFurAABqqwAAa6sAALL7AADC+wAAPv8AAD7/AABA/wAAQP8AAOP/AADj/wAA+/MBAP/zAQAAAwAAbwMAAIMEAACHBAAAkQUAAL0FAAC/BQAAvwUAAMEFAADCBQAAxAUAAMUFAADHBQAAxwUAABAGAAAaBgAASwYAAF8GAABwBgAAcAYAANYGAADcBgAA3wYAAOQGAADnBgAA6AYAAOoGAADtBgAAEQcAABEHAAAwBwAASgcAAKYHAACwBwAA6wcAAPMHAAD9BwAA/QcAABYIAAAZCAAAGwgAACMIAAAlCAAAJwgAACkIAAAtCAAAWQgAAFsIAACYCAAAnwgAAMoIAADhCAAA4wgAAAIJAAA6CQAAOgkAADwJAAA8CQAAQQkAAEgJAABNCQAATQkAAFEJAABXCQAAYgkAAGMJAACBCQAAgQkAALwJAAC8CQAAwQkAAMQJAADNCQAAzQkAAOIJAADjCQAA/gkAAP4JAAABCgAAAgoAADwKAAA8CgAAQQoAAEIKAABHCgAASAoAAEsKAABNCgAAUQoAAFEKAABwCgAAcQoAAHUKAAB1CgAAgQoAAIIKAAC8CgAAvAoAAMEKAADFCgAAxwoAAMgKAADNCgAAzQoAAOIKAADjCgAA+goAAP8KAAABCwAAAQsAADwLAAA8CwAAPwsAAD8LAABBCwAARAsAAE0LAABNCwAAVQsAAFYLAABiCwAAYwsAAIILAACCCwAAwAsAAMALAADNCwAAzQsAAAAMAAAADAAABAwAAAQMAAA8DAAAPAwAAD4MAABADAAARgwAAEgMAABKDAAATQwAAFUMAABWDAAAYgwAAGMMAACBDAAAgQwAALwMAAC8DAAAvwwAAL8MAADGDAAAxgwAAMwMAADNDAAA4gwAAOMMAAAADQAAAQ0AADsNAAA8DQAAQQ0AAEQNAABNDQAATQ0AAGINAABjDQAAgQ0AAIENAADKDQAAyg0AANINAADUDQAA1g0AANYNAAAxDgAAMQ4AADQOAAA6DgAARw4AAE4OAACxDgAAsQ4AALQOAAC8DgAAyA4AAM4OAAAYDwAAGQ8AADUPAAA1DwAANw8AADcPAAA5DwAAOQ8AAHEPAAB+DwAAgA8AAIQPAACGDwAAhw8AAI0PAACXDwAAmQ8AALwPAADGDwAAxg8AAC0QAAAwEAAAMhAAADcQAAA5EAAAOhAAAD0QAAA+EAAAWBAAAFkQAABeEAAAYBAAAHEQAAB0EAAAghAAAIIQAACFEAAAhhAAAI0QAACNEAAAnRAAAJ0QAABdEwAAXxMAABIXAAAUFwAAMhcAADMXAABSFwAAUxcAAHIXAABzFwAAtBcAALUXAAC3FwAAvRcAAMYXAADGFwAAyRcAANMXAADdFwAA3RcAAAsYAAANGAAADxgAAA8YAACFGAAAhhgAAKkYAACpGAAAIBkAACIZAAAnGQAAKBkAADIZAAAyGQAAORkAADsZAAAXGgAAGBoAABsaAAAbGgAAVhoAAFYaAABYGgAAXhoAAGAaAABgGgAAYhoAAGIaAABlGgAAbBoAAHMaAAB8GgAAfxoAAH8aAACwGgAAvRoAAL8aAADOGgAAABsAAAMbAAA0GwAANBsAADYbAAA6GwAAPBsAADwbAABCGwAAQhsAAGsbAABzGwAAgBsAAIEbAACiGwAApRsAAKgbAACpGwAAqxsAAK0bAADmGwAA5hsAAOgbAADpGwAA7RsAAO0bAADvGwAA8RsAACwcAAAzHAAANhwAADccAADQHAAA0hwAANQcAADgHAAA4hwAAOgcAADtHAAA7RwAAPQcAAD0HAAA+BwAAPkcAADAHQAA/x0AANAgAADcIAAA4SAAAOEgAADlIAAA8CAAAO8sAADxLAAAfy0AAH8tAADgLQAA/y0AACowAAAtMAAAmTAAAJowAABvpgAAb6YAAHSmAAB9pgAAnqYAAJ+mAADwpgAA8aYAAAKoAAACqAAABqgAAAaoAAALqAAAC6gAACWoAAAmqAAALKgAACyoAADEqAAAxagAAOCoAADxqAAA/6gAAP+oAAAmqQAALakAAEepAABRqQAAgKkAAIKpAACzqQAAs6kAALapAAC5qQAAvKkAAL2pAADlqQAA5akAACmqAAAuqgAAMaoAADKqAAA1qgAANqoAAEOqAABDqgAATKoAAEyqAAB8qgAAfKoAALCqAACwqgAAsqoAALSqAAC3qgAAuKoAAL6qAAC/qgAAwaoAAMGqAADsqgAA7aoAAPaqAAD2qgAA5asAAOWrAADoqwAA6KsAAO2rAADtqwAAHvsAAB77AAAA/gAAD/4AACD+AAAv/gAA/QEBAP0BAQDgAgEA4AIBAHYDAQB6AwEAAQoBAAMKAQAFCgEABgoBAAwKAQAPCgEAOAoBADoKAQA/CgEAPwoBAOUKAQDmCgEAJA0BACcNAQCrDgEArA4BAP0OAQD/DgEARg8BAFAPAQCCDwEAhQ8BAAEQAQABEAEAOBABAEYQAQBwEAEAcBABAHMQAQB0EAEAfxABAIEQAQCzEAEAthABALkQAQC6EAEAwhABAMIQAQAAEQEAAhEBACcRAQArEQEALREBADQRAQBzEQEAcxEBAIARAQCBEQEAthEBAL4RAQDJEQEAzBEBAM8RAQDPEQEALxIBADESAQA0EgEANBIBADYSAQA3EgEAPhIBAD4SAQBBEgEAQRIBAN8SAQDfEgEA4xIBAOoSAQAAEwEAARMBADsTAQA8EwEAQBMBAEATAQBmEwEAbBMBAHATAQB0EwEAOBQBAD8UAQBCFAEARBQBAEYUAQBGFAEAXhQBAF4UAQCzFAEAuBQBALoUAQC6FAEAvxQBAMAUAQDCFAEAwxQBALIVAQC1FQEAvBUBAL0VAQC/FQEAwBUBANwVAQDdFQEAMxYBADoWAQA9FgEAPRYBAD8WAQBAFgEAqxYBAKsWAQCtFgEArRYBALAWAQC1FgEAtxYBALcWAQAdFwEAHxcBACIXAQAlFwEAJxcBACsXAQAvGAEANxgBADkYAQA6GAEAOxkBADwZAQA+GQEAPhkBAEMZAQBDGQEA1BkBANcZAQDaGQEA2xkBAOAZAQDgGQEAARoBAAoaAQAzGgEAOBoBADsaAQA+GgEARxoBAEcaAQBRGgEAVhoBAFkaAQBbGgEAihoBAJYaAQCYGgEAmRoBADAcAQA2HAEAOBwBAD0cAQA/HAEAPxwBAJIcAQCnHAEAqhwBALAcAQCyHAEAsxwBALUcAQC2HAEAMR0BADYdAQA6HQEAOh0BADwdAQA9HQEAPx0BAEUdAQBHHQEARx0BAJAdAQCRHQEAlR0BAJUdAQCXHQEAlx0BAPMeAQD0HgEAAB8BAAEfAQA2HwEAOh8BAEAfAQBAHwEAQh8BAEIfAQBANAEAQDQBAEc0AQBVNAEA8GoBAPRqAQAwawEANmsBAE9vAQBPbwEAj28BAJJvAQDkbwEA5G8BAJ28AQCevAEAAM8BAC3PAQAwzwEARs8BAGfRAQBp0QEAe9EBAILRAQCF0QEAi9EBAKrRAQCt0QEAQtIBAETSAQAA2gEANtoBADvaAQBs2gEAddoBAHXaAQCE2gEAhNoBAJvaAQCf2gEAodoBAK/aAQAA4AEABuABAAjgAQAY4AEAG+ABACHgAQAj4AEAJOABACbgAQAq4AEAj+ABAI/gAQAw4QEANuEBAK7iAQCu4gEA7OIBAO/iAQDs5AEA7+QBANDoAQDW6AEAROkBAErpAQAAAQ4A7wEOADAAAAA5AAAAsgAAALMAAAC5AAAAuQAAALwAAAC+AAAAYAYAAGkGAADwBgAA+QYAAMAHAADJBwAAZgkAAG8JAADmCQAA7wkAAPQJAAD5CQAAZgoAAG8KAADmCgAA7woAAGYLAABvCwAAcgsAAHcLAADmCwAA8gsAAGYMAABvDAAAeAwAAH4MAADmDAAA7wwAAFgNAABeDQAAZg0AAHgNAADmDQAA7w0AAFAOAABZDgAA0A4AANkOAAAgDwAAMw8AAEAQAABJEAAAkBAAAJkQAABpEwAAfBMAAO4WAADwFgAA4BcAAOkXAADwFwAA+RcAABAYAAAZGAAARhkAAE8ZAADQGQAA2hkAAIAaAACJGgAAkBoAAJkaAABQGwAAWRsAALAbAAC5GwAAQBwAAEkcAABQHAAAWRwAAHAgAABwIAAAdCAAAHkgAACAIAAAiSAAAFAhAACCIQAAhSEAAIkhAABgJAAAmyQAAOokAAD/JAAAdicAAJMnAAD9LAAA/SwAAAcwAAAHMAAAITAAACkwAAA4MAAAOjAAAJIxAACVMQAAIDIAACkyAABIMgAATzIAAFEyAABfMgAAgDIAAIkyAACxMgAAvzIAACCmAAAppgAA5qYAAO+mAAAwqAAANagAANCoAADZqAAAAKkAAAmpAADQqQAA2akAAPCpAAD5qQAAUKoAAFmqAADwqwAA+asAABD/AAAZ/wAABwEBADMBAQBAAQEAeAEBAIoBAQCLAQEA4QIBAPsCAQAgAwEAIwMBAEEDAQBBAwEASgMBAEoDAQDRAwEA1QMBAKAEAQCpBAEAWAgBAF8IAQB5CAEAfwgBAKcIAQCvCAEA+wgBAP8IAQAWCQEAGwkBALwJAQC9CQEAwAkBAM8JAQDSCQEA/wkBAEAKAQBICgEAfQoBAH4KAQCdCgEAnwoBAOsKAQDvCgEAWAsBAF8LAQB4CwEAfwsBAKkLAQCvCwEA+gwBAP8MAQAwDQEAOQ0BAGAOAQB+DgEAHQ8BACYPAQBRDwEAVA8BAMUPAQDLDwEAUhABAG8QAQDwEAEA+RABADYRAQA/EQEA0BEBANkRAQDhEQEA9BEBAPASAQD5EgEAUBQBAFkUAQDQFAEA2RQBAFAWAQBZFgEAwBYBAMkWAQAwFwEAOxcBAOAYAQDyGAEAUBkBAFkZAQBQHAEAbBwBAFAdAQBZHQEAoB0BAKkdAQBQHwEAWR8BAMAfAQDUHwEAACQBAG4kAQBgagEAaWoBAMBqAQDJagEAUGsBAFlrAQBbawEAYWsBAIBuAQCWbgEAwNIBANPSAQDg0gEA89IBAGDTAQB40wEAztcBAP/XAQBA4QEASeEBAPDiAQD54gEA8OQBAPnkAQDH6AEAz+gBAFDpAQBZ6QEAcewBAKvsAQCt7AEAr+wBALHsAQC07AEAAe0BAC3tAQAv7QEAPe0BAADxAQAM8QEA8PsBAPn7AQAoAAAAKAAAAFsAAABbAAAAewAAAHsAAAA6DwAAOg8AADwPAAA8DwAAmxYAAJsWAAAaIAAAGiAAAB4gAAAeIAAARSAAAEUgAAB9IAAAfSAAAI0gAACNIAAACCMAAAgjAAAKIwAACiMAACkjAAApIwAAaCcAAGgnAABqJwAAaicAAGwnAABsJwAAbicAAG4nAABwJwAAcCcAAHInAAByJwAAdCcAAHQnAADFJwAAxScAAOYnAADmJwAA6CcAAOgnAADqJwAA6icAAOwnAADsJwAA7icAAO4nAACDKQAAgykAAIUpAACFKQAAhykAAIcpAACJKQAAiSkAAIspAACLKQAAjSkAAI0pAACPKQAAjykAAJEpAACRKQAAkykAAJMpAACVKQAAlSkAAJcpAACXKQAA2CkAANgpAADaKQAA2ikAAPwpAAD8KQAAIi4AACIuAAAkLgAAJC4AACYuAAAmLgAAKC4AACguAABCLgAAQi4AAFUuAABVLgAAVy4AAFcuAABZLgAAWS4AAFsuAABbLgAACDAAAAgwAAAKMAAACjAAAAwwAAAMMAAADjAAAA4wAAAQMAAAEDAAABQwAAAUMAAAFjAAABYwAAAYMAAAGDAAABowAAAaMAAAHTAAAB0wAAA//QAAP/0AABf+AAAX/gAANf4AADX+AAA3/gAAN/4AADn+AAA5/gAAO/4AADv+AAA9/gAAPf4AAD/+AAA//gAAQf4AAEH+AABD/gAAQ/4AAEf+AABH/gAAWf4AAFn+AABb/gAAW/4AAF3+AABd/gAACP8AAAj/AAA7/wAAO/8AAFv/AABb/wAAX/8AAF//AABi/wAAYv8AAAAAAAAfAAAAfwAAAJ8AAACtAAAArQAAAHgDAAB5AwAAgAMAAIMDAACLAwAAiwMAAI0DAACNAwAAogMAAKIDAAAwBQAAMAUAAFcFAABYBQAAiwUAAIwFAACQBQAAkAUAAMgFAADPBQAA6wUAAO4FAAD1BQAABQYAABwGAAAcBgAA3QYAAN0GAAAOBwAADwcAAEsHAABMBwAAsgcAAL8HAAD7BwAA/AcAAC4IAAAvCAAAPwgAAD8IAABcCAAAXQgAAF8IAABfCAAAawgAAG8IAACPCAAAlwgAAOIIAADiCAAAhAkAAIQJAACNCQAAjgkAAJEJAACSCQAAqQkAAKkJAACxCQAAsQkAALMJAAC1CQAAugkAALsJAADFCQAAxgkAAMkJAADKCQAAzwkAANYJAADYCQAA2wkAAN4JAADeCQAA5AkAAOUJAAD/CQAAAAoAAAQKAAAECgAACwoAAA4KAAARCgAAEgoAACkKAAApCgAAMQoAADEKAAA0CgAANAoAADcKAAA3CgAAOgoAADsKAAA9CgAAPQoAAEMKAABGCgAASQoAAEoKAABOCgAAUAoAAFIKAABYCgAAXQoAAF0KAABfCgAAZQoAAHcKAACACgAAhAoAAIQKAACOCgAAjgoAAJIKAACSCgAAqQoAAKkKAACxCgAAsQoAALQKAAC0CgAAugoAALsKAADGCgAAxgoAAMoKAADKCgAAzgoAAM8KAADRCgAA3woAAOQKAADlCgAA8goAAPgKAAAACwAAAAsAAAQLAAAECwAADQsAAA4LAAARCwAAEgsAACkLAAApCwAAMQsAADELAAA0CwAANAsAADoLAAA7CwAARQsAAEYLAABJCwAASgsAAE4LAABUCwAAWAsAAFsLAABeCwAAXgsAAGQLAABlCwAAeAsAAIELAACECwAAhAsAAIsLAACNCwAAkQsAAJELAACWCwAAmAsAAJsLAACbCwAAnQsAAJ0LAACgCwAAogsAAKULAACnCwAAqwsAAK0LAAC6CwAAvQsAAMMLAADFCwAAyQsAAMkLAADOCwAAzwsAANELAADWCwAA2AsAAOULAAD7CwAA/wsAAA0MAAANDAAAEQwAABEMAAApDAAAKQwAADoMAAA7DAAARQwAAEUMAABJDAAASQwAAE4MAABUDAAAVwwAAFcMAABbDAAAXAwAAF4MAABfDAAAZAwAAGUMAABwDAAAdgwAAI0MAACNDAAAkQwAAJEMAACpDAAAqQwAALQMAAC0DAAAugwAALsMAADFDAAAxQwAAMkMAADJDAAAzgwAANQMAADXDAAA3AwAAN8MAADfDAAA5AwAAOUMAADwDAAA8AwAAPQMAAD/DAAADQ0AAA0NAAARDQAAEQ0AAEUNAABFDQAASQ0AAEkNAABQDQAAUw0AAGQNAABlDQAAgA0AAIANAACEDQAAhA0AAJcNAACZDQAAsg0AALINAAC8DQAAvA0AAL4NAAC/DQAAxw0AAMkNAADLDQAAzg0AANUNAADVDQAA1w0AANcNAADgDQAA5Q0AAPANAADxDQAA9Q0AAAAOAAA7DgAAPg4AAFwOAACADgAAgw4AAIMOAACFDgAAhQ4AAIsOAACLDgAApA4AAKQOAACmDgAApg4AAL4OAAC/DgAAxQ4AAMUOAADHDgAAxw4AAM8OAADPDgAA2g4AANsOAADgDgAA/w4AAEgPAABIDwAAbQ8AAHAPAACYDwAAmA8AAL0PAAC9DwAAzQ8AAM0PAADbDwAA/w8AAMYQAADGEAAAyBAAAMwQAADOEAAAzxAAAEkSAABJEgAAThIAAE8SAABXEgAAVxIAAFkSAABZEgAAXhIAAF8SAACJEgAAiRIAAI4SAACPEgAAsRIAALESAAC2EgAAtxIAAL8SAAC/EgAAwRIAAMESAADGEgAAxxIAANcSAADXEgAAERMAABETAAAWEwAAFxMAAFsTAABcEwAAfRMAAH8TAACaEwAAnxMAAPYTAAD3EwAA/hMAAP8TAACdFgAAnxYAAPkWAAD/FgAAFhcAAB4XAAA3FwAAPxcAAFQXAABfFwAAbRcAAG0XAABxFwAAcRcAAHQXAAB/FwAA3hcAAN8XAADqFwAA7xcAAPoXAAD/FwAADhgAAA4YAAAaGAAAHxgAAHkYAAB/GAAAqxgAAK8YAAD2GAAA/xgAAB8ZAAAfGQAALBkAAC8ZAAA8GQAAPxkAAEEZAABDGQAAbhkAAG8ZAAB1GQAAfxkAAKwZAACvGQAAyhkAAM8ZAADbGQAA3RkAABwaAAAdGgAAXxoAAF8aAAB9GgAAfhoAAIoaAACPGgAAmhoAAJ8aAACuGgAArxoAAM8aAAD/GgAATRsAAE8bAAB/GwAAfxsAAPQbAAD7GwAAOBwAADocAABKHAAATBwAAIkcAACPHAAAuxwAALwcAADIHAAAzxwAAPscAAD/HAAAFh8AABcfAAAeHwAAHx8AAEYfAABHHwAATh8AAE8fAABYHwAAWB8AAFofAABaHwAAXB8AAFwfAABeHwAAXh8AAH4fAAB/HwAAtR8AALUfAADFHwAAxR8AANQfAADVHwAA3B8AANwfAADwHwAA8R8AAPUfAAD1HwAA/x8AAP8fAAALIAAADyAAACogAAAuIAAAYCAAAG8gAAByIAAAcyAAAI8gAACPIAAAnSAAAJ8gAADBIAAAzyAAAPEgAAD/IAAAjCEAAI8hAAAnJAAAPyQAAEskAABfJAAAdCsAAHUrAACWKwAAlisAAPQsAAD4LAAAJi0AACYtAAAoLQAALC0AAC4tAAAvLQAAaC0AAG4tAABxLQAAfi0AAJctAACfLQAApy0AAKctAACvLQAAry0AALctAAC3LQAAvy0AAL8tAADHLQAAxy0AAM8tAADPLQAA1y0AANctAADfLQAA3y0AAF4uAAB/LgAAmi4AAJouAAD0LgAA/y4AANYvAADvLwAA/C8AAP8vAABAMAAAQDAAAJcwAACYMAAAADEAAAQxAAAwMQAAMDEAAI8xAACPMQAA5DEAAO8xAAAfMgAAHzIAAI2kAACPpAAAx6QAAM+kAAAspgAAP6YAAPimAAD/pgAAy6cAAM+nAADSpwAA0qcAANSnAADUpwAA2qcAAPGnAAAtqAAAL6gAADqoAAA/qAAAeKgAAH+oAADGqAAAzagAANqoAADfqAAAVKkAAF6pAAB9qQAAf6kAAM6pAADOqQAA2qkAAN2pAAD/qQAA/6kAADeqAAA/qgAATqoAAE+qAABaqgAAW6oAAMOqAADaqgAA96oAAACrAAAHqwAACKsAAA+rAAAQqwAAF6sAAB+rAAAnqwAAJ6sAAC+rAAAvqwAAbKsAAG+rAADuqwAA76sAAPqrAAD/qwAApNcAAK/XAADH1wAAytcAAPzXAAD/+AAAbvoAAG/6AADa+gAA//oAAAf7AAAS+wAAGPsAABz7AAA3+wAAN/sAAD37AAA9+wAAP/sAAD/7AABC+wAAQvsAAEX7AABF+wAAw/sAANL7AACQ/QAAkf0AAMj9AADO/QAA0P0AAO/9AAAa/gAAH/4AAFP+AABT/gAAZ/4AAGf+AABs/gAAb/4AAHX+AAB1/gAA/f4AAAD/AAC//wAAwf8AAMj/AADJ/wAA0P8AANH/AADY/wAA2f8AAN3/AADf/wAA5/8AAOf/AADv/wAA+/8AAP7/AAD//wAADAABAAwAAQAnAAEAJwABADsAAQA7AAEAPgABAD4AAQBOAAEATwABAF4AAQB/AAEA+wABAP8AAQADAQEABgEBADQBAQA2AQEAjwEBAI8BAQCdAQEAnwEBAKEBAQDPAQEA/gEBAH8CAQCdAgEAnwIBANECAQDfAgEA/AIBAP8CAQAkAwEALAMBAEsDAQBPAwEAewMBAH8DAQCeAwEAngMBAMQDAQDHAwEA1gMBAP8DAQCeBAEAnwQBAKoEAQCvBAEA1AQBANcEAQD8BAEA/wQBACgFAQAvBQEAZAUBAG4FAQB7BQEAewUBAIsFAQCLBQEAkwUBAJMFAQCWBQEAlgUBAKIFAQCiBQEAsgUBALIFAQC6BQEAugUBAL0FAQD/BQEANwcBAD8HAQBWBwEAXwcBAGgHAQB/BwEAhgcBAIYHAQCxBwEAsQcBALsHAQD/BwEABggBAAcIAQAJCAEACQgBADYIAQA2CAEAOQgBADsIAQA9CAEAPggBAFYIAQBWCAEAnwgBAKYIAQCwCAEA3wgBAPMIAQDzCAEA9ggBAPoIAQAcCQEAHgkBADoJAQA+CQEAQAkBAH8JAQC4CQEAuwkBANAJAQDRCQEABAoBAAQKAQAHCgEACwoBABQKAQAUCgEAGAoBABgKAQA2CgEANwoBADsKAQA+CgEASQoBAE8KAQBZCgEAXwoBAKAKAQC/CgEA5woBAOoKAQD3CgEA/woBADYLAQA4CwEAVgsBAFcLAQBzCwEAdwsBAJILAQCYCwEAnQsBAKgLAQCwCwEA/wsBAEkMAQB/DAEAswwBAL8MAQDzDAEA+QwBACgNAQAvDQEAOg0BAF8OAQB/DgEAfw4BAKoOAQCqDgEArg4BAK8OAQCyDgEA/A4BACgPAQAvDwEAWg8BAG8PAQCKDwEArw8BAMwPAQDfDwEA9w8BAP8PAQBOEAEAURABAHYQAQB+EAEAvRABAL0QAQDDEAEAzxABAOkQAQDvEAEA+hABAP8QAQA1EQEANREBAEgRAQBPEQEAdxEBAH8RAQDgEQEA4BEBAPURAQD/EQEAEhIBABISAQBCEgEAfxIBAIcSAQCHEgEAiRIBAIkSAQCOEgEAjhIBAJ4SAQCeEgEAqhIBAK8SAQDrEgEA7xIBAPoSAQD/EgEABBMBAAQTAQANEwEADhMBABETAQASEwEAKRMBACkTAQAxEwEAMRMBADQTAQA0EwEAOhMBADoTAQBFEwEARhMBAEkTAQBKEwEAThMBAE8TAQBREwEAVhMBAFgTAQBcEwEAZBMBAGUTAQBtEwEAbxMBAHUTAQD/EwEAXBQBAFwUAQBiFAEAfxQBAMgUAQDPFAEA2hQBAH8VAQC2FQEAtxUBAN4VAQD/FQEARRYBAE8WAQBaFgEAXxYBAG0WAQB/FgEAuhYBAL8WAQDKFgEA/xYBABsXAQAcFwEALBcBAC8XAQBHFwEA/xcBADwYAQCfGAEA8xgBAP4YAQAHGQEACBkBAAoZAQALGQEAFBkBABQZAQAXGQEAFxkBADYZAQA2GQEAORkBADoZAQBHGQEATxkBAFoZAQCfGQEAqBkBAKkZAQDYGQEA2RkBAOUZAQD/GQEASBoBAE8aAQCjGgEArxoBAPkaAQD/GgEAChsBAP8bAQAJHAEACRwBADccAQA3HAEARhwBAE8cAQBtHAEAbxwBAJAcAQCRHAEAqBwBAKgcAQC3HAEA/xwBAAcdAQAHHQEACh0BAAodAQA3HQEAOR0BADsdAQA7HQEAPh0BAD4dAQBIHQEATx0BAFodAQBfHQEAZh0BAGYdAQBpHQEAaR0BAI8dAQCPHQEAkh0BAJIdAQCZHQEAnx0BAKodAQDfHgEA+R4BAP8eAQARHwEAER8BADsfAQA9HwEAWh8BAK8fAQCxHwEAvx8BAPIfAQD+HwEAmiMBAP8jAQBvJAEAbyQBAHUkAQB/JAEARCUBAI8vAQDzLwEA/y8BADA0AQA/NAEAVjQBAP9DAQBHRgEA/2cBADlqAQA/agEAX2oBAF9qAQBqagEAbWoBAL9qAQC/agEAymoBAM9qAQDuagEA72oBAPZqAQD/agEARmsBAE9rAQBaawEAWmsBAGJrAQBiawEAeGsBAHxrAQCQawEAP24BAJtuAQD/bgEAS28BAE5vAQCIbwEAjm8BAKBvAQDfbwEA5W8BAO9vAQDybwEA/28BAPiHAQD/hwEA1owBAP+MAQAJjQEA768BAPSvAQD0rwEA/K8BAPyvAQD/rwEA/68BACOxAQAxsQEAM7EBAE+xAQBTsQEAVLEBAFaxAQBjsQEAaLEBAG+xAQD8sgEA/7sBAGu8AQBvvAEAfbwBAH+8AQCJvAEAj7wBAJq8AQCbvAEAoLwBAP/OAQAuzwEAL88BAEfPAQBPzwEAxM8BAP/PAQD20AEA/9ABACfRAQAo0QEAc9EBAHrRAQDr0QEA/9EBAEbSAQC/0gEA1NIBAN/SAQD00gEA/9IBAFfTAQBf0wEAedMBAP/TAQBV1AEAVdQBAJ3UAQCd1AEAoNQBAKHUAQCj1AEApNQBAKfUAQCo1AEArdQBAK3UAQC61AEAutQBALzUAQC81AEAxNQBAMTUAQAG1QEABtUBAAvVAQAM1QEAFdUBABXVAQAd1QEAHdUBADrVAQA61QEAP9UBAD/VAQBF1QEARdUBAEfVAQBJ1QEAUdUBAFHVAQCm1gEAp9YBAMzXAQDN1wEAjNoBAJraAQCg2gEAoNoBALDaAQD/3gEAH98BACTfAQAr3wEA/98BAAfgAQAH4AEAGeABABrgAQAi4AEAIuABACXgAQAl4AEAK+ABAC/gAQBu4AEAjuABAJDgAQD/4AEALeEBAC/hAQA+4QEAP+EBAErhAQBN4QEAUOEBAI/iAQCv4gEAv+IBAPriAQD+4gEAAOMBAM/kAQD65AEA3+cBAOfnAQDn5wEA7OcBAOznAQDv5wEA7+cBAP/nAQD/5wEAxegBAMboAQDX6AEA/+gBAEzpAQBP6QEAWukBAF3pAQBg6QEAcOwBALXsAQAA7QEAPu0BAP/tAQAE7gEABO4BACDuAQAg7gEAI+4BACPuAQAl7gEAJu4BACjuAQAo7gEAM+4BADPuAQA47gEAOO4BADruAQA67gEAPO4BAEHuAQBD7gEARu4BAEjuAQBI7gEASu4BAEruAQBM7gEATO4BAFDuAQBQ7gEAU+4BAFPuAQBV7gEAVu4BAFjuAQBY7gEAWu4BAFruAQBc7gEAXO4BAF7uAQBe7gEAYO4BAGDuAQBj7gEAY+4BAGXuAQBm7gEAa+4BAGvuAQBz7gEAc+4BAHjuAQB47gEAfe4BAH3uAQB/7gEAf+4BAIruAQCK7gEAnO4BAKDuAQCk7gEApO4BAKruAQCq7gEAvO4BAO/uAQDy7gEA/+8BACzwAQAv8AEAlPABAJ/wAQCv8AEAsPABAMDwAQDA8AEA0PABANDwAQD28AEA//ABAK7xAQDl8QEAA/IBAA/yAQA88gEAP/IBAEnyAQBP8gEAUvIBAF/yAQBm8gEA//IBANj2AQDb9gEA7fYBAO/2AQD99gEA//YBAHf3AQB69wEA2vcBAN/3AQDs9wEA7/cBAPH3AQD/9wEADPgBAA/4AQBI+AEAT/gBAFr4AQBf+AEAiPgBAI/4AQCu+AEAr/gBALL4AQD/+AEAVPoBAF/6AQBu+gEAb/oBAH36AQB/+gEAifoBAI/6AQC++gEAvvoBAMb6AQDN+gEA3PoBAN/6AQDp+gEA7/oBAPn6AQD/+gEAk/sBAJP7AQDL+wEA7/sBAPr7AQD//wEA4KYCAP+mAgA6twIAP7cCAB64AgAfuAIAos4CAK/OAgDh6wIA//cCAB76AgD//wIASxMDAE8TAwCwIwMA/wAOAPABDgD//xAAqgAAAKoAAAC6AAAAugAAALsBAAC7AQAAwAEAAMMBAACUAgAAlAIAANAFAADqBQAA7wUAAPIFAAAgBgAAPwYAAEEGAABKBgAAbgYAAG8GAABxBgAA0wYAANUGAADVBgAA7gYAAO8GAAD6BgAA/AYAAP8GAAD/BgAAEAcAABAHAAASBwAALwcAAE0HAAClBwAAsQcAALEHAADKBwAA6gcAAAAIAAAVCAAAQAgAAFgIAABgCAAAaggAAHAIAACHCAAAiQgAAI4IAACgCAAAyAgAAAQJAAA5CQAAPQkAAD0JAABQCQAAUAkAAFgJAABhCQAAcgkAAIAJAACFCQAAjAkAAI8JAACQCQAAkwkAAKgJAACqCQAAsAkAALIJAACyCQAAtgkAALkJAAC9CQAAvQkAAM4JAADOCQAA3AkAAN0JAADfCQAA4QkAAPAJAADxCQAA/AkAAPwJAAAFCgAACgoAAA8KAAAQCgAAEwoAACgKAAAqCgAAMAoAADIKAAAzCgAANQoAADYKAAA4CgAAOQoAAFkKAABcCgAAXgoAAF4KAAByCgAAdAoAAIUKAACNCgAAjwoAAJEKAACTCgAAqAoAAKoKAACwCgAAsgoAALMKAAC1CgAAuQoAAL0KAAC9CgAA0AoAANAKAADgCgAA4QoAAPkKAAD5CgAABQsAAAwLAAAPCwAAEAsAABMLAAAoCwAAKgsAADALAAAyCwAAMwsAADULAAA5CwAAPQsAAD0LAABcCwAAXQsAAF8LAABhCwAAcQsAAHELAACDCwAAgwsAAIULAACKCwAAjgsAAJALAACSCwAAlQsAAJkLAACaCwAAnAsAAJwLAACeCwAAnwsAAKMLAACkCwAAqAsAAKoLAACuCwAAuQsAANALAADQCwAABQwAAAwMAAAODAAAEAwAABIMAAAoDAAAKgwAADkMAAA9DAAAPQwAAFgMAABaDAAAXQwAAF0MAABgDAAAYQwAAIAMAACADAAAhQwAAIwMAACODAAAkAwAAJIMAACoDAAAqgwAALMMAAC1DAAAuQwAAL0MAAC9DAAA3QwAAN4MAADgDAAA4QwAAPEMAADyDAAABA0AAAwNAAAODQAAEA0AABINAAA6DQAAPQ0AAD0NAABODQAATg0AAFQNAABWDQAAXw0AAGENAAB6DQAAfw0AAIUNAACWDQAAmg0AALENAACzDQAAuw0AAL0NAAC9DQAAwA0AAMYNAAABDgAAMA4AADIOAAAzDgAAQA4AAEUOAACBDgAAgg4AAIQOAACEDgAAhg4AAIoOAACMDgAAow4AAKUOAAClDgAApw4AALAOAACyDgAAsw4AAL0OAAC9DgAAwA4AAMQOAADcDgAA3w4AAAAPAAAADwAAQA8AAEcPAABJDwAAbA8AAIgPAACMDwAAABAAACoQAAA/EAAAPxAAAFAQAABVEAAAWhAAAF0QAABhEAAAYRAAAGUQAABmEAAAbhAAAHAQAAB1EAAAgRAAAI4QAACOEAAAABEAAEgSAABKEgAATRIAAFASAABWEgAAWBIAAFgSAABaEgAAXRIAAGASAACIEgAAihIAAI0SAACQEgAAsBIAALISAAC1EgAAuBIAAL4SAADAEgAAwBIAAMISAADFEgAAyBIAANYSAADYEgAAEBMAABITAAAVEwAAGBMAAFoTAACAEwAAjxMAAAEUAABsFgAAbxYAAH8WAACBFgAAmhYAAKAWAADqFgAA8RYAAPgWAAAAFwAAERcAAB8XAAAxFwAAQBcAAFEXAABgFwAAbBcAAG4XAABwFwAAgBcAALMXAADcFwAA3BcAACAYAABCGAAARBgAAHgYAACAGAAAhBgAAIcYAACoGAAAqhgAAKoYAACwGAAA9RgAAAAZAAAeGQAAUBkAAG0ZAABwGQAAdBkAAIAZAACrGQAAsBkAAMkZAAAAGgAAFhoAACAaAABUGgAABRsAADMbAABFGwAATBsAAIMbAACgGwAArhsAAK8bAAC6GwAA5RsAAAAcAAAjHAAATRwAAE8cAABaHAAAdxwAAOkcAADsHAAA7hwAAPMcAAD1HAAA9hwAAPocAAD6HAAANSEAADghAAAwLQAAZy0AAIAtAACWLQAAoC0AAKYtAACoLQAAri0AALAtAAC2LQAAuC0AAL4tAADALQAAxi0AAMgtAADOLQAA0C0AANYtAADYLQAA3i0AAAYwAAAGMAAAPDAAADwwAABBMAAAljAAAJ8wAACfMAAAoTAAAPowAAD/MAAA/zAAAAUxAAAvMQAAMTEAAI4xAACgMQAAvzEAAPAxAAD/MQAAADQAAL9NAAAATgAAFKAAABagAACMpAAA0KQAAPekAAAApQAAC6YAABCmAAAfpgAAKqYAACumAABupgAAbqYAAKCmAADlpgAAj6cAAI+nAAD3pwAA96cAAPunAAABqAAAA6gAAAWoAAAHqAAACqgAAAyoAAAiqAAAQKgAAHOoAACCqAAAs6gAAPKoAAD3qAAA+6gAAPuoAAD9qAAA/qgAAAqpAAAlqQAAMKkAAEapAABgqQAAfKkAAISpAACyqQAA4KkAAOSpAADnqQAA76kAAPqpAAD+qQAAAKoAACiqAABAqgAAQqoAAESqAABLqgAAYKoAAG+qAABxqgAAdqoAAHqqAAB6qgAAfqoAAK+qAACxqgAAsaoAALWqAAC2qgAAuaoAAL2qAADAqgAAwKoAAMKqAADCqgAA26oAANyqAADgqgAA6qoAAPKqAADyqgAAAasAAAarAAAJqwAADqsAABGrAAAWqwAAIKsAACarAAAoqwAALqsAAMCrAADiqwAAAKwAAKPXAACw1wAAxtcAAMvXAAD71wAAAPkAAG36AABw+gAA2foAAB37AAAd+wAAH/sAACj7AAAq+wAANvsAADj7AAA8+wAAPvsAAD77AABA+wAAQfsAAEP7AABE+wAARvsAALH7AADT+wAAPf0AAFD9AACP/QAAkv0AAMf9AADw/QAA+/0AAHD+AAB0/gAAdv4AAPz+AABm/wAAb/8AAHH/AACd/wAAoP8AAL7/AADC/wAAx/8AAMr/AADP/wAA0v8AANf/AADa/wAA3P8AAAAAAQALAAEADQABACYAAQAoAAEAOgABADwAAQA9AAEAPwABAE0AAQBQAAEAXQABAIAAAQD6AAEAgAIBAJwCAQCgAgEA0AIBAAADAQAfAwEALQMBAEADAQBCAwEASQMBAFADAQB1AwEAgAMBAJ0DAQCgAwEAwwMBAMgDAQDPAwEAUAQBAJ0EAQAABQEAJwUBADAFAQBjBQEAAAYBADYHAQBABwEAVQcBAGAHAQBnBwEAAAgBAAUIAQAICAEACAgBAAoIAQA1CAEANwgBADgIAQA8CAEAPAgBAD8IAQBVCAEAYAgBAHYIAQCACAEAnggBAOAIAQDyCAEA9AgBAPUIAQAACQEAFQkBACAJAQA5CQEAgAkBALcJAQC+CQEAvwkBAAAKAQAACgEAEAoBABMKAQAVCgEAFwoBABkKAQA1CgEAYAoBAHwKAQCACgEAnAoBAMAKAQDHCgEAyQoBAOQKAQAACwEANQsBAEALAQBVCwEAYAsBAHILAQCACwEAkQsBAAAMAQBIDAEAAA0BACMNAQCADgEAqQ4BALAOAQCxDgEAAA8BABwPAQAnDwEAJw8BADAPAQBFDwEAcA8BAIEPAQCwDwEAxA8BAOAPAQD2DwEAAxABADcQAQBxEAEAchABAHUQAQB1EAEAgxABAK8QAQDQEAEA6BABAAMRAQAmEQEARBEBAEQRAQBHEQEARxEBAFARAQByEQEAdhEBAHYRAQCDEQEAshEBAMERAQDEEQEA2hEBANoRAQDcEQEA3BEBAAASAQAREgEAExIBACsSAQA/EgEAQBIBAIASAQCGEgEAiBIBAIgSAQCKEgEAjRIBAI8SAQCdEgEAnxIBAKgSAQCwEgEA3hIBAAUTAQAMEwEADxMBABATAQATEwEAKBMBACoTAQAwEwEAMhMBADMTAQA1EwEAORMBAD0TAQA9EwEAUBMBAFATAQBdEwEAYRMBAAAUAQA0FAEARxQBAEoUAQBfFAEAYRQBAIAUAQCvFAEAxBQBAMUUAQDHFAEAxxQBAIAVAQCuFQEA2BUBANsVAQAAFgEALxYBAEQWAQBEFgEAgBYBAKoWAQC4FgEAuBYBAAAXAQAaFwEAQBcBAEYXAQAAGAEAKxgBAP8YAQAGGQEACRkBAAkZAQAMGQEAExkBABUZAQAWGQEAGBkBAC8ZAQA/GQEAPxkBAEEZAQBBGQEAoBkBAKcZAQCqGQEA0BkBAOEZAQDhGQEA4xkBAOMZAQAAGgEAABoBAAsaAQAyGgEAOhoBADoaAQBQGgEAUBoBAFwaAQCJGgEAnRoBAJ0aAQCwGgEA+BoBAAAcAQAIHAEAChwBAC4cAQBAHAEAQBwBAHIcAQCPHAEAAB0BAAYdAQAIHQEACR0BAAsdAQAwHQEARh0BAEYdAQBgHQEAZR0BAGcdAQBoHQEAah0BAIkdAQCYHQEAmB0BAOAeAQDyHgEAAh8BAAIfAQAEHwEAEB8BABIfAQAzHwEAsB8BALAfAQAAIAEAmSMBAIAkAQBDJQEAkC8BAPAvAQAAMAEALzQBAEE0AQBGNAEAAEQBAEZGAQAAaAEAOGoBAEBqAQBeagEAcGoBAL5qAQDQagEA7WoBAABrAQAvawEAY2sBAHdrAQB9awEAj2sBAABvAQBKbwEAUG8BAFBvAQAAcAEA94cBAACIAQDVjAEAAI0BAAiNAQAAsAEAIrEBADKxAQAysQEAULEBAFKxAQBVsQEAVbEBAGSxAQBnsQEAcLEBAPuyAQAAvAEAarwBAHC8AQB8vAEAgLwBAIi8AQCQvAEAmbwBAArfAQAK3wEAAOEBACzhAQBO4QEATuEBAJDiAQCt4gEAwOIBAOviAQDQ5AEA6uQBAODnAQDm5wEA6OcBAOvnAQDt5wEA7ucBAPDnAQD+5wEAAOgBAMToAQAA7gEAA+4BAAXuAQAf7gEAIe4BACLuAQAk7gEAJO4BACfuAQAn7gEAKe4BADLuAQA07gEAN+4BADnuAQA57gEAO+4BADvuAQBC7gEAQu4BAEfuAQBH7gEASe4BAEnuAQBL7gEAS+4BAE3uAQBP7gEAUe4BAFLuAQBU7gEAVO4BAFfuAQBX7gEAWe4BAFnuAQBb7gEAW+4BAF3uAQBd7gEAX+4BAF/uAQBh7gEAYu4BAGTuAQBk7gEAZ+4BAGruAQBs7gEAcu4BAHTuAQB37gEAee4BAHzuAQB+7gEAfu4BAIDuAQCJ7gEAi+4BAJvuAQCh7gEAo+4BAKXuAQCp7gEAq+4BALvuAQAAAAIA36YCAACnAgA5twIAQLcCAB24AgAguAIAoc4CALDOAgDg6wIAAPgCAB36AgAAAAMAShMDAFATAwCvIwMAsgAAALMAAAC5AAAAuQAAALwAAAC+AAAA9AkAAPkJAAByCwAAdwsAAPALAADyCwAAeAwAAH4MAABYDQAAXg0AAHANAAB4DQAAKg8AADMPAABpEwAAfBMAAPAXAAD5FwAA2hkAANoZAABwIAAAcCAAAHQgAAB5IAAAgCAAAIkgAABQIQAAXyEAAIkhAACJIQAAYCQAAJskAADqJAAA/yQAAHYnAACTJwAA/SwAAP0sAACSMQAAlTEAACAyAAApMgAASDIAAE8yAABRMgAAXzIAAIAyAACJMgAAsTIAAL8yAAAwqAAANagAAAcBAQAzAQEAdQEBAHgBAQCKAQEAiwEBAOECAQD7AgEAIAMBACMDAQBYCAEAXwgBAHkIAQB/CAEApwgBAK8IAQD7CAEA/wgBABYJAQAbCQEAvAkBAL0JAQDACQEAzwkBANIJAQD/CQEAQAoBAEgKAQB9CgEAfgoBAJ0KAQCfCgEA6woBAO8KAQBYCwEAXwsBAHgLAQB/CwEAqQsBAK8LAQD6DAEA/wwBAGAOAQB+DgEAHQ8BACYPAQBRDwEAVA8BAMUPAQDLDwEAUhABAGUQAQDhEQEA9BEBADoXAQA7FwEA6hgBAPIYAQBaHAEAbBwBAMAfAQDUHwEAW2sBAGFrAQCAbgEAlm4BAMDSAQDT0gEA4NIBAPPSAQBg0wEAeNMBAMfoAQDP6AEAcewBAKvsAQCt7AEAr+wBALHsAQC07AEAAe0BAC3tAQAv7QEAPe0BAADxAQAM8QEAIQAAACMAAAAlAAAAJwAAACoAAAAqAAAALAAAACwAAAAuAAAALwAAADoAAAA7AAAAPwAAAEAAAABcAAAAXAAAAKEAAAChAAAApwAAAKcAAAC2AAAAtwAAAL8AAAC/AAAAfgMAAH4DAACHAwAAhwMAAFoFAABfBQAAiQUAAIkFAADABQAAwAUAAMMFAADDBQAAxgUAAMYFAADzBQAA9AUAAAkGAAAKBgAADAYAAA0GAAAbBgAAGwYAAB0GAAAfBgAAagYAAG0GAADUBgAA1AYAAAAHAAANBwAA9wcAAPkHAAAwCAAAPggAAF4IAABeCAAAZAkAAGUJAABwCQAAcAkAAP0JAAD9CQAAdgoAAHYKAADwCgAA8AoAAHcMAAB3DAAAhAwAAIQMAAD0DQAA9A0AAE8OAABPDgAAWg4AAFsOAAAEDwAAEg8AABQPAAAUDwAAhQ8AAIUPAADQDwAA1A8AANkPAADaDwAAShAAAE8QAAD7EAAA+xAAAGATAABoEwAAbhYAAG4WAADrFgAA7RYAADUXAAA2FwAA1BcAANYXAADYFwAA2hcAAAAYAAAFGAAABxgAAAoYAABEGQAARRkAAB4aAAAfGgAAoBoAAKYaAACoGgAArRoAAFobAABgGwAAfRsAAH4bAAD8GwAA/xsAADscAAA/HAAAfhwAAH8cAADAHAAAxxwAANMcAADTHAAAFiAAABcgAAAgIAAAJyAAADAgAAA4IAAAOyAAAD4gAABBIAAAQyAAAEcgAABRIAAAUyAAAFMgAABVIAAAXiAAAPksAAD8LAAA/iwAAP8sAABwLQAAcC0AAAAuAAABLgAABi4AAAguAAALLgAACy4AAA4uAAAWLgAAGC4AABkuAAAbLgAAGy4AAB4uAAAfLgAAKi4AAC4uAAAwLgAAOS4AADwuAAA/LgAAQS4AAEEuAABDLgAATy4AAFIuAABULgAAATAAAAMwAAA9MAAAPTAAAPswAAD7MAAA/qQAAP+kAAANpgAAD6YAAHOmAABzpgAAfqYAAH6mAADypgAA96YAAHSoAAB3qAAAzqgAAM+oAAD4qAAA+qgAAPyoAAD8qAAALqkAAC+pAABfqQAAX6kAAMGpAADNqQAA3qkAAN+pAABcqgAAX6oAAN6qAADfqgAA8KoAAPGqAADrqwAA66sAABD+AAAW/gAAGf4AABn+AAAw/gAAMP4AAEX+AABG/gAASf4AAEz+AABQ/gAAUv4AAFT+AABX/gAAX/4AAGH+AABo/gAAaP4AAGr+AABr/gAAAf8AAAP/AAAF/wAAB/8AAAr/AAAK/wAADP8AAAz/AAAO/wAAD/8AABr/AAAb/wAAH/8AACD/AAA8/wAAPP8AAGH/AABh/wAAZP8AAGX/AAAAAQEAAgEBAJ8DAQCfAwEA0AMBANADAQBvBQEAbwUBAFcIAQBXCAEAHwkBAB8JAQA/CQEAPwkBAFAKAQBYCgEAfwoBAH8KAQDwCgEA9goBADkLAQA/CwEAmQsBAJwLAQBVDwEAWQ8BAIYPAQCJDwEARxABAE0QAQC7EAEAvBABAL4QAQDBEAEAQBEBAEMRAQB0EQEAdREBAMURAQDIEQEAzREBAM0RAQDbEQEA2xEBAN0RAQDfEQEAOBIBAD0SAQCpEgEAqRIBAEsUAQBPFAEAWhQBAFsUAQBdFAEAXRQBAMYUAQDGFAEAwRUBANcVAQBBFgEAQxYBAGAWAQBsFgEAuRYBALkWAQA8FwEAPhcBADsYAQA7GAEARBkBAEYZAQDiGQEA4hkBAD8aAQBGGgEAmhoBAJwaAQCeGgEAohoBAAAbAQAJGwEAQRwBAEUcAQBwHAEAcRwBAPceAQD4HgEAQx8BAE8fAQD/HwEA/x8BAHAkAQB0JAEA8S8BAPIvAQBuagEAb2oBAPVqAQD1agEAN2sBADtrAQBEawEARGsBAJduAQCabgEA4m8BAOJvAQCfvAEAn7wBAIfaAQCL2gEAXukBAF/pAQCmAAAApgAAAKkAAACpAAAArgAAAK4AAACwAAAAsAAAAIIEAACCBAAAjQUAAI4FAAAOBgAADwYAAN4GAADeBgAA6QYAAOkGAAD9BgAA/gYAAPYHAAD2BwAA+gkAAPoJAABwCwAAcAsAAPMLAAD4CwAA+gsAAPoLAAB/DAAAfwwAAE8NAABPDQAAeQ0AAHkNAAABDwAAAw8AABMPAAATDwAAFQ8AABcPAAAaDwAAHw8AADQPAAA0DwAANg8AADYPAAA4DwAAOA8AAL4PAADFDwAAxw8AAMwPAADODwAAzw8AANUPAADYDwAAnhAAAJ8QAACQEwAAmRMAAG0WAABtFgAAQBkAAEAZAADeGQAA/xkAAGEbAABqGwAAdBsAAHwbAAAAIQAAASEAAAMhAAAGIQAACCEAAAkhAAAUIQAAFCEAABYhAAAXIQAAHiEAACMhAAAlIQAAJSEAACchAAAnIQAAKSEAACkhAAAuIQAALiEAADohAAA7IQAASiEAAEohAABMIQAATSEAAE8hAABPIQAAiiEAAIshAACVIQAAmSEAAJwhAACfIQAAoSEAAKIhAACkIQAApSEAAKchAACtIQAAryEAAM0hAADQIQAA0SEAANMhAADTIQAA1SEAAPMhAAAAIwAAByMAAAwjAAAfIwAAIiMAACgjAAArIwAAeyMAAH0jAACaIwAAtCMAANsjAADiIwAAJiQAAEAkAABKJAAAnCQAAOkkAAAAJQAAtiUAALglAADAJQAAwiUAAPclAAAAJgAAbiYAAHAmAABnJwAAlCcAAL8nAAAAKAAA/ygAAAArAAAvKwAARSsAAEYrAABNKwAAcysAAHYrAACVKwAAlysAAP8rAADlLAAA6iwAAFAuAABRLgAAgC4AAJkuAACbLgAA8y4AAAAvAADVLwAA8C8AAPsvAAAEMAAABDAAABIwAAATMAAAIDAAACAwAAA2MAAANzAAAD4wAAA/MAAAkDEAAJExAACWMQAAnzEAAMAxAADjMQAAADIAAB4yAAAqMgAARzIAAFAyAABQMgAAYDIAAH8yAACKMgAAsDIAAMAyAAD/MwAAwE0AAP9NAACQpAAAxqQAACioAAArqAAANqgAADeoAAA5qAAAOagAAHeqAAB5qgAAQP0AAE/9AADP/QAAz/0AAP39AAD//QAA5P8AAOT/AADo/wAA6P8AAO3/AADu/wAA/P8AAP3/AAA3AQEAPwEBAHkBAQCJAQEAjAEBAI4BAQCQAQEAnAEBAKABAQCgAQEA0AEBAPwBAQB3CAEAeAgBAMgKAQDICgEAPxcBAD8XAQDVHwEA3B8BAOEfAQDxHwEAPGsBAD9rAQBFawEARWsBAJy8AQCcvAEAUM8BAMPPAQAA0AEA9dABAADRAQAm0QEAKdEBAGTRAQBq0QEAbNEBAIPRAQCE0QEAjNEBAKnRAQCu0QEA6tEBAADSAQBB0gEARdIBAEXSAQAA0wEAVtMBAADYAQD/2QEAN9oBADraAQBt2gEAdNoBAHbaAQCD2gEAhdoBAIbaAQBP4QEAT+EBAKzsAQCs7AEALu0BAC7tAQAA8AEAK/ABADDwAQCT8AEAoPABAK7wAQCx8AEAv/ABAMHwAQDP8AEA0fABAPXwAQAN8QEArfEBAObxAQAC8gEAEPIBADvyAQBA8gEASPIBAFDyAQBR8gEAYPIBAGXyAQAA8wEA+vMBAAD0AQDX9gEA3PYBAOz2AQDw9gEA/PYBAAD3AQB29wEAe/cBANn3AQDg9wEA6/cBAPD3AQDw9wEAAPgBAAv4AQAQ+AEAR/gBAFD4AQBZ+AEAYPgBAIf4AQCQ+AEArfgBALD4AQCx+AEAAPkBAFP6AQBg+gEAbfoBAHD6AQB8+gEAgPoBAIj6AQCQ+gEAvfoBAL/6AQDF+gEAzvoBANv6AQDg+gEA6PoBAPD6AQD4+gEAAPsBAJL7AQCU+wEAyvsBACkgAAApIAAAAOAAAP/4AAAAAA8A/f8PAAAAEAD9/xAAIQAAACMAAAAlAAAAKgAAACwAAAAvAAAAOgAAADsAAAA/AAAAQAAAAFsAAABdAAAAXwAAAF8AAAB7AAAAewAAAH0AAAB9AAAAoQAAAKEAAACnAAAApwAAAKsAAACrAAAAtgAAALcAAAC7AAAAuwAAAL8AAAC/AAAAfgMAAH4DAACHAwAAhwMAAFoFAABfBQAAiQUAAIoFAAC+BQAAvgUAAMAFAADABQAAwwUAAMMFAADGBQAAxgUAAPMFAAD0BQAACQYAAAoGAAAMBgAADQYAABsGAAAbBgAAHQYAAB8GAABqBgAAbQYAANQGAADUBgAAAAcAAA0HAAD3BwAA+QcAADAIAAA+CAAAXggAAF4IAABkCQAAZQkAAHAJAABwCQAA/QkAAP0JAAB2CgAAdgoAAPAKAADwCgAAdwwAAHcMAACEDAAAhAwAAPQNAAD0DQAATw4AAE8OAABaDgAAWw4AAAQPAAASDwAAFA8AABQPAAA6DwAAPQ8AAIUPAACFDwAA0A8AANQPAADZDwAA2g8AAEoQAABPEAAA+xAAAPsQAABgEwAAaBMAAAAUAAAAFAAAbhYAAG4WAACbFgAAnBYAAOsWAADtFgAANRcAADYXAADUFwAA1hcAANgXAADaFwAAABgAAAoYAABEGQAARRkAAB4aAAAfGgAAoBoAAKYaAACoGgAArRoAAFobAABgGwAAfRsAAH4bAAD8GwAA/xsAADscAAA/HAAAfhwAAH8cAADAHAAAxxwAANMcAADTHAAAECAAACcgAAAwIAAAQyAAAEUgAABRIAAAUyAAAF4gAAB9IAAAfiAAAI0gAACOIAAACCMAAAsjAAApIwAAKiMAAGgnAAB1JwAAxScAAMYnAADmJwAA7ycAAIMpAACYKQAA2CkAANspAAD8KQAA/SkAAPksAAD8LAAA/iwAAP8sAABwLQAAcC0AAAAuAAAuLgAAMC4AAE8uAABSLgAAXS4AAAEwAAADMAAACDAAABEwAAAUMAAAHzAAADAwAAAwMAAAPTAAAD0wAACgMAAAoDAAAPswAAD7MAAA/qQAAP+kAAANpgAAD6YAAHOmAABzpgAAfqYAAH6mAADypgAA96YAAHSoAAB3qAAAzqgAAM+oAAD4qAAA+qgAAPyoAAD8qAAALqkAAC+pAABfqQAAX6kAAMGpAADNqQAA3qkAAN+pAABcqgAAX6oAAN6qAADfqgAA8KoAAPGqAADrqwAA66sAAD79AAA//QAAEP4AABn+AAAw/gAAUv4AAFT+AABh/gAAY/4AAGP+AABo/gAAaP4AAGr+AABr/gAAAf8AAAP/AAAF/wAACv8AAAz/AAAP/wAAGv8AABv/AAAf/wAAIP8AADv/AAA9/wAAP/8AAD//AABb/wAAW/8AAF3/AABd/wAAX/8AAGX/AAAAAQEAAgEBAJ8DAQCfAwEA0AMBANADAQBvBQEAbwUBAFcIAQBXCAEAHwkBAB8JAQA/CQEAPwkBAFAKAQBYCgEAfwoBAH8KAQDwCgEA9goBADkLAQA/CwEAmQsBAJwLAQCtDgEArQ4BAFUPAQBZDwEAhg8BAIkPAQBHEAEATRABALsQAQC8EAEAvhABAMEQAQBAEQEAQxEBAHQRAQB1EQEAxREBAMgRAQDNEQEAzREBANsRAQDbEQEA3REBAN8RAQA4EgEAPRIBAKkSAQCpEgEASxQBAE8UAQBaFAEAWxQBAF0UAQBdFAEAxhQBAMYUAQDBFQEA1xUBAEEWAQBDFgEAYBYBAGwWAQC5FgEAuRYBADwXAQA+FwEAOxgBADsYAQBEGQEARhkBAOIZAQDiGQEAPxoBAEYaAQCaGgEAnBoBAJ4aAQCiGgEAABsBAAkbAQBBHAEARRwBAHAcAQBxHAEA9x4BAPgeAQBDHwEATx8BAP8fAQD/HwEAcCQBAHQkAQDxLwEA8i8BAG5qAQBvagEA9WoBAPVqAQA3awEAO2sBAERrAQBEawEAl24BAJpuAQDibwEA4m8BAJ+8AQCfvAEAh9oBAIvaAQBe6QEAX+kBACAAAAAgAAAAoAAAAKAAAACAFgAAgBYAAAAgAAAKIAAAKCAAACkgAAAvIAAALyAAAF8gAABfIAAAADAAAAAwAAAgAAAAIAAAAKAAAACgAAAAgBYAAIAWAAAAIAAACiAAAC8gAAAvIAAAXyAAAF8gAAAAMAAAADAAAAMJAAADCQAAOwkAADsJAAA+CQAAQAkAAEkJAABMCQAATgkAAE8JAACCCQAAgwkAAL4JAADACQAAxwkAAMgJAADLCQAAzAkAANcJAADXCQAAAwoAAAMKAAA+CgAAQAoAAIMKAACDCgAAvgoAAMAKAADJCgAAyQoAAMsKAADMCgAAAgsAAAMLAAA+CwAAPgsAAEALAABACwAARwsAAEgLAABLCwAATAsAAFcLAABXCwAAvgsAAL8LAADBCwAAwgsAAMYLAADICwAAygsAAMwLAADXCwAA1wsAAAEMAAADDAAAQQwAAEQMAACCDAAAgwwAAL4MAAC+DAAAwAwAAMQMAADHDAAAyAwAAMoMAADLDAAA1QwAANYMAADzDAAA8wwAAAINAAADDQAAPg0AAEANAABGDQAASA0AAEoNAABMDQAAVw0AAFcNAACCDQAAgw0AAM8NAADRDQAA2A0AAN8NAADyDQAA8w0AAD4PAAA/DwAAfw8AAH8PAAArEAAALBAAADEQAAAxEAAAOBAAADgQAAA7EAAAPBAAAFYQAABXEAAAYhAAAGQQAABnEAAAbRAAAIMQAACEEAAAhxAAAIwQAACPEAAAjxAAAJoQAACcEAAAFRcAABUXAAA0FwAANBcAALYXAAC2FwAAvhcAAMUXAADHFwAAyBcAACMZAAAmGQAAKRkAACsZAAAwGQAAMRkAADMZAAA4GQAAGRoAABoaAABVGgAAVRoAAFcaAABXGgAAYRoAAGEaAABjGgAAZBoAAG0aAAByGgAABBsAAAQbAAA1GwAANRsAADsbAAA7GwAAPRsAAEEbAABDGwAARBsAAIIbAACCGwAAoRsAAKEbAACmGwAApxsAAKobAACqGwAA5xsAAOcbAADqGwAA7BsAAO4bAADuGwAA8hsAAPMbAAAkHAAAKxwAADQcAAA1HAAA4RwAAOEcAAD3HAAA9xwAAC4wAAAvMAAAI6gAACSoAAAnqAAAJ6gAAICoAACBqAAAtKgAAMOoAABSqQAAU6kAAIOpAACDqQAAtKkAALWpAAC6qQAAu6kAAL6pAADAqQAAL6oAADCqAAAzqgAANKoAAE2qAABNqgAAe6oAAHuqAAB9qgAAfaoAAOuqAADrqgAA7qoAAO+qAAD1qgAA9aoAAOOrAADkqwAA5qsAAOerAADpqwAA6qsAAOyrAADsqwAAABABAAAQAQACEAEAAhABAIIQAQCCEAEAsBABALIQAQC3EAEAuBABACwRAQAsEQEARREBAEYRAQCCEQEAghEBALMRAQC1EQEAvxEBAMARAQDOEQEAzhEBACwSAQAuEgEAMhIBADMSAQA1EgEANRIBAOASAQDiEgEAAhMBAAMTAQA+EwEAPxMBAEETAQBEEwEARxMBAEgTAQBLEwEATRMBAFcTAQBXEwEAYhMBAGMTAQA1FAEANxQBAEAUAQBBFAEARRQBAEUUAQCwFAEAshQBALkUAQC5FAEAuxQBAL4UAQDBFAEAwRQBAK8VAQCxFQEAuBUBALsVAQC+FQEAvhUBADAWAQAyFgEAOxYBADwWAQA+FgEAPhYBAKwWAQCsFgEArhYBAK8WAQC2FgEAthYBACAXAQAhFwEAJhcBACYXAQAsGAEALhgBADgYAQA4GAEAMBkBADUZAQA3GQEAOBkBAD0ZAQA9GQEAQBkBAEAZAQBCGQEAQhkBANEZAQDTGQEA3BkBAN8ZAQDkGQEA5BkBADkaAQA5GgEAVxoBAFgaAQCXGgEAlxoBAC8cAQAvHAEAPhwBAD4cAQCpHAEAqRwBALEcAQCxHAEAtBwBALQcAQCKHQEAjh0BAJMdAQCUHQEAlh0BAJYdAQD1HgEA9h4BAAMfAQADHwEANB8BADUfAQA+HwEAPx8BAEEfAQBBHwEAUW8BAIdvAQDwbwEA8W8BAGXRAQBm0QEAbdEBAHLRAQAkAAAAJAAAACsAAAArAAAAPAAAAD4AAABeAAAAXgAAAGAAAABgAAAAfAAAAHwAAAB+AAAAfgAAAKIAAACmAAAAqAAAAKkAAACsAAAArAAAAK4AAACxAAAAtAAAALQAAAC4AAAAuAAAANcAAADXAAAA9wAAAPcAAADCAgAAxQIAANICAADfAgAA5QIAAOsCAADtAgAA7QIAAO8CAAD/AgAAdQMAAHUDAACEAwAAhQMAAPYDAAD2AwAAggQAAIIEAACNBQAAjwUAAAYGAAAIBgAACwYAAAsGAAAOBgAADwYAAN4GAADeBgAA6QYAAOkGAAD9BgAA/gYAAPYHAAD2BwAA/gcAAP8HAACICAAAiAgAAPIJAADzCQAA+gkAAPsJAADxCgAA8QoAAHALAABwCwAA8wsAAPoLAAB/DAAAfwwAAE8NAABPDQAAeQ0AAHkNAAA/DgAAPw4AAAEPAAADDwAAEw8AABMPAAAVDwAAFw8AABoPAAAfDwAANA8AADQPAAA2DwAANg8AADgPAAA4DwAAvg8AAMUPAADHDwAAzA8AAM4PAADPDwAA1Q8AANgPAACeEAAAnxAAAJATAACZEwAAbRYAAG0WAADbFwAA2xcAAEAZAABAGQAA3hkAAP8ZAABhGwAAahsAAHQbAAB8GwAAvR8AAL0fAAC/HwAAwR8AAM0fAADPHwAA3R8AAN8fAADtHwAA7x8AAP0fAAD+HwAARCAAAEQgAABSIAAAUiAAAHogAAB8IAAAiiAAAIwgAACgIAAAwCAAAAAhAAABIQAAAyEAAAYhAAAIIQAACSEAABQhAAAUIQAAFiEAABghAAAeIQAAIyEAACUhAAAlIQAAJyEAACchAAApIQAAKSEAAC4hAAAuIQAAOiEAADshAABAIQAARCEAAEohAABNIQAATyEAAE8hAACKIQAAiyEAAJAhAAAHIwAADCMAACgjAAArIwAAJiQAAEAkAABKJAAAnCQAAOkkAAAAJQAAZycAAJQnAADEJwAAxycAAOUnAADwJwAAgikAAJkpAADXKQAA3CkAAPspAAD+KQAAcysAAHYrAACVKwAAlysAAP8rAADlLAAA6iwAAFAuAABRLgAAgC4AAJkuAACbLgAA8y4AAAAvAADVLwAA8C8AAPsvAAAEMAAABDAAABIwAAATMAAAIDAAACAwAAA2MAAANzAAAD4wAAA/MAAAmzAAAJwwAACQMQAAkTEAAJYxAACfMQAAwDEAAOMxAAAAMgAAHjIAACoyAABHMgAAUDIAAFAyAABgMgAAfzIAAIoyAACwMgAAwDIAAP8zAADATQAA/00AAJCkAADGpAAAAKcAABanAAAgpwAAIacAAImnAACKpwAAKKgAACuoAAA2qAAAOagAAHeqAAB5qgAAW6sAAFurAABqqwAAa6sAACn7AAAp+wAAsvsAAML7AABA/QAAT/0AAM/9AADP/QAA/P0AAP/9AABi/gAAYv4AAGT+AABm/gAAaf4AAGn+AAAE/wAABP8AAAv/AAAL/wAAHP8AAB7/AAA+/wAAPv8AAED/AABA/wAAXP8AAFz/AABe/wAAXv8AAOD/AADm/wAA6P8AAO7/AAD8/wAA/f8AADcBAQA/AQEAeQEBAIkBAQCMAQEAjgEBAJABAQCcAQEAoAEBAKABAQDQAQEA/AEBAHcIAQB4CAEAyAoBAMgKAQA/FwEAPxcBANUfAQDxHwEAPGsBAD9rAQBFawEARWsBAJy8AQCcvAEAUM8BAMPPAQAA0AEA9dABAADRAQAm0QEAKdEBAGTRAQBq0QEAbNEBAIPRAQCE0QEAjNEBAKnRAQCu0QEA6tEBAADSAQBB0gEARdIBAEXSAQAA0wEAVtMBAMHWAQDB1gEA29YBANvWAQD71gEA+9YBABXXAQAV1wEANdcBADXXAQBP1wEAT9cBAG/XAQBv1wEAidcBAInXAQCp1wEAqdcBAMPXAQDD1wEAANgBAP/ZAQA32gEAOtoBAG3aAQB02gEAdtoBAIPaAQCF2gEAhtoBAE/hAQBP4QEA/+IBAP/iAQCs7AEArOwBALDsAQCw7AEALu0BAC7tAQDw7gEA8e4BAADwAQAr8AEAMPABAJPwAQCg8AEArvABALHwAQC/8AEAwfABAM/wAQDR8AEA9fABAA3xAQCt8QEA5vEBAALyAQAQ8gEAO/IBAEDyAQBI8gEAUPIBAFHyAQBg8gEAZfIBAADzAQDX9gEA3PYBAOz2AQDw9gEA/PYBAAD3AQB29wEAe/cBANn3AQDg9wEA6/cBAPD3AQDw9wEAAPgBAAv4AQAQ+AEAR/gBAFD4AQBZ+AEAYPgBAIf4AQCQ+AEArfgBALD4AQCx+AEAAPkBAFP6AQBg+gEAbfoBAHD6AQB8+gEAgPoBAIj6AQCQ+gEAvfoBAL/6AQDF+gEAzvoBANv6AQDg+gEA6PoBAPD6AQD4+gEAAPsBAJL7AQCU+wEAyvsBAMUBAADFAQAAyAEAAMgBAADLAQAAywEAAPIBAADyAQAAiB8AAI8fAACYHwAAnx8AAKgfAACvHwAAvB8AALwfAADMHwAAzB8AAPwfAAD8HwAAeAMAAHkDAACAAwAAgwMAAIsDAACLAwAAjQMAAI0DAACiAwAAogMAADAFAAAwBQAAVwUAAFgFAACLBQAAjAUAAJAFAACQBQAAyAUAAM8FAADrBQAA7gUAAPUFAAD/BQAADgcAAA4HAABLBwAATAcAALIHAAC/BwAA+wcAAPwHAAAuCAAALwgAAD8IAAA/CAAAXAgAAF0IAABfCAAAXwgAAGsIAABvCAAAjwgAAI8IAACSCAAAlwgAAIQJAACECQAAjQkAAI4JAACRCQAAkgkAAKkJAACpCQAAsQkAALEJAACzCQAAtQkAALoJAAC7CQAAxQkAAMYJAADJCQAAygkAAM8JAADWCQAA2AkAANsJAADeCQAA3gkAAOQJAADlCQAA/wkAAAAKAAAECgAABAoAAAsKAAAOCgAAEQoAABIKAAApCgAAKQoAADEKAAAxCgAANAoAADQKAAA3CgAANwoAADoKAAA7CgAAPQoAAD0KAABDCgAARgoAAEkKAABKCgAATgoAAFAKAABSCgAAWAoAAF0KAABdCgAAXwoAAGUKAAB3CgAAgAoAAIQKAACECgAAjgoAAI4KAACSCgAAkgoAAKkKAACpCgAAsQoAALEKAAC0CgAAtAoAALoKAAC7CgAAxgoAAMYKAADKCgAAygoAAM4KAADPCgAA0QoAAN8KAADkCgAA5QoAAPIKAAD4CgAAAAsAAAALAAAECwAABAsAAA0LAAAOCwAAEQsAABILAAApCwAAKQsAADELAAAxCwAANAsAADQLAAA6CwAAOwsAAEULAABGCwAASQsAAEoLAABOCwAAVAsAAFgLAABbCwAAXgsAAF4LAABkCwAAZQsAAHgLAACBCwAAhAsAAIQLAACLCwAAjQsAAJELAACRCwAAlgsAAJgLAACbCwAAmwsAAJ0LAACdCwAAoAsAAKILAAClCwAApwsAAKsLAACtCwAAugsAAL0LAADDCwAAxQsAAMkLAADJCwAAzgsAAM8LAADRCwAA1gsAANgLAADlCwAA+wsAAP8LAAANDAAADQwAABEMAAARDAAAKQwAACkMAAA6DAAAOwwAAEUMAABFDAAASQwAAEkMAABODAAAVAwAAFcMAABXDAAAWwwAAFwMAABeDAAAXwwAAGQMAABlDAAAcAwAAHYMAACNDAAAjQwAAJEMAACRDAAAqQwAAKkMAAC0DAAAtAwAALoMAAC7DAAAxQwAAMUMAADJDAAAyQwAAM4MAADUDAAA1wwAANwMAADfDAAA3wwAAOQMAADlDAAA8AwAAPAMAAD0DAAA/wwAAA0NAAANDQAAEQ0AABENAABFDQAARQ0AAEkNAABJDQAAUA0AAFMNAABkDQAAZQ0AAIANAACADQAAhA0AAIQNAACXDQAAmQ0AALINAACyDQAAvA0AALwNAAC+DQAAvw0AAMcNAADJDQAAyw0AAM4NAADVDQAA1Q0AANcNAADXDQAA4A0AAOUNAADwDQAA8Q0AAPUNAAAADgAAOw4AAD4OAABcDgAAgA4AAIMOAACDDgAAhQ4AAIUOAACLDgAAiw4AAKQOAACkDgAApg4AAKYOAAC+DgAAvw4AAMUOAADFDgAAxw4AAMcOAADPDgAAzw4AANoOAADbDgAA4A4AAP8OAABIDwAASA8AAG0PAABwDwAAmA8AAJgPAAC9DwAAvQ8AAM0PAADNDwAA2w8AAP8PAADGEAAAxhAAAMgQAADMEAAAzhAAAM8QAABJEgAASRIAAE4SAABPEgAAVxIAAFcSAABZEgAAWRIAAF4SAABfEgAAiRIAAIkSAACOEgAAjxIAALESAACxEgAAthIAALcSAAC/EgAAvxIAAMESAADBEgAAxhIAAMcSAADXEgAA1xIAABETAAAREwAAFhMAABcTAABbEwAAXBMAAH0TAAB/EwAAmhMAAJ8TAAD2EwAA9xMAAP4TAAD/EwAAnRYAAJ8WAAD5FgAA/xYAABYXAAAeFwAANxcAAD8XAABUFwAAXxcAAG0XAABtFwAAcRcAAHEXAAB0FwAAfxcAAN4XAADfFwAA6hcAAO8XAAD6FwAA/xcAABoYAAAfGAAAeRgAAH8YAACrGAAArxgAAPYYAAD/GAAAHxkAAB8ZAAAsGQAALxkAADwZAAA/GQAAQRkAAEMZAABuGQAAbxkAAHUZAAB/GQAArBkAAK8ZAADKGQAAzxkAANsZAADdGQAAHBoAAB0aAABfGgAAXxoAAH0aAAB+GgAAihoAAI8aAACaGgAAnxoAAK4aAACvGgAAzxoAAP8aAABNGwAATxsAAH8bAAB/GwAA9BsAAPsbAAA4HAAAOhwAAEocAABMHAAAiRwAAI8cAAC7HAAAvBwAAMgcAADPHAAA+xwAAP8cAAAWHwAAFx8AAB4fAAAfHwAARh8AAEcfAABOHwAATx8AAFgfAABYHwAAWh8AAFofAABcHwAAXB8AAF4fAABeHwAAfh8AAH8fAAC1HwAAtR8AAMUfAADFHwAA1B8AANUfAADcHwAA3B8AAPAfAADxHwAA9R8AAPUfAAD/HwAA/x8AAGUgAABlIAAAciAAAHMgAACPIAAAjyAAAJ0gAACfIAAAwSAAAM8gAADxIAAA/yAAAIwhAACPIQAAJyQAAD8kAABLJAAAXyQAAHQrAAB1KwAAlisAAJYrAAD0LAAA+CwAACYtAAAmLQAAKC0AACwtAAAuLQAALy0AAGgtAABuLQAAcS0AAH4tAACXLQAAny0AAKctAACnLQAAry0AAK8tAAC3LQAAty0AAL8tAAC/LQAAxy0AAMctAADPLQAAzy0AANctAADXLQAA3y0AAN8tAABeLgAAfy4AAJouAACaLgAA9C4AAP8uAADWLwAA7y8AAPwvAAD/LwAAQDAAAEAwAACXMAAAmDAAAAAxAAAEMQAAMDEAADAxAACPMQAAjzEAAOQxAADvMQAAHzIAAB8yAACNpAAAj6QAAMekAADPpAAALKYAAD+mAAD4pgAA/6YAAMunAADPpwAA0qcAANKnAADUpwAA1KcAANqnAADxpwAALagAAC+oAAA6qAAAP6gAAHioAAB/qAAAxqgAAM2oAADaqAAA36gAAFSpAABeqQAAfakAAH+pAADOqQAAzqkAANqpAADdqQAA/6kAAP+pAAA3qgAAP6oAAE6qAABPqgAAWqoAAFuqAADDqgAA2qoAAPeqAAAAqwAAB6sAAAirAAAPqwAAEKsAABerAAAfqwAAJ6sAACerAAAvqwAAL6sAAGyrAABvqwAA7qsAAO+rAAD6qwAA/6sAAKTXAACv1wAAx9cAAMrXAAD81wAA/9cAAG76AABv+gAA2voAAP/6AAAH+wAAEvsAABj7AAAc+wAAN/sAADf7AAA9+wAAPfsAAD/7AAA/+wAAQvsAAEL7AABF+wAARfsAAMP7AADS+wAAkP0AAJH9AADI/QAAzv0AAND9AADv/QAAGv4AAB/+AABT/gAAU/4AAGf+AABn/gAAbP4AAG/+AAB1/gAAdf4AAP3+AAD+/gAAAP8AAAD/AAC//wAAwf8AAMj/AADJ/wAA0P8AANH/AADY/wAA2f8AAN3/AADf/wAA5/8AAOf/AADv/wAA+P8AAP7/AAD//wAADAABAAwAAQAnAAEAJwABADsAAQA7AAEAPgABAD4AAQBOAAEATwABAF4AAQB/AAEA+wABAP8AAQADAQEABgEBADQBAQA2AQEAjwEBAI8BAQCdAQEAnwEBAKEBAQDPAQEA/gEBAH8CAQCdAgEAnwIBANECAQDfAgEA/AIBAP8CAQAkAwEALAMBAEsDAQBPAwEAewMBAH8DAQCeAwEAngMBAMQDAQDHAwEA1gMBAP8DAQCeBAEAnwQBAKoEAQCvBAEA1AQBANcEAQD8BAEA/wQBACgFAQAvBQEAZAUBAG4FAQB7BQEAewUBAIsFAQCLBQEAkwUBAJMFAQCWBQEAlgUBAKIFAQCiBQEAsgUBALIFAQC6BQEAugUBAL0FAQD/BQEANwcBAD8HAQBWBwEAXwcBAGgHAQB/BwEAhgcBAIYHAQCxBwEAsQcBALsHAQD/BwEABggBAAcIAQAJCAEACQgBADYIAQA2CAEAOQgBADsIAQA9CAEAPggBAFYIAQBWCAEAnwgBAKYIAQCwCAEA3wgBAPMIAQDzCAEA9ggBAPoIAQAcCQEAHgkBADoJAQA+CQEAQAkBAH8JAQC4CQEAuwkBANAJAQDRCQEABAoBAAQKAQAHCgEACwoBABQKAQAUCgEAGAoBABgKAQA2CgEANwoBADsKAQA+CgEASQoBAE8KAQBZCgEAXwoBAKAKAQC/CgEA5woBAOoKAQD3CgEA/woBADYLAQA4CwEAVgsBAFcLAQBzCwEAdwsBAJILAQCYCwEAnQsBAKgLAQCwCwEA/wsBAEkMAQB/DAEAswwBAL8MAQDzDAEA+QwBACgNAQAvDQEAOg0BAF8OAQB/DgEAfw4BAKoOAQCqDgEArg4BAK8OAQCyDgEA/A4BACgPAQAvDwEAWg8BAG8PAQCKDwEArw8BAMwPAQDfDwEA9w8BAP8PAQBOEAEAURABAHYQAQB+EAEAwxABAMwQAQDOEAEAzxABAOkQAQDvEAEA+hABAP8QAQA1EQEANREBAEgRAQBPEQEAdxEBAH8RAQDgEQEA4BEBAPURAQD/EQEAEhIBABISAQBCEgEAfxIBAIcSAQCHEgEAiRIBAIkSAQCOEgEAjhIBAJ4SAQCeEgEAqhIBAK8SAQDrEgEA7xIBAPoSAQD/EgEABBMBAAQTAQANEwEADhMBABETAQASEwEAKRMBACkTAQAxEwEAMRMBADQTAQA0EwEAOhMBADoTAQBFEwEARhMBAEkTAQBKEwEAThMBAE8TAQBREwEAVhMBAFgTAQBcEwEAZBMBAGUTAQBtEwEAbxMBAHUTAQD/EwEAXBQBAFwUAQBiFAEAfxQBAMgUAQDPFAEA2hQBAH8VAQC2FQEAtxUBAN4VAQD/FQEARRYBAE8WAQBaFgEAXxYBAG0WAQB/FgEAuhYBAL8WAQDKFgEA/xYBABsXAQAcFwEALBcBAC8XAQBHFwEA/xcBADwYAQCfGAEA8xgBAP4YAQAHGQEACBkBAAoZAQALGQEAFBkBABQZAQAXGQEAFxkBADYZAQA2GQEAORkBADoZAQBHGQEATxkBAFoZAQCfGQEAqBkBAKkZAQDYGQEA2RkBAOUZAQD/GQEASBoBAE8aAQCjGgEArxoBAPkaAQD/GgEAChsBAP8bAQAJHAEACRwBADccAQA3HAEARhwBAE8cAQBtHAEAbxwBAJAcAQCRHAEAqBwBAKgcAQC3HAEA/xwBAAcdAQAHHQEACh0BAAodAQA3HQEAOR0BADsdAQA7HQEAPh0BAD4dAQBIHQEATx0BAFodAQBfHQEAZh0BAGYdAQBpHQEAaR0BAI8dAQCPHQEAkh0BAJIdAQCZHQEAnx0BAKodAQDfHgEA+R4BAP8eAQARHwEAER8BADsfAQA9HwEAWh8BAK8fAQCxHwEAvx8BAPIfAQD+HwEAmiMBAP8jAQBvJAEAbyQBAHUkAQB/JAEARCUBAI8vAQDzLwEA/y8BAFY0AQD/QwEAR0YBAP9nAQA5agEAP2oBAF9qAQBfagEAamoBAG1qAQC/agEAv2oBAMpqAQDPagEA7moBAO9qAQD2agEA/2oBAEZrAQBPawEAWmsBAFprAQBiawEAYmsBAHhrAQB8awEAkGsBAD9uAQCbbgEA/24BAEtvAQBObwEAiG8BAI5vAQCgbwEA328BAOVvAQDvbwEA8m8BAP9vAQD4hwEA/4cBANaMAQD/jAEACY0BAO+vAQD0rwEA9K8BAPyvAQD8rwEA/68BAP+vAQAjsQEAMbEBADOxAQBPsQEAU7EBAFSxAQBWsQEAY7EBAGixAQBvsQEA/LIBAP+7AQBrvAEAb7wBAH28AQB/vAEAibwBAI+8AQCavAEAm7wBAKS8AQD/zgEALs8BAC/PAQBHzwEAT88BAMTPAQD/zwEA9tABAP/QAQAn0QEAKNEBAOvRAQD/0QEARtIBAL/SAQDU0gEA39IBAPTSAQD/0gEAV9MBAF/TAQB50wEA/9MBAFXUAQBV1AEAndQBAJ3UAQCg1AEAodQBAKPUAQCk1AEAp9QBAKjUAQCt1AEArdQBALrUAQC61AEAvNQBALzUAQDE1AEAxNQBAAbVAQAG1QEAC9UBAAzVAQAV1QEAFdUBAB3VAQAd1QEAOtUBADrVAQA/1QEAP9UBAEXVAQBF1QEAR9UBAEnVAQBR1QEAUdUBAKbWAQCn1gEAzNcBAM3XAQCM2gEAmtoBAKDaAQCg2gEAsNoBAP/eAQAf3wEAJN8BACvfAQD/3wEAB+ABAAfgAQAZ4AEAGuABACLgAQAi4AEAJeABACXgAQAr4AEAL+ABAG7gAQCO4AEAkOABAP/gAQAt4QEAL+EBAD7hAQA/4QEASuEBAE3hAQBQ4QEAj+IBAK/iAQC/4gEA+uIBAP7iAQAA4wEAz+QBAPrkAQDf5wEA5+cBAOfnAQDs5wEA7OcBAO/nAQDv5wEA/+cBAP/nAQDF6AEAxugBANfoAQD/6AEATOkBAE/pAQBa6QEAXekBAGDpAQBw7AEAtewBAADtAQA+7QEA/+0BAATuAQAE7gEAIO4BACDuAQAj7gEAI+4BACXuAQAm7gEAKO4BACjuAQAz7gEAM+4BADjuAQA47gEAOu4BADruAQA87gEAQe4BAEPuAQBG7gEASO4BAEjuAQBK7gEASu4BAEzuAQBM7gEAUO4BAFDuAQBT7gEAU+4BAFXuAQBW7gEAWO4BAFjuAQBa7gEAWu4BAFzuAQBc7gEAXu4BAF7uAQBg7gEAYO4BAGPuAQBj7gEAZe4BAGbuAQBr7gEAa+4BAHPuAQBz7gEAeO4BAHjuAQB97gEAfe4BAH/uAQB/7gEAiu4BAIruAQCc7gEAoO4BAKTuAQCk7gEAqu4BAKruAQC87gEA7+4BAPLuAQD/7wEALPABAC/wAQCU8AEAn/ABAK/wAQCw8AEAwPABAMDwAQDQ8AEA0PABAPbwAQD/8AEArvEBAOXxAQAD8gEAD/IBADzyAQA/8gEASfIBAE/yAQBS8gEAX/IBAGbyAQD/8gEA2PYBANv2AQDt9gEA7/YBAP32AQD/9gEAd/cBAHr3AQDa9wEA3/cBAOz3AQDv9wEA8fcBAP/3AQAM+AEAD/gBAEj4AQBP+AEAWvgBAF/4AQCI+AEAj/gBAK74AQCv+AEAsvgBAP/4AQBU+gEAX/oBAG76AQBv+gEAffoBAH/6AQCJ+gEAj/oBAL76AQC++gEAxvoBAM36AQDc+gEA3/oBAOn6AQDv+gEA+foBAP/6AQCT+wEAk/sBAMv7AQDv+wEA+vsBAP//AQDgpgIA/6YCADq3AgA/twIAHrgCAB+4AgCizgIAr84CAOHrAgD/9wIAHvoCAP//AgBLEwMATxMDALAjAwAAAA4AAgAOAB8ADgCAAA4A/wAOAPABDgD//w4A/v8PAP//DwD+/xAA//8QAEEAAABaAAAAwAAAANYAAADYAAAA3gAAAAABAAAAAQAAAgEAAAIBAAAEAQAABAEAAAYBAAAGAQAACAEAAAgBAAAKAQAACgEAAAwBAAAMAQAADgEAAA4BAAAQAQAAEAEAABIBAAASAQAAFAEAABQBAAAWAQAAFgEAABgBAAAYAQAAGgEAABoBAAAcAQAAHAEAAB4BAAAeAQAAIAEAACABAAAiAQAAIgEAACQBAAAkAQAAJgEAACYBAAAoAQAAKAEAACoBAAAqAQAALAEAACwBAAAuAQAALgEAADABAAAwAQAAMgEAADIBAAA0AQAANAEAADYBAAA2AQAAOQEAADkBAAA7AQAAOwEAAD0BAAA9AQAAPwEAAD8BAABBAQAAQQEAAEMBAABDAQAARQEAAEUBAABHAQAARwEAAEoBAABKAQAATAEAAEwBAABOAQAATgEAAFABAABQAQAAUgEAAFIBAABUAQAAVAEAAFYBAABWAQAAWAEAAFgBAABaAQAAWgEAAFwBAABcAQAAXgEAAF4BAABgAQAAYAEAAGIBAABiAQAAZAEAAGQBAABmAQAAZgEAAGgBAABoAQAAagEAAGoBAABsAQAAbAEAAG4BAABuAQAAcAEAAHABAAByAQAAcgEAAHQBAAB0AQAAdgEAAHYBAAB4AQAAeQEAAHsBAAB7AQAAfQEAAH0BAACBAQAAggEAAIQBAACEAQAAhgEAAIcBAACJAQAAiwEAAI4BAACRAQAAkwEAAJQBAACWAQAAmAEAAJwBAACdAQAAnwEAAKABAACiAQAAogEAAKQBAACkAQAApgEAAKcBAACpAQAAqQEAAKwBAACsAQAArgEAAK8BAACxAQAAswEAALUBAAC1AQAAtwEAALgBAAC8AQAAvAEAAMQBAADEAQAAxwEAAMcBAADKAQAAygEAAM0BAADNAQAAzwEAAM8BAADRAQAA0QEAANMBAADTAQAA1QEAANUBAADXAQAA1wEAANkBAADZAQAA2wEAANsBAADeAQAA3gEAAOABAADgAQAA4gEAAOIBAADkAQAA5AEAAOYBAADmAQAA6AEAAOgBAADqAQAA6gEAAOwBAADsAQAA7gEAAO4BAADxAQAA8QEAAPQBAAD0AQAA9gEAAPgBAAD6AQAA+gEAAPwBAAD8AQAA/gEAAP4BAAAAAgAAAAIAAAICAAACAgAABAIAAAQCAAAGAgAABgIAAAgCAAAIAgAACgIAAAoCAAAMAgAADAIAAA4CAAAOAgAAEAIAABACAAASAgAAEgIAABQCAAAUAgAAFgIAABYCAAAYAgAAGAIAABoCAAAaAgAAHAIAABwCAAAeAgAAHgIAACACAAAgAgAAIgIAACICAAAkAgAAJAIAACYCAAAmAgAAKAIAACgCAAAqAgAAKgIAACwCAAAsAgAALgIAAC4CAAAwAgAAMAIAADICAAAyAgAAOgIAADsCAAA9AgAAPgIAAEECAABBAgAAQwIAAEYCAABIAgAASAIAAEoCAABKAgAATAIAAEwCAABOAgAATgIAAHADAABwAwAAcgMAAHIDAAB2AwAAdgMAAH8DAAB/AwAAhgMAAIYDAACIAwAAigMAAIwDAACMAwAAjgMAAI8DAACRAwAAoQMAAKMDAACrAwAAzwMAAM8DAADSAwAA1AMAANgDAADYAwAA2gMAANoDAADcAwAA3AMAAN4DAADeAwAA4AMAAOADAADiAwAA4gMAAOQDAADkAwAA5gMAAOYDAADoAwAA6AMAAOoDAADqAwAA7AMAAOwDAADuAwAA7gMAAPQDAAD0AwAA9wMAAPcDAAD5AwAA+gMAAP0DAAAvBAAAYAQAAGAEAABiBAAAYgQAAGQEAABkBAAAZgQAAGYEAABoBAAAaAQAAGoEAABqBAAAbAQAAGwEAABuBAAAbgQAAHAEAABwBAAAcgQAAHIEAAB0BAAAdAQAAHYEAAB2BAAAeAQAAHgEAAB6BAAAegQAAHwEAAB8BAAAfgQAAH4EAACABAAAgAQAAIoEAACKBAAAjAQAAIwEAACOBAAAjgQAAJAEAACQBAAAkgQAAJIEAACUBAAAlAQAAJYEAACWBAAAmAQAAJgEAACaBAAAmgQAAJwEAACcBAAAngQAAJ4EAACgBAAAoAQAAKIEAACiBAAApAQAAKQEAACmBAAApgQAAKgEAACoBAAAqgQAAKoEAACsBAAArAQAAK4EAACuBAAAsAQAALAEAACyBAAAsgQAALQEAAC0BAAAtgQAALYEAAC4BAAAuAQAALoEAAC6BAAAvAQAALwEAAC+BAAAvgQAAMAEAADBBAAAwwQAAMMEAADFBAAAxQQAAMcEAADHBAAAyQQAAMkEAADLBAAAywQAAM0EAADNBAAA0AQAANAEAADSBAAA0gQAANQEAADUBAAA1gQAANYEAADYBAAA2AQAANoEAADaBAAA3AQAANwEAADeBAAA3gQAAOAEAADgBAAA4gQAAOIEAADkBAAA5AQAAOYEAADmBAAA6AQAAOgEAADqBAAA6gQAAOwEAADsBAAA7gQAAO4EAADwBAAA8AQAAPIEAADyBAAA9AQAAPQEAAD2BAAA9gQAAPgEAAD4BAAA+gQAAPoEAAD8BAAA/AQAAP4EAAD+BAAAAAUAAAAFAAACBQAAAgUAAAQFAAAEBQAABgUAAAYFAAAIBQAACAUAAAoFAAAKBQAADAUAAAwFAAAOBQAADgUAABAFAAAQBQAAEgUAABIFAAAUBQAAFAUAABYFAAAWBQAAGAUAABgFAAAaBQAAGgUAABwFAAAcBQAAHgUAAB4FAAAgBQAAIAUAACIFAAAiBQAAJAUAACQFAAAmBQAAJgUAACgFAAAoBQAAKgUAACoFAAAsBQAALAUAAC4FAAAuBQAAMQUAAFYFAACgEAAAxRAAAMcQAADHEAAAzRAAAM0QAACgEwAA9RMAAJAcAAC6HAAAvRwAAL8cAAAAHgAAAB4AAAIeAAACHgAABB4AAAQeAAAGHgAABh4AAAgeAAAIHgAACh4AAAoeAAAMHgAADB4AAA4eAAAOHgAAEB4AABAeAAASHgAAEh4AABQeAAAUHgAAFh4AABYeAAAYHgAAGB4AABoeAAAaHgAAHB4AABweAAAeHgAAHh4AACAeAAAgHgAAIh4AACIeAAAkHgAAJB4AACYeAAAmHgAAKB4AACgeAAAqHgAAKh4AACweAAAsHgAALh4AAC4eAAAwHgAAMB4AADIeAAAyHgAANB4AADQeAAA2HgAANh4AADgeAAA4HgAAOh4AADoeAAA8HgAAPB4AAD4eAAA+HgAAQB4AAEAeAABCHgAAQh4AAEQeAABEHgAARh4AAEYeAABIHgAASB4AAEoeAABKHgAATB4AAEweAABOHgAATh4AAFAeAABQHgAAUh4AAFIeAABUHgAAVB4AAFYeAABWHgAAWB4AAFgeAABaHgAAWh4AAFweAABcHgAAXh4AAF4eAABgHgAAYB4AAGIeAABiHgAAZB4AAGQeAABmHgAAZh4AAGgeAABoHgAAah4AAGoeAABsHgAAbB4AAG4eAABuHgAAcB4AAHAeAAByHgAAch4AAHQeAAB0HgAAdh4AAHYeAAB4HgAAeB4AAHoeAAB6HgAAfB4AAHweAAB+HgAAfh4AAIAeAACAHgAAgh4AAIIeAACEHgAAhB4AAIYeAACGHgAAiB4AAIgeAACKHgAAih4AAIweAACMHgAAjh4AAI4eAACQHgAAkB4AAJIeAACSHgAAlB4AAJQeAACeHgAAnh4AAKAeAACgHgAAoh4AAKIeAACkHgAApB4AAKYeAACmHgAAqB4AAKgeAACqHgAAqh4AAKweAACsHgAArh4AAK4eAACwHgAAsB4AALIeAACyHgAAtB4AALQeAAC2HgAAth4AALgeAAC4HgAAuh4AALoeAAC8HgAAvB4AAL4eAAC+HgAAwB4AAMAeAADCHgAAwh4AAMQeAADEHgAAxh4AAMYeAADIHgAAyB4AAMoeAADKHgAAzB4AAMweAADOHgAAzh4AANAeAADQHgAA0h4AANIeAADUHgAA1B4AANYeAADWHgAA2B4AANgeAADaHgAA2h4AANweAADcHgAA3h4AAN4eAADgHgAA4B4AAOIeAADiHgAA5B4AAOQeAADmHgAA5h4AAOgeAADoHgAA6h4AAOoeAADsHgAA7B4AAO4eAADuHgAA8B4AAPAeAADyHgAA8h4AAPQeAAD0HgAA9h4AAPYeAAD4HgAA+B4AAPoeAAD6HgAA/B4AAPweAAD+HgAA/h4AAAgfAAAPHwAAGB8AAB0fAAAoHwAALx8AADgfAAA/HwAASB8AAE0fAABZHwAAWR8AAFsfAABbHwAAXR8AAF0fAABfHwAAXx8AAGgfAABvHwAAuB8AALsfAADIHwAAyx8AANgfAADbHwAA6B8AAOwfAAD4HwAA+x8AAAIhAAACIQAAByEAAAchAAALIQAADSEAABAhAAASIQAAFSEAABUhAAAZIQAAHSEAACQhAAAkIQAAJiEAACYhAAAoIQAAKCEAACohAAAtIQAAMCEAADMhAAA+IQAAPyEAAEUhAABFIQAAgyEAAIMhAAAALAAALywAAGAsAABgLAAAYiwAAGQsAABnLAAAZywAAGksAABpLAAAaywAAGssAABtLAAAcCwAAHIsAAByLAAAdSwAAHUsAAB+LAAAgCwAAIIsAACCLAAAhCwAAIQsAACGLAAAhiwAAIgsAACILAAAiiwAAIosAACMLAAAjCwAAI4sAACOLAAAkCwAAJAsAACSLAAAkiwAAJQsAACULAAAliwAAJYsAACYLAAAmCwAAJosAACaLAAAnCwAAJwsAACeLAAAniwAAKAsAACgLAAAoiwAAKIsAACkLAAApCwAAKYsAACmLAAAqCwAAKgsAACqLAAAqiwAAKwsAACsLAAAriwAAK4sAACwLAAAsCwAALIsAACyLAAAtCwAALQsAAC2LAAAtiwAALgsAAC4LAAAuiwAALosAAC8LAAAvCwAAL4sAAC+LAAAwCwAAMAsAADCLAAAwiwAAMQsAADELAAAxiwAAMYsAADILAAAyCwAAMosAADKLAAAzCwAAMwsAADOLAAAziwAANAsAADQLAAA0iwAANIsAADULAAA1CwAANYsAADWLAAA2CwAANgsAADaLAAA2iwAANwsAADcLAAA3iwAAN4sAADgLAAA4CwAAOIsAADiLAAA6ywAAOssAADtLAAA7SwAAPIsAADyLAAAQKYAAECmAABCpgAAQqYAAESmAABEpgAARqYAAEamAABIpgAASKYAAEqmAABKpgAATKYAAEymAABOpgAATqYAAFCmAABQpgAAUqYAAFKmAABUpgAAVKYAAFamAABWpgAAWKYAAFimAABapgAAWqYAAFymAABcpgAAXqYAAF6mAABgpgAAYKYAAGKmAABipgAAZKYAAGSmAABmpgAAZqYAAGimAABopgAAaqYAAGqmAABspgAAbKYAAICmAACApgAAgqYAAIKmAACEpgAAhKYAAIamAACGpgAAiKYAAIimAACKpgAAiqYAAIymAACMpgAAjqYAAI6mAACQpgAAkKYAAJKmAACSpgAAlKYAAJSmAACWpgAAlqYAAJimAACYpgAAmqYAAJqmAAAipwAAIqcAACSnAAAkpwAAJqcAACanAAAopwAAKKcAACqnAAAqpwAALKcAACynAAAupwAALqcAADKnAAAypwAANKcAADSnAAA2pwAANqcAADinAAA4pwAAOqcAADqnAAA8pwAAPKcAAD6nAAA+pwAAQKcAAECnAABCpwAAQqcAAESnAABEpwAARqcAAEanAABIpwAASKcAAEqnAABKpwAATKcAAEynAABOpwAATqcAAFCnAABQpwAAUqcAAFKnAABUpwAAVKcAAFanAABWpwAAWKcAAFinAABapwAAWqcAAFynAABcpwAAXqcAAF6nAABgpwAAYKcAAGKnAABipwAAZKcAAGSnAABmpwAAZqcAAGinAABopwAAaqcAAGqnAABspwAAbKcAAG6nAABupwAAeacAAHmnAAB7pwAAe6cAAH2nAAB+pwAAgKcAAICnAACCpwAAgqcAAISnAACEpwAAhqcAAIanAACLpwAAi6cAAI2nAACNpwAAkKcAAJCnAACSpwAAkqcAAJanAACWpwAAmKcAAJinAACapwAAmqcAAJynAACcpwAAnqcAAJ6nAACgpwAAoKcAAKKnAACipwAApKcAAKSnAACmpwAApqcAAKinAACopwAAqqcAAK6nAACwpwAAtKcAALanAAC2pwAAuKcAALinAAC6pwAAuqcAALynAAC8pwAAvqcAAL6nAADApwAAwKcAAMKnAADCpwAAxKcAAMenAADJpwAAyacAANCnAADQpwAA1qcAANanAADYpwAA2KcAAPWnAAD1pwAAIf8AADr/AAAABAEAJwQBALAEAQDTBAEAcAUBAHoFAQB8BQEAigUBAIwFAQCSBQEAlAUBAJUFAQCADAEAsgwBAKAYAQC/GAEAQG4BAF9uAQAA1AEAGdQBADTUAQBN1AEAaNQBAIHUAQCc1AEAnNQBAJ7UAQCf1AEAotQBAKLUAQCl1AEAptQBAKnUAQCs1AEArtQBALXUAQDQ1AEA6dQBAATVAQAF1QEAB9UBAArVAQAN1QEAFNUBABbV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AAAQDQAAEg0AAEQNAABGDQAASA0AAEoNAABPDQAAVA0AAGMNAABmDQAAfw0AANocAADaHAAAMKgAADKoAABABgAAQAYAAEAIAABbCAAAXggAAF4IAABABgAAQAYAAMAKAQDmCgEA6woBAPYKAQBkCQAAZQkAAAAdAQAGHQEACB0BAAkdAQALHQEANh0BADodAQA6HQEAPB0BAD0dAQA/HQEARx0BAFAdAQBZHQEAMKgAADmoAAAAFgEARBYBAFAWAQBZFgEAABgAABkYAAAgGAAAeBgAAIAYAACqGAAALyAAAC8gAABgFgEAbBYBAGYKAABvCgAAgBIBAIYSAQCIEgEAiBIBAIoSAQCNEgEAjxIBAJ0SAQCfEgEAqRIBAAAQAACfEAAALqkAAC6pAADgqQAA/qkAAGCqAAB/qgAAZAkAAGUJAADmDAAA7wwAAOkcAADpHAAA8hwAAPIcAAD6HAAA+hwAADCoAAA1qAAAoBkBAKcZAQCqGQEA1xkBANoZAQDkGQEADAYAAAwGAAAbBgAAGwYAAB8GAAAfBgAAwAcAAPoHAAD9BwAA/wcAAD79AAA//QAAgwQAAIMEAABQAwEAegMBAEAGAABABgAA8goBAPIKAQBwDwEAiQ8BAFEJAABSCQAAZAkAAGUJAAABCwAAAwsAAAULAAAMCwAADwsAABALAAATCwAAKAsAACoLAAAwCwAAMgsAADMLAAA1CwAAOQsAADwLAABECwAARwsAAEgLAABLCwAATQsAAFULAABXCwAAXAsAAF0LAABfCwAAYwsAAGYLAAB3CwAA2hwAANocAADyHAAA8hwAAAIYAAADGAAABRgAAAUYAABAqAAAd6gAAEAGAABABgAAgAsBAJELAQCZCwEAnAsBAKkLAQCvCwEAUQkAAFEJAADXHAAA1xwAANkcAADZHAAA3BwAAN0cAADgHAAA4BwAAIARAQDfEQEAZAkAAGUJAACBDQAAgw0AAIUNAACWDQAAmg0AALENAACzDQAAuw0AAL0NAAC9DQAAwA0AAMYNAADKDQAAyg0AAM8NAADUDQAA1g0AANYNAADYDQAA3w0AAOYNAADvDQAA8g0AAPQNAADhEQEA9BEBAEAGAABABgAAMA8BAFkPAQBkCQAAZQkAAOYJAADvCQAAAKgAACyoAAAMBgAADAYAABsGAAAcBgAAHwYAAB8G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AADOHgAAzh4AANAeAADQHgAA0h4AANIeAADUHgAA1B4AANYeAADWHgAA2B4AANgeAADaHgAA2h4AANweAADcHgAA3h4AAN4eAADgHgAA4B4AAOIeAADiHgAA5B4AAOQeAADmHgAA5h4AAOgeAADoHgAA6h4AAOoeAADsHgAA7B4AAO4eAADuHgAA8B4AAPAeAADyHgAA8h4AAPQeAAD0HgAA9h4AAPYeAAD4HgAA+B4AAPoeAAD6HgAA/B4AAPweAAD+HgAA/h4AAAgfAAAPHwAAGB8AAB0fAAAoHwAALx8AADgfAAA/HwAASB8AAE0fAABZHwAAWR8AAFsfAABbHwAAXR8AAF0fAABfHwAAXx8AAGgfAABvHwAAgB8AAK8fAACyHwAAtB8AALcfAAC8HwAAwh8AAMQfAADHHwAAzB8AANgfAADbHwAA6B8AAOwfAADyHwAA9B8AAPcfAAD8HwAAJiEAACYhAAAqIQAAKyEAADIhAAAyIQAAYCEAAG8hAACDIQAAgyEAALYkAADPJAAAACwAAC8sAABgLAAAYCwAAGIsAABkLAAAZywAAGcsAABpLAAAaSwAAGssAABrLAAAbSwAAHAsAAByLAAAciwAAHUsAAB1LAAAfiwAAIAsAACCLAAAgiwAAIQsAACELAAAhiwAAIYsAACILAAAiCwAAIosAACKLAAAjCwAAIwsAACOLAAAjiwAAJAsAACQLAAAkiwAAJIsAACULAAAlCwAAJYsAACWLAAAmCwAAJgsAACaLAAAmiwAAJwsAACcLAAAniwAAJ4sAACgLAAAoCwAAKIsAACiLAAApCwAAKQsAACmLAAApiwAAKgsAACoLAAAqiwAAKosAACsLAAArCwAAK4sAACuLAAAsCwAALAsAACyLAAAsiwAALQsAAC0LAAAtiwAALYsAAC4LAAAuCwAALosAAC6LAAAvCwAALwsAAC+LAAAviwAAMAsAADALAAAwiwAAMIsAADELAAAxCwAAMYsAADGLAAAyCwAAMgsAADKLAAAyiwAAMwsAADMLAAAziwAAM4sAADQLAAA0CwAANIsAADSLAAA1CwAANQsAADWLAAA1iwAANgsAADYLAAA2iwAANosAADcLAAA3CwAAN4sAADeLAAA4CwAAOAsAADiLAAA4iwAAOssAADrLAAA7SwAAO0sAADyLAAA8iwAAECmAABApgAAQqYAAEKmAABEpgAARKYAAEamAABGpgAASKYAAEimAABKpgAASqYAAEymAABMpgAATqYAAE6mAABQpgAAUKYAAFKmAABSpgAAVKYAAFSmAABWpgAAVqYAAFimAABYpgAAWqYAAFqmAABcpgAAXKYAAF6mAABepgAAYKYAAGCmAABipgAAYqYAAGSmAABkpgAAZqYAAGamAABopgAAaKYAAGqmAABqpgAAbKYAAGymAACApgAAgKYAAIKmAACCpgAAhKYAAISmAACGpgAAhqYAAIimAACIpgAAiqYAAIqmAACMpgAAjKYAAI6mAACOpgAAkKYAAJCmAACSpgAAkqYAAJSmAACUpgAAlqYAAJamAACYpgAAmKYAAJqmAACapgAAIqcAACKnAAAkpwAAJKcAACanAAAmpwAAKKcAACinAAAqpwAAKqcAACynAAAspwAALqcAAC6nAAAypwAAMqcAADSnAAA0pwAANqcAADanAAA4pwAAOKcAADqnAAA6pwAAPKcAADynAAA+pwAAPqcAAECnAABApwAAQqcAAEKnAABEpwAARKcAAEanAABGpwAASKcAAEinAABKpwAASqcAAEynAABMpwAATqcAAE6nAABQpwAAUKcAAFKnAABSpwAAVKcAAFSnAABWpwAAVqcAAFinAABYpwAAWqcAAFqnAABcpwAAXKcAAF6nAABepwAAYKcAAGCnAABipwAAYqcAAGSnAABkpwAAZqcAAGanAABopwAAaKcAAGqnAABqpwAAbKcAAGynAABupwAAbqcAAHmnAAB5pwAAe6cAAHunAAB9pwAAfqcAAICnAACApwAAgqcAAIKnAACEpwAAhKcAAIanAACGpwAAi6cAAIunAACNpwAAjacAAJCnAACQpwAAkqcAAJKnAACWpwAAlqcAAJinAACYpwAAmqcAAJqnAACcpwAAnKcAAJ6nAACepwAAoKcAAKCnAACipwAAoqcAAKSnAACkpwAApqcAAKanAACopwAAqKcAAKqnAACupwAAsKcAALSnAAC2pwAAtqcAALinAAC4pwAAuqcAALqnAAC8pwAAvKcAAL6nAAC+pwAAwKcAAMCnAADCpwAAwqcAAMSnAADHpwAAyacAAMmnAADQpwAA0KcAANanAADWpwAA2KcAANinAAD1pwAA9acAAHCrAAC/qwAAAPsAAAb7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AAA8HgAAPB4AAD4eAAA+HgAAQB4AAEAeAABCHgAAQh4AAEQeAABEHgAARh4AAEYeAABIHgAASB4AAEoeAABKHgAATB4AAEweAABOHgAATh4AAFAeAABQHgAAUh4AAFIeAABUHgAAVB4AAFYeAABWHgAAWB4AAFgeAABaHgAAWh4AAFweAABcHgAAXh4AAF4eAABgHgAAYB4AAGIeAABiHgAAZB4AAGQeAABmHgAAZh4AAGgeAABoHgAAah4AAGoeAABsHgAAbB4AAG4eAABuHgAAcB4AAHAeAAByHgAAch4AAHQeAAB0HgAAdh4AAHYeAAB4HgAAeB4AAHoeAAB6HgAAfB4AAHweAAB+HgAAfh4AAIAeAACAHgAAgh4AAIIeAACEHgAAhB4AAIYeAACGHgAAiB4AAIgeAACKHgAAih4AAIweAACMHgAAjh4AAI4eAACQHgAAkB4AAJIeAACSHgAAlB4AAJQeAACeHgAAnh4AAKAeAACgHgAAoh4AAKIeAACkHgAApB4AAKYeAACmHgAAqB4AAKgeAACqHgAAqh4AAKweAACsHgAArh4AAK4eAACwHgAAsB4AALIeAACyHgAAtB4AALQeAAC2HgAAth4AALgeAAC4HgAAuh4AALoeAAC8HgAAvB4AAL4eAAC+HgAAwB4AAMAeAADCHgAAwh4AAMQeAADEHgAAxh4AAMYeAADIHgAAyB4AAMoeAADKHgAAzB4AAMweAADOHgAAzh4AANAeAADQHgAA0h4AANIeAADUHgAA1B4AANYeAADWHgAA2B4AANgeAADaHgAA2h4AANweAADcHgAA3h4AAN4eAADgHgAA4B4AAOIeAADiHgAA5B4AAOQeAADmHgAA5h4AAOgeAADoHgAA6h4AAOoeAADsHgAA7B4AAO4eAADuHgAA8B4AAPAeAADyHgAA8h4AAPQeAAD0HgAA9h4AAPYeAAD4HgAA+B4AAPoeAAD6HgAA/B4AAPweAAD+HgAA/h4AAAgfAAAPHwAAGB8AAB0fAAAoHwAALx8AADgfAAA/HwAASB8AAE0fAABZHwAAWR8AAFsfAABbHwAAXR8AAF0fAABfHwAAXx8AAGgfAABvHwAAiB8AAI8fAACYHwAAnx8AAKgfAACvHwAAuB8AALwfAADIHwAAzB8AANgfAADbHwAA6B8AAOwfAAD4HwAA/B8AACYhAAAmIQAAKiEAACshAAAyIQAAMiEAAGAhAABvIQAAgyEAAIMhAAC2JAAAzyQAAAAsAAAvLAAAYCwAAGAsAABiLAAAZCwAAGcsAABnLAAAaSwAAGksAABrLAAAaywAAG0sAABwLAAAciwAAHIsAAB1LAAAdSwAAH4sAACALAAAgiwAAIIsAACELAAAhCwAAIYsAACGLAAAiCwAAIgsAACKLAAAiiwAAIwsAACMLAAAjiwAAI4sAACQLAAAkCwAAJIsAACSLAAAlCwAAJQsAACWLAAAliwAAJgsAACYLAAAmiwAAJosAACcLAAAnCwAAJ4sAACeLAAAoCwAAKAsAACiLAAAoiwAAKQsAACkLAAApiwAAKYsAACoLAAAqCwAAKosAACqLAAArCwAAKwsAACuLAAAriwAALAsAACwLAAAsiwAALIsAAC0LAAAtCwAALYsAAC2LAAAuCwAALgsAAC6LAAAuiwAALwsAAC8LAAAviwAAL4sAADALAAAwCwAAMIsAADCLAAAxCwAAMQsAADGLAAAxiwAAMgsAADILAAAyiwAAMosAADMLAAAzCwAAM4sAADOLAAA0CwAANAsAADSLAAA0iwAANQsAADULAAA1iwAANYsAADYLAAA2CwAANosAADaLAAA3CwAANwsAADeLAAA3iwAAOAsAADgLAAA4iwAAOIsAADrLAAA6ywAAO0sAADtLAAA8iwAAPIsAABApgAAQKYAAEKmAABCpgAARKYAAESmAABGpgAARqYAAEimAABIpgAASqYAAEqmAABMpgAATKYAAE6mAABOpgAAUKYAAFCmAABSpgAAUqYAAFSmAABUpgAAVqYAAFamAABYpgAAWKYAAFqmAABapgAAXKYAAFymAABepgAAXqYAAGCmAABgpgAAYqYAAGKmAABkpgAAZKYAAGamAABmpgAAaKYAAGimAABqpgAAaqYAAGymAABspgAAgKYAAICmAACCpgAAgqYAAISmAACEpgAAhqYAAIamAACIpgAAiKYAAIqmAACKpgAAjKYAAIymAACOpgAAjqYAAJCmAACQpgAAkqYAAJKmAACUpgAAlKYAAJamAACWpgAAmKYAAJimAACapgAAmqYAACKnAAAipwAAJKcAACSnAAAmpwAAJqcAACinAAAopwAAKqcAACqnAAAspwAALKcAAC6nAAAupwAAMqcAADKnAAA0pwAANKcAADanAAA2pwAAOKcAADinAAA6pwAAOqcAADynAAA8pwAAPqcAAD6nAABApwAAQKcAAEKnAABCpwAARKcAAESnAABGpwAARqcAAEinAABIpwAASqcAAEqnAABMpwAATKcAAE6nAABOpwAAUKcAAFCnAABSpwAAUqcAAFSnAABUpwAAVqcAAFanAABYpwAAWKcAAFqnAABapwAAXKcAAFynAABepwAAXqcAAGCnAABgpwAAYqcAAGKnAABkpwAAZKcAAGanAABmpwAAaKcAAGinAABqpwAAaqcAAGynAABspwAAbqcAAG6nAAB5pwAAeacAAHunAAB7pwAAfacAAH6nAACApwAAgKcAAIKnAACCpwAAhKcAAISnAACGpwAAhqcAAIunAACLpwAAjacAAI2nAACQpwAAkKcAAJKnAACSpwAAlqcAAJanAACYpwAAmKcAAJqnAACapwAAnKcAAJynAACepwAAnqcAAKCnAACgpwAAoqcAAKKnAACkpwAApKcAAKanAACmpwAAqKcAAKinAACqpwAArqcAALCnAAC0pwAAtqcAALanAAC4pwAAuKcAALqnAAC6pwAAvKcAALynAAC+pwAAvqcAAMCnAADApwAAwqcAAMKnAADEpwAAx6cAAMmnAADJpwAA0KcAANCnAADWpwAA1qcAANinAADYpwAA9acAAPWnAAAh/wAAOv8AAAAEAQAnBAEAsAQBANMEAQBwBQEAegUBAHwFAQCKBQEAjAUBAJIFAQCUBQEAlQUBAIAMAQCyDAEAoBgBAL8YAQBAbgEAX24BAADpAQAh6QEAYQAAAHoAAAC1AAAAtQAAAN8AAAD2AAAA+AAAAP8AAAABAQAAAQEAAAMBAAADAQAABQEAAAUBAAAHAQAABwEAAAkBAAAJAQAACwEAAAsBAAANAQAADQEAAA8BAAAPAQAAEQEAABEBAAATAQAAEwEAABUBAAAVAQAAFwEAABcBAAAZAQAAGQEAABsBAAAbAQAAHQEAAB0BAAAfAQAAHwEAACEBAAAhAQAAIwEAACMBAAAlAQAAJQEAACcBAAAnAQAAKQEAACkBAAArAQAAKwEAAC0BAAAtAQAALwEAAC8BAAAxAQAAMQEAADMBAAAzAQAANQEAADUBAAA3AQAANwEAADoBAAA6AQAAPAEAADwBAAA+AQAAPgEAAEAB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AACvHgAArx4AALEeAACxHgAAsx4AALMeAAC1HgAAtR4AALceAAC3HgAAuR4AALkeAAC7HgAAux4AAL0eAAC9HgAAvx4AAL8eAADBHgAAwR4AAMMeAADDHgAAxR4AAMUeAADHHgAAxx4AAMkeAADJHgAAyx4AAMseAADNHgAAzR4AAM8eAADPHgAA0R4AANEeAADTHgAA0x4AANUeAADVHgAA1x4AANceAADZHgAA2R4AANseAADbHgAA3R4AAN0eAADfHgAA3x4AAOEeAADhHgAA4x4AAOMeAADlHgAA5R4AAOceAADnHgAA6R4AAOkeAADrHgAA6x4AAO0eAADtHgAA7x4AAO8eAADxHgAA8R4AAPMeAADzHgAA9R4AAPUeAAD3HgAA9x4AAPkeAAD5HgAA+x4AAPseAAD9HgAA/R4AAP8eAAAHHwAAEB8AABUfAAAgHwAAJx8AADAfAAA3HwAAQB8AAEUfAABQHwAAVx8AAGAfAABnHwAAcB8AAH0fAACAHwAAhx8AAJAfAACXHwAAoB8AAKcfAACwHwAAtB8AALYfAAC3HwAAvh8AAL4fAADCHwAAxB8AAMYfAADHHwAA0B8AANMfAADWHwAA1x8AAOAfAADnHwAA8h8AAPQfAAD2HwAA9x8AAE4hAABOIQAAcCEAAH8hAACEIQAAhCEAANAkAADpJAAAMCwAAF8sAABhLAAAYSwAAGUsAABmLAAAaCwAAGgsAABqLAAAaiwAAGwsAABsLAAAcywAAHMsAAB2LAAAdiwAAIEsAACBLAAAgywAAIMsAACFLAAAhSwAAIcsAACHLAAAiSwAAIksAACLLAAAiywAAI0sAACNLAAAjywAAI8sAACRLAAAkSwAAJMsAACTLAAAlSwAAJUsAACXLAAAlywAAJksAACZLAAAmywAAJssAACdLAAAnSwAAJ8sAACfLAAAoSwAAKEsAACjLAAAoywAAKUsAAClLAAApywAAKcsAACpLAAAqSwAAKssAACrLAAArSwAAK0sAACvLAAArywAALEsAACxLAAAsywAALMsAAC1LAAAtSwAALcsAAC3LAAAuSwAALksAAC7LAAAuywAAL0sAAC9LAAAvywAAL8sAADBLAAAwSwAAMMsAADDLAAAxSwAAMUsAADHLAAAxywAAMksAADJLAAAyywAAMssAADNLAAAzSwAAM8sAADPLAAA0SwAANEsAADTLAAA0ywAANUsAADVLAAA1ywAANcsAADZLAAA2SwAANssAADbLAAA3SwAAN0sAADfLAAA3ywAAOEsAADhLAAA4ywAAOMsAADsLAAA7CwAAO4sAADuLAAA8ywAAPMsAAAALQAAJS0AACctAAAnLQAALS0AAC0tAABBpgAAQaYAAEOmAABDpgAARaYAAEWmAABHpgAAR6YAAEmmAABJpgAAS6YAAEumAABNpgAATaYAAE+mAABPpgAAUaYAAFGmAABTpgAAU6YAAFWmAABVpgAAV6YAAFemAABZpgAAWaYAAFumAABbpgAAXaYAAF2mAABfpgAAX6YAAGGmAABhpgAAY6YAAGOmAABlpgAAZaYAAGemAABnpgAAaaYAAGmmAABrpgAAa6YAAG2mAABtpgAAgaYAAIGmAACDpgAAg6YAAIWmAACFpgAAh6YAAIemAACJpgAAiaYAAIumAACLpgAAjaYAAI2mAACPpgAAj6YAAJGmAACRpgAAk6YAAJOmAACVpgAAlaYAAJemAACXpgAAmaYAAJmmAACbpgAAm6YAACOnAAAjpwAAJacAACWnAAAnpwAAJ6cAACmnAAAppwAAK6cAACunAAAtpwAALacAAC+nAAAvpwAAM6cAADOnAAA1pwAANacAADenAAA3pwAAOacAADmnAAA7pwAAO6cAAD2nAAA9pwAAP6cAAD+nAABBpwAAQacAAEOnAABDpwAARacAAEWnAABHpwAAR6cAAEmnAABJpwAAS6cAAEunAABNpwAATacAAE+nAABPpwAAUacAAFGnAABTpwAAU6cAAFWnAABVpwAAV6cAAFenAABZpwAAWacAAFunAABbpwAAXacAAF2nAABfpwAAX6cAAGGnAABhpwAAY6cAAGOnAABlpwAAZacAAGenAABnpwAAaacAAGmnAABrpwAAa6cAAG2nAABtpwAAb6cAAG+nAAB6pwAAeqcAAHynAAB8pwAAf6cAAH+nAACBpwAAgacAAIOnAACDpwAAhacAAIWnAACHpwAAh6cAAIynAACMpwAAkacAAJGnAACTpwAAlKcAAJenAACXpwAAmacAAJmnAACbpwAAm6cAAJ2nAACdpwAAn6cAAJ+nAAChpwAAoacAAKOnAACjpwAApacAAKWnAACnpwAAp6cAAKmnAACppwAAtacAALWn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AAAjHgAAJR4AACUeAAAnHgAAJx4AACkeAAApHgAAKx4AACseAAAtHgAALR4AAC8eAAAvHgAAMR4AADEeAAAzHgAAMx4AADUeAAA1HgAANx4AADceAAA5HgAAOR4AADseAAA7HgAAPR4AAD0eAAA/HgAAPx4AAEEeAABBHgAAQx4AAEMeAABFHgAARR4AAEceAABHHgAASR4AAEkeAABLHgAASx4AAE0eAABNHgAATx4AAE8eAABRHgAAUR4AAFMeAABTHgAAVR4AAFUeAABXHgAAVx4AAFkeAABZHgAAWx4AAFseAABdHgAAXR4AAF8eAABfHgAAYR4AAGEeAABjHgAAYx4AAGUeAABlHgAAZx4AAGceAABpHgAAaR4AAGseAABrHgAAbR4AAG0eAABvHgAAbx4AAHEeAABxHgAAcx4AAHMeAAB1HgAAdR4AAHceAAB3HgAAeR4AAHkeAAB7HgAAex4AAH0eAAB9HgAAfx4AAH8eAACBHgAAgR4AAIMeAACDHgAAhR4AAIUeAACHHgAAhx4AAIkeAACJHgAAix4AAIseAACNHgAAjR4AAI8eAACPHgAAkR4AAJEeAACTHgAAkx4AAJUeAACbHgAAoR4AAKEeAACjHgAAox4AAKUeAAClHgAApx4AAKceAACpHgAAqR4AAKseAACrHgAArR4AAK0eAACvHgAArx4AALEeAACxHgAAsx4AALMeAAC1HgAAtR4AALceAAC3HgAAuR4AALkeAAC7HgAAux4AAL0eAAC9HgAAvx4AAL8eAADBHgAAwR4AAMMeAADDHgAAxR4AAMUeAADHHgAAxx4AAMkeAADJHgAAyx4AAMseAADNHgAAzR4AAM8eAADPHgAA0R4AANEeAADTHgAA0x4AANUeAADVHgAA1x4AANceAADZHgAA2R4AANseAADbHgAA3R4AAN0eAADfHgAA3x4AAOEeAADhHgAA4x4AAOMeAADlHgAA5R4AAOceAADnHgAA6R4AAOkeAADrHgAA6x4AAO0eAADtHgAA7x4AAO8eAADxHgAA8R4AAPMeAADzHgAA9R4AAPUeAAD3HgAA9x4AAPkeAAD5HgAA+x4AAPseAAD9HgAA/R4AAP8eAAAHHwAAEB8AABUfAAAgHwAAJx8AADAfAAA3HwAAQB8AAEUfAABQHwAAVx8AAGAfAABnHwAAcB8AAH0fAACAHwAAtB8AALYfAAC3HwAAvB8AALwfAAC+HwAAvh8AAMIfAADEHwAAxh8AAMcfAADMHwAAzB8AANAfAADTHwAA1h8AANcfAADgHwAA5x8AAPIfAAD0HwAA9h8AAPcfAAD8HwAA/B8AAE4hAABOIQAAcCEAAH8hAACEIQAAhCEAANAkAADpJAAAMCwAAF8sAABhLAAAYSwAAGUsAABmLAAAaCwAAGgsAABqLAAAaiwAAGwsAABsLAAAcywAAHMsAAB2LAAAdiwAAIEsAACBLAAAgywAAIMsAACFLAAAhSwAAIcsAACHLAAAiSwAAIksAACLLAAAiywAAI0sAACNLAAAjywAAI8sAACRLAAAkSwAAJMsAACTLAAAlSwAAJUsAACXLAAAlywAAJksAACZLAAAmywAAJssAACdLAAAnSwAAJ8sAACfLAAAoSwAAKEsAACjLAAAoywAAKUsAAClLAAApywAAKcsAACpLAAAqSwAAKssAACrLAAArSwAAK0sAACvLAAArywAALEsAACxLAAAsywAALMsAAC1LAAAtSwAALcsAAC3LAAAuSwAALksAAC7LAAAuywAAL0sAAC9LAAAvywAAL8sAADBLAAAwSwAAMMsAADDLAAAxSwAAMUsAADHLAAAxywAAMksAADJLAAAyywAAMssAADNLAAAzSwAAM8sAADPLAAA0SwAANEsAADTLAAA0ywAANUsAADVLAAA1ywAANcsAADZLAAA2SwAANssAADbLAAA3SwAAN0sAADfLAAA3ywAAOEsAADhLAAA4ywAAOMsAADsLAAA7CwAAO4sAADuLAAA8ywAAPMsAAAALQAAJS0AACctAAAnLQAALS0AAC0tAABBpgAAQaYAAEOmAABDpgAARaYAAEWmAABHpgAAR6YAAEmmAABJpgAAS6YAAEumAABNpgAATaYAAE+mAABPpgAAUaYAAFGmAABTpgAAU6YAAFWmAABVpgAAV6YAAFemAABZpgAAWaYAAFumAABbpgAAXaYAAF2mAABfpgAAX6YAAGGmAABhpgAAY6YAAGOmAABlpgAAZaYAAGemAABnpgAAaaYAAGmmAABrpgAAa6YAAG2mAABtpgAAgaYAAIGmAACDpgAAg6YAAIWmAACFpgAAh6YAAIemAACJpgAAiaYAAIumAACLpgAAjaYAAI2mAACPpgAAj6YAAJGmAACRpgAAk6YAAJOmAACVpgAAlaYAAJemAACXpgAAmaYAAJmmAACbpgAAm6YAACOnAAAjpwAAJacAACWnAAAnpwAAJ6cAACmnAAAppwAAK6cAACunAAAtpwAALacAAC+nAAAvpwAAM6cAADOnAAA1pwAANacAADenAAA3pwAAOacAADmnAAA7pwAAO6cAAD2nAAA9pwAAP6cAAD+nAABBpwAAQacAAEOnAABDpwAARacAAEWnAABHpwAAR6cAAEmnAABJpwAAS6cAAEunAABNpwAATacAAE+nAABPpwAAUacAAFGnAABTpwAAU6cAAFWnAABVpwAAV6cAAFenAABZpwAAWacAAFunAABbpwAAXacAAF2nAABfpwAAX6cAAGGnAABhpwAAY6cAAGOnAABlpwAAZacAAGenAABnpwAAaacAAGmnAABrpwAAa6cAAG2nAABtpwAAb6cAAG+nAAB6pwAAeqcAAHynAAB8pwAAf6cAAH+nAACBpwAAgacAAIOnAACDpwAAhacAAIWnAACHpwAAh6cAAIynAACMpwAAkacAAJGnAACTpwAAlKcAAJenAACXpwAAmacAAJmnAACbpwAAm6cAAJ2nAACdpwAAn6cAAJ+nAAChpwAAoacAAKOnAACjpwAApacAAKWnAACnpwAAp6cAAKmnAACppwAAtacAALWnAAC3pwAAt6cAALmnAAC5pwAAu6cAALunAAC9pwAAvacAAL+nAAC/pwAAwacAAMGnAADDpwAAw6cAAMinAADIpwAAyqcAAMqnAADRpwAA0acAANenAADXpwAA2acAANmnAAD2pwAA9qcAAFOrAABTqwAAcKsAAL+rAAAA+wAABvsAABP7AAAX+wAAQf8AAFr/AAAoBAEATwQBANgEAQD7BAEAlwUBAKEFAQCjBQEAsQUBALMFAQC5BQEAuwUBALwFAQDADAEA8gwBAMAYAQDfGAEAYG4BAH9uAQAi6QEAQ+kBAC0AAAAtAAAAigUAAIoFAAC+BQAAvgUAAAAUAAAAFAAABhgAAAYYAAAQIAAAFSAAAFMgAABTIAAAeyAAAHsgAACLIAAAiyAAABIiAAASIgAAFy4AABcuAAAaLgAAGi4AADouAAA7LgAAQC4AAEAuAABdLgAAXS4AABwwAAAcMAAAMDAAADAwAACgMAAAoDAAADH+AAAy/gAAWP4AAFj+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AAAwAAAAOQAAAKkAAACpAAAArgAAAK4AAAA8IAAAPCAAAEkgAABJIAAAIiEAACIhAAA5IQAAOSEAAJQhAACZIQAAqSEAAKohAAAaIwAAGyMAACgjAAAoIwAAzyMAAM8jAADpIwAA8yMAAPgjAAD6IwAAwiQAAMIkAACqJQAAqyUAALYlAAC2JQAAwCUAAMAlAAD7JQAA/iUAAAAmAAAEJgAADiYAAA4mAAARJgAAESYAABQmAAAVJgAAGCYAABgmAAAdJgAAHSYAACAmAAAgJgAAIiYAACMmAAAmJgAAJiYAAComAAAqJgAALiYAAC8mAAA4JgAAOiYAAEAmAABAJgAAQiYAAEImAABIJgAAUyYAAF8mAABgJgAAYyYAAGMmAABlJgAAZiYAAGgmAABoJgAAeyYAAHsmAAB+JgAAfyYAAJImAACXJgAAmSYAAJkmAACbJgAAnCYAAKAmAAChJgAApyYAAKcmAACqJgAAqyYAALAmAACxJgAAvSYAAL4mAADEJgAAxSYAAMgmAADIJgAAziYAAM8mAADRJgAA0SYAANMmAADUJgAA6SYAAOomAADwJgAA9SYAAPcmAAD6JgAA/SYAAP0mAAACJwAAAicAAAUnAAAFJwAACCcAAA0nAAAPJwAADycAABInAAASJwAAFCcAABQnAAAWJwAAFicAAB0nAAAdJwAAIScAACEnAAAoJwAAKCcAADMnAAA0JwAARCcAAEQnAABHJwAARycAAEwnAABMJwAATicAAE4nAABTJwAAVScAAFcnAABXJwAAYycAAGQnAACVJwAAlycAAKEnAAChJwAAsCcAALAnAAC/JwAAvycAADQpAAA1KQAABSsAAAcrAAAbKwAAHCsAAFArAABQKwAAVSsAAFUrAAAwMAAAMDAAAD0wAAA9MAAAlzIAAJcyAACZMgAAmTIAAATwAQAE8AEAz/ABAM/wAQBw8QEAcfEBAH7xAQB/8QEAjvEBAI7xAQCR8QEAmvEBAObxAQD/8QEAAfIBAALyAQAa8gEAGvIBAC/yAQAv8gEAMvIBADryAQBQ8gEAUfIBAADzAQAh8wEAJPMBAJPzAQCW8wEAl/MBAJnzAQCb8wEAnvMBAPDzAQDz8wEA9fMBAPfzAQD99AEA//QBAD31AQBJ9QEATvUBAFD1AQBn9QEAb/UBAHD1AQBz9QEAevUBAIf1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AABfHgAAYR4AAGEeAABjHgAAYx4AAGUeAABlHgAAZx4AAGceAABpHgAAaR4AAGseAABrHgAAbR4AAG0eAABvHgAAbx4AAHEeAABxHgAAcx4AAHMeAAB1HgAAdR4AAHceAAB3HgAAeR4AAHkeAAB7HgAAex4AAH0eAAB9HgAAfx4AAH8eAACBHgAAgR4AAIMeAACDHgAAhR4AAIUeAACHHgAAhx4AAIkeAACJHgAAix4AAIseAACNHgAAjR4AAI8eAACPHgAAkR4AAJEeAACTHgAAkx4AAJUeAACdHgAAnx4AAJ8eAAChHgAAoR4AAKMeAACjHgAApR4AAKUeAACnHgAApx4AAKkeAACpHgAAqx4AAKseAACtHgAArR4AAK8eAACvHgAAsR4AALEeAACzHgAAsx4AALUeAAC1HgAAtx4AALceAAC5HgAAuR4AALseAAC7HgAAvR4AAL0eAAC/HgAAvx4AAMEeAADBHgAAwx4AAMMeAADFHgAAxR4AAMceAADHHgAAyR4AAMkeAADLHgAAyx4AAM0eAADNHgAAzx4AAM8eAADRHgAA0R4AANMeAADTHgAA1R4AANUeAADXHgAA1x4AANkeAADZHgAA2x4AANseAADdHgAA3R4AAN8eAADfHgAA4R4AAOEeAADjHgAA4x4AAOUeAADlHgAA5x4AAOceAADpHgAA6R4AAOseAADrHgAA7R4AAO0eAADvHgAA7x4AAPEeAADxHgAA8x4AAPMeAAD1HgAA9R4AAPceAAD3HgAA+R4AAPkeAAD7HgAA+x4AAP0eAAD9HgAA/x4AAAcfAAAQHwAAFR8AACAfAAAnHwAAMB8AADcfAABAHwAARR8AAFAfAABXHwAAYB8AAGcfAABwHwAAfR8AAIAfAACHHwAAkB8AAJcfAACgHwAApx8AALAfAAC0HwAAth8AALcfAAC+HwAAvh8AAMIfAADEHwAAxh8AAMcfAADQHwAA0x8AANYfAADXHwAA4B8AAOcfAADyHwAA9B8AAPYfAAD3HwAAcSAAAHEgAAB/IAAAfyAAAJAgAACcIAAACiEAAAohAAAOIQAADyEAABMhAAATIQAALyEAAC8hAAA0IQAANCEAADkhAAA5IQAAPCEAAD0hAABGIQAASSEAAE4hAABOIQAAcCEAAH8hAACEIQAAhCEAANAkAADpJAAAMCwAAF8sAABhLAAAYSwAAGUsAABmLAAAaCwAAGgsAABqLAAAaiwAAGwsAABsLAAAcSwAAHEsAABzLAAAdCwAAHYsAAB9LAAAgSwAAIEsAACDLAAAgywAAIUsAACFLAAAhywAAIcsAACJLAAAiSwAAIssAACLLAAAjSwAAI0sAACPLAAAjywAAJEsAACRLAAAkywAAJMsAACVLAAAlSwAAJcsAACXLAAAmSwAAJksAACbLAAAmywAAJ0sAACdLAAAnywAAJ8sAAChLAAAoSwAAKMsAACjLAAApSwAAKUsAACnLAAApywAAKksAACpLAAAqywAAKssAACtLAAArSwAAK8sAACvLAAAsSwAALEsAACzLAAAsywAALUsAAC1LAAAtywAALcsAAC5LAAAuSwAALssAAC7LAAAvSwAAL0sAAC/LAAAvywAAMEsAADBLAAAwywAAMMsAADFLAAAxSwAAMcsAADHLAAAySwAAMksAADLLAAAyywAAM0sAADNLAAAzywAAM8sAADRLAAA0SwAANMsAADTLAAA1SwAANUsAADXLAAA1ywAANksAADZLAAA2ywAANssAADdLAAA3SwAAN8sAADfLAAA4SwAAOEsAADjLAAA5CwAAOwsAADsLAAA7iwAAO4sAADzLAAA8ywAAAAtAAAlLQAAJy0AACctAAAtLQAALS0AAEGmAABBpgAAQ6YAAEOmAABFpgAARaYAAEemAABHpgAASaYAAEmmAABLpgAAS6YAAE2mAABNpgAAT6YAAE+mAABRpgAAUaYAAFOmAABTpgAAVaYAAFWmAABXpgAAV6YAAFmmAABZpgAAW6YAAFumAABdpgAAXaYAAF+mAABfpgAAYaYAAGGmAABjpgAAY6YAAGWmAABlpgAAZ6YAAGemAABppgAAaaYAAGumAABrpgAAbaYAAG2mAACBpgAAgaYAAIOmAACDpgAAhaYAAIWmAACHpgAAh6YAAImmAACJpgAAi6YAAIumAACNpgAAjaYAAI+mAACPpgAAkaYAAJGmAACTpgAAk6YAAJWmAACVpgAAl6YAAJemAACZpgAAmaYAAJumAACdpgAAI6cAACOnAAAlpwAAJacAACenAAAnpwAAKacAACmnAAArpwAAK6cAAC2nAAAtpwAAL6cAADGnAAAzpwAAM6cAADWnAAA1pwAAN6cAADenAAA5pwAAOacAADunAAA7pwAAPacAAD2nAAA/pwAAP6cAAEGnAABBpwAAQ6cAAEOnAABFpwAARacAAEenAABHpwAASacAAEmnAABLpwAAS6cAAE2nAABNpwAAT6cAAE+nAABRpwAAUacAAFOnAABTpwAAVacAAFWnAABXpwAAV6cAAFmnAABZpwAAW6cAAFunAABdpwAAXacAAF+nAABfpwAAYacAAGGnAABjpwAAY6cAAGWnAABlpwAAZ6cAAGenAABppwAAaacAAGunAABrpwAAbacAAG2nAABvpwAAeKcAAHqnAAB6pwAAfKcAAHynAAB/pwAAf6cAAIGnAACBpwAAg6cAAIOnAACFpwAAhacAAIenAACHpwAAjKcAAIynAACOpwAAjqcAAJGnAACRpwAAk6cAAJWnAACXpwAAl6cAAJmnAACZpwAAm6cAAJunAACdpwAAnacAAJ+nAACfpwAAoacAAKGnAACjpwAAo6cAAKWnAAClpwAAp6cAAKenAACppwAAqacAAK+nAACvpwAAtacAALWnAAC3pwAAt6cAALmnAAC5pwAAu6cAALunAAC9pwAAvacAAL+nAAC/pwAAwacAAMGnAADDpwAAw6cAAMinAADIpwAAyqcAAMqnAADRpwAA0acAANOnAADTpwAA1acAANWnAADXpwAA16cAANmnAADZpwAA8qcAAPSnAAD2pwAA9qcAAPinAAD6pwAAMKsAAFqrAABcqwAAaasAAHCrAAC/qwAAAPsAAAb7AAAT+wAAF/sAAEH/AABa/wAAKAQBAE8EAQDYBAEA+wQBAJcFAQChBQEAowUBALEFAQCzBQEAuQUBALsFAQC8BQEAgAcBAIAHAQCDBwEAhQcBAIcHAQCwBwEAsgcBALoHAQDADAEA8gwBAMAYAQDfGAEAYG4BAH9uAQAa1AEAM9QBAE7UAQBU1AEAVtQBAGfUAQCC1AEAm9QBALbUAQC51AEAu9QBALvUAQC91AEAw9QBAMXUAQDP1AEA6tQBAAPVAQAe1QEAN9UBAFLVAQBr1QEAhtUBAJ/VAQC61QEA09UBAO7VAQAH1gEAItYBADvWAQBW1gEAb9YBAIrWAQCl1gEAwtYBANrWAQDc1gEA4dYBAPzWAQAU1wEAFtcBABvXAQA21wEATtcBAFDXAQBV1wEAcNcBAIjXAQCK1wEAj9cBAKrXAQDC1wEAxNcBAMnX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AABmHgAAaB4AAGgeAABqHgAAah4AAGweAABsHgAAbh4AAG4eAABwHgAAcB4AAHIeAAByHgAAdB4AAHQeAAB2HgAAdh4AAHgeAAB4HgAAeh4AAHoeAAB8HgAAfB4AAH4eAAB+HgAAgB4AAIAeAACCHgAAgh4AAIQeAACEHgAAhh4AAIYeAACIHgAAiB4AAIoeAACKHgAAjB4AAIweAACOHgAAjh4AAJAeAACQHgAAkh4AAJIeAACUHgAAlB4AAJ4eAACeHgAAoB4AAKAeAACiHgAAoh4AAKQeAACkHgAAph4AAKYeAACoHgAAqB4AAKoeAACqHgAArB4AAKweAACuHgAArh4AALAeAACwHgAAsh4AALIeAAC0HgAAtB4AALYeAAC2HgAAuB4AALgeAAC6HgAAuh4AALweAAC8HgAAvh4AAL4eAADAHgAAwB4AAMIeAADCHgAAxB4AAMQeAADGHgAAxh4AAMgeAADIHgAAyh4AAMoeAADMHgAAzB4AAM4eAADOHgAA0B4AANAeAADSHgAA0h4AANQeAADUHgAA1h4AANYeAADYHgAA2B4AANoeAADaHgAA3B4AANweAADeHgAA3h4AAOAeAADgHgAA4h4AAOIeAADkHgAA5B4AAOYeAADmHgAA6B4AAOgeAADqHgAA6h4AAOweAADsHgAA7h4AAO4eAADwHgAA8B4AAPIeAADyHgAA9B4AAPQeAAD2HgAA9h4AAPgeAAD4HgAA+h4AAPoeAAD8HgAA/B4AAP4eAAD+HgAACB8AAA8fAAAYHwAAHR8AACgfAAAvHwAAOB8AAD8fAABIHwAATR8AAFkfAABZHwAAWx8AAFsfAABdHwAAXR8AAF8fAABfHwAAaB8AAG8fAAC4HwAAux8AAMgfAADLHwAA2B8AANsfAADoHwAA7B8AAPgfAAD7HwAAAiEAAAIhAAAHIQAAByEAAAshAAANIQAAECEAABIhAAAVIQAAFSEAABkhAAAdIQAAJCEAACQhAAAmIQAAJiEAACghAAAoIQAAKiEAAC0hAAAwIQAAMyEAAD4hAAA/IQAARSEAAEUhAABgIQAAbyEAAIMhAACDIQAAtiQAAM8kAAAALAAALywAAGAsAABgLAAAYiwAAGQsAABnLAAAZywAAGksAABpLAAAaywAAGssAABtLAAAcCwAAHIsAAByLAAAdSwAAHUsAAB+LAAAgCwAAIIsAACCLAAAhCwAAIQsAACGLAAAhiwAAIgsAACILAAAiiwAAIosAACMLAAAjCwAAI4sAACOLAAAkCwAAJAsAACSLAAAkiwAAJQsAACULAAAliwAAJYsAACYLAAAmCwAAJosAACaLAAAnCwAAJwsAACeLAAAniwAAKAsAACgLAAAoiwAAKIsAACkLAAApCwAAKYsAACmLAAAqCwAAKgsAACqLAAAqiwAAKwsAACsLAAAriwAAK4sAACwLAAAsCwAALIsAACyLAAAtCwAALQsAAC2LAAAtiwAALgsAAC4LAAAuiwAALosAAC8LAAAvCwAAL4sAAC+LAAAwCwAAMAsAADCLAAAwiwAAMQsAADELAAAxiwAAMYsAADILAAAyCwAAMosAADKLAAAzCwAAMwsAADOLAAAziwAANAsAADQLAAA0iwAANIsAADULAAA1CwAANYsAADWLAAA2CwAANgsAADaLAAA2iwAANwsAADcLAAA3iwAAN4sAADgLAAA4CwAAOIsAADiLAAA6ywAAOssAADtLAAA7SwAAPIsAADyLAAAQKYAAECmAABCpgAAQqYAAESmAABEpgAARqYAAEamAABIpgAASKYAAEqmAABKpgAATKYAAEymAABOpgAATqYAAFCmAABQpgAAUqYAAFKmAABUpgAAVKYAAFamAABWpgAAWKYAAFimAABapgAAWqYAAFymAABcpgAAXqYAAF6mAABgpgAAYKYAAGKmAABipgAAZKYAAGSmAABmpgAAZqYAAGimAABopgAAaqYAAGqmAABspgAAbKYAAICmAACApgAAgqYAAIKmAACEpgAAhKYAAIamAACGpgAAiKYAAIimAACKpgAAiqYAAIymAACMpgAAjqYAAI6mAACQpgAAkKYAAJKmAACSpgAAlKYAAJSmAACWpgAAlqYAAJimAACYpgAAmqYAAJqmAAAipwAAIqcAACSnAAAkpwAAJqcAACanAAAopwAAKKcAACqnAAAqpwAALKcAACynAAAupwAALqcAADKnAAAypwAANKcAADSnAAA2pwAANqcAADinAAA4pwAAOqcAADqnAAA8pwAAPKcAAD6nAAA+pwAAQKcAAECnAABCpwAAQqcAAESnAABEpwAARqcAAEanAABIpwAASKcAAEqnAABKpwAATKcAAEynAABOpwAATqcAAFCn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AABZBQAAYAUAAIgFAADQBQAA6gUAAO8FAADyBQAAIAYAAEoGAABuBgAAbwYAAHEGAADTBgAA1QYAANUGAADlBgAA5gYAAO4GAADvBgAA+gYAAPwGAAD/BgAA/wYAABAHAAAQBwAAEgcAAC8HAABNBwAApQcAALEHAACxBwAAygcAAOoHAAD0BwAA9QcAAPoHAAD6BwAAAAgAABUIAAAaCAAAGggAACQIAAAkCAAAKAgAACgIAABACAAAWAgAAGAIAABqCAAAcAgAAIcIAACJCAAAjggAAKAIAADJCAAABAkAADkJAAA9CQAAPQkAAFAJAABQCQAAWAkAAGEJAABxCQAAgAkAAIUJAACMCQAAjwkAAJAJAACTCQAAqAkAAKoJAACwCQAAsgkAALIJAAC2CQAAuQkAAL0JAAC9CQAAzgkAAM4JAADcCQAA3QkAAN8JAADhCQAA8AkAAPEJAAD8CQAA/AkAAAUKAAAKCgAADwoAABAKAAATCgAAKAoAACoKAAAwCgAAMgoAADMKAAA1CgAANgoAADgKAAA5CgAAWQoAAFwKAABeCgAAXgoAAHIKAAB0CgAAhQoAAI0KAACPCgAAkQoAAJMKAACoCgAAqgoAALAKAACyCgAAswoAALUKAAC5CgAAvQoAAL0KAADQCgAA0AoAAOAKAADhCgAA+QoAAPkKAAAFCwAADAsAAA8LAAAQCwAAEwsAACgLAAAqCwAAMAsAADILAAAzCwAANQsAADkLAAA9CwAAPQsAAFwLAABdCwAAXwsAAGELAABxCwAAcQsAAIMLAACDCwAAhQsAAIoLAACOCwAAkAsAAJILAACVCwAAmQsAAJoLAACcCwAAnAsAAJ4LAACfCwAAowsAAKQLAACoCwAAqgsAAK4LAAC5CwAA0AsAANALAAAFDAAADAwAAA4MAAAQDAAAEgwAACgMAAAqDAAAOQwAAD0MAAA9DAAAWAwAAFoMAABdDAAAXQwAAGAMAABhDAAAgAwAAIAMAACFDAAAjAwAAI4MAACQDAAAkgwAAKgMAACqDAAAswwAALUMAAC5DAAAvQwAAL0MAADdDAAA3gwAAOAMAADhDAAA8QwAAPIMAAAEDQAADA0AAA4NAAAQDQAAEg0AADoNAAA9DQAAPQ0AAE4NAABODQAAVA0AAFYNAABfDQAAYQ0AAHoNAAB/DQAAhQ0AAJYN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AQA22gEAO9oBAGzaAQB12gEAddoBAITaAQCE2gEAm9oBAJ/aAQCh2gEAr9oBAADgAQAG4AEACOABABjgAQAb4AEAIeABACPgAQAk4AEAJuABACrgAQCP4AEAj+ABADDhAQA24QEAruIBAK7iAQDs4gEA7+IBAOzkAQDv5AEA0OgBANboAQBE6QEASukBAPvzAQD/8wEAIAAOAH8ADgAAAQ4A7wEOAAARAABfEQAAYKkAAHypAAAKAAAACgAAAACsAAAArAAAHKwAABysAAA4rAAAOKwAAFSsAABUrAAAcKwAAHCsAACMrAAAjKwAAKisAACorAAAxKwAAMSsAADgrAAA4KwAAPysAAD8rAAAGK0AABitAAA0rQAANK0AAFCtAABQrQAAbK0AAGytAACIrQAAiK0AAKStAACkrQAAwK0AAMCtAADcrQAA3K0AAPitAAD4rQAAFK4AABSuAAAwrgAAMK4AAEyuAABMrgAAaK4AAGiuAACErgAAhK4AAKCuAACgrgAAvK4AALyuAADYrgAA2K4AAPSuAAD0rgAAEK8AABCvAAAsrwAALK8AAEivAABIrwAAZK8AAGSvAACArwAAgK8AAJyvAACcrwAAuK8AALivAADUrwAA1K8AAPCvAADwrwAADLAAAAywAAAosAAAKLAAAESwAABEsAAAYLAAAGCwAAB8sAAAfLAAAJiwAACYsAAAtLAAALSwAADQsAAA0LAAAOywAADssAAACLEAAAixAAAksQAAJLEAAECxAABAsQAAXLEAAFyxAAB4sQAAeLEAAJSxAACUsQAAsLEAALCxAADMsQAAzLEAAOixAADosQAABLIAAASyAAAgsgAAILIAADyyAAA8sgAAWLIAAFiyAAB0sgAAdLIAAJCyAACQsgAArLIAAKyyAADIsgAAyLIAAOSyAADksgAAALMAAACzAAAcswAAHLMAADizAAA4swAAVLMAAFSzAABwswAAcLMAAIyzAACMswAAqLMAAKizAADEswAAxLMAAOCzAADgswAA/LMAAPyzAAAYtAAAGLQAADS0AAA0tAAAULQAAFC0AABstAAAbLQAAIi0AACItAAApLQAAKS0AADAtAAAwLQAANy0AADctAAA+LQAAPi0AAAUtQAAFLUAADC1AAAwtQAATLUAAEy1AABotQAAaLUAAIS1AACEtQAAoLUAAKC1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AABYzgAAWM4AAHTOAAB0zgAAkM4AAJDOAACszgAArM4AAMjOAADIzgAA5M4AAOTOAAAAzwAAAM8AABzPAAAczwAAOM8AADjPAABUzwAAVM8AAHDPAABwzwAAjM8AAIzPAACozwAAqM8AAMTPAADEzwAA4M8AAODPAAD8zwAA/M8AABjQAAAY0AAANNAAADTQAABQ0AAAUNAAAGzQAABs0AAAiNAAAIjQAACk0AAApNAAAMDQAADA0AAA3NAAANzQAAD40AAA+NAAABTRAAAU0QAAMNEAADDRAABM0QAATNEAAGjRAABo0QAAhNEAAITRAACg0QAAoNEAALzRAAC80QAA2NEAANjRAAD00QAA9NEAABDSAAAQ0gAALNIAACzSAABI0gAASNIAAGTSAABk0gAAgNIAAIDSAACc0gAAnNIAALjSAAC40gAA1NIAANTSAADw0gAA8NIAAAzTAAAM0wAAKNMAACjTAABE0wAARNMAAGDTAABg0wAAfNMAAHzTAACY0wAAmNMAALTTAAC00wAA0NMAANDTAADs0wAA7NMAAAjUAAAI1AAAJNQAACTUAABA1AAAQNQAAFzUAABc1AAAeNQAAHjUAACU1AAAlNQAALDUAACw1AAAzNQAAMzUAADo1AAA6NQAAATVAAAE1QAAINUAACDVAAA81QAAPNUAAFjVAABY1QAAdNUAAHTVAACQ1QAAkNUAAKzVAACs1QAAyNUAAMjVAADk1QAA5NUAAADWAAAA1gAAHNYAABzWAAA41gAAONYAAFTWAABU1gAAcNYAAHDWAACM1gAAjNYAAKjWAACo1gAAxNYAAMTWAADg1gAA4NYAAPzWAAD81gAAGNcAABjXAAA01wAANNcAAFDXAABQ1wAAbNcAAGzXAACI1wAAiNcAAAGsAAAbrAAAHawAADesAAA5rAAAU6wAAFWsAABvrAAAcawAAIusAACNrAAAp6wAAKmsAADDrAAAxawAAN+sAADhrAAA+6wAAP2sAAAXrQAAGa0AADOtAAA1rQAAT60AAFGtAABrrQAAba0AAIetAACJrQAAo60AAKWtAAC/rQAAwa0AANutAADdrQAA960AAPmtAAATrgAAFa4AAC+uAAAxrgAAS64AAE2uAABnrgAAaa4AAIOuAACFrgAAn64AAKGuAAC7rgAAva4AANeuAADZrgAA864AAPWuAAAPrwAAEa8AACuvAAAtrwAAR68AAEmvAABjrwAAZa8AAH+vAACBrwAAm68AAJ2vAAC3rwAAua8AANOvAADVrwAA768AAPGvAAALsAAADbAAACewAAApsAAAQ7AAAEWwAABfsAAAYbAAAHuwAAB9sAAAl7AAAJmwAACzsAAAtbAAAM+wAADRsAAA67AAAO2wAAAHsQAACbEAACOxAAAlsQAAP7EAAEGxAABbsQAAXbEAAHexAAB5sQAAk7EAAJWxAACvsQAAsbEAAMuxAADNsQAA57EAAOmxAAADsgAABbIAAB+yAAAhsgAAO7IAAD2yAABXsgAAWbIAAHOyAAB1sgAAj7IAAJGyAACrsgAArbIAAMeyAADJsgAA47IAAOWyAAD/sgAAAbMAABuzAAAdswAAN7MAADmzAABTswAAVbMAAG+zAABxswAAi7MAAI2zAACnswAAqbMAAMOzAADFswAA37MAAOGzAAD7swAA/bMAABe0AAAZtAAAM7QAADW0AABPtAAAUbQAAGu0AABttAAAh7QAAIm0AACjtAAApbQAAL+0AADBtAAA27QAAN20AAD3tAAA+bQAABO1AAAVtQAAL7UAADG1AABLtQAATbUAAGe1AABptQAAg7UAAIW1AACftQAAobUAALu1AAC9tQAA17UAANm1AADztQAA9bUAAA+2AAARtgAAK7YAAC22AABHtgAASbYAAGO2AABltgAAf7YAAIG2AACbtgAAnbYAALe2AAC5tgAA07YAANW2AADvtgAA8bYAAAu3AAANtwAAJ7cAACm3AABDtwAARbcAAF+3AABhtwAAe7cAAH23AACXtwAAmbcAALO3AAC1twAAz7cAANG3AADrtwAA7bcAAAe4AAAJuAAAI7gAACW4AAA/uAAAQbgAAFu4AABduAAAd7gAAHm4AACTuAAAlbgAAK+4AACxuAAAy7gAAM24AADnuAAA6bgAAAO5AAAFuQAAH7kAACG5AAA7uQAAPbkAAFe5AABZuQAAc7kAAHW5AACPuQAAkbkAAKu5AACtuQAAx7kAAMm5AADjuQAA5bkAAP+5AAABugAAG7oAAB26AAA3ugAAOboAAFO6AABVugAAb7oAAHG6AACLugAAjboAAKe6AACpugAAw7oAAMW6AADfugAA4boAAPu6AAD9ugAAF7sAABm7AAAzuwAANbsAAE+7AABRuwAAa7sAAG27AACHuwAAibsAAKO7AACluwAAv7sAAMG7AADbuwAA3bsAAPe7AAD5uwAAE7wAABW8AAAvvAAAMbwAAEu8AABNvAAAZ7wAAGm8AACDvAAAhbwAAJ+8AAChvAAAu7wAAL28AADXvAAA2bwAAPO8AAD1vAAAD70AABG9AAArvQAALb0AAEe9AABJvQAAY70AAGW9AAB/vQAAgb0AAJu9AACdvQAAt70AALm9AADTvQAA1b0AAO+9AADxvQAAC74AAA2+AAAnvgAAKb4AAEO+AABFvgAAX74AAGG+AAB7vgAAfb4AAJe+AACZvgAAs74AALW+AADPvgAA0b4AAOu+AADtvgAAB78AAAm/AAAjvwAAJb8AAD+/AABBvwAAW78AAF2/AAB3vwAAeb8AAJO/AACVvwAAr78AALG/AADLvwAAzb8AAOe/AADpvwAAA8AAAAXAAAAfwAAAIcAAADvAAAA9wAAAV8AAAFnAAABzwAAAdcAAAI/AAACRwAAAq8AAAK3AAADHwAAAycAAAOPAAADlwAAA/8AAAAHBAAAbwQAAHcEAADfBAAA5wQAAU8EAAFXBAABvwQAAccEAAIvBAACNwQAAp8EAAKnBAADDwQAAxcEAAN/BAADhwQAA+8EAAP3BAAAXwgAAGcIAADPCAAA1wgAAT8IAAFHCAABrwgAAbcIAAIfCAACJwgAAo8IAAKXCAAC/wgAAwcIAANvCAADdwgAA98IAAPnCAAATwwAAFcMAAC/DAAAxwwAAS8MAAE3DAABnwwAAacMAAIPDAACFwwAAn8MAAKHDAAC7wwAAvcMAANfDAADZwwAA88MAAPXDAAAPxAAAEcQAACvEAAAtxAAAR8QAAEnEAABjxAAAZcQAAH/EAACBxAAAm8QAAJ3EAAC3xAAAucQAANPEAADVxAAA78QAAPHEAAALxQAADcUAACfFAAApxQAAQ8UAAEXFAABfxQAAYcUAAHvFAAB9xQAAl8UAAJnFAACzxQAAtcUAAM/FAADRxQAA68UAAO3FAAAHxgAACcYAACPGAAAlxgAAP8YAAEHGAABbxgAAXcYAAHfGAAB5xgAAk8YAAJXGAACvxgAAscYAAMvGAADNxgAA58YAAOnGAAADxwAABccAAB/HAAAhxwAAO8cAAD3HAABXxwAAWccAAHPHAAB1xwAAj8cAAJHHAACrxwAArccAAMfHAADJxwAA48cAAOXHAAD/xwAAAcgAABvIAAAdyAAAN8gAADnIAABTyAAAVcgAAG/IAABxyAAAi8gAAI3IAACnyAAAqcgAAMPIAADFyAAA38gAAOHIAAD7yAAA/cgAABfJAAAZyQAAM8kAADXJAABPyQAAUckAAGvJAABtyQAAh8kAAInJAACjyQAApckAAL/JAADByQAA28kAAN3JAAD3yQAA+ckAABPKAAAVygAAL8oAADHKAABLygAATcoAAGfKAABpygAAg8oAAIXKAACfygAAocoAALvKAAC9ygAA18oAANnKAADzygAA9coAAA/LAAARywAAK8sAAC3LAABHywAAScsAAGPLAABlywAAf8sAAIHLAACbywAAncsAALfLAAC5ywAA08sAANXLAADvywAA8csAAAvMAAANzAAAJ8wAACnMAABDzAAARcwAAF/MAABhzAAAe8wAAH3MAACXzAAAmcwAALPMAAC1zAAAz8wAANHMAADrzAAA7cwAAAfNAAAJzQAAI80AACXNAAA/zQAAQc0AAFvNAABdzQAAd80AAHnNAACTzQAAlc0AAK/NAACxzQAAy80AAM3NAADnzQAA6c0AAAPOAAAFzgAAH84AACHOAAA7zgAAPc4AAFfOAABZzgAAc84AAHXOAACPzgAAkc4AAKvOAACtzgAAx84AAMnOAADjzgAA5c4AAP/OAAABzwAAG88AAB3PAAA3zwAAOc8AAFPPAABVzwAAb88AAHHPAACLzwAAjc8AAKfPAACpzwAAw88AAMXPAADfzwAA4c8AAPvPAAD9zwAAF9AAABnQAAAz0AAANdAAAE/QAABR0AAAa9AAAG3QAACH0AAAidAAAKPQAACl0AAAv9AAAMHQAADb0AAA3dAAAPfQAAD50AAAE9EAABXRAAAv0QAAMdEAAEvRAABN0QAAZ9EAAGnRAACD0QAAhdEAAJ/RAACh0QAAu9EAAL3RAADX0QAA2dEAAPPRAAD10QAAD9IAABHSAAAr0gAALdIAAEfSAABJ0gAAY9IAAGXSAAB/0gAAgdIAAJvSAACd0gAAt9IAALnSAADT0gAA1dIAAO/SAADx0gAAC9MAAA3TAAAn0wAAKdMAAEPTAABF0wAAX9MAAGHTAAB70wAAfdMAAJfTAACZ0wAAs9MAALXTAADP0wAA0dMAAOvT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AAA5CwAAPQsAAD0LAABcCwAAXQsAAF8LAABhCwAAcQsAAHELAACDCwAAgwsAAIULAACKCwAAjgsAAJALAACSCwAAlQsAAJkLAACaCwAAnAsAAJwLAACeCwAAnwsAAKMLAACkCwAAqAsAAKoLAACuCwAAuQsAANALAADQCwAABQwAAAwMAAAODAAAEAwAABIMAAAoDAAAKgwAADkMAAA9DAAAPQwAAFgMAABaDAAAXQwAAF0MAABgDAAAYQwAAIAMAACADAAAhQwAAIwMAACODAAAkAwAAJIMAACoDAAAqgwAALMMAAC1DAAAuQwAAL0MAAC9DAAA3QwAAN4MAADgDAAA4QwAAPEMAADyDAAABA0AAAwNAAAODQAAEA0AABINAAA6DQAAPQ0AAD0NAABODQAATg0AAFQNAABWDQAAXw0AAGENAAB6DQAAfw0AAIUNAACWDQAAmg0AALENAACzDQAAuw0AAL0NAAC9DQAAwA0AAMYNAAAADwAAAA8AAEAPAABHDwAASQ8AAGwPAACIDwAAjA8AAKAQAADFEAAAxxAAAMcQAADNEAAAzRAAANAQAAD6EAAA/BAAAEgSAABKEgAATRIAAFASAABWEgAAWBIAAFgSAABaEgAAXRIAAGASAACIEgAAihIAAI0SAACQEgAAsBIAALISAAC1EgAAuBIAAL4SAADAEgAAwBIAAMISAADFEgAAyBIAANYSAADYEgAAEBMAABITAAAVEwAAGBMAAFoTAACAEwAAjxMAAKATAAD1EwAA+BMAAP0TAAABFAAAbBYAAG8WAAB/FgAAgRYAAJoWAACgFgAA6hYAAO4WAAD4FgAAABcAABEXAAAfFwAAMRcAAEAXAABRFwAAYBcAAGwXAABuFwAAcBcAACAYAAB4GAAAgBgAAIQYAACHGAAAqBgAAKoYAACqGAAAsBgAAPUYAAAAGQAAHhkAAAAaAAAWGgAABRsAADMbAABFGwAATBsAAIMbAACgGwAArhsAAK8bAAC6GwAA5RsAAAAcAAAjHAAATRwAAE8cAABaHAAAfRwAAIAcAACIHAAAkBwAALocAAC9HAAAvxwAAOkcAADsHAAA7hwAAPMcAAD1HAAA9hwAAPocAAD6HAAAAB0AAL8dAAAAHgAAFR8AABgfAAAdHwAAIB8AAEUfAABIHwAATR8AAFAfAABXHwAAWR8AAFkf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AABFHgAARR4AAEceAABHHgAASR4AAEkeAABLHgAASx4AAE0eAABNHgAATx4AAE8eAABRHgAAUR4AAFMeAABTHgAAVR4AAFUeAABXHgAAVx4AAFkeAABZHgAAWx4AAFseAABdHgAAXR4AAF8eAABfHgAAYR4AAGEeAABjHgAAYx4AAGUeAABlHgAAZx4AAGceAABpHgAAaR4AAGseAABrHgAAbR4AAG0eAABvHgAAbx4AAHEeAABxHgAAcx4AAHMeAAB1HgAAdR4AAHceAAB3HgAAeR4AAHkeAAB7HgAAex4AAH0eAAB9HgAAfx4AAH8eAACBHgAAgR4AAIMeAACDHgAAhR4AAIUeAACHHgAAhx4AAIkeAACJHgAAix4AAIseAACNHgAAjR4AAI8eAACPHgAAkR4AAJEeAACTHgAAkx4AAJUeAACdHgAAnx4AAJ8eAAChHgAAoR4AAKMeAACjHgAApR4AAKUeAACnHgAApx4AAKkeAACpHgAAqx4AAKseAACtHgAArR4AAK8eAACvHgAAsR4AALEeAACzHgAAsx4AALUeAAC1HgAAtx4AALceAAC5HgAAuR4AALseAAC7HgAAvR4AAL0eAAC/HgAAvx4AAMEeAADBHgAAwx4AAMMeAADFHgAAxR4AAMceAADHHgAAyR4AAMkeAADLHgAAyx4AAM0eAADNHgAAzx4AAM8eAADRHgAA0R4AANMeAADTHgAA1R4AANUeAADXHgAA1x4AANkeAADZHgAA2x4AANseAADdHgAA3R4AAN8eAADfHgAA4R4AAOEeAADjHgAA4x4AAOUeAADlHgAA5x4AAOceAADpHgAA6R4AAOseAADrHgAA7R4AAO0eAADvHgAA7x4AAPEeAADxHgAA8x4AAPMeAAD1HgAA9R4AAPceAAD3HgAA+R4AAPkeAAD7HgAA+x4AAP0eAAD9HgAA/x4AAAcfAAAQHwAAFR8AACAfAAAnHwAAMB8AADcfAABAHwAARR8AAFAfAABXHwAAYB8AAGcfAABwHwAAfR8AAIAfAACHHwAAkB8AAJcfAACgHwAApx8AALAfAAC0HwAAth8AALcfAAC+HwAAvh8AAMIfAADEHwAAxh8AAMcfAADQHwAA0x8AANYfAADXHwAA4B8AAOcfAADyHwAA9B8AAPYfAAD3HwAAcSAAAHEgAAB/IAAAfyAAAJAgAACcIAAACiEAAAohAAAOIQAADyEAABMhAAATIQAALyEAAC8hAAA0IQAANCEAADkhAAA5IQAAPCEAAD0hAABGIQAASSEAAE4hAABOIQAAcCEAAH8hAACEIQAAhCEAANAkAADpJAAAMCwAAF8sAABhLAAAYSwAAGUsAABmLAAAaCwAAGgsAABqLAAAaiwAAGwsAABsLAAAcSwAAHEsAABzLAAAdCwAAHYsAAB9LAAAgSwAAIEsAACDLAAAgywAAIUsAACFLAAAhywAAIcsAACJLAAAiSwAAIssAACLLAAAjSwAAI0sAACPLAAAjywAAJEsAACRLAAAkywAAJMsAACVLAAAlSwAAJcsAACXLAAAmSwAAJksAACbLAAAmywAAJ0sAACdLAAAnywAAJ8sAAChLAAAoSwAAKMsAACjLAAApSwAAKUsAACnLAAApywAAKksAACpLAAAqywAAKssAACtLAAArSwAAK8sAACvLAAAsSwAALEsAACzLAAAsywAALUsAAC1LAAAtywAALcsAAC5LAAAuSwAALssAAC7LAAAvSwAAL0sAAC/LAAAvywAAMEsAADBLAAAwywAAMMsAADFLAAAxSwAAMcsAADHLAAAySwAAMksAADLLAAAyywAAM0sAADNLAAAzywAAM8sAADRLAAA0SwAANMsAADTLAAA1SwAANUsAADXLAAA1ywAANksAADZLAAA2ywAANssAADdLAAA3SwAAN8sAADfLAAA4SwAAOEsAADjLAAA5CwAAOwsAADsLAAA7iwAAO4sAADzLAAA8ywAAAAtAAAlLQAAJy0AACctAAAtLQAALS0AAEGmAABBpgAAQ6YAAEOmAABFpgAARaYAAEemAABHpgAASaYAAEmmAABLpgAAS6YAAE2mAABNpgAAT6YAAE+mAABRpgAAUaYAAFOmAABTpgAAVaYAAFWmAABXpgAAV6YAAFmmAABZpgAAW6YAAFumAABdpgAAXaYAAF+mAABfpgAAYaYAAGGmAABjpgAAY6YAAGWmAABlpgAAZ6YAAGemAABppgAAaaYAAGumAABrpgAAbaYAAG2mAACBpgAAgaYAAIOmAACDpgAAhaYAAIWmAACHpgAAh6YAAImmAACJpgAAi6YAAIumAACNpgAAjaYAAI+mAACPpgAAkaYAAJGmAACTpgAAk6YAAJWmAACVpgAAl6YAAJemAACZpgAAmaYAAJumAACdpgAAI6cAACOnAAAlpwAAJacAACenAAAnpwAAKacAACmnAAArpwAAK6cAAC2nAAAtpwAAL6cAADGnAAAzpwAAM6cAADWnAAA1pwAAN6cAADenAAA5pwAAOacAADunAAA7pwAAPacAAD2nAAA/pwAAP6cAAEGnAABBpwAAQ6cAAEOnAABFpwAARacAAEenAABHpwAASacAAEmnAABLpwAAS6cAAE2nAABNpwAAT6cAAE+nAABRpwAAUacAAFOnAABTpwAAVacAAFWnAABXpwAAV6cAAFmnAABZpwAAW6cAAFunAABdpwAAXacAAF+nAABfpwAAYacAAGGnAABjpwAAY6cAAGWnAABlpwAAZ6cAAGenAABppwAAaacAAGunAABrpwAAbacAAG2nAABvpwAAeKcAAHqnAAB6pwAAfKcAAHynAAB/pwAAf6cAAIGnAACBpwAAg6cAAIOnAACFpwAAhacAAIenAACHpwAAjKcAAIynAACOpwAAjqcAAJGnAACRpwAAk6cAAJWnAACXpwAAl6cAAJmnAACZpwAAm6cAAJunAACdpwAAnacAAJ+nAACfpwAAoacAAKGnAACjpwAAo6cAAKWnAAClpwAAp6cAAKenAACppwAAqacAAK+nAACvpwAAtacAALWnAAC3pwAAt6cAALmnAAC5pwAAu6cAALunAAC9pwAAvacAAL+nAAC/pwAAwacAAMGnAADDpwAAw6cAAMinAADIpwAAyqcAAMqnAADRpwAA0acAANOnAADTpwAA1acAANWnAADXpwAA16cAANmnAADZpwAA8qcAAPSnAAD2pwAA9qcAAPinAAD6pwAAMKsAAFqrAABcqwAAaasAAHCrAAC/qwAAAPsAAAb7AAAT+wAAF/sAAEH/AABa/wAAKAQBAE8EAQDYBAEA+wQBAJcFAQChBQEAowUBALEFAQCzBQEAuQUBALsFAQC8BQEAgAcBAIAHAQCDBwEAhQcBAIcHAQCwBwEAsgcBALoHAQDADAEA8gwBAMAYAQDfGAEAYG4BAH9uAQAa1AEAM9QBAE7UAQBU1AEAVtQBAGfUAQCC1AEAm9QBALbUAQC51AEAu9QBALvUAQC91AEAw9QBAMXUAQDP1AEA6tQBAAPVAQAe1QEAN9UBAFLVAQBr1QEAhtUBAJ/VAQC61QEA09UBAO7V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AADsHgAA7h4AAO4eAADwHgAA8B4AAPIeAADyHgAA9B4AAPQeAAD2HgAA9h4AAPgeAAD4HgAA+h4AAPoeAAD8HgAA/B4AAP4eAAD+HgAACB8AAA8fAAAYHwAAHR8AACgfAAAvHwAAOB8AAD8fAABIHwAATR8AAFkfAABZHwAAWx8AAFsfAABdHwAAXR8AAF8fAABfHwAAaB8AAG8fAACIHwAAjx8AAJgfAACfHwAAqB8AAK8fAAC4HwAAvB8AAMgfAADMHwAA2B8AANsfAADoHwAA7B8AAPgfAAD8HwAAAiEAAAIhAAAHIQAAByEAAAshAAANIQAAECEAABIhAAAVIQAAFSEAABkhAAAdIQAAJCEAACQhAAAmIQAAJiEAACghAAAoIQAAKiEAAC0hAAAwIQAAMyEAAD4hAAA/IQAARSEAAEUhAABgIQAAbyEAAIMhAACDIQAAtiQAAM8kAAAALAAALywAAGAsAABgLAAAYiwAAGQsAABnLAAAZywAAGksAABpLAAAaywAAGssAABtLAAAcCwAAHIsAAByLAAAdSwAAHUsAAB+LAAAgCwAAIIsAACCLAAAhCwAAIQsAACGLAAAhiwAAIgsAACILAAAiiwAAIosAACMLAAAjCwAAI4sAACOLAAAkCwAAJAsAACSLAAAkiwAAJQsAACULAAAliwAAJYsAACYLAAAmCwAAJosAACaLAAAnCwAAJwsAACeLAAAniwAAKAsAACgLAAAoiwAAKIsAACkLAAApCwAAKYsAACmLAAAqCwAAKgsAACqLAAAqiwAAKwsAACsLAAAriwAAK4sAACwLAAAsCwAALIsAACyLAAAtCwAALQsAAC2LAAAtiwAALgsAAC4LAAAuiwAALosAAC8LAAAvCwAAL4sAAC+LAAAwCwAAMAsAADCLAAAwiwAAMQsAADELAAAxiwAAMYsAADILAAAyCwAAMosAADKLAAAzCwAAMwsAADOLAAAziwAANAsAADQLAAA0iwAANIsAADULAAA1CwAANYsAADWLAAA2CwAANgsAADaLAAA2iwAANwsAADcLAAA3iwAAN4sAADgLAAA4CwAAOIsAADiLAAA6ywAAOssAADtLAAA7SwAAPIsAADyLAAAQKYAAECmAABCpgAAQqYAAESmAABEpgAARqYAAEamAABIpgAASKYAAEqmAABKpgAATKYAAEymAABOpgAATqYAAFCmAABQpgAAUqYAAFKmAABUpgAAVKYAAFamAABWpgAAWKYAAFimAABapgAAWqYAAFymAABcpgAAXqYAAF6mAABgpgAAYKYAAGKmAABipgAAZKYAAGSmAABmpgAAZqYAAGimAABopgAAaqYAAGqmAABspgAAbKYAAICmAACApgAAgqYAAIKmAACEpgAAhKYAAIamAACGpgAAiKYAAIimAACKpgAAiqYAAIymAACMpgAAjqYAAI6mAACQpgAAkKYAAJKmAACSpgAAlKYAAJSmAACWpgAAlqYAAJimAACYpgAAmqYAAJqmAAAipwAAIqcAACSnAAAkpwAAJqcAACanAAAopwAAKKcAACqnAAAqpwAALKcAACynAAAupwAALqcAADKnAAAypwAANKcAADSnAAA2pwAANqcAADinAAA4pwAAOqcAADqnAAA8pwAAPKcAAD6nAAA+pwAAQKcAAECnAABCpwAAQqcAAESnAABEpwAARqcAAEanAABIpwAASKcAAEqnAABKpwAATKcAAEynAABOpwAATqcAAFCnAABQpwAAUqcAAFKnAABUpwAAVKcAAFanAABWpwAAWKcAAFinAABapwAAWqcAAFynAABcpwAAXqcAAF6nAABgpwAAYKcAAGKnAABipwAAZKcAAGSnAABmpwAAZqcAAGinAABopwAAaqcAAGqnAABspwAAbKcAAG6nAABupwAAeacAAHmnAAB7pwAAe6cAAH2nAAB+pwAAgKcAAICnAACCpwAAgqcAAISnAACEpwAAhqcAAIanAACLpwAAi6cAAI2nAACNpwAAkKcAAJCnAACSpwAAkqcAAJanAACWpwAAmKcAAJinAACapwAAmqcAAJynAACcpwAAnqcAAJ6nAACgpwAAoKcAAKKnAACipwAApKcAAKSnAACmpwAApqcAAKinAACopwAAqqcAAK6nAACwpwAAtKcAALanAAC2pwAAuKcAALinAAC6pwAAuqcAALynAAC8pwAAvqcAAL6nAADApwAAwKcAAMKnAADCpwAAxKcAAMenAADJpwAAyacAANCnAADQpwAA1qcAANanAADYpwAA2KcAAPWnAAD1pwAAIf8AADr/AAAABAEAJwQBALAEAQDTBAEAcAUBAHoFAQB8BQEAigUBAIwFAQCSBQEAlAUBAJUFAQCADAEAsgwBAKAY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Nldi/r1JZE79uBRA4ZBmTQTt+n0tXP2hPOcZyIwaYLAi1LxunFk+5YUwEPovIXhcKwlsigPwjV6nPBT4eymWM3YLB20EbDE20UsZ9tqze8BTzkiIBce9g8WeH9poUE1Y9IAtdWOcVnI7wxMQg6RgbjHheFJ8Q+xOCrQYAAAAAAgAAAAEAAAAGAQAABkEAAAaBAAAdW5pdGEgYm9vbGVhbmEgc3RyaW5nYnl0ZSBhcnJheWJvb2xlYW4gYGf+FQAJAAAAmhYYAAEAAABpbnRlZ2VyIGAAAACA/hUACQAAAJoWGAABAAAAZmxvYXRpbmcgcG9pbnQgYJz+FQAQAAAAmhYYAAEAAABjaGFyYWN0ZXIgYAC8/hUACwAAAJoWGAABAAAAc3RyaW5nIADY/hUABwAAAHVuaXQgdmFsdWVPcHRpb24gdmFsdWVuZXd0eXBlIHN0cnVjdHNlcXVlbmNldW5pdCB2YXJpYW50bmV3dHlwZSB2YXJpYW50dHVwbGUgdmFyaWFudHN0cnVjdCB2YXJpYW50ZXhwbGljaXQgcGFuaWMvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9zZXJkZS0xLjAuMjA4L3NyYy9kZS9tb2QucnMAAFj/FQBaAAAA7AgAABIAAACaFhgAAQAAAJoWGAABAAAAYCBvciBgAACaFhgAAQAAANT/FQAGAAAAmhYYAAEAAABvbmUgb2YgLjAAAADoAhYAXwAAAFgCAAAwAAAAFwMAAAwAAAAEAAAAVwMAAFgDAAAbBABBsIDYAAvxBgEAAAAbAwAARU9GIHdoaWxlIHBhcnNpbmcgYSBsaXN0RU9GIHdoaWxlIHBhcnNpbmcgYW4gb2JqZWN0RU9GIHdoaWxlIHBhcnNpbmcgYSBzdHJpbmdFT0Ygd2hpbGUgcGFyc2luZyBhIHZhbHVlZXhwZWN0ZWQgYDpgZXhwZWN0ZWQgYCxgIG9yIGBdYGV4cGVjdGVkIGAsYCBvciBgfWBleHBlY3RlZCBpZGVudGV4cGVjdGVkIHZhbHVlZXhwZWN0ZWQgYCJgaW52YWxpZCBlc2NhcGVpbnZhbGlkIG51bWJlcm51bWJlciBvdXQgb2YgcmFuZ2VpbnZhbGlkIHVuaWNvZGUgY29kZSBwb2ludGNvbnRyb2wgY2hhcmFjdGVyIChcdTAwMDAtXHUwMDFGKSBmb3VuZCB3aGlsZSBwYXJzaW5nIGEgc3RyaW5na2V5IG11c3QgYmUgYSBzdHJpbmdpbnZhbGlkIHZhbHVlOiBleHBlY3RlZCBrZXkgdG8gYmUgYSBudW1iZXIgaW4gcXVvdGVzZmxvYXQga2V5IG11c3QgYmUgZmluaXRlIChnb3QgTmFOIG9yICsvLWluZilsb25lIGxlYWRpbmcgc3Vycm9nYXRlIGluIGhleCBlc2NhcGV0cmFpbGluZyBjb21tYXRyYWlsaW5nIGNoYXJhY3RlcnN1bmV4cGVjdGVkIGVuZCBvZiBoZXggZXNjYXBlcmVjdXJzaW9uIGxpbWl0IGV4Y2VlZGVkIGF0IGxpbmUgIGNvbHVtbiAAAAABAAAAAAAAAGwCFgAJAAAAdQIWAAgAAABFcnJvcigsIGxpbmU6ICwgY29sdW1uOiCYAhYABgAAAJ4CFgAIAAAApgIWAAoAAADwyxgAAQAAABcDAAAMAAAABAAAAFcDAAAcBAAAGwQAAC9ydXN0Yy81NWEyMmQyYTYzMzM0ZTBmYWZmMDIwMmI3MmEzMWNlODMyYjU2MTI1L2xpYnJhcnkvYWxsb2Mvc3JjL2NvbGxlY3Rpb25zL2J0cmVlL25hdmlnYXRlLnJzAOgCFgBfAAAAxgAAACcAAADoAhYAXwAAABYCAAAvAAAA6AIWAF8AAAChAAAAJAAAAGludmFsaWQgdHlwZTogLCBleHBlY3RlZCAAAAB4AxYADgAAAIYDFgALAEGsh9gAC4sBAQAAAB0EAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9zZXJkZS13YXNtLWJpbmRnZW4tMC42LjUvc3JjL2xpYi5ycwAAtAMWAGIAAAA1AAAADgAAAExheW91dHNpemVhbGlnbgBBwIjYAAvyCQEAAADeAwAAL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvc21hcnRzdHJpbmctMS4wLjEvc3JjL2lubGluZS5ycwAASAQWAF4AAAArAAAAKwAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3NtYXJ0c3RyaW5nLTEuMC4xL3NyYy9ib3hlZC5ycwAAALgEFgBdAAAAQQAAAA4AAAC4BBYAXQAAAHYAAAAkAAAAaHR0cDpodHRwczoAAQAAAAAAAABGFBgAAQAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3NvdXJjZW1hcC05LjAuMC9zcmMvYnVpbGRlci5yc0Nhbm5vdCBzZXQgc291cmNlcyBmb3IgdG9tYnN0b25lIHNvdXJjZSBpZABUBRYAXQAAAHkAAAAJAAAAVAUWAF0AAAB9AAAAHQAAAEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky9JbmNsdWRlZEV4Y2x1ZGVkVW5ib3VuZGVkaW5kZXggIG91dCBvZiByYW5nZTogAABVBhYABgAAAFsGFgAPAAAAnwwWAFgAAAAxBgAAAwAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3d5ei0wLjUuMS9zcmMvY29tdS5yc4wGFgBUAAAAJwEAAAIAAAAwMDAxMDIwMzA0MDUwNjA3MDgwOTEwMTExMjEzMTQxNTE2MTcxODE5MjAyMTIyMjMyNDI1MjYyNzI4MjkzMDMxMzIzMzM0MzUzNjM3MzgzOTQwNDE0MjQzNDQ0NTQ2NDc0ODQ5NTA1MTUyNTM1NDU1NTY1NzU4NTk2MDYxNjI2MzY0NjU2NjY3Njg2OTcwNzE3MjczNzQ3NTc2Nzc3ODc5ODA4MTgyODM4NDg1ODY4Nzg4ODk5MDkxOTI5Mzk0OTU5Njk3OTg5OU51bGxQdHJFcnJvcmNhbm5vdCAgYml0cyBmcm9tIGEgLWJpdCByZWdpb24AxAcWAAcAAADoExgAAQAAAMsHFgANAAAA2AcWAAsAAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9iaXR2ZWMtMS4wLjEvc3JjL2ZpZWxkLnJzBAgWAFgAAAAOAgAAAgAAAGF0dGVtcHQgdG8gam9pbiBpbnRvIGNvbGxlY3Rpb24gd2l0aCBsZW4gPiB1c2l6ZTo6TUFYL3J1c3RjLzU1YTIyZDJhNjMzMzRlMGZhZmYwMjAyYjcyYTMxY2U4MzJiNTYxMjUvbGlicmFyeS9hbGxvYy9zcmMvc3RyLnJzAAAAoQgWAEgAAACaAAAACgAAAKEIFgBIAAAAsQAAABYAAADk6BcAYAAAABQAAAAPAAAAHgQAAAwAAAAEAAAAVwMAABwEAAAfBABBvJLYAAu2BgEAAAAbAwAAYmFkIGpzb246IAAARAkWAAoAAABsZWZ0b3ZlciBjdXIvc2hpZnQgaW4gdmxxIGRlY29kZVgJFgAgAAAAdmxxIGRlY29kZSBkaWQgbm90IHByb2R1Y2UgYW55IHZhbHVlcwAAAIAJFgAlAAAAdmxxIGRlY29kZSBjYXVzZWQgYW4gb3ZlcmZsb3cAAACwCRYAHQAAAGdvdCAgc2VnbWVudHMsIGV4cGVjdGVkIDQgb3IgNQAA2AkWAAQAAADcCRYAGgAAAGJhZCByZWZlcmVuY2UgdG8gc291cmNlICMAAAAIChYAGQAAAGJhZCByZWZlcmVuY2UgdG8gbmFtZSAjACwKFgAXAAAAZW5jb3VudGVyZWQgaW5jb21wYXRpYmxlIHNvdXJjZW1hcCBmb3JtYXQAAABMChYAKQAAAHRoZSBwcm92aWRlZCBkYXRhIFVSTCBpcyBpbnZhbGlkgAoWACAAAABjYW5ub3QgZmxhdHRlbiB0aGUgaW5kZXhlZCBzb3VyY2VtYXA6IAAAqAoWACYAAABpbnZhbGlkIG1hZ2ljIG51bWJlciBmb3IgcmFtIGJ1bmRsZQDYChYAIwAAAGludmFsaWQgbW9kdWxlIGluZGV4IGluIHJhbSBidW5kbGUAAAQLFgAiAAAAaW52YWxpZCByYW0gYnVuZGxlIG1vZHVsZSBlbnRyeQAwCxYAHwAAAG5vdCBhIHJhbSBidW5kbGVYCxYAEAAAAGludmFsaWQgcmFuZ2UgbWFwcGluZyBpbmRleDogAAAAcAsWAB0AAABpbnZhbGlkIGJhc2U2NCBjaGFyYWN0ZXI6IAAAmAsWABoAAAByYW5nZSAgb3V0IG9mIGJvdW5kczogAAC8CxYABgAAAMILFgAQAAAAL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvYml0dmVjLTEuMC4xL3NyYy9zbGljZS9hcGkucnPkCxYAXAAAAI4KAAABAAAAdTgAACAEAAAUAAAABAAAACEEAAAAAAAACAAAAAQAAAAiBABB/JjYAAuTBAEAAADeAwAA3DYYAEkAAADbBwAAKQAAAExheW91dEVycm9yL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvYml0dmVjLTEuMC4xL3NyYy9zbGljZS5ycwCfDBYAWAAAAE8BAAAjAAAAbG9hZEJpdFNwYW5FcnJvcjw+OjoMDRYADQAAABkNFgADAAAATWlzYWxpZ25lZFRvb0xvbmdUb29IaWdoTWlzYWxpZ25FcnJvcgAAAAEAAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9zb3VyY2VtYXAtOS4wLjAvc3JjL2VuY29kZXIucnNpbnZhbGlkIGJ5dGUAAABYDRYAXQAAACMAAAASAAAAaW52YWxpZCB1dGY4WA0WAF0AAABmAAAAIQAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3NlcmRlX2pzb24tMS4wLjEyNS9zcmMvc2VyLnJz8A0WAFwAAAALBgAAEgAAAPANFgBcAAAALggAADMAAAB1dXV1dXV1dWJ0bnVmcnV1dXV1dXV1dXV1dXV1dXV1dQAAIgBByJ3YAAsBXABB7J7YAAvKAfANFgBcAAAAIQgAAEAAAABcdGxpbmVjb2x1bW5vZmZzZXRtYXBuYW1lc21hcHBpbmdzdmVyc2lvbmZpbGVzb3VyY2Vzc291cmNlUm9vdHNvdXJjZXNDb250ZW50c2VjdGlvbnNyYW5nZU1hcHBpbmdzeF9mYWNlYm9va19vZmZzZXRzeF9tZXRyb19tb2R1bGVfcGF0aHN4X2ZhY2Vib29rX3NvdXJjZXNkZWJ1Z19pZAAAAB4EAAAMAAAABAAAAFcDAABYAwAAHwQAQcCg2AALshkBAAAAGwMAAAAAAAAEAAAABAAAACMEAAAvcnVzdC9kZXBzL2RsbWFsbG9jLTAuMi42L3NyYy9kbG1hbGxvYy5yc2Fzc2VydGlvbiBmYWlsZWQ6IHBzaXplID49IHNpemUgKyBtaW5fb3ZlcmhlYWQAWBAWACkAAACoBAAACQAAAGFzc2VydGlvbiBmYWlsZWQ6IHBzaXplIDw9IHNpemUgKyBtYXhfb3ZlcmhlYWQAAFgQFgApAAAArgQAAA0AAAB1c2Ugb2Ygc3RkOjp0aHJlYWQ6OmN1cnJlbnQoKSBpcyBub3QgcG9zc2libGUgYWZ0ZXIgdGhlIHRocmVhZCdzCiAgICAgICAgIGxvY2FsIGRhdGEgaGFzIGJlZW4gZGVzdHJveWVkAAARFgBnAAAAc3RkL3NyYy90aHJlYWQvY3VycmVudC5ycwAAAHARFgAZAAAA6wAAAAkAAABBY2Nlc3NFcnJvcnN0ZC9zcmMvdGhyZWFkL21vZC5yc2ZhaWxlZCB0byBnZW5lcmF0ZSB1bmlxdWUgdGhyZWFkIElEOiBiaXRzcGFjZSBleGhhdXN0ZWQAvBEWADcAAACnERYAFQAAAJEEAAANAAAAc3RkL3NyYy9iYWNrdHJhY2UucnN1bnN1cHBvcnRlZCBiYWNrdHJhY2VkaXNhYmxlZCBiYWNrdHJhY2UADBIWABQAAACKAQAAHQAAACQEAAAQAAAABAAAACUEAAAmBAAAZW50aXR5IG5vdCBmb3VuZHBlcm1pc3Npb24gZGVuaWVkY29ubmVjdGlvbiByZWZ1c2VkY29ubmVjdGlvbiByZXNldGhvc3QgdW5yZWFjaGFibGVuZXR3b3JrIHVucmVhY2hhYmxlY29ubmVjdGlvbiBhYm9ydGVkbm90IGNvbm5lY3RlZGFkZHJlc3MgaW4gdXNlYWRkcmVzcyBub3QgYXZhaWxhYmxlbmV0d29yayBkb3duYnJva2VuIHBpcGVlbnRpdHkgYWxyZWFkeSBleGlzdHNvcGVyYXRpb24gd291bGQgYmxvY2tub3QgYSBkaXJlY3RvcnlpcyBhIGRpcmVjdG9yeWRpcmVjdG9yeSBub3QgZW1wdHlyZWFkLW9ubHkgZmlsZXN5c3RlbSBvciBzdG9yYWdlIG1lZGl1bWZpbGVzeXN0ZW0gbG9vcCBvciBpbmRpcmVjdGlvbiBsaW1pdCAoZS5nLiBzeW1saW5rIGxvb3Apc3RhbGUgbmV0d29yayBmaWxlIGhhbmRsZWludmFsaWQgaW5wdXQgcGFyYW1ldGVyaW52YWxpZCBkYXRhdGltZWQgb3V0d3JpdGUgemVyb25vIHN0b3JhZ2Ugc3BhY2VzZWVrIG9uIHVuc2Vla2FibGUgZmlsZWZpbGVzeXN0ZW0gcXVvdGEgZXhjZWVkZWRmaWxlIHRvbyBsYXJnZXJlc291cmNlIGJ1c3lleGVjdXRhYmxlIGZpbGUgYnVzeWRlYWRsb2NrY3Jvc3MtZGV2aWNlIGxpbmsgb3IgcmVuYW1ldG9vIG1hbnkgbGlua3NpbnZhbGlkIGZpbGVuYW1lYXJndW1lbnQgbGlzdCB0b28gbG9uZ29wZXJhdGlvbiBpbnRlcnJ1cHRlZHVuc3VwcG9ydGVkdW5leHBlY3RlZCBlbmQgb2YgZmlsZW91dCBvZiBtZW1vcnlpbiBwcm9ncmVzc290aGVyIGVycm9ydW5jYXRlZ29yaXplZCBlcnJvck9zS2luZEN1c3RvbSAob3MgZXJyb3IgAAEAAAAAAAAAcBUWAAsAAADwyxgAAQAAADogc3RkL3NyYy9wYXRoLnJzAAAAlhUWAA8AAADSAgAAIQAAAJYVFgAPAAAA+QIAACwAAACWFRYADwAAAPsCAAAmAAAAlhUWAA8AAAAIAwAAJwAAAJYVFgAPAAAAFAMAACcAAACWFRYADwAAAH4DAAApAAAAlhUWAA8AAAB/AwAAKwAAAJYVFgAPAAAAlAMAAC8AAACWFRYADwAAAIwDAAAvAAAAlhUWAA8AAACaAwAAKwAAAHN0ZC9zcmMvc3luYy9sYXp5X2xvY2sucnMAAABIFhYAGQAAANAAAAATAAAAY2Fubm90IHJlY3Vyc2l2ZWx5IGFjcXVpcmUgbXV0ZXh0FhYAIAAAAHN0ZC9zcmMvc3lzL3N5bmMvbXV0ZXgvbm9fdGhyZWFkcy5yc5wWFgAkAAAAFAAAAAkAAABzdGQvc3JjL3N5bmMvb25jZS5yc9AWFgAUAAAA2QAAABQAAAA8dW5rbm93bj7vv71zdGQvc3JjLy4uLy4uL2JhY2t0cmFjZS9zcmMvc3ltYm9saXplL21vZC5ycwAXFgAsAAAAZwEAADAAAAABAAAAAAAAAJQVFgACAAAAIC0gAAEAAAAAAAAATBcWAAMAAAAgICAgICAgICAgICAgICAgICAgYXQgTm90Rm91bmRQZXJtaXNzaW9uRGVuaWVkQ29ubmVjdGlvblJlZnVzZWRDb25uZWN0aW9uUmVzZXRIb3N0VW5yZWFjaGFibGVOZXR3b3JrVW5yZWFjaGFibGVDb25uZWN0aW9uQWJvcnRlZE5vdENvbm5lY3RlZEFkZHJJblVzZUFkZHJOb3RBdmFpbGFibGVOZXR3b3JrRG93bkJyb2tlblBpcGVBbHJlYWR5RXhpc3RzV291bGRCbG9ja05vdEFEaXJlY3RvcnlJc0FEaXJlY3RvcnlEaXJlY3RvcnlOb3RFbXB0eVJlYWRPbmx5RmlsZXN5c3RlbUZpbGVzeXN0ZW1Mb29wU3RhbGVOZXR3b3JrRmlsZUhhbmRsZUludmFsaWRJbnB1dEludmFsaWREYXRhVGltZWRPdXRXcml0ZVplcm9TdG9yYWdlRnVsbE5vdFNlZWthYmxlRmlsZXN5c3RlbVF1b3RhRXhjZWVkZWRGaWxlVG9vTGFyZ2VSZXNvdXJjZUJ1c3lFeGVjdXRhYmxlRmlsZUJ1c3lEZWFkbG9ja0Nyb3NzZXNEZXZpY2VzVG9vTWFueUxpbmtzSW52YWxpZEZpbGVuYW1lQXJndW1lbnRMaXN0VG9vTG9uZ0ludGVycnVwdGVkVW5zdXBwb3J0ZWRVbmV4cGVjdGVkRW9mT3V0T2ZNZW1vcnlJblByb2dyZXNzT3RoZXJVbmNhdGVnb3JpemVkb3BlcmF0aW9uIHN1Y2Nlc3NmdWxPbmNlIGluc3RhbmNlIGhhcyBwcmV2aW91c2x5IGJlZW4gcG9pc29uZWSyGRYAKgAAAG9uZS10aW1lIGluaXRpYWxpemF0aW9uIG1heSBub3QgYmUgcGVyZm9ybWVkIHJlY3Vyc2l2ZWx55BkWADgAAAAQAAAAEQAAABIAAAAQAAAAEAAAABMAAAASAAAADQAAAA4AAAAVAAAADAAAAAsAAAAVAAAAFQAAAA8AAAAOAAAAEwAAACYAAAA4AAAAGQAAABcAAAAMAAAACQAAAAoAAAAQAAAAFwAAABkAAAAOAAAADQAAABQAAAAIAAAAGwAAAA4AAAAQAAAAFgAAABUAAAALAAAAFgAAAA0AAAALAAAACwAAABMAAABsEhYAfBIWAI0SFgCfEhYArxIWAL8SFgDSEhYA5BIWAPESFgD/EhYAFBMWACATFgArExYAQBMWAFUTFgBkExYAchMWAIUTFgCrExYA4xMWAPwTFgATFBYAHxQWACgUFgAyFBYAQhQWAFkUFgByFBYAgBQWAI0UFgChFBYAqRQWAMQUFgDSFBYA4hQWAPgUFgANFRYAGBUWAC4VFgA7FRYARhUWAFEVFgAIAAAAEAAAABEAAAAPAAAADwAAABIAAAARAAAADAAAAAkAAAAQAAAACwAAAAoAAAANAAAACgAAAA0AAAAMAAAAEQAAABIAAAAOAAAAFgAAAAwAAAALAAAACAAAAAkAAAALAAAACwAAABcAAAAMAAAADAAAABIAAAAIAAAADgAAAAwAAAAPAAAAEwAAAAsAAAALAAAADQAAAAsAAAAKAAAABQAAAA0AAAB2FxYAfhcWAI4XFgCfFxYArhcWAL0XFgDPFxYA4BcWAOwXFgD1FxYABRgWABAYFgAaGBYAJxgWADEYFgA+GBYAShgWAFsYFgBtGBYAexgWAJEYFgCdGBYAqBgWALAYFgC5GBYAxBgWAM8YFgDmGBYA8hgWAP4YFgAQGRYAGBkWACYZFgAyGRYAQRkWAFQZFgBfGRYAahkWAHcZFgCCGRYAjBkWAJEZFgAAAAAABAAAAAQAAAAnBAAAKAQAACkEAAAeBAAADAAAAAQAAABXAwAAHAQAAB8EAEH8udgACxYBAAAAGwMAAAAAAAAEAAAABAAAACoEAEGcutgAC8URAQAAACwEAAAtBAAALgQAAFDoFwBhAAAAHgEAACcAAABQ6BcAYQAAAEIBAAAnAAAAOiBicG9zID0gOyBsaW5lYnBvcyA9IAAAAQAAAAAAAABMHRYACQAAAFUdFgANAAAA5xMYAAEAAABQ6BcAYQAAAEMBAAARAAAAUOgXAGEAAABYAQAAPwAAAFDoFwBhAAAAeQEAAD8AAABtYXAuc3RhcnRfcG9zID0gOyB0b3RhbF9leHRyYV9ieXRlcyA9IDsgYnBvcyA9IAC0HRYAEAAAAMQdFgAWAAAA2h0WAAkAAABQ6BcAYQAAAOIDAAAJAAAAUOgXAGEAAAAfBAAAMAAAAFDoFwBhAAAACwQAADAAAABQ6BcAYQAAAEwEAAAQAAAAUOgXAGEAAAAMBQAAOgAAAFDoFwBhAAAALQUAACMAAABQ6BcAYQAAAGwFAAAQAAAATm9GaWxlRm9ybm8gZXJyb3JzIGVuY291bnRlcmVkIGV2ZW4gdGhvdWdoIGBkZWxheV9zcGFuX2J1Z2AgaXNzdWVkAAB1HhYAOQAAAJQkFgBhAAAAmAEAABEAAABlbmNvdW50ZXJlZCBlcnJvciB3aXRoIGAtWiB0cmVhdF9lcnJfYXNfYnVnAMgeFgArAAAAlCQWAGEAAABlAgAADQAAAE1hY2hpbmVBcHBsaWNhYmxlSGFzUGxhY2Vob2xkZXJzTWF5YmVJbmNvcnJlY3RVbnNwZWNpZmllZENvZGVTdWdnZXN0aW9uc3Vic3RpdHV0aW9uc21zZ3Nob3dfY29kZV93aGVuX2lubGluZWFwcGxpY2FiaWxpdHlTdWJzdGl0dXRpb25wYXJ0c1N1YnN0aXR1dGlvblBhcnRzbmlwcGV0AAAABQAAABMbGABLAAAAigcAACQAAABhc3NlcnRpb24gZmFpbGVkOiBzZWxmLmlzX2NoYXJfYm91bmRhcnkoZW5kKRMbGABLAAAAjAcAAAkAAAAAAAAADAAAAAQAAAAvBAAAMAQAAGFzc2VydGlvbiBmYWlsZWQ6IHN0YXJ0IDw9IGVuZC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3N3Y19jb21tb24tMS4wLjAvc3JjL2lucHV0LnJzAAAyIBYAXAAAAB8AAAAJAAAAL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvc3djX2NvbW1vbi0xLjAuMC9zcmMvY29tbWVudHMucnMAoCAWAF8AAACnAQAAFgAAAKAgFgBfAAAArAEAAA4AAACgIBYAXwAAALMBAAAnAAAAoCAWAF8AAAC/AQAAMgAAAKAgFgBfAAAAxwEAABYAAACgIBYAXwAAAMsBAAAWAAAAoCAWAF8AAADPAQAAFwAAAKAgFgBfAAAA1AEAAA4AAACgIBYAXwAAANsBAAAoAAAAoCAWAF8AAADnAQAAMwAAAKAgFgBfAAAA7wEAABcAAACgIBYAXwAAAPMBAAAXAAAAoCAWAF8AAAD5AQAALAAAAGNhbm5vdCBhZGQgcHVyZSBjb21tZW50IHRvIHplcm8gcG9zaXRpb27QIRYAKAAAAKAgFgBfAAAA9wEAAAkAAAAjX19AX18AAKAgFgBfAAAAMQIAAC0AAACgIBYAXwAAAGUCAAAuAAAA6CcWAGkAAADMAAAAHQAAAOgnFgBpAAAAewEAAC0AAADoJxYAaQAAADACAAA2AAAAAAAAAAQAAAAEAAAAFQEAAAAAAAAEAAAABAAAADEEAAAuLgAAAQAAAAAAAACIIhYAAgAAACBtYWNyb3M+OBQYAAEAAACcIhYACAAAADxxdW90ZSBleHBhbnNpb24+AAAAtCIWABEAAAA8YW5vbj4AANAiFgAGAAAAPG1hY3JvIGV4cGFuc2lvbj4AAADgIhYAEQAAADxwcm9jLW1hY3JvIHNvdXJjZSBjb2RlPvwiFgAYAAAAOBQYAAEAAAA7FBgAAQAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3N3Y19jb21tb24tMS4wLjAvc3JjL3N5bnRheF9wb3MucnNhc3NlcnRpb24gZmFpbGVkOiBsaW5lX2luZGV4IDwgc2VsZi5saW5lcy5sZW4oKSBhcyBpc2l6ZQAAACwjFgBhAAAAwQMAAAkAAAAEAAAAUHJpbWFyeVNwYW5MYWJlbEJ5dGVQb3NFcnJvciBjb25zdHJ1Y3RlZCBidXQgbm90IGVtaXR0ZWQvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9zd2NfY29tbW9uLTEuMC4wL3NyYy9lcnJvcnMvZGlhZ25vc3RpY19idWlsZGVyLnJzFCQWAHAAAABZAQAADQAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3N3Y19jb21tb24tMS4wLjAvc3JjL2Vycm9ycy9tb2QucnMAAACUJBYAYQAAAFADAAAfAAAAYXNzZXJ0aW9uIGZhaWxlZDogc291cmNlX2ZpbGVfZW5kID49IGxhc3RfbGluZV9zdGFydC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3N3Y19jb21tb24tMS4wLjAvc3JjL3N5bnRheF9wb3MvYW5hbHl6ZV9zb3VyY2VfZmlsZS5ycwAAADwlFgB1AAAAKgAAAAkAAAA8JRYAdQAAAGoAAAAYAAAAPCUWAHUAAABqAAAALQBB7MvYAAu9CQEAAAAyBAAAMwQAADQEAABvcGVyYXRpb24gbm90IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3Jt/CUWACgAAAAkAAAAAgAAACQmFgAvcnVzdGMvNTVhMjJkMmE2MzMzNGUwZmFmZjAyMDJiNzJhMzFjZTgzMmI1NjEyNS9saWJyYXJ5L3N0ZC9zcmMvcGF0aC5ycwA4JhYARwAAAJgMAAAbAAAAOCYWAEcAAAC7DAAAIQAAADgmFgBHAAAArgwAACIAAABNYWluSGVhZGVyTXNnSGVhZGVyTXNnTGluZUFuZENvbHVtbkxpbmVOdW1iZXJRdW90YXRpb25VbmRlcmxpbmVQcmltYXJ5VW5kZXJsaW5lU2Vjb25kYXJ5TGFiZWxQcmltYXJ5TGFiZWxTZWNvbmRhcnlPbGRTY2hvb2xOb3RlVGV4dE5vU3R5bGVMZXZlbEhpZ2hsaWdodE1lc3NhZ2VMaW50U3ViRGlhZ25vc3RpY3JlbmRlcl9zcGFuL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvcnVzdGMtaGFzaC0xLjEuMC9zcmMvbGliLnJzAAAAaycWAFoAAABnAAAAGwAAAGsnFgBaAAAAXwAAABsAAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9zd2NfY29tbW9uLTEuMC4wL3NyYy9zeW50YXhfcG9zL2h5Z2llbmUucnMAAADoJxYAaQAAAHIBAAANAAAATWFyay91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3BoZl9zaGFyZWQtMC4xMS4yL3Ny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bmlvblR5cGV0eXBlc1RzRW51bU1lbWJlcnF1YWxpZmllcgAAAAAAAAABAAAAAQAAAEcEAABIBAAAMAAAAAgAAABJBAAAbmFtZV90eXBlAAAAEygYAAQAAADXFhgACAAAAFw2FgAKAAAAzDcWAAkAAADzhhYACAAAACCHFgAIAAAAVHNUcGxMaXRUeXBlUHJvdGVjdGVkVHJ1ZVBsdXNNaW51c1RzTm9uTnVsbEV4cHJUc0NhbGxTaWduYXR1cmVEZWNsVHNDb25zdHJ1Y3RTaWduYXR1cmVEZWNsVHNQcm9wZXJ0eVNpZ25hdHVyZVRzR2V0dGVyU2lnbmF0dXJlVHNTZXR0ZXJTaWduYXR1cmVUc01ldGhvZFNpZ25hdHVyZVRzVHVwbGVFbGVtZW50dHlUc0ludGVyZmFjZUJvZHlUc1NhdGlzZmllc0V4cHJwYXJhbV9uYW1lY2hlY2tfdHlwZWV4dGVuZHNfdHlwZXRydWVfdHlwZWZhbHNlX3R5cGVUc0NvbnN0cnVjdG9yVHlwZWNvbXB1dGVkVHNBbnlLZXl3b3JkVHNVbmtub3duS2V5d29yZFRzTnVtYmVyS2V5d29yZFRzT2JqZWN0S2V5d29yZFRzQm9vbGVhbktleXdvcmRUc0JpZ0ludEtleXdvcmRUc1N0cmluZ0tleXdvcmRUc1N5bWJvbEtleXdvcmRUc1ZvaWRLZXl3b3JkVHNVbmRlZmluZWRLZXl3b3JkVHNOdWxsS2V5d29yZFRzTmV2ZXJLZXl3b3JkVHNJbnRyaW5zaWNLZXl3b3JkAAAAAAAAAAQAAAAEAAAA9wEAABMoGAAEAAAAYIgWAAMAAAAaORYACAAAAPOGFgAIAAAAcIoWAAYAAAAghxYACAAAACtSFgALAAAAVHNFeHByV2l0aFR5cGVBcmdzVHNJbnRlcnNlY3Rpb25UeXBlb2JqX3R5cGVpbmRleF90eXBlAAATKBgABAAAANcWGAAIAAAAYIgWAAMAAAAaORYACAAAAPOGFgAIAAAAIIcWAAgAAABUc05hbWVzcGFjZUV4cG9ydERlY2wAAABKBABBtPbYAAuxIksEAABMBAAATQQAAE4EAABPBAAAUAQAAEwEAABRBAAAUgQAAFMEAABUBAAAVQQAAFYEAABXBAAAWAQAAFkEAABaBAAAWgQAAFoEAABaBAAAWgQAAFoEAABaBAAAWgQAAFoEAABbBAAAXAQAAF0EAABeBAAAXQQAAF8EAABgBAAATgQAAE4EAABOBAAATgQAAE4EAABOBAAATgQAAE4EAABOBAAATgQAAE4EAABOBAAATgQAAE4EAABOBAAATgQAAE4EAABOBAAATgQAAE4EAABOBAAATgQAAE4EAABOBAAATgQAAE4EAABhBAAATgQAAGIEAABjBAAATgQAAGQEAABlBAAAZgQAAGcEAABoBAAAaQQAAGoEAABrBAAATgQAAGwEAABOBAAAbQQAAG4EAABvBAAAcAQAAHEEAAByBAAATgQAAHMEAAB0BAAAdQQAAHYEAAB3BAAAeAQAAE4EAAB5BAAATgQAAHoEAAB7BAAAfAQAAH0EAAB+BAAAfwQAAH8EAAB/BAAAfwQAAH8EAAB/BAAAfwQAAH8EAAB/BAAAfwQAAH8EAAB/BAAAfwQAAH8EAAB/BAAAfwQAAH8EAAB/BAAAfwQAAH8EAAB/BAAAfwQAAH8EAAB/BAAAfwQAAH8EAAB/BAAAfwQAAH8EAAB/BAAAfwQAAH8EAAB/BAAAfwQAAH8EAAB/BAAAfwQAAH8EAAB/BAAAfwQAAH8EAAB/BAAAfwQAAH8EAAB/BAAAfwQAAH8EAAB/BAAAfwQAAH8EAAB/BAAAfwQAAH8EAAB/BAAAfwQAAH8EAAB/BAAAfwQAAH8EAAB/BAAAfwQAAH8EAAB/BAAAfwQAAH8EAAB/BAAAfwQAAH8EAAB/BAAAfwQAAH8EAAB/BAAAfwQAAH8EAAB/BAAAfwQAAH8EAAB/BAAAfwQAAH8EAAB/BAAAfwQAAH8EAAB/BAAAfwQAAH8EAAB/BAAAfwQAAH8EAAB/BAAAfwQAAH8EAAB/BAAAfwQAAH8EAAB/BAAAfwQAAH8EAAB/BAAAfwQAAH8EAAB/BAAAfwQAAH8EAAB/BAAAfwQAAH8EAAB/BAAAfwQAAH8EAAB/BAAAfwQAAH8EAAB/BAAAfwQAAH8EAAB/BAAAfwQAAH8EAAB/BAAAfwQAAH8EAAB/BAAAfwQAAH8EAAB/BAAAfwQAAH8EAAAAAAAAAQAAAAEAAAAxAQAAU3VwZXJGbkV4cHJCaW5FeHByb3BOZXdFeHByY2FsbGVlYXJnc09wdENhbGxTZXFFeHByQXJyYXlMaXRDYWxsRXhwckNvbmRFeHByVGhpc0V4cHIAgAQAAAwAAAAEAAAAgQQAAIIEAAAEAAAABAAAAIMEAAAAAAAAAQAAAAEAAAAPAAAAhAQAAAQAAAAEAAAAKAIAABMoGAAEAAAA7IYWAAQAAABwihYABgAAAHeHFgAEAAAABFMWAAgAAAD4UhYADAAAACtSFgALAAAADFMWAAsAAABBcnJvd0V4cHJBd2FpdEV4cHJDbGFzc0V4cHJQYXJlbkV4cHJ0cGxVbmFyeUV4cHJZaWVsZEV4cHJkZWxlZ2F0ZUFzc2lnbkV4cHJNZW1iZXJFeHByVHBsRWxlbWVudHRhaWxjb29rZWRVcGRhdGVFeHBycHJlZml4UGFyc2VJbnRFcnJvclNpbXBsZUV4cHJPclNwcmVhZHNwcmVhZE1ldGFQcm9wRXhwck9wdENoYWluRXhwcmJhc2VTcHJlYWRQcm9wU3ByZWFkRWxlbWVudFN1cGVyUHJvcEV4cHJmYWlsZWQgdG8gcGFyc2Ugc3RyaW5nIGFzIG51bWJlci91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3N3Y19lY21hX3BhcnNlci0xLjAuMS9zcmMvbGV4ZXIvanN4LnJzAJJAFgBlAAAAhwAAAC8AAABmYWlsZWQgdG8gcGFyc2UgbnVtYmVyIGFzIGNoYXIAAJJAFgBlAAAAiQAAAA4AAABxdW90YW1wYXBvc2x0Z3RuYnNwaWV4Y2xjZW50cG91bmRjdXJyZW55ZW5icnZiYXJzZWN0dW1sY29weW9yZGZsYXF1b25vdHNoeXJlZ21hY3JkZWdwbHVzbW5zdXAyc3VwM2FjdXRlbWljcm9wYXJhbWlkZG90Y2VkaWxzdXAxb3JkbXJhcXVvZnJhYzE0ZnJhYzEyZnJhYzM0aXF1ZXN0QWdyYXZlQWFjdXRlQWNpcmNBdGlsZGVBdW1sQXJpbmdBRWxpZ0NjZWRpbEVncmF2ZUVhY3V0ZUVjaXJjRXVtbElncmF2ZUlhY3V0ZUljaXJjSXVtbEVUSE50aWxkZU9ncmF2ZU9hY3V0ZU9jaXJjT3RpbGRlT3VtbHRpbWVzT3NsYXNoVWdyYXZlVWFjdXRlVWNpcmNVdW1sWWFjdXRlVEhPUk5zemxpZ2FncmF2ZWFhY3V0ZWFjaXJjYXRpbGRlYXVtbGFyaW5nYWVsaWdjY2VkaWxlZ3JhdmVlYWN1dGVlY2lyY2V1bWxpZ3JhdmVpYWN1dGVpY2lyY2l1bWxldGhudGlsZGVvZ3JhdmVvYWN1dGVvY2lyY290aWxkZW91bWxkaXZpZGVvc2xhc2h1Z3JhdmV1YWN1dGV1Y2lyY3V1bWx5YWN1dGV0aG9ybnl1bWxPRWxpZ29lbGlnU2Nhcm9uc2Nhcm9uWXVtbGZub2ZjaXJjdGlsZGVBbHBoYUJldGFHYW1tYURlbHRhRXBzaWxvblpldGFFdGFUaGV0YUlvdGFLYXBwYUxhbWJkYU11TnVYaU9taWNyb25QaVJob1NpZ21hVGF1VXBzaWxvblBoaUNoaVBzaU9tZWdhYWxwaGFiZXRhZ2FtbWFkZWx0YWVwc2lsb256ZXRhZXRhdGhldGFpb3Rha2FwcGFsYW1iZGFtdW51eGlvbWljcm9ucGlyaG9zaWdtYWZzaWdtYXRhdXVwc2lsb25waGljaGlwc2lvbWVnYXRoZXRhc3ltdXBzaWhwaXZlbnNwZW1zcHRoaW5zcHp3bmp6d2pscm1ybG1uZGFzaG1kYXNobHNxdW9yc3F1b3NicXVvbGRxdW9yZHF1b2JkcXVvZGFnZ2VyRGFnZ2VyYnVsbGhlbGxpcHBlcm1pbHByaW1lUHJpbWVsc2FxdW9yc2FxdW9vbGluZWZyYXNsZXVyb2ltYWdld2VpZXJwcmVhbHRyYWRlYWxlZnN5bWxhcnJ1YXJycmFycmRhcnJoYXJyY3JhcnJsQXJydUFycnJBcnJkQXJyaEFycmZvcmFsbHBhcnRleGlzdGVtcHR5bmFibGFpc2lubm90aW5uaXByb2RzdW1taW51c2xvd2FzdHJhZGljaW5maW5hbmdhbmRvcmNhcGN1cGludHRoZXJlNHNpbWNvbmdhc3ltcG5lZXF1aXZsZWdlc3Vic3VwbnN1YnN1YmVzdXBlb3BsdXNvdGltZXNwZXJwc2RvdGxjZWlscmNlaWxsZmxvb3JyZmxvb3JsYW5ncmFuZ2xvenNwYWRlc2NsdWJzaGVhcnRzZGlhbXOFBAAABAAAAAQAAABcAgAAAAAAAAEAAAABAAAADwAAAEV4cG9ydEFsbHNyY3R5cGVfb25seUV4cG9ydERlY2xkZWNsAIYEAAAMAAAA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iBYACwAAACtSFgALAAAANlIWABEAAACUGRgACgAAAGRlY2xzVHJ5U3RtdGJsb2NraGFuZGxlcmZpbmFsaXplckpTWE1lbWJlckV4cHJPYmplY3RMaXRvcGVuaW5nY2xvc2luZwAAAJMEAAAMAAAABAAAAJQEAACVBAAAGAAAAAQAAACWBAAAaXNfZ2VuZXJhdG9yaXNfYXN5bmNyZXR1cm5fdHlwZQBwihYABgAAAGyIFgAKAAAAEygYAAQAAADshhYABAAAAHeHFgAEAAAA+FIWAAwAAAAEUxYACAAAACtSFgALAAAADFMWAAsAAABGdW5jdGlvbnByb3BUc0tleXdvcmRUeXBlVHNUaGlzVHlwZVRzRm5PckNvbnN0cnVjdG9yVHlwZVRzVHlwZVJlZlRzVHlwZVF1ZXJ5VHNUeXBlTGl0VHNBcnJheVR5cGVUc1R1cGxlVHlwZVRzT3B0aW9uYWxUeXBlVHNSZXN0VHlwZVRzVW5pb25PckludGVyc2VjdGlvblR5cGVUc0NvbmRpdGlvbmFsVHlwZVRzSW5mZXJUeXBlVHNQYXJlbnRoZXNpemVkVHlwZVRzVHlwZU9wZXJhdG9yVHNJbmRleGVkQWNjZXNzVHlwZVRzTWFwcGVkVHlwZVRzTGl0VHlwZVRzVHlwZVByZWRpY2F0ZVRzSW1wb3J0VHlwZVRzVHlwZUFubkpTWE9wZW5pbmdFbGVtZW50YXR0cnNzZWxmX2Nsb3Npbmd0eXBlX2FyZ3M+BAAAGAAAAAgAAABAAQAAVHNFbnVtRGVjbGlzX2NvbnN0bWVtYmVyc1RzUXVhbGlmaWVkTmFtZVRzTW9kdWxlRGVjbJcEAAAMAAAABAAAAJgEAAAAAAAABAAAAAQAAACZBAAAEygYAAQAAABwqxYAAgAAAIoWGAAHAAAAK1IWAAsAAADAFhgABwAAAHeHFgAEAAAAVHNJbnRlcmZhY2VEZWNsVHNNb2R1bGVCbG9ja1RzTmFtZXNwYWNlRGVjbFRzVHlwZUFsaWFzRGVjbFRzVHlwZVBhcmFtRGVjbFRzSW1wb3J0RXF1YWxzRGVjbGlzX2V4cG9ydGlzX3R5cGVfb25seW1vZHVsZV9yZWZUc1R5cGVQYXJhbUluc3RhbnRpYXRpb24vdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9zbWFydHN0cmluZy0xLjAuMS9zcmMvb3BzLnJzAAAA1lUWAFsAAAB6AAAAOwAAAFVuZXhwZWN0ZWQgZW9mL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvc3djX2VjbWFfcGFyc2VyLTEuMC4xL3NyYy9lcnJvci5yc0RlY2xhcmF0aW9uIGlzIG5vdCBhbGxvd2VkVXNpbmcgZGVjbGFyYXRpb24gaXMgbm90IGFsbG93ZWRVc2luZyBkZWNsYXJhdGlvbiBpcyBub3QgYWxsb3dlZCBpbiBmb3ItaW4gbG9vcFVzaW5nIGRlY2xhcmF0aW9uIGlzIG5vdCBlbmFibGVkLiBTZXQganNjLnBhcnNlci5leHBsaWNpdFJlc291cmNlTWFuYWdlbWVudCB0byB0cnVlVXNpbmcgZGVjbGFyYXRpb24gb25seSBhbGxvd3MgaWRlbnRpZmllcnNVc2luZyBkZWNsYXJhdGlvbiByZXF1aXJlcyBpbml0aWFsaXplcnByaXZhdGUgbmFtZXMgYXJlIG5vdCBhbGxvd2VkIGluIGludGVyZmFjZUludmFsaWQgYHN1cGVyKClgSW52YWxpZCBhY2Nlc3MgdG8gc3VwZXJJbmRleCBzdXBlciB3aXRoIHByaXZhdGUgbmFtZSBpcyBub3QgYWxsb3dlZCduZXcudGFyZ2V0JyBpcyBvbmx5IGFsbG93ZWQgaW4gdGhlIGJvZHkgb2YgYSBmdW5jdGlvbiBkZWNsYXJhdGlvbiwgZnVuY3Rpb24gZXhwcmVzc2lvbiwgb3IgY2xhc3MuSW1wb3J0IGlzIG5vdCBhbGxvd2VkIGhlcmVBbiBhcnJvdyBmdW5jdGlvbiBpcyBub3QgYWxsb3dlZCBoZXJlYGV4cG9ydGAgaXMgbm90IGFsbG93ZWQgaGVyZUEgZ2V0dGVyIG9yIGEgc2V0dGVyIGNhbm5vdCBiZSByZWFkb25seUEgZ2V0dGVyIG9yIGEgc2V0dGVyIGNhbm5vdCBiZSBvcHRpb25hbEEgYGdldGAgYWNjZXNzb3IgY2Fubm90IGhhdmUgcGFyYW1ldGVyc0EgYHNldGAgYWNjZXNzb3IgbXVzdCBoYXZlIGV4YWN0bHkgb25lIHBhcmFtZXRlcnRvcCBsZXZlbCBhd2FpdCBpcyBvbmx5IGFsbG93ZWQgaW4gbW9kdWxlTGVnYWN5IGRlY2ltYWwgZXNjYXBlIGlzIG5vdCBwZXJtaXR0ZWQgaW4gc3RyaWN0IG1vZGVMZWdhY3kgb2N0YWwgZXNjYXBlIGlzIG5vdCBwZXJtaXR0ZWQgaW4gc3RyaWN0IG1vZGVJbnZhbGlkIGNoYXJhY3RlciBpbiBpZGVudGlmaWVyYSBiaW5hcnlhbiBvY3RhbGEgZGVjaW1hbGEgaGV4YWRlY2ltYWxFeHBlY3RlZCAgZGlnaXQAdFoWAAkAAAB9WhYABgAAAFJWFgBhAAAAQgEAABoAAABTZXR0ZXIgc2hvdWxkIGhhdmUgZXhhY3RseSBvbmUgcGFyYW1ldGVyUmVzdCBwYXR0ZXJuIGlzIG5vdCBhbGxvd2VkIGluIHNldHRlclVudGVybWluYXRlZCBibG9jayBjb21tZW50VW50ZXJtaW5hdGVkIHN0cmluZyBjb25zdGFudEV4cGVjdGVkIHVuaWNvZGUgZXNjYXBlVW5leHBlY3RlZCBlc2NhcGUgc2VxdWVuY2UgaW4gcmVzZXJ2ZWQgd29yZDogAD5bFgAtAAAAVW50ZXJtaW5hdGVkIHJlZ2V4cCBsaXRlcmFsVW50ZXJtaW5hdGVkIHRlbXBsYXRlSWRlbnRpZmllciBjYW5ub3QgZm9sbG93IG51bWJlclVuZXhwZWN0ZWQgY2hhcmFjdGVyIMNbFgAVAAAASW52YWxpZCBzdHJpbmcgZXNjYXBlSW52YWxpZCB1bmljb2RlIGVzY2FwZUJhZCBjaGFyYWN0ZXIgZXNjYXBlIHNlcXVlbmNlLCBleHBlY3RlZCAAC1wWACgAAABFeHBlY3RlZCArLCAtIG9yIGRlY2ltYWwgZGlnaXQgYWZ0ZXIgZUxlZ2FjeSBjb21tZW50cyBjYW5ub3QgYmUgdXNlZCBpbiBtb2R1bGUgY29kZWAgY2Fubm90IGJlIHVzZWQgYXMgYW4gaWRlbnRpZmllciBpbiBzdHJpY3QgbW9kZQCaFhgAAQAAAI9cFgAwAAAAYGF3YWl0YCBjYW5ub3QgYmUgdXNlZCBhcyBhbiBpZGVudGlmaWVyIGluIGFuIGFzeW5jIGNvbnRleHQnZXZhbCcgYW5kICdhcmd1bWVudHMnIGNhbm5vdCBiZSB1c2VkIGFzIGEgYmluZGluZyBpZGVudGlmaWVyIGluIHN0cmljdCBtb2RlJ2FyZ3VtZW50cycgaXMgb25seSBhbGxvd2VkIGluIGZ1bmN0aW9ucyBhbmQgY2xhc3MgbWV0aG9kc0lsbGVnYWwgJ3VzZSBzdHJpY3QnIGRpcmVjdGl2ZSBpbiBmdW5jdGlvbiB3aXRoIG5vbi1zaW1wbGUgcGFyYW1ldGVyIGxpc3QuJyoqJyBjYW5ub3QgYmUgYXBwbGllZCB0byB1bmFyeS9hd2FpdCBleHByZXNzaW9uLlVuZXhwZWN0ZWQgdG9rZW4gJyMnTGluZUJyZWFrIGNhbm5vdCBmb2xsb3cgJ3Rocm93J1VuZXhwZWN0ZWQgbGluZSBicmVhayBiZXR3ZWVuIGFycm93IGhlYWQgYW5kIGFycm93VW5leHBlY3RlZCB0b2tlbiBgYC4gRXhwZWN0ZWQgAHFeFgASAAAAg14WAAwAAAAgLCBvciAAAKNeFgADAAAAIG9yIFVuZXhwZWN0ZWQgdG9rZW4uIERpZCB5b3UgbWVhbiAAtF4WAB8AAADHFhgAAQAAAGNhbm5vdCBpbXBvcnQgYXMgcmVzZXJ2ZWQgd29yZGFzc2lnbm1lbnQgcHJvcGVydHkgaXMgaW52YWxpZCBzeW50YXhFeHBlY3RlZCAnJywgZ290ICcnAAAnXxYACgAAADFfFgAIAAAAOV8WAAEAAABFeHBlY3RlZCAnOycsICd9JyBvciA8ZW9mPmF3YWl0KiBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIGFzeW5jIGZ1bmN0aW9ucyBwcm9wb3NhbC4gVXNlIFByb21pc2UuYWxsKCkgaW5zdGVhZC5DYW5ub3QgdXNlIGEgcmVzZXJ2ZWQgd29yZCBhcyBhIHNob3J0aGFuZCBwcm9wZXJ0eU51bGxpc2ggY29hbGVzY2luZyBvcGVyYXRvcig/PykgcmVxdWlyZXMgcGFyZW5zIHdoZW4gbWl4aW5nIHdpdGggbG9naWNhbCBvcGVyYXRvcnNBIHN3aXRjaCBibG9jayBjYW5ub3QgaGF2ZSBtdWx0aXBsZSBkZWZhdWx0c1RyYWlsaW5nIGNvbW1hIGlzbid0IHBlcm1pdHRlZCBhZnRlciBhIHJlc3QgZWxlbWVudFJlc3QgZWxlbWVudCBtdXN0IGJlIGZpbmFsIGVsZW1lbnRQYXJlbnRoZXNpemVkIGV4cHJlc3Npb24gY2Fubm90IGNvbnRhaW4gc3ByZWFkIG9wZXJhdG9yUGFyZW50aGVzaXplZCBleHByZXNzaW9uIGNhbm5vdCBiZSBlbXB0eU5vdCBhIHBhdHRlcm5Ob3QgYW4gZXhwcmVzc2lvbkNhbm5vdCBhc3NpZ24gdG8gdGhpc0ludmFsaWQgYXNzaWdubWVudCB0YXJnZXRFeHBlY3RlZCBpZGVudEV4cGVjdGVkICc7JyBvciBsaW5lIGJyZWFrTGFiZWwgIGlzIGFscmVhZHkgZGVjbGFyZWQAAACbYRYABgAAAKFhFgAUAAAAQW4gYXN5bmMgZnVuY3Rpb24gY2Fubm90IGJlIGdlbmVyYXRvcidpbXBvcnQnLCBhbmQgJ2V4cG9ydCcgYXJlIG5vdCBwZXJtaXR0ZWQgaGVyZSdpbXBvcnQnLCBhbmQgJ2V4cG9ydCcgY2Fubm90IGJlIHVzZWQgb3V0c2lkZSBvZiBtb2R1bGUgY29kZSdpbXBvcnQubWV0YScgY2Fubm90IGJlIHVzZWQgb3V0c2lkZSBvZiBtb2R1bGUgY29kZS5EZXN0cnVjdHVyaW5nIGJpbmRpbmdzIHJlcXVpcmUgaW5pdGlhbGl6ZXJzV2l0aCBzdGF0ZW1lbnQgYXJlIG5vdCBhbGxvd2VkIGluIHN0cmljdCBtb2RlUmV0dXJuIHN0YXRlbWVudCBpcyBub3QgYWxsb3dlZCBoZXJlRXhwZWN0ZWQgb25lIHZhcmlhYmxlIGJpbmRpbmdVbmV4cGVjdGVkIGluaXRpYWxpemVyIGluIGZvciBpbi9vZiBsb29wR2VuZXJhdG9yIG9yIGFzeW5jIGZ1bmN0aW9uIGNhbm5vdCBiZSBsYWJlbGxlZEZ1bmN0aW9uIGNhbm5vdCBiZSBsYWJlbGxlZCBpbiBzdHJpY3QgbW9kZSd5aWVsZCcgY2Fubm90IGJlIHVzZWQgYXMgYSBwYXJhbWV0ZXIgd2l0aGluIGdlbmVyYXRvcmBhd2FpdGAgZXhwcmVzc2lvbnMgY2Fubm90IGJlIHVzZWQgaW4gYSBwYXJhbWV0ZXIgaW5pdGlhbGl6ZXIuZm9yIGF3YWl0IHN5bnRheCBpcyB2YWxpZCBvbmx5IGZvciBmb3Itb2Ygc3RhdGVtZW50YXdhaXQgaXNuJ3QgYWxsb3dlZCBpbiBub24tYXN5bmMgZnVuY3Rpb25VbnRlcm1pbmF0ZWQgSlNYIGNvbnRlbnRzSlNYIGF0dHJpYnV0ZXMgbXVzdCBvbmx5IGJlIGFzc2lnbmVkIGEgbm9uLWVtcHR5IGV4cHJlc3Npb25KU1ggdmFsdWUgc2hvdWxkIGJlIGVpdGhlciBhbiBleHByZXNzaW9uIG9yIGEgcXVvdGVkIEpTWCB0ZXh0RXhwZWN0ZWQgY29ycmVzcG9uZGluZyBKU1ggY2xvc2luZyB0YWcgZm9yIDw+RXhwZWN0ZWQgY29ycmVzcG9uZGluZyBKU1ggY2xvc2luZyB0YWcgZm9yIDwAAAAxZRYALAAAADsUGAABAAAATGVhZGluZyBkZWNvcmF0b3JzIG11c3QgYmUgYXR0YWNoZWQgdG8gYSBjbGFzcyBkZWNsYXJhdGlvblVzaW5nIHRoZSBleHBvcnQga2V5d29yZCBiZXR3ZWVuIGEgZGVjb3JhdG9yIGFuZCBhIGNsYXNzIGlzIG5vdCBhbGxvd2VkLiBQbGVhc2UgdXNlIGBleHBvcnQgQGRlYyBjbGFzc2AgaW5zdGVhZC5BIHJlcXVpcmVkIGVsZW1lbnQgY2Fubm90IGZvbGxvdyBhbiBvcHRpb25hbCBlbGVtZW50LlR5cGVzY3JpcHQgcGFyYW1ldGVyIHByb3BlcnR5IG11c3QgYmUgYW4gaWRlbnRpZmllciBvciBhc3NpZ25tZW50IHBhdHRlcm5VbmV4cGVjdGVkIHNwYWNlIGJldHdlZW4gIyBhbmQgaWRlbnRpZmllckNvbnN0cnVjdG9yIGNhbid0IGJlIGFuIGFzeW5jIGZ1bmN0aW9uQ2xhc3NlcyBtYXkgbm90IGhhdmUgYSBub24tc3RhdGljIGZpZWxkIG5hbWVkICdjb25zdHJ1Y3RvcidDbGFzc2VzIGNhbid0IGhhdmUgYSBwcml2YXRlIGZpZWxkIG5hbWVkICcjY29uc3RydWN0b3InLicgbW9kaWZpZXIgY2Fubm90IGJlIHVzZWQgd2l0aCBhIHByaXZhdGUgaWRlbnRpZmllcgAAADlfFgABAAAAWmcWADMAAABDbGFzcyBjb25zdHJ1Y3RvciBjYW4ndCBiZSBhbiBhY2Nlc3Nvci5BIG1ldGhvZCBjYW5ub3QgYmUgcmVhZG9ubHlBIGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBnZW5lcmF0b3JBIGNsYXNzIGNhbiBvbmx5IGhhdmUgb25lIGNvbnN0cnVjdG9yQSBiaW5kaW5nIHBhdHRlcm4gcGFyYW1ldGVyIGNhbm5vdCBiZSBvcHRpb25hbCBpbiBhbiBpbXBsZW1lbnRhdGlvbiBzaWduYXR1cmUuU3VwZXIgY2FsbCBjYW5ub3QgYmUgb3B0aW9uYWxDb25zdHJ1Y3RvciBpbi9hZnRlciBhbiBvcHRpb25hbCBjaGFpbmluZyBpcyBub3QgYWxsb3dlZC5UYWdnZWQgdGVtcGxhdGUgbGl0ZXJhbCBpcyBub3QgYWxsb3dlZCBpbiBvcHRpb25hbCBjaGFpbi5UcmFpbGluZyBjb21tYSBpcyBkaXNhbGxvd2VkIGluc2lkZSBpbXBvcnQoLi4uKSBhcmd1bWVudHNleHBvcnQgZGVmYXVsdCBzdGF0ZW1lbnRzIHJlcXVpcmVkIGZyb20gJy4uLic7YCBjYW5ub3QgYmUgdXNlZCB3aXRob3V0IGBmcm9tYCBjbGF1c2UAAJoWGAABAAAAbGkWACYAAABgLi4uYCBtdXN0IGJlIGZvbGxvd2VkIGJ5IGFuIGlkZW50aWZpZXIgaW4gZGVjbGFyYXRpb24gY29udGV4dHNBIG51bWVyaWMgc2VwYXJhdG9yIGlzIG9ubHkgYWxsb3dlZCBiZXR3ZWVuIHR3byBkaWdpdHNBIHN0cmluZyBsaXRlcmFsIGNhbm5vdCBiZSB1c2VkIGFzIGFuIGltcG9ydGVkIGJpbmRpbmcuCi0gRGlkIHlvdSBtZWFuIGBpbXBvcnQgeyAiIiBhcyBmb28gfWA/ABlqFgBSAAAAa2oWAAwAAABBIHN0cmluZyBsaXRlcmFsIGNhbm5vdCBiZSB1c2VkIGFzIGFuIGV4cG9ydGVkIGJpbmRpbmcgd2l0aG91dCBgZnJvbWAuJ2NvbnN0JyBkZWNsYXJhdGlvbnMgbXVzdCBiZSBpbml0aWFsaXplZER1cGxpY2F0ZWQgcmVndWxhciBleHByZXNzaW9uIGZsYWcgJycu9moWACQAAAAaaxYAAgAAAFVua25vd24gcmVndWxhciBleHByZXNzaW9uIGZsYWdzLkV4cGVjdGVkIGFuIGlkZW50aWZpZXJFeHBlY3RlZCBhIHNlbWljb2xvblRyYWlsaW5nIGNvbW1hIGlzIG5vdCBhbGxvd2VkQSByZXN0IHBhcmFtZXRlciBtdXN0IGJlIGxhc3QgaW4gYSBwYXJhbWV0ZXIgbGlzdFBhcmFtZXRlciBjYW5ub3QgaGF2ZSBxdWVzdGlvbiBtYXJrIGFuZCBpbml0aWFsaXplcicgbW9kaWZpZXIgbXVzdCBwcmVjZWRlICcnIG1vZGlmaWVyLjlfFgABAAAA+GsWABkAAAARbBYACwAAACcgbW9kaWZpZXIgYWxyZWFkeSBzZWVuLjlfFgABAAAANGwWABgAAABgZGVjbGFyZWAgbW9kaWZpZXIgY2Fubm90IGFwcGVhciBvbiBjbGFzcyBlbGVtZW50cyBvZiB0aGlzIGtpbmRgZGVjbGFyZWAgbW9kaWZpZXIgbm90IGFsbG93ZWQgZm9yIGNvZGUgYWxyZWFkeSBpbiBhbiBhbWJpZW50IGNvbnRleHRgYXN5bmNgIG1vZGlmaWVyIGNhbm5vdCBiZSB1c2VkIGhlcmVBIHJlc3QgcGFyYW1ldGVyIGNhbm5vdCBiZSBvcHRpb25hbEEgcmVzdCBwYXJhbWV0ZXIgY2Fubm90IGhhdmUgYW4gaW5pdGlhbGl6ZXJqc2MudGFyZ2V0IHNob3VsZCBiZSBlczUgb3IgdXBwZXIgdG8gdXNlIGdldHRlciAvIHNldHRlckxlZ2FjeSBvY3RhbCBsaXRlcmFscyBhcmUgbm90IGF2YWlsYWJsZSB3aGVuIHRhcmdldGluZyBFQ01BU2NyaXB0IDUgYW5kIGhpZ2hlcicgbW9kaWZpZXIgY2Fubm90IGFwcGVhciBvbiBhIGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9uAAAAOV8WAAEAAADYbRYANQAAAFR5cGUgcGFyYW1ldGVycyBjYW5ub3QgYXBwZWFyIG9uIGEgY29uc3RydWN0b3IgZGVjbGFyYXRpb25BbiBpbmRleCBzaWduYXR1cmUgbXVzdCBoYXZlIGV4YWN0bHkgb25lIHBhcmFtZXRlclR5cGUgcGFyYW1ldGVyIGxpc3QgY2Fubm90IGJlIGVtcHR5SW52YWxpZCB1c2Ugb2YgJ2FyZ3VtZW50cycgaW4gc3RyaWN0IG1vZGUnZGVsZXRlJyBjYW5ub3QgYmUgY2FsbGVkIG9uIGFuIGlkZW50aWZpZXIgaW4gc3RyaWN0IG1vZGVBICdicmVhaycgc3RhdGVtZW50IGNhbiBvbmx5IGJlIHVzZWQgd2l0aGluIGFuIGVuY2xvc2luZyBpdGVyYXRpb24gb3Igc3dpdGNoIHN0YXRlbWVudFRoZSBsZWZ0LWhhbmQgc2lkZSBvZiBhIGBmb3IuLi5vZmAgc3RhdGVtZW50IG1heSBub3QgYmUgYGFzeW5jYEp1bXAgdGFyZ2V0IGNhbm5vdCBjcm9zcyBmdW5jdGlvbiBib3VuZGFyeUV4cHJlc3Npb24gZXhwZWN0ZWR0eXBlIGV4cGVjdGVkRHVwbGljYXRlIGxhYmVsQSAnY29udGludWUnIHN0YXRlbWVudCBjYW4gb25seSBqdW1wIHRvIGEgbGFiZWwgb2YgYW4gZW5jbG9zaW5nIGl0ZXJhdGlvbiBzdGF0ZW1lbnRBICdicmVhaycgc3RhdGVtZW50IGNhbiBvbmx5IGp1bXAgdG8gYSBsYWJlbCBvZiBhbiBlbmNsb3Npbmcgc3RhdGVtZW50VmFyaWFibGUgZGVjbGFyYXRpb24gbGlzdCBjYW5ub3QgYmUgZW1wdHlsaXRlcmFsIGluIGFuIGltcG9ydCB0eXBlIHNob3VsZCBiZSBzdHJpbmcgbGl0ZXJhbEFuIG9iamVjdCBtZW1iZXIgY2Fubm90IGJlIGRlY2xhcmVkIG9wdGlvbmFsQ29tcHV0ZWQgcHJvcGVydHkgbmFtZXMgYXJlIG5vdCBhbGxvd2VkIGluIGVudW1zQSBjb21tYSBleHByZXNzaW9uIGlzIG5vdCBhbGxvd2VkIGluIGEgY29tcHV0ZWQgcHJvcGVydHkgbmFtZWBleHRlbmRzYCBjbGF1c2UgYWxyZWFkeSBzZWVuLidleHRlbmRzJyBjbGF1c2UgbXVzdCBwcmVjZWRlICdpbXBsZW1lbnRzJyBjbGF1c2UuQ2xhc3NlcyBjYW4gb25seSBleHRlbmQgYSBzaW5nbGUgY2xhc3NgaW1wbGVtZW50c2AgY2xhdXNlIGFscmVhZHkgc2VlbkFuIGltcGxlbWVudGF0aW9uIGNhbm5vdCBiZSBkZWNsYXJlZCBpbiBhbWJpZW50IGNvbnRleHRzTW9kaWZpZXJzIGNhbm5vdCBhcHBlYXIgaGVyZU1lcmdlIGNvbmZsaWN0IG1hcmtlciBlbmNvdW50ZXJlZC5UeXBlIGFubm90YXRpb24gY2Fubm90IGFwcGVhciBvbiBhIGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9uQ2F0Y2ggY2xhdXNlIHZhcmlhYmxlIGNhbm5vdCBoYXZlIGEgdHlwZSBhbm5vdGF0aW9uYGFic3RyYWN0YCBtb2RpZmllciBjYW4gb25seSBhcHBlYXIgb24gYSBjbGFzcyBvciBtZXRob2QgZGVjbGFyYXRpb24nIG1vZGlmaWVyIGNhbm5vdCBiZSB1c2VkIHdpdGggJwAAADlfFgABAAAASXMWACAAAAARbBYACwAAAEFic3RyYWN0IG1ldGhvZHMgY2FuIG9ubHkgYXBwZWFyIHdpdGhpbiBhbiBhYnN0cmFjdCBjbGFzcy5BYnN0cmFjdCBtZXRob2QgY2Fubm90IGhhdmUgYW4gaW1wbGVtZW50YXRpb24uQWJzdHJhY3QgcHJvcGVydHkgY2Fubm90IGhhdmUgYW4gaW5pdGlhbGl6ZXIuJyBtb2RpZmllciBjYW5ub3QgYXBwZWFyIG9uIGEgdHlwZSBwYXJhbWV0ZXIAAAA5XxYAAQAAABl0FgAsAAAAJyBtb2RpZmllciBjYW4gb25seSBhcHBlYXIgb24gYSB0eXBlIHBhcmFtZXRlciBvZiBhIGNsYXNzLCBpbnRlcmZhY2Ugb3IgdHlwZSBhbGlhcwAAOV8WAAEAAABYdBYAUgAAACcgbW9kaWZpZXIgY2FuIG9ubHkgYXBwZWFyIG9uIGEgdHlwZSBwYXJhbWV0ZXIgb2YgYSBmdW5jdGlvbiwgbWV0aG9kIG9yIGNsYXNzAAAAOV8WAAEAAAC8dBYATQAAAFRoZSAndHlwZScgbW9kaWZpZXIgY2Fubm90IGJlIHVzZWQgb24gYSBuYW1lZCBpbXBvcnQgd2hlbiAnaW1wb3J0IHR5cGUnIGlzIHVzZWQgb24gaXRzIGltcG9ydCBzdGF0ZW1lbnQuVGhlICd0eXBlJyBtb2RpZmllciBjYW5ub3QgYmUgdXNlZCBvbiBhIG5hbWVkIGV4cG9ydCB3aGVuICdleHBvcnQgdHlwZScgaXMgdXNlZCBvbiBpdHMgZXhwb3J0IHN0YXRlbWVudC5BIHBhcmFtZXRlciBwcm9wZXJ0eSBpcyBvbmx5IGFsbG93ZWQgaW4gYSBjb25zdHJ1Y3RvciBpbXBsZW1lbnRhdGlvbkEgcGFyYW1ldGVyIGluaXRpYWxpemVyIGlzIG9ubHkgYWxsb3dlZCBpbiBhIGZ1bmN0aW9uIG9yIGNvbnN0cnVjdG9yIGltcGxlbWVudGF0aW9uVGhlIGxlZnQtaGFuZCBzaWRlIG9mIGFuIGFzc2lnbm1lbnQgZXhwcmVzc2lvbiBtdXN0IGJlIGEgdmFyaWFibGUgb3IgYSBwcm9wZXJ0eSBhY2Nlc3MuVGhlICd3aXRoJyBzdGF0ZW1lbnQgaXMgbm90IHN1cHBvcnRlZC4gQWxsIHN5bWJvbHMgaW4gYSAnd2l0aCcgYmxvY2sgd2lsbCBoYXZlIHR5cGUgJ2FueScuSW52YWxpZCBjbGFzcyBuYW1laW50ZXJmYWNlIG5hbWUgaXMgaW52YWxpZEFuIGVudW0gbWVtYmVyIGNhbm5vdCBoYXZlIGEgbnVtZXJpYyBuYW1lVGhlIGxlZnQtaGFuZCBzaWRlIG9mIGEgJ2Zvci4uLm9mJyBzdGF0ZW1lbnQgY2Fubm90IHVzZSBhIHR5cGUgYW5ub3RhdGlvblRoZSBsZWZ0LWhhbmQgc2lkZSBvZiBhICdmb3IuLi5pbicgc3RhdGVtZW50IGNhbm5vdCBiZSBhIGRlc3RydWN0dXJpbmcgcGF0dGVybkFuIGludGVyZmFjZSBjYW4gb25seSBleHRlbmQgYW4gaWRlbnRpZmllci9xdWFsaWZpZWQtbmFtZSB3aXRoIG9wdGlvbmFsIHR5cGUgYXJndW1lbnRzLlRoZSBvcGVyYW5kIG9mIGEgZGVsZXRlIG9wZXJhdG9yIG11c3QgYmUgYSBwcm9wZXJ0eSByZWZlcmVuY2UuVGhpcyBtZW1iZXIgY2Fubm90IGhhdmUgYW4gJ292ZXJyaWRlJyBtb2RpZmllciBiZWNhdXNlIGl0cyBjb250YWluaW5nIGNsYXNzIGRvZXMgbm90IGV4dGVuZCBhbm90aGVyIGNsYXNzLkRlY29yYXRvcnMgbWF5IG5vdCBhcHBlYXIgYWZ0ZXIgYGV4cG9ydGAgb3IgYGV4cG9ydCBkZWZhdWx0YCBpZiB0aGV5IGFsc28gYXBwZWFyIGJlZm9yZSBgZXhwb3J0YC5BbiBhY2Nlc3NpYmlsaXR5IG1vZGlmaWVyIGNhbm5vdCBiZSB1c2VkIHdpdGggYSBwcml2YXRlIGlkZW50aWZpZXIuVHlwZSBhbm5vdGF0aW9ucyBtdXN0IGNvbWUgYmVmb3JlIGRlZmF1bHQgYXNzaWdubWVudHNUeXBlc2NyaXB0IG5vbi1udWxsIGFzc2VydGlvbiBvcGVyYXRvciBpcyBub3QgYWxsb3dlZCB3aXRoICcA93kWADwAAAA5XxYAAQAAAFRoaXMgc3ludGF4IGlzIHJlc2VydmVkIGluIGZpbGVzIHdpdGggdGhlIC5tdHMgb3IgLmN0cyBleHRlbnNpb24uIFVzZSBhbiBgYXNgIGV4cHJlc3Npb24gaW5zdGVhZC5UaGlzIHN5bnRheCBpcyByZXNlcnZlZCBpbiBmaWxlcyB3aXRoIHRoZSAubXRzIG9yIC5jdHMgZXh0ZW5zaW9uLiBBZGQgYSB0cmFpbGluZyBjb21tYSwgYXMgaW4gYDxULD4oKSA9PiAuLi5gLlRoaXMgaXMgdGhlIGV4cHJlc3Npb24gcGFydCBvZiBhbiBleHByZXNzaW9uIHN0YXRlbWVudHByZXZpb3VzIGRlZmF1bHQgY2FzZSBpcyBkZWNsYXJlZCBhdCBoZXJlRW9mRGVjbE5vdEFsbG93ZWRVc2luZ0RlY2xOb3RBbGxvd2VkVXNpbmdEZWNsTm90QWxsb3dlZEZvckZvckluTG9vcFVzaW5nRGVjbE5vdEVuYWJsZWRJbnZhbGlkTmFtZUluVXNpbmdEZWNsSW5pdFJlcXVpcmVkRm9yVXNpbmdEZWNsUHJpdmF0ZU5hbWVJbkludGVyZmFjZUludmFsaWRTdXBlckNhbGxJbnZhbGlkU3VwZXJJbnZhbGlkU3VwZXJQcml2YXRlTmFtZUludmFsaWROZXdUYXJnZXRJbnZhbGlkSW1wb3J0QXJyb3dOb3RBbGxvd2VkRXhwb3J0Tm90QWxsb3dlZEdldHRlclNldHRlckNhbm5vdEJlUmVhZG9ubHlHZXR0ZXJTZXR0ZXJDYW5ub3RCZU9wdGlvbmFsR2V0dGVyUGFyYW1TZXR0ZXJQYXJhbVRvcExldmVsQXdhaXRJblNjcmlwdExlZ2FjeURlY2ltYWxMZWdhY3lPY3RhbEludmFsaWRJZGVudENoYXJFeHBlY3RlZERpZ2l0cmFkaXhTZXR0ZXJQYXJhbVJlcXVpcmVkUmVzdFBhdEluU2V0dGVyVW50ZXJtaW5hdGVkQmxvY2tDb21tZW50VW50ZXJtaW5hdGVkU3RyTGl0RXhwZWN0ZWRVbmljb2RlRXNjYXBlRXNjYXBlSW5SZXNlcnZlZFdvcmR3b3JkVW50ZXJtaW5hdGVkUmVnRXhwVW50ZXJtaW5hdGVkVHBsSWRlbnRBZnRlck51bVVuZXhwZWN0ZWRDaGFyY0ludmFsaWRTdHJFc2NhcGVJbnZhbGlkVW5pY29kZUVzY2FwZUJhZENoYXJhY3RlckVzY2FwZVNlcXVlbmNlZXhwZWN0ZWROdW1MaXRUZXJtaW5hdGVkV2l0aEV4cExlZ2FjeUNvbW1lbnRJbk1vZHVsZUludmFsaWRJZGVudEluU3RyaWN0SW52YWxpZElkZW50SW5Bc3luY0V2YWxBbmRBcmd1bWVudHNJblN0cmljdEFyZ3VtZW50c0luQ2xhc3NGaWVsZElsbGVnYWxMYW5ndWFnZU1vZGVEaXJlY3RpdmVVbmFyeUluRXhwbGVmdF9zcGFuSGFzaExpbmVCcmVha0luVGhyb3dMaW5lQnJlYWtCZWZvcmVBcnJvd1VuZXhwZWN0ZWRnb3RVbmV4cGVjdGVkVG9rZW5XaXRoU3VnZ2VzdGlvbnNjYW5kaWRhdGVfbGlzdFJlc2VydmVkV29yZEluSW1wb3J0QXNzaWduUHJvcGVydHlFeHBlY3RlZEV4cGVjdGVkU2VtaUZvckV4cHJTdG10QXdhaXRTdGFyUmVzZXJ2ZWRXb3JkSW5PYmpTaG9ydGhhbmRPclBhdE51bGxpc2hDb2FsZXNjaW5nV2l0aExvZ2ljYWxPcE11bHRpcGxlRGVmYXVsdHByZXZpb3VzQ29tbWFBZnRlclJlc3RFbGVtZW50Tm9uTGFzdFJlc3RQYXJhbVNwcmVhZEluUGFyZW5FeHByRW1wdHlQYXJlbkV4cHJJbnZhbGlkUGF0SW52YWxpZEV4cHJOb3RTaW1wbGVBc3NpZ25JbnZhbGlkQXNzaWduVGFyZ2V0RXhwZWN0ZWRJZGVudEV4cGVjdGVkU2VtaUR1cGxpY2F0ZUxhYmVsQXN5bmNHZW5lcmF0b3JOb25Ub3BMZXZlbEltcG9ydEV4cG9ydEltcG9ydEV4cG9ydEluU2NyaXB0SW1wb3J0TWV0YUluU2NyaXB0UGF0VmFyV2l0aG91dEluaXRXaXRoSW5TdHJpY3RSZXR1cm5Ob3RBbGxvd2VkVG9vTWFueVZhckluRm9ySW5IZWFkVmFySW5pdGlhbGl6ZXJJbkZvckluSGVhZExhYmVsbGVkR2VuZXJhdG9yT3JBc3luY0xhYmVsbGVkRnVuY3Rpb25JblN0cmljdFlpZWxkUGFyYW1JbkdlbkF3YWl0UGFyYW1JbkFzeW5jQXdhaXRGb3JTdG10QXdhaXRJbkZ1bmN0aW9uVW50ZXJtaW5hdGVkSlNYQ29udGVudHNFbXB0eUpTWEF0dHJJbnZhbGlkSlNYVmFsdWVKU1hFeHBlY3RlZENsb3NpbmdUYWdGb3JMdEd0SlNYRXhwZWN0ZWRDbG9zaW5nVGFndGFnSW52YWxpZExlYWRpbmdEZWNvcmF0b3JEZWNvcmF0b3JPbkV4cG9ydFRzUmVxdWlyZWRBZnRlck9wdGlvbmFsVHNJbnZhbGlkUGFyYW1Qcm9wUGF0U3BhY2VCZXR3ZWVuSGFzaEFuZElkZW50QXN5bmNDb25zdHJ1Y3RvclByb3BlcnR5TmFtZWRDb25zdHJ1Y3RvclByaXZhdGVDb25zdHJ1Y3RvclByaXZhdGVOYW1lTW9kaWZpZXJDb25zdHJ1Y3RvckFjY2Vzc29yUmVhZE9ubHlNZXRob2RHZW5lcmF0b3JDb25zdHJ1Y3RvckR1cGxpY2F0ZUNvbnN0cnVjdG9yVHNCaW5kaW5nUGF0Q2Fubm90QmVPcHRpb25hbFN1cGVyQ2FsbE9wdGlvbmFsT3B0Q2hhaW5DYW5ub3RGb2xsb3dDb25zdHJ1Y3RvckNhbGxUYWdnZWRUcGxJbk9wdENoYWluVHJhaWxpbmdDb21tYUluc2lkZUltcG9ydEV4cG9ydERlZmF1bHRXaXRoT3V0RnJvbUV4cG9ydEV4cGVjdEZyb21Eb3RzV2l0aG91dElkZW50aWZpZXJOdW1lcmljU2VwYXJhdG9ySXNBbGxvd2VkT25seUJldHdlZW5Ud29EaWdpdHNJbXBvcnRCaW5kaW5nSXNTdHJpbmdFeHBvcnRCaW5kaW5nSXNTdHJpbmdDb25zdERlY2xhcmF0aW9uc1JlcXVpcmVJbml0aWFsaXphdGlvbkR1cGxpY2F0ZWRSZWdFeHBGbGFnc1Vua25vd25SZWdFeHBGbGFnc1RTMTAwM1RTMTAwNVRTMTAwOVRTMTAxNFRTMTAxNVRTMTAyOVRTMTAzMFRTMTAzMVRTMTAzOFRTMTA0MlRTMTA0N1RTMTA0OFRTMTA1NlRTMTA4NVRTMTA4OVRTMTA5MlRTMTA5NlRTMTA5OFRTMTEwMFRTMTEwMlRTMTEwNVRTMTEwNlRTMTEwN1RTMTEwOVRTMTExMFRTMTExNFRTMTExNVRTMTExNlRTMTEyM1RTMTE0MVRTMTE2MlRTMTE2NFRTMTE3MVRTMTE3MlRTMTE3M1RTMTE3NFRTMTE3NVRTMTE4M1RTMTE4NFRTMTE4NVRTMTA5M1RTMTE5NlRTMTI0MlRTMTI0M1RTMTI0NFRTMTI0NVRTMTI2N1RTMTI3M1RTMTI3NFRTMTI3N1RTMjIwNlRTMjIwN1RTMjM2OVRTMjM3MVRTMjQwNlRTMjQxMFRTMjQxNFRTMjQyN1RTMjQ1MlRTMjQ4M1RTMjQ5MVRTMjQ5OVRTMjcwM1RTNDExMlRTODAzOFRTMTgwMTBUU1R5cGVBbm5vdGF0aW9uQWZ0ZXJBc3NpZ25Uc05vbk51bGxBc3NlcnRpb25Ob3RBbGxvd2VkV2l0aExhYmVsaW5uZXJub3RlUmVzZXJ2ZWRUeXBlQXNzZXJ0aW9uUmVzZXJ2ZWRBcnJvd1R5cGVQYXJhbVByaXZhdGVQdWJsaWNCbG9ja0RlYnVnZ2VyV2l0aFJldHVybkxhYmVsZWRCcmVha0NvbnRpbnVlSWZTd2l0Y2hUaHJvd1RyeVdoaWxlRG9XaGlsZUZvckZvckluRm9yT2ZEZWNsAAAAAAEAAAABAAAADwAAAEZuRGVjbGlkZW50AAAAAAAIAAAABAAAAHoAAAAAAAAABAAAAAQAAADsAQAAAAAAAAQAAAAEAAAAjwAAAGN0eHRzeW1vcHRpb25hbAAAAAAABAAAAAQAAABBAQAAUmVzdFBhdGRvdDNfdG9rZW5hcmd0eXBlX2FubklmU3RtdHRlc3Rjb25zYWx0QXJyYXlQYXRlbGVtc1ZhckRlY2xVc2luZ0RlY2xQYXQAAACaBAAABAAAAAQAAACZAQAARm9yU3RtdGluaXRib2R5QXNzaWduUGF0bGVmdHJpZ2h0T2JqZWN0UGF0cHJvcHNTdHJOdW1Db21wdXRlZEJpZ0ludEV4cHJTdG10ZXhwcldpdGhTdG10b2JqQ2xhc3NEZWNsQmxvY2tTdG10c3RtdHNCcmVha1N0bXRsYWJlbEVtcHR5U3RtdEZvckluU3RtdEZvck9mU3RtdGlzX2F3YWl0VGhyb3dTdG10V2hpbGVTdG10mwQAACAAAAAIAAAA8gEAAJwEAAAEAAAABAAAAPYBAAA9BAAADAAAAAQAAAC4AQAAAAAAAAEAAAABAAAAQgQAAGtleWlzX3N0YXRpY2RlY29yYXRvcnNhY2Nlc3NpYmlsaXR5aXNfYWJzdHJhY3Rpc19vcHRpb25hbGlzX292ZXJyaWRlZGVmaW5pdGUTKBgABAAAAGCIFgADAAAAzCIYAAUAAAAghxYACAAAAGOIFgAJAAAAbIgWAAoAAAB2iBYADQAAAIOIFgALAAAAjogWAAsAAACZiBYACwAAANcWGAAIAAAAihYYAAcAAACkiBYACAAAAENsYXNzUHJvcERlY29yYXRvclJldHVyblN0bXRTd2l0Y2hDYXNlU3dpdGNoU3RtdGRpc2NyaW1pbmFudGNhc2VzTWV0aG9kR2V0dGVyU2V0dGVyQ2F0Y2hDbGF1c2VwYXJhbURvV2hpbGVTdG10TGFiZWxlZFN0bXRDb25zdHJ1Y3RvclByaXZhdGVNZXRob2RQcml2YXRlUHJvcFRzSW5kZXhTaWduYXR1cmVTdGF0aWNCbG9ja0F1dG9BY2Nlc3NvcgCdBAAABAAAAAQAAACeBAAAAAAAAAEAAAABAAAAnwQAAGtpbmQTKBgABAAAAGCIFgADAAAAmBgYAAgAAAD4iRYABAAAAGOIFgAJAAAAdogWAA0AAACDiBYACwAAAI6IFgALAAAAmYgWAAsAAABDbGFzc01ldGhvZACgBAAADAAAAAQAAAChBAAAogQAABgAAAAEAAAAlgQAAHBhcmFtcwAAEygYAAQAAADshhYABAAAAGCIFgADAAAAcIoWAAYAAAB3hxYABAAAAHaIFgANAAAAjogWAAsAAACjBAAAEAAAAAgAAACkBAAAEygYAAQAAADshhYABAAAAGCIFgADAAAAzCIYAAUAAAAghxYACAAAAGOIFgAJAAAAbIgWAAoAAAB2iBYADQAAAI6IFgALAAAAmYgWAAsAAADXFhgACAAAAKSIFgAIAAAAUHJpdmF0ZU5hbWVuYW1lTW9kdWxlRGVjbFN0bXRBc3NpZ25QYXRQcm9wS2V5VmFsdWVDb250aW51ZVN0bXREZWJ1Z2dlclN0bXQAAKUEAAAgAAAACAAAAKYEAAATKBgABAAAAGCIFgADAAAAzCIYAAUAAAAghxYACAAAAGOIFgAJAAAAbIgWAAoAAAB2iBYADQAAAIOIFgALAAAAmYgWAAsAAACkiBYACAAAAFZhckRlY2xhcmF0b3JCaW5kaW5nSWRlbnRLZXlWYWx1ZVBhdFByb3BzdHJ1Y3QgVHNTeW50YXgAgaoWAHAAAAD9AAAAAQAAAF9hcHBseV9kZWNvcmF0ZWRfZGVzY3JpcHRvckBzd2MvaGVscGVycy9fL19hcHBseV9kZWNvcmF0ZWRfZGVzY3JpcHRvcl9hcnJheV9saWtlX3RvX2FycmF5QHN3Yy9oZWxwZXJzL18vX2FycmF5X2xpa2VfdG9fYXJyYXlfYXJyYXlfd2l0aF9ob2xlc0Bzd2MvaGVscGVycy9fL19hcnJheV93aXRoX2hvbGVzX2FycmF5X3dpdGhvdXRfaG9sZXNAc3djL2hlbHBlcnMvXy9fYXJyYXlfd2l0aG91dF9ob2xlc19hc3NlcnRfdGhpc19pbml0aWFsaXplZEBzd2MvaGVscGVycy9fL19hc3NlcnRfdGhpc19pbml0aWFsaXplZF9hc3luY19nZW5lcmF0b3JAc3djL2hlbHBlcnMvXy9fYXN5bmNfZ2VuZXJhdG9yX2FzeW5jX2dlbmVyYXRvcl9kZWxlZ2F0ZUBzd2MvaGVscGVycy9fL19hc3luY19nZW5lcmF0b3JfZGVsZWdhdGVfYXN5bmNfaXRlcmF0b3JAc3djL2hlbHBlcnMvXy9fYXN5bmNfaXRlcmF0b3JfYXN5bmNfdG9fZ2VuZXJhdG9yQHN3Yy9oZWxwZXJzL18vX2FzeW5jX3RvX2dlbmVyYXRvcl9hd2FpdF9hc3luY19nZW5lcmF0b3JAc3djL2hlbHBlcnMvXy9fYXdhaXRfYXN5bmNfZ2VuZXJhdG9yX2F3YWl0X3ZhbHVlQHN3Yy9oZWxwZXJzL18vX2F3YWl0X3ZhbHVlX2NhbGxfc3VwZXJAc3djL2hlbHBlcnMvXy9fY2FsbF9zdXBlcl9jaGVja19wcml2YXRlX3JlZGVjbGFyYXRpb25Ac3djL2hlbHBlcnMvXy9fY2hlY2tfcHJpdmF0ZV9yZWRlY2xhcmF0aW9uX2NsYXNzX2FwcGx5X2Rlc2NyaXB0b3JfZGVzdHJ1Y3R1cmVAc3djL2hlbHBlcnMvXy9fY2xhc3NfYXBwbHlfZGVzY3JpcHRvcl9kZXN0cnVjdHVyZV9jbGFzc19hcHBseV9kZXNjcmlwdG9yX2dldEBzd2MvaGVscGVycy9fL19jbGFzc19hcHBseV9kZXNjcmlwdG9yX2dldF9jbGFzc19hcHBseV9kZXNjcmlwdG9yX3NldEBzd2MvaGVscGVycy9fL19jbGFzc19hcHBseV9kZXNjcmlwdG9yX3NldF9jbGFzc19hcHBseV9kZXNjcmlwdG9yX3VwZGF0ZUBzd2MvaGVscGVycy9fL19jbGFzc19hcHBseV9kZXNjcmlwdG9yX3VwZGF0ZV9jbGFzc19jYWxsX2NoZWNrQHN3Yy9oZWxwZXJzL18vX2NsYXNzX2NhbGxfY2hlY2tfY2xhc3NfY2hlY2tfcHJpdmF0ZV9zdGF0aWNfZmllbGRfZGVzY3JpcHRvckBzd2MvaGVscGVycy9fL19jbGFzc19jaGVja19wcml2YXRlX3N0YXRpY19maWVsZF9kZXNjcmlwdG9yX2NsYXNzX2V4dHJhY3RfZmllbGRfZGVzY3JpcHRvckBzd2MvaGVscGVycy9fL19jbGFzc19leHRyYWN0X2ZpZWxkX2Rlc2NyaXB0b3JfY2xhc3NfbmFtZV90ZHpfZXJyb3JAc3djL2hlbHBlcnMvXy9fY2xhc3NfbmFtZV90ZHpfZXJyb3JfY2xhc3NfcHJpdmF0ZV9maWVsZF9nZXRAc3djL2hlbHBlcnMvXy9fY2xhc3NfcHJpdmF0ZV9maWVsZF9nZXRfY2xhc3NfcHJpdmF0ZV9maWVsZF9pbml0QHN3Yy9oZWxwZXJzL18vX2NsYXNzX3ByaXZhdGVfZmllbGRfaW5pdF9jbGFzc19wcml2YXRlX2ZpZWxkX2xvb3NlX2Jhc2VAc3djL2hlbHBlcnMvXy9fY2xhc3NfcHJpdmF0ZV9maWVsZF9sb29zZV9iYXNlX2NsYXNzX3ByaXZhdGVfZmllbGRfbG9vc2Vfa2V5QHN3Yy9oZWxwZXJzL18vX2NsYXNzX3ByaXZhdGVfZmllbGRfbG9vc2Vfa2V5X2NsYXNzX3ByaXZhdGVfZmllbGRfc2V0QHN3Yy9oZWxwZXJzL18vX2NsYXNzX3ByaXZhdGVfZmllbGRfc2V0X2NsYXNzX3ByaXZhdGVfZmllbGRfdXBkYXRlQHN3Yy9oZWxwZXJzL18vX2NsYXNzX3ByaXZhdGVfZmllbGRfdXBkYXRlX2NsYXNzX3ByaXZhdGVfbWV0aG9kX2dldEBzd2MvaGVscGVycy9fL19jbGFzc19wcml2YXRlX21ldGhvZF9nZXRfY2xhc3NfcHJpdmF0ZV9tZXRob2RfaW5pdEBzd2MvaGVscGVycy9fL19jbGFzc19wcml2YXRlX21ldGhvZF9pbml0X2NsYXNzX3ByaXZhdGVfbWV0aG9kX3NldEBzd2MvaGVscGVycy9fL19jbGFzc19wcml2YXRlX21ldGhvZF9zZXRfY2xhc3Nfc3RhdGljX3ByaXZhdGVfZmllbGRfc3BlY19nZXRAc3djL2hlbHBlcnMvXy9fY2xhc3Nfc3RhdGljX3ByaXZhdGVfZmllbGRfc3BlY19nZXRfY2xhc3Nfc3RhdGljX3ByaXZhdGVfZmllbGRfc3BlY19zZXRAc3djL2hlbHBlcnMvXy9fY2xhc3Nfc3RhdGljX3ByaXZhdGVfZmllbGRfc3BlY19zZXRfY2xhc3Nfc3RhdGljX3ByaXZhdGVfZmllbGRfdXBkYXRlQHN3Yy9oZWxwZXJzL18vX2NsYXNzX3N0YXRpY19wcml2YXRlX2ZpZWxkX3VwZGF0ZV9jb25zdHJ1Y3RAc3djL2hlbHBlcnMvXy9fY29uc3RydWN0X2NyZWF0ZV9jbGFzc0Bzd2MvaGVscGVycy9fL19jcmVhdGVfY2xhc3NfZGVjb3JhdGVAc3djL2hlbHBlcnMvXy9fZGVjb3JhdGVfZGVmYXVsdHNAc3djL2hlbHBlcnMvXy9fZGVmYXVsdHNfZGVmaW5lX2VudW1lcmFibGVfcHJvcGVydGllc0Bzd2MvaGVscGVycy9fL19kZWZpbmVfZW51bWVyYWJsZV9wcm9wZXJ0aWVzX2RlZmluZV9wcm9wZXJ0eUBzd2MvaGVscGVycy9fL19kZWZpbmVfcHJvcGVydHlfZXhwb3J0X3N0YXJAc3djL2hlbHBlcnMvXy9fZXhwb3J0X3N0YXJfZXh0ZW5kc0Bzd2MvaGVscGVycy9fL19leHRlbmRzX2dldEBzd2MvaGVscGVycy9fL19nZXRfZ2V0X3Byb3RvdHlwZV9vZkBzd2MvaGVscGVycy9fL19nZXRfcHJvdG90eXBlX29mX2luaGVyaXRzQHN3Yy9oZWxwZXJzL18vX2luaGVyaXRzX2luaGVyaXRzX2xvb3NlQHN3Yy9oZWxwZXJzL18vX2luaGVyaXRzX2xvb3NlX2luaXRpYWxpemVyX2RlZmluZV9wcm9wZXJ0eUBzd2MvaGVscGVycy9fL19pbml0aWFsaXplcl9kZWZpbmVfcHJvcGVydHlfaW5pdGlhbGl6ZXJfd2FybmluZ19oZWxwZXJAc3djL2hlbHBlcnMvXy9faW5pdGlhbGl6ZXJfd2FybmluZ19oZWxwZXJfaW5zdGFuY2VvZkBzd2MvaGVscGVycy9fL19pbnN0YW5jZW9mX2ludGVyb3BfcmVxdWlyZV9kZWZhdWx0QHN3Yy9oZWxwZXJzL18vX2ludGVyb3BfcmVxdWlyZV9kZWZhdWx0X2ludGVyb3BfcmVxdWlyZV93aWxkY2FyZEBzd2MvaGVscGVycy9fL19pbnRlcm9wX3JlcXVpcmVfd2lsZGNhcmRfaXNfbmF0aXZlX2Z1bmN0aW9uQHN3Yy9oZWxwZXJzL18vX2lzX25hdGl2ZV9mdW5jdGlvbl9pdGVyYWJsZV90b19hcnJheUBzd2MvaGVscGVycy9fL19pdGVyYWJsZV90b19hcnJheV9pdGVyYWJsZV90b19hcnJheV9saW1pdEBzd2MvaGVscGVycy9fL19pdGVyYWJsZV90b19hcnJheV9saW1pdF9pdGVyYWJsZV90b19hcnJheV9saW1pdF9sb29zZUBzd2MvaGVscGVycy9fL19pdGVyYWJsZV90b19hcnJheV9saW1pdF9sb29zZV9qc3hAc3djL2hlbHBlcnMvXy9fanN4X25ld19hcnJvd19jaGVja0Bzd2MvaGVscGVycy9fL19uZXdfYXJyb3dfY2hlY2tfbm9uX2l0ZXJhYmxlX3Jlc3RAc3djL2hlbHBlcnMvXy9fbm9uX2l0ZXJhYmxlX3Jlc3Rfbm9uX2l0ZXJhYmxlX3NwcmVhZEBzd2MvaGVscGVycy9fL19ub25faXRlcmFibGVfc3ByZWFkX29iamVjdF9kZXN0cnVjdHVyaW5nX2VtcHR5QHN3Yy9oZWxwZXJzL18vX29iamVjdF9kZXN0cnVjdHVyaW5nX2VtcHR5X29iamVjdF9zcHJlYWRAc3djL2hlbHBlcnMvXy9fb2JqZWN0X3NwcmVhZF9vYmplY3Rfc3ByZWFkX3Byb3BzQHN3Yy9oZWxwZXJzL18vX29iamVjdF9zcHJlYWRfcHJvcHNfb2JqZWN0X3dpdGhvdXRfcHJvcGVydGllc0Bzd2MvaGVscGVycy9fL19vYmplY3Rfd2l0aG91dF9wcm9wZXJ0aWVzX29iamVjdF93aXRob3V0X3Byb3BlcnRpZXNfbG9vc2VAc3djL2hlbHBlcnMvXy9fb2JqZWN0X3dpdGhvdXRfcHJvcGVydGllc19sb29zZV9wb3NzaWJsZV9jb25zdHJ1Y3Rvcl9yZXR1cm5Ac3djL2hlbHBlcnMvXy9fcG9zc2libGVfY29uc3RydWN0b3JfcmV0dXJuX3JlYWRfb25seV9lcnJvckBzd2MvaGVscGVycy9fL19yZWFkX29ubHlfZXJyb3Jfc2V0QHN3Yy9oZWxwZXJzL18vX3NldF9zZXRfcHJvdG90eXBlX29mQHN3Yy9oZWxwZXJzL18vX3NldF9wcm90b3R5cGVfb2Zfc2tpcF9maXJzdF9nZW5lcmF0b3JfbmV4dEBzd2MvaGVscGVycy9fL19za2lwX2ZpcnN0X2dlbmVyYXRvcl9uZXh0X3NsaWNlZF90b19hcnJheUBzd2MvaGVscGVycy9fL19zbGljZWRfdG9fYXJyYXlfc2xpY2VkX3RvX2FycmF5X2xvb3NlQHN3Yy9oZWxwZXJzL18vX3NsaWNlZF90b19hcnJheV9sb29zZV9zdXBlcl9wcm9wX2Jhc2VAc3djL2hlbHBlcnMvXy9fc3VwZXJfcHJvcF9iYXNlX3RhZ2dlZF90ZW1wbGF0ZV9saXRlcmFsQHN3Yy9oZWxwZXJzL18vX3RhZ2dlZF90ZW1wbGF0ZV9saXRlcmFsX3RhZ2dlZF90ZW1wbGF0ZV9saXRlcmFsX2xvb3NlQHN3Yy9oZWxwZXJzL18vX3RhZ2dlZF90ZW1wbGF0ZV9saXRlcmFsX2xvb3NlX3Rocm93QHN3Yy9oZWxwZXJzL18vX3Rocm93X3RvX2FycmF5QHN3Yy9oZWxwZXJzL18vX3RvX2FycmF5X3RvX2NvbnN1bWFibGVfYXJyYXlAc3djL2hlbHBlcnMvXy9fdG9fY29uc3VtYWJsZV9hcnJheV90b19wcmltaXRpdmVAc3djL2hlbHBlcnMvXy9fdG9fcHJpbWl0aXZlX3RvX3Byb3BlcnR5X2tleUBzd2MvaGVscGVycy9fL190b19wcm9wZXJ0eV9rZXlfdXBkYXRlQHN3Yy9oZWxwZXJzL18vX3VwZGF0ZV90eXBlX29mQHN3Yy9oZWxwZXJzL18vX3R5cGVfb2ZfdW5zdXBwb3J0ZWRfaXRlcmFibGVfdG9fYXJyYXlAc3djL2hlbHBlcnMvXy9fdW5zdXBwb3J0ZWRfaXRlcmFibGVfdG9fYXJyYXlfd3JhcF9hc3luY19nZW5lcmF0b3JAc3djL2hlbHBlcnMvXy9fd3JhcF9hc3luY19nZW5lcmF0b3Jfd3JhcF9uYXRpdmVfc3VwZXJAc3djL2hlbHBlcnMvXy9fd3JhcF9uYXRpdmVfc3VwZXJfd3JpdGVfb25seV9lcnJvckBzd2MvaGVscGVycy9fL193cml0ZV9vbmx5X2Vycm9yX2NsYXNzX3ByaXZhdGVfZmllbGRfZGVzdHJ1Y3R1cmVAc3djL2hlbHBlcnMvXy9fY2xhc3NfcHJpdmF0ZV9maWVsZF9kZXN0cnVjdHVyZV9jbGFzc19zdGF0aWNfcHJpdmF0ZV9maWVsZF9kZXN0cnVjdHVyZUBzd2MvaGVscGVycy9fL19jbGFzc19zdGF0aWNfcHJpdmF0ZV9maWVsZF9kZXN0cnVjdHVyZV9jbGFzc19zdGF0aWNfcHJpdmF0ZV9tZXRob2RfZ2V0QHN3Yy9oZWxwZXJzL18vX2NsYXNzX3N0YXRpY19wcml2YXRlX21ldGhvZF9nZXRfY2xhc3NfY2hlY2tfcHJpdmF0ZV9zdGF0aWNfYWNjZXNzQHN3Yy9oZWxwZXJzL18vX2NsYXNzX2NoZWNrX3ByaXZhdGVfc3RhdGljX2FjY2Vzc19pc19uYXRpdmVfcmVmbGVjdF9jb25zdHJ1Y3RAc3djL2hlbHBlcnMvXy9faXNfbmF0aXZlX3JlZmxlY3RfY29uc3RydWN0X2NyZWF0ZV9zdXBlckBzd2MvaGVscGVycy9fL19jcmVhdGVfc3VwZXJfY3JlYXRlX2Zvcl9vZl9pdGVyYXRvcl9oZWxwZXJfbG9vc2VAc3djL2hlbHBlcnMvXy9fY3JlYXRlX2Zvcl9vZl9pdGVyYXRvcl9oZWxwZXJfbG9vc2VfdHNfZGVjb3JhdGVAc3djL2hlbHBlcnMvXy9fdHNfZGVjb3JhdGVfdHNfZ2VuZXJhdG9yQHN3Yy9oZWxwZXJzL18vX3RzX2dlbmVyYXRvcl90c19tZXRhZGF0YUBzd2MvaGVscGVycy9fL190c19tZXRhZGF0YV90c19wYXJhbUBzd2MvaGVscGVycy9fL190c19wYXJhbV90c192YWx1ZXNAc3djL2hlbHBlcnMvXy9fdHNfdmFsdWVzX3RzX2FkZF9kaXNwb3NhYmxlX3Jlc291cmNlQHN3Yy9oZWxwZXJzL18vX3RzX2FkZF9kaXNwb3NhYmxlX3Jlc291cmNlX3RzX2Rpc3Bvc2VfcmVzb3VyY2VzQHN3Yy9oZWxwZXJzL18vX3RzX2Rpc3Bvc2VfcmVzb3VyY2VzX2FwcGx5X2RlY3NfMjIwM19yQHN3Yy9oZWxwZXJzL18vX2FwcGx5X2RlY3NfMjIwM19yX2lkZW50aXR5QHN3Yy9oZWxwZXJzL18vX2lkZW50aXR5X2Rpc3Bvc2VAc3djL2hlbHBlcnMvXy9fZGlzcG9zZV91c2luZ0Bzd2MvaGVscGVycy9fL191c2luZ191c2luZ19jdHhAc3djL2hlbHBlcnMvXy9fdXNpbmdfY3R4YXBwbHlfZGVjb3JhdGVkX2Rlc2NyaXB0b3JhcnJheV9saWtlX3RvX2FycmF5YXJyYXlfd2l0aF9ob2xlc2FycmF5X3dpdGhvdXRfaG9sZXNhc3NlcnRfdGhpc19pbml0aWFsaXplZGFzeW5jX2dlbmVyYXRvcmFzeW5jX2dlbmVyYXRvcl9kZWxlZ2F0ZWFzeW5jX2l0ZXJhdG9yYXN5bmNfdG9fZ2VuZXJhdG9yYXdhaXRfYXN5bmNfZ2VuZXJhdG9yYXdhaXRfdmFsdWVjYWxsX3N1cGVyY2hlY2tfcHJpdmF0ZV9yZWRlY2xhcmF0aW9uY2xhc3NfYXBwbHlfZGVzY3JpcHRvcl9kZXN0cnVjdHVyZWNsYXNzX2FwcGx5X2Rlc2NyaXB0b3JfZ2V0Y2xhc3NfYXBwbHlfZGVzY3JpcHRvcl9zZXRjbGFzc19hcHBseV9kZXNjcmlwdG9yX3VwZGF0ZWNsYXNzX2NhbGxfY2hlY2tjbGFzc19jaGVja19wcml2YXRlX3N0YXRpY19maWVsZF9kZXNjcmlwdG9yY2xhc3NfZXh0cmFjdF9maWVsZF9kZXNjcmlwdG9yY2xhc3NfbmFtZV90ZHpfZXJyb3JjbGFzc19wcml2YXRlX2ZpZWxkX2dldGNsYXNzX3ByaXZhdGVfZmllbGRfaW5pdGNsYXNzX3ByaXZhdGVfZmllbGRfbG9vc2VfYmFzZWNsYXNzX3ByaXZhdGVfZmllbGRfbG9vc2Vfa2V5Y2xhc3NfcHJpdmF0ZV9maWVsZF9zZXRjbGFzc19wcml2YXRlX2ZpZWxkX3VwZGF0ZWNsYXNzX3ByaXZhdGVfbWV0aG9kX2dldGNsYXNzX3ByaXZhdGVfbWV0aG9kX2luaXRjbGFzc19wcml2YXRlX21ldGhvZF9zZXRjbGFzc19zdGF0aWNfcHJpdmF0ZV9maWVsZF9zcGVjX2dldGNsYXNzX3N0YXRpY19wcml2YXRlX2ZpZWxkX3NwZWNfc2V0Y2xhc3Nfc3RhdGljX3ByaXZhdGVfZmllbGRfdXBkYXRlY29uc3RydWN0Y3JlYXRlX2NsYXNzZGVjb3JhdGVkZWZhdWx0c2RlZmluZV9lbnVtZXJhYmxlX3Byb3BlcnRpZXNkZWZpbmVfcHJvcGVydHlleHBvcnRfc3RhcmdldF9wcm90b3R5cGVfb2Zpbmhlcml0c2luaGVyaXRzX2xvb3NlaW5pdGlhbGl6ZXJfZGVmaW5lX3Byb3BlcnR5aW5pdGlhbGl6ZXJfd2FybmluZ19oZWxwZXJpbnRlcm9wX3JlcXVpcmVfZGVmYXVsdGludGVyb3BfcmVxdWlyZV93aWxkY2FyZGlzX25hdGl2ZV9mdW5jdGlvbml0ZXJhYmxlX3RvX2FycmF5aXRlcmFibGVfdG9fYXJyYXlfbGltaXRpdGVyYWJsZV90b19hcnJheV9saW1pdF9sb29zZWpzeG5ld19hcnJvd19jaGVja25vbl9pdGVyYWJsZV9yZXN0bm9uX2l0ZXJhYmxlX3NwcmVhZG9iamVjdF9kZXN0cnVjdHVyaW5nX2VtcHR5b2JqZWN0X3NwcmVhZG9iamVjdF9zcHJlYWRfcHJvcHNvYmplY3Rfd2l0aG91dF9wcm9wZXJ0aWVzb2JqZWN0X3dpdGhvdXRfcHJvcGVydGllc19sb29zZXBvc3NpYmxlX2NvbnN0cnVjdG9yX3JldHVybnJlYWRfb25seV9lcnJvcnNldF9wcm90b3R5cGVfb2Zza2lwX2ZpcnN0X2dlbmVyYXRvcl9uZXh0c2xpY2VkX3RvX2FycmF5c2xpY2VkX3RvX2FycmF5X2xvb3Nlc3VwZXJfcHJvcF9iYXNldGFnZ2VkX3RlbXBsYXRlX2xpdGVyYWx0YWdnZWRfdGVtcGxhdGVfbGl0ZXJhbF9sb29zZXRvX2FycmF5dG9fY29uc3VtYWJsZV9hcnJheXRvX3ByaW1pdGl2ZXRvX3Byb3BlcnR5X2tleXVwZGF0ZXR5cGVfb2Z1bnN1cHBvcnRlZF9pdGVyYWJsZV90b19hcnJheXdyYXBfYXN5bmNfZ2VuZXJhdG9yd3JhcF9uYXRpdmVfc3VwZXJ3cml0ZV9vbmx5X2Vycm9yY2xhc3NfcHJpdmF0ZV9maWVsZF9kZXN0cnVjdHVyZWNsYXNzX3N0YXRpY19wcml2YXRlX2ZpZWxkX2Rlc3RydWN0dXJlY2xhc3Nfc3RhdGljX3ByaXZhdGVfbWV0aG9kX2dldGNsYXNzX2NoZWNrX3ByaXZhdGVfc3RhdGljX2FjY2Vzc2lzX25hdGl2ZV9yZWZsZWN0X2NvbnN0cnVjdGNyZWF0ZV9zdXBlcmNyZWF0ZV9mb3Jfb2ZfaXRlcmF0b3JfaGVscGVyX2xvb3NldHNfZGVjb3JhdGV0c19nZW5lcmF0b3J0c19tZXRhZGF0YXRzX3BhcmFtdHNfdmFsdWVzdHNfYWRkX2Rpc3Bvc2FibGVfcmVzb3VyY2V0c19kaXNwb3NlX3Jlc291cmNlc2FwcGx5X2RlY3NfMjIwM19yaWRlbnRpdHlkaXNwb3NldXNpbmdfY3R4TWFya2VyIHByb3ZpZGVkIHRvIHJlc29sdmVyIHNob3VsZCBub3QgYmUgdGhlIHJvb3QgbWFyawAAK6oWADcAAABI2RcAcQAAAIoAAAAFAAAAJG5hbWUvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9zd2NfZWNtYV90cmFuc2Zvcm1zX2Jhc2UtMS4wLjEvc3JjL2hlbHBlcnMvbW9kLnJzaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogRXJyb3Igb2NjdXJyZWQgd2hpbGUgcGFyc2luZyBlcnJvcjogAPGqFgBOAAAAgaoWAHAAAAAoAAAACQAAAEBzd2MvaGVscGVycy9fL19YqxYAEAAAAGlkcmVzb3VyY2VfX6cEAABmdW5jdGlvbiBfYXBwbHlfZGVjb3JhdGVkX2Rlc2NyaXB0b3IodGFyZ2V0LCBwcm9wZXJ0eSwgZGVjb3JhdG9ycywgZGVzY3JpcHRvciwgY29udGV4dCkgewogICAgdmFyIGRlc2MgPSB7fTsKICAgIE9iamVjdFsia2UiICsgInlzIl0oZGVzY3JpcHRvcikuZm9yRWFjaChmdW5jdGlvbihrZXkpIHsKICAgICAgICBkZXNjW2tleV0gPSBkZXNjcmlwdG9yW2tleV07CiAgICB9KTsKICAgIGRlc2MuZW51bWVyYWJsZSA9ICEhZGVzYy5lbnVtZXJhYmxlOwogICAgZGVzYy5jb25maWd1cmFibGUgPSAhIWRlc2MuY29uZmlndXJhYmxlOwogICAgaWYgKCJ2YWx1ZSIgaW4gZGVzYyB8fCBkZXNjLmluaXRpYWxpemVyKSB7CiAgICAgICAgZGVzYy53cml0YWJsZSA9IHRydWU7CiAgICB9CiAgICBkZXNjID0gZGVjb3JhdG9ycy5zbGljZSgpLnJldmVyc2UoKS5yZWR1Y2UoZnVuY3Rpb24oZGVzYywgZGVjb3JhdG9yKSB7CiAgICAgICAgcmV0dXJuIGRlY29yYXRvciA/IGRlY29yYXRvcih0YXJnZXQsIHByb3BlcnR5LCBkZXNjKSB8fCBkZXNjIDogZGVzYzsKICAgIH0sIGRlc2MpOwogICAgdmFyIGhhc0FjY2Vzc29yID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRlc2MsICJnZXQiKSB8fCBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGVzYywgInNldCIpOwogICAgaWYgKGNvbnRleHQgJiYgZGVzYy5pbml0aWFsaXplciAhPT0gdm9pZCAwICYmICFoYXNBY2Nlc3NvcikgewogICAgICAgIGRlc2MudmFsdWUgPSBkZXNjLmluaXRpYWxpemVyID8gZGVzYy5pbml0aWFsaXplci5jYWxsKGNvbnRleHQpIDogdm9pZCAwOwogICAgICAgIGRlc2MuaW5pdGlhbGl6ZXIgPSB1bmRlZmluZWQ7CiAgICB9CiAgICBpZiAoaGFzQWNjZXNzb3IpIHsKICAgICAgICBkZWxldGUgZGVzYy53cml0YWJsZTsKICAgICAgICBkZWxldGUgZGVzYy5pbml0aWFsaXplcjsKICAgICAgICBkZWxldGUgZGVzYy52YWx1ZTsKICAgIH0KICAgIGlmIChkZXNjLmluaXRpYWxpemVyID09PSB2b2lkIDApIHsKICAgICAgICBPYmplY3RbImRlZmluZSIgKyAiUHJvcGVydHkiXSh0YXJnZXQsIHByb3BlcnR5LCBkZXNjKTsKICAgICAgICBkZXNjID0gbnVsbDsKICAgIH0KICAgIHJldHVybiBkZXNjOwp9CmZ1bmN0aW9uIF9hcnJheV9saWtlX3RvX2FycmF5KGFyciwgbGVuKSB7CiAgICBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgYXJyMltpXSA9IGFycltpXTsKICAgIHJldHVybiBhcnIyOwp9CmZ1bmN0aW9uIF9hcnJheV93aXRoX2hvbGVzKGFycikgewogICAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjsKfQpmdW5jdGlvbiBfYXJyYXlfd2l0aG91dF9ob2xlcyhhcnIpIHsKICAgIGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBfYXJyYXlfbGlrZV90b19hcnJheShhcnIpOwp9CmZ1bmN0aW9uIF9hc3NlcnRfdGhpc19pbml0aWFsaXplZChzZWxmKSB7CiAgICBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7CiAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTsKICAgIH0KICAgIHJldHVybiBzZWxmOwp9CmZ1bmN0aW9uIF9hc3luY19nZW5lcmF0b3IoZ2VuKSB7CiAgICB2YXIgZnJvbnQsIGJhY2s7CiAgICBmdW5jdGlvbiBzZW5kKGtleSwgYXJnKSB7CiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICB2YXIgcmVxdWVzdCA9IHsga2V5OiBrZXksIGFyZzogYXJnLCByZXNvbHZlOiByZXNvbHZlLCByZWplY3Q6IHJlamVjdCwgbmV4dDogbnVsbCB9OwogICAgICAgICAgICBpZiAoYmFjaykgewogICAgICAgICAgICAgICAgYmFjayA9IGJhY2submV4dCA9IHJlcXVlc3Q7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBmcm9udCA9IGJhY2sgPSByZXF1ZXN0OwogICAgICAgICAgICAgICAgcmVzdW1lKGtleSwgYXJnKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gcmVzdW1lKGtleSwgYXJnKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGdlbltrZXldKGFyZyk7CiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHJlc3VsdC52YWx1ZTsKICAgICAgICAgICAgdmFyIHdyYXBwZWRBd2FpdCA9IHZhbHVlIGluc3RhbmNlb2YgX2F3YWl0X3ZhbHVlOwogICAgICAgICAgICBQcm9taXNlLnJlc29sdmUod3JhcHBlZEF3YWl0ID8gdmFsdWUud3JhcHBlZCA6IHZhbHVlKS50aGVuKGZ1bmN0aW9uKGFyZykgewogICAgICAgICAgICAgICAgaWYgKHdyYXBwZWRBd2FpdCkgewogICAgICAgICAgICAgICAgICAgIHJlc3VtZSgibmV4dCIsIGFyZyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc2V0dGxlKHJlc3VsdC5kb25lID8gInJldHVybiIgOiAibm9ybWFsIiwgYXJnKTsKICAgICAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICByZXN1bWUoInRocm93IiwgZXJyKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIHNldHRsZSgidGhyb3ciLCBlcnIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHNldHRsZSh0eXBlLCB2YWx1ZSkgewogICAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgICAgICBjYXNlICJyZXR1cm4iOgogICAgICAgICAgICAgICAgZnJvbnQucmVzb2x2ZSh7IHZhbHVlOiB2YWx1ZSwgZG9uZTogdHJ1ZSB9KTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJ0aHJvdyI6CiAgICAgICAgICAgICAgICBmcm9udC5yZWplY3QodmFsdWUpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBmcm9udC5yZXNvbHZlKHsgdmFsdWU6IHZhbHVlLCBkb25lOiBmYWxzZSB9KTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBmcm9udCA9IGZyb250Lm5leHQ7CiAgICAgICAgaWYgKGZyb250KSB7CiAgICAgICAgICAgIHJlc3VtZShmcm9udC5rZXksIGZyb250LmFyZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYmFjayA9IG51bGw7CiAgICAgICAgfQogICAgfQogICAgdGhpcy5faW52b2tlID0gc2VuZDsKICAgIGlmICh0eXBlb2YgZ2VuLnJldHVybiAhPT0gImZ1bmN0aW9uIikgewogICAgICAgIHRoaXMucmV0dXJuID0gdW5kZWZpbmVkOwogICAgfQp9CmlmICh0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5hc3luY0l0ZXJhdG9yKSB7CiAgICBfYXN5bmNfZ2VuZXJhdG9yLnByb3RvdHlwZVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH07Cn0KX2FzeW5jX2dlbmVyYXRvci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uKGFyZykgewogICAgcmV0dXJuIHRoaXMuX2ludm9rZSgibmV4dCIsIGFyZyk7Cn07Cl9hc3luY19nZW5lcmF0b3IucHJvdG90eXBlLnRocm93ID0gZnVuY3Rpb24oYXJnKSB7CiAgICByZXR1cm4gdGhpcy5faW52b2tlKCJ0aHJvdyIsIGFyZyk7Cn07Cl9hc3luY19nZW5lcmF0b3IucHJvdG90eXBlLnJldHVybiA9IGZ1bmN0aW9uKGFyZykgewogICAgcmV0dXJuIHRoaXMuX2ludm9rZSgicmV0dXJuIiwgYXJnKTsKfTsKZnVuY3Rpb24gX2FzeW5jX2dlbmVyYXRvcl9kZWxlZ2F0ZShpbm5lciwgYXdhaXRXcmFwKSB7CiAgICB2YXIgaXRlciA9IHt9LCB3YWl0aW5nID0gZmFsc2U7CiAgICBmdW5jdGlvbiBwdW1wKGtleSwgdmFsdWUpIHsKICAgICAgICB3YWl0aW5nID0gdHJ1ZTsKICAgICAgICB2YWx1ZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUpIHsKICAgICAgICAgICAgcmVzb2x2ZShpbm5lcltrZXldKHZhbHVlKSk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBhd2FpdFdyYXAodmFsdWUpIH07CiAgICB9CiAgICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wuaXRlcmF0b3IpIHsKICAgICAgICBpdGVyW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgIH0KICAgIGl0ZXIubmV4dCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgaWYgKHdhaXRpbmcpIHsKICAgICAgICAgICAgd2FpdGluZyA9IGZhbHNlOwogICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwdW1wKCJuZXh0IiwgdmFsdWUpOwogICAgfTsKICAgIGlmICh0eXBlb2YgaW5uZXIudGhyb3cgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICBpdGVyLnRocm93ID0gZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgaWYgKHdhaXRpbmcpIHsKICAgICAgICAgICAgICAgIHdhaXRpbmcgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHRocm93IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBwdW1wKCJ0aHJvdyIsIHZhbHVlKTsKICAgICAgICB9OwogICAgfQogICAgaWYgKHR5cGVvZiBpbm5lci5yZXR1cm4gPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICBpdGVyLnJldHVybiA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiBwdW1wKCJyZXR1cm4iLCB2YWx1ZSk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBpdGVyOwp9CmZ1bmN0aW9uIF9hc3luY19pdGVyYXRvcihpdGVyYWJsZSkgewogICAgdmFyIG1ldGhvZCwgYXN5bmMsIHN5bmMsIHJldHJ5ID0gMjsKICAgIGZvciAoInVuZGVmaW5lZCIgIT0gdHlwZW9mIFN5bWJvbCAmJiAoYXN5bmMgPSBTeW1ib2wuYXN5bmNJdGVyYXRvciwgc3luYyA9IFN5bWJvbC5pdGVyYXRvcik7IHJldHJ5LS07KSB7CiAgICAgICAgaWYgKGFzeW5jICYmIG51bGwgIT0gKG1ldGhvZCA9IGl0ZXJhYmxlW2FzeW5jXSkpIHJldHVybiBtZXRob2QuY2FsbChpdGVyYWJsZSk7CiAgICAgICAgaWYgKHN5bmMgJiYgbnVsbCAhPSAobWV0aG9kID0gaXRlcmFibGVbc3luY10pKSByZXR1cm4gbmV3IEFzeW5jRnJvbVN5bmNJdGVyYXRvcihtZXRob2QuY2FsbChpdGVyYWJsZSkpOwogICAgICAgIGFzeW5jID0gIkBAYXN5bmNJdGVyYXRvciIsIHN5bmMgPSAiQEBpdGVyYXRvciI7CiAgICB9CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgaXMgbm90IGFzeW5jIGl0ZXJhYmxlIik7Cn0KZnVuY3Rpb24gQXN5bmNGcm9tU3luY0l0ZXJhdG9yKHMpIHsKICAgIGZ1bmN0aW9uIEFzeW5jRnJvbVN5bmNJdGVyYXRvckNvbnRpbnVhdGlvbihyKSB7CiAgICAgICAgaWYgKE9iamVjdChyKSAhPT0gcikgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBUeXBlRXJyb3IociArICIgaXMgbm90IGFuIG9iamVjdC4iKSk7CiAgICAgICAgdmFyIGRvbmUgPSByLmRvbmU7CiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyLnZhbHVlKS50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB2YWx1ZSwgZG9uZTogZG9uZSB9OwogICAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIEFzeW5jRnJvbVN5bmNJdGVyYXRvciA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICB0aGlzLnMgPSBzLCB0aGlzLm4gPSBzLm5leHQ7CiAgICB9LAogICAgICAgIEFzeW5jRnJvbVN5bmNJdGVyYXRvci5wcm90b3R5cGUgPSB7CiAgICAgICAgICAgIHM6IG51bGwsCiAgICAgICAgICAgIG46IG51bGwsCiAgICAgICAgICAgIG5leHQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFzeW5jRnJvbVN5bmNJdGVyYXRvckNvbnRpbnVhdGlvbih0aGlzLm4uYXBwbHkodGhpcy5zLCBhcmd1bWVudHMpKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcmV0dXJuOiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgICAgICAgdmFyIHJldCA9IHRoaXMucy5yZXR1cm47CiAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwID09PSByZXQKICAgICAgICAgICAgICAgICAgICA/IFByb21pc2UucmVzb2x2ZSh7IHZhbHVlOiB2YWx1ZSwgZG9uZTogITAgfSkKICAgICAgICAgICAgICAgICAgICA6IEFzeW5jRnJvbVN5bmNJdGVyYXRvckNvbnRpbnVhdGlvbihyZXQuYXBwbHkodGhpcy5zLCBhcmd1bWVudHMpKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgdGhyb3c6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgICAgICB2YXIgdGhyID0gdGhpcy5zLnJldHVybjsKICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDAgPT09IHRociA/IFByb21pc2UucmVqZWN0KHZhbHVlKSA6IEFzeW5jRnJvbVN5bmNJdGVyYXRvckNvbnRpbnVhdGlvbih0aHIuYXBwbHkodGhpcy5zLCBhcmd1bWVudHMpKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgbmV3IEFzeW5jRnJvbVN5bmNJdGVyYXRvcihzKTsKfQpmdW5jdGlvbiBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIGtleSwgYXJnKSB7CiAgICB0cnkgewogICAgICAgIHZhciBpbmZvID0gZ2VuW2tleV0oYXJnKTsKICAgICAgICB2YXIgdmFsdWUgPSBpbmZvLnZhbHVlOwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICByZWplY3QoZXJyb3IpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChpbmZvLmRvbmUpIHsKICAgICAgICByZXNvbHZlKHZhbHVlKTsKICAgIH0gZWxzZSB7CiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKF9uZXh0LCBfdGhyb3cpOwogICAgfQp9CmZ1bmN0aW9uIF9hc3luY190b19nZW5lcmF0b3IoZm4pIHsKICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc2VsZiA9IHRoaXMsIGFyZ3MgPSBhcmd1bWVudHM7CiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICB2YXIgZ2VuID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7CiAgICAgICAgICAgIGZ1bmN0aW9uIF9uZXh0KHZhbHVlKSB7CiAgICAgICAgICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csICJuZXh0IiwgdmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF90aHJvdyhlcnIpIHsKICAgICAgICAgICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgInRocm93IiwgZXJyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBfbmV4dCh1bmRlZmluZWQpOwogICAgICAgIH0pOwogICAgfTsKfQpmdW5jdGlvbiBfYXdhaXRfYXN5bmNfZ2VuZXJhdG9yKHZhbHVlKSB7CiAgICByZXR1cm4gbmV3IF9hd2FpdF92YWx1ZSh2YWx1ZSk7Cn0KZnVuY3Rpb24gX2F3YWl0X3ZhbHVlKHZhbHVlKSB7CiAgICB0aGlzLndyYXBwZWQgPSB2YWx1ZTsKfQpmdW5jdGlvbiBfY2FsbF9zdXBlcihfdGhpcywgZGVyaXZlZCwgYXJncykgewogICAgLy8gU3VwZXIKICAgIGRlcml2ZWQgPSBfZ2V0X3Byb3RvdHlwZV9vZihkZXJpdmVkKTsKICAgIHJldHVybiBfcG9zc2libGVfY29uc3RydWN0b3JfcmV0dXJuKAogICAgICAgIF90aGlzLAogICAgICAgIF9pc19uYXRpdmVfcmVmbGVjdF9jb25zdHJ1Y3QoKQogICAgICAgICAgICAvLyBOT1RFOiBUaGlzIGRvZXNuJ3Qgd29yayBpZiB0aGlzLl9fcHJvdG9fXy5jb25zdHJ1Y3RvciBoYXMgYmVlbiBtb2RpZmllZC4KICAgICAgICAgICAgPyBSZWZsZWN0LmNvbnN0cnVjdChkZXJpdmVkLCBhcmdzIHx8IFtdLCBfZ2V0X3Byb3RvdHlwZV9vZihfdGhpcykuY29uc3RydWN0b3IpCiAgICAgICAgICAgIDogZGVyaXZlZC5hcHBseShfdGhpcywgYXJncykKICAgICk7Cn0KZnVuY3Rpb24gX2NoZWNrX3ByaXZhdGVfcmVkZWNsYXJhdGlvbihvYmosIHByaXZhdGVDb2xsZWN0aW9uKSB7CiAgICBpZiAocHJpdmF0ZUNvbGxlY3Rpb24uaGFzKG9iaikpIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgaW5pdGlhbGl6ZSB0aGUgc2FtZSBwcml2YXRlIGVsZW1lbnRzIHR3aWNlIG9uIGFuIG9iamVjdCIpOwogICAgfQp9CmZ1bmN0aW9uIF9jbGFzc19hcHBseV9kZXNjcmlwdG9yX2Rlc3RydWN0dXJlKHJlY2VpdmVyLCBkZXNjcmlwdG9yKSB7CiAgICBpZiAoZGVzY3JpcHRvci5zZXQpIHsKICAgICAgICBpZiAoISgiX19kZXN0ck9iaiIgaW4gZGVzY3JpcHRvcikpIHsKICAgICAgICAgICAgZGVzY3JpcHRvci5fX2Rlc3RyT2JqID0gewogICAgICAgICAgICAgICAgc2V0IHZhbHVlKHYpIHsKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLnNldC5jYWxsKHJlY2VpdmVyLCB2KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3IuX19kZXN0ck9iajsKICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKCFkZXNjcmlwdG9yLndyaXRhYmxlKSB7CiAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgdGhyb3cgaW4gc3RyaWN0IG1vZGUsIGJ1dCBjbGFzcyBib2RpZXMgYXJlCiAgICAgICAgICAgIC8vIGFsd2F5cyBzdHJpY3QgYW5kIHByaXZhdGUgZmllbGRzIGNhbiBvbmx5IGJlIHVzZWQgaW5zaWRlCiAgICAgICAgICAgIC8vIGNsYXNzIGJvZGllcy4KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiYXR0ZW1wdGVkIHRvIHNldCByZWFkIG9ubHkgcHJpdmF0ZSBmaWVsZCIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjsKICAgIH0KfQpmdW5jdGlvbiBfY2xhc3NfYXBwbHlfZGVzY3JpcHRvcl9nZXQocmVjZWl2ZXIsIGRlc2NyaXB0b3IpIHsKICAgIGlmIChkZXNjcmlwdG9yLmdldCkgewogICAgICAgIHJldHVybiBkZXNjcmlwdG9yLmdldC5jYWxsKHJlY2VpdmVyKTsKICAgIH0KICAgIHJldHVybiBkZXNjcmlwdG9yLnZhbHVlOwp9CmZ1bmN0aW9uIF9jbGFzc19hcHBseV9kZXNjcmlwdG9yX3NldChyZWNlaXZlciwgZGVzY3JpcHRvciwgdmFsdWUpIHsKICAgIGlmIChkZXNjcmlwdG9yLnNldCkgewogICAgICAgIGRlc2NyaXB0b3Iuc2V0LmNhbGwocmVjZWl2ZXIsIHZhbHVlKTsKICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKCFkZXNjcmlwdG9yLndyaXRhYmxlKSB7CiAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgdGhyb3cgaW4gc3RyaWN0IG1vZGUsIGJ1dCBjbGFzcyBib2RpZXMgYXJlCiAgICAgICAgICAgIC8vIGFsd2F5cyBzdHJpY3QgYW5kIHByaXZhdGUgZmllbGRzIGNhbiBvbmx5IGJlIHVzZWQgaW5zaWRlCiAgICAgICAgICAgIC8vIGNsYXNzIGJvZGllcy4KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiYXR0ZW1wdGVkIHRvIHNldCByZWFkIG9ubHkgcHJpdmF0ZSBmaWVsZCIpOwogICAgICAgIH0KICAgICAgICBkZXNjcmlwdG9yLnZhbHVlID0gdmFsdWU7CiAgICB9Cn0KZnVuY3Rpb24gX2NsYXNzX2FwcGx5X2Rlc2NyaXB0b3JfdXBkYXRlKHJlY2VpdmVyLCBkZXNjcmlwdG9yKSB7CiAgICBpZiAoZGVzY3JpcHRvci5zZXQpIHsKICAgICAgICBpZiAoIWRlc2NyaXB0b3IuZ2V0KSB7CiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoImF0dGVtcHRlZCB0byByZWFkIHNldCBvbmx5IHByaXZhdGUgZmllbGQiKTsKICAgICAgICB9CiAgICAgICAgaWYgKCEoIl9fZGVzdHJXcmFwcGVyIiBpbiBkZXNjcmlwdG9yKSkgewogICAgICAgICAgICBkZXNjcmlwdG9yLl9fZGVzdHJXcmFwcGVyID0gewogICAgICAgICAgICAgICAgc2V0IHZhbHVlKHYpIHsKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLnNldC5jYWxsKHJlY2VpdmVyLCB2KTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBnZXQgdmFsdWUoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3IuZ2V0LmNhbGwocmVjZWl2ZXIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICByZXR1cm4gZGVzY3JpcHRvci5fX2Rlc3RyV3JhcHBlcjsKICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKCFkZXNjcmlwdG9yLndyaXRhYmxlKSB7CiAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgdGhyb3cgaW4gc3RyaWN0IG1vZGUsIGJ1dCBjbGFzcyBib2RpZXMgYXJlCiAgICAgICAgICAgIC8vIGFsd2F5cyBzdHJpY3QgYW5kIHByaXZhdGUgZmllbGRzIGNhbiBvbmx5IGJlIHVzZWQgaW5zaWRlCiAgICAgICAgICAgIC8vIGNsYXNzIGJvZGllcy4KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiYXR0ZW1wdGVkIHRvIHNldCByZWFkIG9ubHkgcHJpdmF0ZSBmaWVsZCIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjsKICAgIH0KfQpmdW5jdGlvbiBfY2xhc3NfY2FsbF9jaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsKICAgIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7CiAgICB9Cn0KZnVuY3Rpb24gX2NsYXNzX2NoZWNrX3ByaXZhdGVfc3RhdGljX2ZpZWxkX2Rlc2NyaXB0b3IoZGVzY3JpcHRvciwgYWN0aW9uKSB7CiAgICBpZiAoZGVzY3JpcHRvciA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiYXR0ZW1wdGVkIHRvICIgKyBhY3Rpb24gKyAiIHByaXZhdGUgc3RhdGljIGZpZWxkIGJlZm9yZSBpdHMgZGVjbGFyYXRpb24iKTsKICAgIH0KfQpmdW5jdGlvbiBfY2xhc3NfZXh0cmFjdF9maWVsZF9kZXNjcmlwdG9yKHJlY2VpdmVyLCBwcml2YXRlTWFwLCBhY3Rpb24pIHsKICAgIGlmICghcHJpdmF0ZU1hcC5oYXMocmVjZWl2ZXIpKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiYXR0ZW1wdGVkIHRvICIgKyBhY3Rpb24gKyAiIHByaXZhdGUgZmllbGQgb24gbm9uLWluc3RhbmNlIik7CiAgICB9CiAgICByZXR1cm4gcHJpdmF0ZU1hcC5nZXQocmVjZWl2ZXIpOwp9CmZ1bmN0aW9uIF9jbGFzc19uYW1lX3Rkel9lcnJvcihuYW1lKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoIkNsYXNzIFwiIiArIG5hbWUgKyAiXCIgY2Fubm90IGJlIHJlZmVyZW5jZWQgaW4gY29tcHV0ZWQgcHJvcGVydHkga2V5cy4iKTsKfQpmdW5jdGlvbiBfY2xhc3NfcHJpdmF0ZV9maWVsZF9nZXQocmVjZWl2ZXIsIHByaXZhdGVNYXApIHsKICAgIHZhciBkZXNjcmlwdG9yID0gX2NsYXNzX2V4dHJhY3RfZmllbGRfZGVzY3JpcHRvcihyZWNlaXZlciwgcHJpdmF0ZU1hcCwgImdldCIpOwogICAgcmV0dXJuIF9jbGFzc19hcHBseV9kZXNjcmlwdG9yX2dldChyZWNlaXZlciwgZGVzY3JpcHRvcik7Cn0KZnVuY3Rpb24gX2NsYXNzX3ByaXZhdGVfZmllbGRfaW5pdChvYmosIHByaXZhdGVNYXAsIHZhbHVlKSB7CiAgICBfY2hlY2tfcHJpdmF0ZV9yZWRlY2xhcmF0aW9uKG9iaiwgcHJpdmF0ZU1hcCk7CiAgICBwcml2YXRlTWFwLnNldChvYmosIHZhbHVlKTsKfQpmdW5jdGlvbiBfY2xhc3NfcHJpdmF0ZV9maWVsZF9sb29zZV9iYXNlKHJlY2VpdmVyLCBwcml2YXRlS2V5KSB7CiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyZWNlaXZlciwgcHJpdmF0ZUtleSkpIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJhdHRlbXB0ZWQgdG8gdXNlIHByaXZhdGUgZmllbGQgb24gbm9uLWluc3RhbmNlIik7CiAgICB9CiAgICByZXR1cm4gcmVjZWl2ZXI7Cn0KdmFyIGlkID0gMDsKZnVuY3Rpb24gX2NsYXNzX3ByaXZhdGVfZmllbGRfbG9vc2Vfa2V5KG5hbWUpIHsKICAgIHJldHVybiAiX19wcml2YXRlXyIgKyBpZCsrICsgIl8iICsgbmFtZTsKfQpmdW5jdGlvbiBfY2xhc3NfcHJpdmF0ZV9maWVsZF9zZXQocmVjZWl2ZXIsIHByaXZhdGVNYXAsIHZhbHVlKSB7CiAgICB2YXIgZGVzY3JpcHRvciA9IF9jbGFzc19leHRyYWN0X2ZpZWxkX2Rlc2NyaXB0b3IocmVjZWl2ZXIsIHByaXZhdGVNYXAsICJzZXQiKTsKICAgIF9jbGFzc19hcHBseV9kZXNjcmlwdG9yX3NldChyZWNlaXZlciwgZGVzY3JpcHRvciwgdmFsdWUpOwogICAgcmV0dXJuIHZhbHVlOwp9CmZ1bmN0aW9uIF9jbGFzc19wcml2YXRlX2ZpZWxkX3VwZGF0ZShyZWNlaXZlciwgcHJpdmF0ZU1hcCkgewogICAgdmFyIGRlc2NyaXB0b3IgPSBfY2xhc3NfZXh0cmFjdF9maWVsZF9kZXNjcmlwdG9yKHJlY2VpdmVyLCBwcml2YXRlTWFwLCAidXBkYXRlIik7CiAgICByZXR1cm4gX2NsYXNzX2FwcGx5X2Rlc2NyaXB0b3JfdXBkYXRlKHJlY2VpdmVyLCBkZXNjcmlwdG9yKTsKfQpmdW5jdGlvbiBfY2xhc3NfcHJpdmF0ZV9tZXRob2RfZ2V0KHJlY2VpdmVyLCBwcml2YXRlU2V0LCBmbikgewogICAgaWYgKCFwcml2YXRlU2V0LmhhcyhyZWNlaXZlcikpIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJhdHRlbXB0ZWQgdG8gZ2V0IHByaXZhdGUgZmllbGQgb24gbm9uLWluc3RhbmNlIik7CiAgICB9CiAgICByZXR1cm4gZm47Cn0KZnVuY3Rpb24gX2NsYXNzX3ByaXZhdGVfbWV0aG9kX2luaXQob2JqLCBwcml2YXRlU2V0KSB7CiAgICBfY2hlY2tfcHJpdmF0ZV9yZWRlY2xhcmF0aW9uKG9iaiwgcHJpdmF0ZVNldCk7CiAgICBwcml2YXRlU2V0LmFkZChvYmopOwp9CmZ1bmN0aW9uIF9jbGFzc19wcml2YXRlX21ldGhvZF9zZXQoKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJhdHRlbXB0ZWQgdG8gcmVhc3NpZ24gcHJpdmF0ZSBtZXRob2QiKTsKfQpmdW5jdGlvbiBfY2xhc3Nfc3RhdGljX3ByaXZhdGVfZmllbGRfc3BlY19nZXQocmVjZWl2ZXIsIGNsYXNzQ29uc3RydWN0b3IsIGRlc2NyaXB0b3IpIHsKICAgIF9jbGFzc19jaGVja19wcml2YXRlX3N0YXRpY19hY2Nlc3MocmVjZWl2ZXIsIGNsYXNzQ29uc3RydWN0b3IpOwogICAgX2NsYXNzX2NoZWNrX3ByaXZhdGVfc3RhdGljX2ZpZWxkX2Rlc2NyaXB0b3IoZGVzY3JpcHRvciwgImdldCIpOwogICAgcmV0dXJuIF9jbGFzc19hcHBseV9kZXNjcmlwdG9yX2dldChyZWNlaXZlciwgZGVzY3JpcHRvcik7Cn0KZnVuY3Rpb24gX2NsYXNzX3N0YXRpY19wcml2YXRlX2ZpZWxkX3NwZWNfc2V0KHJlY2VpdmVyLCBjbGFzc0NvbnN0cnVjdG9yLCBkZXNjcmlwdG9yLCB2YWx1ZSkgewogICAgX2NsYXNzX2NoZWNrX3ByaXZhdGVfc3RhdGljX2FjY2VzcyhyZWNlaXZlciwgY2xhc3NDb25zdHJ1Y3Rvcik7CiAgICBfY2xhc3NfY2hlY2tfcHJpdmF0ZV9zdGF0aWNfZmllbGRfZGVzY3JpcHRvcihkZXNjcmlwdG9yLCAic2V0Iik7CiAgICBfY2xhc3NfYXBwbHlfZGVzY3JpcHRvcl9zZXQocmVjZWl2ZXIsIGRlc2NyaXB0b3IsIHZhbHVlKTsKICAgIHJldHVybiB2YWx1ZTsKfQpmdW5jdGlvbiBfY2xhc3Nfc3RhdGljX3ByaXZhdGVfZmllbGRfdXBkYXRlKHJlY2VpdmVyLCBjbGFzc0NvbnN0cnVjdG9yLCBkZXNjcmlwdG9yKSB7CiAgICBfY2xhc3NfY2hlY2tfcHJpdmF0ZV9zdGF0aWNfYWNjZXNzKHJlY2VpdmVyLCBjbGFzc0NvbnN0cnVjdG9yKTsKICAgIF9jbGFzc19jaGVja19wcml2YXRlX3N0YXRpY19maWVsZF9kZXNjcmlwdG9yKGRlc2NyaXB0b3IsICJ1cGRhdGUiKTsKICAgIHJldHVybiBfY2xhc3NfYXBwbHlfZGVzY3JpcHRvcl91cGRhdGUocmVjZWl2ZXIsIGRlc2NyaXB0b3IpOwp9CmZ1bmN0aW9uIF9jb25zdHJ1Y3QoUGFyZW50LCBhcmdzLCBDbGFzcykgewogICAgaWYgKF9pc19uYXRpdmVfcmVmbGVjdF9jb25zdHJ1Y3QoKSkgewogICAgICAgIF9jb25zdHJ1Y3QgPSBSZWZsZWN0LmNvbnN0cnVjdDsKICAgIH0gZWxzZSB7CiAgICAgICAgX2NvbnN0cnVjdCA9IGZ1bmN0aW9uIGNvbnN0cnVjdChQYXJlbnQsIGFyZ3MsIENsYXNzKSB7CiAgICAgICAgICAgIHZhciBhID0gW251bGxdOwogICAgICAgICAgICBhLnB1c2guYXBwbHkoYSwgYXJncyk7CiAgICAgICAgICAgIHZhciBDb25zdHJ1Y3RvciA9IEZ1bmN0aW9uLmJpbmQuYXBwbHkoUGFyZW50LCBhKTsKICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gbmV3IENvbnN0cnVjdG9yKCk7CiAgICAgICAgICAgIGlmIChDbGFzcykgX3NldF9wcm90b3R5cGVfb2YoaW5zdGFuY2UsIENsYXNzLnByb3RvdHlwZSk7CiAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTsKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuIF9jb25zdHJ1Y3QuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKfQpmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsKICAgICAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7CiAgICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOwogICAgICAgIGlmICgidmFsdWUiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOwogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsKICAgIH0KfQpmdW5jdGlvbiBfY3JlYXRlX2NsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgewogICAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7CiAgICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7CiAgICByZXR1cm4gQ29uc3RydWN0b3I7Cn0KZnVuY3Rpb24gX2RlY29yYXRlKGRlY29yYXRvcnMsIGZhY3RvcnksIHN1cGVyQ2xhc3MpIHsKICAgIHZhciByID0gZmFjdG9yeShmdW5jdGlvbiBpbml0aWFsaXplKE8pIHsKICAgICAgICBfaW5pdGlhbGl6ZUluc3RhbmNlRWxlbWVudHMoTywgZGVjb3JhdGVkLmVsZW1lbnRzKTsKICAgIH0sIHN1cGVyQ2xhc3MpOwogICAgdmFyIGRlY29yYXRlZCA9IF9kZWNvcmF0ZUNsYXNzKF9jb2FsZXNjZUNsYXNzRWxlbWVudHMoci5kLm1hcChfY3JlYXRlRWxlbWVudERlc2NyaXB0b3IpKSwgZGVjb3JhdG9ycyk7CiAgICBfaW5pdGlhbGl6ZUNsYXNzRWxlbWVudHMoci5GLCBkZWNvcmF0ZWQuZWxlbWVudHMpOwogICAgcmV0dXJuIF9ydW5DbGFzc0ZpbmlzaGVycyhyLkYsIGRlY29yYXRlZC5maW5pc2hlcnMpOwp9CgpmdW5jdGlvbiBfY3JlYXRlRWxlbWVudERlc2NyaXB0b3IoZGVmKSB7CiAgICB2YXIga2V5ID0gX3RvX3Byb3BlcnR5X2tleShkZWYua2V5KTsKICAgIHZhciBkZXNjcmlwdG9yOwogICAgaWYgKGRlZi5raW5kID09PSAibWV0aG9kIikgewogICAgICAgIGRlc2NyaXB0b3IgPSB7IHZhbHVlOiBkZWYudmFsdWUsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIGVudW1lcmFibGU6IGZhbHNlIH07CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRlZi52YWx1ZSwgIm5hbWUiLCB7IHZhbHVlOiBfdHlwZV9vZihrZXkpID09PSAic3ltYm9sIiA/ICIiIDoga2V5LCBjb25maWd1cmFibGU6IHRydWUgfSk7CiAgICB9IGVsc2UgaWYgKGRlZi5raW5kID09PSAiZ2V0IikgewogICAgICAgIGRlc2NyaXB0b3IgPSB7IGdldDogZGVmLnZhbHVlLCBjb25maWd1cmFibGU6IHRydWUsIGVudW1lcmFibGU6IGZhbHNlIH07CiAgICB9IGVsc2UgaWYgKGRlZi5raW5kID09PSAic2V0IikgewogICAgICAgIGRlc2NyaXB0b3IgPSB7IHNldDogZGVmLnZhbHVlLCBjb25maWd1cmFibGU6IHRydWUsIGVudW1lcmFibGU6IGZhbHNlIH07CiAgICB9IGVsc2UgaWYgKGRlZi5raW5kID09PSAiZmllbGQiKSB7CiAgICAgICAgZGVzY3JpcHRvciA9IHsgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgZW51bWVyYWJsZTogdHJ1ZSB9OwogICAgfQogICAgdmFyIGVsZW1lbnQgPSB7CiAgICAgICAga2luZDogZGVmLmtpbmQgPT09ICJmaWVsZCIgPyAiZmllbGQiIDogIm1ldGhvZCIsCiAgICAgICAga2V5OiBrZXksCiAgICAgICAgcGxhY2VtZW50OiBkZWYuc3RhdGljID8gInN0YXRpYyIgOiBkZWYua2luZCA9PT0gImZpZWxkIiA/ICJvd24iIDogInByb3RvdHlwZSIsCiAgICAgICAgZGVzY3JpcHRvcjogZGVzY3JpcHRvcgogICAgfTsKICAgIGlmIChkZWYuZGVjb3JhdG9ycykgZWxlbWVudC5kZWNvcmF0b3JzID0gZGVmLmRlY29yYXRvcnM7CiAgICBpZiAoZGVmLmtpbmQgPT09ICJmaWVsZCIpIGVsZW1lbnQuaW5pdGlhbGl6ZXIgPSBkZWYudmFsdWU7CiAgICByZXR1cm4gZWxlbWVudDsKfQpmdW5jdGlvbiBfY29hbGVzY2VHZXR0ZXJTZXR0ZXIoZWxlbWVudCwgb3RoZXIpIHsKICAgIGlmIChlbGVtZW50LmRlc2NyaXB0b3IuZ2V0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICBvdGhlci5kZXNjcmlwdG9yLmdldCA9IGVsZW1lbnQuZGVzY3JpcHRvci5nZXQ7CiAgICB9IGVsc2UgewogICAgICAgIG90aGVyLmRlc2NyaXB0b3Iuc2V0ID0gZWxlbWVudC5kZXNjcmlwdG9yLnNldDsKICAgIH0KfQpmdW5jdGlvbiBfY29hbGVzY2VDbGFzc0VsZW1lbnRzKGVsZW1lbnRzKSB7CiAgICB2YXIgbmV3RWxlbWVudHMgPSBbXTsKICAgIHZhciBpc1NhbWVFbGVtZW50ID0gZnVuY3Rpb24gaXNTYW1lRWxlbWVudChvdGhlcikgewogICAgICAgIHJldHVybiBvdGhlci5raW5kID09PSAibWV0aG9kIiAmJiBvdGhlci5rZXkgPT09IGVsZW1lbnQua2V5ICYmIG90aGVyLnBsYWNlbWVudCA9PT0gZWxlbWVudC5wbGFjZW1lbnQ7CiAgICB9OwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBlbGVtZW50ID0gZWxlbWVudHNbaV07CiAgICAgICAgdmFyIG90aGVyOwogICAgICAgIGlmIChlbGVtZW50LmtpbmQgPT09ICJtZXRob2QiICYmIChvdGhlciA9IG5ld0VsZW1lbnRzLmZpbmQoaXNTYW1lRWxlbWVudCkpKSB7CiAgICAgICAgICAgIGlmIChfaXNEYXRhRGVzY3JpcHRvcihlbGVtZW50LmRlc2NyaXB0b3IpIHx8IF9pc0RhdGFEZXNjcmlwdG9yKG90aGVyLmRlc2NyaXB0b3IpKSB7CiAgICAgICAgICAgICAgICBpZiAoX2hhc0RlY29yYXRvcnMoZWxlbWVudCkgfHwgX2hhc0RlY29yYXRvcnMob3RoZXIpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJEdXBsaWNhdGVkIG1ldGhvZHMgKCIgKyBlbGVtZW50LmtleSArICIpIGNhbid0IGJlIGRlY29yYXRlZC4iKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG90aGVyLmRlc2NyaXB0b3IgPSBlbGVtZW50LmRlc2NyaXB0b3I7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoX2hhc0RlY29yYXRvcnMoZWxlbWVudCkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoX2hhc0RlY29yYXRvcnMob3RoZXIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZWNvcmF0b3JzIGNhbid0IGJlIHBsYWNlZCBvbiBkaWZmZXJlbnQgYWNjZXNzb3JzIHdpdGggZm9yICIgKyAidGhlIHNhbWUgcHJvcGVydHkgKCIgKyBlbGVtZW50LmtleSArICIpLiIKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgb3RoZXIuZGVjb3JhdG9ycyA9IGVsZW1lbnQuZGVjb3JhdG9yczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF9jb2FsZXNjZUdldHRlclNldHRlcihlbGVtZW50LCBvdGhlcik7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBuZXdFbGVtZW50cy5wdXNoKGVsZW1lbnQpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXdFbGVtZW50czsKfQpmdW5jdGlvbiBfaGFzRGVjb3JhdG9ycyhlbGVtZW50KSB7CiAgICByZXR1cm4gZWxlbWVudC5kZWNvcmF0b3JzICYmIGVsZW1lbnQuZGVjb3JhdG9ycy5sZW5ndGg7Cn0KZnVuY3Rpb24gX2lzRGF0YURlc2NyaXB0b3IoZGVzYykgewogICAgcmV0dXJuIGRlc2MgIT09IHVuZGVmaW5lZCAmJiAhKGRlc2MudmFsdWUgPT09IHVuZGVmaW5lZCAmJiBkZXNjLndyaXRhYmxlID09PSB1bmRlZmluZWQpOwp9CmZ1bmN0aW9uIF9pbml0aWFsaXplQ2xhc3NFbGVtZW50cyhGLCBlbGVtZW50cykgewogICAgdmFyIHByb3RvID0gRi5wcm90b3R5cGU7CiAgICBbIm1ldGhvZCIsICJmaWVsZCJdLmZvckVhY2goZnVuY3Rpb24oa2luZCkgewogICAgICAgIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCkgewogICAgICAgICAgICB2YXIgcGxhY2VtZW50ID0gZWxlbWVudC5wbGFjZW1lbnQ7CiAgICAgICAgICAgIGlmIChlbGVtZW50LmtpbmQgPT09IGtpbmQgJiYgKHBsYWNlbWVudCA9PT0gInN0YXRpYyIgfHwgcGxhY2VtZW50ID09PSAicHJvdG90eXBlIikpIHsKICAgICAgICAgICAgICAgIHZhciByZWNlaXZlciA9IHBsYWNlbWVudCA9PT0gInN0YXRpYyIgPyBGIDogcHJvdG87CiAgICAgICAgICAgICAgICBfZGVmaW5lQ2xhc3NFbGVtZW50KHJlY2VpdmVyLCBlbGVtZW50KTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfSk7Cn0KZnVuY3Rpb24gX2luaXRpYWxpemVJbnN0YW5jZUVsZW1lbnRzKE8sIGVsZW1lbnRzKSB7CiAgICBbIm1ldGhvZCIsICJmaWVsZCJdLmZvckVhY2goZnVuY3Rpb24oa2luZCkgewogICAgICAgIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCkgewogICAgICAgICAgICBpZiAoZWxlbWVudC5raW5kID09PSBraW5kICYmIGVsZW1lbnQucGxhY2VtZW50ID09PSAib3duIikgewogICAgICAgICAgICAgICAgX2RlZmluZUNsYXNzRWxlbWVudChPLCBlbGVtZW50KTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfSk7Cn0KZnVuY3Rpb24gX2RlZmluZUNsYXNzRWxlbWVudChyZWNlaXZlciwgZWxlbWVudCkgewogICAgdmFyIGRlc2NyaXB0b3IgPSBlbGVtZW50LmRlc2NyaXB0b3I7CiAgICBpZiAoZWxlbWVudC5raW5kID09PSAiZmllbGQiKSB7CiAgICAgICAgdmFyIGluaXRpYWxpemVyID0gZWxlbWVudC5pbml0aWFsaXplcjsKICAgICAgICBkZXNjcmlwdG9yID0gewogICAgICAgICAgICBlbnVtZXJhYmxlOiBkZXNjcmlwdG9yLmVudW1lcmFibGUsCiAgICAgICAgICAgIHdyaXRhYmxlOiBkZXNjcmlwdG9yLndyaXRhYmxlLAogICAgICAgICAgICBjb25maWd1cmFibGU6IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlLAogICAgICAgICAgICB2YWx1ZTogaW5pdGlhbGl6ZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGluaXRpYWxpemVyLmNhbGwocmVjZWl2ZXIpCiAgICAgICAgfTsKICAgIH0KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZWNlaXZlciwgZWxlbWVudC5rZXksIGRlc2NyaXB0b3IpOwp9CmZ1bmN0aW9uIF9kZWNvcmF0ZUNsYXNzKGVsZW1lbnRzLCBkZWNvcmF0b3JzKSB7CiAgICB2YXIgbmV3RWxlbWVudHMgPSBbXTsKICAgIHZhciBmaW5pc2hlcnMgPSBbXTsKICAgIHZhciBwbGFjZW1lbnRzID0geyBzdGF0aWM6IFtdLCBwcm90b3R5cGU6IFtdLCBvd246IFtdIH07CiAgICBlbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uKGVsZW1lbnQpIHsKICAgICAgICBfYWRkRWxlbWVudFBsYWNlbWVudChlbGVtZW50LCBwbGFjZW1lbnRzKTsKICAgIH0pOwogICAgZWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbihlbGVtZW50KSB7CiAgICAgICAgaWYgKCFfaGFzRGVjb3JhdG9ycyhlbGVtZW50KSkgcmV0dXJuIG5ld0VsZW1lbnRzLnB1c2goZWxlbWVudCk7CiAgICAgICAgdmFyIGVsZW1lbnRGaW5pc2hlcnNFeHRyYXMgPSBfZGVjb3JhdGVFbGVtZW50KGVsZW1lbnQsIHBsYWNlbWVudHMpOwogICAgICAgIG5ld0VsZW1lbnRzLnB1c2goZWxlbWVudEZpbmlzaGVyc0V4dHJhcy5lbGVtZW50KTsKICAgICAgICBuZXdFbGVtZW50cy5wdXNoLmFwcGx5KG5ld0VsZW1lbnRzLCBlbGVtZW50RmluaXNoZXJzRXh0cmFzLmV4dHJhcyk7CiAgICAgICAgZmluaXNoZXJzLnB1c2guYXBwbHkoZmluaXNoZXJzLCBlbGVtZW50RmluaXNoZXJzRXh0cmFzLmZpbmlzaGVycyk7CiAgICB9KTsKICAgIGlmICghZGVjb3JhdG9ycykgewogICAgICAgIHJldHVybiB7IGVsZW1lbnRzOiBuZXdFbGVtZW50cywgZmluaXNoZXJzOiBmaW5pc2hlcnMgfTsKICAgIH0KICAgIHZhciByZXN1bHQgPSBfZGVjb3JhdGVDb25zdHJ1Y3RvcihuZXdFbGVtZW50cywgZGVjb3JhdG9ycyk7CiAgICBmaW5pc2hlcnMucHVzaC5hcHBseShmaW5pc2hlcnMsIHJlc3VsdC5maW5pc2hlcnMpOwogICAgcmVzdWx0LmZpbmlzaGVycyA9IGZpbmlzaGVyczsKICAgIHJldHVybiByZXN1bHQ7Cn0KZnVuY3Rpb24gX2FkZEVsZW1lbnRQbGFjZW1lbnQoZWxlbWVudCwgcGxhY2VtZW50cywgc2lsZW50KSB7CiAgICB2YXIga2V5cyA9IHBsYWNlbWVudHNbZWxlbWVudC5wbGFjZW1lbnRdOwogICAgaWYgKCFzaWxlbnQgJiYga2V5cy5pbmRleE9mKGVsZW1lbnQua2V5KSAhPT0gLTEpIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJEdXBsaWNhdGVkIGVsZW1lbnQgKCIgKyBlbGVtZW50LmtleSArICIpIik7CiAgICB9CiAgICBrZXlzLnB1c2goZWxlbWVudC5rZXkpOwp9CmZ1bmN0aW9uIF9kZWNvcmF0ZUVsZW1lbnQoZWxlbWVudCwgcGxhY2VtZW50cykgewogICAgdmFyIGV4dHJhcyA9IFtdOwogICAgdmFyIGZpbmlzaGVycyA9IFtdOwogICAgZm9yICh2YXIgZGVjb3JhdG9ycyA9IGVsZW1lbnQuZGVjb3JhdG9ycywgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICB2YXIga2V5cyA9IHBsYWNlbWVudHNbZWxlbWVudC5wbGFjZW1lbnRdOwogICAgICAgIGtleXMuc3BsaWNlKGtleXMuaW5kZXhPZihlbGVtZW50LmtleSksIDEpOwogICAgICAgIHZhciBlbGVtZW50T2JqZWN0ID0gX2Zyb21FbGVtZW50RGVzY3JpcHRvcihlbGVtZW50KTsKICAgICAgICB2YXIgZWxlbWVudEZpbmlzaGVyRXh0cmFzID0gX3RvRWxlbWVudEZpbmlzaGVyRXh0cmFzKCgwLCBkZWNvcmF0b3JzW2ldKShlbGVtZW50T2JqZWN0KSB8fCBlbGVtZW50T2JqZWN0KTsKICAgICAgICBlbGVtZW50ID0gZWxlbWVudEZpbmlzaGVyRXh0cmFzLmVsZW1lbnQ7CiAgICAgICAgX2FkZEVsZW1lbnRQbGFjZW1lbnQoZWxlbWVudCwgcGxhY2VtZW50cyk7CiAgICAgICAgaWYgKGVsZW1lbnRGaW5pc2hlckV4dHJhcy5maW5pc2hlcikgewogICAgICAgICAgICBmaW5pc2hlcnMucHVzaChlbGVtZW50RmluaXNoZXJFeHRyYXMuZmluaXNoZXIpOwogICAgICAgIH0KICAgICAgICB2YXIgbmV3RXh0cmFzID0gZWxlbWVudEZpbmlzaGVyRXh0cmFzLmV4dHJhczsKICAgICAgICBpZiAobmV3RXh0cmFzKSB7CiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbmV3RXh0cmFzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICBfYWRkRWxlbWVudFBsYWNlbWVudChuZXdFeHRyYXNbal0sIHBsYWNlbWVudHMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGV4dHJhcy5wdXNoLmFwcGx5KGV4dHJhcywgbmV3RXh0cmFzKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4geyBlbGVtZW50OiBlbGVtZW50LCBmaW5pc2hlcnM6IGZpbmlzaGVycywgZXh0cmFzOiBleHRyYXMgfTsKfQpmdW5jdGlvbiBfZGVjb3JhdGVDb25zdHJ1Y3RvcihlbGVtZW50cywgZGVjb3JhdG9ycykgewogICAgdmFyIGZpbmlzaGVycyA9IFtdOwogICAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICB2YXIgb2JqID0gX2Zyb21DbGFzc0Rlc2NyaXB0b3IoZWxlbWVudHMpOwogICAgICAgIHZhciBlbGVtZW50c0FuZEZpbmlzaGVyID0gX3RvQ2xhc3NEZXNjcmlwdG9yKCgwLCBkZWNvcmF0b3JzW2ldKShvYmopIHx8IG9iaik7CiAgICAgICAgaWYgKGVsZW1lbnRzQW5kRmluaXNoZXIuZmluaXNoZXIgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBmaW5pc2hlcnMucHVzaChlbGVtZW50c0FuZEZpbmlzaGVyLmZpbmlzaGVyKTsKICAgICAgICB9CiAgICAgICAgaWYgKGVsZW1lbnRzQW5kRmluaXNoZXIuZWxlbWVudHMgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBlbGVtZW50cyA9IGVsZW1lbnRzQW5kRmluaXNoZXIuZWxlbWVudHM7CiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZWxlbWVudHMubGVuZ3RoIC0gMTsgaisrKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBrID0gaiArIDE7IGsgPCBlbGVtZW50cy5sZW5ndGg7IGsrKykgewogICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50c1tqXS5rZXkgPT09IGVsZW1lbnRzW2tdLmtleSAmJiBlbGVtZW50c1tqXS5wbGFjZW1lbnQgPT09IGVsZW1lbnRzW2tdLnBsYWNlbWVudCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJEdXBsaWNhdGVkIGVsZW1lbnQgKCIgKyBlbGVtZW50c1tqXS5rZXkgKyAiKSIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiB7IGVsZW1lbnRzOiBlbGVtZW50cywgZmluaXNoZXJzOiBmaW5pc2hlcnMgfTsKfQpmdW5jdGlvbiBfZnJvbUVsZW1lbnREZXNjcmlwdG9yKGVsZW1lbnQpIHsKICAgIHZhciBvYmogPSB7IGtpbmQ6IGVsZW1lbnQua2luZCwga2V5OiBlbGVtZW50LmtleSwgcGxhY2VtZW50OiBlbGVtZW50LnBsYWNlbWVudCwgZGVzY3JpcHRvcjogZWxlbWVudC5kZXNjcmlwdG9yIH07CiAgICB2YXIgZGVzYyA9IHsgdmFsdWU6ICJEZXNjcmlwdG9yIiwgY29uZmlndXJhYmxlOiB0cnVlIH07CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBTeW1ib2wudG9TdHJpbmdUYWcsIGRlc2MpOwogICAgaWYgKGVsZW1lbnQua2luZCA9PT0gImZpZWxkIikgb2JqLmluaXRpYWxpemVyID0gZWxlbWVudC5pbml0aWFsaXplcjsKICAgIHJldHVybiBvYmo7Cn0KZnVuY3Rpb24gX3RvRWxlbWVudERlc2NyaXB0b3JzKGVsZW1lbnRPYmplY3RzKSB7CiAgICBpZiAoZWxlbWVudE9iamVjdHMgPT09IHVuZGVmaW5lZCkgcmV0dXJuOwogICAgcmV0dXJuIF90b19hcnJheShlbGVtZW50T2JqZWN0cykubWFwKGZ1bmN0aW9uKGVsZW1lbnRPYmplY3QpIHsKICAgICAgICB2YXIgZWxlbWVudCA9IF90b0VsZW1lbnREZXNjcmlwdG9yKGVsZW1lbnRPYmplY3QpOwogICAgICAgIF9kaXNhbGxvd1Byb3BlcnR5KGVsZW1lbnRPYmplY3QsICJmaW5pc2hlciIsICJBbiBlbGVtZW50IGRlc2NyaXB0b3IiKTsKICAgICAgICBfZGlzYWxsb3dQcm9wZXJ0eShlbGVtZW50T2JqZWN0LCAiZXh0cmFzIiwgIkFuIGVsZW1lbnQgZGVzY3JpcHRvciIpOwogICAgICAgIHJldHVybiBlbGVtZW50OwogICAgfSk7Cn0KZnVuY3Rpb24gX3RvRWxlbWVudERlc2NyaXB0b3IoZWxlbWVudE9iamVjdCkgewogICAgdmFyIGtpbmQgPSBTdHJpbmcoZWxlbWVudE9iamVjdC5raW5kKTsKICAgIGlmIChraW5kICE9PSAibWV0aG9kIiAmJiBraW5kICE9PSAiZmllbGQiKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigKICAgICAgICAgICAgIkFuIGVsZW1lbnQgZGVzY3JpcHRvcidzIC5raW5kIHByb3BlcnR5IG11c3QgYmUgZWl0aGVyIFwibWV0aG9kXCIgb3IiCiAgICAgICAgICAgICAgICArICIgXCJmaWVsZFwiLCBidXQgYSBkZWNvcmF0b3IgY3JlYXRlZCBhbiBlbGVtZW50IGRlc2NyaXB0b3Igd2l0aCIgKyAiIC5raW5kIFwiIiArIGtpbmQgKyAiXCIiCiAgICAgICAgKTsKICAgIH0KICAgIHZhciBrZXkgPSBfdG9fcHJvcGVydHlfa2V5KGVsZW1lbnRPYmplY3Qua2V5KTsKICAgIHZhciBwbGFjZW1lbnQgPSBTdHJpbmcoZWxlbWVudE9iamVjdC5wbGFjZW1lbnQpOwogICAgaWYgKHBsYWNlbWVudCAhPT0gInN0YXRpYyIgJiYgcGxhY2VtZW50ICE9PSAicHJvdG90eXBlIiAmJiBwbGFjZW1lbnQgIT09ICJvd24iKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigKICAgICAgICAgICAgIkFuIGVsZW1lbnQgZGVzY3JpcHRvcidzIC5wbGFjZW1lbnQgcHJvcGVydHkgbXVzdCBiZSBvbmUgb2YgXCJzdGF0aWNcIiwiCiAgICAgICAgICAgICAgICArICIgXCJwcm90b3R5cGVcIiBvciBcIm93blwiLCBidXQgYSBkZWNvcmF0b3IgY3JlYXRlZCBhbiBlbGVtZW50IGRlc2NyaXB0b3IiICsgIiB3aXRoIC5wbGFjZW1lbnQgXCIiICsgcGxhY2VtZW50ICsgIlwiIgogICAgICAgICk7CiAgICB9CiAgICB2YXIgZGVzY3JpcHRvciA9IGVsZW1lbnRPYmplY3QuZGVzY3JpcHRvcjsKICAgIF9kaXNhbGxvd1Byb3BlcnR5KGVsZW1lbnRPYmplY3QsICJlbGVtZW50cyIsICJBbiBlbGVtZW50IGRlc2NyaXB0b3IiKTsKICAgIHZhciBlbGVtZW50ID0geyBraW5kOiBraW5kLCBrZXk6IGtleSwgcGxhY2VtZW50OiBwbGFjZW1lbnQsIGRlc2NyaXB0b3I6IE9iamVjdC5hc3NpZ24oe30sIGRlc2NyaXB0b3IpIH07CiAgICBpZiAoa2luZCAhPT0gImZpZWxkIikgewogICAgICAgIF9kaXNhbGxvd1Byb3BlcnR5KGVsZW1lbnRPYmplY3QsICJpbml0aWFsaXplciIsICJBIG1ldGhvZCBkZXNjcmlwdG9yIik7CiAgICB9IGVsc2UgewogICAgICAgIF9kaXNhbGxvd1Byb3BlcnR5KGRlc2NyaXB0b3IsICJnZXQiLCAiVGhlIHByb3BlcnR5IGRlc2NyaXB0b3Igb2YgYSBmaWVsZCBkZXNjcmlwdG9yIik7CiAgICAgICAgX2Rpc2FsbG93UHJvcGVydHkoZGVzY3JpcHRvciwgInNldCIsICJUaGUgcHJvcGVydHkgZGVzY3JpcHRvciBvZiBhIGZpZWxkIGRlc2NyaXB0b3IiKTsKICAgICAgICBfZGlzYWxsb3dQcm9wZXJ0eShkZXNjcmlwdG9yLCAidmFsdWUiLCAiVGhlIHByb3BlcnR5IGRlc2NyaXB0b3Igb2YgYSBmaWVsZCBkZXNjcmlwdG9yIik7CiAgICAgICAgZWxlbWVudC5pbml0aWFsaXplciA9IGVsZW1lbnRPYmplY3QuaW5pdGlhbGl6ZXI7CiAgICB9CiAgICByZXR1cm4gZWxlbWVudDsKfQpmdW5jdGlvbiBfdG9FbGVtZW50RmluaXNoZXJFeHRyYXMoZWxlbWVudE9iamVjdCkgewogICAgdmFyIGVsZW1lbnQgPSBfdG9FbGVtZW50RGVzY3JpcHRvcihlbGVtZW50T2JqZWN0KTsKICAgIHZhciBmaW5pc2hlciA9IF9vcHRpb25hbENhbGxhYmxlUHJvcGVydHkoZWxlbWVudE9iamVjdCwgImZpbmlzaGVyIik7CiAgICB2YXIgZXh0cmFzID0gX3RvRWxlbWVudERlc2NyaXB0b3JzKGVsZW1lbnRPYmplY3QuZXh0cmFzKTsKICAgIHJldHVybiB7IGVsZW1lbnQ6IGVsZW1lbnQsIGZpbmlzaGVyOiBmaW5pc2hlciwgZXh0cmFzOiBleHRyYXMgfTsKfQpmdW5jdGlvbiBfZnJvbUNsYXNzRGVzY3JpcHRvcihlbGVtZW50cykgewogICAgdmFyIG9iaiA9IHsga2luZDogImNsYXNzIiwgZWxlbWVudHM6IGVsZW1lbnRzLm1hcChfZnJvbUVsZW1lbnREZXNjcmlwdG9yKSB9OwogICAgdmFyIGRlc2MgPSB7IHZhbHVlOiAiRGVzY3JpcHRvciIsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9OwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgU3ltYm9sLnRvU3RyaW5nVGFnLCBkZXNjKTsKICAgIHJldHVybiBvYmo7Cn0KZnVuY3Rpb24gX3RvQ2xhc3NEZXNjcmlwdG9yKG9iaikgewogICAgdmFyIGtpbmQgPSBTdHJpbmcob2JqLmtpbmQpOwogICAgaWYgKGtpbmQgIT09ICJjbGFzcyIpIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKAogICAgICAgICAgICAiQSBjbGFzcyBkZXNjcmlwdG9yJ3MgLmtpbmQgcHJvcGVydHkgbXVzdCBiZSBcImNsYXNzXCIsIGJ1dCBhIGRlY29yYXRvciIgKyAiIGNyZWF0ZWQgYSBjbGFzcyBkZXNjcmlwdG9yIHdpdGggLmtpbmQgXCIiICsga2luZAogICAgICAgICAgICAgICAgKyAiXCIiCiAgICAgICAgKTsKICAgIH0KICAgIF9kaXNhbGxvd1Byb3BlcnR5KG9iaiwgImtleSIsICJBIGNsYXNzIGRlc2NyaXB0b3IiKTsKICAgIF9kaXNhbGxvd1Byb3BlcnR5KG9iaiwgInBsYWNlbWVudCIsICJBIGNsYXNzIGRlc2NyaXB0b3IiKTsKICAgIF9kaXNhbGxvd1Byb3BlcnR5KG9iaiwgImRlc2NyaXB0b3IiLCAiQSBjbGFzcyBkZXNjcmlwdG9yIik7CiAgICBfZGlzYWxsb3dQcm9wZXJ0eShvYmosICJpbml0aWFsaXplciIsICJBIGNsYXNzIGRlc2NyaXB0b3IiKTsKICAgIF9kaXNhbGxvd1Byb3BlcnR5KG9iaiwgImV4dHJhcyIsICJBIGNsYXNzIGRlc2NyaXB0b3IiKTsKICAgIHZhciBmaW5pc2hlciA9IF9vcHRpb25hbENhbGxhYmxlUHJvcGVydHkob2JqLCAiZmluaXNoZXIiKTsKICAgIHZhciBlbGVtZW50cyA9IF90b0VsZW1lbnREZXNjcmlwdG9ycyhvYmouZWxlbWVudHMpOwogICAgcmV0dXJuIHsgZWxlbWVudHM6IGVsZW1lbnRzLCBmaW5pc2hlcjogZmluaXNoZXIgfTsKfQpmdW5jdGlvbiBfZGlzYWxsb3dQcm9wZXJ0eShvYmosIG5hbWUsIG9iamVjdFR5cGUpIHsKICAgIGlmIChvYmpbbmFtZV0gIT09IHVuZGVmaW5lZCkgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3Iob2JqZWN0VHlwZSArICIgY2FuJ3QgaGF2ZSBhIC4iICsgbmFtZSArICIgcHJvcGVydHkuIik7CiAgICB9Cn0KZnVuY3Rpb24gX29wdGlvbmFsQ2FsbGFibGVQcm9wZXJ0eShvYmosIG5hbWUpIHsKICAgIHZhciB2YWx1ZSA9IG9ialtuYW1lXTsKICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiB2YWx1ZSAhPT0gImZ1bmN0aW9uIikgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkICciICsgbmFtZSArICInIHRvIGJlIGEgZnVuY3Rpb24iKTsKICAgIH0KICAgIHJldHVybiB2YWx1ZTsKfQpmdW5jdGlvbiBfcnVuQ2xhc3NGaW5pc2hlcnMoY29uc3RydWN0b3IsIGZpbmlzaGVycykgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaW5pc2hlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgbmV3Q29uc3RydWN0b3IgPSAoMCwgZmluaXNoZXJzW2ldKShjb25zdHJ1Y3Rvcik7CiAgICAgICAgaWYgKG5ld0NvbnN0cnVjdG9yICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBuZXdDb25zdHJ1Y3RvciAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiRmluaXNoZXJzIG11c3QgcmV0dXJuIGEgY29uc3RydWN0b3IuIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3RydWN0b3IgPSBuZXdDb25zdHJ1Y3RvcjsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gY29uc3RydWN0b3I7Cn0KZnVuY3Rpb24gX2RlZmF1bHRzKG9iaiwgZGVmYXVsdHMpIHsKICAgIHZhciBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZGVmYXVsdHMpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIGtleSA9IGtleXNbaV07CiAgICAgICAgdmFyIHZhbHVlID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihkZWZhdWx0cywga2V5KTsKICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUuY29uZmlndXJhYmxlICYmIG9ialtrZXldID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIG9iajsKfQpmdW5jdGlvbiBfZGVmaW5lX2VudW1lcmFibGVfcHJvcGVydGllcyhvYmosIGRlc2NzKSB7CiAgICBmb3IgKHZhciBrZXkgaW4gZGVzY3MpIHsKICAgICAgICB2YXIgZGVzYyA9IGRlc2NzW2tleV07CiAgICAgICAgZGVzYy5jb25maWd1cmFibGUgPSBkZXNjLmVudW1lcmFibGUgPSB0cnVlOwogICAgICAgIGlmICgidmFsdWUiIGluIGRlc2MpIGRlc2Mud3JpdGFibGUgPSB0cnVlOwogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgZGVzYyk7CiAgICB9CiAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgewogICAgICAgIHZhciBvYmplY3RTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhkZXNjcyk7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmplY3RTeW1ib2xzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHZhciBzeW0gPSBvYmplY3RTeW1ib2xzW2ldOwogICAgICAgICAgICB2YXIgZGVzYyA9IGRlc2NzW3N5bV07CiAgICAgICAgICAgIGRlc2MuY29uZmlndXJhYmxlID0gZGVzYy5lbnVtZXJhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKCJ2YWx1ZSIgaW4gZGVzYykgZGVzYy53cml0YWJsZSA9IHRydWU7CiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHN5bSwgZGVzYyk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIG9iajsKfQpmdW5jdGlvbiBfZGVmaW5lX3Byb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgewogICAgaWYgKGtleSBpbiBvYmopIHsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOwogICAgfSBlbHNlIHsKICAgICAgICBvYmpba2V5XSA9IHZhbHVlOwogICAgfQogICAgcmV0dXJuIG9iajsKfQpmdW5jdGlvbiBfZXhwb3J0X3N0YXIoZnJvbSwgdG8pIHsKICAgIE9iamVjdC5rZXlzKGZyb20pLmZvckVhY2goZnVuY3Rpb24oaykgewogICAgICAgIGlmIChrICE9PSAiZGVmYXVsdCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0bywgaykpIHsKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRvLCBrLCB7CiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnJvbVtrXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gZnJvbTsKfQpmdW5jdGlvbiBfZXh0ZW5kcygpIHsKICAgIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbih0YXJnZXQpIHsKICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOwogICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7CiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgewogICAgICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH07CiAgICByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKfQpmdW5jdGlvbiBfZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyKSB7CiAgICBpZiAodHlwZW9mIFJlZmxlY3QgIT09ICJ1bmRlZmluZWQiICYmIFJlZmxlY3QuZ2V0KSB7CiAgICAgICAgX2dldCA9IFJlZmxlY3QuZ2V0OwogICAgfSBlbHNlIHsKICAgICAgICBfZ2V0ID0gZnVuY3Rpb24gZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyKSB7CiAgICAgICAgICAgIHZhciBiYXNlID0gX3N1cGVyX3Byb3BfYmFzZSh0YXJnZXQsIHByb3BlcnR5KTsKICAgICAgICAgICAgaWYgKCFiYXNlKSByZXR1cm47CiAgICAgICAgICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihiYXNlLCBwcm9wZXJ0eSk7CiAgICAgICAgICAgIGlmIChkZXNjLmdldCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGRlc2MuZ2V0LmNhbGwocmVjZWl2ZXIgfHwgdGFyZ2V0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZGVzYy52YWx1ZTsKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuIF9nZXQodGFyZ2V0LCBwcm9wZXJ0eSwgcmVjZWl2ZXIgfHwgdGFyZ2V0KTsKfQpmdW5jdGlvbiBfZ2V0X3Byb3RvdHlwZV9vZihvKSB7CiAgICBfZ2V0X3Byb3RvdHlwZV9vZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIGdldFByb3RvdHlwZU9mKG8pIHsKICAgICAgICByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pOwogICAgfTsKICAgIHJldHVybiBfZ2V0X3Byb3RvdHlwZV9vZihvKTsKfQpmdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsKICAgIGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gImZ1bmN0aW9uIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTsKICAgIH0KICAgIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgewogICAgICAgIGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9CiAgICB9KTsKICAgIGlmIChzdXBlckNsYXNzKSBfc2V0X3Byb3RvdHlwZV9vZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7Cn0KZnVuY3Rpb24gX2luaGVyaXRzX2xvb3NlKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7CiAgICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTsKICAgIHN1YkNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHN1YkNsYXNzOwogICAgc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsKfQpmdW5jdGlvbiBfaW5pdGlhbGl6ZXJfZGVmaW5lX3Byb3BlcnR5KHRhcmdldCwgcHJvcGVydHksIGRlc2NyaXB0b3IsIGNvbnRleHQpIHsKICAgIGlmICghZGVzY3JpcHRvcikgcmV0dXJuOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHksIHsKICAgICAgICBlbnVtZXJhYmxlOiBkZXNjcmlwdG9yLmVudW1lcmFibGUsCiAgICAgICAgY29uZmlndXJhYmxlOiBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSwKICAgICAgICB3cml0YWJsZTogZGVzY3JpcHRvci53cml0YWJsZSwKICAgICAgICB2YWx1ZTogZGVzY3JpcHRvci5pbml0aWFsaXplciA/IGRlc2NyaXB0b3IuaW5pdGlhbGl6ZXIuY2FsbChjb250ZXh0KSA6IHZvaWQgMAogICAgfSk7Cn0KZnVuY3Rpb24gX2luaXRpYWxpemVyX3dhcm5pbmdfaGVscGVyKGRlc2NyaXB0b3IsIGNvbnRleHQpIHsKICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAiRGVjb3JhdGluZyBjbGFzcyBwcm9wZXJ0eSBmYWlsZWQuIFBsZWFzZSBlbnN1cmUgdGhhdCAiICsgInByb3Bvc2FsLWNsYXNzLXByb3BlcnRpZXMgaXMgZW5hYmxlZCBhbmQgc2V0IHRvIHVzZSBsb29zZSBtb2RlLiAiCiAgICAgICAgICAgICsgIlRvIHVzZSBwcm9wb3NhbC1jbGFzcy1wcm9wZXJ0aWVzIGluIHNwZWMgbW9kZSB3aXRoIGRlY29yYXRvcnMsIHdhaXQgZm9yICIKICAgICAgICAgICAgKyAidGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiBkZWNvcmF0b3JzIGluIHN0YWdlIDIuIgogICAgKTsKfQpmdW5jdGlvbiBfaW5zdGFuY2VvZihsZWZ0LCByaWdodCkgewogICAgaWYgKHJpZ2h0ICE9IG51bGwgJiYgdHlwZW9mIFN5bWJvbCAhPT0gInVuZGVmaW5lZCIgJiYgcmlnaHRbU3ltYm9sLmhhc0luc3RhbmNlXSkgewogICAgICAgIHJldHVybiAhIXJpZ2h0W1N5bWJvbC5oYXNJbnN0YW5jZV0obGVmdCk7CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBsZWZ0IGluc3RhbmNlb2YgcmlnaHQ7CiAgICB9Cn0KZnVuY3Rpb24gX2ludGVyb3BfcmVxdWlyZV9kZWZhdWx0KG9iaikgewogICAgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07Cn0KZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKG5vZGVJbnRlcm9wKSB7CiAgICBpZiAodHlwZW9mIFdlYWtNYXAgIT09ICJmdW5jdGlvbiIpIHJldHVybiBudWxsOwogICAgdmFyIGNhY2hlQmFiZWxJbnRlcm9wID0gbmV3IFdlYWtNYXAoKTsKICAgIHZhciBjYWNoZU5vZGVJbnRlcm9wID0gbmV3IFdlYWtNYXAoKTsKICAgIHJldHVybiAoX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlID0gZnVuY3Rpb24obm9kZUludGVyb3ApIHsKICAgICAgICByZXR1cm4gbm9kZUludGVyb3AgPyBjYWNoZU5vZGVJbnRlcm9wIDogY2FjaGVCYWJlbEludGVyb3A7CiAgICB9KShub2RlSW50ZXJvcCk7Cn0KZnVuY3Rpb24gX2ludGVyb3BfcmVxdWlyZV93aWxkY2FyZChvYmosIG5vZGVJbnRlcm9wKSB7CiAgICBpZiAoIW5vZGVJbnRlcm9wICYmIG9iaiAmJiBvYmouX19lc01vZHVsZSkgewogICAgICAgIHJldHVybiBvYmo7CiAgICB9CiAgICBpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogIT09ICJvYmplY3QiICYmIHR5cGVvZiBvYmogIT09ICJmdW5jdGlvbiIpIHsKICAgICAgICByZXR1cm4geyBkZWZhdWx0OiBvYmogfTsKICAgIH0KICAgIHZhciBjYWNoZSA9IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShub2RlSW50ZXJvcCk7CiAgICBpZiAoY2FjaGUgJiYgY2FjaGUuaGFzKG9iaikpIHsKICAgICAgICByZXR1cm4gY2FjaGUuZ2V0KG9iaik7CiAgICB9CiAgICB2YXIgbmV3T2JqID0geyBfX3Byb3RvX186IG51bGwgfTsKICAgIHZhciBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsKICAgIGZvciAodmFyIGtleSBpbiBvYmopIHsKICAgICAgICBpZiAoa2V5ICE9PSAiZGVmYXVsdCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgewogICAgICAgICAgICB2YXIgZGVzYyA9IGhhc1Byb3BlcnR5RGVzY3JpcHRvciA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpIDogbnVsbDsKICAgICAgICAgICAgaWYgKGRlc2MgJiYgKGRlc2MuZ2V0IHx8IGRlc2Muc2V0KSkgewogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld09iaiwga2V5LCBkZXNjKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG5ld09ialtrZXldID0gb2JqW2tleV07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBuZXdPYmouZGVmYXVsdCA9IG9iajsKICAgIGlmIChjYWNoZSkgewogICAgICAgIGNhY2hlLnNldChvYmosIG5ld09iaik7CiAgICB9CiAgICByZXR1cm4gbmV3T2JqOwp9CmZ1bmN0aW9uIF9pc19uYXRpdmVfZnVuY3Rpb24oZm4pIHsKICAgIHJldHVybiBGdW5jdGlvbi50b1N0cmluZy5jYWxsKGZuKS5pbmRleE9mKCJbbmF0aXZlIGNvZGVdIikgIT09IC0xOwp9CmZ1bmN0aW9uIF9pdGVyYWJsZV90b19hcnJheShpdGVyKSB7CiAgICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gInVuZGVmaW5lZCIgJiYgaXRlcltTeW1ib2wuaXRlcmF0b3JdICE9IG51bGwgfHwgaXRlclsiQEBpdGVyYXRvciJdICE9IG51bGwpIHJldHVybiBBcnJheS5mcm9tKGl0ZXIpOwp9CmZ1bmN0aW9uIF9pdGVyYWJsZV90b19hcnJheV9saW1pdChhcnIsIGkpIHsKICAgIHZhciBfaSA9IGFyciA9PSBudWxsID8gbnVsbCA6IHR5cGVvZiBTeW1ib2wgIT09ICJ1bmRlZmluZWQiICYmIGFycltTeW1ib2wuaXRlcmF0b3JdIHx8IGFyclsiQEBpdGVyYXRvciJdOwogICAgaWYgKF9pID09IG51bGwpIHJldHVybjsKICAgIHZhciBfYXJyID0gW107CiAgICB2YXIgX24gPSB0cnVlOwogICAgdmFyIF9kID0gZmFsc2U7CiAgICB2YXIgX3MsIF9lOwogICAgdHJ5IHsKICAgICAgICBmb3IgKF9pID0gX2kuY2FsbChhcnIpOyAhKF9uID0gKF9zID0gX2kubmV4dCgpKS5kb25lKTsgX24gPSB0cnVlKSB7CiAgICAgICAgICAgIF9hcnIucHVzaChfcy52YWx1ZSk7CiAgICAgICAgICAgIGlmIChpICYmIF9hcnIubGVuZ3RoID09PSBpKSBicmVhazsKICAgICAgICB9CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICBfZCA9IHRydWU7CiAgICAgICAgX2UgPSBlcnI7CiAgICB9IGZpbmFsbHkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmICghX24gJiYgX2lbInJldHVybiJdICE9IG51bGwpIF9pWyJyZXR1cm4iXSgpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgIGlmIChfZCkgdGhyb3cgX2U7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIF9hcnI7Cn0KZnVuY3Rpb24gX2l0ZXJhYmxlX3RvX2FycmF5X2xpbWl0X2xvb3NlKGFyciwgaSkgewogICAgdmFyIF9pID0gYXJyICYmICh0eXBlb2YgU3ltYm9sICE9PSAidW5kZWZpbmVkIiAmJiBhcnJbU3ltYm9sLml0ZXJhdG9yXSB8fCBhcnJbIkBAaXRlcmF0b3IiXSk7CiAgICBpZiAoX2kgPT0gbnVsbCkgcmV0dXJuOwogICAgdmFyIF9hcnIgPSBbXTsKICAgIGZvciAoX2kgPSBfaS5jYWxsKGFyciksIF9zdGVwOyAhKF9zdGVwID0gX2kubmV4dCgpKS5kb25lOykgewogICAgICAgIF9hcnIucHVzaChfc3RlcC52YWx1ZSk7CiAgICAgICAgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrOwogICAgfQogICAgcmV0dXJuIF9hcnI7Cn0KdmFyIFJFQUNUX0VMRU1FTlRfVFlQRTsKZnVuY3Rpb24gX2pzeCh0eXBlLCBwcm9wcywga2V5LCBjaGlsZHJlbikgewogICAgaWYgKCFSRUFDVF9FTEVNRU5UX1RZUEUpIHsKICAgICAgICBSRUFDVF9FTEVNRU5UX1RZUEUgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5mb3IgJiYgU3ltYm9sLmZvcigicmVhY3QuZWxlbWVudCIpIHx8IDB4ZWFjNzsKICAgIH0KICAgIHZhciBkZWZhdWx0UHJvcHMgPSB0eXBlICYmIHR5cGUuZGVmYXVsdFByb3BzOwogICAgdmFyIGNoaWxkcmVuTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCAtIDM7CiAgICBpZiAoIXByb3BzICYmIGNoaWxkcmVuTGVuZ3RoICE9PSAwKSB7CiAgICAgICAgcHJvcHMgPSB7IGNoaWxkcmVuOiB2b2lkIDAgfTsKICAgIH0KICAgIGlmIChwcm9wcyAmJiBkZWZhdWx0UHJvcHMpIHsKICAgICAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBkZWZhdWx0UHJvcHMpIHsKICAgICAgICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PT0gdm9pZCAwKSB7CiAgICAgICAgICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSBlbHNlIGlmICghcHJvcHMpIHsKICAgICAgICBwcm9wcyA9IGRlZmF1bHRQcm9wcyB8fCB7fTsKICAgIH0KICAgIGlmIChjaGlsZHJlbkxlbmd0aCA9PT0gMSkgewogICAgICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRyZW47CiAgICB9IGVsc2UgaWYgKGNoaWxkcmVuTGVuZ3RoID4gMSkgewogICAgICAgIHZhciBjaGlsZEFycmF5ID0gbmV3IEFycmF5KGNoaWxkcmVuTGVuZ3RoKTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuTGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgY2hpbGRBcnJheVtpXSA9IGFyZ3VtZW50c1tpICsgM107CiAgICAgICAgfQogICAgICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRBcnJheTsKICAgIH0KICAgIHJldHVybiB7ICQkdHlwZW9mOiBSRUFDVF9FTEVNRU5UX1RZUEUsIHR5cGU6IHR5cGUsIGtleToga2V5ID09PSB1bmRlZmluZWQgPyBudWxsIDogIiIgKyBrZXksIHJlZjogbnVsbCwgcHJvcHM6IHByb3BzLCBfb3duZXI6IG51bGwgfTsKfQpmdW5jdGlvbiBfbmV3X2Fycm93X2NoZWNrKGlubmVyVGhpcywgYm91bmRUaGlzKSB7CiAgICBpZiAoaW5uZXJUaGlzICE9PSBib3VuZFRoaXMpIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgaW5zdGFudGlhdGUgYW4gYXJyb3cgZnVuY3Rpb24iKTsKICAgIH0KfQpmdW5jdGlvbiBfbm9uX2l0ZXJhYmxlX3Jlc3QoKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKAogICAgICAgICJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4iCiAgICApOwp9CmZ1bmN0aW9uIF9ub25faXRlcmFibGVfc3ByZWFkKCkgewogICAgdGhyb3cgbmV3IFR5cGVFcnJvcigKICAgICAgICAiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIKICAgICk7Cn0KZnVuY3Rpb24gX29iamVjdF9kZXN0cnVjdHVyaW5nX2VtcHR5KG8pIHsKICAgIGlmIChvID09PSBudWxsIHx8IG8gPT09IHZvaWQgMCkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGRlc3RydWN0dXJlICIgKyBvKTsKICAgIHJldHVybiBvOwp9CmZ1bmN0aW9uIF9vYmplY3Rfc3ByZWFkKHRhcmdldCkgewogICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTsKICAgICAgICB2YXIgb3duS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7CiAgICAgICAgaWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgIG93bktleXMgPSBvd25LZXlzLmNvbmNhdCgKICAgICAgICAgICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKS5maWx0ZXIoZnVuY3Rpb24oc3ltKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBzeW0pLmVudW1lcmFibGU7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBvd25LZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7CiAgICAgICAgICAgIF9kZWZpbmVfcHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsKICAgICAgICB9KTsKICAgIH0KICAgIHJldHVybiB0YXJnZXQ7Cn0KZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7CiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7CiAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgewogICAgICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOwogICAgICAgIGlmIChlbnVtZXJhYmxlT25seSkgewogICAgICAgICAgICBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24oc3ltKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsKICAgIH0KICAgIHJldHVybiBrZXlzOwp9CmZ1bmN0aW9uIF9vYmplY3Rfc3ByZWFkX3Byb3BzKHRhcmdldCwgc291cmNlKSB7CiAgICBzb3VyY2UgPSBzb3VyY2UgIT0gbnVsbCA/IHNvdXJjZSA6IHt9OwogICAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTsKICAgIH0gZWxzZSB7CiAgICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbihrZXkpIHsKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7CiAgICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gdGFyZ2V0Owp9CmZ1bmN0aW9uIF9vYmplY3Rfd2l0aG91dF9wcm9wZXJ0aWVzKHNvdXJjZSwgZXhjbHVkZWQpIHsKICAgIGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OwogICAgdmFyIHRhcmdldCA9IF9vYmplY3Rfd2l0aG91dF9wcm9wZXJ0aWVzX2xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpOwogICAgdmFyIGtleSwgaTsKICAgIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7CiAgICAgICAgdmFyIHNvdXJjZVN5bWJvbEtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSk7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IHNvdXJjZVN5bWJvbEtleXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAga2V5ID0gc291cmNlU3ltYm9sS2V5c1tpXTsKICAgICAgICAgICAgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsKICAgICAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoc291cmNlLCBrZXkpKSBjb250aW51ZTsKICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gdGFyZ2V0Owp9CmZ1bmN0aW9uIF9vYmplY3Rfd2l0aG91dF9wcm9wZXJ0aWVzX2xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHsKICAgIGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OwogICAgdmFyIHRhcmdldCA9IHt9OwogICAgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpOwogICAgdmFyIGtleSwgaTsKICAgIGZvciAoaSA9IDA7IGkgPCBzb3VyY2VLZXlzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAga2V5ID0gc291cmNlS2V5c1tpXTsKICAgICAgICBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOwogICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07CiAgICB9CiAgICByZXR1cm4gdGFyZ2V0Owp9CmZ1bmN0aW9uIF9wb3NzaWJsZV9jb25zdHJ1Y3Rvcl9yZXR1cm4oc2VsZiwgY2FsbCkgewogICAgaWYgKGNhbGwgJiYgKF90eXBlX29mKGNhbGwpID09PSAib2JqZWN0IiB8fCB0eXBlb2YgY2FsbCA9PT0gImZ1bmN0aW9uIikpIHsKICAgICAgICByZXR1cm4gY2FsbDsKICAgIH0KICAgIHJldHVybiBfYXNzZXJ0X3RoaXNfaW5pdGlhbGl6ZWQoc2VsZik7Cn0KZnVuY3Rpb24gX3JlYWRfb25seV9lcnJvcihuYW1lKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJcIiIgKyBuYW1lICsgIlwiIGlzIHJlYWQtb25seSIpOwp9CmZ1bmN0aW9uIHNldCh0YXJnZXQsIHByb3BlcnR5LCB2YWx1ZSwgcmVjZWl2ZXIpIHsKICAgIGlmICh0eXBlb2YgUmVmbGVjdCAhPT0gInVuZGVmaW5lZCIgJiYgUmVmbGVjdC5zZXQpIHsKICAgICAgICBzZXQgPSBSZWZsZWN0LnNldDsKICAgIH0gZWxzZSB7CiAgICAgICAgc2V0ID0gZnVuY3Rpb24gc2V0KHRhcmdldCwgcHJvcGVydHksIHZhbHVlLCByZWNlaXZlcikgewogICAgICAgICAgICB2YXIgYmFzZSA9IF9zdXBlcl9wcm9wX2Jhc2UodGFyZ2V0LCBwcm9wZXJ0eSk7CiAgICAgICAgICAgIHZhciBkZXNjOwogICAgICAgICAgICBpZiAoYmFzZSkgewogICAgICAgICAgICAgICAgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYmFzZSwgcHJvcGVydHkpOwogICAgICAgICAgICAgICAgaWYgKGRlc2Muc2V0KSB7CiAgICAgICAgICAgICAgICAgICAgZGVzYy5zZXQuY2FsbChyZWNlaXZlciwgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZGVzYy53cml0YWJsZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyZWNlaXZlciwgcHJvcGVydHkpOwogICAgICAgICAgICBpZiAoZGVzYykgewogICAgICAgICAgICAgICAgaWYgKCFkZXNjLndyaXRhYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGVzYy52YWx1ZSA9IHZhbHVlOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlY2VpdmVyLCBwcm9wZXJ0eSwgZGVzYyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBfZGVmaW5lX3Byb3BlcnR5KHJlY2VpdmVyLCBwcm9wZXJ0eSwgdmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH07CiAgICB9CiAgICByZXR1cm4gc2V0KHRhcmdldCwgcHJvcGVydHksIHZhbHVlLCByZWNlaXZlcik7Cn0KZnVuY3Rpb24gX3NldCh0YXJnZXQsIHByb3BlcnR5LCB2YWx1ZSwgcmVjZWl2ZXIsIGlzU3RyaWN0KSB7CiAgICB2YXIgcyA9IHNldCh0YXJnZXQsIHByb3BlcnR5LCB2YWx1ZSwgcmVjZWl2ZXIgfHwgdGFyZ2V0KTsKICAgIGlmICghcyAmJiBpc1N0cmljdCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcigiZmFpbGVkIHRvIHNldCBwcm9wZXJ0eSIpOwogICAgfQogICAgcmV0dXJuIHZhbHVlOwp9CmZ1bmN0aW9uIF9zZXRfcHJvdG90eXBlX29mKG8sIHApIHsKICAgIF9zZXRfcHJvdG90eXBlX29mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKG8sIHApIHsKICAgICAgICBvLl9fcHJvdG9fXyA9IHA7CiAgICAgICAgcmV0dXJuIG87CiAgICB9OwogICAgcmV0dXJuIF9zZXRfcHJvdG90eXBlX29mKG8sIHApOwp9CmZ1bmN0aW9uIF9za2lwX2ZpcnN0X2dlbmVyYXRvcl9uZXh0KGZuKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGl0ID0gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICBpdC5uZXh0KCk7CiAgICAgICAgcmV0dXJuIGl0OwogICAgfTsKfQpmdW5jdGlvbiBfc2xpY2VkX3RvX2FycmF5KGFyciwgaSkgewogICAgcmV0dXJuIF9hcnJheV93aXRoX2hvbGVzKGFycikgfHwgX2l0ZXJhYmxlX3RvX2FycmF5X2xpbWl0KGFyciwgaSkgfHwgX3Vuc3VwcG9ydGVkX2l0ZXJhYmxlX3RvX2FycmF5KGFyciwgaSkgfHwgX25vbl9pdGVyYWJsZV9yZXN0KCk7Cn0KZnVuY3Rpb24gX3NsaWNlZF90b19hcnJheV9sb29zZShhcnIsIGkpIHsKICAgIHJldHVybiBfYXJyYXlfd2l0aF9ob2xlcyhhcnIpIHx8IF9pdGVyYWJsZV90b19hcnJheV9saW1pdF9sb29zZShhcnIsIGkpIHx8IF91bnN1cHBvcnRlZF9pdGVyYWJsZV90b19hcnJheShhcnIsIGkpCiAgICAgICAgfHwgX25vbl9pdGVyYWJsZV9yZXN0KCk7Cn0KZnVuY3Rpb24gX3N1cGVyX3Byb3BfYmFzZShvYmplY3QsIHByb3BlcnR5KSB7CiAgICB3aGlsZSAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KSkgewogICAgICAgIG9iamVjdCA9IF9nZXRfcHJvdG90eXBlX29mKG9iamVjdCk7CiAgICAgICAgaWYgKG9iamVjdCA9PT0gbnVsbCkgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gb2JqZWN0Owp9CmZ1bmN0aW9uIF90YWdnZWRfdGVtcGxhdGVfbGl0ZXJhbChzdHJpbmdzLCByYXcpIHsKICAgIGlmICghcmF3KSB7CiAgICAgICAgcmF3ID0gc3RyaW5ncy5zbGljZSgwKTsKICAgIH0KICAgIHJldHVybiBPYmplY3QuZnJlZXplKE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHN0cmluZ3MsIHsgcmF3OiB7IHZhbHVlOiBPYmplY3QuZnJlZXplKHJhdykgfSB9KSk7Cn0KZnVuY3Rpb24gX3RhZ2dlZF90ZW1wbGF0ZV9saXRlcmFsX2xvb3NlKHN0cmluZ3MsIHJhdykgewogICAgaWYgKCFyYXcpIHsKICAgICAgICByYXcgPSBzdHJpbmdzLnNsaWNlKDApOwogICAgfQogICAgc3RyaW5ncy5yYXcgPSByYXc7CiAgICByZXR1cm4gc3RyaW5nczsKfQpmdW5jdGlvbiBfdGhyb3coZSkgewogICAgdGhyb3cgZTsKfQpmdW5jdGlvbiBfdG9fYXJyYXkoYXJyKSB7CiAgICByZXR1cm4gX2FycmF5X3dpdGhfaG9sZXMoYXJyKSB8fCBfaXRlcmFibGVfdG9fYXJyYXkoYXJyKSB8fCBfdW5zdXBwb3J0ZWRfaXRlcmFibGVfdG9fYXJyYXkoYXJyKSB8fCBfbm9uX2l0ZXJhYmxlX3Jlc3QoKTsKfQpmdW5jdGlvbiBfdG9fY29uc3VtYWJsZV9hcnJheShhcnIpIHsKICAgIHJldHVybiBfYXJyYXlfd2l0aG91dF9ob2xlcyhhcnIpIHx8IF9pdGVyYWJsZV90b19hcnJheShhcnIpIHx8IF91bnN1cHBvcnRlZF9pdGVyYWJsZV90b19hcnJheShhcnIpIHx8IF9ub25faXRlcmFibGVfc3ByZWFkKCk7Cn0KZnVuY3Rpb24gX3RvX3ByaW1pdGl2ZShpbnB1dCwgaGludCkgewogICAgaWYgKF90eXBlX29mKGlucHV0KSAhPT0gIm9iamVjdCIgfHwgaW5wdXQgPT09IG51bGwpIHJldHVybiBpbnB1dDsKICAgIHZhciBwcmltID0gaW5wdXRbU3ltYm9sLnRvUHJpbWl0aXZlXTsKICAgIGlmIChwcmltICE9PSB1bmRlZmluZWQpIHsKICAgICAgICB2YXIgcmVzID0gcHJpbS5jYWxsKGlucHV0LCBoaW50IHx8ICJkZWZhdWx0Iik7CiAgICAgICAgaWYgKF90eXBlX29mKHJlcykgIT09ICJvYmplY3QiKSByZXR1cm4gcmVzOwogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuIik7CiAgICB9CiAgICByZXR1cm4gKGhpbnQgPT09ICJzdHJpbmciID8gU3RyaW5nIDogTnVtYmVyKShpbnB1dCk7Cn0KZnVuY3Rpb24gX3RvX3Byb3BlcnR5X2tleShhcmcpIHsKICAgIHZhciBrZXkgPSBfdG9fcHJpbWl0aXZlKGFyZywgInN0cmluZyIpOwogICAgcmV0dXJuIF90eXBlX29mKGtleSkgPT09ICJzeW1ib2wiID8ga2V5IDogU3RyaW5nKGtleSk7Cn0KZnVuY3Rpb24gX3VwZGF0ZSh0YXJnZXQsIHByb3BlcnR5LCByZWNlaXZlciwgaXNTdHJpY3QpIHsKICAgIHJldHVybiB7CiAgICAgICAgZ2V0IF8oKSB7CiAgICAgICAgICAgIHJldHVybiBfZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyKTsKICAgICAgICB9LAogICAgICAgIHNldCBfKHZhbHVlKSB7CiAgICAgICAgICAgIF9zZXQodGFyZ2V0LCBwcm9wZXJ0eSwgdmFsdWUsIHJlY2VpdmVyLCBpc1N0cmljdCk7CiAgICAgICAgfQogICAgfTsKfQpmdW5jdGlvbiBfdHlwZV9vZihvYmopIHsKICAgICJAc3djL2hlbHBlcnMgLSB0eXBlb2YiOwogICAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sICE9PSAidW5kZWZpbmVkIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCA/ICJzeW1ib2wiIDogdHlwZW9mIG9iajsKfQpmdW5jdGlvbiBfdW5zdXBwb3J0ZWRfaXRlcmFibGVfdG9fYXJyYXkobywgbWluTGVuKSB7CiAgICBpZiAoIW8pIHJldHVybjsKICAgIGlmICh0eXBlb2YgbyA9PT0gInN0cmluZyIpIHJldHVybiBfYXJyYXlfbGlrZV90b19hcnJheShvLCBtaW5MZW4pOwogICAgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOwogICAgaWYgKG4gPT09ICJPYmplY3QiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7CiAgICBpZiAobiA9PT0gIk1hcCIgfHwgbiA9PT0gIlNldCIpIHJldHVybiBBcnJheS5mcm9tKG4pOwogICAgaWYgKG4gPT09ICJBcmd1bWVudHMiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5X2xpa2VfdG9fYXJyYXkobywgbWluTGVuKTsKfQpmdW5jdGlvbiBfd3JhcF9hc3luY19nZW5lcmF0b3IoZm4pIHsKICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gbmV3IF9hc3luY19nZW5lcmF0b3IoZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKSk7CiAgICB9Owp9CmZ1bmN0aW9uIF93cmFwX25hdGl2ZV9zdXBlcihDbGFzcykgewogICAgdmFyIF9jYWNoZSA9IHR5cGVvZiBNYXAgPT09ICJmdW5jdGlvbiIgPyBuZXcgTWFwKCkgOiB1bmRlZmluZWQ7CiAgICBfd3JhcF9uYXRpdmVfc3VwZXIgPSBmdW5jdGlvbiB3cmFwTmF0aXZlU3VwZXIoQ2xhc3MpIHsKICAgICAgICBpZiAoQ2xhc3MgPT09IG51bGwgfHwgIV9pc19uYXRpdmVfZnVuY3Rpb24oQ2xhc3MpKSByZXR1cm4gQ2xhc3M7CiAgICAgICAgaWYgKHR5cGVvZiBDbGFzcyAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZW9mIF9jYWNoZSAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgaWYgKF9jYWNoZS5oYXMoQ2xhc3MpKSByZXR1cm4gX2NhY2hlLmdldChDbGFzcyk7CiAgICAgICAgICAgIF9jYWNoZS5zZXQoQ2xhc3MsIFdyYXBwZXIpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBXcmFwcGVyKCkgewogICAgICAgICAgICByZXR1cm4gX2NvbnN0cnVjdChDbGFzcywgYXJndW1lbnRzLCBfZ2V0X3Byb3RvdHlwZV9vZih0aGlzKS5jb25zdHJ1Y3Rvcik7CiAgICAgICAgfQogICAgICAgIFdyYXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShDbGFzcy5wcm90b3R5cGUsIHsKICAgICAgICAgICAgY29uc3RydWN0b3I6IHsgdmFsdWU6IFdyYXBwZXIsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0KICAgICAgICB9KTsKICAgICAgICByZXR1cm4gX3NldF9wcm90b3R5cGVfb2YoV3JhcHBlciwgQ2xhc3MpOwogICAgfTsKICAgIHJldHVybiBfd3JhcF9uYXRpdmVfc3VwZXIoQ2xhc3MpOwp9CmZ1bmN0aW9uIF93cml0ZV9vbmx5X2Vycm9yKG5hbWUpIHsKICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIlwiIiArIG5hbWUgKyAiXCIgaXMgd3JpdGUtb25seSIpOwp9CmZ1bmN0aW9uIF9jbGFzc19wcml2YXRlX2ZpZWxkX2Rlc3RydWN0dXJlKHJlY2VpdmVyLCBwcml2YXRlTWFwKSB7CiAgICB2YXIgZGVzY3JpcHRvciA9IF9jbGFzc19leHRyYWN0X2ZpZWxkX2Rlc2NyaXB0b3IocmVjZWl2ZXIsIHByaXZhdGVNYXAsICJzZXQiKTsKICAgIHJldHVybiBfY2xhc3NfYXBwbHlfZGVzY3JpcHRvcl9kZXN0cnVjdHVyZShyZWNlaXZlciwgZGVzY3JpcHRvcik7Cn0KZnVuY3Rpb24gX2NsYXNzX3N0YXRpY19wcml2YXRlX2ZpZWxkX2Rlc3RydWN0dXJlKHJlY2VpdmVyLCBjbGFzc0NvbnN0cnVjdG9yLCBkZXNjcmlwdG9yKSB7CiAgICBfY2xhc3NfY2hlY2tfcHJpdmF0ZV9zdGF0aWNfYWNjZXNzKHJlY2VpdmVyLCBjbGFzc0NvbnN0cnVjdG9yKTsKICAgIF9jbGFzc19jaGVja19wcml2YXRlX3N0YXRpY19maWVsZF9kZXNjcmlwdG9yKGRlc2NyaXB0b3IsICJzZXQiKTsKICAgIHJldHVybiBfY2xhc3NfYXBwbHlfZGVzY3JpcHRvcl9kZXN0cnVjdHVyZShyZWNlaXZlciwgZGVzY3JpcHRvcik7Cn0KZnVuY3Rpb24gX2NsYXNzX3N0YXRpY19wcml2YXRlX21ldGhvZF9nZXQocmVjZWl2ZXIsIGNsYXNzQ29uc3RydWN0b3IsIG1ldGhvZCkgewogICAgX2NsYXNzX2NoZWNrX3ByaXZhdGVfc3RhdGljX2FjY2VzcyhyZWNlaXZlciwgY2xhc3NDb25zdHJ1Y3Rvcik7CiAgICByZXR1cm4gbWV0aG9kOwp9CmZ1bmN0aW9uIF9jbGFzc19jaGVja19wcml2YXRlX3N0YXRpY19hY2Nlc3MocmVjZWl2ZXIsIGNsYXNzQ29uc3RydWN0b3IpIHsKICAgIGlmIChyZWNlaXZlciAhPT0gY2xhc3NDb25zdHJ1Y3RvcikgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIlByaXZhdGUgc3RhdGljIGFjY2VzcyBvZiB3cm9uZyBwcm92ZW5hbmNlIik7CiAgICB9Cn0KZnVuY3Rpb24gX2lzX25hdGl2ZV9yZWZsZWN0X2NvbnN0cnVjdCgpIHsKICAgIC8vIFNpbmNlIFJlZmxlY3QuY29uc3RydWN0IGNhbid0IGJlIHByb3Blcmx5IHBvbHlmaWxsZWQsIHNvbWUKICAgIC8vIGltcGxlbWVudGF0aW9ucyAoZS5nLiBjb3JlLWpzQDIpIGRvbid0IHNldCB0aGUgY29ycmVjdCBpbnRlcm5hbCBzbG90cy4KICAgIC8vIFRob3NlIHBvbHlmaWxscyBkb24ndCBhbGxvdyB1cyB0byBzdWJjbGFzcyBidWlsdC1pbnMsIHNvIHdlIG5lZWQgdG8KICAgIC8vIHVzZSBvdXIgZmFsbGJhY2sgaW1wbGVtZW50YXRpb24uCiAgICB0cnkgewogICAgICAgIC8vIElmIHRoZSBpbnRlcm5hbCBzbG90cyBhcmVuJ3Qgc2V0LCB0aGlzIHRocm93cyBhbiBlcnJvciBzaW1pbGFyIHRvCiAgICAgICAgLy8gICBUeXBlRXJyb3I6IHRoaXMgaXMgbm90IGEgQm9vbGVhbiBvYmplY3QuCiAgICAgICAgdmFyIHJlc3VsdCA9ICFCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoQm9vbGVhbiwgW10sIGZ1bmN0aW9uKCkge30pKTsKICAgIH0gY2F0Y2ggKF8pIHt9CiAgICByZXR1cm4gKF9pc19uYXRpdmVfcmVmbGVjdF9jb25zdHJ1Y3QgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gISFyZXN1bHQ7CiAgICB9KSgpOwp9CmZ1bmN0aW9uIF9jcmVhdGVfc3VwZXIoRGVyaXZlZCkgewogICAgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNfbmF0aXZlX3JlZmxlY3RfY29uc3RydWN0KCk7CiAgICByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7CiAgICAgICAgdmFyIFN1cGVyID0gX2dldF9wcm90b3R5cGVfb2YoRGVyaXZlZCksIHJlc3VsdDsKICAgICAgICBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgewogICAgICAgICAgICB2YXIgTmV3VGFyZ2V0ID0gX2dldF9wcm90b3R5cGVfb2YodGhpcykuY29uc3RydWN0b3I7CiAgICAgICAgICAgIHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9wb3NzaWJsZV9jb25zdHJ1Y3Rvcl9yZXR1cm4odGhpcywgcmVzdWx0KTsKICAgIH07Cn0KZnVuY3Rpb24gX2NyZWF0ZV9mb3Jfb2ZfaXRlcmF0b3JfaGVscGVyX2xvb3NlKG8sIGFsbG93QXJyYXlMaWtlKSB7CiAgICB2YXIgaXQgPSB0eXBlb2YgU3ltYm9sICE9PSAidW5kZWZpbmVkIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl0gfHwgb1siQEBpdGVyYXRvciJdOwogICAgaWYgKGl0KSByZXR1cm4gKGl0ID0gaXQuY2FsbChvKSkubmV4dC5iaW5kKGl0KTsKICAgIC8vIEZhbGxiYWNrIGZvciBlbmdpbmVzIHdpdGhvdXQgc3ltYm9sIHN1cHBvcnQKICAgIGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IF91bnN1cHBvcnRlZF9pdGVyYWJsZV90b19hcnJheShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09ICJudW1iZXIiKSB7CiAgICAgICAgaWYgKGl0KSBvID0gaXQ7CiAgICAgICAgdmFyIGkgPSAwOwogICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgaWYgKGkgPj0gby5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OwogICAgICAgIH07CiAgICB9CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKAogICAgICAgICJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIKICAgICk7Cn0KZnVuY3Rpb24gX3RzX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7CiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkOwogICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSAib2JqZWN0IiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gImZ1bmN0aW9uIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpOwogICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjsKICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7Cn1mdW5jdGlvbiBfdHNfZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHsKICAgIHZhciBmLCB5LCB0LCBnLCBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24gKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9OwogICAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksICJ0aHJvdyI6IHZlcmIoMSksICJyZXR1cm4iOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0pLCBnOwogICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9CiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7CiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy4iKTsKICAgICAgICB3aGlsZSAoXykgdHJ5IHsKICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVsicmV0dXJuIl0gOiBvcFswXSA/IHlbInRocm93Il0gfHwgKCh0ID0geVsicmV0dXJuIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0OwogICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07CiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHsKICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTsKICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTsKICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH0KICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH0KICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpOwogICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7CiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfQogICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9OwogICAgfQp9ZnVuY3Rpb24gX3RzX21ldGFkYXRhKGssIHYpIHsKICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gIm9iamVjdCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09ICJmdW5jdGlvbiIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKGssIHYpOwp9ZnVuY3Rpb24gX3RzX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikgewogICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9Cn1mdW5jdGlvbiBfdHNfdmFsdWVzKG8pIHsKICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwOwogICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7CiAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09ICJudW1iZXIiKSByZXR1cm4gewogICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDsKICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9OwogICAgICAgIH0KICAgIH07CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyAiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS4iIDogIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC4iKTsKfWZ1bmN0aW9uIF90c19hZGRfZGlzcG9zYWJsZV9yZXNvdXJjZShlbnYsIHZhbHVlLCBhc3luYykgewogICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDApIHsKICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAib2JqZWN0IiAmJiB0eXBlb2YgdmFsdWUgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZC4iKTsKICAgICAgICB2YXIgZGlzcG9zZSwgaW5uZXI7CiAgICAgICAgaWYgKGFzeW5jKSB7CiAgICAgICAgICAgIGlmICghU3ltYm9sLmFzeW5jRGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiU3ltYm9sLmFzeW5jRGlzcG9zZSBpcyBub3QgZGVmaW5lZC4iKTsKICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdOwogICAgICAgIH0KICAgICAgICBpZiAoZGlzcG9zZSA9PT0gdm9pZCAwKSB7CiAgICAgICAgICAgIGlmICghU3ltYm9sLmRpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbC5kaXNwb3NlIGlzIG5vdCBkZWZpbmVkLiIpOwogICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmRpc3Bvc2VdOwogICAgICAgICAgICBpZiAoYXN5bmMpIGlubmVyID0gZGlzcG9zZTsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGVvZiBkaXNwb3NlICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3Qgbm90IGRpc3Bvc2FibGUuIik7CiAgICAgICAgaWYgKGlubmVyKSBkaXNwb3NlID0gZnVuY3Rpb24gKCkgeyB0cnkgeyBpbm5lci5jYWxsKHRoaXMpOyB9IGNhdGNoIChlKSB7IHJldHVybiBQcm9taXNlLnJlamVjdChlKTsgfSB9OwogICAgICAgIGVudi5zdGFjay5wdXNoKHsgdmFsdWU6IHZhbHVlLCBkaXNwb3NlOiBkaXNwb3NlLCBhc3luYzogYXN5bmMgfSk7CiAgICB9CiAgICBlbHNlIGlmIChhc3luYykgewogICAgICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7CiAgICB9CiAgICByZXR1cm4gdmFsdWU7Cn1mdW5jdGlvbiBfdHNfZGlzcG9zZV9yZXNvdXJjZXMoZW52KSB7CiAgICB2YXIgX1N1cHByZXNzZWRFcnJvciA9IHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09ICJmdW5jdGlvbiIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHsKICAgICAgICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlKTsKICAgICAgICByZXR1cm4gZS5uYW1lID0gIlN1cHByZXNzZWRFcnJvciIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTsKICAgIH07CgoKICAgIHJldHVybiAoX3RzX2Rpc3Bvc2VfcmVzb3VyY2VzID0gZnVuY3Rpb24gX3RzX2Rpc3Bvc2VfcmVzb3VyY2VzKGVudikgewogICAgICAgIGZ1bmN0aW9uIGZhaWwoZSkgewogICAgICAgICAgICBlbnYuZXJyb3IgPSBlbnYuaGFzRXJyb3IgPyBuZXcgX1N1cHByZXNzZWRFcnJvcihlLCBlbnYuZXJyb3IsICJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuIikgOiBlOwogICAgICAgICAgICBlbnYuaGFzRXJyb3IgPSB0cnVlOwogICAgICAgIH0KICAgICAgICB2YXIgciwgcyA9IDA7CiAgICAgICAgZnVuY3Rpb24gbmV4dCgpIHsKICAgICAgICAgICAgd2hpbGUgKHIgPSBlbnYuc3RhY2sucG9wKCkpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFyLmFzeW5jICYmIHMgPT09IDEpIHJldHVybiBzID0gMCwgZW52LnN0YWNrLnB1c2gociksIFByb21pc2UucmVzb2x2ZSgpLnRoZW4obmV4dCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHIuZGlzcG9zZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gci5kaXNwb3NlLmNhbGwoci52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyLmFzeW5jKSByZXR1cm4gcyB8PSAyLCBQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKG5leHQsIGZ1bmN0aW9uIChlKSB7IGZhaWwoZSk7IHJldHVybiBuZXh0KCk7IH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHMgfD0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZmFpbChlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocyA9PT0gMSkgcmV0dXJuIGVudi5oYXNFcnJvciA/IFByb21pc2UucmVqZWN0KGVudi5lcnJvcikgOiBQcm9taXNlLnJlc29sdmUoKTsKICAgICAgICAgICAgaWYgKGVudi5oYXNFcnJvcikgdGhyb3cgZW52LmVycm9yOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV4dCgpOwogICAgfSkoZW52KTsKfS8qIEBtaW5WZXJzaW9uIDcuMjAuMCAqLwoKLyoqCiAgRW51bXMgYXJlIHVzZWQgaW4gdGhpcyBmaWxlLCBidXQgbm90IGFzc2lnbmVkIHRvIHZhcnMgdG8gYXZvaWQgbm9uLWhvaXN0YWJsZSB2YWx1ZXMKCiAgQ09OU1RSVUNUT1IgPSAwOwogIFBVQkxJQyA9IDE7CiAgUFJJVkFURSA9IDI7CgogIEZJRUxEID0gMDsKICBBQ0NFU1NPUiA9IDE7CiAgTUVUSE9EID0gMjsKICBHRVRURVIgPSAzOwogIFNFVFRFUiA9IDQ7CgogIFNUQVRJQyA9IDU7CgogIENMQVNTID0gMTA7IC8vIG9ubHkgdXNlZCBpbiBhc3NlcnRWYWxpZFJldHVyblZhbHVlCiovCgpmdW5jdGlvbiBhcHBseURlY3MyMjAzUkZhY3RvcnkoKSB7CiAgICBmdW5jdGlvbiBjcmVhdGVBZGRJbml0aWFsaXplck1ldGhvZChpbml0aWFsaXplcnMsIGRlY29yYXRvckZpbmlzaGVkUmVmKSB7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGFkZEluaXRpYWxpemVyKGluaXRpYWxpemVyKSB7CiAgICAgICAgICAgIGFzc2VydE5vdEZpbmlzaGVkKGRlY29yYXRvckZpbmlzaGVkUmVmLCAiYWRkSW5pdGlhbGl6ZXIiKTsKICAgICAgICAgICAgYXNzZXJ0Q2FsbGFibGUoaW5pdGlhbGl6ZXIsICJBbiBpbml0aWFsaXplciIpOwogICAgICAgICAgICBpbml0aWFsaXplcnMucHVzaChpbml0aWFsaXplcik7CiAgICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBtZW1iZXJEZWMoCiAgICAgICAgZGVjLAogICAgICAgIG5hbWUsCiAgICAgICAgZGVzYywKICAgICAgICBpbml0aWFsaXplcnMsCiAgICAgICAga2luZCwKICAgICAgICBpc1N0YXRpYywKICAgICAgICBpc1ByaXZhdGUsCiAgICAgICAgbWV0YWRhdGEsCiAgICAgICAgdmFsdWUKICAgICkgewogICAgICAgIHZhciBraW5kU3RyOwoKICAgICAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgICAgICAgY2FzZSAxIC8qIEFDQ0VTU09SICovOgogICAgICAgICAgICAgICAga2luZFN0ciA9ICJhY2Nlc3NvciI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAyIC8qIE1FVEhPRCAqLzoKICAgICAgICAgICAgICAgIGtpbmRTdHIgPSAibWV0aG9kIjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDMgLyogR0VUVEVSICovOgogICAgICAgICAgICAgICAga2luZFN0ciA9ICJnZXR0ZXIiOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgNCAvKiBTRVRURVIgKi86CiAgICAgICAgICAgICAgICBraW5kU3RyID0gInNldHRlciI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIGtpbmRTdHIgPSAiZmllbGQiOwogICAgICAgIH0KCiAgICAgICAgdmFyIGN0eCA9IHsKICAgICAgICAgICAga2luZDoga2luZFN0ciwKICAgICAgICAgICAgbmFtZTogaXNQcml2YXRlID8gIiMiICsgbmFtZSA6IG5hbWUsCiAgICAgICAgICAgIHN0YXRpYzogaXNTdGF0aWMsCiAgICAgICAgICAgIHByaXZhdGU6IGlzUHJpdmF0ZSwKICAgICAgICAgICAgbWV0YWRhdGE6IG1ldGFkYXRhLAogICAgICAgIH07CgogICAgICAgIHZhciBkZWNvcmF0b3JGaW5pc2hlZFJlZiA9IHsgdjogZmFsc2UgfTsKCiAgICAgICAgY3R4LmFkZEluaXRpYWxpemVyID0gY3JlYXRlQWRkSW5pdGlhbGl6ZXJNZXRob2QoCiAgICAgICAgICAgIGluaXRpYWxpemVycywKICAgICAgICAgICAgZGVjb3JhdG9yRmluaXNoZWRSZWYKICAgICAgICApOwoKICAgICAgICB2YXIgZ2V0LCBzZXQ7CiAgICAgICAgaWYgKGtpbmQgPT09IDAgLyogRklFTEQgKi8pIHsKICAgICAgICAgICAgaWYgKGlzUHJpdmF0ZSkgewogICAgICAgICAgICAgICAgZ2V0ID0gZGVzYy5nZXQ7CiAgICAgICAgICAgICAgICBzZXQgPSBkZXNjLnNldDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGdldCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1tuYW1lXTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBzZXQgPSBmdW5jdGlvbiAodikgewogICAgICAgICAgICAgICAgICAgIHRoaXNbbmFtZV0gPSB2OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoa2luZCA9PT0gMiAvKiBNRVRIT0QgKi8pIHsKICAgICAgICAgICAgZ2V0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGRlc2MudmFsdWU7CiAgICAgICAgICAgIH07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gcmVwbGFjZSB3aXRoIHZhbHVlcyB0aGF0IHdpbGwgZ28gdGhyb3VnaCB0aGUgZmluYWwgZ2V0dGVyIGFuZCBzZXR0ZXIKICAgICAgICAgICAgaWYgKGtpbmQgPT09IDEgLyogQUNDRVNTT1IgKi8gfHwga2luZCA9PT0gMyAvKiBHRVRURVIgKi8pIHsKICAgICAgICAgICAgICAgIGdldCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVzYy5nZXQuY2FsbCh0aGlzKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChraW5kID09PSAxIC8qIEFDQ0VTU09SICovIHx8IGtpbmQgPT09IDQgLyogU0VUVEVSICovKSB7CiAgICAgICAgICAgICAgICBzZXQgPSBmdW5jdGlvbiAodikgewogICAgICAgICAgICAgICAgICAgIGRlc2Muc2V0LmNhbGwodGhpcywgdik7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGN0eC5hY2Nlc3MgPQogICAgICAgICAgICBnZXQgJiYgc2V0ID8geyBnZXQ6IGdldCwgc2V0OiBzZXQgfSA6IGdldCA/IHsgZ2V0OiBnZXQgfSA6IHsgc2V0OiBzZXQgfTsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcmV0dXJuIGRlYyh2YWx1ZSwgY3R4KTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICBkZWNvcmF0b3JGaW5pc2hlZFJlZi52ID0gdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gYXNzZXJ0Tm90RmluaXNoZWQoZGVjb3JhdG9yRmluaXNoZWRSZWYsIGZuTmFtZSkgewogICAgICAgIGlmIChkZWNvcmF0b3JGaW5pc2hlZFJlZi52KSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAgICAgICAgICJhdHRlbXB0ZWQgdG8gY2FsbCAiICsgZm5OYW1lICsgIiBhZnRlciBkZWNvcmF0aW9uIHdhcyBmaW5pc2hlZCIKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gYXNzZXJ0Q2FsbGFibGUoZm4sIGhpbnQpIHsKICAgICAgICBpZiAodHlwZW9mIGZuICE9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoaGludCArICIgbXVzdCBiZSBhIGZ1bmN0aW9uIik7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGFzc2VydFZhbGlkUmV0dXJuVmFsdWUoa2luZCwgdmFsdWUpIHsKICAgICAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTsKCiAgICAgICAgaWYgKGtpbmQgPT09IDEgLyogQUNDRVNTT1IgKi8pIHsKICAgICAgICAgICAgaWYgKHR5cGUgIT09ICJvYmplY3QiIHx8IHZhbHVlID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKAogICAgICAgICAgICAgICAgICAgICJhY2Nlc3NvciBkZWNvcmF0b3JzIG11c3QgcmV0dXJuIGFuIG9iamVjdCB3aXRoIGdldCwgc2V0LCBvciBpbml0IHByb3BlcnRpZXMgb3Igdm9pZCAwIgogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodmFsdWUuZ2V0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIGFzc2VydENhbGxhYmxlKHZhbHVlLmdldCwgImFjY2Vzc29yLmdldCIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh2YWx1ZS5zZXQgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgYXNzZXJ0Q2FsbGFibGUodmFsdWUuc2V0LCAiYWNjZXNzb3Iuc2V0Iik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHZhbHVlLmluaXQgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgYXNzZXJ0Q2FsbGFibGUodmFsdWUuaW5pdCwgImFjY2Vzc29yLmluaXQiKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodHlwZSAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICB2YXIgaGludDsKICAgICAgICAgICAgaWYgKGtpbmQgPT09IDAgLyogRklFTEQgKi8pIHsKICAgICAgICAgICAgICAgIGhpbnQgPSAiZmllbGQiOwogICAgICAgICAgICB9IGVsc2UgaWYgKGtpbmQgPT09IDEwIC8qIENMQVNTICovKSB7CiAgICAgICAgICAgICAgICBoaW50ID0gImNsYXNzIjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGhpbnQgPSAibWV0aG9kIjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKAogICAgICAgICAgICAgICAgaGludCArICIgZGVjb3JhdG9ycyBtdXN0IHJldHVybiBhIGZ1bmN0aW9uIG9yIHZvaWQgMCIKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gYXBwbHlNZW1iZXJEZWMoCiAgICAgICAgcmV0LAogICAgICAgIGJhc2UsCiAgICAgICAgZGVjSW5mbywKICAgICAgICBuYW1lLAogICAgICAgIGtpbmQsCiAgICAgICAgaXNTdGF0aWMsCiAgICAgICAgaXNQcml2YXRlLAogICAgICAgIGluaXRpYWxpemVycywKICAgICAgICBtZXRhZGF0YQogICAgKSB7CiAgICAgICAgdmFyIGRlY3MgPSBkZWNJbmZvWzBdOwoKICAgICAgICB2YXIgZGVzYywgaW5pdCwgdmFsdWU7CgogICAgICAgIGlmIChpc1ByaXZhdGUpIHsKICAgICAgICAgICAgaWYgKGtpbmQgPT09IDAgLyogRklFTEQgKi8gfHwga2luZCA9PT0gMSAvKiBBQ0NFU1NPUiAqLykgewogICAgICAgICAgICAgICAgZGVzYyA9IHsKICAgICAgICAgICAgICAgICAgICBnZXQ6IGRlY0luZm9bM10sCiAgICAgICAgICAgICAgICAgICAgc2V0OiBkZWNJbmZvWzRdLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSBlbHNlIGlmIChraW5kID09PSAzIC8qIEdFVFRFUiAqLykgewogICAgICAgICAgICAgICAgZGVzYyA9IHsKICAgICAgICAgICAgICAgICAgICBnZXQ6IGRlY0luZm9bM10sCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9IGVsc2UgaWYgKGtpbmQgPT09IDQgLyogU0VUVEVSICovKSB7CiAgICAgICAgICAgICAgICBkZXNjID0gewogICAgICAgICAgICAgICAgICAgIHNldDogZGVjSW5mb1szXSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkZXNjID0gewogICAgICAgICAgICAgICAgICAgIHZhbHVlOiBkZWNJbmZvWzNdLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoa2luZCAhPT0gMCAvKiBGSUVMRCAqLykgewogICAgICAgICAgICBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihiYXNlLCBuYW1lKTsKICAgICAgICB9CgogICAgICAgIGlmIChraW5kID09PSAxIC8qIEFDQ0VTU09SICovKSB7CiAgICAgICAgICAgIHZhbHVlID0gewogICAgICAgICAgICAgICAgZ2V0OiBkZXNjLmdldCwKICAgICAgICAgICAgICAgIHNldDogZGVzYy5zZXQsCiAgICAgICAgICAgIH07CiAgICAgICAgfSBlbHNlIGlmIChraW5kID09PSAyIC8qIE1FVEhPRCAqLykgewogICAgICAgICAgICB2YWx1ZSA9IGRlc2MudmFsdWU7CiAgICAgICAgfSBlbHNlIGlmIChraW5kID09PSAzIC8qIEdFVFRFUiAqLykgewogICAgICAgICAgICB2YWx1ZSA9IGRlc2MuZ2V0OwogICAgICAgIH0gZWxzZSBpZiAoa2luZCA9PT0gNCAvKiBTRVRURVIgKi8pIHsKICAgICAgICAgICAgdmFsdWUgPSBkZXNjLnNldDsKICAgICAgICB9CgogICAgICAgIHZhciBuZXdWYWx1ZSwgZ2V0LCBzZXQ7CgogICAgICAgIGlmICh0eXBlb2YgZGVjcyA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICBuZXdWYWx1ZSA9IG1lbWJlckRlYygKICAgICAgICAgICAgICAgIGRlY3MsCiAgICAgICAgICAgICAgICBuYW1lLAogICAgICAgICAgICAgICAgZGVzYywKICAgICAgICAgICAgICAgIGluaXRpYWxpemVycywKICAgICAgICAgICAgICAgIGtpbmQsCiAgICAgICAgICAgICAgICBpc1N0YXRpYywKICAgICAgICAgICAgICAgIGlzUHJpdmF0ZSwKICAgICAgICAgICAgICAgIG1ldGFkYXRhLAogICAgICAgICAgICAgICAgdmFsdWUKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmIChuZXdWYWx1ZSAhPT0gdm9pZCAwKSB7CiAgICAgICAgICAgICAgICBhc3NlcnRWYWxpZFJldHVyblZhbHVlKGtpbmQsIG5ld1ZhbHVlKTsKCiAgICAgICAgICAgICAgICBpZiAoa2luZCA9PT0gMCAvKiBGSUVMRCAqLykgewogICAgICAgICAgICAgICAgICAgIGluaXQgPSBuZXdWYWx1ZTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2luZCA9PT0gMSAvKiBBQ0NFU1NPUiAqLykgewogICAgICAgICAgICAgICAgICAgIGluaXQgPSBuZXdWYWx1ZS5pbml0OwogICAgICAgICAgICAgICAgICAgIGdldCA9IG5ld1ZhbHVlLmdldCB8fCB2YWx1ZS5nZXQ7CiAgICAgICAgICAgICAgICAgICAgc2V0ID0gbmV3VmFsdWUuc2V0IHx8IHZhbHVlLnNldDsKCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB7IGdldDogZ2V0LCBzZXQ6IHNldCB9OwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG5ld1ZhbHVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IGRlY3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgICAgIHZhciBkZWMgPSBkZWNzW2ldOwoKICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gbWVtYmVyRGVjKAogICAgICAgICAgICAgICAgICAgIGRlYywKICAgICAgICAgICAgICAgICAgICBuYW1lLAogICAgICAgICAgICAgICAgICAgIGRlc2MsCiAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZXJzLAogICAgICAgICAgICAgICAgICAgIGtpbmQsCiAgICAgICAgICAgICAgICAgICAgaXNTdGF0aWMsCiAgICAgICAgICAgICAgICAgICAgaXNQcml2YXRlLAogICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLAogICAgICAgICAgICAgICAgICAgIHZhbHVlCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmIChuZXdWYWx1ZSAhPT0gdm9pZCAwKSB7CiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VmFsaWRSZXR1cm5WYWx1ZShraW5kLCBuZXdWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0luaXQ7CgogICAgICAgICAgICAgICAgICAgIGlmIChraW5kID09PSAwIC8qIEZJRUxEICovKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0luaXQgPSBuZXdWYWx1ZTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtpbmQgPT09IDEgLyogQUNDRVNTT1IgKi8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3SW5pdCA9IG5ld1ZhbHVlLmluaXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGdldCA9IG5ld1ZhbHVlLmdldCB8fCB2YWx1ZS5nZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldCA9IG5ld1ZhbHVlLnNldCB8fCB2YWx1ZS5zZXQ7CgogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHsgZ2V0OiBnZXQsIHNldDogc2V0IH07CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBuZXdWYWx1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmIChuZXdJbml0ICE9PSB2b2lkIDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluaXQgPT09IHZvaWQgMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCA9IG5ld0luaXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGluaXQgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQgPSBbaW5pdCwgbmV3SW5pdF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0LnB1c2gobmV3SW5pdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChraW5kID09PSAwIC8qIEZJRUxEICovIHx8IGtpbmQgPT09IDEgLyogQUNDRVNTT1IgKi8pIHsKICAgICAgICAgICAgaWYgKGluaXQgPT09IHZvaWQgMCkgewogICAgICAgICAgICAgICAgLy8gSWYgdGhlIGluaXRpYWxpemVyIHdhcyB2b2lkIDAsIHN1YiBpbiBhIGR1bW15IGluaXRpYWxpemVyCiAgICAgICAgICAgICAgICBpbml0ID0gZnVuY3Rpb24gKGluc3RhbmNlLCBpbml0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluaXQ7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbml0ICE9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICB2YXIgb3duSW5pdGlhbGl6ZXJzID0gaW5pdDsKCiAgICAgICAgICAgICAgICBpbml0ID0gZnVuY3Rpb24gKGluc3RhbmNlLCBpbml0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gaW5pdDsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvd25Jbml0aWFsaXplcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBvd25Jbml0aWFsaXplcnNbaV0uY2FsbChpbnN0YW5jZSwgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciBvcmlnaW5hbEluaXRpYWxpemVyID0gaW5pdDsKCiAgICAgICAgICAgICAgICBpbml0ID0gZnVuY3Rpb24gKGluc3RhbmNlLCBpbml0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsSW5pdGlhbGl6ZXIuY2FsbChpbnN0YW5jZSwgaW5pdCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXQucHVzaChpbml0KTsKICAgICAgICB9CgogICAgICAgIGlmIChraW5kICE9PSAwIC8qIEZJRUxEICovKSB7CiAgICAgICAgICAgIGlmIChraW5kID09PSAxIC8qIEFDQ0VTU09SICovKSB7CiAgICAgICAgICAgICAgICBkZXNjLmdldCA9IHZhbHVlLmdldDsKICAgICAgICAgICAgICAgIGRlc2Muc2V0ID0gdmFsdWUuc2V0OwogICAgICAgICAgICB9IGVsc2UgaWYgKGtpbmQgPT09IDIgLyogTUVUSE9EICovKSB7CiAgICAgICAgICAgICAgICBkZXNjLnZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoa2luZCA9PT0gMyAvKiBHRVRURVIgKi8pIHsKICAgICAgICAgICAgICAgIGRlc2MuZ2V0ID0gdmFsdWU7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoa2luZCA9PT0gNCAvKiBTRVRURVIgKi8pIHsKICAgICAgICAgICAgICAgIGRlc2Muc2V0ID0gdmFsdWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChpc1ByaXZhdGUpIHsKICAgICAgICAgICAgICAgIGlmIChraW5kID09PSAxIC8qIEFDQ0VTU09SICovKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goZnVuY3Rpb24gKGluc3RhbmNlLCBhcmdzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5nZXQuY2FsbChpbnN0YW5jZSwgYXJncyk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goZnVuY3Rpb24gKGluc3RhbmNlLCBhcmdzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5zZXQuY2FsbChpbnN0YW5jZSwgYXJncyk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtpbmQgPT09IDIgLyogTUVUSE9EICovKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2godmFsdWUpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXQucHVzaChmdW5jdGlvbiAoaW5zdGFuY2UsIGFyZ3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmNhbGwoaW5zdGFuY2UsIGFyZ3MpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGJhc2UsIG5hbWUsIGRlc2MpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGFwcGx5TWVtYmVyRGVjcyhDbGFzcywgZGVjSW5mb3MsIG1ldGFkYXRhKSB7CiAgICAgICAgdmFyIHJldCA9IFtdOwogICAgICAgIHZhciBwcm90b0luaXRpYWxpemVyczsKICAgICAgICB2YXIgc3RhdGljSW5pdGlhbGl6ZXJzOwoKICAgICAgICB2YXIgZXhpc3RpbmdQcm90b05vbkZpZWxkcyA9IG5ldyBNYXAoKTsKICAgICAgICB2YXIgZXhpc3RpbmdTdGF0aWNOb25GaWVsZHMgPSBuZXcgTWFwKCk7CgogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVjSW5mb3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIGRlY0luZm8gPSBkZWNJbmZvc1tpXTsKCiAgICAgICAgICAgIC8vIHNraXAgY29tcHV0ZWQgcHJvcGVydHkgbmFtZXMKICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGRlY0luZm8pKSBjb250aW51ZTsKCiAgICAgICAgICAgIHZhciBraW5kID0gZGVjSW5mb1sxXTsKICAgICAgICAgICAgdmFyIG5hbWUgPSBkZWNJbmZvWzJdOwogICAgICAgICAgICB2YXIgaXNQcml2YXRlID0gZGVjSW5mby5sZW5ndGggPiAzOwoKICAgICAgICAgICAgdmFyIGlzU3RhdGljID0ga2luZCA+PSA1OyAvKiBTVEFUSUMgKi8KICAgICAgICAgICAgdmFyIGJhc2U7CiAgICAgICAgICAgIHZhciBpbml0aWFsaXplcnM7CgogICAgICAgICAgICBpZiAoaXNTdGF0aWMpIHsKICAgICAgICAgICAgICAgIGJhc2UgPSBDbGFzczsKICAgICAgICAgICAgICAgIGtpbmQgPSBraW5kIC0gNSAvKiBTVEFUSUMgKi87CiAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplIHN0YXRpY0luaXRpYWxpemVycyB3aGVuIHdlIHNlZSBhIG5vbi1maWVsZCBzdGF0aWMgbWVtYmVyCiAgICAgICAgICAgICAgICBzdGF0aWNJbml0aWFsaXplcnMgPSBzdGF0aWNJbml0aWFsaXplcnMgfHwgW107CiAgICAgICAgICAgICAgICBpbml0aWFsaXplcnMgPSBzdGF0aWNJbml0aWFsaXplcnM7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBiYXNlID0gQ2xhc3MucHJvdG90eXBlOwogICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBwcm90b0luaXRpYWxpemVycyB3aGVuIHdlIHNlZSBhIG5vbi1maWVsZCBtZW1iZXIKICAgICAgICAgICAgICAgIHByb3RvSW5pdGlhbGl6ZXJzID0gcHJvdG9Jbml0aWFsaXplcnMgfHwgW107CiAgICAgICAgICAgICAgICBpbml0aWFsaXplcnMgPSBwcm90b0luaXRpYWxpemVyczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGtpbmQgIT09IDAgLyogRklFTEQgKi8gJiYgIWlzUHJpdmF0ZSkgewogICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nTm9uRmllbGRzID0gaXNTdGF0aWMKICAgICAgICAgICAgICAgICAgICA/IGV4aXN0aW5nU3RhdGljTm9uRmllbGRzCiAgICAgICAgICAgICAgICAgICAgOiBleGlzdGluZ1Byb3RvTm9uRmllbGRzOwoKICAgICAgICAgICAgICAgIHZhciBleGlzdGluZ0tpbmQgPSBleGlzdGluZ05vbkZpZWxkcy5nZXQobmFtZSkgfHwgMDsKCiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdLaW5kID09PSB0cnVlIHx8CiAgICAgICAgICAgICAgICAgICAgKGV4aXN0aW5nS2luZCA9PT0gMyAvKiBHRVRURVIgKi8gJiYga2luZCAhPT0gNCkgLyogU0VUVEVSICovIHx8CiAgICAgICAgICAgICAgICAgICAgKGV4aXN0aW5nS2luZCA9PT0gNCAvKiBTRVRURVIgKi8gJiYga2luZCAhPT0gMykgLyogR0VUVEVSICovCiAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgICJBdHRlbXB0ZWQgdG8gZGVjb3JhdGUgYSBwdWJsaWMgbWV0aG9kL2FjY2Vzc29yIHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgYXMgYSBwcmV2aW91c2x5IGRlY29yYXRlZCBwdWJsaWMgbWV0aG9kL2FjY2Vzc29yLiBUaGlzIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IHRoZSBkZWNvcmF0b3JzIHBsdWdpbi4gUHJvcGVydHkgbmFtZSB3YXM6ICIgKwogICAgICAgICAgICAgICAgICAgICAgICBuYW1lCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWV4aXN0aW5nS2luZCAmJiBraW5kID4gMiAvKiBNRVRIT0QgKi8pIHsKICAgICAgICAgICAgICAgICAgICBleGlzdGluZ05vbkZpZWxkcy5zZXQobmFtZSwga2luZCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nTm9uRmllbGRzLnNldChuYW1lLCB0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgYXBwbHlNZW1iZXJEZWMoCiAgICAgICAgICAgICAgICByZXQsCiAgICAgICAgICAgICAgICBiYXNlLAogICAgICAgICAgICAgICAgZGVjSW5mbywKICAgICAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgICAgICBraW5kLAogICAgICAgICAgICAgICAgaXNTdGF0aWMsCiAgICAgICAgICAgICAgICBpc1ByaXZhdGUsCiAgICAgICAgICAgICAgICBpbml0aWFsaXplcnMsCiAgICAgICAgICAgICAgICBtZXRhZGF0YQogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgcHVzaEluaXRpYWxpemVycyhyZXQsIHByb3RvSW5pdGlhbGl6ZXJzKTsKICAgICAgICBwdXNoSW5pdGlhbGl6ZXJzKHJldCwgc3RhdGljSW5pdGlhbGl6ZXJzKTsKICAgICAgICByZXR1cm4gcmV0OwogICAgfQoKICAgIGZ1bmN0aW9uIHB1c2hJbml0aWFsaXplcnMocmV0LCBpbml0aWFsaXplcnMpIHsKICAgICAgICBpZiAoaW5pdGlhbGl6ZXJzKSB7CiAgICAgICAgICAgIHJldC5wdXNoKGZ1bmN0aW9uIChpbnN0YW5jZSkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplcnNbaV0uY2FsbChpbnN0YW5jZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBhcHBseUNsYXNzRGVjcyh0YXJnZXRDbGFzcywgY2xhc3NEZWNzLCBtZXRhZGF0YSkgewogICAgICAgIGlmIChjbGFzc0RlY3MubGVuZ3RoID4gMCkgewogICAgICAgICAgICB2YXIgaW5pdGlhbGl6ZXJzID0gW107CiAgICAgICAgICAgIHZhciBuZXdDbGFzcyA9IHRhcmdldENsYXNzOwogICAgICAgICAgICB2YXIgbmFtZSA9IHRhcmdldENsYXNzLm5hbWU7CgogICAgICAgICAgICBmb3IgKHZhciBpID0gY2xhc3NEZWNzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgICAgICB2YXIgZGVjb3JhdG9yRmluaXNoZWRSZWYgPSB7IHY6IGZhbHNlIH07CgogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dE5ld0NsYXNzID0gY2xhc3NEZWNzW2ldKG5ld0NsYXNzLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQ6ICJjbGFzcyIsCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIGFkZEluaXRpYWxpemVyOiBjcmVhdGVBZGRJbml0aWFsaXplck1ldGhvZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29yYXRvckZpbmlzaGVkUmVmCiAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLAogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICBkZWNvcmF0b3JGaW5pc2hlZFJlZi52ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAobmV4dE5ld0NsYXNzICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICBhc3NlcnRWYWxpZFJldHVyblZhbHVlKDEwIC8qIENMQVNTICovLCBuZXh0TmV3Q2xhc3MpOwogICAgICAgICAgICAgICAgICAgIG5ld0NsYXNzID0gbmV4dE5ld0NsYXNzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAgICAgZGVmaW5lTWV0YWRhdGEobmV3Q2xhc3MsIG1ldGFkYXRhKSwKICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplcnNbaV0uY2FsbChuZXdDbGFzcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXTsKICAgICAgICB9CiAgICAgICAgLy8gVGhlIHRyYW5zZm9ybWVyIHdpbGwgbm90IGVtaXQgYXNzaWdubWVudCB3aGVuIHRoZXJlIGFyZSBubyBjbGFzcyBkZWNvcmF0b3JzLAogICAgICAgIC8vIHNvIHdlIGRvbid0IGhhdmUgdG8gcmV0dXJuIGFuIGVtcHR5IGFycmF5IGhlcmUuCiAgICB9CgogICAgZnVuY3Rpb24gZGVmaW5lTWV0YWRhdGEoQ2xhc3MsIG1ldGFkYXRhKSB7CiAgICAgICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSgKICAgICAgICAgICAgQ2xhc3MsCiAgICAgICAgICAgIFN5bWJvbC5tZXRhZGF0YSB8fCBTeW1ib2wuZm9yKCJTeW1ib2wubWV0YWRhdGEiKSwKICAgICAgICAgICAgeyBjb25maWd1cmFibGU6IHRydWUsIGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiBtZXRhZGF0YSB9CiAgICAgICAgKTsKICAgIH0KCiAgICAvKioKICAgIEJhc2ljIHVzYWdlOgogIAogICAgYXBwbHlEZWNzKAogICAgICBDbGFzcywKICAgICAgWwogICAgICAgIC8vIG1lbWJlciBkZWNvcmF0b3JzCiAgICAgICAgWwogICAgICAgICAgZGVjLCAgICAgICAgICAgICAgICAvLyBkZWMgb3IgYXJyYXkgb2YgZGVjcwogICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAvLyBraW5kIG9mIHZhbHVlIGJlaW5nIGRlY29yYXRlZAogICAgICAgICAgJ3Byb3AnLCAgICAgICAgICAgICAvLyBuYW1lIG9mIHB1YmxpYyBwcm9wIG9uIGNsYXNzIGNvbnRhaW5pbmcgdGhlIHZhbHVlIGJlaW5nIGRlY29yYXRlZCwKICAgICAgICAgICcjcCcsICAgICAgICAgICAgICAgLy8gdGhlIG5hbWUgb2YgdGhlIHByaXZhdGUgcHJvcGVydHkgKGlmIGlzIHByaXZhdGUsIHZvaWQgMCBvdGhlcndpc2UpLAogICAgICAgIF0KICAgICAgXSwKICAgICAgWwogICAgICAgIC8vIGNsYXNzIGRlY29yYXRvcnMKICAgICAgICBkZWMxLCBkZWMyCiAgICAgIF0KICAgICkKICAgIGBgYAogIAogICAgRnVsbHkgdHJhbnNwaWxlZCBleGFtcGxlOgogIAogICAgYGBganMKICAgIEBkZWMKICAgIGNsYXNzIENsYXNzIHsKICAgICAgQGRlYwogICAgICBhID0gMTIzOwogIAogICAgICBAZGVjCiAgICAgICNhID0gMTIzOwogIAogICAgICBAZGVjCiAgICAgIEBkZWMyCiAgICAgIGFjY2Vzc29yIGIgPSAxMjM7CiAgCiAgICAgIEBkZWMKICAgICAgYWNjZXNzb3IgI2IgPSAxMjM7CiAgCiAgICAgIEBkZWMKICAgICAgYygpIHsgY29uc29sZS5sb2coJ2MnKTsgfQogIAogICAgICBAZGVjCiAgICAgICNjKCkgeyBjb25zb2xlLmxvZygncHJpdkMnKTsgfQogIAogICAgICBAZGVjCiAgICAgIGdldCBkKCkgeyBjb25zb2xlLmxvZygnZCcpOyB9CiAgCiAgICAgIEBkZWMKICAgICAgZ2V0ICNkKCkgeyBjb25zb2xlLmxvZygncHJpdkQnKTsgfQogIAogICAgICBAZGVjCiAgICAgIHNldCBlKHYpIHsgY29uc29sZS5sb2coJ2UnKTsgfQogIAogICAgICBAZGVjCiAgICAgIHNldCAjZSh2KSB7IGNvbnNvbGUubG9nKCdwcml2RScpOyB9CiAgICB9CiAgCiAgCiAgICAvLyBiZWNvbWVzCiAgICBsZXQgaW5pdGlhbGl6ZUluc3RhbmNlOwogICAgbGV0IGluaXRpYWxpemVDbGFzczsKICAKICAgIGxldCBpbml0QTsKICAgIGxldCBpbml0UHJpdkE7CiAgCiAgICBsZXQgaW5pdEI7CiAgICBsZXQgaW5pdFByaXZCLCBnZXRQcml2Qiwgc2V0UHJpdkI7CiAgCiAgICBsZXQgcHJpdkM7CiAgICBsZXQgcHJpdkQ7CiAgICBsZXQgcHJpdkU7CiAgCiAgICBsZXQgQ2xhc3M7CiAgICBjbGFzcyBfQ2xhc3MgewogICAgICBzdGF0aWMgewogICAgICAgIGxldCByZXQgPSBhcHBseURlY3MoCiAgICAgICAgICB0aGlzLAogICAgICAgICAgWwogICAgICAgICAgICBbZGVjLCAwLCAnYSddLAogICAgICAgICAgICBbZGVjLCAwLCAnYScsIChpKSA9PiBpLiNhLCAoaSwgdikgPT4gaS4jYSA9IHZdLAogICAgICAgICAgICBbW2RlYywgZGVjMl0sIDEsICdiJ10sCiAgICAgICAgICAgIFtkZWMsIDEsICdiJywgKGkpID0+IGkuI3ByaXZCRGF0YSwgKGksIHYpID0+IGkuI3ByaXZCRGF0YSA9IHZdLAogICAgICAgICAgICBbZGVjLCAyLCAnYyddLAogICAgICAgICAgICBbZGVjLCAyLCAnYycsICgpID0+IGNvbnNvbGUubG9nKCdwcml2QycpXSwKICAgICAgICAgICAgW2RlYywgMywgJ2QnXSwKICAgICAgICAgICAgW2RlYywgMywgJ2QnLCAoKSA9PiBjb25zb2xlLmxvZygncHJpdkQnKV0sCiAgICAgICAgICAgIFtkZWMsIDQsICdlJ10sCiAgICAgICAgICAgIFtkZWMsIDQsICdlJywgKCkgPT4gY29uc29sZS5sb2coJ3ByaXZFJyldLAogICAgICAgICAgXSwKICAgICAgICAgIFsKICAgICAgICAgICAgZGVjCiAgICAgICAgICBdCiAgICAgICAgKQogIAogICAgICAgIGluaXRBID0gcmV0WzBdOwogIAogICAgICAgIGluaXRQcml2QSA9IHJldFsxXTsKICAKICAgICAgICBpbml0QiA9IHJldFsyXTsKICAKICAgICAgICBpbml0UHJpdkIgPSByZXRbM107CiAgICAgICAgZ2V0UHJpdkIgPSByZXRbNF07CiAgICAgICAgc2V0UHJpdkIgPSByZXRbNV07CiAgCiAgICAgICAgcHJpdkMgPSByZXRbNl07CiAgCiAgICAgICAgcHJpdkQgPSByZXRbN107CiAgCiAgICAgICAgcHJpdkUgPSByZXRbOF07CiAgCiAgICAgICAgaW5pdGlhbGl6ZUluc3RhbmNlID0gcmV0WzldOwogIAogICAgICAgIENsYXNzID0gcmV0WzEwXQogIAogICAgICAgIGluaXRpYWxpemVDbGFzcyA9IHJldFsxMV07CiAgICAgIH0KICAKICAgICAgYSA9IChpbml0aWFsaXplSW5zdGFuY2UodGhpcyksIGluaXRBKHRoaXMsIDEyMykpOwogIAogICAgICAjYSA9IGluaXRQcml2QSh0aGlzLCAxMjMpOwogIAogICAgICAjYkRhdGEgPSBpbml0Qih0aGlzLCAxMjMpOwogICAgICBnZXQgYigpIHsgcmV0dXJuIHRoaXMuI2JEYXRhIH0KICAgICAgc2V0IGIodikgeyB0aGlzLiNiRGF0YSA9IHYgfQogIAogICAgICAjcHJpdkJEYXRhID0gaW5pdFByaXZCKHRoaXMsIDEyMyk7CiAgICAgIGdldCAjYigpIHsgcmV0dXJuIGdldFByaXZCKHRoaXMpOyB9CiAgICAgIHNldCAjYih2KSB7IHNldFByaXZCKHRoaXMsIHYpOyB9CiAgCiAgICAgIGMoKSB7IGNvbnNvbGUubG9nKCdjJyk7IH0KICAKICAgICAgI2MoLi4uYXJncykgeyByZXR1cm4gcHJpdkModGhpcywgLi4uYXJncykgfQogIAogICAgICBnZXQgZCgpIHsgY29uc29sZS5sb2coJ2QnKTsgfQogIAogICAgICBnZXQgI2QoKSB7IHJldHVybiBwcml2RCh0aGlzKTsgfQogIAogICAgICBzZXQgZSh2KSB7IGNvbnNvbGUubG9nKCdlJyk7IH0KICAKICAgICAgc2V0ICNlKHYpIHsgcHJpdkUodGhpcywgdik7IH0KICAgIH0KICAKICAgIGluaXRpYWxpemVDbGFzcyhDbGFzcyk7CiAgICovCgogICAgcmV0dXJuIGZ1bmN0aW9uIGFwcGx5RGVjczIyMDNSKHRhcmdldENsYXNzLCBtZW1iZXJEZWNzLCBjbGFzc0RlY3MsIHBhcmVudENsYXNzKSB7CiAgICAgICAgaWYgKHBhcmVudENsYXNzICE9PSB2b2lkIDApIHsKICAgICAgICAgICAgdmFyIHBhcmVudE1ldGFkYXRhID0KICAgICAgICAgICAgICAgIHBhcmVudENsYXNzW1N5bWJvbC5tZXRhZGF0YSB8fCBTeW1ib2wuZm9yKCJTeW1ib2wubWV0YWRhdGEiKV07CiAgICAgICAgfQogICAgICAgIHZhciBtZXRhZGF0YSA9IE9iamVjdC5jcmVhdGUoCiAgICAgICAgICAgIHBhcmVudE1ldGFkYXRhID09PSB2b2lkIDAgPyBudWxsIDogcGFyZW50TWV0YWRhdGEKICAgICAgICApOwogICAgICAgIHZhciBlID0gYXBwbHlNZW1iZXJEZWNzKHRhcmdldENsYXNzLCBtZW1iZXJEZWNzLCBtZXRhZGF0YSk7CiAgICAgICAgaWYgKCFjbGFzc0RlY3MubGVuZ3RoKSBkZWZpbmVNZXRhZGF0YSh0YXJnZXRDbGFzcywgbWV0YWRhdGEpOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGU6IGUsCiAgICAgICAgICAgIC8vIExhemlseSBhcHBseSBjbGFzcyBkZWNvcmF0aW9ucyBzbyB0aGF0IG1lbWJlciBpbml0IGxvY2FscyBjYW4gYmUgcHJvcGVybHkgYm91bmQuCiAgICAgICAgICAgIGdldCBjKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGFwcGx5Q2xhc3NEZWNzKHRhcmdldENsYXNzLCBjbGFzc0RlY3MsIG1ldGFkYXRhKTsKICAgICAgICAgICAgfSwKICAgICAgICB9OwogICAgfTsKfQoKZnVuY3Rpb24gX2FwcGx5X2RlY3NfMjIwM19yKHRhcmdldENsYXNzLCBtZW1iZXJEZWNzLCBjbGFzc0RlY3MsIHBhcmVudENsYXNzKSB7CiAgICByZXR1cm4gKF9hcHBseV9kZWNzXzIyMDNfciA9IGFwcGx5RGVjczIyMDNSRmFjdG9yeSgpKSgKICAgICAgICB0YXJnZXRDbGFzcywKICAgICAgICBtZW1iZXJEZWNzLAogICAgICAgIGNsYXNzRGVjcywKICAgICAgICBwYXJlbnRDbGFzcwogICAgKTsKfQpmdW5jdGlvbiBfaWRlbnRpdHkoeCkgeyByZXR1cm4geDsgfQovKiBAbWluVmVyc2lvbiA3LjIyLjAgKi8KZnVuY3Rpb24gZGlzcG9zZV9TdXBwcmVzc2VkRXJyb3Ioc3VwcHJlc3NlZCwgZXJyb3IpIHsKICAgIGlmICh0eXBlb2YgU3VwcHJlc3NlZEVycm9yICE9PSAidW5kZWZpbmVkIikgewogICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZgogICAgICAgIGRpc3Bvc2VfU3VwcHJlc3NlZEVycm9yID0gU3VwcHJlc3NlZEVycm9yOwogICAgfSBlbHNlIHsKICAgICAgICBkaXNwb3NlX1N1cHByZXNzZWRFcnJvciA9IGZ1bmN0aW9uIFN1cHByZXNzZWRFcnJvcihzdXBwcmVzc2VkLCBlcnJvcikgewogICAgICAgICAgICB0aGlzLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkOwogICAgICAgICAgICB0aGlzLmVycm9yID0gZXJyb3I7CiAgICAgICAgICAgIHRoaXMuc3RhY2sgPSBuZXcgRXJyb3IoKS5zdGFjazsKICAgICAgICB9OwogICAgICAgIGRpc3Bvc2VfU3VwcHJlc3NlZEVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlLCB7CiAgICAgICAgICAgIGNvbnN0cnVjdG9yOiB7CiAgICAgICAgICAgICAgICB2YWx1ZTogZGlzcG9zZV9TdXBwcmVzc2VkRXJyb3IsCiAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSwKICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgfSwKICAgICAgICB9KTsKICAgIH0KICAgIHJldHVybiBuZXcgZGlzcG9zZV9TdXBwcmVzc2VkRXJyb3Ioc3VwcHJlc3NlZCwgZXJyb3IpOwp9CgpmdW5jdGlvbiBfZGlzcG9zZShzdGFjaywgZXJyb3IsIGhhc0Vycm9yKSB7CiAgICBmdW5jdGlvbiBuZXh0KCkgewogICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICB2YXIgciA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgICAgICAgdmFyIHAgPSByLmQuY2FsbChyLnYpOwogICAgICAgICAgICAgICAgaWYgKHIuYSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZShwKS50aGVuKG5leHQsIGVycik7CiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBlcnIoZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGhhc0Vycm9yKSB0aHJvdyBlcnJvcjsKICAgIH0KCiAgICBmdW5jdGlvbiBlcnIoZSkgewogICAgICAgIGVycm9yID0gaGFzRXJyb3IgPyBuZXcgZGlzcG9zZV9TdXBwcmVzc2VkRXJyb3IoZSwgZXJyb3IpIDogZTsKICAgICAgICBoYXNFcnJvciA9IHRydWU7CgogICAgICAgIHJldHVybiBuZXh0KCk7CiAgICB9CgogICAgcmV0dXJuIG5leHQoKTsKfWZ1bmN0aW9uIF91c2luZyhzdGFjaywgdmFsdWUsIGlzQXdhaXQpIHsKICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdm9pZCAwKSByZXR1cm4gdmFsdWU7CiAgICBpZiAoT2JqZWN0KHZhbHVlKSAhPT0gdmFsdWUpIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJ1c2luZyBkZWNsYXJhdGlvbnMgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIG9iamVjdHMsIGZ1bmN0aW9ucywgbnVsbCwgb3IgdW5kZWZpbmVkLiIpOwogICAgfQogICAgLy8gY29yZS1qcy1wdXJlIHVzZXMgU3ltYm9sLmZvciBmb3IgcG9seWZpbGxpbmcgd2VsbC1rbm93biBzeW1ib2xzCiAgICBpZiAoaXNBd2FpdCkgewogICAgICAgIHZhciBkaXNwb3NlID0KICAgICAgICAgICAgdmFsdWVbU3ltYm9sLmFzeW5jRGlzcG9zZSB8fCBTeW1ib2wuZm9yKCJTeW1ib2wuYXN5bmNEaXNwb3NlIildOwogICAgfQogICAgaWYgKGRpc3Bvc2UgPT09IG51bGwgfHwgZGlzcG9zZSA9PT0gdm9pZCAwKSB7CiAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5kaXNwb3NlIHx8IFN5bWJvbC5mb3IoIlN5bWJvbC5kaXNwb3NlIildOwogICAgfQogICAgaWYgKHR5cGVvZiBkaXNwb3NlICE9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgUHJvcGVydHkgW1N5bWJvbC5kaXNwb3NlXSBpcyBub3QgYSBmdW5jdGlvbi5gKTsKICAgIH0KICAgIHN0YWNrLnB1c2goeyB2OiB2YWx1ZSwgZDogZGlzcG9zZSwgYTogaXNBd2FpdCB9KTsKICAgIHJldHVybiB2YWx1ZTsKfWZ1bmN0aW9uIF91c2luZ19jdHgoKSB7CiAgICB2YXIgX2Rpc3Bvc2VTdXBwcmVzc2VkRXJyb3IgPQogICAgICAgIHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09ICJmdW5jdGlvbiIKICAgICAgICAgICAgPyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWYKICAgICAgICAgICAgU3VwcHJlc3NlZEVycm9yCiAgICAgICAgICAgIDogKGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCkgewogICAgICAgICAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcigpOwogICAgICAgICAgICAgICAgZXJyLm5hbWUgPSAiU3VwcHJlc3NlZEVycm9yIjsKICAgICAgICAgICAgICAgIGVyci5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZDsKICAgICAgICAgICAgICAgIGVyci5lcnJvciA9IGVycm9yOwogICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgfSksCiAgICAgICAgZW1wdHkgPSB7fSwKICAgICAgICBzdGFjayA9IFtdOwogICAgZnVuY3Rpb24gdXNpbmcoaXNBd2FpdCwgdmFsdWUpIHsKICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewogICAgICAgICAgICBpZiAoT2JqZWN0KHZhbHVlKSAhPT0gdmFsdWUpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgInVzaW5nIGRlY2xhcmF0aW9ucyBjYW4gb25seSBiZSB1c2VkIHdpdGggb2JqZWN0cywgZnVuY3Rpb25zLCBudWxsLCBvciB1bmRlZmluZWQuIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gY29yZS1qcy1wdXJlIHVzZXMgU3ltYm9sLmZvciBmb3IgcG9seWZpbGxpbmcgd2VsbC1rbm93biBzeW1ib2xzCiAgICAgICAgICAgIGlmIChpc0F3YWl0KSB7CiAgICAgICAgICAgICAgICB2YXIgZGlzcG9zZSA9CiAgICAgICAgICAgICAgICAgICAgdmFsdWVbU3ltYm9sLmFzeW5jRGlzcG9zZSB8fCBTeW1ib2wuZm9yKCJTeW1ib2wuYXN5bmNEaXNwb3NlIildOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChkaXNwb3NlID09IG51bGwpIHsKICAgICAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuZGlzcG9zZSB8fCBTeW1ib2wuZm9yKCJTeW1ib2wuZGlzcG9zZSIpXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodHlwZW9mIGRpc3Bvc2UgIT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFByb3BlcnR5IFtTeW1ib2wuZGlzcG9zZV0gaXMgbm90IGEgZnVuY3Rpb24uYCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhY2sucHVzaCh7IHY6IHZhbHVlLCBkOiBkaXNwb3NlLCBhOiBpc0F3YWl0IH0pOwogICAgICAgIH0gZWxzZSBpZiAoaXNBd2FpdCkgewogICAgICAgICAgICAvLyBwcm92aWRlIHRoZSBudWxsaXNoIGB2YWx1ZWAgYXMgYGRgIGZvciBtaW5pZmljYXRpb24gZ2FpbgogICAgICAgICAgICBzdGFjay5wdXNoKHsgZDogdmFsdWUsIGE6IGlzQXdhaXQgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB2YWx1ZTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgICAgLy8gZXJyb3IKICAgICAgICBlOiBlbXB0eSwKICAgICAgICAvLyB1c2luZwogICAgICAgIHU6IHVzaW5nLmJpbmQobnVsbCwgZmFsc2UpLAogICAgICAgIC8vIGF3YWl0IHVzaW5nCiAgICAgICAgYTogdXNpbmcuYmluZChudWxsLCB0cnVlKSwKICAgICAgICAvLyBkaXNwb3NlCiAgICAgICAgZDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgZXJyb3IgPSB0aGlzLmU7CgogICAgICAgICAgICBmdW5jdGlvbiBuZXh0KCkgewogICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11c2UtYmVmb3JlLWRlZmluZQogICAgICAgICAgICAgICAgd2hpbGUgKChyZXNvdXJjZSA9IHN0YWNrLnBvcCgpKSkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3Bvc2FsUmVzdWx0ID0gcmVzb3VyY2UuZCAmJiByZXNvdXJjZS5kLmNhbGwocmVzb3VyY2Uudik7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZS5hKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGRpc3Bvc2FsUmVzdWx0KS50aGVuKG5leHQsIGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnIoZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGVycm9yICE9PSBlbXB0eSkgdGhyb3cgZXJyb3I7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZ1bmN0aW9uIGVycihlKSB7CiAgICAgICAgICAgICAgICBlcnJvciA9IGVycm9yICE9PSBlbXB0eSA/IG5ldyBfZGlzcG9zZVN1cHByZXNzZWRFcnJvcihlcnJvciwgZSkgOiBlOwoKICAgICAgICAgICAgICAgIHJldHVybiBuZXh0KCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBuZXh0KCk7CiAgICAgICAgfSwKICAgIH07Cn1jYWxsZWQgZXhwZWN0IG9uIABa1hcAEQAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3N3Y19lY21hX2FzdC0xLjAuMC9zcmMvcGF0LnJzdNYXAFwAAAANAAAAFAAAAA8FAAAEAAAABAAAADcBAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9zd2NfZWNtYV90cmFuc2Zvcm1zX2Jhc2UtMS4wLjEvc3JjL2ZpeGVyLnJzAADw1hcAagAAAMQAAABAAAAA8NYXAGoAAACxAgAAFgAAAPDWFwBqAAAAFgQAACAAAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9pbmRleG1hcC0yLjQuMC9zcmMvbWFwL2NvcmUucnMAAACM1xcAXQAAAC0AAAAjAAAAaW5kZXggbm90IGZvdW5kAIzXFwBdAAAAOgAAAAoAAACM1xcAXQAAAFMBAAA9AAAAjNcXAF0AAAA7AgAANAAAAIzXFwBdAAAAPAIAADQAAACM1xcAXQAAALoBAAAsAAAAjNcXAF0AAACwAQAAIgAAAGFzc2VydGlvbiBmYWlsZWQ6IGluZGljZXMuY2FwYWNpdHkoKSAtIGluZGljZXMubGVuKCkgPj0gZW50cmllcy5sZW4oKS91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL2luZGV4bWFwLTIuNC4wL3NyYy9tYXAvY29yZS9yYXcucnMAALHYFwBhAAAADgAAAAUAAACM1xcAXQAAACUAAAAPAAAAAAAAAAwAAAAEAAAAEAUAABEFAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9zd2NfZWNtYV90cmFuc2Zvcm1zX2Jhc2UtMS4wLjEvc3JjL3Jlc29sdmVyL21vZC5ycwAAAEjZFwBxAAAAnQYAADYAAAASBQAAKAAAAAgAAAA1AQAAQ2xhc3NGblZhclVzaW5nVHNJbnRlcmZhY2VUc1R5cGVBbGlhc1RzRW51bVRzTW9kdWxlaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZGVzdHJ1Y3R1cmluZyBwYXR0ZXJuIGluc2lkZSBUc1BhcmFtZXRlclByb3BlcnR5AAAAD9oXAFoAAAC82xcAdAAAAD4BAAAhAAAAvNsXAHQAAAA8AwAADQAAAOAoGAAqAAAAvNsXAHQAAADLAwAAHQAAALzbFwB0AAAApgMAAEAAAABfa2V5vNsXAHQAAAA2BAAAUQAAALzbFwB0AAAAQAQAACcAAABfY3JlYXRlUmVxdWlyZV9fcmVxdWlyZWV4cG9ydHNjcmVhdGVSZXF1aXJldXJsAAC82xcAdAAAACwFAAAaAAAAvNsXAHQAAAAuBQAAGgAAAE9ubHkgYW1iaWVudCBtb2R1bGVzIGNhbiB1c2UgcXVvdGVkIG5hbWVzLgAAvNsXAHQAAADYBQAADgAAAG5vdCBpbXBsZW1lbnRlZABQ4BcAXgAAAE4MAAA+AAAAUOAXAF4AAABaDAAAPAAAAFDgFwBeAAAAOwwAACYAAAATBQAABAAAAAQAAAA3AQAAL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvc3djX2VjbWFfdHJhbnNmb3Jtc190eXBlc2NyaXB0LTEuMC4xL3NyYy90cmFuc2Zvcm0ucnO82xcAdAAAALoCAAA4AAAASW1wb3J0IGRlY2xhcmF0aW9ucyBpbiBhIG5hbWVzcGFjZSBjYW5ub3QgcmVmZXJlbmNlIGEgbW9kdWxlLkVTTS1zdHlsZSBtb2R1bGUgZGVjbGFyYXRpb25zIGFyZSBub3QgcGVybWl0dGVkIGluIGEgbmFtZXNwYWNlLkltcG9ydCBhc3NpZ25tZW50IGNhbm5vdCBiZSB1c2VkIHdoZW4gdGFyZ2V0aW5nIEVDTUFTY3JpcHQgbW9kdWxlcy4gQ29uc2lkZXIgdXNpbmcgYGltcG9ydCAqIGFzIG5zIGZyb20gIm1vZCJgLCBgaW1wb3J0IHthfSBmcm9tICJtb2QiYCwgYGltcG9ydCBkIGZyb20gIm1vZCJgLCBvciBhbm90aGVyIG1vZHVsZSBmb3JtYXQgaW5zdGVhZC5FeHBvcnQgYXNzaWdubWVudCBjYW5ub3QgYmUgdXNlZCB3aGVuIHRhcmdldGluZyBFQ01BU2NyaXB0IG1vZHVsZXMuIENvbnNpZGVyIHVzaW5nIGBleHBvcnQgZGVmYXVsdGAgb3IgYW5vdGhlciBtb2R1bGUgZm9ybWF0IGluc3RlYWQuL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvc3djX2VjbWFfdHJhbnNmb3Jtc190eXBlc2NyaXB0LTEuMC4xL3NyYy90eXBlc2NyaXB0LnJzAALeFwB1AAAAQQAAACwAAAAXAwAADAAAAAQAAABXAwAAWAMAAB8EAEGovd8AC5YDAQAAABsDAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9zd2NfZWNtYV90cmFuc2Zvcm1zX3R5cGVzY3JpcHQtMS4wLjEvc3JjL3RzX2VudW0ucnNOYU4AAACw3hcAcgAAAK8AAAASAAAAsN4XAHIAAADZAAAAGgAAABQFAAAEAAAABAAAADcBAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9zd2NfZWNtYV90cmFuc2Zvcm1zX3R5cGVzY3JpcHQtMS4wLjEvc3JjL3N0cmlwX3R5cGUucnMAAABY3xcAdQAAAMkAAAApAAAAc3RydWN0IENvbmZpZ2VudW0gVHNJbXBvcnRFeHBvcnRBc3NpZ25Db25maWdlbnVtIEltcG9ydHNOb3RVc2VkQXNWYWx1ZXMAHgQAAAwAAAAEAAAAVwMAAFgDAAAfBABByMDfAAv6AwEAAAAbAwAAL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvc3djX2VjbWFfdXRpbHMtMS4wLjEvc3JjL2xpYi5yc18AAQAAAAAAAACu4BcAAQAAAHN1cGVyXwAAwOAXAAYAAACu4BcAAQAAAGNhcGFjaXR5IG92ZXJmbG93AAAA2OAXABEAAAAvcnVzdGMvNTVhMjJkMmE2MzMzNGUwZmFmZjAyMDJiNzJhMzFjZTgzMmI1NjEyNS9saWJyYXJ5L2FsbG9jL3NyYy92ZWMvc3BlY19mcm9tX2l0ZXJfbmVzdGVkLnJzAAD04BcAXgAAADkAAAASAAAA3CsYAEwAAACxDQAADQAAANwrGABMAAAADgoAACQAAAAAAAAADAAAAAQAAAAVBQAAFgUAAGNvbnN0cnVjdG9yIHNob3VsZCBoYXZlIGEgYm9keS91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3N3Y19lY21hX3V0aWxzLTEuMC4xL3NyYy9jb25zdHJ1Y3Rvci5yc7bhFwBmAAAADgAAACAAAAAeBAAADAAAAAQAAABXAwAANQQAAB8EAEHMxN8AC/oHAQAAABsDAADoExgAAQAAAOgTGAABAAAA6BMYAAEAAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9taWV0dGUtNy4yLjAvc3JjL2hhbmRsZXJzL2dyYXBoaWNhbC5ycyAgANHiFwACAAAA6BMYAAEAAAABAAAAAAAAAHIzGAABAAAA0eIXAAIAAAABAAAAAAAAAAEAAAAAAAAA6BMYAAEAAAAgICAA0eIXAAIAAAAU4xcAAwAAACAgaGVscDogKOMXAAgAAAAgICAg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AGkAAAA2AAAAHAAAAKgQGABpAAAAUQAAABoAAACoEBgAaQAAAGsAAAAVAAAAqBAYAGkAAAA9AAAAGgAAAKgQGABpAAAARQAAABoAAACoEBgAaQAAAE0AAAAaAAAAaWRlbnRpZmllciwgc3RyaW5nIGxpdGVyYWwsIG51bWVyaWMgbGl0ZXJhbCBvciBbIGZvciB0aGUgY29tcHV0ZWQga2V5AAAAqBAYAGkAAAByAAAAFgAAABcDAAAMAAAABAAAAFcDAAA7BAAAHwQAQbim4AAL6g4BAAAAGwMAAElkZW50QXJyYXlSZXN0T2JqZWN0QXNzaWduSW52YWxpZEV4cHIAAAAAAAAABAAAAAAAAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9zd2NfZWNtYV9jb2RlZ2VuLTEuMC4wL3NyYy90ZXh0X3dyaXRlci9iYXNpY19pbXBsLnJzOyB2YXJsZXRjb25zdCshfnR5cGVvZnZvaWRkZWxldGU9Kz0tPSo9Lz0lPTw8PT4+PT4+Pj18PV49Jj0qKj0mJj18fD0/Pz09PSE9PT09IT09PDw9Pj49PDw+Pj4+PiovJXxeJnx8JiZpbmluc3RhbmNlb2YqKj8/KystLS91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy91dGlsL2l0ZXIucnN1bmV4cGVjdGVkIHJlZ2V4IGZpbmQgZXJyb3I6IAp0byBoYW5kbGUgZmluZCBlcnJvcnMsIHVzZSAndHJ5JyBvciAnc2VhcmNoJyBtZXRob2RzAAAAxxQYAB0AAADkFBgANQAAAGMUGABkAAAAfgEAABkAAABAHxgAZAAAAF4CAAAcAAAAQB8YAGQAAABrAgAAMgAAAAIAAABAHxgAZAAAAAEDAAAVAAAAL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL3V0aWwvc2VhcmNoLnJzaW52YWxpZCBzcGFuICBmb3IgaGF5c3RhY2sgb2YgbGVuZ3RoIADWFRgADQAAAOMVGAAYAAAAcBUYAGYAAACqAQAACQAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3N3Y19lY21hX2NvZGVnZW4tMS4wLjAvc3JjL3R5cGVzY3JpcHQucnNhcyg9Pnt9ZGVjbGFyZW5hbWVzcGFjZWAAHBYYAGcAAAC2AQAAIgAAACR7AAAcFhgAZwAAALkBAAAhAAAAZXh0ZW5kcz86ZW51bS4uLltdaW5mZXJyZWFkb25seW91dGltcG9ydC5tb2R1bGVnbG9iYWxhbnl1bmtub3dubnVtYmVyb2JqZWN0Ym9vbGVhbmJpZ2ludHN0cmluZ3N5bWJvbHVuZGVmaW5lZG51bGxuZXZlcmludHJpbnNpY2tleW9mdW5pcXVlaW50ZXJmYWNlZXhwb3J0c2F0aXNmaWVzYXNzZXJ0c2lzdHlwZWFic3RyYWN0bmV3Z2V0c2V0cmVxdWlyZQB0ExgAcwAAAHEAAAAaAAAAL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvc3djX2VjbWFfY29kZWdlbi0xLjAuMC9zcmMvbGliLnJzmBcYAGAAAADiBwAALwAAAJgXGABgAAAA3AcAADAAAABzdXBlcmRlZmVyLGZyb213aXRoYXNzZXJ0YXNzZXJ0aW9uIGZhaWxlZDogbi5zcGVjaWZpZXJzLmxlbigpIDw9IDIAAJgXGABgAAAAaAEAABUAAAAjIQAAmBcYAGAAAABrDgAAEgAAAG4tMHiBGBgAAwAAADB4AACMGBgAAgAAAGZ1bmN0aW9uYXN5bmNpZmVsc2U8aW52YWxpZD51c2Ugc3RyaWN0PCEtLVx4M2MhLS0tLT4tLVx4M2UAAJgXGABgAAAAugcAACIAAACYFxgAYAAAAL0HAAAhAAAAZm9ydHJ5ZmluYWxseUA/LmF3YWl0YnJlYWtjbGFzc3Rocm93d2hpbGV5aWVsZG9mcmV0dXJuY2FzZWRlZmF1bHQAAACYFxgAYAAAAHgNAAAaAAAAmBcYAGAAAAB7DQAAOwAAAHN3aXRjaGNhdGNoI3B1YmxpY3Byb3RlY3RlZHByaXZhdGVhY2Nlc3NvcmNvbnRpbnVlZGVidWdnZXJkb2ltcGxlbWVudHNuZXcudGFyZ2V0aW1wb3J0Lm1ldGFub3QgaW1wbGVtZW50ZWQ6IGNvZGVnZW4gb2YgYGV4cG9ydCBkZWZhdWx0IGZyb20gJ2Zvbyc7YACzGRgAOAAAAJgXGABgAAAAtgEAABEAAACYFxgAYAAAAOACAAA0AAAASW5maW5pdHllY29uc3RydWN0b3KYFxgAYAAAAB0KAABIAAAAmBcYAGAAAAAeCgAAKAAAAJgXGABgAAAABggAAEwAAACYFxgAYAAAAAkIAAAnAAAAZmFsc2V0cnVlPC88Lz48PnVzaW5nLy8vKiovI19fUFVSRV9fFwMAAAwAAAAEAAAAVwMAAA0EAAAfBABBrLXgAAseAQAAABsDAAAXAwAADAAAAAQAAABXAwAAWAMAAB8EAEHUteAAC/0FAQAAABsDAABhIERpc3BsYXkgaW1wbGVtZW50YXRpb24gcmV0dXJuZWQgYW4gZXJyb3IgdW5leHBlY3RlZGx5L3J1c3RjLzU1YTIyZDJhNjMzMzRlMGZhZmYwMjAyYjcyYTMxY2U4MzJiNTYxMjUvbGlicmFyeS9hbGxvYy9zcmMvc3RyaW5nLnJzAAATGxgASwAAAG8KAAAOAAAAQAUAAAgAAAAEAAAAQQUAAEIFAAAEAAAABAAAAEMFAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9zd2NfZmFzdF90c19zdHJpcC0xLjAuMC9zcmMvbGliLnJzAAAARAUAAAgAAAAEAAAARQUAAEYFAABHBQAASAUAAEkFAABKBQAASwUAAEwFAABNBQAATgUAAE8FAABQBQAAUQUAAFIFAABmYWlsZWQgdG8gcGFyc2UAOBwYAA8AAACQGxgAYQAAAMQAAABJAAAAkBsYAGEAAAAJAQAAFQAAAJAbGABhAAAA3AAAACUAAACQGxgAYQAAAOsAAAAlAAAAkBsYAGEAAADvAAAAJQAAAJAbGABhAAAA8AAAACUAAACQGxgAYQAAAPQAAAAlAAAAkBsYAGEAAAD1AAAAJQAAAJAbGABhAAAA9gAAACUAAACQGxgAYQAAAPwAAAAlAAAAkBsYAGEAAAD+AAAAJQAAAJAbGABhAAAA/wAAACUAAACQGxgAYQAAAAABAAAlAAAAkBsYAGEAAABHAQAAMAAAAGdlbmVyYXRlZCBjb2RlIHdhcyBub3QgdXRmLThmYWlsZWQgdG8gd3JpdGUgc291cmNlIG1hcHNvdXJjZSBtYXAgd2FzIG5vdCB1dGY4AAAAkBsYAGEAAACAAQAAEgAAAJAbGABhAAAAjAEAABUAAACQGxgAYQAAAJgBAAAVAAAAkBsYAGEAAACmAQAAGQAAAJAbGABhAAAAsgEAABkAAAAPAEHou+AAC3HQHRgAkBsYAGEAAADWAQAAGQAAAJAbGABhAAAA4AEAAEAAAACQGxgAYQAAAOQBAAAkAAAAb3ZlcnJpZGUcHhgACAAAAJAbGABhAAAAGgIAADwAAACQGxgAYQAAAE8CAAAYAAAAc3RhdGljAAAAAAAAEABB8LzgAAvxJHRoaXOQGxgAYQAAAFEEAAAkAAAAc3RydWN0IE9wdGlvbnN2YXJpYW50IGlkZW50aWZpZXJlbnVtIE1vZGUvcnVzdGMvNTVhMjJkMmE2MzMzNGUwZmFmZjAyMDJiNzJhMzFjZTgzMmI1NjEyNS9saWJyYXJ5L2NvcmUvc3JjL3NsaWNlL3NvcnQvc3RhYmxlL3F1aWNrc29ydC5yc21pZCA+IGxlbgAAAAwfGAAJAAAArR4YAF8AAABMAAAAHwAAAK0eGABfAAAARgAAABcAAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvdXRpbC9wb29sLnJzQB8YAGQAAAA9AgAAHAAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IE1vZHVsZSBpcyBoYW5kbGVkIGFib3ZlAAAAtB8YAEEAAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9zd2NfZWNtYV9wYXJzZXItMS4wLjEvc3JjL3BhcnNlci9tb2QucnMAAAAgGABmAAAAsAAAADIAAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9zd2NfZWNtYV9wYXJzZXItMS4wLjEvc3JjL3BhcnNlci9wYXQucnMAAHggGABmAAAAmgIAACoAAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9zd2NfZWNtYV9wYXJzZXItMS4wLjEvc3JjL3BhcnNlci9leHByLnJzAPAgGABnAAAApwMAABoAAABTBQAAVAUAAFUFAABWBQAAVwUAAFgFAABZBQAAWgUAAFsFAABcBQAAL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvc3djX2VjbWFfcGFyc2VyLTEuMC4xL3NyYy9wYXJzZXIvaW5wdXQucnOQIRgAaAAAAMcAAAArAAAAL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvc3djX2VjbWFfcGFyc2VyLTEuMC4xL3NyYy9sZXhlci9zdGF0ZS5ycwAIIhgAZwAAAH8AAAAuAAAACCIYAGcAAACAAAAAOAAAAAgiGABnAAAAgQAAABkAAACQIRgAaAAAAK0BAAAnAAAAkCEYAGgAAACzAQAAIwAAADxlb2Y+UmVmQ2VsbHZhbHVlPGJvcnJvd2VkPgDRIhgACgAAAC9ydXN0Yy81NWEyMmQyYTYzMzM0ZTBmYWZmMDIwMmI3MmEzMWNlODMyYjU2MTI1L2xpYnJhcnkvY29yZS9zcmMvc2xpY2Uvc29ydC9zdGFibGUvZHJpZnQucnMA5CIYAFsAAAD/AAAAGQAAAOQiGABbAAAA8gAAABIAAADkIhgAWwAAAM4AAAAkAAAA5CIYAFsAAADRAAAAJAAAAOQiGABbAAAAQAAAACIAAAAgICAgZXZhbEhhc2ggdGFibGUgY2FwYWNpdHkgb3ZlcmZsb3eYIxgAHAAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL2hhc2hicm93bi0wLjE0LjUvc3JjL3Jhdy9tb2QucnMAALwjGABeAAAAVgAAACgAAABkZXNjcmlwdGlvbigpIGlzIGRlcHJlY2F0ZWQ7IHVzZSBEaXNwbGF5XQUAAAwAAAAEAAAAXgUAAF0FAAAMAAAABAAAAKkCAABeBQAAVCQYAB4DAABfBQAAugIAAGAFAABFAAAASW9VdGY4QmFkSnNvblZscUxlZnRvdmVyVmxxTm9WYWx1ZXNWbHFPdmVyZmxvd0JhZFNlZ21lbnRTaXplQmFkU291cmNlUmVmZXJlbmNlQmFkTmFtZVJlZmVyZW5jZUluY29tcGF0aWJsZVNvdXJjZU1hcEludmFsaWREYXRhVXJsQ2Fubm90RmxhdHRlbkludmFsaWRSYW1CdW5kbGVNYWdpY0ludmFsaWRSYW1CdW5kbGVJbmRleEludmFsaWRSYW1CdW5kbGVFbnRyeU5vdEFSYW1CdW5kbGVJbnZhbGlkUmFuZ2VNYXBwaW5nSW5kZXhJbnZhbGlkQmFzZTY0AEAFAAAIAAAABAAAAGEFAABABQAACAAAAAQAAABBBQAAYQUAAJAlGABiBQAAYwUAAGQFAABlBQAARQAAAAAAAAAIAAAABAAAAGYFAAAAAAAACAAAAAQAAADYAgAAZgUAAMwlGAAeAwAAZwUAAGgFAAAeAwAARQAAAGkFAAAEAAAABAAAAGoFAABpBQAABAAAAAQAAABrBQAAagUAAAgmGABsBQAAbQUAALoCAABuBQAARQAAAAAAAAAEAAAABAAAAC0AAABVdGY4RXJyb3J2YWxpZF91cF90b2Vycm9yX2xlbkZyb21VdGY4RXJyb3JieXRlc2Vycm9yaW52YWxpZCB1dGYtODogY29ycnVwdCBjb250ZW50c2ludmFsaWQgdXRmLThvBQAAFAAAAAQAAABwBQAAbwUAABQAAAAEAAAAcQUAAHAFAAC0JhgAcgUAAHMFAAC6AgAAcgUAAEUAAAB0BQAAHAAAAAQAAAB1BQAAdAUAABwAAAAEAAAAdgUAAHUFAADwJhgAdwUAAHgFAAC6AgAAdwUAAEUAAAB5BQAAOAAAAAQAAAC+AgAAeQUAADgAAAAEAAAAvwIAAL4CAAAsJxgAwAIAAHoFAADCAgAAwAIAAMMCAAB7BQAAMAAAAAQAAAC+AgAAewUAADAAAAAEAAAAvwIAAL4CAABoJxgAwAIAAHwFAADCAgAAwAIAAMMCAABFcnJvcmNvbnRleHRzb3VyY2UAAEUDAAAUAAAABAAAAH0FAABFAwAAFAAAAAQAAACqAgAAfQUAALgnGAAeAwAAfgUAAH8FAAAeAwAARQAAAFRva2VuQW5kU3BhbnRva2VuaGFkX2xpbmVfYnJlYWtzcGFuAAAAAAAMAAAABAAAAIAFAACBBQAAY2Fubm90IGFjY2VzcyBhIHNjb3BlZCB0aHJlYWQgbG9jYWwgdmFyaWFibGUgd2l0aG91dCBjYWxsaW5nIGBzZXRgIGZpcnN0L3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvc2NvcGVkLXRscy0xLjAuMS9zcmMvbGliLnJzAAB0KBgAWgAAAKgAAAAJAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogIGlzIGFscmVhZHkgcmVuYW1lZCB0byAsIGJ1dCBpdCdzIHJlbmFtZWQgYXMgAOAoGAAqAAAACikYABcAAAAhKRgAFgAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3N3Y19lY21hX3RyYW5zZm9ybXNfYmFzZS0xLjAuMS9zcmMvcmVuYW1lL21vZC5ycwBQKRgAbwAAAM0AAAAZAAAARAUAAAgAAAAEAAAARQUAAEYFAABHBQAASAUAAEkFAABKBQAASwUAAEwFAABNBQAATgUAAE8FAABQBQAAUQUAAFIFAABUeXBlU2NyaXB0IGV4cG9ydCBhc3NpZ25tZW50IGlzIG5vdCBzdXBwb3J0ZWQgaW4gc3RyaXAtb25seSBtb2RlVHlwZVNjcmlwdCBpbXBvcnQgZXF1YWxzIGRlY2xhcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gc3RyaXAtb25seSBtb2RlVHlwZVNjcmlwdCBlbnVtIGlzIG5vdCBzdXBwb3J0ZWQgaW4gc3RyaXAtb25seSBtb2RlVHlwZVNjcmlwdCBuYW1lc3BhY2UgZGVjbGFyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBpbiBzdHJpcC1vbmx5IG1vZGVUeXBlU2NyaXB0IHBhcmFtZXRlciBwcm9wZXJ0eSBpcyBub3Qgc3VwcG9ydGVkIGluIHN0cmlwLW9ubHkgbW9kZVRoZSBhbmdsZS1icmFja2V0IHN5bnRheCBmb3IgdHlwZSBhc3NlcnRpb25zLCBgPFQ+ZXhwcmAsIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdHlwZSBzdHJpcCBtb2RlLiBJbnN0ZWFkLCB1c2UgdGhlICdhcycgc3ludGF4OiBgZXhwciBhcyBUYC4vcnVzdGMvNTVhMjJkMmE2MzMzNGUwZmFmZjAyMDJiNzJhMzFjZTgzMmI1NjEyNS9saWJyYXJ5L2FsbG9jL3NyYy92ZWMvbW9kLnJz3CsYAEwAAACVBwAADQAAANwsGABaAAAAKwEAACkAAADcLBgAWgAAADoBAAAlAAAAL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvdW5pY29kZS13aWR0aC0wLjEuMTMvc3JjL3RhYmxlcy5ycwAAAFgsGABhAAAAJwAAABkAAABYLBgAYQAAAC0AAAAdAAAAL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvdGV4dHdyYXAtMC4xNi4xL3NyYy9jb3JlLnJzAADcLBgAWgAAAAwBAAAeAAAA1DQYAGQAAADBAAAAKAAAANQ0GABkAAAAwwAAACUAAADUNBgAZAAAAMQAAAAvAAAALQAAANQ0GABkAAAAzgAAACUAAADUNBgAZAAAAM8AAAAvAAAAAAAAABwAAAAEAAAAggUAAIMFAACEBQAAhQUAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3RleHR3cmFwLTAuMTYuMS9zcmMvd29yZF9zZXBhcmF0b3JzLnJzAAAAuC0YAGUAAADcAAAAKAAAALgtGABlAAAA0gAAACwAAACGBQAALAAAAAQAAACHBQAAgwUAAIgFAACJBQAAuC0YAGUAAAAWAQAAHAAAALgtGABlAAAANQEAACgAAAC4LRgAZQAAAC4BAAAsAAAAL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvc21hd2stMC4zLjIvc3JjL2xpYi5ycwAAAIwuGABVAAAAHgEAABsAAACMLhgAVQAAACIBAAAUAAAAjC4YAFUAAAAiAQAADQAAAIwuGABVAAAAIAEAABEAAACMLhgAVQAAACwBAAAJAAAAjC4YAFUAAAAnAQAAFwAAAIwuGABVAAAACAEAABwAAACMLhgAVQAAAAgBAAAvAAAAKGksIGopIG5vdCBhYm92ZSBkaWFnb25hbDogKCwgAABkLxgAHAAAAIAvGAACAAAA8MsYAAEAAACMLhgAVQAAAIYBAAAUAAAAKGksIGopIG91dCBvZiBib3VuZHM6ICgpLCBzaXplOiCsLxgAFwAAAIAvGAACAAAAwy8YAAkAAACMLhgAVQAAAIcBAAAZAAAAjC4YAFUAAACSAQAADAAAAIwuGABVAAAAkgEAACoAAACMLhgAVQAAAIgBAAATAAAAjC4YAFUAAAB1AQAAIQAAAIwuGABVAAAAdgEAABkAAACMLhgAVQAAAHkBAAAlAAAAjC4YAFUAAAB6AQAAGwAAAIwuGABVAAAAcwEAACEAAADoNRgAcQAAAEsBAAAgAAAA6DUYAHEAAABLAQAALAAAAOg1GABxAAAASwEAADIAAADoNRgAcQAAAFMBAAAYAAAAczQYAE8AAADIBQAAFAAAAHM0GABPAAAAyAUAACEAAABzNBgATwAAALwFAAAhAEHs4eAAC5UFAQAAAIoFAABjYWxsZWQgYFJlc3VsdDo6dW53cmFwKClgIG9uIGFuIGBFcnJgIHZhbHVlAHM0GABPAAAATAQAACQAAAA8MhgAZQAAALkAAABGAAAAL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvdGV4dHdyYXAtMC4xNi4xL3NyYy93cmFwLnJzAABAMRgAWgAAABcBAAAYAAAAT3ZlcmZsb3dFcnJvcmludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGUvcnVzdGMvNTVhMjJkMmE2MzMzNGUwZmFmZjAyMDJiNzJhMzFjZTgzMmI1NjEyNS9saWJyYXJ5L2FsbG9jL3NyYy9ib3Jyb3cucnPhMRgASwAAABcBAAAlAAAAL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvdGV4dHdyYXAtMC4xNi4xL3NyYy93cmFwX2FsZ29yaXRobXMucnMAAAA8MhgAZQAAAHEBAAAaAAAAPDIYAGUAAABrAQAAIgAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3VuaWNvZGUtbGluZWJyZWFrLTAuMS41L3NyYy9saWIucnMAAADEMhgAYQAAAGEAAAAXAAAAxDIYAGEAAAA1AAAAGAAAAMQyGABhAAAAOQAAABoAAADEMhgAYQAAAD4AAAAFAAAATm9uZVNvbWUNCgoCAgICAgICAgIDAwEBAQBBk+fgAAsQAQAAAAAAAAACAgAAAAAAAgBB0ufgAAsBAgBB+OfgAAsBAQBBk+jgAAsBAQBB8+jgAAvRBy9ydXN0Yy81NWEyMmQyYTYzMzM0ZTBmYWZmMDIwMmI3MmEzMWNlODMyYjU2MTI1L2xpYnJhcnkvY29yZS9zcmMvc3RyL3BhdHRlcm4ucnMAAHM0GABPAAAAvgEAADcAAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi90ZXh0d3JhcC0wLjE2LjEvc3JjL3dvcmRfc3BsaXR0ZXJzLnJz1DQYAGQAAACZAAAAJAAAANQ0GABkAAAAmgAAACQAAAAvcnVzdGMvNTVhMjJkMmE2MzMzNGUwZmFmZjAyMDJiNzJhMzFjZTgzMmI1NjEyNS9saWJyYXJ5L2NvcmUvc3JjL3NsaWNlL21vZC5ycwAAAFg1GABNAAAA4QMAACEAAABYNRgATQAAAOEDAAAuAAAAWDUYAE0AAADlAwAAIAAAAFg1GABNAAAA5QMAACsAAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi90ZXh0d3JhcC0wLjE2LjEvc3JjL3dyYXBfYWxnb3JpdGhtcy9vcHRpbWFsX2ZpdC5ycwAAAOg1GABxAAAArgAAACEAAADoNRgAcQAAALQAAAAbAAAA6DUYAHEAAAC0AAAAIwAAAOg1GABxAAAArwAAACkAAADoNRgAcQAAALAAAAAsAAAA6DUYAHEAAACxAAAAHwAAAOg1GABxAAAAewEAABoAAADoNRgAcQAAAHwBAAAeAAAAL3J1c3RjLzU1YTIyZDJhNjMzMzRlMGZhZmYwMjAyYjcyYTMxY2U4MzJiNTYxMjUvbGlicmFyeS9hbGxvYy9zcmMvc3luYy5ycwAAAAEAAAAAAAAATGF6eSBpbnN0YW5jZSBoYXMgcHJldmlvdXNseSBiZWVuIHBvaXNvbmVkAAAwNxgAKgAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL29uY2VfY2VsbC0xLjE5LjAvc3JjL2xpYi5ycwAAZDcYAFoAAAAfBQAAGQAAAP////8AAAAABAsPExcbHyMnLTE0ODxAAkUAAAAAAEkATQAFBQUFBQUFBQUFBQUGBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBVFUWFwFBQUFBQUFBQUFBQUFBQUFBQUFBQUJAEHU8OAACygBYChkaGxwK3R2en6ChoqOkpacoAUypAAAAACXBQWmAAAAAAAAAAWsAEGM8eAACxMFrwCzBQUFBQUFBQUFBQVDBQW3AEGv8eAACwiaUrkAAAAAvABBwvHgAAuaAsTGAAAArczQ1LrYAADcAAAAAAAAAAAFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBd4FBQUFBQUF3+EFBQUFBQUFBQUF5AUFBQUFBQUFBQUFBQXiBecAAAAABekAAAUFBQUFBQUFBeUFBQUFBQUF6wAAAAAAAAgNERUZHSElKi8xNjo+QgJHAAAAAABLAE8ABQUFBQUFBQUFBQUFBgUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVRVlpeBQUFBQUFBQUFBQUFBQUFBQUFBQUFCQBB7PPgAAsoAWIoZmpucit0eHyAhIiMkJSZnqIFMqQAAAAAlwUFqQAAAAAAAAAFrABBpPTgAAsTBbEAtQUFBQUFBQUFBQUFQwUFtwBBx/TgAAu7AZpSuQAAAAC/AAAAAAAAAACnqsLEyADKAK3O0ta62gAA3AAAAAAAvQAABQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXeBQUFBQUFBd/hBQUFBQUFBQUFBeQFBQUFBQUFBQUFBQUF4gXnAAAAAAXpAAAFBQUFBQUFBQXlBQUFBQUFBesAQfCA4QALAcAAQcCB4QALQP////////////////////////////////////////////8/P/////8/P/+q////P////////99f3B/PD/8f3B8AQZWC4QALYwQgBP//f////3///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wBBlYPhAAtpBKAE//9/////f///////////////////////////////////////////////////////////////////////DwD//3/4//////8P////////////////////////////////w/8DAB9QAEGOhOEAC4QG37xA1///+////////////7//////////////////////////////////w/8DAB9QAAD//////////////////9+8wNf///v///////////+///////////////////////8D/P///////////////////////////v///38C//////8BAAAAAAAAAAD///+HBwD/////////////////////+/z///////////////////////////7///9/Av//////Af7/////v7YA////hwcAAAAAAP//////BwAAAMD+//////////////8vAGDAAJwAAP3///8AAADg/////////////z8AAgAA/P///wcwBAAA/wf////////////D////////////////75///f+fAAD/////////5////////////////wMA////////PyT//z8EEAEAAP///wH/B////34AAP//////AwAAAAAAAPD///////8jAAAB/wMA/v/hn/n///3FIwBAALADAAMQ//////8/AAD///8P/wf///9+AP////////////v////////////////////P//7/75/5///9xfOfeYCwz/8DUOCH+f///W0DAAAAXgAAHADgv/v///3tIwAAAQADAAAC4J/5///97SMAAACwAwACAOjHPdYYx/8DAAABAAAAAADuh/n///1t04c5Al7A/z8A7r/7///97fO/OwEAz/8A/u6f+f///e3znzngsM//AgDsxz3WGMf/w8c9gQDA/wAA4N/9///9/yMAAAAnAwAAAOHf/f///e8jAAAAYAMABgDw3/3/////JwBAcIADAAD84P9//P//+y9/AAAAAAAAAP/f/f///f/z3z1gJ8//AADv3/3///3v8989YGDP/w4A/9/9///////fffCAz/8A/O7/f/z///svf4Rf/8D/DAD+//////8NAH8AAAAAAAAA1vf//6//DSBfAADwAAAAAAEAAAAAAAAA//7///8fAAAAHwBBoIrhAAvUA/7///////8H/3//AwAAAADW9///r///P19///MAAAAAAQAAA/8DoML//v///x/+/9////7///8fQAAAAAAAAAD//////wcAgAAAPzxiwOH/A0AAAP////+/IP//////9////////////////////////////////////////////////////z8AAP///////////P///////wAAAAAA/w////////////8D////////////P/////+/IP//////9///////////////////////////////////////////////////fwD//z8A/wAAAL////////0HAAAAAAAAAAD///////////89fz3//////z3/////PX89/3//////////Pf//////////BwAAAAD//wAA/////////////z8/////////////PX89//////89/////z1/Pf9//////////z3//////////+cA/gMA//8AAP////////////8/P/7/////////////////////////////////////////////////////////////////////////////////////////////////////////////AwBBgI7hAAuLAv////////////////+f///+//8H////////////x/8B//8DgP//AwD//wMA/98BAP///////w8AAACAEAAAAAD/////////////////n////v//B////////////8f/Af//P4D//x8A//8PAP/fDQD/////////////jzD/AwAAAAAAAP//////////////Af//////Bf//////////PwD///9/AAAAAAAA////Px8A//////8P////AwAAAAAAAAC4/wP//////////////wH//////wf//////////z8A////f/8P/w/A/////z8fAP//////D////wP/BwAAAAD//38A////////HwBBlJDhAAsBgABBoJDhAAv/AeD//////w8A4B8AAAAAAAD4////AcAA/P////8/AAAA////D/////////9/////n/8D/wOAAP+//38AAAAAAAD///////////8f/wMA+A8A//////////////////8PAP////8PAAAAAOAA/P///z//Af//////5wAAAAAA3m8E////////////////////////////////AAAAAAAAAAD/////////AP/j//////8//wH//////+cAAPf/////B////////////////////////////////////////////////////////////////////////////////////wBBrpLhAAsGAoAAAP8fAEHAkuEACxKE/C8/UP3/8+BDAAD//////wEAQeGS4QALMTAAAAAAAIABABAAAAACgAAA/x8AAAAAAAD/H+L/AQCE/C8/UP3/8+BDAAD//////wEAQaCT4QAL4Ab/////////////////////////////////////H3gMAP////+/IP////////+AAAD//38Af39/f39/f38AAAAA/////////////////////////////////////x/4DwD/////vyD/////////gACA//9/AH9/f39/f39//////+AAAAD+Az4f/v///////////3/4/v/////////////34P///////v////////////9/AAD/////AAAAAAAA///gAAAA/v8+H/7///////////9//v7/////////////9+D///////7/////////////fwAA/////wAAAAAAAP////////////////////////8fAAAAAAAAAAD//////z////////////////////////////////////////////////8HAAQAAAAnAPAA/////////////////////////x///wAMAAD//////38AgP///z//////////////AAAAAID//P////////////////n/////////B+sDAAD8//8f////DwAA////////8L///////////////////wMAAACA//z////////////////5/////////wfrAwAA/P+79///BwAAAP///////w8A/P//////DwAAAAAAAAD8aAD8//8/AP//fwAAAP///x/w//////8HAACAAADf/wB8//////8QAAD///////8PAP//////////PwD/A////+j//////z//////DwD///8f//////////8BgP8D////f///////AQAA9w8AAP//f8T///////9iPgUAADj/BxwAfn5+AH9////////3/wP//////////////////wcAAAD///////9/AP8//wP//3/8//////////8HAAA4//98AH5+fgB/f///////9/8D////////////////////N/8D/////////////////z//////////////////AwAAAAB/APig//1/X9v/////////////////AwAAAPj///////////////////////8//////////////////wMAAAAAfwD44P/9f1/b/////////////////wMAAAD4//////8AQY6a4QALoQHf/////////////////////x8AAAAA/v//B/7//wfA/////////////3/8/PwcAAAAAP//AAD//xgAAOAAAAAA3/////////////////////8fAAD/A/7//4f+//8HwP////////////9//Pz8HAAAAAD/7///f///t/8//z8AAAAA////////////////////BwAAAAAAAAAA////////HwBBwJvhAAsv/+///3///7f/P/8/AAAAAP///////////////////wcAAAAAAAAAAP///////x8AQf+b4QALASAAQZCc4QALK////x////////8BAAAAAAD/////AOD///8H/////z8A////P/////8P/z4AQdCc4QALowL///8f////////AQABAAAA/////wDg////B///////B////z//////D/8+AAAAAAD/////////////////////////PwAA/////w//////D///////AP///////w8A//f/97f/+//7GwAAAAAAAAAA/////////////////////////z//A/////8P/////w///////wD///////8PAP/3//e3//v/+xsAAAAAAAAAAD/9/////7+R//8/AP//fwD///9/AAAAAAAAAAD//zcA//8/AP///wMAAAAAAAAAAP/////////AAAAAAAAAAAABAO/+//8/AAAAAAD///8f////HwAAAAD//v//HwAAAP///////z8A//8/AP//BwD//wMAQYCf4QALM2/w7/7//z+HAAAAAP///x////8fAAAAAP/+//9/AAAA////////PwD//z8A//8HAP//AwBBwJ/hAAsl////////////AQAAAAAAAP///////wcA////////BwD/////DwBBgKDhAAso////////////AQAAAAAAAP///////wcA////////BwD//////wD/AwBB0KDhAAsH//////8DAwBB4KDhAAsf////H4AA//8/AAAAAAD//wMAAAAAAP//HwAAAP//fwBBkKHhAAvdAf//////GwMAAAAAAAAAAOD///8fgAD/////AQAAAP//PwAAAAAA//8fAAAA//9/APj///////8AAAAAAAAAJgD4//////8AAAAA////AQAA+P///38AAACQAP////9HAPj//////wcAHgAAFAAAAAD//////////38AAADA/z+A/////////wcEAP///wH/A////////9//8AD/////TwD//////////x/e/xcAAAAA///7//8PAIABAAAAAAAAAH+9/7//Af//////fwAAAADgn/n///3tIwAAAeADAEGAo+EACy////v/////wAMAAAAAAAAAf73/v/8B/////////wf/A++f+f///e37nzmB4M8fHwBBwKPhAAsZ////////HwCABwCAAwAAAP///////wAAsABB8KPhAAss//////9/AAAAAAAPAAAAAP///////////wf/wwMAAAD//////////78A/wMAQbCk4QALOf///////z//AQAAPwAAAAD///////8AABAAAAAAAAAA//////8HAAEAAAAAAAAAAP///wcAAAAAfwBBgKXhAAsp//////////8RAP8DAAAAAP////////8B/wMAAAAAAAD////n/w//A38AQcCl4QALBv//////DwBB1KXhAAsV//////////8AAACAf/Jv////AIACAEH0peEACxT//P////8BAAoAAAD/////////BwBBlKbhAAtM////////////AwCAf/Jv////v/kPAP8DAAAAAAAAAAD//P///////BsAAAAB+P////8HBAAAAfD//////wMAIAAA////////////AQBBkqfhAAsu////////////////AQD/////////f4AA////////////IwAA////////////AQBB/qfhAAsU72///f///38AAAEAAAAAAPz///8AQaCo4QALFH/7/////wEAQAAAAL/9////AwABAEHAqOEACxf//f////9//wEA/wMAAPz////8///+fwBB4KjhAAsWf/v/////f7T/AP8Dv/3///9/+wH/AwBBnKnhAAsL//8HAPT//f///w8AQbap4QALAQEAQdyp4QALEP//fwD///3/////xwcA/wMAQfap4QALAQEAQYCq4QALKf////////////////9/AAD///////////////////////////////8PAEHAquEACwn///////8AAH4AQYCr4QALCf//////P///fwBBoKvhAAsL////////AAD//z8AQeyr4QALCuDjB/jnDwAAADwAQYCs4QALCf//////////fwBBwKzhAAsG////f+AHAEHgrOEACzL/////////Af///38AAP///////////38AAP///z8AAP///////wAADwAAAPj//+D//wBBoK3hAAsy/////////wH///9//wP///////////9//wP///8/HwD///////9/AA8A/wP4///g//8AQeit4QALCP//////////AEGAruEACx3///////////8HAQAAAAAAAAD4/wAAAAAAAAAACwBBqK7hAAsI//////////8AQcCu4QALQv///////////4f/////////gP//AAAAAAAAAAAbAAMA//////////////////////////////////8/AAAAAAD/AQBBoK/hAAsg/////////////////////////////////////////w8AQfyv4QALGH9v/3//////////////////B/8f/wH/AwBB3rDhAAsW/wP/////////////////B/8f/wH/YwBBoLHhAAse////////////////////////////////////////AEHIseEACwEcAEGAsuEAC9YB/////////////9///////////99k3v/r7/////////+/59/f////e1/8/f//////////////////////////////////////////////////////P/////3///f////3///f////3///f////3/////9/////f//9w8AAAAAAAD//////////////////////////z/////9///3////9///3////9///3////9//////f////3///fP////////////////f/j//////x8gABAAAPj+/wBBhrThAAsI/////////z8AQaC04QALCv//////H4A/AEAAQcC04QALEn////nbB/////////8/AAAAgABB4LThAAsK//////8f/z//QwBBkrXhAAsM////PwAA//////8PAEHSteEACw7///9/AAD/////////AwBBmrbhAAsE////DwBB2rbhAAsG//////8DAEGAt+EACyr///////////////////////////////8fAAAAAAAAAP//////////DwgAQcC34QALLP///////////////////////////////x8AfwAAAAAA////////////D/8DAEGAuOEACxjv////lv73CoTqlqqW9/de//v/D+77/w8AQcC44QALrAL/////////////////////////////////////AAAAAP///////////////////////////////////////////////////wP///////////////////////////////////8//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wEA/////////////////////////////wMA////////////////////////////////////////////////////////////////////B////////////////////////////////////////////z8AQaC74QALBP///z8AQeC74QALNv///////////////////////////////////////////////////////////////////////wBBwrzhAAuWpAFAAH8AvwD3APcA9wD3APcA9wD3ADABcAGhAeEB9wD3APcAHgL3AC4CXwKWAtYCFgNLA/cAfAO2A+sDBQRFBIUExQT2BCwFaAWmBeUFIwZiBqAG3wYdB10HmwfZBxcIVwiVCNQIEglSCZAJ0AkQCk8KjwrOCg4LTguOC8gLCAxIDIgMuAzyDDINUg1yDZoN9wDaDREOTw5+DqMOxg7mDiYP9wD3APcA9wD3APcA9wD3APcAZg+GD8YPBhBIDEYQhhCmEOYQFhFWEZYR1hEMEjUSVhKWEscSBxNCE4ITvBP4EzgUeBS1FPcA9wD3APUU9wD3APcA9wA1FW8VKQKvFe8VLRZtFqsW6xYXF1EXfxe/F/0XOxh7GLMY9wD3AN4YEhlSGXIZcxlyGaYZ5hkiGmIaohriGh8bXBuFG7sb9hv3APcA9wD3APcA9wAzHFsc9wD3APcA9wD3AJkczxz3APcA9wD3AOYcJh1WHZYdth32HTYedh6RHtEe0R7RHvseOx97H7gf9R81INEegR5mIEYgpiDRHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHvcA0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RINEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R4EIT0h9wD3APcA9wB9Ib0h+yEbIvcA9wD3AFsimSLZIhkjUyOTI8wjDCRLJIskyyRIDAglRyV3JfcApyXnJe8l9yX/Jesl8yX7Jecl7yX3Jf8l6yXzJfsl5yXvJfcl/yXrJfMl+yXnJe8l9yX/Jesl8yX7Jecl7yX3Jf8l6yXzJfsl5yXvJfcl/yXrJfMl+yXnJe8l9yX/Jesl8yX7Jecl7yX3Jf8l6yXzJfsl5yXvJfcl/yXrJfMl+yXnJe8l9yX/Jesl8yX7Jecl7yX3Jf8l6yXzJfsl5yXvJfcl/yXrJfMl+yXnJe8l9yX/Jesl8yX7Jecl7yX3Jf8l6yXzJfsl5yXvJfcl/yXrJfMl+yXnJe8l9yX/Jesl8yX7Jecl7yX3Jf8l6yXzJfsl5yXvJfcl/yXrJfMl+yXnJe8l9yX/Jesl8yX7Jecl7yX3Jf8l6yXzJfsl5yXvJfcl/yXrJfMl+yXnJe8l9yX/Jesl8yX7Jecl7yX3Jf8l6yXzJfsl5yXvJfcl/yXrJfMl+yXnJe8l9yX/Jesl8yUzJmwmrCasJqwmrCasJqwmrCasJqwmrCasJqwmrCasJqwmrCasJqwmrCasJqwmrCasJqwmrCasJqwmrCasJqwmrCasJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm0R7RHtEe0R7RHtEe0R7RHiwnbCf3AKkn9wD3APcA9wC8J/cA/Cc0KHQosCj3AOYoJilkKZUp1ClgCn4Kmwq6CtoK2graCtsK2graCtoK2wr7CvsK+wr7CvsK+wr7CvsK+wr7CvsK+wr7CvsK+wr7CvsK+wr7CvsK+wr7CvsK+wr7CvsK+wr7CvsK+wr7CvsK+wr7CvsK+wr7CvsK+wr7ChsL9wH3APwBFCpoAmgC7CbsJvcA9wD3APcA9wD3APcA5QQkKvcA9wDjCfcA9wD3APcA9AHaCS0H7CbsJvcA9wArKuwm7CbsJuwm7CbsJuwm7Cb3ANoJ9wD3APcALQcnAgcI9wD3AKkd9wDlBPcA9wA7KvcASyr3APcAnyVaKuwm7Cb3APcA9wD3APcA9wD3APcA9wBoArsI9wD3AJ8l9wAHCPcA9wDLB/cA9wD3AFwq+AH4AWsqAQJ5Kuwm7CbsJuwm9wD3APcA9wD3APcA9wD3APcA9wD3APcA9wD3APcA9wD3APcA9wBFEfcARhHLB+wm/QH3APcAiSrsJuwm7CbsJpkq9wD3AKMq9wCyKvcA9wD3APQBDwPsJuwm7Cb3AL8q9wDKKvcA5gTsJuwm7CbsJvcA9wD3AJsl9wB2AvcA9wDaKukG9wDqKrYP+ir3APcA9wD3AOwm7Cb3APcACisaK/cA9wD3ACor9wBwAvcA7QT3ADorDQPsJuwm7CbsJuwm9wD3APcA9wC2D+wm7CbsJvcA9wD3ADYZ9wD3APcAvA/3APcA1A+7COwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJvcA9AH3APcASis3Gewm7CbsJvoS9wD3AMsH9wBqAVor7Cb3AGor7CbsJvcABwjsJvcARRElAvcA9wBoAXordgJoC4orJQL3APcAmSunK/cAtg+7CCUC9wBpAbcrxyv3APcA1yslAvcA9wBtAecr9yvuATQZ9wABAmQBBywWLOwm7CbsJiYs9QE1LPcA9wBhAcsSuwhFLHUC+gFULJsHZCxyLNES7CbsJuwm7CbsJuwm7CbsJvcA9wD3AGsBgiySLDcZ7Cb3APcA9wBwAaIsuwjsJuwm7CbsJuwm7CbsJuwm7CbsJvcA9wBhAbIswSzKLOwm7Cb3APcA9wBwAdosuwjqLOwm9wD3AGUB+iy7COwm7CbsJkgMAQt+CgotBCXsJuwm7CbsJuwm7CbsJuwm7CbsJuwm9wD3AGQBKwTsJuwm7CbsJuwm7Cb3APcA9wD3AKwDMCcaLSYt9wA2LUQtuwjsJuwm7CbsJm4C9wD3AFQtYy3sJvAh9wD3AHMtgy2TLfcA9wBmAaMtsi33APcA9wD3ALYPwi3sJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7Cb6AfcAYQHZC9ItrAPaCeIt9wC9C9gLzxLsJuwm7CbsJgkH9wD3APEtAC67CBAu9wBCEiAuuwjsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm9wAwLkAu7QH3AEwuWi67COwm7CbsJuwm7CYtB/cAai55Locu9wD3APcA9wD3APcA9wD3APcA9wD3APcA9wD3APcA9wD3APcA9wD3APcA9wD3APcA9wD3APcA9wD3APcA9wD3ANYO7CbsJuwm7CbsJuwm9wD3APcA9wD3APcA9AGWLvcA9wD3APcA9wD3APcA9wD3APcA9wD3ADUZ7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7Cb3APcA9wD3APcA9wA2GfcA9wD3APcA9wCmLvcA9wC0LvcA9wD3APcA9wD3APcA9wD3APcA9wD3APcA9wC+LvcA9wD3APcA9wD3APcA9wDOLt4u0BLsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm9wD3APcA9wD3APcA9wD3APcA9wD3APcA9wD3APcA9wD3APcA9wD3APcA9wD3APcA9wD3APcA9wBzD/cA9wD3APcARRHsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7Cb3APcA9wC2D/cA9AHuLvcA9wD3APcA9AG7CPcAaAL+LvcA9wD3AA4vGi8qLwEC6AT3AOwm7CbsJuwm7CbsJuwm9wD3APcA9wD3ADUv7CbsJuwm7CbsJuwm9wD3APcA9wAICG8BcAFwAUUvJQLsJuwm7CbsJlUv1BLRHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHr0e0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R73APcA9wD3APcA9wD3APcA9wD3APcA9wD3APcA9wD3AEYR7CbsJrwe7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CaHBtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHg4fYy/sJnMvfy/RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R65Huwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm9wD3APcA9wD3APcA5QTaCbYPjy/SEuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJnABcAHoA3ABzxL3APcA9wD3APcA9wD3ADUZ7CbsJuwm9wD3APcA9wD3APcA9wD3APcA9wD3APcA9wD3APcARhH3APcAbwL3APcA9wCfL3ABrC/3ALgv9wD3APcA5QTsJvcA9wD3APcAxi/sJuwm7CbsJuwm7CbsJvcANRn3ADUZ9wD3APcA9wD3AEUR9wC2D+wm7CbsJuwm7CbsJuwm7Cb3APcA9wD3APcA/gH3APcA9wD2AdQv4i//AfcA9wD3AN0Nhgb3ABAO7y/tAfcA9wD3APcA9wD3APcA9wD3APcAcAL3APcA9wD3APcA9wD3APcA9wD3APcA9wD3APcA9wD3APcA+S8HMAcwBzBwAXABcAGYLXABcAHEARcwIzD8EqYC7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm9wD0AS8w7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbZCz8wTTD3APcA9wBoAuwm+BLsJuwm7CbsJuwm7CbsJvcA9wDaCV0wWyTsJuwm7CbsJuwm7CbsJuwm7CbsJuwm9wBtMOwm9wD3AGQBfTDsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJvcAZAG7COwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJo0w9AH3APcA9wD3APcA9wD3APcA9wD3APcA9wBxAs8S7CbsJvcA9wD3APcAnTCtMOwm7CbsJuwm7CbsJuwm7CbsJuwm7gH3APcAZCi9MOwm7CbsJuwm7gH3APcAaALsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7Cb/AfcAzDDZMOcw9zAFMQ0x+QEHCBwxBwjsJuwm7CY3Gewm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R4sMXIZpBlyGXIZchk8MXIZchlyGSwx0R7RHtEeSTFPMdEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHl8xZTHRHmwxejHRHtEehzHRHtEe0R7RHpcxpjGwMbcxxjHUMeQx8jHRHtEe0R7RHhgbYy4CMhAZFRvRHtEeDjLRHh4y0R7RHtEeKjLRHjYy0R7RHtEe0R5BMvcA9wBRMtEe0R5hMWEyZzLRHtEe0R73APcA9wD3APcA9wD3AHcy9wD3APcA9wD3AAIy0R7RHgIZ9wD3APcAFxsVG/cA9wAXG/cAABnRHtEe0R7RHtEehzKuMc8xljLRHtEe0R7OMdEe0R7RHqUyqTG0MtEe0R73APcA9wD3APcAdzLRHtEe0R7RHtEe0R5iMtEe0R6eMfcA9wD3APcA9wD3APcA9wD3AAAC9wD3AOUE7CbsJrsI0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R63Hi0I7CZwAXABcAFwAXABcAHsJuwm7CbsJuwm7CbsJuwmcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAB7CY1BFUEdQSVBLUE1QT1BA8FLwVPBW8FjwWvBc8F7wUKBioGMQZRBoADgAOAA4ADZgYqBoYGowaAA4ADgAOAA4ADwwbgBoADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADKgYAB4ADHAfKAMoAygDKAMoAygDKAMoAPAfKAFwHbweAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AHoAe3B4ADgAOAA4AD1weAA4ADgAOAA4ADgAOAA+cHBwgnCEcIXQgqBn0IgAONCK0IxAjXCOcIBwmAAyAJQAlgCYAJoAnACeAJAArKACAKygDKAMoAygDKAMoAygDKAMoAygDKAMoAygDKAMoAygDKAMoAygDKAMoAygDKAMoAygDKAMoAygDKAMoAygDKACAKgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA0AKAwMDAwMDAwMDDAIAAAEDAwMDAwMDAwMDAwMDAwMDAwMJEhYdGhkdFhURHRoXDhcbGBgYGBgYGBgYGBcXHR0dEh0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRUaER0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dFQwQHQMDAwMDBAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDCBUZGhoaHRwcHRwWHQwdHRkaHBwNHRwcHBwcFhwcHBUdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRwdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHB0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0cDRwcHA0cHR0cHR0dHR0dHRwcHBwdHB0NHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDCAMDAwMDAwMDAwMDAwgICAgICAgDAwMDAwMDAwMDAwMDHR0dHR0dHR0qKh0dHR0XHSoqKiodHR0dHR0dKh0qHR0dHR0dHR0dHR0dHR0dHR0dHR0qHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0DAwMDAwMDHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dKh0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dKiodHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0XDCoqHR0aKgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwwDHQMDHQMDEgMqKioqKioqKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyoqKiojIyMjHR0qKioqKioqKioqKh0dHR0dHR0dHRkZGRcXHR0DAwMDAwMDAwMDAxIDEhISHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0DAwMDAwMDAwMDAwMDAwMDAwMDAwMYGBgYGBgYGBgYGRgYHR0dAx0dHR0dHR0dHR0dHR0dHR0dHR0dEh0DAwMDAwMDHR0DAwMDAwMdHQMDHQMDAwMdHRgYGBgYGBgYGBgdHR0dHR0dHR0dHR0dHSodHQMdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0DAwMDAwMDAwMDAwMDAwMDKiodHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0DAwMDAwMDAwMDAx0qKioqKioqKioqKioqKhgYGBgYGBgYGBgdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0DAwMDAwMDAwMdHR0dFxIdKioDGhodHR0dHR0dHR0dHR0dHR0dHR0dHR0dAwMDAx0DAwMDAwMDAwMdAwMDHQMDAwMDKiodHR0dHR0dHR0dHR0dHR0qHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHQMDAyoqHSodHR0dHR0dHR0dHSoqKioqHR0dHR0dHR0dHR0dHR0dHSodHSoqKioqKgMDAwMDAwMDHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMdAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0DAwMdAwMDAwMDAwMDAwMDAwMDAx0DAwMDAwMDHR0dHR0dHR0dHQMDDAwYGBgYGBgYGBgYHR0dHR0dHR0dHR0dHR0dHQMDAyodHR0dHR0dHSoqHR0qKh0dHR0dHR0dHR0dHR0dHR0dHR0dHR0qHR0dHR0dHSodKioqHR0dHSoqAx0DAwMDAyoqAwMqKgMDAx0qKioqKioqKgMqKioqHR0qHR0dAwMqKhgYGBgYGBgYGBgdHRkZHR0dHR0ZHRodHQMqAwMDKh0dHR0dHSoqKiodHSoqHR0dHR0dHR0dHR0dHR0dHR0dHR0dHSodHR0dHR0dKh0dKh0dKh0dKioDKgMDAyoqKioDAyoqAwMDKioqAyoqKioqKiodHR0dKh0qKioqKioqGBgYGBgYGBgYGAMDHR0dAx0qKioqKioqKioDAwMqHR0dHR0dHR0dKh0dHSodHR0dHR0dHR0dHR0dHR0dHR0dHR0dKh0dHR0dHR0qHR0qHR0dHR0qKgMdAwMDAwMDKgMDAyoDAwMqKh0qKioqKioqKioqKioqKiodHQMDKioYGBgYGBgYGBgYHRoqKioqKioqHQMDAwMDAyoDAwMqHR0dHR0dHR0qKh0dKiodHR0dHR0dHR0dHR0dHR0dHR0dHR0dKh0dHR0dHR0qHR0qHR0dHR0qKgMdAwMDAwMqKgMDKioDAwMqKioqKioqAwMDKioqKh0dKh0dHQMDKioYGBgYGBgYGBgYHR0dHR0dHR0qKioqKioqKgMdKh0dHR0dHSoqKh0dHSodHR0dKioqHR0qHSodHSoqKh0dKioqHR0dKioqHR0dHR0dHR0dHR0dKioqKgMDAyoqKgMDAyoDAwMDKiodKioqKioqAyoqKioqKioqKioqKioqGBgYGBgYGBgYGB0dHR0dHR0dHRodKioqKioDAwMDAx0dHR0dHR0dKh0dHSodHR0dHR0dHR0dHR0dHR0dHR0dHR0dHSodHR0dHR0dHR0dHR0dHR0dKioDHQMDAwMDKgMDAyoDAwMDKioqKioqKgMDKh0dHSoqHSoqHR0DAyoqGBgYGBgYGBgYGCoqKioqKioNHR0dHR0dHR0DAwMNHR0dHR0dHR0qHR0dKh0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dKh0dHR0dHR0dHR0qHR0dHR0qKgMdAwMDAwMqAwMDKgMDAwMqKioqKioqAwMqKioqKiodHSodHQMDKioYGBgYGBgYGBgYKh0dAyoqKioqKioqKioqKgMDAwMdHR0dHR0dHR0qHR0dKh0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dAwMdAwMDAwMqAwMDKgMDAwMdHSoqKiodHR0DHR0dHR0dHR0dHQMDKioYGBgYGBgYGBgYHR0dHR0dHR0dGR0dHR0dHSoDAwMqHR0dHR0dHR0dHR0dHR0dHR0dKioqHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dKh0dHR0dHR0dHSodKiodHR0dHR0dKioqAyoqKioDAwMDAwMqAyoDAwMDAwMDAyoqKioqKhgYGBgYGBgYGBgqKgMDHSoqKioqKioqKioqKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSoqKioaKSkpKSkpKSkpKSkpKSkpHRgYGBgYGBgYGBgMDCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKikpKikqKSkpKSkqKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKikqKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkqKikpKSkpKikqKSkpKSkpKSoYGBgYGBgYGBgYKiopKSkpKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiodDQ0NDR0NDQgNDQwIEhISEhIIHRIdHR0DAx0dHR0dHRgYGBgYGBgYGBgdHR0dHR0dHR0dDAMdAx0DFRAVEAMDHR0dHR0dHR0qHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dKioqKgMDAwMDAwMDAwMDAwMDDAMDHR0dHR0DAwMDAwMDAwMDAyoDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMqDAwdHR0dHR0DHR0dHR0dKh0dDQ0MDR0dHR0dCAgqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKRgYGBgYGBgYGBgMDB0dHR0pKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkYGBgYGBgYGBgYKSkpKSkpHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0qHSoqKioqHSoqHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnHR0dHR0dHR0dKh0dHR0qKh0dHR0dHR0qHSodHR0dKiodHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHSodHR0dKiodHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0qHR0dHSoqHR0dHR0dHSodHR0dKiodHR0dHR0dHR0dHR0dHR0qHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHSodHR0dKiodHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dKioDAwMdDB0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHSoqKioqKh0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHSoqHR0dHR0dKioMHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dDB0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dFRAqKiodHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dDAwMHR0dHR0dHR0dHR0qKioqKioqHR0dHR0dHR0dHR0dHR0dHR0dAwMDAyoqKioqKioqKh0dHR0dHR0dHR0dHR0dHR0dHR0DAwMMDCoqKioqKioqKh0dHR0dHR0dHR0dHR0dHR0dHQMDKioqKioqKioqKioqHR0dHR0dHR0dHR0dHSodHR0qAwMqKioqKioqKioqKiopKSkpKSkpKSkpKSkpKSkpKSkpKQwMFCkMHQwaKSkqKhgYGBgYGBgYGBgqKioqKiodHR0dHR0dHR0dKioqKioqHR0SEgwMDR0SEh0DAwMIAxgYGBgYGBgYGBgqKioqKiodHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0qKioqKioqHR0dHR0DAx0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0DHSoqKioqHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dKioqKioqKioqKh0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0qAwMDAwMDAwMDAwMDKioqKgMDAwMDAwMDAwMDAyoqKiodKioqEhIYGBgYGBgYGBgYKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKiopKSkpKSoqKioqKioqKioqKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkqKioqKSkpKSkpKSkpKSkpKSkpKSoqKioqKhgYGBgYGBgYGBgpKioqKSkdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHQMDAwMDKiodHSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKikpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKioDGBgYGBgYGBgYGCoqKioqKhgYGBgYGBgYGBgqKioqKiopKSkpKSkpKSkpKSkpKSoqAwMDAwMDAwMDAwMDAwMDAyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioDAwMDAx0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dAwMDAwMDAwMDAwMDHR0dHR0dHR0qKioYGBgYGBgYGBgYDAwdDAwMDB0dHR0dHR0dHR0DAwMDAwMDAwMdHR0dHR0dHR0MDCoDAwMdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0DAwMDAwMDAwMDAwMDHR0YGBgYGBgYGBgYHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0DAwMDAwMDAwMDAwMDAyoqKioqKioqHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dAwMDAwMDAwMDAwMDAwMDAwMDAwMqKioMDAwMDBgYGBgYGBgYGBgqKiodHR0YGBgYGBgYGBgYHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dDAwdHR0dHR0dHR0qKioqKioqHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHSoqHR0dHR0dHR0qKioqKioqKgMDAx0DAwMDAwMDAwMDAwMDAwMDAwMDAwMdHR0dAx0dHR0dHQMdHQMDAx0qKioqKgMDAwMDAwMDAwMDAwMIAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwgDAwMdHR0dHR0dHR0dHR0dHR0dHR0dHR0dKiodHR0dHR0qKh0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dKiodHR0dHR0qKh0dHR0dHR0dKh0qHSodKh0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0qKh0dHR0dKh0dHR0dHR0dHR0dHR0dKiodHR0dHR0qHR0dHR0dHR0dHR0dHR0dHR0dHSoqHR0dKh0dHR0dHR0NHSoMDAwMDAwMCAwMDAcDCgMDDAgMDAscHB0WFhUWFhYVFhwcHR0TExMMAAADAwMDAwgZGRkZGRkZGR0WFhwUFB0dHR0XFRAUFBQdHR0dHR0dHR0dHR0MGQwMDAwdDAwMBh0dHR0qAwMDAwMDAwMDAx0dKiocHR0dHR0dHR0VEBwdHBwcHB0dHR0dHR0dFRAqHR0dHR0dHR0dHR0dHSoqKhoaGhoaGhoZGhoaGhoaGhoaGhoaGhoZGhoaGhkaGhkaGhoaGhoaGhoaGhoaGhoDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMqKioqKioqKioqKioqKiodHR0ZHRwdHR0ZHR0dHR0dHR0dHB0dGh0dHR0dHR0dHR0cHB0dHR0dHR0dHB0dHR0dHR0dHR0dHR0dHR0dHR0dHBwdHR0dHRwdHRwdHBwcHBwcHBwcHBwcHR0dHRwcHBwcHBwcHBwdHR0dHR0dHR0cHR0qKioqHBwcHBwcHBwcHB0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHB0cHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRwdHBwdHR0cHB0dHB0dHRwdHBoaHRwdHR0dHB0dHBwcHB0dHB0cHRwcHBwcHB0cHR0dHR0cHBwcHR0dHRwcHR0dHR0dHR0cHR0dHB0dHR0dHB0dHR0dHR0dHR0dHR0cHB0dHBwcHB0dHBwdHRwcHR0dHR0dHR0dHR0dHR0dHRwcHR0cHB0dHR0dHR0dHR0dHR0cHR0dHB0dHR0dHR0dHR0dHB0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0cHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0THR0dHR0dHR0dHR0dHR0dHRUQFRAdHR0dHR0cHR0dHR0dHSQkHR0dHR0dHR0dHR0dHRUQHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dJCQkJB0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHSoqKioqKioqKioqKioqKioqKioqKioqKiodHR0dHR0dHR0dHSoqKioqKioqKioqKioqKioqKioqKhwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwdHR0dHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHB0dHR0dHR0dHR0dHBwcHBwcHBwcHBwcHBwcHB0dHBwcHB0dHR0dHR0dHR0cHB0cHBwcHBwcHR0dHR0dHR0cHB0dHBwdHR0dHBwdHR0dHBwcHR0cHR0cHBwcHR0dHR0dHR0dHR0dHR0dHRwcHBwdHR0dHR0dHR0cHR0dHR0dHR0dHR0dHR0dHSQkJCQdHBwdHRwdHR0dHBwdHR0dJCQcHCQdJCQkHyQkHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHSQkJB0dHR0cHRwdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRwcHRwcHB0cJBwcHRwcHRwdHR0dHR0dHR0dHR0dHR0kHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHBwdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHSQkJCQkJCQkJBwcHBwkHSQkJBwkJBwcHCQkHBwkHBwkJCQdHB0dHR0cHCQcHBwcHBwkJCQkJBwkJB8kHBwkJCQkJB0dHSQkHx8fHx0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHB0dHRYWFhYWFh0SEiQdHR0VEBUQFRAVEBUQFRAVEBwcHBwcHBwcHBwcHBwcHBwcHBwcHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0VEB0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0VEBUQFRAVEBUQHR0dHR0dHR0dHR0dHR0dHRUQFRAVEBUQFRAVEBUQFRAVEBUQFRAdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0VEBUQHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0VEB0dHR0dHR0dHR0dHR0dHR0dHR0dHRwcHBwcHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0qKh0dHR0dHR0dHR0dHR0dHR0dHR0dHR0qHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0DAwMdHSoqKioqEgwMDB0SDB0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dKh0qKioqKh0qKh0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0qKioqKioqHQwqKioqKioqKioqKioqKgMdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHSoqKioqKioqKh0dHR0dHR0qHR0dHR0dHSodHR0dHR0dKh0dHR0dHR0qAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMWFhYWFhYWFhYWFhYWFgwMDAwMDAwMHQwVDB0dFhYdHRYWFRAVEBUQFRAMDAwMEh0MDB0MDB0dHR0dCwsMDAwdDAwVDAwMDAwMDAwdDB0MDB0dHRISFRAVEBUQFRAMKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkKiQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQqKioqKioqKioqKiokJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkKioqKioqKioqKioqKioqKioqKioqKioqKiokJCQkJCQkJCQkJCQqKioqDBAQJCQUJCQVEBUQFRAVEBUQJCQVEBUQFRAVEBQVEBAkJCQkJCQkJCQkAwMDAwMDJCQkJCQDJCQkJCQUFCQkJCoeJB4kHiQeJB4kJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkHiQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQeJB4kHiQkJCQkJB4kJCQkJCQeHioqAwMUFBQUJBQeJB4kHiQeJB4kJCQkJCQkJCQkJCQkJCQkJCQkJCQkHiQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQeJB4kHiQkJCQkJB4kJCQkJCQeHiQkJCQUHhQUJCoqKioqJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCokJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQqKioqKioqKioqKioeHh4eHh4eHh4eHh4eHh4eJCQkJCQkJCQcHBwcHBwcHCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJBQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQqKiokJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQqKioqKioqKiodHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dDAwdHR0dHR0dHR0dHR0dDBIMHR0dHR0dHR0dHR0dHR0dHRgYGBgYGBgYGBgdHSoqKioqKioqKioqKioqKioqKioqHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0DAwMDHQMDAwMDAwMDAwMdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0DAx0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHQMDHQwMDAwMKioqKioqKiodHR0dHR0dHR0dHSoqKioqHR0qHSodHR0dHSoqKioqKioqKioqKioqKioqKioqKioqKh0dHR0dHR0dHR0dHR0dAx0dHQMdHR0dAx0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dAwMDAwMdHR0dAyoqKh0dHR0dHR0dGR0qKioqKiodHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dDQ0SEioqKioqKioqAwMdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHQMDAwMDAwMDAwMDAyoqKioqKioqDAwYGBgYGBgYGBgYKioqKioqAwMDAwMDAwMDAwMDAwMDAwMDHR0dHR0dHR0dHQ0dHQMYGBgYGBgYGBgYHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHQMDAwMDAwMDDAwdHR0dHR0dHR0dHR0dHR0dAwMDAwMDAwMDAwMDAyoqKioqKioqKioqHSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlKioqAwMDAx0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dAwMDAwMDAwMDAwMDAx0dHR0dHQwMDB0dHR0qHRgYGBgYGBgYGBgqKioqHR0pKSkpKSkpKSkpKSkpKSkpGBgYGBgYGBgYGCkpKSkpKh0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dAwMDAwMDAwMDAwMDAwMqKioqKioqKiodHR0DHR0dHR0dHR0DAyoqGBgYGBgYGBgYGCoqHQwMDCkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKioqKioqKioqKioqKioqKioqKioqKioqKSkpKSkdHR0dHR0dHR0dHQMDAwMDDAwdHR0DAyoqKioqKioqKh0dHR0dHSoqHR0dHR0dKiodHR0dHR0qKioqKioqKiodHR0dHR0dKh0dHR0dHR0qHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0qKioqHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0DAwMDAwMDAwwDAyoqGBgYGBgYGBgYGCoqKioqKiEiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIhIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiISIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiEiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIqKioqKioqKioqKiomJiYmJiYmJiYmJiYmJiYmKioqKicnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycqKioqBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiodHR0dHR0dKioqKioqKioqKioqHR0dHR0qKioqKiMDIyMjIyMjIyMjIx0jIyMjIyMjIyMjIyMjKiMjIyMjKiMqIyMqIyMqIyMjIyMjIyMjIx0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHSoqKioqKioqKioqKioqKiodHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRAVHR0dHR0dHR0dHR0dHR0dHSoqHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHSoqKioqKiodKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiodHR0dHR0dHR0dHR0ZHR0dAwMDAwMDAwMDAwMDAwMDAxcQEBcXEhIVEBMqKioqKioDAwMDAwMDAwMDAwMDAwMDJCQkJCQVEBUQFRAVEBUQFRAkJBUQJCQkJCQkJBAkECoUFBISJBUQFRAVECQkJCQkJCQkKiQaGSQqKioqHR0dHR0qHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHSoqBioSJCQaGSQkFRAkJBAkECQkJCQkJCQkJCQkFBQkJCQSJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkFSQQJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkFSQQJBUQEBUQEBQkHh4eHh4eHh4eHiQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJBQUJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCoqJCQkJCQkKiokJCQkJCQqKiQkJCQkJCoqJCQkKioqGRokJCQaGiodHR0dHR0dKioqKioqKioqKgMDAw8cKiodHR0dHR0dHR0dHSodHSodDAwMKioqKh0dHR0dHR0dHR0dHR0DKiodHR0dHR0DAwMDAyoqKioqHR0dHR0dHR0dHR0dHR0qDB0dHR0dKioqKioqKioqKiodHR0qHR0qHR0dHR0dHR0dKh0dHR0dHR0qHR0qKiodKh0dHR0dHR0dHSoqKioqHR0dHR0dKiodKh0dHR0dHSodHSoqKh0qKh0dHR0dHSoMHR0dHR0dHR0qHR0qKioqKh0dHR0dHR0dHR0dHSoqKgwdAwMDKgMDKioqKioDAwMDHR0dHR0dKioDAwMqKioqAwwMDAwMDAwMHSoqKioqKiodHR0dHQMDKioqKh0dHR0dDAwMDAwMEyoqKioqKioqKh0dHR0dHSoqKgwMDAwMDAwdHSoqKioqKiodHR0dKioqHR0dHR0dHR0dHSoDAwwqKgMdHR0dHR0dHR0qKioqKiodHQMDAwMdHR0dKioqKioqAwMDAwMDAwwMHR0dHR0qKgMdHQMDHSoqKioqKioqKgMDAwMDAwMDAwMDHR0dDAwDKioqKioqKioqKh0qKgMDAwMDKhgYGBgYGBgYGBgMDAwMHQMDHSoqKioqKioqHR0dAx0NHSoqKioqKioqKgMdHR0dDAwdDAMDAwMdAwMYGBgYGBgYGBgYHQ0dDAwMAwMDAwMDAwMMDB0MDB0DHQMqKioqKioqKioqKioqKh0dHR0dHR0qHSodHR0dKh0dHR0dHR0dHQwqKioqKioDAwMDKh0dHR0dHR0dKiodKh0dKh0dHR0dKgMDHQMDHSoqKioqKgMqKioqKh0dHQMDKioDAwMDAwMDKioqAwMDAwMDAx0dHR0MDAwMHRgYGBgYGBgYGBgMDCodAx0DAwMDHR0dHSoqKioqKioqAwMDAwMDKioDAwMDAwMDAw0MDBISHR0dDAwMDAwMDAwdHR0dAwMqKgMMDB0dKioqKioqKioqKioNDQ0NDQ0NDQ0NDQ0NKioqAwMDAwMDAwMdHSoqKioqKhgYGBgYGBgYGBgpKQwMDCkdHR0dHR0dKiodKiodHR0dKh0dKh0dHR0dHR0dAwMDAwMDKgMDKioDAwMDHQMDDAwMKioqKioqKioqHQMDAwMDAwMqKgMDAwMDAx0NHQMqKioqKioqKioqKh0dHQMDAwMDAwMdAwMDAw0dDAwMDA0dAyoqKioqKioqHQMDAwMDAwMDAwMDHR0dHQMDAwMDAwMDAwMMDAwdDQ0MDCoqKioqKioqKioqKioNDQ0NDQ0NDQ0NKioqKioqHQwMDAwMKioqKioqKioqKg0SHR0dHR0dHR0dHR0dHR0DAwMDAwMqKioDKgMDKgMDAwMDAx0DKioqKioqKiodHR0dHR0qHR0qHR0dHR0dAwMqAwMDAwMdKioqKioqKh0dHQMDAwMdHSoqKioqKioDAx0DHR0dHR0dHR0dHR0dAwMDAwMDAyoqKgMDAwwMJCQkJCQkJCQkJCQdHR0dHR0dHR0dHR0dGRkZHR0dHR0dHR0dHR0dHR0dKioqKioqKioqKioqKgwMDAwMKioqKioqKioqKiodHR0dHR0dHRUVFRAQEB0dEB0dHRUQFRAdHR0dHR0dHR0VEBAdHR0dCAgICAgICBUQCAgIFRAVEAMdHR0dHR0DAwMDAwMDAwMYGBgYGBgYGBgYKioqKgwMAwMDAwMMKioqKioqKioqKgMDAwMDAwMMDAwdHR0dHR0MHSoqKioqKioqKioYGBgYGBgYGBgYKh0dHR0dHR0MDB0dKioqKioDAwMDAwMDAyoqKioqKioDFBQUFAgqKioqKioqKioqKh4qKioqKioqKioqKioqHh4eKioeKioqKioqKioqKh4eHh4qKioqKioqKh0dHR0dHR0dHR0q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8eIACwPRANIAQcDx4gALLNMAANTV1tcA2NkAANrb3N3e3zPg4eLj5DPlM+YAAADnAAAAAOjpMzMA6uvsAEGA8uIAC8ABMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzM+EEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAEGA9OIAC8ACVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV7VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV3XVXH/9V3/VVVVVVXVVVVVVVVVVdVVVVXV/V1XVVVVVVVVVVVVVVUAQdz24gALKVVVVVVV1VVVVVVVVVVVVVVVVVVVFQBQVVVVVVVVVVVVVVVVVVVVVVUBAEGP9+IAC7QBEEEQVVVVVVVVVVVVVVVVVVVVUVVVAABAVFVVVVVVVVVVVVUVAAAAAABVVVVVVFVVVVVVVVVVBQAUABQEUFVVVVVVVVUVUVVVVVVVVVUAAAAAAABAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQUAAFRVVVVVVVVVVVVVVVVVFQAAVVVRVVVVVVUFEAAAAQFQVVVVVVVVVVVVVQFVVVVVVVVVVVVVVVVVUFUAAFVVVVVVVVVVVVUFAEHQ+OIAC+MNQFVVVVVVVVVVVVVVVVVFVAEAVFEBAFVVBVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVEAVRVUVUVVVUFVVVVVVVVRUFVVVVVVVVVVVVVVVVVVVRBFRRQUVVVVVVVVVVQUVVVARBUUVVVVVUFVVVVVVUFAFFVVVVVVVVVVVVVVVVVVQQBVFVRVQFVVQVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVRVRVVVFVFVVVVVVVVVVVVVVUVFVVVVVVVVVVVVVVVVUEVAUEUFVBVVUFVVVVVVVVVVFVVVVVVVVVVVVVVVVVVRREBQRQVUFVVQVVVVVVVVVVUFVVVVVVVVVVVVVVVVUVRAFUVVFVFVVVBVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVVVVVFFQVEVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVEAQFVVFQBAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUQAAVFVVAEBVVVVVVVVVVVVVVVVVVVVVVVVQVVVVVVVVEVFVVVVVVVVVVVVVVVVVAQAAQAAEVQEAAAEAAAAAAAAAAFRVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUBBABBQVVVVVVVVVAFVFVVVQFUVVVFQVVRVVVVUVVVVVVVVVVVqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqAAAAAAAAAABVVVVVVVVVAVVVVVVVVVVVVVVVVQVUVVVVVVVVBVVVVVVVVVUFVVVVVVVVVQVVVVVVVVVVVVVVVVVVVVVVEABQVUUBAABVVVFVVVVVVVVVVVVVFQBVVVVVVVVVVVVVVVVVQVVVVVVVVVVVUVVVVVVVVVVVVVVVVVVAFVRVRVUBVVVVVVVVFRRVVVVVVVVVVVVVVVVVVUUAQEQBAFQVAAAUVVVVVVVVVVVVVVVVAAAAAAAAAEBVVVVVVVVVVVVVVVUAVVVVVVVVVVVVVVVVAABQBVVVVVVVVVVVVRUAAFVVVVBVVVVVVVVVBVAQUFVVVVVVVVVVVVVVVVVFUBFQVVVVVVVVVVVVVVVVVVUAAAVVVVVVVVVAAAAABABUUVVUUFVVVRUA139fX3//BUD3XdV1VVVVVVVVVVUAAAAAVVdVVf1XVVVVVVVVVVVVV1VVVVVVVVVVAAAAAAAAAABUVVVV1V1dVdV1VVV9VVVVVVVVVVVVVVXVV9V/////Vf//X1VVVV1V////VVVVVXVVVV9VVVVV9XVXVVVV1VVVVVVVVffX39ddXXX91///d1X/VV9dVV9XdVVVVX//9fVfVVVV9f9fVVVdXVVVXVVVVVVV1VVVVVV1VaVVVVVpVVVVVVVVVVVVVVVVVVVVqVaWVVVVVVVVVVVVVVX/////////////////////////////////////////////3///////////Vf///////////1VVVf/////1X1VV3/9fVfX1VV9f9df1X1VVVfVfVdVVVVVpVX1d9VVaVXdVVVVVVVVVVXdVqqqqVVVV399/31VVVZVVVVVVlVVV9VlVpVVVVVXpVfr/7//+///fVe//r/vv+1VZpVVVVVVVVVVWVVVVVV1VVVVmlZpVVVVVVVVV9f//VVVVVVWpVVVVVVVVVlVVlVVVVVVVVZVWVVVVVVVVVVVVVVVVVvlfVVVVVVVVVVVVVVVVVVVVVVVVVVUVUFVVVVVVVVVVVVVVVVVVVVVVVRVVVVVVVVVVVQAAAAAAAAAAqqqqqqqqmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpVVVWqqqqqqlpVVVVVVVWqqqqqqqqqqqqqqqqqqgoAqqqqaqmqqqqqqqqqqqqqqqqqqqqqqqqqqmqBqqqqqqqqqqqqVamqqqqqqqqqqqqqqaqqqqqqqqqqqqqqqqiqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqVVWVqqqqqqqqqqqqqqpqqqqqqqqqqqqqqv//qqqqqqqqqqqqqqqqqqqqVqqqqqqqqqqqqqqqqqpqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVAAABQVVVVVVVVVQVVVVVVVVVVVVVVVVVVVVVVVVVVVVBVVVVFRRVVVVVVVVVBVVRVVVVVVVBVVVVVVVUAAAAAUFVFFVVVVVVVVVVVVQUAUFVVVVVVFQAAUFVVVaqqqqqqqqpWQFVVVVVVVVVVVVVVFQVQUFVVVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVVVAUBBQVVVFVVVVFVVVVVVVVVVVVVVVFVVVVVVVVVVVVVVVQQUVAVRVVVVVVVVVVVVVVBVRVVVVVVVVVVVVVVVUVRRVVVVVaqqqqqqqqqqqlVVVQAAAAAAQBUAQb+G4wALoQhVVVVVVVVVVUVVVVVVVVVVVQAAAACqqlpVAAAAAKqqqqqqqqqqaqqqqqpqqlVVVVVVqqqqqqqqqqpWVVVVVVVVVVVVVVVVVVUFVFVVVVVVVVVVVVVVVVVVVapqVVUAAFRdVVVVVVVVVVVVVVVVVVVVUVVVVVVVVVVVVFVVVVVVVVVVVVVVVVVVVVVVVVVVBUBVAUFVAFVVVVVVVVVVVVVAFVVVVVVVVVVVVUFVVVVVVVVVVVVVVVVVVVUAVVVVVVVVVVVVVVVVVVVVVRVUVVVVVVVVVVVVVVVVVVVVVVVVVQFVBQAAVFVVVVVVVVVVVVVVBVBVVVVVVVVVVVVVVVVVVVFVVVVVVVVVVVVVVVVVAAAAQFVVVVVVVVVVVVUUVFUVUFVVVVVVVVVVVVVVFUBBVUVVVVVVVVVVVVVVVVVVVVVAVVVVVVVVVVUVAAEAVFVVVVVVVVVVVVVVVVVVFVVVVVBVVVVVVVVVVVVVVVUFAEBVVQEUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVUARVRVVVVVVVVVUVFQBAVVVVVVVUVVVVVRVVVVUFAFQAVFVVVVVVVVVVVVVVVVVVVVUAAAVEVVVVVVVFVVVVVVVVVVVVVVVVVVVVVVVVVVUUAEQRBFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFQVQVRBUVVVVVVVVUFVVVVVVVVVVVVVVVVVVVVVVVVVVFQBAEVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVEAEFVVVVVVVVVVVQEFEABVVVVVVVVVVVVVVVVVVVVVFQAAQVVVVVVVVVVVVVVVVVVUVRVEFVVVVVVVVVVVVVVVVVVVVVVVVVVVAAVVVFVVVVVVVVUBAEBVVVVVVVVVVVUVABRAVRVVVQFAAVVVVVVVVVVVVVVVBQAAQFBVVVVVVVVVVVVVVVVVVVVVVVVVVVUAQAAQVVVVVQUAAAAAAAUABEFVVVVVVVVVVVVVVVVVVQFARRAAEFVVVVVVVVVVVVVVVVVVVVVVVVARVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVUVVVQVVVVVVVVVVVVVVVVBUBVRFVVVVVVVVVVVVVVVVVVVVQVAAAAUFVVVVVVVVVVVVVVVVVVVVVVVVVVVVUAVFVVVVVVVVVVVVVVVVVVAEBVVVVVVRVVVVVVVVVVVVVVVVVVVVUVQFVVVVVVVVVVVVVVVVVVVVVVVVWqVFVVWlVVVaqqqqqqqqqqqqqqqqqqVVWqqqqqqlpVVVVVVVVVVVVVqqpWVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVaqpqmmqqqqqqqqqqmpVVVVlVVVVVVVVVWpZVVVVqlVVqqqqqqqqqqqqqqqqqqqqqqqqqlVVVVVVVVVVQQBVVVVVVVVVAEHrjuMAC0VQAAAAAABAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVURUAUAAAAAQAEAVVVVVVVVVQVQVVVVVQVUVVVVVVVVVVVVVVVVVVUAQb2P4wALAkAVAEHLj+MAC4gHVFVRVVVVVFVVVVUVAAEAAABVVVVVAEAAAAAAFAAQBEBVVVVVVVVVVVVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVVQBVVVVVVVVVVQBAVVVVVVVVVVVVVVUAQFVVVVVVVVVVVVVVVVVVVlVVVVVVVVVVVVVVVVVVVVVVlVVVVVVVVVVVVVVVVf//f1X/////////X///////////////////X1X/////////76uq6v////9XVVVVVWpVVVWqqqqqqqqqqqqqqlWqqlZVWlVVVapaVVVVVVVVqqqqqqqqqqpWVVWpqpqqqqqqqqqqqqqqqqqqqqqqqqaqqqqqqlVVVaqqqqqqqqqqqqpqlapVVVWqqqqqVlaqqqqqqqqqqqqqqqqqqqqqqmqmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqlqqqqqqqqqqqqqqqqqqqqlpVVZVqqqqqqqqqVVVVVWVVVVVVVVVpVVVVVlVVVVVVVVVVVVVVVVVVVVVVVVVVlaqqqqqqVVVVVVVVVVVVVVVVqlpVVmqpVapVVZVWVaqqVlVVVVVVVVVVqqqqVVZVVVVVVVWqqqqqqqqqqqqqqmqqqpqqqqqqqqqqqqqqqqqqqlVVVVVVVVVVVVVVVaqqqlaqqlZVqqqqqqqqqqqqqqqaqlpVpaqqqlWqqlZVqqpWVf///////////////////19FbXB0eUludmFsaWREaWdpdFBvc092ZXJmbG93TmVnT3ZlcmZsb3daZXJvAB4EAAAMAAAABAAAAFcDAABYAwAAHwQAADAxMjM0NTY3ODlhYmNkZWYvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi91dWlkLTEuMTAuMC9zcmMvZm10LnJzAAAANMoYAFUAAAC5AAAADQAAADTKGABVAAAAsQAAABUAAAA0yhgAVQAAALQAAAANAAAANMoYAFUAAAC1AAAADQAAAC91c3IvbG9jYWwvY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3dhc20tYmluZGdlbi0wLjIuOTMvc3JjL2NhY2hlL2ludGVybi5ycwAAzMoYAGYAAAAbAAAAKwAAAAAAAAD//////////0jLGABB4JbjAAvqAVRyaWVkIHRvIHNocmluayB0byBhIGxhcmdlciBjYXBhY2l0eWDLGAAkAAAAL3J1c3RjLzU1YTIyZDJhNjMzMzRlMGZhZmYwMjAyYjcyYTMxY2U4MzJiNTYxMjUvbGlicmFyeS9hbGxvYy9zcmMvcmF3X3ZlYy5yc4zLGABMAAAApgIAAAkAAABKc1ZhbHVlKCkAAADoyxgACAAAAPDLGAABAAAAY2xvc3VyZSBpbnZva2VkIHJlY3Vyc2l2ZWx5IG9yIGFmdGVyIGJlaW5nIGRyb3BwZWQAAIsFAAAEAAAABAAAAIwFAACNBQBB1JjjAAvwAwEAAACOBQAAY2Fubm90IGFjY2VzcyBhIFRocmVhZCBMb2NhbCBTdG9yYWdlIHZhbHVlIGR1cmluZyBvciBhZnRlciBkZXN0cnVjdGlvbi9ydXN0Yy81NWEyMmQyYTYzMzM0ZTBmYWZmMDIwMmI3MmEzMWNlODMyYjU2MTI1L2xpYnJhcnkvc3RkL3NyYy90aHJlYWQvbG9jYWwucnMAAACizBgATwAAAAQBAAAaAAAAL3Vzci9sb2NhbC9jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvd2FzbS1iaW5kZ2VuLWZ1dHVyZXMtMC40LjQzL3NyYy9xdWV1ZS5ycwAEzRgAZwAAACUAAAAuAAAABM0YAGcAAAAoAAAAKQAAAATNGABnAAAAPgAAABoAAAAvdXNyL2xvY2FsL2NhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi93YXNtLWJpbmRnZW4tZnV0dXJlcy0wLjQuNDMvc3JjL3Rhc2svc2luZ2xldGhyZWFkLnJzAJzNGABzAAAAIQAAABUAAACPBQAAkAUAAJEFAACSBQAAnM0YAHMAAABmAAAAJQAAAAAAAIAAQdyc4wALrFMBAgICAAAAAQECAgIIAAAADQAAAA8AAADg7hAA6O4QAPXuEAAAAAAAAQAAAAEAAAAIAAAADQAAAA8AAADg7hAA6O4QAPXuEAAIAAAADQAAAA8AAADg7hAA6O4QAPXuEAAGAAAABgAAAAgAAAAHAAAAOHoQAOknEgA+ehAARnoQAEiZEABKmRAATJkQAE6ZEABQmRAAUpkQAFSZEABWmRAAWJkQAFqZEABcmRAAXpkQAGCZEABimRAAZJkQAGaZEABomRAAJKEQADShEABEoRAAVKEQAFShEABkoRAAdKEQAIShEACUoRAApKEQALShEADEoRAA1KEQAOShEAD0oRAABKIQABSiEAAkohAANKIQAJSZEACUmRAAlJkQAJSZEACUmRAAlJkQAJSZEACUmRAAlJkQAJSZEACUmRAAlJkQAJSZEACUmRAAlJkQAJSZEACUmRAAlJkQAJSZEACUmRAAlJkQAJSZEACUmRAAlJkQAJSZEACUmRAAlJkQAJSZEACUmRAAlJkQAJSZEACUmRAAlJkQAJSZEACUmRAAlJkQAJSZEACUmRAAlJkQAJSZEACUmRAAlJkQAJSZEACUmRAAlJkQAJSZEACUmRAAlJkQAJSZEACUmRAAlJkQAJSZEACUmRAAlJkQAJSZEACUmRAAlJkQAJSZEACUmRAAlJkQAJSZEACUmRAAlJkQAJSZEACUmRAAlJkQAJSZEACUmRAAlJkQAJSZEACUmRAAlJkQAJSZEACUmRAAlJkQAJSZEACUmRAAlJkQAJSZEACUmRAAlJkQAJSZEACUmRAAlJkQAJSZEACUmRAAlJkQAJSZEACUmRAAlJkQAJSZEACUmRAAlJkQAJSZEACUmRAAlJkQAJSZEACUmRAAlJkQAJSZEACUmRAAlJkQAJSZEACUmRAAlJkQAJSZEACUmRAAlJkQAJSZEACUmRAApJkQALSZEADEmRAA1JkQAOSZEAD0mRAABJoQABSaEAAkmhAANJoQAESaEABUmhAAZJoQAHSaEACEmhAAlJoQAKSaEAC0mhAAxJoQANSaEADkmhAA9JoQAASbEAAEmxAAFJsQACSbEAA0mxAARJsQAFSbEABkmxAAdJsQAISbEACUmxAApJsQALSbEAC0mxAAxJsQANSbEADkmxAA9JsQAAScEAAE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sRAA7rEQAPaxEAD+sRAABrIQAA6yEAAWshAAHrIQACayEAAushAANrIQAD6yEABGshAATrIQAFayEABeshAAZrIQAG6yEAB2shAAfrIQAPSqEAD6qhAAAKsQAAarEAAMqxAAEqsQABirEAAeqxAAJKsQACqrEAAwqxAAN6sQAD6rEABFqxAATKsQAFOrEABaqxAAYasQAGirEABvqxAAdqsQAH2rEACEqxAAi6sQAJKrEACZqxAAoKsQAKerEACuqxAAtasQALyrEADDqxAAyqsQANGrEADYqxAA36sQAOarEADtqxAA9KsQAPurEAACrBAACawQABCsEAAXrBAAHqwQACWsEAAsrBAAM6wQADqsEABBrBAASKwQAE+sEABWrBAAXawQAGSsEABrrBAAcqwQAHmsEACArBAAh6wQAI6sEACVrBAAnKwQAKOsEACqrBAAsawQALisEAC/rBAAxqwQAM2sEADUrBAA26wQAOKsEADprBAA8KwQAPesEAD+rBAABa0QAAytEAATrRAAGq0QACGtEAAorRAAL60QADatEAA9rRAARK0QAEutEABSrRAAWa0QAGCtEABnrRAAbq0QAHWtEAB8rRAAg60QAIqtEACRrRAAmK0QAJ+tEACmrRAArq0QALatEAC+rRAAxq0QAM6tEADWrRAA3q0QAOatEADurRAA9q0QAP6tEAAGrhAADq4QABauEAAerhAAJq4QAC6uEAA2rhAAPq4QAEauEABOrhAAVq4QAF6uEABmrhAAbq4QAHauEAB+rhAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAABqmRAAbJkQAG6ZEABwmRAAcpkQAHSZEAB2mRAAeJkQAHqZEAB8mRAAf5kQAIKZEACFmRAAiJkQAIuZEACOmRAAkZkQANSpEADkqRAA9KkQAASqEAAEqhAAFKoQACSqEAA0qhAARKoQAFSqEABkqhAAdKoQAISqEACUqhAApKoQALSqEADEqhAA1KoQAOSqEABEohAARKIQAESiEABEohAARKIQAESiEABEohAARKIQAESiEABEohAARKIQAESiEABEohAARKIQAESiEABEohAARKIQAESiEABEohAARKIQAESiEABEohAARKIQAESiEABEohAARKIQAESiEABEohAARKIQAESiEABEohAARKIQAESiEABEohAARKIQAESiEABEohAARKIQAESiEABEohAARKIQAESiEABEohAARKIQAESiEABEohAARKIQAESiEABEohAARKIQAESiEABEohAARKIQAESiEABEohAARKIQAESiEABEohAARKIQAESiEABEohAARKIQAESiEABEohAARKIQAESiEABEohAARKIQAESiEABEohAARKIQAESiEABEohAARKIQAESiEABEohAARKIQAESiEABEohAARKIQAESiEABEohAARKIQAESiEABEohAARKIQAESiEABEohAARKIQAESiEABEohAARKIQAESiEABEohAARKIQAESiEABEohAARKIQAESiEABEohAARKIQAESiEABEohAARKIQAESiEABEohAARKIQAESiEABEohAARKIQAFSiEABkohAAdKIQAISiEACUohAApKIQALSiEADEohAA1KIQAOSiEAD0ohAABKMQABSjEAAkoxAANKMQAESjEABUoxAAZKMQAHSjEACEoxAAlKMQAKSjEAC0oxAAtKMQAMSjEADUoxAA5KMQAPSjEAAEpBAAFKQQACSkEAA0pBAARKQQAFSkEABkpBAAZKQQAHSkEACEpBAAlKQQAKSkEAC0pBAAtKQQAMSkEADUpBAA5KQQAPSkEAAEpRAAFKUQACSlEAA0pRAARKUQAFSlEABUpRAAZKUQAHSlEACEpRAAlKUQAKSlEAC0pRAAxKUQANSlEADkpRAA9KUQAASmEAAUphAAJKYQADSmEABEphAAVKYQAGSmEABkphAAdKYQAISmEACUphAApKYQALSmEADEphAAxKYQANSmEADkphAA9KYQAASnEAAUpxAABKUQACSnEAA0pxAARKcQAFSnEABkpxAAdKcQAISnEACUpxAApKcQALSnEADEpxAA1KcQAOSnEAD0pxAABKgQABSoEAAkqBAANKgQAESoEABUqBAAZKgQAHSoEACEqBAAlKgQAKSoEAC0qBAAxKgQANSoEADkqBAA9KgQAASpEAAUqRAAJKkQADSpEABEqRAAVKkQAGSpEAB0qRAAhKkQAJSpEACkqRAAtKkQAMSpEAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAAGLYQACC2EAAothAAMLYQADi2EABAthAASLYQAFC2EABYthAAYLYQAGi2EABwthAAeLYQAIC2EACIthAAkLYQAJi2EACgthAAqLYQALC2EAC4thAAwLYQAMi2EADQthAA2LYQAOC2EADothAA8LYQAPi2EAAAtxAACLcQABC3EAAYtxAAILcQACi3EAAwtxAAOLcQAEC3EABItxAAULcQAFi3EABgtxAAaLcQAHC3EAB4txAAgLcQAIi3EACQtxAAmLcQAKC3EACotxAAsLcQALi3EADAtxAAyLcQANC3EADYtxAA4LcQAOi3EADwtxAA+LcQAAC4EAAIuBAAELgQABi4EAAguBAAKLgQADC4EAA4uBAAQLgQAEi4EABQuBAAWLgQAGC4EABouBAAcLgQAHi4EACAuBAAiLgQAJC4EACYuBAAoLgQAKi4EACwuBAAuLgQAMC4EADIuBAA0LgQANi4EADguBAA6LgQAPC4EAD4uBAAALkQAAi5EAAQuRAAGLkQACC5EAAouRAAMLkQADi5EABAuRAASLkQAFC5EABYuRAAYLkQAGi5EABwuRAAeLkQAIC5EACIuRAAkLkQAJi5EACguRAAqLkQALC5EAC4uRAAwLkQAMi5EADQuRAA2LkQAOC5EADouRAA8LkQAPi5EAAAuhAACLoQABC6EACGshAAjLIQAJKyEACYshAAnrIQAKSyEACqshAAsLIQALayEAC8shAAwrIQAMmyEADQshAA17IQAN6yEADlshAA7LIQAPOyEAD6shAAAbMQAAizEAAPsxAAFrMQAB2zEAAksxAAK7MQADKzEAA5sxAAQLMQAEezEABOsxAAVbMQAFyzEABjsxAAarMQAHGzEAB4sxAAf7MQAIazEACNsxAAlLMQAJuzEACisxAAqbMQALCzEAC3sxAAvrMQAMWzEADMsxAA07MQANqzEADhsxAA6LMQAO+zEAD2sxAA/bMQAAS0EAALtBAAErQQABm0EAAgtBAAJ7QQAC60EAA1tBAAPLQQAEO0EABKtBAAUbQQAFi0EABftBAAZrQQAG20EAB0tBAAe7QQAIK0EACJtBAAkLQQAJe0EACe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", "base64"); + var bytes = Buffer2.from("AGFzbQEAAAABzgRJYAJ/fwBgAX8AYAJ/fwF/YAN/f38Bf2ADf39/AGABfwF/YAR/f39/AGAFf39/f38AYAZ/f39/f38AYAR/f39/AX9gAAF/YAd/f39/f39/AGADf39/AX5gA39+fwBgBX9/f39/AX9gAX8BfmACf38BfmAHf39/f39/fwF/YAN/fn4AYAAAYAZ/f39/f38Bf2ACfn8AYAJ/fgBgA39+fgF/YAF+AX5gAn5+AGAEf35/fwBgBH9/f34AYAN/f34Bf2ABfgBgBH98f38Bf2ANf39/f39/f39/f39/fwBgAn98AGAGf39/f35/AGAPf39/f39/f39/f39/f39/AX9gBH9/fn8AYAZ/f39+f38AYAN/fn8Bf2ACf34Bf2AEfn5/fwF+YAN+f38AYAJ+fwF/YAJ+fgF+YAN/f34AYA5/f39/f39/f39/f39/fwF/YAh/f39/f39/fwF/YAl/f39/f39/f38AYAR/fn9+AX5gCX9/f39/f35+fgBgBX9/f39/AXxgAXwBfGAGf39+f35/AGADfn9/AX9gAX8BfGAFf39/f34AYAN/f38BfGAXf39/f39/f39/f39/f39/f39/f39/f38Bf2ATf39/f39/f39/f39/f39/f39/fwF/YAt/f39/f39/f39/fwF/YAR/f398AGABfAF/YAR+fn5/AX5gBH9+fn8AYAR/f39/AXxgB35+fn9/f38BfmAAAX5gAn5/AX5gA398fwBgBX9/fX9/AGAEf31/fwBgBX9/fH9/AGAEf3x/fwBgBX9/fn9/AAKmEisYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fFV9fd2JpbmRnZW5fc3RyaW5nX25ldwACGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxVfX3diaW5kZ2VuX3N0cmluZ19nZXQAABhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18UX193YmluZGdlbl9pc19zdHJpbmcABRhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18UX193YmluZGdlbl9pc19vYmplY3QABRhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18XX193YmluZGdlbl9pc191bmRlZmluZWQABRhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18NX193YmluZGdlbl9pbgACGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19uZXdfMTA3Mzk3MDA5N2U1YTQyMAACGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxNfX3diaW5kZ2VuX2lzX2ZhbHN5AAUYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fJF9fd2JnX2dldHdpdGhyZWZrZXlfZWRjMmM4OTYwZjBmMTE5MQACGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXx1fX3diZ19sZW5ndGhfZjIxN2JiYmY3ZThlNGRmNAAFGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19nZXRfNTQxOWNmNmI5NTRhYTExZAACGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19uZXdfZTY5YjVmNjZmZGE4ZjEzYwAKGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19zZXRfZjk3NTEwMjIzNmQzYzUwMgAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diaW5kZ2VuX29iamVjdF9kcm9wX3JlZgABGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxZfX3diaW5kZ2VuX2Jvb2xlYW5fZ2V0AAUYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fG19fd2JnX3NlbGZfYmY5MWJmOTRkOWUwNDA4NAAKGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXx1fX3diZ193aW5kb3dfNTJkZDlmMDdkMDNmZDVmOAAKGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXyFfX3diZ19nbG9iYWxUaGlzXzA1YzEyOWJmMzdmY2YxYmUAChhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18dX193YmdfZ2xvYmFsXzNlY2ExOWJiMDllOWM0ODQAChhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18gX193YmdfbmV3bm9hcmdzXzFlZGU0YmYyZWJiYWFmNDMAAhhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18bX193YmdfY2FsbF9hOWVmNDY2NzIxZTgyNGYyAAIYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fG19fd2JnX2NhbGxfM2JmYTI0ODU3NjM1MjQ3MQADGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXx1fX3diZ19sZW5ndGhfOTI1NGM0YmQzYjlmMjNjNAAFGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxFfX3diaW5kZ2VuX21lbW9yeQAKGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXx1fX3diZ19idWZmZXJfY2NhZWQ1MWE2MzVkOGEyZAAFGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19uZXdfZmVjMjYxMWViOTE4MGY5NQAFGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19zZXRfZWMyZmNmODFiYzU3M2ZkOQAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxRfX3diaW5kZ2VuX2Vycm9yX25ldwACGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxlfX3diaW5kZ2VuX2pzdmFsX2xvb3NlX2VxAAIYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fFV9fd2JpbmRnZW5fbnVtYmVyX2dldAAAGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXyxfX3diZ19pbnN0YW5jZW9mX1VpbnQ4QXJyYXlfZGYwNzYxNDEwNDE0ZWYzNgAFGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXy1fX3diZ19pbnN0YW5jZW9mX0FycmF5QnVmZmVyXzc0OTQ1NTcwYjRhNjJlYzcABRhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18eX193YmdfZW50cmllc19jMDIwMzRkZTMzN2QzZWUyAAUYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fG19fd2JpbmRnZW5fb2JqZWN0X2Nsb25lX3JlZgAFGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxdfX3diaW5kZ2VuX2RlYnVnX3N0cmluZwAAGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxBfX3diaW5kZ2VuX3Rocm93AAAYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fG19fd2JnX3RoZW5fNzQ4Zjc1ZWRmYjAzMjQ0MAACGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXyVfX3diZ19xdWV1ZU1pY3JvdGFza19jNTQxOWMwNmVhYjQxZTczAAEYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fJV9fd2JnX3F1ZXVlTWljcm90YXNrXzg0OGFhNDk2OTEwOGE1N2UABRhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18WX193YmluZGdlbl9pc19mdW5jdGlvbgAFGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXx5fX3diZ19yZXNvbHZlXzBhYWQ3YzE0ODQ3MzFjOTkABRhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18SX193YmluZGdlbl9jYl9kcm9wAAUYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fHl9fd2JpbmRnZW5fY2xvc3VyZV93cmFwcGVyNzI4MQADA5Auji4ICAAAAAQGBAQEBgYEBAcHBxEUBgYeAAYEAAQGAgcEBAAAAAAABAQAAAIIBAAAAAgHBwQAAwUEBAYGBAgEAAYAAgIGAAALCwgABgYAAgYCBgAGBgYJAAAACAQECAYAAAAAAgAOCR8fAAYGBgQEAgIHCAgEBAIAAAQIBAAHCwAHAAAGAAAICAggAAAFAgUGBAAGBAAEISEHCwgGBAIBBAAEAAADAgQECwQGCAALAAAHEQcHBwcAAAAABwIAAAcAAAAABAQEAAAEAAQIAgYGBgAAAA4FBQkGAgYEAQQAAAYGAAABAgUAAQEBCAAIAAQCCAcFBwAEBAAKAAEAAQABBAQLBwEEBgAAAAcEAQQBBAYHBgABAwEBCAYBAgYAAAECBwYACAABAAQABAEEBAAEBAAEBgEBAQEBAQcHAwEBAQAGBgAGBgAAAQAAAAsJAQsACQQAAAAEBAUiAAcCAgssBwMCBAAAAAAGBAYGBgAFAQQJAgQLCwABCwgCAAUBAAABAwMHAAEAAAcCAQAtABEGAgABBQAAAAkABgQGAAQEBAAJAAAHCAcGAAEAAAQEAgEBBAEHAAACBgUBAAcBAQYCBAMDBwAABx4CAQYABAMHBwAAAAQEAAICAgAFAAAUAwAICAIABgEGCAQuAwAOAwkBAQEAAAAEBAYEBgMIBgAGBgADAwYAAAIBAAADCAQABAIABAAEBgYABAAAAwIAAAgIBgEEBBoEAgAJAAEACAAAAAAAAAAAAQEAAgAUCAYGAAYCAAAvAAEEAgEBAQEBAQEBAAEBAwEACAMCAQEBAAIEAgEBAQEBAQEBAQEBAQEUAAAAAAQEAAEBBAAECwACAAAHAAQAAAMBAQYLBwEAAAcGAwEPEgIBAQkABAIIAAAAAgQIBwAFBQUAAQEBAQEAAQEBAQQFBgQAAQcBABUBAAAEAQIGAgQEAwAHAAAAAAAAAAAIAAQCMAQAAggAAAEABAcFCgQAAAAEGgIAAgEABAQGAgQECAYGBgEEBAIBAAAEAgYGAwAEEQAABAAAAAEABgEGAA8AMQYEAAYGBgIFBAIUBAUFBQACAgQEAAcBAAEyAgQCBgAABAQIBQAAAgYGEQAAMwQEAAAGAgEBAQEBDgQFBAsPASMDNBsEBgcFAgQGBwIAAAIICAMAAgQCAwgEAAADAgc1AAcAAQEEAQAABwQCAgAEAAYIBAAEAgAABwcGBgIFAgABAAQEBAACAgABAAAEAAQEBgYAAAQ2AAABAAIAAgEHAQgJBAEHAgYGAgACAwEGBAUBJAABAAIAAAAEAAkCAgIJAgMAAAA3BAEIAAAAAgUIAAEBCAAEBAcDAwgCAAkEAAEFAgQACAAIBAAEACQEAgAAAAQNAAABBQEDCAABAAECAAQECQQAAAICAQAlAQEAAAEABAgRAgAEDwANBAAABgIHAgQAAgACAgEAAQECBAQBAgAEAAQEAgYGAAEAAQUABAQAAQICBAIAAAgIAgAABgEAAQIEAQAIAAYEBAAAAgAACAQJCQMEAAAAAAEACAgABAQBBAECAAEEBgAACQAAAAECAgABFgEDAQAEAAQBBgEAAAAGBAAAAQEBAQEBBAEAAAYEBAMBAQAEBQABAQIHAQECBgQAAQAAAgQHBAYGBAQDAQQGABYAAgQACDgBBwAEAAADAAQGAQECBAQCBwYACQgBAgAEAAQACAQABAICBAECAAEFEQYDAgICADkJEAQDAQQACQACBAYAAQEEBAEADgABAgcAAAABAgQAAwYCBgACBQIGBwQAAAIiAgADBgQCAgIBAQMCAAYCCwIEBAQGAAYEAAAGBiYAAAAGAgIEAwAFAwQABAUECAICOgABAAEFBAUJAAUIBgYGBgMFAAAAAAMLAwAABQUICAIABgIAAgQAAAAAAAQDAAUAAAACEQQCAgABAgIAAgQAAQEBAQAAAAAFBQAFFg4QBgYCAgEGBgIAAAAGAAAGBgIBAgIBAAEBAQYIBQUFAAAAAAAAAQAAAQEEBQQAAAAAAAAGAQAAAAMGBgMAAgAFAgAAAAAAAAAAAAAEBAEHBQQFAgAABQICAgIPAAAAAAECAAIFBgIAAAAFAAICAQMHAAAABQACAAICAgIAAQMDBAALAAUCAAAFAQABAgECAAsCAgICAgICAgICAgICAgICAQAEAgEGAQAABAIAAAAAAgICAgIJAAAACQICAgIAAgIABAAEBAICAgIAAAQCAgICAgICAgICAgICAgICAgUAAAAAAAAAAAQEBgYGAAAFBQUABQAKBQIEAwYCAAAAAAICAQQGAgUEAQUFBQYECQIFAgIWAgAAAAEIAAEIAQgGBgEAAQIAAQcBAwICAwgMBwkAAgIAAgIAAgEBAAEAAgAGAg0OAAEAAgAEBQQABgQABgQFAAIEAAEAAQcCOwAAAAAAAAAAAwASBwMEAAAEAAYCADwGAAADBAAHCAg9AAIFBgYGBggCBQkAAQABBAUEAAAAAQUFAQgDHAAAAgUCAgABBQUAAgAEAAUCAAQBCQUEAQAFAwAFBQgAAQUEBQMHCQAFBAUFAgAFAAAAAAYAAAYABwQABQIACAICAAInJwACBQMAAAAAAAAABQAAAAAAAAAAAAAAAAIDAAAAAAAEAAgEAAIAAQAAAAAGAAABBAQACQAABQAAABICAAUAAAUBAQAABgICAgICAQAGAQIHBAAHAAkAAAcBAQICAgICAgICAgICAgAHAAAAAAcCAgAFBAQEBAAEBAQABAgAAwIABQEAAAABBQgAAAANAQABAQIACAkECQcBBAIAAwABHAADBQEAAhwBBgACAAECBAAFAgIBAwcDAgICAAUBBAABAQYGBgIBAQEBAQEBAQEEAAEAAgQAAQYDAQEABAIFDwEAAgICAgICAgICAgAAAAAAAAAFABMAAD4AAAAEAQkJBQAFAQAHAgICAgIAAAAAAQAAAAYAAQAEAgICCAYAAAAGAgIBAAUEAgIFBQQABQUEAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUABQ0AAAQDAgAABgABAQEBAQAAAAABAQABAAAAAAEBAQEAAQAGAQAAAgACBAIBGAAABwIDCAEAAQEHAQEAAAAAAAQEBQIAAQICAgICAQAAAQAFBAQEAgAAAAYAAgQAAAICAgIGAAICAgAAAgICAgICAgIAAAAQAAAFAAQCAgICAgIAAQUAAgQBAAAECQAFBAIDAQAIAAUGAAYEBAQEBQIAAQAHBAQFBQABAgIHBwABAgICAgICAgICAwIAAAcHBAEBBQICAgICAgICAgICAgICAgICAgICAgIAAAAAAAAPAQEAAAAAAAIEBAICAgIEAAIABAQCBQIAAQIFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAEAAAABAAEAAQYAAgAGAAQEAgUBCAoFBAcCAgIBAgACAQICAgICAgIBKAECAAABAQEBAQEBAgcBAQAEBAICAQQAAQEAAAACAgAEBAEABgEEAAMEBQUFBQAABgYEAgACAAEAAAUFAAEAAQEEAAQAAAADBgoBAAYEAAQAAQcDBAQAAQAAAQEBAAAAAAAAAAEHBgQBBAAGBAEFAQAFAAQBDwABAQYEAAQBAA0FAQEAAAICAgIABgIAAAAAAAAAAAADAAgAAQADAggFAQEEBQQBAQIBAgIAAQEBAAEBAQEBAQECAAICAgECAgICAgQEAgIBAQQCAgECAgICAgICAgICAgICAgECAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIBBQABAAEBAQEBAQEEARABBQABAQEBCAEBAwMBAQECAQAAAQEBAQQCAQUBAQcBCgEBBQEBAQEBAAEBAQEBAAE/AQAAAAAAAAAAAAAAAAAAAgIHAgICAQIAAAcCCQYBAgICAgICAgIIAAICAgABBwECAAICAgIAAQEAAAEFAQEBAQABAgECAAACAQEAAQEBAQEBAQAAAAcAAAAFAAQBBQEEAQUBBQAAAAAFAgAAAAECAAAAAQAAAUACAgEBAAIAAgINAQQABQQABAAJCAQEAgAGAgICBQEFBQMFBQUFBQUFBQUBAQEBAQEBAQABKQEBAQEFAQEBAQUBAAEBAQIAAgsGAABBBAQBCQQJAAQHAwUCAAEAHQEBAQEBAQEBAAAAAQANAAAAAAEBAQwBAAAAAAAAAAEBAQEBAQEBAAEBAQEEAAEAAAABAAEBBAUCDwYCAgIECQYBAQALAgABBQAMDAMCBAABAQEBAQUJBQIGAgIGBQEBAQEBAAEAAQEBAQEGAhcXAAUCAgUAAwYOAgAAAAECAgQAAAICAAAAAAQCAgUFAQICAAAAAAAAAAIMAgYGBgYCAgICAgICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwIHBAICARAQAgUCAAYCAgICAgUAAgIGAAICAgIGBAICAAAFAB0MBhgBAgAAAgIBAQEBAgEBAgACAQENAAABAQEBAQEBAQEBAQUBAQEBAQESARcCAAIAExMBAgEBExMAACAABQMTEwUCAQECAwICAgIJABYCAgICAgICAAICAwICAAABAgUFAAEFAAUBAgEBFQAAAgUCAgIHBwUCAgYCBgcCAgICAgICAgACAgAEBwIABwAEAgMCAQIFBQcHAgUBAwUCKgICBQEBAQEBAQABAQACBQAABQICAgABAQEBAEIAAAAAAAEBAQEAAAAoAAABBQEBAQUFAQEBAAEBAQYABAADAAAABwAEAAABAAEJAAUAAAAAAAUEKgAAAQAAAAQFAAAAAAUBAAUCAgQBAgABAAEAAQQABAASBAABAQIbBwUAEAABAQEMAAACBwYCBwUBAQEBAQEGAQAABQABGwUADQEBAQEBAQEBAQAABAQBAAICBQACAgErASMCCQECAgIAAQEHAgIBAAACAQICAgAAAQAKAQEKAAACAgILBgQEBQEBBAAEAgICAgsCBgYGAgIJAAAAAAABAQEFAQEGBgYGAQEAAAAAAQEBAQECAgIBAwAAAAEHBgQFCQIGAgEBBwcBBAIFBQYpAgIMBgAAAAEFAgICAgIFAAYCAgEBAAAAAAEAAgYAAAAAAAEIAgEAAQAAAAcAAAAJAgEBAQEBAAAAAAYBBQAAAQEAAAkDBQIAAQMDBgAAAAABARABAQAAAwAAAAAAAAAEAgAAABgAAAAAAAEAAAAAAEMAAAEAEAAAAAAAAAMJCQkJAQkDBwcBARQDCQQDAysBAwMDAwcDCQIWCQIJBgIFDAAFBAIMAQEADAIBCQQJAQABCQQBBQQAAQcOREZIAAMBAQUFBRABCQQCAgIDBAQGBgYBAQEBDAIBAQABAQEBAQEBAQEEAAAEBgAFBAQKCgICCQIXFwYAAQEBAQAFAAIBBQAAAAAAFQUCBQEBAQEBCgEBAQEBAQEAAgICAQABAQIFAQEEBQEBAQEEBAUEBAQKAQUFBAQAAQIAAgMJAAQDAQIABQICBAMHBAwBAQEBBQUBAQUBAQEBCgEBDAEBAQEBAAAAAQAAAQEAAQwBAQABAQEBAQEBAQEBCgEBAQEBAQEKBQEBBQEBAAEBBAQCAQEEAQkJAQICAgUEAwIAAQEBAQUBAQEBAgEBAQYGAQEBAQEBAQEBAQEAAAABAAEAAAQAAAAABAQAAAABAQEBAQEBAAAAAAAAAAEBAQAAAAAAAAAAAAABAQEBDAQBAQEBAQEBAQEBAQEBAQEBAAABAQEBAQEAAQQBAQEAAAAAAAAAAAAAAQEBAAEBAQEBBgABAgEBAQEBAQcDAQEAAQAAAQAEAQQCAQoKCgoKAAoKCgoKCgoKAQEAAQEBAQ8KAgUBAQEBAQEBAQEBAQwMAAABAQEBAAAAAQECAQEBAAAAAAUCAgICAQIFCgMBAAQEAwcCAgwFABgBARUBDQEBAQoBAQEBAQoKCgoKBQEEBQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAIAAAAAAAAAAAEBAAABAAABAgEBAAEAAAEBAQEBAQEBAQEAAAIAAAAAAAAAAAABAAAAAAAAAAABAgICAgEEAAMAAgICBAICAgIBEhIAAAIAAQICAgICAgICBAEBAQECAQEBAQEBAQEBAAEFAQEBAQEBAQEBAQECAQEBAQEBAgICAgYCAgICBQUBAQEBAQEBAQEFAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEAAQEBAQEAAQEBAQEAAAAAAAAAAQEBAQEBAQEBAAAAAQEBAQEBAQEAAAABAQEBAQEBAQEAAQAAAAEBAQAAAAEBAQEAAAEBAQEBAAABAQEBAQEAAQEBAQEBAQEBBAMBAwAAAAAABAAAAAABAAAAAAAAAAAAAAEBAQEBAQECAQUFBQMFAgcCAQABAQEBAgUBAAEDAQEGAQEBAQEBAQEBAR0BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQkBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAQEBAQEBAQEBAQEBAQEBARkBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAABAQAAAAABAQEBAQEBAQEAAAEAAgICAgICAQIAAAEAAAAAAAIEBgEBAQEBAgMAAQEB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AgghCiAFKAIEIQMgBSgCACEEIAJBqARqIAVBDGpBJBD8BhogAkGgBGogBUFAaykCADcDACACQZgEaiAFQThqKQIANwMAIAIgBSkCMDcDkAQgBRCLKwsgFyACKQPIAzcDACAXQQhqIB4pAwA3AwAgF0EQaiAdKQMANwMAIAIgATYC8AQgAiARNgLUBCACIBY2AtAEIAIgAkH0Amo2AvgEIAIgAkHgA2o2AvQEIARBgICAgHhHBEAgAiAKNgKIBSACIAM2AoQFIAIgBDYCgAUgLyACQagEakEkEPwGIChBEGogAkGgBGopAwA3AgAgKEEIaiACQZgEaikDADcCACAoIAIpA5AENwIAIAIgCjYC1AUgAiADNgLQBSACIAQ2AswFIAJBBzYC2AUgAiAKQQJPBH8gAkHIB2oiBCACQcwFahCuFSACQdgFaiIDEIklIAMgBEEoEPwGGiAsEOwmIAIoAtAFIQMgAigC1AUhCiACKALMBQUgBAs2AuAGIAIgAzYC2AYgAiADIApBBnRqNgLkBiACIAM2AtwGAkACQCAKBEAgAygCCCEFIAMoAgQhBCADKAIAIQ4gAkHABmoiBiADQRRqKQIANwMAIAJByAZqIgggA0EcaikCADcDACACQdAGaiIKIANBJGooAgA2AgAgAykCDCEyIAJBqAZqIhEgA0EwaikDADcDACACQbAGaiIQIANBOGopAwA3AwAgAiADQUBrNgLcBiACIAMpAyg3A6AGIAIgMjcDuAYgDkEHRw0BCyACKALgAyEEIAIoAuQDIQMgAkESOgDIByABIAQgAyACQcgHahC+GUEFIQ5BACEFQQAhBAwBCyAgIAIpA7gGNwIAICcgAikDoAY3AwAgIEEIaiAGKQMANwIAICBBEGogCCkDADcCACAgQRhqIAooAgA2AgAgJ0EIaiARKQMANwMAICdBEGogECkDADcDACACIAU2AtAHIAIgBDYCzAcgAiAONgLIByACQZgGaiAKKAIANgIAIAJBkAZqIAgpAwA3AwAgAkGIBmogBikDADcDACACIAIpA7gGNwOABiAsEOwmC0EoQQgQoSAiAyAFNgIIIAMgBDYCBCADIA42AgAgAyACKQOABjcCDCADQRRqIAJBiAZqKQMANwIAIANBHGogAkGQBmopAwA3AgAgA0EkaiACQZgGaigCADYCACACQdgGahDP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AiABNgLwBCACIBE2AtQEIAIgFjYC0AQgAiACQfQCajYC+AQgAiACQeADajYC9AQgBEGAgICAeEYNASACIAM2AuwGIAIgBDYC6AYgDyACQdgFakEoEPwGGiAkQRBqIAJBkAZqKQMANwIAICRBCGogAkGIBmopAwA3AgAgJCACKQOABjcCACACKAKoByEGAkAgAS0AoAJBAkcNACABLQDHAg0AIAIoAuQDIQQgAigC4AMhAyACQYABOgCABSABIAMgBCACQYAFahC+GQsgAkHQB2ogFykDADcDACACQdgHaiACQeAEaikDADcDACACQeAHaiACQegEaikDADcDACAjICIpAgA3AgAgI0EIaiAiQQhqKQIANwIAICNBEGogIkEQaikCADcCACACIAIpA9AENwPIByABKAKcAyEEIAIoAvQCIQMgFCACQcgHakE4EPwGGkHwAEEIEKEgIg5BCDYCACAOQQRqIAJBgAVqQTwQ/AYaIA4gBjYCSCAOIAMgBCADIARLGzYCRCAOIAMgBCADIARJGzYCQCACQegGahD6JiAVEOwmIAIoAqQHENkoC0EAIQNBAAwCCyACQdAEahCbFgtBAQshBSACQegDahCEJSACKQOYAxDxGiACKAL4AkUNACACQfgCahCbFgsgBQ0BCyACKALwAiIEIAIoAugCRgRAIAJB6AJqEP4WCyACKALsAiAEQQxsaiIGIDA2AgggBiAONgIEIAYgAzYCACACIARBAWo2AvACIAcQzQ0iBARAIAQoAgBBDkYNBAsgBxDNDSIEBEAgBCgCAEEQRg0CCyACQfAGaiAHEJIQIAIgBxCAFCACQcjE4AA2AuwGIAJBNDoA6AYgAigCACACKAIEIAJB6AZqEP0UIQMgBxDNDSIERQ0AIAQoAgBBJEcNACABIAEpA+ACNwOYAyABKALIAiABQSU2AsgCQSRHDQIgASABKALMAhD/CwsgAkHoAmoQ4iYMAwsgDSAMKQIANwIAIAEoAsgCIQQgAUElNgLIAiABIAEpA+ACNwOYAyANQQhqIAxBCGopAgA3AgAgDUEQaiAMQRBqKAIANgIAIAIgBDYC6AYgAkHoBmoQwgogBxDNDSIERQ0BQQEgKSAEKAIAQQ5GIgQbISkgASkDmAMgMSAEGyExDAELC0Hd6+AAQShBlKzgABDuFwALQQELIQEgAkHEAmoQ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wAUgBEHMAWogBEHABWoQxAQMAgsgZBCJJyAEKALgASIBIAQoAuQBEI4fIAQoAtwBIAEQ3SkMBQtBwN3fABDtFAALIAUhFCADISwMAAsACyABIAEpA+ACNwOYAyABKALIAiABQSU2AsgCQSRGBEAgASABKALMAhD/CwwDC0Hd6+AAQShB9OjfABDuFwALIAkQzQ0EQCABKALIAiEDIAFBJTYCyAIgASABKQPgAjcDmAMgBEHMBWogFUEIaikCADcCACAEQdQFaiAVQRBqKAIANgIAIAQgFSkCADcCxAUgBCADNgLABSAEQcAFahDCCgsgCSAEQagBahDQCCAEQZgBaiAEQcwBahCLBiAEKAKcASEMIAQoApgBIgNBgICAgHhGDQAgACAEKAKgATYCCCAAIAw2AgQgACADNgIAIAAgMiABKAKcAyIBIAEgMkkbNgIQIAAgMiABIAEgMksbNgIMDAILIABBgICAgHg2AgAgACAMNgIEDAELIABBgICAgHg2AgAgACADNgIECyAEQfAHaiQAC6BWAiN/A34jAEHgA2siAyQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAigCAEEBaw4HABYBAgMEBwULIAMgAigCBCIFIAIoAghqNgL0AiADIAU2AvACIAMgATYC+AICQCABLQALQQFxRQRAIANB8ABqIANB8AJqEP4XDAELIANB8ABqIANB8AJqEP8XCyADKAJwIgVBK0YNBCADKAJ4IQIgAygCdCEEIAVBKkcNFCADQdQBaiEIA0ACQCABLQALQQFxRQRAIANByAFqIANB8AJqEP4XDAELIANByAFqIANB8AJqEP8XCyADKALIASIGQStGBEAgACACNgIIIAAgBDYCBCAAQSo2AgAMHAsgAygC0AEhBSADKALMASEHIAZBKkcNFCADQYADaiABIAIgBxDYCCADKAKAAyICQSpGBEAgBSECDAELCyAAQQRqIANBgANqQQRyQTwQ/AYaIAAgAjYCAAwaCyACKAIEaEECdEHw2OMAaigCACECIAEtAAtBAXEEQCACaEECdEG42eMAaigCACECCyADQdAAaiABQSBqQaC3wwAQtx0gAygCVCEBIAMoAlAhBSADIAI2AtABIANCAzcCyAEgA0GAA2ogBSAD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BiAEENgIIAMoAoADIgZBKkYNAAsgAEEEaiACQQRyQTwQ/AYaIAAgBjYCAAweCyABLQALIQZBGEEEEKEgIgtCBDcCECALQgA3AgggC0KAgICAwAA3AgAgAyAGQQFxOgB8IANBATYCeCADIAs2AnQgA0EBNgJwQQEhCkEBIQdBASEEAkACQANAIAUgDEYEQCADQeAAaiABQSBqQaC1wwAQtx0gAygCZCEKIANBgANqIAMoAmAiCBD0HiADKAKEAyEGIAMoAoADIgFBKkcNHSADQQA2ApQCIANCgICAgMAANwKMAiADQZgCaiADKAJ0IAMoAnhBAEHshsQAEMgfEMEKIAatIScgA0GcAmohCSADQbACaiEFIANBpAJqIQcgA0HYAWohDgJAA0AgAygCeCECIAMoAnQhBANAIAMoAsgCIgEgAygCzAJHBEAgAyABQQhqNgLIAiAEIAIgASgCACILQfyGxAAQyB8gATEABCImQiiGICZCIIaEISYoAghFBEAgByAmICeEEL8bDAILIAcgJhC/GyADKAKUAiIPIAMoAowCRgRAIwBBEGsiASQAIAFBCGogA0GMAmoiDCAMKAIAQQFBBEE4EM0IIAEoAggiDEGBgICAeEcEQCAMIAEoAgwQ3CkACyABQRBqJAALIAMoApACIA9BOGxqIANBmAJqIgFBOBD8BhogAyAPQQFqNgKUAiABIAQgAiALQYyHxAAQyB8QwQoMAQsLAkACQAJAAkAgAygCrAIOAgMAAQsgA0EANgKsAiADQYADaiAIIAMoAqgCKQIAEMIdIAMoAoQDIQIgAygCgAMiBEEqRg0BDCMLIANB2AJqIAdBCGooAgA2AgAgAyAHKQIANwPQAiADQQA2AqwCIANCgICAgMAANwKkAiADQYADaiAIIANB0AJqEJ4YIAMoAoQDIQIgAygCgAMiBEEqRg0ADCILIANBmAJqIAIQohsLIANB2ABqIAUQyw0gAygCWCIBBEAgAygCXCECIANBmAJqIAYQohsgAyABNgLIAiADIAEgAkEDdGo2AswCDAELIANB6AJqIANBoAJqKAIANgIAIAMgAykCmAI3A+ACIANBgANqIAggA0HgAmoQnxggAygChAMhAiADKAKAAyIBQSpGBEACQCADKAKUAiIBBEAgAyABQQFrIgE2ApQCIAMoApACIAFBOGxqIgEoAgAi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QTQQ/AYaIAAgBjYCCCAAIAc2AgQgACAENgIADAgLIABBCGogA0GIA2pBOBD8BhogACACNgIEIAAgBTYCAAwHCyAAQQxqIAhBNBD8BhogACAFNgIIIAAgBzYCBCAAIAY2AgAMBgsgAEEMaiADQfwAakE0EPwGGiAAIAI2AgggACAENgIEIAAgBTYCAAwFCwJAAkACQAJAIAIoAgRFBEAgAigCDCIMIAIoAhAiAhDJHw0BAkAgAS0AC0EBcUUEQCADQcgAaiABQSBqQcC1wwAQtx0gAygCTCEFIAMoAkghBCADQUBrIAFB4ABqQdC1wwAQtx0gAygCRCEBIANBgANqIAQgAygCQBDHBiADQdABaiIEIANBjANqKAIANgIAIAMgAykChAM3A8gBIAMoAoADIgZBKkcNASADQfgAaiAEKAIANgIAIAMgAykDyAE3A3AgDCACQQN0aiECA0AgAiAMRgRAIAAgA0HwAGoQ7AYgASABKAIAQQFqNgIAIAUgBSgCAEEBajYCAAwNCyADQcgBaiAMKAIAIAwoAgQQ6hwgDEEIaiEMA0AgA0HgAmogA0HIAWoQ7gIgAy0A4AJBBEYEQCADKALIASADKALMARDgKQwCCyADQfgCaiADQegCai0AADoAACADIAMpAOACNwPwAiADQThqIANB8AJqEK4gIANBgANqIgQgA0HwAGogAygCOCADKAI8EOQEIAMoAoADIgZBKkYNAAsLIABBBGogBEEEckE8EPwGGiAAIAY2AgAgAygCyAEgAygCzAEQ4CkMBgsCQAJAIAEtAAxBAXFFBEAgASgC2AENAiABQX82AtgBIAFB3AFqIQUgASgC5AFFDQEgASABLwHsAUEBaiIEOwHsASAEQf//A3EgBEYNByADQQA2AogDIANCADcDgAMgA0EAOwGMAyADQcgBaiADQYADaiABKALoARD0ByABKALcASABQeABaigCABDoKSAFQQhqIANB0AFqKAIANgIAIAUgAykCyAE3AgAMBwsgASgChAFFBEAgAUF/NgKEASABQYgBaiIQEJ4HIAFBoAFqIRggAUGsAWohGSAMIAJBA3RqIR0gA0HMAWohDyADQfAAakECciEUIANB4QJqIRogAUGwAWohHiABQZABaiEVIAFBjAFqIRYgA0HUAWohHyADQc4BaiEgIANB0QFqISEgAUGkAWoh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IAQgAjYCkAMCQAJAAkACQAJAAkACQAJAAkACQCACQQdrQQAgAkEITxtBAWsOCAABAgMEBQYHCAsgBEGAA2ogBigCADYCACAEIAEpAgA3A/gCIARByAJqIARB+AJqENsQDAgLIARBATYCrAEgBEGkycQANgKoASAEQgA3ArQBIAQgBEHQAGo2ArABIARBqAFqQazJxAAQuh0ACyAEQQE2AqwBIARBjMrEADYCqAEgBEIANwK0ASAEIARB0ABqNgKwASAEQagBakGUysQAELodAAsgBEEBNgKsASAEQfTKxAA2AqgBIARCADcCtAEgBCAEQdAAajYCsAEgBEGoAWpB/MrEABC6HQALIARBATYCrAEgBEHYy8QANgKoASAEQgA3ArQBIAQgBEHQAGo2ArABIARBqAFqQeDLxAAQuh0ACyAEQQE2AqwBIARBxMzEADYCqAEgBEIANwK0ASAEIARB0ABqNgKwASAEQagBakHMzMQAELodAAsgBEEINgLIAgwCCyAEQQE2AqwBIARBtM3EADYCqAEgBEIANwK0ASAEIARB0ABqNgKwASAEQagBakG8zcQAELodAAsgBEHgAmogBEGoA2ooAgA2AgAgBEHYAmogBEGgA2opAgA3AwAgBEHQAmogBEGYA2opAgA3AwAgBCAEKQKQAzcDyAILIAJBCU8EQCAEQZADahD6FAsgBCgCyAJBCEYNAiAEQagBaiADEJcMIAQoAqgBQRBGDQ0gBEGoA2ogBEHAAWooAgA2AgAgBEGgA2ogBEG4AWopAgA3AwAgBEGYA2ogBEGwAWopAgA3AwAgBCAEKQKoASIWNwOQAyAWp0EPRw0OIARBkANqEPoUIARBvAJqIARByAJqELsQDAELCyAEQQg2AsgCCyAEQcgCahDjJCAEKALAAiAEKALEAhCqCCAEQagBaiIBIARBvAJqEFkgAyABEJsYDBMLIARBADYCnAIgBEKAgICAwAA3ApQCIAEoAgAhBSAEQZQDaiEBIARBrAFqIQMDQCAEQagBaiAFEJcMAkACQCAEKAKoASICQRBHBEAgASADKQIANwIAIAFBEGogA0EQaikCADcCACABQQhqIgYgA0EIaikCADcCACAEIAI2ApADAkACQAJAAkACQAJAAkACQAJAAkAgAkEHa0EAIAJBCE8bQQFrDggAAQIDBAUGBwgLIARBgANq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chCMCiABEJoIIARBhANqIARB7AJqKQIANwIAIAQgBCkC5AI3AvwCIARBATYC+AIgBEGQA2ogBEH4AmoQygkMBgsgBkEBcQ0CIANBAE4NAUECIQgMBgsgBUEBcQ0DIARB/AJqQYD+AxCMCiAEQQE2AvgCIARBkANqIARB+AJqEMoJDAQLIARB5AJqIgEgA61C/wGDIhZCIIYgFoQQ/gkgARCyCCAEQYQDaiAEQewCaikCADcCACAEIAQpAuQCNwL8AiAEQQA2AvgCIARBkANqIARB+AJqEMoJDAMLIARCjoCAgPD/vwg3AogDIARCi4CAgMABNwKAAyAEQoCAgICQATcC+AIgBEHoAmohBSMAQUBqIgEkACABQTBqIARB+AJqIgNBEGopAgA3AwAgAUEoaiADQQhqKQIANwMAIAEgAykCADcDICABQQhqQQNBBEEIEPkUQQAhAyABQQA2AhggASABKQMINwMQIAFBEGpBAxD+HiABKAIYIgdBA2ohBiABKAIUIAdBA3RqIQcDQCADQRhHBEAgAyAHaiABQSBqIANqKQIANwIAIANBCGohAwwBCwsgASkDECEWIAFBKGoiAyAGNgIAIAEgBkU6ACwgASAWNwMgIAFBIGoQiAUgBUEIaiADKQMANwIAIAUgASkDIDcCACABQUBrJAAgBEEANgLkAiAEQZADaiAEQeQCahDKCQwCCyAEQY7+AzsA6AIgBEGAkqzgADYA5AIgBEH8AmohBSMAQTBrIgEkACABQSxqIARB5AJqIgNBBGovAAA7AQAgASADKAAANgIoIAFBCGpBA0EBQQIQ+RQgAUEANgIYIAEgASkDCDcDECABQRBqQQMQ/x4gASgCGCIDQQNqIQYgASgCFCADQQF0aiEHQXohAwNAIAMEQCADIAdqQQZqIAEgA2pBLmovAQA7AAAgA0ECaiEDDAELCyABKQMQIRYgAUEoaiIDIAY2AgAgASAGRToALCABIBY3AyAgAUEgahD8BCAFQQhqIAMpAwA3AgAgBSABKQMgNwIAIAFBMGokACAEQQE2AvgCIARBkANqIARB+AJqEMoJDAELIARB/AJqQoCAgIDw/78IEP4JIARBADYC+AIgBEGQA2ogBEH4AmoQygkLIARBxAFqIARBqANqKAIANgIAIARBvAFqIARBoANqKQIANwIAIARBtAFqIARBmANqKQIANwIAIAQgBCkCkAM3AqwBDAELIARBqAFqIAEoAgQgASgCCCAEQdAAaiAIEN4YIAQoAqgBIgFBgICAgHhHDQILIARByABqIARBxAFqKAIANgIAIARBQGsgBEG8AWopAgA3AwAgBEE4aiAEQbQBaikCADcDACAEIAQpAqwBNwMwIAIgBEEwahCbGAsgAEGAgICAeDYCAAwBCyAEQcgAaiAEQcQBaigCACICNgIAIARBQGsgBEG8AWopAgAiFjcDACAEQThqIARBtAFqKQIAIhc3AwAgBCAEKQKsASIYNwMwIAQpAsgBIRkgAEEcaiACNgIAIABBFGogFjcCACAAQQxqIBc3AgAgACAYNwIEIAAgGTcCICAAIAE2AgALIARBsANqJAAL3CsCGn8EfiMAQaAKayIDJAACQAJAAkACQAJAAkACQAJAAkAgAwJ/AkACQAJAAkACQAJAAkAgASkDACIdUEUEQCABKQMIIh5QDQEgASkDECIfUA0CIB0gH3wiICAdVA0DIB0gHlQNBCABLAAaIRMgAS4BGCEBIAMgHT4CACADQQFBAiAdQoCAgIAQVCIEGzYCoAEgA0EAIB1CIIinIAQbNgIEIANBCGpBAEGYARCKCxogAyAePgKkASADQQFBAiAeQoCAgIAQVCIEGzYCxAIgA0EAIB5CIIinIAQbNgKoASADQawBakEAQZgBEIoLGiADIB8+AsgCIANBAUECIB9CgICAgBBUIgQbNgLoAyADQQAgH0IgiKcgBBs2AswCIANB0AJqQQBBmAEQigsaIANB8ANqQQBBnAEQigsaIANBATYC7AMgA0EBNgKMBSABrCAgQgF9eX1CwprB6AR+QoChzaC0AnxCIIinIgTBIQ8CQCABQQBOBEAgAyABEIUFGiADQaQBaiABEIUFGiADQcgCaiABEIUFGgwBCyADQewDakEAIAFrwRCFBRoLAkAgD0EASARAIANBACAPa0H//wNxIgEQhwIgA0GkAWogARCHAiADQcgCaiABEIcCDAELIANB7ANqIARB//8BcRCHAgsgAygCoAEhByADQfwIaiADQaABEPwGGiADIAc2ApwKIAcgAygC6AMiCCAHIAhLGyIEQShLDRACQCAERQRAQQAhBAwBCwJAAkAgBEEBRwRAIARBAXEgBEE+cSENIANByAJqIQYgA0H8CGohAQNAIAEg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IAogCkEHaiIDIAMgCksbIAogAyADIApJGyACQdABahC/ESABQQYQvwUgARDpCCACQagBaiABELsODAELIAMQzhdB/wFxQQdHBEAgAkGoAWogARC7DgwBCyABKAKsASEHIAJBADYCyAEgAkKAgICAEDcCwAEgCiEDAkADQAJAAkACQAJAAkACQAJAAkACQCAEIAYQ9BwiBUHcAGsOBQIBAQEIAAsgBUEkRwRAIAVBgIDEAEcNASACQR86ANABIAJBiAJqIAcgASgC0AEgAkHQAWoQ2iEgAigCjAIhBSACKAKIAiIEQSZHDQQgAkHAAWoQhR4MDwsgBCAGEKIcQfsARg0HCyAFEIQeDQEgCBCvFQwFCyACKALAAUGAgICAeEcEQCACQdAAaiAIIAMgASgC0AEQzhUgAkHAAWogAigCUCACKAJUEO0dCyACQYgCaiABQQEQ+gICQAJAIAIoAogCIgRBgICAgHhrDgIFAAELIAIoAowCIQQgAkHAAWoQhR4gAiAENgLEASACQYCAgIB4NgLAAQwECyACKAKMAiEFIAIoAsABQYCAgIB4RwRAIAIoApACIQMgAiAENgLYASACIAU2AtABIAIgBSADQQJ0IgRqIgM2AtwBA0AgBARAIAJBwAFqIAUoAgAQ2QIgBEEEayEEIAVBBGohBQwBBSACIAM2AtQBIAJB0AFqEOkpDAYLAAsACyAEIAUQ2SkMAwsgAUEBOgC9ASACKALAAUGAgICAeEcEQCACQTBqIAggAyABKALQARDOFSACQcABaiACKAIwIAIoAjQQ7R0LAkACQAJAIAVBCmsOBAQCAgABC0EKIQUgASgCwAEgASgCxAEQohxBCkcNAyAIEK8VDAMLIAVBqMAAa0ECSQ0CC0Hd6+AAQShB4O7YABDuFwALIAIpA5gCIRQgAikDkAIhFSACQcABahCFHiAEQSVGDQoMBQsgCBCvFSACKALAAUGAgICAeEYNACACQcABaiAFEP4HCyABKALQASEDCyABKALEASEGIAEoAsABIQQMAQsLAkACQAJ/AkACQAJAIAEoAtABIgQgCkYEQCABLQC6AUECRg0BCyADIApGIgYNASACKALAAUGAgICAeEYNAiACQcgAaiAIIAMgBBDOFSACQcABaiIEIAIoAkggAigCTBDtHSACKALAAUGAgICAeEYNAiABKALoAUEI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aiAGQaQPai0AADoAACAGIAc6ALgNIAYgBigCoA82ALkNIAYgCTYCtA0gBiA0NgKwDSAGQcCf4wApAwAiPzcDoA0gBkGgDWohEkEAIQRCACE9QQAhBUEAIQkjAEHgBmsiCiQAAkAgBkHQB2oiFykDACI8pyITDQAgEi0AGw0AIBcoAiBBOGwhCyAXKAIcIQ4DQCALRQ0BIA4gC0E4ayILaiIHKAIAIghBBUsNAAsgB0E4aiEHAn8CQAJAAkACQAJAAkACQAJAIAhBAWsOBwECAwQFBgcACyAHQSBrIQggB0EkawwHCyAHQQRrIQggB0EIawwGCyAHQSRrIQggB0EoawwFCyAHQQRrIQggB0EIawwECyAHQSxrIQggB0EwawwDCyAHQSxrIQggB0EwawwCCyAHQTRrKAIAIgdBJGohCCAHQSBqDAELIAdBLGshCCAHQTBrCygCACEtIAgoAgAhLkEBISELIBdBGGohMAJAIBItABgiHwR+IDwFIBItABohFCAKQagGaiIYQcCf4wApAwAiPjcDACAKQbAGaiIWQcif4wApAwAiPTcDACAKQaAGaiIaIBJBCGoiCCkCADcDACASKQIAITwgEiA+NwIAIAggPTcCACAKIDw3A5gGIApBmANqID03AwAgCkGgA2ogPjcDACAKQagDaiA9NwMAIApBmAFqID03AwAgCkGoAWogPTcDACAKQaABaiA+NwMAIAogPjcDkAMgCkGQBWoiAyA9NwMAIApBmAVqIgsgPjcDACAKQaAFaiIPID03AwAgCkEAOgDQASAKID43A5ABIAogPjcDiAUgCkHIAWoiDiA9NwMAIApBwAFqIgcgPjcDACAKQbgBaiIIID03AwAgCiA+NwOwASAKIBQ6AMgFIA8gFikDADcDACALIBgpAwA3AwAgAyAaKQMANwMAIAogCikDmAY3A4gFIApBwAVqIA4pAwA3AwAgCkG4BWogBykDADcDACAKQbAFaiAIKQMANwMAIAogCikDsAE3A6gFIApBqAVqIRQCQCATRQRAIApByAVqIRogFygCHCIHIBcoAiBBOGwiC2ohAyAHIQgDQCALBEAgC0E4ayELIAggCkGIBWoQpgMgCEE4aiEIDAELCyAKQbgFaiEYA0ACQAJAAkACQAJAAkACQAJAIAMgByIORwRAIAdBOGohByAOKAIAIghBCUYN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ENQaNwPYAyADQgA3A+ADIANB4CZqIgQgA0HYA2oQnBwgA0HAA2oiByAEKQMANwMAIANByANqIgggA0HoJmopAwA3AwAgA0HQA2oiBCADQfAmaikDADcDACADQgA3A7gDQdei2gBBJRDUGiE8QcgAEOMgIgVCADcDOCAFQQA6ADQgBSAJNgIwIAVCADcDKCAFID03AyAgBUEYaiAEKQMANwMAIAVBEGogCCkDADcDACAFQQhqIAcpAwA3AwAgBSADKQO4AzcDACAFQUBrQQA6AAAgA0EBNgLkJiADIAU2AuAmIANBATYC3CZBGBDjICIEQgA3AwggBCA8NwMAIANB8iZqQgA3AQAgBEEQakIANwMAIANCADcC7CYgAyAENgLoJiADQQA2AtgmIA0gA0HYJmoQ9hkLIA4tAAoEQEEAIA8oAgAQigQhCUH8otoAQQwQ1BohPSADQazI3wBBARDUGjcDiAQgA0IANwOQBCADQeAmaiIEIANBiARqEJwcIANB8ANqIgcgBCkDADcDACADQfgDaiIIIANB6CZqKQMANwMAIANBgARqIgQgA0HwJmopAwA3AwAgA0IANwPoA0GIo9oAQRsQ1BohPEHIABDjICIFQgA3AzggBUEAOgA0IAUgCTYCMCAFQgA3AyggBSA9NwMgIAVBGGogBCkDADcDACAFQRBqIAgpAwA3AwAgBUEIaiAHKQMANwMAIAUgAykD6AM3AwAgBUFAa0EAOgAAIANBATYC5CYgAyAFNgLgJiADQQE2AtwmQRgQ4yAiBEIANwMIIAQgPDcDACADQfImakIANwEAIARBEGpCADcDACADQgA3AuwmIAMgBDYC6CYgA0EANgLYJiANIANB2CZqEPYZCyAOLQALBEBBACAPKAIAEIoEIQlBo6PaAEELENQaIT0gA0GsyN8AQQEQ1Bo3A7gEIANCADcDwAQgA0HgJmoiBCADQbgEahCcHCADQaAEaiIHIAQpAwA3AwAgA0GoBGoiCCADQegmaikDADcDACADQbAEaiIEIANB8CZqKQMANwMAIANCADcDmARBrqPaAEEaENQaITxByAAQ4yAiBUIANwM4IAVBADoANCAFIAk2AjAgBUIANwMoIAUgPTcDICAFQRhqIAQpAwA3AwAgBUEQaiAIKQMANwMAIAVBCGogBykDADcDACAFIAMpA5gENwMAIAVBQGtBADoAACADQQE2AuQmIAMgBTYC4CYgA0EBNgLcJkEYEOMgIgRCADcDCCAEIDw3AwAgA0HyJmpCADcBACAEQRBqQgA3AwAgA0IANwLsJiADIAQ2AugmIANBADYC2CYgDSADQdgmahD2GQsgDi0ADARAQQAgDygCABCKBCEJQcij2gBBHBDUGiE9IANBrMjfAEEBENQaNwPoBCADQgA3A/AEIANB4CZqIgQgA0HoBGoQnBwgA0HQBGoiByAEKQMANwMAIANB2ARqIgggA0HoJmopAwA3AwAgA0HgBGoiBCADQfAmaikDADcDACADQgA3A8gEQeSj2gBBKxDUGiE8QcgAEOMgIgVCADcDOCAFQQA6ADQgBSAJNgIwIAVCADcDKCAFID03AyAgBUEYaiAEKQMANwMAIAVBEGogCCkDADcDACAFQQhqIAcpAwA3AwAgBSADKQPIBDcDACAFQUBrQQA6AAAgA0EBNgLkJiADIAU2AuAmIANBATYC3CZBGBDjICIEQgA3AwggBCA8NwMAIANB8iZqQgA3AQAgBEEQakIANwMAIANCADcC7CYgAyAENgLoJiADQQA2AtgmIA0gA0HYJmoQ9hkLIA4tAA0EQEEAIA8oAgAQigQhCUGPpNoAQSMQ1BohPSADQazI3wBBARDUGjcDmAUgA0IANwOgBSADQeAmaiIEIANBmAVqEJwcIANBgAVqIgcgBCkDADcDACADQYgFaiIIIANB6CZqKQMANwMAIANBkAVqIgQgA0HwJmopAwA3AwAgA0IANwP4BEGypNoAQTIQ1BohPEHIABDjICIFQgA3AzggBUEAOgA0IAUgCTYCMCAFQgA3AyggBSA9NwMgIAVBGGogBCkDADcDACAFQRBqIAgpAwA3AwAgBUEIaiAHKQMANwMAIAUgAykD+AQ3AwAgBUFAa0EAOgAAIANBATYC5CYgAyAFNgLgJiADQQE2AtwmQRgQ4yAiBEIANwMIIAQgPDcDACADQfImakIANwEAIARBEGpCADcDACADQgA3AuwmIAMgBDYC6CYgA0EANgLYJiANIANB2CZqEPYZCyAOLQAOBEBBACAPKAIAEIoEIQlB5KTaAEEbENQaIT0gA0GsyN8AQQEQ1Bo3A8gFIANCADcD0AUgA0HgJmoiBCADQcgFahCcHCADQbAFaiIHIAQpAwA3AwAgA0G4BWoiCCADQegmaikDADcDACADQcAFaiIEIANB8CZqKQMANwMAIANCADcDqAVB/6TaAEEqENQaITxByAAQ4yAiBUIANwM4IAVBADoANCAFIAk2AjAgBUIANwMoIAUgPTcDICAFQRhqIAQpAwA3AwAgBUEQaiAIKQMANwMAIAVBCGogBykDADcDACAFIAMpA6gFNwMAIAVBQGtBADoAACADQQE2AuQmIAMgBTYC4CYgA0EBNgLcJkEYEOMgIgRCADcDCCAEIDw3AwAgA0HyJmpCADcBACAEQRBqQgA3AwAgA0IANwLsJiADIAQ2AugmIANBADYC2CYgDSADQdgmahD2GQsgDi0ADwRAQQAgDygCABCKBCEJQaml2gBBGxDUGiE9IANBrMjfAEEBENQaNwP4BSADQgA3A4AGIANB4CZqIgQgA0H4BWoQnBwgA0HgBWoiByAEKQMANwMAIANB6AVqIgggA0HoJmopAwA3AwAgA0HwBWoiBCADQfAmaikDADcDACADQgA3A9gFQcSl2gBBKhDUGiE8QcgAEOMgIgVCADcDOCAFQQA6ADQgBSAJNgIwIAVCADcDKCAFID03AyAgBUEYaiAEKQMANwMAIAVBEGogCCkDADcDACAFQQhqIAcpAwA3AwAgBSADKQPYBTcDACAFQUBrQQA6AAAgA0EBNgLkJiADIAU2AuAmIANBATYC3CZBGBDjICIEQgA3AwggBCA8NwMAIANB8iZqQgA3AQAgBEEQakIANwMAIANCADcC7CYgAyAENgLoJiADQQA2AtgmIA0gA0HYJmoQ9hkLIA4tABAEQEEAIA8oAgAQigQhCUHupdoAQR4Q1BohPSADQazI3wBBARDUGjcDqAYgA0IANwOwBiADQeAmaiIEIANBqAZqEJwcIANBkAZqIgcgBCkDADcDACADQZgGaiIIIANB6CZqKQMANwMAIANBoAZqIgQgA0HwJmopAwA3AwAgA0IANwOIBkGMptoAQS0Q1BohPEHIABDjICIFQgA3AzggBUEAOgA0IAUgCTYCMCAFQgA3AyggBSA9NwMgIAVBGGogBCkDADcDACAFQRBqIAgpAwA3AwAgBUEIaiAHKQMANwMAIAUgAykDiAY3AwAgBUFAa0EAOgAAIANBATYC5CYgAyAFNgLgJiADQQE2AtwmQRgQ4yAiBEIANwMIIAQgPDcDACADQfImakIANwEAIARBEGpCADcDACADQgA3AuwmIAMgBDYC6CYgA0EANgLYJiANIANB2CZqEPYZCyAOLQARBEBBACAPKAIAEIoEIQlBuabaAEERENQaIT0gA0GsyN8AQQEQ1Bo3A9gGIANCADcD4AYgA0HgJmoiBCADQdgGahCcHCADQcAGaiIHIAQpAwA3AwAgA0HIBmoiCCADQegmaikDADcDACADQdAGaiIEIANB8CZqKQMANwMAIANCADcDuAZByqbaAEEgENQaITxByAAQ4yAiBUIANwM4IAVBADoANCAFIAk2AjAgBUIANwMoIAUgPTcDICAFQRhqIAQpAwA3AwAgBUEQaiAIKQMANwMAIAVBCGogBykDADcDACAFIAMpA7gGNwMAIAVBQGtBADoAACADQQE2AuQmIAMgBTYC4CYgA0EBNgLcJkEYEOMgIgRCADcDCCAEIDw3AwAgA0HyJmpCADcBACAEQRBqQgA3AwAgA0IANwLsJiADIAQ2AugmIANBADYC2CYgDSADQdgmahD2GQsgDi0AEgRAQQAgDygCABCKBCEJQeqm2gBBLBDUGiE9IANBrMjfAEEBENQaNwOIByADQgA3A5AHIANB4CZqIgQgA0GIB2oQnBwgA0HwBmoiByAEKQMANwMAIANB+AZqIgggA0HoJmopAwA3AwAgA0GAB2oiBCADQfAmaikDADcDACADQgA3A+gGQZan2gBBOxDUGiE8QcgAEOMgIgVCADcDOCAFQQA6ADQgBSAJNgIwIAVCADcDKCAFID03AyAgBUEYaiAEKQMANwMAIAVBEGogCCkDADcDACAFQQhqIAcpAwA3AwAgBSADKQPoBjcDACAFQUBrQQA6AAAgA0EBNgLkJiADIAU2AuAmIANBATYC3CZBGBDjICIEQgA3AwggBCA8NwMAIANB8iZqQgA3AQAgBEEQakIANwMAIANCADcC7CYgAyAENgLoJiADQQA2AtgmIA0gA0HYJmoQ9hkLIA4tABMEQEEAIA8oAgAQigQhCUHRp9oAQR8Q1BohPSADQazI3wBBARDUGjcDuAcgA0IANwPAByADQeAmaiIEIANBuAdqEJwcIANBoAdqIgcgBCkDADcDACADQagHaiIIIANB6CZqKQMANwMAIANBsAdqIgQgA0HwJmopAwA3AwAgA0IANwOYB0Hwp9oAQS4Q1BohPEHIABDjICIFQgA3AzggBUEAOgA0IAUgCTYCMCAFQgA3AyggBSA9NwMgIAVBGGogBCkDADcDACAFQRBqIAgpAwA3AwAgBUEIaiAHKQMANwMAIAUgAykDmAc3AwAgBUFAa0EAOgAAIANBATYC5CYgAyAFNgLgJiADQQE2AtwmQRgQ4yAiBEIANwMIIAQgPDcDACADQfImakIANwEAIARBEGpCADcDACADQgA3AuwmIAMgBDYC6CYgA0EANgLYJiANIANB2CZqEPYZCyAOLQAUBEBBACAPKAIAEIoEIQlBnqjaAEEVENQaIT0gA0GsyN8AQQEQ1Bo3A+gHIANCADcD8AcgA0HgJmoiBCADQegHahCcHCADQdAHaiIHIAQpAwA3AwAgA0HYB2oiCCADQegmaikDADcDACADQeAHaiIEIANB8CZqKQMANwMAIANCADcDyAdBs6jaAEEkENQaITxByAAQ4yAiBUIANwM4IAVBADoANCAFIAk2AjAgBUIANwMoIAUgPTcDICAFQRhqIAQpAwA3AwAgBUEQaiAIKQMANwMAIAVBCGogBykDADcDACAFIAMpA8gHNwMAIAVBQGtBADoAACADQQE2AuQmIAMgBTYC4CYgA0EBNgLcJkEYEOMgIgRCADcDCCAEIDw3AwAgA0HyJmpCADcBACAEQRBqQgA3AwAgA0IANwLsJiADIAQ2AugmIANBADYC2CYgDSADQdgmahD2GQsgDi0AFQRAQQAgDygCABCKBCEJQdeo2gBBGBDUGiE9IANBrMjfAEEBENQaNwOYCCADQgA3A6AIIANB4CZqIgQgA0GYCGoQnBwgA0GACGoiByAEKQMANwMAIANBiAhqIgggA0HoJmopAwA3AwAgA0GQCGoiBCADQfAmaikDADcDACADQgA3A/gHQe+o2gBBJxDUGiE8QcgAEOMgIgVCADcDOCAFQQA6ADQgBSAJNgIwIAVCADcDKCAFID03AyAgBUEYaiAEKQMANwMAIAVBEGogCCkDADcDACAFQQhqIAcpAwA3AwAgBSADKQP4BzcDACAFQUBrQQA6AAAgA0EBNgLkJiADIAU2AuAmIANBATYC3CZBGBDjICIEQgA3AwggBCA8NwMAIANB8iZqQgA3AQAgBEEQakIANwMAIANCADcC7CYgAyAENgLoJiADQQA2AtgmIA0gA0HYJmoQ9hkLIA4tABYEQEEAIA8oAgAQigQhCUGWqdoAQRkQ1BohPSADQazI3wBBARDUGjcDyAggA0IANwPQCCADQeAmaiIEIANByAhqEJwcIANBsAhqIgcgBCkDADcDACADQbgIaiIIIANB6CZqKQMANwMAIANBwAhqIgQgA0HwJmopAwA3AwAgA0IANwOoCEGvqdoAQSgQ1BohPEHIABDjICIFQgA3AzggBUEAOgA0IAUgCTYCMCAFQgA3AyggBSA9NwMgIAVBGGogBCkDADcDACAFQRBqIAgpAwA3AwAgBUEIaiAHKQMANwMAIAUgAykDqAg3AwAgBUFAa0EAOgAAIANBATYC5CYgAyAFNgLgJiADQQE2AtwmQRgQ4yAiBEIANwMIIAQgPDcDACADQfImakIANwEAIARBEGpCADcDACADQgA3AuwmIAMgBDYC6CYgA0EANgLYJiANIANB2CZqEPYZCyAOLQAXBEBBACAPKAIAEIoEIQlB16naAEEfENQaIT0gA0GsyN8AQQEQ1Bo3A/gIIANCADcDgAkgA0HgJmoiBCADQfgIahCcHCADQeAIaiIHIAQpAwA3AwAgA0HoCGoiCCADQegmaikDADcDACADQfAIaiIEIANB8CZqKQMANwMAIANCADcD2AhB9qnaAEEuENQaITxByAAQ4yAiBUIANwM4IAVBADoANCAFIAk2AjAgBUIANwMoIAUgPTcDICAFQRhqIAQpAwA3AwAgBUEQaiAIKQMANwMAIAVBCGogBykDADcDACAFIAMpA9gINwMAIAVBQGtBADoAACADQQE2AuQmIAMgBTYC4CYgA0EBNgLcJkEYEOMgIgRCADcDCCAEIDw3AwAgA0HyJmpCADcBACAEQRBqQgA3AwAgA0IANwLsJiADIAQ2AugmIANBADYC2CYgDSADQdgmahD2GQsgDi0AGARAQQAgDygCABCKBCEJQaSq2gBBHhDUGiE9IANBrMjfAEEBENQaNwOoCSADQgA3A7AJIANB4CZqIgQgA0GoCWoQnBwgA0GQCWoiByAEKQMANwMAIANBmAlqIgggA0HoJmopAwA3AwAgA0GgCWoiBCADQfAmaikDADcDACADQgA3A4gJQcKq2gBBLRDUGiE8QcgAEOMgIgVCADcDOCAFQQA6ADQgBSAJNgIwIAVCADcDKCAFID03AyAgBUEYaiAEKQMANwMAIAVBEGogCCkDADcDACAFQQhqIAcpAwA3AwAgBSADKQOICTcDACAFQUBrQQA6AAAgA0EBNgLkJiADIAU2AuAmIANBATYC3CZBGBDjICIEQgA3AwggBCA8NwMAIANB8iZqQgA3AQAgBEEQakIANwMAIANCADcC7CYgAyAENgLoJiADQQA2AtgmIA0gA0HYJmoQ9hkLIA4tABkEQEEAIA8oAgAQigQhCUHvqtoAQRgQ1BohPSADQazI3wBBARDUGjcD2AkgA0IANwPgCSADQeAmaiIEIANB2AlqEJwcIANBwAlqIgcgBCkDADcDACADQcgJaiIIIANB6CZqKQMANwMAIANB0AlqIgQgA0HwJmopAwA3AwAgA0IANwO4CUGHq9oAQScQ1BohPEHIABDjICIFQgA3AzggBUEAOgA0IAUgCTYCMCAFQgA3AyggBSA9NwMgIAVBGGogBCkDADcDACAFQRBqIAgpAwA3AwAgBUEIaiAHKQMANwMAIAUgAykDuAk3AwAgBUFAa0EAOgAAIANBATYC5CYgAyAFNgLgJiADQQE2AtwmQRgQ4yAiBEIANwMIIAQgPDcDACADQfImakIANwEAIARBEGpCADcDACADQgA3AuwmIAMgBDYC6CYgA0EANgLYJiANIANB2CZqEPYZCyAOLQAaBEBBACAPKAIAEIoEIQlBrqvaAEEbENQaIT0gA0GsyN8AQQEQ1Bo3A4gKIANCADcDkAogA0HgJmoiBCADQYgKahCcHCADQfAJaiIHIAQpAwA3AwAgA0H4CWoiCCADQegmaikDADcDACADQYAKaiIEIANB8CZqKQMANwMAIANCADcD6AlByavaAEEqENQaITxByAAQ4yAiBUIANwM4IAVBADoANCAFIAk2AjAgBUIANwMoIAUgPTcDICAFQRhqIAQpAwA3AwAgBUEQaiAIKQMANwMAIAVBCGogBykDADcDACAFIAMpA+gJNwMAIAVBQGtBADoAACADQQE2AuQmIAMgBTYC4CYgA0EBNgLcJkEYEOMgIgRCADcDCCAEIDw3AwAgA0HyJmpCADcBACAEQRBqQgA3AwAgA0IANwLsJiADIAQ2AugmIANBADYC2CYgDSADQdgmahD2GQsgDi0AGwRAQQAgDygCABCKBCEJQfOr2gBBGRDUGiE9IANBrMjfAEEBENQaNwO4CiADQgA3A8AKIANB4CZqIgQgA0G4CmoQnBwgA0GgCmoiByAEKQMANwMAIANBqApqIgggA0HoJmopAwA3AwAgA0GwCmoiBCADQfAmaikDADcDACADQgA3A5gKQYys2gBBKBDUGiE8QcgAEOMgIgVCADcDOCAFQQA6ADQgBSAJNgIwIAVCADcDKCAFID03AyAgBUEYaiAEKQMANwMAIAVBEGogCCkDADcDACAFQQhqIAcpAwA3AwAgBSADKQOYCjcDACAFQUBrQQA6AAAgA0EBNgLkJiADIAU2AuAmIANBATYC3CZBGBDjICIEQgA3AwggBCA8NwMAIANB8iZqQgA3AQAgBEEQakIANwMAIANCADcC7CYgAyAENgLoJiADQQA2AtgmIA0gA0HYJmoQ9hkLIA4tABwEQEEAIA8oAgAQigQhCUG0rNoAQRoQ1BohPSADQazI3wBBARDUGjcD6AogA0IANwPwCiADQeAmaiIEIANB6ApqEJwcIANB0ApqIgcgBCkDADcDACADQdgKaiIIIANB6CZqKQMANwMAIANB4ApqIgQgA0HwJmopAwA3AwAgA0IANwPICkHOrNoAQSkQ1BohPEHIABDjICIFQgA3AzggBUEAOgA0IAUgCTYCMCAFQgA3AyggBSA9NwMgIAVBGGogBCkDADcDACAFQRBqIAgpAwA3AwAgBUEIaiAHKQMANwMAIAUgAykDyAo3AwAgBUFAa0EAOgAAIANBATYC5CYgAyAFNgLgJiADQQE2AtwmQRgQ4yAiBEIANwMIIAQgPDcDACADQfImakIANwEAIARBEGpCADcDACADQgA3AuwmIAMgBDYC6CYgA0EANgLYJiANIANB2CZqEPYZCyAOLQAdBEBBACAPKAIAEIoEIQlB96zaAEEZENQaIT0gA0GsyN8AQQEQ1Bo3A5gLIANCADcDoAsgA0HgJmoiBCADQZgLahCcHCADQYALaiIHIAQpAwA3AwAgA0GIC2oiCCADQegmaikDADcDACADQZALaiIEIANB8CZqKQMANwMAIANCADcD+ApBkK3aAEEoENQaITxByAAQ4yAiBUIANwM4IAVBADoANCAFIAk2AjAgBUIANwMoIAUgPTcDICAFQRhqIAQpAwA3AwAgBUEQaiAIKQMANwMAIAVBCGogBykDADcDACAFIAMpA/gKNwMAIAVBQGtBADoAACADQQE2AuQmIAMgBTYC4CYgA0EBNgLcJkEYEOMgIgRCADcDCCAEIDw3AwAgA0HyJmpCADcBACAEQRBqQgA3AwAgA0IANwLsJiADIAQ2AugmIANBADYC2CYgDSADQdgmahD2GQsgDi0AHgRAQQAgDygCABCKBCEJQbit2gBBJBDUGiE9IANBrMjfAEEBENQaNwPICyADQgA3A9ALIANB4CZqIgQgA0HIC2oQnBwgA0GwC2oiByAEKQMANwMAIANBuAtqIgggA0HoJmopAwA3AwAgA0HAC2oiBCADQfAmaikDADcDACADQgA3A6gLQdyt2gBBMxDUGiE8QcgAEOMgIgVCADcDOCAFQQA6ADQgBSAJNgIwIAVCADcDKCAFID03AyAgBUEYaiAEKQMANwMAIAVBEGogCCkDADcDACAFQQhqIAcpAwA3AwAgBSADKQOoCzcDACAFQUBrQQA6AAAgA0EBNgLkJiADIAU2AuAmIANBATYC3CZBGBDjICIEQgA3AwggBCA8NwMAIANB8iZqQgA3AQAgBEEQakIANwMAIANCADcC7CYgAyAENgLoJiADQQA2AtgmIA0gA0HYJmoQ9hkLIA4tAB8EQEEAIA8oAgAQigQhCUGPrtoAQSQQ1BohPSADQazI3wBBARDUGjcD+AsgA0IANwOADCADQeAmaiIEIANB+AtqEJwcIANB4AtqIgcgBCkDADcDACADQegLaiIIIANB6CZqKQMANwMAIANB8AtqIgQgA0HwJmopAwA3AwAgA0IANwPYC0GzrtoAQTMQ1BohPEHIABDjICIFQgA3AzggBUEAOgA0IAUgCTYCMCAFQgA3AyggBSA9NwMgIAVBGGogBCkDADcDACAFQRBqIAgpAwA3AwAgBUEIaiAHKQMANwMAIAUgAykD2As3AwAgBUFAa0EAOgAAIANBATYC5CYgAyAFNgLgJiADQQE2AtwmQRgQ4yAiBEIANwMIIAQgPDcDACADQfImakIANwEAIARBEGpCADcDACADQgA3AuwmIAMgBDYC6CYgA0EANgLYJiANIANB2CZqEPYZCyAOLQAgBEBBACAPKAIAEIoEIQlB5q7aAEEiENQaIT0gA0GsyN8AQQEQ1Bo3A6gMIANCADcDsAwgA0HgJmoiBCADQagMahCcHCADQZAMaiIHIAQpAwA3AwAgA0GYDGoiCCADQegmaikDADcDACADQaAMaiIEIANB8CZqKQMANwMAIANCADcDiAxBiK/aAEExENQaITxByAAQ4yAiBUIANwM4IAVBADoANCAFIAk2AjAgBUIANwMoIAUgPTcDICAFQRhqIAQpAwA3AwAgBUEQaiAIKQMANwMAIAVBCGogBykDADcDACAFIAMpA4gMNwMAIAVBQGtBADoAACADQQE2AuQmIAMgBTYC4CYgA0EBNgLcJkEYEOMgIgRCADcDCCAEIDw3AwAgA0HyJmpCADcBACAEQRBqQgA3AwAgA0IANwLsJiADIAQ2AugmIANBADYC2CYgDSADQdgmahD2GQsgDi0AIQRAQQAgDygCABCKBCEJQbmv2gBBChDUGiE9IANBrMjfAEEBENQaNwPYDCADQgA3A+AMIANB4CZqIgQgA0HYDGoQnBwgA0HADGoiByAEKQMANwMAIANByAxqIgggA0HoJmopAwA3AwAgA0HQDGoiBCADQfAmaikDADcDACADQgA3A7gMQcOv2gBBGRDUGiE8QcgAEOMgIgVCADcDOCAFQQA6ADQgBSAJNgIwIAVCADcDKCAFID03AyAgBUEYaiAEKQMANwMAIAVBEGogCCkDADcDACAFQQhqIAcpAwA3AwAgBSADKQO4DDcDACAFQUBrQQA6AAAgA0EBNgLkJiADIAU2AuAmIANBATYC3CZBGBDjICIEQgA3AwggBCA8NwMAIANB8iZqQgA3AQAgBEEQakIANwMAIANCADcC7CYgAyAENgLoJiADQQA2AtgmIA0gA0HYJmoQ9hkLIA4tACIEQEEAIA8oAgAQigQhCUHcr9oAQQ0Q1BohPSADQazI3wBBARDUGjcDiA0gA0IANwOQDSADQeAmaiIEIANBiA1qEJwcIANB8AxqIgcgBCkDADcDACADQfgMaiIIIANB6CZqKQMANwMAIANBgA1qIgQgA0HwJmopAwA3AwAgA0IANwPoDEHpr9oAQRwQ1BohPEHIABDjICIFQgA3AzggBUEAOgA0IAUgCTYCMCAFQgA3AyggBSA9NwMgIAVBGGogBCkDADcDACAFQRBqIAgpAwA3AwAgBUEIaiAHKQMANwMAIAUgAykD6Aw3AwAgBUFAa0EAOgAAIANBATYC5CYgAyAFNgLgJiADQQE2AtwmQRgQ4yAiBEIANwMIIAQgPDcDACADQfImakIANwEAIARBEGpCADcDACADQgA3AuwmIAMgBDYC6CYgA0EANgLYJiANIANB2CZqEPYZCyAOLQAjBEBBACAPKAIAEIoEIQlBhbDaAEEJENQaIT0gA0GsyN8AQQEQ1Bo3A7gNIANCADcDwA0gA0HgJmoiBCADQbgNahCcHCADQaANaiIHIAQpAwA3AwAgA0GoDWoiCCADQegmaikDADcDACADQbANaiIEIANB8CZqKQMANwMAIANCADcDmA1BjrDaAEEYENQaITxByAAQ4yAiBUIANwM4IAVBADoANCAFIAk2AjAgBUIANwMoIAUgPTcDICAFQRhqIAQpAwA3AwAgBUEQaiAIKQMANwMAIAVBCGogBykDADcDACAFIAMpA5gNNwMAIAVBQGtBADoAACADQQE2AuQmIAMgBTYC4CYgA0EBNgLcJkEYEOMgIgRCADcDCCAEIDw3AwAgA0HyJmpCADcBACAEQRBqQgA3AwAgA0IANwLsJiADIAQ2AugmIANBADYC2CYgDSADQdgmahD2GQsgDi0AJARAQQAgDygCABCKBCEJQaaw2gBBCRDUGiE9IANBrMjfAEEBENQaNwPoDSADQgA3A/ANIANB4CZqIgQgA0HoDWoQnBwgA0HQDWoiByAEKQMANwMAIANB2A1qIgggA0HoJmopAwA3AwAgA0HgDWoiBCADQfAmaikDADcDACADQgA3A8gNQa+w2gBBGBDUGiE8QcgAEOMgIgVCADcDOCAFQQA6ADQgBSAJNgIwIAVCADcDKCAFID03AyAgBUEYaiAEKQMANwMAIAVBEGogCCkDADcDACAFQQhqIAcpAwA3AwAgBSADKQPIDTcDACAFQUBrQQA6AAAgA0EBNgLkJiADIAU2AuAmIANBATYC3CZBGBDjICIEQgA3AwggBCA8NwMAIANB8iZqQgA3AQAgBEEQakIANwMAIANCADcC7CYgAyAENgLoJiADQQA2AtgmIA0gA0HYJmoQ9hkLIA4tACUEQEEAIA8oAgAQigQhCUHHsNoAQR0Q1BohPSADQazI3wBBARDUGjcDmA4gA0IANwOgDiADQeAmaiIEIANBmA5qEJwcIANBgA5qIgcgBCkDADcDACADQYgOaiIIIANB6CZqKQMANwMAIANBkA5qIgQgA0HwJmopAwA3AwAgA0IANwP4DUHksNoAQSwQ1BohPEHIABDjICIFQgA3AzggBUEAOgA0IAUgCTYCMCAFQgA3AyggBSA9NwMgIAVBGGogBCkDADcDACAFQRBqIAgpAwA3AwAgBUEIaiAHKQMANwMAIAUgAykD+A03AwAgBUFAa0EAOgAAIANBATYC5CYgAyAFNgLgJiADQQE2AtwmQRgQ4yAiBEIANwMIIAQgPDcDACADQfImakIANwEAIARBEGpCADcDACADQgA3AuwmIAMgBDYC6CYgA0EANgLYJiANIANB2CZqEPYZCyAOLQAmBEBBACAPKAIAEIoEIQlBkLHaAEEQENQaIT0gA0GsyN8AQQEQ1Bo3A8gOIANCADcD0A4gA0HgJmoiBCADQcgOahCcHCADQbAOaiIHIAQpAwA3AwAgA0G4DmoiCCADQegmaikDADcDACADQcAOaiIEIANB8CZqKQMANwMAIANCADcDqA5BoLHaAEEfENQaITxByAAQ4yAiBUIANwM4IAVBADoANCAFIAk2AjAgBUIANwMoIAUgPTcDICAFQRhqIAQpAwA3AwAgBUEQaiAIKQMANwMAIAVBCGogBykDADcDACAFIAMpA6gONwMAIAVBQGtBADoAACADQQE2AuQmIAMgBTYC4CYgA0EBNgLcJkEYEOMgIgRCADcDCCAEIDw3AwAgA0HyJmpCADcBACAEQRBqQgA3AwAgA0IANwLsJiADIAQ2AugmIANBADYC2CYgDSADQdgmahD2GQsgDi0AJwRAQQAgDygCABCKBCEJQb+x2gBBDBDUGiE9IANBrMjfAEEBENQaNwP4DiADQgA3A4APIANB4CZqIgQgA0H4DmoQnBwgA0HgDmoiByAEKQMANwMAIANB6A5qIgggA0HoJmopAwA3AwAgA0HwDmoiBCADQfAmaikDADcDACADQgA3A9gOQcux2gBBGxDUGiE8QcgAEOMgIgVCADcDOCAFQQA6ADQgBSAJNgIwIAVCADcDKCAFID03AyAgBUEYaiAEKQMANwMAIAVBEGogCCkDADcDACAFQQhqIAcpAwA3AwAgBSADKQPYDjcDACAFQUBrQQA6AAAgA0EBNgLkJiADIAU2AuAmIANBATYC3CZBGBDjICIEQgA3AwggBCA8NwMAIANB8iZqQgA3AQAgBEEQakIANwMAIANCADcC7CYgAyAENgLoJiADQQA2AtgmIA0gA0HYJmoQ9hkLIA4tACgEQEEAIA8oAgAQigQhCUHmsdoAQQgQ1BohPSADQazI3wBBARDUGjcDqA8gA0IANwOwDyADQeAmaiIEIANBqA9qEJwcIANBkA9qIgcgBCkDADcDACADQZgPaiIIIANB6CZqKQMANwMAIANBoA9qIgQgA0HwJmopAwA3AwAgA0IANwOID0HusdoAQRcQ1BohPEHIABDjICIFQgA3AzggBUEAOgA0IAUgCTYCMCAFQgA3AyggBSA9NwMgIAVBGGogBCkDADcDACAFQRBqIAgpAwA3AwAgBUEIaiAHKQMANwMAIAUgAykDiA83AwAgBUFAa0EAOgAAIANBATYC5CYgAyAFNgLgJiADQQE2AtwmQRgQ4yAiBEIANwMIIAQgPDcDACADQfImakIANwEAIARBEGpCADcDACADQgA3AuwmIAMgBDYC6CYgA0EANgLYJiANIANB2CZqEPYZCyAOLQApBEBBACAPKAIAEIoEIQlBhbLaAEEEENQaIT0gA0GsyN8AQQEQ1Bo3A9gPIANCADcD4A8gA0HgJmoiBCADQdgPahCcHCADQcAPaiIHIAQpAwA3AwAgA0HID2oiCCADQegmaikDADcDACADQdAPaiIEIANB8CZqKQMANwMAIANCADcDuA9BibLaAEETENQaITxByAAQ4yAiBUIANwM4IAVBADoANCAFIAk2AjAgBUIANwMoIAUgPTcDICAFQRhqIAQpAwA3AwAgBUEQaiAIKQMANwMAIAVBCGogBykDADcDACAFIAMpA7gPNwMAIAVBQGtBADoAACADQQE2AuQmIAMgBTYC4CYgA0EBNgLcJkEYEOMgIgRCADcDCCAEIDw3AwAgA0HyJmpCADcBACAEQRBqQgA3AwAgA0IANwLsJiADIAQ2AugmIANBADYC2CYgDSADQdgmahD2GQsgDi0AKgRAQQAgDygCABCKBCEJQZyy2gBBERDUGiE9IANBrMjfAEEBENQaNwOIECADQgA3A5AQIANB4CZqIgQgA0GIEGoQnBwgA0HwD2oiByAEKQMANwMAIANB+A9qIgggA0HoJmopAwA3AwAgA0GAEGoiBCADQfAmaikDADcDACADQgA3A+gPQa2y2gBBIBDUGiE8QcgAEOMgIgVCADcDOCAFQQA6ADQgBSAJNgIwIAVCADcDKCAFID03AyAgBUEYaiAEKQMANwMAIAVBEGogCCkDADcDACAFQQhqIAcp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NgIwIAdCADcDKCAHID03AyAgB0EYaiADQdAhaikDADcDACAHQRBqIANByCFqKQMANwMAIAdBCGogBCkDADcDACAHIAMpA7ghNwMAIAdBQGtBADoAACADQQE2AuQmIAMgBzYC4CYgA0EBNgLcJkEYEOMgIgRCADcDCCAEIDw3AwAgA0HyJmpCADcBACAEQRBqQgA3AwAgA0IANwLsJiADIAQ2AugmIANBADYC2CYgDSADQdgmahD2GQsgDi0AWgRAQQAgDygCABCKBCEIQfjG2gBBJBDUGiE9IANBrMjfAEEBENQaNwOIIiADQgA3A5AiIANB8CFqIgQgA0GIImoQnBwgA0IANwPoIUGcx9oAQTMQ1BohPEHIABDjICIHQgA3AzggB0EAOgA0IAcgCDYCMCAHQgA3AyggByA9NwMgIAdBGGogA0GAImopAwA3AwAgB0EQaiADQfghaikDADcDACAHQQhqIAQpAwA3AwAgByADKQPoITcDACAHQUBrQQA6AAAgA0EBNgLkJiADIAc2AuAmIANBATYC3CZBGBDjICIEQgA3AwggBCA8NwMAIANB8iZqQgA3AQAgBEEQakIANwMAIANCADcC7CYgAyAENgLoJiADQQA2AtgmIA0gA0HYJmoQ9hkLIA4tAFsEQEEAIA8oAgAQigQhCEHPx9oAQQwQ1BohPSADQazI3wBBARDUGjcDuCIgA0IANwPAIiADQaAiaiIEIANBuCJqEJwcIANCADcDmCJB28faAEEbENQaITxByAAQ4yAiB0IANwM4IAdBADoANCAHIAg2AjAgB0IANwMoIAcgPTcDICAHQRhqIANBsCJqKQMANwMAIAdBEGogA0GoImopAwA3AwAgB0EIaiAEKQMANwMAIAcgAykDmCI3AwAgB0FAa0EAOgAAIANBATYC5CYgAyAHNgLgJiADQQE2AtwmQRgQ4yAiBEIANwMIIAQgPDcDACADQfImakIANwEAIARBEGpCADcDACADQgA3AuwmIAMgBDYC6CYgA0EANgLYJiANIANB2CZqEPYZCyAOLQBcBEBBACAPKAIAEIoEIQhB9sfaAEENENQaIT0gA0GsyN8AQQEQ1Bo3A+giIANCADcD8CIgA0HQImoiBCADQegiahCcHCADQgA3A8giQYPI2gBBHBDUGiE8QcgAEOMgIgdCADcDOCAHQQA6ADQg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AmogDUEIaikCADcCACADQdwCaiANQRBqKAIANgIAIAMgDSkCADcCzAIgAyACNgLIAiADQcgCahDDCgJAIAgQ5w0iAgRAIAIoAgBBIkYNAQsgA0HIAmoiAiABEK8DIAMoAsgCIQUgAy0A9AIiBkEGRg0OIANB6AVqQQRyIAJBBHJBKBD8BhogA0GXBmogA0H3AmotAAA6AAAgAyADLwD1AjsAlQYgAyAGOgCUBiADIAU2AugFIAgQ5w0iAgRAIAIoAgBBIkYNBQsgA0HQAmogCBDrCyADQTBqIAgQsxQgA0HQgeAANgLMAiADQTQ6AMgCIAMoAjAgAygCNCADQcgCahD9FCEFIAgQ5w0iAkUNCCACKAIAQSRHDQggASABKQNANwN4IAEoAiggAUElNgIoQSRHDQUgASABKAIsEIYMDAgLIAEoAighAiABQSU2AiggASABKQNANwN4IANB1AJqIA1BCGopAgA3AgAgA0HcAmogDUEQaigCADYCACADIA0pAgA3AswCIAMgAjYCyAIgA0HIAmoQwwogCyABKAJ8IgIgAiALSxshFiALIAIgAiALSRshCkEGIQYMBgtBoAFBCBChICIGIAU2AgAgBiAHKQIANwIEIAZBDGogB0EIaikCADcCACAGQRRqIAdBEGopAgA3AgAgBkEcaiAHQRhqKQIANwIAIAZBJGogFkHsABD8BhogBiALNgKQASAGIBopAgA3ApQBIAZBnAFqIBpBCGooAgA2AgAgBiEFQQMLIQYgEiADKQPoBTcDACASQRhqIANBgAZqKQMANwMAIBJBEGogA0H4BWopAwA3AwAgEkEIaiADQfAFaikDADcDACADIAU2AuwDIAMgBjYC6AMgA0HoA2ohCgwHC0Hd6+AAQShBkIHgABDuFwALIAEoAighAiABQSU2AiggASABKQNANwN4IANB1AJqIA1BCGopAgA3AgAgA0HcAmogDUEQaigCADYCACADIA0pAgA3AswCIAMgAjYCyAIgA0HIAmoQwwogASgCfCECIANBmAVqIANB6AVqQSwQ/AYaIANBqgZqIANBlQZqIgVBAmotAAA6AAAgAyAFLwAAOwGoBiALIAIgAiALSxshFiALIAIgAiALSRshCgwCC0Hd6+AAQShB6IHgABDuFwALQd3r4ABBKEG4gOAAEO4XAAsgA0GcAmoiAiADQZgFakEsEPwGGiADQZoCaiIFIANBqgZqLQAAOgAAIAMgAy8BqAY7AZgCIANB4AFqEIYhIAMgCjYC5AEgAyAWNgLgASADQegBaiACQSwQ/AYaIANBlwJqIAUtAAA6AAAgAyAGOgCUAiADIAMvAZgCOwCVAgwHCyADQegFahDKFwwFCyABKALYAiEBIANBADoAyAIgASABIANByAJqEP0UIQUMBAsgAygC1AEgDkYEQCADQdQBahCNFwsgAygC2AEgAmogCkEoEPwGGiADIA5BAWoiDjYC3AEgAkEoaiECDAELCyADQegFahC0KQwBCyABKAIsIQULIABBgYCAgHg2ApABIAAgBTYCACADQeABahCGISADQdQBahDqJiATQYCAgIB4Rg0BIANBgAFqEL8jDAELIBsgASgCfCIFIAUgG0sbIQIgGyAFIAUgG0kbIQUgA0GVAmohCyADQegBaiESAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIBNBgICAgHhGBEAgBkEGaw4CAgEDCyADQcABaiEOIANBiAFqIQcgBkEGaw4CBAMFC0Hd6+AAQShB6P/fABDuFwALQYCAgIB4IQEgAygC2AEhByADKALUASEGIAIhGSAFIRoMDAsgAyAKNgLMAiADIBY2AsgCIANB0AJqIBJBLBD8BiECIANB/wJqIAtBAmotAAA6AAAgAyAGOgD8AiADIAsvAAA7AP0CIANB1wA6AOgFIBYgCiADQegFahD9FCEFIAgQ5w0iBkUNCSAGKAIAQSRHDQkgASABKQNANwN4IAEoAiggAUElNgIoQSRHDQMgASABKAIsEIYMDAkLIANBmAVqIAdBNBD8BhogA0GQBWogDkEIaikDADcDACADIA4pAwA3A4gFQQYhDSADKQLYASEvIAMoAtQBIQEgESELIBAhEiACIQYgBSEHDAoLIAMgEDYCzAIgAyARNgLIAiADQdACaiAHQTQQ/AYaIANBkANqIA5BCGopAwA3AwAgAyATNgKEAyADIA4pAwA3A4gDIANByAJqENIIISwgA0HYADoA6AUgAyAsNwPwBSAWIAogA0HoBWoQ/RQhAiAIEOcNIgVFDQYgBSgCAEEkRw0GIAEgASkDQDcDeCABKAIoIAFBJTYCKEEkRw0CIAEgASgCLBCGDAwGCyADIBA2AswCIAMgETYCyAIgA0HQ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AADwv2JyDQEgACABEMwBDAELIAAgARDMAQsgA0HgAWokAA8LIANBCGogACACQQEQzAkgAygCCCICQYGAgIB4Rg0AIAIgAygCDBDcKQALIAAoAgAhBSAAKAIIIQILIAIgBUYEQCAAEIMXCyAAIAJBAWo2AgggACgCBCACQRRsaiICIBg2AhAgAiAXNgIMIAIgFjYCCCACIBU2AgQgAiAUNgIADAALAAvVKgIXfwF+IwBBgANrIgMkAAJAIAFBKGoiBBDnDSIGRQRAIAEoAtgCIQEgA0EAOgCQASABIAEgA0GQAWoQ/RQhASAAQQc2AgAgACABNgIEDAELAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAYoAgAiBkELaw4DAQkCAAsgBkECRwRAIAZBJEcNCSABIAEpA0A3A3ggASgCKCABQSU2AihBJEcNCCABKAIsIQEgAEEHNgIAIAAgATYCBAwMCyADQcgBaiABIAIQoAQgAAJ/IAMtANwBQQJHBEAgA0GsAWogA0HgAWopAwA3AgAgA0GkAWogA0HYAWopAwA3AgAgA0GcAWogA0HQAWopAwA3AgAgAyADKQPIATcClAEgAEEEaiADQZABakEkEPwGGkEADAELIAAgAygCyAE2AgRBBws2AgAMCwsgBBDVICEMIAQQ5w0iAkUEQCABKALYAiEBIANBADoAkAEgASABIANBkAFqEP0UIQEgAEEHNgIAIAAgATYCBAwLCyACKAIAQSRGBEAgASABKQNANwN4IAEoAiggAUElNgIoQSRHDQYgASgCLCEBIABBBzYCACAAIAE2AgQMCwsgASgCKCECIAFBJTYCKCABIAEpA0A3A3ggA0GcAWogAUE0aikCADcCACADQaQBaiABQTxqKAIANgIAIAMgASkCLDcClAEgAyACNgKQASADQZABaiICEMMKIANBADYCaCADQoCAgICAATcCYCABQSxqIQYgAkEEciEJIANB0AFqIQ4gA0GYAWohCkEAIQICQANAIAIgDXJFIAJB/v97S3IhCEEAIQUCQAJ/AkACQAJAA0AgBBDnDSILRQ0BIANBADYC4AIgAyALNgLkAiADQeACahCOJCAEEOcNIgsEQCALKAIAQQxGDQMLIAhFBEAgA0E7OgCQASABIAIgDSADQZABahDQGQsCQCAEEOcNIgtFDQAgCygCAEEQRw0AIAkgBikCADcCACABKAIoIQsgAUElNgIoIAEgASkDQDcDeCAJQQhqIAZBCGopAgA3AgAgCUEQaiAGQRBqKAIANgIAIAMgCzYCkAEgBUEBaiEFIANBkAFqEMMKDAELCyAFBEAgAyAFNgK4ASADQQc2ApABIANB4ABqIANBkAFqEIoJCyAEENUgIQUgBBDnDSIIBEAgCCgCAEEHRg0DCyADQZABaiABEOoEIAMoApQBIQUgAygCkAEiCEEHRg0LIA4gCikDADcDACAOQRhqIApBGGopAwA3AwAgDkEQaiAKQRBqKQMANwMAIA5BCGogCkEIaikDADcDACADIAU2AswBIAMgCDYCyAEgA0HgAGogA0HIAWoQ+RlBAAwDCyABKALYAiECIANBADoAkAEgAyACIAIgA0GQAWoQ/RQ2AuQCIANBATYC4AIgA0HgAmoQjiQLIAQQ5w0iAkUNAiACKAIAQQxHDQIgASgCKCECIAFBJTYCKCABIAEpA0A3A3ggA0GcAWogBkEIaikCADcCACADQaQBaiAGQRBqKAIANgIAIAMgBikCADcClAEgAyACNgKQASADQZABahDDCiABLQD4AkECRgRAIAEtAPsCQQFxDQULQQAhAiABLQCQA0EBcQ0EDA4LIAkgBikCADcCACABKAIoIQIgAUElNgIoIAEgASkDQDcDeCAJQQhqIAZBCGopAgA3AgAgCUEQaiAGQRBqKAIANgIAIAMgAjYCkAEgA0GQAWoiDxDDCiABKAJ8IQIgDyABQQAQUCADKAKQASINQQdGDQcgA0HAAmoiByAKQQhqKQMANwMAIANByAJqIhEgCkEQaikDADcDACADQdACaiISIApBGGopAwA3AwAgAyAKKQMANwO4AiADKAKUASEQIAEoAnwhC0EoQQgQoSAiCCAQNgIEIAggDTYCACAIIAMpA7gCNwMIIAhBEGogBykDADcDACAIQRhqIBEpAwA3AwAgCEEgaiASKQMANwMAIANBADYCqAEgAyAFIAIgAiAFSRs2AqQBIAMgBSACIAIgBUsbNgKgASADIAUgCyAFIAtLGyINNgKcASADIAUgCyAFIAtJGyICNgKYASADIAg2ApQBIANBAjYCkAEgA0HgAGogDxD5GUEBCyAEEOcNIggEQCAIKAIAQQxGDQILAkAgBBDnDSIIBEAgCCgCAEEQRg0BCyADQZgBaiAEEOsLIANBEGogBBCzFCADQcjE4AA2ApQBIANBNDoAkAEgAygCECADKAIUIANBkAFqEP0UIQUgBBDnDSICRQ0IIAIoAgBBJEcNCCABIAEpA0A3A3ggASgCKCABQSU2AihBJEcNBiABIAEoAiwQhgwMCAsgCSAGKQIANwIAIAEoAighCCABQSU2AiggASABKQNANwN4IAlBCGogBkEIaikCADcCACAJQRBqIAZBEGooAgA2AgAgAyAINgKQASADQZABaiIQEMMKRQ0BIAQQ5w0iBUUNASAFKAIAQQxHDQEgASgCfCEFIAEoAnghCCADQTo6AJABIAEgCCAFIBAQ0BkMAQsLIANBmAFqIAQQ6wsgA0EIaiAEELMUIANBkOTfADYClAEgA0E0OgCQASADKAIIIAMoAgwgA0GQAWoQ/RQhBSAEEOcNIgJFDQUgAigCAEEkRw0FIAEgASkDQDcDeCABKAIoIAFBJTYCKEEkRw0CIAEgASgCLBCGDAwFC0EAIQIgBBDnDSIERQ0JIAQoAgBBF0cNCSABKAIoIQIgAUElNgIoIAEgASkDQDcDeCADQZwBaiAGQQhqKQIANwIAIANBpAFqIAZBEGooAgA2AgAgAyAGKQIANwKUASADIAI2ApABIANBkAFqEMMKQQEhAgwJCyADQQA6AFMgAyABKQGCAzcAQyADIAEpAJMDNwBUIAMgASgAmwM2AFwgAyABQYoDaiICKQEANwBLIANB+QBqIAFBlwNqKQAANwAAIANB9ABqIAFBkgNqKQEANwIAIANB7ABqIAIpAQA3AgAgAyABKQGCAzcCZCABQYABaiADQcMAahDICCADIAE2AmAgBBDVICEOIAQQ5w0iAkUEQCABKALYAiEBIANBADoAkAEgASABIANBkAFqEP0UIQEgAEEHNgIAIAAgATYCBAwICwJAIAIoAgBBJEYEQCABIAEpA0A3A3ggASgCKCABQSU2AihBJEYNAUHd6+AAQShBhKzgABDuFwALIAEoAighAiABQSU2AiggASABKQNANwN4IANBnAFqIAFBNGopAgA3AgAgA0GkAWogAUE8aigCADYCACADIAEpAiw3ApQBIAMgAjYCkAEgA0GQAWoiAhDDCiADQQA2AowBIANCgICAgIABNwKEASABQSxqIQYgAkEEciELIANBuAJqQQRyIQkgA0HE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IAhBAWshCCAFQThrIQUMAQsLIANBMGogAhCuDyADKAI0IQIgAygCMCADQe0AOgCQASACIANBkAFqEP0UIQIgBBDnDSIERQ0EIAQoAgBBJEcNBCABIAEpA0A3A3ggASgCKCABQSU2AihBJEcNAyABIAEoAiwQhgwMBAsgAyACNgKUASAHRQ0FCyADQZgCahDeFiADKAKUASECDAYLQd3r4ABBKEH4qeAAEO4XAAtB3evgAEEoQdip4AAQ7hcACyAAQQc2AgAgACACNgIEIANBhAFqEIgnDBILIAAgAykChAE3AgQgACACOgAcIABBADYCGCAAIAw2AhQgACAKNgIQIABBAzYCACAAQQxqIANBjAFqKAIANgIADBELIAMpA6ACEPEaDAELIAMoApQBIQcgA0HIAWogGUEwEPwGGiADKAKEASAIRgRAIANBhAFqEI4XIAMoAogBIRALIBAgEmoiBSACNgIAIAVBBGogBzYCACAFQQhqIANByAFqQTAQ/AYaIAMgCEEBaiIINgKMASAEEOcNIgIEQCACKAIAQQ5GDQMLIAQQ5w0iAgRAIAIoAgBBEEYNAgsgA0GYAWogBBDrCyADQRhqIAQQsxQgA0HIxOAANgKUASADQTQ6AJABIAMoAhggAygCHCADQZABahD9FCECIAQQ5w0iBEUNACAEKAIAQSRHDQAgASABKQNANwN4IAEoAiggAUElNgIoQSRHDQUgASABKAIsEIYMCyAAQQc2AgAgACACNgIEIANBhAFqEIgnDA4LIAsgBikCADcCACABKAIoIQIgAUElNgIoIAEgASkDQDcDeCALQQhqIAZBCGopAgA3AgAgC0EQaiAGQRBqKAIANgIAIAMgAjYCkAEgA0GQAWoQwwogBBDnDSICDQELIBJBOGohEgwBCwtBASARIAIoAgBBDkYiAhshESABKQN4IBogAhshGgwBCwtB3evgAEEoQZSs4AAQ7hcACyABKAIsIQEgAEEHNgIAIAAgATYCBAwHC0Hd6+AAQShBlITgABDuFwALQd3r4ABBKEGEhOAAEO4XAAsgAygClAEhBQsgAEEHNgIAIAAgBTYCBCADQeAAahCHJwwFC0Hd6+AAQShB9IPgABDuFwALQd3r4ABBKEHUhOAAEO4XAAsgA0GcAWogBBDrCyADIAQQsxQgA0EcNgKYASADQeSE4AA2ApQBIANBMDoAkAEgAygCACADKAIEIANBkAFqEP0UIQICQCAEEOcNIgRFDQAgBCgCAEEkRw0AIAEgASkDQDcDeCABKAIoIAFBJTYCKEEkRgRAIAEgASgCLBCGDAwBC0Hd6+AAQShBgIXgABDuFwALIABBBzYCACAAIAI2AgQMAgsgA0HgAGoQoCYMAQsgACADKQJgNwIEIAAgAjoAHCAAQQA2AhggAEEBNgIAIABBDGogA0HoAGooAgA2AgAgACAMIAEoAnwiASABIAxJGzYCFCAAIAwgASABIAxLGzYCEAsgA0GAA2okAAvEKwIXfwF+IwBBgANrIgMkAAJAIAFBKGoiBBDNDSIGRQRAIAEoAoACIQEgA0EAOgCQASABIAEgA0GQAWoQ/RQhASAAQQc2AgAgACABNgIEDAELAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAYoAgAiBkELaw4DAQkCAAsgBkECRwRAIAZBJEcNCSABIAEpA+ACNwOYAyABKALIAiABQSU2AsgCQSRHDQggASgCzAIhASAAQQc2AgAgACABNgIEDAwLIANByAFqIAEgAhCeBCAAAn8gAy0A3AFBAkcEQCADQawBaiADQeABaikDADcCACADQaQBaiADQdgBaikDADcCACADQZwBaiADQdABaikDADcCACADIAMpA8gBNwKUASAAQQRqIANBkAFqQSQQ/AYaQQAMAQsgACADKALIATYCBEEHCzYCAAwLCyAEELogIQwgBBDNDSICRQRAIAEoAoACIQEgA0EAOgCQASABIAEgA0GQAWoQ/RQhASAAQQc2AgAgACABNgIEDAsLIAIoAgBBJEYEQCABIAEpA+ACNwOYAyABKALIAiABQSU2AsgCQSRHDQYgASgCzAIhASAAQQc2AgAgACABNgIEDAsLIAEoAsgCIQIgAUElNgLIAiABIAEpA+ACNwOYAyADQZwBaiABQdQCaikCADcCACADQaQBaiABQdwCaigCADYCACADIAEpAswCNwKUASADIAI2ApABIANBkAFqIgIQwgogA0EANgJoIANCgICAgIABNwJgIAFBzAJqIQYgAkEEciEJIANB0AFqIQ4gA0GYAWohCkEAIQICQANAIAIgDXJFIAJB/v97S3IhCEEAIQUCQAJ/AkACQAJAA0AgBBDNDSILRQ0BIANBADYC4AIgAyALNgLkAiADQeACahC5IyAEEM0NIgsEQCALKAIAQQxGDQMLIAhFBEAgA0E7OgCQASABIAIgDSADQZABahC+GQsCQCAEEM0NIgtFDQAgCygCAEEQRw0AIAkgBikCADcCACABKALIAiELIAFBJTYCyAIgASABKQPgAjcDmAMgCUEIaiAGQQhqKQIANwIAIAlBEGogBkEQaigCADYCACADIAs2ApABIAVBAWohBSADQZABahDCCgwBCwsgBQRAIAMgBTYCuAEgA0EHNgKQASADQeAAaiADQZABahCKCQsgBBC6ICEFIAQQzQ0iCARAIAgoAgBBB0YNAwsgA0GQAWogARDpBCADKAKUASEFIAMoApABIghBB0YNCyAOIAopAwA3AwAgDkEYaiAKQRhqKQMANwMAIA5BEGogCkEQaikDADcDACAOQQhqIApBCGopAwA3AwAgAyAFNgLMASADIAg2AsgBIANB4ABqIANByAFqEPkZQQAMAwsgASgCgAIhAiADQQA6AJABIAMgAiACIANBkAFqEP0UNgLkAiADQQE2AuACIANB4AJqELkjCyAEEM0NIgJFDQIgAigCAEEMRw0CIAEoAsgCIQIgAUElNgLIAiABIAEpA+ACNwOYAyADQZwBaiAGQQhqKQIANwIAIANBpAFqIAZBEGooAgA2AgAgAyAGKQIANwKUASADIAI2ApABIANBkAFqEMIKIAEtAKACQQJGBEAgAS0AowJBAXENBQtBACECIAEtALgCQQFxDQQMDgsgCSAGKQIANwIAIAEoAsgCIQIgAUElNgLIAiABIAEpA+ACNwOYAyAJQQhqIAZBCGopAgA3AgAgCUEQaiAGQRBqKAIANgIAIAMgAjYCkAEgA0GQAWoiDxDCCiABKAKcAyECIA8gAUEAEFEgAygCkAEiDUEHRg0HIANBwAJqIgcgCkEIaikDADcDACADQcgCaiIRIApBEGopAwA3AwAgA0HQAmoiEiAKQRhqKQMANwMAIAMgCikDADcDuAIgAygClAEhECABKAKcAyELQShBCBChICIIIBA2AgQgCCANNgIAIAggAykDuAI3AwggCEEQaiAHKQMANwMAIAhBGGogESkDADcDACAIQSBqIBIpAwA3AwAgA0EANgKoASADIAUgAiACIAVJGzYCpAEgAyAFIAIgAiAFSxs2AqABIAMgBSALIAUgC0sbIg02ApwBIAMgBSALIAUgC0kbIgI2ApgBIAMgCDYClAEgA0ECNgKQASADQeAAaiAPEPkZQQELIAQQzQ0iCARAIAgoAgBBDEYNAgsCQCAEEM0NIggEQCAIKAIAQRBGDQELIANBmAFqIAQQkhAgA0EQaiAEEIAUIANByMTgADYClAEgA0E0OgCQASADKAIQIAMoAhQgA0GQAWoQ/RQhBSAEEM0NIgJFDQggAigCAEEkRw0IIAEgASkD4AI3A5gDIAEoAsgCIAFBJTYCyAJBJEcNBiABIAEoAswCEP8LDAgLIAkgBikCADcCACABKALIAiEIIAFBJTYCyAIgASABKQPgAjcDmAMgCUEIaiAGQQhqKQIANwIAIAlBEGogBkEQaigCADYCACADIAg2ApABIANBkAFqIhAQwgpFDQEgBBDNDSIFRQ0BIAUoAgBBDEcNASABKAKcAyEFIAEoApgDIQggA0E6OgCQASABIAggBSAQEL4ZDAELCyADQZgBaiAEEJIQIANBCGogBBCAFCADQZDk3wA2ApQBIANBNDoAkAEgAygCCCADKAIMIANBkAFqEP0UIQUgBBDNDSICRQ0FIAIoAgBBJEcNBSABIAEpA+ACNwOYAyABKALIAiABQSU2AsgCQSRHDQIgASABKALMAhD/CwwFC0EAIQIgBBDNDSIERQ0JIAQoAgBBF0cNCSABKALIAiECIAFBJTYCyAIgASABKQPgAjcDmAMgA0GcAWogBkEIaikCADcCACADQaQBaiAGQRBqKAIANgIAIAMgBikCADcClAEgAyACNgKQASADQZABahDCCkEBIQIMCQsgA0EAOgBTIAMgASkBqgI3AEMgAyABKQC7AjcAVCADIAEoAMMCNgBcIAMgAUGyAmoiAikBADcASyADQfkAaiABQb8CaikAADcAACADQfQAaiABQboCaikBADcCACADQewAaiACKQEANwIAIAMgASkBqgI3AmQgBCADQcMAahDQCCADIAE2AmAgBBC6ICEOIAQQzQ0iAkUEQCABKAKAAiEBIANBADoAkAEgASABIANBkAFqEP0UIQEgAEEHNgIAIAAgATYCBAwICwJAIAIoAgBBJEYEQCABIAEpA+ACNwOYAyABKALIAiABQSU2AsgCQSRGDQFB3evgAEEoQYSs4AAQ7hcACyABKALIAiECIAFBJTYCyAIgASABKQPgAjcDmAMgA0GcAWogAUHUAmopAgA3AgAgA0GkAWogAUHcAmooAgA2AgAgAyABKQLMAjcClAEgAyACNgKQASADQZABaiICEMIKIANBADYCjAEgA0KAgICAgAE3AoQBIAFBzAJqIQYgAkEEciELIANBuAJqQQRyIQkgA0HEAmohFyADQbwCaiENIANBwAJqIQogA0GgAmohDCADQaABaiEYIANBmAFqIRlBCCEQA0AgCEE4bCESAkADQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAQQzQ0iAgRAIAIoAgBBDkYNAQsgBBC6ICEFAkACQAJAAkAgBBDNDSICBEAgAigCAEEHRg0BCyADQbgCaiABEK4BIAMoArwCIQIgAygCuAIiB0EFRg0NIAwgCikDADcDACAMQRBqIApBEGoiDykDADcDACAMQQhqIApBCGoiFCkDADcDACADIAI2ApwCIAMgBzYCmAIgBBDNDSICBEAgAigCAEETRg0CCyAHDQJBACECAkAgBBDNDSIHRQ0AIAcoAgBBFUcNACAHLQAEDQAgCSAGKQIANwIAIAEoAsgCIQIgAUElNgLIAiABIAEpA+ACNwOYAyAJQQhqIAZBCGopAgA3AgAgCUEQaiAGQRBqKAIANgIAIAMgAjYCuAIgA0G4AmoiDxDCCiAPIAFBARDLEiADQSBqIAMoArgCELgGIAMoAiQhAiADKAIgIA8QhCUNBAsgASgCnAMhByAYIAwQ9CIgAyACNgLAAUEBIQIgA0EBNgKQASADIAUgByAFIAdLGzYCnAEgAyAFIAcgBSAHSRs2ApgBDAwLIAkgBikCADcCACABKALIAiECIAFBJTYCyAIgASABKQPgAjcDmAMgCUEIaiAGQQhqKQIANwIAIAlBEGogBkEQaigCADYCACADIAI2ArgCIANBuAJqIgIQwgogASgCnAMhByACIAFBABBRIAMoArgCIg9BB0cEQCADQYACaiIUIApBCGopAwA3AwAgA0GIAmoiFSAKQRBqKQMANwMAIANBkAJqIhYgCkEYaikDADcDACADIAopAwA3A/gBIAMoArwCIRNBKEEIEKEgIgIgEzYCBCACIA82AgAgAiADKQP4ATcDCCACQRBqIBQpAwA3AwAgAkEYaiAVKQMANwMAIAJBIGogFikDADcDACADQQA2AqgBIAMgBSAHIAUgB0sbNgKkASADIAUgByAFIAdJGzYCoAEgAyACNgKUAUECIQIgA0ECNgKQASADIAUgASgCnAMiByAFIAdLGzYCnAEgAyAFIAcgBSAHSRs2ApgBDAwLIAMoArwCIQIMDAsgCSAGKQIANwIAIAEoAsgCIQIgAUElNgLIAiABIAEpA+ACNwOYAyAJQQhqIAZBCGopAgA3AgAgCUEQaiAGQRBqKAIANgIAIAMgAjYCuAIgA0G4AmoiExDCCiATIAEQ6QQgAygCvAIhAiADKAK4AiIVQQdGDQMgA0H4AmoiByAKQRhqKQMANwMAIANB8AJqIhYgDykDADcDACADQegCaiIPIBQpAwA3AwAgAyAKKQMANwPgAkEoQQgQoSAiBSACNgIEIAUgFTYCACAFIAMpA+ACNwMIIAVBEGogDykDADcDACAFQRhqIBYpAwA3AwAgBUEgaiAHKQMANwMAIA1BGGogA0GwAmopAwA3AgAgDUEQaiADQagCaikDADcCACANQQhqIAwpAwA3AgAgDSADKQOYAjcCAEEAIQIgA0EANgKQASALIBNBJBD8BhogAyAFNgK4AQwKCyAXIAQQkhAgA0EoaiAEEIAUIANBDTYCwAIgA0HoqeAANgK8AiADQTA6ALgCIAMoAiggAygCLCADQbgCahD9FCECAkAgBBDNDSIERQ0AIAQoAgBBJEcNACABIAEpA+ACNwOYAyABKALIAiABQSU2AsgCQSRHDQUgASABKALMAhD/CwsgAyACNgKUAQwDCyADKQOgAhDxGgwJCyABKALIAiECIAFBJTYCyAIgASABKQPgAjcDmAMgA0GcAWogBkEIaikCADcCACADQaQBaiAGQRBqKAIANgIAIAMgBikCADcClAEgAyACNgKQASADQZABahDCCiAOIAEoApwDIgIgAiAOSxshCiAOIAIgAiAOSRshDCADKAKMASICQThsIQUgAkEBayEIIBpCIIinIQ4gGqchCyADKAKIASECIBFBAXEhDQNAIAVFBEACQCABLQCgAkECRgRAIAEtAKMCQQFxDQELQQAhAiABLQC4AkEBcUUNCAtBACECIAQQzQ0iBEUNByAEKAIAQRdHDQcgASgCyAIhAiABQSU2AsgCIAEgASkD4AI3A5gDIANBnAFqIAZBCGopAgA3AgAgA0GkAWogBkEQaigCADYCACADIAYpAgA3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QaABaiACQdgBakE0EPwGGiACQZ4BaiACQY8Cai0AADoAACACIAIvAI0COwGcASACLQCMAiEECyADIAU2AgQgAyAHNgIAIANBCGogAkGgAWpBNBD8BhogAyAEOgA8IAMgAi8BnAE7AD0gA0E/aiACQZ4Bai0AADoAACADQUBrIAJBQGtB0AAQ/AYaIANBmAFqIAJBmAFqKAIANgIAIAMgAikDkAE3A5ABIABBJzYCACAAIAM2AgQMDwsgASkDECENIAEpAxghDiACQUBrIgQgAUEEahCyBiACIA43AlQgAiANNwJMIAIgASkDIDcCXCAAQQRqIARBJBD8BhogAEEoNgIADA4LIAJBQGsgAUEEahD/HSAAQSk2AgAgAEEMaiACQcgAaikCADcCACAAIAIpAkA3AgQMDQsgASkDCCENIAFBBGoQ8BwhASAAIA03AwggACABNgIEIABBKjYCAAwMCyACQUBrIAFBBGoQ6SIgAEErNgIAIABBDGogAkHIAGooAgA2AgAgACACKQJANwIEDAsLIAJBQGsgAUEEahD/HSAAQSw2AgAgAEEMaiACQcgAaikCADcCACAAIAIpAkA3AgQMCgsgAkFAayABQQRqEIAeIABBLTYCACAAQQxqIAJByABqKQIANwIAIAAgAikCQDcCBAwJCyACQUBrIAFBBGoQ/x0gAEEuNgIAIABBDGogAkHIAGopAgA3AgAgACACKQJANwIEDAgLIAJBQGsgAUEIahDMISAAQS82AgAgAEEQaiACQcgAaikDADcDACAAIAIpA0A3AwgMBwsgAkFAayABQQRqEM4HIABBMDYCACAAQQxqIAJByABqKQIANwIAIAAgAikCQDcCBAwGCyAAQTE2AgAgACABKQIENwIEDAULAAsgAigCTCEIIAIoAkghBSACKAJAIQkgAigCRAwCCyACQUBrIAFBBGoQ6SIgAigCSCEFIAIoAkAhCSACKAJEDAELIAJBmAJqIAJB1ABqKQIANwMAIAIgAikCTDcDkAIgAigCSCEIIAIoAkQhBSACKAJcIQYgAikDYCENIAIoAkALIQcgAUE4ahDwHCEBIAAgCDYCECAAIAU2AgwgACAHNgIIIAAgCTYCBCAAIAQ2AgAgACAKOgA8IAAgATYCOCAAIAs2AjQgACAMNgIwIAAgDTcDKCAAIAY2AiQgACACKQOQAjcC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IAQOBAIEAQMBCyADKQJMIRkgA0GAA2oiASADQbgBahD+BRCpISABQcAAEPwGIQEgAyAEOgDsASADIBk3AuQBIAMgATYC4AEgA0HgAWoQwxghASAAQQI2AgAgACABNgIEDAQLQd3r4ABBKEGcxd8AEO4XAAsgEJohEAwBCyAQENAOQX9ztyEQCyAAQQE2AgAgACAQOQMIIANBuAFqEJEgCyACKAIAQRBrIgBBE0sNJUEBIAB0QZWoIHENJyAAQQtGDSQMJQsgA0HgAGogAkEMaikCACIaNwMAIANB6ABqIAJBFGooAgAiCzYCACADIAIpAgQiGTcDWCAZpyIIEKkdIQcgAygCXCIFEKkdIQQgAyALOgDcASADIBo3AtQBIAMgBDYC0AEgAyAHNgLMASALQf8BcSIEQRdNQQBBASAEdEGA/p8EcRtFBEAgA0HMAWoQkBUhASAAQQI2AgAgACABNgIEIANB2ABqEKEpDCMLIANB4AFqIAEgCBBWIANB8AFqIgggASAFEFYgAyALOgCAAiADKALwASEBAkACQAJAAkACQAJAAkACQCADKALgASIPDgIAAQULIAEOAgECJgsgAQ4CAgklCyALQf8BcUELRg0DDCMLIAtB/wFxQQtHBEBBASEBDCQLIAMgAykD6AE3A4gCIANBmAJqIgEgAysD+AEQsgEgA0ECNgKEAyADQbjR3wA2AoADIANCAjcCjAMgA0E+NgLMAiADQcMCNgLEAiADIANBwAJqNgKIAyADIAE2AsgCIAMgA0GIAmo2AsACIANB2AJqIgEgA0GAA2oQ6gsgARCeGSEZIABBADYCACAAIBk3AwggAygCmAIgAygCnAIQ1ikgAykDiAIQ8RpBAAwgCyALQf8BcUELRw0hIAMrA+gBIRAgAyADKQP4ATcDiAIgA0GYAmoiASAQELIBIANBAjYChAMgA0G40d8ANgKAAyADQgI3AowDIANBwwI2AswCIANBPjYCxAIgAyADQcACajYCiAMgAyADQYgCajYCyAIgAyABNgLAAiADQdgCaiIBIANBgANqEOoLIAEQnhkhGSAAQQA2AgAgACAZNwMIIAMoApgCIAMoApwCENYpDAILIANB0AJqIANB3AFqKAIANgIAIANByAJqIANB1AFqKQIANwMAIAMgAykCzAE3A8ACQQEMIgsgAyADKQPoATcDiAIg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AAsACyABKAJMIgMEQCACQdgCahCvEyACIAM2AoADIAIgASgCQCIDNgL4AiACIANBCGo2AvACIAIgAyABKAJEakEBajYC9AIgAiADKQMAQn+FQoCBgoSIkKDAgH+DNwPoAiACQegCahDBDAsgAkEANgL4AiACQfACakHIn+MAKQMANwMAIAJBwJ/jACkDADcD6AIgAkH8AGogAkHoAWogAUEwaiACQegCaiIDIAggAkHYAmogAigC3AIgAigC2AIbEK8BIAMQygggASgCAEUNASABIAIoAvQBEMApIAIoAugBIgMpAwAhCSACKALsASEEIAIgAigC9AE2AsABIAIgAzYCuAEgAiADIARqQQFqNgK0ASACIANBCGo2ArABIAIgCUJ/hUKAgYKEiJCgwIB/gzcDqAEDQCACQRhqIAJBqAFqELUVIAIoAhgiA0UNAiACIAIoAhwiBDYCuAIgAkEIaiADKQMAIANBCGooAgAQtyMgAkHoAmoiBSABIAIpAwggAigCEBD7BiACKQPoAlANHyAFIAQpAwAQ9BoQ3gsMAAsACyAGIAEQvC0MHAsgAkGwAWogAkHwAWopAwA3AwAgAiACKQPoATcDqAEgAkHYAmoQlyggAkH8AGoQ4B8gAigCtAEEQCACQfQCaiABQUBrEIAdIAJBADYC8AIgAkKAgICAgAE3AugCIAAtABwgAiACQagBaiIDNgKMA0ECRwRAIAMgBhD7BRoLIAAoAiAgAkHoAmoiABCNEiAAELciCyACQagBahDGCgwbCyAAQQRqIAEQtC0MGgsgAEEMaiABELQtDBkLIABBBGogARC0LSAAQQhqIAEQtC0MGAsgAEE4agJAAkACQAJAAkACQAJAAkACQAJAAkAgA0EBaw4LAAECAwQFBgcICgkKCyAAQQhqIAEQrB8MCQsgAEEIaiABEL8iDAgLIABBBGogARC0LQwHCyAAQQRqIAEQ1RwMBgsgAEEEaiABELQtDAULIABBBGogARC0LQwECyAAQQRqIAEQtC0MAwsgAEEEaiABELQtDAILIABBBGogARC0LQwBCyAAQQhqIQMCQAJAIAAoAgRBAWsOAgECAAsgAyABEMoaDAELIAMgARDYDwsgARC0LQwXCyAAQQhqIAEQrB8MFgsgAEEIaiABEL8iDBULIABBBGogARC0LSAAQQhqIAEQtC0gAEEM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CyADQfgAaiACIAEoAgggASgCDCADKAIwIgQgAygCNBCVDyADLQB4QQRGDQEgAykDeCIXQv8Bg0IEUQ0BIAAgFzcCAAsgAygCLCAEENYpDAELIAMoAiwgBBDWKSAAQQQ6AAALIANB8AZqJAALrCECBn8CfiMAQcABayICJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIAQQFrDhIPDwECAw8PBAUGBwgJCgsMDQ4ACyABIABBBGoQ2QQMDgsgAEEEaiABEM0sIABBCGogARDkLAwNCyAAQQxqIAEQvCUMDAsgAEEoaiABEOQsDAsLIABBBGogARDNLCAAQQhqIAEQ5CwgACgCFEUNCiAAQRRqIAEQ5CwMCgsgAEEQaiABEM0sIAAoAgxBGGwhAyAAKAIIIQADQCADRQ0KIABBFGogARC8JSAAIAEQmRogA0EYayEDIABBGGohAAwACwALIABBBGogARDNLAwICyABIAAoAgQiBEHIAGoQ2QQCQCAEKAIAQQhGDQAgAkGUAWpByJ/jACkDADcCACACQQA6AL8BIAJBADsAvQEgAkEANgK0ASACQoCAgICAATcCrAEgAkEBOgCoASACQQA2AqQBIAJCgICAgMAANwKcASACQQA2AogBIAJCgICAgIABNwKAASACQcCf4wApAwA3AowBIAIgAS0APDoAvAEgAiABKAI4NgK4ASABLQA9IQAgBEEoaiACQYABaiIDEJkaIAJBAToAvwEgAkEBOgC9ASAEKAIAQQdHBEAgBCADEKkRCyACQawBaiEFIAJBADoAvwEgAiAAOgC9AQJAIAIoArQBIgAEQCABQQxqIAAQgCkgAkHQAGogAigCsAEgAigCtAEQnQogAiACKAJQNgIIIAIgAigCVCIANgIAIAIgACACKAJYQQR0IgNqIgY2AgwDQCADRQ0CIAJBgAFqIAApAwAgACgCCBDHECADQRBrIQMgAEEQaiEADAALAAsgAUEcaiACIAJBgAFqQSwQ/AYQmhogBRCFIwwBCyACIAY2AgQgAhCTFyABLQAoRQRAIAEgAigCtAEQjR4gAiACKAKsATYCCCACIAIoArABIgA2AgAgAiAAIAIoArQBQQR0IgNqIgU2AgwDQCADBEAgASAAKQMAIAAoAghBARCOBiADQRBrIQMgAEEQaiEADAELCyAC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sAEiADYCUCACIAAgAigCtAFBBHQiA2oiBTYCXANAIAMEQCACIAApAwAgACgCCEEBEI4GIANBEGshAyAAQRBqIQAMAQsLIAIgBTYCVCACQdAAaiIAEJMXIAAgAkGAAWpBLBD8BhogBiAAEJoaDAELIAJB2ABqIAVBCGooAgA2AgAgAiAFKQIANwNQIAQgAkHQAGoiABCiECAAIAJBgAFqQSwQ/AYaIAYgABCaGgsCQCACKAI0IgAEQCABQQxqIAAQgCkgAkHQAGogAigCMCACKAI0EJ0KIAIgAigCUDYCiAEgAiACKAJUIgA2AoABIAIgACACKAJYQQR0IgNqIgU2AowBA0AgA0UNAiACIAApAwAgACgCCBDHECADQRBrIQMgAEEQaiEADAALAAsgAkGAAWoiACACQSwQ/AYaIAFBHGogABCaGiAEEIUjDAQLIAIgBTYChAEgAkGAAWoQkxcgAS0AKEUEQCABIAIoAjQQjR4gAiACKAIsNgKIASACIAIoAjAiADYCgAEgAiAAIAIoAjRBBHQiA2oiBDYCjAEDQCADBEAgASAAKQMAIAAoAghBARCOBiADQRBrIQMgAEEQaiEADAELCyACIAQ2AoQBIAJBgAFqIgAQkxcgACACQSwQ/AYaIAFBHGogABCaGgwECyACQYgBaiAEQQhqKAIANgIAIAIgBCkCADcDgAEgAUEsaiACQYABaiIAEKIQIAAgAkEsEPwGGiABQRxqIAAQmhoMAwsgAkEUakHIn+MAKQMAIgg3AgAgAkEAOwE+IAJBADYCNCACQoCAgICAATcCLCACQQE6ACggAkEANgIkIAJCgICAgMAANwIcIAJBADYCCCACQoCAgICAATcCACACQcCf4wApAwAiCTcCDCACIAEvATw7ATwgAiABKAI4NgI4IABBBGogAhCwHCAAQQxqIAIQzSwgAkGUAWogCDcCACACIAk3AowBIAJBADsBvgEgAiACLwE8OwG8ASACIAIoAjg2ArgBIAJBADYCtAEgAkKAgICAgAE3AqwBIAJBAToAqAEgAkEANgKkASACQoCAgIDAADcCnAEgAkEANgKIASACQoCAgICAATcCgAEgAkGAAWogACgCEBDNICACQawBaiEFIAJBLGohBCACQRxqIQYCQAJAIAIoArQBIgAEQCACQQxqIAAQgCkgAkHEAGogAigCsAEg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ALwBIANBCDYCuAEgA0IgNwKwASADQoCAgIDAADcCqAEgA0ECNgKgASADIANBoAFqNgLwASADIANBkAFqNgLoASADQewAaiADQeABahDtJBoMEQsgDA0HIApBAXFFBEAgA0HsAGogARDtDwwRCyADQcoANgKUASADIAE2AoQBIANBATYC9AEgA0ECNgLkASADQdjf2AA2AuABIANBATYC7AEgAyADQYQBajYCkAEgA0EDOgC8ASADQQg2ArgBIANCIDcCsAEgA0KAgICAwAA3AqgBIANBAjYCoAEgAyADQaABajYC8AEgAyADQZABajYC6AEgA0HsAGogA0HgAWoQ7SQaDBALIA0NCyADQewAaiABEO0PDA8LIANB4AFqIgEgAygCcCADKAJ0QSdBvuDYABDRBiADQT42ApQBIANBAjYCpAEgA0HA4NgANgKgAQsgA0IBNwKsASADIAE2ApABIAMgA0GQAWo2AqgBIANB4ABqIANBoAFqEPwUIAMoAuABIAMoAuQBENYpIAMoAmwgAygCcBDWKSACLQBQRQ0IIAMoAmQhBCADKAJoIQEgA0EINgJ4IAMgATYC/AEgAyAENgL4ASADQQA2AvABIAMgASAEajYC7AEgAyAENgLoASADQQI2AuABIAMgA0H4AGo2AvQBIANBEGogA0HoAWoiBRDmBiADIAMoAhQ2AuQBIAMgAygCECIGNgLgASAGQQFxBEAgA0EIaiABEMoUIAMoAgghByADKAIMIgYgBCABEPwGIQQgAyABNgKYASADIAQ2ApQBIAMgBzYCkAEgA0G4AWogA0H4AWopAgA3AwAgA0GwAWogA0HwAWopAgA3AwAgA0GoAWoiByAFKQIANwMAIAMgAykC4AE3A6ABIANBADYCwAEDQCADKAKgASEEIANBAjYCoAECfyAEQQJHBEAgAygCpAEMAQsgAyAHEOYGIAMoAgAhBCADKAIECyEFIARFDQcgAyADKALAASIIQQFqIgQ2AsABAkAgBCAFaiIERQ0AIAEgBEsEQCAEIAZqLAAAQb9/Sg0BDAsLIAEgBEcNCgsgAygCkAEgAUYEQCADQZABaiABQQEQ0gogAygClAEhBgsgBCAGaiIEQQFqIAQgBSAIakF/cyABahDQLRogBEHcADoAACADIAFBAWoiATYCmAEMAAsAC0GAgICAeCEFIAQMBgsgA0HgAWoiARDAHhogARCaHSEBDAkLIANBATYCpAEgA0GM39gANgKgASADQgE3AqwBIANB3gE2AuQBIAMgAToAkAEgAyADQeABajYCqAEgAyADQZABajYC4AEgA0HsAGogA0GgAWoQ7SQaDAsLIANBATYCpAEgA0Gw3tgANgKgASADQgE3AqwBIANB3gE2AuQBIAMgAToAkAEgAyADQeABajYCqAEgAyADQZABajYC4AEgA0HsAGogA0GgAWoQ7SQaDAoLIANB7ABqIAEQ7Q8MCQsgAyABQYCABGtBCnZBgLADajYCjAEgAyABQf8HcUGAuANyNgKEASADQcoANgKcASADQcoANgKUASADQQI2AvQBIANBAjYC5AEgA0Gs4NgANgLgASADIANBhAFqNgKYASADIANBjAFqNgKQASADQQM6ANwBIANBCDYC2AEgA0KggICAEDcC0AEgA0KAgICAwAA3AsgBIANBAjYCwAEgA0EDOgC8ASADQQg2ArgBIANCIDcCsAEgA0KAgICAwAA3AqgBIANBAjYCoAEgAyADQaABajYC8AEgA0ECNgLsASADIANBkAFqNgLoASADQewAaiADQeABahDtJBoMCAsgAygCkAEhBSADKAJkIQQgAygClAELIgYgAUGcueAAQQRBoLngAEEHEKoLIANB4AFqIAMoAqQBIgEgAygCqAFBp7ngAEEDQaq54ABBBhCqCyADKAJgIAQQ1ikgA0HoAGogA0HoAWooAgA2AgAgAyADKQLgATcDYCADKAKgASABENYpIAUgBhCuJAwBC0Hg3NgAQSxBjN3YABDuFwALIANBoAFqIAJBAEEAIAMoAmQiASADKAJoEJUPAkAgAy0AoAFBBEcEQCADKQOgASIOQv8Bg0IEUg0BCyADKAJgIAEQ1ikgAEEEOgAADAcLIAAgDjcCACADKAJgIAEQ1ikMBgsgA0EBNgKkASADQbDe2AA2AqABIANCATcCrAEgA0HeATYC5AEgAyABOgCQASADIANB4AFqNgKoASADIANBkAFqNgLgASADQewAaiADQaABahDtJBoMAwsCQAJAAkACQCABBEAgASgCAEEgckHkAEYNAQsgCQ0BIANB7ABqQdwAEO0PDAYLIANBADYCqAEgA0KAgICAEDcCoAEgA0GgAWoiBEHcABDtDyAEQfUAEO0PIAkNAQwCCyAD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BCgCYCIIQYCwA3NBgIDEAGtBgJC8f0kNACAIQYCAxABHDQQLIARByABqIARBKGooAgA2AgAgBEHUAGogBEE4aigCADYCACAEIAQpAyA3A0AgBCAEKQMwNwJMIARBCDYCXCAFIAEoAgQgCiAEQUBrIARB3ABqEJwPDAQLIARB1ABqIANBCGooAgA2AgAgBEHIAGogBEEYaigCADYCACAEIAQpAxA3A0AgBCADKQIANwJMIARBCjYCXCAFIAEoAgQgCyAEQUBrIARB3ABqEJwPDAMLIARBADYCXCAEQTxqQZSqxAAgBEHcAGpBmKrEABDpGgALIARB1ABqIANBCGooAgA2AgAgBEHIAGogBEEYaigCADYCACAEIAQpAxA3A0AgBCADKQIANwJMIARBBzYCXCAFIAEoAgQgCiAEQUBrIARB3ABqEJwPDAELIARBgAFqIgEgBEEoaigCADYCACAEQYwBaiADQQhqKAIANgIAIAUgCDYCBCAFIAQpAyAiHDcCCCAFIAY6ACEgBUEFOgAgIAQgAykCADcChAEgBUEQaiABKQMANwIAIAVBGGogBEGIAWopAwA3AgAgBCAcNwN4IAVBIjYCAAsgCSAJKAIAQQFqNgIAIARBkAFqJAALIAdBQGskACACQaABaiIBIAJBsAJqKQIANwMAIAJBqAFqIgUgAkG4AmopAgA3AwAgAkGwAWoiBiACQcACaikCADcDACACIAIpAqgCNwOYASACKAKkAiIEQSJGDQcgACACKQLIAjcCJCAAQTxqIAJB4AJqKAIANgIAIABBNGogAkHYAmopAgA3AgAgAEEsaiACQdACaikCADcCACAAQRxqIAYpAwA3AgAgAEEUaiAFKQMANwIAIABBDGogASkDADcCACAAIAIpA5gBNwIEDAgLIAJBpAJqIQhBACEFIwBBgAJrIgMkAAJAAn8CQAJAAkAgARDDDEHwAEcEQCABEMMMQdAARw0BCyADQdgAaiABKAIAIgtBQGtBrKzEABC3HSADKAJcIREgAygCWCIGQQA2AgggARDDDCETIAEQrh5FBEAgA0GUAWogC0HYAGooAgAiBTYCACADQYgBaiAFNgIAIAMgCykCUCIcNwKMASADIBw3A4ABIANBCjYCwAEgCCABKAIEIAEoAgggA0GAAWogA0HAAWoQnA8MBQsgARDDDEH7AEYEQCADQcABaiABEOQKIANB6ABqIANB1AFqKAIANgIAIAMgAykCzAE3A2ADQCABEK4eRQ0EIAEQwwxB/QBGDQQgBiABEMMMEJ0NDAALAAsgA0H4AGogC0HYAGooAgA2AgAgAyALKQJQNwNwIAEQwwwiB0HcAEYNASABEK4eGkGAgICAeCEBIANB8ABqDAMLQaytxABBOkHorcQAEO4XAAsgA0GAAWoiBSABEOQKIANBHzYCwAEgCCABKAIEIAEoAgggBSADQcABahCcDwwCCwJAAkAgCygCUCIFIAEoAghHBEAgAyABEMMMIgU2AmwgBUH9AEcEQCADQQA2AsABIANB7ABqQZSqxAAgA0HAAWpBnK3EABDpGgALIAEQ9wgaIANBwAFqIAYoAgQiCSAGKAIIIgpB+q/gAEECENwBAkAgAygCwAFFBEAgAy0AzgENAyADKAL0ASEFIAMoAvABIQYgAy0AzAEhASADKALEASEHA0AgAyABQX9zQQFxOgDMASADQdAAaiAHIAYgBRCgEyADKAJQIgRFDQIgAygCVCEMIAMgBDYCgAEgAyAEIAxqNgKEASADQcgAaiADQYABahD9CSADKAJIRQRAIAFBAXFFDQUMBgsgAUEBcQ0FIAMtAMwBQQFxIQECf0EBIAMoAkwiBEGAAUkNABpBA0EEIARBgIAESRsgBEGAEE8NABpBAgsgB2ohBwwACwALIAMoAvwBIg0gAygC2AEiFGshBSANQQFrIRUgAygC0AEhBiADKQPIASEcIAMoAtwBIQcgAygC+AEhEiADKAL0ASEMIAMoAvABIQ8gAygC5AEiFiEBA0AgBiAGIAEgASAGSRsgFkF/RiIQGyIEIA0gBCANSxshF0EAIAEgEBshGANAIAcgFWoiASAMTw0EAn8gHCABIA9qMQAAiEIBg1BFBEAgByAPaiEOIAQhAQJAAkACQANAIAEgF0YEQCAGIQEDQCABIBhNDQ0gAUEBayIBIA1PDQMgASAHaiIOIAxPDQQgASASai0AACAOIA9qLQAARg0ACyAHIBRqIQcgEA0HIAUhAQwICyABIAdqIhkgDE8NAyABIA5qIRogASASaiABQQFqIQEtAAAgGi0AAEYNAAsgGSAGa0EBagwECyABIA1B1OngABCtEAALIA4gDEHk6eAAEK0QAAsgDCAEIAdqIgAgACAMSRsgDEH06eAAEK0QAAsgByANagshByAQDQALQQAhAQwACwALIAYgBSAHIAVBwOrgABDQJgALIANBlAFqIAtB0ABqIgZBCGooAgAiBDYCACADQYgBaiAENgIAIAMgBikCACIcNwKMASADIBw3A4ABIANBCjYCwAEgCCABKAIEIAUgA0GAAWogA0HAAWoQnA8MAwsgA0FAayAJIApBOhDtBkEBIQUgAygCQEEBRgRAIANBIGogCSAKIAMoAkQiAUHcrMQAEKcVIANBgAFqIAMoAiAgAygCJBC2ESADQRhqIAkgCiABQQFqQeysxAAQxBQgA0HAAWogAygCGCADKAIcELYRIAM1AogBIAM1AsABQiCGhCEcIAMpAsQBIR0gAygChAEhByADKAKAASEBIANB4ABqDAILIANBOGogCSAKQT0Q7QYgAygCOEEBRgRAIANBMGogCSAKIAMoAjwiAUH8rMQAEKcVIANBgAFqIAMoAjAgAygCNBC2ESADQShqIAkgCiABQQFqQYytxAAQxBQgA0HAAWogAygCKCADKAIsELYRIAM1AogBIAM1AsABQiCGhCEcIAMpAsQBIR0gAygChAEhByADKAKAASEBQQAhBSADQeAAagwCCyADQcABaiAJIAoQthEgAykCxAEhHCADKALAASEHQQAhBUGBgICAeCEBIANB4ABqDAELIANBEGogCSAKIAdBvKzEABCnFSADQYABaiADKAIQIAMoAhQQthFBAiEFIANBCGogCSAKIAdBAmpBzKzEABDEFCADQcABaiADKAIIIAMoAgwQthEgAzUCiAEgAzUCwAFCIIaEIRwgAykCxAEhHSADKAKEASEHIAMoAoABIQEgA0HgAGoLIQYgA0GgAWoiBCAGQQhqKAIAIgk2AgAgA0GsAWogC0HYAGooAgA2AgAgCCAFOgAcIAggHTcCFCAIIBw3AgwgCCAHNgIIIAggATYCBCAIIAYpAgAiHDcCICADQbgBaiAJNgIAIAMgCykCUDcCpAEgCEEoaiAEKQMANwIAIAhBMGogA0GoAWopAwA3AgAgAyAcNwOwASADIBw3A5gBIAhBIjYCACAIIBNB0ABGOgA4CyARIBEoAgBBAWo2AgAgA0GAAmokACACKAKkAiEBIAJBmAFqIgUgAkGoAmpBOBD8BhogAUEiRg0EIAIoAuACIQYgAEEEaiAFQTgQ/AYaIAAgBjYCPAwFCyACQZgDaiABEOQKIAJBnAJqIAJBrANqKAIANgIAIAJBkAJqIAJBGGooAgA2AgAgAiACKQKkAzcClAIgAiACKQMQNwOIAiACQSA2ApgBIAJBpAJqIgUgASgCBCABKAIIIAJBiAJqIAJBmAFqEJwPIAAgBUHAABD8BhoMHgtBASADdEHrm4CAAXFFDQYMBwsgBC0AZUUEQCACQZgDaiABEOQKIAJBnAJqIAJBrANqKAIANgIAIAJBkAJqIAJBGGooAgA2AgAgAiACKQKkAzcClAIgAiACKQMQNwOIAiACQSA2ApgBIAJBpAJqIgUgASgCBCABKAIIIAJBiAJqIAJBmAFqEJwPIAAgBUHAABD8BhoMHQsgAkEgaiEGIwBBIGsiBSQAAkACQCABKAIAIgQtAGUEQCABEMMMQTBJDQEgARDDDEE4Tw0BIAQpAlQhHCAEKAJQIQMDQCABEPcIRQ0DIAEQwwxBMEkNAyABEMMMQTdLDQMgBCgCUCADa0EDSQ0ACwwCC0G4p8QAQSVB4KfEABDuFwALQfCnxABBOkGsqMQAEO4XAAsgBCkCVCEdIAVBCGogASgCBCABKAIIIAMgBCgCUCIBQbyoxAAQ+g0gBUEUaiAFKAIIIAUoAgxBCBDIBAJAAkAgBS0AFEEBRwRAIAUoAhgiBEGAsANzQYCAxABrQf+PvH9NDQEgBkEDOgAcIAYgHTcCFCAGIAE2AhAgBiAcNwIIIAYgAzYCBCAGIAQ2AgAgBUEgaiQADAILIAUgBS0AFToAH0HMqMQAQRIgBUEfakHcncQAQeCoxAAQxg4AC0HwqMQAQRRBhKnEABC1EgALIAJBLGogAkEYaigCADYCACAAQqKAgICggICAgH83AgAgAEEYaiACQTBqKQIANwIAIABBIGogAkE4aikCADcCACACIAIpAxA3AiQgACACKQIgNwIIIABBEGogAkEoaikCADcCAAwcCyACQQA2AqQCIAJBDGpB8KbEACACQaQCakH0psQAEOkaAAsgAkHgAGoiBSACQZgBakE4EPwGGiACQYQBaiACQRhqKAIANgIAIAIgAikDEDcCfCAAQQRqIAVBOBD8BhoLIAAgATYCAAwZCyACQcgAaiIDIAEpAwA3AwAgAkHQAGogBSkDACIcNwMAIAJB2ABqIAYpAwAiHTcDACACQcwAaiACQRhqKAIANgIAIAIgAikDmAE3A0AgAEGCgICAeDYCBCAAQRhqIBw3AgAgAEEgaiAdNwIAIAIgAikDEDcCRCAAIAIpA0A3AgggAEEQaiADKQMANwIACyAAIAQ2AgAMFwsgBUHbAGtBBEkgBUH7AGtBBElyDQAgBUEwa0EKSSAFQf8AS3IgBUHBAGtBGkkgBUHhAGtBGklyckUgBUH9AHFBPEdxDQIgBUE8aw4HDwQQBAQLDgELIAAgAikD8AE3AgwgAEEBOgAkIAAgBTYCCCAAQqKAgICggICAgH83AgAgAEEcaiACQYACaikDADcCACAAQRRqIAJB+AFqKQMANwIADBULAkAgBUHyAGsOCQgDBgMJAwMDCwALIAVB4QBrDgYDCwICAgQBCyAAIAIpA/ABNwIMIABBAjoAJCAAIAU2AgggAEKigICAoICAgIB/NwIAIABBHGogAkGAAmopAwA3AgAgAEEUaiACQfgBaikDADcCAAwTCyAFQe4ARg0ECyACQQs2ApgBIAJBpAJqIgUgASgCBCABKAIIIAJB8AFqIAJBmAFqEJwPIAAgBUHAABD8BhoMEQsgACACKQPwATcCDCAAQQY7ASQgAEEHNgIIIABCooCAgKCAgICAfzcCACAAQRxqIAJBgAJqKQMANwIAIABBFGogAkH4AWopAwA3AgAMEAsgACACKQPwATcCDCAAQYYCOwEkIABBDDYCCCAAQqKAgICggICAgH83AgAgAEEcaiACQYACaikDADcCACAAQRRqIAJB+AFqKQMANwIADA8LIAAgAikD8AE3AgwgAEGGBDsBJCAAQQk2AgggAEKigICAoICAgIB/NwIAIABBHGogAkGAAmopAwA3AgAgAEEUaiACQfgBaikDADcCAAwOCyAAIAIpA/ABNwIMIABBhgY7ASQgAEEKNgIIIABCooCAgKCAgICAfzcCACAAQRxqIAJBgAJqKQMANwIAIABBFGogAkH4AWopAwA3AgAMDQsgACACKQPwATcCDCAAQYYIOwEkIABBDTYCCCAAQqKAgICggICAgH83AgAgAEEcaiACQYACaikDADcCACAAQRRqIAJB+AFqKQMANwIADAwLIAAgAikD8AE3AgwgAEGGCjsBJCAAQQs2AgggAEKigICAoICAgIB/NwIAIABBHGogAkGAAmopAwA3AgAgAEEUaiACQfgBaikDADcCAAwLCyAAIAIpA/ABNwIIIABBAjoAICAAQqKAgICwgICAgH83AgAgAEEYaiACQYACaikDADcCACAAQRBqIAJB+AFqKQMANwIADAoLIAAgAikD8AE3AgggAEEDOgAgIABCooCAgLCAgICAfzcCACAAQRhqIAJBgAJqKQMANwIAIABBEGogAkH4AWopAwA3AgAMCQsgAkGYAmoiCiACQYACaikDADcDACACQZACaiILIAJB+AFqKQMANwMAIAIgAikD8AE3A4gCQQQhBSABKAIIIgMgBigCAEYNByABEMMMQfsARw0HIAIgARDDDCIHNgLkAiAHQfsARw0EIAJB8AJqIAZBCGoiBygCADYCACACIAYpAgA3A+gCIAEQrh4NAyACQawDaiAHKAIANgIAIAJBoANqIAJBGGooAgA2AgAgAiACKQMQNwOYAyACIAYpAgA3AqQDIAJBHjYCmAEgAkGkAmogASgCBCADIAJBmANqIAJBmAFqEJwPDAYLIAAgAikD8AE3AgggAEEFOgAgIABCooCAgLCAgICAfzcCACAAQRhqIAJBgAJqKQMANwIAIABBEGogAkH4AWopAwA3AgAMBwsgACACKQPwATcCCCAAQQg6ACAgAEKigICAsICAgIB/NwIAIABBGGogAkGAAmopAwA3AgAgAEEQaiACQfgBaikDADcCAAwGCyAAIAIpA/ABNwIIIABBCToAICAAQqKAgICwgICAgH83AgAgAEEYaiACQYACaikDADcCACAAQRBqIAJB+AFqKQMANwIADAULIAJBgANqIAcoAgA2AgAgAiAGKQIANwP4AiABEMMMIgdBLUYgB0Hf//8AcUHBAGtBGklyRQRAIAYgAikD6AI3AgAgBkEIaiACQfACaigCADYCAAwECyACIARBQGtBhKfEABC3HSACKAIEIQQgAigCACIHQQA2AggDQAJAAkACQAJAIAYoAgAgA0YNACABEMMMIghBLUYgCEHf//8AcUHBAGtBGklyDQMgBigCACADRg0AIAEQwwxB/QBGDQELIAJBrANqIAZBCGooAgA2AgAgAkGgA2ogAkHwAmooAgA2AgAgAiACKQPoAjcDmAMgAiAGKQIANwKkAyACQRw2ApgBDAELIAJBkANqIAZBCGooAgA2AgAgAiAGKQIANwOIAyABEPcIGiAHKAIEIgggBygCCCIJ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AyACQfgCaiAEENgUIANCADcDACADQgA3AyAgA0IANwNAIANByABqQQA6AAAgAyACKQP4AjcDCCADQRBqIA4pAwA3AwAgA0EYaiACQYgDaikDADcDACADIAIpA8ACNwMoIANBMGogAkHIAmopAwA3AwAgA0E4aiACQdACaikDADcDACALQgA3AwAgC0EIakEAOgAAIAJBATYCtAMgAiADNgK4AyACQQE2ArwDIAIgBzYCxAMgAiAKNgLAAyACQQI2ArADIAUgCBD2GQwBCyACKQOIASEdIAJBsANqIAJBuAFqENgUIAJB6ANqELATIQYgESACKQOwAzcCACARQQhqIAJBuANqKQMANwIAIBFBEGogAkHAA2opAwA3AgAgAi0AhAEhAyACQdgAahCwCCAJIAIpAtABNwIAIAlBCGogAkHYAWopAgA3AgAgCUEQaiACQeABaikCADcCACAJQRhqIAJB6AFqKAIANgIAIAJBADYCYCACQQE2AlggAiAdNwOIASACIAM6AIQBIAIgBjYCgAEgAikDwAIQ8RoLIAJB6ANqEIoWIAIpA7gBEPEaDAsLIAJBwAJqIgQgDxDYFEHIAEEEEM4iIgNCADcCMCADQYCAgIB4NgIYIANCBDcCECADQgA3AgggA0KAgICAgAE3AgAgA0E4akIANwIAIANBPmpCADcBACACKAKAASEGIAIgAzYCgAEgBiACQZABaiIFELcVIAJB+AJqIAQQzhsgAigCtAEgBBD7BUUEQCACQbADaiIIIAQQzhsgFCACKQOwAzcCACAUQQhqIAJBuANqKQMANwIAIBRBEGogAkHAA2opAwA3AgAgAi0AhAEhAyACQdgAahCwCCAMIAIpAqQCNwIAIAxBCGogAkGsAmopAgA3AgAgDEEQaiACQbQCaikCADcCACAMQRhqIAJBvAJqKAIANgIAIAJBATYCaCACQRE2AmAgAkEJNgJYIAIgAzoAjAEgAiAGNgKIAUHQAEEIEKEgIgNCADcDACADQgA3AyAgA0IANwNAIAMgAikDwAI3AwggA0EQaiACQcgCaikDADcDACADQRhqIAJB0AJqKQMANwMAIAMgAikD+AI3AyggA0EwaiAOKQMANwMAIANBOGogAkGIA2opAwA3AwAgA0HIAGpBADoAACACQQE2ArwDIAIgAzYCuAMgAkEBNgK0AyALQgA3AwAgC0EIakEAOgAAIAIgBzYCxAMgAiAKNgLAAyACQQI2ArADIAUgCBD2GQwLCyATIAIpA8ACNwIAIBNBCGogAkHIAmopAwA3AgAgE0EQaiACQdACaikDADcCACACLQCEASEDIAIpA4gBIR0gAkHYAGoQsAggCSACKQLsATcCACAJQQhqIAJB9AFqKQIANwIAIAlBEGogAkH8AWopAgA3AgAgCUEYaiACQYQCaigCADYCACACQQE2AmAgAkEBNgJYIAIgHTcDiAEgAiADOgCEASACIAY2AoABIAIpA/gCEPEaDAoLIAIoAsABBEAgCRDjFiEEIAIgBjYCuAMgAiADNgK0AyACIAg2ArADIAIgBCkCDDcCvAMgAiAEKAIUNgLEAyACIAQvARg7AcgDIAJBsANqIgYQ1BYhAyACQdgAahCwCCACIAM2AmwgAkECNgJoIAJBETYCYCACQQk2AlggBBDqKCAVQQhqIAJBwAFqKAIANgIAIBUgAikCuAE3AgAgC0IANwMAIAtBCGpBADoAACACIAc2AsQDIAIgCjYCwAMgAkECNgKwAyACQZABaiAGEPYZDAoLIAkQ4xYhBCACIAY2ArgDIAIgAzYCtAMgAiAINgKwAyACIAQpAgw3ArwDIAIgBCgCFDYCxAMgAiAELwEYOwHIAyACQbADahDUFiEDIAJB2ABqELAIIAIgBzYCjAEgAiAKNgKIASACIAM2AmQgAkECNgJgIAJBATYCWCAEEOooIAJBuAFqEIIjDAkLIBcgAkGQAWoQzwQMCAsgAigCtAEgDxD7BRoMBwsgAigCXCACQZABahD4AgwGCyACKAK0ASACKAJcQShqEPsFGgwFCyAPIAJBkAFqEJokDAQLIAIoAlwgAkGQAWoQ+AIMAwsCQAJAIAIoAmBBAWsOAgEEAAsgAkGQAWogDxDWDAwDCyAPIAJBkAFqEOEfDAILIAIoAnANASACKAJkQdAAbCENQQAhBSACKAJgIQQDQAJAIAUgDUcEQAJAAkACQEICIAQgBWoiBykDACIeQgJ9Ih0gHUICWhunQQFrDgIBAgALIAdBCGogAigCtAEQmiMMAwsgAigCtAEgB0EIahD7BRoMAgsCQAJAIAdBIGoiCikDAEICUQRAIAdBCGohCCACAn4gHqdBAXFFBEAgDiAIEM4bQgAMAQsgB0EUaigCACEGIAdBEGooAgAhAyAIKQMAEPQaIR4gAiAHQRhqKQMAIh1QBH5CAAUgHRD0Ggs3A5ADIAIgBjYCjAMgAiADNgKIAyACIB43A4ADQgELIh03A/gCIAcoAgANAiACKAK0ASAIEPsFDQIgHVAEQCAIIA4QsgsNAgsgCyACQZADaikDADcDACACQcADaiIGIAJBiANqKQMANwMAIAJBuANqIgMgDikDADcDACACIAIpA/gCNwOwAyAKEP4kIApBGGogCykDADcDACAKQRBqIAYpAwA3AwAgCkEIaiADKQMANwMAIAogAikDsAM3AwAMBAsgByACKAK0ARCaIwwDCyACQfgCahCDIAwCCyACQfgCahCDIAwBCyAWIAJBkAFqEJokDAMLIAVB0ABqIQUMAAsACyACQZABaiAXEJoECyACQbADaiIDIAJB2ABqQTgQ/AYaIAJBCGoiBCADEPYZIAQgAkGQAWoiAxDZFyADENMpDAALAAuoGwIhfwF+IwBBoAFrIgIkACACQQA2AlBBASEFIAJBATYCRCACQYCiwAA2AkAgAkIENwJIAkACQCABKAIUIg0gASgCGCIOIAJBQGsQrSQNACAAQShqIRogACgCKCIVQQJqIQ8gASgCGCEHIAEoAhQhCCAAKALAAiEbIAAoArwCIRwgACgCuAIhFiAAKAIIIRkgACgCBCEdAkACQAJAA0ACQCACQSBqIAsgHSAZQYiiwAAQ5RsCQAJAIAIoAiQiCQRAIAIoAiAhCgJ/AkACQCALRQRAIAooAgAiAUH/AXEhDEEAIRcMAQsgCigCACIBQf8BcSEMQQAhFyALIBZNDQELQQAMAQsCQCAMQf8BRwRAIAwgDEECdmogAUEDcUEAR2pBAmoiAyAJSQ0BIAMgCUGo/8MAEK0QAAsgCSAPIgNNDQsLQQEhF0EBIAogA0ECdGooAgAiBCAEQQBIGwshHgJ/AkACQAJAAkACQAJAIAFB/wFxQf4Baw4CAAQBCyAJQQFrDgIBAgQLIAlBAUcEQCAKKAIEIQMgAkEQakECIAogCUHgpsAAEOUbIAxBAnYgAUEDcUEAR2oiECACKAIUIgFLDQwgAigCECERIAJBCGogEEECaiAKIAlBgKfAABDlGyAMIAIoAgwiAUsNCyACKAIIIR9BAAwFC0EBQQFB0KbAABCtEAALQQFBAUGgp8AAEK0QAAtBAkECQbCnwAAQrRAACyAJQQFHBEAgCigCBCEDIAJBGGpBAiAKIAlB0KfAABDlGyACKAIcIgEgFUkNBiACKAIYIREgFSEQQQIMAgtBAUEBQcCnwAAQrRAACyABQQh2ISAgCigCCCERIAooAgQhA0EBCyEhIAsEQCALIBxGIAsgG0ZyIQEgCyAWSwRAIAENAyACQQA2AlAgAkEBNgJEIAJBvJnDADYCQCACQgQ3AkggDSAOIAJBQGsQrSRFDQQMCgsgAUUEQCACQQA2AlAgAkEBNgJEIAJByJnDADYCQCACQgQ3AkggDSAOIAJBQGsQrSRFDQQMCgsgAkEANgJQIAJBATYCRCACQZSrwAA2AkAgAkIENwJIIA0gDiACQUBrEK0kRQ0DDAkLIAJBADYCUCACQQE2AkQgAkHUmcMANgJAIAJCBDcCSCANIA4gAkFAaxCtJEUNAgwICyACQQI2AkQgAkGMo8AANgJAIAJCATcCTCACQSg2AowBIAIgAEHEAmo2AogBIAIgAkGIAWoiBjYCSCAIIAcgAkFAaxCtJA0HIAJBAjYCRCACQaijwAA2AkAgAkIBNwJMIAJBDzYCjAEgAiAAKAIcIgRBAEc6ACwgAiAGNgJIIAIgAkEsaiIDNgKIASAIIAcgAkFAaxCtJA0HIAJBAjYCRCACQciYwwA2AkAgAkIBNwJMIAJBEDYCjAEgAiAAQRhqNgKIASACIAY2AkggCCAHIAJBQGsQrSQNByACQQI2AkQgAkHomMMANgJAIAJCATcCTCACQRA2AowBIAIgACgCFCIBNgIsIAIgBjYCSCACIAM2AogBIAggByACQUBrEK0kDQcgAkECNgJEIAJB1KPAADYCQCACQgE3AkwgAkEQNgKMASACIABBrAJqNgKIASACIAY2AkggCCAHIAJBQGsQrSQNByACQQI2AkQgAkH8o8AANgJAIAJCATcCTCACQRA2AowBIAIgAEGwAmo2AogBIAIgBjYCSCAIIAcgAkFAaxCtJA0HIAJBAjYCRCACQaCkwAA2AkAgAkIBNwJMIAJBEDYCjAEgAiAaNgKIASACIAY2AkggCCAHIAJBQGsQrSQNByACQQI2AkQgAkHApMAANgJAIAJCATcCTCACQSc2AowBIAIgAEEsajYCiAEgAiAGNgJIIAggByACQUBrEK0kDQcgAkHgpMAANgJAIAJCATcCTCACQRA2AowBIAAoAiQhACACQQI2AkQgAiABIBlqQQJ0IABBACAEG2o2AiwgAiAGNgJIIAIgAzYCiAEgCCAHIAJBQGsQrSQNByACQQA2AlAgAkEBNgJEIAJBmMPDADYCQCACQgQ3AkggCCAHIAJBQGsQrSQhBQwHCyACQQA2AlAgAkEBNgJEIAJBiKvAADYCQCACQgQ3AkggDSAOIAJBQGsQrSQNBgsgAiALNgI8IAJBCTYCOCACQQk2AjAgAiADNgKEASACIAJBhAFqNgI0IAIgAkE8ajYCLCACQQM6AHwgAkEINgJ4IAJCoICAgBA3AnAgAkKAgICA4AA3AmggAkECNgJgIAJBAzoAXCACQQg2AlggAkIgNwJQIAJCgICAgOAANwJIIAJBAjYCQCACQQI2ApwBIAJBAzYCjAEgAkGYosAANgKIASACIAJBQGs2ApgBIAJBAjYClAEgAiACQSxqNgKQASANIA4gAkGIAWoQrSQNBEEAIQZBACEEQQAhGEEAIQFBACESA0AgBiEDIAQhEyAiIRQDQAJAAkACQAJAAkACfwJ/An8CQAJAAkACQAJAICFBAWsOAgABAgtBASEFICAhBCARIAFFDQUaDAILIAEgEE8NASARIQYgAQwDCyABIAxJDQELIBIEQEEAIRIgAyEGIBMhBCAUDAQLIAJBADYCUEEBIQUgAkEBNgJEIAJB9M3fADYCQCACQgQ3AkggCCAHIAJBQGsQrSQNEAJAIAsEQCALIBZLDQEgAkEANgJQIAJBATYCRCACQcSiwAA2AkAgAkIENwJIIAggByACQUBrEK0kDRJBACEBA0AgASAeRgRAIAJBADYCUCACQQE2AkQgAkH0zd8ANgJAIAJCBDcCSCAIIAcgAkFAaxCtJEUNAwwUCyACIAE2AogBIA8hAyAKLQAAIgRB/wFHBEAgBCAEQQJ2aiAEQQNxQQBHakECaiEDCyADIAlJBEACQAJAAkAgCiADQQJ0aigCACIEQQBOBEAgASADakEBaiIEIAlJDQEgBCAJQfj+wwAQrRAACyABRQ0BIAJBADYCQEEAQYyN4AAgAkGIAWogAkFAa0GI/8MAEM4aAAsgCiAEQQJ0aigCACEDIAFFDQEgAkEANgJQIAJBATYCRCACQZjFwwA2AkAgAkIENwJIIAggByACQUBrEK0kRQ0BDBYLIARB/////wdxIQMLIAJBATYCRCACQfz24AA2AkAgAkIBNwJMIAJBCTYCjAEgAiADNgIsIAFBAWohASACIAJBiAFqNgJIIAIgAkEsajYCiAEgCCAHIAJBQGsQrSRFDQEMFAsLIAMgCUHo/sMAEK0QAAsgAkEJNgIwIAJBATYChAEgAkEBNgKcASACQQI2AowBIAJB0KLAADYCiAEgAkEBNgKUASACIAJBhAFqNgIsIAJBAzoAXCACQQg2AlggAkIgNwJQIAJCgICAgOAANwJIIAJBAjYCQCACIAJBQGs2ApgBIAIgAkEsajYCkAEgCCAHIAJBiAFqEK0kDRELQQIhBiAVIQQCQAJAAkAgCi0AACIBQf4Baw4CAQIACyABQQJ2IAFBA3FBAEdqQQJqIQYgASEEDAELQQEhBAtBACEDAkACQAJAAkAgF0UNAAJAAkAgAUH/AUcEQCABIAFBAnZqIAFBA3FBAEdqQQJqIgEgCUkNASABIAlBqP/DABCtEAALIAkgD00NA0EBIQMgCiAPQQJ0aigCACIBQQBIDQIgAUEBRw0BDAILQQEhAyAKIAFBAnRqKAIAIgFBAEggAUEBRnINAQsgAUEBaiEDCyALIAQgBmogA2pqIgEgC0kNASACQUBrIAEQ2hwgAigCQEEBRg0CIAIoAkQhCwwPCyAPIAlBuP/DABCtEAALQeCiwAAQ2ikACyACIAIpA0g3A4gBQZTq4ABBKyACQYgBakHcocAAQfCiwAAQxg4ACyABQQJ2IgQgEE8NAyACIBEgBEECdGooAgA2AkAgHyEGIAJBQGsgAUEDcXItAAALIQQgAUEBaiEFIAYgAUECdGooAgALIQYgEkUEQCAGrUIghiAErUL/AYMiI0IIhoQgI4QhIwwGCyADIAZGDQJBASESIAUhASAECyEiIANBAUYNBiAYDQIMAwsgBCAQQfyowAAQrRAACyAUrUL/AYMgA61CIIYgBK1C/wGDQgiGhIQhIwwCCyACQQA2AlBBASEFIAJBATYCRCACQZjFwwA2AkAgAkIENwJIIAggByACQUBrEK0kDQkLIBhBAWohGCAUQf8BcSATQf8BcUcEQCACIBQ6ADwgAiATOgCEASACQQM2AowBIAJB2MbDADYCiAEgAkIDNwKUASACQRA2AlQgAkERNgJMIAJBETYCRCACIAM2AiwgAiACQUBrNgKQASACIAJBLGo2AlAgAiACQYQBajYCSCACIAJBPGo2AkAgCCAHIAJBiAFqEK0kDQgMAwsgAiATOgCEASACQQI2AkQgAkGkxcMANgJAIAJCAjcCTCACQRA2ApQBIAJBETYCjAEgAiADNgIsIAIgAkGIAWo2AkggAiACQSxqNgKQASACIAJBhAFqNgKIASAIIAcgAkFAaxCtJA0HDAILICNCIIinIQMgI0IIiKchEyAjpyEUQQEhEiAFIQEMAAsACwALCyAVIAFB4KfAABCvEAALIAwgAUGQp8AAEK8QAAsgECABQfCmwAAQrxAAC0EBIQULIAJBoAFqJAAgBQ8LIA8gCUG4/8MAEK0QAAvYFwIKfwV+IwBBQGoiAiQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAALQAAQQFrDgUAAQIDBQQLIAJBCGoiBSABKAIAQcm84ABBxLzgACAALQABIgAbQQRBBSAAGxDvJCAFEOAYIQEMDAsCQAJAAkAgACgCCEEBaw4CAQIAC0EUIQMgACkDECINQpDOAFQEQCANIQwMDQsDQCACQQhqIANqIgBBBGsgDSANQpDOAIAiDEKQzgB+faciBUH//wNxQeQAbiIEQQF0QdyK2ABqLwAAOwAAIABBAmsgBSAEQeQAbGtB//8DcUEBdEHcitgAai8AADsAACADQQRrIQMgDUL/wdcvViAMIQ0NAAsMDAtBFCEDIAApAxAiDiAOQj+HIgyFIAx9Ig1CkM4AVARAIA0hDAwLCwNAIAJBCGogA2oiAEEEayANIA1CkM4AgCIMQpDOAH59pyIFQf//A3FB5ABuIgRBAXRB3IrYAGovAAA7AAAgAEECayAFIARB5ABsa0H//wNxQQF0QdyK2ABqLwAAOwAAIANBBGshAyANQv/B1y9WIAwhDQ0ACwwKCyAAKQMQIgxC////////////AINC//////////f/AFgEQCAMQv////////8HgyENIAxCNIinIQAgDEIAUw0FIAJBCGohBQwJCyACQQhqIgAgASgCAEGBtuAAQQQQ7yQgABDgGCEBDAsLIAEoAgAgACgCCCAAKAIMEIwcIQEMCgsgASAAQQRqEPMKIQEMCQsgASgCABCNHCEBDAgLIAJBCGogASAAKAIMIgEQpA0gAi0ADCIKQQNGDQEgAigCCCEJIAAoAgghAyACIAFBACAAKAIEIgAbIgs2AiggAiADNgIkIAIgADYCICACQQA2AhwgAiAAQQBHIgg2AhggAiADNgIUIAIgADYCECACQQA2AgwgAiAINgIIQQAhAANAIAtFDQQgAiALQQFrIgs2AigCQCAIRSAAckUEQCACKAIQIQADQCADBEAgA0EBayEDIAAoApgDIQAMAQUgAkIANwIQIAIgADYCDEEBIQhBACEDDAMLAAsACyAIRQ0ECyACKAIQIQECQANAIAMgAC8BkgNJDQEgACgCiAIiBQRAIAFBAWohASAALwGQAyEDIAUhAAwBCwtBlI3YABDaKQALIANBAWohBwJAIAFFBEAgACEFDAELIAAgB0ECdGpBmANqIQRBACEHQQAhBgNAIAQoAgAiBUGYA2ohBCABIAZBAWoiBkcNAAsLIAIgBzYCFCACQQA2AhAgAiAFNgIMIAJBOGoiBCAJKAIAIApBAUYQ+SAgBBDgGCIBDQggCSgCACAAIANBDGxqIgFBkAJqKAIAIAFBlAJqKAIAEIwcIgENCCACQQQ6ADggAkE4ahDgGCIBDQggBCAJKAIAEIcqIAJBOGoQ4BgiAQ0IIAAgA0EYbGogCRBsIgENCCACQQQ6ADhBAiEKIAchAyAFIQAgAkE4ahDgGCIBRQ0ACwwHCyACQQlqIQUgAkEtOgAIQQEhCAwDCyACKAIIIQEMBQtBpI3YABDaKQALIAkoAgAgChCLGCEBDAMLAkACfwJAAkACQAJAAn8CQCAAQf8PcSIARSANUHFFBEAgAEECSSANQgBSciEDIA1CgICAgICAgAiEIA0gABsiDEIChiEOIAxCAYMhEAJAAkAgAEG1CGtBzHcgABsiAEEASARAIAxB+IXXACAAIABBhaJTbEEUdiAAQX9HayIAaiIHQQR0IgRrKQMAQYCG1wAgBGspAwAgACAHQbHZtX9sQRN2a0H8AGogAkEwaiACQThqIAMQiRghDSACKQM4IQwgAikDMCEPIABBAkkNASAOQn8gAK2GQn+Fg1BFIABBP09yDQYMAgsgDCAAQcHoBGxBEnYgAEEDS2siB0EEdCIEQZjb1gBqKQMAIARBoNvWAGopAwAgByAAayAHQc+mygBsQRN2akH9AGogAkEwaiACQThqIAMQiRghDSACKQM4IQwgAikDMCEPIAdBFk8NBUEAIA6nayAOQgWAp0F7bEcEQCAQUA0EIA8gDkIChCAHELEerX0hDwwGCyAOIAcQsR5FDQUMAQsgDyAQfSEPIAMgEFBxIQYLQQEMAgsgBUECakHartcALQAAOgAAIAVB2K7XAC8AADsAACAMQj+Ip0EDaiEADAcLIAOtQn+FIA58IAcQsR5FDQFBASEGQQALIQRBACEDQQAhAANAIA9CCoAiDyAMQgqAIg5YDQIgBkEAIAynayAOp0F2bEZxIQYgAEEBaiEAIANB/wFxRSAEcSEEIA2nIA1CCoAiDadBdmxqIQMgDiEMDAALAAtBACEDAn8gD0LkAIAiECAMQuQAgCIOWARAIAwhDiAPIRBBAAwBCyANpyANQuQAgCINp0Gcf2xqQTFLIQNBAgshAANAIBBCCoAiECAOQgqAIgxYDQIgAEEBaiEAIA2nIA1CCoAiDadBdmxqQQRLIQMgDCEODAALAAsgBkEBcUUNAQNAQQAgDKdrIAxCCoAiDqdBdmxHDQIgAEEBaiEAIANB/wFxRSAEcSEEIA2nIA1CCoAiDadBdmxqIQMgDiEMDAALAAsgDSAOUSADcgwBCyAQpyAGQQFzciAMIA1RcUEEQQUgDUIBg1AbIAMgBEEBcRsgAyADQf8BcUEFRhtB/wFxQQRLcgshAwJAIAAgB2oiAEEATiAAAn9BESANIAOtQgGDfCIMQv//g/6m3uERVg0AGkEQIAxC//+Zpuqv4wFWDQAaQQ8gDEL//+iDsd4WVg0AGkEOIAxC/7/K84SjAlYNABpBDSAMQv+flKWNHVYNABpBDCAMQv/P28P0AlYNABpBCyAMQv/Hr6AlVg0AGkEKIAxC/5Pr3ANWDQAaQQkgDEL/wdcvVg0AGkEIIAxC/6ziBFYNABpBByAMQr+EPVYNABpBBiAMQp+NBlYNABpBBSAMQo/OAFYNABpBBCAMQucHVg0AGkEDIAxC4wBWDQAaQQJBASAMQglWGwsiBmoiBEERSHFFBEAgBEEBayIAQRBJDQEgBEEEakEFTwRAIAZBAUYEQCACQQhqIgMgCGogDKdBMGo6AAAgBUHlADoAASAAIAMgCEECciIAahDkCyAAaiEADAQLIAwgBiAIaiIDIAJBCGoiB2oiBEEBahDiBSAHIAhqIAUtAAE6AAAgBUEuOgABIARB5QA6AAEgACAHIANBAmoiAGoQ5AsgAGohAAwDCyACQQhqIAhqQTA6AAAgBUEuOgABIAVBAmohAEECIARrIQUDQCAEBEAgAEEwOgAAIARBAWohBCAAQQFqIQAMAQUgDCAGIAhqIAVqIgAgAkEIamoQ4gUMBAsACwALIAwgBSAGaiIDEOIFIAYgBCAEIAZIGyAGayEAA0AgAARAIANBMDoAACAAQQFrIQAgA0EBaiEDDAEFIAQgCGoiACACQQhqakGu4AA7AAAgAEECaiEADAMLAAsACyAMIAYgCGpBAWoiACACQQhqahDiBSAFIAVBAWogBBDQLSAEakEuOgAACyACQThqIgUgASgCACACQQhqIAAQ7yQgBRDgGCEBDAILIAynIgRB4wBKBEAgA0ECayIDIAJBCGpqIAQgBEHkAG4iBEHkAGxrQQF0QdyK2ABqLwAAOwAACwJAIARBCk4EQCADQQJrIgAgAkEIamogBEEBdEHcitgAai8AADsAAAwBCyADQQFrIgAgAkEIamogBEEwajoAAAsgDkIAUwRAIABBAWsiACACQQhqakEtOgAACyACQThqIgUgASgCACACQQhqIABqQRQgAGsQ7yQgBRDgGCEBDAELIAynIgBB4wBKBEAgA0ECayIDIAJBCGpqIAAgAEHkAG4iAEHkAGxrQQF0QdyK2ABqLwAAOwAACwJAIABBCk4EQCADQQJrIgMgAkEIamogAEEBdEHcitgAai8AADsAAAwBCyADQQFrIgMgAkEIamogAEEwajoAAAsgAkE4aiIAIAEoAgAgAkEIaiADakEUIANrEO8kIAAQ4BghAQsgAkFAayQAIAEL2xoBDn8jAEGAAmsiBCQAAkACQAJAAn8CQAJAAkACfwJAAkAgAygCECIHIAMoAhQiBU0EQCADLQAYRQRAIARB0AFqIAMQ3BggBCgC1AEhCSAEKALQASELQQIgBC0A2AFBAUcNCBogBC0A2QEhBiABQdgEaiIIEP4pRQ0GDAcLIARB0AFqIAMQ3BggBCgC1AEhCiAEKALQASEJQQIgBC0A2AFBAUcNAxogBC0A2QEhBiABQdgEaiIIEP4pRQ0BDAILIABBADYCAAwICyAIIAYQ2hVFDQAgBCAGrUIghkIEhDcD6AEMAgsgASAGakHYAGotAAALIgghBgJ/AkACQAJAIAlBAWsOAgABAgsgBkEGaiEGDAELIAEtAFFBAXFFBEAgBCAKrUIghkIChDcD6AEMAwsgASgC+AQoAtQCIApLBEAgCkEGbCAGakEMaiEGDAELIAEQ/hMMAQsgAigChAEgAigCiAEgBkGU5MMAEK8fKAIACyIGQQBOBEAgBEEFNgLoASAEIAY2AuwBDAELIAQgAjYC+AEgBCABNgL0ASAEQegBaiAEQfQBaiAJIAogCBDBAQsgBEHgAGogBEHoAWogBRCsDiAEKAJkIQgCQAJAAkACQAJAAkACQCAEKAJgRQRAIAUgB0YNByACIAVBAWsiBRClFUF/IAdBA2oiBiAGIAdJGyENIAFB2AJqIQkgAygCCCILQQNrIQ4gAygCDCEKA0ACQAJAAkACQAJAAkACQCAIQf///z9NBEAgAigCeCEDA0AgBSAHSQ0IIAUgDU0gAyAIIAkgBSAOaiIMQQNqLQAAai0AAGpBAnRqKAIAIgZB////P0tyDQUgAyAGIAkgDEECai0AAGotAABqQQJ0aigCACIIQf///z9LDQMgAyAIIAkgDEEBai0AAGotAABqQQJ0aigCACIGQf///z9LDQQgAyAGIAkgDC0AAGotAABqQQJ0aigCACIIQf///z9LDQIgBUEEayEFDAALAAsgAiAFEPIgIAUgCkkEQCAEQcgAaiABIAIgCCAFIAtqLQAAEI0OIARBQGsgBCgCSCAEKAJMIAUQlx0gBCgCRCEGIAQoAkBFDQYgAEECNgIAIAAgBjYCBAwVCyAFIApBkObDABCtEAALIAVBA2shBSAGIQMgCCEGDAMLIAVBAWshBSAGIQMgCCEGDAILIAVBAmshBSAIIQMMAQsgCCEDCyAGQQBODQAgAiAFEPIgIARB2ABqIAEgAiADIAUgC2otAAAQjQ4gBEHQAGogBCgCWCAEKAJcIAUQlx0gBCgCVCEGIAQoAlBFDQAgAEECNgIAIAAgBjYCBAwPCyAGQYCAgIABcSAGQYCAgMAASXJFBEACQCAGQYCAgMAAcUUEQCAGQYCAgIAEcQ0BIAZBgICAgAJxRQ0SIAIgBRDrFSAFIApJBEAgBSALai0AACAFEOUaIQEgAEECNgIAIAAgATYCBAwSCyAFIApBsObDABCtEAALIAEgAiAGQQAQjg4hASACIAUQ6xUgACAFQQFqNgIIIAAgATYCBCAAQQE2AgAMEAsgAiAFEOsVIABBADYCAAwPCyAGIQgLIAUgB0cEQCAFQQFrIQUMAQsLIAIgBxDrFSAHRQRAIARBKGogASACIAgQqw5BACEHIARBIGogBCgCKCAEKAIsQQAQlx0gBCgCJCEFIAQoAiANAyAFQYCAgMAAcUUNBwwGCyAHQQFrIgYgCkkNASAGIApB8ObDABCtEAALIABBAjYCACAAIAg2AgQMCwsgBEE4aiABIAIgCCAGIAtqLQAAIgMQjQ4gBEEwaiAEKAI4IAQoAjwgBxCXHSAEKAI0IQUgBCgCMA0AIAVBgICAwABxDQMgBUGAgICAAnFFDQEgAyAGEOUaIQUMAgsgBQ0BC0EAIQcMAgsgAEECNgIAIAAgBTYCBAwHCyAHIQNBASEHIAEgAiAFQQAQjg4hBgsgACADNgIIIAAgBjYCBCAAIAc2AgAMBQsCQAJAAkACQAJAAkAgB0UEQCAEQQhqIAEgAiAIEKsOQQAhByAEIAQoAgggBCgCDEEAEJcdIAQoAgQhBSAEKAIADQEgBUGAgIDAAHFFDQYMBQsgB0EBayIGIAMoAgwiCk8EQCAGIApB8ObDABCtEAALIARBGGogASACIAggAygCCCAGai0AACIDEI0OIARBEGogBCgCGCAEKAIcIAcQlx0gBCgCFCEFIAQoAhANACAFQYCAgMAAcQ0EIAVBgICAgAJxDQEMAwsgBUUNAgwBCyADIAYQ5RohBQsgAEECNgIAIAAgBTYCBAwHC0EAIQcMAQsgByEDQQEhByABIAIgBUEAEI4OIQYLIAAgAzYCCCAAIAY2AgQgACAHNgIADAQLIAggBhDaFUUNACAEIAatQiCGQgSENwPoAQwCCyABIAZqQdgAai0AAAsiCCEGAn8CQAJAAkAgC0EBaw4CAAECCyAGQQZqIQYMAQsgAS0AUUEBcUUEQCAEIAmtQiCGQgKENwPoAQwDCyABKAL4BCgC1AIgCUsEQCAJQQZsIAZqQQxqIQYMAQsgARD+EwwBCyACKAKEASACKAKIASAGQZTkwwAQrx8oAgALIgZBAE4EQCAEQQU2AugBIAQgBjYC7AEMAQsgBCACNgL4ASAEIAE2AvQBIARB6AFqIARB9AFqIAsgCSAIEMEBCyAEQcgBaiAEQegBaiAFEKwOIAQoAswBIQYCQAJAAkACQAJAAkAgBCgCyAFFBEAgBSAHRg0GIAIgBUEBayIFEKUVQX8gB0EDaiIIIAcgCEsbIRAgAUHYAmohCyADKAIIIgxBA2shESADKAIMIQkCQAJAA0ACQAJAAkACQAJAAkACQAJAIAZB////P00EQCACKAJ4IQMDQCAFIAdJDQggBSAQTSADIAYgCyAFIBFqIg5BA2otAABqLQAAakECdGooAgAiCEH///8/S3INBSADIAggCyAOQQJqLQAAai0AAGpBAnRqKAIAIgZB////P0sNAyADIAYgCyAOQQFqLQAAai0AAGpBAnRqKAIAIghB////P0sNBCADIAggCyAOLQAAai0AAGpBAnRqKAIAIgZB////P0sNAiAFQQRrIQUMAAsACyACIAUQ8iAgBSAJSQRAIARBsAFqIAEgAiAGIAUgDGotAAAQjQ4gBEGoAWogBCgCsAEgBCgCtAEgBRCXHSAEKAKsASEGIAQoAqgBRQ0GIABBAjYCACAAIAY2AgQMEwsgBSAJQZDmwwAQrRAACyAFQQNrIQUgBiEDIAghBgwDCyAFQQFrIQUgBiEDIAghBgwCCyAFQQJrIQUgCCEDDAELIAghAwsgA0EATgRAIAMhBgwBCyACIAUQ8iAgBEHAAWogASACIAYgBSAMai0AABCNDiAEQbgBaiAEKALAASAEKALEASAFEJcdIAQoArwBIQYgBCgCuAFFDQAgAEECNgIAIAAgBjYCBAwNCyAGQYCAgIABcSAGQYCAgMAASXINACAGQYCAgMAAcUUEQCAGQYCAgIAEcQ0CIAZBgICAgAJxDQQMDgtBASENIAVBAWohCiABIAIgBkEAEI4OIQ8LIAUgB0YNAyAFQQFrIQUMAQsLIAIgBRDrFQwHCyACIAUQ6xUgBSAJSQRAIAUgDGotAAAgBRDlGiEBIABBAjYCACAAIAE2AgQMCQsgBSAJQbDmwwAQrRAACyACIAcQ6xUgB0UEQCAEQZABaiABIAIgBhCrDkEAIQcgBEGIAWogBCgCkAEgBCgClAFBABCXHSAEKAKMASEFIAQoAogBDQMgBUGAgIDAAHFFDQYMBQsgB0EBayIDIAlJDQEgAyAJQfDmwwAQrRAACyAAQQI2AgAgACAGNgIEDAYLIARBoAFqIAEgAiAGIAMgDGotAAAiBhCNDiAEQZgBaiAEKAKgASAEKAKkASAHEJcdIAQoApwBIQUgBCgCmAENACAFQYCAgMAAcQ0CIAVBgICAgAJxRQ0DIAYgAxDlGiEFDAELIAVFDQILIABBAjYCACAAIAU2AgQMAwtBASENIAEgAiAFQQAQjg4hDyAHIQoLIAAgCjYCCCAAIA82AgQgACANNgIADAELAkACQAJAAkACQAJAIAdFBEAgBEHwAGogASACIAYQqw5BACEHIARB6ABqIAQoAnAgBCgCdEEAEJcdIAQoAmwhBSAEKAJoDQEgBUGAgIDAAHFFDQYMBQsgB0EBayIIIAMoAgwiCk8EQCAIIApB8ObDABCtEAALIARBgAFqIAEgAiAGIAMoAgggCGotAAAiAxCNDiAEQfgAaiAEKAKAASAEKAKEASAHEJcdIAQoAnwhBSAEKAJ4DQAgBUGAgIDAAHENBCAFQYCAgIACcQ0BDAMLIAVFDQIMAQsgAyAIEOUaIQULIABBAjYCACAAIAU2AgQMAwtBACEHDAELIAEgAiAFQQAQjg4hAyAHIQZBASEHCyAAIAY2AgggACADNgIEIAAgBzYCAAsgBEGAAmokAA8LIARBATYC1AEgBEHo5cMANgLQASAEQgA3AtwBIAQgBEH8AWo2AtgBIARB0AFqQaDmwwAQuh0AC9MZAi1/BH4jAEGAAmsiAiQAIAEoAgQhAyACQRBqIAEoAggiGUEIQTgQ+RQgAyAZQThsaiEhIAJB2AFqIRUgAkG4AWohByACQdABaiEWIAJB6ABqIRIgAkHIAGohEyACKAIUIRogAigCECIiIRcDQAJ/AkACfwJAAn8CQAJAIBdFIAMgIUZyRQRAIAMoAgAiG0EJRwRAAkACQAJAAkACQAJAAkACQAJAIBtBAWsOCAECAwQFBgcIAAsgAygCCCELIAMoAhghBCADKAIUIQkgAiADKAIMIgZBCEHIABD5FCAGQcgAbCEMQQAhASACKAIEIQ8gAigCACIIIQoDQCAKRSABIAxGckUEQAJ+AkACQAJAIAEgC2oiBSkDAEIDfSIvp0EBakEAIC9CAlQbQQFrDgIBAgALIAVBOGopAgAhLyAWIAVBIGoQzhsgAkGwAWogBRC0ICACQSBqIAdBCGopAwA3AwAgAkEoaiAHQRBqKQMANwMAIAJBMGogB0EYaikDADcDACATIBVBCGopAwA3AwAgAiAvNwPoASACQdAAaiAVQRBqKQMANwMAIAIgBUFAay0AADoA8AEgAkHYAGogFUEYaikDADcDACACIAcpAwA3AxggAiAVKQMANwNAIAIpA7ABDAILIAVBCGopAgAhLyAHIAVBEGoQzhsgAkEgaiAHKQMANwMAIAJBKGogAkHAAWopAwA3AwAgAkEwaiACQcgBaikDADcDACACIC83AxhCAwwBCyAFQQhqKQIAIS8gByAFQRBqEM4bIAJBIGogBykDADcDACACQShqIAJBwAFqKQMANwMAIAJBMGogAkHIAWopAwA3AwAgAiAvNwMYQgQLIS8gByACQSBqKQMANwMAIAJBwAFqIhAgAkEoaikDADcDACACQcgBaiINIAJBMGopAwA3AwAgEiATKQMANwMAIAJB8ABqIhQgAkHQAGopAwA3AwAgAkH4AGoiESACQdgAaikDADcDACACIAIpAxg3A7ABIAIgAikDQDcDYCABIA9qIgUgLzcDACAFQQhqIAIpA7ABNwMAIAVBEGogBykDADcDACAFQRhqIBApAwA3AwAgBUEgaiANKQMANwMAIAVBKGogAikDYDcDACAFQTBqIBIpAwA3AwAgBUE4aiAUKQMANwMAIAVBQGsgESkDADcDACAKQQFrIQogAUHIAGohAQwBCwsgAygCEBCYESEFIAMtACAhCyADQRxqELAOIQwgAy0AISEQDAsLIAMoAjQhCiADKAIwIQ0CQAJAAkACQAJAAkACQAJAAkAgAygCCCIPQQFrDgcBAgMEBQYHAAsgAkGwAWogA0EQahDOGyADLQAsIQEgAiADQShqEP0LNgLIAQwUCyACQbABaiADQRBqEM4bIAMtACwhASACIANBKGoQ/gs2AsgBDBMLEO0iIQYgAygCDCIBKAIUIQQgASkCDCEvIAEvARghCSACQbABaiABEM0KIAJByAFqIgEgCTsBACAGIAIpArABNwIAIAIgLzcCvAEgBkEIaiAHKQIANwIAIAIgBDYCxAEgBkEQaiACQcABaikCADcCACAGQRhqIAEoAgA2AgAMBQsQ7iIhBiADKAIMIgEtABQhBCABKQIMIS8gAkGwAWogARDNCiAGIAIpArABNwIAIAIgLzcCvAEgBkEIaiAHKQIANwIAIAIgBDoAxAEgBkEQaiACQcABaikCADcCAAwECyADQQxqEJgLIQYMAwsQ7CIhBiADKAIMIgEpAwAhLyABLQAoIQQgByABQQhqEM4bIAFBIGoQog8hCSABQSRqEPEZIQEgAiAEOgDYASACIC83A7ABIAIgATYC1AEg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OgAgIA4gHTYCHCAOIB42AhggDiAfNgIUIA4gIDYCECAOIDE3AgggDiAINgIEIA4gGzYCACAOIAo2AjQgDiANNgIwIA4gLzcCKCAOIAE2AiQgDiACLwGwATsAIiAYQQFqIRgMAAsAC8wZAg5/An4jAEGwAmsiAiQAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAEoAgBBAWsOEgECAwQFBgcICQoLDA0ODxAREgALIAJBIGogAUEEahDSHyAAQQA2AgAgAEEUaiACQTBqKQIANwIAIABBDGogAkEoaikCADcCACAAIAIpAiA3AgQMEgsgAEEBNgIAIAAgASkCBDcCBAwRCyAAQQI2AgAgACABKQIENwIEDBALIAEpAgwhECABQQRqEPAcIQMgAUEIahC6GSEBIAAgEDcCDCAAIAE2AgggACADNgIEIABBAzYCAAwPCyABKQIEIRAgACABQQxqEPQkNgIMIAAgEDcCBCAAQQQ2AgAMDgsgASkDCCEQIAJBIGogAUEQahDOGyABQShqELoZIQEgACAQNwMIIAAgATYCKCAAQQU2AgAgACACKQMgNwMQIABBGGogAkEoaikDADcDACAAQSBqIAJBMGopAwA3AwAMDQsgASkDCCEQIAJBKGoiAyABQRBqELUgIAAgEDcDCCAAQQY2AgAgAEEQaiADKQMANwMAIABBGGogAkEwaikDADcDACAAQSBqIAJBOGopAwA3AwAMDAsgASkDCCEQIAJBKGoiAyABQRBqELUgIAAgEDcDCCAAQQc2AgAgAEEQaiADKQMANwMAIABBGGogAkEwaikDADcDACAAQSBqIAJBOGopAwA3AwAMCwsgASgCECEDIAEoAgwhBCABQQRqEPAcIQYgAUEIahC6GSEFIAAgASgCFAR/IAFBFGoQuhkFQQALNgIUIAAgAzYCECAAIAQ2AgwgACAFNgIIIAAgBjYCBCAAQQg2AgAMCgsgASgCGCEHIAEoAhQhCSABQRBqEPAcIQogASgCCCELIAJBCGogASgCDCIEQQRBGBD5FCACKAIIIgYgBEH/////AXEiASABIAZLGyEDQQAhASACKAIMIQUDQCADBEAgASALaiIIQQxqKQIAIRAgCEEUahD0JCEMIAJBIGogCBCPDCACIBA3AiwgAiAMNgI0IAJBKGopAgAhECACKQIgIREgASAFaiIIQRBqIAJBMGopAgA3AgAgCEEIaiAQNwIAIAggETcCACADQQFrIQMgAUEYaiEBDAELCyAAIAc2AhggACAJNgIUIAAgCjYCECAAIAQ2AgwgACAFNgIIIAAgBjYCBCAAQQk2AgAMCQsgASkDCCEQIAFBBGoQ8BwhASAAIBA3AwggACABNgIEIABBCjYCAAwIC0EIIQNBCEGAARCxKCIERQ0IIAEoAgQiASgCfCEGIAEoAnghBSACQZACaiABQcgAahDSHyABKAIAIghBCEcEQCABKAJEIQMgASgCQCEHAkAgCEEHRgRAIAJBBzYCoAEMAQsgAkGgAWogARDfBAsgAkHIAGogAUEoahDSHyACIAM2AmQgAiAHNgJgIAJBIGoiByACQaABaiIIQSgQ/AYaIAIoAiAhAyAIIAdBBHJBxAAQ/AYaCyACQYABaiABQeAAahC2ICACQfAAaiACQZgCaikCADcDACACQfgAaiACQaACaikCADcDACACIAY2ApwBIAIgBTYCmAEgAiADNgIgIAIgAikCkAI3A2ggAkEgaiIBQQRyIAJBoAFqQcQAEPwGGiAEIAFBgAEQ/AYhASAAQQs2AgAgACABNgIEDAcLIAEpAgwhECABQQRqEPAcIQMgAUEIahC6GSEBIAAgEDcCDCAAIAE2AgggACADNgIEIABBDDYCAAwGCyABKQIMIRAgAUEEahDwHCEDIAFBCGoQuhkhASAAIBA3AgwgACABNgIIIAAgAzYCBCAAQQ02AgAMBQtBAiEDIAEoAhQhBiABKAIQIQUCQCABKAIEIghBAkYNACABQQhqIQRBASEDIAhBAXFFBEBBACEDIAQQ4wwhBAwBCyAEEPAcIQQLIAFBGGoQ9CQhCCABQRxqEPQkIQcgAUEMahC6GSEBIAAgBzYCHCAAIAg2AhggACAGNgIUIAAgBTYCECAAIAE2AgwgACAENgIIIAAgAzYCBCAAQQ42AgAMBAsgASkCFCEQIAJBEGogAUEEahCRECACKQMQIREgAUEMahDwHCEDIAFBEGoQuhkhASAAIBA3AhQgACABNgIQIAAgAzYCDCAAIBE3AgQgAEEPNgIADAMLIAEpAhQhECABLQAcIQMgAkEYaiABQQRqEJEQIAIpAxghESABQQxqEPAcIQQgAUEQahC6GSEBIAAgAzoAHCAAIBA3AhQgACABNgIQIAAgBDYCDCAAIBE3AgQgAEEQNgIADAILAkACQAJAAkACQAJAAkACQAJAIAEoAggiCEEBaw4HAQIDBAUGBwALIAJB6AFqIAFBEGoQzhsgAS0ALCEGEO8iIQQgASgCKCIBKAIsIQcgASgCKCEJIAEoAiQhCiACQZACaiABEMoLIAJBoAFqIAFBDGoQ1QEgAUEwahD0JCELIAEtADwhDCABQTRqEKIPIQ0CQCABKAI4IgVFBEAMAQsQ6yIhAyAFKAIMIQ4gBSgCECEPIAJBIGogBRCpDSADQRBqIA82AgAgAyACKQIgNwIAIAIgDjYCLCADQQhqIAJBKGopAgA3AgALIAJBOGogAUEYahCACyACQShqIAJBmAJqKAIANgIAIAJBNGogAkGoAWooAgA2AgAgAiAHNgJMIAIgCTYCSCACIAo2AkQgAiAMOgBcIAIgCzYCUCACIAM2AlggAiANNgJUIAIgAikCkAI3AyAgAiACKQKgATcCLCAEIAJBIGpBwAAQ/AYaDAcLIAJB6AFqIAFBEGoQzhsgAS0ALCEGEPAiIQQgAkGEAmogASgCKCIBEI4MIAJBkAJqIAFBDGoQygsgASgCOCEFIAEoAjQhByABKAIwIQkgAkGgAWogAUEYahC2ICABLQBFIQogAS0ARCELIAFBPGoQog8hDAJAIAEoAkAiAUUEQAwBCxDlIiEDIAEpAgQhECABEPEZIQEgAyAQNwIEIAMgATYCAAsgAkEoaiACQYwCaigCADYCACACQTRqIAJBmAJqKAIANgIAIAJBQGsgAkGoAWopAgA3AwAgAkHIAGogAkGwAWopAgA3AwAgAiACKQKEAjcDICACIAIpApACNwIsIAIgAikCoAE3AzggBCACQSBqQTAQ/AYiASAKOgBFIAEgCzoARCABIAM2AkAgASAMNgI8IAEgBTYCOCABIAc2AjQgASAJNgIwDAYLIAFBDGoQ4wwhAwwFCyABQQxqEIwPIQMMBAsQ8SIhAyABKAIMIgEpAwAhECACQShqIAFBCGoQzhsgAS0ARCEEIAFBIGoQog8hBiACQdgAaiABQThqEIALIAEoAjAhBSABKAI0IQcgAkGgAWogAUEkahCVAyACQdQAaiAHNgIAIAIgBTYCrAEgAkHMAGogAkGoAWopAgA3AgAgAiAEOgBkIAIgEDcDICACIAY2AkAgAiACKQKgATcCRCADIAJBIGpByAAQ/AYaDAMLEOwiIQMgASgCDCIBKQMAIRAgAS0AKCEEIAJBKGogAUEIahDOGyABQSBqEKIPIQYgAUEkahDxGSEBIAIgBDoASCACIBA3AyAgAiABNgJEIAIgBjYCQCADIAJBIGpBMBD8BhoMAgsQ7CIhAyABKAIMIgEpAxghECABLwEsIQQgAkEgaiIFIAEQzhsgAkFAayABQSBqEKoGIAIgBDsBTCACIBA3AzggAyAFQTAQ/AYaDAELEOYiIQMgASgCDCIBLQBRIQQgAS0AUCEGIAEoAkwhBSABKAJIIQcgAgJ+IAEoAgBFBEAgAkGYAmogAUEIahDOG0IADAELIAEoAhQhCSABKAIQIQogASkDCBD0GiERIAIgASkDGCIQUAR+QgAFIBAQ9BoLNwOoAiACIAk2AqQCIAIgCjYCoAIgAiARNwOYAkIBCzcDkAICQCABLQBFQQNGBEAgAkEDOgDFAQwBCyACQaABaiABQSBqEIELCyACQThqIAJBqAJqKQMANwMAIAJBMGogAkGgAmopAwA3AwAgAkEoaiACQZgCaikDADcDACACIAIpA5ACNwMgIAJBQGsgAkGgAWpBKBD8BhogAyACQSBqQcgAEPwGIgEgBDoAUSABIAY6AFAgASAFNgJMIAEgBzYCSAsgACADNgIMIAAgCDYCCCAAIAIpA+gBNwMQIAAgBjoALCAAIAQ2AiggACACLwAgOwAtIABBETYCACAAQRhqIAJB8AFqKQMANwMAIABBIGogAkH4AWopAwA3AwAgAEEvaiACQSJqLQAAOgAADAELIAEpAwghECABQQRqEPAcIQEgACAQNwMIIAAgATYCBCAAQRI2AgALIAJBsAJqJAAPCwALjhsCDX8CfiMAQcACayIHJAAgAUEoaiEKIAJBAXFFBEAgChDVICEDCwJAAkACQCAKEOcNIghFBEAgASgC2AIhASAHQQA6AIgCIAEgASAHQYgCahD9FCEBIABBAzoAFCAAIAE2AgAMAQsCQAJAAkAgCCgCAEEkRgRAIAEgASkDQDcDeCABKAIoIAFBJTYCKEEkRg0BQd3r4ABBKEGE998AEO4XAAsgASgCKCEIIAFBJTYCKCABIAEpA0A3A3ggB0GUAmoiDCABQTRqKQIANwIAIAdBnAJqIg0gAUE8aigCADYCACAHIAEpAiw3AowCIAcgCDYCiAIgAUEsaiEJIAdBiAJqIg4QwwoCQCAKEOcNIghFDQAgCCgCAEEURw0AIAgtAARBDUcNACABKAIoIQggAUElNgIoIAEgASkDQDcDeCAMIAlBCGopAgA3AgAgDSAJQRBqKAIANgIAIAcgCSkCADcCjAIgByAINgKIAiAOEMMKQQEhCwsgAUGCA2ohCCAFDQEgB0GhAmogCEEVaikAADcAACAHQZwCaiAIQRBqKQEANwIAIAdBlAJqIAhBCGopAQA3AgAgB0EAOgCuASAHQQA6ALUBIAcgAS0AngM6ALgBIAcgASkBggM3AJwBIAcgASkBigM3AKQBIAcgAS8BkgM7AKwBIAcgASgAlQM2AK8BIAcgAS8AmQM7ALMBIAcgAS8BnAM7ALYBIAcgCCkBADcCjAIgAUGAAWogB0GcAWoQyAggByABNgKIAiAHQdAAaiABIAZBABCmBCAHKAJQIQYgBy0AZCIQQQNGDQIMBAsgASgCLCEBIABBAzoAFCAAIAE2AgAMAgsgB0GhAmogCEEVaikAADcAACAHQZwCaiAIQRBqKQEANwIAIAdBlAJqIAhBCGopAQA3AgAgB0EAOgCuASAHQQA6ALUBIAcgCzoApAEgByACOgCjASAHIAEtAIgDOgCiASAHIAEtAJMDOgCtASAHIAEtAJ4DOgC4ASAHIAEoAYIDNgCcASAHIAEvAYYDOwCgASAHIAEpAIsDNwClASAHIAEoAJUDNgCvASAHIAEvAJkDOwCzASAHIAEvAZwDOwC2ASAHIAgpAQA3AowCIAFBgAFqIAdBnAFqEMgIIAcgATYCiAIgB0HQAGogASAGQQAQpgQgBygCUCEGIActAGQiEEEDRwRADAMLIABBAzoAFCAAIAY2AgAgB0GIAmoQoCYMAQsgAEEDOgAUIAAgBjYCACAHQYgCahCgJgsgBBDsJgwBCyAHQeABaiAHQeAAaigCADYCACAHQYABaiAHQecAai0AADoAACAHIAcpA1g3A9gBIAcgBy8AZTsBfiAHKAJUIREgB0GIAmoQoCYgEEECRwRAIAdByABqIAdB4AFqKAIANgIAIAdBPmogB0GAAWotAAA6AAAgByAHKQPYATcDQCAHIAcvAX47ATwLIAdB6QBqIAFBlwNqIgwpAAA3AAAgB0HkAGogAUGSA2oiDSkBADcCACAHQdwAaiABQYoDaiISKQEAIhQ3AgBBACEIIAdBADoAmAIgB0EAOgCaAiAHQQA6AKECIAcgAS0AkwM6AJkCIAcgAS0AngM6AKQCIAcgASkBggMiFTcAiAIgByAUNwCQAiAHIAEoAJUDNgCbAiAHIAEvAJkDOwCfAiAHIAEvAZwDOwCiAiAHIBU3AlQgAUGAAWoiDiAHQYgCaiIPEMgIIAcgATYCUCAHIAI6AIUBIAcgCzoAhgEgByALOgB9IAcgAjoAfCAHIAM2AnggByABLQCIAzoAhAEgByABKAGCAzYAfiAHIAEvAYYDOwCCASAHIAEpAIsDNwCHASAHIAEpAJMDNwCPASAHIAEoAJsDNgCXASAHQbUBaiAMKQAANwAAIAdBsAFqIA0pAQA3AgAgB0GoAWogEikBADcCACAHIAEpAYIDNwKgASAOIAdB/gBqEMgIIAcgATYCnAEgB0HIAWogBEEIaigCADYCACAHIAQpAgA3A8ABIAcgB0H4AGo2AtQBIAcgB0H9AGo2AtABIAcgB0H8AGo2AswBAn8CQCABLQD4AkECRgRAIA8gARDYFQJAAkACQAJAIAcoAogCIgJBKGoiBBDnDSIDRQ0AIAMoAgBBFEcNACADLQAEQQRGDQELIAQQ5w0iA0UNAiADKAIAQSFHDQIgAkGUAWoiAxCNGCADEI0YIAdBKGogAkEAQQEQlAEgBygCLCEIIAcoAigNAQwCCyAHQTBqIAJBAEEBEJQBIAcoAjQhCCAHKAIwRQ0BCyAHQYgCahCgJiAIIQQMAgsgB0GIAmoQoCYLAkACQAJAAkACQCAKEOcNIgIEQCACKAIAQQlGDQELIAdBkAJqIAoQ6wsgB0EQaiAKELMUIAdBqOXfADYCjAIgB0E0OgCIAiAHKAIQIAcoAhQgB0GIAmoQ/RQhBCAKEOcNIgJFDQEgAigCAEEkRw0BIAEgASkDQDcDeCABKAIoIAFBJTYCKEEkRw0DIAEgASgCLBCGDAwBCyABKAIoIQIgAUElNgIoIAEgASkDQDcDeCAHQZQCaiIDIAlBCGopAgA3AgAgB0GcAmoiBCAJQRBqKAIANgIAIAcgCSkCADcCjAIgByACNgKIAiAHQYgCaiIMEMMKIAdBADoA6wEgB0EBOgDtASAHIActAHw6AN8BIAcgBy0AfToA4AEgByABLQCIAzoA3gEgByABLQCWAzoA7AEgByABLQCeAzoA9AEgByABKAGCAzYA2AEgByABLwGGAzsA3AEgByABKQCLAzcA4QEgByABLwCTAzsA6QEgByABKAKYAzYA7gEgByABLwGcAzsA8gEgB0GhAmogAUGCA2oiAkEVaikAADcAACAEIAJBEGopAQA3AgAgAyACQQhqKQEANwIAIAcgAikBADcCjAIgDiAHQdgBahDICCAHIAE2AogCIAdBsAJqIAEQtAEgBygCtAIhAiAHKAKwAiIDQYCAgIB4RwRAIAcgBygCuAIiCzYChAIgByACNgKAAiAHIAM2AvwBIAwQoCYCQAJAIAoQ5w0iAwRAIAMoAgBBCkYNAQsgB0GQAmogChDrCyAHQRhqIAoQsxQgB0GA5d8ANgKMAiAHQTQ6AIgCIAcoAhggBygCHCAHQYgCahD9FCEEIAoQ5w0iAkUNASACKAIAQSRHDQEgASABKQNANwN4IAEoAiggAUElNgIoQSRHDQQgASABKAIsEIYMDAELIAEoAighAyABQSU2AiggASABKQNANwN4IAdBlAJqIAlBCGopAgA3AgAgB0GcAmogCUEQaigCADYCACAHIAkpAgA3AowCIAcgAzYCiAIgB0GIAmoQwwpBACEEAkAgAS0A+AJBAkcNACAKEOcNIgNFDQAgAygCAEETRw0AIAdBIGogAUHY398AEPMBIAcoAiQhBCAHKAIgDQELIAcgBDYCrAIgB0GIAmogASAHKALMASIMLQAAIAcoAtABIg0tAAAgAiALEL0ZEKsDIAcoAowCIQMgBygCiAIiDkGBgICAeEcEQCAHQbgCaiISIAdBmAJqIhMpAgA3AwAgByAHKQKQAjcDsAIgAS0A+AJBAkcgDkGAgICAeEdyDQYgC0EGdCEJA0AgCUUNByACKAIAQQRGBEAgAigCECELIAIoAgwhDyAHQakBOgCIAiABIA8gCyAHQYgCahDQGQsgAkFAayECIAlBQGohCQwACwALIAdBrAJqEI8oIAMhBAsgB0H8AWoQ+iYMAQsgB0GIAmoQoCYgAiEECyAIENkoDAMLQd3r4ABBKEGw+N8AEO4XAAtB3evgAEEoQcD43wAQ7hcACyAHQZwCaiAHQcgBaigCADYCACAHQZACaiIPIAdBhAJqKAIANgIAIAcgBykDwAE3ApQCIAcgBykC/AE3A4gCIAEoAnwhCSAHKALUASgCACELIA0tAAAhDSAMLQAAIQxByABBBBChICICIAM2AhwgAiAONgIYIAIgDDoARSACIA06AEQgAiAENgJAIAIgCDYCPCACQQA2AjggAiALIAkgCSALSRs2AjQgAiALIAkgCSALSxs2AjAgAkEQaiATKQMANwIAIAJBCGogDykDADcCACACIAcpA4gCNwIAIAIgBykDsAI3AiAgAkEoaiASKQMANwIAQQEMAQsgB0HAAWoQ7CYgBCECQQALIQkgB0GcAWoQoCYCQAJAAkACQAJAIAkEQCAFRQ0EIAIoAhhBgICAgHhHDQQgB0GUAmogChDrCyAHQQhqIAoQsxQgB0EBNgKQAiAHQdq04AA2AowCIAdBMDoAiAIgBygCCCAHKAIMIAdBiAJqEP0UIQMgChDnDSIERQ0CIAQoAgBBJEcNAiABIAEpA0A3A3ggASgCKCABQSU2AihBJEcNASABIAEoAiwQhgwMAgsgAEEDOgAUIAAgAjYCAAwCC0Hd6+AAQShBlPffABDuFwALIABBAzoAFCAAIAM2AgAgAhDfHQsgBq0gEa1CIIaEIBAQtSMMAQsgACARNgIEIAAgBjYCACAAIAcpA0A3AwggACAQOgAUIAAgBy8BPDsAFSAAIAI2AhggAEEQaiAHQcgAaigCADYCACAAQRdqIAdBPmotAAA6AAALIAdB0ABqEKAmCyAHQcACaiQAC6AbAQ1/IwBBwAJrIgckACABQShqIQkgAkEBcUUEQCAJELogIQMLAkACQAJAIAkQzQ0iC0UEQCABKAKAAiEBIAdBADoAiAIgASABIAdBiAJqEP0UIQEgAEEDOgAUIAAgATYCAAwBCwJAAkACQCALKAIAQSRGBEAgASABKQPgAjcDmAMgASgCyAIgAUElNgLIAkEkRg0BQd3r4ABBKEGE998AEO4XAAsgASgCyAIhCyABQSU2AsgCIAEgASkD4AI3A5gDIAdBlAJqIgggAUHUAmopAgA3AgAgB0GcAmoiDSABQdwCaigCADYCACAHIAEpAswCNwKMAiAHIAs2AogCIAFBzAJqIQogB0GIAmoiDhDCCgJAIAkQzQ0iC0UNACALKAIAQRRHDQAgCy0ABEENRw0AIAEoAsgCIQsgAUElNgLIAiABIAEpA+ACNwOYAyAIIApBCGopAgA3AgAgDSAKQRBqKAIANgIAIAcgCikCADcCjAIgByALNgKIAiAOEMIKQQEhDAsgAUGqAmohCCAFDQEgB0GhAmogCEEVaikAADcAACAHQZwCaiAIQRBqKQEANwIAIAdBlAJqIAhBCGopAQA3AgAgB0EAOgCuASAHQQA6ALUBIAcgAS0AxgI6ALgBIAcgASkBqgI3AJwBIAcgASkBsgI3AKQBIAcgAS8BugI7AKwBIAcgASgAvQI2AK8BIAcgAS8AwQI7ALMBIAcgAS8BxAI7ALYBIAcgCCkBADcCjAIgCSAHQZwBahDQCCAHIAE2AogCIAdB0ABqIAEgBkEAEKQEIAcoAlAhBiAHLQBkIhBBA0YNAgwECyABKALMAiEBIABBAzoAFCAAIAE2AgAMAgsgB0GhAmogCEEVaikAADcAACAHQZwCaiAIQRBqKQEANwIAIAdBlAJqIAhBCGopAQA3AgAgB0EAOgCuASAHQQA6ALUBIAcgDDoApAEgByACOgCjASAHIAEtALACOgCiASAHIAEtALsCOgCtASAHIAEtAMYCOgC4ASAHIAEoAaoCNgCcASAHIAEvAa4COwCgASAHIAEpALMCNwClASAHIAEoAL0CNgCvASAHIAEvAMECOwCzASAHIAEvAcQCOwC2ASAHIAgpAQA3AowCIAkgB0GcAWoQ0AggByABNgKIAiAHQdAAaiABIAZBABCkBCAHKAJQIQYgBy0AZCIQQQNHBEAMAwsgAEEDOgAUIAAgBjYCACAHQYgCahCEJQwBCyAAQQM6ABQgACAGNgIAIAdBiAJqEIQlCyAEEOwmDAELIAdB4AFqIAdB4ABqKAIANgIAIAdBgAFqIAdB5wBqLQAAOgAAIAcgBykDWDcD2AEgByAHLwBlOwF+IAcoAlQhESAHQYgCahCEJSAQQQJHBEAgB0HIAGogB0HgAWooAgA2AgAgB0E+aiAHQYABai0AADoAACAHIAcpA9gBNwNAIAcgBy8BfjsBPAsgB0HpAGogCEEVaiINKQAANwAAIAdB5ABqIAhBEGoiDikBADcCACAHQdwAaiAIQQhqIhIpAQA3AgBBACELIAdBADoAmAIgB0EAOgCaAiAHQQA6AKECIAcgAS0AuwI6AJkCIAcgAS0AxgI6AKQCIAcgASkBqgI3AIgCIAcgASkBsgI3AJACIAcgASgAvQI2AJsCIAcgAS8AwQI7AJ8CIAcgAS8BxAI7AKICIAcgCCkBADcCVCAJIAdBiAJqIg8Q0AggByABNgJQIAcgAjoAhQEgByAMOgCGASAHIAw6AH0gByACOgB8IAcgAzYCeCAHIAEtALACOgCEASAHIAEoAaoCNgB+IAcgAS8BrgI7AIIBIAcgASkAswI3AIcBIAcgASkAuwI3AI8BIAcgASgAwwI2AJcBIAdBtQFqIA0pAAA3AAAgB0GwAWogDikBADcCACAHQagBaiASKQEANwIAIAcgCCkBADcCoAEgCSAHQf4AahDQCCAHIAE2ApwBIAdByAFqIARBCGooAgA2AgAgByAEKQIANwPAASAHIAdB+ABqNgLUASAHIAdB/QBqNgLQASAHIAdB/ABqNgLMAQJ/AkAgAS0AoAJBAkYEQCAPIAEQyxUCQAJAAkACQCAHKAKIAiICQShqIgQQzQ0iA0UNACADKAIAQRRHDQAgAy0ABEEERg0BCyAEEM0NIgNFDQIgAygCAEEhRw0CIAJBPGoiAxCNGCADEI0YIAdBKGogAkEAQQEQkwEgBygCLCELIAcoAigNAQwCCyAHQTBqIAJBAEEBEJMBIAcoAjQhCyAHKAIwRQ0BCyAHQYgCahCEJSALIQQMAgsgB0GIAmoQhCULAkACQAJAAkACQCAJEM0NIgIEQCACKAIAQQlGDQELIAdBkAJqIAkQkhAgB0EQaiAJEIAUIAdBqOXfADYCjAIgB0E0OgCIAiAHKAIQIAcoAhQgB0GIAmoQ/RQhBCAJEM0NIgJFDQEgAigCAEEkRw0BIAEgASkD4AI3A5gDIAEoAsgCIAFBJTYCyAJBJEcNAyABIAEoAswCEP8LDAELIAEoAsgCIQIgAUElNgLIAiABIAEpA+ACNwOYAyAHQZQCaiIDIApBCGopAgA3AgAgB0GcAmoiBCAKQRBqKAIANgIAIAcgCikCADcCjAIgByACNgKIAiAHQYgCaiIMEMIKIAdBADoA6wEgB0EBOgDtASAHIActAHw6AN8BIAcgBy0AfToA4AEgByABLQCwAjoA3gEgByABLQC+AjoA7AEgByABLQDGAjoA9AEgByABKAGqAjYA2AEgByABLwGuAjsA3AEgByABKQCzAjcA4QEgByABLwC7AjsA6QEgByABKALAAjYA7gEgByABLwHEAjsA8gEgB0GhAmogCEEVaikAADcAACAEIAhBEGopAQA3AgAgAyAIQQhqKQEANwIAIAcgCCkBADcCjAIgCSAHQdgBahDQCCAHIAE2AogCIAdBsAJqIAEQswEgBygCtAIhAyAHKAKwAiIEQYCAgIB4RwRAIAcgBygCuAIiAjYChAIgByADNgKAAiAHIAQ2AvwBIAwQhCUCQAJAIAkQzQ0iBARAIAQoAgBBCkYNAQsgB0GQAmogCRCSECAHQRhqIAkQgBQgB0GA5d8ANgKMAiAHQTQ6AIgCIAcoAhggBygCHCAHQYgCahD9FCEEIAkQzQ0iAkUNASACKAIAQSRHDQEgASABKQPgAjcDmAMgASgCyAIgAUElNgLIAkEkRw0EIAEgASgCzAIQ/wsMAQsgASgCyAIhBCABQSU2AsgCIAEgASkD4AI3A5gDIAdBlAJqIApBCGopAgA3AgAgB0GcAmogCkEQaigCADYCACAHIAopAgA3AowCIAcgBDYCiAIgB0GIAmoQwgpBACEEAkAgAS0AoAJBAkcNACAJEM0NIghFDQAgCCgCAEETRw0AIAdBIGogAUHY398AEPEBIAcoAiQhBCAHKAIgDQELIAcgBDYCrAIgB0GIAmogASAHKALMASINLQAAIAcoAtABIg4tAAAgAyACEL0ZELADIAcoAowCIQggBygCiAIiDEGBgICAeEcEQCAHQbgCaiISIAdBmAJqIhMpAgA3AwAgByAHKQKQAjcDsAIgDEGAgICAeEcNBiABLQCgAkECRw0GIAJBBnQhAgNAIAJFDQcgAygCAEEERgRAIAMoAhAhCiADKAIMIQ8gB0GpAToAiAIgASAPIAogB0GIAmoQvhkLIANBQGshAyACQUBqIQIMAAsACyAHQawCahD5JiAIIQQLIAdB/AFqEPomDAELIAdBiAJqEIQlIAMhBAsgCxDZKAwDC0Hd6+AAQShBsPjfABDuFwALQd3r4ABBKEHA+N8AEO4XAAsgB0GcAmogB0HIAWooAgA2AgAgB0GQAmoiDyAHQYQCaigCADYCACAHIAcpA8ABNwKUAiAHIAcpAvwBNwOIAiABKAKcAyECIAcoAtQBKAIAIQogDi0AACEOIA0tAAAhDUHIAEEEEKEgIgMgCDYCHCADIAw2AhggAyANOgBFIAMgDjoARCADIAQ2AkAgAyALNgI8IANBADYCOCADIAogAiACIApJGzYCNCADIAogAiACIApLGzYCMCADQRBqIBMpAwA3AgAgA0EIaiAPKQMANwIAIAMgBykDiAI3AgAgAyAHKQOwAjcCICADQShqIBIpAwA3AgBBAQwBCyAHQcABahDsJiAEIQNBAAshAiAHQZwBahCEJQJAAkACQAJAAkAgAgRAIAVFDQQgAygCGEGAgICAeEcNBCAHQZQCaiAJEJIQIAdBCGogCRCAFCAHQQE2ApACIAdB2rTgADYCjAIgB0EwOgCIAiAHKAIIIAcoAgwgB0GIAmoQ/RQhAiAJEM0NIgRFDQIgBCgCAEEkRw0CIAEgASkD4AI3A5gDIAEoAsgCIAFBJTYCyAJBJEcNASABIAEoAswCEP8LDAILIABBAzoAFCAAIAM2AgAMAgtB3evgAEEoQZT33wAQ7hcACyAAQQM6ABQgACACNgIAIAMQ0R0LIAatIBGtQiCGhCAQELUjDAELIAAgETYCBCAAIAY2AgAgACAHKQNANwMIIAAgEDoAFCAAIAcvATw7ABUgACADNgIYIABBEGogB0HIAGooAgA2AgAgAEEXaiAHQT5qLQAAOgAACyAHQdAAahCEJQsgB0HAAmokAAuIGQIXfwJ+IwBBoAJrIgYkACABKAKUDSIXKAK8AigCEEEBdCEHIAMoAgQhFAJAAkACQAJAAkACQAJAAn8CQCADKAIAIhVBAWtBAk8EQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAUgB00EQCACQdgBaiESIAJBGGohFiABQaANaiEQIAEoAqwSIRcgASgCqBIhGCABKQMAIR0gAS0AnA0hFCABKQOgDSEeIAMtABghFSADKAIMIQwgAygCCCENIAMoAhQhCiABLQC8EkEBcSEZIAMoAhAiDiEJA0AgBkH0AWoiEyAYIBcgDSAMIAkgChCpGSAGKAL0AUUNEwJAIAYoAvgBIgcgC0kNACAGKAL8ASAGIBU6AIwCIAYgCjYCiAIgBiAONgKEAiAGIAw2AoACIAYgDTYC/AEgBkEBNgL0ASAGQbgBaiIRIBMgDiAHEPwJIBkNAyAeQgJRDRogAigCyAFBAkYNBCAGQdgBaiAQIBYgESAIEKsCIAYoAtwBIQggBigC2AEiE0ECRgRAIAhBAXFFDQEMEwsCQCATQQFHBEAgCSAKTw0WIAdBf0cNAUGYicMAENopAAsgBigC4AEhCSAGIBU6AIwCIAYgCjYCiAIgBiAONgKEAiAGIAw2AoACIAYgDTYC/AEgBiAINgL4ASAGQQI2AvQBIAZB2AFqIgsgBkH0AWoiEyAJIAoQ/AkgFEEBcQ0GAkAgHUICUgRAIAIoAsgEQQJGDQkgBkGQAmogASASIAsQ7QIgBigCkAIiC0ECRg0VIAsNASATIAggCSAGKAKYAhDtEiAGKAL8ASECIAYoAvgBIQcgBigC9AEhCkEBDBgLDBsLIAdBf0YNCCAGKAKUAiELCyAHQQFqIQkhCAwBCwsgFEEBcQ0ZIB1CAlENBiACKALIBEECRg0aIAZB9AFqIgggASASIAMQtgUgBkHYAWogCBD5FyAGKALYAUECRwRAIAZB2ABqIAZB4AFqKQIANwMAIAYgBikC2AE3A1AMFQsgBkHQAGogASACIAMQqwQMFAsgAkHYAWohCyACQRhqIRggAUGgDWohGSABKAKsEiETIAEoAqgSIRogASkDACEdIAEtAJwNIRYgASkDoA0hHiADLQAYIRIgAygCDCEMIAMoAgghDSADKAIUIQogAS0AvBJBAXEhGyADKAIQIg4hCQNAIAZB9AFqIhEgGiATIA0gDCAJIAoQqRkgBigC9AFFDRUCQCAGKAL4ASIHIBBJDQAgBigC/AEgBiASOgCMAiAGIAo2AogCIAYgDjYChAIgBiAMNgKAAiAGIA02AvwBIAZBATYC9AEgBkG4AWoiHCARIA4gBxD8CSAbDQggHkICUQ0ZIAIoAsgBQQJGDQkgBkHYAWogGSAYIBwgCBCrAiAGKALcASEIIAYoAtgBIhFBAkYEQCAIQQFxRQ0BDBELAkAgEUEBRwRAIAkgCk8NGCAHQX9HDQFBmInDABDaKQALIAYoAuABIQkgBiASOgCMAiAGIAo2AogCIAYgDjYChAIgBiAMNgKAAiAGIA02AvwBIAYgCDYC+AEgBkECNgL0ASAGQdgBaiIQIAZB9AFqIhEgCSAKEPwJIBZBAXENCwJAIB1CAlIEQCACKALIBEECRg0OIAZB0ABqIAEgCyAQEO0CIAYoAlAiEEECRg0TIBANASARIAggCSAGKAJYEO0SIAYoAvwBIQMgBigC+AEhCCAGKAL0ASEPIAYgCjYCiAIgBiAONgKEAiAGIAw2AoACIAYgDTYC/AEgBiASOgCMAiAGIBQ2AvgBIAYgFTYC9AEgBkHkAGoiByARIA8gCBD8CSAGIAM2AmggBkECNgJkIAZByABqIAEgAiAHIAQgBRCaBiAGKAJMIQkgBigCSCEHDBoLDBoLIAdBf0YNDSAGKAJUIRALIAdBAWohCSEIDAELCyAFIBcoArwCKAIQQQF0TQRAIBZBAXENGSAdQgJRDQwgAigCyARBAkYNGiAGQfQBaiIIIAEgCyADELYFIAZB2AFqIAgQ+RcgBigC2AFBAkcEQCAGQcABaiAGQeABaikCADcDACAGIAYpAtgBNwO4AQwPCyAGQbgBaiABIAIgAxCrBAwOCwJAAkACQAJAIAEoAtQKQQNHBEAgASgC+AoiCCgCqAIgCCgCrAJGDQELIBZBAXENHCAdQgJRDQEgAigCyARBAkYNHSAGQfQBaiIIIAEgCyADELYFIAZB2AFqIAgQ+RcgBigC2AEiB0EBaw4DAwIBGQsgBkE4aiABIAIgAyAEIAUQmgYgBigCPCEJIAYoAjghBwwYCyAGQSBqIAEgAiADIAQgBRCaBiAGKAIkIQkgBigCICEHDBcLIAZBKGogASACIAMgBCAFEJoGIAYoAiwhCSAGKAIoIQcMFgsgBigC3AEhAyAGKALgASEIIAYoAuQBIQ8gBiAKNgKIAiAGIA42AoQCIAYgDDYCgAIgBiANNgL8ASAGIBI6AIwCIAYgFDYC+AEgBiAVNgL0ASAGQZwBaiIHIAZB9AFqIAMgCBD8CSAGIA82AqABIAZBAjYCnAEgBkEwaiABIAIgByAEIAUQmgZBASEHIAYoAjBBAXFFDQwgBigCNCEJDBULQd3r4ABBKEGIjcMAEO4XAAtB+IzDABDaKQALQd3r4ABBKEG4jMMAEO4XAAtB2IvDABDaKQALQaiJwwAQ2ikACyAGQdAAaiABIAIgAxCrBAwNC0Hd6+AAQShBiI3DABDuFwALQfiMwwAQ2ikAC0Hd6+AAQShBuIzDABDuFwALQdiLwwAQ2ikAC0GoicMAENopAAsgBkG4AWogASACIAMQqwQMAQtBkIbDAEETQaSGwwAQtRIACyAGKAK4AUUNBkEBIQcgBigCxAEiCUEBdCIBQQFyIQIgBikCvAEhHSABIAVJBEAgBCABQQJ0aiAdp0EBajYCAAsgAiAFTw0HIAQgAkECdGogHUIgiKdBAWo2AgAMBwsgBkFAayABIAIgAyAEIAUQmgYgBigCRCEJIAYoAkAhBwwGCyAGQdAAaiABIAIgAxCrBAwDCwJAAkACQCAFIAdNBEAgAS0AnA1BAUYNCyABKQMAQgJRDQEgAigCyARBAkYNDCAGQfQBaiIIIAEgAkHYAWogAxC2BSAGQdgBaiAIEPkXIAYoAtgBQQJHBEAgBkHAAWogBkHgAWopAgA3AwAgBiAGKQLYATcDuAEMBAsgBkG4AWogASACIAMQqwQMAwsCQCABKALUCkEDRgRAIAEtAJwNRQ0BDAwLIAZBGGogASACIAMgBCAFEJoGIAYoAhwhCSAGKAIYIQcMCAsCQAJAAkAgASkDAEICUQ0AIAIoAsgEQQJGDQ4gBkH0AWoiCCABIAJB2AFqIAMQtgUgBkHYAWogCBD5FyAGKALYASIHQQFrDgMCAQAKCyAGIAEgAiADIAQgBRCaBiAGKAIEIQkgBigCACEHDAkLIAZBCGogASACIAMgBCAFEJoGIAYoAgwhCSAGKAIIIQcMCAsgBigC3AEhCCAGKALgASEPIAYoAuQBIQcgBiAUNgL4ASAGIBU2AvQBIAYgAykCEDcChAIgBiADKQIINwL8ASAGIAMtABg6AIwCIAZBgAFqIgMgBkH0AWogCCAPEPwJIAYgBzYChAEgBkECNgKAASAGQRBqIAEgAiADIAQgBRCaBkEBIQcgBigCEEEBcUUNASAGKAIUIQkMBwsgBkG4AWogASACIAMQqwQMAQtBkIbDAEETQaSGwwAQtRIACyAGKAK4AUUNA0EBIQcgBigCxAEiCUEBdCIBQQFyIQIgBikCvAEhHSABIAVJBEAgBCABQQJ0aiAdp0EBajYCAAsgAiAFTw0EIAQgAkECdGogHUIgiKdBAWo2AgAMBAtBAAshASAGIAI2AlwgBiAHNgJYIAYgCjYCVCAGIAE2AlALIAYoAlBFDQBBASEHIAYoAlwiCUEBdCIBQQFyIQIgBikCVCEdIAEgBUkEQCAEIAFBAnRqIB2nQQFqNgIACyACIAVPDQEgBCACQQJ0aiAdQiCIp0EBajYCAAwBC0EAIQcLIAAgCTYCBCAAIAc2AgAgBkGgAmokAA8LIAZBATYC+AEgBkGAisMANgL0ASAGQgA3AoACIAYgBkGcAmo2AvwBIAZB9AFqQYiKwwAQuh0ACyAGQQE2AvgBIAZBgIrDADYC9AEgBkIANwKAAiAGIAZBnAJqNgL8ASAGQfQBakGYisMAELodAAtB3evgAEEoQZiMwwAQ7hcAC0G4i8MAENopAAveGgEMfyMAQbAIayICJAAgAkHIAGogAUEoaiIHELMUAkACQAJAAkACQAJAIAEtAPgCQQJHDQAgAigCTCENIAIoAkghCAJAAkAgBxDnDSIDRQ0AIAMoAgBBFEcNACADLQAEQQRGDQELIAcQ5w0iA0UNASADKAIAQSFHDQELAkAgBxDbEiIDBEAgAygCAEECRg0BCyAHENsSIgNFDQEgAygCAEEfRw0BC0EAIQMgAkEAOgBjIAIgASkBggM3AFMgAiABKQCTAzcAZCACIAEoAJsDNgBsIAIgAUGKA2oiBCkBADcAWyACQY0BaiABQZcDaikAADcAACACQYgBaiABQZIDaikBADcCACACQYABaiAEKQEANwIAIAIgASkBggM3AnggAUGAAWoiCSACQdMAahDICCACIAE2AnQCQCABLQD4AkECRw0AIAEtAIIDIQYgAkGYAWogARDRAiACQQE6AMAEIAIgASkAgwM3AMEEIAIgASkAiwM3AMkEIAIgASkAkwM3ANEEIAIgASgAmwM2ANkEIAJBmAJqIAJBwARqEMgIAkAgAkHAAWoiCxDnDSIDRQ0AIAMoAgBBIUcNACACQawCahDOF0H/AXFBCkcNACACKAKwAyIDIQQgAkGwA2oiCiEFIANBgQFPBEAgAigCsAIhBCACQbACaiEFCyAEBEAgBSAEQQFrNgIAIAIoArADIQMLIANBgQFPBEAgAkGwAmohCiACKAKwAiEDCyADRQ0AIAogA0EBazYCAAtBACEDIAJBQGsgAkGYAWpBAEEBEJQBIAIoAkQhBQJAIAIoAkAEQCAFIQQMAQsgAkE4aiACQZgBaiIKEHMgAigCPCEEIAIoAjhFBEAgAiAENgKQCAJAAkAgBCgCAEEeRwRAIAJB9ARqIAsQ6wsgAkEBNgLwBCACQde04AA2AuwEIAJBMDoA6AQgAkGQAmogAkHYAWogAigCwAFBJUYiBBsoAgAiBiACQZQCaiACQdwBaiAEGygCACIEIAQgBksbIAYgBCAEIAZJGyACQegEahD9FCEEIAsQ5w0iBkUNAiAGKAIAQSRHDQIgAiACKQPYATcDkAIgAigCwAEgAkElNgLAAUEkRw0BIAogAigCxAEQhgwMAgsgBCAFKAIMIgogBCgCGCIDIAMgCkkbNgIYIAQgCiADIAMgCksbNgIUIAQoAiAQ2SggBCAFNgIgIAJB6ARqIgMgAkGYAWpBqAMQ/AYaIAEQhhAgASADQagDEPwGIQMgAiAGOgCQCCACIAMpAIMDNwCRCCACIAMpAIsDNwCZCCACIAMpAJMDNwChCCACIAMoAJsDNgCpCCAJIAJBkAhqEMgIIAQhAwwEC0Hd6+AAQShBtJDgABDuFwALIAJBkAhqELQpCyAFEIwrCyACIAQ2AuQEIAJBATYC4AQgAkHgBGoQ1iAgAkGYAWoQhhALIAIgAzYCcCACQfQAahCgJiADBEAgAS0A+AJBAkcNAiABLQD9AkEBcUUNAiACQboBOgDoBCABIAggDSACQegEahDQGQwCCyACQfAAahCOKAsgAS0AigNBAXFFDQEgBxDnDSIDRQ0BIAMoAgBBAkcNASADLQAIQQJHDQEgAy0ACUEdRw0BIAcQ1SAhCCAHEOcNIgNFBEAgASgC2AIhASACQQA6AOgEIAEgASACQegEahD9FCEDDAQLIAMoAgBBJEYEQCABIAEpA0A3A3ggASgCKCABQSU2AihBJEYNA0Hd6+AAQShB+IvgABDuFwALIAEoAighAyABQSU2AiggASABKQNANwN4IAJB9ARqIAFBNGopAgA3AgAgAkH8BGogAUE8aigCADYCACACIAEpAiw3AuwEIAIgAzYC6AQgAkHoBGoQwwoCQAJAAkACQAJAIAEtAJcDQQFxBEAgAS0AlQNBAXFFDQELIAcQ5w0iA0UNAiADKAIAQT5xQQ5GDQIgBxCyIQ0CAkAgBxDnDSIDRQ0AIAMoAgBBFEcNACADLQAEQQ1GDQULAkAgBxDnDSIDRQ0AIAMoAgBBFEcNACADLQAEQQ5GDQULIAcQ5w0iA0UNASADKAIAQRVHDQEgAy0ABEEERw0BDAQLIAEoAnwhBSABKAJ4IAJB0AA6AOgEIAUgAkHoBGoQ/RQhA0EBIQkgBxDnDSIFRQ0IIAUoAgBBJEcNCCABIAEpA0A3A3ggASgCKCABQSU2AihBJEcNAiABIAEoAiwQhgwMCAsgBxDnDSIDRQRAIAEoAtgCIQMgAkEAOgDoBCACIAMgAyACQegEahD9FDYCnAEgAkEBOgCYASACQZgBahCKJAwDCyADEIcGEJ8MDQILQQAhCSACQQA6APQEIAJBADYC8AQgAiAIIAEoAnwiASABIAhJGzYC7AQgAiAIIAEgASAISxs2AugEIAJB6ARqEKsYIQMMBgtB3evgAEEoQYiM4AAQ7hcAC0EAIQUCQCAHEOcNIgNFDQAgAygCAEEURw0AIAMtAARBDUcNACABKAIoIQMgAUElNgIoIAEgASkDQDcDeCACQfQEaiABQSxqIgVBCGopAgA3AgAgAkH8BGogBUEQaigCADYCACACIAUpAgA3AuwEIAIgAzYC6AQgAkHoBGoQwwpBASEFCyABKAJ8IQYgAkEwaiABEK0GQQEhCSACKAI0IQQgAigCMEEBcUUEQCACIAU6APQEIAIgBDYC8AQgAiAIIAEoAnwiASABIAhJGzYC7AQgAiAIIAEgASAISxs2AugEIAJB6ARqEKsYIQMMAQsgBCgCBCEFIAQoAgBBBEEEEKEgIgEgBDYCACACIAE2AvQEIAJBIzYC/AQgAkGYjOAANgL4BCACIAggBiAGIAhJGzYC8AQgAiAIIAYgBiAISxs2AuwEIAJBuAE6AOgEIAUgAkHoBGoQ/RQhAwwEC0EAIQkMAwsgBxDnDSIGRQRAIAEoAtgCIQEgAkEAOgDoBCABIAEgAkHoBGoQ/RQhAwwCC0EAIQUCQAJAIAYoAgAiA0ECRwRAIANBCUYNASADQSRHDQIgASABKQNANwN4IAEoAiggAUElNgIoQSRGDQNB3evgAEEoQaSQ4AAQ7hcACwJAQQQgBi0ACEECa0H/AXEiAyADQQRPGw4FAAICAgECCyAGLQAJQR1HDQELQQEhBSAHENUgIQQLIAEgBDYCBCABIAU2AgAgBxDVICENIAcQ1SAhCyACQShqIAEQhAYgAigCLCEFIAIoAigEQCAFIQMMAgsgAiAFNgLABAJAAkACQAJAAkACQCAFKAIAQR5GDQAgBxDnDSIDRQ0AIAMoAgBBF0cNACABKAIoIQYgAUElNgIoIAEgASkDQDcDeCACQfQEaiIEIAFBNGopAgA3AgAgAkH8BGoiAyABQTxqKAIANgIAIAIgASkCLDcC7AQgAiAGNgLoBCACQegEaiIGEMMKIAJBAToAeiACQYECOwCDASACIAEoAYIDNgB0IAIgAS8BhgM7AHggAiABKQCJAzcAeyACIAEpAJMDNwCFASACIAEoAJsDNgCNASACQYEFaiABQYIDaiIMQRVqKQAANwAAIAMgDEEQaikBADcCACAEIAxBCGopAQA3AgAgAiAMKQEANwLsBCABQYABaiIIIAJB9ABqEMgIIAIgATYC6AQgAkEgaiABEK0GIAIoAiQhAyACKAIgDQEgAiADNgKQCCAGEKAmAkAgBxDnDSIEBEAgBCgCAEETRg0BCyACQfAEaiAHEOsLIAJBCGogBxCzFCACQdjf3wA2AuwEIAJBNDoA6AQgAigCCCACKAIMIAJB6ARqEP0UIQMgBxDnDSIFRQ0FIAUoAgBBJEcNBSABIAEpA0A3A3ggASgCKCABQSU2AihBJEcNBCABIAEoAiwQhgwMBQsgASgCKCEJIAFBJTYCKCABIAEpA0A3A3ggAkH0BGoiBiABQSxqIgpBCGopAgA3AgAgAkH8BGoiBCAKQRBqKAIANgIAIAIgCikCADcC7AQgAiAJNgLoBCACQegEaiIHEMMKIAJBATsApwEgAiABLQCQAzoApgEgAiABKQGCAzcAmAEgAiABKAGKAzYAoAEgAiABLwGOAzsApAEgAiABKQCTAzcAqQEgAiABKACbAzYAsQEgAkGBBWogDEEVaikAADcAACAEIAxBEGopAQA3AgAgBiAMQQhqKQEANwIAIAIgDCkBADcC7AQgCCACQZgBahDICCACIAE2AugEIAJBGGogARCtBiACKAIcIQQgAigCGCAHEKAmBEAgBCEDDAULIAJBEGogBBCPAyACKAIUIQYgAiAENgLwBCACIAM2AuwEIAIgBTYC6AQgAiALIAYgBiALSRs2AvgEIAIgCyAGIAYgC0sbNgL0BCACQegEahCBFSEFCyAFKAIAIgNBHktBASADdEGAgJyCBHFFcg0BQQAhCSAFIQMMBwsgAkHoBGoQoCYMAwsgAiABIA0gBRDqAiACKAIEIQMgAigCACEJDAULQd3r4ABBKEHAiOAAEO4XAAsgAkGQCGoQtCkLIAJBwARqELQpDAELIAEoAiwhAwtBASEJCyAAIAM2AgQgACAJNgIAIAJBsAhqJAAL9RkCBn8CfiMAQaACayIEJAAgBCACNgIkAkAgAS0A+AJBAkcEQCAAQQg2AgAgAxDsJgwBCyABQYIDaiEFAkAgAS0AkANBAXFFDQAgAS0A+wJBAXENACABKAJ8IQYgBEH8ADoA8AEgASACIAYgAiAGSRsgAiAGIAIgBksbIARB8AFqENAZIAQoAiQhAgsgBCACNgIoIARBAToAPSAEIAEpAYIDNwAvIAQgASgBigM2ADcgBCABLwGOAzsAOyAEIAEpAJEDNwA+IAQgASgAmQM2AEYgBCABLwCdAzsASiAEQeUAaiAFQRVqKQAANwAAIARB4ABqIAVBEGopAQA3AgAgBEHYAGogBUEIaikBADcCACAEIAUpAQA3AlAgAUGAAWogBEEvahDICCAEIAE2AkwgBEH4AGogA0EIaigCADYCACAEIAMpAgA3A3AgBCAEQSRqNgKAASAEIARBKGo2AnwCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAFBKGoiAhDnDSIFRQ0AIAUoAgBBAkcNACAFLQAIQQJHDQAgBS0ACUELRg0BCwJAIAIQ5w0iBUUNACAFKAIAQQJHDQAgBS0ACEECRw0AIAUtAAlBGUYNAgsCQCACEOcNIgVFDQAgBSgCAEECRw0AIAUtAAhBAkcNACAFLQAJQRNHDQAgAhDbEiIFRQ0AIAUoAgBBAkcNACAFLQAIDQAgBS0ACUENRg0DCwJAIAIQ5w0iBUUNACAFKAIAQQJHDQAgBS0ACEECRw0AIAUtAAlBE0YNBAsCQCACEOcNIgVFDQAgBSgCAEECRw0AIAUtAAhBAkcNACAFLQAJQRFGDQQLAkAgAhDnDSIFRQ0AIAUoAgBBAkcNACAFLQAIQQJHDQAgBS0ACUESRg0ECwJAIAIQ5w0iBUUNACAFKAIAQQJHDQAgBS0ACA0AIAUtAAlBBkYNBQsgAhDnDSIFBEAgBSgCAEECRg0GCyAAQQg2AgAgBEHwAGoQ7CYMDwsgBEH4AWoiBSADQQhqKAIANgIAIAQgAykCADcD8AEgBEGIAWogASAEQfABaiIGELwpIAQoAogBIgdBCEcEQEEBIQIgBEGQAWohAyAEKAKoASEBAkAgB0EBRgRAIAUgAUEIaigCADYCACAEQYQCaiABQRRqKAIANgIAIARBkAJqIAFBIGopAgA3AwAgBEGYAmogAUEoaikCADcDACAEIAEpAgA3A/ABIAQgASkCDDcC/AEgBCABKQIYNwOIAiABKQI0IQogASkCPCELIAEvAUQhCCAEKAIoIQlByABBBBChICIFIAZBMBD8BiIGIAg7AUQgBiALNwI8IAYgCjcCNCAGIAk2AjAgBEHgAWogA0EIaikDADcDACAEQegBaiADQRBqKQMANwMAIAQgAykDADcD2AEgARCLKwwBCyAELQCsASECIARB4AFqIANBCGopAwA3AwAgBEHoAWogA0EQaikDADcDACAEQdYBaiAEQa8Bai0AADoAACAEIAQvAK0BOwHUASAEIAMpAwA3A9gBIAQoAowBIQMgASEFCyAAIAM2AgQgACAHNgIAIAAgBCkD2AE3AwggACACOgAkIAAgBTYCICAAIAQvAdQBOwAlIABBEGogBEHgAWopAwA3AwAgAEEYaiAEQegBaikDADcDACAAQSdqIARB1gFqLQAAOgAADA8LIAQoAowBIQEgAEEJNgIAIAAgATYCBAwOCyAEQfABaiABIAQoAiQiASABIANBABCIBCAEKALwASIGQQhHBEAgBEH4AWohAyAEKAKQAiEBAkAgBkUEQCAEQZABaiABQQhqKAIANgIAIARBnAFqIAFBFGooAgA2AgAgBEGoAWogAUEgaigCADYCACAEIAEpAgA3A4gBIAQgASkCDDcClAEgBCABKQIYNwOgASABKQIoIQogASkCMCELIAEoAjghByABLQA8IQggBCgCKCEJQcAAQQQQoSAiAiAEQYgBakEkEPwGIgUgCDoAPCAFIAc2AjggBSALNwIwIAUgCjcCKCAFIAk2AiQgBEHAAWogA0EIaikDADcDACAEQcgBaiADQRBqKQMANwMAIAQgAykDADcDuAEgARCSK0EBIQUMAQsgBC0AlAIhBSAEQcABaiADQQhqKQMANwMAIARByAFqIANBEGopAwA3AwAgBEG2AWogBEGXAmotAAA6AAAgBCAELwCVAjsBtAEgBCADKQMANwO4ASAEKAL0ASEDIAEhAgsgACADNgIEIAAgBjYCACAAIAQpA7gBNwMIIAAgBToAJCAAIAI2AiAgACAELwG0ATsAJSAAQRBqIARBwAFqKQMANwMAIABBGGogBEHIAWopAwA3AwAgAEEnaiAEQbYBai0AADoAAAwOCyAEKAL0ASEBIABBCTYCACAAIAE2AgQMDQsgAhDnDSIDRQRAIAEoAtgCIQEgBEEAOgDwASABIAEgBEHwAWoQ/RQhASAAQQk2AgAgACABNgIEDAwLIAMoAgBBJEYEQCABIAEpA0A3A3ggASgCKCABQSU2AihBJEcNBSABKAIsIQEgAEEJ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yAggAiABNgLgASACQcACaiABEL0qIAIoAsQCIQggAigCwAIiBUETRwRAIAJBmAFqIAJByAJqQSgQ/AYaIAJB4AFqEKAmDAwLIABBADYCACAAIAg2AgQgAkHgAWoQoCYMCgsgAiAROgD8ASACIBI6APsBIAJBAToA+gEgAiATOgD5ASACIBQ6APgBIAIgFToA9wEgAiAWOgD2ASACIBc6APUBIAIgGDoA9AEgAiAZOgDzASACIBo6APIBIAIgGzoA8QEgAiAcOgDwASACIB06AO8BIAIgHjoA7gEgAiAfOgDtASACICA6AOwBIAIgIToA6wEgAiAiOgDqASACICM6AOkBIAIgJDoA6AEgAiAlOgDnASACICY6AOYBIAIgJzoA5QEgAiAoOgDkASACICk6AOMBIAIgKjoA4gEgAiArOgDhASACICw6AOABIAlBFWogA0EVaikAADcAACAJQRBqIANBEGopAQA3AQAgCUEIaiADQQhqKQEANwEAIAkgAykBADcBACALIAJB4AFqEMgIIAIgATYCwAIgAkGEAmogARCBASACKAKIAiEHIAIoAoQCIghFDQYgAkGgAmoiDSAQQQhqKAIANgIAIAIgECkCADcDmAIgAkHAAmoQoCYgAigChAEEQEEwQQgQoSAiBSAHNgIIIAUgCDYCBCAFQQg2AgAgBSACKQOYAjcCDCAFQRRqIA0oAgA2AgAgASgCfCACQYQBaiAFEN0SBSACQYQBahCSKCAPIAIpA5gCNwIAIA9BCGogDSgCADYCACACIAc2AogBIAIgCDYChAELDAALAAsgAEEANgIAIAAgCjYCBAwLCyABIAEpA0A3A3ggASgCKCABQSU2AihBJEcNBCABIAEoAiwQhgwMCQsgASABKQNANwN4IAEoAiggAUElNgIoQSRHDQQgASABKAIsEIYMDAoLQd3r4ABBKEGAnuAAEO4XAAsgAygCBCEBIAMoAgBBBEEEEKEgIgYgAzYCACACIAY2AuwBIAJBMDYC9AEgAkGwnuAANgLwASACIAU2AugBIAIgCTYC5AEgAkG4AToA4AEgASACQeABahD9FCEBIABBADYCACAAIAE2AgQgAkHQAGoQoCYgAkHAAmoQoCYMCQsgAEEANgIAIAAgBzYCBCACQcACahCgJgwCC0Hd6+AAQShBkJ7gABDuFwALQd3r4ABBKEGg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B0YNBCATIBRBMBD8BhogAyAENgJ0IAMgDjYCcCADQSBqIANB8ABqEPYZIAoQoCYgCRDnDSIERQ0DIAQoAgBBEEcNAyANIAUpAgA3AgAgASgCKCEEIAFBJTYCKCABIAEpA0A3A3ggDUEIaiAFQQhqKQIANwIAIA1BEGogBUEQaigCADYCACADIAQ2AqgBIA8QwwoMAQsLIAEoAtgCIQQgA0EAOgCoASADIAQgBCADQagBahD9FDYCMCADQQE2AiwgA0EsahCOJAsgASgCeCEEIAEoAnwhCCADQfYAOgCoASABIAggBCAIIAxGGyAEIAQgEEYbIAggA0GoAWoQ0BkLIAINAiAJEOcNIgINAQwCCyADQSxqEKAmIANBIGoQ8iZBASEFDAILAkACQCACKAIAQQ5rDgICAAELIAEoAighAiABQSU2AiggASABKQNANwN4IANBtAFqIAVBCGopAgA3AgAgA0G8AWogBUEQaigCADYCACADIAUpAgA3AqwBIAMgAjYCqAEgA0GoAWoQwwoMAQsgCRCyIQ0AIANBCGogCRCzFCADKAIMIQIgAygCCCEEIANB9QA6AKgBIAEgBCACIANBqAFqENAZIAMgARCTBiADIAMoAgQ2AqwBIAMgAygCACIENgKoASADQawBaiECAkAgBEUEQCACELQpDAELIAIQlCMLIANBqAFqQQRyIQIDQCAJEOcNIgRFDQECQAJAIAQoAgBBDmsOAgMAAQsgASgCKCECIAFBJTYCKCABIAEpA0A3A3ggA0G0AWogBUEIaikCADcCACADQbwBaiAFQRBqKAIANgIAIAMgBSkCADcCrAEgAyACNgKoASADQagBahDDCgwCCyAJELIhDQEgAiAFKQIANwIAIAEoAighBCABQSU2AiggASABKQNANwN4IAJBCGogBUEIaikCADcCACACQRBqIAVBEGooAgA2AgAgAyAENgKoASADQagBahDDCiAJEOcNIgRFDQAgBCgCAEEkRw0ACwsgASgCfCEBIANBugFqQgA3AQAgA0IANwK0ASADQoCAgICAATcCqAFBACEFIANBADYCsAFBHEEEEKEgIgQgCzoAGSAEQQA6ABggBEEANgIUIAQgByABIAEgB0kbNgIQIAQgByABIAEgB0sbNgIMIARBCGogA0EoaigCADYCACAEIAMpAiA3AgAgA0GoAWoQ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ASABKQNANwN4IAEoAiggAUElNgIoQSRHDQMgASABKAIsEIYMDBwLIAogCykCADcCACABKAIoIQMgAUElNgIoIAEgASkDQDcDeCAKQQhqIAtBCGopAgA3AgAgCkEQaiALQRBqKAIANgIAIAIgAzYC+AggAkH4CGoQwwogBCEDDAMLIAIoAvwIIQUMGgsgCiALKQIANwIAIAEoAighAyABQSU2AiggASABKQNANwN4IApBCGogC0EIaikCADcCACAKQRBqIAtBEGooAgA2AgAgAiADNgL4CCACQfgIahDDCiAEIQMMAQsLQd3r4ABBKEHI8d8AEO4XAAtB3evgAEEoQdDq3wAQ7hcACyACIAUgBiAFIAZLGzYChAkgAiAENgKACSACIAM2AvwIQQ0MGwtB3evgAEEoQdDv3wAQ7hcAC0Hd6+AAQShBwO/fABDuFwALIAUtAARBDEcNGSAHENUgIQQgAkGECWogAUE0aikCADcCACACQYwJaiABQTxqKAIANgIAIAEoAighAyABQSU2AiggASABKQNANwN4IAIgASkCLDcC/AggAiADNgL4CCACQfgIaiIFEMMKIAcQ5w0iA0UEQCABKALYAiEDIAJBADoA+AggAyADIAUQ/RQhA0EBIQUMHAsCQAJAAkACQCADKAIAIgNBHWtBAk8EQCADQSRGBEAgASABKQNANwN4IAEoAiggAUElNgIoQSRGDSBB3evgAEEoQZDr3wAQ7hcACyACQYQJaiAHEOsLIAJBqAJqIAcQsxQgAkEhNgKACSACQaDr3wA2AvwIIAJBMDoA+AggAigCqAIgAigCrAIgAkH4CGoQ/RQhA0EBIQUgBxDnDSIERQ0gIAQoAgBBJEcNICABIAEpA0A3A3ggASgCKCABQSU2AihBJEcNASABIAEoAiwQhgwMIAsgAkH4CGogARDGAiACKAL4CCIDQQdGDQsgAigCkAkhBiACKQOICSEnIAIoAoQJIQcgAigCgAkhCgJAAkACQCADQQNrDgIBAgALQd3r4ABBKEH0698AEO4XAAsgAjUClAkhKCACICc3A+ACIAJBsAVqIgNBkOPgAEEBEL4VAnwgBq0gKEIghoQiKFBFBEAgAiAoNwP4CCACQbACaiACQfgIahCWDCADIAIoArACIAIoArQCEO0dIAIpA/gIEPEaICe/DAELIAJBATYC/AggAkH89uAANgL4CCACQgE3AoQJIAJB9AE2AuwCIAIgAkHoAmo2AoAJIAIgAkHgAmo2AugCIAJBsAVqIAJB+AhqELYkDQMgAisD4AILIAJBgAlqIAJBuAVqKAIANgIAIAIgAikCsAU3A/gIIAJB+AhqEJ4ZIihCgICAgHCDISeaISkgKKchBkGAgICAeCEJDAQLIAIgBjYCiAUgAkGwBWoiA0GQ4+AAQQEQvhUCQCAnUEUEQCACICc3A/gIIAJBuAJqIAJB+AhqEJYMIAMgAigCuAIgAigCvAIQ7R0gAikD+AgQ8RoMAQsgAkEBNgL8CCACQfz24AA2AvgIIAJCATcChAkgAkG3AjYC7AIgAiACQegCajYCgAkgAiACQYgFajYC6AIgAkGwBWogAkH4CGoQtiQNAyACKAKIBSEGCyACQYAJaiIDIAZBCGooAgA2AgAgAkHqAmoiBSAGQQ9qLQAAOgAAIAIgBikCADcD+AggAiAGLwANOwHoAiAGLQAMIQlBEEEEEKEgIgZBAiAJazoADCAGQQhqIAMoAgA2AgAgBiACKQP4CDcCACAGIAIvAegCOwANIAZBD2ogBS0AADoAACADIAJBuAVqKAIANgIAIAIgAikCsAU3A/gIIAJB+AhqEJ4ZIAIoAogFEI4rvyEpQgAhJ0GDgICAeCEJDAMLQd3r4ABBKEHE698AEO4XAAtBlOrgAEErIAJB+AhqQfSt4ABB1OvfABDGDgALQZTq4ABBKyACQfgIakH0reAAQeTr3wAQxg4ACyABKAJ8IQVB2ABBCBChICIDICcgBq2ENwMgIAMgKTkDGCADIAc2AhQgAyAKNgIQIAMgCTYCCCADQRE2AgAgAyAEIAUgBCAFSxs2AiwgAyAEIAUgBCAFSRs2AigMCQsCQCAFLQAJIgNBF2sOCwQZGRkZAgEZGQMBAAsgA0ECTw0YCwJAIAcQ5w0iA0UNACADKAIAQQJHDQAgAy0ACA0AIAMtAAlBFEcNACAHENsSIgNFDQAgAygCAEECRw0AIAMtAAhBAkcNACADLQAJQRdGDQQLIAcQ5w0iA0UNBCADKAIAQQJHDQQgAy0ACEECRw0EIAMtAAlBIUcNBEEIIQUMDQsgAkHoAmoiAyABEOABIAICfyACLQCcA0EERwRAIAJBtAVqIANBwAAQ/AYaIAJB+AhqQQRyIAJBsAVqQcQAEPwGGkETDAELIAIgAigC6AI2AvwIQRQLNgL4CCACQTBqIAJB+AhqEJAYIAIoAjQhAyACKAIwIQUMGAsgBxDVICEGAkACQAJAIAcQ5w0iA0UNACADKAIAQQJHDQAgAy0ACEECRw0AIAMtAAlBIEYNAQsgAkGACWogBxDrCyACQUBrIAcQsxQgAkHI498ANgL8CCACQTQ6APgIIAIoAkAgAigCRCACQfgIahD9FCEDIAcQ5w0iBEUNASAEKAIAQSRHDQEgASABKQNANwN4IAEoAiggAUElNgIoQSRHDQggASABKAIsEIYMDAELIAEoAighAyABQSU2AiggASABKQNANwN4IAJBhAlqIAFBNGopAgA3AgAgAkGMCWogAUE8aigCADYCACACIAEpAiw3AvwIIAIgAzYC+AggAkH4CGoQwwoCQAJAAkAgBxDnDSIDRQ0AIAMoAgBBAkcNACADLQAIQQJHDQAgAy0ACUEcRg0BCyACQfgIaiABQQEQ1QIgAigC+AghAyACLQCMCUEDRg0CIAJBxAVqIAJBjAlqKAIANgIAIAJBvAVqIAJBhAlqKQIANwIAIAIgAikC/Ag3ArQFQQQhBAwBCyACQfgIaiIFIAEQ4AEgAigC+AghAyACLQCsCSIEQQRGDQEgAkGwBWpBBHIgBUEEckEwEPwGGiACQewFaiACQbQJaigAADYAACACIAIpAK0JNwDlBQsgAiAEOgDkBSACIAM2ArAFQQAhAwJAAkAgBxCyIQ0AIAcQ5w0iBUUNACAFKAIAQRRHDQAgBS0ABEEERw0AIAJBADoA9QIgAiABLQCOAzoA9AIgAiABLQCeAzoAhAMgAiABKQGCAzcA6AIgAiABKQOQAzcA9gIgAiABKAKYAzYA/gIgAiABLwGcAzsAggMgAiABQYoDaiIDKAEANgDwAiACQZEJaiABQZcDaikAADcAACACQYwJaiABQZIDaikBADcCACACQYQJaiADKQEANwIAIAIgASkBggM3AvwIIAFBgAFqIAJB6AJqEMgIIAIgATYC+AggAkHIAGogARDwASACKAJMIQMgAigCSCACQfgIahCgJg0BIAItAOQFIQQLIAEoAnwhByACQbgDaiACQbAFakE0EPwGGiACIAJB7AVqKAAANgCvAyACIAIpAOUFNwOoAyAGIAcgBiAHSRshBSAEQf8BcUEFRw0JIAUhAwwBCyACQbAFahDYIQsgAiADNgL8CEEUIQcMCgsgBxDVICEGIAJB+AhqIgkgARDUByACKAL4CA0CIAIoAoAJIQQgAigC/AghBSAHELIhDQMgBxDnDSIDRQ0DIAMoAgBBAkcNAyADLQAIDQMgAy0ACUEORw0DIAJB6AJqIgMgASAGQQAgBSAEEI0IIAICfyACLQCMA0ECRwRAIAJBtAVqIANBKBD8BhogCUEEciACQbAFakEsEPwGGkESDAELIAIgAigC6AI2AvwIQRQLNgL4CCACQShqIAJB+AhqEJAYIAIoAiwhAyACKAIoIQUMFgsgASgCKCEDIAFBJTYCKCABIAEpA0A3A3ggAkGECWogAUE0aikCADcCACACQYwJaiABQTxqKAIANgIAIAIgASkCLDcC/AggAiADNgL4CCACQfgIaiIDEMMKIAMgARDUByACKAL4CA0BIAJB6AJqIgUgASAEQQEgAigC/AggAigCgAkQjQggAgJ/IAItAIwDQQJHBEAgAkG0BWogBUEoEPwGGiADQQRyIAJBsAVqQSwQ/AYaQRIMAQsgAiACKALoAjYC/AhBFAs2AvgIIAJBIGogAkH4CGoQkBggAigCJCEDIAIoAiAhBQwVCyAHEOcNIgMNBQwGCyACKAL8CCEDQQEhBQwTC0HYAEEIEKEgIgMgBDYCCCADIAU2AgQgA0EBNgIAC0EAIQUMEQtB3evgAEEoQeDj3wAQ7hcACyACIAYgByAGIAdLGzYChAkgAiAFNgKACSACQYgJaiACQbgDakE0EPwGGiACQcQJaiACKACvAzYAACACIAQ6ALwJIAIgAzYCyAkgAiACKQOoAzcAvQlBBCEHDAILIAMoAgBBAkcNACADLQAIQQNHDQBBCiEFDAILAkAgBxDnDSIDRQ0AIAMoAgBBAkcNACADLQAIDQAgAy0ACUEYRw0AQQAhBQwCCwJAIAcQ5w0iA0UNACADKAIAQQJHDQAgAy0ACA0AIAMtAAlBH0cNAEEEIQUMAgsCQCAHEOcNIgNFDQAgAygCAEECRw0AIAMtAAgNACADLQAJQR5HDQBBBSEFDAILAkAgBxDnDSIDRQ0AIAMoAgBBAkcNACADLQAIDQAgAy0ACUEgRw0AQQshBQwCCwJAIAcQ5w0iA0UNACADKAIAQQJHDQAgAy0ACA0AIAMtAAlBHUcNAEECIQUMAgsCQCAHEOcNIgNFDQAgAygCAEECRw0AIAMtAAgNACADLQAJQRxHDQBBAyEFDAILAkAgBxDnDSIDRQ0AIAMoAgBBAkcNACADLQAIDQAgAy0ACUEbRw0AQQYhBQwCCwJAIAcQ5w0iA0UNACADKAIAQQJHDQAgAy0ACA0AIAMtAAlBEEcNAEEHIQUMAgsCQCAHEOcNIgNFDQAgAygCAEECRw0AIAMtAAgNACADLQAJQRpHDQBBASEFDAILAkAgBxDnDSIDRQ0AIAMoAgBBAkcNACADLQAIDQAgAy0ACUERRw0AQQkhBQwCC0ENIQUgBxDnDSIDRQ0BIAMoAgBBAkcNASADLQAIDQFBDEENIAMtAAlBGUYbIQUMAQsgAiAHNgL4CCACQThqIAJB+AhqEJAYIAIoAjwhAyACKAI4IQUMDAsgBxDbEiIDBH8gAygCAEEGRgVBAAtFIAVBDUdxRQRAIAcQ1SAhBSACQfgIaiIEIAEQhQgCQAJAIAItAPgIRQRAIAItAPkIIAQgAUEBENUCIAIoAvgIIQMgAi0AjAkiBkEDRg0BIAJB9AJqIAJBhAlqIgopAgA3AgAgAkH/AmogAkGPCWotAAA6AAAgAiACKQL8CDcC7AIgAiACLwCNCTsA/QIgAiAGOgD8AiACIAM2AugCQQAhAwJAIAcQsiENACAHEOcNIgZFDQAgBigCAEEURw0AIAYtAARBBEcNACACQQA6AL0FIAIgAS0AjgM6ALwFIAIgAS0AngM6AMwFIAIgASkBggM3ALAFIAIgASkDkAM3AL4FIAIgASgCmAM2AMYFIAIgAS8BnAM7AMoFIAIgAUGKA2oiAygBADYAuAUgAkGRCWogAUGXA2opAAA3AAAgAkGMCWogAUGSA2opAQA3AgAgCiADKQEANwIAIAIgASkBggM3AvwIIAFBgAFqIAJBsAVqEMgIIAIgATYC+AggAkEYaiABEPABIAIoAhwhAyACKAIYIAQQoCZFDQAgAkHoAmoQzxsMAgtBAXEEQCABKAJ8IQQgAkGoAToA+AggASAFIAQgBCAFSxsgBSAEIAQgBUkbIAJB+AhqENAZCyACQdACaiIJIAJB8AJqKQMANwMAIAJB2AJqIgogAkH4AmooAgA2AgAgAkHGAmoiCyACQf0CaiIEQQJqLQAAOgAAIAIgAikD6AI3A8gCIAIgBC8AADsBxAIgBSABKAJ8IgYgBSAGSRshBEEDIQcgAi0A/AIiDUEDRgRAIAQhAwwCCyACQZAJaiAJKQMANwMAIAJBmAlqIAooAgA2AgAgAkGfCWogCy0AADoAACACIAUgBiAFIAZLGzYChAkgAiAENgKACSACIAIpA8gCNwOICSACIA06AJwJIAIgAi8BxAI7AJ0JIAIgAzYCoAkMAgsgAigC/AghAwsgAiADNgL8CEEUIQcLIAIgBzYC+AggAkEQaiACQfgIahCQGCACKAIUIQMgAigCECEFDAwLIAEoAighAyABQSU2AiggASABKQNANwN4IAJBhAlqIAFBNGopAgA3AgAgAkGMCWogAUE8aigCADYCACACIAEpAiw3AvwIIAIgAzYC+AggAkH4CGoQwwogASgCfCEGQdgAQQgQoSAiAyAFOgAMQQAhBSADQQA2AgAgAyAEIAYgBCAGSxs2AgggAyAEIAYgBCAGSRs2AgQMCwsgBxDVICEKIAICfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAHEOcNIgMEQCADKAIAQRFGDQELIAJB+AhqIAEQxgIgAigC/AghAyACKAL4CCIGQQdGDREgAkHIBWogAkGQCWopAwA3AwAgAkHABWogAkGICWopAwA3AwAgAiACKQOACTcDuAUgAiADNgK0BSACIAY2ArAFIAYOBQIFAQMEAQsgBxDVICELIAcQ5w0iA0UEQCABKALYAiEDIAJBADoA+AggAyADIAJB+AhqEP0UIQMMEQsgAygCAEEkRgRAIAEgASkDQDcDeCABKAIoIAFBJTYCKEEkRw0JIAEoAiwhAwwRCyABKAIoIQMgAUElNgIoIAEgASkDQDcDeCACQYQJaiABQTRqKQIANwIAIAJBjAlqIAFBPGooAgA2AgAgAiABKQIsNwL8CCACIAM2AvgIIAJB+AhqIgYQwwogAkEANgLwBCACQoCAgIDAADcC6AQgAkGwBWoiDSABQQAQywQgAigCsAUhAyACLQDIBSIJQQJGDQ8gAUEsaiEEIAJB+AJqIg4gAkHEBWooAgA2AgAgAkHwAmoiESACQbwFaikCADcDACACIAIpArQFNwPoAiACIAIoAMkFNgKgDCACIAJBzAVqKAAANgCjDEEgQQgQoSAiBSADNgIAIAUgCToAGCAFIAIpA+gCNwIEIAVBDGogESkDADcCACAFQRRqIA4oAgA2AgAgBSACKAKgDDYAGSAFQRxqIAIoAKMMNgAAIAJBATYCkAUgAiAFNgKMBSACQQE2AogFIA1BBHIhBSACQZEJaiENIAZBBHIhBiACQckFaiEOA0AgCUEBcUUEQAJAIAcQ5w0iAwRAIAMoAgBBFkYNAQsgAkG4BWogBxDrCyACQeAAaiAHELMUIAJB+O7fADYCtAUgAkE0OgCwBSACKAJgIAIoAmQgAkGwBWoQ/RQhAyAHEOcNIgRFDREgBCgCAEEkRw0RIAEgASkDQDcDeCABKAIoIAFBJTYCKEEkRw0KIAEgASgCLBCGDAwRCyAFIAQpAgA3AgAgASgCKCEDIAFBJTYCKCABIAEpA0A3A3ggBUEIaiIRIARBCGoiCSkCADcCACAFQRBqIhIgBEEQaiIQKAIANgIAIAIgAzYCsAUgAkGwBWoQwwogAkHwAGogARCUAiACKAJ0IQMgAigCcA0QIAJB6ARqIAMQzRsCQCAHEOcNIgMEQCADKAIAQQ5GDQELIAJBuAVqIAcQ6wsgAkHoAGogBxCzFCACQejg3wA2ArQFIAJBNDoAsAUgAigCaCACKAJsIAJBsAVqEP0UIQMgBxDnDSIERQ0RIAQoAgBBJEcNESABIAEpA0A3A3ggASgCKCABQSU2AihBJEcNCSABIAEoAiwQhgwMEQsgBSAEKQIANwIAIAEoAighAyABQSU2AiggASABKQNANwN4IBEgCSkCADcCACASIBAoAgA2AgAgAiADNgKwBSACQbAFaiIDEMMKIAMgAUEAEMsEIAIoArAFIQMgAi0AyAUiCUECRg0QIAYgBSkCADcCACANIA4oAAA2AAAgBkEQaiASKAIANgIAIAZBCGogESkCADcCACANQQNqIA5BA2ooAAA2AAAgAiAJOgCQCSACIAM2AvgIIAJBiAVqIAJB+AhqEMAQDAELCyACQdAEaiIGIAJBkAVqKAIANgIAIAIgAikCiAU3A8gEIAIoAuwEIQMgAigC6AQiBUGAgICAeEYNECACKALwBCEJIAJBuAVqIAYoAgA2AgAgAiACKQPIBDcDsAUgAiAJNgLwAiACIAM2AuwCIAIgBTYC6AIgBxDnDSIGBEAgBigCAEERRg0GCyACQYAJaiAHEOsLIAJB2ABqIAcQsxQgAkGY6d8ANgL8CCACQTQ6APgIIAIoAlggAigCXCACQfgIahD9FCEDIAcQ5w0iBEUNDSAEKAIAQSRHDQ0gASABKQNANwN4IAEoAiggAUElNgIoQSRHDQkgASABKAIsEIYMDA0LQd3r4ABBKEHA6d8AEO4XAAtBgYCAgHghBQwIC0GAgICAeCEFDAcLQYOAgIB4IQUMBgsgAikDuAUhJyACQbAFahCBFEGCgICAeCEFDAYLIAEoAighBiABQSU2AiggASABKQNANwN4IAJBhAlqIARBCGopAgA3AgAgAkGMCWogBEEQaigCADYCACACIAQpAgA3AvwIIAIgBjYC+AggAkH4CGoQwwogBUGEgICAeEYNCiALIAEoAnwiByAHIAtJGyEGIAsgByAHIAtLGyEEIAmtIAI1ArAFQiCGhCEnIAIpArQFISgMBgtB3evgAEEoQeju3wAQ7hcAC0Hd6+AAQShBkO/fABDuFwALQd3r4ABBKEGE6d8AEO4XAAtB3evgAEEoQbDp3wAQ7hcACyACKALMBSEGIAIoAsgFIQQgAikDwAUhKCACKQO4BSEnCyABKAJ8IQcLIAIgBjYCnAkgAiAENgKYCSACICg3A5AJIAIgJzcDiAkgAiADNgKECSACIAU2AoAJIAIgCiAHIAcgCkkbNgKkCSACIAogByAHIApLGzYCoAlBEQwECyACQbAFahDyIiACQegCahDwJgwCCyACQYgFahDyIgsgAkHoBGoQ8CYLIAIgAzYC/AhBFAs2AvgIIAJB0ABqIAJB+AhqEJAYIAIoAlQhAyACKAJQIQUMCgsgAkH4CGogARDRAiACQQE6AOgCIAIgAikA+ws3AOkCIAIgAikAgww3APECIAIgAikAiww3APkCIAIgAigAkww2AIEDIAJB+AlqIAJB6AJqEMgIIAJBlAVqIAJBrAlqKQIANwIAIAJBnAVqIAJBtAlqKAIANgIAIAIoAqAJIQMgAkElNgKgCSACIAIpA7gJNwPwCSACIAIpAqQJNwKMBSACIAM2AogFIAJBiAVqEMMKIAJBpAlqIQMgAgJ/AkACQAJAAkACQAJAAkACQAJ/AkACQCACQaAJaiIEEOcNIgVFDQAgBSgCAEEURw0AIAUtAARBC0YNAQsCQCAEEOcNIgVFDQAgBSgCAEEURw0AIAUtAARBDEYNAQsCQCAEEOcNIgVFDQAgBSgCAEECRw0AIAUtAAgNACAFLQAJQQlHDQAgAkGUBWogA0EIaikCADcCACACQZwFaiADQRBqKAIANgIAIAIoAqAJIQUgAkElNgKgCSACIAU2AogFIAIgAikDuAk3A/AJIAIgAykCADcCjAUgAkGIBWoQwwoLIAQQ5w0iBUUNAiAFKAIAQQtHDQIgAkGUBWoiBiADQQhqKQIANwIAIAJBnAVqIgkgA0EQaigCADYCACACKAKgCSEFIAJBJTYCoAkgAiAFNgKIBSACIAIpA7gJNwPwCSACIAMpAgA3AowFIAJBiAVqIgoQwwogAkG4BWogAkH6C2oiBUEIaikAADcDACACQcAFaiAFQRBqKQAANwMAIAJBxQVqIAVBFWopAAA3AAAgAiAFKQAANwOwBSAEEOcNIgVFDQIgBSgCAEECRw0CIAJBsAVqIAUtAAggBUEJai0AABDdCQ0CIAYgA0EIaikCADcCACAJIANBEGooAgA2AgAgAigCoAkhBSACQSU2AqAJIAIgBTYCiAUgAiACKQO4CTcD8AkgAiADKQIANwKMBSAKEMMKIAQQ5w0iA0UNAiADKAIAQQJHDQIgAy0ACEECRw0CQR4MAQsgAkGUBWogA0EIaikCADcCACACQZwFaiADQRBqKAIANgIAIAIoAqAJIQUgAkElNgKgCSACIAU2AogFIAIgAikDuAk3A/AJIAIgAykCADcCjAUgAkGIBWoQwwogBBDnDSIDRQ0BIAMoAgBBAkcNASADLQAIDQFBCQshBCADLQAJIAJB+AhqEIYQIARHDQEgBxDVICEKIAcQ5w0iAwRAIAMoAgBBDUYNAwsgAkGACWogBxDrCyACQdgBaiAHELMUIAJBkOHfADYC/AggAkE0OgD4CCACKALYASACKALcASACQfgIahD9FCEFIAcQ5w0iA0UNByADKAIAQSRHDQcgASABKQNANwN4IAEoAiggAUElNgIoQSRHDQMgASABKAIsEIYMDAcLIAJB+AhqEIYQCyAHENUgIQMgAkGwBWogARBLIAIoArQFIQQgAgJ/IAIoArAFIgVBgICAgHhHBEAgAiACKAK4BTYChAkgAiAENgKACSACIAU2AvwIIAIgAyABKAJ8IgQgAyAESxs2AowJIAIgAyAEIAMgBEkbNgKICUEFDAELIAIgBDYC/AhBFAs2AvgIIAJByAFqIAJB+AhqEJAYIAIoAswBIQMgAigCyAEhBQwQCyABKAIoIQMgAUElNgIoIAEgASkDQDcDeCACQYQJaiABQTRqKQIANwIAIAJBjAlqIAFBPGooAgA2AgAgAiABKQIsNwL8CCACIAM2AvgIIAFBLGohBiACQfgIahDDCgJAAkACQAJAAkACQAJAAkACQCAHEOcNIgNFDQAgAygCAEEURw0AIAMtAARBC0YNAQsgBxDnDSIDRQ0BIAMoAgBBFEcNASADLQAEQQxHDQELQQIhCQJAIAcQ5w0iA0UNACADKAIAQRRHDQBBAUECIAMtAARBC0YbIQkLIAEoAighAyABQSU2AiggASABKQNANwN4IAJBhAlqIAZBCGopAgA3AgAgAkGMCWogBkEQaigCADYCACACIAYpAgA3AvwIIAIgAzYC+AggAkH4CGoQwwoCQCAHEOcNIgNFDQAgAygCAEECRw0AIAMtAAgNACADLQAJQQlGDQILIAJBgAlqIAcQ6wsgAkGgAmogBxCzFCACQdDl3wA2AvwIIAJBNDoA+AggAigCoAIgAigCpAIgAkH4CGoQ/RQhBSAHEOcNIgNFDQsgAygCAEEkRw0LIAEgASkDQDcDeCABKAIoIAFBJTYCKEEkRw0DIAEgASgCLBCGDAwLC0EDIQkgBxDnDSIDRQ0BIAMoAgBBAkcNASADLQAIDQEgAy0ACUEJRw0BIAEoAighAyABQSU2AiggASABKQNANwN4IAJBhAlqIAZBCGopAgA3AgAgAkGMCWogBkEQaigCADYCACACIAYpAgA3AvwIIAIgAzYC+AggAkH4CGoQwwpBACEJDAELIAEoAighAyABQSU2AiggASABKQNANwN4IAJBhAlqIAZBCGopAgA3AgAgAkGMCWogBkEQaigCADYCACACIAYpAgA3AvwIIAIgAzYC+AggAkH4CGoQwwoLAkAgBxDnDSIDBEAgAygCAEELRg0BCyACQYAJaiAHEOsLIAJB4AFqIAcQsxQgAkH45d8ANgL8CCACQTQ6APgIIAIoAuABIAIoAuQBIAJB+AhqEP0UIQUgBxDnDSIDRQ0JIAMoAgBBJEcNCSABIAEpA0A3A3ggASgCKCABQSU2AihBJEcNAiABIAEoAiwQhgwMCQsgASgCKCEDIAFBJTYCKCABIAEpA0A3A3ggAkGECWogBkEIaikCADcCACACQYwJaiAGQRBqKAIANgIAIAIgBikCADcC/AggAiADNgL4CCACQfgIahDDCiAHENUgIQQgAkHoAmogARDTBCACKALwAiEFIAIpA+gCIidQDQggAiACKAL0AjYClAUgAiAFNgKQBSACICc3A4gFIAJBmAJqIAFBsO7fAEGsxOAAQQIQtAcgAigCnAIhAyACKAKYAgRAICcQ8RogAyEFDAkLIAEoAnwhCyACQYAJaiACQYgFahCcHEEAIQUgAkGfCWpBADYAACACQQA2ApwJIAIgAzYCmAkgAiAEIAsgBCALSxs2AvwIIAIgBCALIAQgC0kbIgM2AvgIIAJBsAVqQQRyIAJB+AhqIgRBBHJBJhD8BhogAkHfBWogAkGnCWotAAA6AAAgAiACKACjCTYA2wUgAkEAOgDaBSACIAM2ArAFAkAgBxDnDSIDRQ0AIAMoAgBBAkcNACADLQAIDQAgAy0ACUEBRw0AIAEoAighAyABQSU2AiggASABKQNANwN4IAJBhAlqIAZBCGopAgA3AgAgAkGMCWogBkEQaigCADYCACACIAYpAgA3AvwIIAIgAzYC+AggBBDDCiACQZACaiABEJQCIAIoApQCIQUgAigCkAINCAsgAiAFNgKIBQJAAkAgBxDnDSIDRQ0AIAMoAgBBDEcNACABKAIoIQMgAUElNgIoIAEgASkDQDcDeCACQYQJaiAGQQhqKQIANwIAIAJBjAlqIAZBEGooAgA2AgAgAiAGKQIANwL8CCACIAM2AvgIIAJB+AhqEMMKAkAgBxDnDSIDRQ0AIAMoAgBBFEcNACADLQAEQQtGDQILAkAgBxDnDSIDRQ0AIAMoAgBBFEcNACADLQAEQQxGDQILQQMhAyAHEOcNIgRFDQcgBCgCAEEXRw0HIAEoAighAyABQSU2AiggASABKQNANwN4IAJBhAlqIAZBCGopAgA3AgAgAkGMCWogBkEQaigCADYCACACIAYpAgA3AvwIIAIgAzYC+AggAkH4CGoQwwpBACEDDAcLIAJBgAlqIAcQ6wsgAkHoAWogBxCzFCACQZDk3wA2AvwIIAJBNDoA+AggAigC6AEgAigC7AEgAkH4CGoQ/RQhBSAHEOcNIgNFDQcgAygCAEEkRw0HIAEgASkDQDcDeCABKAIoIAFBJTYCKEEkRw0DIAEgASgCLBCGDAwHC0ECIQMCQCAHEOcNIgRFDQAgBCgCAEEURw0AQQFBAiAELQAEQQtGGyEDCyABKAIoIQQgAUElNgIoIAEgASkDQDcDeCACQYQJaiILIAZBCGopAgA3AgAgAkGMCWoiDSAGQRBqKAIANgIAIAIgBikCADcC/AggAiAENgL4CCACQfgIaiIEEMMKAkAgBxDnDSIORQ0AIA4oAgBBF0cNACABKAIoIQ4gAUElNgIoIAEgASkDQDcDeCALIAZBCGopAgA3AgAgDSAGQRBqKAIANgIAIAIgBikCADcC/AggAiAONgL4CCAEEMMKDAYLIAJBgAlqIAcQ6wsgAkGIAmogBxCzFCACQYDg3wA2AvwIIAJBNDoA+AggAigCiAIgAigCjAIgAkH4CGoQ/RQhBSAHEOcNIgNFDQYgAygCAEEkRw0GIAEgASkDQDcDeCABKAIoIAFBJTYCKEEkRw0DIAEgASgCLBCGDAwGC0Hd6+AAQShB6OXfABDuFwALQd3r4ABBKEGQ5t8AEO4XAAtB3evgAEEoQaDm3wAQ7hcAC0Hd6+AAQShBsObfABDuFwALQd3r4ABBKEHg5t8AEO4XAAsgAkGAAmogAUHY398AEIkRIAIoAoQCIQQgAigCgAIEQCAEIQUMAQsgAiAENgLoAgJAAkACQAJAAkAgBxDnDSILRQ0AAkACQCALKAIAQQ5rDgICAAELIAEoAighCyABQSU2AiggASABKQNANwN4IAJBhAlqIAZBCGopAgA3AgAgAkGMCWogBkEQaigCADYCACACIAYpAgA3AvwIIAIgCzYC+AggAkH4CGoQwwoMAQsgBxCyIUUNAQsCQCAHEOcNIgsEQCALKAIAQQ5GDQELIAJBgAlqIAcQ6wsgAkHwAWogBxCzFCACQejg3wA2AvwIIAJBNDoA+AggAigC8AEgAigC9AEgAkH4CGoQ/RQhBSAHEOcNIgNFDQMgAygCAEEkRw0DIAEgASkDQDcDeCABKAIoIAFBJTYCKEEkRg0CQd3r4ABBKEHQ5t8AEO4XAAsgASgCKCEHIAFBJTYCKCABIAEpA0A3A3ggAkGECWogBkEIaikCADcCACACQYwJaiAGQRBqKAIANgIAIAIgBikCADcC/AggAiAHNgL4CCACQfgIahDDCiABKAJ8IQYgAkH4A2oiByACQbAFakEqEPwGGiACQfQDaiILIAJB2wVqIg1BBGotAAA6AAAgAiANKAAANgLwAyACIAogBiAGIApJGzYChAkgAiAKIAYgBiAKSxs2AoAJIAJBiAlqIAdBKhD8BhogAkG3CWogCy0AADoAACACQQA6ALIJIAIgAzoAwQkgAiAJOgDACSACIAQ2ArwJIAIgBTYCuAkgAiACKALwAzYAswlBEAwHCyACQYAJaiAHEOsLIAJB+AFqIAcQsxQgAkGww+AANgL8CCACQTQ6APgIIAIoAvgBIAIoAvwBIAJB+AhqEP0UIQUgBxDnDSIDRQ0BIAMoAgBBJEcNASABIAEpA0A3A3ggASgCKCABQSU2AihBJEcNAgsgASABKAIsEIYMCyACQegCahCQKAwBC0Hd6+AAQShBwObfABDuFwALIAJBiAVqEJAoCyACQbAFahC2IgsgAiAFNgL8CEEUCzYC+AggAkHQAWogAkH4CGoQkBggAigC1AEhAyACKALQASEFDAkLIAJBvARqEPsmDAELAkACQAJAAkAgAigCvAQiCkGAgICAeEcEQCACIAk2ArgEIAIgBjYCtAQgAiAKNgKwBAJAIAcQ5w0iAwRAIAMoAgBBDEYNAQsgAkGACWogBxDrCyACQagBaiAHELMUIAJBkOTfADYC/AggAkE0OgD4CCACKAKoASACKAKsASACQfgIahD9FCEFAkAgBxDnDSIDRQ0AIAMoAgBBJEcNACABIAEpA0A3A3ggASgCKCABQSU2AihBJEcNAyABIAEoAiwQhgwLIAJBsARqEPsmDAYLIAEoAighAyABQSU2AiggASABKQNANwN4IAJBhAlqIAtBCGopAgA3AgAgAkGMCWogC0EQaigCADYCACACIAspAgA3AvwIIAIgAzYC+AggAkH4CGoQwwogAiAKNgKkBCACIAk2AqwEIAIgBjYCqAQgBiAJQThsaiELQQAhBCAGIQMCQANAIAMgC0YNASADKAIwIQUgA0E4aiEDAkACQCAFKAIAQQhrDgIAAgELQQEhBAwBCyAEQQAhBEUNAAsgASgCfCEDIAJB2wA6APgIIBEgAyADIBFLGyARIAMgAyARSRsgAkH4CGoQ/RQhBSAHEOcNIgNFDQUgAygCAEEkRw0FIAEgASkDQDcDeCABKAIoIAFBJTYCKEEkRw0DIAEgASgCLBCGDAwFCyAKQYCAgIB4Rw0DCyAGIQUMBAtB3evgAEEoQfDq3wAQ7hcAC0Hd6+AAQShB2OLfABDuFwALIAIgESABKAJ8IgMgAyARSRs2AowJIAIgESADIAMgEUsbNgKICSACIAk2AoQJIAIgBjYCgAkgAiAKNgL8CEEHDAILIAJBpARqEPsmCyACIAU2AvwIQRQLNgL4CCACQZgBaiACQfgIahCQGCACKAKcASEDIAIoApgBIQUMBQsgAkGwBWoQvQULIAIgAzYC/AhBFAs2AvgIIAJB+ABqIAJB+AhqEJAYIAIoAnwhAyACKAJ4IQUMAgsgAkGECWogBxDrCyACQQhqIAcQsxQgAkGFATYCgAkgAkGE7N8ANgL8CCACQTA6APgIIAIoAgggAigCDCACQfgIahD9FCEDQQEhBSAHEOcNIgRFDQEgBCgCAEEkRw0BIAEgASkDQDcDeCABKAIoIAFBJTYCKEEkRgRAIAEgASgCLBCGDAwCC0Hd6+AAQShBjO3fABDuFwALIAEoAiwhA0EBIQULIBggAzYCBCAYIAU2AgAgAkHQDGokACAIKAIUIQMgCCgCEA0DIAFBLGohBiAPQQBHIQogCEHQAGpBBHIhDwNAAkACQAJAAkAgDBCyIQ0AIAwQ5w0iBEUNACAEKAIAQQtHDQAgDyAGKQIANwIAIAEoAighBSABQSU2AiggASABKQNANwN4IA9BCGoiBCAGQQhqIgIpAgA3AgAgD0EQaiIHIAZBEGoiCSgCADYCACAIIAU2AlAgCEHQAGoQwwogDBDnDSIFBEAgBSgCAEEMRg0CCyAIQQhqIAEQlAIgCCgCDCEFIAgoAghFBEAgCCAFNgLgASAMEOcNIgsEQCALKAIAQQxGDQQLIAggAzYCqAEgCEHYAGogDBDrCyAIIAwQsxQgCEGQ5N8ANgJUIAhBNDoAUCAIKAIAIAgoAgQgCEHQAGoQ/RQhAyAMEOcNIgRFDQcgBCgCAEEkRw0HIAEgASkDQDcDeCABKAIoIAFBJTYCKEEkRw0EIAEgASgCLBCGDAwHCyAIIAM2AqgBIAUhAwwHC0EAIQQMCgsgDyAGKQIANwIAIAEoAighBSABQSU2AiggASABKQNANwN4IAQgAikCADcCACAHIAkoAgA2AgAgCCAFNgJQIAhB0ABqEMMKIAMQmwghBSABKAJ8IQJB2ABBCBChICIEIAM2AgQgBEEGNgIAIAQgBSACIAIgBUkbNgIMIAQgBSACIAIgBUsbNgIIIAQhAwwCCyAPIAYpAgA3AgAgASgCKCELIAFBJTYCKCABIAEpA0A3A3ggBCACKQIANwIAIAcgCSgCADYCACAIIAs2AlAgCEHQAGoQwwogAxCbCCECIAEoAnwhB0HYAEEIEKEgIgQgCjoAFCAEIAU2AgggBCADNgIEIARBDzYCACAEIAIgByACIAdLGzYCECAEIAIgByACIAdJGzYCDCAEIQMMAQsLQd3r4ABBKEG48d8AEO4XAAtB3evgAEEoQaDi3wAQ7hcACyAIQeABahC9BQsgCEGoAWoQvQULQQEhBAwCCyAIQQI6ANoBIAggAzYCqAEgCCADNgJUQRQhDwsgCCAPNgJQIAhBGGogCEHQAGoQkBggCCgCHCEDIAgoAhghBAsgACADNgIEIAAgBDYCACAIQaACaiQAC8gUAhp/An4jAEGQBGsiBSQAAn8CQAJAAkAgAyAEKAIwEQUAQf8BcUEBaw4DAgAAAQsgBUGwAWogAEGQAWovAAA7AQAgBSAAKQCIATcDqAFB2AAMAgsgBUGwAWogAEGkAWovAAA7AQAgBSAAKQCcATcDqAFB8AAMAQsgBUGwAWogAEGaAWovAAA7AQAgBSAAKQCSATcDqAFB5AALIQYgBUEgaiIHIAVBsAFqLwEAIgo7AQAgBSAFKQOoASIfNwMYIAVB3ANqIgsgCjsBACAFQQI2AqwBIAVB5MzfADYCqAEgBUIBNwK0ASAFQeAANgKkAyAFIAAgBmo2AtADIAUgHzcC1AMgBSAFQaADaiIINgKwASAFIAVB0ANqIgk2AqADIAVBJGogBUGoAWoiDBD4FCALIAcvAQA7AQAgBUECNgKsASAFQeTM3wA2AqgBIAVCATcCtAEgBUHhADYCpAMgBSAAQRRqNgLQAyAFIAUpAxg3AtQDIAUgCDYCsAEgBSAJNgKgAyAFQTBqIAwQ+BQgACgCBCEPIAAoAgAhCiAALQDyASEVIAAoAuQBIREgBSgCKCEGIAUoAiwhEyAFKAI0IQcgBSgCOCENIAVBEGogACgCCCAAKAIMELsoIAUoAhQhFiAFKAIQIQsgBUEANgLYAyAFQoCAgIAQNwLQAyAFQQM6AMgBIAVBIDYCuAEgBUEANgLEASAFQbTL3wA2AsABIAVBADYCsAEgBUEANgKoASAFIAk2ArwBAkACQAJAAn8CfwJAIAMgDCAEKAIQEQIARQRAIAUoAtADIAUoAtgDIRAgBSgC1AMhEiAFIBU6AOUBIAVBAToA5AEgBSARQQJrIhRBACARIBRPGyIRNgLgASAFIA02AtwBIAUgBzYC2AEgBSATNgLUASAFIAY2AtABIAUgFjYCzAEgBUEBIAsgC0EDRhs2AsgBIAUgDzYCxAEgBUEBIAogCkEDRhs2AsABIAVCmYCAgJADNwK4ASAFQsSTgIDAADcCsAEgBUKBgICAgP0ANwKoASAIIAAtAPEBIhkgEiAQIAwQOSAFQT42AkggBUECNgLUAyAFQfTM3wA2AtADIAVCATcC3AMgBSAINgJEIAUgBUHEAGo2AtgDIAEgCSACKAIUEQIAIQ8gBSgCoAMgBSgCpAMQ1ikgEhDWKUEBIA8NAxpBACAALQDwAUEBRw0DGiAFQQhqIAMgBCgCSBEAAAJ/IAUoAggiCARAQQAhBCAFKAIMDAELIAUgAyAEKAIYEQAAIAUoAgAiCEUNAkEBIQQgBSgCBAsgBSAENgJArUIghiEfIAitISAgBUE8agwCCwwFC0IAIR8gBUFAawtBAzYCACAFKAJAIgNBA0YNASAAQRBqIRogBSADNgJEIAUgHyAghDcCSEEBIAsgC0EDRhshC0EBIAogCkEDRhshCiAAQSRqIRsgAC0A8QEhHCAAKAIEIQggBUHUA2ohEiAFQaQDaiEPIAAoAhQhHSAFQdAAaiETIAUoAjwhBAJAA0AgBUEDNgJQAkACQAJAAn8gBEEDRgRAIAVB3ABqIAVBxABqENgJIAUoAlwMAQsgBSAfNwJgIAUgBDYCXCAECyIDQQJHBEAgBSgCZCENIAUoAmAhDiAFKAJQIgRBA0YEQCAFQagBaiAFQcQAahDYCSATQQhqIAVBsAFqKAIANgIAIBMgBSkCqAE3AgAgBSgCUCEECyAFIABBNEHIACAEQQJGIgYbaigCADYCaCAFQQQ2AtQDIAVBhM3fADYC0AMgBUIDNwLcAyAFQeIANgK8ASAFIBs2ArgBIAVB4gA2ArQBIAUgGjYCsAEgBUHiADYCrAEgBSAFQagBaiIJNgLYAyAFIAVB6ABqNgKoASAFQfgAaiAFQdADaiIXEPgUIAVByANqIAVBgAFqKAIANgIAIA8gBSkDGDcAACAPQQhqIAVBIGoiBy8BADsAACAFIAUpAng3A8ADIAUgBUHAA2oiDDYCoAMgBUHsAGogBUGgA2oiGBDCDSAFKALAAyAFKALEAxDWKSAFQQI2AqwBIAVBqM3fADYCqAEgBUIBNwK0ASAFQeIANgLEAyAFQSAgHSAGGzYCnAEgBSAMNgKwASAFIAVBnAFqIh42AsADIAVBkAFqIAkQ+BQgBUGoA2ogBUGYAWooAgA2AgAgEiAFKQMYNwAAIBJBCGogBy8BADsAACAFIAUpApABNwOgAyAFIBg2AtADIAVBhAFqIBcQwg0gBSgCoAMgBSgCpAMQ1ikgBSgCjAEhECAFKAKIASEGIAUoAnQhFCAFKAJwIQcgAw0BIAVBADYCpAEgBUKAgICAEDcCnAEgCSAAEPoDIAUoAuwCIAUoAvACEK4kIAVBADoAmAMgBUGAgICAeDYC7AIgCSAeIA4gDRC+BQ0DIAUoAqABIQMgBSgCpAEhDSAFIBU6AI0EIAVBAToAjAQgBSARNgKIBCAFIBA2AoQEIAUgBjYCgAQgBSAUNgL8AyAFIAc2AvgDIAUgFjYC9AMgBSALNgLwAyAFIAg2AuwDIAUgCjYC6AMgBUKZgICAkAM3AuADIAVCxJOAgMAANwLYAyAFQoGAgICA/QA3AtADIAwgHCADIA0gFxA5IAVBPjYCvAMgBUECNgKkAyAFQfTM3wA2AqADIAVCATcCrAMgBSAMNgK4AyAFIAVBuANqNgKoAyABIBggAigCFBECACAFKALAAyAFKALEAxDWKQ0DIAkQ4hAgBSgCnAEgBSgCoAEQ1ikMAgsgBSgCKCEGIAUoAjQhBwwGCyAFQQA2AtgDIAVCgICAgBA3AtADIAVBAzoAyAEgBUEgNgK4ASAFQQA2AsQBIAVBtMvfADYCwAEgBUEANgKwASAFQQA2AqgBIAUgBUHQA2oiCTYCvAEgDiAFQagBaiIMIA0oAhARAgANByAFKALQAyAFKALYAyEOIAUoAtQDIQMgBSAVOgDlASAFQQE6AOQBIAUgETYC4AEgBSAQNgLcASAFIAY2AtgBIAUgFDYC1AEgBSAHNgLQASAFIBY2AswBIAUgCzYCyAEgBSAINgLEASAFIAo2AsABIAVCmYCAgJADNwK4ASAFQsSTgIDAADcCsAEgBUKBgICAgP0ANwKoASAFQaADaiIQIBkgAyAOIAwQOSAFQT42AsQDIAVBAjYC1AMgBUH0zN8ANgLQAyAFQgE3AtwDIAUgEDYCwAMgBSAFQcADajYC2AMgASAJIAIoAhQRAgAhDiAFKAKgAyAFKAKkAxDWKSADENYpIA4NAwsgBSgChAEgBhDWKSAFKAJsIAcQ1ikgBSkCVCEfDAELCyAFQagBahDiECAFKAKcASAFKAKgARDWKQsgBSgChAEgBhDWKSAFKAJsIAcQ1ikgBSgCKCEGIAUoAjQhB0EBCyEIIAUoAjAgBxDWKSAFKAIkIAYQ1ikMAQsgBSgCMCAHENYpIAUoAiQgBhDWKUEAIQgLIAVBkARqJAAgCA8LQbi94ABBNyAFQaADakHMy98AQby+4AAQxg4AC7UUAhp/An4jAEGQBGsiBCQAAn8CQAJAAkAgAiADKAIwEQUAQf8BcUEBaw4DAgAAAQsgBEGwAWogAEGQAWovAAA7AQAgBCAAKQCIATcDqAFB2AAMAgsgBEGwAWogAEGkAWovAAA7AQAgBCAAKQCcATcDqAFB8AAMAQsgBEGwAWogAEGaAWovAAA7AQAgBCAAKQCSATcDqAFB5AALIQUgBEEgaiIGIARBsAFqLwEAIgk7AQAgBCAEKQOoASIeNwMYIARB3ANqIgogCTsBACAEQQI2AqwBIARB5MzfADYCqAEgBEIBNwK0ASAEQeAANgKkAyAEIAAgBWo2AtADIAQgHjcC1AMgBCAEQaADaiIHNgKwASAEIARB0ANqIgg2AqADIARBJGogBEGoAWoiCxDwFCAKIAYvAQA7AQAgBEECNgKsASAEQeTM3wA2AqgBIARCATcCtAEgBEHhADYCpAMgBCAAQRRqNgLQAyAEIAQpAxg3AtQDIAQgBzYCsAEgBCAINgKgAyAEQTBqIAsQ8BQgACgCBCEOIAAoAgAhCSAALQDyASEUIAAoAuQBIRAgBCgCKCEFIAQoAiwhEiAEKAI0IQYgBCgCOCEMIARBEGogACgCCCAAKAIMELsoIAQoAhQhFSAEKAIQIQogBEEANgLYAyAEQoCAgIAQNwLQAyAEQQM6AMgBIARBIDYCuAEgBEEANgLEASAEQYD/wQA2AsABIARBADYCsAEgBEEANgKoASAEIAg2ArwBAkACQAJAAn8CfwJAIAIgCyADKAIQEQIARQRAIAQoAtADIAQoAtgDIQ8gBCgC1AMhESAEIBQ6AOUBIARBAToA5AEgBCAQQQJrIhNBACAQIBNPGyIQNgLgASAEIAw2AtwBIAQgBjYC2AEgBCASNgLUASAEIAU2AtABIAQgFTYCzAEgBEEBIAogCkEDRhs2AsgBIAQgDjYCxAEgBEEBIAkgCUEDRhs2AsABIARCmYCAgJADNwK4ASAEQsSTgIDAADcCsAEgBEKBgICAgP0ANwKoASAHIAAtAPEBIhggESAPIAsQOSAEQT42AkggBEECNgLUAyAEQfTM3wA2AtADIARCATcC3AMgBCAHNgJEIAQgBEHEAGo2AtgDIAEgCBDGJCEOIAQoAqADIAQoAqQDENYpIBEQ1ilBASAODQMaQQAgAC0A8AFBAUcNAxogBEEIaiACIAMoAkgRAAACfyAEKAIIIgcEQEEAIQMgBCgCDAwBCyAEIAIgAygCGBEAACAEKAIAIgdFDQJBASEDIAQoAgQLIAQgAzYCQK1CIIYhHiAHrSEfIARBPGoMAgsMBQtCACEeIARBQGsLQQM2AgAgBCgCQCICQQNGDQEgAEEQaiEZIAQgAjYCRCAEIB4gH4Q3AkhBASAKIApBA0YbIQpBASAJIAlBA0YbIQkgAEEkaiEaIAAtAPEBIRsgACgCBCEHIARB1ANqIREgBEGkA2ohDiAAKAIUIRwgBEHQAGohEiAEKAI8IQMCQANAIARBAzYCUAJAAkACQAJ/IANBA0YEQCAEQdwAaiAEQcQAahDYCSAEKAJcDAELIAQgBCkCVDcCYCAEIAM2AlwgAwsiAkECRwRAIAQoAmQhDCAEKAJgIQ0gBCgCUCIDQQNGBEAgBEGoAWogBEHEAGoQ2AkgEkEIaiAEQbABaigCADYCACASIAQpAqgBNwIAIAQoAlAhAwsgBCAAQTRByAAgA0ECRiIFG2ooAgA2AmggBEEENgLUAyAEQYTN3wA2AtADIARCAzcC3AMgBEHiADYCvAEgBCAaNgK4ASAEQeIANgK0ASAEIBk2ArABIARB4gA2AqwBIAQgBEGoAWoiCDYC2AMgBCAEQegAajYCqAEgBEH4AGogBEHQA2oiFhDwFCAEQcgDaiAEQYABaigCADYCACAOIAQpAxg3AAAgDkEIaiAEQSBqIgYvAQA7AAAgBCAEKQJ4NwPAAyAEIARBwANqIgs2AqADIARB7ABqIARBoANqIhcQlQ0gBCgCwAMgBCgCxAMQ1ikgBEECNgKsASAEQajN3wA2AqgBIARCATcCtAEgBEHiADYCxAMgBEEgIBwgBRs2ApwBIAQgCzYCsAEgBCAEQZwBaiIdNgLAAyAEQZABaiAIEPAUIARBqANqIARBmAFqKAIANgIAIBEgBCkDGDcAACARQQhqIAYvAQA7AAAgBCAEKQKQATcDoAMgBCAXNgLQAyAEQYQBaiAWEJUNIAQoAqADIAQoAqQDENYpIAQoAowBIQ8gBCgCiAEhBSAEKAJ0IRMgBCgCcCEGIAINASAEQQA2AqQBIARCgICAgBA3ApwBIAggABD6AyAEKALsAiAEKALwAhCuJCAEQQA6AJgDIARBgICAgHg2AuwCIAggHSANIAwQvgUNAyAEKAKgASECIAQoAqQBIQwgBCAUOgCNBCAEQQE6AIwEIAQgEDYCiAQgBCAPNgKEBCAEIAU2AoAEIAQgEzYC/AMgBCAGNgL4AyAEIBU2AvQDIAQgCjYC8AMgBCAHNgLsAyAEIAk2AugDIARCmYCAgJADNwLgAyAEQsSTgIDAADcC2AMgBEKBgICAgP0ANwLQAyALIBsgAiAMIBYQOSAEQT42ArwDIARBAjYCpAMgBEH0zN8ANgKgAyAEQgE3AqwDIAQgCzYCuAMgBCAEQbgDajYCqAMgASAXEMYkIAQoAsADIAQoAsQDENYpDQMgCBCQFiAEKAKcASAEKAKgARDWKQwCCyAEKAIoIQUgBCgCNCEGDAYLIARBADYC2AMgBEKAgICAEDcC0AMgBEEDOgDIASAEQSA2ArgBIARBADYCxAEgBEGA/8EANgLAASAEQQA2ArABIARBADYCqAEgBCAEQdADaiIINgK8ASANIARBqAFqIgsgDCgCEBECAA0HIAQoAtADIAQoAtgDIQ0gBCgC1AMhAiAEIBQ6AOUBIARBAToA5AEgBCAQNgLgASAEIA82AtwBIAQgBTYC2AEgBCATNgLUASAEIAY2AtABIAQgFTYCzAEgBCAKNgLIASAEIAc2AsQBIAQgCTYCwAEgBEKZgICAkAM3ArgBIARCxJOAgMAANwKwASAEQoGAgICA/QA3AqgBIARBoANqIg8gGCACIA0gCxA5IARBPjYCxAMgBEECNgLUAyAEQfTM3wA2AtADIARCATcC3AMgBCAPNgLAAyAEIARBwANqNgLYAyABIAgQxiQhDSAEKAKgAyAEKAKkAxDWKSACENYpIA0NAwsgBCgChAEgBRDWKSAEKAJsIAYQ1ikMAQsLIARBqAFqEJAWIAQoApwBIAQoAqABENYpCyAEKAKEASAFENYpIAQoAmwgBhDWKSAEKAIoIQUgBCgCNCEGQQELIQcgBCgCMCAGENYpIAQoAiQgBRDWKQwBCyAEKAIwIAYQ1ikgBCgCJCAFENYpQQAhBwsgBEGQBGokACAHDwtBuL3gAEE3IARBoANqQZj/wQBBvL7gABDGDgALyhMCDX8BfiMAQYACayINJAAgDSAEOgA3IA0gAjYCMCANIAY6ADggDSAIOgA5IA0gCToAOiANIAo6ADsgDSALOgA8IA0gDDoAPQJAAkACQAJAAkAgBRD3FUUEQCAFKAIAQQVHDQECQCAKRQRAIAsNAQwDCyANQShqIAUQqxMgDSgCLCECIA0oAighBEHctOAAQQcQ1BohGiANQeEAOgCAASANIBo3A4gBIAEgBCACIA1BgAFqENAZIA0tADxBAXFFDQILIA1BIGogBRCrEyANKAIkIQIgDSgCICEEQcO24ABBCBDUGiEaIA1B4QA6AIABIA0gGjcDiAEgASAEIAIgDUGAAWoQ0BkMAQsgDSAFEKsTIA0oAgQhAiANKAIAIA1B3wA6AIABIAIgDUGAAWoQ/RQhAgJAIAFBKGoQ5w0iBEUNACAEKAIAQSRHDQAgASABKQNANwN4IAEoAiggAUElNgIoQSRHBEBB3evgAEEoQeT23wAQ7hcACyABIAEoAiwQhgwLIABBDTYCACAAIAI2AgQMAQsgAUEoaiECAkACQCABLQD4AkECRgRAIA0tADlBAUcNAQsgDUEAOgA+DAELAkAgAhDnDSIEBEAgBCgCAEEIRg0BCyANQQA6AD4MAQsgASgCKCEEIAFBJTYCKCABIAEpA0A3A3ggDUGMAWogAUE0aikCADcCACANQZQBaiABQTxqKAIANgIAIA0gASkCLDcChAEgDSAENgKAASANQYABahDDCiANQQE6AD4LIA1BGGogARDzDyANKAIcIQogDSgCGEUEQCANQQE6AEUgDUEBOgBRIA0gAS0AkwM6AFAgDSABKAGCAzYAPyANIAEvAYYDOwBDIA0gASkAiQM3AEYgDSABLwCRAzsATiANIAEpAJUDNwBSIA0gAS8AnQM7AFogDUH1AGogAUGXA2opAAA3AAAgDUHwAGogAUGSA2opAQA3AgAgDUHoAGogAUGKA2opAQA3AgAgDSABKQGCAzcCYCABQYABaiANQT9qEMgIIA0gATYCXCANQYgBaiAFQQhqKQMANwMAIA1BkAFqIAVBEGopAwA3AwAgDUGYAWogBUEYaikDADcDACANQagBaiADQQhqKAIANgIAIA0gBzYCrAEgDSAKNgLUASANIAUpAwA3A4ABIA0gAykCADcDoAEgDSANQTBqNgKwASANIA1BOGo2ArQBIA0gDUE7ajYC0AEgDSANQTpqNgLMASANIA1BOWo2AsgBIA0gDUE+ajYCxAEgDSANQT1qNgLAASANIA1BPGo2ArwBIA0gDUE3ajYCuAFBACEFIAIQ5w0iBEUNAiAEKAIAQRVHDQIgBC0ABA0CAkAgAhDnDSIERQRAIAEoAtgCIQEgDUEAOgDYASABIAEgDUHYAWoQ/RQhBQwBCyAEKAIAQSRGBEAgASABKQNANwN4IAEoAiggAUElNgIoQSRGBEAgASgCLCEFDAILQd3r4ABBKEH09t8AEO4XAAsgASgCKCEEIAFBJTYCKCABIAEpA0A3A3ggDUHkAWogAUE0aikCADcCACANQewBaiABQTxqKAIANgIAIA0gASkCLDcC3AEgDSAENgLYASANQdgBahDDCiANQRBqIAEQrQYgDSgCFCEFIA0oAhBFDQMLIA1BoAFqIA1B1AFqIABBDTYCACAAIAU2AgQCQCANKAKAAUEFRgRAIA0pA4gBEPEaDAELIA1BgAFqEN4WCxCPKBDsJgwDCyAAQQ02AgAgACAKNgIECyAFELchIAMQ7CYMAgsCQCACEOcNIgRFDQACQAJAIAQoAgBBDmsOAgIAAQsgASgCKCECIAFBJTYCKCABIAEpA0A3A3ggDUHkAWogAUE0aikCADcCACANQewBaiABQTxqKAIANgIAIA0gASkCLDcC3AEgDSACNgLYASANQdgBahDDCgwBCyACELIhDQAgDUEIaiACELMUIA0oAgwhAiANKAIIIQQgDUH1ADoA2AEgASAEIAIgDUHYAWoQ0BkLIAcoAgBFBEACfwJAAkACQAJAIA0oAoABQQVGBEBBAyEEQQghCCANQYgBaiEDIA0oApQBIQsgDS0AN0EDRw0BDAQLIA0oAjAiAiABKAJ8IgMgAiADSRshBiACIAMgAiADSxshAiANLQA8IQMgDSgCnAEhDiANKAKYASEHIA0oApQBIQwgDSgCkAEhCSANKAKMASELIAVFDQIgA0EBcQ0BDAILIAEoAnwhAiANKAIwIQQgDUG1AToA2AEgASAEIAIgAiAESxsiAiALIAIgC0kbIAIgCyACIAtLGyANQdgBahDQGSANLQA3IQQMAgsgDUGiAToA2AEgASAGIAIgDUHYAWoQ0BkgDS0APCEDCyANQeQBaiANQYgBaigCADYCACANIA0pA4ABNwLcASAFQRB2IRJBByEIIA0tAD4hEyANLQA7IRQgDS0AOiEVIA0tAD0hFiANLQA5IRcgDS0ANyEYIA0tAKsBIQ8gDS0AqgEhECANLQCpASERIA0tAKgBIQQgDSkDoAEhGiANLQA4IRkgBUEIdgwBCyANQeQBaiADQQhqKAIANgIAIA0gAykCADcC3AEgDSgCMCIDIAEoAnwiASABIANLGyEJIAMgASABIANJGyEMQQAhByANLQA9IQ8gDS0AOSEQIA0pAqQBIRogDSgCoAEhAiANLQA4IREgCiEGIAUhDiANLQA6IQUgDS0APgshASAAIAg2AgAgACANKQLYATcCBCAAIBg6AEsgACATOgBKIAAgFDoASSAAIBU6AEggACAWOgBHIAAgFzoARiAAIAM6AEUgACAZOgBEIAAgCjYCQCAAIBI7AT4gACABOgA9IAAgBToAPCAAIA86ADsgACAQOgA6IAAgEToAOSAAIAQ6ADggACAaNwMwIAAgAjYCLCAAIAY2AiggACAONgIkIAAgBzYCICAAIAw2AhwgACAJNgIYIAAgCzYCFCAAQQxqIA1B4AFqKQIANwIADAELIAAgAykCADcCMCAAQThqIANBCGooAgA2AgAgDUHkAWogDUGIAWopAwA3AgAgDUHsAWogDUGQAWopAwA3AgAgDUH0AWogDUGYAWopAwA3AgAgDSANKQOAATcC3AEgASgCfCEBIA0oAjAhAiANLQA4IQMgDS0APCEEIA0tAD0hBiANLQA+IQcgDS0ANyEIIABBDDYCACAAQQRqIA1B2AFqQSQQ/AYaIAAgCDoASCAAIAc6AEcgACAGOgBGIAAgBDoARSAAIAM6AEQgACAKNgJAIAAgBTYCPCAAIAIgASABIAJJGzYCLCAAIAIgASABIAJLGzYCKAsgDUHcAGoQoCYLIA1BgAJqJAAL6RMCDX8BfiMAQYACayINJAAgDSAEOgA3IA0gAjYCMCANIAY6ADggDSAIOgA5IA0gCToAOiANIAo6ADsgDSALOgA8IA0gDDoAPQJAAkACQAJAAkAgBRD3FUUEQCAFKAIAQQVHDQECQCAKRQRAIAsNAQwDCyANQShqIAUQqRMgDSgCLCECIA0oAighBEHctOAAQQcQ1BohGiANQeEAOgCAASANIBo3A4gBIAEgBCACIA1BgAFqEL4ZIA0tADxBAXFFDQILIA1BIGogBRCpEyANKAIkIQIgDSgCICEEQcO24ABBCBDUGiEaIA1B4QA6AIABIA0gGjcDiAEgASAEIAIgDUGAAWoQvhkMAQsgDSAFEKkTIA0oAgQhAiANKAIAIA1B3wA6AIABIAIgDUGAAWoQ/RQhAgJAIAFBKGoQzQ0iBEUNACAEKAIAQSRHDQAgASABKQPgAjcDmAMgASgCyAIgAUElNgLIAkEkRwRAQd3r4ABBKEHk9t8AEO4XAAsgASABKALMAhD/CwsgAEENNgIAIAAgAjYCBAwBCyABQShqIQICQAJAIAEtAKACQQJGBEAgDS0AOUEBRw0BCyANQQA6AD4MAQsCQCACEM0NIgQEQCAEKAIAQQhGDQELIA1BADoAPgwBCyABKALIAiEEIAFBJTYCyAIgASABKQPgAjcDmAMgDUGMAWogAUHUAmopAgA3AgAgDUGUAWogAUHcAmooAgA2AgAgDSABKQLMAjcChAEgDSAENgKAASANQYABahDCCiANQQE6AD4LIA1BGGogARDvDyANKAIcIQsgDSgCGEUEQCANQQE6AEUgDUEBOgBRIA0gAS0AuwI6AFAgDSABKAGqAjYAPyANIAEvAa4COwBDIA0gASkAsQI3AEYgDSABLwC5AjsATiANIAEpAL0CNwBSIA0gAS8AxQI7AFogDUH1AGogAUG/AmopAAA3AAAgDUHwAGogAUG6AmopAQA3AgAgDUHoAGogAUGyAmopAQA3AgAgDSABKQGqAjcCYCACIA1BP2oQ0AggDSABNgJcIA1BiAFqIAVBCGopAwA3AwAgDUGQAWogBUEQaikDADcDACANQZgBaiAFQRhqKQMANwMAIA1BqAFqIANBCGooAgA2AgAgDSAHNgKsASANIAs2AtQBIA0gBSkDADcDgAEgDSADKQIANwOgASANIA1BMGo2ArABIA0gDUE4ajYCtAEgDSANQTtqNgLQASANIA1BOmo2AswBIA0gDUE5ajYCyAEgDSANQT5qNgLEASANIA1BPWo2AsABIA0gDUE8ajYCvAEgDSANQTdqNgK4AUEAIQUgAhDNDSIERQ0CIAQoAgBBFUcNAiAELQAEDQICQCACEM0NIgRFBEAgASgCgAIhASANQQA6ANgBIAEgASANQdgBahD9FCEFDAELIAQoAgBBJEYEQCABIAEpA+ACNwOYAyABKALIAiABQSU2AsgCQSRGBEAgASgCzAIhBQwCC0Hd6+AAQShB9PbfABDuFwALIAEoAsgCIQQgAUElNgLIAiABIAEpA+ACNwOYAyANQeQBaiABQdQCaikCADcCACANQewBaiABQdwCaigCADYCACANIAEpAswCNwLcASANIAQ2AtgBIA1B2AFqEMIKIA1BEGogARC4BiANKAIUIQUgDSgCEEUNAwsgDUGgAWogDUHUAWogAEENNgIAIAAgBTYCBAJAIA0oAoABQQVGBEAgDSkDiAEQ8RoMAQsgDUGAAWoQmxYLEPkmEOwmDAMLIABBDTYCACAAIAs2AgQLIAUQhSEgAxDsJgwCCwJAIAIQzQ0iBEUNAAJAAkAgBCgCAEEOaw4CAgABCyABKALIAiECIAFBJTYCyAIgASABKQPgAjcDmAMgDUHkAWogAUHUAmopAgA3AgAgDUHsAWogAUHcAmooAgA2AgAgDSABKQLMAjcC3AEgDSACNgLYASANQdgBahDCCgwBCyACEIAhDQAgDUEIaiACEIAUIA0oAgwhAiANKAIIIQQgDUH1ADoA2AEgASAEIAIgDUHYAWoQvhkLIAcoAgBFBEACfwJAAkACQAJAIA0oAoABQQVGBEBBAyEEQQghCCANQYgBaiEDIA0oApQBIQogDS0AN0EDRw0BDAQLIA0oAjAiAiABKAKcAyIDIAIgA0kbIQYgAiADIAIgA0sbIQIgDS0APCEDIA0oApwBIQ4gDSgCmAEhByANKAKUASEMIA0oApABIQkgDSgCjAEhCiAFRQ0CIANBAXENAQwCCyABKAKcAyECIA0oAjAhBCANQbUBOgDYASABIAQgAiACIARLGyICIAogAiAKSRsgAiAKIAIgCksbIA1B2AFqEL4ZIA0tADchBAwCCyANQaIBOgDYASABIAYgAiANQdgBahC+GSANLQA8IQMLIA1B5AFqIA1BiAFqKAIANgIAIA0gDSkDgAE3AtwBIAVBEHYhEkEHIQggDS0APiETIA0tADshFCANLQA6IRUgDS0APSEWIA0tADkhFyANLQA3IRggDS0AqwEhDyANLQCqASEQIA0tAKkBIREgDS0AqAEhBCANKQOgASEaIA0tADghGSAFQQh2DAELIA1B5AFqIANBCGooAgA2AgAgDSADKQIANwLcASANKAIwIgMgASgCnAMiASABIANLGyEJIAMgASABIANJGyEMQQAhByANLQA9IQ8gDS0AOSEQIA0pAqQBIRogDSgCoAEhAiANLQA4IREgBSEOIAshBiANLQA6IQUgDS0APgshASAAIAg2AgAgACANKQLYATcCBCAAIBg6AEsgACATOgBKIAAgFDoASSAAIBU6AEggACAWOgBHIAAgFzoARiAAIAM6AEUgACAZOgBEIAAgCzYCQCAAIBI7AT4gACABOgA9IAAgBToAPCAAIA86ADsgACAQOgA6IAAgEToAOSAAIAQ6ADggACAaNwMwIAAgAjYCLCAAIAY2AiggACAONgIkIAAgBzYCICAAIAw2AhwgACAJNgIYIAAgCjYCFCAAQQxqIA1B4AFqKQIANwIADAELIAAgAykCADcCMCAAQThqIANBCGooAgA2AgAgDUHkAWogDUGIAWopAwA3AgAgDUHsAWogDUGQAWopAwA3AgAgDUH0AWogDUGYAWopAwA3AgAgDSANKQOAATcC3AEgASgCnAMhASANKAIwIQIgDS0AOCEDIA0tADwhBCANLQA9IQYgDS0APiEHIA0tADchCCAAQQw2AgAgAEEEaiANQdgBakEkEPwGGiAAIAg6AEggACAHOgBHIAAgBjoARiAAIAQ6AEUgACADOgBEIAAgCzYCQCAAIAU2AjwgACACIAEgASACSRs2AiwgACACIAEgASACSxs2AigLIA1B3ABqEIQlCyANQYACaiQAC68TAgZ/AX4jAEHwAWsiAiQAAn8gAC0ADCIFIAEoAgAiA0EZRg0AGiAFIANBI0YNABogAEEAOgAMQQALIQQCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkBBByADQQxrIgYgBkEmTxtBAWsOJAABHQIDBAUGBwgJCgsdHQwNDg8QHRESEx0dFBUWFxgZGhsdHB0LIAEoAgxBBHQh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ADcDACACIAUpAgA3A3ggBCACKAKEASIEIAIoAnwiA2tBAnZqIQUDQCADIARGRQRAIAAgAygCADYCACAAQQRqIQAgA0EEaiEDDAELCyACIAU2AuwBIAIgAzYCfCACQfgAahDcFyACKQLoASEIIAIoAuQBIQBBGQwDCyACQQA2AogBIAJBATYCfCACQYjK3wA2AnggAkIENwKAASACQfgAakGAy98AELodAAsgAkEANgKIASACQQE2AnwgAkGIyt8ANgJ4IAJCBDcCgAEgAkH4AGpB8MrfABC6HQALIAJB4AFqIgAgBjYCACACIAM2ArwBIAJBuAFqENwXIAVBCGogACgCADYCACAFIAIpAtgBNwIAIAJCADcDiAEgAkENNgJ4IAJB+ABqENgoIQQgAkHEAWpCADcCACACQcwBakIANwIAIAJCADcCvAEgAkGMAWogAkHAAWopAgA3AgAgAkGUAWogAkHIAWopAgA3AgAgAkGcAWogAkHQAWooAgA2AgAgAkEDNgKAASACQRs2AnggAiACKQK4ATcChAEgAkH4AGoQ2CitQiCGQgKEIQhBFAshAyABEOYCIAEgBDYCKCABQgA3AyAgAUIANwMQIAEgCDcDCCABIAA2AgQgASADNgIACyACQfABaiQADwsAC98TAhN/A34jAEHABGsiBCQAIARBLGogARDLFSAEQdAAaiIGIAQoAiwiBUE8aiIBEL8QIARBADoA4AIgBEEANgLkAyAEQeACaiIPIAYQqBgtAAAQsQ4gBEHYAWoiBiAPQYgBEPwGGiABELsgIAEgBkGIARD8BiETIAVBKGoiBxC6ICEQAkACQAJAAkACQAJAAkAgBxDNDSIBRQ0AIAEoAgBBFEcNACABLQAEQQRGDQELIAcQzQ0iAUUNASABKAIAQSFHDQELIAUoAsgCIQEgBUElNgLIAiAFIAUpA+ACNwOYAyAEQewCaiAFQdQCaikCADcCACAEQfQCaiAFQdwCaigCADYCACAEIAUpAswCNwLkAiAEIAE2AuACIARB4AJqIgEQwgogBEEANgL8AyAEQoCAgICAATcC9AMgBUHMAmohCiABQQRyIQtBCCEPA0ACQCAEQeACaiAFQQQQ0QgCQAJAIAQtAOACDQAgBC0A4QINBSAHELogGkEAIRQgBxC6ICERQQAhBkEAIQ0DQCAEQeACaiISIAVB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IAMoAlQhASADKAJQIQIMAQsgA0GIEmogA0HmAGovAQA7AQAgAyADKQFeNwOAEiADLQBdIQYgAy0AXCEEIAMoAlghBSADKAJUIQEgAygCUCECIANBmA9qEO8XCyACQQNGDQEgA0EDOgDhAwwCCyADLQCtBCEGIANBmA9qEO8XCyADIAQ6AOADIAMgBTYC3AMgAyABNgLYAyADIAMvAYASOwHiAyADIAY6AOEDIAZB/wFxQQNGDQAgACADKQLYAzcCBCAAQYaAgIB4NgIAIABBDGogA0HgA2ooAgA2AgAMAQsgA0HYA2oQ1SQgAEGHgICAeDYCAAsgA0GQEmokAAulEQEIfyMAQfAAayIDJAACQAJAAkACQAJAAkACQANAAkACQAJAAkACQCACKAIAQQFrDgcBBgACAwgEAAsgA0EBOgBUIANBADYCUCADQoCAgIAQNwJIIAAgA0HIAGoQ6RkMCwsgAigCBCEEIANBCGogAigCCCICQQFBARD5FCADKAIIIQYgAygCDCAEIAIQ/AYhBCADQQE6AFQgAyACNgJQIAMgBDYCTCADIAY2AkggA0EoaiICIANByABqEOkZIAEoAgggAS0AECACEPYgIABBCGogA0EwaigCADYCACAAIAMpAig3AgAMCgsgA0EcaiABIAIoAgwQlwEgAigCBCEGIAIoAhAiBEUEQCACLQAUAkAgBgRAIAIoAghBAUYNAQsgA0EcahDBFwtBACECIANBADYCUCADQoCAgIAQNwJIIANBAToAVCADQShqIANByABqEOkZQQFxDQUDQCACQQxGDQYgA0EcaiACaiIEKAIAIQYgBCADQShqIAJqIgQoAgA2AgAgBCAGNgIAIAJBBGohAgwACwALIAQgASgCBCIHIAQgB0kbIQUCQCAGRQ0AIAQgAigCCEcNACADQQE6AFQgA0EANgJQIANCgICAgBA3AkggA0E8aiADQcgAahDpGQNAAkAgBUUNACADQTxqIgYQ+A8NACADQTBqIANBxABqKAIANgIAIAMgAykCPDcDKCADQcgAaiICIANBHGoQyQkgBiABIANBKGogAhD2ASAFQQFrIQUgAhDOJAwBCwsgBCAHTQ0JIANBPGoQwRcMCQsgA0EBOgBUIANBADYCUCADQoCAgIAQNwJIIANBPGogA0HIAGoQ6RkDQCAFRQ0IIANBPGoiBBD4Dw0IIANBMGogA0HEAGooAgA2AgAgAyADKQI8NwMoIANByABqIgIgA0EcahDJCSAEIAEgA0EoaiACEPYBIAVBAWshBSACEM4kDAALAAsgAigCBCECDAELCyACKAIMQRxsIQUgAS0AECEIIAEoAgwhCiACKAIIIQdBBCEEQQAhAgNAIAVFIAJBgICAgHhGckUEQCADIAY2AjAgAyAENgIsIAMgAjYCKCADQcgAaiIJIAEgBxCXASADQTxqIAogCCADQShqIAkQhgYgBUEcayEFIAdBHGohByADKAI8IQIgAygCQCEEIAMoAkQhBiAJEM4kDAELCyAAIAY2AgggACAENgIEIAAgAjYCAAwGCyACKAIEDQIgAigCDCIEIAIoAhBBA3QiBWohCCABKAIAIQYgBCECAkADQCAFBEAgBiAHSQ0CIAVBCGshBSACKAIEIAIoAgBrIAdqQQFqIQcgAkEIaiECDAELCyAGIAdJDQAgA0EANgIkIANCgICAgMAANwIcA0AgBCAIRgRAIAEoAgggAS0AECADQRxqEPYgIABBCGogA0EkaigCADYCACAAIAMpAhw3AgAMCAUgBEEIaiAEKAIEIQcgBCgCACECQQAhBQJAA0AgBUEBcSACIAdLcg0BIANBADYCOCADQRBqIAIgA0E4ahDhCSADKAIUIQQgAygCECADQQA2AkQgA0KAgICAEDcCPCADQQM6AGggA0EgNgJYIANBADYCZCADQYy1xAA2AmAgA0EANgJQIANBADYCSCADIANBPGo2AlwgBCADQcgAahDxKkUEQCADQTBqIANBxABqKAIANgIAIAMgAykCPDcDKCADQQE6ADQgAkGAwAMgAkEBaiACQf+vA0YbIAIgB08iBRshAiADQRxqIANBKGoQiA8MAQsLQbi94ABBNyADQShqQaS1xABBvL7gABDGDgALIQQMAQsACwALIABBgICAgHg2AgAMBQsgA0HQAGogA0EkaigCADYCACADIAMpAhw3A0ggACABKAIMIAEtABAgA0HIAGogA0EoaiIAEIYGIAAQziQMBAsgAigCDCEEIAIoAgghBSABLQAQRQRAIANBAToAVCADQQA2AlAgA0KAgICAEDcCSCAEQRxsIQIgA0E8aiADQcgAahDpGQNAAkAgAkUNACADQTxqIgYQ+A8NACADQTBqIANBxABqKAIANgIAIAMgAykCPDcDKCADQcgAaiIEIAEgBRCXASAGIAEgA0EoaiAEEPYBIAJBHGshAiAFQRxqIQUgBBDOJAwBCwsgACADKQI8NwIAIABBCGogA0HEAGooAgA2AgAMBAsgA0EBOgBUIANBADYCUCADQoCAgIAQNwJIIARBHGwhAiAFQRxrIQQgA0E8aiADQcgAahDpGQNAAkAgAkUNACADQTxqIgUQ+A8NACADQTBqIANBxABqKAIANgIAIAMgAykCPDcDKCADQcgAaiIGIAEgAiAEahCXASAFIAEgA0EoaiAGEPYBIAJBHGshAiAGEM4kDAELCyAAIAMpAjw3AgAgAEEIaiADQcQAaigCADYCAAwDCyACKAIMIgYgAigCEEEBdCIFaiEIIAEoAgAhBCAGIQICQAJAAkADQCAFBEAgBCAHSQ0CIAItAAEiCiACLQAAIglJDQQgAkECaiECIAVBAmshBSAKIAlrQf8BcSAHakEBaiEHDAELCyAEIAdJDQAgA0EANgIwIANCgICAgMAANwIoDAELIABBgICAgHg2AgAMBAsDQCAGIAhGBEAgASgCCCABLQAQIANBKGoQ9iAgAEEIaiADQTBqKAIANgIAIAAgAykCKDcCAAwFBSAGLQABIQUgBi0AACECQQAhBANAAkAgBEEBcQ0AIAUgAkH/AXEiB0kNAEEBQQEQoSAiBCACOgAAIANBAToAVCADQQE2AlAgAyAENgJMIANBATYCSCAFIAdNIQQgAiAFIAdLaiECIANBKGogA0HIAGoQiA8MAQsLIAZBAmohBgwBCwALAAtBzLLEABDaKQALIANBPGoQwRcLIAAgAykCPDcCACAAQQhqIANBxABqKAIANgIAIANBHGoQziQLIANB8ABqJAAL7RICDH8BfiMAQbABayICJAAgAkEANgJIQQEhBSACQQE2AjwgAkHwkMAANgI4IAJCBDcCQAJAIAEoAhQgASgCGCACQThqEK0kDQAgACgCBCEDIAIgACgCCCIMNgIwIAJBADYCLCACIAM2AiQgAiADIAxBFGxqNgIoIAJBhAFqIQggACgC3AIhCiAAKALYAiENIAEoAhghAyABKAIUIQQgACgC1AIhCwNAIAJBGGogAkEkahCTEyACKAIcIgZFBEAgAkECNgI8IAJBjKPAADYCOCACQgE3AkQgAkEONgKUASACIABB4AJq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AnggBUEBayEFIAIgAkGQAWo2AkAgAiACQfgAajYCkAEgBCADIAJBOGoQrSRFDQALDAQLIAJBADYCSCACQQE2AjwgAkGYxcMANgI4IAJCBDcCQCAEIAMgAkE4ahCtJA0DCyAHIAVB/wFxRwRAIAIgBToAqwEgAiAHOgA0IAJBAzYClAEgAkHYxsMANgKQASACQgM3ApwBIAJBEDYCTCACQRE2AkQgAkERNgI8IAIgCTYCrAEgAiACQThqNgKYASACIAJBrAFqNgJIIAIgAkE0ajYCQCACIAJBqwFqNgI4IAQgAyACQZABahCtJEUNAgwDCyACIAU6ADQgAkECNgI8IAJBpMXDADYCOCACQgI3AkQgAkEQNgKcASACQRE2ApQBIAIgCTYCrAEgAiACQZABajYCQCACIAJBrAFqNgKYASACIAJBNGo2ApABIAQgAyACQThqEK0kRQ0BDAILIAIgDjcCfCACQQE2AngMAAsACwtBASEFCyACQbABaiQAIAULsBMBAn8jAEFAaiICJAACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkBBECAAKAIAQQJrIgMgA0EjTxtBAWsOIgECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIACyACIABBCGo2AgwgAkEBNgIsIAJB/PbgADYCKCACQgE3AjQgAkGABTYCHCACIAJBGGo2AjAgAiACQQxqNgIYIAEoAhQgASgCGCACQShqEK0kDCILIAJBADYCOCACQQE2AiwgAkH0idoANgIoIAJCBDcCMCABKAIUIAEoAhggAkEoahCtJAwhCyACQQA2AjggAkEBNgIsIAJB/InaADYCKCACQgQ3AjAgASgCFCABKAIYIAJBKGoQrSQMIAsgAkEANgI4IAJBATYCLCACQYSK2gA2AiggAkIENwIwIAEoAhQgASgCGCACQShqEK0kDB8LIAJBADYCOCACQQE2AiwgAkGMitoANgIoIAJCBDcCMCABKAIUIAEoAhggAkEoahCtJAweCyACQQA2AjggAkEBNgIsIAJBlIraADYCKCACQgQ3AjAgASgCFCABKAIYIAJBKGoQrSQMHQsgAkEANgI4IAJBATYCLCACQZyK2gA2AiggAkIENwIwIAEoAhQgASgCGCACQShqEK0kDBwLIAJBADYCOCACQQE2AiwgAkGkitoANgIoIAJCBDcCMCABKAIUIAEoAhggAkEoahCtJAwbCyACQQA2AjggAkEBNgIsIAJBrIraADYCKCACQgQ3AjAgASgCFCABKAIYIAJBKGoQrSQMGgsgAkEANgI4IAJBATYCLCACQbSK2gA2AiggAkIENwIwIAEoAhQgASgCGCACQShqEK0kDBkLIAJBADYCOCACQQE2AiwgAkG8itoANgIoIAJCBDcCMCABKAIUIAEoAhggAkEoahCtJAwYCyACQQA2AjggAkEBNgIsIAJBxIraADYCKCACQgQ3AjAgASgCFCABKAIYIAJBKGoQrSQMFwsgAkEANgI4IAJBATYCLCACQcyK2gA2AiggAkIENwIwIAEoAhQgASgCGCACQShqEK0kDBYLIAJBADYCOCACQQE2AiwgAkHUitoANgIoIAJCBDcCMCABKAIUIAEoAhggAkEoahCtJAwVCyACQQA2AjggAkEBNgIsIAJB3IraADYCKCACQgQ3AjAgASgCFCABKAIYIAJBKGoQrSQMFAsgAkEANgI4IAJBATYCLCACQeSK2gA2AiggAkIENwIwIAEoAhQgASgCGCACQShqEK0kDBMLIAIgAEEQajYCDCACQQI2AiwgAkH8itoANgIoIAJCATcCNCACQeEENgIcIAIgAkEYajYCMCACIAJBDGo2AhggASgCFCABKAIYIAJBKGoQrSQMEgsgAkEANgI4IAJBATYCLCACQYyL2gA2AiggAkIENwIwIAEoAhQgASgCGCACQShqEK0kDBELIAJBATYCLCACQfz24AA2AiggAkIBNwI0IAJBBTYCECACIAAtAARBAnQiAEGY7OMAaigCADYCHCACIABB9OzjAGooAgA2AhggAiACQQxqNgIwIAIgAkEYajYCDCABKAIUIAEoAhggAkEoahCtJAwQCyACQQE2AiwgAkH89uAANgIoIAJCATcCNCACQQU2AhAgAiAALQAEQQJ0IgBB0O3jAGooAgA2AhwgAiAAQZDu4wBqKAIANgIYIAIgAkEMajYCMCACIAJBGGo2AgwgASgCFCABKAIYIAJBKGoQrSQMDwsgAkEANgI4IAJBATYCLCACQZSL2gA2AiggAkIENwIwIAEoAhQgASgCGCACQShqEK0k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QAJAAkACQAJAIAMoAhhFBEACQAJAAkAgBRDNDSICBEAgAigCAEEJRg0BCyADQagEaiAFEJIQIANBqOXfADYCpAQgA0E0OgCgBCADQeADaiADQagDaiADKAKQA0ElRiICGygCACIBIANB5ANqIANBrANqIAIbKAIAIgIgASACSRsgASACIAEgAksbIANBoARqEP0UIQEgBRDNDSICRQ0MIAIoAgBBJEYNAQwMCyADQawEaiADQZwDaikCADcCACADQbQEaiADQaQDaigCADYCACADKAKQAyECIANBJTYCkAMgAyADKQKUAzcCpAQgAyACNgKgBCADIAMpA6gDNwPgAyADQaAEaiICEMIKIAIgA0HIAGoQswEgAygCpAQhBCADKAKgBCIJQYCAgIB4RwRAIAFBqgJqIQogA0GUA2ohBiADKAKoBCECIAMgBDYC8AcgAyAEIAJBBnQiD2oiEDYC/AcgAyAJNgL4ByAJQQZ0IQsgA0HQBGohEUEAIQIDQCAEIAhqIQ0gAiAPRkUEQCADQYAIaiISIAIgBGoiE0HAABD8BhogA0GgBGogE0HAABD8BhogERDsJiANIBJBKBD8BhogCEEoaiEIIAJBQGshAgwBCwsgAyAQNgL0ByALQShuIQggA0HwB2oQmBIgBCECAkAgCUUNACALIAhBKGwiCUYNACALRQRAQQghAgwBCyAEIAtBCCAJEPkCIgJFDQYLIAMgAjYC6AcgAyAINgLkByADIA0gBGtBKG42AuwHIANB8AdqEM8XAkACQCAFEM0NIgIEQCACKAIAQQpGDQELIANBqARqIAUQkhAgA0GA5d8ANgKkBCADQTQ6AKAEIANB4ANqIANBqANqIAMoApADQSVGIgIbKAIAIgEgA0HkA2ogA0GsA2ogAhsoAgAiAiABIAJJGyABIAIgASACSxsgA0GgBGoQ/RQhASAFEM0NIgJFDQwgAigCAEEkRg0BDAwLIANBrARqIAZBCGopAgA3AgAgA0G0BGogBkEQaigCADYCACADKAKQAyECIANBJTYCkAMgAyACNgKgBCADIAMpA6gDNwPgAyADIAYpAgA3AqQEIANBoARqEMIKQQAhAgJAAkAgBRDNDSIERQ0AIAQoAgBBE0cNACADQRBqIANByABqQdjf3wAQ8QEgAygCFCECIAMoAhANAQsgAyACNgKACCAFEM0NIgQEQCAEKAIAQQNGDQULIANBqARqIAUQkhAgA0GY8t8ANgKkBCADQTQ6AKAEIANB4ANqIANBqANqIAMoApADQSVGIgIbKAIAIgEgA0HkA2ogA0GsA2ogAhsoAgAiAiABIAJJGyABIAIgASACSxsgA0GgBGoQ/RQhASAFEM0NIgJFDQsgAigCAEEkRw0LIAMgAykDqAM3A+ADIAMoApADIANBJTYCkANBJEcNCCADQcgAaiADKAKUAxD/CwwLCyADQYGAgIB4NgKIBCADIAI2AowEDAwLIAMgAykDqAM3A+ADIAMoApADIANBJTYCkANBJEcNByADQcgAaiADKAKUAxD/CwwKCyADIAQ2AowEIANBgYCAgHg2AogEDAwLIAMgAykDqAM3A+ADIAMoApADIANBJTYCkANBJEcNBiADQcgAaiADKAKUAxD/CwwKCyADQawEaiAGQQhqKQIANwIAIANBtARqIAZBEGooAgA2AgAgAygCkAMhBCADQSU2ApADIAMgBDYCoAQgAyADKQOoAzcD4AMgAyAGKQIANwKkBCADQaAEahDCCiADQZAEaiADQewHaigCADYCACADIAI2ApgEIAMgBzYClAQgAyADKQLkByIUNwOIBCAUpyIEQYCAgIB4aw4CDAsBCyADQYGAgIB4NgKIBCADIAc2AowEDAoLIAMpAowEIRQgA0GgBGoiBiADQcgAakGgAxD8BhogARDeECABIAZBoAMQ/AYhASADIA46AMcHIAMgASkAqwI3AMgHIAMgASkAswI3ANAHIAMgASkAuwI3ANgHIAMgASgAwwI2AOAHIAwgA0HHB2oQ0AggA0EBOwAyIAMgAS0AsAI6ADEgAyABKAGqAjYAKyADIAEvAa4COwAvIAMgASkAswI3ADQgAyABKQC7AjcAPCADIAEoAMMCNgBEIANB4QBqIApBFWopAAA3AAAgA0HcAGogCkEQaikBADcCACADQdQAaiAKQQhqKQEANwIAIAMgCikBADcCTCAMIANBK2oQ0AggAyABNgJIIAMgAjYClAggAyAHNgKQCCADIBQ3AoQIIAMgBDYCgAggAyADQSRqNgKMCCADQQhqIAFBASAUpyAUQiCIpxC/GRDDAyADKAIMIQUCQCADKAIIRQRAIAAgAykCgAg3AgAgAEEIaiADQYgIaigCADYCACABKAKcAyEBIAMo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AiACIApLGzYCoAEgBUEgaiABIAVBoAFqQQFBABA6IAUoAiQhAyAFKAIgIQgMCQsgASgCKCECIAFBJTYCKCABIAEpA0A3A3ggBUHMAWogAUE0aikCADcCACAFQdQBaiABQTxqKAIANgIAIAUgASkCLDcCxAEgBSACNgLAASAFQcABahDDCgJAAkACQAJAIAwQ5w0iAgRAIAIoAgBBBkYNAQsgBUEwaiABEKABQQEhCCAFKAI0IQMgBSgCMA0MIAUgAzYCkAEgAygCACICQRRGDQIgAkEeRw0BDAsLIAEoAighAyABQSU2AiggASABKQNANwN4IAVBzAFqIgQgAUEsaiICQQhqKQIANwIAIAVB1AFqIAJBEGooAgA2AgAgBSACKQIANwLEASAFIAM2AsABIAVBwAFqEMMKAkACQCAMEOcNIgNFDQAgAygCAEECRw0AIAMtAAgNACADLQAJQSVGDQELIAQgDBDrCyAFQThqIAwQsxQgBUEGNgLIASAFQYiS4AA2AsQBIAVBMDoAwAEgBSgCOCAFKAI8IAVBwAFqEP0UIQNBASEIIAwQ5w0iAkUNDCACKAIAQSRHDQwgASABKQNANwN4IAEoAiggAUElNgIoQSRHDQUgASABKAIsEIYMDAwLIAEoAighAyABQSU2AiggASABKQNANwN4IAVBzAFqIAJBCGopAgA3AgAgBUHUAWogAkEQaigCADYCACAFIAIpAgA3AsQBIAUgAzYCwAEgBUHAAWoiAxDDCiABKAJ8IQIgBUEAOgDIASAFIAogAiACIApJGyIENgLEASAFIAogAiACIApLGyICNgLAASADELAYIQcgAS0AlgNBAXENCSABLQCXA0EBcQ0JIAEtAJMDQQFxDQkgBUELOgDAASABIAIgBCADENAZDAkLIAJBMEYNAQwGCyADKAIoIgIoAgBBMEcNBSACLQAQQQFHDQUgAigCDCEDIAIoAgggBUHoADoAwAEgAyAFQcABahD9FCEDIAwQ5w0iAkUNBiACKAIAQSRHDQYgASABKQNANwN4IAEoAiggAUElNgIoQSRHDQMgASABKAIsEIYMDAYLIAMtABBFDQQgAygCDCECIAMoAgggBUHoADoAwAEgAiAFQcABahD9FCEDIAwQ5w0iAkUNBSACKAIAQSRHDQUgASABKQNANwN4IAEoAiggAUElNgIoQSRH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EOcNIgVFDQogBSgCAEECRw0KIAZB8ABqIAUtAAggBUEJai0AABDdCQ0KDAYLIAEoAighBSABQSU2AiggASABKQNANwN4IAZB1ABqIAFBNGopAgA3AgAgBkHcAGogAUE8aigCADYCACAGIAEpAiw3AkwgBiAFNgJIIAZByABqEMMKDAULIAUNAiABQShqIggQ5w0iBUUNCCAFKAIAQQJHDQggBS0ACEECRw0IIAUtAAlBGUcNCCAIELIhDQgMAwsgASgCKCEFIAFBJTYCKCABIAEpA0A3A3ggBkHUAGogAUE0aikCADcCACAGQdwAaiABQTxqKAIANgIAIAYgASkCLDcCTCAGIAU2AkggBkHIAGoQwwoMCAsgASgCKCEHIAFBJTYCKCABIAEpA0A3A3ggBkHUAGogAUE0aikCADcCACAGQdwAaiABQTxqKAIANgIAIAYgASkCLDcCTCAGIAc2AkggBkHIAGoQwwoMBAsgASgCKCEFIAFBJTYCKCABIAEpA0A3A3ggBkHUAGogAUE0aikCADcCACAGQdwAaiABQTxqKAIANgIAIAYgASkCLDcCTCAGIAU2AkggBkHIAGoQwwoLIAZByABqIAEgAiACIANBARCIBCAGKAJMIQICQCAGKAJIIgFBCEcEQCAAIAYpA1A3AwggAEEgaiAGQegAaikDADcDACAAQRhqIAZB4ABqKQMANwMAIABBEGogBkHYAGopAwA3AwAMAQtBCSEBCyAAIAE2AgAgACACNgIEIAYpA0AQ8RoMCAsgBkEIaiABIAJBABB8IAYoAgwhAkEJQQYgBigCCEEBcRsMBQsgBkEQaiABIAIQnwIgBigCFCECQQlBBCAGKAIQQQFxGwwECyAIEOcNIgdFBEAgASgC2AIhASAGQQA6AEggASABIAZByABqEP0UIQJBCQwECwJAIAcoAgAiB0EbRwRAIAdBJEcNASABIAEpA0A3A3ggASgCKCABQSU2AihBJEYEQCABKAIsIQJBCQwGC0Hd6+AAQShBxN/fABDuFwALIAZBIGogASACEKkCIAYoAiQhAkEJQQcgBigCIEEBcRsMBAsgBUUEQCAGQcUBaiABQZcDaikAADcAACAGQcABaiABQZIDaikAADcDACAGQbgBaiABQYoDaikAADcDACAGIAEpAIIDNwOwASAIEOcNIgVFDQIgBSgCAEEC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ACABQQhrcWpBCGogBToAACAGIAYoAlhBAWo2AlggBiAGKAJUIAhBAXFrNgJUIAIgAUEEdGtBEGsiAiASNwMIIAIgFDcDACAOENkeIAZBBGoiAhDpHyAGKAIIIAAgBigCDCgCDBEAACACENkeIActAExBDHFBBEYNASAGLQBfQQFGDQQgBiAGKAIAQQFqNgIADAELIA4Q2R4LIAdBBzoATAsgA0GQAWokAA8LQcjN2AAQ7hQACyADQQA2AiggA0EBNgIcIANBkMPYADYCGCADQgQ3AiAgA0EYakGYw9gAELodAAvXDwEKfyMAQdABayIDJAACQCABKAIAIgotABQiBEECRiAEQQFxckUEQCAAIAEoAgQgASgCCCACQRxqQQAQ3hgMAQsCQAJAAkACQAJAAkACQEECIAIoAgBBgICAgHhzIgQgBEECTxtBAWsOAgIBAAsgAigCBCEEIANBADYCxAEgA0E4aiAEIANBxAFqEOEJIANBqAFqIAMoAjggAygCPBC2ESADKAKoASADQYABaiADKAKsASIFIAMoArABEP8GIAUQ1ikgAkEcaiEIDAILIAIoAhQhBCACKAIQIQUgA0G4AWogAigCBCACKAIIEJ0EIANBxAFqIAUgBBCdBCADQagBaiADKAK8ASIJIAMoAsABEPkIIAJBHGohCAJAAkACQCADLQCoAQ0AIAMoAqwBIgVFBEBBACEEDAILIAUgAygCsAEiBkHkw8cAQRAQ4x9FBEAgBSAGQfTDxwBBBhDjH0UEQCADQagBaiAFIAYQ+gggAy0AqAENAkEBIQQgAygCrAEiB0UNAyADQUBrIAcgAygCsAEgAygCyAEiByADKALMARDMCiADKAJAIgtFDQMgAygCRCEMQQMhBAwECyADQagBaiADKALIASIHIAMoAswBEIkPIAMtAKgBDQEgAygCrAEiBQRAIAMoArABIQZBAiEEDAQLQQEhBAwCCyADQagBaiADKALIASIHIAMoAswBEI0KIAMtAKgBDQBBASEEIAMoAqwBIgVFDQEgAygCsAEhBgwCCyADLQCpASEECyADKALEASADKALIARDWKSADKAK4ASAJENYpDAMLIAMgDDYCkAEgAyALNgKMASADIAY2AogBIAMgBTYChAEgAyAENgKAASADKALEASAHENYpIAMoArgBIAkQ1ikMAQsgA0GAAWogAigCCCACKAIMEP8GIAJBHGohCAsgAygCgAEiBkEERw0BIAMtAIQBIQQLIAMgBDoAdCADQYCAgIB4NgJwDAELIAMoAogBIQQgAygChAEhBQJAAkACQAJAIAZBAWsOAwIBAAMLIAMoApABIQYgAygCjAEhBwJAAkACQAJAAkACQCAFIARBgMTHAEEDEOMfRQRAIAUgBEGDxMcAQREQ4x8NASAFIARBlMTHAEEWEOMfDQIgBSAEQarExwBBDhDjHw0DIAUgBEG4xMcAQQoQ4x8NBCADQYCAgIB4NgJwIANBADoAdAwKCyADQagBahCQHUHwfCEEA0AgBEUNBSAHIAYgBEGAlsoAaigCACAEQYSWygBqKAIAEOMfDQYgBEEQaiEEDAALAAsgA0EYakGIrM4AQaMBIAcgBhDdCiADQYABaiADKAIYIAMoAhwQySEgAygCgAFBgICAgHhGBEAgA0GAgICAeDYCcCADQQE6AHQMCQsgA0H4AGogA0GIAWopAgA3AwAgAyADKQKAATcDcAwICyADQSBqQcjV1ABBDSAHIAYQ3QogA0GAAWogAygCICADKAIkEMkhIAMoAoABQYCAgIB4RgRAIANBgICAgHg2AnAgA0EBOgB0DAgLIANB+ABqIANBiAFqKQIANwMAIAMgAykCgAE3A3AMBwsgA0EoakGYstYAQQ4gByAGEN0KIANBgAFqIAMoAiggAygCLBDJISADKAKAAUGAgICAeEYEQCADQYCAgIB4NgJwIANBAToAdAwHCyADQfgAaiADQYgBaikCADcDACADIAMpAoABNwNwDAYLIANBMGpB4JjVAEESIAcgBhDdCiADQYABaiADKAIwIAMoAjQQySEgAygCgAFBgICAgHhGBEAgA0GAgICAeDYCcCADQQE6AHQMBgsgA0H4AGogA0GIAWopAgA3AwAgAyADKQKAATcDcAwFCyADQYCAgIB4NgJwIANBAToAdCADKAKoASADKAKsARDgKQwECyAEQaADaiEFQfCSygAhBANAIAUEQCADQYABaiIGIAQoAgggBCgCDBDeCiADQagBaiAGEIYYIAMoAoABIAMoAoQBEOApIAVBEGshBSAEQRBqIQQMAQUgA0H4AGogA0GwAWopAgA3AwAgAyADKQKoATcDcAwFCwALAAsgA0EQakGQ4s0AQaMBIAUgBBDdCiADQYABaiADKAIQIAMoAhQQySEgAygCgAFBgICAgHhGBEAgA0GAgICAeDYCcCADQQE6AHQMAwsgA0H4AGogA0GIAWopAgA3AwAgAyADKQKAATcDcAwCCyADQfAAaiAFIAQQrQcMAQsgBSAEQffFyABBDhDjH0UEQCAFIARBq5jIAEELEOMfRQRAIANBCGpBuPjTAEE8IAUgBBDdCiADQYABaiADKAIIIAMoAgwQySEgAygCgAFBgICAgHhGBEAgA0GAgICAeDYCcCADQQA6AHQMAwsgA0H4AGogA0GIAWopAgA3AwAgAyADKQKAATcDcAwCCyADQfAAahDzKgwBCyADQfAAahD0KgsgA0HIAGogASgCBCABKAIIIAggA0HwAGoQ/xYCQCADKAJIQYCAgIB4RgRAIANBgAFqIAogAi0ANCADQcwAahD2HSADKAKAASIBQYCAgIB4Rw0BCyAAIANByABqQSgQ/AYaDAELIABBBGogA0GEAWpBJBD8BhogACABNgIAIAMoAkgiAEGAgICAeEYEQCADKAJMIAMoAlAQ4CkMAQsgACADKAJMENYpCyADQdABaiQAC64OAQh/IwBB4ABrIgQkACAALQAkIQkgAEEDOgAkIAAtACUhCAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAEoAgBBAWsOEhISAQIDEhIEBQYHCAkKCwwNDgALIAAgAUEEahCZIQwRCyABQQRqIAAQySwgAUEIaiAAENgsDBALIAFBDGogABCzJQwPCyABQShqIAAQ2CwMDgsgAUEEaiAAEMksIAFBCGoiBSAAENgsIAEoAhQEQCABQRRqIAAQ2CwLIAUoAgAiAiEBA0ACQAJAAkACQAJAIAEoAgBBBWsODAATEwQTExMBEwIDAxMLIAEoAighAQwECyABKAIIIQEMAwsgASgCDCEBDAILIAEoAhAhAQwBCyABKAIUIgENAAsCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAIoAgBBAWsOEgECAwQFBgcICQoLDA0ODxAREgALIAJBFGohASACQRBqIQMMEgsgAkEIaiEBIAJBBGohAwwRCyACQQhqIQEgAkEEaiEDDBALIAJBEGohASACQQxqIQMMDwsgAkEIaiEBIAJBBGohAwwOCyACQQxqIQEg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QoCAgICAgECDDAELQQAhBUEAIQRCAAshDCADIAA6ADUgAyAMIA2EIAWtQhCGhDcBNiADIAE6ADQCQCABQf8BcUGAAUYEQEGAASEAA0ACfyAAQf8BcUGAAUcEQCAEQf8BcSIBIAdB/wFxTw0EIAEgAmotAAAhASAEQQFqDAELIAJCADcCAEEAIQcgC0EANgIAQQAhACAFIQFBACEFQQALIQQgCiABIAgoAhARAgBFDQALDAQLIARB/wFxIgQgB0H/AXEiAU8NACAEIAEgASAESRshACAIKAIQIQEDQCAKIAIgBGotAAAgARECAA0EIAAgBEEBaiIERw0ACwsgBiAJRw0ACwtBACEBDAELQQEhAQsgA0HgAGokACABC6QPAQF/IwBBMGsiAiQAAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIAIgAoAgBBAWsOIQECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gIQALIAJBAjYCHCACQcS31gA2AhggAkIBNwIkIAJBCTYCFCACQaj44AA2AhAgAiACQRBqNgIgIAEoAhQgASgCGCACQRhqEK0kDCELIAJBADYCKCACQQE2AhwgAkGEuNYANgIYIAJCBDcCICABKAIUIAEoAhggAkEYahCtJAwgCyACQQA2AiggAkEBNgIcIAJByLjWADYCGCACQgQ3AiAgASgCFCABKAIYIAJBGGoQrSQMHwsgAkEANgIoIAJBATYCHCACQfy41gA2AhggAkIENwIgIAEoAhQgASgCGCACQRhqEK0kDB4LIAJBADYCKCACQQE2AhwgAkGcudYANgIYIAJCBDcCICABKAIUIAEoAhggAkEYahCtJAwdCyACQQA2AiggAkEBNgIcIAJBvLnWADYCGCACQgQ3AiAgASgCFCABKAIYIAJBGGoQrSQMHAsgAkEANgIoIAJBATYCHCACQdy51gA2AhggAkIENwIgIAEoAhQgASgCGCACQRhqEK0kDBsLIAJBADYCKCACQQE2AhwgAkGAutYANgIYIAJCBDcCICABKAIUIAEoAhggAkEYahCtJAwaCyACQQA2AiggAkEBNgIcIAJBvLrWADYCGCACQgQ3AiAgASgCFCABKAIYIAJBGGoQrSQMGQsgAkEANgIoIAJBATYCHCACQeC61gA2AhggAkIENwIgIAEoAhQgASgCGCACQRhqEK0kDBgLIAJBADYCKCACQQE2AhwgAkGou9YANgIYIAJCBDcCICABKAIUIAEoAhggAkEYahCtJAwXCyACQQA2AiggAkEBNgIcIAJBzLvWADYCGCACQgQ3AiAgASgCFCABKAIYIAJBGGoQrSQMFgsgAkEANgIoIAJBATYCHCACQfS71gA2AhggAkIENwIgIAEoAhQgASgCGCACQRhqEK0kDBULIAJBADYCKCACQQE2AhwgAkGMvNYANgIYIAJCBDcCICABKAIUIAEoAhggAkEYahCtJAwUCyACQQA2AiggAkEBNgIcIAJBtLzWADYCGCACQgQ3AiAgASgCFCABKAIYIAJBGGoQrSQMEwsgAkEANgIoIAJBATYCHCACQeC81gA2AhggAkIENwIgIAEoAhQgASgCGCACQRhqEK0kDBILIAJBADYCKCACQQE2AhwgAkH8vNYANgIYIAJCBDcCICABKAIUIAEoAhggAkEYahCtJAwRCyACQQA2AiggAkEBNgIcIAJBoL3WADYCGCACQgQ3AiAgASgCFCABKAIYIAJBGGoQrSQMEAsgAkEANgIoIAJBATYCHCACQcC91gA2AhggAkIENwIgIAEoAhQgASgCGCACQRhqEK0kDA8LIAJBADYCKCACQQE2AhwgAkHovdYANgIYIAJCBDcCICABKAIUIAEoAhggAkEYahCtJAwOCyACQQA2AiggAkEBNgIcIAJBjL7WADYCGCACQgQ3AiAgASgCFCABKAIYIAJBGGoQrSQMDQsgAkEANgIoIAJBATYCHCACQaS+1gA2AhggAkIENwIgIAEoAhQgASgCGCACQRhqEK0kDAwLIAJBADYCKCACQQE2AhwgAkG8vtYANgIYIAJCBDcCICABKAIUIAEoAhggAkEYahCtJAwLCyACIAAoAgQ2AgwgAkECNgIcIAJBgL/WADYCGCACQgE3AiQgAkEJNgIUIAIgAkEQajYCICACIAJBDGo2AhAgASgCFCABKAIYIAJBGGoQrSQMCgsgAkEANgIoIAJBATYCHCACQcy/1gA2AhggAkIENwIgIAEoAhQgASgCGCACQRhqEK0kDAkLIAJBADYCKCACQQE2AhwgAkGEwNYANgIYIAJCBDcCICABKAIUIAEoAhggAkEYahCtJAwICyACQQA2AiggAkEBNgIcIAJBqMDWADYCGCACQgQ3AiAgASgCFCABKAIYIAJBGGoQrSQMBwsgAkEANgIoIAJBATYCHCACQdjA1gA2AhggAkIENwIgIAEoAhQgASgCGCACQRhqEK0kDAYLIAJBADYCKCACQQE2AhwgAkG0wdYANgIYIAJCBDcCICABKAIUIAEoAhggAkEYahCtJAwFCyACQQA2AiggAkEBNgIcIAJBoMLWADYCGCACQgQ3AiAgASgCFCABKAIYIAJBGGoQrSQMBAsgAkEANgIoIAJBATYCHCACQazD1gA2AhggAkIENwIgIAEoAhQgASgCGCACQRhqEK0kDAMLIAJBADYCKCACQQE2AhwgAkHUw9YANgIYIAJCBDcCICABKAIUIAEoAhggAkEYahCtJAwCCyACQQA2AiggAkEBNgIcIAJB/MPWADYCGCACQgQ3AiAgASgCFCABKAIYIAJBGGoQrSQMAQsgAkEANgIoIAJBATYCHCACQcjE1gA2AhggAkIENwIgIAEoAhQgASgCGCACQRhqEK0kCyACQTBqJAALmg4BDn8jAEGwAWsiAyQAIAFBKGoiBRC6ICELAkAgBRDNDSIERQRAIAEoAoACIQEgA0EAOgBoIAEgASADQegAahD9FCEBIABBgICAgHg2AgAgACABNgIEDAELAkACQAJAAkACQAJAAkACQAJAAkACQCAEKAIAQSRGBEAgASABKQPgAjcDmAMgASgCyAIgAUElNgLIAkEkRg0BQd3r4ABBKEH4k+AAEO4XAAsgASgCyAIhBCABQSU2AsgCIAEgASkD4AI3A5gDIANB9ABqIgYgAUHUAmopAgA3AgAgA0H8AGoiCCABQdwCaigCADYCACADIAEpAswCNwJsIAMgBDYCaCADQegAaiIKEMIKIANBADYCPCADQoCAgIDAADcCNCAKIAEgAhDKBCADKAJoIQQgAy0AgAEiB0ECRg0FIAFBzAJqIQkgA0HYAGoiDCAIKAIANgIAIANB0ABqIgggBikCADcDACADIAMpAmw3A0ggAyADKACBATYCQCADIANBhAFqKAAANgBDQSBBCBChICIGIAQ2AgAgBiAHOgAYIAYgAykDSDcCBCAGQQxqIAgpAwA3AgAgBkEUaiAMKAIANgIAIAYgAygCQDYAGSAG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GEEAIA5rIQUgASADayEGIAAgDkECdCIEaiENIAIgBGohCgNAIAsgC0EYahCMFiALKAIARQRAIAIgASAAEM8HDAILIAUgBiADIAsoAgQiBBsiByAOIAcgDksbaiEJIA0gBEECdCIEaiEIIAQgCmohByACIARqIQQDQCAJRQ0BIAcgCCgCADYCACAEIAcQ7BQgCUEBayEJIAhBBGohCCAHQQRqIQcMAAsACwALIAtBMGokAAvsDAIJfwR+IwBB8AVrIgMkACADIAI2AhwCQCABKAIAQQFxRQRAIANB4AFqQgA3AwAgA0HYAWpCADcDACADQdABakIANwMAIANCADcDyAEMAQsgA0HgAWogAUEgaikDADcDACADQdgBaiABQRhqKQMANwMAIANB0AFqIAFBEGopAwA3AwAgAyABKQMINwPIAQsCQAJ/AkAgAi8AsQJBswZxRQ0AAkACQCABLQBTQQFxRQRAQYABIQQDQCAEQf8BcUEBaiIFQf8BcSAFRw0CIANByAFqIAQQ9ykgBSEERQ0ACwwCCyADQf8BOgDuASADQYCAAjsB7AEDQCADQRhqIANB7AFqEOQSIAMtABhFDQMgA0HIAWogAy0AGRCzEgwACwALIANByAFqQf8BEPcpRQ0BCyAAQbEBNgIQIABBjPDDADYCDEEsIQVBCAwBCyADQcgAaiADQdQBaikCACINNwMAIANB0ABqIANB3AFqKQIAIgw3AwAgA0HYAGogA0HkAWooAgAiBDYCACADQSxqIA03AgAgA0E0aiAMNwIAIANBPGogBDYCACADIAMpAswBIgw3A0AgAyADKALIASIKNgIgIAMgDDcCJAJAIAEtAFIiBEECRiAEQQFxckUEQCADQfABakEAQYACEIoLGiADQf8BOgBiIANBADsBYANAIANBEGogA0HgAGoQ5BIgAy0AEEUNAiADLQARIgQgA0HwAWpqIAQ6AAAMAAsACyADQfgAaiACQaACaikDADcDACADQfAAaiACQZgCaikDADcDACADQegAaiACQZACaikDADcDACADIAIpA4gCNwNgAkAgA0EgahD+KQ0AQQAhBANAQYACIAQgBEGAAk0bIQYDQCAEIAZGDQIgBBDfGiEFIARBAWohBCADQSBqIAUQ2hVFDQALIAUhBgNAAkAgBEH/AUsNACADQSBqIAQQ3xoQ2hVFDQAg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EPAZIQsgAUEMahDwHCEBIAJBAjoApAIgAiAiNwOYAiACIAE2ApQCIAIgCzYCkAILIAcgAikDkAI3AwAgDyACKQOAAjcDACAHQRhqIAJBqAJqKQMANwMAIAdBEGogAkGgAmopAwA3AwAgB0EIaiACQZgCaikDADcDACAPQQhqIAJBiAJqKAIANgIAIAIgHTYC7AEgAiAeNgLoASACICE6AP4BIAIgHzoA/QEgAiAgOgD8ASACQQc2AsABDAELIAJBwAFqIAEQiB8LIAQgCGogAkHAAWpBwAAQ0C0aIAVBAWshBSAEQUBrIQQMAQsLIAIgBjYCsAEgAiAINgKsASACIBw2AqgBIBMgA0EgahC2ICACIBc2ArQBIAIgGDYCpAEgAiAZNgKgASACIAMvAVA7AbgBIAJBEGogAkHoAGpB2AAQ/AYaDAgLIAMpAighIiACQegAaiIBIANBCGoQzA4gAiADQTBqEP4LNgKQASACICI3A4gBIAIgAy0AOToAmQEgAiADLQA0OgCUASACIAMoADU2AJUBIAogAUE4EPwGGiACQQU2AhAMBwsgAykCGCEiIAJB6ABqIgEgA0EIahDMISACIANBIGoQ/gs2AoABIAIgIjcDeCACIAMtACY6AIYBIAIgAy0AKToAiQEgAiADLwAnOwCHASACIAMvACQ7AYQBIAogAUEoEPwGGiACQQY2AhAMBgsgAykCKCEiIAJB6ABqIgYgA0EIahDMDiADQTxqEPQkIQEgA0FAaxCSHCEEIAMtAEQhBSAQIANBMGoQygsgAiAFOgCkASACIAQ2AqABIAIgATYCnAEgAiAiNwOIASACIAMtAEs6AKsBIAIgAy8ASTsAqQEgAiADKABFNgClASAKIAZByAAQ/AYaIAJBBzYCEAwFCyADKQIYISIgAygCICEBIAJB6ABqIgggA0EIahDMISADQSRqEPQkIQQgA0EoahCSHCEFIAMtADkhBiAUIANBLGoQygsgAiAGOgCZASACIAU2AogBIAIgBDYChAEgAiABNgKAASACICI3A3ggAiADKAE6NgGaASACIAMtADg6AJgBIAogCEE4EPwGGiACQQg2AhAMBAsgCSADQQRqELceIAJBCTYCEAwDCyACQQo2AhAgAiADKQIENwIUDAILIAMpAhwhIiACQegAaiADQQRqENIfIAlBGGogIjcCACAJ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IAEoAighAyABQSU2AiggASABKQNANwN4IAUgB0EIaikCADcCACAJIgYgB0EQaigCADYCACACIAcpAgA3AlwgAiADNgJYIAwQwwogAkEBOgD7ASACIAEpAYIDNwDvASACIAFBigNqIgMoAQA2APcBIAIgASkAjwM3APwBIAIgAUGXA2oiCCkAADcAhAIgAkHxAGogCCkAADcAACAGIAFBkgNqKQEANwIAIAUgAykBADcCACACIAEpAYIDNwJcIAFBgAFqIAJB7wFqEMgIIAIgATYCWCACQQhqIAEQlAIgAigCDCEGIAIoAghFBEAgDSEDIA4hBSACIAY2AowCIAwQoCYCQAJAAkAgAigCwAEiCEEBaw4GAAAAAgICAQsgBSEDCyABKAJ8IQVBDEEEEKEgIgkgBjYCACAJIAsgBSAFIAtJGzYCCCAJIAsgBSAFIAtLGzYCBCADEI8oIAMgCTYCAAwCCyACQYwCahC9BQwBCyACQdgAahCgJgwBCyAEEOcNIgMEQCADKAIAQQpGDQILIAJB4ABqIAQQ6wsgAiAEELMUIAJBgOXfADYCXCACQTQ6AFggAigCACACKAIEIAJB2ABqEP0UIQYgBBDnDSIDRQ0AIAMoAgBBJEcNACABIAEpA0A3A3ggASgCKCABQSU2AihBJEcNBCABIAEoAiwQhgwLIAJBwAFqEKwSDAILIAEoAighAyABQSU2AiggASABKQNANwN4IAJB5ABqIAdBCGopAgA3AgAgAkHsAGogB0EQaigCADYCACACIAcpAgA3AlwgAiADNgJYIAJB2ABqEMMKIAJBIGogAkHIAWoiA0EIaikDADcDACACQShqIANBEGopAwA3AwAgAkEwaiADQRhqKQMANwMAIAIgAykDADcDGCACKALEASEGCyACQdAAaiIDIAJBMGopAwA3AwAgAkHIAGoiBSACQShqKQMANwMAIAJBQGsiByACQSBqKQMANwMAIAIgAikDGDcDOCACQcABaiABQQAQmQYgAkHoAGogBykDADcDACACQfAAaiAFKQMANwMAIAJB+ABqIAMpAwA3AwAgAiAENgKEASACIAY2AlwgAiAINgJYIAIgAikDODcDYCACKALAASACIAJBFGo2AoABQYCAgIB4RwRAIAJBoAFqIAMpAwA3AwAgAkGYAWogBSkDADcDACACQZABaiAHKQMA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gICAeEcEQCACQcgAaiACQewAaigCADYCACACIAIpAmQ3A0AgAkEQaiACQUBrEI8QIAIoAhAhASACKAIUIgQEQCAAIAEgBBCJDjYCGCAAIAQ2AgggACABNgIEIABBATYCAAwDCyAAEMYoIAFBABDWJAwCCyAAIAJBLGoQ6gc2AhggAEECNgIAIABBFGogAkE8aigCADYCACAAQQxqIAJBNGopAgA3AgAgACACKQIsNwIEDAoLIAJB6ABqEI8dIAJBATYCZCAAIAJB5ABqEOoHNgIYIABBAjYCACAAQRRqIAJB9ABqKAIANgIAIABBDGogAkHsAGopAgA3AgAgACACKQJkNwIECyACQSxqEKseDAgLIAAgASgCBCIBEMIUNgIYIAAgATYCBCAAQQM2AgAMBwsgAkHkAGogASgCDBDqASABKAIEIQQgASgCCCEGIAEtABQhByABKAIQIQVBHEEEEKEgIgNBGGoiASACQfwAaigCADYCACADQRBqIAJB9ABqKQIANwIAIANBCGogAkHsAGopAgA3AgAgAyACKQJkNwIAIAIgBTYCOCACIAc6ADwgAiAGNgIwIAIgBDYCLCACIAM2AjQgASgCACIBKAIIQQFHDQQgASgCDA0EIAJBATYCLCACIAVBAEciBTYCOCACIARBAXMgBkEAR3IiBjYCMEEBDAULIAEoAgQhAQwBCwsgASgCCCEFIAJBGGogASgCDCIDQRwQvBQgAkEANgJUIAIgAikDGDcCTCACQcwAaiADEOkeIAIoAlQhASACIAMEfyABIANqIAIoAlAgAUEcbGohAQNAIAJB5ABqIAUQ6gEgAUEYaiACQfwAaigCADYCACABQRBqIAJB9ABqKQIANwIAIAFBCGogAkHsAGopAgA3AgAgASACKQJkNwIAIAFBHGohASAFQRxqIQUgA0EBayIDDQALBSABCzYCVCAAIAJBzABqEKsBDAMLIAEoAgghBSACQSBqIAEoAgwiA0EcELwUIAJBADYCYCACIAIpAyA3AlggAkHYAGogAxDpHiACKAJgIQEgAiADBH8gASADaiACKAJcIAFBHGxqIQEDQCACQeQAaiAFEOoBIAFBGGogAkH8AGooAgA2AgAgAUEQaiACQfQAaikCADcCACABQQhqIAJB7ABqKQIANwIAIAEgAikCZDcCACABQRxqIQEgBUEcaiEFIANBAWsiAw0ACwUgAQs2AmAgACACQdgAahBZDAILIAQLIQECQAJAAkACQCAFDgIAAQILIAFFIAZyDQEgABDGKCADEKcjDAILIAFFIAZBAUdyDQAgACADKQIANwIAIABBGGogA0EYaigCADYCACAAQRBqIANBEGopAgA3AgAgAEEIaiADQQhqKQIANwIADAELIAAgAkEsahD2BjYCGCAAQQQ2AgAgACACKQIsNwIEIABBFGogAkE8aigCADYCACAAQQxqIAJBNGopAgA3AgAMAQsgAxDtKgsgAkGAAWokAAv8CgEHfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQEEHIAAoAgAiAkEMayIEIARBJk8bQQFrDiQAAQIUFQMEBQYHCAkWExMWCgsMDRMUFA4TEw8QFxQUFxEXExITCyAAKAIMQQR0IQMgACgCCCEAA0AgA0UNEyAAKAIAQQJHBEAgAEEMaiABEP4sCyAAQRBqIQAgA0EQayEDDAALAAsgAEEEaiABEIIKDwsgACgCICABEKQQDwsgAEEEaiABEP4sIABBCGogARD+LA8LIABBOGoCQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAkEBaw4LAQIDBAUGBwgJCwoACyAAKQMIIAAoAhggARC4HAwKCyAAQQhqIAEQnh8MCQsgAEEIaiABEIwiDAgLIABBBGogARD+LAwHCyAAQQRqIAEQgBkMBgsgAEEEaiABENklDAULIABBBGogARDZJQwECyAAQQRqIAEQ/iwMAwsgAEEEaiABENklDAILIABBBGogARDaJQwBCyAAQQhqIQICQAJAIAAoAgRBAWsOAgECAAsgAiABEJEVDAELIAIgARC8CwsgARD+LA8LIABBCGogARCeHw8LIABBCGogARCMIg8LIABBBGogARD+LCAAQQhqIAEQ/iwMDQsgAC0AGEEFRgRAIABBEGogARD+LAsgAEEEaiABEIEZIABBKGogARDvIw8LIABBEGogARD+LCAAKAIEQYCAgIB4RwRAIABBBGogARCBGQsgAEEgaiABEO8jDwsgAEEEaiABEP4sIABBGGogARDvIyAAKAIIIAEQpxoPCyAAKAIMQShsIQMgACgCCCECA0AgAwRAIAIgARCqESADQShrIQMgAkEoaiECDAEL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ACACKAIAQQpHDQAgASgCyAIhAiABQSU2AsgCIAEgASkD4AI3A5gDIANBlAFqIAZBCGopAgA3AgAgA0GcAWogBkEQaigCADYCACADIAYpAgA3AowBIAMgAjYCiAEgA0GIAWoQwgogAEEIaiADQfQAaigCADYCACAAIAMpAmw3AgAMBAsgA0GQAWogBBCSECADQRBqIAQQgBQgA0GA5d8ANgKMASADQTQ6AIgBIAMoAhAgAygCFCADQYgBahD9FCECAkAgBBDNDSIERQ0AIAQoAgBBJEcNACABIAEpA+ACNwOYAyABKALIAiABQSU2AsgCQSRGBEAgASABKALMAhD/CwwBC0Hd6+AAQShBsIfgABDuFwALIABBgICAgHg2AgAgACACNgIEDAELIABBgICAgHg2AgAgACACNgIECyADQewAahDkJgwBCyAAQYCAgIB4NgIAIAAgAjYCBAsgA0HIAGoQhCUgA0GwAWokAAutCwIGfwF+IwBBQGoiAyQAIANBMGogAiABQQxBACABLQAlIgRBAkYbaigCAEEAENMBAkACQAJAAkACQAJAAkACQAJAIAMtADBBBEcEQCADKQMwIglC/wGDQgRSDQELIANBADYCGCADQTBqIAIgA0EYakHatOAAQQEQrBMCQCADLQAwQQRGDQAgAykDMCIJQv8Bg0IEUQ0AIAAgCTcCAAwJCyACIAIoAixBAWo2AiwgBEECRw0BIAEoAgQgASgCECEHIANBMGogASgCDCIIIAEoAggiBEGBgAQgBBDoFyADLQAwQQVHBEAgAykDMCEJDAULIAMoAjQaIARFDQICQCACLQBNDQAgA0EwaiACELARIAMtADBBBEYNACADKQMwIglC/wGDQgRSDQULIANBADoAJiADQQA6ACdBNGohASAEIQYDQCAGRQRAIANBMGogAiAIIAdBgYAEIAUgCUIgiKcQ1gEgAy0AMEEERg0FIAMpAzAiCUL/AYNCBFINBgwFCyADIAk3AjQgAyAFNgIwIANBEGogAUE0ayIFEM4RIANBKGogAiAHQYGABCADQTBqIAMoAhAgAygCFCADQSdqIANBJmoQkQQgAy0AKEEERwRAIAMpAygiCUL/AYNCBFINBgsgA0EwaiAFIAIQNCADLQAwQQRHBEAgAykDMCIJQv8Bg0IEUg0GCwJAIAMtACZFBEAgA0EBOgAm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AmopAAA3AwAgAyABKQCqAjcDSCAEEKcTIgJFDQEgAigCAEECRw0BIANByABqIAItAAggAkEJai0AABDdCQ0BIAQQzQ0iAkUEQCABKAKAAiEBIANBADoAaCABIAEgA0HoAGoQ/RQhAgwDCyACKAIAQSRGBEAgASABKQPgAjcDmAMgASgCyAIgAUElNgLIAkEkRgRAIAEoAswCIQIMBAtB3evgAEEoQejz3wAQ7hcACyABKALIAiECIAFBJTYCyAIgASABKQPgAjcDmAMgA0H0AGogAUHUAmopAgA3AgAgA0H8AGogAUHcAmooAgA2AgAgAyABKQLMAjcCbCADIAI2AmggA0HoAGoiAhDCCkEBIQUgBBDNDQ0BIAEoAoACIQEgA0EAOgBoIAEgASACEP0UIQIMAgtB3evgAEEoQdjz3wAQ7hcACyADQf0AaiABQb8CaikAADcAACADQfgAaiABQboCaikAADcDACADQfAAaiABQbICaikAADcDACADIAEpAKoCNwNoAkAgBBDNDSICRQ0AIAIoAgBBAkcNACADQegAaiACLQAIIAJBCWotAAAQ3QkNACAEEKcTIgJFDQAgAigCAEECRw0AIAItAAgNACACLQAJQQ5HDQAgBBD/IEEBcyEGCyAFIAZyRQRAIANBEGogAUEAIAcQgAcgAygCFCECIAMoAhAhCAwCCyADQZgBaiIKIAEQ0QQgAygCoAEhAiADKQOYASILUA0AIAMgAygCpAE2ApQBIAMgAjYCkAEgAyALNwOIAUEAIQICQAJAIAYEQCAEEM0NIgJFBEAgASgCgAIhASADQQA6AJgBIAEgASAKEP0UIQIMAwsgAigCAEEkRgRAIAEgASkD4AI3A5gDIAEoAsgCIAFBJTYCyAJBJEcNAiABKALMAiECDAMLIAEoAsgCIQIgAUElNgLIAiABIAEpA+ACNwOYAyADQaQBaiABQdQCaikCADcCACADQawBaiABQdwCaigCADYCACADIAEpAswCNwKcASADIAI2ApgBIANBmAFqEMIKIANBCGogAUEAIAQQuiAQgAcgAygCDCECIAMoAggNAgsgASgCnAMhBiADQbgBaiADQYgBahCcHCADQawBaiADQcgBaikDADcCACADQaQBaiADQcABaikDADcCACADIAMpA7gBNwKcAUHYAEEIEKEgIgRBEjYCACAE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aiIEENUgIQcCQAJAAkACQCAEIAIQ4w5FBEAgBBDnDSIFRQRAIAEoAtgCIQUgA0EAOgBoIAUgBSADQegAahD9FBDIGCEFCyADQbMCNgKcASADIAU2ArgBQQEhCCADQQE2AkwgA0H89uAANgJIIANCATcCVCADIANBuAFqNgKYASADIANBmAFqNgJQIANB8ABqIANByABqEPAUIANBGGogBBCzFCADIAI2AmwgA0E0OgBoIAMoAhggAygCHCADQegAahD9FCECIAQQ5w0iBEUNBCAEKAIAQSRHDQQgASABKQNANwN4IAEoAiggAUElNgIoQSRHDQEgASABKAIsEIYMDAQLIAQQ1SAhCSAEEOcNIgJFDQEgAigCAEECRw0BIAItAAgNASACLQAJQRRHDQEgA0HdAGogAUGXA2opAAA3AAAgA0HYAGogAUGSA2opAAA3AwAgA0HQAGogAUGKA2opAAA3AwAgAyABKQCCAzcDSCAEENsSIgJFDQEgAigCAEECRw0BIANByABqIAItAAggAkEJai0AABDdCQ0BIAQQ5w0iAkUEQCABKALYAiEBIANBADoAaCABIAEgA0HoAGoQ/RQhAgwDCyACKAIAQSRGBEAgASABKQNANwN4IAEoAiggAUElNgIoQSRGBEAgASgCLCECDAQLQd3r4ABBKEHo898AEO4XAAsgASgCKCECIAFBJTYCKCABIAEpA0A3A3ggA0H0AGogAUE0aikCADcCACADQfwAaiABQTxqKAIANgIAIAMgASkCLDcCbCADIAI2AmggA0HoAGoiAhDDCkEBIQUgBBDnDQ0BIAEoAtgCIQEgA0EAOgBoIAEgASACEP0UIQIMAgtB3evgAEEoQdjz3wAQ7hcACyADQf0AaiABQZcDaikAADcAACADQfgAaiABQZIDaikAADcDACADQfAAaiABQYoDaikAADcDACADIAEpAIIDNwNoAkAgBBDnDSICRQ0AIAIoAgBBAkcNACADQegAaiACLQAIIAJBCWotAAAQ3QkNACAEENsSIgJFDQAgAigCAEECRw0AIAItAAgNACACLQAJQQ5HDQAgBBC1IUEBcyEGCyAFIAZyRQRAIANBEGogAUEAIAcQhQcgAygCFCECIAMoAhAhCAwCCyADQZgBaiIKIAEQ0wQgAygCoAEhAiADKQOYASILUA0AIAMgAygCpAE2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BjYCACAEQbABaiQAC4YLAQJ/IwBBEGsiAiQAAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAQQcgACgCACIAKAIAQQxrIgMgA0EmTxtBAWsOJQECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUACyACIABBBGo2AgwgAUHL/9kAQQQgAkEMakHEAhDICgwlCyACIABBBGo2AgwgAUGJruAAQQUgAkEMakHFAhDICgwkCyACIABBBGo2AgwgAUGSruAAQQYgAkEMakHGAhDICgwjCyACIABBCGo2AgwgAUHBut8AQQIgAkEMakHHAhDICgwiCyACIABBBGo2AgwgAUHP/9kAQQUgAkEMakHIAhDICgwhCyACIABBBGo2AgwgAUHU/9kAQQYgAkEMakHJAhDICgwgCyACIABBBGo2AgwgAUHa/9kAQQMgAkEMakHKAhDICgwfCyACIAA2AgwgAUGYruAAQQYgAkEMakHLAhDICgweCyACIABBCGo2AgwgAUHZldoAQQYgAkEMakHMAhDICgwdCyACIABBCGo2AgwgAUHfldoAQQkgAkEMakHNAhDICgwcCyACIABBBGo2AgwgAUHd/9kAQQQgAkEMakHOAhDICgwbCyACIABBBGo2AgwgAUHh/9kAQQQgAkEMakHPAhDICgwaCyACIABBBGo2AgwgAUHl/9kAQQMgAkEMakHQAhDICgwZCyACIABBBGo2AgwgAUHo/9kAQQMgAkEMakHRAhDICgwYCyACIABBCGo2AgwgAUGEruAAQQUgAkEMakHSAhDICgwXCyACIABBCGo2AgwgAUHr/9kAQQMgAkEMakHTAhDICgwWCyACIABBBGo2AgwgAUHwj9oAQQMgAkEMakHUAhDICgwVCyACIABBBGo2AgwgAUHdk9oAQQkgAkEMakHVAhDICgwUCyACIABBBGo2AgwgAUHu/9kAQQUgAkEMakHWAhDICgwTCyACIABBCGo2AgwgAUG8ut8AQQUgAkEMakHXAhDICgwSCyACIABBBGo2AgwgAUHz/9kAQQUgAkEMakHYAhDICgwRCyACIABBBGo2AgwgAUH4/9kAQQggAkEMakHZAhDICgwQCyACIABB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IQYgACAFNgIEIAAgBjYCACAEQbABaiQAC+YLAgh/A34jAEGgB2siAyQAIANB+ABqQcif4wApAwAiDDcCACADQQA2AmwgA0KAgICAwAA3AmQgA0EAOgBgIANBATYCgAEgA0Gwv9gANgJcIANCgICAgBA3AlQgA0KAgICAwAA3AkwgA0ELNgIAIANBwJ/jACkDACINNwJwIANBxANqQbTb2gBBBRC2ESADQQo2AsADIANBwANqIgUQpR0hBCAFIAEgAhC2ESADIAMgBCAFEF8iBjYChAEgA0GQAWpBADsBACADQgA3A4gBIANBADYCnAEgA0KAgICAwAA3ApQBIAUgBkEIahC7ESADQaABaiIBIANBiAFqQQEgBUEAEMkFIAMgAy0AmwMgAy0AmANBAkZxOgDuBiADIAMpAaIDNwDgBiADIAMoAaoDNgDoBiADIAMvAa4DOwDsBiADIAMpALEDNwDvBiADIAMoALkDNgD3BiADIAMvAL0DOwD7BiABIANB4AZqIgQQ0AggA0HoA2ogAUH0ARD8BiEBIAMoApQDIQIgA0HgBWogA0GYA2pBKBD8BhogA0HcA2ogDDcCACADIAI2AtwGIAMgAjYC2AYgAyACNgLcBSADQSU2ArAGIANBJTYCiAYgA0EANgLQAyADQoCAgICAATcDyAMgA0EANgLAAyADQQA6AOQDIAMgDTcC1AMgAyADLQDqBToA4AYgA0EAOgDhBiADIAMtAIYGOgD8BiADIAMpAuwFNwDiBiADIAMpAvQFNwDqBiADIAMpAvwFNwDyBiADIAMvAYQGOwD6BiABIAQQ0AggARC6ICECAkACQCABEM0NIgFFBEAgAygCwAUhASADQQA6AIgHIAMgASABIANBiAdqEP0UNgKEByADQQE2AoAHDAELIANBADYCgAcgAyABNgKEByABKAIAQSNHDQAgAyADKQOgBjcD2AYgAygCiAYgA0ElNgKIBkEjRw0BIAMpA5AGIQsLIANBgAdqELkjIANBiAdqIANBwANqQQFBAUEAEIgDAkAgAygCiAciB0GAgICAeEcEQCACIAMoAtwGIgEgASACSxshASADKAKQByEJIAMoAowHIQoMAQsgAygCjAchASALEOsmQYCAgIB4IQcLIANB4AZqIgggAygCxAUQ+RAgAygC5AYhBCADQZQBaiADKALoBiICEIof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IAkQtCkFIARBMGoQrBILDAALAAsgAhD9IgsgBEHgAWokAAuRCgILfwN+IwBB4AFrIgIkAAJAIAEtABRBAkcEQCABKAIYIQQgAkE0akHIn+MAKQMAIg03AgAgAkHAn+MAKQMAIg43AiwgAkEAOwFeIAJBADYCVCACQoCAgICAATcCTCACQQA6AEggAkEANgJEIAJCgICAgMAANwI8IAJBADYCKCACQoCAgICAATcCICACIAAvATw7AVwgAiAAKAI4NgJYIAJBEGogASkDACIPIAEoAhAiCBC3IyACQSBqIAIpAxAgAigCGEEBEI4GIAJB9ABqIA03AgAgAkEANgKUASACQoCAgICAATcCjAEgAkEAOgCIASACQQA2AoQBIAJCgICAgMAANwJ8IAJBADYCaCACIA43AmwgAkEAOwGeASACIAIvAVw7AZwBIAIgAigCWDYCmAEgAkKAgICAgAE3AmAgBEEYaiEJIARBDGogBCgCCEEGdCEBIAJBjAFqIQYgAkHMAGohBSACQTxqIQcgAkEsaiELIAQoAgQhAwJAA0AgAUUNASADKAIAIQwgAUFAaiEBIANBQGshAwJAIAxBAmsOAwABAAELCyACIA8gCBC3IyACQeAAaiACKQMAIAIoAggQxxALIAJB4ABqIgEQmBogBCABEKIaIAEgCRDlIwJAAkAgAigClAEiAQRAIAsgARCAKSACQaQBaiACKAKQASACKAKUARCdCiACIAIoAqQBNgK4ASACIAIoAqgBIgE2ArABIAIgASACKAKsAUEEdCIDaiIENgK8AQNAIANFDQIgAkHgAGogASkDACABKAIIEMcQIANBEGshAyABQRBqIQEMAAsACyACQbABaiIBIAJB4ABqQSwQ/AYaIAcgARCaGiAGEIUjDAELIAIgBDYCtAEgAkGwAWoQkxcgAi0ASEUEQCACQSBqIAIoApQBEI0eIAIgAigCjAE2ArgBIAIgAigCkAEiATYCsAEgAiABIAIoApQBQQR0IgNqIgQ2ArwBA0AgAwRAIAJBIGogASkDACABKAIIQQEQjgYgA0EQayEDIAFBEGohAQwBCwsgAiAENgK0ASACQbABaiIBEJMXIAEgAkHgAGpBLBD8BhogByABEJoaDAELIAJBuAFqIAZBCGooAgA2AgAgAiAGKQIANwOwASAFIAJBsAFqIgEQohAgASAC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AkEANgI4IAJCgICAgBA3AzAMAQsgAkE4aiACQRBqKAIANgIAIAIgAikCCDcDMAsgAkHQAGogASgCDBCPAgJAIAIoAlBBgICAgHhGBEAgAkEANgJIIAJCgICAgBA3A0AMAQsgAkHIAGogAkHYAGooAgA2AgAgAiACKQJQNwNACyACQT42AiwgAkE+NgIkIAJBAjYCDCACQbDI3wA2AgggAkICNwIUIAIgAkFAazYCKCACIAJBMGo2AiAgAiACQSBqNgIQIAAgAkEIahCJFSACKAJAIAIoAkQQ1ikgAigCMCACKAI0ENYpDAkLIAEoAghFBEAgAkEBNgIMIAJByMjfADYCCCACQgE3AhQgAkHDAjYCJCACIAFBEGo2AiAgAiACQSBqNgIQIAAgAkEIahCJFQwJCyACQSBqIAEoAgwQjwICQCACKAIgQYCAgIB4RgRAIAJBADYCWCACQoCAgIAQNwNQDAELIAJB2ABqIAJBKGooAgA2AgAgAiACKQIgNwNQCyACQT42AkQgAkEBNgIMIAJByMjfADYCCCACQgE3AhQgAiACQdAAajYCQCACIAJBQGs2AhAgACACQQhqEIkVIAIoAlAgAigCVBDWKQwICyABLQAYQQVHDQYLIAEoAhAhAQwBCwsgASgCCA0DIAAgAUEQahDADQwECyACQdAAaiABKAIgEI8CAkAgAigCUEGAgICAeEYEQCACQQA2AkggAkKAgICAEDcDQAwBCyACQcgAaiACQdgAaigCADYCACACIAIpAlA3A0ALIAJBwwI2AiwgAkE+NgIkIAJBAjYCDCACQbDI3wA2AgggAkICNwIUIAIgAUEIajYCKCACIAJBQGs2AiAgAiACQSBqNgIQIAAgAkEIahCJFSACKAJAIAIoAkQQ1ikMAwsgAkEIaiABKAIgEI8CAkAgAigCCEGAgICAeEYEQCACQQA2AjggAkKAgICAEDcDMAwBCyACQThqIAJBEGooAgA2AgAgAiACKQIINwMwCyACQdAAaiABKAIEEI8CAkAgAigCUEGAgICAeEYEQCACQQA2AkggAkKAgICAEDcDQAwBCyACQcgAaiACQdgAaigCADYCACACIAIpAlA3A0ALIAJBPjYCLCACQT42AiQgAkECNgIMIAJBsMjfADYCCCACQgI3AhQgAiACQUBrNgIoIAIgAkEwajYCICACIAJB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IAEgBUkEQCAEIAFBAnRqIBCnQQFqNgIACyACIAVPDQEgBCACQQJ0aiAQQiCIp0EBajYCAAwBC0EAIQcLIAAgCDYCBCAAIAc2AgAgBkHAAWokAAuYCgIKfwN+IwBBsAFrIgIkACABQShqIgQQ1SAhCCACQdUAaiABQZcDaikAADcAACACQdAAaiABQZIDaikBACIMNwIAIAJByABqIAFBigNqKQEAIg03AgAgAkEAOgCDASACIAEtAJwDOgCCASACIAEtAJ4DOgCEASACIAEpAYIDIg43AGggAiANNwBwIAIgDDcAeCACIAEvAZoDOwCAASACIA43AkAgAUGAAWoiByACQegAahDICCACIAE2AjwgAkEwaiABENgBIAIoAjQhBQJAAkACQAJAAkACQCACKAIwBEAgBSEDDAELIAQQsiENBCAEEOcNIgNFDQQgAygCAEECRw0EIAMtAAhBAkcNBCADLQAJQRpHDQQgASgCKCEDIAFBJTYCKCABIAEpA0A3A3ggAkH0AGoiBiABQTRqKQIANwIAIAJB/ABqIgkgAUE8aigCADYCACACIAEpAiw3AmwgAiADNgJoIAJB6ABqIgsQwwogAiAFNgJgIAJBgQFqIAFBggNqIgNBFWopAAA3AAAgCSADQRBqKQEANwIAIAYgA0EIaikBADcCACACQQE6AKsBIAIgAS0AnAM6AKoBIAIgAS0AngM6AKwBIAIgASkBggM3AJABIAIgASkBigM3AJgBIAIgASkBkgM3AKABIAIgAS8BmgM7AKgBIAIgAykBADcCbCAHIAJBkAFqEMgIIAIgATYCaCACQShqIAEQ2AEgAigCLCEDAkAgAigCKEUEQCACIAM2AmQgCxCgJgJAAkAgBBDnDSIHBEAgBygCAEEXRg0BCyACQfAAaiAEEOsLIAJBCGogBBCzFCACQYDg3wA2AmwgAkE0OgBoIAIoAgggAigCDCACQegAahD9FCEDIAQQ5w0iBUUNASAFKAIAQSRHDQEgASABKQNANwN4IAEoAiggAUElNgIoQSRHDQcgASABKAIsEIYMDAELIAEoAighByABQSU2AiggASABKQNANwN4IAJB9ABqIAFBLGoiBkEIaikCADcCACACQfwAaiAGQRBqKAIANgIAIAIgBikCADcCbCACIAc2AmggAkHoAGoQwwogAkEgaiABEJQCIAIo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QRBqEK0kDA4LIAJBADYCICACQQE2AhQgAkGkmNgANgIQIAJCBDcCGCABKAIUIAEoAhggAkEQahCtJAwNCyACQQA2AiAgAkEBNgIUIAJBzJjYADYCECACQgQ3AhggASgCFCABKAIYIAJBEGoQrSQMDAsgAiAAKAIENgIIIAJBAjYCFCACQfSY2AA2AhAgAkIBNwIcIAJBCTYCLCACIAJBKGo2AhggAiACQQhqNgIoIAEoAhQgASgCGCACQRBqEK0kDAsLIAIgACgCBDYCCCACQQE2AhQgAkGgmdgANgIQIAJCATcCHCACQQk2AiwgAiACQShqNgIYIAIgAkEIajYCKCABKAIUIAEoAhggAkEQahCtJAwKCyACIAAoAgQ2AgggAkEBNgIUIAJBwJnYADYCECACQgE3AhwgAkEJNgIsIAIgAkEoajYCGCACIAJBCGo2AiggASgCFCABKAIYIAJBEGoQrSQMCQsgAkEANgIgIAJBATYCFCACQfSZ2AA2AhAgAkIENwIYIAEoAhQgASgCGCACQRBqEK0kDAgLIAJBADYCICACQQE2AhQgAkGcmtgANgIQIAJCBDcCGCABKAIUIAEoAhggAkEQahCtJAwHCyACIAA2AgggAkEBNgIUIAJBzJrYADYCECACQgE3AhwgAkEINgIsIAIgAkEoajYCGCACIAJBCGo2AiggASgCFCABKAIYIAJBEGoQrSQMBgsgAkEANgIgIAJBATYCFCACQfia2AA2AhAgAkIENwIYIAEoAhQgASgCGCACQRBqEK0kDAULIAJBADYCICACQQE2AhQgAkGkm9gANgIQIAJCBDcCGCABKAIUIAEoAhggAkEQahCtJAwECyACQQA2AiAgAkEBNgIUIAJBzJvYADYCECACQgQ3AhggASgCFCABKAIYIAJBEGoQrSQMAwsgAkEANgIgIAJBATYCFCACQeSb2AA2AhAgAkIENwIYIAEoAhQgASgCGCACQRBqEK0kDAILIAIgAC0ACDoADCACIAAoAgQ2AgggAkEBNgIUIAJBjJzYADYCECACQgE3AhwgAkH+ATYCLCACIAJBKGo2AhggAiACQQhqNgIoIAEoAhQgASgCGCACQRBqEK0kDAELIAIgACgCBDYCCCACQQE2AhQgAkGwnNgANgIQIAJCATcCHCACQeIANgIsIAIgAkEoajYCGCACIAJB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AAANABpBASAALQABDQAaQQEgAC0AAg0AGkEBIAAtAAMNABpBASAALQAEDQAaQQEgAC0ABQ0AGkEBIAAtAAYNABpBASAALQAHDQAaQQEgAC0ACA0AGkEBIAAtAAkNABpBASAALQAKDQAaQQEgAC0ACw0AGkEBIAAtAAwNABpBASAALQANDQAaQQEgAC0ADg0AGkEBIAAtAA8NABpBASAALQAQDQAaQQEgAC0AEQ0AGkEBIAAtABINABpBASAALQATDQAaQQEgAC0AFA0AGkEBIAAtABUNABpBASAALQAWDQAaQQEgAC0AFw0AGkEBIAAtABgNABpBASAALQAZDQAaQQEgAC0AGg0AGkEBIAAtABsNABpBASAALQAcDQAaQQEgAC0AHQ0AGkEBIAAtAB4NABpBASAALQAfDQAaQQEgAC0AIA0AGkEBIAAtACENABpBASAALQAiDQAaQQEgAC0AIw0AGkEBIAAtACQNABpBASAALQAlDQAaQQEgAC0AJg0AGkEBIAAtACcNABpBASAALQAoDQAaQQEgAC0AKQ0AGkEBIAAtACoNABpBASAALQArDQAaQQEgAC0ALA0AGkEBIAAtAC0NABpBASAALQAuDQAaQQEgAC0ALw0AGkEBIAAtADANABpBASAALQAxDQAaQQEgAC0AMg0AGkEBIAAtADMNABpBASAALQA0DQAaQQEgAC0ANQ0AGkEBIAAtADYNABpBASAALQA3DQAaQQEgAC0AOA0AGkEBIAAtADkNABpBASAALQA6DQAaQQEgAC0AOw0AGkEBIAAtADwNABpBASAALQA9DQAaQQEgAC0APg0AGkEBIAAtAD8NABpBASAALQBADQAaQQEgAC0AQQ0AGkEBIAAtAEINABpBASAALQBDDQAaQQEgAC0ARA0AGkEBIAAtAEUNABpBASAALQBGDQAaQQEgAC0ARw0AGkEBIAAtAEgNABpBASAALQBJDQAaQQEgAC0ASg0AGkEBIAAtAEsNABpBASAALQBMDQAaQQEgAC0ATQ0AGkEBIAAtAE4NABpBASAALQBPDQAaQQEgAC0AUA0AGkEBIAAtAFENABpBASAALQBSDQAaQQEgAC0AUw0AGkEBIAAtAFQNABpBASAALQBVDQAaQQEgAC0AVg0AGkEBIAAtAFcNABpBASAALQBYDQAaQQEgAC0AWQ0AGkEBIAAtAFoNABpBASAALQBbDQAaQQEgAC0AXA0AGkEBIAAtAF0NABpBASAALQBeDQAaQQEgAC0AXw0AGkEBIAAtAGANABpBASAALQBhDQAaQQEgAC0AYg0AGkEBIAAtAGMNABpBASAALQBkDQAaQQEgAC0AZQ0AGiAALQBmCyACIAIoAgBBAWs2AgAgAUEQaiQAQQFxDwtB5MfgAEHIABD/KgALnQoCBH8BfiMAQUBqIgIkAAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgBBAWsOBwECAwQFBgcACyABIABBCGpBABDRFSAAKAIgIAEQixogASgCMBC6ESEDIAJBGGpByJ/jACkDACIGNwMAIAJBCGogBjcDACACQTRqIAFBNGooAgA2AgAgAkEBOgAoIAIgATYCICACIAM2AiQgAkHAn+MAKQMAIgY3AxAgAiAGNwMAIAIgASkCLDcCLCACIAEtADw6ADwgAiABLwE6OwE6IAEtADghAyACIAEtAD06AD0gAiADOgA4IAJBAToAOSAAQSBqIAIQywEMBwsgACgCIEEMaiABEIsaIAEoAjAQuhEhAyACQRhqQcif4wApAwAiBjcDACACQQhqIAY3AwAgAkE0aiABQTRqKAIANgIAIAJBAToAKCACIAE2AiAgAiADNgIkIAJBAToAOSACQcCf4wApAwAiBjcDECACIAY3AwAgAiABKQIsNwIsIAIgAS0APDoAPCACIAEvATo7ATogAS0AOCEDIAIgAS0APToAPSACIAM6ADggAEEgaiACENwDDAYLIAEgACgCBBCkHQwGCyABIAAoAgQQkiEMBQsgAEEEaiABEMQIDAQLIAEtADohAyABQQE6ADogASAAKAIEIgBBCGpBBBDRFSABLQA0QQFGBEAgASgCMBC6ESEEIAJBGGpByJ/jACkDACIGNwMAIAJBCGogBjcDACACQTRqIAFBNGooAgA2AgAgAkEBOgAoIAIgATYCICACIAQ2AiQgAkEBOgA5IAJBwJ/jACkDACIGNwMQIAIgBjcDACACIAEpAiw3AiwgAiABLwA7OwA7IAEtADghBCACIAEtAD06AD0gAiAEOgA4IAJBAToAOiAAQSBqIAIQvg0gAEEkaiACENcrIAIQ/SgLIAEgAzoAOgwDCyABIAAoAgQiAEEAENEVIAEoAjAQuhEhAyACQRhqQcif4wApAwAiBjcDACACQQhqIAY3AwAgAkE0aiABQTRqKAIANgIAIAJBADoAKCACIAE2AiAgAiADNgIkIAJBAToAOSACQcCf4wApAwAiBjcDECACIAY3AwAgAiABKQIsNwIsIAIgAS0APDoAPCACIAEvATo7ATogAS0AOCEDIAIgAS0APToAPSACIAM6ADggACgCJCEEIAAoAighAyACQQAgAkEQahDvIQJAIAMEQCAEIQEgAyEAA0AgASgCAEUEQCABQQhqKQMAIgZCA4NQBEAgBqdBCGsiBSAFKAIAIgVBAWo2AgAgBUEASA0ECyACIAZBABDUCAsgAUEwaiEBIABBAWsiAA0ACwsgA0EwbCEAIARBKGohAQNAIABFDQMgASgCAARAIAEgAhDUKwsgAEEwayEAIAFBMGohAQwACwALAAsgACgCBCIAKAIARQRAIAEgAEEIakEAENEVCyABKAIwELoRIQMgAkE0aiABQTRqKAIANgIAIAJBADoAKCACQRhqQcif4wApAwAiBjcDACACQQhqIAY3AwAgAiABNgIgIAIgAzYCJCACQQE6ADkgAiABKQIsNwIsIAIgAS8BOjsBOiACQcCf4wApAwAiBjcDECACIAY3AwAgAS0AOCEDIAIgAS0APToAPSACIAM6ADggAkEBOgA8IAAtAEVBA0YNACAAQSBqIQADQCAALQAlQQJGBEAgAiAAEMoFBSACIABBCGpBABDRFSAAKAIgIQAMAQsLCyACEP0oCyACQUBrJAALsgoBAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAQQcgACgCACIAKAIAIgFBDGsiAiACQSZPG0EBaw4kAAECAwQFBgcICQoLDA0ODxAREhMiFBUWFyIYGRobHB0eHyAhIgsgAEEEahDJFyAAKAIEIABBCGooAgAQ6CkMIQsgAEEEahC9CSAAKAIEIABBCGooAgAQ3SkMIAsgAEEIahCbJSAAKAIgIgEQmBwgASgCACABQQRqKAIAEJAqIAFBDGoQ7CYgASgCGEGAgICAeEcEQCABQRhqEOcmCyABQTxqEMwdIAFBQGsQqycgAUHIAEEEENERDB8LIABBBGoQowIMHgsgAEEMahCjAgwdCyAAQQRqEKMCIABBCGoQowIM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AEHQAGsiAiQAAkADQCABKAIIIgMEQCABIANBAWsiAzYCCCABKAIEIANBA3RqIgQoAgQhAyAEKAIAIgVB/78DSyEIA0AgCCADQYCwA0lyRQRAIAFBgMADIAMQ1xhB/68DIQMMAQsgAyAFSQ0CQXAhBgNAIAZBBGoiBEUEQCADQYABTwRAQQYhBgJAAkACQAJAA0AgBkEYRgRAIAJBADYCHCACQQA2AiAgBUGAsANzQYCAxABrQf+PvH9NDQMgA0GAsANzQYCAxABrQf+PvH9NDQQgAkEQaiAFIAJBHGoQ4QkgAigCFCEBIAJBCGogAyACQSBqEOEJIAIgATYCLCACIAIoAgwiAzYCSCABIANHDQUCfwJAAkACQAJAIAFBAmsOAwECAwALIAIgATYCLCACQQE2AjQgAkGottYANgIwIAJCATcCPCACQQk2AkwgAiACQcgAajYCOCACIAJBLGo2AkggAkEwakGwttYAELodAAtBASEGIAJBK2ohBCACQSxqIQUgAkHIAGohByACQTBqIQMgAi0AISEIIAItABwhCSACLQAgIQogAi0AHQwCCyACIAItABw6ADAgAiACLQAgOgBIQQIhBiACQSlqIQQgAkEqaiEFIAJBK2ohByACQSxqIQMgAi0AIiEIIAItAB0hCSACLQAhIQogAi0AHgwBCyACIAItABw6ADAgAiACLQAgOgBIIAIgAi0AHToALCACIAItACE6ACtBAyEGIAJBJ2ohBCACQShqIQUgAkEpaiEHIAJBKmohAyACLQAjIQggAi0AHiEJIAItACIhCiACLQAfCyEBIAMgCToAACAHIAo6AAAgBSABOgAAIAQgCDoAACAAIAY6AAAgACACLQAwOgABIAAgAi0ASDoAAiAAIAItACw6AAMgACACLQArOgAEIAAgAi0AKjoABSAAIAItACk6AAYgACACLQAoOgAHIAAgAi0AJzoACAwMCwJAQX8gBnQiBCAFcSADIARxIgdHBEAgBSAEQX9zIglxDQEgAyAEckF/Rw0DCyAGQQZqIQYMAQsLIAEgBSAJciIEQQFqIAMQ1xggBCEDDAcLIAEgByADENcYIAdBAWshAwwGC0HAttYAENopAAtB0LbWABDaKQALIAJBADYCMCACQSxqIAJByABqIAJBMGpB4LbWABDZGgALIAAgAzoAAiAAIAU6AAEgAEEAOgAADAULIAZBrN/jAGohByAEIQYgBSAHKAIAIgRLIAMgBE1yDQALIAEgBEEBaiADENcYIAQhAwwACwALCyAAQQQ6AAALIAJB0ABqJAALnAcCE38DfiMAQZABayICJAAgASgCBCENIAJBCGogASgCCCIIQQhB2AAQ+RQgCEHYAGwhDiACQSRqIQkgAkEgaiEKIAJBGGohBSACQdAAaiEPIAIoAgwhCyACKAIIIhAhBgNAIAZFIAQgDkZyRQRAAn8gBCANaiIBKAIAQQVHBEAgAUEsaigCACERIAFBKGooAgAhEgJAIAFBMGoiAykDAFAEQCAPIAFBOGoQzCEgAkIANwNIDAELIAJByABqIAMQhx8LIAEoAgAiB0EERwRAAkACQAJAAkACQAJAIAdBAWsOAwECAwALAkACQAJAAkACQAJAAkACQCABQQhqKAIAQQFrDgYBAgMEBQYACyAFIAFBEGoQ/B0gAkEANgIQDAYLIAJBATYCECACIAFBFGotAAA6ABwgAiABQQxqKQIANwIUDAULIAJBAjYCECACIAFBDGopAgA3AhQMBAsgBSABQRBqELYeIAJBAzYCEAwDCyAFIAFBEGoQ7w4gAkEENgIQDAILIAFBIGopAgAhFSABQRBqKQMAEPQaIRYgAUEYaikDABD0GiEXIAIgFTcDKCACIBc3AyAgAiAWNwMYIAJBBTYCEAwBCyAFIAFBEGoQ/R0gAkEGNgIQCyACQYgBaiAKQQhqKQMANwMAIAIgCikDADcDgAEgAikDGCEXIAIpAxAhFQwECyACQRBqIAFBBGoQyRIMAgsgAUEEahDIBiEMDAILIAJBEGogAUEEahDLHSACQYgBaiAJQQhqKQIANwMAIAIgCSkCADcDgAELIAIpAhwhFyACKQIUIRUgAigCECEMCyACQfgAaiACQYgBaikDADcDACACIAIpA4ABNwNwCyACQRBqIAJByABqQSgQ/AYaIAJBQGsgAkH4AGopAwA3AwAgAiACKQNwNwM4IBUhFiAMDAELIAJByABqIAFBBGoQ6SIgAikCTCEWQQUhByACKAJICyEBIAJBiAFqIhMgAkFAaykDADcDACACIAIpAzg3A4ABIAJByABqIhQgAkEQakEoEPwGGiAEIAtqIgNBEGogFzcDACADQQhqIBY3AgAgA0EEaiABNgIAIAMgBzYCACADQRhqIAIpA4ABNwMAIANBIGogEykDADcDACADQSxqIBE2AgAgA0EoaiASNgIAIANBMGogFEEoEPwGGiAGQQFrIQYgBEHYAGohBAwBCwsgACAINgIIIAAgCzYCBCAAIBA2AgAgAkGQAWokAAuzBwECfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQEEHIAAoAgAiAUEMayICIAJBJk8bQQFrDiQAAQIbAwQFBgcICQoLDA0ODxAREhobGxMUGhUWHRsbHRcdGBkaCyAAQQRqEMkXIAAoAgQgACgCCBDoKQ8LIABBBGoQ4iYPCyAAQQhqEJQlDwsgAEEMahDlKA8LIABBBGoQ5SggAEEIahDlKA8LAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAEODAABAgMEBQYHCAkLCgsLIABBCGoQkicMCgsgAEEIahCnHAwJCyAAQQhqEIkhDAgLIABBBGoQ5SgMBwsgAEEEahDpGAwGCyAAQQRqEOsoDAULIABBBGoQ6ygMBAsgAEEEahDlKAwDCyAAQQRqEOsoDAILIABBBGoQmyoMAQsCQAJAIAAoAgQOAgABAgsgAEEIahDfIQwBCyAAQQhqEOAhCyAAQThqEOUoDwsgAEEIahCnHA8LIABBCGoQiSEPCyAAQQRqEOUoIABBCGoQ5SggAEEMahDlKA8LIAAtABhBBUYEQCAAQRBqEOUoCyAAQQRqEOQmIAAoAigQ1SgPCyAAQRBqEOUoIAAoAgRBgICAgHhHBEAgAEEEahDkJgsgACgCIBDVKA8LIABBBGoQ5iYPCyAAKQMIEPEaDwsCQAJAAkACQCAAKAIIDgYAEBABAgMSCyAAKQMQIAApAyAQiCsPCyAAKQMgEOsmDwsgACkDGCAAKAIgEKErDwsMDgsgAEEEahDPKA8LIABBBGoQ5SggACgCGBDVKCAAKAIIIgAQzyggAEEgQQQQ0REPCyAAQQRqEJQcIAAoAgQgACgCCBCMKgJAIAAoAhAiASgCAEGAgICAeEcEQCABEOcmDAELIAFBBGoQ5SgLIAFBGEEEENERIAAoAiAQuR4gAEEkahCTJw8LIABBCGoQyyMPCyAAQQxqEJQnDwsgAEEIahCVHA8LIAApAwggACkDGBCHKw8LIAAoAgQiAEFAaxDKFyAAQfwAahDlCyAAKAJ8IABBgAFqKAIAEI8qIAAoAngQ1SggAEGQAWoQ6iYgAC0APEEGRwRAIABBEGoQyhcLIABBoAFBCBDREQ8LIABBBGoQ6iYPCyAAQQRqEJsqDwsgACkDCBDxGg8LIABBBGoQ6RgLDwsgAEEEahDlKA8LIAApAxAQ8RogACkDGBDxGg8LIABBBGoQ6ygL4QcCBH8BfiMAQZABayICJAACQAJAAkACQAJAAkACfwJAIAFBKGoiBBDnDSIDBEAgAygCAEELRg0BCyACQQE6ADIgAiABLQCYAzoAMSACIAEtAJ4DOgA3IAIgASkBggM3ABsgAiABLwGWAzsALyACIAEoAZoDNgAzIAIgAUGKA2oiAykBADcAIyACIAFBkgNqIgUoAQA2ACsgAkHRAGogAUGXA2opAAA3AAAgAkHMAGogBSkBADcCACACQcQAaiADKQEANwIAIAIgASkBggM3AjwgAUGAAWogAkEbahDICCACIAE2AjggBBDnDSIDRQRAIAEoAtgCIQEgAkEAOgB4IAEgASACQfgAahD9FCEDDAcLAn8CQAJAAkAgAygCACIDQRtrDgMCAQIACyADQSRHDQAgASABKQNANwN4IAEoAiggAUElNgIoQSRGBEAgASgCLCEDDAoLQd3r4ABBKEHg6d8AEO4XAAsgAkHgAGogARCICyACKQNgIgZCAlIEQCAGp0EBcUUEQCACKQNoIQYgAigCdCEDIAIoAnAhBCACQQc6AHggASAEIAMgAkH4AGoiARDQGSACIAM2AoQBIAIgBDYCgAEgAiAGNwN4IAEQsRghA0EADAMLIAJB6ABqEPMcIQNBAAwCCyACKAJoIQNBAQwBCyACIAEQoAEgAigCBCEDIAIoAgALQQFxDQYgAkE4ahCgJkEADAELIAEoAighAyABQSU2AiggASABKQNANwN4IAJBxABqIAFBNGopAgA3AgAgAkHMAGogAUE8aigCADYCACACIAEpAiw3AjwgAiADNgI4IAJBOGoQwwogAkEQaiABEK0GIAIoAhQhAyACKAIQDQIgAiADNgJ4AkAgBBDnDSIFBEAgBSgCAEEMRg0BCyACQUBrIAQQ6wsgAkEIaiAEELMUIAJBkOTfADYCPCACQTQ6ADggAigCCCACKAIMIAJBOGoQ/RQhAyAEEOcNIgRFDQUgBCgCAEEkRg0CDAULIAEoAighBCABQSU2AiggASABKQNANwN4IAJBxABqIAFBLGoiAUEIaikCADcCACACQcwAaiABQRBqKAIANgIAIAIgASkCADcCPCACIAQ2AjggAkE4ahDDCkEBCyEBIAAgAzYCBCAAIAE6AAAMBQsgASABKQNANwN4IAEoAiggAUElNgIoQSRHDQEgASABKAIsEIYMDAILIABBAjoAACAAIAM2AgQMAwtB3evgAEEoQdDp3wAQ7hcACyAAQQI6AAAgACADNgIEIAJB+ABqELQpDAELIABBAjoAACAAIAM2AgQgAkE4ahCgJgsgAkGQAWokAAvzBwIEfwF+IwBBkAFrIgIkAAJAAkACQAJAAkACQAJ/AkAgAUEoaiIEEM0NIgMEQCADKAIAQQtGDQELIAJBAToAMiACIAEtAMACOgAxIAIgAS0AxgI6ADcgAiABKQGqAjcAGyACIAEvAb4COwAvIAIgASgBwgI2ADMgAiABQbICaiIDKQEANwAjIAIgAUG6AmoiBSgBADYAKyACQdEAaiABQb8CaikAADcAACACQcwAaiAFKQEANwIAIAJBxABqIAMpAQA3AgAgAiABKQGqAjcCPCAEIAJBG2oQ0AggAiABNgI4IAQQzQ0iA0UEQCABKAKAAiEBIAJBADoAeCABIAEgAkH4AGoQ/RQhAwwHCwJ/AkACQAJAIAMoAgAiA0Ebaw4DAgECAAsgA0EkRw0AIAEgASkD4AI3A5gDIAEoAsgCIAFBJTYCyAJBJEYEQCABKALMAiEDDAoLQd3r4ABBKEHg6d8AEO4XAAsgAkHgAGogARCCCyACKQNgIgZCAlIEQCAGp0EBcUUEQCACKQNoIQYgAigCdCEDIAIoAnAhBCACQQc6AHggASAEIAMgAkH4AGoiARC+GSACIAM2AoQBIAIgBDYCgAEgAiAGNwN4IAEQsRghA0EADAMLIAJB6ABqEPMcIQNBAAwCCyACKAJoIQNBAQwBCyACIAEQoQEgAigCBCEDIAIoAgALQQFxDQYgAkE4ahCEJUEADAELIAEoAsgCIQMgAUElNgLIAiABIAEpA+ACNwOYAyACQcQAaiABQdQCaikCADcCACACQcwAaiABQdwCaigCADYCACACIAEpAswCNwI8IAIgAzYCOCACQThqEMIKIAJBEGogARC4BiACKAIUIQMgAigCEA0CIAIgAzYCeAJAIAQQzQ0iBQRAIAUoAgBBDEYNAQsgAkFAayAEEJIQIAJBCGogBBCAFCACQZDk3wA2AjwgAkE0OgA4IAIoAgggAigCDCACQThqEP0UIQMgBBDNDSIERQ0FIAQoAgBBJEYNAgwFCyABKALIAiEEIAFBJTYCyAIgASABKQPgAjcDmAMgAkHEAGogAUHMAmoiAUEIaikCADcCACACQcwAaiABQRBqKAIANgIAIAIgASkCADcCPCACIAQ2AjggAkE4ahDCCkEBCyEBIAAgAzYCBCAAIAE6AAAMBQsgASABKQPgAjcDmAMgASgCyAIgAUElNgLIAkEkRw0BIAEgASgCzAIQ/wsMAgsgAEECOgAAIAAgAzYCBAwDC0Hd6+AAQShB0OnfABDuFwALIABBAjoAACAAIAM2AgQgAkH4AGoQ2igMAQsgAEECOgAAIAAgAzYCBCACQThqEIQlCyACQZABaiQAC4YHAgh/AX4gAUEcaiEIAkACQCABKAIMIgJFDQAgASgCFCEGIAEoAhAhCQJAA0AgBiEFAn8CfwJAAkACQCACIAlHBEAgASACQQFqIgQ2AgwCQCACLQAAIgPAQQBODQAgASACQQJqIgQ2AgwgAi0AAUE/cSEHIANBH3EhBiADQd8BTQRAIAZBBnQgB3IhAwwBCyABIAJBA2oiBDYCDCACLQACQT9xIAdBBnRyIQcgA0HwAUkEQCAHIAZBDHRyIQMMAQsgASACQQRqIgQ2AgwgBkESdEGAgPAAcSACLQADQT9xIAdBBnRyciEDCyABIAQgAmsgBWoiBjYCFCADQYCABEkNA0EqIANB/4M4Sw0FGiADQQ12Qf4BcUG41eEAai8BACADQQl2QR9xakH//wNxIgJBmxZLDQEgAkEBdEHAxeEAai8BACADQQR2QR9xakH//wNxIgJBnBZPDQIgAkEBdEHAxeEAai8BACADQQ9xagwECyABQQA2AgwMBwsgAkGcFkGA7+AAEK0QAAsgAkGcFkGQ7+AAEK0QAAsgA0EFdkH+/wNxQcDF4QBqLwEAIANBP3FqC0H//wNxIgJBxOUATw0CIAJB+PHhAGotAAALIQICfgJAIAEtABgiA0E0TQRAIAJB/wFxIgIgA0EsbGpBvNfiAGosAAAiA0EASA0BQgAMAgsgA0E1QfDu4AAQrRAAC0KAgICAECABLQAZQQFHDQAaIANBwAFxQQZ2rUIghgsgASADQT9xOgAYIAEgAkEKRjoAGSAEIQJCgICAgBCDUA0AIAggBRDwCEUNAAsgA61CIoZCgICAgIAgg1AhAgwCCyACQcTlAEGg7+AAEK0QAAtBAyECAkAgASgCACIEQQJGDQAgAUEANgIAIARBAXFFDQAgAS0AGCIEQTRNBEACfgJAIAEtAAgiBUEsSQRAIAVBCkYhBiAEQSxsIAVqQbzX4gBqLAAAIgRBAEgNAUIADAILIAVBLEHw7uAAEK0QAAtCgICAgBAgAS0AGUEBRw0AGiAEQcABcUEGdq1CIIYLIQogASgCBCEFIAEgBjoAGSABIARBP3E6ABgCQCAKQoCAgIAQg1BFBEAgCCAFEPAIDQELIAFBADYCAAwDCyAErUIihkKAgICAgCCDUCECDAILIARBNUHw7uAAEK0QAAsLIAAgBTYCACAAQQIgAkEBcSACQQNGGzoABAvXBgIKfwF+IwBBEGsiDCQAAkACQAJAAkACQAJAAkACQAJAAkAgBEEQTwRAIAZBAWshDyABKAIEIQ0gASgCAEUEQCAGRQ0JIAYgDWshCCABKQMIIREgASgCECELQQAhAkEAIQEDQCACIQkgASIHIAZqIgEgBEsNDCAHIA9qIgogBE8NA0EAIQIgESADIApqMQAAiEIBg1ANACALIAkgCSALSRsiAiAGIAIgBksbIRAgAyAHaiEKIAIhAQJ/AkADQAJAIAEgEEYEQCALIQEMAQsgASAHaiAETw0IIAEgBWotAAAgASAKai0AAEcNAiABQQFqIQEMAQsLAkACQANAIAEgCU0NAiABIAZPDQogASAHaiICIARPDQEgASAFai0AACABIApqLQAARgRAIAFBAWshAQwBCwsgCCECIA0MAwsgAiAEQYz8wQAQrRAACyAGIAlNDQggBCAHIAlqIgpLBEAgCCECIA0gBSAJai0AACADIApqLQAARw0CGgwOCyAKIARBrPzBABCtEAALQQAhAiABIAtrQQFqCyAHaiEBDAALAAsgBkUNCCABKAIQIgIgBiACIAZLGyEJIAEpAwghESACQQFrIAZPIQtBACEBA0AgBCABIgcgBmoiAUkNCyAHIA9qIgggBE8NCCARIAMgCGoxAACIQgGDUA0AIAMgB2ohCCACIQECQANAIAEgCUYEQCACIQEDQCABRQ0OIAFBAWshASALDQsgASAHaiIIIARPDQMgASAFai0AACADIAhqLQAARg0ACyAHIA1qIQEMAwsgASAHaiAETw0IIAEgBWotAAAgASAIai0AAEYEQCABQQFqIQEMAQsLIAcgAmsgAWpBAWohAQwBCwsgCCAEQfz8wQAQrRAACyAMQQhqIAEoAiggASgCLCADIAQgBSAGEPIKIAwoAgwhByAMKAIIIQ4MCQsgCiAEQdz7wQAQrRAACyAEIAIgB2oiACAAIARJGyAEQez7wQAQrRAACyABIAZB/PvBABCtEAALIAkgBkGc/MEAEK0QAAsgBCACIAdqIgAgACAESRsgBEHc/MEAEK0QAAsgASAGQez8wQAQrRAACyAIIARBzPzBABCtEAALC0EBIQ4LIAAgDjYCACAAIAc2AgQgDEEQaiQAC6gGAQt/IwBBEGsiCCQAQQEhDAJAIAJBIiADKAIQIg0RAgANAAJAIAFFBEBBACEBDAELIAAhCSABIQUCQAJAA0AgBSAJaiEOQQAhBAJAA0AgBCAJaiIKLQAAIgtB/wBrQf8BcUGhAUkgC0EiRnIgC0HcAEZyDQEgBSAEQQFqIgRHDQALIAUgB2ohBwwDCwJ/IAosAAAiBUEATgRAIAVB/wFxIQUgCkEBagwBCyAKLQABQT9xIQsgBUEfcSEJIAVBX00EQCAJQQZ0IAtyIQUgCkECagwBCyAKLQACQT9xIAtBBnRyIQsgBUFwSQRAIAsgCUEMdHIhBSAKQQNqDAELIAlBEnRBgIDwAHEgCi0AA0E/cSALQQZ0cnIhBSAKQQRqCyEJIAQgB2ohBCAIQQRqIAVBgYAEEMIDAkACQCAILQAEQYABRg0AIAgtAA8gCC0ADmtB/wFxQQFGDQAgBCAGSQ0DAkAgBkUNACABIAZLBEAgACAGaiwAAEG/f0oNAQwFCyABIAZHDQQLAkAgBEUNACABIARLBEAgACAEaiwAAEG/f0wNBQwBCyABIARHDQQLIAIgACAGaiAEIAZrIAMoAgwiBhEDAA0BAkAgCC0ABEGAAUYEQCACIAgoAgggDRECAEUNAQwDCyACIAgtAA4iByAIQQRqaiAILQAPIAdrIAYRAwANAgsCf0EBIAVBgAFJDQAaQQIgBUGAEEkNABpBA0EEIAVBgIAESRsLIARqIQYLAn9BASAFQYABSQ0AGkECIAVBgBBJDQAaQQNBBCAFQYCABEkbCyAEaiEHIA4gCWsiBQ0BDAMLCwwDCyAAIAEgBiAEQfT0wAAQ0CYACwJAIAYgB0sNAEEAIQQCQCAGRQ0AIAEgBksEQCAGIgQgAGosAABBv39MDQIMAQsgBiABIgRHDQELIAdFBEBBACEBDAILIAEgB0sEQCAEIQYgACAHaiwAAEG/f0wNASAHIQEMAgsgBCEGIAEgB0YNAQsgACABIAYgB0GE9cAAENAmAAsgAiAAIARqIAEgBGsgAygCDBEDAA0AIAJBIiANEQIAIQwLIAhBEGokACAMC6AHAQJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAQQcgACgCACIBQQxrIgIgAkEmTxtBAWsOJAABAhsDBAUGBwgJCgsMDQ4PEBESGhsbExQaFRYdGxsdFx0YGRoLIABBBGoQyRcgACgCBCAAKAIIEOgpDwsgAEEEahDiJg8LIABBCGoQziUPCyAAQQxqEIopDwsgAEEEahCLKQ8LAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAEODAABAgMEBQYHCAkLCgsLIABBCGoQ0CcMCgsgAEEIahC0HAwJCyAAQQhqEJ8hDAgLIABBBGoQiikMBwsgAEEEahD8GAwGCyAAQQRqEIwpDAULIABBBGoQjCkMBAsgAEEEahCKKQwDCyAAQQRqEIwpDAILIABBBGoQpyoMAQsCQAJAIAAoAgQOAgABAgsgAEEIahCHIgwBCyAAQQhqEIgiCyAAQThqEIopDwsgAEEIahC0HA8LIABBCGoQnyEPCyAAQQRqEIopIABBCGoQiikgAEEMahCKKQ8LIABBEGoQzyUgAEEEahDkJiAAKAIoENUoDwsgAEEQahCKKSAAKAIEQYCAgIB4RwRAIABBBGoQ5CYLIAAoAiAQ1SgPCyAAQQRqEOYmDwsgACkDCBDxGg8LAkACQAJAAkAgACgCCA4GABAQAQIDEgsgACkDECAAKQMgEIgrDwsgACkDIBDrJg8LIAApAxggACgCIBC3IA8LDA4LIABBBGoQzygPCyAAQQRqEIopIAAoAhgQ1SggACgCCCIAEM8oIABBIEEEENERDwsgAEEEahCUHCAAKAIEIAAoAggQjCoCQCAAKAIQIgEoAgBBgICAgHhHBEAgARDnJgwBCyABQQRqEIopCyABQRhBBBDRESAAKAIgELkeIABBJGoQ0ScPCyAAQQhqEOojDwsgAEEMahDSJw8LIABBCGoQlRwPCyAAKQMIIAApAxgQhysPCyAAKAIEIgBBQGsQyhcgAEH8AGoQ5QsgACgCfCAAQYABaigCABCPKiAAKAJ4ENUoIABBkAFqEOomIAAtADxBBkcEQCAAQRBqEMoXCyAAQaABQQgQ0REPCyAAQQRqEOomDwsgAEEEahCnKg8LIAApAwgQ8RoPCyAAQQRqEPwYCw8LIABBBGoQiikPCyAAKQMQEPEaIAApAxgQ8RoPCyAAQQRqEIwpC/EGAgV/AX4jAEFAaiIHJAAgB0EwaiACIAUgBiAFEOgXAkAgBy0AMEEFRwRAIAAgBykDMDcCAAwBCyAHKAI0GgJAAkACQAJAIAUEQCAHIAZBgIAIcUUiCzoAJgJAIAZBA3FFBEAgBkGAAXFFDQEgAS0ATQ0BIAdBMGogARDMESAHLQAwQQRGDQEgBykDMCIMQv8Bg0IEUQ0BIAAgDDcCAAwHCwJAIAEtAE0NACAHQTBqIAEQsBEgBy0AMEEERg0AIAcpAzAiDEL/AYNCBFINAwsgB0EAOgAmCyAGQcAAcUUNAyABLQBNQQFHDQIMAwsgBkEBcQRAIAEtAE0NBCAHQTBqIAEQsBEgBy0AMEEERg0EIAcpAzAiDEL/AYNCBFENBCAAIAw3AgAMBQsgBkGAgRBxQYABRw0DIAEtAE0NAyAHQTBqIAEQzBEgBy0AMEEERg0DIAcpAzAiDEL/AYNCBFENAyAAIAw3AgAMBAsgACAMNwIADAMLIAEgASgCLEEBajYCLAsgB0EAOgAnIAUhCQNAAkACQCAJRQRAIAdBMGogASACIAMgBiAIIAxCIIinENYBIActADBBBEYNBCAHKQMwIgxC/wGDQgRSDQEMBAsgByAMNwI0IAcgCDYCMCAHQRhqIAQQmhUgB0EoaiABIAMgBiAHQTBqIAcoAhggBygCHCAHQSdqIAdBJmoQkQQgBy0AKEEERwRAIAcpAygiDEL/AYNCBFINAQsCQCAEKAIAIgpBAkYiCA0AIAdBMGogASAEEJIKIActADBBBEYNACAHKQMwIgxC/wGDQgRSDQELIActACZFBEAgByALOgAmDAILIAEoAkRFDQEgB0EwaiABAn9BACAIDQAaIAdBEGogBEEMaigCABCOAyAHKAIUIgggCkEBcUUNABogBEEEaigCACIKIAggCCAKSRsLQQAQ7AIgBy0AMEEERg0BIAcpAzAiDEL/AYNCBFENAQsgACAMNwIADAMLIActACcEQCABIAEoAixBAWs2AiwgB0EAOgAnCyAJQQFrIQkgB0EIaiAEEJoVIARBEGohBEEBIQggBykDCCEMDAALAAsgB0EwaiABIAMgBUUgBhCvDwJAIActADBBBEcEQCAHKQMwIgxC/wGDQgRSDQELIABBBDoAAAwBCyAAIAw3AgALIAdBQGskAAuaBgECfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQEEHIAAoAgAiAkEMayIDIANBJk8bQQFrDiQAAQIUFQMEBQYHCAkXChMXCwwNDhMUFA8TExARFBQUFBQUExITCxCvESAAKAIMQQR0IQIgACgCCCEAA0AgAkUNEyAAKAIAQQJHBEAgAEEMaiABELUtCyAAQRBqIQAgAkEQayECDAALAAsgASAAQQRqEIcEDwsgAEEIaiABEOEfDwsgAEEEaiABELUtIABBCGogARC1LQ8LIABBOGoCQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAkEBaw4LAQIDBAUGBwgJCwoACyABKAIkIABBCGoQ+wUaDAoLIAEgAEEIahCrHwwJCyABIABBCGoQwSIMCAsgAEEEaiABELUtDAcLIABBBGogARDUHAwGCyAAQQRqIAEQtS0MBQsgAEEEaiABELUtDAQLIABBBGogARC1LQwDCyAAQQRqIAEQtS0MAgsgAEEEaiABELUtDAELIABBCGohAgJAAkAgACgCBEEBaw4CAQIACyACIAEQyxoMAQsgAiABELUECyABELUtDwsgASAAQQhqEKsfDwsgASAAQQhqEMEiDwsgAEEEaiABELUtIABBCGogARC1LQwNCyAALQAYQQVGBEAgAEEQaiABELUtCwwNCyAAQRBqIAEQtS0gACgCBEGAgICAeEYNCQwMCyABKAIkIABBCGoQ+wUaDwsgAEEEaiABELUtIAEgACgCCBCWGQ8LIAAoAgxBKGwhAiAAKAIIIQMDQCACBEAgAyABEIoRIAJBKGshAiADQShqIQMMAQsLIAAoAhAiACgC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BEEITw0CIAJB/wFxIgVBIE8EQEEEEOMgIQEgAEEBNgIIIAAgATYCBCAAQQE2AgAgASAFNgIADAQLIAYQrxVBBBDjICEBIABBATYCCCAAIAE2AgQgAEEBNgIAIAEgAkEDdCAEckH/AXE2AgAMAwsgA0EVOgAYIAEoAtABIAUgA0EYahCYKyEBIABBgYCAgHg2AgAgACABNgIEDAILQQQQ4yAhASAAQQE2AgggACABNgIEIABBATYCACABIAI2AgAMAQtBBBDjICEBIABBATYCCCAAIAE2AgQgAEEBNgIAIAEgAkH/AXE2AgALIANBMGokAAuOCAIGfwF+IwBBwAFrIgIkAAJAAkACQAJAAkACQAJAIAAoAgBBAWsOBwECAwYGBAUACyACIAApAwggACgCGBC3IyABIAIpAwAgAigCCEEAEI4GIABBIGogARDnLAwFCyACQTBqIAApAwgiCCAAKAIYIgYQtyMgASACKQMwIAIoAjhBARCOBiAAKAIgIgUoAghBBnQhAyAFKAIEIQACQANAIAMiBEUNASAAKAIAIQcgA0FAaiEDIABBQGshAAJAIAdBAmsOAwABAAELCyACQSBqIAggBhC3IyABIAIpAyAgAigCKBDHEAsgAkHYAGpByJ/jACkDADcCACACQQA7AYIBIAJBADYCeCACQoCAgICAATcCcCACQQA6AGwgAkEANgJoIAJCgICAgMAANwJgIAJBADYCTCACQoCAgICAATcCRCACQcCf4wApAwA3AlAgAiABLwE8OwGAASACIAEoAjg2AnwgBARAIAJBEGogCCAGELcjIAJBxABqIAIpAxAgAigCGBDHEAsgAkHwAGohBCAFQQxqIAJBxABqIgAQmBogBSAAEKIaIAAgBUEYahDlIwJAIAIoAngiAARAIAFBDGogABCAKSACQYQBaiACKAJ0IAIoAngQnQogAiACKAKEATYCmAEgAiACKAKIASIANgKQASACIAAgAigCjAFBBHQiA2oiBTYCnAEDQCADRQ0CIAJBxABqIAApAwAgACgCCBDHECADQRBrIQMgAEEQaiEADAALAAsgAkGQAWoiACACQcQAakEsEPwGGiABQRxqIAAQmhogBBCFIwwFCyACIAU2ApQBIAJBkAFqEJMXIAEtAChFBEAgASACKAJ4EI0eIAIgAigCcDYCmAEgAiACKAJ0IgA2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DQAgA0H4AGoiBSACQQhqIgQQjRUgA0HIAGogACAFQQEQaQJAAkACQEECIAMoAkhBE2siBSAFQQJPG0EBaw4CAQIACyADQfgAaiIEIAJBOBD8BhogAkEANgIQIAJCATcDCCACQQk2AgAgBBDPIAwCCyAEEPoJIAQgCUEoEPwGGgwBCyAKIANByABqQTAQ/AYaIAIQzyAgAkEJNgIAIAJBBGogA0H4AGpBNBD8BhoLIAJBOGohAgwBCwsgBikCACELIAYgAykDEDcCACADQShqIAZBCGoiAigCACIANgIAIAIgA0EYaigCADYCACADIAs3AyACQCAABEAgAyADKAIgNgKAASADIAMoAiQiAjYCfCADIAI2AnggAyACIABBBHRqNgKEASADQSxqIgAgA0H4AGoiAhC6BiADQT5qQgA3AQAgA0HaAGpCADcBACADQgA3AjggA0IANwJUIANCgICAgIABNwJIIANBADYCUCADIAAQ1BY2AowBIANBAjYCiAEgA0ERNgKAASADQQk2AnggASACEPYZIANByABqEPImDAELIANBIGoQhSMLIANBsAFqJAALxAcBBn8jAEHQAGsiAyQAIAFBKGoiBBC6ICEGAkACQAJAAkACQAJAAkACQAJAIAIEQAJAAkAgBBDNDSIFRQ0AIAUoAgBBAkcNACAFLQAIQQJHDQAgBS0ACUEWRg0BCyADQTBqIAQQkhAgA0EIaiAEEIAUIANBiO7fADYCLCADQTQ6ACggAygCCCADKAIMIANBKGoQ/RQhAiAEEM0NIgRFDQkgBCgCAEEkRg0CDAkLIAEoAsgCIQUgAUElNgLIAiABIAEpA+ACNwOYAyADQTRqIAFB1AJqKQIANwIAIANBPGogAUHcAmooAgA2AgAgAyABKQLMAjcCLCADIAU2AiggA0EoahDCCgsgA0EgaiABQQBBARDNDiADKAIkIQcCQAJAIAMoAiBFBEACQCAEEM0NIgUEQCAFKAIAQQlGDQELIANBMGogBBCSECADQRBqIAQQgBQgA0Go5d8ANgIsIANBNDoAKCADKAIQIAMoAhQgA0EoahD9FCECIAQQzQ0iBEUNCSAEKAIAQSRGDQMMCQsgASgCyAIhBSABQSU2AsgCIAEgASkD4AI3A5gDIANBNGogAUHUAmopAgA3AgAgA0E8aiABQdwCaigCADYCACADIAEpAswCNwIsIAMgBTYCKCADQShqIgUQwgogBSABEK8CIAMoAiwhBSADKAIoIghBgICAgHhGDQEgAyADKAIwNgJMIAMgBTYCSCADIAg2AkRBACEFAkAgBBDNDSIERQ0AIAQoAgBBE0cNACADQRhqIAFB2N/fABDxASADKAIcIQUgAygCGEUNACAAQQI2AgAgACAFNgIEDAgLIAMgBTYCKCABEMkGIgRFDQYgAEECNgIAIAAgBDYCBCADQShqEPkmDAcLIABBAjYCACAAIAc2AgQMCgsgAEECNgIAIAAgBTYCBAwHCyABIAEpA+ACNwOYAyABKALIAiABQSU2AsgCQSRHDQEgASABKALMAhD/CwwFCyABIAEpA+ACNwOYAyABKALIAiABQSU2AsgCQSRHDQEgASABKALMAhD/CwwGC0Hd6+AAQShB+O3fABDuFwALQd3r4ABBKEGg7t8AEO4XAAsgAEEEaiIEIAMpAkQ3AgAgACAHNgIcIAAgBTYCGCAAIAI2AgAgBEEIaiADQcwAaigCADYCACAAIAYgASgCnAMiASABIAZJGzYCFCAAIAYgASABIAZLGzYCEAwECyADQcQAahDuJgwBCyAAQQI2AgAgACACNgIECyAHENkoDAELIABBAjYCACAAIAI2AgQLIANB0ABqJAALqwcBBn8jAEHQAGsiAyQAIAFBKGoiBBDVICEGAkACQAJAAkACQAJAAkACQAJAIAIEQAJAAkAgBBDnDSIFRQ0AIAUoAgBBAkcNACAFLQAIQQJHDQAgBS0ACUEWRg0BCyADQTBqIAQQ6wsgA0EIaiAEELMUIANBiO7fADYCLCADQTQ6ACggAygCCCADKAIMIANBKGoQ/RQhAiAEEOcNIgRFDQkgBCgCAEEkRg0CDAkLIAEoAighBSABQSU2AiggASABKQNANwN4IANBNGogAUE0aikCADcCACADQTxqIAFBPGooAgA2AgAgAyABKQIsNwIsIAMgBTYCKCADQShqEMMKCyADQSBqIAFBAEEBENEOIAMoAiQhBwJAAkAgAygCIEUEQAJAIAQQ5w0iBQRAIAUoAgBBCUYNAQsgA0EwaiAEEOsLIANBEGogBBCzFCADQajl3wA2AiwgA0E0OgAoIAMoAhAgAygCFCADQShqEP0UIQIgBBDnDSIERQ0JIAQoAgBBJEYNAwwJCyABKAIoIQUgAUElNgIoIAEgASkDQDcDeCADQTRqIAFBNGopAgA3AgAgA0E8aiABQTxqKAIANgIAIAMgASkCLDcCLCADIAU2AiggA0EoaiIFEMMKIAUgARCwAiADKAIsIQUgAygCKCIIQYCAgIB4Rg0BIAMgAygCMDYCTCADIAU2AkggAyAINgJEQQAhBQJAIAQQ5w0iBEUNACAEKAIAQRNHDQAgA0EYaiABQdjf3wAQ8wEgAygCHCEFIAMoAhhFDQAgAEECNgIAIAAgBTYCBAwICyADIAU2AiggARDKBiIERQ0GIABBAjYCACAAIAQ2AgQgA0EoahCPKAwHCyAAQQI2AgAgACAHNgIEDAoLIABBAjYCACAAIAU2AgQMBwsgASABKQNANwN4IAEoAiggAUElNgIoQSRHDQEgASABKAIsEIYMDAULIAEgASkDQDcDeCABKAIoIAFBJTYCKEEkRw0BIAEgASgCLBCGDAwGC0Hd6+AAQShB+O3fABDuFwALQd3r4ABBKEGg7t8AEO4XAAsgAEEEaiIEIAMpAkQ3AgAgACAHNgIcIAAgBTYCGCAAIAI2AgAgBEEIaiADQcwAaigCADYCACAAIAYgASgCfCIBIAEgBkkbNgIUIAAgBiABIAEgBksbNgIQDAQLIANBxABqEO4mDAELIABBAjYCACAAIAI2AgQLIAcQ2SgMAQsgAEECNgIAIAAgAjYCBAsgA0HQAGokAAuhCAELfyMAQSBrIgMkACAAKAIAIgEoAgAhBSABQQA2AgAgBSgCFCEBIAVBADYCFCABBEAgA0EIaiABEQEAAkAgACgCBCIJKAIAIgUoAgAiAEUNACAAIAAoAgAiAEEBazYCACAAQQFGBEAgBSgCACIAKAIIIgEgASgCACIBQQFrNgIAIAFBAUYEQCAAQQhqELcOCyAAKAIQIgEgASgCACIBQQFrNgIAIAFBAUYEQCAAQRBqEJ8VCwJAIAUoAgAiAEF/Rg0AIAAgACgCBCIBQQFrNgIEIAFBAUcNACAAQRRBBBDREQsLIAUoAgQiASgC8AUhACABKAL0BSICKAIAIgYEQCAAIAYRAQALIAIoAgQiBgRAIAAgBiACKAIIENERCyABQYAGaigCACEKIAEoAoQGIQtBACEGA0AgBiALRwRAIAogBkEGdGoiAkEEaiEIIAIoAgwhACACQQhqKAIAIQcDQCAABEAgBygCACICKAIUIgQgBCgCACIEQQFrNgIAIARBAUYEQCACQRRqEL8UCyACKAIIIAJBDGooAgAQ2SkgAigC6AQiBEGAgICAeEcEQCAEIAJB7ARqKAIAEN0pIAJB9ARqEN8mIAJBpAVqEN8mCyACKALUBSIEQYCAgIB4RwRAIAQgAkHYBWooAgAQ3SkgAigC4AUgAkHkBWooAgAQ2SkLIAIoAtgEIgRBgICAgHhHBEAgBCACQdwEaigCABDZKQsgAigCyARBAkcEQCACQdgBahCaDiACQZgDahCaDgsgAigCyAFBAkcEQCACQRhqEJoOCyACQfAFQQgQ0REgAEEBayEAIAdBBGohBwwBCwsgCCgCACAIQQRqKAIAQQRBBBDLIiAGQQFqIQYMAQsLIAEoAvwFIAFBgAZqKAIAQcAAQcAAEMsiAkAgASgCAEECRg0AIAEoAhQiACAAKAIAIgBBAWs2AgAgAEEBRgRAIAFBFGoQvxQLIAEoAgggAUEMaigCABDZKSABKALoBCIAQYCAgIB4RwRAIAAgAUHsBGooAgAQ3SkgAUH0BGoQ3yYgAUGkBWoQ3yYLIAEoAtQFIgBBgICAgHhHBEAgACABQdgFaigCABDdKSABKALgBSABQeQFaigCABDZKQsgASgC2AQiAEGAgICAeEcEQCAAIAFB3ARqKAIAENkpCyABKALIBEECRwRAIAFB2AFqEJoOIAFBmANqEJoOCyABKALIAUECRg0AIAFBGGoQmg4LIAFBiAZBCBDRESAFKAIIIgAgACgCACIAQQFrNgIAIABBAUcNACAFQQhqEPUXCyAJKAIAIgAgAykCCDcCACAAQQhqIANBEGopAgA3AgAgA0EgaiQAQQEPCyADQQA2AhggA0EBNgIMIANBsPfgADYCCCADQgQ3AhAgA0EIakGY+OAAELodAAulBwEBfyMAQfAAayIPJAAgDyANNgIEIA8gDDYCAEEBIQ0CQCAAIAEgAiAEEJsLDQAgACABIAIgBSADIAYgB0EAELQDDQAgCEEEaiEHIAkgCkEDdGohBSAPQTxqIQYgCCgCBCEKQQEhAANAIAUgCUchAyAFIAlGBEAgAyENDAILIAAgCSgCBEEBaiIEIAAgBEsbIgwgAGshACAJQQhqIQQDQCAARQRAIAkoAgAiACgCACALEKUKBEACQAJAAkACQCAOQf8BcUEBaw4CAQIACyAPQSxqIAgoAgAQwBIgD0EgaiIDIA8oAjAiACAPKAI0QQIQtQcgD0EFNgJkIA9BPjYCXCAPQeIANgJUIA8gCEEkajYCUCAPQQM2AjwgD0H40N8ANgI4IA9CAzcCRCAPIA82AmAgDyADNgJYIA8gD0HQAGo2AkAgD0EUaiAPQThqEPgUIA8oAiAgDygCJBDWKSAPKAIsIAAQ1ikgD0EQaiAPQRxqKAIANgIAIA8gDykCFDcDCAwCCyAPQQQ2AjwgD0GQ0d8ANgI4IA9CBDcCRCAPQQU2AmwgD0HiADYCZCAPQeIANgJcIA9B4gA2AlQgDyAINgJYIA8gCEE8ajYCYCAPIAhBJGo2AlAgDyAPQdAAajYCQCAPIA82AmggD0EIaiAPQThqEPgUDAELIA9BAjYCVCAPQeTM3wA2AlAgD0ICNwJcIA9BBTYCRCAPQeIANgI8IA8gBzYCOCAPIA9BOGo2AlggDyAPNgJAIA9BCGogD0HQAGoQ+BQLIA9BxABqIAtBHGovAQA7AQAgD0ECNgJUIA9B9MzfADYCUCAPQgE3AlwgD0HgADYCMCAPIAspAhQ3AjwgDyAPQSxqNgJYIA8gD0E4ajYCLCAPIA9BCGo2AjggASAPQdAAaiACKAIUEQIAIQ0gDygCCCAPKAIMENYpDAQLIA9BLGoiCSAKEMASIAYgACgCACIAKQIUNwIAIAZBCGogAEEcai8BADsBACAPQQE2AlQgD0H89uAANgJQIA9CATcCXCAPQeAANgIkIA8gD0EgajYCWCAPIAk2AjggDyAPQThqNgIgIAEgD0HQAGogAigCFBECACAPKAIsIA8oAjAQ1ikgAyENDQMgDEEBaiEAIAQhCQwCCyAPQQA2AmBBASENIA9BATYCVCAPQbDR3wA2AlAgD0IENwJYIAEgD0HQAGogAigCFBECAA0CIABBAWshAAwACwALAAsgD0HwAGokACANC4wHAQ1/AkACQCABLQAcIgJBA0YNACABLQAdIgxBA0YgAiAMS3INAEEHQQogAS0ACCIHQQNJGyENIAEoAhAiA0EEaiEIIAMgASgCGCIJQQFqQQAgCRtqIgNBCGohCSADQQJqIQsgASgCACEEIAEtAB5BAXEhDiABKAIEIgMhBQNAAkACQAJAAkACQAJAAkACQAJAAkACQCACQf8BcUEBaw4CAQIACyAIIQICQAJAAkACQAJAIAdBAWsOBgAEAgEEAwILIAkhAgwBCyALIQILIAINAQtBASECIAFBAToAHAwKCyABQQE6ABxBBiEDAkACQAJAAkACQAJAIAdBAWsOBQEFAgMEAAsgCCEDDAQLIAkhAwwDCyAIIQMMAgsgCyEDDAELQQIhAwsgAyAFSw0CQQYhAgJAAkACQAJAAkACQCAHQQFrDgUBBQIDBAALIAghAgwECyAJIQIMAwsgCCECDAILIAshAgwBC0ECIQILIAIgBUsNAyAAIAM2AhggACAENgIUIAAgBzoAACABIAUgAms2AgQgASACIARqNgIAIAAgASkACTcAASAAQQlqIAFBEWopAAA3AAAgAEEQaiABQRhqKAAANgAADwsgAUECOgAcAkAgDkUEQEECIQIgBw4HCgoKBgYKAQYLIAVFDQQgAEEGOgAADAwLIANFBEBBACEDDAkLAkAgA0EBRiAELQAAIgZBLkdyRQRAIAQtAAFBL0cNCgwBCyADQQFHIAZBLkdyDQkLIAVFDQUgAEEHOgAADAsLIANFDQZBACECAn8DQEEBIAIgBGotAABBL0YNARogAyACQQFqIgJHDQALIAMhAkEACyEFQQkhCgJAAkACQAJAIAIOAwIAAQMLQQkgDSAELQAAQS5HGyEKDAILIAQtAABBLkcNAUEIQQkgBC0AAUEuRhshCgwBC0EKIQoLIAMgAiAFaiIGSQ0FIAEgAyAGayIFNgIEIAEgBCAGaiIGNgIAIApBCkYEQEECIQIgBSEDIAYhBAwICyAAIAI2AgggACAENgIEIAAgCjoAAA8LIAMgBUGUsdgAEK8QAAsgAiAFQaSx2AAQrhAAC0EBQQBBxLHYABCuEAALIABBBjoAAA8LQQFBAEG0sdgAEK4QAAsgBiADQdSx2AAQrhAACyABQQM6ABwMAgsgAiAMTQ0ACwsgAEEKOgAADwsgASAFQQFrNgIEIAEgBEEBajYCAAu7BwEJfyMAQYACayIFJAAgBUEYaiABQYoDaikAADcDACAFQSBqIAFBkgNqKQAANwMAIAVBJWogAUGXA2opAAA3AAAgBSAENgIMIAUgASkAggM3AxAgAUEoaiEGIAFBgAFqIQkgBUE0ahCEICAFQagBaiENIAVB2AFqIQogBUE4aiELAkACQANAAkAgBhDnDUEBIAQbBEAgBSAGEOcNIgcEfyAHBSABKALYAiEHIAVBADoA0AEgByAHIAVB0AFqEP0UEMgYCzYC0AEgBUHQAWoiDCAFQQxqEN8bRQ0DIAwgAUEBIAMQuAIgBSgC1AEhByAFKALQASIIQRNHBEAgBUHQAGogCkEoEPwGGiACQQFxRQ0CIAggBxDJFEUNAiAFIAUtABA6AH8gBUEBOgCCASAFIAUvABE7AIABIAUgBS8BFDsAgwEgBSAFLQAWOgCFASAFIAUpABc3AIYBIAUgBSgAHzYAjgEgBSAFLwAjOwCSASAFIAUtACU6AJQBIAUgBS0AJjoAlQEgBSAFLQAnOgCWASAFIAUtACg6AJcBIAUgBSgAKTYAmAEgCSAFQf8AahDICCAGKAIAQSVGDQIgBhDnDSICRQ0CIAIoAgBBPnFBDkYNAiAGELIhDQIgBhDnDSEAIAVBswI2AqQBIAUgADYCnAEgBUEBNgLUASAFQYii4AA2AtABIAVCATcC3AEgBSAFQZwBajYCoAEgBSAFQaABajYC2AEgDEGQouAAELodAAsgAEGAgICAeDYCACAAIAc2AgQgCxDnJiAFKAJIIgAgBSgCTBCLHyAFKAJEIAAQ3SkMBAsgBUHYAWogBhDrCyAFIAYQsxQgBSAENgLUASAFQTQ6ANABIAEgBSgCACAFKAIEIAVB0AFqENAZDAILIAUgBzYCpAEgBSAINgKgASANIAVB0ABqQSgQ/AYaIAUoAjRFBEAgBUF/NgI0AkAgBSgCQCAFKAI4SQRAIAsgBUGgAWoQ9RkgBSAFKAI0QQFqNgI0DAELIAVBADYCNCAFIAc2AtQBIAUgCDYC0AEgCiAFQdAAakEoEPwGGiAFQTRqIAVB0AFqEKUEC0EAIQIMAQsLQcDd3wAQ7RQACyAGEOcNRSAERXJFBEAgASgCKCECIAFBJTYCKCABIAEpA0A3A3ggBUHcAWogAUE0aikCADcCACAFQeQBaiABQTxqKAIANgIAIAUgASkCLDcC1AEgBSACNgLQASAFQdABahDDCgsgCSAFQRBqEMgIIAAgBUE0ahCKBgsgBUGAAmokAAuCBQECfwJAAkACQAJAAkACQCAAKAIAIgAoAgAgASgCACIBKAIARw0AIAAoAgQgASgCBEcNACAALQAIIgIgAS0ACEcNAEEBIQMCQAJAAkACQAJAAkACQAJAAkACQAJAIAJBLGsODgEKCgoCAwoKBAUKCgoGAAsCQCACQZ8Baw4HCAoKCgwMDAALAkACQCACQSFrDgcOCwsPCwsBAAsCQCACQewAaw4HDQsLDQsLDgALAkAgAkH5AGsOAggNAAsCQCACQbcBaw4CDQoACyACQYIBRg0MIAJBHUcEQCACQcQARiACQdgARnINDSACQeEARg0NIAJBF0cNCyAALQAJIAEtAAlGDwsMDAsMCwsgAEEUaiABQRRqEK0jRQ0JQQAhAyAAKAIMIAEoAgxHDQgMDQtBACEDIABBFGogAUEUahCtI0UNBwwLCyAAKAIQIAAoAhQgASgCECABKAIUEO4PDwtBACEDIABBDGogAUEMahCVKkUNBSAAQRBqIAFBEGoQrSMPC0EAIQMgACgCDCABKAIMRw0EDAkLQQAhAyAAKAIMIAEoAgxHDQMMCAtBACEDIABBEGogAUEQahCyC0UNAgwIC0EAIQMgAEEQaiABQRBqELILRQ0BDAcLIAAoAhQgASgCFBCEA0UNASAAKAIMIAEoAgxHDQFBACEDIAAoAhAgASgCEEcNACAAKAIYIABBHGooAgAgASgCGCABQRxqKAIAEIoqIQMLIAMPC0EADwsgAEEQaiABQRBqELILDwsgACgCDCABKAIMRg8LIAAoAgwgAEEQaigCACABKAIMIAFBEGooAgAQiioPCyAAKAIQIAEoAhBGDwsgAEEYaiABQRhqELILC4IFAQJ/AkACQAJAAkACQAJAIAAoAgAiACgCACABKAIAIgEoAgBHDQAgACgCBCABKAIERw0AIAAtAAgiAiABLQAIRw0AQQEhAwJAAkACQAJAAkACQAJAAkACQAJAAkAgAkEsaw4OAQoKCgIDCgoEBQoKCgYACwJAIAJBnwFrDgcICgoKDAwMAAsCQAJAIAJBIWsOBw4LCw8LCwEACwJAIAJB7ABrDgcNCwsNCwsOAAsCQCACQfkAaw4CCA0ACwJAIAJBtwFrDgINCgALIAJBggFGDQwgAkEdRwRAIAJBxABGIAJB2ABGcg0NIAJB4QBGDQ0gAkEXRw0LIAAtAAkgAS0ACUYPCwwMCwwLCyAAQRRqIAFBFGoQrSNFDQlBACEDIAAoAgwgASgCDEcNCAwNC0EAIQMgAEEUaiABQRRqEK0jRQ0HDAsLIAAoAhAgACgCFCABKAIQIAEoAhQQ7g8PC0EAIQMgAEEMaiABQQxqELwqRQ0FIABBEGogAUEQahCtIw8LQQAhAyAAKAIMIAEoAgxHDQQMCQtBACEDIAAoAgwgASgCDEcNAwwIC0EAIQMgAEEQaiABQRBqELILRQ0CDAgLQQAhAyAAQRBqIAFBEGoQsgtFDQEMBwsgACgCFCABKAIUEIUDRQ0BIAAoAgwgASgCDEcNAUEAIQMgACgCECABKAIQRw0AIAAoAhggAEEcaigCACABKAIYIAFBHGooAgAQiiohAwsgAw8LQQAPCyAAQRBqIAFBEGoQsgsPCyAAKAIMIAEoAgxGDwsgACgCDCAAQRBqKAIAIAEoAgwgAUEQaigCABCKKg8LIAAoAhAgASgCEEYPCyAAQRhqIAFBGGoQsgsL1AYCBH8BfiMAQUBqIgckACAHQTBqIAIgBSAGIAUQ6BcCQCAHLQAwQQVHBEAgACAHKQMwNwIADAELIAcoAjQaAkACQAJAAkAgBQRAIAdBAToAJgJAIAZBA3FFBEAgBkGAAXFFDQEgAS0ATQ0BIAdBMGogARDMESAHLQAwQQRGDQEgBykDMCILQv8Bg0IEUQ0BIAAgCzcCAAwHCwJAIAEtAE0NACAHQTBqIAEQsBEgBy0AMEEERg0AIAcpAzAiC0L/AYNCBFINAwsgB0EAOgAmCyAGQcAAcUUNAyABLQBNQQFHDQIMAwsgBkEBcQRAIAEtAE0NBCAHQTBqIAEQsBEgBy0AMEEERg0EIAcpAzAiC0L/AYNCBFENBCAAIAs3AgAMBQsgBkGAgRBxQYABRw0DIAEtAE0NAyAHQTBqIAEQzBEgBy0AMEEERg0DIAcpAzAiC0L/AYNCBFENAyAAIAs3AgAMBAsgACALNwIADAMLIAEgASgCLEEBajYCLAsgB0EAOgAnIAUhCQNAAkACQCAJRQRAIAdBMGogASACIAMgBiAIIAtCIIinENYBIActADBBBEYNBCAHKQMwIgtC/wGDQgRSDQEMBAsgByALNwI0IAcgCDYCMCAHQRhqIAQQhxAgB0EoaiABIAMgBiAHQTBqIAcoAhggBygCHCAHQSdqIAdBJmoQkQQgBy0AKEEERwRAIAcpAygiC0L/AYNCBFINAQsgB0EwaiABIAQQkgogBy0AMEEERwRAIAcpAzAiC0L/AYNCBFINAQsgBy0AJkUEQCAHQQE6ACYMAgsgASgCREUNASAHQRBqIARBDGooAgAQjgMgBygCFCEIIAdBMGogASAEKAIAQQFGBH8gBEEEaigCACIKIAggCCAKSRsFIAgLQQAQ7AIgBy0AMEEERg0BIAcpAzAiC0L/AYNCBFENAQsgACALNwIADAMLIActACcEQCABIAEoAixBAWs2AiwgB0EAOgAnCyAJQQFrIQkgB0EIaiAEEIcQIARBEGohBEEBIQggBykDCCELDAALAAsgB0EwaiABIAMgBUUgBhCvDwJAIActADBBBEcEQCAHKQMwIgtC/wGDQgRSDQELIABBBDoAAAwBCyAAIAs3AgALIAdBQGskAAuZBwEBfyMAQfAAayIOJAAgDiAMNgIEIA4gCzYCAEEBIQwCQCAAIAEgAxCrCw0AIAAgASAEIAIgBSAGQQAQtgMNACAHQQRqIQsgCCAJQQN0aiEFIA5BPGohBiAHKAIEIQkgCigCACEEQQEhAANAIAUgCEchAiAFIAhGBEAgAiEMDAILIAAgCCgCBEEBaiIDIAAgA0sbIgogAGshACAIQQhqIQMDQCAARQRAIAgoAgAiACgCACAEEKUKBEACQAJAAkACQCANQf8BcUEBaw4CAQIACyAOQSxqIAcoAgAQuRIgDkEgaiICIA4oAjAiACAOKAI0QQIQtQcgDkEFNgJkIA5BPjYCXCAOQeIANgJUIA4gB0EkajYCUCAOQQM2AjwgDkH40N8ANgI4IA5CAzcCRCAOIA42AmAgDiACNgJYIA4gDkHQAGo2AkAgDkEUaiAOQThqEPAUIA4oAiAgDigCJBDWKSAOKAIsIAAQ1ikgDkEQaiAOQRxqKAIANgIAIA4gDikCFDcDCAwCCyAOQQQ2AjwgDkGQ0d8ANgI4IA5CBDcCRCAOQQU2AmwgDkHiADYCZCAOQeIANgJcIA5B4gA2AlQgDiAHNgJYIA4gB0E8ajYCYCAOIAdBJGo2AlAgDiAOQdAAajYCQCAOIA42AmggDkEIaiAOQThqEPAUDAELIA5BAjYCVCAOQeTM3wA2AlAgDkICNwJcIA5BBTYCRCAOQeIANgI8IA4gCzYCOCAOIA5BOGo2AlggDiAONgJAIA5BCGogDkHQAGoQ8BQLIA5BxABqIARBHGovAQA7AQAgDkECNgJUIA5B9MzfADYCUCAOQgE3AlwgDkHgADYCMCAOIAQpAhQ3AjwgDiAOQSxqNgJYIA4gDkE4ajYCLCAOIA5BCGo2AjggASAOQdAAahDGJCEMIA4oAgggDigCDBDWKQwECyAOQSxqIgggCRC5EiAGIAAoAgAiACkCFDcCACAGQQhqIABBHGovAQA7AQAgDkEBNgJUIA5B/PbgADYCUCAOQgE3AlwgDkHgADYCJCAOIA5BIGo2AlggDiAINgI4IA4gDkE4ajYCICABIA5B0ABqEMYkIA4oAiwgDigCMBDWKSACIQwNAyAKQQFqIQAgAyEIDAILIA5BADYCYEEBIQwgDkEBNgJUIA5BsNHfADYCUCAOQgQ3AlggASAOQdAAahDGJA0CIABBAWshAAwACwALAAsgDkHwAGokACAMC7sHAQh/IwBBgAJrIgUkACAFQRhqIAFBsgJqKQAANwMAIAVBIGogAUG6AmopAAA3AwAgBUElaiABQb8CaikAADcAACAFIAQ2AgwgBSABKQCqAjcDECABQShqIQYgBUE0ahCEICAFQagBaiEMIAVB2AFqIQkgBUE4aiEKAkACQANAAkAgBhDNDUEBIAQbBEAgBSAGEM0NIgcEfyAHBSABKAKAAiEHIAVBADoA0AEgByAHIAVB0AFqEP0UEKkYCzYC0AEgBUHQAWoiCyAFQQxqENAbRQ0DIAsgAUEBIAMQugIgBSgC1AEhByAFKALQASIIQRNHBEAgBUHQAGogCUEoEPwGGiACQQFxRQ0CIAggBxDJFEUNAiAFIAUtABA6AH8gBUEBOgCCASAFIAUvABE7AIABIAUgBS8BFDsAgwEgBSAFLQAWOgCFASAFIAUpABc3AIYBIAUgBSgAHzYAjgEgBSAFLwAjOwCSASAFIAUtACU6AJQBIAUgBS0AJjoAlQEgBSAFLQAnOgCWASAFIAUtACg6AJcBIAUgBSgAKTYAmAEgBiAFQf8AahDQCCABKALIAkElRg0CIAYQzQ0iAkUNAiACKAIAQT5xQQ5GDQIgBhCAIQ0CIAYQzQ0hACAFQbMCNgKkASAFIAA2ApwBIAVBATYC1AEgBUGIouAANgLQASAFQgE3AtwBIAUgBUGcAWo2AqABIAUgBUGgAWo2AtgBIAtBkKLgABC6HQALIABBgICAgHg2AgAgACAHNgIEIAoQ5yYgBSgCSCIAIAUoAkwQix8gBSgCRCAAEN0pDAQLIAVB2AFqIAYQkhAgBSAGEIAUIAUgBDYC1AEgBUE0OgDQASABIAUoAgAgBSgCBCAFQdABahC+GQwCCyAFIAc2AqQBIAUgCDYCoAEgDCAFQdAAakEoEPwGGiAFKAI0RQRAIAVBfzYCNAJAIAUoAkAgBSgCOEkEQCAKIAVBoAFqEPUZIAUgBSgCNEEBajYCNAwBCyAFQQA2AjQgBSAHNgLUASAFIAg2AtABIAkgBUHQAGpBKBD8BhogBUE0aiAFQdABahClBAtBACECDAELC0HA3d8AEO0UAAsgBhDNDUUgBEVyRQRAIAEoAsgCIQIgAUElNgLIAiABIAEpA+ACNwOYAyAFQdwBaiABQdQCaikCADcCACAFQeQBaiABQdwCaigCADYCACAFIAEpAswCNwLUASAFIAI2AtABIAVB0AFqEMIKCyAGIAVBEGoQ0AggACAFQTRqEIoGCyAFQYACaiQAC+EHAQl/IwBBoAFrIgMkACADQQA2AjBBASEFIANBATYCJCADQdzCwwA2AiAgA0IENwIoAkAgASACIANBIGoQrSQNACAAQQhqIQggACgCyAIiCUEUbCEGIAAoAqwCIQogACgCqAIhCyAAKALEAiEHAkADQAJAAkAgBgRAIAQgCUcNAUGQysMAENopAAsgAEHUAmoiBCgCACIGQQFNDQEgA0EANgIwIANBATYCJCADQfTN3wA2AiAgA0IENwIoIAEgAiADQSBqEK0kDQQgAEHQAmohBSAEIQBBACEEA0AgBCAGRg0CIAMgBDYCgAEgBSgCACAAKAIAIARBoMPDABCvHygCACEHIANBEDYCFCADQRA2AgwgAyAHNgKcASADQQI2ApgBIANBAzYCiAEgA0G4w8MANgKEASADIANBnAFqNgIQIAMgA0GAAWo2AgggA0EDOgBcIANBADYCWCADQqCAgIAQNwJQIANCgoCAgOAANwJIIANBAjYCQCADQQM6ADwgA0EINgI4IANCIDcCMCADQoCAgIDgADcCKCADQQI2AiAgAyADQSBqNgKUASADQQI2ApABIAMgA0EIajYCjAEgASACIANBhAFqEK0kDQQgBEEBaiEEDAALAAsgAyAHNgIEAkAgBCALRwRAIAQgCkcEQCADQSA2AoABDAILIANBPjYCgAEMAQsgA0HeADYCgAELIAdBFGohByADQbwBNgKYASADQRA2ApABIANB4gA2AogBIAMgA0EEajYClAEgAyADQZwBajYCjAEgAyADQYABajYChAEgAyAENgKcASADQQM6AHwgA0EANgJ4IANCoICAgCA3AnAgA0KCgICA4AA3AmggA0ECNgJgIANBAzoAXCADQQg2AlggA0KggICAEDcCUCADQoCAgIDgADcCSCADQQI2AkAgA0EDOgA8IANBADYCOCADQiA3AjAgA0KCgICA4AA3AiggA0ECNgIgIANBAzYCHCADQQQ2AgwgA0HQw8MANgIIIAMgA0EgajYCGCADQQM2AhQgBkEUayEGIARBAWohBCADIANBhAFqNgIQIAEgAiADQQhqEK0kRQ0BDAMLCyADQQA2AjAgA0EBNgIkIANB9M3fADYCICADQgQ3AiggASACIANBIGoQrSQNACADQQI2AiQgA0GEw8MANgIgIANCATcCLCADQb0BNgKIASADIAg2AoQBIAMgA0GEAWo2AihBASEFIAEgAiADQSBqEK0kDQEgA0EANgIwIANBATYCJCADQZjDwwA2AiAgA0IENwIoIAEgAiADQSBqEK0kIQUMAQtBASEFCyADQaABaiQAIAULzwYCBn8BfiMAQUBqIgMkAEEBIQICQAJAAkACQAJAAkACQAJAAkAgASgCAA4KBAgBCAIIAwgIAAgLIAEoAghBEUcNByABKAIQQQdHDQcgASgCFC0ARUEDRg0HIAEQzRkMBQsgAS0AIEUNAwwFC0ECIQIgASgCBCIBKAIAQRpGBEAgACgCCCADQQhqIAEpAwggAUEYaigCABC3IyADIAMoAhA2AjggAyADKQMIIgg3AzAgA0EwahDNHiAIEPEaQQFzIQILIAJBAkYgAnIhAgwFCyABKAIEIgEtAEENAyABLQBADQQgACgCBCADQRhqIAEpAyggAUE4aigCABC3IyADIAMoAiA2AjggAyADKQMYIgg3AzAgA0EwahDxCSECIAgQ8RoMBAsgAS0AIA0DIAEoAgwiBkUNAyADIAApAgQ3AiggAUEANgIMIAMgBjYCPCADIAFBBGo2AjBBuH8hBEEAIQICQANAIAIgBkYEQCAGIQIMAgsgAkEBaiECIANBKGogBEHIAGoiBCABKAIIaiIHELkHDQALIAcQ4hdBASEFCyACQcgAbCEEA0ACQCACIAZHBEAgA0EoaiABKAIIIARqIgcQuQdFBEAgBxDiFyAFQQFqIQUMAgsgASgCCCAFQbh/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AkEUahD3FAwDCyAFIAUgCSACQRBqIAAgEHqnQQN2IAdqIggQ2h8iExD2DiIGaiATQhmIpyIPOgAAIA0gBkEIayAJcWogDzoAACAFIAZBf3NBBXRqIgYgACgCACAIQX9zQQV0aiIIKQAANwAAIAZBGGogCEEYaikAADcAACAGQRBqIAhBEGopAAA3AAAgBkEIaiAIQQhqKQAANwAAIARBAWshBCAQQgF9IBCDIRAMAAsACyAAIAJBEGpBlwVBIBC8BAtBAAsaIAJBQGskAAwBCxCpGwALCyADIAA2AkwgAyADQcQAajYCSCADQQhqIAEoAhAgASgCFCASIANByABqQZQFEOwHIAEoAhAhACADKAIMIQICQCADKAIIRQRAIAAgAkEFdGsiAEEIayALNgIAIABBEGsiACkDACEQIAAgETcDACADKQMwEPEaDAELIAAgAmoiBC0AACEFIAMpAzAhECADKAI4IQcgBCASQhmIpyIEOgAAIAAgASgCFCACQQhrcWpBCGogBDoAACABIAEoAhxBAWo2AhwgASABKAIYIAVBAXFrNgIYIAAgAkEFdGsiAEEIayALNgIAIABBEGsgETcDACAAQRhrIAc2AgAgAEEgayAQNwMAQgAhEAsgEBDrJgwECyABIAIpAwAgAkEQaigCABCrHSABIAApAyggAEE4aigCABCrHQwDCyAAQRBqIAEQ/CMMAgsgAEEEaiABEPwsDAELAkACQCAAKAIIQQFrDgIBAgALIABBKGogARDxBQwBCyAAQShqIAEQgS0LIANB0ABqJAALgQcBA38gAC0AKCEEIABBADoAKAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAQQcgASgCACICQQxrIgMgA0EmTxtBAWsOJAABAgMEBQYHCAkKCwweHg0ODxARHhITFB4eFRYXGBkaGxweHR4LIAEoAgxBBHQhAiABKAIIIQEDQCACRQ0eIAEoAgBBAkcEQCABQQxqIAAQsi0LIAFBEGohASACQRBrIQIMAAsACyABQQRqIAAQ2QsMHAsgACABQQhqEKgfDBsLIAFBBGogABCyLQwaCyABQQxqIAAQsi0MGQsgAUEEaiAAELItIAFBCGogABCyLQwYCyABQThqAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAJBAWsOCwECAwQFBgcICQsKAAsgACABQQhqEMoYDAoLIAFBCGogABCpHwwJCyABQQhqIAAQuiIMCAsgAUEEaiAAELItDAcLIAFBBGogABDSHAwGCyABQQRqIAAQsi0MBQsgAUEEaiAAELItDAQLIAFBBGogABCyLQwDCyABQQRqIAAQsi0MAgsgAUEEaiAAELItDAELIAFBCGohAgJAAkAgASgCBEEBaw4CAQIACyACIAAQwxoMAQsgAiAAEMALCyAAELItDBcLIAFBCGogABCpHwwWCyABQQhqIAAQuiIMFQsgAUEEaiAAELItIAFBCGogABCyLSABQQxqIAAQsi0MFAsgAS0AGEEFRgRAIAFBEGogABCyLQsgAUEEaiAAEJIZDBMLIAFBEGogABCyLSABKAIEQYCAgIB4Rg0SIAFBBGogABCSGQwSCyABQQRqIAAQxBoMEQsgAUEEaiAAEMQaDBALIAFBBGogABCyLSABKAIIIAAQxBoMDwsgACABQQRqEPQPDA4LIAAgAUEIahCqHwwNCyABKAIMRQ0MIAFBDGogABCyLQwMCyABQQRqIAAQsi0MCwsgAUEEaiAAELItDAoLIAFBCGoQ7CEMCQsgASgCBCAAEKgMDAgLIAFBBGogABDWDwwHCyABQQRqIAAQsi0MBgsgAUEEaiAAELItDAULIAFBBGogABCyLQwECyABQQRqIAAQsi0MAwsgAUEEaiAAELItDAILIAFBBGogABCyLQwBCyABQQRqIAAQ0hwLIAAgBDoAKAu6BgEIfyMAQRBrIgUkACAAQQA6ADwgACgCICEDIABBADYCICAAKAIcIQIDQCADBEAgAhCoKSACQQxqKAIAENUoIANBAWshAyACQRBqIQIMAQsLIAAQkxtBACECAkAgACgCFCIBRQ0AIABBADYCFCAAQQxqIQcgACgCECIIIQYCQANAIAYhAyABIAJGBEAgASECDAILIANB2ABqIQYgAkEBaiECIAMQyQwNAAsgAxDGCEEBIQQLIAggAkHYAGxqIQMDQAJAIAEgAkcEQCADEMkMRQRAIAMQxgggBEEBaiEEDAILIAMgBEGof2xqIANB2AAQ/AYaDAELIAUgATYCDCAFIAQ2AgggBSABNgIEIAUgBzYCACAFEJoSIAAoAhQhAgwCCyADQdgAaiEDIAJBAWohAgwACwALIAAoAhAiBiACQdgAbGohBwNAAkACQAJAAkACQAJAIAcgBiIBRwRAIAFB2ABqIQYCQAJAIAEoAgAiAkEEa0EAIAJBBWtBCEkbQQFrDggIBwYFAAkEAwELAAsgAUEDOgBRIAEQjyMgASgCSEEGdCEDIAEoAkQhAgNAAkAgAwRAIAIoAgBBB0YEQCACQTBqEJMbIAJBCGohBCACLQAcQQJHBEAgBBDqJwwDCyAEEJwpDAILIAIQpikMAQsgASgCIEGAgICAeEYNCSABQSBqEKQJDAkLIAJBQGshAiADQUBqIQMMAAsACyAAQTBqEPknIABBNGoQqSkgAEE4ahCRKSAFQRBqJAAPCyABQUBrIgIQ9ycgAUEANgJAIAFBgICAGDYARSABKAIIQQVHBEAgAUEIahCPIwsgAUE8ahD5JyACEKgqIAFBMGoQkxsMBQsgAUEEahCkCQwECyABQQM6ADggAUEANgE6IAFBJGoQ+ScgAUEoahCoKiABQSxqEJMbDAMLIAFBADYARSABQQM6AEsgAUHJAGpBADsAACABQQhqEI8jIAFBPGoQ+ScgAUFAaxCoKiABQTBqEJMbDAILIAFBADoAKSABQQA7ACcgAUEDOgAkIAFBIGoQ+i0MAQsgAUEAOgA3IAFBAzoAOSABQQA7ADUgAUEIahCPIyABQTBqEPotDAALAAvOBgIUfwJ+IwBB8ABrIgMkAAJAAkACQAJAAkACQAJAAkACQAJAAkAgAigCAEEBa0ECTwRAIAFB2AFqIQ4gAUEYaiEPIABBoA1qIRAgACgCrBIhESAAKAKoEiESIAApAwAhFyAAKQOgDSEYIAItABghDSACKAIMIQogAigCCCELIAIoAhQhByAALQC8EkEBcSETIAAtAJwNQQFxIRQgAigCECIMIQYDQCADQcQAaiIIIBIgESALIAogBiAHEKkZIAMoAkRFDQsgAygCSCIJIAVJDQIgAygCTCADIA06AFwgAyAHNgJYIAMgDDYCVCADIAo2AlAgAyALNgJMIANBATYCRCADQQxqIhYgCCAMIAkQ/AkgEw0DIBhCAlENBSABKALIAUECRg0EIANBKGogECAPIBYgBBCrAiADKAIsIQQgAygCKCIIQQJGDQICQCAIQQFHBEAgBiAHTw0NIAlBf0cNAUGYicMAENopAAsgAygCMCEGIAMgDToAXCADIAc2AlggAyAMNgJUIAMgCjYCUCADIAs2AkwgAyAENgJIIANBAjYCRCADQShqIgUgA0HEAGoiCCAGIAcQ/AkgFA0HAkAgF0ICUgRAIAEoAsgEQQJGDQogA0HgAGogACAOIAUQ7QIgAygCYCIFQQJGDQUgBQ0BIAggBCAGIAMoAmgQ7RJBASEEDA8LIANBATYCSCADQYCKwwA2AkQgA0IANwJQIAMgA0HsAGo2AkwgA0HEAGpBiIrDABC6HQALIAlBf0YNCSADKAJkIQULIAlBAWohBiEEDAALAAsgAC0AnA1BAUYNByAAKQMAQgJRDQAgASgCyARBAkYNCCADQcQAaiIEIAAgAUHYAWogAhD1CSADQShqIAQQ+hcgAygCKCIEQQJHDQoLIAAgASACEKwFIQQMCQtB3evgAEEoQYiNwwAQ7hcAC0H4jMMAENopAAsgA0EBNgJIIANBgIrDADYCRCADQgA3AlAgAyADQewAajYCTCADQcQAakGYisMAELodAAtB3evgAEEoQbiMwwAQ7hcAC0HYi8MAENopAAtBqInDABDaKQALQd3r4ABBKEGojMMAEO4XAAtByIvDABDaKQALQQAhBAsgA0HwAGokACAEQQFxC64FAQh/AkAgACgCCEEBcUUiBCAAKAIAIglFcUUEQAJAIAQNACABIAJqIQcCQCAAKAIMIgpFBEAgASEEDAELIAEhBANAIAQiAyAHRg0CAn8gA0EBaiADLAAAIghBAE4NABogA0ECaiAIQWBJDQAaIANBA2ogCEFwSQ0AGiADQQRqCyIEIANrIAVqIQUgCiAGQQFqIgZHDQALCyAEIAdGDQAgBCwAABogBSACAn8CQCAFRQ0AIAIgBUsEQCABIAVqLAAAQb9/Sg0BQQAMAgsgAiAFRg0AQQAMAQsgAQsiAxshAiADIAEgAxshAQsgCUUNASAAKAIEIQcCQCACQRBPBEAgASACENYDIQQMAQsgAkUEQEEAIQQMAQsgAkEDcSEFAkAgAkEESQRAQQAhBEEAIQgMAQtBACEEIAEhAyACQQxxIgghBgNAIAQgAywAAEG/f0pqIANBAWosAABBv39KaiADQQJqLAAAQb9/SmogA0EDaiwAAEG/f0pqIQQgA0EEaiEDIAZBBGsiBg0ACwsgBUUNACABIAhqIQMDQCAEIAMsAABBv39KaiEEIANBAWohAyAFQQFrIgUNAAsLAkAgBCAHSQRAIAcgBGshBkEAIQMCQAJAAkAgAC0AIEEBaw4CAAECCyAGIQNBACEGDAELIAZBAXYhAyAGQQFqQQF2IQYLIANBAWohAyAAKAIQIQUgACgCGCEEIAAoAhQhAANAIANBAWsiA0UNAiAAIAUgBCgCEBECAEUNAAtBAQ8LDAILIAAgASACIAQoAgwRAwAEQEEBDwtBACEDA0AgAyAGRgRAQQAPCyADQQFqIQMgACAFIAQoAhARAgBFDQALIANBAWsgBkkPCyAAKAIUIAEgAiAAKAIYKAIMEQMADwsgACgCFCABIAIgACgCGCgCDBEDAAv6BgIFfwJ+IwBBwAFrIgUkACABQYIDaiEGAkAgAS0AkANBAXFFDQAgAS0A+AJBAkcNACABQShqIgcQ5w0iCEUNACAIKAIAQQ1HDQAgBSAHELMUIAUoAgQhByAFKAIAIQggBUGZAToAKCABIAggByAFQShqENAZCyAFQQA6ABYgBUEAOwAUIAVBgQI7AB4gBSADOgATIAUgAjoAEiAFIAEtAIgDOgARIAUgAS0AlAM6AB0gBSABKAGCAzYACyAFIAEvAYYDOwAPIAUgASgBjgM2ABcgBSABLwGSAzsAGyAFIAEpAJcDNwAgIAVBxABqQcif4wApAwAiCjcCACAFQQA2AjggBUKAgICAgAE3AjAgBUEAOgBMIAVBADYCKCAFQcCf4wApAwAiCzcCPCAFKAIsIQIgBUEwahD3IiAFQe0AaiAGQRVqKQAANwAAIAVB6ABqIAZBEGopAQA3AgAgBUHgAGogBkEIaikBADcCACAFIAYpAQA3AlggAUGAAWogBUELahDICCAFIAE2AlQgBUEoaiABQSgQ/AYaIAFBADYCECABQoCAgICAATcDCCABIAI2AgQgAUEANgIAIAFBADoAJCABIAs3AhQgAUEcaiAKNwIAIAUgATYCUAJAAkAgAS0A+AJBAkcNACABQShqIgIQ5w0iAwRAIAMoAgBBDUYNAQsCQCACEOcNIgNFDQACQAJAIAMoAgBBDmsOAgIBAAsgAhCyIUUNAgwBCyABKAIoIQIgAUElNgIoIAEgASkDQDcDeCAFQZwBaiABQTRqKQIANwIAIAVBpAFqIAFBPGooAgA2AgAgBSABKQIsNwKUASAFIAI2ApABIAVBkAFqEMMKCyAAQYCAgIB4NgIADAELIAVBkAFqIgkgAUEBENwSIAVB+ABqIAUoApABQQEQmQYgCRCgJiAFKAJ8IQIgBSgCeCIHQYCAgIB4RwRAIAVBhAFqIQMgBSgCgAEhBgJAIAQNACAFQbQBaiACIAYQjQ8gBSgCtAFBAUcNACAFKAK8ASEEIAUoArgBIQggBUErOgCQASABIAggBCAJENAZCyAAIAY2AgggACACNgIEIAAgBzYCACAAIAMpAgA3AgwgAEEUaiADQQhqKAIANgIADAELIABBgYCAgHg2AgAgACACNgIECyAFQShqEMwVIAVB1ABqEKAmIAVBwAFqJAALpQYBD38jAEEQayIHJAAgAC0AJSELIAAtACQhDCAAQQA7ASQgAUEwaiINIAAQsyUgAC0AJiEOIABBADoAJiABKAIQIgogASgCFCIIQdgAbGohDyAKIQQDQCAPIAQiAkcEQCACQdgAaiEEAkACQAJAAkACQAJAAkAgAigCACIDQQRrQQAgA0EFa0EISRtBAWsOCAECAwQICAUGAAsgACACEPscIAIoAkQiAyACKAJIQQZ0aiEQA0AgECADIglHBEAgA0FAayEDIAkoAgBBB0YEQCAJKAI4QQxsIQUgCSgCNCEGA0AgBQRAIAYgABDJLCAFQQxrIQUgBkEMaiEGDAELCyAJLQAcQQJHDQIgACAJQQhqELwYDAIFIAAgCRDKHgwCCwALCyACKAIgQYCAgIB4Rg0HIAAgAkEgahCZIQwHCyAAIAJBCGoQ+xwgAkEwaiAAEMosDAYLIAJBIGogABDKLAwFCyAAIAJBCGoQ+xwgAkE8aiAAELMlIAJBMGogABCTGgwECyACQSRqIAAQsyUgAkEsaiAAEJMaDAMLIAAgAkEEahCZIQwCCyACKAIIQQVHBEAgACACQQhqEPscCyACQTxqIAAQsyUgAkEwaiAAEJMaDAELCyAAIA46ACYCQCANKAIAIgNFDQACQAJAAkAgAygCACIEQSBrDgMCAQIACyAEQRJGIARBGUZyDQELIARBEEYgBEEWRnINACAEQQxrIgRBJUsNACAEQQdHDQELIAAgAxDMAQsgACALOgAlIAAgDDoAJAJAIAhFDQBBACEDIAFBADYCFCAHIAg2AgwgByABQQxqNgIAIApB2ABrIQZBACEFAkADQCAFIAhGBEAgCCEFDAILIAVBAWohBSAGQdgAaiIGKAIAQQpHDQALIAYQwwhBASEDCyAFQdgAbCEGA0ACQCAFIAhHBEAgASgCECIAIAZqIgQoAgBBCkYEQCAEEMMIIANBAWohAwwCCyAAIAYgA0Gof2xqaiAEQdgAEPwGGgwBCyAHIAg2AgQgByADNgIIIAcQmhIMAgsgBkHYAGohBiAFQQFqIQUMAAsACyAHQRBqJAALogYBAX8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkBBByAAKAIAQQxrIgEgAUEmTxtBAWsOJAABAhsDBAUGBwgJCgsMDQ4PEBESGhsbExQaFRYdGxsdFx0YGRoLIABBBGoQyRcgACgCBCAAKAIIEOgpDwsgAEEEahC9CSAAKAIEIAAoAggQ3SkPCyAAKQMIIAAtABwQtSMgACgCIBC7GA8LIABBDGoQhSkPCyAAQQRqEIUpIABBCGoQhSkPCyAAEPULIABBOGoQhSkPCyAAQQhqELMcDwsgAEEIahCdIQ8LIABBBGoQhSkgAEEIahCFKSAAQQxqEIUpDwsgAC0AGEEFRgRAIABBEGoQhSkLIABBBGoQ5CYgACgCKBDVKA8LIABBEGoQhSkgACgCBEGAgICAeEcEQCAAQQRqEOQmCyAAKAIgENUoDwsgAEEEahDmJg8LIAApAwgQ8RoPCwJAAkACQAJAIAAoAggOBgAQEAECAxILIAApAxAgACkDIBCIKw8LIAApAyAQ6yYPCyAAKQMYIAAoAiAQtyAPCwwOCyAAQQRqEM8oDwsgAEEEahCFKSAAKAIYENUoIAAoAggiABDPKCAAQSBBBBDREQ8LIABBBGoQlBwgACgCBCAAKAIIEIwqAkAgACgCECIBKAIAQYCAgIB4RwRAIAEQ5yYMAQsgAUEEahCFKQsgAUEYQQQQ0REgACgCIBC5HiAAQSRqEMsnDwsgACkDCCAALQAcELUjIABBIGoQgRYPCyAAQQxqEMwnDwsgAEEIahCVHA8LIAApAwggACkDGBCHKw8LIAAoAgQiAEFAaxDKFyAAQfwAahDlCyAAKAJ8IABBgAFqKAIAEI8qIAAoAngQ1SggAEGQAWoQ6iYgAC0APEEGRwRAIABBEGoQyhcLIABBoAFBCBDREQ8LIABBBGoQ6iYPCyAAQQRqEKYqDwsgACkDCBDxGg8LIABBBGoQ+hgLDwsgAEEEahCFKQ8LIAApAxAQ8RogACkDGBDxGg8LIABBBGoQhikLogYCDn8BfiMAQZABayICJAAgAUEoaiIOELogIQUgAkE4aiABEPIFAkACQCACKAI4RQRAIAJBgAFqIgQgAkHQAGopAwA3AwAgAkHwAGoiAyACQeAAaikDADcDACACIAIpA0g3A3ggAiACKQNYNwNoIAICfyACKQNAIhBQBEAgAkEIaiACQfgAahCcHEEDDAELIAJBGGogBCkDADcDACACQShqIAMpAwA3AwAgAiACKQN4NwMQIAIgAikDaDcDICACIBA3AwhBBQsiBDoANCABQcwCaiEGIAJBOGpBBHIhByACQTVqIQkgAkEkaiEKIAJBHWohCyACQQhqQQRyIQwDQAJAIA4QzQ0iAwRAIAMoAgBBBkYNAQsgACACQQhqQTAQ/AYaDAQLIAcgBikCADcCACABKALIAiEDIAFBJTYCyAIgASABKQPgAjcDmAMgB0EIaiAGQQhqKQIANwIAIAdBEGogBkEQaigCADYCACACIAM2AjggAkE4aiIDEMIKIAMgARDDBSACLQBMQQJGBEAgAigCOCEIDAMLIAIoAkAhCCACKQM4IhBQDQIgAigCRCEPIAEoApwDIQMCfwJAAkACQEEBIARBA2siBCAEQf8BcUEDTxtB/wFxQQFrDgIAAQILQTBBCBChICINIAJBCGpBMBD8BhpBAgwCCyACQQE2AjwgAkH4gOAANgI4IAJCADcCRCACIAJBjAFqNgJAIAJBOGpBgIHgABC6HQALIAJBQGsgDEEIaikCADcDACACQYoBaiALQQJqLQAAOgAAIAIgDCkCADcDOCACIAsvAAA7AYgBIAIoAgghDSACLQAcCyEEIAogAikDODcCACAJIAIvAYgBOwAAIApBCGogAkFAaykDADcCACAJQQJqIAJBigFqLQAAOgAAIAIgBDoANCACIA02AiAgAiAFIAMgAyAFSRs2AhwgAiAFIAMgAyAFSxs2AhggAiAPNgIUIAIgCDYCECACIBA3AwgMAAsACyACKAI8IQEgAEEGOgAsIAAgATYCAAwBCyAAQQY6ACwgACAINgIAIAJBCGoQyhcLIAJBkAFqJAALnAYCDn8BfiMAQZABayICJAAgAUEoaiIOENUgIQUgAkE4aiABEPMFAkACQCACKAI4RQRAIAJBgAFqIgQgAkHQAGopAwA3AwAgAkHwAGoiAyACQeAAaikDADcDACACIAIpA0g3A3ggAiACKQNYNwNoIAICfyACKQNAIhBQBEAgAkEIaiACQfgAahCcHEEDDAELIAJBGGogBCkDADcDACACQShqIAMpAwA3AwAgAiACKQN4NwMQIAIgAikDaDcDICACIBA3AwhBBQsiBDoANCABQSxqIQYgAkE4akEEciEHIAJBNWohCSACQSRqIQogAkEdaiELIAJBCGpBBHIhDANAAkAgDhDnDSIDBEAgAygCAEEGRg0BCyAAIAJBCGpBMBD8BhoMBAsgByAGKQIANwIAIAEoAighAyABQSU2AiggASABKQNANwN4IAdBCGogBkEIaikCADcCACAHQRBqIAZBEGooAgA2AgAgAiADNgI4IAJBOGoiAxDDCiADIAEQ5QUgAi0ATEECRgRAIAIoAjghCAwDCyACKAJAIQggAikDOCIQUA0CIAIoAkQhDyABKAJ8IQMCfwJAAkACQEEBIARBA2siBCAEQf8BcUEDTxtB/wFxQQFrDgIAAQILQTBBCBChICINIAJBCGpBMBD8BhpBAgwCCyACQQE2AjwgAkH4gOAANgI4IAJCADcCRCACIAJBjAFqNgJAIAJBOGpBgIHgABC6HQALIAJBQGsgDEEIaikCADcDACACQYoBaiALQQJqLQAAOgAAIAIgDCkCADcDOCACIAsvAAA7AYgBIAIoAgghDSACLQAcCyEEIAogAikDODcCACAJIAIvAYgBOwAAIApBCGogAkFAaykDADcCACAJQQJqIAJBigFqLQAAOgAAIAIgBDoANCACIA02AiAgAiAFIAMgAyAFSRs2AhwgAiAFIAMgAyAFSxs2AhggAiAPNgIUIAIgCDYCECACIBA3AwgMAAsACyACKAI8IQEgAEEGOgAsIAAgATYCAAwBCyAAQQY6ACwgACAINgIAIAJBCGoQyhcLIAJBkAFqJAAL+wYCBX8CfiMAQcABayIFJAACQCABLQC4AkEBcUUNACABLQCgAkECRw0AIAFBKGoiBhDNDSIHRQ0AIAcoAgBBDUcNACAFIAYQgBQgBSgCBCEGIAUoAgAhByAFQZkBOgAoIAEgByAGIAVBKGoQvhkLIAVBADoAFiAFQQA7ABQgBUGBAjsAHiAFIAM6ABMgBSACOgASIAUgAS0AsAI6ABEgBSABLQC8AjoAHSAFIAEoAaoCNgALIAUgAS8BrgI7AA8gBSABKAG2AjYAFyAFIAFBugJqIgIvAQA7ABsgBSABQb8CaiIDKQAANwAgIAVBxABqQcif4wApAwAiCjcCACAFQQA2AjggBUKAgICAgAE3AjAgBUEAOgBMIAVBADYCKCAFQcCf4wApAwAiCzcCPCAFKAIsIQYgBUEwahD3IiAFQe0AaiADKQAANwAAIAVB6ABqIAIpAQA3AgAgBUHgAGogAUGyAmopAQA3AgAgBSABKQGqAjcCWCABQShqIgIgBUELahDQCCAFIAE2AlQgBUEoaiABQSgQ/AYaIAFBADYCECABQoCAgICAATcDCCABIAY2AgQgAUEANgIAIAFBADoAJCABIAs3AhQgAUEcaiAKNwIAIAUgATYCUAJAAkAgAS0AoAJBAkcNACACEM0NIgMEQCADKAIAQQ1GDQELAkAgAhDNDSIDRQ0AAkACQCADKAIAQQ5rDgICAQALIAIQgCFFDQIMAQsgASgCyAIhAiABQSU2AsgCIAEgASkD4AI3A5gDIAVBnAFqIAFB1AJqKQIANwIAIAVBpAFqIAFB3AJqKAIANgIAIAUgASkCzAI3ApQBIAUgAjYCkAEgBUGQAWoQwgoLIABBgICAgHg2AgAMAQsgBUGQAWoiCCABQQEQyxIgBUH4AGogBSgCkAFBARCYBiAIEIQlIAUoAnwhAiAFKAJ4IgdBgICAgHhHBEAgBUGEAWohAyAFKAKAASEGAkAgBA0AIAVBtAFqIAIgBhCNDyAFKAK0AUEBRw0AIAUoArwBIQQgBSgCuAEhCSAFQSs6AJABIAEgCSAEIAgQvhkLIAAgBjYCCCAAIAI2AgQgACAHNgIAIAAgAykCADcCDCAAQRRqIANBCGooAgA2AgAMAQsgAEGBgICAeDYCACAAIAI2AgQLIAVBKGoQzBUgBUHUAGoQhCUgBUHAAWokAAucBgEKfyMAQUBqIgIkAAJAIAAtAP8BIgNB/wFHBEAgAkEANgI4QQEhBCACQQE2AiwgAkGcscMANgIoIAJCBDcCMCABKAIUIgUgASgCGCIGIAJBKGoQrSQNASADQQFqIQogAkENaiELIAJBEmohCQNAIAggCkYEQCACQQA2AjggAkEBNgIsIAJBrIraADYCKCACQgQ3AjAgBSAGIAJBKGoQrSQhBAwDCyACIAg6AAcgCARAIAJBADYCOCACQQE2AiwgAkGYxcMANgIoIAJCBDcCMCAFIAYgAkEoahCtJA0DCyACQQI2AiwgAkGsscMANgIoIAJCATcCNCACQRg2AhwgAiACQRhqNgIwIAIgAkEHajYCGCAFIAYgAkEoahCtJA0CIAhBAWohCCACLQAHIQEgAkGAgPwHNgANIAIgAToADCACIAA2AggDQCACIAsQ5BICQAJAIAItAAAEQCACLQAMIAItAAEiAyACKAIIai0AAEcNAyADIQEgAi8BECAJLQAAQRB0ciIHQQFxBEAgB0EIdiEBIAdBEHYiB0EBaiADRw0CCyACIAM6ABIgAiABOgARIAJBAToAEAwDCyACLwEQIAJBADoAECAJLQAAIgdBEHRyIgFBAXEEQCABQQh2IQEMAgsgAkEANgI4IAJBATYCLCACQbyK2gA2AiggAkIENwIwIAUgBiACQShqEK0kRQ0DDAULIAIgAzoAEiACIAM6ABEgAkEBOgAQCyACIAE6ABYgAiAHOgAXIAcgAUH/AXFHBEAgAkECNgIsIAJBvLHDADYCKCACQgI3AjQgAkEYNgIkIAJBGDYCHCACIAJBGGo2AjAgAiACQRdqNgIgIAIgAkEWajYCGCAFIAYgAkEoahCtJEUNAQwECyACQQE2AiwgAkH89uAANgIoIAJCATcCNCACQRg2AhwgAiACQRhqNgIwIAIgAkEWajYCGCAFIAYgAkEoahCtJEUNAAsLDAELIAJBADYCOCACQQE2AiwgAkGkrcAANgIoIAJCBDcCMCABKAIUIAEoAhggAkEoahCtJCEECyACQUBrJAAgBAuxBgIFfwF+IwBBkAFrIgEkAAJAAkACQAJAAkACQCAAKAIAQQRrDgQAAQIDBQsgACgCDCICKAIAIAJBDGooAgAQ9CBFDQQMAwsgACgCBCICKAIAIAJBDGooAgAQ9CBFDQMMAgsgACgCDA0BDAILIAAoAgxFDQELQRxBBBChICECEMEUIQMgAEEYaiIEKAIAIQUgBCADNgIAIAApAgAhBiAAQQA2AgAgAiAGNwIAIAJBCGogAEEIaikCADcCACACQRBqIABBEGopAgA3AgAgAkEYaiAFNgIAQQEhACABQQE2AhQgASACNgIQIAFBATYCDCABQdgAaiECA0ACQAJAAkACQAJAAkAgAEUNACABIABBAWsiADYCFCABQUBrIgMgASgCECAAQRxsaiIAQQxqKQIANwMAIAFByABqIgQgAEEUaikCADcDACABIAApAgQ3AzggACgCACIAQQhGDQAgAiABKQM4NwIAIAJBCGogAykDADcCACACQRBqIAQpAwA3AgAgASAANgJUIABBBGsOBAECAwQFCyABQQxqENUmDAYLIAEoAmAhABDBFCEDIAFBiAFqIABBGGoiBCgCADYCACABQYABaiAAQRBqKQIANwMAIAFB+ABqIABBCGopAgA3AwAgBCADNgIAIAApAgAhBiAAQQA2AgAgASAGNwNwIAFBDGogAUHwAGoQuxAMAwsgASgCWCEAEMEUIQMgAUGIAWogAEEYaiIEKAIANgIAIAFBgAFqIABBEGopAgA3AwAgAUH4AGogAEEIaikCADcDACAEIAM2AgAgACkCACEGIABBADYCACABIAY3A3AgAUEMaiABQfAAahC7EAwCCyABKAJgIQAgAUEANgJgIAFBADYCgAEgASAANgJ8IAEgAjYCeCABIAEoAlwiAzYCcCABIAMgAEEcbGo2AnQgAUEMaiABQfAAahDDBwwBCyABKAJgIQAgAUEANgJgIAFBADYCgAEgASAANgJ8IAEgAjYCeCABIAEoAlwiAzYCcCABIAMgAEEcbGo2AnQgAUEMaiABQfAAahDDBwsgAUHUAGoQ3CYgASgCFCEADAALAAsgAUGQAWokAAuqBgELfyMAQYABayICJAAgACABEJgaIAFBLGohCiABQRxqIQUgAUEMaiELIAAoAhAiCCAAKAIUQdgAbGohDCACQTBqIQYgAkEQaiEJA0AgDCAIIgNHBEAgA0HYAGohCAJAAkACQAJAAkACQAJAIAMoAgAiBEEEa0EAIARBBWtBCEkbQQFrDggBAgMECAgFBgALIAEgAxDLAwwHCyABIANBCGoQugQMBgsgA0EIaiABEMYsDAULIANBCGogARDyISADQTxqIAEQvCUgA0EwaiABEJgaDAQLIANBJGogARC8JSADQSxqIAEQmBoMAwsgCUHAn+MAKQMANwIAIAlBCGpByJ/jACkDADcCACACQQA7AUIgAkEANgI4IAJCgICAgIABNwIwIAJBADoALCACQQA2AiggAkKAgICAwAA3AiAgAkEA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IAEoAhgoAgwRAwAMAgsgASgCFEG0hNgAQQ4gASgCGCgCDBEDAAwBCyABKAIUIAAoAgQgACgCCCABKAIYKAIMEQMACyACQTBqJAALoAYCBn8CfiMAQYABayICJAAgACgCMBC6ESEEIAJBNGogAEE0aigCADYCACACQQA6ACggAkEYakHIn+MAKQMAIgg3AwAgAkEIaiAINwMAIAIgADYCICACIAQ2AiQgAkEBOgA5IAIgACkCLDcCLCACIAAtADw6ADwgAiAALwE6OwE6IAJBwJ/jACkDACIJNwMQIAIgCTcDACAALQA4IQQgAiAALQA9OgA9IAIgBDoAOCABKAIIQQxsIQcgAkHsAGohBCACQdAAaiEFIAJBLGohBiABKAIEIQADQCAHBEACQCAAKAIABEAgACACENQrDAELAkACQAJAAkACQAJAQQQgACgCBCIBKAIAQQVrIgMgA0EGTxtBAWsOBQECAwQFAAsgAUEIaiACEI8PDAULIAIgAUEIahDnISABQShqIAIQ1CsMBAsgAUEQaiACEI8PIAFBKGogAhDUKwwDCyACLQA5IQMgAkEBOgA5IAIgAUEIahDnISACIAM6ADkgAUHIAGogAhCnJSABQShqIAIQ0CMMAgsgAiABEOchIAIoAjAQuhEhAyAFQQhqIAg3AgAgBSAJNwIAIAJByABqIAg3AwAgBCAGKQIANwIAIARBCGogBkEIaigCADYCACACQQE6AGggAiADNgJkIAIgCTcDQCACIAItADw6AHwgAiACLwE6OwF6IAIgAjYCYCACLQA4IQMgAiACLQA9OgB9IAIgAzoAeCACQQA6AHkgAUEgaiACQUBrIgMQzSMgAUHoAGogAxDWKyABQcgAaiADENAjIAMQ/SgMAQsgAiABQQhqEOchIAIoAjAQuhEhAyAFQQhqIAg3AgAgBSAJNwIAIAJByABqIAg3AwAgBCAGKQIANwIAIARBCGogBkEIaigCADYCACACQQE6AGggAiADNgJkIAJBAToAeSACIAk3A0AgAiACLQA8OgB8IAIgAi8BOjsBeiACIAI2AmAgAi0AOCEDIAIgAi0APToAfSACIAM6AHggAUEoaiACQUBrIgEQ3AMgARD9KAsgAEEMaiEAIAdBDGshBwwBCwsgAhD9KCACQYABaiQAC6QIAQF/AkACQAJAAkACQAJAAkACQAJA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IAEQsy0PCyABIABBBGoQvxogASAAQRxqEJMkIABBEGogARCzLQ8LIABBEGogASgCJBDPHiABIABBKGoQlCQPCyAAQdAAaiEDIABBEGohAgJAIAAtAERBBEYEQCACIAEoAiQQzx4MAQsgAiABENAeCyABIAMQlCQPCyAAKAIMQThsIQMgACgCCCEEQQAhAANAIAAgA0YNCwJAAkACQAJAAkACQAJAAkBBBCAAIARqIgIoAgBBBGsiBSAFQQdPG0EBaw4GAQIDBAUGAAsgASACQQRqEL8aIAEgAkEYahCuJiABIAJBHGoQkyQMBgsgASACQQRqEL8aIAEgAkEYahCuJiABIAJBHGoQkyQMBQsgAkEQaigCACABEIwuIAEgAkEMahCuJgwECyACQQRqKAIAIAEQjC4gASACQRBqEK4mDAMLIAJBMGooAgAgARCMLiACIAEQ1ggMAgsgAkEQaigCACABEIwuIAEgAkEEahC/GiABIAJBHGoQriYgASACQSBqEJMkDAELIAJBBGogARCvJgsgAEE4aiEADAALAAsgACgCDEE4bCECIAAoAgghAANAIAJFDQogACgCAEEHRwRAIAAgARCKEQsgAEEwaiABEL0DIAJBOGshAiAAQThqIQAMAAsACyAAQQRqIAEQvQMgAEEIaiABEL0DIABBDGogARC9AyAAQRBqIQAMBAsgAEEQaiABENEeDwsgAEEEaiEADAILIABBBGogARC9AyAAQQhqIQAMAQsLIABBEGogARDRHiABIABBQGsQsCYgASAAQcQAahCwJg8LIAAoAghBhICAgHhIDQIMAwsgAC0AHEECRwRAIAEoAiQgAEEIahD7BRoLIAEgAEEoahCuJg8LIABBCGogARDQHgsPCyAAQQhqIAEQvhoLtQYCC38CfiMAQdAAayICJAAgASgC0AEhCAJ/AkACQCABKALAASABKALEARD0HCILQYCAxABHBEAgAUHAAWoiBhCvFSABKALkASIJIAkoAgBBAWoiBDYCACAERQ0BIAEoAtABIQQgAkEwaiAJQQhqENMdIAIoAjQhCiACKAIwIgdBADYCCANAAkAgAkEoaiABKALAASIDIAEoAsQBIgwQ9hwCQAJAAn4CQAJAIAItACgEQCACLQApIgMgC0H/AXFHDQEgAkEIaiAGIAQgASgC0AEQzhUgAigCDCEDIAIo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ASADQSBqIgQ2AgQgAkGoAmogA0EYaikDADcDACACQaACaiADQRBqKQMANwMAIAJBmAJqIANBCGopAwA3AwAgAiADKQMAIgk3A5ACIAUtAABBAUcgCaciB0EBS3INASACQZACahDLHgwCCyAAQRM2AgAMAgsgB0EERg0ACyACQcwAaiADQRxqKAIANgIAIAJBxABqIANBFGopAgA3AgAgAkE8aiADQQxqKQIANwIAIAIgBzYCMCACIAMpAgQ3AjQgAkEgaiABKAIUIgEpAwAgAUEQaigCABC3IyACKAIoIQUgAikDICEJIAJB0ABqIgEgAkEwahD+BSACQRBqIAkgBRC3IyACQgA3A9gBIAJBADoA5AEgAiACKAIYNgLgASACIAIpAxA3A9ABIAIpA0AQ9BohCiACQdABaiIGEP8UIQMgAkGwAmpCADcDACACQgA3A6gCIAIgCjcDoAIgAkEANgKYAiACQRs2ApACIAJBkAJqIggQ2CghBCABENgoIQEgAkEAOgDMASACIAE2AsgBIAJCADcDwAEgAiADNgK4ASACQgA3A7ABIAJCADcDoAEgAiAENgKcASACQQI2ApgBIAJBATYCkAEgBwRAIAoQ9BohCyACQfABakIANwMAIAJCADcD6AEgAiALNwPgASACQQA2AtgBIAJBGzYC0AEgAiAJIAUQtyMgAkIANwOYAiACQQA6AKQCIAIgAigCCDYCoAIgAiACKQMANwOQAiAIEP8UIQMgAkGQAWoQ2CghBCAGENgoIQELIAIpA0ghCyACQQA6AMwCIAIgATYCyAIgAkIANwPAAiACIAM2ArgCIAJCADcDsAIgAkIANwOgAiACIAQ2ApwCIAJBAjYCmAIgAkEBNgKQAiACQZACahDYKCEBIAAgCzcDCCAAIAE2AgQgAEESNgIAIAoQ8RogCRDxGgsgAkHQAmokAAvpBQEPfyMAQSBrIggkACAALQAAIQEgCEEYaiEKIAhBEGohDANAIANBCUshBgJ/A0AgAUEBcUUEQCABQf8BcSECIAAgAUEBciAALQAAIgEgASACRiICGzoAACACRQ0BIAhBIGokAA8LIAFBAnFFBEAgA0EBaiAGRQ0CGiABQf8BcSECIAAgAUECciAALQAAIgEgASACRhs6AAAgASACRw0BCwsCQEHQi+QAKAIADQBByIvkAEHIi+QAKAIA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DEErRg0AQdCkxABB0ABBoKXEABDuFwALIARBGGogASgCACIFQdgAaigCADYCACAEIAUpAlA3AxAgBEEIaiACEO0VIAVB0ABqIQUCQAJAIAQoAggiBkEMRgRAIARBnAFqIAVBCGooAgAiAzYCACAEQZABaiADNgIAIAQgBSkCACILNwKUASAEIAs3A4gBIARBGzYCKCAAIAEoAgQgASgCCCAEQYgBaiAEQShqEJwPDAELIAQgBCgCDCIINgIkIAQgBjYCICAGQQJPBEBBASEJAkAgARD3CEUNACABEMMMQT9HDQAgARD3CBpBACEJCyAEQYQBaiAFQQhqIgEoAgA2AgAgBEH4AGoiCiAGIAgQ2xEiB0EIaigCADYCACAEIAUpAgA3AnwgBCAHKQIANwNwIARBMGoiByAEQRhqKAIANgIAIARBPGogASgCADYCACAEQZABaiADQQhqKAIANgIAIAQgBSkCADcCNCAEQZwBaiAHKQMANwIAIARBpAFqIARBOGopAwA3AgAgBCAEKQMQNwKUASAEIAMpAgA3A4gBQQgQ4yAiASAINgIEIAEgBjYCACAEQdgAaiAKKQMANwIAIARB4ABqIARBgAFqKQMANwIAIAQgBCkDcDcCUCAEQShqIgMgBEGIAWpBJBD8BhogBCABNgJMIAQgCToAaCACQQggAxCAKhDXGCAAQQRqIAJBJBD8BhogAEEiNgIADAILIARBnAFqIAVBCGooAgAiAzYCACAEQZABaiADNgIAIAQgBSkCACILNwKUASAEIAs3A4gBIARBGzYCKCAAIAEoAgQgASgCCCAEQYgBaiAEQShqEJwPIARBIGoQxgkLIAIQ1iYLIARBsAFqJAALpwUCBH8BfiMAQeAAayIBJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCAEEBaw4KAQIDBAUGBwgJCgALIAFBGGoiAiAAQSBqKQMANwMAIAFBEGogAEEYaiIDKQMANwMAIAFBCGogAEEQaiIEKQMANwMAIAEgACkDCDcDACACEPcmIAFBNGogAykCADcCACABQSxqIAQpAgA3AgAgASAAKQIINwIkQcAAQQgQziIiAEEaNgIAIAAgASkCIDcCBCAAQQxqIAFBKGopAgA3AgAgAEEUaiABQTBqKQIANwIAIABBHGogAUE4aigCADYCAAwKCyABQShqIABBCGpBKBD8BhogAUEUNgIgIAFBIGoQ2CghAAwJCyABQShqIABBCGpBKBD8BhogAUEVNgIgIAFBIGoQ2CghAAwICyABQSxqIABBDGooAgA2AgAgAUEjNgIgIAEgACkCBDcCJCABQSBqENgoIQAMBwsgAUEsaiAAQQxqKQIANwIAIAFBMDYCICABIAApAgQ3AiQgAUEgahDYKCEADAYLIAFBLGogAEEMaikCADcCACABQSw2AiAgASAAKQIENwIkIAFBIGoQ2CghAAwFCyABQSxqIABBDGopAgA3AgAgAUEuNgIgIAEgACkCBDcCJCABQSBqENgoIQAMBAsgAUEsaiAAQQxqKAIANgIAIAFBKzYCICABIAApAgQ3AiQgAUEgahDYKCEADAMLIAFBLGogAEEMaikCADcCACABQSk2AiAgASAAKQIENwIkIAFBIGoQ2CghAAwCCyABQSxqIABBDGopAgA3AgAgAUEtNgIgIAEgACkCBDcCJCABQSBqENgoIQAMAQsgACkCBCEFIAFBMTYCICABIAU3AiQgAUEgahDYKCEACyABQeAAaiQAIAAL4AUCAn8BfgJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCAA4SAQoKCwIDDAwEBQYHCwsIDQ0JAAsgAEEEahCZJg8LIABBBGoQ5yYMCAsgAEEMahCGKA8LIAApAxAQ8RogAEEoahCaJg8LIABBBGoQmSYgAEEIahCaJiAAKAIURQ0FIABBFGoQmiYPCyAAQRBqEJkmIABBBGoQuBkgACgCBCAAKAIIEO0pDwsgAEEEahCZJg8LIAAoAgQiAEHIAGoQ5yYCQAJAAkAgACgCAEEHaw4CAQIACyAAEIgRCyAAQShqEOcmCyAAQeAAahD4JCAAQYABQQgQ0REPCwJAIAAoAgQiAkECRg0AIABBCGohASACRQRAIAEoAgAQ6igMAQsgARCZJgsgAEEYahCGKCAAQRxqEIYoIABBDGoQmiYPCwJAAkACQAJAAkACQAJAAkAgACgCCEEBaw4HAgMEBQYHAAELIAAoAgwiACkDCCEDAkAgACgCAEUEQCADEPEaDAELIAMgAEEYaikDABCIKwsgAC0ARUEDRwRAIABBIGoQ8hkLIABB2ABBCBDREQ8LIAApAxAQ8RogAEEoahCJFg8LIAApAxAQ8RogACgCKBDHGA8LIAAoAgwQ6igPCyAAKAIMENwoDwsgACgCDCIAKQMIEPEaIAAoAiAQuR4gAEE4ahDtJiAAQSRqEO8mIABByABBCBDREQ8LIAAoAgwiACkDCBDxGiAAKAIgELkeIABBJGoQkwUgAEEwQQgQ0REPCyAAKAIMIgApAwAQ8RogAEEgahCWEiAAKAIgIABBJGooAgAQjiogAEEwQQgQ0RELDwsgAEEEahCZJiAAQQhqEJomDwsgACkDECAALQAkELUjDwsgAEEEaiICQQRqIQECQAJAAkACQCACKAIADgIBAgALIAEQmyYMAgsgASgCABDqKAwBCyABKAIAENwoCyAAQQxqEJkmIABBEGoQmiYLxgUCCn8BfiMAQUBqIgIkACABKALkASIJIAkoAgBBAWoiAzYCACADBEAgAUHAAWohBSABKALQASEHIAJBIGogCUEIahDTHSACKAIkIQogAigCICIIQQA2AghBASEDA0AgAkEYaiABKALAASIGIAEoAsQBIgsQ9hwCQAJ/AkACQAJAIAItABgEQCACLQAZIgYQ5BENASADRQ0CIAYQ4xFFDQIgBRCvFUEAIQMMBgsgBiALEPQcIgZBgIDEAEYNAiAGEOQRDQAgA0UNAkEAIQMgBhDjEUUNAgsgBRCvFQwECyAGQdwARw0AIAEoAtABIQQgBRCvFQJAAn8CQCABKALAASIDIAEoAsQBRg0AIAMtAABB9QBHDQAgASgC0AEhAyACQQhqIAUgByAEEM4VIAggAigCCCACKAIMEO0dIAUgAxDSHSACQShqIAEQvgQgAigCLCIDIAIoAigiB0GAgICAeEYNARogAigCMCIGDQIMBQsgAkEcOgAoIAQgBCACQShqEJkrCyEDQQEMAgsgAygCABDTHw0CIAJBFjoAKCABIAQgAkEoahDIIwwCCyACQRBqIAUgByABKALQARDOFUEBIQMgAigCFCEFIAIoAhAhByAERQRAIAEoAugBQQhqIAcgBRD9GSEMQQAMAQsgCCAHIAUQ7R0gASgC6AFBCGogCCgCBCAIKAIIEP0ZIQxBAAshBCAKIAooAgBBAWo2AgAgCRDQFyAAAn8gBEUEQCAAIAw3AxAgACADNgIIQQIMAQsgACADNgIEQSULNgIAIAJBQGskAA8LIAIgBzYCMCACIAM2AiwgAiADNgIoIAIgAyAGQQJ0aiIENgI0A0AgAyAERkUEQCACIANBBGo2AiwgCCADKAIAENkCIAIoAiwhAyACKAI0IQQMAQsLIAJBKGoQ6SkgASgC0AEhB0EBIQRBACEDDAALAAsAC7IEAQZ/IwBBMGsiBSQAAkACQCACRQRAIABBADYCCCAAQoCAgIAQNwIADAELIAFBCGohByACQQN0IgJBCGsiCEEDdiAEbCEJIAEhBgJAA0AgAkUNASACQQhrIQIgCSAGKAIEIAlqIglNIAZBCGohBg0AC0G0kdgAQTVBtJLYABC1EgALIAVBGGogCUEBQQEQogsgBSgCHCECAkAgBSgCGEEBRwRAIAVBADYCFCAFIAUoAiA2AhAgBSACNgIMIAEoAgAhAiAFQQxqIAEoAgQiARDzHiAFKAIQIgogBSgCFCIGaiACIAEQ/AYaIAkgASAGaiIBayEGIAEgCmohAiAEQQRGBEADQCAIRQ0DIAZBA00NBSAHKAIEIQEgBygCACEEIAIgAygAADYAACAGQQRrIgYgAUkNBSAHQQhqIQcgAkEEaiICIAEgBCABEM4fIAhBCGshCCAGIAFrIQYgASACaiECDAALAAsDQCAIRQ0CIAZBAk0NBCAHKAIEIQEgBygCACEEIAIgAy8AADsAACACQQJqIANBAmotAAA6AAAgBkEDayIGIAFJDQQgB0EIaiEHIAJBA2oiAiABIAQgARDOHyAIQQhrIQggBiABayEGIAEgAmohAgwACwALIAIgBSgCIBDcKQALIAAgBSkCDDcCACAAQQhqIAkgBms2AgALIAVBMGokAA8LIAVBADYCKCAFQQE2AhwgBUHE3+AANgIYIAVCBDcCICAFQRhqQcSS2AAQuh0AC9UFAgJ/AX4CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgAOEgEKCgsCAwwMBAUGBwsLCA0NCQALIABBBGoQqCkPCyAAQQRqEOcmDAgLIABBDGoQ+icPCyAAKQMQEPEaIABBKGoQhyYPCyAAQQRqEKgpIABBCGoQhyYgACgCFEUNBSAAQRRqEIcmDwsgAEEQahCoKSAAQQRqELgZIAAoAgQgACgCCBDtKQ8LIABBBGoQqCkPCyAAKAIEIgBByABqEOcmIAAoAgBBCEcEQCAAEOMlIABBKGoQ5yYLIABB4ABqEPgkIABBgAFBCBDREQ8LAkAgACgCBCICQQJGDQAgAEEIaiEBIAJFBEAgASgCABDqKAwBCyABEKgpCyAAQRhqEPonIABBHGoQ+icgAEEMahCHJg8LAkACQAJAAkACQAJAAkACQCAAKAIIQQFrDgcCAwQFBgcAAQsgACgCDCIAKQMIIQMCQCAAKAIARQRAIAMQ8RoMAQsgAyAAQRhqKQMAEIgrCyAALQBFQQNHBEAgAEEgahDyGQsgAEHYAEEIENERDwsgACkDEBDxGiAAQShqEIcWDwsgACkDEBDxGiAAKAIoEMQYDwsgACgCDBDqKA8LIAAoAgwQ3CgPCyAAKAIMIgApAwgQ8RogACgCIBC5HiAAQThqEO0mIABBJGoQ7yYgAEHIAEEIENERDwsgACgCDCIAKQMIEPEaIAAoAiAQuR4gAEEkahCRBSAAQTBBCBDREQ8LIAAoAgwiACkDABDxGiAAQSBqEJYSIAAoAiAgAEEkaigCABCOKiAAQTBBCBDREQsPCyAAQQRqEKgpIABBCGoQhyYPCyAAKQMQIAAtACQQtSMPCyAAQQRqIgJBBGohAQJAAkACQAJAIAIoAgAOAgECAAsgARCGJgwCCyABKAIAEOooDAELIAEoAgAQ3CgLIABBDGoQqCkgAEEQahCHJgvVBQICfwF+AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIADhIBCgoLAgMMDAQFBgcLCwgNDQkACyAAQQRqEMcCDwsgAEEEahDnJgwICyAAQQxqEIQoDwsgACkDEBDxGiAAQShqEJUmDwsgAEEEahDHAiAAQQhqEJUmIAAoAhRFDQUgAEEUahCVJg8LIABBEGoQxwIgAEEEahC4GSAAKAIEIAAoAggQ7SkPCyAAQQRqEMcCDwsgACgCBCIAQcgAahDnJiAAKAIAQQhHBEAgABCTJiAAQShqEOcmCyAAQeAAahD4JCAAQYABQQgQ0REPCwJAIAAoAgQiAkECRg0AIABBCGohASACRQRAIAEoAgAQ6igMAQsgARDHAgsgAEEYahCEKCAAQRxqEIQoIABBDGoQlSYPCwJAAkACQAJAAkACQAJAAkAgACgCCEEBaw4HAgMEBQYHAAELIAAoAgwiACkDCCEDAkAgACgCAEUEQCADEPEaDAELIAMgAEEYaikDABCIKwsgAC0ARUEDRwRAIABBIGoQ8hkLIABB2ABBCBDREQ8LIAApAxAQ8RogAEEoahCIFg8LIAApAxAQ8RogACgCKBDGGA8LIAAoAgwQ6igPCyAAKAIMENwoDwsgACgCDCIAKQMIEPEaIAAoAiAQuR4gAEE4ahDtJiAAQSRqEO8mIABByABBCBDREQ8LIAAoAgwiACkDCBDxGiAAKAIgELkeIABBJGoQkgUgAEEwQQgQ0REPCyAAKAIMIgApAwAQ8RogAEEgahCWEiAAKAIgIABBJGooAgAQjiogAEEwQQgQ0RELDwsgAEEEahDHAiAAQQhqEJUmDwsgACkDECAALQAkELUjDwsgAEEEaiICQQRqIQECQAJAAkACQCACKAIADgIBAgALIAEQlCYMAgsgASgCABDqKAwBCyABKAIAENwoCyAAQQxqEMcCIABBEGoQlSYLsgUCA38FfiMAQZACayIEJAAgBEHgAGpByJ/jACkDADcDACAEQcCf4wApAwA3A1ggAigCGEEwbCEFIAIoAhQhBgNAIAUEQCAFQTBrIQUgBiAEQdgAahDVBCAGQTBqIQYMAQsLIARBMGogBEHgAGopAwA3AwAgBCAEKQNYNwMoQQAhBSADBEBBACABEIoEIQZBASEFCyAEQQA6AIABIARB6ABqIgFByJ/jACkDACIHNwIAIARB+ABqIgMgBzcCACAEIAY2AlwgBCAFNgJYIARBwJ/jACkDACIJNwJgIAQgCTcCcCACQRBqIARB2ABqIgIQwhogBEHoAWogASkCACIKNwMAIARB+AFqIAMpAgAiCDcDACAEQdAAaiAINwMAIAQgBCkCYCIINwPgASAEIAQpAnAiCzcD8AEgBEFAayAKNwMAIAQgCzcDSCAEIAg3AzggAiAEQShqENcLIARBkAFqIgEgBEHIAGoQ1wsgBCAEQThqNgKIASAEQcgBaiAHNwMAIAQgCTcDwAEgBEHgAWoiAyACEMQOIARBwAFqIAQoAuABIARB0AFqEPQhIAQoAnhBgYCAgHhHBEAgAyACQTAQ/AYaA0ACQCAEQRhqIARB4AFqENkUIAQpAxgiB1ANACAEKAIgIQIgBCAHNwPQASAEIAI2AtgBIARBOGogBEHQAWoQ8QkEQCAEKQPQARDxGgwCBSAEQcABaiAHEL4JDAILAAsLQgAQ6yYgBEHgAWoQsBQLIAQoArABQYGAgIB4RwRAIARB4AFqIAFBMBD8BhoDQCAEQQhqIARB4AFqENkUIAQpAwgiB1BFBEAgBEHAAWogBxC+CQwBCwtCABDrJiAEQeABahCwFAsgACAEKQPAATcCACAAQQhqIARByAFqKQMANwIAIARBOGoQ6wogBEGQAmokAAvCBQEEfyMAQRBrIgMkAAJAIAAoAgAiAiABKAIARw0AAkACQAJAAkACQAJAAkACQAJAIAJBAWsOBwABAgMEBQYICyAAKAIEIAAoAgggASgCBCABKAIIEOMfDQcMCAsgACgCBCICIAEoAgRHDQcgAkUEQCAAKAIMIAAoAhAgASgCDCABKAIQEJAQDQcMCAsgACgCDCAAKAIQIAEoAgwgASgCEBCdDw0GDAcLIAAoAgQgASgCBEYNBQwGCyAAKAIQIAEoAhBHDQUgASgCBCECAkAgACgCBEEBRgRAIAJFDQcgACgCCCABKAIIRg0BDAcLIAINBgsgAC0AFCABLQAURw0FIABBDGogAUEMahCDKg0EDAULIAAoAgggASgCCEcNBCAAKAIMIgJFIAEoAgwiBUVyRQRAIAIgACgCECAFIAEoAhAQ4x9FDQUMAwsgAiAFckUNAgwECyADIABBBGo2AgggAyABQQRqNgIMIANBCGogA0EMahC6EA0CDAMLIAMgAEEEajYCCCADIAFBBGo2AgwgA0EIaiADQQxqELoQRQ0CDAELIABBBGogAUEEahCDKkUNAQsgASgCGCIBKAIAIQICQCAAKAIYIgAoAgBBAUYEQCACRQ0CIAAoAgQgASgCBEYNAQwCCyACDQELIAEoAgghAgJAIAAoAghBAUYEQCACRQ0CIAAoAgwgASgCDEYNAQwCCyACDQELIAAoAhggASgCGEcNACAAKAIcIAEoAhxHDQAgACgCICABKAIgRw0AIAAoAiQgASgCJEcNACAAKAIoIAEoAihHDQAgAC0AMCABLQAwRw0AIAAoAiwgASgCLEcNACABKAIQIQICQCAAKAIQQQFGBEAgAkUNAiAAKAIUIAEoAhRGDQEMAgsgAg0BCyAALQAxIAEtADFHDQAgAC0AMiABLQAyRiEECyADQRBqJAAgBAufBQEKfyMAQfAAayIDJAAgAyAAOgAnIAMgAigCPDYCKCADIANBKGo2AiwgASgCBCEAIAMgASgCCCIENgI8IANBADYCOCADIAA2AjAgAyAAIARBFGxqNgI0IAJBQGshCANAIANBGGogA0EwahCTEyADKAIcIgBFBEAgAiABKALQAiADKAIsIgAoAgB0NgLIAiACIAEoAtQCIAAoAgB0NgLMAiACAn8gAy0AJ0UEQCACIAEoAtgCIAAoAgB0NgLQAkEADAELIAJBADYC0AIgASgC3AIgACgCAHQLNgLUAiADQfAAaiQADwsgAyADKAIYIgQgAygCLCgCAHQ2AkAgACgCCARAIANBEGogASAEEJ0gIAIgAygCQCADKAIQIgZBKGooAgAgBkEsaigCACADKAIUEJEICyADIAI2AlAgAyABNgJMIAMgADYCSCADIANBLGo2AlggAyADQUBrNgJUIAMgA0EnajYCRCADQQhqIAEgBBCcICADIAMpAwg3AlxBACEFQQAhBANAIANB5ABqIANB3ABqEIEPIAMtAGRFBEAgA0EAOgBsIANB/wE2AmggAyAENgJkA0AgAyADQeQAahDiEiADKAIARQ0DIAUgCCADKAIEIgRB/wFxai0AACIAIAdB/wFxRnFBASEFDQAgA0HEAGogBCAAQQEQqwcgACEHDAALAAsgBCADLQBlIgkgBCAJSxshCiADKABmIQsDQCAEIgYgCkYEQCAFIAggCWotAAAiACAHQf8BcUZxRQRAIANBxABqIAkgACALEKsHIAAhBwsgCkEBaiEEQQEhBQwCCyAFIAggBkH/AXFqLQAAIgAgB0H/AXFGcUEBIQUgBkEBaiEEDQAgA0HEAGogBiAAQQEQqwcgACEHDAALAAsACwAL6gQBB38jAEEwayIDJAACQAJ/QQEgAkUNABoCQCABIAJPBEAgAkEEayIBQQAgASACTRsiByACQQFrIgEgASAHSxshBiABIQQgA0EQagJ/A0AgBiAEIAdNDQEaIAIgBE0EQCAEIAJBmJzEABCtEAALIAAgBGogBEEBayEELQAAQcABcUGAAUYNAAsgBEEBagsgACACQaicxAAQih1BACEEIAMoAhQiCEUNAwJAIAMoAhAiCSwAACIFQQBIBEAgBUFAcUGAf0YNBSAIAn9BAiAFQWBJDQAaQQMgBUFwSQ0AGiAFQXdLDQZBBAsiBUkNBSADQRxqIAkgBRDVAyADKAIcDQUgAyADKAIgIgQgAygCJGo2AiwgAyAENgIoIANBKGoQ2gpBgIDEAEYNAQsCQAJAAkADQCABIAdNDQEgASACTw0CIAAgAWogAUEBayEBLQAAQcABcUGAAUYNAAsgAUEBaiEGCyADQQhqIAYgACACQaicxAAQih1BASADKAIMIgJFDQUaIAMoAggiBiwAACIAQQBOBEAgAEH/AXEhBAwFC0EBIABBQHFBgH9GDQUaAn9BAiAAQWBJDQAaQQMgAEFwSQ0AGkEBIABBd0sNBhpBBAshAUEBIAEgAksNBRogA0EcaiAGIAEQ1QMgAygCHA0BIAMgAygCICIAIAMoAiRqNgIsIAMgADYCKCADQShqENoKIgRBgIDEAEcNBEGInMQAENopAAsgASACQZicxAAQrRAAC0EBDAMLQYicxAAQ2ikACyACIAFBjJbEABCvEAALIAQQ2wtB/wFxQQFzC0EBcSEECyADQTBqJAAgBAuxBQEOfyMAQYABayIDJAAgA0EANgI4IANBATsBNCADIAI2AjAgA0EANgIsIANBAToAKCADQQo2AiQgAyACNgIgIAMgAjYCGCADIAE2AhQgA0EKNgIQIAAtAAwhCiAAKAIEIQ8gACgCCCEEIAAoAgAhCyADQSRqIRADQAJAIAciDUEBcQ0AIAghCSAMIQ4CfwNAAkACQCACIAVPBEAgASAFaiEHAkAgAiAFayIIQQdNBEBBACEGA0AgBiAIRgRAIAMgAjYCHAwDCyAGIAdqLQAAQQpGDQUgBkEBaiEGDAALAAsgA0EIakEKIAcgCBC2ByADKAIIQQFGDQILIAIhBQtBASEHIANBAToANSACIQYgCQwDCyADKAIMIQYLIAMgBSAGaiIGQQFqIgU2AhwgBUUgAiAFSXINACABIAZqQQEgEEEBEOMfRQ0ACyADIAU2AiwgDSEHIAULIQggAyAOQQFqIgw2AjgCQCAKQQFxRQRAIABBAToADCALQQFxRQRAIAQoAhRBnMngAEEEIAQoAhgoAgwRAwBFDQIMAwsgAyAPNgI8IANBCTYCXCADIANBPGo2AlggA0EBOgB8IANBADYCeCADQiA3AnAgA0EBNgJUIANBAjYCRCADQdiz2AA2AkAgA0EBNgJMIANCgICAgNAANwJoIANBAjYCYCADIANB4ABqNgJQIAMgA0HYAGo2AkggBCgCFCAEKAIYIANBQGsQkgQNAgwBCyAORQ0AIAQoAhRBCiAEKAIYKAIQEQIADQEgC0EBcUUEQCAEKAIUQZzJ4ABBBCAEKAIYKAIMEQMARQ0BDAILIAQoAhRBtMLAAEEHIAQoAhgoAgwRAwANAQtBASEKIAQoAhQgASAJaiAGIAlrIAQoAhgoAgwRAwBFDQELCyADQYABaiQAIA1Bf3NBAXELoAQBBn8jAEEwayIFJAACQAJAIAJFBEAgAEEANgIIIABCgICAgBA3AgAMAQsgAUEMaiEIIAJBDGwiB0EMayIJQQxuIARsIQIgASEGAkADQCAHRQ0BIAdBDGshByACIAYoAgggAmoiAk0gBkEMaiEGDQALQbSR2ABBNUG0ktgAELUSAAsgBUEYaiACQQFBARCiCyAFKAIcIQYCQCAFKAIYQQFHBEAgBUEANgIUIAUgBSgCIDYCECAFIAY2AgwgASgCBCEGIAVBDGogASgCCCIBEPMeIAUoAhAiCiAFKAIUIgdqIAYgARD8BhogAiABIAdqIgFrIQcgASAKaiEGIARBAkYEQANAIAlFDQMgB0EBTQ0FIAgoAgghASAIKAIEIQQgBiADLwAAOwAAIAdBAmsiByABSQ0FIAhBDGohCCAGQQJqIgYgASAEIAEQzh8gCUEMayEJIAcgAWshByABIAZqIQYMAAsACwNAIAlFDQIgB0UNBCAIKAIIIQEgCCgCBCEEIAYgAy0AADoAACAHQQFrIgcgAUkNBCAIQQxqIQggBkEBaiIGIAEgBCABEM4fIAlBDGshCSAHIAFrIQcgASAGaiEGDAALAAsgBiAFKAIgENwpAAsgACAFKQIMNwIAIABBCGogAiAHazYCAAsgBUEwaiQADwsgBUEANgIoIAVBATYCHCAFQcTf4AA2AhggBUIENwIgIAVBGGpBxJLYABC6HQALjQUBAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgBBAWsOEg8PAQIDDw8EBQYHCAkKCwwNDgALIABBBGogARC8Gg8LIABBBGogARCuLSAAQQhqIAEQzC0PCyAAQQxqIAEQrSYPCyAAQShqIAEQzC0PCyAAQQRqIAEQri0gAEEIaiIDIAEQzC0gACgCFCICBEAgAEEUaiABEMwtCyADKAIAIgAQmyAEQCABIAAQgA9BOxCVGAsgAkUNCiACEJsgRQ0KIAEgAhCAD0E7EJUYDwsgAEEQaiABEK4tIAAoAgxBGGwhAiAAKAIIIQADQCACRQ0KIABBFGogARCtJiAAIAEQvBogAkEYayECIABBGGohAAwACwALIABBBGogARCuLQ8LIAAoAgQiAEHIAGogARC8GiAAKAIAQQhHBEAgACABEJEkIABBKGogARC8GgsgASAAQeAAahChJA8LIABBBGogARCuLSAAQQhqIAEQzC0gACgCCCIAEJsgRQ0GDAcLIABBBGogARCuLSAAQQhqIAEQzC0gACgCCCIAEJsgRQ0FDAYLAkAgACgCBCIDQQJGDQAgAEEIaiECIANBAXFFBEAgAiABEM0tDAELIAIgARCuLQsgAEEYaiABEK0mIABBHGogARCtJiAAQQxqIAEQzC0gACgCDCIAEJsgRQ0EDAULIABBBGogARDXHCAAQQxqIAEQri0gAEEQaiABEMwtIAAoAhAiABCbIEUNAwwECyAAQQRqIAEQ1xwgAEEMaiABEK4tIABBEGogARDMLSAAKAIQIgAQmyBFDQIMAwsgASAAQQhqEKkIDwsgAEEEaiABEK4tCw8LIAEgABCAD0E7EJUYC7sFAQh/IwBBoAFrIgIkAAJAIAEoAgAiBSABKAIERgRAIABBKzYCAAwBCyABIAVBBGo2AgAgAkEQaiABKAIIIghBIGoiBkHQtsMAELcdAkACQAJAIAIoAhAiASgCAEEBRwRAIAIoAhQhA0ElIQcgASgCJCIEQf7///8HSyIJRQRAIAEgBDYCBCABQQE2AgAgAUEcakEAEKIbQSohBwsgAyADKAIAQQFqNgIAIAkNASACQdAAaiIJIAhBAEEAIAIgBSgCABDAAiACKAJYIQEgAigCVCEFIAIoAlAiA0EqRw0CIAJBCGogBkGAuMMAELcdIAIoAgwhByACKAIIIgMoAgAgA0EEaigCABDGISEEIAJBCTYCkAEgAiAENgKUASAJIAMgAkGQAWoQ5wggAigCVCEDIAIoAlAiBEEqRwRAIAJBGGogAkHYAGpBOBD8BhoLIAcgBygCAEEBajYCACAEQSpHDQMgAkHQAGogCCABIAMQ2AggAigCUCIBQSpGBEAgAiAGQeC2wwAQtx0gAigCBCEIIAIoAgAiASgCACABQQRqKAIAEMYhIQYgAUEgaigCACABQSRqKAIAIAZBnNfDABCvHyABQQA2AgAgBTYCACAAIAM2AgggACAFNgIEIABBKjYCACAIIAgoAgBBAWo2AgAMBQsgAEEEaiACQdAAakEEckE8EPwGGiAAIAE2AgAMBAsgAkEANgIoIAJBATYCHCACQfjRwwA2AhggAkIENwIgIAJBGGpBjNfDABC6HQALIABB/////wc2AgggAEEMaiACQdAAakE0EPwGGiAAIAQ2AgQgACAHNgIADAILIABBDGogAkHcAGpBNBD8BhogACABNgIIIAAgBTYCBCAAIAM2AgAMAQsgAEEIaiACQRhqQTgQ/AYaIAAgAzYCBCAAIAQ2AgALIAJBoAFqJAALnAUBBn8jAEFAaiIFJAACQCAERQ0AAkAgAS0APEUNACABKAIoIQggASgCDCEHIAEoAgghCSABKAIsIgohBgNAIAYEQCAIIAkgBxCEDyAGQQFrIQYMAQUgASgCOARAIAEgASgCNCAHIApsajYCNAsgAUEAOgA8IAEoAgAgAUEANgIARQ0CIAEgASgCBBCcBAsLCyACKAIAIgoEQCABIAIoAgQQnAQLIAEoAiggAyAEEIQPAkAgASgCOEUNAEEAIQcgBUEANgI8IAVBADYCKCAFIAM2AjQgBSADIARqNgI4QQAhCANAAkAgBUEgaiAFQShqEL4QIAUoAiQiBkUNACAFKAIgIQkCQAJAIAYtAABBCmsOBAADAwEDCyAJQQFqIQcgCEEBaiEIDAILAkAgBSgCKEEBRgRAIAUoAjAhBgwBCwJAIAUoAjQiBiAFKAI4RgRAQQAhBgwBCyAFIAZBAWo2AjQgBSAFKAI8IgdBAWo2AjwLIAUgBjYCMCAFIAc2AiwgBUEBNgIoCyAIQQFqIQgCQCAGBEAgBi0AAEEKRg0BCyAJQQFqIQcMAgsgCUECaiEHIAVBGGogBUEoahC+EAwBCwsgASABKAIwIAhqNgIwIAVBEGogByADIARB2LbgABDiFEEAIQYgBUEAOwEwIAUgBSgCECIDNgIoIAUgAyAFKAIUajYCLEEAIQMDQAJAIAUCfyAGQf//A3FFBEAgBUEIaiAFQShqEP0JIAUoAggEQCAFKAIMIgRB//8DTQRAIAUvATAhBgwECyAEQf8HcUGAuH9yDAILIAFBACABKAI0IAgbIANqNgI0DAQLQQALIgY7ATALIANBAWohAwwACwALIApFDQAgASACKAIIEJwECyAAQQQ6AAAgBUFAayQAC50FAgR/BX4jAEGAAWsiBCQAIAG9IQgCf0EDIAGZRAAAAAAAAPB/YQ0AGkECIAhCgICAgICAgPj/AIMiCUKAgICAgICA+P8AUQ0AGiAIQv////////8HgyIMQoCAgICAgIAIhCAIQgGGQv7///////8PgyAIQjSIp0H/D3EiBRsiCkIBgyELIAlQBEBBBCAMUA0BGiAFQbMIayEFQgEhCSALUAwBC0KAgICAgICAICAKQgGGIApCgICAgICAgAhRIgcbIQpCAkIBIAcbIQlBy3dBzHcgBxsgBWohBSALUAshBiAEIAU7AXggBCAJNwNwIARCATcDaCAEIAo3A2AgBCAGOgB6An8CQAJAAkAgBkECayIFBEBBASEGQZDj4ABBvq/gACAIQgBTIgcbQZDj4ABBASAHGyACGyEHQQEgCEI/iKcgAhshAkEDIAUgBUEDTxtBAmsOAgMCAQsgBEEDNgIoIARBmMXfADYCJCAEQQI7ASBBASEHQQAhAkEBIQYgBEEgagwDCyAEQQM2AiggBEHA7cAANgIkIARBAjsBICAEQSBqDAILIARBIGogBEHgAGoiBSAEQQ9qIgYQogECQCAEKAIgRQRAIARB0ABqIAUgBhBDDAELIARB2ABqIARBKGooAgA2AgAgBCAEKQIgNwNQCyAEIAQoAlAgBCgCVCAELwFYIAMgBEEgahCLByAEKAIEIQYgBCgCAAwBC0ECIQYgBEECOwEgIAMEQCAEQQE2AjAgBEEAOwEsIARBAjYCKCAEQb/h2AA2AiQgBEEgagwBC0EBIQYgBEEBNgIoIARB1dPWADYCJCAEQSBqCyEFIAQgBjYCXCAEIAU2AlggBCACNgJUIAQgBzYCUCAAIARB0ABqELcEIARBgAFqJAAL0AUBAX8jAEEQayICJAACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgAiACgCAEEBaw4SAQIDBAUGBwgJCgsMDQ4PEBESAAsgAiAAQQRqNgIMIAFB74DaAEEFIAJBDGpB/QIQyAoMEgsgAiAAQQRqNgIMIAFB4JzjAEEFIAJBDGpB/gIQyAoMEQsgAiAAQQRqNgIMIAFB9IDaAEEIIAJBDGpB/wIQyAoMEAsgAiAAQQRqNgIMIAFB/IDaAEEEIAJBDGpBgAMQyAoMDwsgAiAAQQRqNgIMIAFBgIHaAEEGIAJBDGpBgQMQyAoMDgsgAiAAQQhqNgIMIAFBhoHaAEEHIAJBDGpBggMQyAoMDQsgAiAAQQhqNgIMIAFBjYHaAEEFIAJBDGpBgwMQyAoMDAsgAiAAQQhqNgIMIAFBkoHaAEEIIAJBDGpBhAMQyAoMCwsgAiAAQQRqNgIMIAFBmoHaAEECIAJBDGpBhQMQyAoMCgsgAiAAQQRqNgIMIAFBnIHaAEEGIAJBDGpBhgMQyAoMCQsgAiAAQQRqNgIMIAFBooHaAEEFIAJBDGpBhwMQyAoMCAsgAiAAQQRqNgIMIAFBp4HaAEEDIAJBDGpBiAMQyAoMBwsgAiAAQQRqNgIMIAFBqoHaAEEFIAJBDGpBiQMQyAoMBgsgAiAAQQRqNgIMIAFBr4HaAEEHIAJBDGpBigMQyAoMBQsgAiAAQQRqNgIMIAFBtoHaAEEDIAJBDGpBiwMQyAoMBAsgAiAAQQRqNgIMIAFBuYHaAEEFIAJBDGpBjAMQyAoMAwsgAiAAQQRqNgIMIAFBvoHaAEEFIAJBDGpBjQMQyAoMAgsgAiAAQQhqNgIMIAFBw4HaAEEEIAJBDGpBjgMQyAoMAQsgAiAAQQRqNgIMIAFBpa7gAEEEIAJBDGpBjwMQyAoLIAJBEGokAAvABQECfwJAAkACQAJAA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIAIgAoAgBBAWsOEwECAwQFCgYKCgcICQoKCwwODxAACyAAQgA3AgQPCyAAQgA3AgQPCyAAKAIEQYCAgIB4RgRAIABCADcDGCAAQQhqEJkbIABBIGoQjSYgAEEUahCCLg8LIABCADcCFCAAQQRqEJkbIABBHGoQjSYgAEEQahCCLg8LIABCADcDCCAAQRBqEJUeIABBKGoQ/icPCyAAQgA3AwggAEHQAGogAEEQaiEBAkAgAC0AREEERgRAIAEQlR4MAQsgARCvHQsQ/icPCyAAQgA3AxAgAEEEahDTBw8LIABCADcDECAAKAIMQThsIQEgACgCCCEAA0AgAUUNCyAAQgA3AiggACgCAEEHRwRAIAAQqhILIABBMGoQ8QMgAUE4ayEBIABBOGohAAwACwALIABCADcCFCAAQQhqEJgbDwsgAEIANwIUIABBBGoQ8QMgAEEIahDxAyAAQQxqEPEDIABBEGohAAwECyAAQgA3AwggAEEQahCSIA8LIABCADcDCCAAQQRqIQAMAgsgAEIANwIMIABBBGoQ8QMgAEEIaiEADAELCyAAQgA3AwggAEEQahCSICAAQUBrEP8nIABBxABqEP8nDwsgAEIANwMoAkACQAJAAkBBBCAAKAIIQYCAgIB4cyIBIAFBBE8bQQFrDgQAAQIDAgsgAEIANwMYDwsgAEIANwIMDwsgAEIANwMQDwsgAEIANwMgIABBCGoQmBsgACgCHEEFdCEBIAAoAhghAANAIAFFDQMgAEIANwIIIAFBIGshASAAQSBqIQAMAAsACyAAQQhBECAALQAcQQJGIgEbakEANgIAIABCADcDICAAQQxBFCABG2pBADYCACAAQShqEIAoDwsgAEEIahCvHQsLrwUCCX8BfiMAQSBrIgQkACAEQRBqIAFB69/YAEEBEO8kAkACQAJAAkACQAJAIAQtABBBBEYEQCACIANqIQwgAiEJAkACQANAQQAhBgNAIAwgBiAJaiIKRgRAIAMgBUYNCCAFBEAgAyAFTQ0EIAIgBWosAABBv39MDQQLIARBCGogASACIAVqIAMgBWsQ7yQgBC0ACCEGDAcLIAZBAWohBiAKLQAAIgtBkJTYAGotAAAiCEUNAAsgBSAFIAZqIgpBAWsiB0kEQAJAIAVFDQAgAyAFSwRAIAIgBWosAABBv39KDQEMDAsgAyAFRw0LCwJAIAMgB0sEQCACIAdqLAAAQb9/TA0MDAELIAMgB0cNCwsgBEEQaiABIAIgBWogByAFaxDvJCAELQAQQQRHDQMLAkAgBEEQaiABAn8CQAJAAkACQAJAAkAgCEHuAGsOCAEMDAwCDAMEAAsCQAJAAkAgCEHiAGsOBQEODg4CAAsgCEEiRg0GIAhB3ABHDQ1BuN/YAAwHC0GW3tgADAYLQZje2AAMBQtBtN/YAAwEC0G239gADAMLQaCW2AAMAgsgBEHc6sGBAzYAGiAEIAtBD3FBi53jAGotAAA6AB8gBCALQQR2QYud4wBqLQAAOgAeIARBEGogASAEQRpqQQYQ7yQMAgtBvODYAAtBAhDvJAsgBC0AEEEERgRAIAYgCWohCSAKIQUMAQsLIAQgBCkDECINNwMIIA2nIQYMBAsgAiADIAUgA0GAlNgAENAmAAsgBCAEKQMQIg03AwggDachBgwCCyAAIAQpAxA3AgAMBAtB3evgAEEoQfCT2AAQ7hcACyAGQf8BcUEERw0BCyAAIAFB69/YAEEBEO8kDAELIAAgBCkDCDcCAAsgBEEgaiQADwsgAiADIAUgB0GQltgAENAmAAuyBQEDfyMAQeAAayIDJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAEoAgBBAWsOEhAQAAECEBADBAUGBwgJCgsNDA4LIAFBBGogABD4LCABQQhqIAAQ+SwMDwsgAUEMaiAAENMlDA4LIAFBKGogABD5LAwNCyABQQRqIAAQ+CwgAUEIaiAAEPksIAEoAhRFDQwgAUEUaiAAEPksDAwLIAFBEGogABD4LCABKAIMQRhsIQIgASgCCCEBA0AgAkUNDCABQRRqIAAQ0yUgACABEOcGIAJBGGshAiABQRhqIQEMAAsACyABQQRqIAAQ+CwMCgsgACABKAIEIgFByABqEOcGIAEoAgBBCEcEQCABIAAQ7CMgACABQShqEOcGCyABQeAAaiAAEO0jDAkLIAFBBGogABD4LCABQQhqIAAQ+SwMCAsgAUEEaiAAEPgsIAFBCGogABD5LAwHCwJAIAEoAgQiBEECRg0AIAFBCGohAiAEQQFxRQRAIAIgABD6LAwBCyACIAAQ+CwLIAFBGGogABDTJSABQRxqIAAQ0yUgAUEMaiAAEPksDAYLIAFBBGogABC1HCABQQxqIAAQ+CwgAUEQaiAAEPksDAULIAFBBGogABC1HCABQQxqIAAQ+CwgAUEQaiAAEPksDAQLIAFBBGogABD4LAwDCyABQQhqIAAQowkMAQsgACABQQRqEOcGIAEoAgBBEUcNAQsgA0EwaiIEIAFBCGoiAhCNFSADIAAgBEEAEGkCQAJAAkBBAiADKAIAQRNrIgAgAEECTxtBAWsOAgECAAsgA0EwaiIAIAFBMBD8BhogAUEANgIIIAFCATcDACAAENAFDAILIAIQ+gkgAiADQQhqQSgQ/AYaDAELIAEQ0AUgASADQTAQ/AYaCyADQeAAaiQAC6EFAQ5/IwBBEGsiBiQAAkACQAJAAkAgAgRAIAAtAP0CQQFxRQ0EIAAgACgCuAJBAWo2ArgCAkAgACgC9AJBA0sNACAAQegCaiIDIAEtAAAiBBCMESAALQD6AkEBRw0AIAMgBBDYGRCMEQsCQCAALQC3AkEBRw0AIAAoArACQQNNBEAgAkH/AUsEQCAAQQA6ALcCDAILIABBEGohCSAAQZACaiENIAEgAmohDiABLQAAIgpBpLnEAGotAAAhDCAALQC2AkEBcSEPIAEhAwNAQYACIAcgB0GAAk0bIRBBACEEA0AgAyAORgRAIAQNBCAJIAoQmRggAC0AtgJBAUcNBCAJIAoQ2BkQmRgMBAsgByAQRg0FIAkgAy0AACILaiIFIAUtAAAiCCAHQf8BcSIFIAUgCEkbOgAAIA8EQCAJIAsQ2BlB/wFxaiIIIAgtAAAiCCAFIAUgCEkbOgAACyAHQQFqIQcgA0EBaiEDIARBASEEDQAgDSALENoVDQALIAtBpLnEAGotAAAiBCAMQf8BcSIFIAQgBUkiBBshDCALIAogBBshCgwACwALIABBADoAtwILIAAgACgCDCIDQQFqNgIMAkAgA0UEQCAGQQRqIAJBAEEBQQEQlQogBigCCCEDIAYoAgRBAUYNBCAGKAIMIAEgAhD8BiEEIAAoAgAgACgCBBCuJCAAIAI2AgggACAENgIEIAAgAzYCAAwBCyAAKAIAIAAoAgQQriQgAEGAgICAeDYCAAsgACgCvAJBgICAgHhGDQQgAC0A5QINBCAAQbwCaiEDIAAoAsQCQYABSQ0DIABBAToA5QIgAxDqFAwECyAAQQA6AP0CDAMLQYyVwAAQ2ikACyADIAYoAgwQ3CkACyADIAEgAhDNCQsgBkEQaiQAC4MFAQt/IAAoAgAiBkEIaigCAEUEQCAGEL4PIQMLAkACQCAGQRBqIgsoAgAgBkEUaiIMKAIAIANBtLjEABCvHygCACIEDQAgASACaiENIAZBCGohCSAGQQRqIQoCQANAAkACQCABIA1GBEBBASECIAYgBigCGCIAQQFqNgIYIAZBFGooAgAiASADSw0BIAMgAUHEuMQAEK0QAAsgAS0AACEHIAFBAWohASAKKAIAIAkoAgAgA0HUuMQAELQfIgIoAggiBEUEQEEAIQQMAgsgAigCBCEFQQAhAgNAIARBAU0EQAJAIAcgBSACQQN0IgRqLQAAIgVHBEAgAiAFIAdJaiEEDAULIAooAgAgCSgCACADQeS4xAAQtB8iAygCCCIHIAJNDQAgCygCACAMKAIAIAMoAgQgBGooAgQiA0GEucQAEK8fKAIAIgRFDQUMBwsFIAIgBEEBdiIIIAJqIgIgBSACQQN0ai0AACAHSxshAiAEIAhrIQQMAQsLIAIgB0H0uMQAEK0QAAsgBkEQaigCACADQQJ0aiAANgIADAQLIAYQvg8hAiADIAkoAgAiBUkEQCAKKAIAIANBDGxqIgUoAggiAyAESQ0CIAUoAgAgA0YEQCAFEPYWCyAFKAIEIARBA3RqIQggAyAESwRAIAhBCGogCCADIARrQQN0ENAtGgsgCCACNgIEIAggBzoAACAFIANBAWo2AgggAiEDDAELCyADIAVBlLnEABCtEAALIAQgAxCxEAALQQAhAiAAKAIELQAAQQFGDQAgACgCCCIAKAIIIgEgACgCAEYEQCAAEPsWCyAAKAIEIAFBAnRqIARBAWs2AgAgACABQQFqNgIIQQAPCyACC9QFAQZ/IwBBIGsiByQAIAcgAzoAByABKAIEIgggASgCCCIFIAJBpIXAABCwHygCBARAIAggBSACQbSFwAAQsB8hBiABKAIcIAEoAiAgBigCBCABIANB/wFxakHIAGotAABqQcSFwAAQrx8gBDYCAAsCQAJAAkACQAJAAkACQCAIIAUgAkHUhcAAELAfKAIAIghFDQAgA0H/AXEiCiIJIAEoAhAiBSABKAIUIgYgCEHkhcAAELEfLQAASQ0AIAUgBiAIQfSFwAAQsR8tAAAgCUYNASAFIAYgCEGEhsAAELEfIQkDQCAJKAAFIgJFBEBBACECDAULIAogBSAGIAJBlIbAABCxHy0AAEsEQCAFIAYgAkGEh8AAELEfIQkgAiEIDAELCyADQf8BcSIJIAUgBiACQaSGwAAQsR8tAABJDQMgBSAGIAJBtIbAABCxHyIBLQAAIAlHDQIgBSAGIAJB1IbAABCxHyAENgABDAQLIAdBCGogARCODSAHKAIMIQUgBygCCCIGQQNGBEAgASgCECABKAIUIAVBpIfAABCxHyIGIAg2AAUgBiAENgABIAYgAzoAACABKAIEIAEoAgggAkG0h8AAELAfIABBAzYCACAFNgIADAYLIAAgBykDEDcDCCAAQRBqIAdBGGopAwA3AwAgACAFNgIEIAAgBjYCAAwFCyAFIAYgCEGUh8AAELEfIABBAzYCACAENgABDAQLIAdBADYCCEEAIAdBB2ogASAHQQhqQcSGwAAQzBoACyAHQQhqIAEQjg0gBygCDCEFIAcoAggiBkEDRw0BIAEoAhAiBiABKAIUIgkgBUHkhsAAELEfIgEgAjYABSABIAQ2AAEgASADOgAAIAYgCSAIQfSGwAAQsR8gBTYABQsgAEEDNgIADAELIAAgBykDEDcDCCAAQRBqIAdBGGopAwA3AwAgACAFNgIEIAAgBjYCAAsgB0EgaiQAC48FARF/IwBBMGsiBSQAIAUgASgCCCIGNgIUIAZBwABGBEACQAJAAkAgASgCECILIARqIgYgA0sNACAEIAZLDQIgASACIARqIAsQ1A4hCSABKAIUIQ4gASgCBCEPIAEoAgwiEEEQaiERAkADQCAPIAlBP3FBDGxqIgEoAgQiDCABKAIIQQN0aiESIAIgBGohBiADIARrIRMDQAJAAkACQCASIAwiAUYEQCAEIAtqIgEgA08NByADIARGDQEgASACai0AACAJIA4gBi0AAGxrQQF0aiEJIARBAWohBAwFCyABQQhqIQwgASgCACAJRw0DIAVBCGogEEEMaigCACARKAIAIAEoAgQiFBDnHSADIARJDQEgBSgCDCIHIBNLDQMgBSgCCCEIIAdBBEkNAiAIIAdBBGsiAWohFSABIAZqIQ0gBiEBA0AgASANSQRAIAEoAAAgCCgAAEcNBSAIQQRqIQggAUEEaiEBDAELCyANKAAAIBUoAABHDQMMBQsgAyADQbC1wAAQrRAACyAEIANB0LXAABCuEAALAkACQAJAIAdBAWsOAwIBAAULIAYvAAAgBkECai0AAEEQdHIgCC8AACAIQQJqLQAAQRB0ckcNAkEDIQcMBAsgBi8AACAILwAARw0BQQIhBwwDCyAGLQAAIAgtAABHDQALC0EBIQcLIAQgB2oiASAHSQ0BIAAgFDYCDCAAIAE2AgggACAENgIEQQEhCgsgACAKNgIAIAVBMGokAA8LIAVBADYCKCAFQQE2AhwgBUGIoMMANgIYIAVCBDcCICAFQRhqQZCgwwAQuh0ACyAEIAZBoLXAABCwEAALIAVBADYCGEEAQZy1wAAgBUEUaiAFQRhqQcC1wAAQzhoAC4UFAhB/AX4jAEHQAWsiAiQAIAEoAgQhCSACIAEoAggiB0EEQQwQ+RQgB0EMbCEKIAJBIGohCyACQThqIQwgAkGoAWohDSACQYABaiEOIAJB6ABqIQUgAigCBCEIQQAhASACKAIAIg8hBgJAA0AgBkUgASAKRnJFBEACQCABIAlqIgMoAgAEQCACQQxqIAMQ6SIMAQtBCEHwABCxKCIQRQ0DAkACQAJAAkACQAJAAkBBBCADQQRqKAIAIgMoAgBBBWsiBCAEQQZPG0EBaw4FAQIDBAUACyAFIANBCGoQzhsgAkEFNgJgDAULIAJBGGoiBCADQQhqEMwOIAIgA0EoahDwHDYCOCAFIARBKBD8BhogAkEGNgJgDAQLIAMpAwghEiALIANBEGoQzhsgAiADQShqEPAcNgI4IAIgEjcDGCAFIAJBGGpBKBD8BhogAkEHNgJgDAMLIAMpA0AhEiACQRhqIhEgA0EIahDMDiADQcgAahCSHCEEIAwgA0EoahC2ICACIAQ2AlggAiASNwNQIAUgEUHIABD8BhogAkEINgJgDAILIAMpA2AhEiACQeAAaiADEMwOIA4gA0EgahCzICADQegAahDwGSEEIA0gA0HIAGoQtiAgAiAENgLIASACIBI3A8ABDAELIAJBGGoiBCADQQhqEMwOIAIgA0EoahD+CzYCOCAFIARBKBD8BhogAkEKNgJgCyACIBAgAkHgAGpB8AAQ/AY2AhAgAkEANgIMCyACKQIMIRIgASAIaiIDQQhqIAJBFGooAgA2AgAgAyASNwIAIAZBAWshBiABQQxqIQEMAQsLIAAgBzYCCCAAIAg2AgQgACAPNgIAIAJB0AFqJAAPCwAL3QQCBH4FfyAAQQhqIQpBACAAKAIAIgZrIQcgAUE/ca0hA0GAeiEBAkACQAJAAkACQAJAA0AgASAHaiIIQYB6Rg0DIAFFDQEgACABaiIJQYgGajEAACACQgp+fCICIAOIQgBSDQIgCEH/eUYNAyABQQJqIQEgCUGJBmoxAAAgAkIKfnwiAiADiFANAAsgAUGABmohAQwDC0GABkGABkGUysAAEK0QAAsgAUGBBmohAQwBCyACUA0BIAIgA4hQRQRAIAYhAQwBCyAGIQEDQCABQQFqIQEgAkIKfiICIAOIUA0ACwsgACAAKAIEIAFrQQFqIgc2AgQgB0GBcEgEQCAAQQA6AIgGIABCADcCAA8LQn8gA4ZCf4UhBQJAAkACQCABIAZJBEBBACAGayEIIAFBCGohByAGIAFrIQZBgAYgASABQYAGTxtBgAZrIQlBCCEBA0AgASAJakEIRg0CIAAgB2oxAAAgACABaiACIAOIPAAAIAIgBYNCCn58IQIgAUEBaiEBIAggB0EBaiIHakEIRw0ACyACUA0DDAILQQAhBiACQgBSDQEgAEEANgIADAMLIAdBCGtBgAZBpMrAABCtEAALA0AgAiIEIAWDQgp+IQIgBCADiKchAQJAIAZBgAZPBEAgAUH/AXFFDQEgAEEBOgCIBgwBCyAGIApqIAE6AAAgBkEBaiEGCyACQgBSDQALCyAAIAY2AgAgBkGABksNASAGQQdqIQEDQCAAIAFqLQAADQEgACABQQhrNgIAIAFBAWsiAUEHRw0ACwsPCyAGQQFrQYAGQfTJwAAQrRAAC7gGAgx/CX4jAEHwAmsiAiQAIAEoAuQBIQggAS0A8wEhCSABKQIQIQ4gASkCGCEPIAEpAiAhECABKQIoIREgASkCMCESIAEpAjghEyABKQJAIRQgASkCSCEVIAEpAlAhFiACQYQCaiABKAJcIAEoAmAQ9xMgAkGQAmogASgCaCABKAJsEPcTIAJBnAJqIAEoAnQgASgCeBD3EyACIBY3AvwBIAIgFTcC9AEgAiAUNwLsASACIBM3AuQBIAIgEjcC3AEgAiARNwLUASACIBA3AswBIAIgDzcCxAEgAiAONwK8ASACQbwCaiABQZABai8BADsBACACQcYCaiABQZoBai8BADsBACACQdACaiABQaQBai8BADsBACACQdoCaiABQa4Bai8BADsBACACQeQCaiABQbgBai8BADsBACACIAEpAogBNwK0AiACIAEpAZIBNwG+AiACIAEpApwBNwLIAiACIAEpAaYBNwHSAiACIAEpArABNwLcAiACQe4CaiABQcIBai8BADsBACACIAEpAboBNwHmAiABKAKAASEEIAEoAoQBIQUjAEEQayIDJAAgA0EIaiAFQQFBChC5FCADKAIIIQYgAygCDCAEIAVBCmwQ/AYhByACQagCaiIEIAU2AgggBCAHNgIEIAQgBjYCACADQRBqJAAgAkEIaiACQbwBaiIDQewAEPwGGiACQfQAaiAEQcgAEPwGGiADIAFBxAFqEN4eIAEoAtwBIgMgAygCACIFQQFqNgIAIAVBAEgEQAALIAEoAgQhBSABKAIAIQQgAS0A8gEhBiABLQDxASEHIAEtAPABIQogASgC7AEhCyABKALoASEMIAIgASgCCCABKAIMELsoIAEoAuABIQ0gAikDACEOIABB0AFqIAFB0AFqEN4eIAAgCDYC5AEgACAJOgDzASAAQRBqIAJBCGpBtAEQ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BCAEQQlPG0EBaw4IAQIDBAUGBwgACyADQQE2AhQgA0H89uAANgIQIANCATcCHCADQakCNgIMIAMgACkCCDcCKCADIANBCGo2AhggAyADQShqNgIIIAEgAiADQRBqEK0kDAgLIAMgAEEEajYCCCADQQI2AhQgA0Gc0dgANgIQIANCATcCHCADQQg2AiwgAyADQShqNgIYIAMgA0EIajYCKCABIAIgA0EQahCtJAwHCyADQQA2AiAgA0EBNgIUIANBwNHYADYCECADQgQ3AhggASACIANBEGoQrSQMBgsgA0EANgIgIANBATYCFCADQdDR2AA2AhAgA0IENwIYIAEgAiADQRBqEK0kDAULIANBADYCICADQQE2AhQgA0Hs0dgANgIQIANCBDcCGCABIAIgA0EQahCtJAwECyADQQA2AiAgA0EBNgIUIANBjNLYADYCECADQgQ3AhggASACIANBEGoQrSQMAwsgAyAANgIIIANBATYCFCADQfz24AA2AhAgA0IBNwIcIANBqgI2AiwgAyADQShqNgIYIAMgA0EIajYCKCABIAIgA0EQahCtJAwCCyADIABBBGo2AgggA0ECNgIUIANBlNLYADYCECADQgE3AhwgA0EINgIsIAMgA0EoajYCGCADIANBCGo2AiggASACIANBEGoQrSQMAQsgAyAAQQRqNgIIIANBATYCFCADQfz24AA2AhAgA0IBNwIcIANBCDYCLCADIANBKGo2AhggAyADQQhqNgIoIAEgAiADQRBqEK0kCyADQTBqJAALvwQCA38BfiMAQUBqIgYkACAGQTBqIAIgBUGQCiAFEOgXAkAgBi0AMEEFRwRAIAAgBikDMDcCAAwBCyAGKAI0GgJAIAVFDQAgBkEBOgAmIAZBADoAJyAFIQcDQAJAAkAgB0UEQCAGQTBqIAEgAiADQZAKIAggCUIgiKcQ1gEgBi0AMEEERg0EIAYpAzAiCUL/AYNCBFINAQwECyAGIAk3AjQgBiAINgIwIAZBGGogBBDNECAGQShqIAEgA0GQCiAGQTBqIAYoAhggBigCHCAGQSdqIAZBJmoQkQQgBi0AKEEERwRAIAYpAygiCUL/AYNCBFINAQsgBkEwaiAEIAEQ7wggBi0AMEEERwRAIAYpAzAiCUL/AYNCBFINAQsgBi0AJkUEQCAGQQE6ACYMAgsgASgCREUN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BCACQSBqEIAjQQQhA0EADAELIAJBIGoQgCMCQAJAIAVBgLADc0GAgMQAa0GAkLx/Tw0AIAYgCBDSHSACQRRqIgNB3AAQzRsgA0H1ABDNGyAERQRAQQQhAwNAIANFDQMgASgCwAEgASgCxAEQ9BwiBUGAgMQARwRAIAYQrxUgAkEUaiAFEM0bCyADQQFrIQMMAAsAC0H7ACEDQQYhBwNAIAJBFGogAxDNGyAHRQRAQf0AIQUMAgtB/QAhBSABKALAASABKALEARD0HCIDQf0ARiADQYCAxABGcg0BIAYQrxUgB0EBayEHDAALAAsgAkEUaiAFEM0bCyAERQ0BIAZB/QAQkhgNASACQSM6ACggASgC0AEgCCACQShqEJgrIQEgAEGAgICAeDYCACAAIAE2AgQgAigCGCEDIAIoAhQLIAMQ2SkMAQsgACACKQIUNwIAIABBCGogAkEcaigCADYCAAsgAkFAayQAC9QEAgJ/AX4jAEEwayIDJAACQAJAAkACQAJAAkACQAJAAkAgAigCAEEBaw4EAQIDBAALIANBIGogASACKAIQIgRBABDTASADLQAgQQRGDQQgAykDICIFQv8Bg0IEUQ0EIAAgBTcCAAwHCyADQSBqIAJBCGogARBnIAMtACBBBEYNBCADKQMgIgVC/wGDQgRRDQQgACAFNwIADAYLIANBIGogAkEIaiABEPETIAMtACBBBEYNAyADKQMgIgVC/wGDQgRRDQMgACAFNwIADAULIANBIGogASACQQRqEK8HIAMtACBBBEYNAiADKQMgIgVC/wGDQgRRDQIgACAFNwIADAQLIANBIGogAkEIaiABELMCIAMtACBBBEYNASADKQMgIgVC/wGDQgRRDQEgACAFNwIADAMLAkACQAJAIARFDQAgA0EgaiABIAQQyxwgAy0AIEEERg0AIAMpAyAiBUL/AYNCBFINAQsgAkEIaiECIAEtAEwNASADQSBqIAIgARCQEyADLQAgQQRGDQIgAykDICIFQv8Bg0IEUQ0CIAAgBTcCAAwECyAAIAU3AgAMAwsgAyACEJYMIANBIGogAygCACADKAIEENkDIANBFGogAygCJCICIAMoAihBASABLQBREJoBIANBCGogASADKAIYIgEgAygCHBDjECADLQAIQQRHBEAgAykDCCIFQv8Bg0IEUg0CCyADKAIUIAEQ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GgsgAEHgAGogARDxIw8LAkAgACgCBCIDQQJGDQAgAEEIaiECIANBAXFFBEAgAiABEJgtDAELIAIgARD8LAsgAEEYaiABEIgmIABBHGogARCIJiAAQQxqIAEQly0PCyAAQQhqIAEQtwkPCyAAQQRqIAEQ/CwLDwsgAEEEaiABEPwsIABBCGogARCXLQ8LIABBEGoiAC0AFEECRwRAIAEgACkDACAAKAIQEKsdCw8LIABBBGoiA0EEaiECAkACQAJAAkAgAygCAEEBaw4CAQIACyACIAEQmC0MAgsgAigCACABEOwTDAELIAIgARCCLQsgAEEMaiABEPwsIABBEGogARCXLQv+AwECfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCAEEBaw4SCgoLAQIMDAMEBQYLCwcNDQgJAAsgAEEEaiABEJsaDwsgAEEMaiABELIlDwsgASAAQRBqEIEJIABBKGogARDULA8LIABBBGogARDDLCAAQQhqIAEQ1CwgACgCFEUNBiAAQRRqIAEQ1CwPCyAAQRBqIAEQwywgACgCDEEYbCECIAAoAgghAANAIAJFDQYgAEEUaiABELIlIAAgARCbGiACQRhrIQIgAEEYaiEADAALAAsgAEEEaiABEMMsDwsgACgCBCIAQcgAaiABEJsaIAAoAgBBCEcEQCAAIAEQ1SMgAEEoaiABEJsaCyABIABB4ABqENQjDwsCQCAAKAIEIgNBAkYNACAAQQhqIQIgA0EBcUUEQCACIAEQ1SwMAQsgAiABEMMsCyAAQRhqIAEQsiUgAEEcaiABELIlIABBDGogARDULA8LIABBCGogARDSBw8LIABBBGogARDDLAsPCyAAQQRqIAEQwywgAEEIaiABENQsDwsgAEEQaiABENMjDwsgAEEEaiIDQQRqIQICQAJAAkACQCADKAIAQQFrDgIBAgALIAIgARDVLAwCCyACKAIAIAEQrggMAQsgAiABEM4sCyAAQQxqIAEQwywgAEEQaiABENQsC8IEAgV/An4jAEGAAWsiAiQAIAEoAhhBDGogABCLGiAAQSxqIQMgAUEYaiEEAkAgAS0AFEECRwRAIAAoAjAQuhEhBSACQRhqQcif4wApAwAiBzcDACACQQhqIAc3AwAgAkE0aiIGIANBCGooAgA2AgAgAkEBOgAoIAIgADYCICACIAU2AiQgAkEBOgA5IAJBwJ/jACkDACIINwMQIAIgCDcDACACIAMpAgA3AiwgAiAALQA8OgA8IAIgAC8BOjsBOiAALQA4IQMgAiAALQA9OgA9IAIgAzoAOCACIAFBAxDRFSACKAIwELoRIQAgAkHYAGogBzcDACACQcgAaiAHNwMAIAJB9ABqIAYoAgA2AgAgAkEBOgBoIAIgADYCZCACQQE6AHkgAiAINwNQIAIgCDcDQCACIAIpAiw3AmwgAiACLQA8OgB8IAIgAi8BOjsBeiACIAI2AmAgAi0AOCEAIAIgAi0APToAfSACIAA6AHggBCACQUBrIgAQ3AMgABD9KCACEP0oDAELIAAoAjAQuhEhASACQdgAakHIn+MAKQMAIgc3AwAgAkHIAGogBzcDACACQfQAaiADQQhqKAIANgIAIAJBAToAaCACIAA2AmAgAiABNgJkIAJBAToAeSACQcCf4wApAwAiBzcDUCACIAc3A0AgAiADKQIANwJsIAIgAC0APDoAfCACIAAvATo7AXogAC0AOCEBIAIgAC0APToAfSACIAE6AHggBCACQUBrIgAQ3AMgABD9KAsgAkGAAWokAAuoBAEEfyMAQYABayICJAAgAkEYakHIn+MAKQMANwIAIAJBADsBQiACQQA2AjggAkKAgICAgAE3AjAgAkEBOgAsIAJBADYCKCACQoCAgIDAADcCICACQQA2AgwgAkKAgICAgAE3AgQgAkHAn+MAKQMANwIQIAIgAC8BPDsBQCACIAAoAjg2AjwgASACQQRqEJkaIAJBMGohBAJAAkAgAigCOCIBBEAgAEEMaiABEIApIAJBxABqIAIoAjQgAigCOBCdCiACIAIoAkQ2AlggAiACKAJIIgE2AlAgAiABIAIoAkxBBHQiA2oiBTYCXANAIANFDQIgAkEEaiABKQMAIAEoAggQxxAgA0EQayEDIAFBEGohAQwACwALIAJB0ABqIgEgAkEEakEsEPwGGiAAQRxqIAEQmhogBBCFIwwBCyACIAU2AlQgAkHQAGoQkxcgAC0AKEUEQCAAIAIoAjgQjR4gAiACKAIwNgJYIAIgAigCNCIBNgJQIAIgASACKAI4QQR0IgNqIgQ2AlwDQCADBEAgACABKQMAIAEoAghBARCOBiADQRBrIQMgAUEQaiEBDAELCyACIAQ2AlQgAkHQAGoiARCTFyABIAJBBGpBLBD8BhogAEEcaiABEJoaDAELIAJB2ABqIARBCGooAgA2AgAgAiAEKQIANwNQIABBLGogAkHQAGoiARCiECABIAJBBGpBLBD8BhogAEEcaiABEJoaCyACQYABaiQAC5sEAQJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCAEEBaw4SCgoLAQIKCgMEBQYLCwcMDAgJAAsgAEEEaiABELcaDwsgAEEMaiABEI8mDwsgAEEoaiABEJ8tDwsgAEEEaiABEJstIABBCGogARCfLSAAKAIURQ0GIABBFGogARCfLQ8LIABBEGogARCbLSAAKAIMQRhsIQIgACgCCCEAA0AgAkUNBiAAQRRqIAEQjyYgACABELcaIAJBGGshAiAAQRhqIQAMAAsACyAAQQRqIAEQmy0PCyAAKAIEIgBByABqIAEQtxogAEHgAGohAgJAAkACQCAAKAIAQQdrDgIBAgALIAAgARCrEgsgAEEoaiABELcaCyACKAIAQYCAgIB4Rg0DIAIgARC3Gg8LAkAgACgCBCIDQQJGDQAgAEEIaiECIANBAXFFBEAgAiABEKAtDAELIAIgARCbLQsgAEEYaiABEI8mIABBHGogARCPJiAAQQxqIAEQny0PCyAAQQhqIAEQwQ0PCyABLQAMIQIgAUEBOgAMIABBBGogARCbLSABIAI6AAwLDwsgAEEEaiABEJstIABBCGogARCfLQ8LIABBBGoiA0EEaiECAkACQAJAAkAgAygCAEEBaw4CAQIACyACIAEQoC0MAgsgAigCACABEO4TDAELIAIoAgAgARCrEgsgAEEMaiABEJstIABBEGogARCfLQuMBAECfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgBBAWsOEgoKCwECCgoDBAUGCwsHDAwICQALIABBBGogARDCGg8LIABBDGogARC8Jg8LIABBKGogARDKLQ8LIABBBGogARCyLSAAQQhqIAEQyi0gACgCFEUNBiAAQRRqIAEQyi0PCyAAQRBqIAEQsi0gACgCDEEYbCECIAAoAgghAANAIAJFDQYgAEEUaiABELwmIAAgARDCGiACQRhrIQIgAEEYaiEADAALAAsgAEEEaiABELItDwsgACgCBCIAQcgAaiABEMIaIAAoAgAiAkEIRwRAIAEtACghAyABQQE6ACggAkEHRwRAIAAgARDQEQsgAUEAOgAoIABBKGogARDCGiABIAM6ACgLIABB4ABqIAEQnSQPCwJAIAAoAgQiA0ECRg0AIABBCGohAiADQQFxRQRAIAIgARDLLQwBCyACIAEQsi0LIABBGGogARC8JiAAQRxqIAEQvCYgAEEMaiABEMotDwsgAEEIaiABEJUMDwsgAEEEaiABELItCw8LIABBBGogARCyLSAAQQhqIAEQyi0PCyAAQQRqIgNBBGohAgJAAkACQAJAIAMoAgBBAWsOAgECAAsgAiABEMstDAILIAIoAgAgARDgEgwBCyACIAEQwy0LIABBDGogARCyLSAAQRBqIAEQyi0LiAQBCH8gASgCBCIFBEAgASgCACEEA0ACQCADQQFqIQICfyACIAMgBGotAAAiCMAiCUEATg0AGgJAAkACQAJAAkACQAJAAkACQAJAAkAgCEG/5dgAai0AAEECaw4DAAECDAtBwPbYACACIARqIAIgBU8bLQAAQcABcUGAAUcNCyADQQJqDAoLQcD22AAgAiAEaiACIAVPGywAACEHIAhB4AFrIgZFDQEgBkENRg0CDAMLQcD22AAgAiAEaiACIAVPGywAACEGIAhB8AFrDgUEAwMDBQMLIAdBYHFBoH9HDQgMBgsgB0Gff0oNBwwFCyAJQR9qQf8BcUEMTwRAIAlBfnFBbkcgB0FATnINBwwFCyAHQUBODQYMBAsgCUEPakH/AXFBAksgBkFATnINBQwCCyAGQfAAakH/AXFBME8NBAwBCyAGQY9/Sg0DC0HA9tgAIAQgA0ECaiICaiACIAVPGy0AAEHAAXFBgAFHDQJBwPbYACAEIANBA2oiAmogAiAFTxstAABBwAFxQYABRw0CIANBBGoMAQtBwPbYACAEIANBAmoiAmogAiAFTxstAABBwAFxQYABRw0BIANBA2oLIgMiAiAFSQ0BCwsgACADNgIEIAAgBDYCACABIAUgAms2AgQgASACIARqNgIAIAAgAiADazYCDCAAIAMgBGo2AggPCyAAQQA2AgAL8QMBAX8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAQQcgACgCAEEMayIBIAFBJk8bQQFrDiQAAQIbAwQFBgcICQoLDA0ODxAR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EMAsIAAoAgxBGGwhAiAAKAIIIQADQCACRQ0GIABBFGogARCxJSAAIAEQkBogAkEYayECIABBGGohAAwACwALIABBBGogARDALA8LIAAoAgQiAEHIAGogARCQGiAAKAIAQQhHBEAgACABENcjIABBKGogARCQGgsgASAAQeAAahDWIw8LAkAgACgCBCIDQQJGDQAgAEEIaiECIANBAXFFBEAgAiABENcsDAELIAIgARDALAsgAEEYaiABELElIABBHGogARCxJSAAQQxqIAEQ1iwPCyAAQQhqIAEQuwwPCyAAQQRqIAEQwCwLDwsgAEEEaiABEMAsIABBCGogARDWLA8LIABBBGoiA0EEaiECAkACQAJAAkAgAygCAEEBaw4CAQIACyACIAEQ1ywMAgsgAigCACABEOQTDAELIAIgARDTLAsgAEEMaiABEMAsIABBEGogARDWLAvmAwECfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgBBAWsOEgoKCwECCgoDBAUGCwsHDAwICQALIABBBGogARCxGg8LIABBDGogARCJJg8LIABBKGogARCVLQ8LIABBBGogARD7LCAAQQhqIAEQlS0gACgCFEUNBiAAQRRqIAEQlS0PCyAAQRBqIAEQ+ywgACgCDEEYbCECIAAoAgghAANAIAJFDQYgAEEUaiABEIkmIAAgARCxGiACQRhrIQIgAEEYaiEADAALAAsgAEEEaiABEPssDwsgACgCBCIAQcgAaiABELEaIAAoAgBBCEcEQCAAIAEQ9iMgAEEoaiABELEaCyABIABB4ABqEPUjDwsCQCAAKAIEIgNBAkYNACAAQQhqIQIgA0EBcUUEQCACIAEQli0MAQsgAiABEPssCyAAQRhqIAEQiSYgAEEcaiABEIkmIABBDGogARCVLQ8LIABBCGogARC9DA8LIABBBGogARD7LAsPCyAAQQRqIAEQ+ywgAEEIaiABEJUtDwsgAEEEaiIDQQRqIQICQAJAAkACQCADKAIAQQFrDgIBAgALIAIgARCWLQwCCyACKAIAIAEQ6xMMAQsgAiABEIYtCyAAQQxqIAEQ+ywgAEEQaiABEJUtC+YDAQJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCAEEBaw4SCgoLAQIKCgMEBQYLCwcMDAgJAAsgAEEEaiAB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BkGfBSABKAIgELgKIQAMBwtBACEAAkACQCABKAIEQQFrDgIBCAALIAIgA0EgaigCACABKAIUELgKIQAMBwsgAiADQSBqKAIAIAEoAhQQuAohAAwGCyACIANBIGooAgAgACgCABC4CiEADAULIAIgA0EgaigCACAAKAIAELgKIQAMBAsgASgCDEUNAyABKAIIIQAMAQsgASgCBCIAKAIAQQNHBEAgAEEgaiEADAELIABBEGohAAsgACgCACEBDAALAAsLIARBEGokACAAC9wDAQt/IAAoAhggAEEkaigCACAAKAIAIABBDGooAgAQxh0hAyAAQcgAQTAgACgCSCAAQdQAaigCACAAKAIwIABBPGooAgAQxh1B/wFxQf8BRiIEG2ohAiAAQTBByAAgBBtqIgQgACADQf8BcSIFQf8BR0EYbGoiAyACIAIoAgAgAkEMaigCACAAIAVB/wFGQRhsaiIAKAIAIABBDGooAgAQxh1B/wFxQf8BRiIHGyAEKAIAIARBDGooAgAgAygCACADQQxqKAIAEMYdQf8BcUH/AUYiCBsiBSgCACEJIAAgAiADIAgbIAcbIgYoAgAhCiAFQQxqKAIAIQsgBkEMaigCACEMIAFBEGogAiAAIAcbIgBBEGopAgA3AgAgAUEIaiAAQQhqKQIANwIAIAEgACkCADcCACABIAUgBiAJIAsgCiAMEMYdQf8BcUH/AUYiAhsiACkCADcCGCABQShqIABBEGopAgA3AgAgAUEgaiAAQQhqKQIANwIAIAFBQGsgBiAFIAIbIgBBEGopAgA3AgAgAUE4aiAAQQhqKQIANwIAIAEgACkCADcCMCABIAMgBCAIGyIAKQIANwJIIAFB0ABqIABBCGopAgA3AgAgAUHYAGogAEEQaikCADcCAAuyAwEMfyMAQRBrIgUkAAJAIAEoAhAiBCABKAIMIgJJDQAgBCABKAIIIgxLDQAgAUEUaiINIAEtABgiBmpBAWstAAAhCSABKAIEIQoCQCAGQQRNBEADQCACIApqIQcCQCAEIAJrIghBB00EQCACIARGDQRBACEDA0AgAyAHai0AACAJRg0CIAggA0EBaiIDRw0ACwwECyAFQQhqIAkgByAIELYHIAUoAghBAUcNAyAFKAIMIQMLIAEgAiADakEBaiICNgIMAkAgAiAGSSACIAxLcg0AIAogAiAGayIDaiANIAYQnBUNACAAIAI2AgggACADNgIEQQEhCwwECyACIARNDQAMAwsACwNAIAIgCmohBwJAIAQgAmsiCEEITwRAIAUgCSAHIAgQtgcgBSgCAEEBRw0DIAUoAgQhAwwBCyACIARGDQJBACEDA0AgAyAHai0AACAJRg0BIAggA0EBaiIDRw0ACwwCCyABIAIgA2pBAWoiAjYCDCACIAxNIAIgBk9xRQRAIAIgBE0NAQwDCwsgBkEEQYzy4AAQrxAACyABIAQ2AgwLIAAgCzYCACAFQRBqJAALwAcCD38DfiMAQRBrIgskACABKAIIRQRAAkAjAEFAaiIFJAAgBSABQRBqIgk2AgwgASgCDCEHIAUgBUEMajYCECAHQX9HBEACfwJAIAEoAgQiBiAGQQFqQQN2QQdsIAZBCEkbIgZBAXYgB00EQCAFQTBqQQwgByAGIAYgB0kbQQFqELgLIAUoAjQiCiAFKAIwIgZFDQIaIAUoAjghDCAFIAUoAjw2AiwgBSAMNgIoIAUgCjYCJCAFQoyAgICAATcCGCAFIAk2AhQgBSAGNgIgIAZBCGohDyABKAIAIgkpAwBCf4VCgIGChIiQoMCAf4MhFCAFQSBqIRADQAJAIAcEQANAIBRCAFINAiAIQQhqIQggCSkDCEJ/hUKAgYKEiJCgwIB/gyEUIAlBCGohCQwACwALIAUgASgCDCIHNgIsIAUgDCAHazYCKCABIBAQghggBUEUahD3FAwDCyAGIAYgCiABKAIAIBR6p0EDdiAIaiIOQXRsakEMaygCAEG5893xeWytIhUQ2hAiDWogFUIZiKciEToAACAPIA1BCGsgCnFqIBE6AAAgBiANQX9zQQxsaiINIAEoAgAgDkF/c0EMbGoiDikAADcAACANQQhqIA5BCGooAAA2AAAgB0EBayEHIBRCAX0gFIMhFAwACwALIAEgBUEQakHmA0EMEL0EC0EACxogBUFAayQADAELEKkbAAsLIAEoAgAiBkEMayEMIAJBufPd8XlsIgUgASgCBCIKcSEIIAVBGXYiCa1CgYKEiJCgwIABfiEWQQAhBSAAAn8CQANAIAYgCGopAAAiFSAWhSIUQn+FIBRCgYKEiJCgwIABfYNCgIGChIiQoMCAf4MhFAJAA0AgFFBFBEAgDEEAIBR6p0EDdiAIaiAKcWsiB0EMbGooAgAgAkYNAiAUQgF9IBSDIRQMAQsLQQEhByAFQQFHBEAgC0EIaiAKIBUgCBDEHSALKAIMIRIgCygCCCEHCyAVIBVCAYaDQoCBgoSIkKDAgH+DQgBSDQIgE0EIaiITIAhqIApxIQggByEFDAELCyAGIAdBDGxqIgFBCGsiAikCACEUIAFBBGsgBDYCACACIAM2AgAgACAUNwIEQQEMAQsgBiAGIBIQ8x0iAGoiBS0AACEHIAUgCToAACAGIAogAEEIa3FqQQhqIAk6AAAgASABKAIMQQFqNgIMIAEgASgCCCAHQQFxazYCCCAGIABBdGxqIgBBBGsgBDYCACAAQQhrIAM2AgAgAEEMayACNgIAQQALNgIAIAtBEGokAAuJBAIFfwF+IwBBIGsiAiQAIAFBKGoiBRC6ICEDAkAgBRDNDSIERQRAIAEoAoACIQEgAkEAOgAIIAEgASACQQhqEP0UIQEgAEIANwMAIAAgATYCCAwBCwJAAkACQCAEKAIAQSRGBEAgASABKQPgAjcDmAMgASgCyAIgAUElNgLIAkEkRw0BIAEoAswCIQEgAEIANwMAIAAgATYCCAwECyABKALIAiEEIAFBJTYCyAIgASABKQPgAjcDmAMgAkEUaiABQdQCaikCADcCACACQRxqIAFB3AJqKAIANgIAIAIgASkCzAI3AgwgAiAENgIIIAJBCGoiBhDCCgJAIAEoApwDIAUQuiBHBEAgASgCnAMhBCACQd0AOgAIIAMgBCADIARJGyADIAQgAyAESxsgBhD9FCEDIAUQzQ0iBEUNBCAEKAIAQSRGDQEMBAsgAkEIaiABENEEIAIpAwgiB1BFBEAgACAHNwMAIAAgAyABKAKcAyIBIAEgA0kbNgIMIAAgAyABIAEgA0sbNgIIDAULIAIoAhAhASAAQgA3AwAgACABNgIIDAQLIAEgASkD4AI3A5gDIAEoAsgCIAFBJTYCyAJBJEcNASABIAEoAswCEP8LDAILQd3r4ABBKEGUqOAAEO4XAAtB3evgAEEoQaSo4AAQ7hcACyAAQgA3AwAgACADNgIICyACQSBqJAALywMBBn8jAEEgayIDJAAgAyABNgIQIAMgAjYCFCACIAFrQQNqQQJ2IQQCQCAAKAIgIgFBCEkEQCABIQJBByEBDAELIAAoAgQhAgsgAEEgaiEHAn9BgYCAgHggBCABIAJrTQ0AGiADQQhqIAIgBGoiASACTyABEM8VIAMoAgwhAUEAIAMoAghBAXFFDQAaIAMgACABEI0GIAMoAgQhASADKAIACyABEKcgQQchBgJ/IAcoAgAiAkEHTQRAIABBBGohBSAHIQQgAgwBCyAAQQRqIQQgACgCCCEFIAIhBiAAKAIECyIBQQJ0IAVqIQICQANAIAEgBk8EQCAEIAE2AgAgAyADKQIQNwIYIABBBGohBANAIANBGGoQ2goiCEGAgMQARg0DAn8gBygCACIFQQhJBEAgBSEBIAQhBkEHIQUgBwwBCyAAKAIEIQEgACgCCCEGIAQLIQIgASAFRgR/IAAQlBAgACgCCCEGIAQhAiAAKAIEBSABC0ECdCAGaiAINgIAIAIgAigCAEEBajYCAAwACwALIANBEGoQ2goiBUGAgMQARwRAIAIgBTYCACACQQRqIQIgAUEBaiEBDAELCyAEIAE2AgALIANBIGokAAv1AwIFfwF+IwBBIGsiAiQAIAFBKGoiBRDVICEDAkAgBRDnDSIERQRAIAEoAtgCIQEgAkEAOgAIIAEgASACQQhqEP0UIQEgAEIANwMAIAAgATYCCAwBCwJAAkACQCAEKAIAQSRGBEAgASABKQNANwN4IAEoAiggAUElNgIoQSRHDQEgASgCLCEBIABCADcDACAAIAE2AggMBAsgASgCKCEEIAFBJTYCKCABIAEpA0A3A3ggAkEUaiABQTRqKQIANwIAIAJBHGogAUE8aigCADYCACACIAEpAiw3AgwgAiAENgIIIAJBCGoiBhDDCgJAIAEoAnwgBRDVIEcEQCABKAJ8IQQgAkHdADoACCADIAQgAyAESRsgAyAEIAMgBEsbIAYQ/RQhAyAFEOcNIgRFDQQgBCgCAEEkRg0BDAQLIAJBCGogARDTBCACKQMIIgdQRQRAIAAgBzcDACAAIAMgASgCfCIBIAEgA0kbNgIMIAAgAyABIAEgA0sbNgIIDAULIAIoAhAhASAAQgA3AwAgACABNgIIDAQLIAEgASkDQDcDeCABKAIoIAFBJTYCKEEkRw0BIAEgASgCLBCGDAwCC0Hd6+AAQShBlKjgABDuFwALQd3r4ABBKEGkqOAAEO4XAAsgAEIANwMAIAAgAzYCCAsgAkEgaiQAC+wDAQh/IwBBIGsiBSQAIAAoAghBDGwhBiAAKAIEIQADQCAGBEACQCAAKAIABEAgACABEK4tDAELAkACQAJAAkACQEEEIAAoAgQiAigCAEEFayIDIANBBk8bQQFrDgUAAQIDBAULIAJBCGogARC4IiACQShqIAEQri0MBAsgAkEoaiABEK4tDAMLIAVBCGogAkEIaiIHEM8cIAEoAhwiAyABKAIgIgQgAyAEIAUoAgwQ1Q9B5MTgABDfHyEIIAJBKGohCSADIAQCfyACKAJIIgNFBEAgAigCNEEAIAIoAihBgICAgHhHGwwBCyADKAIEC0EBaxCrJiEEIAEgCCgCGEEBaiIDIAQoAhxBAWsiBCADIARJGyADIAQgAyAESxsQ2hggByABELgiIAIoAkggARCWICABIAkQoSQMAgsgAkEgaiEDIAIoAiBBB0cEQCAFQRhqIAMQkgwgASAFKAIYIAUoAhwQ2hggBUEQaiACKAJoEJIMIAEgASgCHCABKAIgIAUoAhBBAWsQqyYiBCgCGCAEKAIcENoYCyACIAEQuCIgAyABEJEkIAJB6ABqIAEQsS0gASACQcgAahChJAwBCyACQQhqIAEQuCIgAigCKCABEPsKCyAAQQxqIQAgBkEMayEGDAELCyAFQSBqJAALjwQCBX8DfiMAQTBrIgMkAAJAAkACQAJAAkACQCAAKALUCkEDRg0AIAIoAgBBAWtBAk8EQCAAKAL4CiIEKAKoAiAEKAKsAkcNAQsgASgC2ARBgICAgHhGDQEgA0EUaiAAQdQKaiABQdgEaiACQQRBABCsByADKAIUIgJBAkcNBSADIAMoAhg2AgxBlOrgAEErIANBDGpB5PvCAEGoi8MAEMYOAAsCQCAAKAK4CkECRg0AIAItABhBAUYgAigCDCIEQYABS3ENACACKAIUIgYgAigCECIHayIFQQAgBSAGTRsgAEG4CmoiBRDrEEsNACABKALUBUGAgICAeEYNAiACKQIAIQggAigCCCEAIANBAToALCADIAY2AiggAyAHNgIkIAMgBDYCICADIAA2AhwgAyAINwIUIANBDGogBSABQdQFaiADQRRqQQRBABDCBSADKAIMIgJBAkYNAwwFCyABKALoBEGAgICAeEYNAyACKQIAIQggAikCCCEJIAIpAhAhCiADQQE6ACwgAyAKNwIkIAMgCTcCHCADIAg3AhQgAyAAQaAKaiABQegEaiADQRRqQQRBABCTByADKAIAIQIMBAtBmIvDABDaKQALQdiKwwAQ2ikACyADIAMoAhA2AhRBlOrgAEErIANBFGpB5PvCAEHoisMAEMYOAAtBqIrDABDaKQALIANBMGokACACQQFxC98DAQJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgBBAWsOEgwMDQECAwQFBgcIDQ0JDg4KCwALIABBBGoQhhsPCyAAQQxqEL0nDwsgAEEANgIgIABBKGoQ4y0PCyAALQAkQQJGDQggAEEANgIgDwsgAC0AJEECRg0HIABBADYCIA8LIABBBGoQ3y0gAEEIahDjLSAAKAIURQ0GIABBFGoQ4y0PCyAAQRBqEN8tIAAoAgxBGGwhASAAKAIIIQADQCABRQ0GIABBFGoQvScgABCGGyABQRhrIQEgAEEYaiEADAALAAsgAEEEahDfLQ8LIAAoAgQiAEHIAGoQhhsgACgCAEEIRwRAIAAQxSUgAEEoahCGGwsgAEHgAGoQxCUPCwJAIAAoAgQiAkECRg0AIABBCGohASACQQFxRQRAIAEQ5C0MAQsgARDfLQsgAEEYahC9JyAAQRxqEL0nIABBDGoQ4y0PCyAAQQhqENAKDwsgAEEEahDfLQsPCyAAQQRqEN8tIABBCGoQ4y0PCyAAQQRqIgJBBGohAQJAAkACQAJAIAIoAgBBAWsOAgECAAsgARDkLQwCCyABKAIAENYUDAELIAEQ4i0LIABBDGoQ3y0gAEEQahDjLQuQBAEEfyMAQTBrIgEkAAJAAkACQAJAAkACQCAAKAIAIgRBCGsOBAABAgMFCyAAKAIEIgIoAiQoAgBBBk0NBAwDCyAAKAIEIgIoAiwoAgBBBk0NAwwCCyAAKAIEIgIoAggNAQwCCyAAKAIEIgIoAghFDQELQQgQ4yAhAyAAEIEXNgIEIABBADYCACADIAI2AgQgAyAENgIAIAFBATYCECABIAM2AgwgAUEBNgIIA0AgASABQQhqEO0VAkACQAJAAkACQCABKAIAIgJBDEcEQCABIAEoAgQiADYCGCABIAI2AhQgAkEIaw4EAQIDBAULIAFBCGoQ1iYMBgsgACgCJCEAEIEXIQIgACgCBCEDIAAgAjYCBCAAKAIAIQIgAEEANgIAIAFBCGogAiADENcYDAMLIAAoAiwhABCBFyECIAAoAgQhAyAAIAI2AgQgACgCACECIABBADYCACABQQhqIAIgAxDXGAwCCyAAKAIIIQIgAEEANgIIIAFBADYCLCABIAA2AiQgASACNgIoIAEgACgCBCIANgIcIAEgACACQQN0ajYCICABQQhqIAFBHGoQywkMAQsgACgCCCECIABBADYCCCABQQA2AiwgASAANgIkIAEgAjYCKCABIAAoAgQiADYCHCABIAAgAkEDdGo2AiAgAUEIaiABQRxqEMsJCyABQRRqEOsHDAALAAsgAUEwaiQAC9kDAgJ/A34jAEGAAmsiBCQAAkAgAigCAEUEQCACLQBFQQNHDQELQd3r4ABBKEHku98AEO4XAAsgBEEYaiACQRBqKQMANwMAIARBIGogAkEYaikDACIGNwMAIAQgAikDCCIHNwMQIAIpA0ghCCAEIAcgBqcQtyMgBEEoaiIFIAQpAwAgBCgCCCACQSBqEMwEIARBQGsgBEEQaiICQQBBACABQRBqIAEpAxBQIgEbQQAgAxsgARsQ7AVBwABBCBChICAEQdAAaiIDIAIQzhsgBEGQAWoiAiADEIMWIAJBwAAQ/AYhASAEQQE2AlggBCABNgJUIARBATYCUCACIAMgBRCfCkEQQQQQoSAiAUEIaiAEQcgAaikCADcCACABIAQpAkA3AgAgBEEBNgJcIAQgATYCWCAEQQE2AlQgAhDVFSEBIARB9ABqQgA3AgAgBEIANwJsIARBBToAaCAEIAE2AmAgBEEXNgJQIARCADcC8AEgBEEDOgDsASAEQQA2AugBIARCADcC+AEgBEIANwLgASAEQoCAgIDAADcC2AEgBEHkAWoQzyUgBEHYAWoQ5CYgAxDYKCEBIAAgCDcDCCAAIAE2AgQgAEESNgIAIAQpAxAQ8RogBEGAAmokAAu8AwINfwF+IAVBAWshDCAFIAEoAhAiDWshDiABKAIcIQcgASgCCCEJIAEpAwAhFCABKAIUIQgDQEEAIAcgBhshDyAJIAkgByAHIAlJGyAGGyILIAUgBSALSRshEAJAIAECfwNAIAMgCCAMaiIHTQRAIAEgAzYCFEEAIQcMAwsgAQJ/IBQgAiAHajEAAIhCAYNQRQRAIAIgCGohCiALIQcCQAJAA0AgByAQRgRAIAkhBwJAA0AgByAPTQRAIAEgBSAIaiICNgIUIAZFBEAgAUEANgIcCyAAIAI2AgggACAINgIEQQEhBwwLCyAHQQFrIgcgBU8NBSADIAcgCGoiCksEQCAEIAdqLQAAIAIgCmotAABHDQIMAQsLIAogA0Hk6eAAEK0QAAsgASAIIA1qIgg2AhQgBg0GIA4MBwsgByAIaiIRIANPDQEgByAKaiESIAQgB2ogB0EBaiEHLQAAIBItAABGDQALIBEgCWtBAWoMAwsgAyAIIAtqIgAgACADSRsgA0H06eAAEK0QAAsgByAFQdTp4AAQrRAACyAFIAhqCyIINgIUIAYNAAtBAAsiBzYCHAwBCwsgACAHNgIAC+YDAgF/AX4jAEFAaiIFJAAgBUEwaiABIAJBABDTAQJAAkAgBS0AMEEERg0AIAUpAzAiBkL/AYNCBFENACAAIAY3AgAMAQsCQAJAAkACQAJAAkAgAkUNACAFQTBqIAEgAhDLHCAFLQAwQQRGDQAgBSkDMCIGQv8Bg0IEUg0BCyABLQBMDQEgBUEQaiADEJYMIAVBMGogBSgCECAFKAIUENkDIAVBIGogASAFKAI0IgIgBSgCOBDjECAFLQAgQQRHBEAgBSkDICIGQv8Bg0IEUg0DCwwECyAAIAY3AgAMBAsgBUEIaiADEJYMIAVBMGogBSgCCCAFKAIMENkDIAVBIGogBSgCNCICIAUoAjhBACABLQBREJoBIAVBGGogASAFKAIkIgMgBSgCKBDjECAFLQAYQQRHBEAgBSkDGCIGQv8Bg0IEUg0CCyAFKAIgIAMQriQMAgsgACAGNwIAIAUoAjAgAhCuJAwCCyAAIAY3AgAgBSgCICADEK4kIAUoAjAgAhCuJAwBCyAFKAIwIAIQriQCQCAERQ0AIAVBADYCMCAFQSBqIAEgBUEwakGbteAAQQEQrBMgBS0AIEEERg0AIAUpAyAiBkL/AYNCBFENACAAIAY3AgAMAQsgAEEEOgAACyAFQUBrJAALoQQBAX8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIAIgAoAgAOExISAQIDBAUGBwgJCgsMDQ4PEBEACyAAQQhqEOUhDBELIAAoAgRBgICAgHhGBEAgAEEIahDuJiAAQSBqEMwdIABBFGoQoCUMEQsgAEEEahDuJiAAQRxqEMwdIABBEGoQoCUMEAsgAEEQahD6HCAAKAIoENUoDA8LAkAgAEEQaiIBLQA0QQRGBEAgARD6HAwBCyABEOUhCyAAKAJQENUoDA4LIABBBGoQwQkgACgCBCAAQQhqKAIAEI0qDA0LIABBBGoQsgUMDAsgAEEEahC3GSAAKAIEIABBCGooAgAQjSoMCwsgAEEEahCyBQwKCyAAQQRqELIFDAkLIABBCGoQ8CYMCAsgAEEEahCyBSAAQQhqELIFIABBDGoQsgUgAEEQahCyBQwHCyAAQRBqEI0hDAYLIABBBGoQsgUMBQsgAEEEahCyBQwECyAAQQRqELIFIABBCGoQsgUMAwsgAEEQahCNISAAQUBrEKonIABBxABqEKonDAILAkACQAJAAkBBBCAAKAIIQYCAgIB4cyIBIAFBBE8bDgQBAgUDAAsgAEEIahDwJiAAQRRqEPIiDAQLIABBIGoQmSUMAwsgAEEQahDvKAwCCyAAQRBqEKElDAELIABBCGoQmyUgAEEoahCrJwsgAEHYAEEIENERC6gDAQJ/An8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAEoAgBBAWsOEwECAwQFBgcICQoLDA0ODxAREhMACyABQQhqIQIgAUEEagwTCyABQQhqIQIgAUEEagwSCyABQQRqIgNBGEEUIAEoAgRBgICAgHhGIgEbaiECIANBFEEQIAEbagwRCyABQQxqIQIgAUEIagwQCyABQQxqIQIgAUEIagwPCyABQRRqIQIgAUEQagwOCyABQQxqIQIgAUEIagwNCyABQRRqIQIgAUEQagwMCyABQQxqIQIgAUEIagwLCyABQQxqIQIgAUEIagwKCyABQRhqIQIgAUEUagwJCyABQRhqIQIgAUEUagwICyABQQxqIQIgAUEIagwHCyABQQxqIQIgAUEIagwGCyABQQxqIQIgAUEIagwFCyABQRBqIQIgAUEMagwECyABQQxqIQIgAUEIagwDCyABQSxqIQIgAUEoagwCCyABQSRqIQIgAUEgagwBCyABQQxqIQIgAUEIagshAyAAIAIoAgA2AgQgACADKAIANgIAC/wDAQJ/IAAgAWohAgJAAkAgACgCBCIDQQFxDQAgA0ECcUUNASAAKAIAIgMgAWohASAAIANrIgBB0I/kACgCAEYEQCACKAIEQQNxQQNHDQFByI/kACABNgIAIAIgAigCBEF+cTYCBCAAIAFBAXI2AgQgAiABNgIADAILIAAgAxDQBgsCQAJAAkAgAigCBCIDQQJxRQRAIAJB1I/kACgCAEYNAiACQdCP5AAoAgBGDQMgAiADQXhxIgIQ0AYgACABIAJqIgFBAXI2AgQgACABaiABNgIAIABB0I/kACgCAEcNAUHIj+QAIAE2AgAPCyACIANBfnE2AgQgACABQQFyNgIEIAAgAWogATYCAAsgAUGAAk8EQCAAIAEQxgcPCyABQfgBcUG4jeQAaiECAn9BwI/kACgCACIDQQEgAUEDdnQiAXFFBEBBwI/kACABIANyNgIAIAIMAQsgAigCCAshASACIAA2AgggASAANgIMIAAgAjYCDCAAIAE2AggPC0HUj+QAIAA2AgBBzI/kAEHMj+QAKAIAIAFqIgE2AgAgACABQQFyNgIEIABB0I/kACgCAEcNAUHIj+QAQQA2AgBB0I/kAEEANgIADwtB0I/kACAANgIAQciP5ABByI/kACgCACABaiIBNgIAIAAgAUEBcjYCBCAAIAFqIAE2AgALC+sDAgZ/AX4jAEGAAWsiBSQAQYCAgIB4IQYgASgCACIJQYCAgIB4RwRAIAEoAgQhCCABKAIIIQYgBUEBOwEwIAUgBjYCLEEAIQEgBUEANgIoIAVBAToAJCAFQQo2AiAgBSAGNgIcIAVBADYCGCAFIAY2AhQgBSAINgIQIAVBCjYCDCAFQUBrIAVBDGoQ+QUCfyAFKAJAQYCAgIB4RgRAQQQhB0EADAELIAVBBEEEQQwQuRQgBUHIAGooAgAhASAFKAIAIQYgBSgCBCIHIAUpAkA3AgAgB0EIaiABNgIAIAVBATYCPCAFIAc2AjggBSAGNgI0IAVBzABqIAVBDGpBKBD8BhpBDCEGQQEhAQNAIAVB9ABqIAVBzABqEPkFIAUoAnRBgICAgHhGRQRAIAUoAjQgAUYEQCAFQTRqQQEQ2h4gBSgCOCEHCyAFKQJ0IQsgBiAHaiIKQQhqIAVB/ABqKAIANgIAIAogCzcCACAFIAFBAWoiATYCPCAGQQxqIQYMAQsLQYCAgIB4IAUoAngQriQgBSgCOCEHIAUoAjQLIQYgCSAIENYpCyAAIAM2AhAgACACNgIMIAAgATYCCCAAIAc2AgQgACAGNgIAIAAgBCkAADcAFCAAQRxqIARBCGovAAA7AAAgBUGAAWokAAvPAwEFfyMAQeAAayIEJAAgBEHEAGogASACIAMQ9QkCQCAEKAJEIgVBAkYEQCAEKAJIIQEgAEECNgIAIAAgATYCBAwBCyAFQQFHBEAgAEEANgIADAELIAQoAkghBgJAAkAgAygCECIHIAQoAkwiBUcEQCADKAIADQEgASgC+AQiCCgCqAIgCCgCrAJGDQEgBCAHNgJUIARBADYCRCAEIAMoAhQ2AlggBCADKAIMNgJQIAQgAy0AGDoAXCAEIAMpAgQ3AkggBEEoaiAEQcQAaiIDIAcgBRD8CSAEQRBqIARBMGopAgA3AwAgBEEYaiAEQThqKQIANwMAIARBI2ogBEHDAGotAAA6AAAgBEEBNgIoIAQgBC8AQTsAISAEIAQpAig3AwggBEEAOgAgIAMgAUGIBWogAkHAAWogBEEIahD2CSAEKAJEIgFBAkcEQCABQQFxRQ0DIABBBGogBiAEKAJMIAUQ7RIgAEEBNgIADAQLIAQoAkghASAAQQI2AgAgACABNgIEDAMLIABBBGogBiAFIAUQ7RIgAEEBNgIADAILIABBBGogBiAHIAUQ7RIgAEEBNgIADAELQcT8wgBBMEHk/cIAELUSAAsgBEHgAGokAAusAwEFfyMAQTBrIgMkAAJAAn9BASABIAJNDQAaIANBEGogAiAAIAFBnJbEABCKHSADKAIUIgZFDQECQAJAIAMoAhAiBywAACIEQQBIBEAgBEFAcUGAf0YNBAJ/QQIgBEFgSQ0AGkEDIARBcEkNABogBEF3Sw0FQQQLIgQgBksNBCADQRxqIAcgBBDVAyADKAIcQQFGDQQgAyADKAIgIgUgAygCJGo2AiwgAyAFNgIoIANBKGoQ2gpBgIDEAEYNAQsgA0EIaiACIAAgAUGslsQAEIodQQEgAygCDCICRQ0CGiADKAIIIgQsAAAiAEEATgRAIABB/wFxIQEMAgtBASAAQUBxQYB/Rg0CGgJ/QQIgAEFgSQ0AGkEDIABBcEkNABpBASAAQXdLDQMaQQQLIQFBASABIAJLDQIaIANBHGogBCABENUDIAMoAhxFBEAgAyADKAIgIgAgAygCJGo2AiwgAyAANgIoIANBKGoQ2goiAUGAgMQARw0CQYicxAAQ2ikAC0EBDAILQYicxAAQ2ikACyABENsLQf8BcUEBcwtBAXEhBQsgA0EwaiQAIAULiMYFAokFfwV+IwBBwAFrIgskACALQaEBakGCBjsAACALQQM6AJQBIAtCgICAgICAwIABNwC1ASALQQo6ALQBIAtBADoAvQEgC0KAgICAoB83AqwBIAtCgICAgMAANwKkASALQQA6AJgBIAtBAjYCgAEgC0ECNgJ4IAtBAjYCcCALQoGAgICAgIDQADcCaCALQoGAgICAgIAQNwJgIAtCgoSIkKDAgIECNwCZASALQaQBakEBEO8eIAsoAqgBIAsoAqwBIg1BDGxqIQYCQAJAA0AgBUUEQCALQQZBAEEBQQEQlQogCygCBCEHIAsoAgBBAUYNAiALKAIIIgVBBGpB993YAC8AADsAACAFQfPd2AAoAAA2AAAgBkEIakEGNgIAIAZBBGogBTYCACAGIAc2AgAgBkEMaiEGQQEhBSANQQFqIQ0MAQsLIAsgDTYCrAEgCyALQeAAakHgABD8BiIfQeAAaiGDAkEAIQYjAEHwCmsiAyQAIAMgHygCTCIFNgJsAkACQAJAAkACQAJAAkAgBUEBRgRAIB8tADwhGSAfLQA0IhJBA0YgEkECRnINASAfKAIoIhggGCgCACIFQQFqNgIAIAVBAEgNAiAfKAIwIQYgHygCLCEjDAELIANBADYCqARBAEHsndgAIANB7ABqIANBqARqQbT7wgAQzhoMAQsgHy0AXSEiIB8tAFshFSAfLQBaIUAgHy0AWSENIB8tAFghICAfLQBXIUMgHy0AViEmIB8tAFUhKyAfLQBUISEgHygCUCERIB8tADkhRCAfLQA4IQcgHy0AQSEPIB8tAEAh3QEgHy0APyEeIB8oAiQhDCAfKAIgIRMgHygCHCEdIB8oAhghFiAfLQA+IQQgHy0APSEJIB8oAgQh3gEgHygCACE2IB8oAhQhRSAfKAIQITcgHygCDCEKIB8oAgghFyAfLQBCIQ4gA0HgAGogHygCSCIFKAIEIAUoAggQyA4gAygCZCHvBCADKAJgIesEIANBzQFqQYIEOwAAIANBgoSIEDYAyQEgA0EKOgDPASADQQE6AMgBIANC+gE3AtABIANBAzoAxgEgA0KChIiQoMCAgQI3Ab4BIANBADoAvAEgA0EDOgC4ASADQQI2AqQBIANBAjYCnAEgA0ECNgKUASADQQI2AowBIANBADYChAEgAyAGNgKwBCADICM2AqwEIAMgGDYCqAQgAyASOgC0BCASQQNGBEAgA0GoBGoQyCRBAyESCyADQckBaiHfASADKAKQASEIIAMoApgBIRAgAygCoAEh4wEgAygCqAEh4AEgAy0AvQEhCyADKAKIASEFIANBrAFqIvMEEMgkIAMgQDoA1AEgAyAOOgDGASADIA86AMUBIAMg3QE6AMQBIAMgHjoAwwEgAyAEOgDCASADIAk6AMEBIAMgGToAwAEgA0GBAjsBvgEgAyASOgC4ASADIAY2ArQBIAMgIzYCsAEgAyAYNgKsASADIDY2AoQBIAMg3gEgBSA2GzYCiAEgAyAHOgC8ASADIEQgCyAHQQFxGzoAvQEgAyATNgKkASADIOABIAwgE0ECRhs2AqgBIAMgFjYCnAEgAyDjASAdIBZBAkYbNgKgASADIDc2ApQBIAMgECBFIDdBAkYbNgKYASADIBc2AowBIAMgCCAKIBdBAkYbNgKQASADICI6ANUBIAMgETYC0AEgA0ECQQAgFUEBcRs6AM0BIANBAUECICBBAXEbOgDOASADQQFBAiAmQQFxGzoAygEgA0EBQQIgK0EBcRs6AMkBIAMgIToAzwEgA0EBQQIgQ0EBcRs6AMsBIANBAUECIA1BAXEbOgDMASADQQE6AMgBIAMg7wQ2AtwBIAMg6wRBCGo2AtgBIANBADYC6AEgA0KAgICAwAA3AuABIANBADYC9AEgA0KAgICAwAA3AuwBIANCgICAgBA3AsgKIAMgA0HgAWoiQzYCxAogAyADQdgBajYCwAogA0HUBGohLiADQdgEaiFAIANBtARqITYgA0GwBGohOiADQewEaiEmIANBoANqITcgA0GYAmohKyADQYgCaiEhA0AgA0HYAGogA0HACmoQuA8gAygCXCIFRQRAIANCgICAgBA3AsADIAMgQzYCvAMgA0EANgLYAyADQgA3AtADIAMgAygC5AEiBTYCyAMgAyAFIAMoAugBQQN0ajYCzAMgAyADQdgBajYCuAMgA0GsBGohISADQYwCaiEdIANBvARqIREgA0GwBGohDCADQbQKaiEEIANBoANqIQkgA0GIA2ohCiADQfwBaiEeA0AgA0EwaiADQbgDahC4DyADQeQCaiEFAn9BACADKAI0IgZFDQAaQQAgAygCyAMiCyADKALMA0YNABogAygCMCENIAMgBjYC5AIgAyALQQhqNgLIAyADQeACaiEFIAsLIQYgBSAGNgIAIAMoAuQCIgVFBEBBAyELIAMtAMABIRsgAy0AvwEhHCADLQC+ASEoIAMoAvQBIRggAygC8AEhBSADLQC4ASIHQQNHBEAgB0ECRwRAIAMoAqwBIt4BIN4BKAIAIg1BAWo2AgAgDUEASA0GIAMoArABIeMBIAMoArQBIeABCyAHIQsLIAMtAL0BIS4gAy0AvAEhMiADLQDFASE4IAMtAMQBITogAy0AwwEhEyADKAKoASEWIAMoAqQBITYgAygCoAEhNyADKAKcASEXIAMtAMIBId8BIAMtAMEBIRkgAygCiAEhIiADKAKEASEVIAMoApgBIUAgAygClAEhICADKAKQASFDIAMoAowBISYgAy0AxgEhKyADQQhqIBhBBBC8FEEAIQ0gA0EANgKwBCADIAMoAgwi7AQ2AqwEIAMgAygCCCLoBDYCqAQCQAJAIBgg6ARLBEAgA0GoBGpBACAYQQRBBBCkFyADKAKwBCENIAMoAqwEIewEDAELIBhFDQELIA0gGGog7AQgDUECdGohEgNAIBIgBTYCACAFQRxqIQUgEkEEaiESIBhBAWsiGA0ACyADKAKsBCHsBCADKAKoBCHoBCENC0EAIRggA0EANgKkBCADQoCAgIDAADcCnAQgDUECdCEHQQQhI0EAIQYDQCAHIBhGBEAgAyADKAKgBCIFNgKwBEEAIRIgA0EANgKoBCADIAUgBkECdGo2ArQEIANBqARqEJcTIQcgA0GoBGoQlxMiBQR/IAUoAgAoAgAiBSgCFCHdASAFKAIQBUEACyE7IAMoAqgEIRggAygCtAQhISADKAKwBCEIIAMoAqwEIRBBASEGQQEhI0F/QQAgBxsi5AEh5QFBACFBQQAhHkEAISkDQEEAIQcDQCAeIQ4DQCAHIR4CfwJAAkACQCAYQQFxRQRAIAggIUYNAiAIIgVBBGohCAwBCyAQIgVFDQELIAUoAgAhFCAjQQFxQQAhIwRAIBQtADAhIwsgFCgCLAJAAkAgO0EBcSIHRSAUKAIQIgVFckUEQCDdASAUKAIURw0BDAILIAcNACAFRQ0BC0EAITsLIBJqIRogBkEBcUEAIQYEQCAULQAxIQYLIBQoAighESAUKAIkIQ8gFCgCICEMIBQoAhwhHSAUKAIYIQQgEiAaSyEJQQEhByApQQFxRQRAIBQoAgANAkEAITwLQQEMAgtBNEEEEKEgIgUgBkEBcToAMiAFQQA6ADEgBSAjQQFxOgAwIAUgEjYCLCAFIC02AiggBSDhATYCJCAFIOQBNgIgIAUg5QE2AhwgBSBBNgIYIAUg3QE2AhQgBSA7NgIQIAUgRTYCDCAFIA42AgggBSBENgIEIAUgPDYCAEHcAEEEEKEgIiUgKzoASiAlIDg6AEkgJSA6OgBIICUgEzoARyAlIN8BOgBGICUgGToARSAlIBs6AEQgJSAcOgBDICUgKDoAQiAlIC46AEEgJSAyOgBAICUgCzoAPCAlIOABNgI4ICUg4wE2AjQgJSDeATYCMCAlIBY2AiwgJSA2NgIoICUgNzYCJCAlIBc2AiAgJSBANgIcICUgIDYCGCAlIEM2AhQgJSAmNgIQICUgIjYCDCAlIBU2AgggJUKBgICAEDcCACAlIAU2AlggJUHUAGogA0GkBGooAgA2AgAgJSADKQKcBDcCTCADICU2ArgDIANBqARqISQg7AQhISANIQFBACEGQQAhD0EAIR1BACEQQQAhCiMAQdApayICJAACQAJAAkACQAJAAkACQAJ/AkACfwJAAkACQAJAAkACQCAlIgUoAlgtABxBAXFFBEBB0JDEACAFQTBqIAUtADxBA0YbIg0tAAxBAkYiB0UEQEEAIA0gBxsiDSgCACIHIAcoAgAiD0EBajYCACAPQQBIDQQgAiAHNgI4IAIgDS0ADDoARCACIA0pAgQ3AjwMAwsgBS0ARCIHQQJGIAdBAXFyRQRAIAJBAjoARAwDCyAFLQBCIQ8gAkEAOgDwDCACQuSAgICgHzcC6AwgAkKKgICAoAE3AuAMIAJBADYCoBQgAkKAgICAwAA3ApgUIAFBAnQhBwJAA0AgBiAHRgRAAkACQCAPQQFxIA9B/wFxQQJGckUEQCACQZgUaiIHEOcOIAcQzSQMAQsgAkGYFGpBARCdAgsgAkHwEmogAkGgFGooAgAiDjYCACACIAIpApgUIosFNwPoEiCLBadBgICAgHhGIgcNBUEAIAIoAuwSIg0gBxshCCAFLQBCIgdBAkYgB3IgDkEEdCEGA0AgBgRAIAZBEGshBiANLQAMIQ8gDUEQaiENIA8NAQwHCwsgBSgCVEEBRw0FIAUoAlAoAgAiBygCLA0FQX9zIAcoAhhBAEdyQQFxDQUgAkHgDGoiByAIIA4QlgEgAigC4AwiDUGHgICAeEYNBSACLQDmDCELIAItAOUMIRAgAi0A5AwhCCACQZgUaiAHQQdyQckAEPwGGiACQdgGaiACQbANakHAAhD8BhogJAJ/AkACQAJAAkACQAJAAkBBBCANQYCAgIB4cyIFIAVBB08bQQFrDgYBAgMEBQYACyACQdAhahDTAiACKALQIUGEgICAeEcNByACKALUISEFQRBBBBChICIGIAg6AAwgBiAFNgIIIAZCgYCAgBA3AgBBoITDAAwGCyACQdAhahDTAiACKALQIUGEgICAeEcNGSACKALUISEFQRBBBBChICIGIBA6AA0gBiAIOgAMIAYgBTYCCCAGQoGAgIAQNwIAQdCBwwAMBQsgAkHQIWoQ0wIgAigC0CFBhICAgHhHDRggAigC1CEhBUEQQQQQoSAiBiAQQQh0IAhyOwEMIAYgBTYCCCAGQoGAgIAQNwIAIAZBDmogCzoAAEHMg8MADAQLIAJB0CFqENMCIAIoAtAhQYSAgIB4Rw0XIAIoAtQhIQVB2ABBCBChICIGQoGAgIAQNwMAIAZBCGogAkGZFGpByAAQ/AYaIAYgBTYCUEH4gsMADAMLIAJB0CFqENMCIAIoAtAhQYSAgIB4Rw0WIAIoAtQhIQVBnANBBBChICIGIAs6AA4gBiAQOgANIAYgCDoADCAGIA02AgggBkKBgICAEDcCACAGQQ9qIAJBmBRqQckAEPwGGiAGQdgAaiACQdgGakHAAhD8BhogBiAFNgKYA0HIhcMADAILIAJB0CFqENMCIAIoAtAhQYSAgIB4Rw0FIAIoAtQhIQVBjAJBBBChICIGIAs6AAogBiAQOgAJIAYgCDoACCAGQoGAgIAQNwIAIAZBC2ogAkGYFGpByQAQ/AYaIAZB1ABqIAJB2AZqQbQBEPwGGiAGIAU2AogCQfSEwwAMAQsgAkHzHmogAkGgFGotAAA6AAAgAiALOgDqHiACIBA6AOkeIAIgCDoA6B4gAiACKQCYFDcA6x4gAkHoHmoQ5A0hBkGkgsMACzYCCCAkIAY2AgQMEQsFIAJB2AZqIg0gAkHgDGogBiAhaigCABCXASAGQQRqIQYgAkGYFGogDRDTCiANEM4kDAELCwwQCwwPCyACQQI6AEQMAQsgAkEANgKIHCACQYgcahC5HQJAIAFBAUcNACAFKAJUBEAgBSgCUCgCACIHKAIYDQEgBygCLA0BIActADJBAUcNASAFLQBCIgdBAkcgB0EBcUVxDQEgISgCACIHKAIAQQdHDQEgAkEANgLgBiACQoCAgIDAADcC2AYgBygCCCIPIAcoAgxBHGxqIQhBBCEEQQAhCwNAAkACQCAIIA9GBEAgC0G4F08NASACKALcBiIHIAsQ3BwgAigC2AYgBxDdKQwFCyACQQA2AtQGIAJCgICAgBA3AswGIAIgDzYC6B4CQCAPKAIAIgdBAUcEQCAHQQZGDQEgAkEBNgLkDCACQeDzwwA2AuAMIAJCATcC7AwgAkHqADYCnBQgAiACQZgUajYC6AwgAiACQegeajYCmBQgAkHgDGpB6PPDABC6HQALIAJBzAZqIA8oAgQgDygCCBDtHQwCCyAPKAIMQRxsIQ0gDygCCCEGA0AgDUUNAiACIAY2AtAhIAYoAgBBAUYEQCACQcwGaiAGKAIEIAYoAggQ7R0gDUEcayENIAZBHGohBgwBCwsgAkEBNgLkDCACQfzywwA2AuAMIAJCATcC7AwgAkHqADYCnBQgAiACQZgUajYC6AwgAiACQdAhajYCmBQgAkHgDGpBhPPDABC6HQALIAIoAtgGIgdBgICAgHhGDQMgAikC3AYhiwUgAiAHNgLAEyACIIsFNwLEEyACQQM2AqQcIAJBADsAqRwgAkEAOgCSHCACQQA6AJ4cIAJBAToAlBwgAkKCgICAMDcCiBwgAkEDNgKYHCACQQE6AKgcIAJBADoArRwgAkGAAjsBoBwgAkEBOwGcHCACQQE7AZAcIAJBAkEBIIsFQoCAgIDQPlQbOgCsHCACQdgGaiIIIAJBpBxqEO4FIAIvAeYGIQkgAi0A5QYhDSACLQDkBiEEIAIoAuAGIQsgAigC3AYhDyACKALYBiEGAkAgAigC/AkiB0GAgICAeEYNACACKQPoBiGNBSACQfgMaiACQfAGakGMAxD8BhogAkGIEGogAkGACmpB4AIQ/AYaIAIgBzYChBAgAiCNBTcD8AwgAiAJOwHuDCACIA06AO0MIAIgBDoA7AwgAiALNgLoDCACIA82AuQMIAIgBjYC4AwgAkHgBmpBADoAACACQgA3A9gGIAJBkBBqIhEgCBDiFSACQagQaiI9ELUbIAJBnBBqIj4QthsgCCACQYQQaiIEQQAQiwsCQAJAIAIoAtgGIgZBA0cNACAIIARBABCLCyACKALYBiIGQQNHDQAgCCAEQQAQiwsgAigC3AYhDwJAIAIoAtgGIgZBA0cNACACIA82AtwSIAggBEEAEIsLIAIoAtwGIQ8gAigC2AYiBkEDRw0AIAIgDzYC4BIgCCACQeAMaiIHEKMKIAIoAtgGIgZBA0cNASAIIAcQ3A8gAigC2AYiBkEDRw0BIIsFpyIdIIsFQiCIp0EMbGohCiACQcwQaiE0IAJBgA1qIRAgAkG0EGohKgNAAkACQAJAAkACQAJAAkACQCAKIB1GBEAgBBCoICACQdgGaiINIAJB4AxqIgcQpg4gNCANQYACEPwGGiANIAcQwAcgAigC2AYiBkEDRw0LIAcQhA0gDSAHEKAFIAIoAtgGIgZBA0cNCyANIAcQpAIgAigC2AYiBkEDRg0BDAsLIAIgNTYCoAEgAkHYBmogNRDaHCACKALYBkUEQCACKALcBiEPIB0oAggiC0H+////B0sEQEECIQYMDQsgHSgCBCEJIAIgAigCvBAiBjYCoBkgAiACKALMEiIHIAsgByALSRs2AswSIAIgAigC0BIiDSALIAsgDUkbNgLQEiAGIDVHDQIgKiALEKIbIAIoAoAQLQAFDQMMCAtBASEGQQAhBEH+////ByELQQAhDUEAIQkMCwsgAkHgDGoiBxD2CCAHEIQCIAJB2AZqIBAQgAEgAkHAEGoQuR0gAkHIEGogAkHgBmooAgA2AgAgAiACKQLYBiKKBTcDwBAgAkGABkH4BSCKBacbIAdqKAIANgLUEiAREKkgID4QqiAgPRCrICAqEKogIAIpAoQQIYsFIAIpAowQIY0FIAIoApQQIQYgAikDmBAhigUgAkHQIWoiDSACQaAQakHIAhD8BhogEBCmGSACQegeaiIHIA1ByAIQ/AYaIAJBtBRqIAdByAIQ/AYaIAIgigU3AqwUIAIgBjYCqBQgAiCNBTcCoBQgAiCLBTcCmBQCQAJAAkACQCACLQCsHCIEQQFrDgMCAwABCyACQeAMaiIHIAJBmBRqQeQCEPwGGiACQegeaiACQYgcaiAHEMwIIAIoAugeIQ8gAigC7B4hCyACLQDwHiEEDAcLIAJB4AxqIgcgAkGYFGpB5AIQ/AYaIAcQ8x8hD0EAIQRBiPvDACELDAYLIAJB2AZqIAIoAogcIAItAJQcIAJBmBRqEIcBIAIoAtgGIgZBgICAgHhHBEAgAikC3AYhiwUgAikC5AYhjQUgAigC7AYhDSACKQPwBiGKBSACQdAhaiIHIAJB+AZqQagCEPwGGiACIIoFNwL4DCACIA02AvQMIAIgjQU3AuwMIAIgiwU3AuQMIAIgBjYC4AwgAkGADWogB0GoAhD8BhpBjPzDACELIAJB4AxqEPQfIQ8MBQsgAi8B7gYhCSACLQDtBiENIAItAOwGIQQgAigC6AYhCyACKALkBiEPIAIoAuAGIQYMAwsgAkHgDGogAi0AoBwgAi0AoRwgAkGYFGoQfiACKALgDEUEQCACKQLkDCGLBSACKQLsDCGNBSACKAL0DCEHIAIpA/gMIYoFIAJB9AZqIAJBgA1qQcACEPwGGiACIIoFNwLsBiACIAc2AugGIAIgjQU3AuAGIAIgiwU3AtgGQZD9wwAhCyACQdgGahD1HyEPDAQLIAIvAfYMIQkgAi0A9QwhDSACLQD0DCEEIAIoAvAMIQsgAigC7AwhDyACKALoDCEGDAILIAJCADcC5AYgAkKBgICAwAA3AtwGIAJB0J7DADYC2AZBACACQaABaiACQaAZaiACQdgGakHYnsMAEM4aAAsgECAJIAsQ9AMMBAsgAkGYFGoQ7xcMCAsgAi0ArRwhDSACQZgUahDvFwwBCyACLQCtHCENC0EDIQYMBQsgNUEBaiE1IB1BDGohHSAJIAtqIQ5BACEMIAIoAtwSIQhBACEnA0AgCSAORgRAIAJB2AZqIAQgCCAPELIJIAIoAtgGIgZBA0YNAgwECyAIIQsgDCEHIAktAAAhDQJAICdBAXFFBEAgAigCiBAgAigCjBAgCEHonsMAELAfKAIIIgZBAEchJyAGRQ0BIAIoAoAQLQAEQQFGDQMMAQtBASEnIAIoAoAQLQAEQQFGDQILIAJB4AxqIgYgDSANEOQfIAIoAoAQLQAGBEAgBiANENgZIgYgBhDkHwsgB0EBaiEMIAlBAWohCQJAAn8gAigCiBAgAigCjBAgC0HYgMQAELAfKAIEIgYEQCACKAKgECACKAKkECAGIA0gNGotAABqEL4fKAIADAELIAJBMGogBCALEJwgIAIgAikDMDcCdANAIAJB2AZqIAJB9ABqEIEPIAItANgGRQ0CIAItANkGIgYgDUkNAAsgBiANRw0BIAIoANoGCyIIQQFHDQELIAJB2AZqIisgBCAHEIsLIAIoAtwGIQggAigC2AYiBkEDRgRAICsgBCALIA0gCBD2AyACKALYBiIGQQNHDQQgAigCgBAtAAZFDQEgKyAEIAsgDRDYGSAIEPYDIAIoAtgGIgZBA0cNBAwBCwsLIAIvAeYGIQkgAi0A5QYhDSACLQDkBiEEIAIoAuAGIQsgCCEPDAILIAIvAeYGIQkgAi0A5QYhDSACLQDkBiEEIAIoAuAGIQsMAQsgAi8B5gYhCSACLQDlBiENIAItAOQGIQQgAigC4AYhCyACKALcBiEPCyACQeAMahDPJAsgBkEDRiANQf8BcUEDR3FFBEAgAkHAE2oQzSIMBAsgAiAJOwG6GSACIA06ALkZIAIgBDoAuBkgAiALNgK0GSACIA82ArAZIAJBsBlqEOQNIQUgAkHAE2oQzSIgJEGkgsMANgIIICQgBTYCBAwPCyACKALYBiALRgRAIAJB2AZqEOsWIAIoAtwGIQQLIA9BHGohDyACQdQGaigCACENIAQgC0EMbGoiByACKQLMBjcCACAHQQhqIA02AgAgAiALQQFqIgs2AuAGDAALAAtBAEEAQazywwAQrRAACyACQaSCwwA2AlwgAkEANgJYIAJB2ABqELkdAkAgAigC6BJBgICAgHhGBEAgAkECOgBEDAELIAJBOGogAigC7BIgAigC8BIQ1g0LIAJB6BJqEOceCyAFIAUoAgAiB0EBajYCACAHQQBIDQAgAiACLQBEIgtBAkYEf0ECBSACKAI4Ig8gDygCACIHQQFqNgIAIAdBAEgNASACIAIoAkAiPTYCUCACIAIoAjwiPjYCTCACIA82AkggCws6AFQgAiAFNgKwASAFLQBKIQQgBS0AQyEJIAUoAhQhCCAFKAIQIQ4gBS0AQCEGIAUtAEEhByACQeAMaiINEOcHIAIgBEEAIARBA0cbOgClFCACIAdBCiAGGyIrOgChFCACQQI7AKMUIAJBgICABSAIIA5BAkYiBxsiETYCnBQgAkEBOgCgFCACQQEgDiAHGyLmATYCmBQgAiAJIAlBAkZyQQFxIoQCOgCiFCACQdgGaiANIAJBmBRqEJELIiYgISABED8CQAJAAkACQAJAAkACfwJAAn8CQAJAAkAgAigC2AYiBEEqRgRAIAIgAigC3AYiDTYCuCQgJhD5C0ECIQYgC0ECRwRAIA8gDygCACIHQQFqNgIAIAshBiAHQQBIDQ4LIAJBAzoA7AwgAiAFLQBCIgdBAkYgB3JBAXEiCToA8AwgAkHgDGoiDhDQJCACQegMaiIIID02AgAgAiAGOgDsDCACQdghaiIHIAgpAgA3AwAgAiA+NgLkDCACIA82AuAMIAIgAikC4Aw3A9AhIA4Q5wcgAkECOgDgDiACQQM6ANwOIAJB0A5qIQYCQCACLQDcIUEDRgRAIAJB2AZqIAYQrCAgAkHQIWoQ0CQMAQsgAkHgBmogBykDADcDACACIAIpA9AhNwPYBgsgBhDQJCAGQQhqIAJB4AZqIicpAwA3AgAgBiACKQPYBjcCACACIAk6AOAOIA0gDSgCACIHQQFqNgIAIAdBAEgNDSACQdgGaiAGEKwgIAJB6AZqIgcgCToAACACQaAUaiIEICcpAgA3AwAgAkGoFGoiDCAHKAIANgIAIAIgAikC2AY3A5gUIAJB4AxqIgdB8AFqENAkIAcQ3AwgAkHkAGogBCkDADcCACACQewAaiAMKAIANgIAIAIgDTYCWCACIAIpA5gUNwJcIAIgC0ECRwR/IA8gDygCACIHQQFqNgIAIAdBAEgNDiACID02ApgBIAIgPjYClAEgAiAPNgKQASALBUECCzoAnAECfwJAIAUtAEgiBkECRyAGQQFxRXFFBEAgBS0AQiIGQQJGIAZBAXFyDQELIAJBkAFqEOYcQQIMAQsgAkEANgLgDCACQQM6APQMIAJB6AxqIgcQpxkgAkHwDGogAkGYAWopAgAiiwU3AgAgAiACKQKQASKNBTcC6AwgAigC7AwhBCACLQD0DCEGIAJB+AxqEOcHIAJBAzoA9AwgAkEANgLgDCACIAY6AOQGIAIgiwWnIic2AuAGIAIgBDYC3AYgAiCNBaciDDYC2AYgBkEDRgRAIAJB2AZqEKcZQQMhBgsgAigC5AwhNCAHEKcZIA0gDSgCACIHQQFqNgIAIAIgBjoA9AwgAiAnNgLwDCACIAQ2AuwMIAIgDDYC6AwgAiA0NgLkDCACQQA2AuAMIAdBAEgNDiAGQf4BcUECRwRAIAwgDCgCACIHQQFqNgIAIAdBAEgNDwsgAkHgDGoiB0EIahDQJCAHQRhqENwMQQALIQcgAiANNgKMASACIAY6AIgBIAIgJzYChAEgAiAENgKAASACIAw2AnwgAiAHNgJ0QQMhBCAFLQBHIgZBAkcgBkEBcUVxDQUgBSgCWCIGKAIsRQRAIAYvABlBswZxRQ0GCyAFLQBCIQogBS0ASSEOIAUoAhwhByAFKAIYIQggAkHcIWoiNRDnByACQQE6ANkhIA0gDSgCACIGQQFqNgIAIAJBgIDAACAHIAhBAkYiBRsiCTYC1CEgAiAOIA5BAkZyQQFxIgw6ANohIAIgCiAKQQJGckEBcSIHOgDYISACQQEgCCAFGyIONgLQISAGQQBIDQ0gAiANNgLoEgJ/IAxFBEBBACEGIAJB4AxqQQBBgAIQigsaQQAhBQNAIAVBAXFFBEAgBkH/AXEiBSACQeAMamogBjoAAEF/IAVBAWoiBSAFIAVB/wFxRyIFGyEGDAELCyACQZgUaiACQeAMakH/ARD8BhogAi0A3w4MAQsgAkGYFGogDUEIakH/ARD8BhogDS0AhwILIQYgDSANKAIAIgVBAWo2AgAgBUEASA0NIA0oAtQCIh1BAE4EQCACQShqIA0oAsgCIggQuhQgAkHoDGoiBUEANgIAIAIgAikDKDcC4AwgAkHgDGogCBDoDiACQbgZaiIqIAUoAgA2AgAgAiACKQLgDDcDsBkgDSgCyAIhBSACQgQ3ApgcIAJCADcCkBwgAkKAgICAwAA3AogcIAVBAE4EQCACQaAcaiIKQQA2AgAgAkGIHGogBRDoHiACQZQcaiAFEOgeIAJB5A9qIAooAgA2AgAgAkHcD2ogAkGYHGopAgA3AgAgAkHUD2ogAkGQHGopAgA3AgAgAiACKQKIHDcCzA8gAkHsD2ogAkGYFGoiBUH/ARD8BhogAkH+////BzYCiA0gAiANNgKEDSACQgQ3AvwMIAJCADcC9AwgAkKAgICAgAE3AuwMIAIgDDoA6gwgAkEBOgDpDCACIAc6AOgMIAIgCTYC5AwgAiAONgLgDCACQYwNaiAFQf8BEPwGGiACQbwPaiAqKAIANgIAIAJBADYCsA8gAkKAgICAwAA3AqgPIAIgHUEBdDYCmA8gAiAGQf8BcUEBaiIFNgKUDyACQSAgBWdrNgKQDyACIAU2AowPIAIgBjoAiw8gAkEAOgDsESACQQA2AsgPIAJCgICAgIABNwLADyACIAY6AOsRIAIgDDoApg8gAkEBOgClDyACIAc6AKQPIAIgCTYCoA8gAiAONgKcDyACIAIpA7AZNwK0DyACIAJB6BJqNgLoDyACQYQNaiEOIAJB9AxqITQgAigC6BIiDCgCsAIhBQJAA0ACQCAFBEAgBUEAIAVrcSIGQQFrIg1BH01BAEEBIA10QYuBgoB4cRsgBkHAAEYgBkGAAUZyciAGQYACRiAGQYAERnIgBkGACEYgBkGAEEZycnIgBkGAIEYgBkGAwABGciAGQYCAAUYgBkGAgAJGcnIgBkGAgARGIAZBgIAIRnJycg0BC0H///8BIQ0gDCgC1AJB////AU0NAkEAIQxBLCEFDAgLIAUgBnMhBSAGQYAETQ0AC0EtIQUMBgtBLyEFIAwoArwCEPYXQSBLBEBBLiENQYCTwwAhBgwGCyACQZgUaiIIIAJB4AxqIg0QmQggAigCnBQhBiACKAKYFCIHQTBHDQQgAiAGNgKIHCAGRQRAIAIoAugPKAIAIgcoAtQCIQogCCANQQAgAiAHKAKoAhCuDCACKAKYFCIHQTBGBEACQAJAIAItAKUPQQFxRQ0AQQAhDSACKALoDygCABC9HSEHQQAhBgNAIAYgB0YNASACKALoDygCACIIKALUAiAGTQ0CIAJBmBRqIAJB4AxqQQEgBiAIKALQAiANaigCABCuDCACKAKYFCIdQTBHDQggBkEBaiEGIA1BBGohDQwACwALIApBAXQhEAJAA0ACQCACKAKwDyIHBEAgAiAHQQFrIgc2ArAPIAIoArgPIAIoArwPIAIoAqwPIAdBAnRqKAIAIgdBtJLDABCvHygCACEqIAJBADYC5A8gAkEAOgDsESACQZgUaiACQeAMaiAHQgAQ/gYgAigCmBQiB0EwRg0BIAIoApwUIQYgAikDoBQhiwUgAkHYBmogAkGoFGpBMBD8BhogiwVCIIinIQwgiwWnIQ0gByEFDAwLIAJBIGogAigC9AwgAigCkA92Ig1BBBC8FEEAIQYgAkEANgKgFCACIAIpAyA3ApgUIAJBmBRqIA0Q0x4gAigCnBQiPyACKAKgFCIHQQJ0aiEFA0AgBiANRwRAIAUgBjYCACAFQQRqIQUgBkEBaiEGDAELCyACKAL0DCACKAKQD3YiDQRAIAYgB2ohJiACKAKYFCEJIA0hEAJAAkACQAJAAkADQCAQQQFrIRADQCANRQ0CIAJB4AxqIA1BAWsiDRC+FCIdEPYfQv///////35WDQALIBAgHUcEQEEAIQYgAigC9AwiOSAdIAIoApAPIgd0IkZrIgVBACAFIDlNGyEOIDkgECAHdCIKayIFQQAgBSA5TRshCCAHQR9xIQcgAigC8AwiBSAKQQN0aiEMIAUgRkEDdGohJwNAIAYgB3ZFBEAgBiAIRg0IIAYgDkYNByAMKQMAIYoFIAwgJykDADcDACAnIIoFNwMAIAZBAWohBiAMQQhqIQwgJ0EIaiEnDAELCyAQICZPDQQgHSAmTw0DID8gEEECdGoiBSgCACEHIAUgPyAdQQJ0aiIFKAIANgIAIAUgBzYCAAsgAiAQNgKIDSAQDQALQa6TwwBBNEHkk8MAELUSAAtBACEKIAJBADYCpBQgAiAmNgKgFCACID82ApwUIAIgCTYCmBQgAkEYaiAmQQQQvBQgAigCGCHiASACKAIcID8gJkECdBD8BiEOIAIoAvQMIAIoApAPdiEQIAJBpBRqIQgDQCAQIAoiB0YEQCACKAL0DCACKAKQDyIFdiEKIAVBH3EhKkEAIR0gAigCjA8hEANAAkACQCAKIB1GBEBBACEGIAIoAoANIQcDQCAGIAdGDQIgAkGYFGogCCACKAL8DCACKAKADSAGQeCXwwAQrx8oAgAQvx8hBSACKAL8DCACKAKADSAGQfCXwwAQrx8gBTYCACAGQQFqIQYMAAsACyAdICp0IQYgECEFA0AgBUUNAiACKALwDCACKAL0DCAGQYCYwwAQsh8pAwAhigUgAigC8AwgAigC9AwgBkGQmMMAELIfIQ0gAkGYFGogCCCKBUIriKcQvx8hByANIA0pAwBC////////AYMgB61CK4aENwMAIAVBAWshBSAGQQFqIQYMAAsACyDiASAOENkpIAIoApgUIAIoApwUENkpIAIoAuAMIQcgAigC5AwhBSACKALoDCEGIAIpAuwMIYsFIAJB2AZqIDRBqAIQ/AYaIIsFQiCIpyEMIIsFpyENQQAMFQsgHUEBaiEdDAALAAsgB0EBaiEKIAcgAigCpBR0Ig0gDiAmIAdBkNDDABCvHygCACIGRg0AA0AgDSAOICYgBiIFIAIoAqQUdkGg0MMAEK8fKAIAIgZHDQALIAIoApwUIAIoAqAUIAdBsNDDABCvHyAFNgIADAALAAsgHSAmQYDQwwAQrRAACyAQICZBgNDDABCtEAALIAYgRmogOUHQl8MAEK0QAAsgBiAKaiA5QdCXwwAQrRAAC0HAl8MAENopAAsDQCACKALIDyIHRQ0BIAIgB0EBayIGNgLIDyACKALoDygCACINKALIAiIHIAIoAsQPIAZBBHRqIgwoAgAiBk0NAiAMKQMIIYsFAkACQAJAAkACQAJAAkACQCANKALEAiAGQRRsaiIIKAIAQQFrDggDBAUGBwAIAQILIAJBmBRqIAJB4AxqIAgoAgQgECAIKAIQIgdNBH4giwVC/weDIIsFQgqIp0EBIAcgEGt0cq1CCoaEBSCLBQsQ/gYgAigCmBQiB0EwRg0HIAIoApwUIQYgAikDoBQhiwUgAkHYBmogAkGoFGpBMBD8BhogiwVCIIinIQwgiwWnIQ0gByEFDBILIAItAOwRRQRAIAg1AgQhigUgAkEBOgDsESACQeAMaiAqIIsFQv///////wCDIIoFQiqGhBDAHwwHC0ErIQ1BxJLDACEGDBELIAJBmBRqIAJB4AxqICogCEEEaiCLBRDQByACKAKYFCIHQTBGDQUgAigCnBQhBiACKQOgFCGLBSACQdgGaiACQagUakEwEPwGGiCLBUIgiKchDCCLBachDSAHIQUMEAsgCCgCCEEDdCEGIAgoAgQhDQNAIAZFDQUgAkGYFGogAkHgDGogKiANIIsFENAHIAIoApgUIgdBMEYEQCAGQQhrIQYgDUEIaiENDAELCyACKAKcFCEGIAIpA6AUIYsFIAJB2AZqIAJBqBRqQTAQ/AYaIIsFQiCIpyEMIIsFpyENIAchBQwPCyAIKAIEIgYgCCgCCEECdGohHUEAIQ0DQCAGIB1GDQQgDSIHQQFqIQ0gBigCACEIIAZBBGoiCiEGIAhFDQAgAiAIrSCNBUKAgICAgIBAgyAHQf8Bca0iigVCIIaEIIoFQiiGhIQijQU3A4gcIAJBmBRqIAJB4AxqICogAkGIHGogiwUQ0AcgAigCmBQiB0EwRg0ACyACKAKcFCEGIAIpA6AUIYsFIAJB2AZqIAJBqBRqQTAQ/AYaIIsFQiCIpyEMIIsFpyENIAchBQwOCyACQZgUaiACQeAMaiAIKAIEIAgoAgggiwWnckH/B3GtIIsFQoD4/////wCDhBD+BiACKAKYFCIHQTBGDQIgAigCnBQhBiACKQOgFCGLBSACQdgGaiACQagUakEwEPwGGiCLBUIgiKchDCCLBachDSAHIQUMDQsgCCgCCEECdCEGIAgoAgRBBGshDQNAIAZFDQIgAkGYFGogAkHgDGogBiANaigCACCLBRD+BiACKAKYFCIHQTBGBEAgBkEEayEGDAELCyACKAKcFCEGIAIpA6AUIYsFIAJB2AZqIAJBqBRqQTAQ/AYaIIsFQiCIpyEMIIsFpyENIAchBQwMCyAIKAIEIQ0gAkGYFGogAkHgDGogCCgCCCCLBRD+BiACKAKYFCIHQTBHBEAgAigCnBQhBiACKQOgFCGLBSACQdgGaiACQagUakEwEPwGGiCLBUIgiKchDCCLBachDSAHIQUMDAsgAkGYFGogAkHgDGogDSCLBRD+BiACKAKYFCIHQTBGDQALCyACKAKcFCEGIAIpA6AUIYsFIAJB2AZqIAJBqBRqQTAQ/AYaIIsFQiCIpyEMIIsFpyENIAchBQwJCyAGIAdBsJDEABCtEAALQfCSwwAQ2ikACyACKAKcFCEGIAIpA6AUIYsFIAJB2AZqIAJBqBRqQTAQ/AYaIIsFQiCIpyEMIIsFpyENIAchBQwGCyACQQA2ApgUIwBBEGsiACQAIAAgAkGIHGo2AgwgAEGMjeAANgIIQQAgAEEIakGsysMAIABBDGpBrMrDACACQZgUakGkksMAEPgGAAsgAkEBNgLkDCACQfSWxAA2AuAMIAJCATcC7AwgAkEQNgLEEyACQcyWxAA2AsATIAIgAkHAE2o2AugMIAJB4AxqQeyXxAAQuh0AC0GUksMAENopAAsgAkH/BmotAAAhESACQYcHai0AACEJIAJBjwdqLQAAIQ4gAkGXB2otAAAhCCACLQCUByFGIAIoApAHITkgAi0AjAch4gEgAigCiAchPyACLQCEByEQIAIoAoAHISogAi0A/AYhPiACKAL4BiEKIAIoAvQGIeYBIAIoAvAGITUgAigC7AYhHSACKALoBiE0IAIoAuQGIQcgAigC4AYhJyACKALcBiEMIAIvAP0GIAIvAIUHIQYgAi8AjQcgAi8AlQcgJhD5CyAIQRB0ciEPIA5BEHRyIQ0gEUEQdHIhCyAGIAlBEHRyDAULIAIoApwUIQYgAikDoBQhiwUgAkHYBmogAkGoFGpBMBD8BhogiwVCIIinIQwgiwWnIQ0gHSEFDAELIAIpA6AUIYsFIAJB2AZqIAJBqBRqQTAQ/AYaIIsFQiCIpyEMIIsFpyENIAchBQsgDhDkHiACKALsDCACKALwDBDrKSACKAL4DCACKAL8DBDZKUEBCyEnIAIoAqgPIAIoAqwPENkpIAIoArQPIAIoArgPENkpIAIoAsAPIAIoAsQPQQhBEBDLIiACKALMDyACKALQDxDZKSACKALYDyACKALcDxDZKSACQegSahDkHiA1ENwMICdFBEAgAkHgDGogAkHYBmpBqAIQ/AYaIA2tIAytQiCGhCGLBSAHIQQMAQsgAiAGNgLkDCACIA2tIAytQiCGhDcD6AwgAiAFNgLgDCACQfAMaiACQdgGakEwEPwGGiAFQSlLDQAgAkHgDGoQkBELIAIgiwU3AvQeIAIgBjYC8B4gAiAFNgLsHiACIAQ2AugeIAJB/B5qIAJB4AxqIghBqAIQ/AYaQgIhiwUgAigCsAEiBS0ARSIGQQJGIAZBAXFyRQ0EIAgQ5wcgAkGABDYCpBQgAkEBOgCjFCACIIQCOgCiFCACICs6AKEUIAJBAToAoBQgAiARNgKcFCACIOYBNgKYFCACQdgGaiAIIAJBmBRqEJELIisgISABED8gAigC2AYiBEEqRgRAIAIoAtwGIYECICsQ+QtBAiENIAUtAEUiBkECRiAGQQFxckUNBSALQQJHBEAgDyAPKAIAIg1BAWo2AgAgDUEASA0JIAIgPTYCqAEgAiA+NgKkASACIA82AqABIAUtAEUhBiALIQ0LIAIgDToArAFBAiELIAZBAXFFIAZB/wFxQQJHcQ0EIAJBAjoAkxQgAkGCBDsAkRQgAkEDOgCMFCACQgA3A8ATIAJBggQ7AZQUIAJBADYC6BMgAkECNgL4EyACQQI2AvATIAIgBS0AQiIGQQJGIAZyQQFxOgCQFCANQQJHBEAgDyAPKAIAIgZBAWo2AgAgBkEASA0JIAIgAikCpAE3AtwGIAIgDzYC2AYgDSELCyACIAs6AOQGIAJB4AxqIhEgAkHAE2ogAkHYBmoiCRCYEyACQQE6ALENIAJB6BJqIg4gEUEoEPwGGiACQbgTaiACQbANai8BADsBACACQbATaiACQagNaikDADcDACACIAIpA6ANNwOoEyACQQA6AL0TIAIgC0ECRzoAvBMgAkEBOgC7EyACQoGAgICgATcDoBMgAkKBgICAMDcDmBMgAkEBNgKQEyACIAIvAbYNOwG+EyACIAUoAgxBgICAASAFKAIIGzYClBMgAiAFLQBJIgVBAkYgBXJBAXE6ALoTIBEQ2BggCSAOEMUHIBEgCRCHBSEFIAIoArgkIgggCCgCACINQQFqNgIAIA1BAEgNCCACQagTaiENIAJBmBRqIgYgBSAIENIBIAUQ0SQgAikDmBRCAlENAiAJIAZBiAUQ/AYaIAJB0CFqIvIEENgYIAJBiBxqIgYgDhDFByACQQA6ANgcIAJBAjoArBkgAkGwGWoiBSAGIAJBoBlqEJgTIAJBADoAhBog8gQgBRCHBSEGIIECIIECKAIAIgVBAWo2AgAgBUEASA0IIBEgBiCBAhDSASAGENEkIAIpA+AMIooFQgJSBEAgAkHvDGotAAAh9AQgAkH3DGotAAAh9QQgAkH/DGotAAAh9gQgAkGHDWotAAAh9wQgAkGPDWotAAAh+AQgAkGXDWotAAAh+QQgAkGfDWotAAAh+gQgAkGnDWotAAAh+wQgAkGvDWotAAAh/AQgAkG3DWotAAAh/QQgAkG/DWotAAAh/gQgAkHHDWotAAAh/wQgAkHPDWotAAAhgAUgAkHXDWotAAAhgQUgAkHfDWotAAAhggUgAkHnDWotAAAhgwUgAkHvDWotAAAhhAUgAkH3DWotAAAhhQUgAkH/DWotAAAhhgUgAkGHDmotAAAhhwUgAkGPDmotAAAhiAUgAkGXDmotAAAhiQUgAkGfDmotAAAh7QQgAkGnDmotAAAhRyACQa8Oai0AACFIIAJBtw5qLQAAIUkgAkG/DmotAAAhSiACQccOai0AACFLIAJBzw5qLQAAIUwgAkHXDmotAAAhTSACQd8Oai0AACFOIAJB5w5qLQAAIU8gAkHvDmotAAAhUCACQfcOai0AACFRIAJB/w5qLQAAIVIgAkGHD2otAAAhUyACQY8Pai0AACFUIAJBlw9qLQAAIVUgAkGfD2otAAAhViACQacPai0AACFXIAJBrw9qLQAAIVggAkG3D2otAAAhWSACQb8Pai0AACFaIAJBxw9qLQAAIVsgAkHPD2otAAAhXCACQdcPai0AACFdIAJB3w9qLQAAIV4gAkHnD2otAAAhXyACQe8Pai0AACFgIAJB9w9qLQAAIWEgAkH/D2otAAAhYiACQYcQai0AACFjIAJBjxBqLQAAIWQgAkGXEGotAAAhZSACQZ8Qai0AACFmIAJBpxBqLQAAIWcgAkGvEGotAAAhaCACQbcQai0AACFpIAJBvxBqLQAAIWogAkHHEGotAAAhayACQc8Qai0AACFsIAJB1xBqLQAAIW0gAkHfEGotAAAhbiACQecQai0AACFvIAJB7xBqLQAAIXAgAkH3EGotAAAhcSACQf8Qai0AACFyIAJBhxFqLQAAIXMgAkGPEWotAAAhdCACQZcRai0AACF1IAJBnxFqLQAAIXYgAkGnEWotAAAhdyACQa8Rai0AACF4IAJBtxFqLQAAIXkgAkG/EWotAAAheiACQccRai0AACF7IAJBzxFqLQAAIXwgAkHXEWotAAAhfSACQd8Rai0AACF+IAJB5xFqLQAAIX8gAi0A5BEhvAIgAigC4BEhvQIgAi0A3BEhvgIgAigC2BEhvwIgAi0A1BEhwAIgAigC0BEhwQIgAi0AzBEhwgIgAigCyBEhwwIgAi0AxBEhxAIgAigCwBEhxQIgAi0AvBEhxgIgAigCuBEhxwIgAi0AtBEhyAIgAigCsBEhyQIgAi0ArBEhygIgAigCqBEhywIgAi0ApBEhzAIgAigCoBEhzQIgAi0AnBEhzgIgAigCmBEhzwIgAi0AlBEh0AIgAigCkBEh0QIgAi0AjBEh0gIgAigCiBEh0wIgAi0AhBEh1AIgAigCgBEh1QIgAi0A/BAh1gIgAigC+BAh1wIgAi0A9BAh2AIgAigC8BAh2QIgAi0A7BAh2gIgAigC6BAh2wIgAi0A5BAh3AIgAigC4BAh3QIgAi0A3BAh3gIgAigC2BAh3wIgAi0A1BAh4AIgAigC0BAh4QIgAi0AzBAh4gIgAigCyBAh4wIgAi0AxBAh5AIgAigCwBAh5QIgAi0AvBAh5gIgAigCuBAh5wIgAi0AtBAh6AIgAigCsBAh6QIgAi0ArBAh6gIgAigCqBAh6wIgAi0ApBAh7AIgAigCoBAh7QIgAi0AnBAh7gIgAigCmBAh7wIgAi0AlBAh8AIgAigCkBAh8QIgAi0AjBAh8gIgAigCiBAh8wIgAi0AhBAh9AIgAigCgBAh9QIgAi0A/A8h9gIgAigC+A8h9wIgAi0A9A8h+AIgAigC8A8h+QIgAi0A7A8h+gIgAigC6A8h+wIgAi0A5A8h/AIgAigC4A8h/QIgAi0A3A8h/gIgAigC2A8h/wIgAi0A1A8hgAMgAigC0A8hgQMgAi0AzA8hggMgAigCyA8hgwMgAi0AxA8hhAMgAigCwA8hhQMgAi0AvA8hhgMgAigCuA8hhwMgAi0AtA8hiAMgAigCsA8hiQMgAi0ArA8higMgAigCqA8hiwMgAi0ApA8hjAMgAigCoA8hjQMgAi0AnA8hjgMgAigCmA8hjwMgAi0AlA8hkAMgAigCkA8hkQMgAi0AjA8hkgMgAigCiA8hkwMgAi0AhA8hlAMgAigCgA8hlQMgAi0A/A4hlgMgAigC+A4hlwMgAi0A9A4hmAMgAigC8A4hmQMgAi0A7A4hmgMgAigC6A4hmwMgAi0A5A4hnAMgAigC4A4hnQMgAi0A3A4hngMgAigC2A4hnwMgAi0A1A4hoAMgAigC0A4hoQMgAi0AzA4hogMgAigCyA4howMgAi0AxA4hpAMgAigCwA4hpQMgAi0AvA4hpgMgAigCuA4hpwMgAi0AtA4hqAMgAigCsA4hqQMgAi0ArA4hqgMgAigCqA4hqwMgAi0ApA4hrAMgAigCoA4hrQMgAi0AnA4hrgMgAigCmA4hrwMgAi0AlA4hsAMgAigCkA4hsQMgAi0AjA4hsgMgAigCiA4hswMgAi0AhA4htAMgAigCgA4htQMgAi0A/A0htgMgAigC+A0htwMgAi0A9A0huAMgAigC8A0huQMgAi0A7A0hugMgAigC6A0huwMgAi0A5A0hvAMgAigC4A0hvQMgAi0A3A0hvgMgAigC2A0hvwMgAi0A1A0hwAMgAigC0A0hwQMgAi0AzA0hwgMgAigCyA0hwwMgAi0AxA0hxAMgAigCwA0hxQMgAi0AvA0hxgMgAigCuA0hxwMgAi0AtA0hyAMgAigCsA0hyQMgAi0ArA0hygMgAigCqA0hywMgAi0ApA0hzAMgAigCoA0hzQMgAi0AnA0hzgMgAigCmA0hzwMgAi0AlA0h0AMgAigCkA0h0QMgAi0AjA0h0gMgAigCiA0h0wMgAi0AhA0h1AMgAigCgA0h1QMgAi0A/Awh1gMgAigC+Awh1wMgAi0A9Awh2AMgAigC8Awh2QMgAi0A7Awh2gMgAigC6Awh2wMgAi8A7QwgAi8A9QwgAi8A/QwgAi8AhQ0gAi8AjQ0gAi8AlQ0gAi8AnQ0gAi8ApQ0gAi8ArQ0gAi8AtQ0gAi8AvQ0gAi8AxQ0gAi8AzQ0gAi8A1Q0gAi8A3Q0gAi8A5Q0gAi8A7Q0gAi8A9Q0gAi8A/Q0gAi8AhQ4gAi8AjQ4gAi8AlQ4gAi8AnQ4gAi8ApQ4gAi8ArQ4gAi8AtQ4gAi8AvQ4gAi8AxQ4gAi8AzQ4gAi8A1Q4gAi8A3Q4gAi8A5Q4gAi8A7Q4gAi8A9Q4gAi8A/Q4gAi8AhQ8gAi8AjQ8gAi8AlQ8gAi8AnQ8gAi8ApQ8gAi8ArQ8gAi8AtQ8gAi8AvQ8gAi8AxQ8gAi8AzQ8gAi8A1Q8gAi8A3Q8gAi8A5Q8gAi8A7Q8gAi8A9Q8gAi8A/Q8gAi8AhRAgAi8AjRAgAi8AlRAgAi8AnRAgAi8ApRAgAi8ArRAgAi8AtRAgAi8AvRAgAi8AxRAgAi8AzRAgAi8A1RAgAi8A3RAgAi8A5RAgAi8A7RAgAi8A9RAgAi8A/RAgAi8AhREgAi8AjREgAi8AlREgAi8AnREgAi8ApREgAi8ArREgAi8AtREgAi8AvREgAi8AxREgAi8AzREgAi8A1REgAi8A3REgAi8A5REg8gQQ2BggAkGPB2otAAAh8AQgAkGXB2otAAAh8QQgAkGfB2otAAAhQiACQacHai0AACHnASACQa8Hai0AACExIAJBtwdqLQAAIYUCIAJBvwdqLQAAIe4EIAJBxwdqLQAAIRIgAkHPB2otAAAhIyACQdcHai0AACEsIAJB3wdqLQAAIS0gAkHnB2otAAAhLyACQe8Hai0AACEzIAJB9wdqLQAAITsgAkH/B2otAAAhQSACQYcIai0AACE8IAJBjwhqLQAAIUQgAkGXCGotAAAhRSACQZ8Iai0AACHPASACQacIai0AACHQASACQa8Iai0AACHRASACQbcIai0AACHSASACQb8Iai0AACHTASACQccIai0AACHUASACQc8Iai0AACHVASACQdcIai0AACHWASACQd8Iai0AACHXASACQecIai0AACHYASACQe8Iai0AACHZASACQfcIai0AACHaASACQf8Iai0AACHbASACQYcJai0AACHdASACQY8Jai0AACHeASACQZcJai0AACHhASACQZ8Jai0AACHjASACQacJai0AACHgASACQa8Jai0AACHkASACQbcJai0AACHlASACQb8Jai0AACHoASACQccJai0AACHpASACQc8Jai0AACHqASACQdcJai0AACHrASACQd8Jai0AACHsASACQecJai0AACHtASACQe8Jai0AACHuASACQfcJai0AACHvASACQf8Jai0AACHwASACQYcKai0AACHxASACQY8Kai0AACHyASACQZcKai0AACHzASACQZ8Kai0AACH0ASACQacKai0AACH1ASACQa8Kai0AACH2ASACQbcKai0AACH3ASACQb8Kai0AACH4ASACQccKai0AACH5ASACQc8Kai0AACH6ASACQdcKai0AACH7ASACQd8Kai0AACH8ASACQecKai0AACH9ASACQe8Kai0AACH+ASACQfcKai0AACH/ASACQf8Kai0AACGAAiACQYcLai0AACEwIAJBjwtqLQAAIYICIAJBlwtqLQAAIYYCIAJBnwtqLQAAIYcCIAJBpwtqLQAAIYgCIAJBrwtqLQAAIYkCIAJBtwtqLQAAIYoCIAJBvwtqLQAAIYsCIAJBxwtqLQAAIYwCIAJBzwtqLQAAIY0CIAJB1wtqLQAAIY4CIAJB3wtqLQAAIY8CIAItANwLIdwDIAIoAtgLId0DIAItANQLId4DIAIoAtALId8DIAItAMwLIeADIAIoAsgLIeEDIAItAMQLIeIDIAIoAsALIeMDIAItALwLIeQDIAIoArgLIeUDIAItALQLIeYDIAIoArALIecDIAItAKwLIegDIAIoAqgLIekDIAItAKQLIeoDIAIoAqALIesDIAItAJwLIewDIAIoApgLIe0DIAItAJQLIe4DIAIoApALIe8DIAItAIwLIfADIAIoAogLIfEDIAItAIQLIfIDIAIoAoALIfMDIAItAPwKIfQDIAIoAvgKIfUDIAItAPQKIfYDIAIoAvAKIfcDIAItAOwKIfgDIAIoAugKIfkDIAItAOQKIfoDIAIoAuAKIfsDIAItANwKIfwDIAIoAtgKIf0DIAItANQKIf4DIAIoAtAKIf8DIAItAMwKIYAEIAIoAsgKIYEEIAItAMQKIYIEIAIoAsAKIYMEIAItALwKIYQEIAIoArgKIYUEIAItALQKIYYEIAIoArAKIYcEIAItAKwKIYgEIAIoAqgKIYkEIAItAKQKIYoEIAIoAqAKIYsEIAItAJwKIYwEIAIoApgKIY0EIAItAJQKIY4EIAIoApAKIY8EIAItAIwKIZAEIAIoAogKIZEEIAItAIQKIZIEIAIoAoAKIZMEIAItAPwJIZQEIAIoAvgJIZUEIAItAPQJIZYEIAIoAvAJIZcEIAItAOwJIZgEIAIoAugJIZkEIAItAOQJIZoEIAIoAuAJIZsEIAItANwJIZwEIAIoAtgJIZ0EIAItANQJIZ4EIAIoAtAJIZ8EIAItAMwJIaAEIAIoAsgJIaEEIAItAMQJIaIEIAIoAsAJIaMEIAItALwJIaQEIAIoArgJIaUEIAItALQJIaYEIAIoArAJIacEIAItAKwJIagEIAIoAqgJIakEIAItAKQJIaoEIAIoAqAJIasEIAItAJwJIawEIAIoApgJIa0EIAItAJQJIa4EIAIoApAJIa8EIAItAIwJIbAEIAIoAogJIbEEIAItAIQJIbIEIAIoAoAJIbMEIAItAPwIIbQEIAIoAvgIIbUEIAItAPQIIbYEIAIoAvAIIbcEIAItAOwIIbgEIAIoAugIIbkEIAItAOQIIboEIAIoAuAIIbsEIAItANwIIbwEIAIoAtgIIb0EIAItANQIIb4EIAIoAtAIIb8EIAItAMwIIcAEIAIoAsgIIcEEIAItAMQIIcIEIAIoAsAIIcMEIAItALwIIcQEIAIoArgIIcUEIAItALQIIcYEIAIoArAIIccEIAItAKwIIcgEIAIoAqgIIckEIAItAKQIIcoEIAIoAqAIIcsEIAItAJwIIcwEIAIoApgIIc0EIAItAJQIIc4EIAIoApAIIc8EIAItAIwIIdAEIAIoAogIIdEEIAItAIQIIdIEIAIoAoAIIdMEIAItAPwHIdQEIAIoAvgHIdUEIAItAPQHIdYEIAIoAvAHIdcEIAItAOwHIdgEIAIoAugHIdkEIAItAOQHIdoEIAIoAuAHIdsEIAItANwHIdwEIAIoAtgHId0EIAItANQHId4EIAIoAtAHId8EIAItAMwHIeAEIAIoAsgHIeEEIAItAMQHIeIEIAIoAsAHIeMEIAItALwHIeQEIAIoArgHIeUEIAItALQHIeYEIAIoArAHIecEIAItAKwHIekEIAIoAqgHIeoEIAItAKQHIUYgAigCoAchOSACLQCcByHiASACKAKYByE/IAItAJQHIRAgAigCkAchKiACLQCMByE+IAIoAogHIQogAigChAch5gEgAigCgAchNSACKAL8BiEdIAIoAvgGITQgAigC9AYhByACKALwBiEnIAIoAuwGIQwgAigC6AYhBCACKALkBiGEAiACKALgBiE9IAIpA9gGIYsFIAIvAI0HIZACIAIvAJUHIZECIAIvAJ0HIZICIAIvAKUHIZMCIAIvAK0HIZQCIAIvALUHIZUCIAIvAL0HIZYCIAIvAMUHIZcCIAIvAM0HIZgCIAIvANUHIZkCIAIvAN0HIZoCIAIvAOUHIZsCIAIvAO0HIZwCIAIvAPUHIZ0CIAIvAP0HIZ4CIAIvAIUIIZ8CIAIvAI0IIaACIAIvAJUIIaECIAIvAJ0IIaICIAIvAKUIIaMCIAIvAK0IIaQCIAIvALUIIaUCIAIvAL0IIaYCIAIvAMUIIacCIAIvAM0IIagCIAIvANUIIakCIAIvAN0IIaoCIAIvAOUIIasCIAIvAO0IIawCIAIvAPUIIa0CIAIvAP0IIa4CIAIvAIUJIa8CIAIvAI0JIbACIAIvAJUJIbECIAIvAJ0JIbICIAIvAKUJIbMCIAIvAK0JIbQCIAIvALUJIbUCIAIvAL0JIbYCIAIvAMUJIbcCIAIvAM0JIbgCIAIvANUJIbkCIAIvAN0JIboCIAIvAOUJIbsCIAIvAO0JIRQgAi8A9QkhGiACLwD9CSEbIAIvAIUKIRwgAi8AjQohKCACLwCVCiEuIAIvAJ0KITIgAi8ApQohOCACLwCtCiE6IAIvALUKIRMgAi8AvQohFiACLwDFCiE2IAIvAM0KITcgAi8A1QohFyACLwDdCiHfASACLwDlCiEZIAIvAO0KISIgAi8A9QohFSACLwD9CiFAIAIvAIULISAgAi8AjQshQyACLwCVCyEmIAIvAJ0LISsgAi8ApQshESACLwCtCyEPIAIvALULIQkgAi8AvQshDiACLwDFCyEIIAIvAM0LIQsgAi8A1QshBiACLwDdCyEFIPIEENEkIA0Q0CQgf0EQdHIhfyB+QRB0ciF+IH1BEHRyIX0gfEEQdHIhfCB7QRB0ciF7IHpBEHRyIXogeUEQdHIheSB4QRB0ciF4IHdBEHRyIXcgdkEQdHIhdiB1QRB0ciF1IHRBEHRyIXQgc0EQdHIhcyByQRB0ciFyIHFBEHRyIXEgcEEQdHIhcCBvQRB0ciFvIG5BEHRyIW4gbUEQdHIhbSBsQRB0ciFsIGtBEHRyIWsgakEQdHIhaiBpQRB0ciFpIGhBEHRyIWggZ0EQdHIhZyBmQRB0ciFmIGVBEHRyIWUgZEEQdHIhZCBjQRB0ciFjIGJBEHRyIWIgYUEQdHIhYSBgQRB0ciFgIF9BEHRyIV8gXkEQdHIhXiBdQRB0ciFdIFxBEHRyIVwgW0EQdHIhWyBaQRB0ciFaIFlBEHRyIVkgWEEQdHIhWCBXQRB0ciFXIFZBEHRyIVYgVUEQdHIhVSBUQRB0ciFUIFNBEHRyIVMgUkEQdHIhUiBRQRB0ciFRIFBBEHRyIVAgT0EQdHIhTyBOQRB0ciFOIE1BEHRyIU0gTEEQdHIhTCBLQRB0ciFLIEpBEHRyIUogSUEQdHIhSSBIQRB0ciFIIEdBEHRyIUcg7QRBEHRyIZYBIIkFQRB0ciGVASCIBUEQdHIhlAEghwVBEHRyIZMBIIYFQRB0ciGSASCFBUEQdHIhkQEghAVBEHRyIZABIIMFQRB0ciGPASCCBUEQdHIhjgEggQVBEHRyIY0BIIAFQRB0ciGMASD/BEEQdHIhiwEg/gRBEHRyIYoBIP0EQRB0ciGJASD8BEEQdHIhiAEg+wRBEHRyIYcBIPoEQRB0ciGGASD5BEEQdHIhhQEg+ARBEHRyIYQBIPcEQRB0ciGDASD2BEEQdHIhggEg9QRBEHRyIYEBIPQEQRB0ciGAASAFII8CQRB0ciHcASAGII4CQRB0ciGXASALII0CQRB0ciGYASAIIIwCQRB0ciGZASAOIIsCQRB0ciGaASAJIIoCQRB0ciGbASAPIIkCQRB0ciGcASARIIgCQRB0ciGdASArIIcCQRB0ciGeASAmIIYCQRB0ciGfASBDIIICQRB0ciGgASAgIDBBEHRyIaEBIEAggAJBEHRyIaIBIBUg/wFBEHRyIaMBICIg/gFBEHRyIaQBIBkg/QFBEHRyIaUBIN8BIPwBQRB0ciGmASAXIPsBQRB0ciGnASA3IPoBQRB0ciGoASA2IPkBQRB0ciGpASAWIPgBQRB0ciGqASATIPcBQRB0ciGrASA6IPYBQRB0ciGsASA4IPUBQRB0ciGtASAyIPQBQRB0ciGuASAuIPMBQRB0ciGvASAoIPIBQRB0ciGwASAcIPEBQRB0ciGxASAbIPABQRB0ciGyASAaIO8BQRB0ciGzASAUIO4BQRB0ciG0ASC7AiDtAUEQdHIhtQEgugIg7AFBEHRyIbYBILkCIOsBQRB0ciG3ASC4AiDqAUEQdHIhuAEgtwIg6QFBEHRyIbkBILYCIOgBQRB0ciG6ASC1AiDlAUEQdHIhuwEgtAIg5AFBEHRyIbwBILMCIOABQRB0ciG9ASCyAiDjAUEQdHIhvgEgsQIg4QFBEHRyIb8BILACIN4BQRB0ciHAASCvAiDdAUEQdHIhwQEgrgIg2wFBEHRyIcIBIK0CINoBQRB0ciHDASCsAiDZAUEQdHIhxAEgqwIg2AFBEHRyIcUBIKoCINcBQRB0ciHGASCpAiDWAUEQdHIhxwEgqAIg1QFBEHRyIcgBIKcCINQBQRB0ciHJASCmAiDTAUEQdHIhygEgpQIg0gFBEHRyIcsBIKQCINEBQRB0ciHMASCjAiDQAUEQdHIhzQEgogIgzwFBEHRyIc4BIKECIEVBEHRyIc8BIKACIERBEHRyIdsBIJ8CIDxBEHRyIdoBIJ4CIEFBEHRyIdkBIJ0CIDtBEHRyIdgBIJwCIDNBEHRyIdcBIJsCIC9BEHRyIdYBIJoCIC1BEHRyIdUBIJkCICxBEHRyIdQBIJgCICNBEHRyIdMBIJcCIBJBEHRyIdIBIJYCIO4EQRB0ciHRASCVAiCFAkEQdHIh0AEglAIgMUEQdHIhgAIgkwIg5wFBEHRyIQ8gkgIgQkEQdHIhDSCRAiDxBEEQdHIhBSCQAiDwBEEQdHIhCyCKBachggIMBQsgAkHQIWoiBiACQegMakHAABD8BhogBhDSJCACQZgHahDQJCACKALQCyIGIAYoAgAiBkEBazYCACAGQQFHDQMgAkHQC2oQ+w0MAwsgAkH/BmotAAAhESACQYcHai0AACEJIAJBjwdqLQAAIQ4gAkGXB2otAAAhCCACLQCUByFGIAIoApAHITkgAi0AjAch4gEgAigCiAchPyACLQCEByEQIAIoAoAHISogAi0A/AYhPiACKAL4BiEKIAIoAvQGIeYBIAIoAvAGITUgAigC7AYhHSACKALoBiE0IAIoAuQGIQcgAigC4AYhJyACKALcBiEMIAIvAP0GIAIvAIUHIQYgAi8AjQcgAi8AlQcgKxD5CyAIQRB0ciEPIA5BEHRyIQ0gEUEQdHIhCyACQegeahCRHSACQfQAahDyHyACQdgAahC9KCACQbgkahDkHiAGIAlBEHRyCyEFIAJByABqEMskIAJBsAFqEOYeQQEhPQwECyACQaAUahDSJAsgDRDQJAsgAkGgAWoQ5hwLIIsFQgNRDQAgAi8A6R4gAi0A6x5BEHRyIegBIAIvAOEfIAJB4x9qLQAAQRB0ciFCIAIvANkfIAJB2x9qLQAAQRB0ciHpASACLwDRHyACQdMfai0AAEEQdHIh6gEgAi8AyR8gAkHLH2otAABBEHRyIesBIAIvAMEfIAJBwx9qLQAAQRB0ciHsASACLwC5HyACQbsfai0AAEEQdHIh7QEgAi8AsR8gAkGzH2otAABBEHRyIe4BIAIvAKkfIAJBqx9qLQAAQRB0ciHvASACLwChHyACQaMfai0AAEEQdHIh8AEgAi8AmR8gAkGbH2otAABBEHRyIfEBIAIvAJEfIAJBkx9qLQAAQRB0ciHyASACLwCJHyACQYsfai0AAEEQdHIh8wEgAi8AgR8gAkGDH2otAABBEHRyIfQBIAIvAPkeIAJB+x5qLQAAQRB0ciH1ASACLwDxHiACQfMeai0AAEEQdHIh9gEgAi8AiQEgAkGLAWotAABBEHRyIfcBIAIvAIEBIAJBgwFqLQAAQRB0ciH4ASACLwB5IAJB+wBqLQAAQRB0ciH5ASACLwBtIAJB7wBqLQAAQRB0ciH6ASACLwBlIAJB5wBqLQAAQRB0ciH7ASACLwBdIAJB3wBqLQAAQRB0ciH8ASACLwBVIAJB1wBqLQAAQRB0ciH9ASACLwBNIAJBzwBqLQAAQRB0ciH+ASACKAKgISGGAiACKAKcISGHAiACKAKYISGIAiACKAKUISGJAiACKAKQISGKAiACKAKMISGLAiACKAKIISGMAiACKAKEISGNAiACKAKAISGOAiACKAL8ICGPAiACKAL4ICGQAiACKAL0ICGRAiACKALwICGSAiACKALsICGTAiACKALoICGUAiACKALkICGVAiACKALgICGWAiACKALcICGXAiACKALYICGYAiACKALUICGZAiACKALQICGaAiACKALMICGbAiACKALIICGcAiACKALEICGdAiACKALAICGeAiACKAK8ICGfAiACKAK4ICGgAiACKAK0ICGhAiACKAKwICGiAiACKAKsICGjAiACKAKoICGkAiACKAKkICGlAiACKAKgICGmAiACKAKcICGnAiACKAKYICGoAiACKAKUICGpAiACKAKQICGqAiACKAKMICGrAiACKAKIICGsAiACKAKEICGtAiACKAKAICGuAiACKAL8HyGvAiACKAL4HyGwAiACKAL0HyGxAiACKALwHyGyAiACKALsHyGzAiACKALoHyERIAIoAuQfIbQCIAItAOAfIecBIAIoAtwfIbUCIAItANgfIbYCIAIoAtQfIbcCIAItANAfIbgCIAIoAswfIbkCIAItAMgfIboCIAIoAsQfIbsCIAItAMAfIRQgAigCvB8hEiACLQC4HyEjIAIoArQfIRogAi0AsB8hLSACKAKsHyE7IAItAKgfIUEgAigCpB8hRCACLQCgHyFFIAIoApwfITwgAi0AmB8h3QEgAigClB8h3gEgAi0AkB8h4wEgAigCjB8h4AEgAi0AiB8h4QEgAigChB8h5AEgAi0AgB8h5QEgAigC/B4hGyACLQD4HiEcIAIoAvQeISggAi0A8B4hLiACKALsHiEyIAItAOgeITggAigCjAEhOiACLQCIASETIAIoAoQBIRYgAi0AgAEhNiACKAJ8ITcgAi0AeCEXIAIoAnQh3wEgAi0AbCEZIAIoAmghIiACLQBkIRUgAigCYCFAIAItAFwhLyACKAJYISAgAigCuCQhhQIgAi0AVCH/ASACKAJQIUMgAi0ATCEmIAIoAkghKyACKAKwASIsKAJYIggtACBBAnFFDQEgCC0AHEEBcSCLBUICUXINAUGoDUEIEKEgIgEgQjsA1QsgASDpATsAzQsgASDqATsAxQsgASDrATsAvQsgASDsATsAtQsgASDtATsArQsgASDuATsApQsgASDvATsAnQsgASDwATsAlQsgASDxATsAjQsgASDyATsAhQsgASDzATsA/QogASD0ATsA9QogASD1ATsA7QogASD2ATsA5QogASDoATsA3QogASD3ATsA1QogASD4ATsAzQogASD5ATsAxQogASD6ATsAvQogASD7ATsAtQogASD8ATsArQogASD9ATsApQogASD+ATsAnQogASB/OwCVCiABIH47AI0KIAEgfTsAhQogASB8OwD9CSABIHs7APUJIAEgejsA7QkgASB5OwDlCSABIHg7AN0JIAEgdzsA1QkgASB2OwDNCSABIHU7AMUJIAEgdDsAvQkgASBzOwC1CSABIHI7AK0JIAEgcTsApQkgASBwOwCdCSABIG87AJUJIAEgbjsAjQkgASBtOwCFCSABIGw7AP0IIAEgazsA9QggASBqOwDtCCABIGk7AOUIIAEgaDsA3QggASBnOwDVCCABIGY7AM0IIAEgZTsAxQggASBkOwC9CCABIGM7ALUIIAEgYjsArQggASBhOwClCCABIGA7AJ0IIAEgXzsAlQggASBeOwCNCCABIF07AIUIIAEgXDsA/QcgASBbOwD1ByABIFo7AO0HIAEgWTsA5QcgASBYOwDdByABIFc7ANUHIAEgVjsAzQcgASBVOwDFByABIFQ7AL0HIAEgUzsAtQcgASBSOwCtByABIFE7AKUHIAEgUDsAnQcgASBPOwCVByABIE47AI0HIAEgTTsAhQcgASBMOwD9BiABIEs7APUGIAEgSjsA7QYgASBJOwDlBiABIEg7AN0GIAEgRzsA1QYgASCWATsAzQYgASCVATsAxQYgASCUATsAvQYgASCTATsAtQYgASCSATsArQYgASCRATsApQYgASCQATsAnQYgASCPATsAlQYgASCOATsAjQYgASCNATsAhQYgASCMATsA/QUgASCLATsA9QUgASCKATsA7QUgASCJATsA5QUgASCIATsA3QUgASCHATsA1QUgASCGATsAzQUgASCFATsAxQUgASCEATsAvQUgASCDATsAtQUgASCCATsArQUgASCBATsApQUgASCAATsAnQUgAUEAOwCVBSABINwBOwCNBSABIJcBOwCFBSABIJgBOwD9BCABIJkBOwD1BCABIJoBOwDtBCABIJsBOwDlBCABIJwBOwDdBCABIJ0BOwDVBCABIJ4BOwDNBCABIJ8BOwDFBCABIKABOwC9BCABIKEBOwC1BCABIKIBOwCtBCABIKMBOwClBCABIKQBOwCdBCABIKUBOwCVBCABIKYBOwCNBCABIKcBOwCFBCABIKgBOwD9AyABIKkBOwD1AyABIKoBOwDtAyABIKsBOwDlAyABIKwBOwDdAyABIK0BOwDVAyABIK4BOwDNAyABIK8BOwDFAyABILABOwC9AyABILEBOwC1AyABILIBOwCtAyABILMBOwClAyABILQBOwCdAyABILUBOwCVAyABILYBOwCNAyABILcBOwCFAyABILgBOwD9AiABILkBOwD1AiABILoBOwDtAiABILsBOwDlAiABILwBOwDdAiABIL0BOwDVAiABIL4BOwDNAiABIL8BOwDFAiABIMABOwC9AiABIMEBOwC1AiABIMIBOwCtAiABIMMBOwClAiABIMQBOwCdAiABIMUBOwCVAiABIMYBOwCNAiABIMcBOwCFAiABIMgBOwD9ASABIMkBOwD1ASABIMoBOwDtASABIMsBOwDlASABIMwBOwDdASABIM0BOwDVASABIM4BOwDNASABIM8BOwDFASABINsBOwC9ASABINoBOwC1ASABINkBOwCtASABINgBOwClASABINcBOwCdASABINYBOwCVASABINUBOwCNASABINQBOwCFASABINMBOwB9IAEg0gE7AHUgASDRATsAbSABINABOwBlIAEggAI7AF0gASAPOwBVIAEgDTsATSABIAU7AEUgAUEAOgCkDSABIIECNgKgDSABIIUCNgKcDSABICw2ApgNIAEghgI2ApQNIAEghwI2ApANIAEgiAI2AowNIAEgiQI2AogNIAEgigI2AoQNIAEgiwI2AoANIAEgjAI2AvwMIAEgjQI2AvgMIAEgjgI2AvQMIAEgjwI2AvAMIAEgkAI2AuwMIAEgkQI2AugMIAEgkgI2AuQMIAEgkwI2AuAMIAEglAI2AtwMIAEglQI2AtgMIAEglgI2AtQMIAEglwI2AtAMIAEgmAI2AswMIAEgmQI2AsgMIAEgmgI2AsQMIAEgmwI2AsAMIAEgnAI2ArwMIAEgnQI2ArgMIAEgngI2ArQMIAEgnwI2ArAMIAEgoAI2AqwMIAEgoQI2AqgMIAEgogI2AqQMIAEgowI2AqAMIAEgpAI2ApwMIAEgpQI2ApgMIAEgpgI2ApQMIAEgpwI2ApAMIAEgqAI2AowMIAEgqQI2AogMIAEgqgI2AoQMIAEgqwI2AoAMIAEgrAI2AvwLIAEgrQI2AvgLIAEgrgI2AvQLIAEgrwI2AvALIAEgsAI2AuwLIAEgsQI2AugLIAEgsgI2AuQLIAEgswI2AuALIAEgETYC3AsgASC0AjYC2AsgASDnAToA1AsgASC1AjYC0AsgASC2AjoAzAsgASC3AjYCyAsgASC4AjoAxAsgASC5AjYCwAsgASC6AjoAvAsgASC7AjYCuAsgASAUOgC0CyABIBI2ArALIAEgIzoArAsgASAaNgKoCyABIC06AKQLIAEgOzYCoAsgASBBOgCcCyABIEQ2ApgLIAEgRToAlAsgASA8NgKQCyABIN0BOgCMCyABIN4BNgKICyABIOMBOgCECyABIOABNgKACyABIOEBOgD8CiABIOQBNgL4CiABIOUBOgD0CiABIBs2AvAKIAEgHDoA7AogASAoNgLoCiABIC46AOQKIAEgMjYC4AogASA4OgDcCiABIDo2AtgKIAEgEzoA1AogASAWNgLQCiABIDY6AMwKIAEgNzYCyAogASAXOgDECiABIN8BNgLACiABIBk6ALwKIAEgIjYCuAogASAVOgC0CiABIEA2ArAKIAEgLzoArAogASAgNgKoCiABIP8BOgCkCiABIEM2AqAKIAEgJjoAnAogASArNgKYCiABILwCOgCUCiABIL0CNgKQCiABIL4COgCMCiABIL8CNgKICiABIMACOgCECiABIMECNgKACiABIMICOgD8CSABIMMCNgL4CSABIMQCOgD0CSABIMUCNgLwCSABIMYCOgDsCSABIMcCNgLoCSABIMgCOgDkCSABIMkCNgLgCSABIMoCOgDcCSABIMsCNgLYCSABIMwCOgDUCSABIM0CNgLQCSABIM4COgDMCSABIM8CNgLICSABINACOgDECSABINECNgLACSABINICOgC8CSABINMCNgK4CSABINQCOgC0CSABINUCNgKwCSABINYCOgCsCSABINcCNgKoCSABINgCOgCkCSABINkCNgKgCSABINoCOgCcCSABINsCNgKYCSABINwCOgCUCSABIN0CNgKQCSABIN4COgCMCSABIN8CNgKICSABIOACOgCECSABIOECNgKACSABIOICOgD8CCABIOMCNgL4CCABIOQCOgD0CCABIOUCNgLwCCABIOYCOgDsCCABIOcCNgLoCCABIOgCOgDkCCABIOkCNgLgCCABIOoCOgDcCCABIOsCNgLYCCABIOwCOgDUCCABIO0CNgLQCCABIO4COgDMCCABIO8CNgLICCABIPACOgDECCABIPECNgLACCABIPICOgC8CCABIPMCNgK4CCABIPQCOgC0CCABIPUCNgKwCCABIPYCOgCsCCABIPcCNgKoCCABIPgCOgCkCCABIPkCNgKgCCABIPoCOgCcCCABIPsCNgKYCCABIPwCOgCUCCABIP0CNgKQCCABIP4COgCMCCABIP8CNgKICCABIIADOgCECCABIIEDNgKACCABIIIDOgD8ByABIIMDNgL4ByABIIQDOgD0ByABIIUDNgLwByABIIYDOgDsByABIIcDNgLoByABIIgDOgDkByABIIkDNgLgByABIIoDOgDcByABIIsDNgLYByABIIwDOgDUByABII0DNgLQByABII4DOgDMByABII8DNgLIByABIJADOgDEByABIJEDNgLAByABIJIDOgC8ByABIJMDNgK4ByABIJQDOgC0ByABIJUDNgKwByABIJYDOgCsByABIJcDNgKoByABIJgDOgCkByABIJkDNgKgByABIJoDOgCcByABIJsDNgKYByABIJwDOgCUByABIJ0DNgKQByABIJ4DOgCMByABIJ8DNgKIByABIKADOgCEByABIKEDNgKAByABIKIDOgD8BiABIKMDNgL4BiABIKQDOgD0BiABIKUDNgLwBiABIKYDOgDsBiABIKcDNgLoBiABIKgDOgDkBiABIKkDNgLgBiABIKoDOgDcBiABIKsDNgLYBiABIKwDOgDUBiABIK0DNgLQBiABIK4DOgDMBiABIK8DNgLIBiABILADOgDEBiABILEDNgLABiABILIDOgC8BiABILMDNgK4BiABILQDOgC0BiABILUDNgKwBiABILYDOgCsBiABILcDNgKoBiABILgDOgCkBiABILkDNgKgBiABILoDOgCcBiABILsDNgKYBiABILwDOgCUBiABIL0DNgKQBiABIL4DOgCMBiABIL8DNgKIBiABIMADOgCEBiABIMEDNgKABiABIMIDOgD8BSABIMMDNgL4BSABIMQDOgD0BSABIMUDNgLwBSABIMYDOgDsBSABIMcDNgLoBSABIMgDOgDkBSABIMkDNgLgBSABIMoDOgDcBSABIMsDNgLYBSABIMwDOgDUBSABIM0DNgLQBSABIM4DOgDMBSABIM8DNgLIBSABINADOgDEBSABINEDNgLABSABINIDOgC8BSABINMDNgK4BSABINQDOgC0BSABINUDNgKwBSABINYDOgCsBSABINcDNgKoBSABINgDOgCkBSABINkDNgKgBSABINoDOgCcBSABINsDNgKYBSABQQA6AJQFIAEgggI2ApAFIAEg3AM6AIwFIAEg3QM2AogFIAEg3gM6AIQFIAEg3wM2AoAFIAEg4AM6APwEIAEg4QM2AvgEIAEg4gM6APQEIAEg4wM2AvAEIAEg5AM6AOwEIAEg5QM2AugEIAEg5gM6AOQEIAEg5wM2AuAEIAEg6AM6ANwEIAEg6QM2AtgEIAEg6gM6ANQEIAEg6wM2AtAEIAEg7AM6AMwEIAEg7QM2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IAEg+wE7ALUKIAEg/AE7AK0KIAEg/QE7AKUKIAEg/gE7AJ0KIAEgfzsAlQogASB+OwCNCiABIH07AIUKIAEgfDsA/QkgASB7OwD1CSABIHo7AO0JIAEgeTsA5QkgASB4OwDdCSABIHc7ANUJIAEgdjsAzQkgASB1OwDFCSABIHQ7AL0JIAEgczsAtQkgASByOwCtCSABIHE7AKUJIAEgcDsAnQkgASBvOwCVCSABIG47AI0JIAEgbTsAhQkgASBsOwD9CCABIGs7APUIIAEgajsA7QggASBpOwDlCCABIGg7AN0IIAEgZzsA1QggASBmOwDNCCABIGU7AMUIIAEgZDsAvQggASBjOwC1CCABIGI7AK0IIAEgYTsApQggASBgOwCdCCABIF87AJUIIAEgXjsAjQggASBdOwCFCCABIFw7AP0HIAEgWzsA9QcgASBaOwDtByABIFk7AOUHIAEgWDsA3QcgASBXOwDVByABIFY7AM0HIAEgVTsAxQcgASBUOwC9ByABIFM7ALUHIAEgUjsArQcgASBROwClByABIFA7AJ0HIAEgTzsAlQcgASBOOwCNByABIE07AIUHIAEgTDsA/QYgASBLOwD1BiABIEo7AO0GIAEgSTsA5QYgASBIOwDdBiABIEc7ANUGIAEglgE7AM0GIAEglQE7AMUGIAEglAE7AL0GIAEgkwE7ALUGIAEgkgE7AK0GIAEgkQE7AKUGIAEgkAE7AJ0GIAEgjwE7AJUGIAEgjgE7AI0GIAEgjQE7AIUGIAEgjAE7AP0FIAEgiwE7APUFIAEgigE7AO0FIAEgiQE7AOUFIAEgiAE7AN0FIAEghwE7ANUFIAEghgE7AM0FIAEghQE7AMUFIAEghAE7AL0FIAEggwE7ALUFIAEgggE7AK0FIAEggQE7AKUFIAEggAE7AJ0FIAFBADsAlQUgASDcATsAjQUgASCXATsAhQUgASCYATsA/QQgASCZATsA9QQgASCaATsA7QQgASCbATsA5QQgASCcATsA3QQgASCdATsA1QQgASCeATsAzQQgASCfATsAxQQgASCgATsAvQQgASChATsAtQQgASCiATsArQQgASCjATsApQQgASCkATsAnQQgASClATsAlQQgASCmATsAjQQgASCnATsAhQQgASCoATsA/QMgASCpATsA9QMgASCqATsA7QMgASCrATsA5QMgASCsATsA3QMgASCtATsA1QMgASCuATsAzQMgASCvATsAxQMgASCwATsAvQMgASCxATsAtQMgASCyATsArQMgASCzATsApQMgASC0ATsAnQMgASC1ATsAlQMgASC2ATsAjQMgASC3ATsAhQMgASC4ATsA/QIgASC5ATsA9QIgASC6ATsA7QIgASC7ATsA5QIgASC8ATsA3QIgASC9ATsA1QIgASC+ATsAzQIgASC/ATsAxQIgASDAATsAvQIgASDBATsAtQIgASDCATsArQIgASDDATsApQIgASDEATsAnQIgASDFATsAlQIgASDGATsAjQIgASDHATsAhQIgASDIATsA/QEgASDJATsA9QEgASDKATsA7QEgASDLATsA5QEgASDMATsA3QEgASDNATsA1QEgASDOATsAzQEgASDPATsAxQEgASDbATsAvQEgASDaATsAtQEgASDZATsArQEgASDYATsApQEgASDXATsAnQEgASDWATsAlQEgASDVATsAjQEgASDUATsAhQEgASDTATsAfSABINIBOwB1IAEg0QE7AG0gASDQATsAZSABIIACOwBdIAEgDzsAVSABIA07AE0gASAFOwBFIAEgigU3A7ANIAEgCzoArA0gASAINgKoDSABQQA2AqQNIAEggQI2AqANIAEghQI2ApwNIAEgLDYCmA0gASCGAjYAlA0gASCHAjYAkA0gASCIAjYAjA0gASCJAjYAiA0gASCKAjYAhA0gASCLAjYAgA0gASCMAjYA/AwgASCNAjYA+AwgASCOAjYA9AwgASCPAjYA8AwgASCQAjYA7AwgASCRAjYA6AwgASCSAjYA5AwgASCTAjYA4AwgASCUAjYA3AwgASCVAjYA2AwgASCWAjYA1AwgASCXAjYA0AwgASCYAjYAzAwgASCZAjYAyAwgASCaAjYAxAwgASCbAjYAwAwgASCcAjYAvAwgASCdAjYAuAwgASCeAjYAtAwgASCfAjYAsAwgASCgAjYArAwgASChAjYAqAwgASCiAjYApAwgASCjAjYAoAwgASCkAjYAnAwgASClAjYAmAwgASCmAjYAlAwgASCnAjYAkAwgASCoAjYAjAwgASCpAjYAiAwgASCqAjYAhAwgASCrAjYAgAwgASCsAjYA/AsgASCtAjYA+AsgASCuAjYA9AsgASCvAjYA8Asg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uAYgAkG4AWogAkHQJGpBgAUQ/AYaID2tIIQCrUIghoQhigUgAkGIHGoQiQwgjQVCA1INASDnBCEwIOYEITMg0AEhASDlBCHnBCDkBCHmBCDRASHQASDjBCHlBCDiBCHkBCDSASHRASDhBCHjBCDgBCHiBCDTASHSASDfBCHhBCDeBCHgBCDUASHTASDdBCHfBCDcBCHeBCDVASHUASDbBCHdBCDaBCHcBCDWASHVASDZBCHbBCDYBCHaBCDXASHWASDXBCHZBCDWBCHYBCDYASHXASDVBCHXBCDUBCHWBCDZASHYASDTBCHVBCDSBCHUBCDaASHZASDRBCHTBCDQBCHSBCDbASHaASDPBCHRBCDOBCHQBCDPASHbASDNBCHPBCDMBCHOBCDOASHPASDLBCHNBCDKBCHMBCDNASHOASDJBCHLBCDIBCHKBCDMASHNASDHBCHJBCDGBCHIBCDLASHMASDFBCHHBCDEBCHGBCDKASHLASDDBCHFBCDCBCHEBCDJASHKASDBBCHDBCDABCHCBCDIASHJASC/BCHBBCC+BCHABCDHASHIASC9BCG/BCC8BCG+BCDGASHHASC7BCG9BCC6BCG8BCDFASHGASC5BCG7BCC4BCG6BCDEASHFASC3BCG5BCC2BCG4BCDDASHEASC1BCG3BCC0BCG2BCDCASHDASCzBCG1BCCyBCG0BCDBASHCASCxBCGzBCCwBCGyBCDAASHBASCvBCGxBCCuBCGwBCC/ASHAASCtBCGvBCCsBCGuBCC+ASG/ASCrBCGtBCCqBCGsBCC9ASG+ASCpBCGrBCCoBCGqBCC8ASG9ASCnBCGpBCCmBCGoBCC7ASG8ASClBCGnBCCkBCGmBCC6ASG7ASCjBCGlBCCiBCGkBCC5ASG6ASChBCGjBCCgBCGiBCC4ASG5ASCfBCGhBCCeBCGgBCC3ASG4ASCdBCGfBCCcBCGeBCC2ASG3ASCbBCGdBCCaBCGcBCC1ASG2ASCZBCGbBCCYBCGaBCC0ASG1ASCXBCGZBCCWBCGYBCCzASG0ASCVBCGXBCCUBCGWBCCyASGzASCTBCGVBCCSBCGUBCCxASGyASCRBCGTBCCQBCGSBCCwASGxASCPBCGRBCCOBCGQBCCvASGwASCNBCGPBCCMBCGOBCCuASGvASCLBCGNBCCKBCGMBCCtASGuASCJBCGL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CCAEIO4COgDMCCAEIO8CNgLICCAEIPACOgDECCAEIPECNgLACCAEIPICOgC8CCAEIPMCNgK4CCAEIPQCOgC0CCAEIPUCNgKwCCAEIPYCOgCsCCAEIPcCNgKoCCAEIPgCOgCkCCAEIPkCNgKgCCAEIPoCOgCcCCAEIPsCNgKYCCAEIPwCOgCUCCAEIP0CNgKQCCAEIP4COgCMCCAEIP8CNgKICCAEIIADOgCECCAEIIEDNgKACCAEIIIDOgD8ByAEIIMDNgL4ByAEIIQDOgD0ByAEIIUDNgLwByAEIIYDOgDsByAEIIcDNgLoByAEIIgDOgDkByAEIIkDNgLgByAEIIoDOgDcByAEIIsDNgLYByAEIIwDOgDUByAEII0DNgLQByAEII4DOgDMByAEII8DNgLIByAEIJADOgDEByAEIJEDNgLAByAEIJIDOgC8ByAEIJMDNgK4ByAEIJQDOgC0ByAEIJUDNgKwByAEIJYDOgCsByAEIJcDNgKoByAEIJgDOgCkByAEIJkDNgKgByAEIJoDOgCcByAEIJsDNgKYByAEIJwDOgCUByAEIJ0DNgKQByAEIJ4DOgCMByAEIJ8DNgKIByAEIKADOgCEByAEIKEDNgKAByAEIKIDOgD8BiAEIKMDNgL4BiAEIKQDOgD0BiAEIKUDNgLwBiAEIKYDOgDsBiAEIKcDNgLoBiAEIKgDOgDkBiAEIKkDNgLgBiAEIKoDOgDcBiAEIKsDNgLYBiAEIKwDOgDUBiAEIK0DNgLQBiAEIK4DOgDMBiAEIK8DNgLIBiAEILADOgDEBiAEILEDNgLABiAEILIDOgC8BiAEILMDNgK4BiAEILQDOgC0BiAEILUDNgKwBiAEILYDOgCsBiAEILcDNgKoBiAEILgDOgCkBiAEILkDNgKgBiAEILoDOgCcBiAEILsDNgKYBiAEILwDOgCUBiAEIL0DNgKQBiAEIL4DOgCMBiAEIL8DNgKIBiAEIMADOgCEBiAEIMEDNgKABiAEIMIDOgD8BSAEIMMDNgL4BSAEIMQDOgD0BSAEIMUDNgLwBSAEIMYDOgDsBSAEIMcDNgLoBSAEIMgDOgDkBSAEIMkDNgLgBSAEIMoDOgDcBSAEIMsDNgLYBSAEIMwDOgDUBSAEIM0DNgLQBSAEIM4DOgDMBSAEIM8DNgLIBSAEINADOgDEBSAEINEDNgLABSAEINIDOgC8BSAEINMDNgK4BSAEINQDOgC0BSAEINUDNgKwBSAEINYDOgCsBSAEINcDNgKoBSAEINgDOgCkBSAEINkDNgKgBSAEINoDOgCcBSAEINsDNgKYBSAEIO4EOgCUBSAEIIICNgKQBSAEINwDOgCMBSAEIN0DNgKIBSAEIN4DOgCEBSAEIN8DNgKABSAEIOADOgD8BCAEIOEDNgL4BCAEIOIDOgD0BCAEIOMDNgLwBCAEIOQDOgDsBCAEIOUDNgLoBCAEIOYDOgDkBCAEIOcDNgLgBCAEIOgDOgDcBCAEIOkDNgLYBCAEIOoDOgDUBCAEIOsDNgLQBCAEIOwDOgDMBCAEIO0DNgLIBCAEIO4DOgDEBCAEIO8DNgLABCAEIPADOgC8BCAEIPEDNgK4BCAEIPIDOgC0BCAEIPMDNgKwBCAEIPQDOgCsBCAEIPUDNgKoBCAEIPYDOgCkBCAEIPcDNgKgBCAEIPgDOgCcBCAEIPkDNgKYBCAEIPoDOgCUBCAEIPsDNgKQBCAEIPwDOgCMBCAEIP0DNgKIBCAEIP4DOgCEBCAEIP8DNgKABCAEIIAEOgD8AyAEIIEENgL4AyAEIIIEOgD0AyAEIIMENgLwAyAEIIQEOgDsAyAEIIUENgLoAyAEIIYEOgDkAyAEIIcENgLgAyAEIIgEOgDcAyAEIIkENgLYAyAEIIoEOgDUAyAEIIsENgLQAyAEIIwEOgDMAyAEII0ENgLIAyAEII4EOgDEAyAEII8ENgLAAyAEIJAEOgC8AyAEIJEENgK4AyAEIJIEOgC0AyAEIJMENgKwAyAEIJQEOgCsAyAEIJUENgKoAyAEIJYEOgCkAyAEIJcENgKgAyAEIJgEOgCcAyAEIJkENgKYAyAEIJoEOgCUAyAEIJsENgKQAyAEIJwEOgCMAyAEIJ0ENgKIAyAEIJ4EOgCEAyAEIJ8ENgKAAyAEIKAEOgD8AiAEIKEENgL4AiAEIKIEOgD0AiAEIKMENgLwAiAEIKQEOgDsAiAEIKUENgLoAiAEIKYEOgDkAiAEIKcENgLgAiAEIKgEOgDcAiAEIKkENgLYAiAEIKoEOgDUAiAEIKsENgLQAiAEIKwEOgDMAiAEIK0ENgLIAiAEIK4EOgDEAiAEIK8ENgLAAiAEILAEOgC8AiAEILEENgK4AiAEILIEOgC0AiAEILMENgKw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IHc7ANUJIAEgdjsAzQkgASB1OwDFCSABIHQ7AL0JIAEgczsAtQkgASByOwCtCSABIHE7AKUJIAEgcDsAnQkgASBvOwCVCSABIG47AI0JIAEgbTsAhQkgASBsOwD9CCABIGs7APUIIAEgajsA7QggASBpOwDlCCABIGg7AN0IIAEgZzsA1QggASBmOwDNCCABIGU7AMUIIAEgZDsAvQggASBjOwC1CCABIGI7AK0IIAEgYTsApQggASBgOwCdCCABIF87AJUIIAEgXjsAjQggASBdOwCFCCABIFw7AP0HIAEgWzsA9QcgASBaOwDtByABIFk7AOUHIAEgWDsA3QcgASBXOwDVByABIFY7AM0HIAEgVTsAxQcgASBUOwC9ByABIFM7ALUHIAEgUjsArQcgASBROwClByABIFA7AJ0HIAEgTzsAlQcgASBOOwCNByABIE07AIUHIAEgTDsA/QYgASBLOwD1BiABIEo7AO0GIAEgSTsA5QYgASBIOwDdBiABIEc7ANUGIAEglgE7AM0GIAEglQE7AMUGIAEglAE7AL0GIAEgkwE7ALUGIAEgkgE7AK0GIAEgkQE7AKUGIAEgkAE7AJ0GIAEgjwE7AJUGIAEgjgE7AI0GIAEgjQE7AIUGIAEgjAE7AP0FIAEgiwE7APUFIAEgigE7AO0FIAEgiQE7AOUFIAEgiAE7AN0FIAEghwE7ANUFIAEghgE7AM0FIAEghQE7AMUFIAEghAE7AL0FIAEggwE7ALUFIAEgggE7AK0FIAEggQE7AKUFIAEggAE7AJ0FIAFBADsAlQUgASDcATsAjQUgASCXATsAhQUgASCYATsA/QQgASCZATsA9QQgASCaATsA7QQgASCbATsA5QQgASCcATsA3QQgASCdATsA1QQgASCeATsAzQQgASCfATsAxQQgASCgATsAvQQgASChATsAtQQgASCiATsArQQgASCjATsApQQgASCkATsAnQQgASClATsAlQQgASCmATsAjQQgASCnATsAhQQgASCoATsA/QMgASCpATsA9QMgASCqATsA7QMgASCrATsA5QMgASCsATsA3QMgASCtATsA1QMgASCuATsAzQMgASCvATsAxQMgASCwATsAvQMgASCxATsAtQMgASCyATsArQMgASCzATsApQMgASC0ATsAnQMgASC1ATsAlQMgASC2ATsAjQMgASC3ATsAhQMgASC4ATsA/QIgASC5ATsA9QIgASC6ATsA7QIgASC7ATsA5QIgASC8ATsA3QIgASC9ATsA1QIgASC+ATsAzQIgASC/ATsAxQIgASDAATsAvQIgASDBATsAtQIgASDCATsArQIgASDDATsApQIgASDEATsAnQIgASDFATsAlQIgASDGATsAjQIgASDHATsAhQIgASDIATsA/QEgASDJATsA9QEgASDKATsA7QEgASDLATsA5QEgASDMATsA3QEgASDNATsA1QEgASDOATsAzQEgASDPATsAxQEgASDbATsAvQEgASDaATsAtQEgASDZATsArQEgASDYATsApQEgASDXATsAnQEgASDWATsAlQEgASDVATsAjQEgASDUATsAhQEgASDTATsAfSABINIBOwB1IAEg0QE7AG0gASDQATsAZSABIIACOwBdIAEgDzsAVSABIA07AE0gASAFOwBFIAFBADoArA0gASAINgKoDSABQQA2AqQNIAEggQI2AqANIAEghQI2ApwNIAEgLDYCmA0gASCGAjYClA0gASCHAjYCkA0gASCIAjYCjA0gASCJAjYCiA0gASCKAjYChA0gASCLAjYCgA0gASCMAjYC/AwgASCNAjYC+AwgASCOAjYC9AwgASCPAjYC8AwgASCQAjYC7AwgASCRAjYC6AwgASCSAjYC5AwgASCTAjYC4AwgASCUAjYC3AwgASCVAjYC2AwgASCWAjYC1AwgASCXAjYC0AwgASCYAjYCzAwgASCZAjYCyAwgASCaAjYCxAwgASCbAjYCwAwgASCcAjYCvAwgASCdAjYCuAwgASCeAjYCtAwgASCfAjYCsAwgASCgAjYCrAwgASChAjYCqAwgASCiAjYCpAwgASCjAjYCoAwgASCkAjYCnAwgASClAjYCmAwgASCmAjYClAwgASCnAjYCkAwgASCoAjYCjAwgASCpAjYCiAwgASCqAjYChAwgASCrAjYCgAwgASCsAjYC/AsgASCtAjYC+AsgASCuAjYC9AsgASCvAjYC8AsgASCwAjYC7AsgASCxAjYC6AsgASCyAjYC5AsgASCzAjYC4AsgASARNgLcCyABILQCNgLYCyABIOcBOgDUCyABILUCNgLQCyABILYCOgDMCyABILcCNgLICyABILgCOgDECyABILkCNgLACyABILoC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QQFxckUEQCAhEI8dIANBCjYCqAQgECADQagEahCbGAwBCyAhEJAdIANBCTYCqAQgECADQagEahCbGAsgA0EQaiADQeAKahD3DyADKAIUIRggAygCECESIAwgAykC0Ao3AgAgDEEIaiALKQIANwIAIAMgBzYCrAQgAyAINgKoBCAJIANBqARqEOcSDAILIANBqARqIAggByADQZQKahBGIAMoAqgEIgVBgICAgHhHBEAgA0GABGogEUEIaikCADcDACADQYgEaiARQRBqKAIANgIAIAMgGDYCqAMgAyARKQIANwP4AyADKAKwBCEYIAMpArQEIYwFIAMoAqwEDAYFIBJBGGshEiAYQQFrIRgMAQsACwALAAsgBigCBCEFQQAhGEEBDAULIAYoAgQiEEEIaiILKAIAIgVFDQYgEEEEaiIHKAIAIAVB3MvWABCmIyEFIANBKGogBygCACALKAIAQezL1gAQpRkgAygCKCEHIAMoAiwhGEECDAQLIANBgARqIBFBCGopAgA3AwAgA0GIBGogEUEQaigCADYCACADIBEpAgA3A/gDIAMpArQEIYwFIAMoArAEIRggAygCrAQLIQcgHSADKQP4AzcCACAdQRBqIANBiARqKAIANgIAIB1BCGogA0GABGopAwA3AgAgAyCMBTcChAIgAyAYNgKAAiADIAc2AvwBIAMgBTYC+AEMBQsgBigCBCEFQQAhGEEADAELIAYoAgQiEEEIaiILKAIAIgVFDQIgEEEEaiIHKAIAIAVBvMvWABCmIyEFIANBIGogBygCACALKAIAQczL1gAQpRkgAygCICEHIAMoAiQhGEEDCyEQIANBqApqIgsgB60gGK1CIIaENwIAIAMgBTYCpAogAyAQNgKgCiADQaAKahCzGyAhIAMpAqAKNwIAICFBCGogCykCADcCACADIAY2AqgEIANBlANqIANBqARqEOgSIQYMBQsgAyAYNgKoAwsgA0GoBGogA0GUCmogBigCACAGQQRqKAIAEEIgAygCqAQiBUGAgICAeEYEQCADKAKcAyIFQQFrIRggAygCmAMgBUEUbGpBFGshEgNAAkACQAJAAkAgGEF/RgRAQQAhGAwBCyASQQRqKAIAIgVBBEcNAQsgAyAYNgKcAyADKAKUCiIGKAIAIgdB/////wdPDQEgBiAHQQFqNgIAIAMgBigCDCIFNgLgCgJAIAVBAUYEQCAGIAc2AgAgA0GoBGogBhCXDCADKAKoBEEQRw0BQcy/xAAQ2ikACyADQQA2AqgEIANB4ApqQeyd2AAgA0GoBGpB3L/EABDZGgALIANBkARqIANBwARqKAIANgIAIANBiARqIANBuARqKQIANwMAIANBgARqIAwpAgA3AwAgAyADKQKoBDcD+AMgHiADQfgDahCXCkGAgICAeCEFQQEMBgsgEigCACELIAQgEkEIaikCADcCACAEQQhqIBJBEGooAgA2AgAgAyAFNgKwCiADQfgDaiADQbAKahDRCyADKAL4A0EERwRAIANByApqIANBgARqIgUpAgA3AwAgAyAYNgKcAyADIAMpAvgDIowFNwPACiCMBadBA0cNByADQQ82AqgEIAMoApQKIANBqARqEJsYDAcLIANBqARqIANBlApqIAsoAgAgC0EEaigCABBCIAMoAqgEIgVBgICAgHhGDQEgAyAYNgKcAyAeICFBJBD8BhoMBAtBvL/EABDuFAALIBJBFGshEiAYQQFrIRgMAAsACyAeICFBJBD8BhoLQQALIANBlANqEPEfIAMoAvwBIRIEQCADKAKUAiEIIAMoApACIQcgAygCjAIhECADKAKIAiELIAMoAoQCIQYgAygCgAIhBSADQfgCahCtDCADKAL0ASIOIAMoAuwBRgRAIANB7AFqEPUWCyADKALwASAOQRxsaiIPIAg2AhggDyAHNgIUIA8gEDYCECAPIAs2AgwgDyAGNgIIIA8gBTYCBCAPIBI2AgAgAyAOQQFqNgL0AQwDCyADQfgAaiADQfACaikCADcDACADIAMpAugCNwNwIAMoApwCISkgAykClAIhjAUgAykCjAIhjgUgAygCiAIhBiADKAKEAiEYIAMoAoACISMgA0H4AmoQrQxBIiEHDAYLIANBwApqELMbIQYgISADKQL4AzcCACAhQQhqIAUpAgA3AgAgAyALNgKoBCADQZQDaiADQagEahDoEgwACwALAAsgAygCWCENIAMgAy0A1gE6AN8CIAMgAy0A1AEiBzoA3gIgAyADLQDVAToA3QIgAyADKALQATYC2AIgA0IBNwLQAiADQoCAgIAQNwLIAiADIAc6ANwCIANCATcCwAIgA0IANwK4AiADQgQ3ArACIANCADcCqAIgA0IENwKgAiADQgA3ApgC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1iYMAQsgCUGQAWoQqB4LIAlBgANqJAAgAygCsAQhEiADKAKsBCEFIAMoAqgEIgdBIkcEQCADQegKaiAuQQhqKQIANwMAIAMgLikCADcD4AogAykCyAQhjAUgAykCwAQhjgUgAygCvAQhBiADKAK4BCEYIAMoArQEISMgAygC0AQMBgsgAyASNgK0CiADIAU2ArAKIANBqARqIQwgA0GwCmoiDiEHQQAhKSMAQeABayIRJAAgEUIENwI0IBFCADcCLCARQoCAgIDAADcCJCARQQA2AkAgESADQaAKajYCPCARQagBaiEdIBFBpAFqIQQgEUHYAGohCSARQTBqIQoCQAJAA0BB2AAhHgJAAkACfwJAAkACfwJAAkACQAJAAkACQAJAIAcoAgBBB2sOBQMAAQICBAtBKCEeDAILQTAhHgwBC0EMIR4LIBFBoAFqIBFBPGogBygCBCAeahDcCSARKAKgASIGQSJHDQELAkACQAJAIAcoAgBBB2sOBQAGAQcCCgsgBygCBCIGIAYoAgBBiIDEAEYiCEECdGohHgNAAkAgCEEBcUUEQCARQaABaiARQTxqAn8CQAJAQQIgHigCAEGAgMQAayIGIAZBCE8bQQZrDgIAAQQLIB4oAgRB2ABqDAELIB5BEGoLENwJIBEoAqABIg9BIkYNASARKQKsASGKBSARKAKkASEIIBEoAqgBDAcLIBFBoAFqIBFBPGogHkEIahDcCSARKAKgASIPQSJGDQAgESkCrAEhigUgESgCpAEhCCARKAKoAQwGCyARQZABaiIGIAggHhDHCyARKAKQAUEERwRAIB0gESkCkAE3AgAgHUEIaiARQZgBaikCADcCACARQQhqIAYQ9w8gESAeNgKkASARIAg2AqABIBEoAgwhHiARKAIIIQggCiARQaABahDnEgwBCyARQaABaiAIIB4gEUE8ahD9HiARKAKgASIPQSJHDQQgESgCOCIGQQFrIQggESgCNCAGQRhsakEYayEeA0AgCEF/RgRAQQAhCAwLCyAeKAIAIhBBAkYNCiAeQQRqKAIAIQsgEUGQAWoiBiAeQQhqEIUPIBEoApABQQRHBEAgESAINgI4IB1BCGogEUGYAWopAgA3AgAgHSARKQKQATcCACARIAYQ9w8gESALNgKkASARIBA2AqABIBEoAgQhHiARKAIAIQggCiARQaAB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DAoLIAMoAvgDIAMoAvwDENYpDAsLIANBsApqQf4AQc8AELYQIANBADYCiAIgA0EBNgL8ASADQezH1gA2AvgBIANCBDcCgAIgA0GgCmpBqPrCACADQfgBahCtJEUNBQwGCyADQQA2AqQDIANBECADQcAEaiAtQQFxIgUbNgKgAyADQSggA0HYBGogBRs2ApwDIANBDCADQbwEaiAFGygCADYCmAMgA0EIIANBuARqIAUbKAIANgKUAyADQZwDaiEGIANBuANqIANBlANqIgUQsQYgAygClAMgAygCmAMQ7RtFBEAgA0EANgKIAiADQQE2AvwBIANB7MfWADYC+AEgA0IENwKAAiADQaAKaiINQaj6wgAgA0H4AWoiCBCtJA0KIAggBRCxBiADQfgDaiIHIAgQygMgCBC4EyADQQE2AvwBIANB/PbgADYC+AEgA0IBNwKEAiADQT42AuQKIAMgA0HgCmoiBTYCgAIgAyAHNgLgCgJAIA1BqPrCACAIEK0kDQAgA0EBNgL8ASADQfzH1gA2AvgBIANCATcChAIgA0HpADYC5AogAyAGNgLgCiADIAU2AoACIA1BqPrCACAIEK0kDQAgAygC+AMgAygC/AMQ1ikMCQsgAygC+AMgAygC/AMQ1ikMCgsgA0GwCmpB/gBBzwAQthAgA0EANgKIAiADQQE2AvwBIANB7MfWADYC+AEgA0IENwKAAiADQaAKakGo+sIAIANB+AFqEK0kRQ0BDAILIANBADYCwAMgA0KAgICAEDcCuAMgA0EANgKIAiADQQE2AvwBIANB1KrDADYC+AEgA0IENwKAAiADQbgDakGo+sIAIANB+AFqEK0kRQRAIBAgAykCuAM3AgAgEEEIaiADQcADaigCADYCAAwICwwLCyADQQI2AvwBIANB9MzfADYC+AEgA0IBNwKEAiADQT42AvwDIAMgA0H4A2oiDTYCgAIgAyADQbAKaiIHNgL4AyADQaAKakGo+sIAIANB+AFqEK0kDQAgA0HACmoiBSADQbgDahDKAyADQQE2AvwBIANB/PbgADYC+AEgA0IBNwKEAiADQT42AvwDIAMgDTYCgAIgAyAFNgL4AwJAIANBoApqQaj6wgAgA0H4AWoQrSQNACADQQI2AvwBIANB9MzfADYC+AEgA0IBNwKEAiADQT42AvwDIAMgDTYCgAIgAyAH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ADcDECACIAhBEGo2AgQgByAIKQMANwMIQQALNgIAIAMoAogBIgdBBUcNASADQQ02AgAgAxD4JQsgA0HwAWokACABRQ8LIANBgAFqIgggBkEYaigCADYCACADQfgAaiILIAZBEGopAgA3AwAgA0HwAGoiDCAGQQhqKQIANwMAIAMgBikCADcDaCADQagBaiINEN4XIANB4ABqIg4gCkEIaigCADYCACADIAopAwA3A1ggAykDyAEhDyADKQLcASEQIAMpAuQBIREgDRDWFiAEQRhqIAgoAgA2AgAgBEEQaiALKQMANwIAIARBCGogDCkDADcCACAEIAMpA2g3AgAgCSADKQNYNwMAIAlBCGogDigCADYCACADIBE3AkQgAyAQNwI8IAMgDzcDKCADIAc2AgggA0EHNgIAIAUgA0HYABD8BiAAIAAoAghBAWo2AgggAUHYAGshAUHYAGohBQwACwAL8gMBBn8jAEEwayICJAAgAS0ABCEDIAJBHGpBgAIQjhIgAkEsakEAOwEAIAJBADYCKCACQRhqIgVBADsBACACQRBqIgYgAkEkaikCADcDACACIAIpAhw3AwggAi0ALyEHIAEtAAYhBCAAQewDahCXDyAAQfwFakIANwIAIABCADcC9AUgAEIANwMAIABBCGpCADcDACAAQRBqQgA3AwAgAEEYakIANwMAIABBgICAgHg2AiAgAEEkakEAQbICEIoLGiAAQQA6AIUDIAAgA0EDdEHQpeMAaikDADcA/QIgAEEAOgD8AiAAQQA2AvgCIABCgICAgHA3A/ACIABCgICAgMAANwPoAiAAQgQ3A+ACIAAgA0ECdEHApeMAaigCADYC3AIgAEEANgLYAiAAQQE6ANcCIAAgBDoA1gIgACACKQMINwOIAyAAQZADaiAGKQMANwMAIABBmANqIAUvAQA7AQAgACADOgCEBiAAQv////8PNwLsBSAAQgA3AtwDIABCgICAgMAANwLUAyAAQgQ3AswDIABCADcCxAMgAEKAgICAwAA3ArwDIABCATcCtAMgAEIANwKsAyAAQoCAgIDAADcCpAMgACABNgKgAyAAQQE6AJ0DIAAgBDoAnAMgACAHOgCbAyAAIAQ6AJoDIAJBMGokAAuhAwEHfwJAIARBAEwNACADIARqIQYCQCAEQQNNBEAgAUH/AXEhASADIQQDQCAE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AgBBE0YNAQsgACAHNgIcIAAgCDYCGCAAQgA3AwggAEEANgIAIAAgBa0gBq1CIIaENwMQDAMLIAEoAighAyABQSU2AiggASABKQNANwN4IAJBFGogAUE0aikCADcCACACQRxqIAFBPGooAgA2AgAgAiABKQIsNwIMIAIgAzYCCCACQQhqIgMQwwogAyABEOUFIAItABxBAkYEQCACKAIIIQEMAgsgAigCECEBIAIpAwgiCVANASAAIAIoAhQiAzYCJCAAIAE2AiAgACAJNwMYIAAgBzYCFCAAIAg2AhAgAEEANgIAIAAgBCADIAMgBEkbNgIsIAAgBCADIAMgBEsbNgIoIAAgBa0gBq1CIIaENwMIDAILIABBATYCACAAIAU2AgQMAQsgAEEBNgIAIAAgATYCBCAFrSAGrUIghoQQ8RoLIAJBIGokAAunAwEIfyAAIAEQkhogACgCECIGIAAoAhRB2ABsaiEIA0AgCCAGIgJHBEAgAkHYAGohBgJAAkACQAJAAkACQAJAIAIoAgAiA0EEa0EAIANBBWtBCEkbQQFrDggBAgMECAgFBgALIAIgARDzISACKAJEIgcgAigCSEEGdGohCQNAIAkgByIDRwRAIANBQGshByADKAIAQQdGBEAgAygCOEEMbCEEIAMoAjQhBQNAIAQEQCAFIAEQwCwgBEEMayEEIAVBDGohBQwBCwsgAy0AHEECRw0CIANBCGogARC9JQwCBSADIAEQviUMAgsACwsgAigCIEGAgICAeEYNByACQSBqIAEQkBoMBwsgAkEIaiABEPMhIAJBMGogARDHLAwGCyACQSBqIAEQxywMBQsgAkEIaiABEPMhIAJBPGogARCxJSACQTBqIAEQkhoMBAsgAkEkaiABELElIAJBLGogARCSGgwDCyACQQRqIAEQkBoMAgsgAigCCEEFRwRAIAJBCGogARDzIQsgAkE8aiABELElIAJBMGogARCSGgwBCwsgAEEwaiABELElC6cDAQh/IAAgARC0GiAAKAIQIgYgACgCFEHYAGxqIQgDQCAIIAYiAkcEQCACQdgAaiEGAkACQAJAAkACQAJAAkAgAigCACIDQQRrQQAgA0EFa0EISRtBAWsOCAECAwQICAUGAAsgAiABEJEiIAIoAkQiByACKAJIQQZ0aiEJA0AgCSAHIgNHBEAgA0FAayEHIAMoAgBBB0YEQCADKAI4QQxsIQQgAygCNCEFA0AgBARAIAUgARD9LCAEQQxrIQQgBUEMaiEFDAELCyADLQAcQQJHDQIgA0EIaiABEPQlDAIFIAMgARCDJgwCCwALCyACKAIgQYCAgIB4Rg0HIAJBIGogARCuGgwHCyACQQhqIAEQkSIgAkEwaiABEJItDAYLIAJBIGogARCSLQwFCyACQQhqIAEQkSIgAkE8aiABEIomIAJBMGogARC0GgwECyACQSRqIAEQiiYgAkEsaiABELQaDAMLIAJBBGogARCuGgwCCyACKAIIQQVHBEAgAkEIaiABEJEiCyACQTxqIAEQiiYgAkEwaiABELQaDAELCyAAQTBqIAEQiiYLpwMBCH8gACABELMaIAAoAhAiBiAAKAIUQdgAbGohCANAIAggBiICRwRAIAJB2ABqIQYCQAJAAkACQAJAAkACQCACKAIAIgNBBGtBACADQQVrQQhJG0EBaw4IAQIDBAgIBQYACyACIAEQkiIgAigCRCIHIAIoAkhBBnRqIQkDQCAJIAciA0cEQCADQUBrIQcgAygCAEEHRgRAIAMoAjhBDGwhBCADKAI0IQUDQCAEBEAgBSABEPssIARBDGshBCAFQQxqIQUMAQsLIAMtABxBAkcNAiADQQhqIAEQ9iUMAgUgAyABEIImDAILAAsLIAIoAiBBgICAgHhGDQcgAkEgaiABELEaDAcLIAJBCGogARCSIiACQTBqIAEQky0MBgsgAkEgaiABEJMtDAULIAJBCGogARCSIiACQTxqIAEQiSYgAkEwaiABELMaDAQLIAJBJGogARCJJiACQSxqIAEQsxoMAwsgAkEEaiABELEaDAILIAIoAghBBUcEQCACQQhqIAEQkiILIAJBPGogARCJJiACQTBqIAEQsxoMAQsLIABBMGogARCJJguQAwELfyMAQeABayICJAAgAkEIaiABKAIIIgNBMBDmFCABKAIAIQQgAigCCCEIIAIoAgwhCSABQQA2AgAgASgCBCEGIAFBCDYCBCABQQA2AgggAkEANgIYIAIgCTYCFCACIAg2AhAgAiAGIANBMGwiCmoiCDYCKCACIAQ2AiQgAiAGNgIcIAJB2ABqQQRyIQtBACEEIAYhAwNAAkAgAiAFIApHBH8gAygCACEHIAJBLGogA0EEakEsEPwGGiAHQRNHDQEg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AUEnRnINBCABQcQARiABQdgARnINBCABQeEARiABQYIBRnINBAsPCyAAKAIEIAAoAggQ4CkPCyAAKAIIIAAoAgwQ1ikPCyAAKAIMIgAQhCMgAEEEQQQQ0REPCyAAQQhqEMMZDwsgACgCDCAAKAIQENYpDwsgAEEIahDDGSAAQRBqEMMZC6QDAQR/IwBBIGsiAyQAAkAgAi0ADCIEQQFGBEAgACABKQIANwIAIABBCGogAUEIaikCADcCAAwBCwJAAkACQAJAAkACQAJAAkACQCABLQAMIgVBAWsOAgACAQsgAyACEO0gIAAgAykCADcCACADQQIgAy0ADGs6AAwgAEEIaiADQQhqKQIANwIAIAEoAgQhBAwHCyAERQ0BDAILIARFDQELIAEoAgQiBCABKAIIIAIoAgQiBiACKAIIIgIQ8ClB/wFxDgICAwELIANBCGogAUEIaigCADYCACADIAEpAgA3AwAgA0EUaiIBIAMgAigCBCACKAIIEPIIIAAgBSABEOYSDAQLIANBCGogAUEIaigCADYCACADIAEpAgA3AwAgA0EUaiIBIAYgAiADEKcEIABBAiAFayABEOYSDAMLIABBCGpBmILCACkCADcCACAAQZCCwgApAgA3AgAMAQsgA0EIaiABQQhqKAIANgIAIAMgASkCADcDACADQRRqIgEgAyAGIAIQ6xsgACAFIAEQ5hIMAQsgASgCACAEENkpCyADQSBqJAALiwMBCH8jAEEwayIDJAACQAJAIAEoAgAiCi0AFCIEQQJGIARBAXFyRQRAIANBCGogAi0AGEECdEGg3uMAaigCAC0AABDtHCADIAMoAgwiByADKAIIIgVrQQF2IgZBAUECEPkUIANBADYCLCADIAMpAwA3AiQgA0EkaiAGEP8eIAMoAiwhBCADIAUgB0cEfyAEIAZqIAMoAiggBEEBdGohBANAIARBAWogBS0AACIIIAVBAWotAAAiCSAIIAlLGzoAACAEIAggCSAIIAlJGzoAACAFQQJqIQUgBEECaiEEIAZBAWsiBg0ACwUgBAs2AiwgA0EUaiADQSRqEMUTIAItABkNAQwCC0GFzsQAQSlBsM7EABDuFwALIANBFGoQmggLAkACQCAKLQAXBEAgAygCGCADKAIcEMwfRQ0BCyAAIAMpAhQ3AgQgAEGAgICAeDYCACAAQQxqIANB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AgALIANBCGoQ9CoMAgsgA0EIahDzKgwBCyADQQhqQcTExwBBgwYQ3goLIANBOGogASgCBCABKAIIIAIgA0EIahD/FiADQTBqIgEgA0HEAGopAgA3AwAgAyADKQI8NwMoIAMoAjgiBEGAgICAeEYEQCADQSBqIAEpAwA3AwAgAyADKQMoNwMYIAItABlFDQIgA0EYahCyCAwCCyAAIAMpAkw3AhQgAEEkaiADQdwAaigCADYCACAAQRxqIANB1ABqKQIANwIAIABBDGogASkDADcCACAAIAMpAyg3AgQgACAENgIADAILQczNxABBKEH0zcQAEO4XAAsgACADKQMYNwIEIABBgICAgHg2AgAgAEEMaiADQSBqKQMANwIACyADQeAAaiQAC9sCAgN/AX4jAEEgayICJAACQAJAAkACQAJAIAEoAgBBAWsOAwECAwALIABBCGogAUEIahCxIyAAQQA2AgAMAwsgASkDECEFIAJBBGogAUEEahC0DCABLQAcIQMgAUEYahCSHCEBIAJBHGoiBCADOgAAIABBATYCACAAIAIpAgQ3AgQgAiAFNwIQIABBDGogAkEMaikCADcCACACIAE2AhggAEEUaiACQRRqKQIANwIAIABBHGogBCgCADYCAAwCCyAAQQRqIAFBBGoQtBkgAEECNgIADAELIAEpAxAhBSACQQRqIAFBBGoQrgcgAS0AHCEDIAFBGGoQkhwhASACQRxqIgQgAzoAACAAQQM2AgAgACACKQIENwIEIAIgBTcCECAAQQxqIAJBDGopAgA3AgAgAiABNgIYIABBFGogAkEUaikCADcCACAAQRxqIAQoAgA2AgALIAJBIGokAAvCAgEEfyMAQTBrIgIkACABKAIIIQMgASgCBCEBIAIgADYCECACIAE2AgggAiABIANBMGxqNgIMAn8gAkEIahCJEiIBRQRAQQAhAUEEDAELIAJBBEEEQQQQ+RQgAigCACEDIAIoAgQiBCABNgIAIAJBATYCHCACIAQ2AhggAiADNgIUIAJBKGogAkEQaigCADYCACACIAIpAgg3AyBBBCEDQQEhAQNAIAJBIGoQiRIiBQRAIAIoAhQgAUYEQCACQRRqIAFBAUEEQQQQwBcgAigCGCEECyADIARqIAU2AgAgAiABQQFqIgE2AhwgA0EEaiEDDAELCyACKAIUIQQgAigCGAshAyABQQJ0IQVBACEBA0AgASAFRgRAIAQgA0EEQQQQyyIgAkEwaiQABSABIANqKAIAIAAQyAMgAUEEaiEBDAELCwvwAgECfyMAQUBqIgMkAAJAAkACQAJAAkACQAJAIAIoAgBBAWtBAk8EQCADIAItABg6ACQgAyACKQIQNwIcIAMgAikCCDcCFCADQQE2AgwgAC0AnA1BAUYNBCAAKQMAQgJSBEAgASgCyARBAkYNBiADQShqIgQgAEGIBWogAUGYA2ogA0EMahD2CSADIAQQ+hdBACEEIAMoAgBBAWsOAgMCBAsgA0EBNgIsIANBgIfDADYCKCADQgA3AjQgAyADNgIwIANBKGpBiIfDABC6HQALIAAtAJwNQQFGDQUgACkDAEICUQ0AIAEoAsgEQQJGDQYgA0EMaiIEIAAgAUHYAWogAhD1CSADQShqIAQQ+hcgAygCKCIEQQJHDQILIAAgASACEKwFIQQMAQtBASEECyADQUBrJAAgBEEBcQ8LQd3r4ABBKEHIjMMAEO4XAAtB6IvDABDaKQALQd3r4ABBKEGojMMAEO4XAAtByIvDABDaKQAL3gICAn8BfiMAQTBrIgIkAAJ/AkACQAJAIAApAwAiBEIKiKciAARAIAJBATYCHCACQfz24AA2AhggAkIBNwIkIAJBpwE2AhAgAiAANgIUIAIgAkEMajYCICACIAJBFGo2AgxBASABKAIUIgAgASgCGCIDIAJBGGoQrSQNBBogBEL/B4NQRQ0BQQAMBAsgBEL/B4NQDQIgASgCGCEDIAEoAhQhAAwBCyACQQA2AiggAkEBNgIcIAJBjJrDADYCGCACQgQ3AiBBASAAIAMgAkEYahCtJA0CGgsgAkEBNgIcIAJB/PbgADYCGCACQgE3AiQgAkGoATYCECACIASnQf8HcTYCFCACIAJBDGo2AiAgAiACQRRqNgIMIAAgAyACQRhqEK0kDAELIAJBADYCKCACQQE2AhwgAkGYmsMANgIYIAJCBDcCICABKAIUIAEoAhggAkEYahCtJAsgAkEwaiQAC84CAQJ/IwBB4ABrIgUkACABQShqIQYgAkEBcUUEQCAGELogGgsgBUEQaiABIAIgAyAEQQFBABBxIAUoAhAhAgJAAkAgBS0AJCIDQQNHBEAgBUHUAGogBUEcaikCADcCACAFQd8AaiAFQSdqLQAAOgAAIAUgBSkCFDcCTCAFIAUvACU7AF0gBSADOgBcIAUgAjYCSCAFQTBqIAVByABqIAUoAigQ5REgBS0AMEG7AUYEQEEAIQQgBSgCNCECDAILIAVBCGogBhCAFEEBIQQgBSgCCCAFKAIMIAVBMGoQ/RQhAiAGEM0NIgNFDQEgAygCAEEkRw0BIAEgASkD4AI3A5gDIAEoAsgCIAFBJTYCyAJBJEcNAiABIAEoAswCEP8LDAELQQEhBAsgACACNgIEIAAgBDYCACAFQeAAaiQADwtB3evgAEEoQbT83wAQ7hcAC5sDAwR/B34CfEQAAAAAAAAAQCENRAAAAAAAAABARAAAAAAAAPA/An4CQAJAAkACQCAAKAIIIgEOAgMBAAsgAUECdCECIAAoAgQiA0EEayEEIAMgARCNHSEHA0ACQAJAIAIEQELAACAIfSIKIAdCAX1CH4MiC0IBfCIJIAkgClYbIQUgAiAEaiEDIAhCwABSDQEMAgsgAUUNBQwECyAGIAWGIAM1AgAgCSAFfYiEIQYLIAogC1gEQCAGIAM1AgAgBSAJfYZCAFKthCEGCyACQQRrIQIgByAFfSEHIAUgCHwhCAwACwALIAAoAgRBAUEAQbSIwgAQrx81AgAhBgsgAa1CBYYgACgCBCABQQJ0akEEaygCAGetfQwBC0IACyAGeXxCQHwiBaciAkEfdSIBIAJzIAFrIgFBAXEbIQwgAUECTwRAA0AgDCANIA2iIg2iIAwgAUECcRshDCABQQNLIAFBAXYhAQ0ACwtEAAAAAAAA8H9EAAAAAAAA8D8gDKMgDCACQQBIGyAGuqIgBUKACFYbIgwgDJogAC0ADBsL1AICBH8BfgJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCAEEBaw4JAQIDCgQFCgYHAAsgACgCDEHIAGwhAyAAKAIIIQIDQCADBEACQAJ/IAIpAwBCAlYEQEEQIQRBIAwBCyABIAIpAyAgAkEwaigCABCHGyACKQMAIgZCAlEgBqdBAXFyDQFBCCEEQRgLIQUgASACIARqKQMAIAIgBWooAgAQhxsLIAJByABqIQIgA0HIAGshAwwBCwsMCAsgAEEIaiABELYJDwsgACgCGA0FDAYLAkACQCAAKAIIQQFrDgIBBgALIABBEGogARDBJw8LIABBEGogARDAJw8LIABBEGogARDjIw8LIAEgACgCBCIAKQMoIABBOGooAgAQhxsPCyABIAApAxAgACgCIBCHGw8LIABBCGogARDVBAsPCyAAQRxqIAEQ4yMPCyAAQQRqIAEQzCwLyQIBAn8jAEHgAGsiBSQAIAFBKGohBiACQQFxRQRAIAYQ1SAaCyAFQRBqIAEgAiADIARBAUEAEHAgBSgCECECAkACQCAFLQAkIgNBA0cEQCAFQdQAaiAFQRxqKQIANwIAIAVB3wBqIAVBJ2otAAA6AAAgBSAFKQIUNwJMIAUgBS8AJTsAXSAFIAM6AFwgBSACNgJIIAVBMGogBUHIAGogBSgCKBDlESAFLQAwQbsBRgRAQQAhBCAFKAI0IQIMAgsgBUEIaiAGELMUQQEhBCAFKAIIIAUoAgwgBUEwahD9FCECIAYQ5w0iA0UNASADKAIAQSRHDQEgASABKQNANwN4IAEoAiggAUElNgIoQSRHDQIgASABKAIsEIYMDAELQQEhBAsgACACNgIEIAAgBDYCACAFQeAAaiQADwtB3evgAEEoQbT83wAQ7hcAC7sCAQt/IABB0ABB+AAgACgClAEgACgCbEkgACgCkAEiAyAAKAJoIgRJIAMgBEYbIgQbaiIGIAAgACgCRCAAKAIcSSAAKAJAIgMgACgCGCICSSACIANGGyICQQFzQShsaiIDIABB+ABB0AAgBBtqIgQgBCgCHCAAIAJBKGxqIgAoAhxJIAQoAhgiAiAAKAIYIgVJIAIgBUYbIgcbIAYoAhwgAygCHEkgBigCGCICIAMoAhgiBUkgAiAFRhsiCBsiAigCHCELIAAgBCADIAgbIAcbIgUoAhwhDCACKAIYIQkgBSgCGCEKIAEgBCAAIAcbQSgQ/AYiAEEoaiACIAUgCyAMSSAJIApJIAkgCkYbIgEbQSgQ/AYaIABB0ABqIAUgAiABG0EoEPwGGiAAQfgAaiADIAYgCBtBKBD8BhoLlgMBCH8jAEEgayIGJAAgACgCCCEEIABBADYCCCAEQQxsIQcgACgCBCEBIAQgACgCDCAAKAIUIgNrSwRAIABBDGogAyAEQQRBDBCkFyAAKAIUIQMLIAEgB2ohBSAAKAIQIAZBADYCHCAGIAA2AhQgAUEMaiECIANBDGxqIQggBiAENgIYA0ACQCAHRQRAIAUhAgwBCyABKAIAIgRBgICAgHhGDQAgCEEEaiABKQIENwIAIAggBDYCACAIQQxqIQggB0EMayEHIAJBDGohAiADQQFqIQMgAUEMaiEBDAELCyAAIAM2AhQgBkKEgICAwAA3AgwgBSACa0EMbiEBAkAgAiAFRg0AA0AgAUUNASACKAIAIAJBBGooAgAQ4CkgAUEBayEBIAJBDGohAgwACwALIAZBDGoiAigCECIFBEAgAigCDCIEIAIoAggiASgCCCIDRwRAIAEoAgQiByADQQxsaiAHIARBDGxqIAVBDGwQ0C0aIAIoAhAhBQsgASADIAVqNgIICyAAEMELGiAAEMELGiAGQSBqJAALlAIBBX4gACAAKQMYIgFCEIkgASAAKQMIfCIBhSICQhWJIAIgACkDECIEIAApAwB8IgVCIIl8IgKFIgNCEIkgAyABIARCDYkgBYUiBHwiAUIgiXwiBYUiA0IViSADIAIgASAEQhGJhSIBfCICQiCJfCIEhSIDQhCJIAMgBSABQg2JIAKFIgF8IgJCIIl8IgWFIgNCFYkgAyAEIAFCEYkgAoUiAXwiAkIgiXwiBIUiA0IQiSADIAUgAUINiSAChSIBfCICQiCJfCIFhSIDIAQgAUIRiSAChSIBfCICQiCJfCIENwMAIAAgA0IViSAEhTcDGCAAIAFCDYkgAoUiAUIRiSABIAV8IgGFNwMQIAAgAUIgiTcDCAu7AgIFfwN+IwBB4ABrIgMkACADIAI2AgwgA0HCADoASCADQShqIAEgA0HIAGoQsw5BCCEBIANBGGoiBCADQThqIgYpAwA3AwAgA0EgaiIFIANBQGsiBykDADcDACADIAMpAzA3AxACQCADKAIoRQRAIANB2ABqIAUpAwAiCDcDACADQdAAaiAEKQMAIgk3AwAgAyADKQMQIgo3A0ggA0E8aiAINwIAIANBNGogCTcCACADIAo3AiwgAEEcaiAHKAIANgIAIABBFGogBikCADcCACAAQQxqIANBMGopAgA3AgAgACADKQIoNwIEQQAhASAAQQA6ACQgACACNgIgDAELIAAgAykDEDcDCCAAQRhqIAUpAwA3AwAgAEEQaiAEKQMANwMAIANBDGoQ1hILIAAgATYCACADQeAAaiQAC7wDAQV/IAAoAgQhAiAAKAIAIQEgAEKIgICAgAE3AgAgAiABa0E4biEDAkAgASACRg0AIAFBEGohAQNAIANFDQECQCABQRBrKAIAIgJBCUcEQAJAAkACQAJAAkACQAJAAkACQCACDggBAgMEBQYHCAALIAEQwxkMCQsgAUEMaxCBIyABEJolIAFBDGoQ/CAMCAsgAUEIaxDeCQwHCyABQQxrEIIjIAFBCGoiAigCAARAIAIQmiULIAFBDGoQ/CAMBgsCQAJAAkAgAUEIaygCAA4CAQIACyABQQRrKAIAENUdDAcLIAEQ8CgMBgsgARCcKgwFCyABQQxrEOUCDAQLIAFBDGsQmiUgARD8IAwDCyABQQxrKAIAIgJBKGoQwxkCQCACKQMAUARAIAJBCGoQ9xwMAQsgAhDvKAsgAkHIAEEIENERDAILIAFBDGsQ5QIMAQsgAUEIaxDTBQsgA0EBayEDIAFBOGohAQwACwALIAAoAhAiAQRAIAAoAgwiBCAAKAIIIgIoAggiA0cEQCACKAIEIgUgA0E4bGogBSAEQThsaiABQThsENAtGiAAKAIQIQELIAIgASADajYCCAsL1AIBA38jAEEwayICJAACQAJAIAEoAsABIAEoAsQBEPgcIgNB3ABGDQACQCADQf8ATQRAIANBwPXYAGotAAANAgwBCyADQQN2QT9xQcD22AAgA0EJdkGw+OAAaiADQf/HDEsbLQAAQQV0akGAiuEAai0AACADQQdxdkEBcQ0BCyABKALQASEEIAFBwAFqELAVIAJBIToAGCACIAM2AhwgAiAEIAQgAkEYahDbISACKAIEIQEgAigCACIDQSdHBEAgACACKQMINwMIIABBEGogAkEQaikDADcDACAAIAE2AgQgACADNgIADAILIABBJjYCACAAIAE2AgQMAQsgAkEYaiABEOIDIAIoAhhBJUcEQCAAIAIpAxg3AwAgAEEQaiACQShqKQMANwMAIABBCGogAkEgaikDADcDAAwBCyAAIAIoAhw2AgQgAEEmNgIACyACQTBqJAALzQICBX8CfiMAQTBrIgIkACABKAIAIgNBCGohBSADIAEoAgQiBGpBAWohBiADKQMAQn+FQoCBgoSIkKDAgH+DIQggASgCDCEBAn8gBEUEQEEADAELIAJBCCAEQQFqENUOIAI1AgQgAyACKAIIa61CIIaEIQcgAigCAAshBCAAIAFBAWpBAXYgASAAKAIMGyAAQRBqEPQhIAIgBzcCJCACIAQ2AiAgAiABNgIYIAIgAzYCECACIAY2AgwgAiAFNgIIIAIgCDcDAAJAA0AgAUUNASACEMcPIQMgAiACKAIYQQFrIgE2AhggAwRAIAAgA0EIaykDABC+CQwBCwsgAUUNAANAIAIQxw8hACACIAIoAhhBAWsiATYCGCAARQ0BIABBCGspAwAQ8RogAQ0ACwsgAigCICIABEAgAigCKCAAIAIoAiQQsiQLIAJBMGokAAvBAgEEfyMAQSBrIgUkACAEIAIgBGsiByAEIAdLGyEIQQEhBgJAAkAgBEEBdCACTw0AAkAgAiAETwRAIAMgB0sNASADIARJDQIgBSADIARrIAEgBGogA0Gk/sEAEIodIAUoAgQgBEcNAiAFKAIAIQIDQAJAIARBA00EQCAEQQFLBEAgAi8AACABLwAARw0GIARBAmshBCACQQJqIQIgAUECaiEBCyAEDQFBACEGDAYLIAIoAAAgASgAAEcNBCAEQQRrIQQgAUEEaiEBIAJBBGohAgwBCwsgCCADIAItAAAgAS0AAEciBhshAwwDCyAFQQA2AhggBUEBNgIMIAVBxN/gADYCCCAFQgQ3AhAgBUEIakGM/cEAELodAAsgAyAHQZz9wQAQrxAACyAIIQMLIAAgAzYCBCAAIAY2AgAgBUEgaiQAC8wCAQh/IwBB0ABrIgMkACACQQFqIQggASgCACEJIANBFGohBiABKAIIIQIgASgCBCIEQRxqIQcgBEEYaiEKAkACQAJAA0AgBygCACIBIAhNBEAgAUUNAiAEQRhqKAIAIAEgAUEBa0HIu8MAELwfIAIQnBMgAEEqNgIADAQLIAcgAUEBayIBNgIAIAooAgAgAUEEdGoiASgCACIFQYCAgIB4Rg0CIAYgASkCBDcCACAGQQhqIAFBDGooAgA2AgAgAyAFNgIQIANBEGoiASACEJwTIANBCGogA0EYaiIFKAIANgIAIAMgAykCEDcDACABIAkgBCADEOUEIAMoAhQhAiADKAIQIgFBKkYNAAsgAEEIaiAFQTgQ/AYaIAAgAjYCBCAAIAE2AgAMAgtB3LjDAEEPQbi7wwAQtRIAC0GsusMAENopAAsgA0HQAGokAAu1AgEGfyMAQTBrIgMkAEEKIQICQCAAQZDOAEkEQCAAIQQMAQsDQCADQQhqIAJqIgVBBGsgACAAQZDOAG4iBEGQzgBsayIGQf//A3FB5ABuIgdBAXRB3IrYAGovAAA7AAAgBUECayAGIAdB5ABsa0H//wNxQQF0QdyK2ABqLwAAOwAAIAJBBGshAiAAQf/B1y9LIAQhAA0ACwsCQCAEQeMATQRAIAQhAAwBCyACQQJrIgIgA0EIamogBCAEQeQAbiIAQeQAbGtBAXRB3IrYAGovAAA7AAALAkAgAEEKTwRAIAJBAmsiAiADQQhqaiAAQQF0QdyK2ABqLwAAOwAADAELIAJBAWsiAiADQQhqaiAAQTByOgAACyADIAEgA0EIaiACakEKIAJrEO8kIAMQ4BggA0EwaiQAC+gCAQF/IwBBEGsiAiQAAn8CQAJAAkACQAJAAkACQAJAAkAgACgCACIAKAIAQQFrDggBAgMEBQYHCAALIAIgAEEEajYCDCABQZ+Q2gBBBiACQQxqQdkDEMgKDAgLIAIgAEEIajYCDCABQb3w2ABBCiACQQxqQdoDEMgKDAcLIAIgAEEEajYCDCABQbLx2ABBCyACQQxqQdsDEMgKDAYLIAIgAEEIajYCDCABQb3x2ABBESACQQxqQdwDEMgKDAULIAIgAEEEajYCDCABQc7x2ABBESACQQxqQd0DEMgKDAQLIAIgAEEEajYCDCABQajw2ABBCSACQQxqQd4DEMgKDAMLIAIgAEEEajYCDCABQd/x2ABBDiACQQxqQd8DEMgKDAILIAIgAEEEajYCDCABQeCc2QBBEiACQQxqQeADEMgKDAELIAIgAEEIajYCDCABQe3x2ABBESACQQxqQeEDEMgKCyACQRBqJAALzAIBCH8jAEEgayICJAAgAkEUaiABKAIEIAEoAghBEBCVASACKAIcIQMCQCABLQAMBEAgAigCGCEEDAELIAIoAhQgA0YEQCACQRRqEPEXCyACKAIYIgQgA2pBLToAACACIANBAWoiAzYCHAsgAkEIaiADQQF2IgEgBCABQfjz4AAQnx4gAigCDCEFIAIoAgghByACIAEgAyAEaiABayABQYj04AAQnx4gAUEBayEBQQAhAyACKAIEIQQgAigCACEIAkACQANAIAFBf0YNASADIAVGDQIgASAESQRAIAMgB2oiBi0AACEJIAYgASAIaiIGLQAAOgAAIAYgCToAACABQQFrIQEgA0EBaiEDDAELCyABIARBqPTgABCtEAALIAAgAikCFDcCACAAQQhqIAJBHGooAgA2AgAgAkEgaiQADwsgBSAFQZj04AAQrRAAC9ACAgN/AX4jAEEgayIDJAAgASgCDCEFIANBEGogAiABKAIIIgRBABDTAQJAAkACQAJAAkAgAy0AEEEERwRAIAMpAxAiBkL/AYNCBFINAQsCQCAERQ0AIANBEGogAiAEEMscIAMtABBBBEYNACADKQMQIgZC/wGDQgRSDQILIANBADYCECADQQhqIAIgA0EQakG/uuAAQQEQrBMgAy0ACEEERwRAIAMpAwgiBkL/AYNCBFINAwsgA0EQaiACIAQgAUEAELEFIAMtABBBBEcEQCADKQMQIgZC/wGDQgRSDQQLAkACQCAFRQ0AIANBEGogAiAFEMscIAMtABBBBEYNACADKQMQIgZC/wGDQgRSDQELIABBBDoAAAwFCyAAIAY3AgAMBAsgACAGNwIADAMLIAAgBjcCAAwCCyAAIAY3AgAMAQsgACAGNwIACyADQSBqJAALpwICBn8BfiMAQSBrIgMkACABKAIcIgUgAUEMaygCAEkgASgCGCIEIAFBEGsoAgAiAkkgAiAERhtBAUYEQCADQRhqIAFBEGopAwA3AwAgA0EQaiABQQhqKQMANwMAIAMgASkDADcDCCABQThrIQIgASkDICEIAn8CQANAIAIiAUE4aiABQRBqIgYiAkEoEPwGGiAAIAJGDQEgAUEoayECIAUgAUEEaigCAEkgBCABKAIAIgdJIAQgB0YbDQALIAYhAiABQThqDAELIAFBEGohAiABQThqCyEBIAIgAykDCDcDACACQRBqIANBGGopAwA3AwAgAkEIaiADQRBqKQMANwMAIAFBCGsgCDcDACABQQxrIAU2AgAgAUEQayAENgIACyADQSBqJAAL2QIBCH8jAEEgayIEJAACQCADQQFHDQBBACEDIAAoAgAtAABBAUYNACAAKAIEKAIMIgZFDQAgACgCCCIFIAFB/wFxIgFqQcgAaiEJIAVBCGohByAFQQRqIQggBUEgaiEKIAVBHGohCwNAAkACfyAIKAIAIAcoAgAgBkHYgMQAELAfKAIEIgMEQCALKAIAIAooAgAgAyAJLQAAakHogMQAEK8fKAIADAELIAQgBSAGEJwgIAQgBCkDADcCDANAIARBFmogBEEMahCBDyAELQAWRQ0CIAQtABciAyABSQ0ACyABIANHDQEgBCgAGAsiA0EBRw0CCyAI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IAEgBEEYajYCAAJAIAEoAhAiAyABKAIURg0AIAEgA0EKajYCECADLQAAIgVBAkYNACACQShqIANBCWotAAA6AAAgAiADKQABNwMgDAILIAEgASgCDCIFNgIUIAEgASgCCCIDNgIQIAMgBUYNACABIANBCmo2AhAgAkEoaiADQQlqLQAAOgAAIAIgAykAATcDICADLQAAIgVBAkcNAQsgAEGBgICAeDYCAAwBCyACQRhqIAJBKGotAAA6AAAgAiACKQMgIgY3AxAgAkEsaiACKAAXNgAAIAIgBToAJCACIAQ2AiAgAiAGNwAlIAJBCGogBBDvHyACQTRqIgEgAigCCCACKAIMEMAhIAAgASAEKAIMIAQoAhAgAkEkahC1BQsgAkFAayQAC/NFAQd/IwBBMGsiBSQAAkACQAJAAkACQAJAIAEtAAhBuAFGBEAgASgCECEDIAEoAgwhBCABKAIcIQYgASgCGCEHIAUgASgCFCIIKAIAIAIQvQcgACAFIAQgAyAHIAYQoQ4iAikCADcCACAAQQhqIAJBCGooAgA2AgAgCBDMKyABLQAIQbgBRw0BDAULIAEoAgQhByABKAIAIQggBSABEKUcIAVBGGohAyAFIQEjAEHQAGsiBCQAAkACQAJ/AkACQAJAAkACQAJAA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAEtAABBAWsOugEBAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzDBATEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AAYEBggGDAYQBhQGGAYcBiAGJAYoBiwGMAY0BjgGPAZABkQGSAZMBlAGVAZYBlwGYAZkBmgGbAZwBnQGeAZ8BoAGhAaIBowGkAaUBpgGnAagBqQGqAasBrAGtAa4BrwGwAbEBsgGzAbQBtQG2AbcBuAG6AQALIANBDjYCCCADQeCe2QA2AgQgA0GAgICAeDYCAAzBAQsgA0EaNgIIIANB1Z/ZADYCBCADQYCAgIB4NgIADMABCyADQSA2AgggA0Hvn9kANgIEIANBgICAgHg2AgAMvwELIANBLzYCCCADQY+g2QA2AgQgA0GAgICAeDYCAAy+AQsgA0HTADYCCCADQb6g2QA2AgQgA0GAgICAeDYCAAy9AQsgA0EpNgIIIANBkaHZADYCBCADQYCAgIB4NgIADLwBCyADQSY2AgggA0G6odkANgIEIANBgICAgHg2AgAMuwELIANBKjYCCCADQeCh2QA2AgQgA0GAgICAeDYCAAy6AQsgA0ERNgIIIANBiqLZADYCBCADQYCAgIB4NgIADLkBCyADQRc2AgggA0GbotkANgIEIANBgICAgHg2AgAMuAELIANBLDYCCCADQbKi2QA2AgQgA0GAgICAeDYCAAy3AQsgA0HiADYCCCADQd6i2QA2AgQgA0GAgICAeDYCAAy2AQsgA0EaNgIIIANBwKPZADYCBCADQYCAgIB4NgIADLUBCyADQSU2AgggA0Hao9kANgIEIANBgICAgHg2AgAMtAELIANBHDYCCCADQf+j2QA2AgQgA0GAgICAeDYCAAyzAQsgA0EnNgIIIANBm6TZADYCBCADQYCAgIB4NgIADLIBCyADQSc2AgggA0HCpNkANgIEIANBgICAgHg2AgAMsQELIANBJzYCCCADQemk2QA2AgQgA0GAgICAeDYCAAywAQsgA0EwNgIIIANBkKXZADYCBCADQYCAgIB4NgIADK8BCyADQSk2AgggA0HApdkANgIEIANBgICAgHg2AgAMrgELIANBNTYCCCADQeml2QA2AgQgA0GAgICAeDYCAAytAQsgA0EzNgIIIANBnqbZADYCBCADQYCAgIB4NgIADKwBCyADQR82AgggA0HRptkANgIEIANBgICAgHg2AgAMqwELIAEtAAFBAmsiAUEHdCABQf4BcUEBdnJB/wFxDgikAaMBowGlAaYBowGjAacBowELIANBKDYCCCADQcin2QA2AgQgA0GAgICAeDYCAAypAQsgA0ElNgIIIANB8KfZADYCBCADQYCAgIB4NgIADKgBCyADQRo2AgggA0GVqNkANgIEIANBgICAgHg2AgAMpwELIANBHDYCCCADQa+o2QA2AgQgA0GAgICAeDYCAAymAQsgA0EXNgIIIANBy6jZADYCBCADQYCAgIB4NgIADKUBCyAEIAFBCGo2AiAgBEEBNgI8IARBkKnZADYCOCAEQgE3AkQgBEHhBDYCMCAEIARBLGo2AkAgBCAEQSBqNgIsIARBEGogBEE4ahCJFSADQQhqIARBGGooAgA2AgAgAyAEKQIQNwIADKQBCyADQRs2AgggA0GYqdkANgIEIANBgICAgHg2AgAMowELIANBFTYCCCADQbOp2QA2AgQgA0GAgICAeDYCAAyiAQsgA0EfNgIIIANByKnZADYCBCADQYCAgIB4NgIADKEBCyAEIAFBBGo2AiAgBEEBNgI8IARB/KnZADYCOCAEQgE3AkQgBEHcBDYCMCAEIARBLGo2AkAgBCAEQSBqNgIsIARBEGogBEE4ahCJFSADQQhqIARBGGooAgA2AgAgAyAEKQIQNwIADKABCyADQRU2AgggA0GEqtkANgIEIANBgICAgHg2AgAMnwELIANBFjYCCCADQZmq2QA2AgQgA0GAgICAeDYCAAyeAQsgBCABQQRqNgIgIARBATYCPCAEQdiq2QA2AjggBEIBNwJEIARBxwA2AjAgBCAEQSxqNgJAIAQgBEEgajYCLCAEQRBqIARBOGoQiRUgA0EIaiAEQRhqKAIANgIAIAMgBCkCEDcCAAydAQsgA0EmNgIIIANB4KrZADYCBCADQYCAgIB4NgIADJwBCyADQS02AgggA0GGq9kANgIEIANBgICAgHg2AgAMmwELIAQgAUEIajYCICAEQQI2AjwgBEHkq9kANgI4IARCATcCRCAEQeEENgIwIAQgBEEsajYCQCAEIARBIGo2AiwgBEEQaiAEQThqEIkVIANBCGogBEEYaigCADYCACADIAQpAhA3AgAMmgELIANBOzYCCCADQfSr2QA2AgQgA0GAgICAeDYCAAyZAQsgA0HMADYCCCADQa+s2QA2AgQgA0GAgICAeDYCAAyYAQsgA0E6NgIIIANB+6zZADYCBCADQYCAgIB4NgIADJcBCyADQcoANgIIIANBta3ZADYCBCADQYCAgIB4NgIADJYBCyADQTE2AgggA0H/rdkANgIEIANBgICAgHg2AgAMlQELIANBFDYCCCADQbCu2QA2AgQgA0GAgICAeDYCAAyUAQsgA0EfNgIIIANBxK7ZADYCBCADQYCAgIB4NgIADJMBCyADQTI2AgggA0HjrtkANgIEIANBgICAgHg2AgAMkgELIAQgAUEMajYCDCAEIAFBBGo2AiAgBEECNgI8IARBtK/ZADYCOCAEQgI3AkQgBEHHADYCHCAEQQg2AhQgBCAEQRBqNgJAIAQgBEEgajYCGCAEIARBDGo2AhAgBEEsaiAEQThqEIkVIANBCGogBEE0aigCADYCACADIAQpAiw3AgAMkQELIANBHjYCCCADQYiw2QA2AgQgA0GAgICAeDYCAAyQAQsgA0ElNgIIIANBprDZADYCBCADQYCAgIB4NgIADI8BCyAEIAFBBGo2AgwgBCABQQhqNgIgIARBAzYCPCAEQeCw2QA2AjggBEICNwJEIARBCDYCHCAEQbUCNgIUIAQgBEEQajYCQCAEIARBIGo2AhggBCAEQQxqNgIQIARBLGogBEE4ahCJFSADQQhqIARBNGooAgA2AgAgAyAEKQIsNwIADI4BCyADQRo2AgggA0H4sNkANgIEIANBgICAgHg2AgAMjQELIANB1QA2AgggA0GSsdkANgIEIANBgICAgHg2AgAMjAELIANBMjYCCCADQeex2QA2AgQgA0GAgICAeDYCAAyLAQsgA0HSADYCCCADQZmy2QA2AgQgA0GAgICAeDYCAAyKAQsgA0EsNgIIIANB67LZADYCBCADQYCAgIB4NgIADIkBCyADQTM2AgggA0GXs9kANgIEIANBgICAgHg2AgAMiAELIANBIjYCCCADQcqz2QA2AgQgA0GAgICAeDYCAAyHAQsgA0E3NgIIIANB7LPZADYCBCADQYCAgIB4NgIADIYBCyADQSg2AgggA0GjtNkANgIEIANBgICAgHg2AgAMhQELIANBDTYCCCADQcu02QA2AgQgA0GAgICAeDYCAAyEAQsgA0ERNgIIIANB2LTZADYCBCADQYCAgIB4NgIADIMBCyADQRU2AgggA0HptNkANgIEIANBgICAgHg2AgAMggELIANBGTYCCCADQf602QA2AgQgA0GAgICAeDYCAAyBAQsgA0EONgIIIANBl7XZADYCBCADQYCAgIB4NgIADIABCyADQRo2AgggA0GltdkANgIEIANBgICAgHg2AgAMfwsgBCABQQhqNgIgIARBAjYCPCAEQdy12QA2AjggBEIBNwJEIARB4QQ2AjAgBCAEQSxqNgJAIAQgBEEgajYCLCAEQRBqIARBOGoQiRUgA0EIaiAEQRhqKAIANgIAIAMgBCkCEDcCAAx+CyADQSU2AgggA0HstdkANgIEIANBgICAgHg2AgAMfQsgA0EtNgIIIANBkbbZADYCBCADQYCAgIB4NgIADHwLIANBPDYCCCADQb622QA2AgQgA0GAgICAeDYCAAx7CyADQTQ2AgggA0H6ttkANgIEIANBgICAgHg2AgAMegsgA0ErNgIIIANBrrfZADYCBCADQYCAgIB4NgIADHkLIANBLTYCCCADQdm32QA2AgQgA0GAgICAeDYCAAx4CyADQSQ2AgggA0GGuNkANgIEIANBgICAgHg2AgAMdwsgA0EdNgIIIANBqrjZADYCBCADQYCAgIB4NgIADHYLIANBKDYCCCADQce42QA2AgQgA0GAgICAeDYCAAx1CyADQS42AgggA0HvuNkANgIEIANBgICAgHg2AgAMdAsgA0EqNgIIIANBnbnZADYCBCADQYCAgIB4NgIADHMLIANBNjYCCCADQce52QA2AgQgA0GAgICAeDYCAAxyCyADQT42AgggA0H9udkANgIEIANBgICAgHg2AgAMcQsgA0EzNgIIIANBu7rZADYCBCADQYCAgIB4NgIADHALIANBKTYCCCADQe662QA2AgQgA0GAgICAeDYCAAxvCyADQRk2AgggA0GXu9kANgIEIANBgICAgHg2AgAMbgsgA0E7NgIIIANBsLvZADYCBCADQYCAgIB4NgIADG0LIANBPTYCCCADQeu72QA2AgQgA0GAgICAeDYCAAxsCyADQS02AgggA0GovNkANgIEIANBgICAgHg2AgAMawsgBCABQQhqNgIgIARBAjYCPCAEQYS92QA2AjggBEIBNwJEIARB4QQ2AjAgBCAEQSxqNgJAIAQgBEEgajYCLCAEQRBqIARBOGoQiRUgA0EIaiAEQRhqKAIANgIAIAMgBCkCEDcCAAxqCyADQTo2AgggA0GUvdkANgIEIANBgICAgHg2AgAMaQsgA0HwADYCCCADQc692QA2AgQgA0GAgICAeDYCAAxoCyADQTU2AgggA0G+vtkANgIEIANBgICAgHg2AgAMZwsgA0HJADYCCCADQfO+2QA2AgQgA0GAgICAeDYCAAxmCyADQSk2AgggA0G8v9kANgIEIANBgICAgHg2AgAMZQsgA0EmNgIIIANB5b/ZADYCBCADQYCAgIB4NgIADGQLIANBOzYCCCADQYvA2QA2AgQgA0GAgICAeDYCAAxjCyADQTg2AgggA0HGwNkANgIEIANBgICAgHg2AgAMYgsgBCABQQhqNgIgIARBAjYCPCAEQbTB2QA2AjggBEIBNwJEIARB4QQ2AjAgBCAEQSxqNgJAIAQgBEEgajYCLCAEQRBqIARBOGoQiRUgA0EIaiAEQRhqKAIANgIAIAMgBCkCEDcCAAxhCyADQSc2AgggA0HEwdkANgIEIANBgICAgHg2AgAMYAsgA0EbNgIIIANB68HZADYCBCADQYCAgIB4NgIADF8LIANBITYCCCADQYbC2QA2AgQgA0GAgICAeDYCAAxeCyADQSU2AgggA0GnwtkANgIEIANBgICAgHg2AgAMXQsgA0HOADYCCCADQczC2QA2AgQgA0GAgICAeDYCAAxcCyADQR02AgggA0Gaw9kANgIEIANBgICAgHg2AgAMWwsgA0E5NgIIIANBt8PZADYCBCADQYCAgIB4NgIADFoLIANBOTYCCCADQfDD2QA2AgQgA0GAgICAeDYCAAxZCyADQTk2AgggA0GpxNkANgIEIANBgICAgHg2AgAMWAsgA0EuNgIIIANB4sTZADYCBCADQYCAgIB4NgIADFcLIAQgAUEIajYCICAEQQI2AjwgBEG4xdkANgI4IARCATcCRCAEQeEENgIwIAQgBEEsajYCQCAEIARBIGo2AiwgBEEQaiAEQThqEIkVIANBCGogBEEYaigCADYCACADIAQpAhA3AgAMVgsgA0E/NgIIIANByMXZADYCBCADQYCAgIB4NgIADFULIANBNjYCCCADQYfG2QA2AgQgA0GAgICAeDYCAAxUCyAEIAFBCGo2AiAgBEECNgI8IARBnMfZADYCOCAEQgE3AkQgBEHhBDYCMCAEIARBLGo2AkAgBCAEQSBqNgIsIARBEGogBEE4ahCJFSADQQhqIARBGGooAgA2AgAgAyAEKQIQNwIADFMLIANBxgA2AgggA0Gsx9kANgIEIANBgICAgHg2AgAMUgsgA0EoNgIIIANB8sfZADYCBCADQYCAgIB4NgIADFELIAQgAUEEajYCICAEQQI2AjwgBEHAyNkANgI4IARCATcCRCAEQeIENgIwIAQgBEEsajYCQCAEIARBIGo2AiwgBEEQaiAEQThqEIkVIANBCGogBEEYaigCADYCACADIAQpAhA3AgAMUAsgA0EhNgIIIANB0MjZADYCBCADQYCAgIB4NgIADE8LIANBFjYCCCADQfHI2QA2AgQgA0GAgICAeDYCAAxOCyADQRQ2AgggA0GHydkANgIEIANBgICAgHg2AgAMTQsgA0EdNgIIIANBm8nZADYCBCADQYCAgIB4NgIADEwLIANBMTYCCCADQbjJ2QA2AgQgA0GAgICAeDYCAAxLCyADQTM2AgggA0HpydkANgIEIANBgICAgHg2AgAMSgsgBCABQQhqNgIMIAQgAUEQajYCICAEQQM2AjwgBEHAytkANgI4IARCAjcCRCAEQeEENgIcIARB4QQ2AhQgBCAEQRBqNgJAIAQgBEEgajYCGCAEIARBDGo2AhAgBEEsaiAEQThqEIkVIANBCGogBEE0aigCADYCACADIAQpAiw3AgAMSQsgBCABQQhqNgIgIARBAjYCPCAEQfDK2QA2AjggBEIBNwJEIARB4QQ2AjAgBCAEQSxqNgJAIAQgBEEgajYCLCAEQRBqIARBOGoQiRUgA0EIaiAEQRhqKAIANgIAIAMgBCkCEDcCAAxICyADQT82AgggA0GAy9kANgIEIANBgICAgHg2AgAMRwsgA0HFADYCCCADQb/L2QA2AgQgA0GAgICAeDYCAAxGCyADQSQ2AgggA0GEzNkANgIEIANBgICAgHg2AgAMRQsgA0EjNgIIIANBqMzZADYCBCADQYCAgIB4NgIADEQLIANBKzYCCCADQcvM2QA2AgQgA0GAgICAeDYCAAxDCyADQTg2AgggA0H2zNkANgIEIANBgICAgHg2AgAMQgsgA0HOADYCCCADQa7N2QA2AgQgA0GAgICAeDYCAAxBCyAEIAFBCGo2AiAgBEECNgI8IARBtM7ZADYCOCAEQgE3AkQgBEHhBDYCMCAEIARBLGo2AkAgBCAEQSBqNgIsIARBEGogBEE4ahCJFSADQQhqIARBGGooAgA2AgAgAyAEKQIQNwIADEALIANBOjYCCCADQcTO2QA2AgQgA0GAgICAeDYCAAw/CyADQTI2AgggA0H+ztkANgIEIANBgICAgHg2AgAMPgsgA0EjNgIIIANBsM/ZADYCBCADQYCAgIB4NgIADD0LIANBKTYCCCADQdPP2QA2AgQgA0GAgICAeDYCAAw8CyADQTk2AgggA0H8z9kANgIEIANBgICAgHg2AgAMOwsgA0HWADYCCCADQbXQ2QA2AgQgA0GAgICAeDYCAAw6CyADQT82AgggA0GL0dkANgIEIANBgICAgHg2AgAMOQsgA0EqNgIIIANBytHZADYCBCADQYCAgIB4NgIADDgLIANBEzYCCCADQfTR2QA2AgQgA0GAgICAeDYCAAw3CyADQQ02AgggA0GH0tkANgIEIANBgICAgHg2AgAMNgsgA0EPNgIIIANBlNLZADYCBCADQYCAgIB4NgIADDULIANB0wA2AgggA0Gj0tkANgIEIANBgICAgHg2AgAMNAsgA0HGADYCCCADQfbS2QA2AgQgA0GAgICAeDYCAAwzCyADQSk2AgggA0G809kANgIEIANBgICAgHg2AgAMMgsgA0EyNgIIIANB5dPZADYCBCADQYCAgIB4NgIADDELIANBLDYCCCADQZfU2QA2AgQgA0GAgICAeDYCAAwwCyADQTA2AgggA0HD1NkANgIEIANBgICAgHg2AgAMLwsgA0E9NgIIIANB89TZADYCBCADQYCAgIB4NgIADC4LIANBHjYCCCADQbDV2QA2AgQgA0GAgICAeDYCAAwtCyADQTI2AgggA0HO1dkANgIEIANBgICAgHg2AgAMLAsgA0EmNgIIIANBgNbZADYCBCADQYCAgIB4NgIADCsLIANBIDYCCCADQabW2QA2AgQgA0GAgICAeDYCAAwqCyADQTg2AgggA0HG1tkANgIEIANBgICAgHg2AgAMKQsgA0EcNgIIIANB/tbZADYCBCADQYCAgIB4NgIADCgLIANBIjYCCCADQZrX2QA2AgQgA0GAgICAeDYCAAwnCyADQTo2AgggA0G819kANgIEIANBgICAgHg2AgAMJgsgA0EzNgIIIANB9tfZADYCBCADQYCAgIB4NgIADCULIANBxAA2AgggA0Gp2NkANgIEIANBgICAgHg2AgAMJAsgBCABQQhqNgIMIAQgAUEQajYCICAEQQM2AjwgBEGQ2dkANgI4IARCAjcCRCAEQeEENgIcIARB4QQ2AhQgBCAEQRBqNgJAIAQgBEEgajYCGCAEIARBDGo2AhAgBEEsaiAEQThqEIkVIANBCGogBEE0aigCADYCACADIAQpAiw3AgAMIwsgA0E6NgIIIANBqNnZADYCBCADQYCAgIB4NgIADCILIANBLjYCCCADQeLZ2QA2AgQgA0GAgICAeDYCAAwhCyADQS02AgggA0GQ2tkANgIEIANBgICAgHg2AgAMIAsgBCABQQhqNgIgIARBAjYCPCAEQeza2QA2AjggBEIBNwJEIARB4QQ2AjAgBCAEQSxqNgJAIAQgBEEgajYCLCAEQRBqIARBOGoQiRUgA0EIaiAEQRhqKAIANgIAIAMgBCkCEDcCAAwfCyAEIAFBCGo2AiAgBEECNgI8IARB0NvZADYCOCAEQgE3AkQgBEHhBDYCMCAEIARBLGo2AkAgBCAEQSBqNgIsIARBEGogBEE4ahCJFSADQQhqIARBGGooAgA2AgAgAyAEKQIQNwIADB4LIAQgAUEIajYCICAEQQI2AjwgBEGw3NkANgI4IARCATcCRCAEQeEENgIwIAQgBEEsajYCQCAEIARBIGo2AiwgBEEQaiAEQThqEIkVIANBCGogBEEYaigCADYCACADIAQpAhA3AgAMHQsgA0HoADYCCCADQcDc2QA2AgQgA0GAgICAeDYCAAwcCyADQegANgIIIANBqN3ZADYCBCADQYCAgIB4NgIADBsLIANBxAA2AgggA0GQ3tkANgIEIANBgICAgHg2AgAMGgsgA0HTADYCCCADQdTe2QA2AgQgA0GAgICAeDYCAAwZCyADQdcANgIIIANBp9/ZADYCBCADQYCAgIB4NgIADBgLIANB2gA2AgggA0H+39kANgIEIANBgICAgHg2AgAMFwsgA0ESNgIIIANB2ODZADYCBCADQYCAgIB4NgIADBYLIANBGTYCCCADQerg2QA2AgQgA0GAgICAeDYCAAwVCyADQSk2AgggA0GD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AS0AUyEEIAEtAFIhBSABLQBRIQYgASgCAEEBRgRAIAJBKGogAUEgaikDADcDACACQSBqIAFBGGopAwA3AwAgAkEYaiABQRBqKQMANwMAIAIgASkDCDcDEEIBIQcLIAAgAzoAUCAAIAIpAgA3AkAgACAEOgBTIAAgBToAUiAAIAY6AFEgACAHNwMAIAAgAikDEDcDCCAAQcgAaiACQQhqKQIANwIAIABBEGogAkEYaikDADcDACAAQRhqIAJBIGopAwA3AwAgAEEgaiACQShqKQMANwMAIAEpAzghByABKQMwIQggAS8BVCEDIAAgASkDKDcDKCAAIAM7AVQgACAINwMwIAAgBzcDOCACQTBqJAALugIBBH9BHyECIABCADcCECABQf///wdNBEAgAUEGIAFBCHZnIgNrdkEBcSADQQF0a0E+aiECCyAAIAI2AhwgAkECdEGojOQAaiEEQQEgAnQiA0HEj+QAKAIAcUUEQCAEIAA2AgAgACAENgIYIAAgADYCDCAAIAA2AghBxI/kAEHEj+QAKAIAIANyNgIADwsCQAJAIAEgBCgCACIDKAIEQXhxRgRAIAMhAgwBCyABQRkgAkEBdmtBACACQR9HG3QhBQNAIAMgBUEddkEEcWpBEGoiBCgCACICRQ0CIAVBAXQhBSACIQMgAigCBEF4cSABRw0ACwsgAigCCCIBIAA2AgwgAiAANgIIIABBADYCGCAAIAI2AgwgACABNgIIDwsgBCAANgIAIAAgAzYCGCAAIAA2AgwgACAANgIIC68CAgV/A34jAEHQAGsiAyQAIANBwgA6ADggA0EYaiABIANBOGoQsw5BCCEBIANBCGoiBCADQShqIgYpAwA3AwAgA0EQaiIFIANBMGoiBykDADcDACADIAMpAyA3AwACQCADKAIYRQRAIANByABqIAUpAwAiCDcDACADQUBrIAQpAwAiCTcDACADIAMpAwAiCjcDOCADQSxqIAg3AgAgA0EkaiAJNwIAIAMgCjcCHCAAQRxqIAcoAgA2AgAgAEEUaiAGKQIANwIAIABBDGogA0EgaikCADcCACAAIAMpAhg3AgQgAEEAOgAkIAAgAjYCIEEBIQEMAQsgACADKQMANwMIIABBGGogBSkDADcDACAAQRBqIAQpAwA3AwAgAhCxFQsgACABNgIAIANB0ABqJAAL5wIBAn8j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ARDJJgsgAhDJJgwCCyABDQELIAAgAjoAAUEADAELIAAgBDYCBEEBCzoAACADQSBqJAAL6gEBBn8jAEEgayIEJAACQCABIANPBEAgACADQQJ0aiEGIAMhBwNAIAcEQCAAIAUgACgCACIIIAIoAgBqIgVqIgk2AgAgBSAISSAFIAlLciEFIAdBAWshByACQQRqIQIgAEEEaiEADAELC0EAIQIgBUUNASABQQJ0IANBAnRrIQADQCAARQRAQQEhAgwDCyAGIAYoAgBBAWoiATYCACAAQQRrIQAgBkEEaiEGIAFFDQALDAELIARBADYCGCAEQQE2AgwgBEHE3+AANgIIIARCBDcCECAEQQhqQeCvwgAQuh0ACyAEQSBqJAAgAgusAgEEfyMAQRBrIgMkAAJAIAItAAwiBEEBRgRAIAAgARDtIAwBCwJAAkACQAJAAkACQAJAAkAgAS0ADCIFQQFrDgIHAQALIARFDQEMAgsgBEUNAQsgASgCBCIEIAEoAggiASACKAIEIgYgAigCCCICEPApQf8BcQ4CAgMBCyADIAEoAgQgASgCCCACKAIEIAIoAggQuxIgACAFIAMQ5hIMBAsgAyAGIAIgBCABEOwbIABBAiAFayADEOYSDAMLIABBCGpBmILCACkCADcCACAAQZCCwgApAgA3AgAMAgsgAyAEIAEgBiACEOwbIAAgBSADEOYSDAELIAMgAhDtICAAIAMpAgA3AgAgA0ECIAMtAAxrOgAMIABBCGogA0EIaikCADcCAAsgA0EQaiQAC/kBAQh/IABBEGogABDiGSECIABBMEEgIABBMGogAEEgahDiGSIDG2ohBCAAQSBBMCADG2oiBSAAIAJBAXNBBHRqIgMgBCAEIAAgAkEEdGoiABDiGSICGyAFIAMQ4hkiBhsiByAAIAQgAyAGGyACGyIIEOIZIQkgAUEIaiAEIAAgAhsiAEEIaikCADcCACABIAApAgA3AgAgAUEYaiAHIAggCRsiAEEIaikCADcCACABIAApAgA3AhAgAUEoaiAIIAcgCRsiAEEIaikCADcCACABIAApAgA3AiAgASADIAUgBhsiACkCADcCMCABQThqIABBCGopAgA3AgALoAIBBH8jAEEwayICJABBgICAgHghBAJAAkAgAUEoahDNDSIDRQ0AIAMoAgBBAkcNACADLQAIQQJHDQAg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KAIEIgIoAgBBBWsiBCAEQQZPG0EBaw4FAQIDBAUACyABIAIpAwggAkEYaigCABCrHQwFCyACQQhqIAEQkCIgAkEoaiABEPwsDAQLIAEgAikDECACQSBqKAIAEKsdIAJBKGogARD8LAwDCyACQQhqIAEQkCIgAkEoaiABEPEjDAILIAIgARCQIiACQSBqIAEQ8iMgAkHoAGogARCCLSACQcgAaiABEPEjDAELIAJBCGogARCQIiACKAIoIAEQoxILIABBDGohACADQQxrIQMMAQsLC68IAgZ/AX4CQAJAAkACQAJAAkACQAJAAkAgACgCAEEBaw4HAQIDBAUGBwALIABCADcDECAAKAIgEJcEDwsgAEIANwMQIABBIGoQgS4PCyAAKAIEELUqDwsgACgCBBC1Kg8LIAAoAgQQjBMPCyAAKAIEIgBCADcDECAAQgA3AwAgAEEgahCNJiAAQSRqEPEDDwsgACgCBCIAQgA3AxggAEIANwMIIAAoAihBMGwhASAAKAIkIQNBACEAA0AgACABRg0CIAAgA2oiAkEQakIANwIAIAJBIGpCADcCACACQShqIgIoAgAEQCACEIAuCyAAQTBqIQAMAAsACyAAKAIEIgBCADcDSCAAQgA3AxAgAC0ARUEDRg0AIABBIGohAQNAIAEtACVBAkYEQAJAIAFCADcCDCABKAIEIgAgASgCCEE4bGohBgNAAkACQAJAAkACQAJAAkAgACAGRwRAIABBOGohAiAAKAIAIgFBCUYNAQJAAkACQCABQQFrDggBAgoJCAcGBQALIABCADcCFCAAKAIMQcgAbCEEIAAoAgghBUEAIQEDQCABIARHBEACQAJAAkACQCABIAVqIgMpAwBCA30iB6dBAWpBACAHQgJUG0EBaw4CAQIACyADQShqQgA3AgAgA0E4akIANwIAIAMQhiQMAgsgA0EYakIANwIAIANBCGpCADcCAAwBCyADQRhqQgA3AgAgA0EIakIANwIACyABQcgAaiEBDAELCyAAKAIQQgA3AwggAEEcahCOJiACIQAMCgsgAEIANwIwIABBCGoQ5AggAiEADAkLIABCADcCECAAKAIMQdAAbCEEIAAoAgghBUEAIQEDQAJAIAEgBEcEQAJAAkACQEICIAEgBWoiAykDAEICfSIHIAdCAlobp0EBaw4CAQIACyADQRhqQgA3AgAgA0EoakIANwIADAMLIANBEGpCADcCAAwCCyADQRBqQgA3AgAgA0FAa0IANwIAIANBIGoQhiQMAQsgACgCGCIBBEAgAUIANwIICyAAQRxqEI4mIAIhAAwKCyABQdAAaiEBDAALAAsMCAsgAEEIahCNBCACIQAMBgsgAEIANwIYIABCADcCCCACIQAMBQsgAEIANwIIIABBBGoQgC4gAiEADAQLIAAoAgQiAEIANwMwIABCADcDICAAKQMAUARAIABBCGoQlR4gAiEADAQLIABCADcDCCAAQgA3AxggAiEADAMLIABCADcCCCAAKAIEQgA3AwggAEEQahCOJiACIQAMAgsgAEIANwIIIAAoAgQQvAIgAiEADAELIABCADcCMAJAAkACQCAAKAIIQQFrDgIBAgALIABBEGoQrSEgAiEADAILIABBEGoQrCEgAiEADAELIAAoAgwQjBMgAiEADAALAAsFIAFCADcDECABQgA3AwAgASgCICEBDAELCwsL7AEBBX8gACAAKAIAQQFrIgE2AgACQCABDQACQCAAKAIYIgJFBEBBACEBDAELIAAoAgwiASAAKAIUIgMgAUEAIAEgA00bayIDayIFIAJJBEAgAiAFayEEDAELIAIgA2ohAQsgAEEQaigCACICIANBAnRqIQUgASADayEBA0AgAQRAIAUoAgAQ8w4gAUEBayEBIAVBBGohBQwBBQNAIAQEQCACKAIAEPMOIARBAWshBCACQQRqIQIMAQsLIAAoAgwgAEEQaigCAEEEQQQQyyIgACAAKAIEQQFrIgE2AgQgAQ0CIABBIEEEENERCwsLC6YCAQJ/IwBBEGsiAiQAAn8CQAJAAkACQAJAQQQgACgCACIAKAIAQYCAgIB4cyIDIANBBE8bQQFrDgQBAgMEAAsgAiAAQQhqNgIMIAFByZ3DAEEPQdidwwBBAyACQQxqQZkBEMYLDAQLIAIgAEEIajYCDCABQdudwwBBDUHoncMAQQcgAEEEakGaAUHvncMAQQcgAkEMakEhEJMLDAMLIAIgAEEEajYCDCABQfadwwBBDUHoncMAQQcgAkEMakGbARDGCwwCCyACIABBBGo2AgwgAUGDnsMAQRJB6J3DAEEHIAJBDGpBmwEQxgsMAQsgAiAANgIMIAFBlZ7DAEEJQeidwwBBByAAQQxqQZoBQaWV2gBBBCACQQxqQZwBEJMLCyACQRBqJAALkQIBA38jAEFAaiIFJAACQCABKAIYIgRB/v///wdNBEACQAJAAkACQCACKAIAQQJrDgYAAwMDAQIDCyACKAIMQQN0IQMMAgsgAigCDEECdCEDDAELIAIoAgxBAnQhAwsgASABKAI0IANqNgI0IAEoAhAgBEYEQCABQRBqEPgWCyABIARBAWo2AhggASgCFCAEQQR0aiIDIAIpAgA3AgAgA0EIaiACQQhqKQIANwIAIAUgARD9FyAFKAIAIgFBKkYEQCAAQSo2AgAgACAENgIEDAILIABBBGogBUEEckE8EPwGGiAAIAE2AgAMAQsgAEH/////BzYCCCAAIAQ2AgQgAEEmNgIAIAIQrBkLIAVBQGskAAv1AQELfyABKAIIIgNBHGwhBCADQf////8DcSEIIAItABgiC0EHRiEJIAEoAgQiBiEHAkADQCAERQRAIAEoAgAgA0YEQCABEPUWIAEoAgQhBgsgASADQQFqNgIIIAYgA0EcbGoiASACKQIANwIAIAFBGGogAkEYaigCADYCACABQRBqIAJBEGopAgA3AgAgAUEIaiACQQhqKQIANwIAQQAhCgwCCwJAIActABgiDEEHRiINIAlzRQRAQQEhCiAJIA1yIAsgDEZyDQELIAdBHGohByAFQQFqIQUgBEEcayEEDAELCyAFIQgLIAAgCDYCBCAAIAo2AgALsggCC38BfiMAQRBrIgUkACAAQcABaiEKA0BBACEBIAVBADoADCAFQQA2AgggBSAAKALAASICNgIAIAUgACgCxAEgAmsiAjYCBANAAkAgASACTw0AIAUoAgAgAWotAABBAnRBrJbaAGooAgAiAkUNACAFIAIRBQAhAiAFKAIIIQEgAkUNACAFIAEgAmoiATYCCCAFKAIEIQIMAQsLIAUtAAwgCiABEOcoQQFGBEAgAEEBOgC9AQsCQAJAAkAgACgCxAEiAiAAKALAASIBRg0AIAEtAABBL0cNACABIAIQohxBL0YNASABIAIQohxBKkYNAgsgBUEQaiQADwsgAEECEL8FDAELQQAhAiMAQSBrIggkACAAKALQASEHIABBwAFqIgFBAhDnKCAAKALQASELAkAgACgCwAEiBCAAKALEAUYNACAELQAAQSpHDQAgARCvFUEBIQILQQEhBgJAIAAtAL0BDQAgAC0A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IQkCQAJAAkAgASgCCCIGBEAgAigCCCIHDQELIANBCGpBtK7gACgCADYCACADQayu4AApAgA3AwAMAQsgB0EBRgRAIANBCGogAUEIaigCADYCACADIAEpAgA3AwAgAyAEKAIAEM0HIAQhBSACIQEMAgsgBkEBRgRAIANBCGogAkEIaigCADYCACADIAIpAgA3AwAgAyAFKAIAEM0HDAILIAMgBSAGIAQgBxC4DgsgAigCACAEENkpCyABKAIAIAUQ2SkgACAJIAgQ4BVB/wFxIAMQ5hIgA0EQaiQAC80BAQN/IANB+P///wFxBEAgACAAIANBeHEiBGogACADQQN2IgNBDmwiBWogAxCcCSEAIAEgASAEaiABIAVqIAMQnAkhASACIAIgBGogAiAFaiADEJwJIQILAn8gAC0AACIDIAEtAAAiBEcEQCADIARJDAELIAAtAAEgAS0AAUkLIQUCfyACLQAAIgYgA0cEQCADIAZJDAELIAAtAAEgAi0AAUkLIAVGBH8gAiABIAQgBkcEfyAEIAZJBSABLQABIAItAAFJCyAFcxsFIAALC80BAQN/IANB+P///wFxBEAgACAAIANBA3YiA0EFdCIEaiAAIANBOGwiBWogAxCdCSEAIAEgASAEaiABIAVqIAMQnQkhASACIAIgBGogAiAFaiADEJ0JIQILAn8gACgCACIDIAEoAgAiBEcEQCADIARJDAELIAAoAgQgASgCBEkLIQUCfyACKAIAIgYgA0cEQCADIAZJDAELIAAoAgQgAigCBEkLIAVGBH8gAiABIAQgBkcEfyAEIAZJBSABKAIEIAIoAgRJCyAFcxsFIAALC/cBAQR/IAIoAgghAyACKAIEIQQgABCfDyEFAkACQCABIAIoAgBJBEADQCADRQRAQQAhAAwECyAFKAIQIAUoAhQgA0EBayIAQajB2AAQsh8iBigCACABSQ0CIARBAiAGLQAEIgNBAWsgA0EERhtB/wFxayEEIAAhAwwACwALIAMgBSgCFCIAIAAgA0kbIQADQCAAIANGDQIgBSgCECAFKAIUIANBuMHYABCyHyIGKAIAIAFPDQEgBEECIAYtAAQiBkEBayAGQQRGG0H/AXFqIQQgA0EBaiEDDAALAAsgAyEACyACIAA2AgggAiAENgIEIAIgATYCACAEC/gBAQV/IwBBIGsiBCQAIAEoAtABIQcgAUHAAWoiBRCvFQJAAkAgASgCwAEgASgCxAEQ9BwgAkH/AXEiA0cEQCAFQT0QkhhFBEBBC0EMIANBK0YbIQZBFCEDDAILQQFBAiACQf8BcUErRhshBkEVIQMMAQsgBRCvFQJAIAEtAL0BRQRAIAJB/wFxQStHDQFBGCEDDAILQRghAwJAIAJB/wFxQStrDgMCAQABCyAFQT4QkhhFDQAgBEEmOgAIIAEgByAEQQhqEOgoIAFBABC/BSABEOkIIAAgARC7DgwCC0EZIQMLIAAgBjoABCAAIAM2AgALIARBIGokAAv2AQICfwJ+IwBBIGsiAiQAAkAgACgCACIDQQBOBEAgAkEIaiABEPkcIAIoAghBAXFFDQEgAiADQQF0IgMgAigCDCIBIAEgA0kbQTgQhxUgAEEIaiIBKAIAIQMgAikDACEEIAFBADYCACACQRhqIgEgAzYCACAAKQIAIQUgACAENwIAIAIgBTcDECAAKAIUIgMgACgCDEYEQCAAQQxqEP4WCyAAIANBAWo2AhQgACgCECADQQxsaiIAIAIpAxA3AgAgAEEIaiABKAIANgIAIAJBIGokAA8LQfTJ3wBBEUGUh9kAELUSAAtB9MnfAEERQaSH2QAQtRIAC/YBAgJ/An4jAEEgayICJAACQCAAKAIAIgNBAE4EQCACQQhqIAEQ+RwgAigCCEEBcUUNASACIANBAXQiAyACKAIMIgEgASADSRtBMBCHFSAAQQhqIgEoAgAhAyACKQMAIQQgAUEANgIAIAJBGGoiASADNgIAIAApAgAhBSAAIAQ3AgAgAiAFNwMQIAAoAhQiAyAAKAIMRgRAIABBDGoQ/hYLIAAgA0EBajYCFCAAKAIQIANBDGxqIgAgAikDEDcCACAAQQhqIAEoAgA2AgAgAkEgaiQADwtB9MnfAEERQZSH2QAQtRIAC0H0yd8AQRFBpIfZABC1EgAL+gEBBX8jAEEQayIDJAAgACgCCEEMbCEEIAAoAgQhAANAIAQEQAJAIAAoAgAEQCAAIAEQzSwMAQsCQAJAAkACQAJAAkACQEEEIAAoAgQiAigCACIFQQVrIgYgBkEGTxtBAWsOBQABAgMEBgsgAkEIaiABEPIhIAJBKGogARDNLAwECyACQShqIAEQzSwMAwsgAkEIaiABEMIlDAILIAIgARCJGwwBCyABIAJBCGoQwyULIAIoAgAhBQsgBUEFRw0AIAMgAikDCCACQRhqKAIAELcjIAEgAykDACADKAIIEMcQCyAAQQxqIQAgBEEMayEEDAELCyADQRBqJAALjQICAn8CfiMAQRBrIgMkAAJAAkACQAJAAkACQAJAIAAoAgBBAWsOBwECAwYGBAUACyAAKAIgIAEQUgwFCyAAKAIgIAEQphIMBAsgACgCBCABENINDAMLIAAoAgQgARDSDQwCCyAAKAIEIgAoAihBMGwhAiAAKAIkQShqIQADQCACRQ0CIAAoAgAEQCAAIAEQ+CwLIAJBMGshAiAAQTBqIQAMAAsACyADIAAoAgQiABCOFSABKAIYIQIgAykDACEEIAEgAygCCDYCGCABKQMQIQUgASAENwMQIAAtAEVBA0cEfiAAQSBqIAEQkg8gASkDEAUgBAsQ6yYgASACNgIYIAEgBTcDEAsgA0EQaiQAC94BAQZ/IAAoAggiA0EwbCEBIAAoAgQiBiECA0AgAQRAIAFBMGshASACENIEIAJBMGohAgwBCwsCQCADRQ0AIAYhAkEAIQECQANAIAIhBSABIANGBEAgAyEBDAILIAVBMGohAiABQQFqIQEgBRC8HA0ACyAFENEFQQEhBAsgAyABayECIAYgAUEwbGohAQNAAkAgAgRAIAEQvBxFBEAgARDRBSAEQQFqIQQMAgsgASAEQVBsaiABQTAQ/AYaDAELIAAgAyAEazYCCAwCCyACQQFrIQIgAUEwaiEBDAALAAsL4wECBX8BfiABKAIMIgQgAUEMaygCAEkEQCMAQRBrIgNBCGogAUEIaigCADYCACADIAEpAgA3AwAgAUEkayECIAEpAhAhBwJ/AkADQCACIgFBNGogAUEcaikCADcCACABQSxqIAFBFGopAgA3AgAgAUEkaiIFIAFBDGoiBiICKQIANwIAIAAgAkYNASABQRhrIQIgBCABKAIASQ0ACyAGIQIgBQwBCyABQQxqIQIgAUEkagshASACIAMpAwA3AgAgAkEIaiADQQhqKAIANgIAIAFBCGsgBzcCACABQQxrIAQ2AgALC+EBAQN/IwBBIGsiAiQAAkAgAygCECIGIAMoAhQiCE0EQCADKAIAQQFrQQJPBEAgAkEUaiIHIAEgAygCCCADKAIMIAYgCBCMByACQQRqIAcQ9RsMAgsgAkEUaiIHIAEgAygCCCADKAIMIAYgCBCeCyACQQRqIAcQ9RsMAQsgAkEANgIEC0EBIQMCQCACKAIEQQFGBEAgAigCECEBIAVFDQEgAigCDCEGIAQgAigCCEEBajYCACAFQQFGDQEgBCAGQQFqNgIEDAELQQAhAwsgACABNgIEIAAgAzYCACACQSBqJAAL4QEBA38jAEEgayICJAACQCADKAIQIgYgAygCFCIITQRAIAMoAgBBAWtBAk8EQCACQRRqIgcgASADKAIIIAMoAgwgBiAIEPsLIAJBBGogBxD1GwwCCyACQRRqIgcgASADKAIIIAMoAgwgBiAIELcQIAJBBGogBxD1GwwBCyACQQA2AgQLQQEhAwJAIAIoAgRBAUYEQCACKAIQIQEgBUUNASACKAIMIQYgBCACKAIIQQFqNgIAIAVBAUYNASAEIAZBAWo2AgQMAQtBACEDCyAAIAE2AgQgACADNgIAIAJBIGokAAvrAQIGfwF+IwBBIGsiAiQAA0AgASAFRwRAIAVBBXQhAyAFQQFqIQUgACADaiIEKAIEIgZFDQEgBCgCACEDAkAgBCgCDCIERQ0AIAMpAwAhCCACIAQ2AhggAiADNgIQQQEhBCACIAMgBmpBAWo2AgwgAiADQQhqNgIIIAIgCEJ/hUKAgYKEiJCgwIB/gzcDAANAIARFDQEgAhDrDiEHIAIgAigCGEEBayIENgIYIAdFDQEgB0EMaxDxHgwACwALIAJBDEEIIAZBAWoQ6g0gAyACKAIIayACKAIAIAIoAgQQsiQMAQsLIAJBIGokAAvtAQECfyMAQTBrIgMkACADQShqIAJBEGooAgAiBDYCACADQSBqIAJBCGopAgA3AwAgAyACKQIANwMYIAMCfwJAAkACQAJAIAEtAAlBAWsOAgEAAgsgBEEBcQ0BQQEQziYMAwsgBEEBcQ0BCyADQQhqIAEoAgAgASgCBCIBKAIIQQFrQXhxakEIaiADQRhqIAEoAkgRBAAgAygCCEECRgRAIAMoAgwMAgsgACADKQIINwIAIABBCGogA0EQaikCADcCACADQTBqJAAPC0EAEM4mCzYCGEHE+cMAQS0gA0EYakH4gMQAQdz6wwAQxg4AC+kBAgh/A34jAEEQayIEJAAgBCACQQhBIBD5FCAEKAIAIgcgAkH///8/cSIDIAMgB0sbIQYgBCgCBCEIIARBDGohCQNAIAYEQCABIAVqIgNBCGopAgAhCyADQRhqLQAAIQogA0EQaikDABCyIyEMIAMpAwAQ9BohDSAFIAhqIgNBGGogCjoAACADQQhqIAs3AwAgA0EQaiAMNwMAIAMgDTcDACADQRlqIAQoAAk2AAAgA0EcaiAJKAAANgAAIAZBAWshBiAFQSBqIQUMAQsLIAAgAjYCCCAAIAg2AgQgACAHNgIAIARBEGokAAuKAgEBfgJAAkACQAJAAkACQAJAAkAgACgCAEEBaw4HAgMEBQYHAAELIAAoAgQiACkDCCEBAkAgACgCAEUEQCABEPEaDAELIAEgAEEYaikDABCIKwsgAC0ARUEDRwRAIABBIGoQ8hkLIABB2ABBCBDREQ8LIAApAwgQ8RogAEEgahCsFQ8LIAApAwgQ8RogAEEgahCHFw8LIABBBGoQ/CQPCyAAQQRqEP0kDwsgAEEEahDxHA8LIAAoAgQiACkDCBDxGiAAQSBqEMwdIABBJGoQgwUgAEEwQQgQ0REPCyAAKAIEIgApAwAQ8RogAEEgahCWEiAAKAIgIABBJGooAgAQjiogAEEwQQgQ0REL+gEBA38jAEEwayIDJAAgASAALQCtAkEBcRCRDkUEQCADQRBqIAEQjAMgAygCFCEEIAMoAhAhBSADQaoBOgAYIAAgBSAEIANBGGoQvhkLAkAgAC0AoAJBAkcNACAALQCkAkEBcQ0AAkAgASgCAEEaRw0AIAFBCGoQoRxFDQAgAyABEIwDIAMoAgQhASADKAIAIQIgA0GGAToAGCAAIAIgASADQRhqEMIeDAELIAEgAC0ArQJBAXEQkQ4NACABIAIQjxhFDQAgA0EIaiABEIwDIAMoAgwhASADKAIIIQIgA0GqAToAGCAAIAIgASADQRhqEL4ZCyADQTBqJAALxQEBAn8CQAJAAkAgACgCACIBQSVGDQACQAJAAkACQAJAQRAgAUECayICIAJBI08bDiIBBQUFBQUFBQUFBQUFBQUFAgUFBQUFBQUFBgYHAwcGBQUEAAsgAEEEahCEIw8LIAAtAAgiAUEFTSABQQFHcQ0DIABBEGoQwxkPCyAAQRBqEMMZIAFFBEAMBQsgAEEEahCEIw8LIAAoAhAQ4iEMAwsgAEEIahDDGQsPCyAAQQhqEMMZIABBEGoQwxkPCyAAQQhqEMMZC/EBAgN+Bn8gACgCDEUEQEEADwsgASkDABCWHyECIAAoAgAiBUEQayEJIAJCGYhCgYKEiJCgwIABfiEEIAAoAgQiBiACp3EhAANAIAAgBWopAAAiAyAEhSICQn+FIAJCgYKEiJCgwIABfYNCgIGChIiQoMCAf4MhAgJAAkADQCACUCIIRQRAIAEgCSACeqdBA3YgAGogBnEiCkEEdGsQsgsNAiACQgF9IAKDIQIMAQsLIAMgA0IBhoNCgIGChIiQoMCAf4NQDQELQQBBACAFIApBBHRrIAgbQRBrIAgbDwsgACAHQQhqIgdqIAZxIQAMAAsAC+kBAQJ/IwBBQGoiAiQAAkACQAJAAkACQAJAIAEoAgAiA0EBaw4GAAECAwUEBQsgAUEEaiAAEJsXDAQLIAFBBGogABDuLQwDCyABQQRqIAAQ4QQMAgsgACABQQRqEP0cDAELIAFBBGogABD4LAsgACgCAEUgA3JFBEAgAkEgaiABQQhqEKAKIAJBGGogAkEwaikDADcDACACQRBqIAJBKGopAwA3AwAgAiACKQMgNwMIIAJBOGoQ9yYgACACQQhqEJEKIgAEQCABEKISIAEgADYCBCABQQY2AgALIAIpAwgQ8RoLIAJBQGskAAvpAQEBfwJAAkACQAJAAkACQAJAAkACQAJAIAAoAgAiAUEEa0EAIAFBBWtBCEkbDggBAgMEBQYHCAALAkAgACgCCEEFRgRAIAApAxAQ8RoMAQsgAEEIahDWFgsMCAsgABDYHw8LIABBCGoQ1hYgACgCMBC9GA8LIAApAwgQ8RogACgCIBC9GA8LIABBCGoQ1hYMBAsgACkDCBDxGiAAQSRqENInIABBKGoQ0ScgAEEsahDsJg8LIABBBGoQ7iYgAEEQahDRJwsPCyAAQQRqEOcmDwsgAEE8ahDSJyAAQUBrENEnIABBMGoQ7CYL+gEBA38jAEEwayIDJAAgASAALQCFA0EBcRCRDkUEQCADQRBqIAEQjwMgAygCFCEEIAMoAhAhBSADQaoBOgAYIAAgBSAEIANBGGoQ0BkLAkAgAC0A+AJBAkcNACAALQD8AkEBcQ0AAkAgASgCAEEaRw0AIAFBCGoQoRxFDQAgAyABEI8DIAMoAgQhASADKAIAIQIgA0GGAToAGCAAIAIgASADQRhqEM4eDAELIAEgAC0AhQNBAXEQkQ4NACABIAIQjxhFDQAgA0EIaiABEI8DIAMoAgwhASADKAIIIQIgA0GqAToAGCAAIAIgASADQRhqENAZCyADQTBqJAALiwIBBX8jAEEQayIGJAAgASgCBCABKAIIIAJBgInAABCwH0EIaiEEIAEoAiwhBSABKAIoIQcCQANAIAcgBSAEKAIAIgRBkInAABCyHygCBARAIAcgBSAEQdCJwAAQsh9BBGohBAwBBQJAIAYgBRDaHCAGKAIADQAgBigCBCEFIAFBJGpBABDPGCABKAIoIgcgASgCLCIIIAVBoInAABCyHyADNgIAAn8gBARAIAcgCCAEQbCJwAAQsh9BBGoMAQsgASgCBCABKAIIIAJBwInAABCwH0EIagsgAEEDNgIAIAU2AgAMAwsLCyAAIAYpAwg3AxAgAEL+////BzcDCCAAQQA2AgALIAZBEGokAAvyAQIEfwh+IwBBIGsiAiQAIAJBEGoiBCABQRBqKQMANwMAIAJBCGoiAyABQQhqKQMANwMAIAJBGGoiBSABKQMwIAE1AjhCOIaEIgYgAUEYaikDAIU3AwAgAiABKQMANwMAIAIQlwsgAyADKQMAQu4BhTcDACACIAIpAwAgBoU3AwAgAhCfByAEIAQpAwAiBkLdAYU3AwAgAykDACEHIAIpAwAhCCAFKQMAIQkgAhCfByAFKQMAIQogAykDACELIAQpAwAhDCACKQMAIQ0gACAGIAkgByAIhYWFNwMAIAAgCiALIAwgDYWFhTcDCCACQSBqJAAL9wEBA38jAEEgayICJAAgAkEQaiABEIkBIAIoAhQhAwJAAkACQCACKAIQRQRAIAMoAgBBLUYEQCAAIAMpAgQ3AgAgAygCAEEtRg0DIAMQ3QQMAwsgAS0AoAJBAkcNASABQShqEM0NIgRFDQEgBCgCAEEURw0BIAQtAARBBEcNASACIAM2AhwgAkEIaiABEO8BIAIoAgwhASACKAIIRQRAIAAgATYCBCAAIAM2AgAMBAsgAEEANgIAIAAgATYCBCACQRxqENooDAMLIABBADYCACAAIAM2AgQMAgsgAEEANgIEIAAgAzYCAAwBCyADEIkrCyACQSBqJAAL0gEBBH8gAEH/AXFBD0YiBCACQf8BcSIFQQ9GcSEGAkAgBCAFQQ9Gcg0AQQAhBkENIABBAmtB/wFxIgQgBEENTxsiBUENIAJBAmsiBEH/AXEiByAHQQ1PG0cNAAJAAkACQCAFQQZrDgIBAgALQQEhBiAFQQ1HIARB/wFxQQ1Jcg0CIABB/wFxIAJB/wFxRiABQf8BcSADQf8BcUZxDwsgAUH/AXEgA0H/AXFGIARB/wFxQQZHcg8LIAFB/wFxIANB/wFxRiAEQf8BcUEHR3IhBgsgBgvXAgEBfwJAAkACQAJAAkACQAJAIAAoAgBBAWsOBwECAwYGBAUACyAAQQhqIAEQiiMPCyAAQQhqIAEQiyMPCyAAKAIEIAEQ5xMPCyAAKAIEIAEQ5xMPCyABIAAoAgQiACkDACAAQRBqKAIAEIcbIAAoAihBMGwhAiAAKAIkQShqIQADQCACRQ0CIABBKGsoAgBFBEAgASAAQSBrKQMAIABBEGsoAgAQhxsLIAAoAgAEQCAAIAEQzCwLIAJBMGshAiAAQTBqIQAMAAsACyAAKAIEIgAoAgBFBEAgASAAKQMIIABBGGooAgAQhxsLIAAtAEVBA0YNACAAQSBqIQADQCAALQAlQQJGBEACQCAAKAIIQThsIQIgACgCBCEAA0AgAkUNASAAIAEQmwcgAkE4ayECIABBOGohAAwACwALBSABIAApAwggACgCGBCHGyAAKAIgIQAMAQsLCwvXAgEBfwJAAkACQAJAAkACQAJAIAAoAgBBAWsOBwECAwYGBAUACyAAQSBqIAEQ8QUPCyAAQSBqIAEQgS0PCyAAKAIEIAEQ7BMPCyAAKAIEIAEQ7BMPCyABIAAoAgQiACkDACAAQRBqKAIAEKsdIAAoAihBMGwhAiAAKAIkQShqIQADQCACRQ0CIABBKGsoAgBFBEAgASAAQSBrKQMAIABBEGsoAgAQqx0LIAAoAgAEQCAAIAEQ/CwLIAJBMGshAiAAQTBqIQAMAAsACyAAKAIEIgAoAgBFBEAgASAAKQMIIABBGGooAgAQqx0LIAAtAEVBA0YNACAAQSBqIQADQCAALQAlQQJGBEACQCAAKAIIQThsIQIgACgCBCEAA0AgAkUNASAAIAEQpgMgAkE4ayECIABBOGohAAwACwALBSABIAApAwggACgCGBCrHSAAKAIgIQAMAQsLCwv3AQEDfyMAQSBrIgIkACACQRBqIAEQiAEgAigCFCEDAkACQAJAIAIoAhBFBEAgAygCAEEtRgRAIAAgAykCBDcCACADKAIAQS1GDQMgAxDeBAwDCyABLQD4AkECRw0BIAFBKGoQ5w0iBEUNASAEKAIAQRRHDQEgBC0ABEEERw0BIAIgAzYCHCACQQhqIAEQ8AEgAigCDCEBIAIoAghFBEAgACABNgIEIAAgAzYCAAwECyAAQQA2AgAgACABNgIEIAJBHGoQtCkMAwsgAEEANgIAIAAgAzYCBAwCCyAAQQA2AgQgACADNgIADAELIAMQiSsLIAJBIGokAAvvAQIBfgZ/IwBBEGsiAiQAIAAoAgQiBwRAIAAoAgAhAwJAIAAoAgwiBkUNACADQQhqIQAgAykDAEJ/hUKAgYKEiJCgwIB/gyEBIAMhBUEBIQQDQCAERQ0BA0AgAUIAUkUEQCAFQYABayEFIAApAwBCf4VCgIGChIiQoMCAf4MhASAAQQhqIQAMAQsLIAUgAXqnQQF0QfABcWsiBEEMaygCACAEQQhrKAIAENYpIAFCAX0gAYMhASAGQQFrIgYhBAwACwALIAJBBGpBECAHQQFqENUOIAMgAigCDGsgAigCBCACKAIIELIkCyACQRBqJAALmgIBAX8jAEHgAGsiAiQAIAJBvPbDADYCWCACQZzBwwA2AlAgAkHswMMANgJIIAJBjMHDADYCQCACQezAwwA2AjggAkH8wMMANgIwIAJB7MDDADYCKCACQezAwwA2AiAgAkHswMMANgIYIAJB3MDDADYCECACQczAwwA2AgggAiAANgIsIAIgAEEwajYCTCACIABB1QBqNgJEIAIgAEEoajYCPCACIABB1ABqNgI0IAIgAEHTAGo2AiQgAiAAQdIAajYCHCACIABB0QBqNgIUIAIgAEFAazYCDCACIABB0ABqNgIEIAIgAEE4ajYCXCACIAJB3ABqNgJUIAFBrp3EAEEGQeT3wwBBCyACQQRqQQsQzgggAkHgAGokAAuaAgEBfyMAQeAAayICJAAgAkG89sMANgJYIAJBrPbDADYCUCACQfz1wwA2AkggAkGc9sMANgJAIAJB/PXDADYCOCACQYz2wwA2AjAgAkH89cMANgIoIAJB/PXDADYCICACQfz1wwA2AhggAkHs9cMANgIQIAJB3PXDADYCCCACIAA2AiwgAiAAQTBqNgJMIAIgAEHVAGo2AkQgAiAAQShqNgI8IAIgAEHUAGo2AjQgAiAAQdMAajYCJCACIABB0gBqNgIcIAIgAEHRAGo2AhQgAiAAQUBrNgIMIAIgAEHQAGo2AgQgAiAAQThqNgJcIAIgAkHcAGo2AlQgAUGuncQAQQZB5PfDAEELIAJBBGpBCxDOCCACQeAAaiQAC9kBAQd/IAEoAggiAiABKAIEIgQgAiAESxshCCABKAIAIQUgAiEGAkACQANAIAggBiIDRg0BIAEgA0EBaiIGNgIIIAMgBWotAAAiB0Ewa0H/AXFBCkkgB0HhAGtB/wFxQQZJcg0ACyAHQd8ARw0AAkAgAgRAIAIgBEkEQCACIAVqLAAAQUBIIAMgBEtyDQQMAgsgAyAETQ0BDAMLIAMgBEsNAgsgACADIAJrNgIEIAAgAiAFajYCAA8LIABBADYCACAAQQA6AAQPCyAFIAQgAiADQeDV1gAQ0CYAC/cBAQN/IAAoAgghAiAAKAIEIQADQCACBEACQCAAKAIABEAgABCfAwwBCwJAAkACQAJAAkACQAJAQQQgAEEEaigCACIBKAIAQQVrIgMgA0EGTxsOBQECAwQFAAsgAUEIahCaFiABQShqEIcXDAULIAEpAwgQ8RoMBAsgAUEIahCaFiABQShqEJ8DDAMLIAEpAxAQ8RogAUEoahCfAwwCCyABQQhqEJoWIAFByABqEOgmIAFBKGoQ+CQMAQsgARCaFiABQSBqEPokIAFB6ABqEPkkIAFByABqEPgkCyABQfAAQQgQ0RELIAJBAWshAiAAQQxqIQAMAQsLC+cBAgV/AX4jAEEgayICJAAgAiABNwMIIAEQlh8hASACIAJBCGo2AhQgAEEBIABBEGoQ9CEgAiAANgIcIAIgAkEUajYCGCACIAAoAgAgACgCBCABIAJBGGpBigUQ7AcCQCACKAIARQRAIAIpAwgQ8RoMAQsgACgCACIEIAIoAgQiBWoiAy0AACEGIAIpAwghByADIAFCGYinIgM6AAAgBCAAKAIEIAVBCGtxakEIaiADOgAAIAAgACgCDEEBajYCDCAAIAAoAgggBkEBcWs2AgggBCAFQQN0a0EIayAHNwMACyACQSBqJAAL+QEBA38gACgCCEEMbCECIAAoAgQhAANAIAIEQAJAIAAoAgAEQCAAEPEtDAELAkACQAJAAkACQAJAQQQgACgCBCIBKAIAQQVrIgMgA0EGTxtBAWsOBQECAwQFAAsgAUEAOgAcDAULIAFBCGoQjyMgAUEoahDxLQwECyABQQA6ACQgAUEoahDxLQwDCyABQQhqEI8jIAFByABqEKgqIAFBKGoQ4iUMAgsgAUEgaiIDEOMlIAFBBzYCICABEI8jIAMQ5CUgAUHoAGoQ8i0gAUHIAGoQ4iUMAQsgAUEIahCPIyABKAIoEPEGCyAAQQxqIQAgAkEMayECDAELCwvOAQEGfyMAQRBrIgMkACADIAAgAUEBQeCvwgAQjhAgAygCBEEARyEAIAMoAgwhBiADKAIIIQUgAygCACEBA0AgAARAIAEgBCABKAIAIgcgAigCAGoiBGoiCDYCACAEIAdJIAQgCEtyIQQgAEEBayEAIAJBBGohAiABQQRqIQEMAQsLQQAhAgJAIARFDQAgBkECdCEBA0AgAUUEQEEBIQIMAgsgBSAFKAIAQQFqIgA2AgAgAUEEayEBIAVBBGohBSAARQ0ACwsgA0EQaiQAIAIL7gEBAn8gACgCCCEBIAAoAgQhAANAIAEEQAJAAkACQAJAAkACQAJAAkBBBCAAKAIAQQRrIgIgAkEHTxsOBgECAwQFBgALIABBBGoQ0CgMBgsgAEEEahDuJiAAQRhqEOgmIABBHGoQzB0MBQsgAEEEahDuJiAAQRhqEOgmIABBHGoQzB0MBAsgAEEQahCfAyAAQQxqEOgmDAMLIABBBGoQnwMgAEEQahDoJgwCCyAAQTBqEJ8DIAAQthkMAQsgAEEQahCfAyAAQQRqEO4mIABBHGoQ6CYgAEEgahDMHQsgAUEBayEBIABBOGohAAwBCwsL7AEBBX8jAEEwayICJAAgASgCHCEDIAEoAhghBCABQSBqEPAcIQUCQAJAAkACQCABKAIAIgZBAWsOAgECAAsgAkEgaiABQQhqEMwhIAJBGGogAkEoaikDADcCACACIAIpAyA3AhAMAgsgAkEgaiABQQhqEMwhIAJBGGogAkEoaikDADcCACACIAIpAyA3AhAMAQsgAkEMaiABQQRqEOkiCyAAIAU2AiAgACADNgIcIAAgBDYCGCAAIAY2AgAgACACKQIMNwIEIABBDGogAkEUaikCADcCACAAQRRqIAJBHGooAgA2AgAgAkEwaiQAC/kBAQR/IAAoAhwgACgCICABENUPIQYDQAJAIAEgAk8NACAAKAIcIgMgACgCICIFIAZB3MPgABDfHyIEKAIcIQEgAyAFIAZBAWoiBkHsw+AAEN8fIgMtACBBAUYNACADKAIAIgVBHksNAAJAQQEgBXRBlNGAwAZxRQRAIAVBFEcNAiADLQAEQQ1HDQIgBCgCAEECRg0BDAILIAQoAgBBAkcNAQsgBC0ACCIDQQFLDQACQCADQQFxRQRAIAQtAAkiA0Eoa0EDSQ0BIANBB2sOAwMCAQILIARBEGpB/MPgAEEIEMobRQ0BCyAAIAQoAhggBCgCHBDaGAwBCwsLgAIBA38CQAJAAkACQAJAAkAgACgCAEEBaw4GAQIDBAUFAAsgAEEIaiABKAIAIAEoAgQQjQkPCyAAKAIMQShsIQIgACgCCCEAA0AgAkUNBCAAKAIAQQdHBEAgACABEMQJCyAAQShqIQAgAkEoayECDAALAAsgAEEEaiABEJQuDwsgACgCDEE4bCECIAEoAgQhAyABKAIAIQQgACgCCCEAA0AgAkUNAgJAAkACQAJAIAAoAgBBAWsOAgECAAsgAEEoaiABEMktDAILIABBEGogBCADEI0JDAELIABBBGogARCULgsgAEE4aiEAIAJBOGshAgwACwALIABBBGogARDJLQsL/AEBA38jAEEgayIDJAAgACgCACIAKAIAIABBADYCAEEBcUUEQEGkycAAQTEQyCoACyADQRhqIgQgAEEMaigCADYCACADIAApAgQ3AxBBJBCdIyIAQQA6ACAgACACNgIQIAAgATYCDCAAQQhqIAQoAgA2AgAgACADKQMQNwIAEOAgIgFBAToAHCABQgA3AgggAUKCgICAEDcCACADQQhqIAFBCGoiBUGQpeMAELcdIAMoAgwhBCADKAIIIgIQuRUgAiAFNgIMIAJBoKXjADYCCCACQYCAwAA2AgQgAiAANgIAIAQgBCgCAEEBajYCABCIBiABENgKIANBIGokAAv9AQEBfyAAEK4FIABBBGohAQJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCAA4LAQIDBAoFCgYHCAkACyABKAIAIgAQ1iYgAEEkQQQQ0REPCyABKAIAEO8qDwsgASgCACIAKAIAIABBBGooAgAQ5ykgAEE8QQQQ0REPCyABKAIAQSBBBBDREQ8LIAEoAgAQ7yoPCyABKAIAIgAQ7hUgAEE4QQQQ0REPCyABENskDwsgASgCACIAQSRqENokIABBxABBBBDREQ8LIAEoAgAiABCFGCAAQcgAQQQQ0REPCyABKAIAIgAQ1iYgAEEkQQQQ0REPCyABKAIAQRxBBBDREQvgAQEDfyMAQSBrIgIkAAJAIAMoAhAiBCADKAIUIgVNBEAgAUEEaiEBIAMoAgBBAWtBAk8EQCACQRRqIgYgASADKAIIIAMoAgwgBCAFEIAGIAJBBGogBhD1GwwCC0EAIQUCQCAEIAMoAgxPDQAgAS0AACADKAIIIARqLQAARw0AIAIgBDYCGEEBIQUgAiAEQQFqNgIcCyACIAU2AhQgAkEEaiACQRRqEPUbDAELIAJBADYCBAtBACEDIAAgAigCBEEBRgR/IAAgAikCDEIgiTcCBEEBBSADCzYCACACQSBqJAAL/QEBAX8gABCuBSAAQQRqIQECQAJAAkACQAJAAkACQAJAAkACQAJAIAAoAgAOCwECAwQKBQoGBwgJAAsgASgCACIAENYmIABBJEEEENERDwsgASgCABDvKg8LIAEoAgAiACgCACAAQQRqKAIAEOcpIABBPEEEENERDwsgASgCAEEgQQQQ0REPCyABKAIAEO8qDwsgASgCACIAEO4VIABBOEEEENERDwsgARDhJA8LIAEoAgAiAEEkahDgJCAAQcQAQQQQ0REPCyABKAIAIgAQgBggAEHIAEEEENERDwsgASgCACIAENYmIABBJEEEENERDwsgASgCAEEcQQQQ0REL6QECB38BfiMAQSBrIgIkAEGAgICAeCEEAkAgASgCAEGAgICAeEYNACABKAIEIQggAkEIaiABKAIIIgZBBEEQEPkUIAIoAggiBCAGQf////8AcSIBIAEgBEsbIQVBACEBIAIoAgwhBwNAIAVFDQEgAkEQaiABIAhqIgNBBGooAgAgA0EIaigCABDIFSACIANBDGotAAA6ABwgAikCECEJIAEgB2oiA0EIaiACQRhqKQIANwIAIAMgCTcCACAFQQFrIQUgAUEQaiEBDAALAAsgACAGNgIIIAAgBzYCBCAAIAQ2AgAgAkEgaiQAC+4BAQF/IwBBIGsiAiQAAkACQCABENgtRQRAIAJBDGogARDWByACKAIMQYCAgIB4RwRAIAJBCGogAkEUaigCADYCACACIAIpAgw3AwAgACACENsQDAILIAAgARDqBzYCGCAAQQI2AgAgAEEUaiABQRBqKAIANgIAIABBDGogAUEIaikCADcCACAAIAEpAgA3AgQMAgsgAkEQahCPHSACQQE2AgwgACACQQxqEOoHNgIYIABBAjYCACAAQRRqIAJBHGooAgA2AgAgAEEMaiACQRRqKQIANwIAIAAgAikCDDcCBAsgARCrHgsgAkEgaiQAC6YCAgV/AX4jAEEgayIEJAAgASgCBCABKAIAa0EDdiICIAAoAgAgACgCCCIDa0sEQCAAIAMgAkEEQQgQwBcgACgCCCEDCyAAKAIEIARBGGogAUEQaigCADYCACAEQRBqIAFBCGopAgA3AwAgBCABKQIAIgc3AwggA0EDdGohAiADIAQoAgwiBSAHpyIBa0EDdmohAwNAIAEgBUcEQCACIAEpAgA3AgAgAUEIaiEBIAJBCGohAgwBCwsgACADNgIIIARChICAgMAANwMIIARBCGoiACgCECIBBEAgACgCDCIFIAAoAggiAygCCCICRwRAIAMoAgQiBiACQQN0aiAGIAVBA3RqIAFBA3QQ0C0aIAAoAhAhAQsgAyABIAJqNgIICyAEQSBqJAAL1AECBH8BfiMAQSBrIgQkAEGBgICAeCEFAkAgASgCACIGIAJrIANPDQBBACEFIAIgA2oiAyACSQ0AIAOtQhR+IghCIIinDQAgCKciB0H8////B0sNACAEIAYEfyAEIAZBFGw2AhwgBCABKAIENgIUQQQFQQALNgIYIARBCGogByAEQRRqEMcNIAQoAghBAUYEQCAEKAIQIQIgBCgCDCEFDAELIAQoAgwhAiABIAM2AgAgASACNgIEQYGAgIB4IQULIAAgAjYCBCAAIAU2AgAgBEEgaiQAC+kBAQN/IwBBEGsiAyQAIAAoAggiBUGAgARJBEAgACgCFCIEIAAoAgxGBEAgAEEMahDqFgsgACAEQQFqNgIUIAAoAhAgBEECdGogBTYCACADQQhqIAJBAUEBELkUIAMoAgghBCADKAIMIAEgAhD8BiEFIAAoAggiASAAKAIARgRAIAAQ6xYLIAAgAUEBajYCCCAAKAIEIAFBDGxqIgEgAjYCCCABIAU2AgQgASAENgIAIAAgACgCHCACajYCHCAAIAAoAhgiACACIAAgAkkbNgIYIANBEGokAA8LQayrwABBN0Hkq8AAEO4XAAviAQEGfyMAQRBrIgIkACACQQhqIAFBAXYiAyAAIANB+PPgABCfHiACKAIMIQYgAigCCCEFIAIgAyAAIAFBAnRqIANBAnQiAGsgA0GI9OAAEJ8eIAAgAigCAGpBBGshAEEAIQEgAigCBCEHAkACQANAIAEgA2oiBEUNASABIAZqRQ0CIAcgBEEBayIESwRAIAUoAgAhBCAFIAAoAgA2AgAgACAENgIAIAVBBGohBSAAQQRrIQAgAUEBayEBDAELCyAEIAdBqPTgABCtEAALIAJBEGokAA8LIAYgBkGY9OAAEK0QAAuOAgEEfyMAQRBrIgQkAAJAIAEtABRBAkYNACAEQQhqIAEQlgwCQCAEKAIIIgIgBCgCDCIDQey14ABBBhDjHw0AIAIgA0GBtuAAQQQQ4x8NACACIANB07XgAEEGEOMfDQAgAiADQdm14ABBBhDjHw0AIAIgA0HJteAAQQMQ4x8NACACIANBzLXgAEEHEOMfDQAgAiADQd+14ABBBxDjHw0AIAIgA0HmteAAQQYQ4x8NACACIANB8rXgAEEGEOMfDQAgAiADQcev4ABBBBDjHw0AIAIgA0GFtuAAQQUQ4x8NACACIANBirbgAEEJEOMfRQ0BCyAAIAEpAwg3AgRBASEFCyAAIAU2AgAgBEEQaiQAC4oCAQF+AkACQAJAAkACQAJAAkACQCAAKAIAQQFrDgcCAwQFBgcAAQsgACgCBCIAKQMIIQECQCAAKAIARQRAIAEQ8RoMAQsgASAAQRhqKQMAEIgrCyAALQBFQQNHBEAgAEEgahCgHQsgAEHYAEEIENERDwsgACkDCBDxGiAAQSBqEPkVDwsgACkDCBDxGiAAKAIgELQYDwsgACgCBBDqKA8LIAAoAgQQ3CgPCyAAKAIEEIYeDwsgACgCBCIAKQMIEPEaIAAoAiAQuR4gAEEkahCJBSAAQTBBCBDREQ8LIAAoAgQiACkDABDxGiAAQSBqEJYSIAAoAiAgAEEkaigCABCOKiAAQTBBCBDREQuKAgEBfgJAAkACQAJAAkACQAJAAkAgACgCAEEBaw4HAgMEBQYHAAELIAAoAgQiACkDCCEBAkAgACgCAEUEQCABEPEaDAELIAEgAEEYaikDABCIKwsgAC0ARUEDRwRAIABBIGoQoB0LIABB2ABBCBDREQ8LIAApAwgQ8RogAEEgahD6FQ8LIAApAwgQ8RogACgCIBC1GA8LIAAoAgQQ6igPCyAAKAIEENwoDwsgACgCBBCGHg8LIAAoAgQiACkDCBDxGiAAKAIgELkeIABBJGoQigUgAEEwQQgQ0REPCyAAKAIEIgApAwAQ8RogAEEgahCWEiAAKAIgIABBJGooAgAQjiogAEEwQQgQ0RELigIBAX4CQAJAAkACQAJAAkACQAJAIAAoAgBBAWsOBwIDBAUGBwABCyAAKAIEIgApAwghAQJAIAAoAgBFBEAgARDxGgwBCyABIABBGGopAwAQiCsLIAAtAEVBA0cEQCAAQSBqEPIZCyAAQdgAQQgQ0REPCyAAKQMIEPEaIABBIGoQgBYPCyAAKQMIEPEaIAAoAiAQuhgPCyAAKAIEEOooDwsgACgCBBDcKA8LIAAoAgQQhh4PCyAAKAIEIgApAwgQ8RogACgCIBC5HiAAQSRqEIsFIABBMEEIENERDwsgACgCBCIAKQMAEPEaIABBIGoQlhIgACgCICAAQSRqKAIAEI4qIABBMEEIENERC4oCAQF+AkACQAJAAkACQAJAAkACQCAAKAIAQQFrDgcCAwQFBgcAAQsgACgCBCIAKQMIIQECQCAAKAIARQRAIAEQ8RoMAQsgASAAQRhqKQMAEIgrCyAALQBFQQNHBEAgAEEgahDyGQsgAEHYAEEIENERDwsgACkDCBDxGiAAQSBqEIQWDwsgACkDCBDxGiAAKAIgEL8YDwsgACgCBBDqKA8LIAAoAgQQ3CgPCyAAKAIEEIYeDwsgACgCBCIAKQMIEPEaIAAoAiAQuR4gAEEkahCOBSAAQTBBCBDREQ8LIAAoAgQiACkDABDxGiAAQSBqEJYSIAAoAiAgAEEkaigCABCOKiAAQTBBCBDREQuKAgEBfgJAAkACQAJAAkACQAJAAkAgACgCAEEBaw4HAgMEBQYHAAELIAAoAgQiACkDCCEBAkAgACgCAEUEQCABEPEaDAELIAEgAEEYaikDABCIKwsgAC0ARUEDRwRAIABBIGoQ8hkLIABB2ABBCBDREQ8LIAApAwgQ8RogAEEgahCFFg8LIAApAwgQ8RogACgCIBD+HA8LIAAoAgQQ6igPCyAAKAIEENwoDwsgACgCBBCGHg8LIAAoAgQiACkDCBDxGiAAKAIgELkeIABBJGoQjwUgAEEwQQgQ0REPCyAAKAIEIgApAwAQ8RogAEEgahCWEiAAKAIgIABBJGooAgAQjiogAEEwQQgQ0RELigIBAX4CQAJAAkACQAJAAkACQAJAIAAoAgBBAWsOBwIDBAUGBwABCyAAKAIEIgApAwghAQJAIAAoAgBFBEAgARDxGgwBCyABIABBGGopAwAQiCsLIAAtAEVBA0cEQCAAQSBqEPIZCyAAQdgAQQgQ0REPCyAAKQMIEPEaIABBIGoQhhYPCyAAKQMIEPEaIAAoAiAQwhgPCyAAKAIEEOooDwsgACgCBBDcKA8LIAAoAgQQhh4PCyAAKAIEIgApAwgQ8RogACgCIBC5HiAAQSRqEJAFIABBMEEIENERDwsgACgCBCIAKQMAEPEaIABBIGoQlhIgACgCICAAQSRqKAIAEI4qIABBMEEIENERC+0BAgF/AX4jAEEgayIDJAAgA0EANgIQIANBCGogASADQRBqQdK84ABBAhCsEwJAAkACQCADLQAIQQRHBEAgAykDCCIEQv8Bg0IEUg0BCyADQRBqIAEgAigCDCACKAIQIAIoAgQgAigCCBDMAiADLQAQQQRHBEAgAykDECIEQv8Bg0IEUg0CCyADQQA2AhAgA0EIaiABIANBEGpBz7zgAEEDEKwTAkAgAy0ACEEERwRAIAMpAwgiBEL/AYNCBFINAQsgAEEEOgAADAMLIAAgBDcCAAwCCyAAIAQ3AgAMAQsgACAENwIACyADQSBqJAALigIBAX4CQAJAAkACQAJAAkACQAJAIAAoAgBBAWsOBwIDBAUGBwABCyAAKAIEIgApAwghAQJAIAAoAgBFBEAgARDxGgwBCyABIABBGGopAwAQiCsLIAAtAEVBA0cEQCAAQSBqEKAdCyAAQdgAQQgQ0REPCyAAKQMIEPEaIABBIGoQihYPCyAAKQMIEPEaIAAoAiAQzRgPCyAAKAIEEOooDwsgACgCBBDcKA8LIAAoAgQQhh4PCyAAKAIEIgApAwgQ8RogACgCIBC5HiAAQSRqEJQFIABBMEEIENERDwsgACgCBCIAKQMAEPEaIABBIGoQlhIgACgCICAAQSRqKAIAEI4qIABBMEEIENERC+cBAQd/IwBBIGsiAiQAIAEoAgAhBSABQQI2AgACQCAFQQJHBEAgASgCCCEDIAEoAgQhBAJ/IAVBAXFFBEAgAkEYaiAEIAMoAkgRAAAgAigCGCIGRQRAIAJBEGogBCADKAIYEQAAIAIoAhQhB0EBQQIgAigCECIGGwwCCyACKAIcIQdBAAwBCyACQQhqIAQgAygCGBEAACACKAIMIQdBAUECIAIoAggiBhsLIQggASAHNgIIIAEgBjYCBCABIAg2AgAgACADNgIIIAAgBDYCBCAAIAU2AgAMAQsgAEECNgIACyACQSBqJAAL3AEBB38jAEEQayIFJAACQCABKAIIIgJFBEBBACECDAELIAJBAnQiBiABKAIEIgNqQQRrKAIADQAgA0EEayEHIAIhAwJAA0AgAyEEIAZFBEBBACEEDAILIARBAWshAyAGIAdqIAZBBGshBigCAEUNAAsgAiAESQ0BCyABIAQ2AgggBCECCwJAIAIgASgCAEECdk8NACAFQQhqIAEgAhCZDyAFKAIIIgNBgYCAgHhGDQAgAyAFKAIMENwpAAsgACABKQIANwIAIABBCGogAUEIaigCADYCACAFQRBqJAAL3AEBA38jAEEgayICJAACQCADKAIQIgQgAygCFCIFTQRAIAMoAgBBAWtBAk8EQCACQRRqIgYgASADKAIIIAMoAgwgBCAFEPwNIAJBBGogBhD1GwwCC0EAIQUCQCAEIAMoAgxPDQAgASADKAIIIARqLQAAai0AAEEBRw0AIAIgBDYCGCACIARBAWo2AhxBASEFCyACIAU2AhQgAkEEaiACQRRqEPUbDAELIAJBADYCBAtBACEDIAAgAigCBEEBRgR/IAAgAikCDEIgiTcCBEEBBSADCzYCACACQSBqJAAL6QEBBn8jAEEgayIDJAAgA0EYaiABEK4ZIAMoAhwhBiADKAIYIQEDQCABIAZGBEAgAigCBCIAIAIoAggiARDiGkUEQCACEPopGiADQQhqIAAgAUEBQcjdwwAQlh1BACADKAIIIAMoAgwQ7A4LIANBIGokAA8LIAEoAgAhBCABQQRqIQECQAJAIAAgBBDyHSIFKAIAQQNrDgQBAAACAAsgAiAEEMUVDAELIAUoAgggAiAEEMUVIAIoAgQiBCACKAIIIgcQ4hogA0EQaiAEIAdBBUHY3cMAEJYdciADKAIQIAMoAhQQ7A4MAAsAC+QBAQR/IwBB4ABrIgMkACABKAIAIQUCQAJAAkAgASgCBCIEQX9HBEAgBEEBaiEEDAELIANCl4CAgHA3AkQgA0EEaiAFQQRqKAIAIAVBCGooAgAgAiADQcQAahCcDyADKAIIIQQgAygCBCIGQSJHDQELIAUoAgAoAmAiBiAETwRAIABBIjYCACABIAQ2AgQMAgsgA0EXNgIEIAMgBjYCCCAAIAVBBGooAgAgBUEIaigCACACIANBBGoQnA8MAQsgAEEIaiADQQxqQTgQ/AYaIAAgBDYCBCAAIAY2AgALIANB4ABqJAALkQIBAn9BASEDAkACQAJAAkACQAJAAkACQAJAAkACQAJAQQQgAUECa0H/AXEiBCAEQQRPG0EBaw4ECwsLAQALIAJB/wFxQQFrDiIKCgoKCgoKCgoKCgoKCgoKCgkKCgoKCgoKCgoKAgoKCgoKAQtBACEDIAFBAXENCSACQf8BcSIBQSdrDgQDBAUGAgsgAC0ABw0IIAAtAAkNCAwHCyAALQAIRQ0GDAcLAkACQCABQQ1rDgcGCAgICAABCAsgAC0AA0UNBwwFCyAALQADRQ0GDAQLIAAtAANFDQUMAwsgAC0AA0UNBAwCCyAALQADRQ0DDAELIAAtAANBAUcNAgtBASEDDAELIAAtAAMhAwsgA0EBcQv/AQEBfwJAAkACQAJAAkACQAJAAkAgACgCAEEBaw4HAgMEBQYHAAELIAAoAgQiAEEIaiEBAkAgACgCAEUEQCABEMMZDAELIAEQ7ygLIAAtAEVBA0cEQCAAQSBqEMQZCyAAQdgAQQgQ0REPCyAAQQhqEMMZIABBIGoQ/BUPCyAAQQhqEMMZIAAoAiAQthgPCyAAKAIEEOooDwsgACgCBBDcKA8LIAAoAgQQ1R0PCyAAKAIEIgBBCGoQwxkgACgCIBC5HiAAQSRqEJ0FIABBMEEIENERDwsgACgCBCIAEMMZIABBIGoQlhIgACgCICAAQSRqKAIAEI4qIABBMEEIENERC+cBAgF+Bn8jAEEQayICJAAgACgCBCIHBEAgACgCACEDAkAgACgCDCIFRQ0AIANBCGohACADKQMAQn+FQoCBgoSIkKDAgH+DIQEgAyEEQQEhBgNAIAZFDQEDQCABQgBSRQRAIARBgAFrIQQgACkDAEJ/hUKAgYKEiJCgwIB/gyEBIABBCGohAAwBCwsgBCABeqdBAXRB8AFxa0EQaykDABDxGiABQgF9IAGDIQEgBUEBayIFIQYMAAsACyACQQRqQRBBCCAHQQFqEOoNIAMgAigCDGsgAigCBCACKAIIELIkCyACQRBqJAALvwEBA38gASgCBCIEIAEoAgBGBH9BAAUgASAEQQFrIgI2AgQgAiwAACICQQBIBEAgASAEQQJrIgM2AgQgAkE/cQJ/IAMtAAAiA8AiAkFATgRAIANBH3EMAQsgASAEQQNrIgM2AgQgAkE/cQJ/IAMtAAAiA8AiAkFATgRAIANBD3EMAQsgASAEQQRrIgE2AgQgAkE/cSABLQAAQQdxQQZ0cgtBBnRyC0EGdHIhAgtBAQshASAAIAI2AgQgACABNgIAC8wBACAAAn8gAUGAAU8EQCABQYAQTwRAIAFBgIAETwRAIAIgAUE/cUGAAXI6AAMgAiABQQZ2QT9xQYABcjoAAiACIAFBDHZBP3FBgAFyOgABIAIgAUESdkEHcUHwAXI6AABBBAwDCyACIAFBP3FBgAFyOgACIAIgAUEMdkHgAXI6AAAgAiABQQZ2QT9xQYABcjoAAUEDDAILIAIgAUE/cUGAAXI6AAEgAiABQQZ2QcABcjoAAEECDAELIAIgAToAAEEBCzYCBCAAIAI2AgALqwICAX8DfiMAQSBrIgEkAAJAIAAEQCAAQQFGDQEgAUEANgIYIAFBATYCDCABQYSo2AA2AgggAUIENwIQIAFBCGpBqKjYABC6HQwBC0H0j+QAQQE2AgACQEGYjOQAKQMAIgNQBEBBoIzkACkDACECA0AgAkJ/UQ0CQaCM5AAgAkIBfCIDQaCM5AApAwAiBCACIARRIgAbNwMAIAQhAiAARQ0AC0GYjOQAIAM3AwALQfiW5AAtAAAaQSBBCBC9ISIARQ0BIABBAjYCECAAQoKAgIAQNwIAIAAgAzcDCEH0j+QAIABBCGo2AgAgAUEgaiQAIAAPCyMAQSBrIgAkACAAQQA2AhggAEEBNgIMIABBkKnYADYCCCAAQgQ3AhAgAEEIakGYqdgAELodAAsAC98BAgR/An4gASgCACIDIAFBDGooAgAiBCABQRhrKAIAIAFBDGsoAgAQxh1B/wFxQf8BRgRAIAFBMGshAiABKQIQIQYgASkCBCEHAn8CQANAIAIiAUFAayABQShqKQIANwIAIAFBOGogAUEgaikCADcCACABQTBqIAFBGGoiBSICKQIANwIAIAAgAkYNASABQRhrIQIgAyAEIAEoAgAgAUEMaigCABDGHUH/AXFB/wFGDQALIAUMAQsgAUEYagshAiABQRhqIAM2AgAgAiAGNwIQIAIgBDYCDCACIAc3AgQLC98BAgF+Bn8jAEEQayICJAAgACgCBCIHBEAgACgCACEDAkAgACgCDCIFRQ0AIANBCGohACADKQMAQn+FQoCBgoSIkKDAgH+DIQFBASEGIAMhBANAIAZFDQEDQCABQgBSRQRAIARB4ABrIQQgACkDAEJ/hUKAgYKEiJCgwIB/gyEBIABBCGohAAwBCwsgBCABeqdBA3ZBdGxqQQxrEPEeIAFCAX0gAYMhASAFQQFrIgUhBgwACwALIAJBBGogB0EBahDtDiADIAIoAgxrIAIoAgQgAigCCBCyJAsgAkEQaiQAC9QBAQJ/AkACQAJAAkACQAJAAkACQEEQIAAoAgAiAUECayICIAJBI08bDiIBAgICAgICAgICAgICAgICAwICAgICAgICBwcGBAYHAgIFAAsgAEEEahD/Ig8LIAAtAAgiAUEFTSABQQFHcQ0AIAApAxAQ8RoLDwsgACkDEBDxGiABRQRADAMLIABBBGoQ/yIPCyAAKAIQIgEoAgAgAUEEaigCABDZKSABQRBBBBDREQwBCyAAKQMIEPEaDwsgACkDCBDxGg8LIAApAwgQ8RogACkDEBDxGguHAgEBfyMAQeAAayICJAAgACgCACEAIAJB1JDaADYCWCACQdD22AA2AlAgAiAAQT5qNgJMIAJB0PbYADYCSCACIABBPWo2AkQgAkGI+NgANgJAIAIgAEFAazYCPCACQfj32AA2AjggAiAAQShqNgI0IAJB0PbYADYCMCACIABBPGo2AiwgAkHo99gANgIoIAIgAEE4ajYCJCACQej22AA2AiAgAiAAQTRqNgIcIAJB2P3YADYCGCACIAA2AhQgAkHgj9oANgIQIAIgAEEgajYCDCACIABBP2o2AlwgAiACQdwAajYCVCABQc762ABBDEHo/dgAQQogAkEMakEKEM4IIAJB4ABqJAAL7AECBH8DfiMAQRBrIgUkACAAQQRrIQcgASACcSEGIAJBGXatQoGChIiQoMCAAX4hCkEAIQIDQCAFIAAgBmopAAAiCSAKhSILQn+FIAtCgYKEiJCgwIABfYNCgIGChIiQoMCAf4M3AwgDQCAFIAVBCGoQqhcgBSgCAEUEQCAJIAlCAYaDQoCBgoSIkKDAgH+DUARAIAJBCGoiAiAGaiABcSEGDAMLQdy33wBBD0Hst98AELUSAAsgByAFKAIEIAZqIAFxIghBAnRrKAIAIANHDQALCyAAQQAgCGtBAnRqQQRrIAQ2AgAgBUEQaiQAC9QBAQJ/AkACQAJAAkACQAJAAkACQEEQIAAoAgAiAUECayICIAJBI08bDiIBBQUFBQUFBQUFBQUFBQUFAgUFBQUFBQUFBgYHAwcGBQUEAAsgAEEEahC2Bg8LIAAtAAgiAUEFTSABQQFHcQ0DIAApAxAQ8RoPCyAAKQMQEPEaIAFFBEAMBQsgAEEEahC2Bg8LIAAoAhAiASgCACABQQRqKAIAENkpIAFBEEEEENERDAMLIAApAwgQ8RoLDwsgACkDCBDxGiAAKQMQEPEaDwsgACkDCBDxGgvUAQECfwJAAkACQAJAAkACQAJAAkBBECAAKAIAIgFBAmsiAiACQSNPGw4iAQICAgICAgICAgICAgICAgMCAgICAgICAgcHBgQGBwICBQALIABBBGoQtgYPCyAALQAIIgFBBU0gAUEBR3ENACAAKQMQEPEaCw8LIAApAxAQ8RogAUUEQAwDCyAAQQRqELYGDwsgACgCECIBKAIAIAFBBGooAgAQ2SkgAUEQQQQQ0REMAQsgACkDCBDxGg8LIAApAwgQ8RoPCyAAKQMIEPEaIAApAxAQ8RoL3gEBBX8jAEEgayICJAAgAkKAgICAwAA3AgxBBCEFA0AgAiADNgIUAkADQCAEQYACRg0BIAAgBGogBEEBaiEELQAARQ0ACyACKAIMIANGBEAgAkEMahDqFiACKAIQIQULIAUgA0ECdGogACAEakEBazYCACADQQFqIQMMAQsLIAEoAhRBoJTAAEEPIAEoAhgoAgwRAwAhACACQQA6AB0gAiAAOgAcIAIgATYCGCACQRhqQbvE4ABBAyACQQxqIgBBGxD0BhCsECAAKAIAIAAoAgRBBEEEEMsiIAJBIGokAAvTAQEDfyMAQSBrIgEkAAJAIAIoAhAiBCACKAIUIgVNBEAgAigCAEEBa0ECTwRAIAFBFGoiBiAAQQRqIAIoAgggAigCDCAEIAUQyAUgAUEEaiAGEPUbDAILQQAhBQJAIAQgAigCDE8NACACKAIIIARqLQAAIgIgAC0ABEcEQCAALQAFIAJHDQELIAEgBDYCGEEBIQUgASAEQQFqNgIcCyABIAU2AhQgAUEEaiABQRRqEPUbDAELIAFBADYCBAsgASgCBEEBRgRAIAMQxBULIAFBIGokAAvjAQICfwF+IwBBMGsiAyQAIANBCGogASACEOcKIAMpAgwhBQJAAkAgAygCCCIEQYCAgIB4RgRAIAWnQQFxDQEgBUKAgICAgBBaBEAgACABKAIEIAEoAgggAkEEakEAEN4YDAMLIABBgICAgHg2AgAgACAFQiCIPAAEDAILIAAgAykCFDcCDCAAQSRqIANBLGooAgA2AgAgAEEcaiADQSRqKQIANwIAIABBFGogA0EcaikCADcCACAAIAU3AgQgACAENgIADAELIABBgICAgHg2AgAgACAFQgiIPAAECyADQTBqJAAL5wEBA38gACgCCEEMbCEDIAAoAgQhAANAIAMEQAJAIAAoAgAEQCAAIAEQwCwMAQsCQAJAAkACQAJAQQQgACgCBCICKAIAQQVrIgQgBEEGTxtBAWsOBQABAgMEBQsgAkEIaiABEPMhIAJBKGogARDALAwECyACQShqIAEQwCwMAwsgAkEIaiABEPMhIAEgAkEoahDWIwwCCyACIAEQ8yEgAkEgaiABENcjIAJB6ABqIAEQ0ywgASACQcgAahDWIwwBCyACQQhqIAEQ8yEgAigCKCABEJ4SCyAAQQxqIQAgA0EMayEDDAELCwuEAgEBfwJAAkACQAJAAkACQAJAAkACQCAAKAIADggBAgMEBQYHCAALIAApAxAQ8RoPCyAAKAIIIgEgACgCDBD+DyAAKAIEIAEQkSogACgCEBDQISAAKAIcEPgiDwsgAEEIahD6CQ8LIAAoAggiASAAKAIMEPUQIAAoAgQgARCSKiAAKAIYIgEEQCABENAhCyAAKAIcEPgiDwsCQAJAAkAgACgCCA4CAQIACyAAKAIMEIYeDwsgAEEQahDqIw8LIABBEGoQziUPCyAAQQRqEIopDwsgACgCBBDQISAAKAIQEPgiDwsgACgCBCIAKQMoEPEaIAAQnB8gABD1LA8LIABBBGoQiikL5wEBA38gACgCCEEMbCEDIAAoAgQhAANAIAMEQAJAIAAoAgAEQCAAIAEQ/SwMAQsCQAJAAkACQAJAQQQgACgCBCICKAIAQQVrIgQgBEEGTxtBAWsOBQABAgMEBQsgAkEIaiABEJEiIAJBKGogARD9LAwECyACQShqIAEQ/SwMAwsgAkEIaiABEJEiIAJBKGogARDzIwwCCyACIAEQkSIgAkEgaiABEPQjIAJB6ABqIAEQhS0gAkHIAGogARDzIwwBCyACQQhqIAEQkSIgAigCKCABEKQSCyAAQQxqIQAgA0EMayEDDAELCwvnAQEDfyAAKAIIQQxsIQMgACgCBCEAA0AgAwRAAkAgACgCAARAIAAgARD7LAwBCwJAAkACQAJAAkBBBCAAKAIEIgIoAgBBBWsiBCAEQQZPG0EBaw4FAAECAwQFCyACQQhqIAEQkiIgAkEoaiABEPssDAQLIAJBKGogARD7LAwDCyACQQhqIAEQkiIgASACQShqEPUjDAILIAIgARCSIiACQSBqIAEQ9iMgAkHoAGogARCGLSABIAJByABqEPUjDAELIAJBCGogARCSIiACKAIoIAEQpRILIABBDGohACADQQxrIQMMAQsLC+cBAgN+BX8gACgCDEUEQEEADwsgASkDACABKAIIEKscIQIgACgCACIHQRBrIQggAkIZiEKBgoSIkKDAgAF+IQQgACgCBCIFIAKncSEAA0AgACAHaikAACIDIASFIgJCf4UgAkKBgoSIkKDAgAF9g0KAgYKEiJCgwIB/gyECAkACQANAAkAgAkIAUiEJIAJQDQAgASAIIAJ6p0EDdiAAaiAFcUEEdGsQ1R8NAiACQgF9IAKDIQIMAQsLIAMgA0IBhoNCgIGChIiQoMCAf4NQDQELIAkPCyAAIAZBCGoiBmogBXEhAAwACwAL4wECAX8BfiMAQSBrIgMkACADQQA2AgwgA0EYaiABIANBDGpB2rTgAEEBEKwTAkACQAJAIAMtABhBBEcEQCADKQMYIgRC/wGDQgRSDQELAkAgAigCAEEBRw0AIANBGGogAkEEaiABEL4qIAMtABhBBEYNACADKQMYIgRC/wGDQgRSDQILIANBGGogASADQQxqQdu04ABBARCsEwJAIAMtABhBBEcEQCADKQMYIgRC/wGDQgRSDQELIABBBDoAAAwDCyAAIAQ3AgAMAgsgACAENwIADAELIAAgBDcCAAsgA0EgaiQAC/ABAgJ/AX4jAEEgayIFJABBCBDjICIGIAI2AgQgBiABNgIAIAVBFGoiAiAAQQMgAyAEEIYKIAVBCGpBAUEEQQgQ+RQgBSgCCCEDIAUoAgwiBCAGKQIANwIAIAVBAEEEQRQQ+RQgBSkDACEHIAUoAhgiAUEcahC4HyABQQA2AjAgASAHNwIoIAFBATYCJCABIAQ2AiAgASADNgIcIAIQxwEgAEHcAGoiARDpHyAALQBdIQIgARDZHgJAIAINACAAKAIARQ0AQQAQhBcaAAsgBUEUahCVC0EBIAYQ4ClBBEEAEOAcQQBBBBDfKSAFQSBqJAAL5gECAX8BfiMAQRBrIgMkAAJAAkACQAJAAkACQCABKAIAQQFrDgIBAgALIAMgAUEEajYCBCADQQhqIANBBGogAhCuEyADLQAIQQRGDQIgAykDCCIEQv8Bg0IEUQ0CIAAgBDcCAAwECyADIAFBBGo2AgQgA0EIaiADQQRqIAIQlAYgAy0ACEEERg0BIAMpAwgiBEL/AYNCBFENASAAIAQ3AgAMAwsgA0EIaiABQQRqIAIQwSogAy0ACEEERg0AIAMpAwgiBEL/AYNCBFINAQsgAEEEOgAADAELIAAgBDcCAAsgA0EQaiQAC8wEAQV/IwBBEGsiByQAAkACQAJAIAACfwJAIAEoAvgEIgUtANoCRQRAIAdBBGogASACIAMQPiAHKAIEIgFBAkcNAQwECyAFLQDbAiEEIAdBBGogASACIAMQPiAHKAIEIgVBAkYNAyAFRQ0CIAcoAgghBSAHKAIMIgYgBEEBcUUNARojAEEwayIEJAACQAJAIAMoAgAiCEEBa0ECTwRAIAQgAygCBDYCDCAEIAg2AgggBCADKAIUNgIcIAQgAygCEDYCGCAEIAMoAgw2AhQgBCADKAIINgIQIAQgAy0AGDoAIAJAAkADQAJAIAYgBCgCFCIDTwRAIAMgBkcNAQwGCyAEKAIQIAZqLAAAQb9/Sg0FCyAEKAIYIgNBf0YNASAEQQhqIgUgA0EBahD/KSAEQSRqIAEgAiAFED4gBCgCKCEFIAQoAiQiA0ECRgRAIAAgBTYCBEECIQYMAwsgBCgCLCEGIANBAUYNAAtBACEGDAELQfjpwwAQ2ikACyAAIAY2AgAMAgsCQAJAIAYgAygCDCIBTwRAIAEgBkYNAQwCCyADKAIIIAZqLAAAQb9/TA0BCyAAIAY2AgggACAFNgIEIABBATYCAAwCCyAAIAY2AgggACAFNgIEIABBADYCAAwBCyAAIAY2AgggACAFNgIEIABBATYCAAsgBEEwaiQADAQLIAFFDQEgBygCCCEFIAcoAgwLNgIIIAAgBTYCBCAAQQE2AgAMAgsgAEEANgIADAELIAcoAgghASAAQQI2AgAgACABNgIECyAHQRBqJAALwQQBBX8jAEEQayIHJAACQAJAAkAgAAJ/AkAgASgC+AQiBS0A2gJFBEAgB0EEaiABIAIgAxBtIAcoAgQiAUECRw0BDAQLIAUtANsCIQQgB0EEaiABIAIgAxBtIAcoAgQiBUECRg0DIAVFDQIgBygCCCEFIAcoAgwiBiAEQQFxRQ0BGiMAQTBrIgQkAAJAAkAgAygCACIIQQFrQQJPBEAgBCADKAIENgIMIAQgCDYCCCAEIAMoAhQ2AhwgBCADKAIQNgIYIAQgAygCDDYCFCAEIAMoAgg2AhAgBCADLQAYOgAgA0ACQCAGIAQoAhQiA08EQCADIAZHDQEMBAsgBCgCECAGaiwAAEG/f0oNAwtBACEDAkAgBCgCHCIFRQ0AIARBCGoiBiAEKAIYIAVBAWsQsAwgBEEkaiABIAIgBhBtIAQoAighBSAEKAIkIghBAkYEQCAAIAU2AgRBAiEDDAELIAQoAiwhBiAIQQFGDQELCyAAIAM2AgAMAgsCQAJAIAYgAygCDCIBTwRAIAEgBkYNAQwCCyADKAIIIAZqLAAAQb9/TA0BCyAAIAY2AgggACAFNgIEIABBATYCAAwCCyAAIAY2AgggACAFNgIEIABBADYCAAwBCyAAIAY2AgggACAFNgIEIABBATYCAAsgBEEwaiQADAQLIAFFDQEgBygCCCEFIAcoAgwLNgIIIAAgBTYCBCAAQQE2AgAMAgsgAEEANgIADAELIAcoAgghASAAQQI2AgAgACABNgIECyAHQRBqJAAL4gECCn8CfiABKAIAIAIoAgwiBkEcbGoiA0EIaiIHKQIAIQ0gA0EQaiIIKQIAIQ4gA0EYaiIJKAIAIQogACgCBCELIAIoAggiASgCBCEMIAAoAgAhBCABKAIAIQUgAigCACIAIAMpAgA3AgAgAEEYaiAKNgIAIABBEGogDjcCACAAQQhqIA03AgAgCSABQRhqKAIANgIAIAggAUEQaikCADcCACAHIAFBCGopAgA3AgAgAyABKQIANwIAIAIgBiALIAxLIAQgBUsgBCAFRhtqNgIMIAIgATYCACACIAFBHGo2AggL4gECCn8CfiABKAIAIAIoAgwiBkEcbGoiA0EIaiIHKQIAIQ0gA0EQaiIIKQIAIQ4gA0EYaiIJKAIAIQogACgCBCELIAIoAggiASgCBCEMIAAoAgAhBCABKAIAIQUgAigCACIAIAMpAgA3AgAgAEEYaiAKNgIAIABBEGogDjcCACAAQQhqIA03AgAgCSABQRhqKAIANgIAIAggAUEQaikCADcCACAHIAFBCGopAgA3AgAgAyABKQIANwIAIAIgBiALIAxPIAQgBU8gBCAFRhtqNgIMIAIgATYCACACIAFBHGo2AggL3QEBA38jAEEQayIDJAACfyACKAIAQQFxBEBBkLPYACEEQQkMAQsgA0EEaiACKAIEIAIoAggQ1QNBkLPYACADKAIIIAMoAgQiAhshBEEJIAMoAgwgAhsLIQIgBCACIAEQowsCQCAAKAIAIgFBgICAgHhHBEAgAUUNASAAKAIEIAFBARDREQwBCyAALQAEQQNHDQAgACgCCCIAKAIAIQEgAEEEaigCACICKAIAIgUEQCABIAURAQALIAIoAgQiBQRAIAEgBSACKAIIENERCyAAQQxBBBDREQsgA0EQaiQAC4ECAQF+AkACQAJAAkACQAJAAkACQCAAKAIAQQFrDgcCAwQFBgcAAQsgACgCBCIAKQMIIQECQCAAKAIARQRAIAEQ8RoMAQsgASAAQRhqKQMAEIgrCyAALQBFQQNHBEAgAEEgahDYGwsgABCTKw8LIAApAwgQ8RogAEEgahCCFg8LIAApAwgQ8RogACgCIBC9GA8LIAAoAgQQkCsPCyAAKAIEENwoDwsgACgCBBCGHg8LIAAoAgQiACkDCBDxGiAAKAIgELkeIABBJGoQjQUgAEEwQQgQ0REPCyAAKAIEIgApAwAQ8RogAEEgahCWEiAAKAIgIABBJGooAgAQjiogABCUKwvLAQEFfyMAQSBrIgMkACADQQhqIAIgAWsiBEEAIAIgBE8bIgRBBEEEELkUIANBADYCHCADIAMoAgwiBjYCGCADIAMoAggiBzYCFCAEIAdLBEAgA0EUakEAIARBBEEEEKwXIAMoAhghBiADKAIcIQULIAYgBUECdGohBCAFIAIgASABIAJJGyICaiABayEFA0AgASACRkUEQCAEIAE2AgAgBEEEaiEEIAFBAWohAQwBCwsgACADKQIUNwIAIABBCGogBTYCACADQSBqJAAL3QEBAn8jAEFAaiIEJAAgBCADNgIQIAQgAjYCDCACIANBAWpNIAEoAgwiBSADT3FFBEAgBEECNgIYIARByLPgADYCFCAEQgI3AiAgBEEJNgI4IARB+wA2AjAgBCAFNgI8IAQgBEEsajYCHCAEIARBPGo2AjQgBCAEQQxqNgIsIARBFGpB2LPgABC6HQALIAEgAzYCFCABQRBqIgMgAjYCACAAQRhqIAFBGGooAgA2AgAgAEEQaiADKQIANwIAIABBCGogAUEIaikCADcCACAAIAEpAgA3AgAgBEFAayQAC8cBAQV/AkAgASgCACICIAEoAgRGBEAMAQtBASEGIAEgAkEBajYCACACLQAAIgPAQQBODQAgASACQQJqNgIAIAItAAFBP3EhBCADQR9xIQUgA0HfAU0EQCAFQQZ0IARyIQMMAQsgASACQQNqNgIAIAItAAJBP3EgBEEGdHIhBCADQfABSQRAIAQgBUEMdHIhAwwBCyABIAJBBGo2AgAgBUESdEGAgPAAcSACLQADQT9xIARBBnRyciEDCyAAIAM2AgQgACAGNgIAC8sBAQZ/IwBBIGsiAiQAIAJBCGpBAUEEQQgQ+RQgAkEANgIYIAIgAikDCDcDECACQRBqQQEQ/h4gAigCGCIDQQFqIQUgAigCFCADQQN0aiEDIAFCIIinIQYgAachBwNAIARFBEAgAyAHNgIAIANBBGogBjYCACADQQhqIQNBASEEDAELCyACKQMQIQEgAkEYaiIDIAU2AgAgAiAFRToAHCACIAE3AxAgAkEQahCIBSAAQQhqIAMpAwA3AgAgACACKQMQNwIAIAJBIGokAAvtAQEDfyMAQRBrIgMkAAJAAkACQAJAAkACQAJAQQQgASgCAEEFayICIAJBBk8bQQFrDgUBAgMEBQALIAEoAhQhAiABKAIQIQEMBQsgA0EIaiABKAIoEI0DIAEoAghBAnRBrOnjAGooAgAgAUEIamooAgAiAiADKAIMIgQgAiAESRshASACIAQgAiAESxshAgwECyABKAIMIQIgASgCCCEBDAMLIAEoAkQhAiABKAJAIQEMAgsgASgCZCECIAEoAmAhAQwBCyABKAIoIgEoAjQhAiABKAIwIQELIAAgAjYCBCAAIAE2AgAgA0EQaiQAC+IBAgN+BX8gACgCDEUEQEEADwsgASkDABCWHyECIAAoAgAiB0EIayEIIAJCGYhCgYKEiJCgwIABfiEEIAAoAgQiBSACp3EhAANAIAAgB2opAAAiAyAEhSICQn+FIAJCgYKEiJCgwIABfYNCgIGChIiQoMCAf4MhAgJAAkADQAJAIAJCAFIhCSACUA0AIAEgCCACeqdBA3YgAGogBXFBA3RrELILDQIgAkIBfSACgyECDAELCyADIANCAYaDQoCBgoSIkKDAgH+DUA0BCyAJDwsgACAGQQhqIgZqIAVxIQAMAAsAC+YBAgZ/A34jAEEQayIDJAAgACgCACIFQQRrIQcgACgCBCIGIAFxIQQgAUEZdq1CgYKEiJCgwIABfiEKQQAhAQJAA0AgAyAEIAVqKQAAIgkgCoUiC0J/hSALQoGChIiQoMCAAX2DQoCBgoSIkKDAgH+DNwMIA0AgAyADQQhqEKoXIAMoAgBFBEAgCSAJQgGGg0KAgYKEiJCgwIB/g1BFDQMgAUEIaiIBIARqIAZxIQQMAgsgByADKAIEIARqIAZxIghBAnRrKAIAIAJHDQALCyAAIAVBACAIa0ECdGoQ5S0LIANBEGokAAvwAQEDfyAAKAIIQQxsIQMgACgCBCEAA0AgAwRAAkAgACgCAARAIAAgARD+LAwBCwJAAkACQAJAAkBBBCAAKAIEIgIoAgBBBWsiBCAEQQZPG0EBaw4FAAECAwQFCyACQQhqIAEQjSIgAkEoaiABEP4sDAQLIAJBKGogARD+LAwDCyACQQhqIAEQjSIgAigCSCICRQ0CIAIgARDTAwwCCyACIAEQjSIgAkEgaiIEKAIAQQdHBEAgBCABEKoRCyACQegAaiABEIAtDAELIAJBCGogARCNIiACKAIoIAEQpBALIABBDGohACADQQxrIQMMAQsLC9oBAgN/AX4jAEEgayIGJAAgASACENMaIQkgBkEYaiABIAJBABDxCCAGKAIcIQggBigCGCEHIAZBEGogASACQQEQ8QggBkEIaiABIAIgCCAGKAIUIAcgBigCECIBSyICGyAHIAEgAhsiARCkByAGKAIMIQIgBigCCCEHIAUoAgAEfyAAIAUpAgA3AhggAEEgaiAFQQhqKAIANgIAQRcFQRYLIQUgACAENgIsIAAgAzYCKCAAIAE2AhAgACAJNwMIIAAgBzYCACAAIAU2AjAgACACNgIEIAZBIGokAAvoAQEBfyMAQRBrIhckACAAKAIUIAEgAiAAKAIYKAIMEQMAIQEgF0EAOgANIBcgAToADCAXIAA2AgggF0EIaiADIAQgBSAGEPQGIAcgCCAJIAoQ9AYgCyAMIA0gDhD0BiAPIBAgESASEPQGIBMgFCAVIBYQ9AYhASAXLQANIgIgFy0ADCIDciEAAkAgA0EBcSACQQFHcg0AIAEoAgAiAC0AHEEEcUUEQCAAKAIUQbPX1gBBAiAAKAIYKAIMEQMAIQAMAQsgACgCFEHbtOAAQQEgACgCGCgCDBEDACEACyAXQRBqJAAgAEEBcQvQAQEGfwJAIAAtAAwNACAAKAIIIQYDQCAFIAZGBEAgABD8BCAAQQE6AAwMAgtB4QAgACgCBCAAKAIIIAVBtLzHABDNHyIBLQAAIgIgAkHhAE0bIgNB+gAgAS0AASIBIAFB+gBPGyIETQRAIAAgA0Ega0H/AXEiAyAEQSBrQf8BcSIEIAMgBEkbIAMgBCADIARLGxDdGAtBwQAgAiACQcEATRsiAkHaACABIAFB2gBPGyIBTQRAIAAgAkEgaiABQSBqEN0YCyAFQQFqIQUMAAsACwvxAQEDfyMAQRBrIgUkAEH4luQALQAAGgJAQRAQYCIGBEAgBUEEaiAEQQFBARCiCyAFKAIIIQcgBSgCBEEBRg0BIAUoAgwgAyAEEPwGIQMgBkETOgAMIAYgBDYCCCAGIAM2AgQgBiAHNgIAQdAAEOMgIgMgAjoATCADQQA2AkggA0KAgICAwAA3AkAgA0IENwI4IANCADcCMCADQoCAgIDAADcCKCADQgQ3AiAgA0IBNwIYIAMgBjYCFCADQQE2AhAgA0ECNgIAIABBAToACCAAIAM2AgQgACABNgIAIAVBEGokAA8LAAsgByAFKAIMENwpAAvhAQIGfwF+IwBBIGsiAiQAIAJBCGogAUGI+d8AQQVBABC5AiACKAIMIQMgAAJ/IAIoAghFBEBBAyEEAkAgA0UNACADIAIoAhAiBUHAuuAAQQYQ4x8EQEEAIQQMAQsgAyAFQca64ABBCRDjHwRAQQEhBAwBCyADIAVBz7rgAEEHEOMfBEBBAiEEDAELIAEoApwDIQYgASgCmAMhByADIAUQ1BohCCACQaQBOgAIIAIgCDcDECABIAcgBiACQQhqEL4ZCyAAIAQ6AAFBAAwBCyAAIAM2AgRBAQs6AAAgAkEgaiQAC9sBAgF/A34jAEHQAGsiAyQAIANBGGogAikDACACKAIQELcjIAMgAygCIDYCMCADIAMpAxgiBDcDKAJAIAEgA0EoahDuIyIBBEAgA0EIaiABKQMAIAFBCGooAgAQ1BUgACADKQMIIgRQBH9BBgUgAygCECEBIANBOGogAhDOGyADKQM4IQUgAykDQCEGIAAgATYCKCAAQgA3AyAgACAENwMYIABCADcDECAAIAY3AwggACAFNwMAQQALOgAsIAMpAygQ8RoMAQsgAEEGOgAsIAQQ8RoLIANB0ABqJAAL3wECBn8BfiMAQSBrIgIkACACQQhqIAFBiPnfAEEFQQAQsgIgAigCDCEDIAACfyACKAIIRQRAQQMhBAJAIANFDQAgAyACKAIQIgVBwLrgAEEGEOMfBEBBACEEDAELIAMgBUHGuuAAQQkQ4x8EQEEBIQQMAQsgAyAFQc+64ABBBxDjHwRAQQIhBAwBCyABKAJ8IQYgASgCeCEHIAMgBRDUGiEIIAJBpAE6AAggAiAINwMQIAEgByAGIAJBCGoQ0BkLIAAgBDoAAUEADAELIAAgAzYCBEEBCzoAACACQSBqJAALzAEBAX8CfwJAAkACQAJAAkACQAJAAkACQCABKAIAQQFrDggBAgMEBQYHCAALIAFBGGohAiABQRRqDAgLIAFBNGohAiABQTBqDAcLIAFBFGohAiABQRBqDAYLIAFBNGohAiABQTBqDAULIAFBDGohAiABQQhqDAQLIAFBDGohAiABQQhqDAMLIAEoAgQiAUEkaiECIAFBIGoMAgsgAUEMaiECIAFBCGoMAQsgAUEMaiECIAFBCGoLIQEgACACKAIANgIEIAAgASgCADYCAAvIAQEDfyMAQSBrIgEkAAJAIAIoAhAiAyACKAIUIgRNBEAgAigCAEEBa0ECTwRAIAFBFGoiBSAAQQRqIAIoAgggAigCDCADIAQQyAUgAUEEaiAFEPUbDAILQQAhBAJAIAMgAigCDE8NACACKAIIIANqLQAAIgIgAC0ABEcEQCAALQAFIAJHDQELIAEgAzYCGEEBIQQgASADQQFqNgIcCyABIAQ2AhQgAUEEaiABQRRqEPUbDAELIAFBADYCBAsgASgCBCABQSBqJAALzAECBX8BfiMAQSBrIgIkACACQQhqQQFBAUECEPkUIAJBADYCGCACIAIpAwg3AxAgAkEQakEBEP8eIAFBgP4DcUEIdiEGIAIoAhgiA0EBaiEFIAIoAhQgA0EBdGohAwNAIARFBEAgAyABOgAAQQEhBCADQQFqIAY6AAAgA0ECaiEDDAELCyACKQMQIQcgAkEYaiIBIAU2AgAgAiAFRToAHCACIAc3AxAgAkEQahD8BCAAQQhqIAEpAwA3AgAgACACKQMQNwIAIAJBIGokAAvbAQECfyMAQSBrIgMkAEEDIQQgAAJ/AkACQAJ/QdH5xwAgASACQcm14ABBAxDjHw0AGkEIIQRByfnHACABIAJBrPnHAEEIEOMfDQAaQQUhBEHE+ccAIAEgAkHdxdYAQQUQ4x8NABogA0EUakHkw8cAQRAQ+gggAy0AFA0CIAMoAhgiBEUNASADQQhqIAQgAygCHCABIAIQzAogAygCDCEEIAMoAggLIQIgACAENgIIIAAgAjYCBEEADAILQbT5xwAQ2ikACyAAIAMtABU6AAFBAQs6AAAgA0EgaiQAC4MCAAJAAkACQAJAAkACQAJAIAIgA0H9uOAAQQIQ4x9FBEAgAiADQba14ABBBhDjHw0BIAIgA0GsxOAAQQIQ4x8NAiACIANBrsTgAEEKEOMfDQMgAiADQb224ABBAhDjHw0EIAIgA0GmteAAQQUQ4x8NBSACIANBnrbgAEEJEOMfDQYgAiADQfC64ABBChDjHw0HIAIgA0GKtuAAQQkQ4x9FBEAgAEEGOgAADwsgAEGAMjsBAA8LIABBghg7AQAPCyAAQYI4OwEADwsgAEGCPDsBAA8LIABBgj47AQAPCyAAQYAcOwEADwsgAEGAHjsBAA8LIABBgCQ7AQAPCyAAQYAmOwEAC+IBAQN/IAAoAghBDGwhAiAAKAIEIQADQCACBEACQCAAKAIABEAgABDfLQwBCwJAAkACQAJAAkACQEEEIAAoAgQiASgCAEEFayIDIANBBk8bQQFrDgUBAgMEBQALIAFBADYCGAwFCyABQQhqEIYjIAFBKGoQ3y0MBAsgAUEANgIgIAFBKGoQ3y0MAwsgAUEIahCGIyABQShqEMQlDAILIAEQhiMgAUEgahDFJSABQegAahDiLSABQcgAahDEJQwBCyABQQhqEIYjIAEoAigQqhMLIABBDGohACACQQxrIQIMAQsLC+ABAgR/AX4jAEEgayIBJAAgACgCBCIDBEAgACgCACECAkAgACgCDCIARQ0AIAIpAwAhBSABIAA2AhggASACNgIQQQEhBCABIAIgA2pBAWo2AgwgASACQQhqNgIIIAEgBUJ/hUKAgYKEiJCgwIB/gzcDAANAIARFDQEgARCUDyEAIAEgASgCGEEBayIENgIYIABFDQEgAEEgaykDABDxGiAAQRBrKQMAIgVQDQAgBRDxGgwACwALIAFBIEEIIANBAWoQ6g0gAiABKAIIayABKAIAIAEoAgQQsiQLIAFBIGokAAvaAQICfwN+IwBB4ABrIgIkACACQRhqIAEpAwAgASgCEBC3IyACIAIoAiA2AjAgAiACKQMYIgQ3AygCQCAAIAJBKGoQ7iMiAARAIAJBCGogACkDACAAQQhqKAIAENQVIAIpAwgiBFAEf0EABSACKAIQIQAgAkE4aiIDIAEQzhsgAikDOCEFIAIpA0AhBiACIAQgABC+GDYCWCACQgA3A1AgAiAGNwNIIAIgBTcDQCACQQA2AjggAxDXGwshASACKQMoEPEaDAELIAQQ8RpBACEBCyACQeAAaiQAIAEL2gECAX8BfiMAQSBrIgMkAAJAAkAgAigCAEEBRw0AIANBEGogASACKAIEQQAQ0wECQCADLQAQQQRGDQAgAykDECIEQv8Bg0IEUQ0AIAAgBDcCAAwCCyADQQA2AhAgA0EIaiABIANBEGpBobXgAEEDEKwTIAMtAAhBBEYNACADKQMIIgRC/wGDQgRRDQAgACAENwIADAELIANBEGogAkEMaiABEL4qAkAgAy0AEEEERwRAIAMpAxAiBEL/AYNCBFINAQsgAEEEOgAADAELIAAgBDcCAAsgA0EgaiQAC94BAgJ/AX4jAEEQayIDJAACQAJAAkACQAJAAkBBASABLQAsQQNrIgQgBEH/AXFBA08bQf8BcUEBaw4CAQIACyADQQhqIAEgAhDeEiADLQAIQQRGDQIgAykDCCIFQv8Bg0IEUQ0CIAAgBTcCAAwECyADQQhqIAEgAhCdCCADLQAIQQRGDQEgAykDCCIFQv8Bg0IEUQ0BIAAgBTcCAAwDCyADQQhqIAEgAhDFCiADLQAIQQRGDQAgAykDCCIFQv8Bg0IEUg0BCyAAQQQ6AAAMAQsgACAFNwIACyADQRBqJAALxAECBH8BfiMAQYABayIDJAAgACgCACEAAn8CQCABKAIcIgJBEHFFBEAgAkEgcUUEQCAAIAEQ4SkMAwsgACkDACEGQf8AIQADQCADIAAiAmoiBCAGp0EPcSIAQTByIABBN2ogAEEKSRs6AAAgAkEBayEAIAZCEFQgBkIEiCEGRQ0ACwwBCyAAIAEQywwMAQsgAkGBAU8EQCACQYABQYD0wAAQrhAACyABQQFB5LjgAEECIARBgAEgAmsQhQQLIANBgAFqJAALwwECAX8BfiMAQRBrIgUkACAAAn8CQCADIARqQQFrQQAgA2txrSABrX4iBkIgiKcNACAGpyIEQYCAgIB4IANrSw0AIARFBEAgACADNgIIIABBADYCBEEADAILAn8gAkUEQCAFQQhqIAMgBBCbGSAFKAIIDAELIAUgAyAEQQEQ2xkgBSgCAAsiAgRAIAAgAjYCCCAAIAE2AgRBAAwCCyAAIAQ2AgggACADNgIEQQEMAQsgAEEANgIEQQELNgIAIAVBEGokAAvDAgEEfyMAQSBrIgUkAAJ/QQAgAiACIANqIgNLDQAaQQBBCCABKAIAIgRBAXQiAiADIAIgA0sbIgIgAkEITRsiAkEASA0AGiAFIAQEfyAFIAQ2AhwgBSABKAIENgIUQQEFQQALNgIYIAVBCGohBiMAQRBrIgMkAAJ/IAVBFGoiBCgCBARAIAQoAggiB0UEQCADQQhqIAIQ5iAgAygCCCEEIAMoAgwMAgsgBCgCACAHQQEgAhD5AiEEIAIMAQsgAyACEOYgIAMoAgAhBCADKAIECyEHIAYgBEEBIAQbNgIEIAYgBEU2AgAgBiAHIAIgBBs2AgggA0EQaiQAIAUoAghFBEAgBSgCDCEDIAEgAjYCACABIAM2AgRBgYCAgHgMAQsgBSgCECEBIAUoAgwLIQIgACABNgIEIAAgAjYCACAFQSBqJAAL4AEBAn8jAEEwayICJAACQAJAAkACQCABKAIAIgNBB2tBACADQQhPGw4CAQIACyACQQE2AhQgAkHQu8QANgIQIAJCATcCHCACQesANgIsIAIgATYCKCACIAJBKGo2AhggAkEQakHEvMQAELodAAsgACABKQIANwIAIABBGGogAUEYaigCADYCACAAQRBqIAFBEGopAgA3AgAgAEEIaiABQQhqKQIANwIADAELIAJBCGogAUEMaigCADYCACACIAEpAgQ3AwAgACACENsQCyADQQlPBEAgARD6FAsgAkEwaiQAC8sBAQR/IANB+P///wFxBEAgACAAIANBA3YiA0HgAGwiBGogACADQagBbCIFaiADEJgKIQAgASABIARqIAEgBWogAxCYCiEBIAIgAiAEaiACIAVqIAMQmAohAgsgACgCACIDIABBDGooAgAiBCABKAIAIgUgAUEMaigCACIGEMYdQf8BcUH/AUYiByADIAQgAigCACIDIAJBDGooAgAiBBDGHUH/AXFB/wFGcwR/IAAFIAIgASAHIAUgBiADIAQQxh1B/wFxQf8BRnMbCwvVAQEBfyMAQSBrIgYkACADQQFxRQRAIAFBKGoQuiAaCyAGIAEgAyAEIAVBAEEAEHFBAyEDIAYoAgAhBAJAIAYtABQiBUEDRgRAIAAgBDYCBAwBCyAAIAYpAgQ3AgwgACAGLwAVOwAdIABBFGogBkEMaikCADcCACAAQR9qIAZBF2otAAA6AAAgACAGKAIYNgIgIAAgBToAHCAAIAQ2AgggACACIAEoApwDIgEgASACSRs2AiwgACACIAEgASACSxs2AihBASEDCyAAIAM2AgAgBkEgaiQAC8UBAQJ/AkACQAJAIAAoAgAiAUElRg0AAkACQAJAAkACQEEQIAFBAmsiAiACQSNPGw4iAQUFBQUFBQUFBQUFBQUFBQIFBQUFBQUFBQYGBwMHBgUFBAALIABBBGoQtgYPCyAALQAIIgFBBU0gAUEBR3ENAyAAKQMQEPEaDwsgACkDEBDxGiABRQRADAULIABBBGoQtgYPCyAAKAIQEOIhDAMLIAApAwgQ8RoLDwsgACkDCBDxGiAAKQMQEPEaDwsgACkDCBDxGgvmAQECfyMAQRBrIgIkAAJ/AkACQAJAAkACQEEEIAAoAgAiACgCAEGAgICAeHMiAyADQQRPG0EBaw4EAQIDBAALIAIgAEEIajYCDCABQc2S2QBBBiACQQxqQf4DEMgKDAQLIAIgAEEIajYCDCABQcj/2QBBAyACQQxqQcsDEMgKDAMLIAIgAEEEajYCDCABQaiS2QBBBCACQQxqQcsEEMgKDAILIAIgAEEIajYCDCABQbOS2QBBBiACQQxqQYAEEMgKDAELIAIgADYCDCABQfCP2gBBAyACQQxqQcwEEMgKCyACQRBqJAAL6AEBAX8CQAJAAkACQAJAAkAgACgCAEEBaw4GAQIDBAUFAAsgAEEIaiABEL4nDwsgACgCDEEobCECIAAoAgghAANAIAJFDQQgACgCAEEHRwRAIAAgARCcCgsgAEEoaiEAIAJBKGshAgwACwALIABBBGogARDqLQ8LIAAoAgxBOGwhAiAAKAIIIQADQCACRQ0CAkACQAJAAkAgACgCAEEBaw4CAQIACyAAQShqIAEQ8iwMAgsgAEEQaiABEL4nDAELIABBBGogARDqLQsgAEE4aiEAIAJBOGshAgwACwALIABBBGogARDyLAsLwwECCH8BfiMAQRBrIgQkACAEQQhqIAJBCEEQEPkUIAJBBHQhCCAEKAIMIQcgBCgCCCIJIQYCQANAIAZFIAUgCEZyRQRAIAEpAwAiC0IDg1AEQCALp0EIayIDIAMoAgAiA0EBajYCACADQQBIDQMLIAEoAgghAyAFIAdqIgogCzcDACAKQQhqIAM2AgAgBkEBayEGIAVBEGohBSABQRBqIQEMAQsLIAAgAjYCCCAAIAc2AgQgACAJNgIAIARBEGokAA8LAAvoAQEBfwJAAkACQAJAAkACQCABKAIAQQFrDgYBAgMEBQUACyAAIAFBCGoQtA4PCyABKAIMQShsIQIgASgCCCEBA0AgAkUNBCABKAIAQQdHBEAgACABEJ4KCyABQShqIQEgAkEoayECDAALAAsgAUEEaiAAEN0tDwsgASgCDEE4bCECIAEoAgghAQNAIAJFDQICQAJAAkACQCABKAIAQQFrDgIBAgALIAFBKGogABDYKwwCCyAAIAFBEGoQtA4MAQsgAUEEaiAAEN0tCyABQThqIQEgAkE4ayECDAALAAsgAUEEaiAAENgrCwvqAQEBfyMAQdAAayIDJAAgAEEANgI4IABCADcCMCAAQQA2AhQgAEKAgICAwAA3AgwgA0HMAGpBADsBACAAIAEpAgA3AgAgACACKQIANwIYIABBCGogAUEIaigCADYCACAAQSBqIAJBCGopAgA3AgAgAEEoaiACQRBqKQIANwIAIANBADYCQCADQgA3AjggA0IENwIYIANCADcCECADQoCAgICAATcCCCADQgA3AkQgA0GAgICAeDYCICAAQcQAakEAOwEAIABCADcCPCADQQhqEPomIANBFGoQ7CYgA0EgahD4JCADQdAAaiQAC9cBAgh/An4jAEHgAGsiAyQAIAEoAhAhBCABKAIMIQUgASgCCCEGAkAgASkDACIKQgODUARAIAqnQQhrIgIgAigCACICQQFqNgIAIAJBAEgNAQsgAS0AFCEHAkAgASgCGCICRQRAQQAhAQwBCxDlIiEB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ACgCFEGz19YAQQIgACgCGCgCDBEDACEADAELIAAoAhRB27TgAEEBIAAoAhgoAgwRAwAhAAsgE0EQaiQAIABBAXELuQEBBX8gA0H4////AXEEQCAAIAAgA0EDdiIDQfAAbCIFaiAAIANBxAFsIgRqIAMQtQohACABIAEgBWogASAEaiADELUKIQEgAiACIAVqIAIgBGogAxC1CiECCyAAKAIEIgQgASgCBCIGSSAAKAIAIgMgASgCACIFSSADIAVGGyIHIAQgAigCBCIISSADIAIoAgAiBEkgAyAERhtGBH8gAiABIAcgBiAISSAEIAVLIAQgBUYbcxsFIAALC8kBAQN/IwBBEGsiAyQAIABBCGohAAJAA0AgAUEDTQRAAkAgAUEBSw0ADAMLBSAAKAAAIANBBCAAIAFBsMnYABCKHSACQQV3c0G5893xeWwhAiADKAIEIQEgAygCACEADAELCyAALwAAIANBCGpBAiAAIAFBoMnYABCKHSACQQV3c0G5893xeWwhAiADKAIMIQEgAygCCCEACyABBEAgAC0AACACQQV3c0G5893xeWwhAgsgA0EQaiQAIAJBBXdB/wFzQbnz3fF5bK0LvwEBBn8gAUHgAGoQ0B8CQAJAIAJFDQAgASgCaCEGIAEoAmwiBSEBA0AgASADa0EBTQRAIAMgBU8NAiAGIANBAnRqKAIAIgMgAygCACIBQQFqNgIAIAFBAE4NAwALIAUgASADakEBdiIETQRAIAQgBUHIwdgAEK0QAAUgAyAEIAYgBEECdGooAgAoAmAgAksiCBshAyAEIAEgCBshAQwBCwALAAtBACEDCxDZHiAAIAMgAiADGzYCBCAAIANFNgIAC80BAQJ/IwBBIGsiAyQAIANBDGogACACIAERBAACfyADKAIMQYCAgIB4RwRAIAMoAhAiAiADKAIUQRhsaiEEAkADQCACIARGDQECQCACLQAQRQ0AIAJBGGogAyACEJYMIAMgAygCACIBNgIYIAMgASADKAIEajYCHANAAkAgA0EYahDWGiIBQQprDgQCAQECAAsgAUGowABrQQJJDQEgAUGAgMQARw0ACyECDAELCyADQQxqEPUiQQEMAgsgA0EMahD1IgtBAAsgA0EgaiQAC4cCAQF/AkACQAJAAkACQAJAAkACQCAAKAIAQQFrDgcCAwQAAAUGAQsACyAA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BDYCFEEBBUEACzYCGCADQQhqIAQgA0EUahCPEiADKAIIQQFGBEAgAygCDCADKAIQENwpAAsgAygCDCEBIAAgBDYCACAAIAE2AgQgA0EgaiQAC8YBAQJ/IwBBMGsiAiQAAkAgASgCAEGAgICAeEYEQCAAEM4kIABBgICAgHg2AgAMAQsgASgCCCEDIAFBADYCCCACQQA2AhQgAiABNgIMIAIgAzYCECACIAEoAgQiATYCBCACIAEgA0EEdGo2AgggACgCAEGAgICAeEYEQCACQQRqEL8SDAELIAJBKGogAkEUaigCADYCACACQSBqIAJBDGopAgA3AwAgAiACKQIENwMYIAAgAkEYahCGCCAAEM0kCyACQTBqJAALvwEBA38jAEEgayIBJAACQCACKAIQIgMgAigCFCIETQRAIABBBGohACACKAIAQQFrQQJPBEAgAUEUaiIFIAAgAigCCCACKAIMIAMgBBCABiABQQRqIAUQ9RsMAgtBACEEAkAgAyACKAIMTw0AIAAtAAAgAigCCCADai0AAEcNACABIAM2AhhBASEEIAEgA0EBajYCHAsgASAENgIUIAFBBGogAUEUahD1GwwBCyABQQA2AgQLIAEoAgQgAUEgaiQAC8sBAQJ/IwBBQGoiBCQAIAQgAzYCECAEIAI2AgwgAiADQQFqTSABKAIMIgUgA09xRQRAIARBAjYCGCAEQciz4AA2AhQgBEICNwIgIARBCTYCOCAEQa0BNgIwIAQgBTYCPCAEIARBLGo2AhwgBCAEQTxqNgI0IAQgBEEMajYCLCAEQRRqQeSfwwAQuh0ACyABIAM2AgQgASACNgIAIABBEGogAUEQaigCADYCACAAQQhqIAFBCGopAgA3AgAgACABKQIANwIAIARBQGskAAvYAQEBfyMAQRBrIgIkAAJ/AkACQAJAAkACQCAAKAIAIgAoAgBBAWsOBAECAwQACyACIABBCGo2AgwgAUG+ktkAQQcgAkEMakGwAxDICgwECyACIABBBGo2AgwgAUHvktkAQRAgAkEMakGxAxDICgwDCyACIABBBGo2AgwgAUH/ktkAQQ4gAkEMakGyAxDICgwCCyACIABBBGo2AgwgAUGngNoAQQogAkEMakHfAhDICgwBCyACIABBBGo2AgwgAUGxgNoAQQsgAkEMakHgAhDICgsgAkEQaiQAC88BAQJ/IwBBIGsiBSQAAkAgASgCAEGAgICAeEYEQCAAIAEpAgQ3AgAgAEEIaiABQQxqKAIANgIADAELIAVBCGoQ0CJBOEEEEKEgIgRB4NvgADYCACAEIAM2AiAgBCACNgIcIAQgBSkCCDcCBCAEQQxqIAVBEGopAgA3AgAgBEEUaiAFQRhqKQIANwIAIAQgASkCADcCJCAEQSxqIAFBCGopAgA3AgAgBEE0aiABQRBqKAIANgIAIABBgICAgHg2AgAgACAENgIECyAFQSBqJAALkgQBC38jAEEQayIIJAAgCEEIaiAAKAIAIgtBCGpBhKTjABC3HSAIKAIMIQwgCCgCCCIDKAIMIgQgAygCACICRgRAIAMoAgAhCSMAQSBrIgUkAAJAAkAgAygCACIKQX9GDQAgCkEBdCIEIApBAWoiAiACIARJGyICQf////8DSw0AQQQgAiACQQRNGyIEQQJ0IgJB/P///wdLDQAgBSAKBH8gBSAKQQJ0NgIcIAUgAygCBDYCFEEEBUEACzYCGCAFQQhqIAIgBUEUahDHDSAFKAIIQQFGBEAgBSgCECEHIAUoAgwhBgwBCyAFKAIMIQIgAyAENgIAIAMgAjYCBCAFQSBqJAAMAQsgBiAHENwpAAsgAygCCCIHIAkgAygCDCICa0sEQAJAIAkgB2siBiACIAZrIgRLIAMoAgAiAiAJayAET3FFBEAgAygCBCIEIAIgBmsiAkECdGogBCAHQQJ0aiAGQQJ0ENAtGiADIAI2AggMAQsgAygCBCICIAlBAnRqIAIgBEECdBD8BhoLCyADKAIMIQQgAygCACECCyADIARBAWo2AgwgAygCBCADKAIIIARqIgMgAkEAIAIgA00ba0ECdGogATYCACAMIAwoAgBBAWo2AgAgCy0AHCEBIAtBAToAHAJAIAENACAALQAURQRAIAAoAhAgACgCDBAkEMkmDAELIAAoAgwQJQsgCEEQaiQAC6MCAQV/IwBBEGsiASQAAkACQAJAAkACQCAALQAgQQFrDgMDAAIBCwALIAAgACkCADcCFCAAQRxqIABBCGooAgA2AgALIAAtABxFDQFB9IPAABCdGwALQZCBwAAQnRsACyABQQhqIAAoAhQgACgCGBBFIAEoAgwhBCABKAIIIQIgAEEBOgAcIABBFGoQySIgAEEQQQwgAhtqKAIAIwBBEGsiAiQAQYABIAQQFSEDIAJBCGoQ8xcgAigCDCEFIAEgAigCCCIGNgIAIAEgBSADIAYbNgIEIAJBEGokACABKAIEIAEoAgBBAXEEQEHAg8AAQTEQyCoACxDJJkGAARDJJiAEEMkmIAAoAgwQySYgACgCEBDJJiAAQQE6ACAgAUEQaiQAQQALsgEBBH8gACgCACIBIAAoAgRGBEBBgIDEAA8LIAAgAUEBajYCACABLQAAIgPAQQBIBH8gACABQQJqNgIAIAEtAAFBP3EhAiADQR9xIQQgA0HfAU0EQCAEQQZ0IAJyDwsgACABQQNqNgIAIAEtAAJBP3EgAkEGdHIhAiADQfABSQRAIAIgBEEMdHIPCyAAIAFBBGo2AgAgBEESdEGAgPAAcSABLQADQT9xIAJBBnRycgUgAwsL3gEBAX8jAEEQayICJAACfwJAAkACQAJAIAAoAgAoAgAiAC0AAEEBaw4DAQIDAAsgAiAAQQRqNgIMIAFB/7LDAEEEQYOzwwBBBCAAQQFqQRhBrJbYAEEGIAJBDGpBIRCTCwwDCyACIABBBGo2AgwgAUGHs8MAQQZBrJbYAEEGIAJBDGpBIRDGCwwCCyACIABBBGo2AgwgAUGNs8MAQQ9BnLPDAEEDIAJBDGpBIRDGCwwBCyACIABBBGo2AgwgAUGfs8MAQRNBsrPDAEEEIAJBDGpB/gAQxgsLIAJBEGokAAu9AQEDfyMAQRBrIgIkAAJAIAMoAhAiBCADKAIUIgVNBEAgAygCAEEBa0ECTwRAIAJBBGoiBiABQQRqIAMoAgggAygCDCAEIAUQyAUgACAGEPUbDAILQQAhBQJAIAQgAygCDE8NACADKAIIIARqLQAAIgMgAS0ABEcEQCABLQAFIANHDQELIAIgBDYCCEEBIQUgAiAEQQFqNgIMCyACIAU2AgQgACACQQRqEPUbDAELIABBADYCAAsgAkEQaiQAC7oBAQF/IwBBEGsiBSQAIAUgBDYCDCAFIAM2AghBACEEAn8DQCACQQFNBEACQCAFQQhqIAEgBEEEdGoiASgCACABQQRqKAIAEKsjQf8BcUUNAEEADAMLBSAEIAJBAXYiAyAEaiIEIAVBCGogASAEQQR0aiIEKAIAIARBBGooAgAQqyNB/wFxQQFGGyEEIAIgA2shAgwBCwsgASgCDCEEIAEoAggLIQIgACAENgIEIAAgAjYCACAFQRBqJAALtQEBBX8jAEEgayIDJAAgA0EIaiACQQRBCBD5FCADQQA2AhwgAyADKQMINwIUIANBFGogAhD+HiADKAIcIQQgAyACBH8gAiAEaiADKAIYIARBA3RqIQQDQCAEQQRqIAEoAgAiBSABQQRqKAIAIgYgBSAGSxs2AgAgBCAFIAYgBSAGSRs2AgAgAUEIaiEBIARBCGohBCACQQFrIgINAAsFIAQLNgIcIAAgA0EUahDEEyADQSBqJAALxQEBBX8jAEEwayICJAAgASgCJCEDIAEoAiAhBCABKAIcIQUgASgCGCEGAn8gASgCAEUEQCACQSBqIAFBCGoQzCEgAkEYaiACQShqKQMANwIAIAIgAikDIDcCEEEADAELIAJBDGogAUEEahDpIkEBCyEBIAAgAzYCJCAAIAQ2AiAgACAFNgIcIAAgBjYCGCAAIAE2AgAgACACKQIMNwIEIABBDGogAkEUaikCADcCACAAQRRqIAJBHGooAgA2AgAgAkEwaiQAC8MBAQZ/IAAgARC8IiAAKAJEIgIgACgCSEEGdGohBgNAIAIgBkcEQCACQUBrIQUgAigCAEEHRgRAIAEtACghByABQQE6ACggAigCOEEMbCEEIAIoAjQhAwNAIAQEQCADIAEQsi0gBEEMayEEIANBDGohAwwBCwsgAkEIaiEDAkAgAi0AHEECRwRAIAEgAxDKGAwBCyADIAEQvSYLIAEgBzoAKCAFIQIMAgUgASACENIeIAUhAgwCCwALCyAAQSBqIAEQnSQLugEBBn8CQCAAKAIAQQFHDQAgACgCBCIDRQ0AIAAoAgghBQNAIANBBGohAiADLwEyIgdBAnQhAEF/IQQCQAJAA0AgAEUEQCAHIQQMAgsgAigCACEGIARBAWohBCAAQQRrIQAgAkEEaiECAkBBfyABIAZHIAEgBkkbQf8BcQ4CAAECCwtBACEADAELIAVFBEBBASEADAELIAVBAWshBSADIARBAnRqQTRqKAIAIQMMAQsLIABBAXMhAgsgAgvSAQEBfyMAQRBrIg8kACAAKAIUIAEgAiAAKAIYKAIMEQMAIQEgD0EAOgANIA8gAToADCAPIAA2AgggD0EIaiADIAQgBSAGEPQGIAcgCCAJIAoQ9AYgCyAMIA0gDhD0BiEBIA8tAA0iAiAPLQAMIgNyIQACQCADQQFxIAJBAUdyDQAgASgCACIALQAcQQRxRQRAIAAoAhRBs9fWAEECIAAoAhgoAgwRAwAhAAwBCyAAKAIUQdu04ABBASAAKAIYKAIMEQMAIQALIA9BEGokACAAQQFxC6UBAQR/IAFFBEBBAA8LIAFBA3EhBAJAIAFBBEkEQAwBCyAAIQIgAUF8cSIFIQEDQCADIAIsAABBv39KaiACQQFqLAAAQb9/SmogAkECaiwAAEG/f0pqIAJBA2osAABBv39KaiEDIAJBBGohAiABQQRrIgENAAsLIAQEQCAAIAVqIQIDQCADIAIsAABBv39KaiEDIAJBAWohAiAEQQFrIgQNAAsLIAMLugEBBH8gASgCACICKAJQIQMCQCADAn9BASABEMMMIgRBgAFJDQAaQQIgBEGAEEkNABpBA0EEIARBgIAESRsLIANqIgRNBEAgAigCWCIDQX9GDQEgAigCVCEFIAEQwwwhASAAIAQ2AgwgAEEIaiACQdAAaiICQQhqKAIANgIAIAAgAikCADcCACAAQQEgA0EBaiABQQpGIgEbNgIUIAAgASAFajYCEA8LQeCgxAAQ2ikAC0HwoMQAENopAAu7AQEDfyMAQSBrIgEkAAJAIAIoAhAiAyACKAIUIgRNBEAgAigCAEEBa0ECTwRAIAFBFGoiBSAAIAIoAgggAigCDCADIAQQ/A0gAUEEaiAFEPUbDAILQQAhBAJAIAMgAigCDE8NACAAIAIoAgggA2otAABqLQAAQQFHDQAgASADNgIYIAEgA0EBajYCHEEBIQQLIAEgBDYCFCABQQRqIAFBFGoQ9RsMAQsgAUEANgIECyABKAIEIAFBIGokAAvEAQECfyMAQfAAayIEJAACQCABKAIAQYKAgIB4RgRAIABBIjYCACAAIAEpAgQ3AgQgAEEcaiABQRxqKQIANwIAIABBFGogAUEUaikCADcCACAAQQxqIAFBDGopAgA3AgAMAQsgBCABQTgQ/AYiAUHIAGogARCvHiIFQRBqKQIANwMAIAFBQGsgBUEIaikCADcDACABIAUpAgA3AzggAUEDNgJUIAAgAiADIAFBOGogAUHUAGoQnA8gARDgIgsgBEHwAGokAAvTAQECfwJAIAEoAgAiBC0AFCIDQQJGIANBAXFyRQRAIAItAB1FIAItABxBBEZxIAIoAgAiA0GAAklxRQRAIAAgAzYCCCAAQQA6AAQgAEGAgICAeDYCAA8LIAPAIgNBAE4NASAELQAXRQRAIAAgAzoABSAAQQE6AAQgAEGAgICAeDYCAA8LIAAgASgCBCABKAIIIAJBBGpBARDeGA8LIABBADoABCAAQYCAgIB4NgIAIAAgAigCADYCCA8LIAAgAzYCCCAAQQA6AAQgAEGAgICAeDYCAAu7AQECfwJAAkACQAJAIAFBBGtB/wFxQQNPBEACQCAAKAIAIgJBEGsOAgIDAAsgAkEbRw0EIAAoAghBA0cNBCABQf8BcUUgACkDGEIAU3EPCyAAEIgIIQMMAwsCQAJAIAAtABAOAgEABAsgAUH/AXFBAUcNAwwCCyABQf8BcQ0CDAELIAAtABEhAiAALQAQRQRAIAJBAXFFIAFB/wFxQQFHcg0CDAELIAJBAXFFIAFB/wFxcg0BC0EBDwsgAwu8AQEBfyAAQShqIQICQAJAIAAtAKACQQJHDQAgAhDNDSIABEAgACgCAEEIRg0CCyACEM0NIgBFDQAgACgCAEETRg0BCwJAIAIQzQ0iAEUNACAAKAIAQRVHDQAgAC0ABEUNAQsgAhDNDSIABEAgACgCAEEORg0BCyACEM0NIQACQAJAIAFFBEAgAA0BQQAPC0EBIQEgAEUNASAAKAIAQT5xQQ5GDQEgAhCAIQ8LIAAoAgBBD0YhAQsgAQ8LQQEL0wEBAX8jAEEQayICJAACfwJAAkACQAJAAkAgACgCAEEBaw4EAQIDBAALIAIgAEEIajYCDCABQYSu4ABBBSACQQxqQf0DEMgKDAQLIAIgAEEIajYCDCABQcj/2QBBAyACQQxqQcsDEMgKDAMLIAIgAEEIajYCDCABQbCS2QBBAyACQQxqQf4DEMgKDAILIAIgAEEEajYCDCABQdWT2gBBCCACQQxqQf8DEMgKDAELIAIgAEEIajYCDCABQbOS2QBBBiACQQxqQYAEEMgKCyACQRBqJAALzgECBH8BfiMAQSBrIgEkACAAKAIEIgMEQCAAKAIAIQICQCAAKAIMIgBFDQAgAikDACEFIAEgADYCGCABIAI2AhBBASEAIAEgAiADakEBajYCDCABIAJBCGo2AgggASAFQn+FQoCBgoSIkKDAgH+DNwMAA0AgAEUNASABEJAPIQQgASABKAIYQQFrIgA2AhggBEUNASAEQRBrKQMAEPEaDAALAAsgAUEQQQggA0EBahDqDSACIAEoAghrIAEoAgAgASgCBBCyJAsgAUEgaiQAC84BAgR/AX4jAEEgayIBJAAgACgCBCIDBEAgACgCACECAkAgACgCDCIARQ0AIAIpAwAhBSABIAA2AhggASACNgIQQQEhACABIAIgA2pBAWo2AgwgASACQQhqNgIIIAEgBUJ/hUKAgYKEiJCgwIB/gzcDAANAIABFDQEgARDHDyEEIAEgASgCGEEBayIANgIYIARFDQEgBEEIaykDABDxGgwACwALIAFBCEEIIANBAWoQ6g0gAiABKAIIayABKAIAIAEoAgQQsiQLIAFBIGokAAu1AQEHfyMAQUBqIgUkACABQThsIAAoAghBOGwiAWshAyAAKAIEIAFqIQQgAigCBCEBIAIoAgwhBgNAAkAgA0UgASAGRnJFBEAgAiABQThqIgc2AgQgASgCACIIQQpHDQELIAVBQGskACADRQ8LIAVBDGoiCSABQQRqQTQQ/AYaIAQgCDYCACAEQQRqIAlBNBD8BhogACAAKAIIQQFqNgIIIANBOGshAyAHIQEgBEE4aiEEDAALAAu8AQEBfyAAQShqIQICQAJAIAAtAPgCQQJHDQAgAhDnDSIABEAgACgCAEEIRg0CCyACEOcNIgBFDQAgACgCAEETRg0BCwJAIAIQ5w0iAEUNACAAKAIAQRVHDQAgAC0ABEUNAQsgAhDnDSIABEAgACgCAEEORg0BCyACEOcNIQACQAJAIAFFBEAgAA0BQQAPC0EBIQEgAEUNASAAKAIAQT5xQQ5GDQEgAhCyIQ8LIAAoAgBBD0YhAQsgAQ8LQQELwwEBBX8gACgCACAAKAIEIAEQsSYgACgCRCICIAAoAkhBBnRqIQYDQCACIAZHBEAgAkFAayEDIAIoAgBBB0YEQCACKAI4QQxsIQQgAigCNCEFA0AgBARAIAUoAgAgARCMLiAEQQxrIQQgBUEMaiEFDAELCyACLQAcQQJHBEAgAkEIaiABEJkjIAMhAgwDCyACKAIIIAEQjS4gAigCDCABEIwuIAMhAgwCBSACIAEQnyQgAyECDAILAAsLIABBIGogARC4IQu0AQEIfyMAQRBrIgQkACABLQAGIQkgAS0ABSEKIAEtAAQhBiABLQAHIQtBACEBAkADQCAEQQhqIAEgAiADQdT6wQAQih0gBCAJIAQoAgggBCgCDBC1BiAEKAIAQQFHDQEgBCgCBCABaiIFQQFqIQEgBSAGSQ0AIAUgBmsiBSAKaiIIIAVJIAMgCE1yDQAgAiAIai0AACALRw0AC0EBIQcLIAAgBTYCBCAAIAc2AgAgBEEQaiQAC70BAQN/IwBBEGsiAiQAIAAoAighAyACQQhqIAAoAgQgACgCCCABQfCExAAQ5BsCQCACKAIMIgEEQAJAIAIoAggiBC0AACIAQf8BRwRAIAAgAEECdmogAEEDcUEAR2pBAmoiACABSQ0BIAAgAUGo/8MAEK0QAAsgA0ECaiIAIAFPDQILIAQgAEECdGooAgAhACACQRBqJABBASAAIABBAEgbDwtBAEEAQZj/wwAQrRAACyAAIAFBuP/DABCtEAALvAIBBn8CfwJAIAQgBkkNACADIARqIQggAyAGaiEJQQAhBCADIQcDQCAHIAlPBEAgCCAGayEMIAMhBwNAAkAgASAERgRAAn8gByEIIAUhCSAGIQoDQAJAAkACQCAKQQNNBEBBASELIApBAUsEQCAILwAAIAkvAABHDQIgCkECayEKIAlBAmohCSAIQQJqIQgLIApFDQIgCC0AACAJLQAARgwFCyAIKAAAIAkoAABGDQILQQAhCwsgCwwCCyAKQQRrIQogCUEEaiEJIAhBBGohCAwACwALDQELIAcgDE8NBCAGIAdqLQAAIAQgBy0AACACbGtBAXRqIQQgB0EBaiEHDAELCyAHIANrIQdBAQwDBSAHLQAAIARBAXRqIQQgB0EBaiEHDAELAAsAC0EACyEBIAAgBzYCBCAAIAE2AgALtQEBBH8jAEEQayICJAAgASgCBCEEIAJBCGogACABKAIIIgAQow0gAigCCCEDAkAgAi0ADCIFQQNGBEAgAyEBDAELIABBGGwhAANAIAAEQCACQQhqIgEgAygCACAFQQFGEPkgIAEQ4BgiAQ0CIAQgAxBsIgENAiAEQRhqIQQgAkEEOgAIIABBGGshAEECIQUgAkEIahDgGCIBRQ0BDAILCyADKAIAIAUQihghAQsgAkEQaiQAIAELtgEBAX8jAEFAaiIDJAAgA0EMaiAAIAEQqRUgAygCDEGAgICAeEcEQCADQSBqIANBFGooAgA2AgAgAyADKQIMNwMYAkAgASACTw0AIAAgAhDzEEUNACADQTRqIAAgAhCpFSADKAI0QYCAgIB4RwRAIANBMGogA0E8aigCADYCACADIAMpAjQ3AyggA0EYaiADQShqEIMODAELQYjG2AAQ2ikACyAAIAIgA0EYahCkEwsgA0FAayQAC7YBAQF/IwBBQGoiAyQAIANBDGogACABEKoVIAMoAgxBgICAgHhHBEAgA0EgaiADQRRqKAIANgIAIAMgAykCDDcDGAJAIAEgAk8NACAAIAIQ9BBFDQAgA0E0aiAAIAIQqhUgAygCNEGAgICAeEcEQCADQTBqIANBPGooAgA2AgAgAyADKQI0NwMoIANBGGogA0EoahCDDgwBC0HoxtgAENopAAsgACACIANBGGoQphMLIANBQGskAAuvAQEEfwJAIAEQnw8iASgCCCIFRQRADAELIAEoAgQhBCAFIQEDQCABQQFNBEACQCAEIANBAnRqKAIAIgEgAkciBAR/IAMgASACSWoFIAMLIARrIgEgBU4NACABQX9zQR92IQMMAwsFIAMgAUEBdiIGIANqIgMgBCADQQJ0aigCACACSxshAyABIAZrIQEMAQsLQYvT2ABBPEHI09gAEO4XAAsgACABNgIEIAAgAzYCAAvAAQEFfyMAQSBrIgQkAAJ/A0AgBEEIaiIGIAEgAiADELgBAkAgBC0ADCIHQQJHBEAgBC0ADSEDIAQoAggiAigCAEESRw0BIAItABRBE2tB/wFxQQJPDQEgAigCBCIFKAIAQRJHDQEgBS0AFEEYRw0BIAIoAhAhBSACKAIMIQggBEE4OgAIIAEgCCAFIAYQvhkMAQsgBCgCCCECQQEMAgsgB0EBcQ0AC0EACyEDIAAgAjYCBCAAIAM2AgAgBEEgaiQAC74BAQV/IAEgABDxISAAKAJEIgIgACgCSEEGdGohBgNAIAIgBkcEQCACQUBrIQQgAigCAEEHRgRAIAIoAjhBDGwhBSACKAI0IQMDQCAFBEAgAyABEMwsIAVBDGshBSADQQxqIQMMAQsLIAJBCGohAyACLQAcQQJHBEAgAyABEP8oIAQhAgwDCyADIAEQuiUgBCECDAIFIAIgARC7JSAEIQIMAgsACwsgACgCIEGAgICAeEcEQCAAQSBqIAEQlxoLC8ABAQV/IwBBIGsiBCQAAn8DQCAEQQhqIgYgASACIAMQuwECQCAELQAMIgdBAkcEQCAELQANIQMgBCgCCCICKAIAQRJHDQEgAi0AFEETa0H/AXFBAk8NASACKAIEIgUoAgBBEkcNASAFLQAUQRhHDQEgAigCECEFIAIoAgwhCCAEQTg6AAggASAIIAUgBhDQGQwBCyAEKAIIIQJBAQwCCyAHQQFxDQALQQALIQMgACACNgIEIAAgAzYCACAEQSBqJAALwQECAX8BfiMAQRBrIgMkACADQQhqIAEgAigCCEEAENMBAkACQAJAIAMtAAhBBEcEQCADKQMIIgRC/wGDQgRSDQELIANBCGogAiABEL4qIAMtAAhBBEcEQCADKQMIIgRC/wGDQgRSDQILIANBCGogAkEEaiABEL8qAkAgAy0ACEEERwRAIAMpAwgiBEL/AYNCBFINAQsgAEEEOgAADAMLIAAgBDcCAAwCCyAAIAQ3AgAMAQsgACAENwIACyADQRBqJAALzwEBBX8gACgCBCECAkACQAJAAkAgACgCCCIGRQ0AIAIoAgANACACQQhqQeDE4ABBBBDKG0UNACACKAIoIQQgASgCHCABKAIgIAIoAiwiAxCpJiIFQcjE4AAQgAQNASAEIQUMAgsgAiAGIAEQgR0MAgsgBCAFKAIcIgMgAyAESxshBSAEIAMgAyAESRshAwsgASAFIAMQ2hggAkFAayAGQQFrIAEQgR0LIABBDGogARC9GiAAQRhqIAEQkCQgACgCPCABEJcgIAAoAkAgARCWIAvMAQEDfyAAQUBrEM4gIABBkAFqIQQgACgChAFB2ABsIQMgACgCgAEhAgNAAkAgAwRAAkACQAJAAkAgAigCAEEBaw4FAAECBQMFCyACQQRqIAEQwCIMBAsgAkEEaiABEMAtDAMLIAJBBGogARDXDwwCCyACQQRqIAEQri0MAQsgACgCeCICBEAgASACQQxqKAIAIAJBEGooAgAQmCALIAQgARDXDyAALQA8QQZHBEAgAEEQahDOIAsPCyACQdgAaiECIANB2ABrIQMMAAsAC7cBAQN/IwBBIGsiAiQAAkAgAygCECIFIAMoAhQiBk0EQCABQQRqIQEgAygCAEEBa0ECTwRAIAJBFGoiBCABIAMoAgggAygCDCAFIAYQ2A4gAkEEaiAEEPUbDAILIAJBFGoiBCABIAMoAgggAygCDCAFIAYQ2Q4gAkEEaiAEEPUbDAELIAJBADYCBAtBACEDIAAgAigCBEEBRgR/IAAgAikCDEIgiTcCBEEBBSADCzYCACACQSBqJAALtwEBA38jAEEgayICJAACQCADKAIQIgUgAygCFCIETQRAIAFBBGohASADKAIAQQFrQQJPBEAgAkEUaiIGIAEgAygCCCADKAIMIAUgBBDUBCACQQRqIAYQ9RsMAgsgAkEUaiIEIAEgAygCCCADKAIMIAUgAhDVESACQQRqIAQQ9RsMAQsgAkEANgIEC0EAIQMgACACKAIEQQFGBH8gACACKQIMQiCJNwIEQQEFIAMLNgIAIAJBIGokAAvBAQIDfwF+IwBBEGsiBCQAAkAgACgCECIDRQRADAELQQEhAiADQd2w2QBBARCqAw0AIAFQBEAgA0GsyN8AQQEQqgMhAgwBCwJAIAEgADUCFCIFWARAIAUgAX0iAUIaVA0BIANBrMjfAEEBEKoDDQIgAUEBIAMQ/QYhAgwCCyADQbDW1gBBEBCqAw0BQQAhAiAAQQA6AAQgAEEANgIADAELIAQgAadB4QBqNgIMIARBDGogAxDgByECCyAEQRBqJAAgAgu+AQIJfwF+IwBBEGsiAiQAIAEoAgQhCSACQQhqIAEoAggiBEEEQRAQ+RQgAigCCCIFIARB/////wBxIgEgASAFSxshA0EAIQEgAigCDCEGA0AgAwRAIAEgCWoiB0EEaikCACELIAcQ8BwhCiABIAZqIghBDGogB0EMahChDzYCACAIQQRqIAs3AgAgCCAKNgIAIANBAWshAyABQRBqIQEMAQsLIAAgBDYCCCAAIAY2AgQgACAFNgIAIAJBEGokAAu8AQIFfwF+IwBBMGsiAiQAAkAgAS0AJSIFQQJGBEAgASgCDCEDIAEoAhAhBCACQQhqIAEQbiAAQRBqIAQ2AgAgACACKQIINwIAIAIgAzYCFCAAQQhqIAJBEGopAgA3AgAMAQsgASkDACEHIAEtACQhAyAAQQhqIAFBCGoQzhsQ5CIgAkEIaiIGIAEoAiAQgQsgBkEoEPwGIQEgACADOgAkIAAgATYCICAAIAc3AwALIAAgBToAJSACQTBqJAALuQEBAn8jAEEQayICJAACQAJAIAFBKGoQzQ0iAwRAIAMoAgBBBEYNAQsgAiABENEEIAACfiACKQMAUEUEQCAAIAIpAwA3AwggAEEQaiACQQhqKQMANwMAQgEMAQsgACACKAIINgIIQgILNwMADAELIAIgARCoBSAAAn4gAikDAFBFBEAgACACKQMANwMIIABBEGogAkEIaikDADcDAEIADAELIAAgAigCCDYCCEICCzcDAAsgAkEQaiQAC+cBAAJAAkACQAJAAkACQCACIANBw7bgAEEIEOMfRQRAIAIgA0HVtOAAQQIQ4x8NASACIANB4LngAEEFEOMfDQIgAiADQfi44ABBBRDjHw0DIAIgA0GDuOAAQQYQ4x8NBCACIANBtrbgAEEHEOMfDQUgAiADQcm14ABBAxDjHw0GIAIgA0HWuuAAQQgQ4x9FBEAgAEEGOgAADwsgAEGAxgA7AQAPCyAAQQA7AQAPCyAAQYACOwEADwsgAEECOwEADwsgAEGABDsBAA8LIABBgMIAOwEADwsgAEGAKDsBAA8LIABBgDA7AQAL3wEBAX8jAEHQAGsiAiQAIAAoAgAhACACQZiS2gA2AkggAkGIktoANgJAIAIgAEEcajYCPCACQYSQ2gA2AjggAiAAQSVqNgI0IAJBhJDaADYCMCACIABBJGo2AiwgAkH4kdoANgIoIAIgAEEMajYCJCACQeiR2gA2AiAgAiAANgIcIAJBxJDaADYCGCACIABBGGo2AhQgAkHgj9oANgIQIAIgAEEQajYCDCACIABBIGo2AkwgAiACQcwAajYCRCABQZyT2gBBCUHcktoAQQggAkEMakEIEM4IIAJB0ABqJAAL0QECAn8BfiMAQSBrIgIkAAJAIAAoAgAiAC0AACIDQQFNBEAgA0EBcUUEQCABIAAtAAFBAnQiAEHA6eMAaigCACAAQezq4wBqKAIAEKoDIQAMAgsgAEEIaiABEI4cIQAMAQsCQAJAAkACQAJAIANBA2sOAwECAwALIAJBAjoAECACIAAtAAE6ABEMAwsgAkEDOgAQDAILIAJBBDoAEAwBCyACQQU6ABALIAIgAkEQahCZESIENwMIIAJBCGogARCOHCEAIAQQ8RoLIAJBIGokACAAC74BAQV/IwBB4ABrIgMkACABQdgAbCAAKAIIQdgAbCIBayEEIAAoAgQgAWohBSACKAIEIQEgAigCDCEGA0ACQCAEBEACQCABIAZGBEAgA0ENNgIIDAELIAIgAUHYAGoiBzYCBCADQQhqIAFB2AAQ/AYaIAMoAghBDUcNAgsgA0EIahD4JQsgA0HgAGokAA8LIAUgAUHYABDQLRogACAAKAIIQQFqNgIIIARB2ABrIQQgByEBIAVB2ABqIQUMAAsAC7ABAQZ/IAFBOGwgACgCCEE4bCIDayEBIAIoAnQgAigCcCIFayEGIAIgBUE4bGohBCAAKAIEIANqIQMDQCABRSEHAkAgAQRAIAZFBEBBAA8LIAIgBUEBaiIFNgJwIAQoAgAiCEEKRw0BCyAHDwsgAyAINgIAIANBBGogBEEEakE0EPwGGiAAIAAoAghBAWo2AgggAUE4ayEBIARBOGohBCAGQQFrIQYgA0E4aiEDDAALAAu5AQECfyMAQRBrIgIkAAJAAkAgAUEoahDnDSIDBEAgAygCAEEERg0BCyACIAEQ0wQgAAJ+IAIpAwBQRQRAIAAgAikDADcDCCAAQRBqIAJBCGopAwA3AwBCAQwBCyAAIAIoAgg2AghCAgs3AwAMAQsgAiABEKoFIAACfiACKQMAUEUEQCAAIAIpAwA3AwggAEEQaiACQQhqKQMANwMAQgAMAQsgACACKAIINgIIQgILNwMACyACQRBqJAALxQEBA38jAEEwayIBJAAgACgCDCECAkACQAJ/AkACQCAAKAIEDgIAAQMLIAINAkEBDAELIAINASAAKAIAIgAoAgQhAyAAKAIACyECIAFBGGoQ0CJBJBDjICIAQbzCwAA2AgAgACADNgIgIAAgAjYCHCAAIAEpAhg3AgQgAEEMaiABQSBqKQIANwIAIABBFGogAUEoaikCADcCAAwBCyABQQxqIgIgABCwBiABQRhqIgAQ0CIgAiAAEPkTIQALIAFBMGokACAAC6sBAQN/AkAgAkEQSQRAIAAhAwwBCyAAQQAgAGtBA3EiBGohBSAEBEAgACEDA0AgAyABOgAAIANBAWoiAyAFSQ0ACwsgBSACIARrIgJBfHEiBGohAyAEQQBKBEAgAUH/AXFBgYKECGwhBANAIAUgBDYCACAFQQRqIgUgA0kNAAsLIAJBA3EhAgsgAgRAIAIgA2ohAgNAIAMgAToAACADQQFqIgMgAkkNAAsLIAAL1AEBBH8jAEEQayIDJAAgAkH/////B0kEQCADIAEoAggiBBDaHAJAIAMoAgBFBEAgAygCBCEFIAEoAtgCIQYgASgCACAERgRAIAEQ6BYLIAAgBTYCBCAAQQM2AgAgASAEQQFqNgIIIAEoAgQgBEEUbGoiACACNgIQIAAgBjYCDCAAQQA2AgggAEIANwIADAELIAAgAykDCDcDECAAQv7///8HNwMIIABBADYCAAsgA0EQaiQADwsgAyACrTcDAEHgisAAQTQgA0GEhMAAQZSLwAAQxg4AC7gCAQN/An8gASgCBCICIAEoAhBHBEAgAEEMaiABEOcSIABBFGohASAAQRBqDAELIAAoAgQiAyAAKAIIIgAgAkEBayICQbDJ1gAQtB8gARDnEiADIAAgAkHAydYAELQfIgBBCGohASAAQQRqCyECAkAgASgCACIAQQJJDQAgAigCACECIABBFU8EQCMAQZAgayIBJAACQCAAQQF2IgNBlawUIAAgAEGVrBRPGyIEIAMgBEsbIgNBqwFPBEAgAUEIaiADQQRBGBD5FCACIAAgASgCDCICIAEoAggiAyAAQcEASRDZASADIAIQ7SkMAQsgAiAAIAFBEGpBqgEgAEHBAEkQ2QELIAFBkCBqJAAMAQsgAEEYbCEAQRghAQNAIAAgAUYNASACIAEgAmoQ4wkgAUEYaiEBDAALAAsLvgEBA38jAEEQayIDJAAgACgCACEEAkADQCACQQNNBEACQCACQQFLDQAMAwsFIAEoAAAgA0EEIAEgAkGwydgAEIodIARBBXdzQbnz3fF5bCEEIAMoAgQhAiADKAIAIQEMAQsLIAEvAAAgA0EIakECIAEgAkGgydgAEIodIARBBXdzQbnz3fF5bCEEIAMoAgwhAiADKAIIIQELIAAgAgR/IAEtAAAgBEEFd3NBufPd8XlsBSAECzYCACADQRBqJAALygEBBX8jAEEgayIBJAAgACgCCCEEIAAoAgQhBUEFIQJBASEDAkACQAJAIAAoAgBBAWsOAgACAQtBAyEDCyABQRBqIABBHGooAgA2AgAgAUEIaiAAQRRqKQIANwMAIAEgACkCDDcDACADIQILQShBCBDOIiIAIAQ2AgggACAFNgIEIAAgAjYCACAAIAEpAwA3AgwgAEEUaiABQQhqKQMANwIAIABBHGogAUEQaikDADcCACAAQSRqIAFBGGooAgA2AgAgAUEgaiQAIAALrAECB38BfiMAQRBrIgQkACAEQQhqIAJBCEEIEPkUIAJBA3QhCCAEKAIMIQcgBCgCCCIJIQUCQANAIAVFIAMgCEZyRQRAIAEgA2opAwAiCkIDg1AEQCAKp0EIayIGIAYoAgAiBkEBajYCACAGQQBIDQMLIAMgB2ogCjcDACAFQQFrIQUgA0EIaiEDDAELCyAAIAI2AgggACAHNgIEIAAgCTYCACAEQRBqJAAPCwALuAEBBH8jAEEQayIGJAAgAS0AggIhByABLQCBAiEIIAEtAIACIQkgBkEIaiACIAMgBCAFQcyVwAAQ6RYgBiAJIAggByAGKAIIIAYoAgwQ4wQgAAJ/AkAgBigCAEEBcQRAIAYoAgQgBGoiBSADSQ0BIAUgA0HclcAAEK0QAAtBAAwBCyAAIAQgBSABIAIgBWotAABqLQAAayIBQQAgASAFTRsiASABIARJGzYCBEECCzYCACAGQRBqJAALugEBAn8gACAALQANIAEtAA0iAiACQQNGGzoADSAAIAAtAAwgAS0ADCICIAJBAkYbOgAMIAAgAC0ACyABLQALIgIgAkECRhs6AAsgACAALQAKIAEtAAoiAiACQQJGGzoACiAAIAFBCWogAEEJaiABLQAIIgIbLQAAOgAJIAAgACgCACABKAIAIgMgA0ECRiIDGzYCACAAIAIgAC0ACHJBAXE6AAggACAAQQRqIAFBBGogAxsoAgA2AgQgAAvBAQECfyMAQTBrIgIkACACQQA2AiAgAkEBNgIUIAJBpJrDADYCECACQgQ3AhgCf0EBIAEoAhQiAyABKAIYIgEgAkEQahCtJA0AGiACIAAoAgA2AggDQCACIAJBCGoQqxlBACACKAIARQ0BGiACIAIoAgQ2AgwgAkEBNgIUIAJBhJrDADYCECACQgE3AhwgAkEQNgIsIAIgAkEoajYCGCACIAJBDGo2AiggAyABIAJBEGoQrSRFDQALQQELIAJBMGokAAvHAQEBfyMAQRBrIgskACAAKAIUIAEgAiAAKAIYKAIMEQMAIQEgC0EAOgANIAsgAToADCALIAA2AgggC0EIaiADIAQgBSAGEPQGIAcgCCAJIAoQ9AYhASALLQANIgIgCy0ADCIDciEAAkAgA0EBcSACQQFHcg0AIAEoAgAiAC0AHEEEcUUEQCAAKAIUQbPX1gBBAiAAKAIYKAIMEQMAIQAMAQsgACgCFEHbtOAAQQEgACgCGCgCDBEDACEACyALQRBqJAAgAEEBcQu1AQEFfyMAQSBrIgIkACACQQhqIAFBBEEEELkUIAJBADYCHCACIAIpAwg3AhQgAkEUaiABENMeQQEgASABQQFNGyIFQQFrIQMgAigCGCACKAIcIgZBAnRqIQQCQANAIAMEQCAEQQA2AgAgA0EBayEDIARBBGohBAwBBQJAIAUgBmohAyABDQAgA0EBayEDDAMLCwsgBEEANgIACyAAIAIpAhQ3AgAgAEEIaiADNgIAIAJBIGokAAvrAgEBfyMAQRBrIgEkAAJAAkACQEGYkOQAKAIAQf////8HcQRAQeyP5AAoAgANAQsgACgCBC0ATEEHRw0BCyABQRBqJAAMAQsgAUEEaiIBIAAoAgBBAEG4y9gAQSEQhgogARDHASMAQSBrIgAkACAAQQE2AgQgAEH89uAANgIAIABCATcCDCAAQpzwwICwATcDGCAAIABBGGo2AgggAEHQzNgAELodAAsgACgCBCIAQRRqIgEoAgAgAEEYaigCABDfHCAAKAIQIAEoAgAQ6CkgACgCAEECRwRAIAAoAgQgAEEIaigCABDWKQsgACgCHCAAQSBqKAIAEOApIABBLGoiASgCACAAQTBqKAIAEOAcIAAoAiggASgCABDfKSAAQThqIgEoAgAgAEE8aigCABDmECAAKAI0IAEoAgAQ5ikgAEHEAGoiASgCACAAQcgAaigCABD6EyAAKAJAIAEoAgAQ5ykgAEHQAEEEENERC6YBAQN/AkACQCABLQAAIgMgAUECay0AACICRgRAIAEtAAEiAiABQQFrLQAASQ0BDAILIAIgA00NASABLQABIQILIAFBBGshAQNAAkAgAUEEaiABQQJqIgQvAAA7AAAgACAERg0AAkAgAS0AACIEIANGBEAgAiABQQFqLQAASQ0BDAILIAMgBE8NAQsgAUECayEBDAELCyABQQJqIAJBCHQgA3I7AAALC6ABAQV+IAAgACkDGCIBQhCJIAEgACkDCHwiAYUiAkIViSACIAApAxAiAyAAKQMAfCIEQiCJfCIChSIFQhCJIAUgASADQg2JIASFIgN8IgFCIIl8IgSFIgUgAiABIANCEYmFIgF8IgJCIIl8IgM3AwAgACAFQhWJIAOFNwMYIAAgAUINiSAChSIBQhGJIAEgBHwiAYU3AxAgACABQiCJNwMIC7cBAgZ/AX4jAEHgAGsiASQAEPEiIAAoAgAiACkDACEHIAFBCGogAEEIahDOGyAALQBEIQMgAEEgahCiDyEEIAFBOGogAEE4ahCACyAAKAIwIQUgACgCNCEGIAFBzABqIABBJGoQlQMgAUE0aiAGNgIAIAEgBTYCWCABQSxqIAFB1ABqKQIANwIAIAEgAzoARCABIAc3AwAgASAENgIgIAEgASkCTDcCJCABQcgAEPwGIAFB4ABqJAALugEBCX8jAEEQayIDJAACQCACIAAoAggiBU0EQCACQRRsIQIgACgCACIGQQRrIQcgACgCBCEIIAAoAgwhBANAIAJFDQIgA0EIaiAGIAggATUCEBCoHSADLQAMIQkgAygCCCEKIAAgBEEBaiILNgIMIAcgCkECdGsgBDYCACAAIAUgCUEBcWsiBTYCCCACQRRrIQIgAUEUaiEBIAshBAwACwALQcy43wBBxQBB+LnfABDuFwALIANBEGokAAvDAQEDfyMAQSBrIgEkACAAKAIAIgIoAgAhAyACQQA2AgAgAygCECECIANBADYCECACBEAgAUEIaiACEQEAIAAoAgQiAygCACIAKAIAQYCAgIB4RwRAIAAQmhwgACgCACAAQQRqKAIAEI4qIAMoAgAhAAsgACABKQIINwIAIABBCGogAUEQaigCADYCACABQSBqJABBAQ8LIAFBADYCGCABQQE2AgwgAUGw9+AANgIIIAFCBDcCECABQQhqQZj44AAQuh0AC9gBAQF/IwBB8ABrIgQkACAEIAM2AiwgBEEANgIoIARB4gA2AiQgBCAAQRxqNgIgIARBBTYCHCAEQfz24AA2AhggBEECNgIUIARBAzYCBCAEQdzL3wA2AgAgBEEDOgBsIARBADYCaCAEQqCAgIAQNwJgIARCgoCAgCA3AlggBEECNgJQIARBAzoATCAEQQA2AkggBEIgNwJAIARCgYCAgCA3AjggBEECNgIwIAQgBEEwajYCECAEQQM2AgwgBCAEQRhqNgIIIAEgBCACKAIUEQIAIARB8ABqJAALzgEBA38jAEHQAGsiAiQAIAFBKGoQ1SAhAyACQQA7AB4gAiABLQCQAzoAHSACIAEpAYIDNwAPIAIgAUGKA2oiBCgBADYAFyACIAEvAY4DOwAbIAIgASkAkwM3ACAgAiABKACbAzYAKCACQcUAaiABQZcDaikAADcAACACQUBrIAFBkgNqKQEANwIAIAJBOGogBCkBADcCACACIAEpAYIDNwIwIAFBgAFqIAJBD2oQyAggAiABNgIsIAAgASADEEkgAkEsahCg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NgIAIANBAzoAbCADQQA2AmggA0KggICAEDcCYCADQoKAgIAgNwJYIANBAjYCUCADQQM6AEwgA0EANgJIIANCIDcCQCADQoGAgIAgNwI4IANBAjYCMCADIANBMGo2AhAgA0EDNgIMIAMgA0EYajYCCCABIAMQxiQgA0HwAGokAAvDAQEDfyMAQbAHayICJAAgASgClA0oArwCIgMgAygCACIEQQFqNgIAIARBAE4EQCACIAMQ+BcgAkHoBGogASgCoAoQ6h4gAkHUBWogASgCuAoQ6x4gAkHYBGogASgC1AogASgC+AoQ6g4gAkHYAWogARCgFQJAIAEpA6ANQgJRBEAgAkECNgKgBwwBCyACQfAFaiABQaANahCRCQsgAkEYaiACQfAFakHAARD8BhogACACQfAFEPwGGiACQbAHaiQADwsAC6gBAQN/AkACQCABKAIAIgMgAUEIaygCACICRgRAIAEoAgQiAiABQQRrKAIASQ0BDAILIAIgA00NASABKAIEIQILIAFBEGshAQNAAkAgAUEQaiABQQhqIgQpAgA3AgAgACAERg0AAkAgASgCACIEIANGBEAgAiABQQRqKAIASQ0BDAILIAMgBE8NAQsgAUEIayEBDAELCyABQQhqIAOtIAKtQiCGhDcCAAsLvQEBA38jAEEgayIBJAAgACgCACICKAIAIQMgAkEANgIAIAMoAhAhAiADQQA2AhAgAgRAIAFBCGogAhEBACAAKAIEIgMoAgAiACgCACICQYKAgIB4TgRAIAIgAEEEaigCABDWKSADKAIAIQALIAAgASkCCDcCACAAQQhqIAFBEGooAgA2AgAgAUEgaiQAQQEPCyABQQA2AhggAUEBNgIMIAFBsPfgADYCCCABQgQ3AhAgAUEIakGY+OAAELodAAu+AQEDfyMAQdAAayIBJAAgACgCACICKAIAIQMgAkEANgIAIAMoAlAhAiADQQA2AlAgAgRAIAFBCGogAhEBAAJAIAAoAgQiAygCACIAKAI4IgJBAkYgAkVyDQAgACgCQCICRQ0AIAAoAjwgAkEBENERIAMoAgAhAAsgACABQQhqQcgAEPwGGiABQdAAaiQAQQEPCyABQQA2AhggAUEBNgIMIAFBsPfgADYCCCABQgQ3AhAgAUEIakGY+OAAELodAAuqAQEEfyMAQUBqIgYkACAGQQA2AhQg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QTBrIgMkACABQTBsIAAoAghBMGwiAWshBCAAKAIEIAFqIQUgAigCBCEBIAIoAgwhBgJAA0AgBEUNASABIAZHBEAgAiABQQRqIgc2AgQgA0IANwMIIANBEjYCACADIAEoAgA2AgQgBSADQTAQ/AYgACAAKAIIQQFqNgIIIARBMGshBEEwaiEFIAchAQwBCwsgA0ETNgIAIAMQmCYLIANBMGokACAERQu6AQIEfwF+IwBBIGsiAyQAIAAoAghBOGwhBCAAKAIEIQVBACEAA0ACQCAAIARHBEACQAJAAkAgACAFaiICKAIAQQFrDgIBAgALIAJBCGogARC8IiACQShqIAEQwy0MAwsgAkEwaiABEJskIAEtAChBAUcNAiADQQhqIAJBEGoQzhsgASADKQMIIgYgAygCGBCMEiAGEPEaDAILIAJBBGogARCRLgwBCyADQSBqJAAPCyAAQThqIQAMAAsAC7oBAgN/AX4jAEEgayIBJAAgACgCCCIDQf7///8HTQRAAkACQCAAKAIUIgJFDQAgACACQQFrIgI2AhQgACgCECACQQxsaikCACIEp0GAgICAeEYNACABQQA2AhAgASAENwMIDAELIAFBADYCECABQoCAgIDAADcCCAsgACABQQhqEOgVIAFBIGokACADDwsgAUEANgIYIAFBATYCDCABQbSuwwA2AgggAUIENwIQIAFBCGpBvK7DABC6HQALtwEBAX8jAEEgayICJAACQAJAIAEQ2C1FBEAgAkEEaiABENYHIAIoAgRBgICAgHhHBEAgAkEYaiACQQxqKAIANgIAIAIgAikCBDcDECAAIAJBEGoQ3hEMAgtBgICAgHggAigCCBCuJCAAIAEQ6gc2AhggAEECNgIAIABBFGogAUEQaigCADYCACAAQQxqIAFBCGopAgA3AgAgACABKQIANwIEDAILIAAQtxELIAEQqx4LIAJBIGokAAuuAQICfwF+IwBBMGsiAiQAAkAgAS0AFEECRgRAEOwiIQMgASgCACIBKQMQIQQgAkEIaiABQRhqEMMLIAJBIGogARDMISADIAQ3AxAgA0EIaiACQShqKQMANwMAIAMgAikDIDcDACADIAIpAwg3AxggA0EgaiACQRBqKQMANwMAIANBKGogAkEYaikDADcDACAAQQI6ABQgACADNgIADAELIAAgARDOGwsgAkEw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fCIBIAAoAoABEOgcIAAoAnggARDoKSAAQYgBahDXIiAAQZQBahDXIiAAKAK8ASAAKALAARDgKSAAKALMASAAKALQARDzKSAAKAKgASAAKAKkARDgKSAAKAKsASAAKAKwARDoKSAAKALcASAAKALgARDoKQunAQECfyMAQSBrIgQkAAJAIAEtAJwNQQFHBEACQAJAIAEpAwBCAlENACACKALIBEECRg0DIARBFGoiBSABIAJB2AFqIAMQ9QkgBEEIaiAFEPoXIAQoAghBAkYNACAAIAQpAgg3AgAgAEEIaiAEQRBqKAIANgIADAELIAAgASACIAMQoRULIARBIGokAA8LQd3r4ABBKEGojMMAEO4XAAtByIvDABDaKQALnQEBAX8jAEEgayIGJAAgBkEQaiACIAMgBCAFQbSlwwAQ6RYgBigCECEFIAYoAhQhAiAGQgE3AhggAAJ/QQAgAiABKAJAIgNJDQAaIAZBCGogASAGQRhqIAUgAiABKAI8IAMgASgCMBELAEEAIAYoAghBAXFFDQAaIAAgBigCDCAEaiIBNgIEIAAgASADajYCCEEBCzYCACAGQSBqJAALmAECBn8BfgJAIAAoAgAiASgCMEEBRw0AIAAoAgQiAigCbCABKAI0SQ0AQQEgASgCOEEBRgRAIAIoAnAhBSABKAI8IQZBACEBIAIoArABQQFGBH8gAigCtAEiASACKAK4ASIEayAEIAFrIAEgBEsbBSABCyAFakF/IAI1ApQBIAatfiIHpyAHQiCIpxtPDQELDwsgABCZBEEAC6QBAgd/AX4jAEFAaiIBJAAQ7yIgACgCACIAKQIkIQggACgCLCEDIAEgABDKCyABQQxqIABBDGoQ1QEgAEEwahD0JCEEIAAtADwhBSAAQTRqEKIPIQYgAEE4ahChDyEHIAFBGGogAEEYahCACyABIAU6ADwgASAENgIwIAEgAzYCLCABIAg3AiQgASAHNgI4IAEgBjYCNCABQcAAEPwGIAFBQGskAAuaAQIGfwF+IwBB0ABrIgEkABDwIiABQQhqIgMgACgCACIAEI4MIAFBFGogAEEMahDKCyAAKQIwIQcgACgCOCEEIAFBIGogAEEYahC2ICAALwFEIQUgAEE8ahCiDyEGIABBQGsQkhwhACABIAU7AUwgASAENgJAIAEgBzcCOCABIAA2AkggASAG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ACIBQQFrNgIAIAFBAUYEQCAAQdwBahD5DQsgACgC0AEgACgC1AEQriQLugEBA38gABCyAwJAAkACQAJAAkACQAJAIAAoAgBBAWsOBwECBgMEBQAGCyAAQQRqENUmDAULIAAoAgQgACgCCBDWJAwECyAAKAIMIQEgACgCCCECIAAoAgRFBEAgAiABEOApDAQLIAIgARDzKQwDCyAAQQxqENckDAILIABBBGoCQCAAKAIMIgJFDQAgACgCECIDRQ0AIAIgA0EBENERCxDXJAwBCyAAQQRqENUmCyAAKAIYQTRBBBDREQu1AQEDfyMAQUBqIgMkAAJAIAEoAtgCIAEoAtwCIAJBlJXDABCvHygCACIERQRAIAMgARCZCCADKAIEIQQgAygCACIFQTBGBEAgASgC2AIgASgC3AIgAkGklcMAEK8fIAQ2AgAgAUHIAmogAhCiGyAAQTA2AgAgACAENgIEDAILIABBCGogA0EIakE4EPwGGiAAIAQ2AgQgACAFNgIADAELIABBMDYCACAAIAQ2AgQLIANBQGskAAuZAQECfwJAIABBCWsiAUEYTwRAQQAhASAAQYABSQ0BAkAgAEEIdiICBEAgAkEwRwRAIAJBIEYNAiACQRZHDQQgAEGALUYhAQwECyAAQYDgAEYhAQwDCyAAQf8BcUG77+AAai0AACEBDAILIABB/wFxQbvv4ABqLQAAQQJxQQF2IQEMAQtBAEGfgIAEIAF2QQFxayEBCyABQQFxC6MBAQN/IwBB4ABrIgMkAAJAAkACQCABKAIAIgQoAlwiBUF/RwRAIAVBAWohAQwBCyADQQA2AkQgA0EEaiABKAIEIAEoAgggAiADQcQAahCcDyADKAIIIQEgAygCBCICQSJHDQELIAAgATYCBCAEIAE2AlwgAEEiNgIADAELIABBCGogA0EMakE4EPwGGiAAIAE2AgQgACACNgIACyADQeAAaiQAC7EBAQN/IwBBEGsiAyQAIAEoAgwhAgJAAkACQAJAAkACQCABKAIEDgIAAQILIAINAUEBIQJBACEBDAILIAINACABKAIAIgIoAgQhASACKAIAIQIMAQsgACABELAGDAELIANBBGogARCdDiADKAIIIQQgAygCBEEBRg0BIAMoAgwgAiABEPwGIQIgACABNgIIIAAgAjYCBCAAIAQ2AgALIANBEGokAA8LIAQgAygCDBDcKQALnwEBB38jAEHQAGsiAiQAIAEoAgQhByACQQhqIAEoAggiBEEIQcAAEPkUIAIoAggiBSAEQf///x9xIgEgASAFSxshA0EAIQEgAigCDCEGA0AgAwRAIAJBEGoiCCABIAdqEIgfIAEgBmogCEHAABD8BhogA0EBayEDIAFBQGshAQwBCwsgACAENgIIIAAgBjYCBCAAIAU2AgAgAkHQAGokAAubAQEHfyMAQUBqIgIkACABKAIEIQcgAkEIaiABKAIIIgRBCEEwEPkUIAIoAggiBSAEQf////8AcSIBIAEgBUsbIQNBACEBIAIoAgwhBgNAIAMEQCACQRBqIgggASAHahBvIAEgBmogCEEwEPwGGiADQQFrIQMgAUEwaiEBDAELCyAAIAQ2AgggACAGNgIEIAAgBTYCACACQUBrJAALrwEBAn8jAEEQayICJAAgAAJ/AkACQAJAAkACQAJAIAEoAgBBAWsOBgIBAgMEBQALIAIgAUEIahCtFSACKAIEIQMgAigCAAwFCyABKAIMIQMgASgCCAwECyABKAIUIQMgASgCEAwDCyABKAIQIQMgASgCDAwCCyABKAIIIQMgASgCBAwBCyACQQhqIAEoAgQQjQMgAigCDCEDIAIoAggLNgIAIAAgAzYCBCACQRBqJAAL+gEBAX8CQAJAAkACQAJAAkACQCAAKAIAQQFrDgcBAgMGBgQFAAsgAEEIaiABENAsDwsgAEEIaiABEM8sDwsgACgCBCABEOYTDwsgACgCBCABEOYTDwsgACgCBCIAKAIoQTBsIQIgACgCJEEoaiEAA0AgAkUNAiAAKAIABEAgACABEMssCyACQTBrIQIgAEEwaiEADAALAAsgACgCBCIALQBFQQNGDQAgAEEgaiEAA0AgAC0AJUECRgRAAkAgACgCCEE4bCECIAAoAgQhAANAIAJFDQEgACABENEMIAJBOGshAiAAQThqIQAMAAsACwUgACgCICEADAELCwsLrwEBAn8jAEEQayICJAAgAAJ/AkACQAJAAkACQAJAIAEoAgBBAWsOBgIBAgMEBQALIAIgAUEIahCtFSACKAIEIQMgAigCAAwFCyABKAIMIQMgASgCCAwECyABKAIUIQMgASgCEAwDCyABKAIQIQMgASgCDAwCCyABKAIIIQMgASgCBAwBCyACQQhqIAEoAgQQjgMgAigCDCEDIAIoAggLNgIAIAAgAzYCBCACQRBqJAALpwECAX8BfiMAQSBrIgQkACAEQRBqIAMgAUEAENMBAkACQCAELQAQQQRHBEAgBCkDECIFQv8Bg0IEUg0BCyAEIAI2AhggBCABNgIUIARBATYCECAEQQhqIAMgBEEQakHgxOAAQQQQrBMCQCAELQAIQQRHBEAgBCkDCCIFQv8Bg0IEUg0BCyAAQQQ6AAAMAgsgACAFNwIADAELIAAgBTcCAAsgBEEgaiQAC6UBAgR/AX4jAEEQayIBJAAgAUEIakG0ruAAKAIANgIAIAFBrK7gACkCADcDAEKAgIT+pt7hESEFQQQhBANAIAJBAkZFBEAgASgCACACRgRAIAEQ+xYgASgCBCEECyADIARqIAU+AgAgASACQQFqIgI2AgggA0EEaiEDIAVCIIghBQwBCwsgACABKQMANwIAIABBCGogAUEIaigCADYCACABQRBqJAAL+gEBAX8CQAJAAkACQAJAAkACQCAAKAIAQQFrDgcBAgMGBgQFAAsgASAAQQhqEJsjDwsgASAAQQhqELsiDwsgACgCBCABEOASDwsgACgCBCABEOASDwsgACgCBCIAKAIoQTBsIQIgACgCJEEoaiEAA0AgAkUNAiAAKAIABEAgACABELItCyACQTBrIQIgAEEwaiEADAALAAsgACgCBCIALQBFQQNGDQAgAEEgaiEAA0AgAC0AJUECRgRAAkAgACgCCEE4bCECIAAoAgQhAANAIAJFDQEgACABEMsIIAJBOGshAiAAQThqIQAMAAsACwUgACgCICEADAELCwsLrAEBA38jAEEgayICJAACQAJ/AkACQAJAIAEpAwCnIgNBA3FBAWsOAgIBAAsgAygCBCEEIAMoAgAMAgsgAkEBNgIIIAJBkPrBADYCBCACQgA3AhAgAiACQRxqNgIMIAJBBGpBmPrBABC6HQALIAPAIgNB8AFxQQR2IQQgA0EASA0BIAFBAWoLIQEgACAENgIEIAAgATYCACACQSBqJAAPCyAEQQdBqPrBABCvEAALpAEBA38jAEEQayICJAAgAkEIaiABQbzDxAAQtx0gAigCDCEEAkAgAigCCCIBKAIIIgNFBEAgAEEQNgIADAELIAEgA0EBayIDNgIIIAAgASgCBCADQRxsaiIBKQIANwIAIABBCGog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ARDALAwECyACQRBqIAEQ5iMMAwsgAkEEaiABEMAsDAILIAJBCGogARCWBQwBCwwCCyAAQThqIQAMAAsACwUgACgCICEADAELCwsL+gEBAX8CQAJAAkACQAJAAkACQCAAKAIAQQFrDgcBAgMGBgQFAAsgASAAKAIgEKwDDwsgACgCICABEPIPDwsgACgCBCABEOUTDwsgACgCBCABEOUTDwsgACgCBCIAKAIoQTBsIQIgACgCJEEoaiEAA0AgAkUNAiAAKAIABEAgACABEMksCyACQTBrIQIgAEEwaiEADAALAAsgACgCBCIALQBFQQNGDQAgAEEgaiEAA0AgAC0AJUECRgRAAkAgACgCCEE4bCECIAAoAgQhAANAIAJFDQEgACABEIIJIAJBOGshAiAAQThqIQAMAAsACwUgACgCICEADAELCwsLqwMBA38CQAJAAkACQAJAAkACQCAAKAIAQQFrDgcBAgMGBgQFAAsgACgCICABEPYFDwsgACgCICABEKUSDwsgACgCBCABEOsTDwsgACgCBCABEOsTDwsgACgCBCIAKAIoQTBsIQIgACgCJEEoaiEAA0AgAkUNAiAAKAIABEAgACABEPssCyACQTBrIQIgAEEwaiEADAALAAsgACgCBCIALQBFQQNGDQAgAEEgaiEAA0AgAC0AJUECRgRAAkAgACgCCEE4bCEDIAAoAgQhBEEAIQADQAJAIAAgA0cEQAJAAkACQAJAAkACQAJAAkAgACAEaiICKAIAQQFrDgkBAgMEBQkGCQcACyACQRxqIAEQ+iMMCAsgAkEIaiABEL0MDAcLIAJBHGogARD6IwwGCwJAAkAgAkEIaigCAEEBaw4CAQcACyACQRBqIAEQiC0MBgsgAkEQaiABEIctDAULIAJBBGogARD7LAwECyACQRBqIAEQ+iMMAwsgAkEEaiABEPssDAILIAJBCGogARCXBQwBCwwCCyAAQThqIQAMAAsACwUgACgCICEADAELCwsLqgECAn8CfiMAQRBrIgMkAAJAIAAtACVBAkYEQCAAKAIIQThsIQIgACgCBCEAA0AgAkUNAiAAIAEQoAIgAkE4ayECIABBOGohAAwACwALIAMgACkDCCAAKAIYELcjIAEoAhghAiADKQMAIQQgASADKAIINgIYIAEpAxAhBSABIAQ3AxAgACgCICABEL4MIAEpAxAQ6yYgASACNgIYIAEgBTcDEAsgA0EQaiQAC6wBAQN/IABBQGsQkhsgAEGQAWohAyAAKAKEAUHYAGwhAiAAKAKAASEBA0ACQCACBEACQAJAAkACQCABKAIAQQFrDgUAAQIFAwULIAFBBGoQjiMMBAsgAUEEahD2LQwDCyABQQRqEMsQDAILIAFBBGoQ8S0MAQsgAEH4AGoQkSkgAxDLECAALQA8QQZHBEAgAEEQahCSGwsPCyABQdgAaiEBIAJB2ABrIQIMAAsAC7UBAQF/IwBBQGoiAiQAIAAoAhQhACACQfDb3wA2AjggAkHg298ANgIwIAIgAEE0ajYCLCACQdDb3wA2AiggAiAAQRxqNgIkIAJBwNvfADYCICACIAA2AhwgAkGw298ANgIYIAIgAEEQajYCFCACQaDb3wA2AhAgAiAAQcwAajYCDCACIABBQGs2AjwgAiACQTxqNgI0IAFB1NzfAEEKQaTc3wBBBiACQQxqQQYQzgggAkFAayQAC5sBAgF+A38gACABKAIYIgNBAWpBAXYgAyAAKAIMGyAAQRBqEPQhIAEoAhAhBCABKAIIIQUgASkDACECA0AgAlBFBEAgACAEIAJ6p0H4AHFrQQhrKQMAEPQaEL4JIANBAWshAyACQgF9IAKDIQIMAQsgAwRAIARBQGohBCAFKQMAQn+FQoCBgoSIkKDAgH+DIQIgBUEIaiEFDAELCwuyAQEBfyMAQTBrIgIkACACAn8CQAJAAkACQAJAIAAtAABBAWsOAwECAwALIAJBofbBADYCCEEODAQLIAJBr/bBADYCCEEODAMLIAJBvfbBADYCCAwBCyACQdP2wQA2AggLQRYLNgIMIAJBATYCFCACQfz24AA2AhAgAkIBNwIcIAJBBTYCLCACIAJBKGo2AhggAiACQQhqNgIoIAEoAhQgASgCGCACQRBqEK0kIAJBMGokAAurAQECfyMAQUBqIgEkACABIAAoAgAoAlAiAjYCFCABQQhqIAAoAgQgACgCCCACQZSfxAAQxBQgASABKAIIIgA2AhggASAAIAEoAgxqNgIcIAFBGGoQ1hoiAEGAgMQARgRAIAFBATYCJCABQbyfxAA2AiAgAUIBNwIsIAFBCTYCPCABIAFBOGo2AiggASABQRRqNgI4IAFBIGpBxJ/EABC6HQALIAFBQGskACAAC6QBAQJ/IwBBIGsiBCQAAkAgAS0AnA1BAUcEQAJAAkAgASkDAEICUQ0AIAIoAsgEQQJGDQMgBEEQaiIFIAEgAkHYAWogAxC2BSAEIAUQ+RcgBCgCAEECRg0AIAAgBCkCADcCACAAQQhqIARBCGopAgA3AgAMAQsgACABIAIgAxCrBAsgBEEgaiQADwtB3evgAEEoQZiMwwAQ7hcAC0G4i8MAENopAAunAQEBfyMAQTBrIgIkAAJ/IAAtAABFBEAgAC0AASEAIAJBATYCHCACQfz24AA2AhggAkIBNwIkIAJBpQE2AhAgAiAAOgAXIAIgAkEMajYCICACIAJBF2o2AgwgASgCFCABKAIYIAJBGGoQrSQMAQsgAkEANgIoIAJBATYCHCACQYixwwA2AhggAkIENwIgIAEoAhQgASgCGCACQRhqEK0kCyACQTBqJAALnAEBA38jAEHgAGsiAiQAIAJBCGogAUEgakHwt8MAELcdIAIoAgwhASACKAIIIQMgAkEINgJQIAJBEGogAyACQdAAahDnCCABIAEoAgBBAWo2AgAgAEEIaiEBIAIoAhQhAwJAIAIoAhAiBEEqRgRAIAEgAzYCAAwBCyABIAJBGGpBOBD8BhoLIAAgBDYCACAAIAM2AgQgAkHgAGokAAuaAQEFfyABKAIEIgQgASgCACIGa0ECdiIFIAAoAgAgACgCCCICa0sEQCAAIAIgBUEEQQwQpBcgACgCCCECCyAAKAIEIAJBDGxqIQMgAiAFaiECIAEoAgghAQNAIAQgBkZFBEAgA0EIaiABKAIANgIAIANBADYCACADQQRqIARBBGsiBCgCADYCACADQQxqIQMMAQsLIAAgAjYCCAugAQEFfyMAQRBrIgIkAAJAIAEoAgQiBEUEQCAAQQhqQcif4wApAwA3AgAgAEHAn+MAKQMANwIADAELIAJBDCAEQQFqEKENIAIoAgAgASgCACIFIAIoAgQiA0EJahD8BiIGIANBf3NBDGxqIAUgBEF/c0EMbGogA0EMbEEMahD8BhogACADNgIEIAAgBjYCACAAIAEpAgg3AggLIAJBEGokAAuuAQEEf0EwIQJBNSEDQQEhAQJAAkACQAJAAkACQAJAIAAoAgAiBEEEa0EAIARBBWtBCEkbDgkABAMFBgEGBgIGCyAAKAIgQYCAgIB4RyEBDAULQQAhAQwECyAALQBFQQFzIQEMAwtBICECQSchAwtBACEBIAAgA2otAAANASAAIAJqKAIAKAIYQYCAgIB4RyEBDAELQQAhASAALQBJDQAgAC0ARUEBcyEBCyABQQFxC54BAQF/AkACQCAAKAIAIgJBCUcEQAJAAkACQAJAAkAgAkEBaw4IAAcBAgMGBAYHCyAAQQhqIAEQWA8LAkACQCAAKAIIQQFrDgIBBgALIABBEGogARC9LQ8LIABBEGogARC8LQ8LIAAoAgQgARBXDwsgAEEQaiABEJkkDwsgAEEEaiABELQtDwsgAEEIaiABEJkFCw8LIABBHGogARCZJAuNAQIBfgR/IwBBgAFrIgQkACAAKQMAIQJB/wAhAANAIAQgACIDaiIFIAKnQQ9xIgBBMHIgAEHXAGogAEEKSRs6AAAgA0EBayEAIAJCEFQgAkIEiCECRQ0ACyADQYEBTwRAIANBgAFBgPTAABCuEAALIAFBAUHkuOAAQQIgBUGAASADaxCFBCAEQYABaiQAC58BAQJ/IwBBEGsiAiQAIAAoAgAhACABKAIUQdq04ABBASABKAIYKAIMEQMAIQMgAkEAOgAJIAIgAzoACCACIAE2AgQgAkH/AToADiACQQA7AQwDQAJAIAIgAkEMahDkEiACLQAARQ0AIAIgAi0AASIBOgAPIAAgARDaFUUNASACQQRqIAJBD2pBGBCBCAwBCwsgAkEEahDhHCACQRBqJAALnQECAX4DfwJAIAAoAgwiA0UNACAAKAIAIgJBCGohACACKQMAQn+FQoCBgoSIkKDAgH+DIQFBASEEA0AgBEUNAQNAIAFCAFJFBEAgAkHgAGshAiAAKQMAQn+FQoCBgoSIkKDAgH+DIQEgAEEIaiEADAELCyACIAF6p0EDdkF0bGpBDGsQ8R4gAUIBfSABgyEBIANBAWsiAyEEDAALAAsLjgEBBX8jAEEQayIEJAACQCACQQdNBEAgAiEDIAEhBQNAIANBAEchBiADRQ0CIANBAWshAyAFLQAAIAVBAWohBUEuRw0ACwwBCyAEQQhqQS4gASACELYHIAQoAghBAUYhBgsgACAGIAAtAARyOgAEIAAoAgAiACgCFCABIAIgACgCGCgCDBEDACAEQRBqJAALjgEBAX9B/wEhBSAAQQg6AA4gACADOgANIAAgA0H/AXEEf0F/QQAgA2tBB3F0QX9zIANBB3F0BSAFCzoADCAAIAE2AgggACAEOgAWIABBADoAFSAAIAJBAms2AgQgACABQQFqNgIAIAAgASACakEBazYCECAAQX9BfyAEQQdxdEF/cyAEQf8BcUEIRhs6ABQLvgICAn8CfgJAAkACQAJAAkACQAJAQQQgAS0AACIDQQJrQf8BcSICIAJBBE8bQQFrDgQAAQIFAwtBsJXkACkDAFAEQEGBtuAAQQQQ1BohBEGwleQAKQMAQbCV5AAgBDcDABDlGAsgAEGwleQAKQMAEPQaNwMIDAMLQaiV5AApAwBQBEBBybzgAEEEENQaIQRBqJXkACkDAEGoleQAIAQ3AwAQ5RgLIABBqJXkACkDABD0GjcDCAwCC0GgleQAKQMAUARAQcS84ABBBRDUGiEEQaCV5AApAwBBoJXkACAENwMAEOUYCyAAQaCV5AApAwAQ9Bo3AwgMAQsgACABLQABELkGNwMIC0EBIQIMAQtBASECIANBAXFFBEAgACABLQABELkFNwMIDAELIAAgAUEIajYCBEEAIQILIAAgAjYCAAuWAQACQAJAAkACQAJAAkACQAJAIAAoAgBBAWsOCQABAgcDBQcFBAYLIABBCGogARCRDA8LIAAoAhgNAwwECwJAAkAgACgCCEEBaw4CAQQACyAAQRBqIAEQ0CwPCyAAQRBqIAEQzywPCyAAQRBqIAEQ4SMPCyAAQQhqIAEQ/QQLDwsgAEEcaiABEOEjDwsgAEEEaiABEMssC54BAgN/AX5BgAEhAiAAKAIAIgMgAyABa0ECdSIBaiIEKQAAIgUgBUIBhoNCgIGChIiQoMCAf4N6p0EDdiADIAAoAgQgAUEIa3FqIgEpAAAiBSAFQgGGg0KAgYKEiJCgwIB/g3mnQQN2akEHTQRAIAAgACgCCEEBajYCCEH/ASECCyAEIAI6AAAgAUEIaiACOgAAIAAgACgCDEEBazYCDAuSAQEBfyMAQeAAayIBJAAgAUHQAGogAEEIaikCADcCACABQdgAaiAAQRBqKQIANwIAIAEgACkCADcCSCABQRRqIAFBzABqKQIANwIAIAFBHGogAUHUAGopAgA3AgAgAUEkaiABQdwAaigCADYCACABQQA2AgggAUEbNgIAIAEgASkCRDcCDCABENgoIAFB4ABqJAALkwEBBn8gACABKAJ0IAEoAnAiBGsiBRCPHyABIARBOGxqIQIgACgCBCAAKAIIIgZBOGxqIQMDQAJAIAVFDQAgASAEQQFqIgQ2AnAgAigCACIHQQpGDQAgAyAHNgIAIANBBGogAkEEakE0EPwGGiAFQQFrIQUgAkE4aiECIANBOGohAyAGQQFqIQYMAQsLIAAgBjYCCAuPAQICfwF+IwBBIGsiAiQAAn9BASABKQMAIgRCAVYNABogAS0ASCEDIANBAXMgBFBFDQAaQQAgA0EBcQ0AGkEBIAAoAgAoAgANABogAiABKQMIIAEoAhgQtyMgAiACKAIINgIYIAIgAikDACIENwMQIAAoAgQgAkEQahDNHiAEEPEaQQFzCyACQSBqJABBAXELnwEBAX8jAEEgayICJAACQAJAAkAgAS0AFEECRg0AIAIgACABIAEoAhgQ5AYgAi0AFEEDRw0BIAEtABRBAkYNACAAKAIkIAEQ+wUaCyABKAIYIAAQ1AUMAQsgARClJCABQRhqIAJBGGopAwA3AwAgAUEQaiACQRBqKQMANwMAIAFBCGogAkEIaikDADcDACABIAIpAwA3AwALIAJBIGokAAuJAQEFfyMAQYABayIEJAAgACgCACEAQf8AIQIDQCAEIAIiA2oiBSAAQQ9xIgJBMHIgAkE3aiACQQpJGzoAACADQQFrIQIgAEEQSSAAQQR2IQBFDQALIANBgQFPBEAgA0GAAUGA9MAAEK4QAAsgAUEBQeS44ABBAiAFQYABIANrEIUEIARBgAFqJAALigEBBX8jAEGAAWsiBCQAIAAoAgAhAEH/ACECA0AgBCACIgNqIgUgAEEPcSICQTByIAJB1wBqIAJBCkkbOgAAIANBAWshAiAAQRBJIABBBHYhAEUNAAsgA0GBAU8EQCADQYABQYD0wAAQrhAACyABQQFB5LjgAEECIAVBgAEgA2sQhQQgBEGAAWokAAuPAQEFfyMAQYABayIEJAAgAC0AACEAQf8AIQIDQCAEIAIiA2oiBSAAQQ9xIgJBMHIgAkHXAGogAkEKSRs6AAAgA0EBayECIABB/wFxIgZBBHYhACAGQRBPDQALIANBgQFPBEAgA0GAAUGA9MAAEK4QAAsgAUEBQeS44ABBAiAFQYABIANrEIUEIARBgAFqJAALjwEBBX8jAEGAAWsiBCQAIAAvAQAhAEH/ACECA0AgBCACIgNqIgUgAEEPcSICQTByIAJBN2ogAkEKSRs6AAAgA0EBayECIABB//8DcSIGQQR2IQAgBkEQTw0ACyADQYEBTwRAIANBgAFBgPTAABCuEAALIAFBAUHkuOAAQQIgBUGAASADaxCFBCAEQYABaiQAC6MBAQJ/IwBBEGsiAyQAAkAgASgCACICIAEoAgRGBEAgAEGBgICAeDYCAAwBCyABIAJBGGo2AgACQCACKAIAQYCAgIB4RgRAIANBgICAgHg2AgQMAQsgA0EEaiACQQRqKAIAIAJBCGooAgAQ9xMLIAAgAykCBDcCACAAIAItABQ6ABQgACACKQIMNwIMIABBCGogA0EMaigCADYCAAsgA0EQaiQAC8MBAQF/IAAoAjgiASAAKAI8EOUPIAAoAjQgARDoKSAAKAJAIAAoAkQQ2SkgACgCUCIBIAAoAlQQ9xcgACgCTCABEN0pIABB5ABqENoiIAAoAnwiASAAKAKAARDoHCAAKAJ4IAEQ6CkgAEGIAWoQ1yIgAEGUAWoQ1yIgACgCvAEgACgCwAEQ4CkgACgCzAEgACgC0AEQ8ykgACgCoAEgACgCpAEQ4CkgACgCrAEgACgCsAEQ6CkgACgC3AEgACgC4AEQ6CkLjwEBA38jAEEgayIBJAACQCACKAIQIgQgAigCFCIFTQRAIAIoAgBBAWtBAk8EQCABQRRqIgMgACACKAIIIAIoAgwgBCAFEIwHIAFBBGogAxD1GwwCCyABQRRqIgMgACACKAIIIAIoAgwgBCAFEJ4LIAFBBGogAxD1GwwBCyABQQA2AgQLIAEoAgQgAUEgaiQAC48BAQN/IwBBIGsiASQAAkAgAigCECIEIAIoAhQiBU0EQCACKAIAQQFrQQJPBEAgAUEUaiIDIAAgAigCCCACKAIMIAQgBRD7CyABQQRqIAMQ9RsMAgsgAUEUaiIDIAAgAigCCCACKAIMIAQgBRC3ECABQQRqIAMQ9RsMAQsgAUEANgIECyABKAIEIAFBIGokAAuWAQICfwF+AkAgAAJ/IAEoAgBBBUYEQCABKAIEDAELIAEpAgAiBUIgiKchAQJAAkACQEECIAWnIgRBA2siAyADQQJPG0EBaw4CAQIAC0EBIQMgAhDrHAwCCyACRQ0CQQEhAyABIAJBAWsQ5RoMAQtBASEDIAQgARDeGgs2AgQgACADNgIADwtB0OLDAEEkQfTiwwAQtRIAC60BAQJ/AkACQAJAAkACQCABKAIIDgIBAgALIABBBGogAUEkEPwGGiAAQYeAxAA2AgAPCyAAQYCAxAA2AgAgACABKQIMNwIEIABBFGogAUEcaikCADcCACAAQQxqIAFBFGopAgA3AgAMAQsgAUEANgIIIAEoAgQiAigCACIDQYiAxABGDQEgACADNgIAIABBBGogAkEEakHUABD8BhoLIAEQ2iYPC0GYxtYAENopAAuaAQAgAEEAOgAYIABBfzYCFCAAIAY2AhAgACAFNgIMIAAgBDYCCCAAIAM2AgQgACACNgIAIAEoAhQiAiABKAIMRgRAIAFBDGoQ9RYLIAEgAkEBajYCFCABKAIQIAJBHGxqIgEgACkCADcCACABQQhqIABBCGopAgA3AgAgAUEQaiAAQRBqKQIANwIAIAFBGGogAEEYaigCADYCAAuNAQICfgF/IAAgACgCOEEBajYCOCAAIAApAzAgAa1C/wGDIgMgACgCPCIBQQN0QThxrYaEIgI3AzAgAAJ/QQggAWsiBEEBTQRAIAAgACkDGCAChTcDGCAAEJcLIAApAzAhAiAAIAMgBEEDdK2INwMwIAAgAiAAKQMAhTcDACABQQdrDAELIAFBAWoLNgI8C5IBAgR/AX4jAEEgayIBJAAQ7SIhAiAAKAIAIgAoAhQhAyAAKQIMIQUgAC8BGCEEIAFBBGogABDNCiABQRxqIgAgBDsBACACIAEpAgQ3AgAgASAFNwIQIAJBCGogAUEMaikCADcCACABIAM2AhggAkEQaiABQRRqKQIANwIAIAJBGGogACgCADYCACABQSBqJAAgAgugAQIBfwF+IwBBEGsiAiQAAn8CQAJAAkAgACgCACIAKQMAQgN9IgOnQQFqQQAgA0ICVBtBAWsOAgECAAsgAiAANgIEIAFBrvLYAEEFIAJBBGpBvAMQyAoMAgsgAiAAQQhqNgIIIAFBp/LYAEEHIAJBCGpBvQMQyAoMAQsgAiAAQQhqNgIMIAFBnvLYAEEJIAJBDGpBvgMQyAoLIAJBEGokAAuSAQEDfyMAQfAAayICJAAgACABKAIAQQpHEI8fIAAoAgQgACgCCCEDIAIgAUE4EPwGIQEgA0E4bGohAgNAIAFBOGoiBCABQTgQ/AYaIAFBCjYCACABKAI4QQpGRQRAIAIgBEE4EPwGQThqIQIgA0EBaiEDDAELCyABQThqEO4HIAAgAzYCCCABEO4HIAFB8ABqJAALkgEBA38jAEHgAGsiAiQAIAAgASgCAEETRxCQHyAAKAIEIAAoAgghAyACIAFBMBD8BiEBIANBMGxqIQIDQCABQTBqIgQgAUEwEPwGGiABQRM2AgAgASgCMEETRkUEQCACIARBMBD8BkEwaiECIANBAWohAwwBCwsgAUEwahCSJSAAIAM2AgggARCSJSABQeAAaiQAC7QBAQJ/AkAgACgCACICQQlHBEBBASEBAkACQAJAAkACQAJAAkAgAkEBaw4IAQIDCAQFCAYACyAALQAgQQFzIQEMBwsgAEEIahDAHCEBDAYLIAAtACBBAXMhAQwFCwJAIAAoAghBAWsOAgADBQsgACgCKCgCGEGAgICAeEchAQwECyAALQAUQQFzIQEMAwsgACgCBC0AQUEBcyEBDAILQQAhAQwBCyAAQQhqEMEcIQELIAFBAXELmgEBBH8gAEIANwIMIAAoAghBOGwhAyAAKAIEIQQDQAJAIAIgA0cEQAJAAkACQCACIARqIgEoAgBBAWsOAgECAAsgAUEIahDFGCABQShqEIkuDAMLIAFBCGpCADcCACABQRBqEP0nIAFBMGoiASgCAEUNAiABEIAuDAILIAFBBGoQkyAMAQsgAEEUahCRJg8LIAJBOGohAgwACwALqAEBAX8jAEFAaiICJAAgAkEANgIUIAJCgICAgBA3AgwgAkEDOgA4IAJBIDYCKCACQQA2AjQgAkGQveAANgIwIAJBADYCICACQQA2AhggAiACQQxqNgIsIAJBGGogASgCDCABKAIQEKoDRQRAIAAgAikCDDcCACAAQQhqIAJBFGooAgA2AgAgAkFAayQADwtBuL3gAEE3IAJBP2pBqL3gAEG8vuAAEMYOAAugAQEBfwJAAkACQAJAAkACQEEEIAAoAgBBBWsiASABQQZPGw4FAQIDBAUACyAAQQhqEOIWIAAoAigQyxgPCyAAKQMIEPEaDwsgAEEIahDBKQ8LIABBCGoQmCgPCyAAQQhqEOIWIABByABqEJ4oIABBKGoQ+CQPCyAAEOIWIAAoAiBBB0cEQCAAQSBqEIsRCyAAQegAahDBJiAAQcgAahD4JAuOAQEDfyMAQRBrIgIkACAAKAIAIgMoAgQhACADKAIIIAEoAhRBpLXgAEEBIAEoAhgoAgwRAwAhBCACQQA6AAkgAiAEOgAIIAIgATYCBEEDdCEBA0AgAQRAIAIgADYCDCACQQRqIAJBDGpBKRCBCCABQQhrIQEgAEEIaiEADAELCyACQQRqENscIAJBEGokAAuSAQEFfyAAEKgOIgMhAgJAA0AgASEEIAIiBSgCBCIBRQ0BIAEhAiABKAIAIABHDQALIAUgASgCBCICNgIEIAACfwJAIAEgAygCCEcEQANAIAJFDQJBAiAAIAIoAgBGDQMaIAIoAgQhAgwACwALIAMgBDYCCAtBAAs6AAAgAUEANgIIELIbAAsgAEEAOgAAIAMQ6x0LjwEBA38jAEEQayICJAAgACgCACIDKAIEIQAgAygCCCABKAIUQaS14ABBASABKAIYKAIMEQMAIQQgAkEAOgAJIAIgBDoACCACIAE2AgRBA3QhAQNAIAEEQCACIAA2AgwgAkEEaiACQQxqQZ0BEIEIIAFBCGshASAAQQhqIQAMAQsLIAJBBGoQ2xwgAkEQaiQAC5EBAQR/IAEgACgCACAAKAIIIgNrSwRAIAAgAyABQQRBBBCkFyAAKAIIIQMLIAAoAgQgA0ECdGohBEEBIAEgAUEBTRsiBUEBayECAkADQCACBEAgBEEANgIAIAJBAWshAiAEQQRqIQQMAQUCQCADIAVqIQIgAQ0AIAJBAWshAgwDCwsLIARBADYCAAsgACACNgIIC4EBACACIAAgASADEMcfIgEoAggiAE0EQCABKAIAIABGBEAgARDnFgsgASgCBCACQQN0aiEDIAAgAksEQCADQQhqIAMgACACa0EDdBDQLRoLIAEgAEEBajYCCCADIAatIAWtQv8Bg0IohiAErUL/AYNCIIaEhDcCAA8LIAIgABCxEAALjwEBA38jAEEQayICJAAgACgCACIDKAIEIQAgAygCCCABKAIUQaS14ABBASABKAIYKAIMEQMAIQQgAkEAOgAJIAIgBDoACCACIAE2AgRBHGwhAQNAIAEEQCACIAA2AgwgAkEEaiACQQxqQeoAEIEIIAFBHGshASAAQRxqIQAMAQsLIAJBBGoQ2xwgAkEQaiQAC48BAQN/IwBBEGsiAiQAIAAoAgAiAygCBCEAIAMoAgggASgCFEGkteAAQQEgASgCGCgCDBEDACEEIAJBADoACSACIAQ6AAggAiABNgIEQRRsIQEDQCABBEAgAiAANgIMIAJBBGogAkEMakGWAhCBCCABQRRrIQEgAEEUaiEADAELCyACQQRqENscIAJBEGokAAuPAQEDfyMAQRBrIgIkACAAKAIAIgMoAgQhACADKAIIIAEoAhRBpLXgAEEBIAEoAhgoAgwRAwAhBCACQQA6AAkgAiAEOgAIIAIgATYCBEEcbCEBA0AgAQRAIAIgADYCDCACQQRqIAJBDGpBlwIQgQggAUEcayEBIABBHGohAAwBCwsgAkEEahDbHCACQRBqJAALjwEBA38jAEEQayICJAAgACgCACIDKAIEIQAgAygCCCABKAIUQaS14ABBASABKAIYKAIMEQMAIQQgAkEAOgAJIAIgBDoACCACIAE2AgRBFGwhAQNAIAEEQCACIAA2AgwgAkEEaiACQQxqQZoCEIEIIAFBFGshASAAQRRqIQAMAQsLIAJBBGoQ2xwgAkEQaiQAC48BAQN/IwBBEGsiAiQAIAAoAgAiAygCBCEAIAMoAgggASgCFEGkteAAQQEgASgCGCgCDBEDACEEIAJBADoACSACIAQ6AAggAiABNgIEQThsIQEDQCABBEAgAiAANgIMIAJBBGogAkEMakHtAhCBCCABQThrIQEgAEE4aiEADAELCyACQQRqENscIAJBEGokAAuPAQEDfyMAQRBrIgIkACAAKAIAIgMoAgQhACADKAIIIAEoAhRBpLXgAEEBIAEoAhgoAgwRAwAhBCACQQA6AAkgAiAEOgAIIAIgATYCBEEwbCEBA0AgAQRAIAIgADYCDCACQQRqIAJBDGpB8AIQgQggAUEwayEBIABBMGohAAwBCwsgAkEEahDbHCACQRBqJAALjwEBA38jAEEQayICJAAgACgCACIDKAIEIQAgAygCCCABKAIUQaS14ABBASABKAIYKAIMEQMAIQQgAkEAOgAJIAIgBDoACCACIAE2AgRBOGwhAQNAIAEEQCACIAA2AgwgAkEEaiACQQxqQfICEIEIIAFBOGshASAAQThqIQAMAQsLIAJBBGoQ2xwgAkEQaiQAC48BAQN/IwBBEGsiAiQAIAAoAgAiAygCBCEAIAMoAgggASgCFEGkteAAQQEgASgCGCgCDBEDACEEIAJBADoACSACIAQ6AAggAiABNgIEQQN0IQEDQCABBEAgAiAANgIMIAJBBGogAkEMakHiARCBCCABQQhrIQEgAEEIaiEADAELCyACQQRqENscIAJBEGokAAuPAQEDfyMAQRBrIgIkACAAKAIAIgMoAgQhACADKAIIIAEoAhRBpLXgAEEBIAEoAhgoAgwRAwAhBCACQQA6AAkgAiAEOgAIIAIgATYCBEEEdCEBA0AgAQRAIAIgADYCDCACQQRqIAJBDGpB9AIQgQggAUEQayEBIABBEGohAAwBCwsgAkEEahDbHCACQRBqJAALjwEBA38jAEEQayICJAAgACgCACIDKAIEIQAgAygCCCABKAIUQaS14ABBASABKAIYKAIMEQMAIQQgAkEAOgAJIAIgBDoACCACIAE2AgRBBXQhAQNAIAEEQCACIAA2AgwgAkEEaiACQQxqQfYCEIEIIAFBIGshASAAQSBqIQAMAQsLIAJBBGoQ2xwgAkEQaiQAC48BAQN/IwBBEGsiAiQAIAAoAgAiAygCBCEAIAMoAgggASgCFEGkteAAQQEgASgCGCgCDBEDACEEIAJBADoACSACIAQ6AAggAiABNgIEQQxsIQEDQCABBEAgAiAANgIMIAJBBGogAkEMakH5AhCBCCABQQxrIQEgAEEMaiEADAELCyACQQRqENscIAJBEGokAAuPAQEDfyMAQRBrIgIkACAAKAIAIgMoAgQhACADKAIIIAEoAhRBpLXgAEEBIAEoAhgoAgwRAwAhBCACQQA6AAkgAiAEOgAIIAIgATYCBEEwbCEBA0AgAQRAIAIgADYCDCACQQRqIAJBDGpB7wIQgQggAUEwayEBIABBMGohAAwBCwsgAkEEahDbHCACQRBqJAALjwEBA38jAEEQayICJAAgACgCACIDKAIEIQAgAygCCCABKAIUQaS14ABBASABKAIYKAIMEQMAIQQgAkEAOgAJIAIgBDoACCACIAE2AgRBMGwhAQNAIAEEQCACIAA2AgwgAkEEaiACQQxqQZADEIEIIAFBMGshASAAQTBqIQAMAQsLIAJBBGoQ2xwgAkEQaiQAC48BAQN/IwBBEGsiAiQAIAAoAgAiAygCBCEAIAMoAgggASgCFEGkteAAQQEgASgCGCgCDBEDACEEIAJBADoACSACIAQ6AAggAiABNgIEQThsIQEDQCABBEAgAiAANgIMIAJBBGogAkEMakGVAxCBCCABQThrIQEgAEE4aiEADAELCyACQQRqENscIAJBEGokAAuPAQEDfyMAQRBrIgIkACAAKAIAIgMoAgQhACADKAIIIAEoAhRBpLXgAEEBIAEoAhgoAgwRAwAhBCACQQA6AAkgAiAEOgAIIAIgATYCBEEYbCEBA0AgAQRAIAIgADYCDCACQQRqIAJBDGpBlwMQgQggAUEYayEBIABBGGohAAwBCwsgAkEEahDbHCACQRBqJAALjwEBA38jAEEQayICJAAgACgCACIDKAIEIQAgAygCCCABKAIUQaS14ABBASABKAIYKAIMEQMAIQQgAkEAOgAJIAIgBDoACCACIAE2AgRBOGwhAQNAIAEEQCACIAA2AgwgAkEEaiACQQxqQZkDEIEIIAFBOGshASAAQThqIQAMAQsLIAJBBGoQ2xwgAkEQaiQAC6MBAQN/IABBQGsQixsgAEGQAWohAyAAKAKEAUHYAGwhAiAAKAKAASEBA0ACQCACBEACQAJAAkACQCABKAIAQQFrDgUAAQIFAwULIAFBBGoQhyMMBAsgAUEEahDmLQwDCyABQQRqEMgQDAILIAFBBGoQ3y0MAQsgAxDIECAALQA8QQZHBEAgAEEQahCLGwsPCyABQdgAaiEBIAJB2ABrIQIMAAsAC5oBAQJ/AkACQAJAAkACQEEHIAEoAgAiA0EMayICIAJBJk8bIgJBAmsOBgMDBAQEAQALIAJBDUYNASACQRNHDQMMAgsgA0ELRw0CIAEoAgRBAUYNAQwCCyABKAIMIgNFDQEgASgCCCECIANBAWshAQNAIAFFDQIgACACKAIAEIENIAFBAWshASACQQRqIQIMAAsACyAAIAEQzAELC5kBAgF/AX4jAEEgayIDJAAgA0EQaiACIAFBABDTAQJAAkAgAy0AEEEERwRAIAMpAxAiBEL/AYNCBFINAQsgA0EANgIQIANBCGogAiADQRBqQbGv4ABBARCsEwJAIAMtAAhBBEcEQCADKQMIIgRC/wGDQgRSDQELIABBBDoAAAwCCyAAIAQ3AgAMAQsgACAENwIACyADQSBqJAALjwEBA38jAEEQayICJAAgACgCACIDKAIEIQAgAygCCCABKAIUQaS14ABBASABKAIYKAIMEQMAIQQgAkEAOgAJIAIgBDoACCACIAE2AgRBKGwhAQNAIAEEQCACIAA2AgwgAkEEaiACQQxqQaMFEIEIIAFBKGshASAAQShqIQAMAQsLIAJBBGoQ2xwgAkEQaiQAC6ABAQZ/IwBBEGsiASQAIAFBCGogAEGkA2oiBiAAKAL8BSICQQAgABC6FSAAKAK4AyEDIAAoArQDIQQgASgCDCEAIAEoAgghBQNAIAVBAUYEQCAEIAMgAEHsj8AAELEfKAABQQFGBEAgBCADIABB/I/AABCxHyACNgABCyABIAYgAkEBIAAQuhUgASgCBCEAIAEoAgAhBQwBCwsgAUEQaiQAC5EBAQJ/IwBBEGsiBCQAAn8gAygCBARAIAMoAggiBUUEQCAEQQhqIAEgAkEAENsZIAQoAgghAyAEKAIMDAILIAMoAgAgBSABIAIQ+QIhAyACDAELIAQgASACEJsZIAQoAgAhAyAEKAIECyEFIAAgAyABIAMbNgIEIAAgA0U2AgAgACAFIAIgAxs2AgggBEEQaiQAC5IBAQV/IAAoAgwgACgCBCIBa0EFdiEDA0AgAwRAIAEoAgAiAkGAgICAeEcEQCACIAFBBGooAgAQ1ikLIAFBGGooAgAhAiABQRxqKAIAIgUoAgAiBARAIAIgBBEBAAsgBSgCBCIEBEAgAiAEIAUoAggQ0RELIANBAWshAyABQSBqIQEMAQsLIAAoAgggACgCABDuKQuRAQECfyMAQRBrIgIkACABIAFBEGsiAxDiGQRAIAJBCGogAUEIaikCADcDACACIAEpAgA3AwADQAJAIAMiAUEQaiABKQIANwIAIAFBGGogAUEIaikCADcCACAAIAFGDQAgAiABQRBrIgMQ4hkNAQsLIAEgAikDADcCACABQQhqIAJBCGopAwA3AgALIAJBEGokAAuJAQICfgF/IAEgASgCOEEEajYCOCABIAEpAzAgAK0iAyABKAI8IgBBA3RBOHGthoQiAjcDMCABAn9BCCAAayIEQQRNBEAgASABKQMYIAKFNwMYIAEQlwsgASkDMCECIAEgAyAEQQN0rYg3AzAgASACIAEpAwCFNwMAIABBBGsMAQsgAEEEags2AjwLiwEBAn8jAEEQayIEJAACQAJAAn8gASgCACIDQQFqQX5xIANGBEAgASgCCAwBCyAEQQhqIAEQ7hogBCgCCCEDIAQoAgwLIgFBA08EQCADLAACQb9/TA0BDAILIAFBAkYNAQsgAyABQQIgASACENAmAAsgACABQQJrNgIEIAAgA0ECajYCACAEQRBqJAALnQECAX8BfiMAQRBrIgIkAAJ/AkACQAJAQgIgACgCACIAKQMAQgJ9IgMgA0ICWhunQQFrDgIBAgALIAIgAEEIajYCBCABQZ7y2ABBCSACQQRqQasDEMgKDAILIAIgAEEIajYCCCABQafy2ABBByACQQhqQawDEMgKDAELIAIgADYCDCABQa7y2ABBBSACQQxqQa0DEMgKCyACQRBqJAALlQEBBH8gACgCCEE4bCEEIAAoAgQhBQNAAkAgAyAERwRAAkACQAJAIAMgBWoiAigCAEEBaw4CAQIACyABIAJBCGoQ5yEgAkEoaiABENYrDAMLIAEgAkEQahDIGSACQTBqIgIoAgBFDQIgAiABENQrDAILIAEgAkEEahCsJQwBCyAAQRRqIAEQzyMPCyADQThqIQMMAAsAC5oBAQN/IAAoAghBOGwhAyAAKAIEIQRBACEAA0ACQCAAIANHBEACQAJAAkAgACAEaiICKAIAQQFrDgIBAgALIAJBCGogARDyISACQShqIAEQ4ywMAwsgAkEQaikDACACQSBqKAIAIAEQ1RQgAkEwaiICKAIARQ0CIAIgARDNLAwCCyACQQRqIAEQ6C0MAQsPCyAAQThqIQAMAAsAC5gBAQN/IAAoAghBDGwhAyAAKAIEIQADQCADBEACQCAAKAIABEAgACABEJstDAELAkACQAJAQQQgACgCBCICKAIAQQVrIgQgBEEGTxtBAWsOBQABAwMCAwsgAkEIaiABEKsiIAJBKGogARCbLQwCCyACQShqIAEQmy0MAQsgAkEIaiABEKsiCyAAQQxqIQAgA0EMayEDDAELCwuaAQEEfyMAQRBrIgIkACACIAEoAhQiAxDaHAJAIAIoAgBFBEAgAigCBCEEIAFBDGoiBSgCACADRgRAIAUQ5hYLIAAgBDYCBCAAQQM2AgAgASADQQFqNgIUIAEoAhAgA0EJbGoiAEIANwAAIABBCGpBADoAAAwBCyAAIAIpAwg3AxAgAEL+////BzcDCCAAQQA2AgALIAJBEGokAAuJAQEDfyMAQRBrIgIkACAAKAIEIQMgACgCCCABKAIUQaS14ABBASABKAIYKAIMEQMAIQQgAkEAOgAJIAIgBDoACCACIAE2AgRBAnQhAQNAIAEEQCACIAM2AgwgAkEEaiACQQxqQRwQgQggAUEEayEBIANBBGohAwwBCwsgAkEEahDbHCACQRBqJAALiQEBA38jAEEQayICJAAgACgCBCEDIAAoAgggASgCFEGkteAAQQEgASgCGCgCDBEDACEEIAJBADoACSACIAQ6AAggAiABNgIEQQxsIQEDQCABBEAgAiADNgIMIAJBBGogAkEMakErEIEIIAFBDGshASADQQxqIQMMAQsLIAJBBGoQ2xwgAkEQaiQAC4kBAQN/IwBBEGsiAiQAIAAoAgQhAyAAKAIIIAEoAhRBpLXgAEEBIAEoAhgoAgwRAwAhBCACQQA6AAkgAiAEOgAIIAIgATYCBEEMbCEBA0AgAQRAIAIgAzYCDCACQQRqIAJBDGpBLBCBCCABQQxrIQEgA0EMaiEDDAELCyACQQRqENscIAJBEGokAAuJAQEDfyMAQRBrIgIkACAAKAIEIQMgACgCCCABKAIUQaS14ABBASABKAIYKAIMEQMAIQQgAkEAOgAJIAIgBDoACCACIAE2AgRBAnQhAQNAIAEEQCACIAM2AgwgAkEEaiACQQxqQSoQgQggAUEEayEBIANBBGohAwwBCwsgAkEEahDbHCACQRBqJAALhwEBBX8jAEGAAWsiBCQAQf8AIQIDQCAEIAIiA2oiBSAAQQ9xIgJBMHIgAkE3aiACQQpJGzoAACADQQFrIQIgAEH/AXEiBkEEdiEAIAZBEE8NAAsgA0GBAU8EQCADQYABQYD0wAAQrhAACyABQQFB5LjgAEECIAVBgAEgA2sQhQQgBEGAAWokAAuEAQECfyADQfj///8BcQRAIAAgACADQQN2IgNBBHQiBGogACADQRxsIgVqIAMQlA0hACABIAEgBGogASAFaiADEJQNIQEgAiACIARqIAIgBWogAxCUDSECCyAAIAIgASAAKAIAIgAgASgCACIBSSIDIAEgAigCACICSXMbIAMgACACSXMbC6ABAQF/IwBBQGoiAiQAIAJBADYCFCACQoCAgIAQNwIMIAJBAzoAOCACQSA2AiggAkEANgI0IAJBgP/BADYCMCACQQA2AiAgAkEANgIYIAIgAkEMajYCLCABIAJBGGoQrRdFBEAgACACKQIMNwIAIABBCGogAkEUaigCADYCACACQUBrJAAPC0G4veAAQTcgAkE/akGY/8EAQby+4AAQxg4AC6ABAQF/IwBBQGoiAiQAIAJBADYCFCACQoCAgIAQNwIMIAJBAzoAOCACQSA2AiggAkEANgI0IAJBrIDCADYCMCACQQA2AiAgAkEANgIYIAIgAkEMajYCLCABIAJBGGoQrRdFBEAgACACKQIMNwIAIABBCGogAkEUaigCADYCACACQUBrJAAPC0G4veAAQTcgAkE/akHEgMIAQby+4AAQxg4AC6ABAQF/IwBBQGoiAiQAIAJBADYCFCACQoCAgIAQNwIMIAJBAzoAOCACQSA2AiggAkEANgI0IAJBgP/BADYCMCACQQA2AiAgAkEANgIYIAIgAkEMajYCLCABIAJBGGoQoRlFBEAgACACKQIMNwIAIABBCGogAkEUaigCADYCACACQUBrJAAPC0G4veAAQTcgAkE/akGY/8EAQby+4AAQxg4AC4YBAQJ/IANB+P///wFxBEAgACAAIANBA3YiA0HgAGwiBGogACADQagBbCIFaiADEJgNIQAgASABIARqIAEgBWogAxCYDSEBIAIgAiAEaiACIAVqIAMQmA0hAgsgACACIAEgACgCDCIAIAEoAgwiAUkiAyABIAIoAgwiAklzGyADIAAgAklzGwuKAQEDfyMAQRBrIgIkACAAKAIEIQMgACgCCCABKAIUQaS14ABBASABKAIYKAIMEQMAIQQgAkEAOgAJIAIgBDoACCACIAE2AgRBBXQhAQNAIAEEQCACIAM2AgwgAkEEaiACQQxqQZ8BEIEIIAFBIGshASADQSBqIQMMAQsLIAJBBGoQ2xwgAkEQaiQAC4oBAQN/IwBBEGsiAiQAIAAoAgQhAyAAKAIIIAEoAhRBpLXgAEEBIAEoAhgoAgwRAwAhBCACQQA6AAkgAiAEOgAIIAIgATYCBEEMbCEBA0AgAQRAIAIgAzYCDCACQQRqIAJBDGpBoAEQgQggAUEMayEBIANBDGohAwwBCwsgAkEEahDbHCACQRBqJAALigEBA38jAEEQayICJAAgACgCBCEDIAAoAgggASgCFEGkteAAQQEgASgCGCgCDBEDACEEIAJBADoACSACIAQ6AAggAiABNgIEQQJ0IQEDQCABBEAgAiADNgIMIAJBBGogAkEMakH5ABCBCCABQQRrIQEgA0EEaiEDDAELCyACQQRqENscIAJBEGokAAuKAQEDfyMAQRBrIgIkACAAKAIEIQMgACgCCCABKAIUQaS14ABBASABKAIYKAIMEQMAIQQgAkEAOgAJIAIgBDoA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2xwgAkEQaiQAC5ABAQZ/IwBBEGsiAiQAIAEoAgQhByACQQhqIAEoAggiBEEEQQQQ+RQgAigCCCIFIARB/////wNxIgEgASAFSxshA0EAIQEgAigCDCEGA0AgAwRAIAEgBmogASAHahDxGTYCACADQQFrIQMgAUEEaiEBDAELCyAAIAQ2AgggACAGNgIEIAAgBTYCACACQRBqJAALkAEBBn8jAEEQayICJAAgASgCBCEHIAJBCGogASgCCCIEQQRBBBD5FCACKAIIIgUgBEH/////A3EiASABIAVLGyEDQQAhASACKAIMIQYDQCADBEAgASAGaiABIAdqEPAcNgIAIANBAWshAyABQQRqIQEMAQsLIAAgBDYCCCAAIAY2AgQgACAFNgIAIAJBEGokAAuoAQECfyABKALAASABKALEARD0HCIDQYCAxABHBEAgAUHAAWoiBBCvFQJ/QQAgA0ENRw0AGkENIQNBACABKALAASABKALEARD0HEEKRw0AGiAEEK8VQQFBAiACGyEDQbrv4ABBuO/gACACGwshAiAAIAM2AgggACACNgIEIABBADYCACABIAEoAtABNgKkASABIAEoAqABQQFqNgKgAQ8LQZTo2AAQ2ikAC4oBAQN/IwBBEGsiAiQAIAAoAgQhAyAAKAIIIAEoAhRBpLXgAEEBIAEoAhgoAgwRAwAhBCACQQA6AAkgAiAEOgAIIAIgATYCBEECdCEBA0AgAQRAIAIgAzYCDCACQQRqIAJBDGpBuAIQgQggAUEEayEBIANBBGohAwwBCwsgAkEEahDbHCACQRBqJAALigEBA38jAEEQayICJAAgACgCBCEDIAAoAgggASgCFEGkteAAQQEgASgCGCgCDBEDACEEIAJBADoACSACIAQ6AAggAiABNgIEQQJ0IQEDQCABBEAgAiADNgIMIAJBBGogAkEMakHxAhCBCCABQQRrIQEgA0EEaiEDDAELCyACQQRqENscIAJBEGokAAuKAQEDfyMAQRBrIgIkACAAKAIEIQMgACgCCCABKAIUQaS14ABBASABKAIYKAIMEQMAIQQgAkEAOgAJIAIgBDoACCACIAE2AgRBBHQhAQNAIAEEQCACIAM2AgwgAkEEaiACQQxqQfUCEIEIIAFBEGshASADQRBqIQMMAQsLIAJBBGoQ2xwgAkEQaiQAC4oBAQN/IwBB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AiAAKAIkQShqIQADQCACRQ0CIAAoAgAEQCAAIAEQmy0LIAJBMGshAiAAQTBqIQAMAAsACyAAKAIEIgAtAEVBA0YNACAAQSBqIQADQCAALQAlQQJGBEACQCAAKAIIQThsIQMgACgCBCEEQQAhAANAAkAgACADRwRAIAAgBGoiAigCACIFQQlHBEACQAJAAkACQAJAAkACQCAFQQFrDggBAgMEBQkGCQALIAJBHGogARCFJAwICyACQQhqIAEQwQ0MBwsgAkEcaiABEIUkDAYLIAJBCGooAgANBSACQRBqIAEQni0MBQsgASACQQRqKAIAEJIBDAQLIAJBEGogARCFJAwDCyACQQRqIAEQmy0MAgsgAkEIaiABENoEDAELDAILIABBOGohAAwACwALBSAAKAIgIQAMAQsLCwugAQEBfyMAQUBqIgIkACACQQA2AhQgAkKAgICAEDcCDCACQQM6ADggAkEgNgIoIAJBADYCNCACQbTL3wA2AjAgAkEANgIgIAJBADYCGCACIAJBDGo2AiwgASACQRhqEK0XRQRAIAAgAikCDDcCACAAQQhqIAJBFGooAgA2AgAgAkFAayQADwtBuL3gAEE3IAJBP2pBzMvfAEG8vuAAEMYOAAugAQEBfyMAQUBqIgIkACACQQA2AhQgAkKAgICAEDcCDCACQQM6ADggAkEgNgIoIAJBADYCNCACQbTL3wA2AjAgAkEANgIgIAJBADYCGCACIAJBDGo2AiwgASACQRhqEKEZRQRAIAAgAikCDDcCACAAQQhqIAJBFGooAgA2AgAgAkFAayQADwtBuL3gAEE3IAJBP2pBzMvfAEG8vuAAEMYOAAugAQEBfyMAQUBqIgIkACACQQA2AhQgAkKAgICAEDcCDCACQQM6ADggAkEgNgIoIAJBADYCNCACQei84AA2AjAgAkEANgIgIAJBADYCGCACIAJBDGo2AiwgASACQRhqEJUrRQRAIAAgAikCDDcCACAAQQhqIAJBFGooAgA2AgAgAkFAayQADwtBuL3gAEE3IAJBP2pBgL3gAEG8vuAAEMYOAAugAQEBfyMAQUBqIgIkACACQQA2AhQgAkKAgICAEDcCDCACQQM6ADggAkEgNgIoIAJBADYCNCACQei84AA2AjAgAkEANgIgIAJBADYCGCACIAJBDGo2AiwgASACQRhqEJ0ZRQRA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AQIACyABQQhqEI0jIAFBKGoQ8C0MAwsgAUEQahDWJSABQTBqIgEoAgBFDQIgARDvLQwCCyABQQRqEJUpDAELIABBFGoQ9yUPCyACQThqIQIMAAsAC38AAkACQCADIARLDQACQCADRQ0AIAIgA0sEQCABIANqLAAAQb9/Sg0BDAILIAIgA0cNAQsgBEUNASACIARLBEAgASAEaiwAAEG/f0wNAQwCCyACIARGDQELIAEgAiADIARB0NjfABDQJgALIAAgBCADazYCBCAAIAEgA2o2AgALoQEBAX8gACgCDCIBIAAoAhAQwR4gACgCCCABEOspIAAoAhQgACgCGBCKFwJAIAAoAoABRQ0AIAAoAoQBBEAgAEGEAWoQ9BULIAAoAogBRQ0AIABBiAFqEPUVCyAAQZQBahC7ICAAKALcAhDmGCAAKALgAhDmGCAAKALkAhDQFyAAKALoAhDnGCAAKAKgAxC0FCAAQShqEKomIABB0ABqEKomC38BAX8jAEEgayIDJAAgA0EQaiAAIAEQnSAgAyADKQMQNwIYIAJBAWohAQJAAkADQCABQQFrIgEEQCADQQhqIANBGGoQsxEgAygCCEEBRg0BDAILCyADIANBGGoQsxEgAygCAEEBcQ0BC0GghcQAENopAAsgAygCBCADQSBqJAALhQEBA38jAEEQayICJAAgACgCACEDQQAhACABKAIUQaS14ABBASABKAIYKAIMEQMAIQQgAkEAOgAJIAIgBDoACCACIAE2AgQDQCAAQYACRkUEQCACIAAgA2o2AgwgAkEEaiACQQxqQZABEIEIIABBAWohAAwBCwsgAkEEahDbHCACQRBqJAALigEBAn8jAEEQayICJAAgAkEEaiAAIAEQ1QMgAigCBCEDQTRBBBChICIAQgA3AhQgAEEBNgIQIAAgATYCDCAAQQE2AgggACABNgIEIABBATYCACAAQYECOwAxIAAgA0EBczoAMCAAQRxqQgA3AgAgAEEkakIANwIAIABBLGpBADYCACACQRBqJAAgAAuFAQECfwJ/AkACQAJAIAJFBEAgAQ0BQQAMBAsgAkEBayIDIAFPDQEgACADai0AAEGcmcQAai0AACEEQQAhAyABIAJNDQIgACACai0AAEGcmcQAai0AACEDDAILIAAtAABBnJnEAGotAAAMAgsgAyABQdyVxAAQrRAA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CwwBCyAAQQA2AgAPCyAAQQA2AgALigEBAX8jAEEwayICJAACf0EBIAEoAhRBIiABKAIYKAIQEQIADQAaIAIgATYCDCACQQE2AhQgAkH89uAANgIQIAJCATcCHCACQccANgIsIAIgADYCKCACIAJBKGo2AhhBASACQQxqIAJBEGoQ8iQNABogASgCFEEiIAEoAhgoAhARAgALIAJBMGokAAt9AQN/IwBBgAJrIgIkACACQQBBgAIQigshBEEAIQICQANAAkAgAyAEaiACOgAAIANB/wFGDQAgASADENoVBEAgAkH/AXFBAWoiAkH/AXEgAkcNAwsgA0EBaiEDDAELCyAAIARBgAIQ/AYaIARBgAJqJAAPC0GsrcAAENopAAuEAQECfyMAQSBrIgMkACADQRRqIgQgASACENAQIANBCGogBBC/FQJAIAMoAhAEQCAAIAMpAgg3AgAgAEECOgAMIABBCGogA0EQaigCADYCAAwBCyAAQQhqQZiCwgApAgA3AgAgAEGQgsIAKQIANwIAIAMoAgggAygCDBDZKQsgA0EgaiQAC4oBAQN/IABBufPd8XlsIQMCQANAQcyL5AAoAgAiAEUEQBCeFSEACyADQQAgACgCCGt2IgEgACgCBCICTw0BIAAoAgAgAUEGdGoiASABKAIAIgJBASACGzYCACACBEAgARDTEAsgAEHMi+QAKAIARwRAIAEQ6x0MAQsLIAEPCyABIAJBwPfCABCtEAALfAEDfyACIAFrQQJ2IgUgACgCACAAKAIIIgNrSwRAIAAgAyAFQQRBDBCkFyAAKAIIIQMLIAAoAgQgA0EMbGohBCADIAVqIQMDQCABIAJGRQRAIARBADYCACAEQQRqIAJBBGsiAigCADYCACAEQQxqIQQMAQsLIAAgAzYCCAt9AQN/IwBBgAJrIgIkACACQQBBgAIQigshBEEAIQICQANAAkAgAyAEaiACOgAAIANB/wFGDQAgASADENoVBEAgAkH/AXFBAWoiAkH/AXEgAkcNAwsgA0EBaiEDDAELCyAAIARBgAIQ/AYaIARBgAJqJAAPC0GQssMAENopAAuEAQEEfyMAQRBrIgQkACACKAJ4IAIoAnwgAS0A1wQiByADQf///z9xakEBakHA4sMAEK8fKAIAIgZBAEgEQCAEIAI2AgwgBCABNgIIIAQgBEEIaiADIAdB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ACEDIAJBADoACSACIAM6AAggAiABNgIEIAIgAC0AADoADiACQQRqQcGyxABBBSACQQ5qQdEBEPQGIAIgAC0AAToAD0HGssQAQQMgAkEPakHRARD0BhCsECACQRBqJAALewECfyMAQSBrIgQkACAAAn8CQCABEMsTIgVFBEAgAS0A+AFBAkcNASABLQCfAkUNASAEQYEBOgAIIAEgAiAEQQhqEMgjDAELIAAgBTYCBEEBDAELIARBFToACCABIAIgBEEIahDmKCAAIAM5AwhBAAs2AgAgBEEgaiQAC4QBAQN/IwBBIGsiAyQAAkAgASgCwAEiAiABKALEAUYEQCAAQSU2AgAMAQsgAi0AACIEQQJ0QeT+2ABqKAIAIgIEQCAAIAEgAhEAAAwBCyABKALQASECIAFBwAFqQQEQ5yggA0EhOgAIIAMgBDYCDCAAIAIgAiADQQhqENohCyADQSBqJAALhQEBA38gACgCCEE4bCEDIAAoAgQhBEEAIQADQAJAIAAgA0cEQAJAAkACQCAAIARqIgIoAgBBAWsOAgECAAsgAkEIaiABEPMhIAJBKGogARDTLAwDCyACQTBqIgIoAgBFDQIgAiABEMAsDAILIAJBBGogARDrLQwBCw8LIABBOGohAAwACwALhQEBA38gACgCCEE4bCEDIAAoAgQhBEEAIQADQAJAIAAgA0cEQAJAAkACQCAAIARqIgIoAgBBAWsOAgECAAsgASACQQhqEPAhIAJBKGogARDdLAwDCyACQTBqIgIoAgBFDQIgAiABEMssDAILIAJBBGogARDpLQwBCw8LIABBOGohAAwACwALhQEBA38gACgCCEE4bCEDIAAoAgQhBEEAIQADQAJAIAAgA0cEQAJAAkACQCAAIARqIgIoAgBBAWsOAgECAAsgAkEIaiABEJAiIAJBKGogARCCLQwDCyACQTBqIgIoAgBFDQIgAiABEPwsDAILIAJBBGogARD4LQwBCw8LIABBOGohAAwACwALhQEBA38gACgCCEE4bCEDIAAoAgQhBEEAIQADQAJAIAAgA0cEQAJAAkACQCAAIARqIgIoAgBBAWsOAgECAAsgAkEIaiABEJEiIAJBKGogARCFLQwDCyACQTBqIgIoAgBFDQIgAiABEP0sDAILIAJBBGogARD3LQwBCw8LIABBOGohAAwACwALhQEBA38gACgCCEE4bCEDIAAoAgQhBEEAIQADQAJAIAAgA0cEQAJAAkACQCAAIARqIgIoAgBBAWsOAgECAAsgAkEIaiABEJIiIAJBKGogARCGLQwDCyACQTBqIgIoAgBFDQIgAiABEPssDAILIAJBBGogARD5LQwBCw8LIABBOGohAAwACwALhQEBA38gACgCCEE4bCEDIAAoAgQhBEEAIQADQAJAIAAgA0cEQAJAAkACQCAAIARqIgIoAgBBAWsOAgECAAsgAkEIaiABEKsiIAJBKGogARCmLQwDCyACQTBqIgIoAgBFDQIgAiABEJstDAILIAJBBGogARCILgwBCw8LIABBOGohAAwACwALhwEBAn8gASgCFCICKAI8QQZ0IQEgAigCOEE8aiECAkADQCACIQMgAUUEQEEAIQEMAgsgAUFAaiEBIANBQGshAiADLQAAQQZHDQALIANBPGsiAUEEaigCACABQQhqKAIAQfjV3wAQpiMhAkEEEOMgIgEgAjYCAAsgAEHo1d8ANgIEIAAgATYCAAtuAQN/QX8hBAJAIAFFDQADQCABQQFNBEACQCAAIANBKGxqKAIYIgAgAkcNAEEAIQQMAwsFIAMgAUEBdiIFIANqIgMgACADQShsaigCGCACSxshAyABIAVrIQEMAQsLIAMgACACSWohAwsgAyAEaguFAQEDfyABKAJYIQQCQAJAAkAgASgCIEGBgICAeEYEQEEBIQMgBEGBgICAeEcNAUEAIQEMAwsgASgCGCECIARBgYCAgHhHDQFBASEDQQAhAQwCCyABKAJQIgEhAgwBCyACIAEoAlAiASACaiICTSEDCyAAIAI2AgggACADNgIEIAAgATYCAAtiAQR+IAAgAkL/////D4MiAyABQv////8PgyIEfiIFIAQgAkIgiCICfiIEIAMgAUIgiCIGfnwiAUIghnwiAzcDACAAIAMgBVStIAIgBn4gASAEVK1CIIYgAUIgiIR8fDcDCAt8AQF/IwBBQGoiBSQAIAUgATYCDCAFIAA2AgggBSADNgIUIAUgAjYCECAFQQI2AhwgBUHYs9gANgIYIAVCAjcCJCAFIAVBEGqtQoCAgICgAYQ3AzggBSAFQQhqrUKAgICAsAGENwMwIAUgBUEwajYCICAFQRhqIAQQuh0AC3gBAn8jAEEQayIDJAAgAigCFEGkteAAQQEgAigC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QCACRQRAQQQhBiAFIARBBBDREQwBC0EEIAUgBEEEIAJBAnQiAxD5AiIGRQ0BGgsgASACNgIAIAEgBjYCBEGBgICAeAshASAAIAM2AgQgACABNgIAC3YBAn8jAEEwayIBJAAgASAANgIMIAAtAABBAk8EQCABQQE2AhQgAUGwq8MANgIQIAFCATcCHCABQfwANgIsIAEgAUEoajYCGCABIAFBDGo2AiggAUEQakGkrMMAELodAAsgACgCBCAAQQxBBBDRESABQTBqJAALagECfyACBH8CQAJAIAEgAkEBayIDSwRAIAAgA2otAABBnJnEAGotAAAhBEEBIQMgASACSw0BDAILIAMgAUHslcQAEK0QAAsgACACai0AAEGcmcQAai0AAEEBcyEDCyADIARxBUEAC0EBcQtyACAAQRxqIAEgAhC2ESAAQRhqIARBGGooAgA2AgAgAEEQaiAEQRBqKQIANwIAIABBCGogBEEIaikCADcCACAAIAQpAgA3AgAgACADKQIANwIoIABBMGogA0EIaikCADcCACAAQThqIANBEGopAgA3AgALWwECfwJAIAEgA0cNACABQQFqIQEDQCABQQFrIgFFIQQgAUUNASAALQAAIAItAABHDQEgAkEBaiEDIABBAWogAEECaiEAIAJBAmohAi0AACADLQAARg0ACwsgBAtpAQR/IwBBEGsiAiQAIAJBCGogASgCACIDQRBqKAIAIANBFGooAgAgASgCBCIDEKIYIAAgAigCCCIEBH8gAigCDCEFIAEgA0EBajYCBCAAQQRqIAQgBRC2EUEDBUEGCzoAACACQRBqJAALcAECfyMAQSBrIgEkAAJAIAAoAiBBAkYEQCAAQSRqIQIMAQsgASAANgIIIAEgAEEkaiICNgIMIAEgAUEfajYCGCABIAFBDGo2AhQgASABQQhqNgIQIABBIGogAUEQakGQy9gAEO4ECyABQSBqJAAgAgtqAQJ/IAFBBHQhAQNAIAEEQCAAQQRqKAIAIABBCGooAgAgAhDcCCACQQsgAC0ADCIEQQlrIgMgA0H/AXFBDU8bQf8BcSIDELIgIANBC0YEQCAEIAIQiyoLIABBEGohACABQRBrIQEMAQsLC3IBBH8jAEEgayIBJAACQCAAKAIAIgJFBEBBACEADAELEOsiIQAgAigCDCEDIAIoAhAhBCABQQxqIAIQqQ0gAEEQaiAENgIAIAAgASkCDDcCACABIAM2AhggAEEIaiABQRRqKQIANwIACyABQSBqJAAgAAvhAgIQfwF+IwBBIGsiAyQAAkAgACgCACIBRQRAQQAhAAwBCxDrIiEAIAEoAgwhCiABKAIQIQsgA0EMaiEFIwBBQGoiAiQAIAEoAgQhDCACQQhqIAEoAggiB0EIQTAQ+RQgAigCCCIIIAdB/////wBxIgEgASAISxshBiACQRhqIQ0gAigCDCEJA0AgBgRAIAQgDGoiASkCACERIA0gAUEIahDOGyABQShqLwEAIQ4gAUEqai0AACEPIAFBIGoQ9SQhECABQSRqEPUkIQEgAiAPOgA6IAIgDjsBOCACIBE3AxAgAiABNgI0IAIgEDYCMCAEIAlqIAJBEGpBMBDQLRogBkEBayEGIARBMGohBAwBCwsgBSAHNgIIIAUgCTYCBCAFIAg2AgAgAkFAayQAIABBEGogCzYCACAAIAMpAgw3AgAgAyAKNgIYIABBCGogA0EUaikCADcCAAsgA0EgaiQAIAALegECfyMAQSBrIgIkACAAIAEQ+yIiAQRAIAAoAqACIQMgAEElNgKgAiAAIAApA7gCNwPwAiACQRRqIABBrAJqKQIANwIAIAJBHGogAEG0AmooAgA2AgAgAiAAKQKkAjcCDCACIAM2AgggAkEIahDCCgsgAkEgaiQAIAELegEDfyMAQRBrIgMkAAJAAkACQCABKAIAQQFrDgIBAQALIANBCGogAUEIahCgHCADKAIIIgIgASgCKBClDyIEIAIgBEkbIQEgAiAEIAIgBEsbIQIMAQsgASgCDCECIAEoAgghAQsgACACNgIEIAAgATYCACADQRBqJAALeQEBfyMAQRBrIgEkAAJ/AkACQAJAAkACQAJAIAAoAgBBAWsOBgIBAgMEBQALIAEgAEEIahCtFSABKAIEDAULIAAoAgwMBAsgACgCFAwDCyAAKAIQDAILIAAoAggMAQsgAUEIaiAAKAIEEI0DIAEoAgwLIAFBEGokAAtrAQF/IwBBIGsiAiQAIAJBCGogAUElEJQJAkAgAigCCEElRwRAIAAgAikDCDcDACAAQRBqIAJBGGopAwA3AwAgAEEIaiACQRBqKQMANwMADAELIAAgAigCDDYCBCAAQSY2AgALIAJBIGokAAtrAQF/IwBBIGsiAiQAIAJBCGogAUEmEKsGAkAgAigCCEElRwRAIAAgAikDCDcDACAAQRBqIAJBGGopAwA3AwAgAEEIaiACQRBqKQMANwMADAELIAAgAigCDDYCBCAAQSY2AgALIAJBIGokAAtrAQF/IwBBIGsiAiQAIAJBCGogAUEqEJQJAkAgAigCCEElRwRAIAAgAikDCDcDACAAQRBqIAJBGGopAwA3AwAgAEEIaiACQRBqKQMANwMADAELIAAgAigCDDYCBCAAQSY2AgALIAJBIGokAAtsAQF/IwBBIGsiAiQAIAJBCGogAUH8ABCrBgJAIAIoAghBJUcEQCAAIAIpAwg3AwAgAEEQaiACQRhqKQMANwMAIABBCGogAkEQaikDADcDAAwBCyAAIAIoAgw2AgQgAEEmNgIACyACQSBqJAALcQECfyMAQRBrIgQkACAEQQhqIAIgAyABKAIIIgMQnxkgBCgCDCECIAEgBCgCCCIFNgIIIAAgAjYCDCAAIAE2AgggACADIAJrNgIQIAAgASgCBCIBIAJBOGxqNgIEIAAgASAFQThsajYCACAEQRBqJAALcgEBfyMAQdAAayICJAAgAkEIaiABEOQYIAJByABqIAJBIGopAwA3AgAgAkFAayACQRhqKQMANwIAIAJBOGogAkEQaikDADcCACAAQQA2AgAgAiACKQMINwIwIABBBGogAkEsakEkEPwGGiACQdAAaiQAC3MBBH8jAEEQayICJAAgAkEIakEAQQAgASgCCCIEEJ8ZIAIoAgwhAyABIAIoAggiBTYCCCAAIAM2AgwgACABNgIIIAAgBCADazYCECAAIAEoAgQiASADQdgAbGo2AgQgACABIAVB2ABsajYCACACQRBqJAALcQECfyMAQRBrIgQkACAEQQhqIAIgAyABKAIIIgMQnxkgBCgCDCECIAEgBCgCCCIFNgIIIAAgAjYCDCAAIAE2AgggACADIAJrNgIQIAAgASgCBCIBIAJBMGxqNgIEIAAgASAFQTBsajYCACAEQRBqJAALegEDfyMAQRBrIgMkAAJAAkACQCABKAIAQQFrDgIBAQALIANBCGogAUEIahDKHCADKAIIIgIgASgCKBClDyIEIAIgBEkbIQEgAiAEIAIgBEsbIQIMAQsgASgCDCECIAEoAgghAQsgACACNgIEIAAgATYCACADQRBqJAALeAIB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IAEQgiIMAwsgAEEEaiABEMwsDAILIABBBGogARDtLAwBCyAAQQRqIAEQyQ8LIABBKGohACACQShrIQIMAQsLC3kBAX8gACgCCEEobCECIAAoAgQhAANAIAIEQAJAAkACQAJAAkAgACgCAEEBaw4EAAECAwQLIABBBGogARCAIgwDCyAAQQRqIAEQyywMAgsgAEEEaiABEOssDAELIABBBGogARDKDwsgAEEoaiEAIAJBKGshAgwBCwsLeQEBfyAAKAIIQShsIQIgACgCBCEAA0AgAgRAAkACQAJAAkACQCAAKAIAQQFrDgQAAQIDBAsgAEEEaiABEIQiDAMLIABBBGogARDJLAwCCyAAQQRqIAEQ8CwMAQsgAEEEaiABEMsPCyAAQShqIQAgAkEoayECDAELCwt5AQF/IAAoAghBKGwhAiAAKAIEIQADQCACBEACQAJAAkACQAJAIAAoAgBBAWsOBAABAgMECyAAQQRqIAEQgSIMAwsgAEEEaiABEM0sDAILIABBBGogARDsLAwBCyAAQQRqIAEQzA8LIABBKGohACACQShrIQIMAQsLC3kBAX8gACgCCEEobCECIAAoAgQhAANAIAIEQAJAAkACQAJAAkAgACgCAEEBaw4EAAECAwQLIABBBGogARCKIgwDCyAAQQRqIAEQ+CwMAgsgAEEEaiABEI8tDAELIABBBGogARDNDwsgAEEoaiEAIAJBKGshAgwBCwsLeQEBfyAAKAIIQShsIQIgACgCBCEAA0AgAgRAAkACQAJAAkACQCAAKAIAQQFrDgQAAQIDBAsgAEEEaiABEIwiDAMLIABBBGogARD+LAwCCyAAQQRqIAEQjS0MAQsgAEEEaiABEM4PCyAAQShqIQAgAkEoayECDAELCwt5AQF/IAAoAghBKGwhAiAAKAIEIQADQCACBEACQAJAAkACQAJAIAAoAgBBAWsOBAABAgMECyAAQQRqIAEQjyIMAwsgAEEEaiABEPwsDAILIABBBGogARCMLQwBCyAAQQRqIAEQzw8LIABBKGohACACQShrIQIMAQsLC3kBAX8gACgCCEEobCECIAAoAgQhAANAIAIEQAJAAkACQAJAAkAgACgCAEEBaw4EAAECAwQLIABBBGogARCOIgwDCyAAQQRqIAEQ/SwMAgsgAEEEaiABEI4tDAELIABBBGogARDQDwsgAEEoaiEAIAJBKGshAgwBCwsLeQEBfyAAKAIIQShsIQIgACgCBCEAA0AgAgRAAkACQAJAAkACQCAAKAIAQQFrDgQAAQIDBAsgAEEEaiABEIsiDAMLIABBBGogARD7LAwCCyAAQQRqIAEQkC0MAQsgAEEEaiABENEPCyAAQShqIQAgAkEoayECDAELCwt5AQF/IAAoAghBKGwhAiAAKAIEIQADQCACBEACQAJAAkACQAJAIAAoAgBBAWsOBAABAgMECyAAQQRqIAEQsiIMAwsgAEEEaiABEJwtDAILIABBBGogARCjLQwBCyAAQQRqIAEQ0g8LIABBKGohACACQShrIQIMAQsLC3kBAX8gACgCCEEobCECIAAoAgQhAANAIAIEQAJAAkACQAJAAkAgACgCAEEBaw4EAAECAwQLIABBBGogARCqIgwDCyAAQQRqIAEQmy0MAgsgAEEEaiABEKQtDAELIABBBGogARDTDwsgAEEoaiEAIAJBKGshAgwBCwsLcgECfyMAQRBrIgIkAAJAIAFBgAFPBEAgAkEANgIMIAIgASACQQxqEOEJIAAgAigCACACKAIEEO0dDAELIAAoAggiAyAAKAIARgRAIAAQ8RcLIAAgA0EBajYCCCAAKAIEIANqIAE6AAALIAJBEGokAEEAC14BAn8CQCABRQ0AA38gAUEBTQR/IAAgA0EobGooAhgiACACRg0CIAMgACACSWoFIAMgAUEBdiIEIANqIgMgACADQShsaigCGCACSxshAyABIARrIQEMAQsLIQMLIAMLeQEBfyAAKAIIQShsIQIgACgCBCEAA0AgAgRAAkACQAJAAkACQCAAKAIAQQFrDgQAAQIDBAsgAEEEaiABELoiDAMLIABBBGogARCyLQwCCyAAQQRqIAEQvy0MAQsgAEEEaiABENYPCyAAQShqIQAgAkEoayECDAELCwt5AQF/IAAoAghBKGwhAiAAKAIEIQADQCACBEACQAJAAkACQAJAIAAoAgBBAWsOBAABAgMECyAAQQRqIAEQwCIMAwsgAEEEaiABEK4tDAILIABBBGogARDALQwBCyAAQQRqIAEQ1w8LIABBKGohACACQShrIQIMAQsLC3YBAX8gACgCCEE4bCECIAAoAgQhAANAAkAgAgRAAkACQAJAIAAoAgBBAWsOAgECAAsgAEEIaiABEL4iIABBKGogARC+LQwDCyAAQTBqIAEQtyYMAgsgAEEEaiABEJIuDAELDwsgAEE4aiEAIAJBOGshAgwACwALeQEBfyAAKAIIQShsIQIgACgCBCEAA0AgAgRAAkACQAJAAkACQCAAKAIAQQFrDgQAAQIDBAsgAEEEaiABEL8iDAMLIABBBGogARC0LQwCCyAAQQRqIAEQwS0MAQsgAEEEaiABENkPCyAAQShqIQAgAkEoayECDAELCwt5AQF/IAAoAghBKGwhAiAAKAIEIQADQCACBEACQAJAAkACQAJAIAAoAgBBAWsOBAABAgMECyAAQQRqIAEQxSIMAwsgAEEEaiABELUtDAILIABBBGogARDCLQwBCyAAQQRqIAEQ2g8LIABBKGohACACQShrIQIMAQsLC2IBBX8gAUE0aiEHIAEvATIhBgNAIARBAXEgAyAGS3JFBEAgByADQQJ0aigCACIFIAM7ATAgBSABNgIAIARBASADIAZJIgUbIQQgAyAFaiEDDAELCyAAIAI2AgQgACABNgIAC2QBAX8jAEEgayICJAAgAkEIaiABQaQDakEAQQAQwQYgAigCCCIBQQNHBEAgACACKQIMNwIEIABBFGogAkEcaigCADYCACAAQQxqIAJBFGopAgA3AgALIAAgATYCACACQSBqJAALcAECfyMAQRBrIgYkACABLQABIQcgAS0AACEBIAZBCGogAiADIAQgBUGIl8AAEOkWIAYgASAHIAYoAgggBigCDBDvBUEAIQEgACAGKAIAQQFxBH8gACAGKAIEIARqNgIEQQIFIAELNgIAIAZBEGokAAt4AQF/IwBBIGsiAyQAAkAgASAAKAIATQRAIAMgACABQQQgAhCLECADKAIAIgBBgYCAgHhHDQEgA0EgaiQADwsgA0EANgIYIANBATYCDCADQfSf4wA2AgggA0IENwIQIANBCGpByKDjABC6HQALIAAgAygCBBDcKQALeAEBfyMAQSBrIgIkAAJAIAEgACgCAE0EQCACIAAgAUEEQQQQixAgAigCACIAQYGAgIB4Rw0BIAJBIGokAA8LIAJBADYCGCACQQE2AgwgAkH0n+MANgIIIAJCBDcCECACQQhqQcig4wAQuh0ACyAAIAIoAgQQ3CkAC3UBAX8jAEEQayICJAAgAiAAKAIAIgBBJGo2AgwgAUGCs8AAQQhB+pTaAEEEIABBKGpBM0GKs8AAQQUgAEEIakE0QY+zwABBBSAAQRRqQTVBvIHEAEELIABBIGpBEEGUs8AAQRMgAkEMakEhEIQKIAJBEGokAAtpAQN/IwBBEGsiAiQAIAIgATYCCAJAQQFBAiABEA4iA0EBRhtBACADGyIDQQJHBEAgACADOgABDAELIAAgAkEIaiACQQ9qQezDwAAQ/wQ2AgRBASEECyAAIAQ6AAAgARDJJiACQRBqJAALZgEFfiAAIAApAxgiAUIQiSABIAApAwh8IgGFIgIgACkDECIDIAApAwB8IgRCIIl8IgU3AwAgACACQhWJIAWFNwMYIAAgASADQg2JIASFIgJ8IgEgAkIRiYU3AxAgACABQiCJNwMIC3ABAn8jAEEQayICJAACQCABQYABTwRAIAJBADYCDCACIAEgAkEMahDhCSAAIAIoAgAgAigCBBDpHQwBCyAAKAIIIgMgACgCAEYEQCAAEO4WCyAAIANBAWo2AgggACgCBCADaiABOgAACyACQRBqJAALbAEDfwNAAkAgAQRAIAAoAgAgAEEEaigCABCuJCAAQRhqKAIAIQMgAEEcaigCACIEKAIAIgIEQCADIAIRAQALIAQoAgQiAkUNASADIAIgBCgCCBDREQwBCw8LIAFBAWshASAAQSBqIQAMAAsAC3QAA0AgAQRAAkACQAJAAkAgACgCAEECaw4GAAMDAwECAwsgAEEEaigCACAAQQhqKAIAEOApDAILIABBBGooAgAgAEEIaigCABDZKQwBCyAAQQRqKAIAIABBCGooAgAQ2SkLIAFBAWshASAAQRBqIQAMAQsLC3EBAn8CQAJAIAEgACgCACAAKAIIIgJrSwRAIAAgAiABQQRBBBCkFyAAKAIIIQIMAQsgAUUNAQsgASACaiEDIAAoAgQgAkECdGohAgNAIAJBgICAgHg2AgAgAkEEaiECIAFBAWsiAQ0ACyAAIAM2AggLC3gBAX8jAEEgayIEJAACQCABIAAoAgBNBEAgBCAAIAEgAiADEIsQIAQoAgAiAEGBgICAeEcNASAEQSBqJAAPCyAEQQA2AhggBEEBNgIMIARB9J/jADYCCCAEQgQ3AhAgBEEIakHIoOMAELodAAsgACAEKAIEENwpAAtqAQN/QQMhAgJAIAAgAS0ADCIEQQNHBH8gBEECRwRAIAEoAgAiAiACKAIAIgNBAWo2AgAgA0EASA0CIAEoAgghAyABKAIEIQELIAAgAzYCCCAAIAE2AgQgACACNgIAIAQFIAILOgAMDwsAC3ABAn8jAEEQayICJAACQCABQYABTwRAIAJBADYCDCACIAEgAkEMahDhCSAAIAIoAgAgAigCBBDtHQwBCyAAKAIIIgMgACgCAEYEQCAAEPcWCyAAIANBAWo2AgggACgCBCADaiABOgAACyACQRBqJAALeQECf0EQIQECQAJAAkBBBiAAKAIAIgAoAghBAmsiAiACQQlPG0ECaw4FAgICAgEAC0EEIQELIABBCGogAWoiASgCACABQQRqKAIAENYpCwJAIABBf0YNACAAIAAoAgQiAUEBazYCBCABQQFHDQAgAEHQAEEEENERCwt5AQF/IwBBEGsiAyQAIAMgAjYCDCADIAEoAgBBCGpBqMbYABDqGiADKAIEIQECQCADKAIAIANBDGoQ4QgiAkUEQCAAQYCAgIB4NgIADAELIAAgAkEEaigCACACQQhqKAIAEKcICyABIAEoAgBBAWs2AgAgA0EQaiQAC3kBAX8jAEEQayIDJAAgAyACNgIMIAMgASgCBEEIakGIx9gAEOoaIAMoAgQhAQJAIAMoAgAgA0EMahDhCCICRQRAIABBgICAgHg2AgAMAQsgACACQQRqKAIAIAJBCGooAgAQpwgLIAEgASgCAEEBazYCACADQRBqJAALcAECfyMAQRBrIgIkAAJAIAFBgAFPBEAgAkEANgIMIAIgASACQQxqEOEJIAAgAigCACACKAIEEO0dDAELIAAoAggiAyAAKAIARgRAIAAQ8RcLIAAgA0EBajYCCCAAKAIEIANqIAE6AAALIAJBEGokAAtiAQR/AkAgASADRw0AIAFBAWohAQNAIAFBAWsiAUUhBCABRQ0BIAJBBGohAyAAQQRqIQUgAigCACEGIAAoAgAgAkEIaiECIABBCGohACAFKAIAIAYgAygCABDjHw0ACwsgBAthAQR/IwBBEGsiAiQAIAACfyABQShqIgQQzQ0iBUUEQEEADAELQQAgBSgCAEETRw0AGiACQQhqIAFBASAEELogEIAHIAIoAgghAyACKAIMCzYCBCAAIAM2AgAgAkEQaiQAC3QBBX8jAEEQayICJAAgASgCACEEIAEoAgQhBSACQQhqIAEQ/QkCQCACKAIIRQRAQYCAxAAhAwwBCyACKAIMIQMgASABKAIAIAEoAggiBiAFaiAEIAEoAgRqa2o2AggLIAAgAzYCBCAAIAY2AgAgAkEQaiQAC20BAn8jAEEgayIBJAACQCAAKAIAQQJGBEAgAEEEaiECDAELIAEgADYCCCABIABBBGoiAjYCDCABIAFBH2o2AhggASABQQxqNgIUIAEgAUEIajYCECAAIAFBEGpBmLrfABDuBAsgAUEgaiQAIAILbAEEfyABLQAmIQQgAUEAOgAmIABBDGogACgCCEEGdCECIAAoAgQhAwNAIAIEQCABIAMQyh4gAkFAaiECIANBQGshAwwBCwsgASAEOgAmIAEQkxogACgCGEGAgICAeEcEQCABIABBGGoQmSELC2EBBH8jAEEQayICJAAgAAJ/IAFBKGoiBBDnDSIFRQRAQQAMAQtBACAFKAIAQRNHDQAaIAJBCGogAUEBIAQQ1SAQhQcgAigCCCEDIAIoAgwLNgIEIAAgAzYCACACQRBqJAALdAEDfyABKAIIQShsIQIgASgCBCEDIAAtACghBANAIAIEQCAAQQE6ACggAyAAENARIAJBKGshAiADQShqIQMMAQUCQCABKAIMIgEoAgBBgICAgHhHBEAgASAAEMIaDAELIAFBBGogABCyLQsgACAEOgAoCwsLgAEBAX8gAUKV192Yw5eKjAtRIAJC2KGkg7Hi0d18UXFFBEAgACgCKCEDIABBBGoQyiIgACgCHCAAQSBqKAIAENYpIABBLEEEENERIAMgASACIAMoAgAoAhAREgAPCyAAQQRqEMoiIAAoAigiAyADKAIAKAIAEQEAIABBLEEEENERC74HAwZ/BX4CfCABKAIcQQFxIQQgASgCCEEBRgRAIAEgACsDACAEIAEoAgwQQA8LIAApAwAiCL8hDSAIQv///////////wCDvyIORACA4Dd5w0FDZiAORAAAAAAAAAAAYiAORC1DHOviNho/Y3FyRQRAIAEgDSAEQQEQ7wMPCwJ/IwBBoAFrIgAkACANvSEIAn9BAyANmUQAAAAAAADwf2ENABpBAiAIQoCAgICAgID4/wCDIglCgICAgICAgPj/AFENABogCEL/////////B4MiDEKAgICAgICACIQgCEIBhkL+////////D4MgCEI0iKdB/w9xIgIbIgpCAYMhCyAJUARAQQQgDFAN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NgIMIANB4PfAADYCCCADQgI3AhQgA0KAgICAkAEiBCADQQRqrYQ3AyggAyAEIAOthDcDICADIANBIGo2AhAgA0EIaiACELodAAtuAQF/IwBBMGsiAiQAIAIgATYCBCACIAA2AgAgAkEDNgIMIAJBuLvAADYCCCACQgI3AhQgAiACQQRqrUKAgICAkAGENwMoIAIgAq1CgICAgJABhDcDICACIAJBIGo2AhAgAkEIakG44OAAELodAAtqAgF/AX4jAEEwayIDJAAgAyABNgIEIAMgADYCACADQQM2AgwgA0Hku8AANgIIIANCAjcCFCADQoCAgICQASIEIANBBGqthDcDKCADIAQgA62ENwMgIAMgA0EgajYCECADQQhqIAIQuh0AC2oCAX8BfiMAQTBrIgMkACADIAE2AgQgAyAANgIAIANBAzYCDCADQbD4wAA2AgggA0ICNwIUIANCgICAgJABIgQgA62ENwMoIAMgBCADQQRqrYQ3AyAgAyADQSBqNgIQIANBCGogAhC6HQALawECfyMAQRBrIgMkAANAAkAgAyABNgIIIAMgASACIgRqNgIMIAMgA0EIahDgCSADKAIARQRAQQAhBAwBCyADKAIMIAMoAghrIQIgAygCBEEgRg0BCwsgACAENgIEIAAgATYCACADQRBqJAALpAEBA38gACgCCCIDIAAoAgBGBEAjAEEQayICJAAgAkEIaiAAIAAoAgBBAUEEQSAQnwggAigCCCIEQYGAgIB4RwRAIAQgAigCDBDcKQALIAJBEGokAAsgACADQQFqNgIIIAAoAgQgA0EFdGoiACABKQIANwIAIABBCGogAUEIaikCADcCACAAQRBqIAFBEGopAgA3AgAgAEEYaiABQRhqKQIANwIAC2UBAX8jAEEQayIDJAAgA0EANgIMIANCgICAgBA3AgQgA0EEaiACEPMeIAIEQANAIANBBGogARDpDyACQQFrIgINAAsLIAAgAykCBDcCACAAQQhqIANBDGooAgA2AgAgA0EQaiQAC2oBA38jAEEQayIGJAAgASgCQCEHIAEoAjwhCCAGQQhqIAIgAyAEIAVBxKXDABDpFkEAIQEgACAGKAIIIAYoAgwgCCAHEPgfBH8gACAENgIEIAAgBCAHajYCCEEBBSABCzYCACAGQRBqJAALcgEBfyMAQSBrIgIkACABQQBI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QQhqQf0CEMgKDAELIAIgAEEEajYCDCABQaWu4ABBBCACQQxqQbgCEMgKCyACQRBqJAALYwEBfyMAQRBrIgIkAAJ/IAAoAgAiACgCAEUEQCACIABBCGo2AgggAUGEruAAQQUgAkEIakH9AxDICgwBCyACIABBBGo2AgwgAUHVk9oAQQggAkEMakH/AxDICgsgAkEQaiQAC2IBAn8gACgCCEEEdCECIAAoAgQhAANAAkAgAgRAIAEtADRFDQEgAS0AOiEDIAFBAToAOiAAIAEQ1CsgAEEMaiABEKolIAEgAzoAOgwBCw8LIABBEGohACACQRBrIQIMAAsAC2wBA38jAEEQayICJABBAEEAELoREIoEIQMgACgCFCEEIAAgAzYCFCACIAAQ7wcgASAAENMjIAEoAhggABCbEiAAEOsKIAAgBDYCFCAAQQhqIAJBCGopAgA3AgAgACACKQIANwIAIAJBEGokAAtdAQR/IAEgACgCCCICKAIAIAAoAhAiBCAAKAIMIgNqIgVrSwRAIAIgBSABQQhBOBDAFwsgAigCBCICIAEgA2oiAUE4bGogAiADQThsaiAEQThsENAtGiAAIAE2AgwLbgACQAJAAkACQAJAAkACQCAAKAIAQQFrDgYBAgMEBgUACyAAKQMIIAAoAhggARDVFA8LIABBBGogARCaFw8LIABBBGogARDoLQ8LIABBBGogARCMDQ8LIABBBGogARDNJQ8LIABBBGogARDNLAsLbgACQAJAAkACQAJAAkACQCAAKAIAQQFrDgYBAgMEBgUACyAAKQMIIAAoAhggARC4HA8LIABBBGogARCRFQ8LIABBBGogARDrJQ8LIABBBGogARC8Cw8LIABBBGogARDbJQ8LIABBBGogARD+LAsLaAIBfgF/ENUYIQIgACABKQMANwMAIAEgAjcDACAAQRhqIAFBGGoiAykDADcDACAAQRBqIAFBEGopAwA3AwAgAEEIaiABQQhqIgApAwA3AwAgAEIANwMAIAFBDWpCADcAACADQQA2AgALYQEEfyABIAAoAggiAigCACAAKAIQIgQgACgCDCIDaiIFa0sEQCACIAUgAUEIQdgAEKQXCyACKAIEIgIgASADaiIBQdgAbGogAiADQdgAbGogBEHYAGwQ0C0aIAAgATYCDAt1AQJ/AkACQAJAAkACQAJAAkAgACgC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akEeQYiDxABBByAAQTdBj4PEAEEIIABBEGpBEEGXg8QAQQkgAkEMakEhELQKIAJBEGokAAtbAQF/IwBBMGsiAyQAIAMgATYCDCADIAA2AgggA0EBNgIUIANB/PbgADYCECADQgE3AhwgAyADQQhqrUKAgICAsAGENwMoIAMgA0EoajYCGCADQRBqIAIQuh0AC1YBAX8jAEEgayICJAAgAkEAOgAYIAIgATYCFCACIAA2AhAgAkEBNgIMIAIgAkEMajYCHCACQRxqQZCAwAAQBiACKAIMBEAgAkEQahDJIgsgAkEgaiQAC5ABACAAQcgAakH4ABDxFCAAQdQAakEhEPEUIABB4ABqQT4Q8RQgAEL8gICA4As3AkAgAEL8gICAwA83AjggAELbgICA0As3AjAgAEKngICA4As3AiggAEKugICAgAw3AiAgAEKsgICA4A43AhggAELegICA4Ac3AhAgAEKrgICAoAc3AgggAEKtgICAwA83AgALZgECfyMAQSBrIgEkAAJAAkACQCAApyICQQNxQQFrDgICAAELIAFBATYCCCABQdT5wQA2AgQgAUIANwIQIAEgAUEcajYCDCABQQRqQdz5wQAQuh0ACyACKQMIIQALIAFBIGokACAAC1YBAX8jAEEgayICJAAgAkEANgIQIAJBCGogASACQRBqEOEJIAJBFGogAigCCCACKAIMEL4VIABBCGogAkEcaigCADYCACAAIAIpAhQ3AgAgAkEgaiQAC1YBAX8jAEEgayICJAAgAkEANgIQIAJBCGogASACQRBqEOEJIAJBFGogAigCCCACKAIMEI4RIABBCGogAkEcaigCADYCACAAIAIpAhQ3AgAgAkEgaiQAC1MBAn8jAEEQayIFJAACQCACIARJBEAgBUEEaiIGIAMgBBDBFSAAIAYgASACEPIIDAELIAVBBGoiBiABIAIQwRUgACAGIAMgBBDyCAsgBUEQaiQAC18BAX8jAEEQayICJAAgAiAAQSxqNgIMIAFBmIHEAEEIQaCBxABBCCAAQRhqQR5BqIHEAEEJIABBH0GxgcQAQQsgAEEcakEgQbyBxABBCyACQQxqQSEQtAogAkEQaiQAC1sBAn9BASEDAkAgAkUNAAJAAkAgASACQQFrIgRLBEAgACAEai0AAEEKaw4EAwEBAgELIAQgAUGMlcQAEK0QAAtB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AjYCACAAIAE2AgggBEEgaiQAC1ABA38CQCABLQAADQAgAS0AASIDIAEtAAIiBEsNACADIARPBEBBASECIAFBAToAAAwBC0EBIQIgASADQQFqOgABCyAAIAM6AAEgACACOgAAC1sBAX8jAEEQayICJAACfyAAKAIAIgAtAABFBEAgASgCFEGw7+AAQQQgASgCGCgCDBEDAAwBCyACIABBAWo2AgwgAUG07+AAQQQgAkEMakESEMgKCyACQRBqJAALWwEBf0EBIQMCQCABQf8BcUEBRwRAIAFBASACKAIIGyEDDAELIAJBADYCCCACQQRBBBCjGSACEMoKCyAAIAM6AAwgACACKQIANwIAIABBCGogAkEIaigCADYCAAtYAQF/IAAoAggiAiAAKAIARgRAIAAQghcLIAAgAkEBajYCCCAAKAIEIAJBGGxqIgAgASkCADcCACAAQQhqIAFBCGopAgA3AgAgAEEQaiABQRBqKQIANwIAC1gBAX8gACgCCCICIAAoAgBGBEAgABCDFwsgACACQQFqNgIIIAAoAgQgAkEUbGoiACABKQIANwIAIABBCGogAUEIaikCADcCACAAQRBqIAFBEGooAgA2AgALWwEBfyMAQRBrIgIkAAJ/IAAoAgAiACkDAEICUQRAIAEoAhRBsO/gAEEEIAEoAhgoAgwRAwAMAQsgAiAANgIMIAFBtO/gAEEEIAJBDGpB7QAQyAoLIAJBEGokAAtbAQF/IwBBEGsiAiQAAn8gACgCACIAKAIAQQNGBEAgASgCFEGw7+AAQQQgASgCGCgCDBEDAAwBCyACIAA2AgwgAUG07+AAQQQgAkEMakHvABDICgsgAkEQaiQAC1sBAX8jAEEQayICJAACfyAAKAIAIgAoAgBBAkYEQCABKAIUQbDv4ABBBCABKAIYKAIMEQMADAELIAIgADYCDCABQbTv4ABBBCACQQxqQfEAEMgKCyACQRBqJAALYQEBfyMAQRBrIgIkACACIAAoAgAoAgAiAEHYAGo2AgwgAUG43sMAQQpBx53EAEEGIABBCGpB9wBBw5PaAEEFIABBzABqQfgAQcLewwBBCyACQQxqQfkAEOIKIAJBEGokAAteAQF/IwBBIGsiBCQAIAIgA0sEQCAEQQA2AhggBEEBNgIMIARBiKDDADYCCCAEQgQ3AhAgBEEIakGojsMAELod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QeHW4ABBDiAAQSBqQQ9B79bgAEEEIAJBDGpBogIQ4gogAkEQaiQAC1sAAkACQAJAAkACQAJAIAAoAgBBAWsOBgABAgMFBAULIABBBGogARDKGg8LIABBBGogARCSLg8LIABBBGogARDYDw8LIABBBGogARC/Jg8LIABBBGogARC0LQsLUQEBfyMAQRBrIgQkACAEQQRqIAFBACACIAMQlQogBCgCCCEBIAQoAgRFBEAgACAEKAIMNgIEIAAgATYCACAEQRBqJAAPCyABIAQoAgwQ3CkAC1EBAX8jAEEQayICJAAgAkEEaiABQQBBBEEEEJUKIAIoAgghASACKAIERQRAIAAgAigCDDYCBCAAIAE2AgAgAkEQaiQADwsgASACKAIMENwpAAtDAQF/AkAgACABBH8gAkUNASABIAJuIgMgASACIANsR2oFQQALIgE2AgggAEEBNgIEIAAgATYCAA8LQYCzwgAQpRsAC1EBAX8jAEEQayIDJAAgA0EEaiABQQBBBCACEJUKIAMoAgghASADKAIERQRAIAAgAygCDDYCBCAAIAE2AgAgA0EQaiQADwsgASADKAIMENwpAAtUAQF/IwBBEGsiAiQAAn8gACgCAEUEQCABKAIUQbDv4ABBBCABKAIYKAIMEQMADAELIAIgADYCDCABQbTv4ABBBCACQQxqQfQAEMgKCyACQRBqJAALUgEBfyMAQSBrIgEkACABQQhqIAAQ2hwgASgCCEEBRgRAIAEgASkDEDcDGEG8msMAQRUgAUEYakGYkcMAQZDKwwAQxg4ACyABKAIMIAFBIGokAAt+AQJ/IAAoAgAiACgCCCAAQQxqKAIAEOApIABBFGoiASgCBCICIAEoAggQqAkgASgCACACEPUpIABBIGoiASgCBCICIAEoAggQ9xcgASgCACACEN0pAkAgAEF/Rg0AIAAgACgCBCIBQQFrNgIEIAFBAUcNACAAQTBBBBDREQsLSQBBACEFAkAgAyAETQ0AIAIgBGotAAAiAiABLQAARwRAIAEtAAEgAkcNAQsgACAENgIEQQEhBSAAIARBAWo2AggLIAAgBTYCAAtVAQF/QTRBBBChICIAQgA3AhQgAEEBNgIQIABCATcCCCAAQgE3AgAgAEEAOgAyIABBATsBMCAAQRxqQgA3AgAgAEEkakIANwIAIABBLGpBADYCACAA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PSEEIAMgACABELcjIAMoAgghASADKQMAIQACQCAERQRAIAIgACABEMcQDAELIAIgACABIAItAD4QjgYLIANBEGokAAtMAQF/IAAoAghBOGwhASAAKAIEQTBqIQADQAJAIAEEQCAAQTBrEKwUIAAoAgBFDQEgABDfLQwBCw8LIAFBOGshASAAQThqIQAMAAsAC08BAn8gASAAKAIIIgJJBEBBACECIAAoAgAiAygCACAAKAIEIAFBFGxqIgAoAgBGBH8gAygCBCAAKAIERgUgAgsPCyABIAJBzLffABCtEAALgQECAn4Bf0GgkOQAKQMAUARAQQFBABDUGiECQaCQ5AApAwBBoJDkACACNwMAEOUYC0GgkOQAKQMAEPQaIQIgAEEQaiABQRBqKQMANwMAIABBCGogAUEIaiIEKQMANwMAIAAgASkDADcDACAEQgA3AwAgASACNwMAIAFBDWpCADcAAAtMAgF/AX4CQCABKAIYRQ0AIAEQkA8hAiABIAEoAhhBAWs2AhggAkUNACACQQhrKAIAIQEgAkEQaykDACEDCyAAIAE2AgggACADNwMAC0wBAn8gACgCCEEobCECIAAoAgQhAQNAIAIEQCABKAIAQQdHBEAgARDqEwsgAUEoaiEBIAJBKGshAgwBCwsgAEEUahCoKiAAQQA6ABgLVwEDfyAAKAIEIQMgACgCACEBIABCiICAgIABNwIAIAMgAWtB2ABuIQICQCABIANGDQADQCACRQ0BIAJBAWshAiABEMcIIAFB2ABqIQEMAAsACyAAEMQSC0wBAX8gACgCCEE4bCEBIAAoAgRBMGohAANAAkAgAQRAIABBMGsQ6RMgACgCAEUNASAAEO8tDAELDwsgAUE4ayEBIABBOGohAAwACwALTAEBfyAAKAIIQThsIQEgACgCBEEwaiEAA0ACQCABBEAgAEEwaxDqEyAAKAIARQ0BIAAQ8S0MAQsPCyABQThrIQEgAEE4aiEADAALAAtMAQJ/IABCADcCDCAAKAIIQShsIQIgACgCBCEBA0AgAgRAIAEoAgBBB0cEQCABEKoSCyABQShqIQEgAkEoayECDAELCyAAQRRqEJEmC18AAkACQAJAAkACQAJAAkAgACgCAEEBaw4GAQIDBAUGAAsgAEIANwMQDwsgAEIANwIEDwsgAEIANwIEDwsgAEIANwMIDwsg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NwMIIAEQ2CggAUFAayQAC0oBAX8jAEFAaiIBJAAgAUEUaiAAQRBqKAIANgIAIAFBDGogAEEIaikCADcCACABQRk2AgAgASAAKQIANwIEIAEQ2CggAUFAayQAC0oBAX8jAEFAaiIBJAAgAUEUaiAAQRBqKAIANgIAIAFBDGogAEEIaikCADcCACABQRY2AgAgASAAKQIANwIEIAEQ2CggAUFAayQAC0oBAX8jAEFAaiIBJAAgAUEUaiAAQRBqKQIANwIAIAFBDGogAEEIaikCADcCACABQR02AgAgASAAKQIANwIEIAEQ2CggAUFAayQAC1kBAX8gASgCDCECAkACQAJAAkAgASgCBA4CAAECCyACDQFBASEBQQAhAgwCCyACDQAgASgCACIBKAIEIQIgASgCACEBDAELIAAgARCwBg8LIAAgASACEJwWC08BAX8jAEEQayICJAAgAkEEaiABQQFBARCiCyACKAIIIQEgAigCBEUEQCAAIAIoAgw2AgQgACABNgIAIAJBEGokAA8LIAEgAigCDBDcKQALWwACQCACIANB5bngAEEFEOMfRQRAIAIgA0HfteAAQQcQ4x8NASACIANB5rXgAEEGEOMfRQRAIABBBjoAAA8LIABBgDw7AQAPCyAAQYICOwEADwsgAEGAPjsBAAtbAAJAIAIgA0GAuuAAQQYQ4x9FBEAgAiADQau14ABBCBDjHw0BIAIgA0HOtuAAQQcQ4x9FBEAgAEEGOgAADwsgAEGAKjsBAA8LIABBgho7AQAPCyAAQYASOwEAC08BAX8jAEEQayIDJAAgA0EEaiABQQggAhCiCyADKAIIIQEgAygCBEUEQCAAIAMoAgw2AgQgACABNgIAIANBEGokAA8LIAEgAygCDBDcKQALVAEBfyMAQRBrIgIkACACIABBEGo2AgwgAUHI/9kAQQNB79bgAEEEIABBCGpB+wBBxN7gAEEFIABByQNBwJTaAEEDIAJBDGpB5AMQ4gogAkEQaiQAC1kBAX8gASgCDCECAkACQAJAAkAgASgCBA4CAAECCyACDQFBASEBQQAhAgwCCyACDQAgASgCACIBKAIEIQIgASgCACEBDAELIAAgARCwBg8LIAAgASACELYRC1QBAX8jAEEQayICJAAgAiAANgIMIAFBiITaAEEJQe/W4ABBBCAAQQxqQfsAQeSQ2gBB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ACgCCEEGdCECIAAoAgQhAwNAIAIEQCADIAEQuiYgAkFAaiECIANBQGshAwwBCwsgAEEMaiABEMYaIABBGGogARCgJAtKAQN/IAAoAgAiAgRAIAAoAgQiAygCACIBBEAgAiABEQEACyADKAIEIgEEQCACIAEgAygCCBDREQsgACgCDCAAKAIIKAIMEQEACwtOACABKAIEIAEoAgggAkGEhcAAELAfIQIgACADQQFxBH8gASgCECABKAIUIARBlIXAABCxH0EFagUgAgsoAAAiATYCBCAAIAFBAEc2AgALPQEBfyABIAJBAWoiBEsEQCAAIARBAnRqIAAgAkECdGogAkF/cyABakECdBDQLRoLIAAgAkECdGogAzYCAAtQAAJ/AkACQCACRQRAIAEoAtACIgFFDQEMAgsgASgC1AIiAQ0BQQAQziYhAUEBDAILQQEQziYhAUEBDAELQQALIQIgACABNgIEIAAgAjYCAAtSAQJ/IwBBEGsiASQAQdD54wBB0PnjACgCACICQQFqNgIAIAFBwAAQyQogAEEIaiABQQhqKQIANwIAIAAgASkCADcCACAAIAI2AhAgAUEQaiQAC0wBAn8jAEEQayIDJAAgA0EIaiACQQFBARC5FCADKAIIIQQgAygCDCABIAIQ/AYhASAAIAI2AgggACABNgIEIAAgBDYCACADQRBqJAALTAECfyMAQRBrIgIkACACQQhqIgMgAUEIaigCADYCACACIAEpAgA3AwAgAhDKCiAAQQhqIAMoAgA2AgAgACACKQMANwIAIAJBEGokAAtDAQJ/IwBBEGsiBCQAIARBBGoiBSABIAIQwRUgBSADEM0HIABBCGogBEEMaigCADYCACAAIAQpAgQ3AgAgBEEQaiQAC0sBAn8jAEEQayIDJAAgA0EIaiACELoUIAMoAgghBCADKAIMIAEgAkECdBD8BiEBIAAgAjYCCCAAIAE2AgQgACAENgIAIANBEGokAAtKAQN/IAAoAgghAiAAKAIEIgMhAQNAIAIEQCABKAIAIAFBBGooAgAQ1ikgAkEBayECIAFBDGohAQwBCwsgACgCACADQQRBDBDLIgtHACAAKAK4AiAAKALIAkEUbCAAKALUAkECdGogACgCvAIiACgCEEEDdGogACgCHEEFdGogACgCKEEMbGogACgCLGpqQYADagtPAQF/IwBB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BCIBa0EEdiECA0AgAgRAIAEpAwAQ8RogAkEBayECIAFBEGohAQwBCwsgACgCCCAAKAIAEOopC0IBAn8gAEEAOgA5IAEoAjhBDGwhAiABKAI0IQMDQCACBEAgAyAAENQrIAJBDGshAiADQQxqIQMMAQsLIAEgABDFEQs/AQF/IAAoAghBKGwhAiAAKAIEIQADQCACBEAgACgCAEEHRwRAIAAgARCqFAsgAEEoaiEAIAJBKGshAgwBCwsLPwEBfyAAKAIIQShsIQIgACgCBCEAA0AgAgRAIAAoAgBBB0cEQCAAIAEQxhELIABBKGohACACQShrIQIMAQsLCz8BAX8gACgCCEEobCECIAAoAgQhAANAIAIEQCAAKAIAQQdHBEAgACABEMgRCyAAQShqIQAgAkEoayECDAELCws/AQF/IAAoAghBKGwhAiAAKAIEIQADQCACBEAgACgCAEEHRwRAIAAgARCrFAsgAEEoaiEAIAJBKGshAgwBCwsLPwEBfyAAKAIIQShsIQIgACgCBCEAA0AgAgRAIAAoAgBBB0cEQCAAIAEQrRQLIABBKGohACACQShrIQIMAQsLCz8BAX8gACgCCEEobCECIAAoAgQhAANAIAIEQCAAKAIAQQdHBEAgACABEKkRCyAAQShqIQAgAkEoayECDAELCws/AQF/IAAoAghBKGwhAiAAKAIEIQADQCACBEAgACgCAEEHRwRAIAEgABCvCQsgAEEoaiEAIAJBKGshAgwBCwsLPwEBfyAAKAIIQShsIQIgACgCBCEAA0AgAgRAIAAoAgBBB0cEQCAAIAEQrhQLIABBKGohACACQShrIQIMAQsLCz8BAX8gACgCCEEobCECIAAoAgQhAANAIAIEQCAAKAIAQQdHBEAgACABEK8UCyAAQShqIQAgAkEoayECDAELCwtMAAJAAkACQAJAIAAoAgBBAWsOAwECAwALIAApAwggACgCGCABELgcDwsgAEEEaiABEJEVDwsgAEEEaiABEOslDwsgAEEEaiABELwLCz8BAX8gACgCCEEobCECIAAoAgQhAANAIAIEQCAAKAIAQQdHBEAgACABELEUCyAAQShqIQAgAkEoayECDAELCws/AQF/IAAoAghBKGwhAiAAKAIEIQADQCACBEAgACgCAEEHRwRAIAAgARCrEgsgAEEoaiEAIAJBKGshAgwB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A0EQaiQACz4BAX8jAEEQayIDJAAgA0EMaiACQQhqKAIANgIAIANBBjYCACADIAIpAgA3AgQgACABIAMQ5wggA0EQaiQAC0MBAn8gACgCECAAKAIUIAFB7JjEABCvHygCACIDIAAoAhhJBH8gACgCBCAAKAIIIANB/JjEABCvHygCACABRgUgAgsLQQEBf0EYEOMgIgJBEGogAUEQaikCADcCACACQQhqIAFBCGopAgA3AgAgAiABKQIANwIAIAAgAjYCBCAAQQA2AgALOgACQCACIANNBEBBACEDDAELIAEgA0EDdGoiASgCAEEIaiEDIAEoAgQhAgsgACACNgIEIAAgAzYCAAs8AQF/IwBBEGsiAiQAIAIgACgCACIANgIMIAFB3NPYAEEQIABBDGpB+wAgAkEMakGcARCtCiACQRBqJAALPAEBfyMAQRBrIgIkACACIAAoAgAiAEEMajYCDCABQdDE2ABBByAAQeMBIAJBDGpBpAIQrQogAkEQaiQACzsBAX8gACgCACgCACICKQMAIAAoAgQoAgAgAUEEdGtBEGsiACkDAIUgAkEIaikDACAAQQhqKQMAhYRQC0UBAX9BnJDkACgCACIBRQRAQeTH4ABByAAQ/yoACyABEOkfIAFBCGooAgAgAUEMaigCACAAQbDI2AAQtB8oAgAgARDZHgs9AAJAIAAoAgAiACgCAEEDRwRAIAAQkxwMAQsgAEEQahCfAyAAQQRqEOQmIABBIGoQ5SYLIABBKEEIENERCzgBAX8gACgChAEiAUGAAU0EfyAAQQFqBSAAKAIEIQEgACgCCAsgAUUEQEEAQQBBqODfABCtEAALCywBAX8jAEEQayIBJAAgASAANgIMIAFBATYCCCABQQhqELkjIAFBEGokAEEACzIBAn8gAkEDdCECA0AgAiIDBEAgAkEIayECIAEgABCyCyABQQhqIQFFDQELCyADQQBHCzoBAX8jAEFAaiIBJAAgAUEMaiAAQQhqKQIANwIAIAFBIDYCACABIAApAgA3AgQgARDYKCABQUBrJAALOgEBfyMAQUBqIgEkACABQQxqIABBCGooAgA2AgAgAUEqNgIAIAEgACkCADcCBCABENgoIAFBQGskAAs6AQF/IwBBQGoiASQAIAFBDGogAEEIaikCADcCACABQRE2AgAgASAAKQIANwIEIAEQ2CggAUFAayQACzoBAX8jAEFAaiIBJAAgAUEMaiAAQQhqKQIANwIAIAFBMDYCACABIAApAgA3AgQgARDYKCABQUBrJAALOgEBfyMAQUBqIgEkACABQQxqIABBCGopAgA3AgAgAUEtNgIAIAEgACkCADcCBCABENgoIAFBQGskAAs6AQF/IwBBQGoiASQAIAFBDGogAEEIaigCADYCACABQSE2AgAgASAAKQIANwIEIAEQ2CggAUFAayQACzoBAX8jAEFAaiIBJAAgAUEQaiAAQQhqKQMANwMAIAFBLzYCACABIAApAwA3AwggARDYKCABQUBrJAALOgEBfyMAQUBqIgEkACABQQxqIABBCGopAgA3AgAgAUEsNgIAIAEgACkCADcCBCABENgoIAFBQGskAAs6AQF/IwBBQGoiASQAIAFBDGogAEEIaigCADYCACABQSM2AgAgASAAKQIANwIEIAEQ2CggAUFAayQAC0EAIAAQmBwgACgCACAAQQRqKAIAEJAqIABBDGoQ7CYgAEEYahD4JCAAKAI8ELkeIABBQGsQjycgAEHIAEEEENERC0EAIAAQmBwgACgCACAAQQRqKAIAEJAqIABBDGoQ7CYgAEEYahD4JCAAKAI8ELkeIABBQGsQkycgAEHIAEEEENERC0EAIAAQmBwgACgCACAAQQRqKAIAEJAqIABBDGoQ7CYgAEEYahD4JCAAKAI8ELkeIABBQGsQlycgAEHIAEEEENERCz0AAkAgACgCACIAKAIAQQNHBEAgABCAGwwBCyAAQRBqEL4CIABBBGoQ5CYgAEEgahCjJQsgAEEoQQgQ0RELPQACQCAAKAIAIgAoAgBBA0cEQCAAEIEbDAELIABBEGoQugMgAEEEahDkJiAAQSBqEKMlCyAAQShBCBDREQtBACAAEJgcIAAoAgAgAEEEaigCABCQKiAAQQxqEOwmIABBGGoQ+CQgACgCPBC5HiAAQUBrELcnIABByABBBBDREQtBACAAEJgcIAAoAgAgAEEEaigCABCQKiAAQQxqEOwmIABBGGoQ+CQgACgCPBC5HiAAQUBrEMUnIABByABBBBDREQtBACAAEJgcIAAoAgAgAEEEaigCABCQKiAAQQxqEOwmIABBGGoQ+CQgACgCPBC5HiAAQUBrEMsnIABByABBBBDREQtBAQF/IAAtACYhAiAAQQA6ACYg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rIvkACABQRhqKQMANwIAIAEgAzcDICADp0UNACACEIIICyABQUBrJABBnIvkACIBKAIABEBByPjBABDtFAALIAFBfzYCACABQQRqIAAQ4AsgASABKAIAQQFqNgIACzwAAkAgASACTQRAIAIgA00NASACIANBkMvfABCvEAALIAEgAkGQy98AELAQAAsgACACNgIEIAAgATYCAAs5AQF/IAAoAgAhACABKAIcIgJBEHFFBEAgAkEgcUUEQCAAIAEQ2ykPCyAAIAEQ1wwPCyAAIAEQ2AwLPgEEf0EBIQICQCAAQQRqIgMgASgCFCIEIAEoAhgiBRDkAg0AIAAoAgAgARDgBw0AIAMgBCAFEPAfIQILIAILQAECf0EBIQICQCAAQQRqIgMgASgCFCABKAIYEOQCDQAgACgCACABENspDQAgAyABKAIUIAEoAhgQ8B8hAgsgAgs3AQJ/IAAgAiABayICQQJ2IgMQtxMgACgCBCAAKAIIIgRBAnRqIAEgAhD8BhogACADIARqNgIICzABAX9BfyABIANHIAEgA0kbIgQEfyAEBSAAIAAgAUECdGogAiACIANBAnRqENEQCws6AQF/IwBBEGsiBCQAIARBCGogASACIAMQ9x0gBCgCDCEBIAAgBCgCCDYCACAAIAE2AgQgBEEQaiQAC0cBAX8gACgC6AIgACgC7AIQ1ikgACgCACIBQYCAgIB4RwRAIAEgACgCBBDWKQsgACgCvAJBgICAgHhHBEAgAEG8AmoQwR8LCzkBAX8CQCAALQAMIgFBA0YgAUECRnINACAAKAIAIgEgASgCACIBQQFrNgIAIAFBAUcNACAAELcOCws7AAJAIAEpAwBCAlIEQCAAKALwAkECRg0BIAAgARC0ESAAQcABaiABQYgFahC0EQsPC0GojcQAENopAAs6AQF/IwBBEGsiByQAIAdBCGogASACEL0fIAAgBygCCCADIAQgBSAGIAcoAgwoAiARCAAgB0EQaiQACzUBAX8jAEEQayICJAAgAiAAQQFqNgIMIAFBqovEAEEHIABBGCACQQxqQRIQrQogAkEQaiQACzMBA38gASgCACIEaCIDQR9NBEAgASAEQX4gA3dxNgIAQQEhAgsgACADNgIEIAAgAjYCAAtIAAJAAkACQAJAIAAoAgBBAmsOBgADAwMBAgMLIAAoAgQgACgCCBDg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IAEQ/CwgAkEMayECIABBDGohAAwBCwsLNAEBfyAAKAIIQQJ0IQIgACgCBCEAA0AgAgRAIAAgARCbLSACQQRrIQIgAEEEaiEADAELCws0AQF/IAAoAghBMGwhAiAAKAIEIQADQCACBEAgACABENoEIAJBMGshAiAAQTBqIQAMAQsLCzQBAX8gACgCCEEwbCECIAAoAgQhAANAIAIEQCAAIAEQ+AQgAkEwayECIABBMGohAAwBCwsLNAEBfyAAKAIIQQxsIQIgACgCBCEAA0AgAgRAIAAgARCbLSACQQxrIQIgAEEMaiEADAELCws0AQF/IAAoAghBDGwhAiAAKAIEIQADQCACBEAgACABEJwtIAJBDGshAiAAQQxqIQAMAQsLCzQBAX8gACgCCEEwbCECIAAoAgQhAANAIAIEQCAAIAEQmQUgAkEwayECIABBMGohAAwBCwsLNAEBfyAAKAIIQTBsIQIgACgCBCEAA0AgAgRAIAAgARDsAyACQTBrIQIgAEEwaiEADAELCws0AQF/IAAoAghBDGwhAiAAKAIEIQADQCACBEAgACABEK4tIAJBDGshAiAAQQxqIQAMAQsLCzQBAX8gACgCCEECdCECIAAoAgQhAANAIAIEQCAAIAEQvQMgAkEEayECIABBBGohAAwBCwsLNAEBfyABKAIIQShsIQIgASgCBCEBA0AgAgRAIAEgABDWCCACQShrIQIgAUEoaiEBDAELCws0AQF/IAAoAghBMGwhAiAAKAIEIQADQCACBEAgACABENEeIAJBMGshAiAAQTBqIQAMAQsLCzQBAX8gACgCCEEobCECIAAoAgQhAANAIAIEQCAAIAEQ6hcgAkEoayECIABBKGohAAwBCwsLNAEBfyAAKAIIQTBsIQIgACgCBCEAA0AgAgRAIAAgARDbBCACQTBrIQIgAEEwaiEADAELCws0AQF/IAAoAghBKGwhAiAAKAIEIQADQCACBEAgASAAEKQkIAJBKGshAiAAQShqIQAMAQsLCzQBAX8gACgCCEECdCECIAAoAgQhAANAIAIEQCAAIAEQsi0gAkEEayECIABBBGohAAwBCwsLNAEBfyAAKAIIQQxsIQIgACgCBCEAA0AgAgRAIAAgARCyLSACQQxrIQIgAEEMaiEADAELCws0AQF/IAAoAghBDGwhAiAAKAIEIQADQCACBEAg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AgggAUIENwIQIAFBCGogABC6HQALOgEBfyMAQSBrIgAkACAAQQA2AhggAEEBNgIMIABB6MbgADYCCCAAQgQ3AhAgAEEIakHU98EAELodAAs6AQF/IwBBIGsiACQAIABBADYCGCAAQQE2AgwgAEHoxuAANgIIIABCBDcCECAAQQhqQdTH4AAQuh0ACzYBAX8gACABKAIIIgIgASgCAEkEfyABIAJBAUEBEOwLIAEoAggFIAILNgIEIAAgASgCBDYCAAszAQF/AkAgAEUNACABKAIAIgIEQCAAIAIRAQALIAEoAgQiAkUNACAAIAIgASgCCBDREQsLbwEDfyAAKAIIIgMgACgCAEYEQCMAQRBrIgIkACACQQhqIAAgACgCAEEBQQhBCBCfCCACKAIIIgRBgYCAgHhHBEAgBCACKAIMENwpAAsgAkEQaiQACyAAIANBAWo2AgggACgCBCADQQN0aiABOQMACzMBAX8gACgCCCICIAAoAgBGBEAgABDyFgsgACACQQFqNgIIIAAoAgQgAkECdGogATYCAAssAQF/AkAgAC0AAUEERw0AIAAtAAVBBEcNACAALQAADQAgAC0ACUUhAQsgAQsuAQF/IwBBEGsiAyQAIANBADYCDCADIAI6AAwgACABIANBDGoQ1iIgA0EQaiQACzoBAX8jAEEgayIAJAAgAEEANgIYIABBATYCDCAAQYj5wgA2AgggAEIENwIQIABBCGpBiPrCABC6HQALOgEBfyMAQSBrIgAkACAAQQA2AhggAEEBNgIMIABBiPnCADYCCCAAQgQ3AhAgAEEIakGY+sIAELodAAs9AQF/IABBBGohAQJAAkACQCAAKAIAQQFrDgMBAgIACyABKAIAQSRqIQEMAQsgASgCAEEsaiEBCyABKAIACzIBAX8jAEEQayICJAAgAiAAKAIANgIMIAFBuJzEAEEMIAJBDGpB8wAQyAogAkEQaiQACzMBAX8gACgCCCIBIAAoAgBGBEAgABDnFgsgACABQQFqNgIIIAAoAgQgAUEDdGpCADcCAAszAQF/IAAoAggiASAAKAIARgRAIAAQ6hYLIAAgAUEBajYCCCAAKAIEIAFBAnRqQQA2AgALMAEBfyMAQRBrIgIkACACQQhqIAAgARC9HyACKAIIIAIoAgwoAigRBQAgAkEQaiQACygBAX8gASACSwR/IAAgAkEDdGoiACgCBCAAKAIAa0EBdkEBagUgAwsLMgEBfyMAQRBrIgIkACACIAAoAgA2AgwgAUGUncQAQQogAkEMakGFARDICiACQRBqJAALMgEBfyMAQRBrIgIkACACIAAoAgA2AgwgAUHAncMAQQkgAkEMakGMARDICiACQRBqJAALMgEBfyMAQRBrIgIkACACIAAoAgA2AgwgAUHcysMAQQogAkEMakGhARDICiACQRBqJAALMQEBfyMAQRBrIgIkACACIAAoAgA2AgwgAUH4ycMAQQ4gAkEMakENEMgKIAJBEGokAAsqAEF/IAAgAiABIAMgASADSRsQnBUiACABIANrIAAbIgBBAEcgAEEASBsLMgEBfyABKAIAIgIgASgCBEYEQCAAQSs2AgAPCyABIAJBHGo2AgAgACABQQhqIAIQ+SkLMwEBfyAAKAIIIgIgACgCAEYEQCAAEOcWCyAAIAJBAWo2AgggACgCBCACQQN0aiABNwIACzIBAX8jAEEQayICJAAgAiAAKAIANgIMIAFBgZ3EAEETIAJBDGpBuAEQyAogAkEQaiQACzEBAX8jAEEQayICJAAgAiAAKAIANgIMIAFBmMjDAEEKIAJBDGpBOxDICiACQRBqJAALMgEBfyMAQRBrIgIkACACIAAoAgA2AgwgAUHEnMQAQRggAkEMakG7ARDICiACQRBqJAALMQEBfyMAQRBrIgIkACACIAAoAgA2AgwgAUGencQAQRAgAkEMakE2EMgKIAJBEGokAAsyAQF/IwBBEGsiAiQAIAIgACgCADYCDCABQemcxABBDCACQQxqQb8BEMgKIAJBEGokAAsyAQF/IwBBEGsiAiQAIAIgACgCADYCDCABQdycxABBDSACQQxqQcMBEMgKIAJBEGokAAsxAQF/IwBBEGsiAiQAIAIgACgCADYCDCABQficxABBCSACQQxqQTYQyAogAkEQaiQACzABAn8gASgCACIDIAEoAgRJBEAgASADQQFqNgIAQQEhAgsgACADNgIEIAAgAjYCAAsuAQF/AkAgACABEPgeBH8gAUEMTQ0BIAAoAAkFIAILDwtBDSABQfjcwwAQrxAACzIBAX8jAEEQayICJAAgAiAAKAIANgIMIAFB9ZzEAEEDIAJBDGpBygEQyAogAkEQaiQACy8BAX8jAEEQayIDJAAgA0EIaiAAEJYM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CiACQRBqJAALLwEBfyMAQRBrIgIkACACIAA2AgwgAUHwkMMAQQcgAkEMakHuABDICiACQRBqJAALLwEBfyMAQRBrIgIkACACIAA2AgwgAUHKwcMAQRIgAkEMakHwABDICiACQRBqJAALLwEBfyMAQRBrIgIkACACIAA2AgwgAUHBncQAQQYgAkEMakHyABDICiACQRBqJAALLwEBfyMAQRBrIgIkACACIAA2AgwgAUG4jsMAQQkgAkEMakH2ABDICiACQRBqJAALLwEBfyMAQRBrIgIkACACIAA2AgwgAUHQncQAQQogAkEMakH9ABDICiACQRBqJAALLwEBfyMAQRBrIgIkACACIAA2AgwgAUH9kMMAQQ0gAkEMakGEARDICiACQRBqJAALLQEBfyAAIAEoAgBBAUYEfyAAQQRqQQAgASgCBCABKAIIEO0SQQEFIAILNgIACy8BAX8jAEEQayICJAAgAiAANgIMIAFBjYvEAEEHIAJBDGpBjwEQyAogAkEQaiQACy4BAX8jAEEQayICJAAgAiAANgIMIAFBpIvEAEEGIAJBDGpBEhDICiACQRBqJAALNAEBfyAAIAEoAggiAiABKAIASQR/IAEgAkEEEN4PIAEoAggFIAILNgIEIAAgASgCBDYCAAsxAQF/IwBBEGsiAyQAIAIgACABEOwIIANB/wE6AA8gAiADQQ9qQQEQ7AggA0EQaiQACysAIAEgA0sEQCABIAMgBBCuEAALIAAgAyABazYCBCAAIAIgAUEEdGo2AgALLwEBfyMAQRBrIgIkACACIAA2AgwgAUHQncQAQQogAkEMakGuARDICiACQRBqJAALMQEBfyABKAIAIgIgASgCBEYEQCAAQSs2AgAPCyABIAJBHGo2AgAgACABKAIIIAIQMAsrACABIANLBEAgASADIAQQrhAACyAAIAMgAWs2AgQgACACIAFBAXRqNgIACy8BAX8jAEEQayICJAAgAiABKQIANwIIIAAgAkEIaiIAEOQaIAAQ5R4gAkEQaiQACzABAX8jAEEQayIDJAAgAyABNgIMIAIgA0EMakEEEOwIIAIgACABEOwIIANBEGokAAsuAQF/IwBBEGsiAiQAIAIgADYCDCABQdj4wwBBCyACQQxqQTsQyAogAkEQaiQACyoBAX8gAkH///8/cSICIAEoAnxJBH8gAkF/IAAoAvwEdEF/c3FFBSADCwsuAQF/IwBBEGsiAiQAIAIgADYCDCABQbz4wwBBCiACQQxqQTYQyAogAkEQaiQACzABAX8gACgCCCEBIAAoAgQhAANAIAEEQCABQQFrIQEgABCIGCAAQdgAaiEADAELCwswAQF/AkAgACgCACABKAIARw0AIAAoAgQgASgCBEcNACAAKAIIIAEoAghGIQILIAILIgEBf0EBIABBwQBrQQZJIABBMGtBCkkgAEHhAGtBBklyGws7AQF/QYDAAyEBAkAgAEH/rwNGDQAgAEEBaiIBQYCwA3NBgIDEAGtB/4+8f0sNAEHswMcAENopAAsgAQsrACABIANLBEAgASADIAQQrhAACyAAIAMgAWs2AgQgACACIAFBGGxqNgIACysAIAEgA0sEQCABIAMgBBCuEAALIAAgAyABazYCBCAAIAIgAUEDdGo2AgALLgEBfyMAQRBrIgIkACACIAA2AgwgAUGAt9YAQRAgAkEMakE2EMgKIAJBEGokAAs2AQF+QfiW5AAtAAAaIAApAgAhAUEUEGAiAEUEQAALIABCADcCDCAAIAE3AgQgAEEBNgIAIAALPAACQAJAAkACQCAALQAADgcDAwMBAgADAAsgAEEEahCYBA8LIAAoAgQgACgCCBDWKQ8LIABBBGoQ3iYLCykBAn8jAEEQayIDJAAgA0EIaiIEIAAgASACEPIDIAQQ4BggA0EQaiQACywBAn8jAEEQayIBJAAgAUEIaiICIABBgbbgAEEEEO8kIAIQ4BggAUEQaiQACy0BAX8jAEEQayICJAAgAkEIaiAAEJYMIAEgAigCCCACKAIMEKoDIAJBEGokAAtKAQJ/IwBBEGsiAiQAIAJBADYCDCMAQRBrIgMkACADIAE3AwggAyAANwMAIAJBDGogA0EQEI0LIANBEGokACACNQIMIAJBEGokAAsvAQF/IwBBEGsiAiQAIAIgADYCDCABQYjC2ABBCSACQQxqQZQCEMgKIAJBEGokAAsuAQF/IwBBEGsiAiQAIAIgADYCDCABQezT2ABBByACQQxqQTsQyAogAkEQaiQACzcCAX8BfiAAKAIAIgFFBEBBAA8LEOUiIQAgASkCBCECIAEQ8RkhASAAIAI3AgQgACABNgIAIAALNwAgAEEgahCfAwJAAkACQCAAKAIADgIBAgALIABBBGoQnwMPCyAAKQMIEPEaDwsgACkDCBDxGgsvAQF/IAAoAgghASAAKAIEIQADQCABBEAgAUEBayEBIAAQyhMgAEEoaiEADAELCws3AQF/AkAgAC0ALEECRgRAIAAoAhgiARCVHCABQTBBCBDREQwBCyAAKQMYEPEaCyAAKQMAEPEaCy8BAX8gACgCCCEBIAAoAgQhAANAIAEEQCABQQFrIQEgABD6JCAAQShqIQAMAQsLCy8BAX8gACgCCCEBIAAoAgQhAANAIAEEQCABQQFrIQEgABDPISAAQTBqIQAMAQsLCy8BAX8gACgCCCEBIAAoAgQhAANAIAEEQCABQQFrIQEgABDSKCAAQUBrIQAMAQsLCy0AA0AgAQRAIABBEGopAwAQ6yYgACkDABDxGiABQQFrIQEgAEEgaiEADAELCwsvAQF/IAAoAgghASAAKAIEIQADQCABBEAgAUEBayEBIAAQ4wUgAEEwaiEADAELCws3ACAAQSBqENQoAkACQAJAIAAoAgAOAgECAAsgAEEEahDUKA8LIAApAwgQ8RoPCyAAKQMIEPEaCzQBA34gASkDACECIAEpAwghAxDVGCAAQQA2AhAgACADNwMIIABBADoAFCAAIAI3AwAQ8RoLLgEBfyMAQUBqIgIkACACIAE2AgggAiAANgIEIAJBMTYCACACENgoIAJBQGskAAswAQF/IwBBEGsiASQAIAFBCGogABCWDEHQ9NgAIAEoAgggASgCDBCGBCABQRBqJAALMAAgAAJ/IAEtAABFBEAgACABLQABOgABQQAMAQsgACABKQMIEPQaNwMIQQELOgAACzgBAX8gACABIAEoAgBBAnQiAkHU5OMAaigCAGooAgA2AgQgACABIAJBwOTjAGooAgBqKAIANgIACzABAX8jAEEQayIBJAAgAUEIaiAAEJYMQej02AAgASgCCCABKAIMEIYEIAFBEGokAAssAQF/IwBBEGsiAiQAIAIgATYCDCACIAA2AgggAkEIakEBEMwTIAJBEGokAAsrAQF/IwBBEGsiAiQAIAJBCGpB3wAgACABENgNIAIoAgggAkEQaiQAQQFGCywBAX8jAEEQayICJAAgAiABNgIMIAIgADYCCCACQQhqQQIQzBMgAkEQaiQACzEAIAAgASkDCDcDACAAQRBqIAFBGGopAwA3AwAgAEEIaiABQRBqKQMANwMA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ACACQQFqNgIIIAAoAgQgAmogAToAAAsyAQF/IAAgAcBBAnQiAUHk3uMAaigCACICNgIAIAAgAiABQaze4wBqKAIAQQF0ajYCBAsqAANAIAEEQCAAKAIAIABBBGooAgAQriQgAUEBayEBIABBDGohAAwBCwsLMAEBfyAAKAIIIgIgACgCAEYEQCAAEPEXCyAAIAJBAWo2AgggACgCBCACaiABOgAACygBAn8jAEFAaiIBJAAQ5yIgASAAKAIAEFMgAUHAABD8BiABQUBrJAALMQAgACgCACIAKQMIEPEaIABBIGoQzB0gAEE4ahDtJiAAQSRqEO8mIABByABBCBDREQsqAQJ/IwBBMGsiAiQAIAJBCGoiAyABQSgQ/AYaIAAgAxCADCACQTBqJAALKgEBfyMAQUBqIgEkACABQQhqIAAQnBwgAUEaNgIAIAEQ2CggAUFAayQACyoBAX8jAEEQayICJAAgAiABNgIMIAIgADYCCCACQQhqENYaIAJBEGokAAsoAQF/IwBBEGsiAiQAIAJBCGogACABEIQTIAIoAgggAkEQaiQAQQFGCycAIAEgAkYEf0EABSABLAAAIgJBAE4LIQEgACACOgABIAAgAToAAAsuACAALQAUQQJGBEAgACgCACIAQRhqEPccIAAQwxkgAEEwQQgQ0REPCyAAEMMZCyoBAX8jAEEQayICJAAgAiABNgIMIAIgADYCCCACQQhqENoKIAJBEGokAAsnACAAQX8gAUEBa2d2QQAgAUECTxsiAUEBajYCBCAAIAFBf0c2AgALLgAgAC0AFEECRgRAIAAoAgAiAEEYahD6HCAAEMMZIABBMEEIENERDwsgABDDGQsvAAJAIAEoAgBBA0cNACAAIAFBBGoQlSEgASgCBCIBKAIAQRlHDQAgACABEMwBCwswACAALQAUQQJGBEAgACgCACIAQRhqEPwcIAApAwAQ8RogABCUKw8LIAApAwAQ8RoLOAEBfyAALQCcASECIABBAToAnAEgACABKAIAEK8JIABBADoAnAEgAUEEaiAAEPgsIAAgAjoAnAELMQAgABD6JiAAQQxqEOwmIABBGGoQ+CQgACgCPBC5HiAAQUBrENcnIABByABBBBDREQsoACABQThsIQEDQCABBEAgACACEKoRIAFBOGshASAAQThqIQAMAQsLCzUBA38gAS8BFCEC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ACAAKAIAIgAoAgBBA0cEQCAAEIkgDwsgAEEQahDfLSAAQQRqEMkZCywAA0AgAC0AFEECR0UEQCAAKAIAQRhqIQAMAQsLIAEgACkDACAAKAIQEIcbCycBAn8jAEFAaiIAJAAgAEEANgIIIABCDDcDACAAENgoIABBQGskAAs1AQF/IABBBGohAQJAAkACQCAAKAIAQQFrDgIBAgALIAEQ/C0PCyABKAIAEN0UDwsgARDyLQssACAAEPomIABBDGoQ7CYgAEEYahD4JCAAKAI8ENkoIABBQGsQjyggABCLKws6AQF/QRwQ4yAiAEEANgIIIABCgYCAgBA3AgAgAEHAn+MAKQMANwIMIABBFGpByJ/jACkDADcCACAACygAIAAgARCuLSAAKAIMIgAEQCABIABBDGooAgAgAEEQaigCABCYIAsLMgEBfyABKAIkIQIgAEEMaiABQQxqEIAdIABBADYCCCAAQoCAgICAATcCACAAIAI2AiQLMAAgASgCFCAALQAAQQJ0IgBB9KXjAGooAgAgAEHopeMAaigCACABKAIYKAIMEQMACzAAIAEoAhQgAC0AAEECdCIAQZim4wBqKAIAIABBjKbjAGooAgAgASgCGCgCDBEDAAswACABKAIUIAAtAABBAnQiAEGwpuMAaigCACAAQaSm4wBqKAIAIAEoAhgoAgwRAwALJQAgACABIAIoAghBAWtBeHFqQQhqIAMgBCAFIAYgAigCEBEIAAsnACACIANNBEAgAyACQfSrwAAQrRAACyAAIAEgA0EMbGopAgQ3AwALKgEBfyAAIAIQ6B8gACgCCCIDIAAoAgRqIAEgAhD8BhogACACIANqNgIICyoBAX8gACACENseIAAoAggiAyAAKAIEaiABIAIQ/AYaIAAgAiADajYCCAsjAQF/IwBBEGsiASQAIAFBCGogABCPCSABKAIMIAFBEGokAAuXAgEEfyAAIAAoAgAiAUEBazYCACABQQJxIAFBBElyRQRAAkAgACICKAIAIQADQCAAQQJxIAAiAUEESXINASACIABBAnIgAigCACIAIAAgAUYbNgIAIAAgAUcNAAsDQAJAIAFBfHEiBCEAA0AgACgCACIDBEACQCAEIAM2AgAgAUEBcUUEQCADKAIEIgAEQCAEIAA2AgAgAiACKAIAQX1xNgIADAULA0AgAiABQQFxIAIoAgAiACAAIAFGIgEbNgIAIAENBSAAIQEgAEEESQ0ACwwBCyACIAFBfXEgAigCACIAIAAgAUYiARs2AgAgAUUNAAwFCwUgACgCCCIDIAA2AgQgAyEADAELCyAAIQEMAQsLELIbAAsLCyoAAkAgACgCAEGJgMQARwRAIABB9ABqENomDAELIABBBGohAAsgABCTEQsqAQF/IAAgAhDzHiAAKAIIIgMgACgCBGogASACEPwGGiAAIAIgA2o2AggLLAACQCABQQJHBEAgACgCAEGAgICAeEYNASAAQQA2AhQLDwtBiI3EABDaKQALLAACQCABQQNHBEAgACgCAEGAgICAeEYNASAAIAIQqCMLDwtBmI3EABDaKQALKQEBfyABIAAoAggiAk8EQCABIAJB7K7DABCtEAALIAAoAgQgAUEMbGoLMAAgASgCFCAALQAAQQJ0IgBBwNjjAGooAgAgAEGo2OMAaigCACABKAIYKAIMEQMACysBAX8gASAAKALIAiICTwRAIAEgAkGwkMQAEK0QAAsgACgCxAIgAUEUbGoLKQAgACABaiwAAEEATgR/IAApAwBCgIGChIiQoMCAf4N6p0EDdgUgAQsLJQAgACABIAIoAghBAWtBeHFqQQhqIAMgBCAFIAYgAigCIBEIAAssAQF/QQEhAgJAIAFBgICAgHhGDQAgABD+EyABRg0AIAAQxhUgAUYhAgsgAgsnACABLQAQQQFxBEAgAxDaAwsgAgRAIAMQsggLIABBgICAgHg2AgALJgAgAkUEQEEBQQAgAxCuEAALIAAgAkEBazYCBCAAIAFBCGo2AgALIwAgACACQQdxIANBA3RyNgIEIAAgAkH4AXFBA3YgAXI2AgALMAAgASgCFCAALQAAQQJ0IgBBuL3YAGooAgAgAEGQvNgAaigCACABKAIYKAIMEQMACzAAIAEoAhQgAC0AAEECdCIAQdzg4wBqKAIAIABBuODjAGooAgAgASgCGCgCDBEDAAsgAQF/IAEgA08EfyACIAMgACABIANraiADEOMfBSAECwswAQJ+IAEpAwghAiABKQMAEPQaIQMgACABKQMQELIjNwMQIAAgAzcDACAAIAI3AwgLMAECfiABKQMQIQIgASkDABD0GiEDIAAgASkDCBD0GjcDCCAAIAM3AwAgACACNwMQCy8CAX4BfyABKQIAIQIgASgCCCEDIAAgAUEMahDwHDYCDCAAIAM2AgggACACNwIACy8CAX4BfyABKQIIIQIgARDwHCEDIAAgAUEEahDxGTYCBCAAIAM2AgAgACACNwIICy8CAX4BfyABKQIIIQIgARDwHCEDIAAgAUEEahD2EDYCBCAAIAM2AgAgACACNwIICyoAIAApAwggACkDGBCIKyAALQA0QQNHBEAgAEEgahDPGwsgACgCOBDVKAsqACAAKQMIIAApAxgQiCsgAC0ANEEDRwRAIABBIGoQzxsLIAAoAjgQ8yILLwACQAJAAkAgACgCAA4CAQIACyAAQQRqENooDwsgACkDCBDxGg8LIAApAwgQ8RoLKwEBfwJAAkACQCAAQQprDgQBAgIBAAsgAEGowABrQQJPDQELQQEhAQsgAQssAQF/IABBBGohASAAKAIAIgBBgICAgHhHBEAgACABKAIAENYpDwsgARD/IgssACAAKQMIEPEaIAAoAiAQuR4gAEE4ahDtJiAAQSRqEO8mIABByABBCBDREQsoAEEGIQEgACACIANBk7bgAEEFEOMfBH8gAEELOgABQQAFIAELOgAACygAQQYhASAAIAIgA0G2r+AAQQMQ4x8EfyAAQRI6AAFBAgUgAQs6AAALKABBBiEBIAAgAiADQeyK4ABBBBDjHwR/IABBJDoAAUEABSABCzoAAAsoAEEGIQEgACACIANB+bngAEEFEOMfBH8gAEEdOgABQQIFIAELOgAACyUAIABBCGoQ7yggAC0ANEEDRwRAIABBIGoQ+hwLIABBOGoQoyULJQAgAEEIahDvKCAALQA0QQNHBEAgAEEgahD3HAsgAEE4ahCjJQsoAAJAIAAtAChFBEAgAEEMaiABEIApDAELIABBLGohAAsgACABEJMfCyoBAX8DQCAAQRhqIQIgAC0ALEECR0UEQCACKAIAIQAMAQsLIAEgAhCBCQspACABIAAQ8SEgAEEgaiABEN4jIABB6ABqIAEQ4CwgAEHIAGogARDdIwspACABIAAQ8CEgAEEgaiABENwjIABB6ABqIAEQ3SwgAEHIAGogARDbIwsqACAAKQMIIAApAxgQiCsgAC0ANEEDRwRAIABBIGoQ/BwLIAAoAjgQ1SgLLQECfxD6IiEBEPoiIQIgAEEQakEAOgAAIABCADcCCCAAIAI2AgQgACABNgIACykAIAAtABRB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AgAiAUGAgICAeEcEQCAAKAIEIgIgACgCCBDfHCABIAIQ6CkLCyMBAX8gACgCCCICIAFPBEAgACABNgIIDwsgACABIAJrEOgOCyQBAX8gASAAKAIAIAAoAggiAmtLBEAgACACIAFBBEEcEMAXCwspACAAQQxqIAEQgxggAEE8aiABEIMYIABBADYCCCAAQoCAgIDAADcCAAspACAAQgA3AhQgAEKAgICAwAA3AgwgAEIENwIEIAAgAUECRkEfdDYCAAsiACACQQNPBEAgAkECIAMQrxAACyAAIAI2AgQgACABNgIACyUBAX8gACgCACIBIAEoAgAiAUEBazYCACABQQFGBEAgABC/FAsLIwAgACgCACAAKAIEIgAoAghBAWtBeHFqQQhqIAAoAkARBQALJAEBfyABIAAoAgAgACgCCCICa0sEQCAAIAIgAUEEQQwQpBcLCyMBAX8gACgCCCICIAFPBEAgACABNgIIDwsgACABIAJrEO4MCyUBAX8gACgCACIBIAEoAgAiAUEBazYCACABQQFGBEAgABD1FwsLJwEBfyAAQQQQ8x4gACgCCCIBIAAoAgRqQQA2AAAgACABQQRqNgIICyQBAX8gASAAKAIAIAAoAggiAmtLBEAgACACIAFBAUEBEMAXCwskAQF/IwBBEGsiAiQAIAJCADcCACAAIAEgAhDnCCACQRBqJAALHQAgASACSwRAIAAgAkECdGoPCyACIAEgAxCtEAALIAAgASACSwRAIAAgAkECdGoPCyACIAFB0L7DABCtEAALJwEBf0EMQQQQoSAiAUEIaiAAQQhqKAIANgIAIAEgACkCADcCACABCyAAIAEEQCAALQAAQQJxQQF2DwtBAEEAQdjbwwAQrRAACygAIAFBuNrDAEEJEO0dIABBCGogAUEIaigCADYCACAAIAEpAgA3AgALJwAgAEEEaigCACAAQQhqKAIAQYjdwwAQpiMiACAALQAAQQFyOgAACysAIAFBkAFqKAIAIAFBlAFqKAIAIAJB////P3EgACgC/AR2QdzvwwAQsh8LIAAgASACSwRAIAAgAkECdGoPCyACIAFB3JLEABCtEAALJwACQCABQQFxRQRAIAIoAgBBhoDEAEkNAQsgAxCwIAsgAEEiNgIACyQBAX8gASAAKAIAIAAoAggiAmtLBEAgACACIAFBBEEIEMAXCwskAQF/IAEgACgCACAAKAIIIgJrSwRAIAAgAiABQQFBAhDAFwsLJAEBfyABIAAoAgAgACgCCCICa0sEQCAAIAIgAUEEQQwQwBcLCx8AA0AgAQRAIAFBAWshASAAEPEeIABBCGohAAwBCwsLKwECfyAAKAIAIgFBgICAgHhHBEAgACgCBCICIAAoAggQ7hwgASACEN0pCwsrAQJ/IAAoAgAiAUGAgICAeEcEQCAAKAIEIgIgACgCCBCBHyABIAIQ4CkLCx0AIAAgAUF0bGoiAEEMaygCACAAQQhrKAIAELYKCyUBAX8gACgCACIBIAEoAgAiAUEBazYCACABQQFGBEAgABDVCwsLJQEBfyAAKAIAIgEgASgCACIBQQFrNgIAIAFBAUYEQCAAEOoPCwsmAQF+IAEpAyAhAiAAIAEQzCEgAEEQaiABQRBqEMwhIAAgAjcDIAsmAQF+IAEpAyghAiAAQTBqIAFBMGoQygsgACABEN8EIAAgAjcDKAseAQF/IAAoAgBBGkYEfyAAQQhqIAEgAhDKGwUgAwsLJAEBfyABIAAoAgAgACgCCCICa0sEQCAAIAIgAUEEQQQQwBcLCx8AA0AgAQRAIAFBAWshASAAEOcmIABBDGohAAwBCwsLHwADQCABBEAgAUEBayEBIAAQtgYgAEEEaiEADAELCwslACABKQMAUEUEQCAAIAEQnBwPCyAAQQI6ABQgACABKAIINgIACx8AA0AgAQRAIAFBAWshASAAEIknIABBDGohAAwBCwsLJAEBfyABIAAoAgAgACgCCCICa0sEQCAAIAIgAUEIQTgQwBcLCyQBAX8gASAAKAIAIAAoAggiAmtLBEAgACACIAFBCEEwEMAXCwslACABIAJLBEAgASACQZDL3wAQsBAACyAAIAI2AgQgACABNgIACysAQYS74ABB+rrgACAAKAIALQAAIgAbQQtBCiAAGyABKAIUIAEoAhgQ9QILJAEBfyABIAAoAgAgACgCCCICa0sEQCAAIAIgAUEIQRAQwBcLCyEAIABBIGogARDUKyAAKAIAQQJGBEAgAEEEaiABENQrCwskAANAIAAtABRBAkdFBEAgACgCAEEYaiEADAELCyAAIAEQjw8LIwAgABC4EiIAp0G5893xeWxBBXcgAEIgiKdzQbnz3fF5bK0LIQAgAEEgaiABEMAsIAAoAgBBAk8EQCAAQQRqIAEQwCwLCyEAIABBIGogARDDLCAAKAIAQQJGBEAgAEEEaiABEMMsCwshACAAQSBqIAEQzCwgACgCAEECRgRAIABBBGogARDMLAsLIQAgAEEgaiABEMssIAAoAgBBAkYEQCAAQQRqIAEQyywLCyEAIAFBIGogABDNLCABKAIAQQJGBEAgAUEEaiAAEM0sCwsiAQF+IAApAwAiAVAEQCAAQQhqEPwcDwsgASAAKQMQEIgrCyEAIABBIGogARD7LCAAKAIAQQJPBEAgAEEEaiABEPssCwshACAAQSBqIAEQ/iwgACgCAEECTwRAIABBBGogARD+LAsLIQAgAEEgaiABEP0sIAAoAgBBAk8EQCAAQQRqIAEQ/SwLCyEAIABBIGogARD8LCAAKAIAQQJPBEAgAEEEaiABEPwsCwshACAAQSBqIAEQmy0gACgCAEECTwRAIABBBGogARCbLQsLKAACQCAAQQNHDQAgAi0ABSABmUQAAAAAAADwf2JyDQAgAkEAOgAECwslACAAQQE2AgQgACABKAIEIAEoAgBrQQxuIgE2AgggACABNgIACyUAIABBATYCBCAAIAEoAgwgASgCBGtBGG4iATYCCCAAIAE2AgALJQEBfyAAKAIAIgEgASgCACIBQQFrNgIAIAFBAUYEQCAAEIwYCwsfAANAIAEEQCABQQFrIQEgABDpCSAAQShqIQAMAQsLCx0AIAAgAUFobGoiAEEYaykDACAAQRBrKAIAEKscCyYAIAEoAhggABC2FSABLQAUQQJHBEAgACABKQMAIAEoAhAQjBILCyEAIABBIGogARCyLSAAKAIAQQJPBEAgAEEEaiABELItCwsmACABKAIYIAAQugggAS0AFEECRwRAIAAgASkDACABKAIQEIwSCwshACABQSBqIAAQtS0gASgCAEECRgRAIAFBBGogABC1LQsLIQAgAEEgaiABELQtIAAoAgBBAk8EQCAAQQRqIAEQtC0LCyEAIABBIGogARCuLSAAKAIAQQJPBEAgAEEEaiABEK4tCwslACAAQQRqKAIAIABBCGooAgAgAiABKAIAdkH4kMAAEK8fKAIACxwAIAEgAk0EQCACIAEgAxCtEAALIAAgAkECdGoLHAAgASACTQRAIAIgASADEK0QAAsgACACQRRsagscACABIAJNBEAgAiABIAMQrRAA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gBEgAEEoQQgQ0RELFQAgACgCACIAEIsFIABBDEEEENERCxUAIAAoAgAiABDzBCAAQQxBBBDREQsVACAAKAIAIgAQjAUgAEEMQQQQ0RELEwAgACABEOMsIABBBGogARDNLAsXACAAKQMAIAAtABQQtSMgACgCGBC9GAsSACAALQAIQQVGBEAgABCKKQsLFQAgACgCACIAEI0FIABBDEEEENERCxUAIAAoAgAiABCgEiAAQShBCBDREQsVACAAKAIAIgAQ0AUgAEEwQQgQ0RELEQAgACgCAARAIAAgARD4LAsLEgAgACgCAEETRwRAIAAQ0QULCxEAIAAoAgAiAARAIAAQjBsLCxEAIAAoAhgiAARAIAAQgwYLCxYAIAAoAgBBgICAgHhHBEAgABCOGwsLEgAgACgCAEEHRwRAIAAQ6RMLCxMAIAAgARD+LCAAQQRqIAEQ0wMLEwAgACABEP4sIABBBGogARCLLQsTACAAIAEQgC0gAEEEaiABEP4sCxMAIABBMGogARCpGiAAIAEQqhELEQAgACgCAARAIAAgARD+LAsLEwAgACABELAaIAEgAEEMahDpJQsRACABKAIABEAgASAAEIstCwsSACAAKAIAQQdHBEAgABCiEgsLFQAgACgCACIAEKISIABBKEEIENERCxYAIAAoAgBBgICAgHhHBEAgABCkCQsLEgAgACgCAEEHRwRAIAAQhhELCxIAIAAoAgBBB0cEQCAAEOoTCwsVACAAKAIAIgAQ0QUgAEEwQQgQ0RELFwAgACkDACAALQAUELUjIAAoAhgQvxgLFQAgACgCACIAEIIRIABBKEEIENERCxUAIAAoAgAiABCOBSAAQQxBBBDREQsRACABKAIABEAgASAAEIotCwsRACABKAIABEAgASAAENMDCwsTACAAIAEQgC0gAEEUaiABEPAjCxEAIAAoAgAiAARAIAAQjxsLCxIAIABBIGoQ3icgAEEkahDeJwsVACAAKAIAIgAQ9AQgAEEMQQQQ0RELFQAgACgCACIAEI8FIABBDEEEENERCxcAIAApAwAgAC0AFBC1IyAAKAIYEP4cCxUAIAAoAgAiABDXBSAAQTBBCBDREQsVACAAKAIAIgAQ9QQgAEEMQQQQ0RELFQAgACgCACIAEIMRIABBKEEIENERCxMAIAAgARCFLSAAQQRqIAEQ/SwLEwAgACABEIItIABBBGogARD8LAsTACAAIAEQhi0gAEEEaiABEPssCxEAIAAoAgAiAARAIAAQgwYLCxIAIAAoAgBBDUcEQCAAEMcICwsVACAAKAIAIgAQ9gQgAEEMQQQQ0RELFQAgACgCACIAEIQRIABBKEEIENERCxUAIAAoAgAiABCQBSAAQQxBBBDREQsXACAAKQMAIAAtABQQtSMgACgCGBDCGAsVACAAKAIAIgAQ0gUgAEEwQQgQ0RELFQAgACgCACIAEIURIABBKEEIENERCxUAIAAoAgAiABD3BCAAQQxBBBDREQsTACAAQTBqIAEQshogASAAEK8JCxUAIAAoAgAiABCRBSAAQQxBBBDREQsTACAAQTBqIAEQsxogACABELEUCxMAIABBMGogARC0GiAAIAEQrxQLEwAgAEEwaiABELUaIAAgARCuFAsRACAAKAIAIgAEQCAAEL8JCwsVACAAKAIAIgAQhhEgAEEoQQgQ0RELFQAgACgCACIAEOQDIABBMEEIENERCxEAIAAoAgAEQCAAIAEQ/CwLCxEAIAAoAgAEQCAAIAEQ+ywLCxEAIAAoAgAEQCAAIAEQ/SwLCxEAIAAoAgAiAARAIAAQsioLCxYAIAAoAgBBgICAgHhHBEAgABCzKgsLEQAgACgCACIABEAgABCNGQsLEQAgACgCACIABEAgABC4CAsLEQAgACgCAARAIAAgARCbLQsLEQAgACgCAARAIAAgARCcLQsLEQAgACgCACIABEAgABC0KgsLFQAgACgCACIAEJIFIABBDEEEENERCxIAIAAoAgBBB0cEQCAAEIcRCwsVACAAKAIAIgAQhxEgAEEoQQgQ0RELFQAgACgCACIAEOUDIABBMEEIENERCxMAIAAgARClLSAAQQRqIAEQnC0LEwAgAEEwaiABELoaIAAgARCHCQsSACAAKAIAQRNHBEAgABDhAwsLFgAgACgCACIAEOYCIABBwABBCBDREQsVACAAKAIAIgAQ4QMgAEEwQQgQ0RELFQAgACgCACIAEIgRIABBKEEIENERCxUAIAAoAgAiABCTBSAAQQxBBBDREQsVACAAKAIAIgAQ+QQgAEEMQQQQ0RELFQAgAEGBgICAeEcEQCAAIAEQriQLCxIAIAAoAgBBJUcEQCAAEMMKCwsTACAAKAIAQYABaiAAQQRqEMgICxIAIAAtAAhBBUYEQCAAELQpCwsVACAAKAIAIgAQvQUgAEEMQQQQ0RELFQAgACgCACIAEKwSIABBKEEIENERCxIAIAAoAgBBJUcEQCAAEOgJCwsSACAAKAIAQQdHBEAgABCsEgsLFgAgACgCAEGAgICAeEcEQCAAENggCwsSACAAKAIAQQhHBEAgABCrCgsLFgAgACABKAIAIAIgASgCBCgCIBEEAAsXACAAIAEgACABIAIQ1Q9B8MLgABDfHwsSACAAKAIAQSVHBEAgABDpCQsLFwAgACABIAAgASACEMMOQYDD4AAQ3x8LEwAgAEEwaiABEL0aIAAgARCrEAsRACAAKAIABEAgACABEK4tCwsRACABKAIABEAgASAAELMtCwsTACABIAAQvxogASAAQQxqEK4mCxEAIAEoAgAEQCABIAAQvQMLCxEAIABBA0YEQCABIAIQjC4LCxYAIABBpNbgADYCBCAAIAFBCGo2AgALFgAgAEHo1eAANgIEIAAgAUEIajYCAAsWACAAQeTT4AA2AgQgACABQRxqNgIACxYAIABBoNTgADYCBCAAIAFBHGo2AgALEgAgAEEEahDKIiAAQSRqEOQUCxEAIAAoAgAEQCAAIAEQtC0LCxEAIAAoAgAEQCAAIAEQtS0LCxMAIABBMGogARDHGiAAIAEQihELEwAgAEEwaiABEMYaIAAgARC4FAsTACAAIAEQvCIgAEEoaiABELYtCxEAIAAoAgAEQCAAIAEQsi0LCxMAIAAgARDDLSAAQQRqIAEQsi0LEwAgACABEMYtIABBBGogARC1LQsTACAAIAEQvi0gAEEEaiABELQtCxMAIAAgARC8IiAAQSBqIAEQnSQLFQAgACgCACIAEIsRIABBKEEIENERCxUAIAAoAgAiABD6BCAAQQxBBBDREQsVACAAKAIAIgAQlAUgAEEMQQQQ0RELFwAgACkDACAALQAUELUjIAAoAhgQzRgLEgAgACgCAEEHRwRAIAAQrxILCxUAIAAoAgAiABCvEiAAQShBCBDREQsVACAAKAIAIgAQ2AUgAEEwQQgQ0RELGQAgASgCFEHQ6+AAQQ0gASgCGCgCDBEDAAsPACAAQYQBTwRAIAAQDQsLDwAgAEE8akEAIAAoAjwbCw8AIABBHGpBACAAKAIcGwsPACAAQShqQQAgACgCKBsLEQAgACgCACACIAEQ2hlBAXMLFAEBf0ECQQEQziIiASAAOgAAIAELFAAgACgCACABIAAoAgQoAhARAgALxggBBX8jAEHwAGsiBSQAIAUgAzYCDCAFIAI2AggCQAJAAkACQAJAAkACfyAAAn8CQCABQYECTwRAQQMgACwAgAJBv39KDQIaIAAsAP8BQb9/TA0BQQIMAgsgBSABNgIUIAUgADYCEEEBDAILIAAsAP4BQb9/SgtB/QFqIgZqLAAAQb9/TA0BIAUgBjYCFCAFIAA2AhBBBSEHQdT6wAALIQYgBSAHNgIcIAUgBjYCGCABIAJJIgcgASADSXJFBEAgAiADSw0CIAJFIAEgAk1yRQRAIAMgAiAAIAJqLAAAQb9/ShshAwsgBSADNgIgIAMgASICSQRAIANBAWoiCCADQQNrIgJBACACIANNGyICSQ0EAkAgAiAIRg0AIAggAmshByAAIANqLAAAQb9/SgRAIAdBAWshBgwBCyACIANGDQAgACAIaiIDQQJrIgksAABBv39KBEAgB0ECayEGDAELIAkgACACaiIIRg0AIANBA2siCSwAAEG/f0oEQCAHQQNrIQYMAQsgCCAJRg0AIANBBGsiAywAAEG/f0oEQCAHQQRrIQYMAQsgAyAIRg0AIAdBBWshBgsgAiAGaiECCwJAIAJFDQAgASACSwRAIAAgAmosAABBv39KDQEMBwsgASACRw0GCyABIAJGDQQCfwJAAkAgACACaiIBLAAAIgBBAEgEQCABLQABQT9xIQYgAEEfcSEDIABBX0sNASADQQZ0IAZyIQAMAgsgBSAAQf8BcTYCJEEBDAILIAEtAAJBP3EgBkEGdHIhBiAAQXBJBEAgBiADQQx0ciEADAELIANBEnRBgIDwAHEgAS0AA0E/cSAGQQZ0cnIiAEGAgMQARg0GCyAFIAA2AiRBASAAQYABSQ0AGkECIABBgBBJDQAaQQNBBCAAQYCABEkbCyEAIAUgAjYCKCAFIAAgAmo2AiwgBUEFNgI0IAVB3PvAADYCMCAFQgU3AjwgBSAFQRhqrUKAgICAsAGENwNoIAUgBUEQaq1CgICAgLABhDcDYCAFIAVBKGqtQoCAgICwCYQ3A1ggBSAFQSRqrUKAgICAwAmENwNQIAUgBUEgaq1CgICAgJABhDcDSAwGCyAFIAIgAyAHGzYCKCAFQQM2AjQgBUGc/MAANgIwIAVCAzcCPCAFIAVBGGqtQoCAgICwAYQ3A1ggBSAFQRBqrUKAgICAsAGENwNQIAUgBUEoaq1CgICAgJABhDcDSAwFCyAAIAFBACAGIAQQ0CYACyAFQQQ2AjQgBUH8+sAANgIwIAVCBDcCPCAFIAVBGGqtQoCAgICwAYQ3A2AgBSAFQRBqrUKAgICAsAGENwNYIAUgBUEMaq1CgICAgJABhDcDUCAFIAVBCGqtQoCAgICQAYQ3A0gMAwsgAiAIQcj8wAAQsBAACyAEENopAAsgACABIAIgASAEENAmAAsgBSAFQcgAajYCOCAFQTBqIAQQuh0ACxQAIAAoAgAgASAAKAIEKAIMEQIACw8AIAAoAgAEQCAAEOkpCwsOACAABEAgACABEIwdCwsPACAAKAIABEAgABDjHgsLPAECfyAAKAIIIQEgACgCBCECA0AgAQRAIAFBAWshASACENILIAJBHGohAgwBCwsgACgCACAAKAIEEOcpCzwBAn8gACgCCCEBIAAoAgQhAgNAIAEEQCABQQFrIQEgAhDICSACQQhqIQIMAQsLIAAoAgAgACgCBBDgKQsPACAAKAIABEAgABDkHgsLFAAgACgCACABKAIUIAEoAhgQiQMLfwICfwF+QZiW5AAoAgBFBEAjAEEQayIBJABBqJbkAAJ+AkAgAEUNACAAKAIAIABCADcDAEEBcUUNACAAKQMIIQMgACkDEAwBCyABEKYVIAEpAwAhAyABKQMICzcDAEGgluQAIAM3AwBBmJbkAEIBNwMAIAFBEGokAAtBoJbkAAsUACAAEIMcIAAoAgAgACgCBBCBKgsXACAAIAEQmg82AgggAEKCgICAEDcCAAsUACAAELIDIAAQ3REgACgCGBDwKgsQACAAIAEgAkECEOMfQQFzCxQAIAAQ/A8gACgCACAAKAIEEIUqCxQAIAAQ4yIgACgCHCAAKAIgENkpCxoAIABBgICAgHg2AgAgAEGo1NgAKQMANwIECw8AIAAoAgAEQCAAEIUfCwsUACAAEL0JIAAoAgAgACgCBBDdKQsSACAAKQMAEPEaIABBGGoQ6CYLFAAgABD1GiAAKAIAIAAoAgQQ6CkLDwAgACgCAARAIAAQ9iQLCzwBAn8gACgCCCEBIAAoAgQhAgNAIAEEQCABQQFrIQEgAhCfAyACQQRqIQIMAQsLIAAoAgAgACgCBBDZKQsUACAAEJocIAAoAgAgACgCBBCOKgsPACAAKAIABEAgABD3JAsLDwAgACgCAARAIAAQnwMLC5ABAQJ/IAAoAgghAiAAKAIEIQEDQCACBEACQAJAAkACQAJAAkAgASgCAA4EAQIDBAALIAFBBGoQ6iYMBAsgAUEIaikDACABQRBqKQMAEIcrDAMLIAFBBGoQtiMMAgsgAUEEahCfAwwBCyABQQRqEMkTCyACQQFrIQIgAUEoaiEBDAELCyAAKAIAIAAoAgQQjCoLDgAgAFBFBEAgABDxGgsLPAECfyAAKAIIIQEgACgCBCECA0AgAQRAIAFBAWshASACEJ8DIAJBDGohAgwBCwsgACgCACAAKAIEEN0pCxQAIAAQtRkgACgCACAAKAIEEOgpCzwBAn8gACgCCCEBIAAoAgQhAgNAIAEEQCABQQFrIQEgAhC2GSACQShqIQIMAQsLIAAoAgAgACgCBBCMKgsUACAAEMEJIAAoAgAgACgCBBCNKgs8AQJ/IAAoAgghASAAKAIEIQIDQCABBEAgAUEBayEBIAIQgwUgAkEEaiECDAELCyAAKAIAIAAoAgQQ2SkLDwAgACgCAARAIAAQgwULCxQAIAAQuRkgACgCACAAKAIEEI0qCxIAIAApAwAQ8RogAEEYahD0JgsPACAAKAIABEAgABCBJQsLDwAgACgCAARAIAAQ8AQLCw8AIAAoAgAEQCAAENQoCwsPACAAKAIABEAgABCCJQsLDwAgACgCAARAIAAQyQQLCw8AIAAoAgAEQCAAEIUlCwsUACAAEJgcIAAoAgAgACgCBBCQKgsUACAAELcZIAAoAgAgACgCBBCNKgsPACAAKAIABEAgABC8BQsLFAAgABCXHCAAKAIAIAAoAgQQjioLDwAgACgCAARAIAAQ2igLCxQAIAAQuBkgACgCACAAKAIEEO0pCxQAIAAQlhIgACgCACAAKAIEEI4qCw8AIAAoAgAEQCAAEP4iCwsUACAAEMkXIAAoAgAgACgCBBDoKQsUACAAEJQcIAAoAgAgACgCBBCMKgsUACAAEOULIAAoAgAgACgCBBCPKgsUACAAELsHIAAoAgAgACgCBBCPKgsSACAAKQMAEPEaIABBGGoQ+SYLFAAgABCWHCAAKAIAIAAoAgQQjCoLFAAgABC9ECAAKAIAIAAoAgQQjSoLFAAgABCiBiAAKAIAIAAoAgQQjSoLFAAgABD9DyAAKAIAIAAoAgQQkCoLDwAgACgCAARAIAAQ0gYLCxAAIAAgASAAayACIAMQ+B8LDwAgACgCAARAIAAQ9BULCxIAIAApAwAQ8RogAEEYahCPJwsPACAAKAIABEAgABCRJQsLDwAgACgCAARAIAAQ3AILCw8AIAAoAgAEQCAAEIkFCwsSACAAKQMAEPEaIABBGGoQkycLDwAgACgCAARAIAAQlyULCw8AIAAoAgAEQCAAEOUoCwsSACAAKQMIEPEaIABBIGoQ5SgLDwAgACgCAARAIAAQigULCw8AIAAoAgAEQCAAEJ4lCwsPACAAKAIABEAgABDlAgsLDwAgACgCAARAIAAQnQULCxIAIAFBwAFqENQbIABBJTYCAAsSACABQcABahCvFSAAQQQ2AgALEgAgAUHAAWoQ1BsgAEEJNgIACxIAIAFBwAFqENQbIABBCjYCAAsSACABQcABahDUGyAAQRA2AgALEgAgAUHAAWoQ1BsgAEEPNgIACxIAIAFBwAFqENQbIABBBTYCAAsSACABQcABahDUGyAAQQs2AgALEgAgAUHAAWoQ1BsgAEEMNgIACxIAIAFBwAFqENQbIABBETYCAAsSACABQcABahDUGyAAQQ02AgALEgAgAUHAAWoQ1BsgAEEONgIACxIAIAFBwAFqENQbIABBGjYCAAsPACAAKAIABEAgABDOAgsLDwAgACgCAARAIAAQnyULCw8AIAAoAgAEQCAAEJ4FCwsPACAAKAIABEAgABCyBQsLDwAgACgCAARAIAAQoCULCw8AIAAoAgAEQCAAEKMCCwsPACAAKAIABEAgABD1FQsLDwAgACgCAARAIAAQpCULCw8AIAAoAgAEQCAAEL4CCwsPACAAKAIABEAgABCBBQsLDwAgACgCAARAIAAQtgYLCxIAIAAoAhAQ4iEgAEEIahCZJQsPACAAKAIABEAgABClJQsLDwAgACgCAARAIAAQugMLCw8AIAAoAgAEQCAAEIIFCwsPACAAKAIABEAgABClAgsLDwAgACgCAARAIAAQpiULCw8AIAAoAgAEQCAAEPEECwsPACAAKAIABEAgABCTFwsLDwAgACgCAARAIAAQsCULCw8AIAAoAgAEQCAAEK8lCwsPACAAKAIABEAgABDyBAsLDwAgACgCAARAIAAQ3y0LCxQAIAEgACkDABD0GiAAKAIQEPMYCxMAIAAgARDTIyAAKAIYIAEQzgULEwAgACABEJYhIAAoAhggARCdEgsTACAAIAEQliEgACgCGCABELUICxMAIAEgABDxISAAKAIgIAEQnRILEwAgASAAEPAhIAAoAiAgARCcEgsSACAAKQMAEPEaIABBGGoQxScLDwAgACgCAARAIAAQyiULCw8AIAAoAgAEQCAAEN0CCwsPACAAKAIABEAgABCLBQsLDwAgACgCAARAIAAQyyULCw8AIAAoAgAEQCAAEJACCwsPACAAKAIABEAgABDzBAsLDwAgACgCAARAIAAQzCULCw8AIAAoAgAEQCAAEIUpCwsSACAAKQMAEPEaIABBGGoQyycLDwAgACgCAARAIAAQjAULCxEAIABBDGoQjBUgAEEANgIICxIAIAApAwAQ8RogAEEYahDRJwsPACAAKAIABEAgABDQJQsLDwAgACgCAARAIAAQiikLCw8AIAAoAgAEQCAAEI0FCwsOACAAUEUEQCABEOsmCwsPACAAKAIABEAgABCQCgsLDwAgACgCAARAIAAQ3gILCw8AIAAoAgAEQCAAEO8lCwsSACAAKQMAEPEaIABBGGoQ2ScLDwAgACgCAARAIAAQ6CULCw8AIAAoAgAEQCAAEI4FCwsPACAAKAIABEAgABDfFwsLDwAgACgCAARAIAAQtAILCw8AIAAoAgAEQCAAEPQtCwsPACAAKAIABEAgABCDBgsLDwAgACgCAARAIAAQ8y0LCw8AIAAoAgAEQCAAEO4lCwsPACAAKAIABEAgABCRAgsLDwAgACgCAARAIAAQ9AQLCxIAIABBGGoQkx4gACkDABDxGgsSACAAKQMAEPEaIABBGGoQ1ycLDwAgACgCAARAIAAQkikLCw8AIAAoAgAEQCAAEI8FCwsSACAAKQMAEPEaIABBGGoQ6CcLDwAgACgCAARAIAAQ8iULCw8AIAAoAgAEQCAAEPUECwsRACAAQQA6ABQgAEEYahCoKgsPACAAKAIABEAgABC2AgsLDwAgACgCAARAIAAQ+SULCw8AIAAoAgAEQCAAEPYECwsSACAAKQMAEPEaIABBGGoQ7CcLDwAgACgCAARAIAAQ3wILCw8AIAAoAgAEQCAAEPslCwsPACAAKAIABEAgABCQBQsLEgAgACkDABDxGiAAQRhqEPAnCw4AIAAEQCAAIAEQggoLCw8AIAAoAgAEQCAAEP8lCwsPACAAKAIABEAgABCiKQsLDwAgACgCAARAIAAQ9wQLCw8AIAAoAgAEQCAAEIEmCwsPACAAKAIABEAgABCRBQsLDwAgACgCAARAIAAQ8S0LCw8AIAAoAgAEQCAAEKgpCwsSACAAKQMAEPEaIABBGGoQ9ycLDwAgACgCAARAIAAQ7y0LCxEAIABCADcDCCAAQRhqEJEmCw8AIAAoAgAEQCAAEIMuCwsPACAAKAIABEAgABDxAwsLDwAgACgCAARAIAAQgi4LCw8AIAAoAgAEQCAAEIAuCwsPACAAKAIABEAgABCSJgsLEgAgACkDABDxGiAAQRhqEIIoCw8AIAAoAgAEQCAAEMcCCwsPACAAKAIABEAgABCSBQsLDwAgACgCAARAIAAQmSYLCxIAIAApAwAQ8RogAEEYahCIKAsPACAAKAIABEAgABCcJgsLDwAgACgCAARAIAAQkwULCw8AIAAoAgAEQCAAEJICCwsPACAAKAIABEAgABCdJgsLDwAgACgCAARAIAAQ+QQLCxMAIAAoAgAgACgCBEEEQQwQyyILDwAgACgCAARAIAAQtCkLCw8AIAAoAgAEQCAAEKImCwsPACAAKAIABEAgABC9BQsLEgAgACkDABDxGiAAQRhqEI8oCw8AIAAoAgAEQCAAEJYjCwsPACAAKAIABEAgABDUBgsLEwAgACgCCCAAKAIAQQRBBBDLIgsOACAABEAgACABEKsFCwsTACAAIAEQsS0gACgCFCABEJYgCw8AIAAoAgAEQCAAEOwKCwsSACAAKQMIEPEaIABBIGoQ0CkLDgAgAARAIAAgARCMLgsLDgAgAARAIAAgARC9AwsLDgAgAARAIAAgARDAGgsLEwAgACABELwiIAAoAiAgARC2FQsSACAAKQMAEPEaIABBGGoQnigLDwAgACgCAARAIAAQwiYLCw8AIAAoAgAEQCAAENApCwsPACAAKAIABEAgABD6BAsLDwAgACgCAARAIAAQ4AILCw8AIAAoAgAEQCAAEMMmCwsPACAAKAIABEAgABCUBQsLEgAgACkDABDxGiAAQRhqEKIoCxMAIAAoAgggACgCAEEEQQgQyyILIgAgAEK03fjZjcmr/P0ANwMIIABCsYKesvCAx+GZfzcDAAsgACAAQsXPpdyR/OrwTTcDCCAAQpDH6+menPnecTcDAAsQACAAEKokIABBLEEEENERCxMAIABB/ILAADYCBCAAIAE2AgALEQAgASAAKAIEIAAoAggQqgMLEQAgACgCBCAAKAIIIAEQxw4LEQAgASAAKAIAIAAoAgQQqgMLDgAgACgC1AIgAUEBa0sLDgAgACgCuAIgAUEBa0sLDgAgACgCzAIgAUEBa0sLJQEBfyAAQQxqENQeIAAoAgQiASAAKAIIEKAbIAAoAgAgARDdKQsSAEH4luQALQAAGiABIAAQvSELIQAgAELmoYLanoO0xvMANwMIIABC3N6G4eXMm6gyNwMACyAAIABCzMrs2/Ktz+JlNwMIIABCiZjpgbnpmt4uNwMACxAAIAAQoiMgAEEoQQQQ0RELEwAgAEGwvsAANgIEIAAgATYCAAsTACAAQey+wAA2AgQgACABNgIACyEAIABC3bzStoOrnOpgNwMIIABCkIfa8K6qicmIfzcDAAsgACAAQuiNp7+B59f/fTcDCCAAQsr39Pu627qUHjcDAAsMACAABEAgARDJJgsLEQAgASgCFCABKAIYIAAQkgQLEAAgACACNgIEIAAgATYCAAsTACAAQfSAwgA2AgQgAEEBNgIACw8AIABBBGoQyiQgABDkHgsQACAAELAXIABBoA1qEOUeCw8AIABBBGoQ5R4gABDtHgt1AQJ/IAAQ2CIgAEEwaiIBKAIAIAEoAgQQ2SkgASgCECICIAEoAhQQ3RwgASgCDCACEN0pIAEoAhggASgCHBDZKQJAIAEoAigiAkUNACACIAIoAgAiAkEBazYCACACQQFHDQAgAUEoahC3DgsgAEGQA2oQ7R4LIAAgACgCOARAIAAoAjwgACgCQBDWJAsgAEHIAGoQ7R4LEwAgACABQQBB4JbDABCvHygCAAsOACAAIAEgAhDXEEEBcwsQACAAIAEoAgAgASgCBBAwCxEAIAAoAgAiABCnIyAAEO0qCxEAIAAQwRQ2AhggAEEANgIACw8AIAAQ2CIgAEEwahDSGgsRACAAKAIAIgAQgQ4gABDtKgshACAAQvnV8dO/jpixVTcDCCAAQsvZ1qS/yqOB9QA3AwALEQAgACgCACAAKAIEIAEQowsLFwAgAEGAgICAeDYCAEECQZzU2AAQ7xQLEAAgACACEIgNIAEgAhCIDQsPACAAEJ8DIABBBGoQgwULDwAgABCfAyAAQQRqEPYkCw8AIAAQ5iYgAEEMahDyIgsPACAAEO4mIABBDGoQ6CYLDwAgABD5JCAAQQRqEJ8DCw8AIABBMGoQ7CYgABDKEwsPACAAEPkkIABBFGoQ6CYLEQAgACgCACIAEKwCIAAQiSsLDAAgAARAIAAQ1ygLCw8AIAAQ1CggAEEEahDwBAsQACAAEPAmIABBFEEEENERCxIAQcAAQQgQziIgAEHAABD8BgsMACAABEAgABCMKwsLEQAgACgCACIAEN0EIAAQiSsLDwAgACABQQAgAiACEIEHCxAAIAAQ8iYgAEEYQQQQ0RELEABBMEEIEKEgIABBMBD8BgsPACAAEPILIABBOGoQ2igLDwAgAEEgahDaKCAAEIMeCxEAIAAoAgAiABCfHSAAEJIrCw8AIAAQ2iggAEEEahC8BQsPACAAEIcnIABBFGoQ+SYLDwAgABCIJyAAQRRqEPkmCw8AIAAQiyUgAEEUahD5JgsRACAAKAIAIgAQ8AIgABCJKws+AQF/AkAgACgC0AEhAyAALQCFAkUEQCAAIAEgAyACEP0UEIATDAELIAAoAtwBIAAtAIICIAEgAyACEL8RCwsPACAAIAAoAhAgAWoQ0h0LFAAgACABIAAoAtABIAIQ/RQQgBMLDwAgABDcAiAAQQRqEIkFCxAAIAAQ8iYgAEEcQQQQ0RELDwAgABDlKCAAQQRqEIoFCw8AIAAQnxYgAEEgahDlKAsPACAAEJYlIABBFGoQkycLDwAgAEEwahDsJiAAEJkSCw8AIAAQwxkgAEEQahCZJQsPACAAEJslIABBGGoQ/BULDwAgABDDGSAAQRhqEJcnCw8AIAAQ5QIgAEEEahCdBQsPACAAEMMZIABBEGoQwxkLDwAgABDOAiAAQQRqEJ4FCw8AIAAQowIgAEEEahCyBQs2AQF/AkAgAEEYaiIBLQAUQQJGBEAgASgCACIBEPYoIAFBMEEIENERDAELIAEQwxkLIAAQwxkLNgEBfwJAIABBGGoiAS0AFEECRgRAIAEoAgAiARD3KCABQTBBCBDREQwBCyABEMMZCyAAEMMZCw8AIAAQvgIgAEEEahCBBQsPACAAELoDIABBBGoQggULDwAgABClAiAAQQRqEPEECw8AIAAQuScgAEEQahC5JwsPACAAEOwKIABBEGoQ7AoLDwAgABDfCSAAQRBqEOwKCw8AIAAQryUgAEEEahDyBAsRACABIAApAwAgACgCEBCHGwsOACAAIAEgAEEQahD1IQsPACAAEOItIABBBGoQ3y0LDwAgAEEwahCFGyAAEKwUCw8AIAAQ3QIgAEEEahCLBQsPACAAEJACIABBBGoQ8wQLEQAgACgCACIAEK0DIAAQiSsLDwAgABCFKSAAQQRqEIwFCxEAIABB/wFxQaDv4wBqLQAACxEAIAAoAgAiABCBESAAEOksCxAAQShBCBChICAAQSgQ/AYLEQAgACgCACIAEPYCIAAQiSsLDwAgABCKKSAAQQRqEIopCw8AIAAQiikgAEEEahCNBQsPACAAENElIABBBGoQiikLDgAgACABIAIQxQhBAXMLDwAgABDvLSAAQQRqEIMGCw8AIAAQ7y0gAEEEahD0LQsRACAAKAIAENUoIABBADYCAAsRACAAKAIAIgAQpQMgABCJKwsPACAAEN4CIABBBGoQjgULDwAgABCRGyAAQQxqEN8nCw8AIAAQ8C0gAEEUahD3JQsPACAAEO8tIABBDGoQ3ScLDwAgABCRAiAAQQRqEPQECw8AIAAQ4SUgAEEUahDXJwsPACAAEJIpIABBBGoQjwULDwAgABC0AiAAQQRqEPUECw8AIAAQ8i0gAEEUahCoKgsPACAAEPItIABBBGoQ8S0LDwAgABDwLSAAQQRqEO8tCw8AIAAQtgIgAEEEahD2BAsPACAAEN8CIABBBGoQkAULDwAgABDrCiAAQRBqEJIVCw8AIAAQoikgAEEEahCiKQsRACAAKAIAIgAQvwIgABCJKwsPACAAEJQVIABBEGoQ3BcLDwAgAEEgahCiKSAAEJQeCw8AIAAQoikgAEEEahD3BAsPACAAQTBqEJMbIAAQ6hMLDwAgAEEwahCUGyAAEOkTCxEAIAAoAgAiABCXAyAAEIkrCxEAIAAoAgAQuR4gAEEANgIACw8AIAAQqCkgAEEEahCRBQsPACAAEMcCIABBBGoQkgULDwAgABCZJiAAQQRqEJMFCw8AIAAQkgIgAEEEahD5BAshACAAQr6rtM2FmtDB/AA3AwggAEKtzYuD/PG45343AwALEQAgACgCCC0APBCwKUH/AXELEQAgAEH/AXFB9PDjAGotAAALEwAgAEGI1t8ANgIEIAAgATYCAAshACAAQp7sxIjmq5/Dh383AwggAEKDzfm7tpbBqFM3AwALEQAgACgCFC0ATBCwKUH/AXELEQAgACgCACIAEN4EIAAQiSsLDwAgABD4CyAAQThqELQpCw8AIABBIGoQtCkgABCZHgsRACAAKAIAIgAQsh0gABCSKwsPACAAELQpIABBBGoQvQULDwAgABCHJyAAQRRqEI8oCw8AIAAQiCcgAEEUahCPKAsPACAAEKMmIABBFGoQjygLDwAgACABQQAgAiACEIYHCxEAIAAgAiABKAIAKAIAENQDCxAAIAAgAiABKAIAKAIAEGELEgAgACgCABDaByAAKAIEENoHCwkAIAAgARC5IgsPACAAEOIWIABBIGoQ0CkLIgAgAEKN3+Lb25j2yIh/NwMIIABCtMGymvbrpbTGADcDAAsTACAAQQ02AgQgAEHG0+AANgIACxMAIABBKDYCBCAAQaTP4AA2AgALIQAgAEK4h5nDq+GknDE3AwggAEK50ILmgbedrdUANwMACxMAIABBHzYCBCAAQafT4AA2AgALIgAgAELDjtHY8PH8kuoANwMIIABC3YHgytDyyNryADcDAAshACAAQvvi0Y3g2ZSkDzcDCCAAQqz/qZjKrojwzAA3AwALHwAgAEKlt6iw9LLgRjcDCCAAQvSN5o+b7figBzcDAAshACAAQqHqw6jImIWvqH83AwggAEKTm/rvsOqY42E3AwALEAAgABC2JiAAQTBBBBDREQsQACAAEJwkIABBOEEEENERCxMAIABB3NTgADYCBCAAIAE2AgALEwAgAEGY1eAANgIEIAAgATYCAAsfACAAQo6h7Z7+iefBETcDCCAAQvbP7rqIjPV3NwMACxEAIAAoAgAiABDCAiAAEIkrCw8AIAAQ0CkgAEEEahD6BAshACAAQpSw3o7wlbnsJzcDCCAAQoPqtPO82uiE/wA3AwALDwAgAEEMahDsCiAAEIknCw8AIAAQ4AIgAEEEahCUBQsPACAAEMYmIABBFGoQoigLDQAgACABQQFBARDLIgsPAEH4luQALQAAGiAAEGALzhIBEH8gACEEIwBBsAFrIgMkACACQQA2AgACQAJAAkAgASIAKAIAIgUgASgCBCIJSw0AIAJBBGohBwJAAkACQCAEKAI8IggEQCABLQAQQQFHDQELAkACQCACKAIQRQRAIARB3AJB2AIgAC0A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IAQoAtQCTQ0BDAMLIAYgAykC7AE3AgQgBiAHNgIAIAZBDGogA0H0AWooAgA2AgAMCwsgA0HgAGogBCABEJ0gIAMgAykDYDcC4AEgA0HYAGogA0HgAWpBABCMECADKAJYQQFxRQ0LQQEhByADQewBaiADKAJcIgAgBUEBaiILIBAoAgAgDygCACAAQZCFxAAQrx8oAgBrIAsQ4xIMAQsgCSAIQeSqwAAQrRAACyAFQQFqIQUMAAsACyAGAn8CQAJAIAQoAtgCIgFFDQAgASAEKALUAksNACADQdAAaiAEIAEQnSAgAyADKQNQNwLgASADQcgAaiADQeABakEAEIwQIAMoAkhBAXFFDQogA0HsAWogAygCTCIAIAUgBEE0aigCACAEQThqKAIAIABBkIXEABCvHygCAGsgBRDjEgwBCyACKAIMIgcgBSAFIAdJGyEIIARByABqIQsgAigCCCENIARBCGohAiAEQQRqIQkgBEEgaiEOIARBHGohDwNAIAUgDEYEQCAGQQA2AgAMCgsCQCAFIAhHBEAgCyAFIA1qLQAAIgpqIRAgASEAA0ACQAJ/IAkoAgAgAigCACAAQdiAxAAQsB8oAgQiAQRAIA8oAgAgDigCACABIBAtAABqQeiAxAAQrx8oAgAMAQsgA0FAayAEIAAQnCAgAyADKQNANwKEAgNAIANB4AFqIANBhAJqEIEPIAMtAOABRQ0CIAMtAOEBIgEgCkkNAAsgASAKRw0BIAMoAOIBCyIBQQFHDQMLIAkoAgAgAigCACAAQYCFxAAQsB8oAgwhAAwACwALIAggB0HkqsAAEK0QAAsCQCABIAQoAtACSw0AQQAgAUUNAxogASAEKALUAksNACADQThqIAQgARCdICADIAMpAzg3AuABIANBMGogA0HgAWpBABCMECADKAIwQQFxBEAgA0HsAWogAygCNCIAIAVBAWoiASAEQTRqKAIAIARBOGooAgAgAEGQhcQAEK8fKAIAayABEOMSDAMLDAsLIAVBAWohBQwACwALIAYgAykC7AE3AgQgBkEMaiADQfQBaigCADYCAEEBCzYCAAwGCwJAIAQoAtgCIgFFDQAgASAEKALUAksNACADQagBaiAEIAEQnSAgAyADKQOoATcC7AEgA0GgAWogA0HsAWpBABCMECADKAKgAUEBcUUNByADQeABaiADKAKkASIAIAUgBEE0aigCACAEQThqKAIAIABBkIXEABCvHygCAGsgBRDjEiAGQQE2AgAgBkEMaiADQegBaigCADYCACAGIAMpAuABNwIEDAYLIANB7AFqIAAgBEFAayILKAIAIAIoAggiCCACKAIMIgcgBSAMEOYdAkACQAJAIAMoAuwBIgBBAWsOAgEAAgsgBEHIAGohDSADKALwASECIARBCGohCSAEQQRqIQogBEEgaiEOIARBHGohDwNAIAwgAiIFTQRAIAZBADYCAAwJCwJAIAUgB0kEQCANIAUgCGotAAAiAmohECABIQADQAJAAn8gCigCACAJKAIAIABB2IDEABCwHygCBCIBBEAgDygCACAOKAIAIAEgEC0AAGpB6IDEABCvHygCAAwBCyADQZgBaiAEIAAQnCAgAyADKQOYATcChAIDQCADQewBaiADQYQCahCBDyADLQDsAUUNAiADLQDtASIBIAJJDQALIAEgAkcNASADKADuAQsiAUEBRw0DCyAKKAIAIAkoAgAgAEGAhcQAELAfKAIMIQAMAAsACyAFIAdB5KrAABCtEAALAkAgASAEKALQAksNACABBEACQCAEKALUAiABTwRAIANBkAFqIAQgARCdICADIAMpA5ABNwLsASADQYgBaiADQewBakEAEIwQIAMoAogBQQFxDQEMDQsgA0HsAWogBCgCPCALKAIAIAggByAFIAwQ5h0gA0GAAWogAygC7AEgAygC8AEQvCEgAygCgAFFBEAgBkEANgIADAwLIAMoAoQBIgIgBUsNAwwCCyADQeABaiADKAKMASIAIAVBAWoiASAEQTRqKAIAIARBOGooAgAgAEGQhcQAEK8fKAIAayABEOMSIAZBATYCACAGQQxqIANB6AFqKAIANgIAIAYgAykC4AE3AgQMCgsgBkEANgIADAkLIAVBAWohAgwACwALIAYgAykC8AE3AgQgBkEMaiADQfgBaigCADYCAAsgBiAANgIADAULIAYgAykC8AE3AgQgBkEMaiADQfgBaigCADYCAAsgBiAANgIADAMLIARByABqIQ4gAygC8AEhAiAEQQhqIQogBEEEaiELIARBOGohDyAEQTRqIRAgBEEgaiERIARBHGohEgNAAkACQCAMIAIiBUsEQAJAIAUgCEkEQCAOIAUgCWotAAAiAmohEyABIQADQAJAAn8g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DQsgBCgCBCIAIAFLDQILIAFBAWohAAwBCwsgBEEQaiADQRBqKAIAIANBFGooAgAgBiADKAI8dkECa0HYgsQAELQfIgAoAgQgACgCCEEAELUfKAIAIgAgAUEBaiIBIANBHGooAgAgA0EgaigCACAAQciCxAAQrx8oAgBrIAEQ4xIgBUEBNgIAIAVBDGogBEEYaigCADYCACAFIAQpAhA3AgQMCQtBARDOJiEAIAVBAjYCACAFIAA2AgQMCAsgASACQeSqwAAQrRAACyAFQQA2AgAMBgsgBSAEKQIkNwIEIAVBDGogBEEsaigCADYCAAsgBSAANgIADAQLIAUgBCkCJDcCBCAFQQxqIARBLGooAgA2AgALIAUgADYCAAwCCyADQUBrIQogBCgCJCEAIANBCGohDCADQQRqIQ4gA0EUaiEPIANBEGohECADQSBqIREgA0EcaiENA0ACQAJAAkACQCALIAAiAUsEQCAAIAJPDQIgDigCACAMKAIAIAYgCiAAIAhqLQAAai0AAGpBuILEABCvHygCACIGIAMoAsgCSw0DIAZFDQQgBiADKALMAk0NASAEQSBqIAMoAiggCSgCACAIIAIgACALEOYdIARBCGogBCgCICAEKAIkELwhIAQoAghFBEAgBUEANgIADAgLIAQoAgwiACABTQ0DDAULIAUgBCkCEDcCBCAFIAc2AgAgBUEMaiAEQRhqKAIANgIADAYLQQEhByAEQRBqIBAoAgAgDygCACAGIAMoAjx2QQJrQdiCxAAQtB8iACgCBCAAKAIIQQAQtR8oAgAiEiABQQFqIgAgDSgCACARKAIAIBJByILEABCvHygCAGsgABDjEgwDCyABIAJB5KrAABCtEAALIAFBAWohAAwBCwsgBSAEKQIQNwIEIAUgBzYCACAFQQxqIARBGGooAgA2AgAMAQsgBSAINgIAIAUgASkCADcCBCAFQQxqIAFBCGooAgA2AgALIARBMGokAAvXDwEMfyMAQSBrIgUkACACQQA2AgACQCABIgMoAgAiASADKAIEIgtLDQAgAkEEaiEIAkACQAJAAkACQAJAAkACQCAAKAIoIgkEQCADLQAQQQFHDQELAkACQAJAIAIoAhBFBEAgAy0AEA0BIAAoAtACIgQNAgwLCyACKAIUIQQgAigCGA0CIAIoAiAhAQwICyAAKALUAiIERQ0DCyAEIAAoAswCSw0FIAIoAhxBACACKAIYGyIGIABBEGoiCSgCACAAQRRqIgooAgAgBCAAKAI8dkECa0H4gsQAELQfKAIITw0FIAJBATYCGCACIAZBAWo2AhwgBUEQaiAJKAIAIAooAgAgBCAAKAI8dkECa0HYgsQAELQfIgMoAgQgAygCCCAGELUfKAIAIgMgASAAQRxqKAIAIABBIGooAgAgA0HIgsQAEK8fKAIAayABEOMSIAJBATYCACAIIAUpAhA3AgAgCEEIaiAFQRhqKAIANgIADAkLIAIoAhwiASAAQRBqIgcoAgAgAEEUaiIGKAIAIAQgACgCPHZBAmtB+ILEABC0HygCCE8EQCACQQA2AhggAkEANgIAIAIgAigCIEEBaiIBNgIgDAYLIAJBATYCGCACIAFBAWo2AhwgAigCICEDIAVBEGogBygCACAGKAIAIAQgACgCPHZBAmtB2ILEABC0HyIEKAIEIAQoAgggARC1HygCACIBIANBAWoiAyAAQRxqKAIAIABBIGooAgAgAUHIgsQAEK8fKAIAayADEOMSIAJBATYCACAIIAUpAhA3AgAgCEEIaiAFQRhqKAIANgIADAYLAkACQCACKAIQRQRAIAAoAtACIgRFDQkgBCAAKALMAk0NAQwECyACKAIUIQQgAigCGA0BIAIoAiAhAQwECyACKAIcQQAgAigCGBsiBiAAQRBqIgooAgAgAEEUaiIMKAIAIAQgACgCPHZBAmtB+ILEABC0HygCCE8NAiACQQE2AhggAiAGQQFqNgIcIAVBEGogCigCACAMKAIAIAQgACgCPHZBAmtB2ILEABC0HyIDKAIEIAMoAgggBhC1HygCACIDIAEgAEEcaigCACAAQSBqKAIAIANByILEABCvHygCAGsgARDjEiACQQE2AgAgCCAFKQIQNwIAIAhBCGogBUEYaigCADYCAAwICyACKAIcIgEgAEEQaiIHKAIAIABBFGoiBigCACAEIAAoAjx2QQJrQfiCxAAQtB8oAghPBEAgAkEANgIYIAJBADYCACACIAIoAiBBAWoiATYCIAwDCyACQQE2AhggAiABQQFqNgIcIAIoAiAhAyAFQRBqIAcoAgAgBigCACAEIAAoAjx2QQJrQdiCxAAQtB8iBCgCBCAEKAIIIAEQtR8oAgAiASADQQFqIgMgAEEcaigCACAA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QQEhCQsgA0GgAWogBCAFQSBqIhQoAgAgAigCCCISIAIoAgwiDyAGIBUQ5h0CQAJAAkACQCADKAKgASIAQQFrDgIBAAILIAVBLGohEyADKAKkASEAIAVBCGohCyAFQQRqIREgBUEUaiEODAILIAggAykCpAE3AgQgCEEMaiADQawBaigCADYCAAsgCCAANgIADAILAkADQAJAAkAgFSAAIgJLBEAgACAPSQRAIBMgACASai0AAGotAAAiB0ECaiEGIAEhAANAAkACQAJAAkACQAJAAkAgESgCACALKAIAIABBoIPEABCvHygCACIBQf8BcUH+AWsOAgECAAsgA0GAAWogESgCACALKAIAIABBAmoiDEGwg8QAEOQbIAFBAnZBP3EgAUEDcUEAR2oiCiADKAKEASIBSw0SIAMoAoABIQ0gCkECdCEEQX8hAQNAIARFDQYgAUEBaiEBIAcgDSgCACIQQf8BcUYNAyAHIBBBCHZB/wFxRg0EIAcgEEEQdkH/AXFGDQUgDUEEaiENIARBBGshBCAHIBBBGHZHDQALIBEoAgAgCygCACAKIAxqIAFBAnRqQQNqQdCDxAAQrx8oAgAhAQwKCyAHIBEoAgAgCygCACAAQZCExAAQrx8tAAFGDQgMBAsgESgCACALKAIAIAAgBmpBsITEABCvHygCACIBQQFGDQMMCAsgESgCACALKAIAIAogDGogAUECdGpBgITEABCvHygCACEBDAcLIBEoAgAgCygCACAKIAxqIAFBAnRqQQFqQfCDxAAQrx8oAgAhAQwGCyARKAIAIAsoAgAgCiAMaiABQQJ0akECakHgg8QAEK8fKAIAIQEMBQsgESgCACALKAIAIABBAWpBwITEABCvHygCACEADAALAAsgAiAPQeSqwAAQrRAACyAIIAMpApABNwIEIAggCTYCACAIQQxqIANBmAFqKAIANgIADAULIBEoAgAgCygCACAAQQJqQaCExAAQrx8oAgAhAQsCQAJAIAEgBSgCtAJLDQAgAUUNASADQZABagJ/AkAgBSgCuAIgAU8EQCAFKAIoIQAgA0H4AGogESgCACALKAIAIAFB4ITEABDkGyADKAJ8IhBFDQogEAJ/IAMoAngiBi0AACIEQf8BRwRAIAQgBEECdmogBEEDcUEAR2pBAmoMAQsgAEECagsiBE0NBiAGIARBAnRq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QAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQEEHIAIoAgAiA0EMayIEIARBJk8bQQFrDiQAAQIDBAUGBwgJCgsMDSEODxAREiETFBUhIRYXGBkaGxwdIR4hCyACKAIMQQR0IQMgAigCCCECA0AgA0UNISACKAIAQQJHBEAgAkEMaiABENQrCyACQRBqIQIgA0EQayEDDAALAAsgASACQQRqELkDDB8LIAEgAkEIahDYBAweCyACQQRqIAEQ1CsMHQsgAkEMaiABENQrDBwLIAJBBGogARDUKyACQQhqIAEQ1CsMGwsgAkE4agJAAkACQAJAAkACQAJAAkACQAJAAkACQCADQQFrDgsBAgMEBQYHCAkLCgALIAEgAkEIahDIGQwKCyACQQhqIAEQlB8MCQsgASACQQhqEOghDAgLIAJBBGogARDUKwwHCyACQQRqIAEQ7xgMBgsgASACQQRqEMggDAULIAEgAkEEahDIIAwECyACQQRqIAEQ1CsMAwsgASACQQRqEMggDAILIAJBBGogARCrJQwBCyACQQhqIQMCQAJAIAIoAgRBAWsOAgECAAsgAyABEIsVDAELIAMgARCLDQsgARDUKwwaCyACQQhqIAEQlB8MGQsgASACQQhqEOghDBgLIAJBBGogARDUKyACQQhqIAEQ1CsgAkEMaiABENQrDBcLIAItABhBBUYEQCACQRBqIAEQ1CsLIAJBBGogARDwGCACQShqIAEQziMMFgsgAkEQaiABENQrIAIoAgRBgICAgHhHBEAgAkEEaiABEPAYCyACQSBqIAEQziMMFQsgAkEEaiABEIwaDBQLIAJBCGogARCPDwwTCyACQQRqIAEQjBoMEgsgAkEEaiABENQrIAJBGGogARDOIyACKAIIIAEQjBoMEQsgAigCECEHQRghCEEAIQQgASgCMBC6ESEFIABB4ABqQcif4wApAwAiDjcDAEEIIQMgAEHQAGogDjcDACAAQfwAaiABQTRqKAIANgIAIABBAToAcCAAIAE2AmggACAFNgJsIABBAToAgQEgAEHAn+MAKQMAIg43A1ggACAONwNIIAAgASkCLDcCdCAAIAEtADw6AIQBIAAgAS8BOjsBggEgAS0AOCEFIAAgAS0APToAhQEgACAFOgCAASACQSBqIABByABqEL4NIAAtAIEBIQsgAEEAOgCB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BhCDAgsPACAAQeXQ3QBBmAQQgwILDwAgAEH91N0AQdwNEIMCCw8AIABB2eLdAEGNARCDAgsPACAAQebj3QBB9wAQgwILDwAgAEHd5N0AQawDEIMCCw8AIABBiejdAEHxBxCDAgsPACAAQfrv3QBB1AoQgwILEAAgAEHO+t0AQcmTARCDAgsOACAAQZeO3wBBJBCDAgsPACAAQbuO3wBBpAoQgwILDwAgAEHfmN8AQYYGEIMCCw8AIABB5Z7fAEG5FBCDAguoBwICfwJ+AkAgACgCACIAKAIAIgJBGkYEQCABKAIAQQFHDQEgASgCBCICIAAoAhhHDQEgACkDCBD0GiEEIAApAxAhBSAALQAcIQNBwABBCBChICIBIAM6ABwgASACNgIYIAFCADcDECABIAQ3AwggAUEaNgIAQazI3wBBARDUGiEEIAAQpwIgACABNgIoIAAgBTcDICAAQgA3AxggACAENwMQIABBADYCCCAAQRQ2AgAMAQsCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQEEHIAJBDGsiAyADQSZPG0EBaw4kAAECEhMDBAUGBwgJFRYWFQoLDA0WEhIOFhYPEBISEhISEhYRFgsgACgCDEEEdCECIAAoAgghAANAIAJFDRYgACgCAEECRwRAIABBDGogARDALAsgAEEQaiEAIAJBEGshAgwACwALIABBBGogARDtCQwUCyAAQQhqIAEQwSwMEwsgAEEEaiABEMAsIABBCGogARDALAwSCyAAQThqAkACQAJAAkACQAJAAkACQAJAAkACQCACQQFrDgsAAQIDBAUGBwgKCQoLIABBCGogARCXHwwJCyAAQQhqIAEQ6yEMCAsgAEEEaiABEMAsDAcLIABBBGogARCqHAwGCyAAQQRqIAEQwCwMBQsgAEEEaiABEMAsDAQLIABBBGogARDALAwDCyAAQQRqIAEQwCwMAgsgAEEEaiABEMAsDAELIABBCGohAgJAAkAgACgCBEEBaw4CAQIACyACIAEQlRcMAQsgAiABELwOCyABEMAsDBELIABBCGogARCXHwwQCyAAQQhqIAEQ6yEMDwsgAEEEaiABEMAsIABBCGogARDALAwLCyAALQAYQQVGBEAgAEEQaiABEMAsCwwLCyAAQRBqIAEQwCwgACgCBEGAgICA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CyAAKAIMRQ0HDAULIABBIGoQzCAMBgsgACgCBCABEKIMDAULIABBBGogARDKDwwECyAAQQRqIAEQrhwMAwsgAEEEaiABEMssDAILIABBDGogARDLLAwBCyAAQQRqIAEQnxoLC+cFAQJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAQQcgACgCACIAKAIAIgJBDGsiAyADQSZPG0EBaw4kAAECExQDBAUGBwgJFgoXFgsMDQ4XExMPFxcQERMTExMTExcSFwsgACgCDEEEdCECIAAoAgghAANAIAJFDRcgACgCAEECRwRAIABBDGogARDMLAsgAEEQaiEAIAJBEGshAgwACwALIABBBGogARCqCgwVCyAAQQhqIAEQwCcMFAsgAEEEaiABEMwsIABBCGogARDMLAwTCyAAQThqAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAJBAWsOCwECAwQFBgcICQsKAAsgAEEIaiABEP8oDAoLIABBCGogARCZHwwJCyABIABBCGoQ9yEMCAsgAEEEaiABEMwsDAcLIABBBGogARCtHAwGCyAAQQRqIAEQzCwMBQsgAEEEaiABEMwsDAQLIABBBGogARDMLAwDCyAAQQRqIAEQzCwMAgsgAEEEaiABEMwsDAELIABBCGohAgJAAkAgACgCBEEBaw4CAQIACyACIAEQlxcMAQsgAiABEPUNCyABEMwsDBILIABBCGogARCZHwwRCyABIABBCGoQ9yEMEAsgAEEEaiABEMwsIABBCGogARDMLAwMCyAALQAYQQVGBEAgAEEQaiABEMwsCwwMCyAAQRBqIAEQzCwgACgCBEGAgICAeEYNDQwLCyABIAApAwggACgCGBCHGwwMCyAAQQRqIAEQzCwgACgCCCABEJ0aDAsLIABBBGogARDXEgwKCyAAQQhqIAEQwScMCQsgACgCDEUNCAwFCyAAQSBqIAEQ3B0MBwsgACgCBCABEIIMDAYLIABBBGogARDJDwwFCyAAQQRqIAEQrRwMBAsgAEEEaiABEMwsDAMLIABBDGogARDMLAwCCyAAQQRqIAEQ9RgMAQsgAEEEaiABEJ0aCwsMACABIAAoAgAQ8gELDAAgACgCACABEMYRCwwAIAAoAhggARCcEguPAgEFfyAAKAIYIgMgARCUGiADKAIUQdgAbCEFIAMoAhAhBgNAIAIgBUcEQAJAAkACQAJAAkACQAJAAkAgAiAGaiIAKAIAIgRBBGtBACAEQQVrQQhJG0EBaw4IAQIDBAcHBQYACyAAIAEQ6QsMBgsgAEEIaiABELQlDAULIABBIGogARDELAwECyABIABBCGoQ8CEgAEE8aiABELUlIABBMGogARCUGgwDCyAAQSRqIAEQtSUgAEEsaiABEJQaDAILIABBBGogARCVGgwBCyAAQQhqIgQoAgBBBUcEQCABIAQQ8CELIABBPGogARC1JSAAQTBqIAEQlBoLIAJB2ABqIQIMAQsLIANBMGogARC1JQsMACAAKAIYIAEQ8g8LDAAgASAAKAIYEKwDCwwAIAAoAgAgARCqFAsMACAAKAIAIAEQ1wQLDAAgACgCACABEK4ICwwAIAAoAgAgARCWBQsMACAAKAIAIAEQ5BMLDAAgASAAKAIAEMkBCwwAIAAoAgAgARD5AQsMACABIAAoAgAQpB0LDAAgACgCACABEMgDCwwAIAAoAgAgARDlEwsMACAAKAIAIAEQqxQLDAAgACgCACABEP0ECwwAIAAoAgAgARDmEwsMACAAKAIAIAEQyBELDAAgACgCACABENUECwwAIAAoAgAgARDnEwsMACAAKAIAIAEQqRELCwAgACgCACABEF4LDAAgASAAKAIAEIsgCwwAIAAoAgAgARCtFAsMACAAKAIAIAEQswMLDAAgASAAKAIAEMkeCwsAIABBKEEIENERCwoAIAAQmgsaQQELDAAgACgCACABEKIMCwwAIAAoAgAgARCkDAsMACAAKAIAIAEQggwLDAAgACgCACABEKEMCwwAIAAoAgAgARCnCwsMACAAKAIAIAEQowwLDAAgACgCACABEIEMCwwAIAAoAgAgARCcCgsMACAAKAIAIAEQ2ykLDAAgASAAKAIAEMEECwwAIABByABBCBDREQsLACAAKAIYIAEQUgsMACAAKAIYIAEQphILDAAgASAAKAIAEKoBCwwAIAEgACgCABDzAwsMACAAKAIAIAEQ0g0LDAAgASAAKAIAELECC5sGAQJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAQQcgACgCACIAKAIAIgJBDGsiAyADQSZPG0EBaw4kAAECExQDBAUGBwgJFgoXFgsMDQ4XExMPFxcQERMTExMTExcSFwsgACgCDEEEdCECIAAoAgghAANAIAJFDRcgACgCAEECRwRAIABBDGogARD8LAsgAEEQaiEAIAJBEGshAgwACwALIABBBGogARDjCAwVCyAAQSBqIAEQgS0MFAsgAEEEaiABEPwsIABBCGogARD8LAwTCyAAQThqAkACQAJAAkACQAJAAkACQAJAAkACQCACQQFrDgsAAQIDBAUGBwgKCQoLIABBCGogARCgHwwJCyAAQQhqIAEQjyIMCAsgAEEEaiABEPwsDAcLIABBBGogARC6HAwGCyAAQQRqIAEQ/CwMBQsgAEEEaiABEPwsDAQLIABBBGogARD8LAwDCyAAQQRqIAEQ/CwMAgsgAEEEaiABEPwsDAELIABBCGohAgJAAkAgACgCBEEBaw4CAQIACyACIAEQnBcMAQsgAiABEL4OCyABEPwsDBILIABBCGogARCgHwwRCyAAQQhqIAEQjyIMEAsgAEEEaiABEPwsIABBCGogARD8LAwMCyAALQAYQQVGBEAgAEEQaiABEPwsCwwMCyAAQRBqIAEQ/CwgACgCBEGAgICAeEYNDQwLCyABIAApAwggACgCGBCrHQwMCyAAQQRqIAEQ/CwgACgCCCABEKwaDAsLIAAoAgxBKGwhAiAAKAIIIQMDQCACBEAgAyABEK4UIAJBKGshAiADQShqIQMMAQsLIAAoAhAiACgCAEGAgICAeEcEQCAAIAEQrRoMCwsMBgsgAEEgaiABEPEFDAkLIAAoAgxFDQgMBQsgAEEIaiABEMweDAcLIAAoAgQgARCEDAwGCyAAQQRqIAEQzw8MBQsgAEEEaiABELocDAQLIABBBGogARD8LAwDCyAAQQxqIAEQ/CwMAgsgAEEEaiABEIMZDAELIABBBGogARCsGgsLhQYBAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAQQcgACgCACIAKAIAIgJBDGsiAyADQSZPG0EBaw4kAAECEhMDBAUGBwgJFRYWFQoLDA0WEhIOFhYPEBISEhISEhYRFgsgACgCDEEEdCECIAAoAgghAANAIAJFDRYgACgCAEECRwRAIABBDGogARD9LAsgAEEQaiEAIAJBEGshAgwACwALIABBBGogARDv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Pj0gMS9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL2Foby1jb3Jhc2ljay0xLjEuMy9zcmMvcGFja2VkL3JhYmlua2FycC5ycwDMGRAAbwAAAD0AAAAJAAAAYXNzZXJ0aW9uIGZhaWxlZDogaGFzaF9sZW4gPj0gMQDMGRAAbwAAAD8AAAAJAAAAzBkQAG8AAABNAAAALAAAAMwZEABvAAAATwAAABcAAABAAAAAzBkQAG8AAABgAAAAKwAAAMwZEABvAAAAbwAAABEAAADMGRAAbwAAAFsAAAAJAAAAzBkQAG8AAACOAAAAIwAAAMwZEABvAAAAlwAAAAkAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9haG8tY29yYXNpY2stMS4xLjMvc3JjL3V0aWwvcmVtYXBwZXIucnPwGhAAbAAAAHIAAAASAAAA8BoQAGwAAACMAAAAJAAAAPAaEABsAAAAkQAAACAAAADwGhAAbAAAAJMAAAAdAAAAQm9ycm93ZWRPd25lZC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL2Foby1jb3Jhc2ljay0xLjEuMy9zcmMvcGFja2VkL3BhdHRlcm4ucnMAAKkbEABtAAAAXQAAABoAAACpGxAAbQAAAF0AAAAwAAAAINAQAGkAAACHAgAAKQAAAGltcG1lbW9yeV91c2FnZQAVAwAADAAAAAQAAAAWAwAAFwMAABgDAABhbGxvYy9zcmMvcmF3X3ZlYy5yc3AcEAAUAAAAGAAAAAUAQZy5wAALfQEAAAAZAwAAYSBmb3JtYXR0aW5nIHRyYWl0IGltcGxlbWVudGF0aW9uIHJldHVybmVkIGFuIGVycm9yIHdoZW4gdGhlIHVuZGVybHlpbmcgc3RyZWFtIGRpZCBub3RhbGxvYy9zcmMvZm10LnJzAAD6HBAAEAAAAH4CAAAOAEGkusAAC/ICAQAAABoDAABhbGxvYy9zcmMvc2xpY2UucnMAACwdEAASAAAANQIAADIAAABh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aWNvZGVfZGF0YS5ycwAAAEFEEAAgAAAATgAAACgAAABBRBAAIAAAAFoAAAAWAAAAgICAgICAgICA9O6AgPKAgICAgICAgICAgICAgICAgIAgIaIjJCUmpygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWlvcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9foCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgGNvcmUvc3JjL251bS9iaWdudW0ucnMAAIRFEAAWAAAAqgEAAAEAAABhc3NlcnRpb24gZmFpbGVkOiBub2JvcnJvd2Fzc2VydGlvbiBmYWlsZWQ6IGRpZ2l0cyA8IDQwYXNzZXJ0aW9uIGZhaWxlZDogb3RoZXIgPiAwAABa1juS1lP07j87oQYpqj8R+GVlG2a0WJUHxSSkWcrHSna/PqJ/4a66SfYtDfC8eV1Tb86K35la6dxzeRAsLNj0lAXBtiug2JFp6EuKmxsHeflGcaQ2yE62hOLebILiSJe3mI1NRHri4yWbFggjGxv9cn94sGqMbY73IA7l9fAw/k+fllyF7wiyNalRXjMtvb0jR7yzZiuL3oIT5jWAeCytdqxVMCD7FosxzK8hUMs7TJMXazzoudytPb8bKiS+St943YVLYuhT2Q2vojStbR3Xa6ozbz1x1IdoreVAjGRyhgaVAMuMjcmpwhgfUa/9DmhIusD97/A71PLeZiUbvRICbXSY/pV2pYRXS2D3MLZLAYiRPn471M6lLV44Nb2jnkHqNc5dSolCz7l1hoKsTAZSsuGges6ViYGTCZTR6+9Dcx8aSRlC++uh+Av5xebrFBCmYJufEvpmyvZOd3fgJhrU0DiCR5e4AP20IlWVmLAgiYJjsYxecyCesDVVXV9utFVivN0vNpCoxR2DqjT3iSHreyvVu0O0EvfkI9UBdezppS07ZVWqsGuabjYlIckzskf4ib7q1JwGwQqEbmm7wJ6ZdixuJQpESPENJcpD6nAGwMrbZFeGKs2W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AAAAIAEAACEAAADolBAAbQAAACEBAAAYAAAA6JQQAG0AAABCAQAAPAAAAOiUEABtAAAARgEAACkAAADolBAAbQAAAEsBAAAPAAAA6JQQAG0AAABOAQAAGwAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL251bS1iaWdpbnQtMC40LjYvc3JjL2JpZ3VpbnQvc2hpZnQucnMAADyWEABqAAAAKAAAABkAAAA8lhAAagAAAEoAAAAjAAAAbmVnYXRpdmUgdmFsdWVzIGFyZSBub24temVyby9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL251bS1iaWdpbnQtMC40LjYvc3JjL2JpZ2ludC9zaGlmdC5ycwAAAOSWEABpAAAAZgAAACgAAAAAAAAABAAAAAQAAAA7AAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvbnVtLWJpZ2ludC0wLjQuNi9zcmMvYmlndWludC9hZGRpdGlvbi5ycwAAAHCXEABtAAAAOwAAABoAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9udW0tYmlnaW50LTAuNC42L3NyYy9iaWd1aW50L3N1YnRyYWN0aW9uLnJz8JcQAHAAAAA0AAAAGgAAAPCXEABwAAAANQAAABoAAABDYW5ub3Qgc3VidHJhY3QgYiBmcm9tIGEgYmVjYXVzZSBiIGlzIGxhcmdlciB0aGFuIGEugJgQADQAAADwlxAAcAAAAEUAAAAFAAAA8JcQAHAAAABdAAAAGgAAAPCXEABwAAAAXgAAABoAAABhc3NlcnRpb24gZmFpbGVkOiBhX2hpLmlzX2VtcHR5KCkAAADwlxAAcAAAAGIAAAAFAAAA8JcQAHAAAABlAAAABQAAAC9ydXN0Yy85MGIzNWE2MjM5YzNkOGJkYWJjNTMwYTZhMDgxNmY3ZmY4OWEwYWFmL2xpYnJhcnkvY29yZS9zcmMvc2xpY2UvaXRlci5ycwAAMJkQAE4AAADxBQAAFQAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL251bS1pbnRlZ2VyLTAuMS40Ni9zcmMvcm9vdHMucnOQmRAAZAAAAIMBAAABAAAAAAAAAAQAAAAEAAAAOwAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL29uY2VfY2VsbC0xLjE5LjAvc3JjL2ltcF9zdGQucnMUmhAAZAAAAKEAAAA2AAAAFJoQAGQAAACbAAAACQAAADM4OzI7AAAAmJoQAAUAAACxFxgAAQAAALEXGAABAAAANDg7MjsAAAC4mhAABQAAALEXGAABAAAAsRcYAAEAAAAbWzEyMzQ1Njc4ORtbMG0A45oQAAQAAAAzMDMxMzIzMzM0MzUzNjM3Mzk5MDkxOTI5Mzk0OTU5Njk3NDA0MTQyNDM0NDQ1NDY0NzQ5MTAwMTAxMTAyMTAzMTA0MTA1MTA2MTA3Mzg7MjsyNDA7MjQ4OzI1NTM4OzI7MjUwOzIzNTsyMTUzODsyOzAwMDsyNTU7MjU1Mzg7MjsxMjc7MjU1OzIxMjM4OzI7MjQwOzI1NTsyNTUzODsyOzI0NTsyNDU7MjIwMzg7MjsyNTU7MjI4OzE5NjM4OzI7MDAwOzAwMDswMDAzODsyOzI1NTsyMzU7MjA1Mzg7MjswMDA7MDAwOzI1NTM4OzI7MTM4OzA0MzsyMjYzODsyOzE2NTswNDI7MDQyMzg7MjsyMjI7MTg0OzEzNTM4OzI7MDk1OzE1ODsxNjAzODsyOzEyNzsyNTU7MDAwMzg7MjsyMTA7MTA1OzAzMDM4OzI7MjU1OzEyNzswODAzODsyOzEwMDsxNDk7MjM3Mzg7MjsyNTU7MjQ4OzIyMDM4OzI7MjIwOzAyMDswNjAzODsyOzAwMDswMDA7MTM5Mzg7MjswMDA7MTM5OzEzOTM4OzI7MTg0OzEzNDswMTEzODsyOzE2OTsxNjk7MTY5Mzg7MjswMDA7MTAwOzAwMDM4OzI7MTg5OzE4MzsxMDczODsyOzEzOTswMDA7MTM5Mzg7MjswODU7MTA3OzA0NzM4OzI7MjU1OzE0MDswMDAzODsyOzE1MzswNTA7MjA0Mzg7MjsxMzk7MDAwOzAwMDM4OzI7MjMzOzE1MDsxMjIzODsyOzE0MzsxODg7MTQzMzg7MjswNzI7MDYxOzEzOTM4OzI7MDQ3OzA3OTswNzkzODsyOzAwMDsyMDY7MjA5Mzg7MjsxNDg7MDAwOzIxMTM4OzI7MjU1OzAyMDsxNDczODsyOzAwMDsxOTE7MjU1Mzg7MjsxMDU7MTA1OzEwNTM4OzI7MDMwOzE0NDsyNTUzODsyOzE3ODswMzQ7MDM0Mzg7MjsyNTU7MjUwOzI0MDM4OzI7MDM0OzEzOTswMzQzODsyOzI1NTswMDA7MjU1Mzg7MjsyMjA7MjIwOzIyMDM4OzI7MjQ4OzI0ODsyNTUzODsyOzI1NTsyMTU7MDAwMzg7MjsyMTg7MTY1OzAzMjM4OzI7MTI4OzEyODsxMjgzODsyOzAwMDsxMjg7MDAwMzg7MjsxNzM7MjU1OzA0NzM4OzI7MjQwOzI1NTsyNDAzODsyOzI1NTsxMDU7MTgwMzg7MjsyMDU7MDkyOzA5MjM4OzI7MDc1OzAwMDsxMzAzODsyOzI1NTsyNTU7MjQwMzg7MjsyNDA7MjMwOzE0MDM4OzI7MjMwOzIzMDsyNTAzODsyOzI1NTsyNDA7MjQ1Mzg7MjsxMjQ7MjUyOzAwMDM4OzI7MjU1OzI1MDsyMDUzODsyOzE3MzsyMTY7MjMwMzg7MjsyNDA7MTI4OzEyODM4OzI7MjI0OzI1NTsyNTUzODsyOzI1MDsyNTA7MjEwMzg7MjsyMTE7MjExOzIxMTM4OzI7MTQ0OzIzODsxNDQzODsyOzI1NTsxODI7MTkzMzg7MjsyNTU7MTYwOzEyMjM4OzI7MDMyOzE3ODsxNzAzODsyOzEzNTsyMDY7MjUwMzg7MjsxMTk7MTM2OzE1MzM4OzI7MTc2OzE5NjsyMjIzODsyOzI1NTsyNTU7MjI0Mzg7MjswMDA7MjU1OzAwMDM4OzI7MDUwOzIwNTswNTAzODsyOzI1MDsyNDA7MjMwMzg7MjsxMjg7MDAwOzAwMDM4OzI7MTAyOzIwNTsxNzAzODsyOzAwMDswMDA7MjA1Mzg7MjsxODY7MDg1OzIxMTM4OzI7MTQ3OzExMjsyMTkzODsyOzA2MDsxNzk7MTEzMzg7MjsxMjM7MTA0OzIzODM4OzI7MDAwOzI1MDsxNTQzODsyOzA3MjsyMDk7MjA0Mzg7MjsxOTk7MDIxOzEzMzM4OzI7MDI1OzAyNTsxMTIzODsyOzI0NTsyNTU7MjUwMzg7MjsyNTU7MjI4OzIyNTM4OzI7MjU1OzIyODsxODEzODsyOzI1NTsyMjI7MTczMzg7MjswMDA7MDAwOzEyODM4OzI7MjUzOzI0NTsyMzAzODsyOzEyODsxMjg7MDAwMzg7MjsxMDc7MTQyOzAzNTM4OzI7MjU1OzE2NTswMDAzODsyOzI1NTswNjk7MDAwMzg7MjsyMTg7MTEyOzIxNDM4OzI7MjM4OzIzMjsxNzAzODsyOzE1MjsyNTE7MTUyMzg7MjsxNzU7MjM4OzIzODM4OzI7MjE5OzExMjsxNDczODsyOzI1NTsyMzk7MjEzMzg7MjsyNTU7MjE4OzE4NTM4OzI7MjA1OzEzMzswNjMzODsyOzI1NTsxOTI7MjAzMzg7MjsyMjE7MTYwOzIyMTM4OzI7MTc2OzIyNDsyMzAzODsyOzEyODswMDA7MTI4Mzg7MjsxMDI7MDUxOzE1MzM4OzI7MjU1OzAwMDswMDAzODsyOzE4ODsxNDM7MTQzMzg7MjswNjU7MTA1OzIyNTM4OzI7MTM5OzA2OTswMTkzODsyOzI1MDsxMjg7MTE0Mzg7MjsyNDQ7MTY0OzA5NjM4OzI7MDQ2OzEzOTswODczODsyOzI1NTsyNDU7MjM4Mzg7MjsxNjA7MDgyOzA0NTM4OzI7MTkyOzE5MjsxOTIzODsyOzEzNTsyMDY7MjM1Mzg7MjsxMDY7MDkwOzIwNTM4OzI7MTEyOzEyODsxNDQzODsyOzI1NTsyNTA7MjUwMzg7MjswMDA7MjU1OzEyNzM4OzI7MDcwOzEzMDsxODAzODsyOzIxMDsxODA7MTQwMzg7MjswMDA7MTI4OzEyODM4OzI7MjE2OzE5MTsyMTYzODsyOzI1NTswOTk7MDcxMzg7MjswNjQ7MjI0OzIwODM4OzI7MjM4OzEzMDsyMzgzODsyOzI0NTsyMjI7MTc5Mzg7MjsyNTU7MjU1OzI1NTM4OzI7MjQ1OzI0NTsyNDUzODsyOzI1NTsyNTU7MDAwMzg7MjsxNTQ7MjA1OzA1MDQ4OzI7MjQwOzI0ODsyNTU0ODsyOzI1MDsyMzU7MjE1NDg7MjswMDA7MjU1OzI1NTQ4OzI7MTI3OzI1NTsyMTI0ODsyOzI0MDsyNTU7MjU1NDg7MjsyNDU7MjQ1OzIyMDQ4OzI7MjU1OzIyODsxOTY0ODsyOzAwMDswMDA7MDAwNDg7MjsyNTU7MjM1OzIwNTQ4OzI7MDAwOzAwMDsyNTU0ODsyOzEzODswNDM7MjI2NDg7MjsxNjU7MDQyOzA0MjQ4OzI7MjIyOzE4NDsxMzU0ODsyOzA5NTsxNTg7MTYwNDg7MjsxMjc7MjU1OzAwMDQ4OzI7MjEwOzEwNTswMzA0ODsyOzI1NTsxMjc7MDgwNDg7MjsxMDA7MTQ5OzIzNzQ4OzI7MjU1OzI0ODsyMjA0ODsyOzIyMDswMjA7MDYwNDg7MjswMDA7MDAwOzEzOTQ4OzI7MDAwOzEzOTsxMzk0ODsyOzE4NDsxMzQ7MDExNDg7MjsxNjk7MTY5OzE2OTQ4OzI7MDAwOzEwMDswMDA0ODsyOzE4OTsxODM7MTA3NDg7MjsxMzk7MDAwOzEzOTQ4OzI7MDg1OzEwNzswNDc0ODsyOzI1NTsxNDA7MDAwNDg7MjsxNTM7MDUwOzIwNDQ4OzI7MTM5OzAwMDswMDA0ODsyOzIzMzsxNTA7MTIyNDg7MjsxNDM7MTg4OzE0MzQ4OzI7MDcyOzA2MTsxMzk0ODsyOzA0NzswNzk7MDc5NDg7MjswMDA7MjA2OzIwOTQ4OzI7MTQ4OzAwMDsyMTE0ODsyOzI1NTswMjA7MTQ3NDg7MjswMDA7MTkxOzI1NTQ4OzI7MTA1OzEwNTsxMDU0ODsyOzAzMDsxNDQ7MjU1NDg7MjsxNzg7MDM0OzAzNDQ4OzI7MjU1OzI1MDsyNDA0ODsyOzAzNDsxMzk7MDM0NDg7MjsyNTU7MDAwOzI1NTQ4OzI7MjIwOzIyMDsyMjA0ODsyOzI0ODsyNDg7MjU1NDg7MjsyNTU7MjE1OzAwMDQ4OzI7MjE4OzE2NTswMzI0ODsyOzEyODsxMjg7MTI4NDg7MjswMDA7MTI4OzAwMDQ4OzI7MTczOzI1NTswNDc0ODsyOzI0MDsyNTU7MjQwNDg7MjsyNTU7MTA1OzE4MDQ4OzI7MjA1OzA5MjswOTI0ODsyOzA3NTswMDA7MTMwNDg7MjsyNTU7MjU1OzI0MDQ4OzI7MjQwOzIzMDsxNDA0ODsyOzIzMDsyMzA7MjUwNDg7MjsyNTU7MjQwOzI0NTQ4OzI7MTI0OzI1MjswMDA0ODsyOzI1NTsyNTA7MjA1NDg7MjsxNzM7MjE2OzIzMDQ4OzI7MjQwOzEyODsxMjg0ODsyOzIyNDsyNTU7MjU1NDg7MjsyNTA7MjUwOzIxMDQ4OzI7MjExOzIxMTsyMTE0ODsyOzE0NDsyMzg7MTQ0NDg7MjsyNTU7MTgyOzE5MzQ4OzI7MjU1OzE2MDsxMjI0ODsyOzAzMjsxNzg7MTcwNDg7MjsxMzU7MjA2OzI1MDQ4OzI7MTE5OzEzNjsxNTM0ODsyOzE3NjsxOTY7MjIyNDg7MjsyNTU7MjU1OzIyNDQ4OzI7MDAwOzI1NTswMDA0ODsyOzA1MDsyMDU7MDUwNDg7MjsyNTA7MjQwOzIzMDQ4OzI7MTI4OzAwMDswMDA0ODsyOzEwMjsyMDU7MTcwNDg7MjswMDA7MDAwOzIwNTQ4OzI7MTg2OzA4NTsyMTE0ODsyOzE0NzsxMTI7MjE5NDg7MjswNjA7MTc5OzExMzQ4OzI7MTIzOzEwNDsyMzg0ODsyOzAwMDsyNTA7MTU0NDg7MjswNzI7MjA5OzIwNDQ4OzI7MTk5OzAyMTsxMzM0ODsyOzAyNTswMjU7MTEyNDg7MjsyNDU7MjU1OzI1MDQ4OzI7MjU1OzIyODsyMjU0ODsyOzI1NTsyMjg7MTgxNDg7MjsyNTU7MjIyOzE3MzQ4OzI7MDAwOzAwMDsxMjg0ODsyOzI1MzsyNDU7MjMwNDg7MjsxMjg7MTI4OzAwMDQ4OzI7MTA3OzE0MjswMzU0ODsyOzI1NTsxNjU7MDAwNDg7MjsyNTU7MDY5OzAwMDQ4OzI7MjE4OzExMjsyMTQ0ODsyOzIzODsyMzI7MTcwNDg7MjsxNTI7MjUxOzE1MjQ4OzI7MTc1OzIzODsyMzg0ODsyOzIxOTsxMTI7MTQ3NDg7MjsyNTU7MjM5OzIxMzQ4OzI7MjU1OzIxODsxODU0ODsyOzIwNTsxMzM7MDYzNDg7MjsyNTU7MTkyOzIwMzQ4OzI7MjIxOzE2MDsyMjE0ODsyOzE3NjsyMjQ7MjMwNDg7MjsxMjg7MDAwOzEyODQ4OzI7MTAyOzA1MTsxNTM0ODsyOzI1NTswMDA7MDAwNDg7MjsxODg7MTQzOzE0MzQ4OzI7MDY1OzEwNTsyMjU0ODsyOzEzOTswNjk7MDE5NDg7MjsyNTA7MTI4OzExNDQ4OzI7MjQ0OzE2NDswOTY0ODsyOzA0NjsxMzk7MDg3NDg7MjsyNTU7MjQ1OzIzODQ4OzI7MTYwOzA4MjswNDU0ODsyOzE5MjsxOTI7MTkyNDg7MjsxMzU7MjA2OzIzNTQ4OzI7MTA2OzA5MDsyMDU0ODsyOzExMjsxMjg7MTQ0NDg7MjsyNTU7MjUwOzI1MDQ4OzI7MDAwOzI1NTsxMjc0ODsyOzA3MDsxMzA7MTgwNDg7MjsyMTA7MTgwOzE0MDQ4OzI7MDAwOzEyODsxMjg0ODsyOzIxNjsxOTE7MjE2NDg7MjsyNTU7MDk5OzA3MTQ4OzI7MDY0OzIyNDsyMDg0ODsyOzIzODsxMzA7MjM4NDg7MjsyNDU7MjIyOzE3OTQ4OzI7MjU1OzI1NTsyNTU0ODsyOzI0NTsyNDU7MjQ1NDg7MjsyNTU7MjU1OzAwMDQ4OzI7MTU0OzIwNTswNTAzODs1OzAzODs1OzEzODs1OzIzODs1OzMzODs1OzQzODs1OzUzODs1OzYzODs1OzczODs1OzgzODs1OzkzODs1OzEwMzg7NTsxMTM4OzU7MTIzODs1OzEzMzg7NTsxNDM4OzU7MTUzODs1OzE2Mzg7NTsxNzM4OzU7MTgzODs1OzE5Mzg7NTsyMDM4OzU7MjEzODs1OzIyMzg7NTsyMzM4OzU7MjQzODs1OzI1Mzg7NTsyNjM4OzU7MjczODs1OzI4Mzg7NTsyOTM4OzU7MzAzODs1OzMxMzg7NTszMjM4OzU7MzMzODs1OzM0Mzg7NTszNTM4OzU7MzYzODs1OzM3Mzg7NTszODM4OzU7MzkzODs1OzQwMzg7NTs0MTM4OzU7NDIzODs1OzQzMzg7NTs0NDM4OzU7NDUzODs1OzQ2Mzg7NTs0NzM4OzU7NDgzODs1OzQ5Mzg7NTs1MDM4OzU7NTEzODs1OzUyMzg7NTs1MzM4OzU7NTQzODs1OzU1Mzg7NTs1NjM4OzU7NTczODs1OzU4Mzg7NTs1OTM4OzU7NjAzODs1OzYxMzg7NTs2MjM4OzU7NjMzODs1OzY0Mzg7NTs2NTM4OzU7NjYzODs1OzY3Mzg7NTs2ODM4OzU7NjkzODs1OzcwMzg7NTs3MTM4OzU7NzIzODs1OzczMzg7NTs3NDM4OzU7NzUzODs1Ozc2Mzg7NTs3NzM4OzU7NzgzODs1Ozc5Mzg7NTs4MDM4OzU7ODEzODs1OzgyMzg7NTs4MzM4OzU7ODQzODs1Ozg1Mzg7NTs4NjM4OzU7ODczODs1Ozg4Mzg7NTs4OTM4OzU7OTAzODs1OzkxMzg7NTs5MjM4OzU7OTMzODs1Ozk0Mzg7NTs5NTM4OzU7OTYzODs1Ozk3Mzg7NTs5ODM4OzU7OTkzODs1OzEwMDM4OzU7MTAxMzg7NTsxMDIzODs1OzEwMzM4OzU7MTA0Mzg7NTsxMDUzODs1OzEwNjM4OzU7MTA3Mzg7NTsxMDgzODs1OzEwOTM4OzU7MTEwMzg7NTsxMTEzODs1OzExMjM4OzU7MTEzMzg7NTsxMTQzODs1OzExNTM4OzU7MTE2Mzg7NTsxMTczODs1OzExODM4OzU7MTE5Mzg7NTsxMjAzODs1OzEyMTM4OzU7MTIyMzg7NTsxMjMzODs1OzEyNDM4OzU7MTI1Mzg7NTsxMjYzODs1OzEyNzM4OzU7MTI4Mzg7NTsxMjkzODs1OzEzMDM4OzU7MTMxMzg7NTsxMzIzODs1OzEzMzM4OzU7MTM0Mzg7NTsxMzUzODs1OzEzNjM4OzU7MTM3Mzg7NTsxMzgzODs1OzEzOTM4OzU7MTQwMzg7NTsxNDEzODs1OzE0MjM4OzU7MTQzMzg7NTsxNDQzODs1OzE0NTM4OzU7MTQ2Mzg7NTsxNDczODs1OzE0ODM4OzU7MTQ5Mzg7NTsxNTAzODs1OzE1MTM4OzU7MTUyMzg7NTsxNTMzODs1OzE1NDM4OzU7MTU1Mzg7NTsxNTYzODs1OzE1NzM4OzU7MTU4Mzg7NTsxNTkzODs1OzE2MDM4OzU7MTYxMzg7NTsxNjIzODs1OzE2MzM4OzU7MTY0Mzg7NTsxNjUzODs1OzE2NjM4OzU7MTY3Mzg7NTsxNjgzODs1OzE2OTM4OzU7MTcwMzg7NTsxNzEzODs1OzE3MjM4OzU7MTczMzg7NTsxNzQzODs1OzE3NTM4OzU7MTc2Mzg7NTsxNzczODs1OzE3ODM4OzU7MTc5Mzg7NTsxODAzODs1OzE4MTM4OzU7MTgyMzg7NTsxODMzODs1OzE4NDM4OzU7MTg1Mzg7NTsxODYzODs1OzE4NzM4OzU7MTg4Mzg7NTsxODkzODs1OzE5MDM4OzU7MTkxMzg7NTsxOTIzODs1OzE5MzM4OzU7MTk0Mzg7NTsxOTUzODs1OzE5NjM4OzU7MTk3Mzg7NTsxOTgzODs1OzE5OTM4OzU7MjAwMzg7NTsyMDEzODs1OzIwMjM4OzU7MjAzMzg7NTsyMDQzODs1OzIwNTM4OzU7MjA2Mzg7NTsyMDczODs1OzIwODM4OzU7MjA5Mzg7NTsyMTAzODs1OzIxMTM4OzU7MjEyMzg7NTsyMTMzODs1OzIxNDM4OzU7MjE1Mzg7NTsyMTYzODs1OzIxNzM4OzU7MjE4Mzg7NTsyMTkzODs1OzIyMDM4OzU7MjIxMzg7NTsyMjIzODs1OzIyMzM4OzU7MjI0Mzg7NTsyMjUzODs1OzIyNjM4OzU7MjI3Mzg7NTsyMjgzODs1OzIyOTM4OzU7MjMwMzg7NTsyMzEzODs1OzIzMjM4OzU7MjMzMzg7NTsyMzQzODs1OzIzNTM4OzU7MjM2Mzg7NTsyMzczODs1OzIzODM4OzU7MjM5Mzg7NTsyNDAzODs1OzI0MTM4OzU7MjQyMzg7NTsyNDMzODs1OzI0NDM4OzU7MjQ1Mzg7NTsyNDYzODs1OzI0NzM4OzU7MjQ4Mzg7NTsyNDkzODs1OzI1MDM4OzU7MjUxMzg7NTsyNTIzODs1OzI1MzM4OzU7MjU0Mzg7NTsyNTU0ODs1OzA0ODs1OzE0ODs1OzI0ODs1OzM0ODs1OzQ0ODs1OzU0ODs1OzY0ODs1Ozc0ODs1Ozg0ODs1Ozk0ODs1OzEwNDg7NTsxMTQ4OzU7MTI0ODs1OzEzNDg7NTsxNDQ4OzU7MTU0ODs1OzE2NDg7NTsxNzQ4OzU7MTg0ODs1OzE5NDg7NTsyMDQ4OzU7MjE0ODs1OzIyNDg7NTsyMzQ4OzU7MjQ0ODs1OzI1NDg7NTsyNjQ4OzU7Mjc0ODs1OzI4NDg7NTsyOTQ4OzU7MzA0ODs1OzMxNDg7NTszMjQ4OzU7MzM0ODs1OzM0NDg7NTszNTQ4OzU7MzY0ODs1OzM3NDg7NTszODQ4OzU7Mzk0ODs1OzQwNDg7NTs0MTQ4OzU7NDI0ODs1OzQzNDg7NTs0NDQ4OzU7NDU0ODs1OzQ2NDg7NTs0NzQ4OzU7NDg0ODs1OzQ5NDg7NTs1MDQ4OzU7NTE0ODs1OzUyNDg7NTs1MzQ4OzU7NTQ0ODs1OzU1NDg7NTs1NjQ4OzU7NTc0ODs1OzU4NDg7NTs1OTQ4OzU7NjA0ODs1OzYxNDg7NTs2MjQ4OzU7NjM0ODs1OzY0NDg7NTs2NTQ4OzU7NjY0ODs1OzY3NDg7NTs2ODQ4OzU7Njk0ODs1OzcwNDg7NTs3MTQ4OzU7NzI0ODs1OzczNDg7NTs3NDQ4OzU7NzU0ODs1Ozc2NDg7NTs3NzQ4OzU7Nzg0ODs1Ozc5NDg7NTs4MDQ4OzU7ODE0ODs1OzgyNDg7NTs4MzQ4OzU7ODQ0ODs1Ozg1NDg7NTs4NjQ4OzU7ODc0ODs1Ozg4NDg7NTs4OTQ4OzU7OTA0ODs1OzkxNDg7NTs5MjQ4OzU7OTM0ODs1Ozk0NDg7NTs5NTQ4OzU7OTY0ODs1Ozk3NDg7NTs5ODQ4OzU7OTk0ODs1OzEwMDQ4OzU7MTAxNDg7NTsxMDI0ODs1OzEwMzQ4OzU7MTA0NDg7NTsxMDU0ODs1OzEwNjQ4OzU7MTA3NDg7NTsxMDg0ODs1OzEwOTQ4OzU7MTEwNDg7NTsxMTE0ODs1OzExMjQ4OzU7MTEzNDg7NTsxMTQ0ODs1OzExNTQ4OzU7MTE2NDg7NTsxMTc0ODs1OzExODQ4OzU7MTE5NDg7NTsxMjA0ODs1OzEyMTQ4OzU7MTIyNDg7NTsxMjM0ODs1OzEyNDQ4OzU7MTI1NDg7NTsxMjY0ODs1OzEyNzQ4OzU7MTI4NDg7NTsxMjk0ODs1OzEzMDQ4OzU7MTMxNDg7NTsxMzI0ODs1OzEzMzQ4OzU7MTM0NDg7NTsxMzU0ODs1OzEzNjQ4OzU7MTM3NDg7NTsxMzg0ODs1OzEzOTQ4OzU7MTQwNDg7NTsxNDE0ODs1OzE0MjQ4OzU7MTQzNDg7NTsxNDQ0ODs1OzE0NTQ4OzU7MTQ2NDg7NTsxNDc0ODs1OzE0ODQ4OzU7MTQ5NDg7NTsxNTA0ODs1OzE1MTQ4OzU7MTUyNDg7NTsxNTM0ODs1OzE1NDQ4OzU7MTU1NDg7NTsxNTY0ODs1OzE1NzQ4OzU7MTU4NDg7NTsxNTk0ODs1OzE2MDQ4OzU7MTYxNDg7NTsxNjI0ODs1OzE2MzQ4OzU7MTY0NDg7NTsxNjU0ODs1OzE2NjQ4OzU7MTY3NDg7NTsxNjg0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AABo7BAAbgAAAPAIAABBAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL3V0aWwvd2lyZS5ycwAANM4QAGoAAABXAgAADgAAADTOEABqAAAAeAMAAAwAAABHcm91cEluZm9Ub29NYW55UGF0dGVybnNlcnJUb29NYW55R3JvdXBzcGF0dGVybm1pbmltdW1NaXNzaW5nR3JvdXBzRmlyc3RNdXN0QmVVbm5hbWVkRHVwbGljYXRlZXhwZWN0ZWQgbnVtYmVyIG9mIHBhdHRlcm5zIHRvIG1hdGNoIHBhdHRlcm4gSUQAAAAezxAALwAAAMj/EABwAAAANAQAAA0AAADI/xAAcAAAAFUEAAA5AAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvYWhvLWNvcmFzaWNrLTEuMS4zL3NyYy91dGlsL3NlYXJjaC5ycwAAeM8QAGoAAABOAQAACQAAAGludmFsaWQgbWF0Y2ggc3BhbgAA9M8QABIAAAB4zxAAagAAAFsDAAAJAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvYWhvLWNvcmFzaWNrLTEuMS4zL3NyYy9wYWNrZWQvYXBpLnJzAAAAINAQAGkAAAAZAgAAHAAAACDQEABpAAAAHwIAADEAAADdAwAABAAAAAQAAADeAwAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL3V0aWwvcHJlZmlsdGVyL2J5dGVzZXQucnMAvNAQAHcAAAAjAAAAEQAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy91dGlsL3ByZWZpbHRlci9tZW1jaHIucnMAAETREAB2AAAAJwAAAC0AAABE0RAAdgAAAFUAAAAWAAAARNEQAHYAAABWAAAAFgAAAETREAB2AAAAZAAAADYAAABE0RAAdgAAAJIAAAAWAAAARNEQAHYAAACTAAAAFgAAAETREAB2AAAAlAAAABYAAABE0RAAdgAAAKIAAAA+AAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL3V0aWwvcHJlZmlsdGVyL21lbW1lbS5ycwAAPNIQAHYAAAArAAAAJwAAADzSEAB2AAAAOwAAABgAAABhaG8tY29yYXNpY2sgREZBIHNob3VsZCBuZXZlciBmYWlsL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL3V0aWwvcHJlZmlsdGVyL3RlZGR5LnJzAPbSEAB1AAAAcQAAABIAQYSnwwALsgwBAAAAEwMAAAAAAAAIAAAABAAAAN8DAAAAAAAABAAAAAQAAADgAwAAAAAAAAEAAAABAAAADwAAAAAAAAAEAAAABAAAABAAAABtYXhpbXVtX2xlbmxvb2tfc2V0bG9va19zZXRfcHJlZml4bG9va19zZXRfc3VmZml4bG9va19zZXRfcHJlZml4X2FueWxvb2tfc2V0X3N1ZmZpeF9hbnl1dGY4ZXhwbGljaXRfY2FwdHVyZXNfbGVuc3RhdGljX2V4cGxpY2l0X2NhcHR1cmVzX2xlbmxpdGVyYWxhbHRlcm5hdGlvbl9saXRlcmFsAAC8ABEACwAAAMzTEAALAAAA19MQAAgAAADf0xAADwAAAO7TEAAPAAAA/dMQABMAAAAQ1BAAEwAAACPUEAAEAAAAJ9QQABUAAAA81BAAHAAAAFjUEAAHAAAAX9QQABMAAABQcm9wZXJ0aWVzSUludmFsaWRJbnB1dEFuY2hvcmVkSW52YWxpZElucHV0VW5hbmNob3JlZFVuc3VwcG9ydGVkU3RyZWFtVW5zdXBwb3J0ZWRPdmVybGFwcGluZ1Vuc3VwcG9ydGVkRW1wdHllcnJvciBidWlsZGluZyBORkEAAEDVEAASAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZm91bmQgaW1wb3NzaWJsZSBlcnJvciBpbiBtZXRhIGVuZ2luZTogAAAAXNUQAFEAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvbWV0YS9lcnJvci5ycwC41RAAawAAAO0AAAARAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL25mYS90aG9tcHNvbi9yYW5nZV90cmllLnJzNNYQAHgAAAD6AAAAKQAAADTWEAB4AAAA/AAAACsAAAA01hAAeAAAAA8BAAArAAAANNYQAHgAAABLAQAAOwAAADTWEAB4AAAAiQEAADsAAAA01hAAeAAAADEBAAANAAAAdG9vIG1hbnkgc2VxdWVuY2VzIGFkZGVkIHRvIHJhbmdlIHRyaWUAAAzXEAAmAAAANNYQAHgAAAC0AQAAEQAAADTWEAB4AAAA4AEAADcAAAA01hAAeAAAABkCAAAsAAAANNYQAHgAAAAeAgAAFQAAADTWEAB4AAAAIwIAABkAAAA01hAAeAAAAEkCAAAaAAAAYXNzZXJ0aW9uIGZhaWxlZDogbGVuID4gMAAAADTWEAB4AAAAhgIAAAkAAABhc3NlcnRpb24gZmFpbGVkOiBsZW4gPD0gNAAANNYQAHgAAACHAgAACQAAADTWEAB4AAAApwIAABUAAAA01hAAeAAAAEUDAAANAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL3V0aWwvYWxwaGFiZXQucnNFT0kAAACC2BAAAwAAAEJ5dGVDbGFzc2VzKJDYEAAMAAAAID0+IFsAAAABAAAA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AAAATUFUQ0goAABA4xAABgAAAGDQGAABAAAAAQAAAAAAAACQMRgAAQAAAKDiEAAEAAAAYXNzZXJ0aW9uIGZhaWxlZDogc3RhY2suaXNfZW1wdHkoKS9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy91dGlsL2RldGVybWluaXplL21vZC5ycwCS4xAAdQAAAHgBAAAFAAAAU21hbGxJbmRleFBhdHRlcm5JRGNhbm5vdCBjcmVhdGUgaXRlcmF0b3IgZm9yIFBhdHRlcm5JRCB3aGVuIG51bWJlciBvZiBlbGVtZW50cyBleGNlZWQgACvkEABEAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL3V0aWwvcHJpbWl0aXZlcy5yc3jkEABwAAAA8QIAAAEAAABQYXR0ZXJuSURFcnJvclN0YXRlSUQAAAB45BAAcAAAAPICAAABAAAAU3RhdGVJREVycm9yAAAAAAQAAAAEAAAA6AMAAAAAAAAIAAAABAAAAOkDAAAAAAAABAAAAAQAAADqAwAAUHJvcGVydGllcykgYXJlIG5vdCBzdXBwb3J0ZWQgb3IgZW5hYmxlZOsDAAAIAAAABAAAAOwDAADtAwAA7QMAAGFzc2VydGlvbiBmYWlsZWQ6IG0uaXNfZW1wdHkoKQAAIRgYAGoAAAClAgAACQAAACEYGABqAAAApgIAAEAAAABQYXR0ZXJuU2V0IHNob3VsZCBoYXZlIHN1ZmZpY2llbnQgY2FwYWNpdHkAADQZGABsAAAAywQAAA4AAABxdWl0IHNlYXJjaCBhZnRlciBvYnNlcnZpbmcgYnl0ZSAgYXQgb2Zmc2V0IBjmEAAhAAAAOeYQAAsAAABnYXZlIHVwIHNlYXJjaGluZyBhdCBvZmZzZXQgVOYQABwAAABoYXlzdGFjayBvZiBsZW5ndGggIGlzIHRvbyBsb25nAHjmEAATAAAAi+YQAAwAAAB1bmFuY2hvcmVkIHNlYXJjaGVzIGFyZSBu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bm8gcXVpdCBpbiBzdGFydCB3aXRob3V0IGxvb2stYmVoaW5kKPUQAGsAAABFBgAAFgAAAGFzc2VydGlvbiBmYWlsZWQ6IGlkLmlzX21hdGNoKCkAKPUQAGsAAAC1BgAACQAAAG5vIGluLXByb2dyZXNzIHNlYXJjaCB0byB1cGRhdGUAKPUQAGsAAAC3BwAAJAAAAG5vIGluLXByb2dyZXNzIHNlYXJjaCB0byBmaW5pc2gAKPUQAGsAAADDBwAAIgAAACj1EABrAAAAjgoAAB0AAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvaHlicmlkL3NlYXJjaC5ycwAAJPIQAG4AAABZAAAAKQAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IHNpZCBiZWluZyB1bmtub3duIGlzIGEgYnVnpPIQAEQAAAAk8hAAbgAAAB0BAAARAAAAJPIQAG4AAAAaAQAALQAAACTyEABuAAAAVwEAACkAAAAk8hAAbgAAAK0BAAARAAAAJPIQAG4AAACqAQAALQAAACTyEABuAAAA+wEAACUAAAAk8hAAbgAAACICAAARAAAAJPIQAG4AAAAdAgAAFQAAACTyEABuAAAA4gIAABQAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvbWV0YS9saW1pdGVkLnJzAAAAgPMQAG0AAACOAAAAJQAAAIDzEABtAAAA6AAAABQAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvbWV0YS9zdG9wYXQucnMQ9BAAbAAAAG4AAAAlAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL3V0aWwvZW1wdHkucnMAjPQQAGsAAAD5AAAAOgBBkOrDAAvlCQEAAADwAwAAAAAAAAgAAAAIAAAA8QMAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy9oeWJyaWQvZGZhLnJzACj1EABrAAAAUwgAAB8AAAAo9RAAawAAABYJAAA6AAAAYWRkaW5nIG9uZSBzdGF0ZSBhZnRlciBjYWNoZSBjbGVhciBtdXN0IHdvcmso9RAAawAAALwJAAASAAAAY2Fubm90IHNhdmUgc2VudGluZWwgc3RhdGUAAPD1EAAaAAAAKPUQAGsAAACpCQAADQAAACj1EABrAAAA5gkAAEAAAAAo9RAAawAAAOcJAABHAAAAKPUQAGsAAADoCQAARwAAACj1EABrAAAA6QkAAAkAAAAo9RAAawAAAOoJAAAJAAAAKPUQAGsAAADrCQAACQAAAHN0YXRlIHNhdmVyIGRvZXMgbm90IGhhdmUgc2F2ZWQgc3RhdGUgSUQo9RAAawAAABQKAAAOAAAAaW52YWxpZCAnZnJvbScgaWQ6IAC89hAAEwAAACj1EABrAAAAKQoAAAkAAABpbnZhbGlkICd0bycgaWQ6IAAAAOj2EAARAAAAKPUQAGsAAAAqCgAACQAAACj1EABrAAAALQoAABkAAABhc3NlcnRpb24gZmFpbGVkOiBzZWxmLmFzX3JlZigpLmlzX3ZhbGlkKGlkKSj1EABrAAAAOwoAAAkAAABhdHRlbXB0ZWQgdG8gc2VhcmNoIGZvciBhIHNwZWNpZmljIHBhdHRlcm4gd2l0aG91dCBlbmFibGluZyBzdGFydHNfZm9yX2VhY2hfcGF0dGVybgBg9xAAUwAAACj1EABrAAAAQQoAABEAAAAo9RAAawAAAEoKAAAaAAAAKPUQAGsAAACWCgAAGwAAACj1EABrAAAAsgoAADMAAAAo9RAAawAAALsKAAAzAAAAY2Fubm90IGJ1aWxkIGxhenkgREZBcyBmb3IgcmVnZXhlcyB3aXRoIFVuaWNvZGUgd29yZCBib3VuZGFyaWVzOyBzd2l0Y2ggdG8gQVNDSUkgd29yZCBib3VuZGFyaWVzLCBvciBoZXVyaXN0aWNhbGx5IGVuYWJsZSBVbmljb2RlIHdvcmQgYm91bmRhcmllcyBvciB1c2UgYSBkaWZmZXJlbnQgcmVnZXggZW5naW5lL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL21ldGEvbGl0ZXJhbC5ycwAAvfgQAG0AAAAeAAAADQAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGV4cGVjdGVkIGxpdGVyYWwsIGdvdCA8+RAAQAAAAL34EABtAAAAOAAAAB4AAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBleHBlY3RlZCBsaXRlcmFsIG9yIGNvbmNhdCwgZ290IAAAlPkQAEoAAAC9+BAAbQAAADwAAAASAEGY9MMAC7Uc4QMAAFgAAAAIAAAA8gMAANEDAAAEAAAABAAAAIEAAAAAAAAABAAAAAQAAAAQAAAAAAAAAAABAAABAAAA8wMAAAAAAAAAAQAAAQAAAL0AAAAAAAAAIAAAAAgAAADjAwAAc3RyaWRlMnN0YXJ0X21hcGNsYXNzZXNxdWl0c2V0Y2FjaGVfY2FwYWNpdHnHDhEABgAAAM0OEQADAAAAePoQAAcAAAB/+hAACQAAAIj6EAAHAAAAj/oQAAcAAACW+hAADgAAAAAAAAABAAAAAQAAAMwAAADkAwAAEAAAAAQAAAC0AAAAAAAAAAEAAAABAAAA5QMAAAAAAAAoAAAACAAAAOYDAAAAAAAACAAAAAQAAADfAwAAAAAAAAgAAAAEAAAA5wMAAAAAAAAEAAAABAAAAPQDAABzdGFydHNfZm9yX2VhY2hfcGF0dGVybmJ5dGVfY2xhc3Nlc3VuaWNvZGVfd29yZF9ib3VuZGFyeXNwZWNpYWxpemVfc3RhcnRfc3RhdGVzc2tpcF9jYWNoZV9jYXBhY2l0eV9jaGVja21pbmltdW1fY2FjaGVfY2xlYXJfY291bnRtaW5pbXVtX2J5dGVzX3Blcl9zdGF0ZbQOEQAKAAAAvg4RAAMAAABM+xAAFwAAAGP7EAAMAAAAb/sQABUAAACP+hAABwAAAIT7EAAXAAAAlvoQAA4AAACb+xAAGQAAALT7EAAZAAAAzfsQABcAAABDYWNoZUVycm9yAAAAAAAABAAAAAQAAAA7AAAATGF6eVN0YXRlSURMYXp5U3RhdGVJREVycm9yYXR0ZW1wdGVkYml0c3JlZ2V4OiB0aHJlYWQgSUQgYWxsb2NhdGlvbiBzcGFjZSBleGhhdXN0ZWQAgPwQACsAAACIKxgAagAAAF4BAAARAAAAQWhvQ29yYXNpY2s6OnRyeV9maW5kIGlzIG5vdCBleHBlY3RlZCB0byBmYWlsL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvYWhvLWNvcmFzaWNrLTEuMS4zL3NyYy9haG9jb3Jhc2ljay5ycwDx/BAAagAAAJYBAAAOAAAAAQMAAGQBAAAEAAAAAgMAAAEDAABkAQAABAAAAAEDAABkAQAABAAAAAMDAAAEAwAABQMAAOECAAAGAwAABwMAAAgDAAAJAwAACgMAAAsDAAAMAwAADQMAAA4DAAAPAwAAEAMAABEDAAASAwAAAgMAAGz9EAB8/RAAfP0QAHz9EAB8/RAA7wIAAEgBAAAEAAAA8AIAAO8CAABIAQAABAAAAO8CAABIAQAABAAAAPECAADyAgAA8wIAAOECAAD0AgAA9QIAAPYCAAD3AgAA9QMAAPkCAAD6AgAA+wIAAPwCAAD9AgAA/gIAAP8CAAAAAwAA8AIAAPD9EAAA/hAAAP4QAAD+EAAA/hAA3QIAAFwBAAAEAAAAkwAAAN0CAABcAQAABAAAAN0CAABcAQAABAAAAN4CAADfAgAA4AIAAOECAADiAgAA4wIAAOQCAADlAgAA5gIAAOcCAADoAgAA6QIAAOoCAADrAgAA7AIAAO0CAADuAgAAkwAAAHT+EACE/hAAhP4QAIT+EACE/hAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvYWhvLWNvcmFzaWNrLTEuMS4zL3NyYy9uZmEvY29udGlndW91cy5ycwAAAPj+EABtAAAAcQIAABYAAAD4/hAAbQAAAHMCAAANAAAA+P4QAG0AAAB1AgAADQAAAPj+EABtAAAAKQIAAAkAAAD4/hAAbQAAAE8CAAANAAAA+P4QAG0AAABKAgAADQAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL2Foby1jb3Jhc2ljay0xLjEuMy9zcmMvbmZhL25vbmNvbnRpZ3VvdXMucnPI/xAAcAAAACIBAAAgAAAAyP8QAHAAAAAyAQAAIQAAAMj/EABwAAAAVAEAAB0AAADI/xAAcAAAAGYBAAAXAAAA3QMAAAQAAAAEAAAA3gMAAAAAAAAEAAAABAAAACEAAABTZWFyY2hlcnBhdHRlcm5zcmFiaW5rYXJwc2VhcmNoX2tpbmRtaW5pbXVtX2xlblRlZGR5UmFiaW5LYXJwL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvYWhvLWNvcmFzaWNrLTEuMS4zL3NyYy9kZmEucnMA1QARAGIAAADhAAAAEwAAANUAEQBiAAAABQEAABoAAADVABEAYgAAAB0BAAAVAAAA1QARAGIAAAAdAQAAHQAAANUAEQBiAAAAFgEAABUAAABidWNrZXRzaGFzaF9sZW5oYXNoXzJwb3f4/hAAbQAAAMUAAAAcAAAA+P4QAG0AAADdAAAAGQAAAPj+EABtAAAA3QAAACIAAAD4/hAAbQAAAOoAAAAtAAAA+P4QAG0AAADnAAAALQAAAPj+EABtAAAA5AAAAC0AAAD4/hAAbQAAAOEAAAAtAAAA+P4QAG0AAADTAAAAIQAAAPj+EABtAAAA1AAAACkAAAD4/hAAbQAAAM4AAAApAAAA+P4QAG0AAAD1AAAAIAAAAPj+EABtAAAAGgEAABoAAAD4/hAAbQAAADABAAAXAAAA+P4QAG0AAAApAQAANwAAAMj/EABwAAAAcAIAAB4AAADI/xAAcAAAAJkCAAAaAAAAyP8QAHAAAACtAgAAKwAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy9uZmEvdGhvbXBzb24vbGl0ZXJhbF90cmllLnJzAACwAhEAegAAAHQAAAAUAAAAsAIRAHoAAACBAAAAIQAAALACEQB6AAAAjAAAACQAAACwAhEAegAAAI4AAAAcAAAAsAIRAHoAAACsAAAALAAAALACEQB6AAAArwAAAB8AAACwAhEAegAAAMAAAAAwAAAAsAIRAHoAAADnAAAALgAAALACEQB6AAAASQEAACMAAACwAhEAegAAAJgBAAAaAAAAsAIRAHoAAADHAQAAKgAAAAAAAAABAAAAAQAAAAAAAAABAAAAAQAAAJcAAADcAxEA3AMRANwDEQDcAxEA9gMAAPcDAAD4AwAA+QMAAAAAAAACAAAAAQAAAAAAAAACAAAAAQAAAJYAAAAYBBEAGAQRABgEEQAYBBEA+gMAAPsDAAD4AwAA+QMAAAAAAAADAAAAAQAAAAAAAAADAAAAAQAAAJUAAABUBBEAVAQRAFQEEQBUBBEA/AMAAP0DAAD4AwAA+QMAAM0CAABIAAAACAAAAM0CAABIAAAACAAAAJQAAACQBBEAkAQRAJAEEQCQBBEA/gMAAP8DAAAABAAAZAMAAAEEAACQAQAABAAAAAEEAACQAQAABAAAAJEAAADMBBEAzAQRAMwEEQDMBBEAAgQAAAMEAAAEBAAABQQAAAAAAAAAAQAAAQAAAAAAAAAAAQAAAQAAAI4AAAAIBREACAURAAgFEQAIBREABgQAAAcEAAD4AwAACAQAAAkEAAAMAAAABAAAAAkEAAAMAAAABAAAAIkAAABEBREARAURAEQFEQBEBREACgQAAAsEAAAMBAAAmwMAAEFob0NvcmFzaWNrYWNCeXRlU2V0AAAAAAQAAAAEAAAAEgAAAE1lbWNock1lbWNocjJNZW1jaHIzTWVtbWVtZmluZGVyc2VhcmNoZXJhbmNob3JlZF9hY1ByZWZpbHRlcmlzX2Zhc3RtYXhfbmVlZGxlX2xlbgAAAFsDAAAEAAAABAAAAFwDAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvbWV0YS93cmFwcGVycy5ycwAACAYRAG4AAACJAAAAGQAAAAgGEQBuAAAARQEAAB0AAAAIBhEAbgAAAPsBAAAdAAAACAYRAG4AAAAfAwAAHQAAAAgGEQBuAAAALAQAAA0AAAAIBhEAbgAAALQEAAAdAAAACAYRAG4AAABEBQAADQAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy9uZmEvdGhvbXBzb24vbWFwLnJzAAAA6AYRAHEAAACWAAAACQAAAOgGEQBxAAAAnwAAAB4AAADoBhEAcQAAALYAAAARAAAA6AYRAHEAAAAIAQAACQAAAOgGEQBxAAAAFAEAAB4AAADoBhEAcQAAACUBAAARAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL25mYS90aG9tcHNvbi9uZmEucnMAAAC8BxEAcQAAAHkCAAAXAAAAvAcRAHEAAACDBwAAFABB3JDEAAu9CAIAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvbmZhL3Rob21wc29uL3Bpa2V2bS5yc2AIEQB0AAAAhQQAAAoAAABieXRlIHNsaWNlIGxlbmd0aHMgbXVzdCBiZSBsZXNzIHRoYW4gdXNpemUgTUFYAADkCBEALgAAAGAIEQB0AAAA2AQAAAkAAABgCBEAdAAAAIcFAAAJAAAAYAgRAHQAAADMBQAAEwAAAGAIEQB0AAAAXAYAAB8AAABgCBEAdAAAAMwGAAAvAAAAYAgRAHQAAADPBgAARgAAAGAIEQB0AAAAzwYAACMAAABgCBEAdAAAAJwGAAA0AAAAYAgRAHQAAAAwCAAALgAAAHNsb3QgdGFibGUgbGVuZ3RoIGRvZXNuJ3Qgb3ZlcmZsb3cAAGAIEQB0AAAAPQgAAA4AAABgCBEAdAAAAGUIAAAYAAAAYAgRAHQAAABuCAAAGAAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy91dGlsL2xvb2sucnMAAAAKEQBqAAAApAMAACgAAAAAChEAagAAALADAAAmAAAAAAoRAGoAAAC9AwAAEAAAAAAKEQBqAAAAzAMAABAAAAAAChEAagAAANoDAAA4AAAAAAoRAGoAAAA3BAAAMQAAAAAKEQBqAAAAPAQAACwAAAAAChEAagAAAEwEAAA4AAAAAAoRAGoAAABbBAAAOAAAAAAKEQBqAAAAngQAADgAAAAAChEAagAAAMgEAAAxAAAAAAoRAGoAAADnBAAALAAAAAAKEQBqAAAAMgYAACgAAAAAChEAagAAAEEGAAAtAAAA////f3NwYXJzZSBzZXQgY2FwYWNpdHkgY2Fubm90IGV4Y2NlZCAAAFALEQAiAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvcmVnZXgtYXV0b21hdGEtMC40Ljcvc3JjL3V0aWwvc3BhcnNlX3NldC5yc3wLEQBwAAAAggAAAAkAAAAgZXhjZWVkcyBjYXBhY2l0eSBvZiAgd2hlbiBpbnNlcnRpbmcgAAAAAQAAAAAAAAD8CxEAFQAAABEMEQAQAAAAfAsRAHAAAACyAAAACQAAAHwLEQBwAAAAvAAAABMAAAB8CxEAcAAAAL0AAAAUAAAAfAsRAHAAAADFAAAAIAAAAHwLEQBwAAAAxgAAADQAAAB8CxEAcAAAANEAAAAhAEHMmcQAC0sBAQEBAQEBAQEBAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAQZybxAALlQovaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvdXRpbC91dGY4LnJzAACcDREAagAAAEMAAAArAAAAnA0RAGoAAABVAAAAOAAAAJwNEQBqAAAAWAAAABgAAABQaWtlVk1FbmdpbmVCb3VuZGVkQmFja3RyYWNrZXJFbmdpbmVPbmVQYXNzRW5naW5lSHlicmlkRW5naW5lREZBREZBRW5naW5lUmV2ZXJzZUh5YnJpZEVuZ2luZVJldmVyc2VERkFSZXZlcnNlREZBRW5naW5lQ29uZmlnbWF0Y2hfa2luZHByZVBpa2VWTWNvbmZpZ25mYU1hdGNoRXJyb3IAAAAAAAABAAAAAQAAAA0EAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9yZWdleC1zeW50YXgtMC44LjQvc3JjL2FzdC9wYXJzZS5yc+wOEQBoAAAAgQEAABcAAADsDhEAaAAAAIIBAAAaAAAA7A4RAGgAAACDAQAAGgAAAOwOEQBoAAAAxQEAADUAAADsDhEAaAAAAOQBAAAXAAAAZXhwZWN0ZWQgY2hhciBhdCBvZmZzZXQgpA8RABgAAADsDhEAaAAAAOcBAAAgAAAA7A4RAGgAAADzAQAAKAAAAOwOEQBoAAAA9gEAACwAAADsDhEAaAAAAPoBAAAXAAAA7A4RAGgAAAACAgAAGgAAAD89PyE/PD0/PCEAAOwOEQBoAAAARQIAACgAAADsDhEAaAAAAFMCAAAXAAAA7A4RAGgAAABhAgAAJQAAAOwOEQBoAAAAbQIAABcAAADsDhEAaAAAAIQCAABHAAAA7A4RAGgAAACGAgAAMgAAAHwAAADsDhEAaAAAAJoCAAAJAAAA7A4RAGgAAACmAgAAMwAAACgAAADsDhEAaAAAANECAAArAAAA7A4RAGgAAADAAgAACQAAACkAAADsDhEAaAAAAOwCAAAzAAAA7A4RAGgAAADrAgAACQAAAOwOEQBoAAAAHgMAADMAAADsDhEAaAAAADYDAAARAAAAWwAAAOwOEQBoAAAAUAMAAA4AAADsDhEAaAAAAEsDAAAJAAAAXQAAAOwOEQBoAAAAbAMAADMAAAB1bmV4cGVjdGVkIGVtcHR5IGNoYXJhY3RlciBjbGFzcyBzdGFjawAARBERACYAAADsDhEAaAAAAHcDAAARAAAAdW5leHBlY3RlZCBDbGFzc1N0YXRlOjpPcAAAAIQREQAZAAAA7A4RAGgAAACAAwAAEQAAAOwOEQBoAAAAaAMAAAkAAADsDhEAaAAAAJYDAAAwAAAAbm8gb3BlbiBjaGFyYWN0ZXIgY2xhc3MgZm91bmQAAADYEREAHQAAAOwOEQBoAAAAnQMAAAkAAADsDhEAaAAAAK8DAAAOAAAA7A4RAGgAAAC7AwAAMwAAAOwOEQBoAAAAwgMAABUAAADsDhEAaAAAAAQEAAAuAAAAYXNzZXJ0aW9uIGZhaWxlZDogc2VsZi5jaGFyKCkgPT0gJz8nIHx8IHNlbGYuY2hhcigpID09ICcqJyB8fCBzZWxmLmNoYXIoKSA9PSAnKyfsDhEAaAAAAB0EAAAJAAAAGQBBzKXEAAuWCWFzc2VydGlvbiBmYWlsZWQ6IHNlbGYuY2hhcigpID09ICd7J+wOEQBoAAAAUwQAAAkAAAA/UDw/PAAAADoAAADsDhEAaAAAAPoEAAARAAAA7A4RAGgAAADMBAAACQAAAD4AAADsDhEAaAAAADAFAAAjAAAA7A4RAGgAAAAuBQAACQAAAOwOEQBoAAAAXQUAADIAAADsDhEAaAAAAGsFAAAyAAAAXAAAAOwOEQBoAAAAyAUAAAkAAADsDhEAaAAAAG0GAAAxAAAAc3RhcnQtaGFsZmVuZC1oYWxmAADsDhEAaAAAAFUGAAAJAAAAYXNzZXJ0aW9uIGZhaWxlZDogc2VsZi5wYXJzZXIoKS5vY3RhbAAAAOwOEQBoAAAAkwYAAAkAAABhc3NlcnRpb24gZmFpbGVkOiAnMCcgPD0gc2VsZi5jaGFyKCkgJiYgc2VsZi5jaGFyKCkgPD0gJzcnAADsDhEAaAAAAJQGAAAJAAAA7A4RAGgAAACdBgAAJAAAAHZhbGlkIG9jdGFsIG51bWJlcgAA7A4RAGgAAAChBgAAKwAAAFVuaWNvZGUgc2NhbGFyIHZhbHVl7A4RAGgAAACkBgAAKwAAAGFzc2VydGlvbiBmYWlsZWQ6IHNlbGYuY2hhcigpID09ICd4JyB8fCBzZWxmLmNoYXIoKSA9PSAndScgfHwgc2VsZi5jaGFyKCkgPT0gJ1Un7A4RAGgAAACyBgAACQAAAOwOEQBoAAAA0wYAADEAAADsDhEAaAAAAP4GAAAxAAAAfQAAAOwOEQBoAAAAFAcAAAkAAADsDhEAaAAAADQHAAAxAAAA7A4RAGgAAABlBwAAMwAAAGFzc2VydGlvbiBmYWlsZWQ6IHNlbGYuYnVtcF9pZigiJiYiKewOEQBoAAAAdAcAABUAAABhc3NlcnRpb24gZmFpbGVkOiBzZWxmLmJ1bXBfaWYoIi0tIinsDhEAaAAAAHsHAAAVAAAAfn5hc3NlcnRpb24gZmFpbGVkOiBzZWxmLmJ1bXBfaWYoIn5+IikAAOwOEQBoAAAAggcAABUAAADsDhEAaAAAAFYHAAAJAAAA7A4RAGgAAADpBwAACQAAAOwOEQBoAAAAXQgAACMAAAA6XQAA7A4RAGgAAABECAAACQAAAOwOEQBoAAAAeggAADEAAADsDhEAaAAAAJUIAAAjAAAA7A4RAGgAAACWCAAAJAAAAOwOEQBoAAAAnggAACMAAADsDhEAaAAAAJ8IAAAkAAAA7A4RAGgAAACnCAAAIwAAAOwOEQBoAAAAqAgAACQAAADsDhEAaAAAAIwIAAANAAAAYXNzZXJ0aW9uIGZhaWxlZDogc2VsZi5jaGFyKCkgPT0gJ3AnIHx8IHNlbGYuY2hhcigpID09ICdQJwAA7A4RAGgAAAB4CAAACQAAAGV4cGVjdGVkIHZhbGlkIFBlcmwgY2xhc3MgYnV0IGdvdCAnAPgWEQAjAAAAXVgWAAEAAADsDhEAaAAAANEIAAASAAAA7A4RAGgAAAAACQAAMAAAABsDAAAMAAAABAAAAFgDAAAOBAAAWgMAQeyuxAALtgYBAAAAHwMAAOwvGABMAAAApwoAAA0AAABhc3NlcnRpb24gZmFpbGVkOiBhZGRfbG93ZXIgfHwgYWRkX3VwcGVyyd0RAGsAAADQAQAACQAAAFVuaWNvZGUgbm90IGFsbG93ZWQgaGVyZXBhdHRlcm4gY2FuIG1hdGNoIGludmFsaWQgVVRGLThpbnZhbGlkIGxpbmUgdGVybWluYXRvciwgbXVzdCBiZSBBU0NJSVVuaWNvZGUgcHJvcGVydHkgbm90IGZvdW5kVW5pY29kZSBwcm9wZXJ0eSB2YWx1ZSBub3QgZm91bmRVbmljb2RlLWF3YXJlIFBlcmwgY2xhc3Mgbm90IGZvdW5kIChtYWtlIHN1cmUgdGhlIHVuaWNvZGUtcGVybCBmZWF0dXJlIGlzIGVuYWJsZWQpVW5pY29kZS1hd2FyZSBjYXNlIGluc2Vuc2l0aXZpdHkgbWF0Y2hpbmcgaXMgbm90IGF2YWlsYWJsZSAobWFrZSBzdXJlIHRoZSB1bmljb2RlLWNhc2UgZmVhdHVyZSBpcyBlbmFibGVkKQAooxUAZgAAAPIBAAAeAAAAKKMVAGYAAABPAgAAHgAAAENsYXNzVW5pY29kZVJhbmdlc3RhcnRlbmQAAAAooxUAZgAAADoGAAA2AAAAQ2xhc3NCeXRlc1Jhbmdl4oiFAABrGREAAwAAACijFQBmAAAA9wsAABIAAAAooxUAZgAAAOgLAAAZAAAATG9va0NhcHR1cmVTdGFydEVuZFN0YXJ0TEZFbmRMRlN0YXJ0Q1JMRkVuZENSTEZXb3JkQXNjaWlXb3JkQXNjaWlOZWdhdGVXb3JkVW5pY29kZVdvcmRVbmljb2RlTmVnYXRlV29yZFN0YXJ0QXNjaWlXb3JkRW5kQXNjaWlXb3JkU3RhcnRVbmljb2RlV29yZEVuZFVuaWNvZGVXb3JkU3RhcnRIYWxmQXNjaWlXb3JkRW5kSGFsZkFzY2lpV29yZFN0YXJ0SGFsZlVuaWNvZGVXb3JkRW5kSGFsZlVuaWNvZGVpbmRleG1pbm1heGdyZWVkeRsDAAAMAAAABAAAAFgDAAAOBAAAWgMAQay1xAALwYESAQAAAB8DAAABAAAAAQAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3JlZ2V4LXN5bnRheC0wLjguNC9zcmMvaGlyL2xpdGVyYWwucnNhc3NlcnRpb24gZmFpbGVkOiBzZXExLmxlbigpLm1hcF9vcih0cnVlLCB8eHwgeCA8PSBzZWxmLmxpbWl0X3RvdGFsKQAAvBoRAGoAAAA5AgAACQAAALwaEQBqAAAAZgIAAAkAAAC8GhEAagAAAGcGAAAYAAAAvBoRAGoAAAB0BgAAEwAAALwaEQBqAAAAbQYAABoAAAC8GhEAagAAAJwGAAAYAAAAvBoRAGoAAACqBgAAEwAAALwaEQBqAAAAowYAABoAAAC8GhEAagAAAHgHAAARAAAABQAAAAoAAAAEAAAACgAAAAMAAABAAAAAAgAAAEAAAAABAAAACgAAALwaEQBqAAAAzggAABUAAAC8GhEAagAAAN4IAAAoAAAAvBoRAGoAAADyCAAAFQAAALwaEQBqAAAA4ggAAB4AAAC8GhEAagAAAOQIAAAnAAAAvBoRAGoAAADkCAAAMwAAALwaEQBqAAAA5QgAADQAAAC8GhEAagAAAOsIAAAgAAAANzQzMjEwLy4tZ/JCQ+UsKyopKCcmJSQjIiE4IB8eHRz/lKSViKCbrd3ehnroytfg0NzMu7ezsaiyyOLDmriufni/ncKqvaKhlsGOiauwuae6cK/AvJyMj3uFgJOKknLfl/nY7uz949rm94e08en29OeL9fP768nE8NaYts21fxvU09LV5MWpn4OsaVBiYGFRz5F0c5CCmXlrhG1ufG9SbHaNcYF3faV1XGpTSGNdQU+m7aPHvuHRy8bZ287q+J7v/////////////////////////////////////////////////////////////////////////////////////3RyaWVkIHRvIHVud3JhcCBleHByIGZyb20gSGlyRnJhbWUsIGdvdDogAAAApB0RACkAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9yZWdleC1zeW50YXgtMC44LjQvc3JjL2hpci90cmFuc2xhdGUucnPYHREAbAAAAAEBAAASAAAAdHJpZWQgdG8gdW53cmFwIFVuaWNvZGUgY2xhc3MgZnJvbSBIaXJGcmFtZSwgZ290OiAAAFQeEQAyAAAA2B0RAGwAAAAKAQAAEgAAAHRyaWVkIHRvIHVud3JhcCBieXRlIGNsYXNzIGZyb20gSGlyRnJhbWUsIGdvdDogAKAeEQAvAAAA2B0RAGwAAAAXAQAAEgAAAHRyaWVkIHRvIHVud3JhcCByZXBldGl0aW9uIGZyb20gSGlyRnJhbWUsIGdvdDogAOgeEQAvAAAA2B0RAGwAAAAlAQAAEQAAAHRyaWVkIHRvIHVud3JhcCBncm91cCBmcm9tIEhpckZyYW1lLCBnb3Q6IAAAMB8RACoAAADYHREAbAAAADQBAAARAAAAdHJpZWQgdG8gdW53cmFwIGFsdCBwaXBlIGZyb20gSGlyRnJhbWUsIGdvdDogAAAAdB8RAC0AAADYHREAbAAAAD8BAAARAAAA2B0RAGwAAABOAQAAJwAAANgdEQBsAAAATwEAABcAAADYHREAbAAAAE4BAAAJAAAA2B0RAGwAAACsAQAALgAAANgdEQBsAAAAowEAAC4AAADYHREAbAAAALcBAAAnAAAA2B0RAGwAAAC4AQAAHAAAANgdEQBsAAAAvAEAACcAAADYHREAbAAAAL0BAAAsAAAA2B0RAGwAAADOAQAAIAAAANgdEQBsAAAA/gEAAC4AAADYHREAbAAAAPoBAAAuAAAA2B0RAGwAAAAKAgAALgAAANgdEQBsAAAABgIAAC4AAADYHREAbAAAABkCAAAuAAAA2B0RAGwAAAAUAgAALgAAANgdEQBsAAAAIAIAACoAAADYHREAbAAAACwCAAAuAAAA2B0RAGwAAAAnAgAALgAAANgdEQBsAAAAPgIAAC8AAADYHREAbAAAAEUCAAAvAAAA2B0RAGwAAAAzAgAALwAAANgdEQBsAAAAOgIAAC8AAADYHREAbAAAAIwCAAAmAAAA2B0RAGwAAACNAgAAJgAAANgdEQBsAAAAjgIAACYAAADYHREAbAAAAHMCAAAmAAAA2B0RAGwAAAB0AgAAJgAAANgdEQBsAAAAdQIAACYAAADYHREAbAAAALgCAAAcAAAA2B0RAGwAAADDAgAALAAAANgdEQBsAAAA0QIAACwAAADYHREAbAAAANsCAAAcAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZXhwZWN0ZWQgZXhwciBvciBjb25jYXQsIGdvdCBVbmljb2RlIGNsYXNzzCERAFQAAADYHREAbAAAAOkCAAARAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZXhwZWN0ZWQgZXhwciBvciBjb25jYXQsIGdvdCBieXRlIGNsYXNzAAAAOCIRAFEAAADYHREAbAAAAOwCAAARAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZXhwZWN0ZWQgZXhwciBvciBjb25jYXQsIGdvdCByZXBldGl0aW9uAAAApCIRAFEAAADYHREAbAAAAO8CAAARAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZXhwZWN0ZWQgZXhwciBvciBjb25jYXQsIGdvdCBncm91cBAjEQBMAAAA2B0RAGwAAADyAgAAEQAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGV4cGVjdGVkIGV4cHIgb3IgY29uY2F0LCBnb3QgYWx0IG1hcmtlcgAAAHQjEQBRAAAA2B0RAGwAAAD1AgAAEQAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGV4cGVjdGVkIGV4cHIgb3IgY29uY2F0LCBnb3QgYWx0IGJyYW5jaCBtYXJrZXLgIxEAWAAAANgdEQBsAAAA+AIAABEAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBleHBlY3RlZCBleHByIG9yIGFsdCwgZ290IFVuaWNvZGUgY2xhc3MAAABQJBEAUQAAANgdEQBsAAAACAMAABEAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBleHBlY3RlZCBleHByIG9yIGFsdCwgZ290IGJ5dGUgY2xhc3MAALwkEQBOAAAA2B0RAGwAAAALAwAAEQAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGV4cGVjdGVkIGV4cHIgb3IgYWx0LCBnb3QgcmVwZXRpdGlvbgAAJCURAE4AAADYHREAbAAAAA4DAAARAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogZXhwZWN0ZWQgZXhwciBvciBhbHQsIGdvdCBncm91cAAAAIwlEQBJAAAA2B0RAGwAAAARAwAAEQAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGV4cGVjdGVkIGV4cHIgb3IgYWx0LCBnb3QgY29uY2F0IG1hcmtlcgAAAPAlEQBRAAAA2B0RAGwAAAAUAwAAEQAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGV4cGVjdGVkIGV4cHIgb3IgYWx0LCBnb3QgYWx0IGJyYW5jaCBtYXJrZXIAAABcJhEAVQAAANgdEQBsAAAAFwMAABEAAABhc3NlcnRpb24gZmFpbGVkOiBzZWxmLmZsYWdzKCkudW5pY29kZSgp2B0RAGwAAABDBAAACQAAAAVhc3NlcnRpb24gZmFpbGVkOiAhc2VsZi5mbGFncygpLnVuaWNvZGUoKQAA2B0RAGwAAABZBAAACQAAADA5QVphekFaYXoAfwkJICAAH39/MDkhfmF6IH4hLzpAW2B7fgkJCgoLCwwMDQ0gIEFaMDlBWl9fYXowOUFGYWZhAAAAYgAAAGMAAABlAAAAZgAAAGcAAABoAAAAaQAAAGoAAABrAAAAKiEAAGwAAABtAAAAbgAAAG8AAABwAAAAcQAAAHIAAABzAAAAfwEAAHQAAAB1AAAAdgAAAHcAAAB4AAAAeQAAAHoAAABBAAAAQgAAAEMAAABFAAAARgAAAEcAAABIAAAASQAAAEoAAABLAAAAKiEAAEwAAABNAAAATgAAAE8AAABQAAAAUQAAAFIAAABTAAAAfwEAAFQAAABVAAAAVgAAAFcAAABYAAAAWQAAAFoAAACcAwAAvAMAAOAAAADhAAAA4gAAAOMAAADkAAAA5QAAACshAADmAAAA5wAAAOgAAADpAAAA6gAAAOsAAADsAAAA7QAAAO4AAADvAAAA8AAAAPEAAADyAAAA8wAAAPQAAAD1AAAA9gAAAPgAAAD5AAAA+gAAAPsAAAD8AAAA/QAAAP4AAACeHgAAwAAAAMEAAADCAAAAwwAAAMQAAADFAAAAKyEAAMYAAADHAAAAyAAAAMkAAADKAAAAywAAAMwAAADNAAAAzgAAAM8AAADQAAAA0QAAANIAAADTAAAA1AAAANUAAADWAAAA2AAAANkAAADaAAAA2wAAANwAAADdAAAA3gAAAHgBAAABAQAAAAEAAAMBAAACAQAABQEAAAQBAAAHAQAABgEAAAkBAAAIAQAACwEAAAoBAAANAQAADAEAAA8BAAAOAQAAEQEAABABAAATAQAAEgEAABUBAAAUAQAAFwEAABYBAAAZAQAAGAEAABsBAAAaAQAAHQEAABwBAAAfAQAAHgEAACEBAAAgAQAAIwEAACIBAAAlAQAAJAEAACcBAAAmAQAAKQEAACgBAAArAQAAKgEAAC0BAAAsAQAALwEAAC4BAAAzAQAAMgEAADUBAAA0AQAANwEAADYBAAA6AQAAOQEAADwBAAA7AQAAPgEAAD0BAABAAQAAPwEAAEIBAABBAQAARAEAAEMBAABGAQAARQEAAEgBAABHAQAASwEAAEoBAABNAQAATAEAAE8BAABOAQAAUQEAAFABAABTAQAAUgEAAFUBAABUAQAAVwEAAFYBAABZAQAAWAEAAFsBAABaAQAAXQEAAFwBAABfAQAAXgEAAGEBAABgAQAAYwEAAGIBAABlAQAAZAEAAGcBAABmAQAAaQEAAGgBAABrAQAAagEAAG0BAABsAQAAbwEAAG4BAABxAQAAcAEAAHMBAAByAQAAdQEAAHQBAAB3AQAAdgEAAP8AAAB6AQAAeQEAAHwBAAB7AQAAfgEAAH0BAABTAAAAcwAAAEMCAABTAgAAgwEAAIIBAACFAQAAhAEAAFQCAACIAQAAhwEAAFYCAABXAgAAjAEAAIsBAADdAQAAWQIAAFsCAACSAQAAkQEAAGACAABjAgAA9gEAAGkCAABoAgAAmQEAAJgBAAA9AgAAbwIAAHICAAAgAgAAdQIAAKEBAACgAQAAowEAAKIBAAClAQAApAEAAIACAACoAQAApwEAAIMCAACtAQAArAEAAIgCAACwAQAArwEAAIoCAACLAgAAtAEAALMBAAC2AQAAtQEAAJICAAC5AQAAuAEAAL0BAAC8AQAA9wEAAMUBAADGAQAAxAEAAMYBAADEAQAAxQEAAMgBAADJAQAAxwEAAMkBAADHAQAAyAEAAMsBAADMAQAAygEAAMwBAADKAQAAywEAAM4BAADNAQAA0AEAAM8BAADSAQAA0QEAANQBAADTAQAA1gEAANUBAADYAQAA1wEAANoBAADZAQAA3AEAANsBAACOAQAA3wEAAN4BAADhAQAA4AEAAOMBAADiAQAA5QEAAOQBAADnAQAA5gEAAOkBAADoAQAA6wEAAOoBAADtAQAA7AEAAO8BAADuAQAA8gEAAPMBAADxAQAA8wEAAPEBAADyAQAA9QEAAPQBAACVAQAAvwEAAPkBAAD4AQAA+wEAAPoBAAD9AQAA/AEAAP8BAAD+AQAAAQIAAAACAAADAgAAAgIAAAUCAAAEAgAABwIAAAYCAAAJAgAACAIAAAsCAAAKAgAADQIAAAwCAAAPAgAADgIAABECAAAQAgAAEwIAABICAAAVAgAAFAIAABcCAAAWAgAAGQIAABgCAAAbAgAAGgIAAB0CAAAcAgAAHwIAAB4CAACeAQAAIwIAACICAAAlAgAAJAIAACcCAAAmAgAAKQIAACgCAAArAgAAKgIAAC0CAAAsAgAALwIAAC4CAAAxAgAAMAIAADMCAAAyAgAAZSwAADwCAAA7AgAAmgEAAGYsAAB+LAAAfywAAEICAABBAgAAgAEAAIkCAACMAgAARwIAAEYCAABJAgAASAIAAEsCAABKAgAATQIAAEwCAABPAgAATgIAAG8sAABtLAAAcCwAAIEBAACGAQAAiQEAAIoBAACPAQAAkAEAAKunAACTAQAArKcAAJQBAACNpwAAqqcAAJcBAACWAQAArqcAAGIsAACtpwAAnAEAAG4sAACdAQAAnwEAAGQsAACmAQAAxacAAKkBAACxpwAArgEAAEQCAACxAQAAsgEAAEUCAAC3AQAAsqcAALCnAACZAwAAuQMAAL4fAABxAwAAcAMAAHMDAAByAwAAdwMAAHYDAAD9AwAA/gMAAP8DAADzAwAArAMAAK0DAACuAwAArwMAAMwDAADNAwAAzgMAALEDAACyAwAA0AMAALMDAAC0AwAAtQMAAPUDAAC2AwAAtwMAALgDAADRAwAA9AMAAEUDAAC5AwAAvh8AALoDAADwAwAAuwMAALUAAAC8AwAAvQMAAL4DAAC/AwAAwAMAANYDAADBAwAA8QMAAMIDAADDAwAAxAMAAMUDAADGAwAA1QMAAMcDAADIAwAAyQMAACYhAADKAwAAywMAAIYDAACIAwAAiQMAAIoDAACRAwAAkgMAANADAACTAwAAlAMAAJUDAAD1AwAAlgMAAJcDAACYAwAA0QMAAPQDAABFAwAAmQMAAL4fAACaAwAA8AMAAJsDAAC1AAAAnAMAAJ0DAACeAwAAnwMAAKADAADWAwAAoQMAAPEDAACjAwAAwwMAAKMDAADCAwAApAMAAKUDAACmAwAA1QMAAKcDAACoAwAAqQMAACYhAACqAwAAqwMAAIwDAACOAwAAjwMAANcDAACSAwAAsgMAAJgDAAC4AwAA9AMAAKYDAADGAwAAoAMAAMADAADPAwAA2QMAANgDAADbAwAA2gMAAN0DAADcAwAA3wMAAN4DAADhAwAA4AMAAOMDAADiAwAA5QMAAOQDAADnAwAA5gMAAOkDAADoAwAA6wMAAOoDAADtAwAA7AMAAO8DAADuAwAAmgMAALoDAAChAwAAwQMAAPkDAAB/AwAAmAMAALgDAADRAwAAlQMAALUDAAD4AwAA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IB4AACMeAAAiHgAAJR4AACQeAAAnHgAAJh4AACkeAAAoHgAAKx4AACoeAAAtHgAALB4AAC8eAAAuHgAAMR4AADAeAAAzHgAAMh4AADUeAAA0HgAANx4AADYeAAA5HgAAOB4AADseAAA6HgAAPR4AADweAAA/HgAAPh4AAEEeAABAHgAAQx4AAEIeAABFHgAARB4AAEceAABGHgAASR4AAEgeAABLHgAASh4AAE0eAABMHgAATx4AAE4eAABRHgAAUB4AAFMeAABSHgAAVR4AAFQeAABXHgAAVh4AAFkeAABYHgAAWx4AAFoeAABdHgAAXB4AAF8eAABeHgAAYR4AAJseAABgHgAAmx4AAGMeAABiHgAAZR4AAGQeAABnHgAAZh4AAGkeAABoHgAAax4AAGoeAABtHgAAbB4AAG8eAABuHgAAcR4AAHAeAABzHgAAch4AAHUeAAB0HgAAdx4AAHYeAAB5HgAAeB4AAHseAAB6HgAAfR4AAHweAAB/HgAAfh4AAIEeAACAHgAAgx4AAIIeAACFHgAAhB4AAIceAACGHgAAiR4AAIgeAACLHgAAih4AAI0eAACMHgAAjx4AAI4eAACRHgAAkB4AAJMeAACSHgAAlR4AAJQeAABgHgAAYR4AAN8AAAChHgAAoB4AAKMeAACiHgAApR4AAKQeAACnHgAAph4AAKkeAACoHgAAqx4AAKoeAACtHgAArB4AAK8eAACuHgAAsR4AALAeAACzHgAAsh4AALUeAAC0HgAAtx4AALYeAAC5HgAAuB4AALseAAC6HgAAvR4AALweAAC/HgAAvh4AAMEeAADAHgAAwx4AAMIeAADFHgAAxB4AAMceAADGHgAAyR4AAMgeAADLHgAAyh4AAM0eAADMHgAAzx4AAM4eAADRHgAA0B4AANMeAADSHgAA1R4AANQeAADXHgAA1h4AANkeAADYHgAA2x4AANoeAADdHgAA3B4AAN8eAADeHgAA4R4AAOAeAADjHgAA4h4AAOUeAADkHgAA5x4AAOYeAADpHgAA6B4AAOseAADqHgAA7R4AAOweAADvHgAA7h4AAPEeAADwHgAA8x4AAPIeAAD1HgAA9B4AAPceAAD2HgAA+R4AAPgeAAD7HgAA+h4AAP0eAAD8HgAA/x4AAP4eAAAIHwAACR8AAAofAAALHwAADB8AAA0fAAAOHwAADx8AAAAfAAABHwAAAh8AAAMfAAAEHwAABR8AAAYfAAAHHwAAGB8AABkfAAAaHwAAGx8AABwfAAAdHwAAEB8AABEfAAASHwAAEx8AABQfAAAVHwAAKB8AACkfAAAqHwAAKx8AACwfAAAtHwAALh8AAC8fAAAgHwAAIR8AACIfAAAjHwAAJB8AACUfAAAmHwAAJx8AADgfAAA5HwAAOh8AADsfAAA8HwAAPR8AAD4fAAA/HwAAMB8AADEfAAAyHwAAMx8AADQfAAA1HwAANh8AADcfAABIHwAASR8AAEofAABLHwAATB8AAE0fAABAHwAAQR8AAEIfAABDHwAARB8AAEUfAABZHwAAWx8AAF0fAABfHwAAUR8AAFMfAABVHwAAVx8AAGgfAABpHwAAah8AAGsfAABsHwAAbR8AAG4fAABvHwAAYB8AAGEfAABiHwAAYx8AAGQfAABlHwAAZh8AAGcfAAC6HwAAux8AAMgfAADJHwAAyh8AAMsfAADaHwAA2x8AAPgfAAD5HwAA6h8AAOsfAAD6HwAA+x8AAIgfAACJHwAAih8AAIsfAACMHwAAjR8AAI4fAACPHwAAgB8AAIEfAACCHwAAgx8AAIQfAACFHwAAhh8AAIcfAACYHwAAmR8AAJofAACbHwAAnB8AAJ0fAACeHwAAnx8AAJAfAACRHwAAkh8AAJMfAACUHwAAlR8AAJYfAACXHwAAqB8AAKkfAACqHwAAqx8AAKwfAACtHwAArh8AAK8fAACgHwAAoR8AAKIfAACjHwAApB8AAKUfAACmHwAApx8AALgfAAC5HwAAvB8AALAfAACxHwAAcB8AAHEfAACzHwAARQMAAJkDAAC5AwAAzB8AAHIfAABzHwAAdB8AAHUfAADDHwAA2B8AANkfAADQHwAA0R8AAHYfAAB3HwAA6B8AAOkfAADsHwAA4B8AAOEfAAB6HwAAex8AAOUfAAD8HwAAeB8AAHkfAAB8HwAAfR8AAPMfAACpAwAAyQMAAEsAAABrAAAAxQAAAOUAAABOIQAAMiEAAHAhAABxIQAAciEAAHMhAAB0IQAAdSEAAHYhAAB3IQAAeCEAAHkhAAB6IQAAeyEAAHwhAAB9IQAAfiEAAH8hAABgIQAAYSEAAGIhAABjIQAAZCEAAGUhAABmIQAAZyEAAGghAABpIQAAaiEAAGshAABsIQAAbSEAAG4hAABvIQAAhCEAAIMhAADQJAAA0SQAANIkAADTJAAA1CQAANUkAADWJAAA1yQAANgkAADZJAAA2iQAANskAADcJAAA3SQAAN4kAADfJAAA4CQAAOEkAADiJAAA4yQAAOQkAADlJAAA5iQAAOckAADoJAAA6SQAALYkAAC3JAAAuCQAALkkAAC6JAAAuyQAALwkAAC9JAAAviQAAL8kAADAJAAAwSQAAMIkAADDJAAAxCQAAMUkAADGJAAAxyQAAMgkAADJJAAAyiQAAMskAADMJAAAzSQAAM4kAADPJAAAMCwAADEsAAAyLAAAMywAADQsAAA1LAAANiwAADcsAAA4LAAAOSwAADosAAA7LAAAPCwAAD0sAAA+LAAAPywAAEAsAABBLAAAQiwAAEMsAABELAAARSwAAEYsAABHLAAASCwAAEksAABKLAAASywAAEwsAABNLAAATiwAAE8sAABQLAAAUSwAAFIsAABTLAAAVCwAAFUsAABWLAAAVywAAFgsAABZLAAAWiwAAFssAABcLAAAXSwAAF4sAABfLAAAACwAAAEsAAACLAAAAywAAAQsAAAFLAAABiwAAAcsAAAILAAACSwAAAosAAALLAAADCwAAA0sAAAOLAAADywAABAsAAARLAAAEiwAABMsAAAULAAAFSwAABYsAAAXLAAAGCwAABksAAAaLAAAGywAABwsAAAdLAAAHiwAAB8sAAAgLAAAISwAACIsAAAjLAAAJCwAACUsAAAmLAAAJywAACgsAAApLAAAKiwAACssAAAsLAAALSwAAC4sAAAvLAAAYSwAAGAsAABrAgAAfR0AAH0CAAA6AgAAPgIAAGgsAABnLAAAaiwAAGksAABsLAAAaywAAFECAABxAgAAUAIAAFICAABzLAAAciwAAHYsAAB1LAAAPwIAAEACAACBLAAAgCwAAIMsAACCLAAAhSwAAIQsAACHLAAAhiwAAIksAACILAAAiywAAIosAACNLAAAjCwAAI8sAACOLAAAkSwAAJAsAACTLAAAkiwAAJUsAACULAAAlywAAJYsAACZLAAAmCwAAJssAACaLAAAnSwAAJwsAACfLAAAniwAAKEsAACgLAAAoywAAKIsAAClLAAApCwAAKcsAACmLAAAqSwAAKgsAACrLAAAqiwAAK0sAACsLAAArywAAK4sAACxLAAAsCwAALMsAACyLAAAtSwAALQsAAC3LAAAtiwAALksAAC4LAAAuywAALosAAC9LAAAvCwAAL8sAAC+LAAAwSwAAMAsAADDLAAAwiwAAMUsAADELAAAxywAAMYsAADJLAAAyCwAAMssAADKLAAAzSwAAMwsAADPLAAAziwAANEsAADQLAAA0ywAANIsAADVLAAA1CwAANcsAADWLAAA2SwAANgsAADbLAAA2iwAAN0sAADcLAAA3ywAAN4sAADhLAAA4CwAAOMsAADiLAAA7CwAAOssAADuLAAA7SwAAPMsAADyLAAAoBAAAKEQAACiEAAAoxAAAKQQAAClEAAAphAAAKcQAACoEAAAqRAAAKoQAACrEAAArBAAAK0QAACuEAAArxAAALAQAACxEAAAshAAALMQAAC0EAAAtRAAALYQAAC3EAAAuBAAALkQAAC6EAAAuxAAALwQAAC9EAAAvhAAAL8QAADAEAAAwRAAAMIQAADDEAAAxBAAAMUQAADHEAAAzRAAAEGmAABApgAAQ6YAAEKmAABFpgAARKYAAEemAABGpgAASaYAAEimAACIHAAAS6YAAIgcAABKpgAATaYAAEymAABPpgAATqYAAFGmAABQpgAAU6YAAFKmAABVpgAAVKYAAFemAABWpgAAWaYAAFimAABbpgAAWqYAAF2mAABcpgAAX6YAAF6mAABhpgAAYKYAAGOmAABipgAAZaYAAGSmAABnpgAAZqYAAGmmAABopgAAa6YAAGqmAABtpgAAbKYAAIGmAACApgAAg6YAAIKmAACFpgAAhKYAAIemAACGpgAAiaYAAIimAACLpgAAiqYAAI2mAACMpgAAj6YAAI6mAACRpgAAkKYAAJOmAACSpgAAlaYAAJSmAACXpgAAlqYAAJmmAACYpgAAm6YAAJqmAAAjpwAAIqcAACWnAAAkpwAAJ6cAACanAAAppwAAKKcAACunAAAqpwAALacAACynAAAvpwAALqcAADOnAAAypwAANacAADSnAAA3pwAANqcAADmnAAA4pwAAO6cAADqnAAA9pwAAPKcAAD+nAAA+pwAAQacAAECnAABDpwAAQqcAAEWnAABEpwAAR6cAAEanAABJpwAASKcAAEunAABKpwAATacAAEynAABPpwAATqcAAFGnAABQpwAAU6cAAFKnAABVpwAAVKcAAFenAABWpwAAWacAAFinAABbpwAAWqcAAF2nAABcpwAAX6cAAF6nAABhpwAAYKcAAGOnAABipwAAZacAAGSnAABnpwAAZqcAAGmnAABopwAAa6cAAGqnAABtpwAAbKcAAG+nAABupwAAeqcAAHmnAAB8pwAAe6cAAHkdAAB/pwAAfqcAAIGnAACApwAAg6cAAIKnAACFpwAAhKcAAIenAACGpwAAjKcAAIunAABlAgAAkacAAJCnAACTpwAAkqcAAMSnAACXpwAAlqcAAJmnAACYpwAAm6cAAJqnAACdpwAAnKcAAJ+nAACepwAAoacAAKCnAACjpwAAoqcAAKWnAACkpwAAp6cAAKanAACppwAAqKcAAGYCAABcAgAAYQIAAGwCAABqAgAAngIAAIcCAACdAgAAU6sAALWnAAC0pwAAt6cAALanAAC5pwAAuKcAALunAAC6pwAAvacAALynAAC/pwAAvqcAAMGnAADApwAAw6cAAMKnAACUpwAAggIAAI4dAADIpwAAx6cAAMqnAADJpwAA0acAANCnAADXpwAA1qcAANmnAADYpwAA9qcAAPWnAACzpwAAoBMAAKETAACiEwAAoxMAAKQTAAClEwAAphMAAKcTAACoEwAAqRMAAKoTAACrEwAArBMAAK0TAACuEwAArxMAALATAACxEwAAshMAALMTAAC0EwAAtRMAALYTAAC3EwAAuBMAALkTAAC6EwAAuxMAALwTAAC9EwAAvhMAAL8TAADAEwAAwRMAAMITAADDEwAAxBMAAMUTAADGEwAAxxMAAMgTAADJEwAAyhMAAMsTAADMEwAAzRMAAM4TAADPEwAA0BMAANETAADSEwAA0xMAANQTAADVEwAA1hMAANcTAADYEwAA2RMAANoTAADbEwAA3BMAAN0TAADeEwAA3xMAAOATAADhEwAA4hMAAOMTAADkEwAA5RMAAOYTAADnEwAA6BMAAOkTAADqEwAA6xMAAOwTAADtEwAA7hMAAO8TAABB/wAAQv8AAEP/AABE/wAARf8AAEb/AABH/wAASP8AAEn/AABK/wAAS/8AAEz/AABN/wAATv8AAE//AABQ/wAAUf8AAFL/AABT/wAAVP8AAFX/AABW/wAAV/8AAFj/AABZ/wAAWv8AACH/AAAi/wAAI/8AACT/AAAl/wAAJv8AACf/AAAo/wAAKf8AACr/AAAr/wAALP8AAC3/AAAu/wAAL/8AADD/AAAx/wAAMv8AADP/AAA0/wAANf8AADb/AAA3/wAAOP8AADn/AAA6/wAAKAQBACkEAQAqBAEAKwQBACwEAQAtBAEALgQBAC8EAQAwBAEAMQQBADIEAQAzBAEANAQBADUEAQA2BAEANwQBADgEAQA5BAEAOgQBADsEAQA8BAEAPQQBAD4EAQA/BAEAQAQBAEEEAQBCBAEAQwQBAEQEAQBFBAEARgQBAEcEAQBIBAEASQQBAEoEAQBLBAEATAQBAE0EAQBOBAEATwQBAAAEAQABBAEAAgQBAAMEAQAEBAEABQQBAAYEAQAHBAEACAQBAAkEAQAKBAEACwQBAAwEAQANBAEADgQBAA8EAQAQBAEAEQQBABIEAQATBAEAFAQBABUEAQAWBAEAFwQBABgEAQAZBAEAGgQBABsEAQAcBAEAHQQBAB4EAQAfBAEAIAQBACEEAQAiBAEAIwQBACQEAQAlBAEAJgQBACcEAQDYBAEA2QQBANoEAQDbBAEA3AQBAN0EAQDeBAEA3wQBAOAEAQDhBAEA4gQBAOMEAQDkBAEA5QQBAOYEAQDnBAEA6AQBAOkEAQDqBAEA6wQBAOwEAQDtBAEA7gQBAO8EAQDwBAEA8QQBAPIEAQDzBAEA9AQBAPUEAQD2BAEA9wQBAPgEAQD5BAEA+gQBAPsEAQCwBAEAsQQBALIEAQCzBAEAtAQBALUEAQC2BAEAtwQBALgEAQC5BAEAugQBALsEAQC8BAEAvQQBAL4EAQC/BAEAwAQBAMEEAQDCBAEAwwQBAMQEAQDFBAEAxgQBAMcEAQDIBAEAyQQBAMoEAQDLBAEAzAQBAM0EAQDOBAEAzwQBANAEAQDRBAEA0gQBANMEAQCXBQEAmAUBAJkFAQCaBQEAmwUBAJwFAQCdBQEAngUBAJ8FAQCgBQEAoQUBAKMFAQCkBQEApQUBAKYFAQCnBQEAqAUBAKkFAQCqBQEAqwUBAKwFAQCtBQEArgUBAK8FAQCwBQEAsQUBALMFAQC0BQEAtQUBALYFAQC3BQEAuAUBALkFAQC7BQEAvAUBAHAFAQBxBQEAcgUBAHMFAQB0BQEAdQUBAHYFAQB3BQEAeAUBAHkFAQB6BQEAfAUBAH0FAQB+BQEAfwUBAIAFAQCBBQEAggUBAIMFAQCEBQEAhQUBAIYFAQCHBQEAiAUBAIkFAQCKBQEAjAUBAI0FAQCOBQEAjwUBAJAFAQCRBQEAkgUBAJQFAQCVBQEAwAwBAMEMAQDCDAEAwwwBAMQMAQDFDAEAxgwBAMcMAQDIDAEAyQwBAMoMAQDLDAEAzAwBAM0MAQDODAEAzwwBANAMAQDRDAEA0gwBANMMAQDUDAEA1QwBANYMAQDXDAEA2AwBANkMAQDaDAEA2wwBANwMAQDdDAEA3gwBAN8MAQDgDAEA4QwBAOIMAQDjDAEA5AwBAOUMAQDmDAEA5wwBAOgMAQDpDAEA6gwBAOsMAQDsDAEA7QwBAO4MAQDvDAEA8AwBAPEMAQDyDAEAgAwBAIEMAQCCDAEAgwwBAIQMAQCFDAEAhgwBAIcMAQCIDAEAiQwBAIoMAQCLDAEAjAwBAI0MAQCODAEAjwwBAJAMAQCRDAEAkgwBAJMMAQCUDAEAlQwBAJYMAQCXDAEAmAwBAJkMAQCaDAEAmwwBAJwMAQCdDAEAngwBAJ8MAQCgDAEAoQwBAKIMAQCjDAEApAwBAKUMAQCmDAEApwwBAKgMAQCpDAEAqgwBAKsMAQCsDAEArQwBAK4MAQCvDAEAsAwBALEMAQCyDAEAwBgBAMEYAQDCGAEAwxgBAMQYAQDFGAEAxhgBAMcYAQDIGAEAyRgBAMoYAQDLGAEAzBgBAM0YAQDOGAEAzxgBANAYAQDRGAEA0hgBANMYAQDUGAEA1RgBANYYAQDXGAEA2BgBANkYAQDaGAEA2xgBANwYAQDdGAEA3hgBAN8YAQCgGAEAoRgBAKIYAQCjGAEApBgBAKUYAQCmGAEApxgBAKgYAQCpGAEAqhgBAKsYAQCsGAEArRgBAK4YAQCvGAEAsBgBALEYAQCyGAEAsxgBALQYAQC1GAEAthgBALcYAQC4GAEAuRgBALoYAQC7GAEAvBgBAL0YAQC+GAEAvxgBAGBuAQBhbgEAYm4BAGNuAQBkbgEAZW4BAGZuAQBnbgEAaG4BAGluAQBqbgEAa24BAGxuAQBtbgEAbm4BAG9uAQBwbgEAcW4BAHJuAQBzbgEAdG4BAHVuAQB2bgEAd24BAHhuAQB5bgEAem4BAHtuAQB8bgEAfW4BAH5uAQB/bgEAQG4BAEFuAQBCbgEAQ24BAERuAQBFbgEARm4BAEduAQBIbgEASW4BAEpuAQBLbgEATG4BAE1uAQBObgEAT24BAFBuAQBRbgEAUm4BAFNuAQBUbgEAVW4BAFZuAQBXbgEAWG4BAFluAQBabgEAW24BAFxuAQBdbgEAXm4BAF9uAQAi6QEAI+kBACTpAQAl6QEAJukBACfpAQAo6QEAKekBACrpAQAr6QEALOkBAC3pAQAu6QEAL+kBADDpAQAx6QEAMukBADPpAQA06QEANekBADbpAQA36QEAOOkBADnpAQA66QEAO+kBADzpAQA96QEAPukBAD/pAQBA6QEAQekBAELpAQBD6QEAAOkBAAHpAQAC6QEAA+kBAATpAQAF6QEABukBAAfpAQAI6QEACekBAArpAQAL6QEADOkBAA3pAQAO6QEAD+kBABDpAQAR6QEAEukBABPpAQAU6QEAFekBABbpAQAX6QEAGOkBABnpAQAa6QEAG+kBABzpAQAd6QEAHukBAB/pAQAg6QEAIekBAEEAAACAJxEAAQAAAEIAAACEJxEAAQAAAEMAAACIJxEAAQAAAEQAAAAYMBYAAQAAAEUAAACMJxEAAQAAAEYAAACQJxEAAQAAAEcAAACUJxEAAQAAAEgAAACYJxEAAQAAAEkAAACcJxEAAQAAAEoAAACgJxEAAQAAAEsAAACkJxEAAgAAAEwAAACsJxEAAQAAAE0AAACwJxEAAQAAAE4AAAC0JxEAAQAAAE8AAAC4JxEAAQAAAFAAAAC8JxEAAQAAAFEAAADAJxEAAQAAAFIAAADEJxEAAQAAAFMAAADIJxEAAgAAAFQAAADQJxEAAQAAAFUAAADUJxEAAQAAAFYAAADYJxEAAQAAAFcAAADcJxEAAQAAAFgAAADgJxEAAQAAAFkAAADkJxEAAQAAAFoAAADoJxEAAQAAAGEAAADsJxEAAQAAAGIAAADwJxEAAQAAAGMAAAD0JxEAAQAAAGQAAAAUMBYAAQAAAGUAAAD4JxEAAQAAAGYAAAD8JxEAAQAAAGcAAAAAKBEAAQAAAGgAAAAEKBEAAQAAAGkAAAAIKBEAAQAAAGoAAAAMKBEAAQAAAGsAAAAQKBEAAgAAAGwAAAAYKBEAAQAAAG0AAAAcKBEAAQAAAG4AAAAgKBEAAQAAAG8AAAAkKBEAAQAAAHAAAAAoKBEAAQAAAHEAAAAsKBEAAQAAAHIAAAAwKBEAAQAAAHMAAAA0KBEAAgAAAHQAAAA8KBEAAQAAAHUAAABAKBEAAQAAAHYAAABEKBEAAQAAAHcAAABIKBEAAQAAAHgAAABMKBEAAQAAAHkAAABQKBEAAQAAAHoAAABUKBEAAQAAALUAAABYKBEAAgAAAMAAAABgKBEAAQAAAMEAAABkKBEAAQAAAMIAAABoKBEAAQAAAMMAAABsKBEAAQAAAMQAAABwKBEAAQAAAMUAAAB0KBEAAgAAAMYAAAB8KBEAAQAAAMcAAACAKBEAAQAAAMgAAACEKBEAAQAAAMkAAACIKBEAAQAAAMoAAACMKBEAAQAAAMsAAACQKBEAAQAAAMwAAACUKBEAAQAAAM0AAACYKBEAAQAAAM4AAACcKBEAAQAAAM8AAACgKBEAAQAAANAAAACkKBEAAQAAANEAAACoKBEAAQAAANIAAACsKBEAAQAAANMAAACwKBEAAQAAANQAAAC0KBEAAQAAANUAAAC4KBEAAQAAANYAAAC8KBEAAQAAANgAAADAKBEAAQAAANkAAADEKBEAAQAAANoAAADIKBEAAQAAANsAAADMKBEAAQAAANwAAADQKBEAAQAAAN0AAADUKBEAAQAAAN4AAADYKBEAAQAAAN8AAADcKBEAAQAAAOAAAADgKBEAAQAAAOEAAADkKBEAAQAAAOIAAADoKBEAAQAAAOMAAADsKBEAAQAAAOQAAADwKBEAAQAAAOUAAAD0KBEAAgAAAOYAAAD8KBEAAQAAAOcAAAAAKREAAQAAAOgAAAAEKREAAQAAAOkAAAAIKREAAQAAAOoAAAAMKREAAQAAAOsAAAAQKREAAQAAAOwAAAAUKREAAQAAAO0AAAAYKREAAQAAAO4AAAAcKREAAQAAAO8AAAAgKREAAQAAAPAAAAAkKREAAQAAAPEAAAAoKREAAQAAAPIAAAAsKREAAQAAAPMAAAAwKREAAQAAAPQAAAA0KREAAQAAAPUAAAA4KREAAQAAAPYAAAA8KREAAQAAAPgAAABAKREAAQAAAPkAAABEKREAAQAAAPoAAABIKREAAQAAAPsAAABMKREAAQAAAPwAAABQKREAAQAAAP0AAABUKREAAQAAAP4AAABYKREAAQAAAP8AAABcKREAAQAAAAABAABgKREAAQAAAAEBAABkKREAAQAAAAIBAABoKREAAQAAAAMBAABsKREAAQAAAAQBAABwKREAAQAAAAUBAAB0KREAAQAAAAYBAAB4KREAAQAAAAcBAAB8KREAAQAAAAgBAACAKREAAQAAAAkBAACEKREAAQAAAAoBAACIKREAAQAAAAsBAACMKREAAQAAAAwBAACQKREAAQAAAA0BAACUKREAAQAAAA4BAACYKREAAQAAAA8BAACcKREAAQAAABABAACgKREAAQAAABEBAACkKREAAQAAABIBAACoKREAAQAAABMBAACsKREAAQAAABQBAACwKREAAQAAABUBAAC0KREAAQAAABYBAAC4KREAAQAAABcBAAC8KREAAQAAABgBAADAKREAAQAAABkBAADEKREAAQAAABoBAADIKREAAQAAABsBAADMKREAAQAAABwBAADQKREAAQAAAB0BAADUKREAAQAAAB4BAADYKREAAQAAAB8BAADcKREAAQAAACABAADgKREAAQAAACEBAADkKREAAQAAACIBAADoKREAAQAAACMBAADsKREAAQAAACQBAADwKREAAQAAACUBAAD0KREAAQAAACYBAAD4KREAAQAAACcBAAD8KREAAQAAACgBAAAAKhEAAQAAACkBAAAEKhEAAQAAACoBAAAIKhEAAQAAACsBAAAMKhEAAQAAACwBAAAQKhEAAQAAAC0BAAAUKhEAAQAAAC4BAAAYKhEAAQAAAC8BAAAcKhEAAQAAADIBAAAgKhEAAQAAADMBAAAkKhEAAQAAADQBAAAoKhEAAQAAADUBAAAsKhEAAQAAADYBAAAwKhEAAQAAADcBAAA0KhEAAQAAADkBAAA4KhEAAQAAADoBAAA8KhEAAQAAADsBAABAKhEAAQAAADwBAABEKhEAAQAAAD0BAABIKhEAAQAAAD4BAABMKhEAAQAAAD8BAABQKhEAAQAAAEABAABUKhEAAQAAAEEBAABYKhEAAQAAAEIBAABcKhEAAQAAAEMBAABgKhEAAQAAAEQBAABkKhEAAQAAAEUBAABoKhEAAQAAAEYBAABsKhEAAQAAAEcBAABwKhEAAQAAAEgBAAB0KhEAAQAAAEoBAAB4KhEAAQAAAEsBAAB8KhEAAQAAAEwBAACAKhEAAQAAAE0BAACEKhEAAQAAAE4BAACIKhEAAQAAAE8BAACMKhEAAQAAAFABAACQKhEAAQAAAFEBAACUKhEAAQAAAFIBAACYKhEAAQAAAFMBAACcKhEAAQAAAFQBAACgKhEAAQAAAFUBAACkKhEAAQAAAFYBAACoKhEAAQAAAFcBAACsKhEAAQAAAFgBAACwKhEAAQAAAFkBAAC0KhEAAQAAAFoBAAC4KhEAAQAAAFsBAAC8KhEAAQAAAFwBAADAKhEAAQAAAF0BAADEKhEAAQAAAF4BAADIKhEAAQAAAF8BAADMKhEAAQAAAGABAADQKhEAAQAAAGEBAADUKhEAAQAAAGIBAADYKhEAAQAAAGMBAADcKhEAAQAAAGQBAADgKhEAAQAAAGUBAADkKhEAAQAAAGYBAADoKhEAAQAAAGcBAADsKhEAAQAAAGgBAADwKhEAAQAAAGkBAAD0KhEAAQAAAGoBAAD4KhEAAQAAAGsBAAD8KhEAAQAAAGwBAAAAKxEAAQAAAG0BAAAEKxEAAQAAAG4BAAAIKxEAAQAAAG8BAAAMKxEAAQAAAHABAAAQKxEAAQAAAHEBAAAUKxEAAQAAAHIBAAAYKxEAAQAAAHMBAAAcKxEAAQAAAHQBAAAgKxEAAQAAAHUBAAAkKxEAAQAAAHYBAAAoKxEAAQAAAHcBAAAsKxEAAQAAAHgBAAAwKxEAAQAAAHkBAAA0KxEAAQAAAHoBAAA4KxEAAQAAAHsBAAA8KxEAAQAAAHwBAABAKxEAAQAAAH0BAABEKxEAAQAAAH4BAABIKxEAAQAAAH8BAABMKxEAAgAAAIABAABUKxEAAQAAAIEBAABYKxEAAQAAAIIBAABcKxEAAQAAAIMBAABgKxEAAQAAAIQBAABkKxEAAQAAAIUBAABoKxEAAQAAAIYBAABsKxEAAQAAAIcBAABwKxEAAQAAAIgBAAB0KxEAAQAAAIkBAAB4KxEAAQAAAIoBAAB8KxEAAQAAAIsBAACAKxEAAQAAAIwBAACEKxEAAQAAAI4BAACIKxEAAQAAAI8BAACMKxEAAQAAAJABAACQKxEAAQAAAJEBAACUKxEAAQAAAJIBAACYKxEAAQAAAJMBAACcKxEAAQAAAJQBAACgKxEAAQAAAJUBAACkKxEAAQAAAJYBAACoKxEAAQAAAJcBAACsKxEAAQAAAJgBAACwKxEAAQAAAJkBAAC0KxEAAQAAAJoBAAC4KxEAAQAAAJwBAAC8KxEAAQAAAJ0BAADAKxEAAQAAAJ4BAADEKxEAAQAAAJ8BAADIKxEAAQAAAKABAADMKxEAAQAAAKEBAADQKxEAAQAAAKIBAADUKxEAAQAAAKMBAADYKxEAAQAAAKQBAADcKxEAAQAAAKUBAADgKxEAAQAAAKYBAADkKxEAAQAAAKcBAADoKxEAAQAAAKgBAADsKxEAAQAAAKkBAADwKxEAAQAAAKwBAAD0KxEAAQAAAK0BAAD4KxEAAQAAAK4BAAD8KxEAAQAAAK8BAAAALBEAAQAAALABAAAELBEAAQAAALEBAAAILBEAAQAAALIBAAAMLBEAAQAAALMBAAAQLBEAAQAAALQBAAAULBEAAQAAALUBAAAYLBEAAQAAALYBAAAcLBEAAQAAALcBAAAgLBEAAQAAALgBAAAkLBEAAQAAALkBAAAoLBEAAQAAALwBAAAsLBEAAQAAAL0BAAAwLBEAAQAAAL8BAAA0LBEAAQAAAMQBAAA4LBEAAgAAAMUBAABALBEAAgAAAMYBAABILBEAAgAAAMcBAABQLBEAAgAAAMgBAABYLBEAAgAAAMkBAABgLBEAAgAAAMoBAABoLBEAAgAAAMsBAABwLBEAAgAAAMwBAAB4LBEAAgAAAM0BAACALBEAAQAAAM4BAACELBEAAQAAAM8BAACILBEAAQAAANABAACMLBEAAQAAANEBAACQLBEAAQAAANIBAACULBEAAQAAANMBAACYLBEAAQAAANQBAACcLBEAAQAAANUBAACgLBEAAQAAANYBAACkLBEAAQAAANcBAACoLBEAAQAAANgBAACsLBEAAQAAANkBAACwLBEAAQAAANoBAAC0LBEAAQAAANsBAAC4LBEAAQAAANwBAAC8LBEAAQAAAN0BAADALBEAAQAAAN4BAADELBEAAQAAAN8BAADILBEAAQAAAOABAADMLBEAAQAAAOEBAADQLBEAAQAAAOIBAADULBEAAQAAAOMBAADYLBEAAQAAAOQBAADcLBEAAQAAAOUBAADgLBEAAQAAAOYBAADkLBEAAQAAAOcBAADoLBEAAQAAAOgBAADsLBEAAQAAAOkBAADwLBEAAQAAAOoBAAD0LBEAAQAAAOsBAAD4LBEAAQAAAOwBAAD8LBEAAQAAAO0BAAAALREAAQAAAO4BAAAELREAAQAAAO8BAAAILREAAQAAAPEBAAAMLREAAgAAAPIBAAAULREAAgAAAPMBAAAcLREAAgAAAPQBAAAkLREAAQAAAPUBAAAoLREAAQAAAPYBAAAsLREAAQAAAPcBAAAwLREAAQAAAPgBAAA0LREAAQAAAPkBAAA4LREAAQAAAPoBAAA8LREAAQAAAPsBAABALREAAQAAAPwBAABELREAAQAAAP0BAABILREAAQAAAP4BAABMLREAAQAAAP8BAABQLREAAQAAAAACAABULREAAQAAAAECAABYLREAAQAAAAICAABcLREAAQAAAAMCAABgLREAAQAAAAQCAABkLREAAQAAAAUCAABoLREAAQAAAAYCAABsLREAAQAAAAcCAABwLREAAQAAAAgCAAB0LREAAQAAAAkCAAB4LREAAQAAAAoCAAB8LREAAQAAAAsCAACALREAAQAAAAwCAACELREAAQAAAA0CAACILREAAQAAAA4CAACMLREAAQAAAA8CAACQLREAAQAAABACAACULREAAQAAABECAACYLREAAQAAABICAACcLREAAQAAABMCAACgLREAAQAAABQCAACkLREAAQAAABUCAACoLREAAQAAABYCAACsLREAAQAAABcCAACwLREAAQAAABgCAAC0LREAAQAAABkCAAC4LREAAQAAABoCAAC8LREAAQAAABsCAADALREAAQAAABwCAADELREAAQAAAB0CAADILREAAQAAAB4CAADMLREAAQAAAB8CAADQLREAAQAAACACAADULREAAQAAACICAADYLREAAQAAACMCAADcLREAAQAAACQCAADgLREAAQAAACUCAADkLREAAQAAACYCAADoLREAAQAAACcCAADsLREAAQAAACgCAADwLREAAQAAACkCAAD0LREAAQAAACoCAAD4LREAAQAAACsCAAD8LREAAQAAACwCAAAALhEAAQAAAC0CAAAELhEAAQAAAC4CAAAILhEAAQAAAC8CAAAMLhEAAQAAADACAAAQLhEAAQAAADECAAAULhEAAQAAADICAAAYLhEAAQAAADMCAAAcLhEAAQAAADoCAAAgLhEAAQAAADsCAAAkLhEAAQAAADwCAAAoLhEAAQAAAD0CAAAsLhEAAQAAAD4CAAAwLhEAAQAAAD8CAAA0LhEAAQAAAEACAAA4LhEAAQAAAEECAAA8LhEAAQAAAEICAABALhEAAQAAAEMCAABELhEAAQAAAEQCAABILhEAAQAAAEUCAABMLhEAAQAAAEYCAABQLhEAAQAAAEcCAABULhEAAQAAAEgCAABYLhEAAQAAAEkCAABcLhEAAQAAAEoCAABgLhEAAQAAAEsCAABkLhEAAQAAAEwCAABoLhEAAQAAAE0CAABsLhEAAQAAAE4CAABwLhEAAQAAAE8CAAB0LhEAAQAAAFACAAB4LhEAAQAAAFECAAB8LhEAAQAAAFICAACALhEAAQAAAFMCAACELhEAAQAAAFQCAACILhEAAQAAAFYCAACMLhEAAQAAAFcCAACQLhEAAQAAAFkCAACULhEAAQAAAFsCAACYLhEAAQAAAFwCAACcLhEAAQAAAGACAACgLhEAAQAAAGECAACkLhEAAQAAAGMCAACoLhEAAQAAAGUCAACsLhEAAQAAAGYCAACwLhEAAQAAAGgCAAC0LhEAAQAAAGkCAAC4LhEAAQAAAGoCAAC8LhEAAQAAAGsCAADALhEAAQAAAGwCAADELhEAAQAAAG8CAADILhEAAQAAAHECAADMLhEAAQAAAHICAADQLhEAAQAAAHUCAADULhEAAQAAAH0CAADYLhEAAQAAAIACAADcLhEAAQAAAIICAADgLhEAAQAAAIMCAADkLhEAAQAAAIcCAADoLhEAAQAAAIgCAADsLhEAAQAAAIkCAADwLhEAAQAAAIoCAAD0LhEAAQAAAIsCAAD4LhEAAQAAAIwCAAD8LhEAAQAAAJICAAAALxEAAQAAAJ0CAAAELxEAAQAAAJ4CAAAILxEAAQAAAEUDAAAMLxEAAwAAAHADAAAYLxEAAQAAAHEDAAAcLxEAAQAAAHIDAAAgLxEAAQAAAHMDAAAkLxEAAQAAAHYDAAAoLxEAAQAAAHcDAAAsLxEAAQAAAHsDAAAwLxEAAQAAAHwDAAA0LxEAAQAAAH0DAAA4LxEAAQAAAH8DAAA8LxEAAQAAAIYDAABALxEAAQAAAIgDAABELxEAAQAAAIkDAABILxEAAQAAAIoDAABMLxEAAQAAAIwDAABQLxEAAQAAAI4DAABULxEAAQAAAI8DAABYLxEAAQAAAJEDAABcLxEAAQAAAJIDAABgLxEAAgAAAJMDAABoLxEAAQAAAJQDAABsLxEAAQAAAJUDAABwLxEAAgAAAJYDAAB4LxEAAQAAAJcDAAB8LxEAAQAAAJgDAACALxEAAwAAAJkDAACMLxEAAwAAAJoDAACYLxEAAgAAAJsDAACgLxEAAQAAAJwDAACkLxEAAgAAAJ0DAACsLxEAAQAAAJ4DAACwLxEAAQAAAJ8DAAC0LxEAAQAAAKADAAC4LxEAAgAAAKEDAADALxEAAgAAAKMDAADILxEAAgAAAKQDAADQLxEAAQAAAKUDAADULxEAAQAAAKYDAADYLxEAAgAAAKcDAADgLxEAAQAAAKgDAADkLxEAAQAAAKkDAADoLxEAAgAAAKoDAADwLxEAAQAAAKsDAAD0LxEAAQAAAKwDAAD4LxEAAQAAAK0DAAD8LxEAAQAAAK4DAAAAMBEAAQAAAK8DAAAEMBEAAQAAALEDAAAIMBEAAQAAALIDAAAMMBEAAgAAALMDAAAUMBEAAQAAALQDAAAYMBEAAQAAALUDAAAcMBEAAgAAALYDAAAkMBEAAQAAALcDAAAoMBEAAQAAALgDAAAsMBEAAwAAALkDAAA4MBEAAwAAALoDAABEMBEAAgAAALsDAABMMBEAAQAAALwDAABQMBEAAgAAAL0DAABYMBEAAQAAAL4DAABcMBEAAQAAAL8DAABgMBEAAQAAAMADAABkMBEAAgAAAMEDAABsMBEAAgAAAMIDAAB0MBEAAgAAAMMDAAB8MBEAAgAAAMQDAACEMBEAAQAAAMUDAACIMBEAAQAAAMYDAACMMBEAAgAAAMcDAACUMBEAAQAAAMgDAACYMBEAAQAAAMkDAACcMBEAAgAAAMoDAACkMBEAAQAAAMsDAACoMBEAAQAAAMwDAACsMBEAAQAAAM0DAACwMBEAAQAAAM4DAAC0MBEAAQAAAM8DAAC4MBEAAQAAANADAAC8MBEAAgAAANEDAADEMBEAAwAAANUDAADQMBEAAgAAANYDAADYMBEAAgAAANcDAADgMBEAAQAAANgDAADkMBEAAQAAANkDAADoMBEAAQAAANoDAADsMBEAAQAAANsDAADwMBEAAQAAANwDAAD0MBEAAQAAAN0DAAD4MBEAAQAAAN4DAAD8MBEAAQAAAN8DAAAAMREAAQAAAOADAAAEMREAAQAAAOEDAAAIMREAAQAAAOIDAAAMMREAAQAAAOMDAAAQMREAAQAAAOQDAAAUMREAAQAAAOUDAAAYMREAAQAAAOYDAAAcMREAAQAAAOcDAAAgMREAAQAAAOgDAAAkMREAAQAAAOkDAAAoMREAAQAAAOoDAAAsMREAAQAAAOsDAAAwMREAAQAAAOwDAAA0MREAAQAAAO0DAAA4MREAAQAAAO4DAAA8MREAAQAAAO8DAABAMREAAQAAAPADAABEMREAAgAAAPEDAABMMREAAgAAAPIDAABUMREAAQAAAPMDAABYMREAAQAAAPQDAABcMREAAwAAAPUDAABoMREAAgAAAPcDAABwMREAAQAAAPgDAAB0MREAAQAAAPkDAAB4MREAAQAAAPoDAAB8MREAAQAAAPsDAACAMREAAQAAAP0DAACEMREAAQAAAP4DAACIMREAAQAAAP8DAACMMREAAQAAAAAEAACQMREAAQAAAAEEAACUMREAAQAAAAIEAACYMREAAQAAAAMEAACcMREAAQAAAAQEAACgMREAAQAAAAUEAACkMREAAQAAAAYEAACoMREAAQAAAAcEAACsMREAAQAAAAgEAACwMREAAQAAAAkEAAC0MREAAQAAAAoEAAC4MREAAQAAAAsEAAC8MREAAQAAAAwEAADAMREAAQAAAA0EAADEMREAAQAAAA4EAADIMREAAQAAAA8EAADMMREAAQAAABAEAADQMREAAQAAABEEAADUMREAAQAAABIEAADYMREAAgAAABMEAADgMREAAQAAABQEAADkMREAAgAAABUEAADsMREAAQAAABYEAADwMREAAQAAABcEAAD0MREAAQAAABgEAAD4MREAAQAAABkEAAD8MREAAQAAABoEAAAAMhEAAQAAABsEAAAEMhEAAQAAABwEAAAIMhEAAQAAAB0EAAAMMhEAAQAAAB4EAAAQMhEAAgAAAB8EAAAYMhEAAQAAACAEAAAcMhEAAQAAACEEAAAgMhEAAgAAACIEAAAoMhEAAwAAACMEAAA0MhEAAQAAACQEAAA4MhEAAQAAACUEAAA8MhEAAQAAACYEAABAMhEAAQAAACcEAABEMhEAAQAAACgEAABIMhEAAQAAACkEAABMMhEAAQAAACoEAABQMhEAAgAAACsEAABYMhEAAQAAACwEAABcMhEAAQAAAC0EAABgMhEAAQAAAC4EAABkMhEAAQAAAC8EAABoMhEAAQAAADAEAABsMhEAAQAAADEEAABwMhEAAQAAADIEAAB0MhEAAgAAADMEAAB8MhEAAQAAADQEAACAMhEAAgAAADUEAACIMhEAAQAAADYEAACMMhEAAQAAADcEAACQMhEAAQAAADgEAACUMhEAAQAAADkEAACYMhEAAQAAADoEAACcMhEAAQAAADsEAACgMhEAAQAAADwEAACkMhEAAQAAAD0EAACoMhEAAQAAAD4EAACsMhEAAgAAAD8EAAC0MhEAAQAAAEAEAAC4MhEAAQAAAEEEAAC8MhEAAgAAAEIEAADEMhEAAwAAAEMEAADQMhEAAQAAAEQEAADUMhEAAQAAAEUEAADYMhEAAQAAAEYEAADcMhEAAQAAAEcEAADgMhEAAQAAAEgEAADkMhEAAQAAAEkEAADoMhEAAQAAAEoEAADsMhEAAgAAAEsEAAD0MhEAAQAAAEwEAAD4MhEAAQAAAE0EAAD8MhEAAQAAAE4EAAAAMxEAAQAAAE8EAAAEMxEAAQAAAFAEAAAIMxEAAQAAAFEEAAAMMxEAAQAAAFIEAAAQMxEAAQAAAFMEAAAUMxEAAQAAAFQEAAAYMxEAAQAAAFUEAAAcMxEAAQAAAFYEAAAgMxEAAQAAAFcEAAAkMxEAAQAAAFgEAAAoMxEAAQAAAFkEAAAsMxEAAQAAAFoEAAAwMxEAAQAAAFsEAAA0MxEAAQAAAFwEAAA4MxEAAQAAAF0EAAA8MxEAAQAAAF4EAABAMxEAAQAAAF8EAABEMxEAAQAAAGAEAABIMxEAAQAAAGEEAABMMxEAAQAAAGIEAABQMxEAAgAAAGMEAABYMxEAAgAAAGQEAABgMxEAAQAAAGUEAABkMxEAAQAAAGYEAABoMxEAAQAAAGcEAABsMxEAAQAAAGgEAABwMxEAAQAAAGkEAAB0MxEAAQAAAGoEAAB4MxEAAQAAAGsEAAB8MxEAAQAAAGwEAACAMxEAAQAAAG0EAACEMxEAAQAAAG4EAACIMxEAAQAAAG8EAACMMxEAAQAAAHAEAACQMxEAAQAAAHEEAACUMxEAAQAAAHIEAACYMxEAAQAAAHMEAACcMxEAAQAAAHQEAACgMxEAAQAAAHUEAACkMxEAAQAAAHYEAACoMxEAAQAAAHcEAACsMxEAAQAAAHgEAACwMxEAAQAAAHkEAAC0MxEAAQAAAHoEAAC4MxEAAQAAAHsEAAC8MxEAAQAAAHwEAADAMxEAAQAAAH0EAADEMxEAAQAAAH4EAADIMxEAAQAAAH8EAADMMxEAAQAAAIAEAADQMxEAAQAAAIEEAADUMxEAAQAAAIoEAADYMxEAAQAAAIsEAADcMxEAAQAAAIwEAADgMxEAAQAAAI0EAADkMxEAAQAAAI4EAADoMxEAAQAAAI8EAADsMxEAAQAAAJAEAADwMxEAAQAAAJEEAAD0MxEAAQAAAJIEAAD4MxEAAQAAAJMEAAD8MxEAAQAAAJQEAAAANBEAAQAAAJUEAAAENBEAAQAAAJYEAAAINBEAAQAAAJcEAAAMNBEAAQAAAJgEAAAQNBEAAQAAAJkEAAAUNBEAAQAAAJoEAAAYNBEAAQAAAJsEAAAcNBEAAQAAAJwEAAAgNBEAAQAAAJ0EAAAkNBEAAQAAAJ4EAAAoNBEAAQAAAJ8EAAAsNBEAAQAAAKAEAAAwNBEAAQAAAKEEAAA0NBEAAQAAAKIEAAA4NBEAAQAAAKMEAAA8NBEAAQAAAKQEAABANBEAAQAAAKUEAABENBEAAQAAAKYEAABINBEAAQAAAKcEAABMNBEAAQAAAKgEAABQNBEAAQAAAKkEAABUNBEAAQAAAKoEAABYNBEAAQAAAKsEAABcNBEAAQAAAKwEAABgNBEAAQAAAK0EAABkNBEAAQAAAK4EAABoNBEAAQAAAK8EAABsNBEAAQAAALAEAABwNBEAAQAAALEEAAB0NBEAAQAAALIEAAB4NBEAAQAAALMEAAB8NBEAAQAAALQEAACANBEAAQAAALUEAACENBEAAQAAALYEAACINBEAAQAAALcEAACMNBEAAQAAALgEAACQNBEAAQAAALkEAACUNBEAAQAAALoEAACYNBEAAQAAALsEAACcNBEAAQAAALwEAACgNBEAAQAAAL0EAACkNBEAAQAAAL4EAACoNBEAAQAAAL8EAACsNBEAAQAAAMAEAACwNBEAAQAAAMEEAAC0NBEAAQAAAMIEAAC4NBEAAQAAAMMEAAC8NBEAAQAAAMQEAADANBEAAQAAAMUEAADENBEAAQAAAMYEAADINBEAAQAAAMcEAADMNBEAAQAAAMgEAADQNBEAAQAAAMkEAADUNBEAAQAAAMoEAADYNBEAAQAAAMsEAADcNBEAAQAAAMwEAADgNBEAAQAAAM0EAADkNBEAAQAAAM4EAADoNBEAAQAAAM8EAADsNBEAAQAAANAEAADwNBEAAQAAANEEAAD0NBEAAQAAANIEAAD4NBEAAQAAANMEAAD8NBEAAQAAANQEAAAANREAAQAAANUEAAAENREAAQAAANYEAAAINREAAQAAANcEAAAMNREAAQAAANgEAAAQNREAAQAAANkEAAAUNREAAQAAANoEAAAYNREAAQAAANsEAAAcNREAAQAAANwEAAAgNREAAQAAAN0EAAAkNREAAQAAAN4EAAAoNREAAQAAAN8EAAAsNREAAQAAAOAEAAAwNREAAQAAAOEEAAA0NREAAQAAAOIEAAA4NREAAQAAAOMEAAA8NREAAQAAAOQEAABANREAAQAAAOUEAABENREAAQAAAOYEAABINREAAQAAAOcEAABMNREAAQAAAOgEAABQNREAAQAAAOkEAABUNREAAQAAAOoEAABYNREAAQAAAOsEAABcNREAAQAAAOwEAABgNREAAQAAAO0EAABkNREAAQAAAO4EAABoNREAAQAAAO8EAABsNREAAQAAAPAEAABwNREAAQAAAPEEAAB0NREAAQAAAPIEAAB4NREAAQAAAPMEAAB8NREAAQAAAPQEAACANREAAQAAAPUEAACENREAAQAAAPYEAACINREAAQAAAPcEAACMNREAAQAAAPgEAACQNREAAQAAAPkEAACUNREAAQAAAPoEAACYNREAAQAAAPsEAACcNREAAQAAAPwEAACgNREAAQAAAP0EAACkNREAAQAAAP4EAACoNREAAQAAAP8EAACsNREAAQAAAAAFAACwNREAAQAAAAEFAAC0NREAAQAAAAIFAAC4NREAAQAAAAMFAAC8NREAAQAAAAQFAADANREAAQAAAAUFAADENREAAQAAAAYFAADINREAAQAAAAcFAADMNREAAQAAAAgFAADQNREAAQAAAAkFAADUNREAAQAAAAoFAADYNREAAQAAAAsFAADcNREAAQAAAAwFAADgNREAAQAAAA0FAADkNREAAQAAAA4FAADoNREAAQAAAA8FAADsNREAAQAAABAFAADwNREAAQAAABEFAAD0NREAAQAAABIFAAD4NREAAQAAABMFAAD8NREAAQAAABQFAAAANhEAAQAAABUFAAAENhEAAQAAABYFAAAINhEAAQAAABcFAAAMNhEAAQAAABgFAAAQNhEAAQAAABkFAAAUNhEAAQAAABoFAAAYNhEAAQAAABsFAAAcNhEAAQAAABwFAAAgNhEAAQAAAB0FAAAkNhEAAQAAAB4FAAAoNhEAAQAAAB8FAAAsNhEAAQAAACAFAAAwNhEAAQAAACEFAAA0NhEAAQAAACIFAAA4NhEAAQAAACMFAAA8NhEAAQAAACQFAABANhEAAQAAACUFAABENhEAAQAAACYFAABINhEAAQAAACcFAABMNhEAAQAAACgFAABQNhEAAQAAACkFAABUNhEAAQAAACoFAABYNhEAAQAAACsFAABcNhEAAQAAACwFAABgNhEAAQAAAC0FAABkNhEAAQAAAC4FAABoNhEAAQAAAC8FAABsNhEAAQAAADEFAABwNhEAAQAAADIFAAB0NhEAAQAAADMFAAB4NhEAAQAAADQFAAB8NhEAAQAAADUFAACANhEAAQAAADYFAACENhEAAQAAADcFAACINhEAAQAAADgFAACMNhEAAQAAADkFAACQNhEAAQAAADoFAACUNhEAAQAAADsFAACYNhEAAQAAADwFAACcNhEAAQAAAD0FAACgNhEAAQAAAD4FAACkNhEAAQAAAD8FAACoNhEAAQAAAEAFAACsNhEAAQAAAEEFAACwNhEAAQAAAEIFAAC0NhEAAQAAAEMFAAC4NhEAAQAAAEQFAAC8NhEAAQAAAEUFAADANhEAAQAAAEYFAADENhEAAQAAAEcFAADINhEAAQAAAEgFAADMNhEAAQAAAEkFAADQNhEAAQAAAEoFAADUNhEAAQAAAEsFAADYNhEAAQAAAEwFAADcNhEAAQAAAE0FAADgNhEAAQAAAE4FAADkNhEAAQAAAE8FAADoNhEAAQAAAFAFAADsNhEAAQAAAFEFAADwNhEAAQAAAFIFAAD0NhEAAQAAAFMFAAD4NhEAAQAAAFQFAAD8NhEAAQAAAFUFAAAANxEAAQAAAFYFAAAENxEAAQAAAGEFAAAINxEAAQAAAGIFAAAMNxEAAQAAAGMFAAAQNxEAAQAAAGQFAAAUNxEAAQAAAGUFAAAYNxEAAQAAAGYFAAAcNxEAAQAAAGcFAAAgNxEAAQAAAGgFAAAkNxEAAQAAAGkFAAAoNxEAAQAAAGoFAAAsNxEAAQAAAGsFAAAwNxEAAQAAAGwFAAA0NxEAAQAAAG0FAAA4NxEAAQAAAG4FAAA8NxEAAQAAAG8FAABANxEAAQAAAHAFAABENxEAAQAAAHEFAABINxEAAQAAAHIFAABMNxEAAQAAAHMFAABQNxEAAQAAAHQFAABUNxEAAQAAAHUFAABYNxEAAQAAAHYFAABcNxEAAQAAAHcFAABgNxEAAQAAAHgFAABkNxEAAQAAAHkFAABoNxEAAQAAAHoFAABsNxEAAQAAAHsFAABwNxEAAQAAAHwFAAB0NxEAAQAAAH0FAAB4NxEAAQAAAH4FAAB8NxEAAQAAAH8FAACANxEAAQAAAIAFAACENxEAAQAAAIEFAACINxEAAQAAAIIFAACMNxEAAQAAAIMFAACQNxEAAQAAAIQFAACUNxEAAQAAAIUFAACYNxEAAQAAAIYFAACcNxEAAQAAAKAQAACgNxEAAQAAAKEQAACkNxEAAQAAAKIQAACoNxEAAQAAAKMQAACsNxEAAQAAAKQQAACwNxEAAQAAAKUQAAC0NxEAAQAAAKYQAAC4NxEAAQAAAKcQAAC8NxEAAQAAAKgQAADANxEAAQAAAKkQAADENxEAAQAAAKoQAADINxEAAQAAAKsQAADMNxEAAQAAAKwQAADQNxEAAQAAAK0QAADUNxEAAQAAAK4QAADYNxEAAQAAAK8QAADcNxEAAQAAALAQAADgNxEAAQAAALEQAADkNxEAAQAAALIQAADoNxEAAQAAALMQAADsNxEAAQAAALQQAADwNxEAAQAAALUQAAD0NxEAAQAAALYQAAD4NxEAAQAAALcQAAD8NxEAAQAAALgQAAAAOBEAAQAAALkQAAAEOBEAAQAAALoQAAAIOBEAAQAAALsQAAAMOBEAAQAAALwQAAAQOBEAAQAAAL0QAAAUOBEAAQAAAL4QAAAYOBEAAQAAAL8QAAAcOBEAAQAAAMAQAAAgOBEAAQAAAMEQAAAkOBEAAQAAAMIQAAAoOBEAAQAAAMMQAAAsOBEAAQAAAMQQAAAwOBEAAQAAAMUQAAA0OBEAAQAAAMcQAAA4OBEAAQAAAM0QAAA8OBEAAQAAANAQAABAOBEAAQAAANEQAABEOBEAAQAAANIQAABIOBEAAQAAANMQAABMOBEAAQAAANQQAABQOBEAAQAAANUQAABUOBEAAQAAANYQAABYOBEAAQAAANcQAABcOBEAAQAAANgQAABgOBEAAQAAANkQAABkOBEAAQAAANoQAABoOBEAAQAAANsQAABsOBEAAQAAANwQAABwOBEAAQAAAN0QAAB0OBEAAQAAAN4QAAB4OBEAAQAAAN8QAAB8OBEAAQAAAOAQAACAOBEAAQAAAOEQAACEOBEAAQAAAOIQAACIOBEAAQAAAOMQAACMOBEAAQAAAOQQAACQOBEAAQAAAOUQAACUOBEAAQAAAOYQAACYOBEAAQAAAOcQAACcOBEAAQAAAOgQAACgOBEAAQAAAOkQAACkOBEAAQAAAOoQAACoOBEAAQAAAOsQAACsOBEAAQAAAOwQAACwOBEAAQAAAO0QAAC0OBEAAQAAAO4QAAC4OBEAAQAAAO8QAAC8OBEAAQAAAPAQAADAOBEAAQAAAPEQAADEOBEAAQAAAPIQAADIOBEAAQAAAPMQAADMOBEAAQAAAPQQAADQOBEAAQAAAPUQAADUOBEAAQAAAPYQAADYOBEAAQAAAPcQAADcOBEAAQAAAPgQAADgOBEAAQAAAPkQAADkOBEAAQAAAPoQAADoOBEAAQAAAP0QAADsOBEAAQAAAP4QAADwOBEAAQAAAP8QAAD0OBEAAQAAAKATAAD4OBEAAQAAAKETAAD8OBEAAQAAAKITAAAAOREAAQAAAKMTAAAEOREAAQAAAKQTAAAIOREAAQAAAKUTAAAMOREAAQAAAKYTAAAQOREAAQAAAKcTAAAUOREAAQAAAKgTAAAYOREAAQAAAKkTAAAcOREAAQAAAKoTAAAgOREAAQAAAKsTAAAkOREAAQAAAKwTAAAoOREAAQAAAK0TAAAsOREAAQAAAK4TAAAwOREAAQAAAK8TAAA0OREAAQAAALATAAA4OREAAQAAALETAAA8OREAAQAAALITAABAOREAAQAAALMTAABEOREAAQAAALQTAABIOREAAQAAALUTAABMOREAAQAAALYTAABQOREAAQAAALcTAABUOREAAQAAALgTAABYOREAAQAAALkTAABcOREAAQAAALoTAABgOREAAQAAALsTAABkOREAAQAAALwTAABoOREAAQAAAL0TAABsOREAAQAAAL4TAABwOREAAQAAAL8TAAB0OREAAQAAAMATAAB4OREAAQAAAMETAAB8OREAAQAAAMITAACAOREAAQAAAMMTAACEOREAAQAAAMQTAACIOREAAQAAAMUTAACMOREAAQAAAMYTAACQOREAAQAAAMcTAACUOREAAQAAAMgTAACYOREAAQAAAMkTAACcOREAAQAAAMoTAACgOREAAQAAAMsTAACkOREAAQAAAMwTAACoOREAAQAAAM0TAACsOREAAQAAAM4TAACwOREAAQAAAM8TAAC0OREAAQAAANATAAC4OREAAQAAANETAAC8OREAAQAAANITAADAOREAAQAAANMTAADEOREAAQAAANQTAADIOREAAQAAANUTAADMOREAAQAAANYTAADQOREAAQAAANcTAADUOREAAQAAANgTAADYOREAAQAAANkTAADcOREAAQAAANoTAADgOREAAQAAANsTAADkOREAAQAAANwTAADoOREAAQAAAN0TAADsOREAAQAAAN4TAADwOREAAQAAAN8TAAD0OREAAQAAAOATAAD4OREAAQAAAOETAAD8OREAAQAAAOITAAAAOhEAAQAAAOMTAAAEOhEAAQAAAOQTAAAIOhEAAQAAAOUTAAAMOhEAAQAAAOYTAAAQOhEAAQAAAOcTAAAUOhEAAQAAAOgTAAAYOhEAAQAAAOkTAAAcOhEAAQAAAOoTAAAgOhEAAQAAAOsTAAAkOhEAAQAAAOwTAAAoOhEAAQAAAO0TAAAsOhEAAQAAAO4TAAAwOhEAAQAAAO8TAAA0OhEAAQAAAPATAAA4OhEAAQAAAPETAAA8OhEAAQAAAPITAABAOhEAAQAAAPMTAABEOhEAAQAAAPQTAABIOhEAAQAAAPUTAABMOhEAAQAAAPgTAABQOhEAAQAAAPkTAABUOhEAAQAAAPoTAABYOhEAAQAAAPsTAABcOhEAAQAAAPwTAABgOhEAAQAAAP0TAABkOhEAAQAAAIAcAABoOhEAAgAAAIEcAABwOhEAAgAAAIIcAAB4OhEAAgAAAIMcAACAOhEAAgAAAIQcAACIOhEAAwAAAIUcAACUOhEAAwAAAIYcAACgOhEAAgAAAIccAACoOhEAAgAAAIgcAACwOhEAAgAAAJAcAAC4OhEAAQAAAJEcAAC8OhEAAQAAAJIcAADAOhEAAQAAAJMcAADEOhEAAQAAAJQcAADIOhEAAQAAAJUcAADMOhEAAQAAAJYcAADQOhEAAQAAAJccAADUOhEAAQAAAJgcAADYOhEAAQAAAJkcAADcOhEAAQAAAJocAADgOhEAAQAAAJscAADkOhEAAQAAAJwcAADoOhEAAQAAAJ0cAADsOhEAAQAAAJ4cAADwOhEAAQAAAJ8cAAD0OhEAAQAAAKAcAAD4OhEAAQAAAKEcAAD8OhEAAQAAAKIcAAAAOxEAAQAAAKMcAAAEOxEAAQAAAKQcAAAIOxEAAQAAAKUcAAAMOxEAAQAAAKYcAAAQOxEAAQAAAKccAAAUOxEAAQAAAKgcAAAYOxEAAQAAAKkcAAAcOxEAAQAAAKocAAAgOxEAAQAAAKscAAAkOxEAAQAAAKwcAAAoOxEAAQAAAK0cAAAsOxEAAQAAAK4cAAAwOxEAAQAAAK8cAAA0OxEAAQAAALAcAAA4OxEAAQAAALEcAAA8OxEAAQAAALIcAABAOxEAAQAAALMcAABEOxEAAQAAALQcAABIOxEAAQAAALUcAABMOxEAAQAAALYcAABQOxEAAQAAALccAABUOxEAAQAAALgcAABYOxEAAQAAALkcAABcOxEAAQAAALocAABgOxEAAQAAAL0cAABkOxEAAQAAAL4cAABoOxEAAQAAAL8cAABsOxEAAQAAAHkdAABwOxEAAQAAAH0dAAB0OxEAAQAAAI4dAAB4OxEAAQAAAAAeAAB8OxEAAQAAAAEeAACAOxEAAQAAAAIeAACEOxEAAQAAAAMeAACIOxEAAQAAAAQeAACMOxEAAQAAAAUeAACQOxEAAQAAAAYeAACUOxEAAQAAAAceAACYOxEAAQAAAAgeAACcOxEAAQAAAAkeAACgOxEAAQAAAAoeAACkOxEAAQAAAAseAACoOxEAAQAAAAweAACsOxEAAQAAAA0eAACwOxEAAQAAAA4eAAC0OxEAAQAAAA8eAAC4OxEAAQAAABAeAAC8OxEAAQAAABEeAADAOxEAAQAAABIeAADEOxEAAQAAABMeAADIOxEAAQAAABQeAADMOxEAAQAAABUeAADQOxEAAQAAABYeAADUOxEAAQAAABceAADYOxEAAQAAABgeAADcOxEAAQAAABkeAADgOxEAAQAAABoeAADkOxEAAQAAABseAADoOxEAAQAAABweAADsOxEAAQAAAB0eAADwOxEAAQAAAB4eAAD0OxEAAQAAAB8eAAD4OxEAAQAAACAeAAD8OxEAAQAAACEeAAAAPBEAAQAAACIeAAAEPBEAAQAAACMeAAAIPBEAAQAAACQeAAAMPBEAAQAAACUeAAAQPBEAAQAAACYeAAAUPBEAAQAAACceAAAYPBEAAQAAACgeAAAcPBEAAQAAACkeAAAgPBEAAQAAACoeAAAkPBEAAQAAACseAAAoPBEAAQAAACweAAAsPBEAAQAAAC0eAAAwPBEAAQAAAC4eAAA0PBEAAQAAAC8eAAA4PBEAAQAAADAeAAA8PBEAAQAAADEeAABAPBEAAQAAADIeAABEPBEAAQAAADMeAABIPBEAAQAAADQeAABMPBEAAQAAADUeAABQPBEAAQAAADYeAABUPBEAAQAAADceAABYPBEAAQAAADgeAABcPBEAAQAAADkeAABgPBEAAQAAADoeAABkPBEAAQAAADseAABoPBEAAQAAADweAABsPBEAAQAAAD0eAABwPBEAAQAAAD4eAAB0PBEAAQAAAD8eAAB4PBEAAQAAAEAeAAB8PBEAAQAAAEEeAACAPBEAAQAAAEIeAACEPBEAAQAAAEMeAACIPBEAAQAAAEQeAACMPBEAAQAAAEUeAACQPBEAAQAAAEYeAACUPBEAAQAAAEceAACYPBEAAQAAAEgeAACcPBEAAQAAAEkeAACgPBEAAQAAAEoeAACkPBEAAQAAAEseAACoPBEAAQAAAEweAACsPBEAAQAAAE0eAACwPBEAAQAAAE4eAAC0PBEAAQAAAE8eAAC4PBEAAQAAAFAeAAC8PBEAAQAAAFEeAADAPBEAAQAAAFIeAADEPBEAAQAAAFMeAADIPBEAAQAAAFQeAADMPBEAAQAAAFUeAADQPBEAAQAAAFYeAADUPBEAAQAAAFceAADYPBEAAQAAAFgeAADcPBEAAQAAAFkeAADgPBEAAQAAAFoeAADkPBEAAQAAAFseAADoPBEAAQAAAFweAADsPBEAAQAAAF0eAADwPBEAAQAAAF4eAAD0PBEAAQAAAF8eAAD4PBEAAQAAAGAeAAD8PBEAAgAAAGEeAAAEPREAAgAAAGIeAAAMPREAAQAAAGMeAAAQPREAAQAAAGQeAAAUPREAAQAAAGUeAAAYPREAAQAAAGYeAAAcPREAAQAAAGceAAAgPREAAQAAAGgeAAAkPREAAQAAAGkeAAAoPREAAQAAAGoeAAAsPREAAQAAAGseAAAwPREAAQAAAGweAAA0PREAAQAAAG0eAAA4PREAAQAAAG4eAAA8PREAAQAAAG8eAABAPREAAQAAAHAeAABEPREAAQAAAHEeAABIPREAAQAAAHIeAABMPREAAQAAAHMeAABQPREAAQAAAHQeAABUPREAAQAAAHUeAABYPREAAQAAAHYeAABcPREAAQAAAHceAABgPREAAQAAAHgeAABkPREAAQAAAHkeAABoPREAAQAAAHoeAABsPREAAQAAAHseAABwPREAAQAAAHweAAB0PREAAQAAAH0eAAB4PREAAQAAAH4eAAB8PREAAQAAAH8eAACAPREAAQAAAIAeAACEPREAAQAAAIEeAACIPREAAQAAAIIeAACMPREAAQAAAIMeAACQPREAAQAAAIQeAACUPREAAQAAAIUeAACYPREAAQAAAIYeAACcPREAAQAAAIceAACgPREAAQAAAIgeAACkPREAAQAAAIkeAACoPREAAQAAAIoeAACsPREAAQAAAIseAACwPREAAQAAAIweAAC0PREAAQAAAI0eAAC4PREAAQAAAI4eAAC8PREAAQAAAI8eAADAPREAAQAAAJAeAADEPREAAQAAAJEeAADIPREAAQAAAJIeAADMPREAAQAAAJMeAADQPREAAQAAAJQeAADUPREAAQAAAJUeAADYPREAAQAAAJseAADcPREAAgAAAJ4eAADkPREAAQAAAKAeAADoPREAAQAAAKEeAADsPREAAQAAAKIeAADwPREAAQAAAKMeAAD0PREAAQAAAKQeAAD4PREAAQAAAKUeAAD8PREAAQAAAKYeAAAAPhEAAQAAAKceAAAEPhEAAQAAAKgeAAAIPhEAAQAAAKkeAAAMPhEAAQAAAKoeAAAQPhEAAQAAAKseAAAUPhEAAQAAAKweAAAYPhEAAQAAAK0eAAAcPhEAAQAAAK4eAAAgPhEAAQAAAK8eAAAkPhEAAQAAALAeAAAoPhEAAQAAALEeAAAsPhEAAQAAALIeAAAwPhEAAQAAALMeAAA0PhEAAQAAALQeAAA4PhEAAQAAALUeAAA8PhEAAQAAALYeAABAPhEAAQAAALceAABEPhEAAQAAALgeAABIPhEAAQAAALkeAABMPhEAAQAAALoeAABQPhEAAQAAALseAABUPhEAAQAAALweAABYPhEAAQAAAL0eAABcPhEAAQAAAL4eAABgPhEAAQAAAL8eAABkPhEAAQAAAMAeAABoPhEAAQAAAMEeAABsPhEAAQAAAMIeAABwPhEAAQAAAMMeAAB0PhEAAQAAAMQeAAB4PhEAAQAAAMUeAAB8PhEAAQAAAMYeAACAPhEAAQAAAMceAACEPhEAAQAAAMgeAACIPhEAAQAAAMkeAACMPhEAAQAAAMoeAACQPhEAAQAAAMseAACUPhEAAQAAAMweAACYPhEAAQAAAM0eAACcPhEAAQAAAM4eAACgPhEAAQAAAM8eAACkPhEAAQAAANAeAACoPhEAAQAAANEeAACsPhEAAQAAANIeAACwPhEAAQAAANMeAAC0PhEAAQAAANQeAAC4PhEAAQAAANUeAAC8PhEAAQAAANYeAADAPhEAAQAAANceAADEPhEAAQAAANgeAADIPhEAAQAAANkeAADMPhEAAQAAANoeAADQPhEAAQAAANseAADUPhEAAQAAANweAADYPhEAAQAAAN0eAADcPhEAAQAAAN4eAADgPhEAAQAAAN8eAADkPhEAAQAAAOAeAADoPhEAAQAAAOEeAADsPhEAAQAAAOIeAADwPhEAAQAAAOMeAAD0PhEAAQAAAOQeAAD4PhEAAQAAAOUeAAD8PhEAAQAAAOYeAAAAPxEAAQAAAOceAAAEPxEAAQAAAOgeAAAIPxEAAQAAAOkeAAAMPxEAAQAAAOoeAAAQPxEAAQAAAOseAAAUPxEAAQAAAOweAAAYPxEAAQAAAO0eAAAcPxEAAQAAAO4eAAAgPxEAAQAAAO8eAAAkPxEAAQAAAPAeAAAoPxEAAQAAAPEeAAAsPxEAAQAAAPIeAAAwPxEAAQAAAPMeAAA0PxEAAQAAAPQeAAA4PxEAAQAAAPUeAAA8PxEAAQAAAPYeAABAPxEAAQAAAPceAABEPxEAAQAAAPgeAABIPxEAAQAAAPkeAABMPxEAAQAAAPoeAABQPxEAAQAAAPseAABUPxEAAQAAAPweAABYPxEAAQAAAP0eAABcPxEAAQAAAP4eAABgPxEAAQAAAP8eAABkPxEAAQAAAAAfAABoPxEAAQAAAAEfAABsPxEAAQAAAAIfAABwPxEAAQAAAAMfAAB0PxEAAQAAAAQfAAB4PxEAAQAAAAUfAAB8PxEAAQAAAAYfAACAPxEAAQAAAAcfAACEPxEAAQAAAAgfAACIPxEAAQAAAAkfAACMPxEAAQAAAAofAACQPxEAAQAAAAsfAACUPxEAAQAAAAwfAACYPxEAAQAAAA0fAACcPxEAAQAAAA4fAACgPxEAAQAAAA8fAACkPxEAAQAAABAfAACoPxEAAQAAABEfAACsPxEAAQAAABIfAACwPxEAAQAAABMfAAC0PxEAAQAAABQfAAC4PxEAAQAAABUfAAC8PxEAAQAAABgfAADAPxEAAQAAABkfAADEPxEAAQAAABofAADIPxEAAQAAABsfAADMPxEAAQAAABwfAADQPxEAAQAAAB0fAADUPxEAAQAAACAfAADYPxEAAQAAACEfAADcPxEAAQAAACIfAADgPxEAAQAAACMfAADkPxEAAQAAACQfAADoPxEAAQAAACUfAADsPxEAAQAAACYfAADwPxEAAQAAACcfAAD0PxEAAQAAACgfAAD4PxEAAQAAACkfAAD8PxEAAQAAACofAAAAQBEAAQAAACsfAAAEQBEAAQAAACwfAAAIQBEAAQAAAC0fAAAMQBEAAQAAAC4fAAAQQBEAAQAAAC8fAAAUQBEAAQAAADAfAAAYQBEAAQAAADEfAAAcQBEAAQAAADIfAAAgQBEAAQAAADMfAAAkQBEAAQAAADQfAAAoQBEAAQAAADUfAAAsQBEAAQAAADYfAAAwQBEAAQAAADcfAAA0QBEAAQAAADgfAAA4QBEAAQAAADkfAAA8QBEAAQAAADofAABAQBEAAQAAADsfAABEQBEAAQAAADwfAABIQBEAAQAAAD0fAABMQBEAAQAAAD4fAABQQBEAAQAAAD8fAABUQBEAAQAAAEAfAABYQBEAAQAAAEEfAABcQBEAAQAAAEIfAABgQBEAAQAAAEMfAABkQBEAAQAAAEQfAABoQBEAAQAAAEUfAABsQBEAAQAAAEgfAABwQBEAAQAAAEkfAAB0QBEAAQAAAEofAAB4QBEAAQAAAEsfAAB8QBEAAQAAAEwfAACAQBEAAQAAAE0fAACEQBEAAQAAAFEfAACIQBEAAQAAAFMfAACMQBEAAQAAAFUfAACQQBEAAQAAAFcfAACUQBEAAQAAAFkfAACYQBEAAQAAAFsfAACcQBEAAQAAAF0fAACgQBEAAQAAAF8fAACkQBEAAQAAAGAfAACoQBEAAQAAAGEfAACsQBEAAQAAAGIfAACwQBEAAQAAAGMfAAC0QBEAAQAAAGQfAAC4QBEAAQAAAGUfAAC8QBEAAQAAAGYfAADAQBEAAQAAAGcfAADEQBEAAQAAAGgfAADIQBEAAQAAAGkfAADMQBEAAQAAAGofAADQQBEAAQAAAGsfAADUQBEAAQAAAGwfAADYQBEAAQAAAG0fAADcQBEAAQAAAG4fAADgQBEAAQAAAG8fAADkQBEAAQAAAHAfAADoQBEAAQAAAHEfAADsQBEAAQAAAHIfAADwQBEAAQAAAHMfAAD0QBEAAQAAAHQfAAD4QBEAAQAAAHUfAAD8QBEAAQAAAHYfAAAAQREAAQAAAHcfAAAEQREAAQAAAHgfAAAIQREAAQAAAHkfAAAMQREAAQAAAHofAAAQQREAAQAAAHsfAAAUQREAAQAAAHwfAAAYQREAAQAAAH0fAAAcQREAAQAAAIAfAAAgQREAAQAAAIEfAAAkQREAAQAAAIIfAAAoQREAAQAAAIMfAAAsQREAAQAAAIQfAAAwQREAAQAAAIUfAAA0QREAAQAAAIYfAAA4QREAAQAAAIcfAAA8QREAAQAAAIgfAABAQREAAQAAAIkfAABEQREAAQAAAIofAABIQREAAQAAAIsfAABMQREAAQAAAIwfAABQQREAAQAAAI0fAABUQREAAQAAAI4fAABYQREAAQAAAI8fAABcQREAAQAAAJAfAABgQREAAQAAAJEfAABkQREAAQAAAJIfAABoQREAAQAAAJMfAABsQREAAQAAAJQfAABwQREAAQAAAJUfAAB0QREAAQAAAJYfAAB4QREAAQAAAJcfAAB8QREAAQAAAJgfAACAQREAAQAAAJkfAACEQREAAQAAAJofAACIQREAAQAAAJsfAACMQREAAQAAAJwfAACQQREAAQAAAJ0fAACUQREAAQAAAJ4fAACYQREAAQAAAJ8fAACcQREAAQAAAKAfAACgQREAAQAAAKEfAACkQREAAQAAAKIfAACoQREAAQAAAKMfAACsQREAAQAAAKQfAACwQREAAQAAAKUfAAC0QREAAQAAAKYfAAC4QREAAQAAAKcfAAC8QREAAQAAAKgfAADAQREAAQAAAKkfAADEQREAAQAAAKofAADIQREAAQAAAKsfAADMQREAAQAAAKwfAADQQREAAQAAAK0fAADUQREAAQAAAK4fAADYQREAAQAAAK8fAADcQREAAQAAALAfAADgQREAAQAAALEfAADkQREAAQAAALMfAADoQREAAQAAALgfAADsQREAAQAAALkfAADwQREAAQAAALofAAD0QREAAQAAALsfAAD4QREAAQAAALwfAAD8QREAAQAAAL4fAAAAQhEAAwAAAMMfAAAMQhEAAQAAAMgfAAAQQhEAAQAAAMkfAAAUQhEAAQAAAMofAAAYQhEAAQAAAMsfAAAcQhEAAQAAAMwfAAAgQhEAAQAAANAfAAAkQhEAAQAAANEfAAAoQhEAAQAAANgfAAAsQhEAAQAAANkfAAAwQhEAAQAAANofAAA0QhEAAQAAANsfAAA4QhEAAQAAAOAfAAA8QhEAAQAAAOEfAABAQhEAAQAAAOUfAABEQhEAAQAAAOgfAABIQhEAAQAAAOkfAABMQhEAAQAAAOofAABQQhEAAQAAAOsfAABUQhEAAQAAAOwfAABYQhEAAQAAAPMfAABcQhEAAQAAAPgfAABgQhEAAQAAAPkfAABkQhEAAQAAAPofAABoQhEAAQAAAPsfAABsQhEAAQAAAPwfAABwQhEAAQAAACYhAAB0QhEAAgAAACohAAB8QhEAAgAAACshAACEQhEAAgAAADIhAACMQhEAAQAAAE4hAACQQhEAAQAAAGAhAACUQhEAAQAAAGEhAACYQhEAAQAAAGIhAACcQhEAAQAAAGMhAACgQhEAAQAAAGQhAACkQhEAAQAAAGUhAACoQhEAAQAAAGYhAACsQhEAAQAAAGchAACwQhEAAQAAAGghAAC0QhEAAQAAAGkhAAC4QhEAAQAAAGohAAC8QhEAAQAAAGshAADAQhEAAQAAAGwhAADEQhEAAQAAAG0hAADIQhEAAQAAAG4hAADMQhEAAQAAAG8hAADQQhEAAQAAAHAhAADUQhEAAQAAAHEhAADYQhEAAQAAAHIhAADcQhEAAQAAAHMhAADgQhEAAQAAAHQhAADkQhEAAQAAAHUhAADoQhEAAQAAAHYhAADsQhEAAQAAAHchAADwQhEAAQAAAHghAAD0QhEAAQAAAHkhAAD4QhEAAQAAAHohAAD8QhEAAQAAAHshAAAAQxEAAQAAAHwhAAAEQxEAAQAAAH0hAAAIQxEAAQAAAH4hAAAMQxEAAQAAAH8hAAAQQxEAAQAAAIMhAAAUQxEAAQAAAIQhAAAYQxEAAQAAALYkAAAcQxEAAQAAALckAAAgQxEAAQAAALgkAAAkQxEAAQAAALkkAAAoQxEAAQAAALokAAAsQxEAAQAAALskAAAwQxEAAQAAALwkAAA0QxEAAQAAAL0kAAA4QxEAAQAAAL4kAAA8QxEAAQAAAL8kAABAQxEAAQAAAMAkAABEQxEAAQAAAMEkAABIQxEAAQAAAMIkAABMQxEAAQAAAMMkAABQQxEAAQAAAMQkAABUQxEAAQAAAMUkAABYQxEAAQAAAMYkAABcQxEAAQAAAMckAABgQxEAAQAAAMgkAABkQxEAAQAAAMkkAABoQxEAAQAAAMokAABsQxEAAQAAAMskAABwQxEAAQAAAMwkAAB0QxEAAQAAAM0kAAB4QxEAAQAAAM4kAAB8QxEAAQAAAM8kAACAQxEAAQAAANAkAACEQxEAAQAAANEkAACIQxEAAQAAANIkAACMQxEAAQAAANMkAACQQxEAAQAAANQkAACUQxEAAQAAANUkAACYQxEAAQAAANYkAACcQxEAAQAAANckAACgQxEAAQAAANgkAACkQxEAAQAAANkkAACoQxEAAQAAANokAACsQxEAAQAAANskAACwQxEAAQAAANwkAAC0QxEAAQAAAN0kAAC4QxEAAQAAAN4kAAC8QxEAAQAAAN8kAADAQxEAAQAAAOAkAADEQxEAAQAAAOEkAADIQxEAAQAAAOIkAADMQxEAAQAAAOMkAADQQxEAAQAAAOQkAADUQxEAAQAAAOUkAADYQxEAAQAAAOYkAADcQxEAAQAAAOckAADgQxEAAQAAAOgkAADkQxEAAQAAAOkkAADoQxEAAQAAAAAsAADsQxEAAQAAAAEsAADwQxEAAQAAAAIsAAD0QxEAAQAAAAMsAAD4QxEAAQAAAAQsAAD8QxEAAQAAAAUsAAAARBEAAQAAAAYsAAAERBEAAQAAAAcsAAAIRBEAAQAAAAgsAAAMRBEAAQAAAAksAAAQRBEAAQAAAAosAAAURBEAAQAAAAssAAAYRBEAAQAAAAwsAAAcRBEAAQAAAA0sAAAgRBEAAQAAAA4sAAAkRBEAAQAAAA8sAAAoRBEAAQAAABAsAAAsRBEAAQAAABEsAAAwRBEAAQAAABIsAAA0RBEAAQAAABMsAAA4RBEAAQAAABQsAAA8RBEAAQAAABUsAABARBEAAQAAABYsAABERBEAAQAAABcsAABIRBEAAQAAABgsAABMRBEAAQAAABksAABQRBEAAQAAABosAABURBEAAQAAABssAABYRBEAAQAAABwsAABcRBEAAQAAAB0sAABgRBEAAQAAAB4sAABkRBEAAQAAAB8sAABoRBEAAQAAACAsAABsRBEAAQAAACEsAABwRBEAAQAAACIsAAB0RBEAAQAAACMsAAB4RBEAAQAAACQsAAB8RBEAAQAAACUsAACARBEAAQAAACYsAACERBEAAQAAACcsAACIRBEAAQAAACgsAACMRBEAAQAAACksAACQRBEAAQAAACosAACURBEAAQAAACssAACYRBEAAQAAACwsAACcRBEAAQAAAC0sAACgRBEAAQAAAC4sAACkRBEAAQAAAC8sAACoRBEAAQAAADAsAACsRBEAAQAAADEsAACwRBEAAQAAADIsAAC0RBEAAQAAADMsAAC4RBEAAQAAADQsAAC8RBEAAQAAADUsAADARBEAAQAAADYsAADERBEAAQAAADcsAADIRBEAAQAAADgsAADMRBEAAQAAADksAADQRBEAAQAAADosAADURBEAAQAAADssAADYRBEAAQAAADwsAADcRBEAAQAAAD0sAADgRBEAAQAAAD4sAADkRBEAAQAAAD8sAADoRBEAAQAAAEAsAADsRBEAAQAAAEEsAADwRBEAAQAAAEIsAAD0RBEAAQAAAEMsAAD4RBEAAQAAAEQsAAD8RBEAAQAAAEUsAAAARREAAQAAAEYsAAAERREAAQAAAEcsAAAIRREAAQAAAEgsAAAMRREAAQAAAEksAAAQRREAAQAAAEosAAAURREAAQAAAEssAAAYRREAAQAAAEwsAAAcRREAAQAAAE0sAAAgRREAAQAAAE4sAAAkRREAAQAAAE8sAAAoRREAAQAAAFAsAAAsRREAAQAAAFEsAAAwRREAAQAAAFIsAAA0RREAAQAAAFMsAAA4RREAAQAAAFQsAAA8RREAAQAAAFUsAABARREAAQAAAFYsAABERREAAQAAAFcsAABIRREAAQAAAFgsAABMRREAAQAAAFksAABQRREAAQAAAFosAABURREAAQAAAFssAABYRREAAQAAAFwsAABcRREAAQAAAF0sAABgRREAAQAAAF4sAABkRREAAQAAAF8sAABoRREAAQAAAGAsAABsRREAAQAAAGEsAABwRREAAQAAAGIsAAB0RREAAQAAAGMsAAB4RREAAQAAAGQsAAB8RREAAQAAAGUsAACARREAAQAAAGYsAACERREAAQAAAGcsAACIRREAAQAAAGgsAACMRREAAQAAAGksAACQRREAAQAAAGosAACURREAAQAAAGssAACYRREAAQAAAGwsAACcRREAAQAAAG0sAACgRREAAQAAAG4sAACkRREAAQAAAG8sAACoRREAAQAAAHAsAACsRREAAQAAAHIsAACwRREAAQAAAHMsAAC0RREAAQAAAHUsAAC4RREAAQAAAHYsAAC8RREAAQAAAH4sAADARREAAQAAAH8sAADERREAAQAAAIAsAADIRREAAQAAAIEsAADMRREAAQAAAIIsAADQRREAAQAAAIMsAADURREAAQAAAIQsAADYRREAAQAAAIUsAADcRREAAQAAAIYsAADgRREAAQAAAIcsAADkRREAAQAAAIgsAADoRREAAQAAAIksAADsRREAAQAAAIosAADwRREAAQAAAIssAAD0RREAAQAAAIwsAAD4RREAAQAAAI0sAAD8RREAAQAAAI4sAAAARhEAAQAAAI8sAAAERhEAAQAAAJAsAAAIRhEAAQAAAJEsAAAMRhEAAQAAAJIsAAAQRhEAAQAAAJMsAAAURhEAAQAAAJQsAAAYRhEAAQAAAJUsAAAcRhEAAQAAAJYsAAAgRhEAAQAAAJcsAAAkRhEAAQAAAJgsAAAoRhEAAQAAAJksAAAsRhEAAQAAAJosAAAwRhEAAQAAAJssAAA0RhEAAQAAAJwsAAA4RhEAAQAAAJ0sAAA8RhEAAQAAAJ4sAABARhEAAQAAAJ8sAABERhEAAQAAAKAsAABIRhEAAQAAAKEsAABMRhEAAQAAAKIsAABQRhEAAQAAAKMsAABURhEAAQAAAKQsAABYRhEAAQAAAKUsAABcRhEAAQAAAKYsAABgRhEAAQAAAKcsAABkRhEAAQAAAKgsAABoRhEAAQAAAKksAABsRhEAAQAAAKosAABwRhEAAQAAAKssAAB0RhEAAQAAAKwsAAB4RhEAAQAAAK0sAAB8RhEAAQAAAK4sAACARhEAAQAAAK8sAACERhEAAQAAALAsAACIRhEAAQAAALEsAACMRhEAAQAAALIsAACQRhEAAQAAALMsAACURhEAAQAAALQsAACYRhEAAQAAALUsAACcRhEAAQAAALYsAACgRhEAAQAAALcsAACkRhEAAQAAALgsAACoRhEAAQAAALksAACsRhEAAQAAALosAACwRhEAAQAAALssAAC0RhEAAQAAALwsAAC4RhEAAQAAAL0sAAC8RhEAAQAAAL4sAADARhEAAQAAAL8sAADERhEAAQAAAMAsAADIRhEAAQAAAMEsAADMRhEAAQAAAMIsAADQRhEAAQAAAMMsAADURhEAAQAAAMQsAADYRhEAAQAAAMUsAADcRhEAAQAAAMYsAADgRhEAAQAAAMcsAADkRhEAAQAAAMgsAADoRhEAAQAAAMksAADsRhEAAQAAAMosAADwRhEAAQAAAMssAAD0RhEAAQAAAMwsAAD4RhEAAQAAAM0sAAD8RhEAAQAAAM4sAAAARxEAAQAAAM8sAAAERxEAAQAAANAsAAAIRxEAAQAAANEsAAAMRxEAAQAAANIsAAAQRxEAAQAAANMsAAAURxEAAQAAANQsAAAYRxEAAQAAANUsAAAcRxEAAQAAANYsAAAgRxEAAQAAANcsAAAkRxEAAQAAANgsAAAoRxEAAQAAANksAAAsRxEAAQAAANosAAAwRxEAAQAAANssAAA0RxEAAQAAANwsAAA4RxEAAQAAAN0sAAA8RxEAAQAAAN4sAABARxEAAQAAAN8sAABERxEAAQAAAOAsAABIRxEAAQAAAOEsAABMRxEAAQAAAOIsAABQRxEAAQAAAOMsAABURxEAAQAAAOssAABYRxEAAQAAAOwsAABcRxEAAQAAAO0sAABgRxEAAQAAAO4sAABkRxEAAQAAAPIsAABoRxEAAQAAAPMsAABsRxEAAQAAAAAtAABwRxEAAQAAAAEtAAB0RxEAAQAAAAItAAB4RxEAAQAAAAMtAAB8RxEAAQAAAAQtAACARxEAAQAAAAUtAACERxEAAQAAAAYtAACIRxEAAQAAAActAACMRxEAAQAAAAgtAACQRxEAAQAAAAktAACURxEAAQAAAAotAACYRxEAAQAAAAstAACcRxEAAQAAAAwtAACgRxEAAQAAAA0tAACkRxEAAQAAAA4tAACoRxEAAQAAAA8tAACsRxEAAQAAABAtAACwRxEAAQAAABEtAAC0RxEAAQAAABItAAC4RxEAAQAAABMtAAC8RxEAAQAAABQtAADARxEAAQAAABUtAADERxEAAQAAABYtAADIRxEAAQAAABctAADMRxEAAQAAABgtAADQRxEAAQAAABktAADURxEAAQAAABotAADYRxEAAQAAABstAADcRxEAAQAAABwtAADgRxEAAQAAAB0tAADkRxEAAQAAAB4tAADoRxEAAQAAAB8tAADsRxEAAQAAACAtAADwRxEAAQAAACEtAAD0RxEAAQAAACItAAD4RxEAAQAAACMtAAD8RxEAAQAAACQtAAAASBEAAQAAACUtAAAESBEAAQAAACctAAAISBEAAQAAAC0tAAAMSBEAAQAAAECmAAAQSBEAAQAAAEGmAAAUSBEAAQAAAEKmAAAYSBEAAQAAAEOmAAAcSBEAAQAAAESmAAAgSBEAAQAAAEWmAAAkSBEAAQAAAEamAAAoSBEAAQAAAEemAAAsSBEAAQAAAEimAAAwSBEAAQAAAEmmAAA0SBEAAQAAAEqmAAA4SBEAAgAAAEumAABASBEAAgAAAEymAABISBEAAQAAAE2mAABMSBEAAQAAAE6mAABQSBEAAQAAAE+mAABUSBEAAQAAAFCmAABYSBEAAQAAAFGmAABcSBEAAQAAAFKmAABgSBEAAQAAAFOmAABkSBEAAQAAAFSmAABoSBEAAQAAAFWmAABsSBEAAQAAAFamAABwSBEAAQAAAFemAAB0SBEAAQAAAFimAAB4SBEAAQAAAFmmAAB8SBEAAQAAAFqmAACASBEAAQAAAFumAACESBEAAQAAAFymAACISBEAAQAAAF2mAACMSBEAAQAAAF6mAACQSBEAAQAAAF+mAACUSBEAAQAAAGCmAACYSBEAAQAAAGGmAACcSBEAAQAAAGKmAACgSBEAAQAAAGOmAACkSBEAAQAAAGSmAACoSBEAAQAAAGWmAACsSBEAAQAAAGamAACwSBEAAQAAAGemAAC0SBEAAQAAAGimAAC4SBEAAQAAAGmmAAC8SBEAAQAAAGqmAADASBEAAQAAAGumAADESBEAAQAAAGymAADISBEAAQAAAG2mAADMSBEAAQAAAICmAADQSBEAAQAAAIGmAADUSBEAAQAAAIKmAADYSBEAAQAAAIOmAADcSBEAAQAAAISmAADgSBEAAQAAAIWmAADkSBEAAQAAAIamAADoSBEAAQAAAIemAADsSBEAAQAAAIimAADwSBEAAQAAAImmAAD0SBEAAQAAAIqmAAD4SBEAAQAAAIumAAD8SBEAAQAAAIymAAAASREAAQAAAI2mAAAESREAAQAAAI6mAAAISREAAQAAAI+mAAAMSREAAQAAAJCmAAAQSREAAQAAAJGmAAAUSREAAQAAAJKmAAAYSREAAQAAAJOmAAAcSREAAQAAAJSmAAAgSREAAQAAAJWmAAAkSREAAQAAAJamAAAoSREAAQAAAJemAAAsSREAAQAAAJimAAAwSREAAQAAAJmmAAA0SREAAQAAAJqmAAA4SREAAQAAAJumAAA8SREAAQAAACKnAABASREAAQAAACOnAABESREAAQAAACSnAABISREAAQAAACWnAABMSREAAQAAACanAABQSREAAQAAACenAABUSREAAQAAACinAABYSREAAQAAACmnAABcSREAAQAAACqnAABgSREAAQAAACunAABkSREAAQAAACynAABoSREAAQAAAC2nAABsSREAAQAAAC6nAABwSREAAQAAAC+nAAB0SREAAQAAADKnAAB4SREAAQAAADOnAAB8SREAAQAAADSnAACASREAAQAAADWnAACESREAAQAAADanAACISREAAQAAADenAACMSREAAQAAADinAACQSREAAQAAADmnAACUSREAAQAAADqnAACYSREAAQAAADunAACcSREAAQAAADynAACgSREAAQAAAD2nAACkSREAAQAAAD6nAACoSREAAQAAAD+nAACsSREAAQAAAECnAACwSREAAQAAAEGnAAC0SREAAQAAAEKnAAC4SREAAQAAAEOnAAC8SREAAQAAAESnAADASREAAQAAAEWnAADESREAAQAAAEanAADISREAAQAAAEenAADMSREAAQAAAEinAADQSREAAQAAAEmnAADUSREAAQAAAEqnAADYSREAAQAAAEunAADcSREAAQAAAEynAADgSREAAQAAAE2nAADkSREAAQAAAE6nAADoSREAAQAAAE+nAADsSREAAQAAAFCnAADwSREAAQAAAFGnAAD0SREAAQAAAFKnAAD4SREAAQAAAFOnAAD8SREAAQAAAFSnAAAAShEAAQAAAFWnAAAEShEAAQAAAFanAAAIShEAAQAAAFenAAAMShEAAQAAAFinAAAQShEAAQAAAFmnAAAUShEAAQAAAFqnAAAYShEAAQAAAFunAAAcShEAAQAAAFynAAAgShEAAQAAAF2nAAAkShEAAQAAAF6nAAAoShEAAQAAAF+nAAAsShEAAQAAAGCnAAAwShEAAQAAAGGnAAA0ShEAAQAAAGKnAAA4ShEAAQAAAGOnAAA8ShEAAQAAAGSnAABAShEAAQAAAGWnAABEShEAAQAAAGanAABIShEAAQAAAGenAABMShEAAQAAAGinAABQShEAAQAAAGmnAABUShEAAQAAAGqnAABYShEAAQAAAGunAABcShEAAQAAAGynAABgShEAAQAAAG2nAABkShEAAQAAAG6nAABoShEAAQAAAG+nAABsShEAAQAAAHmnAABwShEAAQAAAHqnAAB0ShEAAQAAAHunAAB4ShEAAQAAAHynAAB8ShEAAQAAAH2nAACAShEAAQAAAH6nAACEShEAAQAAAH+nAACIShEAAQAAAICnAACMShEAAQAAAIGnAACQShEAAQAAAIKnAACUShEAAQAAAIOnAACYShEAAQAAAISnAACcShEAAQAAAIWnAACgShEAAQAAAIanAACkShEAAQAAAIenAACoShEAAQAAAIunAACsShEAAQAAAIynAACwShEAAQAAAI2nAAC0ShEAAQAAAJCnAAC4ShEAAQAAAJGnAAC8ShEAAQAAAJKnAADAShEAAQAAAJOnAADEShEAAQAAAJSnAADIShEAAQAAAJanAADMShEAAQAAAJenAADQShEAAQAAAJinAADUShEAAQAAAJmnAADYShEAAQAAAJqnAADcShEAAQAAAJunAADgShEAAQAAAJynAADkShEAAQAAAJ2nAADoShEAAQAAAJ6nAADsShEAAQAAAJ+nAADwShEAAQAAAKCnAAD0ShEAAQAAAKGnAAD4ShEAAQAAAKKnAAD8ShEAAQAAAKOnAAAASxEAAQAAAKSnAAAESxEAAQAAAKWnAAAISxEAAQAAAKanAAAMSxEAAQAAAKenAAAQSxEAAQAAAKinAAAUSxEAAQAAAKmnAAAYSxEAAQAAAKqnAAAcSxEAAQAAAKunAAAgSxEAAQAAAKynAAAkSxEAAQAAAK2nAAAoSxEAAQAAAK6nAAAsSxEAAQAAALCnAAAwSxEAAQAAALGnAAA0SxEAAQAAALKnAAA4SxEAAQAAALOnAAA8SxEAAQAAALSnAABASxEAAQAAALWnAABESxEAAQAAALanAABISxEAAQAAALenAABMSxEAAQAAALinAABQSxEAAQAAALmnAABUSxEAAQAAALqnAABYSxEAAQAAALunAABcSxEAAQAAALynAABgSxEAAQAAAL2nAABkSxEAAQAAAL6nAABoSxEAAQAAAL+nAABsSxEAAQAAAMCnAABwSxEAAQAAAMGnAAB0SxEAAQAAAMKnAAB4SxEAAQAAAMOnAAB8SxEAAQAAAMSnAACASxEAAQAAAMWnAACESxEAAQAAAManAACISxEAAQAAAMenAACMSxEAAQAAAMinAACQSxEAAQAAAMmnAACUSxEAAQAAAMqnAACYSxEAAQAAANCnAACcSxEAAQAAANGnAACgSxEAAQAAANanAACkSxEAAQAAANenAACoSxEAAQAAANinAACsSxEAAQAAANmnAACwSxEAAQAAAPWnAAC0SxEAAQAAAPanAAC4SxEAAQAAAFOrAAC8SxEAAQAAAHCrAADASxEAAQAAAHGrAADESxEAAQAAAHKrAADISxEAAQAAAHOrAADMSxEAAQAAAHSrAADQSxEAAQAAAHWrAADUSxEAAQAAAHarAADYSxEAAQAAAHerAADcSxEAAQAAAHirAADgSxEAAQAAAHmrAADkSxEAAQAAAHqrAADoSxEAAQAAAHurAADsSxEAAQAAAHyrAADwSxEAAQAAAH2rAAD0SxEAAQAAAH6rAAD4SxEAAQAAAH+rAAD8SxEAAQAAAICrAAAATBEAAQAAAIGrAAAETBEAAQAAAIKrAAAITBEAAQAAAIOrAAAMTBEAAQAAAISrAAAQTBEAAQAAAIWrAAAUTBEAAQAAAIarAAAYTBEAAQAAAIerAAAcTBEAAQAAAIirAAAgTBEAAQAAAImrAAAkTBEAAQAAAIqrAAAoTBEAAQAAAIurAAAsTBEAAQAAAIyrAAAwTBEAAQAAAI2rAAA0TBEAAQAAAI6rAAA4TBEAAQAAAI+rAAA8TBEAAQAAAJCrAABATBEAAQAAAJGrAABETBEAAQAAAJKrAABITBEAAQAAAJOrAABMTBEAAQAAAJSrAABQTBEAAQAAAJWrAABUTBEAAQAAAJarAABYTBEAAQAAAJerAABcTBEAAQAAAJirAABgTBEAAQAAAJmrAABkTBEAAQAAAJqrAABoTBEAAQAAAJurAABsTBEAAQAAAJyrAABwTBEAAQAAAJ2rAAB0TBEAAQAAAJ6rAAB4TBEAAQAAAJ+rAAB8TBEAAQAAAKCrAACATBEAAQAAAKGrAACETBEAAQAAAKKrAACITBEAAQAAAKOrAACMTBEAAQAAAKSrAACQTBEAAQAAAKWrAACUTBEAAQAAAKarAACYTBEAAQAAAKerAACcTBEAAQAAAKirAACgTBEAAQAAAKmrAACkTBEAAQAAAKqrAACoTBEAAQAAAKurAACsTBEAAQAAAKyrAACwTBEAAQAAAK2rAAC0TBEAAQAAAK6rAAC4TBEAAQAAAK+rAAC8TBEAAQAAALCrAADATBEAAQAAALGrAADETBEAAQAAALKrAADITBEAAQAAALOrAADMTBEAAQAAALSrAADQTBEAAQAAALWrAADUTBEAAQAAALarAADYTBEAAQAAALerAADcTBEAAQAAALirAADgTBEAAQAAALmrAADkTBEAAQAAALqrAADoTBEAAQAAALurAADsTBEAAQAAALyrAADwTBEAAQAAAL2rAAD0TBEAAQAAAL6rAAD4TBEAAQAAAL+rAAD8TBEAAQAAACH/AAAATREAAQAAACL/AAAETREAAQAAACP/AAAITREAAQAAACT/AAAMTREAAQAAACX/AAAQTREAAQAAACb/AAAUTREAAQAAACf/AAAYTREAAQAAACj/AAAcTREAAQAAACn/AAAgTREAAQAAACr/AAAkTREAAQAAACv/AAAoTREAAQAAACz/AAAsTREAAQAAAC3/AAAwTREAAQAAAC7/AAA0TREAAQAAAC//AAA4TREAAQAAADD/AAA8TREAAQAAADH/AABATREAAQAAADL/AABETREAAQAAADP/AABITREAAQAAADT/AABMTREAAQAAADX/AABQTREAAQAAADb/AABUTREAAQAAADf/AABYTREAAQAAADj/AABcTREAAQAAADn/AABgTREAAQAAADr/AABkTREAAQAAAEH/AABoTREAAQAAAEL/AABsTREAAQAAAEP/AABwTREAAQAAAET/AAB0TREAAQAAAEX/AAB4TREAAQAAAEb/AAB8TREAAQAAAEf/AACATREAAQAAAEj/AACETREAAQAAAEn/AACITREAAQAAAEr/AACMTREAAQAAAEv/AACQTREAAQAAAEz/AACUTREAAQAAAE3/AACYTREAAQAAAE7/AACcTREAAQAAAE//AACgTREAAQAAAFD/AACkTREAAQAAAFH/AACoTREAAQAAAFL/AACsTREAAQAAAFP/AACwTREAAQAAAFT/AAC0TREAAQAAAFX/AAC4TREAAQAAAFb/AAC8TREAAQAAAFf/AADATREAAQAAAFj/AADETREAAQAAAFn/AADITREAAQAAAFr/AADMTREAAQAAAAAEAQDQTREAAQAAAAEEAQDUTREAAQAAAAIEAQDYTREAAQAAAAMEAQDcTREAAQAAAAQEAQDgTREAAQAAAAUEAQDkTREAAQAAAAYEAQDoTREAAQAAAAcEAQDsTREAAQAAAAgEAQDwTREAAQAAAAkEAQD0TREAAQAAAAoEAQD4TREAAQAAAAsEAQD8TREAAQAAAAwEAQAAThEAAQAAAA0EAQAEThEAAQAAAA4EAQAIThEAAQAAAA8EAQAMThEAAQAAABAEAQAQThEAAQAAABEEAQAUThEAAQAAABIEAQAYThEAAQAAABMEAQAcThEAAQAAABQEAQAgThEAAQAAABUEAQAkThEAAQAAABYEAQAoThEAAQAAABcEAQAsThEAAQAAABgEAQAwThEAAQAAABkEAQA0ThEAAQAAABoEAQA4ThEAAQAAABsEAQA8ThEAAQAAABwEAQBAThEAAQAAAB0EAQBEThEAAQAAAB4EAQBIThEAAQAAAB8EAQBMThEAAQAAACAEAQBQThEAAQAAACEEAQBUThEAAQAAACIEAQBYThEAAQAAACMEAQBcThEAAQAAACQEAQBgThEAAQAAACUEAQBkThEAAQAAACYEAQBoThEAAQAAACcEAQBsThEAAQAAACgEAQBwThEAAQAAACkEAQB0ThEAAQAAACoEAQB4ThEAAQAAACsEAQB8ThEAAQAAACwEAQCAThEAAQAAAC0EAQCEThEAAQAAAC4EAQCIThEAAQAAAC8EAQCMThEAAQAAADAEAQCQThEAAQAAADEEAQCUThEAAQAAADIEAQCYThEAAQAAADMEAQCcThEAAQAAADQEAQCgThEAAQAAADUEAQCkThEAAQAAADYEAQCoThEAAQAAADcEAQCsThEAAQAAADgEAQCwThEAAQAAADkEAQC0ThEAAQAAADoEAQC4ThEAAQAAADsEAQC8ThEAAQAAADwEAQDAThEAAQAAAD0EAQDEThEAAQAAAD4EAQDIThEAAQAAAD8EAQDMThEAAQAAAEAEAQDQThEAAQAAAEEEAQDUThEAAQAAAEIEAQDYThEAAQAAAEMEAQDcThEAAQAAAEQEAQDgThEAAQAAAEUEAQDkThEAAQAAAEYEAQDoThEAAQAAAEcEAQDsThEAAQAAAEgEAQDwThEAAQAAAEkEAQD0ThEAAQAAAEoEAQD4ThEAAQAAAEsEAQD8ThEAAQAAAEwEAQAATxEAAQAAAE0EAQAETxEAAQAAAE4EAQAITxEAAQAAAE8EAQAMTxEAAQAAALAEAQAQTxEAAQAAALEEAQAUTxEAAQAAALIEAQAYTxEAAQAAALMEAQAcTxEAAQAAALQEAQAgTxEAAQAAALUEAQAkTxEAAQAAALYEAQAoTxEAAQAAALcEAQAsTxEAAQAAALgEAQAwTxEAAQAAALkEAQA0TxEAAQAAALoEAQA4TxEAAQAAALsEAQA8TxEAAQAAALwEAQBATxEAAQAAAL0EAQBETxEAAQAAAL4EAQBITxEAAQAAAL8EAQBMTxEAAQAAAMAEAQBQTxEAAQAAAMEEAQBUTxEAAQAAAMIEAQBYTxEAAQAAAMMEAQBcTxEAAQAAAMQEAQBgTxEAAQAAAMUEAQBkTxEAAQAAAMYEAQBoTxEAAQAAAMcEAQBsTxEAAQAAAMgEAQBwTxEAAQAAAMkEAQB0TxEAAQAAAMoEAQB4TxEAAQAAAMsEAQB8TxEAAQAAAMwEAQCATxEAAQAAAM0EAQCETxEAAQAAAM4EAQCITxEAAQAAAM8EAQCMTxEAAQAAANAEAQCQTxEAAQAAANEEAQCUTxEAAQAAANIEAQCYTxEAAQAAANMEAQCcTxEAAQAAANgEAQCgTxEAAQAAANkEAQCkTxEAAQAAANoEAQCoTxEAAQAAANsEAQCsTxEAAQAAANwEAQCwTxEAAQAAAN0EAQC0TxEAAQAAAN4EAQC4TxEAAQAAAN8EAQC8TxEAAQAAAOAEAQDATxEAAQAAAOEEAQDETxEAAQAAAOIEAQDITxEAAQAAAOMEAQDMTxEAAQAAAOQEAQDQTxEAAQAAAOUEAQDUTxEAAQAAAOYEAQDYTxEAAQAAAOcEAQDcTxEAAQAAAOgEAQDgTxEAAQAAAOkEAQDkTxEAAQAAAOoEAQDoTxEAAQAAAOsEAQDsTxEAAQAAAOwEAQDwTxEAAQAAAO0EAQD0TxEAAQAAAO4EAQD4TxEAAQAAAO8EAQD8TxEAAQAAAPAEAQAAUBEAAQAAAPEEAQAEUBEAAQAAAPIEAQAIUBEAAQAAAPMEAQAMUBEAAQAAAPQEAQAQUBEAAQAAAPUEAQAUUBEAAQAAAPYEAQAYUBEAAQAAAPcEAQAcUBEAAQAAAPgEAQAgUBEAAQAAAPkEAQAkUBEAAQAAAPoEAQAoUBEAAQAAAPsEAQAsUBEAAQAAAHAFAQAwUBEAAQAAAHEFAQA0UBEAAQAAAHIFAQA4UBEAAQAAAHMFAQA8UBEAAQAAAHQFAQBAUBEAAQAAAHUFAQBEUBEAAQAAAHYFAQBIUBEAAQAAAHcFAQBMUBEAAQAAAHgFAQBQUBEAAQAAAHkFAQBUUBEAAQAAAHoFAQBYUBEAAQAAAHwFAQBcUBEAAQAAAH0FAQBgUBEAAQAAAH4FAQBkUBEAAQAAAH8FAQBoUBEAAQAAAIAFAQBsUBEAAQAAAIEFAQBwUBEAAQAAAIIFAQB0UBEAAQAAAIMFAQB4UBEAAQAAAIQFAQB8UBEAAQAAAIUFAQCAUBEAAQAAAIYFAQCEUBEAAQAAAIcFAQCIUBEAAQAAAIgFAQCMUBEAAQAAAIkFAQCQUBEAAQAAAIoFAQCUUBEAAQAAAIwFAQCYUBEAAQAAAI0FAQCcUBEAAQAAAI4FAQCgUBEAAQAAAI8FAQCkUBEAAQAAAJAFAQCoUBEAAQAAAJEFAQCsUBEAAQAAAJIFAQCwUBEAAQAAAJQFAQC0UBEAAQAAAJUFAQC4UBEAAQAAAJcFAQC8UBEAAQAAAJgFAQDAUBEAAQAAAJkFAQDEUBEAAQAAAJoFAQDIUBEAAQAAAJsFAQDMUBEAAQAAAJwFAQDQUBEAAQAAAJ0FAQDUUBEAAQAAAJ4FAQDYUBEAAQAAAJ8FAQDcUBEAAQAAAKAFAQDgUBEAAQAAAKEFAQDkUBEAAQAAAKMFAQDoUBEAAQAAAKQFAQDsUBEAAQAAAKUFAQDwUBEAAQAAAKYFAQD0UBEAAQAAAKcFAQD4UBEAAQAAAKgFAQD8UBEAAQAAAKkFAQAAUREAAQAAAKoFAQAEUREAAQAAAKsFAQAIUREAAQAAAKwFAQAMUREAAQAAAK0FAQAQUREAAQAAAK4FAQAUUREAAQAAAK8FAQAYUREAAQAAALAFAQAcUREAAQAAALEFAQAgUREAAQAAALMFAQAkUREAAQAAALQFAQAoUREAAQAAALUFAQAsUREAAQAAALYFAQAwUREAAQAAALcFAQA0UREAAQAAALgFAQA4UREAAQAAALkFAQA8UREAAQAAALsFAQBAUREAAQAAALwFAQBEUREAAQAAAIAMAQBIUREAAQAAAIEMAQBMUREAAQAAAIIMAQBQUREAAQAAAIMMAQBUUREAAQAAAIQMAQBYUREAAQAAAIUMAQBcUREAAQAAAIYMAQBgUREAAQAAAIcMAQBkUREAAQAAAIgMAQBoUREAAQAAAIkMAQBsUREAAQAAAIoMAQBwUREAAQAAAIsMAQB0UREAAQAAAIwMAQB4UREAAQAAAI0MAQB8UREAAQAAAI4MAQCAUREAAQAAAI8MAQCEUREAAQAAAJAMAQCIUREAAQAAAJEMAQCMUREAAQAAAJIMAQCQUREAAQAAAJMMAQCUUREAAQAAAJQMAQCYUREAAQAAAJUMAQCcUREAAQAAAJYMAQCgUREAAQAAAJcMAQCkUREAAQAAAJgMAQCoUREAAQAAAJkMAQCsUREAAQAAAJoMAQCwUREAAQAAAJsMAQC0UREAAQAAAJwMAQC4UREAAQAAAJ0MAQC8UREAAQAAAJ4MAQDAUREAAQAAAJ8MAQDEUREAAQAAAKAMAQDIUREAAQAAAKEMAQDMUREAAQAAAKIMAQDQUREAAQAAAKMMAQDUUREAAQAAAKQMAQDYUREAAQAAAKUMAQDcUREAAQAAAKYMAQDgUREAAQAAAKcMAQDkUREAAQAAAKgMAQDoUREAAQAAAKkMAQDsUREAAQAAAKoMAQDwUREAAQAAAKsMAQD0UREAAQAAAKwMAQD4UREAAQAAAK0MAQD8UREAAQAAAK4MAQAAUhEAAQAAAK8MAQAEUhEAAQAAALAMAQAIUhEAAQAAALEMAQAMUhEAAQAAALIMAQAQUhEAAQAAAMAMAQAUUhEAAQAAAMEMAQAYUhEAAQAAAMIMAQAcUhEAAQAAAMMMAQAgUhEAAQAAAMQMAQAkUhEAAQAAAMUMAQAoUhEAAQAAAMYMAQAsUhEAAQAAAMcMAQAwUhEAAQAAAMgMAQA0UhEAAQAAAMkMAQA4UhEAAQAAAMoMAQA8UhEAAQAAAMsMAQBAUhEAAQAAAMwMAQBEUhEAAQAAAM0MAQBIUhEAAQAAAM4MAQBMUhEAAQAAAM8MAQBQUhEAAQAAANAMAQBUUhEAAQAAANEMAQBYUhEAAQAAANIMAQBcUhEAAQAAANMMAQBgUhEAAQAAANQMAQBkUhEAAQAAANUMAQBoUhEAAQAAANYMAQBsUhEAAQAAANcMAQBwUhEAAQAAANgMAQB0UhEAAQAAANkMAQB4UhEAAQAAANoMAQB8UhEAAQAAANsMAQCAUhEAAQAAANwMAQCEUhEAAQAAAN0MAQCIUhEAAQAAAN4MAQCMUhEAAQAAAN8MAQCQUhEAAQAAAOAMAQCUUhEAAQAAAOEMAQCYUhEAAQAAAOIMAQCcUhEAAQAAAOMMAQCgUhEAAQAAAOQMAQCkUhEAAQAAAOUMAQCoUhEAAQAAAOYMAQCsUhEAAQAAAOcMAQCwUhEAAQAAAOgMAQC0UhEAAQAAAOkMAQC4UhEAAQAAAOoMAQC8UhEAAQAAAOsMAQDAUhEAAQAAAOwMAQDEUhEAAQAAAO0MAQDIUhEAAQAAAO4MAQDMUhEAAQAAAO8MAQDQUhEAAQAAAPAMAQDUUhEAAQAAAPEMAQDYUhEAAQAAAPIMAQDcUhEAAQAAAKAYAQDgUhEAAQAAAKEYAQDkUhEAAQAAAKIYAQDoUhEAAQAAAKMYAQDsUhEAAQAAAKQYAQDwUhEAAQAAAKUYAQD0UhEAAQAAAKYYAQD4UhEAAQAAAKcYAQD8UhEAAQAAAKgYAQAAUxEAAQAAAKkYAQAEUxEAAQAAAKoYAQAIUxEAAQAAAKsYAQAMUxEAAQAAAKwYAQAQUxEAAQAAAK0YAQAUUxEAAQAAAK4YAQAYUxEAAQAAAK8YAQAcUxEAAQAAALAYAQAgUxEAAQAAALEYAQAkUxEAAQAAALIYAQAoUxEAAQAAALMYAQAsUxEAAQAAALQYAQAwUxEAAQAAALUYAQA0UxEAAQAAALYYAQA4UxEAAQAAALcYAQA8UxEAAQAAALgYAQBAUxEAAQAAALkYAQBEUxEAAQAAALoYAQBIUxEAAQAAALsYAQBMUxEAAQAAALwYAQBQUxEAAQAAAL0YAQBUUxEAAQAAAL4YAQBYUxEAAQAAAL8YAQBcUxEAAQAAAMAYAQBgUxEAAQAAAMEYAQBkUxEAAQAAAMIYAQBoUxEAAQAAAMMYAQBsUxEAAQAAAMQYAQBwUxEAAQAAAMUYAQB0UxEAAQAAAMYYAQB4UxEAAQAAAMcYAQB8UxEAAQAAAMgYAQCAUxEAAQAAAMkYAQCEUxEAAQAAAMoYAQCIUxEAAQAAAMsYAQCMUxEAAQAAAMwYAQCQUxEAAQAAAM0YAQCUUxEAAQAAAM4YAQCYUxEAAQAAAM8YAQCcUxEAAQAAANAYAQCgUxEAAQAAANEYAQCkUxEAAQAAANIYAQCoUxEAAQAAANMYAQCsUxEAAQAAANQYAQCwUxEAAQAAANUYAQC0UxEAAQAAANYYAQC4UxEAAQAAANcYAQC8UxEAAQAAANgYAQDAUxEAAQAAANkYAQDEUxEAAQAAANoYAQDIUxEAAQAAANsYAQDMUxEAAQAAANwYAQDQUxEAAQAAAN0YAQDUUxEAAQAAAN4YAQDYUxEAAQAAAN8YAQDcUxEAAQAAAEBuAQDgUxEA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ZWRiaWRpbWlycm9yZWRiaWRpbWlycm9yaW5nZ2x5cGhCaWRpX01pcnJvcmluZ19HbHlwaGJpZGlwYWlyZWRicmFja2V0QmlkaV9QYWlyZWRfQnJhY2tldGJpZGlwYWlyZWRicmFja2V0dHlwZUJpZGlfUGFpcmVkX0JyYWNrZXRfVHlwZWJsa2JtZ2JwYmJwdGNhbm9uaWNhbGNvbWJpbmluZ2NsYXNzQ2Fub25pY2FsX0NvbWJpbmluZ19DbGFzc2Nhc2VkQ2FzZWRjYXNlZm9sZGluZ0Nhc2VfRm9sZGluZ2Nhc2VpZ25vcmFibGVDYXNlX0lnbm9yYWJsZWNjY2NlQ29tcG9zaXRpb25fRXhjbHVzaW9uY2hhbmdlc3doZW5jYXNlZm9sZGVkQ2hhbmdlc19XaGVuX0Nhc2Vmb2xkZWRjaGFuZ2Vzd2hlbmNhc2VtYXBwZWRDaGFuZ2VzX1doZW5fQ2FzZW1hcHBlZGNoYW5nZXN3aGVubG93ZXJjYXNlZENoYW5nZXNfV2hlbl9Mb3dlcmNhc2VkY2hhbmdlc3doZW5uZmtjY2FzZWZvbGRlZENoYW5nZXNfV2hlbl9ORktDX0Nhc2Vmb2xkZWRjaGFuZ2Vzd2hlbnRpdGxlY2FzZWRDaGFuZ2VzX1doZW5fVGl0bGVjYXNlZGNoYW5nZXN3aGVudXBwZXJjYXNlZENoYW5nZXNfV2hlbl9VcHBlcmNhc2VkY2ljamthY2NvdW50aW5nbnVtZXJpY2tBY2NvdW50aW5nTnVtZXJpY2Nqa2NvbXBhdGliaWxpdHl2YXJpYW50a0NvbXBhdGliaWxpdHlWYXJpYW50Y2praWljb3Jla0lJQ29yZWNqa2lyZ2dzb3VyY2VrSVJHX0dTb3VyY2Vjamtpcmdoc291cmNla0lSR19IU291cmNlY2praXJnanNvdXJjZWtJUkdfSlNvdXJjZWNqa2lyZ2twc291cmNla0lSR19LUFNvdXJjZWNqa2lyZ2tzb3VyY2VrSVJHX0tTb3VyY2Vjamtpcmdtc291cmNla0lSR19NU291cmNlY2praXJnc3NvdXJjZWtJUkdfU1NvdXJjZWNqa2lyZ3Rzb3VyY2VrSVJHX1RTb3VyY2Vjamtpcmd1a3NvdXJjZWtJUkdfVUtTb3VyY2Vjamtpcmd1c291cmNla0lSR19VU291cmNlY2praXJndnNvdXJjZWtJUkdfVlNvdXJjZWNqa290aGVybnVtZXJpY2tPdGhlck51bWVyaWNjamtwcmltYXJ5bnVtZXJpY2tQcmltYXJ5TnVtZXJpY2Nqa3JzdW5pY29kZWtSU1VuaWNvZGVjb21wZXhGdWxsX0NvbXBvc2l0aW9uX0V4Y2x1c2lvbmNvbXBvc2l0aW9uZXhjbHVzaW9uY3djZmN3Y21jd2tjZmN3bGN3dGN3dWRhc2hEYXNoZGVjb21wb3NpdGlvbm1hcHBpbmdEZWNvbXBvc2l0aW9uX01hcHBpbmdkZWNvbXBvc2l0aW9udHlwZURlY29tcG9zaXRpb25fVHlwZWRlZmF1bHRpZ25vcmFibGVjb2RlcG9pbnREZWZhdWx0X0lnbm9yYWJsZV9Db2RlX1BvaW50ZGVwRGVwcmVjYXRlZGRlcHJlY2F0ZWRkaWRpYURpYWNyaXRpY2RpYWNyaXRpY2RtZHRlYUVhc3RfQXNpYW5fV2lkdGhlYXN0YXNpYW53aWR0aGViYXNlRW1vamlfTW9kaWZpZXJfQmFzZWVjb21wRW1vamlfQ29tcG9uZW50ZW1vZEVtb2ppX01vZGlmaWVyZW1vamlFbW9qaWVtb2ppY29tcG9uZW50ZW1vamltb2RpZmllcmVtb2ppbW9kaWZpZXJiYXNlZW1vamlwcmVzZW50YXRpb25FbW9qaV9QcmVzZW50YXRpb25lcHJlc2VxdWlkZW9FcXVpdmFsZW50X1VuaWZpZWRfSWRlb2dyYXBoZXF1aXZhbGVudHVuaWZpZWRpZGVvZ3JhcGhleHBhbmRzb25uZmNFeHBhbmRzX09uX05GQ2V4cGFuZHNvbm5mZEV4cGFuZHNfT25fTkZEZXhwYW5kc29ubmZrY0V4cGFuZHNfT25fTkZLQ2V4cGFuZHNvbm5ma2RFeHBhbmRzX09uX05GS0RleHRFeHRlbmRlcmV4dGVuZGVkcGljdG9ncmFwaGljRXh0ZW5kZWRfUGljdG9ncmFwaGljZXh0ZW5kZXJleHRwaWN0ZmNuZmtjRkNfTkZLQ19DbG9zdXJlZmNuZmtjY2xvc3VyZWZ1bGxjb21wb3NpdGlvbmV4Y2x1c2lvbmdjZ2NiZ2VuZXJhbGNhdGVnb3J5Z3JhcGhlbWViYXNlR3JhcGhlbWVfQmFzZWdyYXBoZW1lY2x1c3RlcmJyZWFrZ3JhcGhlbWVleHRlbmRHcmFwaGVtZV9FeHRlbmRncmFwaGVtZWxpbmtHcmFwaGVtZV9MaW5rZ3JiYXNlZ3JleHRncmxpbmtoYW5ndWxzeWxsYWJsZXR5cGVIYW5ndWxfU3lsbGFibGVfVHlwZWhleEhleF9EaWdpdGhleGRpZ2l0aHN0aHlwaGVuSHlwaGVuaWRjSURfQ29udGludWVpZGNvbnRpbnVlaWRlb0lkZW9ncmFwaGljaWRlb2dyYXBoaWNpZHNJRF9TdGFydGlkc2JJRFNfQmluYXJ5X09wZXJhdG9yaWRzYmluYXJ5b3BlcmF0b3JpZHN0SURTX1RyaW5hcnlfT3BlcmF0b3JpZHN0YXJ0aWRzdHJpbmFyeW9wZXJhdG9yaW5kaWNwb3NpdGlvbmFsY2F0ZWdvcnlJbmRpY19Qb3NpdGlvbmFsX0NhdGVnb3J5aW5kaWNzeWxsYWJpY2NhdGVnb3J5SW5kaWNfU3lsbGFiaWNfQ2F0ZWdvcnlpbnBjaW5zY2lzY0lTT19Db21tZW50amFtb3Nob3J0bmFtZUphbW9fU2hvcnRfTmFtZWpnSm9pbmluZ19Hcm91cGpvaW5jSm9pbl9Db250cm9sam9pbmNvbnRyb2xqb2luaW5nZ3JvdXBqb2luaW5ndHlwZUpvaW5pbmdfVHlwZWpzbmp0a2FjY291bnRpbmdudW1lcmlja2NvbXBhdGliaWxpdHl2YXJpYW50a2lpY29yZWtpcmdnc291cmNla2lyZ2hzb3VyY2VraXJnanNvdXJjZWtpcmdrcHNvdXJjZWtpcmdrc291cmNla2lyZ21zb3VyY2VraXJnc3NvdXJjZWtpcmd0c291cmNla2lyZ3Vrc291cmNla2lyZ3Vzb3VyY2VraXJndnNvdXJjZWtvdGhlcm51bWVyaWNrcHJpbWFyeW51bWVyaWNrcnN1bmljb2RlbGJMaW5lX0JyZWFrTG93ZXJjYXNlX01hcHBpbmdsaW5lYnJlYWtsb2VMb2dpY2FsX09yZGVyX0V4Y2VwdGlvbmxvZ2ljYWxvcmRlcmV4Y2VwdGlvbkxvd2VyY2FzZWxvd2VyY2FzZWxvd2VyY2FzZW1hcHBpbmdtYXRoTWF0aG5hTmFtZW5hMVVuaWNvZGVfMV9OYW1lbmFtZWFsaWFzTmFtZV9BbGlhc25jaGFyTm9uY2hhcmFjdGVyX0NvZGVfUG9pbnRuZmNxY05GQ19RdWlja19DaGVja25mY3F1aWNrY2hlY2tuZmRxY05GRF9RdWlja19DaGVja25mZHF1aWNrY2hlY2tuZmtjY2FzZWZvbGRORktDX0Nhc2Vmb2xkbmZrY2NmbmZrY3FjTkZLQ19RdWlja19DaGVja25ma2NxdWlja2NoZWNrbmZrZHFjTkZLRF9RdWlja19DaGVja25ma2RxdWlja2NoZWNrbm9uY2hhcmFjdGVyY29kZXBvaW50bnROdW1lcmljX1R5cGVudW1lcmljdHlwZW51bWVyaWN2YWx1ZU51bWVyaWNfVmFsdWVudm9hbHBoYU90aGVyX0FscGhhYmV0aWNvY29tbWVudG9kaU90aGVyX0RlZmF1bHRfSWdub3JhYmxlX0NvZGVfUG9pbnRvZ3JleHRPdGhlcl9HcmFwaGVtZV9FeHRlbmRvaWRjT3RoZXJfSURfQ29udGludWVvaWRzT3RoZXJfSURfU3RhcnRvbG93ZXJPdGhlcl9Mb3dlcmNhc2VvbWF0aE90aGVyX01hdGhvdGhlcmFscGhhYmV0aWNvdGhlcmRlZmF1bHRpZ25vcmFibGVjb2RlcG9pbnRvdGhlcmdyYXBoZW1lZXh0ZW5kb3RoZXJpZGNvbnRpbnVlb3RoZXJpZHN0YXJ0b3RoZXJsb3dlcmNhc2VvdGhlcm1hdGhvdGhlcnVwcGVyY2FzZU90aGVyX1VwcGVyY2FzZW91cHBlcnBhdHN5blBhdHRlcm5fU3ludGF4cGF0dGVybnN5bnRheHBhdHRlcm53aGl0ZXNwYWNlUGF0dGVybl9XaGl0ZV9TcGFjZXBhdHdzcGNtUHJlcGVuZGVkX0NvbmNhdGVuYXRpb25fTWFya3ByZXBlbmRlZGNvbmNhdGVuYXRpb25tYXJrcW1hcmtRdW90YXRpb25fTWFya3F1b3RhdGlvbm1hcmtyYWRpY2FsUmFkaWNhbHJlZ2lvbmFsaW5kaWNhdG9yUmVnaW9uYWxfSW5kaWNhdG9ycmlzYnNjZlNpbXBsZV9DYXNlX0ZvbGRpbmdzY3JpcHRleHRlbnNpb25zc2N4c2RTb2Z0X0RvdHRlZHNlbnRlbmNlYnJlYWtzZW50ZW5jZXRlcm1pbmFsU2VudGVuY2VfVGVybWluYWxzZmNzaW1wbGVjYXNlZm9sZGluZ3NpbXBsZWxvd2VyY2FzZW1hcHBpbmdTaW1wbGVfTG93ZXJjYXNlX01hcHBpbmdzaW1wbGV0aXRsZWNhc2VtYXBwaW5nU2ltcGxlX1RpdGxlY2FzZV9NYXBwaW5nc2ltcGxldXBwZXJjYXNlbWFwcGluZ1NpbXBsZV9VcHBlcmNhc2VfTWFwcGluZ3NsY3NvZnRkb3R0ZWRXaGl0ZV9TcGFjZXN0Y3N0ZXJtc3VjdGNUaXRsZWNhc2VfTWFwcGluZ3Rlcm1UZXJtaW5hbF9QdW5jdHVhdGlvbnRlcm1pbmFscHVuY3R1YXRpb250aXRsZWNhc2VtYXBwaW5ndWNVcHBlcmNhc2VfTWFwcGluZ3VpZGVvVW5pZmllZF9JZGVvZ3JhcGh1bmljb2RlMW5hbWV1bmljb2RlcmFkaWNhbHN0cm9rZXVuaWZpZWRpZGVvZ3JhcGhVcHBlcmNhc2V1cHBlcmNhc2V1cHBlcmNhc2VtYXBwaW5ndXJzdmFyaWF0aW9uc2VsZWN0b3JWYXJpYXRpb25fU2VsZWN0b3J2ZXJ0aWNhbG9yaWVudGF0aW9uVmVydGljYWxfT3JpZW50YXRpb252b3Zzd2J3aGl0ZXNwYWNld29yZGJyZWFrd3NwYWNleGlkY1hJRF9Db250aW51ZXhpZGNvbnRpbnVleGlkc1hJRF9TdGFydHhpZHN0YXJ0eG9uZmN4b25mZHhvbmZrY3hvbmZrZOT8EQADAAAAAOIRAAMAAADn/BEABAAAAOv8EQAPAAAAGUcWAAUAAAD6/BEACgAAAAT9EQAKAAAA+vwRAAoAAAAO/READQAAAOv8EQAPAAAAG/0RAAIAAAAd/REACgAAACf9EQAFAAAALP0RAAwAAAA4/REACQAAAB39EQAKAAAAQf0RAAsAAAAs/READAAAAEz9EQAFAAAAUf0RAA0AAABe/READAAAAFH9EQANAAAAav0RABIAAAB8/REAFAAAAJD9EQARAAAAof0RABMAAAC0/REAFQAAAMn9EQAYAAAA4f0RAAMAAABvgBYABQAAAMeBFgAFAAAAb4AWAAUAAADk/REAAwAAAHz9EQAUAAAA5/0RAAMAAACh/REAEwAAAOr9EQADAAAAyf0RABgAAADt/REA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BAAAALcdEgAFAAAAgR4SAAMAAACvHRIABAAAAIQeEgAEAAAAwB0SAAUAAACIHhIABAAAAMkdEgAFAAAAjB4SAAQAAADSHRIABQAAAJAeEgAEAAAA2x0SAAUAAACUHhIABAAAAOQdEgAFAAAAmB4SAAQAAADtHRIABQAAAJweEgADAAAA9R0SAAQAAACfHhIAAwAAAPwdEgAEAAAAoh4SAAMAAAADHhIABAAAAKUeEgADAAAACh4SAAQAAACoHhIAAwAAABEeEgAEAAAAqx4SAAMAAAAYHhIABAAAAK4eEgADAAAAHx4SAAQAAACxHhIAAwAAACYeEgAEAAAAtB4SAAMAAAAtHhIABAAAALceEgADAAAANB4SAAQAAAC6HhIAAwAAADseEgAEAAAAvR4SAAMAAABCHhIABAAAAMAeEgADAAAASR4SAAQAAADDHhIAAwAAAFAeEgAEAAAAxh4SAAMAAABXHhIABAAAAMkeEgADAAAAXh4SAAQAAADMHhIAAwAAAGUeEgAEAAAAY2FzZWRsZXR0ZXJDYXNlZF9MZXR0ZXJjY0NvbnRyb2xGb3JtYXRjbG9zZXB1bmN0dWF0aW9uQ2xvc2VfUHVuY3R1YXRpb25jbmNvUHJpdmF0ZV9Vc2Vjb21iaW5pbmdtYXJrY29ubmVjdG9ycHVuY3R1YXRpb25Db25uZWN0b3JfUHVuY3R1YXRpb25jb250cm9sY3NTdXJyb2dhdGVjdXJyZW5jeXN5bWJvbEN1cnJlbmN5X1N5bWJvbGRhc2hwdW5jdHVhdGlvbkRhc2hfUHVuY3R1YXRpb25kZWNpbWFsbnVtYmVyRGVjaW1hbF9OdW1iZXJlbmNsb3NpbmdtYXJrRW5jbG9zaW5nX01hcmtmaW5hbHB1bmN0dWF0aW9uRmluYWxfUHVuY3R1YXRpb25mb3JtYXRpbml0aWFscHVuY3R1YXRpb25Jbml0aWFsX1B1bmN0dWF0aW9ubExldHRlcmxldHRlcmxldHRlcm51bWJlckxldHRlcl9OdW1iZXJsaW5lc2VwYXJhdG9yTGluZV9TZXBhcmF0b3JsbExvd2VyY2FzZV9MZXR0ZXJsbU1vZGlmaWVyX0xldHRlcmxvT3RoZXJfTGV0dGVybG93ZXJjYXNlbGV0dGVyVGl0bGVjYXNlX0xldHRlcmx1VXBwZXJjYXNlX0xldHRlcm1tYXJrbWF0aHN5bWJvbE1hdGhfU3ltYm9sbWNTcGFjaW5nX01hcmttZW1uTm9uc3BhY2luZ19NYXJrbW9kaWZpZXJsZXR0ZXJtb2RpZmllcnN5bWJvbE1vZGlmaWVyX1N5bWJvbG5kbmxub090aGVyX051bWJlcm5vbnNwYWNpbmdtYXJrb3BlbnB1bmN0dWF0aW9uT3Blbl9QdW5jdHVhdGlvbm90aGVyb3RoZXJsZXR0ZXJvdGhlcm51bWJlcm90aGVycHVuY3R1YXRpb25PdGhlcl9QdW5jdHVhdGlvbm90aGVyc3ltYm9sT3RoZXJfU3ltYm9scFB1bmN0dWF0aW9ucGFyYWdyYXBoc2VwYXJhdG9yUGFyYWdyYXBoX1NlcGFyYXRvcnBjcGRwZXBmcG9wcml2YXRldXNlcHNwdW5jdHVhdGlvbnNTeW1ib2xzZXBhcmF0b3JTZXBhcmF0b3Jza3Ntc29zcGFjZXNlcGFyYXRvclNwYWNlX1NlcGFyYXRvcnNwYWNpbmdtYXJrc3Vycm9nYXRldGl0bGVjYXNlbGV0dGVydXBwZXJjYXNlbGV0dGVyenpsenB6cwAA8XYWAAEAAAAoHBYABQAAABAiEgALAAAAGyISAAwAAAAnIhIAAgAAACkiEgAHAAAA+uERAAIAAAAwIhIABgAAADYiEgAQAAAARiISABEAAABXIhIAAgAAAGkeEgAKAAAA56IVAAUAAAApIhIABwAAAFkiEgACAAAAWyISAAsAAABmIhIADQAAAEAlFgAEAAAAcyISABQAAACHIhIAFQAAAJwiEgAHAAAAKSISAAcAAACjIhIAAgAAAKUiEgAJAAAAriISAA4AAAC8IhIADwAAAMsiEgAPAAAA2iISABAAAADqIhIADQAAAPciEgAOAAAA7KIVAAUAAAD3IhIADgAAAAUjEgANAAAAEiMSAA4AAAAgIxIAEAAAADAjEgARAAAAQSMSAAYAAAAwIhIABgAAAEcjEgASAAAAWSMSABMAAABsIxIAAQAAAG0jEgAGAAAA/uERAAIAAAAbIhIADAAAAHMjEgAGAAAAbSMSAAYAAAB5IxIADAAAAIUjEgANAAAAkiMSAA0AAACfIxIADgAAAK0jEgACAAAAryMSABAAAAC/IxIAAgAAAMEjEgAPAAAA0CMSAAIAAADSIxIADAAAAN4jEgAPAAAAryMSABAAAACnRBYAAgAAAO0jEgAQAAAA/SMSAAIAAAD/IxIAEAAAAA8kEgABAAAAQCUWAAQAAAAQJBIABAAAAEAlFgAEAAAAFCQSAAoAAAAeJBIACwAAACkkEgACAAAAKyQSAAwAAAA3JBIAAgAAABIjEgAOAAAAOSQSAAIAAAA7JBIADwAAAEokEgAOAAAAwSMSAA8AAABYJBIADgAAAGYkEgAPAAAAWBwYAAEAAABNSRYABgAAAHUkEgACAAAA9yISAA4AAAB3JBIAAgAAAIUjEgANAAAAeSQSAAIAAAB7JBIADAAAAIckEgAOAAAAOyQSAA8AAADTGhgABgAAAE1JFgAGAAAAlSQSAA8AAACkJBIAEAAAALQkEgAFAAAAKBwWAAUAAAC5JBIACwAAANIjEgAMAAAAxCQSAAsAAAB7JBIADAAAAM8kEgAQAAAA3yQSABEAAADwJBIACwAAAPskEgAMAAAAByUSAAEAAAAIJRIACwAAABMlEgASAAAAJSUSABMAAAA4JRIAAgAAAIciEgAVAAAAOiUSAAIAAADaIhIAEAAAADwlEgACAAAARiISABEAAAA+JRIAAgAAADAjEgARAAAAW0cWAAIAAABZIxIAEwAAAEAlEgACAAAA3yQSABEAAABCJRIACgAAAFsiEgALAAAATCUSAAIAAACkJBIAEAAAAACjFQAFAAAACCUSAAsAAABOJRIACwAAAAglEgALAAAAWSUSAAEAAABaJRIABgAAAPzhEQACAAAAvCISAA8AAABgJRIACQAAAGklEgAJAAAAciUSAAIAAABmJBIADwAAAHQlEgACAAAAHiQSAAsAAAB2JRIAAgAAAPskEgAMAAAAeCUSAA4AAACGJRIADwAAAJUlEgALAAAAKyQSAAwAAACgJRIACQAAAKUiEgAJAAAA8hoYAAYAAABaJRIABgAAAKklEgAPAAAA7SMSABAAAABzHhIACgAAAGkeEgAKAAAAuCUSAA8AAAD/IxIAEAAAAMclEgABAAAAaSUSAAkAAADIJRIAAgAAAJ8jEgAOAAAAyiUSAAIAAAAlJRIAEwAAAMwlEgACAAAAhiUSAA8AAABjckNSZWJFX0Jhc2VlYmFzZWdhekVfQmFzZV9HQVplYmdlbUVfTW9kaWZpZXJlbW9kaWZpZXJleEV4dGVuZGV4dGVuZGdhekdsdWVfQWZ0ZXJfWndqZ2x1ZWFmdGVyendqTGxmTEZsdkxWbHZ0TFZUcHBQcmVwZW5kcHJlcGVuZFNwYWNpbmdNYXJrdFR2Vnh4WldKVyISAAIAAAApIhIABwAAAJwiEgAHAAAAKSISAAcAAADQKhIAAgAAANIqEgACAAAA1CoSAAIAAADWKhIABgAAAHYCEgAFAAAA1ioSAAYAAADcKhIACAAAAOQqEgAKAAAA7ioSAAMAAADkKhIACgAAAPEqEgACAAAA8yoSAAoAAAD9KhIACQAAAPMqEgAKAAAABisSAAIAAAAIKxIABgAAAA4rEgAGAAAACCsSAAYAAAAUKxIAAwAAABcrEgAOAAAAJSsSAAwAAAAXKxIADgAAAGwjEgABAAAAMSsSAAEAAAAyKxIAAgAAADQrEgACAAAANisSAAIAAAA4KxIAAgAAADorEgADAAAAPSsSAAMAAAC0JBIABQAAACgcFgAFAAAAQCsSAAIAAABCKxIABwAAAEkrEgAHAAAAQisSAAcAAAD1ChIAEQAAAAYLEgASAAAAGAsSAAIAAAAGCxIAEgAAAHQlEgACAAAAUCsSAAsAAACVJRIACwAAAFArEgALAAAAWysSAAEAAABcKxIAAQAAAF0rEgABAAAAXisSAAEAAABfKxIAAgAAACgcFgAFAAAApUcWAAMAAABhKxIAAwAAAGFkbGFtQWRsYW1hZGxtYWdoYkNhdWNhc2lhbl9BbGJhbmlhbmFob21BaG9tYW5hdG9saWFuaGllcm9nbHlwaHNBbmF0b2xpYW5fSGllcm9nbHlwaHNhcmFiQXJhYmljYXJhYmljYXJtZW5pYW5Bcm1lbmlhbmFybWlJbXBlcmlhbF9BcmFtYWljYXJtbmF2ZXN0YW5BdmVzdGFuYXZzdGJhbGlCYWxpbmVzZWJhbGluZXNlYmFtdUJhbXVtYmFtdW1iYXNzQmFzc2FfVmFoYmFzc2F2YWhiYXRha0JhdGFrYmF0a2JlbmdCZW5nYWxpYmVuZ2FsaWJoYWlrc3VraUJoYWlrc3VraWJoa3Nib3BvQm9wb21vZm9ib3BvbW9mb2JyYWhCcmFobWlicmFobWlicmFpQnJhaWxsZWJyYWlsbGVidWdpQnVnaW5lc2VidWdpbmVzZWJ1aGRCdWhpZGJ1aGlkY2FrbUNoYWttYWNhbmFkaWFuYWJvcmlnaW5hbENhbmFkaWFuX0Fib3JpZ2luYWxjYW5zY2FyaUNhcmlhbmNhcmlhbmNhdWNhc2lhbmFsYmFuaWFuY2hha21hY2hhbUNoYW1jaGVyQ2hlcm9rZWVjaGVyb2tlZWNob3Jhc21pYW5DaG9yYXNtaWFuY2hyc2NvbW1vbkNvbW1vbmNvcHRDb3B0aWNjb3B0aWNjcG1uQ3lwcm9fTWlub2FuY3BydEN5cHJpb3RjdW5laWZvcm1DdW5laWZvcm1jeXByaW90Y3lwcm9taW5vYW5jeXJpbGxpY0N5cmlsbGljY3lybGRlc2VyZXREZXNlcmV0ZGV2YURldmFuYWdhcmlkZXZhbmFnYXJpZGlha0RpdmVzX0FrdXJ1ZGl2ZXNha3VydWRvZ3JEb2dyYWRvZ3JhZHNydGR1cGxEdXBsb3lhbmR1cGxveWFuZWd5cEVneXB0aWFuX0hpZXJvZ2x5cGhzZWd5cHRpYW5oaWVyb2dseXBoc2VsYmFFbGJhc2FuZWxiYXNhbmVseW1FbHltYWljZWx5bWFpY2V0aGlFdGhpb3BpY2V0aGlvcGljZ2Vvckdlb3JnaWFuZ2VvcmdpYW5nbGFnR2xhZ29saXRpY2dsYWdvbGl0aWNnb25nR3VuamFsYV9Hb25kaWdvbm1NYXNhcmFtX0dvbmRpZ290aEdvdGhpY2dvdGhpY2dyYW5HcmFudGhhZ3JhbnRoYWdyZWVrR3JlZWtncmVrZ3VqYXJhdGlHdWphcmF0aWd1anJndW5qYWxhZ29uZGlndXJtdWtoaUd1cm11a2hpZ3VydWhhbkhhbmhhbmdIYW5ndWxoYW5ndWxoYW5paGFuaWZpcm9oaW5neWFIYW5pZmlfUm9oaW5neWFoYW5vSGFudW5vb2hhbnVub29oYXRySGF0cmFuaGF0cmFuaGVickhlYnJld2hlYnJld2hpcmFIaXJhZ2FuYWhpcmFnYW5haGx1d2htbmdQYWhhd2hfSG1vbmdobW5wTnlpYWtlbmdfUHVhY2h1ZV9IbW9uZ2hya3RLYXRha2FuYV9Pcl9IaXJhZ2FuYWh1bmdPbGRfSHVuZ2FyaWFuaW1wZXJpYWxhcmFtYWljaW5oZXJpdGVkSW5oZXJpdGVkaW5zY3JpcHRpb25hbHBhaGxhdmlJbnNjcmlwdGlvbmFsX1BhaGxhdmlpbnNjcmlwdGlvbmFscGFydGhpYW5JbnNjcmlwdGlvbmFsX1BhcnRoaWFuaXRhbE9sZF9JdGFsaWNqYXZhSmF2YW5lc2VqYXZhbmVzZWthaXRoaUthaXRoaWthbGlLYXlhaF9MaWthbmFLYXRha2FuYWthbm5hZGFLYW5uYWRha2F0YWthbmFrYXRha2FuYW9yaGlyYWdhbmFrYXdpS2F3aWtheWFobGlraGFyS2hhcm9zaHRoaWtoYXJvc2h0aGlraGl0YW5zbWFsbHNjcmlwdEtoaXRhbl9TbWFsbF9TY3JpcHRraG1lcktobWVya2htcmtob2pLaG9qa2lraG9qa2lraHVkYXdhZGlLaHVkYXdhZGlraXRza25kYWt0aGlsYW5hVGFpX1RoYW1sYW9MYW9sYW9vbGF0aW5MYXRpbmxhdG5sZXBjTGVwY2hhbGVwY2hhbGltYkxpbWJ1bGltYnVsaW5hTGluZWFyX0FsaW5iTGluZWFyX0JsaW5lYXJhbGluZWFyYmxpc3VMaXN1bHljaUx5Y2lhbmx5Y2lhbmx5ZGlMeWRpYW5seWRpYW5tYWhhamFuaU1haGFqYW5pbWFoam1ha2FNYWthc2FybWFrYXNhcm1hbGF5YWxhbU1hbGF5YWxhbW1hbmRNYW5kYWljbWFuZGFpY21hbmlNYW5pY2hhZWFubWFuaWNoYWVhbm1hcmNNYXJjaGVubWFyY2hlbm1hc2FyYW1nb25kaW1lZGVmYWlkcmluTWVkZWZhaWRyaW5tZWRmbWVldGVpbWF5ZWtNZWV0ZWlfTWF5ZWttZW5kTWVuZGVfS2lrYWt1aW1lbmRla2lrYWt1aW1lcmNNZXJvaXRpY19DdXJzaXZlbWVyb01lcm9pdGljX0hpZXJvZ2x5cGhzbWVyb2l0aWNjdXJzaXZlbWVyb2l0aWNoaWVyb2dseXBoc21pYW9NaWFvbWx5bW1vZGlNb2RpbW9uZ01vbmdvbGlhbm1vbmdvbGlhbm1yb01yb21yb29tdGVpbXVsdE11bHRhbmltdWx0YW5pbXlhbm1hck15YW5tYXJteW1ybmFiYXRhZWFuTmFiYXRhZWFubmFnbU5hZ19NdW5kYXJpbmFnbXVuZGFyaW5hbmROYW5kaW5hZ2FyaW5hbmRpbmFnYXJpbmFyYk9sZF9Ob3J0aF9BcmFiaWFubmJhdG5ld2FOZXdhbmV3dGFpbHVlTmV3X1RhaV9MdWVua29Oa29ua29vbnNodU51c2h1bnVzaHVueWlha2VuZ3B1YWNodWVobW9uZ29nYW1PZ2hhbW9naGFtb2xjaGlraU9sX0NoaWtpb2xja29sZGh1bmdhcmlhbm9sZGl0YWxpY29sZG5vcnRoYXJhYmlhbm9sZHBlcm1pY09sZF9QZXJtaWNvbGRwZXJzaWFuT2xkX1BlcnNpYW5vbGRzb2dkaWFuT2xkX1NvZ2RpYW5vbGRzb3V0aGFyYWJpYW5PbGRfU291dGhfQXJhYmlhbm9sZHR1cmtpY09sZF9UdXJraWNvbGR1eWdodXJPbGRfVXlnaHVyb3JpeWFPcml5YW9ya2hvcnlhb3NhZ2VPc2FnZW9zZ2Vvc21hT3NtYW55YW9zbWFueWFvdWdycGFoYXdoaG1vbmdwYWxtUGFsbXlyZW5lcGFsbXlyZW5lcGF1Y1BhdV9DaW5fSGF1cGF1Y2luaGF1cGVybXBoYWdQaGFnc19QYXBoYWdzcGFwaGxpcGhscFBzYWx0ZXJfUGFobGF2aXBobnhQaG9lbmljaWFucGhvZW5pY2lhbnBscmRwcnRpcHNhbHRlcnBhaGxhdmlxYWFjcWFhaXJlamFuZ1JlamFuZ3Jqbmdyb2hncnVuaWNSdW5pY3J1bnJzYW1hcml0YW5TYW1hcml0YW5zYW1yc2FyYnNhdXJTYXVyYXNodHJhc2F1cmFzaHRyYXNnbndTaWduV3JpdGluZ3NoYXJhZGFTaGFyYWRhc2hhdmlhblNoYXZpYW5zaGF3c2hyZHNpZGRTaWRkaGFtc2lkZGhhbXNpZ253cml0aW5nc2luZHNpbmhTaW5oYWxhc2luaGFsYXNvZ2RTb2dkaWFuc29nZGlhbnNvZ29zb3JhU29yYV9Tb21wZW5nc29yYXNvbXBlbmdzb3lvU295b21ib3NveW9tYm9zdW5kU3VuZGFuZXNlc3VuZGFuZXNlc3lsb1N5bG90aV9OYWdyaXN5bG90aW5hZ3Jpc3lyY1N5cmlhY3N5cmlhY3RhZ2Fsb2dUYWdhbG9ndGFnYlRhZ2JhbndhdGFnYmFud2F0YWlsZVRhaV9MZXRhaXRoYW10YWl2aWV0VGFpX1ZpZXR0YWtyVGFrcml0YWtyaXRhbGV0YWx1dGFt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bR4AAG8eAABvHgAAcR4AAHEeAABzHgAAcx4AAHUeAAB1HgAAdx4AAHceAAB5HgAAeR4AAHseAAB7HgAAfR4AAH0eAAB/HgAAfx4AAIEeAACBHgAAgx4AAIMeAACFHgAAhR4AAIceAACHHgAAiR4AAIkeAACLHgAAix4AAI0eAACNHgAAjx4AAI8eAACRHgAAkR4AAJMeAACTHgAAlR4AAJ0eAACfHgAAnx4AAKEeAAChHgAAox4AAKMeAAClHgAApR4AAKceAACnHgAAqR4AAKkeAACrHgAAqx4AAK0eAACtHgAArx4AAK8eAACxHgAAsR4AALMeAACzHgAAtR4AALUeAAC3HgAAtx4AALkeAAC5HgAAux4AALseAAC9HgAAvR4AAL8eAAC/HgAAwR4AAMEeAADDHgAAwx4AAMUeAADFHgAAxx4AAMceAADJHgAAyR4AAMseAADLHgAAzR4AAM0eAADPHgAAzx4AANEeAADRHgAA0x4AANMeAADVHgAA1R4AANceAADXHgAA2R4AANkeAADbHgAA2x4AAN0eAADdHgAA3x4AAN8eAADhHgAA4R4AAOMeAADjHgAA5R4AAOUeAADnHgAA5x4AAOkeAADpHgAA6x4AAOseAADtHgAA7R4AAO8eAADvHgAA8R4AAPEeAADzHgAA8x4AAPUeAAD1HgAA9x4AAPceAAD5HgAA+R4AAPseAAD7HgAA/R4AAP0eAAD/HgAABx8AABAfAAAVHwAAIB8AACcfAAAwHwAANx8AAEAfAABFHwAAUB8AAFcfAABgHwAAZx8AAHAfAAB9HwAAgB8AAIcfAACQHwAAlx8AAKAfAACnHwAAsB8AALQfAAC2HwAAtx8AAL4fAAC+HwAAwh8AAMQfAADGHwAAxx8AANAfAADTHwAA1h8AANcfAADgHwAA5x8AAPIfAAD0HwAA9h8AAPcfAAAKIQAACiEAAA4hAAAPIQAAEyEAABMhAAAvIQAALyEAADQhAAA0IQAAOSEAADkhAAA8IQAAPSEAAEYhAABJIQAATiEAAE4hAACEIQAAhCEAADAsAABfLAAAYSwAAGEsAABlLAAAZiwAAGgsAABoLAAAaiwAAGosAABsLAAAbCwAAHEsAABxLAAAcywAAHQsAAB2LAAAeywAAIEsAACBLAAAgywAAIMsAACFLAAAhSwAAIcsAACHLAAAiSwAAIksAACLLAAAiywAAI0sAACNLAAAjywAAI8sAACRLAAAkSwAAJMsAACTLAAAlSwAAJUsAACXLAAAlywAAJksAACZLAAAmywAAJssAACdLAAAnSwAAJ8sAACfLAAAoSwAAKEsAACjLAAAoywAAKUsAAClLAAApywAAKcsAACpLAAAqSwAAKssAACrLAAArSwAAK0sAACvLAAArywAALEsAACxLAAAsywAALMsAAC1LAAAtSwAALcsAAC3LAAAuSwAALksAAC7LAAAuywAAL0sAAC9LAAAvywAAL8sAADBLAAAwSwAAMMsAADDLAAAxSwAAMUsAADHLAAAxywAAMksAADJLAAAyywAAMssAADNLAAAzSwAAM8sAADPLAAA0SwAANEsAADTLAAA0ywAANUsAADVLAAA1ywAANcsAADZLAAA2SwAANssAADbLAAA3SwAAN0sAADfLAAA3ywAAOEsAADhLAAA4ywAAOQsAADsLAAA7CwAAO4sAADuLAAA8ywAAPMsAAAALQAAJS0AACctAAAnLQAALS0AAC0tAABBpgAAQaYAAEOmAABDpgAARaYAAEWmAABHpgAAR6YAAEmmAABJpgAAS6YAAEumAABNpgAATaYAAE+mAABPpgAAUaYAAFGmAABTpgAAU6YAAFWmAABVpgAAV6YAAFemAABZpgAAWaYAAFumAABbpgAAXaYAAF2mAABfpgAAX6YAAGGmAABhpgAAY6YAAGOmAABlpgAAZaYAAGemAABnpgAAaaYAAGmmAABrpgAAa6YAAG2mAABtpgAAgaYAAIGmAACDpgAAg6YAAIWmAACFpgAAh6YAAIemAACJpgAAiaYAAIumAACLpgAAjaYAAI2mAACPpgAAj6YAAJGmAACRpgAAk6YAAJOmAACVpgAAlaYAAJemAACXpgAAmaYAAJmmAACbpgAAm6YAACOnAAAjpwAAJacAACWnAAAnpwAAJ6cAACmnAAAppwAAK6cAACunAAAtpwAALacAAC+nAAAxpwAAM6cAADOnAAA1pwAANacAADenAAA3pwAAOacAADmnAAA7pwAAO6cAAD2nAAA9pwAAP6cAAD+nAABBpwAAQacAAEOnAABDpwAARacAAEWnAABHpwAAR6cAAEmnAABJpwAAS6cAAEunAABNpwAATacAAE+nAABPpwAAUacAAFGnAABTpwAAU6cAAFWnAABVpwAAV6cAAFenAABZpwAAWacAAFunAABbpwAAXacAAF2nAABfpwAAX6cAAGGnAABhpwAAY6cAAGOnAABlpwAAZacAAGenAABnpwAAaacAAGmnAABrpwAAa6cAAG2nAABtpwAAb6cAAG+nAABxpwAAeKcAAHqnAAB6pwAAfKcAAHynAAB/pwAAf6cAAIGnAACBpwAAg6cAAIOnAACFpwAAhacAAIenAACHpwAAjKcAAIynAACOpwAAjqcAAJGnAACRpwAAk6cAAJWnAACXpwAAl6cAAJmnAACZpwAAm6cAAJunAACdpwAAnacAAJ+nAACfpwAAoacAAKGnAACjpwAAo6cAAKWnAAClpwAAp6cAAKenAACppwAAqacAAK+nAACvpwAAtacAALWnAAC3pwAAt6cAALmnAAC5pwAAu6cAALunAAC9pwAAvacAAL+nAAC/pwAAwacAAMGnAADDpwAAw6cAAMinAADIpwAAyqcAAMqnAADRpwAA0acAANOnAADTpwAA1acAANWnAADXpwAA16cAANmnAADZpwAA9qcAAPanAAD6pwAA+qcAADCrAABaqwAAYKsAAGirAABwqwAAv6sAAAD7AAAG+wAAE/sAABf7AABB/wAAWv8AACgEAQBPBAEA2AQBAPsEAQCXBQEAoQUBAKMFAQCxBQEAswUBALkFAQC7BQEAvAUBAMAMAQDyDAEAwBgBAN8YAQBgbgEAf24BABrUAQAz1AEATtQBAFTUAQBW1AEAZ9QBAILUAQCb1AEAttQBALnUAQC71AEAu9QBAL3UAQDD1AEAxdQBAM/UAQDq1AEAA9UBAB7VAQA31QEAUtUBAGvVAQCG1QEAn9UBALrVAQDT1QEA7tUBAAfWAQAi1gEAO9YBAFbWAQBv1gEAitYBAKXWAQDC1gEA2tYBANzWAQDh1gEA/NYBABTXAQAW1wEAG9cBADbXAQBO1wEAUNcBAFXXAQBw1wEAiNcBAIrXAQCP1wEAqtcBAMLXAQDE1wEAydcBAMvXAQDL1wEAAN8BAAnfAQAL3wEAHt8BACXfAQAq3wEAIukBAEPpAQAAAwAAbwMAAIMEAACJBAAAkQUAAL0FAAC/BQAAvwUAAMEFAADCBQAAxAUAAMUFAADHBQAAxwUAABAGAAAaBgAASwYAAF8GAABwBgAAcAYAANYGAADcBgAA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oB4AAKIeAACiHgAApB4AAKQeAACmHgAAph4AAKgeAACoHgAAqh4AAKoeAACsHgAArB4AAK4eAACuHgAAsB4AALAeAACyHgAAsh4AALQeAAC0HgAAth4AALYeAAC4HgAAuB4AALoeAAC6HgAAvB4AALweAAC+HgAAvh4AAMAeAADAHgAAwh4AAMIeAADEHgAAxB4AAMYeAADGHgAAyB4AAMgeAADKHgAAyh4AAMweAADMHgAAzh4AAM4eAADQHgAA0B4AANIeAADSHgAA1B4AANQeAADWHgAA1h4AANgeAADYHgAA2h4AANoeAADcHgAA3B4AAN4eAADeHgAA4B4AAOAeAADiHgAA4h4AAOQeAADkHgAA5h4AAOYeAADoHgAA6B4AAOoeAADqHgAA7B4AAOweAADuHgAA7h4AAPAeAADwHgAA8h4AAPIeAAD0HgAA9B4AAPYeAAD2HgAA+B4AAPgeAAD6HgAA+h4AAPweAAD8HgAA/h4AAP4eAAAIHwAADx8AABgfAAAdHwAAKB8AAC8fAAA4HwAAPx8AAEgfAABNHwAAWR8AAFkfAABbHwAAWx8AAF0fAABdHwAAXx8AAF8fAABoHwAAbx8AALgfAAC7HwAAyB8AAMsfAADYHwAA2x8AAOgfAADsHwAA+B8AAPsfAAACIQAAAiEAAAchAAAHIQAACyEAAA0hAAAQIQAAEiEAABUhAAAVIQAAGSEAAB0hAAAkIQAAJCEAACYhAAAmIQAAKCEAACghAAAqIQAALSEAADAhAAAzIQAAPiEAAD8hAABFIQAARSEAAIMhAACDIQAAACwAAC8sAABgLAAAYCwAAGIsAABkLAAAZywAAGcsAABpLAAAaSwAAGssAABrLAAAbSwAAHAsAAByLAAAciwAAHUsAAB1LAAAfiwAAIAsAACCLAAAgiwAAIQsAACELAAAhiwAAIYsAACILAAAiCwAAIosAACKLAAAjCwAAIwsAACOLAAAjiwAAJAsAACQLAAAkiwAAJIsAACULAAAlCwAAJYsAACWLAAAmCwAAJgsAACaLAAAmiwAAJwsAACcLAAAniwAAJ4sAACgLAAAoCwAAKIsAACiLAAApCwAAKQsAACmLAAApiwAAKgsAACoLAAAqiwAAKosAACsLAAArCwAAK4sAACuLAAAsCwAALAsAACyLAAAsiwAALQsAAC0LAAAtiwAALYsAAC4LAAAuCwAALosAAC6LAAAvCwAALwsAAC+LAAAviwAAMAsAADALAAAwiwAAMIsAADELAAAxCwAAMYsAADGLAAAyCwAAMgsAADKLAAAyiwAAMwsAADMLAAAziwAAM4sAADQLAAA0CwAANIsAADSLAAA1CwAANQsAADWLAAA1iwAANgsAADYLAAA2iwAANosAADcLAAA3CwAAN4sAADeLAAA4CwAAOAsAADiLAAA4iwAAOssAADrLAAA7SwAAO0sAADyLAAA8iwAAECmAABApgAAQqYAAEKmAABEpgAARKYAAEamAABGpgAASKYAAEimAABKpgAASqYAAEymAABMpgAATqYAAE6mAABQpgAAUKYAAFKmAABSpgAAVKYAAFSmAABWpgAAVqYAAFimAABYpgAAWqYAAFqmAABcpgAAXKYAAF6mAABepgAAYKYAAGCmAABipgAAYqYAAGSmAABkpgAAZqYAAGamAABopgAAaKYAAGqmAABqpgAAbKYAAGymAACApgAAgKYAAIKmAACCpgAAhKYAAISmAACGpgAAhqYAAIimAACIpgAAiqYAAIqmAACMpgAAjKYAAI6mAACOpgAAkKYAAJCmAACSpgAAkqYAAJSmAACUpgAAlqYAAJamAACYpgAAmKYAAJqmAACapgAAIqcAACKnAAAkpwAAJKcAACanAAAmpwAAKKcAACinAAAqpwAAKqcAACynAAAspwAALqcAAC6nAAAypwAAMqcAADSnAAA0pwAANqcAADanAAA4pwAAOKcAADqnAAA6pwAAPKcAADynAAA+pwAAPqcAAECnAABApwAAQqcAAEKnAABEpwAARKcAAEanAABGpwAASKcAAEinAABKpwAASqcAAEynAABMpwAATqcAAE6nAABQpwAAUKcAAFKnAABSpwAAVKcAAFSnAABWpwAAVqcAAFinAABYpwAAWqcAAFqnAABcpwAAXKcAAF6nAABepwAAYKcAAGCnAABipwAAYqcAAGSnAABkpwAAZqcAAGanAABopwAAaKcAAGqnAABqpwAAbKcAAGynAABupwAAbqcAAHmnAAB5pwAAe6cAAHunAAB9pwAAfqcAAICnAACApwAAgqcAAIKnAACEpwAAhKcAAIanAACGpwAAi6cAAIunAACNpwAAjacAAJCnAACQpwAAkqcAAJKnAACWpwAA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EwsAACgLAAAqCwAAMAsAADILAAAzCwAANQsAADkLAAA8CwAARAsAAEcLAABICwAASwsAAE0LAABVCwAAVwsAAFwLAABdCwAAXwsAAGMLAABmCwAAdwsAANocAADaHAAA8hwAAPIcAAACGAAAAxgAAAUYAAAFGAAAQKgAAHeoAABABgAAQAYAAIALAQCRCwEAmQsBAJwLAQCpCwEArwsBAFEJAABRCQAA1xwAANccAADZHAAA2RwAANwcAADdHAAA4BwAAOAcAACAEQEA3xEBAGQJAABlCQAAgQ0AAIMNAACFDQAAlg0AAJoNAACxDQAAsw0AALsNAAC9DQAAvQ0AAMANAADGDQAAyg0AAMoNAADPDQAA1A0AANYNAADWDQAA2A0AAN8NAADmDQAA7w0AAPINAAD0DQAA4REBAPQRAQBABgAAQAYAADAPAQBZDwEAZAkAAGUJAADmCQAA7wkAAACoAAAsqAAADAYAAAwGAAAbBgAAHAYAAB8GAAAfBgAAQAYAAEAGAABLBgAAVQYAAHAGAABwBgAAAAcAAA0HAAAPBwAASgcAAE0HAABPBwAAYAgAAGoIAAD4HQAA+B0AAPodAAD6HQAAABcAABUXAAAfFwAAHxcAADUXAAA2FwAANRcAADYXAABgFwAAbBcAAG4XAABwFwAAchcAAHMXAABAEAAASRAAAFAZAABtGQAAcBkAAHQZAABkCQAAZQkAADCoAAA5qAAAgBYBALkWAQDAFgEAyRYBAFEJAABSCQAAZAkAAGUJAACCCwAAgwsAAIULAACKCwAAjgsAAJALAACSCwAAlQsAAJkLAACaCwAAnAsAAJwLAACeCwAAnwsAAKMLAACkCwAAqAsAAKoLAACuCwAAuQsAAL4LAADCCwAAxgsAAMgLAADKCwAAzQsAANALAADQCwAA1wsAANcLAADmCwAA+gsAANocAADaHAAA86gAAPOoAAABEwEAARMBAAMTAQADEwEAOxMBADwTAQDAHwEA8R8BAP8fAQD/HwEAUQkAAFIJAABkCQAAZQkAAAAMAAAMDAAADgwAABAMAAASDAAAKAwAACoMAAA5DAAAPAwAAEQMAABGDAAASAwAAEoMAABNDAAAVQwAAFYMAABYDAAAWgwAAF0MAABdDAAAYAwAAGMMAABmDAAAbwwAAHcMAAB/DAAA2hwAANocAADyHAAA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aB4AAGgeAABqHgAAah4AAGweAABsHgAAbh4AAG4eAABwHgAAcB4AAHIeAAByHgAAdB4AAHQeAAB2HgAAdh4AAHgeAAB4HgAAeh4AAHoeAAB8HgAAfB4AAH4eAAB+HgAAgB4AAIAeAACCHgAAgh4AAIQeAACEHgAAhh4AAIYeAACIHgAAiB4AAIoeAACKHgAAjB4AAIweAACOHgAAjh4AAJAeAACQHgAAkh4AAJIeAACUHgAAlB4AAJoeAACbHgAAnh4AAJ4eAACgHgAAoB4AAKIeAACiHgAApB4AAKQeAACmHgAAph4AAKgeAACoHgAAqh4AAKoeAACsHgAArB4AAK4eAACuHgAAsB4AALAeAACyHgAAsh4AALQeAAC0HgAAth4AALYeAAC4HgAAuB4AALoeAAC6HgAAvB4AALweAAC+HgAAvh4AAMAeAADAHgAAwh4AAMIeAADEHgAAxB4AAMYeAADGHgAAyB4AAMgeAADKHgAAyh4AAMweAADMHgAAzh4AAM4eAADQHgAA0B4AANIeAADSHgAA1B4AANQeAADWHgAA1h4AANgeAADYHgAA2h4AANoeAADcHgAA3B4AAN4eAADeHgAA4B4AAOAeAADiHgAA4h4AAOQeAADkHgAA5h4AAOYeAADoHgAA6B4AAOoeAADqHgAA7B4AAOweAADuHgAA7h4AAPAeAADwHgAA8h4AAPIeAAD0HgAA9B4AAPYeAAD2HgAA+B4AAPgeAAD6HgAA+h4AAPweAAD8HgAA/h4AAP4eAAAIHwAADx8AABgfAAAdHwAAKB8AAC8fAAA4HwAAPx8AAEgfAABNHwAAWR8AAFkfAABbHwAAWx8AAF0fAABdHwAAXx8AAF8fAABoHwAAbx8AAIAfAACvHwAAsh8AALQfAAC3HwAAvB8AAMIfAADEHwAAxx8AAMwfAADYHwAA2x8AAOgfAADsHwAA8h8AAPQfAAD3HwAA/B8AACYhAAAmIQAAKiEAACshAAAyIQAAMiEAAGAhAABvIQAAgyEAAIMhAAC2JAAAzyQAAAAsAAAvLAAAYCwAAGAsAABiLAAAZCwAAGcsAABnLAAAaSwAAGksAABrLAAAaywAAG0sAABwLAAAciwAAHIsAAB1LAAAdSwAAH4sAACALAAAgiwAAIIsAACELAAAhCwAAIYsAACGLAAAiCwAAIgsAACKLAAAiiwAAIwsAACMLAAAjiwAAI4sAACQLAAAkCwAAJIsAACSLAAAlCwAAJQsAACWLAAAliwAAJgsAACYLAAAmiwAAJosAACcLAAAnCwAAJ4sAACeLAAAoCwAAKAsAACiLAAAoiwAAKQsAACkLAAApiwAAKYsAACoLAAAqCwAAKosAACqLAAArCwAAKwsAACuLAAAriwAALAsAACwLAAAsiwAALIsAAC0LAAAtCwAALYsAAC2LAAAuCwAALgsAAC6LAAAuiwAALwsAAC8LAAAviwAAL4sAADALAAAwCwAAMIsAADCLAAAxCwAAMQsAADGLAAAxiwAAMgsAADILAAAyiwAAMosAADMLAAAzCwAAM4sAADOLAAA0CwAANAsAADSLAAA0iwAANQsAADULAAA1iwAANYsAADYLAAA2CwAANosAADaLAAA3CwAANwsAADeLAAA3iwAAOAsAADgLAAA4iwAAOIsAADrLAAA6ywAAO0sAADtLAAA8iwAAPIsAABApgAAQKYAAEKmAABCpgAARKYAAESmAABGpgAARqYAAEimAABIpgAASqYAAEqmAABMpgAATKYAAE6mAABOpgAAUKYAAFCmAABSpgAAUqYAAFSmAABUpgAAVqYAAFamAABYpgAAWKYAAFqmAABapgAAXKYAAFymAABepgAAXqYAAGCmAABgpgAAYqYAAGKmAABkpgAAZKYAAGamAABmpgAAaKYAAGimAABqpgAAaqYAAGymAABspgAAgKYAAICmAACCpgAAgqYAAISmAACEpgAAhqYAAIamAACIpgAAiKYAAIqmAACKpgAAjKYAAIymAACOpgAAjqYAAJCmAACQpgAAkqYAAJKmAACUpgAAlKYAAJamAACWpgAAmKYAAJimAACapgAAmqYAACKnAAAipwAAJKcAACSnAAAmpwAAJqcAACinAAAopwAAKqcAACqnAAAspwAALKcAAC6nAAAupwAAMqcAADKnAAA0pwAANKcAADanAAA2pwAAOKcAADinAAA6pwAAOqcAADynAAA8pwAAPqcAAD6nAABApwAAQKcAAEKnAABCpwAARKcAAESnAABGpwAARqcAAEinAABIpwAASqcAAEqnAABMpwAATKcAAE6nAABOpwAAUKcAAFCnAABSpwAAUqcAAFSnAABUpwAAVqcAAFanAABYpwAAWKcAAFqnAABapwAA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xB4AAMYeAADGHgAAyB4AAMgeAADKHgAAyh4AAMweAADMHgAAzh4AAM4eAADQHgAA0B4AANIeAADSHgAA1B4AANQeAADWHgAA1h4AANgeAADYHgAA2h4AANoeAADcHgAA3B4AAN4eAADeHgAA4B4AAOAeAADiHgAA4h4AAOQeAADkHgAA5h4AAOYeAADoHgAA6B4AAOoeAADqHgAA7B4AAOweAADuHgAA7h4AAPAeAADwHgAA8h4AAPIeAAD0HgAA9B4AAPYeAAD2HgAA+B4AAPgeAAD6HgAA+h4AAPweAAD8HgAA/h4AAP4eAAAIHwAADx8AABgfAAAdHwAAKB8AAC8fAAA4HwAAPx8AAEgfAABNHwAAWR8AAFkfAABbHwAAWx8AAF0fAABdHwAAXx8AAF8fAABoHwAAbx8AAIgfAACPHwAAmB8AAJ8fAACoHwAArx8AALgfAAC8HwAAyB8AAMwfAADYHwAA2x8AAOgfAADsHwAA+B8AAPwfAAAmIQAAJiEAACohAAArIQAAMiEAADIhAABgIQAAbyEAAIMhAACDIQAAtiQAAM8kAAAALAAALywAAGAsAABgLAAAYiwAAGQsAABnLAAAZywAAGksAABpLAAAaywAAGssAABtLAAAcCwAAHIsAAByLAAAdSwAAHUsAAB+LAAAgCwAAIIsAACCLAAAhCwAAIQsAACGLAAAhiwAAIgsAACILAAAiiwAAIosAACMLAAAjCwAAI4sAACOLAAAkCwAAJAsAACSLAAAkiwAAJQsAACULAAAliwAAJYsAACYLAAAmCwAAJosAACaLAAAnCwAAJwsAACeLAAAniwAAKAsAACgLAAAoiwAAKIsAACkLAAApCwAAKYsAACmLAAAqCwAAKgsAACqLAAAqiwAAKwsAACsLAAAriwAAK4sAACwLAAAsCwAALIsAACyLAAAtCwAALQsAAC2LAAAtiwAALgsAAC4LAAAuiwAALosAAC8LAAAvCwAAL4sAAC+LAAAwCwAAMAsAADCLAAAwiwAAMQsAADELAAAxiwAAMYsAADILAAAyCwAAMosAADKLAAAzCwAAMwsAADOLAAAziwAANAsAADQLAAA0iwAANIsAADULAAA1CwAANYsAADWLAAA2CwAANgsAADaLAAA2iwAANwsAADcLAAA3iwAAN4sAADgLAAA4CwAAOIsAADiLAAA6ywAAOssAADtLAAA7SwAAPIsAADyLAAAQKYAAECmAABCpgAAQqYAAESmAABEpgAARqYAAEamAABIpgAASKYAAEqmAABKpgAATKYAAEymAABOpgAATqYAAFCmAABQpgAAUqYAAFKmAABUpgAAVKYAAFamAABWpgAAWKYAAFimAABapgAAWqYAAFymAABcpgAAXqYAAF6mAABgpgAAYKYAAGKmAABipgAAZKYAAGSmAABmpgAAZqYAAGimAABopgAAaqYAAGqmAABspgAAbKYAAICmAACApgAAgqYAAIKmAACEpgAAhKYAAIamAACGpgAAiKYAAIimAACKpgAAiqYAAIymAACMpgAAjqYAAI6mAACQpgAAkKYAAJKmAACSpgAAlKYAAJSmAACWpgAAlqYAAJimAACYpgAAmqYAAJqmAAAipwAAIqcAACSnAAAkpwAAJqcAACanAAAopwAAKKcAACqnAAAqpwAALKcAACynAAAupwAALqcAADKnAAAypwAANKcAADSnAAA2pwAANqcAADinAAA4pwAAOqcAADqnAAA8pwAAPKcAAD6nAAA+pwAAQKcAAECnAABCpwAAQqcAAESnAABEpwAARqcAAEanAABIpwAASKcAAEqnAABKpwAATKcAAEynAABOpwAATqcAAFCnAABQpwAAUqcAAFKnAABUpwAAVKcAAFanAABWpwAAWKcAAFinAABapwAAWqcAAFynAABcpwAAXqcAAF6nAABgpwAAYKcAAGKnAABipwAAZKcAAGSnAABmpwAAZqcAAGinAABopwAAaqcAAGqnAABspwAAbKcAAG6nAABupwAAeacAAHmnAAB7pwAAe6cAAH2nAAB+pwAAgKcAAICnAACCpwAAgqcAAISnAACEpwAAhqcAAIanAACLpwAAi6cAAI2nAACNpwAAkKcAAJCnAACSpwAAkqcAAJanAACWpwAAmKcAAJinAACapwAAmqcAAJynAACcpwAAnqcAAJ6nAACgpwAAoKcAAKKnAACipwAApKcAAKSnAACmpwAApqcAAKinAACopwAAqqcAAK6nAACwpwAAtKcAALanAAC2pwAAuKcAALinAAC6pwAAuqcAALynAAC8pwAAvqcAAL6nAADApwAAwKcAAMKnAADCpwAAxKcAAMenAADJpwAAyacAANCnAADQpwAA1qcAANanAADYpwAA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RR4AAEUeAABHHgAARx4AAEkeAABJHgAASx4AAEseAABNHgAATR4AAE8eAABPHgAAUR4AAFEeAABTHgAAUx4AAFUeAABVHgAAVx4AAFceAABZHgAAWR4AAFseAABbHgAAXR4AAF0eAABfHgAAXx4AAGEeAABhHgAAYx4AAGMeAABlHgAAZR4AAGceAABnHgAAaR4AAGkeAABrHgAAax4AAG0eAABtHgAAbx4AAG8eAABxHgAAcR4AAHMeAABzHgAAdR4AAHUeAAB3HgAAdx4AAHkeAAB5HgAAex4AAHseAAB9HgAAfR4AAH8eAAB/HgAAgR4AAIEeAACDHgAAgx4AAIUeAACFHgAAhx4AAIceAACJHgAAiR4AAIseAACLHgAAjR4AAI0eAACPHgAAjx4AAJEeAACRHgAAkx4AAJMeAACVHgAAmx4AAKEeAAChHgAAox4AAKMeAAClHgAApR4AAKceAACnHgAAqR4AAKkeAACrHgAAqx4AAK0eAACtHgAArx4AAK8eAACxHgAAsR4AALMeAACzHgAAtR4AALUeAAC3HgAAtx4AALkeAAC5HgAAux4AALseAAC9HgAAvR4AAL8eAAC/HgAAwR4AAMEeAADDHgAAwx4AAMUeAADFHgAAxx4AAMceAADJHgAAyR4AAMseAADLHgAAzR4AAM0eAADPHgAAzx4AANEeAADRHgAA0x4AANMeAADVHgAA1R4AANceAADXHgAA2R4AANkeAADbHgAA2x4AAN0eAADdHgAA3x4AAN8eAADhHgAA4R4AAOMeAADjHgAA5R4AAOUeAADnHgAA5x4AAOkeAADpHgAA6x4AAOseAADtHgAA7R4AAO8eAADvHgAA8R4AAPEeAADzHgAA8x4AAPUeAAD1HgAA9x4AAPceAAD5HgAA+R4AAPseAAD7HgAA/R4AAP0eAAD/HgAABx8AABAfAAAVHwAAIB8AACcfAAAwHwAANx8AAEAfAABFHwAAUB8AAFcfAABgHwAAZx8AAHAfAAB9HwAAgB8AAIcfAACQHwAAlx8AAKAfAACnHwAAsB8AALQfAAC2HwAAtx8AAL4fAAC+HwAAwh8AAMQfAADGHwAAxx8AANAfAADTHwAA1h8AANcfAADgHwAA5x8AAPIfAAD0HwAA9h8AAPcfAABOIQAATiEAAHAhAAB/IQAAhCEAAIQhAADQJAAA6SQAADAsAABfLAAAYSwAAGEsAABlLAAAZiwAAGgsAABoLAAAaiwAAGosAABsLAAAbCwAAHMsAABzLAAAdiwAAHYsAACBLAAAgSwAAIMsAACDLAAAhSwAAIUsAACHLAAAhywAAIksAACJLAAAiywAAIssAACNLAAAjSwAAI8sAACPLAAAkSwAAJEsAACTLAAAkywAAJUsAACVLAAAlywAAJcsAACZLAAAmSwAAJssAACbLAAAnSwAAJ0sAACfLAAAnywAAKEsAAChLAAAoywAAKMsAAClLAAApSwAAKcsAACnLAAAqSwAAKksAACrLAAAqywAAK0sAACtLAAArywAAK8sAACxLAAAsSwAALMsAACzLAAAtSwAALUsAAC3LAAAtywAALksAAC5LAAAuywAALssAAC9LAAAvSwAAL8sAAC/LAAAwSwAAMEsAADDLAAAwywAAMUsAADFLAAAxywAAMcsAADJLAAAySwAAMssAADLLAAAzSwAAM0sAADPLAAAzywAANEsAADRLAAA0ywAANMsAADVLAAA1SwAANcsAADXLAAA2SwAANksAADbLAAA2ywAAN0sAADdLAAA3ywAAN8sAADhLAAA4SwAAOMsAADjLAAA7CwAAOwsAADuLAAA7iwAAPMsAADzLAAAAC0AACUtAAAnLQAAJy0AAC0tAAAtLQAAQaYAAEGmAABDpgAAQ6YAAEWmAABFpgAAR6YAAEemAABJpgAASaYAAEumAABLpgAATaYAAE2mAABPpgAAT6YAAFGmAABRpgAAU6YAAFOmAABVpgAAVaYAAFemAABXpgAAWaYAAFmmAABbpgAAW6YAAF2mAABdpgAAX6YAAF+mAABhpgAAYaYAAGOmAABjpgAAZaYAAGWmAABnpgAAZ6YAAGmmAABppgAAa6YAAGumAABtpgAAbaYAAIGmAACBpgAAg6YAAIOmAACFpgAAhaYAAIemAACHpgAAiaYAAImmAACLpgAAi6YAAI2mAACNpgAAj6YAAI+mAACRpgAAkaYAAJOmAACTpgAAlaYAAJWmAACXpgAAl6YAAJmmAACZpgAAm6YAAJumAAAjpwAAI6cAACWnAAAlpwAAJ6cAACenAAAppwAAKacAACunAAArpwAALacAAC2nAAAvpwAAL6cAADOnAAAzpwAANacAADWnAAA3pwAAN6cAADmnAAA5pwAA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rx4AAK8eAACxHgAAsR4AALMeAACzHgAAtR4AALUeAAC3HgAAtx4AALkeAAC5HgAAux4AALseAAC9HgAAvR4AAL8eAAC/HgAAwR4AAMEeAADDHgAAwx4AAMUeAADFHgAAxx4AAMceAADJHgAAyR4AAMseAADLHgAAzR4AAM0eAADPHgAAzx4AANEeAADRHgAA0x4AANMeAADVHgAA1R4AANceAADXHgAA2R4AANkeAADbHgAA2x4AAN0eAADdHgAA3x4AAN8eAADhHgAA4R4AAOMeAADjHgAA5R4AAOUeAADnHgAA5x4AAOkeAADpHgAA6x4AAOseAADtHgAA7R4AAO8eAADvHgAA8R4AAPEeAADzHgAA8x4AAPUeAAD1HgAA9x4AAPceAAD5HgAA+R4AAPseAAD7HgAA/R4AAP0eAAD/HgAABx8AABAfAAAVHwAAIB8AACcfAAAwHwAANx8AAEAfAABFHwAAUB8AAFcfAABgHwAAZx8AAHAfAAB9HwAAgB8AALQfAAC2HwAAtx8AALwfAAC8HwAAvh8AAL4fAADCHwAAxB8AAMYfAADHHwAAzB8AAMwfAADQHwAA0x8AANYfAADXHwAA4B8AAOcfAADyHwAA9B8AAPYfAAD3HwAA/B8AAPwfAABOIQAATiEAAHAhAAB/IQAAhCEAAIQhAADQJAAA6SQAADAsAABfLAAAYSwAAGEsAABlLAAAZiwAAGgsAABoLAAAaiwAAGosAABsLAAAbCwAAHMsAABzLAAAdiwAAHYsAACBLAAAgSwAAIMsAACDLAAAhSwAAIUsAACHLAAAhywAAIksAACJLAAAiywAAIssAACNLAAAjSwAAI8sAACPLAAAkSwAAJEsAACTLAAAkywAAJUsAACVLAAAlywAAJcsAACZLAAAmSwAAJssAACbLAAAnSwAAJ0sAACfLAAAnywAAKEsAAChLAAAoywAAKMsAAClLAAApSwAAKcsAACnLAAAqSwAAKksAACrLAAAqywAAK0sAACtLAAArywAAK8sAACxLAAAsSwAALMsAACzLAAAtSwAALUsAAC3LAAAtywAALksAAC5LAAAuywAALssAAC9LAAAvSwAAL8sAAC/LAAAwSwAAMEsAADDLAAAwywAAMUsAADFLAAAxywAAMcsAADJLAAAySwAAMssAADLLAAAzSwAAM0sAADPLAAAzywAANEsAADRLAAA0ywAANMsAADVLAAA1SwAANcsAADXLAAA2SwAANksAADbLAAA2ywAAN0sAADdLAAA3ywAAN8sAADhLAAA4SwAAOMsAADjLAAA7CwAAOwsAADuLAAA7iwAAPMsAADzLAAAAC0AACUtAAAnLQAAJy0AAC0tAAAtLQAAQaYAAEGmAABDpgAAQ6YAAEWmAABFpgAAR6YAAEemAABJpgAASaYAAEumAABLpgAATaYAAE2mAABPpgAAT6YAAFGmAABRpgAAU6YAAFOmAABVpgAAVaYAAFemAABXpgAAWaYAAFmmAABbpgAAW6YAAF2mAABdpgAAX6YAAF+mAABhpgAAYaYAAGOmAABjpgAAZaYAAGWmAABnpgAAZ6YAAGmmAABppgAAa6YAAGumAABtpgAAbaYAAIGmAACBpgAAg6YAAIOmAACFpgAAhaYAAIemAACHpgAAiaYAAImmAACLpgAAi6YAAI2mAACNpgAAj6YAAI+mAACRpgAAkaYAAJOmAACTpgAAlaYAAJWmAACXpgAAl6YAAJmmAACZpgAAm6YAAJumAAAjpwAAI6cAACWnAAAlpwAAJ6cAACenAAAppwAAKacAACunAAArpwAALacAAC2nAAAvpwAAL6cAADOnAAAzpwAANacAADWnAAA3pwAAN6cAADmnAAA5pwAAO6cAADunAAA9pwAAPacAAD+nAAA/pwAAQacAAEGnAABDpwAAQ6cAAEWnAABFpwAAR6cAAEenAABJpwAASacAAEunAABLpwAATacAAE2nAABPpwAAT6cAAFGnAABRpwAAU6cAAFOnAABVpwAAVacAAFenAABXpwAAWacAAFmnAABbpwAAW6cAAF2nAABdpwAAX6cAAF+nAABhpwAAYacAAGOnAABjpwAAZacAAGWnAABnpwAAZ6cAAGmnAABppwAAa6cAAGunAABtpwAAbacAAG+nAABvpwAAeqcAAHqnAAB8pwAAfKcAAH+nAAB/pwAAgacAAIGnAACDpwAAg6cAAIWnAACFpwAAh6cAAIenAACMpwAAjKcAAJGnAACRpwAAk6cAAJSnAACXpwAAl6cAAJmnAACZpwAAm6cAAJunAACdpwAAnacAAJ+nAACfpwAAoacAAKGnAACjpwAAo6cAAKWnAAClpwAAp6cAAKenAACppwAAqacAALWnAAC1pwAA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vx0AAAEeAAABHgAAAx4AAAMeAAAFHgAABR4AAAceAAAHHgAACR4AAAkeAAALHgAACx4AAA0eAAANHgAADx4AAA8eAAARHgAAER4AABMeAAATHgAAFR4AABUeAAAXHgAAFx4AABkeAAAZHgAAGx4AABseAAAdHgAAHR4AAB8eAAAfHgAAIR4AACEeAAAjHgAAIx4AACUeAAAlHgAAJx4AACceAAApHgAAKR4AACseAAArHgAALR4AAC0eAAAvHgAALx4AADEeAAAxHgAAMx4AADMeAAA1HgAANR4AADceAAA3HgAAOR4AADkeAAA7HgAAOx4AAD0eAAA9HgAAPx4AAD8eAABBHgAAQR4AAEMeAABDHgAARR4AAEUeAABHHgAARx4AAEkeAABJHgAASx4AAEseAABNHgAATR4AAE8eAABPHgAAUR4AAFEeAABTHgAAUx4AAFUeAABVHgAAVx4AAFceAABZHgAAWR4AAFseAABbHgAAXR4AAF0eAABfHgAAXx4AAGEeAABhHgAAYx4AAGMeAABlHgAAZR4AAGceAABnHgAAaR4AAGkeAABrHgAAax4AAG0eAABtHgAAbx4AAG8eAABxHgAAcR4AAHMeAABzHgAAdR4AAHUeAAB3HgAAdx4AAHkeAAB5HgAAex4AAHseAAB9HgAAfR4AAH8eAAB/HgAAgR4AAIEeAACDHgAAgx4AAIUeAACFHgAAhx4AAIceAACJHgAAiR4AAIseAACLHgAAjR4AAI0eAACPHgAAjx4AAJEeAACRHgAAkx4AAJMeAACVHgAAnR4AAJ8eAACfHgAAoR4AAKEeAACjHgAAox4AAKUeAAClHgAApx4AAKceAACpHgAAqR4AAKseAACrHgAArR4AAK0eAACvHgAArx4AALEeAACxHgAAsx4AALMeAAC1HgAAtR4AALceAAC3HgAAuR4AALkeAAC7HgAAux4AAL0eAAC9HgAAvx4AAL8eAADBHgAAwR4AAMMeAADDHgAAxR4AAMUeAADHHgAAxx4AAMkeAADJHgAAyx4AAMseAADNHgAAzR4AAM8eAADPHgAA0R4AANEeAADTHgAA0x4AANUeAADVHgAA1x4AANceAADZHgAA2R4AANseAADbHgAA3R4AAN0eAADfHgAA3x4AAOEeAADhHgAA4x4AAOMeAADlHgAA5R4AAOceAADnHgAA6R4AAOkeAADrHgAA6x4AAO0eAADtHgAA7x4AAO8eAADxHgAA8R4AAPMeAADzHgAA9R4AAPUeAAD3HgAA9x4AAPkeAAD5HgAA+x4AAPseAAD9HgAA/R4AAP8eAAAHHwAAEB8AABUfAAAgHwAAJx8AADAfAAA3HwAAQB8AAEUfAABQHwAAVx8AAGAfAABnHwAAcB8AAH0fAACAHwAAhx8AAJAfAACXHwAAoB8AAKcfAACwHwAAtB8AALYfAAC3HwAAvh8AAL4fAADCHwAAxB8AAMYfAADHHwAA0B8AANMfAADWHwAA1x8AAOAfAADnHwAA8h8AAPQfAAD2HwAA9x8AAHEgAABxIAAAfyAAAH8gAACQIAAAnCAAAAohAAAKIQAADiEAAA8hAAATIQAAEyEAAC8hAAAvIQAANCEAADQhAAA5IQAAOSEAADwhAAA9IQAARiEAAEkhAABOIQAATiEAAHAhAAB/IQAAhCEAAIQhAADQJAAA6SQAADAsAABfLAAAYSwAAGEsAABlLAAAZiwAAGgsAABoLAAAaiwAAGosAABsLAAAbCwAAHEsAABxLAAAcywAAHQsAAB2LAAAfSwAAIEsAACBLAAAgywAAIMsAACFLAAAhSwAAIcsAACHLAAAiSwAAIksAACLLAAAiywAAI0sAACNLAAAjywAAI8sAACRLAAAkSwAAJMsAACTLAAAlSwAAJUsAACXLAAAlywAAJksAACZLAAAmywAAJssAACdLAAAnSwAAJ8sAACfLAAAoSwAAKEsAACjLAAAoywAAKUsAAClLAAApywAAKcsAACpLAAAqSwAAKssAACrLAAArSwAAK0sAACvLAAArywAALEsAACxLAAAsywAALMsAAC1LAAAtSwAALcsAAC3LAAAuSwAALksAAC7LAAAuywAAL0sAAC9LAAAvywAAL8sAADBLAAAwSwAAMMsAADDLAAAxSwAAMUsAADHLAAAxywAAMksAADJLAAAyywAAMssAADNLAAAzSwAAM8sAADPLAAA0SwAANEsAADTLAAA0ywAANUsAADVLAAA1ywAANcsAADZLAAA2SwAANssAADbLAAA3SwAAN0sAADfLAAA3ywAAOEsAADhLAAA4ywAAOQsAADsLAAA7CwAAO4sAADuLAAA8ywAAPMsAAAALQAAJS0AACctAAAnLQAALS0AAC0tAABBpgAAQaYAAEOmAABDpgAARaYAAEWmAABHpgAAR6YAAEmmAABJpgAAS6YAAEumAABNpgAATaYAAE+mAABPpgAAUaYAAFGmAABTpgAAU6YAAFWmAABVpgAAV6YAAFemAABZpgAAWaYAAFumAABbpgAAXaYAAF2mAABfpgAAX6YAAGGmAABhpgAAY6YAAGOmAABlpgAAZaYAAGemAABnpgAAaaYAAGmmAABrpgAAa6YAAG2mAABtpgAAgaYAAIGmAACDpgAAg6YAAIWmAACFpgAAh6YAAIemAACJpgAAiaYAAIumAACLpgAAjaYAAI2mAACPpgAAj6YAAJGmAACRpgAAk6YAAJOmAACVpgAAlaYAAJemAACXpgAAmaYAAJmmAACbpgAAnaYAACOnAAAjpwAAJacAACWnAAAnpwAAJ6cAACmnAAAppwAAK6cAACunAAAtpwAALacAAC+nAAAxpwAAM6cAADOnAAA1pwAANacAADenAAA3pwAAOacAADmnAAA7pwAAO6cAAD2nAAA9pwAAP6cAAD+nAABBpwAAQacAAEOnAABDpwAARacAAEWnAABHpwAAR6cAAEmnAABJpwAAS6cAAEunAABNpwAATacAAE+nAABPpwAAUacAAFGnAABTpwAAU6cAAFWnAABVpwAAV6cAAFenAABZpwAAWacAAFunAABbpwAAXacAAF2nAABfpwAAX6cAAGGnAABhpwAAY6cAAGOnAABlpwAAZacAAGenAABnpwAAaacAAGmnAABrpwAAa6cAAG2nAABtpwAAb6cAAHinAAB6pwAAeqcAAHynAAB8pwAAf6cAAH+nAACBpwAAgacAAIOnAACDpwAAhacAAIWnAACHpwAAh6cAAIynAACMpwAAjqcAAI6nAACRpwAAkacAAJOnAACVpwAAl6cAAJenAACZpwAAmacAAJunAACbpwAAnacAAJ2nAACfpwAAn6cAAKGnAAChpwAAo6cAAKOnAAClpwAApacAAKenAACnpwAAqacAAKmnAACvpwAAr6cAALWnAAC1pwAAt6cAALenAAC5pwAAuacAALunAAC7pwAAvacAAL2nAAC/pwAAv6cAAMGnAADBpwAAw6cAAMOnAADIpwAAyKcAAMqnAADKpwAA0acAANGnAADTpwAA06cAANWnAADVpwAA16cAANenAADZpwAA2acAAPKnAAD0pwAA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8B4AAPAeAADyHgAA8h4AAPQeAAD0HgAA9h4AAPYeAAD4HgAA+B4AAPoeAAD6HgAA/B4AAPweAAD+HgAA/h4AAAgfAAAPHwAAGB8AAB0fAAAoHwAALx8AADgfAAA/HwAASB8AAE0fAABZHwAAWR8AAFsfAABbHwAAXR8AAF0fAABfHwAAXx8AAGgfAABvHwAAuB8AALsfAADIHwAAyx8AANgfAADbHwAA6B8AAOwfAAD4HwAA+x8AAAIhAAACIQAAByEAAAchAAALIQAADSEAABAhAAASIQAAFSEAABUhAAAZIQAAHSEAACQhAAAkIQAAJiEAACYhAAAoIQAAKCEAACohAAAtIQAAMCEAADMhAAA+IQAAPyEAAEUhAABFIQAAYCEAAG8hAACDIQAAgyEAALYkAADPJAAAACwAAC8sAABgLAAAYCwAAGIsAABkLAAAZywAAGcsAABpLAAAaSwAAGssAABrLAAAbSwAAHAsAAByLAAAciwAAHUsAAB1LAAAfiwAAIAsAACCLAAAgiwAAIQsAACELAAAhiwAAIYsAACILAAAiCwAAIosAACKLAAAjCwAAIwsAACOLAAAjiwAAJAsAACQLAAAkiwAAJIsAACULAAAlCwAAJYsAACWLAAAmCwAAJgsAACaLAAAmiwAAJwsAACcLAAAniwAAJ4sAACgLAAAoCwAAKIsAACiLAAApCwAAKQsAACmLAAApiwAAKgsAACoLAAAqiwAAKosAACsLAAArCwAAK4sAACuLAAAsCwAALAsAACyLAAAsiwAALQsAAC0LAAAtiwAALYsAAC4LAAAuCwAALosAAC6LAAAvCwAALwsAAC+LAAAviwAAMAsAADALAAAwiwAAMIsAADELAAAxCwAAMYsAADGLAAAyCwAAMgsAADKLAAAyiwAAMwsAADMLAAAziwAAM4sAADQLAAA0CwAANIsAADSLAAA1CwAANQsAADWLAAA1iwAANgsAADYLAAA2iwAANosAADcLAAA3CwAAN4sAADeLAAA4CwAAOAsAADiLAAA4iwAAOssAADrLAAA7SwAAO0sAADyLAAA8iwAAECmAABApgAAQqYAAEKmAABEpgAARKYAAEamAABGpgAASKYAAEimAABKpgAASqYAAEymAABMpgAATqYAAE6mAABQpgAAUKYAAFKmAABSpgAAVKYAAFSmAABWpgAAVqYAAFimAABYpgAAWqYAAFqmAABcpgAAXKYAAF6mAABepgAAYKYAAGCmAABipgAAYqYAAGSmAABkpgAAZqYAAGamAABopgAAaKYAAGqmAABqpgAAbKYAAGymAACApgAAgKYAAIKmAACCpgAAhKYAAISmAACGpgAAhqYAAIimAACIpgAAiqYAAIqmAACMpgAAjKYAAI6mAACOpgAAkKYAAJCmAACSpgAAkqYAAJSmAACUpgAAlqYAAJamAACYpgAAmKYAAJqmAACapgAAIqcAACKnAAAkpwAAJKcAACanAAAmpwAAKKcAACinAAAqpwAAKqcAACynAAAspwAALqcAAC6nAAAypwAAMqcAADSnAAA0pwAANqcAADanAAA4pwAAOKcAADqnAAA6pwAAPKcAADynAAA+pwAAPqcAAECnAABApwAAQqcAAEKnAABEpwAARKcAAEanAABGpwAASKcAAEinAABKpwAASqcAAEynAABMpwAATqcAAE6nAABQpwAAUKcAAFKnAABSpwAAVKcAAFSnAABWpwAAVqcAAFinAABYpwAAWqcAAFqnAABcpwAAXKcAAF6nAABepwAAYKcAAGCnAABipwAAYqcAAGSnAABkpwAAZqcAAGanAABopwAAaKcAAGqnAABqpwAAbKcAAGynAABupwAAbqcAAHmnAAB5pwAAe6cAAHunAAB9pwAAfqcAAICnAACApwAAgqcAAIKnAACEpwAAhKcAAIanAACGpwAAi6cAAIunAACNpwAAjacAAJCnAACQpwAAkqcAAJKnAACWpwAAlqcAAJinAACYpwAAmqcAAJqnAACcpwAAnKcAAJ6nAACepwAAoKcAAKCnAACipwAAoqcAAKSnAACkpwAApqcAAKanAACopwAAqKcAAKqnAACupwAAsKcAALSnAAC2pwAAtqcAALinAAC4pwAAuqcAALqnAAC8pwAAvKcAAL6nAAC+pwAAwKcAAMCnAADCpwAAwqcAAMSnAADHpwAAyacAAMmnAADQpwAA0KcAANanAADWpwAA2KcAANinAAD1pwAA9acAACH/AAA6/wAAAAQBACcEAQCwBAEA0wQBAHAFAQB6BQEAfAUBAIoFAQCMBQEAkgUBAJQFAQCVBQEAgAwBALIMAQCgGAEAvxgBAEBuAQBfbgEAANQBABnUAQA01AEATdQBAGjUAQCB1AEA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fLAAAHywAACYsAAAmLAAALSwAAC0sAAA0LAAANCwAADssAAA7LAAAAixAAAIsQAAJLEAACSxAABAsQAAQLEAAFyxAABcsQAAeLEAAHixAACUsQAAlLEAALCxAACwsQAAzLEAAMyxAADosQAA6LEAAASyAAAEsgAAILIAACCyAAA8sgAAPLIAAFiyAABYsgAAdLIAAHSyAACQsgAAkLIAAKyyAACssgAAyLIAAMiyAADksgAA5LIAAACzAAAAswAAHLMAAByzAAA4swAAOLMAAFSzAABUswAAcLMAAHCzAACMswAAjLMAAKizAACoswAAxLMAAMSzAADgswAA4LMAAPyzAAD8swAAGLQAABi0AAA0tAAANLQAAFC0AABQtAAAbLQAAGy0AACItAAAiLQAAKS0AACktAAAwLQAAMC0AADctAAA3LQAAPi0AAD4tAAAFLUAABS1AAAwtQAAMLUAAEy1AABMtQAAaLUAAGi1AACEtQAAhLUAAKC1AACgtQAAvLUAALy1AADYtQAA2LUAAPS1AAD0tQAAELYAABC2AAAstgAALLYAAEi2AABItgAAZLYAAGS2AACAtgAAgLYAAJy2AACctgAAuLYAALi2AADUtgAA1LYAAPC2AADwtgAADLcAAAy3AAAotwAAKLcAAES3AABEtwAAYLcAAGC3AAB8twAAfLcAAJi3AACYtwAAtLcAALS3AADQtwAA0LcAAOy3AADstwAACLgAAAi4AAAkuAAAJLgAAEC4AABAuAAAXLgAAFy4AAB4uAAAeLgAAJS4AACUuAAAsLgAALC4AADMuAAAzLgAAOi4AADouAAABLkAAAS5AAAguQAAILkAADy5AAA8uQAAWLkAAFi5AAB0uQAAdLkAAJC5AACQuQAArLkAAKy5AADIuQAAyLkAAOS5AADkuQAAALoAAAC6AAAcugAAHLoAADi6AAA4ugAAVLoAAFS6AABwugAAcLoAAIy6AACMugAAqLoAAKi6AADEugAAxLoAAOC6AADgugAA/LoAAPy6AAAYuwAAGLsAADS7AAA0uwAAULsAAFC7AABsuwAAbLsAAIi7AACIuwAApLsAAKS7AADAuwAAwLsAANy7AADcuwAA+LsAAPi7AAAUvAAAFLwAADC8AAAwvAAATLwAAEy8AABovAAAaLwAAIS8AACEvAAAoLwAAKC8AAC8vAAA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EbYAACu2AAAttgAAR7YAAEm2AABjtgAAZbYAAH+2AACBtgAAm7YAAJ22AAC3tgAAubYAANO2AADVtgAA77YAAPG2AAALtwAADbcAACe3AAAptwAAQ7cAAEW3AABftwAAYbcAAHu3AAB9twAAl7cAAJm3AACztwAAtbcAAM+3AADRtwAA67cAAO23AAAHuAAACbgAACO4AAAluAAAP7gAAEG4AABbuAAAXbgAAHe4AAB5uAAAk7gAAJW4AACvuAAAsbgAAMu4AADNuAAA57gAAOm4AAADuQAABbkAAB+5AAAhuQAAO7kAAD25AABXuQAAWbkAAHO5AAB1uQAAj7kAAJG5AACruQAArbkAAMe5AADJuQAA47kAAOW5AAD/uQAAAboAABu6AAAdugAAN7oAADm6AABTugAAVboAAG+6AABxugAAi7oAAI26AACnugAAqboAAMO6AADFugAA37oAAOG6AAD7ugAA/boAABe7AAAZuwAAM7sAADW7AABPuwAAUbsAAGu7AABtuwAAh7sAAIm7AACjuwAApbsAAL+7AADBuwAA27sAAN27AAD3uwAA+bsAABO8AAAVvAAAL7wAADG8AABLvAAATbwAAGe8AABpvAAAg7wAAIW8AACfvAAAobwAALu8AAC9vAAA17wAANm8AADzvAAA9bwAAA+9AAARvQAAK70AAC29AABHvQAASb0AAGO9AABlvQAAf70AAIG9AACbvQAAnb0AALe9AAC5vQAA070AANW9AADvvQAA8b0AAAu+AAANvgAAJ74AACm+AABDvgAARb4AAF++AABhvgAAe74AAH2+AACXvgAAmb4AALO+AAC1vgAAz74AANG+AADrvgAA7b4AAAe/AAAJvwAAI78AACW/AAA/vwAAQb8AAFu/AABdvwAAd78AAHm/AACTvwAAlb8AAK+/AACxvwAAy78AAM2/AADnvwAA6b8AAAPAAAAFwAAAH8AAACHAAAA7wAAAPcAAAFfAAABZwAAAc8AAAHXAAACPwAAAkcAAAKvAAACtwAAAx8AAAMnAAADjwAAA5cAAAP/AAAABwQAAG8EAAB3BAAA3wQAAOcEAAFPBAABVwQAAb8EAAHHBAACLwQAAjcEAAKfBAACpwQAAw8EAAMXBAADfwQAA4cEAAPvBAAD9wQAAF8IAABnCAAAzwgAANcIAAE/CAABRwgAA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zR4AAM8eAADPHgAA0R4AANEeAADTHgAA0x4AANUeAADVHgAA1x4AANceAADZHgAA2R4AANseAADbHgAA3R4AAN0eAADfHgAA3x4AAOEeAADhHgAA4x4AAOMeAADlHgAA5R4AAOceAADnHgAA6R4AAOkeAADrHgAA6x4AAO0eAADtHgAA7x4AAO8eAADxHgAA8R4AAPMeAADzHgAA9R4AAPUeAAD3HgAA9x4AAPkeAAD5HgAA+x4AAPseAAD9HgAA/R4AAP8eAAAHHwAAEB8AABUfAAAgHwAAJx8AADAfAAA3HwAAQB8AAEUfAABQHwAAVx8AAGAfAABnHwAAcB8AAH0fAACAHwAAhx8AAJAfAACXHwAAoB8AAKcfAACwHwAAtB8AALYfAAC3HwAAvh8AAL4fAADCHwAAxB8AAMYfAADHHwAA0B8AANMfAADWHwAA1x8AAOAfAADnHwAA8h8AAPQfAAD2HwAA9x8AAHEgAABxIAAAfyAAAH8gAACQIAAAnCAAAAohAAAKIQAADiEAAA8hAAATIQAAEyEAAC8hAAAvIQAANCEAADQhAAA5IQAAOSEAADwhAAA9IQAARiEAAEkhAABOIQAATiEAAHAhAAB/IQAAhCEAAIQhAADQJAAA6SQAADAsAABfLAAAYSwAAGEsAABlLAAAZiwAAGgsAABoLAAAaiwAAGosAABsLAAAbCwAAHEsAABxLAAAcywAAHQsAAB2LAAAfSwAAIEsAACBLAAAgywAAIMsAACFLAAAhSwAAIcsAACHLAAAiSwAAIksAACLLAAAiywAAI0sAACNLAAAjywAAI8sAACRLAAAkSwAAJMsAACTLAAAlSwAAJUsAACXLAAAlywAAJksAACZLAAAmywAAJssAACdLAAAnSwAAJ8sAACfLAAAoSwAAKEsAACjLAAAoywAAKUsAAClLAAApywAAKcsAACpLAAAqSwAAKssAACrLAAArSwAAK0sAACvLAAArywAALEsAACxLAAAsywAALMsAAC1LAAAtSwAALcsAAC3LAAAuSwAALksAAC7LAAAuywAAL0sAAC9LAAAvywAAL8sAADBLAAAwSwAAMMsAADDLAAAxSwAAMUsAADHLAAAxywAAMksAADJLAAAyywAAMssAADNLAAAzSwAAM8sAADPLAAA0SwAANEsAADTLAAA0ywAANUsAADVLAAA1ywAANcsAADZLAAA2SwAANssAADbLAAA3SwAAN0sAADfLAAA3ywAAOEsAADhLAAA4ywAAOQsAADsLAAA7CwAAO4sAADuLAAA8ywAAPMsAAAALQAAJS0AACctAAAnLQAALS0AAC0tAABBpgAAQaYAAEOmAABDpgAARaYAAEWmAABHpgAAR6YAAEmmAABJpgAAS6YAAEumAABNpgAATaYAAE+mAABPpgAAUaYAAFGmAABTpgAAU6YAAFWmAABVpgAAV6YAAFemAABZpgAAWaYAAFumAABbpgAAXaYAAF2mAABfpgAAX6YAAGGmAABhpgAAY6YAAGOmAABlpgAAZaYAAGemAABnpgAAaaYAAGmmAABrpgAAa6YAAG2mAABtpgAAgaYAAIGmAACDpgAAg6YAAIWmAACFpgAAh6YAAIemAACJpgAAiaYAAIumAACLpgAAjaYAAI2mAACPpgAAj6YAAJGmAACRpgAAk6YAAJOmAACVpgAAlaYAAJemAACXpgAAmaYAAJmmAACbpgAAnaYAACOnAAAjpwAAJacAACWnAAAnpwAAJ6cAACmnAAAppwAAK6cAACunAAAtpwAALacAAC+nAAAxpwAAM6cAADOnAAA1pwAANacAADenAAA3pwAAOacAADmnAAA7pwAAO6cAAD2nAAA9pwAAP6cAAD+nAABBpwAAQacAAEOnAABDpwAARacAAEWnAABHpwAAR6cAAEmnAABJpwAAS6cAAEunAABNpwAATacAAE+nAABPpwAAUacAAFGnAABTpwAAU6cAAFWnAABVpwAAV6cAAFenAABZpwAAWacAAFunAABbpwAAXacAAF2nAABfpwAAX6cAAGGnAABhpwAAY6cAAGOnAABlpwAAZacAAGenAABnpwAAaacAAGmnAABrpwAAa6cAAG2nAABtpwAAb6cAAHinAAB6pwAAeqcAAHynAAB8pwAAf6cAAH+nAACBpwAAgacAAIOnAACDpwAAhacAAIWnAACHpwAAh6cAAIynAACMpwAAjqcAAI6nAACRpwAAkacAAJOnAACVpwAAl6cAAJenAACZpwAAmacAAJunAACbpwAAnacAAJ2nAACfpwAAn6cAAKGnAAChpwAAo6cAAKOnAAClpwAApacAAKenAACnpwAAqacAAKmnAACvpwAAr6cAALWnAAC1pwAAt6cAALenAAC5pwAA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hB4AAIYeAACGHgAAiB4AAIgeAACKHgAAih4AAIweAACMHgAAjh4AAI4eAACQHgAAkB4AAJIeAACSHgAAlB4AAJQeAACeHgAAnh4AAKAeAACgHgAAoh4AAKIeAACkHgAApB4AAKYeAACmHgAAqB4AAKgeAACqHgAAqh4AAKweAACsHgAArh4AAK4eAACwHgAAsB4AALIeAACyHgAAtB4AALQeAAC2HgAAth4AALgeAAC4HgAAuh4AALoeAAC8HgAAvB4AAL4eAAC+HgAAwB4AAMAeAADCHgAAwh4AAMQeAADEHgAAxh4AAMYeAADIHgAAyB4AAMoeAADKHgAAzB4AAMweAADOHgAAzh4AANAeAADQHgAA0h4AANIeAADUHgAA1B4AANYeAADWHgAA2B4AANgeAADaHgAA2h4AANweAADcHgAA3h4AAN4eAADgHgAA4B4AAOIeAADiHgAA5B4AAOQeAADmHgAA5h4AAOgeAADoHgAA6h4AAOoeAADsHgAA7B4AAO4eAADuHgAA8B4AAPAeAADyHgAA8h4AAPQeAAD0HgAA9h4AAPYeAAD4HgAA+B4AAPoeAAD6HgAA/B4AAPweAAD+HgAA/h4AAAgfAAAPHwAAGB8AAB0fAAAoHwAALx8AADgfAAA/HwAASB8AAE0fAABZHwAAWR8AAFsfAABbHwAAXR8AAF0fAABfHwAAXx8AAGgfAABvHwAAiB8AAI8fAACYHwAAnx8AAKgfAACvHwAAuB8AALwfAADIHwAAzB8AANgfAADbHwAA6B8AAOwfAAD4HwAA/B8AAAIhAAACIQAAByEAAAchAAALIQAADSEAABAhAAASIQAAFSEAABUhAAAZIQAAHSEAACQhAAAkIQAAJiEAACYhAAAoIQAAKCEAACohAAAtIQAAMCEAADMhAAA+IQAAPyEAAEUhAABFIQAAYCEAAG8hAACDIQAAgyEAALYkAADPJAAAACwAAC8sAABgLAAAYCwAAGIsAABkLAAAZywAAGcsAABpLAAAaSwAAGssAABrLAAAbSwAAHAsAAByLAAAciwAAHUsAAB1LAAAfiwAAIAsAACCLAAAgiwAAIQsAACELAAAhiwAAIYsAACILAAAiCwAAIosAACKLAAAjCwAAIwsAACOLAAAjiwAAJAsAACQLAAAkiwAAJIsAACULAAAlCwAAJYsAACWLAAAmCwAAJgsAACaLAAAmiwAAJwsAACcLAAAniwAAJ4sAACgLAAAoCwAAKIsAACiLAAApCwAAKQsAACmLAAApiwAAKgsAACoLAAAqiwAAKosAACsLAAArCwAAK4sAACuLAAAsCwAALAsAACyLAAAsiwAALQsAAC0LAAAtiwAALYsAAC4LAAAuCwAALosAAC6LAAAvCwAALwsAAC+LAAAviwAAMAsAADALAAAwiwAAMIsAADELAAAxCwAAMYsAADGLAAAyCwAAMgsAADKLAAAyiwAAMwsAADMLAAAziwAAM4sAADQLAAA0CwAANIsAADSLAAA1CwAANQsAADWLAAA1iwAANgsAADYLAAA2iwAANosAADcLAAA3CwAAN4sAADeLAAA4CwAAOAsAADiLAAA4iwAAOssAADrLAAA7SwAAO0sAADyLAAA8iwAAECmAABApgAAQqYAAEKmAABEpgAARKYAAEamAABGpgAASKYAAEimAABKpgAASqYAAEymAABMpgAATqYAAE6mAABQpgAAUKYAAFKmAABSpgAAVKYAAFSmAABWpgAAVqYAAFimAABYpgAAWqYAAFqmAABcpgAAXKYAAF6mAABepgAAYKYAAGCmAABipgAAYqYAAGSmAABkpgAAZqYAAGamAABopgAAaKYAAGqmAABqpgAAbKYAAGymAACApgAAgKYAAIKmAACCpgAAhKYAAISmAACGpgAAhqYAAIimAACIpgAAiqYAAIqmAACMpgAAjKYAAI6mAACOpgAAkKYAAJCmAACSpgAAkqYAAJSmAACUpgAAlqYAAJamAACYpgAAmKYAAJqmAACapgAAIqcAACKnAAAkpwAAJKcAACanAAAmpwAAKKcAACinAAAqpwAAKqcAACynAAAspwAALqcAAC6nAAAypwAAMqcAADSnAAA0pwAANqcAADanAAA4pwAAOKcAADqnAAA6pwAAPKcAADynAAA+pwAAPqcAAECnAABApwAAQqcAAEKnAABEpwAARKcAAEanAABGpwAASKcAAEinAABKpwAASqcAAEynAABMpwAATqcAAE6nAABQpwAAUKcAAFKnAABSpwAAVKcAAFSnAABWpwAAVqcAAFinAABYpwAAWqcAAFqnAABcpwAAXKcAAF6nAABepwAAYKcAAGCnAABipwAAYqcAAGSnAABkpwAAZqcAAGanAABopwAAaKcAAGqnAABqpwAAbKcAAGynAABupwAAbqcAAHmnAAB5pwAAe6cAAHunAAB9pwAAfqcAAICnAACApwAAgqcAAIKnAACEpwAAhKcAAIanAACGpwAAi6cAAIunAACNpwAAjacAAJCnAACQpwAAkqcAAJKnAACWpwAAlqcAAJinAACYpwAAmqcAAJqnAACcpwAAnKcAAJ6nAACepwAAoKcAAKCnAACipwAAoqcAAKSnAACkpwAApqcAAKanAACopwAAqKcAAKqnAACupwAAsKcAALSnAAC2pwAAtqcAALinAAC4pwAAuqcAALqnAAC8pwAAvKcAAL6nAAC+pwAAwKcAAMCnAADCpwAAwqcAAMSnAADHpwAAyacAAMmnAADQpwAA0KcAANanAADWpwAA2KcAANinAAD1pwAA9acAACH/AAA6/wAAAAQBACcEAQCwBAEA0wQBAHAFAQB6BQEAfAUBAIoFAQCMBQEAkgUBAJQFAQCVBQEAgAwBALIMAQCgGAEAvxgBAEBuAQBfbgEAANQBABnUAQA01AEATdQBAGjUAQCB1AEAnNQBAJzUAQCe1AEAn9QBAKLUAQCi1AEApdQBAKbUAQCp1AEArNQBAK7UAQC11AEA0NQBAOnUAQAE1QEABdUBAAfVAQAK1QEADdUBABTVAQAW1QEAHNUBADjVAQA51QEAO9UBAD7VAQBA1QEARNUBAEbVAQBG1QEAStUBAFDVAQBs1QEAhdUBAKDVAQC51QEA1NUBAO3VAQAI1gEAIdYBADzWAQBV1gEAcNYBAInWAQCo1gEAwNYBAOLWAQD61gEAHNcBADTXAQBW1wEAbtcBAJDXAQCo1wEAytcBAMrXAQAA6QEAIekBADDxAQBJ8QEAUPEBAGnxAQBw8QEAifEBAK5OEgAFAAAAgE0VAAQAAADSKhIAAgAAAPj/FAABAAAAuk4SAAUAAACgTRUALQAAAAgrEgAGAAAACE8VADkBAAAwIhIABgAAANBYFQAVAAAANCsSAAIAAAAIDBUAAQAAAM1OEgAFAAAAeFkVAJ0CAADSThIABwAAAGBuFQBBAAAAxk4SAAcAAABocBUAHwIAAOdOEgAJAAAAYIEVABMAAAAHTxIABQAAAPiBFQBNAAAA+04SAAMAAABghBUAAgAAAANPEgACAAAAcIQVAAkAAAAOTxIABQAAALiEFQCMAgAALOERAGYAAAB3AwAAHAAAACzhEQBmAAAAqAMAAC0AAAAs4REAZgAAAKoDAAAJAAAALOERAGYAAACrAwAACQAAACzhEQBmAAAArgMAAA8AAAAs4REAZgAAAKADAAANAAAALOERAGYAAACdAwAADQAAABsDAAAMAAAABAAAAFgDAAARBAAAWgMAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3JlZ2V4LXN5bnRheC0wLjguNC9zcmMvdXRmOC5yc2ludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGludmFsaWQgZW5jb2RlZCBsZW5ndGg6IAAAAOOaFQBCAAAAgJoVAGMAAACDAAAAEgAAAICaFQBjAAAAtAEAAC0AAACAmhUAYwAAALUBAAArAAAAgJoVAGMAAAC4AQAACQBB+LbWAAvOEAEAAAASBAAAVHJ5RnJvbUNoYXJFcnJvcmV4Y2VlZGVkIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjYXB0dXJpbmcgZ3JvdXBzICgAAACQmxUAMQAAAGDQGAABAAAAaW52YWxpZCBlc2NhcGUgc2VxdWVuY2UgZm91bmQgaW4gY2hhcmFjdGVyIGNsYXNz1JsVADAAAABpbnZhbGlkIGNoYXJhY3RlciBjbGFzcyByYW5nZSwgdGhlIHN0YXJ0IG11c3QgYmUgPD0gdGhlIGVuZAAMnBUAOwAAAGludmFsaWQgcmFuZ2UgYm91bmRhcnksIG11c3QgYmUgYSBsaXRlcmFsAAAAUJwVACkAAAB1bmNsb3NlZCBjaGFyYWN0ZXIgY2xhc3OEnBUAGAAAAGRlY2ltYWwgbGl0ZXJhbCBlbXB0eQAAAKScFQAVAAAAZGVjaW1hbCBsaXRlcmFsIGludmFsaWQAxJwVABcAAABoZXhhZGVjaW1hbCBsaXRlcmFsIGVtcHR5AAAA5JwVABkAAABoZXhhZGVjaW1hbCBsaXRlcmFsIGlzIG5vdCBhIFVuaWNvZGUgc2NhbGFyIHZhbHVlAAAACJ0VADEAAABpbnZhbGlkIGhleGFkZWNpbWFsIGRpZ2l0AAAARJ0VABkAAABpbmNvbXBsZXRlIGVzY2FwZSBzZXF1ZW5jZSwgcmVhY2hlZCBlbmQgb2YgcGF0dGVybiBwcmVtYXR1cmVseQAAaJ0VAD4AAAB1bnJlY29nbml6ZWQgZXNjYXBlIHNlcXVlbmNlsJ0VABwAAABkYW5nbGluZyBmbGFnIG5lZ2F0aW9uIG9wZXJhdG9yANSdFQAfAAAAZHVwbGljYXRlIGZsYWcAAPydFQAOAAAAZmxhZyBuZWdhdGlvbiBvcGVyYXRvciByZXBlYXRlZAAUnhUAHwAAAGV4cGVjdGVkIGZsYWcgYnV0IGdvdCBlbmQgb2YgcmVnZXgAADyeFQAiAAAAdW5yZWNvZ25pemVkIGZsYWcAAABonhUAEQAAAGR1cGxpY2F0ZSBjYXB0dXJlIGdyb3VwIG5hbWWEnhUAHAAAAGVtcHR5IGNhcHR1cmUgZ3JvdXAgbmFtZaieFQAYAAAAaW52YWxpZCBjYXB0dXJlIGdyb3VwIGNoYXJhY3RlcgDInhUAHwAAAHVuY2xvc2VkIGNhcHR1cmUgZ3JvdXAgbmFtZQDwnhUAGwAAAHVuY2xvc2VkIGdyb3VwAAAUnxUADgAAAHVub3BlbmVkIGdyb3VwAAAsnxUADgAAAGV4Y2VlZCB0aGUgbWF4aW11bSBudW1iZXIgb2YgbmVzdGVkIHBhcmVudGhlc2VzL2JyYWNrZXRzICgAAESfFQA6AAAAYNAYAAEAAABpbnZhbGlkIHJlcGV0aXRpb24gY291bnQgcmFuZ2UsIHRoZSBzdGFydCBtdXN0IGJlIDw9IHRoZSBlbmSQnxUAPAAAAHJlcGV0aXRpb24gcXVhbnRpZmllciBleHBlY3RzIGEgdmFsaWQgZGVjaW1hbAAAANSfFQAtAAAAdW5jbG9zZWQgY291bnRlZCByZXBldGl0aW9uAAygFQAbAAAAcmVwZXRpdGlvbiBvcGVyYXRvciBtaXNzaW5nIGV4cHJlc3Npb24AADCgFQAmAAAAc3BlY2lhbCB3b3JkIGJvdW5kYXJ5IGFzc2VydGlvbiBpcyBlaXRoZXIgdW5jbG9zZWQgb3IgY29udGFpbnMgYW4gaW52YWxpZCBjaGFyYWN0ZXIAYKAVAFMAAAB1bnJlY29nbml6ZWQgc3BlY2lhbCB3b3JkIGJvdW5kYXJ5IGFzc2VydGlvbiwgdmFsaWQgY2hvaWNlcyBhcmU6IHN0YXJ0LCBlbmQsIHN0YXJ0LWhhbGYgb3IgZW5kLWhhbGYAvKAVAGMAAABmb3VuZCBlaXRoZXIgdGhlIGJlZ2lubmluZyBvZiBhIHNwZWNpYWwgd29yZCBib3VuZGFyeSBvciBhIGJvdW5kZWQgcmVwZXRpdGlvbiBvbiBhIFxiIHdpdGggYW4gb3BlbmluZyBicmFjZSwgYnV0IG5vIGNsb3NpbmcgYnJhY2UAAAAooRUAgQAAAGludmFsaWQgVW5pY29kZSBjaGFyYWN0ZXIgY2xhc3MAtKEVAB8AAABiYWNrcmVmZXJlbmNlcyBhcmUgbm90IHN1cHBvcnRlZNyhFQAgAAAAbG9vay1hcm91bmQsIGluY2x1ZGluZyBsb29rLWFoZWFkIGFuZCBsb29rLWJlaGluZCwgaXMgbm90IHN1cHBvcnRlZAAEohUAQwAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3JlZ2V4LXN5bnRheC0wLjguNC9zcmMvYXN0L21vZC5ycwAAUKIVAGYAAAB/AgAAIgAAAFCiFQBmAAAAmAIAACIAAABhbG51bWFzY2lpYmxhbmtjbnRybGRpZ2l0Z3JhcGhsb3dlcnByaW50cHVuY3RzcGFjZXVwcGVyeGRpZ2l0AAAAUKIVAGYAAADzBAAAIwAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3JlZ2V4LXN5bnRheC0wLjguNC9zcmMvaGlyL21vZC5ycwAAKKMVAGYAAAC/BAAALgAAACijFQBmAAAAwAQAACoAAAAbAwAADAAAAAQAAABYAwAAEwQAAFoDAEHQx9YAC/UGAQAAAB8DAAByZWdleCBwYXJzZSBlcnJvcjoKANijFQATAAAAZXJyb3I6IAD0oxUABwAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3JlZ2V4LXN5bnRheC0wLjguNC9zcmMvZXJyb3IucnNvbiBsaW5lICAoY29sdW1uICkgdGhyb3VnaCBsaW5l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vUlkTv24FEDhkGZNBO36fS1c/aE85xnIjBpgsCLUvG6cWT7lhTAQ+i8heFwrCWyKA/CNXqc8FPh7KZYzdgsHbQRsMTbRSxn22rN7wFPOSIgFx72DxZ4f2mhQTVj0gC11Y5xWcjvDExCDpGBuMeF4UnxD7E4KtBgAAAAACAAAAAQAAAAaBAAAGwQAABwEAAB1bml0YSBib29sZWFuYSBzdHJpbmdieXRlIGFycmF5Ym9vbGVhbiBgXwEWAAkAAABsGhgAAQAAAGludGVnZXIgYAAAAHgBFgAJAAAAbBoYAAEAAABmbG9hdGluZyBwb2ludCBglAEWABAAAABsGhgAAQAAAGNoYXJhY3RlciBgALQBFgALAAAAbBoYAAEAAABzdHJpbmcgANABFgAHAAAAdW5pdCB2YWx1ZU9wdGlvbiB2YWx1ZW5ld3R5cGUgc3RydWN0c2VxdWVuY2V1bml0IHZhcmlhbnRuZXd0eXBlIHZhcmlhbnR0dXBsZSB2YXJpYW50c3RydWN0IHZhcmlhbnRleHBsaWNpdCBwYW5pY2waGAABAAAAbBoYAAEAAABgIG9yIGAAAGwaGAABAAAAYAIWAAYAAABsGhgAAQAAAG9uZSBvZiAuMAAAACQGFgBfAAAAWAIAADAAAAAbAwAADAAAAAQAAABYAwAAWQMAAB0EAEG8hdgAC7kIAQAAAB8DAABFT0Ygd2hpbGUgcGFyc2luZyBhIGxpc3RFT0Ygd2hpbGUgcGFyc2luZyBhbiBvYmplY3RFT0Ygd2hpbGUgcGFyc2luZyBhIHN0cmluZ0VPRiB3aGlsZSBwYXJzaW5nIGEgdmFsdWVleHBlY3RlZCBgOmBleHBlY3RlZCBgLGAgb3IgYF1gZXhwZWN0ZWQgYCxgIG9yIGB9YGV4cGVjdGVkIGlkZW50ZXhwZWN0ZWQgdmFsdWVleHBlY3RlZCBgImBpbnZhbGlkIGVzY2FwZWludmFsaWQgbnVtYmVybnVtYmVyIG91dCBvZiByYW5nZWludmFsaWQgdW5pY29kZSBjb2RlIHBvaW50Y29udHJvbCBjaGFyYWN0ZXIgKFx1MDAwMC1cdTAwMUYpIGZvdW5kIHdoaWxlIHBhcnNpbmcgYSBzdHJpbmdrZXkgbXVzdCBiZSBhIHN0cmluZ2ludmFsaWQgdmFsdWU6IGV4cGVjdGVkIGtleSB0byBiZSBhIG51bWJlciBpbiBxdW90ZXNmbG9hdCBrZXkgbXVzdCBiZSBmaW5pdGUgKGdvdCBOYU4gb3IgKy8taW5mKWxvbmUgbGVhZGluZyBzdXJyb2dhdGUgaW4gaGV4IGVzY2FwZXRyYWlsaW5nIGNvbW1hdHJhaWxpbmcgY2hhcmFjdGVyc3VuZXhwZWN0ZWQgZW5kIG9mIGhleCBlc2NhcGVyZWN1cnNpb24gbGltaXQgZXhjZWVkZWQgYXQgbGluZSAgY29sdW1uIAAAAAEAAAAAAAAA+AQWAAkAAAABBRYACAAAAEVycm9yKCwgbGluZTogLCBjb2x1bW46ICQFFgAGAAAAKgUWAAgAAAAyBRYACgAAAGDQGAABAAAAMDAwMTAyMDMwNDA1MDYwNzA4MDkxMDExMTIxMzE0MTUxNjE3MTgxOTIwMjEyMjIzMjQyNTI2MjcyODI5MzAzMTMyMzMzNDM1MzYzNzM4Mzk0MDQxNDI0MzQ0NDU0NjQ3NDg0OTUwNTE1MjUzNTQ1NTU2NTc1ODU5NjA2MTYyNjM2NDY1NjY2NzY4Njk3MDcxNzI3Mzc0NzU3Njc3Nzg3OTgwODE4MjgzODQ4NTg2ODc4ODg5OTA5MTkyOTM5NDk1OTY5Nzk4OTkvcnVzdGMvOTBiMzVhNjIzOWMzZDhiZGFiYzUzMGE2YTA4MTZmN2ZmODlhMGFhZi9saWJyYXJ5L2FsbG9jL3NyYy9jb2xsZWN0aW9ucy9idHJlZS9uYXZpZ2F0ZS5ycwAkBhYAXwAAAMYAAAAnAAAAJAYWAF8AAAAWAgAALwAAACQGFgBfAAAAoQAAACQAAAAbAwAADAAAAAQAAABYAwAADgQAAB0EAABpbnZhbGlkIHR5cGU6ICwgZXhwZWN0ZWQgAAAAzAYWAA4AAADaBhYACwBBgI7YAAuPAQEAAAAeBAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvc2VyZGUtd2FzbS1iaW5kZ2VuLTAuNi41L3NyYy9saWIucnMIBxYAaAAAADUAAAAOAAAATGF5b3V0c2l6ZWFsaWduAEGYj9gAC9IDAQAAAO4DAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9zbWFydHN0cmluZy0xLjAuMS9zcmMvaW5saW5lLnJzoAcWAGQAAAArAAAAKwAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3NtYXJ0c3RyaW5nLTEuMC4xL3NyYy9ib3hlZC5ycwAUCBYAYwAAAEEAAAAOAAAAFAgWAGMAAAB2AAAAJAAAAGh0dHA6aHR0cHM6AAEAAAAAAAAAEBgYAAEAAABhdHRlbXB0IHRvIGpvaW4gaW50byBjb2xsZWN0aW9uIHdpdGggbGVuID4gdXNpemU6Ok1BWC9ydXN0Yy85MGIzNWE2MjM5YzNkOGJkYWJjNTMwYTZhMDgxNmY3ZmY4OWEwYWFmL2xpYnJhcnkvYWxsb2Mvc3JjL3N0ci5ycwAAAOkIFgBIAAAAmgAAAAoAAADpCBYASAAAALEAAAAWAAAAGwMAAAwAAAAEAAAAWAMAAB8EAAAdBABB9JLYAAu/AQEAAAAfAwAA2OwXAGAAAAAUAAAADwAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3NlcmRlX2pzb24tMS4wLjEzMy9zcmMvc2VyLnJzAACMCRYAYgAAAA0GAAASAAAAjAkWAGIAAAAwCAAAMwAAAHV1dXV1dXV1YnRudWZydXV1dXV1dXV1dXV1dXV1dXV1AAAiAEHslNgACwFcAEGQltgAC6IHjAkWAGIAAAAjCAAAQAAAAFx0bGluZWNvbHVtbm9mZnNldG1hcG5hbWVzbWFwcGluZ3N2ZXJzaW9uZmlsZXNvdXJjZXNzb3VyY2VSb290c291cmNlc0NvbnRlbnRzZWN0aW9uc3JhbmdlTWFwcGluZ3N4X2ZhY2Vib29rX29mZnNldHN4X21ldHJvX21vZHVsZV9wYXRoc3hfZmFjZWJvb2tfc291cmNlc2RlYnVnX2lkYmFkIGpzb246IADBCxYACgAAAGxlZnRvdmVyIGN1ci9zaGlmdCBpbiB2bHEgZGVjb2Rl1AsWACAAAAB2bHEgZGVjb2RlIGRpZCBub3QgcHJvZHVjZSBhbnkgdmFsdWVzAAAA/AsWACUAAAB2bHEgZGVjb2RlIGNhdXNlZCBhbiBvdmVyZmxvdwAAACwMFgAdAAAAZ290ICBzZWdtZW50cywgZXhwZWN0ZWQgNCBvciA1AABUDBYABAAAAFgMFgAaAAAAYmFkIHJlZmVyZW5jZSB0byBzb3VyY2UgIwAAAIQMFgAZAAAAYmFkIHJlZmVyZW5jZSB0byBuYW1lICMAqAwWABcAAABlbmNvdW50ZXJlZCBpbmNvbXBhdGlibGUgc291cmNlbWFwIGZvcm1hdAAAAMgMFgApAAAAdGhlIHByb3ZpZGVkIGRhdGEgVVJMIGlzIGludmFsaWT8DBYAIAAAAGNhbm5vdCBmbGF0dGVuIHRoZSBpbmRleGVkIHNvdXJjZW1hcDogAAAkDRYAJgAAAGludmFsaWQgbWFnaWMgbnVtYmVyIGZvciByYW0gYnVuZGxlAFQNFgAjAAAAaW52YWxpZCBtb2R1bGUgaW5kZXggaW4gcmFtIGJ1bmRsZQAAgA0WACIAAABpbnZhbGlkIHJhbSBidW5kbGUgbW9kdWxlIGVudHJ5AKwNFgAfAAAAbm90IGEgcmFtIGJ1bmRsZdQNFgAQAAAAaW52YWxpZCByYW5nZSBtYXBwaW5nIGluZGV4OiAAAADsDRYAHQAAAGludmFsaWQgYmFzZTY0IGNoYXJhY3RlcjogAAAUDhYAGgAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3d5ei0wLjUuMS9zcmMvY29tdS5ycwAAOA4WAFoAAAAnAQAAAgAAAE51bGxQdHJFcnJvcnU4AEG8ndgAC9IhAQAAAO4DAAAwOxgASQAAANsHAAApAAAATGF5b3V0RXJyb3JNaXNhbGlnbkVycm9yAQAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3NvdXJjZW1hcC05LjAuMC9zcmMvYnVpbGRlci5yc0Nhbm5vdCBzZXQgc291cmNlcyBmb3IgdG9tYnN0b25lIHNvdXJjZSBpZAAAAPAOFgBjAAAAeQAAAAkAAADwDhYAYwAAAH0AAAAdAAAAY2Fubm90ICBiaXRzIGZyb20gYSAtYml0IHJlZ2lvbgCgDxYABwAAALIXGAABAAAApw8WAA0AAAC0DxYACwAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL2JpdHZlYy0xLjAuMS9zcmMvZmllbGQucnMAAOAPFgBeAAAADgIAAAIAAAByYW5nZSAgb3V0IG9mIGJvdW5kczogAABQEBYABgAAAFYQFgAQAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvYml0dmVjLTEuMC4xL3NyYy9zbGljZS9hcGkucnMAAHgQFgBiAAAAjgoAAAEAAABKAwAAFAAAAAQAAAAgBAAAAAAAAAgAAAAEAAAAIQQAAEluY2x1ZGVkRXhjbHVkZWRVbmJvdW5kZWQvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9iaXR2ZWMtMS4wLjEvc3JjL3NsaWNlLnJzACURFgBeAAAATwEAACMAAABpbmRleCAgb3V0IG9mIHJhbmdlOiAAAACUERYABgAAAJoRFgAPAAAAJREWAF4AAAAxBgAAAwAAAGxvYWRCaXRTcGFuRXJyb3I8Pjo60BEWAA0AAADdERYAAwAAAE1pc2FsaWduZWRUb29Mb25nVG9vSGlnaC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3NvdXJjZW1hcC05LjAuMC9zcmMvZW5jb2Rlci5yc2ludmFsaWQgYnl0ZQAIEhYAYwAAACMAAAASAAAAaW52YWxpZCB1dGY4CBIWAGMAAABmAAAAIQAAAEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8AAAAABAAAAAQAAAAiBAAAL3J1c3QvZGVwcy9kbG1hbGxvYy0wLjIuNi9zcmMvZGxtYWxsb2MucnNhc3NlcnRpb24gZmFpbGVkOiBwc2l6ZSA+PSBzaXplICsgbWluX292ZXJoZWFkAPQSFgApAAAAqAQAAAkAAABhc3NlcnRpb24gZmFpbGVkOiBwc2l6ZSA8PSBzaXplICsgbWF4X292ZXJoZWFkAAD0EhYAKQAAAK4EAAANAAAAdXNlIG9mIHN0ZDo6dGhyZWFkOjpjdXJyZW50KCkgaXMgbm90IHBvc3NpYmxlIGFmdGVyIHRoZSB0aHJlYWQncwogICAgICAgICBsb2NhbCBkYXRhIGhhcyBiZWVuIGRlc3Ryb3llZACcExYAZwAAAHN0ZC9zcmMvdGhyZWFkL2N1cnJlbnQucnMAAAAMFBYAGQAAAO0AAAAJAAAAQWNjZXNzRXJyb3JzdGQvc3JjL3RocmVhZC9tb2QucnNmYWlsZWQgdG8gZ2VuZXJhdGUgdW5pcXVlIHRocmVhZCBJRDogYml0c3BhY2UgZXhoYXVzdGVkAFgUFgA3AAAAQxQWABUAAACTBAAADQAAAHN0ZC9zcmMvYmFja3RyYWNlLnJzdW5zdXBwb3J0ZWQgYmFja3RyYWNlZGlzYWJsZWQgYmFja3RyYWNlAKgUFgAUAAAAigEAAB0AAAAjBAAAEAAAAAQAAAAkBAAAJQQAAGVudGl0eSBub3QgZm91bmRwZXJtaXNzaW9uIGRlbmllZGNvbm5lY3Rpb24gcmVmdXNlZGNvbm5lY3Rpb24gcmVzZXRob3N0IHVucmVhY2hhYmxlbmV0d29yayB1bnJlYWNoYWJsZWNvbm5lY3Rpb24gYWJvcnRlZG5vdCBjb25uZWN0ZWRhZGRyZXNzIGluIHVzZWFkZHJlc3Mgbm90IGF2YWlsYWJsZW5ldHdvcmsgZG93bmJyb2tlbiBwaXBlZW50aXR5IGFscmVhZHkgZXhpc3Rzb3BlcmF0aW9uIHdvdWxkIGJsb2Nrbm90IGEgZGlyZWN0b3J5aXMgYSBkaXJlY3RvcnlkaXJlY3Rvcnkgbm90IGVtcHR5cmVhZC1vbmx5IGZpbGVzeXN0ZW0gb3Igc3RvcmFnZSBtZWRpdW1maWxlc3lzdGVtIGxvb3Agb3IgaW5kaXJlY3Rpb24gbGltaXQgKGUuZy4gc3ltbGluayBsb29wKXN0YWxlIG5ldHdvcmsgZmlsZSBoYW5kbGVpbnZhbGlkIGlucHV0IHBhcmFtZXRlcmludmFsaWQgZGF0YXRpbWVkIG91dHdyaXRlIHplcm9ubyBzdG9yYWdlIHNwYWNlc2VlayBvbiB1bnNlZWthYmxlIGZpbGVmaWxlc3lzdGVtIHF1b3RhIGV4Y2VlZGVkZmlsZSB0b28gbGFyZ2VyZXNvdXJjZSBidXN5ZXhlY3V0YWJsZSBmaWxlIGJ1c3lkZWFkbG9ja2Nyb3NzLWRldmljZSBsaW5rIG9yIHJlbmFtZXRvbyBtYW55IGxpbmtzaW52YWxpZCBmaWxlbmFtZWFyZ3VtZW50IGxpc3QgdG9vIGxvbmdvcGVyYXRpb24gaW50ZXJydXB0ZWR1bnN1cHBvcnRlZHVuZXhwZWN0ZWQgZW5kIG9mIGZpbGVvdXQgb2YgbWVtb3J5aW4gcHJvZ3Jlc3NvdGhlciBlcnJvcnVuY2F0ZWdvcml6ZWQgZXJyb3JPc0tpbmRDdXN0b20gKG9zIGVycm9yIAABAAAAAAAAAAwYFgALAAAAYNAYAAEAAAA6IHN0ZC9zcmMvcGF0aC5ycwAAADIYFgAPAAAA0gIAACEAAAAyGBYADwAAAPkCAAAsAAAAMhgWAA8AAAD7AgAAJgAAADIYFgAPAAAACAMAACcAAAAyGBYADwAAABQDAAAnAAAAMhgWAA8AAAB+AwAAKQAAADIYFgAPAAAAfwMAACsAAAAyGBYADwAAAJQDAAAvAAAAMhgWAA8AAACMAwAALwAAADIYFgAPAAAAmgMAACsAAABzdGQvc3JjL3N5bmMvbGF6eV9sb2NrLnJzAAAA5BgWABkAAADQAAAAEwAAAGNhbm5vdCByZWN1cnNpdmVseSBhY3F1aXJlIG11dGV4EBkWACAAAABzdGQvc3JjL3N5cy9zeW5jL211dGV4L25vX3RocmVhZHMucnM4GRYAJAAAABQAAAAJAAAAc3RkL3NyYy9zeW5jL29uY2UucnNsGRYAFAAAANkAAAAUAAAAPHVua25vd24+77+9c3RkL3NyYy8uLi8uLi9iYWNrdHJhY2Uvc3JjL3N5bWJvbGl6ZS9tb2QucnOcGRYALAAAAGcBAAAwAAAAAQAAAAAAAAAwGBYAAgAAACAtIAABAAAAAAAAAOgZFgADAAAAICAgICAgICAgICAgICAgICAgIGF0IE5vdEZvdW5kUGVybWlzc2lvbkRlbmllZENvbm5lY3Rpb25SZWZ1c2VkQ29ubmVjdGlvblJlc2V0SG9zdFVucmVhY2hhYmxlTmV0d29ya1VucmVhY2hhYmxlQ29ubmVjdGlvbkFib3J0ZWROb3RDb25uZWN0ZWRBZGRySW5Vc2VBZGRyTm90QXZhaWxhYmxlTmV0d29ya0Rvd25Ccm9rZW5QaXBlQWxyZWFkeUV4aXN0c1dvdWxkQmxvY2tOb3RBRGlyZWN0b3J5SXNBRGlyZWN0b3J5RGlyZWN0b3J5Tm90RW1wdHlSZWFkT25seUZpbGVzeXN0ZW1GaWxlc3lzdGVtTG9vcFN0YWxlTmV0d29ya0ZpbGVIYW5kbGVJbnZhbGlkSW5wdXRJbnZhbGlkRGF0YVRpbWVkT3V0V3JpdGVaZXJvU3RvcmFnZUZ1bGxOb3RTZWVrYWJsZUZpbGVzeXN0ZW1RdW90YUV4Y2VlZGVkRmlsZVRvb0xhcmdlUmVzb3VyY2VCdXN5RXhlY3V0YWJsZUZpbGVCdXN5RGVhZGxvY2tDcm9zc2VzRGV2aWNlc1Rvb01hbnlMaW5rc0ludmFsaWRGaWxlbmFtZUFyZ3VtZW50TGlzdFRvb0xvbmdJbnRlcnJ1cHRlZFVuc3VwcG9ydGVkVW5leHBlY3RlZEVvZk91dE9mTWVtb3J5SW5Qcm9ncmVzc090aGVyVW5jYXRlZ29yaXplZG9wZXJhdGlvbiBzdWNjZXNzZnVsT25jZSBpbnN0YW5jZSBoYXMgcHJldmlvdXNseSBiZWVuIHBvaXNvbmVkThwWACoAAABvbmUtdGltZSBpbml0aWFsaXphdGlvbiBtYXkgbm90IGJlIHBlcmZvcm1lZCByZWN1cnNpdmVseYAcFgA4AAAAEAAAABEAAAASAAAAEAAAABAAAAATAAAAEgAAAA0AAAAOAAAAFQAAAAwAAAALAAAAFQAAABUAAAAPAAAADgAAABMAAAAmAAAAOAAAABkAAAAXAAAADAAAAAkAAAAKAAAAEAAAABcAAAAZAAAADgAAAA0AAAAUAAAACAAAABsAAAAOAAAAEAAAABYAAAAVAAAACwAAABYAAAANAAAACwAAAAsAAAATAAAACBUWABgVFgApFRYAOxUWAEsVFgBbFRYAbhUWAIAVFgCNFRYAmxUWALAVFgC8FRYAxxUWANwVFgDxFRYAABYWAA4WFgAhFhYARxYWAH8WFgCYFhYArxYWALsWFgDEFhYAzhYWAN4WFgD1FhYADhcWABwXFgApFxYAPRcWAEUXFgBgFxYAbhcWAH4XFgCUFxYAqRcWALQXFgDKFxYA1xcWAOIXFgDtFxYACAAAABAAAAARAAAADwAAAA8AAAASAAAAEQAAAAwAAAAJAAAAEAAAAAsAAAAKAAAADQAAAAoAAAANAAAADAAAABEAAAASAAAADgAAABYAAAAMAAAACwAAAAgAAAAJAAAACwAAAAsAAAAXAAAADAAAAAwAAAASAAAACAAAAA4AAAAMAAAADwAAABMAAAALAAAACwAAAA0AAAALAAAACgAAAAUAAAANAAAAEhoWABoaFgAqGhYAOxoWAEoaFgBZGhYAaxoWAHwaFgCIGhYAkRoWAKEaFgCsGhYAthoWAMMaFgDNGhYA2hoWAOYaFgD3GhYACRsWABcbFgAtGxYAORsWAEQbFgBMGxYAVRsWAGAbFgBrGxYAghsWAI4bFgCaGxYArBsWALQbFgDCGxYAzhsWAN0bFgDwGxYA+xsWAAYcFgATHBYAHhwWACgcFgAtHBYAAAAAAAQAAAAEAAAAJgQAACcEAAAoBAAAGwMAAAwAAAAEAAAAWAMAAB8EAAAdBABBmL/YAAsWAQAAAB8DAAAAAAAABAAAAAQAAAApBABBuL/YAAuNEQEAAAArBAAALAQAAC0EAADo6xcAZwAAAB4BAAAnAAAA6OsXAGcAAABDAQAAMQAAADogYnBvcyA9IDsgbGluZWJwb3MgPSAAAAEAAAAAAAAA6B8WAAkAAADxHxYADQAAALEXGAABAAAA6OsXAGcAAABEAQAAEQAAAOjrFwBnAAAAWgEAABkAAADo6xcAZwAAAHwBAABGAAAAbWFwLnN0YXJ0X3BvcyA9IDsgdG90YWxfZXh0cmFfYnl0ZXMgPSA7IGJwb3MgPSAAUCAWABAAAABgIBYAFgAAAHYgFgAJAAAA6OsXAGcAAADlAwAACQAAAOjrFwBnAAAAIgQAADQAAADo6xcAZwAAAA4EAAA0AAAA6OsXAGcAAABPBAAAEAAAAOjrFwBnAAAADwUAADoAAADo6xcAZwAAADEFAAAqAAAA6OsXAGcAAABwBQAAEAAAAE5vRmlsZUZvcm5vIGVycm9ycyBlbmNvdW50ZXJlZCBldmVuIHRob3VnaCBgZGVsYXlfc3Bhbl9idWdgIGlzc3VlZAAAESEWADkAAABgJhYAZwAAAJgBAAARAAAAZW5jb3VudGVyZWQgZXJyb3Igd2l0aCBgLVogdHJlYXRfZXJyX2FzX2J1ZwBkIRYAKwAAAGAmFgBnAAAAZQIAAA0AAABNYWNoaW5lQXBwbGljYWJsZUhhc1BsYWNlaG9sZGVyc01heWJlSW5jb3JyZWN0VW5zcGVjaWZpZWRDb2RlU3VnZ2VzdGlvbnN1YnN0aXR1dGlvbnNtc2dzaG93X2NvZGVfd2hlbl9pbmxpbmVhcHBsaWNhYmlsaXR5U3Vic3RpdHV0aW9ucGFydHNTdWJzdGl0dXRpb25QYXJ0c25pcHBldAAAAAIAAABNZXNzYWdlTGludFN1YkRpYWdub3N0aWNyZW5kZXJfc3Bhbi9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3N3Y19jb21tb24tNS4wLjAvc3JjL2NvbW1lbnRzLnJzcyIWAGUAAACnAQAAFgAAAHMiFgBlAAAArAEAAA4AAABzIhYAZQAAALMBAAAnAAAAcyIWAGUAAAC/AQAAMgAAAHMiFgBlAAAAxwEAABYAAABzIhYAZQAAAMsBAAAWAAAAcyIWAGUAAADPAQAAFwAAAHMiFgBlAAAA1AEAAA4AAABzIhYAZQAAANsBAAAoAAAAcyIWAGUAAADnAQAAMwAAAHMiFgBlAAAA7wEAABcAAABzIhYAZQAAAPMBAAAXAAAAcyIWAGUAAAD5AQAALAAAAGNhbm5vdCBhZGQgcHVyZSBjb21tZW50IHRvIHplcm8gcG9zaXRpb26oIxYAKAAAAHMiFgBlAAAA9wEAAAkAAAAjX19AX18AAHMiFgBlAAAAMQIAAC0AAABzIhYAZQAAAGUCAAAuAAAAwCQWAG8AAADMAAAAHQAAAMAkFgBvAAAAewEAAC0AAADAJBYAbwAAADACAAA2AAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvcnVzdGMtaGFzaC0xLjEuMC9zcmMvbGliLnJzQCQWAGAAAABnAAAAGwAAAEAkFgBgAAAAXwAAABsAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9zd2NfY29tbW9uLTUuMC4wL3NyYy9zeW50YXhfcG9zL2h5Z2llbmUucnMAwCQWAG8AAAByAQAADQAAAE1hcmvvHhgASwAAAJYHAAAkAAAAYXNzZXJ0aW9uIGZhaWxlZDogc2VsZi5pc19jaGFyX2JvdW5kYXJ5KGVuZCnvHhgASwAAAJgHAAAJAAAAAAAAAAwAAAAEAAAALgQAAC8EAAAAAAAADAAAAAQAAAAwBAAAMQQAAEVycm9yIGNvbnN0cnVjdGVkIGJ1dCBub3QgZW1pdHRlZC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3N3Y19jb21tb24tNS4wLjAvc3JjL2Vycm9ycy9kaWFnbm9zdGljX2J1aWxkZXIucnMA2SUWAHYAAABZAQAADQAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3N3Y19jb21tb24tNS4wLjAvc3JjL2Vycm9ycy9tb2QucnMAYCYWAGcAAABQAwAAHwAAAGFzc2VydGlvbiBmYWlsZWQ6IHN0YXJ0IDw9IGVuZC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3N3Y19jb21tb24tNS4wLjAvc3JjL2lucHV0LnJz9iYWAGIAAAAfAAAACQAAAGFzc2VydGlvbiBmYWlsZWQ6IHNvdXJjZV9maWxlX2VuZCA+PSBsYXN0X2xpbmVfc3RhcnQvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9zd2NfY29tbW9uLTUuMC4wL3NyYy9zeW50YXhfcG9zL2FuYWx5emVfc291cmNlX2ZpbGUucnMAnCcWAHsAAAAqAAAACQAAAJwnFgB7AAAAagAAABgAAACcJxYAewAAAGoAAAAtAEHQ0NgAC7kKAQAAADIEAAAzBAAANAQAAAAAAAAEAAAABAAAABQBAAAAAAAABAAAAAQAAAA1BAAALi4AAAEAAAAAAAAAgCgWAAIAAAAgbWFjcm9zPgIYGAABAAAAlCgWAAgAAAA8cXVvdGUgZXhwYW5zaW9uPgAAAKwoFgARAAAAPGFub24+AADIKBYABgAAADxtYWNybyBleHBhbnNpb24+AAAA2CgWABEAAAA8cHJvYy1tYWNybyBzb3VyY2UgY29kZT70KBYAGAAAAAIYGAABAAAABRgYAAEAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9zd2NfY29tbW9uLTUuMC4wL3NyYy9zeW50YXhfcG9zLnJzYXNzZXJ0aW9uIGZhaWxlZDogbGluZV9pbmRleCA8IGFuYWx5c2lzLmxpbmVzLmxlbigpIGFzIGlzaXplACQpFgBnAAAA1gMAAAkAAAABAAAAUHJpbWFyeVNwYW5MYWJlbEJ5dGVQb3NvcGVyYXRpb24gbm90IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtAPMpFgAoAAAAJAAAAAIAAAAcKhYAL3J1c3RjLzkwYjM1YTYyMzljM2Q4YmRhYmM1MzBhNmEwODE2ZjdmZjg5YTBhYWYvbGlicmFyeS9zdGQvc3JjL3BhdGgucnMAMCoWAEcAAACYDAAAGwAAADAqFgBHAAAAuwwAACEAAAAwKhYARwAAAK4MAAAiAAAATWFpbkhlYWRlck1zZ0hlYWRlck1zZ0xpbmVBbmRDb2x1bW5MaW5lTnVtYmVyUXVvdGF0aW9uVW5kZXJsaW5lUHJpbWFyeVVuZGVybGluZVNlY29uZGFyeUxhYmVsUHJpbWFyeUxhYmVsU2Vjb25kYXJ5T2xkU2Nob29sTm90ZVRleHROb1N0eWxlTGV2ZWxIaWdobGlnaHQvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9waGZfc2hhcmVkLTAuMTEuMi9zcmMvbGliLnJzAAAAQCsWAGEAAAA7AAAABQAAACJ1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dGVycz09PT0sNhYAawAAAJgCAAAcAAAAPDw8PDwgPj4+PiAALDYWAGsAAADKAgAAFgAAADQgaGV4IGNoYXJhY3RlcnMxLTYgaGV4IGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIDAgdG8gMTBGRkZGLjEtNiBoZXggY2hhcmFjdGVycwAALDYWAGsAAAD3AwAAIAAAACw2FgBrAAAAKgUAAB4AAAAAAAAACAAAAAQAAABQAwAAQ2FwYWNpdHlPdmVyZmxvd0FsbG9jRXJybGF5b3V0UGFyYW1wYXQvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9zbWFsbHZlYy0xLjEzLjIvc3JjL2xpYi5ycwAAAD4EAAAEAAAABAAAAOIBAAAAAAAAAQAAAAEAAAAPAAAARXhwb3J0QWxsc3JjdHlwZV9vbmx5RXhwb3J0RGVjbGRlY2wAPwQAAAwAAAAEAAAAQAQAAEEEAAAEAAAABAAAAEIEAABzcGVjaWZpZXJzAABvKxgABAAAAGw4FgAKAAAAMTgWAAMAAAA0OBYACQAAAP8bGAAEAAAAPIgWAAUAAABJbXBvcnREZWNsRXhwb3J0TmFtZWRFeHBvcnREZWZhdWx0RGVjbEV4cG9ydERlZmF1bHRFeHByVHNJbXBvcnRFcXVhbHNUc05hbWVzcGFjZUV4cG9ydEV2YWx1YXRpb25Tb3VyY2VEZWZlck5hbWVkRXhwb3J0TmFtZXNwYWNlRGVmYXVsdE5hbWVkRXhwb3J0TmFtZWRTcGVjaWZpZXJvcmlnZXhwb3J0ZWRJbXBvcnROYW1lZFNwZWNpZmllcmxvY2FsaW1wb3J0ZWRJbXBvcnRTdGFyQXNTcGVjaWZpZXJFeHBvcnREZWZhdWx0U3BlY2lmaWVySW1wb3J0RGVmYXVsdFNwZWNpZmllckV4cG9ydE5hbWVzcGFjZVNwZWNpZmllcgAAAKY3FgBfAAAAUgEAAC4AAACmNxYAXwAAAM4EAAAOAAAAYXNzZXJ0aW9uIGZhaWxlZDogaW5kZXggPCBsZW4AAACmNxYAXwAAAEgFAAANAAAAYXNzZXJ0aW9uIGZhaWxlZDogbmV3X2NhcCA+PSBsZW6mNxYAXwAAAJkEAAANAAAA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T3RpbGRlT3VtbHRpbWVzT3NsYXNoVWdyYXZlVWFjdXRlVWNpcmNVdW1sWWFjdXRlVEhPUk5zemxpZ2FncmF2ZWFhY3V0ZWFjaXJjYXRpbGRlYXVtbGFyaW5nYWVsaWdjY2VkaWxlZ3JhdmVlYWN1dGVlY2lyY2V1bWxpZ3JhdmVpYWN1dGVpY2lyY2l1bWxldGhudGlsZGVvZ3JhdmVvYWN1dGVvY2lyY290aWxkZW91bWxkaXZpZGVvc2xhc2h1Z3JhdmV1YWN1dGV1Y2lyY3V1bWx5YWN1dGV0aG9ybnl1bWxPRWxpZ29lbGlnU2Nhcm9uc2Nhcm9uWXVtbGZub2ZjaXJjdGlsZGVBbHBoYUJldGFHYW1tYURlbHRhRXBzaWxvblpldGFFdGFUaGV0YUlvdGFLYXBwYUxhbWJkYU11TnVYaU9taWNyb25QaVJob1NpZ21hVGF1VXBzaWxvblBoaUNoaVBzaU9tZWdhYWxwaGFiZXRhZ2FtbWFkZWx0YWVwc2lsb256ZXRhZXRhdGhldGFpb3Rha2FwcGFsYW1iZGFtdW51eGlvbWljcm9ucGlyaG9zaWdtYWZzaWdtYXRhdXVwc2lsb25waGljaGlwc2lvbWVnYXRoZXRhc3ltdXBzaWhwaXZlbnNwZW1zcHRoaW5zcHp3bmp6d2pscm1ybG1uZGFzaG1kYXNobHNxdW9yc3F1b3NicXVvbGRxdW9yZHF1b2JkcXVvZGFnZ2VyRGFnZ2VyYnVsbGhlbGxpcHBlcm1pbHByaW1lUHJpbWVsc2FxdW9yc2FxdW9vbGluZWZyYXNsZXVyb2ltYWdld2VpZXJwcmVhbHRyYWRlYWxlZnN5bWxhcnJ1YXJycmFycmRhcnJoYXJyY3JhcnJsQXJydUFycnJBcnJkQXJyaEFycmZvcmFsbHBhcnRleGlzdGVtcHR5bmFibGFpc2lubm90aW5uaXByb2RzdW1taW51c2xvd2FzdHJhZGljaW5maW5hbmdhbmRvcmNhcGN1cGludHRoZXJlNHNpbWNvbmdhc3ltcG5lZXF1aXZsZWdlc3Vic3VwbnN1YnN1YmVzdXBlb3BsdXNvdGltZXNwZXJwc2RvdGxjZWlscmNlaWxsZmxvb3JyZmxvb3JsYW5ncmFuZ2xvenNwYWRlc2NsdWJzaGVhcnRzZGlhbXNCb29sTnVsbE51bUJpZ0ludFJlZ2V4SlNYVGV4dGV4cGZsYWdzTnVtYmVySlNYQXR0ckpTWEVtcHR5RXhwcklkZW50TmFtZUpTWEV4cHJDb250YWluZXJKU1hTcHJlYWRDaGlsZAAAAIkEAAAEAAAABAAAADYBAABUc0FzRXhwcooEAAAMAAAABAAAAAwCAABUc0ZuVHlwZWxpdHR5cGVfbmFtZUpTWENsb3NpbmdFbGVtZW50bnNKU1hDbG9zaW5nRnJhZ21lbnRKU1hPcGVuaW5nRnJhZ21lbnRlbGVtX3R5cGV0eXBlX3BhcmFtVHNFbnRpdHlOYW1lVHNFeHRlcm5hbE1vZHVsZVJlZgAAAEYEAAAMAAAABAAAAKIBAAAAAAAAAQAAAAEAAABHBAAAAAAAAAEAAAABAAAADwAAAAAAAAAEAAAABAAAAIsEAABhY2Nlc3NpYmlsaXR5aXNfb3ZlcnJpZGVwYXJhbQAAAG8rGAAEAAAAOIEWAAoAAAB4ShYADQAAAIVKFgALAAAAqxoYAAgAAACQShYABQAAAFRzUGFyYW1Qcm9wZWxlbV90eXBlcwAAAIwEAAAYAAAACAAAAMYBAACNBAAABAAAAAQAAACOBAAAAAAAAAQAAAAEAAAAjwQAAGlzX2luaXNfb3V0Y29uc3RyYWludAAAAG8rGAAEAAAApYoWAAQAAAAQSxYABQAAABVLFgAGAAAA5oMWAAgAAAAbSxYACgAAAAodGAAHAAAAVHNUeXBlUGFyYW1leHByX25hbWVUc1VuaW9uVHlwZXR5cGVzVHNFbnVtTWVtYmVycXVhbGlmaWVyAAAAAAAAAAEAAAABAAAAkAQAAJEEAAAwAAAACAAAAJIEAABuYW1lX3R5cGUAAABvKxgABAAAAKsaGAAIAAAADEoWAAoAAAC8SxYACQAAAGuIFgAIAAAAoYMWAAgAAABUc1RwbExpdFR5cGVQdWJsaWNQcm90ZWN0ZWRQcml2YXRlVHJ1ZVBsdXNNaW51c1RzTm9uTnVsbEV4cHJUc0NhbGxTaWduYXR1cmVEZWNsVHNDb25zdHJ1Y3RTaWduYXR1cmVEZWNsVHNQcm9wZXJ0eVNpZ25hdHVyZVRzR2V0dGVyU2lnbmF0dXJlVHNTZXR0ZXJTaWduYXR1cmVUc01ldGhvZFNpZ25hdHVyZVRzSW5kZXhTaWduYXR1cmVUc1R1cGxlRWxlbWVudGxhYmVsdHlUc0ludGVyZmFjZUJvZHlUc1NhdGlzZmllc0V4cHJwYXJhbV9uYW1lAACTBAAABAAAAAQAAAADAgAAaXNfc3RhdGljY2hlY2tfdHlwZWV4dGVuZHNfdHlwZXRydWVfdHlwZWZhbHNlX3R5cGVUc0NvbnN0cnVjdG9yVHlwZWtleWNvbXB1dGVkVHNBbnlLZXl3b3JkVHNVbmtub3duS2V5d29yZFRzTnVtYmVyS2V5d29yZFRzT2JqZWN0S2V5d29yZFRzQm9vbGVhbktleXdvcmRUc0JpZ0ludEtleXdvcmRUc1N0cmluZ0tleXdvcmRUc1N5bWJvbEtleXdvcmRUc1ZvaWRLZXl3b3JkVHNVbmRlZmluZWRLZXl3b3JkVHNOdWxsS2V5d29yZFRzTmV2ZXJLZXl3b3JkVHNJbnRyaW5zaWNLZXl3b3JkAAAAAAAAAAQAAAAEAAAAQQIAAG8rGAAEAAAAR00WAAMAAABKTRYACAAAAGuIFgAIAAAAKIkWAAYAAAChgxYACAAAAEaJFgALAAAAVHNFeHBvcnRBc3NpZ25tZW50VHNFeHByV2l0aFR5cGVBcmdzVHNJbnRlcnNlY3Rpb25UeXBlb2JqX3R5cGVpbmRleF90eXBlbysYAAQAAACrGhgACAAAAEdNFgADAAAASk0WAAgAAABriBYACAAAAKGDFgAIAAAAVHNOYW1lc3BhY2VFeHBvcnREZWNsL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvc21hcnRzdHJpbmctMS4wLjEvc3JjL29wcy5ycwAA7U4WAGEAAAB6AAAAOwAAAFVuZXhwZWN0ZWQgZW9mL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvc3djX2VjbWFfcGFyc2VyLTYuMC4xL3NyYy9lcnJvci5yc0RlY2xhcmF0aW9uIGlzIG5vdCBhbGxvd2VkVXNpbmcgZGVjbGFyYXRpb24gaXMgbm90IGFsbG93ZWRVc2luZyBkZWNsYXJhdGlvbiBpcyBub3QgYWxsb3dlZCBpbiBmb3ItaW4gbG9vcFVzaW5nIGRlY2xhcmF0aW9uIGlzIG5vdCBlbmFibGVkLiBTZXQganNjLnBhcnNlci5leHBsaWNpdFJlc291cmNlTWFuYWdlbWVudCB0byB0cnVlVXNpbmcgZGVjbGFyYXRpb24gb25seSBhbGxvd3MgaWRlbnRpZmllcnNVc2luZyBkZWNsYXJhdGlvbiByZXF1aXJlcyBpbml0aWFsaXplcnByaXZhdGUgbmFtZXMgYXJlIG5vdCBhbGxvd2VkIGluIGludGVyZmFjZUludmFsaWQgYHN1cGVyKClgSW52YWxpZCBhY2Nlc3MgdG8gc3VwZXJJbmRleCBzdXBlciB3aXRoIHByaXZhdGUgbmFtZSBpcyBub3QgYWxsb3dlZCduZXcudGFyZ2V0JyBpcyBvbmx5IGFsbG93ZWQgaW4gdGhlIGJvZHkgb2YgYSBmdW5jdGlvbiBkZWNsYXJhdGlvbiwgZnVuY3Rpb24gZXhwcmVzc2lvbiwgb3IgY2xhc3MuSW1wb3J0IGlzIG5vdCBhbGxvd2VkIGhlcmVBbiBhcnJvdyBmdW5jdGlvbiBpcyBub3QgYWxsb3dlZCBoZXJlYGV4cG9ydGAgaXMgbm90IGFsbG93ZWQgaGVyZUEgZ2V0dGVyIG9yIGEgc2V0dGVyIGNhbm5vdCBiZSByZWFkb25seUEgZ2V0dGVyIG9yIGEgc2V0dGVyIGNhbm5vdCBiZSBvcHRpb25hbEEgYGdldGAgYWNjZXNzb3IgY2Fubm90IGhhdmUgcGFyYW1ldGVyc0EgYHNldGAgYWNjZXNzb3IgbXVzdCBoYXZlIGV4YWN0bHkgb25lIHBhcmFtZXRlcnRvcCBsZXZlbCBhd2FpdCBpcyBvbmx5IGFsbG93ZWQgaW4gbW9kdWxlTGVnYWN5IGRlY2ltYWwgZXNjYXBlIGlzIG5vdCBwZXJtaXR0ZWQgaW4gc3RyaWN0IG1vZGVMZWdhY3kgb2N0YWwgZXNjYXBlIGlzIG5vdCBwZXJtaXR0ZWQgaW4gc3RyaWN0IG1vZGVJbnZhbGlkIGNoYXJhY3RlciBpbiBpZGVudGlmaWVyYSBiaW5hcnlhbiBvY3RhbGEgZGVjaW1hbGEgaGV4YWRlY2ltYWxFeHBlY3RlZCAgZGlnaXQAAACWUxYACQAAAJ9TFgAGAAAAbk8WAGcAAABCAQAAGgAAAFNldHRlciBzaG91bGQgaGF2ZSBleGFjdGx5IG9uZSBwYXJhbWV0ZXJSZXN0IHBhdHRlcm4gaXMgbm90IGFsbG93ZWQgaW4gc2V0dGVyVW50ZXJtaW5hdGVkIGJsb2NrIGNvbW1lbnRVbnRlcm1pbmF0ZWQgc3RyaW5nIGNvbnN0YW50RXhwZWN0ZWQgdW5pY29kZSBlc2NhcGVVbmV4cGVjdGVkIGVzY2FwZSBzZXF1ZW5jZSBpbiByZXNlcnZlZCB3b3JkOiAAYlQWAC0AAABVbnRlcm1pbmF0ZWQgcmVnZXhwIGxpdGVyYWxVbnRlcm1pbmF0ZWQgdGVtcGxhdGVJZGVudGlmaWVyIGNhbm5vdCBmb2xsb3cgbnVtYmVyVW5leHBlY3RlZCBjaGFyYWN0ZXIg51QWABUAAABJbnZhbGlkIHN0cmluZyBlc2NhcGVJbnZhbGlkIHVuaWNvZGUgZXNjYXBlQmFkIGNoYXJhY3RlciBlc2NhcGUgc2VxdWVuY2UsIGV4cGVjdGVkIAAvVRYAKAAAAEV4cGVjdGVkICssIC0gb3IgZGVjaW1hbCBkaWdpdCBhZnRlciBlTGVnYWN5IGNvbW1lbnRzIGNhbm5vdCBiZSB1c2VkIGluIG1vZHVsZSBjb2RlYCBjYW5ub3QgYmUgdXNlZCBhcyBhbiBpZGVudGlmaWVyIGluIHN0cmljdCBtb2RlAGwaGAABAAAAs1UWADAAAABgYXdhaXRgIGNhbm5vdCBiZSB1c2VkIGFzIGFuIGlkZW50aWZpZXIgaW4gYW4gYXN5bmMgY29udGV4dCdldmFsJyBhbmQgJ2FyZ3VtZW50cycgY2Fubm90IGJlIHVzZWQgYXMgYSBiaW5kaW5nIGlkZW50aWZpZXIgaW4gc3RyaWN0IG1vZGUnYXJndW1lbnRzJyBpcyBvbmx5IGFsbG93ZWQgaW4gZnVuY3Rpb25zIGFuZCBjbGFzcyBtZXRob2RzSWxsZWdhbCAndXNlIHN0cmljdCcgZGlyZWN0aXZlIGluIGZ1bmN0aW9uIHdpdGggbm9uLXNpbXBsZSBwYXJhbWV0ZXIgbGlzdC4nKionIGNhbm5vdCBiZSBhcHBsaWVkIHRvIHVuYXJ5L2F3YWl0IGV4cHJlc3Npb24uVW5leHBlY3RlZCB0b2tlbiAnIydMaW5lQnJlYWsgY2Fubm90IGZvbGxvdyAndGhyb3cnVW5leHBlY3RlZCBsaW5lIGJyZWFrIGJldHdlZW4gYXJyb3cgaGVhZCBhbmQgYXJyb3dVbmV4cGVjdGVkIHRva2VuIGBgLiBFeHBlY3RlZCAAlVcWABIAAACnVxYADAAAACAsIG9yIAAAx1cWAAMAAAAgb3IgVW5leHBlY3RlZCB0b2tlbi4gRGlkIHlvdSBtZWFuIADYVxYAHwAAAJsaGAABAAAAY2Fubm90IGltcG9ydCBhcyByZXNlcnZlZCB3b3JkYXNzaWdubWVudCBwcm9wZXJ0eSBpcyBpbnZhbGlkIHN5bnRheEV4cGVjdGVkICcnLCBnb3QgJycAAEtYFgAKAAAAVVgWAAgAAABdWBYAAQAAAEV4cGVjdGVkICc7JywgJ30nIG9yIDxlb2Y+YXdhaXQqIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgYXN5bmMgZnVuY3Rpb25zIHByb3Bvc2FsLiBVc2UgUHJvbWlzZS5hbGwoKSBpbnN0ZWFkLkNhbm5vdCB1c2UgYSByZXNlcnZlZCB3b3JkIGFzIGEgc2hvcnRoYW5kIHByb3BlcnR5TnVsbGlzaCBjb2FsZXNjaW5nIG9wZXJhdG9yKD8/KSByZXF1aXJlcyBwYXJlbnMgd2hlbiBtaXhpbmcgd2l0aCBsb2dpY2FsIG9wZXJhdG9yc0Egc3dpdGNoIGJsb2NrIGNhbm5vdCBoYXZlIG11bHRpcGxlIGRlZmF1bHRzVHJhaWxpbmcgY29tbWEgaXNuJ3QgcGVybWl0dGVkIGFmdGVyIGEgcmVzdCBlbGVtZW50UmVzdCBlbGVtZW50IG11c3QgYmUgZmluYWwgZWxlbWVudFBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbiBjYW5ub3QgY29udGFpbiBzcHJlYWQgb3BlcmF0b3JQYXJlbnRoZXNpemVkIGV4cHJlc3Npb24gY2Fubm90IGJlIGVtcHR5Tm90IGEgcGF0dGVybk5vdCBhbiBleHByZXNzaW9uQ2Fubm90IGFzc2lnbiB0byB0aGlzSW52YWxpZCBhc3NpZ25tZW50IHRhcmdldEV4cGVjdGVkIGlkZW50RXhwZWN0ZWQgJzsnIG9yIGxpbmUgYnJlYWtMYWJlbCAgaXMgYWxyZWFkeSBkZWNsYXJlZAAAAL9aFgAGAAAAxVoWABQAAABBbiBhc3luYyBmdW5jdGlvbiBjYW5ub3QgYmUgZ2VuZXJhdG9yJ2ltcG9ydCcsIGFuZCAnZXhwb3J0JyBhcmUgbm90IHBlcm1pdHRlZCBoZXJlJ2ltcG9ydCcsIGFuZCAnZXhwb3J0JyBjYW5ub3QgYmUgdXNlZCBvdXRzaWRlIG9mIG1vZHVsZSBjb2RlJ2ltcG9ydC5tZXRhJyBjYW5ub3QgYmUgdXNlZCBvdXRzaWRlIG9mIG1vZHVsZSBjb2RlLkRlc3RydWN0dXJpbmcgYmluZGluZ3MgcmVxdWlyZSBpbml0aWFsaXplcnNXaXRoIHN0YXRlbWVudCBhcmUgbm90IGFsbG93ZWQgaW4gc3RyaWN0IG1vZGVSZXR1cm4gc3RhdGVtZW50IGlzIG5vdCBhbGxvd2VkIGhlcmVFeHBlY3RlZCBvbmUgdmFyaWFibGUgYmluZGluZ1VuZXhwZWN0ZWQgaW5pdGlhbGl6ZXIgaW4gZm9yIGluL29mIGxvb3BHZW5lcmF0b3Igb3IgYXN5bmMgZnVuY3Rpb24gY2Fubm90IGJlIGxhYmVsbGVkRnVuY3Rpb24gY2Fubm90IGJlIGxhYmVsbGVkIGluIHN0cmljdCBtb2RlJ3lpZWxkJyBjYW5ub3QgYmUgdXNlZCBhcyBhIHBhcmFtZXRlciB3aXRoaW4gZ2VuZXJhdG9yYGF3YWl0YCBleHByZXNzaW9ucyBjYW5ub3QgYmUgdXNlZCBpbiBhIHBhcmFtZXRlciBpbml0aWFsaXplci5mb3IgYXdhaXQgc3ludGF4IGlzIHZhbGlkIG9ubHkgZm9yIGZvci1vZiBzdGF0ZW1lbnRhd2FpdCBpc24ndCBhbGxvd2VkIGluIG5vbi1hc3luYyBmdW5jdGlvblVudGVybWluYXRlZCBKU1ggY29udGVudHNKU1ggYXR0cmlidXRlcyBtdXN0IG9ubHkgYmUgYXNzaWduZWQgYSBub24tZW1wdHkgZXhwcmVzc2lvbkpTWCB2YWx1ZSBzaG91bGQgYmUgZWl0aGVyIGFuIGV4cHJlc3Npb24gb3IgYSBxdW90ZWQgSlNYIHRleHRFeHBlY3RlZCBjb3JyZXNwb25kaW5nIEpTWCBjbG9zaW5nIHRhZyBmb3IgPD5FeHBlY3RlZCBjb3JyZXNwb25kaW5nIEpTWCBjbG9zaW5nIHRhZyBmb3IgPAAAAFVeFgAsAAAABRgYAAEAAABMZWFkaW5nIGRlY29yYXRvcnMgbXVzdCBiZSBhdHRhY2hlZCB0byBhIGNsYXNzIGRlY2xhcmF0aW9uVXNpbmcgdGhlIGV4cG9ydCBrZXl3b3JkIGJldHdlZW4gYSBkZWNvcmF0b3IgYW5kIGEgY2xhc3MgaXMgbm90IGFsbG93ZWQuIFBsZWFzZSB1c2UgYGV4cG9ydCBAZGVjIGNsYXNzYCBpbnN0ZWFkLkEgcmVxdWlyZWQgZWxlbWVudCBjYW5ub3QgZm9sbG93IGFuIG9wdGlvbmFsIGVsZW1lbnQuVHlwZXNjcmlwdCBwYXJhbWV0ZXIgcHJvcGVydHkgbXVzdCBiZSBhbiBpZGVudGlmaWVyIG9yIGFzc2lnbm1lbnQgcGF0dGVyblVuZXhwZWN0ZWQgc3BhY2UgYmV0d2VlbiAjIGFuZCBpZGVudGlmaWVyQ29uc3RydWN0b3IgY2FuJ3QgYmUgYW4gYXN5bmMgZnVuY3Rpb25DbGFzc2VzIG1heSBub3QgaGF2ZSBhIG5vbi1zdGF0aWMgZmllbGQgbmFtZWQgJ2NvbnN0cnVjdG9yJ0NsYXNzZXMgY2FuJ3QgaGF2ZSBhIHByaXZhdGUgZmllbGQgbmFtZWQgJyNjb25zdHJ1Y3RvcicuJyBtb2RpZmllciBjYW5ub3QgYmUgdXNlZCB3aXRoIGEgcHJpdmF0ZSBpZGVudGlmaWVyAAAAXVgWAAEAAAB+YBYAMwAAAENsYXNzIGNvbnN0cnVjdG9yIGNhbid0IGJlIGFuIGFjY2Vzc29yLkEgbWV0aG9kIGNhbm5vdCBiZSByZWFkb25seUEgY29uc3RydWN0b3IgY2Fubm90IGJlIGdlbmVyYXRvckEgY2xhc3MgY2FuIG9ubHkgaGF2ZSBvbmUgY29uc3RydWN0b3JBIGJpbmRpbmcgcGF0dGVybiBwYXJhbWV0ZXIgY2Fubm90IGJlIG9wdGlvbmFsIGluIGFuIGltcGxlbWVudGF0aW9uIHNpZ25hdHVyZS5TdXBlciBjYWxsIGNhbm5vdCBiZSBvcHRpb25hbENvbnN0cnVjdG9yIGluL2FmdGVyIGFuIG9wdGlvbmFsIGNoYWluaW5nIGlzIG5vdCBhbGxvd2VkLlRhZ2dlZCB0ZW1wbGF0ZSBsaXRlcmFsIGlzIG5vdCBhbGxvd2VkIGluIG9wdGlvbmFsIGNoYWluLlRyYWlsaW5nIGNvbW1hIGlzIGRpc2FsbG93ZWQgaW5zaWRlIGltcG9ydCguLi4pIGFyZ3VtZW50c2V4cG9ydCBkZWZhdWx0IHN0YXRlbWVudHMgcmVxdWlyZWQgZnJvbSAnLi4uJztgIGNhbm5vdCBiZSB1c2VkIHdpdGhvdXQgYGZyb21gIGNsYXVzZQAAbBoYAAEAAACQYhYAJgAAAGAuLi5gIG11c3QgYmUgZm9sbG93ZWQgYnkgYW4gaWRlbnRpZmllciBpbiBkZWNsYXJhdGlvbiBjb250ZXh0c0EgbnVtZXJpYyBzZXBhcmF0b3IgaXMgb25seSBhbGxvd2VkIGJldHdlZW4gdHdvIGRpZ2l0c0Egc3RyaW5nIGxpdGVyYWwgY2Fubm90IGJlIHVzZWQgYXMgYW4gaW1wb3J0ZWQgYmluZGluZy4KLSBEaWQgeW91IG1lYW4gYGltcG9ydCB7ICIiIGFzIGZvbyB9YD8APWMWAFIAAACPYxYADAAAAEEgc3RyaW5nIGxpdGVyYWwgY2Fubm90IGJlIHVzZWQgYXMgYW4gZXhwb3J0ZWQgYmluZGluZyB3aXRob3V0IGBmcm9tYC4nY29uc3QnIGRlY2xhcmF0aW9ucyBtdXN0IGJlIGluaXRpYWxpemVkRHVwbGljYXRlZCByZWd1bGFyIGV4cHJlc3Npb24gZmxhZyAnJy4aZBYAJAAAAD5kFgACAAAAVW5rbm93biByZWd1bGFyIGV4cHJlc3Npb24gZmxhZ3MuRXhwZWN0ZWQgYW4gaWRlbnRpZmllckV4cGVjdGVkIGEgc2VtaWNvbG9uVHJhaWxpbmcgY29tbWEgaXMgbm90IGFsbG93ZWRBIHJlc3QgcGFyYW1ldGVyIG11c3QgYmUgbGFzdCBpbiBhIHBhcmFtZXRlciBsaXN0UGFyYW1ldGVyIGNhbm5vdCBoYXZlIHF1ZXN0aW9uIG1hcmsgYW5kIGluaXRpYWxpemVyJyBtb2RpZmllciBtdXN0IHByZWNlZGUgJycgbW9kaWZpZXIuXVgWAAEAAAAcZRYAGQAAADVlFgALAAAAJyBtb2RpZmllciBhbHJlYWR5IHNlZW4uXVgWAAEAAABYZRYAGAAAAGBkZWNsYXJlYCBtb2RpZmllciBjYW5ub3QgYXBwZWFyIG9uIGNsYXNzIGVsZW1lbnRzIG9mIHRoaXMga2luZGBkZWNsYXJlYCBtb2RpZmllciBub3QgYWxsb3dlZCBmb3IgY29kZSBhbHJlYWR5IGluIGFuIGFtYmllbnQgY29udGV4dGBhc3luY2AgbW9kaWZpZXIgY2Fubm90IGJlIHVzZWQgaGVyZUEgcmVzdCBwYXJhbWV0ZXIgY2Fubm90IGJlIG9wdGlvbmFsQSByZXN0IHBhcmFtZXRlciBjYW5ub3QgaGF2ZSBhbiBpbml0aWFsaXplcmpzYy50YXJnZXQgc2hvdWxkIGJlIGVzNSBvciB1cHBlciB0byB1c2UgZ2V0dGVyIC8gc2V0dGVyTGVnYWN5IG9jdGFsIGxpdGVyYWxzIGFyZSBub3QgYXZhaWxhYmxlIHdoZW4gdGFyZ2V0aW5nIEVDTUFTY3JpcHQgNSBhbmQgaGlnaGVyJyBtb2RpZmllciBjYW5ub3QgYXBwZWFyIG9uIGEgY29uc3RydWN0b3IgZGVjbGFyYXRpb24AAABdWBYAAQAAAPxmFgA1AAAAVHlwZSBwYXJhbWV0ZXJzIGNhbm5vdCBhcHBlYXIgb24gYSBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbkFuIGluZGV4IHNpZ25hdHVyZSBtdXN0IGhhdmUgZXhhY3RseSBvbmUgcGFyYW1ldGVyVHlwZSBwYXJhbWV0ZXIgbGlzdCBjYW5ub3QgYmUgZW1wdHlJbnZhbGlkIHVzZSBvZiAnYXJndW1lbnRzJyBpbiBzdHJpY3QgbW9kZSdkZWxldGUnIGNhbm5vdCBiZSBjYWxsZWQgb24gYW4gaWRlbnRpZmllciBpbiBzdHJpY3QgbW9kZUEgJ2JyZWFrJyBzdGF0ZW1lbnQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoaW4gYW4gZW5jbG9zaW5nIGl0ZXJhdGlvbiBvciBzd2l0Y2ggc3RhdGVtZW50VGhlIGxlZnQtaGFuZCBzaWRlIG9mIGEgYGZvci4uLm9mYCBzdGF0ZW1lbnQgbWF5IG5vdCBiZSBgYXN5bmNgSnVtcCB0YXJnZXQgY2Fubm90IGNyb3NzIGZ1bmN0aW9uIGJvdW5kYXJ5RXhwcmVzc2lvbiBleHBlY3RlZHR5cGUgZXhwZWN0ZWREdXBsaWNhdGUgbGFiZWxBICdjb250aW51ZScgc3RhdGVtZW50IGNhbiBvbmx5IGp1bXAgdG8gYSBsYWJlbCBvZiBhbiBlbmNsb3NpbmcgaXRlcmF0aW9uIHN0YXRlbWVudEEgJ2JyZWFrJyBzdGF0ZW1lbnQgY2FuIG9ubHkganVtcCB0byBhIGxhYmVsIG9mIGFuIGVuY2xvc2luZyBzdGF0ZW1lbnRWYXJpYWJsZSBkZWNsYXJhdGlvbiBsaXN0IGNhbm5vdCBiZSBlbXB0eWxpdGVyYWwgaW4gYW4gaW1wb3J0IHR5cGUgc2hvdWxkIGJlIHN0cmluZyBsaXRlcmFsQW4gb2JqZWN0IG1lbWJlciBjYW5ub3QgYmUgZGVjbGFyZWQgb3B0aW9uYWxDb21wdXRlZCBwcm9wZXJ0eSBuYW1lcyBhcmUgbm90IGFsbG93ZWQgaW4gZW51bXNBIGNvbW1hIGV4cHJlc3Npb24gaXMgbm90IGFsbG93ZWQgaW4gYSBjb21wdXRlZCBwcm9wZXJ0eSBuYW1lYGV4dGVuZHNgIGNsYXVzZSBhbHJlYWR5IHNlZW4uJ2V4dGVuZHMnIGNsYXVzZSBtdXN0IHByZWNlZGUgJ2ltcGxlbWVudHMnIGNsYXVzZS5DbGFzc2VzIGNhbiBvbmx5IGV4dGVuZCBhIHNpbmdsZSBjbGFzc2BpbXBsZW1lbnRzYCBjbGF1c2UgYWxyZWFkeSBzZWVuQW4gaW1wbGVtZW50YXRpb24gY2Fubm90IGJlIGRlY2xhcmVkIGluIGFtYmllbnQgY29udGV4dHNNb2RpZmllcnMgY2Fubm90IGFwcGVhciBoZXJlTWVyZ2UgY29uZmxpY3QgbWFya2VyIGVuY291bnRlcmVkLlR5cGUgYW5ub3RhdGlvbiBjYW5ub3QgYXBwZWFyIG9uIGEgY29uc3RydWN0b3IgZGVjbGFyYXRpb25DYXRjaCBjbGF1c2UgdmFyaWFibGUgY2Fubm90IGhhdmUgYSB0eXBlIGFubm90YXRpb25gYWJzdHJhY3RgIG1vZGlmaWVyIGNhbiBvbmx5IGFwcGVhciBvbiBhIGNsYXNzIG9yIG1ldGhvZCBkZWNsYXJhdGlvbicgbW9kaWZpZXIgY2Fubm90IGJlIHVzZWQgd2l0aCAnAAAAXVgWAAEAAABtbBYAIAAAADVlFgALAAAAQWJzdHJhY3QgbWV0aG9kcyBjYW4gb25seSBhcHBlYXIgd2l0aGluIGFuIGFic3RyYWN0IGNsYXNzLkFic3RyYWN0IG1ldGhvZCBjYW5ub3QgaGF2ZSBhbiBpbXBsZW1lbnRhdGlvbi5BYnN0cmFjdCBwcm9wZXJ0eSBjYW5ub3QgaGF2ZSBhbiBpbml0aWFsaXplci4nIG1vZGlmaWVyIGNhbm5vdCBhcHBlYXIgb24gYSB0eXBlIHBhcmFtZXRlcgAAAF1YFgABAAAAPW0WACwAAAAnIG1vZGlmaWVyIGNhbiBvbmx5IGFwcGVhciBvbiBhIHR5cGUgcGFyYW1ldGVyIG9mIGEgY2xhc3MsIGludGVyZmFjZSBvciB0eXBlIGFsaWFzAABdWBYAAQAAAHxtFgBSAAAAJyBtb2RpZmllciBjYW4gb25seSBhcHBlYXIgb24gYSB0eXBlIHBhcmFtZXRlciBvZiBhIGZ1bmN0aW9uLCBtZXRob2Qgb3IgY2xhc3MAAABdWBYAAQAAAOBtFgBNAAAAVGhlICd0eXBlJyBtb2RpZmllciBjYW5ub3QgYmUgdXNlZCBvbiBhIG5hbWVkIGltcG9ydCB3aGVuICdpbXBvcnQgdHlwZScgaXMgdXNlZCBvbiBpdHMgaW1wb3J0IHN0YXRlbWVudC5UaGUgJ3R5cGUnIG1vZGlmaWVyIGNhbm5vdCBiZSB1c2VkIG9uIGEgbmFtZWQgZXhwb3J0IHdoZW4gJ2V4cG9ydCB0eXBlJyBpcyB1c2VkIG9uIGl0cyBleHBvcnQgc3RhdGVtZW50LkEgcGFyYW1ldGVyIHByb3BlcnR5IGlzIG9ubHkgYWxsb3dlZCBpbiBhIGNvbnN0cnVjdG9yIGltcGxlbWVudGF0aW9uQSBwYXJhbWV0ZXIgaW5pdGlhbGl6ZXIgaXMgb25seSBhbGxvd2VkIGluIGEgZnVuY3Rpb24gb3IgY29uc3RydWN0b3IgaW1wbGVtZW50YXRpb25UaGUgbGVmdC1oYW5kIHNpZGUgb2YgYW4gYXNzaWdubWVudCBleHByZXNzaW9uIG11c3QgYmUgYSB2YXJpYWJsZSBvciBhIHByb3BlcnR5IGFjY2Vzcy5UaGUgJ3dpdGgnIHN0YXRlbWVudCBpcyBub3Qgc3VwcG9ydGVkLiBBbGwgc3ltYm9scyBpbiBhICd3aXRoJyBibG9jayB3aWxsIGhhdmUgdHlwZSAnYW55Jy5JbnZhbGlkIGNsYXNzIG5hbWVpbnRlcmZhY2UgbmFtZSBpcyBpbnZhbGlkQW4gZW51bSBtZW1iZXIgY2Fubm90IGhhdmUgYSBudW1lcmljIG5hbWVUaGUgbGVmdC1oYW5kIHNpZGUgb2YgYSAnZm9yLi4ub2YnIHN0YXRlbWVudCBjYW5ub3QgdXNlIGEgdHlwZSBhbm5vdGF0aW9uVGhlIGxlZnQtaGFuZCBzaWRlIG9mIGEgJ2Zvci4uLmluJyBzdGF0ZW1lbnQgY2Fubm90IGJlIGEgZGVzdHJ1Y3R1cmluZyBwYXR0ZXJuQW4gaW50ZXJmYWNlIGNhbiBvbmx5IGV4dGVuZCBhbiBpZGVudGlmaWVyL3F1YWxpZmllZC1uYW1lIHdpdGggb3B0aW9uYWwgdHlwZSBhcmd1bWVudHMuVGhlIG9wZXJhbmQgb2YgYSBkZWxldGUgb3BlcmF0b3IgbXVzdCBiZSBhIHByb3BlcnR5IHJlZmVyZW5jZS5UaGlzIG1lbWJlciBjYW5ub3QgaGF2ZSBhbiAnb3ZlcnJpZGUnIG1vZGlmaWVyIGJlY2F1c2UgaXRzIGNvbnRhaW5pbmcgY2xhc3MgZG9lcyBub3QgZXh0ZW5kIGFub3RoZXIgY2xhc3MuRGVjb3JhdG9ycyBtYXkgbm90IGFwcGVhciBhZnRlciBgZXhwb3J0YCBvciBgZXhwb3J0IGRlZmF1bHRgIGlmIHRoZXkgYWxzbyBhcHBlYXIgYmVmb3JlIGBleHBvcnRgLkFuIGFjY2Vzc2liaWxpdHkgbW9kaWZpZXIgY2Fubm90IGJlIHVzZWQgd2l0aCBhIHByaXZhdGUgaWRlbnRpZmllci5UeXBlIGFubm90YXRpb25zIG11c3QgY29tZSBiZWZvcmUgZGVmYXVsdCBhc3NpZ25tZW50c1R5cGVzY3JpcHQgbm9uLW51bGwgYXNzZXJ0aW9uIG9wZXJhdG9yIGlzIG5vdCBhbGxvd2VkIHdpdGggJwAbcxYAPAAAAF1YFgABAAAAVGhpcyBzeW50YXggaXMgcmVzZXJ2ZWQgaW4gZmlsZXMgd2l0aCB0aGUgLm10cyBvciAuY3RzIGV4dGVuc2lvbi4gVXNlIGFuIGBhc2AgZXhwcmVzc2lvbiBpbnN0ZWFkLlRoaXMgc3ludGF4IGlzIHJlc2VydmVkIGluIGZpbGVzIHdpdGggdGhlIC5tdHMgb3IgLmN0cyBleHRlbnNpb24uIEFkZCBhIHRyYWlsaW5nIGNvbW1hLCBhcyBpbiBgPFQsPigpID0+IC4uLmAuVGhpcyBpcyB0aGUgZXhwcmVzc2lvbiBwYXJ0IG9mIGFuIGV4cHJlc3Npb24gc3RhdGVtZW50cHJldmlvdXMgZGVmYXVsdCBjYXNlIGlzIGRlY2xhcmVkIGF0IGhlcmVFb2ZEZWNsTm90QWxsb3dlZFVzaW5nRGVjbE5vdEFsbG93ZWRVc2luZ0RlY2xOb3RBbGxvd2VkRm9yRm9ySW5Mb29wVXNpbmdEZWNsTm90RW5hYmxlZEludmFsaWROYW1lSW5Vc2luZ0RlY2xJbml0UmVxdWlyZWRGb3JVc2luZ0RlY2xQcml2YXRlTmFtZUluSW50ZXJmYWNlSW52YWxpZFN1cGVyQ2FsbEludmFsaWRTdXBlckludmFsaWRTdXBlclByaXZhdGVOYW1lSW52YWxpZE5ld1RhcmdldEludmFsaWRJbXBvcnRBcnJvd05vdEFsbG93ZWRFeHBvcnROb3RBbGxvd2VkR2V0dGVyU2V0dGVyQ2Fubm90QmVSZWFkb25seUdldHRlclNldHRlckNhbm5vdEJlT3B0aW9uYWxHZXR0ZXJQYXJhbVNldHRlclBhcmFtVG9wTGV2ZWxBd2FpdEluU2NyaXB0TGVnYWN5RGVjaW1hbExlZ2FjeU9jdGFsSW52YWxpZElkZW50Q2hhckV4cGVjdGVkRGlnaXRyYWRpeFNldHRlclBhcmFtUmVxdWlyZWRSZXN0UGF0SW5TZXR0ZXJVbnRlcm1pbmF0ZWRCbG9ja0NvbW1lbnRVbnRlcm1pbmF0ZWRTdHJMaXRFeHBlY3RlZFVuaWNvZGVFc2NhcGVFc2NhcGVJblJlc2VydmVkV29yZHdvcmRVbnRlcm1pbmF0ZWRSZWdFeHBVbnRlcm1pbmF0ZWRUcGxJZGVudEFmdGVyTnVtVW5leHBlY3RlZENoYXJjSW52YWxpZFN0ckVzY2FwZUludmFsaWRVbmljb2RlRXNjYXBlQmFkQ2hhcmFjdGVyRXNjYXBlU2VxdWVuY2VleHBlY3RlZE51bUxpdFRlcm1pbmF0ZWRXaXRoRXhwTGVnYWN5Q29tbWVudEluTW9kdWxlSW52YWxpZElkZW50SW5TdHJpY3RJbnZhbGlkSWRlbnRJbkFzeW5jRXZhbEFuZEFyZ3VtZW50c0luU3RyaWN0QXJndW1lbnRzSW5DbGFzc0ZpZWxkSWxsZWdhbExhbmd1YWdlTW9kZURpcmVjdGl2ZVVuYXJ5SW5FeHBsZWZ0X3NwYW5IYXNoTGluZUJyZWFrSW5UaHJvd0xpbmVCcmVha0JlZm9yZUFycm93VW5leHBlY3RlZGdvdFVuZXhwZWN0ZWRUb2tlbldpdGhTdWdnZXN0aW9uc2NhbmRpZGF0ZV9saXN0UmVzZXJ2ZWRXb3JkSW5JbXBvcnRBc3NpZ25Qcm9wZXJ0eUV4cGVjdGVkRXhwZWN0ZWRTZW1pRm9yRXhwclN0bXRBd2FpdFN0YXJSZXNlcnZlZFdvcmRJbk9ialNob3J0aGFuZE9yUGF0TnVsbGlzaENvYWxlc2NpbmdXaXRoTG9naWNhbE9wTXVsdGlwbGVEZWZhdWx0cHJldmlvdXNDb21tYUFmdGVyUmVzdEVsZW1lbnROb25MYXN0UmVzdFBhcmFtU3ByZWFkSW5QYXJlbkV4cHJFbXB0eVBhcmVuRXhwckludmFsaWRQYXRJbnZhbGlkRXhwck5vdFNpbXBsZUFzc2lnbkludmFsaWRBc3NpZ25UYXJnZXRFeHBlY3RlZElkZW50RXhwZWN0ZWRTZW1pRHVwbGljYXRlTGFiZWxBc3luY0dlbmVyYXRvck5vblRvcExldmVsSW1wb3J0RXhwb3J0SW1wb3J0RXhwb3J0SW5TY3JpcHRJbXBvcnRNZXRhSW5TY3JpcHRQYXRWYXJXaXRob3V0SW5pdFdpdGhJblN0cmljdFJldHVybk5vdEFsbG93ZWRUb29NYW55VmFySW5Gb3JJbkhlYWRWYXJJbml0aWFsaXplckluRm9ySW5IZWFkTGFiZWxsZWRHZW5lcmF0b3JPckFzeW5jTGFiZWxsZWRGdW5jdGlvbkluU3RyaWN0WWllbGRQYXJhbUluR2VuQXdhaXRQYXJhbUluQXN5bmNBd2FpdEZvclN0bXRBd2FpdEluRnVuY3Rpb25VbnRlcm1pbmF0ZWRKU1hDb250ZW50c0VtcHR5SlNYQXR0ckludmFsaWRKU1hWYWx1ZUpTWEV4cGVjdGVkQ2xvc2luZ1RhZ0Zvckx0R3RKU1hFeHBlY3RlZENsb3NpbmdUYWdJbnZhbGlkTGVhZGluZ0RlY29yYXRvckRlY29yYXRvck9uRXhwb3J0VHNSZXF1aXJlZEFmdGVyT3B0aW9uYWxUc0ludmFsaWRQYXJhbVByb3BQYXRTcGFjZUJldHdlZW5IYXNoQW5kSWRlbnRBc3luY0NvbnN0cnVjdG9yUHJvcGVydHlOYW1lZENvbnN0cnVjdG9yUHJpdmF0ZUNvbnN0cnVjdG9yUHJpdmF0ZU5hbWVNb2RpZmllckNvbnN0cnVjdG9yQWNjZXNzb3JSZWFkT25seU1ldGhvZEdlbmVyYXRvckNvbnN0cnVjdG9yRHVwbGljYXRlQ29uc3RydWN0b3JUc0JpbmRpbmdQYXRDYW5ub3RCZU9wdGlvbmFsU3VwZXJDYWxsT3B0aW9uYWxPcHRDaGFpbkNhbm5vdEZvbGxvd0NvbnN0cnVjdG9yQ2FsbFRhZ2dlZFRwbEluT3B0Q2hhaW5UcmFpbGluZ0NvbW1hSW5zaWRlSW1wb3J0RXhwb3J0RGVmYXVsdFdpdGhPdXRGcm9tRXhwb3J0RXhwZWN0RnJvbURvdHNXaXRob3V0SWRlbnRpZmllck51bWVyaWNTZXBhcmF0b3JJc0FsbG93ZWRPbmx5QmV0d2VlblR3b0RpZ2l0c0ltcG9ydEJpbmRpbmdJc1N0cmluZ0V4cG9ydEJpbmRpbmdJc1N0cmluZ0NvbnN0RGVjbGFyYXRpb25zUmVxdWlyZUluaXRpYWxpemF0aW9uRHVwbGljYXRlZFJlZ0V4cEZsYWdzVW5rbm93blJlZ0V4cEZsYWdzVFMxMDAzVFMxMDA1VFMxMDA5VFMxMDE0VFMxMDE1VFMxMDI5VFMxMDMwVFMxMDMxVFMxMDM4VFMxMDQyVFMxMDQ3VFMxMDQ4VFMxMDU2VFMxMDg1VFMxMDg5VFMxMDkyVFMxMDk2VFMxMDk4VFMxMTAwVFMxMTAyVFMxMTA1VFMxMTA2VFMxMTA3VFMxMTA5VFMxMTEwVFMxMTE0VFMxMTE1VFMxMTE2VFMxMTIzVFMxMTQxVFMxMTYyVFMxMTY0VFMxMTcxVFMxMTcyVFMxMTczVFMxMTc0VFMxMTc1VFMxMTgzVFMxMTg0VFMxMTg1VFMxMDkzVFMxMTk2VFMxMjQyVFMxMjQzVFMxMjQ0VFMxMjQ1VFMxMjY3VFMxMjczVFMxMjc0VFMxMjc3VFMyMjA2VFMyMjA3VFMyMzY5VFMyMzcxVFMyNDA2VFMyNDEwVFMyNDE0VFMyNDI3VFMyNDUyVFMyNDgzVFMyNDkxVFMyNDk5VFMyNzAzVFM0MTEyVFM4MDM4VFMxODAxMFRTVHlwZUFubm90YXRpb25BZnRlckFzc2lnblRzTm9uTnVsbEFzc2VydGlvbk5vdEFsbG93ZWRXaXRoTGFiZWxpbm5lcm5vdGVSZXNlcnZlZFR5cGVBc3NlcnRpb25SZXNlcnZlZEFycm93VHlwZVBhcmFtL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvc3djX2VjbWFfcGFyc2VyLTYuMC4xL3NyYy9sZXhlci91dGlsLnJzU3RyVGhpc1VuYXJ5VXBkYXRlQmluQ29uZENhbGxOZXdTZXFMaXRBcnJvd1lpZWxkTWV0YVByb3BBd2FpdEpTWE1lbWJlckpTWE5hbWVzcGFjZWROYW1lSlNYRW1wdHlKU1hFbGVtZW50SlNYRnJhZ21lbnRUc0NvbnN0QXNzZXJ0aW9uU2hvcnRoYW5kS2V5VmFsdWVHZXR0ZXJTZXR0ZXJNZXRob2RCbG9ja0RlYnVnZ2VyV2l0aFJldHVybkxhYmVsZWRCcmVha0NvbnRpbnVlSWZTd2l0Y2hUaHJvd1RyeVdoaWxlRG9XaGlsZUZvckZvckluRm9yT2ZEZWNsAEYEAAAMAAAABAAAAKIBAACUBAAADAAAAAQAAACVBAAAlgQAAAQAAAAEAAAAlgEAAAAAAAABAAAAAQAAAA8AAACXBAAABAAAAAQAAABCAgAAmAQAAAQAAAAEAAAAdAIAAAAAAAAEAAAABAAAAJkEAABkZWNvcmF0b3Jzc3VwZXJfY2xhc3Npc19hYnN0cmFjdHN1cGVyX3R5cGVfcGFyYW1zAAAAbysYAAQAAABkiBYABAAAADiBFgAKAAAALokWAAQAAABCgRYACwAAAE2BFgALAAAARokWAAsAAABYgRYAEQAAAHAdGAAKAAAAVmFyRGVjbGRlY2xzVHJ5U3RtdGJsb2NraGFuZGxlcmZpbmFsaXplckpTWE1lbWJlckV4cHJVc2luZ0RlY2xpc19hd2FpdG9wZW5pbmdjbG9zaW5nQmxvY2tTdG10c3RtdHMAAJoEAAAMAAAABAAAAJsEAACcBAAAGAAAAAQAAABOBAAAKIkWAAYAAAA4gRYACgAAAG8rGAAEAAAAZIgWAAQAAAAuiRYABAAAADqJFgAMAAAAMokWAAgAAABGiRYACwAAAFGJFgALAAAARnVuY3Rpb25Uc0tleXdvcmRUeXBlVHNUaGlzVHlwZVRzRm5PckNvbnN0cnVjdG9yVHlwZVRzVHlwZVJlZlRzVHlwZVF1ZXJ5VHNUeXBlTGl0VHNBcnJheVR5cGVUc1R1cGxlVHlwZVRzT3B0aW9uYWxUeXBlVHNSZXN0VHlwZVRzVW5pb25PckludGVyc2VjdGlvblR5cGVUc0NvbmRpdGlvbmFsVHlwZVRzSW5mZXJUeXBlVHNQYXJlbnRoZXNpemVkVHlwZVRzVHlwZU9wZXJhdG9yVHNJbmRleGVkQWNjZXNzVHlwZVRzTWFwcGVkVHlwZVRzTGl0VHlwZVRzVHlwZVByZWRpY2F0ZVRzSW1wb3J0VHlwZVRzVHlwZUFubnR5cGVfYW5uSlNYT3BlbmluZ0VsZW1lbnRhdHRyc3NlbGZfY2xvc2luZwCMBAAAGAAAAAgAAADGAQAAVHNFbnVtRGVjbGlzX2NvbnN0bWVtYmVyc1RzUXVhbGlmaWVkTmFtZVRzTW9kdWxlRGVjbJ0EAAAMAAAABAAAAJ4EAAAAAAAABAAAAAQAAACfBAAAbysYAAQAAACwrhYAAgAAAFwaGAAHAAAARokWAAsAAACUGhgABwAAAC6JFgAEAAAAVHNJbnRlcmZhY2VEZWNsVHNNb2R1bGVCbG9ja1RzTmFtZXNwYWNlRGVjbFRzVHlwZUFsaWFzRGVjbFRzVHlwZVBhcmFtRGVjbFRzSW1wb3J0RXF1YWxzRGVjbGlzX2V4cG9ydGlzX3R5cGVfb25seW1vZHVsZV9yZWZUc1R5cGVQYXJhbUluc3RhbnRpYXRpb24AAFgaGAACAAAAPx0YAAEAAADdHBgAAQAAALwaGAABAAAAoRoYAAMAAAC/FxgAAQAAAFcaGAABAAAAYNAYAAEAAACkGhgAAQAAAKUaGAABAAAAWhoYAAEAAABbGhgAAQAAALEXGAABAAAA+hsYAAEAAABsGhgAAQAAAHRlbXBsYXRlIHRva2VuIChshRYAEAAAAGDQGAABAAAAnBoYAAEAAACAGhgAAgAAAJsaGAABAAAAHRgYAAIAAAAfGBgAAgAAAMAXGAABAAAAc3RyaW5nIGxpdGVyYWwgKLyFFgAQAAAAoDMYAAIAAABg0BgAAQAAAHJlZ2V4cCBsaXRlcmFsICjkhRYAEAAAAKAzGAACAAAAYNAYAAEAAABudW1lcmljIGxpdGVyYWwgKAAAAAyGFgARAAAAoDMYAAIAAABg0BgAAQAAAGJpZ2ludCBsaXRlcmFsICg4hhYAEAAAAKAzGAACAAAAYNAYAAEAAABqc3ggbmFtZSAoAABghhYACgAAAGDQGAABAAAAanN4IHRleHQgKAAAfIYWAAoAAABg0BgAAQAAAAD0FwARAAAAPiAoanN4IHRhZyBlbmQpAKCGFgAPAAAARBwYAAIAAAA8bGV4aW5nIGVycm9yOiAAwIYWAA8AAAAFGBgAAQAAAGNvbnRleHQuY3VycmVudCgpIGlmIFBhcmVuU3RtdCwgc28gcHJldiB0b2tlbiBjYW5ub3QgYmUgTm9uZXguGABtAAAAKwIAABoAAAAMAAAAeC4YAG0AAADpAQAALQAAAAEAAAAAAAAAvBoYAAEAAAABAAAAAAAAAJwaGAABAAAAaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogVXNpbmcgaXMgbm90IGEgdmFsaWQgZGVjbGFyYXRpb24gZm9yIGBkZWNsYXJlYCBrZXl3b3JkYIcWAGAAAABQ7xcAcwAAAAcLAAAcAAAAcGFja2FnZQAAAAAACAAAAAQAAAB7AAAAVHBsZXhwcnNxdWFzaXNTdXBlcgAAAAAAAQAAAAEAAAAPAAAARm5EZWNsaWRlbnRJbXBvcnRGbkV4cHIAAAAAAAQAAAAEAAAAgwIAAHBoYXNlAAAAAAAAAAQAAAAEAAAAyAEAAAAAAAAEAAAABAAAAJAAAABjdHh0c3ltb3B0aW9uYWxCaW5FeHByb3BsZWZ0cmlnaHROZXdFeHByY2FsbGVlYXJnc3R5cGVfYXJnc09wdENhbGxTZXFFeHByQXJyYXlMaXRlbGVtc0NhbGxFeHByQ29uZEV4cHJ0ZXN0Y29uc2FsdFRoaXNFeHByQ2xhc3NEZWNsAACgBAAADAAAAAQAAAChBAAAogQAAAQAAAAEAAAAowQAAJcEAAAEAAAABAAAAEICAAAAAAAABAAAAAQAAABAAQAAcGFyYW1zYm9keWlzX2FzeW5jaXNfZ2VuZXJhdG9ydHlwZV9wYXJhbXNyZXR1cm5fdHlwZW8rGAAEAAAAZIgWAAQAAAAoiRYABgAAAC6JFgAEAAAAMokWAAgAAAA6iRYADAAAAEaJFgALAAAAUYkWAAsAAABBcnJvd0V4cHJBd2FpdEV4cHJhcmdDbGFzc0V4cHJPYmplY3RMaXRwcm9wc1BhcmVuRXhwcmV4cHJDb21wdXRlZFRhZ2dlZFRwbHRhZ3RwbFVuYXJ5RXhwcllpZWxkRXhwcmRlbGVnYXRlQXNzaWduRXhwck1lbWJlckV4cHJvYmpwcm9wUHJpdmF0ZU5hbWVUcGxFbGVtZW50dGFpbGNvb2tlZHJhd1VwZGF0ZUV4cHJwcmVmaXhTaW1wbGVQYXRFeHByT3JTcHJlYWRzcHJlYWRNZXRhUHJvcEV4cHJraW5kT3B0Q2hhaW5FeHByYmFzZVNwcmVhZFByb3BWYXJEZWNsYXJhdG9ybmFtZWluaXRkZWZpbml0ZVNwcmVhZEVsZW1lbnRkb3QzX3Rva2VuU3VwZXJQcm9wRXhwck1lbWJlclN1cGVyUHJvcFBhcmVuT3B0Q2hhaW5Uc0FzVHNTYXRpc2ZpZXNUc05vbk51bGxUc1R5cGVBc3NlcnRpb25Uc0luc3RhbnRpYXRpb24AQdCW2gALEqQEAAClBAAApAQAAKQEAAClBABBrJfaAAsCpAQAQaya2gAL4qkFpgQAAKYEAACmBAAApgQAAKYEAACmBAAApgQAAKYEAACmBAAApgQAAKYEAACmBAAApgQAAKYEAACmBAAApgQAAKYEAACmBAAApgQAAKYEAACmBAAApgQAAKYEAACmBAAApgQAAKYEAACmBAAApgQAAKYEAACmBAAApgQAAKYEAACmBAAApgQAAKYEAACmBAAApgQAAKYEAACmBAAApgQAAKYEAACmBAAApgQAAKYEAACmBAAApgQAAKYEAACmBAAApgQAAKYEAACmBAAApgQAAKYEAACmBAAApgQAAKYEAACmBAAApgQAAKYEAACmBAAApgQAAKYEAACmBAAApgQAAKYEAACmBAAApgQAAKYEAACmBAAApgQAAKYEAACmBAAApgQAAKYEAACmBAAApgQAAKYEAACmBAAApgQAAKYEAACmBAAApgQAAKYEAACmBAAApgQAAKYEAACmBAAApgQAAKYEAACmBAAApgQAAKYEAACmBAAApgQAAKYEAACmBAAApgQAAKYEAACmBAAApgQAAKYEAACmBAAApgQAAKYEAACmBAAApgQAAKYEAACmBAAApgQAAKYEAACmBAAApgQAAKYEAACmBAAApgQAAKYEAACmBAAApgQAAKYEAACmBAAApgQAAKYEAACmBAAApgQAAKYEAACmBAAApgQAAKYEAABzdHJ1Y3QgVHNTeW50YXgAua0WAHYAAAD9AAAAAQAAAF9hcHBseV9kZWNvcmF0ZWRfZGVzY3JpcHRvckBzd2MvaGVscGVycy9fL19hcHBseV9kZWNvcmF0ZWRfZGVzY3JpcHRvcl9hcnJheV9saWtlX3RvX2FycmF5QHN3Yy9oZWxwZXJzL18vX2FycmF5X2xpa2VfdG9fYXJyYXlfYXJyYXlfd2l0aF9ob2xlc0Bzd2MvaGVscGVycy9fL19hcnJheV93aXRoX2hvbGVzX2FycmF5X3dpdGhvdXRfaG9sZXNAc3djL2hlbHBlcnMvXy9fYXJyYXlfd2l0aG91dF9ob2xlc19hc3NlcnRfdGhpc19pbml0aWFsaXplZEBzd2MvaGVscGVycy9fL19hc3NlcnRfdGhpc19pbml0aWFsaXplZF9hc3luY19nZW5lcmF0b3JAc3djL2hlbHBlcnMvXy9fYXN5bmNfZ2VuZXJhdG9yX2FzeW5jX2dlbmVyYXRvcl9kZWxlZ2F0ZUBzd2MvaGVscGVycy9fL19hc3luY19nZW5lcmF0b3JfZGVsZWdhdGVfYXN5bmNfaXRlcmF0b3JAc3djL2hlbHBlcnMvXy9fYXN5bmNfaXRlcmF0b3JfYXN5bmNfdG9fZ2VuZXJhdG9yQHN3Yy9oZWxwZXJzL18vX2FzeW5jX3RvX2dlbmVyYXRvcl9hd2FpdF9hc3luY19nZW5lcmF0b3JAc3djL2hlbHBlcnMvXy9fYXdhaXRfYXN5bmNfZ2VuZXJhdG9yX2F3YWl0X3ZhbHVlQHN3Yy9oZWxwZXJzL18vX2F3YWl0X3ZhbHVlX2NhbGxfc3VwZXJAc3djL2hlbHBlcnMvXy9fY2FsbF9zdXBlcl9jaGVja19wcml2YXRlX3JlZGVjbGFyYXRpb25Ac3djL2hlbHBlcnMvXy9fY2hlY2tfcHJpdmF0ZV9yZWRlY2xhcmF0aW9uX2NsYXNzX2FwcGx5X2Rlc2NyaXB0b3JfZGVzdHJ1Y3R1cmVAc3djL2hlbHBlcnMvXy9fY2xhc3NfYXBwbHlfZGVzY3JpcHRvcl9kZXN0cnVjdHVyZV9jbGFzc19hcHBseV9kZXNjcmlwdG9yX2dldEBzd2MvaGVscGVycy9fL19jbGFzc19hcHBseV9kZXNjcmlwdG9yX2dldF9jbGFzc19hcHBseV9kZXNjcmlwdG9yX3NldEBzd2MvaGVscGVycy9fL19jbGFzc19hcHBseV9kZXNjcmlwdG9yX3NldF9jbGFzc19hcHBseV9kZXNjcmlwdG9yX3VwZGF0ZUBzd2MvaGVscGVycy9fL19jbGFzc19hcHBseV9kZXNjcmlwdG9yX3VwZGF0ZV9jbGFzc19jYWxsX2NoZWNrQHN3Yy9oZWxwZXJzL18vX2NsYXNzX2NhbGxfY2hlY2tfY2xhc3NfY2hlY2tfcHJpdmF0ZV9zdGF0aWNfZmllbGRfZGVzY3JpcHRvckBzd2MvaGVscGVycy9fL19jbGFzc19jaGVja19wcml2YXRlX3N0YXRpY19maWVsZF9kZXNjcmlwdG9yX2NsYXNzX2V4dHJhY3RfZmllbGRfZGVzY3JpcHRvckBzd2MvaGVscGVycy9fL19jbGFzc19leHRyYWN0X2ZpZWxkX2Rlc2NyaXB0b3JfY2xhc3NfbmFtZV90ZHpfZXJyb3JAc3djL2hlbHBlcnMvXy9fY2xhc3NfbmFtZV90ZHpfZXJyb3JfY2xhc3NfcHJpdmF0ZV9maWVsZF9nZXRAc3djL2hlbHBlcnMvXy9fY2xhc3NfcHJpdmF0ZV9maWVsZF9nZXRfY2xhc3NfcHJpdmF0ZV9maWVsZF9pbml0QHN3Yy9oZWxwZXJzL18vX2NsYXNzX3ByaXZhdGVfZmllbGRfaW5pdF9jbGFzc19wcml2YXRlX2ZpZWxkX2xvb3NlX2Jhc2VAc3djL2hlbHBlcnMvXy9fY2xhc3NfcHJpdmF0ZV9maWVsZF9sb29zZV9iYXNlX2NsYXNzX3ByaXZhdGVfZmllbGRfbG9vc2Vfa2V5QHN3Yy9oZWxwZXJzL18vX2NsYXNzX3ByaXZhdGVfZmllbGRfbG9vc2Vfa2V5X2NsYXNzX3ByaXZhdGVfZmllbGRfc2V0QHN3Yy9oZWxwZXJzL18vX2NsYXNzX3ByaXZhdGVfZmllbGRfc2V0X2NsYXNzX3ByaXZhdGVfZmllbGRfdXBkYXRlQHN3Yy9oZWxwZXJzL18vX2NsYXNzX3ByaXZhdGVfZmllbGRfdXBkYXRlX2NsYXNzX3ByaXZhdGVfbWV0aG9kX2dldEBzd2MvaGVscGVycy9fL19jbGFzc19wcml2YXRlX21ldGhvZF9nZXRfY2xhc3NfcHJpdmF0ZV9tZXRob2RfaW5pdEBzd2MvaGVscGVycy9fL19jbGFzc19wcml2YXRlX21ldGhvZF9pbml0X2NsYXNzX3ByaXZhdGVfbWV0aG9kX3NldEBzd2MvaGVscGVycy9fL19jbGFzc19wcml2YXRlX21ldGhvZF9zZXRfY2xhc3Nfc3RhdGljX3ByaXZhdGVfZmllbGRfc3BlY19nZXRAc3djL2hlbHBlcnMvXy9fY2xhc3Nfc3RhdGljX3ByaXZhdGVfZmllbGRfc3BlY19nZXRfY2xhc3Nfc3RhdGljX3ByaXZhdGVfZmllbGRfc3BlY19zZXRAc3djL2hlbHBlcnMvXy9fY2xhc3Nfc3RhdGljX3ByaXZhdGVfZmllbGRfc3BlY19zZXRfY2xhc3Nfc3RhdGljX3ByaXZhdGVfZmllbGRfdXBkYXRlQHN3Yy9oZWxwZXJzL18vX2NsYXNzX3N0YXRpY19wcml2YXRlX2ZpZWxkX3VwZGF0ZV9jb25zdHJ1Y3RAc3djL2hlbHBlcnMvXy9fY29uc3RydWN0X2NyZWF0ZV9jbGFzc0Bzd2MvaGVscGVycy9fL19jcmVhdGVfY2xhc3NfZGVjb3JhdGVAc3djL2hlbHBlcnMvXy9fZGVjb3JhdGVfZGVmYXVsdHNAc3djL2hlbHBlcnMvXy9fZGVmYXVsdHNfZGVmaW5lX2VudW1lcmFibGVfcHJvcGVydGllc0Bzd2MvaGVscGVycy9fL19kZWZpbmVfZW51bWVyYWJsZV9wcm9wZXJ0aWVzX2RlZmluZV9wcm9wZXJ0eUBzd2MvaGVscGVycy9fL19kZWZpbmVfcHJvcGVydHlfZXhwb3J0X3N0YXJAc3djL2hlbHBlcnMvXy9fZXhwb3J0X3N0YXJfZXh0ZW5kc0Bzd2MvaGVscGVycy9fL19leHRlbmRzX2dldEBzd2MvaGVscGVycy9fL19nZXRfZ2V0X3Byb3RvdHlwZV9vZkBzd2MvaGVscGVycy9fL19nZXRfcHJvdG90eXBlX29mX2luaGVyaXRzQHN3Yy9oZWxwZXJzL18vX2luaGVyaXRzX2luaGVyaXRzX2xvb3NlQHN3Yy9oZWxwZXJzL18vX2luaGVyaXRzX2xvb3NlX2luaXRpYWxpemVyX2RlZmluZV9wcm9wZXJ0eUBzd2MvaGVscGVycy9fL19pbml0aWFsaXplcl9kZWZpbmVfcHJvcGVydHlfaW5pdGlhbGl6ZXJfd2FybmluZ19oZWxwZXJAc3djL2hlbHBlcnMvXy9faW5pdGlhbGl6ZXJfd2FybmluZ19oZWxwZXJfaW5zdGFuY2VvZkBzd2MvaGVscGVycy9fL19pbnN0YW5jZW9mX2ludGVyb3BfcmVxdWlyZV9kZWZhdWx0QHN3Yy9oZWxwZXJzL18vX2ludGVyb3BfcmVxdWlyZV9kZWZhdWx0X2ludGVyb3BfcmVxdWlyZV93aWxkY2FyZEBzd2MvaGVscGVycy9fL19pbnRlcm9wX3JlcXVpcmVfd2lsZGNhcmRfaXNfbmF0aXZlX2Z1bmN0aW9uQHN3Yy9oZWxwZXJzL18vX2lzX25hdGl2ZV9mdW5jdGlvbl9pdGVyYWJsZV90b19hcnJheUBzd2MvaGVscGVycy9fL19pdGVyYWJsZV90b19hcnJheV9pdGVyYWJsZV90b19hcnJheV9saW1pdEBzd2MvaGVscGVycy9fL19pdGVyYWJsZV90b19hcnJheV9saW1pdF9pdGVyYWJsZV90b19hcnJheV9saW1pdF9sb29zZUBzd2MvaGVscGVycy9fL19pdGVyYWJsZV90b19hcnJheV9saW1pdF9sb29zZV9qc3hAc3djL2hlbHBlcnMvXy9fanN4X25ld19hcnJvd19jaGVja0Bzd2MvaGVscGVycy9fL19uZXdfYXJyb3dfY2hlY2tfbm9uX2l0ZXJhYmxlX3Jlc3RAc3djL2hlbHBlcnMvXy9fbm9uX2l0ZXJhYmxlX3Jlc3Rfbm9uX2l0ZXJhYmxlX3NwcmVhZEBzd2MvaGVscGVycy9fL19ub25faXRlcmFibGVfc3ByZWFkX29iamVjdF9kZXN0cnVjdHVyaW5nX2VtcHR5QHN3Yy9oZWxwZXJzL18vX29iamVjdF9kZXN0cnVjdHVyaW5nX2VtcHR5X29iamVjdF9zcHJlYWRAc3djL2hlbHBlcnMvXy9fb2JqZWN0X3NwcmVhZF9vYmplY3Rfc3ByZWFkX3Byb3BzQHN3Yy9oZWxwZXJzL18vX29iamVjdF9zcHJlYWRfcHJvcHNfb2JqZWN0X3dpdGhvdXRfcHJvcGVydGllc0Bzd2MvaGVscGVycy9fL19vYmplY3Rfd2l0aG91dF9wcm9wZXJ0aWVzX29iamVjdF93aXRob3V0X3Byb3BlcnRpZXNfbG9vc2VAc3djL2hlbHBlcnMvXy9fb2JqZWN0X3dpdGhvdXRfcHJvcGVydGllc19sb29zZV9wb3NzaWJsZV9jb25zdHJ1Y3Rvcl9yZXR1cm5Ac3djL2hlbHBlcnMvXy9fcG9zc2libGVfY29uc3RydWN0b3JfcmV0dXJuX3JlYWRfb25seV9lcnJvckBzd2MvaGVscGVycy9fL19yZWFkX29ubHlfZXJyb3Jfc2V0QHN3Yy9oZWxwZXJzL18vX3NldF9zZXRfcHJvdG90eXBlX29mQHN3Yy9oZWxwZXJzL18vX3NldF9wcm90b3R5cGVfb2Zfc2tpcF9maXJzdF9nZW5lcmF0b3JfbmV4dEBzd2MvaGVscGVycy9fL19za2lwX2ZpcnN0X2dlbmVyYXRvcl9uZXh0X3NsaWNlZF90b19hcnJheUBzd2MvaGVscGVycy9fL19zbGljZWRfdG9fYXJyYXlfc2xpY2VkX3RvX2FycmF5X2xvb3NlQHN3Yy9oZWxwZXJzL18vX3NsaWNlZF90b19hcnJheV9sb29zZV9zdXBlcl9wcm9wX2Jhc2VAc3djL2hlbHBlcnMvXy9fc3VwZXJfcHJvcF9iYXNlX3RhZ2dlZF90ZW1wbGF0ZV9saXRlcmFsQHN3Yy9oZWxwZXJzL18vX3RhZ2dlZF90ZW1wbGF0ZV9saXRlcmFsX3RhZ2dlZF90ZW1wbGF0ZV9saXRlcmFsX2xvb3NlQHN3Yy9oZWxwZXJzL18vX3RhZ2dlZF90ZW1wbGF0ZV9saXRlcmFsX2xvb3NlX3Rocm93QHN3Yy9oZWxwZXJzL18vX3Rocm93X3RvX2FycmF5QHN3Yy9oZWxwZXJzL18vX3RvX2FycmF5X3RvX2NvbnN1bWFibGVfYXJyYXlAc3djL2hlbHBlcnMvXy9fdG9fY29uc3VtYWJsZV9hcnJheV90b19wcmltaXRpdmVAc3djL2hlbHBlcnMvXy9fdG9fcHJpbWl0aXZlX3RvX3Byb3BlcnR5X2tleUBzd2MvaGVscGVycy9fL190b19wcm9wZXJ0eV9rZXlfdXBkYXRlQHN3Yy9oZWxwZXJzL18vX3VwZGF0ZV90eXBlX29mQHN3Yy9oZWxwZXJzL18vX3R5cGVfb2ZfdW5zdXBwb3J0ZWRfaXRlcmFibGVfdG9fYXJyYXlAc3djL2hlbHBlcnMvXy9fdW5zdXBwb3J0ZWRfaXRlcmFibGVfdG9fYXJyYXlfd3JhcF9hc3luY19nZW5lcmF0b3JAc3djL2hlbHBlcnMvXy9fd3JhcF9hc3luY19nZW5lcmF0b3Jfd3JhcF9uYXRpdmVfc3VwZXJAc3djL2hlbHBlcnMvXy9fd3JhcF9uYXRpdmVfc3VwZXJfd3JpdGVfb25seV9lcnJvckBzd2MvaGVscGVycy9fL193cml0ZV9vbmx5X2Vycm9yX2NsYXNzX3ByaXZhdGVfZmllbGRfZGVzdHJ1Y3R1cmVAc3djL2hlbHBlcnMvXy9fY2xhc3NfcHJpdmF0ZV9maWVsZF9kZXN0cnVjdHVyZV9jbGFzc19zdGF0aWNfcHJpdmF0ZV9maWVsZF9kZXN0cnVjdHVyZUBzd2MvaGVscGVycy9fL19jbGFzc19zdGF0aWNfcHJpdmF0ZV9maWVsZF9kZXN0cnVjdHVyZV9jbGFzc19zdGF0aWNfcHJpdmF0ZV9tZXRob2RfZ2V0QHN3Yy9oZWxwZXJzL18vX2NsYXNzX3N0YXRpY19wcml2YXRlX21ldGhvZF9nZXRfY2xhc3NfY2hlY2tfcHJpdmF0ZV9zdGF0aWNfYWNjZXNzQHN3Yy9oZWxwZXJzL18vX2NsYXNzX2NoZWNrX3ByaXZhdGVfc3RhdGljX2FjY2Vzc19pc19uYXRpdmVfcmVmbGVjdF9jb25zdHJ1Y3RAc3djL2hlbHBlcnMvXy9faXNfbmF0aXZlX3JlZmxlY3RfY29uc3RydWN0X2NyZWF0ZV9zdXBlckBzd2MvaGVscGVycy9fL19jcmVhdGVfc3VwZXJfY3JlYXRlX2Zvcl9vZl9pdGVyYXRvcl9oZWxwZXJfbG9vc2VAc3djL2hlbHBlcnMvXy9fY3JlYXRlX2Zvcl9vZl9pdGVyYXRvcl9oZWxwZXJfbG9vc2VfdHNfZGVjb3JhdGVAc3djL2hlbHBlcnMvXy9fdHNfZGVjb3JhdGVfdHNfZ2VuZXJhdG9yQHN3Yy9oZWxwZXJzL18vX3RzX2dlbmVyYXRvcl90c19tZXRhZGF0YUBzd2MvaGVscGVycy9fL190c19tZXRhZGF0YV90c19wYXJhbUBzd2MvaGVscGVycy9fL190c19wYXJhbV90c192YWx1ZXNAc3djL2hlbHBlcnMvXy9fdHNfdmFsdWVzX3RzX2FkZF9kaXNwb3NhYmxlX3Jlc291cmNlQHN3Yy9oZWxwZXJzL18vX3RzX2FkZF9kaXNwb3NhYmxlX3Jlc291cmNlX3RzX2Rpc3Bvc2VfcmVzb3VyY2VzQHN3Yy9oZWxwZXJzL18vX3RzX2Rpc3Bvc2VfcmVzb3VyY2VzX2FwcGx5X2RlY3NfMjIwM19yQHN3Yy9oZWxwZXJzL18vX2FwcGx5X2RlY3NfMjIwM19yX2lkZW50aXR5QHN3Yy9oZWxwZXJzL18vX2lkZW50aXR5X2Rpc3Bvc2VAc3djL2hlbHBlcnMvXy9fZGlzcG9zZV91c2luZ0Bzd2MvaGVscGVycy9fL191c2luZ191c2luZ19jdHhAc3djL2hlbHBlcnMvXy9fdXNpbmdfY3R4YXBwbHlfZGVjb3JhdGVkX2Rlc2NyaXB0b3JhcnJheV9saWtlX3RvX2FycmF5YXJyYXlfd2l0aF9ob2xlc2FycmF5X3dpdGhvdXRfaG9sZXNhc3NlcnRfdGhpc19pbml0aWFsaXplZGFzeW5jX2dlbmVyYXRvcmFzeW5jX2dlbmVyYXRvcl9kZWxlZ2F0ZWFzeW5jX2l0ZXJhdG9yYXN5bmNfdG9fZ2VuZXJhdG9yYXdhaXRfYXN5bmNfZ2VuZXJhdG9yYXdhaXRfdmFsdWVjYWxsX3N1cGVyY2hlY2tfcHJpdmF0ZV9yZWRlY2xhcmF0aW9uY2xhc3NfYXBwbHlfZGVzY3JpcHRvcl9kZXN0cnVjdHVyZWNsYXNzX2FwcGx5X2Rlc2NyaXB0b3JfZ2V0Y2xhc3NfYXBwbHlfZGVzY3JpcHRvcl9zZXRjbGFzc19hcHBseV9kZXNjcmlwdG9yX3VwZGF0ZWNsYXNzX2NhbGxfY2hlY2tjbGFzc19jaGVja19wcml2YXRlX3N0YXRpY19maWVsZF9kZXNjcmlwdG9yY2xhc3NfZXh0cmFjdF9maWVsZF9kZXNjcmlwdG9yY2xhc3NfbmFtZV90ZHpfZXJyb3JjbGFzc19wcml2YXRlX2ZpZWxkX2dldGNsYXNzX3ByaXZhdGVfZmllbGRfaW5pdGNsYXNzX3ByaXZhdGVfZmllbGRfbG9vc2VfYmFzZWNsYXNzX3ByaXZhdGVfZmllbGRfbG9vc2Vfa2V5Y2xhc3NfcHJpdmF0ZV9maWVsZF9zZXRjbGFzc19wcml2YXRlX2ZpZWxkX3VwZGF0ZWNsYXNzX3ByaXZhdGVfbWV0aG9kX2dldGNsYXNzX3ByaXZhdGVfbWV0aG9kX2luaXRjbGFzc19wcml2YXRlX21ldGhvZF9zZXRjbGFzc19zdGF0aWNfcHJpdmF0ZV9maWVsZF9zcGVjX2dldGNsYXNzX3N0YXRpY19wcml2YXRlX2ZpZWxkX3NwZWNfc2V0Y2xhc3Nfc3RhdGljX3ByaXZhdGVfZmllbGRfdXBkYXRlY29uc3RydWN0Y3JlYXRlX2NsYXNzZGVjb3JhdGVkZWZhdWx0c2RlZmluZV9lbnVtZXJhYmxlX3Byb3BlcnRpZXNkZWZpbmVfcHJvcGVydHlleHBvcnRfc3RhcmdldF9wcm90b3R5cGVfb2Zpbmhlcml0c2luaGVyaXRzX2xvb3NlaW5pdGlhbGl6ZXJfZGVmaW5lX3Byb3BlcnR5aW5pdGlhbGl6ZXJfd2FybmluZ19oZWxwZXJpbnRlcm9wX3JlcXVpcmVfZGVmYXVsdGludGVyb3BfcmVxdWlyZV93aWxkY2FyZGlzX25hdGl2ZV9mdW5jdGlvbml0ZXJhYmxlX3RvX2FycmF5aXRlcmFibGVfdG9fYXJyYXlfbGltaXRpdGVyYWJsZV90b19hcnJheV9saW1pdF9sb29zZWpzeG5ld19hcnJvd19jaGVja25vbl9pdGVyYWJsZV9yZXN0bm9uX2l0ZXJhYmxlX3NwcmVhZG9iamVjdF9kZXN0cnVjdHVyaW5nX2VtcHR5b2JqZWN0X3NwcmVhZG9iamVjdF9zcHJlYWRfcHJvcHNvYmplY3Rfd2l0aG91dF9wcm9wZXJ0aWVzb2JqZWN0X3dpdGhvdXRfcHJvcGVydGllc19sb29zZXBvc3NpYmxlX2NvbnN0cnVjdG9yX3JldHVybnJlYWRfb25seV9lcnJvcnNldF9wcm90b3R5cGVfb2Zza2lwX2ZpcnN0X2dlbmVyYXRvcl9uZXh0c2xpY2VkX3RvX2FycmF5c2xpY2VkX3RvX2FycmF5X2xvb3Nlc3VwZXJfcHJvcF9iYXNldGFnZ2VkX3RlbXBsYXRlX2xpdGVyYWx0YWdnZWRfdGVtcGxhdGVfbGl0ZXJhbF9sb29zZXRvX2FycmF5dG9fY29uc3VtYWJsZV9hcnJheXRvX3ByaW1pdGl2ZXRvX3Byb3BlcnR5X2tleXVwZGF0ZXR5cGVfb2Z1bnN1cHBvcnRlZF9pdGVyYWJsZV90b19hcnJheXdyYXBfYXN5bmNfZ2VuZXJhdG9yd3JhcF9uYXRpdmVfc3VwZXJ3cml0ZV9vbmx5X2Vycm9yY2xhc3NfcHJpdmF0ZV9maWVsZF9kZXN0cnVjdHVyZWNsYXNzX3N0YXRpY19wcml2YXRlX2ZpZWxkX2Rlc3RydWN0dXJlY2xhc3Nfc3RhdGljX3ByaXZhdGVfbWV0aG9kX2dldGNsYXNzX2NoZWNrX3ByaXZhdGVfc3RhdGljX2FjY2Vzc2lzX25hdGl2ZV9yZWZsZWN0X2NvbnN0cnVjdGNyZWF0ZV9zdXBlcmNyZWF0ZV9mb3Jfb2ZfaXRlcmF0b3JfaGVscGVyX2xvb3NldHNfZGVjb3JhdGV0c19nZW5lcmF0b3J0c19tZXRhZGF0YXRzX3BhcmFtdHNfdmFsdWVzdHNfYWRkX2Rpc3Bvc2FibGVfcmVzb3VyY2V0c19kaXNwb3NlX3Jlc291cmNlc2FwcGx5X2RlY3NfMjIwM19yaWRlbnRpdHlkaXNwb3NldXNpbmdfY3R4TWFya2VyIHByb3ZpZGVkIHRvIHJlc29sdmVyIHNob3VsZCBub3QgYmUgdGhlIHJvb3QgbWFyawAAY60WADcAAACe2RcAdwAAAIoAAAAFAAAAJG5hbWUvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9zd2NfZWNtYV90cmFuc2Zvcm1zX2Jhc2UtNi4wLjIvc3JjL2hlbHBlcnMvbW9kLnJzaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogRXJyb3Igb2NjdXJyZWQgd2hpbGUgcGFyc2luZyBlcnJvcjogAAAAL64WAE4AAAC5rRYAdgAAACgAAAAJAAAAQHN3Yy9oZWxwZXJzL18vX5iuFgAQAAAAaWRyZXNvdXJjZV9fX3RzX6cEAABmdW5jdGlvbiBfYXBwbHlfZGVjb3JhdGVkX2Rlc2NyaXB0b3IodGFyZ2V0LCBwcm9wZXJ0eSwgZGVjb3JhdG9ycywgZGVzY3JpcHRvciwgY29udGV4dCkgewogICAgdmFyIGRlc2MgPSB7fTsKICAgIE9iamVjdFsia2UiICsgInlzIl0oZGVzY3JpcHRvcikuZm9yRWFjaChmdW5jdGlvbihrZXkpIHsKICAgICAgICBkZXNjW2tleV0gPSBkZXNjcmlwdG9yW2tleV07CiAgICB9KTsKICAgIGRlc2MuZW51bWVyYWJsZSA9ICEhZGVzYy5lbnVtZXJhYmxlOwogICAgZGVzYy5jb25maWd1cmFibGUgPSAhIWRlc2MuY29uZmlndXJhYmxlOwogICAgaWYgKCJ2YWx1ZSIgaW4gZGVzYyB8fCBkZXNjLmluaXRpYWxpemVyKSB7CiAgICAgICAgZGVzYy53cml0YWJsZSA9IHRydWU7CiAgICB9CiAgICBkZXNjID0gZGVjb3JhdG9ycy5zbGljZSgpLnJldmVyc2UoKS5yZWR1Y2UoZnVuY3Rpb24oZGVzYywgZGVjb3JhdG9yKSB7CiAgICAgICAgcmV0dXJuIGRlY29yYXRvciA/IGRlY29yYXRvcih0YXJnZXQsIHByb3BlcnR5LCBkZXNjKSB8fCBkZXNjIDogZGVzYzsKICAgIH0sIGRlc2MpOwogICAgdmFyIGhhc0FjY2Vzc29yID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRlc2MsICJnZXQiKSB8fCBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGVzYywgInNldCIpOwogICAgaWYgKGNvbnRleHQgJiYgZGVzYy5pbml0aWFsaXplciAhPT0gdm9pZCAwICYmICFoYXNBY2Nlc3NvcikgewogICAgICAgIGRlc2MudmFsdWUgPSBkZXNjLmluaXRpYWxpemVyID8gZGVzYy5pbml0aWFsaXplci5jYWxsKGNvbnRleHQpIDogdm9pZCAwOwogICAgICAgIGRlc2MuaW5pdGlhbGl6ZXIgPSB1bmRlZmluZWQ7CiAgICB9CiAgICBpZiAoaGFzQWNjZXNzb3IpIHsKICAgICAgICBkZWxldGUgZGVzYy53cml0YWJsZTsKICAgICAgICBkZWxldGUgZGVzYy5pbml0aWFsaXplcjsKICAgICAgICBkZWxldGUgZGVzYy52YWx1ZTsKICAgIH0KICAgIGlmIChkZXNjLmluaXRpYWxpemVyID09PSB2b2lkIDApIHsKICAgICAgICBPYmplY3RbImRlZmluZSIgKyAiUHJvcGVydHkiXSh0YXJnZXQsIHByb3BlcnR5LCBkZXNjKTsKICAgICAgICBkZXNjID0gbnVsbDsKICAgIH0KICAgIHJldHVybiBkZXNjOwp9CmZ1bmN0aW9uIF9hcnJheV9saWtlX3RvX2FycmF5KGFyciwgbGVuKSB7CiAgICBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsKICAgIGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgYXJyMltpXSA9IGFycltpXTsKICAgIHJldHVybiBhcnIyOwp9CmZ1bmN0aW9uIF9hcnJheV93aXRoX2hvbGVzKGFycikgewogICAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjsKfQpmdW5jdGlvbiBfYXJyYXlfd2l0aG91dF9ob2xlcyhhcnIpIHsKICAgIGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBfYXJyYXlfbGlrZV90b19hcnJheShhcnIpOwp9CmZ1bmN0aW9uIF9hc3NlcnRfdGhpc19pbml0aWFsaXplZChzZWxmKSB7CiAgICBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7CiAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTsKICAgIH0KICAgIHJldHVybiBzZWxmOwp9CmZ1bmN0aW9uIF9hc3luY19nZW5lcmF0b3IoZ2VuKSB7CiAgICB2YXIgZnJvbnQsIGJhY2s7CiAgICBmdW5jdGlvbiBzZW5kKGtleSwgYXJnKSB7CiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICB2YXIgcmVxdWVzdCA9IHsga2V5OiBrZXksIGFyZzogYXJnLCByZXNvbHZlOiByZXNvbHZlLCByZWplY3Q6IHJlamVjdCwgbmV4dDogbnVsbCB9OwogICAgICAgICAgICBpZiAoYmFjaykgewogICAgICAgICAgICAgICAgYmFjayA9IGJhY2submV4dCA9IHJlcXVlc3Q7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBmcm9udCA9IGJhY2sgPSByZXF1ZXN0OwogICAgICAgICAgICAgICAgcmVzdW1lKGtleSwgYXJnKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gcmVzdW1lKGtleSwgYXJnKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGdlbltrZXldKGFyZyk7CiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHJlc3VsdC52YWx1ZTsKICAgICAgICAgICAgdmFyIHdyYXBwZWRBd2FpdCA9IHZhbHVlIGluc3RhbmNlb2YgX2F3YWl0X3ZhbHVlOwogICAgICAgICAgICBQcm9taXNlLnJlc29sdmUod3JhcHBlZEF3YWl0ID8gdmFsdWUud3JhcHBlZCA6IHZhbHVlKS50aGVuKGZ1bmN0aW9uKGFyZykgewogICAgICAgICAgICAgICAgaWYgKHdyYXBwZWRBd2FpdCkgewogICAgICAgICAgICAgICAgICAgIHJlc3VtZSgibmV4dCIsIGFyZyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc2V0dGxlKHJlc3VsdC5kb25lID8gInJldHVybiIgOiAibm9ybWFsIiwgYXJnKTsKICAgICAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICByZXN1bWUoInRocm93IiwgZXJyKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIHNldHRsZSgidGhyb3ciLCBlcnIpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHNldHRsZSh0eXBlLCB2YWx1ZSkgewogICAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgICAgICBjYXNlICJyZXR1cm4iOgogICAgICAgICAgICAgICAgZnJvbnQucmVzb2x2ZSh7IHZhbHVlOiB2YWx1ZSwgZG9uZTogdHJ1ZSB9KTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJ0aHJvdyI6CiAgICAgICAgICAgICAgICBmcm9udC5yZWplY3QodmFsdWUpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBmcm9udC5yZXNvbHZlKHsgdmFsdWU6IHZhbHVlLCBkb25lOiBmYWxzZSB9KTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBmcm9udCA9IGZyb250Lm5leHQ7CiAgICAgICAgaWYgKGZyb250KSB7CiAgICAgICAgICAgIHJlc3VtZShmcm9udC5rZXksIGZyb250LmFyZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYmFjayA9IG51bGw7CiAgICAgICAgfQogICAgfQogICAgdGhpcy5faW52b2tlID0gc2VuZDsKICAgIGlmICh0eXBlb2YgZ2VuLnJldHVybiAhPT0gImZ1bmN0aW9uIikgewogICAgICAgIHRoaXMucmV0dXJuID0gdW5kZWZpbmVkOwogICAgfQp9CmlmICh0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5hc3luY0l0ZXJhdG9yKSB7CiAgICBfYXN5bmNfZ2VuZXJhdG9yLnByb3RvdHlwZVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH07Cn0KX2FzeW5jX2dlbmVyYXRvci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uKGFyZykgewogICAgcmV0dXJuIHRoaXMuX2ludm9rZSgibmV4dCIsIGFyZyk7Cn07Cl9hc3luY19nZW5lcmF0b3IucHJvdG90eXBlLnRocm93ID0gZnVuY3Rpb24oYXJnKSB7CiAgICByZXR1cm4gdGhpcy5faW52b2tlKCJ0aHJvdyIsIGFyZyk7Cn07Cl9hc3luY19nZW5lcmF0b3IucHJvdG90eXBlLnJldHVybiA9IGZ1bmN0aW9uKGFyZykgewogICAgcmV0dXJuIHRoaXMuX2ludm9rZSgicmV0dXJuIiwgYXJnKTsKfTsKZnVuY3Rpb24gX2FzeW5jX2dlbmVyYXRvcl9kZWxlZ2F0ZShpbm5lciwgYXdhaXRXcmFwKSB7CiAgICB2YXIgaXRlciA9IHt9LCB3YWl0aW5nID0gZmFsc2U7CiAgICBmdW5jdGlvbiBwdW1wKGtleSwgdmFsdWUpIHsKICAgICAgICB3YWl0aW5nID0gdHJ1ZTsKICAgICAgICB2YWx1ZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUpIHsKICAgICAgICAgICAgcmVzb2x2ZShpbm5lcltrZXldKHZhbHVlKSk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBhd2FpdFdyYXAodmFsdWUpIH07CiAgICB9CiAgICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wuaXRlcmF0b3IpIHsKICAgICAgICBpdGVyW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgIH0KICAgIGl0ZXIubmV4dCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgaWYgKHdhaXRpbmcpIHsKICAgICAgICAgICAgd2FpdGluZyA9IGZhbHNlOwogICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwdW1wKCJuZXh0IiwgdmFsdWUpOwogICAgfTsKICAgIGlmICh0eXBlb2YgaW5uZXIudGhyb3cgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICBpdGVyLnRocm93ID0gZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgaWYgKHdhaXRpbmcpIHsKICAgICAgICAgICAgICAgIHdhaXRpbmcgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHRocm93IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBwdW1wKCJ0aHJvdyIsIHZhbHVlKTsKICAgICAgICB9OwogICAgfQogICAgaWYgKHR5cGVvZiBpbm5lci5yZXR1cm4gPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICBpdGVyLnJldHVybiA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiBwdW1wKCJyZXR1cm4iLCB2YWx1ZSk7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiBpdGVyOwp9CmZ1bmN0aW9uIF9hc3luY19pdGVyYXRvcihpdGVyYWJsZSkgewogICAgdmFyIG1ldGhvZCwgYXN5bmMsIHN5bmMsIHJldHJ5ID0gMjsKICAgIGZvciAoInVuZGVmaW5lZCIgIT0gdHlwZW9mIFN5bWJvbCAmJiAoYXN5bmMgPSBTeW1ib2wuYXN5bmNJdGVyYXRvciwgc3luYyA9IFN5bWJvbC5pdGVyYXRvcik7IHJldHJ5LS07KSB7CiAgICAgICAgaWYgKGFzeW5jICYmIG51bGwgIT0gKG1ldGhvZCA9IGl0ZXJhYmxlW2FzeW5jXSkpIHJldHVybiBtZXRob2QuY2FsbChpdGVyYWJsZSk7CiAgICAgICAgaWYgKHN5bmMgJiYgbnVsbCAhPSAobWV0aG9kID0gaXRlcmFibGVbc3luY10pKSByZXR1cm4gbmV3IEFzeW5jRnJvbVN5bmNJdGVyYXRvcihtZXRob2QuY2FsbChpdGVyYWJsZSkpOwogICAgICAgIGFzeW5jID0gIkBAYXN5bmNJdGVyYXRvciIsIHN5bmMgPSAiQEBpdGVyYXRvciI7CiAgICB9CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgaXMgbm90IGFzeW5jIGl0ZXJhYmxlIik7Cn0KZnVuY3Rpb24gQXN5bmNGcm9tU3luY0l0ZXJhdG9yKHMpIHsKICAgIGZ1bmN0aW9uIEFzeW5jRnJvbVN5bmNJdGVyYXRvckNvbnRpbnVhdGlvbihyKSB7CiAgICAgICAgaWYgKE9iamVjdChyKSAhPT0gcikgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBUeXBlRXJyb3IociArICIgaXMgbm90IGFuIG9iamVjdC4iKSk7CiAgICAgICAgdmFyIGRvbmUgPSByLmRvbmU7CiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyLnZhbHVlKS50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB2YWx1ZSwgZG9uZTogZG9uZSB9OwogICAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIEFzeW5jRnJvbVN5bmNJdGVyYXRvciA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICB0aGlzLnMgPSBzLCB0aGlzLm4gPSBzLm5leHQ7CiAgICB9LAogICAgICAgIEFzeW5jRnJvbVN5bmNJdGVyYXRvci5wcm90b3R5cGUgPSB7CiAgICAgICAgICAgIHM6IG51bGwsCiAgICAgICAgICAgIG46IG51bGwsCiAgICAgICAgICAgIG5leHQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIEFzeW5jRnJvbVN5bmNJdGVyYXRvckNvbnRpbnVhdGlvbih0aGlzLm4uYXBwbHkodGhpcy5zLCBhcmd1bWVudHMpKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcmV0dXJuOiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgICAgICAgdmFyIHJldCA9IHRoaXMucy5yZXR1cm47CiAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwID09PSByZXQKICAgICAgICAgICAgICAgICAgICA/IFByb21pc2UucmVzb2x2ZSh7IHZhbHVlOiB2YWx1ZSwgZG9uZTogITAgfSkKICAgICAgICAgICAgICAgICAgICA6IEFzeW5jRnJvbVN5bmNJdGVyYXRvckNvbnRpbnVhdGlvbihyZXQuYXBwbHkodGhpcy5zLCBhcmd1bWVudHMpKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgdGhyb3c6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgICAgICB2YXIgdGhyID0gdGhpcy5zLnJldHVybjsKICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDAgPT09IHRociA/IFByb21pc2UucmVqZWN0KHZhbHVlKSA6IEFzeW5jRnJvbVN5bmNJdGVyYXRvckNvbnRpbnVhdGlvbih0aHIuYXBwbHkodGhpcy5zLCBhcmd1bWVudHMpKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgbmV3IEFzeW5jRnJvbVN5bmNJdGVyYXRvcihzKTsKfQpmdW5jdGlvbiBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIGtleSwgYXJnKSB7CiAgICB0cnkgewogICAgICAgIHZhciBpbmZvID0gZ2VuW2tleV0oYXJnKTsKICAgICAgICB2YXIgdmFsdWUgPSBpbmZvLnZhbHVlOwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICByZWplY3QoZXJyb3IpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChpbmZvLmRvbmUpIHsKICAgICAgICByZXNvbHZlKHZhbHVlKTsKICAgIH0gZWxzZSB7CiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKF9uZXh0LCBfdGhyb3cpOwogICAgfQp9CmZ1bmN0aW9uIF9hc3luY190b19nZW5lcmF0b3IoZm4pIHsKICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc2VsZiA9IHRoaXMsIGFyZ3MgPSBhcmd1bWVudHM7CiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICB2YXIgZ2VuID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7CiAgICAgICAgICAgIGZ1bmN0aW9uIF9uZXh0KHZhbHVlKSB7CiAgICAgICAgICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csICJuZXh0IiwgdmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIF90aHJvdyhlcnIpIHsKICAgICAgICAgICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgInRocm93IiwgZXJyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBfbmV4dCh1bmRlZmluZWQpOwogICAgICAgIH0pOwogICAgfTsKfQpmdW5jdGlvbiBfYXdhaXRfYXN5bmNfZ2VuZXJhdG9yKHZhbHVlKSB7CiAgICByZXR1cm4gbmV3IF9hd2FpdF92YWx1ZSh2YWx1ZSk7Cn0KZnVuY3Rpb24gX2F3YWl0X3ZhbHVlKHZhbHVlKSB7CiAgICB0aGlzLndyYXBwZWQgPSB2YWx1ZTsKfQpmdW5jdGlvbiBfY2FsbF9zdXBlcihfdGhpcywgZGVyaXZlZCwgYXJncykgewogICAgLy8gU3VwZXIKICAgIGRlcml2ZWQgPSBfZ2V0X3Byb3RvdHlwZV9vZihkZXJpdmVkKTsKICAgIHJldHVybiBfcG9zc2libGVfY29uc3RydWN0b3JfcmV0dXJuKAogICAgICAgIF90aGlzLAogICAgICAgIF9pc19uYXRpdmVfcmVmbGVjdF9jb25zdHJ1Y3QoKQogICAgICAgICAgICAvLyBOT1RFOiBUaGlzIGRvZXNuJ3Qgd29yayBpZiB0aGlzLl9fcHJvdG9fXy5jb25zdHJ1Y3RvciBoYXMgYmVlbiBtb2RpZmllZC4KICAgICAgICAgICAgPyBSZWZsZWN0LmNvbnN0cnVjdChkZXJpdmVkLCBhcmdzIHx8IFtdLCBfZ2V0X3Byb3RvdHlwZV9vZihfdGhpcykuY29uc3RydWN0b3IpCiAgICAgICAgICAgIDogZGVyaXZlZC5hcHBseShfdGhpcywgYXJncykKICAgICk7Cn0KZnVuY3Rpb24gX2NoZWNrX3ByaXZhdGVfcmVkZWNsYXJhdGlvbihvYmosIHByaXZhdGVDb2xsZWN0aW9uKSB7CiAgICBpZiAocHJpdmF0ZUNvbGxlY3Rpb24uaGFzKG9iaikpIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgaW5pdGlhbGl6ZSB0aGUgc2FtZSBwcml2YXRlIGVsZW1lbnRzIHR3aWNlIG9uIGFuIG9iamVjdCIpOwogICAgfQp9CmZ1bmN0aW9uIF9jbGFzc19hcHBseV9kZXNjcmlwdG9yX2Rlc3RydWN0dXJlKHJlY2VpdmVyLCBkZXNjcmlwdG9yKSB7CiAgICBpZiAoZGVzY3JpcHRvci5zZXQpIHsKICAgICAgICBpZiAoISgiX19kZXN0ck9iaiIgaW4gZGVzY3JpcHRvcikpIHsKICAgICAgICAgICAgZGVzY3JpcHRvci5fX2Rlc3RyT2JqID0gewogICAgICAgICAgICAgICAgc2V0IHZhbHVlKHYpIHsKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLnNldC5jYWxsKHJlY2VpdmVyLCB2KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3IuX19kZXN0ck9iajsKICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKCFkZXNjcmlwdG9yLndyaXRhYmxlKSB7CiAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgdGhyb3cgaW4gc3RyaWN0IG1vZGUsIGJ1dCBjbGFzcyBib2RpZXMgYXJlCiAgICAgICAgICAgIC8vIGFsd2F5cyBzdHJpY3QgYW5kIHByaXZhdGUgZmllbGRzIGNhbiBvbmx5IGJlIHVzZWQgaW5zaWRlCiAgICAgICAgICAgIC8vIGNsYXNzIGJvZGllcy4KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiYXR0ZW1wdGVkIHRvIHNldCByZWFkIG9ubHkgcHJpdmF0ZSBmaWVsZCIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjsKICAgIH0KfQpmdW5jdGlvbiBfY2xhc3NfYXBwbHlfZGVzY3JpcHRvcl9nZXQocmVjZWl2ZXIsIGRlc2NyaXB0b3IpIHsKICAgIGlmIChkZXNjcmlwdG9yLmdldCkgewogICAgICAgIHJldHVybiBkZXNjcmlwdG9yLmdldC5jYWxsKHJlY2VpdmVyKTsKICAgIH0KICAgIHJldHVybiBkZXNjcmlwdG9yLnZhbHVlOwp9CmZ1bmN0aW9uIF9jbGFzc19hcHBseV9kZXNjcmlwdG9yX3NldChyZWNlaXZlciwgZGVzY3JpcHRvciwgdmFsdWUpIHsKICAgIGlmIChkZXNjcmlwdG9yLnNldCkgewogICAgICAgIGRlc2NyaXB0b3Iuc2V0LmNhbGwocmVjZWl2ZXIsIHZhbHVlKTsKICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKCFkZXNjcmlwdG9yLndyaXRhYmxlKSB7CiAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgdGhyb3cgaW4gc3RyaWN0IG1vZGUsIGJ1dCBjbGFzcyBib2RpZXMgYXJlCiAgICAgICAgICAgIC8vIGFsd2F5cyBzdHJpY3QgYW5kIHByaXZhdGUgZmllbGRzIGNhbiBvbmx5IGJlIHVzZWQgaW5zaWRlCiAgICAgICAgICAgIC8vIGNsYXNzIGJvZGllcy4KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiYXR0ZW1wdGVkIHRvIHNldCByZWFkIG9ubHkgcHJpdmF0ZSBmaWVsZCIpOwogICAgICAgIH0KICAgICAgICBkZXNjcmlwdG9yLnZhbHVlID0gdmFsdWU7CiAgICB9Cn0KZnVuY3Rpb24gX2NsYXNzX2FwcGx5X2Rlc2NyaXB0b3JfdXBkYXRlKHJlY2VpdmVyLCBkZXNjcmlwdG9yKSB7CiAgICBpZiAoZGVzY3JpcHRvci5zZXQpIHsKICAgICAgICBpZiAoIWRlc2NyaXB0b3IuZ2V0KSB7CiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoImF0dGVtcHRlZCB0byByZWFkIHNldCBvbmx5IHByaXZhdGUgZmllbGQiKTsKICAgICAgICB9CiAgICAgICAgaWYgKCEoIl9fZGVzdHJXcmFwcGVyIiBpbiBkZXNjcmlwdG9yKSkgewogICAgICAgICAgICBkZXNjcmlwdG9yLl9fZGVzdHJXcmFwcGVyID0gewogICAgICAgICAgICAgICAgc2V0IHZhbHVlKHYpIHsKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLnNldC5jYWxsKHJlY2VpdmVyLCB2KTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBnZXQgdmFsdWUoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3IuZ2V0LmNhbGwocmVjZWl2ZXIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICByZXR1cm4gZGVzY3JpcHRvci5fX2Rlc3RyV3JhcHBlcjsKICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKCFkZXNjcmlwdG9yLndyaXRhYmxlKSB7CiAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgdGhyb3cgaW4gc3RyaWN0IG1vZGUsIGJ1dCBjbGFzcyBib2RpZXMgYXJlCiAgICAgICAgICAgIC8vIGFsd2F5cyBzdHJpY3QgYW5kIHByaXZhdGUgZmllbGRzIGNhbiBvbmx5IGJlIHVzZWQgaW5zaWRlCiAgICAgICAgICAgIC8vIGNsYXNzIGJvZGllcy4KICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiYXR0ZW1wdGVkIHRvIHNldCByZWFkIG9ubHkgcHJpdmF0ZSBmaWVsZCIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjsKICAgIH0KfQpmdW5jdGlvbiBfY2xhc3NfY2FsbF9jaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsKICAgIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7CiAgICB9Cn0KZnVuY3Rpb24gX2NsYXNzX2NoZWNrX3ByaXZhdGVfc3RhdGljX2ZpZWxkX2Rlc2NyaXB0b3IoZGVzY3JpcHRvciwgYWN0aW9uKSB7CiAgICBpZiAoZGVzY3JpcHRvciA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiYXR0ZW1wdGVkIHRvICIgKyBhY3Rpb24gKyAiIHByaXZhdGUgc3RhdGljIGZpZWxkIGJlZm9yZSBpdHMgZGVjbGFyYXRpb24iKTsKICAgIH0KfQpmdW5jdGlvbiBfY2xhc3NfZXh0cmFjdF9maWVsZF9kZXNjcmlwdG9yKHJlY2VpdmVyLCBwcml2YXRlTWFwLCBhY3Rpb24pIHsKICAgIGlmICghcHJpdmF0ZU1hcC5oYXMocmVjZWl2ZXIpKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiYXR0ZW1wdGVkIHRvICIgKyBhY3Rpb24gKyAiIHByaXZhdGUgZmllbGQgb24gbm9uLWluc3RhbmNlIik7CiAgICB9CiAgICByZXR1cm4gcHJpdmF0ZU1hcC5nZXQocmVjZWl2ZXIpOwp9CmZ1bmN0aW9uIF9jbGFzc19uYW1lX3Rkel9lcnJvcihuYW1lKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoIkNsYXNzIFwiIiArIG5hbWUgKyAiXCIgY2Fubm90IGJlIHJlZmVyZW5jZWQgaW4gY29tcHV0ZWQgcHJvcGVydHkga2V5cy4iKTsKfQpmdW5jdGlvbiBfY2xhc3NfcHJpdmF0ZV9maWVsZF9nZXQocmVjZWl2ZXIsIHByaXZhdGVNYXApIHsKICAgIHZhciBkZXNjcmlwdG9yID0gX2NsYXNzX2V4dHJhY3RfZmllbGRfZGVzY3JpcHRvcihyZWNlaXZlciwgcHJpdmF0ZU1hcCwgImdldCIpOwogICAgcmV0dXJuIF9jbGFzc19hcHBseV9kZXNjcmlwdG9yX2dldChyZWNlaXZlciwgZGVzY3JpcHRvcik7Cn0KZnVuY3Rpb24gX2NsYXNzX3ByaXZhdGVfZmllbGRfaW5pdChvYmosIHByaXZhdGVNYXAsIHZhbHVlKSB7CiAgICBfY2hlY2tfcHJpdmF0ZV9yZWRlY2xhcmF0aW9uKG9iaiwgcHJpdmF0ZU1hcCk7CiAgICBwcml2YXRlTWFwLnNldChvYmosIHZhbHVlKTsKfQpmdW5jdGlvbiBfY2xhc3NfcHJpdmF0ZV9maWVsZF9sb29zZV9iYXNlKHJlY2VpdmVyLCBwcml2YXRlS2V5KSB7CiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyZWNlaXZlciwgcHJpdmF0ZUtleSkpIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJhdHRlbXB0ZWQgdG8gdXNlIHByaXZhdGUgZmllbGQgb24gbm9uLWluc3RhbmNlIik7CiAgICB9CiAgICByZXR1cm4gcmVjZWl2ZXI7Cn0KdmFyIGlkID0gMDsKZnVuY3Rpb24gX2NsYXNzX3ByaXZhdGVfZmllbGRfbG9vc2Vfa2V5KG5hbWUpIHsKICAgIHJldHVybiAiX19wcml2YXRlXyIgKyBpZCsrICsgIl8iICsgbmFtZTsKfQpmdW5jdGlvbiBfY2xhc3NfcHJpdmF0ZV9maWVsZF9zZXQocmVjZWl2ZXIsIHByaXZhdGVNYXAsIHZhbHVlKSB7CiAgICB2YXIgZGVzY3JpcHRvciA9IF9jbGFzc19leHRyYWN0X2ZpZWxkX2Rlc2NyaXB0b3IocmVjZWl2ZXIsIHByaXZhdGVNYXAsICJzZXQiKTsKICAgIF9jbGFzc19hcHBseV9kZXNjcmlwdG9yX3NldChyZWNlaXZlciwgZGVzY3JpcHRvciwgdmFsdWUpOwogICAgcmV0dXJuIHZhbHVlOwp9CmZ1bmN0aW9uIF9jbGFzc19wcml2YXRlX2ZpZWxkX3VwZGF0ZShyZWNlaXZlciwgcHJpdmF0ZU1hcCkgewogICAgdmFyIGRlc2NyaXB0b3IgPSBfY2xhc3NfZXh0cmFjdF9maWVsZF9kZXNjcmlwdG9yKHJlY2VpdmVyLCBwcml2YXRlTWFwLCAidXBkYXRlIik7CiAgICByZXR1cm4gX2NsYXNzX2FwcGx5X2Rlc2NyaXB0b3JfdXBkYXRlKHJlY2VpdmVyLCBkZXNjcmlwdG9yKTsKfQpmdW5jdGlvbiBfY2xhc3NfcHJpdmF0ZV9tZXRob2RfZ2V0KHJlY2VpdmVyLCBwcml2YXRlU2V0LCBmbikgewogICAgaWYgKCFwcml2YXRlU2V0LmhhcyhyZWNlaXZlcikpIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJhdHRlbXB0ZWQgdG8gZ2V0IHByaXZhdGUgZmllbGQgb24gbm9uLWluc3RhbmNlIik7CiAgICB9CiAgICByZXR1cm4gZm47Cn0KZnVuY3Rpb24gX2NsYXNzX3ByaXZhdGVfbWV0aG9kX2luaXQob2JqLCBwcml2YXRlU2V0KSB7CiAgICBfY2hlY2tfcHJpdmF0ZV9yZWRlY2xhcmF0aW9uKG9iaiwgcHJpdmF0ZVNldCk7CiAgICBwcml2YXRlU2V0LmFkZChvYmopOwp9CmZ1bmN0aW9uIF9jbGFzc19wcml2YXRlX21ldGhvZF9zZXQoKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJhdHRlbXB0ZWQgdG8gcmVhc3NpZ24gcHJpdmF0ZSBtZXRob2QiKTsKfQpmdW5jdGlvbiBfY2xhc3Nfc3RhdGljX3ByaXZhdGVfZmllbGRfc3BlY19nZXQocmVjZWl2ZXIsIGNsYXNzQ29uc3RydWN0b3IsIGRlc2NyaXB0b3IpIHsKICAgIF9jbGFzc19jaGVja19wcml2YXRlX3N0YXRpY19hY2Nlc3MocmVjZWl2ZXIsIGNsYXNzQ29uc3RydWN0b3IpOwogICAgX2NsYXNzX2NoZWNrX3ByaXZhdGVfc3RhdGljX2ZpZWxkX2Rlc2NyaXB0b3IoZGVzY3JpcHRvciwgImdldCIpOwogICAgcmV0dXJuIF9jbGFzc19hcHBseV9kZXNjcmlwdG9yX2dldChyZWNlaXZlciwgZGVzY3JpcHRvcik7Cn0KZnVuY3Rpb24gX2NsYXNzX3N0YXRpY19wcml2YXRlX2ZpZWxkX3NwZWNfc2V0KHJlY2VpdmVyLCBjbGFzc0NvbnN0cnVjdG9yLCBkZXNjcmlwdG9yLCB2YWx1ZSkgewogICAgX2NsYXNzX2NoZWNrX3ByaXZhdGVfc3RhdGljX2FjY2VzcyhyZWNlaXZlciwgY2xhc3NDb25zdHJ1Y3Rvcik7CiAgICBfY2xhc3NfY2hlY2tfcHJpdmF0ZV9zdGF0aWNfZmllbGRfZGVzY3JpcHRvcihkZXNjcmlwdG9yLCAic2V0Iik7CiAgICBfY2xhc3NfYXBwbHlfZGVzY3JpcHRvcl9zZXQocmVjZWl2ZXIsIGRlc2NyaXB0b3IsIHZhbHVlKTsKICAgIHJldHVybiB2YWx1ZTsKfQpmdW5jdGlvbiBfY2xhc3Nfc3RhdGljX3ByaXZhdGVfZmllbGRfdXBkYXRlKHJlY2VpdmVyLCBjbGFzc0NvbnN0cnVjdG9yLCBkZXNjcmlwdG9yKSB7CiAgICBfY2xhc3NfY2hlY2tfcHJpdmF0ZV9zdGF0aWNfYWNjZXNzKHJlY2VpdmVyLCBjbGFzc0NvbnN0cnVjdG9yKTsKICAgIF9jbGFzc19jaGVja19wcml2YXRlX3N0YXRpY19maWVsZF9kZXNjcmlwdG9yKGRlc2NyaXB0b3IsICJ1cGRhdGUiKTsKICAgIHJldHVybiBfY2xhc3NfYXBwbHlfZGVzY3JpcHRvcl91cGRhdGUocmVjZWl2ZXIsIGRlc2NyaXB0b3IpOwp9CmZ1bmN0aW9uIF9jb25zdHJ1Y3QoUGFyZW50LCBhcmdzLCBDbGFzcykgewogICAgaWYgKF9pc19uYXRpdmVfcmVmbGVjdF9jb25zdHJ1Y3QoKSkgewogICAgICAgIF9jb25zdHJ1Y3QgPSBSZWZsZWN0LmNvbnN0cnVjdDsKICAgIH0gZWxzZSB7CiAgICAgICAgX2NvbnN0cnVjdCA9IGZ1bmN0aW9uIGNvbnN0cnVjdChQYXJlbnQsIGFyZ3MsIENsYXNzKSB7CiAgICAgICAgICAgIHZhciBhID0gW251bGxdOwogICAgICAgICAgICBhLnB1c2guYXBwbHkoYSwgYXJncyk7CiAgICAgICAgICAgIHZhciBDb25zdHJ1Y3RvciA9IEZ1bmN0aW9uLmJpbmQuYXBwbHkoUGFyZW50LCBhKTsKICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gbmV3IENvbnN0cnVjdG9yKCk7CiAgICAgICAgICAgIGlmIChDbGFzcykgX3NldF9wcm90b3R5cGVfb2YoaW5zdGFuY2UsIENsYXNzLnByb3RvdHlwZSk7CiAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTsKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuIF9jb25zdHJ1Y3QuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKfQpmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsKICAgICAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7CiAgICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOwogICAgICAgIGlmICgidmFsdWUiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOwogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsKICAgIH0KfQpmdW5jdGlvbiBfY3JlYXRlX2NsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgewogICAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7CiAgICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7CiAgICByZXR1cm4gQ29uc3RydWN0b3I7Cn0KZnVuY3Rpb24gX2RlY29yYXRlKGRlY29yYXRvcnMsIGZhY3RvcnksIHN1cGVyQ2xhc3MpIHsKICAgIHZhciByID0gZmFjdG9yeShmdW5jdGlvbiBpbml0aWFsaXplKE8pIHsKICAgICAgICBfaW5pdGlhbGl6ZUluc3RhbmNlRWxlbWVudHMoTywgZGVjb3JhdGVkLmVsZW1lbnRzKTsKICAgIH0sIHN1cGVyQ2xhc3MpOwogICAgdmFyIGRlY29yYXRlZCA9IF9kZWNvcmF0ZUNsYXNzKF9jb2FsZXNjZUNsYXNzRWxlbWVudHMoci5kLm1hcChfY3JlYXRlRWxlbWVudERlc2NyaXB0b3IpKSwgZGVjb3JhdG9ycyk7CiAgICBfaW5pdGlhbGl6ZUNsYXNzRWxlbWVudHMoci5GLCBkZWNvcmF0ZWQuZWxlbWVudHMpOwogICAgcmV0dXJuIF9ydW5DbGFzc0ZpbmlzaGVycyhyLkYsIGRlY29yYXRlZC5maW5pc2hlcnMpOwp9CgpmdW5jdGlvbiBfY3JlYXRlRWxlbWVudERlc2NyaXB0b3IoZGVmKSB7CiAgICB2YXIga2V5ID0gX3RvX3Byb3BlcnR5X2tleShkZWYua2V5KTsKICAgIHZhciBkZXNjcmlwdG9yOwogICAgaWYgKGRlZi5raW5kID09PSAibWV0aG9kIikgewogICAgICAgIGRlc2NyaXB0b3IgPSB7IHZhbHVlOiBkZWYudmFsdWUsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIGVudW1lcmFibGU6IGZhbHNlIH07CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRlZi52YWx1ZSwgIm5hbWUiLCB7IHZhbHVlOiBfdHlwZV9vZihrZXkpID09PSAic3ltYm9sIiA/ICIiIDoga2V5LCBjb25maWd1cmFibGU6IHRydWUgfSk7CiAgICB9IGVsc2UgaWYgKGRlZi5raW5kID09PSAiZ2V0IikgewogICAgICAgIGRlc2NyaXB0b3IgPSB7IGdldDogZGVmLnZhbHVlLCBjb25maWd1cmFibGU6IHRydWUsIGVudW1lcmFibGU6IGZhbHNlIH07CiAgICB9IGVsc2UgaWYgKGRlZi5raW5kID09PSAic2V0IikgewogICAgICAgIGRlc2NyaXB0b3IgPSB7IHNldDogZGVmLnZhbHVlLCBjb25maWd1cmFibGU6IHRydWUsIGVudW1lcmFibGU6IGZhbHNlIH07CiAgICB9IGVsc2UgaWYgKGRlZi5raW5kID09PSAiZmllbGQiKSB7CiAgICAgICAgZGVzY3JpcHRvciA9IHsgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgZW51bWVyYWJsZTogdHJ1ZSB9OwogICAgfQogICAgdmFyIGVsZW1lbnQgPSB7CiAgICAgICAga2luZDogZGVmLmtpbmQgPT09ICJmaWVsZCIgPyAiZmllbGQiIDogIm1ldGhvZCIsCiAgICAgICAga2V5OiBrZXksCiAgICAgICAgcGxhY2VtZW50OiBkZWYuc3RhdGljID8gInN0YXRpYyIgOiBkZWYua2luZCA9PT0gImZpZWxkIiA/ICJvd24iIDogInByb3RvdHlwZSIsCiAgICAgICAgZGVzY3JpcHRvcjogZGVzY3JpcHRvcgogICAgfTsKICAgIGlmIChkZWYuZGVjb3JhdG9ycykgZWxlbWVudC5kZWNvcmF0b3JzID0gZGVmLmRlY29yYXRvcnM7CiAgICBpZiAoZGVmLmtpbmQgPT09ICJmaWVsZCIpIGVsZW1lbnQuaW5pdGlhbGl6ZXIgPSBkZWYudmFsdWU7CiAgICByZXR1cm4gZWxlbWVudDsKfQpmdW5jdGlvbiBfY29hbGVzY2VHZXR0ZXJTZXR0ZXIoZWxlbWVudCwgb3RoZXIpIHsKICAgIGlmIChlbGVtZW50LmRlc2NyaXB0b3IuZ2V0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICBvdGhlci5kZXNjcmlwdG9yLmdldCA9IGVsZW1lbnQuZGVzY3JpcHRvci5nZXQ7CiAgICB9IGVsc2UgewogICAgICAgIG90aGVyLmRlc2NyaXB0b3Iuc2V0ID0gZWxlbWVudC5kZXNjcmlwdG9yLnNldDsKICAgIH0KfQpmdW5jdGlvbiBfY29hbGVzY2VDbGFzc0VsZW1lbnRzKGVsZW1lbnRzKSB7CiAgICB2YXIgbmV3RWxlbWVudHMgPSBbXTsKICAgIHZhciBpc1NhbWVFbGVtZW50ID0gZnVuY3Rpb24gaXNTYW1lRWxlbWVudChvdGhlcikgewogICAgICAgIHJldHVybiBvdGhlci5raW5kID09PSAibWV0aG9kIiAmJiBvdGhlci5rZXkgPT09IGVsZW1lbnQua2V5ICYmIG90aGVyLnBsYWNlbWVudCA9PT0gZWxlbWVudC5wbGFjZW1lbnQ7CiAgICB9OwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBlbGVtZW50ID0gZWxlbWVudHNbaV07CiAgICAgICAgdmFyIG90aGVyOwogICAgICAgIGlmIChlbGVtZW50LmtpbmQgPT09ICJtZXRob2QiICYmIChvdGhlciA9IG5ld0VsZW1lbnRzLmZpbmQoaXNTYW1lRWxlbWVudCkpKSB7CiAgICAgICAgICAgIGlmIChfaXNEYXRhRGVzY3JpcHRvcihlbGVtZW50LmRlc2NyaXB0b3IpIHx8IF9pc0RhdGFEZXNjcmlwdG9yKG90aGVyLmRlc2NyaXB0b3IpKSB7CiAgICAgICAgICAgICAgICBpZiAoX2hhc0RlY29yYXRvcnMoZWxlbWVudCkgfHwgX2hhc0RlY29yYXRvcnMob3RoZXIpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJEdXBsaWNhdGVkIG1ldGhvZHMgKCIgKyBlbGVtZW50LmtleSArICIpIGNhbid0IGJlIGRlY29yYXRlZC4iKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG90aGVyLmRlc2NyaXB0b3IgPSBlbGVtZW50LmRlc2NyaXB0b3I7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoX2hhc0RlY29yYXRvcnMoZWxlbWVudCkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoX2hhc0RlY29yYXRvcnMob3RoZXIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZWNvcmF0b3JzIGNhbid0IGJlIHBsYWNlZCBvbiBkaWZmZXJlbnQgYWNjZXNzb3JzIHdpdGggZm9yICIgKyAidGhlIHNhbWUgcHJvcGVydHkgKCIgKyBlbGVtZW50LmtleSArICIpLiIKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgb3RoZXIuZGVjb3JhdG9ycyA9IGVsZW1lbnQuZGVjb3JhdG9yczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF9jb2FsZXNjZUdldHRlclNldHRlcihlbGVtZW50LCBvdGhlcik7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBuZXdFbGVtZW50cy5wdXNoKGVsZW1lbnQpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXdFbGVtZW50czsKfQpmdW5jdGlvbiBfaGFzRGVjb3JhdG9ycyhlbGVtZW50KSB7CiAgICByZXR1cm4gZWxlbWVudC5kZWNvcmF0b3JzICYmIGVsZW1lbnQuZGVjb3JhdG9ycy5sZW5ndGg7Cn0KZnVuY3Rpb24gX2lzRGF0YURlc2NyaXB0b3IoZGVzYykgewogICAgcmV0dXJuIGRlc2MgIT09IHVuZGVmaW5lZCAmJiAhKGRlc2MudmFsdWUgPT09IHVuZGVmaW5lZCAmJiBkZXNjLndyaXRhYmxlID09PSB1bmRlZmluZWQpOwp9CmZ1bmN0aW9uIF9pbml0aWFsaXplQ2xhc3NFbGVtZW50cyhGLCBlbGVtZW50cykgewogICAgdmFyIHByb3RvID0gRi5wcm90b3R5cGU7CiAgICBbIm1ldGhvZCIsICJmaWVsZCJdLmZvckVhY2goZnVuY3Rpb24oa2luZCkgewogICAgICAgIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCkgewogICAgICAgICAgICB2YXIgcGxhY2VtZW50ID0gZWxlbWVudC5wbGFjZW1lbnQ7CiAgICAgICAgICAgIGlmIChlbGVtZW50LmtpbmQgPT09IGtpbmQgJiYgKHBsYWNlbWVudCA9PT0gInN0YXRpYyIgfHwgcGxhY2VtZW50ID09PSAicHJvdG90eXBlIikpIHsKICAgICAgICAgICAgICAgIHZhciByZWNlaXZlciA9IHBsYWNlbWVudCA9PT0gInN0YXRpYyIgPyBGIDogcHJvdG87CiAgICAgICAgICAgICAgICBfZGVmaW5lQ2xhc3NFbGVtZW50KHJlY2VpdmVyLCBlbGVtZW50KTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfSk7Cn0KZnVuY3Rpb24gX2luaXRpYWxpemVJbnN0YW5jZUVsZW1lbnRzKE8sIGVsZW1lbnRzKSB7CiAgICBbIm1ldGhvZCIsICJmaWVsZCJdLmZvckVhY2goZnVuY3Rpb24oa2luZCkgewogICAgICAgIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCkgewogICAgICAgICAgICBpZiAoZWxlbWVudC5raW5kID09PSBraW5kICYmIGVsZW1lbnQucGxhY2VtZW50ID09PSAib3duIikgewogICAgICAgICAgICAgICAgX2RlZmluZUNsYXNzRWxlbWVudChPLCBlbGVtZW50KTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfSk7Cn0KZnVuY3Rpb24gX2RlZmluZUNsYXNzRWxlbWVudChyZWNlaXZlciwgZWxlbWVudCkgewogICAgdmFyIGRlc2NyaXB0b3IgPSBlbGVtZW50LmRlc2NyaXB0b3I7CiAgICBpZiAoZWxlbWVudC5raW5kID09PSAiZmllbGQiKSB7CiAgICAgICAgdmFyIGluaXRpYWxpemVyID0gZWxlbWVudC5pbml0aWFsaXplcjsKICAgICAgICBkZXNjcmlwdG9yID0gewogICAgICAgICAgICBlbnVtZXJhYmxlOiBkZXNjcmlwdG9yLmVudW1lcmFibGUsCiAgICAgICAgICAgIHdyaXRhYmxlOiBkZXNjcmlwdG9yLndyaXRhYmxlLAogICAgICAgICAgICBjb25maWd1cmFibGU6IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlLAogICAgICAgICAgICB2YWx1ZTogaW5pdGlhbGl6ZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGluaXRpYWxpemVyLmNhbGwocmVjZWl2ZXIpCiAgICAgICAgfTsKICAgIH0KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZWNlaXZlciwgZWxlbWVudC5rZXksIGRlc2NyaXB0b3IpOwp9CmZ1bmN0aW9uIF9kZWNvcmF0ZUNsYXNzKGVsZW1lbnRzLCBkZWNvcmF0b3JzKSB7CiAgICB2YXIgbmV3RWxlbWVudHMgPSBbXTsKICAgIHZhciBmaW5pc2hlcnMgPSBbXTsKICAgIHZhciBwbGFjZW1lbnRzID0geyBzdGF0aWM6IFtdLCBwcm90b3R5cGU6IFtdLCBvd246IFtdIH07CiAgICBlbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uKGVsZW1lbnQpIHsKICAgICAgICBfYWRkRWxlbWVudFBsYWNlbWVudChlbGVtZW50LCBwbGFjZW1lbnRzKTsKICAgIH0pOwogICAgZWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbihlbGVtZW50KSB7CiAgICAgICAgaWYgKCFfaGFzRGVjb3JhdG9ycyhlbGVtZW50KSkgcmV0dXJuIG5ld0VsZW1lbnRzLnB1c2goZWxlbWVudCk7CiAgICAgICAgdmFyIGVsZW1lbnRGaW5pc2hlcnNFeHRyYXMgPSBfZGVjb3JhdGVFbGVtZW50KGVsZW1lbnQsIHBsYWNlbWVudHMpOwogICAgICAgIG5ld0VsZW1lbnRzLnB1c2goZWxlbWVudEZpbmlzaGVyc0V4dHJhcy5lbGVtZW50KTsKICAgICAgICBuZXdFbGVtZW50cy5wdXNoLmFwcGx5KG5ld0VsZW1lbnRzLCBlbGVtZW50RmluaXNoZXJzRXh0cmFzLmV4dHJhcyk7CiAgICAgICAgZmluaXNoZXJzLnB1c2guYXBwbHkoZmluaXNoZXJzLCBlbGVtZW50RmluaXNoZXJzRXh0cmFzLmZpbmlzaGVycyk7CiAgICB9KTsKICAgIGlmICghZGVjb3JhdG9ycykgewogICAgICAgIHJldHVybiB7IGVsZW1lbnRzOiBuZXdFbGVtZW50cywgZmluaXNoZXJzOiBmaW5pc2hlcnMgfTsKICAgIH0KICAgIHZhciByZXN1bHQgPSBfZGVjb3JhdGVDb25zdHJ1Y3RvcihuZXdFbGVtZW50cywgZGVjb3JhdG9ycyk7CiAgICBmaW5pc2hlcnMucHVzaC5hcHBseShmaW5pc2hlcnMsIHJlc3VsdC5maW5pc2hlcnMpOwogICAgcmVzdWx0LmZpbmlzaGVycyA9IGZpbmlzaGVyczsKICAgIHJldHVybiByZXN1bHQ7Cn0KZnVuY3Rpb24gX2FkZEVsZW1lbnRQbGFjZW1lbnQoZWxlbWVudCwgcGxhY2VtZW50cywgc2lsZW50KSB7CiAgICB2YXIga2V5cyA9IHBsYWNlbWVudHNbZWxlbWVudC5wbGFjZW1lbnRdOwogICAgaWYgKCFzaWxlbnQgJiYga2V5cy5pbmRleE9mKGVsZW1lbnQua2V5KSAhPT0gLTEpIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJEdXBsaWNhdGVkIGVsZW1lbnQgKCIgKyBlbGVtZW50LmtleSArICIpIik7CiAgICB9CiAgICBrZXlzLnB1c2goZWxlbWVudC5rZXkpOwp9CmZ1bmN0aW9uIF9kZWNvcmF0ZUVsZW1lbnQoZWxlbWVudCwgcGxhY2VtZW50cykgewogICAgdmFyIGV4dHJhcyA9IFtdOwogICAgdmFyIGZpbmlzaGVycyA9IFtdOwogICAgZm9yICh2YXIgZGVjb3JhdG9ycyA9IGVsZW1lbnQuZGVjb3JhdG9ycywgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICB2YXIga2V5cyA9IHBsYWNlbWVudHNbZWxlbWVudC5wbGFjZW1lbnRdOwogICAgICAgIGtleXMuc3BsaWNlKGtleXMuaW5kZXhPZihlbGVtZW50LmtleSksIDEpOwogICAgICAgIHZhciBlbGVtZW50T2JqZWN0ID0gX2Zyb21FbGVtZW50RGVzY3JpcHRvcihlbGVtZW50KTsKICAgICAgICB2YXIgZWxlbWVudEZpbmlzaGVyRXh0cmFzID0gX3RvRWxlbWVudEZpbmlzaGVyRXh0cmFzKCgwLCBkZWNvcmF0b3JzW2ldKShlbGVtZW50T2JqZWN0KSB8fCBlbGVtZW50T2JqZWN0KTsKICAgICAgICBlbGVtZW50ID0gZWxlbWVudEZpbmlzaGVyRXh0cmFzLmVsZW1lbnQ7CiAgICAgICAgX2FkZEVsZW1lbnRQbGFjZW1lbnQoZWxlbWVudCwgcGxhY2VtZW50cyk7CiAgICAgICAgaWYgKGVsZW1lbnRGaW5pc2hlckV4dHJhcy5maW5pc2hlcikgewogICAgICAgICAgICBmaW5pc2hlcnMucHVzaChlbGVtZW50RmluaXNoZXJFeHRyYXMuZmluaXNoZXIpOwogICAgICAgIH0KICAgICAgICB2YXIgbmV3RXh0cmFzID0gZWxlbWVudEZpbmlzaGVyRXh0cmFzLmV4dHJhczsKICAgICAgICBpZiAobmV3RXh0cmFzKSB7CiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbmV3RXh0cmFzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICBfYWRkRWxlbWVudFBsYWNlbWVudChuZXdFeHRyYXNbal0sIHBsYWNlbWVudHMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGV4dHJhcy5wdXNoLmFwcGx5KGV4dHJhcywgbmV3RXh0cmFzKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4geyBlbGVtZW50OiBlbGVtZW50LCBmaW5pc2hlcnM6IGZpbmlzaGVycywgZXh0cmFzOiBleHRyYXMgfTsKfQpmdW5jdGlvbiBfZGVjb3JhdGVDb25zdHJ1Y3RvcihlbGVtZW50cywgZGVjb3JhdG9ycykgewogICAgdmFyIGZpbmlzaGVycyA9IFtdOwogICAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICB2YXIgb2JqID0gX2Zyb21DbGFzc0Rlc2NyaXB0b3IoZWxlbWVudHMpOwogICAgICAgIHZhciBlbGVtZW50c0FuZEZpbmlzaGVyID0gX3RvQ2xhc3NEZXNjcmlwdG9yKCgwLCBkZWNvcmF0b3JzW2ldKShvYmopIHx8IG9iaik7CiAgICAgICAgaWYgKGVsZW1lbnRzQW5kRmluaXNoZXIuZmluaXNoZXIgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBmaW5pc2hlcnMucHVzaChlbGVtZW50c0FuZEZpbmlzaGVyLmZpbmlzaGVyKTsKICAgICAgICB9CiAgICAgICAgaWYgKGVsZW1lbnRzQW5kRmluaXNoZXIuZWxlbWVudHMgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBlbGVtZW50cyA9IGVsZW1lbnRzQW5kRmluaXNoZXIuZWxlbWVudHM7CiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZWxlbWVudHMubGVuZ3RoIC0gMTsgaisrKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBrID0gaiArIDE7IGsgPCBlbGVtZW50cy5sZW5ndGg7IGsrKykgewogICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50c1tqXS5rZXkgPT09IGVsZW1lbnRzW2tdLmtleSAmJiBlbGVtZW50c1tqXS5wbGFjZW1lbnQgPT09IGVsZW1lbnRzW2tdLnBsYWNlbWVudCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJEdXBsaWNhdGVkIGVsZW1lbnQgKCIgKyBlbGVtZW50c1tqXS5rZXkgKyAiKSIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiB7IGVsZW1lbnRzOiBlbGVtZW50cywgZmluaXNoZXJzOiBmaW5pc2hlcnMgfTsKfQpmdW5jdGlvbiBfZnJvbUVsZW1lbnREZXNjcmlwdG9yKGVsZW1lbnQpIHsKICAgIHZhciBvYmogPSB7IGtpbmQ6IGVsZW1lbnQua2luZCwga2V5OiBlbGVtZW50LmtleSwgcGxhY2VtZW50OiBlbGVtZW50LnBsYWNlbWVudCwgZGVzY3JpcHRvcjogZWxlbWVudC5kZXNjcmlwdG9yIH07CiAgICB2YXIgZGVzYyA9IHsgdmFsdWU6ICJEZXNjcmlwdG9yIiwgY29uZmlndXJhYmxlOiB0cnVlIH07CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBTeW1ib2wudG9TdHJpbmdUYWcsIGRlc2MpOwogICAgaWYgKGVsZW1lbnQua2luZCA9PT0gImZpZWxkIikgb2JqLmluaXRpYWxpemVyID0gZWxlbWVudC5pbml0aWFsaXplcjsKICAgIHJldHVybiBvYmo7Cn0KZnVuY3Rpb24gX3RvRWxlbWVudERlc2NyaXB0b3JzKGVsZW1lbnRPYmplY3RzKSB7CiAgICBpZiAoZWxlbWVudE9iamVjdHMgPT09IHVuZGVmaW5lZCkgcmV0dXJuOwogICAgcmV0dXJuIF90b19hcnJheShlbGVtZW50T2JqZWN0cykubWFwKGZ1bmN0aW9uKGVsZW1lbnRPYmplY3QpIHsKICAgICAgICB2YXIgZWxlbWVudCA9IF90b0VsZW1lbnREZXNjcmlwdG9yKGVsZW1lbnRPYmplY3QpOwogICAgICAgIF9kaXNhbGxvd1Byb3BlcnR5KGVsZW1lbnRPYmplY3QsICJmaW5pc2hlciIsICJBbiBlbGVtZW50IGRlc2NyaXB0b3IiKTsKICAgICAgICBfZGlzYWxsb3dQcm9wZXJ0eShlbGVtZW50T2JqZWN0LCAiZXh0cmFzIiwgIkFuIGVsZW1lbnQgZGVzY3JpcHRvciIpOwogICAgICAgIHJldHVybiBlbGVtZW50OwogICAgfSk7Cn0KZnVuY3Rpb24gX3RvRWxlbWVudERlc2NyaXB0b3IoZWxlbWVudE9iamVjdCkgewogICAgdmFyIGtpbmQgPSBTdHJpbmcoZWxlbWVudE9iamVjdC5raW5kKTsKICAgIGlmIChraW5kICE9PSAibWV0aG9kIiAmJiBraW5kICE9PSAiZmllbGQiKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigKICAgICAgICAgICAgIkFuIGVsZW1lbnQgZGVzY3JpcHRvcidzIC5raW5kIHByb3BlcnR5IG11c3QgYmUgZWl0aGVyIFwibWV0aG9kXCIgb3IiCiAgICAgICAgICAgICAgICArICIgXCJmaWVsZFwiLCBidXQgYSBkZWNvcmF0b3IgY3JlYXRlZCBhbiBlbGVtZW50IGRlc2NyaXB0b3Igd2l0aCIgKyAiIC5raW5kIFwiIiArIGtpbmQgKyAiXCIiCiAgICAgICAgKTsKICAgIH0KICAgIHZhciBrZXkgPSBfdG9fcHJvcGVydHlfa2V5KGVsZW1lbnRPYmplY3Qua2V5KTsKICAgIHZhciBwbGFjZW1lbnQgPSBTdHJpbmcoZWxlbWVudE9iamVjdC5wbGFjZW1lbnQpOwogICAgaWYgKHBsYWNlbWVudCAhPT0gInN0YXRpYyIgJiYgcGxhY2VtZW50ICE9PSAicHJvdG90eXBlIiAmJiBwbGFjZW1lbnQgIT09ICJvd24iKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigKICAgICAgICAgICAgIkFuIGVsZW1lbnQgZGVzY3JpcHRvcidzIC5wbGFjZW1lbnQgcHJvcGVydHkgbXVzdCBiZSBvbmUgb2YgXCJzdGF0aWNcIiwiCiAgICAgICAgICAgICAgICArICIgXCJwcm90b3R5cGVcIiBvciBcIm93blwiLCBidXQgYSBkZWNvcmF0b3IgY3JlYXRlZCBhbiBlbGVtZW50IGRlc2NyaXB0b3IiICsgIiB3aXRoIC5wbGFjZW1lbnQgXCIiICsgcGxhY2VtZW50ICsgIlwiIgogICAgICAgICk7CiAgICB9CiAgICB2YXIgZGVzY3JpcHRvciA9IGVsZW1lbnRPYmplY3QuZGVzY3JpcHRvcjsKICAgIF9kaXNhbGxvd1Byb3BlcnR5KGVsZW1lbnRPYmplY3QsICJlbGVtZW50cyIsICJBbiBlbGVtZW50IGRlc2NyaXB0b3IiKTsKICAgIHZhciBlbGVtZW50ID0geyBraW5kOiBraW5kLCBrZXk6IGtleSwgcGxhY2VtZW50OiBwbGFjZW1lbnQsIGRlc2NyaXB0b3I6IE9iamVjdC5hc3NpZ24oe30sIGRlc2NyaXB0b3IpIH07CiAgICBpZiAoa2luZCAhPT0gImZpZWxkIikgewogICAgICAgIF9kaXNhbGxvd1Byb3BlcnR5KGVsZW1lbnRPYmplY3QsICJpbml0aWFsaXplciIsICJBIG1ldGhvZCBkZXNjcmlwdG9yIik7CiAgICB9IGVsc2UgewogICAgICAgIF9kaXNhbGxvd1Byb3BlcnR5KGRlc2NyaXB0b3IsICJnZXQiLCAiVGhlIHByb3BlcnR5IGRlc2NyaXB0b3Igb2YgYSBmaWVsZCBkZXNjcmlwdG9yIik7CiAgICAgICAgX2Rpc2FsbG93UHJvcGVydHkoZGVzY3JpcHRvciwgInNldCIsICJUaGUgcHJvcGVydHkgZGVzY3JpcHRvciBvZiBhIGZpZWxkIGRlc2NyaXB0b3IiKTsKICAgICAgICBfZGlzYWxsb3dQcm9wZXJ0eShkZXNjcmlwdG9yLCAidmFsdWUiLCAiVGhlIHByb3BlcnR5IGRlc2NyaXB0b3Igb2YgYSBmaWVsZCBkZXNjcmlwdG9yIik7CiAgICAgICAgZWxlbWVudC5pbml0aWFsaXplciA9IGVsZW1lbnRPYmplY3QuaW5pdGlhbGl6ZXI7CiAgICB9CiAgICByZXR1cm4gZWxlbWVudDsKfQpmdW5jdGlvbiBfdG9FbGVtZW50RmluaXNoZXJFeHRyYXMoZWxlbWVudE9iamVjdCkgewogICAgdmFyIGVsZW1lbnQgPSBfdG9FbGVtZW50RGVzY3JpcHRvcihlbGVtZW50T2JqZWN0KTsKICAgIHZhciBmaW5pc2hlciA9IF9vcHRpb25hbENhbGxhYmxlUHJvcGVydHkoZWxlbWVudE9iamVjdCwgImZpbmlzaGVyIik7CiAgICB2YXIgZXh0cmFzID0gX3RvRWxlbWVudERlc2NyaXB0b3JzKGVsZW1lbnRPYmplY3QuZXh0cmFzKTsKICAgIHJldHVybiB7IGVsZW1lbnQ6IGVsZW1lbnQsIGZpbmlzaGVyOiBmaW5pc2hlciwgZXh0cmFzOiBleHRyYXMgfTsKfQpmdW5jdGlvbiBfZnJvbUNsYXNzRGVzY3JpcHRvcihlbGVtZW50cykgewogICAgdmFyIG9iaiA9IHsga2luZDogImNsYXNzIiwgZWxlbWVudHM6IGVsZW1lbnRzLm1hcChfZnJvbUVsZW1lbnREZXNjcmlwdG9yKSB9OwogICAgdmFyIGRlc2MgPSB7IHZhbHVlOiAiRGVzY3JpcHRvciIsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9OwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgU3ltYm9sLnRvU3RyaW5nVGFnLCBkZXNjKTsKICAgIHJldHVybiBvYmo7Cn0KZnVuY3Rpb24gX3RvQ2xhc3NEZXNjcmlwdG9yKG9iaikgewogICAgdmFyIGtpbmQgPSBTdHJpbmcob2JqLmtpbmQpOwogICAgaWYgKGtpbmQgIT09ICJjbGFzcyIpIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKAogICAgICAgICAgICAiQSBjbGFzcyBkZXNjcmlwdG9yJ3MgLmtpbmQgcHJvcGVydHkgbXVzdCBiZSBcImNsYXNzXCIsIGJ1dCBhIGRlY29yYXRvciIgKyAiIGNyZWF0ZWQgYSBjbGFzcyBkZXNjcmlwdG9yIHdpdGggLmtpbmQgXCIiICsga2luZAogICAgICAgICAgICAgICAgKyAiXCIiCiAgICAgICAgKTsKICAgIH0KICAgIF9kaXNhbGxvd1Byb3BlcnR5KG9iaiwgImtleSIsICJBIGNsYXNzIGRlc2NyaXB0b3IiKTsKICAgIF9kaXNhbGxvd1Byb3BlcnR5KG9iaiwgInBsYWNlbWVudCIsICJBIGNsYXNzIGRlc2NyaXB0b3IiKTsKICAgIF9kaXNhbGxvd1Byb3BlcnR5KG9iaiwgImRlc2NyaXB0b3IiLCAiQSBjbGFzcyBkZXNjcmlwdG9yIik7CiAgICBfZGlzYWxsb3dQcm9wZXJ0eShvYmosICJpbml0aWFsaXplciIsICJBIGNsYXNzIGRlc2NyaXB0b3IiKTsKICAgIF9kaXNhbGxvd1Byb3BlcnR5KG9iaiwgImV4dHJhcyIsICJBIGNsYXNzIGRlc2NyaXB0b3IiKTsKICAgIHZhciBmaW5pc2hlciA9IF9vcHRpb25hbENhbGxhYmxlUHJvcGVydHkob2JqLCAiZmluaXNoZXIiKTsKICAgIHZhciBlbGVtZW50cyA9IF90b0VsZW1lbnREZXNjcmlwdG9ycyhvYmouZWxlbWVudHMpOwogICAgcmV0dXJuIHsgZWxlbWVudHM6IGVsZW1lbnRzLCBmaW5pc2hlcjogZmluaXNoZXIgfTsKfQpmdW5jdGlvbiBfZGlzYWxsb3dQcm9wZXJ0eShvYmosIG5hbWUsIG9iamVjdFR5cGUpIHsKICAgIGlmIChvYmpbbmFtZV0gIT09IHVuZGVmaW5lZCkgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3Iob2JqZWN0VHlwZSArICIgY2FuJ3QgaGF2ZSBhIC4iICsgbmFtZSArICIgcHJvcGVydHkuIik7CiAgICB9Cn0KZnVuY3Rpb24gX29wdGlvbmFsQ2FsbGFibGVQcm9wZXJ0eShvYmosIG5hbWUpIHsKICAgIHZhciB2YWx1ZSA9IG9ialtuYW1lXTsKICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiB2YWx1ZSAhPT0gImZ1bmN0aW9uIikgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkICciICsgbmFtZSArICInIHRvIGJlIGEgZnVuY3Rpb24iKTsKICAgIH0KICAgIHJldHVybiB2YWx1ZTsKfQpmdW5jdGlvbiBfcnVuQ2xhc3NGaW5pc2hlcnMoY29uc3RydWN0b3IsIGZpbmlzaGVycykgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaW5pc2hlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgbmV3Q29uc3RydWN0b3IgPSAoMCwgZmluaXNoZXJzW2ldKShjb25zdHJ1Y3Rvcik7CiAgICAgICAgaWYgKG5ld0NvbnN0cnVjdG9yICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBuZXdDb25zdHJ1Y3RvciAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiRmluaXNoZXJzIG11c3QgcmV0dXJuIGEgY29uc3RydWN0b3IuIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3RydWN0b3IgPSBuZXdDb25zdHJ1Y3RvcjsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gY29uc3RydWN0b3I7Cn0KZnVuY3Rpb24gX2RlZmF1bHRzKG9iaiwgZGVmYXVsdHMpIHsKICAgIHZhciBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZGVmYXVsdHMpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIGtleSA9IGtleXNbaV07CiAgICAgICAgdmFyIHZhbHVlID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihkZWZhdWx0cywga2V5KTsKICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUuY29uZmlndXJhYmxlICYmIG9ialtrZXldID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIG9iajsKfQpmdW5jdGlvbiBfZGVmaW5lX2VudW1lcmFibGVfcHJvcGVydGllcyhvYmosIGRlc2NzKSB7CiAgICBmb3IgKHZhciBrZXkgaW4gZGVzY3MpIHsKICAgICAgICB2YXIgZGVzYyA9IGRlc2NzW2tleV07CiAgICAgICAgZGVzYy5jb25maWd1cmFibGUgPSBkZXNjLmVudW1lcmFibGUgPSB0cnVlOwogICAgICAgIGlmICgidmFsdWUiIGluIGRlc2MpIGRlc2Mud3JpdGFibGUgPSB0cnVlOwogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgZGVzYyk7CiAgICB9CiAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgewogICAgICAgIHZhciBvYmplY3RTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhkZXNjcyk7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmplY3RTeW1ib2xzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHZhciBzeW0gPSBvYmplY3RTeW1ib2xzW2ldOwogICAgICAgICAgICB2YXIgZGVzYyA9IGRlc2NzW3N5bV07CiAgICAgICAgICAgIGRlc2MuY29uZmlndXJhYmxlID0gZGVzYy5lbnVtZXJhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKCJ2YWx1ZSIgaW4gZGVzYykgZGVzYy53cml0YWJsZSA9IHRydWU7CiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHN5bSwgZGVzYyk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIG9iajsKfQpmdW5jdGlvbiBfZGVmaW5lX3Byb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgewogICAgaWYgKGtleSBpbiBvYmopIHsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOwogICAgfSBlbHNlIHsKICAgICAgICBvYmpba2V5XSA9IHZhbHVlOwogICAgfQogICAgcmV0dXJuIG9iajsKfQpmdW5jdGlvbiBfZXhwb3J0X3N0YXIoZnJvbSwgdG8pIHsKICAgIE9iamVjdC5rZXlzKGZyb20pLmZvckVhY2goZnVuY3Rpb24oaykgewogICAgICAgIGlmIChrICE9PSAiZGVmYXVsdCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0bywgaykpIHsKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRvLCBrLCB7CiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnJvbVtrXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gZnJvbTsKfQpmdW5jdGlvbiBfZXh0ZW5kcygpIHsKICAgIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbih0YXJnZXQpIHsKICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOwogICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7CiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgewogICAgICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH07CiAgICByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKfQpmdW5jdGlvbiBfZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyKSB7CiAgICBpZiAodHlwZW9mIFJlZmxlY3QgIT09ICJ1bmRlZmluZWQiICYmIFJlZmxlY3QuZ2V0KSB7CiAgICAgICAgX2dldCA9IFJlZmxlY3QuZ2V0OwogICAgfSBlbHNlIHsKICAgICAgICBfZ2V0ID0gZnVuY3Rpb24gZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyKSB7CiAgICAgICAgICAgIHZhciBiYXNlID0gX3N1cGVyX3Byb3BfYmFzZSh0YXJnZXQsIHByb3BlcnR5KTsKICAgICAgICAgICAgaWYgKCFiYXNlKSByZXR1cm47CiAgICAgICAgICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihiYXNlLCBwcm9wZXJ0eSk7CiAgICAgICAgICAgIGlmIChkZXNjLmdldCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGRlc2MuZ2V0LmNhbGwocmVjZWl2ZXIgfHwgdGFyZ2V0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZGVzYy52YWx1ZTsKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuIF9nZXQodGFyZ2V0LCBwcm9wZXJ0eSwgcmVjZWl2ZXIgfHwgdGFyZ2V0KTsKfQpmdW5jdGlvbiBfZ2V0X3Byb3RvdHlwZV9vZihvKSB7CiAgICBfZ2V0X3Byb3RvdHlwZV9vZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIGdldFByb3RvdHlwZU9mKG8pIHsKICAgICAgICByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pOwogICAgfTsKICAgIHJldHVybiBfZ2V0X3Byb3RvdHlwZV9vZihvKTsKfQpmdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsKICAgIGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gImZ1bmN0aW9uIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTsKICAgIH0KICAgIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgewogICAgICAgIGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9CiAgICB9KTsKICAgIGlmIChzdXBlckNsYXNzKSBfc2V0X3Byb3RvdHlwZV9vZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7Cn0KZnVuY3Rpb24gX2luaGVyaXRzX2xvb3NlKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7CiAgICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTsKICAgIHN1YkNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHN1YkNsYXNzOwogICAgc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsKfQpmdW5jdGlvbiBfaW5pdGlhbGl6ZXJfZGVmaW5lX3Byb3BlcnR5KHRhcmdldCwgcHJvcGVydHksIGRlc2NyaXB0b3IsIGNvbnRleHQpIHsKICAgIGlmICghZGVzY3JpcHRvcikgcmV0dXJuOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHksIHsKICAgICAgICBlbnVtZXJhYmxlOiBkZXNjcmlwdG9yLmVudW1lcmFibGUsCiAgICAgICAgY29uZmlndXJhYmxlOiBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSwKICAgICAgICB3cml0YWJsZTogZGVzY3JpcHRvci53cml0YWJsZSwKICAgICAgICB2YWx1ZTogZGVzY3JpcHRvci5pbml0aWFsaXplciA/IGRlc2NyaXB0b3IuaW5pdGlhbGl6ZXIuY2FsbChjb250ZXh0KSA6IHZvaWQgMAogICAgfSk7Cn0KZnVuY3Rpb24gX2luaXRpYWxpemVyX3dhcm5pbmdfaGVscGVyKGRlc2NyaXB0b3IsIGNvbnRleHQpIHsKICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAiRGVjb3JhdGluZyBjbGFzcyBwcm9wZXJ0eSBmYWlsZWQuIFBsZWFzZSBlbnN1cmUgdGhhdCAiICsgInByb3Bvc2FsLWNsYXNzLXByb3BlcnRpZXMgaXMgZW5hYmxlZCBhbmQgc2V0IHRvIHVzZSBsb29zZSBtb2RlLiAiCiAgICAgICAgICAgICsgIlRvIHVzZSBwcm9wb3NhbC1jbGFzcy1wcm9wZXJ0aWVzIGluIHNwZWMgbW9kZSB3aXRoIGRlY29yYXRvcnMsIHdhaXQgZm9yICIKICAgICAgICAgICAgKyAidGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiBkZWNvcmF0b3JzIGluIHN0YWdlIDIuIgogICAgKTsKfQpmdW5jdGlvbiBfaW5zdGFuY2VvZihsZWZ0LCByaWdodCkgewogICAgaWYgKHJpZ2h0ICE9IG51bGwgJiYgdHlwZW9mIFN5bWJvbCAhPT0gInVuZGVmaW5lZCIgJiYgcmlnaHRbU3ltYm9sLmhhc0luc3RhbmNlXSkgewogICAgICAgIHJldHVybiAhIXJpZ2h0W1N5bWJvbC5oYXNJbnN0YW5jZV0obGVmdCk7CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBsZWZ0IGluc3RhbmNlb2YgcmlnaHQ7CiAgICB9Cn0KZnVuY3Rpb24gX2ludGVyb3BfcmVxdWlyZV9kZWZhdWx0KG9iaikgewogICAgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07Cn0KZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKG5vZGVJbnRlcm9wKSB7CiAgICBpZiAodHlwZW9mIFdlYWtNYXAgIT09ICJmdW5jdGlvbiIpIHJldHVybiBudWxsOwogICAgdmFyIGNhY2hlQmFiZWxJbnRlcm9wID0gbmV3IFdlYWtNYXAoKTsKICAgIHZhciBjYWNoZU5vZGVJbnRlcm9wID0gbmV3IFdlYWtNYXAoKTsKICAgIHJldHVybiAoX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlID0gZnVuY3Rpb24obm9kZUludGVyb3ApIHsKICAgICAgICByZXR1cm4gbm9kZUludGVyb3AgPyBjYWNoZU5vZGVJbnRlcm9wIDogY2FjaGVCYWJlbEludGVyb3A7CiAgICB9KShub2RlSW50ZXJvcCk7Cn0KZnVuY3Rpb24gX2ludGVyb3BfcmVxdWlyZV93aWxkY2FyZChvYmosIG5vZGVJbnRlcm9wKSB7CiAgICBpZiAoIW5vZGVJbnRlcm9wICYmIG9iaiAmJiBvYmouX19lc01vZHVsZSkgewogICAgICAgIHJldHVybiBvYmo7CiAgICB9CiAgICBpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogIT09ICJvYmplY3QiICYmIHR5cGVvZiBvYmogIT09ICJmdW5jdGlvbiIpIHsKICAgICAgICByZXR1cm4geyBkZWZhdWx0OiBvYmogfTsKICAgIH0KICAgIHZhciBjYWNoZSA9IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZShub2RlSW50ZXJvcCk7CiAgICBpZiAoY2FjaGUgJiYgY2FjaGUuaGFzKG9iaikpIHsKICAgICAgICByZXR1cm4gY2FjaGUuZ2V0KG9iaik7CiAgICB9CiAgICB2YXIgbmV3T2JqID0geyBfX3Byb3RvX186IG51bGwgfTsKICAgIHZhciBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsKICAgIGZvciAodmFyIGtleSBpbiBvYmopIHsKICAgICAgICBpZiAoa2V5ICE9PSAiZGVmYXVsdCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgewogICAgICAgICAgICB2YXIgZGVzYyA9IGhhc1Byb3BlcnR5RGVzY3JpcHRvciA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpIDogbnVsbDsKICAgICAgICAgICAgaWYgKGRlc2MgJiYgKGRlc2MuZ2V0IHx8IGRlc2Muc2V0KSkgewogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld09iaiwga2V5LCBkZXNjKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG5ld09ialtrZXldID0gb2JqW2tleV07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBuZXdPYmouZGVmYXVsdCA9IG9iajsKICAgIGlmIChjYWNoZSkgewogICAgICAgIGNhY2hlLnNldChvYmosIG5ld09iaik7CiAgICB9CiAgICByZXR1cm4gbmV3T2JqOwp9CmZ1bmN0aW9uIF9pc19uYXRpdmVfZnVuY3Rpb24oZm4pIHsKICAgIHJldHVybiBGdW5jdGlvbi50b1N0cmluZy5jYWxsKGZuKS5pbmRleE9mKCJbbmF0aXZlIGNvZGVdIikgIT09IC0xOwp9CmZ1bmN0aW9uIF9pdGVyYWJsZV90b19hcnJheShpdGVyKSB7CiAgICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gInVuZGVmaW5lZCIgJiYgaXRlcltTeW1ib2wuaXRlcmF0b3JdICE9IG51bGwgfHwgaXRlclsiQEBpdGVyYXRvciJdICE9IG51bGwpIHJldHVybiBBcnJheS5mcm9tKGl0ZXIpOwp9CmZ1bmN0aW9uIF9pdGVyYWJsZV90b19hcnJheV9saW1pdChhcnIsIGkpIHsKICAgIHZhciBfaSA9IGFyciA9PSBudWxsID8gbnVsbCA6IHR5cGVvZiBTeW1ib2wgIT09ICJ1bmRlZmluZWQiICYmIGFycltTeW1ib2wuaXRlcmF0b3JdIHx8IGFyclsiQEBpdGVyYXRvciJdOwogICAgaWYgKF9pID09IG51bGwpIHJldHVybjsKICAgIHZhciBfYXJyID0gW107CiAgICB2YXIgX24gPSB0cnVlOwogICAgdmFyIF9kID0gZmFsc2U7CiAgICB2YXIgX3MsIF9lOwogICAgdHJ5IHsKICAgICAgICBmb3IgKF9pID0gX2kuY2FsbChhcnIpOyAhKF9uID0gKF9zID0gX2kubmV4dCgpKS5kb25lKTsgX24gPSB0cnVlKSB7CiAgICAgICAgICAgIF9hcnIucHVzaChfcy52YWx1ZSk7CiAgICAgICAgICAgIGlmIChpICYmIF9hcnIubGVuZ3RoID09PSBpKSBicmVhazsKICAgICAgICB9CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICBfZCA9IHRydWU7CiAgICAgICAgX2UgPSBlcnI7CiAgICB9IGZpbmFsbHkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmICghX24gJiYgX2lbInJldHVybiJdICE9IG51bGwpIF9pWyJyZXR1cm4iXSgpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgIGlmIChfZCkgdGhyb3cgX2U7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIF9hcnI7Cn0KZnVuY3Rpb24gX2l0ZXJhYmxlX3RvX2FycmF5X2xpbWl0X2xvb3NlKGFyciwgaSkgewogICAgdmFyIF9pID0gYXJyICYmICh0eXBlb2YgU3ltYm9sICE9PSAidW5kZWZpbmVkIiAmJiBhcnJbU3ltYm9sLml0ZXJhdG9yXSB8fCBhcnJbIkBAaXRlcmF0b3IiXSk7CiAgICBpZiAoX2kgPT0gbnVsbCkgcmV0dXJuOwogICAgdmFyIF9hcnIgPSBbXTsKICAgIGZvciAoX2kgPSBfaS5jYWxsKGFyciksIF9zdGVwOyAhKF9zdGVwID0gX2kubmV4dCgpKS5kb25lOykgewogICAgICAgIF9hcnIucHVzaChfc3RlcC52YWx1ZSk7CiAgICAgICAgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrOwogICAgfQogICAgcmV0dXJuIF9hcnI7Cn0KdmFyIFJFQUNUX0VMRU1FTlRfVFlQRTsKZnVuY3Rpb24gX2pzeCh0eXBlLCBwcm9wcywga2V5LCBjaGlsZHJlbikgewogICAgaWYgKCFSRUFDVF9FTEVNRU5UX1RZUEUpIHsKICAgICAgICBSRUFDVF9FTEVNRU5UX1RZUEUgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIFN5bWJvbC5mb3IgJiYgU3ltYm9sLmZvcigicmVhY3QuZWxlbWVudCIpIHx8IDB4ZWFjNzsKICAgIH0KICAgIHZhciBkZWZhdWx0UHJvcHMgPSB0eXBlICYmIHR5cGUuZGVmYXVsdFByb3BzOwogICAgdmFyIGNoaWxkcmVuTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCAtIDM7CiAgICBpZiAoIXByb3BzICYmIGNoaWxkcmVuTGVuZ3RoICE9PSAwKSB7CiAgICAgICAgcHJvcHMgPSB7IGNoaWxkcmVuOiB2b2lkIDAgfTsKICAgIH0KICAgIGlmIChwcm9wcyAmJiBkZWZhdWx0UHJvcHMpIHsKICAgICAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBkZWZhdWx0UHJvcHMpIHsKICAgICAgICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PT0gdm9pZCAwKSB7CiAgICAgICAgICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSBlbHNlIGlmICghcHJvcHMpIHsKICAgICAgICBwcm9wcyA9IGRlZmF1bHRQcm9wcyB8fCB7fTsKICAgIH0KICAgIGlmIChjaGlsZHJlbkxlbmd0aCA9PT0gMSkgewogICAgICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRyZW47CiAgICB9IGVsc2UgaWYgKGNoaWxkcmVuTGVuZ3RoID4gMSkgewogICAgICAgIHZhciBjaGlsZEFycmF5ID0gbmV3IEFycmF5KGNoaWxkcmVuTGVuZ3RoKTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuTGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgY2hpbGRBcnJheVtpXSA9IGFyZ3VtZW50c1tpICsgM107CiAgICAgICAgfQogICAgICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRBcnJheTsKICAgIH0KICAgIHJldHVybiB7ICQkdHlwZW9mOiBSRUFDVF9FTEVNRU5UX1RZUEUsIHR5cGU6IHR5cGUsIGtleToga2V5ID09PSB1bmRlZmluZWQgPyBudWxsIDogIiIgKyBrZXksIHJlZjogbnVsbCwgcHJvcHM6IHByb3BzLCBfb3duZXI6IG51bGwgfTsKfQpmdW5jdGlvbiBfbmV3X2Fycm93X2NoZWNrKGlubmVyVGhpcywgYm91bmRUaGlzKSB7CiAgICBpZiAoaW5uZXJUaGlzICE9PSBib3VuZFRoaXMpIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgaW5zdGFudGlhdGUgYW4gYXJyb3cgZnVuY3Rpb24iKTsKICAgIH0KfQpmdW5jdGlvbiBfbm9uX2l0ZXJhYmxlX3Jlc3QoKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKAogICAgICAgICJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4iCiAgICApOwp9CmZ1bmN0aW9uIF9ub25faXRlcmFibGVfc3ByZWFkKCkgewogICAgdGhyb3cgbmV3IFR5cGVFcnJvcigKICAgICAgICAiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIKICAgICk7Cn0KZnVuY3Rpb24gX29iamVjdF9kZXN0cnVjdHVyaW5nX2VtcHR5KG8pIHsKICAgIGlmIChvID09PSBudWxsIHx8IG8gPT09IHZvaWQgMCkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGRlc3RydWN0dXJlICIgKyBvKTsKICAgIHJldHVybiBvOwp9CmZ1bmN0aW9uIF9vYmplY3Rfc3ByZWFkKHRhcmdldCkgewogICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTsKICAgICAgICB2YXIgb3duS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7CiAgICAgICAgaWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgIG93bktleXMgPSBvd25LZXlzLmNvbmNhdCgKICAgICAgICAgICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKS5maWx0ZXIoZnVuY3Rpb24oc3ltKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBzeW0pLmVudW1lcmFibGU7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBvd25LZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7CiAgICAgICAgICAgIF9kZWZpbmVfcHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsKICAgICAgICB9KTsKICAgIH0KICAgIHJldHVybiB0YXJnZXQ7Cn0KZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7CiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7CiAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgewogICAgICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOwogICAgICAgIGlmIChlbnVtZXJhYmxlT25seSkgewogICAgICAgICAgICBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24oc3ltKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsKICAgIH0KICAgIHJldHVybiBrZXlzOwp9CmZ1bmN0aW9uIF9vYmplY3Rfc3ByZWFkX3Byb3BzKHRhcmdldCwgc291cmNlKSB7CiAgICBzb3VyY2UgPSBzb3VyY2UgIT0gbnVsbCA/IHNvdXJjZSA6IHt9OwogICAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTsKICAgIH0gZWxzZSB7CiAgICAgICAgb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbihrZXkpIHsKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7CiAgICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gdGFyZ2V0Owp9CmZ1bmN0aW9uIF9vYmplY3Rfd2l0aG91dF9wcm9wZXJ0aWVzKHNvdXJjZSwgZXhjbHVkZWQpIHsKICAgIGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OwogICAgdmFyIHRhcmdldCA9IF9vYmplY3Rfd2l0aG91dF9wcm9wZXJ0aWVzX2xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpOwogICAgdmFyIGtleSwgaTsKICAgIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7CiAgICAgICAgdmFyIHNvdXJjZVN5bWJvbEtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSk7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IHNvdXJjZVN5bWJvbEtleXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAga2V5ID0gc291cmNlU3ltYm9sS2V5c1tpXTsKICAgICAgICAgICAgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsKICAgICAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoc291cmNlLCBrZXkpKSBjb250aW51ZTsKICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gdGFyZ2V0Owp9CmZ1bmN0aW9uIF9vYmplY3Rfd2l0aG91dF9wcm9wZXJ0aWVzX2xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHsKICAgIGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OwogICAgdmFyIHRhcmdldCA9IHt9OwogICAgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpOwogICAgdmFyIGtleSwgaTsKICAgIGZvciAoaSA9IDA7IGkgPCBzb3VyY2VLZXlzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAga2V5ID0gc291cmNlS2V5c1tpXTsKICAgICAgICBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOwogICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07CiAgICB9CiAgICByZXR1cm4gdGFyZ2V0Owp9CmZ1bmN0aW9uIF9wb3NzaWJsZV9jb25zdHJ1Y3Rvcl9yZXR1cm4oc2VsZiwgY2FsbCkgewogICAgaWYgKGNhbGwgJiYgKF90eXBlX29mKGNhbGwpID09PSAib2JqZWN0IiB8fCB0eXBlb2YgY2FsbCA9PT0gImZ1bmN0aW9uIikpIHsKICAgICAgICByZXR1cm4gY2FsbDsKICAgIH0KICAgIHJldHVybiBfYXNzZXJ0X3RoaXNfaW5pdGlhbGl6ZWQoc2VsZik7Cn0KZnVuY3Rpb24gX3JlYWRfb25seV9lcnJvcihuYW1lKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJcIiIgKyBuYW1lICsgIlwiIGlzIHJlYWQtb25seSIpOwp9CmZ1bmN0aW9uIHNldCh0YXJnZXQsIHByb3BlcnR5LCB2YWx1ZSwgcmVjZWl2ZXIpIHsKICAgIGlmICh0eXBlb2YgUmVmbGVjdCAhPT0gInVuZGVmaW5lZCIgJiYgUmVmbGVjdC5zZXQpIHsKICAgICAgICBzZXQgPSBSZWZsZWN0LnNldDsKICAgIH0gZWxzZSB7CiAgICAgICAgc2V0ID0gZnVuY3Rpb24gc2V0KHRhcmdldCwgcHJvcGVydHksIHZhbHVlLCByZWNlaXZlcikgewogICAgICAgICAgICB2YXIgYmFzZSA9IF9zdXBlcl9wcm9wX2Jhc2UodGFyZ2V0LCBwcm9wZXJ0eSk7CiAgICAgICAgICAgIHZhciBkZXNjOwogICAgICAgICAgICBpZiAoYmFzZSkgewogICAgICAgICAgICAgICAgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYmFzZSwgcHJvcGVydHkpOwogICAgICAgICAgICAgICAgaWYgKGRlc2Muc2V0KSB7CiAgICAgICAgICAgICAgICAgICAgZGVzYy5zZXQuY2FsbChyZWNlaXZlciwgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZGVzYy53cml0YWJsZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyZWNlaXZlciwgcHJvcGVydHkpOwogICAgICAgICAgICBpZiAoZGVzYykgewogICAgICAgICAgICAgICAgaWYgKCFkZXNjLndyaXRhYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGVzYy52YWx1ZSA9IHZhbHVlOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlY2VpdmVyLCBwcm9wZXJ0eSwgZGVzYyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBfZGVmaW5lX3Byb3BlcnR5KHJlY2VpdmVyLCBwcm9wZXJ0eSwgdmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH07CiAgICB9CiAgICByZXR1cm4gc2V0KHRhcmdldCwgcHJvcGVydHksIHZhbHVlLCByZWNlaXZlcik7Cn0KZnVuY3Rpb24gX3NldCh0YXJnZXQsIHByb3BlcnR5LCB2YWx1ZSwgcmVjZWl2ZXIsIGlzU3RyaWN0KSB7CiAgICB2YXIgcyA9IHNldCh0YXJnZXQsIHByb3BlcnR5LCB2YWx1ZSwgcmVjZWl2ZXIgfHwgdGFyZ2V0KTsKICAgIGlmICghcyAmJiBpc1N0cmljdCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcigiZmFpbGVkIHRvIHNldCBwcm9wZXJ0eSIpOwogICAgfQogICAgcmV0dXJuIHZhbHVlOwp9CmZ1bmN0aW9uIF9zZXRfcHJvdG90eXBlX29mKG8sIHApIHsKICAgIF9zZXRfcHJvdG90eXBlX29mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKG8sIHApIHsKICAgICAgICBvLl9fcHJvdG9fXyA9IHA7CiAgICAgICAgcmV0dXJuIG87CiAgICB9OwogICAgcmV0dXJuIF9zZXRfcHJvdG90eXBlX29mKG8sIHApOwp9CmZ1bmN0aW9uIF9za2lwX2ZpcnN0X2dlbmVyYXRvcl9uZXh0KGZuKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGl0ID0gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICBpdC5uZXh0KCk7CiAgICAgICAgcmV0dXJuIGl0OwogICAgfTsKfQpmdW5jdGlvbiBfc2xpY2VkX3RvX2FycmF5KGFyciwgaSkgewogICAgcmV0dXJuIF9hcnJheV93aXRoX2hvbGVzKGFycikgfHwgX2l0ZXJhYmxlX3RvX2FycmF5X2xpbWl0KGFyciwgaSkgfHwgX3Vuc3VwcG9ydGVkX2l0ZXJhYmxlX3RvX2FycmF5KGFyciwgaSkgfHwgX25vbl9pdGVyYWJsZV9yZXN0KCk7Cn0KZnVuY3Rpb24gX3NsaWNlZF90b19hcnJheV9sb29zZShhcnIsIGkpIHsKICAgIHJldHVybiBfYXJyYXlfd2l0aF9ob2xlcyhhcnIpIHx8IF9pdGVyYWJsZV90b19hcnJheV9saW1pdF9sb29zZShhcnIsIGkpIHx8IF91bnN1cHBvcnRlZF9pdGVyYWJsZV90b19hcnJheShhcnIsIGkpCiAgICAgICAgfHwgX25vbl9pdGVyYWJsZV9yZXN0KCk7Cn0KZnVuY3Rpb24gX3N1cGVyX3Byb3BfYmFzZShvYmplY3QsIHByb3BlcnR5KSB7CiAgICB3aGlsZSAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KSkgewogICAgICAgIG9iamVjdCA9IF9nZXRfcHJvdG90eXBlX29mKG9iamVjdCk7CiAgICAgICAgaWYgKG9iamVjdCA9PT0gbnVsbCkgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gb2JqZWN0Owp9CmZ1bmN0aW9uIF90YWdnZWRfdGVtcGxhdGVfbGl0ZXJhbChzdHJpbmdzLCByYXcpIHsKICAgIGlmICghcmF3KSB7CiAgICAgICAgcmF3ID0gc3RyaW5ncy5zbGljZSgwKTsKICAgIH0KICAgIHJldHVybiBPYmplY3QuZnJlZXplKE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHN0cmluZ3MsIHsgcmF3OiB7IHZhbHVlOiBPYmplY3QuZnJlZXplKHJhdykgfSB9KSk7Cn0KZnVuY3Rpb24gX3RhZ2dlZF90ZW1wbGF0ZV9saXRlcmFsX2xvb3NlKHN0cmluZ3MsIHJhdykgewogICAgaWYgKCFyYXcpIHsKICAgICAgICByYXcgPSBzdHJpbmdzLnNsaWNlKDApOwogICAgfQogICAgc3RyaW5ncy5yYXcgPSByYXc7CiAgICByZXR1cm4gc3RyaW5nczsKfQpmdW5jdGlvbiBfdGhyb3coZSkgewogICAgdGhyb3cgZTsKfQpmdW5jdGlvbiBfdG9fYXJyYXkoYXJyKSB7CiAgICByZXR1cm4gX2FycmF5X3dpdGhfaG9sZXMoYXJyKSB8fCBfaXRlcmFibGVfdG9fYXJyYXkoYXJyKSB8fCBfdW5zdXBwb3J0ZWRfaXRlcmFibGVfdG9fYXJyYXkoYXJyKSB8fCBfbm9uX2l0ZXJhYmxlX3Jlc3QoKTsKfQpmdW5jdGlvbiBfdG9fY29uc3VtYWJsZV9hcnJheShhcnIpIHsKICAgIHJldHVybiBfYXJyYXlfd2l0aG91dF9ob2xlcyhhcnIpIHx8IF9pdGVyYWJsZV90b19hcnJheShhcnIpIHx8IF91bnN1cHBvcnRlZF9pdGVyYWJsZV90b19hcnJheShhcnIpIHx8IF9ub25faXRlcmFibGVfc3ByZWFkKCk7Cn0KZnVuY3Rpb24gX3RvX3ByaW1pdGl2ZShpbnB1dCwgaGludCkgewogICAgaWYgKF90eXBlX29mKGlucHV0KSAhPT0gIm9iamVjdCIgfHwgaW5wdXQgPT09IG51bGwpIHJldHVybiBpbnB1dDsKICAgIHZhciBwcmltID0gaW5wdXRbU3ltYm9sLnRvUHJpbWl0aXZlXTsKICAgIGlmIChwcmltICE9PSB1bmRlZmluZWQpIHsKICAgICAgICB2YXIgcmVzID0gcHJpbS5jYWxsKGlucHV0LCBoaW50IHx8ICJkZWZhdWx0Iik7CiAgICAgICAgaWYgKF90eXBlX29mKHJlcykgIT09ICJvYmplY3QiKSByZXR1cm4gcmVzOwogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuIik7CiAgICB9CiAgICByZXR1cm4gKGhpbnQgPT09ICJzdHJpbmciID8gU3RyaW5nIDogTnVtYmVyKShpbnB1dCk7Cn0KZnVuY3Rpb24gX3RvX3Byb3BlcnR5X2tleShhcmcpIHsKICAgIHZhciBrZXkgPSBfdG9fcHJpbWl0aXZlKGFyZywgInN0cmluZyIpOwogICAgcmV0dXJuIF90eXBlX29mKGtleSkgPT09ICJzeW1ib2wiID8ga2V5IDogU3RyaW5nKGtleSk7Cn0KZnVuY3Rpb24gX3VwZGF0ZSh0YXJnZXQsIHByb3BlcnR5LCByZWNlaXZlciwgaXNTdHJpY3QpIHsKICAgIHJldHVybiB7CiAgICAgICAgZ2V0IF8oKSB7CiAgICAgICAgICAgIHJldHVybiBfZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyKTsKICAgICAgICB9LAogICAgICAgIHNldCBfKHZhbHVlKSB7CiAgICAgICAgICAgIF9zZXQodGFyZ2V0LCBwcm9wZXJ0eSwgdmFsdWUsIHJlY2VpdmVyLCBpc1N0cmljdCk7CiAgICAgICAgfQogICAgfTsKfQpmdW5jdGlvbiBfdHlwZV9vZihvYmopIHsKICAgICJAc3djL2hlbHBlcnMgLSB0eXBlb2YiOwogICAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sICE9PSAidW5kZWZpbmVkIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCA/ICJzeW1ib2wiIDogdHlwZW9mIG9iajsKfQpmdW5jdGlvbiBfdW5zdXBwb3J0ZWRfaXRlcmFibGVfdG9fYXJyYXkobywgbWluTGVuKSB7CiAgICBpZiAoIW8pIHJldHVybjsKICAgIGlmICh0eXBlb2YgbyA9PT0gInN0cmluZyIpIHJldHVybiBfYXJyYXlfbGlrZV90b19hcnJheShvLCBtaW5MZW4pOwogICAgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOwogICAgaWYgKG4gPT09ICJPYmplY3QiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7CiAgICBpZiAobiA9PT0gIk1hcCIgfHwgbiA9PT0gIlNldCIpIHJldHVybiBBcnJheS5mcm9tKG4pOwogICAgaWYgKG4gPT09ICJBcmd1bWVudHMiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5X2xpa2VfdG9fYXJyYXkobywgbWluTGVuKTsKfQpmdW5jdGlvbiBfd3JhcF9hc3luY19nZW5lcmF0b3IoZm4pIHsKICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gbmV3IF9hc3luY19nZW5lcmF0b3IoZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKSk7CiAgICB9Owp9CmZ1bmN0aW9uIF93cmFwX25hdGl2ZV9zdXBlcihDbGFzcykgewogICAgdmFyIF9jYWNoZSA9IHR5cGVvZiBNYXAgPT09ICJmdW5jdGlvbiIgPyBuZXcgTWFwKCkgOiB1bmRlZmluZWQ7CiAgICBfd3JhcF9uYXRpdmVfc3VwZXIgPSBmdW5jdGlvbiB3cmFwTmF0aXZlU3VwZXIoQ2xhc3MpIHsKICAgICAgICBpZiAoQ2xhc3MgPT09IG51bGwgfHwgIV9pc19uYXRpdmVfZnVuY3Rpb24oQ2xhc3MpKSByZXR1cm4gQ2xhc3M7CiAgICAgICAgaWYgKHR5cGVvZiBDbGFzcyAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZW9mIF9jYWNoZSAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgaWYgKF9jYWNoZS5oYXMoQ2xhc3MpKSByZXR1cm4gX2NhY2hlLmdldChDbGFzcyk7CiAgICAgICAgICAgIF9jYWNoZS5zZXQoQ2xhc3MsIFdyYXBwZXIpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBXcmFwcGVyKCkgewogICAgICAgICAgICByZXR1cm4gX2NvbnN0cnVjdChDbGFzcywgYXJndW1lbnRzLCBfZ2V0X3Byb3RvdHlwZV9vZih0aGlzKS5jb25zdHJ1Y3Rvcik7CiAgICAgICAgfQogICAgICAgIFdyYXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShDbGFzcy5wcm90b3R5cGUsIHsKICAgICAgICAgICAgY29uc3RydWN0b3I6IHsgdmFsdWU6IFdyYXBwZXIsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0KICAgICAgICB9KTsKICAgICAgICByZXR1cm4gX3NldF9wcm90b3R5cGVfb2YoV3JhcHBlciwgQ2xhc3MpOwogICAgfTsKICAgIHJldHVybiBfd3JhcF9uYXRpdmVfc3VwZXIoQ2xhc3MpOwp9CmZ1bmN0aW9uIF93cml0ZV9vbmx5X2Vycm9yKG5hbWUpIHsKICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIlwiIiArIG5hbWUgKyAiXCIgaXMgd3JpdGUtb25seSIpOwp9CmZ1bmN0aW9uIF9jbGFzc19wcml2YXRlX2ZpZWxkX2Rlc3RydWN0dXJlKHJlY2VpdmVyLCBwcml2YXRlTWFwKSB7CiAgICB2YXIgZGVzY3JpcHRvciA9IF9jbGFzc19leHRyYWN0X2ZpZWxkX2Rlc2NyaXB0b3IocmVjZWl2ZXIsIHByaXZhdGVNYXAsICJzZXQiKTsKICAgIHJldHVybiBfY2xhc3NfYXBwbHlfZGVzY3JpcHRvcl9kZXN0cnVjdHVyZShyZWNlaXZlciwgZGVzY3JpcHRvcik7Cn0KZnVuY3Rpb24gX2NsYXNzX3N0YXRpY19wcml2YXRlX2ZpZWxkX2Rlc3RydWN0dXJlKHJlY2VpdmVyLCBjbGFzc0NvbnN0cnVjdG9yLCBkZXNjcmlwdG9yKSB7CiAgICBfY2xhc3NfY2hlY2tfcHJpdmF0ZV9zdGF0aWNfYWNjZXNzKHJlY2VpdmVyLCBjbGFzc0NvbnN0cnVjdG9yKTsKICAgIF9jbGFzc19jaGVja19wcml2YXRlX3N0YXRpY19maWVsZF9kZXNjcmlwdG9yKGRlc2NyaXB0b3IsICJzZXQiKTsKICAgIHJldHVybiBfY2xhc3NfYXBwbHlfZGVzY3JpcHRvcl9kZXN0cnVjdHVyZShyZWNlaXZlciwgZGVzY3JpcHRvcik7Cn0KZnVuY3Rpb24gX2NsYXNzX3N0YXRpY19wcml2YXRlX21ldGhvZF9nZXQocmVjZWl2ZXIsIGNsYXNzQ29uc3RydWN0b3IsIG1ldGhvZCkgewogICAgX2NsYXNzX2NoZWNrX3ByaXZhdGVfc3RhdGljX2FjY2VzcyhyZWNlaXZlciwgY2xhc3NDb25zdHJ1Y3Rvcik7CiAgICByZXR1cm4gbWV0aG9kOwp9CmZ1bmN0aW9uIF9jbGFzc19jaGVja19wcml2YXRlX3N0YXRpY19hY2Nlc3MocmVjZWl2ZXIsIGNsYXNzQ29uc3RydWN0b3IpIHsKICAgIGlmIChyZWNlaXZlciAhPT0gY2xhc3NDb25zdHJ1Y3RvcikgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIlByaXZhdGUgc3RhdGljIGFjY2VzcyBvZiB3cm9uZyBwcm92ZW5hbmNlIik7CiAgICB9Cn0KZnVuY3Rpb24gX2lzX25hdGl2ZV9yZWZsZWN0X2NvbnN0cnVjdCgpIHsKICAgIC8vIFNpbmNlIFJlZmxlY3QuY29uc3RydWN0IGNhbid0IGJlIHByb3Blcmx5IHBvbHlmaWxsZWQsIHNvbWUKICAgIC8vIGltcGxlbWVudGF0aW9ucyAoZS5nLiBjb3JlLWpzQDIpIGRvbid0IHNldCB0aGUgY29ycmVjdCBpbnRlcm5hbCBzbG90cy4KICAgIC8vIFRob3NlIHBvbHlmaWxscyBkb24ndCBhbGxvdyB1cyB0byBzdWJjbGFzcyBidWlsdC1pbnMsIHNvIHdlIG5lZWQgdG8KICAgIC8vIHVzZSBvdXIgZmFsbGJhY2sgaW1wbGVtZW50YXRpb24uCiAgICB0cnkgewogICAgICAgIC8vIElmIHRoZSBpbnRlcm5hbCBzbG90cyBhcmVuJ3Qgc2V0LCB0aGlzIHRocm93cyBhbiBlcnJvciBzaW1pbGFyIHRvCiAgICAgICAgLy8gICBUeXBlRXJyb3I6IHRoaXMgaXMgbm90IGEgQm9vbGVhbiBvYmplY3QuCiAgICAgICAgdmFyIHJlc3VsdCA9ICFCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoQm9vbGVhbiwgW10sIGZ1bmN0aW9uKCkge30pKTsKICAgIH0gY2F0Y2ggKF8pIHt9CiAgICByZXR1cm4gKF9pc19uYXRpdmVfcmVmbGVjdF9jb25zdHJ1Y3QgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gISFyZXN1bHQ7CiAgICB9KSgpOwp9CmZ1bmN0aW9uIF9jcmVhdGVfc3VwZXIoRGVyaXZlZCkgewogICAgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNfbmF0aXZlX3JlZmxlY3RfY29uc3RydWN0KCk7CiAgICByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7CiAgICAgICAgdmFyIFN1cGVyID0gX2dldF9wcm90b3R5cGVfb2YoRGVyaXZlZCksIHJlc3VsdDsKICAgICAgICBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgewogICAgICAgICAgICB2YXIgTmV3VGFyZ2V0ID0gX2dldF9wcm90b3R5cGVfb2YodGhpcykuY29uc3RydWN0b3I7CiAgICAgICAgICAgIHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9wb3NzaWJsZV9jb25zdHJ1Y3Rvcl9yZXR1cm4odGhpcywgcmVzdWx0KTsKICAgIH07Cn0KZnVuY3Rpb24gX2NyZWF0ZV9mb3Jfb2ZfaXRlcmF0b3JfaGVscGVyX2xvb3NlKG8sIGFsbG93QXJyYXlMaWtlKSB7CiAgICB2YXIgaXQgPSB0eXBlb2YgU3ltYm9sICE9PSAidW5kZWZpbmVkIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl0gfHwgb1siQEBpdGVyYXRvciJdOwogICAgaWYgKGl0KSByZXR1cm4gKGl0ID0gaXQuY2FsbChvKSkubmV4dC5iaW5kKGl0KTsKICAgIC8vIEZhbGxiYWNrIGZvciBlbmdpbmVzIHdpdGhvdXQgc3ltYm9sIHN1cHBvcnQKICAgIGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IF91bnN1cHBvcnRlZF9pdGVyYWJsZV90b19hcnJheShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09ICJudW1iZXIiKSB7CiAgICAgICAgaWYgKGl0KSBvID0gaXQ7CiAgICAgICAgdmFyIGkgPSAwOwogICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgaWYgKGkgPj0gby5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OwogICAgICAgIH07CiAgICB9CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKAogICAgICAgICJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIKICAgICk7Cn0KZnVuY3Rpb24gX3RzX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7CiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkOwogICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSAib2JqZWN0IiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gImZ1bmN0aW9uIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpOwogICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjsKICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7Cn1mdW5jdGlvbiBfdHNfZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHsKICAgIHZhciBmLCB5LCB0LCBnLCBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24gKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9OwogICAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksICJ0aHJvdyI6IHZlcmIoMSksICJyZXR1cm4iOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0pLCBnOwogICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9CiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7CiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy4iKTsKICAgICAgICB3aGlsZSAoXykgdHJ5IHsKICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVsicmV0dXJuIl0gOiBvcFswXSA/IHlbInRocm93Il0gfHwgKCh0ID0geVsicmV0dXJuIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0OwogICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07CiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHsKICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTsKICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTsKICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH0KICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH0KICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpOwogICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7CiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfQogICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9OwogICAgfQp9ZnVuY3Rpb24gX3RzX21ldGFkYXRhKGssIHYpIHsKICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gIm9iamVjdCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09ICJmdW5jdGlvbiIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKGssIHYpOwp9ZnVuY3Rpb24gX3RzX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikgewogICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9Cn1mdW5jdGlvbiBfdHNfdmFsdWVzKG8pIHsKICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwOwogICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7CiAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09ICJudW1iZXIiKSByZXR1cm4gewogICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDsKICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9OwogICAgICAgIH0KICAgIH07CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyAiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS4iIDogIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC4iKTsKfWZ1bmN0aW9uIF90c19hZGRfZGlzcG9zYWJsZV9yZXNvdXJjZShlbnYsIHZhbHVlLCBhc3luYykgewogICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDApIHsKICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAib2JqZWN0IiAmJiB0eXBlb2YgdmFsdWUgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBleHBlY3RlZC4iKTsKICAgICAgICB2YXIgZGlzcG9zZSwgaW5uZXI7CiAgICAgICAgaWYgKGFzeW5jKSB7CiAgICAgICAgICAgIGlmICghU3ltYm9sLmFzeW5jRGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiU3ltYm9sLmFzeW5jRGlzcG9zZSBpcyBub3QgZGVmaW5lZC4iKTsKICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdOwogICAgICAgIH0KICAgICAgICBpZiAoZGlzcG9zZSA9PT0gdm9pZCAwKSB7CiAgICAgICAgICAgIGlmICghU3ltYm9sLmRpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbC5kaXNwb3NlIGlzIG5vdCBkZWZpbmVkLiIpOwogICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmRpc3Bvc2VdOwogICAgICAgICAgICBpZiAoYXN5bmMpIGlubmVyID0gZGlzcG9zZTsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGVvZiBkaXNwb3NlICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3Qgbm90IGRpc3Bvc2FibGUuIik7CiAgICAgICAgaWYgKGlubmVyKSBkaXNwb3NlID0gZnVuY3Rpb24gKCkgeyB0cnkgeyBpbm5lci5jYWxsKHRoaXMpOyB9IGNhdGNoIChlKSB7IHJldHVybiBQcm9taXNlLnJlamVjdChlKTsgfSB9OwogICAgICAgIGVudi5zdGFjay5wdXNoKHsgdmFsdWU6IHZhbHVlLCBkaXNwb3NlOiBkaXNwb3NlLCBhc3luYzogYXN5bmMgfSk7CiAgICB9CiAgICBlbHNlIGlmIChhc3luYykgewogICAgICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7CiAgICB9CiAgICByZXR1cm4gdmFsdWU7Cn1mdW5jdGlvbiBfdHNfZGlzcG9zZV9yZXNvdXJjZXMoZW52KSB7CiAgICB2YXIgX1N1cHByZXNzZWRFcnJvciA9IHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09ICJmdW5jdGlvbiIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHsKICAgICAgICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlKTsKICAgICAgICByZXR1cm4gZS5uYW1lID0gIlN1cHByZXNzZWRFcnJvciIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTsKICAgIH07CgoKICAgIHJldHVybiAoX3RzX2Rpc3Bvc2VfcmVzb3VyY2VzID0gZnVuY3Rpb24gX3RzX2Rpc3Bvc2VfcmVzb3VyY2VzKGVudikgewogICAgICAgIGZ1bmN0aW9uIGZhaWwoZSkgewogICAgICAgICAgICBlbnYuZXJyb3IgPSBlbnYuaGFzRXJyb3IgPyBuZXcgX1N1cHByZXNzZWRFcnJvcihlLCBlbnYuZXJyb3IsICJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuIikgOiBlOwogICAgICAgICAgICBlbnYuaGFzRXJyb3IgPSB0cnVlOwogICAgICAgIH0KICAgICAgICB2YXIgciwgcyA9IDA7CiAgICAgICAgZnVuY3Rpb24gbmV4dCgpIHsKICAgICAgICAgICAgd2hpbGUgKHIgPSBlbnYuc3RhY2sucG9wKCkpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFyLmFzeW5jICYmIHMgPT09IDEpIHJldHVybiBzID0gMCwgZW52LnN0YWNrLnB1c2gociksIFByb21pc2UucmVzb2x2ZSgpLnRoZW4obmV4dCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHIuZGlzcG9zZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gci5kaXNwb3NlLmNhbGwoci52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyLmFzeW5jKSByZXR1cm4gcyB8PSAyLCBQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKG5leHQsIGZ1bmN0aW9uIChlKSB7IGZhaWwoZSk7IHJldHVybiBuZXh0KCk7IH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHMgfD0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZmFpbChlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocyA9PT0gMSkgcmV0dXJuIGVudi5oYXNFcnJvciA/IFByb21pc2UucmVqZWN0KGVudi5lcnJvcikgOiBQcm9taXNlLnJlc29sdmUoKTsKICAgICAgICAgICAgaWYgKGVudi5oYXNFcnJvcikgdGhyb3cgZW52LmVycm9yOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV4dCgpOwogICAgfSkoZW52KTsKfS8qIEBtaW5WZXJzaW9uIDcuMjAuMCAqLwoKLyoqCiAgRW51bXMgYXJlIHVzZWQgaW4gdGhpcyBmaWxlLCBidXQgbm90IGFzc2lnbmVkIHRvIHZhcnMgdG8gYXZvaWQgbm9uLWhvaXN0YWJsZSB2YWx1ZXMKCiAgQ09OU1RSVUNUT1IgPSAwOwogIFBVQkxJQyA9IDE7CiAgUFJJVkFURSA9IDI7CgogIEZJRUxEID0gMDsKICBBQ0NFU1NPUiA9IDE7CiAgTUVUSE9EID0gMjsKICBHRVRURVIgPSAzOwogIFNFVFRFUiA9IDQ7CgogIFNUQVRJQyA9IDU7CgogIENMQVNTID0gMTA7IC8vIG9ubHkgdXNlZCBpbiBhc3NlcnRWYWxpZFJldHVyblZhbHVlCiovCgpmdW5jdGlvbiBhcHBseURlY3MyMjAzUkZhY3RvcnkoKSB7CiAgICBmdW5jdGlvbiBjcmVhdGVBZGRJbml0aWFsaXplck1ldGhvZChpbml0aWFsaXplcnMsIGRlY29yYXRvckZpbmlzaGVkUmVmKSB7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGFkZEluaXRpYWxpemVyKGluaXRpYWxpemVyKSB7CiAgICAgICAgICAgIGFzc2VydE5vdEZpbmlzaGVkKGRlY29yYXRvckZpbmlzaGVkUmVmLCAiYWRkSW5pdGlhbGl6ZXIiKTsKICAgICAgICAgICAgYXNzZXJ0Q2FsbGFibGUoaW5pdGlhbGl6ZXIsICJBbiBpbml0aWFsaXplciIpOwogICAgICAgICAgICBpbml0aWFsaXplcnMucHVzaChpbml0aWFsaXplcik7CiAgICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBtZW1iZXJEZWMoCiAgICAgICAgZGVjLAogICAgICAgIG5hbWUsCiAgICAgICAgZGVzYywKICAgICAgICBpbml0aWFsaXplcnMsCiAgICAgICAga2luZCwKICAgICAgICBpc1N0YXRpYywKICAgICAgICBpc1ByaXZhdGUsCiAgICAgICAgbWV0YWRhdGEsCiAgICAgICAgdmFsdWUKICAgICkgewogICAgICAgIHZhciBraW5kU3RyOwoKICAgICAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgICAgICAgY2FzZSAxIC8qIEFDQ0VTU09SICovOgogICAgICAgICAgICAgICAga2luZFN0ciA9ICJhY2Nlc3NvciI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAyIC8qIE1FVEhPRCAqLzoKICAgICAgICAgICAgICAgIGtpbmRTdHIgPSAibWV0aG9kIjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDMgLyogR0VUVEVSICovOgogICAgICAgICAgICAgICAga2luZFN0ciA9ICJnZXR0ZXIiOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgNCAvKiBTRVRURVIgKi86CiAgICAgICAgICAgICAgICBraW5kU3RyID0gInNldHRlciI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIGtpbmRTdHIgPSAiZmllbGQiOwogICAgICAgIH0KCiAgICAgICAgdmFyIGN0eCA9IHsKICAgICAgICAgICAga2luZDoga2luZFN0ciwKICAgICAgICAgICAgbmFtZTogaXNQcml2YXRlID8gIiMiICsgbmFtZSA6IG5hbWUsCiAgICAgICAgICAgIHN0YXRpYzogaXNTdGF0aWMsCiAgICAgICAgICAgIHByaXZhdGU6IGlzUHJpdmF0ZSwKICAgICAgICAgICAgbWV0YWRhdGE6IG1ldGFkYXRhLAogICAgICAgIH07CgogICAgICAgIHZhciBkZWNvcmF0b3JGaW5pc2hlZFJlZiA9IHsgdjogZmFsc2UgfTsKCiAgICAgICAgY3R4LmFkZEluaXRpYWxpemVyID0gY3JlYXRlQWRkSW5pdGlhbGl6ZXJNZXRob2QoCiAgICAgICAgICAgIGluaXRpYWxpemVycywKICAgICAgICAgICAgZGVjb3JhdG9yRmluaXNoZWRSZWYKICAgICAgICApOwoKICAgICAgICB2YXIgZ2V0LCBzZXQ7CiAgICAgICAgaWYgKGtpbmQgPT09IDAgLyogRklFTEQgKi8pIHsKICAgICAgICAgICAgaWYgKGlzUHJpdmF0ZSkgewogICAgICAgICAgICAgICAgZ2V0ID0gZGVzYy5nZXQ7CiAgICAgICAgICAgICAgICBzZXQgPSBkZXNjLnNldDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGdldCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1tuYW1lXTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBzZXQgPSBmdW5jdGlvbiAodikgewogICAgICAgICAgICAgICAgICAgIHRoaXNbbmFtZV0gPSB2OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoa2luZCA9PT0gMiAvKiBNRVRIT0QgKi8pIHsKICAgICAgICAgICAgZ2V0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGRlc2MudmFsdWU7CiAgICAgICAgICAgIH07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gcmVwbGFjZSB3aXRoIHZhbHVlcyB0aGF0IHdpbGwgZ28gdGhyb3VnaCB0aGUgZmluYWwgZ2V0dGVyIGFuZCBzZXR0ZXIKICAgICAgICAgICAgaWYgKGtpbmQgPT09IDEgLyogQUNDRVNTT1IgKi8gfHwga2luZCA9PT0gMyAvKiBHRVRURVIgKi8pIHsKICAgICAgICAgICAgICAgIGdldCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVzYy5nZXQuY2FsbCh0aGlzKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChraW5kID09PSAxIC8qIEFDQ0VTU09SICovIHx8IGtpbmQgPT09IDQgLyogU0VUVEVSICovKSB7CiAgICAgICAgICAgICAgICBzZXQgPSBmdW5jdGlvbiAodikgewogICAgICAgICAgICAgICAgICAgIGRlc2Muc2V0LmNhbGwodGhpcywgdik7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGN0eC5hY2Nlc3MgPQogICAgICAgICAgICBnZXQgJiYgc2V0ID8geyBnZXQ6IGdldCwgc2V0OiBzZXQgfSA6IGdldCA/IHsgZ2V0OiBnZXQgfSA6IHsgc2V0OiBzZXQgfTsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcmV0dXJuIGRlYyh2YWx1ZSwgY3R4KTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICBkZWNvcmF0b3JGaW5pc2hlZFJlZi52ID0gdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gYXNzZXJ0Tm90RmluaXNoZWQoZGVjb3JhdG9yRmluaXNoZWRSZWYsIGZuTmFtZSkgewogICAgICAgIGlmIChkZWNvcmF0b3JGaW5pc2hlZFJlZi52KSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAgICAgICAgICJhdHRlbXB0ZWQgdG8gY2FsbCAiICsgZm5OYW1lICsgIiBhZnRlciBkZWNvcmF0aW9uIHdhcyBmaW5pc2hlZCIKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gYXNzZXJ0Q2FsbGFibGUoZm4sIGhpbnQpIHsKICAgICAgICBpZiAodHlwZW9mIGZuICE9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoaGludCArICIgbXVzdCBiZSBhIGZ1bmN0aW9uIik7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGFzc2VydFZhbGlkUmV0dXJuVmFsdWUoa2luZCwgdmFsdWUpIHsKICAgICAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTsKCiAgICAgICAgaWYgKGtpbmQgPT09IDEgLyogQUNDRVNTT1IgKi8pIHsKICAgICAgICAgICAgaWYgKHR5cGUgIT09ICJvYmplY3QiIHx8IHZhbHVlID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKAogICAgICAgICAgICAgICAgICAgICJhY2Nlc3NvciBkZWNvcmF0b3JzIG11c3QgcmV0dXJuIGFuIG9iamVjdCB3aXRoIGdldCwgc2V0LCBvciBpbml0IHByb3BlcnRpZXMgb3Igdm9pZCAwIgogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodmFsdWUuZ2V0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIGFzc2VydENhbGxhYmxlKHZhbHVlLmdldCwgImFjY2Vzc29yLmdldCIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh2YWx1ZS5zZXQgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgYXNzZXJ0Q2FsbGFibGUodmFsdWUuc2V0LCAiYWNjZXNzb3Iuc2V0Iik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHZhbHVlLmluaXQgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgYXNzZXJ0Q2FsbGFibGUodmFsdWUuaW5pdCwgImFjY2Vzc29yLmluaXQiKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodHlwZSAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICB2YXIgaGludDsKICAgICAgICAgICAgaWYgKGtpbmQgPT09IDAgLyogRklFTEQgKi8pIHsKICAgICAgICAgICAgICAgIGhpbnQgPSAiZmllbGQiOwogICAgICAgICAgICB9IGVsc2UgaWYgKGtpbmQgPT09IDEwIC8qIENMQVNTICovKSB7CiAgICAgICAgICAgICAgICBoaW50ID0gImNsYXNzIjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGhpbnQgPSAibWV0aG9kIjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKAogICAgICAgICAgICAgICAgaGludCArICIgZGVjb3JhdG9ycyBtdXN0IHJldHVybiBhIGZ1bmN0aW9uIG9yIHZvaWQgMCIKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gYXBwbHlNZW1iZXJEZWMoCiAgICAgICAgcmV0LAogICAgICAgIGJhc2UsCiAgICAgICAgZGVjSW5mbywKICAgICAgICBuYW1lLAogICAgICAgIGtpbmQsCiAgICAgICAgaXNTdGF0aWMsCiAgICAgICAgaXNQcml2YXRlLAogICAgICAgIGluaXRpYWxpemVycywKICAgICAgICBtZXRhZGF0YQogICAgKSB7CiAgICAgICAgdmFyIGRlY3MgPSBkZWNJbmZvWzBdOwoKICAgICAgICB2YXIgZGVzYywgaW5pdCwgdmFsdWU7CgogICAgICAgIGlmIChpc1ByaXZhdGUpIHsKICAgICAgICAgICAgaWYgKGtpbmQgPT09IDAgLyogRklFTEQgKi8gfHwga2luZCA9PT0gMSAvKiBBQ0NFU1NPUiAqLykgewogICAgICAgICAgICAgICAgZGVzYyA9IHsKICAgICAgICAgICAgICAgICAgICBnZXQ6IGRlY0luZm9bM10sCiAgICAgICAgICAgICAgICAgICAgc2V0OiBkZWNJbmZvWzRdLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSBlbHNlIGlmIChraW5kID09PSAzIC8qIEdFVFRFUiAqLykgewogICAgICAgICAgICAgICAgZGVzYyA9IHsKICAgICAgICAgICAgICAgICAgICBnZXQ6IGRlY0luZm9bM10sCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9IGVsc2UgaWYgKGtpbmQgPT09IDQgLyogU0VUVEVSICovKSB7CiAgICAgICAgICAgICAgICBkZXNjID0gewogICAgICAgICAgICAgICAgICAgIHNldDogZGVjSW5mb1szXSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkZXNjID0gewogICAgICAgICAgICAgICAgICAgIHZhbHVlOiBkZWNJbmZvWzNdLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoa2luZCAhPT0gMCAvKiBGSUVMRCAqLykgewogICAgICAgICAgICBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihiYXNlLCBuYW1lKTsKICAgICAgICB9CgogICAgICAgIGlmIChraW5kID09PSAxIC8qIEFDQ0VTU09SICovKSB7CiAgICAgICAgICAgIHZhbHVlID0gewogICAgICAgICAgICAgICAgZ2V0OiBkZXNjLmdldCwKICAgICAgICAgICAgICAgIHNldDogZGVzYy5zZXQsCiAgICAgICAgICAgIH07CiAgICAgICAgfSBlbHNlIGlmIChraW5kID09PSAyIC8qIE1FVEhPRCAqLykgewogICAgICAgICAgICB2YWx1ZSA9IGRlc2MudmFsdWU7CiAgICAgICAgfSBlbHNlIGlmIChraW5kID09PSAzIC8qIEdFVFRFUiAqLykgewogICAgICAgICAgICB2YWx1ZSA9IGRlc2MuZ2V0OwogICAgICAgIH0gZWxzZSBpZiAoa2luZCA9PT0gNCAvKiBTRVRURVIgKi8pIHsKICAgICAgICAgICAgdmFsdWUgPSBkZXNjLnNldDsKICAgICAgICB9CgogICAgICAgIHZhciBuZXdWYWx1ZSwgZ2V0LCBzZXQ7CgogICAgICAgIGlmICh0eXBlb2YgZGVjcyA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICBuZXdWYWx1ZSA9IG1lbWJlckRlYygKICAgICAgICAgICAgICAgIGRlY3MsCiAgICAgICAgICAgICAgICBuYW1lLAogICAgICAgICAgICAgICAgZGVzYywKICAgICAgICAgICAgICAgIGluaXRpYWxpemVycywKICAgICAgICAgICAgICAgIGtpbmQsCiAgICAgICAgICAgICAgICBpc1N0YXRpYywKICAgICAgICAgICAgICAgIGlzUHJpdmF0ZSwKICAgICAgICAgICAgICAgIG1ldGFkYXRhLAogICAgICAgICAgICAgICAgdmFsdWUKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmIChuZXdWYWx1ZSAhPT0gdm9pZCAwKSB7CiAgICAgICAgICAgICAgICBhc3NlcnRWYWxpZFJldHVyblZhbHVlKGtpbmQsIG5ld1ZhbHVlKTsKCiAgICAgICAgICAgICAgICBpZiAoa2luZCA9PT0gMCAvKiBGSUVMRCAqLykgewogICAgICAgICAgICAgICAgICAgIGluaXQgPSBuZXdWYWx1ZTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2luZCA9PT0gMSAvKiBBQ0NFU1NPUiAqLykgewogICAgICAgICAgICAgICAgICAgIGluaXQgPSBuZXdWYWx1ZS5pbml0OwogICAgICAgICAgICAgICAgICAgIGdldCA9IG5ld1ZhbHVlLmdldCB8fCB2YWx1ZS5nZXQ7CiAgICAgICAgICAgICAgICAgICAgc2V0ID0gbmV3VmFsdWUuc2V0IHx8IHZhbHVlLnNldDsKCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB7IGdldDogZ2V0LCBzZXQ6IHNldCB9OwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG5ld1ZhbHVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IGRlY3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgICAgIHZhciBkZWMgPSBkZWNzW2ldOwoKICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gbWVtYmVyRGVjKAogICAgICAgICAgICAgICAgICAgIGRlYywKICAgICAgICAgICAgICAgICAgICBuYW1lLAogICAgICAgICAgICAgICAgICAgIGRlc2MsCiAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZXJzLAogICAgICAgICAgICAgICAgICAgIGtpbmQsCiAgICAgICAgICAgICAgICAgICAgaXNTdGF0aWMsCiAgICAgICAgICAgICAgICAgICAgaXNQcml2YXRlLAogICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLAogICAgICAgICAgICAgICAgICAgIHZhbHVlCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmIChuZXdWYWx1ZSAhPT0gdm9pZCAwKSB7CiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VmFsaWRSZXR1cm5WYWx1ZShraW5kLCBuZXdWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0luaXQ7CgogICAgICAgICAgICAgICAgICAgIGlmIChraW5kID09PSAwIC8qIEZJRUxEICovKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0luaXQgPSBuZXdWYWx1ZTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtpbmQgPT09IDEgLyogQUNDRVNTT1IgKi8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3SW5pdCA9IG5ld1ZhbHVlLmluaXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGdldCA9IG5ld1ZhbHVlLmdldCB8fCB2YWx1ZS5nZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldCA9IG5ld1ZhbHVlLnNldCB8fCB2YWx1ZS5zZXQ7CgogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHsgZ2V0OiBnZXQsIHNldDogc2V0IH07CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBuZXdWYWx1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmIChuZXdJbml0ICE9PSB2b2lkIDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluaXQgPT09IHZvaWQgMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCA9IG5ld0luaXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGluaXQgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQgPSBbaW5pdCwgbmV3SW5pdF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0LnB1c2gobmV3SW5pdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChraW5kID09PSAwIC8qIEZJRUxEICovIHx8IGtpbmQgPT09IDEgLyogQUNDRVNTT1IgKi8pIHsKICAgICAgICAgICAgaWYgKGluaXQgPT09IHZvaWQgMCkgewogICAgICAgICAgICAgICAgLy8gSWYgdGhlIGluaXRpYWxpemVyIHdhcyB2b2lkIDAsIHN1YiBpbiBhIGR1bW15IGluaXRpYWxpemVyCiAgICAgICAgICAgICAgICBpbml0ID0gZnVuY3Rpb24gKGluc3RhbmNlLCBpbml0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluaXQ7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbml0ICE9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICB2YXIgb3duSW5pdGlhbGl6ZXJzID0gaW5pdDsKCiAgICAgICAgICAgICAgICBpbml0ID0gZnVuY3Rpb24gKGluc3RhbmNlLCBpbml0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gaW5pdDsKCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvd25Jbml0aWFsaXplcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBvd25Jbml0aWFsaXplcnNbaV0uY2FsbChpbnN0YW5jZSwgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciBvcmlnaW5hbEluaXRpYWxpemVyID0gaW5pdDsKCiAgICAgICAgICAgICAgICBpbml0ID0gZnVuY3Rpb24gKGluc3RhbmNlLCBpbml0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsSW5pdGlhbGl6ZXIuY2FsbChpbnN0YW5jZSwgaW5pdCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXQucHVzaChpbml0KTsKICAgICAgICB9CgogICAgICAgIGlmIChraW5kICE9PSAwIC8qIEZJRUxEICovKSB7CiAgICAgICAgICAgIGlmIChraW5kID09PSAxIC8qIEFDQ0VTU09SICovKSB7CiAgICAgICAgICAgICAgICBkZXNjLmdldCA9IHZhbHVlLmdldDsKICAgICAgICAgICAgICAgIGRlc2Muc2V0ID0gdmFsdWUuc2V0OwogICAgICAgICAgICB9IGVsc2UgaWYgKGtpbmQgPT09IDIgLyogTUVUSE9EICovKSB7CiAgICAgICAgICAgICAgICBkZXNjLnZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoa2luZCA9PT0gMyAvKiBHRVRURVIgKi8pIHsKICAgICAgICAgICAgICAgIGRlc2MuZ2V0ID0gdmFsdWU7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoa2luZCA9PT0gNCAvKiBTRVRURVIgKi8pIHsKICAgICAgICAgICAgICAgIGRlc2Muc2V0ID0gdmFsdWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChpc1ByaXZhdGUpIHsKICAgICAgICAgICAgICAgIGlmIChraW5kID09PSAxIC8qIEFDQ0VTU09SICovKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goZnVuY3Rpb24gKGluc3RhbmNlLCBhcmdzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5nZXQuY2FsbChpbnN0YW5jZSwgYXJncyk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goZnVuY3Rpb24gKGluc3RhbmNlLCBhcmdzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5zZXQuY2FsbChpbnN0YW5jZSwgYXJncyk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtpbmQgPT09IDIgLyogTUVUSE9EICovKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2godmFsdWUpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXQucHVzaChmdW5jdGlvbiAoaW5zdGFuY2UsIGFyZ3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmNhbGwoaW5zdGFuY2UsIGFyZ3MpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGJhc2UsIG5hbWUsIGRlc2MpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGFwcGx5TWVtYmVyRGVjcyhDbGFzcywgZGVjSW5mb3MsIG1ldGFkYXRhKSB7CiAgICAgICAgdmFyIHJldCA9IFtdOwogICAgICAgIHZhciBwcm90b0luaXRpYWxpemVyczsKICAgICAgICB2YXIgc3RhdGljSW5pdGlhbGl6ZXJzOwoKICAgICAgICB2YXIgZXhpc3RpbmdQcm90b05vbkZpZWxkcyA9IG5ldyBNYXAoKTsKICAgICAgICB2YXIgZXhpc3RpbmdTdGF0aWNOb25GaWVsZHMgPSBuZXcgTWFwKCk7CgogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVjSW5mb3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIGRlY0luZm8gPSBkZWNJbmZvc1tpXTsKCiAgICAgICAgICAgIC8vIHNraXAgY29tcHV0ZWQgcHJvcGVydHkgbmFtZXMKICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGRlY0luZm8pKSBjb250aW51ZTsKCiAgICAgICAgICAgIHZhciBraW5kID0gZGVjSW5mb1sxXTsKICAgICAgICAgICAgdmFyIG5hbWUgPSBkZWNJbmZvWzJdOwogICAgICAgICAgICB2YXIgaXNQcml2YXRlID0gZGVjSW5mby5sZW5ndGggPiAzOwoKICAgICAgICAgICAgdmFyIGlzU3RhdGljID0ga2luZCA+PSA1OyAvKiBTVEFUSUMgKi8KICAgICAgICAgICAgdmFyIGJhc2U7CiAgICAgICAgICAgIHZhciBpbml0aWFsaXplcnM7CgogICAgICAgICAgICBpZiAoaXNTdGF0aWMpIHsKICAgICAgICAgICAgICAgIGJhc2UgPSBDbGFzczsKICAgICAgICAgICAgICAgIGtpbmQgPSBraW5kIC0gNSAvKiBTVEFUSUMgKi87CiAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplIHN0YXRpY0luaXRpYWxpemVycyB3aGVuIHdlIHNlZSBhIG5vbi1maWVsZCBzdGF0aWMgbWVtYmVyCiAgICAgICAgICAgICAgICBzdGF0aWNJbml0aWFsaXplcnMgPSBzdGF0aWNJbml0aWFsaXplcnMgfHwgW107CiAgICAgICAgICAgICAgICBpbml0aWFsaXplcnMgPSBzdGF0aWNJbml0aWFsaXplcnM7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBiYXNlID0gQ2xhc3MucHJvdG90eXBlOwogICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBwcm90b0luaXRpYWxpemVycyB3aGVuIHdlIHNlZSBhIG5vbi1maWVsZCBtZW1iZXIKICAgICAgICAgICAgICAgIHByb3RvSW5pdGlhbGl6ZXJzID0gcHJvdG9Jbml0aWFsaXplcnMgfHwgW107CiAgICAgICAgICAgICAgICBpbml0aWFsaXplcnMgPSBwcm90b0luaXRpYWxpemVyczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGtpbmQgIT09IDAgLyogRklFTEQgKi8gJiYgIWlzUHJpdmF0ZSkgewogICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nTm9uRmllbGRzID0gaXNTdGF0aWMKICAgICAgICAgICAgICAgICAgICA/IGV4aXN0aW5nU3RhdGljTm9uRmllbGRzCiAgICAgICAgICAgICAgICAgICAgOiBleGlzdGluZ1Byb3RvTm9uRmllbGRzOwoKICAgICAgICAgICAgICAgIHZhciBleGlzdGluZ0tpbmQgPSBleGlzdGluZ05vbkZpZWxkcy5nZXQobmFtZSkgfHwgMDsKCiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdLaW5kID09PSB0cnVlIHx8CiAgICAgICAgICAgICAgICAgICAgKGV4aXN0aW5nS2luZCA9PT0gMyAvKiBHRVRURVIgKi8gJiYga2luZCAhPT0gNCkgLyogU0VUVEVSICovIHx8CiAgICAgICAgICAgICAgICAgICAgKGV4aXN0aW5nS2luZCA9PT0gNCAvKiBTRVRURVIgKi8gJiYga2luZCAhPT0gMykgLyogR0VUVEVSICovCiAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgICJBdHRlbXB0ZWQgdG8gZGVjb3JhdGUgYSBwdWJsaWMgbWV0aG9kL2FjY2Vzc29yIHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgYXMgYSBwcmV2aW91c2x5IGRlY29yYXRlZCBwdWJsaWMgbWV0aG9kL2FjY2Vzc29yLiBUaGlzIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IHRoZSBkZWNvcmF0b3JzIHBsdWdpbi4gUHJvcGVydHkgbmFtZSB3YXM6ICIgKwogICAgICAgICAgICAgICAgICAgICAgICBuYW1lCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWV4aXN0aW5nS2luZCAmJiBraW5kID4gMiAvKiBNRVRIT0QgKi8pIHsKICAgICAgICAgICAgICAgICAgICBleGlzdGluZ05vbkZpZWxkcy5zZXQobmFtZSwga2luZCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nTm9uRmllbGRzLnNldChuYW1lLCB0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgYXBwbHlNZW1iZXJEZWMoCiAgICAgICAgICAgICAgICByZXQsCiAgICAgICAgICAgICAgICBiYXNlLAogICAgICAgICAgICAgICAgZGVjSW5mbywKICAgICAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgICAgICBraW5kLAogICAgICAgICAgICAgICAgaXNTdGF0aWMsCiAgICAgICAgICAgICAgICBpc1ByaXZhdGUsCiAgICAgICAgICAgICAgICBpbml0aWFsaXplcnMsCiAgICAgICAgICAgICAgICBtZXRhZGF0YQogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgcHVzaEluaXRpYWxpemVycyhyZXQsIHByb3RvSW5pdGlhbGl6ZXJzKTsKICAgICAgICBwdXNoSW5pdGlhbGl6ZXJzKHJldCwgc3RhdGljSW5pdGlhbGl6ZXJzKTsKICAgICAgICByZXR1cm4gcmV0OwogICAgfQoKICAgIGZ1bmN0aW9uIHB1c2hJbml0aWFsaXplcnMocmV0LCBpbml0aWFsaXplcnMpIHsKICAgICAgICBpZiAoaW5pdGlhbGl6ZXJzKSB7CiAgICAgICAgICAgIHJldC5wdXNoKGZ1bmN0aW9uIChpbnN0YW5jZSkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplcnNbaV0uY2FsbChpbnN0YW5jZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBhcHBseUNsYXNzRGVjcyh0YXJnZXRDbGFzcywgY2xhc3NEZWNzLCBtZXRhZGF0YSkgewogICAgICAgIGlmIChjbGFzc0RlY3MubGVuZ3RoID4gMCkgewogICAgICAgICAgICB2YXIgaW5pdGlhbGl6ZXJzID0gW107CiAgICAgICAgICAgIHZhciBuZXdDbGFzcyA9IHRhcmdldENsYXNzOwogICAgICAgICAgICB2YXIgbmFtZSA9IHRhcmdldENsYXNzLm5hbWU7CgogICAgICAgICAgICBmb3IgKHZhciBpID0gY2xhc3NEZWNzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgICAgICB2YXIgZGVjb3JhdG9yRmluaXNoZWRSZWYgPSB7IHY6IGZhbHNlIH07CgogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dE5ld0NsYXNzID0gY2xhc3NEZWNzW2ldKG5ld0NsYXNzLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQ6ICJjbGFzcyIsCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIGFkZEluaXRpYWxpemVyOiBjcmVhdGVBZGRJbml0aWFsaXplck1ldGhvZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29yYXRvckZpbmlzaGVkUmVmCiAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLAogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICBkZWNvcmF0b3JGaW5pc2hlZFJlZi52ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAobmV4dE5ld0NsYXNzICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICBhc3NlcnRWYWxpZFJldHVyblZhbHVlKDEwIC8qIENMQVNTICovLCBuZXh0TmV3Q2xhc3MpOwogICAgICAgICAgICAgICAgICAgIG5ld0NsYXNzID0gbmV4dE5ld0NsYXNzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAgICAgZGVmaW5lTWV0YWRhdGEobmV3Q2xhc3MsIG1ldGFkYXRhKSwKICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplcnNbaV0uY2FsbChuZXdDbGFzcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXTsKICAgICAgICB9CiAgICAgICAgLy8gVGhlIHRyYW5zZm9ybWVyIHdpbGwgbm90IGVtaXQgYXNzaWdubWVudCB3aGVuIHRoZXJlIGFyZSBubyBjbGFzcyBkZWNvcmF0b3JzLAogICAgICAgIC8vIHNvIHdlIGRvbid0IGhhdmUgdG8gcmV0dXJuIGFuIGVtcHR5IGFycmF5IGhlcmUuCiAgICB9CgogICAgZnVuY3Rpb24gZGVmaW5lTWV0YWRhdGEoQ2xhc3MsIG1ldGFkYXRhKSB7CiAgICAgICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSgKICAgICAgICAgICAgQ2xhc3MsCiAgICAgICAgICAgIFN5bWJvbC5tZXRhZGF0YSB8fCBTeW1ib2wuZm9yKCJTeW1ib2wubWV0YWRhdGEiKSwKICAgICAgICAgICAgeyBjb25maWd1cmFibGU6IHRydWUsIGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiBtZXRhZGF0YSB9CiAgICAgICAgKTsKICAgIH0KCiAgICAvKioKICAgIEJhc2ljIHVzYWdlOgogIAogICAgYXBwbHlEZWNzKAogICAgICBDbGFzcywKICAgICAgWwogICAgICAgIC8vIG1lbWJlciBkZWNvcmF0b3JzCiAgICAgICAgWwogICAgICAgICAgZGVjLCAgICAgICAgICAgICAgICAvLyBkZWMgb3IgYXJyYXkgb2YgZGVjcwogICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAvLyBraW5kIG9mIHZhbHVlIGJlaW5nIGRlY29yYXRlZAogICAgICAgICAgJ3Byb3AnLCAgICAgICAgICAgICAvLyBuYW1lIG9mIHB1YmxpYyBwcm9wIG9uIGNsYXNzIGNvbnRhaW5pbmcgdGhlIHZhbHVlIGJlaW5nIGRlY29yYXRlZCwKICAgICAgICAgICcjcCcsICAgICAgICAgICAgICAgLy8gdGhlIG5hbWUgb2YgdGhlIHByaXZhdGUgcHJvcGVydHkgKGlmIGlzIHByaXZhdGUsIHZvaWQgMCBvdGhlcndpc2UpLAogICAgICAgIF0KICAgICAgXSwKICAgICAgWwogICAgICAgIC8vIGNsYXNzIGRlY29yYXRvcnMKICAgICAgICBkZWMxLCBkZWMyCiAgICAgIF0KICAgICkKICAgIGBgYAogIAogICAgRnVsbHkgdHJhbnNwaWxlZCBleGFtcGxlOgogIAogICAgYGBganMKICAgIEBkZWMKICAgIGNsYXNzIENsYXNzIHsKICAgICAgQGRlYwogICAgICBhID0gMTIzOwogIAogICAgICBAZGVjCiAgICAgICNhID0gMTIzOwogIAogICAgICBAZGVjCiAgICAgIEBkZWMyCiAgICAgIGFjY2Vzc29yIGIgPSAxMjM7CiAgCiAgICAgIEBkZWMKICAgICAgYWNjZXNzb3IgI2IgPSAxMjM7CiAgCiAgICAgIEBkZWMKICAgICAgYygpIHsgY29uc29sZS5sb2coJ2MnKTsgfQogIAogICAgICBAZGVjCiAgICAgICNjKCkgeyBjb25zb2xlLmxvZygncHJpdkMnKTsgfQogIAogICAgICBAZGVjCiAgICAgIGdldCBkKCkgeyBjb25zb2xlLmxvZygnZCcpOyB9CiAgCiAgICAgIEBkZWMKICAgICAgZ2V0ICNkKCkgeyBjb25zb2xlLmxvZygncHJpdkQnKTsgfQogIAogICAgICBAZGVjCiAgICAgIHNldCBlKHYpIHsgY29uc29sZS5sb2coJ2UnKTsgfQogIAogICAgICBAZGVjCiAgICAgIHNldCAjZSh2KSB7IGNvbnNvbGUubG9nKCdwcml2RScpOyB9CiAgICB9CiAgCiAgCiAgICAvLyBiZWNvbWVzCiAgICBsZXQgaW5pdGlhbGl6ZUluc3RhbmNlOwogICAgbGV0IGluaXRpYWxpemVDbGFzczsKICAKICAgIGxldCBpbml0QTsKICAgIGxldCBpbml0UHJpdkE7CiAgCiAgICBsZXQgaW5pdEI7CiAgICBsZXQgaW5pdFByaXZCLCBnZXRQcml2Qiwgc2V0UHJpdkI7CiAgCiAgICBsZXQgcHJpdkM7CiAgICBsZXQgcHJpdkQ7CiAgICBsZXQgcHJpdkU7CiAgCiAgICBsZXQgQ2xhc3M7CiAgICBjbGFzcyBfQ2xhc3MgewogICAgICBzdGF0aWMgewogICAgICAgIGxldCByZXQgPSBhcHBseURlY3MoCiAgICAgICAgICB0aGlzLAogICAgICAgICAgWwogICAgICAgICAgICBbZGVjLCAwLCAnYSddLAogICAgICAgICAgICBbZGVjLCAwLCAnYScsIChpKSA9PiBpLiNhLCAoaSwgdikgPT4gaS4jYSA9IHZdLAogICAgICAgICAgICBbW2RlYywgZGVjMl0sIDEsICdiJ10sCiAgICAgICAgICAgIFtkZWMsIDEsICdiJywgKGkpID0+IGkuI3ByaXZCRGF0YSwgKGksIHYpID0+IGkuI3ByaXZCRGF0YSA9IHZdLAogICAgICAgICAgICBbZGVjLCAyLCAnYyddLAogICAgICAgICAgICBbZGVjLCAyLCAnYycsICgpID0+IGNvbnNvbGUubG9nKCdwcml2QycpXSwKICAgICAgICAgICAgW2RlYywgMywgJ2QnXSwKICAgICAgICAgICAgW2RlYywgMywgJ2QnLCAoKSA9PiBjb25zb2xlLmxvZygncHJpdkQnKV0sCiAgICAgICAgICAgIFtkZWMsIDQsICdlJ10sCiAgICAgICAgICAgIFtkZWMsIDQsICdlJywgKCkgPT4gY29uc29sZS5sb2coJ3ByaXZFJyldLAogICAgICAgICAgXSwKICAgICAgICAgIFsKICAgICAgICAgICAgZGVjCiAgICAgICAgICBdCiAgICAgICAgKQogIAogICAgICAgIGluaXRBID0gcmV0WzBdOwogIAogICAgICAgIGluaXRQcml2QSA9IHJldFsxXTsKICAKICAgICAgICBpbml0QiA9IHJldFsyXTsKICAKICAgICAgICBpbml0UHJpdkIgPSByZXRbM107CiAgICAgICAgZ2V0UHJpdkIgPSByZXRbNF07CiAgICAgICAgc2V0UHJpdkIgPSByZXRbNV07CiAgCiAgICAgICAgcHJpdkMgPSByZXRbNl07CiAgCiAgICAgICAgcHJpdkQgPSByZXRbN107CiAgCiAgICAgICAgcHJpdkUgPSByZXRbOF07CiAgCiAgICAgICAgaW5pdGlhbGl6ZUluc3RhbmNlID0gcmV0WzldOwogIAogICAgICAgIENsYXNzID0gcmV0WzEwXQogIAogICAgICAgIGluaXRpYWxpemVDbGFzcyA9IHJldFsxMV07CiAgICAgIH0KICAKICAgICAgYSA9IChpbml0aWFsaXplSW5zdGFuY2UodGhpcyksIGluaXRBKHRoaXMsIDEyMykpOwogIAogICAgICAjYSA9IGluaXRQcml2QSh0aGlzLCAxMjMpOwogIAogICAgICAjYkRhdGEgPSBpbml0Qih0aGlzLCAxMjMpOwogICAgICBnZXQgYigpIHsgcmV0dXJuIHRoaXMuI2JEYXRhIH0KICAgICAgc2V0IGIodikgeyB0aGlzLiNiRGF0YSA9IHYgfQogIAogICAgICAjcHJpdkJEYXRhID0gaW5pdFByaXZCKHRoaXMsIDEyMyk7CiAgICAgIGdldCAjYigpIHsgcmV0dXJuIGdldFByaXZCKHRoaXMpOyB9CiAgICAgIHNldCAjYih2KSB7IHNldFByaXZCKHRoaXMsIHYpOyB9CiAgCiAgICAgIGMoKSB7IGNvbnNvbGUubG9nKCdjJyk7IH0KICAKICAgICAgI2MoLi4uYXJncykgeyByZXR1cm4gcHJpdkModGhpcywgLi4uYXJncykgfQogIAogICAgICBnZXQgZCgpIHsgY29uc29sZS5sb2coJ2QnKTsgfQogIAogICAgICBnZXQgI2QoKSB7IHJldHVybiBwcml2RCh0aGlzKTsgfQogIAogICAgICBzZXQgZSh2KSB7IGNvbnNvbGUubG9nKCdlJyk7IH0KICAKICAgICAgc2V0ICNlKHYpIHsgcHJpdkUodGhpcywgdik7IH0KICAgIH0KICAKICAgIGluaXRpYWxpemVDbGFzcyhDbGFzcyk7CiAgICovCgogICAgcmV0dXJuIGZ1bmN0aW9uIGFwcGx5RGVjczIyMDNSKHRhcmdldENsYXNzLCBtZW1iZXJEZWNzLCBjbGFzc0RlY3MsIHBhcmVudENsYXNzKSB7CiAgICAgICAgaWYgKHBhcmVudENsYXNzICE9PSB2b2lkIDApIHsKICAgICAgICAgICAgdmFyIHBhcmVudE1ldGFkYXRhID0KICAgICAgICAgICAgICAgIHBhcmVudENsYXNzW1N5bWJvbC5tZXRhZGF0YSB8fCBTeW1ib2wuZm9yKCJTeW1ib2wubWV0YWRhdGEiKV07CiAgICAgICAgfQogICAgICAgIHZhciBtZXRhZGF0YSA9IE9iamVjdC5jcmVhdGUoCiAgICAgICAgICAgIHBhcmVudE1ldGFkYXRhID09PSB2b2lkIDAgPyBudWxsIDogcGFyZW50TWV0YWRhdGEKICAgICAgICApOwogICAgICAgIHZhciBlID0gYXBwbHlNZW1iZXJEZWNzKHRhcmdldENsYXNzLCBtZW1iZXJEZWNzLCBtZXRhZGF0YSk7CiAgICAgICAgaWYgKCFjbGFzc0RlY3MubGVuZ3RoKSBkZWZpbmVNZXRhZGF0YSh0YXJnZXRDbGFzcywgbWV0YWRhdGEpOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGU6IGUsCiAgICAgICAgICAgIC8vIExhemlseSBhcHBseSBjbGFzcyBkZWNvcmF0aW9ucyBzbyB0aGF0IG1lbWJlciBpbml0IGxvY2FscyBjYW4gYmUgcHJvcGVybHkgYm91bmQuCiAgICAgICAgICAgIGdldCBjKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGFwcGx5Q2xhc3NEZWNzKHRhcmdldENsYXNzLCBjbGFzc0RlY3MsIG1ldGFkYXRhKTsKICAgICAgICAgICAgfSwKICAgICAgICB9OwogICAgfTsKfQoKZnVuY3Rpb24gX2FwcGx5X2RlY3NfMjIwM19yKHRhcmdldENsYXNzLCBtZW1iZXJEZWNzLCBjbGFzc0RlY3MsIHBhcmVudENsYXNzKSB7CiAgICByZXR1cm4gKF9hcHBseV9kZWNzXzIyMDNfciA9IGFwcGx5RGVjczIyMDNSRmFjdG9yeSgpKSgKICAgICAgICB0YXJnZXRDbGFzcywKICAgICAgICBtZW1iZXJEZWNzLAogICAgICAgIGNsYXNzRGVjcywKICAgICAgICBwYXJlbnRDbGFzcwogICAgKTsKfQpmdW5jdGlvbiBfaWRlbnRpdHkoeCkgeyByZXR1cm4geDsgfQovKiBAbWluVmVyc2lvbiA3LjIyLjAgKi8KZnVuY3Rpb24gZGlzcG9zZV9TdXBwcmVzc2VkRXJyb3Ioc3VwcHJlc3NlZCwgZXJyb3IpIHsKICAgIGlmICh0eXBlb2YgU3VwcHJlc3NlZEVycm9yICE9PSAidW5kZWZpbmVkIikgewogICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZgogICAgICAgIGRpc3Bvc2VfU3VwcHJlc3NlZEVycm9yID0gU3VwcHJlc3NlZEVycm9yOwogICAgfSBlbHNlIHsKICAgICAgICBkaXNwb3NlX1N1cHByZXNzZWRFcnJvciA9IGZ1bmN0aW9uIFN1cHByZXNzZWRFcnJvcihzdXBwcmVzc2VkLCBlcnJvcikgewogICAgICAgICAgICB0aGlzLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkOwogICAgICAgICAgICB0aGlzLmVycm9yID0gZXJyb3I7CiAgICAgICAgICAgIHRoaXMuc3RhY2sgPSBuZXcgRXJyb3IoKS5zdGFjazsKICAgICAgICB9OwogICAgICAgIGRpc3Bvc2VfU3VwcHJlc3NlZEVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlLCB7CiAgICAgICAgICAgIGNvbnN0cnVjdG9yOiB7CiAgICAgICAgICAgICAgICB2YWx1ZTogZGlzcG9zZV9TdXBwcmVzc2VkRXJyb3IsCiAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSwKICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgfSwKICAgICAgICB9KTsKICAgIH0KICAgIHJldHVybiBuZXcgZGlzcG9zZV9TdXBwcmVzc2VkRXJyb3Ioc3VwcHJlc3NlZCwgZXJyb3IpOwp9CgpmdW5jdGlvbiBfZGlzcG9zZShzdGFjaywgZXJyb3IsIGhhc0Vycm9yKSB7CiAgICBmdW5jdGlvbiBuZXh0KCkgewogICAgICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICB2YXIgciA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgICAgICAgdmFyIHAgPSByLmQuY2FsbChyLnYpOwogICAgICAgICAgICAgICAgaWYgKHIuYSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZShwKS50aGVuKG5leHQsIGVycik7CiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBlcnIoZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGhhc0Vycm9yKSB0aHJvdyBlcnJvcjsKICAgIH0KCiAgICBmdW5jdGlvbiBlcnIoZSkgewogICAgICAgIGVycm9yID0gaGFzRXJyb3IgPyBuZXcgZGlzcG9zZV9TdXBwcmVzc2VkRXJyb3IoZSwgZXJyb3IpIDogZTsKICAgICAgICBoYXNFcnJvciA9IHRydWU7CgogICAgICAgIHJldHVybiBuZXh0KCk7CiAgICB9CgogICAgcmV0dXJuIG5leHQoKTsKfWZ1bmN0aW9uIF91c2luZyhzdGFjaywgdmFsdWUsIGlzQXdhaXQpIHsKICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdm9pZCAwKSByZXR1cm4gdmFsdWU7CiAgICBpZiAoT2JqZWN0KHZhbHVlKSAhPT0gdmFsdWUpIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJ1c2luZyBkZWNsYXJhdGlvbnMgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIG9iamVjdHMsIGZ1bmN0aW9ucywgbnVsbCwgb3IgdW5kZWZpbmVkLiIpOwogICAgfQogICAgLy8gY29yZS1qcy1wdXJlIHVzZXMgU3ltYm9sLmZvciBmb3IgcG9seWZpbGxpbmcgd2VsbC1rbm93biBzeW1ib2xzCiAgICBpZiAoaXNBd2FpdCkgewogICAgICAgIHZhciBkaXNwb3NlID0KICAgICAgICAgICAgdmFsdWVbU3ltYm9sLmFzeW5jRGlzcG9zZSB8fCBTeW1ib2wuZm9yKCJTeW1ib2wuYXN5bmNEaXNwb3NlIildOwogICAgfQogICAgaWYgKGRpc3Bvc2UgPT09IG51bGwgfHwgZGlzcG9zZSA9PT0gdm9pZCAwKSB7CiAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5kaXNwb3NlIHx8IFN5bWJvbC5mb3IoIlN5bWJvbC5kaXNwb3NlIildOwogICAgfQogICAgaWYgKHR5cGVvZiBkaXNwb3NlICE9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgUHJvcGVydHkgW1N5bWJvbC5kaXNwb3NlXSBpcyBub3QgYSBmdW5jdGlvbi5gKTsKICAgIH0KICAgIHN0YWNrLnB1c2goeyB2OiB2YWx1ZSwgZDogZGlzcG9zZSwgYTogaXNBd2FpdCB9KTsKICAgIHJldHVybiB2YWx1ZTsKfWZ1bmN0aW9uIF91c2luZ19jdHgoKSB7CiAgICB2YXIgX2Rpc3Bvc2VTdXBwcmVzc2VkRXJyb3IgPQogICAgICAgIHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09ICJmdW5jdGlvbiIKICAgICAgICAgICAgPyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWYKICAgICAgICAgICAgU3VwcHJlc3NlZEVycm9yCiAgICAgICAgICAgIDogKGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCkgewogICAgICAgICAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcigpOwogICAgICAgICAgICAgICAgZXJyLm5hbWUgPSAiU3VwcHJlc3NlZEVycm9yIjsKICAgICAgICAgICAgICAgIGVyci5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZDsKICAgICAgICAgICAgICAgIGVyci5lcnJvciA9IGVycm9yOwogICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgfSksCiAgICAgICAgZW1wdHkgPSB7fSwKICAgICAgICBzdGFjayA9IFtdOwogICAgZnVuY3Rpb24gdXNpbmcoaXNBd2FpdCwgdmFsdWUpIHsKICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewogICAgICAgICAgICBpZiAoT2JqZWN0KHZhbHVlKSAhPT0gdmFsdWUpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgInVzaW5nIGRlY2xhcmF0aW9ucyBjYW4gb25seSBiZSB1c2VkIHdpdGggb2JqZWN0cywgZnVuY3Rpb25zLCBudWxsLCBvciB1bmRlZmluZWQuIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gY29yZS1qcy1wdXJlIHVzZXMgU3ltYm9sLmZvciBmb3IgcG9seWZpbGxpbmcgd2VsbC1rbm93biBzeW1ib2xzCiAgICAgICAgICAgIGlmIChpc0F3YWl0KSB7CiAgICAgICAgICAgICAgICB2YXIgZGlzcG9zZSA9CiAgICAgICAgICAgICAgICAgICAgdmFsdWVbU3ltYm9sLmFzeW5jRGlzcG9zZSB8fCBTeW1ib2wuZm9yKCJTeW1ib2wuYXN5bmNEaXNwb3NlIildOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChkaXNwb3NlID09IG51bGwpIHsKICAgICAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuZGlzcG9zZSB8fCBTeW1ib2wuZm9yKCJTeW1ib2wuZGlzcG9zZSIpXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodHlwZW9mIGRpc3Bvc2UgIT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFByb3BlcnR5IFtTeW1ib2wuZGlzcG9zZV0gaXMgbm90IGEgZnVuY3Rpb24uYCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhY2sucHVzaCh7IHY6IHZhbHVlLCBkOiBkaXNwb3NlLCBhOiBpc0F3YWl0IH0pOwogICAgICAgIH0gZWxzZSBpZiAoaXNBd2FpdCkgewogICAgICAgICAgICAvLyBwcm92aWRlIHRoZSBudWxsaXNoIGB2YWx1ZWAgYXMgYGRgIGZvciBtaW5pZmljYXRpb24gZ2FpbgogICAgICAgICAgICBzdGFjay5wdXNoKHsgZDogdmFsdWUsIGE6IGlzQXdhaXQgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB2YWx1ZTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgICAgLy8gZXJyb3IKICAgICAgICBlOiBlbXB0eSwKICAgICAgICAvLyB1c2luZwogICAgICAgIHU6IHVzaW5nLmJpbmQobnVsbCwgZmFsc2UpLAogICAgICAgIC8vIGF3YWl0IHVzaW5nCiAgICAgICAgYTogdXNpbmcuYmluZChudWxsLCB0cnVlKSwKICAgICAgICAvLyBkaXNwb3NlCiAgICAgICAgZDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgZXJyb3IgPSB0aGlzLmU7CgogICAgICAgICAgICBmdW5jdGlvbiBuZXh0KCkgewogICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11c2UtYmVmb3JlLWRlZmluZQogICAgICAgICAgICAgICAgd2hpbGUgKChyZXNvdXJjZSA9IHN0YWNrLnBvcCgpKSkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3Bvc2FsUmVzdWx0ID0gcmVzb3VyY2UuZCAmJiByZXNvdXJjZS5kLmNhbGwocmVzb3VyY2Uudik7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZS5hKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGRpc3Bvc2FsUmVzdWx0KS50aGVuKG5leHQsIGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnIoZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGVycm9yICE9PSBlbXB0eSkgdGhyb3cgZXJyb3I7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZ1bmN0aW9uIGVycihlKSB7CiAgICAgICAgICAgICAgICBlcnJvciA9IGVycm9yICE9PSBlbXB0eSA/IG5ldyBfZGlzcG9zZVN1cHByZXNzZWRFcnJvcihlcnJvciwgZSkgOiBlOwoKICAgICAgICAgICAgICAgIHJldHVybiBuZXh0KCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBuZXh0KCk7CiAgICAgICAgfSwKICAgIH07Cn0vaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9zd2NfZWNtYV90cmFuc2Zvcm1zX2Jhc2UtNi4wLjIvc3JjL3Jlc29sdmVyL21vZC5ycwAAAJ7ZFwB3AAAAtwYAADYAAABjYWxsZWQgZXhwZWN0IG9uIAAAACjaFwARAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvc3djX2VjbWFfYXN0LTUuMC4wL3NyYy9wYXQucnMAAETaFwBiAAAADQAAABQAAAAPBQAABAAAAAQAAAA2AQAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvc3djX2VjbWFfdHJhbnNmb3Jtc19iYXNlLTYuMC4yL3NyYy9maXhlci5yc8jaFwBwAAAAxAAAAEAAAADI2hcAcAAAALECAAAWAAAAyNoXAHAAAAAWBAAAIAAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL2luZGV4bWFwLTIuNC4wL3NyYy9tYXAvY29yZS5ycwBo2xcAYwAAAC0AAAAjAAAAaW5kZXggbm90IGZvdW5kAGjbFwBjAAAAOgAAAAoAAABo2xcAYwAAAFMBAAA9AAAAaNsXAGMAAAA7AgAANAAAAGjbFwBjAAAAPAIAADQAAABo2xcAYwAAALoBAAAsAAAAaNsXAGMAAACwAQAAIgAAAGFzc2VydGlvbiBmYWlsZWQ6IGluZGljZXMuY2FwYWNpdHkoKSAtIGluZGljZXMubGVuKCkgPj0gZW50cmllcy5sZW4oKS9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL2luZGV4bWFwLTIuNC4wL3NyYy9tYXAvY29yZS9yYXcucnOR3BcAZwAAAA4AAAAFAAAAaNsXAGMAAAAlAAAADwAAAAAAAAAMAAAABAAAABAFAAARBQAAEgUAACgAAAAIAAAANAEAAENsYXNzRm5WYXJVc2luZ1RzSW50ZXJmYWNlVHNUeXBlQWxpYXNUc0VudW1Uc01vZHVsZWludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGRlc3RydWN0dXJpbmcgcGF0dGVybiBpbnNpZGUgVHNQYXJhbWV0ZXJQcm9wZXJ0eQAAAG/dFwBaAAAAHN8XAHoAAAA+AQAAIQAAABzfFwB6AAAAPAMAAA0AAACgJBgAKgAAABzfFwB6AAAAywMAAB0AAAAc3xcAegAAAKYDAABAAAAAX2tleRzfFwB6AAAANgQAAFEAAAAc3xcAegAAAEAEAAAnAAAAX2NyZWF0ZVJlcXVpcmVfX3JlcXVpcmVleHBvcnRzY3JlYXRlUmVxdWlyZXVybAAAHN8XAHoAAAAsBQAAGgAAABzfFwB6AAAALgUAABoAAABPbmx5IGFtYmllbnQgbW9kdWxlcyBjYW4gdXNlIHF1b3RlZCBuYW1lcy4AABzfFwB6AAAA2AUAAA4AAABub3QgaW1wbGVtZW50ZWQAyOMXAGQAAACdDAAAPgAAAMjjFwBkAAAAqQwAADwAAADI4xcAZAAAAIoMAAAmAAAAEwUAAAQAAAAEAAAANgEAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3N3Y19lY21hX3RyYW5zZm9ybXNfdHlwZXNjcmlwdC02LjAuMC9zcmMvdHJhbnNmb3JtLnJzAAAc3xcAegAAALoCAAA4AAAASW1wb3J0IGRlY2xhcmF0aW9ucyBpbiBhIG5hbWVzcGFjZSBjYW5ub3QgcmVmZXJlbmNlIGEgbW9kdWxlLkVTTS1zdHlsZSBtb2R1bGUgZGVjbGFyYXRpb25zIGFyZSBub3QgcGVybWl0dGVkIGluIGEgbmFtZXNwYWNlLkltcG9ydCBhc3NpZ25tZW50IGNhbm5vdCBiZSB1c2VkIHdoZW4gdGFyZ2V0aW5nIEVDTUFTY3JpcHQgbW9kdWxlcy4gQ29uc2lkZXIgdXNpbmcgYGltcG9ydCAqIGFzIG5zIGZyb20gIm1vZCJgLCBgaW1wb3J0IHthfSBmcm9tICJtb2QiYCwgYGltcG9ydCBkIGZyb20gIm1vZCJgLCBvciBhbm90aGVyIG1vZHVsZSBmb3JtYXQgaW5zdGVhZC5FeHBvcnQgYXNzaWdubWVudCBjYW5ub3QgYmUgdXNlZCB3aGVuIHRhcmdldGluZyBFQ01BU2NyaXB0IG1vZHVsZXMuIENvbnNpZGVyIHVzaW5nIGBleHBvcnQgZGVmYXVsdGAgb3IgYW5vdGhlciBtb2R1bGUgZm9ybWF0IGluc3RlYWQuL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvc3djX2VjbWFfdHJhbnNmb3Jtc190eXBlc2NyaXB0LTYuMC4wL3NyYy90eXBlc2NyaXB0LnJzAAAAauEXAHsAAAA9AAAALAAAABsDAAAMAAAABAAAAFgDAAAUBQAAHgMAQZjE3wALngMBAAAAHwMAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3N3Y19lY21hX3RyYW5zZm9ybXNfdHlwZXNjcmlwdC02LjAuMC9zcmMvdHNfZW51bS5yc05hTgAg4hcAeAAAAK8AAAASAAAAIOIXAHgAAADZAAAAGgAAABUFAAAEAAAABAAAADYBAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9zd2NfZWNtYV90cmFuc2Zvcm1zX3R5cGVzY3JpcHQtNi4wLjAvc3JjL3N0cmlwX3R5cGUucnMAzOIXAHsAAADJAAAAKQAAAHN0cnVjdCBDb25maWdlbnVtIFRzSW1wb3J0RXhwb3J0QXNzaWduQ29uZmlnZW51bSBJbXBvcnRzTm90VXNlZEFzVmFsdWVzABsDAAAMAAAABAAAAFgDAAAUBQAAHQQAQcDH3wALigQBAAAAHwMAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3N3Y19lY21hX3V0aWxzLTYuMC4wL3NyYy9saWIucnNfAAAAAQAAAAAAAAAs5BcAAQAAAHN1cGVyXwAAQOQXAAYAAAAs5BcAAQAAAGNvbnN0cnVjdG9yIHNob3VsZCBoYXZlIGEgYm9keS9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3N3Y19lY21hX3V0aWxzLTYuMC4wL3NyYy9jb25zdHJ1Y3Rvci5ycwAAduQXAGwAAAAOAAAAIAAAAGNhcGFjaXR5IG92ZXJmbG93AAAA9OQXABEAAAAvcnVzdGMvOTBiMzVhNjIzOWMzZDhiZGFiYzUzMGE2YTA4MTZmN2ZmODlhMGFhZi9saWJyYXJ5L2FsbG9jL3NyYy92ZWMvc3BlY19mcm9tX2l0ZXJfbmVzdGVkLnJzAAAQ5RcAXgAAADkAAAASAAAA7C8YAEwAAADSDQAADQAAAOwvGABMAAAALQoAACQAAAAAAAAADAAAAAQAAAAXBQAAGAUAABsDAAAMAAAABAAAAFgDAAA2BAAAHgMAQdTL3wALgggBAAAAHwMAALIXGAABAAAAshcYAAEAAACyFxgAAQAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL21pZXR0ZS03LjIuMC9zcmMvaGFuZGxlcnMvZ3JhcGhp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AAAAXgIAABwAAACIKxgAagAAAGsCAAAyAAAAAgAAAIgrGABqAAAAAQMAABUAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9yZWdleC1hdXRvbWF0YS0wLjQuNy9zcmMvdXRpbC9zZWFyY2gucnNpbnZhbGlkIHNwYW4gIGZvciBoYXlzdGFjayBvZiBsZW5ndGggAAAAoBkYAA0AAACtGRgAGAAAADQZGABsAAAAqgEAAAkAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9zd2NfZWNtYV9jb2RlZ2VuLTUuMC4xL3NyYy90eXBlc2NyaXB0LnJzYXMoPT57fWRlY2xhcmVuYW1lc3BhY2VgAAAA6BkYAG0AAAC2AQAAIgAAACR7AADoGRgAbQAAALkBAAAhAAAAZXh0ZW5kcz86ZW51bS4uLltdaW5mZXJyZWFkb25seW91dGltcG9ydC5tb2R1bGVnbG9iYWxhbnl1bmtub3dubnVtYmVyb2JqZWN0Ym9vbGVhbmJpZ2ludHN0cmluZ3N5bWJvbHVuZGVmaW5lZG51bGxuZXZlcmludHJpbnNpY2tleW9mdW5pcXVlaW50ZXJmYWNlZXhwb3J0c2F0aXNmaWVzYXNzZXJ0c2lzdHlwZWFic3RyYWN0bmV3cmVxdWlyZQAAADgXGAB5AAAAcQAAABoAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9zd2NfZWNtYV9jb2RlZ2VuLTUuMC4xL3NyYy9saWIucnMAAGgbGABmAAAA5QcAAC8AAABoGxgAZgAAAN8HAAAwAAAAc3VwZXJkZWZlcixmcm9td2l0aGFzc2VydGFzc2VydGlvbiBmYWlsZWQ6IG4uc3BlY2lmaWVycy5sZW4oKSA8PSAyAABoGxgAZgAAAGgBAAAVAAAAIyEAAGgbGABmAAAAcg4AABIAAABuLTB4WRwYAAMAAAAweAAAZBwYAAIAAABmdW5jdGlvbmFzeW5jaWZlbHNlPGludmFsaWQ+dXNlIHN0cmljdHNjcmlwdDwhLS1ceDNjIS0tLS0+LS1ceDNlaBsYAGYAAAC9BwAAIgAAAGgbGABmAAAAwAcAACEAAABmb3J0cnlmaW5hbGx5QD8uYXdhaXRicmVha2NsYXNzdGhyb3d3aGlsZXlpZWxkb2ZyZXR1cm5jYXNlZGVmYXVsdAAAAGgbGABmAAAAfw0AABoAAABoGxgAZgAAAIINAAA7AAAAc3dpdGNoY2F0Y2gjcHVibGljcHJvdGVjdGVkcHJpdmF0ZWFjY2Vzc29yY29udGludWVkZWJ1Z2dlcmRvaW1wbGVtZW50c25ldy50YXJnZXRpbXBvcnQubWV0YW5vdCBpbXBsZW1lbnRlZDogY29kZWdlbiBvZiBgZXhwb3J0IGRlZmF1bHQgZnJvbSAnZm9vJztgAI8dGAA4AAAAaBsYAGYAAAC2AQAAEQAAAGgbGABmAAAA4wIAADQAAABJbmZpbml0eWVjb25zdHJ1Y3RvcmgbGABmAAAAIAoAAEgAAABoGxgAZgAAACEKAAAoAAAAaBsYAGYAAAAJCAAATAAAAGgbGABmAAAADAgAACcAAABmYWxzZXRydWU8LzwvPjw+dXNpbmcvLy8qKi8jX19QVVJFX18bAwAADAAAAAQAAABYAwAAOAUAAB4DAEGIveAACx4BAAAAHwMAABsDAAAMAAAABAAAAFgDAAAUBQAAHgMAQbC94AALgQYBAAAAHwMAAGEgRGlzcGxheSBpbXBsZW1lbnRhdGlvbiByZXR1cm5lZCBhbiBlcnJvciB1bmV4cGVjdGVkbHkvcnVzdGMvOTBiMzVhNjIzOWMzZDhiZGFiYzUzMGE2YTA4MTZmN2ZmODlhMGFhZi9saWJyYXJ5L2FsbG9jL3NyYy9zdHJpbmcucnMAAO8eGABLAAAAewoAAA4AAABCBQAABAAAAAQAAABDBQAARAUAAAgAAAAEAAAARQUAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3N3Y19mYXN0X3RzX3N0cmlwLTYuMC4wL3NyYy9saWIucnMARgUAAAgAAAAEAAAARwUAAEgFAABJBQAASgUAAEsFAABMBQAATQUAAE4FAABPBQAAUAUAAFEFAABSBQAAUwUAAFQFAABmYWlsZWQgdG8gcGFyc2UAGCAYAA8AAABsHxgAZwAAAMQAAABJAAAAbB8YAGcAAAAJAQAAFQAAAGwfGABnAAAA3AAAACUAAABsHxgAZwAAAOsAAAAlAAAAbB8YAGcAAADvAAAAJQAAAGwfGABnAAAA8AAAACUAAABsHxgAZwAAAPQAAAAlAAAAbB8YAGcAAAD1AAAAJQAAAGwfGABnAAAA9gAAACUAAABsHxgAZwAAAPwAAAAlAAAAbB8YAGcAAAD+AAAAJQAAAGwfGABnAAAA/wAAACUAAABsHxgAZwAAAAABAAAlAAAAbB8YAGcAAABHAQAAMAAAAGdlbmVyYXRlZCBjb2RlIHdhcyBub3QgdXRmLThmYWlsZWQgdG8gd3JpdGUgc291cmNlIG1hcHNvdXJjZSBtYXAgd2FzIG5vdCB1dGY4AAAAbB8YAGcAAACAAQAAEgAAAGwfGABnAAAAjAEAABUAAABsHxgAZwAAAJgBAAAVAAAAbB8YAGcAAACmAQAAGQAAAGwfGABnAAAAsgEAABkAAAAPAEHIw+AAC4EBsCEYAGwfGABnAAAA1gEAABkAAABsHxgAZwAAAOABAABAAAAAbB8YAGcAAADkAQAAJAAAAG92ZXJyaWRl/CEYAAgAAABsHxgAZwAAABoCAAA8AAAAbB8YAGcAAABzAgAAGAAAAGluaW5zdGFuY2VvZmdldHNldHN0YXRpYwAAAAAQAEHgxOAAC6EldGhpc2wfGABnAAAAugQAACQAAABzdHJ1Y3QgT3B0aW9uc3ZhcmlhbnQgaWRlbnRpZmllcmVudW0gTW9kZWV2YWwvcnVzdGMvOTBiMzVhNjIzOWMzZDhiZGFiYzUzMGE2YTA4MTZmN2ZmODlhMGFhZi9saWJyYXJ5L2NvcmUvc3JjL3NsaWNlL3NvcnQvc3RhYmxlL2RyaWZ0LnJzoSIYAFsAAAD/AAAAGQAAAKEiGABbAAAA8gAAABIAAAChIhgAWwAAAM4AAAAkAAAAoSIYAFsAAADRAAAAJAAAAKEiGABbAAAAQAAAACIAAABIYXNoIHRhYmxlIGNhcGFjaXR5IG92ZXJmbG93TCMYABwAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9oYXNoYnJvd24tMC4xNC41L3NyYy9yYXcvbW9kLnJzcCMYAGQAAABWAAAAKAAAAGNhbm5vdCBhY2Nlc3MgYSBzY29wZWQgdGhyZWFkIGxvY2FsIHZhcmlhYmxlIHdpdGhvdXQgY2FsbGluZyBgc2V0YCBmaXJzdC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3Njb3BlZC10bHMtMS4wLjEvc3JjL2xpYi5ycywkGABgAAAAqAAAAAkAAAAgICAgaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZTogIGlzIGFscmVhZHkgcmVuYW1lZCB0byAsIGJ1dCBpdCdzIHJlbmFtZWQgYXMgAKAkGAAqAAAAyiQYABcAAADhJBgAFgAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3N3Y19lY21hX3RyYW5zZm9ybXNfYmFzZS02LjAuMi9zcmMvcmVuYW1lL21vZC5ycwAAABAlGAB1AAAA1QAAABkAAABGBQAACAAAAAQAAABHBQAASAUAAEkFAABKBQAASwUAAEwFAABNBQAATgUAAE8FAABQBQAAUQUAAFIFAABTBQAAVAUAAFR5cGVTY3JpcHQgZXhwb3J0IGFzc2lnbm1lbnQgaXMgbm90IHN1cHBvcnRlZCBpbiBzdHJpcC1vbmx5IG1vZGVUeXBlU2NyaXB0IGltcG9ydCBlcXVhbHMgZGVjbGFyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBpbiBzdHJpcC1vbmx5IG1vZGVUeXBlU2NyaXB0IGVudW0gaXMgbm90IHN1cHBvcnRlZCBpbiBzdHJpcC1vbmx5IG1vZGVUeXBlU2NyaXB0IG5hbWVzcGFjZSBkZWNsYXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGluIHN0cmlwLW9ubHkgbW9kZVR5cGVTY3JpcHQgcGFyYW1ldGVyIHByb3BlcnR5IGlzIG5vdCBzdXBwb3J0ZWQgaW4gc3RyaXAtb25seSBtb2RlVGhlIGFuZ2xlLWJyYWNrZXQgc3ludGF4IGZvciB0eXBlIGFzc2VydGlvbnMsIGA8VD5leHByYCwgaXMgbm90IHN1cHBvcnRlZCBpbiB0eXBlIHN0cmlwIG1vZGUuIEluc3RlYWQsIHVzZSB0aGUgJ2FzJyBzeW50YXg6IGBleHByIGFzIFRgLmRlc2NyaXB0aW9uKCkgaXMgZGVwcmVjYXRlZDsgdXNlIERpc3BsYXlJb1V0ZjhCYWRKc29uVmxxTGVmdG92ZXJWbHFOb1ZhbHVlc1ZscU92ZXJmbG93QmFkU2VnbWVudFNpemVCYWRTb3VyY2VSZWZlcmVuY2VCYWROYW1lUmVmZXJlbmNlSW5jb21wYXRpYmxlU291cmNlTWFwSW52YWxpZERhdGFVcmxDYW5ub3RGbGF0dGVuSW52YWxpZFJhbUJ1bmRsZU1hZ2ljSW52YWxpZFJhbUJ1bmRsZUluZGV4SW52YWxpZFJhbUJ1bmRsZUVudHJ5Tm90QVJhbUJ1bmRsZUludmFsaWRSYW5nZU1hcHBpbmdJbmRleEludmFsaWRCYXNlNjQARAUAAAgAAAAEAAAAVQUAAEQFAAAIAAAABAAAAEUFAABVBQAAzCgYAFYFAABXBQAAWAUAAFkFAAC6AgAAAAAAAAgAAAAEAAAAWgUAAAAAAAAIAAAABAAAANwCAABaBQAACCkYACIDAABbBQAAXAUAACIDAAC6AgAAXQUAAAQAAAAEAAAAXgUAAF0FAAAEAAAABAAAAF8FAABeBQAARCkYAGAFAABhBQAAuAIAAGIFAAC6AgAAAAAAAAQAAAAEAAAALQAAAEZyb21VdGY4RXJyb3JieXRlc2Vycm9yaW52YWxpZCB1dGYtODogY29ycnVwdCBjb250ZW50c2ludmFsaWQgdXRmLTgAYwUAABQAAAAEAAAAZAUAAGMFAAAUAAAABAAAAGUFAABkBQAA1CkYAGYFAABnBQAAuAIAAGYFAAC6AgAAaAUAABwAAAAEAAAAaQUAAGgFAAAcAAAABAAAAGoFAABpBQAAECoYAGsFAABsBQAAuAIAAGsFAAC6AgAAbQUAADgAAAAEAAAAvAIAAG0FAAA4AAAABAAAAL0CAAC8AgAATCoYAL4CAABuBQAAwAIAAL4CAADBAgAAbwUAADAAAAAEAAAAvAIAAG8FAAAwAAAABAAAAL0CAAC8AgAAiCoYAL4CAABwBQAAwAIAAL4CAADBAgAARXJyb3Jjb250ZXh0c291cmNlAABxBQAADAAAAAQAAAByBQAAcQUAAAwAAAAEAAAAqAIAAHIFAADYKhgAIgMAAHMFAAC4AgAAdAUAALoCAABKAwAAFAAAAAQAAAB1BQAASgMAABQAAAAEAAAAqQIAAHUFAAAUKxgAIgMAAHYFAAB3BQAAIgMAALoCAABUb2tlbkFuZFNwYW50b2tlbmhhZF9saW5lX2JyZWFrc3BhbgAAAAAADAAAAAQAAAB4BQAAeQUAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3JlZ2V4LWF1dG9tYXRhLTAuNC43L3NyYy91dGlsL3Bvb2wucnMAAIgrGABqAAAAPQIAABwAAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlOiBNb2R1bGUgaXMgaGFuZGxlZCBhYm92ZQAAAAQsGABBAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvc3djX2VjbWFfcGFyc2VyLTYuMC4xL3NyYy9wYXJzZXIvbW9kLnJzUCwYAGwAAAC0AAAAMgAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3N3Y19lY21hX3BhcnNlci02LjAuMS9zcmMvcGFyc2VyL3BhdC5yc8wsGABsAAAAmgIAACoAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi9zd2NfZWNtYV9wYXJzZXItNi4wLjEvc3JjL3BhcnNlci9leHByLnJzAAAASC0YAG0AAACnAwAAGgAAAHoFAAB7BQAAfAUAAH0FAAB+BQAAMwMAAH8FAACABQAAgQUAAIIFAACDBQAAMwMAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3N3Y19lY21hX3BhcnNlci02LjAuMS9zcmMvcGFyc2VyL2lucHV0LnJzAAD4LRgAbgAAAM8AAAArAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvc3djX2VjbWFfcGFyc2VyLTYuMC4xL3NyYy9sZXhlci9zdGF0ZS5ycwAAAHguGABtAAAAfwAAAC4AAAB4LhgAbQAAAIAAAAA4AAAAeC4YAG0AAACBAAAAGQAAAPgtGABuAAAAuQEAACcAAAD4LRgAbgAAAL8BAAAjAAAAPGVvZj5SZWZDZWxsdmFsdWU8Ym9ycm93ZWQ+AEkvGAAKAAAAL3J1c3RjLzkwYjM1YTYyMzljM2Q4YmRhYmM1MzBhNmEwODE2ZjdmZjg5YTBhYWYvbGlicmFyeS9jb3JlL3NyYy9zbGljZS9zb3J0L3N0YWJsZS9xdWlja3NvcnQucnNtaWQgPiBsZW67LxgACQAAAFwvGABfAAAATAAAAB8AAABcLxgAXwAAAEYAAAAXAAAAL3J1c3RjLzkwYjM1YTYyMzljM2Q4YmRhYmM1MzBhNmEwODE2ZjdmZjg5YTBhYWYvbGlicmFyeS9hbGxvYy9zcmMvdmVjL21vZC5yc+wvGABMAAAAtAcAAA0AAADwMBgAYAAAACsBAAApAAAA8DAYAGAAAAA6AQAAJQAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3VuaWNvZGUtd2lkdGgtMC4xLjEzL3NyYy90YWJsZXMucnMAaDAYAGcAAAAnAAAAGQAAAGgwGABnAAAALQAAAB0AAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi90ZXh0d3JhcC0wLjE2LjEvc3JjL2NvcmUucnPwMBgAYAAAAAwBAAAeAAAAHDkYAGoAAADBAAAAKAAAABw5GABqAAAAwwAAACUAAAAcORgAagAAAMQAAAAvAAAALQAAABw5GABqAAAAzgAAACUAAAAcORgAagAAAM8AAAAvAAAAAAAAABwAAAAEAAAAhAUAAIUFAACGBQAAhwUAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3RleHR3cmFwLTAuMTYuMS9zcmMvd29yZF9zZXBhcmF0b3JzLnJzANAxGABrAAAA3AAAACgAAADQMRgAawAAANIAAAAsAAAAiAUAACwAAAAEAAAAiQUAAIUFAACKBQAAiwUAANAxGABrAAAAFgEAABwAAADQMRgAawAAADUBAAAoAAAA0DEYAGsAAAAuAQAALAAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3NtYXdrLTAuMy4yL3NyYy9saWIucnMAqDIYAFsAAAAeAQAAGwAAAKgyGABbAAAAIgEAABQAAACoMhgAWwAAACIBAAANAAAAqDIYAFsAAAAgAQAAEQAAAKgyGABbAAAALAEAAAkAAACoMhgAWwAAACcBAAAXAAAAqDIYAFsAAAAIAQAAHAAAAKgyGABbAAAACAEAAC8AAAAoaSwgaikgbm90IGFib3ZlIGRpYWdvbmFsOiAoLCAAAIQzGAAcAAAAoDMYAAIAAABg0BgAAQAAAKgyGABbAAAAhgEAABQAAAAoaSwgaikgb3V0IG9mIGJvdW5kczogKCksIHNpemU6IMwzGAAXAAAAoDMYAAIAAADjMxgACQAAAKgyGABbAAAAhwEAABkAAACoMhgAWwAAAJIBAAAMAAAAqDIYAFsAAACSAQAAKgAAAKgyGABbAAAAiAEAABMAAACoMhgAWwAAAHUBAAAhAAAAqDIYAFsAAAB2AQAAGQAAAKgyGABbAAAAeQEAACUAAACoMhgAWwAAAHoBAAAbAAAAqDIYAFsAAABzAQAAIQAAADg6GAB3AAAASwEAACAAAAA4OhgAdwAAAEsBAAAsAAAAODoYAHcAAABLAQAAMgAAADg6GAB3AAAAUwEAABgAAAC7OBgATwAAAMgFAAAUAAAAuzgYAE8AAADIBQAAIQAAALs4GABPAAAAvAUAACEAQYzq4AALvQUBAAAAjAUAAGNhbGxlZCBgUmVzdWx0Ojp1bndyYXAoKWAgb24gYW4gYEVycmAgdmFsdWUAuzgYAE8AAABMBAAAJAAAAH02GABrAAAAuQAAAEYAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi90ZXh0d3JhcC0wLjE2LjEvc3JjL3dyYXAucnNgNRgAYAAAABcBAAAYAAAAT3ZlcmZsb3dFcnJvcmludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGUvcnVzdGMvOTBiMzVhNjIzOWMzZDhiZGFiYzUzMGE2YTA4MTZmN2ZmODlhMGFhZi9saWJyYXJ5L2FsbG9jL3NyYy9ib3Jyb3cucnMFNhgASwAAABUBAAAlAAAAVXRmOEVycm9ydmFsaWRfdXBfdG9lcnJvcl9sZW4vaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi90ZXh0d3JhcC0wLjE2LjEvc3JjL3dyYXBfYWxnb3JpdGhtcy5yc302GABrAAAAcQEAABoAAAB9NhgAawAAAGsBAAAiAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvdW5pY29kZS1saW5lYnJlYWstMC4xLjUvc3JjL2xpYi5ycwAINxgAZwAAAGEAAAAXAAAACDcYAGcAAAA1AAAAGAAAAAg3GABnAAAAOQAAABoAAAAINxgAZwAAAD4AAAAFAAAATm9uZVNvbWUNCgoCAgICAgICAgIDAwEBAQBB2+/gAAsQAQAAAAAAAAACAgAAAAAAAgBBmvDgAAsBAgBBwPDgAAsBAQBB2/DgAAsBAQBBu/HgAAvhBy9ydXN0Yy85MGIzNWE2MjM5YzNkOGJkYWJjNTMwYTZhMDgxNmY3ZmY4OWEwYWFmL2xpYnJhcnkvY29yZS9zcmMvc3RyL3BhdHRlcm4ucnMAALs4GABPAAAAvgEAADcAAAAvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi90ZXh0d3JhcC0wLjE2LjEvc3JjL3dvcmRfc3BsaXR0ZXJzLnJzAAAcORgAagAAAJkAAAAkAAAAHDkYAGoAAACaAAAAJAAAAC9ydXN0Yy85MGIzNWE2MjM5YzNkOGJkYWJjNTMwYTZhMDgxNmY3ZmY4OWEwYWFmL2xpYnJhcnkvY29yZS9zcmMvc2xpY2UvbW9kLnJzAAAAqDkYAE0AAADhAwAAIQAAAKg5GABNAAAA4QMAAC4AAACoORgATQAAAOUDAAAgAAAAqDkYAE0AAADlAwAAKwAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL3RleHR3cmFwLTAuMTYuMS9zcmMvd3JhcF9hbGdvcml0aG1zL29wdGltYWxfZml0LnJzADg6GAB3AAAArgAAACEAAAA4OhgAdwAAALQAAAAbAAAAODoYAHcAAAC0AAAAIwAAADg6GAB3AAAArwAAACkAAAA4OhgAdwAAALAAAAAsAAAAODoYAHcAAACxAAAAHwAAADg6GAB3AAAAewEAABoAAAA4OhgAdwAAAHwBAAAeAAAAL3J1c3RjLzkwYjM1YTYyMzljM2Q4YmRhYmM1MzBhNmEwODE2ZjdmZjg5YTBhYWYvbGlicmFyeS9hbGxvYy9zcmMvc3luYy5ycwAAAAEAAAAAAAAATGF6eSBpbnN0YW5jZSBoYXMgcHJldmlvdXNseSBiZWVuIHBvaXNvbmVkAACEOxgAKgAAAC9ob21lL25vZGUvaG9tZS8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby02ZjE3ZDIyYmJhMTUwMDFmL29uY2VfY2VsbC0xLjE5LjAvc3JjL2xpYi5yc7g7GABgAAAAHwUAABkAAAD/////AAAAAAQLDxMXGx8jJy0xNDg8QAJFAAAAAABJAE0ABQUFBQUFBQUFBQUFBgUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVRVFhcBQUFBQUFBQUFBQUFBQUFBQUFBQUFCQBBrPngAAsoAWAoZGhscCt0dnp+goaKjpKWnKAFMqQAAAAAlwUFpgAAAAAAAAAFrABB5PngAAsTBa8AswUFBQUFBQUFBQUFQwUFtwBBh/rgAAsImlK5AAAAALwAQZr64AALmgLExgAAAK3M0NS62AAA3AAAAAAAAAAABQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXeBQUFBQUFBd/hBQUFBQUFBQUFBeQFBQUFBQUFBQUFBQUF4gXnAAAAAAXpAAAFBQUFBQUFBQXlBQUFBQUFBesAAAAAAAAIDREVGR0hJSovMTY6PkICRwAAAAAASwBPAAUFBQUFBQUFBQUFBQYFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFUVZaXgUFBQUFBQUFBQUFBQUFBQUFBQUFBQkAQcT84AALKAFiKGZqbnIrdHh8gISIjJCUmZ6iBTKkAAAAAJcFBakAAAAAAAAABawAQfz84AALEwWxALUFBQUFBQUFBQUFBUMFBbcAQZ/94AALuwGaUrkAAAAAvwAAAAAAAAAAp6rCxMgAygCtztLWutoAANwAAAAAAL0AAAUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF3gUFBQUFBQXf4QUFBQUFBQUFBQXkBQUFBQUFBQUFBQUFBeIF5wAAAAAF6QAABQUFBQUFBQUF5QUFBQUFBQXrAEHIieEACwHAAEHAiuEAC0D/////////////////////////////////////////////Pz//////Pz//qv///z/////////fX9wfzw//H9wfAEGVi+EAC2MEIAT//3////9///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AQZWM4QALaQSgBP//f////3///////////////////////////////////////////////////////////////////////w8A//9/+P//////D////////////////////////////////8P/AwAfUABBjo3hAAuEBt+8QNf///v///////////+//////////////////////////////////8P/AwAfUAAA///////////////////fvMDX///7////////////v///////////////////////A/z///////////////////////////7///9/Av//////AQAAAAAAAAAA////hwcA//////////////////////v8///////////////////////////+////fwL//////wH+/////7+2AP///4cHAAAAAAD//////wcAAADA/v//////////////LwBgwACcAAD9////AAAA4P////////////8/AAIAAPz///8HMAQAAP8H////////////w////////////////++f//3/nwAA/////////+f///////////////8DAP///////z8k//8/BBABAAD///8B/wf///9+AAD//////wMAAAAAAADw////////IwAAAf8DAP7/4Z/5///9xSMAQACwAwADEP//////PwAA////D/8H////fgD////////////7////////////////////z//+/++f+f///cXzn3mAsM//A1Dgh/n///1tAwAAAF4AABwA4L/7///97SMAAAEAAwAAAuCf+f///e0jAAAAsAMAAgDoxz3WGMf/AwAAAQAAAAAA7of5///9bdOHOQJewP8/AO6/+////e3zvzsBAM//AP7un/n///3t85854LDP/wIA7Mc91hjH/8PHPYEAwP8AAODf/f///f8jAAAAJwMAAADh3/3///3vIwAAAGADAAYA8N/9/////ycAQHCAAwAA/OD/f/z///svfwAAAAAAAAD/3/3///3/8989YCfP/wAA79/9///97/PfPWBgz/8OAP/f/f//////333wgM//APzu/3/8///7L3+EX//A/wwA/v//////DQB/AAAAAAAAANb3//+v/w0gXwAA8AAAAAABAAAAAAAAAP/+////HwAAAB8AQaCT4QAL1AP+////////B/9//wMAAAAA1vf//6///z9ff//zAAAAAAEAAAP/A6DC//7///8f/v/f///+////H0AAAAAAAAAA//////8HAIAAAD88YsDh/wNAAAD/////vyD///////f///////////////////////////////////////////////////8/AAD///////////z///////8AAAAAAP8P////////////A////////////z//////vyD///////f//////////////////////////////////////////////////38A//8/AP8AAAC////////9BwAAAAAAAAAA////////////PX89//////89/////z1/Pf9//////////z3//////////wcAAAAA//8AAP////////////8/P////////////z1/Pf//////Pf////89fz3/f/////////89///////////nAP4DAP//AAD/////////////Pz/+/////////////////////////////////////////////////////////////////////////////////////////////////////////////wMAQYCX4QALiwL/////////////////n////v//B////////////8f/Af//A4D//wMA//8DAP/fAQD///////8PAAAAgBAAAAAA/////////////////5////7//wf////////////H/wH//z+A//8fAP//DwD/3w0A/////////////48w/wMAAAAAAAD//////////////wH//////wX//////////z8A////fwAAAAAAAP///z8fAP//////D////wMAAAAAAAAAuP8D//////////////8B//////8H//////////8/AP///3//D/8PwP////8/HwD//////w////8D/wcAAAAA//9/AP///////x8AQZSZ4QALAYAAQaCZ4QAL/wHg//////8PAOAfAAAAAAAA+P///wHAAPz/////PwAAAP///w//////////f////5//A/8DgAD/v/9/AAAAAAAA////////////H/8DAPgPAP//////////////////DwD/////DwAAAADgAPz///8//wH//////+cAAAAAAN5vBP///////////////////////////////wAAAAAAAAAA/////////wD/4///////P/8B///////nAAD3/////wf///////////////////////////////////////////////////////////////////////////////////8AQa6b4QALBgKAAAD/HwBBwJvhAAsShPwvP1D9//PgQwAA//////8BAEHhm+EACzEwAAAAAACAAQAQAAAAAoAAAP8fAAAAAAAA/x/i/wEAhPwvP1D9//PgQwAA//////8BAEGgnOEAC+AG/////////////////////////////////////x94DAD/////vyD/////////gAAA//9/AH9/f39/f39/AAAAAP////////////////////////////////////8f+A8A/////78g/////////4AAgP//fwB/f39/f39/f//////gAAAA/gM+H/7///////////9/+P7/////////////9+D///////7/////////////fwAA/////wAAAAAAAP//4AAAAP7/Ph/+////////////f/7+//////////////fg///////+/////////////38AAP////8AAAAAAAD/////////////////////////HwAAAAAAAAAA//////8/////////////////////////////////////////////////BwAEAAAAJwDwAP////////////////////////8f//8ADAAA//////9/AID///8//////////////wAAAACA//z////////////////5/////////wfrAwAA/P//H////w8AAP////////C///////////////////8DAAAAgP/8////////////////+f////////8H6wMAAPz/u/f//wcAAAD///////8PAPz//////w8AAAAAAAAA/GgA/P//PwD//38AAAD///8f8P//////BwAAgAAA3/8AfP//////EAAA////////DwD//////////z8A/wP////o//////8//////w8A////H///////////AYD/A////3///////wEAAPcPAAD//3/E////////Yj4FAAA4/wccAH5+fgB/f///////9/8D//////////////////8HAAAA////////fwD/P/8D//9//P//////////BwAAOP//fAB+fn4Af3////////f/A////////////////////zf/A/////////////////8//////////////////wMAAAAAfwD4oP/9f1/b/////////////////wMAAAD4////////////////////////P/////////////////8DAAAAAH8A+OD//X9f2/////////////////8DAAAA+P//////AEGOo+EAC6EB3/////////////////////8fAAAAAP7//wf+//8HwP////////////9//Pz8HAAAAAD//wAA//8YAADgAAAAAN//////////////////////HwAA/wP+//+H/v//B8D/////////////f/z8/BwAAAAA/+///3///7f/P/8/AAAAAP///////////////////wcAAAAAAAAAAP///////x8AQcCk4QALL//v//9///+3/z//PwAAAAD///////////////////8HAAAAAAAAAAD///////8fAEH/pOEACwEgAEGQpeEACyv///8f////////AQAAAAAA/////wDg////B/////8/AP///z//////D/8+AEHQpeEAC6MC////H////////wEAAQAAAP////8A4P///wf//////wf///8//////w//PgAAAAAA/////////////////////////z8AAP////8P/////w///////wD///////8PAP/3//e3//v/+xsAAAAAAAAAAP////////////////////////8//wP/////D/////8P//////8A////////DwD/9//3t//7//sbAAAAAAAAAAA//f////+/kf//PwD//38A////fwAAAAAAAAAA//83AP//PwD///8DAAAAAAAAAAD/////////wAAAAAAAAAAAAQDv/v//PwAAAAAA////H////x8AAAAA//7//x8AAAD///////8/AP//PwD//wcA//8DAEGAqOEACzNv8O/+//8/hwAAAAD///8f////HwAAAAD//v//fwAAAP///////z8A//8/AP//BwD//wMAQcCo4QALJf///////////wEAAAAAAAD///////8HAP///////wcA/////w8AQYCp4QALKP///////////wEAAAAAAAD///////8HAP///////wcA//////8A/wMAQdCp4QALB///////AwMAQeCp4QALH////x+AAP//PwAAAAAA//8DAAAAAAD//x8AAAD//38AQZCq4QAL3QH//////xsDAAAAAAAAAADg////H4AA/////wEAAAD//z8AAAAAAP//HwAAAP//fwD4////////AAAAAAAAACYA+P//////AAAAAP///wEAAPj///9/AAAAkAD/////RwD4//////8HAB4AABQAAAAA//////////9/AAAAwP8/gP////////8HBAD///8B/wP////////f//AA/////08A//////////8f3v8XAAAAAP//+///DwCAAQAAAAAAAAB/vf+//wH//////38AAAAA4J/5///97SMAAAHgAwBBgKzhAAsv///7/////8ADAAAAAAAAAH+9/7//Af////////8H/wPvn/n///3t+585geDPHx8AQcCs4QALGf///////x8AgAcAgAMAAAD///////8AALAAQfCs4QALLP//////fwAAAAAADwAAAAD///////////8H/8MDAAAA//////////+/AP8DAEGwreEACzn///////8//wEAAD8AAAAA////////AAAQAAAAAAAAAP//////BwABAAAAAAAAAAD///8HAAAAAH8AQYCu4QALKf//////////EQD/AwAAAAD/////////Af8DAAAAAAAA////5/8P/wN/AEHAruEACwb//////w8AQdSu4QALFf//////////AAAAgH/yb////wCAAgBB9K7hAAsU//z/////AQAKAAAA/////////wcAQZSv4QALTP///////////wMAgH/yb////7/5DwD/AwAAAAAAAAAA//z///////wbAAAAAfj/////BwQAAAHw//////8DACAAAP///////////wEAQZKw4QALLv///////////////wEA/////////3+AAP///////////yMAAP///////////wEAQf6w4QALFO9v//3///9/AAABAAAAAAD8////AEGgseEACxR/+/////8BAEAAAAC//f///wMAAQBBwLHhAAsX//3/////f/8BAP8DAAD8/////P///n8AQeCx4QALFn/7/////3+0/wD/A7/9////f/sB/wMAQZyy4QALC///BwD0//3///8PAEG2suEACwEBAEHcsuEACxD//38A///9/////8cHAP8DAEH2suEACwEBAEGAs+EACyn/////////////////fwAA////////////////////////////////DwBBwLPhAAsJ////////AAB+AEGAtOEACwn//////z///38AQaC04QALC////////wAA//8/AEHstOEACwrg4wf45w8AAAA8AEGAteEACwn//////////38AQcC14QALBv///3/gBwBB4LXhAAsy/////////wH///9/AAD///////////9/AAD///8/AAD///////8AAA8AAAD4///g//8AQaC24QALMv////////8B////f/8D////////////f/8D////Px8A////////fwAPAP8D+P//4P//AEHotuEACwj//////////wBBgLfhAAsd////////////BwEAAAAAAAAA+P8AAAAAAAAAAAsAQai34QALCP//////////AEHAt+EAC0L///////////+H/////////4D//wAAAAAAAAAAGwADAP//////////////////////////////////PwAAAAAA/wEAQaC44QALIP////////////////////////////////////////8PAEH8uOEACxh/b/9//////////////////wf/H/8B/wMAQd654QALFv8D/////////////////wf/H/8B/2MAQaC64QALHv///////////////////////////////////////wBByLrhAAsBHABBgLvhAAvWAf/////////////f///////////fZN7/6+//////////v+ff3////3tf/P3//////////////////////////////////////////////////////z/////9///3////9///3////9///3////9//////f////3///cPAAAAAAAA//////////////////////////8//////f//9/////f//9/////f//9/////f/////3////9///3z////////////////3/4//////8fIAAQAAD4/v8AQYa94QALCP////////8/AEGgveEACwr//////x+APwBAAEHAveEACxJ////52wf/////////PwAAAIAAQeC94QALCv//////H/8//0MAQZK+4QALDP///z8AAP//////DwBB0r7hAAsO////fwAA/////////wMAQZq/4QALBP///w8AQdq/4QALBv//////AwBBgMDhAAsq////////////////////////////////HwAAAAAAAAD//////////w8IAEHAwOEACyz///////////////////////////////8fAH8AAAAAAP///////////w//AwBBgMHhAAsY7////5b+9wqE6paqlvf3Xv/7/w/u+/8PAEHAweEAC6wC/////////////////////////////////////wAAAAD///////////////////////////////////////////////////8D////////////////////////////////////P/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8BAP////////////////////////////8DAP///////////////////////////////////////////////////////////////////wf///////////////////////////////////////////8/AEGgxOEACwT///8/AEHgxOEACzb///////////////////////////////////////////////////////////////////////8AQcLF4QALlqQBQAB/AL8A9wD3APcA9wD3APcA9wAwAXABoQHhAfcA9wD3AB4C9wAuAl8ClgLWAhYDSwP3AHwDtgPrAwUERQSFBMUE9gQsBWgFpgXlBSMGYgagBt8GHQddB5sH2QcXCFcIlQjUCBIJUgmQCdAJEApPCo8KzgoOC04LjgvICwgMSAyIDLgM8gwyDVINcg2aDfcA2g0RDk8Ofg6jDsYO5g4mD/cA9wD3APcA9wD3APcA9wD3AGYPhg/GDwYQSAxGEIYQphDmEBYRVhGWEdYRDBI1ElYSlhLHEgcTQhOCE7wT+BM4FHgUtRT3APcA9wD1FPcA9wD3APcANRVvFSkCrxXvFS0WbRarFusWFxdRF38Xvxf9FzsYexizGPcA9wDeGBIZUhlyGXMZchmmGeYZIhpiGqIa4hofG1wbhRu7G/Yb9wD3APcA9wD3APcAMxxbHPcA9wD3APcA9wCZHM8c9wD3APcA9wDmHCYdVh2WHbYd9h02HnYekR7RHtEe0R77Hjsfex+4H/UfNSDRHoEeZiBGIKYg0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R73ANEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0SDRHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEeBCE9IfcA9wD3APcAfSG9IfshGyL3APcA9wBbIpki2SIZI1MjkyPMIwwkSySLJMskSAwIJUcldyX3AKcl5yXvJfcl/yXrJfMl+yXnJe8l9yX/Jesl8yX7Jecl7yX3Jf8l6yXzJfsl5yXvJfcl/yXrJfMl+yXnJe8l9yX/Jesl8yX7Jecl7yX3Jf8l6yXzJfsl5yXvJfcl/yXrJfMl+yXnJe8l9yX/Jesl8yX7Jecl7yX3Jf8l6yXzJfsl5yXvJfcl/yXrJfMl+yXnJe8l9yX/Jesl8yX7Jecl7yX3Jf8l6yXzJfsl5yXvJfcl/yXrJfMl+yXnJe8l9yX/Jesl8yX7Jecl7yX3Jf8l6yXzJfsl5yXvJfcl/yXrJfMl+yXnJe8l9yX/Jesl8yX7Jecl7yX3Jf8l6yXzJfsl5yXvJfcl/yXrJfMl+yXnJe8l9yX/Jesl8yX7Jecl7yX3Jf8l6yXzJfsl5yXvJfcl/yXrJfMl+yXnJe8l9yX/Jesl8yX7Jecl7yX3Jf8l6yXzJfsl5yXvJfcl/yXrJfMlMyZsJqwmrCasJqwmrCasJqwmrCasJqwmrCasJqwmrCasJqwmrCasJqwmrCasJqwmrCasJqwmrCasJqwmrCasJqwmrCbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJtEe0R7RHtEe0R7RHtEe0R4sJ2wn9wCpJ/cA9wD3APcAvCf3APwnNCh0KLAo9wDmKCYpZCmVKdQpYAp+CpsKugraCtoK2grbCtoK2graCtsK+wr7CvsK+wr7CvsK+wr7CvsK+wr7CvsK+wr7CvsK+wr7CvsK+wr7CvsK+wr7CvsK+wr7CvsK+wr7CvsK+wr7CvsK+wr7CvsK+wr7CvsK+wobC/cB9wD8ARQqaAJoAuwm7Cb3APcA9wD3APcA9wD3AOUEJCr3APcA4wn3APcA9wD3APQB2gktB+wm7Cb3APcAKyrsJuwm7CbsJuwm7CbsJuwm9wDaCfcA9wD3AC0HJwIHCPcA9wCpHfcA5QT3APcAOyr3AEsq9wD3AJ8lWirsJuwm9wD3APcA9wD3APcA9wD3APcAaAK7CPcA9wCfJfcABwj3APcAywf3APcA9wBcKvgB+AFrKgECeSrsJuwm7CbsJvcA9wD3APcA9wD3APcA9wD3APcA9wD3APcA9wD3APcA9wD3APcARRH3AEYRywfsJv0B9wD3AIkq7CbsJuwm7CaZKvcA9wCjKvcAsir3APcA9wD0AQ8D7CbsJuwm9wC/KvcAyir3AOYE7CbsJuwm7Cb3APcA9wCbJfcAdgL3APcA2irpBvcA6iq2D/oq9wD3APcA9wDsJuwm9wD3AAorGiv3APcA9wAqK/cAcAL3AO0E9wA6Kw0D7CbsJuwm7CbsJvcA9wD3APcAtg/sJuwm7Cb3APcA9wA2GfcA9wD3ALwP9wD3ANQPuwjsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7Cb3APQB9wD3AEorNxnsJuwm7Cb6EvcA9wDLB/cAagFaK+wm9wBqK+wm7Cb3AAcI7Cb3AEURJQL3APcAaAF6K3YCaAuKKyUC9wD3AJkrpyv3ALYPuwglAvcAaQG3K8cr9wD3ANcrJQL3APcAbQHnK/cr7gE0GfcAAQJkAQcsFizsJuwm7CYmLPUBNSz3APcAYQHLErsIRSx1AvoBVCybB2QscizREuwm7CbsJuwm7CbsJuwm7Cb3APcA9wBrAYIskiw3Gewm9wD3APcAcAGiLLsI7CbsJuwm7CbsJuwm7CbsJuwm7Cb3APcAYQGyLMEsyizsJuwm9wD3APcAcAHaLLsI6izsJvcA9wBlAfosuwjsJuwm7CZIDAELfgoKLQQl7CbsJuwm7CbsJuwm7CbsJuwm7CbsJvcA9wBkASsE7CbsJuwm7CbsJuwm9wD3APcA9wCsAzAnGi0mLfcANi1ELbsI7CbsJuwm7CZuAvcA9wBULWMt7CbwIfcA9wBzLYMtky33APcAZgGjLbIt9wD3APcA9wC2D8It7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm+gH3AGEB2QvSLawD2gniLfcAvQvYC88S7CbsJuwm7CYJB/cA9wDxLQAuuwgQLvcAQhIgLrsI7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJvcAMC5ALu0B9wBMLlouuwjsJuwm7CbsJuwmLQf3AGoueS6HLvcA9wD3APcA9wD3APcA9wD3APcA9wD3APcA9wD3APcA9wD3APcA9wD3APcA9wD3APcA9wD3APcA9wD3APcA9wDWDuwm7CbsJuwm7CbsJvcA9wD3APcA9wD3APQBli73APcA9wD3APcA9wD3APcA9wD3APcA9wA1Gewm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm9wD3APcA9wD3APcANhn3APcA9wD3APcApi73APcAtC73APcA9wD3APcA9wD3APcA9wD3APcA9wD3APcAvi73APcA9wD3APcA9wD3APcAzi7eLtAS7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJvcA9wD3APcA9wD3APcA9wD3APcA9wD3APcA9wD3APcA9wD3APcA9wD3APcA9wD3APcA9wD3APcAcw/3APcA9wD3AEUR7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm9wD3APcAtg/3APQB7i73APcA9wD3APQBuwj3AGgC/i73APcA9wAOLxovKi8BAugE9wDsJuwm7CbsJuwm7CbsJvcA9wD3APcA9wA1L+wm7CbsJuwm7CbsJvcA9wD3APcACAhvAXABcAFFLyUC7CbsJuwm7CZVL9QS0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R69HtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe9wD3APcA9wD3APcA9wD3APcA9wD3APcA9wD3APcA9wBGEewm7Ca8Huwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwmhwbRHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R4OH2Mv7CZzL38v0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEeuR7sJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJvcA9wD3APcA9wD3AOUE2gm2D48v0hLsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CZwAXAB6ANwAc8S9wD3APcA9wD3APcA9wA1Gewm7CbsJvcA9wD3APcA9wD3APcA9wD3APcA9wD3APcA9wD3AEYR9wD3AG8C9wD3APcAny9wAawv9wC4L/cA9wD3AOUE7Cb3APcA9wD3AMYv7CbsJuwm7CbsJuwm7Cb3ADUZ9wA1GfcA9wD3APcA9wBFEfcAtg/sJuwm7CbsJuwm7CbsJuwm9wD3APcA9wD3AP4B9wD3APcA9gHUL+Iv/wH3APcA9wDdDYYG9wAQDu8v7QH3APcA9wD3APcA9wD3APcA9wD3AHAC9wD3APcA9wD3APcA9wD3APcA9wD3APcA9wD3APcA9wD3APkvBzAHMAcwcAFwAXABmC1wAXABxAEXMCMw/BKmAuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJvcA9AEvMOwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm2Qs/ME0w9wD3APcAaALsJvgS7CbsJuwm7CbsJuwm7Cb3APcA2gldMFsk7CbsJuwm7CbsJuwm7CbsJuwm7CbsJvcAbTDsJvcA9wBkAX0w7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7Cb3AGQBuwjsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CaNMPQB9wD3APcA9wD3APcA9wD3APcA9wD3APcAcQLPEuwm7Cb3APcA9wD3AJ0wrTDsJuwm7CbsJuwm7CbsJuwm7CbsJu4B9wD3AGQovTDsJuwm7CbsJu4B9wD3AGgC7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm/wH3AMww2TDnMPcwBTENMfkBBwgcMQcI7CbsJuwmNxnsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJuwm7CbsJtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEeLDFyGaQZchlyGXIZPDFyGXIZchksMdEe0R7RHkkxTzHRHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R5fMWUx0R5sMXox0R7RHocx0R7RHtEe0R6XMaYxsDG3McYx1DHkMfIx0R7RHtEe0R4YG2MuAjIQGRUb0R7RHg4y0R4eMtEe0R7RHioy0R42MtEe0R7RHtEeQTL3APcAUTLRHtEeYTFhMmcy0R7RHtEe9wD3APcA9wD3APcA9wB3MvcA9wD3APcA9wACMtEe0R4CGfcA9wD3ABcbFRv3APcAFxv3AAAZ0R7RHtEe0R7RHocyrjHPMZYy0R7RHtEezjHRHtEe0R6lMqkxtDLRHtEe9wD3APcA9wD3AHcy0R7RHtEe0R7RHtEeYjLRHtEenjH3APcA9wD3APcA9wD3APcA9wAAAvcA9wDlBOwm7Ca7CNEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEe0R7RHtEetx4tCOwmcAFwAXABcAFwAXAB7CbsJuwm7CbsJuwm7CbsJnABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAewmNQRVBHUElQS1BNUE9QQPBS8FTwVvBY8FrwXPBe8FCgYqBjEGUQaAA4ADgAOAA2YGKgaGBqMGgAOAA4ADgAOAA8MG4AaAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAAyoGAAeAAxwHygDKAMoAygDKAMoAygDKADwHygBcB28HgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAB6AHtweAA4ADgAOAA9cHgAOAA4ADgAOAA4ADgAPnBwcIJwhHCF0IKgZ9CIADjQitCMQI1wjnCAcJgAMgCUAJYAmACaAJwAngCQAKygAgCsoAygDKAMoAygDKAMoAygDKAMoAygDKAMoAygDKAMoAygDKAMoAygDKAMoAygDKAMoAygDKAMoAygDKAMoAygAgCoADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgANACgMDAwMDAwMDAwwCAAABAwMDAwMDAwMDAwMDAwMDAwMDCRIWHRoZHRYVER0aFw4XGxgYGBgYGBgYGBgXFx0dHRIdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0VGhEdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRUMEB0DAwMDAwQDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwgVGRoaGh0cHB0cFh0MHR0ZGhwcDR0cHBwcHBYcHBwVHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0cHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRwdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHA0cHBwNHB0dHB0dHR0dHR0cHBwcHRwdDR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwgDAwMDAwMDAwMDAwMICAgICAgIAwMDAwMDAwMDAwMDAx0dHR0dHR0dKiodHR0dFx0qKioqHR0dHR0dHSodKh0dHR0dHR0dHR0dHR0dHR0dHR0dKh0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dAwMDAwMDAx0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHSodHR0dHR0dHR0dHR0dHR0dHR0dHR0dHSoqHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dFwwqKh0dGioDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMMAx0DAx0DAxIDKioqKioqKiojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqKioqIyMjIx0dKioqKioqKioqKiodHR0dHR0dHR0ZGRkXFx0dAwMDAwMDAwMDAwMSAxISEh0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dAwMDAwMDAwMDAwMDAwMDAwMDAwMDGBgYGBgYGBgYGBkYGB0dHQMdHR0dHR0dHR0dHR0dHR0dHR0dHRIdAwMDAwMDAx0dAwMDAwMDHR0DAx0DAwMDHR0YGBgYGBgYGBgYHR0dHR0dHR0dHR0dHR0qHR0DHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dAwMDAwMDAwMDAwMDAwMDAyoqHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dAwMDAwMDAwMDAwMdKioqKioqKioqKioqKioYGBgYGBgYGBgYHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dAwMDAwMDAwMDHR0dHRcSHSoqAxoaHR0dHR0dHR0dHR0dHR0dHR0dHR0dHQMDAwMdAwMDAwMDAwMDHQMDAx0DAwMDAyoqHR0dHR0dHR0dHR0dHR0dKh0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0DAwMqKh0qHR0dHR0dHR0dHR0qKioqKh0dHR0dHR0dHR0dHR0dHR0qHR0qKioqKioDAwMDAwMDAx0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDHQMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dAwMDHQMDAwMDAwMDAwMDAwMDAwMdAwMDAwMDAx0dHR0dHR0dHR0DAwwMGBgYGBgYGBgYGB0dHR0dHR0dHR0dHR0dHR0DAwMqHR0dHR0dHR0qKh0dKiodHR0dHR0dHR0dHR0dHR0dHR0dHR0dKh0dHR0dHR0qHSoqKh0dHR0qKgMdAwMDAwMqKgMDKioDAwMdKioqKioqKioDKioqKh0dKh0dHQMDKioYGBgYGBgYGBgYHR0ZGR0dHR0dGR0aHR0DKgMDAyodHR0dHR0qKioqHR0qKh0dHR0dHR0dHR0dHR0dHR0dHR0dHR0qHR0dHR0dHSodHSodHSodHSoqAyoDAwMqKioqAwMqKgMDAyoqKgMqKioqKioqHR0dHSodKioqKioqKhgYGBgYGBgYGBgDAx0dHQMdKioqKioqKioqAwMDKh0dHR0dHR0dHSodHR0qHR0dHR0dHR0dHR0dHR0dHR0dHR0dHSodHR0dHR0dKh0dKh0dHR0dKioDHQMDAwMDAyoDAwMqAwMDKiodKioqKioqKioqKioqKioqHR0DAyoqGBgYGBgYGBgYGB0aKioqKioqKh0DAwMDAwMqAwMDKh0dHR0dHR0dKiodHSoqHR0dHR0dHR0dHR0dHR0dHR0dHR0dHSodHR0dHR0dKh0dKh0dHR0dKioDHQMDAwMDKioDAyoqAwMDKioqKioqKgMDAyoqKiodHSodHR0DAyoqGBgYGBgYGBgYGB0dHR0dHR0dKioqKioqKioDHSodHR0dHR0qKiodHR0qHR0dHSoqKh0dKh0qHR0qKiodHSoqKh0dHSoqKh0dHR0dHR0dHR0dHSoqKioDAwMqKioDAwMqAwMDAyoqHSoqKioqKgMqKioqKioqKioqKioqKhgYGBgYGBgYGBgdHR0dHR0dHR0aHSoqKioqAwMDAwMdHR0dHR0dHSodHR0qHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0qHR0dHR0dHR0dHR0dHR0dHSoqAx0DAwMDAyoDAwMqAwMDAyoqKioqKioDAyodHR0qKh0qKh0dAwMqKhgYGBgYGBgYGBgqKioqKioqDR0dHR0dHR0dAwMDDR0dHR0dHR0dKh0dHSodHR0dHR0dHR0dHR0dHR0dHR0dHR0dHSodHR0dHR0dHR0dKh0dHR0dKioDHQMDAwMDKgMDAyoDAwMDKioqKioqKgMDKioqKioqHR0qHR0DAyoqGBgYGBgYGBgYGCodHQMqKioqKioqKioqKioDAwMDHR0dHR0dHR0dKh0dHSodHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHQMDHQMDAwMDKgMDAyoDAwMDHR0qKioqHR0dAx0dHR0dHR0dHR0DAyoqGBgYGBgYGBgYGB0dHR0dHR0dHRkdHR0dHR0qAwMDKh0dHR0dHR0dHR0dHR0dHR0dHSoqKh0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHSodHR0dHR0dHR0qHSoqHR0dHR0dHSoqKgMqKioqAwMDAwMDKgMqAwMDAwMDAwMqKioqKioYGBgYGBgYGBgYKioDAx0qKioqKioqKioqKikpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkqKioqGikpKSkpKSkpKSkpKSkpKR0YGBgYGBgYGBgYDAwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopKSopKikpKSkpKikpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSopKikpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKiopKSkpKSopKikpKSkpKSkqGBgYGBgYGBgYGCoqKSkpKSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqHQ0NDQ0dDQ0IDQ0MCBISEhISCB0SHR0dAwMdHR0dHR0YGBgYGBgYGBgYHR0dHR0dHR0dHQwDHQMdAxUQFRADAx0dHR0dHR0dKh0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHSoqKioDAwMDAwMDAwMDAwMDAwwDAx0dHR0dAwMDAwMDAwMDAwMqAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDKgwMHR0dHR0dAx0dHR0dHSodHQ0NDA0dHR0dHQgIKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKikpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkYGBgYGBgYGBgYDAwdHR0dKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpGBgYGBgYGBgYGCkpKSkpKR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dKh0qKioqKh0qKh0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJx0dHR0dHR0dHSodHR0dKiodHR0dHR0dKh0qHR0dHSoqHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0qHR0dHSoqHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dKh0dHR0qKh0dHR0dHR0qHR0dHSoqHR0dHR0dHR0dHR0dHR0dKh0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0qHR0dHSoqHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHSoqAwMDHQwdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0qKioqKiodHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0qKh0dHR0dHSoqDB0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHQwdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRUQKioqHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHQwMDB0dHR0dHR0dHR0dKioqKioqKh0dHR0dHR0dHR0dHR0dHR0dHQMDAwMqKioqKioqKiodHR0dHR0dHR0dHR0dHR0dHR0dAwMDDAwqKioqKioqKiodHR0dHR0dHR0dHR0dHR0dHR0DAyoqKioqKioqKioqKh0dHR0dHR0dHR0dHR0qHR0dKgMDKioqKioqKioqKioqKSkpKSkpKSkpKSkpKSkpKSkpKSkMDBQpDB0MGikpKioYGBgYGBgYGBgYKioqKioqHR0dHR0dHR0dHSoqKioqKh0dEhIMDA0dEhIdAwMDCAMYGBgYGBgYGBgYKioqKioqHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dKioqKioqKh0dHR0dAwMdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dAx0qKioqKh0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHSoqKioqKioqKiodHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dKgMDAwMDAwMDAwMDAyoqKioDAwMDAwMDAwMDAwMqKioqHSoqKhISGBgYGBgYGBgYGCkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSoqKSkpKSkqKioqKioqKioqKikpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKioqKikpKSkpKSkpKSkpKSkpKSkqKioqKioYGBgYGBgYGBgYKSoqKikpHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0DAwMDAyoqHR0pKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSopKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSoqAxgYGBgYGBgYGBgqKioqKioYGBgYGBgYGBgYKioqKioqKSkpKSkpKSkpKSkpKSkqKgMDAwMDAwMDAwMDAwMDAwMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqAwMDAwMdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHQMDAwMDAwMDAwMDAx0dHR0dHR0dKioqGBgYGBgYGBgYGAwMHQwMDAwdHR0dHR0dHR0dAwMDAwMDAwMDHR0dHR0dHR0dDAwqAwMDHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dAwMDAwMDAwMDAwMDAx0dGBgYGBgYGBgYGB0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dAwMDAwMDAwMDAwMDAwMqKioqKioqKh0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHQMDAwMDAwMDAwMDAwMDAwMDAwMDKioqDAwMDAwYGBgYGBgYGBgYKioqHR0dGBgYGBgYGBgYGB0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHQwMHR0dHR0dHR0dKioqKioqKh0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0qKh0dHR0dHR0dKioqKioqKioDAwMdAwMDAwMDAwMDAwMDAwMDAwMDAwMDHR0dHQMdHR0dHR0DHR0DAwMdKioqKioDAwMDAwMDAwMDAwMDCAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMIAwMDHR0dHR0dHR0dHR0dHR0dHR0dHR0dHSoqHR0dHR0dKiodHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHSoqHR0dHR0dKiodHR0dHR0dHSodKh0qHSodHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dKiodHR0dHSodHR0dHR0dHR0dHR0dHSoqHR0dHR0dKh0dHR0dHR0dHR0dHR0dHR0dHR0qKh0dHSodHR0dHR0dDR0qDAwMDAwMDAgMDAwHAwoDAwwIDAwLHBwdFhYVFhYWFRYcHB0dExMTDAAAAwMDAwMIGRkZGRkZGRkdFhYcFBQdHR0dFxUQFBQUHR0dHR0dHR0dHR0dDBkMDAwMHQwMDAYdHR0dKgMDAwMDAwMDAwMdHSoqHB0dHR0dHR0dFRAcHRwcHBwdHR0dHR0dHRUQKh0dHR0dHR0dHR0dHR0qKioaGhoaGhoaGRoaGhoaGhoaGhoaGhoaGRoaGhoZGhoZGhoaGhoaGhoaGhoaGhoaAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDKioqKioqKioqKioqKioqHR0dGR0cHR0dGR0dHR0dHR0dHRwdHRodHR0dHR0dHR0dHBwdHR0dHR0dHRwdHR0dHR0dHR0dHR0dHR0dHR0dHRwcHR0dHR0cHR0cHRwcHBwcHBwcHBwcHB0dHR0cHBwcHBwcHBwcHR0dHR0dHR0dHB0dKioqKhwcHBwcHBwcHBwdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRwdHB0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0cHRwcHR0dHBwdHRwdHR0cHRwaGh0cHR0dHRwdHRwcHBwdHRwdHB0cHBwcHBwdHB0dHR0dHBwcHB0dHR0cHB0dHR0dHR0dHB0dHRwdHR0dHRwdHR0dHR0dHR0dHR0dHBwdHRwcHBwdHRwcHR0cHB0dHR0dHR0dHR0dHR0dHR0cHB0dHBwdHR0dHR0dHR0dHR0dHB0dHRwdHR0dHR0dHR0dHRwdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHB0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dEx0dHR0dHR0dHR0dHR0dHR0VEBUQHR0dHR0dHB0dHR0dHR0kJB0dHR0dHR0dHR0dHR0VEB0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHSQkJCQdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0qKioqKioqKioqKioqKioqKioqKioqKioqHR0dHR0dHR0dHR0qKioqKioqKioqKioqKioqKioqKiocHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHR0dHRwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwdHR0dHR0dHR0dHRwcHBwcHBwcHBwcHBwcHBwdHRwcHBwdHR0dHR0dHR0dHBwdHBwcHBwcHB0dHR0dHR0dHBwdHRwcHR0dHRwcHR0dHRwcHB0dHB0dHBwcHB0dHR0dHR0dHR0dHR0dHR0cHBwcHR0dHR0dHR0dHB0dHR0dHR0dHR0dHR0dHR0kJCQkHRwcHR0cHR0dHRwcHR0dHSQkHBwkHSQkJB8kJB0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0kJCQdHR0dHB0cHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0cHB0cHBwdHCQcHB0cHB0cHR0dHR0dHR0dHR0dHR0dJB0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRwcHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0kJCQkJCQkJCQcHBwcJB0kJCQcJCQcHBwkJBwcJBwcJCQkHRwdHR0dHBwkHBwcHBwcJCQkJCQcJCQfJBwcJCQkJCQdHR0kJB8fHx8dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRwdHR0WFhYWFhYdEhIkHR0dFRAVEBUQFRAVEBUQFRAcHBwcHBwcHBwcHBwcHBwcHBwcHB0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dFRAdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dFRAVEBUQFRAVEB0dHR0dHR0dHR0dHR0dHR0VEBUQFRAVEBUQFRAVEBUQFRAVEBUQHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dFRAVEB0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dFRAdHR0dHR0dHR0dHR0dHR0dHR0dHR0cHBwcHB0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dKiodHR0dHR0dHR0dHR0dHR0dHR0dHR0dKh0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dAwMDHR0qKioqKhIMDAwdEgwdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHSodKioqKiodKiodHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dKioqKioqKh0MKioqKioqKioqKioqKioDHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0qKioqKioqKiodHR0dHR0dKh0dHR0dHR0qHR0dHR0dHSodHR0dHR0dKgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFhYWFhYWFhYWFhYWFhYMDAwMDAwMDB0MFQwdHRYWHR0WFhUQFRAVEBUQDAwMDBIdDAwdDAwdHR0dHQsLDAwMHQwMFQwMDAwMDAwMHQwdDAwdHR0SEhUQFRAVEBUQDCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiokJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCokJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkKioqKioqKioqKioqJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCoqKioqKioqKioqKioqKioqKioqKioqKioqJCQkJCQkJCQkJCQkKioqKgwQECQkFCQkFRAVEBUQFRAVECQkFRAVEBUQFRAUFRAQJCQkJCQkJCQkJAMDAwMDAyQkJCQkAyQkJCQkFBQkJCQqHiQeJB4kHiQeJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJB4kJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkHiQeJB4kJCQkJCQeJCQkJCQkHh4qKgMDFBQUFCQUHiQeJB4kHiQeJCQkJCQkJCQkJCQkJCQkJCQkJCQkJB4kJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkHiQeJB4kJCQkJCQeJCQkJCQkHh4kJCQkFB4UFCQqKioqKiQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQqJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkKioqKioqKioqKioqHh4eHh4eHh4eHh4eHh4eHiQkJCQkJCQkHBwcHBwcHBwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQUJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkKioqJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkKioqKioqKioqHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHQwMHR0dHR0dHR0dHR0dHQwSDB0dHR0dHR0dHR0dHR0dHR0YGBgYGBgYGBgYHR0qKioqKioqKioqKioqKioqKioqKh0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dAwMDAx0DAwMDAwMDAwMDHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dAwMdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0DAx0MDAwMDCoqKioqKioqHR0dHR0dHR0dHR0qKioqKh0dKh0qHR0dHR0qKioqKioqKioqKioqKioqKioqKioqKiodHR0dHR0dHR0dHR0dHQMdHR0DHR0dHQMdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHQMDAwMDHR0dHQMqKiodHR0dHR0dHRkdKioqKioqHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHQ0NEhIqKioqKioqKgMDHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0DAwMDAwMDAwMDAwMqKioqKioqKgwMGBgYGBgYGBgYGCoqKioqKgMDAwMDAwMDAwMDAwMDAwMDAx0dHR0dHR0dHR0NHR0DGBgYGBgYGBgYGB0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0DAwMDAwMDAwwMHR0dHR0dHR0dHR0dHR0dHQMDAwMDAwMDAwMDAwMqKioqKioqKioqKh0lJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSoqKgMDAwMdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHQMDAwMDAwMDAwMDAwMdHR0dHR0MDAwdHR0dKh0YGBgYGBgYGBgYKioqKh0dKSkpKSkpKSkpKSkpKSkpKRgYGBgYGBgYGBgpKSkpKSodHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHQMDAwMDAwMDAwMDAwMDKioqKioqKioqHR0dAx0dHR0dHR0dAwMqKhgYGBgYGBgYGBgqKh0MDAwpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSoqKioqKioqKioqKioqKioqKioqKioqKikpKSkpHR0dHR0dHR0dHR0DAwMDAwwMHR0dAwMqKioqKioqKiodHR0dHR0qKh0dHR0dHSoqHR0dHR0dKioqKioqKioqHR0dHR0dHSodHR0dHR0dKh0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dKioqKh0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dAwMDAwMDAwMMAwMqKhgYGBgYGBgYGBgqKioqKiohIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiISIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiEiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIhIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiKioqKioqKioqKioqJiYmJiYmJiYmJiYmJiYmJioqKionJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnKioqKgUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqHR0dHR0dHSoqKioqKioqKioqKh0dHR0dKioqKiojAyMjIyMjIyMjIyMdIyMjIyMjIyMjIyMjIyojIyMjIyojKiMjKiMjKiMjIyMjIyMjIyMdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0qKioqKioqKioqKioqKioqHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0QFR0dHR0dHR0dHR0dHR0dHR0qKh0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0qKioqKioqHSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqHR0dHR0dHR0dHR0dGR0dHQMDAwMDAwMDAwMDAwMDAwMXEBAXFxISFRATKioqKioqAwMDAwMDAwMDAwMDAwMDAyQkJCQkFRAVEBUQFRAVEBUQJCQVECQkJCQkJCQQJBAqFBQSEiQVEBUQFRAkJCQkJCQkJCokGhkkKioqKh0dHR0dKh0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0qKgYqEiQkGhkkJBUQJCQQJBAkJCQkJCQkJCQkJBQUJCQkEiQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJBUkECQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJBUkECQVEBAVEBAUJB4eHh4eHh4eHh4kJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQUFCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQqKiQkJCQkJCoqJCQkJCQkKiokJCQkJCQqKiQkJCoqKhkaJCQkGhoqHR0dHR0dHSoqKioqKioqKioDAwMPHCoqHR0dHR0dHR0dHR0qHR0qHQwMDCoqKiodHR0dHR0dHR0dHR0dAyoqHR0dHR0dAwMDAwMqKioqKh0dHR0dHR0dHR0dHR0dKgwdHR0dHSoqKioqKioqKioqHR0dKh0dKh0dHR0dHR0dHSodHR0dHR0dKh0dKioqHSodHR0dHR0dHR0qKioqKh0dHR0dHSoqHSodHR0dHR0qHR0qKiodKiodHR0dHR0qDB0dHR0dHR0dKh0dKioqKiodHR0dHR0dHR0dHR0qKioMHQMDAyoDAyoqKioqAwMDAx0dHR0dHSoqAwMDKioqKgMMDAwMDAwMDB0qKioqKioqHR0dHR0DAyoqKiodHR0dHQwMDAwMDBMqKioqKioqKiodHR0dHR0qKioMDAwMDAwMHR0qKioqKioqHR0dHSoqKh0dHR0dHR0dHR0qAwMMKioDHR0dHR0dHR0dKioqKioqHR0DAwMDHR0dHSoqKioqKgMDAwMDAwMMDB0dHR0dKioDHR0DAx0qKioqKioqKioDAwMDAwMDAwMDAx0dHQwMAyoqKioqKioqKiodKioDAwMDAyoYGBgYGBgYGBgYDAwMDB0DAx0qKioqKioqKh0dHQMdDR0qKioqKioqKioDHR0dHQwMHQwDAwMDHQMDGBgYGBgYGBgYGB0NHQwMDAMDAwMDAwMDDAwdDAwdAx0DKioqKioqKioqKioqKiodHR0dHR0dKh0qHR0dHSodHR0dHR0dHR0MKioqKioqAwMDAyodHR0dHR0dHSoqHSodHSodHR0dHSoDAx0DAx0qKioqKioDKioqKiodHR0DAyoqAwMDAwMDAyoqKgMDAwMDAwMdHR0dDAwMDB0YGBgYGBgYGBgYDAwqHQMdAwMDAx0dHR0qKioqKioqKgMDAwMDAyoqAwMDAwMDAwMNDAwSEh0dHQwMDAwMDAwMHR0dHQMDKioDDAwdHSoqKioqKioqKioqDQ0NDQ0NDQ0NDQ0NDSoqKgMDAwMDAwMDHR0qKioqKioYGBgYGBgYGBgYKSkMDAwpHR0dHR0dHSoqHSoqHR0dHSodHSodHR0dHR0dHQMDAwMDAyoDAyoqAwMDAx0DAwwMDCoqKioqKioqKh0DAwMDAwMDKioDAwMDAwMdDR0DKioqKioqKioqKiodHR0DAwMDAwMDHQMDAwMNHQwMDAwNHQMqKioqKioqKh0DAwMDAwMDAwMDAx0dHR0DAwMDAwMDAwMDDAwMHQ0NDAwqKioqKioqKioqKioqDQ0NDQ0NDQ0NDSoqKioqKh0MDAwMDCoqKioqKioqKioNEh0dHR0dHR0dHR0dHR0dAwMDAwMDKioqAyoDAyoDAwMDAwMdAyoqKioqKioqHR0dHR0dKh0dKh0dHR0dHQMDKgMDAwMDHSoqKioqKiodHR0DAwMDHR0qKioqKioqAwMdAx0dHR0dHR0dHR0dHQMDAwMDAwMqKioDAwMMDCQkJCQkJCQkJCQkHR0dHR0dHR0dHR0dHRkZGR0dHR0dHR0dHR0dHR0dHSoqKioqKioqKioqKioMDAwMDCoqKioqKioqKioqHR0dHR0dHR0VFRUQEBAdHRAdHR0VEBUQHR0dHR0dHR0dFRAQHR0dHQgICAgICAgVEAgICBUQFRADHR0dHR0dAwMDAwMDAwMDGBgYGBgYGBgYGCoqKioMDAMDAwMDDCoqKioqKioqKioDAwMDAwMDDAwMHR0dHR0dDB0qKioqKioqKioqGBgYGBgYGBgYGCodHR0dHR0dDAwdHSoqKioqAwMDAwMDAwMqKioqKioqAxQUFBQIKioqKioqKioqKioeKioqKioqKioqKioqKh4eHioqHioqKioqKioqKioeHh4eKioqKioqKiodHR0dHR0dHR0dKiodAwMMHR0dHR0DAwMDAx0dHQMDAx0dAwMDAwMDAx0dHR0dHR0dHR0DAwMDHR0DAwMdKioqKioqKioqKh0qKh0dKiodHR0dKh0dHR0dHR0dHR0qHSodHR0dHSodKioqHR0dHR0dHR0dHR0dKioYGBgYGBgYGBgYGBgYGBgYHR0dHR0DHR0dHR0dHR0dHQMdHQwMDAwdKioqKiodHR0dHR0qKioqKgMDAwMDAwMDAyoqAwMDAwMqAwMqAwMDAwMqKioqKgMDAwMDAwMdHR0dHR0dKiodHR0dHR0dHR0dHR0dHQMqGBgYGBgYGBgYGCoqKioqGh0dHR0dHR0qHR0dHSodHSodHR0dAwMDAwMDAx0qKioqGBgYGBgYGBgYGCoqKioVFRkdHR0dKioqKioqKioqKiodHSodKiodKh0dHR0dHR0qHR0dHSodKh0qKioqHSoqKiodKh0qHSodHR0qHR0qHSoqHSodKh0qHSodHSodKiodHR0dKh0dHR0qHR0dHSodKh0dHSodHR0dHSodHR0dHRwcHBwcHBwcHBwcHBwkJCQcHBwcHBwcHBwcHR0dJCQkJCQkKCgoKCgoKCgoKCgoKCgoKCQkJCQkHyQkJCQkJCQkJCQkJB0dJCQkJCQdJCQkHx8fJCQfJCQfHx8kJCQkJCQkJCQkJCAgICAgJCQfHyQkHx8fHx8fHx8fHyQkJCQkJCQkJCQkJCQkJB8fHx8fHx8fHx8kJCQfJCQkHx8fJB8fHyQkJCQkJCQfJCQkJCQkJCQkJCQk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VVVVVVVVAEHc/+IACylVVVVVVdVVVVVVVVVVVVVVVVVVVRUAUFVVVVVVVVVVVVVVVVVVVVVVAQBBj4DjAAu0ARBBEFVVVVVVVVVVVVVVVVVVVVFVVQAAQFRVVVVVVVVVVVVVFQAAAAAAVVVVVVRVVVVVVVVVVQUAFAAUBFBVVVVVVVVVFVFVVVVVVVVVAAAAAAAAQFVVVVVVVVVVVVVVVVVVVVVVVVVVVVUFAABUVVVVVVVVVVVVVVVVVRUAAFVVUVVVVVVVBRAAAAEBUFVVVVVVVVVVVVUBVVVVVVVVVVVVVVVVVVBVAABVVVVVVVVVVVVVBQBB0IHjAAvjDUBVVVVVVVVVVVVVVVVVRVQBAFRRAQBVVQVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVRAFUVVFVFVVVBVVVVVVVVUVBVVVVVVVVVVVVVVVVVVVUQRUUUFFVVVVVVVVVUFFVVQEQVFFVVVVVBVVVVVVVBQBRVVVVVVVVVVVVVVVVVVUEAVRVUVUBVVUFVVVVVVVVVUVVVVVVVVVVVVVVVVVVVUVUVVVRVRVVVVVVVVVVVVVVVFRVVVVVVVVVVVVVVVVVBFQFBFBVQVVVBVVVVVVVVVVRVVVVVVVVVVVVVVVVVVUURAUEUFVBVVUFVVVVVVVVVVBVVVVVVVVVVVVVVVVVFUQBVFVRVRVVVQVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVVVVVRRUFRFUVVVVVVVVVVVVVVVVVVVVVVVVVVVVRAEBVVRUAQFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVEAAFRVVQBAVVVVVVVVVVVVVVVVVVVVVVVVUFVVVVVVVRFRVVVVVVVVVVVVVVVVVQEAAEAABFUBAAABAAAAAAAAAABUVUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAQQAQUFVVVVVVVVQBVRVVVUBVFVVRUFVUVVVVVFVVVVVVVVVVaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqgAAAAAAAAAAVVVVVVVVVQFVVVVVVVVVVVVVVVUFVFVVVVVVVQVVVVVVVVVVBVVVVVVVVVUFVVVVVVVVVVVVVVVVVVVVVRAAUFVFAQAAVVVRVVVVVVVVVVVVVRUAVVVVVVVVVVVVVVVVVUFVVVVVVVVVVVFVVVVVVVVVVVVVVVVVQBVUVUVVAVVVVVVVVRUUVVVVVVVVVVVVVVVVVVVFAEBEAQBUFQAAFFVVVVVVVVVVVVVVVQAAAAAAAABAVVVVVVVVVVVVVVVVAFVVVVVVVVVVVVVVVQAAUAVVVVVVVVVVVVUVAABVVVVQVVVVVVVVVQVQEFBVVVVVVVVVVVVVVVVVRVARUFVVVVVVVVVVVVVVVVVVAAAFVVVVVVVVQAAAAAQAVFFVVFBVVVUVANd/X19//wVA913VdVVVVVVVVVVVAAAAAFVXVVX9V1VVVVVVVVVVVVdVVVVVVVVVVQAAAAAAAAAAVFVVVdVdXVXVdVVVfVVVVVVVVVVVVVVV1VfVf////1X//19VVVVdVf///1VVVVV1VVVfVVVVVfV1V1VVVdVVVVVVVVX319/XXV11/df//3dV/1VfXVVfV3VVVVV///X1X1VVVfX/X1VVXV1VVV1VVVVVVdVVVVVVdVWlVVVVaVVVVVVVVVVVVVVVVVVVValWllVVVVVVVVVVVVVV/////////////////////////////////////////////9///////////1X///////////9VVVX/////9V9VVd//X1X19VVfX/XX9V9VVVX1X1XVVVVVaVV9XfVVWlV3VVVVVVVVVVV3VaqqqlVVVd/ff99VVVWVVVVVVZVVVfVZVaVVVVVV6VX6/+///v//31Xv/6/77/tVWaVVVVVVVVVVVlVVVVVdVVVVZpWaVVVVVVVVVfX//1VVVVVVqVVVVVVVVVZVVZVVVVVVVVWVVlVVVVVVVVVVVVVVVVb5X1VVVVVVVVVVVVVVVVVVVVVVVVVVFVBVVVVVVVVVVVVVVVVVVVVVVVUVVVVVVVVVVVUAAAAAAAAAAKqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqVVVVqqqqqqpaVVVVVVVVqqqqqqqqqqqqqqqqqqoKAKqqqmqpqqqqqqqqqqqqqqqqqqqqqqqqqqpqgaqqqqqqqqqqqlWpqqqqqqqqqqqqqqmqqqqqqqqqqqqqqqqoqqqqqqqqqqqqaqqqqqqqqqqqqqqqqqqqqqqqqqqqqlVVlaqqqqqqqqqqqqqqaqqqqqqqqqqqqqr//6qqqqqqqqqqqqqqqqqqqlaqqqqqqqqqqqqqqqqqalVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVQAAAUFVVVVVVVVUFVVVVVVVVVVVVVVVVVVVVVVVVVVVQVVVVRUUVVVVVVVVVQVVUVVVVVVVQVVVVVVVVAAAAAFBVRRVVVVVVVVVVVVUFAFBVVVVVVRUAAFBVVVWqqqqqqqqqVkBVVVVVVVVVVVVVVRUFUFBVVVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVVVQFAQUFVVRVVVVRVVVVVVVVVVVVVVVRVVVVVVVVVVVVVVVUEFFQFUVVVVVVVVVVVVVVQVUVVVVVVVVVVVVVVVVFUUVVVVVWqqqqqqqqqqqpVVVUAAAAAAEAVAEG/j+MAC6EIVVVVVVVVVVVFVVVVVVVVVVUAAAAAqqpaVQAAAACqqqqqqqqqqmqqqqqqaqpVVVVVVaqqqqqqqqqqVlVVVVVVVVVVVVVVVVVVBVRVVVVVVVVVVVVVVVVVVVWqalVVAABUXVVVVVVVVVVVVVVVVVVVVVFVVVVVVVVVVVRVVVVVVVVVVVVVVVVVVVVVVVVVVQVAVQFBVQBVVVVVVVVVVVVVQBVVVVVVVVVVVVVBVVVVVVVVVVVVVVVVVVVVAFVVVVVVVVVVVVVVVVVVVVUVVFVVVVVVVVVVVVVVVVVVVVVVVVUBVQUAAFRVVVVVVVVVVVVVVQVQVVVVVVVVVVVVVVVVVVVRVVVVVVVVVVVVVVVVVQAAAEBVVVVVVVVVVVVVFFRVFVBVVVVVVVVVVVVVVRVAQVVFVVVVVVVVVVVVVVVVVVVVQFVVVVVVVVVVFQABAFRVVVVVVVVVVVVVVVVVVRVVVVVQVVVVVVVVVVVVVVVVBQBAVVUBFFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFVAEVUVVVVVVVVVVFRUAQFVVVVVVVFVVVVUVVVVVBQBUAFRVVVVVVVVVVVVVVVVVVVVVAAAFRFVVVVVVRVVVVVVVVVVVVVVVVVVVVVVVVVVVFABEEQRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRUFUFUQVFVVVVVVVVBVVVVVVVVVVVVVVVVVVVVVVVVVVRUAQBFUVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRVRABBVVVVVVVVVVVUBBRAAVVVVVVVVVVVVVVVVVVVVVRUAAEFVVVVVVVVVVVVVVVVVVFUVRBVVVVVVVVVVVVVVVVVVVVVVVVVVVQAFVVRVVVVVVVVVAQBAVVVVVVVVVVVVFQAUQFUVVVUBQAFVVVVVVVVVVVVVVQUAAEBQVVVVVVVVVVVVVVVVVVVVVVVVVVVVAEAAEFVVVVUFAAAAAAAFAARBVVVVVVVVVVVVVVVVVVUBQEUQABBVVVVVVVVVVVVVVVVVVVVVVVVQEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUVVFVVUFVVVVVVVVVVVVVVVQVAVURVVVVVVVVVVVVVVVVVVVVUFQAAAFBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAFRVVVVVVVVVVVVVVVVVVQBAVVVVVVUVVVVVVVVVVVVVVVVVVVVVFUBVVVVVVVVVVVVVVVVVVVVVVVVVqlRVVVpVVVWqqqqqqqqqqqqqqqqqqlVVqqqqqqpaVVVVVVVVVVVVVaqqVlVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVWqqappqqqqqqqqqqpqVVVVZVVVVVVVVVVqWVVVVapVVaqqqqqqqqqqqqqqqqqqqqqqqqpVVVVVVVVVVUEAVVVVVVVVVQBB65fjAAtFUAAAAAAAQFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVEVAFAAAAAEABAFVVVVVVVVUFUFVVVVUFVFVVVVVVVVVVVVVVVVVVAEG9mOMACwJAFQBBy5jjAAv4BlRVUVVVVVRVVVVVFQABAAAAVVVVVQBAAAAAABQAEARAVVVVVVVVVVVVVVVVVVVVVUVVVVVVVVVVVVVVVVVVVVUAVVVVVVVVVVUAQFVVVVVVVVVVVVVVAEBVVVVVVVVVVVVVVVVVVVZVVVVVVVVVVVVVVVVVVVVVVZVVVVVVVVVVVVVVVVX//39V/////////1///////////////////19V/////////++rqur/////V1VVVVVqVVVVqqqqqqqqqqqqqqpVqqpWVVpVVVWqWlVVVVVVVaqqqqqqqqqqVlVVqaqaqqqqqqqqqqqqqqqqqqqqqqqmqqqqqqpVVVWqqqqqqqqqqqqqapWqVVVVqqqqqlZWqqqqqqqqqqqqqqqqqqqqqqpqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpaqqqqqqqqqqqqqqqqqqqpaVVWVaqqqqqqqqlVVVVVlVVVVVVVVaVVVVVZVVVVVVVVVVVVVVVVVVVVVVVVVVZWqqqqqqlVVVVVVVVVVVVVVVapaVVZqqVWqVVWVVlWqqlZVVVVVVVVVVaqqqlVWVVVVVVVVqqqqqqqqqqqqqqpqqqqaqqqqqqqqqqqqqqqqqqpVVVVVVVVVVVVVVVWqqqpWqqpWVaqqqqqqqqqqqqqqmqpaVaWqqqpVqqpWVaqqVlX///////////////////9fRW1wdHlJbnZhbGlkRGlnaXRQb3NPdmVyZmxvd05lZ092ZXJmbG93WmVybzAxMjM0NTY3ODlhYmNkZWYvaG9tZS9ub2RlL2hvbWUvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tNmYxN2QyMmJiYTE1MDAxZi91dWlkLTEuMTAuMC9zcmMvZm10LnJzAACbzhgAWwAAALkAAAANAAAAm84YAFsAAACxAAAAFQAAAJvOGABbAAAAtAAAAA0AAACbzhgAWwAAALUAAAANAAAAL2hvbWUvbm9kZS9ob21lLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTZmMTdkMjJiYmExNTAwMWYvd2FzbS1iaW5kZ2VuLTAuMi45NS9zcmMvY2FjaGUvaW50ZXJuLnJzOM8YAGwAAAAbAAAAKwAAAAAAAAD//////////7jPGABB0J/jAAvqAVRyaWVkIHRvIHNocmluayB0byBhIGxhcmdlciBjYXBhY2l0edDPGAAkAAAAL3J1c3RjLzkwYjM1YTYyMzljM2Q4YmRhYmM1MzBhNmEwODE2ZjdmZjg5YTBhYWYvbGlicmFyeS9hbGxvYy9zcmMvcmF3X3ZlYy5yc/zPGABMAAAApgIAAAkAAABKc1ZhbHVlKCkAAABY0BgACAAAAGDQGAABAAAAY2xvc3VyZSBpbnZva2VkIHJlY3Vyc2l2ZWx5IG9yIGFmdGVyIGJlaW5nIGRyb3BwZWQAAI0FAAAEAAAABAAAAI4FAACPBQBBxKHjAAuABAEAAACQBQAAY2Fubm90IGFjY2VzcyBhIFRocmVhZCBMb2NhbCBTdG9yYWdlIHZhbHVlIGR1cmluZyBvciBhZnRlciBkZXN0cnVjdGlvbi9ydXN0Yy85MGIzNWE2MjM5YzNkOGJkYWJjNTMwYTZhMDgxNmY3ZmY4OWEwYWFmL2xpYnJhcnkvc3RkL3NyYy90aHJlYWQvbG9jYWwucnMAAAAS0RgATwAAAAQBAAAaAAAAL2hvbWUv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AAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAALrAQADawEAA+sBAARrAQAE6wEABWsBAAXrAQAGawEABusBAAdrAQAH6wEACGsBAAjrAQAJawEACesBAAprAQAK6wEAC2sBAAvrAQAMawEADOsBAA1rAQAN6wEADmsBAA7rAQAPawEAD+sBAABrEQAA6xEAAWsRAAHrEQACaxEAAusRAANrEQAD6xEABGsRAATrEQAFaxEABesRAAZrEQAG6xEAB2sRAAfrEQAIaxEACOsRAAlrEQAJ6xEACmsRAArrEQALaxEAC+sRAAxrEQAM6xEADWsRAA3rEQAOaxEADusRAA9rEQAP6xEAAGshAADrIQABayEAAeshAAJrIQAC6yEAA2shAAPrIQAEayEABOshAAVrIQAF6yEABmshAAbrIQAHayEAB+shAAhrIQAI6yEACWshAAnrIQAKayEACushAAtrIQAL6yEADGshAAzrIQANayEADeshAA5rIQAO6yEAD2shAA/rIQAAazEAAOsxAAFrMQAB6zEAAmsxAALrMQADazEAA+sxAARrMQAE6zEABWsxAAXrMQAGazEABusxAAdrMQAH6zEACGsxAAjrMQAJazEACesxAAprMQAK6zEAC2sxAAvrMQAMazEADOsxAA1rMQAN6zEADmsxAA7rMQAPazEAD+sxAABrQQAA60EAAWtBAAHrQQACa0EACcrBAAoqwQAKisEACurBAAtKwQALqsEADArBAAxqwQAMysEADSrBAA2KwQAN+sEADmrBAA7awQAPSsEAD7rBAAAq0QAAmtEAAQrRAAF60QAB6tEAAlrRAALK0QADOtEAA6rRAAQa0QAEitEABPrRAAVq0QAF2tEABkrRAAa60QAHKtEAB5rRAAgK0QAIetEACOrRAAla0QAJytEACjrRAAqq0QALGtEAC4rRAAv60QAMatEADNrRAA1K0QANutEADirRAA6a0QAPCtEAD3rRAA/q0QAAWuEAAMrhAAE64QABquEAAhrhAAKK4QAC+uEAA2rhAAPa4QAESuEABLrhAAUq4QAFmuEABgrhAAZ64QAG6uEAB1rhAAfK4QAIOuEACKrhAAka4QAJiuEACfrhAApq4QAK2uEAC0rhAAu64QAMKuEADJrhAA0K4QANeuEADerhAA5a4QAOyuEADzrhAA+q4QAAGvEAAIrxAAD68QABavEAAdrxAAJK8QACuvEAAyrxAAOa8QAECvEABHrxAATq8QAFavEABerxAAZq8QAG6vEAB2rxAAfq8QAIavEACOrxAAlq8QAJ6vEACmrxAArq8QALavEAC+rxAAxq8QAM6vEADWrxAA3q8QAOavEADurxAA9q8QAP6vEAAGsBAADrAQABawEAAesBAAJrAQAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAEpsQABSbEAAWmxAAGJsQABqbEAAcmxAAHpsQACCbEAAimxAAJJsQACebEAAqmxAALZsQADCbEAAzmxAANpsQADmbEAB8qxAAjKsQAJyrEACsqxAArKsQALyrEADMqxAA3KsQAOyrEAD8qxAADKwQABysEAAsrBAAPKwQAEysEABcrBAAbKwQAHysEACMrBAA7KMQAOyjEADsoxAA7KMQAOyjEADsoxAA7KMQAOyjEADsoxAA7KMQAOyjEADsoxAA7KMQAOyjEADsoxAA7KMQAOyjEADsoxAA7KMQAOyjEADsoxAA7KMQAOyjEADsoxAA7KMQAOyjEADsoxAA7KMQAOyjEADsoxAA7KMQAOyjEADsoxAA7KMQAOyjEADsoxAA7KMQAOyjEADsoxAA7KMQAOyjEADsoxAA7KMQAOyjEADsoxAA7KMQAOyjEADsoxAA7KMQAOyjEADsoxAA7KMQAOyjEADsoxAA7KMQAOyjEADsoxAA7KMQAOyjEADsoxAA7KMQAOyjEADsoxAA7KMQAOyjEADsoxAA7KMQAOyjEADsoxAA7KMQAOyjEADsoxAA7KMQAOyjEADsoxAA7KMQAOyjEADsoxAA7KMQAOyjEADsoxAA7KMQAOyjEADsoxAA7KMQAOyjEADsoxAA7KMQAOyjEADsoxAA7KMQAOyjEADsoxAA7KMQAOyjEADsoxAA7KMQAOyjEADsoxAA7KMQAOyjEADsoxAA7KMQAOyjEADsoxAA7KMQAOyjEADsoxAA7KMQAOyjEAD8oxAADKQQABykEAAspBAAPKQQAEykEABcpBAAbKQQAHykEACMpBAAnKQQAKykEAC8pBAAzKQQANykEADspBAA/KQQAAylEAAcpRAALKUQADylEABMpRAAXKUQAFylEABspRAAfKUQAIylEACcpRAArKUQALylEADMpRAA3KUQAOylEAD8pRAADKYQAAymEAAcphAALKYQADymEABMphAAXKYQAFymEABsphAAfKYQAIymEACcphAArKYQALymEADMphAA3KYQAOymEAD8phAA/KYQAAynEAAcpxAALKcQADynEABMpxAAXKcQAGynEAB8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uxAALrQQADS0EAA6tBAAQLQQAEa0EABMtBAAUrQQAFi0EABetBAAZLQQAGq0EABxtBAAeLQQAH+0EACGtBAAjbQQAJS0EACbtBAAorQQAKm0EACwtBAAt7QQAL60EADFtBAAzLQQANO0EADatBAA4bQQAOi0EADvtBAA9rQQAP20EAAEtRAAC7UQABK1EAAZtRAAILUQACe1EAAutRAANbUQADy1EABDtRAASrUQAFG1EABYtRAAX7UQAGa1EABttRAAdLUQAHu1EACCtRAAibUQAJC1EACXtRAAnrUQAKW1EACstRAAs7UQALq1EADBtRAAyLUQAM+1EADWtRAA3bUQAOS1EADrtRAA8rUQAPm1EAAAthAAB7YQAA62EAAVthAAHLYQACO2EAAqthAAMbYQADi2EAA/thAARrYQAE22EABUthAAW7YQAGK2EABpthAAcLYQAHe2EAB+thAAhbYQAIy2EACTthAAmrYQAKG2EACothAAr7YQALa2EAC9thAAxLYQAMu2EADSthAA2bYQAOC2EADothAA8LYQAPi2EAAAtxAACLcQABC3EAAYtxAAILcQACi3EAAwtxAAOLcQAEC3EABItxAAULcQAFi3EABgtxAAaLcQAHC3EAB4txAAgLcQAIi3EACQtxAAmLcQAKC3EACotxAAsLcQALi3EAALAAAACAAAAAQAAAAGAAAABgAAABQAAABI2RAAU9kQAFvZEABf2RAAZdkQAGvZEAADAAAACAAAAAQAAAB95xAA2N0QALA3GAABAAAAAgAAAAQAAAAIAAAAEAAAACAAAABAAAAAgAAAAAABAAAAAgAAAAQAAAAIAAAAEAAAACAAAABAAAAAgAAAAAABAAAAAgACAAAAAQAAAAgAAAAEAAAAIAAAABAAAABAAAAAgAAAAAABAAAAAgAAAAgAAAAEAAAAIAAAABAAAACAAAAAQAAAAAACAAAAAQAFAAAAAwAAAAcAAAAFAAAACQAAAAcAAAAJAAAADwAAAAsAAAARAAAADgAAAAwAAAAQAAAADgAAABIAAAAQAAAAFAAAABIAAACjGREAqBkRAKsZEQCyGREAtxkRAMAZEQDHGREA0BkRAN8ZEQDqGREA+xkRAAkaEQAVGhEAJRoRADMaEQBFGhEAVRoRAGkaEQBBAAAAegAAAF4AAAAkAAAAcgAAAFIAAABi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", "base64"); var wasmModule = new WebAssembly.Module(bytes); var wasmInstance = new WebAssembly.Instance(wasmModule, imports); wasm = wasmInstance.exports; diff --git a/deps/amaro/dist/package.json b/deps/amaro/dist/package.json index 32e28ed92d2244..883982e8aac265 100644 --- a/deps/amaro/dist/package.json +++ b/deps/amaro/dist/package.json @@ -4,7 +4,7 @@ "강동윤 " ], "description": "wasm module for swc", - "version": "1.7.40", + "version": "1.10.3", "license": "Apache-2.0", "repository": { "type": "git", diff --git a/deps/amaro/package.json b/deps/amaro/package.json index 4d18ffd8ea1a06..d140f52bf7a313 100644 --- a/deps/amaro/package.json +++ b/deps/amaro/package.json @@ -1,6 +1,6 @@ { "name": "amaro", - "version": "0.2.0", + "version": "0.2.1", "description": "Node.js TypeScript wrapper", "license": "MIT", "type": "commonjs", @@ -22,6 +22,7 @@ "prepack": "npm run build", "postpack": "npm run clean", "build": "node esbuild.config.mjs", + "build:wasm": "node tools/build-wasm.js", "typecheck": "tsc --noEmit", "test": "node --test --experimental-test-snapshots \"**/*.test.js\"", "test:regenerate": "node --test --experimental-test-snapshots --test-update-snapshots \"**/*.test.js\"" diff --git a/deps/cares/CMakeLists.txt b/deps/cares/CMakeLists.txt index f6560d56b08ddd..139defd8ffd159 100644 --- a/deps/cares/CMakeLists.txt +++ b/deps/cares/CMakeLists.txt @@ -1,6 +1,6 @@ # Copyright (C) The c-ares project and its contributors # SPDX-License-Identifier: MIT -CMAKE_MINIMUM_REQUIRED (VERSION 3.5.0) +CMAKE_MINIMUM_REQUIRED (VERSION 3.5.0...3.10.0) list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/") @@ -12,7 +12,7 @@ INCLUDE (CheckCSourceCompiles) INCLUDE (CheckStructHasMember) INCLUDE (CheckLibraryExists) -PROJECT (c-ares LANGUAGES C VERSION "1.34.3" ) +PROJECT (c-ares LANGUAGES C VERSION "1.34.4" ) # Set this version before release SET (CARES_VERSION "${PROJECT_VERSION}") @@ -30,7 +30,7 @@ INCLUDE (GNUInstallDirs) # include this *AFTER* PROJECT(), otherwise paths are w # For example, a version of 4:0:2 would generate output such as: # libname.so -> libname.so.2 # libname.so.2 -> libname.so.2.2.0 -SET (CARES_LIB_VERSIONINFO "21:2:19") +SET (CARES_LIB_VERSIONINFO "21:3:19") OPTION (CARES_STATIC "Build as a static library" OFF) @@ -271,6 +271,8 @@ ELSEIF (CMAKE_SYSTEM_NAME STREQUAL "AIX") LIST (APPEND SYSFLAGS -D_ALL_SOURCE -D_XOPEN_SOURCE=700 -D_USE_IRS) ELSEIF (CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") # Don't define _XOPEN_SOURCE on FreeBSD, it actually reduces visibility instead of increasing it +ELSEIF (CMAKE_SYSTEM_NAME STREQUAL "QNX") + LIST (APPEND SYSFLAGS -D_QNX_SOURCE) ELSEIF (WIN32) LIST (APPEND SYSFLAGS -DWIN32_LEAN_AND_MEAN -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -D_WIN32_WINNT=0x0602) ENDIF () @@ -406,6 +408,7 @@ ENDIF () CHECK_STRUCT_HAS_MEMBER("struct sockaddr_in6" sin6_scope_id "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID LANGUAGE C) +CHECK_SYMBOL_EXISTS (strnlen "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_STRNLEN) CHECK_SYMBOL_EXISTS (memmem "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_MEMMEM) CHECK_SYMBOL_EXISTS (closesocket "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_CLOSESOCKET) CHECK_SYMBOL_EXISTS (CloseSocket "${CMAKE_EXTRA_INCLUDE_FILES}" HAVE_CLOSESOCKET_CAMEL) diff --git a/deps/cares/Makefile.am b/deps/cares/Makefile.am index e99161a45f7883..51b5f6be32be78 100644 --- a/deps/cares/Makefile.am +++ b/deps/cares/Makefile.am @@ -3,17 +3,24 @@ # Copyright (C) the Massachusetts Institute of Technology. # Copyright (C) Daniel Stenberg # -# Permission to use, copy, modify, and distribute this -# software and its documentation for any purpose and without -# fee is hereby granted, provided that the above copyright -# notice appear in all copies and that both that copyright -# notice and this permission notice appear in supporting -# documentation, and that the name of M.I.T. not be used in -# advertising or publicity pertaining to distribution of the -# software without specific, written prior permission. -# M.I.T. makes no representations about the suitability of -# this software for any purpose. It is provided "as is" -# without express or implied warranty. +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice (including the next +# paragraph) shall be included in all copies or substantial portions of the +# Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. # # SPDX-License-Identifier: MIT # diff --git a/deps/cares/Makefile.in b/deps/cares/Makefile.in index ba78cb77cbe335..2342125d136526 100644 --- a/deps/cares/Makefile.in +++ b/deps/cares/Makefile.in @@ -19,17 +19,24 @@ # Copyright (C) the Massachusetts Institute of Technology. # Copyright (C) Daniel Stenberg # -# Permission to use, copy, modify, and distribute this -# software and its documentation for any purpose and without -# fee is hereby granted, provided that the above copyright -# notice appear in all copies and that both that copyright -# notice and this permission notice appear in supporting -# documentation, and that the name of M.I.T. not be used in -# advertising or publicity pertaining to distribution of the -# software without specific, written prior permission. -# M.I.T. makes no representations about the suitability of -# this software for any purpose. It is provided "as is" -# without express or implied warranty. +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice (including the next +# paragraph) shall be included in all copies or substantial portions of the +# Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. # # SPDX-License-Identifier: MIT # @@ -111,7 +118,9 @@ build_triplet = @build@ host_triplet = @host@ subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ +am__aclocal_m4_deps = $(top_srcdir)/m4/ares_check_user_namespace.m4 \ + $(top_srcdir)/m4/ares_check_uts_namespace.m4 \ + $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ $(top_srcdir)/m4/ax_ac_print_to_file.m4 \ $(top_srcdir)/m4/ax_add_am_macro_static.m4 \ $(top_srcdir)/m4/ax_am_macros_static.m4 \ @@ -121,8 +130,6 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_check_gnu_make.m4 \ $(top_srcdir)/m4/ax_check_link_flag.m4 \ - $(top_srcdir)/m4/ax_check_user_namespace.m4 \ - $(top_srcdir)/m4/ax_check_uts_namespace.m4 \ $(top_srcdir)/m4/ax_code_coverage.m4 \ $(top_srcdir)/m4/ax_compiler_vendor.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ diff --git a/deps/cares/Makefile.msvc b/deps/cares/Makefile.msvc index 8395d1a7d67728..3266db415e09fe 100644 --- a/deps/cares/Makefile.msvc +++ b/deps/cares/Makefile.msvc @@ -1,17 +1,24 @@ # Copyright (C) 2009-2013 by Daniel Stenberg # -# Permission to use, copy, modify, and distribute this -# software and its documentation for any purpose and without -# fee is hereby granted, provided that the above copyright -# notice appear in all copies and that both that copyright -# notice and this permission notice appear in supporting -# documentation, and that the name of M.I.T. not be used in -# advertising or publicity pertaining to distribution of the -# software without specific, written prior permission. -# M.I.T. makes no representations about the suitability of -# this software for any purpose. It is provided "as is" -# without express or implied warranty. +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice (including the next +# paragraph) shall be included in all copies or substantial portions of the +# Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. # # SPDX-License-Identifier: MIT diff --git a/deps/cares/RELEASE-NOTES.md b/deps/cares/RELEASE-NOTES.md index f9d58d278432f1..19a204b3ea96bd 100644 --- a/deps/cares/RELEASE-NOTES.md +++ b/deps/cares/RELEASE-NOTES.md @@ -1,97 +1,25 @@ -## c-ares version 1.34.3 - November 9 2024 +## c-ares version 1.34.4 - December 14 2024 This is a bugfix release. Changes: -* Build the release package in an automated way so we can provide - provenance as per [SLSA3](https://slsa.dev/). - [PR #906](https://github.com/c-ares/c-ares/pull/906) +* QNX Port: Port to QNX 8, add primary config reading support, add CI build. [PR #934](https://github.com/c-ares/c-ares/pull/934), [PR #937](https://github.com/c-ares/c-ares/pull/937), [PR #938](https://github.com/c-ares/c-ares/pull/938) Bugfixes: -* Some upstream servers are non-compliant with EDNS options, resend queries - without EDNS. [Issue #911](https://github.com/c-ares/c-ares/issues/911) -* Android: <=7 needs sys/system_properties.h - [a70637c](https://github.com/c-ares/c-ares/commit/a70637c) -* Android: CMake needs `-D_GNU_SOURCE` and others. - [PR #915](https://github.com/c-ares/c-ares/pull/914) -* TSAN warns on missing lock, but lock isn't actually necessary. - [PR #915](https://github.com/c-ares/c-ares/pull/915) -* `ares_getaddrinfo()` for `AF_UNSPEC` should retry IPv4 if only IPv6 is - received. [765d558](https://github.com/c-ares/c-ares/commit/765d558) -* `ares_send()` shouldn't return `ARES_EBADRESP`, its `ARES_EBADQUERY`. - [91519e7](https://github.com/c-ares/c-ares/commit/91519e7) -* Fix typos in man pages. [PR #905](https://github.com/c-ares/c-ares/pull/905) +* Empty TXT records were not being preserved. [PR #922](https://github.com/c-ares/c-ares/pull/922) +* docs: update deprecation notices for `ares_create_query()` and `ares_mkquery()`. [PR #910](https://github.com/c-ares/c-ares/pull/910) +* license: some files weren't properly updated. [PR #920](https://github.com/c-ares/c-ares/pull/920) +* Fix bind local device regression from 1.34.0. [PR #929](https://github.com/c-ares/c-ares/pull/929), [PR #931](https://github.com/c-ares/c-ares/pull/931), [PR #935](https://github.com/c-ares/c-ares/pull/935) +* CMake: set policy version to prevent deprecation warnings. [PR #932](https://github.com/c-ares/c-ares/pull/932) +* CMake: shared and static library names should be the same on unix platforms like autotools uses. [PR #933](https://github.com/c-ares/c-ares/pull/933) +* Update to latest autoconf archive macros for enhanced system compatibility. [PR #936](https://github.com/c-ares/c-ares/pull/936) Thanks go to these friendly people for their efforts and contributions for this release: * Brad House (@bradh352) -* Jiwoo Park (@jimmy-park) - - -## c-ares version 1.34.2 - October 15 2024 - -This release contains a fix for downstream packages detecting the c-ares -version based on the contents of the header file rather than the -distributed pkgconf or cmake files. - -## c-ares version 1.34.1 - October 9 2024 - -This release fixes a packaging issue. - - -## c-ares version 1.34.0 - October 9 2024 - -This is a feature and bugfix release. - -Features: -* adig: read arguments from adigrc. - [PR #856](https://github.com/c-ares/c-ares/pull/856) -* Add new pending write callback optimization via `ares_set_pending_write_cb`. - [PR #857](https://github.com/c-ares/c-ares/pull/857) -* New function `ares_process_fds()`. - [PR #875](https://github.com/c-ares/c-ares/pull/875) -* Failed servers should be probed rather than redirecting queries which could - cause unexpected latency. - [PR #877](https://github.com/c-ares/c-ares/pull/877) -* adig: rework command line arguments to mimic dig from bind. - [PR #890](https://github.com/c-ares/c-ares/pull/890) -* Add new method for overriding network functions - `ares_set_socket_function_ex()` to properly support all new functionality. - [PR #894](https://github.com/c-ares/c-ares/pull/894) -* Fix regression with custom socket callbacks due to DNS cookie support. - [PR #895](https://github.com/c-ares/c-ares/pull/895) -* ares_socket: set IP_BIND_ADDRESS_NO_PORT on ares_set_local_ip* tcp sockets - [PR #887](https://github.com/c-ares/c-ares/pull/887) -* URI parser/writer for ares_set_servers_csv()/ares_get_servers_csv(). - [PR #882](https://github.com/c-ares/c-ares/pull/882) - -Changes: -* Connection handling modularization. - [PR #857](https://github.com/c-ares/c-ares/pull/857), - [PR #876](https://github.com/c-ares/c-ares/pull/876) -* Expose library/utility functions to tools. - [PR #860](https://github.com/c-ares/c-ares/pull/860) -* Remove `ares__` prefix, just use `ares_` for internal functions. - [PR #872](https://github.com/c-ares/c-ares/pull/872) - - -Bugfixes: -* fix: potential WIN32_LEAN_AND_MEAN redefinition. - [PR #869](https://github.com/c-ares/c-ares/pull/869) -* Fix googletest v1.15 compatibility. - [PR #874](https://github.com/c-ares/c-ares/pull/874) -* Fix pkgconfig thread dependencies. - [PR #884](https://github.com/c-ares/c-ares/pull/884) - - -Thanks go to these friendly people for their efforts and contributions for this -release: - -* Brad House (@bradh352) -* Cristian Rodríguez (@crrodriguez) -* Georg (@tacerus) -* @lifenjoiner -* Shelley Vohr (@codebytere) -* 前进,前进,进 (@leleliu008) - +* Daniel Stenberg (@bagder) +* Gregor Jasny (@gjasny) +* @marcovsz +* Nikolaos Chatzikonstantinou (@createyourpersonalaccount) +* @vlasovsoft1979 diff --git a/deps/cares/aclocal.m4 b/deps/cares/aclocal.m4 index ce7ad1c8a86a43..04f8786c9c0c89 100644 --- a/deps/cares/aclocal.m4 +++ b/deps/cares/aclocal.m4 @@ -1221,6 +1221,8 @@ AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR +m4_include([m4/ares_check_user_namespace.m4]) +m4_include([m4/ares_check_uts_namespace.m4]) m4_include([m4/ax_ac_append_to_file.m4]) m4_include([m4/ax_ac_print_to_file.m4]) m4_include([m4/ax_add_am_macro_static.m4]) @@ -1231,8 +1233,6 @@ m4_include([m4/ax_append_link_flags.m4]) m4_include([m4/ax_check_compile_flag.m4]) m4_include([m4/ax_check_gnu_make.m4]) m4_include([m4/ax_check_link_flag.m4]) -m4_include([m4/ax_check_user_namespace.m4]) -m4_include([m4/ax_check_uts_namespace.m4]) m4_include([m4/ax_code_coverage.m4]) m4_include([m4/ax_compiler_vendor.m4]) m4_include([m4/ax_cxx_compile_stdcxx.m4]) diff --git a/deps/cares/aminclude_static.am b/deps/cares/aminclude_static.am index b83549f81adde4..ec7a86a43e6829 100644 --- a/deps/cares/aminclude_static.am +++ b/deps/cares/aminclude_static.am @@ -1,6 +1,6 @@ # aminclude_static.am generated automatically by Autoconf -# from AX_AM_MACROS_STATIC on Sat Nov 9 17:40:37 UTC 2024 +# from AX_AM_MACROS_STATIC on Sat Dec 14 15:15:44 UTC 2024 # Code coverage @@ -66,7 +66,7 @@ code_coverage_v_lcov_cap_ = $(code_coverage_v_lcov_cap_$(AM_DEFAULT_VERBOSITY)) code_coverage_v_lcov_cap_0 = @echo " LCOV --capture" $(CODE_COVERAGE_OUTPUT_FILE); code_coverage_v_lcov_ign = $(code_coverage_v_lcov_ign_$(V)) code_coverage_v_lcov_ign_ = $(code_coverage_v_lcov_ign_$(AM_DEFAULT_VERBOSITY)) -code_coverage_v_lcov_ign_0 = @echo " LCOV --remove /tmp/*" $(CODE_COVERAGE_IGNORE_PATTERN); +code_coverage_v_lcov_ign_0 = @echo " LCOV --remove" "$(CODE_COVERAGE_OUTPUT_FILE).tmp" $(CODE_COVERAGE_IGNORE_PATTERN); code_coverage_v_genhtml = $(code_coverage_v_genhtml_$(V)) code_coverage_v_genhtml_ = $(code_coverage_v_genhtml_$(AM_DEFAULT_VERBOSITY)) code_coverage_v_genhtml_0 = @echo " GEN " "$(CODE_COVERAGE_OUTPUT_DIRECTORY)"; @@ -85,7 +85,7 @@ check-code-coverage: # Capture code coverage data code-coverage-capture: code-coverage-capture-hook $(code_coverage_v_lcov_cap)$(LCOV) $(code_coverage_quiet) $(addprefix --directory ,$(CODE_COVERAGE_DIRECTORY)) --capture --output-file "$(CODE_COVERAGE_OUTPUT_FILE).tmp" --test-name "$(call code_coverage_sanitize,$(PACKAGE_NAME)-$(PACKAGE_VERSION))" --no-checksum --compat-libtool $(CODE_COVERAGE_LCOV_SHOPTS) $(CODE_COVERAGE_LCOV_OPTIONS) - $(code_coverage_v_lcov_ign)$(LCOV) $(code_coverage_quiet) $(addprefix --directory ,$(CODE_COVERAGE_DIRECTORY)) --remove "$(CODE_COVERAGE_OUTPUT_FILE).tmp" "/tmp/*" $(CODE_COVERAGE_IGNORE_PATTERN) --output-file "$(CODE_COVERAGE_OUTPUT_FILE)" $(CODE_COVERAGE_LCOV_SHOPTS) $(CODE_COVERAGE_LCOV_RMOPTS) + $(code_coverage_v_lcov_ign)$(LCOV) $(code_coverage_quiet) $(addprefix --directory ,$(CODE_COVERAGE_DIRECTORY)) --remove "$(CODE_COVERAGE_OUTPUT_FILE).tmp" $(CODE_COVERAGE_IGNORE_PATTERN) --output-file "$(CODE_COVERAGE_OUTPUT_FILE)" $(CODE_COVERAGE_LCOV_SHOPTS) $(CODE_COVERAGE_LCOV_RMOPTS) -@rm -f "$(CODE_COVERAGE_OUTPUT_FILE).tmp" $(code_coverage_v_genhtml)LANG=C $(GENHTML) $(code_coverage_quiet) $(addprefix --prefix ,$(CODE_COVERAGE_DIRECTORY)) --output-directory "$(CODE_COVERAGE_OUTPUT_DIRECTORY)" --title "$(PACKAGE_NAME)-$(PACKAGE_VERSION) Code Coverage" --legend --show-details "$(CODE_COVERAGE_OUTPUT_FILE)" $(CODE_COVERAGE_GENHTML_OPTIONS) @echo "file://$(abs_builddir)/$(CODE_COVERAGE_OUTPUT_DIRECTORY)/index.html" diff --git a/deps/cares/configure b/deps/cares/configure index 76b0ddf39c136a..d02f117d2f0b64 100755 --- a/deps/cares/configure +++ b/deps/cares/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.71 for c-ares 1.34.3. +# Generated by GNU Autoconf 2.71 for c-ares 1.34.4. # # Report bugs to . # @@ -621,8 +621,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='c-ares' PACKAGE_TARNAME='c-ares' -PACKAGE_VERSION='1.34.3' -PACKAGE_STRING='c-ares 1.34.3' +PACKAGE_VERSION='1.34.4' +PACKAGE_STRING='c-ares 1.34.4' PACKAGE_BUGREPORT='c-ares mailing list: http://lists.haxx.se/listinfo/c-ares' PACKAGE_URL='' @@ -853,6 +853,7 @@ with_gcov enable_code_coverage enable_largefile enable_libgcc +enable_tests_crossbuild ' ac_precious_vars='build_alias host_alias @@ -1423,7 +1424,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures c-ares 1.34.3 to adapt to many kinds of systems. +\`configure' configures c-ares 1.34.4 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1494,7 +1495,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of c-ares 1.34.3:";; + short | recursive ) echo "Configuration of c-ares 1.34.4:";; esac cat <<\_ACEOF @@ -1525,6 +1526,8 @@ Optional Features: --enable-code-coverage Whether to enable code coverage support --disable-largefile omit support for large files --enable-libgcc use libgcc when linking + --enable-tests-crossbuild + Enable test building even when cross building Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] @@ -1634,7 +1637,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -c-ares configure 1.34.3 +c-ares configure 1.34.4 generated by GNU Autoconf 2.71 Copyright (C) 2021 Free Software Foundation, Inc. @@ -2258,7 +2261,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by c-ares $as_me 1.34.3, which was +It was created by c-ares $as_me 1.34.4, which was generated by GNU Autoconf 2.71. Invocation command line was $ $0$ac_configure_args_raw @@ -3232,7 +3235,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu -CARES_VERSION_INFO="21:2:19" +CARES_VERSION_INFO="21:3:19" @@ -4891,7 +4894,17 @@ else $as_nop // MSVC always sets __cplusplus to 199711L in older versions; newer versions // only set it correctly if /Zc:__cplusplus is specified as well as a // /std:c++NN switch: +// // https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/ +// +// The value __cplusplus ought to have is available in _MSVC_LANG since +// Visual Studio 2015 Update 3: +// +// https://learn.microsoft.com/en-us/cpp/preprocessor/predefined-macros +// +// This was also the first MSVC version to support C++14 so we can't use the +// value of either __cplusplus or _MSVC_LANG to quickly rule out MSVC having +// C++11 or C++14 support, but we can check _MSVC_LANG for C++17 and later. #elif __cplusplus < 201103L && !defined _MSC_VER #error "This is not a C++11 compiler" @@ -5914,7 +5927,7 @@ fi # Define the identity of the package. PACKAGE='c-ares' - VERSION='1.34.3' + VERSION='1.34.4' printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h @@ -19525,10 +19538,52 @@ then : fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _gcov_init in -lgcov" >&5 +printf %s "checking for _gcov_init in -lgcov... " >&6; } +if test ${ac_cv_lib_gcov__gcov_init+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lgcov $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char _gcov_init (); +int +main (void) +{ +return _gcov_init (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_gcov__gcov_init=yes +else $as_nop + ac_cv_lib_gcov__gcov_init=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gcov__gcov_init" >&5 +printf "%s\n" "$ac_cv_lib_gcov__gcov_init" >&6; } +if test "x$ac_cv_lib_gcov__gcov_init" = xyes +then : + CODE_COVERAGE_LIBS="-lgcov" +else $as_nop + CODE_COVERAGE_LIBS="" +fi + + CODE_COVERAGE_CPPFLAGS="-DNDEBUG" CODE_COVERAGE_CFLAGS="-O0 -g -fprofile-arcs -ftest-coverage" CODE_COVERAGE_CXXFLAGS="-O0 -g -fprofile-arcs -ftest-coverage" - CODE_COVERAGE_LIBS="-lgcov" @@ -19805,27 +19860,37 @@ eval ac_res=\$$as_CACHEVAR printf "%s\n" "$ac_res" >&6; } if eval test \"x\$"$as_CACHEVAR"\" = x"yes" then : - if test ${LDFLAGS+y} + +if test ${LDFLAGS+y} then : - case " $LDFLAGS " in - *" $flag "*) - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : LDFLAGS already contains \$flag"; } >&5 + + case " $LDFLAGS " in #( + *" $flag "*) : + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : LDFLAGS already contains \$flag"; } >&5 (: LDFLAGS already contains $flag) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - ;; - *) - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : LDFLAGS=\"\$LDFLAGS \$flag\""; } >&5 - (: LDFLAGS="$LDFLAGS $flag") 2>&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append LDFLAGS " $flag" + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : LDFLAGS=\"\$LDFLAGS\""; } >&5 + (: LDFLAGS="$LDFLAGS") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } - LDFLAGS="$LDFLAGS $flag" - ;; - esac + ;; +esac + else $as_nop - LDFLAGS="$flag" + + LDFLAGS=$flag + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : LDFLAGS=\"\$LDFLAGS\""; } >&5 + (: LDFLAGS="$LDFLAGS") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + fi else $as_nop @@ -19870,27 +19935,37 @@ if test "x$enable_shared" = "xno" -a "x$enable_static" = "xyes" ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we need CARES_STATICLIB definition" >&5 printf %s "checking whether we need CARES_STATICLIB definition... " >&6; } if test "$ac_cv_native_windows" = "yes" ; then - if test ${AM_CPPFLAGS+y} + +if test ${AM_CPPFLAGS+y} then : - case " $AM_CPPFLAGS " in - *" -DCARES_STATICLIB "*) - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CPPFLAGS already contains -DCARES_STATICLIB"; } >&5 + + case " $AM_CPPFLAGS " in #( + *" -DCARES_STATICLIB "*) : + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CPPFLAGS already contains -DCARES_STATICLIB"; } >&5 (: AM_CPPFLAGS already contains -DCARES_STATICLIB) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - ;; - *) - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CPPFLAGS=\"\$AM_CPPFLAGS -DCARES_STATICLIB\""; } >&5 - (: AM_CPPFLAGS="$AM_CPPFLAGS -DCARES_STATICLIB") 2>&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append AM_CPPFLAGS " -DCARES_STATICLIB" + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CPPFLAGS=\"\$AM_CPPFLAGS\""; } >&5 + (: AM_CPPFLAGS="$AM_CPPFLAGS") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } - AM_CPPFLAGS="$AM_CPPFLAGS -DCARES_STATICLIB" - ;; - esac + ;; +esac + else $as_nop - AM_CPPFLAGS="-DCARES_STATICLIB" + + AM_CPPFLAGS=-DCARES_STATICLIB + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CPPFLAGS=\"\$AM_CPPFLAGS\""; } >&5 + (: AM_CPPFLAGS="$AM_CPPFLAGS") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + fi PKGCONFIG_CFLAGS="-DCARES_STATICLIB" @@ -19910,57 +19985,24 @@ if test "$symbol_hiding" != "no" ; then else case "$ax_cv_c_compiler_vendor" in clang|gnu|intel) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts " >&5 -printf %s "checking whether C compiler accepts ... " >&6; } -if test ${ax_cv_check_cflags__+y} -then : - printf %s "(cached) " >&6 -else $as_nop - ax_check_save_flags=$CFLAGS - CFLAGS="$CFLAGS " - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main (void) -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO" -then : - ax_cv_check_cflags__=yes -else $as_nop - ax_cv_check_cflags__=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - CFLAGS=$ax_check_save_flags -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags__" >&5 -printf "%s\n" "$ax_cv_check_cflags__" >&6; } -if test x"$ax_cv_check_cflags__" = xyes -then : - : -else $as_nop - : -fi for flag in -fvisibility=hidden; do as_CACHEVAR=`printf "%s\n" "ax_cv_check_cflags__$flag" | $as_tr_sh` -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5 -printf %s "checking whether C compiler accepts $flag... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler accepts $flag" >&5 +printf %s "checking whether the C compiler accepts $flag... " >&6; } if eval test \${$as_CACHEVAR+y} then : printf %s "(cached) " >&6 else $as_nop ax_check_save_flags=$CFLAGS - CFLAGS="$CFLAGS $flag" + if test x"$GCC" = xyes ; then + add_gnu_werror="-Werror" + fi + CFLAGS="$CFLAGS $flag $add_gnu_werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -19984,29 +20026,39 @@ fi eval ac_res=\$$as_CACHEVAR { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } -if test x"`eval 'as_val=${'$as_CACHEVAR'};printf "%s\n" "$as_val"'`" = xyes +if eval test \"x\$"$as_CACHEVAR"\" = x"yes" then : - if test ${CARES_SYMBOL_HIDING_CFLAG+y} + +if test ${CARES_SYMBOL_HIDING_CFLAG+y} then : - case " $CARES_SYMBOL_HIDING_CFLAG " in - *" $flag "*) - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : CARES_SYMBOL_HIDING_CFLAG already contains \$flag"; } >&5 + + case " $CARES_SYMBOL_HIDING_CFLAG " in #( + *" $flag "*) : + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : CARES_SYMBOL_HIDING_CFLAG already contains \$flag"; } >&5 (: CARES_SYMBOL_HIDING_CFLAG already contains $flag) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - ;; - *) - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : CARES_SYMBOL_HIDING_CFLAG=\"\$CARES_SYMBOL_HIDING_CFLAG \$flag\""; } >&5 - (: CARES_SYMBOL_HIDING_CFLAG="$CARES_SYMBOL_HIDING_CFLAG $flag") 2>&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append CARES_SYMBOL_HIDING_CFLAG " $flag" + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : CARES_SYMBOL_HIDING_CFLAG=\"\$CARES_SYMBOL_HIDING_CFLAG\""; } >&5 + (: CARES_SYMBOL_HIDING_CFLAG="$CARES_SYMBOL_HIDING_CFLAG") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } - CARES_SYMBOL_HIDING_CFLAG="$CARES_SYMBOL_HIDING_CFLAG $flag" - ;; - esac + ;; +esac + else $as_nop - CARES_SYMBOL_HIDING_CFLAG="$flag" + + CARES_SYMBOL_HIDING_CFLAG=$flag + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : CARES_SYMBOL_HIDING_CFLAG=\"\$CARES_SYMBOL_HIDING_CFLAG\""; } >&5 + (: CARES_SYMBOL_HIDING_CFLAG="$CARES_SYMBOL_HIDING_CFLAG") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + fi else $as_nop @@ -20022,17 +20074,22 @@ done sun) + + for flag in -xldscope=hidden; do as_CACHEVAR=`printf "%s\n" "ax_cv_check_cflags__$flag" | $as_tr_sh` -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5 -printf %s "checking whether C compiler accepts $flag... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler accepts $flag" >&5 +printf %s "checking whether the C compiler accepts $flag... " >&6; } if eval test \${$as_CACHEVAR+y} then : printf %s "(cached) " >&6 else $as_nop ax_check_save_flags=$CFLAGS - CFLAGS="$CFLAGS $flag" + if test x"$GCC" = xyes ; then + add_gnu_werror="-Werror" + fi + CFLAGS="$CFLAGS $flag $add_gnu_werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -20056,29 +20113,39 @@ fi eval ac_res=\$$as_CACHEVAR { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } -if test x"`eval 'as_val=${'$as_CACHEVAR'};printf "%s\n" "$as_val"'`" = xyes +if eval test \"x\$"$as_CACHEVAR"\" = x"yes" then : - if test ${CARES_SYMBOL_HIDING_CFLAG+y} + +if test ${CARES_SYMBOL_HIDING_CFLAG+y} then : - case " $CARES_SYMBOL_HIDING_CFLAG " in - *" $flag "*) - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : CARES_SYMBOL_HIDING_CFLAG already contains \$flag"; } >&5 + + case " $CARES_SYMBOL_HIDING_CFLAG " in #( + *" $flag "*) : + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : CARES_SYMBOL_HIDING_CFLAG already contains \$flag"; } >&5 (: CARES_SYMBOL_HIDING_CFLAG already contains $flag) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - ;; - *) - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : CARES_SYMBOL_HIDING_CFLAG=\"\$CARES_SYMBOL_HIDING_CFLAG \$flag\""; } >&5 - (: CARES_SYMBOL_HIDING_CFLAG="$CARES_SYMBOL_HIDING_CFLAG $flag") 2>&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append CARES_SYMBOL_HIDING_CFLAG " $flag" + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : CARES_SYMBOL_HIDING_CFLAG=\"\$CARES_SYMBOL_HIDING_CFLAG\""; } >&5 + (: CARES_SYMBOL_HIDING_CFLAG="$CARES_SYMBOL_HIDING_CFLAG") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } - CARES_SYMBOL_HIDING_CFLAG="$CARES_SYMBOL_HIDING_CFLAG $flag" - ;; - esac + ;; +esac + else $as_nop - CARES_SYMBOL_HIDING_CFLAG="$flag" + + CARES_SYMBOL_HIDING_CFLAG=$flag + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : CARES_SYMBOL_HIDING_CFLAG=\"\$CARES_SYMBOL_HIDING_CFLAG\""; } >&5 + (: CARES_SYMBOL_HIDING_CFLAG="$CARES_SYMBOL_HIDING_CFLAG") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + fi else $as_nop @@ -20120,17 +20187,22 @@ fi if test "$enable_warnings" = "yes"; then + + for flag in -Wall -Wextra -Waggregate-return -Wcast-align -Wcast-qual -Wconversion -Wdeclaration-after-statement -Wdouble-promotion -Wfloat-equal -Wformat-security -Winit-self -Wjump-misses-init -Wlogical-op -Wmissing-braces -Wmissing-declarations -Wmissing-format-attribute -Wmissing-include-dirs -Wmissing-prototypes -Wnested-externs -Wno-coverage-mismatch -Wold-style-definition -Wpacked -Wpedantic -Wpointer-arith -Wredundant-decls -Wshadow -Wsign-conversion -Wstrict-overflow -Wstrict-prototypes -Wtrampolines -Wundef -Wunreachable-code -Wunused -Wvariadic-macros -Wvla -Wwrite-strings -Werror=implicit-int -Werror=implicit-function-declaration -Werror=partial-availability -Wno-long-long ; do as_CACHEVAR=`printf "%s\n" "ax_cv_check_cflags_-Werror_$flag" | $as_tr_sh` -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5 -printf %s "checking whether C compiler accepts $flag... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler accepts $flag" >&5 +printf %s "checking whether the C compiler accepts $flag... " >&6; } if eval test \${$as_CACHEVAR+y} then : printf %s "(cached) " >&6 else $as_nop ax_check_save_flags=$CFLAGS - CFLAGS="$CFLAGS -Werror $flag" + if test x"$GCC" = xyes ; then + add_gnu_werror="-Werror" + fi + CFLAGS="$CFLAGS -Werror $flag $add_gnu_werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -20154,29 +20226,39 @@ fi eval ac_res=\$$as_CACHEVAR { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } -if test x"`eval 'as_val=${'$as_CACHEVAR'};printf "%s\n" "$as_val"'`" = xyes +if eval test \"x\$"$as_CACHEVAR"\" = x"yes" then : - if test ${AM_CFLAGS+y} + +if test ${AM_CFLAGS+y} then : - case " $AM_CFLAGS " in - *" $flag "*) - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS already contains \$flag"; } >&5 + + case " $AM_CFLAGS " in #( + *" $flag "*) : + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS already contains \$flag"; } >&5 (: AM_CFLAGS already contains $flag) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - ;; - *) - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS \$flag\""; } >&5 - (: AM_CFLAGS="$AM_CFLAGS $flag") 2>&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append AM_CFLAGS " $flag" + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS\""; } >&5 + (: AM_CFLAGS="$AM_CFLAGS") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } - AM_CFLAGS="$AM_CFLAGS $flag" - ;; - esac + ;; +esac + else $as_nop - AM_CFLAGS="$flag" + + AM_CFLAGS=$flag + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS\""; } >&5 + (: AM_CFLAGS="$AM_CFLAGS") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + fi else $as_nop @@ -20185,22 +20267,28 @@ fi done +fi + +case $host_os in + *qnx*|*android*) + - case $host_os in - *android*) for flag in -std=c99; do as_CACHEVAR=`printf "%s\n" "ax_cv_check_cflags_-Werror_$flag" | $as_tr_sh` -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5 -printf %s "checking whether C compiler accepts $flag... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler accepts $flag" >&5 +printf %s "checking whether the C compiler accepts $flag... " >&6; } if eval test \${$as_CACHEVAR+y} then : printf %s "(cached) " >&6 else $as_nop ax_check_save_flags=$CFLAGS - CFLAGS="$CFLAGS -Werror $flag" + if test x"$GCC" = xyes ; then + add_gnu_werror="-Werror" + fi + CFLAGS="$CFLAGS -Werror $flag $add_gnu_werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -20224,29 +20312,39 @@ fi eval ac_res=\$$as_CACHEVAR { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } -if test x"`eval 'as_val=${'$as_CACHEVAR'};printf "%s\n" "$as_val"'`" = xyes +if eval test \"x\$"$as_CACHEVAR"\" = x"yes" then : - if test ${AM_CFLAGS+y} + +if test ${AM_CFLAGS+y} then : - case " $AM_CFLAGS " in - *" $flag "*) - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS already contains \$flag"; } >&5 + + case " $AM_CFLAGS " in #( + *" $flag "*) : + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS already contains \$flag"; } >&5 (: AM_CFLAGS already contains $flag) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - ;; - *) - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS \$flag\""; } >&5 - (: AM_CFLAGS="$AM_CFLAGS $flag") 2>&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append AM_CFLAGS " $flag" + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS\""; } >&5 + (: AM_CFLAGS="$AM_CFLAGS") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } - AM_CFLAGS="$AM_CFLAGS $flag" - ;; - esac + ;; +esac + else $as_nop - AM_CFLAGS="$flag" + + AM_CFLAGS=$flag + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS\""; } >&5 + (: AM_CFLAGS="$AM_CFLAGS") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + fi else $as_nop @@ -20255,21 +20353,26 @@ fi done - ;; - *) + ;; + *) + + for flag in -std=c90; do as_CACHEVAR=`printf "%s\n" "ax_cv_check_cflags_-Werror_$flag" | $as_tr_sh` -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5 -printf %s "checking whether C compiler accepts $flag... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler accepts $flag" >&5 +printf %s "checking whether the C compiler accepts $flag... " >&6; } if eval test \${$as_CACHEVAR+y} then : printf %s "(cached) " >&6 else $as_nop ax_check_save_flags=$CFLAGS - CFLAGS="$CFLAGS -Werror $flag" + if test x"$GCC" = xyes ; then + add_gnu_werror="-Werror" + fi + CFLAGS="$CFLAGS -Werror $flag $add_gnu_werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -20293,29 +20396,39 @@ fi eval ac_res=\$$as_CACHEVAR { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } -if test x"`eval 'as_val=${'$as_CACHEVAR'};printf "%s\n" "$as_val"'`" = xyes +if eval test \"x\$"$as_CACHEVAR"\" = x"yes" then : - if test ${AM_CFLAGS+y} + +if test ${AM_CFLAGS+y} then : - case " $AM_CFLAGS " in - *" $flag "*) - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS already contains \$flag"; } >&5 + + case " $AM_CFLAGS " in #( + *" $flag "*) : + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS already contains \$flag"; } >&5 (: AM_CFLAGS already contains $flag) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - ;; - *) - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS \$flag\""; } >&5 - (: AM_CFLAGS="$AM_CFLAGS $flag") 2>&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append AM_CFLAGS " $flag" + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS\""; } >&5 + (: AM_CFLAGS="$AM_CFLAGS") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } - AM_CFLAGS="$AM_CFLAGS $flag" - ;; - esac + ;; +esac + else $as_nop - AM_CFLAGS="$flag" + + AM_CFLAGS=$flag + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS\""; } >&5 + (: AM_CFLAGS="$AM_CFLAGS") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + fi else $as_nop @@ -20324,24 +20437,115 @@ fi done - ;; - esac + ;; +esac + +case $host_os in + *qnx*) + + + + +for flag in -D_QNX_SOURCE; do + as_CACHEVAR=`printf "%s\n" "ax_cv_check_cflags_-Werror_$flag" | $as_tr_sh` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler accepts $flag" >&5 +printf %s "checking whether the C compiler accepts $flag... " >&6; } +if eval test \${$as_CACHEVAR+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + ax_check_save_flags=$CFLAGS + if test x"$GCC" = xyes ; then + add_gnu_werror="-Werror" + fi + CFLAGS="$CFLAGS -Werror $flag $add_gnu_werror" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + eval "$as_CACHEVAR=yes" +else $as_nop + eval "$as_CACHEVAR=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + CFLAGS=$ax_check_save_flags +fi +eval ac_res=\$$as_CACHEVAR + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +if eval test \"x\$"$as_CACHEVAR"\" = x"yes" +then : + +if test ${AM_CPPFLAGS+y} +then : + + case " $AM_CPPFLAGS " in #( + *" $flag "*) : + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CPPFLAGS already contains \$flag"; } >&5 + (: AM_CPPFLAGS already contains $flag) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append AM_CPPFLAGS " $flag" + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CPPFLAGS=\"\$AM_CPPFLAGS\""; } >&5 + (: AM_CPPFLAGS="$AM_CPPFLAGS") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + ;; +esac + +else $as_nop + + AM_CPPFLAGS=$flag + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CPPFLAGS=\"\$AM_CPPFLAGS\""; } >&5 + (: AM_CPPFLAGS="$AM_CPPFLAGS") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + +fi + +else $as_nop + : fi +done + + ;; +esac + if test "$ax_cv_c_compiler_vendor" = "intel"; then + + for flag in -shared-intel; do as_CACHEVAR=`printf "%s\n" "ax_cv_check_cflags__$flag" | $as_tr_sh` -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5 -printf %s "checking whether C compiler accepts $flag... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler accepts $flag" >&5 +printf %s "checking whether the C compiler accepts $flag... " >&6; } if eval test \${$as_CACHEVAR+y} then : printf %s "(cached) " >&6 else $as_nop ax_check_save_flags=$CFLAGS - CFLAGS="$CFLAGS $flag" + if test x"$GCC" = xyes ; then + add_gnu_werror="-Werror" + fi + CFLAGS="$CFLAGS $flag $add_gnu_werror" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -20365,29 +20569,39 @@ fi eval ac_res=\$$as_CACHEVAR { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } -if test x"`eval 'as_val=${'$as_CACHEVAR'};printf "%s\n" "$as_val"'`" = xyes +if eval test \"x\$"$as_CACHEVAR"\" = x"yes" then : - if test ${AM_CFLAGS+y} + +if test ${AM_CFLAGS+y} then : - case " $AM_CFLAGS " in - *" $flag "*) - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS already contains \$flag"; } >&5 + + case " $AM_CFLAGS " in #( + *" $flag "*) : + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS already contains \$flag"; } >&5 (: AM_CFLAGS already contains $flag) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - ;; - *) - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS \$flag\""; } >&5 - (: AM_CFLAGS="$AM_CFLAGS $flag") 2>&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append AM_CFLAGS " $flag" + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS\""; } >&5 + (: AM_CFLAGS="$AM_CFLAGS") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } - AM_CFLAGS="$AM_CFLAGS $flag" - ;; - esac + ;; +esac + else $as_nop - AM_CFLAGS="$flag" + + AM_CFLAGS=$flag + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : AM_CFLAGS=\"\$AM_CFLAGS\""; } >&5 + (: AM_CFLAGS="$AM_CFLAGS") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + fi else $as_nop @@ -20708,27 +20922,37 @@ eval ac_res=\$$as_CACHEVAR printf "%s\n" "$ac_res" >&6; } if eval test \"x\$"$as_CACHEVAR"\" = x"yes" then : - if test ${XNET_LIBS+y} + +if test ${XNET_LIBS+y} then : - case " $XNET_LIBS " in - *" $flag "*) - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : XNET_LIBS already contains \$flag"; } >&5 + + case " $XNET_LIBS " in #( + *" $flag "*) : + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : XNET_LIBS already contains \$flag"; } >&5 (: XNET_LIBS already contains $flag) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - ;; - *) - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : XNET_LIBS=\"\$XNET_LIBS \$flag\""; } >&5 - (: XNET_LIBS="$XNET_LIBS $flag") 2>&5 + test $ac_status = 0; } ;; #( + *) : + + as_fn_append XNET_LIBS " $flag" + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : XNET_LIBS=\"\$XNET_LIBS\""; } >&5 + (: XNET_LIBS="$XNET_LIBS") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } - XNET_LIBS="$XNET_LIBS $flag" - ;; - esac + ;; +esac + else $as_nop - XNET_LIBS="$flag" + + XNET_LIBS=$flag + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : XNET_LIBS=\"\$XNET_LIBS\""; } >&5 + (: XNET_LIBS="$XNET_LIBS") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + fi else $as_nop @@ -22131,6 +22355,14 @@ fi +ac_fn_check_decl "$LINENO" "strnlen" "ac_cv_have_decl_strnlen" "$cares_all_includes +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_strnlen" = xyes +then : + +printf "%s\n" "#define HAVE_STRNLEN 1" >>confdefs.h + +fi ac_fn_check_decl "$LINENO" "memmem" "ac_cv_have_decl_memmem" "$cares_all_includes " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_memmem" = xyes @@ -23708,6 +23940,15 @@ printf "%s\n" "$as_me: WARNING: cannot build tests when cross compiling" >&2;} as_fn_error $? "*** Tests not supported when cross compiling" "$LINENO" 5 fi fi + +# Check whether --enable-tests-crossbuild was given. +if test ${enable_tests_crossbuild+y} +then : + enableval=$enable_tests_crossbuild; build_tests="$enableval" + +fi + + if test "x$build_tests" != "xno" ; then @@ -23993,7 +24234,7 @@ fi if test "x$have_gmock_v112" = "xyes" ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether user namespaces are supported" >&5 printf %s "checking whether user namespaces are supported... " >&6; } -if test ${ax_cv_user_namespace+y} +if test ${ares_cv_user_namespace+y} then : printf %s "(cached) " >&6 else $as_nop @@ -24006,7 +24247,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu if test "$cross_compiling" = yes then : - ax_cv_user_namespace=no + ares_cv_user_namespace=no else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -24046,9 +24287,9 @@ int main() { _ACEOF if ac_fn_c_try_run "$LINENO" then : - ax_cv_user_namespace=yes + ares_cv_user_namespace=yes else $as_nop - ax_cv_user_namespace=no + ares_cv_user_namespace=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext @@ -24062,9 +24303,9 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_user_namespace" >&5 -printf "%s\n" "$ax_cv_user_namespace" >&6; } - if test "$ax_cv_user_namespace" = yes; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ares_cv_user_namespace" >&5 +printf "%s\n" "$ares_cv_user_namespace" >&6; } + if test "$ares_cv_user_namespace" = yes; then printf "%s\n" "#define HAVE_USER_NAMESPACE 1" >>confdefs.h @@ -24072,7 +24313,7 @@ printf "%s\n" "#define HAVE_USER_NAMESPACE 1" >>confdefs.h { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether UTS namespaces are supported" >&5 printf %s "checking whether UTS namespaces are supported... " >&6; } -if test ${ax_cv_uts_namespace+y} +if test ${ares_cv_uts_namespace+y} then : printf %s "(cached) " >&6 else $as_nop @@ -24085,7 +24326,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu if test "$cross_compiling" = yes then : - ax_cv_uts_namespace=no + ares_cv_uts_namespace=no else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -24145,9 +24386,9 @@ int main() { _ACEOF if ac_fn_c_try_run "$LINENO" then : - ax_cv_uts_namespace=yes + ares_cv_uts_namespace=yes else $as_nop - ax_cv_uts_namespace=no + ares_cv_uts_namespace=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext @@ -24161,9 +24402,9 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_uts_namespace" >&5 -printf "%s\n" "$ax_cv_uts_namespace" >&6; } - if test "$ax_cv_uts_namespace" = yes; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ares_cv_uts_namespace" >&5 +printf "%s\n" "$ares_cv_uts_namespace" >&6; } + if test "$ares_cv_uts_namespace" = yes; then printf "%s\n" "#define HAVE_UTS_NAMESPACE 1" >>confdefs.h @@ -24218,7 +24459,17 @@ else $as_nop // MSVC always sets __cplusplus to 199711L in older versions; newer versions // only set it correctly if /Zc:__cplusplus is specified as well as a // /std:c++NN switch: +// // https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/ +// +// The value __cplusplus ought to have is available in _MSVC_LANG since +// Visual Studio 2015 Update 3: +// +// https://learn.microsoft.com/en-us/cpp/preprocessor/predefined-macros +// +// This was also the first MSVC version to support C++14 so we can't use the +// value of either __cplusplus or _MSVC_LANG to quickly rule out MSVC having +// C++11 or C++14 support, but we can check _MSVC_LANG for C++17 and later. #elif __cplusplus < 201103L && !defined _MSC_VER #error "This is not a C++11 compiler" @@ -26007,7 +26258,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by c-ares $as_me 1.34.3, which was +This file was extended by c-ares $as_me 1.34.4, which was generated by GNU Autoconf 2.71. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -26075,7 +26326,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ -c-ares config.status 1.34.3 +c-ares config.status 1.34.4 configured by $0, generated by GNU Autoconf 2.71, with options \\"\$ac_cs_config\\" diff --git a/deps/cares/configure.ac b/deps/cares/configure.ac index 5f848c28598a95..9dacf1fb2e4a40 100644 --- a/deps/cares/configure.ac +++ b/deps/cares/configure.ac @@ -2,10 +2,10 @@ dnl Copyright (C) The c-ares project and its contributors dnl SPDX-License-Identifier: MIT AC_PREREQ([2.69]) -AC_INIT([c-ares], [1.34.3], +AC_INIT([c-ares], [1.34.4], [c-ares mailing list: http://lists.haxx.se/listinfo/c-ares]) -CARES_VERSION_INFO="21:2:19" +CARES_VERSION_INFO="21:3:19" dnl This flag accepts an argument of the form current[:revision[:age]]. So, dnl passing -version-info 3:12:1 sets current to 3, revision to 12, and age to dnl 1. @@ -245,18 +245,25 @@ AC_SUBST(CARES_SYMBOL_HIDING_CFLAG) if test "$enable_warnings" = "yes"; then AX_APPEND_COMPILE_FLAGS([-Wall -Wextra -Waggregate-return -Wcast-align -Wcast-qual -Wconversion -Wdeclaration-after-statement -Wdouble-promotion -Wfloat-equal -Wformat-security -Winit-self -Wjump-misses-init -Wlogical-op -Wmissing-braces -Wmissing-declarations -Wmissing-format-attribute -Wmissing-include-dirs -Wmissing-prototypes -Wnested-externs -Wno-coverage-mismatch -Wold-style-definition -Wpacked -Wpedantic -Wpointer-arith -Wredundant-decls -Wshadow -Wsign-conversion -Wstrict-overflow -Wstrict-prototypes -Wtrampolines -Wundef -Wunreachable-code -Wunused -Wvariadic-macros -Wvla -Wwrite-strings -Werror=implicit-int -Werror=implicit-function-declaration -Werror=partial-availability -Wno-long-long ], [AM_CFLAGS], [-Werror]) - - dnl Android requires c99, all others should use c90 - case $host_os in - *android*) - AX_APPEND_COMPILE_FLAGS([-std=c99], [AM_CFLAGS], [-Werror]) - ;; - *) - AX_APPEND_COMPILE_FLAGS([-std=c90], [AM_CFLAGS], [-Werror]) - ;; - esac fi +dnl Android and QNX require c99, all others should use c90 +case $host_os in + *qnx*|*android*) + AX_APPEND_COMPILE_FLAGS([-std=c99], [AM_CFLAGS], [-Werror]) + ;; + *) + AX_APPEND_COMPILE_FLAGS([-std=c90], [AM_CFLAGS], [-Werror]) + ;; +esac + +dnl QNX needs -D_QNX_SOURCE +case $host_os in + *qnx*) + AX_APPEND_COMPILE_FLAGS([-D_QNX_SOURCE], [AM_CPPFLAGS], [-Werror]) + ;; +esac + if test "$ax_cv_c_compiler_vendor" = "intel"; then AX_APPEND_COMPILE_FLAGS([-shared-intel], [AM_CFLAGS]) fi @@ -543,6 +550,7 @@ dnl https://mailman.videolan.org/pipermail/vlc-devel/2015-March/101802.html dnl which would require we check each individually and provide function arguments dnl for the test. +AC_CHECK_DECL(strnlen, [AC_DEFINE([HAVE_STRNLEN], 1, [Define to 1 if you have `strnlen`] )], [], $cares_all_includes) AC_CHECK_DECL(memmem, [AC_DEFINE([HAVE_MEMMEM], 1, [Define to 1 if you have `memmem`] )], [], $cares_all_includes) AC_CHECK_DECL(recv, [AC_DEFINE([HAVE_RECV], 1, [Define to 1 if you have `recv`] )], [], $cares_all_includes) AC_CHECK_DECL(recvfrom, [AC_DEFINE([HAVE_RECVFROM], 1, [Define to 1 if you have `recvfrom`] )], [], $cares_all_includes) @@ -813,6 +821,13 @@ if test "x$build_tests" != "xno" -a "x$cross_compiling" = "xyes" ; then AC_MSG_ERROR([*** Tests not supported when cross compiling]) fi fi + +dnl Forces compiling of tests even when cross-compiling. +AC_ARG_ENABLE(tests-crossbuild, + AS_HELP_STRING([--enable-tests-crossbuild], [Enable test building even when cross building]), + [build_tests="$enableval"] +) + if test "x$build_tests" != "xno" ; then PKG_CHECK_MODULES([GMOCK], [gmock], [ have_gmock=yes ], [ have_gmock=no ]) if test "x$have_gmock" = "xno" ; then @@ -825,8 +840,8 @@ if test "x$build_tests" != "xno" ; then else PKG_CHECK_MODULES([GMOCK112], [gmock >= 1.12.0], [ have_gmock_v112=yes ], [ have_gmock_v112=no ]) if test "x$have_gmock_v112" = "xyes" ; then - AX_CHECK_USER_NAMESPACE - AX_CHECK_UTS_NAMESPACE + ARES_CHECK_USER_NAMESPACE + ARES_CHECK_UTS_NAMESPACE fi fi fi diff --git a/deps/cares/docs/Makefile.in b/deps/cares/docs/Makefile.in index 6b7bb8e30d1a20..0d1873c9662c92 100644 --- a/deps/cares/docs/Makefile.in +++ b/deps/cares/docs/Makefile.in @@ -92,7 +92,9 @@ build_triplet = @build@ host_triplet = @host@ subdir = docs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ +am__aclocal_m4_deps = $(top_srcdir)/m4/ares_check_user_namespace.m4 \ + $(top_srcdir)/m4/ares_check_uts_namespace.m4 \ + $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ $(top_srcdir)/m4/ax_ac_print_to_file.m4 \ $(top_srcdir)/m4/ax_add_am_macro_static.m4 \ $(top_srcdir)/m4/ax_am_macros_static.m4 \ @@ -102,8 +104,6 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_check_gnu_make.m4 \ $(top_srcdir)/m4/ax_check_link_flag.m4 \ - $(top_srcdir)/m4/ax_check_user_namespace.m4 \ - $(top_srcdir)/m4/ax_check_uts_namespace.m4 \ $(top_srcdir)/m4/ax_code_coverage.m4 \ $(top_srcdir)/m4/ax_compiler_vendor.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ diff --git a/deps/cares/docs/ares_create_query.3 b/deps/cares/docs/ares_create_query.3 index a54eec3e2a6bd1..3af6ba4cc3dc5b 100644 --- a/deps/cares/docs/ares_create_query.3 +++ b/deps/cares/docs/ares_create_query.3 @@ -19,6 +19,9 @@ int ares_create_query(const char *\fIname\fP, int \fImax_udp_size\fP) .fi .SH DESCRIPTION +This function is deprecated as of c-ares 1.22, please use +\fIares_dns_record_create(3)\fP instead. + The \fIares_create_query(3)\fP function composes a DNS query with a single question. The parameter \fIname\fP gives the query name as a NUL-terminated C string of period-separated labels optionally ending with a period; periods and diff --git a/deps/cares/docs/ares_mkquery.3 b/deps/cares/docs/ares_mkquery.3 index 0e7b5edbb89353..2f42d169210fef 100644 --- a/deps/cares/docs/ares_mkquery.3 +++ b/deps/cares/docs/ares_mkquery.3 @@ -14,7 +14,8 @@ int ares_mkquery(const char *\fIname\fP, int \fIdnsclass\fP, int \fItype\fP, int *\fIbuflen\fP) .fi .SH DESCRIPTION -Deprecated function. See \fIares_create_query(3)\fP instead! +This function is deprecated as of c-ares 1.10, please use +\fIares_dns_record_create(3)\fP instead. The .B ares_mkquery diff --git a/deps/cares/docs/ares_send.3 b/deps/cares/docs/ares_send.3 index f6ea9140e2510c..df3e3bbe4136b0 100644 --- a/deps/cares/docs/ares_send.3 +++ b/deps/cares/docs/ares_send.3 @@ -113,6 +113,9 @@ is being destroyed; the query will not be completed. .B ARES_ENOSERVER The query will not be completed because no DNS servers were configured on the channel. +.TP 19 +.B ARES_EBADQUERY +Misformatted DNS query. .PP The callback argument diff --git a/deps/cares/include/Makefile.in b/deps/cares/include/Makefile.in index 0beee44a22bb22..7dc40eb08fab9c 100644 --- a/deps/cares/include/Makefile.in +++ b/deps/cares/include/Makefile.in @@ -90,7 +90,9 @@ build_triplet = @build@ host_triplet = @host@ subdir = include ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ +am__aclocal_m4_deps = $(top_srcdir)/m4/ares_check_user_namespace.m4 \ + $(top_srcdir)/m4/ares_check_uts_namespace.m4 \ + $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ $(top_srcdir)/m4/ax_ac_print_to_file.m4 \ $(top_srcdir)/m4/ax_add_am_macro_static.m4 \ $(top_srcdir)/m4/ax_am_macros_static.m4 \ @@ -100,8 +102,6 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_check_gnu_make.m4 \ $(top_srcdir)/m4/ax_check_link_flag.m4 \ - $(top_srcdir)/m4/ax_check_user_namespace.m4 \ - $(top_srcdir)/m4/ax_check_uts_namespace.m4 \ $(top_srcdir)/m4/ax_code_coverage.m4 \ $(top_srcdir)/m4/ax_compiler_vendor.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ diff --git a/deps/cares/include/ares.h b/deps/cares/include/ares.h index 139c6d66ee90df..7fe3ec78f4e651 100644 --- a/deps/cares/include/ares.h +++ b/deps/cares/include/ares.h @@ -74,7 +74,7 @@ #if defined(_AIX) || defined(__NOVELL_LIBC__) || defined(__NetBSD__) || \ defined(__minix) || defined(__SYMBIAN32__) || defined(__INTEGRITY) || \ defined(ANDROID) || defined(__ANDROID__) || defined(__OpenBSD__) || \ - defined(__QNXNTO__) || defined(__MVS__) || defined(__HAIKU__) + defined(__QNX__) || defined(__MVS__) || defined(__HAIKU__) # include #endif diff --git a/deps/cares/include/ares_version.h b/deps/cares/include/ares_version.h index 9cb8084dd56bc9..782046bd79d844 100644 --- a/deps/cares/include/ares_version.h +++ b/deps/cares/include/ares_version.h @@ -32,8 +32,8 @@ #define ARES_VERSION_MAJOR 1 #define ARES_VERSION_MINOR 34 -#define ARES_VERSION_PATCH 3 -#define ARES_VERSION_STR "1.34.3" +#define ARES_VERSION_PATCH 4 +#define ARES_VERSION_STR "1.34.4" /* NOTE: We cannot make the version string a C preprocessor stringify operation * due to assumptions made by integrators that aren't properly using diff --git a/deps/cares/m4/ares_check_user_namespace.m4 b/deps/cares/m4/ares_check_user_namespace.m4 new file mode 100644 index 00000000000000..a26b384fda5c54 --- /dev/null +++ b/deps/cares/m4/ares_check_user_namespace.m4 @@ -0,0 +1,57 @@ +# -*- Autoconf -*- + +# SYNOPSIS +# +# ARES_CHECK_USER_NAMESPACE +# +# DESCRIPTION +# +# This macro checks whether the local system supports Linux user namespaces. +# If so, it calls AC_DEFINE(HAVE_USER_NAMESPACE). +# +# Copyright (C) The c-ares team +# SPDX-License-Identifier: MIT + +AC_DEFUN([ARES_CHECK_USER_NAMESPACE],[dnl + AC_CACHE_CHECK([whether user namespaces are supported], + ares_cv_user_namespace,[ + AC_LANG_PUSH([C]) + AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include + +int userfn(void *d) { + usleep(100000); /* synchronize by sleep */ + return (getuid() != 0); +} +char userst[1024*1024]; +int main() { + char buffer[1024]; + int rc, status, fd; + pid_t child = clone(userfn, userst + 1024*1024, CLONE_NEWUSER|SIGCHLD, 0); + if (child < 0) return 1; + + snprintf(buffer, sizeof(buffer), "/proc/%d/uid_map", child); + fd = open(buffer, O_CREAT|O_WRONLY|O_TRUNC, 0755); + snprintf(buffer, sizeof(buffer), "0 %d 1\n", getuid()); + write(fd, buffer, strlen(buffer)); + close(fd); + + rc = waitpid(child, &status, 0); + if (rc <= 0) return 1; + if (!WIFEXITED(status)) return 1; + return WEXITSTATUS(status); +} + ]])],[ares_cv_user_namespace=yes],[ares_cv_user_namespace=no],[ares_cv_user_namespace=no]) + AC_LANG_POP([C]) + ]) + if test "$ares_cv_user_namespace" = yes; then + AC_DEFINE([HAVE_USER_NAMESPACE],[1],[Whether user namespaces are available]) + fi +]) # ARES_CHECK_USER_NAMESPACE diff --git a/deps/cares/m4/ares_check_uts_namespace.m4 b/deps/cares/m4/ares_check_uts_namespace.m4 new file mode 100644 index 00000000000000..0aeefe4a9b7b8b --- /dev/null +++ b/deps/cares/m4/ares_check_uts_namespace.m4 @@ -0,0 +1,79 @@ +# -*- Autoconf -*- + +# SYNOPSIS +# +# ARES_CHECK_UTS_NAMESPACE +# +# DESCRIPTION +# +# This macro checks whether the local system supports Linux UTS namespaces. +# Also requires user namespaces to be available, so that non-root users +# can enter the namespace. +# If so, it calls AC_DEFINE(HAVE_UTS_NAMESPACE). +# +# Copyright (C) The c-ares team +# SPDX-License-Identifier: MIT + +AC_DEFUN([ARES_CHECK_UTS_NAMESPACE],[dnl + AC_CACHE_CHECK([whether UTS namespaces are supported], + ares_cv_uts_namespace,[ + AC_LANG_PUSH([C]) + AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include + +int utsfn(void *d) { + char buffer[1024]; + const char *name = "autoconftest"; + int rc = sethostname(name, strlen(name)); + if (rc != 0) return 1; + gethostname(buffer, 1024); + return (strcmp(buffer, name) != 0); +} + +char st2[1024*1024]; +int fn(void *d) { + pid_t child; + int rc, status; + usleep(100000); /* synchronize by sleep */ + if (getuid() != 0) return 1; + child = clone(utsfn, st2 + 1024*1024, CLONE_NEWUTS|SIGCHLD, 0); + if (child < 0) return 1; + rc = waitpid(child, &status, 0); + if (rc <= 0) return 1; + if (!WIFEXITED(status)) return 1; + return WEXITSTATUS(status); +} +char st[1024*1024]; +int main() { + char buffer[1024]; + int rc, status, fd; + pid_t child = clone(fn, st + 1024*1024, CLONE_NEWUSER|SIGCHLD, 0); + if (child < 0) return 1; + + snprintf(buffer, sizeof(buffer), "/proc/%d/uid_map", child); + fd = open(buffer, O_CREAT|O_WRONLY|O_TRUNC, 0755); + snprintf(buffer, sizeof(buffer), "0 %d 1\n", getuid()); + write(fd, buffer, strlen(buffer)); + close(fd); + + rc = waitpid(child, &status, 0); + if (rc <= 0) return 1; + if (!WIFEXITED(status)) return 1; + return WEXITSTATUS(status); +} +]]) + ],[ares_cv_uts_namespace=yes],[ares_cv_uts_namespace=no],[ares_cv_uts_namespace=no]) + AC_LANG_POP([C]) + ]) + if test "$ares_cv_uts_namespace" = yes; then + AC_DEFINE([HAVE_UTS_NAMESPACE],[1],[Whether UTS namespaces are available]) + fi +]) # ARES_CHECK_UTS_NAMESPACE diff --git a/deps/cares/m4/ax_append_compile_flags.m4 b/deps/cares/m4/ax_append_compile_flags.m4 index 1f8e70845c20d9..9c856356c0cda6 100644 --- a/deps/cares/m4/ax_append_compile_flags.m4 +++ b/deps/cares/m4/ax_append_compile_flags.m4 @@ -1,10 +1,10 @@ -# =========================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_append_compile_flags.html -# =========================================================================== +# ============================================================================ +# https://www.gnu.org/software/autoconf-archive/ax_append_compile_flags.html +# ============================================================================ # # SYNOPSIS # -# AX_APPEND_COMPILE_FLAGS([FLAG1 FLAG2 ...], [FLAGS-VARIABLE], [EXTRA-FLAGS]) +# AX_APPEND_COMPILE_FLAGS([FLAG1 FLAG2 ...], [FLAGS-VARIABLE], [EXTRA-FLAGS], [INPUT]) # # DESCRIPTION # @@ -20,6 +20,8 @@ # the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to # force the compiler to issue an error when a bad flag is given. # +# INPUT gives an alternative input source to AC_COMPILE_IFELSE. +# # NOTE: This macro depends on the AX_APPEND_FLAG and # AX_CHECK_COMPILE_FLAG. Please keep this macro in sync with # AX_APPEND_LINK_FLAGS. @@ -28,38 +30,17 @@ # # Copyright (c) 2011 Maarten Bosmans # -# 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 . -# -# As a special exception, the respective Autoconf Macro's copyright owner -# gives unlimited permission to copy, distribute and modify the configure -# scripts that are the output of Autoconf when processing the Macro. You -# need not follow the terms of the GNU General Public License when using -# or distributing such scripts, even though portions of the text of the -# Macro appear in them. The GNU General Public License (GPL) does govern -# all other use of the material that constitutes the Autoconf Macro. -# -# This special exception to the GPL applies to versions of the Autoconf -# Macro released by the Autoconf Archive. When you make and distribute a -# modified version of the Autoconf Macro, you may extend this special -# exception to the GPL to apply to your modified version as well. +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. -#serial 3 +#serial 7 AC_DEFUN([AX_APPEND_COMPILE_FLAGS], -[AC_REQUIRE([AX_CHECK_COMPILE_FLAG]) -AC_REQUIRE([AX_APPEND_FLAG]) +[AX_REQUIRE_DEFINED([AX_CHECK_COMPILE_FLAG]) +AX_REQUIRE_DEFINED([AX_APPEND_FLAG]) for flag in $1; do - AX_CHECK_COMPILE_FLAG([$flag], [AX_APPEND_FLAG([$flag], [$2])], [], [$3]) + AX_CHECK_COMPILE_FLAG([$flag], [AX_APPEND_FLAG([$flag], [$2])], [], [$3], [$4]) done ])dnl AX_APPEND_COMPILE_FLAGS diff --git a/deps/cares/m4/ax_append_flag.m4 b/deps/cares/m4/ax_append_flag.m4 index 1d38b76fb8e157..dd6d8b61406c32 100644 --- a/deps/cares/m4/ax_append_flag.m4 +++ b/deps/cares/m4/ax_append_flag.m4 @@ -1,5 +1,5 @@ # =========================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_append_flag.html +# https://www.gnu.org/software/autoconf-archive/ax_append_flag.html # =========================================================================== # # SYNOPSIS @@ -23,47 +23,28 @@ # Copyright (c) 2008 Guido U. Draheim # Copyright (c) 2011 Maarten Bosmans # -# 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 . -# -# As a special exception, the respective Autoconf Macro's copyright owner -# gives unlimited permission to copy, distribute and modify the configure -# scripts that are the output of Autoconf when processing the Macro. You -# need not follow the terms of the GNU General Public License when using -# or distributing such scripts, even though portions of the text of the -# Macro appear in them. The GNU General Public License (GPL) does govern -# all other use of the material that constitutes the Autoconf Macro. -# -# This special exception to the GPL applies to versions of the Autoconf -# Macro released by the Autoconf Archive. When you make and distribute a -# modified version of the Autoconf Macro, you may extend this special -# exception to the GPL to apply to your modified version as well. +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. -#serial 2 +#serial 8 AC_DEFUN([AX_APPEND_FLAG], -[AC_PREREQ(2.59)dnl for _AC_LANG_PREFIX -AS_VAR_PUSHDEF([FLAGS], [m4_default($2,_AC_LANG_PREFIX[FLAGS])])dnl -AS_VAR_SET_IF(FLAGS, - [case " AS_VAR_GET(FLAGS) " in - *" $1 "*) - AC_RUN_LOG([: FLAGS already contains $1]) - ;; - *) - AC_RUN_LOG([: FLAGS="$FLAGS $1"]) - AS_VAR_SET(FLAGS, ["AS_VAR_GET(FLAGS) $1"]) - ;; - esac], - [AS_VAR_SET(FLAGS,["$1"])]) +[dnl +AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_SET_IF +AS_VAR_PUSHDEF([FLAGS], [m4_default($2,_AC_LANG_PREFIX[FLAGS])]) +AS_VAR_SET_IF(FLAGS,[ + AS_CASE([" AS_VAR_GET(FLAGS) "], + [*" $1 "*], [AC_RUN_LOG([: FLAGS already contains $1])], + [ + AS_VAR_APPEND(FLAGS,[" $1"]) + AC_RUN_LOG([: FLAGS="$FLAGS"]) + ]) + ], + [ + AS_VAR_SET(FLAGS,[$1]) + AC_RUN_LOG([: FLAGS="$FLAGS"]) + ]) AS_VAR_POPDEF([FLAGS])dnl ])dnl AX_APPEND_FLAG diff --git a/deps/cares/m4/ax_check_compile_flag.m4 b/deps/cares/m4/ax_check_compile_flag.m4 index c3a8d695a1bcda..54191c55353ee5 100644 --- a/deps/cares/m4/ax_check_compile_flag.m4 +++ b/deps/cares/m4/ax_check_compile_flag.m4 @@ -1,10 +1,10 @@ # =========================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html +# https://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html # =========================================================================== # # SYNOPSIS # -# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS]) +# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT]) # # DESCRIPTION # @@ -19,6 +19,8 @@ # the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to # force the compiler to issue an error when a bad flag is given. # +# INPUT gives an alternative input source to AC_COMPILE_IFELSE. +# # NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this # macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG. # @@ -27,45 +29,34 @@ # Copyright (c) 2008 Guido U. Draheim # Copyright (c) 2011 Maarten Bosmans # -# 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 . -# -# As a special exception, the respective Autoconf Macro's copyright owner -# gives unlimited permission to copy, distribute and modify the configure -# scripts that are the output of Autoconf when processing the Macro. You -# need not follow the terms of the GNU General Public License when using -# or distributing such scripts, even though portions of the text of the -# Macro appear in them. The GNU General Public License (GPL) does govern -# all other use of the material that constitutes the Autoconf Macro. -# -# This special exception to the GPL applies to versions of the Autoconf -# Macro released by the Autoconf Archive. When you make and distribute a -# modified version of the Autoconf Macro, you may extend this special -# exception to the GPL to apply to your modified version as well. +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. -#serial 2 +#serial 11 AC_DEFUN([AX_CHECK_COMPILE_FLAG], -[AC_PREREQ(2.59)dnl for _AC_LANG_PREFIX +[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl -AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [ +AC_CACHE_CHECK([whether the _AC_LANG compiler accepts $1], CACHEVAR, [ ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS - _AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1" - AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], + if test x"m4_case(_AC_LANG, + [C], [$GCC], + [C++], [$GXX], + [Fortran], [$GFC], + [Fortran 77], [$G77], + [Objective C], [$GOBJC], + [Objective C++], [$GOBJCXX], + [no])" = xyes ; then + add_gnu_werror="-Werror" + fi + _AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1 $add_gnu_werror" + AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])], [AS_VAR_SET(CACHEVAR,[yes])], [AS_VAR_SET(CACHEVAR,[no])]) _AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags]) -AS_IF([test x"AS_VAR_GET(CACHEVAR)" = xyes], +AS_VAR_IF(CACHEVAR,yes, [m4_default([$2], :)], [m4_default([$3], :)]) AS_VAR_POPDEF([CACHEVAR])dnl diff --git a/deps/cares/m4/ax_check_user_namespace.m4 b/deps/cares/m4/ax_check_user_namespace.m4 deleted file mode 100644 index aca721626f2e89..00000000000000 --- a/deps/cares/m4/ax_check_user_namespace.m4 +++ /dev/null @@ -1,57 +0,0 @@ -# -*- Autoconf -*- - -# SYNOPSIS -# -# AX_CHECK_USER_NAMESPACE -# -# DESCRIPTION -# -# This macro checks whether the local system supports Linux user namespaces. -# If so, it calls AC_DEFINE(HAVE_USER_NAMESPACE). -# -# Copyright (C) The c-ares team -# SPDX-License-Identifier: MIT - -AC_DEFUN([AX_CHECK_USER_NAMESPACE],[dnl - AC_CACHE_CHECK([whether user namespaces are supported], - ax_cv_user_namespace,[ - AC_LANG_PUSH([C]) - AC_RUN_IFELSE([AC_LANG_SOURCE([[ -#define _GNU_SOURCE -#include -#include -#include -#include -#include -#include -#include - -int userfn(void *d) { - usleep(100000); /* synchronize by sleep */ - return (getuid() != 0); -} -char userst[1024*1024]; -int main() { - char buffer[1024]; - int rc, status, fd; - pid_t child = clone(userfn, userst + 1024*1024, CLONE_NEWUSER|SIGCHLD, 0); - if (child < 0) return 1; - - snprintf(buffer, sizeof(buffer), "/proc/%d/uid_map", child); - fd = open(buffer, O_CREAT|O_WRONLY|O_TRUNC, 0755); - snprintf(buffer, sizeof(buffer), "0 %d 1\n", getuid()); - write(fd, buffer, strlen(buffer)); - close(fd); - - rc = waitpid(child, &status, 0); - if (rc <= 0) return 1; - if (!WIFEXITED(status)) return 1; - return WEXITSTATUS(status); -} - ]])],[ax_cv_user_namespace=yes],[ax_cv_user_namespace=no],[ax_cv_user_namespace=no]) - AC_LANG_POP([C]) - ]) - if test "$ax_cv_user_namespace" = yes; then - AC_DEFINE([HAVE_USER_NAMESPACE],[1],[Whether user namespaces are available]) - fi -]) # AX_CHECK_USER_NAMESPACE diff --git a/deps/cares/m4/ax_check_uts_namespace.m4 b/deps/cares/m4/ax_check_uts_namespace.m4 deleted file mode 100644 index 5708acf1b9f376..00000000000000 --- a/deps/cares/m4/ax_check_uts_namespace.m4 +++ /dev/null @@ -1,79 +0,0 @@ -# -*- Autoconf -*- - -# SYNOPSIS -# -# AX_CHECK_UTS_NAMESPACE -# -# DESCRIPTION -# -# This macro checks whether the local system supports Linux UTS namespaces. -# Also requires user namespaces to be available, so that non-root users -# can enter the namespace. -# If so, it calls AC_DEFINE(HAVE_UTS_NAMESPACE). -# -# Copyright (C) The c-ares team -# SPDX-License-Identifier: MIT - -AC_DEFUN([AX_CHECK_UTS_NAMESPACE],[dnl - AC_CACHE_CHECK([whether UTS namespaces are supported], - ax_cv_uts_namespace,[ - AC_LANG_PUSH([C]) - AC_RUN_IFELSE([AC_LANG_SOURCE([[ -#define _GNU_SOURCE -#include -#include -#include -#include -#include -#include -#include -#include - -int utsfn(void *d) { - char buffer[1024]; - const char *name = "autoconftest"; - int rc = sethostname(name, strlen(name)); - if (rc != 0) return 1; - gethostname(buffer, 1024); - return (strcmp(buffer, name) != 0); -} - -char st2[1024*1024]; -int fn(void *d) { - pid_t child; - int rc, status; - usleep(100000); /* synchronize by sleep */ - if (getuid() != 0) return 1; - child = clone(utsfn, st2 + 1024*1024, CLONE_NEWUTS|SIGCHLD, 0); - if (child < 0) return 1; - rc = waitpid(child, &status, 0); - if (rc <= 0) return 1; - if (!WIFEXITED(status)) return 1; - return WEXITSTATUS(status); -} -char st[1024*1024]; -int main() { - char buffer[1024]; - int rc, status, fd; - pid_t child = clone(fn, st + 1024*1024, CLONE_NEWUSER|SIGCHLD, 0); - if (child < 0) return 1; - - snprintf(buffer, sizeof(buffer), "/proc/%d/uid_map", child); - fd = open(buffer, O_CREAT|O_WRONLY|O_TRUNC, 0755); - snprintf(buffer, sizeof(buffer), "0 %d 1\n", getuid()); - write(fd, buffer, strlen(buffer)); - close(fd); - - rc = waitpid(child, &status, 0); - if (rc <= 0) return 1; - if (!WIFEXITED(status)) return 1; - return WEXITSTATUS(status); -} -]]) - ],[ax_cv_uts_namespace=yes],[ax_cv_uts_namespace=no],[ax_cv_uts_namespace=no]) - AC_LANG_POP([C]) - ]) - if test "$ax_cv_uts_namespace" = yes; then - AC_DEFINE([HAVE_UTS_NAMESPACE],[1],[Whether UTS namespaces are available]) - fi -]) # AX_CHECK_UTS_NAMESPACE diff --git a/deps/cares/m4/ax_code_coverage.m4 b/deps/cares/m4/ax_code_coverage.m4 index ad4063305ebcdd..216708a41f10c9 100644 --- a/deps/cares/m4/ax_code_coverage.m4 +++ b/deps/cares/m4/ax_code_coverage.m4 @@ -74,7 +74,7 @@ # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . -#serial 34 +#serial 37 m4_define(_AX_CODE_COVERAGE_RULES,[ AX_ADD_AM_MACRO_STATIC([ @@ -144,7 +144,7 @@ code_coverage_v_lcov_cap_ = \$(code_coverage_v_lcov_cap_\$(AM_DEFAULT_VERBOSITY) code_coverage_v_lcov_cap_0 = @echo \" LCOV --capture\" \$(CODE_COVERAGE_OUTPUT_FILE); code_coverage_v_lcov_ign = \$(code_coverage_v_lcov_ign_\$(V)) code_coverage_v_lcov_ign_ = \$(code_coverage_v_lcov_ign_\$(AM_DEFAULT_VERBOSITY)) -code_coverage_v_lcov_ign_0 = @echo \" LCOV --remove /tmp/*\" \$(CODE_COVERAGE_IGNORE_PATTERN); +code_coverage_v_lcov_ign_0 = @echo \" LCOV --remove\" \"\$(CODE_COVERAGE_OUTPUT_FILE).tmp\" \$(CODE_COVERAGE_IGNORE_PATTERN); code_coverage_v_genhtml = \$(code_coverage_v_genhtml_\$(V)) code_coverage_v_genhtml_ = \$(code_coverage_v_genhtml_\$(AM_DEFAULT_VERBOSITY)) code_coverage_v_genhtml_0 = @echo \" GEN \" \"\$(CODE_COVERAGE_OUTPUT_DIRECTORY)\"; @@ -163,7 +163,7 @@ check-code-coverage: # Capture code coverage data code-coverage-capture: code-coverage-capture-hook \$(code_coverage_v_lcov_cap)\$(LCOV) \$(code_coverage_quiet) \$(addprefix --directory ,\$(CODE_COVERAGE_DIRECTORY)) --capture --output-file \"\$(CODE_COVERAGE_OUTPUT_FILE).tmp\" --test-name \"\$(call code_coverage_sanitize,\$(PACKAGE_NAME)-\$(PACKAGE_VERSION))\" --no-checksum --compat-libtool \$(CODE_COVERAGE_LCOV_SHOPTS) \$(CODE_COVERAGE_LCOV_OPTIONS) - \$(code_coverage_v_lcov_ign)\$(LCOV) \$(code_coverage_quiet) \$(addprefix --directory ,\$(CODE_COVERAGE_DIRECTORY)) --remove \"\$(CODE_COVERAGE_OUTPUT_FILE).tmp\" \"/tmp/*\" \$(CODE_COVERAGE_IGNORE_PATTERN) --output-file \"\$(CODE_COVERAGE_OUTPUT_FILE)\" \$(CODE_COVERAGE_LCOV_SHOPTS) \$(CODE_COVERAGE_LCOV_RMOPTS) + \$(code_coverage_v_lcov_ign)\$(LCOV) \$(code_coverage_quiet) \$(addprefix --directory ,\$(CODE_COVERAGE_DIRECTORY)) --remove \"\$(CODE_COVERAGE_OUTPUT_FILE).tmp\" \$(CODE_COVERAGE_IGNORE_PATTERN) --output-file \"\$(CODE_COVERAGE_OUTPUT_FILE)\" \$(CODE_COVERAGE_LCOV_SHOPTS) \$(CODE_COVERAGE_LCOV_RMOPTS) -@rm -f \"\$(CODE_COVERAGE_OUTPUT_FILE).tmp\" \$(code_coverage_v_genhtml)LANG=C \$(GENHTML) \$(code_coverage_quiet) \$(addprefix --prefix ,\$(CODE_COVERAGE_DIRECTORY)) --output-directory \"\$(CODE_COVERAGE_OUTPUT_DIRECTORY)\" --title \"\$(PACKAGE_NAME)-\$(PACKAGE_VERSION) Code Coverage\" --legend --show-details \"\$(CODE_COVERAGE_OUTPUT_FILE)\" \$(CODE_COVERAGE_GENHTML_OPTIONS) @echo \"file://\$(abs_builddir)/\$(CODE_COVERAGE_OUTPUT_DIRECTORY)/index.html\" @@ -206,14 +206,14 @@ code-coverage-capture-hook: ]) AC_DEFUN([_AX_CODE_COVERAGE_ENABLED],[ - AX_CHECK_GNU_MAKE([],AC_MSG_ERROR([not using GNU make that is needed for coverage])) + AX_CHECK_GNU_MAKE([],[AC_MSG_ERROR([not using GNU make that is needed for coverage])]) AC_REQUIRE([AX_ADD_AM_MACRO_STATIC]) # check for gcov AC_CHECK_TOOL([GCOV], [$_AX_CODE_COVERAGE_GCOV_PROG_WITH], [:]) AS_IF([test "X$GCOV" = "X:"], - AC_MSG_ERROR([gcov is needed to do coverage])) + [AC_MSG_ERROR([gcov is needed to do coverage])]) AC_SUBST([GCOV]) dnl Check if gcc is being used @@ -232,12 +232,13 @@ AC_DEFUN([_AX_CODE_COVERAGE_ENABLED],[ AC_MSG_ERROR([Could not find genhtml from the lcov package]) ]) + AC_CHECK_LIB([gcov], [_gcov_init], [CODE_COVERAGE_LIBS="-lgcov"], [CODE_COVERAGE_LIBS=""]) + dnl Build the code coverage flags dnl Define CODE_COVERAGE_LDFLAGS for backwards compatibility CODE_COVERAGE_CPPFLAGS="-DNDEBUG" CODE_COVERAGE_CFLAGS="-O0 -g -fprofile-arcs -ftest-coverage" CODE_COVERAGE_CXXFLAGS="-O0 -g -fprofile-arcs -ftest-coverage" - CODE_COVERAGE_LIBS="-lgcov" AC_SUBST([CODE_COVERAGE_CPPFLAGS]) AC_SUBST([CODE_COVERAGE_CFLAGS]) diff --git a/deps/cares/m4/ax_cxx_compile_stdcxx.m4 b/deps/cares/m4/ax_cxx_compile_stdcxx.m4 index 8edf5152ec7a91..fe6ae17e6c4d32 100644 --- a/deps/cares/m4/ax_cxx_compile_stdcxx.m4 +++ b/deps/cares/m4/ax_cxx_compile_stdcxx.m4 @@ -10,8 +10,8 @@ # # Check for baseline language coverage in the compiler for the specified # version of the C++ standard. If necessary, add switches to CXX and -# CXXCPP to enable support. VERSION may be '11', '14', '17', or '20' for -# the respective C++ standard version. +# CXXCPP to enable support. VERSION may be '11', '14', '17', '20', or +# '23' for the respective C++ standard version. # # The second argument, if specified, indicates whether you insist on an # extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g. @@ -36,14 +36,15 @@ # Copyright (c) 2016, 2018 Krzesimir Nowak # Copyright (c) 2019 Enji Cooper # Copyright (c) 2020 Jason Merrill -# Copyright (c) 2021 Jörn Heusipp +# Copyright (c) 2021, 2024 Jörn Heusipp +# Copyright (c) 2015, 2022, 2023, 2024 Olly Betts # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. -#serial 18 +#serial 25 dnl This macro is based on the code from the AX_CXX_COMPILE_STDCXX_11 macro dnl (serial version number 13). @@ -53,6 +54,7 @@ AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl [$1], [14], [ax_cxx_compile_alternatives="14 1y"], [$1], [17], [ax_cxx_compile_alternatives="17 1z"], [$1], [20], [ax_cxx_compile_alternatives="20"], + [$1], [23], [ax_cxx_compile_alternatives="23"], [m4_fatal([invalid first argument `$1' to AX_CXX_COMPILE_STDCXX])])dnl m4_if([$2], [], [], [$2], [ext], [], @@ -159,31 +161,41 @@ AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl dnl Test body for checking C++11 support m4_define([_AX_CXX_COMPILE_STDCXX_testbody_11], - _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 + [_AX_CXX_COMPILE_STDCXX_testbody_new_in_11] ) dnl Test body for checking C++14 support m4_define([_AX_CXX_COMPILE_STDCXX_testbody_14], - _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 - _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 + [_AX_CXX_COMPILE_STDCXX_testbody_new_in_11 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_14] ) dnl Test body for checking C++17 support m4_define([_AX_CXX_COMPILE_STDCXX_testbody_17], - _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 - _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 - _AX_CXX_COMPILE_STDCXX_testbody_new_in_17 + [_AX_CXX_COMPILE_STDCXX_testbody_new_in_11 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_17] ) dnl Test body for checking C++20 support m4_define([_AX_CXX_COMPILE_STDCXX_testbody_20], - _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 - _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 - _AX_CXX_COMPILE_STDCXX_testbody_new_in_17 - _AX_CXX_COMPILE_STDCXX_testbody_new_in_20 + [_AX_CXX_COMPILE_STDCXX_testbody_new_in_11 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_17 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_20] +) + +dnl Test body for checking C++23 support + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_23], + [_AX_CXX_COMPILE_STDCXX_testbody_new_in_11 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_17 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_20 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_23] ) @@ -201,7 +213,17 @@ m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_11], [[ // MSVC always sets __cplusplus to 199711L in older versions; newer versions // only set it correctly if /Zc:__cplusplus is specified as well as a // /std:c++NN switch: +// // https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/ +// +// The value __cplusplus ought to have is available in _MSVC_LANG since +// Visual Studio 2015 Update 3: +// +// https://learn.microsoft.com/en-us/cpp/preprocessor/predefined-macros +// +// This was also the first MSVC version to support C++14 so we can't use the +// value of either __cplusplus or _MSVC_LANG to quickly rule out MSVC having +// C++11 or C++14 support, but we can check _MSVC_LANG for C++17 and later. #elif __cplusplus < 201103L && !defined _MSC_VER #error "This is not a C++11 compiler" @@ -617,7 +639,7 @@ m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_17], [[ #error "This is not a C++ compiler" -#elif __cplusplus < 201703L && !defined _MSC_VER +#elif (defined _MSVC_LANG ? _MSVC_LANG : __cplusplus) < 201703L #error "This is not a C++17 compiler" @@ -983,7 +1005,7 @@ namespace cxx17 } // namespace cxx17 -#endif // __cplusplus < 201703L && !defined _MSC_VER +#endif // (defined _MSVC_LANG ? _MSVC_LANG : __cplusplus) < 201703L ]]) @@ -996,7 +1018,7 @@ m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_20], [[ #error "This is not a C++ compiler" -#elif __cplusplus < 202002L && !defined _MSC_VER +#elif (defined _MSVC_LANG ? _MSVC_LANG : __cplusplus) < 202002L #error "This is not a C++20 compiler" @@ -1013,6 +1035,36 @@ namespace cxx20 } // namespace cxx20 -#endif // __cplusplus < 202002L && !defined _MSC_VER +#endif // (defined _MSVC_LANG ? _MSVC_LANG : __cplusplus) < 202002L + +]]) + + +dnl Tests for new features in C++23 + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_23], [[ + +#ifndef __cplusplus + +#error "This is not a C++ compiler" + +#elif (defined _MSVC_LANG ? _MSVC_LANG : __cplusplus) < 202302L + +#error "This is not a C++23 compiler" + +#else + +#include + +namespace cxx23 +{ + +// As C++23 supports feature test macros in the standard, there is no +// immediate need to actually test for feature availability on the +// Autoconf side. + +} // namespace cxx23 + +#endif // (defined _MSVC_LANG ? _MSVC_LANG : __cplusplus) < 202302L ]]) diff --git a/deps/cares/src/Makefile.in b/deps/cares/src/Makefile.in index 0c3c0864d4460a..1f286880247aa1 100644 --- a/deps/cares/src/Makefile.in +++ b/deps/cares/src/Makefile.in @@ -89,7 +89,9 @@ build_triplet = @build@ host_triplet = @host@ subdir = src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ +am__aclocal_m4_deps = $(top_srcdir)/m4/ares_check_user_namespace.m4 \ + $(top_srcdir)/m4/ares_check_uts_namespace.m4 \ + $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ $(top_srcdir)/m4/ax_ac_print_to_file.m4 \ $(top_srcdir)/m4/ax_add_am_macro_static.m4 \ $(top_srcdir)/m4/ax_am_macros_static.m4 \ @@ -99,8 +101,6 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_check_gnu_make.m4 \ $(top_srcdir)/m4/ax_check_link_flag.m4 \ - $(top_srcdir)/m4/ax_check_user_namespace.m4 \ - $(top_srcdir)/m4/ax_check_uts_namespace.m4 \ $(top_srcdir)/m4/ax_code_coverage.m4 \ $(top_srcdir)/m4/ax_compiler_vendor.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ diff --git a/deps/cares/src/lib/CMakeLists.txt b/deps/cares/src/lib/CMakeLists.txt index 9956fd625b2ad6..9d4e10924d0adb 100644 --- a/deps/cares/src/lib/CMakeLists.txt +++ b/deps/cares/src/lib/CMakeLists.txt @@ -92,11 +92,23 @@ IF (CARES_STATIC) SET_TARGET_PROPERTIES (${LIBNAME} PROPERTIES EXPORT_NAME cares${STATIC_SUFFIX} - OUTPUT_NAME cares${STATIC_SUFFIX} COMPILE_PDB_NAME cares${STATIC_SUFFIX} C_STANDARD 90 ) + # On Windows, the output name should have a static suffix since otherwise + # we would have conflicting output names (libcares.lib) for the link + # library. + # However on Unix-like systems, we typically have something like + # libcares.so for shared libraries and libcares.a for static + # libraries, so these don't conflict. + # This behavior better emulates what happens with autotools builds + IF (WIN32) + SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES OUTPUT_NAME cares${STATIC_SUFFIX}) + ELSE () + SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES OUTPUT_NAME cares) + ENDIF() + IF (ANDROID) SET_TARGET_PROPERTIES (${LIBNAME} PROPERTIES C_STANDARD 99) ENDIF () diff --git a/deps/cares/src/lib/Makefile.in b/deps/cares/src/lib/Makefile.in index 4aff043b26a310..a45fc10b544755 100644 --- a/deps/cares/src/lib/Makefile.in +++ b/deps/cares/src/lib/Makefile.in @@ -15,7 +15,7 @@ @SET_MAKE@ # aminclude_static.am generated automatically by Autoconf -# from AX_AM_MACROS_STATIC on Sat Nov 9 17:40:37 UTC 2024 +# from AX_AM_MACROS_STATIC on Sat Dec 14 15:15:44 UTC 2024 # Copyright (C) The c-ares project and its contributors # SPDX-License-Identifier: MIT @@ -100,7 +100,9 @@ host_triplet = @host@ subdir = src/lib SUBDIRS = ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ +am__aclocal_m4_deps = $(top_srcdir)/m4/ares_check_user_namespace.m4 \ + $(top_srcdir)/m4/ares_check_uts_namespace.m4 \ + $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ $(top_srcdir)/m4/ax_ac_print_to_file.m4 \ $(top_srcdir)/m4/ax_add_am_macro_static.m4 \ $(top_srcdir)/m4/ax_am_macros_static.m4 \ @@ -110,8 +112,6 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_check_gnu_make.m4 \ $(top_srcdir)/m4/ax_check_link_flag.m4 \ - $(top_srcdir)/m4/ax_check_user_namespace.m4 \ - $(top_srcdir)/m4/ax_check_uts_namespace.m4 \ $(top_srcdir)/m4/ax_code_coverage.m4 \ $(top_srcdir)/m4/ax_compiler_vendor.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ @@ -629,7 +629,7 @@ libcares_la_CPPFLAGS_EXTRA = -DCARES_BUILDING_LIBRARY $(am__append_3) \ @CODE_COVERAGE_ENABLED_TRUE@code_coverage_v_lcov_cap_0 = @echo " LCOV --capture" $(CODE_COVERAGE_OUTPUT_FILE); @CODE_COVERAGE_ENABLED_TRUE@code_coverage_v_lcov_ign = $(code_coverage_v_lcov_ign_$(V)) @CODE_COVERAGE_ENABLED_TRUE@code_coverage_v_lcov_ign_ = $(code_coverage_v_lcov_ign_$(AM_DEFAULT_VERBOSITY)) -@CODE_COVERAGE_ENABLED_TRUE@code_coverage_v_lcov_ign_0 = @echo " LCOV --remove /tmp/*" $(CODE_COVERAGE_IGNORE_PATTERN); +@CODE_COVERAGE_ENABLED_TRUE@code_coverage_v_lcov_ign_0 = @echo " LCOV --remove" "$(CODE_COVERAGE_OUTPUT_FILE).tmp" $(CODE_COVERAGE_IGNORE_PATTERN); @CODE_COVERAGE_ENABLED_TRUE@code_coverage_v_genhtml = $(code_coverage_v_genhtml_$(V)) @CODE_COVERAGE_ENABLED_TRUE@code_coverage_v_genhtml_ = $(code_coverage_v_genhtml_$(AM_DEFAULT_VERBOSITY)) @CODE_COVERAGE_ENABLED_TRUE@code_coverage_v_genhtml_0 = @echo " GEN " "$(CODE_COVERAGE_OUTPUT_DIRECTORY)"; @@ -2328,7 +2328,7 @@ uninstall-am: uninstall-libLTLIBRARIES # Capture code coverage data @CODE_COVERAGE_ENABLED_TRUE@code-coverage-capture: code-coverage-capture-hook @CODE_COVERAGE_ENABLED_TRUE@ $(code_coverage_v_lcov_cap)$(LCOV) $(code_coverage_quiet) $(addprefix --directory ,$(CODE_COVERAGE_DIRECTORY)) --capture --output-file "$(CODE_COVERAGE_OUTPUT_FILE).tmp" --test-name "$(call code_coverage_sanitize,$(PACKAGE_NAME)-$(PACKAGE_VERSION))" --no-checksum --compat-libtool $(CODE_COVERAGE_LCOV_SHOPTS) $(CODE_COVERAGE_LCOV_OPTIONS) -@CODE_COVERAGE_ENABLED_TRUE@ $(code_coverage_v_lcov_ign)$(LCOV) $(code_coverage_quiet) $(addprefix --directory ,$(CODE_COVERAGE_DIRECTORY)) --remove "$(CODE_COVERAGE_OUTPUT_FILE).tmp" "/tmp/*" $(CODE_COVERAGE_IGNORE_PATTERN) --output-file "$(CODE_COVERAGE_OUTPUT_FILE)" $(CODE_COVERAGE_LCOV_SHOPTS) $(CODE_COVERAGE_LCOV_RMOPTS) +@CODE_COVERAGE_ENABLED_TRUE@ $(code_coverage_v_lcov_ign)$(LCOV) $(code_coverage_quiet) $(addprefix --directory ,$(CODE_COVERAGE_DIRECTORY)) --remove "$(CODE_COVERAGE_OUTPUT_FILE).tmp" $(CODE_COVERAGE_IGNORE_PATTERN) --output-file "$(CODE_COVERAGE_OUTPUT_FILE)" $(CODE_COVERAGE_LCOV_SHOPTS) $(CODE_COVERAGE_LCOV_RMOPTS) @CODE_COVERAGE_ENABLED_TRUE@ -@rm -f "$(CODE_COVERAGE_OUTPUT_FILE).tmp" @CODE_COVERAGE_ENABLED_TRUE@ $(code_coverage_v_genhtml)LANG=C $(GENHTML) $(code_coverage_quiet) $(addprefix --prefix ,$(CODE_COVERAGE_DIRECTORY)) --output-directory "$(CODE_COVERAGE_OUTPUT_DIRECTORY)" --title "$(PACKAGE_NAME)-$(PACKAGE_VERSION) Code Coverage" --legend --show-details "$(CODE_COVERAGE_OUTPUT_FILE)" $(CODE_COVERAGE_GENHTML_OPTIONS) @CODE_COVERAGE_ENABLED_TRUE@ @echo "file://$(abs_builddir)/$(CODE_COVERAGE_OUTPUT_DIRECTORY)/index.html" diff --git a/deps/cares/src/lib/ares_config.h.cmake b/deps/cares/src/lib/ares_config.h.cmake index 051b97f494fd32..51744fe143868c 100644 --- a/deps/cares/src/lib/ares_config.h.cmake +++ b/deps/cares/src/lib/ares_config.h.cmake @@ -257,6 +257,9 @@ /* Define to 1 if you have the header file. */ #cmakedefine HAVE_SIGNAL_H 1 +/* Define to 1 if you have the strnlen function. */ +#cmakedefine HAVE_STRNLEN 1 + /* Define to 1 if your struct sockaddr_in6 has sin6_scope_id. */ #cmakedefine HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID 1 diff --git a/deps/cares/src/lib/ares_config.h.in b/deps/cares/src/lib/ares_config.h.in index d1f09d694db68e..a62e17089358aa 100644 --- a/deps/cares/src/lib/ares_config.h.in +++ b/deps/cares/src/lib/ares_config.h.in @@ -309,6 +309,9 @@ /* Define to 1 if you have `strnicmp` */ #undef HAVE_STRNICMP +/* Define to 1 if you have `strnlen` */ +#undef HAVE_STRNLEN + /* Define to 1 if the system has the type `struct addrinfo'. */ #undef HAVE_STRUCT_ADDRINFO diff --git a/deps/cares/src/lib/ares_private.h b/deps/cares/src/lib/ares_private.h index ce8c3f2ddc2f6c..e6d44e8b8640f9 100644 --- a/deps/cares/src/lib/ares_private.h +++ b/deps/cares/src/lib/ares_private.h @@ -388,8 +388,23 @@ ares_status_t ares_sysconfig_set_options(ares_sysconfig_t *sysconfig, ares_status_t ares_init_by_environment(ares_sysconfig_t *sysconfig); + +typedef ares_status_t (*ares_sysconfig_line_cb_t)(const ares_channel_t *channel, + ares_sysconfig_t *sysconfig, + ares_buf_t *line); + +ares_status_t ares_sysconfig_parse_resolv_line(const ares_channel_t *channel, + ares_sysconfig_t *sysconfig, + ares_buf_t *line); + +ares_status_t ares_sysconfig_process_buf(const ares_channel_t *channel, + ares_sysconfig_t *sysconfig, + ares_buf_t *buf, + ares_sysconfig_line_cb_t cb); + ares_status_t ares_init_sysconfig_files(const ares_channel_t *channel, - ares_sysconfig_t *sysconfig); + ares_sysconfig_t *sysconfig, + ares_bool_t process_resolvconf); #ifdef __APPLE__ ares_status_t ares_init_sysconfig_macos(const ares_channel_t *channel, ares_sysconfig_t *sysconfig); diff --git a/deps/cares/src/lib/ares_set_socket_functions.c b/deps/cares/src/lib/ares_set_socket_functions.c index 143c491174fdba..7216ffa933fc07 100644 --- a/deps/cares/src/lib/ares_set_socket_functions.c +++ b/deps/cares/src/lib/ares_set_socket_functions.c @@ -288,7 +288,9 @@ static int default_asetsockopt(ares_socket_t sock, ares_socket_opt_t opt, return setsockopt(sock, SOL_SOCKET, SO_RCVBUF, val, val_size); case ARES_SOCKET_OPT_BIND_DEVICE: - if (!ares_str_isprint(val, (size_t)val_size)) { + /* Count the number of characters before NULL terminator then + * validate those are all printable */ + if (!ares_str_isprint(val, ares_strnlen(val, (size_t)val_size))) { SET_SOCKERRNO(EINVAL); return -1; } diff --git a/deps/cares/src/lib/ares_socket.c b/deps/cares/src/lib/ares_socket.c index df02fd61b60b14..516852a84abfb8 100644 --- a/deps/cares/src/lib/ares_socket.c +++ b/deps/cares/src/lib/ares_socket.c @@ -263,7 +263,8 @@ ares_status_t ares_socket_configure(ares_channel_t *channel, int family, * compatibility */ (void)channel->sock_funcs.asetsockopt( fd, ARES_SOCKET_OPT_BIND_DEVICE, channel->local_dev_name, - sizeof(channel->local_dev_name), channel->sock_func_cb_data); + (ares_socklen_t)ares_strlen(channel->local_dev_name), + channel->sock_func_cb_data); } /* Bind to ip address if configured */ diff --git a/deps/cares/src/lib/ares_sysconfig.c b/deps/cares/src/lib/ares_sysconfig.c index 9f0d7e5061ffe0..286db60328f45b 100644 --- a/deps/cares/src/lib/ares_sysconfig.c +++ b/deps/cares/src/lib/ares_sysconfig.c @@ -260,6 +260,94 @@ static ares_status_t ares_init_sysconfig_android(const ares_channel_t *channel, } #endif +#if defined(__QNX__) +static ares_status_t + ares_init_sysconfig_qnx(const ares_channel_t *channel, + ares_sysconfig_t *sysconfig) +{ + /* QNX: + * 1. use confstr(_CS_RESOLVE, ...) as primary resolv.conf data, replacing + * "_" with " ". If that is empty, then do normal /etc/resolv.conf + * processing. + * 2. We want to process /etc/nsswitch.conf as normal. + * 3. if confstr(_CS_DOMAIN, ...) this is the domain name. Use this as + * preference over anything else found. + */ + ares_buf_t *buf = ares_buf_create(); + unsigned char *data = NULL; + size_t data_size = 0; + ares_bool_t process_resolvconf = ARES_TRUE; + ares_status_t status = ARES_SUCCESS; + + /* Prefer confstr(_CS_RESOLVE, ...) */ + buf = ares_buf_create(); + if (buf == NULL) { + status = ARES_ENOMEM; + goto done; + } + + data_size = 1024; + data = ares_buf_append_start(buf, &data_size); + if (data == NULL) { + status = ARES_ENOMEM; + goto done; + } + + data_size = confstr(_CS_RESOLVE, (char *)data, data_size); + if (data_size > 1) { + /* confstr returns byte for NULL terminator, strip */ + data_size--; + + ares_buf_append_finish(buf, data_size); + /* Its odd, this uses _ instead of " " between keywords, otherwise the + * format is the same as resolv.conf, replace. */ + ares_buf_replace(buf, (const unsigned char *)"_", 1, + (const unsigned char *)" ", 1); + + status = ares_sysconfig_process_buf(channel, sysconfig, buf, + ares_sysconfig_parse_resolv_line); + if (status != ARES_SUCCESS) { + /* ENOMEM is really the only error we'll get here */ + goto done; + } + + /* don't read resolv.conf if we processed *any* nameservers */ + if (ares_llist_len(sysconfig->sconfig) != 0) { + process_resolvconf = ARES_FALSE; + } + } + + /* Process files */ + status = ares_init_sysconfig_files(channel, sysconfig, process_resolvconf); + if (status != ARES_SUCCESS) { + goto done; + } + + /* Read confstr(_CS_DOMAIN, ...), but if we had a search path specified with + * more than one domain, lets prefer that instead. Its not exactly clear + * the best way to handle this. */ + if (sysconfig->ndomains <= 1) { + char domain[256]; + size_t domain_len; + + domain_len = confstr(_CS_DOMAIN, domain, sizeof(domain_len)); + if (domain_len != 0) { + ares_strsplit_free(sysconfig->domains, sysconfig->ndomains); + sysconfig->domains = ares_strsplit(domain, ", ", &sysconfig->ndomains); + if (sysconfig->domains == NULL) { + status = ARES_ENOMEM; + goto done; + } + } + } + +done: + ares_buf_destroy(buf); + + return status; +} +#endif + #if defined(CARES_USE_LIBRESOLV) static ares_status_t ares_init_sysconfig_libresolv(const ares_channel_t *channel, @@ -516,8 +604,10 @@ ares_status_t ares_init_by_sysconfig(ares_channel_t *channel) status = ares_init_sysconfig_macos(channel, &sysconfig); #elif defined(CARES_USE_LIBRESOLV) status = ares_init_sysconfig_libresolv(channel, &sysconfig); +#elif defined(__QNX__) + status = ares_init_sysconfig_qnx(channel, &sysconfig); #else - status = ares_init_sysconfig_files(channel, &sysconfig); + status = ares_init_sysconfig_files(channel, &sysconfig, ARES_TRUE); #endif if (status != ARES_SUCCESS) { diff --git a/deps/cares/src/lib/ares_sysconfig_files.c b/deps/cares/src/lib/ares_sysconfig_files.c index 49bc330d9d346d..a6c2a8e62bb34f 100644 --- a/deps/cares/src/lib/ares_sysconfig_files.c +++ b/deps/cares/src/lib/ares_sysconfig_files.c @@ -549,9 +549,9 @@ ares_status_t ares_init_by_environment(ares_sysconfig_t *sysconfig) /* This function will only return ARES_SUCCESS or ARES_ENOMEM. Any other * conditions are ignored. Users may mess up config files, but we want to * process anything we can. */ -static ares_status_t parse_resolvconf_line(const ares_channel_t *channel, - ares_sysconfig_t *sysconfig, - ares_buf_t *line) +ares_status_t ares_sysconfig_parse_resolv_line(const ares_channel_t *channel, + ares_sysconfig_t *sysconfig, + ares_buf_t *line) { char option[32]; char value[512]; @@ -726,9 +726,38 @@ static ares_status_t parse_svcconf_line(const ares_channel_t *channel, return status; } -typedef ares_status_t (*line_callback_t)(const ares_channel_t *channel, - ares_sysconfig_t *sysconfig, - ares_buf_t *line); + +ares_status_t ares_sysconfig_process_buf(const ares_channel_t *channel, + ares_sysconfig_t *sysconfig, + ares_buf_t *buf, + ares_sysconfig_line_cb_t cb) +{ + ares_array_t *lines = NULL; + size_t num; + size_t i; + ares_status_t status; + + status = ares_buf_split(buf, (const unsigned char *)"\n", 1, + ARES_BUF_SPLIT_TRIM, 0, &lines); + if (status != ARES_SUCCESS) { + goto done; + } + + num = ares_array_len(lines); + for (i = 0; i < num; i++) { + ares_buf_t **bufptr = ares_array_at(lines, i); + ares_buf_t *line = *bufptr; + + status = cb(channel, sysconfig, line); + if (status != ARES_SUCCESS) { + goto done; + } + } + +done: + ares_array_destroy(lines); + return status; +} /* Should only return: * ARES_ENOTFOUND - file not found @@ -737,16 +766,13 @@ typedef ares_status_t (*line_callback_t)(const ares_channel_t *channel, * ARES_SUCCESS - file processed, doesn't necessarily mean it was a good * file, but we're not erroring out if we can't parse * something (or anything at all) */ -static ares_status_t process_config_lines(const ares_channel_t *channel, - const char *filename, - ares_sysconfig_t *sysconfig, - line_callback_t cb) +static ares_status_t process_config_lines(const ares_channel_t *channel, + const char *filename, + ares_sysconfig_t *sysconfig, + ares_sysconfig_line_cb_t cb) { ares_status_t status = ARES_SUCCESS; - ares_array_t *lines = NULL; ares_buf_t *buf = NULL; - size_t num; - size_t i; buf = ares_buf_create(); if (buf == NULL) { @@ -759,43 +785,30 @@ static ares_status_t process_config_lines(const ares_channel_t *channel, goto done; } - status = ares_buf_split(buf, (const unsigned char *)"\n", 1, - ARES_BUF_SPLIT_TRIM, 0, &lines); - if (status != ARES_SUCCESS) { - goto done; - } - - num = ares_array_len(lines); - for (i = 0; i < num; i++) { - ares_buf_t **bufptr = ares_array_at(lines, i); - ares_buf_t *line = *bufptr; - - status = cb(channel, sysconfig, line); - if (status != ARES_SUCCESS) { - goto done; - } - } + status = ares_sysconfig_process_buf(channel, sysconfig, buf, cb); done: ares_buf_destroy(buf); - ares_array_destroy(lines); return status; } ares_status_t ares_init_sysconfig_files(const ares_channel_t *channel, - ares_sysconfig_t *sysconfig) + ares_sysconfig_t *sysconfig, + ares_bool_t process_resolvconf) { ares_status_t status = ARES_SUCCESS; /* Resolv.conf */ - status = process_config_lines(channel, - (channel->resolvconf_path != NULL) - ? channel->resolvconf_path - : PATH_RESOLV_CONF, - sysconfig, parse_resolvconf_line); - if (status != ARES_SUCCESS && status != ARES_ENOTFOUND) { - goto done; + if (process_resolvconf) { + status = process_config_lines(channel, + (channel->resolvconf_path != NULL) + ? channel->resolvconf_path + : PATH_RESOLV_CONF, + sysconfig, ares_sysconfig_parse_resolv_line); + if (status != ARES_SUCCESS && status != ARES_ENOTFOUND) { + goto done; + } } /* Nsswitch.conf */ diff --git a/deps/cares/src/lib/event/ares_event_configchg.c b/deps/cares/src/lib/event/ares_event_configchg.c index e3e665bd165523..5ecc6888ab719f 100644 --- a/deps/cares/src/lib/event/ares_event_configchg.c +++ b/deps/cares/src/lib/event/ares_event_configchg.c @@ -558,14 +558,24 @@ static ares_status_t config_change_check(ares_htable_strvp_t *filestat, const char *resolvconf_path) { size_t i; - const char *configfiles[5]; + const char *configfiles[16]; ares_bool_t changed = ARES_FALSE; + size_t cnt = 0; - configfiles[0] = resolvconf_path; - configfiles[1] = "/etc/nsswitch.conf"; - configfiles[2] = "/etc/netsvc.conf"; - configfiles[3] = "/etc/svc.conf"; - configfiles[4] = NULL; + memset(configfiles, 0, sizeof(configfiles)); + + configfiles[cnt++] = resolvconf_path; + configfiles[cnt++] = "/etc/nsswitch.conf"; +#ifdef _AIX + configfiles[cnt++] = "/etc/netsvc.conf"; +#endif +#ifdef __osf /* Tru64 */ + configfiles[cnt++] = "/etc/svc.conf"; +#endif +#ifdef __QNX__ + configfiles[cnt++] = "/etc/net.cfg"; +#endif + configfiles[cnt++] = NULL; for (i = 0; configfiles[i] != NULL; i++) { fileinfo_t *fi = ares_htable_strvp_get_direct(filestat, configfiles[i]); diff --git a/deps/cares/src/lib/include/ares_buf.h b/deps/cares/src/lib/include/ares_buf.h index 7836a313e066d1..10d29eaf83bd8e 100644 --- a/deps/cares/src/lib/include/ares_buf.h +++ b/deps/cares/src/lib/include/ares_buf.h @@ -219,6 +219,26 @@ CARES_EXTERN unsigned char *ares_buf_finish_bin(ares_buf_t *buf, size_t *len); */ CARES_EXTERN char *ares_buf_finish_str(ares_buf_t *buf, size_t *len); +/*! Replace the given search byte sequence with the replacement byte sequence. + * This is only valid for allocated buffers, not const buffers. Will replace + * all byte sequences starting at the current offset to the end of the buffer. + * + * \param[in] buf Initialized buffer object. Can not be a "const" buffer. + * \param[in] srch Search byte sequence, must not be NULL. + * \param[in] srch_size Size of byte sequence, must not be zero. + * \param[in] rplc Byte sequence to use as replacement. May be NULL if + * rplc_size is zero. + * \param[in] rplc_size Size of replacement byte sequence, may be 0. + * \return ARES_SUCCESS on success, otherwise on may return failure only on + * memory allocation failure or misuse. Will not return indication + * if any replacements occurred + */ +CARES_EXTERN ares_status_t ares_buf_replace(ares_buf_t *buf, + const unsigned char *srch, + size_t srch_size, + const unsigned char *rplc, + size_t rplc_size); + /*! Tag a position to save in the buffer in case parsing needs to rollback, * such as if insufficient data is available, but more data may be added in * the future. Only a single tag can be set per buffer object. Setting a diff --git a/deps/cares/src/lib/include/ares_str.h b/deps/cares/src/lib/include/ares_str.h index ea75b3b3e7441d..4ee339510bf026 100644 --- a/deps/cares/src/lib/include/ares_str.h +++ b/deps/cares/src/lib/include/ares_str.h @@ -29,6 +29,20 @@ CARES_EXTERN char *ares_strdup(const char *s1); +/*! Scan up to maxlen bytes for the first NULL character and return + * its index, or maxlen if not found. The function only returns + * maxlen if the first maxlen bytes were not NULL characters; it + * makes no guarantee for what \c str[maxlen] (if defined) is, and + * does not access it. It is behaving like the POSIX \c strnlen() + * function, except that it returns 0 if the \p str pointer is \c + * NULL. + * + * \param[in] str The string to scan for the NULL character + * \param[in] maxlen The maximum number of bytes to scan + * \return Index of first NULL byte. Between 0 and maxlen (inclusive). + */ +CARES_EXTERN size_t ares_strnlen(const char *str, size_t maxlen); + CARES_EXTERN size_t ares_strlen(const char *str); /*! Copy string from source to destination with destination buffer size diff --git a/deps/cares/src/lib/record/ares_dns_multistring.c b/deps/cares/src/lib/record/ares_dns_multistring.c index 57c0d1c0a803ec..44fcaccd65bb6a 100644 --- a/deps/cares/src/lib/record/ares_dns_multistring.c +++ b/deps/cares/src/lib/record/ares_dns_multistring.c @@ -146,6 +146,18 @@ ares_status_t ares_dns_multistring_add_own(ares_dns_multistring_t *strs, return status; } + /* Issue #921, ares_dns_multistring_get() doesn't have a way to indicate + * success or fail on a zero-length string which is actually valid. So we + * are going to allocate a 1-byte buffer to use as a placeholder in this + * case */ + if (str == NULL) { + str = ares_malloc_zero(1); + if (str == NULL) { + ares_array_remove_last(strs->strs); + return ARES_ENOMEM; + } + } + data->data = str; data->len = len; @@ -252,36 +264,38 @@ ares_status_t ares_dns_multistring_parse_buf(ares_buf_t *buf, break; /* LCOV_EXCL_LINE: DefensiveCoding */ } - if (len) { - /* When used by the _str() parser, it really needs to be validated to - * be a valid printable ascii string. Do that here */ - if (validate_printable && ares_buf_len(buf) >= len) { - size_t mylen; - const char *data = (const char *)ares_buf_peek(buf, &mylen); - if (!ares_str_isprint(data, len)) { - status = ARES_EBADSTR; - break; - } + + /* When used by the _str() parser, it really needs to be validated to + * be a valid printable ascii string. Do that here */ + if (len && validate_printable && ares_buf_len(buf) >= len) { + size_t mylen; + const char *data = (const char *)ares_buf_peek(buf, &mylen); + if (!ares_str_isprint(data, len)) { + status = ARES_EBADSTR; + break; } + } - if (strs != NULL) { - unsigned char *data = NULL; + if (strs != NULL) { + unsigned char *data = NULL; + if (len) { status = ares_buf_fetch_bytes_dup(buf, len, ARES_TRUE, &data); if (status != ARES_SUCCESS) { break; } - status = ares_dns_multistring_add_own(*strs, data, len); - if (status != ARES_SUCCESS) { - ares_free(data); - break; - } - } else { - status = ares_buf_consume(buf, len); - if (status != ARES_SUCCESS) { - break; - } + } + status = ares_dns_multistring_add_own(*strs, data, len); + if (status != ARES_SUCCESS) { + ares_free(data); + break; + } + } else { + status = ares_buf_consume(buf, len); + if (status != ARES_SUCCESS) { + break; } } + } if (status != ARES_SUCCESS && strs != NULL) { diff --git a/deps/cares/src/lib/str/ares_buf.c b/deps/cares/src/lib/str/ares_buf.c index 69e6b38aac849e..63acc6cf7714d3 100644 --- a/deps/cares/src/lib/str/ares_buf.c +++ b/deps/cares/src/lib/str/ares_buf.c @@ -1104,6 +1104,72 @@ const unsigned char *ares_buf_peek(const ares_buf_t *buf, size_t *len) return ares_buf_fetch(buf, len); } +ares_status_t ares_buf_replace(ares_buf_t *buf, const unsigned char *srch, + size_t srch_size, const unsigned char *rplc, + size_t rplc_size) +{ + size_t processed_len = 0; + ares_status_t status; + + if (buf->alloc_buf == NULL || srch == NULL || srch_size == 0 || + (rplc == NULL && rplc_size != 0)) { + return ARES_EFORMERR; + } + + while (1) { + unsigned char *ptr = buf->alloc_buf + buf->offset + processed_len; + size_t remaining_len = buf->data_len - buf->offset - processed_len; + size_t found_offset = 0; + size_t move_data_len; + + /* Find pattern */ + ptr = ares_memmem(ptr, remaining_len, srch, srch_size); + if (ptr == NULL) { + break; + } + + /* Store the offset this was found because our actual pointer might be + * switched out from under us by the call to ensure_space() if the + * replacement pattern is larger than the search pattern */ + found_offset = (size_t)(ptr - (size_t)(buf->alloc_buf + buf->offset)); + if (rplc_size > srch_size) { + status = ares_buf_ensure_space(buf, rplc_size - srch_size); + if (status != ARES_SUCCESS) { + return status; + } + } + + /* Impossible, but silence clang */ + if (buf->alloc_buf == NULL) { + return ARES_ENOMEM; + } + + /* Recalculate actual pointer */ + ptr = buf->alloc_buf + buf->offset + found_offset; + + /* Move the data */ + move_data_len = buf->data_len - buf->offset - found_offset - srch_size; + memmove(ptr + rplc_size, + ptr + srch_size, + move_data_len); + + /* Copy in the replacement data */ + if (rplc != NULL && rplc_size > 0) { + memcpy(ptr, rplc, rplc_size); + } + + if (rplc_size > srch_size) { + buf->data_len += rplc_size - srch_size; + } else { + buf->data_len -= srch_size - rplc_size; + } + + processed_len = found_offset + rplc_size; + } + + return ARES_SUCCESS; +} + ares_status_t ares_buf_peek_byte(const ares_buf_t *buf, unsigned char *b) { size_t remaining_len = 0; diff --git a/deps/cares/src/lib/str/ares_str.c b/deps/cares/src/lib/str/ares_str.c index f6bfabf11f4467..0eda1ab9f15783 100644 --- a/deps/cares/src/lib/str/ares_str.c +++ b/deps/cares/src/lib/str/ares_str.c @@ -32,6 +32,23 @@ # include #endif +size_t ares_strnlen(const char *str, size_t maxlen) { + const char *p = NULL; + if (str == NULL) { + return 0; + } +#ifdef HAVE_STRNLEN + (void)p; + return strnlen(str, maxlen); +#else + if ((p = memchr(str, 0, maxlen)) == NULL) { + return maxlen; + } else { + return (size_t)(p - str); + } +#endif /* HAVE_STRNLEN */ +} + size_t ares_strlen(const char *str) { if (str == NULL) { diff --git a/deps/cares/src/tools/Makefile.in b/deps/cares/src/tools/Makefile.in index 9a96a74fa6957d..19e99a253378c7 100644 --- a/deps/cares/src/tools/Makefile.in +++ b/deps/cares/src/tools/Makefile.in @@ -91,7 +91,9 @@ host_triplet = @host@ noinst_PROGRAMS = $(am__EXEEXT_1) subdir = src/tools ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ +am__aclocal_m4_deps = $(top_srcdir)/m4/ares_check_user_namespace.m4 \ + $(top_srcdir)/m4/ares_check_uts_namespace.m4 \ + $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ $(top_srcdir)/m4/ax_ac_print_to_file.m4 \ $(top_srcdir)/m4/ax_add_am_macro_static.m4 \ $(top_srcdir)/m4/ax_am_macros_static.m4 \ @@ -101,8 +103,6 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_ac_append_to_file.m4 \ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_check_gnu_make.m4 \ $(top_srcdir)/m4/ax_check_link_flag.m4 \ - $(top_srcdir)/m4/ax_check_user_namespace.m4 \ - $(top_srcdir)/m4/ax_check_uts_namespace.m4 \ $(top_srcdir)/m4/ax_code_coverage.m4 \ $(top_srcdir)/m4/ax_compiler_vendor.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ diff --git a/deps/corepack/CHANGELOG.md b/deps/corepack/CHANGELOG.md index 7de934c0d2c0db..941d0b6b7e5e25 100644 --- a/deps/corepack/CHANGELOG.md +++ b/deps/corepack/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## [0.30.0](https://github.com/nodejs/corepack/compare/v0.29.4...v0.30.0) (2024-11-23) + + +### Features + +* update package manager versions ([#578](https://github.com/nodejs/corepack/issues/578)) ([a286c8f](https://github.com/nodejs/corepack/commit/a286c8f5537ea9ecf9b6ff53c7bc3e8da4e3c8bb)) + + +### Performance Improvements + +* prefer `module.enableCompileCache` over `v8-compile-cache` ([#574](https://github.com/nodejs/corepack/issues/574)) ([cba6905](https://github.com/nodejs/corepack/commit/cba690575bd606faeee54bd512ccb8797d49055f)) + ## [0.29.4](https://github.com/nodejs/corepack/compare/v0.29.3...v0.29.4) (2024-09-07) diff --git a/deps/corepack/dist/corepack.js b/deps/corepack/dist/corepack.js index b1b22662466f86..6179b11c083cb5 100755 --- a/deps/corepack/dist/corepack.js +++ b/deps/corepack/dist/corepack.js @@ -1,3 +1,4 @@ #!/usr/bin/env node process.env.COREPACK_ENABLE_DOWNLOAD_PROMPT??='0'; +require('module').enableCompileCache?.(); require('./lib/corepack.cjs').runMain(process.argv.slice(2)); \ No newline at end of file diff --git a/deps/corepack/dist/lib/corepack.cjs b/deps/corepack/dist/lib/corepack.cjs index 2978fc336232e0..e1919339dc38bd 100644 --- a/deps/corepack/dist/lib/corepack.cjs +++ b/deps/corepack/dist/lib/corepack.cjs @@ -21260,7 +21260,7 @@ function String2(descriptor, ...args) { } // package.json -var version = "0.29.4"; +var version = "0.30.0"; // sources/Engine.ts var import_fs9 = __toESM(require("fs")); @@ -21274,7 +21274,7 @@ var import_valid3 = __toESM(require_valid2()); var config_default = { definitions: { npm: { - default: "10.8.3+sha1.e6085b2864fcfd9b1aad7b602601b5a2fc116699", + default: "10.9.1+sha1.ab141c1229765c11c8c59060fc9cf450a2207bd6", fetchLatestFrom: { type: "npm", package: "npm" @@ -21311,7 +21311,7 @@ var config_default = { } }, pnpm: { - default: "9.9.0+sha1.3edbe440f4e570aa8f049adbd06b9483d55cc2d2", + default: "9.14.2+sha1.5202b50ab92394b3c922d2e293f196e2df6d441b", fetchLatestFrom: { type: "npm", package: "pnpm" @@ -21375,7 +21375,7 @@ var config_default = { package: "yarn" }, transparent: { - default: "4.4.1+sha224.fd21d9eb5fba020083811af1d4953acc21eeb9f6ff97efd1b3f9d4de", + default: "4.5.2+sha224.c2e2e9ed3cdadd6ec250589b3393f71ae56d5ec297af11cec1eba3b4", commands: [ [ "yarn", @@ -21965,8 +21965,11 @@ async function runVersion(locator, installSpec, binName, args) { } if (!binPath) throw new Error(`Assertion failed: Unable to locate path for bin '${binName}'`); - if (locator.name !== `npm` || (0, import_lt.default)(locator.reference, `9.7.0`)) - await Promise.resolve().then(() => __toESM(require_v8_compile_cache())); + if (!import_module.default.enableCompileCache) { + if (locator.name !== `npm` || (0, import_lt.default)(locator.reference, `9.7.0`)) { + await Promise.resolve().then(() => __toESM(require_v8_compile_cache())); + } + } process.env.COREPACK_ROOT = import_path7.default.dirname(require.resolve("corepack/package.json")); process.argv = [ process.execPath, @@ -21976,6 +21979,9 @@ async function runVersion(locator, installSpec, binName, args) { process.execArgv = []; process.mainModule = void 0; process.nextTick(import_module.default.runMain, binPath); + if (import_module.default.flushCompileCache) { + setImmediate(import_module.default.flushCompileCache); + } } function shouldSkipIntegrityCheck() { return process.env.COREPACK_INTEGRITY_KEYS === `` || process.env.COREPACK_INTEGRITY_KEYS === `0`; @@ -22553,7 +22559,7 @@ var EnableCommand = class extends Command { [`enable`] ]; static usage = Command.Usage({ - description: `Add the Corepack shims to the install directories`, + description: `Add the Corepack shims to the install directory`, details: ` When run, this command will check whether the shims for the specified package managers can be found with the correct values inside the install directory. If not, or if they don't exist, they will be created. diff --git a/deps/corepack/dist/npm.js b/deps/corepack/dist/npm.js index 7d10ba5bdf36b2..75f68b058f2dd6 100755 --- a/deps/corepack/dist/npm.js +++ b/deps/corepack/dist/npm.js @@ -1,3 +1,4 @@ #!/usr/bin/env node process.env.COREPACK_ENABLE_DOWNLOAD_PROMPT??='1' +require('module').enableCompileCache?.(); require('./lib/corepack.cjs').runMain(['npm', ...process.argv.slice(2)]); \ No newline at end of file diff --git a/deps/corepack/dist/npx.js b/deps/corepack/dist/npx.js index a8bd3e69014313..b1138bb48e1a82 100755 --- a/deps/corepack/dist/npx.js +++ b/deps/corepack/dist/npx.js @@ -1,3 +1,4 @@ #!/usr/bin/env node process.env.COREPACK_ENABLE_DOWNLOAD_PROMPT??='1' +require('module').enableCompileCache?.(); require('./lib/corepack.cjs').runMain(['npx', ...process.argv.slice(2)]); \ No newline at end of file diff --git a/deps/corepack/dist/pnpm.js b/deps/corepack/dist/pnpm.js index a0a87263435562..56ba509405033d 100755 --- a/deps/corepack/dist/pnpm.js +++ b/deps/corepack/dist/pnpm.js @@ -1,3 +1,4 @@ #!/usr/bin/env node process.env.COREPACK_ENABLE_DOWNLOAD_PROMPT??='1' +require('module').enableCompileCache?.(); require('./lib/corepack.cjs').runMain(['pnpm', ...process.argv.slice(2)]); \ No newline at end of file diff --git a/deps/corepack/dist/pnpx.js b/deps/corepack/dist/pnpx.js index 57ad4842631cd7..ee36be2e99c686 100755 --- a/deps/corepack/dist/pnpx.js +++ b/deps/corepack/dist/pnpx.js @@ -1,3 +1,4 @@ #!/usr/bin/env node process.env.COREPACK_ENABLE_DOWNLOAD_PROMPT??='1' +require('module').enableCompileCache?.(); require('./lib/corepack.cjs').runMain(['pnpx', ...process.argv.slice(2)]); \ No newline at end of file diff --git a/deps/corepack/dist/yarn.js b/deps/corepack/dist/yarn.js index eaed8596eabaa3..ce628c82b6a782 100755 --- a/deps/corepack/dist/yarn.js +++ b/deps/corepack/dist/yarn.js @@ -1,3 +1,4 @@ #!/usr/bin/env node process.env.COREPACK_ENABLE_DOWNLOAD_PROMPT??='1' +require('module').enableCompileCache?.(); require('./lib/corepack.cjs').runMain(['yarn', ...process.argv.slice(2)]); \ No newline at end of file diff --git a/deps/corepack/dist/yarnpkg.js b/deps/corepack/dist/yarnpkg.js index aada6032fa67ff..9541ed726aaa3b 100755 --- a/deps/corepack/dist/yarnpkg.js +++ b/deps/corepack/dist/yarnpkg.js @@ -1,3 +1,4 @@ #!/usr/bin/env node process.env.COREPACK_ENABLE_DOWNLOAD_PROMPT??='1' +require('module').enableCompileCache?.(); require('./lib/corepack.cjs').runMain(['yarnpkg', ...process.argv.slice(2)]); \ No newline at end of file diff --git a/deps/corepack/package.json b/deps/corepack/package.json index 571c359407e07a..c9c6662e99e6c9 100644 --- a/deps/corepack/package.json +++ b/deps/corepack/package.json @@ -1,6 +1,6 @@ { "name": "corepack", - "version": "0.29.4", + "version": "0.30.0", "homepage": "https://github.com/nodejs/corepack#readme", "bugs": { "url": "https://github.com/nodejs/corepack/issues" diff --git a/deps/googletest/include/gtest/gtest-matchers.h b/deps/googletest/include/gtest/gtest-matchers.h index eae210e99ddae4..78160f0e418da6 100644 --- a/deps/googletest/include/gtest/gtest-matchers.h +++ b/deps/googletest/include/gtest/gtest-matchers.h @@ -67,10 +67,10 @@ namespace testing { // To implement a matcher Foo for type T, define: // 1. a class FooMatcherMatcher that implements the matcher interface: // using is_gtest_matcher = void; -// bool MatchAndExplain(const T&, std::ostream*); +// bool MatchAndExplain(const T&, std::ostream*) const; // (MatchResultListener* can also be used instead of std::ostream*) -// void DescribeTo(std::ostream*); -// void DescribeNegationTo(std::ostream*); +// void DescribeTo(std::ostream*) const; +// void DescribeNegationTo(std::ostream*) const; // // 2. a factory function that creates a Matcher object from a // FooMatcherMatcher. diff --git a/deps/googletest/include/gtest/gtest-printers.h b/deps/googletest/include/gtest/gtest-printers.h index b2822bcde23cc7..198a7693493a33 100644 --- a/deps/googletest/include/gtest/gtest-printers.h +++ b/deps/googletest/include/gtest/gtest-printers.h @@ -126,6 +126,10 @@ #include // NOLINT #endif // GTEST_INTERNAL_HAS_STD_SPAN +#if GTEST_INTERNAL_HAS_COMPARE_LIB +#include // NOLINT +#endif // GTEST_INTERNAL_HAS_COMPARE_LIB + namespace testing { // Definitions in the internal* namespaces are subject to change without notice. @@ -782,6 +786,41 @@ void PrintTo(const std::shared_ptr& ptr, std::ostream* os) { (PrintSmartPointer)(ptr, os, 0); } +#if GTEST_INTERNAL_HAS_COMPARE_LIB +template +void PrintOrderingHelper(T ordering, std::ostream* os) { + if (ordering == T::less) { + *os << "(less)"; + } else if (ordering == T::greater) { + *os << "(greater)"; + } else if (ordering == T::equivalent) { + *os << "(equivalent)"; + } else { + *os << "(unknown ordering)"; + } +} + +inline void PrintTo(std::strong_ordering ordering, std::ostream* os) { + if (ordering == std::strong_ordering::equal) { + *os << "(equal)"; + } else { + PrintOrderingHelper(ordering, os); + } +} + +inline void PrintTo(std::partial_ordering ordering, std::ostream* os) { + if (ordering == std::partial_ordering::unordered) { + *os << "(unordered)"; + } else { + PrintOrderingHelper(ordering, os); + } +} + +inline void PrintTo(std::weak_ordering ordering, std::ostream* os) { + PrintOrderingHelper(ordering, os); +} +#endif + // Helper function for printing a tuple. T must be instantiated with // a tuple type. template diff --git a/deps/googletest/include/gtest/internal/gtest-port.h b/deps/googletest/include/gtest/internal/gtest-port.h index 8d27c2c4f72f94..ca18513e77f7a0 100644 --- a/deps/googletest/include/gtest/internal/gtest-port.h +++ b/deps/googletest/include/gtest/internal/gtest-port.h @@ -2533,4 +2533,12 @@ using Variant = ::std::variant; #define GTEST_INTERNAL_NEED_REDUNDANT_CONSTEXPR_DECL 1 #endif +#if (defined(__cpp_lib_three_way_comparison) || \ + (GTEST_INTERNAL_HAS_INCLUDE() && \ + GTEST_INTERNAL_CPLUSPLUS_LANG >= 201907L)) +#define GTEST_INTERNAL_HAS_COMPARE_LIB 1 +#else +#define GTEST_INTERNAL_HAS_COMPARE_LIB 0 +#endif + #endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ diff --git a/deps/googletest/src/gtest.cc b/deps/googletest/src/gtest.cc index c08ab4197c5500..3c1cac6ebe69fd 100644 --- a/deps/googletest/src/gtest.cc +++ b/deps/googletest/src/gtest.cc @@ -3989,6 +3989,12 @@ class XmlUnitTestResultPrinter : public EmptyTestEventListener { static void OutputXmlTestSuiteForTestResult(::std::ostream* stream, const TestResult& result); + // Streams a test case XML stanza containing the given test result. + // + // Requires: result.Failed() + static void OutputXmlTestCaseForTestResult(::std::ostream* stream, + const TestResult& result); + // Streams an XML representation of a TestResult object. static void OutputXmlTestResult(::std::ostream* stream, const TestResult& result); @@ -4236,6 +4242,15 @@ void XmlUnitTestResultPrinter::OutputXmlTestSuiteForTestResult( FormatEpochTimeInMillisAsIso8601(result.start_timestamp())); *stream << ">"; + OutputXmlTestCaseForTestResult(stream, result); + + // Complete the test suite. + *stream << " \n"; +} + +// Streams a test case XML stanza containing the given test result. +void XmlUnitTestResultPrinter::OutputXmlTestCaseForTestResult( + ::std::ostream* stream, const TestResult& result) { // Output the boilerplate for a minimal test case with a single test. *stream << " \n"; } // Prints an XML representation of a TestInfo object. @@ -4379,6 +4391,10 @@ void XmlUnitTestResultPrinter::PrintXmlTestSuite(std::ostream* stream, if (test_suite.GetTestInfo(i)->is_reportable()) OutputXmlTestInfo(stream, test_suite.name(), *test_suite.GetTestInfo(i)); } + if (test_suite.ad_hoc_test_result().Failed()) { + OutputXmlTestCaseForTestResult(stream, test_suite.ad_hoc_test_result()); + } + *stream << " \n"; } @@ -4518,6 +4534,12 @@ class JsonUnitTestResultPrinter : public EmptyTestEventListener { static void OutputJsonTestSuiteForTestResult(::std::ostream* stream, const TestResult& result); + // Streams a test case JSON stanza containing the given test result. + // + // Requires: result.Failed() + static void OutputJsonTestCaseForTestResult(::std::ostream* stream, + const TestResult& result); + // Streams a JSON representation of a TestResult object. static void OutputJsonTestResult(::std::ostream* stream, const TestResult& result); @@ -4688,6 +4710,15 @@ void JsonUnitTestResultPrinter::OutputJsonTestSuiteForTestResult( } *stream << Indent(6) << "\"testsuite\": [\n"; + OutputJsonTestCaseForTestResult(stream, result); + + // Finish the test suite. + *stream << "\n" << Indent(6) << "]\n" << Indent(4) << "}"; +} + +// Streams a test case JSON stanza containing the given test result. +void JsonUnitTestResultPrinter::OutputJsonTestCaseForTestResult( + ::std::ostream* stream, const TestResult& result) { // Output the boilerplate for a new test case. *stream << Indent(8) << "{\n"; OutputJsonKey(stream, "testcase", "name", "", Indent(10)); @@ -4704,9 +4735,6 @@ void JsonUnitTestResultPrinter::OutputJsonTestSuiteForTestResult( // Output the actual test result. OutputJsonTestResult(stream, result); - - // Finish the test suite. - *stream << "\n" << Indent(6) << "]\n" << Indent(4) << "}"; } // Prints a JSON representation of a TestInfo object. @@ -4851,6 +4879,16 @@ void JsonUnitTestResultPrinter::PrintJsonTestSuite( OutputJsonTestInfo(stream, test_suite.name(), *test_suite.GetTestInfo(i)); } } + + // If there was a failure in the test suite setup or teardown include that in + // the output. + if (test_suite.ad_hoc_test_result().Failed()) { + if (comma) { + *stream << ",\n"; + } + OutputJsonTestCaseForTestResult(stream, test_suite.ad_hoc_test_result()); + } + *stream << "\n" << kIndent << "]\n" << Indent(4) << "}"; } diff --git a/deps/ncrypto/unofficial.gni b/deps/ncrypto/unofficial.gni index ea024af73e215b..7cb27d22b9b8e0 100644 --- a/deps/ncrypto/unofficial.gni +++ b/deps/ncrypto/unofficial.gni @@ -27,6 +27,6 @@ template("ncrypto_gn_build") { forward_variables_from(invoker, "*") public_configs = [ ":ncrypto_config" ] sources = gypi_values.ncrypto_sources - deps = [ "../openssl" ] + deps = [ "$node_openssl_path" ] } } diff --git a/deps/ngtcp2/nghttp3/lib/includes/nghttp3/nghttp3.h b/deps/ngtcp2/nghttp3/lib/includes/nghttp3/nghttp3.h index 77eb1fbf263815..6cf947487bf899 100644 --- a/deps/ngtcp2/nghttp3/lib/includes/nghttp3/nghttp3.h +++ b/deps/ngtcp2/nghttp3/lib/includes/nghttp3/nghttp3.h @@ -31,11 +31,11 @@ libcurl) */ #if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) # define WIN32 -#endif +#endif /* (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) */ #ifdef __cplusplus extern "C" { -#endif +#endif /* defined(__cplusplus) */ #include #if defined(_MSC_VER) && (_MSC_VER < 1800) @@ -43,9 +43,9 @@ extern "C" { compliant. See compiler macros and version number in https://sourceforge.net/p/predef/wiki/Compilers/ */ # include -#else /* !defined(_MSC_VER) || (_MSC_VER >= 1800) */ +#else /* !(defined(_MSC_VER) && (_MSC_VER < 1800)) */ # include -#endif /* !defined(_MSC_VER) || (_MSC_VER >= 1800) */ +#endif /* !(defined(_MSC_VER) && (_MSC_VER < 1800)) */ #include #include #include @@ -57,22 +57,22 @@ extern "C" { #elif defined(WIN32) # ifdef BUILDING_NGHTTP3 # define NGHTTP3_EXTERN __declspec(dllexport) -# else /* !BUILDING_NGHTTP3 */ +# else /* !defined(BUILDING_NGHTTP3) */ # define NGHTTP3_EXTERN __declspec(dllimport) -# endif /* !BUILDING_NGHTTP3 */ -#else /* !defined(WIN32) */ +# endif /* !defined(BUILDING_NGHTTP3) */ +#else /* !(defined(NGHTTP3_STATICLIB) || defined(WIN32)) */ # ifdef BUILDING_NGHTTP3 # define NGHTTP3_EXTERN __attribute__((visibility("default"))) -# else /* !BUILDING_NGHTTP3 */ +# else /* !defined(BUILDING_NGHTTP3) */ # define NGHTTP3_EXTERN -# endif /* !BUILDING_NGHTTP3 */ -#endif /* !defined(WIN32) */ +# endif /* !defined(BUILDING_NGHTTP3) */ +#endif /* !(defined(NGHTTP3_STATICLIB) || defined(WIN32)) */ #ifdef _MSC_VER # define NGHTTP3_ALIGN(N) __declspec(align(N)) -#else /* !_MSC_VER */ +#else /* !defined(_MSC_VER) */ # define NGHTTP3_ALIGN(N) __attribute__((aligned(N))) -#endif /* !_MSC_VER */ +#endif /* !defined(_MSC_VER) */ /** * @typedef @@ -624,7 +624,7 @@ typedef struct nghttp3_buf { */ uint8_t *end; /** - * :member:`pos` pointers to the start of data. Typically, this + * :member:`pos` points to the start of data. Typically, this * points to the address that next data should be read. Initially, * it points to :member:`begin`. */ @@ -1161,8 +1161,8 @@ NGHTTP3_EXTERN void nghttp3_qpack_encoder_del(nghttp3_qpack_encoder *encoder); * anymore. */ NGHTTP3_EXTERN int nghttp3_qpack_encoder_encode( - nghttp3_qpack_encoder *encoder, nghttp3_buf *pbuf, nghttp3_buf *rbuf, - nghttp3_buf *ebuf, int64_t stream_id, const nghttp3_nv *nva, size_t nvlen); + nghttp3_qpack_encoder *encoder, nghttp3_buf *pbuf, nghttp3_buf *rbuf, + nghttp3_buf *ebuf, int64_t stream_id, const nghttp3_nv *nva, size_t nvlen); /** * @function @@ -1182,7 +1182,7 @@ NGHTTP3_EXTERN int nghttp3_qpack_encoder_encode( * |encoder| is unable to process input because it is malformed. */ NGHTTP3_EXTERN nghttp3_ssize nghttp3_qpack_encoder_read_decoder( - nghttp3_qpack_encoder *encoder, const uint8_t *src, size_t srclen); + nghttp3_qpack_encoder *encoder, const uint8_t *src, size_t srclen); /** * @function @@ -1343,7 +1343,7 @@ NGHTTP3_EXTERN void nghttp3_qpack_decoder_del(nghttp3_qpack_decoder *decoder); * Could not interpret encoder stream instruction. */ NGHTTP3_EXTERN nghttp3_ssize nghttp3_qpack_decoder_read_encoder( - nghttp3_qpack_decoder *decoder, const uint8_t *src, size_t srclen); + nghttp3_qpack_decoder *decoder, const uint8_t *src, size_t srclen); /** * @function @@ -1436,9 +1436,9 @@ nghttp3_qpack_decoder_get_icnt(const nghttp3_qpack_decoder *decoder); * HTTP field is too large. */ NGHTTP3_EXTERN nghttp3_ssize nghttp3_qpack_decoder_read_request( - nghttp3_qpack_decoder *decoder, nghttp3_qpack_stream_context *sctx, - nghttp3_qpack_nv *nv, uint8_t *pflags, const uint8_t *src, size_t srclen, - int fin); + nghttp3_qpack_decoder *decoder, nghttp3_qpack_stream_context *sctx, + nghttp3_qpack_nv *nv, uint8_t *pflags, const uint8_t *src, size_t srclen, + int fin); /** * @function @@ -1568,7 +1568,7 @@ typedef void (*nghttp3_debug_vprintf_callback)(const char *format, * times because this is important. */ NGHTTP3_EXTERN void nghttp3_set_debug_vprintf_callback( - nghttp3_debug_vprintf_callback debug_vprintf_callback); + nghttp3_debug_vprintf_callback debug_vprintf_callback); /** * @macrosection @@ -2118,9 +2118,10 @@ NGHTTP3_EXTERN int nghttp3_conn_bind_qpack_streams(nghttp3_conn *conn, * :macro:`NGHTTP3_ERR_CALLBACK_FAILURE` * User callback failed. * - * It may return the other error codes. In general, the negative - * error code means that |conn| encountered a connection error, and - * the connection should be closed. + * It may return the other error codes. The negative error code means + * that |conn| encountered a connection error, and the connection must + * be closed. Calling nghttp3 API other than `nghttp3_conn_del` + * causes undefined behavior. */ NGHTTP3_EXTERN nghttp3_ssize nghttp3_conn_read_stream(nghttp3_conn *conn, int64_t stream_id, @@ -2152,9 +2153,10 @@ NGHTTP3_EXTERN nghttp3_ssize nghttp3_conn_read_stream(nghttp3_conn *conn, * :macro:`NGHTTP3_ERR_CALLBACK_FAILURE` * User callback failed. * - * It may return the other error codes. In general, the negative - * error code means that |conn| encountered a connection error, and - * the connection should be closed. + * It may return the other error codes. The negative error code means + * that |conn| encountered a connection error, and the connection must + * be closed. Calling nghttp3 API other than `nghttp3_conn_del` + * causes undefined behavior. */ NGHTTP3_EXTERN nghttp3_ssize nghttp3_conn_writev_stream(nghttp3_conn *conn, int64_t *pstream_id, @@ -2198,6 +2200,9 @@ NGHTTP3_EXTERN int nghttp3_conn_add_write_offset(nghttp3_conn *conn, * If a stream denoted by |stream_id| is not found, this function * returns 0. * + * Alternatively, `nghttp3_conn_update_ack_offset` can be used to + * accomplish the same thing. + * * This function returns 0 if it succeeds, or one of the following * negative error codes: * @@ -2207,6 +2212,31 @@ NGHTTP3_EXTERN int nghttp3_conn_add_write_offset(nghttp3_conn *conn, NGHTTP3_EXTERN int nghttp3_conn_add_ack_offset(nghttp3_conn *conn, int64_t stream_id, uint64_t n); +/** + * @function + * + * `nghttp3_conn_update_ack_offset` tells |conn| that QUIC stack has + * acknowledged the stream data up to |offset| for a stream denoted by + * |stream_id|. + * + * If a stream denoted by |stream_id| is not found, this function + * returns 0. + * + * Alternatively, `nghttp3_conn_add_ack_offset` can be used to + * accomplish the same thing. + * + * This function returns 0 if it succeeds, or one of the following + * negative error codes: + * + * :macro:`NGHTTP3_ERR_INVALID_ARGUMENT` + * |offset| is less than the number of bytes acknowledged so far. + * :macro:`NGHTTP3_ERR_CALLBACK_FAILURE` + * User callback failed. + */ +NGHTTP3_EXTERN int nghttp3_conn_update_ack_offset(nghttp3_conn *conn, + int64_t stream_id, + uint64_t offset); + /** * @function * @@ -2314,9 +2344,9 @@ NGHTTP3_EXTERN int nghttp3_conn_resume_stream(nghttp3_conn *conn, /** * @function * - * `nghttp3_conn_close_stream` closes stream identified by - * |stream_id|. QUIC application error code |app_error_code| is the - * reason of the closure. + * `nghttp3_conn_close_stream` tells the library that a stream + * identified by |stream_id| has been closed. QUIC application error + * code |app_error_code| is the reason of the closure. * * This function returns 0 if it succeeds, or one of the following * negative error codes: @@ -2419,8 +2449,8 @@ nghttp3_conn_set_max_concurrent_streams(nghttp3_conn *conn, * stream. */ typedef nghttp3_ssize (*nghttp3_read_data_callback)( - nghttp3_conn *conn, int64_t stream_id, nghttp3_vec *vec, size_t veccnt, - uint32_t *pflags, void *conn_user_data, void *stream_user_data); + nghttp3_conn *conn, int64_t stream_id, nghttp3_vec *vec, size_t veccnt, + uint32_t *pflags, void *conn_user_data, void *stream_user_data); /** * @struct @@ -2460,8 +2490,8 @@ typedef struct nghttp3_data_reader { * Out of memory. */ NGHTTP3_EXTERN int nghttp3_conn_submit_request( - nghttp3_conn *conn, int64_t stream_id, const nghttp3_nv *nva, size_t nvlen, - const nghttp3_data_reader *dr, void *stream_user_data); + nghttp3_conn *conn, int64_t stream_id, const nghttp3_nv *nva, size_t nvlen, + const nghttp3_data_reader *dr, void *stream_user_data); /** * @function @@ -2667,7 +2697,7 @@ typedef struct NGHTTP3_ALIGN(8) nghttp3_pri { * Stream not found. */ NGHTTP3_EXTERN int nghttp3_conn_get_stream_priority_versioned( - nghttp3_conn *conn, int pri_version, nghttp3_pri *dest, int64_t stream_id); + nghttp3_conn *conn, int pri_version, nghttp3_pri *dest, int64_t stream_id); /** * @function @@ -2720,8 +2750,8 @@ NGHTTP3_EXTERN int nghttp3_conn_set_client_stream_priority(nghttp3_conn *conn, * Out of memory. */ NGHTTP3_EXTERN int nghttp3_conn_set_server_stream_priority_versioned( - nghttp3_conn *conn, int64_t stream_id, int pri_version, - const nghttp3_pri *pri); + nghttp3_conn *conn, int64_t stream_id, int pri_version, + const nghttp3_pri *pri); /** * @function @@ -2884,7 +2914,7 @@ NGHTTP3_EXTERN int nghttp3_err_is_fatal(int liberr); */ #define nghttp3_conn_set_server_stream_priority(CONN, STREAM_ID, PRI) \ nghttp3_conn_set_server_stream_priority_versioned( \ - (CONN), (STREAM_ID), NGHTTP3_PRI_VERSION, (PRI)) + (CONN), (STREAM_ID), NGHTTP3_PRI_VERSION, (PRI)) /* * `nghttp3_conn_get_stream_priority` is a wrapper around @@ -2906,6 +2936,6 @@ NGHTTP3_EXTERN int nghttp3_err_is_fatal(int liberr); #ifdef __cplusplus } -#endif +#endif /* defined(__cplusplus) */ -#endif /* NGHTTP3_H */ +#endif /* !defined(NGHTTP3_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/includes/nghttp3/version.h b/deps/ngtcp2/nghttp3/lib/includes/nghttp3/version.h index bc57eb2cfcf2d6..7f6cb8acffe672 100644 --- a/deps/ngtcp2/nghttp3/lib/includes/nghttp3/version.h +++ b/deps/ngtcp2/nghttp3/lib/includes/nghttp3/version.h @@ -31,7 +31,7 @@ * * Version number of the nghttp3 library release. */ -#define NGHTTP3_VERSION "0.7.0" +#define NGHTTP3_VERSION "1.6.0" /** * @macro @@ -41,6 +41,6 @@ * number, 8 bits for minor and 8 bits for patch. Version 1.2.3 * becomes 0x010203. */ -#define NGHTTP3_VERSION_NUM 0x000700 +#define NGHTTP3_VERSION_NUM 0x010600 -#endif /* NGHTTP3_VERSION_H */ +#endif /* !defined(NGHTTP3_VERSION_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_balloc.c b/deps/ngtcp2/nghttp3/lib/nghttp3_balloc.c index e134d0f4dceb75..544e4fb1306a5f 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_balloc.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_balloc.c @@ -66,8 +66,8 @@ int nghttp3_balloc_get(nghttp3_balloc *balloc, void **pbuf, size_t n) { assert(n <= balloc->blklen); if (nghttp3_buf_left(&balloc->buf) < n) { - p = nghttp3_mem_malloc(balloc->mem, sizeof(nghttp3_memblock_hd) + 0x10u + - balloc->blklen); + p = nghttp3_mem_malloc(balloc->mem, + sizeof(nghttp3_memblock_hd) + 0x8u + balloc->blklen); if (p == NULL) { return NGHTTP3_ERR_NOMEM; } @@ -76,10 +76,10 @@ int nghttp3_balloc_get(nghttp3_balloc *balloc, void **pbuf, size_t n) { hd->next = balloc->head; balloc->head = hd; nghttp3_buf_wrap_init( - &balloc->buf, - (uint8_t *)(((uintptr_t)p + sizeof(nghttp3_memblock_hd) + 0xfu) & - ~(uintptr_t)0xfu), - balloc->blklen); + &balloc->buf, + (uint8_t *)(((uintptr_t)p + sizeof(nghttp3_memblock_hd) + 0xfu) & + ~(uintptr_t)0xfu), + balloc->blklen); } assert(((uintptr_t)balloc->buf.last & 0xfu) == 0); diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_balloc.h b/deps/ngtcp2/nghttp3/lib/nghttp3_balloc.h index e02f61d16b5763..c95f0426a924bf 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_balloc.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_balloc.h @@ -28,7 +28,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -40,7 +40,10 @@ typedef struct nghttp3_memblock_hd nghttp3_memblock_hd; * nghttp3_memblock_hd is the header of memory block. */ struct nghttp3_memblock_hd { - nghttp3_memblock_hd *next; + union { + nghttp3_memblock_hd *next; + uint64_t pad; + }; }; /* @@ -89,4 +92,4 @@ int nghttp3_balloc_get(nghttp3_balloc *balloc, void **pbuf, size_t n); */ void nghttp3_balloc_clear(nghttp3_balloc *balloc); -#endif /* NGHTTP3_BALLOC_H */ +#endif /* !defined(NGHTTP3_BALLOC_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_buf.h b/deps/ngtcp2/nghttp3/lib/nghttp3_buf.h index 472a4b7b14a80e..9fa067de91b949 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_buf.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_buf.h @@ -28,7 +28,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -71,4 +71,4 @@ void nghttp3_typed_buf_init(nghttp3_typed_buf *tbuf, const nghttp3_buf *buf, void nghttp3_typed_buf_free(nghttp3_typed_buf *tbuf); -#endif /* NGHTTP3_BUF_H */ +#endif /* !defined(NGHTTP3_BUF_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_conn.c b/deps/ngtcp2/nghttp3/lib/nghttp3_conn.c index 25aaf685734cb1..f70b4f5472de64 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_conn.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_conn.c @@ -210,9 +210,9 @@ static int conn_call_recv_settings(nghttp3_conn *conn) { static int ricnt_less(const nghttp3_pq_entry *lhsx, const nghttp3_pq_entry *rhsx) { nghttp3_stream *lhs = - nghttp3_struct_of(lhsx, nghttp3_stream, qpack_blocked_pe); + nghttp3_struct_of(lhsx, nghttp3_stream, qpack_blocked_pe); nghttp3_stream *rhs = - nghttp3_struct_of(rhsx, nghttp3_stream, qpack_blocked_pe); + nghttp3_struct_of(rhsx, nghttp3_stream, qpack_blocked_pe); return lhs->qpack_sctx.ricnt < rhs->qpack_sctx.ricnt; } @@ -250,19 +250,19 @@ static int conn_new(nghttp3_conn **pconn, int server, int callbacks_version, nghttp3_objalloc_init(&conn->out_chunk_objalloc, NGHTTP3_STREAM_MIN_CHUNK_SIZE * 16, mem); - nghttp3_objalloc_stream_init(&conn->stream_objalloc, 64, mem); + nghttp3_objalloc_stream_init(&conn->stream_objalloc, 8, mem); nghttp3_map_init(&conn->streams, mem); - rv = nghttp3_qpack_decoder_init(&conn->qdec, - settings->qpack_max_dtable_capacity, - settings->qpack_blocked_streams, mem); + rv = + nghttp3_qpack_decoder_init(&conn->qdec, settings->qpack_max_dtable_capacity, + settings->qpack_blocked_streams, mem); if (rv != 0) { goto qdec_init_fail; } rv = nghttp3_qpack_encoder_init( - &conn->qenc, settings->qpack_encoder_max_dtable_capacity, mem); + &conn->qenc, settings->qpack_encoder_max_dtable_capacity, mem); if (rv != 0) { goto qenc_init_fail; } @@ -273,7 +273,7 @@ static int conn_new(nghttp3_conn **pconn, int server, int callbacks_version, nghttp3_pq_init(&conn->sched[i].spq, cycle_less, mem); } - nghttp3_idtr_init(&conn->remote.bidi.idtr, server, mem); + nghttp3_idtr_init(&conn->remote.bidi.idtr, mem); conn->callbacks = *callbacks; conn->local.settings = *settings; @@ -368,7 +368,7 @@ void nghttp3_conn_del(nghttp3_conn *conn) { nghttp3_qpack_encoder_free(&conn->qenc); nghttp3_qpack_decoder_free(&conn->qdec); - nghttp3_map_each_free(&conn->streams, free_stream, NULL); + nghttp3_map_each(&conn->streams, free_stream, NULL); nghttp3_map_free(&conn->streams); nghttp3_objalloc_free(&conn->stream_objalloc); @@ -419,7 +419,7 @@ nghttp3_ssize nghttp3_conn_read_stream(nghttp3_conn *conn, int64_t stream_id, } conn->rx.max_stream_id_bidi = - nghttp3_max(conn->rx.max_stream_id_bidi, stream_id); + nghttp3_max_int64(conn->rx.max_stream_id_bidi, stream_id); rv = nghttp3_conn_create_stream(conn, &stream, stream_id); if (rv != 0) { return rv; @@ -498,7 +498,7 @@ static nghttp3_ssize conn_read_type(nghttp3_conn *conn, nghttp3_stream *stream, assert(srclen); - nread = nghttp3_read_varint(rvint, src, srclen, fin); + nread = nghttp3_read_varint(rvint, src, src + srclen, fin); if (nread < 0) { return NGHTTP3_ERR_H3_GENERAL_PROTOCOL_ERROR; } @@ -650,7 +650,7 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, switch (rstate->state) { case NGHTTP3_CTRL_STREAM_STATE_FRAME_TYPE: assert(end - p > 0); - nread = nghttp3_read_varint(rvint, p, (size_t)(end - p), /* fin = */ 0); + nread = nghttp3_read_varint(rvint, p, end, /* fin = */ 0); if (nread < 0) { return NGHTTP3_ERR_H3_GENERAL_PROTOCOL_ERROR; } @@ -670,7 +670,7 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, /* Fall through */ case NGHTTP3_CTRL_STREAM_STATE_FRAME_LENGTH: assert(end - p > 0); - nread = nghttp3_read_varint(rvint, p, (size_t)(end - p), /* fin = */ 0); + nread = nghttp3_read_varint(rvint, p, end, /* fin = */ 0); if (nread < 0) { return NGHTTP3_ERR_H3_FRAME_ERROR; } @@ -767,9 +767,9 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, } /* Read Identifier */ - len = (size_t)nghttp3_min(rstate->left, (int64_t)(end - p)); + len = (size_t)nghttp3_min_int64(rstate->left, (int64_t)(end - p)); assert(len > 0); - nread = nghttp3_read_varint(rvint, p, len, frame_fin(rstate, len)); + nread = nghttp3_read_varint(rvint, p, p + len, frame_fin(rstate, len)); if (nread < 0) { return NGHTTP3_ERR_H3_FRAME_ERROR; } @@ -795,7 +795,7 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, break; } - nread = nghttp3_read_varint(rvint, p, len, frame_fin(rstate, len)); + nread = nghttp3_read_varint(rvint, p, p + len, frame_fin(rstate, len)); if (nread < 0) { return NGHTTP3_ERR_H3_FRAME_ERROR; } @@ -811,16 +811,16 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, nghttp3_varint_read_state_reset(rvint); rv = - nghttp3_conn_on_settings_entry_received(conn, &rstate->fr.settings); + nghttp3_conn_on_settings_entry_received(conn, &rstate->fr.settings); if (rv != 0) { return rv; } } break; case NGHTTP3_CTRL_STREAM_STATE_SETTINGS_ID: - len = (size_t)nghttp3_min(rstate->left, (int64_t)(end - p)); + len = (size_t)nghttp3_min_int64(rstate->left, (int64_t)(end - p)); assert(len > 0); - nread = nghttp3_read_varint(rvint, p, len, frame_fin(rstate, len)); + nread = nghttp3_read_varint(rvint, p, p + len, frame_fin(rstate, len)); if (nread < 0) { return NGHTTP3_ERR_H3_FRAME_ERROR; } @@ -845,9 +845,9 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, } /* Fall through */ case NGHTTP3_CTRL_STREAM_STATE_SETTINGS_VALUE: - len = (size_t)nghttp3_min(rstate->left, (int64_t)(end - p)); + len = (size_t)nghttp3_min_int64(rstate->left, (int64_t)(end - p)); assert(len > 0); - nread = nghttp3_read_varint(rvint, p, len, frame_fin(rstate, len)); + nread = nghttp3_read_varint(rvint, p, p + len, frame_fin(rstate, len)); if (nread < 0) { return NGHTTP3_ERR_H3_FRAME_ERROR; } @@ -879,9 +879,9 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, nghttp3_stream_read_state_reset(rstate); break; case NGHTTP3_CTRL_STREAM_STATE_GOAWAY: - len = (size_t)nghttp3_min(rstate->left, (int64_t)(end - p)); + len = (size_t)nghttp3_min_int64(rstate->left, (int64_t)(end - p)); assert(len > 0); - nread = nghttp3_read_varint(rvint, p, len, frame_fin(rstate, len)); + nread = nghttp3_read_varint(rvint, p, p + len, frame_fin(rstate, len)); if (nread < 0) { return NGHTTP3_ERR_H3_FRAME_ERROR; } @@ -906,7 +906,7 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, if (conn->callbacks.shutdown) { rv = - conn->callbacks.shutdown(conn, conn->rx.goaway_id, conn->user_data); + conn->callbacks.shutdown(conn, conn->rx.goaway_id, conn->user_data); if (rv != 0) { return NGHTTP3_ERR_CALLBACK_FAILURE; } @@ -916,9 +916,9 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, break; case NGHTTP3_CTRL_STREAM_STATE_MAX_PUSH_ID: /* server side only */ - len = (size_t)nghttp3_min(rstate->left, (int64_t)(end - p)); + len = (size_t)nghttp3_min_int64(rstate->left, (int64_t)(end - p)); assert(len > 0); - nread = nghttp3_read_varint(rvint, p, len, frame_fin(rstate, len)); + nread = nghttp3_read_varint(rvint, p, p + len, frame_fin(rstate, len)); if (nread < 0) { return NGHTTP3_ERR_H3_FRAME_ERROR; } @@ -941,9 +941,9 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, break; case NGHTTP3_CTRL_STREAM_STATE_PRIORITY_UPDATE_PRI_ELEM_ID: /* server side only */ - len = (size_t)nghttp3_min(rstate->left, (int64_t)(end - p)); + len = (size_t)nghttp3_min_int64(rstate->left, (int64_t)(end - p)); assert(len > 0); - nread = nghttp3_read_varint(rvint, p, len, frame_fin(rstate, len)); + nread = nghttp3_read_varint(rvint, p, p + len, frame_fin(rstate, len)); if (nread < 0) { return NGHTTP3_ERR_H3_FRAME_ERROR; } @@ -977,7 +977,7 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, case NGHTTP3_CTRL_STREAM_STATE_PRIORITY_UPDATE: /* We need to buffer Priority Field Value because it might be fragmented. */ - len = (size_t)nghttp3_min(rstate->left, (int64_t)(end - p)); + len = (size_t)nghttp3_min_int64(rstate->left, (int64_t)(end - p)); assert(len > 0); if (conn->rx.pri_fieldbuflen == 0 && rstate->left == (int64_t)len) { /* Everything is in the input buffer. Apply same length @@ -1032,7 +1032,7 @@ nghttp3_ssize nghttp3_conn_read_control(nghttp3_conn *conn, nghttp3_stream_read_state_reset(rstate); break; case NGHTTP3_CTRL_STREAM_STATE_IGN_FRAME: - len = (size_t)nghttp3_min(rstate->left, (int64_t)(end - p)); + len = (size_t)nghttp3_min_int64(rstate->left, (int64_t)(end - p)); p += len; nconsumed += len; rstate->left -= (int64_t)len; @@ -1076,7 +1076,7 @@ static int conn_delete_stream(nghttp3_conn *conn, nghttp3_stream *stream) { } rv = - nghttp3_map_remove(&conn->streams, (nghttp3_map_key_type)stream->node.id); + nghttp3_map_remove(&conn->streams, (nghttp3_map_key_type)stream->node.id); assert(0 == rv); @@ -1104,8 +1104,8 @@ static int conn_process_blocked_stream_data(nghttp3_conn *conn, buf = nghttp3_ringbuf_get(&stream->inq, 0); nconsumed = nghttp3_conn_read_bidi( - conn, &nproc, stream, buf->pos, nghttp3_buf_len(buf), - len == 1 && (stream->flags & NGHTTP3_STREAM_FLAG_READ_EOF)); + conn, &nproc, stream, buf->pos, nghttp3_buf_len(buf), + len == 1 && (stream->flags & NGHTTP3_STREAM_FLAG_READ_EOF)); if (nconsumed < 0) { return (int)nconsumed; } @@ -1144,7 +1144,7 @@ nghttp3_ssize nghttp3_conn_read_qpack_encoder(nghttp3_conn *conn, const uint8_t *src, size_t srclen) { nghttp3_ssize nconsumed = - nghttp3_qpack_decoder_read_encoder(&conn->qdec, src, srclen); + nghttp3_qpack_decoder_read_encoder(&conn->qdec, src, srclen); nghttp3_stream *stream; int rv; @@ -1240,7 +1240,7 @@ nghttp3_ssize nghttp3_conn_read_bidi(nghttp3_conn *conn, size_t *pnproc, switch (rstate->state) { case NGHTTP3_REQ_STREAM_STATE_FRAME_TYPE: assert(end - p > 0); - nread = nghttp3_read_varint(rvint, p, (size_t)(end - p), fin); + nread = nghttp3_read_varint(rvint, p, end, fin); if (nread < 0) { return NGHTTP3_ERR_H3_GENERAL_PROTOCOL_ERROR; } @@ -1260,7 +1260,7 @@ nghttp3_ssize nghttp3_conn_read_bidi(nghttp3_conn *conn, size_t *pnproc, /* Fall through */ case NGHTTP3_REQ_STREAM_STATE_FRAME_LENGTH: assert(end - p > 0); - nread = nghttp3_read_varint(rvint, p, (size_t)(end - p), fin); + nread = nghttp3_read_varint(rvint, p, end, fin); if (nread < 0) { return NGHTTP3_ERR_H3_FRAME_ERROR; } @@ -1277,14 +1277,14 @@ nghttp3_ssize nghttp3_conn_read_bidi(nghttp3_conn *conn, size_t *pnproc, switch (rstate->fr.hd.type) { case NGHTTP3_FRAME_DATA: rv = nghttp3_stream_transit_rx_http_state( - stream, NGHTTP3_HTTP_EVENT_DATA_BEGIN); + stream, NGHTTP3_HTTP_EVENT_DATA_BEGIN); if (rv != 0) { return rv; } /* DATA frame might be empty. */ if (rstate->left == 0) { rv = nghttp3_stream_transit_rx_http_state( - stream, NGHTTP3_HTTP_EVENT_DATA_END); + stream, NGHTTP3_HTTP_EVENT_DATA_END); assert(0 == rv); nghttp3_stream_read_state_reset(rstate); @@ -1294,7 +1294,7 @@ nghttp3_ssize nghttp3_conn_read_bidi(nghttp3_conn *conn, size_t *pnproc, break; case NGHTTP3_FRAME_HEADERS: rv = nghttp3_stream_transit_rx_http_state( - stream, NGHTTP3_HTTP_EVENT_HEADERS_BEGIN); + stream, NGHTTP3_HTTP_EVENT_HEADERS_BEGIN); if (rv != 0) { return rv; } @@ -1305,7 +1305,7 @@ nghttp3_ssize nghttp3_conn_read_bidi(nghttp3_conn *conn, size_t *pnproc, } rv = nghttp3_stream_transit_rx_http_state( - stream, NGHTTP3_HTTP_EVENT_HEADERS_END); + stream, NGHTTP3_HTTP_EVENT_HEADERS_END); assert(0 == rv); nghttp3_stream_read_state_reset(rstate); @@ -1351,7 +1351,7 @@ nghttp3_ssize nghttp3_conn_read_bidi(nghttp3_conn *conn, size_t *pnproc, } break; case NGHTTP3_REQ_STREAM_STATE_DATA: - len = (size_t)nghttp3_min(rstate->left, (int64_t)(end - p)); + len = (size_t)nghttp3_min_int64(rstate->left, (int64_t)(end - p)); rv = nghttp3_conn_on_data(conn, stream, p, len); if (rv != 0) { return rv; @@ -1370,7 +1370,7 @@ nghttp3_ssize nghttp3_conn_read_bidi(nghttp3_conn *conn, size_t *pnproc, nghttp3_stream_read_state_reset(rstate); break; case NGHTTP3_REQ_STREAM_STATE_HEADERS: - len = (size_t)nghttp3_min(rstate->left, (int64_t)(end - p)); + len = (size_t)nghttp3_min_int64(rstate->left, (int64_t)(end - p)); nread = nghttp3_conn_on_headers(conn, stream, p, len, (int64_t)len == rstate->left); if (nread < 0) { @@ -1478,7 +1478,7 @@ nghttp3_ssize nghttp3_conn_read_bidi(nghttp3_conn *conn, size_t *pnproc, break; case NGHTTP3_REQ_STREAM_STATE_IGN_FRAME: - len = (size_t)nghttp3_min(rstate->left, (int64_t)(end - p)); + len = (size_t)nghttp3_min_int64(rstate->left, (int64_t)(end - p)); p += len; nconsumed += len; rstate->left -= (int64_t)len; @@ -1590,9 +1590,9 @@ static nghttp3_ssize conn_decode_headers(nghttp3_conn *conn, buf.last = buf.end; for (;;) { - nread = nghttp3_qpack_decoder_read_request(qdec, &stream->qpack_sctx, &nv, - &flags, buf.pos, - nghttp3_buf_len(&buf), fin); + nread = + nghttp3_qpack_decoder_read_request(qdec, &stream->qpack_sctx, &nv, &flags, + buf.pos, nghttp3_buf_len(&buf), fin); if (nread < 0) { return (int)nread; @@ -1625,8 +1625,8 @@ static nghttp3_ssize conn_decode_headers(nghttp3_conn *conn, if (flags & NGHTTP3_QPACK_DECODE_FLAG_EMIT) { rv = nghttp3_http_on_header( - http, &nv, request, trailers, - conn->server && conn->local.settings.enable_connect_protocol); + http, &nv, request, trailers, + conn->server && conn->local.settings.enable_connect_protocol); switch (rv) { case NGHTTP3_ERR_MALFORMED_HTTP_HEADER: break; @@ -1705,7 +1705,7 @@ int nghttp3_conn_on_settings_entry_received(nghttp3_conn *conn, dest->qpack_blocked_streams = (size_t)ent->value; nghttp3_qpack_encoder_set_max_blocked_streams( - &conn->qenc, (size_t)nghttp3_min(100, ent->value)); + &conn->qenc, (size_t)nghttp3_min_uint64(100, ent->value)); break; case NGHTTP3_SETTINGS_ID_ENABLE_CONNECT_PROTOCOL: if (!conn->server) { @@ -1784,7 +1784,7 @@ conn_on_priority_update_stream(nghttp3_conn *conn, } conn->rx.max_stream_id_bidi = - nghttp3_max(conn->rx.max_stream_id_bidi, stream_id); + nghttp3_max_int64(conn->rx.max_stream_id_bidi, stream_id); rv = nghttp3_conn_create_stream(conn, &stream, stream_id); if (rv != 0) { return rv; @@ -1836,7 +1836,7 @@ int nghttp3_conn_create_stream(nghttp3_conn *conn, nghttp3_stream **pstream, nghttp3_stream *stream; int rv; nghttp3_stream_callbacks callbacks = { - conn_stream_acked_data, + conn_stream_acked_data, }; rv = nghttp3_stream_new(&stream, stream_id, &callbacks, @@ -1995,7 +1995,7 @@ nghttp3_ssize nghttp3_conn_writev_stream(nghttp3_conn *conn, if (conn->tx.ctrl && !nghttp3_stream_is_blocked(conn->tx.ctrl)) { ncnt = - conn_writev_stream(conn, pstream_id, pfin, vec, veccnt, conn->tx.ctrl); + conn_writev_stream(conn, pstream_id, pfin, vec, veccnt, conn->tx.ctrl); if (ncnt) { return ncnt; } @@ -2008,7 +2008,7 @@ nghttp3_ssize nghttp3_conn_writev_stream(nghttp3_conn *conn, } ncnt = - conn_writev_stream(conn, pstream_id, pfin, vec, veccnt, conn->tx.qdec); + conn_writev_stream(conn, pstream_id, pfin, vec, veccnt, conn->tx.qdec); if (ncnt) { return ncnt; } @@ -2016,7 +2016,7 @@ nghttp3_ssize nghttp3_conn_writev_stream(nghttp3_conn *conn, if (conn->tx.qenc && !nghttp3_stream_is_blocked(conn->tx.qenc)) { ncnt = - conn_writev_stream(conn, pstream_id, pfin, vec, veccnt, conn->tx.qenc); + conn_writev_stream(conn, pstream_id, pfin, vec, veccnt, conn->tx.qenc); if (ncnt) { return ncnt; } @@ -2095,7 +2095,22 @@ int nghttp3_conn_add_ack_offset(nghttp3_conn *conn, int64_t stream_id, return 0; } - return nghttp3_stream_add_ack_offset(stream, n); + return nghttp3_stream_update_ack_offset(stream, stream->ack_offset + n); +} + +int nghttp3_conn_update_ack_offset(nghttp3_conn *conn, int64_t stream_id, + uint64_t offset) { + nghttp3_stream *stream = nghttp3_conn_find_stream(conn, stream_id); + + if (stream == NULL) { + return 0; + } + + if (stream->ack_offset > offset) { + return NGHTTP3_ERR_INVALID_ARGUMENT; + } + + return nghttp3_stream_update_ack_offset(stream, offset); } static int conn_submit_headers_data(nghttp3_conn *conn, nghttp3_stream *stream, @@ -2304,7 +2319,7 @@ int nghttp3_conn_shutdown(nghttp3_conn *conn) { frent.fr.hd.type = NGHTTP3_FRAME_GOAWAY; if (conn->server) { frent.fr.goaway.id = - nghttp3_min((1ll << 62) - 4, conn->rx.max_stream_id_bidi + 4); + nghttp3_min_int64((1ll << 62) - 4, conn->rx.max_stream_id_bidi + 4); } else { frent.fr.goaway.id = 0; } @@ -2318,7 +2333,7 @@ int nghttp3_conn_shutdown(nghttp3_conn *conn) { conn->tx.goaway_id = frent.fr.goaway.id; conn->flags |= - NGHTTP3_CONN_FLAG_GOAWAY_QUEUED | NGHTTP3_CONN_FLAG_SHUTDOWN_COMMENCED; + NGHTTP3_CONN_FLAG_GOAWAY_QUEUED | NGHTTP3_CONN_FLAG_SHUTDOWN_COMMENCED; return 0; } @@ -2619,5 +2634,5 @@ void nghttp3_settings_default_versioned(int settings_version, memset(settings, 0, sizeof(nghttp3_settings)); settings->max_field_section_size = NGHTTP3_VARINT_MAX; settings->qpack_encoder_max_dtable_capacity = - NGHTTP3_QPACK_ENCODER_MAX_DTABLE_CAPACITY; + NGHTTP3_QPACK_ENCODER_MAX_DTABLE_CAPACITY; } diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_conn.h b/deps/ngtcp2/nghttp3/lib/nghttp3_conn.h index 74f47583ce825c..1218ba508ba46a 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_conn.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_conn.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -204,4 +204,4 @@ int nghttp3_conn_reject_stream(nghttp3_conn *conn, nghttp3_stream *stream); */ nghttp3_stream *nghttp3_conn_get_next_tx_stream(nghttp3_conn *conn); -#endif /* NGHTTP3_CONN_H */ +#endif /* !defined(NGHTTP3_CONN_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_conv.c b/deps/ngtcp2/nghttp3/lib/nghttp3_conv.c index edd0adc4d0ff0a..6439a6d782960c 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_conv.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_conv.c @@ -31,34 +31,39 @@ #include "nghttp3_str.h" #include "nghttp3_unreachable.h" -int64_t nghttp3_get_varint(size_t *plen, const uint8_t *p) { +const uint8_t *nghttp3_get_varint(int64_t *dest, const uint8_t *p) { union { - char b[8]; + uint8_t n8; uint16_t n16; uint32_t n32; uint64_t n64; } n; - *plen = (size_t)(1u << (*p >> 6)); - - switch (*plen) { + switch (*p >> 6) { + case 0: + *dest = *p++; + return p; case 1: - return (int64_t)*p; - case 2: memcpy(&n, p, 2); - n.b[0] &= 0x3f; - return (int64_t)ntohs(n.n16); - case 4: + n.n8 &= 0x3f; + *dest = ntohs(n.n16); + + return p + 2; + case 2: memcpy(&n, p, 4); - n.b[0] &= 0x3f; - return (int64_t)ntohl(n.n32); - case 8: + n.n8 &= 0x3f; + *dest = ntohl(n.n32); + + return p + 4; + case 3: memcpy(&n, p, 8); - n.b[0] &= 0x3f; - return (int64_t)nghttp3_ntohl64(n.n64); - } + n.n8 &= 0x3f; + *dest = (int64_t)nghttp3_ntohl64(n.n64); - nghttp3_unreachable(); + return p + 8; + default: + nghttp3_unreachable(); + } } int64_t nghttp3_get_varint_fb(const uint8_t *p) { return *p & 0x3f; } diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_conv.h b/deps/ngtcp2/nghttp3/lib/nghttp3_conv.h index 5522bc735bfd37..40f5d4de782883 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_conv.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_conv.h @@ -28,69 +28,67 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #ifdef HAVE_ARPA_INET_H # include -#endif /* HAVE_ARPA_INET_H */ +#endif /* defined(HAVE_ARPA_INET_H) */ #ifdef HAVE_NETINET_IN_H # include -#endif /* HAVE_NETINET_IN_H */ +#endif /* defined(HAVE_NETINET_IN_H) */ #ifdef HAVE_BYTESWAP_H # include -#endif /* HAVE_BYTESWAP_H */ +#endif /* defined(HAVE_BYTESWAP_H) */ #ifdef HAVE_ENDIAN_H # include -#endif /* HAVE_ENDIAN_H */ +#endif /* defined(HAVE_ENDIAN_H) */ #ifdef HAVE_SYS_ENDIAN_H # include -#endif /* HAVE_SYS_ENDIAN_H */ +#endif /* defined(HAVE_SYS_ENDIAN_H) */ -#if defined(__APPLE__) +#ifdef __APPLE__ # include -#endif // __APPLE__ +#endif /* defined(__APPLE__) */ #include -#if defined(HAVE_BE64TOH) || \ - (defined(HAVE_DECL_BE64TOH) && HAVE_DECL_BE64TOH > 0) +#if HAVE_DECL_BE64TOH # define nghttp3_ntohl64(N) be64toh(N) # define nghttp3_htonl64(N) htobe64(N) -#else /* !HAVE_BE64TOH */ -# if defined(WORDS_BIGENDIAN) +#else /* !HAVE_DECL_BE64TOH */ +# ifdef WORDS_BIGENDIAN # define nghttp3_ntohl64(N) (N) # define nghttp3_htonl64(N) (N) -# else /* !WORDS_BIGENDIAN */ -# if defined(HAVE_BSWAP_64) || \ - (defined(HAVE_DECL_BSWAP_64) && HAVE_DECL_BSWAP_64 > 0) +# else /* !defined(WORDS_BIGENDIAN) */ +# if HAVE_DECL_BSWAP_64 # define nghttp3_bswap64 bswap_64 # elif defined(WIN32) # define nghttp3_bswap64 _byteswap_uint64 # elif defined(__APPLE__) # define nghttp3_bswap64 OSSwapInt64 -# else /* !HAVE_BSWAP_64 && !WIN32 && !__APPLE__ */ +# else /* !(HAVE_DECL_BSWAP_64 || defined(WIN32) || defined(__APPLE__)) */ # define nghttp3_bswap64(N) \ ((uint64_t)(ntohl((uint32_t)(N))) << 32 | ntohl((uint32_t)((N) >> 32))) -# endif /* !HAVE_BSWAP_64 && !WIN32 && !__APPLE__ */ +# endif /* !(HAVE_DECL_BSWAP_64 || defined(WIN32) || defined(__APPLE__)) */ # define nghttp3_ntohl64(N) nghttp3_bswap64(N) # define nghttp3_htonl64(N) nghttp3_bswap64(N) -# endif /* !WORDS_BIGENDIAN */ -#endif /* !HAVE_BE64TOH */ +# endif /* !defined(WORDS_BIGENDIAN) */ +#endif /* !HAVE_DECL_BE64TOH */ -#if defined(WIN32) +#ifdef WIN32 /* Windows requires ws2_32 library for ntonl family of functions. We define inline functions for those functions so that we don't have dependency on that lib. */ # ifdef _MSC_VER # define STIN static __inline -# else +# else /* !defined(_MSC_VER) */ # define STIN static inline -# endif +# endif /* !defined(_MSC_VER) */ STIN uint32_t htonl(uint32_t hostlong) { uint32_t res; @@ -128,14 +126,14 @@ STIN uint16_t ntohs(uint16_t netshort) { return res; } -#endif /* WIN32 */ +#endif /* defined(WIN32) */ /* - * nghttp3_get_varint reads variable-length integer from |p|, and - * returns it in host byte order. The number of bytes read is stored - * in |*plen|. + * nghttp3_get_varint reads variable-length unsigned integer from |p|, + * and stores it in the buffer pointed by |dest| in host byte order. + * It returns |p| plus the number of bytes read from |p|. */ -int64_t nghttp3_get_varint(size_t *plen, const uint8_t *p); +const uint8_t *nghttp3_get_varint(int64_t *dest, const uint8_t *p); /* * nghttp3_get_varint_fb reads first byte of encoded variable-length @@ -193,4 +191,4 @@ uint64_t nghttp3_ord_stream_id(int64_t stream_id); */ #define NGHTTP3_PRI_INC_MASK (1 << 7) -#endif /* NGHTTP3_CONV_H */ +#endif /* !defined(NGHTTP3_CONV_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_debug.c b/deps/ngtcp2/nghttp3/lib/nghttp3_debug.c index 4021b0dc469b66..0235217e9627ce 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_debug.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_debug.c @@ -35,7 +35,7 @@ static void nghttp3_default_debug_vfprintf_callback(const char *fmt, } static nghttp3_debug_vprintf_callback static_debug_vprintf_callback = - nghttp3_default_debug_vfprintf_callback; + nghttp3_default_debug_vfprintf_callback; void nghttp3_debug_vprintf(const char *format, ...) { if (static_debug_vprintf_callback) { @@ -47,15 +47,15 @@ void nghttp3_debug_vprintf(const char *format, ...) { } void nghttp3_set_debug_vprintf_callback( - nghttp3_debug_vprintf_callback debug_vprintf_callback) { + nghttp3_debug_vprintf_callback debug_vprintf_callback) { static_debug_vprintf_callback = debug_vprintf_callback; } -#else /* !DEBUGBUILD */ +#else /* !defined(DEBUGBUILD) */ void nghttp3_set_debug_vprintf_callback( - nghttp3_debug_vprintf_callback debug_vprintf_callback) { + nghttp3_debug_vprintf_callback debug_vprintf_callback) { (void)debug_vprintf_callback; } -#endif /* !DEBUGBUILD */ +#endif /* !defined(DEBUGBUILD) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_debug.h b/deps/ngtcp2/nghttp3/lib/nghttp3_debug.h index 01ed918414cfe5..d73bf8ecf312cd 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_debug.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_debug.h @@ -28,17 +28,17 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include #ifdef DEBUGBUILD # define DEBUGF(...) nghttp3_debug_vprintf(__VA_ARGS__) void nghttp3_debug_vprintf(const char *format, ...); -#else +#else /* !defined(DEBUGBUILD) */ # define DEBUGF(...) \ do { \ } while (0) -#endif +#endif /* !defined(DEBUGBUILD) */ -#endif /* NGHTTP3_DEBUG_H */ +#endif /* !defined(NGHTTP3_DEBUG_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_err.h b/deps/ngtcp2/nghttp3/lib/nghttp3_err.h index 2fa914f86b189e..6f8205cc17ce7c 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_err.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_err.h @@ -27,8 +27,8 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include -#endif /* NGHTTP3_ERR_H */ +#endif /* !defined(NGHTTP3_ERR_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_frame.c b/deps/ngtcp2/nghttp3/lib/nghttp3_frame.c index 923a78f90f826f..1d87e448d887cf 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_frame.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_frame.c @@ -102,7 +102,7 @@ nghttp3_frame_write_priority_update(uint8_t *p, } size_t nghttp3_frame_write_priority_update_len( - int64_t *ppayloadlen, const nghttp3_frame_priority_update *fr) { + int64_t *ppayloadlen, const nghttp3_frame_priority_update *fr) { size_t payloadlen = nghttp3_put_varintlen(fr->pri_elem_id) + fr->datalen; *ppayloadlen = (int64_t)payloadlen; diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_frame.h b/deps/ngtcp2/nghttp3/lib/nghttp3_frame.h index 1079673d150ce3..e216967d740b86 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_frame.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_frame.h @@ -28,7 +28,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -188,7 +188,7 @@ nghttp3_frame_write_priority_update(uint8_t *dest, * stores payload length in |*ppayloadlen|. */ size_t nghttp3_frame_write_priority_update_len( - int64_t *ppayloadlen, const nghttp3_frame_priority_update *fr); + int64_t *ppayloadlen, const nghttp3_frame_priority_update *fr); /* * nghttp3_nva_copy copies name/value pairs from |nva|, which contains @@ -227,4 +227,4 @@ void nghttp3_frame_headers_free(nghttp3_frame_headers *fr, void nghttp3_frame_priority_update_free(nghttp3_frame_priority_update *fr, const nghttp3_mem *mem); -#endif /* NGHTTP3_FRAME_H */ +#endif /* !defined(NGHTTP3_FRAME_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_gaptr.c b/deps/ngtcp2/nghttp3/lib/nghttp3_gaptr.c index 88cb49a02f892f..20eed5faa2bcba 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_gaptr.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_gaptr.c @@ -37,14 +37,8 @@ void nghttp3_gaptr_init(nghttp3_gaptr *gaptr, const nghttp3_mem *mem) { static int gaptr_gap_init(nghttp3_gaptr *gaptr) { nghttp3_range range = {0, UINT64_MAX}; - int rv; - - rv = nghttp3_ksl_insert(&gaptr->gap, NULL, &range, NULL); - if (rv != 0) { - return rv; - } - return 0; + return nghttp3_ksl_insert(&gaptr->gap, NULL, &range, NULL); } void nghttp3_gaptr_free(nghttp3_gaptr *gaptr) { @@ -82,7 +76,9 @@ int nghttp3_gaptr_push(nghttp3_gaptr *gaptr, uint64_t offset, nghttp3_ksl_remove_hint(&gaptr->gap, &it, &it, &k); continue; } + nghttp3_range_cut(&l, &r, &k, &m); + if (nghttp3_range_len(&l)) { nghttp3_ksl_update_key(&gaptr->gap, &k, &l); @@ -95,23 +91,23 @@ int nghttp3_gaptr_push(nghttp3_gaptr *gaptr, uint64_t offset, } else if (nghttp3_range_len(&r)) { nghttp3_ksl_update_key(&gaptr->gap, &k, &r); } + nghttp3_ksl_it_next(&it); } + return 0; } uint64_t nghttp3_gaptr_first_gap_offset(nghttp3_gaptr *gaptr) { nghttp3_ksl_it it; - nghttp3_range r; if (nghttp3_ksl_len(&gaptr->gap) == 0) { return 0; } it = nghttp3_ksl_begin(&gaptr->gap); - r = *(nghttp3_range *)nghttp3_ksl_it_key(&it); - return r.begin; + return ((nghttp3_range *)nghttp3_ksl_it_key(&it))->begin; } nghttp3_range nghttp3_gaptr_get_first_gap_after(nghttp3_gaptr *gaptr, @@ -136,7 +132,6 @@ int nghttp3_gaptr_is_pushed(nghttp3_gaptr *gaptr, uint64_t offset, uint64_t datalen) { nghttp3_range q = {offset, offset + datalen}; nghttp3_ksl_it it; - nghttp3_range k; nghttp3_range m; if (nghttp3_ksl_len(&gaptr->gap) == 0) { @@ -145,8 +140,7 @@ int nghttp3_gaptr_is_pushed(nghttp3_gaptr *gaptr, uint64_t offset, it = nghttp3_ksl_lower_bound_compar(&gaptr->gap, &q, nghttp3_ksl_range_exclusive_compar); - k = *(nghttp3_range *)nghttp3_ksl_it_key(&it); - m = nghttp3_range_intersect(&q, &k); + m = nghttp3_range_intersect(&q, (nghttp3_range *)nghttp3_ksl_it_key(&it)); return nghttp3_range_len(&m) == 0; } diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_gaptr.h b/deps/ngtcp2/nghttp3/lib/nghttp3_gaptr.h index 7c83c847c9fe29..7578fdc14f6010 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_gaptr.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_gaptr.h @@ -28,7 +28,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -40,8 +40,9 @@ * nghttp3_gaptr maintains the gap in the range [0, UINT64_MAX). */ typedef struct nghttp3_gaptr { - /* gap maintains the range of offset which is not received - yet. Initially, its range is [0, UINT64_MAX). */ + /* gap maintains the range of offset which is not pushed + yet. Initially, its range is [0, UINT64_MAX). "gap" is the range + that is not pushed yet. */ nghttp3_ksl gap; /* mem is custom memory allocator */ const nghttp3_mem *mem; @@ -58,8 +59,7 @@ void nghttp3_gaptr_init(nghttp3_gaptr *gaptr, const nghttp3_mem *mem); void nghttp3_gaptr_free(nghttp3_gaptr *gaptr); /* - * nghttp3_gaptr_push adds new data of length |datalen| at the stream - * offset |offset|. + * nghttp3_gaptr_push pushes the range [offset, offset + datalen). * * This function returns 0 if it succeeds, or one of the following * negative error codes: @@ -77,7 +77,7 @@ uint64_t nghttp3_gaptr_first_gap_offset(nghttp3_gaptr *gaptr); /* * nghttp3_gaptr_get_first_gap_after returns the first gap which - * overlaps or comes after |offset|. + * includes or comes after |offset|. */ nghttp3_range nghttp3_gaptr_get_first_gap_after(nghttp3_gaptr *gaptr, uint64_t offset); @@ -96,4 +96,4 @@ int nghttp3_gaptr_is_pushed(nghttp3_gaptr *gaptr, uint64_t offset, */ void nghttp3_gaptr_drop_first_gap(nghttp3_gaptr *gaptr); -#endif /* NGHTTP3_GAPTR_H */ +#endif /* !defined(NGHTTP3_GAPTR_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_http.c b/deps/ngtcp2/nghttp3/lib/nghttp3_http.c index 963134f13df946..38092cfb7c322c 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_http.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_http.c @@ -28,11 +28,15 @@ #include #include +#ifdef __AVX2__ +# include +#endif /* __AVX2__ */ + #include "nghttp3_stream.h" #include "nghttp3_macro.h" #include "nghttp3_conv.h" #include "nghttp3_unreachable.h" -#include "sfparse.h" +#include "sfparse/sfparse.h" static uint8_t downcase(uint8_t c) { return 'A' <= c && c <= 'Z' ? (uint8_t)(c - 'A' + 'a') : c; @@ -175,26 +179,282 @@ int nghttp3_pri_parse_priority_versioned(int pri_version, nghttp3_pri *dest, return nghttp3_http_parse_priority(dest, value, valuelen); } +/* Generated by genauthroitychartbl.py */ +static char VALID_AUTHORITY_CHARS[] = { + 0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */, + 0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */, + 0 /* BS */, 0 /* HT */, 0 /* LF */, 0 /* VT */, + 0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */, + 0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */, + 0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */, + 0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */, + 0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */, + 0 /* SPC */, 1 /* ! */, 0 /* " */, 0 /* # */, + 1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */, + 1 /* ( */, 1 /* ) */, 1 /* * */, 1 /* + */, + 1 /* , */, 1 /* - */, 1 /* . */, 0 /* / */, + 1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */, + 1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */, + 1 /* 8 */, 1 /* 9 */, 1 /* : */, 1 /* ; */, + 0 /* < */, 1 /* = */, 0 /* > */, 0 /* ? */, + 1 /* @ */, 1 /* A */, 1 /* B */, 1 /* C */, + 1 /* D */, 1 /* E */, 1 /* F */, 1 /* G */, + 1 /* H */, 1 /* I */, 1 /* J */, 1 /* K */, + 1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */, + 1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */, + 1 /* T */, 1 /* U */, 1 /* V */, 1 /* W */, + 1 /* X */, 1 /* Y */, 1 /* Z */, 1 /* [ */, + 0 /* \ */, 1 /* ] */, 0 /* ^ */, 1 /* _ */, + 0 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */, + 1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */, + 1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */, + 1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */, + 1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */, + 1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */, + 1 /* x */, 1 /* y */, 1 /* z */, 0 /* { */, + 0 /* | */, 0 /* } */, 1 /* ~ */, 0 /* DEL */, + 0 /* 0x80 */, 0 /* 0x81 */, 0 /* 0x82 */, 0 /* 0x83 */, + 0 /* 0x84 */, 0 /* 0x85 */, 0 /* 0x86 */, 0 /* 0x87 */, + 0 /* 0x88 */, 0 /* 0x89 */, 0 /* 0x8a */, 0 /* 0x8b */, + 0 /* 0x8c */, 0 /* 0x8d */, 0 /* 0x8e */, 0 /* 0x8f */, + 0 /* 0x90 */, 0 /* 0x91 */, 0 /* 0x92 */, 0 /* 0x93 */, + 0 /* 0x94 */, 0 /* 0x95 */, 0 /* 0x96 */, 0 /* 0x97 */, + 0 /* 0x98 */, 0 /* 0x99 */, 0 /* 0x9a */, 0 /* 0x9b */, + 0 /* 0x9c */, 0 /* 0x9d */, 0 /* 0x9e */, 0 /* 0x9f */, + 0 /* 0xa0 */, 0 /* 0xa1 */, 0 /* 0xa2 */, 0 /* 0xa3 */, + 0 /* 0xa4 */, 0 /* 0xa5 */, 0 /* 0xa6 */, 0 /* 0xa7 */, + 0 /* 0xa8 */, 0 /* 0xa9 */, 0 /* 0xaa */, 0 /* 0xab */, + 0 /* 0xac */, 0 /* 0xad */, 0 /* 0xae */, 0 /* 0xaf */, + 0 /* 0xb0 */, 0 /* 0xb1 */, 0 /* 0xb2 */, 0 /* 0xb3 */, + 0 /* 0xb4 */, 0 /* 0xb5 */, 0 /* 0xb6 */, 0 /* 0xb7 */, + 0 /* 0xb8 */, 0 /* 0xb9 */, 0 /* 0xba */, 0 /* 0xbb */, + 0 /* 0xbc */, 0 /* 0xbd */, 0 /* 0xbe */, 0 /* 0xbf */, + 0 /* 0xc0 */, 0 /* 0xc1 */, 0 /* 0xc2 */, 0 /* 0xc3 */, + 0 /* 0xc4 */, 0 /* 0xc5 */, 0 /* 0xc6 */, 0 /* 0xc7 */, + 0 /* 0xc8 */, 0 /* 0xc9 */, 0 /* 0xca */, 0 /* 0xcb */, + 0 /* 0xcc */, 0 /* 0xcd */, 0 /* 0xce */, 0 /* 0xcf */, + 0 /* 0xd0 */, 0 /* 0xd1 */, 0 /* 0xd2 */, 0 /* 0xd3 */, + 0 /* 0xd4 */, 0 /* 0xd5 */, 0 /* 0xd6 */, 0 /* 0xd7 */, + 0 /* 0xd8 */, 0 /* 0xd9 */, 0 /* 0xda */, 0 /* 0xdb */, + 0 /* 0xdc */, 0 /* 0xdd */, 0 /* 0xde */, 0 /* 0xdf */, + 0 /* 0xe0 */, 0 /* 0xe1 */, 0 /* 0xe2 */, 0 /* 0xe3 */, + 0 /* 0xe4 */, 0 /* 0xe5 */, 0 /* 0xe6 */, 0 /* 0xe7 */, + 0 /* 0xe8 */, 0 /* 0xe9 */, 0 /* 0xea */, 0 /* 0xeb */, + 0 /* 0xec */, 0 /* 0xed */, 0 /* 0xee */, 0 /* 0xef */, + 0 /* 0xf0 */, 0 /* 0xf1 */, 0 /* 0xf2 */, 0 /* 0xf3 */, + 0 /* 0xf4 */, 0 /* 0xf5 */, 0 /* 0xf6 */, 0 /* 0xf7 */, + 0 /* 0xf8 */, 0 /* 0xf9 */, 0 /* 0xfa */, 0 /* 0xfb */, + 0 /* 0xfc */, 0 /* 0xfd */, 0 /* 0xfe */, 0 /* 0xff */ +}; + +static int check_authority(const uint8_t *value, size_t len) { + const uint8_t *last; + for (last = value + len; value != last; ++value) { + if (!VALID_AUTHORITY_CHARS[*value]) { + return 0; + } + } + return 1; +} + +static int check_scheme(const uint8_t *value, size_t len) { + const uint8_t *last; + if (len == 0) { + return 0; + } + + if (!(('A' <= *value && *value <= 'Z') || ('a' <= *value && *value <= 'z'))) { + return 0; + } + + last = value + len; + ++value; + + for (; value != last; ++value) { + if (!(('A' <= *value && *value <= 'Z') || + ('a' <= *value && *value <= 'z') || + ('0' <= *value && *value <= '9') || *value == '+' || *value == '-' || + *value == '.')) { + return 0; + } + } + return 1; +} + +/* Generated by genmethodchartbl.py */ +static char VALID_METHOD_CHARS[] = { + 0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */, + 0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */, + 0 /* BS */, 0 /* HT */, 0 /* LF */, 0 /* VT */, + 0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */, + 0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */, + 0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */, + 0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */, + 0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */, + 0 /* SPC */, 1 /* ! */, 0 /* " */, 1 /* # */, + 1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */, + 0 /* ( */, 0 /* ) */, 1 /* * */, 1 /* + */, + 0 /* , */, 1 /* - */, 1 /* . */, 0 /* / */, + 1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */, + 1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */, + 1 /* 8 */, 1 /* 9 */, 0 /* : */, 0 /* ; */, + 0 /* < */, 0 /* = */, 0 /* > */, 0 /* ? */, + 0 /* @ */, 1 /* A */, 1 /* B */, 1 /* C */, + 1 /* D */, 1 /* E */, 1 /* F */, 1 /* G */, + 1 /* H */, 1 /* I */, 1 /* J */, 1 /* K */, + 1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */, + 1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */, + 1 /* T */, 1 /* U */, 1 /* V */, 1 /* W */, + 1 /* X */, 1 /* Y */, 1 /* Z */, 0 /* [ */, + 0 /* \ */, 0 /* ] */, 1 /* ^ */, 1 /* _ */, + 1 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */, + 1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */, + 1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */, + 1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */, + 1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */, + 1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */, + 1 /* x */, 1 /* y */, 1 /* z */, 0 /* { */, + 1 /* | */, 0 /* } */, 1 /* ~ */, 0 /* DEL */, + 0 /* 0x80 */, 0 /* 0x81 */, 0 /* 0x82 */, 0 /* 0x83 */, + 0 /* 0x84 */, 0 /* 0x85 */, 0 /* 0x86 */, 0 /* 0x87 */, + 0 /* 0x88 */, 0 /* 0x89 */, 0 /* 0x8a */, 0 /* 0x8b */, + 0 /* 0x8c */, 0 /* 0x8d */, 0 /* 0x8e */, 0 /* 0x8f */, + 0 /* 0x90 */, 0 /* 0x91 */, 0 /* 0x92 */, 0 /* 0x93 */, + 0 /* 0x94 */, 0 /* 0x95 */, 0 /* 0x96 */, 0 /* 0x97 */, + 0 /* 0x98 */, 0 /* 0x99 */, 0 /* 0x9a */, 0 /* 0x9b */, + 0 /* 0x9c */, 0 /* 0x9d */, 0 /* 0x9e */, 0 /* 0x9f */, + 0 /* 0xa0 */, 0 /* 0xa1 */, 0 /* 0xa2 */, 0 /* 0xa3 */, + 0 /* 0xa4 */, 0 /* 0xa5 */, 0 /* 0xa6 */, 0 /* 0xa7 */, + 0 /* 0xa8 */, 0 /* 0xa9 */, 0 /* 0xaa */, 0 /* 0xab */, + 0 /* 0xac */, 0 /* 0xad */, 0 /* 0xae */, 0 /* 0xaf */, + 0 /* 0xb0 */, 0 /* 0xb1 */, 0 /* 0xb2 */, 0 /* 0xb3 */, + 0 /* 0xb4 */, 0 /* 0xb5 */, 0 /* 0xb6 */, 0 /* 0xb7 */, + 0 /* 0xb8 */, 0 /* 0xb9 */, 0 /* 0xba */, 0 /* 0xbb */, + 0 /* 0xbc */, 0 /* 0xbd */, 0 /* 0xbe */, 0 /* 0xbf */, + 0 /* 0xc0 */, 0 /* 0xc1 */, 0 /* 0xc2 */, 0 /* 0xc3 */, + 0 /* 0xc4 */, 0 /* 0xc5 */, 0 /* 0xc6 */, 0 /* 0xc7 */, + 0 /* 0xc8 */, 0 /* 0xc9 */, 0 /* 0xca */, 0 /* 0xcb */, + 0 /* 0xcc */, 0 /* 0xcd */, 0 /* 0xce */, 0 /* 0xcf */, + 0 /* 0xd0 */, 0 /* 0xd1 */, 0 /* 0xd2 */, 0 /* 0xd3 */, + 0 /* 0xd4 */, 0 /* 0xd5 */, 0 /* 0xd6 */, 0 /* 0xd7 */, + 0 /* 0xd8 */, 0 /* 0xd9 */, 0 /* 0xda */, 0 /* 0xdb */, + 0 /* 0xdc */, 0 /* 0xdd */, 0 /* 0xde */, 0 /* 0xdf */, + 0 /* 0xe0 */, 0 /* 0xe1 */, 0 /* 0xe2 */, 0 /* 0xe3 */, + 0 /* 0xe4 */, 0 /* 0xe5 */, 0 /* 0xe6 */, 0 /* 0xe7 */, + 0 /* 0xe8 */, 0 /* 0xe9 */, 0 /* 0xea */, 0 /* 0xeb */, + 0 /* 0xec */, 0 /* 0xed */, 0 /* 0xee */, 0 /* 0xef */, + 0 /* 0xf0 */, 0 /* 0xf1 */, 0 /* 0xf2 */, 0 /* 0xf3 */, + 0 /* 0xf4 */, 0 /* 0xf5 */, 0 /* 0xf6 */, 0 /* 0xf7 */, + 0 /* 0xf8 */, 0 /* 0xf9 */, 0 /* 0xfa */, 0 /* 0xfb */, + 0 /* 0xfc */, 0 /* 0xfd */, 0 /* 0xfe */, 0 /* 0xff */ +}; + +static int check_method(const uint8_t *value, size_t len) { + const uint8_t *last; + if (len == 0) { + return 0; + } + for (last = value + len; value != last; ++value) { + if (!VALID_METHOD_CHARS[*value]) { + return 0; + } + } + return 1; +} + +/* Generated by genpathchartbl.py */ +static char VALID_PATH_CHARS[] = { + 0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */, + 0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */, + 0 /* BS */, 0 /* HT */, 0 /* LF */, 0 /* VT */, + 0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */, + 0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */, + 0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */, + 0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */, + 0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */, + 0 /* SPC */, 1 /* ! */, 1 /* " */, 1 /* # */, + 1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */, + 1 /* ( */, 1 /* ) */, 1 /* * */, 1 /* + */, + 1 /* , */, 1 /* - */, 1 /* . */, 1 /* / */, + 1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */, + 1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */, + 1 /* 8 */, 1 /* 9 */, 1 /* : */, 1 /* ; */, + 1 /* < */, 1 /* = */, 1 /* > */, 1 /* ? */, + 1 /* @ */, 1 /* A */, 1 /* B */, 1 /* C */, + 1 /* D */, 1 /* E */, 1 /* F */, 1 /* G */, + 1 /* H */, 1 /* I */, 1 /* J */, 1 /* K */, + 1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */, + 1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */, + 1 /* T */, 1 /* U */, 1 /* V */, 1 /* W */, + 1 /* X */, 1 /* Y */, 1 /* Z */, 1 /* [ */, + 1 /* \ */, 1 /* ] */, 1 /* ^ */, 1 /* _ */, + 1 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */, + 1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */, + 1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */, + 1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */, + 1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */, + 1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */, + 1 /* x */, 1 /* y */, 1 /* z */, 1 /* { */, + 1 /* | */, 1 /* } */, 1 /* ~ */, 0 /* DEL */, + 1 /* 0x80 */, 1 /* 0x81 */, 1 /* 0x82 */, 1 /* 0x83 */, + 1 /* 0x84 */, 1 /* 0x85 */, 1 /* 0x86 */, 1 /* 0x87 */, + 1 /* 0x88 */, 1 /* 0x89 */, 1 /* 0x8a */, 1 /* 0x8b */, + 1 /* 0x8c */, 1 /* 0x8d */, 1 /* 0x8e */, 1 /* 0x8f */, + 1 /* 0x90 */, 1 /* 0x91 */, 1 /* 0x92 */, 1 /* 0x93 */, + 1 /* 0x94 */, 1 /* 0x95 */, 1 /* 0x96 */, 1 /* 0x97 */, + 1 /* 0x98 */, 1 /* 0x99 */, 1 /* 0x9a */, 1 /* 0x9b */, + 1 /* 0x9c */, 1 /* 0x9d */, 1 /* 0x9e */, 1 /* 0x9f */, + 1 /* 0xa0 */, 1 /* 0xa1 */, 1 /* 0xa2 */, 1 /* 0xa3 */, + 1 /* 0xa4 */, 1 /* 0xa5 */, 1 /* 0xa6 */, 1 /* 0xa7 */, + 1 /* 0xa8 */, 1 /* 0xa9 */, 1 /* 0xaa */, 1 /* 0xab */, + 1 /* 0xac */, 1 /* 0xad */, 1 /* 0xae */, 1 /* 0xaf */, + 1 /* 0xb0 */, 1 /* 0xb1 */, 1 /* 0xb2 */, 1 /* 0xb3 */, + 1 /* 0xb4 */, 1 /* 0xb5 */, 1 /* 0xb6 */, 1 /* 0xb7 */, + 1 /* 0xb8 */, 1 /* 0xb9 */, 1 /* 0xba */, 1 /* 0xbb */, + 1 /* 0xbc */, 1 /* 0xbd */, 1 /* 0xbe */, 1 /* 0xbf */, + 1 /* 0xc0 */, 1 /* 0xc1 */, 1 /* 0xc2 */, 1 /* 0xc3 */, + 1 /* 0xc4 */, 1 /* 0xc5 */, 1 /* 0xc6 */, 1 /* 0xc7 */, + 1 /* 0xc8 */, 1 /* 0xc9 */, 1 /* 0xca */, 1 /* 0xcb */, + 1 /* 0xcc */, 1 /* 0xcd */, 1 /* 0xce */, 1 /* 0xcf */, + 1 /* 0xd0 */, 1 /* 0xd1 */, 1 /* 0xd2 */, 1 /* 0xd3 */, + 1 /* 0xd4 */, 1 /* 0xd5 */, 1 /* 0xd6 */, 1 /* 0xd7 */, + 1 /* 0xd8 */, 1 /* 0xd9 */, 1 /* 0xda */, 1 /* 0xdb */, + 1 /* 0xdc */, 1 /* 0xdd */, 1 /* 0xde */, 1 /* 0xdf */, + 1 /* 0xe0 */, 1 /* 0xe1 */, 1 /* 0xe2 */, 1 /* 0xe3 */, + 1 /* 0xe4 */, 1 /* 0xe5 */, 1 /* 0xe6 */, 1 /* 0xe7 */, + 1 /* 0xe8 */, 1 /* 0xe9 */, 1 /* 0xea */, 1 /* 0xeb */, + 1 /* 0xec */, 1 /* 0xed */, 1 /* 0xee */, 1 /* 0xef */, + 1 /* 0xf0 */, 1 /* 0xf1 */, 1 /* 0xf2 */, 1 /* 0xf3 */, + 1 /* 0xf4 */, 1 /* 0xf5 */, 1 /* 0xf6 */, 1 /* 0xf7 */, + 1 /* 0xf8 */, 1 /* 0xf9 */, 1 /* 0xfa */, 1 /* 0xfb */, + 1 /* 0xfc */, 1 /* 0xfd */, 1 /* 0xfe */, 1 /* 0xff */ +}; + +static int check_path(const uint8_t *value, size_t len) { + const uint8_t *last; + for (last = value + len; value != last; ++value) { + if (!VALID_PATH_CHARS[*value]) { + return 0; + } + } + return 1; +} + static int http_request_on_header(nghttp3_http_state *http, nghttp3_qpack_nv *nv, int trailers, int connect_protocol) { nghttp3_pri pri; - if (nv->name->base[0] == ':') { - if (trailers || - (http->flags & NGHTTP3_HTTP_FLAG_PSEUDO_HEADER_DISALLOWED)) { - return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; - } - } - switch (nv->token) { case NGHTTP3_QPACK_TOKEN__AUTHORITY: - if (!check_pseudo_header(http, nv, NGHTTP3_HTTP_FLAG__AUTHORITY)) { + if (!check_authority(nv->value->base, nv->value->len) || + !check_pseudo_header(http, nv, NGHTTP3_HTTP_FLAG__AUTHORITY)) { return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; } break; case NGHTTP3_QPACK_TOKEN__METHOD: - if (!check_pseudo_header(http, nv, NGHTTP3_HTTP_FLAG__METHOD)) { + if (!check_method(nv->value->base, nv->value->len) || + !check_pseudo_header(http, nv, NGHTTP3_HTTP_FLAG__METHOD)) { return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; } switch (nv->value->len) { @@ -220,7 +480,8 @@ static int http_request_on_header(nghttp3_http_state *http, } break; case NGHTTP3_QPACK_TOKEN__PATH: - if (!check_pseudo_header(http, nv, NGHTTP3_HTTP_FLAG__PATH)) { + if (!check_path(nv->value->base, nv->value->len) || + !check_pseudo_header(http, nv, NGHTTP3_HTTP_FLAG__PATH)) { return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; } if (nv->value->base[0] == '/') { @@ -230,7 +491,8 @@ static int http_request_on_header(nghttp3_http_state *http, } break; case NGHTTP3_QPACK_TOKEN__SCHEME: - if (!check_pseudo_header(http, nv, NGHTTP3_HTTP_FLAG__SCHEME)) { + if (!check_scheme(nv->value->base, nv->value->len) || + !check_pseudo_header(http, nv, NGHTTP3_HTTP_FLAG__SCHEME)) { return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; } /* scheme is case-insensitive: @@ -241,15 +503,16 @@ static int http_request_on_header(nghttp3_http_state *http, } break; case NGHTTP3_QPACK_TOKEN__PROTOCOL: - if (!connect_protocol) { - return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; - } - - if (!check_pseudo_header(http, nv, NGHTTP3_HTTP_FLAG__PROTOCOL)) { + if (!connect_protocol || + !nghttp3_check_header_value(nv->value->base, nv->value->len) || + !check_pseudo_header(http, nv, NGHTTP3_HTTP_FLAG__PROTOCOL)) { return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; } break; case NGHTTP3_QPACK_TOKEN_HOST: + if (!check_authority(nv->value->base, nv->value->len)) { + return NGHTTP3_ERR_REMOVE_HTTP_HEADER; + } if (!check_pseudo_header(http, nv, NGHTTP3_HTTP_FLAG_HOST)) { return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; } @@ -284,22 +547,35 @@ static int http_request_on_header(nghttp3_http_state *http, } break; case NGHTTP3_QPACK_TOKEN_PRIORITY: - if (!trailers && !(http->flags & NGHTTP3_HTTP_FLAG_BAD_PRIORITY)) { - pri = http->pri; - if (nghttp3_http_parse_priority(&pri, nv->value->base, nv->value->len) == - 0) { - http->pri = pri; - http->flags |= NGHTTP3_HTTP_FLAG_PRIORITY; - } else { - http->flags &= ~NGHTTP3_HTTP_FLAG_PRIORITY; - http->flags |= NGHTTP3_HTTP_FLAG_BAD_PRIORITY; - } + if (!nghttp3_check_header_value(nv->value->base, nv->value->len)) { + return NGHTTP3_ERR_REMOVE_HTTP_HEADER; } + + if (trailers || (http->flags & NGHTTP3_HTTP_FLAG_BAD_PRIORITY)) { + break; + } + + pri = http->pri; + + if (nghttp3_http_parse_priority(&pri, nv->value->base, nv->value->len) == + 0) { + http->pri = pri; + http->flags |= NGHTTP3_HTTP_FLAG_PRIORITY; + break; + } + + http->flags &= ~NGHTTP3_HTTP_FLAG_PRIORITY; + http->flags |= NGHTTP3_HTTP_FLAG_BAD_PRIORITY; + break; default: if (nv->name->base[0] == ':') { return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; } + + if (!nghttp3_check_header_value(nv->value->base, nv->value->len)) { + return NGHTTP3_ERR_REMOVE_HTTP_HEADER; + } } return 0; @@ -307,19 +583,10 @@ static int http_request_on_header(nghttp3_http_state *http, static int http_response_on_header(nghttp3_http_state *http, nghttp3_qpack_nv *nv, int trailers) { - if (nv->name->base[0] == ':') { - if (trailers || - (http->flags & NGHTTP3_HTTP_FLAG_PSEUDO_HEADER_DISALLOWED)) { - return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; - } - } - switch (nv->token) { case NGHTTP3_QPACK_TOKEN__STATUS: { - if (!check_pseudo_header(http, nv, NGHTTP3_HTTP_FLAG__STATUS)) { - return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; - } - if (nv->value->len != 3) { + if (!check_pseudo_header(http, nv, NGHTTP3_HTTP_FLAG__STATUS) || + nv->value->len != 3) { return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; } http->status_code = (int16_t)parse_uint(nv->value->base, nv->value->len); @@ -340,22 +607,18 @@ static int http_response_on_header(nghttp3_http_state *http, /* content-length header field in 204 response is prohibited by RFC 7230. But some widely used servers send content-length: 0. Until they get fixed, we ignore it. */ - if (http->content_length != -1) { - /* Found multiple content-length field */ - return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; - } - if (!lstrieq("0", nv->value->base, nv->value->len)) { + if (/* Found multiple content-length field */ + http->content_length != -1 || + !lstrieq("0", nv->value->base, nv->value->len)) { return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; } http->content_length = 0; return NGHTTP3_ERR_REMOVE_HTTP_HEADER; } - if (http->status_code / 100 == 1) { - return NGHTTP3_ERR_REMOVE_HTTP_HEADER; - } - /* https://tools.ietf.org/html/rfc7230#section-3.3.3 */ - if (http->status_code / 100 == 2 && - (http->flags & NGHTTP3_HTTP_FLAG_METH_CONNECT)) { + if (http->status_code / 100 == 1 || + /* https://tools.ietf.org/html/rfc7230#section-3.3.3 */ + (http->status_code / 100 == 2 && + (http->flags & NGHTTP3_HTTP_FLAG_METH_CONNECT))) { return NGHTTP3_ERR_REMOVE_HTTP_HEADER; } if (http->content_length != -1) { @@ -383,349 +646,50 @@ static int http_response_on_header(nghttp3_http_state *http, if (nv->name->base[0] == ':') { return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; } - } - - return 0; -} - -/* Generated by genauthroitychartbl.py */ -static char VALID_AUTHORITY_CHARS[] = { - 0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */, - 0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */, - 0 /* BS */, 0 /* HT */, 0 /* LF */, 0 /* VT */, - 0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */, - 0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */, - 0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */, - 0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */, - 0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */, - 0 /* SPC */, 1 /* ! */, 0 /* " */, 0 /* # */, - 1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */, - 1 /* ( */, 1 /* ) */, 1 /* * */, 1 /* + */, - 1 /* , */, 1 /* - */, 1 /* . */, 0 /* / */, - 1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */, - 1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */, - 1 /* 8 */, 1 /* 9 */, 1 /* : */, 1 /* ; */, - 0 /* < */, 1 /* = */, 0 /* > */, 0 /* ? */, - 1 /* @ */, 1 /* A */, 1 /* B */, 1 /* C */, - 1 /* D */, 1 /* E */, 1 /* F */, 1 /* G */, - 1 /* H */, 1 /* I */, 1 /* J */, 1 /* K */, - 1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */, - 1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */, - 1 /* T */, 1 /* U */, 1 /* V */, 1 /* W */, - 1 /* X */, 1 /* Y */, 1 /* Z */, 1 /* [ */, - 0 /* \ */, 1 /* ] */, 0 /* ^ */, 1 /* _ */, - 0 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */, - 1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */, - 1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */, - 1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */, - 1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */, - 1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */, - 1 /* x */, 1 /* y */, 1 /* z */, 0 /* { */, - 0 /* | */, 0 /* } */, 1 /* ~ */, 0 /* DEL */, - 0 /* 0x80 */, 0 /* 0x81 */, 0 /* 0x82 */, 0 /* 0x83 */, - 0 /* 0x84 */, 0 /* 0x85 */, 0 /* 0x86 */, 0 /* 0x87 */, - 0 /* 0x88 */, 0 /* 0x89 */, 0 /* 0x8a */, 0 /* 0x8b */, - 0 /* 0x8c */, 0 /* 0x8d */, 0 /* 0x8e */, 0 /* 0x8f */, - 0 /* 0x90 */, 0 /* 0x91 */, 0 /* 0x92 */, 0 /* 0x93 */, - 0 /* 0x94 */, 0 /* 0x95 */, 0 /* 0x96 */, 0 /* 0x97 */, - 0 /* 0x98 */, 0 /* 0x99 */, 0 /* 0x9a */, 0 /* 0x9b */, - 0 /* 0x9c */, 0 /* 0x9d */, 0 /* 0x9e */, 0 /* 0x9f */, - 0 /* 0xa0 */, 0 /* 0xa1 */, 0 /* 0xa2 */, 0 /* 0xa3 */, - 0 /* 0xa4 */, 0 /* 0xa5 */, 0 /* 0xa6 */, 0 /* 0xa7 */, - 0 /* 0xa8 */, 0 /* 0xa9 */, 0 /* 0xaa */, 0 /* 0xab */, - 0 /* 0xac */, 0 /* 0xad */, 0 /* 0xae */, 0 /* 0xaf */, - 0 /* 0xb0 */, 0 /* 0xb1 */, 0 /* 0xb2 */, 0 /* 0xb3 */, - 0 /* 0xb4 */, 0 /* 0xb5 */, 0 /* 0xb6 */, 0 /* 0xb7 */, - 0 /* 0xb8 */, 0 /* 0xb9 */, 0 /* 0xba */, 0 /* 0xbb */, - 0 /* 0xbc */, 0 /* 0xbd */, 0 /* 0xbe */, 0 /* 0xbf */, - 0 /* 0xc0 */, 0 /* 0xc1 */, 0 /* 0xc2 */, 0 /* 0xc3 */, - 0 /* 0xc4 */, 0 /* 0xc5 */, 0 /* 0xc6 */, 0 /* 0xc7 */, - 0 /* 0xc8 */, 0 /* 0xc9 */, 0 /* 0xca */, 0 /* 0xcb */, - 0 /* 0xcc */, 0 /* 0xcd */, 0 /* 0xce */, 0 /* 0xcf */, - 0 /* 0xd0 */, 0 /* 0xd1 */, 0 /* 0xd2 */, 0 /* 0xd3 */, - 0 /* 0xd4 */, 0 /* 0xd5 */, 0 /* 0xd6 */, 0 /* 0xd7 */, - 0 /* 0xd8 */, 0 /* 0xd9 */, 0 /* 0xda */, 0 /* 0xdb */, - 0 /* 0xdc */, 0 /* 0xdd */, 0 /* 0xde */, 0 /* 0xdf */, - 0 /* 0xe0 */, 0 /* 0xe1 */, 0 /* 0xe2 */, 0 /* 0xe3 */, - 0 /* 0xe4 */, 0 /* 0xe5 */, 0 /* 0xe6 */, 0 /* 0xe7 */, - 0 /* 0xe8 */, 0 /* 0xe9 */, 0 /* 0xea */, 0 /* 0xeb */, - 0 /* 0xec */, 0 /* 0xed */, 0 /* 0xee */, 0 /* 0xef */, - 0 /* 0xf0 */, 0 /* 0xf1 */, 0 /* 0xf2 */, 0 /* 0xf3 */, - 0 /* 0xf4 */, 0 /* 0xf5 */, 0 /* 0xf6 */, 0 /* 0xf7 */, - 0 /* 0xf8 */, 0 /* 0xf9 */, 0 /* 0xfa */, 0 /* 0xfb */, - 0 /* 0xfc */, 0 /* 0xfd */, 0 /* 0xfe */, 0 /* 0xff */ -}; - -static int check_authority(const uint8_t *value, size_t len) { - const uint8_t *last; - for (last = value + len; value != last; ++value) { - if (!VALID_AUTHORITY_CHARS[*value]) { - return 0; - } - } - return 1; -} - -static int check_scheme(const uint8_t *value, size_t len) { - const uint8_t *last; - if (len == 0) { - return 0; - } - - if (!(('A' <= *value && *value <= 'Z') || ('a' <= *value && *value <= 'z'))) { - return 0; - } - last = value + len; - ++value; - - for (; value != last; ++value) { - if (!(('A' <= *value && *value <= 'Z') || - ('a' <= *value && *value <= 'z') || - ('0' <= *value && *value <= '9') || *value == '+' || *value == '-' || - *value == '.')) { - return 0; + if (!nghttp3_check_header_value(nv->value->base, nv->value->len)) { + return NGHTTP3_ERR_REMOVE_HTTP_HEADER; } } - return 1; -} -/* Generated by genmethodchartbl.py */ -static char VALID_METHOD_CHARS[] = { - 0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */, - 0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */, - 0 /* BS */, 0 /* HT */, 0 /* LF */, 0 /* VT */, - 0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */, - 0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */, - 0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */, - 0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */, - 0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */, - 0 /* SPC */, 1 /* ! */, 0 /* " */, 1 /* # */, - 1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */, - 0 /* ( */, 0 /* ) */, 1 /* * */, 1 /* + */, - 0 /* , */, 1 /* - */, 1 /* . */, 0 /* / */, - 1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */, - 1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */, - 1 /* 8 */, 1 /* 9 */, 0 /* : */, 0 /* ; */, - 0 /* < */, 0 /* = */, 0 /* > */, 0 /* ? */, - 0 /* @ */, 1 /* A */, 1 /* B */, 1 /* C */, - 1 /* D */, 1 /* E */, 1 /* F */, 1 /* G */, - 1 /* H */, 1 /* I */, 1 /* J */, 1 /* K */, - 1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */, - 1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */, - 1 /* T */, 1 /* U */, 1 /* V */, 1 /* W */, - 1 /* X */, 1 /* Y */, 1 /* Z */, 0 /* [ */, - 0 /* \ */, 0 /* ] */, 1 /* ^ */, 1 /* _ */, - 1 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */, - 1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */, - 1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */, - 1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */, - 1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */, - 1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */, - 1 /* x */, 1 /* y */, 1 /* z */, 0 /* { */, - 1 /* | */, 0 /* } */, 1 /* ~ */, 0 /* DEL */, - 0 /* 0x80 */, 0 /* 0x81 */, 0 /* 0x82 */, 0 /* 0x83 */, - 0 /* 0x84 */, 0 /* 0x85 */, 0 /* 0x86 */, 0 /* 0x87 */, - 0 /* 0x88 */, 0 /* 0x89 */, 0 /* 0x8a */, 0 /* 0x8b */, - 0 /* 0x8c */, 0 /* 0x8d */, 0 /* 0x8e */, 0 /* 0x8f */, - 0 /* 0x90 */, 0 /* 0x91 */, 0 /* 0x92 */, 0 /* 0x93 */, - 0 /* 0x94 */, 0 /* 0x95 */, 0 /* 0x96 */, 0 /* 0x97 */, - 0 /* 0x98 */, 0 /* 0x99 */, 0 /* 0x9a */, 0 /* 0x9b */, - 0 /* 0x9c */, 0 /* 0x9d */, 0 /* 0x9e */, 0 /* 0x9f */, - 0 /* 0xa0 */, 0 /* 0xa1 */, 0 /* 0xa2 */, 0 /* 0xa3 */, - 0 /* 0xa4 */, 0 /* 0xa5 */, 0 /* 0xa6 */, 0 /* 0xa7 */, - 0 /* 0xa8 */, 0 /* 0xa9 */, 0 /* 0xaa */, 0 /* 0xab */, - 0 /* 0xac */, 0 /* 0xad */, 0 /* 0xae */, 0 /* 0xaf */, - 0 /* 0xb0 */, 0 /* 0xb1 */, 0 /* 0xb2 */, 0 /* 0xb3 */, - 0 /* 0xb4 */, 0 /* 0xb5 */, 0 /* 0xb6 */, 0 /* 0xb7 */, - 0 /* 0xb8 */, 0 /* 0xb9 */, 0 /* 0xba */, 0 /* 0xbb */, - 0 /* 0xbc */, 0 /* 0xbd */, 0 /* 0xbe */, 0 /* 0xbf */, - 0 /* 0xc0 */, 0 /* 0xc1 */, 0 /* 0xc2 */, 0 /* 0xc3 */, - 0 /* 0xc4 */, 0 /* 0xc5 */, 0 /* 0xc6 */, 0 /* 0xc7 */, - 0 /* 0xc8 */, 0 /* 0xc9 */, 0 /* 0xca */, 0 /* 0xcb */, - 0 /* 0xcc */, 0 /* 0xcd */, 0 /* 0xce */, 0 /* 0xcf */, - 0 /* 0xd0 */, 0 /* 0xd1 */, 0 /* 0xd2 */, 0 /* 0xd3 */, - 0 /* 0xd4 */, 0 /* 0xd5 */, 0 /* 0xd6 */, 0 /* 0xd7 */, - 0 /* 0xd8 */, 0 /* 0xd9 */, 0 /* 0xda */, 0 /* 0xdb */, - 0 /* 0xdc */, 0 /* 0xdd */, 0 /* 0xde */, 0 /* 0xdf */, - 0 /* 0xe0 */, 0 /* 0xe1 */, 0 /* 0xe2 */, 0 /* 0xe3 */, - 0 /* 0xe4 */, 0 /* 0xe5 */, 0 /* 0xe6 */, 0 /* 0xe7 */, - 0 /* 0xe8 */, 0 /* 0xe9 */, 0 /* 0xea */, 0 /* 0xeb */, - 0 /* 0xec */, 0 /* 0xed */, 0 /* 0xee */, 0 /* 0xef */, - 0 /* 0xf0 */, 0 /* 0xf1 */, 0 /* 0xf2 */, 0 /* 0xf3 */, - 0 /* 0xf4 */, 0 /* 0xf5 */, 0 /* 0xf6 */, 0 /* 0xf7 */, - 0 /* 0xf8 */, 0 /* 0xf9 */, 0 /* 0xfa */, 0 /* 0xfb */, - 0 /* 0xfc */, 0 /* 0xfd */, 0 /* 0xfe */, 0 /* 0xff */ -}; - -static int check_method(const uint8_t *value, size_t len) { - const uint8_t *last; - if (len == 0) { - return 0; - } - for (last = value + len; value != last; ++value) { - if (!VALID_METHOD_CHARS[*value]) { - return 0; - } - } - return 1; + return 0; } -/* Generated by genpathchartbl.py */ -static char VALID_PATH_CHARS[] = { - 0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */, - 0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */, - 0 /* BS */, 0 /* HT */, 0 /* LF */, 0 /* VT */, - 0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */, - 0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */, - 0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */, - 0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */, - 0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */, - 0 /* SPC */, 1 /* ! */, 1 /* " */, 1 /* # */, - 1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */, - 1 /* ( */, 1 /* ) */, 1 /* * */, 1 /* + */, - 1 /* , */, 1 /* - */, 1 /* . */, 1 /* / */, - 1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */, - 1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */, - 1 /* 8 */, 1 /* 9 */, 1 /* : */, 1 /* ; */, - 1 /* < */, 1 /* = */, 1 /* > */, 1 /* ? */, - 1 /* @ */, 1 /* A */, 1 /* B */, 1 /* C */, - 1 /* D */, 1 /* E */, 1 /* F */, 1 /* G */, - 1 /* H */, 1 /* I */, 1 /* J */, 1 /* K */, - 1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */, - 1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */, - 1 /* T */, 1 /* U */, 1 /* V */, 1 /* W */, - 1 /* X */, 1 /* Y */, 1 /* Z */, 1 /* [ */, - 1 /* \ */, 1 /* ] */, 1 /* ^ */, 1 /* _ */, - 1 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */, - 1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */, - 1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */, - 1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */, - 1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */, - 1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */, - 1 /* x */, 1 /* y */, 1 /* z */, 1 /* { */, - 1 /* | */, 1 /* } */, 1 /* ~ */, 0 /* DEL */, - 1 /* 0x80 */, 1 /* 0x81 */, 1 /* 0x82 */, 1 /* 0x83 */, - 1 /* 0x84 */, 1 /* 0x85 */, 1 /* 0x86 */, 1 /* 0x87 */, - 1 /* 0x88 */, 1 /* 0x89 */, 1 /* 0x8a */, 1 /* 0x8b */, - 1 /* 0x8c */, 1 /* 0x8d */, 1 /* 0x8e */, 1 /* 0x8f */, - 1 /* 0x90 */, 1 /* 0x91 */, 1 /* 0x92 */, 1 /* 0x93 */, - 1 /* 0x94 */, 1 /* 0x95 */, 1 /* 0x96 */, 1 /* 0x97 */, - 1 /* 0x98 */, 1 /* 0x99 */, 1 /* 0x9a */, 1 /* 0x9b */, - 1 /* 0x9c */, 1 /* 0x9d */, 1 /* 0x9e */, 1 /* 0x9f */, - 1 /* 0xa0 */, 1 /* 0xa1 */, 1 /* 0xa2 */, 1 /* 0xa3 */, - 1 /* 0xa4 */, 1 /* 0xa5 */, 1 /* 0xa6 */, 1 /* 0xa7 */, - 1 /* 0xa8 */, 1 /* 0xa9 */, 1 /* 0xaa */, 1 /* 0xab */, - 1 /* 0xac */, 1 /* 0xad */, 1 /* 0xae */, 1 /* 0xaf */, - 1 /* 0xb0 */, 1 /* 0xb1 */, 1 /* 0xb2 */, 1 /* 0xb3 */, - 1 /* 0xb4 */, 1 /* 0xb5 */, 1 /* 0xb6 */, 1 /* 0xb7 */, - 1 /* 0xb8 */, 1 /* 0xb9 */, 1 /* 0xba */, 1 /* 0xbb */, - 1 /* 0xbc */, 1 /* 0xbd */, 1 /* 0xbe */, 1 /* 0xbf */, - 1 /* 0xc0 */, 1 /* 0xc1 */, 1 /* 0xc2 */, 1 /* 0xc3 */, - 1 /* 0xc4 */, 1 /* 0xc5 */, 1 /* 0xc6 */, 1 /* 0xc7 */, - 1 /* 0xc8 */, 1 /* 0xc9 */, 1 /* 0xca */, 1 /* 0xcb */, - 1 /* 0xcc */, 1 /* 0xcd */, 1 /* 0xce */, 1 /* 0xcf */, - 1 /* 0xd0 */, 1 /* 0xd1 */, 1 /* 0xd2 */, 1 /* 0xd3 */, - 1 /* 0xd4 */, 1 /* 0xd5 */, 1 /* 0xd6 */, 1 /* 0xd7 */, - 1 /* 0xd8 */, 1 /* 0xd9 */, 1 /* 0xda */, 1 /* 0xdb */, - 1 /* 0xdc */, 1 /* 0xdd */, 1 /* 0xde */, 1 /* 0xdf */, - 1 /* 0xe0 */, 1 /* 0xe1 */, 1 /* 0xe2 */, 1 /* 0xe3 */, - 1 /* 0xe4 */, 1 /* 0xe5 */, 1 /* 0xe6 */, 1 /* 0xe7 */, - 1 /* 0xe8 */, 1 /* 0xe9 */, 1 /* 0xea */, 1 /* 0xeb */, - 1 /* 0xec */, 1 /* 0xed */, 1 /* 0xee */, 1 /* 0xef */, - 1 /* 0xf0 */, 1 /* 0xf1 */, 1 /* 0xf2 */, 1 /* 0xf3 */, - 1 /* 0xf4 */, 1 /* 0xf5 */, 1 /* 0xf6 */, 1 /* 0xf7 */, - 1 /* 0xf8 */, 1 /* 0xf9 */, 1 /* 0xfa */, 1 /* 0xfb */, - 1 /* 0xfc */, 1 /* 0xfd */, 1 /* 0xfe */, 1 /* 0xff */ -}; - -static int check_path(const uint8_t *value, size_t len) { - const uint8_t *last; - for (last = value + len; value != last; ++value) { - if (!VALID_PATH_CHARS[*value]) { - return 0; - } - } - return 1; -} +static int http_check_nonempty_header_name(const uint8_t *name, size_t len); int nghttp3_http_on_header(nghttp3_http_state *http, nghttp3_qpack_nv *nv, int request, int trailers, int connect_protocol) { - int rv; - size_t i; - uint8_t c; - - if (!nghttp3_check_header_name(nv->name->base, nv->name->len)) { - if (nv->name->len > 0 && nv->name->base[0] == ':') { - return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; - } - /* header field name must be lower-cased without exception */ - for (i = 0; i < nv->name->len; ++i) { - c = nv->name->base[i]; - if ('A' <= c && c <= 'Z') { - return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; - } - } - /* When ignoring regular header fields, we set this flag so that - we still enforce header field ordering rule for pseudo header - fields. */ + if (nv->name->len == 0) { http->flags |= NGHTTP3_HTTP_FLAG_PSEUDO_HEADER_DISALLOWED; + return NGHTTP3_ERR_REMOVE_HTTP_HEADER; } - assert(nv->name->len > 0); - - switch (nv->token) { - case NGHTTP3_QPACK_TOKEN__METHOD: - rv = check_method(nv->value->base, nv->value->len); - break; - case NGHTTP3_QPACK_TOKEN__SCHEME: - rv = check_scheme(nv->value->base, nv->value->len); - break; - case NGHTTP3_QPACK_TOKEN__AUTHORITY: - case NGHTTP3_QPACK_TOKEN_HOST: - if (request) { - rv = check_authority(nv->value->base, nv->value->len); - } else { - /* The use of host field in response field section is - undefined. */ - rv = nghttp3_check_header_value(nv->value->base, nv->value->len); + if (nv->name->base[0] == ':') { + /* pseudo header must have a valid token. */ + if (nv->token == -1 || trailers || + (http->flags & NGHTTP3_HTTP_FLAG_PSEUDO_HEADER_DISALLOWED)) { + return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; } - break; - case NGHTTP3_QPACK_TOKEN__PATH: - rv = check_path(nv->value->base, nv->value->len); - break; - default: - rv = nghttp3_check_header_value(nv->value->base, nv->value->len); - } + } else { + http->flags |= NGHTTP3_HTTP_FLAG_PSEUDO_HEADER_DISALLOWED; - if (rv == 0) { - if (nv->name->base[0] == ':') { + switch (http_check_nonempty_header_name(nv->name->base, nv->name->len)) { + case 0: + return NGHTTP3_ERR_REMOVE_HTTP_HEADER; + case -1: + /* header field name must be lower-cased without exception */ return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; } - /* When ignoring regular header fields, we set this flag so that - we still enforce header field ordering rule for pseudo header - fields. */ - http->flags |= NGHTTP3_HTTP_FLAG_PSEUDO_HEADER_DISALLOWED; - return NGHTTP3_ERR_REMOVE_HTTP_HEADER; } - if (request) { - rv = http_request_on_header(http, nv, trailers, connect_protocol); - } else { - rv = http_response_on_header(http, nv, trailers); - } + assert(nv->name->len > 0); - if (nv->name->base[0] != ':') { - switch (rv) { - case 0: - case NGHTTP3_ERR_REMOVE_HTTP_HEADER: - http->flags |= NGHTTP3_HTTP_FLAG_PSEUDO_HEADER_DISALLOWED; - break; - } + if (request) { + return http_request_on_header(http, nv, trailers, connect_protocol); } - return rv; + return http_response_on_header(http, nv, trailers); } int nghttp3_http_on_request_headers(nghttp3_http_state *http) { @@ -738,7 +702,7 @@ int nghttp3_http_on_request_headers(nghttp3_http_state *http) { http->content_length = -1; } else { if ((http->flags & NGHTTP3_HTTP_FLAG_REQ_HEADERS) != - NGHTTP3_HTTP_FLAG_REQ_HEADERS || + NGHTTP3_HTTP_FLAG_REQ_HEADERS || (http->flags & (NGHTTP3_HTTP_FLAG__AUTHORITY | NGHTTP3_HTTP_FLAG_HOST)) == 0) { return NGHTTP3_ERR_MALFORMED_HTTP_HEADER; @@ -829,70 +793,58 @@ void nghttp3_http_record_request_method(nghttp3_stream *stream, /* Generated by gennmchartbl.py */ static const int VALID_HD_NAME_CHARS[] = { - 0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */, - 0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */, - 0 /* BS */, 0 /* HT */, 0 /* LF */, 0 /* VT */, - 0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */, - 0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */, - 0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */, - 0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */, - 0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */, - 0 /* SPC */, 1 /* ! */, 0 /* " */, 1 /* # */, - 1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */, - 0 /* ( */, 0 /* ) */, 1 /* * */, 1 /* + */, - 0 /* , */, 1 /* - */, 1 /* . */, 0 /* / */, - 1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */, - 1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */, - 1 /* 8 */, 1 /* 9 */, 0 /* : */, 0 /* ; */, - 0 /* < */, 0 /* = */, 0 /* > */, 0 /* ? */, - 0 /* @ */, 0 /* A */, 0 /* B */, 0 /* C */, - 0 /* D */, 0 /* E */, 0 /* F */, 0 /* G */, - 0 /* H */, 0 /* I */, 0 /* J */, 0 /* K */, - 0 /* L */, 0 /* M */, 0 /* N */, 0 /* O */, - 0 /* P */, 0 /* Q */, 0 /* R */, 0 /* S */, - 0 /* T */, 0 /* U */, 0 /* V */, 0 /* W */, - 0 /* X */, 0 /* Y */, 0 /* Z */, 0 /* [ */, - 0 /* \ */, 0 /* ] */, 1 /* ^ */, 1 /* _ */, - 1 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */, - 1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */, - 1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */, - 1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */, - 1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */, - 1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */, - 1 /* x */, 1 /* y */, 1 /* z */, 0 /* { */, - 1 /* | */, 0 /* } */, 1 /* ~ */, 0 /* DEL */, - 0 /* 0x80 */, 0 /* 0x81 */, 0 /* 0x82 */, 0 /* 0x83 */, - 0 /* 0x84 */, 0 /* 0x85 */, 0 /* 0x86 */, 0 /* 0x87 */, - 0 /* 0x88 */, 0 /* 0x89 */, 0 /* 0x8a */, 0 /* 0x8b */, - 0 /* 0x8c */, 0 /* 0x8d */, 0 /* 0x8e */, 0 /* 0x8f */, - 0 /* 0x90 */, 0 /* 0x91 */, 0 /* 0x92 */, 0 /* 0x93 */, - 0 /* 0x94 */, 0 /* 0x95 */, 0 /* 0x96 */, 0 /* 0x97 */, - 0 /* 0x98 */, 0 /* 0x99 */, 0 /* 0x9a */, 0 /* 0x9b */, - 0 /* 0x9c */, 0 /* 0x9d */, 0 /* 0x9e */, 0 /* 0x9f */, - 0 /* 0xa0 */, 0 /* 0xa1 */, 0 /* 0xa2 */, 0 /* 0xa3 */, - 0 /* 0xa4 */, 0 /* 0xa5 */, 0 /* 0xa6 */, 0 /* 0xa7 */, - 0 /* 0xa8 */, 0 /* 0xa9 */, 0 /* 0xaa */, 0 /* 0xab */, - 0 /* 0xac */, 0 /* 0xad */, 0 /* 0xae */, 0 /* 0xaf */, - 0 /* 0xb0 */, 0 /* 0xb1 */, 0 /* 0xb2 */, 0 /* 0xb3 */, - 0 /* 0xb4 */, 0 /* 0xb5 */, 0 /* 0xb6 */, 0 /* 0xb7 */, - 0 /* 0xb8 */, 0 /* 0xb9 */, 0 /* 0xba */, 0 /* 0xbb */, - 0 /* 0xbc */, 0 /* 0xbd */, 0 /* 0xbe */, 0 /* 0xbf */, - 0 /* 0xc0 */, 0 /* 0xc1 */, 0 /* 0xc2 */, 0 /* 0xc3 */, - 0 /* 0xc4 */, 0 /* 0xc5 */, 0 /* 0xc6 */, 0 /* 0xc7 */, - 0 /* 0xc8 */, 0 /* 0xc9 */, 0 /* 0xca */, 0 /* 0xcb */, - 0 /* 0xcc */, 0 /* 0xcd */, 0 /* 0xce */, 0 /* 0xcf */, - 0 /* 0xd0 */, 0 /* 0xd1 */, 0 /* 0xd2 */, 0 /* 0xd3 */, - 0 /* 0xd4 */, 0 /* 0xd5 */, 0 /* 0xd6 */, 0 /* 0xd7 */, - 0 /* 0xd8 */, 0 /* 0xd9 */, 0 /* 0xda */, 0 /* 0xdb */, - 0 /* 0xdc */, 0 /* 0xdd */, 0 /* 0xde */, 0 /* 0xdf */, - 0 /* 0xe0 */, 0 /* 0xe1 */, 0 /* 0xe2 */, 0 /* 0xe3 */, - 0 /* 0xe4 */, 0 /* 0xe5 */, 0 /* 0xe6 */, 0 /* 0xe7 */, - 0 /* 0xe8 */, 0 /* 0xe9 */, 0 /* 0xea */, 0 /* 0xeb */, - 0 /* 0xec */, 0 /* 0xed */, 0 /* 0xee */, 0 /* 0xef */, - 0 /* 0xf0 */, 0 /* 0xf1 */, 0 /* 0xf2 */, 0 /* 0xf3 */, - 0 /* 0xf4 */, 0 /* 0xf5 */, 0 /* 0xf6 */, 0 /* 0xf7 */, - 0 /* 0xf8 */, 0 /* 0xf9 */, 0 /* 0xfa */, 0 /* 0xfb */, - 0 /* 0xfc */, 0 /* 0xfd */, 0 /* 0xfe */, 0 /* 0xff */ + 0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */, 0 /* EOT */, + 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */, 0 /* BS */, 0 /* HT */, + 0 /* LF */, 0 /* VT */, 0 /* FF */, 0 /* CR */, 0 /* SO */, + 0 /* SI */, 0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */, + 0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */, 0 /* CAN */, + 0 /* EM */, 0 /* SUB */, 0 /* ESC */, 0 /* FS */, 0 /* GS */, + 0 /* RS */, 0 /* US */, 0 /* SPC */, 1 /* ! */, 0 /* " */, + 1 /* # */, 1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */, + 0 /* ( */, 0 /* ) */, 1 /* * */, 1 /* + */, 0 /* , */, + 1 /* - */, 1 /* . */, 0 /* / */, 1 /* 0 */, 1 /* 1 */, + 1 /* 2 */, 1 /* 3 */, 1 /* 4 */, 1 /* 5 */, 1 /* 6 */, + 1 /* 7 */, 1 /* 8 */, 1 /* 9 */, 0 /* : */, 0 /* ; */, + 0 /* < */, 0 /* = */, 0 /* > */, 0 /* ? */, 0 /* @ */, + -1 /* A */, -1 /* B */, -1 /* C */, -1 /* D */, -1 /* E */, + -1 /* F */, -1 /* G */, -1 /* H */, -1 /* I */, -1 /* J */, + -1 /* K */, -1 /* L */, -1 /* M */, -1 /* N */, -1 /* O */, + -1 /* P */, -1 /* Q */, -1 /* R */, -1 /* S */, -1 /* T */, + -1 /* U */, -1 /* V */, -1 /* W */, -1 /* X */, -1 /* Y */, + -1 /* Z */, 0 /* [ */, 0 /* \ */, 0 /* ] */, 1 /* ^ */, + 1 /* _ */, 1 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */, + 1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */, 1 /* h */, + 1 /* i */, 1 /* j */, 1 /* k */, 1 /* l */, 1 /* m */, + 1 /* n */, 1 /* o */, 1 /* p */, 1 /* q */, 1 /* r */, + 1 /* s */, 1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */, + 1 /* x */, 1 /* y */, 1 /* z */, 0 /* { */, 1 /* | */, + 0 /* } */, 1 /* ~ */, 0 /* DEL */, 0 /* 0x80 */, 0 /* 0x81 */, + 0 /* 0x82 */, 0 /* 0x83 */, 0 /* 0x84 */, 0 /* 0x85 */, 0 /* 0x86 */, + 0 /* 0x87 */, 0 /* 0x88 */, 0 /* 0x89 */, 0 /* 0x8a */, 0 /* 0x8b */, + 0 /* 0x8c */, 0 /* 0x8d */, 0 /* 0x8e */, 0 /* 0x8f */, 0 /* 0x90 */, + 0 /* 0x91 */, 0 /* 0x92 */, 0 /* 0x93 */, 0 /* 0x94 */, 0 /* 0x95 */, + 0 /* 0x96 */, 0 /* 0x97 */, 0 /* 0x98 */, 0 /* 0x99 */, 0 /* 0x9a */, + 0 /* 0x9b */, 0 /* 0x9c */, 0 /* 0x9d */, 0 /* 0x9e */, 0 /* 0x9f */, + 0 /* 0xa0 */, 0 /* 0xa1 */, 0 /* 0xa2 */, 0 /* 0xa3 */, 0 /* 0xa4 */, + 0 /* 0xa5 */, 0 /* 0xa6 */, 0 /* 0xa7 */, 0 /* 0xa8 */, 0 /* 0xa9 */, + 0 /* 0xaa */, 0 /* 0xab */, 0 /* 0xac */, 0 /* 0xad */, 0 /* 0xae */, + 0 /* 0xaf */, 0 /* 0xb0 */, 0 /* 0xb1 */, 0 /* 0xb2 */, 0 /* 0xb3 */, + 0 /* 0xb4 */, 0 /* 0xb5 */, 0 /* 0xb6 */, 0 /* 0xb7 */, 0 /* 0xb8 */, + 0 /* 0xb9 */, 0 /* 0xba */, 0 /* 0xbb */, 0 /* 0xbc */, 0 /* 0xbd */, + 0 /* 0xbe */, 0 /* 0xbf */, 0 /* 0xc0 */, 0 /* 0xc1 */, 0 /* 0xc2 */, + 0 /* 0xc3 */, 0 /* 0xc4 */, 0 /* 0xc5 */, 0 /* 0xc6 */, 0 /* 0xc7 */, + 0 /* 0xc8 */, 0 /* 0xc9 */, 0 /* 0xca */, 0 /* 0xcb */, 0 /* 0xcc */, + 0 /* 0xcd */, 0 /* 0xce */, 0 /* 0xcf */, 0 /* 0xd0 */, 0 /* 0xd1 */, + 0 /* 0xd2 */, 0 /* 0xd3 */, 0 /* 0xd4 */, 0 /* 0xd5 */, 0 /* 0xd6 */, + 0 /* 0xd7 */, 0 /* 0xd8 */, 0 /* 0xd9 */, 0 /* 0xda */, 0 /* 0xdb */, + 0 /* 0xdc */, 0 /* 0xdd */, 0 /* 0xde */, 0 /* 0xdf */, 0 /* 0xe0 */, + 0 /* 0xe1 */, 0 /* 0xe2 */, 0 /* 0xe3 */, 0 /* 0xe4 */, 0 /* 0xe5 */, + 0 /* 0xe6 */, 0 /* 0xe7 */, 0 /* 0xe8 */, 0 /* 0xe9 */, 0 /* 0xea */, + 0 /* 0xeb */, 0 /* 0xec */, 0 /* 0xed */, 0 /* 0xee */, 0 /* 0xef */, + 0 /* 0xf0 */, 0 /* 0xf1 */, 0 /* 0xf2 */, 0 /* 0xf3 */, 0 /* 0xf4 */, + 0 /* 0xf5 */, 0 /* 0xf6 */, 0 /* 0xf7 */, 0 /* 0xf8 */, 0 /* 0xf9 */, + 0 /* 0xfa */, 0 /* 0xfb */, 0 /* 0xfc */, 0 /* 0xfd */, 0 /* 0xfe */, + 0 /* 0xff */, }; int nghttp3_check_header_name(const uint8_t *name, size_t len) { @@ -915,76 +867,125 @@ int nghttp3_check_header_name(const uint8_t *name, size_t len) { return 1; } +/* http_check_nonempty_header_name validates regular header name + pointed by |name| of length |len|. |len| must be greater than + zero. This function returns 1 if it succeeds, or -1 if the name + contains a character in [A-Z], otherwise 0. */ +static int http_check_nonempty_header_name(const uint8_t *name, size_t len) { + const uint8_t *last; + int rv; + + for (last = name + len; name != last; ++name) { + rv = VALID_HD_NAME_CHARS[*name]; + if (rv != 1) { + return rv; + } + } + + return 1; +} + /* Generated by genvchartbl.py */ static const int VALID_HD_VALUE_CHARS[] = { - 0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */, - 0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */, - 0 /* BS */, 1 /* HT */, 0 /* LF */, 0 /* VT */, - 0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */, - 0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */, - 0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */, - 0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */, - 0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */, - 1 /* SPC */, 1 /* ! */, 1 /* " */, 1 /* # */, - 1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */, - 1 /* ( */, 1 /* ) */, 1 /* * */, 1 /* + */, - 1 /* , */, 1 /* - */, 1 /* . */, 1 /* / */, - 1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */, - 1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */, - 1 /* 8 */, 1 /* 9 */, 1 /* : */, 1 /* ; */, - 1 /* < */, 1 /* = */, 1 /* > */, 1 /* ? */, - 1 /* @ */, 1 /* A */, 1 /* B */, 1 /* C */, - 1 /* D */, 1 /* E */, 1 /* F */, 1 /* G */, - 1 /* H */, 1 /* I */, 1 /* J */, 1 /* K */, - 1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */, - 1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */, - 1 /* T */, 1 /* U */, 1 /* V */, 1 /* W */, - 1 /* X */, 1 /* Y */, 1 /* Z */, 1 /* [ */, - 1 /* \ */, 1 /* ] */, 1 /* ^ */, 1 /* _ */, - 1 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */, - 1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */, - 1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */, - 1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */, - 1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */, - 1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */, - 1 /* x */, 1 /* y */, 1 /* z */, 1 /* { */, - 1 /* | */, 1 /* } */, 1 /* ~ */, 0 /* DEL */, - 1 /* 0x80 */, 1 /* 0x81 */, 1 /* 0x82 */, 1 /* 0x83 */, - 1 /* 0x84 */, 1 /* 0x85 */, 1 /* 0x86 */, 1 /* 0x87 */, - 1 /* 0x88 */, 1 /* 0x89 */, 1 /* 0x8a */, 1 /* 0x8b */, - 1 /* 0x8c */, 1 /* 0x8d */, 1 /* 0x8e */, 1 /* 0x8f */, - 1 /* 0x90 */, 1 /* 0x91 */, 1 /* 0x92 */, 1 /* 0x93 */, - 1 /* 0x94 */, 1 /* 0x95 */, 1 /* 0x96 */, 1 /* 0x97 */, - 1 /* 0x98 */, 1 /* 0x99 */, 1 /* 0x9a */, 1 /* 0x9b */, - 1 /* 0x9c */, 1 /* 0x9d */, 1 /* 0x9e */, 1 /* 0x9f */, - 1 /* 0xa0 */, 1 /* 0xa1 */, 1 /* 0xa2 */, 1 /* 0xa3 */, - 1 /* 0xa4 */, 1 /* 0xa5 */, 1 /* 0xa6 */, 1 /* 0xa7 */, - 1 /* 0xa8 */, 1 /* 0xa9 */, 1 /* 0xaa */, 1 /* 0xab */, - 1 /* 0xac */, 1 /* 0xad */, 1 /* 0xae */, 1 /* 0xaf */, - 1 /* 0xb0 */, 1 /* 0xb1 */, 1 /* 0xb2 */, 1 /* 0xb3 */, - 1 /* 0xb4 */, 1 /* 0xb5 */, 1 /* 0xb6 */, 1 /* 0xb7 */, - 1 /* 0xb8 */, 1 /* 0xb9 */, 1 /* 0xba */, 1 /* 0xbb */, - 1 /* 0xbc */, 1 /* 0xbd */, 1 /* 0xbe */, 1 /* 0xbf */, - 1 /* 0xc0 */, 1 /* 0xc1 */, 1 /* 0xc2 */, 1 /* 0xc3 */, - 1 /* 0xc4 */, 1 /* 0xc5 */, 1 /* 0xc6 */, 1 /* 0xc7 */, - 1 /* 0xc8 */, 1 /* 0xc9 */, 1 /* 0xca */, 1 /* 0xcb */, - 1 /* 0xcc */, 1 /* 0xcd */, 1 /* 0xce */, 1 /* 0xcf */, - 1 /* 0xd0 */, 1 /* 0xd1 */, 1 /* 0xd2 */, 1 /* 0xd3 */, - 1 /* 0xd4 */, 1 /* 0xd5 */, 1 /* 0xd6 */, 1 /* 0xd7 */, - 1 /* 0xd8 */, 1 /* 0xd9 */, 1 /* 0xda */, 1 /* 0xdb */, - 1 /* 0xdc */, 1 /* 0xdd */, 1 /* 0xde */, 1 /* 0xdf */, - 1 /* 0xe0 */, 1 /* 0xe1 */, 1 /* 0xe2 */, 1 /* 0xe3 */, - 1 /* 0xe4 */, 1 /* 0xe5 */, 1 /* 0xe6 */, 1 /* 0xe7 */, - 1 /* 0xe8 */, 1 /* 0xe9 */, 1 /* 0xea */, 1 /* 0xeb */, - 1 /* 0xec */, 1 /* 0xed */, 1 /* 0xee */, 1 /* 0xef */, - 1 /* 0xf0 */, 1 /* 0xf1 */, 1 /* 0xf2 */, 1 /* 0xf3 */, - 1 /* 0xf4 */, 1 /* 0xf5 */, 1 /* 0xf6 */, 1 /* 0xf7 */, - 1 /* 0xf8 */, 1 /* 0xf9 */, 1 /* 0xfa */, 1 /* 0xfb */, - 1 /* 0xfc */, 1 /* 0xfd */, 1 /* 0xfe */, 1 /* 0xff */ + 0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */, + 0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */, + 0 /* BS */, 1 /* HT */, 0 /* LF */, 0 /* VT */, + 0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */, + 0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */, + 0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */, + 0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */, + 0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */, + 1 /* SPC */, 1 /* ! */, 1 /* " */, 1 /* # */, + 1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */, + 1 /* ( */, 1 /* ) */, 1 /* * */, 1 /* + */, + 1 /* , */, 1 /* - */, 1 /* . */, 1 /* / */, + 1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */, + 1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */, + 1 /* 8 */, 1 /* 9 */, 1 /* : */, 1 /* ; */, + 1 /* < */, 1 /* = */, 1 /* > */, 1 /* ? */, + 1 /* @ */, 1 /* A */, 1 /* B */, 1 /* C */, + 1 /* D */, 1 /* E */, 1 /* F */, 1 /* G */, + 1 /* H */, 1 /* I */, 1 /* J */, 1 /* K */, + 1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */, + 1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */, + 1 /* T */, 1 /* U */, 1 /* V */, 1 /* W */, + 1 /* X */, 1 /* Y */, 1 /* Z */, 1 /* [ */, + 1 /* \ */, 1 /* ] */, 1 /* ^ */, 1 /* _ */, + 1 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */, + 1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */, + 1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */, + 1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */, + 1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */, + 1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */, + 1 /* x */, 1 /* y */, 1 /* z */, 1 /* { */, + 1 /* | */, 1 /* } */, 1 /* ~ */, 0 /* DEL */, + 1 /* 0x80 */, 1 /* 0x81 */, 1 /* 0x82 */, 1 /* 0x83 */, + 1 /* 0x84 */, 1 /* 0x85 */, 1 /* 0x86 */, 1 /* 0x87 */, + 1 /* 0x88 */, 1 /* 0x89 */, 1 /* 0x8a */, 1 /* 0x8b */, + 1 /* 0x8c */, 1 /* 0x8d */, 1 /* 0x8e */, 1 /* 0x8f */, + 1 /* 0x90 */, 1 /* 0x91 */, 1 /* 0x92 */, 1 /* 0x93 */, + 1 /* 0x94 */, 1 /* 0x95 */, 1 /* 0x96 */, 1 /* 0x97 */, + 1 /* 0x98 */, 1 /* 0x99 */, 1 /* 0x9a */, 1 /* 0x9b */, + 1 /* 0x9c */, 1 /* 0x9d */, 1 /* 0x9e */, 1 /* 0x9f */, + 1 /* 0xa0 */, 1 /* 0xa1 */, 1 /* 0xa2 */, 1 /* 0xa3 */, + 1 /* 0xa4 */, 1 /* 0xa5 */, 1 /* 0xa6 */, 1 /* 0xa7 */, + 1 /* 0xa8 */, 1 /* 0xa9 */, 1 /* 0xaa */, 1 /* 0xab */, + 1 /* 0xac */, 1 /* 0xad */, 1 /* 0xae */, 1 /* 0xaf */, + 1 /* 0xb0 */, 1 /* 0xb1 */, 1 /* 0xb2 */, 1 /* 0xb3 */, + 1 /* 0xb4 */, 1 /* 0xb5 */, 1 /* 0xb6 */, 1 /* 0xb7 */, + 1 /* 0xb8 */, 1 /* 0xb9 */, 1 /* 0xba */, 1 /* 0xbb */, + 1 /* 0xbc */, 1 /* 0xbd */, 1 /* 0xbe */, 1 /* 0xbf */, + 1 /* 0xc0 */, 1 /* 0xc1 */, 1 /* 0xc2 */, 1 /* 0xc3 */, + 1 /* 0xc4 */, 1 /* 0xc5 */, 1 /* 0xc6 */, 1 /* 0xc7 */, + 1 /* 0xc8 */, 1 /* 0xc9 */, 1 /* 0xca */, 1 /* 0xcb */, + 1 /* 0xcc */, 1 /* 0xcd */, 1 /* 0xce */, 1 /* 0xcf */, + 1 /* 0xd0 */, 1 /* 0xd1 */, 1 /* 0xd2 */, 1 /* 0xd3 */, + 1 /* 0xd4 */, 1 /* 0xd5 */, 1 /* 0xd6 */, 1 /* 0xd7 */, + 1 /* 0xd8 */, 1 /* 0xd9 */, 1 /* 0xda */, 1 /* 0xdb */, + 1 /* 0xdc */, 1 /* 0xdd */, 1 /* 0xde */, 1 /* 0xdf */, + 1 /* 0xe0 */, 1 /* 0xe1 */, 1 /* 0xe2 */, 1 /* 0xe3 */, + 1 /* 0xe4 */, 1 /* 0xe5 */, 1 /* 0xe6 */, 1 /* 0xe7 */, + 1 /* 0xe8 */, 1 /* 0xe9 */, 1 /* 0xea */, 1 /* 0xeb */, + 1 /* 0xec */, 1 /* 0xed */, 1 /* 0xee */, 1 /* 0xef */, + 1 /* 0xf0 */, 1 /* 0xf1 */, 1 /* 0xf2 */, 1 /* 0xf3 */, + 1 /* 0xf4 */, 1 /* 0xf5 */, 1 /* 0xf6 */, 1 /* 0xf7 */, + 1 /* 0xf8 */, 1 /* 0xf9 */, 1 /* 0xfa */, 1 /* 0xfb */, + 1 /* 0xfc */, 1 /* 0xfd */, 1 /* 0xfe */, 1 /* 0xff */ }; +#ifdef __AVX2__ +static int contains_bad_header_value_char_avx2(const uint8_t *first, + const uint8_t *last) { + const __m256i ctll = _mm256_set1_epi8(0x00 - 1); + const __m256i ctlr = _mm256_set1_epi8(0x1f + 1); + const __m256i ht = _mm256_set1_epi8('\t'); + const __m256i del = _mm256_set1_epi8(0x7f); + __m256i s, x; + uint32_t m; + + for (; first != last; first += 32) { + s = _mm256_loadu_si256((void *)first); + + x = _mm256_andnot_si256( + _mm256_cmpeq_epi8(s, ht), + _mm256_and_si256(_mm256_cmpgt_epi8(s, ctll), _mm256_cmpgt_epi8(ctlr, s))); + x = _mm256_or_si256(_mm256_cmpeq_epi8(s, del), x); + + m = (uint32_t)_mm256_movemask_epi8(x); + if (m) { + return 1; + } + } + + return 0; +} +#endif /* __AVX2__ */ + int nghttp3_check_header_value(const uint8_t *value, size_t len) { const uint8_t *last; +#ifdef __AVX2__ + const uint8_t *last32; +#endif /* __AVX2__ */ switch (len) { case 0: @@ -997,7 +998,20 @@ int nghttp3_check_header_value(const uint8_t *value, size_t len) { } } - for (last = value + len; value != last; ++value) { + last = value + len; + +#ifdef __AVX2__ + if (len >= 32) { + last32 = value + (len & ~0x1fu); + if (contains_bad_header_value_char_avx2(value, last32)) { + return 0; + } + + value = last32; + } +#endif /* __AVX2__ */ + + for (; value != last; ++value) { if (!VALID_HD_VALUE_CHARS[*value]) { return 0; } diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_http.h b/deps/ngtcp2/nghttp3/lib/nghttp3_http.h index 575d9c267e1b68..f0bfc69fbade75 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_http.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_http.h @@ -28,7 +28,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -170,4 +170,4 @@ int nghttp3_http_parse_priority(nghttp3_pri *dest, const uint8_t *value, int nghttp3_pri_eq(const nghttp3_pri *a, const nghttp3_pri *b); -#endif /* NGHTTP3_HTTP_H */ +#endif /* !defined(NGHTTP3_HTTP_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_idtr.c b/deps/ngtcp2/nghttp3/lib/nghttp3_idtr.c index dc34841fe0f8ef..ffed3064d2b791 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_idtr.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_idtr.c @@ -27,10 +27,8 @@ #include -void nghttp3_idtr_init(nghttp3_idtr *idtr, int server, const nghttp3_mem *mem) { +void nghttp3_idtr_init(nghttp3_idtr *idtr, const nghttp3_mem *mem) { nghttp3_gaptr_init(&idtr->gap, mem); - - idtr->server = server; } void nghttp3_idtr_free(nghttp3_idtr *idtr) { @@ -42,8 +40,7 @@ void nghttp3_idtr_free(nghttp3_idtr *idtr) { } /* - * id_from_stream_id translates |stream_id| to id space used by - * nghttp3_idtr. + * id_from_stream_id translates |stream_id| to an internal ID. */ static uint64_t id_from_stream_id(int64_t stream_id) { return (uint64_t)(stream_id >> 2); @@ -52,9 +49,6 @@ static uint64_t id_from_stream_id(int64_t stream_id) { int nghttp3_idtr_open(nghttp3_idtr *idtr, int64_t stream_id) { uint64_t q; - assert((idtr->server && (stream_id % 2)) || - (!idtr->server && (stream_id % 2)) == 0); - q = id_from_stream_id(stream_id); if (nghttp3_gaptr_is_pushed(&idtr->gap, q, 1)) { @@ -67,14 +61,7 @@ int nghttp3_idtr_open(nghttp3_idtr *idtr, int64_t stream_id) { int nghttp3_idtr_is_open(nghttp3_idtr *idtr, int64_t stream_id) { uint64_t q; - assert((idtr->server && (stream_id % 2)) || - (!idtr->server && (stream_id % 2)) == 0); - q = id_from_stream_id(stream_id); return nghttp3_gaptr_is_pushed(&idtr->gap, q, 1); } - -uint64_t nghttp3_idtr_first_gap(nghttp3_idtr *idtr) { - return nghttp3_gaptr_first_gap_offset(&idtr->gap); -} diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_idtr.h b/deps/ngtcp2/nghttp3/lib/nghttp3_idtr.h index ea3346c9a964c4..8ba15fc810cdcb 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_idtr.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_idtr.h @@ -28,7 +28,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -39,21 +39,17 @@ * nghttp3_idtr tracks the usage of stream ID. */ typedef struct nghttp3_idtr { - /* gap maintains the range of ID which is not used yet. Initially, - its range is [0, UINT64_MAX). */ + /* gap maintains the range of an internal ID which is not used yet. + Initially, its range is [0, UINT64_MAX). The internal ID and + stream ID are in the different number spaces. See + id_from_stream_id to convert a stream ID to an internal ID. */ nghttp3_gaptr gap; - /* server is nonzero if this object records server initiated stream - ID. */ - int server; } nghttp3_idtr; /* * nghttp3_idtr_init initializes |idtr|. - * - * If this object records server initiated ID (even number), set - * |server| to nonzero. */ -void nghttp3_idtr_init(nghttp3_idtr *idtr, int server, const nghttp3_mem *mem); +void nghttp3_idtr_init(nghttp3_idtr *idtr, const nghttp3_mem *mem); /* * nghttp3_idtr_free frees resources allocated for |idtr|. @@ -61,30 +57,21 @@ void nghttp3_idtr_init(nghttp3_idtr *idtr, int server, const nghttp3_mem *mem); void nghttp3_idtr_free(nghttp3_idtr *idtr); /* - * nghttp3_idtr_open claims that |stream_id| is in used. + * nghttp3_idtr_open claims that |stream_id| is in use. * * It returns 0 if it succeeds, or one of the following negative error * codes: * * NGHTTP3_ERR_STREAM_IN_USE - * ID has already been used. + * |stream_id| has already been used. * NGHTTP3_ERR_NOMEM * Out of memory. */ int nghttp3_idtr_open(nghttp3_idtr *idtr, int64_t stream_id); /* - * nghttp3_idtr_open tells whether ID |stream_id| is in used or not. - * - * It returns nonzero if |stream_id| is used. + * nghttp3_idtr_open returns nonzero if |stream_id| is in use. */ int nghttp3_idtr_is_open(nghttp3_idtr *idtr, int64_t stream_id); -/* - * nghttp3_idtr_first_gap returns the first id of first gap. If there - * is no gap, it returns UINT64_MAX. The returned id is an id space - * used in this object internally, and not stream ID. - */ -uint64_t nghttp3_idtr_first_gap(nghttp3_idtr *idtr); - -#endif /* NGHTTP3_IDTR_H */ +#endif /* !defined(NGHTTP3_IDTR_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_ksl.c b/deps/ngtcp2/nghttp3/lib/nghttp3_ksl.c index d7420a5d8a1e5d..a3b5fbcb05f4f3 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_ksl.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_ksl.c @@ -39,8 +39,10 @@ static nghttp3_ksl_blk null_blk = {{{NULL, NULL, 0, 0, {0}}}}; nghttp3_objalloc_def(ksl_blk, nghttp3_ksl_blk, oplent); static size_t ksl_nodelen(size_t keylen) { - return (sizeof(nghttp3_ksl_node) + keylen - sizeof(uint64_t) + 0xfu) & - ~(uintptr_t)0xfu; + assert(keylen >= sizeof(uint64_t)); + + return (sizeof(nghttp3_ksl_node) + keylen - sizeof(uint64_t) + 0x7u) & + ~(uintptr_t)0x7u; } static size_t ksl_blklen(size_t nodelen) { @@ -61,15 +63,14 @@ void nghttp3_ksl_init(nghttp3_ksl *ksl, nghttp3_ksl_compar compar, size_t nodelen = ksl_nodelen(keylen); nghttp3_objalloc_init(&ksl->blkalloc, - ((ksl_blklen(nodelen) + 0xfu) & ~(uintptr_t)0xfu) * 8, - mem); + (ksl_blklen(nodelen) + 0xfu) & ~(uintptr_t)0xfu, mem); ksl->head = NULL; ksl->front = ksl->back = NULL; ksl->compar = compar; + ksl->n = 0; ksl->keylen = keylen; ksl->nodelen = nodelen; - ksl->n = 0; } static nghttp3_ksl_blk *ksl_blk_objalloc_new(nghttp3_ksl *ksl) { @@ -83,6 +84,7 @@ static void ksl_blk_objalloc_del(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk) { static int ksl_head_init(nghttp3_ksl *ksl) { nghttp3_ksl_blk *head = ksl_blk_objalloc_new(ksl); + if (!head) { return NGHTTP3_ERR_NOMEM; } @@ -112,7 +114,7 @@ static void ksl_free_blk(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk) { ksl_blk_objalloc_del(ksl, blk); } -#endif /* NOMEMPOOL */ +#endif /* defined(NOMEMPOOL) */ void nghttp3_ksl_free(nghttp3_ksl *ksl) { if (!ksl || !ksl->head) { @@ -121,7 +123,7 @@ void nghttp3_ksl_free(nghttp3_ksl *ksl) { #ifdef NOMEMPOOL ksl_free_blk(ksl, ksl->head); -#endif /* NOMEMPOOL */ +#endif /* defined(NOMEMPOOL) */ nghttp3_objalloc_free(&ksl->blkalloc); } @@ -144,21 +146,22 @@ static nghttp3_ksl_blk *ksl_split_blk(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk) { rblk->next = blk->next; blk->next = rblk; + if (rblk->next) { rblk->next->prev = rblk; } else if (ksl->back == blk) { ksl->back = rblk; } + rblk->prev = blk; rblk->leaf = blk->leaf; rblk->n = blk->n / 2; + blk->n -= rblk->n; - memcpy(rblk->nodes, blk->nodes + ksl->nodelen * (blk->n - rblk->n), + memcpy(rblk->nodes, blk->nodes + ksl->nodelen * blk->n, ksl->nodelen * rblk->n); - blk->n -= rblk->n; - assert(blk->n >= NGHTTP3_KSL_MIN_NBLK); assert(rblk->n >= NGHTTP3_KSL_MIN_NBLK); @@ -174,7 +177,7 @@ static nghttp3_ksl_blk *ksl_split_blk(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk) { * codes: * * NGHTTP3_ERR_NOMEM - * Out of memory. + * Out of memory. */ static int ksl_split_node(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, size_t i) { nghttp3_ksl_node *node; @@ -210,7 +213,7 @@ static int ksl_split_node(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, size_t i) { * codes: * * NGHTTP3_ERR_NOMEM - * Out of memory. + * Out of memory. */ static int ksl_split_head(nghttp3_ksl *ksl) { nghttp3_ksl_blk *rblk = NULL, *lblk, *nhead = NULL; @@ -224,10 +227,12 @@ static int ksl_split_head(nghttp3_ksl *ksl) { lblk = ksl->head; nhead = ksl_blk_objalloc_new(ksl); + if (nhead == NULL) { ksl_blk_objalloc_del(ksl, rblk); return NGHTTP3_ERR_NOMEM; } + nhead->next = nhead->prev = NULL; nhead->n = 2; nhead->leaf = 0; @@ -248,9 +253,9 @@ static int ksl_split_head(nghttp3_ksl *ksl) { } /* - * insert_node inserts a node whose key is |key| with the associated - * |data| at the index of |i|. This function assumes that the number - * of nodes contained by |blk| is strictly less than + * ksl_insert_node inserts a node whose key is |key| with the + * associated |data| at the index of |i|. This function assumes that + * the number of nodes contained by |blk| is strictly less than * NGHTTP3_KSL_MAX_NBLK. */ static void ksl_insert_node(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, size_t i, @@ -269,9 +274,9 @@ static void ksl_insert_node(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, size_t i, ++blk->n; } -static size_t ksl_bsearch(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, - const nghttp3_ksl_key *key, - nghttp3_ksl_compar compar) { +static size_t ksl_search(const nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, + const nghttp3_ksl_key *key, + nghttp3_ksl_compar compar) { size_t i; nghttp3_ksl_node *node; @@ -297,18 +302,17 @@ int nghttp3_ksl_insert(nghttp3_ksl *ksl, nghttp3_ksl_it *it, } } - blk = ksl->head; - - if (blk->n == NGHTTP3_KSL_MAX_NBLK) { + if (ksl->head->n == NGHTTP3_KSL_MAX_NBLK) { rv = ksl_split_head(ksl); if (rv != 0) { return rv; } - blk = ksl->head; } + blk = ksl->head; + for (;;) { - i = ksl_bsearch(ksl, blk, key, ksl->compar); + i = ksl_search(ksl, blk, key, ksl->compar); if (blk->leaf) { if (i < blk->n && @@ -316,13 +320,17 @@ int nghttp3_ksl_insert(nghttp3_ksl *ksl, nghttp3_ksl_it *it, if (it) { *it = nghttp3_ksl_end(ksl); } + return NGHTTP3_ERR_INVALID_ARGUMENT; } + ksl_insert_node(ksl, blk, i, key, data); ++ksl->n; + if (it) { nghttp3_ksl_it_init(it, ksl, blk, i); } + return 0; } @@ -335,16 +343,21 @@ int nghttp3_ksl_insert(nghttp3_ksl *ksl, nghttp3_ksl_it *it, if (rv != 0) { return rv; } + node = nghttp3_ksl_nth_node(ksl, blk, blk->n - 1); } + ksl_node_set_key(ksl, node, key); blk = node->blk; } + ksl_insert_node(ksl, blk, blk->n, key, data); ++ksl->n; + if (it) { nghttp3_ksl_it_init(it, ksl, blk, blk->n - 1); } + return 0; } @@ -355,8 +368,10 @@ int nghttp3_ksl_insert(nghttp3_ksl *ksl, nghttp3_ksl_it *it, if (rv != 0) { return rv; } + if (ksl->compar((nghttp3_ksl_key *)node->key, key)) { node = nghttp3_ksl_nth_node(ksl, blk, i + 1); + if (ksl->compar((nghttp3_ksl_key *)node->key, key)) { ksl_node_set_key(ksl, node, key); } @@ -382,19 +397,22 @@ static void ksl_remove_node(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, size_t i) { * ksl_merge_node merges 2 nodes which are the nodes at the index of * |i| and |i + 1|. * - * If |blk| is the direct descendant of head (root) block and the head - * block contains just 2 nodes, the merged block becomes head block, - * which decreases the height of |ksl| by 1. + * If |blk| is the head (root) block and it contains just 2 nodes + * before merging nodes, the merged block becomes head block, which + * decreases the height of |ksl| by 1. * * This function returns the pointer to the merged block. */ static nghttp3_ksl_blk *ksl_merge_node(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, size_t i) { + nghttp3_ksl_node *lnode; nghttp3_ksl_blk *lblk, *rblk; assert(i + 1 < blk->n); - lblk = nghttp3_ksl_nth_node(ksl, blk, i)->blk; + lnode = nghttp3_ksl_nth_node(ksl, blk, i); + + lblk = lnode->blk; rblk = nghttp3_ksl_nth_node(ksl, blk, i + 1)->blk; assert(lblk->n + rblk->n < NGHTTP3_KSL_MAX_NBLK); @@ -404,6 +422,7 @@ static nghttp3_ksl_blk *ksl_merge_node(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, lblk->n += rblk->n; lblk->next = rblk->next; + if (lblk->next) { lblk->next->prev = lblk; } else if (ksl->back == rblk) { @@ -417,7 +436,7 @@ static nghttp3_ksl_blk *ksl_merge_node(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, ksl->head = lblk; } else { ksl_remove_node(ksl, blk, i + 1); - ksl_node_set_key(ksl, nghttp3_ksl_nth_node(ksl, blk, i), + ksl_node_set_key(ksl, lnode, nghttp3_ksl_nth_node(ksl, lblk, lblk->n - 1)->key); } @@ -431,6 +450,7 @@ static nghttp3_ksl_blk *ksl_merge_node(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, */ static void ksl_shift_left(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, size_t i) { nghttp3_ksl_node *lnode, *rnode; + nghttp3_ksl_blk *lblk, *rblk; size_t n; assert(i > 0); @@ -438,36 +458,37 @@ static void ksl_shift_left(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, size_t i) { lnode = nghttp3_ksl_nth_node(ksl, blk, i - 1); rnode = nghttp3_ksl_nth_node(ksl, blk, i); - assert(lnode->blk->n < NGHTTP3_KSL_MAX_NBLK); - assert(rnode->blk->n > NGHTTP3_KSL_MIN_NBLK); + lblk = lnode->blk; + rblk = rnode->blk; + + assert(lblk->n < NGHTTP3_KSL_MAX_NBLK); + assert(rblk->n > NGHTTP3_KSL_MIN_NBLK); - n = (lnode->blk->n + rnode->blk->n + 1) / 2 - lnode->blk->n; + n = (lblk->n + rblk->n + 1) / 2 - lblk->n; assert(n > 0); - assert(lnode->blk->n <= NGHTTP3_KSL_MAX_NBLK - n); - assert(rnode->blk->n >= NGHTTP3_KSL_MIN_NBLK + n); + assert(lblk->n <= NGHTTP3_KSL_MAX_NBLK - n); + assert(rblk->n >= NGHTTP3_KSL_MIN_NBLK + n); - memcpy(lnode->blk->nodes + ksl->nodelen * lnode->blk->n, rnode->blk->nodes, - ksl->nodelen * n); + memcpy(lblk->nodes + ksl->nodelen * lblk->n, rblk->nodes, ksl->nodelen * n); - lnode->blk->n += (uint32_t)n; - rnode->blk->n -= (uint32_t)n; + lblk->n += (uint32_t)n; + rblk->n -= (uint32_t)n; - ksl_node_set_key( - ksl, lnode, - nghttp3_ksl_nth_node(ksl, lnode->blk, lnode->blk->n - 1)->key); + ksl_node_set_key(ksl, lnode, + nghttp3_ksl_nth_node(ksl, lblk, lblk->n - 1)->key); - memmove(rnode->blk->nodes, rnode->blk->nodes + ksl->nodelen * n, - ksl->nodelen * rnode->blk->n); + memmove(rblk->nodes, rblk->nodes + ksl->nodelen * n, ksl->nodelen * rblk->n); } /* * ksl_shift_right moves the last nodes in blk->nodes[i]->blk->nodes * to blk->nodes[i + 1]->blk->nodes in a manner that they have the - * same amount of nodes as much as possible.. + * same amount of nodes as much as possible. */ static void ksl_shift_right(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, size_t i) { nghttp3_ksl_node *lnode, *rnode; + nghttp3_ksl_blk *lblk, *rblk; size_t n; assert(i < blk->n - 1); @@ -475,27 +496,27 @@ static void ksl_shift_right(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, size_t i) { lnode = nghttp3_ksl_nth_node(ksl, blk, i); rnode = nghttp3_ksl_nth_node(ksl, blk, i + 1); - assert(lnode->blk->n > NGHTTP3_KSL_MIN_NBLK); - assert(rnode->blk->n < NGHTTP3_KSL_MAX_NBLK); + lblk = lnode->blk; + rblk = rnode->blk; - n = (lnode->blk->n + rnode->blk->n + 1) / 2 - rnode->blk->n; + assert(lblk->n > NGHTTP3_KSL_MIN_NBLK); + assert(rblk->n < NGHTTP3_KSL_MAX_NBLK); + + n = (lblk->n + rblk->n + 1) / 2 - rblk->n; assert(n > 0); - assert(lnode->blk->n >= NGHTTP3_KSL_MIN_NBLK + n); - assert(rnode->blk->n <= NGHTTP3_KSL_MAX_NBLK - n); + assert(lblk->n >= NGHTTP3_KSL_MIN_NBLK + n); + assert(rblk->n <= NGHTTP3_KSL_MAX_NBLK - n); - memmove(rnode->blk->nodes + ksl->nodelen * n, rnode->blk->nodes, - ksl->nodelen * rnode->blk->n); + memmove(rblk->nodes + ksl->nodelen * n, rblk->nodes, ksl->nodelen * rblk->n); - rnode->blk->n += (uint32_t)n; - lnode->blk->n -= (uint32_t)n; + rblk->n += (uint32_t)n; + lblk->n -= (uint32_t)n; - memcpy(rnode->blk->nodes, lnode->blk->nodes + ksl->nodelen * lnode->blk->n, - ksl->nodelen * n); + memcpy(rblk->nodes, lblk->nodes + ksl->nodelen * lblk->n, ksl->nodelen * n); - ksl_node_set_key( - ksl, lnode, - nghttp3_ksl_nth_node(ksl, lnode->blk, lnode->blk->n - 1)->key); + ksl_node_set_key(ksl, lnode, + nghttp3_ksl_nth_node(ksl, lblk, lblk->n - 1)->key); } /* @@ -539,23 +560,24 @@ int nghttp3_ksl_remove(nghttp3_ksl *ksl, nghttp3_ksl_it *it, nghttp3_ksl_node *node; size_t i; - if (!ksl->head) { + if (!blk) { return NGHTTP3_ERR_INVALID_ARGUMENT; } if (!blk->leaf && blk->n == 2 && nghttp3_ksl_nth_node(ksl, blk, 0)->blk->n == NGHTTP3_KSL_MIN_NBLK && nghttp3_ksl_nth_node(ksl, blk, 1)->blk->n == NGHTTP3_KSL_MIN_NBLK) { - blk = ksl_merge_node(ksl, ksl->head, 0); + blk = ksl_merge_node(ksl, blk, 0); } for (;;) { - i = ksl_bsearch(ksl, blk, key, ksl->compar); + i = ksl_search(ksl, blk, key, ksl->compar); if (i == blk->n) { if (it) { *it = nghttp3_ksl_end(ksl); } + return NGHTTP3_ERR_INVALID_ARGUMENT; } @@ -564,10 +586,13 @@ int nghttp3_ksl_remove(nghttp3_ksl *ksl, nghttp3_ksl_it *it, if (it) { *it = nghttp3_ksl_end(ksl); } + return NGHTTP3_ERR_INVALID_ARGUMENT; } + ksl_remove_node(ksl, blk, i); --ksl->n; + if (it) { if (blk->n == i && blk->next) { nghttp3_ksl_it_init(it, ksl, blk->next, 0); @@ -575,6 +600,7 @@ int nghttp3_ksl_remove(nghttp3_ksl *ksl, nghttp3_ksl_it *it, nghttp3_ksl_it_init(it, ksl, blk, i); } } + return 0; } @@ -591,6 +617,7 @@ int nghttp3_ksl_remove(nghttp3_ksl *ksl, nghttp3_ksl_it *it, nghttp3_ksl_nth_node(ksl, blk, i + 1)->blk->n > NGHTTP3_KSL_MIN_NBLK) { ksl_shift_left(ksl, blk, i + 1); blk = node->blk; + continue; } @@ -598,6 +625,7 @@ int nghttp3_ksl_remove(nghttp3_ksl *ksl, nghttp3_ksl_it *it, nghttp3_ksl_nth_node(ksl, blk, i - 1)->blk->n > NGHTTP3_KSL_MIN_NBLK) { ksl_shift_right(ksl, blk, i - 1); blk = node->blk; + continue; } @@ -612,48 +640,12 @@ int nghttp3_ksl_remove(nghttp3_ksl *ksl, nghttp3_ksl_it *it, } } -nghttp3_ksl_it nghttp3_ksl_lower_bound(nghttp3_ksl *ksl, +nghttp3_ksl_it nghttp3_ksl_lower_bound(const nghttp3_ksl *ksl, const nghttp3_ksl_key *key) { - nghttp3_ksl_blk *blk = ksl->head; - nghttp3_ksl_it it; - size_t i; - - if (!blk) { - nghttp3_ksl_it_init(&it, ksl, &null_blk, 0); - return it; - } - - for (;;) { - i = ksl_bsearch(ksl, blk, key, ksl->compar); - - if (blk->leaf) { - if (i == blk->n && blk->next) { - blk = blk->next; - i = 0; - } - nghttp3_ksl_it_init(&it, ksl, blk, i); - return it; - } - - if (i == blk->n) { - /* This happens if descendant has smaller key. Fast forward to - find last node in this subtree. */ - for (; !blk->leaf; blk = nghttp3_ksl_nth_node(ksl, blk, blk->n - 1)->blk) - ; - if (blk->next) { - blk = blk->next; - i = 0; - } else { - i = blk->n; - } - nghttp3_ksl_it_init(&it, ksl, blk, i); - return it; - } - blk = nghttp3_ksl_nth_node(ksl, blk, i)->blk; - } + return nghttp3_ksl_lower_bound_compar(ksl, key, ksl->compar); } -nghttp3_ksl_it nghttp3_ksl_lower_bound_compar(nghttp3_ksl *ksl, +nghttp3_ksl_it nghttp3_ksl_lower_bound_compar(const nghttp3_ksl *ksl, const nghttp3_ksl_key *key, nghttp3_ksl_compar compar) { nghttp3_ksl_blk *blk = ksl->head; @@ -666,14 +658,16 @@ nghttp3_ksl_it nghttp3_ksl_lower_bound_compar(nghttp3_ksl *ksl, } for (;;) { - i = ksl_bsearch(ksl, blk, key, compar); + i = ksl_search(ksl, blk, key, compar); if (blk->leaf) { if (i == blk->n && blk->next) { blk = blk->next; i = 0; } + nghttp3_ksl_it_init(&it, ksl, blk, i); + return it; } @@ -682,15 +676,19 @@ nghttp3_ksl_it nghttp3_ksl_lower_bound_compar(nghttp3_ksl *ksl, find last node in this subtree. */ for (; !blk->leaf; blk = nghttp3_ksl_nth_node(ksl, blk, blk->n - 1)->blk) ; + if (blk->next) { blk = blk->next; i = 0; } else { i = blk->n; } + nghttp3_ksl_it_init(&it, ksl, blk, i); + return it; } + blk = nghttp3_ksl_nth_node(ksl, blk, i)->blk; } } @@ -704,7 +702,7 @@ void nghttp3_ksl_update_key(nghttp3_ksl *ksl, const nghttp3_ksl_key *old_key, assert(ksl->head); for (;;) { - i = ksl_bsearch(ksl, blk, old_key, ksl->compar); + i = ksl_search(ksl, blk, old_key, ksl->compar); assert(i < blk->n); node = nghttp3_ksl_nth_node(ksl, blk, i); @@ -712,6 +710,7 @@ void nghttp3_ksl_update_key(nghttp3_ksl *ksl, const nghttp3_ksl_key *old_key, if (blk->leaf) { assert(key_equal(ksl->compar, (nghttp3_ksl_key *)node->key, old_key)); ksl_node_set_key(ksl, node, new_key); + return; } @@ -724,7 +723,7 @@ void nghttp3_ksl_update_key(nghttp3_ksl *ksl, const nghttp3_ksl_key *old_key, } } -size_t nghttp3_ksl_len(nghttp3_ksl *ksl) { return ksl->n; } +size_t nghttp3_ksl_len(const nghttp3_ksl *ksl) { return ksl->n; } void nghttp3_ksl_clear(nghttp3_ksl *ksl) { if (!ksl->head) { @@ -733,7 +732,7 @@ void nghttp3_ksl_clear(nghttp3_ksl *ksl) { #ifdef NOMEMPOOL ksl_free_blk(ksl, ksl->head); -#endif /* NOMEMPOOL */ +#endif /* defined(NOMEMPOOL) */ ksl->front = ksl->back = ksl->head = NULL; ksl->n = 0; @@ -742,7 +741,8 @@ void nghttp3_ksl_clear(nghttp3_ksl *ksl) { } #ifndef WIN32 -static void ksl_print(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, size_t level) { +static void ksl_print(const nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, + size_t level) { size_t i; nghttp3_ksl_node *node; @@ -753,7 +753,9 @@ static void ksl_print(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, size_t level) { node = nghttp3_ksl_nth_node(ksl, blk, i); fprintf(stderr, " %" PRId64, *(int64_t *)(void *)node->key); } + fprintf(stderr, "\n"); + return; } @@ -762,14 +764,14 @@ static void ksl_print(nghttp3_ksl *ksl, nghttp3_ksl_blk *blk, size_t level) { } } -void nghttp3_ksl_print(nghttp3_ksl *ksl) { +void nghttp3_ksl_print(const nghttp3_ksl *ksl) { if (!ksl->head) { return; } ksl_print(ksl, ksl->head, 0); } -#endif /* !WIN32 */ +#endif /* !defined(WIN32) */ nghttp3_ksl_it nghttp3_ksl_begin(const nghttp3_ksl *ksl) { nghttp3_ksl_it it; @@ -826,6 +828,6 @@ int nghttp3_ksl_range_compar(const nghttp3_ksl_key *lhs, int nghttp3_ksl_range_exclusive_compar(const nghttp3_ksl_key *lhs, const nghttp3_ksl_key *rhs) { const nghttp3_range *a = lhs, *b = rhs; - return a->begin < b->begin && - !(nghttp3_max(a->begin, b->begin) < nghttp3_min(a->end, b->end)); + return a->begin < b->begin && !(nghttp3_max_uint64(a->begin, b->begin) < + nghttp3_min_uint64(a->end, b->end)); } diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_ksl.h b/deps/ngtcp2/nghttp3/lib/nghttp3_ksl.h index d513bdd672c750..e15e227ce50fb0 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_ksl.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_ksl.h @@ -28,7 +28,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -36,16 +36,12 @@ #include "nghttp3_objalloc.h" -/* - * Skip List using single key instead of range. - */ - #define NGHTTP3_KSL_DEGR 16 /* NGHTTP3_KSL_MAX_NBLK is the maximum number of nodes which a single block can contain. */ #define NGHTTP3_KSL_MAX_NBLK (2 * NGHTTP3_KSL_DEGR - 1) /* NGHTTP3_KSL_MIN_NBLK is the minimum number of nodes which a single - block other than root must contains. */ + block other than root must contain. */ #define NGHTTP3_KSL_MIN_NBLK (NGHTTP3_KSL_DEGR - 1) /* @@ -122,7 +118,7 @@ typedef struct nghttp3_ksl nghttp3_ksl; typedef struct nghttp3_ksl_it nghttp3_ksl_it; /* - * nghttp3_ksl_it is a forward iterator to iterate nodes. + * nghttp3_ksl_it is a bidirectional iterator to iterate nodes. */ struct nghttp3_ksl_it { const nghttp3_ksl *ksl; @@ -142,6 +138,7 @@ struct nghttp3_ksl { /* back points to the last leaf block. */ nghttp3_ksl_blk *back; nghttp3_ksl_compar compar; + /* n is the number of elements stored. */ size_t n; /* keylen is the size of key */ size_t keylen; @@ -152,7 +149,8 @@ struct nghttp3_ksl { /* * nghttp3_ksl_init initializes |ksl|. |compar| specifies compare - * function. |keylen| is the length of key. + * function. |keylen| is the length of key and must be at least + * sizeof(uint64_t). */ void nghttp3_ksl_init(nghttp3_ksl *ksl, nghttp3_ksl_compar compar, size_t keylen, const nghttp3_mem *mem); @@ -167,15 +165,15 @@ void nghttp3_ksl_free(nghttp3_ksl *ksl); /* * nghttp3_ksl_insert inserts |key| with its associated |data|. On * successful insertion, the iterator points to the inserted node is - * stored in |*it|. + * stored in |*it| if |it| is not NULL. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * NGHTTP3_ERR_NOMEM - * Out of memory. + * Out of memory. * NGHTTP3_ERR_INVALID_ARGUMENT - * |key| already exists. + * |key| already exists. */ int nghttp3_ksl_insert(nghttp3_ksl *ksl, nghttp3_ksl_it *it, const nghttp3_ksl_key *key, void *data); @@ -186,13 +184,14 @@ int nghttp3_ksl_insert(nghttp3_ksl *ksl, nghttp3_ksl_it *it, * This function assigns the iterator to |*it|, which points to the * node which is located at the right next of the removed node if |it| * is not NULL. If |key| is not found, no deletion takes place and - * the return value of nghttp3_ksl_end(ksl) is assigned to |*it|. + * the return value of nghttp3_ksl_end(ksl) is assigned to |*it| if + * |it| is not NULL. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * NGHTTP3_ERR_INVALID_ARGUMENT - * |key| does not exist. + * |key| does not exist. */ int nghttp3_ksl_remove(nghttp3_ksl *ksl, nghttp3_ksl_it *it, const nghttp3_ksl_key *key); @@ -212,24 +211,24 @@ int nghttp3_ksl_remove_hint(nghttp3_ksl *ksl, nghttp3_ksl_it *it, * nghttp3_ksl_lower_bound returns the iterator which points to the * first node which has the key which is equal to |key| or the last * node which satisfies !compar(&node->key, key). If there is no such - * node, it returns the iterator which satisfies nghttp3_ksl_it_end(it) - * != 0. + * node, it returns the iterator which satisfies + * nghttp3_ksl_it_end(it) != 0. */ -nghttp3_ksl_it nghttp3_ksl_lower_bound(nghttp3_ksl *ksl, +nghttp3_ksl_it nghttp3_ksl_lower_bound(const nghttp3_ksl *ksl, const nghttp3_ksl_key *key); /* * nghttp3_ksl_lower_bound_compar works like nghttp3_ksl_lower_bound, * but it takes custom function |compar| to do lower bound search. */ -nghttp3_ksl_it nghttp3_ksl_lower_bound_compar(nghttp3_ksl *ksl, +nghttp3_ksl_it nghttp3_ksl_lower_bound_compar(const nghttp3_ksl *ksl, const nghttp3_ksl_key *key, nghttp3_ksl_compar compar); /* - * nghttp3_ksl_update_key replaces the key of nodes which has |old_key| - * with |new_key|. |new_key| must be strictly greater than the - * previous node and strictly smaller than the next node. + * nghttp3_ksl_update_key replaces the key of nodes which has + * |old_key| with |new_key|. |new_key| must be strictly greater than + * the previous node and strictly smaller than the next node. */ void nghttp3_ksl_update_key(nghttp3_ksl *ksl, const nghttp3_ksl_key *old_key, const nghttp3_ksl_key *new_key); @@ -237,7 +236,8 @@ void nghttp3_ksl_update_key(nghttp3_ksl *ksl, const nghttp3_ksl_key *old_key, /* * nghttp3_ksl_begin returns the iterator which points to the first * node. If there is no node in |ksl|, it returns the iterator which - * satisfies nghttp3_ksl_it_end(it) != 0. + * satisfies both nghttp3_ksl_it_begin(it) != 0 and + * nghttp3_ksl_it_end(it) != 0. */ nghttp3_ksl_it nghttp3_ksl_begin(const nghttp3_ksl *ksl); @@ -245,14 +245,15 @@ nghttp3_ksl_it nghttp3_ksl_begin(const nghttp3_ksl *ksl); * nghttp3_ksl_end returns the iterator which points to the node * following the last node. The returned object satisfies * nghttp3_ksl_it_end(). If there is no node in |ksl|, it returns the - * iterator which satisfies nghttp3_ksl_it_begin(it) != 0. + * iterator which satisfies nghttp3_ksl_it_begin(it) != 0 and + * nghttp3_ksl_it_end(it) != 0. */ nghttp3_ksl_it nghttp3_ksl_end(const nghttp3_ksl *ksl); /* * nghttp3_ksl_len returns the number of elements stored in |ksl|. */ -size_t nghttp3_ksl_len(nghttp3_ksl *ksl); +size_t nghttp3_ksl_len(const nghttp3_ksl *ksl); /* * nghttp3_ksl_clear removes all elements stored in |ksl|. @@ -271,8 +272,8 @@ void nghttp3_ksl_clear(nghttp3_ksl *ksl); * that the key is of type int64_t. This function should be used for * the debugging purpose only. */ -void nghttp3_ksl_print(nghttp3_ksl *ksl); -#endif /* !WIN32 */ +void nghttp3_ksl_print(const nghttp3_ksl *ksl); +#endif /* !defined(WIN32) */ /* * nghttp3_ksl_it_init initializes |it|. @@ -295,8 +296,8 @@ void nghttp3_ksl_it_init(nghttp3_ksl_it *it, const nghttp3_ksl *ksl, */ #define nghttp3_ksl_it_next(IT) \ (++(IT)->i == (IT)->blk->n && (IT)->blk->next \ - ? ((IT)->blk = (IT)->blk->next, (IT)->i = 0) \ - : 0) + ? ((IT)->blk = (IT)->blk->next, (IT)->i = 0) \ + : 0) /* * nghttp3_ksl_it_prev moves backward the iterator by one. It is @@ -306,16 +307,16 @@ void nghttp3_ksl_it_init(nghttp3_ksl_it *it, const nghttp3_ksl *ksl, void nghttp3_ksl_it_prev(nghttp3_ksl_it *it); /* - * nghttp3_ksl_it_end returns nonzero if |it| points to the beyond the - * last node. + * nghttp3_ksl_it_end returns nonzero if |it| points to the one beyond + * the last node. */ #define nghttp3_ksl_it_end(IT) \ ((IT)->blk->n == (IT)->i && (IT)->blk->next == NULL) /* * nghttp3_ksl_it_begin returns nonzero if |it| points to the first - * node. |it| might satisfy both nghttp3_ksl_it_begin(&it) and - * nghttp3_ksl_it_end(&it) if the skip list has no node. + * node. |it| might satisfy both nghttp3_ksl_it_begin(it) != 0 and + * nghttp3_ksl_it_end(it) != 0 if the skip list has no node. */ int nghttp3_ksl_it_begin(const nghttp3_ksl_it *it); @@ -347,4 +348,4 @@ int nghttp3_ksl_range_compar(const nghttp3_ksl_key *lhs, int nghttp3_ksl_range_exclusive_compar(const nghttp3_ksl_key *lhs, const nghttp3_ksl_key *rhs); -#endif /* NGHTTP3_KSL_H */ +#endif /* !defined(NGHTTP3_KSL_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_macro.h b/deps/ngtcp2/nghttp3/lib/nghttp3_macro.h index a44e907661abbf..a4e1dfea3cda00 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_macro.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_macro.h @@ -28,17 +28,14 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include #include -#define nghttp3_min(A, B) ((A) < (B) ? (A) : (B)) -#define nghttp3_max(A, B) ((A) > (B) ? (A) : (B)) - #define nghttp3_struct_of(ptr, type, member) \ - ((type *)(void *)((char *)(ptr)-offsetof(type, member))) + ((type *)(void *)((char *)(ptr) - offsetof(type, member))) #define nghttp3_arraylen(A) (sizeof(A) / sizeof(*(A))) @@ -48,4 +45,30 @@ variable-length integer encoding. */ #define NGHTTP3_MAX_VARINT ((1ULL << 62) - 1) -#endif /* NGHTTP3_MACRO_H */ +#define nghttp3_max_def(SUFFIX, T) \ + static inline T nghttp3_max_##SUFFIX(T a, T b) { return a < b ? b : a; } + +nghttp3_max_def(int8, int8_t); +nghttp3_max_def(int16, int16_t); +nghttp3_max_def(int32, int32_t); +nghttp3_max_def(int64, int64_t); +nghttp3_max_def(uint8, uint8_t); +nghttp3_max_def(uint16, uint16_t); +nghttp3_max_def(uint32, uint32_t); +nghttp3_max_def(uint64, uint64_t); +nghttp3_max_def(size, size_t); + +#define nghttp3_min_def(SUFFIX, T) \ + static inline T nghttp3_min_##SUFFIX(T a, T b) { return a < b ? a : b; } + +nghttp3_min_def(int8, int8_t); +nghttp3_min_def(int16, int16_t); +nghttp3_min_def(int32, int32_t); +nghttp3_min_def(int64, int64_t); +nghttp3_min_def(uint8, uint8_t); +nghttp3_min_def(uint16, uint16_t); +nghttp3_min_def(uint32, uint32_t); +nghttp3_min_def(uint64, uint64_t); +nghttp3_min_def(size, size_t); + +#endif /* !defined(NGHTTP3_MACRO_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_map.c b/deps/ngtcp2/nghttp3/lib/nghttp3_map.c index b93fdfd3d488f5..cc5e42a2caf63f 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_map.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_map.c @@ -36,8 +36,7 @@ void nghttp3_map_init(nghttp3_map *map, const nghttp3_mem *mem) { map->mem = mem; - map->tablelen = 0; - map->tablelenbits = 0; + map->hashbits = 0; map->table = NULL; map->size = 0; } @@ -50,33 +49,20 @@ void nghttp3_map_free(nghttp3_map *map) { nghttp3_mem_free(map->mem, map->table); } -void nghttp3_map_each_free(nghttp3_map *map, int (*func)(void *data, void *ptr), - void *ptr) { - uint32_t i; - nghttp3_map_bucket *bkt; - - for (i = 0; i < map->tablelen; ++i) { - bkt = &map->table[i]; - - if (bkt->data == NULL) { - continue; - } - - func(bkt->data, ptr); - } -} - -int nghttp3_map_each(nghttp3_map *map, int (*func)(void *data, void *ptr), +int nghttp3_map_each(const nghttp3_map *map, int (*func)(void *data, void *ptr), void *ptr) { int rv; - uint32_t i; + size_t i; nghttp3_map_bucket *bkt; + size_t tablelen; if (map->size == 0) { return 0; } - for (i = 0; i < map->tablelen; ++i) { + tablelen = 1u << map->hashbits; + + for (i = 0; i < tablelen; ++i) { bkt = &map->table[i]; if (bkt->data == NULL) { @@ -92,82 +78,61 @@ int nghttp3_map_each(nghttp3_map *map, int (*func)(void *data, void *ptr), return 0; } -static uint32_t hash(nghttp3_map_key_type key) { - return (uint32_t)((key * 11400714819323198485llu) >> 32); -} - -static size_t h2idx(uint32_t hash, uint32_t bits) { - return hash >> (32 - bits); -} - -static size_t distance(uint32_t tablelen, uint32_t tablelenbits, - nghttp3_map_bucket *bkt, size_t idx) { - return (idx - h2idx(bkt->hash, tablelenbits)) & (tablelen - 1); +static size_t hash(nghttp3_map_key_type key, size_t bits) { + return (size_t)((key * 11400714819323198485llu) >> (64 - bits)); } -static void map_bucket_swap(nghttp3_map_bucket *bkt, uint32_t *phash, - nghttp3_map_key_type *pkey, void **pdata) { - uint32_t h = bkt->hash; - nghttp3_map_key_type key = bkt->key; - void *data = bkt->data; - - bkt->hash = *phash; - bkt->key = *pkey; - bkt->data = *pdata; +static void map_bucket_swap(nghttp3_map_bucket *a, nghttp3_map_bucket *b) { + nghttp3_map_bucket c = *a; - *phash = h; - *pkey = key; - *pdata = data; -} - -static void map_bucket_set_data(nghttp3_map_bucket *bkt, uint32_t hash, - nghttp3_map_key_type key, void *data) { - bkt->hash = hash; - bkt->key = key; - bkt->data = data; + *a = *b; + *b = c; } #ifndef WIN32 -void nghttp3_map_print_distance(nghttp3_map *map) { - uint32_t i; +void nghttp3_map_print_distance(const nghttp3_map *map) { + size_t i; size_t idx; nghttp3_map_bucket *bkt; + size_t tablelen; - for (i = 0; i < map->tablelen; ++i) { + if (map->size == 0) { + return; + } + + tablelen = 1u << map->hashbits; + + for (i = 0; i < tablelen; ++i) { bkt = &map->table[i]; if (bkt->data == NULL) { - fprintf(stderr, "@%u \n", i); + fprintf(stderr, "@%zu \n", i); continue; } - idx = h2idx(bkt->hash, map->tablelenbits); - fprintf(stderr, "@%u hash=%08x key=%" PRIu64 " base=%zu distance=%zu\n", i, - bkt->hash, bkt->key, idx, - distance(map->tablelen, map->tablelenbits, bkt, idx)); + idx = hash(bkt->key, map->hashbits); + fprintf(stderr, "@%zu hash=%zu key=%" PRIu64 " base=%zu distance=%u\n", i, + hash(bkt->key, map->hashbits), bkt->key, idx, bkt->psl); } } -#endif /* !WIN32 */ +#endif /* !defined(WIN32) */ -static int insert(nghttp3_map_bucket *table, uint32_t tablelen, - uint32_t tablelenbits, uint32_t hash, +static int insert(nghttp3_map_bucket *table, size_t hashbits, nghttp3_map_key_type key, void *data) { - size_t idx = h2idx(hash, tablelenbits); - size_t d = 0, dd; - nghttp3_map_bucket *bkt; + size_t idx = hash(key, hashbits); + nghttp3_map_bucket b = {0, key, data}, *bkt; + size_t mask = (1u << hashbits) - 1; for (;;) { bkt = &table[idx]; if (bkt->data == NULL) { - map_bucket_set_data(bkt, hash, key, data); + *bkt = b; return 0; } - dd = distance(tablelen, tablelenbits, bkt, idx); - if (d > dd) { - map_bucket_swap(bkt, &hash, &key, &data); - d = dd; + if (b.psl > bkt->psl) { + map_bucket_swap(bkt, &b); } else if (bkt->key == key) { /* TODO This check is just a waste after first swap or if this function is called from map_resize. That said, there is no @@ -176,41 +141,42 @@ static int insert(nghttp3_map_bucket *table, uint32_t tablelen, return NGHTTP3_ERR_INVALID_ARGUMENT; } - ++d; - idx = (idx + 1) & (tablelen - 1); + ++b.psl; + idx = (idx + 1) & mask; } } -/* new_tablelen must be power of 2 and new_tablelen == (1 << - new_tablelenbits) must hold. */ -static int map_resize(nghttp3_map *map, uint32_t new_tablelen, - uint32_t new_tablelenbits) { - uint32_t i; +static int map_resize(nghttp3_map *map, size_t new_hashbits) { + size_t i; nghttp3_map_bucket *new_table; nghttp3_map_bucket *bkt; + size_t tablelen; int rv; (void)rv; - new_table = - nghttp3_mem_calloc(map->mem, new_tablelen, sizeof(nghttp3_map_bucket)); + new_table = nghttp3_mem_calloc(map->mem, 1u << new_hashbits, + sizeof(nghttp3_map_bucket)); if (new_table == NULL) { return NGHTTP3_ERR_NOMEM; } - for (i = 0; i < map->tablelen; ++i) { - bkt = &map->table[i]; - if (bkt->data == NULL) { - continue; - } - rv = insert(new_table, new_tablelen, new_tablelenbits, bkt->hash, bkt->key, - bkt->data); + if (map->size) { + tablelen = 1u << map->hashbits; - assert(0 == rv); + for (i = 0; i < tablelen; ++i) { + bkt = &map->table[i]; + if (bkt->data == NULL) { + continue; + } + + rv = insert(new_table, new_hashbits, bkt->key, bkt->data); + + assert(0 == rv); + } } nghttp3_mem_free(map->mem, map->table); - map->tablelen = new_tablelen; - map->tablelenbits = new_tablelenbits; + map->hashbits = new_hashbits; map->table = new_table; return 0; @@ -222,48 +188,49 @@ int nghttp3_map_insert(nghttp3_map *map, nghttp3_map_key_type key, void *data) { assert(data); /* Load factor is 0.75 */ - if ((map->size + 1) * 4 > map->tablelen * 3) { - if (map->tablelen) { - rv = map_resize(map, map->tablelen * 2, map->tablelenbits + 1); + /* Under the very initial condition, that is map->size == 0 and + map->hashbits == 0, 4 > 3 still holds nicely. */ + if ((map->size + 1) * 4 > (1u << map->hashbits) * 3) { + if (map->hashbits) { + rv = map_resize(map, map->hashbits + 1); if (rv != 0) { return rv; } } else { - rv = map_resize(map, 1 << NGHTTP3_INITIAL_TABLE_LENBITS, - NGHTTP3_INITIAL_TABLE_LENBITS); + rv = map_resize(map, NGHTTP3_INITIAL_TABLE_LENBITS); if (rv != 0) { return rv; } } } - rv = insert(map->table, map->tablelen, map->tablelenbits, hash(key), key, - data); + rv = insert(map->table, map->hashbits, key, data); if (rv != 0) { return rv; } + ++map->size; + return 0; } -void *nghttp3_map_find(nghttp3_map *map, nghttp3_map_key_type key) { - uint32_t h; +void *nghttp3_map_find(const nghttp3_map *map, nghttp3_map_key_type key) { size_t idx; nghttp3_map_bucket *bkt; - size_t d = 0; + size_t psl = 0; + size_t mask; if (map->size == 0) { return NULL; } - h = hash(key); - idx = h2idx(h, map->tablelenbits); + idx = hash(key, map->hashbits); + mask = (1u << map->hashbits) - 1; for (;;) { bkt = &map->table[idx]; - if (bkt->data == NULL || - d > distance(map->tablelen, map->tablelenbits, bkt, idx)) { + if (bkt->data == NULL || psl > bkt->psl) { return NULL; } @@ -271,50 +238,47 @@ void *nghttp3_map_find(nghttp3_map *map, nghttp3_map_key_type key) { return bkt->data; } - ++d; - idx = (idx + 1) & (map->tablelen - 1); + ++psl; + idx = (idx + 1) & mask; } } int nghttp3_map_remove(nghttp3_map *map, nghttp3_map_key_type key) { - uint32_t h; - size_t idx, didx; - nghttp3_map_bucket *bkt; - size_t d = 0; + size_t idx; + nghttp3_map_bucket *b, *bkt; + size_t psl = 0; + size_t mask; if (map->size == 0) { return NGHTTP3_ERR_INVALID_ARGUMENT; } - h = hash(key); - idx = h2idx(h, map->tablelenbits); + idx = hash(key, map->hashbits); + mask = (1u << map->hashbits) - 1; for (;;) { bkt = &map->table[idx]; - if (bkt->data == NULL || - d > distance(map->tablelen, map->tablelenbits, bkt, idx)) { + if (bkt->data == NULL || psl > bkt->psl) { return NGHTTP3_ERR_INVALID_ARGUMENT; } if (bkt->key == key) { - map_bucket_set_data(bkt, 0, 0, NULL); - - didx = idx; - idx = (idx + 1) & (map->tablelen - 1); + b = bkt; + idx = (idx + 1) & mask; for (;;) { bkt = &map->table[idx]; - if (bkt->data == NULL || - distance(map->tablelen, map->tablelenbits, bkt, idx) == 0) { + if (bkt->data == NULL || bkt->psl == 0) { + b->data = NULL; break; } - map->table[didx] = *bkt; - map_bucket_set_data(bkt, 0, 0, NULL); - didx = idx; + --bkt->psl; + *b = *bkt; + b = bkt; - idx = (idx + 1) & (map->tablelen - 1); + idx = (idx + 1) & mask; } --map->size; @@ -322,18 +286,18 @@ int nghttp3_map_remove(nghttp3_map *map, nghttp3_map_key_type key) { return 0; } - ++d; - idx = (idx + 1) & (map->tablelen - 1); + ++psl; + idx = (idx + 1) & mask; } } void nghttp3_map_clear(nghttp3_map *map) { - if (map->tablelen == 0) { + if (map->size == 0) { return; } - memset(map->table, 0, sizeof(*map->table) * map->tablelen); + memset(map->table, 0, sizeof(*map->table) * (1u << map->hashbits)); map->size = 0; } -size_t nghttp3_map_size(nghttp3_map *map) { return map->size; } +size_t nghttp3_map_size(const nghttp3_map *map) { return map->size; } diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_map.h b/deps/ngtcp2/nghttp3/lib/nghttp3_map.h index 7683cfeef3f33e..2b1a6ecab5cf4c 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_map.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_map.h @@ -29,7 +29,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -40,7 +40,7 @@ typedef uint64_t nghttp3_map_key_type; typedef struct nghttp3_map_bucket { - uint32_t hash; + uint32_t psl; nghttp3_map_key_type key; void *data; } nghttp3_map_bucket; @@ -49,33 +49,24 @@ typedef struct nghttp3_map { nghttp3_map_bucket *table; const nghttp3_mem *mem; size_t size; - uint32_t tablelen; - uint32_t tablelenbits; + size_t hashbits; } nghttp3_map; /* - * Initializes the map |map|. + * nghttp3_map_init initializes the map |map|. */ void nghttp3_map_init(nghttp3_map *map, const nghttp3_mem *mem); /* - * Deallocates any resources allocated for |map|. The stored entries - * are not freed by this function. Use nghttp3_map_each_free() to free - * each entries. + * nghttp3_map_free deallocates any resources allocated for |map|. + * The stored entries are not freed by this function. Use + * nghttp3_map_each() to free each entry. */ void nghttp3_map_free(nghttp3_map *map); /* - * Deallocates each entries using |func| function and any resources - * allocated for |map|. The |func| function is responsible for freeing - * given the |data| object. The |ptr| will be passed to the |func| as - * send argument. The return value of the |func| will be ignored. - */ -void nghttp3_map_each_free(nghttp3_map *map, int (*func)(void *data, void *ptr), - void *ptr); - -/* - * Inserts the new |data| with the |key| to the map |map|. + * nghttp3_map_insert inserts the new |data| with the |key| to the map + * |map|. * * This function returns 0 if it succeeds, or one of the following * negative error codes: @@ -83,57 +74,56 @@ void nghttp3_map_each_free(nghttp3_map *map, int (*func)(void *data, void *ptr), * NGHTTP3_ERR_INVALID_ARGUMENT * The item associated by |key| already exists. * NGHTTP3_ERR_NOMEM - * Out of memory + * Out of memory */ int nghttp3_map_insert(nghttp3_map *map, nghttp3_map_key_type key, void *data); /* - * Returns the data associated by the key |key|. If there is no such - * data, this function returns NULL. + * nghttp3_map_find returns the entry associated by the key |key|. If + * there is no such entry, this function returns NULL. */ -void *nghttp3_map_find(nghttp3_map *map, nghttp3_map_key_type key); +void *nghttp3_map_find(const nghttp3_map *map, nghttp3_map_key_type key); /* - * Removes the data associated by the key |key| from the |map|. The - * removed data is not freed by this function. + * nghttp3_map_remove removes the entry associated by the key |key| + * from the |map|. The removed entry is not freed by this function. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * NGHTTP3_ERR_INVALID_ARGUMENT - * The data associated by |key| does not exist. + * The entry associated by |key| does not exist. */ int nghttp3_map_remove(nghttp3_map *map, nghttp3_map_key_type key); /* - * Removes all entries from |map|. + * nghttp3_map_clear removes all entries from |map|. The removed + * entry is not freed by this function. */ void nghttp3_map_clear(nghttp3_map *map); /* - * Returns the number of items stored in the map |map|. + * nghttp3_map_size returns the number of items stored in the map + * |map|. */ -size_t nghttp3_map_size(nghttp3_map *map); +size_t nghttp3_map_size(const nghttp3_map *map); /* - * Applies the function |func| to each data in the |map| with the - * optional user supplied pointer |ptr|. + * nghttp3_map_each applies the function |func| to each entry in the + * |map| with the optional user supplied pointer |ptr|. * * If the |func| returns 0, this function calls the |func| with the - * next data. If the |func| returns nonzero, it will not call the + * next entry. If the |func| returns nonzero, it will not call the * |func| for further entries and return the return value of the * |func| immediately. Thus, this function returns 0 if all the * invocations of the |func| return 0, or nonzero value which the last * invocation of |func| returns. - * - * Don't use this function to free each data. Use - * nghttp3_map_each_free() instead. */ -int nghttp3_map_each(nghttp3_map *map, int (*func)(void *data, void *ptr), +int nghttp3_map_each(const nghttp3_map *map, int (*func)(void *data, void *ptr), void *ptr); #ifndef WIN32 -void nghttp3_map_print_distance(nghttp3_map *map); -#endif /* !WIN32 */ +void nghttp3_map_print_distance(const nghttp3_map *map); +#endif /* !defined(WIN32) */ -#endif /* NGHTTP3_MAP_H */ +#endif /* !defined(NGHTTP3_MAP_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_mem.c b/deps/ngtcp2/nghttp3/lib/nghttp3_mem.c index 0379e99b59cb74..687872f9020e78 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_mem.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_mem.c @@ -73,7 +73,7 @@ void *nghttp3_mem_calloc(const nghttp3_mem *mem, size_t nmemb, size_t size) { void *nghttp3_mem_realloc(const nghttp3_mem *mem, void *ptr, size_t size) { return mem->realloc(ptr, size, mem->user_data); } -#else /* MEMDEBUG */ +#else /* defined(MEMDEBUG) */ void *nghttp3_mem_malloc_debug(const nghttp3_mem *mem, size_t size, const char *func, const char *file, size_t line) { @@ -121,4 +121,4 @@ void *nghttp3_mem_realloc_debug(const nghttp3_mem *mem, void *ptr, size_t size, return nptr; } -#endif /* MEMDEBUG */ +#endif /* defined(MEMDEBUG) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_mem.h b/deps/ngtcp2/nghttp3/lib/nghttp3_mem.h index d6c3ada6f7e894..1ae53c91575f9f 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_mem.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_mem.h @@ -29,7 +29,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -40,7 +40,7 @@ void *nghttp3_mem_malloc(const nghttp3_mem *mem, size_t size); void nghttp3_mem_free(const nghttp3_mem *mem, void *ptr); void *nghttp3_mem_calloc(const nghttp3_mem *mem, size_t nmemb, size_t size); void *nghttp3_mem_realloc(const nghttp3_mem *mem, void *ptr, size_t size); -#else /* MEMDEBUG */ +#else /* defined(MEMDEBUG) */ void *nghttp3_mem_malloc_debug(const nghttp3_mem *mem, size_t size, const char *func, const char *file, size_t line); @@ -75,6 +75,6 @@ void *nghttp3_mem_realloc_debug(const nghttp3_mem *mem, void *ptr, size_t size, # define nghttp3_mem_realloc(MEM, PTR, SIZE) \ nghttp3_mem_realloc_debug((MEM), (PTR), (SIZE), __func__, __FILE__, \ __LINE__) -#endif /* MEMDEBUG */ +#endif /* defined(MEMDEBUG) */ -#endif /* NGHTTP3_MEM_H */ +#endif /* !defined(NGHTTP3_MEM_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_objalloc.h b/deps/ngtcp2/nghttp3/lib/nghttp3_objalloc.h index 02dff285f24060..4f8ffa093751a7 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_objalloc.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_objalloc.h @@ -28,7 +28,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -68,9 +68,9 @@ void nghttp3_objalloc_clear(nghttp3_objalloc *objalloc); #ifndef NOMEMPOOL # define nghttp3_objalloc_decl(NAME, TYPE, OPLENTFIELD) \ inline static void nghttp3_objalloc_##NAME##_init( \ - nghttp3_objalloc *objalloc, size_t nmemb, const nghttp3_mem *mem) { \ + nghttp3_objalloc *objalloc, size_t nmemb, const nghttp3_mem *mem) { \ nghttp3_objalloc_init( \ - objalloc, ((sizeof(TYPE) + 0xfu) & ~(uintptr_t)0xfu) * nmemb, mem); \ + objalloc, ((sizeof(TYPE) + 0xfu) & ~(uintptr_t)0xfu) * nmemb, mem); \ } \ \ TYPE *nghttp3_objalloc_##NAME##_get(nghttp3_objalloc *objalloc); \ @@ -79,7 +79,7 @@ void nghttp3_objalloc_clear(nghttp3_objalloc *objalloc); size_t len); \ \ inline static void nghttp3_objalloc_##NAME##_release( \ - nghttp3_objalloc *objalloc, TYPE *obj) { \ + nghttp3_objalloc *objalloc, TYPE *obj) { \ nghttp3_opl_push(&objalloc->opl, &obj->OPLENTFIELD); \ } @@ -90,8 +90,8 @@ void nghttp3_objalloc_clear(nghttp3_objalloc *objalloc); int rv; \ \ if (!oplent) { \ - rv = nghttp3_balloc_get(&objalloc->balloc, (void **)&obj, \ - sizeof(TYPE)); \ + rv = \ + nghttp3_balloc_get(&objalloc->balloc, (void **)&obj, sizeof(TYPE)); \ if (rv != 0) { \ return NULL; \ } \ @@ -119,30 +119,30 @@ void nghttp3_objalloc_clear(nghttp3_objalloc *objalloc); \ return nghttp3_struct_of(oplent, TYPE, OPLENTFIELD); \ } -#else /* NOMEMPOOL */ +#else /* defined(NOMEMPOOL) */ # define nghttp3_objalloc_decl(NAME, TYPE, OPLENTFIELD) \ inline static void nghttp3_objalloc_##NAME##_init( \ - nghttp3_objalloc *objalloc, size_t nmemb, const nghttp3_mem *mem) { \ + nghttp3_objalloc *objalloc, size_t nmemb, const nghttp3_mem *mem) { \ nghttp3_objalloc_init( \ - objalloc, ((sizeof(TYPE) + 0xfu) & ~(uintptr_t)0xfu) * nmemb, mem); \ + objalloc, ((sizeof(TYPE) + 0xfu) & ~(uintptr_t)0xfu) * nmemb, mem); \ } \ \ inline static TYPE *nghttp3_objalloc_##NAME##_get( \ - nghttp3_objalloc *objalloc) { \ + nghttp3_objalloc *objalloc) { \ return nghttp3_mem_malloc(objalloc->balloc.mem, sizeof(TYPE)); \ } \ \ inline static TYPE *nghttp3_objalloc_##NAME##_len_get( \ - nghttp3_objalloc *objalloc, size_t len) { \ + nghttp3_objalloc *objalloc, size_t len) { \ return nghttp3_mem_malloc(objalloc->balloc.mem, len); \ } \ \ inline static void nghttp3_objalloc_##NAME##_release( \ - nghttp3_objalloc *objalloc, TYPE *obj) { \ + nghttp3_objalloc *objalloc, TYPE *obj) { \ nghttp3_mem_free(objalloc->balloc.mem, obj); \ } # define nghttp3_objalloc_def(NAME, TYPE, OPLENTFIELD) -#endif /* NOMEMPOOL */ +#endif /* defined(NOMEMPOOL) */ -#endif /* NGHTTP3_OBJALLOC_H */ +#endif /* !defined(NGHTTP3_OBJALLOC_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_opl.h b/deps/ngtcp2/nghttp3/lib/nghttp3_opl.h index 8c8a4f2051b25a..6609371dbfb89f 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_opl.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_opl.h @@ -28,7 +28,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -63,4 +63,4 @@ nghttp3_opl_entry *nghttp3_opl_pop(nghttp3_opl *opl); void nghttp3_opl_clear(nghttp3_opl *opl); -#endif /* NGHTTP3_OPL_H */ +#endif /* !defined(NGHTTP3_OPL_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_pq.c b/deps/ngtcp2/nghttp3/lib/nghttp3_pq.c index 5d09050ae63798..feefcd6fc717c3 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_pq.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_pq.c @@ -30,18 +30,21 @@ #include "nghttp3_macro.h" -void nghttp3_pq_init(nghttp3_pq *pq, nghttp3_less less, +void nghttp3_pq_init(nghttp3_pq *pq, nghttp3_pq_less less, const nghttp3_mem *mem) { - pq->mem = mem; - pq->capacity = 0; pq->q = NULL; + pq->mem = mem; pq->length = 0; + pq->capacity = 0; pq->less = less; } void nghttp3_pq_free(nghttp3_pq *pq) { + if (!pq) { + return; + } + nghttp3_mem_free(pq->mem, pq->q); - pq->q = NULL; } static void swap(nghttp3_pq *pq, size_t i, size_t j) { @@ -56,11 +59,13 @@ static void swap(nghttp3_pq *pq, size_t i, size_t j) { static void bubble_up(nghttp3_pq *pq, size_t index) { size_t parent; - while (index != 0) { + + while (index) { parent = (index - 1) / 2; if (!pq->less(pq->q[index], pq->q[parent])) { return; } + swap(pq, parent, index); index = parent; } @@ -71,20 +76,23 @@ int nghttp3_pq_push(nghttp3_pq *pq, nghttp3_pq_entry *item) { void *nq; size_t ncapacity; - ncapacity = nghttp3_max(4, (pq->capacity * 2)); + ncapacity = nghttp3_max_size(4, pq->capacity * 2); nq = nghttp3_mem_realloc(pq->mem, pq->q, ncapacity * sizeof(nghttp3_pq_entry *)); if (nq == NULL) { return NGHTTP3_ERR_NOMEM; } + pq->capacity = ncapacity; pq->q = nq; } + pq->q[pq->length] = item; item->index = pq->length; ++pq->length; - bubble_up(pq, pq->length - 1); + bubble_up(pq, item->index); + return 0; } @@ -95,32 +103,37 @@ nghttp3_pq_entry *nghttp3_pq_top(const nghttp3_pq *pq) { static void bubble_down(nghttp3_pq *pq, size_t index) { size_t i, j, minindex; + for (;;) { j = index * 2 + 1; minindex = index; + for (i = 0; i < 2; ++i, ++j) { if (j >= pq->length) { break; } + if (pq->less(pq->q[j], pq->q[minindex])) { minindex = j; } } + if (minindex == index) { return; } + swap(pq, index, minindex); index = minindex; } } void nghttp3_pq_pop(nghttp3_pq *pq) { - if (pq->length > 0) { - pq->q[0] = pq->q[pq->length - 1]; - pq->q[0]->index = 0; - --pq->length; - bubble_down(pq, 0); - } + assert(pq->length); + + pq->q[0] = pq->q[pq->length - 1]; + pq->q[0]->index = 0; + --pq->length; + bubble_down(pq, 0); } void nghttp3_pq_remove(nghttp3_pq *pq, nghttp3_pq_entry *item) { @@ -157,11 +170,13 @@ int nghttp3_pq_each(const nghttp3_pq *pq, nghttp3_pq_item_cb fun, void *arg) { if (pq->length == 0) { return 0; } + for (i = 0; i < pq->length; ++i) { if ((*fun)(pq->q[i], arg)) { return 1; } } + return 0; } diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_pq.h b/deps/ngtcp2/nghttp3/lib/nghttp3_pq.h index c1a54f505bbd03..3813b529473075 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_pq.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_pq.h @@ -29,7 +29,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -39,44 +39,48 @@ /* NGHTTP3_PQ_BAD_INDEX is the priority queue index which indicates that an entry is not queued. Assigning this value to - nghttp3_pq_entry.index can check that the entry is queued or not. */ + nghttp3_pq_entry.index can check that the entry is queued or + not. */ #define NGHTTP3_PQ_BAD_INDEX SIZE_MAX typedef struct nghttp3_pq_entry { size_t index; } nghttp3_pq_entry; -/* "less" function, return nonzero if |lhs| is less than |rhs|. */ -typedef int (*nghttp3_less)(const nghttp3_pq_entry *lhs, - const nghttp3_pq_entry *rhs); +/* nghttp3_pq_less is a "less" function, that returns nonzero if |lhs| + is considered to be less than |rhs|. */ +typedef int (*nghttp3_pq_less)(const nghttp3_pq_entry *lhs, + const nghttp3_pq_entry *rhs); typedef struct nghttp3_pq { - /* The pointer to the pointer to the item stored */ + /* q is a pointer to an array that stores the items. */ nghttp3_pq_entry **q; - /* Memory allocator */ + /* mem is a memory allocator. */ const nghttp3_mem *mem; - /* The number of items stored */ + /* length is the number of items stored. */ size_t length; - /* The maximum number of items this pq can store. This is - automatically extended when length is reached to this value. */ + /* capacity is the maximum number of items this queue can store. + This is automatically extended when length is reached to this + limit. */ size_t capacity; - /* The less function between items */ - nghttp3_less less; + /* less is the less function to compare items. */ + nghttp3_pq_less less; } nghttp3_pq; /* - * Initializes priority queue |pq| with compare function |cmp|. + * nghttp3_pq_init initializes |pq| with compare function |cmp|. */ -void nghttp3_pq_init(nghttp3_pq *pq, nghttp3_less less, const nghttp3_mem *mem); +void nghttp3_pq_init(nghttp3_pq *pq, nghttp3_pq_less less, + const nghttp3_mem *mem); /* - * Deallocates any resources allocated for |pq|. The stored items are - * not freed by this function. + * nghttp3_pq_free deallocates any resources allocated for |pq|. The + * stored items are not freed by this function. */ void nghttp3_pq_free(nghttp3_pq *pq); /* - * Adds |item| to the priority queue |pq|. + * nghttp3_pq_push adds |item| to |pq|. * * This function returns 0 if it succeeds, or one of the following * negative error codes: @@ -87,43 +91,47 @@ void nghttp3_pq_free(nghttp3_pq *pq); int nghttp3_pq_push(nghttp3_pq *pq, nghttp3_pq_entry *item); /* - * Returns item at the top of the queue |pq|. It is undefined if the - * queue is empty. + * nghttp3_pq_top returns item at the top of |pq|. It is undefined if + * |pq| is empty. */ nghttp3_pq_entry *nghttp3_pq_top(const nghttp3_pq *pq); /* - * Pops item at the top of the queue |pq|. The popped item is not - * freed by this function. + * nghttp3_pq_pop pops item at the top of |pq|. The popped item is + * not freed by this function. It is undefined if |pq| is empty. */ void nghttp3_pq_pop(nghttp3_pq *pq); /* - * Returns nonzero if the queue |pq| is empty. + * nghttp3_pq_empty returns nonzero if |pq| is empty. */ int nghttp3_pq_empty(const nghttp3_pq *pq); /* - * Returns the number of items in the queue |pq|. + * nghttp3_pq_size returns the number of items |pq| contains. */ size_t nghttp3_pq_size(const nghttp3_pq *pq); typedef int (*nghttp3_pq_item_cb)(nghttp3_pq_entry *item, void *arg); /* - * Applies |fun| to each item in |pq|. The |arg| is passed as arg - * parameter to callback function. This function must not change the - * ordering key. If the return value from callback is nonzero, this - * function returns 1 immediately without iterating remaining items. - * Otherwise this function returns 0. + * nghttp3_pq_each applies |fun| to each item in |pq|. The |arg| is + * passed as arg parameter to callback function. This function must + * not change the ordering key. If the return value from callback is + * nonzero, this function returns 1 immediately without iterating + * remaining items. Otherwise this function returns 0. */ int nghttp3_pq_each(const nghttp3_pq *pq, nghttp3_pq_item_cb fun, void *arg); /* - * Removes |item| from priority queue. + * nghttp3_pq_remove removes |item| from |pq|. |pq| must contain + * |item| otherwise the behavior is undefined. */ void nghttp3_pq_remove(nghttp3_pq *pq, nghttp3_pq_entry *item); +/* + * nghttp3_pq_clear removes all items from |pq|. + */ void nghttp3_pq_clear(nghttp3_pq *pq); -#endif /* NGHTTP3_PQ_H */ +#endif /* !defined(NGHTTP3_PQ_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_qpack.c b/deps/ngtcp2/nghttp3/lib/nghttp3_qpack.c index 428c06a82c6bfb..a1c7e7487c1a34 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_qpack.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_qpack.c @@ -41,287 +41,282 @@ #define NGHTTP3_QPACK_MAX_QPACK_STREAMS 2000 /* Make scalar initialization form of nghttp3_qpack_static_entry */ -#define MAKE_STATIC_ENT(I, T, H) \ - { I, T, H } +#define MAKE_STATIC_ENT(I, T, H) {I, T, H} /* Generated by mkstatichdtbl.py */ static nghttp3_qpack_static_entry token_stable[] = { - MAKE_STATIC_ENT(0, NGHTTP3_QPACK_TOKEN__AUTHORITY, 3153725150u), - MAKE_STATIC_ENT(15, NGHTTP3_QPACK_TOKEN__METHOD, 695666056u), - MAKE_STATIC_ENT(16, NGHTTP3_QPACK_TOKEN__METHOD, 695666056u), - MAKE_STATIC_ENT(17, NGHTTP3_QPACK_TOKEN__METHOD, 695666056u), - MAKE_STATIC_ENT(18, NGHTTP3_QPACK_TOKEN__METHOD, 695666056u), - MAKE_STATIC_ENT(19, NGHTTP3_QPACK_TOKEN__METHOD, 695666056u), - MAKE_STATIC_ENT(20, NGHTTP3_QPACK_TOKEN__METHOD, 695666056u), - MAKE_STATIC_ENT(21, NGHTTP3_QPACK_TOKEN__METHOD, 695666056u), - MAKE_STATIC_ENT(1, NGHTTP3_QPACK_TOKEN__PATH, 3292848686u), - MAKE_STATIC_ENT(22, NGHTTP3_QPACK_TOKEN__SCHEME, 2510477674u), - MAKE_STATIC_ENT(23, NGHTTP3_QPACK_TOKEN__SCHEME, 2510477674u), - MAKE_STATIC_ENT(24, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), - MAKE_STATIC_ENT(25, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), - MAKE_STATIC_ENT(26, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), - MAKE_STATIC_ENT(27, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), - MAKE_STATIC_ENT(28, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), - MAKE_STATIC_ENT(63, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), - MAKE_STATIC_ENT(64, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), - MAKE_STATIC_ENT(65, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), - MAKE_STATIC_ENT(66, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), - MAKE_STATIC_ENT(67, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), - MAKE_STATIC_ENT(68, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), - MAKE_STATIC_ENT(69, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), - MAKE_STATIC_ENT(70, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), - MAKE_STATIC_ENT(71, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), - MAKE_STATIC_ENT(29, NGHTTP3_QPACK_TOKEN_ACCEPT, 136609321u), - MAKE_STATIC_ENT(30, NGHTTP3_QPACK_TOKEN_ACCEPT, 136609321u), - MAKE_STATIC_ENT(31, NGHTTP3_QPACK_TOKEN_ACCEPT_ENCODING, 3379649177u), - MAKE_STATIC_ENT(72, NGHTTP3_QPACK_TOKEN_ACCEPT_LANGUAGE, 1979086614u), - MAKE_STATIC_ENT(32, NGHTTP3_QPACK_TOKEN_ACCEPT_RANGES, 1713753958u), - MAKE_STATIC_ENT(73, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_CREDENTIALS, - 901040780u), - MAKE_STATIC_ENT(74, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_CREDENTIALS, - 901040780u), - MAKE_STATIC_ENT(33, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_HEADERS, - 1524311232u), - MAKE_STATIC_ENT(34, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_HEADERS, - 1524311232u), - MAKE_STATIC_ENT(75, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_HEADERS, - 1524311232u), - MAKE_STATIC_ENT(76, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_METHODS, - 2175229868u), - MAKE_STATIC_ENT(77, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_METHODS, - 2175229868u), - MAKE_STATIC_ENT(78, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_METHODS, - 2175229868u), - MAKE_STATIC_ENT(35, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_ORIGIN, - 2710797292u), - MAKE_STATIC_ENT(79, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_EXPOSE_HEADERS, - 2449824425u), - MAKE_STATIC_ENT(80, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_REQUEST_HEADERS, - 3599549072u), - MAKE_STATIC_ENT(81, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_REQUEST_METHOD, - 2417078055u), - MAKE_STATIC_ENT(82, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_REQUEST_METHOD, - 2417078055u), - MAKE_STATIC_ENT(2, NGHTTP3_QPACK_TOKEN_AGE, 742476188u), - MAKE_STATIC_ENT(83, NGHTTP3_QPACK_TOKEN_ALT_SVC, 2148877059u), - MAKE_STATIC_ENT(84, NGHTTP3_QPACK_TOKEN_AUTHORIZATION, 2436257726u), - MAKE_STATIC_ENT(36, NGHTTP3_QPACK_TOKEN_CACHE_CONTROL, 1355326669u), - MAKE_STATIC_ENT(37, NGHTTP3_QPACK_TOKEN_CACHE_CONTROL, 1355326669u), - MAKE_STATIC_ENT(38, NGHTTP3_QPACK_TOKEN_CACHE_CONTROL, 1355326669u), - MAKE_STATIC_ENT(39, NGHTTP3_QPACK_TOKEN_CACHE_CONTROL, 1355326669u), - MAKE_STATIC_ENT(40, NGHTTP3_QPACK_TOKEN_CACHE_CONTROL, 1355326669u), - MAKE_STATIC_ENT(41, NGHTTP3_QPACK_TOKEN_CACHE_CONTROL, 1355326669u), - MAKE_STATIC_ENT(3, NGHTTP3_QPACK_TOKEN_CONTENT_DISPOSITION, 3889184348u), - MAKE_STATIC_ENT(42, NGHTTP3_QPACK_TOKEN_CONTENT_ENCODING, 65203592u), - MAKE_STATIC_ENT(43, NGHTTP3_QPACK_TOKEN_CONTENT_ENCODING, 65203592u), - MAKE_STATIC_ENT(4, NGHTTP3_QPACK_TOKEN_CONTENT_LENGTH, 1308181789u), - MAKE_STATIC_ENT(85, NGHTTP3_QPACK_TOKEN_CONTENT_SECURITY_POLICY, - 1569039836u), - MAKE_STATIC_ENT(44, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), - MAKE_STATIC_ENT(45, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), - MAKE_STATIC_ENT(46, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), - MAKE_STATIC_ENT(47, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), - MAKE_STATIC_ENT(48, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), - MAKE_STATIC_ENT(49, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), - MAKE_STATIC_ENT(50, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), - MAKE_STATIC_ENT(51, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), - MAKE_STATIC_ENT(52, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), - MAKE_STATIC_ENT(53, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), - MAKE_STATIC_ENT(54, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), - MAKE_STATIC_ENT(5, NGHTTP3_QPACK_TOKEN_COOKIE, 2007449791u), - MAKE_STATIC_ENT(6, NGHTTP3_QPACK_TOKEN_DATE, 3564297305u), - MAKE_STATIC_ENT(86, NGHTTP3_QPACK_TOKEN_EARLY_DATA, 4080895051u), - MAKE_STATIC_ENT(7, NGHTTP3_QPACK_TOKEN_ETAG, 113792960u), - MAKE_STATIC_ENT(87, NGHTTP3_QPACK_TOKEN_EXPECT_CT, 1183214960u), - MAKE_STATIC_ENT(88, NGHTTP3_QPACK_TOKEN_FORWARDED, 1485178027u), - MAKE_STATIC_ENT(8, NGHTTP3_QPACK_TOKEN_IF_MODIFIED_SINCE, 2213050793u), - MAKE_STATIC_ENT(9, NGHTTP3_QPACK_TOKEN_IF_NONE_MATCH, 2536202615u), - MAKE_STATIC_ENT(89, NGHTTP3_QPACK_TOKEN_IF_RANGE, 2340978238u), - MAKE_STATIC_ENT(10, NGHTTP3_QPACK_TOKEN_LAST_MODIFIED, 3226950251u), - MAKE_STATIC_ENT(11, NGHTTP3_QPACK_TOKEN_LINK, 232457833u), - MAKE_STATIC_ENT(12, NGHTTP3_QPACK_TOKEN_LOCATION, 200649126u), - MAKE_STATIC_ENT(90, NGHTTP3_QPACK_TOKEN_ORIGIN, 3649018447u), - MAKE_STATIC_ENT(91, NGHTTP3_QPACK_TOKEN_PURPOSE, 4212263681u), - MAKE_STATIC_ENT(55, NGHTTP3_QPACK_TOKEN_RANGE, 4208725202u), - MAKE_STATIC_ENT(13, NGHTTP3_QPACK_TOKEN_REFERER, 3969579366u), - MAKE_STATIC_ENT(92, NGHTTP3_QPACK_TOKEN_SERVER, 1085029842u), - MAKE_STATIC_ENT(14, NGHTTP3_QPACK_TOKEN_SET_COOKIE, 1848371000u), - MAKE_STATIC_ENT(56, NGHTTP3_QPACK_TOKEN_STRICT_TRANSPORT_SECURITY, - 4138147361u), - MAKE_STATIC_ENT(57, NGHTTP3_QPACK_TOKEN_STRICT_TRANSPORT_SECURITY, - 4138147361u), - MAKE_STATIC_ENT(58, NGHTTP3_QPACK_TOKEN_STRICT_TRANSPORT_SECURITY, - 4138147361u), - MAKE_STATIC_ENT(93, NGHTTP3_QPACK_TOKEN_TIMING_ALLOW_ORIGIN, 2432297564u), - MAKE_STATIC_ENT(94, NGHTTP3_QPACK_TOKEN_UPGRADE_INSECURE_REQUESTS, - 2479169413u), - MAKE_STATIC_ENT(95, NGHTTP3_QPACK_TOKEN_USER_AGENT, 606444526u), - MAKE_STATIC_ENT(59, NGHTTP3_QPACK_TOKEN_VARY, 1085005381u), - MAKE_STATIC_ENT(60, NGHTTP3_QPACK_TOKEN_VARY, 1085005381u), - MAKE_STATIC_ENT(61, NGHTTP3_QPACK_TOKEN_X_CONTENT_TYPE_OPTIONS, - 3644557769u), - MAKE_STATIC_ENT(96, NGHTTP3_QPACK_TOKEN_X_FORWARDED_FOR, 2914187656u), - MAKE_STATIC_ENT(97, NGHTTP3_QPACK_TOKEN_X_FRAME_OPTIONS, 3993834824u), - MAKE_STATIC_ENT(98, NGHTTP3_QPACK_TOKEN_X_FRAME_OPTIONS, 3993834824u), - MAKE_STATIC_ENT(62, NGHTTP3_QPACK_TOKEN_X_XSS_PROTECTION, 2501058888u), + MAKE_STATIC_ENT(0, NGHTTP3_QPACK_TOKEN__AUTHORITY, 3153725150u), + MAKE_STATIC_ENT(15, NGHTTP3_QPACK_TOKEN__METHOD, 695666056u), + MAKE_STATIC_ENT(16, NGHTTP3_QPACK_TOKEN__METHOD, 695666056u), + MAKE_STATIC_ENT(17, NGHTTP3_QPACK_TOKEN__METHOD, 695666056u), + MAKE_STATIC_ENT(18, NGHTTP3_QPACK_TOKEN__METHOD, 695666056u), + MAKE_STATIC_ENT(19, NGHTTP3_QPACK_TOKEN__METHOD, 695666056u), + MAKE_STATIC_ENT(20, NGHTTP3_QPACK_TOKEN__METHOD, 695666056u), + MAKE_STATIC_ENT(21, NGHTTP3_QPACK_TOKEN__METHOD, 695666056u), + MAKE_STATIC_ENT(1, NGHTTP3_QPACK_TOKEN__PATH, 3292848686u), + MAKE_STATIC_ENT(22, NGHTTP3_QPACK_TOKEN__SCHEME, 2510477674u), + MAKE_STATIC_ENT(23, NGHTTP3_QPACK_TOKEN__SCHEME, 2510477674u), + MAKE_STATIC_ENT(24, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), + MAKE_STATIC_ENT(25, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), + MAKE_STATIC_ENT(26, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), + MAKE_STATIC_ENT(27, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), + MAKE_STATIC_ENT(28, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), + MAKE_STATIC_ENT(63, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), + MAKE_STATIC_ENT(64, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), + MAKE_STATIC_ENT(65, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), + MAKE_STATIC_ENT(66, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), + MAKE_STATIC_ENT(67, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), + MAKE_STATIC_ENT(68, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), + MAKE_STATIC_ENT(69, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), + MAKE_STATIC_ENT(70, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), + MAKE_STATIC_ENT(71, NGHTTP3_QPACK_TOKEN__STATUS, 4000288983u), + MAKE_STATIC_ENT(29, NGHTTP3_QPACK_TOKEN_ACCEPT, 136609321u), + MAKE_STATIC_ENT(30, NGHTTP3_QPACK_TOKEN_ACCEPT, 136609321u), + MAKE_STATIC_ENT(31, NGHTTP3_QPACK_TOKEN_ACCEPT_ENCODING, 3379649177u), + MAKE_STATIC_ENT(72, NGHTTP3_QPACK_TOKEN_ACCEPT_LANGUAGE, 1979086614u), + MAKE_STATIC_ENT(32, NGHTTP3_QPACK_TOKEN_ACCEPT_RANGES, 1713753958u), + MAKE_STATIC_ENT(73, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_CREDENTIALS, + 901040780u), + MAKE_STATIC_ENT(74, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_CREDENTIALS, + 901040780u), + MAKE_STATIC_ENT(33, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_HEADERS, + 1524311232u), + MAKE_STATIC_ENT(34, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_HEADERS, + 1524311232u), + MAKE_STATIC_ENT(75, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_HEADERS, + 1524311232u), + MAKE_STATIC_ENT(76, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_METHODS, + 2175229868u), + MAKE_STATIC_ENT(77, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_METHODS, + 2175229868u), + MAKE_STATIC_ENT(78, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_METHODS, + 2175229868u), + MAKE_STATIC_ENT(35, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_ORIGIN, + 2710797292u), + MAKE_STATIC_ENT(79, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_EXPOSE_HEADERS, + 2449824425u), + MAKE_STATIC_ENT(80, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_REQUEST_HEADERS, + 3599549072u), + MAKE_STATIC_ENT(81, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_REQUEST_METHOD, + 2417078055u), + MAKE_STATIC_ENT(82, NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_REQUEST_METHOD, + 2417078055u), + MAKE_STATIC_ENT(2, NGHTTP3_QPACK_TOKEN_AGE, 742476188u), + MAKE_STATIC_ENT(83, NGHTTP3_QPACK_TOKEN_ALT_SVC, 2148877059u), + MAKE_STATIC_ENT(84, NGHTTP3_QPACK_TOKEN_AUTHORIZATION, 2436257726u), + MAKE_STATIC_ENT(36, NGHTTP3_QPACK_TOKEN_CACHE_CONTROL, 1355326669u), + MAKE_STATIC_ENT(37, NGHTTP3_QPACK_TOKEN_CACHE_CONTROL, 1355326669u), + MAKE_STATIC_ENT(38, NGHTTP3_QPACK_TOKEN_CACHE_CONTROL, 1355326669u), + MAKE_STATIC_ENT(39, NGHTTP3_QPACK_TOKEN_CACHE_CONTROL, 1355326669u), + MAKE_STATIC_ENT(40, NGHTTP3_QPACK_TOKEN_CACHE_CONTROL, 1355326669u), + MAKE_STATIC_ENT(41, NGHTTP3_QPACK_TOKEN_CACHE_CONTROL, 1355326669u), + MAKE_STATIC_ENT(3, NGHTTP3_QPACK_TOKEN_CONTENT_DISPOSITION, 3889184348u), + MAKE_STATIC_ENT(42, NGHTTP3_QPACK_TOKEN_CONTENT_ENCODING, 65203592u), + MAKE_STATIC_ENT(43, NGHTTP3_QPACK_TOKEN_CONTENT_ENCODING, 65203592u), + MAKE_STATIC_ENT(4, NGHTTP3_QPACK_TOKEN_CONTENT_LENGTH, 1308181789u), + MAKE_STATIC_ENT(85, NGHTTP3_QPACK_TOKEN_CONTENT_SECURITY_POLICY, 1569039836u), + MAKE_STATIC_ENT(44, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), + MAKE_STATIC_ENT(45, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), + MAKE_STATIC_ENT(46, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), + MAKE_STATIC_ENT(47, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), + MAKE_STATIC_ENT(48, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), + MAKE_STATIC_ENT(49, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), + MAKE_STATIC_ENT(50, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), + MAKE_STATIC_ENT(51, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), + MAKE_STATIC_ENT(52, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), + MAKE_STATIC_ENT(53, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), + MAKE_STATIC_ENT(54, NGHTTP3_QPACK_TOKEN_CONTENT_TYPE, 4244048277u), + MAKE_STATIC_ENT(5, NGHTTP3_QPACK_TOKEN_COOKIE, 2007449791u), + MAKE_STATIC_ENT(6, NGHTTP3_QPACK_TOKEN_DATE, 3564297305u), + MAKE_STATIC_ENT(86, NGHTTP3_QPACK_TOKEN_EARLY_DATA, 4080895051u), + MAKE_STATIC_ENT(7, NGHTTP3_QPACK_TOKEN_ETAG, 113792960u), + MAKE_STATIC_ENT(87, NGHTTP3_QPACK_TOKEN_EXPECT_CT, 1183214960u), + MAKE_STATIC_ENT(88, NGHTTP3_QPACK_TOKEN_FORWARDED, 1485178027u), + MAKE_STATIC_ENT(8, NGHTTP3_QPACK_TOKEN_IF_MODIFIED_SINCE, 2213050793u), + MAKE_STATIC_ENT(9, NGHTTP3_QPACK_TOKEN_IF_NONE_MATCH, 2536202615u), + MAKE_STATIC_ENT(89, NGHTTP3_QPACK_TOKEN_IF_RANGE, 2340978238u), + MAKE_STATIC_ENT(10, NGHTTP3_QPACK_TOKEN_LAST_MODIFIED, 3226950251u), + MAKE_STATIC_ENT(11, NGHTTP3_QPACK_TOKEN_LINK, 232457833u), + MAKE_STATIC_ENT(12, NGHTTP3_QPACK_TOKEN_LOCATION, 200649126u), + MAKE_STATIC_ENT(90, NGHTTP3_QPACK_TOKEN_ORIGIN, 3649018447u), + MAKE_STATIC_ENT(91, NGHTTP3_QPACK_TOKEN_PURPOSE, 4212263681u), + MAKE_STATIC_ENT(55, NGHTTP3_QPACK_TOKEN_RANGE, 4208725202u), + MAKE_STATIC_ENT(13, NGHTTP3_QPACK_TOKEN_REFERER, 3969579366u), + MAKE_STATIC_ENT(92, NGHTTP3_QPACK_TOKEN_SERVER, 1085029842u), + MAKE_STATIC_ENT(14, NGHTTP3_QPACK_TOKEN_SET_COOKIE, 1848371000u), + MAKE_STATIC_ENT(56, NGHTTP3_QPACK_TOKEN_STRICT_TRANSPORT_SECURITY, + 4138147361u), + MAKE_STATIC_ENT(57, NGHTTP3_QPACK_TOKEN_STRICT_TRANSPORT_SECURITY, + 4138147361u), + MAKE_STATIC_ENT(58, NGHTTP3_QPACK_TOKEN_STRICT_TRANSPORT_SECURITY, + 4138147361u), + MAKE_STATIC_ENT(93, NGHTTP3_QPACK_TOKEN_TIMING_ALLOW_ORIGIN, 2432297564u), + MAKE_STATIC_ENT(94, NGHTTP3_QPACK_TOKEN_UPGRADE_INSECURE_REQUESTS, + 2479169413u), + MAKE_STATIC_ENT(95, NGHTTP3_QPACK_TOKEN_USER_AGENT, 606444526u), + MAKE_STATIC_ENT(59, NGHTTP3_QPACK_TOKEN_VARY, 1085005381u), + MAKE_STATIC_ENT(60, NGHTTP3_QPACK_TOKEN_VARY, 1085005381u), + MAKE_STATIC_ENT(61, NGHTTP3_QPACK_TOKEN_X_CONTENT_TYPE_OPTIONS, 3644557769u), + MAKE_STATIC_ENT(96, NGHTTP3_QPACK_TOKEN_X_FORWARDED_FOR, 2914187656u), + MAKE_STATIC_ENT(97, NGHTTP3_QPACK_TOKEN_X_FRAME_OPTIONS, 3993834824u), + MAKE_STATIC_ENT(98, NGHTTP3_QPACK_TOKEN_X_FRAME_OPTIONS, 3993834824u), + MAKE_STATIC_ENT(62, NGHTTP3_QPACK_TOKEN_X_XSS_PROTECTION, 2501058888u), }; /* Make scalar initialization form of nghttp3_qpack_static_entry */ #define MAKE_STATIC_HD(N, V, T) \ { \ {NULL, (uint8_t *)(N), sizeof((N)) - 1, -1}, \ - {NULL, (uint8_t *)(V), sizeof((V)) - 1, -1}, T \ + {NULL, (uint8_t *)(V), sizeof((V)) - 1, -1}, \ + T, \ } static nghttp3_qpack_static_header stable[] = { - MAKE_STATIC_HD(":authority", "", NGHTTP3_QPACK_TOKEN__AUTHORITY), - MAKE_STATIC_HD(":path", "/", NGHTTP3_QPACK_TOKEN__PATH), - MAKE_STATIC_HD("age", "0", NGHTTP3_QPACK_TOKEN_AGE), - MAKE_STATIC_HD("content-disposition", "", - NGHTTP3_QPACK_TOKEN_CONTENT_DISPOSITION), - MAKE_STATIC_HD("content-length", "0", NGHTTP3_QPACK_TOKEN_CONTENT_LENGTH), - MAKE_STATIC_HD("cookie", "", NGHTTP3_QPACK_TOKEN_COOKIE), - MAKE_STATIC_HD("date", "", NGHTTP3_QPACK_TOKEN_DATE), - MAKE_STATIC_HD("etag", "", NGHTTP3_QPACK_TOKEN_ETAG), - MAKE_STATIC_HD("if-modified-since", "", - NGHTTP3_QPACK_TOKEN_IF_MODIFIED_SINCE), - MAKE_STATIC_HD("if-none-match", "", NGHTTP3_QPACK_TOKEN_IF_NONE_MATCH), - MAKE_STATIC_HD("last-modified", "", NGHTTP3_QPACK_TOKEN_LAST_MODIFIED), - MAKE_STATIC_HD("link", "", NGHTTP3_QPACK_TOKEN_LINK), - MAKE_STATIC_HD("location", "", NGHTTP3_QPACK_TOKEN_LOCATION), - MAKE_STATIC_HD("referer", "", NGHTTP3_QPACK_TOKEN_REFERER), - MAKE_STATIC_HD("set-cookie", "", NGHTTP3_QPACK_TOKEN_SET_COOKIE), - MAKE_STATIC_HD(":method", "CONNECT", NGHTTP3_QPACK_TOKEN__METHOD), - MAKE_STATIC_HD(":method", "DELETE", NGHTTP3_QPACK_TOKEN__METHOD), - MAKE_STATIC_HD(":method", "GET", NGHTTP3_QPACK_TOKEN__METHOD), - MAKE_STATIC_HD(":method", "HEAD", NGHTTP3_QPACK_TOKEN__METHOD), - MAKE_STATIC_HD(":method", "OPTIONS", NGHTTP3_QPACK_TOKEN__METHOD), - MAKE_STATIC_HD(":method", "POST", NGHTTP3_QPACK_TOKEN__METHOD), - MAKE_STATIC_HD(":method", "PUT", NGHTTP3_QPACK_TOKEN__METHOD), - MAKE_STATIC_HD(":scheme", "http", NGHTTP3_QPACK_TOKEN__SCHEME), - MAKE_STATIC_HD(":scheme", "https", NGHTTP3_QPACK_TOKEN__SCHEME), - MAKE_STATIC_HD(":status", "103", NGHTTP3_QPACK_TOKEN__STATUS), - MAKE_STATIC_HD(":status", "200", NGHTTP3_QPACK_TOKEN__STATUS), - MAKE_STATIC_HD(":status", "304", NGHTTP3_QPACK_TOKEN__STATUS), - MAKE_STATIC_HD(":status", "404", NGHTTP3_QPACK_TOKEN__STATUS), - MAKE_STATIC_HD(":status", "503", NGHTTP3_QPACK_TOKEN__STATUS), - MAKE_STATIC_HD("accept", "*/*", NGHTTP3_QPACK_TOKEN_ACCEPT), - MAKE_STATIC_HD("accept", "application/dns-message", - NGHTTP3_QPACK_TOKEN_ACCEPT), - MAKE_STATIC_HD("accept-encoding", "gzip, deflate, br", - NGHTTP3_QPACK_TOKEN_ACCEPT_ENCODING), - MAKE_STATIC_HD("accept-ranges", "bytes", NGHTTP3_QPACK_TOKEN_ACCEPT_RANGES), - MAKE_STATIC_HD("access-control-allow-headers", "cache-control", - NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_HEADERS), - MAKE_STATIC_HD("access-control-allow-headers", "content-type", - NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_HEADERS), - MAKE_STATIC_HD("access-control-allow-origin", "*", - NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_ORIGIN), - MAKE_STATIC_HD("cache-control", "max-age=0", - NGHTTP3_QPACK_TOKEN_CACHE_CONTROL), - MAKE_STATIC_HD("cache-control", "max-age=2592000", - NGHTTP3_QPACK_TOKEN_CACHE_CONTROL), - MAKE_STATIC_HD("cache-control", "max-age=604800", - NGHTTP3_QPACK_TOKEN_CACHE_CONTROL), - MAKE_STATIC_HD("cache-control", "no-cache", - NGHTTP3_QPACK_TOKEN_CACHE_CONTROL), - MAKE_STATIC_HD("cache-control", "no-store", - NGHTTP3_QPACK_TOKEN_CACHE_CONTROL), - MAKE_STATIC_HD("cache-control", "public, max-age=31536000", - NGHTTP3_QPACK_TOKEN_CACHE_CONTROL), - MAKE_STATIC_HD("content-encoding", "br", - NGHTTP3_QPACK_TOKEN_CONTENT_ENCODING), - MAKE_STATIC_HD("content-encoding", "gzip", - NGHTTP3_QPACK_TOKEN_CONTENT_ENCODING), - MAKE_STATIC_HD("content-type", "application/dns-message", - NGHTTP3_QPACK_TOKEN_CONTENT_TYPE), - MAKE_STATIC_HD("content-type", "application/javascript", - NGHTTP3_QPACK_TOKEN_CONTENT_TYPE), - MAKE_STATIC_HD("content-type", "application/json", - NGHTTP3_QPACK_TOKEN_CONTENT_TYPE), - MAKE_STATIC_HD("content-type", "application/x-www-form-urlencoded", - NGHTTP3_QPACK_TOKEN_CONTENT_TYPE), - MAKE_STATIC_HD("content-type", "image/gif", - NGHTTP3_QPACK_TOKEN_CONTENT_TYPE), - MAKE_STATIC_HD("content-type", "image/jpeg", - NGHTTP3_QPACK_TOKEN_CONTENT_TYPE), - MAKE_STATIC_HD("content-type", "image/png", - NGHTTP3_QPACK_TOKEN_CONTENT_TYPE), - MAKE_STATIC_HD("content-type", "text/css", - NGHTTP3_QPACK_TOKEN_CONTENT_TYPE), - MAKE_STATIC_HD("content-type", "text/html; charset=utf-8", - NGHTTP3_QPACK_TOKEN_CONTENT_TYPE), - MAKE_STATIC_HD("content-type", "text/plain", - NGHTTP3_QPACK_TOKEN_CONTENT_TYPE), - MAKE_STATIC_HD("content-type", "text/plain;charset=utf-8", - NGHTTP3_QPACK_TOKEN_CONTENT_TYPE), - MAKE_STATIC_HD("range", "bytes=0-", NGHTTP3_QPACK_TOKEN_RANGE), - MAKE_STATIC_HD("strict-transport-security", "max-age=31536000", - NGHTTP3_QPACK_TOKEN_STRICT_TRANSPORT_SECURITY), - MAKE_STATIC_HD("strict-transport-security", - "max-age=31536000; includesubdomains", - NGHTTP3_QPACK_TOKEN_STRICT_TRANSPORT_SECURITY), - MAKE_STATIC_HD("strict-transport-security", - "max-age=31536000; includesubdomains; preload", - NGHTTP3_QPACK_TOKEN_STRICT_TRANSPORT_SECURITY), - MAKE_STATIC_HD("vary", "accept-encoding", NGHTTP3_QPACK_TOKEN_VARY), - MAKE_STATIC_HD("vary", "origin", NGHTTP3_QPACK_TOKEN_VARY), - MAKE_STATIC_HD("x-content-type-options", "nosniff", - NGHTTP3_QPACK_TOKEN_X_CONTENT_TYPE_OPTIONS), - MAKE_STATIC_HD("x-xss-protection", "1; mode=block", - NGHTTP3_QPACK_TOKEN_X_XSS_PROTECTION), - MAKE_STATIC_HD(":status", "100", NGHTTP3_QPACK_TOKEN__STATUS), - MAKE_STATIC_HD(":status", "204", NGHTTP3_QPACK_TOKEN__STATUS), - MAKE_STATIC_HD(":status", "206", NGHTTP3_QPACK_TOKEN__STATUS), - MAKE_STATIC_HD(":status", "302", NGHTTP3_QPACK_TOKEN__STATUS), - MAKE_STATIC_HD(":status", "400", NGHTTP3_QPACK_TOKEN__STATUS), - MAKE_STATIC_HD(":status", "403", NGHTTP3_QPACK_TOKEN__STATUS), - MAKE_STATIC_HD(":status", "421", NGHTTP3_QPACK_TOKEN__STATUS), - MAKE_STATIC_HD(":status", "425", NGHTTP3_QPACK_TOKEN__STATUS), - MAKE_STATIC_HD(":status", "500", NGHTTP3_QPACK_TOKEN__STATUS), - MAKE_STATIC_HD("accept-language", "", NGHTTP3_QPACK_TOKEN_ACCEPT_LANGUAGE), - MAKE_STATIC_HD("access-control-allow-credentials", "FALSE", - NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_CREDENTIALS), - MAKE_STATIC_HD("access-control-allow-credentials", "TRUE", - NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_CREDENTIALS), - MAKE_STATIC_HD("access-control-allow-headers", "*", - NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_HEADERS), - MAKE_STATIC_HD("access-control-allow-methods", "get", - NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_METHODS), - MAKE_STATIC_HD("access-control-allow-methods", "get, post, options", - NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_METHODS), - MAKE_STATIC_HD("access-control-allow-methods", "options", - NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_METHODS), - MAKE_STATIC_HD("access-control-expose-headers", "content-length", - NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_EXPOSE_HEADERS), - MAKE_STATIC_HD("access-control-request-headers", "content-type", - NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_REQUEST_HEADERS), - MAKE_STATIC_HD("access-control-request-method", "get", - NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_REQUEST_METHOD), - MAKE_STATIC_HD("access-control-request-method", "post", - NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_REQUEST_METHOD), - MAKE_STATIC_HD("alt-svc", "clear", NGHTTP3_QPACK_TOKEN_ALT_SVC), - MAKE_STATIC_HD("authorization", "", NGHTTP3_QPACK_TOKEN_AUTHORIZATION), - MAKE_STATIC_HD("content-security-policy", - "script-src 'none'; object-src 'none'; base-uri 'none'", - NGHTTP3_QPACK_TOKEN_CONTENT_SECURITY_POLICY), - MAKE_STATIC_HD("early-data", "1", NGHTTP3_QPACK_TOKEN_EARLY_DATA), - MAKE_STATIC_HD("expect-ct", "", NGHTTP3_QPACK_TOKEN_EXPECT_CT), - MAKE_STATIC_HD("forwarded", "", NGHTTP3_QPACK_TOKEN_FORWARDED), - MAKE_STATIC_HD("if-range", "", NGHTTP3_QPACK_TOKEN_IF_RANGE), - MAKE_STATIC_HD("origin", "", NGHTTP3_QPACK_TOKEN_ORIGIN), - MAKE_STATIC_HD("purpose", "prefetch", NGHTTP3_QPACK_TOKEN_PURPOSE), - MAKE_STATIC_HD("server", "", NGHTTP3_QPACK_TOKEN_SERVER), - MAKE_STATIC_HD("timing-allow-origin", "*", - NGHTTP3_QPACK_TOKEN_TIMING_ALLOW_ORIGIN), - MAKE_STATIC_HD("upgrade-insecure-requests", "1", - NGHTTP3_QPACK_TOKEN_UPGRADE_INSECURE_REQUESTS), - MAKE_STATIC_HD("user-agent", "", NGHTTP3_QPACK_TOKEN_USER_AGENT), - MAKE_STATIC_HD("x-forwarded-for", "", NGHTTP3_QPACK_TOKEN_X_FORWARDED_FOR), - MAKE_STATIC_HD("x-frame-options", "deny", - NGHTTP3_QPACK_TOKEN_X_FRAME_OPTIONS), - MAKE_STATIC_HD("x-frame-options", "sameorigin", - NGHTTP3_QPACK_TOKEN_X_FRAME_OPTIONS), + MAKE_STATIC_HD(":authority", "", NGHTTP3_QPACK_TOKEN__AUTHORITY), + MAKE_STATIC_HD(":path", "/", NGHTTP3_QPACK_TOKEN__PATH), + MAKE_STATIC_HD("age", "0", NGHTTP3_QPACK_TOKEN_AGE), + MAKE_STATIC_HD("content-disposition", "", + NGHTTP3_QPACK_TOKEN_CONTENT_DISPOSITION), + MAKE_STATIC_HD("content-length", "0", NGHTTP3_QPACK_TOKEN_CONTENT_LENGTH), + MAKE_STATIC_HD("cookie", "", NGHTTP3_QPACK_TOKEN_COOKIE), + MAKE_STATIC_HD("date", "", NGHTTP3_QPACK_TOKEN_DATE), + MAKE_STATIC_HD("etag", "", NGHTTP3_QPACK_TOKEN_ETAG), + MAKE_STATIC_HD("if-modified-since", "", + NGHTTP3_QPACK_TOKEN_IF_MODIFIED_SINCE), + MAKE_STATIC_HD("if-none-match", "", NGHTTP3_QPACK_TOKEN_IF_NONE_MATCH), + MAKE_STATIC_HD("last-modified", "", NGHTTP3_QPACK_TOKEN_LAST_MODIFIED), + MAKE_STATIC_HD("link", "", NGHTTP3_QPACK_TOKEN_LINK), + MAKE_STATIC_HD("location", "", NGHTTP3_QPACK_TOKEN_LOCATION), + MAKE_STATIC_HD("referer", "", NGHTTP3_QPACK_TOKEN_REFERER), + MAKE_STATIC_HD("set-cookie", "", NGHTTP3_QPACK_TOKEN_SET_COOKIE), + MAKE_STATIC_HD(":method", "CONNECT", NGHTTP3_QPACK_TOKEN__METHOD), + MAKE_STATIC_HD(":method", "DELETE", NGHTTP3_QPACK_TOKEN__METHOD), + MAKE_STATIC_HD(":method", "GET", NGHTTP3_QPACK_TOKEN__METHOD), + MAKE_STATIC_HD(":method", "HEAD", NGHTTP3_QPACK_TOKEN__METHOD), + MAKE_STATIC_HD(":method", "OPTIONS", NGHTTP3_QPACK_TOKEN__METHOD), + MAKE_STATIC_HD(":method", "POST", NGHTTP3_QPACK_TOKEN__METHOD), + MAKE_STATIC_HD(":method", "PUT", NGHTTP3_QPACK_TOKEN__METHOD), + MAKE_STATIC_HD(":scheme", "http", NGHTTP3_QPACK_TOKEN__SCHEME), + MAKE_STATIC_HD(":scheme", "https", NGHTTP3_QPACK_TOKEN__SCHEME), + MAKE_STATIC_HD(":status", "103", NGHTTP3_QPACK_TOKEN__STATUS), + MAKE_STATIC_HD(":status", "200", NGHTTP3_QPACK_TOKEN__STATUS), + MAKE_STATIC_HD(":status", "304", NGHTTP3_QPACK_TOKEN__STATUS), + MAKE_STATIC_HD(":status", "404", NGHTTP3_QPACK_TOKEN__STATUS), + MAKE_STATIC_HD(":status", "503", NGHTTP3_QPACK_TOKEN__STATUS), + MAKE_STATIC_HD("accept", "*/*", NGHTTP3_QPACK_TOKEN_ACCEPT), + MAKE_STATIC_HD("accept", "application/dns-message", + NGHTTP3_QPACK_TOKEN_ACCEPT), + MAKE_STATIC_HD("accept-encoding", "gzip, deflate, br", + NGHTTP3_QPACK_TOKEN_ACCEPT_ENCODING), + MAKE_STATIC_HD("accept-ranges", "bytes", NGHTTP3_QPACK_TOKEN_ACCEPT_RANGES), + MAKE_STATIC_HD("access-control-allow-headers", "cache-control", + NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_HEADERS), + MAKE_STATIC_HD("access-control-allow-headers", "content-type", + NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_HEADERS), + MAKE_STATIC_HD("access-control-allow-origin", "*", + NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_ORIGIN), + MAKE_STATIC_HD("cache-control", "max-age=0", + NGHTTP3_QPACK_TOKEN_CACHE_CONTROL), + MAKE_STATIC_HD("cache-control", "max-age=2592000", + NGHTTP3_QPACK_TOKEN_CACHE_CONTROL), + MAKE_STATIC_HD("cache-control", "max-age=604800", + NGHTTP3_QPACK_TOKEN_CACHE_CONTROL), + MAKE_STATIC_HD("cache-control", "no-cache", + NGHTTP3_QPACK_TOKEN_CACHE_CONTROL), + MAKE_STATIC_HD("cache-control", "no-store", + NGHTTP3_QPACK_TOKEN_CACHE_CONTROL), + MAKE_STATIC_HD("cache-control", "public, max-age=31536000", + NGHTTP3_QPACK_TOKEN_CACHE_CONTROL), + MAKE_STATIC_HD("content-encoding", "br", + NGHTTP3_QPACK_TOKEN_CONTENT_ENCODING), + MAKE_STATIC_HD("content-encoding", "gzip", + NGHTTP3_QPACK_TOKEN_CONTENT_ENCODING), + MAKE_STATIC_HD("content-type", "application/dns-message", + NGHTTP3_QPACK_TOKEN_CONTENT_TYPE), + MAKE_STATIC_HD("content-type", "application/javascript", + NGHTTP3_QPACK_TOKEN_CONTENT_TYPE), + MAKE_STATIC_HD("content-type", "application/json", + NGHTTP3_QPACK_TOKEN_CONTENT_TYPE), + MAKE_STATIC_HD("content-type", "application/x-www-form-urlencoded", + NGHTTP3_QPACK_TOKEN_CONTENT_TYPE), + MAKE_STATIC_HD("content-type", "image/gif", NGHTTP3_QPACK_TOKEN_CONTENT_TYPE), + MAKE_STATIC_HD("content-type", "image/jpeg", + NGHTTP3_QPACK_TOKEN_CONTENT_TYPE), + MAKE_STATIC_HD("content-type", "image/png", NGHTTP3_QPACK_TOKEN_CONTENT_TYPE), + MAKE_STATIC_HD("content-type", "text/css", NGHTTP3_QPACK_TOKEN_CONTENT_TYPE), + MAKE_STATIC_HD("content-type", "text/html; charset=utf-8", + NGHTTP3_QPACK_TOKEN_CONTENT_TYPE), + MAKE_STATIC_HD("content-type", "text/plain", + NGHTTP3_QPACK_TOKEN_CONTENT_TYPE), + MAKE_STATIC_HD("content-type", "text/plain;charset=utf-8", + NGHTTP3_QPACK_TOKEN_CONTENT_TYPE), + MAKE_STATIC_HD("range", "bytes=0-", NGHTTP3_QPACK_TOKEN_RANGE), + MAKE_STATIC_HD("strict-transport-security", "max-age=31536000", + NGHTTP3_QPACK_TOKEN_STRICT_TRANSPORT_SECURITY), + MAKE_STATIC_HD("strict-transport-security", + "max-age=31536000; includesubdomains", + NGHTTP3_QPACK_TOKEN_STRICT_TRANSPORT_SECURITY), + MAKE_STATIC_HD("strict-transport-security", + "max-age=31536000; includesubdomains; preload", + NGHTTP3_QPACK_TOKEN_STRICT_TRANSPORT_SECURITY), + MAKE_STATIC_HD("vary", "accept-encoding", NGHTTP3_QPACK_TOKEN_VARY), + MAKE_STATIC_HD("vary", "origin", NGHTTP3_QPACK_TOKEN_VARY), + MAKE_STATIC_HD("x-content-type-options", "nosniff", + NGHTTP3_QPACK_TOKEN_X_CONTENT_TYPE_OPTIONS), + MAKE_STATIC_HD("x-xss-protection", "1; mode=block", + NGHTTP3_QPACK_TOKEN_X_XSS_PROTECTION), + MAKE_STATIC_HD(":status", "100", NGHTTP3_QPACK_TOKEN__STATUS), + MAKE_STATIC_HD(":status", "204", NGHTTP3_QPACK_TOKEN__STATUS), + MAKE_STATIC_HD(":status", "206", NGHTTP3_QPACK_TOKEN__STATUS), + MAKE_STATIC_HD(":status", "302", NGHTTP3_QPACK_TOKEN__STATUS), + MAKE_STATIC_HD(":status", "400", NGHTTP3_QPACK_TOKEN__STATUS), + MAKE_STATIC_HD(":status", "403", NGHTTP3_QPACK_TOKEN__STATUS), + MAKE_STATIC_HD(":status", "421", NGHTTP3_QPACK_TOKEN__STATUS), + MAKE_STATIC_HD(":status", "425", NGHTTP3_QPACK_TOKEN__STATUS), + MAKE_STATIC_HD(":status", "500", NGHTTP3_QPACK_TOKEN__STATUS), + MAKE_STATIC_HD("accept-language", "", NGHTTP3_QPACK_TOKEN_ACCEPT_LANGUAGE), + MAKE_STATIC_HD("access-control-allow-credentials", "FALSE", + NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_CREDENTIALS), + MAKE_STATIC_HD("access-control-allow-credentials", "TRUE", + NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_CREDENTIALS), + MAKE_STATIC_HD("access-control-allow-headers", "*", + NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_HEADERS), + MAKE_STATIC_HD("access-control-allow-methods", "get", + NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_METHODS), + MAKE_STATIC_HD("access-control-allow-methods", "get, post, options", + NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_METHODS), + MAKE_STATIC_HD("access-control-allow-methods", "options", + NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_ALLOW_METHODS), + MAKE_STATIC_HD("access-control-expose-headers", "content-length", + NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_EXPOSE_HEADERS), + MAKE_STATIC_HD("access-control-request-headers", "content-type", + NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_REQUEST_HEADERS), + MAKE_STATIC_HD("access-control-request-method", "get", + NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_REQUEST_METHOD), + MAKE_STATIC_HD("access-control-request-method", "post", + NGHTTP3_QPACK_TOKEN_ACCESS_CONTROL_REQUEST_METHOD), + MAKE_STATIC_HD("alt-svc", "clear", NGHTTP3_QPACK_TOKEN_ALT_SVC), + MAKE_STATIC_HD("authorization", "", NGHTTP3_QPACK_TOKEN_AUTHORIZATION), + MAKE_STATIC_HD("content-security-policy", + "script-src 'none'; object-src 'none'; base-uri 'none'", + NGHTTP3_QPACK_TOKEN_CONTENT_SECURITY_POLICY), + MAKE_STATIC_HD("early-data", "1", NGHTTP3_QPACK_TOKEN_EARLY_DATA), + MAKE_STATIC_HD("expect-ct", "", NGHTTP3_QPACK_TOKEN_EXPECT_CT), + MAKE_STATIC_HD("forwarded", "", NGHTTP3_QPACK_TOKEN_FORWARDED), + MAKE_STATIC_HD("if-range", "", NGHTTP3_QPACK_TOKEN_IF_RANGE), + MAKE_STATIC_HD("origin", "", NGHTTP3_QPACK_TOKEN_ORIGIN), + MAKE_STATIC_HD("purpose", "prefetch", NGHTTP3_QPACK_TOKEN_PURPOSE), + MAKE_STATIC_HD("server", "", NGHTTP3_QPACK_TOKEN_SERVER), + MAKE_STATIC_HD("timing-allow-origin", "*", + NGHTTP3_QPACK_TOKEN_TIMING_ALLOW_ORIGIN), + MAKE_STATIC_HD("upgrade-insecure-requests", "1", + NGHTTP3_QPACK_TOKEN_UPGRADE_INSECURE_REQUESTS), + MAKE_STATIC_HD("user-agent", "", NGHTTP3_QPACK_TOKEN_USER_AGENT), + MAKE_STATIC_HD("x-forwarded-for", "", NGHTTP3_QPACK_TOKEN_X_FORWARDED_FOR), + MAKE_STATIC_HD("x-frame-options", "deny", + NGHTTP3_QPACK_TOKEN_X_FRAME_OPTIONS), + MAKE_STATIC_HD("x-frame-options", "sameorigin", + NGHTTP3_QPACK_TOKEN_X_FRAME_OPTIONS), }; static int memeq(const void *s1, const void *s2, size_t n) { @@ -884,9 +879,9 @@ static void qpack_context_free(nghttp3_qpack_context *ctx) { static int ref_min_cnt_less(const nghttp3_pq_entry *lhsx, const nghttp3_pq_entry *rhsx) { nghttp3_qpack_header_block_ref *lhs = - nghttp3_struct_of(lhsx, nghttp3_qpack_header_block_ref, min_cnts_pe); + nghttp3_struct_of(lhsx, nghttp3_qpack_header_block_ref, min_cnts_pe); nghttp3_qpack_header_block_ref *rhs = - nghttp3_struct_of(rhsx, nghttp3_qpack_header_block_ref, min_cnts_pe); + nghttp3_struct_of(rhsx, nghttp3_qpack_header_block_ref, min_cnts_pe); return lhs->min_cnt < rhs->min_cnt; } @@ -926,6 +921,7 @@ int nghttp3_qpack_encoder_init(nghttp3_qpack_encoder *encoder, encoder->opcode = 0; encoder->min_dtable_update = SIZE_MAX; encoder->last_max_dtable_update = 0; + encoder->uninterrupted_decoderlen = 0; encoder->flags = NGHTTP3_QPACK_ENCODER_FLAG_NONE; nghttp3_qpack_read_state_reset(&encoder->rstate); @@ -943,16 +939,16 @@ static int map_stream_free(void *data, void *ptr) { void nghttp3_qpack_encoder_free(nghttp3_qpack_encoder *encoder) { nghttp3_pq_free(&encoder->min_cnts); nghttp3_ksl_free(&encoder->blocked_streams); - nghttp3_map_each_free(&encoder->streams, map_stream_free, - (void *)encoder->ctx.mem); + nghttp3_map_each(&encoder->streams, map_stream_free, + (void *)encoder->ctx.mem); nghttp3_map_free(&encoder->streams); qpack_context_free(&encoder->ctx); } void nghttp3_qpack_encoder_set_max_dtable_capacity( - nghttp3_qpack_encoder *encoder, size_t max_dtable_capacity) { - max_dtable_capacity = - nghttp3_min(max_dtable_capacity, encoder->ctx.hard_max_dtable_capacity); + nghttp3_qpack_encoder *encoder, size_t max_dtable_capacity) { + max_dtable_capacity = nghttp3_min_size(max_dtable_capacity, + encoder->ctx.hard_max_dtable_capacity); if (encoder->ctx.max_dtable_capacity == max_dtable_capacity) { return; @@ -968,7 +964,7 @@ void nghttp3_qpack_encoder_set_max_dtable_capacity( } void nghttp3_qpack_encoder_set_max_blocked_streams( - nghttp3_qpack_encoder *encoder, size_t max_blocked_streams) { + nghttp3_qpack_encoder *encoder, size_t max_blocked_streams) { encoder->ctx.max_blocked_streams = max_blocked_streams; } @@ -977,7 +973,7 @@ uint64_t nghttp3_qpack_encoder_get_min_cnt(nghttp3_qpack_encoder *encoder) { return nghttp3_struct_of(nghttp3_pq_top(&encoder->min_cnts), nghttp3_qpack_header_block_ref, min_cnts_pe) - ->min_cnt; + ->min_cnt; } void nghttp3_qpack_encoder_shrink_dtable(nghttp3_qpack_encoder *encoder) { @@ -1003,7 +999,7 @@ void nghttp3_qpack_encoder_shrink_dtable(nghttp3_qpack_encoder *encoder) { } encoder->ctx.dtable_size -= - table_space(ent->nv.name->len, ent->nv.value->len); + table_space(ent->nv.name->len, ent->nv.value->len); nghttp3_ringbuf_pop_back(dtable); qpack_map_remove(&encoder->dtable_map, ent); @@ -1088,8 +1084,8 @@ static void qpack_encoder_remove_stream(nghttp3_qpack_encoder *encoder, len = nghttp3_ringbuf_len(&stream->refs); for (i = 0; i < len; ++i) { - ref = *(nghttp3_qpack_header_block_ref **)nghttp3_ringbuf_get(&stream->refs, - i); + ref = + *(nghttp3_qpack_header_block_ref **)nghttp3_ringbuf_get(&stream->refs, i); assert(ref->min_cnts_pe.index != NGHTTP3_PQ_BAD_INDEX); @@ -1098,11 +1094,9 @@ static void qpack_encoder_remove_stream(nghttp3_qpack_encoder *encoder, } /* - * reserve_buf_internal ensures that |buf| contains at least - * |extra_size| of free space. In other words, if this function - * succeeds, nghttp3_buf_left(buf) >= extra_size holds. |min_size| is - * the minimum size of buffer. The allocated buffer has at least - * |min_size| bytes. + * reserve_buf ensures that |buf| contains at least |extra_size| of + * free space. In other words, if this function succeeds, + * nghttp3_buf_left(buf) >= extra_size holds. * * This function returns 0 if it succeeds, or one of the following * negative error codes: @@ -1110,31 +1104,37 @@ static void qpack_encoder_remove_stream(nghttp3_qpack_encoder *encoder, * NGHTTP3_ERR_NOMEM * Out of memory. */ -static int reserve_buf_internal(nghttp3_buf *buf, size_t extra_size, - size_t min_size, const nghttp3_mem *mem) { +static int reserve_buf(nghttp3_buf *buf, size_t extra_size, + const nghttp3_mem *mem) { size_t left = nghttp3_buf_left(buf); - size_t n = min_size, need; + size_t n = 32; if (left >= extra_size) { return 0; } - need = nghttp3_buf_cap(buf) + extra_size - left; - - for (; n < need; n *= 2) - ; + n = nghttp3_max_size(n, nghttp3_buf_cap(buf) + extra_size - left); - return nghttp3_buf_reserve(buf, n, mem); -} + /* Check whether we are requesting too much memory */ + if (n > (1u << 31)) { + return NGHTTP3_ERR_NOMEM; + } -static int reserve_buf_small(nghttp3_buf *buf, size_t extra_size, - const nghttp3_mem *mem) { - return reserve_buf_internal(buf, extra_size, 32, mem); -} +#ifndef WIN32 + n = 1u << (32 - __builtin_clz((uint32_t)n - 1)); +#else /* defined(WIN32) */ + /* Round up to the next highest power of 2 from Bit Twiddling + Hacks */ + --n; + n |= n >> 1; + n |= n >> 2; + n |= n >> 4; + n |= n >> 8; + n |= n >> 16; + ++n; +#endif /* defined(WIN32) */ -static int reserve_buf(nghttp3_buf *buf, size_t extra_size, - const nghttp3_mem *mem) { - return reserve_buf_internal(buf, extra_size, 32, mem); + return nghttp3_buf_reserve(buf, n, mem); } int nghttp3_qpack_encoder_encode(nghttp3_qpack_encoder *encoder, @@ -1162,10 +1162,10 @@ int nghttp3_qpack_encoder_encode(nghttp3_qpack_encoder *encoder, stream = nghttp3_qpack_encoder_find_stream(encoder, stream_id); blocked_stream = - stream && nghttp3_qpack_encoder_stream_is_blocked(encoder, stream); + stream && nghttp3_qpack_encoder_stream_is_blocked(encoder, stream); allow_blocking = - blocked_stream || encoder->ctx.max_blocked_streams > - nghttp3_ksl_len(&encoder->blocked_streams); + blocked_stream || encoder->ctx.max_blocked_streams > + nghttp3_ksl_len(&encoder->blocked_streams); DEBUGF("qpack::encode: stream %ld blocked=%d allow_blocking=%d\n", stream_id, blocked_stream, allow_blocking); @@ -1181,13 +1181,15 @@ int nghttp3_qpack_encoder_encode(nghttp3_qpack_encoder *encoder, nghttp3_qpack_encoder_write_field_section_prefix(encoder, pbuf, max_cnt, base); + encoder->uninterrupted_decoderlen = 0; + /* TODO If max_cnt == 0, no reference is made to dtable. */ if (!max_cnt) { return 0; } - rv = qpack_encoder_add_stream_ref(encoder, stream_id, stream, max_cnt, - min_cnt); + rv = + qpack_encoder_add_stream_ref(encoder, stream_id, stream, max_cnt, min_cnt); if (rv != 0) { goto fail; } @@ -1253,7 +1255,7 @@ int nghttp3_qpack_encoder_process_dtable_update(nghttp3_qpack_encoder *encoder, } rv = nghttp3_qpack_encoder_write_set_dtable_cap( - encoder, ebuf, encoder->last_max_dtable_update); + encoder, ebuf, encoder->last_max_dtable_update); if (rv != 0) { return rv; } @@ -1374,7 +1376,7 @@ static int qpack_encoder_can_index(nghttp3_qpack_encoder *encoder, size_t need, if (!nghttp3_pq_empty(&encoder->min_cnts)) { gmin_cnt = nghttp3_qpack_encoder_get_min_cnt(encoder); - min_cnt = nghttp3_min(min_cnt, gmin_cnt); + min_cnt = nghttp3_min_uint64(min_cnt, gmin_cnt); } if (min_cnt == UINT64_MAX) { @@ -1402,7 +1404,7 @@ static int qpack_encoder_can_index(nghttp3_qpack_encoder *encoder, size_t need, static int qpack_encoder_can_index_nv(nghttp3_qpack_encoder *encoder, const nghttp3_nv *nv, uint64_t min_cnt) { return qpack_encoder_can_index( - encoder, table_space(nv->namelen, nv->valuelen), min_cnt); + encoder, table_space(nv->namelen, nv->valuelen), min_cnt); } /* @@ -1415,10 +1417,10 @@ static int qpack_encoder_can_index_duplicate(nghttp3_qpack_encoder *encoder, uint64_t absidx, uint64_t min_cnt) { nghttp3_qpack_entry *ent = - nghttp3_qpack_context_dtable_get(&encoder->ctx, absidx); + nghttp3_qpack_context_dtable_get(&encoder->ctx, absidx); return qpack_encoder_can_index( - encoder, table_space(ent->nv.name->len, ent->nv.value->len), min_cnt); + encoder, table_space(ent->nv.name->len, ent->nv.value->len), min_cnt); } /* @@ -1428,7 +1430,7 @@ static int qpack_encoder_can_index_duplicate(nghttp3_qpack_encoder *encoder, static int qpack_context_check_draining(nghttp3_qpack_context *ctx, uint64_t absidx) { const size_t safe = ctx->max_dtable_capacity - - nghttp3_min(512, ctx->max_dtable_capacity * 1 / 8); + nghttp3_min_size(512, ctx->max_dtable_capacity * 1 / 8); nghttp3_qpack_entry *ent = nghttp3_qpack_context_dtable_get(ctx, absidx); return ctx->dtable_sum - ent->sum > safe; @@ -1483,11 +1485,10 @@ int nghttp3_qpack_encoder_encode_nv(nghttp3_qpack_encoder *encoder, } if (nghttp3_map_size(&encoder->streams) < NGHTTP3_QPACK_MAX_QPACK_STREAMS) { - dres = nghttp3_qpack_encoder_lookup_dtable(encoder, nv, token, hash, - indexing_mode, encoder->krcnt, - allow_blocking); - just_index = indexing_mode == NGHTTP3_QPACK_INDEXING_MODE_STORE && - dres.pb_index == -1; + dres = nghttp3_qpack_encoder_lookup_dtable( + encoder, nv, token, hash, indexing_mode, encoder->krcnt, allow_blocking); + just_index = + indexing_mode == NGHTTP3_QPACK_INDEXING_MODE_STORE && dres.pb_index == -1; } if (dres.index != -1 && dres.name_value_match) { @@ -1500,8 +1501,8 @@ int nghttp3_qpack_encoder_encode_nv(nghttp3_qpack_encoder *encoder, if (rv != 0) { return rv; } - rv = nghttp3_qpack_encoder_dtable_duplicate_add(encoder, - (size_t)dres.index); + rv = + nghttp3_qpack_encoder_dtable_duplicate_add(encoder, (size_t)dres.index); if (rv != 0) { return rv; } @@ -1509,11 +1510,11 @@ int nghttp3_qpack_encoder_encode_nv(nghttp3_qpack_encoder *encoder, new_ent = nghttp3_qpack_context_dtable_top(&encoder->ctx); dres.index = (nghttp3_ssize)new_ent->absidx; } - *pmax_cnt = nghttp3_max(*pmax_cnt, (size_t)(dres.index + 1)); - *pmin_cnt = nghttp3_min(*pmin_cnt, (size_t)(dres.index + 1)); + *pmax_cnt = nghttp3_max_uint64(*pmax_cnt, (uint64_t)(dres.index + 1)); + *pmin_cnt = nghttp3_min_uint64(*pmin_cnt, (uint64_t)(dres.index + 1)); return nghttp3_qpack_encoder_write_dynamic_indexed( - encoder, rbuf, (size_t)dres.index, base); + encoder, rbuf, (size_t)dres.index, base); } if (sres.index != -1) { @@ -1530,24 +1531,25 @@ int nghttp3_qpack_encoder_encode_nv(nghttp3_qpack_encoder *encoder, } if (allow_blocking) { new_ent = nghttp3_qpack_context_dtable_top(&encoder->ctx); - *pmax_cnt = nghttp3_max(*pmax_cnt, new_ent->absidx + 1); - *pmin_cnt = nghttp3_min(*pmin_cnt, new_ent->absidx + 1); + *pmax_cnt = nghttp3_max_uint64(*pmax_cnt, new_ent->absidx + 1); + *pmin_cnt = nghttp3_min_uint64(*pmin_cnt, new_ent->absidx + 1); return nghttp3_qpack_encoder_write_dynamic_indexed( - encoder, rbuf, new_ent->absidx, base); + encoder, rbuf, new_ent->absidx, base); } } return nghttp3_qpack_encoder_write_static_indexed_name( - encoder, rbuf, (size_t)sres.index, nv); + encoder, rbuf, (size_t)sres.index, nv); } if (dres.index != -1) { if (just_index && qpack_encoder_can_index_nv( - encoder, nv, - allow_blocking ? *pmin_cnt - : nghttp3_min((size_t)dres.index + 1, *pmin_cnt))) { + encoder, nv, + allow_blocking + ? *pmin_cnt + : nghttp3_min_uint64((uint64_t)dres.index + 1, *pmin_cnt))) { rv = nghttp3_qpack_encoder_write_dynamic_insert(encoder, ebuf, (size_t)dres.index, nv); if (rv != 0) { @@ -1555,7 +1557,7 @@ int nghttp3_qpack_encoder_encode_nv(nghttp3_qpack_encoder *encoder, } if (!allow_blocking) { - *pmin_cnt = nghttp3_min(*pmin_cnt, (size_t)dres.index + 1); + *pmin_cnt = nghttp3_min_uint64(*pmin_cnt, (uint64_t)dres.index + 1); } rv = nghttp3_qpack_encoder_dtable_dynamic_add(encoder, (size_t)dres.index, @@ -1566,19 +1568,19 @@ int nghttp3_qpack_encoder_encode_nv(nghttp3_qpack_encoder *encoder, if (allow_blocking) { new_ent = nghttp3_qpack_context_dtable_top(&encoder->ctx); - *pmax_cnt = nghttp3_max(*pmax_cnt, new_ent->absidx + 1); - *pmin_cnt = nghttp3_min(*pmin_cnt, new_ent->absidx + 1); + *pmax_cnt = nghttp3_max_uint64(*pmax_cnt, new_ent->absidx + 1); + *pmin_cnt = nghttp3_min_uint64(*pmin_cnt, new_ent->absidx + 1); return nghttp3_qpack_encoder_write_dynamic_indexed( - encoder, rbuf, new_ent->absidx, base); + encoder, rbuf, new_ent->absidx, base); } } - *pmax_cnt = nghttp3_max(*pmax_cnt, (size_t)(dres.index + 1)); - *pmin_cnt = nghttp3_min(*pmin_cnt, (size_t)(dres.index + 1)); + *pmax_cnt = nghttp3_max_uint64(*pmax_cnt, (uint64_t)(dres.index + 1)); + *pmin_cnt = nghttp3_min_uint64(*pmin_cnt, (uint64_t)(dres.index + 1)); return nghttp3_qpack_encoder_write_dynamic_indexed_name( - encoder, rbuf, (size_t)dres.index, base, nv); + encoder, rbuf, (size_t)dres.index, base, nv); } if (just_index && qpack_encoder_can_index_nv(encoder, nv, *pmin_cnt)) { @@ -1592,8 +1594,8 @@ int nghttp3_qpack_encoder_encode_nv(nghttp3_qpack_encoder *encoder, } if (allow_blocking) { new_ent = nghttp3_qpack_context_dtable_top(&encoder->ctx); - *pmax_cnt = nghttp3_max(*pmax_cnt, new_ent->absidx + 1); - *pmin_cnt = nghttp3_min(*pmin_cnt, new_ent->absidx + 1); + *pmax_cnt = nghttp3_max_uint64(*pmax_cnt, new_ent->absidx + 1); + *pmin_cnt = nghttp3_min_uint64(*pmin_cnt, new_ent->absidx + 1); return nghttp3_qpack_encoder_write_dynamic_indexed(encoder, rbuf, new_ent->absidx, base); @@ -1634,9 +1636,9 @@ nghttp3_qpack_lookup_stable(const nghttp3_nv *nv, int32_t token, } nghttp3_qpack_lookup_result nghttp3_qpack_encoder_lookup_dtable( - nghttp3_qpack_encoder *encoder, const nghttp3_nv *nv, int32_t token, - uint32_t hash, nghttp3_qpack_indexing_mode indexing_mode, uint64_t krcnt, - int allow_blocking) { + nghttp3_qpack_encoder *encoder, const nghttp3_nv *nv, int32_t token, + uint32_t hash, nghttp3_qpack_indexing_mode indexing_mode, uint64_t krcnt, + int allow_blocking) { nghttp3_qpack_lookup_result res = {-1, 0, -1}; int exact_match = 0; nghttp3_qpack_entry *match, *pb_match; @@ -1659,7 +1661,7 @@ int nghttp3_qpack_header_block_ref_new(nghttp3_qpack_header_block_ref **pref, uint64_t max_cnt, uint64_t min_cnt, const nghttp3_mem *mem) { nghttp3_qpack_header_block_ref *ref = - nghttp3_mem_malloc(mem, sizeof(nghttp3_qpack_header_block_ref)); + nghttp3_mem_malloc(mem, sizeof(nghttp3_qpack_header_block_ref)); if (ref == NULL) { return NGHTTP3_ERR_NOMEM; @@ -1683,9 +1685,9 @@ void nghttp3_qpack_header_block_ref_del(nghttp3_qpack_header_block_ref *ref, static int ref_max_cnt_greater(const nghttp3_pq_entry *lhsx, const nghttp3_pq_entry *rhsx) { const nghttp3_qpack_header_block_ref *lhs = - nghttp3_struct_of(lhsx, nghttp3_qpack_header_block_ref, max_cnts_pe); + nghttp3_struct_of(lhsx, nghttp3_qpack_header_block_ref, max_cnts_pe); const nghttp3_qpack_header_block_ref *rhs = - nghttp3_struct_of(rhsx, nghttp3_qpack_header_block_ref, max_cnts_pe); + nghttp3_struct_of(rhsx, nghttp3_qpack_header_block_ref, max_cnts_pe); return lhs->max_cnt > rhs->max_cnt; } @@ -1729,8 +1731,8 @@ void nghttp3_qpack_stream_del(nghttp3_qpack_stream *stream, len = nghttp3_ringbuf_len(&stream->refs); for (i = 0; i < len; ++i) { - ref = *(nghttp3_qpack_header_block_ref **)nghttp3_ringbuf_get(&stream->refs, - i); + ref = + *(nghttp3_qpack_header_block_ref **)nghttp3_ringbuf_get(&stream->refs, i); nghttp3_qpack_header_block_ref_del(ref, mem); } @@ -1776,7 +1778,7 @@ void nghttp3_qpack_stream_pop_ref(nghttp3_qpack_stream *stream) { assert(nghttp3_ringbuf_len(&stream->refs)); ref = - *(nghttp3_qpack_header_block_ref **)nghttp3_ringbuf_get(&stream->refs, 0); + *(nghttp3_qpack_header_block_ref **)nghttp3_ringbuf_get(&stream->refs, 0); assert(ref->max_cnts_pe.index != NGHTTP3_PQ_BAD_INDEX); @@ -1832,7 +1834,7 @@ static int qpack_encoder_write_indexed_name(nghttp3_qpack_encoder *encoder, int h = 0; hlen = nghttp3_qpack_huffman_encode_count(nv->value, nv->valuelen); - if (hlen < nv->valuelen) { + if (hlen * 4 < nv->valuelen * 3) { h = 1; len += nghttp3_qpack_put_varint_len(hlen, 7) + hlen; } else { @@ -1869,10 +1871,10 @@ static int qpack_encoder_write_indexed_name(nghttp3_qpack_encoder *encoder, } int nghttp3_qpack_encoder_write_static_indexed_name( - nghttp3_qpack_encoder *encoder, nghttp3_buf *rbuf, uint64_t absidx, - const nghttp3_nv *nv) { + nghttp3_qpack_encoder *encoder, nghttp3_buf *rbuf, uint64_t absidx, + const nghttp3_nv *nv) { uint8_t fb = - (uint8_t)(0x50 | ((nv->flags & NGHTTP3_NV_FLAG_NEVER_INDEX) ? 0x20 : 0)); + (uint8_t)(0x50 | ((nv->flags & NGHTTP3_NV_FLAG_NEVER_INDEX) ? 0x20 : 0)); DEBUGF("qpack::encode: Literal Field Line With Name Reference (static) " "absidx=%" PRIu64 " never=%d\n", @@ -1881,8 +1883,8 @@ int nghttp3_qpack_encoder_write_static_indexed_name( } int nghttp3_qpack_encoder_write_dynamic_indexed_name( - nghttp3_qpack_encoder *encoder, nghttp3_buf *rbuf, uint64_t absidx, - uint64_t base, const nghttp3_nv *nv) { + nghttp3_qpack_encoder *encoder, nghttp3_buf *rbuf, uint64_t absidx, + uint64_t base, const nghttp3_nv *nv) { uint8_t fb; DEBUGF("qpack::encode: Literal Field Line With Name Reference (dynamic) " @@ -1890,8 +1892,8 @@ int nghttp3_qpack_encoder_write_dynamic_indexed_name( absidx, base, (nv->flags & NGHTTP3_NV_FLAG_NEVER_INDEX) != 0); if (absidx < base) { - fb = (uint8_t)(0x40 | - ((nv->flags & NGHTTP3_NV_FLAG_NEVER_INDEX) ? 0x20 : 0)); + fb = + (uint8_t)(0x40 | ((nv->flags & NGHTTP3_NV_FLAG_NEVER_INDEX) ? 0x20 : 0)); return qpack_encoder_write_indexed_name(encoder, rbuf, fb, base - absidx - 1, 4, nv); } @@ -1923,7 +1925,7 @@ static int qpack_encoder_write_literal(nghttp3_qpack_encoder *encoder, int nh = 0, vh = 0; nhlen = nghttp3_qpack_huffman_encode_count(nv->name, nv->namelen); - if (nhlen < nv->namelen) { + if (nhlen * 4 < nv->namelen * 3) { nh = 1; len = nghttp3_qpack_put_varint_len(nhlen, prefix) + nhlen; } else { @@ -1931,7 +1933,7 @@ static int qpack_encoder_write_literal(nghttp3_qpack_encoder *encoder, } vhlen = nghttp3_qpack_huffman_encode_count(nv->value, nv->valuelen); - if (vhlen < nv->valuelen) { + if (vhlen * 4 < nv->valuelen * 3) { vh = 1; len += nghttp3_qpack_put_varint_len(vhlen, 7) + vhlen; } else { @@ -1981,7 +1983,7 @@ int nghttp3_qpack_encoder_write_literal(nghttp3_qpack_encoder *encoder, nghttp3_buf *rbuf, const nghttp3_nv *nv) { uint8_t fb = - (uint8_t)(0x20 | ((nv->flags & NGHTTP3_NV_FLAG_NEVER_INDEX) ? 0x10 : 0)); + (uint8_t)(0x20 | ((nv->flags & NGHTTP3_NV_FLAG_NEVER_INDEX) ? 0x10 : 0)); DEBUGF("qpack::encode: Literal Field Line With Literal Name\n"); return qpack_encoder_write_literal(encoder, rbuf, fb, 3, nv); @@ -2005,7 +2007,7 @@ int nghttp3_qpack_encoder_write_dynamic_insert(nghttp3_qpack_encoder *encoder, "\n", absidx); return qpack_encoder_write_indexed_name( - encoder, ebuf, 0x80, encoder->ctx.next_absidx - absidx - 1, 6, nv); + encoder, ebuf, 0x80, encoder->ctx.next_absidx - absidx - 1, 6, nv); } int nghttp3_qpack_encoder_write_duplicate_insert(nghttp3_qpack_encoder *encoder, @@ -2257,10 +2259,10 @@ void nghttp3_qpack_entry_free(nghttp3_qpack_entry *ent) { int nghttp3_qpack_encoder_block_stream(nghttp3_qpack_encoder *encoder, nghttp3_qpack_stream *stream) { nghttp3_blocked_streams_key bsk = { - nghttp3_struct_of(nghttp3_pq_top(&stream->max_cnts), - nghttp3_qpack_header_block_ref, max_cnts_pe) - ->max_cnt, - (uint64_t)stream->stream_id}; + nghttp3_struct_of(nghttp3_pq_top(&stream->max_cnts), + nghttp3_qpack_header_block_ref, max_cnts_pe) + ->max_cnt, + (uint64_t)stream->stream_id}; return nghttp3_ksl_insert(&encoder->blocked_streams, NULL, &bsk, stream); } @@ -2268,10 +2270,10 @@ int nghttp3_qpack_encoder_block_stream(nghttp3_qpack_encoder *encoder, void nghttp3_qpack_encoder_unblock_stream(nghttp3_qpack_encoder *encoder, nghttp3_qpack_stream *stream) { nghttp3_blocked_streams_key bsk = { - nghttp3_struct_of(nghttp3_pq_top(&stream->max_cnts), - nghttp3_qpack_header_block_ref, max_cnts_pe) - ->max_cnt, - (uint64_t)stream->stream_id}; + nghttp3_struct_of(nghttp3_pq_top(&stream->max_cnts), + nghttp3_qpack_header_block_ref, max_cnts_pe) + ->max_cnt, + (uint64_t)stream->stream_id}; nghttp3_ksl_it it; /* This is purely debugging purpose only */ @@ -2299,7 +2301,7 @@ void nghttp3_qpack_encoder_unblock(nghttp3_qpack_encoder *encoder, int nghttp3_qpack_encoder_ack_header(nghttp3_qpack_encoder *encoder, int64_t stream_id) { nghttp3_qpack_stream *stream = - nghttp3_qpack_encoder_find_stream(encoder, stream_id); + nghttp3_qpack_encoder_find_stream(encoder, stream_id); const nghttp3_mem *mem = encoder->ctx.mem; nghttp3_qpack_header_block_ref *ref; @@ -2310,7 +2312,7 @@ int nghttp3_qpack_encoder_ack_header(nghttp3_qpack_encoder *encoder, assert(nghttp3_ringbuf_len(&stream->refs)); ref = - *(nghttp3_qpack_header_block_ref **)nghttp3_ringbuf_get(&stream->refs, 0); + *(nghttp3_qpack_header_block_ref **)nghttp3_ringbuf_get(&stream->refs, 0); DEBUGF("qpack::encoder: Header acknowledgement stream=%ld ricnt=%" PRIu64 " krcnt=%" PRIu64 "\n", @@ -2357,15 +2359,15 @@ void nghttp3_qpack_encoder_ack_everything(nghttp3_qpack_encoder *encoder) { nghttp3_ksl_clear(&encoder->blocked_streams); nghttp3_pq_clear(&encoder->min_cnts); - nghttp3_map_each_free(&encoder->streams, map_stream_free, - (void *)encoder->ctx.mem); + nghttp3_map_each(&encoder->streams, map_stream_free, + (void *)encoder->ctx.mem); nghttp3_map_clear(&encoder->streams); } void nghttp3_qpack_encoder_cancel_stream(nghttp3_qpack_encoder *encoder, int64_t stream_id) { nghttp3_qpack_stream *stream = - nghttp3_qpack_encoder_find_stream(encoder, stream_id); + nghttp3_qpack_encoder_find_stream(encoder, stream_id); const nghttp3_mem *mem = encoder->ctx.mem; if (stream == NULL) { @@ -2387,10 +2389,10 @@ nghttp3_qpack_encoder_get_num_blocked_streams(nghttp3_qpack_encoder *encoder) { } int nghttp3_qpack_encoder_write_field_section_prefix( - nghttp3_qpack_encoder *encoder, nghttp3_buf *pbuf, uint64_t ricnt, - uint64_t base) { + nghttp3_qpack_encoder *encoder, nghttp3_buf *pbuf, uint64_t ricnt, + uint64_t base) { size_t max_ents = - encoder->ctx.hard_max_dtable_capacity / NGHTTP3_QPACK_ENTRY_OVERHEAD; + encoder->ctx.hard_max_dtable_capacity / NGHTTP3_QPACK_ENTRY_OVERHEAD; uint64_t encricnt = ricnt == 0 ? 0 : (ricnt % (2 * max_ents)) + 1; int sign = base < ricnt; uint64_t delta_base = sign ? ricnt - base - 1 : base - ricnt; @@ -2523,20 +2525,31 @@ nghttp3_ssize nghttp3_qpack_encoder_read_decoder(nghttp3_qpack_encoder *encoder, return 0; } + encoder->uninterrupted_decoderlen += srclen; + if (encoder->uninterrupted_decoderlen > NGHTTP3_QPACK_MAX_DECODERLEN) { + return NGHTTP3_ERR_QPACK_DECODER_STREAM_ERROR; + } + end = src + srclen; for (; p != end;) { switch (encoder->state) { case NGHTTP3_QPACK_DS_STATE_OPCODE: - if ((*p) & 0x80) { + switch ((*p) & 0xc0) { + case 0x80: + case 0xc0: DEBUGF("qpack::encode: OPCODE_SECTION_ACK\n"); encoder->opcode = NGHTTP3_QPACK_DS_OPCODE_SECTION_ACK; encoder->rstate.prefix = 7; - } else if ((*p) & 0x40) { + + break; + case 0x40: DEBUGF("qpack::encode: OPCODE_STREAM_CANCEL\n"); encoder->opcode = NGHTTP3_QPACK_DS_OPCODE_STREAM_CANCEL; encoder->rstate.prefix = 6; - } else { + + break; + default: DEBUGF("qpack::encode: OPCODE_ICNT_INCREMENT\n"); encoder->opcode = NGHTTP3_QPACK_DS_OPCODE_ICNT_INCREMENT; encoder->rstate.prefix = 6; @@ -2670,6 +2683,7 @@ int nghttp3_qpack_decoder_init(nghttp3_qpack_decoder *decoder, decoder->opcode = 0; decoder->written_icnt = 0; decoder->max_concurrent_streams = 0; + decoder->uninterrupted_encoderlen = 0; nghttp3_qpack_read_state_reset(&decoder->rstate); nghttp3_buf_init(&decoder->dbuf); @@ -2726,7 +2740,7 @@ static nghttp3_ssize qpack_read_string(nghttp3_qpack_read_state *rstate, nghttp3_buf *dest, const uint8_t *begin, const uint8_t *end) { size_t len = (size_t)(end - begin); - size_t n = (size_t)nghttp3_min((uint64_t)len, rstate->left); + size_t n = (size_t)nghttp3_min_uint64((uint64_t)len, rstate->left); dest->last = nghttp3_cpymem(dest->last, begin, n); @@ -2747,10 +2761,10 @@ static int qpack_decoder_validate_index(nghttp3_qpack_decoder *decoder, nghttp3_qpack_read_state *rstate) { if (rstate->dynamic) { return rstate->absidx < decoder->ctx.next_absidx && - decoder->ctx.next_absidx - rstate->absidx - 1 < - nghttp3_ringbuf_len(&decoder->ctx.dtable) - ? 0 - : NGHTTP3_ERR_QPACK_FATAL; + decoder->ctx.next_absidx - rstate->absidx - 1 < + nghttp3_ringbuf_len(&decoder->ctx.dtable) + ? 0 + : NGHTTP3_ERR_QPACK_FATAL; } return rstate->absidx < nghttp3_arraylen(stable) ? 0 : NGHTTP3_ERR_QPACK_FATAL; @@ -2789,39 +2803,51 @@ nghttp3_ssize nghttp3_qpack_decoder_read_encoder(nghttp3_qpack_decoder *decoder, return 0; } + decoder->uninterrupted_encoderlen += srclen; + if (decoder->uninterrupted_encoderlen > NGHTTP3_QPACK_MAX_ENCODERLEN) { + return NGHTTP3_ERR_QPACK_ENCODER_STREAM_ERROR; + } + end = src + srclen; for (; p != end || busy;) { busy = 0; switch (decoder->state) { case NGHTTP3_QPACK_ES_STATE_OPCODE: - if ((*p) & 0x80) { + switch ((*p) & 0xe0) { + case 0x80: + case 0xa0: + case 0xc0: + case 0xe0: DEBUGF("qpack::decode: OPCODE_INSERT_INDEXED\n"); decoder->opcode = NGHTTP3_QPACK_ES_OPCODE_INSERT_INDEXED; decoder->rstate.dynamic = !((*p) & 0x40); decoder->rstate.prefix = 6; decoder->state = NGHTTP3_QPACK_ES_STATE_READ_INDEX; - } else if ((*p) & 0x40) { + + break; + case 0x40: + case 0x60: DEBUGF("qpack::decode: OPCODE_INSERT\n"); decoder->opcode = NGHTTP3_QPACK_ES_OPCODE_INSERT; decoder->rstate.dynamic = 0; decoder->rstate.prefix = 5; decoder->state = NGHTTP3_QPACK_ES_STATE_CHECK_NAME_HUFFMAN; - } else if ((*p) & 0x20) { + + break; + case 0x20: DEBUGF("qpack::decode: OPCODE_SET_DTABLE_TABLE_CAP\n"); decoder->opcode = NGHTTP3_QPACK_ES_OPCODE_SET_DTABLE_CAP; decoder->rstate.prefix = 5; decoder->state = NGHTTP3_QPACK_ES_STATE_READ_INDEX; - } else if (!((*p) & 0x20)) { + + break; + default: DEBUGF("qpack::decode: OPCODE_DUPLICATE\n"); decoder->opcode = NGHTTP3_QPACK_ES_OPCODE_DUPLICATE; decoder->rstate.dynamic = 1; decoder->rstate.prefix = 5; decoder->state = NGHTTP3_QPACK_ES_STATE_READ_INDEX; - } else { - DEBUGF("qpack::decode: unknown opcode %02x\n", *p); - rv = NGHTTP3_ERR_QPACK_ENCODER_STREAM_ERROR; - goto fail; } break; case NGHTTP3_QPACK_ES_STATE_READ_INDEX: @@ -2842,7 +2868,7 @@ nghttp3_ssize nghttp3_qpack_decoder_read_encoder(nghttp3_qpack_decoder *decoder, DEBUGF("qpack::decode: Set dtable capacity to %" PRIu64 "\n", decoder->rstate.left); rv = nghttp3_qpack_decoder_set_max_dtable_capacity( - decoder, (size_t)decoder->rstate.left); + decoder, (size_t)decoder->rstate.left); if (rv != 0) { rv = NGHTTP3_ERR_QPACK_ENCODER_STREAM_ERROR; goto fail; @@ -2944,7 +2970,7 @@ nghttp3_ssize nghttp3_qpack_decoder_read_encoder(nghttp3_qpack_decoder *decoder, break; case NGHTTP3_QPACK_ES_STATE_READ_NAME: nread = - qpack_read_string(&decoder->rstate, &decoder->rstate.namebuf, p, end); + qpack_read_string(&decoder->rstate, &decoder->rstate.namebuf, p, end); if (nread < 0) { rv = (int)nread; goto fail; @@ -3042,8 +3068,8 @@ nghttp3_ssize nghttp3_qpack_decoder_read_encoder(nghttp3_qpack_decoder *decoder, nghttp3_qpack_read_state_reset(&decoder->rstate); break; case NGHTTP3_QPACK_ES_STATE_READ_VALUE: - nread = qpack_read_string(&decoder->rstate, &decoder->rstate.valuebuf, p, - end); + nread = + qpack_read_string(&decoder->rstate, &decoder->rstate.valuebuf, p, end); if (nread < 0) { rv = (int)nread; goto fail; @@ -3085,7 +3111,7 @@ nghttp3_ssize nghttp3_qpack_decoder_read_encoder(nghttp3_qpack_decoder *decoder, } int nghttp3_qpack_decoder_set_max_dtable_capacity( - nghttp3_qpack_decoder *decoder, size_t max_dtable_capacity) { + nghttp3_qpack_decoder *decoder, size_t max_dtable_capacity) { nghttp3_qpack_entry *ent; size_t i; nghttp3_qpack_context *ctx = &decoder->ctx; @@ -3230,9 +3256,9 @@ int nghttp3_qpack_decoder_dtable_literal_add(nghttp3_qpack_decoder *decoder) { } void nghttp3_qpack_decoder_set_max_concurrent_streams( - nghttp3_qpack_decoder *decoder, size_t max_concurrent_streams) { + nghttp3_qpack_decoder *decoder, size_t max_concurrent_streams) { decoder->max_concurrent_streams = - nghttp3_max(decoder->max_concurrent_streams, max_concurrent_streams); + nghttp3_max_size(decoder->max_concurrent_streams, max_concurrent_streams); } void nghttp3_qpack_stream_context_init(nghttp3_qpack_stream_context *sctx, @@ -3357,33 +3383,53 @@ nghttp3_qpack_decoder_read_request(nghttp3_qpack_decoder *decoder, case NGHTTP3_QPACK_RS_STATE_OPCODE: assert(sctx->rstate.left == 0); assert(sctx->rstate.shift == 0); - if ((*p) & 0x80) { + switch ((*p) & 0xf0) { + case 0x80: + case 0x90: + case 0xa0: + case 0xb0: + case 0xc0: + case 0xd0: + case 0xe0: + case 0xf0: DEBUGF("qpack::decode: OPCODE_INDEXED\n"); sctx->opcode = NGHTTP3_QPACK_RS_OPCODE_INDEXED; sctx->rstate.dynamic = !((*p) & 0x40); sctx->rstate.prefix = 6; sctx->state = NGHTTP3_QPACK_RS_STATE_READ_INDEX; - } else if ((*p) & 0x40) { + + break; + case 0x40: + case 0x50: + case 0x60: + case 0x70: DEBUGF("qpack::decode: OPCODE_INDEXED_NAME\n"); sctx->opcode = NGHTTP3_QPACK_RS_OPCODE_INDEXED_NAME; sctx->rstate.never = (*p) & 0x20; sctx->rstate.dynamic = !((*p) & 0x10); sctx->rstate.prefix = 4; sctx->state = NGHTTP3_QPACK_RS_STATE_READ_INDEX; - } else if ((*p) & 0x20) { + + break; + case 0x20: + case 0x30: DEBUGF("qpack::decode: OPCODE_LITERAL\n"); sctx->opcode = NGHTTP3_QPACK_RS_OPCODE_LITERAL; sctx->rstate.never = (*p) & 0x10; sctx->rstate.dynamic = 0; sctx->rstate.prefix = 3; sctx->state = NGHTTP3_QPACK_RS_STATE_CHECK_NAME_HUFFMAN; - } else if ((*p) & 0x10) { + + break; + case 0x10: DEBUGF("qpack::decode: OPCODE_INDEXED_PB\n"); sctx->opcode = NGHTTP3_QPACK_RS_OPCODE_INDEXED_PB; sctx->rstate.dynamic = 1; sctx->rstate.prefix = 4; sctx->state = NGHTTP3_QPACK_RS_STATE_READ_INDEX; - } else { + + break; + default: DEBUGF("qpack::decode: OPCODE_INDEXED_NAME_PB\n"); sctx->opcode = NGHTTP3_QPACK_RS_OPCODE_INDEXED_NAME_PB; sctx->rstate.never = (*p) & 0x08; @@ -3494,8 +3540,8 @@ nghttp3_qpack_decoder_read_request(nghttp3_qpack_decoder *decoder, sctx->rstate.name->len); break; case NGHTTP3_QPACK_RS_STATE_READ_NAME_HUFFMAN: - nread = qpack_read_huffman_string(&sctx->rstate, &sctx->rstate.namebuf, p, - end); + nread = + qpack_read_huffman_string(&sctx->rstate, &sctx->rstate.namebuf, p, end); if (nread < 0) { assert(NGHTTP3_ERR_QPACK_FATAL == nread); rv = NGHTTP3_ERR_QPACK_DECOMPRESSION_FAILED; @@ -3679,6 +3725,8 @@ nghttp3_qpack_decoder_read_request(nghttp3_qpack_decoder *decoder, goto fail; } } + + decoder->uninterrupted_encoderlen = 0; } return p - src; @@ -3689,13 +3737,13 @@ nghttp3_qpack_decoder_read_request(nghttp3_qpack_decoder *decoder, } static int qpack_decoder_dbuf_overflow(nghttp3_qpack_decoder *decoder) { - size_t limit = nghttp3_max(decoder->max_concurrent_streams, 100); + size_t limit = nghttp3_max_size(decoder->max_concurrent_streams, 100); /* 10 = nghttp3_qpack_put_varint_len((1ULL << 62) - 1, 2)) */ return nghttp3_buf_len(&decoder->dbuf) > limit * 2 * 10; } int nghttp3_qpack_decoder_write_section_ack( - nghttp3_qpack_decoder *decoder, const nghttp3_qpack_stream_context *sctx) { + nghttp3_qpack_decoder *decoder, const nghttp3_qpack_stream_context *sctx) { nghttp3_buf *dbuf = &decoder->dbuf; uint8_t *p; int rv; @@ -3704,9 +3752,9 @@ int nghttp3_qpack_decoder_write_section_ack( return NGHTTP3_ERR_QPACK_FATAL; } - rv = reserve_buf_small( - dbuf, nghttp3_qpack_put_varint_len((uint64_t)sctx->stream_id, 7), - decoder->ctx.mem); + rv = reserve_buf(dbuf, + nghttp3_qpack_put_varint_len((uint64_t)sctx->stream_id, 7), + decoder->ctx.mem); if (rv != 0) { return rv; } @@ -3798,7 +3846,7 @@ int nghttp3_qpack_decoder_reconstruct_ricnt(nghttp3_qpack_decoder *decoder, } max_ents = - decoder->ctx.hard_max_dtable_capacity / NGHTTP3_QPACK_ENTRY_OVERHEAD; + decoder->ctx.hard_max_dtable_capacity / NGHTTP3_QPACK_ENTRY_OVERHEAD; full = 2 * max_ents; if (encricnt > full) { @@ -3910,7 +3958,7 @@ qpack_decoder_emit_dynamic_indexed(nghttp3_qpack_decoder *decoder, nghttp3_qpack_stream_context *sctx, nghttp3_qpack_nv *nv) { nghttp3_qpack_entry *ent = - nghttp3_qpack_context_dtable_get(&decoder->ctx, sctx->rstate.absidx); + nghttp3_qpack_context_dtable_get(&decoder->ctx, sctx->rstate.absidx); *nv = ent->nv; @@ -3942,7 +3990,7 @@ qpack_decoder_emit_static_indexed_name(nghttp3_qpack_decoder *decoder, nv->value = sctx->rstate.value; nv->token = shd->token; nv->flags = - sctx->rstate.never ? NGHTTP3_NV_FLAG_NEVER_INDEX : NGHTTP3_NV_FLAG_NONE; + sctx->rstate.never ? NGHTTP3_NV_FLAG_NEVER_INDEX : NGHTTP3_NV_FLAG_NONE; sctx->rstate.value = NULL; } @@ -3965,7 +4013,7 @@ qpack_decoder_emit_dynamic_indexed_name(nghttp3_qpack_decoder *decoder, nv->value = sctx->rstate.value; nv->token = ent->nv.token; nv->flags = - sctx->rstate.never ? NGHTTP3_NV_FLAG_NEVER_INDEX : NGHTTP3_NV_FLAG_NONE; + sctx->rstate.never ? NGHTTP3_NV_FLAG_NEVER_INDEX : NGHTTP3_NV_FLAG_NONE; nghttp3_rcbuf_incref(nv->name); @@ -4005,7 +4053,7 @@ void nghttp3_qpack_decoder_emit_literal(nghttp3_qpack_decoder *decoder, nv->value = sctx->rstate.value; nv->token = qpack_lookup_token(nv->name->base, nv->name->len); nv->flags = - sctx->rstate.never ? NGHTTP3_NV_FLAG_NEVER_INDEX : NGHTTP3_NV_FLAG_NONE; + sctx->rstate.never ? NGHTTP3_NV_FLAG_NEVER_INDEX : NGHTTP3_NV_FLAG_NONE; sctx->rstate.name = NULL; sctx->rstate.value = NULL; diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_qpack.h b/deps/ngtcp2/nghttp3/lib/nghttp3_qpack.h index 804969e14d6091..d2bb8a3581135b 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_qpack.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_qpack.h @@ -28,7 +28,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -48,6 +48,14 @@ /* NGHTTP3_QPACK_MAX_VALUELEN is the maximum (compressed) length of header value this library can decode. */ #define NGHTTP3_QPACK_MAX_VALUELEN 65536 +/* NGHTTP3_QPACK_MAX_ENCODERLEN is the maximum encoder stream length + that a decoder accepts without completely processing a single field + section. */ +#define NGHTTP3_QPACK_MAX_ENCODERLEN (128 * 1024) +/* NGHTTP3_QPACK_MAX_DECODERLEN is the maximum decoder stream length + that an encoder accepts without completely encoding a single field + section. */ +#define NGHTTP3_QPACK_MAX_DECODERLEN (4 * 1024) /* nghttp3_qpack_indexing_mode is a indexing strategy. */ typedef enum nghttp3_qpack_indexing_mode { @@ -250,6 +258,9 @@ struct nghttp3_qpack_encoder { /* last_max_dtable_update is the dynamic table size last requested. */ size_t last_max_dtable_update; + /* uninterrupted_decoderlen is the number of bytes read from decoder + stream without encoding a single field section. */ + size_t uninterrupted_decoderlen; /* flags is bitwise OR of zero or more of NGHTTP3_QPACK_ENCODER_FLAG_*. */ uint8_t flags; @@ -325,9 +336,9 @@ nghttp3_qpack_lookup_stable(const nghttp3_nv *nv, int32_t token, * blocked (or it has been blocked already). */ nghttp3_qpack_lookup_result nghttp3_qpack_encoder_lookup_dtable( - nghttp3_qpack_encoder *encoder, const nghttp3_nv *nv, int32_t token, - uint32_t hash, nghttp3_qpack_indexing_mode indexing_mode, uint64_t krcnt, - int allow_blocking); + nghttp3_qpack_encoder *encoder, const nghttp3_nv *nv, int32_t token, + uint32_t hash, nghttp3_qpack_indexing_mode indexing_mode, uint64_t krcnt, + int allow_blocking); /* * nghttp3_qpack_encoder_write_field_section_prefix writes Encoded @@ -341,8 +352,8 @@ nghttp3_qpack_lookup_result nghttp3_qpack_encoder_lookup_dtable( * Out of memory. */ int nghttp3_qpack_encoder_write_field_section_prefix( - nghttp3_qpack_encoder *encoder, nghttp3_buf *pbuf, uint64_t ricnt, - uint64_t base); + nghttp3_qpack_encoder *encoder, nghttp3_buf *pbuf, uint64_t ricnt, + uint64_t base); /* * nghttp3_qpack_encoder_write_static_indexed writes Indexed Header @@ -386,8 +397,8 @@ int nghttp3_qpack_encoder_write_dynamic_indexed(nghttp3_qpack_encoder *encoder, * Out of memory. */ int nghttp3_qpack_encoder_write_static_indexed_name( - nghttp3_qpack_encoder *encoder, nghttp3_buf *rbuf, uint64_t absidx, - const nghttp3_nv *nv); + nghttp3_qpack_encoder *encoder, nghttp3_buf *rbuf, uint64_t absidx, + const nghttp3_nv *nv); /* * nghttp3_qpack_encoder_write_dynamic_indexed writes Literal Header @@ -402,8 +413,8 @@ int nghttp3_qpack_encoder_write_static_indexed_name( * Out of memory. */ int nghttp3_qpack_encoder_write_dynamic_indexed_name( - nghttp3_qpack_encoder *encoder, nghttp3_buf *rbuf, uint64_t absidx, - uint64_t base, const nghttp3_nv *nv); + nghttp3_qpack_encoder *encoder, nghttp3_buf *rbuf, uint64_t absidx, + uint64_t base, const nghttp3_nv *nv); /* * nghttp3_qpack_encoder_write_literal writes Literal Header Field @@ -779,6 +790,9 @@ struct nghttp3_qpack_decoder { unidirectional streams which potentially receives QPACK encoded HEADER frame. */ size_t max_concurrent_streams; + /* uninterrupted_encoderlen is the number of bytes read from encoder + stream without completing a single field section. */ + size_t uninterrupted_encoderlen; }; /* @@ -880,19 +894,19 @@ int nghttp3_qpack_decoder_dtable_duplicate_add(nghttp3_qpack_decoder *decoder); int nghttp3_qpack_decoder_dtable_literal_add(nghttp3_qpack_decoder *decoder); struct nghttp3_qpack_stream_context { - /* state is a current state of reading request stream. */ - nghttp3_qpack_request_stream_state state; /* rstate is a set of intermediate state which are used to process request stream. */ nghttp3_qpack_read_state rstate; const nghttp3_mem *mem; - /* opcode is a request stream opcode being processed. */ - nghttp3_qpack_request_stream_opcode opcode; int64_t stream_id; /* ricnt is Required Insert Count to decode this header block. */ uint64_t ricnt; /* base is Base in Header Block Prefix. */ uint64_t base; + /* state is a current state of reading request stream. */ + nghttp3_qpack_request_stream_state state; + /* opcode is a request stream opcode being processed. */ + nghttp3_qpack_request_stream_opcode opcode; /* dbase_sign is the delta base sign in Header Block Prefix. */ int dbase_sign; }; @@ -991,6 +1005,6 @@ void nghttp3_qpack_decoder_emit_literal(nghttp3_qpack_decoder *decoder, * Decoder stream overflow. */ int nghttp3_qpack_decoder_write_section_ack( - nghttp3_qpack_decoder *decoder, const nghttp3_qpack_stream_context *sctx); + nghttp3_qpack_decoder *decoder, const nghttp3_qpack_stream_context *sctx); -#endif /* NGHTTP3_QPACK_H */ +#endif /* !defined(NGHTTP3_QPACK_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman.c b/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman.c index c36a68ededd1af..3398f3f5080e60 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman.c @@ -78,7 +78,7 @@ uint8_t *nghttp3_qpack_huffman_encode(uint8_t *dest, const uint8_t *src, } void nghttp3_qpack_huffman_decode_context_init( - nghttp3_qpack_huffman_decode_context *ctx) { + nghttp3_qpack_huffman_decode_context *ctx) { ctx->fstate = NGHTTP3_QPACK_HUFFMAN_ACCEPTED; } @@ -93,7 +93,9 @@ nghttp3_qpack_huffman_decode(nghttp3_qpack_huffman_decode_context *ctx, uint8_t c; /* We use the decoding algorithm described in - http://graphics.ics.uci.edu/pub/Prefix.pdf */ + - http://graphics.ics.uci.edu/pub/Prefix.pdf [!!! NO LONGER VALID !!!] + - https://ics.uci.edu/~dan/pubs/Prefix.pdf + - https://github.com/nghttp2/nghttp2/files/15141264/Prefix.pdf */ for (; src != end;) { c = *src++; t = &qpack_huffman_decode_table[t->fstate & 0x1ff][c >> 4]; @@ -117,6 +119,6 @@ nghttp3_qpack_huffman_decode(nghttp3_qpack_huffman_decode_context *ctx, } int nghttp3_qpack_huffman_decode_failure_state( - nghttp3_qpack_huffman_decode_context *ctx) { + nghttp3_qpack_huffman_decode_context *ctx) { return ctx->fstate == 0x100; } diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman.h b/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman.h index fc3bc7b264a900..ab6d82a16a9134 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman.h @@ -28,7 +28,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -75,7 +75,7 @@ typedef struct nghttp3_qpack_huffman_decode_context { extern const nghttp3_qpack_huffman_decode_node qpack_huffman_decode_table[][16]; void nghttp3_qpack_huffman_decode_context_init( - nghttp3_qpack_huffman_decode_context *ctx); + nghttp3_qpack_huffman_decode_context *ctx); /* * nghttp3_qpack_huffman_decode decodes huffman encoded byte string @@ -103,6 +103,6 @@ nghttp3_qpack_huffman_decode(nghttp3_qpack_huffman_decode_context *ctx, * indicates that huffman decoding context is in failure state. */ int nghttp3_qpack_huffman_decode_failure_state( - nghttp3_qpack_huffman_decode_context *ctx); + nghttp3_qpack_huffman_decode_context *ctx); -#endif /* NGHTTP3_QPACK_HUFFMAN_H */ +#endif /* !defined(NGHTTP3_QPACK_HUFFMAN_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman_data.c b/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman_data.c index 0c104dbc0a0bd8..7c3c230f041211 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman_data.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_qpack_huffman_data.c @@ -28,4954 +28,4954 @@ /* Generated by mkhufftbl.py */ const nghttp3_qpack_huffman_sym huffman_sym_table[] = { - {13, 0xffc00000u}, {23, 0xffffb000u}, {28, 0xfffffe20u}, {28, 0xfffffe30u}, - {28, 0xfffffe40u}, {28, 0xfffffe50u}, {28, 0xfffffe60u}, {28, 0xfffffe70u}, - {28, 0xfffffe80u}, {24, 0xffffea00u}, {30, 0xfffffff0u}, {28, 0xfffffe90u}, - {28, 0xfffffea0u}, {30, 0xfffffff4u}, {28, 0xfffffeb0u}, {28, 0xfffffec0u}, - {28, 0xfffffed0u}, {28, 0xfffffee0u}, {28, 0xfffffef0u}, {28, 0xffffff00u}, - {28, 0xffffff10u}, {28, 0xffffff20u}, {30, 0xfffffff8u}, {28, 0xffffff30u}, - {28, 0xffffff40u}, {28, 0xffffff50u}, {28, 0xffffff60u}, {28, 0xffffff70u}, - {28, 0xffffff80u}, {28, 0xffffff90u}, {28, 0xffffffa0u}, {28, 0xffffffb0u}, - {6, 0x50000000u}, {10, 0xfe000000u}, {10, 0xfe400000u}, {12, 0xffa00000u}, - {13, 0xffc80000u}, {6, 0x54000000u}, {8, 0xf8000000u}, {11, 0xff400000u}, - {10, 0xfe800000u}, {10, 0xfec00000u}, {8, 0xf9000000u}, {11, 0xff600000u}, - {8, 0xfa000000u}, {6, 0x58000000u}, {6, 0x5c000000u}, {6, 0x60000000u}, - {5, 0x0u}, {5, 0x8000000u}, {5, 0x10000000u}, {6, 0x64000000u}, - {6, 0x68000000u}, {6, 0x6c000000u}, {6, 0x70000000u}, {6, 0x74000000u}, - {6, 0x78000000u}, {6, 0x7c000000u}, {7, 0xb8000000u}, {8, 0xfb000000u}, - {15, 0xfff80000u}, {6, 0x80000000u}, {12, 0xffb00000u}, {10, 0xff000000u}, - {13, 0xffd00000u}, {6, 0x84000000u}, {7, 0xba000000u}, {7, 0xbc000000u}, - {7, 0xbe000000u}, {7, 0xc0000000u}, {7, 0xc2000000u}, {7, 0xc4000000u}, - {7, 0xc6000000u}, {7, 0xc8000000u}, {7, 0xca000000u}, {7, 0xcc000000u}, - {7, 0xce000000u}, {7, 0xd0000000u}, {7, 0xd2000000u}, {7, 0xd4000000u}, - {7, 0xd6000000u}, {7, 0xd8000000u}, {7, 0xda000000u}, {7, 0xdc000000u}, - {7, 0xde000000u}, {7, 0xe0000000u}, {7, 0xe2000000u}, {7, 0xe4000000u}, - {8, 0xfc000000u}, {7, 0xe6000000u}, {8, 0xfd000000u}, {13, 0xffd80000u}, - {19, 0xfffe0000u}, {13, 0xffe00000u}, {14, 0xfff00000u}, {6, 0x88000000u}, - {15, 0xfffa0000u}, {5, 0x18000000u}, {6, 0x8c000000u}, {5, 0x20000000u}, - {6, 0x90000000u}, {5, 0x28000000u}, {6, 0x94000000u}, {6, 0x98000000u}, - {6, 0x9c000000u}, {5, 0x30000000u}, {7, 0xe8000000u}, {7, 0xea000000u}, - {6, 0xa0000000u}, {6, 0xa4000000u}, {6, 0xa8000000u}, {5, 0x38000000u}, - {6, 0xac000000u}, {7, 0xec000000u}, {6, 0xb0000000u}, {5, 0x40000000u}, - {5, 0x48000000u}, {6, 0xb4000000u}, {7, 0xee000000u}, {7, 0xf0000000u}, - {7, 0xf2000000u}, {7, 0xf4000000u}, {7, 0xf6000000u}, {15, 0xfffc0000u}, - {11, 0xff800000u}, {14, 0xfff40000u}, {13, 0xffe80000u}, {28, 0xffffffc0u}, - {20, 0xfffe6000u}, {22, 0xffff4800u}, {20, 0xfffe7000u}, {20, 0xfffe8000u}, - {22, 0xffff4c00u}, {22, 0xffff5000u}, {22, 0xffff5400u}, {23, 0xffffb200u}, - {22, 0xffff5800u}, {23, 0xffffb400u}, {23, 0xffffb600u}, {23, 0xffffb800u}, - {23, 0xffffba00u}, {23, 0xffffbc00u}, {24, 0xffffeb00u}, {23, 0xffffbe00u}, - {24, 0xffffec00u}, {24, 0xffffed00u}, {22, 0xffff5c00u}, {23, 0xffffc000u}, - {24, 0xffffee00u}, {23, 0xffffc200u}, {23, 0xffffc400u}, {23, 0xffffc600u}, - {23, 0xffffc800u}, {21, 0xfffee000u}, {22, 0xffff6000u}, {23, 0xffffca00u}, - {22, 0xffff6400u}, {23, 0xffffcc00u}, {23, 0xffffce00u}, {24, 0xffffef00u}, - {22, 0xffff6800u}, {21, 0xfffee800u}, {20, 0xfffe9000u}, {22, 0xffff6c00u}, - {22, 0xffff7000u}, {23, 0xffffd000u}, {23, 0xffffd200u}, {21, 0xfffef000u}, - {23, 0xffffd400u}, {22, 0xffff7400u}, {22, 0xffff7800u}, {24, 0xfffff000u}, - {21, 0xfffef800u}, {22, 0xffff7c00u}, {23, 0xffffd600u}, {23, 0xffffd800u}, - {21, 0xffff0000u}, {21, 0xffff0800u}, {22, 0xffff8000u}, {21, 0xffff1000u}, - {23, 0xffffda00u}, {22, 0xffff8400u}, {23, 0xffffdc00u}, {23, 0xffffde00u}, - {20, 0xfffea000u}, {22, 0xffff8800u}, {22, 0xffff8c00u}, {22, 0xffff9000u}, - {23, 0xffffe000u}, {22, 0xffff9400u}, {22, 0xffff9800u}, {23, 0xffffe200u}, - {26, 0xfffff800u}, {26, 0xfffff840u}, {20, 0xfffeb000u}, {19, 0xfffe2000u}, - {22, 0xffff9c00u}, {23, 0xffffe400u}, {22, 0xffffa000u}, {25, 0xfffff600u}, - {26, 0xfffff880u}, {26, 0xfffff8c0u}, {26, 0xfffff900u}, {27, 0xfffffbc0u}, - {27, 0xfffffbe0u}, {26, 0xfffff940u}, {24, 0xfffff100u}, {25, 0xfffff680u}, - {19, 0xfffe4000u}, {21, 0xffff1800u}, {26, 0xfffff980u}, {27, 0xfffffc00u}, - {27, 0xfffffc20u}, {26, 0xfffff9c0u}, {27, 0xfffffc40u}, {24, 0xfffff200u}, - {21, 0xffff2000u}, {21, 0xffff2800u}, {26, 0xfffffa00u}, {26, 0xfffffa40u}, - {28, 0xffffffd0u}, {27, 0xfffffc60u}, {27, 0xfffffc80u}, {27, 0xfffffca0u}, - {20, 0xfffec000u}, {24, 0xfffff300u}, {20, 0xfffed000u}, {21, 0xffff3000u}, - {22, 0xffffa400u}, {21, 0xffff3800u}, {21, 0xffff4000u}, {23, 0xffffe600u}, - {22, 0xffffa800u}, {22, 0xffffac00u}, {25, 0xfffff700u}, {25, 0xfffff780u}, - {24, 0xfffff400u}, {24, 0xfffff500u}, {26, 0xfffffa80u}, {23, 0xffffe800u}, - {26, 0xfffffac0u}, {27, 0xfffffcc0u}, {26, 0xfffffb00u}, {26, 0xfffffb40u}, - {27, 0xfffffce0u}, {27, 0xfffffd00u}, {27, 0xfffffd20u}, {27, 0xfffffd40u}, - {27, 0xfffffd60u}, {28, 0xffffffe0u}, {27, 0xfffffd80u}, {27, 0xfffffda0u}, - {27, 0xfffffdc0u}, {27, 0xfffffde0u}, {27, 0xfffffe00u}, {26, 0xfffffb80u}, - {30, 0xfffffffcu}}; + {13, 0xffc00000u}, {23, 0xffffb000u}, {28, 0xfffffe20u}, {28, 0xfffffe30u}, + {28, 0xfffffe40u}, {28, 0xfffffe50u}, {28, 0xfffffe60u}, {28, 0xfffffe70u}, + {28, 0xfffffe80u}, {24, 0xffffea00u}, {30, 0xfffffff0u}, {28, 0xfffffe90u}, + {28, 0xfffffea0u}, {30, 0xfffffff4u}, {28, 0xfffffeb0u}, {28, 0xfffffec0u}, + {28, 0xfffffed0u}, {28, 0xfffffee0u}, {28, 0xfffffef0u}, {28, 0xffffff00u}, + {28, 0xffffff10u}, {28, 0xffffff20u}, {30, 0xfffffff8u}, {28, 0xffffff30u}, + {28, 0xffffff40u}, {28, 0xffffff50u}, {28, 0xffffff60u}, {28, 0xffffff70u}, + {28, 0xffffff80u}, {28, 0xffffff90u}, {28, 0xffffffa0u}, {28, 0xffffffb0u}, + {6, 0x50000000u}, {10, 0xfe000000u}, {10, 0xfe400000u}, {12, 0xffa00000u}, + {13, 0xffc80000u}, {6, 0x54000000u}, {8, 0xf8000000u}, {11, 0xff400000u}, + {10, 0xfe800000u}, {10, 0xfec00000u}, {8, 0xf9000000u}, {11, 0xff600000u}, + {8, 0xfa000000u}, {6, 0x58000000u}, {6, 0x5c000000u}, {6, 0x60000000u}, + {5, 0x0u}, {5, 0x8000000u}, {5, 0x10000000u}, {6, 0x64000000u}, + {6, 0x68000000u}, {6, 0x6c000000u}, {6, 0x70000000u}, {6, 0x74000000u}, + {6, 0x78000000u}, {6, 0x7c000000u}, {7, 0xb8000000u}, {8, 0xfb000000u}, + {15, 0xfff80000u}, {6, 0x80000000u}, {12, 0xffb00000u}, {10, 0xff000000u}, + {13, 0xffd00000u}, {6, 0x84000000u}, {7, 0xba000000u}, {7, 0xbc000000u}, + {7, 0xbe000000u}, {7, 0xc0000000u}, {7, 0xc2000000u}, {7, 0xc4000000u}, + {7, 0xc6000000u}, {7, 0xc8000000u}, {7, 0xca000000u}, {7, 0xcc000000u}, + {7, 0xce000000u}, {7, 0xd0000000u}, {7, 0xd2000000u}, {7, 0xd4000000u}, + {7, 0xd6000000u}, {7, 0xd8000000u}, {7, 0xda000000u}, {7, 0xdc000000u}, + {7, 0xde000000u}, {7, 0xe0000000u}, {7, 0xe2000000u}, {7, 0xe4000000u}, + {8, 0xfc000000u}, {7, 0xe6000000u}, {8, 0xfd000000u}, {13, 0xffd80000u}, + {19, 0xfffe0000u}, {13, 0xffe00000u}, {14, 0xfff00000u}, {6, 0x88000000u}, + {15, 0xfffa0000u}, {5, 0x18000000u}, {6, 0x8c000000u}, {5, 0x20000000u}, + {6, 0x90000000u}, {5, 0x28000000u}, {6, 0x94000000u}, {6, 0x98000000u}, + {6, 0x9c000000u}, {5, 0x30000000u}, {7, 0xe8000000u}, {7, 0xea000000u}, + {6, 0xa0000000u}, {6, 0xa4000000u}, {6, 0xa8000000u}, {5, 0x38000000u}, + {6, 0xac000000u}, {7, 0xec000000u}, {6, 0xb0000000u}, {5, 0x40000000u}, + {5, 0x48000000u}, {6, 0xb4000000u}, {7, 0xee000000u}, {7, 0xf0000000u}, + {7, 0xf2000000u}, {7, 0xf4000000u}, {7, 0xf6000000u}, {15, 0xfffc0000u}, + {11, 0xff800000u}, {14, 0xfff40000u}, {13, 0xffe80000u}, {28, 0xffffffc0u}, + {20, 0xfffe6000u}, {22, 0xffff4800u}, {20, 0xfffe7000u}, {20, 0xfffe8000u}, + {22, 0xffff4c00u}, {22, 0xffff5000u}, {22, 0xffff5400u}, {23, 0xffffb200u}, + {22, 0xffff5800u}, {23, 0xffffb400u}, {23, 0xffffb600u}, {23, 0xffffb800u}, + {23, 0xffffba00u}, {23, 0xffffbc00u}, {24, 0xffffeb00u}, {23, 0xffffbe00u}, + {24, 0xffffec00u}, {24, 0xffffed00u}, {22, 0xffff5c00u}, {23, 0xffffc000u}, + {24, 0xffffee00u}, {23, 0xffffc200u}, {23, 0xffffc400u}, {23, 0xffffc600u}, + {23, 0xffffc800u}, {21, 0xfffee000u}, {22, 0xffff6000u}, {23, 0xffffca00u}, + {22, 0xffff6400u}, {23, 0xffffcc00u}, {23, 0xffffce00u}, {24, 0xffffef00u}, + {22, 0xffff6800u}, {21, 0xfffee800u}, {20, 0xfffe9000u}, {22, 0xffff6c00u}, + {22, 0xffff7000u}, {23, 0xffffd000u}, {23, 0xffffd200u}, {21, 0xfffef000u}, + {23, 0xffffd400u}, {22, 0xffff7400u}, {22, 0xffff7800u}, {24, 0xfffff000u}, + {21, 0xfffef800u}, {22, 0xffff7c00u}, {23, 0xffffd600u}, {23, 0xffffd800u}, + {21, 0xffff0000u}, {21, 0xffff0800u}, {22, 0xffff8000u}, {21, 0xffff1000u}, + {23, 0xffffda00u}, {22, 0xffff8400u}, {23, 0xffffdc00u}, {23, 0xffffde00u}, + {20, 0xfffea000u}, {22, 0xffff8800u}, {22, 0xffff8c00u}, {22, 0xffff9000u}, + {23, 0xffffe000u}, {22, 0xffff9400u}, {22, 0xffff9800u}, {23, 0xffffe200u}, + {26, 0xfffff800u}, {26, 0xfffff840u}, {20, 0xfffeb000u}, {19, 0xfffe2000u}, + {22, 0xffff9c00u}, {23, 0xffffe400u}, {22, 0xffffa000u}, {25, 0xfffff600u}, + {26, 0xfffff880u}, {26, 0xfffff8c0u}, {26, 0xfffff900u}, {27, 0xfffffbc0u}, + {27, 0xfffffbe0u}, {26, 0xfffff940u}, {24, 0xfffff100u}, {25, 0xfffff680u}, + {19, 0xfffe4000u}, {21, 0xffff1800u}, {26, 0xfffff980u}, {27, 0xfffffc00u}, + {27, 0xfffffc20u}, {26, 0xfffff9c0u}, {27, 0xfffffc40u}, {24, 0xfffff200u}, + {21, 0xffff2000u}, {21, 0xffff2800u}, {26, 0xfffffa00u}, {26, 0xfffffa40u}, + {28, 0xffffffd0u}, {27, 0xfffffc60u}, {27, 0xfffffc80u}, {27, 0xfffffca0u}, + {20, 0xfffec000u}, {24, 0xfffff300u}, {20, 0xfffed000u}, {21, 0xffff3000u}, + {22, 0xffffa400u}, {21, 0xffff3800u}, {21, 0xffff4000u}, {23, 0xffffe600u}, + {22, 0xffffa800u}, {22, 0xffffac00u}, {25, 0xfffff700u}, {25, 0xfffff780u}, + {24, 0xfffff400u}, {24, 0xfffff500u}, {26, 0xfffffa80u}, {23, 0xffffe800u}, + {26, 0xfffffac0u}, {27, 0xfffffcc0u}, {26, 0xfffffb00u}, {26, 0xfffffb40u}, + {27, 0xfffffce0u}, {27, 0xfffffd00u}, {27, 0xfffffd20u}, {27, 0xfffffd40u}, + {27, 0xfffffd60u}, {28, 0xffffffe0u}, {27, 0xfffffd80u}, {27, 0xfffffda0u}, + {27, 0xfffffdc0u}, {27, 0xfffffde0u}, {27, 0xfffffe00u}, {26, 0xfffffb80u}, + {30, 0xfffffffcu}}; const nghttp3_qpack_huffman_decode_node qpack_huffman_decode_table[][16] = { - /* 0 */ - { - {0x04, 0}, - {0x05, 0}, - {0x07, 0}, - {0x08, 0}, - {0x0b, 0}, - {0x0c, 0}, - {0x10, 0}, - {0x13, 0}, - {0x19, 0}, - {0x1c, 0}, - {0x20, 0}, - {0x23, 0}, - {0x2a, 0}, - {0x31, 0}, - {0x39, 0}, - {0x4040, 0}, - }, - /* 1 */ - { - {0xc000, 48}, - {0xc000, 49}, - {0xc000, 50}, - {0xc000, 97}, - {0xc000, 99}, - {0xc000, 101}, - {0xc000, 105}, - {0xc000, 111}, - {0xc000, 115}, - {0xc000, 116}, - {0x0d, 0}, - {0x0e, 0}, - {0x11, 0}, - {0x12, 0}, - {0x14, 0}, - {0x15, 0}, - }, - /* 2 */ - { - {0x8001, 48}, - {0xc016, 48}, - {0x8001, 49}, - {0xc016, 49}, - {0x8001, 50}, - {0xc016, 50}, - {0x8001, 97}, - {0xc016, 97}, - {0x8001, 99}, - {0xc016, 99}, - {0x8001, 101}, - {0xc016, 101}, - {0x8001, 105}, - {0xc016, 105}, - {0x8001, 111}, - {0xc016, 111}, - }, - /* 3 */ - { - {0x8002, 48}, - {0x8009, 48}, - {0x8017, 48}, - {0xc028, 48}, - {0x8002, 49}, - {0x8009, 49}, - {0x8017, 49}, - {0xc028, 49}, - {0x8002, 50}, - {0x8009, 50}, - {0x8017, 50}, - {0xc028, 50}, - {0x8002, 97}, - {0x8009, 97}, - {0x8017, 97}, - {0xc028, 97}, - }, - /* 4 */ - { - {0x8003, 48}, - {0x8006, 48}, - {0x800a, 48}, - {0x800f, 48}, - {0x8018, 48}, - {0x801f, 48}, - {0x8029, 48}, - {0xc038, 48}, - {0x8003, 49}, - {0x8006, 49}, - {0x800a, 49}, - {0x800f, 49}, - {0x8018, 49}, - {0x801f, 49}, - {0x8029, 49}, - {0xc038, 49}, - }, - /* 5 */ - { - {0x8003, 50}, - {0x8006, 50}, - {0x800a, 50}, - {0x800f, 50}, - {0x8018, 50}, - {0x801f, 50}, - {0x8029, 50}, - {0xc038, 50}, - {0x8003, 97}, - {0x8006, 97}, - {0x800a, 97}, - {0x800f, 97}, - {0x8018, 97}, - {0x801f, 97}, - {0x8029, 97}, - {0xc038, 97}, - }, - /* 6 */ - { - {0x8002, 99}, - {0x8009, 99}, - {0x8017, 99}, - {0xc028, 99}, - {0x8002, 101}, - {0x8009, 101}, - {0x8017, 101}, - {0xc028, 101}, - {0x8002, 105}, - {0x8009, 105}, - {0x8017, 105}, - {0xc028, 105}, - {0x8002, 111}, - {0x8009, 111}, - {0x8017, 111}, - {0xc028, 111}, - }, - /* 7 */ - { - {0x8003, 99}, - {0x8006, 99}, - {0x800a, 99}, - {0x800f, 99}, - {0x8018, 99}, - {0x801f, 99}, - {0x8029, 99}, - {0xc038, 99}, - {0x8003, 101}, - {0x8006, 101}, - {0x800a, 101}, - {0x800f, 101}, - {0x8018, 101}, - {0x801f, 101}, - {0x8029, 101}, - {0xc038, 101}, - }, - /* 8 */ - { - {0x8003, 105}, - {0x8006, 105}, - {0x800a, 105}, - {0x800f, 105}, - {0x8018, 105}, - {0x801f, 105}, - {0x8029, 105}, - {0xc038, 105}, - {0x8003, 111}, - {0x8006, 111}, - {0x800a, 111}, - {0x800f, 111}, - {0x8018, 111}, - {0x801f, 111}, - {0x8029, 111}, - {0xc038, 111}, - }, - /* 9 */ - { - {0x8001, 115}, - {0xc016, 115}, - {0x8001, 116}, - {0xc016, 116}, - {0xc000, 32}, - {0xc000, 37}, - {0xc000, 45}, - {0xc000, 46}, - {0xc000, 47}, - {0xc000, 51}, - {0xc000, 52}, - {0xc000, 53}, - {0xc000, 54}, - {0xc000, 55}, - {0xc000, 56}, - {0xc000, 57}, - }, - /* 10 */ - { - {0x8002, 115}, - {0x8009, 115}, - {0x8017, 115}, - {0xc028, 115}, - {0x8002, 116}, - {0x8009, 116}, - {0x8017, 116}, - {0xc028, 116}, - {0x8001, 32}, - {0xc016, 32}, - {0x8001, 37}, - {0xc016, 37}, - {0x8001, 45}, - {0xc016, 45}, - {0x8001, 46}, - {0xc016, 46}, - }, - /* 11 */ - { - {0x8003, 115}, - {0x8006, 115}, - {0x800a, 115}, - {0x800f, 115}, - {0x8018, 115}, - {0x801f, 115}, - {0x8029, 115}, - {0xc038, 115}, - {0x8003, 116}, - {0x8006, 116}, - {0x800a, 116}, - {0x800f, 116}, - {0x8018, 116}, - {0x801f, 116}, - {0x8029, 116}, - {0xc038, 116}, - }, - /* 12 */ - { - {0x8002, 32}, - {0x8009, 32}, - {0x8017, 32}, - {0xc028, 32}, - {0x8002, 37}, - {0x8009, 37}, - {0x8017, 37}, - {0xc028, 37}, - {0x8002, 45}, - {0x8009, 45}, - {0x8017, 45}, - {0xc028, 45}, - {0x8002, 46}, - {0x8009, 46}, - {0x8017, 46}, - {0xc028, 46}, - }, - /* 13 */ - { - {0x8003, 32}, - {0x8006, 32}, - {0x800a, 32}, - {0x800f, 32}, - {0x8018, 32}, - {0x801f, 32}, - {0x8029, 32}, - {0xc038, 32}, - {0x8003, 37}, - {0x8006, 37}, - {0x800a, 37}, - {0x800f, 37}, - {0x8018, 37}, - {0x801f, 37}, - {0x8029, 37}, - {0xc038, 37}, - }, - /* 14 */ - { - {0x8003, 45}, - {0x8006, 45}, - {0x800a, 45}, - {0x800f, 45}, - {0x8018, 45}, - {0x801f, 45}, - {0x8029, 45}, - {0xc038, 45}, - {0x8003, 46}, - {0x8006, 46}, - {0x800a, 46}, - {0x800f, 46}, - {0x8018, 46}, - {0x801f, 46}, - {0x8029, 46}, - {0xc038, 46}, - }, - /* 15 */ - { - {0x8001, 47}, - {0xc016, 47}, - {0x8001, 51}, - {0xc016, 51}, - {0x8001, 52}, - {0xc016, 52}, - {0x8001, 53}, - {0xc016, 53}, - {0x8001, 54}, - {0xc016, 54}, - {0x8001, 55}, - {0xc016, 55}, - {0x8001, 56}, - {0xc016, 56}, - {0x8001, 57}, - {0xc016, 57}, - }, - /* 16 */ - { - {0x8002, 47}, - {0x8009, 47}, - {0x8017, 47}, - {0xc028, 47}, - {0x8002, 51}, - {0x8009, 51}, - {0x8017, 51}, - {0xc028, 51}, - {0x8002, 52}, - {0x8009, 52}, - {0x8017, 52}, - {0xc028, 52}, - {0x8002, 53}, - {0x8009, 53}, - {0x8017, 53}, - {0xc028, 53}, - }, - /* 17 */ - { - {0x8003, 47}, - {0x8006, 47}, - {0x800a, 47}, - {0x800f, 47}, - {0x8018, 47}, - {0x801f, 47}, - {0x8029, 47}, - {0xc038, 47}, - {0x8003, 51}, - {0x8006, 51}, - {0x800a, 51}, - {0x800f, 51}, - {0x8018, 51}, - {0x801f, 51}, - {0x8029, 51}, - {0xc038, 51}, - }, - /* 18 */ - { - {0x8003, 52}, - {0x8006, 52}, - {0x800a, 52}, - {0x800f, 52}, - {0x8018, 52}, - {0x801f, 52}, - {0x8029, 52}, - {0xc038, 52}, - {0x8003, 53}, - {0x8006, 53}, - {0x800a, 53}, - {0x800f, 53}, - {0x8018, 53}, - {0x801f, 53}, - {0x8029, 53}, - {0xc038, 53}, - }, - /* 19 */ - { - {0x8002, 54}, - {0x8009, 54}, - {0x8017, 54}, - {0xc028, 54}, - {0x8002, 55}, - {0x8009, 55}, - {0x8017, 55}, - {0xc028, 55}, - {0x8002, 56}, - {0x8009, 56}, - {0x8017, 56}, - {0xc028, 56}, - {0x8002, 57}, - {0x8009, 57}, - {0x8017, 57}, - {0xc028, 57}, - }, - /* 20 */ - { - {0x8003, 54}, - {0x8006, 54}, - {0x800a, 54}, - {0x800f, 54}, - {0x8018, 54}, - {0x801f, 54}, - {0x8029, 54}, - {0xc038, 54}, - {0x8003, 55}, - {0x8006, 55}, - {0x800a, 55}, - {0x800f, 55}, - {0x8018, 55}, - {0x801f, 55}, - {0x8029, 55}, - {0xc038, 55}, - }, - /* 21 */ - { - {0x8003, 56}, - {0x8006, 56}, - {0x800a, 56}, - {0x800f, 56}, - {0x8018, 56}, - {0x801f, 56}, - {0x8029, 56}, - {0xc038, 56}, - {0x8003, 57}, - {0x8006, 57}, - {0x800a, 57}, - {0x800f, 57}, - {0x8018, 57}, - {0x801f, 57}, - {0x8029, 57}, - {0xc038, 57}, - }, - /* 22 */ - { - {0x1a, 0}, - {0x1b, 0}, - {0x1d, 0}, - {0x1e, 0}, - {0x21, 0}, - {0x22, 0}, - {0x24, 0}, - {0x25, 0}, - {0x2b, 0}, - {0x2e, 0}, - {0x32, 0}, - {0x35, 0}, - {0x3a, 0}, - {0x3d, 0}, - {0x41, 0}, - {0x4044, 0}, - }, - /* 23 */ - { - {0xc000, 61}, - {0xc000, 65}, - {0xc000, 95}, - {0xc000, 98}, - {0xc000, 100}, - {0xc000, 102}, - {0xc000, 103}, - {0xc000, 104}, - {0xc000, 108}, - {0xc000, 109}, - {0xc000, 110}, - {0xc000, 112}, - {0xc000, 114}, - {0xc000, 117}, - {0x26, 0}, - {0x27, 0}, - }, - /* 24 */ - { - {0x8001, 61}, - {0xc016, 61}, - {0x8001, 65}, - {0xc016, 65}, - {0x8001, 95}, - {0xc016, 95}, - {0x8001, 98}, - {0xc016, 98}, - {0x8001, 100}, - {0xc016, 100}, - {0x8001, 102}, - {0xc016, 102}, - {0x8001, 103}, - {0xc016, 103}, - {0x8001, 104}, - {0xc016, 104}, - }, - /* 25 */ - { - {0x8002, 61}, - {0x8009, 61}, - {0x8017, 61}, - {0xc028, 61}, - {0x8002, 65}, - {0x8009, 65}, - {0x8017, 65}, - {0xc028, 65}, - {0x8002, 95}, - {0x8009, 95}, - {0x8017, 95}, - {0xc028, 95}, - {0x8002, 98}, - {0x8009, 98}, - {0x8017, 98}, - {0xc028, 98}, - }, - /* 26 */ - { - {0x8003, 61}, - {0x8006, 61}, - {0x800a, 61}, - {0x800f, 61}, - {0x8018, 61}, - {0x801f, 61}, - {0x8029, 61}, - {0xc038, 61}, - {0x8003, 65}, - {0x8006, 65}, - {0x800a, 65}, - {0x800f, 65}, - {0x8018, 65}, - {0x801f, 65}, - {0x8029, 65}, - {0xc038, 65}, - }, - /* 27 */ - { - {0x8003, 95}, - {0x8006, 95}, - {0x800a, 95}, - {0x800f, 95}, - {0x8018, 95}, - {0x801f, 95}, - {0x8029, 95}, - {0xc038, 95}, - {0x8003, 98}, - {0x8006, 98}, - {0x800a, 98}, - {0x800f, 98}, - {0x8018, 98}, - {0x801f, 98}, - {0x8029, 98}, - {0xc038, 98}, - }, - /* 28 */ - { - {0x8002, 100}, - {0x8009, 100}, - {0x8017, 100}, - {0xc028, 100}, - {0x8002, 102}, - {0x8009, 102}, - {0x8017, 102}, - {0xc028, 102}, - {0x8002, 103}, - {0x8009, 103}, - {0x8017, 103}, - {0xc028, 103}, - {0x8002, 104}, - {0x8009, 104}, - {0x8017, 104}, - {0xc028, 104}, - }, - /* 29 */ - { - {0x8003, 100}, - {0x8006, 100}, - {0x800a, 100}, - {0x800f, 100}, - {0x8018, 100}, - {0x801f, 100}, - {0x8029, 100}, - {0xc038, 100}, - {0x8003, 102}, - {0x8006, 102}, - {0x800a, 102}, - {0x800f, 102}, - {0x8018, 102}, - {0x801f, 102}, - {0x8029, 102}, - {0xc038, 102}, - }, - /* 30 */ - { - {0x8003, 103}, - {0x8006, 103}, - {0x800a, 103}, - {0x800f, 103}, - {0x8018, 103}, - {0x801f, 103}, - {0x8029, 103}, - {0xc038, 103}, - {0x8003, 104}, - {0x8006, 104}, - {0x800a, 104}, - {0x800f, 104}, - {0x8018, 104}, - {0x801f, 104}, - {0x8029, 104}, - {0xc038, 104}, - }, - /* 31 */ - { - {0x8001, 108}, - {0xc016, 108}, - {0x8001, 109}, - {0xc016, 109}, - {0x8001, 110}, - {0xc016, 110}, - {0x8001, 112}, - {0xc016, 112}, - {0x8001, 114}, - {0xc016, 114}, - {0x8001, 117}, - {0xc016, 117}, - {0xc000, 58}, - {0xc000, 66}, - {0xc000, 67}, - {0xc000, 68}, - }, - /* 32 */ - { - {0x8002, 108}, - {0x8009, 108}, - {0x8017, 108}, - {0xc028, 108}, - {0x8002, 109}, - {0x8009, 109}, - {0x8017, 109}, - {0xc028, 109}, - {0x8002, 110}, - {0x8009, 110}, - {0x8017, 110}, - {0xc028, 110}, - {0x8002, 112}, - {0x8009, 112}, - {0x8017, 112}, - {0xc028, 112}, - }, - /* 33 */ - { - {0x8003, 108}, - {0x8006, 108}, - {0x800a, 108}, - {0x800f, 108}, - {0x8018, 108}, - {0x801f, 108}, - {0x8029, 108}, - {0xc038, 108}, - {0x8003, 109}, - {0x8006, 109}, - {0x800a, 109}, - {0x800f, 109}, - {0x8018, 109}, - {0x801f, 109}, - {0x8029, 109}, - {0xc038, 109}, - }, - /* 34 */ - { - {0x8003, 110}, - {0x8006, 110}, - {0x800a, 110}, - {0x800f, 110}, - {0x8018, 110}, - {0x801f, 110}, - {0x8029, 110}, - {0xc038, 110}, - {0x8003, 112}, - {0x8006, 112}, - {0x800a, 112}, - {0x800f, 112}, - {0x8018, 112}, - {0x801f, 112}, - {0x8029, 112}, - {0xc038, 112}, - }, - /* 35 */ - { - {0x8002, 114}, - {0x8009, 114}, - {0x8017, 114}, - {0xc028, 114}, - {0x8002, 117}, - {0x8009, 117}, - {0x8017, 117}, - {0xc028, 117}, - {0x8001, 58}, - {0xc016, 58}, - {0x8001, 66}, - {0xc016, 66}, - {0x8001, 67}, - {0xc016, 67}, - {0x8001, 68}, - {0xc016, 68}, - }, - /* 36 */ - { - {0x8003, 114}, - {0x8006, 114}, - {0x800a, 114}, - {0x800f, 114}, - {0x8018, 114}, - {0x801f, 114}, - {0x8029, 114}, - {0xc038, 114}, - {0x8003, 117}, - {0x8006, 117}, - {0x800a, 117}, - {0x800f, 117}, - {0x8018, 117}, - {0x801f, 117}, - {0x8029, 117}, - {0xc038, 117}, - }, - /* 37 */ - { - {0x8002, 58}, - {0x8009, 58}, - {0x8017, 58}, - {0xc028, 58}, - {0x8002, 66}, - {0x8009, 66}, - {0x8017, 66}, - {0xc028, 66}, - {0x8002, 67}, - {0x8009, 67}, - {0x8017, 67}, - {0xc028, 67}, - {0x8002, 68}, - {0x8009, 68}, - {0x8017, 68}, - {0xc028, 68}, - }, - /* 38 */ - { - {0x8003, 58}, - {0x8006, 58}, - {0x800a, 58}, - {0x800f, 58}, - {0x8018, 58}, - {0x801f, 58}, - {0x8029, 58}, - {0xc038, 58}, - {0x8003, 66}, - {0x8006, 66}, - {0x800a, 66}, - {0x800f, 66}, - {0x8018, 66}, - {0x801f, 66}, - {0x8029, 66}, - {0xc038, 66}, - }, - /* 39 */ - { - {0x8003, 67}, - {0x8006, 67}, - {0x800a, 67}, - {0x800f, 67}, - {0x8018, 67}, - {0x801f, 67}, - {0x8029, 67}, - {0xc038, 67}, - {0x8003, 68}, - {0x8006, 68}, - {0x800a, 68}, - {0x800f, 68}, - {0x8018, 68}, - {0x801f, 68}, - {0x8029, 68}, - {0xc038, 68}, - }, - /* 40 */ - { - {0x2c, 0}, - {0x2d, 0}, - {0x2f, 0}, - {0x30, 0}, - {0x33, 0}, - {0x34, 0}, - {0x36, 0}, - {0x37, 0}, - {0x3b, 0}, - {0x3c, 0}, - {0x3e, 0}, - {0x3f, 0}, - {0x42, 0}, - {0x43, 0}, - {0x45, 0}, - {0x4048, 0}, - }, - /* 41 */ - { - {0xc000, 69}, - {0xc000, 70}, - {0xc000, 71}, - {0xc000, 72}, - {0xc000, 73}, - {0xc000, 74}, - {0xc000, 75}, - {0xc000, 76}, - {0xc000, 77}, - {0xc000, 78}, - {0xc000, 79}, - {0xc000, 80}, - {0xc000, 81}, - {0xc000, 82}, - {0xc000, 83}, - {0xc000, 84}, - }, - /* 42 */ - { - {0x8001, 69}, - {0xc016, 69}, - {0x8001, 70}, - {0xc016, 70}, - {0x8001, 71}, - {0xc016, 71}, - {0x8001, 72}, - {0xc016, 72}, - {0x8001, 73}, - {0xc016, 73}, - {0x8001, 74}, - {0xc016, 74}, - {0x8001, 75}, - {0xc016, 75}, - {0x8001, 76}, - {0xc016, 76}, - }, - /* 43 */ - { - {0x8002, 69}, - {0x8009, 69}, - {0x8017, 69}, - {0xc028, 69}, - {0x8002, 70}, - {0x8009, 70}, - {0x8017, 70}, - {0xc028, 70}, - {0x8002, 71}, - {0x8009, 71}, - {0x8017, 71}, - {0xc028, 71}, - {0x8002, 72}, - {0x8009, 72}, - {0x8017, 72}, - {0xc028, 72}, - }, - /* 44 */ - { - {0x8003, 69}, - {0x8006, 69}, - {0x800a, 69}, - {0x800f, 69}, - {0x8018, 69}, - {0x801f, 69}, - {0x8029, 69}, - {0xc038, 69}, - {0x8003, 70}, - {0x8006, 70}, - {0x800a, 70}, - {0x800f, 70}, - {0x8018, 70}, - {0x801f, 70}, - {0x8029, 70}, - {0xc038, 70}, - }, - /* 45 */ - { - {0x8003, 71}, - {0x8006, 71}, - {0x800a, 71}, - {0x800f, 71}, - {0x8018, 71}, - {0x801f, 71}, - {0x8029, 71}, - {0xc038, 71}, - {0x8003, 72}, - {0x8006, 72}, - {0x800a, 72}, - {0x800f, 72}, - {0x8018, 72}, - {0x801f, 72}, - {0x8029, 72}, - {0xc038, 72}, - }, - /* 46 */ - { - {0x8002, 73}, - {0x8009, 73}, - {0x8017, 73}, - {0xc028, 73}, - {0x8002, 74}, - {0x8009, 74}, - {0x8017, 74}, - {0xc028, 74}, - {0x8002, 75}, - {0x8009, 75}, - {0x8017, 75}, - {0xc028, 75}, - {0x8002, 76}, - {0x8009, 76}, - {0x8017, 76}, - {0xc028, 76}, - }, - /* 47 */ - { - {0x8003, 73}, - {0x8006, 73}, - {0x800a, 73}, - {0x800f, 73}, - {0x8018, 73}, - {0x801f, 73}, - {0x8029, 73}, - {0xc038, 73}, - {0x8003, 74}, - {0x8006, 74}, - {0x800a, 74}, - {0x800f, 74}, - {0x8018, 74}, - {0x801f, 74}, - {0x8029, 74}, - {0xc038, 74}, - }, - /* 48 */ - { - {0x8003, 75}, - {0x8006, 75}, - {0x800a, 75}, - {0x800f, 75}, - {0x8018, 75}, - {0x801f, 75}, - {0x8029, 75}, - {0xc038, 75}, - {0x8003, 76}, - {0x8006, 76}, - {0x800a, 76}, - {0x800f, 76}, - {0x8018, 76}, - {0x801f, 76}, - {0x8029, 76}, - {0xc038, 76}, - }, - /* 49 */ - { - {0x8001, 77}, - {0xc016, 77}, - {0x8001, 78}, - {0xc016, 78}, - {0x8001, 79}, - {0xc016, 79}, - {0x8001, 80}, - {0xc016, 80}, - {0x8001, 81}, - {0xc016, 81}, - {0x8001, 82}, - {0xc016, 82}, - {0x8001, 83}, - {0xc016, 83}, - {0x8001, 84}, - {0xc016, 84}, - }, - /* 50 */ - { - {0x8002, 77}, - {0x8009, 77}, - {0x8017, 77}, - {0xc028, 77}, - {0x8002, 78}, - {0x8009, 78}, - {0x8017, 78}, - {0xc028, 78}, - {0x8002, 79}, - {0x8009, 79}, - {0x8017, 79}, - {0xc028, 79}, - {0x8002, 80}, - {0x8009, 80}, - {0x8017, 80}, - {0xc028, 80}, - }, - /* 51 */ - { - {0x8003, 77}, - {0x8006, 77}, - {0x800a, 77}, - {0x800f, 77}, - {0x8018, 77}, - {0x801f, 77}, - {0x8029, 77}, - {0xc038, 77}, - {0x8003, 78}, - {0x8006, 78}, - {0x800a, 78}, - {0x800f, 78}, - {0x8018, 78}, - {0x801f, 78}, - {0x8029, 78}, - {0xc038, 78}, - }, - /* 52 */ - { - {0x8003, 79}, - {0x8006, 79}, - {0x800a, 79}, - {0x800f, 79}, - {0x8018, 79}, - {0x801f, 79}, - {0x8029, 79}, - {0xc038, 79}, - {0x8003, 80}, - {0x8006, 80}, - {0x800a, 80}, - {0x800f, 80}, - {0x8018, 80}, - {0x801f, 80}, - {0x8029, 80}, - {0xc038, 80}, - }, - /* 53 */ - { - {0x8002, 81}, - {0x8009, 81}, - {0x8017, 81}, - {0xc028, 81}, - {0x8002, 82}, - {0x8009, 82}, - {0x8017, 82}, - {0xc028, 82}, - {0x8002, 83}, - {0x8009, 83}, - {0x8017, 83}, - {0xc028, 83}, - {0x8002, 84}, - {0x8009, 84}, - {0x8017, 84}, - {0xc028, 84}, - }, - /* 54 */ - { - {0x8003, 81}, - {0x8006, 81}, - {0x800a, 81}, - {0x800f, 81}, - {0x8018, 81}, - {0x801f, 81}, - {0x8029, 81}, - {0xc038, 81}, - {0x8003, 82}, - {0x8006, 82}, - {0x800a, 82}, - {0x800f, 82}, - {0x8018, 82}, - {0x801f, 82}, - {0x8029, 82}, - {0xc038, 82}, - }, - /* 55 */ - { - {0x8003, 83}, - {0x8006, 83}, - {0x800a, 83}, - {0x800f, 83}, - {0x8018, 83}, - {0x801f, 83}, - {0x8029, 83}, - {0xc038, 83}, - {0x8003, 84}, - {0x8006, 84}, - {0x800a, 84}, - {0x800f, 84}, - {0x8018, 84}, - {0x801f, 84}, - {0x8029, 84}, - {0xc038, 84}, - }, - /* 56 */ - { - {0xc000, 85}, - {0xc000, 86}, - {0xc000, 87}, - {0xc000, 89}, - {0xc000, 106}, - {0xc000, 107}, - {0xc000, 113}, - {0xc000, 118}, - {0xc000, 119}, - {0xc000, 120}, - {0xc000, 121}, - {0xc000, 122}, - {0x46, 0}, - {0x47, 0}, - {0x49, 0}, - {0x404a, 0}, - }, - /* 57 */ - { - {0x8001, 85}, - {0xc016, 85}, - {0x8001, 86}, - {0xc016, 86}, - {0x8001, 87}, - {0xc016, 87}, - {0x8001, 89}, - {0xc016, 89}, - {0x8001, 106}, - {0xc016, 106}, - {0x8001, 107}, - {0xc016, 107}, - {0x8001, 113}, - {0xc016, 113}, - {0x8001, 118}, - {0xc016, 118}, - }, - /* 58 */ - { - {0x8002, 85}, - {0x8009, 85}, - {0x8017, 85}, - {0xc028, 85}, - {0x8002, 86}, - {0x8009, 86}, - {0x8017, 86}, - {0xc028, 86}, - {0x8002, 87}, - {0x8009, 87}, - {0x8017, 87}, - {0xc028, 87}, - {0x8002, 89}, - {0x8009, 89}, - {0x8017, 89}, - {0xc028, 89}, - }, - /* 59 */ - { - {0x8003, 85}, - {0x8006, 85}, - {0x800a, 85}, - {0x800f, 85}, - {0x8018, 85}, - {0x801f, 85}, - {0x8029, 85}, - {0xc038, 85}, - {0x8003, 86}, - {0x8006, 86}, - {0x800a, 86}, - {0x800f, 86}, - {0x8018, 86}, - {0x801f, 86}, - {0x8029, 86}, - {0xc038, 86}, - }, - /* 60 */ - { - {0x8003, 87}, - {0x8006, 87}, - {0x800a, 87}, - {0x800f, 87}, - {0x8018, 87}, - {0x801f, 87}, - {0x8029, 87}, - {0xc038, 87}, - {0x8003, 89}, - {0x8006, 89}, - {0x800a, 89}, - {0x800f, 89}, - {0x8018, 89}, - {0x801f, 89}, - {0x8029, 89}, - {0xc038, 89}, - }, - /* 61 */ - { - {0x8002, 106}, - {0x8009, 106}, - {0x8017, 106}, - {0xc028, 106}, - {0x8002, 107}, - {0x8009, 107}, - {0x8017, 107}, - {0xc028, 107}, - {0x8002, 113}, - {0x8009, 113}, - {0x8017, 113}, - {0xc028, 113}, - {0x8002, 118}, - {0x8009, 118}, - {0x8017, 118}, - {0xc028, 118}, - }, - /* 62 */ - { - {0x8003, 106}, - {0x8006, 106}, - {0x800a, 106}, - {0x800f, 106}, - {0x8018, 106}, - {0x801f, 106}, - {0x8029, 106}, - {0xc038, 106}, - {0x8003, 107}, - {0x8006, 107}, - {0x800a, 107}, - {0x800f, 107}, - {0x8018, 107}, - {0x801f, 107}, - {0x8029, 107}, - {0xc038, 107}, - }, - /* 63 */ - { - {0x8003, 113}, - {0x8006, 113}, - {0x800a, 113}, - {0x800f, 113}, - {0x8018, 113}, - {0x801f, 113}, - {0x8029, 113}, - {0xc038, 113}, - {0x8003, 118}, - {0x8006, 118}, - {0x800a, 118}, - {0x800f, 118}, - {0x8018, 118}, - {0x801f, 118}, - {0x8029, 118}, - {0xc038, 118}, - }, - /* 64 */ - { - {0x8001, 119}, - {0xc016, 119}, - {0x8001, 120}, - {0xc016, 120}, - {0x8001, 121}, - {0xc016, 121}, - {0x8001, 122}, - {0xc016, 122}, - {0xc000, 38}, - {0xc000, 42}, - {0xc000, 44}, - {0xc000, 59}, - {0xc000, 88}, - {0xc000, 90}, - {0x4b, 0}, - {0x4e, 0}, - }, - /* 65 */ - { - {0x8002, 119}, - {0x8009, 119}, - {0x8017, 119}, - {0xc028, 119}, - {0x8002, 120}, - {0x8009, 120}, - {0x8017, 120}, - {0xc028, 120}, - {0x8002, 121}, - {0x8009, 121}, - {0x8017, 121}, - {0xc028, 121}, - {0x8002, 122}, - {0x8009, 122}, - {0x8017, 122}, - {0xc028, 122}, - }, - /* 66 */ - { - {0x8003, 119}, - {0x8006, 119}, - {0x800a, 119}, - {0x800f, 119}, - {0x8018, 119}, - {0x801f, 119}, - {0x8029, 119}, - {0xc038, 119}, - {0x8003, 120}, - {0x8006, 120}, - {0x800a, 120}, - {0x800f, 120}, - {0x8018, 120}, - {0x801f, 120}, - {0x8029, 120}, - {0xc038, 120}, - }, - /* 67 */ - { - {0x8003, 121}, - {0x8006, 121}, - {0x800a, 121}, - {0x800f, 121}, - {0x8018, 121}, - {0x801f, 121}, - {0x8029, 121}, - {0xc038, 121}, - {0x8003, 122}, - {0x8006, 122}, - {0x800a, 122}, - {0x800f, 122}, - {0x8018, 122}, - {0x801f, 122}, - {0x8029, 122}, - {0xc038, 122}, - }, - /* 68 */ - { - {0x8001, 38}, - {0xc016, 38}, - {0x8001, 42}, - {0xc016, 42}, - {0x8001, 44}, - {0xc016, 44}, - {0x8001, 59}, - {0xc016, 59}, - {0x8001, 88}, - {0xc016, 88}, - {0x8001, 90}, - {0xc016, 90}, - {0x4c, 0}, - {0x4d, 0}, - {0x4f, 0}, - {0x51, 0}, - }, - /* 69 */ - { - {0x8002, 38}, - {0x8009, 38}, - {0x8017, 38}, - {0xc028, 38}, - {0x8002, 42}, - {0x8009, 42}, - {0x8017, 42}, - {0xc028, 42}, - {0x8002, 44}, - {0x8009, 44}, - {0x8017, 44}, - {0xc028, 44}, - {0x8002, 59}, - {0x8009, 59}, - {0x8017, 59}, - {0xc028, 59}, - }, - /* 70 */ - { - {0x8003, 38}, - {0x8006, 38}, - {0x800a, 38}, - {0x800f, 38}, - {0x8018, 38}, - {0x801f, 38}, - {0x8029, 38}, - {0xc038, 38}, - {0x8003, 42}, - {0x8006, 42}, - {0x800a, 42}, - {0x800f, 42}, - {0x8018, 42}, - {0x801f, 42}, - {0x8029, 42}, - {0xc038, 42}, - }, - /* 71 */ - { - {0x8003, 44}, - {0x8006, 44}, - {0x800a, 44}, - {0x800f, 44}, - {0x8018, 44}, - {0x801f, 44}, - {0x8029, 44}, - {0xc038, 44}, - {0x8003, 59}, - {0x8006, 59}, - {0x800a, 59}, - {0x800f, 59}, - {0x8018, 59}, - {0x801f, 59}, - {0x8029, 59}, - {0xc038, 59}, - }, - /* 72 */ - { - {0x8002, 88}, - {0x8009, 88}, - {0x8017, 88}, - {0xc028, 88}, - {0x8002, 90}, - {0x8009, 90}, - {0x8017, 90}, - {0xc028, 90}, - {0xc000, 33}, - {0xc000, 34}, - {0xc000, 40}, - {0xc000, 41}, - {0xc000, 63}, - {0x50, 0}, - {0x52, 0}, - {0x54, 0}, - }, - /* 73 */ - { - {0x8003, 88}, - {0x8006, 88}, - {0x800a, 88}, - {0x800f, 88}, - {0x8018, 88}, - {0x801f, 88}, - {0x8029, 88}, - {0xc038, 88}, - {0x8003, 90}, - {0x8006, 90}, - {0x800a, 90}, - {0x800f, 90}, - {0x8018, 90}, - {0x801f, 90}, - {0x8029, 90}, - {0xc038, 90}, - }, - /* 74 */ - { - {0x8001, 33}, - {0xc016, 33}, - {0x8001, 34}, - {0xc016, 34}, - {0x8001, 40}, - {0xc016, 40}, - {0x8001, 41}, - {0xc016, 41}, - {0x8001, 63}, - {0xc016, 63}, - {0xc000, 39}, - {0xc000, 43}, - {0xc000, 124}, - {0x53, 0}, - {0x55, 0}, - {0x58, 0}, - }, - /* 75 */ - { - {0x8002, 33}, - {0x8009, 33}, - {0x8017, 33}, - {0xc028, 33}, - {0x8002, 34}, - {0x8009, 34}, - {0x8017, 34}, - {0xc028, 34}, - {0x8002, 40}, - {0x8009, 40}, - {0x8017, 40}, - {0xc028, 40}, - {0x8002, 41}, - {0x8009, 41}, - {0x8017, 41}, - {0xc028, 41}, - }, - /* 76 */ - { - {0x8003, 33}, - {0x8006, 33}, - {0x800a, 33}, - {0x800f, 33}, - {0x8018, 33}, - {0x801f, 33}, - {0x8029, 33}, - {0xc038, 33}, - {0x8003, 34}, - {0x8006, 34}, - {0x800a, 34}, - {0x800f, 34}, - {0x8018, 34}, - {0x801f, 34}, - {0x8029, 34}, - {0xc038, 34}, - }, - /* 77 */ - { - {0x8003, 40}, - {0x8006, 40}, - {0x800a, 40}, - {0x800f, 40}, - {0x8018, 40}, - {0x801f, 40}, - {0x8029, 40}, - {0xc038, 40}, - {0x8003, 41}, - {0x8006, 41}, - {0x800a, 41}, - {0x800f, 41}, - {0x8018, 41}, - {0x801f, 41}, - {0x8029, 41}, - {0xc038, 41}, - }, - /* 78 */ - { - {0x8002, 63}, - {0x8009, 63}, - {0x8017, 63}, - {0xc028, 63}, - {0x8001, 39}, - {0xc016, 39}, - {0x8001, 43}, - {0xc016, 43}, - {0x8001, 124}, - {0xc016, 124}, - {0xc000, 35}, - {0xc000, 62}, - {0x56, 0}, - {0x57, 0}, - {0x59, 0}, - {0x5a, 0}, - }, - /* 79 */ - { - {0x8003, 63}, - {0x8006, 63}, - {0x800a, 63}, - {0x800f, 63}, - {0x8018, 63}, - {0x801f, 63}, - {0x8029, 63}, - {0xc038, 63}, - {0x8002, 39}, - {0x8009, 39}, - {0x8017, 39}, - {0xc028, 39}, - {0x8002, 43}, - {0x8009, 43}, - {0x8017, 43}, - {0xc028, 43}, - }, - /* 80 */ - { - {0x8003, 39}, - {0x8006, 39}, - {0x800a, 39}, - {0x800f, 39}, - {0x8018, 39}, - {0x801f, 39}, - {0x8029, 39}, - {0xc038, 39}, - {0x8003, 43}, - {0x8006, 43}, - {0x800a, 43}, - {0x800f, 43}, - {0x8018, 43}, - {0x801f, 43}, - {0x8029, 43}, - {0xc038, 43}, - }, - /* 81 */ - { - {0x8002, 124}, - {0x8009, 124}, - {0x8017, 124}, - {0xc028, 124}, - {0x8001, 35}, - {0xc016, 35}, - {0x8001, 62}, - {0xc016, 62}, - {0xc000, 0}, - {0xc000, 36}, - {0xc000, 64}, - {0xc000, 91}, - {0xc000, 93}, - {0xc000, 126}, - {0x5b, 0}, - {0x5c, 0}, - }, - /* 82 */ - { - {0x8003, 124}, - {0x8006, 124}, - {0x800a, 124}, - {0x800f, 124}, - {0x8018, 124}, - {0x801f, 124}, - {0x8029, 124}, - {0xc038, 124}, - {0x8002, 35}, - {0x8009, 35}, - {0x8017, 35}, - {0xc028, 35}, - {0x8002, 62}, - {0x8009, 62}, - {0x8017, 62}, - {0xc028, 62}, - }, - /* 83 */ - { - {0x8003, 35}, - {0x8006, 35}, - {0x800a, 35}, - {0x800f, 35}, - {0x8018, 35}, - {0x801f, 35}, - {0x8029, 35}, - {0xc038, 35}, - {0x8003, 62}, - {0x8006, 62}, - {0x800a, 62}, - {0x800f, 62}, - {0x8018, 62}, - {0x801f, 62}, - {0x8029, 62}, - {0xc038, 62}, - }, - /* 84 */ - { - {0x8001, 0}, - {0xc016, 0}, - {0x8001, 36}, - {0xc016, 36}, - {0x8001, 64}, - {0xc016, 64}, - {0x8001, 91}, - {0xc016, 91}, - {0x8001, 93}, - {0xc016, 93}, - {0x8001, 126}, - {0xc016, 126}, - {0xc000, 94}, - {0xc000, 125}, - {0x5d, 0}, - {0x5e, 0}, - }, - /* 85 */ - { - {0x8002, 0}, - {0x8009, 0}, - {0x8017, 0}, - {0xc028, 0}, - {0x8002, 36}, - {0x8009, 36}, - {0x8017, 36}, - {0xc028, 36}, - {0x8002, 64}, - {0x8009, 64}, - {0x8017, 64}, - {0xc028, 64}, - {0x8002, 91}, - {0x8009, 91}, - {0x8017, 91}, - {0xc028, 91}, - }, - /* 86 */ - { - {0x8003, 0}, - {0x8006, 0}, - {0x800a, 0}, - {0x800f, 0}, - {0x8018, 0}, - {0x801f, 0}, - {0x8029, 0}, - {0xc038, 0}, - {0x8003, 36}, - {0x8006, 36}, - {0x800a, 36}, - {0x800f, 36}, - {0x8018, 36}, - {0x801f, 36}, - {0x8029, 36}, - {0xc038, 36}, - }, - /* 87 */ - { - {0x8003, 64}, - {0x8006, 64}, - {0x800a, 64}, - {0x800f, 64}, - {0x8018, 64}, - {0x801f, 64}, - {0x8029, 64}, - {0xc038, 64}, - {0x8003, 91}, - {0x8006, 91}, - {0x800a, 91}, - {0x800f, 91}, - {0x8018, 91}, - {0x801f, 91}, - {0x8029, 91}, - {0xc038, 91}, - }, - /* 88 */ - { - {0x8002, 93}, - {0x8009, 93}, - {0x8017, 93}, - {0xc028, 93}, - {0x8002, 126}, - {0x8009, 126}, - {0x8017, 126}, - {0xc028, 126}, - {0x8001, 94}, - {0xc016, 94}, - {0x8001, 125}, - {0xc016, 125}, - {0xc000, 60}, - {0xc000, 96}, - {0xc000, 123}, - {0x5f, 0}, - }, - /* 89 */ - { - {0x8003, 93}, - {0x8006, 93}, - {0x800a, 93}, - {0x800f, 93}, - {0x8018, 93}, - {0x801f, 93}, - {0x8029, 93}, - {0xc038, 93}, - {0x8003, 126}, - {0x8006, 126}, - {0x800a, 126}, - {0x800f, 126}, - {0x8018, 126}, - {0x801f, 126}, - {0x8029, 126}, - {0xc038, 126}, - }, - /* 90 */ - { - {0x8002, 94}, - {0x8009, 94}, - {0x8017, 94}, - {0xc028, 94}, - {0x8002, 125}, - {0x8009, 125}, - {0x8017, 125}, - {0xc028, 125}, - {0x8001, 60}, - {0xc016, 60}, - {0x8001, 96}, - {0xc016, 96}, - {0x8001, 123}, - {0xc016, 123}, - {0x60, 0}, - {0x6e, 0}, - }, - /* 91 */ - { - {0x8003, 94}, - {0x8006, 94}, - {0x800a, 94}, - {0x800f, 94}, - {0x8018, 94}, - {0x801f, 94}, - {0x8029, 94}, - {0xc038, 94}, - {0x8003, 125}, - {0x8006, 125}, - {0x800a, 125}, - {0x800f, 125}, - {0x8018, 125}, - {0x801f, 125}, - {0x8029, 125}, - {0xc038, 125}, - }, - /* 92 */ - { - {0x8002, 60}, - {0x8009, 60}, - {0x8017, 60}, - {0xc028, 60}, - {0x8002, 96}, - {0x8009, 96}, - {0x8017, 96}, - {0xc028, 96}, - {0x8002, 123}, - {0x8009, 123}, - {0x8017, 123}, - {0xc028, 123}, - {0x61, 0}, - {0x65, 0}, - {0x6f, 0}, - {0x85, 0}, - }, - /* 93 */ - { - {0x8003, 60}, - {0x8006, 60}, - {0x800a, 60}, - {0x800f, 60}, - {0x8018, 60}, - {0x801f, 60}, - {0x8029, 60}, - {0xc038, 60}, - {0x8003, 96}, - {0x8006, 96}, - {0x800a, 96}, - {0x800f, 96}, - {0x8018, 96}, - {0x801f, 96}, - {0x8029, 96}, - {0xc038, 96}, - }, - /* 94 */ - { - {0x8003, 123}, - {0x8006, 123}, - {0x800a, 123}, - {0x800f, 123}, - {0x8018, 123}, - {0x801f, 123}, - {0x8029, 123}, - {0xc038, 123}, - {0x62, 0}, - {0x63, 0}, - {0x66, 0}, - {0x69, 0}, - {0x70, 0}, - {0x77, 0}, - {0x86, 0}, - {0x99, 0}, - }, - /* 95 */ - { - {0xc000, 92}, - {0xc000, 195}, - {0xc000, 208}, - {0x64, 0}, - {0x67, 0}, - {0x68, 0}, - {0x6a, 0}, - {0x6b, 0}, - {0x71, 0}, - {0x74, 0}, - {0x78, 0}, - {0x7e, 0}, - {0x87, 0}, - {0x8e, 0}, - {0x9a, 0}, - {0xa9, 0}, - }, - /* 96 */ - { - {0x8001, 92}, - {0xc016, 92}, - {0x8001, 195}, - {0xc016, 195}, - {0x8001, 208}, - {0xc016, 208}, - {0xc000, 128}, - {0xc000, 130}, - {0xc000, 131}, - {0xc000, 162}, - {0xc000, 184}, - {0xc000, 194}, - {0xc000, 224}, - {0xc000, 226}, - {0x6c, 0}, - {0x6d, 0}, - }, - /* 97 */ - { - {0x8002, 92}, - {0x8009, 92}, - {0x8017, 92}, - {0xc028, 92}, - {0x8002, 195}, - {0x8009, 195}, - {0x8017, 195}, - {0xc028, 195}, - {0x8002, 208}, - {0x8009, 208}, - {0x8017, 208}, - {0xc028, 208}, - {0x8001, 128}, - {0xc016, 128}, - {0x8001, 130}, - {0xc016, 130}, - }, - /* 98 */ - { - {0x8003, 92}, - {0x8006, 92}, - {0x800a, 92}, - {0x800f, 92}, - {0x8018, 92}, - {0x801f, 92}, - {0x8029, 92}, - {0xc038, 92}, - {0x8003, 195}, - {0x8006, 195}, - {0x800a, 195}, - {0x800f, 195}, - {0x8018, 195}, - {0x801f, 195}, - {0x8029, 195}, - {0xc038, 195}, - }, - /* 99 */ - { - {0x8003, 208}, - {0x8006, 208}, - {0x800a, 208}, - {0x800f, 208}, - {0x8018, 208}, - {0x801f, 208}, - {0x8029, 208}, - {0xc038, 208}, - {0x8002, 128}, - {0x8009, 128}, - {0x8017, 128}, - {0xc028, 128}, - {0x8002, 130}, - {0x8009, 130}, - {0x8017, 130}, - {0xc028, 130}, - }, - /* 100 */ - { - {0x8003, 128}, - {0x8006, 128}, - {0x800a, 128}, - {0x800f, 128}, - {0x8018, 128}, - {0x801f, 128}, - {0x8029, 128}, - {0xc038, 128}, - {0x8003, 130}, - {0x8006, 130}, - {0x800a, 130}, - {0x800f, 130}, - {0x8018, 130}, - {0x801f, 130}, - {0x8029, 130}, - {0xc038, 130}, - }, - /* 101 */ - { - {0x8001, 131}, - {0xc016, 131}, - {0x8001, 162}, - {0xc016, 162}, - {0x8001, 184}, - {0xc016, 184}, - {0x8001, 194}, - {0xc016, 194}, - {0x8001, 224}, - {0xc016, 224}, - {0x8001, 226}, - {0xc016, 226}, - {0xc000, 153}, - {0xc000, 161}, - {0xc000, 167}, - {0xc000, 172}, - }, - /* 102 */ - { - {0x8002, 131}, - {0x8009, 131}, - {0x8017, 131}, - {0xc028, 131}, - {0x8002, 162}, - {0x8009, 162}, - {0x8017, 162}, - {0xc028, 162}, - {0x8002, 184}, - {0x8009, 184}, - {0x8017, 184}, - {0xc028, 184}, - {0x8002, 194}, - {0x8009, 194}, - {0x8017, 194}, - {0xc028, 194}, - }, - /* 103 */ - { - {0x8003, 131}, - {0x8006, 131}, - {0x800a, 131}, - {0x800f, 131}, - {0x8018, 131}, - {0x801f, 131}, - {0x8029, 131}, - {0xc038, 131}, - {0x8003, 162}, - {0x8006, 162}, - {0x800a, 162}, - {0x800f, 162}, - {0x8018, 162}, - {0x801f, 162}, - {0x8029, 162}, - {0xc038, 162}, - }, - /* 104 */ - { - {0x8003, 184}, - {0x8006, 184}, - {0x800a, 184}, - {0x800f, 184}, - {0x8018, 184}, - {0x801f, 184}, - {0x8029, 184}, - {0xc038, 184}, - {0x8003, 194}, - {0x8006, 194}, - {0x800a, 194}, - {0x800f, 194}, - {0x8018, 194}, - {0x801f, 194}, - {0x8029, 194}, - {0xc038, 194}, - }, - /* 105 */ - { - {0x8002, 224}, - {0x8009, 224}, - {0x8017, 224}, - {0xc028, 224}, - {0x8002, 226}, - {0x8009, 226}, - {0x8017, 226}, - {0xc028, 226}, - {0x8001, 153}, - {0xc016, 153}, - {0x8001, 161}, - {0xc016, 161}, - {0x8001, 167}, - {0xc016, 167}, - {0x8001, 172}, - {0xc016, 172}, - }, - /* 106 */ - { - {0x8003, 224}, - {0x8006, 224}, - {0x800a, 224}, - {0x800f, 224}, - {0x8018, 224}, - {0x801f, 224}, - {0x8029, 224}, - {0xc038, 224}, - {0x8003, 226}, - {0x8006, 226}, - {0x800a, 226}, - {0x800f, 226}, - {0x8018, 226}, - {0x801f, 226}, - {0x8029, 226}, - {0xc038, 226}, - }, - /* 107 */ - { - {0x8002, 153}, - {0x8009, 153}, - {0x8017, 153}, - {0xc028, 153}, - {0x8002, 161}, - {0x8009, 161}, - {0x8017, 161}, - {0xc028, 161}, - {0x8002, 167}, - {0x8009, 167}, - {0x8017, 167}, - {0xc028, 167}, - {0x8002, 172}, - {0x8009, 172}, - {0x8017, 172}, - {0xc028, 172}, - }, - /* 108 */ - { - {0x8003, 153}, - {0x8006, 153}, - {0x800a, 153}, - {0x800f, 153}, - {0x8018, 153}, - {0x801f, 153}, - {0x8029, 153}, - {0xc038, 153}, - {0x8003, 161}, - {0x8006, 161}, - {0x800a, 161}, - {0x800f, 161}, - {0x8018, 161}, - {0x801f, 161}, - {0x8029, 161}, - {0xc038, 161}, - }, - /* 109 */ - { - {0x8003, 167}, - {0x8006, 167}, - {0x800a, 167}, - {0x800f, 167}, - {0x8018, 167}, - {0x801f, 167}, - {0x8029, 167}, - {0xc038, 167}, - {0x8003, 172}, - {0x8006, 172}, - {0x800a, 172}, - {0x800f, 172}, - {0x8018, 172}, - {0x801f, 172}, - {0x8029, 172}, - {0xc038, 172}, - }, - /* 110 */ - { - {0x72, 0}, - {0x73, 0}, - {0x75, 0}, - {0x76, 0}, - {0x79, 0}, - {0x7b, 0}, - {0x7f, 0}, - {0x82, 0}, - {0x88, 0}, - {0x8b, 0}, - {0x8f, 0}, - {0x92, 0}, - {0x9b, 0}, - {0xa2, 0}, - {0xaa, 0}, - {0xb4, 0}, - }, - /* 111 */ - { - {0xc000, 176}, - {0xc000, 177}, - {0xc000, 179}, - {0xc000, 209}, - {0xc000, 216}, - {0xc000, 217}, - {0xc000, 227}, - {0xc000, 229}, - {0xc000, 230}, - {0x7a, 0}, - {0x7c, 0}, - {0x7d, 0}, - {0x80, 0}, - {0x81, 0}, - {0x83, 0}, - {0x84, 0}, - }, - /* 112 */ - { - {0x8001, 176}, - {0xc016, 176}, - {0x8001, 177}, - {0xc016, 177}, - {0x8001, 179}, - {0xc016, 179}, - {0x8001, 209}, - {0xc016, 209}, - {0x8001, 216}, - {0xc016, 216}, - {0x8001, 217}, - {0xc016, 217}, - {0x8001, 227}, - {0xc016, 227}, - {0x8001, 229}, - {0xc016, 229}, - }, - /* 113 */ - { - {0x8002, 176}, - {0x8009, 176}, - {0x8017, 176}, - {0xc028, 176}, - {0x8002, 177}, - {0x8009, 177}, - {0x8017, 177}, - {0xc028, 177}, - {0x8002, 179}, - {0x8009, 179}, - {0x8017, 179}, - {0xc028, 179}, - {0x8002, 209}, - {0x8009, 209}, - {0x8017, 209}, - {0xc028, 209}, - }, - /* 114 */ - { - {0x8003, 176}, - {0x8006, 176}, - {0x800a, 176}, - {0x800f, 176}, - {0x8018, 176}, - {0x801f, 176}, - {0x8029, 176}, - {0xc038, 176}, - {0x8003, 177}, - {0x8006, 177}, - {0x800a, 177}, - {0x800f, 177}, - {0x8018, 177}, - {0x801f, 177}, - {0x8029, 177}, - {0xc038, 177}, - }, - /* 115 */ - { - {0x8003, 179}, - {0x8006, 179}, - {0x800a, 179}, - {0x800f, 179}, - {0x8018, 179}, - {0x801f, 179}, - {0x8029, 179}, - {0xc038, 179}, - {0x8003, 209}, - {0x8006, 209}, - {0x800a, 209}, - {0x800f, 209}, - {0x8018, 209}, - {0x801f, 209}, - {0x8029, 209}, - {0xc038, 209}, - }, - /* 116 */ - { - {0x8002, 216}, - {0x8009, 216}, - {0x8017, 216}, - {0xc028, 216}, - {0x8002, 217}, - {0x8009, 217}, - {0x8017, 217}, - {0xc028, 217}, - {0x8002, 227}, - {0x8009, 227}, - {0x8017, 227}, - {0xc028, 227}, - {0x8002, 229}, - {0x8009, 229}, - {0x8017, 229}, - {0xc028, 229}, - }, - /* 117 */ - { - {0x8003, 216}, - {0x8006, 216}, - {0x800a, 216}, - {0x800f, 216}, - {0x8018, 216}, - {0x801f, 216}, - {0x8029, 216}, - {0xc038, 216}, - {0x8003, 217}, - {0x8006, 217}, - {0x800a, 217}, - {0x800f, 217}, - {0x8018, 217}, - {0x801f, 217}, - {0x8029, 217}, - {0xc038, 217}, - }, - /* 118 */ - { - {0x8003, 227}, - {0x8006, 227}, - {0x800a, 227}, - {0x800f, 227}, - {0x8018, 227}, - {0x801f, 227}, - {0x8029, 227}, - {0xc038, 227}, - {0x8003, 229}, - {0x8006, 229}, - {0x800a, 229}, - {0x800f, 229}, - {0x8018, 229}, - {0x801f, 229}, - {0x8029, 229}, - {0xc038, 229}, - }, - /* 119 */ - { - {0x8001, 230}, - {0xc016, 230}, - {0xc000, 129}, - {0xc000, 132}, - {0xc000, 133}, - {0xc000, 134}, - {0xc000, 136}, - {0xc000, 146}, - {0xc000, 154}, - {0xc000, 156}, - {0xc000, 160}, - {0xc000, 163}, - {0xc000, 164}, - {0xc000, 169}, - {0xc000, 170}, - {0xc000, 173}, - }, - /* 120 */ - { - {0x8002, 230}, - {0x8009, 230}, - {0x8017, 230}, - {0xc028, 230}, - {0x8001, 129}, - {0xc016, 129}, - {0x8001, 132}, - {0xc016, 132}, - {0x8001, 133}, - {0xc016, 133}, - {0x8001, 134}, - {0xc016, 134}, - {0x8001, 136}, - {0xc016, 136}, - {0x8001, 146}, - {0xc016, 146}, - }, - /* 121 */ - { - {0x8003, 230}, - {0x8006, 230}, - {0x800a, 230}, - {0x800f, 230}, - {0x8018, 230}, - {0x801f, 230}, - {0x8029, 230}, - {0xc038, 230}, - {0x8002, 129}, - {0x8009, 129}, - {0x8017, 129}, - {0xc028, 129}, - {0x8002, 132}, - {0x8009, 132}, - {0x8017, 132}, - {0xc028, 132}, - }, - /* 122 */ - { - {0x8003, 129}, - {0x8006, 129}, - {0x800a, 129}, - {0x800f, 129}, - {0x8018, 129}, - {0x801f, 129}, - {0x8029, 129}, - {0xc038, 129}, - {0x8003, 132}, - {0x8006, 132}, - {0x800a, 132}, - {0x800f, 132}, - {0x8018, 132}, - {0x801f, 132}, - {0x8029, 132}, - {0xc038, 132}, - }, - /* 123 */ - { - {0x8002, 133}, - {0x8009, 133}, - {0x8017, 133}, - {0xc028, 133}, - {0x8002, 134}, - {0x8009, 134}, - {0x8017, 134}, - {0xc028, 134}, - {0x8002, 136}, - {0x8009, 136}, - {0x8017, 136}, - {0xc028, 136}, - {0x8002, 146}, - {0x8009, 146}, - {0x8017, 146}, - {0xc028, 146}, - }, - /* 124 */ - { - {0x8003, 133}, - {0x8006, 133}, - {0x800a, 133}, - {0x800f, 133}, - {0x8018, 133}, - {0x801f, 133}, - {0x8029, 133}, - {0xc038, 133}, - {0x8003, 134}, - {0x8006, 134}, - {0x800a, 134}, - {0x800f, 134}, - {0x8018, 134}, - {0x801f, 134}, - {0x8029, 134}, - {0xc038, 134}, - }, - /* 125 */ - { - {0x8003, 136}, - {0x8006, 136}, - {0x800a, 136}, - {0x800f, 136}, - {0x8018, 136}, - {0x801f, 136}, - {0x8029, 136}, - {0xc038, 136}, - {0x8003, 146}, - {0x8006, 146}, - {0x800a, 146}, - {0x800f, 146}, - {0x8018, 146}, - {0x801f, 146}, - {0x8029, 146}, - {0xc038, 146}, - }, - /* 126 */ - { - {0x8001, 154}, - {0xc016, 154}, - {0x8001, 156}, - {0xc016, 156}, - {0x8001, 160}, - {0xc016, 160}, - {0x8001, 163}, - {0xc016, 163}, - {0x8001, 164}, - {0xc016, 164}, - {0x8001, 169}, - {0xc016, 169}, - {0x8001, 170}, - {0xc016, 170}, - {0x8001, 173}, - {0xc016, 173}, - }, - /* 127 */ - { - {0x8002, 154}, - {0x8009, 154}, - {0x8017, 154}, - {0xc028, 154}, - {0x8002, 156}, - {0x8009, 156}, - {0x8017, 156}, - {0xc028, 156}, - {0x8002, 160}, - {0x8009, 160}, - {0x8017, 160}, - {0xc028, 160}, - {0x8002, 163}, - {0x8009, 163}, - {0x8017, 163}, - {0xc028, 163}, - }, - /* 128 */ - { - {0x8003, 154}, - {0x8006, 154}, - {0x800a, 154}, - {0x800f, 154}, - {0x8018, 154}, - {0x801f, 154}, - {0x8029, 154}, - {0xc038, 154}, - {0x8003, 156}, - {0x8006, 156}, - {0x800a, 156}, - {0x800f, 156}, - {0x8018, 156}, - {0x801f, 156}, - {0x8029, 156}, - {0xc038, 156}, - }, - /* 129 */ - { - {0x8003, 160}, - {0x8006, 160}, - {0x800a, 160}, - {0x800f, 160}, - {0x8018, 160}, - {0x801f, 160}, - {0x8029, 160}, - {0xc038, 160}, - {0x8003, 163}, - {0x8006, 163}, - {0x800a, 163}, - {0x800f, 163}, - {0x8018, 163}, - {0x801f, 163}, - {0x8029, 163}, - {0xc038, 163}, - }, - /* 130 */ - { - {0x8002, 164}, - {0x8009, 164}, - {0x8017, 164}, - {0xc028, 164}, - {0x8002, 169}, - {0x8009, 169}, - {0x8017, 169}, - {0xc028, 169}, - {0x8002, 170}, - {0x8009, 170}, - {0x8017, 170}, - {0xc028, 170}, - {0x8002, 173}, - {0x8009, 173}, - {0x8017, 173}, - {0xc028, 173}, - }, - /* 131 */ - { - {0x8003, 164}, - {0x8006, 164}, - {0x800a, 164}, - {0x800f, 164}, - {0x8018, 164}, - {0x801f, 164}, - {0x8029, 164}, - {0xc038, 164}, - {0x8003, 169}, - {0x8006, 169}, - {0x800a, 169}, - {0x800f, 169}, - {0x8018, 169}, - {0x801f, 169}, - {0x8029, 169}, - {0xc038, 169}, - }, - /* 132 */ - { - {0x8003, 170}, - {0x8006, 170}, - {0x800a, 170}, - {0x800f, 170}, - {0x8018, 170}, - {0x801f, 170}, - {0x8029, 170}, - {0xc038, 170}, - {0x8003, 173}, - {0x8006, 173}, - {0x800a, 173}, - {0x800f, 173}, - {0x8018, 173}, - {0x801f, 173}, - {0x8029, 173}, - {0xc038, 173}, - }, - /* 133 */ - { - {0x89, 0}, - {0x8a, 0}, - {0x8c, 0}, - {0x8d, 0}, - {0x90, 0}, - {0x91, 0}, - {0x93, 0}, - {0x96, 0}, - {0x9c, 0}, - {0x9f, 0}, - {0xa3, 0}, - {0xa6, 0}, - {0xab, 0}, - {0xae, 0}, - {0xb5, 0}, - {0xbe, 0}, - }, - /* 134 */ - { - {0xc000, 178}, - {0xc000, 181}, - {0xc000, 185}, - {0xc000, 186}, - {0xc000, 187}, - {0xc000, 189}, - {0xc000, 190}, - {0xc000, 196}, - {0xc000, 198}, - {0xc000, 228}, - {0xc000, 232}, - {0xc000, 233}, - {0x94, 0}, - {0x95, 0}, - {0x97, 0}, - {0x98, 0}, - }, - /* 135 */ - { - {0x8001, 178}, - {0xc016, 178}, - {0x8001, 181}, - {0xc016, 181}, - {0x8001, 185}, - {0xc016, 185}, - {0x8001, 186}, - {0xc016, 186}, - {0x8001, 187}, - {0xc016, 187}, - {0x8001, 189}, - {0xc016, 189}, - {0x8001, 190}, - {0xc016, 190}, - {0x8001, 196}, - {0xc016, 196}, - }, - /* 136 */ - { - {0x8002, 178}, - {0x8009, 178}, - {0x8017, 178}, - {0xc028, 178}, - {0x8002, 181}, - {0x8009, 181}, - {0x8017, 181}, - {0xc028, 181}, - {0x8002, 185}, - {0x8009, 185}, - {0x8017, 185}, - {0xc028, 185}, - {0x8002, 186}, - {0x8009, 186}, - {0x8017, 186}, - {0xc028, 186}, - }, - /* 137 */ - { - {0x8003, 178}, - {0x8006, 178}, - {0x800a, 178}, - {0x800f, 178}, - {0x8018, 178}, - {0x801f, 178}, - {0x8029, 178}, - {0xc038, 178}, - {0x8003, 181}, - {0x8006, 181}, - {0x800a, 181}, - {0x800f, 181}, - {0x8018, 181}, - {0x801f, 181}, - {0x8029, 181}, - {0xc038, 181}, - }, - /* 138 */ - { - {0x8003, 185}, - {0x8006, 185}, - {0x800a, 185}, - {0x800f, 185}, - {0x8018, 185}, - {0x801f, 185}, - {0x8029, 185}, - {0xc038, 185}, - {0x8003, 186}, - {0x8006, 186}, - {0x800a, 186}, - {0x800f, 186}, - {0x8018, 186}, - {0x801f, 186}, - {0x8029, 186}, - {0xc038, 186}, - }, - /* 139 */ - { - {0x8002, 187}, - {0x8009, 187}, - {0x8017, 187}, - {0xc028, 187}, - {0x8002, 189}, - {0x8009, 189}, - {0x8017, 189}, - {0xc028, 189}, - {0x8002, 190}, - {0x8009, 190}, - {0x8017, 190}, - {0xc028, 190}, - {0x8002, 196}, - {0x8009, 196}, - {0x8017, 196}, - {0xc028, 196}, - }, - /* 140 */ - { - {0x8003, 187}, - {0x8006, 187}, - {0x800a, 187}, - {0x800f, 187}, - {0x8018, 187}, - {0x801f, 187}, - {0x8029, 187}, - {0xc038, 187}, - {0x8003, 189}, - {0x8006, 189}, - {0x800a, 189}, - {0x800f, 189}, - {0x8018, 189}, - {0x801f, 189}, - {0x8029, 189}, - {0xc038, 189}, - }, - /* 141 */ - { - {0x8003, 190}, - {0x8006, 190}, - {0x800a, 190}, - {0x800f, 190}, - {0x8018, 190}, - {0x801f, 190}, - {0x8029, 190}, - {0xc038, 190}, - {0x8003, 196}, - {0x8006, 196}, - {0x800a, 196}, - {0x800f, 196}, - {0x8018, 196}, - {0x801f, 196}, - {0x8029, 196}, - {0xc038, 196}, - }, - /* 142 */ - { - {0x8001, 198}, - {0xc016, 198}, - {0x8001, 228}, - {0xc016, 228}, - {0x8001, 232}, - {0xc016, 232}, - {0x8001, 233}, - {0xc016, 233}, - {0xc000, 1}, - {0xc000, 135}, - {0xc000, 137}, - {0xc000, 138}, - {0xc000, 139}, - {0xc000, 140}, - {0xc000, 141}, - {0xc000, 143}, - }, - /* 143 */ - { - {0x8002, 198}, - {0x8009, 198}, - {0x8017, 198}, - {0xc028, 198}, - {0x8002, 228}, - {0x8009, 228}, - {0x8017, 228}, - {0xc028, 228}, - {0x8002, 232}, - {0x8009, 232}, - {0x8017, 232}, - {0xc028, 232}, - {0x8002, 233}, - {0x8009, 233}, - {0x8017, 233}, - {0xc028, 233}, - }, - /* 144 */ - { - {0x8003, 198}, - {0x8006, 198}, - {0x800a, 198}, - {0x800f, 198}, - {0x8018, 198}, - {0x801f, 198}, - {0x8029, 198}, - {0xc038, 198}, - {0x8003, 228}, - {0x8006, 228}, - {0x800a, 228}, - {0x800f, 228}, - {0x8018, 228}, - {0x801f, 228}, - {0x8029, 228}, - {0xc038, 228}, - }, - /* 145 */ - { - {0x8003, 232}, - {0x8006, 232}, - {0x800a, 232}, - {0x800f, 232}, - {0x8018, 232}, - {0x801f, 232}, - {0x8029, 232}, - {0xc038, 232}, - {0x8003, 233}, - {0x8006, 233}, - {0x800a, 233}, - {0x800f, 233}, - {0x8018, 233}, - {0x801f, 233}, - {0x8029, 233}, - {0xc038, 233}, - }, - /* 146 */ - { - {0x8001, 1}, - {0xc016, 1}, - {0x8001, 135}, - {0xc016, 135}, - {0x8001, 137}, - {0xc016, 137}, - {0x8001, 138}, - {0xc016, 138}, - {0x8001, 139}, - {0xc016, 139}, - {0x8001, 140}, - {0xc016, 140}, - {0x8001, 141}, - {0xc016, 141}, - {0x8001, 143}, - {0xc016, 143}, - }, - /* 147 */ - { - {0x8002, 1}, - {0x8009, 1}, - {0x8017, 1}, - {0xc028, 1}, - {0x8002, 135}, - {0x8009, 135}, - {0x8017, 135}, - {0xc028, 135}, - {0x8002, 137}, - {0x8009, 137}, - {0x8017, 137}, - {0xc028, 137}, - {0x8002, 138}, - {0x8009, 138}, - {0x8017, 138}, - {0xc028, 138}, - }, - /* 148 */ - { - {0x8003, 1}, - {0x8006, 1}, - {0x800a, 1}, - {0x800f, 1}, - {0x8018, 1}, - {0x801f, 1}, - {0x8029, 1}, - {0xc038, 1}, - {0x8003, 135}, - {0x8006, 135}, - {0x800a, 135}, - {0x800f, 135}, - {0x8018, 135}, - {0x801f, 135}, - {0x8029, 135}, - {0xc038, 135}, - }, - /* 149 */ - { - {0x8003, 137}, - {0x8006, 137}, - {0x800a, 137}, - {0x800f, 137}, - {0x8018, 137}, - {0x801f, 137}, - {0x8029, 137}, - {0xc038, 137}, - {0x8003, 138}, - {0x8006, 138}, - {0x800a, 138}, - {0x800f, 138}, - {0x8018, 138}, - {0x801f, 138}, - {0x8029, 138}, - {0xc038, 138}, - }, - /* 150 */ - { - {0x8002, 139}, - {0x8009, 139}, - {0x8017, 139}, - {0xc028, 139}, - {0x8002, 140}, - {0x8009, 140}, - {0x8017, 140}, - {0xc028, 140}, - {0x8002, 141}, - {0x8009, 141}, - {0x8017, 141}, - {0xc028, 141}, - {0x8002, 143}, - {0x8009, 143}, - {0x8017, 143}, - {0xc028, 143}, - }, - /* 151 */ - { - {0x8003, 139}, - {0x8006, 139}, - {0x800a, 139}, - {0x800f, 139}, - {0x8018, 139}, - {0x801f, 139}, - {0x8029, 139}, - {0xc038, 139}, - {0x8003, 140}, - {0x8006, 140}, - {0x800a, 140}, - {0x800f, 140}, - {0x8018, 140}, - {0x801f, 140}, - {0x8029, 140}, - {0xc038, 140}, - }, - /* 152 */ - { - {0x8003, 141}, - {0x8006, 141}, - {0x800a, 141}, - {0x800f, 141}, - {0x8018, 141}, - {0x801f, 141}, - {0x8029, 141}, - {0xc038, 141}, - {0x8003, 143}, - {0x8006, 143}, - {0x800a, 143}, - {0x800f, 143}, - {0x8018, 143}, - {0x801f, 143}, - {0x8029, 143}, - {0xc038, 143}, - }, - /* 153 */ - { - {0x9d, 0}, - {0x9e, 0}, - {0xa0, 0}, - {0xa1, 0}, - {0xa4, 0}, - {0xa5, 0}, - {0xa7, 0}, - {0xa8, 0}, - {0xac, 0}, - {0xad, 0}, - {0xaf, 0}, - {0xb1, 0}, - {0xb6, 0}, - {0xb9, 0}, - {0xbf, 0}, - {0xcf, 0}, - }, - /* 154 */ - { - {0xc000, 147}, - {0xc000, 149}, - {0xc000, 150}, - {0xc000, 151}, - {0xc000, 152}, - {0xc000, 155}, - {0xc000, 157}, - {0xc000, 158}, - {0xc000, 165}, - {0xc000, 166}, - {0xc000, 168}, - {0xc000, 174}, - {0xc000, 175}, - {0xc000, 180}, - {0xc000, 182}, - {0xc000, 183}, - }, - /* 155 */ - { - {0x8001, 147}, - {0xc016, 147}, - {0x8001, 149}, - {0xc016, 149}, - {0x8001, 150}, - {0xc016, 150}, - {0x8001, 151}, - {0xc016, 151}, - {0x8001, 152}, - {0xc016, 152}, - {0x8001, 155}, - {0xc016, 155}, - {0x8001, 157}, - {0xc016, 157}, - {0x8001, 158}, - {0xc016, 158}, - }, - /* 156 */ - { - {0x8002, 147}, - {0x8009, 147}, - {0x8017, 147}, - {0xc028, 147}, - {0x8002, 149}, - {0x8009, 149}, - {0x8017, 149}, - {0xc028, 149}, - {0x8002, 150}, - {0x8009, 150}, - {0x8017, 150}, - {0xc028, 150}, - {0x8002, 151}, - {0x8009, 151}, - {0x8017, 151}, - {0xc028, 151}, - }, - /* 157 */ - { - {0x8003, 147}, - {0x8006, 147}, - {0x800a, 147}, - {0x800f, 147}, - {0x8018, 147}, - {0x801f, 147}, - {0x8029, 147}, - {0xc038, 147}, - {0x8003, 149}, - {0x8006, 149}, - {0x800a, 149}, - {0x800f, 149}, - {0x8018, 149}, - {0x801f, 149}, - {0x8029, 149}, - {0xc038, 149}, - }, - /* 158 */ - { - {0x8003, 150}, - {0x8006, 150}, - {0x800a, 150}, - {0x800f, 150}, - {0x8018, 150}, - {0x801f, 150}, - {0x8029, 150}, - {0xc038, 150}, - {0x8003, 151}, - {0x8006, 151}, - {0x800a, 151}, - {0x800f, 151}, - {0x8018, 151}, - {0x801f, 151}, - {0x8029, 151}, - {0xc038, 151}, - }, - /* 159 */ - { - {0x8002, 152}, - {0x8009, 152}, - {0x8017, 152}, - {0xc028, 152}, - {0x8002, 155}, - {0x8009, 155}, - {0x8017, 155}, - {0xc028, 155}, - {0x8002, 157}, - {0x8009, 157}, - {0x8017, 157}, - {0xc028, 157}, - {0x8002, 158}, - {0x8009, 158}, - {0x8017, 158}, - {0xc028, 158}, - }, - /* 160 */ - { - {0x8003, 152}, - {0x8006, 152}, - {0x800a, 152}, - {0x800f, 152}, - {0x8018, 152}, - {0x801f, 152}, - {0x8029, 152}, - {0xc038, 152}, - {0x8003, 155}, - {0x8006, 155}, - {0x800a, 155}, - {0x800f, 155}, - {0x8018, 155}, - {0x801f, 155}, - {0x8029, 155}, - {0xc038, 155}, - }, - /* 161 */ - { - {0x8003, 157}, - {0x8006, 157}, - {0x800a, 157}, - {0x800f, 157}, - {0x8018, 157}, - {0x801f, 157}, - {0x8029, 157}, - {0xc038, 157}, - {0x8003, 158}, - {0x8006, 158}, - {0x800a, 158}, - {0x800f, 158}, - {0x8018, 158}, - {0x801f, 158}, - {0x8029, 158}, - {0xc038, 158}, - }, - /* 162 */ - { - {0x8001, 165}, - {0xc016, 165}, - {0x8001, 166}, - {0xc016, 166}, - {0x8001, 168}, - {0xc016, 168}, - {0x8001, 174}, - {0xc016, 174}, - {0x8001, 175}, - {0xc016, 175}, - {0x8001, 180}, - {0xc016, 180}, - {0x8001, 182}, - {0xc016, 182}, - {0x8001, 183}, - {0xc016, 183}, - }, - /* 163 */ - { - {0x8002, 165}, - {0x8009, 165}, - {0x8017, 165}, - {0xc028, 165}, - {0x8002, 166}, - {0x8009, 166}, - {0x8017, 166}, - {0xc028, 166}, - {0x8002, 168}, - {0x8009, 168}, - {0x8017, 168}, - {0xc028, 168}, - {0x8002, 174}, - {0x8009, 174}, - {0x8017, 174}, - {0xc028, 174}, - }, - /* 164 */ - { - {0x8003, 165}, - {0x8006, 165}, - {0x800a, 165}, - {0x800f, 165}, - {0x8018, 165}, - {0x801f, 165}, - {0x8029, 165}, - {0xc038, 165}, - {0x8003, 166}, - {0x8006, 166}, - {0x800a, 166}, - {0x800f, 166}, - {0x8018, 166}, - {0x801f, 166}, - {0x8029, 166}, - {0xc038, 166}, - }, - /* 165 */ - { - {0x8003, 168}, - {0x8006, 168}, - {0x800a, 168}, - {0x800f, 168}, - {0x8018, 168}, - {0x801f, 168}, - {0x8029, 168}, - {0xc038, 168}, - {0x8003, 174}, - {0x8006, 174}, - {0x800a, 174}, - {0x800f, 174}, - {0x8018, 174}, - {0x801f, 174}, - {0x8029, 174}, - {0xc038, 174}, - }, - /* 166 */ - { - {0x8002, 175}, - {0x8009, 175}, - {0x8017, 175}, - {0xc028, 175}, - {0x8002, 180}, - {0x8009, 180}, - {0x8017, 180}, - {0xc028, 180}, - {0x8002, 182}, - {0x8009, 182}, - {0x8017, 182}, - {0xc028, 182}, - {0x8002, 183}, - {0x8009, 183}, - {0x8017, 183}, - {0xc028, 183}, - }, - /* 167 */ - { - {0x8003, 175}, - {0x8006, 175}, - {0x800a, 175}, - {0x800f, 175}, - {0x8018, 175}, - {0x801f, 175}, - {0x8029, 175}, - {0xc038, 175}, - {0x8003, 180}, - {0x8006, 180}, - {0x800a, 180}, - {0x800f, 180}, - {0x8018, 180}, - {0x801f, 180}, - {0x8029, 180}, - {0xc038, 180}, - }, - /* 168 */ - { - {0x8003, 182}, - {0x8006, 182}, - {0x800a, 182}, - {0x800f, 182}, - {0x8018, 182}, - {0x801f, 182}, - {0x8029, 182}, - {0xc038, 182}, - {0x8003, 183}, - {0x8006, 183}, - {0x800a, 183}, - {0x800f, 183}, - {0x8018, 183}, - {0x801f, 183}, - {0x8029, 183}, - {0xc038, 183}, - }, - /* 169 */ - { - {0xc000, 188}, - {0xc000, 191}, - {0xc000, 197}, - {0xc000, 231}, - {0xc000, 239}, - {0xb0, 0}, - {0xb2, 0}, - {0xb3, 0}, - {0xb7, 0}, - {0xb8, 0}, - {0xba, 0}, - {0xbb, 0}, - {0xc0, 0}, - {0xc7, 0}, - {0xd0, 0}, - {0xdf, 0}, - }, - /* 170 */ - { - {0x8001, 188}, - {0xc016, 188}, - {0x8001, 191}, - {0xc016, 191}, - {0x8001, 197}, - {0xc016, 197}, - {0x8001, 231}, - {0xc016, 231}, - {0x8001, 239}, - {0xc016, 239}, - {0xc000, 9}, - {0xc000, 142}, - {0xc000, 144}, - {0xc000, 145}, - {0xc000, 148}, - {0xc000, 159}, - }, - /* 171 */ - { - {0x8002, 188}, - {0x8009, 188}, - {0x8017, 188}, - {0xc028, 188}, - {0x8002, 191}, - {0x8009, 191}, - {0x8017, 191}, - {0xc028, 191}, - {0x8002, 197}, - {0x8009, 197}, - {0x8017, 197}, - {0xc028, 197}, - {0x8002, 231}, - {0x8009, 231}, - {0x8017, 231}, - {0xc028, 231}, - }, - /* 172 */ - { - {0x8003, 188}, - {0x8006, 188}, - {0x800a, 188}, - {0x800f, 188}, - {0x8018, 188}, - {0x801f, 188}, - {0x8029, 188}, - {0xc038, 188}, - {0x8003, 191}, - {0x8006, 191}, - {0x800a, 191}, - {0x800f, 191}, - {0x8018, 191}, - {0x801f, 191}, - {0x8029, 191}, - {0xc038, 191}, - }, - /* 173 */ - { - {0x8003, 197}, - {0x8006, 197}, - {0x800a, 197}, - {0x800f, 197}, - {0x8018, 197}, - {0x801f, 197}, - {0x8029, 197}, - {0xc038, 197}, - {0x8003, 231}, - {0x8006, 231}, - {0x800a, 231}, - {0x800f, 231}, - {0x8018, 231}, - {0x801f, 231}, - {0x8029, 231}, - {0xc038, 231}, - }, - /* 174 */ - { - {0x8002, 239}, - {0x8009, 239}, - {0x8017, 239}, - {0xc028, 239}, - {0x8001, 9}, - {0xc016, 9}, - {0x8001, 142}, - {0xc016, 142}, - {0x8001, 144}, - {0xc016, 144}, - {0x8001, 145}, - {0xc016, 145}, - {0x8001, 148}, - {0xc016, 148}, - {0x8001, 159}, - {0xc016, 159}, - }, - /* 175 */ - { - {0x8003, 239}, - {0x8006, 239}, - {0x800a, 239}, - {0x800f, 239}, - {0x8018, 239}, - {0x801f, 239}, - {0x8029, 239}, - {0xc038, 239}, - {0x8002, 9}, - {0x8009, 9}, - {0x8017, 9}, - {0xc028, 9}, - {0x8002, 142}, - {0x8009, 142}, - {0x8017, 142}, - {0xc028, 142}, - }, - /* 176 */ - { - {0x8003, 9}, - {0x8006, 9}, - {0x800a, 9}, - {0x800f, 9}, - {0x8018, 9}, - {0x801f, 9}, - {0x8029, 9}, - {0xc038, 9}, - {0x8003, 142}, - {0x8006, 142}, - {0x800a, 142}, - {0x800f, 142}, - {0x8018, 142}, - {0x801f, 142}, - {0x8029, 142}, - {0xc038, 142}, - }, - /* 177 */ - { - {0x8002, 144}, - {0x8009, 144}, - {0x8017, 144}, - {0xc028, 144}, - {0x8002, 145}, - {0x8009, 145}, - {0x8017, 145}, - {0xc028, 145}, - {0x8002, 148}, - {0x8009, 148}, - {0x8017, 148}, - {0xc028, 148}, - {0x8002, 159}, - {0x8009, 159}, - {0x8017, 159}, - {0xc028, 159}, - }, - /* 178 */ - { - {0x8003, 144}, - {0x8006, 144}, - {0x800a, 144}, - {0x800f, 144}, - {0x8018, 144}, - {0x801f, 144}, - {0x8029, 144}, - {0xc038, 144}, - {0x8003, 145}, - {0x8006, 145}, - {0x800a, 145}, - {0x800f, 145}, - {0x8018, 145}, - {0x801f, 145}, - {0x8029, 145}, - {0xc038, 145}, - }, - /* 179 */ - { - {0x8003, 148}, - {0x8006, 148}, - {0x800a, 148}, - {0x800f, 148}, - {0x8018, 148}, - {0x801f, 148}, - {0x8029, 148}, - {0xc038, 148}, - {0x8003, 159}, - {0x8006, 159}, - {0x800a, 159}, - {0x800f, 159}, - {0x8018, 159}, - {0x801f, 159}, - {0x8029, 159}, - {0xc038, 159}, - }, - /* 180 */ - { - {0xc000, 171}, - {0xc000, 206}, - {0xc000, 215}, - {0xc000, 225}, - {0xc000, 236}, - {0xc000, 237}, - {0xbc, 0}, - {0xbd, 0}, - {0xc1, 0}, - {0xc4, 0}, - {0xc8, 0}, - {0xcb, 0}, - {0xd1, 0}, - {0xd8, 0}, - {0xe0, 0}, - {0xee, 0}, - }, - /* 181 */ - { - {0x8001, 171}, - {0xc016, 171}, - {0x8001, 206}, - {0xc016, 206}, - {0x8001, 215}, - {0xc016, 215}, - {0x8001, 225}, - {0xc016, 225}, - {0x8001, 236}, - {0xc016, 236}, - {0x8001, 237}, - {0xc016, 237}, - {0xc000, 199}, - {0xc000, 207}, - {0xc000, 234}, - {0xc000, 235}, - }, - /* 182 */ - { - {0x8002, 171}, - {0x8009, 171}, - {0x8017, 171}, - {0xc028, 171}, - {0x8002, 206}, - {0x8009, 206}, - {0x8017, 206}, - {0xc028, 206}, - {0x8002, 215}, - {0x8009, 215}, - {0x8017, 215}, - {0xc028, 215}, - {0x8002, 225}, - {0x8009, 225}, - {0x8017, 225}, - {0xc028, 225}, - }, - /* 183 */ - { - {0x8003, 171}, - {0x8006, 171}, - {0x800a, 171}, - {0x800f, 171}, - {0x8018, 171}, - {0x801f, 171}, - {0x8029, 171}, - {0xc038, 171}, - {0x8003, 206}, - {0x8006, 206}, - {0x800a, 206}, - {0x800f, 206}, - {0x8018, 206}, - {0x801f, 206}, - {0x8029, 206}, - {0xc038, 206}, - }, - /* 184 */ - { - {0x8003, 215}, - {0x8006, 215}, - {0x800a, 215}, - {0x800f, 215}, - {0x8018, 215}, - {0x801f, 215}, - {0x8029, 215}, - {0xc038, 215}, - {0x8003, 225}, - {0x8006, 225}, - {0x800a, 225}, - {0x800f, 225}, - {0x8018, 225}, - {0x801f, 225}, - {0x8029, 225}, - {0xc038, 225}, - }, - /* 185 */ - { - {0x8002, 236}, - {0x8009, 236}, - {0x8017, 236}, - {0xc028, 236}, - {0x8002, 237}, - {0x8009, 237}, - {0x8017, 237}, - {0xc028, 237}, - {0x8001, 199}, - {0xc016, 199}, - {0x8001, 207}, - {0xc016, 207}, - {0x8001, 234}, - {0xc016, 234}, - {0x8001, 235}, - {0xc016, 235}, - }, - /* 186 */ - { - {0x8003, 236}, - {0x8006, 236}, - {0x800a, 236}, - {0x800f, 236}, - {0x8018, 236}, - {0x801f, 236}, - {0x8029, 236}, - {0xc038, 236}, - {0x8003, 237}, - {0x8006, 237}, - {0x800a, 237}, - {0x800f, 237}, - {0x8018, 237}, - {0x801f, 237}, - {0x8029, 237}, - {0xc038, 237}, - }, - /* 187 */ - { - {0x8002, 199}, - {0x8009, 199}, - {0x8017, 199}, - {0xc028, 199}, - {0x8002, 207}, - {0x8009, 207}, - {0x8017, 207}, - {0xc028, 207}, - {0x8002, 234}, - {0x8009, 234}, - {0x8017, 234}, - {0xc028, 234}, - {0x8002, 235}, - {0x8009, 235}, - {0x8017, 235}, - {0xc028, 235}, - }, - /* 188 */ - { - {0x8003, 199}, - {0x8006, 199}, - {0x800a, 199}, - {0x800f, 199}, - {0x8018, 199}, - {0x801f, 199}, - {0x8029, 199}, - {0xc038, 199}, - {0x8003, 207}, - {0x8006, 207}, - {0x800a, 207}, - {0x800f, 207}, - {0x8018, 207}, - {0x801f, 207}, - {0x8029, 207}, - {0xc038, 207}, - }, - /* 189 */ - { - {0x8003, 234}, - {0x8006, 234}, - {0x800a, 234}, - {0x800f, 234}, - {0x8018, 234}, - {0x801f, 234}, - {0x8029, 234}, - {0xc038, 234}, - {0x8003, 235}, - {0x8006, 235}, - {0x800a, 235}, - {0x800f, 235}, - {0x8018, 235}, - {0x801f, 235}, - {0x8029, 235}, - {0xc038, 235}, - }, - /* 190 */ - { - {0xc2, 0}, - {0xc3, 0}, - {0xc5, 0}, - {0xc6, 0}, - {0xc9, 0}, - {0xca, 0}, - {0xcc, 0}, - {0xcd, 0}, - {0xd2, 0}, - {0xd5, 0}, - {0xd9, 0}, - {0xdc, 0}, - {0xe1, 0}, - {0xe7, 0}, - {0xef, 0}, - {0xf6, 0}, - }, - /* 191 */ - { - {0xc000, 192}, - {0xc000, 193}, - {0xc000, 200}, - {0xc000, 201}, - {0xc000, 202}, - {0xc000, 205}, - {0xc000, 210}, - {0xc000, 213}, - {0xc000, 218}, - {0xc000, 219}, - {0xc000, 238}, - {0xc000, 240}, - {0xc000, 242}, - {0xc000, 243}, - {0xc000, 255}, - {0xce, 0}, - }, - /* 192 */ - { - {0x8001, 192}, - {0xc016, 192}, - {0x8001, 193}, - {0xc016, 193}, - {0x8001, 200}, - {0xc016, 200}, - {0x8001, 201}, - {0xc016, 201}, - {0x8001, 202}, - {0xc016, 202}, - {0x8001, 205}, - {0xc016, 205}, - {0x8001, 210}, - {0xc016, 210}, - {0x8001, 213}, - {0xc016, 213}, - }, - /* 193 */ - { - {0x8002, 192}, - {0x8009, 192}, - {0x8017, 192}, - {0xc028, 192}, - {0x8002, 193}, - {0x8009, 193}, - {0x8017, 193}, - {0xc028, 193}, - {0x8002, 200}, - {0x8009, 200}, - {0x8017, 200}, - {0xc028, 200}, - {0x8002, 201}, - {0x8009, 201}, - {0x8017, 201}, - {0xc028, 201}, - }, - /* 194 */ - { - {0x8003, 192}, - {0x8006, 192}, - {0x800a, 192}, - {0x800f, 192}, - {0x8018, 192}, - {0x801f, 192}, - {0x8029, 192}, - {0xc038, 192}, - {0x8003, 193}, - {0x8006, 193}, - {0x800a, 193}, - {0x800f, 193}, - {0x8018, 193}, - {0x801f, 193}, - {0x8029, 193}, - {0xc038, 193}, - }, - /* 195 */ - { - {0x8003, 200}, - {0x8006, 200}, - {0x800a, 200}, - {0x800f, 200}, - {0x8018, 200}, - {0x801f, 200}, - {0x8029, 200}, - {0xc038, 200}, - {0x8003, 201}, - {0x8006, 201}, - {0x800a, 201}, - {0x800f, 201}, - {0x8018, 201}, - {0x801f, 201}, - {0x8029, 201}, - {0xc038, 201}, - }, - /* 196 */ - { - {0x8002, 202}, - {0x8009, 202}, - {0x8017, 202}, - {0xc028, 202}, - {0x8002, 205}, - {0x8009, 205}, - {0x8017, 205}, - {0xc028, 205}, - {0x8002, 210}, - {0x8009, 210}, - {0x8017, 210}, - {0xc028, 210}, - {0x8002, 213}, - {0x8009, 213}, - {0x8017, 213}, - {0xc028, 213}, - }, - /* 197 */ - { - {0x8003, 202}, - {0x8006, 202}, - {0x800a, 202}, - {0x800f, 202}, - {0x8018, 202}, - {0x801f, 202}, - {0x8029, 202}, - {0xc038, 202}, - {0x8003, 205}, - {0x8006, 205}, - {0x800a, 205}, - {0x800f, 205}, - {0x8018, 205}, - {0x801f, 205}, - {0x8029, 205}, - {0xc038, 205}, - }, - /* 198 */ - { - {0x8003, 210}, - {0x8006, 210}, - {0x800a, 210}, - {0x800f, 210}, - {0x8018, 210}, - {0x801f, 210}, - {0x8029, 210}, - {0xc038, 210}, - {0x8003, 213}, - {0x8006, 213}, - {0x800a, 213}, - {0x800f, 213}, - {0x8018, 213}, - {0x801f, 213}, - {0x8029, 213}, - {0xc038, 213}, - }, - /* 199 */ - { - {0x8001, 218}, - {0xc016, 218}, - {0x8001, 219}, - {0xc016, 219}, - {0x8001, 238}, - {0xc016, 238}, - {0x8001, 240}, - {0xc016, 240}, - {0x8001, 242}, - {0xc016, 242}, - {0x8001, 243}, - {0xc016, 243}, - {0x8001, 255}, - {0xc016, 255}, - {0xc000, 203}, - {0xc000, 204}, - }, - /* 200 */ - { - {0x8002, 218}, - {0x8009, 218}, - {0x8017, 218}, - {0xc028, 218}, - {0x8002, 219}, - {0x8009, 219}, - {0x8017, 219}, - {0xc028, 219}, - {0x8002, 238}, - {0x8009, 238}, - {0x8017, 238}, - {0xc028, 238}, - {0x8002, 240}, - {0x8009, 240}, - {0x8017, 240}, - {0xc028, 240}, - }, - /* 201 */ - { - {0x8003, 218}, - {0x8006, 218}, - {0x800a, 218}, - {0x800f, 218}, - {0x8018, 218}, - {0x801f, 218}, - {0x8029, 218}, - {0xc038, 218}, - {0x8003, 219}, - {0x8006, 219}, - {0x800a, 219}, - {0x800f, 219}, - {0x8018, 219}, - {0x801f, 219}, - {0x8029, 219}, - {0xc038, 219}, - }, - /* 202 */ - { - {0x8003, 238}, - {0x8006, 238}, - {0x800a, 238}, - {0x800f, 238}, - {0x8018, 238}, - {0x801f, 238}, - {0x8029, 238}, - {0xc038, 238}, - {0x8003, 240}, - {0x8006, 240}, - {0x800a, 240}, - {0x800f, 240}, - {0x8018, 240}, - {0x801f, 240}, - {0x8029, 240}, - {0xc038, 240}, - }, - /* 203 */ - { - {0x8002, 242}, - {0x8009, 242}, - {0x8017, 242}, - {0xc028, 242}, - {0x8002, 243}, - {0x8009, 243}, - {0x8017, 243}, - {0xc028, 243}, - {0x8002, 255}, - {0x8009, 255}, - {0x8017, 255}, - {0xc028, 255}, - {0x8001, 203}, - {0xc016, 203}, - {0x8001, 204}, - {0xc016, 204}, - }, - /* 204 */ - { - {0x8003, 242}, - {0x8006, 242}, - {0x800a, 242}, - {0x800f, 242}, - {0x8018, 242}, - {0x801f, 242}, - {0x8029, 242}, - {0xc038, 242}, - {0x8003, 243}, - {0x8006, 243}, - {0x800a, 243}, - {0x800f, 243}, - {0x8018, 243}, - {0x801f, 243}, - {0x8029, 243}, - {0xc038, 243}, - }, - /* 205 */ - { - {0x8003, 255}, - {0x8006, 255}, - {0x800a, 255}, - {0x800f, 255}, - {0x8018, 255}, - {0x801f, 255}, - {0x8029, 255}, - {0xc038, 255}, - {0x8002, 203}, - {0x8009, 203}, - {0x8017, 203}, - {0xc028, 203}, - {0x8002, 204}, - {0x8009, 204}, - {0x8017, 204}, - {0xc028, 204}, - }, - /* 206 */ - { - {0x8003, 203}, - {0x8006, 203}, - {0x800a, 203}, - {0x800f, 203}, - {0x8018, 203}, - {0x801f, 203}, - {0x8029, 203}, - {0xc038, 203}, - {0x8003, 204}, - {0x8006, 204}, - {0x800a, 204}, - {0x800f, 204}, - {0x8018, 204}, - {0x801f, 204}, - {0x8029, 204}, - {0xc038, 204}, - }, - /* 207 */ - { - {0xd3, 0}, - {0xd4, 0}, - {0xd6, 0}, - {0xd7, 0}, - {0xda, 0}, - {0xdb, 0}, - {0xdd, 0}, - {0xde, 0}, - {0xe2, 0}, - {0xe4, 0}, - {0xe8, 0}, - {0xeb, 0}, - {0xf0, 0}, - {0xf3, 0}, - {0xf7, 0}, - {0xfa, 0}, - }, - /* 208 */ - { - {0xc000, 211}, - {0xc000, 212}, - {0xc000, 214}, - {0xc000, 221}, - {0xc000, 222}, - {0xc000, 223}, - {0xc000, 241}, - {0xc000, 244}, - {0xc000, 245}, - {0xc000, 246}, - {0xc000, 247}, - {0xc000, 248}, - {0xc000, 250}, - {0xc000, 251}, - {0xc000, 252}, - {0xc000, 253}, - }, - /* 209 */ - { - {0x8001, 211}, - {0xc016, 211}, - {0x8001, 212}, - {0xc016, 212}, - {0x8001, 214}, - {0xc016, 214}, - {0x8001, 221}, - {0xc016, 221}, - {0x8001, 222}, - {0xc016, 222}, - {0x8001, 223}, - {0xc016, 223}, - {0x8001, 241}, - {0xc016, 241}, - {0x8001, 244}, - {0xc016, 244}, - }, - /* 210 */ - { - {0x8002, 211}, - {0x8009, 211}, - {0x8017, 211}, - {0xc028, 211}, - {0x8002, 212}, - {0x8009, 212}, - {0x8017, 212}, - {0xc028, 212}, - {0x8002, 214}, - {0x8009, 214}, - {0x8017, 214}, - {0xc028, 214}, - {0x8002, 221}, - {0x8009, 221}, - {0x8017, 221}, - {0xc028, 221}, - }, - /* 211 */ - { - {0x8003, 211}, - {0x8006, 211}, - {0x800a, 211}, - {0x800f, 211}, - {0x8018, 211}, - {0x801f, 211}, - {0x8029, 211}, - {0xc038, 211}, - {0x8003, 212}, - {0x8006, 212}, - {0x800a, 212}, - {0x800f, 212}, - {0x8018, 212}, - {0x801f, 212}, - {0x8029, 212}, - {0xc038, 212}, - }, - /* 212 */ - { - {0x8003, 214}, - {0x8006, 214}, - {0x800a, 214}, - {0x800f, 214}, - {0x8018, 214}, - {0x801f, 214}, - {0x8029, 214}, - {0xc038, 214}, - {0x8003, 221}, - {0x8006, 221}, - {0x800a, 221}, - {0x800f, 221}, - {0x8018, 221}, - {0x801f, 221}, - {0x8029, 221}, - {0xc038, 221}, - }, - /* 213 */ - { - {0x8002, 222}, - {0x8009, 222}, - {0x8017, 222}, - {0xc028, 222}, - {0x8002, 223}, - {0x8009, 223}, - {0x8017, 223}, - {0xc028, 223}, - {0x8002, 241}, - {0x8009, 241}, - {0x8017, 241}, - {0xc028, 241}, - {0x8002, 244}, - {0x8009, 244}, - {0x8017, 244}, - {0xc028, 244}, - }, - /* 214 */ - { - {0x8003, 222}, - {0x8006, 222}, - {0x800a, 222}, - {0x800f, 222}, - {0x8018, 222}, - {0x801f, 222}, - {0x8029, 222}, - {0xc038, 222}, - {0x8003, 223}, - {0x8006, 223}, - {0x800a, 223}, - {0x800f, 223}, - {0x8018, 223}, - {0x801f, 223}, - {0x8029, 223}, - {0xc038, 223}, - }, - /* 215 */ - { - {0x8003, 241}, - {0x8006, 241}, - {0x800a, 241}, - {0x800f, 241}, - {0x8018, 241}, - {0x801f, 241}, - {0x8029, 241}, - {0xc038, 241}, - {0x8003, 244}, - {0x8006, 244}, - {0x800a, 244}, - {0x800f, 244}, - {0x8018, 244}, - {0x801f, 244}, - {0x8029, 244}, - {0xc038, 244}, - }, - /* 216 */ - { - {0x8001, 245}, - {0xc016, 245}, - {0x8001, 246}, - {0xc016, 246}, - {0x8001, 247}, - {0xc016, 247}, - {0x8001, 248}, - {0xc016, 248}, - {0x8001, 250}, - {0xc016, 250}, - {0x8001, 251}, - {0xc016, 251}, - {0x8001, 252}, - {0xc016, 252}, - {0x8001, 253}, - {0xc016, 253}, - }, - /* 217 */ - { - {0x8002, 245}, - {0x8009, 245}, - {0x8017, 245}, - {0xc028, 245}, - {0x8002, 246}, - {0x8009, 246}, - {0x8017, 246}, - {0xc028, 246}, - {0x8002, 247}, - {0x8009, 247}, - {0x8017, 247}, - {0xc028, 247}, - {0x8002, 248}, - {0x8009, 248}, - {0x8017, 248}, - {0xc028, 248}, - }, - /* 218 */ - { - {0x8003, 245}, - {0x8006, 245}, - {0x800a, 245}, - {0x800f, 245}, - {0x8018, 245}, - {0x801f, 245}, - {0x8029, 245}, - {0xc038, 245}, - {0x8003, 246}, - {0x8006, 246}, - {0x800a, 246}, - {0x800f, 246}, - {0x8018, 246}, - {0x801f, 246}, - {0x8029, 246}, - {0xc038, 246}, - }, - /* 219 */ - { - {0x8003, 247}, - {0x8006, 247}, - {0x800a, 247}, - {0x800f, 247}, - {0x8018, 247}, - {0x801f, 247}, - {0x8029, 247}, - {0xc038, 247}, - {0x8003, 248}, - {0x8006, 248}, - {0x800a, 248}, - {0x800f, 248}, - {0x8018, 248}, - {0x801f, 248}, - {0x8029, 248}, - {0xc038, 248}, - }, - /* 220 */ - { - {0x8002, 250}, - {0x8009, 250}, - {0x8017, 250}, - {0xc028, 250}, - {0x8002, 251}, - {0x8009, 251}, - {0x8017, 251}, - {0xc028, 251}, - {0x8002, 252}, - {0x8009, 252}, - {0x8017, 252}, - {0xc028, 252}, - {0x8002, 253}, - {0x8009, 253}, - {0x8017, 253}, - {0xc028, 253}, - }, - /* 221 */ - { - {0x8003, 250}, - {0x8006, 250}, - {0x800a, 250}, - {0x800f, 250}, - {0x8018, 250}, - {0x801f, 250}, - {0x8029, 250}, - {0xc038, 250}, - {0x8003, 251}, - {0x8006, 251}, - {0x800a, 251}, - {0x800f, 251}, - {0x8018, 251}, - {0x801f, 251}, - {0x8029, 251}, - {0xc038, 251}, - }, - /* 222 */ - { - {0x8003, 252}, - {0x8006, 252}, - {0x800a, 252}, - {0x800f, 252}, - {0x8018, 252}, - {0x801f, 252}, - {0x8029, 252}, - {0xc038, 252}, - {0x8003, 253}, - {0x8006, 253}, - {0x800a, 253}, - {0x800f, 253}, - {0x8018, 253}, - {0x801f, 253}, - {0x8029, 253}, - {0xc038, 253}, - }, - /* 223 */ - { - {0xc000, 254}, - {0xe3, 0}, - {0xe5, 0}, - {0xe6, 0}, - {0xe9, 0}, - {0xea, 0}, - {0xec, 0}, - {0xed, 0}, - {0xf1, 0}, - {0xf2, 0}, - {0xf4, 0}, - {0xf5, 0}, - {0xf8, 0}, - {0xf9, 0}, - {0xfb, 0}, - {0xfc, 0}, - }, - /* 224 */ - { - {0x8001, 254}, - {0xc016, 254}, - {0xc000, 2}, - {0xc000, 3}, - {0xc000, 4}, - {0xc000, 5}, - {0xc000, 6}, - {0xc000, 7}, - {0xc000, 8}, - {0xc000, 11}, - {0xc000, 12}, - {0xc000, 14}, - {0xc000, 15}, - {0xc000, 16}, - {0xc000, 17}, - {0xc000, 18}, - }, - /* 225 */ - { - {0x8002, 254}, - {0x8009, 254}, - {0x8017, 254}, - {0xc028, 254}, - {0x8001, 2}, - {0xc016, 2}, - {0x8001, 3}, - {0xc016, 3}, - {0x8001, 4}, - {0xc016, 4}, - {0x8001, 5}, - {0xc016, 5}, - {0x8001, 6}, - {0xc016, 6}, - {0x8001, 7}, - {0xc016, 7}, - }, - /* 226 */ - { - {0x8003, 254}, - {0x8006, 254}, - {0x800a, 254}, - {0x800f, 254}, - {0x8018, 254}, - {0x801f, 254}, - {0x8029, 254}, - {0xc038, 254}, - {0x8002, 2}, - {0x8009, 2}, - {0x8017, 2}, - {0xc028, 2}, - {0x8002, 3}, - {0x8009, 3}, - {0x8017, 3}, - {0xc028, 3}, - }, - /* 227 */ - { - {0x8003, 2}, - {0x8006, 2}, - {0x800a, 2}, - {0x800f, 2}, - {0x8018, 2}, - {0x801f, 2}, - {0x8029, 2}, - {0xc038, 2}, - {0x8003, 3}, - {0x8006, 3}, - {0x800a, 3}, - {0x800f, 3}, - {0x8018, 3}, - {0x801f, 3}, - {0x8029, 3}, - {0xc038, 3}, - }, - /* 228 */ - { - {0x8002, 4}, - {0x8009, 4}, - {0x8017, 4}, - {0xc028, 4}, - {0x8002, 5}, - {0x8009, 5}, - {0x8017, 5}, - {0xc028, 5}, - {0x8002, 6}, - {0x8009, 6}, - {0x8017, 6}, - {0xc028, 6}, - {0x8002, 7}, - {0x8009, 7}, - {0x8017, 7}, - {0xc028, 7}, - }, - /* 229 */ - { - {0x8003, 4}, - {0x8006, 4}, - {0x800a, 4}, - {0x800f, 4}, - {0x8018, 4}, - {0x801f, 4}, - {0x8029, 4}, - {0xc038, 4}, - {0x8003, 5}, - {0x8006, 5}, - {0x800a, 5}, - {0x800f, 5}, - {0x8018, 5}, - {0x801f, 5}, - {0x8029, 5}, - {0xc038, 5}, - }, - /* 230 */ - { - {0x8003, 6}, - {0x8006, 6}, - {0x800a, 6}, - {0x800f, 6}, - {0x8018, 6}, - {0x801f, 6}, - {0x8029, 6}, - {0xc038, 6}, - {0x8003, 7}, - {0x8006, 7}, - {0x800a, 7}, - {0x800f, 7}, - {0x8018, 7}, - {0x801f, 7}, - {0x8029, 7}, - {0xc038, 7}, - }, - /* 231 */ - { - {0x8001, 8}, - {0xc016, 8}, - {0x8001, 11}, - {0xc016, 11}, - {0x8001, 12}, - {0xc016, 12}, - {0x8001, 14}, - {0xc016, 14}, - {0x8001, 15}, - {0xc016, 15}, - {0x8001, 16}, - {0xc016, 16}, - {0x8001, 17}, - {0xc016, 17}, - {0x8001, 18}, - {0xc016, 18}, - }, - /* 232 */ - { - {0x8002, 8}, - {0x8009, 8}, - {0x8017, 8}, - {0xc028, 8}, - {0x8002, 11}, - {0x8009, 11}, - {0x8017, 11}, - {0xc028, 11}, - {0x8002, 12}, - {0x8009, 12}, - {0x8017, 12}, - {0xc028, 12}, - {0x8002, 14}, - {0x8009, 14}, - {0x8017, 14}, - {0xc028, 14}, - }, - /* 233 */ - { - {0x8003, 8}, - {0x8006, 8}, - {0x800a, 8}, - {0x800f, 8}, - {0x8018, 8}, - {0x801f, 8}, - {0x8029, 8}, - {0xc038, 8}, - {0x8003, 11}, - {0x8006, 11}, - {0x800a, 11}, - {0x800f, 11}, - {0x8018, 11}, - {0x801f, 11}, - {0x8029, 11}, - {0xc038, 11}, - }, - /* 234 */ - { - {0x8003, 12}, - {0x8006, 12}, - {0x800a, 12}, - {0x800f, 12}, - {0x8018, 12}, - {0x801f, 12}, - {0x8029, 12}, - {0xc038, 12}, - {0x8003, 14}, - {0x8006, 14}, - {0x800a, 14}, - {0x800f, 14}, - {0x8018, 14}, - {0x801f, 14}, - {0x8029, 14}, - {0xc038, 14}, - }, - /* 235 */ - { - {0x8002, 15}, - {0x8009, 15}, - {0x8017, 15}, - {0xc028, 15}, - {0x8002, 16}, - {0x8009, 16}, - {0x8017, 16}, - {0xc028, 16}, - {0x8002, 17}, - {0x8009, 17}, - {0x8017, 17}, - {0xc028, 17}, - {0x8002, 18}, - {0x8009, 18}, - {0x8017, 18}, - {0xc028, 18}, - }, - /* 236 */ - { - {0x8003, 15}, - {0x8006, 15}, - {0x800a, 15}, - {0x800f, 15}, - {0x8018, 15}, - {0x801f, 15}, - {0x8029, 15}, - {0xc038, 15}, - {0x8003, 16}, - {0x8006, 16}, - {0x800a, 16}, - {0x800f, 16}, - {0x8018, 16}, - {0x801f, 16}, - {0x8029, 16}, - {0xc038, 16}, - }, - /* 237 */ - { - {0x8003, 17}, - {0x8006, 17}, - {0x800a, 17}, - {0x800f, 17}, - {0x8018, 17}, - {0x801f, 17}, - {0x8029, 17}, - {0xc038, 17}, - {0x8003, 18}, - {0x8006, 18}, - {0x800a, 18}, - {0x800f, 18}, - {0x8018, 18}, - {0x801f, 18}, - {0x8029, 18}, - {0xc038, 18}, - }, - /* 238 */ - { - {0xc000, 19}, - {0xc000, 20}, - {0xc000, 21}, - {0xc000, 23}, - {0xc000, 24}, - {0xc000, 25}, - {0xc000, 26}, - {0xc000, 27}, - {0xc000, 28}, - {0xc000, 29}, - {0xc000, 30}, - {0xc000, 31}, - {0xc000, 127}, - {0xc000, 220}, - {0xc000, 249}, - {0xfd, 0}, - }, - /* 239 */ - { - {0x8001, 19}, - {0xc016, 19}, - {0x8001, 20}, - {0xc016, 20}, - {0x8001, 21}, - {0xc016, 21}, - {0x8001, 23}, - {0xc016, 23}, - {0x8001, 24}, - {0xc016, 24}, - {0x8001, 25}, - {0xc016, 25}, - {0x8001, 26}, - {0xc016, 26}, - {0x8001, 27}, - {0xc016, 27}, - }, - /* 240 */ - { - {0x8002, 19}, - {0x8009, 19}, - {0x8017, 19}, - {0xc028, 19}, - {0x8002, 20}, - {0x8009, 20}, - {0x8017, 20}, - {0xc028, 20}, - {0x8002, 21}, - {0x8009, 21}, - {0x8017, 21}, - {0xc028, 21}, - {0x8002, 23}, - {0x8009, 23}, - {0x8017, 23}, - {0xc028, 23}, - }, - /* 241 */ - { - {0x8003, 19}, - {0x8006, 19}, - {0x800a, 19}, - {0x800f, 19}, - {0x8018, 19}, - {0x801f, 19}, - {0x8029, 19}, - {0xc038, 19}, - {0x8003, 20}, - {0x8006, 20}, - {0x800a, 20}, - {0x800f, 20}, - {0x8018, 20}, - {0x801f, 20}, - {0x8029, 20}, - {0xc038, 20}, - }, - /* 242 */ - { - {0x8003, 21}, - {0x8006, 21}, - {0x800a, 21}, - {0x800f, 21}, - {0x8018, 21}, - {0x801f, 21}, - {0x8029, 21}, - {0xc038, 21}, - {0x8003, 23}, - {0x8006, 23}, - {0x800a, 23}, - {0x800f, 23}, - {0x8018, 23}, - {0x801f, 23}, - {0x8029, 23}, - {0xc038, 23}, - }, - /* 243 */ - { - {0x8002, 24}, - {0x8009, 24}, - {0x8017, 24}, - {0xc028, 24}, - {0x8002, 25}, - {0x8009, 25}, - {0x8017, 25}, - {0xc028, 25}, - {0x8002, 26}, - {0x8009, 26}, - {0x8017, 26}, - {0xc028, 26}, - {0x8002, 27}, - {0x8009, 27}, - {0x8017, 27}, - {0xc028, 27}, - }, - /* 244 */ - { - {0x8003, 24}, - {0x8006, 24}, - {0x800a, 24}, - {0x800f, 24}, - {0x8018, 24}, - {0x801f, 24}, - {0x8029, 24}, - {0xc038, 24}, - {0x8003, 25}, - {0x8006, 25}, - {0x800a, 25}, - {0x800f, 25}, - {0x8018, 25}, - {0x801f, 25}, - {0x8029, 25}, - {0xc038, 25}, - }, - /* 245 */ - { - {0x8003, 26}, - {0x8006, 26}, - {0x800a, 26}, - {0x800f, 26}, - {0x8018, 26}, - {0x801f, 26}, - {0x8029, 26}, - {0xc038, 26}, - {0x8003, 27}, - {0x8006, 27}, - {0x800a, 27}, - {0x800f, 27}, - {0x8018, 27}, - {0x801f, 27}, - {0x8029, 27}, - {0xc038, 27}, - }, - /* 246 */ - { - {0x8001, 28}, - {0xc016, 28}, - {0x8001, 29}, - {0xc016, 29}, - {0x8001, 30}, - {0xc016, 30}, - {0x8001, 31}, - {0xc016, 31}, - {0x8001, 127}, - {0xc016, 127}, - {0x8001, 220}, - {0xc016, 220}, - {0x8001, 249}, - {0xc016, 249}, - {0xfe, 0}, - {0xff, 0}, - }, - /* 247 */ - { - {0x8002, 28}, - {0x8009, 28}, - {0x8017, 28}, - {0xc028, 28}, - {0x8002, 29}, - {0x8009, 29}, - {0x8017, 29}, - {0xc028, 29}, - {0x8002, 30}, - {0x8009, 30}, - {0x8017, 30}, - {0xc028, 30}, - {0x8002, 31}, - {0x8009, 31}, - {0x8017, 31}, - {0xc028, 31}, - }, - /* 248 */ - { - {0x8003, 28}, - {0x8006, 28}, - {0x800a, 28}, - {0x800f, 28}, - {0x8018, 28}, - {0x801f, 28}, - {0x8029, 28}, - {0xc038, 28}, - {0x8003, 29}, - {0x8006, 29}, - {0x800a, 29}, - {0x800f, 29}, - {0x8018, 29}, - {0x801f, 29}, - {0x8029, 29}, - {0xc038, 29}, - }, - /* 249 */ - { - {0x8003, 30}, - {0x8006, 30}, - {0x800a, 30}, - {0x800f, 30}, - {0x8018, 30}, - {0x801f, 30}, - {0x8029, 30}, - {0xc038, 30}, - {0x8003, 31}, - {0x8006, 31}, - {0x800a, 31}, - {0x800f, 31}, - {0x8018, 31}, - {0x801f, 31}, - {0x8029, 31}, - {0xc038, 31}, - }, - /* 250 */ - { - {0x8002, 127}, - {0x8009, 127}, - {0x8017, 127}, - {0xc028, 127}, - {0x8002, 220}, - {0x8009, 220}, - {0x8017, 220}, - {0xc028, 220}, - {0x8002, 249}, - {0x8009, 249}, - {0x8017, 249}, - {0xc028, 249}, - {0xc000, 10}, - {0xc000, 13}, - {0xc000, 22}, - {0x100, 0}, - }, - /* 251 */ - { - {0x8003, 127}, - {0x8006, 127}, - {0x800a, 127}, - {0x800f, 127}, - {0x8018, 127}, - {0x801f, 127}, - {0x8029, 127}, - {0xc038, 127}, - {0x8003, 220}, - {0x8006, 220}, - {0x800a, 220}, - {0x800f, 220}, - {0x8018, 220}, - {0x801f, 220}, - {0x8029, 220}, - {0xc038, 220}, - }, - /* 252 */ - { - {0x8003, 249}, - {0x8006, 249}, - {0x800a, 249}, - {0x800f, 249}, - {0x8018, 249}, - {0x801f, 249}, - {0x8029, 249}, - {0xc038, 249}, - {0x8001, 10}, - {0xc016, 10}, - {0x8001, 13}, - {0xc016, 13}, - {0x8001, 22}, - {0xc016, 22}, - {0x100, 0}, - {0x100, 0}, - }, - /* 253 */ - { - {0x8002, 10}, - {0x8009, 10}, - {0x8017, 10}, - {0xc028, 10}, - {0x8002, 13}, - {0x8009, 13}, - {0x8017, 13}, - {0xc028, 13}, - {0x8002, 22}, - {0x8009, 22}, - {0x8017, 22}, - {0xc028, 22}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - }, - /* 254 */ - { - {0x8003, 10}, - {0x8006, 10}, - {0x800a, 10}, - {0x800f, 10}, - {0x8018, 10}, - {0x801f, 10}, - {0x8029, 10}, - {0xc038, 10}, - {0x8003, 13}, - {0x8006, 13}, - {0x800a, 13}, - {0x800f, 13}, - {0x8018, 13}, - {0x801f, 13}, - {0x8029, 13}, - {0xc038, 13}, - }, - /* 255 */ - { - {0x8003, 22}, - {0x8006, 22}, - {0x800a, 22}, - {0x800f, 22}, - {0x8018, 22}, - {0x801f, 22}, - {0x8029, 22}, - {0xc038, 22}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - }, - /* 256 */ - { - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - {0x100, 0}, - }, + /* 0 */ + { + {0x04, 0}, + {0x05, 0}, + {0x07, 0}, + {0x08, 0}, + {0x0b, 0}, + {0x0c, 0}, + {0x10, 0}, + {0x13, 0}, + {0x19, 0}, + {0x1c, 0}, + {0x20, 0}, + {0x23, 0}, + {0x2a, 0}, + {0x31, 0}, + {0x39, 0}, + {0x4040, 0}, + }, + /* 1 */ + { + {0xc000, 48}, + {0xc000, 49}, + {0xc000, 50}, + {0xc000, 97}, + {0xc000, 99}, + {0xc000, 101}, + {0xc000, 105}, + {0xc000, 111}, + {0xc000, 115}, + {0xc000, 116}, + {0x0d, 0}, + {0x0e, 0}, + {0x11, 0}, + {0x12, 0}, + {0x14, 0}, + {0x15, 0}, + }, + /* 2 */ + { + {0x8001, 48}, + {0xc016, 48}, + {0x8001, 49}, + {0xc016, 49}, + {0x8001, 50}, + {0xc016, 50}, + {0x8001, 97}, + {0xc016, 97}, + {0x8001, 99}, + {0xc016, 99}, + {0x8001, 101}, + {0xc016, 101}, + {0x8001, 105}, + {0xc016, 105}, + {0x8001, 111}, + {0xc016, 111}, + }, + /* 3 */ + { + {0x8002, 48}, + {0x8009, 48}, + {0x8017, 48}, + {0xc028, 48}, + {0x8002, 49}, + {0x8009, 49}, + {0x8017, 49}, + {0xc028, 49}, + {0x8002, 50}, + {0x8009, 50}, + {0x8017, 50}, + {0xc028, 50}, + {0x8002, 97}, + {0x8009, 97}, + {0x8017, 97}, + {0xc028, 97}, + }, + /* 4 */ + { + {0x8003, 48}, + {0x8006, 48}, + {0x800a, 48}, + {0x800f, 48}, + {0x8018, 48}, + {0x801f, 48}, + {0x8029, 48}, + {0xc038, 48}, + {0x8003, 49}, + {0x8006, 49}, + {0x800a, 49}, + {0x800f, 49}, + {0x8018, 49}, + {0x801f, 49}, + {0x8029, 49}, + {0xc038, 49}, + }, + /* 5 */ + { + {0x8003, 50}, + {0x8006, 50}, + {0x800a, 50}, + {0x800f, 50}, + {0x8018, 50}, + {0x801f, 50}, + {0x8029, 50}, + {0xc038, 50}, + {0x8003, 97}, + {0x8006, 97}, + {0x800a, 97}, + {0x800f, 97}, + {0x8018, 97}, + {0x801f, 97}, + {0x8029, 97}, + {0xc038, 97}, + }, + /* 6 */ + { + {0x8002, 99}, + {0x8009, 99}, + {0x8017, 99}, + {0xc028, 99}, + {0x8002, 101}, + {0x8009, 101}, + {0x8017, 101}, + {0xc028, 101}, + {0x8002, 105}, + {0x8009, 105}, + {0x8017, 105}, + {0xc028, 105}, + {0x8002, 111}, + {0x8009, 111}, + {0x8017, 111}, + {0xc028, 111}, + }, + /* 7 */ + { + {0x8003, 99}, + {0x8006, 99}, + {0x800a, 99}, + {0x800f, 99}, + {0x8018, 99}, + {0x801f, 99}, + {0x8029, 99}, + {0xc038, 99}, + {0x8003, 101}, + {0x8006, 101}, + {0x800a, 101}, + {0x800f, 101}, + {0x8018, 101}, + {0x801f, 101}, + {0x8029, 101}, + {0xc038, 101}, + }, + /* 8 */ + { + {0x8003, 105}, + {0x8006, 105}, + {0x800a, 105}, + {0x800f, 105}, + {0x8018, 105}, + {0x801f, 105}, + {0x8029, 105}, + {0xc038, 105}, + {0x8003, 111}, + {0x8006, 111}, + {0x800a, 111}, + {0x800f, 111}, + {0x8018, 111}, + {0x801f, 111}, + {0x8029, 111}, + {0xc038, 111}, + }, + /* 9 */ + { + {0x8001, 115}, + {0xc016, 115}, + {0x8001, 116}, + {0xc016, 116}, + {0xc000, 32}, + {0xc000, 37}, + {0xc000, 45}, + {0xc000, 46}, + {0xc000, 47}, + {0xc000, 51}, + {0xc000, 52}, + {0xc000, 53}, + {0xc000, 54}, + {0xc000, 55}, + {0xc000, 56}, + {0xc000, 57}, + }, + /* 10 */ + { + {0x8002, 115}, + {0x8009, 115}, + {0x8017, 115}, + {0xc028, 115}, + {0x8002, 116}, + {0x8009, 116}, + {0x8017, 116}, + {0xc028, 116}, + {0x8001, 32}, + {0xc016, 32}, + {0x8001, 37}, + {0xc016, 37}, + {0x8001, 45}, + {0xc016, 45}, + {0x8001, 46}, + {0xc016, 46}, + }, + /* 11 */ + { + {0x8003, 115}, + {0x8006, 115}, + {0x800a, 115}, + {0x800f, 115}, + {0x8018, 115}, + {0x801f, 115}, + {0x8029, 115}, + {0xc038, 115}, + {0x8003, 116}, + {0x8006, 116}, + {0x800a, 116}, + {0x800f, 116}, + {0x8018, 116}, + {0x801f, 116}, + {0x8029, 116}, + {0xc038, 116}, + }, + /* 12 */ + { + {0x8002, 32}, + {0x8009, 32}, + {0x8017, 32}, + {0xc028, 32}, + {0x8002, 37}, + {0x8009, 37}, + {0x8017, 37}, + {0xc028, 37}, + {0x8002, 45}, + {0x8009, 45}, + {0x8017, 45}, + {0xc028, 45}, + {0x8002, 46}, + {0x8009, 46}, + {0x8017, 46}, + {0xc028, 46}, + }, + /* 13 */ + { + {0x8003, 32}, + {0x8006, 32}, + {0x800a, 32}, + {0x800f, 32}, + {0x8018, 32}, + {0x801f, 32}, + {0x8029, 32}, + {0xc038, 32}, + {0x8003, 37}, + {0x8006, 37}, + {0x800a, 37}, + {0x800f, 37}, + {0x8018, 37}, + {0x801f, 37}, + {0x8029, 37}, + {0xc038, 37}, + }, + /* 14 */ + { + {0x8003, 45}, + {0x8006, 45}, + {0x800a, 45}, + {0x800f, 45}, + {0x8018, 45}, + {0x801f, 45}, + {0x8029, 45}, + {0xc038, 45}, + {0x8003, 46}, + {0x8006, 46}, + {0x800a, 46}, + {0x800f, 46}, + {0x8018, 46}, + {0x801f, 46}, + {0x8029, 46}, + {0xc038, 46}, + }, + /* 15 */ + { + {0x8001, 47}, + {0xc016, 47}, + {0x8001, 51}, + {0xc016, 51}, + {0x8001, 52}, + {0xc016, 52}, + {0x8001, 53}, + {0xc016, 53}, + {0x8001, 54}, + {0xc016, 54}, + {0x8001, 55}, + {0xc016, 55}, + {0x8001, 56}, + {0xc016, 56}, + {0x8001, 57}, + {0xc016, 57}, + }, + /* 16 */ + { + {0x8002, 47}, + {0x8009, 47}, + {0x8017, 47}, + {0xc028, 47}, + {0x8002, 51}, + {0x8009, 51}, + {0x8017, 51}, + {0xc028, 51}, + {0x8002, 52}, + {0x8009, 52}, + {0x8017, 52}, + {0xc028, 52}, + {0x8002, 53}, + {0x8009, 53}, + {0x8017, 53}, + {0xc028, 53}, + }, + /* 17 */ + { + {0x8003, 47}, + {0x8006, 47}, + {0x800a, 47}, + {0x800f, 47}, + {0x8018, 47}, + {0x801f, 47}, + {0x8029, 47}, + {0xc038, 47}, + {0x8003, 51}, + {0x8006, 51}, + {0x800a, 51}, + {0x800f, 51}, + {0x8018, 51}, + {0x801f, 51}, + {0x8029, 51}, + {0xc038, 51}, + }, + /* 18 */ + { + {0x8003, 52}, + {0x8006, 52}, + {0x800a, 52}, + {0x800f, 52}, + {0x8018, 52}, + {0x801f, 52}, + {0x8029, 52}, + {0xc038, 52}, + {0x8003, 53}, + {0x8006, 53}, + {0x800a, 53}, + {0x800f, 53}, + {0x8018, 53}, + {0x801f, 53}, + {0x8029, 53}, + {0xc038, 53}, + }, + /* 19 */ + { + {0x8002, 54}, + {0x8009, 54}, + {0x8017, 54}, + {0xc028, 54}, + {0x8002, 55}, + {0x8009, 55}, + {0x8017, 55}, + {0xc028, 55}, + {0x8002, 56}, + {0x8009, 56}, + {0x8017, 56}, + {0xc028, 56}, + {0x8002, 57}, + {0x8009, 57}, + {0x8017, 57}, + {0xc028, 57}, + }, + /* 20 */ + { + {0x8003, 54}, + {0x8006, 54}, + {0x800a, 54}, + {0x800f, 54}, + {0x8018, 54}, + {0x801f, 54}, + {0x8029, 54}, + {0xc038, 54}, + {0x8003, 55}, + {0x8006, 55}, + {0x800a, 55}, + {0x800f, 55}, + {0x8018, 55}, + {0x801f, 55}, + {0x8029, 55}, + {0xc038, 55}, + }, + /* 21 */ + { + {0x8003, 56}, + {0x8006, 56}, + {0x800a, 56}, + {0x800f, 56}, + {0x8018, 56}, + {0x801f, 56}, + {0x8029, 56}, + {0xc038, 56}, + {0x8003, 57}, + {0x8006, 57}, + {0x800a, 57}, + {0x800f, 57}, + {0x8018, 57}, + {0x801f, 57}, + {0x8029, 57}, + {0xc038, 57}, + }, + /* 22 */ + { + {0x1a, 0}, + {0x1b, 0}, + {0x1d, 0}, + {0x1e, 0}, + {0x21, 0}, + {0x22, 0}, + {0x24, 0}, + {0x25, 0}, + {0x2b, 0}, + {0x2e, 0}, + {0x32, 0}, + {0x35, 0}, + {0x3a, 0}, + {0x3d, 0}, + {0x41, 0}, + {0x4044, 0}, + }, + /* 23 */ + { + {0xc000, 61}, + {0xc000, 65}, + {0xc000, 95}, + {0xc000, 98}, + {0xc000, 100}, + {0xc000, 102}, + {0xc000, 103}, + {0xc000, 104}, + {0xc000, 108}, + {0xc000, 109}, + {0xc000, 110}, + {0xc000, 112}, + {0xc000, 114}, + {0xc000, 117}, + {0x26, 0}, + {0x27, 0}, + }, + /* 24 */ + { + {0x8001, 61}, + {0xc016, 61}, + {0x8001, 65}, + {0xc016, 65}, + {0x8001, 95}, + {0xc016, 95}, + {0x8001, 98}, + {0xc016, 98}, + {0x8001, 100}, + {0xc016, 100}, + {0x8001, 102}, + {0xc016, 102}, + {0x8001, 103}, + {0xc016, 103}, + {0x8001, 104}, + {0xc016, 104}, + }, + /* 25 */ + { + {0x8002, 61}, + {0x8009, 61}, + {0x8017, 61}, + {0xc028, 61}, + {0x8002, 65}, + {0x8009, 65}, + {0x8017, 65}, + {0xc028, 65}, + {0x8002, 95}, + {0x8009, 95}, + {0x8017, 95}, + {0xc028, 95}, + {0x8002, 98}, + {0x8009, 98}, + {0x8017, 98}, + {0xc028, 98}, + }, + /* 26 */ + { + {0x8003, 61}, + {0x8006, 61}, + {0x800a, 61}, + {0x800f, 61}, + {0x8018, 61}, + {0x801f, 61}, + {0x8029, 61}, + {0xc038, 61}, + {0x8003, 65}, + {0x8006, 65}, + {0x800a, 65}, + {0x800f, 65}, + {0x8018, 65}, + {0x801f, 65}, + {0x8029, 65}, + {0xc038, 65}, + }, + /* 27 */ + { + {0x8003, 95}, + {0x8006, 95}, + {0x800a, 95}, + {0x800f, 95}, + {0x8018, 95}, + {0x801f, 95}, + {0x8029, 95}, + {0xc038, 95}, + {0x8003, 98}, + {0x8006, 98}, + {0x800a, 98}, + {0x800f, 98}, + {0x8018, 98}, + {0x801f, 98}, + {0x8029, 98}, + {0xc038, 98}, + }, + /* 28 */ + { + {0x8002, 100}, + {0x8009, 100}, + {0x8017, 100}, + {0xc028, 100}, + {0x8002, 102}, + {0x8009, 102}, + {0x8017, 102}, + {0xc028, 102}, + {0x8002, 103}, + {0x8009, 103}, + {0x8017, 103}, + {0xc028, 103}, + {0x8002, 104}, + {0x8009, 104}, + {0x8017, 104}, + {0xc028, 104}, + }, + /* 29 */ + { + {0x8003, 100}, + {0x8006, 100}, + {0x800a, 100}, + {0x800f, 100}, + {0x8018, 100}, + {0x801f, 100}, + {0x8029, 100}, + {0xc038, 100}, + {0x8003, 102}, + {0x8006, 102}, + {0x800a, 102}, + {0x800f, 102}, + {0x8018, 102}, + {0x801f, 102}, + {0x8029, 102}, + {0xc038, 102}, + }, + /* 30 */ + { + {0x8003, 103}, + {0x8006, 103}, + {0x800a, 103}, + {0x800f, 103}, + {0x8018, 103}, + {0x801f, 103}, + {0x8029, 103}, + {0xc038, 103}, + {0x8003, 104}, + {0x8006, 104}, + {0x800a, 104}, + {0x800f, 104}, + {0x8018, 104}, + {0x801f, 104}, + {0x8029, 104}, + {0xc038, 104}, + }, + /* 31 */ + { + {0x8001, 108}, + {0xc016, 108}, + {0x8001, 109}, + {0xc016, 109}, + {0x8001, 110}, + {0xc016, 110}, + {0x8001, 112}, + {0xc016, 112}, + {0x8001, 114}, + {0xc016, 114}, + {0x8001, 117}, + {0xc016, 117}, + {0xc000, 58}, + {0xc000, 66}, + {0xc000, 67}, + {0xc000, 68}, + }, + /* 32 */ + { + {0x8002, 108}, + {0x8009, 108}, + {0x8017, 108}, + {0xc028, 108}, + {0x8002, 109}, + {0x8009, 109}, + {0x8017, 109}, + {0xc028, 109}, + {0x8002, 110}, + {0x8009, 110}, + {0x8017, 110}, + {0xc028, 110}, + {0x8002, 112}, + {0x8009, 112}, + {0x8017, 112}, + {0xc028, 112}, + }, + /* 33 */ + { + {0x8003, 108}, + {0x8006, 108}, + {0x800a, 108}, + {0x800f, 108}, + {0x8018, 108}, + {0x801f, 108}, + {0x8029, 108}, + {0xc038, 108}, + {0x8003, 109}, + {0x8006, 109}, + {0x800a, 109}, + {0x800f, 109}, + {0x8018, 109}, + {0x801f, 109}, + {0x8029, 109}, + {0xc038, 109}, + }, + /* 34 */ + { + {0x8003, 110}, + {0x8006, 110}, + {0x800a, 110}, + {0x800f, 110}, + {0x8018, 110}, + {0x801f, 110}, + {0x8029, 110}, + {0xc038, 110}, + {0x8003, 112}, + {0x8006, 112}, + {0x800a, 112}, + {0x800f, 112}, + {0x8018, 112}, + {0x801f, 112}, + {0x8029, 112}, + {0xc038, 112}, + }, + /* 35 */ + { + {0x8002, 114}, + {0x8009, 114}, + {0x8017, 114}, + {0xc028, 114}, + {0x8002, 117}, + {0x8009, 117}, + {0x8017, 117}, + {0xc028, 117}, + {0x8001, 58}, + {0xc016, 58}, + {0x8001, 66}, + {0xc016, 66}, + {0x8001, 67}, + {0xc016, 67}, + {0x8001, 68}, + {0xc016, 68}, + }, + /* 36 */ + { + {0x8003, 114}, + {0x8006, 114}, + {0x800a, 114}, + {0x800f, 114}, + {0x8018, 114}, + {0x801f, 114}, + {0x8029, 114}, + {0xc038, 114}, + {0x8003, 117}, + {0x8006, 117}, + {0x800a, 117}, + {0x800f, 117}, + {0x8018, 117}, + {0x801f, 117}, + {0x8029, 117}, + {0xc038, 117}, + }, + /* 37 */ + { + {0x8002, 58}, + {0x8009, 58}, + {0x8017, 58}, + {0xc028, 58}, + {0x8002, 66}, + {0x8009, 66}, + {0x8017, 66}, + {0xc028, 66}, + {0x8002, 67}, + {0x8009, 67}, + {0x8017, 67}, + {0xc028, 67}, + {0x8002, 68}, + {0x8009, 68}, + {0x8017, 68}, + {0xc028, 68}, + }, + /* 38 */ + { + {0x8003, 58}, + {0x8006, 58}, + {0x800a, 58}, + {0x800f, 58}, + {0x8018, 58}, + {0x801f, 58}, + {0x8029, 58}, + {0xc038, 58}, + {0x8003, 66}, + {0x8006, 66}, + {0x800a, 66}, + {0x800f, 66}, + {0x8018, 66}, + {0x801f, 66}, + {0x8029, 66}, + {0xc038, 66}, + }, + /* 39 */ + { + {0x8003, 67}, + {0x8006, 67}, + {0x800a, 67}, + {0x800f, 67}, + {0x8018, 67}, + {0x801f, 67}, + {0x8029, 67}, + {0xc038, 67}, + {0x8003, 68}, + {0x8006, 68}, + {0x800a, 68}, + {0x800f, 68}, + {0x8018, 68}, + {0x801f, 68}, + {0x8029, 68}, + {0xc038, 68}, + }, + /* 40 */ + { + {0x2c, 0}, + {0x2d, 0}, + {0x2f, 0}, + {0x30, 0}, + {0x33, 0}, + {0x34, 0}, + {0x36, 0}, + {0x37, 0}, + {0x3b, 0}, + {0x3c, 0}, + {0x3e, 0}, + {0x3f, 0}, + {0x42, 0}, + {0x43, 0}, + {0x45, 0}, + {0x4048, 0}, + }, + /* 41 */ + { + {0xc000, 69}, + {0xc000, 70}, + {0xc000, 71}, + {0xc000, 72}, + {0xc000, 73}, + {0xc000, 74}, + {0xc000, 75}, + {0xc000, 76}, + {0xc000, 77}, + {0xc000, 78}, + {0xc000, 79}, + {0xc000, 80}, + {0xc000, 81}, + {0xc000, 82}, + {0xc000, 83}, + {0xc000, 84}, + }, + /* 42 */ + { + {0x8001, 69}, + {0xc016, 69}, + {0x8001, 70}, + {0xc016, 70}, + {0x8001, 71}, + {0xc016, 71}, + {0x8001, 72}, + {0xc016, 72}, + {0x8001, 73}, + {0xc016, 73}, + {0x8001, 74}, + {0xc016, 74}, + {0x8001, 75}, + {0xc016, 75}, + {0x8001, 76}, + {0xc016, 76}, + }, + /* 43 */ + { + {0x8002, 69}, + {0x8009, 69}, + {0x8017, 69}, + {0xc028, 69}, + {0x8002, 70}, + {0x8009, 70}, + {0x8017, 70}, + {0xc028, 70}, + {0x8002, 71}, + {0x8009, 71}, + {0x8017, 71}, + {0xc028, 71}, + {0x8002, 72}, + {0x8009, 72}, + {0x8017, 72}, + {0xc028, 72}, + }, + /* 44 */ + { + {0x8003, 69}, + {0x8006, 69}, + {0x800a, 69}, + {0x800f, 69}, + {0x8018, 69}, + {0x801f, 69}, + {0x8029, 69}, + {0xc038, 69}, + {0x8003, 70}, + {0x8006, 70}, + {0x800a, 70}, + {0x800f, 70}, + {0x8018, 70}, + {0x801f, 70}, + {0x8029, 70}, + {0xc038, 70}, + }, + /* 45 */ + { + {0x8003, 71}, + {0x8006, 71}, + {0x800a, 71}, + {0x800f, 71}, + {0x8018, 71}, + {0x801f, 71}, + {0x8029, 71}, + {0xc038, 71}, + {0x8003, 72}, + {0x8006, 72}, + {0x800a, 72}, + {0x800f, 72}, + {0x8018, 72}, + {0x801f, 72}, + {0x8029, 72}, + {0xc038, 72}, + }, + /* 46 */ + { + {0x8002, 73}, + {0x8009, 73}, + {0x8017, 73}, + {0xc028, 73}, + {0x8002, 74}, + {0x8009, 74}, + {0x8017, 74}, + {0xc028, 74}, + {0x8002, 75}, + {0x8009, 75}, + {0x8017, 75}, + {0xc028, 75}, + {0x8002, 76}, + {0x8009, 76}, + {0x8017, 76}, + {0xc028, 76}, + }, + /* 47 */ + { + {0x8003, 73}, + {0x8006, 73}, + {0x800a, 73}, + {0x800f, 73}, + {0x8018, 73}, + {0x801f, 73}, + {0x8029, 73}, + {0xc038, 73}, + {0x8003, 74}, + {0x8006, 74}, + {0x800a, 74}, + {0x800f, 74}, + {0x8018, 74}, + {0x801f, 74}, + {0x8029, 74}, + {0xc038, 74}, + }, + /* 48 */ + { + {0x8003, 75}, + {0x8006, 75}, + {0x800a, 75}, + {0x800f, 75}, + {0x8018, 75}, + {0x801f, 75}, + {0x8029, 75}, + {0xc038, 75}, + {0x8003, 76}, + {0x8006, 76}, + {0x800a, 76}, + {0x800f, 76}, + {0x8018, 76}, + {0x801f, 76}, + {0x8029, 76}, + {0xc038, 76}, + }, + /* 49 */ + { + {0x8001, 77}, + {0xc016, 77}, + {0x8001, 78}, + {0xc016, 78}, + {0x8001, 79}, + {0xc016, 79}, + {0x8001, 80}, + {0xc016, 80}, + {0x8001, 81}, + {0xc016, 81}, + {0x8001, 82}, + {0xc016, 82}, + {0x8001, 83}, + {0xc016, 83}, + {0x8001, 84}, + {0xc016, 84}, + }, + /* 50 */ + { + {0x8002, 77}, + {0x8009, 77}, + {0x8017, 77}, + {0xc028, 77}, + {0x8002, 78}, + {0x8009, 78}, + {0x8017, 78}, + {0xc028, 78}, + {0x8002, 79}, + {0x8009, 79}, + {0x8017, 79}, + {0xc028, 79}, + {0x8002, 80}, + {0x8009, 80}, + {0x8017, 80}, + {0xc028, 80}, + }, + /* 51 */ + { + {0x8003, 77}, + {0x8006, 77}, + {0x800a, 77}, + {0x800f, 77}, + {0x8018, 77}, + {0x801f, 77}, + {0x8029, 77}, + {0xc038, 77}, + {0x8003, 78}, + {0x8006, 78}, + {0x800a, 78}, + {0x800f, 78}, + {0x8018, 78}, + {0x801f, 78}, + {0x8029, 78}, + {0xc038, 78}, + }, + /* 52 */ + { + {0x8003, 79}, + {0x8006, 79}, + {0x800a, 79}, + {0x800f, 79}, + {0x8018, 79}, + {0x801f, 79}, + {0x8029, 79}, + {0xc038, 79}, + {0x8003, 80}, + {0x8006, 80}, + {0x800a, 80}, + {0x800f, 80}, + {0x8018, 80}, + {0x801f, 80}, + {0x8029, 80}, + {0xc038, 80}, + }, + /* 53 */ + { + {0x8002, 81}, + {0x8009, 81}, + {0x8017, 81}, + {0xc028, 81}, + {0x8002, 82}, + {0x8009, 82}, + {0x8017, 82}, + {0xc028, 82}, + {0x8002, 83}, + {0x8009, 83}, + {0x8017, 83}, + {0xc028, 83}, + {0x8002, 84}, + {0x8009, 84}, + {0x8017, 84}, + {0xc028, 84}, + }, + /* 54 */ + { + {0x8003, 81}, + {0x8006, 81}, + {0x800a, 81}, + {0x800f, 81}, + {0x8018, 81}, + {0x801f, 81}, + {0x8029, 81}, + {0xc038, 81}, + {0x8003, 82}, + {0x8006, 82}, + {0x800a, 82}, + {0x800f, 82}, + {0x8018, 82}, + {0x801f, 82}, + {0x8029, 82}, + {0xc038, 82}, + }, + /* 55 */ + { + {0x8003, 83}, + {0x8006, 83}, + {0x800a, 83}, + {0x800f, 83}, + {0x8018, 83}, + {0x801f, 83}, + {0x8029, 83}, + {0xc038, 83}, + {0x8003, 84}, + {0x8006, 84}, + {0x800a, 84}, + {0x800f, 84}, + {0x8018, 84}, + {0x801f, 84}, + {0x8029, 84}, + {0xc038, 84}, + }, + /* 56 */ + { + {0xc000, 85}, + {0xc000, 86}, + {0xc000, 87}, + {0xc000, 89}, + {0xc000, 106}, + {0xc000, 107}, + {0xc000, 113}, + {0xc000, 118}, + {0xc000, 119}, + {0xc000, 120}, + {0xc000, 121}, + {0xc000, 122}, + {0x46, 0}, + {0x47, 0}, + {0x49, 0}, + {0x404a, 0}, + }, + /* 57 */ + { + {0x8001, 85}, + {0xc016, 85}, + {0x8001, 86}, + {0xc016, 86}, + {0x8001, 87}, + {0xc016, 87}, + {0x8001, 89}, + {0xc016, 89}, + {0x8001, 106}, + {0xc016, 106}, + {0x8001, 107}, + {0xc016, 107}, + {0x8001, 113}, + {0xc016, 113}, + {0x8001, 118}, + {0xc016, 118}, + }, + /* 58 */ + { + {0x8002, 85}, + {0x8009, 85}, + {0x8017, 85}, + {0xc028, 85}, + {0x8002, 86}, + {0x8009, 86}, + {0x8017, 86}, + {0xc028, 86}, + {0x8002, 87}, + {0x8009, 87}, + {0x8017, 87}, + {0xc028, 87}, + {0x8002, 89}, + {0x8009, 89}, + {0x8017, 89}, + {0xc028, 89}, + }, + /* 59 */ + { + {0x8003, 85}, + {0x8006, 85}, + {0x800a, 85}, + {0x800f, 85}, + {0x8018, 85}, + {0x801f, 85}, + {0x8029, 85}, + {0xc038, 85}, + {0x8003, 86}, + {0x8006, 86}, + {0x800a, 86}, + {0x800f, 86}, + {0x8018, 86}, + {0x801f, 86}, + {0x8029, 86}, + {0xc038, 86}, + }, + /* 60 */ + { + {0x8003, 87}, + {0x8006, 87}, + {0x800a, 87}, + {0x800f, 87}, + {0x8018, 87}, + {0x801f, 87}, + {0x8029, 87}, + {0xc038, 87}, + {0x8003, 89}, + {0x8006, 89}, + {0x800a, 89}, + {0x800f, 89}, + {0x8018, 89}, + {0x801f, 89}, + {0x8029, 89}, + {0xc038, 89}, + }, + /* 61 */ + { + {0x8002, 106}, + {0x8009, 106}, + {0x8017, 106}, + {0xc028, 106}, + {0x8002, 107}, + {0x8009, 107}, + {0x8017, 107}, + {0xc028, 107}, + {0x8002, 113}, + {0x8009, 113}, + {0x8017, 113}, + {0xc028, 113}, + {0x8002, 118}, + {0x8009, 118}, + {0x8017, 118}, + {0xc028, 118}, + }, + /* 62 */ + { + {0x8003, 106}, + {0x8006, 106}, + {0x800a, 106}, + {0x800f, 106}, + {0x8018, 106}, + {0x801f, 106}, + {0x8029, 106}, + {0xc038, 106}, + {0x8003, 107}, + {0x8006, 107}, + {0x800a, 107}, + {0x800f, 107}, + {0x8018, 107}, + {0x801f, 107}, + {0x8029, 107}, + {0xc038, 107}, + }, + /* 63 */ + { + {0x8003, 113}, + {0x8006, 113}, + {0x800a, 113}, + {0x800f, 113}, + {0x8018, 113}, + {0x801f, 113}, + {0x8029, 113}, + {0xc038, 113}, + {0x8003, 118}, + {0x8006, 118}, + {0x800a, 118}, + {0x800f, 118}, + {0x8018, 118}, + {0x801f, 118}, + {0x8029, 118}, + {0xc038, 118}, + }, + /* 64 */ + { + {0x8001, 119}, + {0xc016, 119}, + {0x8001, 120}, + {0xc016, 120}, + {0x8001, 121}, + {0xc016, 121}, + {0x8001, 122}, + {0xc016, 122}, + {0xc000, 38}, + {0xc000, 42}, + {0xc000, 44}, + {0xc000, 59}, + {0xc000, 88}, + {0xc000, 90}, + {0x4b, 0}, + {0x4e, 0}, + }, + /* 65 */ + { + {0x8002, 119}, + {0x8009, 119}, + {0x8017, 119}, + {0xc028, 119}, + {0x8002, 120}, + {0x8009, 120}, + {0x8017, 120}, + {0xc028, 120}, + {0x8002, 121}, + {0x8009, 121}, + {0x8017, 121}, + {0xc028, 121}, + {0x8002, 122}, + {0x8009, 122}, + {0x8017, 122}, + {0xc028, 122}, + }, + /* 66 */ + { + {0x8003, 119}, + {0x8006, 119}, + {0x800a, 119}, + {0x800f, 119}, + {0x8018, 119}, + {0x801f, 119}, + {0x8029, 119}, + {0xc038, 119}, + {0x8003, 120}, + {0x8006, 120}, + {0x800a, 120}, + {0x800f, 120}, + {0x8018, 120}, + {0x801f, 120}, + {0x8029, 120}, + {0xc038, 120}, + }, + /* 67 */ + { + {0x8003, 121}, + {0x8006, 121}, + {0x800a, 121}, + {0x800f, 121}, + {0x8018, 121}, + {0x801f, 121}, + {0x8029, 121}, + {0xc038, 121}, + {0x8003, 122}, + {0x8006, 122}, + {0x800a, 122}, + {0x800f, 122}, + {0x8018, 122}, + {0x801f, 122}, + {0x8029, 122}, + {0xc038, 122}, + }, + /* 68 */ + { + {0x8001, 38}, + {0xc016, 38}, + {0x8001, 42}, + {0xc016, 42}, + {0x8001, 44}, + {0xc016, 44}, + {0x8001, 59}, + {0xc016, 59}, + {0x8001, 88}, + {0xc016, 88}, + {0x8001, 90}, + {0xc016, 90}, + {0x4c, 0}, + {0x4d, 0}, + {0x4f, 0}, + {0x51, 0}, + }, + /* 69 */ + { + {0x8002, 38}, + {0x8009, 38}, + {0x8017, 38}, + {0xc028, 38}, + {0x8002, 42}, + {0x8009, 42}, + {0x8017, 42}, + {0xc028, 42}, + {0x8002, 44}, + {0x8009, 44}, + {0x8017, 44}, + {0xc028, 44}, + {0x8002, 59}, + {0x8009, 59}, + {0x8017, 59}, + {0xc028, 59}, + }, + /* 70 */ + { + {0x8003, 38}, + {0x8006, 38}, + {0x800a, 38}, + {0x800f, 38}, + {0x8018, 38}, + {0x801f, 38}, + {0x8029, 38}, + {0xc038, 38}, + {0x8003, 42}, + {0x8006, 42}, + {0x800a, 42}, + {0x800f, 42}, + {0x8018, 42}, + {0x801f, 42}, + {0x8029, 42}, + {0xc038, 42}, + }, + /* 71 */ + { + {0x8003, 44}, + {0x8006, 44}, + {0x800a, 44}, + {0x800f, 44}, + {0x8018, 44}, + {0x801f, 44}, + {0x8029, 44}, + {0xc038, 44}, + {0x8003, 59}, + {0x8006, 59}, + {0x800a, 59}, + {0x800f, 59}, + {0x8018, 59}, + {0x801f, 59}, + {0x8029, 59}, + {0xc038, 59}, + }, + /* 72 */ + { + {0x8002, 88}, + {0x8009, 88}, + {0x8017, 88}, + {0xc028, 88}, + {0x8002, 90}, + {0x8009, 90}, + {0x8017, 90}, + {0xc028, 90}, + {0xc000, 33}, + {0xc000, 34}, + {0xc000, 40}, + {0xc000, 41}, + {0xc000, 63}, + {0x50, 0}, + {0x52, 0}, + {0x54, 0}, + }, + /* 73 */ + { + {0x8003, 88}, + {0x8006, 88}, + {0x800a, 88}, + {0x800f, 88}, + {0x8018, 88}, + {0x801f, 88}, + {0x8029, 88}, + {0xc038, 88}, + {0x8003, 90}, + {0x8006, 90}, + {0x800a, 90}, + {0x800f, 90}, + {0x8018, 90}, + {0x801f, 90}, + {0x8029, 90}, + {0xc038, 90}, + }, + /* 74 */ + { + {0x8001, 33}, + {0xc016, 33}, + {0x8001, 34}, + {0xc016, 34}, + {0x8001, 40}, + {0xc016, 40}, + {0x8001, 41}, + {0xc016, 41}, + {0x8001, 63}, + {0xc016, 63}, + {0xc000, 39}, + {0xc000, 43}, + {0xc000, 124}, + {0x53, 0}, + {0x55, 0}, + {0x58, 0}, + }, + /* 75 */ + { + {0x8002, 33}, + {0x8009, 33}, + {0x8017, 33}, + {0xc028, 33}, + {0x8002, 34}, + {0x8009, 34}, + {0x8017, 34}, + {0xc028, 34}, + {0x8002, 40}, + {0x8009, 40}, + {0x8017, 40}, + {0xc028, 40}, + {0x8002, 41}, + {0x8009, 41}, + {0x8017, 41}, + {0xc028, 41}, + }, + /* 76 */ + { + {0x8003, 33}, + {0x8006, 33}, + {0x800a, 33}, + {0x800f, 33}, + {0x8018, 33}, + {0x801f, 33}, + {0x8029, 33}, + {0xc038, 33}, + {0x8003, 34}, + {0x8006, 34}, + {0x800a, 34}, + {0x800f, 34}, + {0x8018, 34}, + {0x801f, 34}, + {0x8029, 34}, + {0xc038, 34}, + }, + /* 77 */ + { + {0x8003, 40}, + {0x8006, 40}, + {0x800a, 40}, + {0x800f, 40}, + {0x8018, 40}, + {0x801f, 40}, + {0x8029, 40}, + {0xc038, 40}, + {0x8003, 41}, + {0x8006, 41}, + {0x800a, 41}, + {0x800f, 41}, + {0x8018, 41}, + {0x801f, 41}, + {0x8029, 41}, + {0xc038, 41}, + }, + /* 78 */ + { + {0x8002, 63}, + {0x8009, 63}, + {0x8017, 63}, + {0xc028, 63}, + {0x8001, 39}, + {0xc016, 39}, + {0x8001, 43}, + {0xc016, 43}, + {0x8001, 124}, + {0xc016, 124}, + {0xc000, 35}, + {0xc000, 62}, + {0x56, 0}, + {0x57, 0}, + {0x59, 0}, + {0x5a, 0}, + }, + /* 79 */ + { + {0x8003, 63}, + {0x8006, 63}, + {0x800a, 63}, + {0x800f, 63}, + {0x8018, 63}, + {0x801f, 63}, + {0x8029, 63}, + {0xc038, 63}, + {0x8002, 39}, + {0x8009, 39}, + {0x8017, 39}, + {0xc028, 39}, + {0x8002, 43}, + {0x8009, 43}, + {0x8017, 43}, + {0xc028, 43}, + }, + /* 80 */ + { + {0x8003, 39}, + {0x8006, 39}, + {0x800a, 39}, + {0x800f, 39}, + {0x8018, 39}, + {0x801f, 39}, + {0x8029, 39}, + {0xc038, 39}, + {0x8003, 43}, + {0x8006, 43}, + {0x800a, 43}, + {0x800f, 43}, + {0x8018, 43}, + {0x801f, 43}, + {0x8029, 43}, + {0xc038, 43}, + }, + /* 81 */ + { + {0x8002, 124}, + {0x8009, 124}, + {0x8017, 124}, + {0xc028, 124}, + {0x8001, 35}, + {0xc016, 35}, + {0x8001, 62}, + {0xc016, 62}, + {0xc000, 0}, + {0xc000, 36}, + {0xc000, 64}, + {0xc000, 91}, + {0xc000, 93}, + {0xc000, 126}, + {0x5b, 0}, + {0x5c, 0}, + }, + /* 82 */ + { + {0x8003, 124}, + {0x8006, 124}, + {0x800a, 124}, + {0x800f, 124}, + {0x8018, 124}, + {0x801f, 124}, + {0x8029, 124}, + {0xc038, 124}, + {0x8002, 35}, + {0x8009, 35}, + {0x8017, 35}, + {0xc028, 35}, + {0x8002, 62}, + {0x8009, 62}, + {0x8017, 62}, + {0xc028, 62}, + }, + /* 83 */ + { + {0x8003, 35}, + {0x8006, 35}, + {0x800a, 35}, + {0x800f, 35}, + {0x8018, 35}, + {0x801f, 35}, + {0x8029, 35}, + {0xc038, 35}, + {0x8003, 62}, + {0x8006, 62}, + {0x800a, 62}, + {0x800f, 62}, + {0x8018, 62}, + {0x801f, 62}, + {0x8029, 62}, + {0xc038, 62}, + }, + /* 84 */ + { + {0x8001, 0}, + {0xc016, 0}, + {0x8001, 36}, + {0xc016, 36}, + {0x8001, 64}, + {0xc016, 64}, + {0x8001, 91}, + {0xc016, 91}, + {0x8001, 93}, + {0xc016, 93}, + {0x8001, 126}, + {0xc016, 126}, + {0xc000, 94}, + {0xc000, 125}, + {0x5d, 0}, + {0x5e, 0}, + }, + /* 85 */ + { + {0x8002, 0}, + {0x8009, 0}, + {0x8017, 0}, + {0xc028, 0}, + {0x8002, 36}, + {0x8009, 36}, + {0x8017, 36}, + {0xc028, 36}, + {0x8002, 64}, + {0x8009, 64}, + {0x8017, 64}, + {0xc028, 64}, + {0x8002, 91}, + {0x8009, 91}, + {0x8017, 91}, + {0xc028, 91}, + }, + /* 86 */ + { + {0x8003, 0}, + {0x8006, 0}, + {0x800a, 0}, + {0x800f, 0}, + {0x8018, 0}, + {0x801f, 0}, + {0x8029, 0}, + {0xc038, 0}, + {0x8003, 36}, + {0x8006, 36}, + {0x800a, 36}, + {0x800f, 36}, + {0x8018, 36}, + {0x801f, 36}, + {0x8029, 36}, + {0xc038, 36}, + }, + /* 87 */ + { + {0x8003, 64}, + {0x8006, 64}, + {0x800a, 64}, + {0x800f, 64}, + {0x8018, 64}, + {0x801f, 64}, + {0x8029, 64}, + {0xc038, 64}, + {0x8003, 91}, + {0x8006, 91}, + {0x800a, 91}, + {0x800f, 91}, + {0x8018, 91}, + {0x801f, 91}, + {0x8029, 91}, + {0xc038, 91}, + }, + /* 88 */ + { + {0x8002, 93}, + {0x8009, 93}, + {0x8017, 93}, + {0xc028, 93}, + {0x8002, 126}, + {0x8009, 126}, + {0x8017, 126}, + {0xc028, 126}, + {0x8001, 94}, + {0xc016, 94}, + {0x8001, 125}, + {0xc016, 125}, + {0xc000, 60}, + {0xc000, 96}, + {0xc000, 123}, + {0x5f, 0}, + }, + /* 89 */ + { + {0x8003, 93}, + {0x8006, 93}, + {0x800a, 93}, + {0x800f, 93}, + {0x8018, 93}, + {0x801f, 93}, + {0x8029, 93}, + {0xc038, 93}, + {0x8003, 126}, + {0x8006, 126}, + {0x800a, 126}, + {0x800f, 126}, + {0x8018, 126}, + {0x801f, 126}, + {0x8029, 126}, + {0xc038, 126}, + }, + /* 90 */ + { + {0x8002, 94}, + {0x8009, 94}, + {0x8017, 94}, + {0xc028, 94}, + {0x8002, 125}, + {0x8009, 125}, + {0x8017, 125}, + {0xc028, 125}, + {0x8001, 60}, + {0xc016, 60}, + {0x8001, 96}, + {0xc016, 96}, + {0x8001, 123}, + {0xc016, 123}, + {0x60, 0}, + {0x6e, 0}, + }, + /* 91 */ + { + {0x8003, 94}, + {0x8006, 94}, + {0x800a, 94}, + {0x800f, 94}, + {0x8018, 94}, + {0x801f, 94}, + {0x8029, 94}, + {0xc038, 94}, + {0x8003, 125}, + {0x8006, 125}, + {0x800a, 125}, + {0x800f, 125}, + {0x8018, 125}, + {0x801f, 125}, + {0x8029, 125}, + {0xc038, 125}, + }, + /* 92 */ + { + {0x8002, 60}, + {0x8009, 60}, + {0x8017, 60}, + {0xc028, 60}, + {0x8002, 96}, + {0x8009, 96}, + {0x8017, 96}, + {0xc028, 96}, + {0x8002, 123}, + {0x8009, 123}, + {0x8017, 123}, + {0xc028, 123}, + {0x61, 0}, + {0x65, 0}, + {0x6f, 0}, + {0x85, 0}, + }, + /* 93 */ + { + {0x8003, 60}, + {0x8006, 60}, + {0x800a, 60}, + {0x800f, 60}, + {0x8018, 60}, + {0x801f, 60}, + {0x8029, 60}, + {0xc038, 60}, + {0x8003, 96}, + {0x8006, 96}, + {0x800a, 96}, + {0x800f, 96}, + {0x8018, 96}, + {0x801f, 96}, + {0x8029, 96}, + {0xc038, 96}, + }, + /* 94 */ + { + {0x8003, 123}, + {0x8006, 123}, + {0x800a, 123}, + {0x800f, 123}, + {0x8018, 123}, + {0x801f, 123}, + {0x8029, 123}, + {0xc038, 123}, + {0x62, 0}, + {0x63, 0}, + {0x66, 0}, + {0x69, 0}, + {0x70, 0}, + {0x77, 0}, + {0x86, 0}, + {0x99, 0}, + }, + /* 95 */ + { + {0xc000, 92}, + {0xc000, 195}, + {0xc000, 208}, + {0x64, 0}, + {0x67, 0}, + {0x68, 0}, + {0x6a, 0}, + {0x6b, 0}, + {0x71, 0}, + {0x74, 0}, + {0x78, 0}, + {0x7e, 0}, + {0x87, 0}, + {0x8e, 0}, + {0x9a, 0}, + {0xa9, 0}, + }, + /* 96 */ + { + {0x8001, 92}, + {0xc016, 92}, + {0x8001, 195}, + {0xc016, 195}, + {0x8001, 208}, + {0xc016, 208}, + {0xc000, 128}, + {0xc000, 130}, + {0xc000, 131}, + {0xc000, 162}, + {0xc000, 184}, + {0xc000, 194}, + {0xc000, 224}, + {0xc000, 226}, + {0x6c, 0}, + {0x6d, 0}, + }, + /* 97 */ + { + {0x8002, 92}, + {0x8009, 92}, + {0x8017, 92}, + {0xc028, 92}, + {0x8002, 195}, + {0x8009, 195}, + {0x8017, 195}, + {0xc028, 195}, + {0x8002, 208}, + {0x8009, 208}, + {0x8017, 208}, + {0xc028, 208}, + {0x8001, 128}, + {0xc016, 128}, + {0x8001, 130}, + {0xc016, 130}, + }, + /* 98 */ + { + {0x8003, 92}, + {0x8006, 92}, + {0x800a, 92}, + {0x800f, 92}, + {0x8018, 92}, + {0x801f, 92}, + {0x8029, 92}, + {0xc038, 92}, + {0x8003, 195}, + {0x8006, 195}, + {0x800a, 195}, + {0x800f, 195}, + {0x8018, 195}, + {0x801f, 195}, + {0x8029, 195}, + {0xc038, 195}, + }, + /* 99 */ + { + {0x8003, 208}, + {0x8006, 208}, + {0x800a, 208}, + {0x800f, 208}, + {0x8018, 208}, + {0x801f, 208}, + {0x8029, 208}, + {0xc038, 208}, + {0x8002, 128}, + {0x8009, 128}, + {0x8017, 128}, + {0xc028, 128}, + {0x8002, 130}, + {0x8009, 130}, + {0x8017, 130}, + {0xc028, 130}, + }, + /* 100 */ + { + {0x8003, 128}, + {0x8006, 128}, + {0x800a, 128}, + {0x800f, 128}, + {0x8018, 128}, + {0x801f, 128}, + {0x8029, 128}, + {0xc038, 128}, + {0x8003, 130}, + {0x8006, 130}, + {0x800a, 130}, + {0x800f, 130}, + {0x8018, 130}, + {0x801f, 130}, + {0x8029, 130}, + {0xc038, 130}, + }, + /* 101 */ + { + {0x8001, 131}, + {0xc016, 131}, + {0x8001, 162}, + {0xc016, 162}, + {0x8001, 184}, + {0xc016, 184}, + {0x8001, 194}, + {0xc016, 194}, + {0x8001, 224}, + {0xc016, 224}, + {0x8001, 226}, + {0xc016, 226}, + {0xc000, 153}, + {0xc000, 161}, + {0xc000, 167}, + {0xc000, 172}, + }, + /* 102 */ + { + {0x8002, 131}, + {0x8009, 131}, + {0x8017, 131}, + {0xc028, 131}, + {0x8002, 162}, + {0x8009, 162}, + {0x8017, 162}, + {0xc028, 162}, + {0x8002, 184}, + {0x8009, 184}, + {0x8017, 184}, + {0xc028, 184}, + {0x8002, 194}, + {0x8009, 194}, + {0x8017, 194}, + {0xc028, 194}, + }, + /* 103 */ + { + {0x8003, 131}, + {0x8006, 131}, + {0x800a, 131}, + {0x800f, 131}, + {0x8018, 131}, + {0x801f, 131}, + {0x8029, 131}, + {0xc038, 131}, + {0x8003, 162}, + {0x8006, 162}, + {0x800a, 162}, + {0x800f, 162}, + {0x8018, 162}, + {0x801f, 162}, + {0x8029, 162}, + {0xc038, 162}, + }, + /* 104 */ + { + {0x8003, 184}, + {0x8006, 184}, + {0x800a, 184}, + {0x800f, 184}, + {0x8018, 184}, + {0x801f, 184}, + {0x8029, 184}, + {0xc038, 184}, + {0x8003, 194}, + {0x8006, 194}, + {0x800a, 194}, + {0x800f, 194}, + {0x8018, 194}, + {0x801f, 194}, + {0x8029, 194}, + {0xc038, 194}, + }, + /* 105 */ + { + {0x8002, 224}, + {0x8009, 224}, + {0x8017, 224}, + {0xc028, 224}, + {0x8002, 226}, + {0x8009, 226}, + {0x8017, 226}, + {0xc028, 226}, + {0x8001, 153}, + {0xc016, 153}, + {0x8001, 161}, + {0xc016, 161}, + {0x8001, 167}, + {0xc016, 167}, + {0x8001, 172}, + {0xc016, 172}, + }, + /* 106 */ + { + {0x8003, 224}, + {0x8006, 224}, + {0x800a, 224}, + {0x800f, 224}, + {0x8018, 224}, + {0x801f, 224}, + {0x8029, 224}, + {0xc038, 224}, + {0x8003, 226}, + {0x8006, 226}, + {0x800a, 226}, + {0x800f, 226}, + {0x8018, 226}, + {0x801f, 226}, + {0x8029, 226}, + {0xc038, 226}, + }, + /* 107 */ + { + {0x8002, 153}, + {0x8009, 153}, + {0x8017, 153}, + {0xc028, 153}, + {0x8002, 161}, + {0x8009, 161}, + {0x8017, 161}, + {0xc028, 161}, + {0x8002, 167}, + {0x8009, 167}, + {0x8017, 167}, + {0xc028, 167}, + {0x8002, 172}, + {0x8009, 172}, + {0x8017, 172}, + {0xc028, 172}, + }, + /* 108 */ + { + {0x8003, 153}, + {0x8006, 153}, + {0x800a, 153}, + {0x800f, 153}, + {0x8018, 153}, + {0x801f, 153}, + {0x8029, 153}, + {0xc038, 153}, + {0x8003, 161}, + {0x8006, 161}, + {0x800a, 161}, + {0x800f, 161}, + {0x8018, 161}, + {0x801f, 161}, + {0x8029, 161}, + {0xc038, 161}, + }, + /* 109 */ + { + {0x8003, 167}, + {0x8006, 167}, + {0x800a, 167}, + {0x800f, 167}, + {0x8018, 167}, + {0x801f, 167}, + {0x8029, 167}, + {0xc038, 167}, + {0x8003, 172}, + {0x8006, 172}, + {0x800a, 172}, + {0x800f, 172}, + {0x8018, 172}, + {0x801f, 172}, + {0x8029, 172}, + {0xc038, 172}, + }, + /* 110 */ + { + {0x72, 0}, + {0x73, 0}, + {0x75, 0}, + {0x76, 0}, + {0x79, 0}, + {0x7b, 0}, + {0x7f, 0}, + {0x82, 0}, + {0x88, 0}, + {0x8b, 0}, + {0x8f, 0}, + {0x92, 0}, + {0x9b, 0}, + {0xa2, 0}, + {0xaa, 0}, + {0xb4, 0}, + }, + /* 111 */ + { + {0xc000, 176}, + {0xc000, 177}, + {0xc000, 179}, + {0xc000, 209}, + {0xc000, 216}, + {0xc000, 217}, + {0xc000, 227}, + {0xc000, 229}, + {0xc000, 230}, + {0x7a, 0}, + {0x7c, 0}, + {0x7d, 0}, + {0x80, 0}, + {0x81, 0}, + {0x83, 0}, + {0x84, 0}, + }, + /* 112 */ + { + {0x8001, 176}, + {0xc016, 176}, + {0x8001, 177}, + {0xc016, 177}, + {0x8001, 179}, + {0xc016, 179}, + {0x8001, 209}, + {0xc016, 209}, + {0x8001, 216}, + {0xc016, 216}, + {0x8001, 217}, + {0xc016, 217}, + {0x8001, 227}, + {0xc016, 227}, + {0x8001, 229}, + {0xc016, 229}, + }, + /* 113 */ + { + {0x8002, 176}, + {0x8009, 176}, + {0x8017, 176}, + {0xc028, 176}, + {0x8002, 177}, + {0x8009, 177}, + {0x8017, 177}, + {0xc028, 177}, + {0x8002, 179}, + {0x8009, 179}, + {0x8017, 179}, + {0xc028, 179}, + {0x8002, 209}, + {0x8009, 209}, + {0x8017, 209}, + {0xc028, 209}, + }, + /* 114 */ + { + {0x8003, 176}, + {0x8006, 176}, + {0x800a, 176}, + {0x800f, 176}, + {0x8018, 176}, + {0x801f, 176}, + {0x8029, 176}, + {0xc038, 176}, + {0x8003, 177}, + {0x8006, 177}, + {0x800a, 177}, + {0x800f, 177}, + {0x8018, 177}, + {0x801f, 177}, + {0x8029, 177}, + {0xc038, 177}, + }, + /* 115 */ + { + {0x8003, 179}, + {0x8006, 179}, + {0x800a, 179}, + {0x800f, 179}, + {0x8018, 179}, + {0x801f, 179}, + {0x8029, 179}, + {0xc038, 179}, + {0x8003, 209}, + {0x8006, 209}, + {0x800a, 209}, + {0x800f, 209}, + {0x8018, 209}, + {0x801f, 209}, + {0x8029, 209}, + {0xc038, 209}, + }, + /* 116 */ + { + {0x8002, 216}, + {0x8009, 216}, + {0x8017, 216}, + {0xc028, 216}, + {0x8002, 217}, + {0x8009, 217}, + {0x8017, 217}, + {0xc028, 217}, + {0x8002, 227}, + {0x8009, 227}, + {0x8017, 227}, + {0xc028, 227}, + {0x8002, 229}, + {0x8009, 229}, + {0x8017, 229}, + {0xc028, 229}, + }, + /* 117 */ + { + {0x8003, 216}, + {0x8006, 216}, + {0x800a, 216}, + {0x800f, 216}, + {0x8018, 216}, + {0x801f, 216}, + {0x8029, 216}, + {0xc038, 216}, + {0x8003, 217}, + {0x8006, 217}, + {0x800a, 217}, + {0x800f, 217}, + {0x8018, 217}, + {0x801f, 217}, + {0x8029, 217}, + {0xc038, 217}, + }, + /* 118 */ + { + {0x8003, 227}, + {0x8006, 227}, + {0x800a, 227}, + {0x800f, 227}, + {0x8018, 227}, + {0x801f, 227}, + {0x8029, 227}, + {0xc038, 227}, + {0x8003, 229}, + {0x8006, 229}, + {0x800a, 229}, + {0x800f, 229}, + {0x8018, 229}, + {0x801f, 229}, + {0x8029, 229}, + {0xc038, 229}, + }, + /* 119 */ + { + {0x8001, 230}, + {0xc016, 230}, + {0xc000, 129}, + {0xc000, 132}, + {0xc000, 133}, + {0xc000, 134}, + {0xc000, 136}, + {0xc000, 146}, + {0xc000, 154}, + {0xc000, 156}, + {0xc000, 160}, + {0xc000, 163}, + {0xc000, 164}, + {0xc000, 169}, + {0xc000, 170}, + {0xc000, 173}, + }, + /* 120 */ + { + {0x8002, 230}, + {0x8009, 230}, + {0x8017, 230}, + {0xc028, 230}, + {0x8001, 129}, + {0xc016, 129}, + {0x8001, 132}, + {0xc016, 132}, + {0x8001, 133}, + {0xc016, 133}, + {0x8001, 134}, + {0xc016, 134}, + {0x8001, 136}, + {0xc016, 136}, + {0x8001, 146}, + {0xc016, 146}, + }, + /* 121 */ + { + {0x8003, 230}, + {0x8006, 230}, + {0x800a, 230}, + {0x800f, 230}, + {0x8018, 230}, + {0x801f, 230}, + {0x8029, 230}, + {0xc038, 230}, + {0x8002, 129}, + {0x8009, 129}, + {0x8017, 129}, + {0xc028, 129}, + {0x8002, 132}, + {0x8009, 132}, + {0x8017, 132}, + {0xc028, 132}, + }, + /* 122 */ + { + {0x8003, 129}, + {0x8006, 129}, + {0x800a, 129}, + {0x800f, 129}, + {0x8018, 129}, + {0x801f, 129}, + {0x8029, 129}, + {0xc038, 129}, + {0x8003, 132}, + {0x8006, 132}, + {0x800a, 132}, + {0x800f, 132}, + {0x8018, 132}, + {0x801f, 132}, + {0x8029, 132}, + {0xc038, 132}, + }, + /* 123 */ + { + {0x8002, 133}, + {0x8009, 133}, + {0x8017, 133}, + {0xc028, 133}, + {0x8002, 134}, + {0x8009, 134}, + {0x8017, 134}, + {0xc028, 134}, + {0x8002, 136}, + {0x8009, 136}, + {0x8017, 136}, + {0xc028, 136}, + {0x8002, 146}, + {0x8009, 146}, + {0x8017, 146}, + {0xc028, 146}, + }, + /* 124 */ + { + {0x8003, 133}, + {0x8006, 133}, + {0x800a, 133}, + {0x800f, 133}, + {0x8018, 133}, + {0x801f, 133}, + {0x8029, 133}, + {0xc038, 133}, + {0x8003, 134}, + {0x8006, 134}, + {0x800a, 134}, + {0x800f, 134}, + {0x8018, 134}, + {0x801f, 134}, + {0x8029, 134}, + {0xc038, 134}, + }, + /* 125 */ + { + {0x8003, 136}, + {0x8006, 136}, + {0x800a, 136}, + {0x800f, 136}, + {0x8018, 136}, + {0x801f, 136}, + {0x8029, 136}, + {0xc038, 136}, + {0x8003, 146}, + {0x8006, 146}, + {0x800a, 146}, + {0x800f, 146}, + {0x8018, 146}, + {0x801f, 146}, + {0x8029, 146}, + {0xc038, 146}, + }, + /* 126 */ + { + {0x8001, 154}, + {0xc016, 154}, + {0x8001, 156}, + {0xc016, 156}, + {0x8001, 160}, + {0xc016, 160}, + {0x8001, 163}, + {0xc016, 163}, + {0x8001, 164}, + {0xc016, 164}, + {0x8001, 169}, + {0xc016, 169}, + {0x8001, 170}, + {0xc016, 170}, + {0x8001, 173}, + {0xc016, 173}, + }, + /* 127 */ + { + {0x8002, 154}, + {0x8009, 154}, + {0x8017, 154}, + {0xc028, 154}, + {0x8002, 156}, + {0x8009, 156}, + {0x8017, 156}, + {0xc028, 156}, + {0x8002, 160}, + {0x8009, 160}, + {0x8017, 160}, + {0xc028, 160}, + {0x8002, 163}, + {0x8009, 163}, + {0x8017, 163}, + {0xc028, 163}, + }, + /* 128 */ + { + {0x8003, 154}, + {0x8006, 154}, + {0x800a, 154}, + {0x800f, 154}, + {0x8018, 154}, + {0x801f, 154}, + {0x8029, 154}, + {0xc038, 154}, + {0x8003, 156}, + {0x8006, 156}, + {0x800a, 156}, + {0x800f, 156}, + {0x8018, 156}, + {0x801f, 156}, + {0x8029, 156}, + {0xc038, 156}, + }, + /* 129 */ + { + {0x8003, 160}, + {0x8006, 160}, + {0x800a, 160}, + {0x800f, 160}, + {0x8018, 160}, + {0x801f, 160}, + {0x8029, 160}, + {0xc038, 160}, + {0x8003, 163}, + {0x8006, 163}, + {0x800a, 163}, + {0x800f, 163}, + {0x8018, 163}, + {0x801f, 163}, + {0x8029, 163}, + {0xc038, 163}, + }, + /* 130 */ + { + {0x8002, 164}, + {0x8009, 164}, + {0x8017, 164}, + {0xc028, 164}, + {0x8002, 169}, + {0x8009, 169}, + {0x8017, 169}, + {0xc028, 169}, + {0x8002, 170}, + {0x8009, 170}, + {0x8017, 170}, + {0xc028, 170}, + {0x8002, 173}, + {0x8009, 173}, + {0x8017, 173}, + {0xc028, 173}, + }, + /* 131 */ + { + {0x8003, 164}, + {0x8006, 164}, + {0x800a, 164}, + {0x800f, 164}, + {0x8018, 164}, + {0x801f, 164}, + {0x8029, 164}, + {0xc038, 164}, + {0x8003, 169}, + {0x8006, 169}, + {0x800a, 169}, + {0x800f, 169}, + {0x8018, 169}, + {0x801f, 169}, + {0x8029, 169}, + {0xc038, 169}, + }, + /* 132 */ + { + {0x8003, 170}, + {0x8006, 170}, + {0x800a, 170}, + {0x800f, 170}, + {0x8018, 170}, + {0x801f, 170}, + {0x8029, 170}, + {0xc038, 170}, + {0x8003, 173}, + {0x8006, 173}, + {0x800a, 173}, + {0x800f, 173}, + {0x8018, 173}, + {0x801f, 173}, + {0x8029, 173}, + {0xc038, 173}, + }, + /* 133 */ + { + {0x89, 0}, + {0x8a, 0}, + {0x8c, 0}, + {0x8d, 0}, + {0x90, 0}, + {0x91, 0}, + {0x93, 0}, + {0x96, 0}, + {0x9c, 0}, + {0x9f, 0}, + {0xa3, 0}, + {0xa6, 0}, + {0xab, 0}, + {0xae, 0}, + {0xb5, 0}, + {0xbe, 0}, + }, + /* 134 */ + { + {0xc000, 178}, + {0xc000, 181}, + {0xc000, 185}, + {0xc000, 186}, + {0xc000, 187}, + {0xc000, 189}, + {0xc000, 190}, + {0xc000, 196}, + {0xc000, 198}, + {0xc000, 228}, + {0xc000, 232}, + {0xc000, 233}, + {0x94, 0}, + {0x95, 0}, + {0x97, 0}, + {0x98, 0}, + }, + /* 135 */ + { + {0x8001, 178}, + {0xc016, 178}, + {0x8001, 181}, + {0xc016, 181}, + {0x8001, 185}, + {0xc016, 185}, + {0x8001, 186}, + {0xc016, 186}, + {0x8001, 187}, + {0xc016, 187}, + {0x8001, 189}, + {0xc016, 189}, + {0x8001, 190}, + {0xc016, 190}, + {0x8001, 196}, + {0xc016, 196}, + }, + /* 136 */ + { + {0x8002, 178}, + {0x8009, 178}, + {0x8017, 178}, + {0xc028, 178}, + {0x8002, 181}, + {0x8009, 181}, + {0x8017, 181}, + {0xc028, 181}, + {0x8002, 185}, + {0x8009, 185}, + {0x8017, 185}, + {0xc028, 185}, + {0x8002, 186}, + {0x8009, 186}, + {0x8017, 186}, + {0xc028, 186}, + }, + /* 137 */ + { + {0x8003, 178}, + {0x8006, 178}, + {0x800a, 178}, + {0x800f, 178}, + {0x8018, 178}, + {0x801f, 178}, + {0x8029, 178}, + {0xc038, 178}, + {0x8003, 181}, + {0x8006, 181}, + {0x800a, 181}, + {0x800f, 181}, + {0x8018, 181}, + {0x801f, 181}, + {0x8029, 181}, + {0xc038, 181}, + }, + /* 138 */ + { + {0x8003, 185}, + {0x8006, 185}, + {0x800a, 185}, + {0x800f, 185}, + {0x8018, 185}, + {0x801f, 185}, + {0x8029, 185}, + {0xc038, 185}, + {0x8003, 186}, + {0x8006, 186}, + {0x800a, 186}, + {0x800f, 186}, + {0x8018, 186}, + {0x801f, 186}, + {0x8029, 186}, + {0xc038, 186}, + }, + /* 139 */ + { + {0x8002, 187}, + {0x8009, 187}, + {0x8017, 187}, + {0xc028, 187}, + {0x8002, 189}, + {0x8009, 189}, + {0x8017, 189}, + {0xc028, 189}, + {0x8002, 190}, + {0x8009, 190}, + {0x8017, 190}, + {0xc028, 190}, + {0x8002, 196}, + {0x8009, 196}, + {0x8017, 196}, + {0xc028, 196}, + }, + /* 140 */ + { + {0x8003, 187}, + {0x8006, 187}, + {0x800a, 187}, + {0x800f, 187}, + {0x8018, 187}, + {0x801f, 187}, + {0x8029, 187}, + {0xc038, 187}, + {0x8003, 189}, + {0x8006, 189}, + {0x800a, 189}, + {0x800f, 189}, + {0x8018, 189}, + {0x801f, 189}, + {0x8029, 189}, + {0xc038, 189}, + }, + /* 141 */ + { + {0x8003, 190}, + {0x8006, 190}, + {0x800a, 190}, + {0x800f, 190}, + {0x8018, 190}, + {0x801f, 190}, + {0x8029, 190}, + {0xc038, 190}, + {0x8003, 196}, + {0x8006, 196}, + {0x800a, 196}, + {0x800f, 196}, + {0x8018, 196}, + {0x801f, 196}, + {0x8029, 196}, + {0xc038, 196}, + }, + /* 142 */ + { + {0x8001, 198}, + {0xc016, 198}, + {0x8001, 228}, + {0xc016, 228}, + {0x8001, 232}, + {0xc016, 232}, + {0x8001, 233}, + {0xc016, 233}, + {0xc000, 1}, + {0xc000, 135}, + {0xc000, 137}, + {0xc000, 138}, + {0xc000, 139}, + {0xc000, 140}, + {0xc000, 141}, + {0xc000, 143}, + }, + /* 143 */ + { + {0x8002, 198}, + {0x8009, 198}, + {0x8017, 198}, + {0xc028, 198}, + {0x8002, 228}, + {0x8009, 228}, + {0x8017, 228}, + {0xc028, 228}, + {0x8002, 232}, + {0x8009, 232}, + {0x8017, 232}, + {0xc028, 232}, + {0x8002, 233}, + {0x8009, 233}, + {0x8017, 233}, + {0xc028, 233}, + }, + /* 144 */ + { + {0x8003, 198}, + {0x8006, 198}, + {0x800a, 198}, + {0x800f, 198}, + {0x8018, 198}, + {0x801f, 198}, + {0x8029, 198}, + {0xc038, 198}, + {0x8003, 228}, + {0x8006, 228}, + {0x800a, 228}, + {0x800f, 228}, + {0x8018, 228}, + {0x801f, 228}, + {0x8029, 228}, + {0xc038, 228}, + }, + /* 145 */ + { + {0x8003, 232}, + {0x8006, 232}, + {0x800a, 232}, + {0x800f, 232}, + {0x8018, 232}, + {0x801f, 232}, + {0x8029, 232}, + {0xc038, 232}, + {0x8003, 233}, + {0x8006, 233}, + {0x800a, 233}, + {0x800f, 233}, + {0x8018, 233}, + {0x801f, 233}, + {0x8029, 233}, + {0xc038, 233}, + }, + /* 146 */ + { + {0x8001, 1}, + {0xc016, 1}, + {0x8001, 135}, + {0xc016, 135}, + {0x8001, 137}, + {0xc016, 137}, + {0x8001, 138}, + {0xc016, 138}, + {0x8001, 139}, + {0xc016, 139}, + {0x8001, 140}, + {0xc016, 140}, + {0x8001, 141}, + {0xc016, 141}, + {0x8001, 143}, + {0xc016, 143}, + }, + /* 147 */ + { + {0x8002, 1}, + {0x8009, 1}, + {0x8017, 1}, + {0xc028, 1}, + {0x8002, 135}, + {0x8009, 135}, + {0x8017, 135}, + {0xc028, 135}, + {0x8002, 137}, + {0x8009, 137}, + {0x8017, 137}, + {0xc028, 137}, + {0x8002, 138}, + {0x8009, 138}, + {0x8017, 138}, + {0xc028, 138}, + }, + /* 148 */ + { + {0x8003, 1}, + {0x8006, 1}, + {0x800a, 1}, + {0x800f, 1}, + {0x8018, 1}, + {0x801f, 1}, + {0x8029, 1}, + {0xc038, 1}, + {0x8003, 135}, + {0x8006, 135}, + {0x800a, 135}, + {0x800f, 135}, + {0x8018, 135}, + {0x801f, 135}, + {0x8029, 135}, + {0xc038, 135}, + }, + /* 149 */ + { + {0x8003, 137}, + {0x8006, 137}, + {0x800a, 137}, + {0x800f, 137}, + {0x8018, 137}, + {0x801f, 137}, + {0x8029, 137}, + {0xc038, 137}, + {0x8003, 138}, + {0x8006, 138}, + {0x800a, 138}, + {0x800f, 138}, + {0x8018, 138}, + {0x801f, 138}, + {0x8029, 138}, + {0xc038, 138}, + }, + /* 150 */ + { + {0x8002, 139}, + {0x8009, 139}, + {0x8017, 139}, + {0xc028, 139}, + {0x8002, 140}, + {0x8009, 140}, + {0x8017, 140}, + {0xc028, 140}, + {0x8002, 141}, + {0x8009, 141}, + {0x8017, 141}, + {0xc028, 141}, + {0x8002, 143}, + {0x8009, 143}, + {0x8017, 143}, + {0xc028, 143}, + }, + /* 151 */ + { + {0x8003, 139}, + {0x8006, 139}, + {0x800a, 139}, + {0x800f, 139}, + {0x8018, 139}, + {0x801f, 139}, + {0x8029, 139}, + {0xc038, 139}, + {0x8003, 140}, + {0x8006, 140}, + {0x800a, 140}, + {0x800f, 140}, + {0x8018, 140}, + {0x801f, 140}, + {0x8029, 140}, + {0xc038, 140}, + }, + /* 152 */ + { + {0x8003, 141}, + {0x8006, 141}, + {0x800a, 141}, + {0x800f, 141}, + {0x8018, 141}, + {0x801f, 141}, + {0x8029, 141}, + {0xc038, 141}, + {0x8003, 143}, + {0x8006, 143}, + {0x800a, 143}, + {0x800f, 143}, + {0x8018, 143}, + {0x801f, 143}, + {0x8029, 143}, + {0xc038, 143}, + }, + /* 153 */ + { + {0x9d, 0}, + {0x9e, 0}, + {0xa0, 0}, + {0xa1, 0}, + {0xa4, 0}, + {0xa5, 0}, + {0xa7, 0}, + {0xa8, 0}, + {0xac, 0}, + {0xad, 0}, + {0xaf, 0}, + {0xb1, 0}, + {0xb6, 0}, + {0xb9, 0}, + {0xbf, 0}, + {0xcf, 0}, + }, + /* 154 */ + { + {0xc000, 147}, + {0xc000, 149}, + {0xc000, 150}, + {0xc000, 151}, + {0xc000, 152}, + {0xc000, 155}, + {0xc000, 157}, + {0xc000, 158}, + {0xc000, 165}, + {0xc000, 166}, + {0xc000, 168}, + {0xc000, 174}, + {0xc000, 175}, + {0xc000, 180}, + {0xc000, 182}, + {0xc000, 183}, + }, + /* 155 */ + { + {0x8001, 147}, + {0xc016, 147}, + {0x8001, 149}, + {0xc016, 149}, + {0x8001, 150}, + {0xc016, 150}, + {0x8001, 151}, + {0xc016, 151}, + {0x8001, 152}, + {0xc016, 152}, + {0x8001, 155}, + {0xc016, 155}, + {0x8001, 157}, + {0xc016, 157}, + {0x8001, 158}, + {0xc016, 158}, + }, + /* 156 */ + { + {0x8002, 147}, + {0x8009, 147}, + {0x8017, 147}, + {0xc028, 147}, + {0x8002, 149}, + {0x8009, 149}, + {0x8017, 149}, + {0xc028, 149}, + {0x8002, 150}, + {0x8009, 150}, + {0x8017, 150}, + {0xc028, 150}, + {0x8002, 151}, + {0x8009, 151}, + {0x8017, 151}, + {0xc028, 151}, + }, + /* 157 */ + { + {0x8003, 147}, + {0x8006, 147}, + {0x800a, 147}, + {0x800f, 147}, + {0x8018, 147}, + {0x801f, 147}, + {0x8029, 147}, + {0xc038, 147}, + {0x8003, 149}, + {0x8006, 149}, + {0x800a, 149}, + {0x800f, 149}, + {0x8018, 149}, + {0x801f, 149}, + {0x8029, 149}, + {0xc038, 149}, + }, + /* 158 */ + { + {0x8003, 150}, + {0x8006, 150}, + {0x800a, 150}, + {0x800f, 150}, + {0x8018, 150}, + {0x801f, 150}, + {0x8029, 150}, + {0xc038, 150}, + {0x8003, 151}, + {0x8006, 151}, + {0x800a, 151}, + {0x800f, 151}, + {0x8018, 151}, + {0x801f, 151}, + {0x8029, 151}, + {0xc038, 151}, + }, + /* 159 */ + { + {0x8002, 152}, + {0x8009, 152}, + {0x8017, 152}, + {0xc028, 152}, + {0x8002, 155}, + {0x8009, 155}, + {0x8017, 155}, + {0xc028, 155}, + {0x8002, 157}, + {0x8009, 157}, + {0x8017, 157}, + {0xc028, 157}, + {0x8002, 158}, + {0x8009, 158}, + {0x8017, 158}, + {0xc028, 158}, + }, + /* 160 */ + { + {0x8003, 152}, + {0x8006, 152}, + {0x800a, 152}, + {0x800f, 152}, + {0x8018, 152}, + {0x801f, 152}, + {0x8029, 152}, + {0xc038, 152}, + {0x8003, 155}, + {0x8006, 155}, + {0x800a, 155}, + {0x800f, 155}, + {0x8018, 155}, + {0x801f, 155}, + {0x8029, 155}, + {0xc038, 155}, + }, + /* 161 */ + { + {0x8003, 157}, + {0x8006, 157}, + {0x800a, 157}, + {0x800f, 157}, + {0x8018, 157}, + {0x801f, 157}, + {0x8029, 157}, + {0xc038, 157}, + {0x8003, 158}, + {0x8006, 158}, + {0x800a, 158}, + {0x800f, 158}, + {0x8018, 158}, + {0x801f, 158}, + {0x8029, 158}, + {0xc038, 158}, + }, + /* 162 */ + { + {0x8001, 165}, + {0xc016, 165}, + {0x8001, 166}, + {0xc016, 166}, + {0x8001, 168}, + {0xc016, 168}, + {0x8001, 174}, + {0xc016, 174}, + {0x8001, 175}, + {0xc016, 175}, + {0x8001, 180}, + {0xc016, 180}, + {0x8001, 182}, + {0xc016, 182}, + {0x8001, 183}, + {0xc016, 183}, + }, + /* 163 */ + { + {0x8002, 165}, + {0x8009, 165}, + {0x8017, 165}, + {0xc028, 165}, + {0x8002, 166}, + {0x8009, 166}, + {0x8017, 166}, + {0xc028, 166}, + {0x8002, 168}, + {0x8009, 168}, + {0x8017, 168}, + {0xc028, 168}, + {0x8002, 174}, + {0x8009, 174}, + {0x8017, 174}, + {0xc028, 174}, + }, + /* 164 */ + { + {0x8003, 165}, + {0x8006, 165}, + {0x800a, 165}, + {0x800f, 165}, + {0x8018, 165}, + {0x801f, 165}, + {0x8029, 165}, + {0xc038, 165}, + {0x8003, 166}, + {0x8006, 166}, + {0x800a, 166}, + {0x800f, 166}, + {0x8018, 166}, + {0x801f, 166}, + {0x8029, 166}, + {0xc038, 166}, + }, + /* 165 */ + { + {0x8003, 168}, + {0x8006, 168}, + {0x800a, 168}, + {0x800f, 168}, + {0x8018, 168}, + {0x801f, 168}, + {0x8029, 168}, + {0xc038, 168}, + {0x8003, 174}, + {0x8006, 174}, + {0x800a, 174}, + {0x800f, 174}, + {0x8018, 174}, + {0x801f, 174}, + {0x8029, 174}, + {0xc038, 174}, + }, + /* 166 */ + { + {0x8002, 175}, + {0x8009, 175}, + {0x8017, 175}, + {0xc028, 175}, + {0x8002, 180}, + {0x8009, 180}, + {0x8017, 180}, + {0xc028, 180}, + {0x8002, 182}, + {0x8009, 182}, + {0x8017, 182}, + {0xc028, 182}, + {0x8002, 183}, + {0x8009, 183}, + {0x8017, 183}, + {0xc028, 183}, + }, + /* 167 */ + { + {0x8003, 175}, + {0x8006, 175}, + {0x800a, 175}, + {0x800f, 175}, + {0x8018, 175}, + {0x801f, 175}, + {0x8029, 175}, + {0xc038, 175}, + {0x8003, 180}, + {0x8006, 180}, + {0x800a, 180}, + {0x800f, 180}, + {0x8018, 180}, + {0x801f, 180}, + {0x8029, 180}, + {0xc038, 180}, + }, + /* 168 */ + { + {0x8003, 182}, + {0x8006, 182}, + {0x800a, 182}, + {0x800f, 182}, + {0x8018, 182}, + {0x801f, 182}, + {0x8029, 182}, + {0xc038, 182}, + {0x8003, 183}, + {0x8006, 183}, + {0x800a, 183}, + {0x800f, 183}, + {0x8018, 183}, + {0x801f, 183}, + {0x8029, 183}, + {0xc038, 183}, + }, + /* 169 */ + { + {0xc000, 188}, + {0xc000, 191}, + {0xc000, 197}, + {0xc000, 231}, + {0xc000, 239}, + {0xb0, 0}, + {0xb2, 0}, + {0xb3, 0}, + {0xb7, 0}, + {0xb8, 0}, + {0xba, 0}, + {0xbb, 0}, + {0xc0, 0}, + {0xc7, 0}, + {0xd0, 0}, + {0xdf, 0}, + }, + /* 170 */ + { + {0x8001, 188}, + {0xc016, 188}, + {0x8001, 191}, + {0xc016, 191}, + {0x8001, 197}, + {0xc016, 197}, + {0x8001, 231}, + {0xc016, 231}, + {0x8001, 239}, + {0xc016, 239}, + {0xc000, 9}, + {0xc000, 142}, + {0xc000, 144}, + {0xc000, 145}, + {0xc000, 148}, + {0xc000, 159}, + }, + /* 171 */ + { + {0x8002, 188}, + {0x8009, 188}, + {0x8017, 188}, + {0xc028, 188}, + {0x8002, 191}, + {0x8009, 191}, + {0x8017, 191}, + {0xc028, 191}, + {0x8002, 197}, + {0x8009, 197}, + {0x8017, 197}, + {0xc028, 197}, + {0x8002, 231}, + {0x8009, 231}, + {0x8017, 231}, + {0xc028, 231}, + }, + /* 172 */ + { + {0x8003, 188}, + {0x8006, 188}, + {0x800a, 188}, + {0x800f, 188}, + {0x8018, 188}, + {0x801f, 188}, + {0x8029, 188}, + {0xc038, 188}, + {0x8003, 191}, + {0x8006, 191}, + {0x800a, 191}, + {0x800f, 191}, + {0x8018, 191}, + {0x801f, 191}, + {0x8029, 191}, + {0xc038, 191}, + }, + /* 173 */ + { + {0x8003, 197}, + {0x8006, 197}, + {0x800a, 197}, + {0x800f, 197}, + {0x8018, 197}, + {0x801f, 197}, + {0x8029, 197}, + {0xc038, 197}, + {0x8003, 231}, + {0x8006, 231}, + {0x800a, 231}, + {0x800f, 231}, + {0x8018, 231}, + {0x801f, 231}, + {0x8029, 231}, + {0xc038, 231}, + }, + /* 174 */ + { + {0x8002, 239}, + {0x8009, 239}, + {0x8017, 239}, + {0xc028, 239}, + {0x8001, 9}, + {0xc016, 9}, + {0x8001, 142}, + {0xc016, 142}, + {0x8001, 144}, + {0xc016, 144}, + {0x8001, 145}, + {0xc016, 145}, + {0x8001, 148}, + {0xc016, 148}, + {0x8001, 159}, + {0xc016, 159}, + }, + /* 175 */ + { + {0x8003, 239}, + {0x8006, 239}, + {0x800a, 239}, + {0x800f, 239}, + {0x8018, 239}, + {0x801f, 239}, + {0x8029, 239}, + {0xc038, 239}, + {0x8002, 9}, + {0x8009, 9}, + {0x8017, 9}, + {0xc028, 9}, + {0x8002, 142}, + {0x8009, 142}, + {0x8017, 142}, + {0xc028, 142}, + }, + /* 176 */ + { + {0x8003, 9}, + {0x8006, 9}, + {0x800a, 9}, + {0x800f, 9}, + {0x8018, 9}, + {0x801f, 9}, + {0x8029, 9}, + {0xc038, 9}, + {0x8003, 142}, + {0x8006, 142}, + {0x800a, 142}, + {0x800f, 142}, + {0x8018, 142}, + {0x801f, 142}, + {0x8029, 142}, + {0xc038, 142}, + }, + /* 177 */ + { + {0x8002, 144}, + {0x8009, 144}, + {0x8017, 144}, + {0xc028, 144}, + {0x8002, 145}, + {0x8009, 145}, + {0x8017, 145}, + {0xc028, 145}, + {0x8002, 148}, + {0x8009, 148}, + {0x8017, 148}, + {0xc028, 148}, + {0x8002, 159}, + {0x8009, 159}, + {0x8017, 159}, + {0xc028, 159}, + }, + /* 178 */ + { + {0x8003, 144}, + {0x8006, 144}, + {0x800a, 144}, + {0x800f, 144}, + {0x8018, 144}, + {0x801f, 144}, + {0x8029, 144}, + {0xc038, 144}, + {0x8003, 145}, + {0x8006, 145}, + {0x800a, 145}, + {0x800f, 145}, + {0x8018, 145}, + {0x801f, 145}, + {0x8029, 145}, + {0xc038, 145}, + }, + /* 179 */ + { + {0x8003, 148}, + {0x8006, 148}, + {0x800a, 148}, + {0x800f, 148}, + {0x8018, 148}, + {0x801f, 148}, + {0x8029, 148}, + {0xc038, 148}, + {0x8003, 159}, + {0x8006, 159}, + {0x800a, 159}, + {0x800f, 159}, + {0x8018, 159}, + {0x801f, 159}, + {0x8029, 159}, + {0xc038, 159}, + }, + /* 180 */ + { + {0xc000, 171}, + {0xc000, 206}, + {0xc000, 215}, + {0xc000, 225}, + {0xc000, 236}, + {0xc000, 237}, + {0xbc, 0}, + {0xbd, 0}, + {0xc1, 0}, + {0xc4, 0}, + {0xc8, 0}, + {0xcb, 0}, + {0xd1, 0}, + {0xd8, 0}, + {0xe0, 0}, + {0xee, 0}, + }, + /* 181 */ + { + {0x8001, 171}, + {0xc016, 171}, + {0x8001, 206}, + {0xc016, 206}, + {0x8001, 215}, + {0xc016, 215}, + {0x8001, 225}, + {0xc016, 225}, + {0x8001, 236}, + {0xc016, 236}, + {0x8001, 237}, + {0xc016, 237}, + {0xc000, 199}, + {0xc000, 207}, + {0xc000, 234}, + {0xc000, 235}, + }, + /* 182 */ + { + {0x8002, 171}, + {0x8009, 171}, + {0x8017, 171}, + {0xc028, 171}, + {0x8002, 206}, + {0x8009, 206}, + {0x8017, 206}, + {0xc028, 206}, + {0x8002, 215}, + {0x8009, 215}, + {0x8017, 215}, + {0xc028, 215}, + {0x8002, 225}, + {0x8009, 225}, + {0x8017, 225}, + {0xc028, 225}, + }, + /* 183 */ + { + {0x8003, 171}, + {0x8006, 171}, + {0x800a, 171}, + {0x800f, 171}, + {0x8018, 171}, + {0x801f, 171}, + {0x8029, 171}, + {0xc038, 171}, + {0x8003, 206}, + {0x8006, 206}, + {0x800a, 206}, + {0x800f, 206}, + {0x8018, 206}, + {0x801f, 206}, + {0x8029, 206}, + {0xc038, 206}, + }, + /* 184 */ + { + {0x8003, 215}, + {0x8006, 215}, + {0x800a, 215}, + {0x800f, 215}, + {0x8018, 215}, + {0x801f, 215}, + {0x8029, 215}, + {0xc038, 215}, + {0x8003, 225}, + {0x8006, 225}, + {0x800a, 225}, + {0x800f, 225}, + {0x8018, 225}, + {0x801f, 225}, + {0x8029, 225}, + {0xc038, 225}, + }, + /* 185 */ + { + {0x8002, 236}, + {0x8009, 236}, + {0x8017, 236}, + {0xc028, 236}, + {0x8002, 237}, + {0x8009, 237}, + {0x8017, 237}, + {0xc028, 237}, + {0x8001, 199}, + {0xc016, 199}, + {0x8001, 207}, + {0xc016, 207}, + {0x8001, 234}, + {0xc016, 234}, + {0x8001, 235}, + {0xc016, 235}, + }, + /* 186 */ + { + {0x8003, 236}, + {0x8006, 236}, + {0x800a, 236}, + {0x800f, 236}, + {0x8018, 236}, + {0x801f, 236}, + {0x8029, 236}, + {0xc038, 236}, + {0x8003, 237}, + {0x8006, 237}, + {0x800a, 237}, + {0x800f, 237}, + {0x8018, 237}, + {0x801f, 237}, + {0x8029, 237}, + {0xc038, 237}, + }, + /* 187 */ + { + {0x8002, 199}, + {0x8009, 199}, + {0x8017, 199}, + {0xc028, 199}, + {0x8002, 207}, + {0x8009, 207}, + {0x8017, 207}, + {0xc028, 207}, + {0x8002, 234}, + {0x8009, 234}, + {0x8017, 234}, + {0xc028, 234}, + {0x8002, 235}, + {0x8009, 235}, + {0x8017, 235}, + {0xc028, 235}, + }, + /* 188 */ + { + {0x8003, 199}, + {0x8006, 199}, + {0x800a, 199}, + {0x800f, 199}, + {0x8018, 199}, + {0x801f, 199}, + {0x8029, 199}, + {0xc038, 199}, + {0x8003, 207}, + {0x8006, 207}, + {0x800a, 207}, + {0x800f, 207}, + {0x8018, 207}, + {0x801f, 207}, + {0x8029, 207}, + {0xc038, 207}, + }, + /* 189 */ + { + {0x8003, 234}, + {0x8006, 234}, + {0x800a, 234}, + {0x800f, 234}, + {0x8018, 234}, + {0x801f, 234}, + {0x8029, 234}, + {0xc038, 234}, + {0x8003, 235}, + {0x8006, 235}, + {0x800a, 235}, + {0x800f, 235}, + {0x8018, 235}, + {0x801f, 235}, + {0x8029, 235}, + {0xc038, 235}, + }, + /* 190 */ + { + {0xc2, 0}, + {0xc3, 0}, + {0xc5, 0}, + {0xc6, 0}, + {0xc9, 0}, + {0xca, 0}, + {0xcc, 0}, + {0xcd, 0}, + {0xd2, 0}, + {0xd5, 0}, + {0xd9, 0}, + {0xdc, 0}, + {0xe1, 0}, + {0xe7, 0}, + {0xef, 0}, + {0xf6, 0}, + }, + /* 191 */ + { + {0xc000, 192}, + {0xc000, 193}, + {0xc000, 200}, + {0xc000, 201}, + {0xc000, 202}, + {0xc000, 205}, + {0xc000, 210}, + {0xc000, 213}, + {0xc000, 218}, + {0xc000, 219}, + {0xc000, 238}, + {0xc000, 240}, + {0xc000, 242}, + {0xc000, 243}, + {0xc000, 255}, + {0xce, 0}, + }, + /* 192 */ + { + {0x8001, 192}, + {0xc016, 192}, + {0x8001, 193}, + {0xc016, 193}, + {0x8001, 200}, + {0xc016, 200}, + {0x8001, 201}, + {0xc016, 201}, + {0x8001, 202}, + {0xc016, 202}, + {0x8001, 205}, + {0xc016, 205}, + {0x8001, 210}, + {0xc016, 210}, + {0x8001, 213}, + {0xc016, 213}, + }, + /* 193 */ + { + {0x8002, 192}, + {0x8009, 192}, + {0x8017, 192}, + {0xc028, 192}, + {0x8002, 193}, + {0x8009, 193}, + {0x8017, 193}, + {0xc028, 193}, + {0x8002, 200}, + {0x8009, 200}, + {0x8017, 200}, + {0xc028, 200}, + {0x8002, 201}, + {0x8009, 201}, + {0x8017, 201}, + {0xc028, 201}, + }, + /* 194 */ + { + {0x8003, 192}, + {0x8006, 192}, + {0x800a, 192}, + {0x800f, 192}, + {0x8018, 192}, + {0x801f, 192}, + {0x8029, 192}, + {0xc038, 192}, + {0x8003, 193}, + {0x8006, 193}, + {0x800a, 193}, + {0x800f, 193}, + {0x8018, 193}, + {0x801f, 193}, + {0x8029, 193}, + {0xc038, 193}, + }, + /* 195 */ + { + {0x8003, 200}, + {0x8006, 200}, + {0x800a, 200}, + {0x800f, 200}, + {0x8018, 200}, + {0x801f, 200}, + {0x8029, 200}, + {0xc038, 200}, + {0x8003, 201}, + {0x8006, 201}, + {0x800a, 201}, + {0x800f, 201}, + {0x8018, 201}, + {0x801f, 201}, + {0x8029, 201}, + {0xc038, 201}, + }, + /* 196 */ + { + {0x8002, 202}, + {0x8009, 202}, + {0x8017, 202}, + {0xc028, 202}, + {0x8002, 205}, + {0x8009, 205}, + {0x8017, 205}, + {0xc028, 205}, + {0x8002, 210}, + {0x8009, 210}, + {0x8017, 210}, + {0xc028, 210}, + {0x8002, 213}, + {0x8009, 213}, + {0x8017, 213}, + {0xc028, 213}, + }, + /* 197 */ + { + {0x8003, 202}, + {0x8006, 202}, + {0x800a, 202}, + {0x800f, 202}, + {0x8018, 202}, + {0x801f, 202}, + {0x8029, 202}, + {0xc038, 202}, + {0x8003, 205}, + {0x8006, 205}, + {0x800a, 205}, + {0x800f, 205}, + {0x8018, 205}, + {0x801f, 205}, + {0x8029, 205}, + {0xc038, 205}, + }, + /* 198 */ + { + {0x8003, 210}, + {0x8006, 210}, + {0x800a, 210}, + {0x800f, 210}, + {0x8018, 210}, + {0x801f, 210}, + {0x8029, 210}, + {0xc038, 210}, + {0x8003, 213}, + {0x8006, 213}, + {0x800a, 213}, + {0x800f, 213}, + {0x8018, 213}, + {0x801f, 213}, + {0x8029, 213}, + {0xc038, 213}, + }, + /* 199 */ + { + {0x8001, 218}, + {0xc016, 218}, + {0x8001, 219}, + {0xc016, 219}, + {0x8001, 238}, + {0xc016, 238}, + {0x8001, 240}, + {0xc016, 240}, + {0x8001, 242}, + {0xc016, 242}, + {0x8001, 243}, + {0xc016, 243}, + {0x8001, 255}, + {0xc016, 255}, + {0xc000, 203}, + {0xc000, 204}, + }, + /* 200 */ + { + {0x8002, 218}, + {0x8009, 218}, + {0x8017, 218}, + {0xc028, 218}, + {0x8002, 219}, + {0x8009, 219}, + {0x8017, 219}, + {0xc028, 219}, + {0x8002, 238}, + {0x8009, 238}, + {0x8017, 238}, + {0xc028, 238}, + {0x8002, 240}, + {0x8009, 240}, + {0x8017, 240}, + {0xc028, 240}, + }, + /* 201 */ + { + {0x8003, 218}, + {0x8006, 218}, + {0x800a, 218}, + {0x800f, 218}, + {0x8018, 218}, + {0x801f, 218}, + {0x8029, 218}, + {0xc038, 218}, + {0x8003, 219}, + {0x8006, 219}, + {0x800a, 219}, + {0x800f, 219}, + {0x8018, 219}, + {0x801f, 219}, + {0x8029, 219}, + {0xc038, 219}, + }, + /* 202 */ + { + {0x8003, 238}, + {0x8006, 238}, + {0x800a, 238}, + {0x800f, 238}, + {0x8018, 238}, + {0x801f, 238}, + {0x8029, 238}, + {0xc038, 238}, + {0x8003, 240}, + {0x8006, 240}, + {0x800a, 240}, + {0x800f, 240}, + {0x8018, 240}, + {0x801f, 240}, + {0x8029, 240}, + {0xc038, 240}, + }, + /* 203 */ + { + {0x8002, 242}, + {0x8009, 242}, + {0x8017, 242}, + {0xc028, 242}, + {0x8002, 243}, + {0x8009, 243}, + {0x8017, 243}, + {0xc028, 243}, + {0x8002, 255}, + {0x8009, 255}, + {0x8017, 255}, + {0xc028, 255}, + {0x8001, 203}, + {0xc016, 203}, + {0x8001, 204}, + {0xc016, 204}, + }, + /* 204 */ + { + {0x8003, 242}, + {0x8006, 242}, + {0x800a, 242}, + {0x800f, 242}, + {0x8018, 242}, + {0x801f, 242}, + {0x8029, 242}, + {0xc038, 242}, + {0x8003, 243}, + {0x8006, 243}, + {0x800a, 243}, + {0x800f, 243}, + {0x8018, 243}, + {0x801f, 243}, + {0x8029, 243}, + {0xc038, 243}, + }, + /* 205 */ + { + {0x8003, 255}, + {0x8006, 255}, + {0x800a, 255}, + {0x800f, 255}, + {0x8018, 255}, + {0x801f, 255}, + {0x8029, 255}, + {0xc038, 255}, + {0x8002, 203}, + {0x8009, 203}, + {0x8017, 203}, + {0xc028, 203}, + {0x8002, 204}, + {0x8009, 204}, + {0x8017, 204}, + {0xc028, 204}, + }, + /* 206 */ + { + {0x8003, 203}, + {0x8006, 203}, + {0x800a, 203}, + {0x800f, 203}, + {0x8018, 203}, + {0x801f, 203}, + {0x8029, 203}, + {0xc038, 203}, + {0x8003, 204}, + {0x8006, 204}, + {0x800a, 204}, + {0x800f, 204}, + {0x8018, 204}, + {0x801f, 204}, + {0x8029, 204}, + {0xc038, 204}, + }, + /* 207 */ + { + {0xd3, 0}, + {0xd4, 0}, + {0xd6, 0}, + {0xd7, 0}, + {0xda, 0}, + {0xdb, 0}, + {0xdd, 0}, + {0xde, 0}, + {0xe2, 0}, + {0xe4, 0}, + {0xe8, 0}, + {0xeb, 0}, + {0xf0, 0}, + {0xf3, 0}, + {0xf7, 0}, + {0xfa, 0}, + }, + /* 208 */ + { + {0xc000, 211}, + {0xc000, 212}, + {0xc000, 214}, + {0xc000, 221}, + {0xc000, 222}, + {0xc000, 223}, + {0xc000, 241}, + {0xc000, 244}, + {0xc000, 245}, + {0xc000, 246}, + {0xc000, 247}, + {0xc000, 248}, + {0xc000, 250}, + {0xc000, 251}, + {0xc000, 252}, + {0xc000, 253}, + }, + /* 209 */ + { + {0x8001, 211}, + {0xc016, 211}, + {0x8001, 212}, + {0xc016, 212}, + {0x8001, 214}, + {0xc016, 214}, + {0x8001, 221}, + {0xc016, 221}, + {0x8001, 222}, + {0xc016, 222}, + {0x8001, 223}, + {0xc016, 223}, + {0x8001, 241}, + {0xc016, 241}, + {0x8001, 244}, + {0xc016, 244}, + }, + /* 210 */ + { + {0x8002, 211}, + {0x8009, 211}, + {0x8017, 211}, + {0xc028, 211}, + {0x8002, 212}, + {0x8009, 212}, + {0x8017, 212}, + {0xc028, 212}, + {0x8002, 214}, + {0x8009, 214}, + {0x8017, 214}, + {0xc028, 214}, + {0x8002, 221}, + {0x8009, 221}, + {0x8017, 221}, + {0xc028, 221}, + }, + /* 211 */ + { + {0x8003, 211}, + {0x8006, 211}, + {0x800a, 211}, + {0x800f, 211}, + {0x8018, 211}, + {0x801f, 211}, + {0x8029, 211}, + {0xc038, 211}, + {0x8003, 212}, + {0x8006, 212}, + {0x800a, 212}, + {0x800f, 212}, + {0x8018, 212}, + {0x801f, 212}, + {0x8029, 212}, + {0xc038, 212}, + }, + /* 212 */ + { + {0x8003, 214}, + {0x8006, 214}, + {0x800a, 214}, + {0x800f, 214}, + {0x8018, 214}, + {0x801f, 214}, + {0x8029, 214}, + {0xc038, 214}, + {0x8003, 221}, + {0x8006, 221}, + {0x800a, 221}, + {0x800f, 221}, + {0x8018, 221}, + {0x801f, 221}, + {0x8029, 221}, + {0xc038, 221}, + }, + /* 213 */ + { + {0x8002, 222}, + {0x8009, 222}, + {0x8017, 222}, + {0xc028, 222}, + {0x8002, 223}, + {0x8009, 223}, + {0x8017, 223}, + {0xc028, 223}, + {0x8002, 241}, + {0x8009, 241}, + {0x8017, 241}, + {0xc028, 241}, + {0x8002, 244}, + {0x8009, 244}, + {0x8017, 244}, + {0xc028, 244}, + }, + /* 214 */ + { + {0x8003, 222}, + {0x8006, 222}, + {0x800a, 222}, + {0x800f, 222}, + {0x8018, 222}, + {0x801f, 222}, + {0x8029, 222}, + {0xc038, 222}, + {0x8003, 223}, + {0x8006, 223}, + {0x800a, 223}, + {0x800f, 223}, + {0x8018, 223}, + {0x801f, 223}, + {0x8029, 223}, + {0xc038, 223}, + }, + /* 215 */ + { + {0x8003, 241}, + {0x8006, 241}, + {0x800a, 241}, + {0x800f, 241}, + {0x8018, 241}, + {0x801f, 241}, + {0x8029, 241}, + {0xc038, 241}, + {0x8003, 244}, + {0x8006, 244}, + {0x800a, 244}, + {0x800f, 244}, + {0x8018, 244}, + {0x801f, 244}, + {0x8029, 244}, + {0xc038, 244}, + }, + /* 216 */ + { + {0x8001, 245}, + {0xc016, 245}, + {0x8001, 246}, + {0xc016, 246}, + {0x8001, 247}, + {0xc016, 247}, + {0x8001, 248}, + {0xc016, 248}, + {0x8001, 250}, + {0xc016, 250}, + {0x8001, 251}, + {0xc016, 251}, + {0x8001, 252}, + {0xc016, 252}, + {0x8001, 253}, + {0xc016, 253}, + }, + /* 217 */ + { + {0x8002, 245}, + {0x8009, 245}, + {0x8017, 245}, + {0xc028, 245}, + {0x8002, 246}, + {0x8009, 246}, + {0x8017, 246}, + {0xc028, 246}, + {0x8002, 247}, + {0x8009, 247}, + {0x8017, 247}, + {0xc028, 247}, + {0x8002, 248}, + {0x8009, 248}, + {0x8017, 248}, + {0xc028, 248}, + }, + /* 218 */ + { + {0x8003, 245}, + {0x8006, 245}, + {0x800a, 245}, + {0x800f, 245}, + {0x8018, 245}, + {0x801f, 245}, + {0x8029, 245}, + {0xc038, 245}, + {0x8003, 246}, + {0x8006, 246}, + {0x800a, 246}, + {0x800f, 246}, + {0x8018, 246}, + {0x801f, 246}, + {0x8029, 246}, + {0xc038, 246}, + }, + /* 219 */ + { + {0x8003, 247}, + {0x8006, 247}, + {0x800a, 247}, + {0x800f, 247}, + {0x8018, 247}, + {0x801f, 247}, + {0x8029, 247}, + {0xc038, 247}, + {0x8003, 248}, + {0x8006, 248}, + {0x800a, 248}, + {0x800f, 248}, + {0x8018, 248}, + {0x801f, 248}, + {0x8029, 248}, + {0xc038, 248}, + }, + /* 220 */ + { + {0x8002, 250}, + {0x8009, 250}, + {0x8017, 250}, + {0xc028, 250}, + {0x8002, 251}, + {0x8009, 251}, + {0x8017, 251}, + {0xc028, 251}, + {0x8002, 252}, + {0x8009, 252}, + {0x8017, 252}, + {0xc028, 252}, + {0x8002, 253}, + {0x8009, 253}, + {0x8017, 253}, + {0xc028, 253}, + }, + /* 221 */ + { + {0x8003, 250}, + {0x8006, 250}, + {0x800a, 250}, + {0x800f, 250}, + {0x8018, 250}, + {0x801f, 250}, + {0x8029, 250}, + {0xc038, 250}, + {0x8003, 251}, + {0x8006, 251}, + {0x800a, 251}, + {0x800f, 251}, + {0x8018, 251}, + {0x801f, 251}, + {0x8029, 251}, + {0xc038, 251}, + }, + /* 222 */ + { + {0x8003, 252}, + {0x8006, 252}, + {0x800a, 252}, + {0x800f, 252}, + {0x8018, 252}, + {0x801f, 252}, + {0x8029, 252}, + {0xc038, 252}, + {0x8003, 253}, + {0x8006, 253}, + {0x800a, 253}, + {0x800f, 253}, + {0x8018, 253}, + {0x801f, 253}, + {0x8029, 253}, + {0xc038, 253}, + }, + /* 223 */ + { + {0xc000, 254}, + {0xe3, 0}, + {0xe5, 0}, + {0xe6, 0}, + {0xe9, 0}, + {0xea, 0}, + {0xec, 0}, + {0xed, 0}, + {0xf1, 0}, + {0xf2, 0}, + {0xf4, 0}, + {0xf5, 0}, + {0xf8, 0}, + {0xf9, 0}, + {0xfb, 0}, + {0xfc, 0}, + }, + /* 224 */ + { + {0x8001, 254}, + {0xc016, 254}, + {0xc000, 2}, + {0xc000, 3}, + {0xc000, 4}, + {0xc000, 5}, + {0xc000, 6}, + {0xc000, 7}, + {0xc000, 8}, + {0xc000, 11}, + {0xc000, 12}, + {0xc000, 14}, + {0xc000, 15}, + {0xc000, 16}, + {0xc000, 17}, + {0xc000, 18}, + }, + /* 225 */ + { + {0x8002, 254}, + {0x8009, 254}, + {0x8017, 254}, + {0xc028, 254}, + {0x8001, 2}, + {0xc016, 2}, + {0x8001, 3}, + {0xc016, 3}, + {0x8001, 4}, + {0xc016, 4}, + {0x8001, 5}, + {0xc016, 5}, + {0x8001, 6}, + {0xc016, 6}, + {0x8001, 7}, + {0xc016, 7}, + }, + /* 226 */ + { + {0x8003, 254}, + {0x8006, 254}, + {0x800a, 254}, + {0x800f, 254}, + {0x8018, 254}, + {0x801f, 254}, + {0x8029, 254}, + {0xc038, 254}, + {0x8002, 2}, + {0x8009, 2}, + {0x8017, 2}, + {0xc028, 2}, + {0x8002, 3}, + {0x8009, 3}, + {0x8017, 3}, + {0xc028, 3}, + }, + /* 227 */ + { + {0x8003, 2}, + {0x8006, 2}, + {0x800a, 2}, + {0x800f, 2}, + {0x8018, 2}, + {0x801f, 2}, + {0x8029, 2}, + {0xc038, 2}, + {0x8003, 3}, + {0x8006, 3}, + {0x800a, 3}, + {0x800f, 3}, + {0x8018, 3}, + {0x801f, 3}, + {0x8029, 3}, + {0xc038, 3}, + }, + /* 228 */ + { + {0x8002, 4}, + {0x8009, 4}, + {0x8017, 4}, + {0xc028, 4}, + {0x8002, 5}, + {0x8009, 5}, + {0x8017, 5}, + {0xc028, 5}, + {0x8002, 6}, + {0x8009, 6}, + {0x8017, 6}, + {0xc028, 6}, + {0x8002, 7}, + {0x8009, 7}, + {0x8017, 7}, + {0xc028, 7}, + }, + /* 229 */ + { + {0x8003, 4}, + {0x8006, 4}, + {0x800a, 4}, + {0x800f, 4}, + {0x8018, 4}, + {0x801f, 4}, + {0x8029, 4}, + {0xc038, 4}, + {0x8003, 5}, + {0x8006, 5}, + {0x800a, 5}, + {0x800f, 5}, + {0x8018, 5}, + {0x801f, 5}, + {0x8029, 5}, + {0xc038, 5}, + }, + /* 230 */ + { + {0x8003, 6}, + {0x8006, 6}, + {0x800a, 6}, + {0x800f, 6}, + {0x8018, 6}, + {0x801f, 6}, + {0x8029, 6}, + {0xc038, 6}, + {0x8003, 7}, + {0x8006, 7}, + {0x800a, 7}, + {0x800f, 7}, + {0x8018, 7}, + {0x801f, 7}, + {0x8029, 7}, + {0xc038, 7}, + }, + /* 231 */ + { + {0x8001, 8}, + {0xc016, 8}, + {0x8001, 11}, + {0xc016, 11}, + {0x8001, 12}, + {0xc016, 12}, + {0x8001, 14}, + {0xc016, 14}, + {0x8001, 15}, + {0xc016, 15}, + {0x8001, 16}, + {0xc016, 16}, + {0x8001, 17}, + {0xc016, 17}, + {0x8001, 18}, + {0xc016, 18}, + }, + /* 232 */ + { + {0x8002, 8}, + {0x8009, 8}, + {0x8017, 8}, + {0xc028, 8}, + {0x8002, 11}, + {0x8009, 11}, + {0x8017, 11}, + {0xc028, 11}, + {0x8002, 12}, + {0x8009, 12}, + {0x8017, 12}, + {0xc028, 12}, + {0x8002, 14}, + {0x8009, 14}, + {0x8017, 14}, + {0xc028, 14}, + }, + /* 233 */ + { + {0x8003, 8}, + {0x8006, 8}, + {0x800a, 8}, + {0x800f, 8}, + {0x8018, 8}, + {0x801f, 8}, + {0x8029, 8}, + {0xc038, 8}, + {0x8003, 11}, + {0x8006, 11}, + {0x800a, 11}, + {0x800f, 11}, + {0x8018, 11}, + {0x801f, 11}, + {0x8029, 11}, + {0xc038, 11}, + }, + /* 234 */ + { + {0x8003, 12}, + {0x8006, 12}, + {0x800a, 12}, + {0x800f, 12}, + {0x8018, 12}, + {0x801f, 12}, + {0x8029, 12}, + {0xc038, 12}, + {0x8003, 14}, + {0x8006, 14}, + {0x800a, 14}, + {0x800f, 14}, + {0x8018, 14}, + {0x801f, 14}, + {0x8029, 14}, + {0xc038, 14}, + }, + /* 235 */ + { + {0x8002, 15}, + {0x8009, 15}, + {0x8017, 15}, + {0xc028, 15}, + {0x8002, 16}, + {0x8009, 16}, + {0x8017, 16}, + {0xc028, 16}, + {0x8002, 17}, + {0x8009, 17}, + {0x8017, 17}, + {0xc028, 17}, + {0x8002, 18}, + {0x8009, 18}, + {0x8017, 18}, + {0xc028, 18}, + }, + /* 236 */ + { + {0x8003, 15}, + {0x8006, 15}, + {0x800a, 15}, + {0x800f, 15}, + {0x8018, 15}, + {0x801f, 15}, + {0x8029, 15}, + {0xc038, 15}, + {0x8003, 16}, + {0x8006, 16}, + {0x800a, 16}, + {0x800f, 16}, + {0x8018, 16}, + {0x801f, 16}, + {0x8029, 16}, + {0xc038, 16}, + }, + /* 237 */ + { + {0x8003, 17}, + {0x8006, 17}, + {0x800a, 17}, + {0x800f, 17}, + {0x8018, 17}, + {0x801f, 17}, + {0x8029, 17}, + {0xc038, 17}, + {0x8003, 18}, + {0x8006, 18}, + {0x800a, 18}, + {0x800f, 18}, + {0x8018, 18}, + {0x801f, 18}, + {0x8029, 18}, + {0xc038, 18}, + }, + /* 238 */ + { + {0xc000, 19}, + {0xc000, 20}, + {0xc000, 21}, + {0xc000, 23}, + {0xc000, 24}, + {0xc000, 25}, + {0xc000, 26}, + {0xc000, 27}, + {0xc000, 28}, + {0xc000, 29}, + {0xc000, 30}, + {0xc000, 31}, + {0xc000, 127}, + {0xc000, 220}, + {0xc000, 249}, + {0xfd, 0}, + }, + /* 239 */ + { + {0x8001, 19}, + {0xc016, 19}, + {0x8001, 20}, + {0xc016, 20}, + {0x8001, 21}, + {0xc016, 21}, + {0x8001, 23}, + {0xc016, 23}, + {0x8001, 24}, + {0xc016, 24}, + {0x8001, 25}, + {0xc016, 25}, + {0x8001, 26}, + {0xc016, 26}, + {0x8001, 27}, + {0xc016, 27}, + }, + /* 240 */ + { + {0x8002, 19}, + {0x8009, 19}, + {0x8017, 19}, + {0xc028, 19}, + {0x8002, 20}, + {0x8009, 20}, + {0x8017, 20}, + {0xc028, 20}, + {0x8002, 21}, + {0x8009, 21}, + {0x8017, 21}, + {0xc028, 21}, + {0x8002, 23}, + {0x8009, 23}, + {0x8017, 23}, + {0xc028, 23}, + }, + /* 241 */ + { + {0x8003, 19}, + {0x8006, 19}, + {0x800a, 19}, + {0x800f, 19}, + {0x8018, 19}, + {0x801f, 19}, + {0x8029, 19}, + {0xc038, 19}, + {0x8003, 20}, + {0x8006, 20}, + {0x800a, 20}, + {0x800f, 20}, + {0x8018, 20}, + {0x801f, 20}, + {0x8029, 20}, + {0xc038, 20}, + }, + /* 242 */ + { + {0x8003, 21}, + {0x8006, 21}, + {0x800a, 21}, + {0x800f, 21}, + {0x8018, 21}, + {0x801f, 21}, + {0x8029, 21}, + {0xc038, 21}, + {0x8003, 23}, + {0x8006, 23}, + {0x800a, 23}, + {0x800f, 23}, + {0x8018, 23}, + {0x801f, 23}, + {0x8029, 23}, + {0xc038, 23}, + }, + /* 243 */ + { + {0x8002, 24}, + {0x8009, 24}, + {0x8017, 24}, + {0xc028, 24}, + {0x8002, 25}, + {0x8009, 25}, + {0x8017, 25}, + {0xc028, 25}, + {0x8002, 26}, + {0x8009, 26}, + {0x8017, 26}, + {0xc028, 26}, + {0x8002, 27}, + {0x8009, 27}, + {0x8017, 27}, + {0xc028, 27}, + }, + /* 244 */ + { + {0x8003, 24}, + {0x8006, 24}, + {0x800a, 24}, + {0x800f, 24}, + {0x8018, 24}, + {0x801f, 24}, + {0x8029, 24}, + {0xc038, 24}, + {0x8003, 25}, + {0x8006, 25}, + {0x800a, 25}, + {0x800f, 25}, + {0x8018, 25}, + {0x801f, 25}, + {0x8029, 25}, + {0xc038, 25}, + }, + /* 245 */ + { + {0x8003, 26}, + {0x8006, 26}, + {0x800a, 26}, + {0x800f, 26}, + {0x8018, 26}, + {0x801f, 26}, + {0x8029, 26}, + {0xc038, 26}, + {0x8003, 27}, + {0x8006, 27}, + {0x800a, 27}, + {0x800f, 27}, + {0x8018, 27}, + {0x801f, 27}, + {0x8029, 27}, + {0xc038, 27}, + }, + /* 246 */ + { + {0x8001, 28}, + {0xc016, 28}, + {0x8001, 29}, + {0xc016, 29}, + {0x8001, 30}, + {0xc016, 30}, + {0x8001, 31}, + {0xc016, 31}, + {0x8001, 127}, + {0xc016, 127}, + {0x8001, 220}, + {0xc016, 220}, + {0x8001, 249}, + {0xc016, 249}, + {0xfe, 0}, + {0xff, 0}, + }, + /* 247 */ + { + {0x8002, 28}, + {0x8009, 28}, + {0x8017, 28}, + {0xc028, 28}, + {0x8002, 29}, + {0x8009, 29}, + {0x8017, 29}, + {0xc028, 29}, + {0x8002, 30}, + {0x8009, 30}, + {0x8017, 30}, + {0xc028, 30}, + {0x8002, 31}, + {0x8009, 31}, + {0x8017, 31}, + {0xc028, 31}, + }, + /* 248 */ + { + {0x8003, 28}, + {0x8006, 28}, + {0x800a, 28}, + {0x800f, 28}, + {0x8018, 28}, + {0x801f, 28}, + {0x8029, 28}, + {0xc038, 28}, + {0x8003, 29}, + {0x8006, 29}, + {0x800a, 29}, + {0x800f, 29}, + {0x8018, 29}, + {0x801f, 29}, + {0x8029, 29}, + {0xc038, 29}, + }, + /* 249 */ + { + {0x8003, 30}, + {0x8006, 30}, + {0x800a, 30}, + {0x800f, 30}, + {0x8018, 30}, + {0x801f, 30}, + {0x8029, 30}, + {0xc038, 30}, + {0x8003, 31}, + {0x8006, 31}, + {0x800a, 31}, + {0x800f, 31}, + {0x8018, 31}, + {0x801f, 31}, + {0x8029, 31}, + {0xc038, 31}, + }, + /* 250 */ + { + {0x8002, 127}, + {0x8009, 127}, + {0x8017, 127}, + {0xc028, 127}, + {0x8002, 220}, + {0x8009, 220}, + {0x8017, 220}, + {0xc028, 220}, + {0x8002, 249}, + {0x8009, 249}, + {0x8017, 249}, + {0xc028, 249}, + {0xc000, 10}, + {0xc000, 13}, + {0xc000, 22}, + {0x100, 0}, + }, + /* 251 */ + { + {0x8003, 127}, + {0x8006, 127}, + {0x800a, 127}, + {0x800f, 127}, + {0x8018, 127}, + {0x801f, 127}, + {0x8029, 127}, + {0xc038, 127}, + {0x8003, 220}, + {0x8006, 220}, + {0x800a, 220}, + {0x800f, 220}, + {0x8018, 220}, + {0x801f, 220}, + {0x8029, 220}, + {0xc038, 220}, + }, + /* 252 */ + { + {0x8003, 249}, + {0x8006, 249}, + {0x800a, 249}, + {0x800f, 249}, + {0x8018, 249}, + {0x801f, 249}, + {0x8029, 249}, + {0xc038, 249}, + {0x8001, 10}, + {0xc016, 10}, + {0x8001, 13}, + {0xc016, 13}, + {0x8001, 22}, + {0xc016, 22}, + {0x100, 0}, + {0x100, 0}, + }, + /* 253 */ + { + {0x8002, 10}, + {0x8009, 10}, + {0x8017, 10}, + {0xc028, 10}, + {0x8002, 13}, + {0x8009, 13}, + {0x8017, 13}, + {0xc028, 13}, + {0x8002, 22}, + {0x8009, 22}, + {0x8017, 22}, + {0xc028, 22}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + }, + /* 254 */ + { + {0x8003, 10}, + {0x8006, 10}, + {0x800a, 10}, + {0x800f, 10}, + {0x8018, 10}, + {0x801f, 10}, + {0x8029, 10}, + {0xc038, 10}, + {0x8003, 13}, + {0x8006, 13}, + {0x800a, 13}, + {0x800f, 13}, + {0x8018, 13}, + {0x801f, 13}, + {0x8029, 13}, + {0xc038, 13}, + }, + /* 255 */ + { + {0x8003, 22}, + {0x8006, 22}, + {0x800a, 22}, + {0x800f, 22}, + {0x8018, 22}, + {0x801f, 22}, + {0x8029, 22}, + {0xc038, 22}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + }, + /* 256 */ + { + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + {0x100, 0}, + }, }; diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_range.c b/deps/ngtcp2/nghttp3/lib/nghttp3_range.c index 0ce71480d72fec..af810a2c5929db 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_range.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_range.c @@ -34,11 +34,13 @@ void nghttp3_range_init(nghttp3_range *r, uint64_t begin, uint64_t end) { nghttp3_range nghttp3_range_intersect(const nghttp3_range *a, const nghttp3_range *b) { nghttp3_range r = {0, 0}; - uint64_t begin = nghttp3_max(a->begin, b->begin); - uint64_t end = nghttp3_min(a->end, b->end); + uint64_t begin = nghttp3_max_uint64(a->begin, b->begin); + uint64_t end = nghttp3_min_uint64(a->end, b->end); + if (begin < end) { nghttp3_range_init(&r, begin, end); } + return r; } diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_range.h b/deps/ngtcp2/nghttp3/lib/nghttp3_range.h index 20dab69aa62db5..e52e1966b870ec 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_range.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_range.h @@ -28,7 +28,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -59,7 +59,7 @@ uint64_t nghttp3_range_len(const nghttp3_range *r); /* * nghttp3_range_eq returns nonzero if |a| equals |b|, such that - * a->begin == b->begin, and a->end == b->end hold. + * a->begin == b->begin and a->end == b->end hold. */ int nghttp3_range_eq(const nghttp3_range *a, const nghttp3_range *b); @@ -78,4 +78,4 @@ void nghttp3_range_cut(nghttp3_range *left, nghttp3_range *right, */ int nghttp3_range_not_after(const nghttp3_range *a, const nghttp3_range *b); -#endif /* NGHTTP3_RANGE_H */ +#endif /* !defined(NGHTTP3_RANGE_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_rcbuf.h b/deps/ngtcp2/nghttp3/lib/nghttp3_rcbuf.h index f589c377bf6ea7..97f83234ab5a8e 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_rcbuf.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_rcbuf.h @@ -28,7 +28,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -78,4 +78,4 @@ int nghttp3_rcbuf_new2(nghttp3_rcbuf **rcbuf_ptr, const uint8_t *src, */ void nghttp3_rcbuf_del(nghttp3_rcbuf *rcbuf); -#endif /* NGHTTP3_RCBUF_H */ +#endif /* !defined(NGHTTP3_RCBUF_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_ringbuf.c b/deps/ngtcp2/nghttp3/lib/nghttp3_ringbuf.c index 38b5460837190b..7d3ab39bf82a7f 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_ringbuf.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_ringbuf.c @@ -29,29 +29,27 @@ #include #ifdef WIN32 # include -#endif +#endif /* defined(WIN32) */ #include "nghttp3_macro.h" -#if defined(_MSC_VER) && _MSC_VER < 1941 && !defined(__clang__) && \ - (defined(_M_ARM) || defined(_M_ARM64)) -unsigned int __popcnt(unsigned int x) { - unsigned int c = 0; - for (; x; ++c) { - x &= x - 1; - } - return c; +static int ispow2(size_t n) { +#if defined(_MSC_VER) && !defined(__clang__) && \ + (defined(_M_ARM) || (defined(_M_ARM64) && _MSC_VER < 1941)) + return n && !(n & (n - 1)); +#elif defined(WIN32) + return 1 == __popcnt((unsigned int)n); +#else /* !((defined(_MSC_VER) && !defined(__clang__) && (defined(_M_ARM) || \ + (defined(_M_ARM64) && _MSC_VER < 1941))) || defined(WIN32)) */ + return 1 == __builtin_popcount((unsigned int)n); +#endif /* !((defined(_MSC_VER) && !defined(__clang__) && (defined(_M_ARM) || \ + (defined(_M_ARM64) && _MSC_VER < 1941))) || defined(WIN32)) */ } -#endif int nghttp3_ringbuf_init(nghttp3_ringbuf *rb, size_t nmemb, size_t size, const nghttp3_mem *mem) { if (nmemb) { -#ifdef WIN32 - assert(1 == __popcnt((unsigned int)nmemb)); -#else - assert(1 == __builtin_popcount((unsigned int)nmemb)); -#endif + assert(ispow2(nmemb)); rb->buf = nghttp3_mem_malloc(mem, nmemb * size); if (rb->buf == NULL) { @@ -80,7 +78,7 @@ void nghttp3_ringbuf_free(nghttp3_ringbuf *rb) { void *nghttp3_ringbuf_push_front(nghttp3_ringbuf *rb) { rb->first = (rb->first - 1) & (rb->nmemb - 1); - rb->len = nghttp3_min(rb->nmemb, rb->len + 1); + rb->len = nghttp3_min_size(rb->nmemb, rb->len + 1); return (void *)&rb->buf[rb->first * rb->size]; } @@ -127,11 +125,7 @@ int nghttp3_ringbuf_reserve(nghttp3_ringbuf *rb, size_t nmemb) { return 0; } -#ifdef WIN32 - assert(1 == __popcnt((unsigned int)nmemb)); -#else - assert(1 == __builtin_popcount((unsigned int)nmemb)); -#endif + assert(ispow2(nmemb)); buf = nghttp3_mem_malloc(rb->mem, nmemb * rb->size); if (buf == NULL) { diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_ringbuf.h b/deps/ngtcp2/nghttp3/lib/nghttp3_ringbuf.h index 8e05ec55b24724..b154290a51d5a5 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_ringbuf.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_ringbuf.h @@ -28,7 +28,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -110,4 +110,4 @@ int nghttp3_ringbuf_full(nghttp3_ringbuf *rb); int nghttp3_ringbuf_reserve(nghttp3_ringbuf *rb, size_t nmemb); -#endif /* NGHTTP3_RINGBUF_H */ +#endif /* !defined(NGHTTP3_RINGBUF_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_str.c b/deps/ngtcp2/nghttp3/lib/nghttp3_str.c index 3782aa72cd6e81..fc131404d13754 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_str.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_str.c @@ -36,70 +36,70 @@ uint8_t *nghttp3_cpymem(uint8_t *dest, const uint8_t *src, size_t n) { /* Generated by gendowncasetbl.py */ static const uint8_t DOWNCASE_TBL[] = { - 0 /* NUL */, 1 /* SOH */, 2 /* STX */, 3 /* ETX */, - 4 /* EOT */, 5 /* ENQ */, 6 /* ACK */, 7 /* BEL */, - 8 /* BS */, 9 /* HT */, 10 /* LF */, 11 /* VT */, - 12 /* FF */, 13 /* CR */, 14 /* SO */, 15 /* SI */, - 16 /* DLE */, 17 /* DC1 */, 18 /* DC2 */, 19 /* DC3 */, - 20 /* DC4 */, 21 /* NAK */, 22 /* SYN */, 23 /* ETB */, - 24 /* CAN */, 25 /* EM */, 26 /* SUB */, 27 /* ESC */, - 28 /* FS */, 29 /* GS */, 30 /* RS */, 31 /* US */, - 32 /* SPC */, 33 /* ! */, 34 /* " */, 35 /* # */, - 36 /* $ */, 37 /* % */, 38 /* & */, 39 /* ' */, - 40 /* ( */, 41 /* ) */, 42 /* * */, 43 /* + */, - 44 /* , */, 45 /* - */, 46 /* . */, 47 /* / */, - 48 /* 0 */, 49 /* 1 */, 50 /* 2 */, 51 /* 3 */, - 52 /* 4 */, 53 /* 5 */, 54 /* 6 */, 55 /* 7 */, - 56 /* 8 */, 57 /* 9 */, 58 /* : */, 59 /* ; */, - 60 /* < */, 61 /* = */, 62 /* > */, 63 /* ? */, - 64 /* @ */, 97 /* A */, 98 /* B */, 99 /* C */, - 100 /* D */, 101 /* E */, 102 /* F */, 103 /* G */, - 104 /* H */, 105 /* I */, 106 /* J */, 107 /* K */, - 108 /* L */, 109 /* M */, 110 /* N */, 111 /* O */, - 112 /* P */, 113 /* Q */, 114 /* R */, 115 /* S */, - 116 /* T */, 117 /* U */, 118 /* V */, 119 /* W */, - 120 /* X */, 121 /* Y */, 122 /* Z */, 91 /* [ */, - 92 /* \ */, 93 /* ] */, 94 /* ^ */, 95 /* _ */, - 96 /* ` */, 97 /* a */, 98 /* b */, 99 /* c */, - 100 /* d */, 101 /* e */, 102 /* f */, 103 /* g */, - 104 /* h */, 105 /* i */, 106 /* j */, 107 /* k */, - 108 /* l */, 109 /* m */, 110 /* n */, 111 /* o */, - 112 /* p */, 113 /* q */, 114 /* r */, 115 /* s */, - 116 /* t */, 117 /* u */, 118 /* v */, 119 /* w */, - 120 /* x */, 121 /* y */, 122 /* z */, 123 /* { */, - 124 /* | */, 125 /* } */, 126 /* ~ */, 127 /* DEL */, - 128 /* 0x80 */, 129 /* 0x81 */, 130 /* 0x82 */, 131 /* 0x83 */, - 132 /* 0x84 */, 133 /* 0x85 */, 134 /* 0x86 */, 135 /* 0x87 */, - 136 /* 0x88 */, 137 /* 0x89 */, 138 /* 0x8a */, 139 /* 0x8b */, - 140 /* 0x8c */, 141 /* 0x8d */, 142 /* 0x8e */, 143 /* 0x8f */, - 144 /* 0x90 */, 145 /* 0x91 */, 146 /* 0x92 */, 147 /* 0x93 */, - 148 /* 0x94 */, 149 /* 0x95 */, 150 /* 0x96 */, 151 /* 0x97 */, - 152 /* 0x98 */, 153 /* 0x99 */, 154 /* 0x9a */, 155 /* 0x9b */, - 156 /* 0x9c */, 157 /* 0x9d */, 158 /* 0x9e */, 159 /* 0x9f */, - 160 /* 0xa0 */, 161 /* 0xa1 */, 162 /* 0xa2 */, 163 /* 0xa3 */, - 164 /* 0xa4 */, 165 /* 0xa5 */, 166 /* 0xa6 */, 167 /* 0xa7 */, - 168 /* 0xa8 */, 169 /* 0xa9 */, 170 /* 0xaa */, 171 /* 0xab */, - 172 /* 0xac */, 173 /* 0xad */, 174 /* 0xae */, 175 /* 0xaf */, - 176 /* 0xb0 */, 177 /* 0xb1 */, 178 /* 0xb2 */, 179 /* 0xb3 */, - 180 /* 0xb4 */, 181 /* 0xb5 */, 182 /* 0xb6 */, 183 /* 0xb7 */, - 184 /* 0xb8 */, 185 /* 0xb9 */, 186 /* 0xba */, 187 /* 0xbb */, - 188 /* 0xbc */, 189 /* 0xbd */, 190 /* 0xbe */, 191 /* 0xbf */, - 192 /* 0xc0 */, 193 /* 0xc1 */, 194 /* 0xc2 */, 195 /* 0xc3 */, - 196 /* 0xc4 */, 197 /* 0xc5 */, 198 /* 0xc6 */, 199 /* 0xc7 */, - 200 /* 0xc8 */, 201 /* 0xc9 */, 202 /* 0xca */, 203 /* 0xcb */, - 204 /* 0xcc */, 205 /* 0xcd */, 206 /* 0xce */, 207 /* 0xcf */, - 208 /* 0xd0 */, 209 /* 0xd1 */, 210 /* 0xd2 */, 211 /* 0xd3 */, - 212 /* 0xd4 */, 213 /* 0xd5 */, 214 /* 0xd6 */, 215 /* 0xd7 */, - 216 /* 0xd8 */, 217 /* 0xd9 */, 218 /* 0xda */, 219 /* 0xdb */, - 220 /* 0xdc */, 221 /* 0xdd */, 222 /* 0xde */, 223 /* 0xdf */, - 224 /* 0xe0 */, 225 /* 0xe1 */, 226 /* 0xe2 */, 227 /* 0xe3 */, - 228 /* 0xe4 */, 229 /* 0xe5 */, 230 /* 0xe6 */, 231 /* 0xe7 */, - 232 /* 0xe8 */, 233 /* 0xe9 */, 234 /* 0xea */, 235 /* 0xeb */, - 236 /* 0xec */, 237 /* 0xed */, 238 /* 0xee */, 239 /* 0xef */, - 240 /* 0xf0 */, 241 /* 0xf1 */, 242 /* 0xf2 */, 243 /* 0xf3 */, - 244 /* 0xf4 */, 245 /* 0xf5 */, 246 /* 0xf6 */, 247 /* 0xf7 */, - 248 /* 0xf8 */, 249 /* 0xf9 */, 250 /* 0xfa */, 251 /* 0xfb */, - 252 /* 0xfc */, 253 /* 0xfd */, 254 /* 0xfe */, 255 /* 0xff */, + 0 /* NUL */, 1 /* SOH */, 2 /* STX */, 3 /* ETX */, + 4 /* EOT */, 5 /* ENQ */, 6 /* ACK */, 7 /* BEL */, + 8 /* BS */, 9 /* HT */, 10 /* LF */, 11 /* VT */, + 12 /* FF */, 13 /* CR */, 14 /* SO */, 15 /* SI */, + 16 /* DLE */, 17 /* DC1 */, 18 /* DC2 */, 19 /* DC3 */, + 20 /* DC4 */, 21 /* NAK */, 22 /* SYN */, 23 /* ETB */, + 24 /* CAN */, 25 /* EM */, 26 /* SUB */, 27 /* ESC */, + 28 /* FS */, 29 /* GS */, 30 /* RS */, 31 /* US */, + 32 /* SPC */, 33 /* ! */, 34 /* " */, 35 /* # */, + 36 /* $ */, 37 /* % */, 38 /* & */, 39 /* ' */, + 40 /* ( */, 41 /* ) */, 42 /* * */, 43 /* + */, + 44 /* , */, 45 /* - */, 46 /* . */, 47 /* / */, + 48 /* 0 */, 49 /* 1 */, 50 /* 2 */, 51 /* 3 */, + 52 /* 4 */, 53 /* 5 */, 54 /* 6 */, 55 /* 7 */, + 56 /* 8 */, 57 /* 9 */, 58 /* : */, 59 /* ; */, + 60 /* < */, 61 /* = */, 62 /* > */, 63 /* ? */, + 64 /* @ */, 97 /* A */, 98 /* B */, 99 /* C */, + 100 /* D */, 101 /* E */, 102 /* F */, 103 /* G */, + 104 /* H */, 105 /* I */, 106 /* J */, 107 /* K */, + 108 /* L */, 109 /* M */, 110 /* N */, 111 /* O */, + 112 /* P */, 113 /* Q */, 114 /* R */, 115 /* S */, + 116 /* T */, 117 /* U */, 118 /* V */, 119 /* W */, + 120 /* X */, 121 /* Y */, 122 /* Z */, 91 /* [ */, + 92 /* \ */, 93 /* ] */, 94 /* ^ */, 95 /* _ */, + 96 /* ` */, 97 /* a */, 98 /* b */, 99 /* c */, + 100 /* d */, 101 /* e */, 102 /* f */, 103 /* g */, + 104 /* h */, 105 /* i */, 106 /* j */, 107 /* k */, + 108 /* l */, 109 /* m */, 110 /* n */, 111 /* o */, + 112 /* p */, 113 /* q */, 114 /* r */, 115 /* s */, + 116 /* t */, 117 /* u */, 118 /* v */, 119 /* w */, + 120 /* x */, 121 /* y */, 122 /* z */, 123 /* { */, + 124 /* | */, 125 /* } */, 126 /* ~ */, 127 /* DEL */, + 128 /* 0x80 */, 129 /* 0x81 */, 130 /* 0x82 */, 131 /* 0x83 */, + 132 /* 0x84 */, 133 /* 0x85 */, 134 /* 0x86 */, 135 /* 0x87 */, + 136 /* 0x88 */, 137 /* 0x89 */, 138 /* 0x8a */, 139 /* 0x8b */, + 140 /* 0x8c */, 141 /* 0x8d */, 142 /* 0x8e */, 143 /* 0x8f */, + 144 /* 0x90 */, 145 /* 0x91 */, 146 /* 0x92 */, 147 /* 0x93 */, + 148 /* 0x94 */, 149 /* 0x95 */, 150 /* 0x96 */, 151 /* 0x97 */, + 152 /* 0x98 */, 153 /* 0x99 */, 154 /* 0x9a */, 155 /* 0x9b */, + 156 /* 0x9c */, 157 /* 0x9d */, 158 /* 0x9e */, 159 /* 0x9f */, + 160 /* 0xa0 */, 161 /* 0xa1 */, 162 /* 0xa2 */, 163 /* 0xa3 */, + 164 /* 0xa4 */, 165 /* 0xa5 */, 166 /* 0xa6 */, 167 /* 0xa7 */, + 168 /* 0xa8 */, 169 /* 0xa9 */, 170 /* 0xaa */, 171 /* 0xab */, + 172 /* 0xac */, 173 /* 0xad */, 174 /* 0xae */, 175 /* 0xaf */, + 176 /* 0xb0 */, 177 /* 0xb1 */, 178 /* 0xb2 */, 179 /* 0xb3 */, + 180 /* 0xb4 */, 181 /* 0xb5 */, 182 /* 0xb6 */, 183 /* 0xb7 */, + 184 /* 0xb8 */, 185 /* 0xb9 */, 186 /* 0xba */, 187 /* 0xbb */, + 188 /* 0xbc */, 189 /* 0xbd */, 190 /* 0xbe */, 191 /* 0xbf */, + 192 /* 0xc0 */, 193 /* 0xc1 */, 194 /* 0xc2 */, 195 /* 0xc3 */, + 196 /* 0xc4 */, 197 /* 0xc5 */, 198 /* 0xc6 */, 199 /* 0xc7 */, + 200 /* 0xc8 */, 201 /* 0xc9 */, 202 /* 0xca */, 203 /* 0xcb */, + 204 /* 0xcc */, 205 /* 0xcd */, 206 /* 0xce */, 207 /* 0xcf */, + 208 /* 0xd0 */, 209 /* 0xd1 */, 210 /* 0xd2 */, 211 /* 0xd3 */, + 212 /* 0xd4 */, 213 /* 0xd5 */, 214 /* 0xd6 */, 215 /* 0xd7 */, + 216 /* 0xd8 */, 217 /* 0xd9 */, 218 /* 0xda */, 219 /* 0xdb */, + 220 /* 0xdc */, 221 /* 0xdd */, 222 /* 0xde */, 223 /* 0xdf */, + 224 /* 0xe0 */, 225 /* 0xe1 */, 226 /* 0xe2 */, 227 /* 0xe3 */, + 228 /* 0xe4 */, 229 /* 0xe5 */, 230 /* 0xe6 */, 231 /* 0xe7 */, + 232 /* 0xe8 */, 233 /* 0xe9 */, 234 /* 0xea */, 235 /* 0xeb */, + 236 /* 0xec */, 237 /* 0xed */, 238 /* 0xee */, 239 /* 0xef */, + 240 /* 0xf0 */, 241 /* 0xf1 */, 242 /* 0xf2 */, 243 /* 0xf3 */, + 244 /* 0xf4 */, 245 /* 0xf5 */, 246 /* 0xf6 */, 247 /* 0xf7 */, + 248 /* 0xf8 */, 249 /* 0xf9 */, 250 /* 0xfa */, 251 /* 0xfb */, + 252 /* 0xfc */, 253 /* 0xfd */, 254 /* 0xfe */, 255 /* 0xff */, }; void nghttp3_downcase(uint8_t *s, size_t len) { diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_str.h b/deps/ngtcp2/nghttp3/lib/nghttp3_str.h index 19c1d2c71b559b..280749a3a9a3d9 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_str.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_str.h @@ -29,7 +29,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -37,4 +37,4 @@ uint8_t *nghttp3_cpymem(uint8_t *dest, const uint8_t *src, size_t n); void nghttp3_downcase(uint8_t *s, size_t len); -#endif /* NGHTTP3_STR_H */ +#endif /* !defined(NGHTTP3_STR_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_stream.c b/deps/ngtcp2/nghttp3/lib/nghttp3_stream.c index 6188a141dd123b..328cddd488fd6f 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_stream.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_stream.c @@ -73,7 +73,6 @@ int nghttp3_stream_new(nghttp3_stream **pstream, int64_t stream_id, stream->qpack_blocked_pe.index = NGHTTP3_PQ_BAD_INDEX; stream->mem = mem; - stream->tx.offset = 0; stream->rx.http.status_code = -1; stream->rx.http.content_length = -1; stream->rx.http.pri.urgency = NGHTTP3_DEFAULT_URGENCY; @@ -180,48 +179,44 @@ void nghttp3_stream_read_state_reset(nghttp3_stream_read_state *rstate) { } nghttp3_ssize nghttp3_read_varint(nghttp3_varint_read_state *rvint, - const uint8_t *src, size_t srclen, int fin) { - size_t nread = 0; - size_t n; - size_t i; + const uint8_t *begin, const uint8_t *end, + int fin) { + const uint8_t *orig_begin = begin; + size_t len; - assert(srclen > 0); + assert(begin != end); if (rvint->left == 0) { assert(rvint->acc == 0); - rvint->left = nghttp3_get_varintlen(src); - if (rvint->left <= srclen) { - rvint->acc = nghttp3_get_varint(&nread, src); - rvint->left = 0; - return (nghttp3_ssize)nread; + len = nghttp3_get_varintlen(begin); + if (len <= (size_t)(end - begin)) { + nghttp3_get_varint(&rvint->acc, begin); + return (nghttp3_ssize)len; } if (fin) { return NGHTTP3_ERR_INVALID_ARGUMENT; } - rvint->acc = nghttp3_get_varint_fb(src); - nread = 1; - ++src; - --srclen; - --rvint->left; + rvint->acc = nghttp3_get_varint_fb(begin++); + rvint->left = len - 1; } - n = nghttp3_min(rvint->left, srclen); + len = nghttp3_min_size(rvint->left, (size_t)(end - begin)); + end = begin + len; - for (i = 0; i < n; ++i) { - rvint->acc = (rvint->acc << 8) + src[i]; + for (; begin != end;) { + rvint->acc = (rvint->acc << 8) + *begin++; } - rvint->left -= n; - nread += n; + rvint->left -= len; if (fin && rvint->left) { return NGHTTP3_ERR_INVALID_ARGUMENT; } - return (nghttp3_ssize)nread; + return (nghttp3_ssize)(begin - orig_begin); } int nghttp3_stream_frq_add(nghttp3_stream *stream, @@ -231,7 +226,8 @@ int nghttp3_stream_frq_add(nghttp3_stream *stream, int rv; if (nghttp3_ringbuf_full(frq)) { - size_t nlen = nghttp3_max(NGHTTP3_MIN_RBLEN, nghttp3_ringbuf_len(frq) * 2); + size_t nlen = + nghttp3_max_size(NGHTTP3_MIN_RBLEN, nghttp3_ringbuf_len(frq) * 2); rv = nghttp3_ringbuf_reserve(frq, nlen); if (rv != 0) { return rv; @@ -444,8 +440,8 @@ int nghttp3_stream_write_headers(nghttp3_stream *stream, assert(conn); return nghttp3_stream_write_header_block( - stream, &conn->qenc, conn->tx.qenc, &conn->tx.qpack.rbuf, - &conn->tx.qpack.ebuf, NGHTTP3_FRAME_HEADERS, fr->nva, fr->nvlen); + stream, &conn->qenc, conn->tx.qenc, &conn->tx.qpack.rbuf, + &conn->tx.qpack.ebuf, NGHTTP3_FRAME_HEADERS, fr->nva, fr->nvlen); } int nghttp3_stream_write_header_block(nghttp3_stream *stream, @@ -738,7 +734,7 @@ int nghttp3_stream_outq_add(nghttp3_stream *stream, } if (nghttp3_ringbuf_full(outq)) { - size_t nlen = nghttp3_max(NGHTTP3_MIN_RBLEN, len * 2); + size_t nlen = nghttp3_max_size(NGHTTP3_MIN_RBLEN, len * 2); rv = nghttp3_ringbuf_reserve(outq, nlen); if (rv != 0) { return rv; @@ -770,8 +766,8 @@ int nghttp3_stream_ensure_chunk(nghttp3_stream *stream, size_t need) { ; if (n == NGHTTP3_STREAM_MIN_CHUNK_SIZE) { - p = (uint8_t *)nghttp3_objalloc_chunk_len_get(stream->out_chunk_objalloc, - n); + p = + (uint8_t *)nghttp3_objalloc_chunk_len_get(stream->out_chunk_objalloc, n); } else { p = nghttp3_mem_malloc(stream->mem, n); } @@ -780,7 +776,7 @@ int nghttp3_stream_ensure_chunk(nghttp3_stream *stream, size_t need) { } if (nghttp3_ringbuf_full(chunks)) { - size_t nlen = nghttp3_max(NGHTTP3_MIN_RBLEN, len * 2); + size_t nlen = nghttp3_max_size(NGHTTP3_MIN_RBLEN, len * 2); rv = nghttp3_ringbuf_reserve(chunks, nlen); if (rv != 0) { return rv; @@ -928,9 +924,8 @@ static void stream_pop_outq_entry(nghttp3_stream *stream, nghttp3_ringbuf_pop_front(&stream->outq); } -int nghttp3_stream_add_ack_offset(nghttp3_stream *stream, uint64_t n) { +int nghttp3_stream_update_ack_offset(nghttp3_stream *stream, uint64_t offset) { nghttp3_ringbuf *outq = &stream->outq; - uint64_t offset = stream->ack_offset + n; size_t buflen; size_t npopped = 0; uint64_t nack; @@ -941,24 +936,25 @@ int nghttp3_stream_add_ack_offset(nghttp3_stream *stream, uint64_t n) { tbuf = nghttp3_ringbuf_get(outq, 0); buflen = nghttp3_buf_len(&tbuf->buf); - if (tbuf->type == NGHTTP3_BUF_TYPE_ALIEN) { - nack = nghttp3_min(offset, (uint64_t)buflen) - stream->ack_done; - if (stream->callbacks.acked_data) { - rv = stream->callbacks.acked_data(stream, stream->node.id, nack, - stream->user_data); - if (rv != 0) { - return NGHTTP3_ERR_CALLBACK_FAILURE; - } + /* For NGHTTP3_BUF_TYPE_ALIEN, we never add 0 length buffer. */ + if (tbuf->type == NGHTTP3_BUF_TYPE_ALIEN && stream->ack_offset < offset && + stream->callbacks.acked_data) { + nack = nghttp3_min_uint64(offset, stream->ack_base + buflen) - + stream->ack_offset; + + rv = stream->callbacks.acked_data(stream, stream->node.id, nack, + stream->user_data); + if (rv != 0) { + return NGHTTP3_ERR_CALLBACK_FAILURE; } - stream->ack_done += nack; } - if (offset >= buflen) { + if (offset >= stream->ack_base + buflen) { stream_pop_outq_entry(stream, tbuf); - offset -= buflen; + stream->ack_base += buflen; + stream->ack_offset = stream->ack_base; ++npopped; - stream->ack_done = 0; if (stream->outq_idx + 1 == npopped) { stream->outq_offset = 0; @@ -996,7 +992,7 @@ int nghttp3_stream_buffer_data(nghttp3_stream *stream, const uint8_t *data, if (len) { buf = nghttp3_ringbuf_get(inq, len - 1); bufleft = nghttp3_buf_left(buf); - nwrite = nghttp3_min(datalen, bufleft); + nwrite = nghttp3_min_size(datalen, bufleft); buf->last = nghttp3_cpymem(buf->last, data, nwrite); data += nwrite; datalen -= nwrite; @@ -1005,7 +1001,7 @@ int nghttp3_stream_buffer_data(nghttp3_stream *stream, const uint8_t *data, for (; datalen;) { if (nghttp3_ringbuf_full(inq)) { size_t nlen = - nghttp3_max(NGHTTP3_MIN_RBLEN, nghttp3_ringbuf_len(inq) * 2); + nghttp3_max_size(NGHTTP3_MIN_RBLEN, nghttp3_ringbuf_len(inq) * 2); rv = nghttp3_ringbuf_reserve(inq, nlen); if (rv != 0) { return rv; @@ -1020,7 +1016,7 @@ int nghttp3_stream_buffer_data(nghttp3_stream *stream, const uint8_t *data, buf = nghttp3_ringbuf_push_back(inq); nghttp3_buf_wrap_init(buf, rawbuf, 16384); bufleft = nghttp3_buf_left(buf); - nwrite = nghttp3_min(datalen, bufleft); + nwrite = nghttp3_min_size(datalen, bufleft); buf->last = nghttp3_cpymem(buf->last, data, nwrite); data += nwrite; datalen -= nwrite; diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_stream.h b/deps/ngtcp2/nghttp3/lib/nghttp3_stream.h index 03a57697b232b3..7d296febf9135f 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_stream.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_stream.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -88,8 +88,8 @@ typedef struct nghttp3_varint_read_state { typedef struct nghttp3_stream_read_state { nghttp3_varint_read_state rvint; nghttp3_frame fr; - int state; int64_t left; + int state; } nghttp3_stream_read_state; /* NGHTTP3_STREAM_FLAG_NONE indicates that no flag is set. */ @@ -186,9 +186,6 @@ typedef struct nghttp3_stream_callbacks { } nghttp3_stream_callbacks; typedef struct nghttp3_http_state { - /* status_code is HTTP status code received. This field is used - if connection is initialized as client. */ - int32_t status_code; /* content_length is the value of received content-length header field. */ int64_t content_length; @@ -196,6 +193,9 @@ typedef struct nghttp3_http_state { far. */ int64_t recv_content_length; nghttp3_pri pri; + /* status_code is HTTP status code received. This field is used + if connection is initialized as client. */ + int32_t status_code; uint32_t flags; } nghttp3_http_state; @@ -226,13 +226,12 @@ struct nghttp3_stream { /* outq_offset is write offset relative to the element at outq_idx in outq. */ uint64_t outq_offset; - /* ack_offset is offset acknowledged by peer relative to the first - element in outq. */ + /* ack_base is the number of bytes acknowledged by a remote + endpoint where the first element in outq is positioned at. */ + uint64_t ack_base; + /* ack_offset is the number of bytes acknowledged by a remote + endpoint so far. */ uint64_t ack_offset; - /* ack_done is the number of bytes notified to an application that - they are acknowledged inside the first outq element if it is of - type NGHTTP3_BUF_TYPE_ALIEN. */ - uint64_t ack_done; uint64_t unscheduled_nwrite; nghttp3_stream_type type; nghttp3_stream_read_state rstate; @@ -283,7 +282,8 @@ void nghttp3_varint_read_state_reset(nghttp3_varint_read_state *rvint); void nghttp3_stream_read_state_reset(nghttp3_stream_read_state *rstate); nghttp3_ssize nghttp3_read_varint(nghttp3_varint_read_state *rvint, - const uint8_t *src, size_t srclen, int fin); + const uint8_t *begin, const uint8_t *end, + int fin); int nghttp3_stream_frq_add(nghttp3_stream *stream, const nghttp3_frame_entry *frent); @@ -336,7 +336,11 @@ void nghttp3_stream_add_outq_offset(nghttp3_stream *stream, size_t n); */ int nghttp3_stream_outq_write_done(nghttp3_stream *stream); -int nghttp3_stream_add_ack_offset(nghttp3_stream *stream, uint64_t n); +/* + * nghttp2_stream_update_ack_offset updates the last acknowledged + * offset to |offset|. + */ +int nghttp3_stream_update_ack_offset(nghttp3_stream *stream, uint64_t offset); /* * nghttp3_stream_is_active returns nonzero if |stream| is active. In @@ -390,4 +394,4 @@ int nghttp3_client_stream_uni(int64_t stream_id); */ int nghttp3_server_stream_uni(int64_t stream_id); -#endif /* NGHTTP3_STREAM_H */ +#endif /* !defined(NGHTTP3_STREAM_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_tnode.c b/deps/ngtcp2/nghttp3/lib/nghttp3_tnode.c index d9c5e598699512..eae847e7a9236a 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_tnode.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_tnode.c @@ -73,8 +73,8 @@ int nghttp3_tnode_schedule(nghttp3_tnode *tnode, nghttp3_pq *pq, if (tnode->pe.index == NGHTTP3_PQ_BAD_INDEX) { tnode->cycle = - pq_get_first_cycle(pq) + - ((nwrite == 0 || !tnode->pri.inc) ? 0 : nghttp3_max(1, penalty)); + pq_get_first_cycle(pq) + + ((nwrite == 0 || !tnode->pri.inc) ? 0 : nghttp3_max_uint64(1, penalty)); } else if (nwrite > 0) { if (!tnode->pri.inc || nghttp3_pq_size(pq) == 1) { return 0; @@ -82,7 +82,7 @@ int nghttp3_tnode_schedule(nghttp3_tnode *tnode, nghttp3_pq *pq, nghttp3_pq_remove(pq, &tnode->pe); tnode->pe.index = NGHTTP3_PQ_BAD_INDEX; - tnode->cycle += nghttp3_max(1, penalty); + tnode->cycle += nghttp3_max_uint64(1, penalty); } else { return 0; } diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_tnode.h b/deps/ngtcp2/nghttp3/lib/nghttp3_tnode.h index 1abc1e62519381..c13af52fdc6bc7 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_tnode.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_tnode.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -63,4 +63,4 @@ int nghttp3_tnode_schedule(nghttp3_tnode *tnode, nghttp3_pq *pq, */ int nghttp3_tnode_is_scheduled(nghttp3_tnode *tnode); -#endif /* NGHTTP3_TNODE_H */ +#endif /* !defined(NGHTTP3_TNODE_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_unreachable.c b/deps/ngtcp2/nghttp3/lib/nghttp3_unreachable.c index 6fea89b802b12d..8adeeb4931dc57 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_unreachable.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_unreachable.c @@ -29,11 +29,11 @@ #include #ifdef HAVE_UNISTD_H # include -#endif /* HAVE_UNISTD_H */ +#endif /* defined(HAVE_UNISTD_H) */ #include #ifdef WIN32 # include -#endif /* WIN32 */ +#endif /* defined(WIN32) */ void nghttp3_unreachable_fail(const char *file, int line, const char *func) { char *buf; @@ -62,9 +62,9 @@ void nghttp3_unreachable_fail(const char *file, int line, const char *func) { #ifndef WIN32 while (write(STDERR_FILENO, buf, (size_t)rv) == -1 && errno == EINTR) ; -#else /* WIN32 */ +#else /* defined(WIN32) */ _write(_fileno(stderr), buf, (unsigned int)rv); -#endif /* WIN32 */ +#endif /* defined(WIN32) */ free(buf); diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_unreachable.h b/deps/ngtcp2/nghttp3/lib/nghttp3_unreachable.h index 6360f52d3aa857..c609d7ed72f3cb 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_unreachable.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_unreachable.h @@ -28,26 +28,26 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include #ifdef __FILE_NAME__ # define NGHTTP3_FILE_NAME __FILE_NAME__ -#else /* !__FILE_NAME__ */ +#else /* !defined(__FILE_NAME__) */ # define NGHTTP3_FILE_NAME "(file)" -#endif /* !__FILE_NAME__ */ +#endif /* !defined(__FILE_NAME__) */ #define nghttp3_unreachable() \ nghttp3_unreachable_fail(NGHTTP3_FILE_NAME, __LINE__, __func__) #ifdef _MSC_VER __declspec(noreturn) -#endif /* _MSC_VER */ +#endif /* defined(_MSC_VER) */ void nghttp3_unreachable_fail(const char *file, int line, const char *func) #ifndef _MSC_VER __attribute__((noreturn)) -#endif /* !_MSC_VER */ +#endif /* !defined(_MSC_VER) */ ; -#endif /* NGHTTP3_UNREACHABLE_H */ +#endif /* !defined(NGHTTP3_UNREACHABLE_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_vec.h b/deps/ngtcp2/nghttp3/lib/nghttp3_vec.h index 473d1467310062..f36eabc1052621 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_vec.h +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_vec.h @@ -28,7 +28,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -38,4 +38,4 @@ */ int64_t nghttp3_vec_len_varint(const nghttp3_vec *vec, size_t n); -#endif /* NGHTTP3_VEC_H */ +#endif /* !defined(NGHTTP3_VEC_H) */ diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_version.c b/deps/ngtcp2/nghttp3/lib/nghttp3_version.c index c460cc72835b1d..939821d84eac3d 100644 --- a/deps/ngtcp2/nghttp3/lib/nghttp3_version.c +++ b/deps/ngtcp2/nghttp3/lib/nghttp3_version.c @@ -24,7 +24,7 @@ */ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include diff --git a/deps/ngtcp2/nghttp3/lib/sfparse.c b/deps/ngtcp2/nghttp3/lib/sfparse.c deleted file mode 100644 index efa2850c9d661d..00000000000000 --- a/deps/ngtcp2/nghttp3/lib/sfparse.c +++ /dev/null @@ -1,1146 +0,0 @@ -/* - * sfparse - * - * Copyright (c) 2023 sfparse contributors - * Copyright (c) 2019 nghttp3 contributors - * Copyright (c) 2015 nghttp2 contributors - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ -#include "sfparse.h" - -#include -#include -#include - -#define SF_STATE_DICT 0x08u -#define SF_STATE_LIST 0x10u -#define SF_STATE_ITEM 0x18u - -#define SF_STATE_INNER_LIST 0x04u - -#define SF_STATE_BEFORE 0x00u -#define SF_STATE_BEFORE_PARAMS 0x01u -#define SF_STATE_PARAMS 0x02u -#define SF_STATE_AFTER 0x03u - -#define SF_STATE_OP_MASK 0x03u - -#define SF_SET_STATE_AFTER(NAME) (SF_STATE_##NAME | SF_STATE_AFTER) -#define SF_SET_STATE_BEFORE_PARAMS(NAME) \ - (SF_STATE_##NAME | SF_STATE_BEFORE_PARAMS) -#define SF_SET_STATE_INNER_LIST_BEFORE(NAME) \ - (SF_STATE_##NAME | SF_STATE_INNER_LIST | SF_STATE_BEFORE) - -#define SF_STATE_DICT_AFTER SF_SET_STATE_AFTER(DICT) -#define SF_STATE_DICT_BEFORE_PARAMS SF_SET_STATE_BEFORE_PARAMS(DICT) -#define SF_STATE_DICT_INNER_LIST_BEFORE SF_SET_STATE_INNER_LIST_BEFORE(DICT) - -#define SF_STATE_LIST_AFTER SF_SET_STATE_AFTER(LIST) -#define SF_STATE_LIST_BEFORE_PARAMS SF_SET_STATE_BEFORE_PARAMS(LIST) -#define SF_STATE_LIST_INNER_LIST_BEFORE SF_SET_STATE_INNER_LIST_BEFORE(LIST) - -#define SF_STATE_ITEM_AFTER SF_SET_STATE_AFTER(ITEM) -#define SF_STATE_ITEM_BEFORE_PARAMS SF_SET_STATE_BEFORE_PARAMS(ITEM) -#define SF_STATE_ITEM_INNER_LIST_BEFORE SF_SET_STATE_INNER_LIST_BEFORE(ITEM) - -#define SF_STATE_INITIAL 0x00u - -#define DIGIT_CASES \ - case '0': \ - case '1': \ - case '2': \ - case '3': \ - case '4': \ - case '5': \ - case '6': \ - case '7': \ - case '8': \ - case '9' - -#define LCALPHA_CASES \ - case 'a': \ - case 'b': \ - case 'c': \ - case 'd': \ - case 'e': \ - case 'f': \ - case 'g': \ - case 'h': \ - case 'i': \ - case 'j': \ - case 'k': \ - case 'l': \ - case 'm': \ - case 'n': \ - case 'o': \ - case 'p': \ - case 'q': \ - case 'r': \ - case 's': \ - case 't': \ - case 'u': \ - case 'v': \ - case 'w': \ - case 'x': \ - case 'y': \ - case 'z' - -#define UCALPHA_CASES \ - case 'A': \ - case 'B': \ - case 'C': \ - case 'D': \ - case 'E': \ - case 'F': \ - case 'G': \ - case 'H': \ - case 'I': \ - case 'J': \ - case 'K': \ - case 'L': \ - case 'M': \ - case 'N': \ - case 'O': \ - case 'P': \ - case 'Q': \ - case 'R': \ - case 'S': \ - case 'T': \ - case 'U': \ - case 'V': \ - case 'W': \ - case 'X': \ - case 'Y': \ - case 'Z' - -#define ALPHA_CASES \ - UCALPHA_CASES: \ - LCALPHA_CASES - -#define X20_21_CASES \ - case ' ': \ - case '!' - -#define X23_5B_CASES \ - case '#': \ - case '$': \ - case '%': \ - case '&': \ - case '\'': \ - case '(': \ - case ')': \ - case '*': \ - case '+': \ - case ',': \ - case '-': \ - case '.': \ - case '/': \ - DIGIT_CASES: \ - case ':': \ - case ';': \ - case '<': \ - case '=': \ - case '>': \ - case '?': \ - case '@': \ - UCALPHA_CASES: \ - case '[' - -#define X5D_7E_CASES \ - case ']': \ - case '^': \ - case '_': \ - case '`': \ - LCALPHA_CASES: \ - case '{': \ - case '|': \ - case '}': \ - case '~' - -static int is_ws(uint8_t c) { - switch (c) { - case ' ': - case '\t': - return 1; - default: - return 0; - } -} - -static int parser_eof(sf_parser *sfp) { return sfp->pos == sfp->end; } - -static void parser_discard_ows(sf_parser *sfp) { - for (; !parser_eof(sfp) && is_ws(*sfp->pos); ++sfp->pos) - ; -} - -static void parser_discard_sp(sf_parser *sfp) { - for (; !parser_eof(sfp) && *sfp->pos == ' '; ++sfp->pos) - ; -} - -static void parser_set_op_state(sf_parser *sfp, uint32_t op) { - sfp->state &= ~SF_STATE_OP_MASK; - sfp->state |= op; -} - -static void parser_unset_inner_list_state(sf_parser *sfp) { - sfp->state &= ~SF_STATE_INNER_LIST; -} - -static int parser_key(sf_parser *sfp, sf_vec *dest) { - const uint8_t *base; - - switch (*sfp->pos) { - case '*': - LCALPHA_CASES: - break; - default: - return SF_ERR_PARSE_ERROR; - } - - base = sfp->pos++; - - for (; !parser_eof(sfp); ++sfp->pos) { - switch (*sfp->pos) { - case '_': - case '-': - case '.': - case '*': - DIGIT_CASES: - LCALPHA_CASES: - continue; - } - - break; - } - - if (dest) { - dest->base = (uint8_t *)base; - dest->len = (size_t)(sfp->pos - dest->base); - } - - return 0; -} - -static int parser_number(sf_parser *sfp, sf_value *dest) { - int sign = 1; - int64_t value = 0; - size_t len = 0; - size_t fpos = 0; - - if (*sfp->pos == '-') { - ++sfp->pos; - if (parser_eof(sfp)) { - return SF_ERR_PARSE_ERROR; - } - - sign = -1; - } - - assert(!parser_eof(sfp)); - - for (; !parser_eof(sfp); ++sfp->pos) { - switch (*sfp->pos) { - DIGIT_CASES: - if (++len > 15) { - return SF_ERR_PARSE_ERROR; - } - - value *= 10; - value += *sfp->pos - '0'; - - continue; - } - - break; - } - - if (len == 0) { - return SF_ERR_PARSE_ERROR; - } - - if (parser_eof(sfp) || *sfp->pos != '.') { - if (dest) { - dest->type = SF_TYPE_INTEGER; - dest->flags = SF_VALUE_FLAG_NONE; - dest->integer = value * sign; - } - - return 0; - } - - /* decimal */ - - if (len > 12) { - return SF_ERR_PARSE_ERROR; - } - - fpos = len; - - ++sfp->pos; - - for (; !parser_eof(sfp); ++sfp->pos) { - switch (*sfp->pos) { - DIGIT_CASES: - if (++len > 15) { - return SF_ERR_PARSE_ERROR; - } - - value *= 10; - value += *sfp->pos - '0'; - - continue; - } - - break; - } - - if (fpos == len || len - fpos > 3) { - return SF_ERR_PARSE_ERROR; - } - - if (dest) { - dest->type = SF_TYPE_DECIMAL; - dest->flags = SF_VALUE_FLAG_NONE; - dest->decimal.numer = value * sign; - - switch (len - fpos) { - case 1: - dest->decimal.denom = 10; - - break; - case 2: - dest->decimal.denom = 100; - - break; - case 3: - dest->decimal.denom = 1000; - - break; - } - } - - return 0; -} - -static int parser_date(sf_parser *sfp, sf_value *dest) { - int rv; - sf_value val; - - /* The first byte has already been validated by the caller. */ - assert('@' == *sfp->pos); - - ++sfp->pos; - - if (parser_eof(sfp)) { - return SF_ERR_PARSE_ERROR; - } - - rv = parser_number(sfp, &val); - if (rv != 0) { - return rv; - } - - if (val.type != SF_TYPE_INTEGER) { - return SF_ERR_PARSE_ERROR; - } - - if (dest) { - *dest = val; - dest->type = SF_TYPE_DATE; - } - - return 0; -} - -static int parser_string(sf_parser *sfp, sf_value *dest) { - const uint8_t *base; - uint32_t flags = SF_VALUE_FLAG_NONE; - - /* The first byte has already been validated by the caller. */ - assert('"' == *sfp->pos); - - base = ++sfp->pos; - - for (; !parser_eof(sfp); ++sfp->pos) { - switch (*sfp->pos) { - X20_21_CASES: - X23_5B_CASES: - X5D_7E_CASES: - break; - case '\\': - ++sfp->pos; - if (parser_eof(sfp)) { - return SF_ERR_PARSE_ERROR; - } - - switch (*sfp->pos) { - case '"': - case '\\': - flags = SF_VALUE_FLAG_ESCAPED_STRING; - - break; - default: - return SF_ERR_PARSE_ERROR; - } - - break; - case '"': - if (dest) { - dest->type = SF_TYPE_STRING; - dest->flags = flags; - dest->vec.len = (size_t)(sfp->pos - base); - dest->vec.base = dest->vec.len == 0 ? NULL : (uint8_t *)base; - } - - ++sfp->pos; - - return 0; - default: - return SF_ERR_PARSE_ERROR; - } - } - - return SF_ERR_PARSE_ERROR; -} - -static int parser_token(sf_parser *sfp, sf_value *dest) { - const uint8_t *base; - - /* The first byte has already been validated by the caller. */ - base = sfp->pos++; - - for (; !parser_eof(sfp); ++sfp->pos) { - switch (*sfp->pos) { - case '!': - case '#': - case '$': - case '%': - case '&': - case '\'': - case '*': - case '+': - case '-': - case '.': - case '^': - case '_': - case '`': - case '|': - case '~': - case ':': - case '/': - DIGIT_CASES: - ALPHA_CASES: - continue; - } - - break; - } - - if (dest) { - dest->type = SF_TYPE_TOKEN; - dest->flags = SF_VALUE_FLAG_NONE; - dest->vec.base = (uint8_t *)base; - dest->vec.len = (size_t)(sfp->pos - base); - } - - return 0; -} - -static int parser_byteseq(sf_parser *sfp, sf_value *dest) { - const uint8_t *base; - - /* The first byte has already been validated by the caller. */ - assert(':' == *sfp->pos); - - base = ++sfp->pos; - - for (; !parser_eof(sfp); ++sfp->pos) { - switch (*sfp->pos) { - case '+': - case '/': - DIGIT_CASES: - ALPHA_CASES: - continue; - case '=': - switch ((sfp->pos - base) & 0x3) { - case 0: - case 1: - return SF_ERR_PARSE_ERROR; - case 2: - switch (*(sfp->pos - 1)) { - case 'A': - case 'Q': - case 'g': - case 'w': - break; - default: - return SF_ERR_PARSE_ERROR; - } - - ++sfp->pos; - - if (parser_eof(sfp) || *sfp->pos != '=') { - return SF_ERR_PARSE_ERROR; - } - - break; - case 3: - switch (*(sfp->pos - 1)) { - case 'A': - case 'E': - case 'I': - case 'M': - case 'Q': - case 'U': - case 'Y': - case 'c': - case 'g': - case 'k': - case 'o': - case 's': - case 'w': - case '0': - case '4': - case '8': - break; - default: - return SF_ERR_PARSE_ERROR; - } - - break; - } - - ++sfp->pos; - - if (parser_eof(sfp) || *sfp->pos != ':') { - return SF_ERR_PARSE_ERROR; - } - - goto fin; - case ':': - if ((sfp->pos - base) & 0x3) { - return SF_ERR_PARSE_ERROR; - } - - goto fin; - default: - return SF_ERR_PARSE_ERROR; - } - } - - return SF_ERR_PARSE_ERROR; - -fin: - if (dest) { - dest->type = SF_TYPE_BYTESEQ; - dest->flags = SF_VALUE_FLAG_NONE; - dest->vec.len = (size_t)(sfp->pos - base); - dest->vec.base = dest->vec.len == 0 ? NULL : (uint8_t *)base; - } - - ++sfp->pos; - - return 0; -} - -static int parser_boolean(sf_parser *sfp, sf_value *dest) { - int b; - - /* The first byte has already been validated by the caller. */ - assert('?' == *sfp->pos); - - ++sfp->pos; - - if (parser_eof(sfp)) { - return SF_ERR_PARSE_ERROR; - } - - switch (*sfp->pos) { - case '0': - b = 0; - - break; - case '1': - b = 1; - - break; - default: - return SF_ERR_PARSE_ERROR; - } - - ++sfp->pos; - - if (dest) { - dest->type = SF_TYPE_BOOLEAN; - dest->flags = SF_VALUE_FLAG_NONE; - dest->boolean = b; - } - - return 0; -} - -static int parser_bare_item(sf_parser *sfp, sf_value *dest) { - switch (*sfp->pos) { - case '"': - return parser_string(sfp, dest); - case '-': - DIGIT_CASES: - return parser_number(sfp, dest); - case '@': - return parser_date(sfp, dest); - case ':': - return parser_byteseq(sfp, dest); - case '?': - return parser_boolean(sfp, dest); - case '*': - ALPHA_CASES: - return parser_token(sfp, dest); - default: - return SF_ERR_PARSE_ERROR; - } -} - -static int parser_skip_inner_list(sf_parser *sfp); - -int sf_parser_param(sf_parser *sfp, sf_vec *dest_key, sf_value *dest_value) { - int rv; - - switch (sfp->state & SF_STATE_OP_MASK) { - case SF_STATE_BEFORE: - rv = parser_skip_inner_list(sfp); - if (rv != 0) { - return rv; - } - - /* fall through */ - case SF_STATE_BEFORE_PARAMS: - parser_set_op_state(sfp, SF_STATE_PARAMS); - - break; - case SF_STATE_PARAMS: - break; - default: - assert(0); - abort(); - } - - if (parser_eof(sfp) || *sfp->pos != ';') { - parser_set_op_state(sfp, SF_STATE_AFTER); - - return SF_ERR_EOF; - } - - ++sfp->pos; - - parser_discard_sp(sfp); - if (parser_eof(sfp)) { - return SF_ERR_PARSE_ERROR; - } - - rv = parser_key(sfp, dest_key); - if (rv != 0) { - return rv; - } - - if (parser_eof(sfp) || *sfp->pos != '=') { - if (dest_value) { - dest_value->type = SF_TYPE_BOOLEAN; - dest_value->flags = SF_VALUE_FLAG_NONE; - dest_value->boolean = 1; - } - - return 0; - } - - ++sfp->pos; - - if (parser_eof(sfp)) { - return SF_ERR_PARSE_ERROR; - } - - return parser_bare_item(sfp, dest_value); -} - -static int parser_skip_params(sf_parser *sfp) { - int rv; - - for (;;) { - rv = sf_parser_param(sfp, NULL, NULL); - switch (rv) { - case 0: - break; - case SF_ERR_EOF: - return 0; - case SF_ERR_PARSE_ERROR: - return rv; - default: - assert(0); - abort(); - } - } -} - -int sf_parser_inner_list(sf_parser *sfp, sf_value *dest) { - int rv; - - switch (sfp->state & SF_STATE_OP_MASK) { - case SF_STATE_BEFORE: - parser_discard_sp(sfp); - if (parser_eof(sfp)) { - return SF_ERR_PARSE_ERROR; - } - - break; - case SF_STATE_BEFORE_PARAMS: - rv = parser_skip_params(sfp); - if (rv != 0) { - return rv; - } - - /* Technically, we are entering SF_STATE_AFTER, but we will set - another state without reading the state. */ - /* parser_set_op_state(sfp, SF_STATE_AFTER); */ - - /* fall through */ - case SF_STATE_AFTER: - if (parser_eof(sfp)) { - return SF_ERR_PARSE_ERROR; - } - - switch (*sfp->pos) { - case ' ': - parser_discard_sp(sfp); - if (parser_eof(sfp)) { - return SF_ERR_PARSE_ERROR; - } - - break; - case ')': - break; - default: - return SF_ERR_PARSE_ERROR; - } - - break; - default: - assert(0); - abort(); - } - - if (*sfp->pos == ')') { - ++sfp->pos; - - parser_unset_inner_list_state(sfp); - parser_set_op_state(sfp, SF_STATE_BEFORE_PARAMS); - - return SF_ERR_EOF; - } - - rv = parser_bare_item(sfp, dest); - if (rv != 0) { - return rv; - } - - parser_set_op_state(sfp, SF_STATE_BEFORE_PARAMS); - - return 0; -} - -static int parser_skip_inner_list(sf_parser *sfp) { - int rv; - - for (;;) { - rv = sf_parser_inner_list(sfp, NULL); - switch (rv) { - case 0: - break; - case SF_ERR_EOF: - return 0; - case SF_ERR_PARSE_ERROR: - return rv; - default: - assert(0); - abort(); - } - } -} - -static int parser_next_key_or_item(sf_parser *sfp) { - parser_discard_ows(sfp); - - if (parser_eof(sfp)) { - return SF_ERR_EOF; - } - - if (*sfp->pos != ',') { - return SF_ERR_PARSE_ERROR; - } - - ++sfp->pos; - - parser_discard_ows(sfp); - if (parser_eof(sfp)) { - return SF_ERR_PARSE_ERROR; - } - - return 0; -} - -static int parser_dict_value(sf_parser *sfp, sf_value *dest) { - int rv; - - if (parser_eof(sfp) || *(sfp->pos) != '=') { - /* Boolean true */ - if (dest) { - dest->type = SF_TYPE_BOOLEAN; - dest->flags = SF_VALUE_FLAG_NONE; - dest->boolean = 1; - } - - sfp->state = SF_STATE_DICT_BEFORE_PARAMS; - - return 0; - } - - ++sfp->pos; - - if (parser_eof(sfp)) { - return SF_ERR_PARSE_ERROR; - } - - if (*sfp->pos == '(') { - if (dest) { - dest->type = SF_TYPE_INNER_LIST; - dest->flags = SF_VALUE_FLAG_NONE; - } - - ++sfp->pos; - - sfp->state = SF_STATE_DICT_INNER_LIST_BEFORE; - - return 0; - } - - rv = parser_bare_item(sfp, dest); - if (rv != 0) { - return rv; - } - - sfp->state = SF_STATE_DICT_BEFORE_PARAMS; - - return 0; -} - -int sf_parser_dict(sf_parser *sfp, sf_vec *dest_key, sf_value *dest_value) { - int rv; - - switch (sfp->state) { - case SF_STATE_DICT_INNER_LIST_BEFORE: - rv = parser_skip_inner_list(sfp); - if (rv != 0) { - return rv; - } - - /* fall through */ - case SF_STATE_DICT_BEFORE_PARAMS: - rv = parser_skip_params(sfp); - if (rv != 0) { - return rv; - } - - /* fall through */ - case SF_STATE_DICT_AFTER: - rv = parser_next_key_or_item(sfp); - if (rv != 0) { - return rv; - } - - break; - case SF_STATE_INITIAL: - parser_discard_sp(sfp); - - if (parser_eof(sfp)) { - return SF_ERR_EOF; - } - - break; - default: - assert(0); - abort(); - } - - rv = parser_key(sfp, dest_key); - if (rv != 0) { - return rv; - } - - return parser_dict_value(sfp, dest_value); -} - -int sf_parser_list(sf_parser *sfp, sf_value *dest) { - int rv; - - switch (sfp->state) { - case SF_STATE_LIST_INNER_LIST_BEFORE: - rv = parser_skip_inner_list(sfp); - if (rv != 0) { - return rv; - } - - /* fall through */ - case SF_STATE_LIST_BEFORE_PARAMS: - rv = parser_skip_params(sfp); - if (rv != 0) { - return rv; - } - - /* fall through */ - case SF_STATE_LIST_AFTER: - rv = parser_next_key_or_item(sfp); - if (rv != 0) { - return rv; - } - - break; - case SF_STATE_INITIAL: - parser_discard_sp(sfp); - - if (parser_eof(sfp)) { - return SF_ERR_EOF; - } - - break; - default: - assert(0); - abort(); - } - - if (*sfp->pos == '(') { - if (dest) { - dest->type = SF_TYPE_INNER_LIST; - dest->flags = SF_VALUE_FLAG_NONE; - } - - ++sfp->pos; - - sfp->state = SF_STATE_LIST_INNER_LIST_BEFORE; - - return 0; - } - - rv = parser_bare_item(sfp, dest); - if (rv != 0) { - return rv; - } - - sfp->state = SF_STATE_LIST_BEFORE_PARAMS; - - return 0; -} - -int sf_parser_item(sf_parser *sfp, sf_value *dest) { - int rv; - - switch (sfp->state) { - case SF_STATE_INITIAL: - parser_discard_sp(sfp); - - if (parser_eof(sfp)) { - return SF_ERR_PARSE_ERROR; - } - - break; - case SF_STATE_ITEM_INNER_LIST_BEFORE: - rv = parser_skip_inner_list(sfp); - if (rv != 0) { - return rv; - } - - /* fall through */ - case SF_STATE_ITEM_BEFORE_PARAMS: - rv = parser_skip_params(sfp); - if (rv != 0) { - return rv; - } - - /* fall through */ - case SF_STATE_ITEM_AFTER: - parser_discard_sp(sfp); - - if (!parser_eof(sfp)) { - return SF_ERR_PARSE_ERROR; - } - - return SF_ERR_EOF; - default: - assert(0); - abort(); - } - - if (*sfp->pos == '(') { - if (dest) { - dest->type = SF_TYPE_INNER_LIST; - dest->flags = SF_VALUE_FLAG_NONE; - } - - ++sfp->pos; - - sfp->state = SF_STATE_ITEM_INNER_LIST_BEFORE; - - return 0; - } - - rv = parser_bare_item(sfp, dest); - if (rv != 0) { - return rv; - } - - sfp->state = SF_STATE_ITEM_BEFORE_PARAMS; - - return 0; -} - -void sf_parser_init(sf_parser *sfp, const uint8_t *data, size_t datalen) { - if (datalen == 0) { - sfp->pos = sfp->end = NULL; - } else { - sfp->pos = data; - sfp->end = data + datalen; - } - - sfp->state = SF_STATE_INITIAL; -} - -void sf_unescape(sf_vec *dest, const sf_vec *src) { - const uint8_t *p, *q; - uint8_t *o; - size_t len, slen; - - if (src->len == 0) { - *dest = *src; - - return; - } - - o = dest->base; - p = src->base; - len = src->len; - - for (;;) { - q = memchr(p, '\\', len); - if (q == NULL) { - if (len == src->len) { - *dest = *src; - - return; - } - - memcpy(o, p, len); - o += len; - - break; - } - - slen = (size_t)(q - p); - memcpy(o, p, slen); - o += slen; - - p = q + 1; - *o++ = *p++; - len -= slen + 2; - } - - dest->len = (size_t)(o - dest->base); -} - -void sf_base64decode(sf_vec *dest, const sf_vec *src) { - static const int index_tbl[] = { - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1}; - uint8_t *o; - const uint8_t *p, *end; - uint32_t n; - size_t i; - int idx; - - assert((src->len & 0x3) == 0); - - if (src->len == 0) { - *dest = *src; - - return; - } - - o = dest->base; - p = src->base; - end = src->base + src->len; - - for (; p != end;) { - n = 0; - - for (i = 1; i <= 4; ++i, ++p) { - idx = index_tbl[*p]; - - if (idx == -1) { - assert(i > 2); - - if (i == 3) { - assert(*p == '=' && *(p + 1) == '=' && p + 2 == end); - - *o++ = (uint8_t)(n >> 16); - - goto fin; - } - - assert(*p == '=' && p + 1 == end); - - *o++ = (uint8_t)(n >> 16); - *o++ = (n >> 8) & 0xffu; - - goto fin; - } - - n += (uint32_t)(idx << (24 - i * 6)); - } - - *o++ = (uint8_t)(n >> 16); - *o++ = (n >> 8) & 0xffu; - *o++ = n & 0xffu; - } - -fin: - dest->len = (size_t)(o - dest->base); -} diff --git a/deps/ngtcp2/nghttp3/lib/sfparse/COPYING b/deps/ngtcp2/nghttp3/lib/sfparse/COPYING new file mode 100644 index 00000000000000..8212d82d83ab74 --- /dev/null +++ b/deps/ngtcp2/nghttp3/lib/sfparse/COPYING @@ -0,0 +1,22 @@ +The MIT License + +Copyright (c) 2023 sfparse contributors + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/deps/ngtcp2/nghttp3/lib/sfparse/sfparse.c b/deps/ngtcp2/nghttp3/lib/sfparse/sfparse.c new file mode 100644 index 00000000000000..d0328cf40c21ea --- /dev/null +++ b/deps/ngtcp2/nghttp3/lib/sfparse/sfparse.c @@ -0,0 +1,1517 @@ +/* + * sfparse + * + * Copyright (c) 2023 sfparse contributors + * Copyright (c) 2019 nghttp3 contributors + * Copyright (c) 2015 nghttp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "sfparse.h" + +#include +#include +#include + +#define SF_STATE_DICT 0x08u +#define SF_STATE_LIST 0x10u +#define SF_STATE_ITEM 0x18u + +#define SF_STATE_INNER_LIST 0x04u + +#define SF_STATE_BEFORE 0x00u +#define SF_STATE_BEFORE_PARAMS 0x01u +#define SF_STATE_PARAMS 0x02u +#define SF_STATE_AFTER 0x03u + +#define SF_STATE_OP_MASK 0x03u + +#define SF_SET_STATE_AFTER(NAME) (SF_STATE_##NAME | SF_STATE_AFTER) +#define SF_SET_STATE_BEFORE_PARAMS(NAME) \ + (SF_STATE_##NAME | SF_STATE_BEFORE_PARAMS) +#define SF_SET_STATE_INNER_LIST_BEFORE(NAME) \ + (SF_STATE_##NAME | SF_STATE_INNER_LIST | SF_STATE_BEFORE) + +#define SF_STATE_DICT_AFTER SF_SET_STATE_AFTER(DICT) +#define SF_STATE_DICT_BEFORE_PARAMS SF_SET_STATE_BEFORE_PARAMS(DICT) +#define SF_STATE_DICT_INNER_LIST_BEFORE SF_SET_STATE_INNER_LIST_BEFORE(DICT) + +#define SF_STATE_LIST_AFTER SF_SET_STATE_AFTER(LIST) +#define SF_STATE_LIST_BEFORE_PARAMS SF_SET_STATE_BEFORE_PARAMS(LIST) +#define SF_STATE_LIST_INNER_LIST_BEFORE SF_SET_STATE_INNER_LIST_BEFORE(LIST) + +#define SF_STATE_ITEM_AFTER SF_SET_STATE_AFTER(ITEM) +#define SF_STATE_ITEM_BEFORE_PARAMS SF_SET_STATE_BEFORE_PARAMS(ITEM) +#define SF_STATE_ITEM_INNER_LIST_BEFORE SF_SET_STATE_INNER_LIST_BEFORE(ITEM) + +#define SF_STATE_INITIAL 0x00u + +#define DIGIT_CASES \ + case '0': \ + case '1': \ + case '2': \ + case '3': \ + case '4': \ + case '5': \ + case '6': \ + case '7': \ + case '8': \ + case '9' + +#define LCALPHA_CASES \ + case 'a': \ + case 'b': \ + case 'c': \ + case 'd': \ + case 'e': \ + case 'f': \ + case 'g': \ + case 'h': \ + case 'i': \ + case 'j': \ + case 'k': \ + case 'l': \ + case 'm': \ + case 'n': \ + case 'o': \ + case 'p': \ + case 'q': \ + case 'r': \ + case 's': \ + case 't': \ + case 'u': \ + case 'v': \ + case 'w': \ + case 'x': \ + case 'y': \ + case 'z' + +#define UCALPHA_CASES \ + case 'A': \ + case 'B': \ + case 'C': \ + case 'D': \ + case 'E': \ + case 'F': \ + case 'G': \ + case 'H': \ + case 'I': \ + case 'J': \ + case 'K': \ + case 'L': \ + case 'M': \ + case 'N': \ + case 'O': \ + case 'P': \ + case 'Q': \ + case 'R': \ + case 'S': \ + case 'T': \ + case 'U': \ + case 'V': \ + case 'W': \ + case 'X': \ + case 'Y': \ + case 'Z' + +#define ALPHA_CASES \ + UCALPHA_CASES: \ + LCALPHA_CASES + +#define TOKEN_CASES \ + case '!': \ + case '#': \ + case '$': \ + case '%': \ + case '&': \ + case '\'': \ + case '*': \ + case '+': \ + case '-': \ + case '.': \ + case '/': \ + DIGIT_CASES: \ + case ':': \ + UCALPHA_CASES: \ + case '^': \ + case '_': \ + case '`': \ + LCALPHA_CASES: \ + case '|': \ + case '~' + +#define LCHEXALPHA_CASES \ + case 'a': \ + case 'b': \ + case 'c': \ + case 'd': \ + case 'e': \ + case 'f' + +#define X00_1F_CASES \ + case 0x00: \ + case 0x01: \ + case 0x02: \ + case 0x03: \ + case 0x04: \ + case 0x05: \ + case 0x06: \ + case 0x07: \ + case 0x08: \ + case 0x09: \ + case 0x0a: \ + case 0x0b: \ + case 0x0c: \ + case 0x0d: \ + case 0x0e: \ + case 0x0f: \ + case 0x10: \ + case 0x11: \ + case 0x12: \ + case 0x13: \ + case 0x14: \ + case 0x15: \ + case 0x16: \ + case 0x17: \ + case 0x18: \ + case 0x19: \ + case 0x1a: \ + case 0x1b: \ + case 0x1c: \ + case 0x1d: \ + case 0x1e: \ + case 0x1f + +#define X20_21_CASES \ + case ' ': \ + case '!' + +#define X23_5B_CASES \ + case '#': \ + case '$': \ + case '%': \ + case '&': \ + case '\'': \ + case '(': \ + case ')': \ + case '*': \ + case '+': \ + case ',': \ + case '-': \ + case '.': \ + case '/': \ + DIGIT_CASES: \ + case ':': \ + case ';': \ + case '<': \ + case '=': \ + case '>': \ + case '?': \ + case '@': \ + UCALPHA_CASES: \ + case '[' + +#define X5D_7E_CASES \ + case ']': \ + case '^': \ + case '_': \ + case '`': \ + LCALPHA_CASES: \ + case '{': \ + case '|': \ + case '}': \ + case '~' + +#define X7F_FF_CASES \ + case 0x7f: \ + case 0x80: \ + case 0x81: \ + case 0x82: \ + case 0x83: \ + case 0x84: \ + case 0x85: \ + case 0x86: \ + case 0x87: \ + case 0x88: \ + case 0x89: \ + case 0x8a: \ + case 0x8b: \ + case 0x8c: \ + case 0x8d: \ + case 0x8e: \ + case 0x8f: \ + case 0x90: \ + case 0x91: \ + case 0x92: \ + case 0x93: \ + case 0x94: \ + case 0x95: \ + case 0x96: \ + case 0x97: \ + case 0x98: \ + case 0x99: \ + case 0x9a: \ + case 0x9b: \ + case 0x9c: \ + case 0x9d: \ + case 0x9e: \ + case 0x9f: \ + case 0xa0: \ + case 0xa1: \ + case 0xa2: \ + case 0xa3: \ + case 0xa4: \ + case 0xa5: \ + case 0xa6: \ + case 0xa7: \ + case 0xa8: \ + case 0xa9: \ + case 0xaa: \ + case 0xab: \ + case 0xac: \ + case 0xad: \ + case 0xae: \ + case 0xaf: \ + case 0xb0: \ + case 0xb1: \ + case 0xb2: \ + case 0xb3: \ + case 0xb4: \ + case 0xb5: \ + case 0xb6: \ + case 0xb7: \ + case 0xb8: \ + case 0xb9: \ + case 0xba: \ + case 0xbb: \ + case 0xbc: \ + case 0xbd: \ + case 0xbe: \ + case 0xbf: \ + case 0xc0: \ + case 0xc1: \ + case 0xc2: \ + case 0xc3: \ + case 0xc4: \ + case 0xc5: \ + case 0xc6: \ + case 0xc7: \ + case 0xc8: \ + case 0xc9: \ + case 0xca: \ + case 0xcb: \ + case 0xcc: \ + case 0xcd: \ + case 0xce: \ + case 0xcf: \ + case 0xd0: \ + case 0xd1: \ + case 0xd2: \ + case 0xd3: \ + case 0xd4: \ + case 0xd5: \ + case 0xd6: \ + case 0xd7: \ + case 0xd8: \ + case 0xd9: \ + case 0xda: \ + case 0xdb: \ + case 0xdc: \ + case 0xdd: \ + case 0xde: \ + case 0xdf: \ + case 0xe0: \ + case 0xe1: \ + case 0xe2: \ + case 0xe3: \ + case 0xe4: \ + case 0xe5: \ + case 0xe6: \ + case 0xe7: \ + case 0xe8: \ + case 0xe9: \ + case 0xea: \ + case 0xeb: \ + case 0xec: \ + case 0xed: \ + case 0xee: \ + case 0xef: \ + case 0xf0: \ + case 0xf1: \ + case 0xf2: \ + case 0xf3: \ + case 0xf4: \ + case 0xf5: \ + case 0xf6: \ + case 0xf7: \ + case 0xf8: \ + case 0xf9: \ + case 0xfa: \ + case 0xfb: \ + case 0xfc: \ + case 0xfd: \ + case 0xfe: \ + case 0xff + +static int is_ws(uint8_t c) { + switch (c) { + case ' ': + case '\t': + return 1; + default: + return 0; + } +} + +static int parser_eof(sf_parser *sfp) { return sfp->pos == sfp->end; } + +static void parser_discard_ows(sf_parser *sfp) { + for (; !parser_eof(sfp) && is_ws(*sfp->pos); ++sfp->pos) + ; +} + +static void parser_discard_sp(sf_parser *sfp) { + for (; !parser_eof(sfp) && *sfp->pos == ' '; ++sfp->pos) + ; +} + +static void parser_set_op_state(sf_parser *sfp, uint32_t op) { + sfp->state &= ~SF_STATE_OP_MASK; + sfp->state |= op; +} + +static void parser_unset_inner_list_state(sf_parser *sfp) { + sfp->state &= ~SF_STATE_INNER_LIST; +} + +static int parser_key(sf_parser *sfp, sf_vec *dest) { + const uint8_t *base; + + switch (*sfp->pos) { + case '*': + LCALPHA_CASES: + break; + default: + return SF_ERR_PARSE_ERROR; + } + + base = sfp->pos++; + + for (; !parser_eof(sfp); ++sfp->pos) { + switch (*sfp->pos) { + case '_': + case '-': + case '.': + case '*': + DIGIT_CASES: + LCALPHA_CASES: + continue; + } + + break; + } + + if (dest) { + dest->base = (uint8_t *)base; + dest->len = (size_t)(sfp->pos - dest->base); + } + + return 0; +} + +static int parser_number(sf_parser *sfp, sf_value *dest) { + int sign = 1; + int64_t value = 0; + size_t len = 0; + size_t fpos = 0; + + if (*sfp->pos == '-') { + ++sfp->pos; + if (parser_eof(sfp)) { + return SF_ERR_PARSE_ERROR; + } + + sign = -1; + } + + assert(!parser_eof(sfp)); + + for (; !parser_eof(sfp); ++sfp->pos) { + switch (*sfp->pos) { + DIGIT_CASES: + if (++len > 15) { + return SF_ERR_PARSE_ERROR; + } + + value *= 10; + value += *sfp->pos - '0'; + + continue; + } + + break; + } + + if (len == 0) { + return SF_ERR_PARSE_ERROR; + } + + if (parser_eof(sfp) || *sfp->pos != '.') { + if (dest) { + dest->type = SF_TYPE_INTEGER; + dest->flags = SF_VALUE_FLAG_NONE; + dest->integer = value * sign; + } + + return 0; + } + + /* decimal */ + + if (len > 12) { + return SF_ERR_PARSE_ERROR; + } + + fpos = len; + + ++sfp->pos; + + for (; !parser_eof(sfp); ++sfp->pos) { + switch (*sfp->pos) { + DIGIT_CASES: + if (++len > 15) { + return SF_ERR_PARSE_ERROR; + } + + value *= 10; + value += *sfp->pos - '0'; + + continue; + } + + break; + } + + if (fpos == len || len - fpos > 3) { + return SF_ERR_PARSE_ERROR; + } + + if (dest) { + dest->type = SF_TYPE_DECIMAL; + dest->flags = SF_VALUE_FLAG_NONE; + dest->decimal.numer = value * sign; + + switch (len - fpos) { + case 1: + dest->decimal.denom = 10; + + break; + case 2: + dest->decimal.denom = 100; + + break; + case 3: + dest->decimal.denom = 1000; + + break; + } + } + + return 0; +} + +static int parser_date(sf_parser *sfp, sf_value *dest) { + int rv; + sf_value val; + + /* The first byte has already been validated by the caller. */ + assert('@' == *sfp->pos); + + ++sfp->pos; + + if (parser_eof(sfp)) { + return SF_ERR_PARSE_ERROR; + } + + rv = parser_number(sfp, &val); + if (rv != 0) { + return rv; + } + + if (val.type != SF_TYPE_INTEGER) { + return SF_ERR_PARSE_ERROR; + } + + if (dest) { + *dest = val; + dest->type = SF_TYPE_DATE; + } + + return 0; +} + +static int parser_string(sf_parser *sfp, sf_value *dest) { + const uint8_t *base; + uint32_t flags = SF_VALUE_FLAG_NONE; + + /* The first byte has already been validated by the caller. */ + assert('"' == *sfp->pos); + + base = ++sfp->pos; + + for (; !parser_eof(sfp); ++sfp->pos) { + switch (*sfp->pos) { + X20_21_CASES: + X23_5B_CASES: + X5D_7E_CASES: + break; + case '\\': + ++sfp->pos; + if (parser_eof(sfp)) { + return SF_ERR_PARSE_ERROR; + } + + switch (*sfp->pos) { + case '"': + case '\\': + flags = SF_VALUE_FLAG_ESCAPED_STRING; + + break; + default: + return SF_ERR_PARSE_ERROR; + } + + break; + case '"': + if (dest) { + dest->type = SF_TYPE_STRING; + dest->flags = flags; + dest->vec.len = (size_t)(sfp->pos - base); + dest->vec.base = dest->vec.len == 0 ? NULL : (uint8_t *)base; + } + + ++sfp->pos; + + return 0; + default: + return SF_ERR_PARSE_ERROR; + } + } + + return SF_ERR_PARSE_ERROR; +} + +static int parser_token(sf_parser *sfp, sf_value *dest) { + const uint8_t *base; + + /* The first byte has already been validated by the caller. */ + base = sfp->pos++; + + for (; !parser_eof(sfp); ++sfp->pos) { + switch (*sfp->pos) { + TOKEN_CASES: + continue; + } + + break; + } + + if (dest) { + dest->type = SF_TYPE_TOKEN; + dest->flags = SF_VALUE_FLAG_NONE; + dest->vec.base = (uint8_t *)base; + dest->vec.len = (size_t)(sfp->pos - base); + } + + return 0; +} + +static int parser_byteseq(sf_parser *sfp, sf_value *dest) { + const uint8_t *base; + + /* The first byte has already been validated by the caller. */ + assert(':' == *sfp->pos); + + base = ++sfp->pos; + + for (; !parser_eof(sfp); ++sfp->pos) { + switch (*sfp->pos) { + case '+': + case '/': + DIGIT_CASES: + ALPHA_CASES: + continue; + case '=': + switch ((sfp->pos - base) & 0x3) { + case 0: + case 1: + return SF_ERR_PARSE_ERROR; + case 2: + ++sfp->pos; + + if (parser_eof(sfp)) { + return SF_ERR_PARSE_ERROR; + } + + if (*sfp->pos == '=') { + ++sfp->pos; + } + + break; + case 3: + ++sfp->pos; + + break; + } + + if (parser_eof(sfp) || *sfp->pos != ':') { + return SF_ERR_PARSE_ERROR; + } + + goto fin; + case ':': + if (((sfp->pos - base) & 0x3) == 1) { + return SF_ERR_PARSE_ERROR; + } + + goto fin; + default: + return SF_ERR_PARSE_ERROR; + } + } + + return SF_ERR_PARSE_ERROR; + +fin: + if (dest) { + dest->type = SF_TYPE_BYTESEQ; + dest->flags = SF_VALUE_FLAG_NONE; + dest->vec.len = (size_t)(sfp->pos - base); + dest->vec.base = dest->vec.len == 0 ? NULL : (uint8_t *)base; + } + + ++sfp->pos; + + return 0; +} + +static int parser_boolean(sf_parser *sfp, sf_value *dest) { + int b; + + /* The first byte has already been validated by the caller. */ + assert('?' == *sfp->pos); + + ++sfp->pos; + + if (parser_eof(sfp)) { + return SF_ERR_PARSE_ERROR; + } + + switch (*sfp->pos) { + case '0': + b = 0; + + break; + case '1': + b = 1; + + break; + default: + return SF_ERR_PARSE_ERROR; + } + + ++sfp->pos; + + if (dest) { + dest->type = SF_TYPE_BOOLEAN; + dest->flags = SF_VALUE_FLAG_NONE; + dest->boolean = b; + } + + return 0; +} + +static int pctdecode(uint8_t *pc, const uint8_t **ppos) { + uint8_t c, b = **ppos; + + switch (b) { + DIGIT_CASES: + c = (uint8_t)((b - '0') << 4); + + break; + LCHEXALPHA_CASES: + c = (uint8_t)((b - 'a' + 10) << 4); + + break; + default: + return -1; + } + + b = *++*ppos; + + switch (b) { + DIGIT_CASES: + c |= (uint8_t)(b - '0'); + + break; + LCHEXALPHA_CASES: + c |= (uint8_t)(b - 'a' + 10); + + break; + default: + return -1; + } + + *pc = c; + ++*ppos; + + return 0; +} + +/* Start of utf8 dfa */ +/* Copyright (c) 2008-2010 Bjoern Hoehrmann + * See http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ for details. + * + * Copyright (c) 2008-2009 Bjoern Hoehrmann + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +#define UTF8_ACCEPT 0 +#define UTF8_REJECT 12 + +/* clang-format off */ +static const uint8_t utf8d[] = { + /* + * The first part of the table maps bytes to character classes that + * to reduce the size of the transition table and create bitmasks. + */ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 10,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3, 11,6,6,6,5,8,8,8,8,8,8,8,8,8,8,8, + + /* + * The second part is a transition table that maps a combination + * of a state of the automaton and a character class to a state. + */ + 0,12,24,36,60,96,84,12,12,12,48,72, 12,12,12,12,12,12,12,12,12,12,12,12, + 12, 0,12,12,12,12,12, 0,12, 0,12,12, 12,24,12,12,12,12,12,24,12,24,12,12, + 12,12,12,12,12,12,12,24,12,12,12,12, 12,24,12,12,12,12,12,12,12,24,12,12, + 12,12,12,12,12,12,12,36,12,36,12,12, 12,36,12,12,12,12,12,36,12,36,12,12, + 12,36,12,12,12,12,12,12,12,12,12,12, +}; +/* clang-format on */ + +static void utf8_decode(uint32_t *state, uint8_t byte) { + *state = utf8d[256 + *state + utf8d[byte]]; +} + +/* End of utf8 dfa */ + +static int parser_dispstring(sf_parser *sfp, sf_value *dest) { + const uint8_t *base; + uint8_t c; + uint32_t utf8state = UTF8_ACCEPT; + + assert('%' == *sfp->pos); + + ++sfp->pos; + + if (parser_eof(sfp) || *sfp->pos != '"') { + return SF_ERR_PARSE_ERROR; + } + + base = ++sfp->pos; + + for (; !parser_eof(sfp);) { + switch (*sfp->pos) { + X00_1F_CASES: + X7F_FF_CASES: + return SF_ERR_PARSE_ERROR; + case '%': + ++sfp->pos; + + if (sfp->pos + 2 > sfp->end) { + return SF_ERR_PARSE_ERROR; + } + + if (pctdecode(&c, &sfp->pos) != 0) { + return SF_ERR_PARSE_ERROR; + } + + utf8_decode(&utf8state, c); + if (utf8state == UTF8_REJECT) { + return SF_ERR_PARSE_ERROR; + } + + break; + case '"': + if (utf8state != UTF8_ACCEPT) { + return SF_ERR_PARSE_ERROR; + } + + if (dest) { + dest->type = SF_TYPE_DISPSTRING; + dest->flags = SF_VALUE_FLAG_NONE; + dest->vec.len = (size_t)(sfp->pos - base); + dest->vec.base = dest->vec.len == 0 ? NULL : (uint8_t *)base; + } + + ++sfp->pos; + + return 0; + default: + if (utf8state != UTF8_ACCEPT) { + return SF_ERR_PARSE_ERROR; + } + + ++sfp->pos; + } + } + + return SF_ERR_PARSE_ERROR; +} + +static int parser_bare_item(sf_parser *sfp, sf_value *dest) { + switch (*sfp->pos) { + case '"': + return parser_string(sfp, dest); + case '-': + DIGIT_CASES: + return parser_number(sfp, dest); + case '@': + return parser_date(sfp, dest); + case ':': + return parser_byteseq(sfp, dest); + case '?': + return parser_boolean(sfp, dest); + case '*': + ALPHA_CASES: + return parser_token(sfp, dest); + case '%': + return parser_dispstring(sfp, dest); + default: + return SF_ERR_PARSE_ERROR; + } +} + +static int parser_skip_inner_list(sf_parser *sfp); + +int sf_parser_param(sf_parser *sfp, sf_vec *dest_key, sf_value *dest_value) { + int rv; + + switch (sfp->state & SF_STATE_OP_MASK) { + case SF_STATE_BEFORE: + rv = parser_skip_inner_list(sfp); + if (rv != 0) { + return rv; + } + + /* fall through */ + case SF_STATE_BEFORE_PARAMS: + parser_set_op_state(sfp, SF_STATE_PARAMS); + + break; + case SF_STATE_PARAMS: + break; + default: + assert(0); + abort(); + } + + if (parser_eof(sfp) || *sfp->pos != ';') { + parser_set_op_state(sfp, SF_STATE_AFTER); + + return SF_ERR_EOF; + } + + ++sfp->pos; + + parser_discard_sp(sfp); + if (parser_eof(sfp)) { + return SF_ERR_PARSE_ERROR; + } + + rv = parser_key(sfp, dest_key); + if (rv != 0) { + return rv; + } + + if (parser_eof(sfp) || *sfp->pos != '=') { + if (dest_value) { + dest_value->type = SF_TYPE_BOOLEAN; + dest_value->flags = SF_VALUE_FLAG_NONE; + dest_value->boolean = 1; + } + + return 0; + } + + ++sfp->pos; + + if (parser_eof(sfp)) { + return SF_ERR_PARSE_ERROR; + } + + return parser_bare_item(sfp, dest_value); +} + +static int parser_skip_params(sf_parser *sfp) { + int rv; + + for (;;) { + rv = sf_parser_param(sfp, NULL, NULL); + switch (rv) { + case 0: + break; + case SF_ERR_EOF: + return 0; + case SF_ERR_PARSE_ERROR: + return rv; + default: + assert(0); + abort(); + } + } +} + +int sf_parser_inner_list(sf_parser *sfp, sf_value *dest) { + int rv; + + switch (sfp->state & SF_STATE_OP_MASK) { + case SF_STATE_BEFORE: + parser_discard_sp(sfp); + if (parser_eof(sfp)) { + return SF_ERR_PARSE_ERROR; + } + + break; + case SF_STATE_BEFORE_PARAMS: + rv = parser_skip_params(sfp); + if (rv != 0) { + return rv; + } + + /* Technically, we are entering SF_STATE_AFTER, but we will set + another state without reading the state. */ + /* parser_set_op_state(sfp, SF_STATE_AFTER); */ + + /* fall through */ + case SF_STATE_AFTER: + if (parser_eof(sfp)) { + return SF_ERR_PARSE_ERROR; + } + + switch (*sfp->pos) { + case ' ': + parser_discard_sp(sfp); + if (parser_eof(sfp)) { + return SF_ERR_PARSE_ERROR; + } + + break; + case ')': + break; + default: + return SF_ERR_PARSE_ERROR; + } + + break; + default: + assert(0); + abort(); + } + + if (*sfp->pos == ')') { + ++sfp->pos; + + parser_unset_inner_list_state(sfp); + parser_set_op_state(sfp, SF_STATE_BEFORE_PARAMS); + + return SF_ERR_EOF; + } + + rv = parser_bare_item(sfp, dest); + if (rv != 0) { + return rv; + } + + parser_set_op_state(sfp, SF_STATE_BEFORE_PARAMS); + + return 0; +} + +static int parser_skip_inner_list(sf_parser *sfp) { + int rv; + + for (;;) { + rv = sf_parser_inner_list(sfp, NULL); + switch (rv) { + case 0: + break; + case SF_ERR_EOF: + return 0; + case SF_ERR_PARSE_ERROR: + return rv; + default: + assert(0); + abort(); + } + } +} + +static int parser_next_key_or_item(sf_parser *sfp) { + parser_discard_ows(sfp); + + if (parser_eof(sfp)) { + return SF_ERR_EOF; + } + + if (*sfp->pos != ',') { + return SF_ERR_PARSE_ERROR; + } + + ++sfp->pos; + + parser_discard_ows(sfp); + if (parser_eof(sfp)) { + return SF_ERR_PARSE_ERROR; + } + + return 0; +} + +static int parser_dict_value(sf_parser *sfp, sf_value *dest) { + int rv; + + if (parser_eof(sfp) || *(sfp->pos) != '=') { + /* Boolean true */ + if (dest) { + dest->type = SF_TYPE_BOOLEAN; + dest->flags = SF_VALUE_FLAG_NONE; + dest->boolean = 1; + } + + sfp->state = SF_STATE_DICT_BEFORE_PARAMS; + + return 0; + } + + ++sfp->pos; + + if (parser_eof(sfp)) { + return SF_ERR_PARSE_ERROR; + } + + if (*sfp->pos == '(') { + if (dest) { + dest->type = SF_TYPE_INNER_LIST; + dest->flags = SF_VALUE_FLAG_NONE; + } + + ++sfp->pos; + + sfp->state = SF_STATE_DICT_INNER_LIST_BEFORE; + + return 0; + } + + rv = parser_bare_item(sfp, dest); + if (rv != 0) { + return rv; + } + + sfp->state = SF_STATE_DICT_BEFORE_PARAMS; + + return 0; +} + +int sf_parser_dict(sf_parser *sfp, sf_vec *dest_key, sf_value *dest_value) { + int rv; + + switch (sfp->state) { + case SF_STATE_DICT_INNER_LIST_BEFORE: + rv = parser_skip_inner_list(sfp); + if (rv != 0) { + return rv; + } + + /* fall through */ + case SF_STATE_DICT_BEFORE_PARAMS: + rv = parser_skip_params(sfp); + if (rv != 0) { + return rv; + } + + /* fall through */ + case SF_STATE_DICT_AFTER: + rv = parser_next_key_or_item(sfp); + if (rv != 0) { + return rv; + } + + break; + case SF_STATE_INITIAL: + parser_discard_sp(sfp); + + if (parser_eof(sfp)) { + return SF_ERR_EOF; + } + + break; + default: + assert(0); + abort(); + } + + rv = parser_key(sfp, dest_key); + if (rv != 0) { + return rv; + } + + return parser_dict_value(sfp, dest_value); +} + +int sf_parser_list(sf_parser *sfp, sf_value *dest) { + int rv; + + switch (sfp->state) { + case SF_STATE_LIST_INNER_LIST_BEFORE: + rv = parser_skip_inner_list(sfp); + if (rv != 0) { + return rv; + } + + /* fall through */ + case SF_STATE_LIST_BEFORE_PARAMS: + rv = parser_skip_params(sfp); + if (rv != 0) { + return rv; + } + + /* fall through */ + case SF_STATE_LIST_AFTER: + rv = parser_next_key_or_item(sfp); + if (rv != 0) { + return rv; + } + + break; + case SF_STATE_INITIAL: + parser_discard_sp(sfp); + + if (parser_eof(sfp)) { + return SF_ERR_EOF; + } + + break; + default: + assert(0); + abort(); + } + + if (*sfp->pos == '(') { + if (dest) { + dest->type = SF_TYPE_INNER_LIST; + dest->flags = SF_VALUE_FLAG_NONE; + } + + ++sfp->pos; + + sfp->state = SF_STATE_LIST_INNER_LIST_BEFORE; + + return 0; + } + + rv = parser_bare_item(sfp, dest); + if (rv != 0) { + return rv; + } + + sfp->state = SF_STATE_LIST_BEFORE_PARAMS; + + return 0; +} + +int sf_parser_item(sf_parser *sfp, sf_value *dest) { + int rv; + + switch (sfp->state) { + case SF_STATE_INITIAL: + parser_discard_sp(sfp); + + if (parser_eof(sfp)) { + return SF_ERR_PARSE_ERROR; + } + + break; + case SF_STATE_ITEM_INNER_LIST_BEFORE: + rv = parser_skip_inner_list(sfp); + if (rv != 0) { + return rv; + } + + /* fall through */ + case SF_STATE_ITEM_BEFORE_PARAMS: + rv = parser_skip_params(sfp); + if (rv != 0) { + return rv; + } + + /* fall through */ + case SF_STATE_ITEM_AFTER: + parser_discard_sp(sfp); + + if (!parser_eof(sfp)) { + return SF_ERR_PARSE_ERROR; + } + + return SF_ERR_EOF; + default: + assert(0); + abort(); + } + + if (*sfp->pos == '(') { + if (dest) { + dest->type = SF_TYPE_INNER_LIST; + dest->flags = SF_VALUE_FLAG_NONE; + } + + ++sfp->pos; + + sfp->state = SF_STATE_ITEM_INNER_LIST_BEFORE; + + return 0; + } + + rv = parser_bare_item(sfp, dest); + if (rv != 0) { + return rv; + } + + sfp->state = SF_STATE_ITEM_BEFORE_PARAMS; + + return 0; +} + +void sf_parser_init(sf_parser *sfp, const uint8_t *data, size_t datalen) { + if (datalen == 0) { + sfp->pos = sfp->end = NULL; + } else { + sfp->pos = data; + sfp->end = data + datalen; + } + + sfp->state = SF_STATE_INITIAL; +} + +void sf_unescape(sf_vec *dest, const sf_vec *src) { + const uint8_t *p, *q; + uint8_t *o; + size_t len, slen; + + if (src->len == 0) { + dest->len = 0; + + return; + } + + o = dest->base; + p = src->base; + len = src->len; + + for (;;) { + q = memchr(p, '\\', len); + if (q == NULL) { + memcpy(o, p, len); + o += len; + + dest->len = (size_t)(o - dest->base); + + return; + } + + slen = (size_t)(q - p); + memcpy(o, p, slen); + o += slen; + + p = q + 1; + *o++ = *p++; + len -= slen + 2; + } +} + +void sf_base64decode(sf_vec *dest, const sf_vec *src) { + static const int index_tbl[] = { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1}; + uint8_t *o; + const uint8_t *p, *end; + uint32_t n; + size_t i, left; + int idx; + + if (src->len == 0) { + dest->len = 0; + + return; + } + + o = dest->base; + p = src->base; + left = src->len & 0x3; + if (left == 0 && src->base[src->len - 1] == '=') { + left = 4; + } + end = src->base + src->len - left; + + for (; p != end;) { + n = 0; + + for (i = 1; i <= 4; ++i, ++p) { + idx = index_tbl[*p]; + + assert(idx != -1); + + n += (uint32_t)(idx << (24 - i * 6)); + } + + *o++ = (uint8_t)(n >> 16); + *o++ = (n >> 8) & 0xffu; + *o++ = n & 0xffu; + } + + switch (left) { + case 0: + goto fin; + case 1: + assert(0); + abort(); + case 3: + if (src->base[src->len - 1] == '=') { + left = 2; + } + + break; + case 4: + assert('=' == src->base[src->len - 1]); + + if (src->base[src->len - 2] == '=') { + left = 2; + } else { + left = 3; + } + + break; + } + + switch (left) { + case 2: + *o = (uint8_t)(index_tbl[*p++] << 2); + *o++ |= (uint8_t)(index_tbl[*p++] >> 4); + + break; + case 3: + n = (uint32_t)(index_tbl[*p++] << 10); + n += (uint32_t)(index_tbl[*p++] << 4); + n += (uint32_t)(index_tbl[*p++] >> 2); + *o++ = (n >> 8) & 0xffu; + *o++ = n & 0xffu; + + break; + } + +fin: + dest->len = (size_t)(o - dest->base); +} + +void sf_pctdecode(sf_vec *dest, const sf_vec *src) { + const uint8_t *p, *q; + uint8_t *o; + size_t len, slen; + + if (src->len == 0) { + dest->len = 0; + + return; + } + + o = dest->base; + p = src->base; + len = src->len; + + for (;;) { + q = memchr(p, '%', len); + if (q == NULL) { + memcpy(o, p, len); + o += len; + + dest->len = (size_t)(o - dest->base); + + return; + } + + slen = (size_t)(q - p); + memcpy(o, p, slen); + o += slen; + + p = q + 1; + + pctdecode(o++, &p); + + len -= slen + 3; + } +} diff --git a/deps/ngtcp2/nghttp3/lib/sfparse.h b/deps/ngtcp2/nghttp3/lib/sfparse/sfparse.h similarity index 91% rename from deps/ngtcp2/nghttp3/lib/sfparse.h rename to deps/ngtcp2/nghttp3/lib/sfparse/sfparse.h index 1474db1429acea..01cc947d4d61bc 100644 --- a/deps/ngtcp2/nghttp3/lib/sfparse.h +++ b/deps/ngtcp2/nghttp3/lib/sfparse/sfparse.h @@ -85,7 +85,11 @@ typedef enum sf_type { /** * :enum:`SF_TYPE_DATE` indicates date type. */ - SF_TYPE_DATE + SF_TYPE_DATE, + /** + * :enum:`SF_TYPE_DISPSTRING` indicates display string type. + */ + SF_TYPE_DISPSTRING } sf_type; /** @@ -197,8 +201,8 @@ typedef struct sf_value { /** * :member:`vec` contains sequence of bytes if :member:`type` is * either :enum:`sf_type.SF_TYPE_STRING`, - * :enum:`sf_type.SF_TYPE_TOKEN`, or - * :enum:`sf_type.SF_TYPE_BYTESEQ`. + * :enum:`sf_type.SF_TYPE_TOKEN`, :enum:`sf_type.SF_TYPE_BYTESEQ`, + * or :enum:`sf_type.SF_TYPE_DISPSTRING`. * * For :enum:`sf_type.SF_TYPE_STRING`, this field contains one or * more escaped characters if :member:`flags` has @@ -209,6 +213,10 @@ typedef struct sf_value { * encoded string. To decode this byte string, use * `sf_base64decode`. * + * For :enum:`sf_type.SF_TYPE_DISPSTRING`, this field may contain + * percent-encoded UTF-8 byte sequences. To decode it, use + * `sf_pctdecode`. + * * If :member:`vec.len ` == 0, :member:`vec.base * ` is guaranteed to be NULL. */ @@ -372,10 +380,6 @@ int sf_parser_inner_list(sf_parser *sfp, sf_value *dest); * :member:`dest->base ` must point to the buffer that * has sufficient space to store the unescaped string. * - * If there is no escape character in |src|, |*src| is assigned to - * |*dest|. This includes the case that :member:`src->len - * ` == 0. - * * This function sets the length of unescaped string to * :member:`dest->len `. */ @@ -394,14 +398,29 @@ void sf_unescape(sf_vec *dest, const sf_vec *src); * :member:`dest->base ` must point to the buffer that * has sufficient space to store the decoded byte string. * - * If :member:`src->len ` == 0, |*src| is assigned to - * |*dest|. - * * This function sets the length of decoded byte string to * :member:`dest->len `. */ void sf_base64decode(sf_vec *dest, const sf_vec *src); +/** + * @function + * + * `sf_pctdecode` decodes percent-encoded string |src| and writes the + * result into |dest|. |src| should be the pointer to + * :member:`sf_value.vec` of type :enum:`sf_type.SF_TYPE_DISPSTRING` + * produced by either `sf_parser_dict`, `sf_parser_list`, + * `sf_parser_inner_list`, `sf_parser_item`, or `sf_parser_param`, + * otherwise the behavior is undefined. + * + * :member:`dest->base ` must point to the buffer that + * has sufficient space to store the decoded byte string. + * + * This function sets the length of decoded byte string to + * :member:`dest->len `. + */ +void sf_pctdecode(sf_vec *dest, const sf_vec *src); + #ifdef __cplusplus } #endif diff --git a/deps/ngtcp2/ngtcp2.gyp b/deps/ngtcp2/ngtcp2.gyp index 0f2929b75478f1..68013580874b09 100644 --- a/deps/ngtcp2/ngtcp2.gyp +++ b/deps/ngtcp2/ngtcp2.gyp @@ -13,7 +13,6 @@ 'ngtcp2/lib/ngtcp2_cid.c', 'ngtcp2/lib/ngtcp2_conn.c', 'ngtcp2/lib/ngtcp2_conv.c', - 'ngtcp2/lib/ngtcp2_conversion.c', 'ngtcp2/lib/ngtcp2_crypto.c', 'ngtcp2/lib/ngtcp2_err.c', 'ngtcp2/lib/ngtcp2_frame_chain.c', @@ -37,8 +36,10 @@ 'ngtcp2/lib/ngtcp2_rob.c', 'ngtcp2/lib/ngtcp2_rst.c', 'ngtcp2/lib/ngtcp2_rtb.c', + 'ngtcp2/lib/ngtcp2_settings.c', 'ngtcp2/lib/ngtcp2_str.c', 'ngtcp2/lib/ngtcp2_strm.c', + 'ngtcp2/lib/ngtcp2_transport_params.c', 'ngtcp2/lib/ngtcp2_unreachable.c', 'ngtcp2/lib/ngtcp2_vec.c', 'ngtcp2/lib/ngtcp2_version.c', diff --git a/deps/ngtcp2/ngtcp2/crypto/boringssl/boringssl.c b/deps/ngtcp2/ngtcp2/crypto/boringssl/boringssl.c index 50b89110e36ff7..283063f738e2af 100644 --- a/deps/ngtcp2/ngtcp2/crypto/boringssl/boringssl.c +++ b/deps/ngtcp2/ngtcp2/crypto/boringssl/boringssl.c @@ -24,7 +24,7 @@ */ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include #include @@ -52,15 +52,15 @@ typedef struct ngtcp2_crypto_boringssl_cipher { } ngtcp2_crypto_boringssl_cipher; static ngtcp2_crypto_boringssl_cipher crypto_cipher_aes_128 = { - NGTCP2_CRYPTO_BORINGSSL_CIPHER_TYPE_AES_128, + NGTCP2_CRYPTO_BORINGSSL_CIPHER_TYPE_AES_128, }; static ngtcp2_crypto_boringssl_cipher crypto_cipher_aes_256 = { - NGTCP2_CRYPTO_BORINGSSL_CIPHER_TYPE_AES_256, + NGTCP2_CRYPTO_BORINGSSL_CIPHER_TYPE_AES_256, }; static ngtcp2_crypto_boringssl_cipher crypto_cipher_chacha20 = { - NGTCP2_CRYPTO_BORINGSSL_CIPHER_TYPE_CHACHA20, + NGTCP2_CRYPTO_BORINGSSL_CIPHER_TYPE_CHACHA20, }; ngtcp2_crypto_aead *ngtcp2_crypto_aead_aes_128_gcm(ngtcp2_crypto_aead *aead) { @@ -175,7 +175,7 @@ static ngtcp2_crypto_ctx *crypto_ctx_cipher_id(ngtcp2_crypto_ctx *ctx, ctx->hp.native_handle = (void *)crypto_cipher_id_get_hp(cipher_id); ctx->max_encryption = crypto_cipher_id_get_aead_max_encryption(cipher_id); ctx->max_decryption_failure = - crypto_cipher_id_get_aead_max_decryption_failure(cipher_id); + crypto_cipher_id_get_aead_max_decryption_failure(cipher_id); return ctx; } @@ -413,12 +413,12 @@ int ngtcp2_crypto_hp_mask(uint8_t *dest, const ngtcp2_crypto_cipher *hp, AES_ecb_encrypt(sample, dest, &ctx->aes_key, 1); return 0; case NGTCP2_CRYPTO_BORINGSSL_CIPHER_TYPE_CHACHA20: -#if defined(WORDS_BIGENDIAN) +#ifdef WORDS_BIGENDIAN counter = (uint32_t)sample[0] + (uint32_t)(sample[1] << 8) + (uint32_t)(sample[2] << 16) + (uint32_t)(sample[3] << 24); -#else /* !WORDS_BIGENDIAN */ +#else /* !defined(WORDS_BIGENDIAN) */ memcpy(&counter, sample, sizeof(counter)); -#endif /* !WORDS_BIGENDIAN */ +#endif /* !defined(WORDS_BIGENDIAN) */ CRYPTO_chacha_20(dest, PLAINTEXT, sizeof(PLAINTEXT) - 1, ctx->key, sample + sizeof(counter), counter); return 0; @@ -429,17 +429,16 @@ int ngtcp2_crypto_hp_mask(uint8_t *dest, const ngtcp2_crypto_cipher *hp, } int ngtcp2_crypto_read_write_crypto_data( - ngtcp2_conn *conn, ngtcp2_encryption_level encryption_level, - const uint8_t *data, size_t datalen) { + ngtcp2_conn *conn, ngtcp2_encryption_level encryption_level, + const uint8_t *data, size_t datalen) { SSL *ssl = ngtcp2_conn_get_tls_native_handle(conn); int rv; int err; if (SSL_provide_quic_data( - ssl, - ngtcp2_crypto_boringssl_from_ngtcp2_encryption_level( - encryption_level), - data, datalen) != 1) { + ssl, + ngtcp2_crypto_boringssl_from_ngtcp2_encryption_level(encryption_level), + data, datalen) != 1) { return -1; } @@ -522,7 +521,7 @@ int ngtcp2_crypto_set_local_transport_params(void *tls, const uint8_t *buf, } ngtcp2_encryption_level ngtcp2_crypto_boringssl_from_ssl_encryption_level( - enum ssl_encryption_level_t ssl_level) { + enum ssl_encryption_level_t ssl_level) { switch (ssl_level) { case ssl_encryption_initial: return NGTCP2_ENCRYPTION_LEVEL_INITIAL; @@ -540,7 +539,7 @@ ngtcp2_encryption_level ngtcp2_crypto_boringssl_from_ssl_encryption_level( enum ssl_encryption_level_t ngtcp2_crypto_boringssl_from_ngtcp2_encryption_level( - ngtcp2_encryption_level encryption_level) { + ngtcp2_encryption_level encryption_level) { switch (encryption_level) { case NGTCP2_ENCRYPTION_LEVEL_INITIAL: return ssl_encryption_initial; @@ -582,7 +581,7 @@ static int set_read_secret(SSL *ssl, enum ssl_encryption_level_t bssl_level, ngtcp2_crypto_conn_ref *conn_ref = SSL_get_app_data(ssl); ngtcp2_conn *conn = conn_ref->get_conn(conn_ref); ngtcp2_encryption_level level = - ngtcp2_crypto_boringssl_from_ssl_encryption_level(bssl_level); + ngtcp2_crypto_boringssl_from_ssl_encryption_level(bssl_level); (void)cipher; if (ngtcp2_crypto_derive_and_install_rx_key(conn, NULL, NULL, NULL, level, @@ -599,7 +598,7 @@ static int set_write_secret(SSL *ssl, enum ssl_encryption_level_t bssl_level, ngtcp2_crypto_conn_ref *conn_ref = SSL_get_app_data(ssl); ngtcp2_conn *conn = conn_ref->get_conn(conn_ref); ngtcp2_encryption_level level = - ngtcp2_crypto_boringssl_from_ssl_encryption_level(bssl_level); + ngtcp2_crypto_boringssl_from_ssl_encryption_level(bssl_level); (void)cipher; if (ngtcp2_crypto_derive_and_install_tx_key(conn, NULL, NULL, NULL, level, @@ -615,7 +614,7 @@ static int add_handshake_data(SSL *ssl, enum ssl_encryption_level_t bssl_level, ngtcp2_crypto_conn_ref *conn_ref = SSL_get_app_data(ssl); ngtcp2_conn *conn = conn_ref->get_conn(conn_ref); ngtcp2_encryption_level level = - ngtcp2_crypto_boringssl_from_ssl_encryption_level(bssl_level); + ngtcp2_crypto_boringssl_from_ssl_encryption_level(bssl_level); int rv; rv = ngtcp2_conn_submit_crypto_data(conn, level, data, datalen); @@ -644,8 +643,8 @@ static int send_alert(SSL *ssl, enum ssl_encryption_level_t bssl_level, } static SSL_QUIC_METHOD quic_method = { - set_read_secret, set_write_secret, add_handshake_data, - flush_flight, send_alert, + set_read_secret, set_write_secret, add_handshake_data, + flush_flight, send_alert, }; static void crypto_boringssl_configure_context(SSL_CTX *ssl_ctx) { diff --git a/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto.h b/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto.h index 06427d7a7cac70..68093d18b71b14 100644 --- a/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto.h +++ b/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto.h @@ -29,14 +29,45 @@ #ifdef __cplusplus extern "C" { -#endif +#endif /* defined(__cplusplus) */ #ifdef WIN32 # ifndef WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN -# endif +# endif /* !defined(WIN32_LEAN_AND_MEAN) */ # include -#endif /* WIN32 */ +#endif /* defined(WIN32) */ + +/** + * @macrosection + * + * ngtcp2 crypto library error codes + */ + +/** + * @macro + * + * :macro:`NGTCP2_CRYPTO_ERR_INTERNAL` indicates an internal error. + */ +#define NGTCP2_CRYPTO_ERR_INTERNAL -201 + +/** + * @macro + * + * :macro:`NGTCP2_CRYPTO_ERR_UNREADABLE_TOKEN` indicates that a token + * is unreadable because it is not correctly formatted; or verifying + * the integrity protection failed. + */ +#define NGTCP2_CRYPTO_ERR_UNREADABLE_TOKEN -202 + +/** + * @macro + * + * :macro:`NGTCP2_CRYPTO_ERR_VERIFY_TOKEN` indicates that a token does + * not probe the client address; or the token validity has expired; or + * it contains invalid Connection ID. + */ +#define NGTCP2_CRYPTO_ERR_VERIFY_TOKEN -203 /** * @function @@ -135,12 +166,9 @@ ngtcp2_crypto_hkdf_extract(uint8_t *dest, const ngtcp2_crypto_md *md, * * This function returns 0 if it succeeds, or -1. */ -NGTCP2_EXTERN int ngtcp2_crypto_hkdf_expand(uint8_t *dest, size_t destlen, - const ngtcp2_crypto_md *md, - const uint8_t *secret, - size_t secretlen, - const uint8_t *info, - size_t infolen); +NGTCP2_EXTERN int ngtcp2_crypto_hkdf_expand( + uint8_t *dest, size_t destlen, const ngtcp2_crypto_md *md, + const uint8_t *secret, size_t secretlen, const uint8_t *info, size_t infolen); /** * @function @@ -318,8 +346,8 @@ ngtcp2_crypto_hp_mask_cb(uint8_t *dest, const ngtcp2_crypto_cipher *hp, * This function returns 0 if it succeeds, or -1. */ NGTCP2_EXTERN int ngtcp2_crypto_derive_and_install_rx_key( - ngtcp2_conn *conn, uint8_t *key, uint8_t *iv, uint8_t *hp, - ngtcp2_encryption_level level, const uint8_t *secret, size_t secretlen); + ngtcp2_conn *conn, uint8_t *key, uint8_t *iv, uint8_t *hp, + ngtcp2_encryption_level level, const uint8_t *secret, size_t secretlen); /** * @function @@ -365,8 +393,8 @@ NGTCP2_EXTERN int ngtcp2_crypto_derive_and_install_rx_key( * This function returns 0 if it succeeds, or -1. */ NGTCP2_EXTERN int ngtcp2_crypto_derive_and_install_tx_key( - ngtcp2_conn *conn, uint8_t *key, uint8_t *iv, uint8_t *hp, - ngtcp2_encryption_level level, const uint8_t *secret, size_t secretlen); + ngtcp2_conn *conn, uint8_t *key, uint8_t *iv, uint8_t *hp, + ngtcp2_encryption_level level, const uint8_t *secret, size_t secretlen); /** * @function @@ -405,11 +433,11 @@ NGTCP2_EXTERN int ngtcp2_crypto_derive_and_install_tx_key( * This function returns 0 if it succeeds, or -1. */ NGTCP2_EXTERN int ngtcp2_crypto_update_key( - ngtcp2_conn *conn, uint8_t *rx_secret, uint8_t *tx_secret, - ngtcp2_crypto_aead_ctx *rx_aead_ctx, uint8_t *rx_key, uint8_t *rx_iv, - ngtcp2_crypto_aead_ctx *tx_aead_ctx, uint8_t *tx_key, uint8_t *tx_iv, - const uint8_t *current_rx_secret, const uint8_t *current_tx_secret, - size_t secretlen); + ngtcp2_conn *conn, uint8_t *rx_secret, uint8_t *tx_secret, + ngtcp2_crypto_aead_ctx *rx_aead_ctx, uint8_t *rx_key, uint8_t *rx_iv, + ngtcp2_crypto_aead_ctx *tx_aead_ctx, uint8_t *tx_key, uint8_t *tx_iv, + const uint8_t *current_rx_secret, const uint8_t *current_tx_secret, + size_t secretlen); /** * @function @@ -422,11 +450,11 @@ NGTCP2_EXTERN int ngtcp2_crypto_update_key( * :macro:`NGTCP2_ERR_CALLBACK_FAILURE`. */ NGTCP2_EXTERN int ngtcp2_crypto_update_key_cb( - ngtcp2_conn *conn, uint8_t *rx_secret, uint8_t *tx_secret, - ngtcp2_crypto_aead_ctx *rx_aead_ctx, uint8_t *rx_iv, - ngtcp2_crypto_aead_ctx *tx_aead_ctx, uint8_t *tx_iv, - const uint8_t *current_rx_secret, const uint8_t *current_tx_secret, - size_t secretlen, void *user_data); + ngtcp2_conn *conn, uint8_t *rx_secret, uint8_t *tx_secret, + ngtcp2_crypto_aead_ctx *rx_aead_ctx, uint8_t *rx_iv, + ngtcp2_crypto_aead_ctx *tx_aead_ctx, uint8_t *tx_iv, + const uint8_t *current_rx_secret, const uint8_t *current_tx_secret, + size_t secretlen, void *user_data); /** * @function @@ -514,8 +542,8 @@ ngtcp2_crypto_read_write_crypto_data(ngtcp2_conn *conn, * codes. */ NGTCP2_EXTERN int ngtcp2_crypto_recv_crypto_data_cb( - ngtcp2_conn *conn, ngtcp2_encryption_level encryption_level, - uint64_t offset, const uint8_t *data, size_t datalen, void *user_data); + ngtcp2_conn *conn, ngtcp2_encryption_level encryption_level, uint64_t offset, + const uint8_t *data, size_t datalen, void *user_data); /** * @function @@ -529,8 +557,8 @@ NGTCP2_EXTERN int ngtcp2_crypto_recv_crypto_data_cb( * This function returns 0 if it succeeds, or -1. */ NGTCP2_EXTERN int ngtcp2_crypto_generate_stateless_reset_token( - uint8_t *token, const uint8_t *secret, size_t secretlen, - const ngtcp2_cid *cid); + uint8_t *token, const uint8_t *secret, size_t secretlen, + const ngtcp2_cid *cid); /** * @macro @@ -540,7 +568,7 @@ NGTCP2_EXTERN int ngtcp2_crypto_generate_stateless_reset_token( * `ngtcp2_crypto_generate_retry_token` or * `ngtcp2_crypto_generate_regular_token`. */ -#define NGTCP2_CRYPTO_TOKEN_RAND_DATALEN 32 +#define NGTCP2_CRYPTO_TOKEN_RAND_DATALEN 16 /** * @macro @@ -550,6 +578,14 @@ NGTCP2_EXTERN int ngtcp2_crypto_generate_stateless_reset_token( */ #define NGTCP2_CRYPTO_TOKEN_MAGIC_RETRY 0xb6 +/** + * @macro + * + * :macro:`NGTCP2_CRYPTO_TOKEN_MAGIC_RETRY2` is the magic byte for + * Retry token generated by `ngtcp2_crypto_generate_retry_token2`. + */ +#define NGTCP2_CRYPTO_TOKEN_MAGIC_RETRY2 0xb7 + /** * @macro * @@ -569,6 +605,17 @@ NGTCP2_EXTERN int ngtcp2_crypto_generate_stateless_reset_token( sizeof(ngtcp2_tstamp) + /* aead tag = */ 16 + \ NGTCP2_CRYPTO_TOKEN_RAND_DATALEN) +/** + * @macro + * + * :macro:`NGTCP2_CRYPTO_MAX_RETRY_TOKENLEN2` is the maximum length of + * a token generated by `ngtcp2_crypto_generate_retry_token2`. + */ +#define NGTCP2_CRYPTO_MAX_RETRY_TOKENLEN2 \ + (/* magic = */ 1 + sizeof(ngtcp2_sockaddr_union) + /* cid len = */ 1 + \ + NGTCP2_MAX_CIDLEN + sizeof(ngtcp2_tstamp) + /* aead tag = */ 16 + \ + NGTCP2_CRYPTO_TOKEN_RAND_DATALEN) + /** * @macro * @@ -595,13 +642,15 @@ NGTCP2_EXTERN int ngtcp2_crypto_generate_stateless_reset_token( * is a Destination Connection ID in Initial packet sent by client. * |ts| is the timestamp when the token is generated. * + * See also `ngtcp2_crypto_generate_retry_token2`. + * * This function returns the length of generated token if it succeeds, * or -1. */ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_crypto_generate_retry_token( - uint8_t *token, const uint8_t *secret, size_t secretlen, uint32_t version, - const ngtcp2_sockaddr *remote_addr, ngtcp2_socklen remote_addrlen, - const ngtcp2_cid *retry_scid, const ngtcp2_cid *odcid, ngtcp2_tstamp ts); + uint8_t *token, const uint8_t *secret, size_t secretlen, uint32_t version, + const ngtcp2_sockaddr *remote_addr, ngtcp2_socklen remote_addrlen, + const ngtcp2_cid *retry_scid, const ngtcp2_cid *odcid, ngtcp2_tstamp ts); /** * @function @@ -622,10 +671,76 @@ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_crypto_generate_retry_token( * This function returns 0 if it succeeds, or -1. */ NGTCP2_EXTERN int ngtcp2_crypto_verify_retry_token( - ngtcp2_cid *odcid, const uint8_t *token, size_t tokenlen, - const uint8_t *secret, size_t secretlen, uint32_t version, - const ngtcp2_sockaddr *remote_addr, ngtcp2_socklen remote_addrlen, - const ngtcp2_cid *dcid, ngtcp2_duration timeout, ngtcp2_tstamp ts); + ngtcp2_cid *odcid, const uint8_t *token, size_t tokenlen, + const uint8_t *secret, size_t secretlen, uint32_t version, + const ngtcp2_sockaddr *remote_addr, ngtcp2_socklen remote_addrlen, + const ngtcp2_cid *dcid, ngtcp2_duration timeout, ngtcp2_tstamp ts); + +/** + * @function + * + * `ngtcp2_crypto_generate_retry_token2` generates a token in the + * buffer pointed by |token| that is sent with Retry packet. The + * buffer pointed by |token| must have at least + * :macro:`NGTCP2_CRYPTO_MAX_RETRY_TOKENLEN2` bytes long. The + * successfully generated token starts with + * :macro:`NGTCP2_CRYPTO_TOKEN_MAGIC_RETRY2`. |secret| of length + * |secretlen| is a keying material to generate keys to encrypt the + * token. |version| is QUIC version. |remote_addr| of length + * |remote_addrlen| is an address of client. |retry_scid| is a Source + * Connection ID chosen by server, and set in Retry packet. |odcid| + * is a Destination Connection ID in Initial packet sent by client. + * |ts| is the timestamp when the token is generated. + * + * Use this function instead of `ngtcp2_crypto_generate_retry_token` + * if more detailed error handling is required when verifying the + * token. `ngtcp2_crypto_verify_retry_token2` must be used to verify + * the token. + * + * This function returns the length of generated token if it succeeds, + * or -1. + */ +NGTCP2_EXTERN ngtcp2_ssize ngtcp2_crypto_generate_retry_token2( + uint8_t *token, const uint8_t *secret, size_t secretlen, uint32_t version, + const ngtcp2_sockaddr *remote_addr, ngtcp2_socklen remote_addrlen, + const ngtcp2_cid *retry_scid, const ngtcp2_cid *odcid, ngtcp2_tstamp ts); + +/** + * @function + * + * `ngtcp2_crypto_verify_retry_token2` verifies Retry token stored in + * the buffer pointed by |token| of length |tokenlen|. |secret| of + * length |secretlen| is a keying material to generate keys to decrypt + * the token. |version| is QUIC version of the Initial packet that + * contains this token. |remote_addr| of length |remote_addrlen| is + * an address of client. |dcid| is a Destination Connection ID in + * Initial packet sent by client. |timeout| is the period during + * which the token is valid. |ts| is the current timestamp. When + * validation succeeds, the extracted Destination Connection ID (which + * is the Destination Connection ID in Initial packet sent by client + * that triggered Retry packet) is stored in the buffer pointed by + * |odcid|. + * + * The token must be generated by + * `ngtcp2_crypto_generate_retry_token2`. + * + * This function returns 0 if it succeeds, or one of the following + * negative error codes: + * + * :macro:`NGTCP2_CRYPTO_ERR_UNREADABLE_TOKEN` + * A token is badly formatted; or verifying the integrity + * protection failed. + * :macro:`NGTCP2_CRYPTO_ERR_VERIFY_TOKEN` + * A token does not probe the client address; or the token + * validity has expired; or it contains invalid Connection ID. + * :macro:`NGTCP2_CRYPTO_ERR_INTERNAL` + * Internal error occurred. + */ +NGTCP2_EXTERN int ngtcp2_crypto_verify_retry_token2( + ngtcp2_cid *odcid, const uint8_t *token, size_t tokenlen, + const uint8_t *secret, size_t secretlen, uint32_t version, + const ngtcp2_sockaddr *remote_addr, ngtcp2_socklen remote_addrlen, + const ngtcp2_cid *dcid, ngtcp2_duration timeout, ngtcp2_tstamp ts); /** * @function @@ -644,9 +759,9 @@ NGTCP2_EXTERN int ngtcp2_crypto_verify_retry_token( * or -1. */ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_crypto_generate_regular_token( - uint8_t *token, const uint8_t *secret, size_t secretlen, - const ngtcp2_sockaddr *remote_addr, ngtcp2_socklen remote_addrlen, - ngtcp2_tstamp ts); + uint8_t *token, const uint8_t *secret, size_t secretlen, + const ngtcp2_sockaddr *remote_addr, ngtcp2_socklen remote_addrlen, + ngtcp2_tstamp ts); /** * @function @@ -661,9 +776,9 @@ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_crypto_generate_regular_token( * This function returns 0 if it succeeds, or -1. */ NGTCP2_EXTERN int ngtcp2_crypto_verify_regular_token( - const uint8_t *token, size_t tokenlen, const uint8_t *secret, - size_t secretlen, const ngtcp2_sockaddr *remote_addr, - ngtcp2_socklen remote_addrlen, ngtcp2_duration timeout, ngtcp2_tstamp ts); + const uint8_t *token, size_t tokenlen, const uint8_t *secret, + size_t secretlen, const ngtcp2_sockaddr *remote_addr, + ngtcp2_socklen remote_addrlen, ngtcp2_duration timeout, ngtcp2_tstamp ts); /** * @function @@ -685,9 +800,9 @@ NGTCP2_EXTERN int ngtcp2_crypto_verify_regular_token( * This function returns 0 if it succeeds, or -1. */ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_crypto_write_connection_close( - uint8_t *dest, size_t destlen, uint32_t version, const ngtcp2_cid *dcid, - const ngtcp2_cid *scid, uint64_t error_code, const uint8_t *reason, - size_t reasonlen); + uint8_t *dest, size_t destlen, uint32_t version, const ngtcp2_cid *dcid, + const ngtcp2_cid *scid, uint64_t error_code, const uint8_t *reason, + size_t reasonlen); /** * @function @@ -705,9 +820,9 @@ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_crypto_write_connection_close( * This function returns 0 if it succeeds, or -1. */ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_crypto_write_retry( - uint8_t *dest, size_t destlen, uint32_t version, const ngtcp2_cid *dcid, - const ngtcp2_cid *scid, const ngtcp2_cid *odcid, const uint8_t *token, - size_t tokenlen); + uint8_t *dest, size_t destlen, uint32_t version, const ngtcp2_cid *dcid, + const ngtcp2_cid *scid, const ngtcp2_cid *odcid, const uint8_t *token, + size_t tokenlen); /** * @function @@ -759,7 +874,7 @@ ngtcp2_crypto_aead_ctx_free(ngtcp2_crypto_aead_ctx *aead_ctx); * :member:`ngtcp2_callbacks.delete_crypto_aead_ctx` field. */ NGTCP2_EXTERN void ngtcp2_crypto_delete_crypto_aead_ctx_cb( - ngtcp2_conn *conn, ngtcp2_crypto_aead_ctx *aead_ctx, void *user_data); + ngtcp2_conn *conn, ngtcp2_crypto_aead_ctx *aead_ctx, void *user_data); /** * @function @@ -771,7 +886,7 @@ NGTCP2_EXTERN void ngtcp2_crypto_delete_crypto_aead_ctx_cb( * :member:`ngtcp2_callbacks.delete_crypto_cipher_ctx` field. */ NGTCP2_EXTERN void ngtcp2_crypto_delete_crypto_cipher_ctx_cb( - ngtcp2_conn *conn, ngtcp2_crypto_cipher_ctx *cipher_ctx, void *user_data); + ngtcp2_conn *conn, ngtcp2_crypto_cipher_ctx *cipher_ctx, void *user_data); /** * @function @@ -813,7 +928,7 @@ typedef struct ngtcp2_crypto_conn_ref ngtcp2_crypto_conn_ref; * must return non-NULL :type:`ngtcp2_conn` object. */ typedef ngtcp2_conn *(*ngtcp2_crypto_get_conn)( - ngtcp2_crypto_conn_ref *conn_ref); + ngtcp2_crypto_conn_ref *conn_ref); /** * @struct @@ -836,6 +951,6 @@ typedef struct ngtcp2_crypto_conn_ref { #ifdef __cplusplus } -#endif +#endif /* defined(__cplusplus) */ -#endif /* NGTCP2_CRYPTO_H */ +#endif /* !defined(NGTCP2_CRYPTO_H) */ diff --git a/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_boringssl.h b/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_boringssl.h index 43a3c36f03a382..89b26f0bc0e346 100644 --- a/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_boringssl.h +++ b/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_boringssl.h @@ -31,7 +31,7 @@ #ifdef __cplusplus extern "C" { -#endif +#endif /* defined(__cplusplus) */ /** * @function @@ -42,7 +42,7 @@ extern "C" { */ NGTCP2_EXTERN ngtcp2_encryption_level ngtcp2_crypto_boringssl_from_ssl_encryption_level( - enum ssl_encryption_level_t ssl_level); + enum ssl_encryption_level_t ssl_level); /** * @function @@ -53,7 +53,7 @@ ngtcp2_crypto_boringssl_from_ssl_encryption_level( */ NGTCP2_EXTERN enum ssl_encryption_level_t ngtcp2_crypto_boringssl_from_ngtcp2_encryption_level( - ngtcp2_encryption_level encryption_level); + ngtcp2_encryption_level encryption_level); /** * @function @@ -99,6 +99,6 @@ ngtcp2_crypto_boringssl_configure_client_context(SSL_CTX *ssl_ctx); #ifdef __cplusplus } -#endif +#endif /* defined(__cplusplus) */ -#endif /* NGTCP2_CRYPTO_BORINGSSL_H */ +#endif /* !defined(NGTCP2_CRYPTO_BORINGSSL_H) */ diff --git a/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_picotls.h b/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_picotls.h index 61020bb3a8f376..d3f2f978e79923 100644 --- a/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_picotls.h +++ b/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_picotls.h @@ -31,7 +31,7 @@ #ifdef __cplusplus extern "C" { -#endif +#endif /* defined(__cplusplus) */ /** * @struct @@ -79,7 +79,7 @@ ngtcp2_crypto_picotls_from_epoch(size_t epoch); * Picotls backend. */ NGTCP2_EXTERN size_t ngtcp2_crypto_picotls_from_ngtcp2_encryption_level( - ngtcp2_encryption_level encryption_level); + ngtcp2_encryption_level encryption_level); /** * @function @@ -160,7 +160,7 @@ ngtcp2_crypto_picotls_configure_client_context(ptls_context_t *ctx); * It returns 0 if it succeeds, or -1. */ NGTCP2_EXTERN int ngtcp2_crypto_picotls_configure_server_session( - ngtcp2_crypto_picotls_ctx *cptls); + ngtcp2_crypto_picotls_ctx *cptls); /** * @function @@ -224,8 +224,8 @@ ngtcp2_crypto_picotls_deconfigure_session(ngtcp2_crypto_picotls_ctx *cptls); * :macro:`NGTCP2_TLSEXT_QUIC_TRANSPORT_PARAMETERS_V1`. */ NGTCP2_EXTERN int ngtcp2_crypto_picotls_collect_extension( - ptls_t *ptls, struct st_ptls_handshake_properties_t *properties, - uint16_t type); + ptls_t *ptls, struct st_ptls_handshake_properties_t *properties, + uint16_t type); /** * @function @@ -236,11 +236,11 @@ NGTCP2_EXTERN int ngtcp2_crypto_picotls_collect_extension( * extensions are ignored. */ NGTCP2_EXTERN int ngtcp2_crypto_picotls_collected_extensions( - ptls_t *ptls, struct st_ptls_handshake_properties_t *properties, - ptls_raw_extension_t *extensions); + ptls_t *ptls, struct st_ptls_handshake_properties_t *properties, + ptls_raw_extension_t *extensions); #ifdef __cplusplus } -#endif +#endif /* defined(__cplusplus) */ -#endif /* NGTCP2_CRYPTO_PICOTLS_H */ +#endif /* !defined(NGTCP2_CRYPTO_PICOTLS_H) */ diff --git a/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_quictls.h b/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_quictls.h index b25c13b81c8b18..22e3eda0c4160a 100644 --- a/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_quictls.h +++ b/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_quictls.h @@ -31,7 +31,7 @@ #ifdef __cplusplus extern "C" { -#endif +#endif /* defined(__cplusplus) */ /** * @macrosection @@ -70,7 +70,7 @@ extern "C" { */ NGTCP2_EXTERN ngtcp2_encryption_level ngtcp2_crypto_quictls_from_ossl_encryption_level( - OSSL_ENCRYPTION_LEVEL ossl_level); + OSSL_ENCRYPTION_LEVEL ossl_level); /** * @function @@ -81,7 +81,7 @@ ngtcp2_crypto_quictls_from_ossl_encryption_level( */ NGTCP2_EXTERN OSSL_ENCRYPTION_LEVEL ngtcp2_crypto_quictls_from_ngtcp2_encryption_level( - ngtcp2_encryption_level encryption_level); + ngtcp2_encryption_level encryption_level); /** * @function @@ -142,6 +142,6 @@ NGTCP2_EXTERN int ngtcp2_crypto_quictls_init(void); #ifdef __cplusplus } -#endif +#endif /* defined(__cplusplus) */ -#endif /* NGTCP2_CRYPTO_QUICTLS_H */ +#endif /* !defined(NGTCP2_CRYPTO_QUICTLS_H) */ diff --git a/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_wolfssl.h b/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_wolfssl.h index e1d621adce94d8..e95056de5926a9 100644 --- a/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_wolfssl.h +++ b/deps/ngtcp2/ngtcp2/crypto/includes/ngtcp2/ngtcp2_crypto_wolfssl.h @@ -33,7 +33,7 @@ #ifdef __cplusplus extern "C" { -#endif +#endif /* defined(__cplusplus) */ /** * @function @@ -44,7 +44,7 @@ extern "C" { */ NGTCP2_EXTERN ngtcp2_encryption_level ngtcp2_crypto_wolfssl_from_wolfssl_encryption_level( - WOLFSSL_ENCRYPTION_LEVEL wolfssl_level); + WOLFSSL_ENCRYPTION_LEVEL wolfssl_level); /** * @function @@ -55,7 +55,7 @@ ngtcp2_crypto_wolfssl_from_wolfssl_encryption_level( */ NGTCP2_EXTERN WOLFSSL_ENCRYPTION_LEVEL ngtcp2_crypto_wolfssl_from_ngtcp2_encryption_level( - ngtcp2_encryption_level encryption_level); + ngtcp2_encryption_level encryption_level); /** * @function @@ -101,6 +101,6 @@ ngtcp2_crypto_wolfssl_configure_client_context(WOLFSSL_CTX *ssl_ctx); #ifdef __cplusplus } -#endif +#endif /* defined(__cplusplus) */ -#endif /* NGTCP2_CRYPTO_WOLFSSL_H */ +#endif /* !defined(NGTCP2_CRYPTO_WOLFSSL_H) */ diff --git a/deps/ngtcp2/ngtcp2/crypto/picotls/picotls.c b/deps/ngtcp2/ngtcp2/crypto/picotls/picotls.c index 35bfb7b2f8fa19..c3f14f5d444bac 100644 --- a/deps/ngtcp2/ngtcp2/crypto/picotls/picotls.c +++ b/deps/ngtcp2/ngtcp2/crypto/picotls/picotls.c @@ -24,7 +24,7 @@ */ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include #include @@ -79,7 +79,7 @@ crypto_cipher_suite_get_aead_max_encryption(ptls_cipher_suite_t *cs) { if (cs->aead == &ptls_openssl_chacha20poly1305) { return NGTCP2_CRYPTO_MAX_ENCRYPTION_CHACHA20_POLY1305; } -#endif /* PTLS_OPENSSL_HAVE_CHACHA20_POLY1305 */ +#endif /* defined(PTLS_OPENSSL_HAVE_CHACHA20_POLY1305) */ return 0; } @@ -95,7 +95,7 @@ crypto_cipher_suite_get_aead_max_decryption_failure(ptls_cipher_suite_t *cs) { if (cs->aead == &ptls_openssl_chacha20poly1305) { return NGTCP2_CRYPTO_MAX_DECRYPTION_FAILURE_CHACHA20_POLY1305; } -#endif /* PTLS_OPENSSL_HAVE_CHACHA20_POLY1305 */ +#endif /* defined(PTLS_OPENSSL_HAVE_CHACHA20_POLY1305) */ return 0; } @@ -114,7 +114,7 @@ crypto_cipher_suite_get_hp(ptls_cipher_suite_t *cs) { if (cs->aead == &ptls_openssl_chacha20poly1305) { return &ptls_openssl_chacha20; } -#endif /* PTLS_OPENSSL_HAVE_CHACHA20_POLY1305 */ +#endif /* defined(PTLS_OPENSSL_HAVE_CHACHA20_POLY1305) */ return NULL; } @@ -124,7 +124,7 @@ static int supported_cipher_suite(ptls_cipher_suite_t *cs) { cs->aead == &ptls_openssl_aes256gcm #ifdef PTLS_OPENSSL_HAVE_CHACHA20_POLY1305 || cs->aead == &ptls_openssl_chacha20poly1305 -#endif /* PTLS_OPENSSL_HAVE_CHACHA20_POLY1305 */ +#endif /* defined(PTLS_OPENSSL_HAVE_CHACHA20_POLY1305) */ ; } diff --git a/deps/ngtcp2/ngtcp2/crypto/quictls/quictls.c b/deps/ngtcp2/ngtcp2/crypto/quictls/quictls.c index 330ca687b44666..592e5a86535356 100644 --- a/deps/ngtcp2/ngtcp2/crypto/quictls/quictls.c +++ b/deps/ngtcp2/ngtcp2/crypto/quictls/quictls.c @@ -24,7 +24,7 @@ */ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -339,7 +339,7 @@ static ngtcp2_crypto_ctx *crypto_ctx_cipher_id(ngtcp2_crypto_ctx *ctx, ctx->hp.native_handle = (void *)crypto_cipher_id_get_hp(cipher_id); ctx->max_encryption = crypto_cipher_id_get_aead_max_encryption(cipher_id); ctx->max_decryption_failure = - crypto_cipher_id_get_aead_max_decryption_failure(cipher_id); + crypto_cipher_id_get_aead_max_decryption_failure(cipher_id); return ctx; } @@ -527,14 +527,14 @@ int ngtcp2_crypto_hkdf_extract(uint8_t *dest, const ngtcp2_crypto_md *md, EVP_KDF_CTX *kctx = EVP_KDF_CTX_new(kdf); int mode = EVP_KDF_HKDF_MODE_EXTRACT_ONLY; OSSL_PARAM params[] = { - OSSL_PARAM_construct_int(OSSL_KDF_PARAM_MODE, &mode), - OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_DIGEST, - (char *)EVP_MD_get0_name(prf), 0), - OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_KEY, (void *)secret, - secretlen), - OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SALT, (void *)salt, - saltlen), - OSSL_PARAM_construct_end(), + OSSL_PARAM_construct_int(OSSL_KDF_PARAM_MODE, &mode), + OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_DIGEST, + (char *)EVP_MD_get0_name(prf), 0), + OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_KEY, (void *)secret, + secretlen), + OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SALT, (void *)salt, + saltlen), + OSSL_PARAM_construct_end(), }; int rv = 0; @@ -584,14 +584,14 @@ int ngtcp2_crypto_hkdf_expand(uint8_t *dest, size_t destlen, EVP_KDF_CTX *kctx = EVP_KDF_CTX_new(kdf); int mode = EVP_KDF_HKDF_MODE_EXPAND_ONLY; OSSL_PARAM params[] = { - OSSL_PARAM_construct_int(OSSL_KDF_PARAM_MODE, &mode), - OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_DIGEST, - (char *)EVP_MD_get0_name(prf), 0), - OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_KEY, (void *)secret, - secretlen), - OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_INFO, (void *)info, - infolen), - OSSL_PARAM_construct_end(), + OSSL_PARAM_construct_int(OSSL_KDF_PARAM_MODE, &mode), + OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_DIGEST, + (char *)EVP_MD_get0_name(prf), 0), + OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_KEY, (void *)secret, + secretlen), + OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_INFO, (void *)info, + infolen), + OSSL_PARAM_construct_end(), }; int rv = 0; @@ -639,15 +639,15 @@ int ngtcp2_crypto_hkdf(uint8_t *dest, size_t destlen, EVP_KDF *kdf = crypto_kdf_hkdf(); EVP_KDF_CTX *kctx = EVP_KDF_CTX_new(kdf); OSSL_PARAM params[] = { - OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_DIGEST, - (char *)EVP_MD_get0_name(prf), 0), - OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_KEY, (void *)secret, - secretlen), - OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SALT, (void *)salt, - saltlen), - OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_INFO, (void *)info, - infolen), - OSSL_PARAM_construct_end(), + OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_DIGEST, + (char *)EVP_MD_get0_name(prf), 0), + OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_KEY, (void *)secret, + secretlen), + OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SALT, (void *)salt, + saltlen), + OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_INFO, (void *)info, + infolen), + OSSL_PARAM_construct_end(), }; int rv = 0; @@ -672,7 +672,7 @@ int ngtcp2_crypto_hkdf(uint8_t *dest, size_t destlen, if (EVP_PKEY_derive_init(pctx) != 1 || EVP_PKEY_CTX_hkdf_mode(pctx, EVP_PKEY_HKDEF_MODE_EXTRACT_AND_EXPAND) != - 1 || + 1 || EVP_PKEY_CTX_set_hkdf_md(pctx, prf) != 1 || EVP_PKEY_CTX_set1_hkdf_salt(pctx, salt, (int)saltlen) != 1 || EVP_PKEY_CTX_set1_hkdf_key(pctx, secret, (int)secretlen) != 1 || @@ -699,9 +699,9 @@ int ngtcp2_crypto_encrypt(uint8_t *dest, const ngtcp2_crypto_aead *aead, int len; #if OPENSSL_VERSION_NUMBER >= 0x30000000L OSSL_PARAM params[] = { - OSSL_PARAM_construct_octet_string(OSSL_CIPHER_PARAM_AEAD_TAG, - dest + plaintextlen, taglen), - OSSL_PARAM_construct_end(), + OSSL_PARAM_construct_octet_string(OSSL_CIPHER_PARAM_AEAD_TAG, + dest + plaintextlen, taglen), + OSSL_PARAM_construct_end(), }; #endif /* OPENSSL_VERSION_NUMBER >= 0x30000000L */ @@ -794,16 +794,16 @@ int ngtcp2_crypto_hp_mask(uint8_t *dest, const ngtcp2_crypto_cipher *hp, } int ngtcp2_crypto_read_write_crypto_data( - ngtcp2_conn *conn, ngtcp2_encryption_level encryption_level, - const uint8_t *data, size_t datalen) { + ngtcp2_conn *conn, ngtcp2_encryption_level encryption_level, + const uint8_t *data, size_t datalen) { SSL *ssl = ngtcp2_conn_get_tls_native_handle(conn); int rv; int err; if (SSL_provide_quic_data( - ssl, - ngtcp2_crypto_quictls_from_ngtcp2_encryption_level(encryption_level), - data, datalen) != 1) { + ssl, + ngtcp2_crypto_quictls_from_ngtcp2_encryption_level(encryption_level), + data, datalen) != 1) { return -1; } @@ -874,7 +874,7 @@ int ngtcp2_crypto_set_local_transport_params(void *tls, const uint8_t *buf, } ngtcp2_encryption_level ngtcp2_crypto_quictls_from_ossl_encryption_level( - OSSL_ENCRYPTION_LEVEL ossl_level) { + OSSL_ENCRYPTION_LEVEL ossl_level) { switch (ossl_level) { case ssl_encryption_initial: return NGTCP2_ENCRYPTION_LEVEL_INITIAL; @@ -892,7 +892,7 @@ ngtcp2_encryption_level ngtcp2_crypto_quictls_from_ossl_encryption_level( OSSL_ENCRYPTION_LEVEL ngtcp2_crypto_quictls_from_ngtcp2_encryption_level( - ngtcp2_encryption_level encryption_level) { + ngtcp2_encryption_level encryption_level) { switch (encryption_level) { case NGTCP2_ENCRYPTION_LEVEL_INITIAL: return ssl_encryption_initial; @@ -934,7 +934,7 @@ static int set_encryption_secrets(SSL *ssl, OSSL_ENCRYPTION_LEVEL ossl_level, ngtcp2_crypto_conn_ref *conn_ref = SSL_get_app_data(ssl); ngtcp2_conn *conn = conn_ref->get_conn(conn_ref); ngtcp2_encryption_level level = - ngtcp2_crypto_quictls_from_ossl_encryption_level(ossl_level); + ngtcp2_crypto_quictls_from_ossl_encryption_level(ossl_level); if (rx_secret && ngtcp2_crypto_derive_and_install_rx_key(conn, NULL, NULL, NULL, level, @@ -956,7 +956,7 @@ static int add_handshake_data(SSL *ssl, OSSL_ENCRYPTION_LEVEL ossl_level, ngtcp2_crypto_conn_ref *conn_ref = SSL_get_app_data(ssl); ngtcp2_conn *conn = conn_ref->get_conn(conn_ref); ngtcp2_encryption_level level = - ngtcp2_crypto_quictls_from_ossl_encryption_level(ossl_level); + ngtcp2_crypto_quictls_from_ossl_encryption_level(ossl_level); int rv; rv = ngtcp2_conn_submit_crypto_data(conn, level, data, datalen); @@ -973,8 +973,7 @@ static int flush_flight(SSL *ssl) { return 1; } -static int send_alert(SSL *ssl, enum ssl_encryption_level_t level, - uint8_t alert) { +static int send_alert(SSL *ssl, OSSL_ENCRYPTION_LEVEL level, uint8_t alert) { ngtcp2_crypto_conn_ref *conn_ref = SSL_get_app_data(ssl); ngtcp2_conn *conn = conn_ref->get_conn(conn_ref); (void)level; @@ -985,14 +984,14 @@ static int send_alert(SSL *ssl, enum ssl_encryption_level_t level, } static SSL_QUIC_METHOD quic_method = { - set_encryption_secrets, - add_handshake_data, - flush_flight, - send_alert, + set_encryption_secrets, + add_handshake_data, + flush_flight, + send_alert, #ifdef LIBRESSL_VERSION_NUMBER - NULL, - NULL, -#endif /* LIBRESSL_VERSION_NUMBER */ + NULL, + NULL, +#endif /* defined(LIBRESSL_VERSION_NUMBER) */ }; static void crypto_quictls_configure_context(SSL_CTX *ssl_ctx) { diff --git a/deps/ngtcp2/ngtcp2/crypto/shared.c b/deps/ngtcp2/ngtcp2/crypto/shared.c index 162094a375cb8b..98cd4de7e8097d 100644 --- a/deps/ngtcp2/ngtcp2/crypto/shared.c +++ b/deps/ngtcp2/ngtcp2/crypto/shared.c @@ -27,9 +27,9 @@ #ifdef WIN32 # include # include -#else +#elif defined(HAVE_NETINET_IN_H) # include -#endif +#endif /* defined(HAVE_NETINET_IN_H) */ #include #include @@ -110,13 +110,11 @@ int ngtcp2_crypto_derive_initial_secrets(uint8_t *rx_secret, uint8_t *tx_secret, } if (ngtcp2_crypto_hkdf_expand_label( - client_secret, NGTCP2_CRYPTO_INITIAL_SECRETLEN, &ctx.md, - initial_secret, NGTCP2_CRYPTO_INITIAL_SECRETLEN, CLABEL, - sizeof(CLABEL) - 1) != 0 || + client_secret, NGTCP2_CRYPTO_INITIAL_SECRETLEN, &ctx.md, initial_secret, + NGTCP2_CRYPTO_INITIAL_SECRETLEN, CLABEL, sizeof(CLABEL) - 1) != 0 || ngtcp2_crypto_hkdf_expand_label( - server_secret, NGTCP2_CRYPTO_INITIAL_SECRETLEN, &ctx.md, - initial_secret, NGTCP2_CRYPTO_INITIAL_SECRETLEN, SLABEL, - sizeof(SLABEL) - 1) != 0) { + server_secret, NGTCP2_CRYPTO_INITIAL_SECRETLEN, &ctx.md, initial_secret, + NGTCP2_CRYPTO_INITIAL_SECRETLEN, SLABEL, sizeof(SLABEL) - 1) != 0) { return -1; } @@ -125,13 +123,13 @@ int ngtcp2_crypto_derive_initial_secrets(uint8_t *rx_secret, uint8_t *tx_secret, size_t ngtcp2_crypto_packet_protection_ivlen(const ngtcp2_crypto_aead *aead) { size_t noncelen = ngtcp2_crypto_aead_noncelen(aead); - return ngtcp2_max(8, noncelen); + return ngtcp2_max_size(8, noncelen); } int ngtcp2_crypto_derive_packet_protection_key( - uint8_t *key, uint8_t *iv, uint8_t *hp_key, uint32_t version, - const ngtcp2_crypto_aead *aead, const ngtcp2_crypto_md *md, - const uint8_t *secret, size_t secretlen) { + uint8_t *key, uint8_t *iv, uint8_t *hp_key, uint32_t version, + const ngtcp2_crypto_aead *aead, const ngtcp2_crypto_md *md, + const uint8_t *secret, size_t secretlen) { static const uint8_t KEY_LABEL_V1[] = "quic key"; static const uint8_t IV_LABEL_V1[] = "quic iv"; static const uint8_t HP_KEY_LABEL_V1[] = "quic hp"; @@ -305,8 +303,8 @@ int ngtcp2_crypto_derive_and_install_rx_key(ngtcp2_conn *conn, uint8_t *key, } break; case NGTCP2_ENCRYPTION_LEVEL_HANDSHAKE: - rv = ngtcp2_conn_install_rx_handshake_key(conn, &aead_ctx, iv, ivlen, - &hp_ctx); + rv = + ngtcp2_conn_install_rx_handshake_key(conn, &aead_ctx, iv, ivlen, &hp_ctx); if (rv != 0) { goto fail; } @@ -455,8 +453,8 @@ int ngtcp2_crypto_derive_and_install_tx_key(ngtcp2_conn *conn, uint8_t *key, } break; case NGTCP2_ENCRYPTION_LEVEL_HANDSHAKE: - rv = ngtcp2_conn_install_tx_handshake_key(conn, &aead_ctx, iv, ivlen, - &hp_ctx); + rv = + ngtcp2_conn_install_tx_handshake_key(conn, &aead_ctx, iv, ivlen, &hp_ctx); if (rv != 0) { goto fail; } @@ -489,10 +487,10 @@ int ngtcp2_crypto_derive_and_install_tx_key(ngtcp2_conn *conn, uint8_t *key, } int ngtcp2_crypto_derive_and_install_initial_key( - ngtcp2_conn *conn, uint8_t *rx_secret, uint8_t *tx_secret, - uint8_t *initial_secret, uint8_t *rx_key, uint8_t *rx_iv, - uint8_t *rx_hp_key, uint8_t *tx_key, uint8_t *tx_iv, uint8_t *tx_hp_key, - uint32_t version, const ngtcp2_cid *client_dcid) { + ngtcp2_conn *conn, uint8_t *rx_secret, uint8_t *tx_secret, + uint8_t *initial_secret, uint8_t *rx_key, uint8_t *rx_iv, uint8_t *rx_hp_key, + uint8_t *tx_key, uint8_t *tx_iv, uint8_t *tx_hp_key, uint32_t version, + const ngtcp2_cid *client_dcid) { uint8_t rx_secretbuf[NGTCP2_CRYPTO_INITIAL_SECRETLEN]; uint8_t tx_secretbuf[NGTCP2_CRYPTO_INITIAL_SECRETLEN]; uint8_t initial_secretbuf[NGTCP2_CRYPTO_INITIAL_SECRETLEN]; @@ -548,21 +546,20 @@ int ngtcp2_crypto_derive_and_install_initial_key( ngtcp2_conn_set_initial_crypto_ctx(conn, &ctx); if (ngtcp2_crypto_derive_initial_secrets( - rx_secret, tx_secret, initial_secret, version, client_dcid, - server ? NGTCP2_CRYPTO_SIDE_SERVER : NGTCP2_CRYPTO_SIDE_CLIENT) != - 0) { + rx_secret, tx_secret, initial_secret, version, client_dcid, + server ? NGTCP2_CRYPTO_SIDE_SERVER : NGTCP2_CRYPTO_SIDE_CLIENT) != 0) { return -1; } if (ngtcp2_crypto_derive_packet_protection_key( - rx_key, rx_iv, rx_hp_key, version, &ctx.aead, &ctx.md, rx_secret, - NGTCP2_CRYPTO_INITIAL_SECRETLEN) != 0) { + rx_key, rx_iv, rx_hp_key, version, &ctx.aead, &ctx.md, rx_secret, + NGTCP2_CRYPTO_INITIAL_SECRETLEN) != 0) { return -1; } if (ngtcp2_crypto_derive_packet_protection_key( - tx_key, tx_iv, tx_hp_key, version, &ctx.aead, &ctx.md, tx_secret, - NGTCP2_CRYPTO_INITIAL_SECRETLEN) != 0) { + tx_key, tx_iv, tx_hp_key, version, &ctx.aead, &ctx.md, tx_secret, + NGTCP2_CRYPTO_INITIAL_SECRETLEN) != 0) { return -1; } @@ -631,10 +628,10 @@ int ngtcp2_crypto_derive_and_install_initial_key( } int ngtcp2_crypto_derive_and_install_vneg_initial_key( - ngtcp2_conn *conn, uint8_t *rx_secret, uint8_t *tx_secret, - uint8_t *initial_secret, uint8_t *rx_key, uint8_t *rx_iv, - uint8_t *rx_hp_key, uint8_t *tx_key, uint8_t *tx_iv, uint8_t *tx_hp_key, - uint32_t version, const ngtcp2_cid *client_dcid) { + ngtcp2_conn *conn, uint8_t *rx_secret, uint8_t *tx_secret, + uint8_t *initial_secret, uint8_t *rx_key, uint8_t *rx_iv, uint8_t *rx_hp_key, + uint8_t *tx_key, uint8_t *tx_iv, uint8_t *tx_hp_key, uint32_t version, + const ngtcp2_cid *client_dcid) { uint8_t rx_secretbuf[NGTCP2_CRYPTO_INITIAL_SECRETLEN]; uint8_t tx_secretbuf[NGTCP2_CRYPTO_INITIAL_SECRETLEN]; uint8_t initial_secretbuf[NGTCP2_CRYPTO_INITIAL_SECRETLEN]; @@ -682,21 +679,20 @@ int ngtcp2_crypto_derive_and_install_vneg_initial_key( } if (ngtcp2_crypto_derive_initial_secrets( - rx_secret, tx_secret, initial_secret, version, client_dcid, - server ? NGTCP2_CRYPTO_SIDE_SERVER : NGTCP2_CRYPTO_SIDE_CLIENT) != - 0) { + rx_secret, tx_secret, initial_secret, version, client_dcid, + server ? NGTCP2_CRYPTO_SIDE_SERVER : NGTCP2_CRYPTO_SIDE_CLIENT) != 0) { return -1; } if (ngtcp2_crypto_derive_packet_protection_key( - rx_key, rx_iv, rx_hp_key, version, &ctx->aead, &ctx->md, rx_secret, - NGTCP2_CRYPTO_INITIAL_SECRETLEN) != 0) { + rx_key, rx_iv, rx_hp_key, version, &ctx->aead, &ctx->md, rx_secret, + NGTCP2_CRYPTO_INITIAL_SECRETLEN) != 0) { return -1; } if (ngtcp2_crypto_derive_packet_protection_key( - tx_key, tx_iv, tx_hp_key, version, &ctx->aead, &ctx->md, tx_secret, - NGTCP2_CRYPTO_INITIAL_SECRETLEN) != 0) { + tx_key, tx_iv, tx_hp_key, version, &ctx->aead, &ctx->md, tx_secret, + NGTCP2_CRYPTO_INITIAL_SECRETLEN) != 0) { return -1; } @@ -721,8 +717,8 @@ int ngtcp2_crypto_derive_and_install_vneg_initial_key( } rv = ngtcp2_conn_install_vneg_initial_key( - conn, version, &rx_aead_ctx, rx_iv, &rx_hp_ctx, &tx_aead_ctx, tx_iv, - &tx_hp_ctx, NGTCP2_CRYPTO_INITIAL_IVLEN); + conn, version, &rx_aead_ctx, rx_iv, &rx_hp_ctx, &tx_aead_ctx, tx_iv, + &tx_hp_ctx, NGTCP2_CRYPTO_INITIAL_IVLEN); if (rv != 0) { goto fail; } @@ -739,11 +735,11 @@ int ngtcp2_crypto_derive_and_install_vneg_initial_key( } int ngtcp2_crypto_update_key( - ngtcp2_conn *conn, uint8_t *rx_secret, uint8_t *tx_secret, - ngtcp2_crypto_aead_ctx *rx_aead_ctx, uint8_t *rx_key, uint8_t *rx_iv, - ngtcp2_crypto_aead_ctx *tx_aead_ctx, uint8_t *tx_key, uint8_t *tx_iv, - const uint8_t *current_rx_secret, const uint8_t *current_tx_secret, - size_t secretlen) { + ngtcp2_conn *conn, uint8_t *rx_secret, uint8_t *tx_secret, + ngtcp2_crypto_aead_ctx *rx_aead_ctx, uint8_t *rx_key, uint8_t *rx_iv, + ngtcp2_crypto_aead_ctx *tx_aead_ctx, uint8_t *tx_key, uint8_t *tx_iv, + const uint8_t *current_rx_secret, const uint8_t *current_tx_secret, + size_t secretlen) { const ngtcp2_crypto_ctx *ctx = ngtcp2_conn_get_crypto_ctx(conn); const ngtcp2_crypto_aead *aead = &ctx->aead; const ngtcp2_crypto_md *md = &ctx->md; @@ -756,7 +752,7 @@ int ngtcp2_crypto_update_key( } if (ngtcp2_crypto_derive_packet_protection_key( - rx_key, rx_iv, NULL, version, aead, md, rx_secret, secretlen) != 0) { + rx_key, rx_iv, NULL, version, aead, md, rx_secret, secretlen) != 0) { return -1; } @@ -766,7 +762,7 @@ int ngtcp2_crypto_update_key( } if (ngtcp2_crypto_derive_packet_protection_key( - tx_key, tx_iv, NULL, version, aead, md, tx_secret, secretlen) != 0) { + tx_key, tx_iv, NULL, version, aead, md, tx_secret, secretlen) != 0) { return -1; } @@ -819,20 +815,19 @@ int ngtcp2_crypto_hp_mask_cb(uint8_t *dest, const ngtcp2_crypto_cipher *hp, } int ngtcp2_crypto_update_key_cb( - ngtcp2_conn *conn, uint8_t *rx_secret, uint8_t *tx_secret, - ngtcp2_crypto_aead_ctx *rx_aead_ctx, uint8_t *rx_iv, - ngtcp2_crypto_aead_ctx *tx_aead_ctx, uint8_t *tx_iv, - const uint8_t *current_rx_secret, const uint8_t *current_tx_secret, - size_t secretlen, void *user_data) { + ngtcp2_conn *conn, uint8_t *rx_secret, uint8_t *tx_secret, + ngtcp2_crypto_aead_ctx *rx_aead_ctx, uint8_t *rx_iv, + ngtcp2_crypto_aead_ctx *tx_aead_ctx, uint8_t *tx_iv, + const uint8_t *current_rx_secret, const uint8_t *current_tx_secret, + size_t secretlen, void *user_data) { uint8_t rx_key[64]; uint8_t tx_key[64]; (void)conn; (void)user_data; - if (ngtcp2_crypto_update_key(conn, rx_secret, tx_secret, rx_aead_ctx, rx_key, - rx_iv, tx_aead_ctx, tx_key, tx_iv, - current_rx_secret, current_tx_secret, - secretlen) != 0) { + if (ngtcp2_crypto_update_key( + conn, rx_secret, tx_secret, rx_aead_ctx, rx_key, rx_iv, tx_aead_ctx, + tx_key, tx_iv, current_rx_secret, current_tx_secret, secretlen) != 0) { return NGTCP2_ERR_CALLBACK_FAILURE; } return 0; @@ -920,13 +915,14 @@ static size_t crypto_generate_retry_token_aad(uint8_t *dest, uint32_t version, static const uint8_t retry_token_info_prefix[] = "retry_token"; ngtcp2_ssize ngtcp2_crypto_generate_retry_token( - uint8_t *token, const uint8_t *secret, size_t secretlen, uint32_t version, - const ngtcp2_sockaddr *remote_addr, ngtcp2_socklen remote_addrlen, - const ngtcp2_cid *retry_scid, const ngtcp2_cid *odcid, ngtcp2_tstamp ts) { - uint8_t plaintext[NGTCP2_CRYPTO_MAX_RETRY_TOKENLEN]; + uint8_t *token, const uint8_t *secret, size_t secretlen, uint32_t version, + const ngtcp2_sockaddr *remote_addr, ngtcp2_socklen remote_addrlen, + const ngtcp2_cid *retry_scid, const ngtcp2_cid *odcid, ngtcp2_tstamp ts) { + uint8_t + plaintext[/* cid len = */ 1 + NGTCP2_MAX_CIDLEN + sizeof(ngtcp2_tstamp)]; uint8_t rand_data[NGTCP2_CRYPTO_TOKEN_RAND_DATALEN]; - uint8_t key[32]; - uint8_t iv[32]; + uint8_t key[16]; + uint8_t iv[12]; size_t keylen; size_t ivlen; ngtcp2_crypto_aead aead; @@ -934,7 +930,7 @@ ngtcp2_ssize ngtcp2_crypto_generate_retry_token( ngtcp2_crypto_aead_ctx aead_ctx; size_t plaintextlen; uint8_t - aad[sizeof(version) + sizeof(ngtcp2_sockaddr_union) + NGTCP2_MAX_CIDLEN]; + aad[sizeof(version) + sizeof(ngtcp2_sockaddr_union) + NGTCP2_MAX_CIDLEN]; size_t aadlen; uint8_t *p = plaintext; ngtcp2_tstamp ts_be = ngtcp2_htonl64(ts); @@ -962,8 +958,8 @@ ngtcp2_ssize ngtcp2_crypto_generate_retry_token( keylen = ngtcp2_crypto_aead_keylen(&aead); ivlen = ngtcp2_crypto_aead_noncelen(&aead); - assert(sizeof(key) >= keylen); - assert(sizeof(iv) >= ivlen); + assert(sizeof(key) == keylen); + assert(sizeof(iv) == ivlen); if (crypto_derive_token_key(key, keylen, iv, ivlen, &md, secret, secretlen, rand_data, sizeof(rand_data), @@ -999,21 +995,21 @@ ngtcp2_ssize ngtcp2_crypto_generate_retry_token( } int ngtcp2_crypto_verify_retry_token( - ngtcp2_cid *odcid, const uint8_t *token, size_t tokenlen, - const uint8_t *secret, size_t secretlen, uint32_t version, - const ngtcp2_sockaddr *remote_addr, ngtcp2_socklen remote_addrlen, - const ngtcp2_cid *dcid, ngtcp2_duration timeout, ngtcp2_tstamp ts) { + ngtcp2_cid *odcid, const uint8_t *token, size_t tokenlen, + const uint8_t *secret, size_t secretlen, uint32_t version, + const ngtcp2_sockaddr *remote_addr, ngtcp2_socklen remote_addrlen, + const ngtcp2_cid *dcid, ngtcp2_duration timeout, ngtcp2_tstamp ts) { uint8_t - plaintext[/* cid len = */ 1 + NGTCP2_MAX_CIDLEN + sizeof(ngtcp2_tstamp)]; - uint8_t key[32]; - uint8_t iv[32]; + plaintext[/* cid len = */ 1 + NGTCP2_MAX_CIDLEN + sizeof(ngtcp2_tstamp)]; + uint8_t key[16]; + uint8_t iv[12]; size_t keylen; size_t ivlen; ngtcp2_crypto_aead_ctx aead_ctx; ngtcp2_crypto_aead aead; ngtcp2_crypto_md md; uint8_t - aad[sizeof(version) + sizeof(ngtcp2_sockaddr_union) + NGTCP2_MAX_CIDLEN]; + aad[sizeof(version) + sizeof(ngtcp2_sockaddr_union) + NGTCP2_MAX_CIDLEN]; size_t aadlen; const uint8_t *rand_data; const uint8_t *ciphertext; @@ -1039,6 +1035,9 @@ int ngtcp2_crypto_verify_retry_token( keylen = ngtcp2_crypto_aead_keylen(&aead); ivlen = ngtcp2_crypto_aead_noncelen(&aead); + assert(sizeof(key) == keylen); + assert(sizeof(iv) == ivlen); + if (crypto_derive_token_key(key, keylen, iv, ivlen, &md, secret, secretlen, rand_data, NGTCP2_CRYPTO_TOKEN_RAND_DATALEN, retry_token_info_prefix, @@ -1081,6 +1080,206 @@ int ngtcp2_crypto_verify_retry_token( return 0; } +static size_t crypto_generate_retry_token_aad2(uint8_t *dest, uint32_t version, + const ngtcp2_cid *retry_scid) { + uint8_t *p = dest; + + version = ngtcp2_htonl(version); + memcpy(p, &version, sizeof(version)); + p += sizeof(version); + memcpy(p, retry_scid->data, retry_scid->datalen); + p += retry_scid->datalen; + + return (size_t)(p - dest); +} + +static const uint8_t retry_token_info_prefix2[] = "retry_token2"; + +ngtcp2_ssize ngtcp2_crypto_generate_retry_token2( + uint8_t *token, const uint8_t *secret, size_t secretlen, uint32_t version, + const ngtcp2_sockaddr *remote_addr, ngtcp2_socklen remote_addrlen, + const ngtcp2_cid *retry_scid, const ngtcp2_cid *odcid, ngtcp2_tstamp ts) { + uint8_t plaintext[sizeof(ngtcp2_sockaddr_union) + /* cid len = */ 1 + + NGTCP2_MAX_CIDLEN + sizeof(ngtcp2_tstamp)]; + uint8_t rand_data[NGTCP2_CRYPTO_TOKEN_RAND_DATALEN]; + uint8_t key[16]; + uint8_t iv[12]; + size_t keylen; + size_t ivlen; + ngtcp2_crypto_aead aead; + ngtcp2_crypto_md md; + ngtcp2_crypto_aead_ctx aead_ctx; + uint8_t aad[sizeof(version) + NGTCP2_MAX_CIDLEN]; + size_t aadlen; + uint8_t *p = plaintext; + ngtcp2_tstamp ts_be = ngtcp2_htonl64(ts); + int rv; + + assert((size_t)remote_addrlen <= sizeof(ngtcp2_sockaddr_union)); + + memset(plaintext, 0, sizeof(plaintext)); + + memcpy(p, remote_addr, (size_t)remote_addrlen); + p += sizeof(ngtcp2_sockaddr_union); + *p++ = (uint8_t)odcid->datalen; + memcpy(p, odcid->data, odcid->datalen); + p += NGTCP2_MAX_CIDLEN; + memcpy(p, &ts_be, sizeof(ts_be)); + + assert((size_t)(p + sizeof(ts_be) - plaintext) == sizeof(plaintext)); + + if (ngtcp2_crypto_random(rand_data, sizeof(rand_data)) != 0) { + return -1; + } + + ngtcp2_crypto_aead_aes_128_gcm(&aead); + ngtcp2_crypto_md_sha256(&md); + + keylen = ngtcp2_crypto_aead_keylen(&aead); + ivlen = ngtcp2_crypto_aead_noncelen(&aead); + + assert(sizeof(key) == keylen); + assert(sizeof(iv) == ivlen); + + if (crypto_derive_token_key(key, keylen, iv, ivlen, &md, secret, secretlen, + rand_data, sizeof(rand_data), + retry_token_info_prefix2, + sizeof(retry_token_info_prefix2) - 1) != 0) { + return -1; + } + + aadlen = crypto_generate_retry_token_aad2(aad, version, retry_scid); + + p = token; + *p++ = NGTCP2_CRYPTO_TOKEN_MAGIC_RETRY2; + + if (ngtcp2_crypto_aead_ctx_encrypt_init(&aead_ctx, &aead, key, ivlen) != 0) { + return -1; + } + + rv = ngtcp2_crypto_encrypt(p, &aead, &aead_ctx, plaintext, sizeof(plaintext), + iv, ivlen, aad, aadlen); + + ngtcp2_crypto_aead_ctx_free(&aead_ctx); + + if (rv != 0) { + return -1; + } + + p += sizeof(plaintext) + aead.max_overhead; + memcpy(p, rand_data, sizeof(rand_data)); + p += sizeof(rand_data); + + return p - token; +} + +int ngtcp2_crypto_verify_retry_token2( + ngtcp2_cid *odcid, const uint8_t *token, size_t tokenlen, + const uint8_t *secret, size_t secretlen, uint32_t version, + const ngtcp2_sockaddr *remote_addr, ngtcp2_socklen remote_addrlen, + const ngtcp2_cid *dcid, ngtcp2_duration timeout, ngtcp2_tstamp ts) { + uint8_t plaintext[sizeof(ngtcp2_sockaddr_union) + /* cid len = */ 1 + + NGTCP2_MAX_CIDLEN + sizeof(ngtcp2_tstamp)]; + uint8_t key[16]; + uint8_t iv[12]; + size_t keylen; + size_t ivlen; + ngtcp2_crypto_aead_ctx aead_ctx; + ngtcp2_crypto_aead aead; + ngtcp2_crypto_md md; + uint8_t aad[sizeof(version) + NGTCP2_MAX_CIDLEN]; + size_t aadlen; + const uint8_t *rand_data; + const uint8_t *ciphertext; + size_t ciphertextlen; + size_t cil; + int rv; + ngtcp2_tstamp gen_ts; + ngtcp2_sockaddr_union addr; + size_t addrlen; + uint8_t *p; + + assert((size_t)remote_addrlen <= sizeof(ngtcp2_sockaddr_union)); + + if (tokenlen != NGTCP2_CRYPTO_MAX_RETRY_TOKENLEN2 || + token[0] != NGTCP2_CRYPTO_TOKEN_MAGIC_RETRY2) { + return NGTCP2_CRYPTO_ERR_UNREADABLE_TOKEN; + } + + rand_data = token + tokenlen - NGTCP2_CRYPTO_TOKEN_RAND_DATALEN; + ciphertext = token + 1; + ciphertextlen = (size_t)(rand_data - ciphertext); + + ngtcp2_crypto_aead_aes_128_gcm(&aead); + ngtcp2_crypto_md_sha256(&md); + + keylen = ngtcp2_crypto_aead_keylen(&aead); + ivlen = ngtcp2_crypto_aead_noncelen(&aead); + + assert(sizeof(key) == keylen); + assert(sizeof(iv) == ivlen); + + if (crypto_derive_token_key(key, keylen, iv, ivlen, &md, secret, secretlen, + rand_data, NGTCP2_CRYPTO_TOKEN_RAND_DATALEN, + retry_token_info_prefix2, + sizeof(retry_token_info_prefix2) - 1) != 0) { + return NGTCP2_CRYPTO_ERR_INTERNAL; + } + + aadlen = crypto_generate_retry_token_aad2(aad, version, dcid); + + if (ngtcp2_crypto_aead_ctx_decrypt_init(&aead_ctx, &aead, key, ivlen) != 0) { + return NGTCP2_CRYPTO_ERR_INTERNAL; + } + + rv = ngtcp2_crypto_decrypt(plaintext, &aead, &aead_ctx, ciphertext, + ciphertextlen, iv, ivlen, aad, aadlen); + + ngtcp2_crypto_aead_ctx_free(&aead_ctx); + + if (rv != 0) { + return NGTCP2_CRYPTO_ERR_UNREADABLE_TOKEN; + } + + p = plaintext; + + memcpy(&addr, p, sizeof(addr)); + + switch (addr.sa.sa_family) { + case NGTCP2_AF_INET: + addrlen = sizeof(ngtcp2_sockaddr_in); + break; + case NGTCP2_AF_INET6: + addrlen = sizeof(ngtcp2_sockaddr_in6); + break; + default: + return NGTCP2_CRYPTO_ERR_VERIFY_TOKEN; + } + + if (addrlen != (size_t)remote_addrlen || + memcmp(&addr, remote_addr, addrlen) != 0) { + return NGTCP2_CRYPTO_ERR_VERIFY_TOKEN; + } + + p += sizeof(addr); + cil = *p++; + + if (cil != 0 && (cil < NGTCP2_MIN_CIDLEN || cil > NGTCP2_MAX_CIDLEN)) { + return NGTCP2_CRYPTO_ERR_VERIFY_TOKEN; + } + + memcpy(&gen_ts, p + NGTCP2_MAX_CIDLEN, sizeof(gen_ts)); + + gen_ts = ngtcp2_ntohl64(gen_ts); + if (gen_ts + timeout <= ts) { + return NGTCP2_CRYPTO_ERR_VERIFY_TOKEN; + } + + ngtcp2_cid_init(odcid, p, cil); + + return 0; +} + static size_t crypto_generate_regular_token_aad(uint8_t *dest, const ngtcp2_sockaddr *sa) { const uint8_t *addr; @@ -1093,7 +1292,7 @@ static size_t crypto_generate_regular_token_aad(uint8_t *dest, break; case NGTCP2_AF_INET6: addr = - (const uint8_t *)&((const ngtcp2_sockaddr_in6 *)(void *)sa)->sin6_addr; + (const uint8_t *)&((const ngtcp2_sockaddr_in6 *)(void *)sa)->sin6_addr; addrlen = sizeof(((const ngtcp2_sockaddr_in6 *)(void *)sa)->sin6_addr); break; default: @@ -1109,13 +1308,13 @@ static size_t crypto_generate_regular_token_aad(uint8_t *dest, static const uint8_t regular_token_info_prefix[] = "regular_token"; ngtcp2_ssize ngtcp2_crypto_generate_regular_token( - uint8_t *token, const uint8_t *secret, size_t secretlen, - const ngtcp2_sockaddr *remote_addr, ngtcp2_socklen remote_addrlen, - ngtcp2_tstamp ts) { + uint8_t *token, const uint8_t *secret, size_t secretlen, + const ngtcp2_sockaddr *remote_addr, ngtcp2_socklen remote_addrlen, + ngtcp2_tstamp ts) { uint8_t plaintext[sizeof(ngtcp2_tstamp)]; uint8_t rand_data[NGTCP2_CRYPTO_TOKEN_RAND_DATALEN]; - uint8_t key[32]; - uint8_t iv[32]; + uint8_t key[16]; + uint8_t iv[12]; size_t keylen; size_t ivlen; ngtcp2_crypto_aead aead; @@ -1144,8 +1343,8 @@ ngtcp2_ssize ngtcp2_crypto_generate_regular_token( keylen = ngtcp2_crypto_aead_keylen(&aead); ivlen = ngtcp2_crypto_aead_noncelen(&aead); - assert(sizeof(key) >= keylen); - assert(sizeof(iv) >= ivlen); + assert(sizeof(key) == keylen); + assert(sizeof(iv) == ivlen); if (crypto_derive_token_key(key, keylen, iv, ivlen, &md, secret, secretlen, rand_data, sizeof(rand_data), @@ -1186,8 +1385,8 @@ int ngtcp2_crypto_verify_regular_token(const uint8_t *token, size_t tokenlen, ngtcp2_duration timeout, ngtcp2_tstamp ts) { uint8_t plaintext[sizeof(ngtcp2_tstamp)]; - uint8_t key[32]; - uint8_t iv[32]; + uint8_t key[16]; + uint8_t iv[12]; size_t keylen; size_t ivlen; ngtcp2_crypto_aead_ctx aead_ctx; @@ -1217,6 +1416,9 @@ int ngtcp2_crypto_verify_regular_token(const uint8_t *token, size_t tokenlen, keylen = ngtcp2_crypto_aead_keylen(&aead); ivlen = ngtcp2_crypto_aead_noncelen(&aead); + assert(sizeof(key) == keylen); + assert(sizeof(iv) == ivlen); + if (crypto_derive_token_key(key, keylen, iv, ivlen, &md, secret, secretlen, rand_data, NGTCP2_CRYPTO_TOKEN_RAND_DATALEN, regular_token_info_prefix, @@ -1250,9 +1452,9 @@ int ngtcp2_crypto_verify_regular_token(const uint8_t *token, size_t tokenlen, } ngtcp2_ssize ngtcp2_crypto_write_connection_close( - uint8_t *dest, size_t destlen, uint32_t version, const ngtcp2_cid *dcid, - const ngtcp2_cid *scid, uint64_t error_code, const uint8_t *reason, - size_t reasonlen) { + uint8_t *dest, size_t destlen, uint32_t version, const ngtcp2_cid *dcid, + const ngtcp2_cid *scid, uint64_t error_code, const uint8_t *reason, + size_t reasonlen) { uint8_t rx_secret[NGTCP2_CRYPTO_INITIAL_SECRETLEN]; uint8_t tx_secret[NGTCP2_CRYPTO_INITIAL_SECRETLEN]; uint8_t initial_secret[NGTCP2_CRYPTO_INITIAL_SECRETLEN]; @@ -1273,8 +1475,8 @@ ngtcp2_ssize ngtcp2_crypto_write_connection_close( } if (ngtcp2_crypto_derive_packet_protection_key( - tx_key, tx_iv, tx_hp_key, version, &ctx.aead, &ctx.md, tx_secret, - NGTCP2_CRYPTO_INITIAL_SECRETLEN) != 0) { + tx_key, tx_iv, tx_hp_key, version, &ctx.aead, &ctx.md, tx_secret, + NGTCP2_CRYPTO_INITIAL_SECRETLEN) != 0) { return -1; } @@ -1290,9 +1492,9 @@ ngtcp2_ssize ngtcp2_crypto_write_connection_close( } spktlen = ngtcp2_pkt_write_connection_close( - dest, destlen, version, dcid, scid, error_code, reason, reasonlen, - ngtcp2_crypto_encrypt_cb, &ctx.aead, &aead_ctx, tx_iv, - ngtcp2_crypto_hp_mask_cb, &ctx.hp, &hp_ctx); + dest, destlen, version, dcid, scid, error_code, reason, reasonlen, + ngtcp2_crypto_encrypt_cb, &ctx.aead, &aead_ctx, tx_iv, + ngtcp2_crypto_hp_mask_cb, &ctx.hp, &hp_ctx); if (spktlen < 0) { spktlen = -1; } @@ -1352,8 +1554,8 @@ int ngtcp2_crypto_client_initial_cb(ngtcp2_conn *conn, void *user_data) { (void)user_data; if (ngtcp2_crypto_derive_and_install_initial_key( - conn, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - ngtcp2_conn_get_client_chosen_version(conn), dcid) != 0) { + conn, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + ngtcp2_conn_get_client_chosen_version(conn), dcid) != 0) { return NGTCP2_ERR_CALLBACK_FAILURE; } @@ -1362,7 +1564,7 @@ int ngtcp2_crypto_client_initial_cb(ngtcp2_conn *conn, void *user_data) { } if (ngtcp2_crypto_read_write_crypto_data( - conn, NGTCP2_ENCRYPTION_LEVEL_INITIAL, NULL, 0) != 0) { + conn, NGTCP2_ENCRYPTION_LEVEL_INITIAL, NULL, 0) != 0) { return NGTCP2_ERR_CALLBACK_FAILURE; } @@ -1374,8 +1576,8 @@ int ngtcp2_crypto_recv_retry_cb(ngtcp2_conn *conn, const ngtcp2_pkt_hd *hd, (void)user_data; if (ngtcp2_crypto_derive_and_install_initial_key( - conn, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - ngtcp2_conn_get_client_chosen_version(conn), &hd->scid) != 0) { + conn, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + ngtcp2_conn_get_client_chosen_version(conn), &hd->scid) != 0) { return NGTCP2_ERR_CALLBACK_FAILURE; } @@ -1388,8 +1590,8 @@ int ngtcp2_crypto_recv_client_initial_cb(ngtcp2_conn *conn, (void)user_data; if (ngtcp2_crypto_derive_and_install_initial_key( - conn, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - ngtcp2_conn_get_client_chosen_version(conn), dcid) != 0) { + conn, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + ngtcp2_conn_get_client_chosen_version(conn), dcid) != 0) { return NGTCP2_ERR_CALLBACK_FAILURE; } @@ -1402,8 +1604,8 @@ int ngtcp2_crypto_version_negotiation_cb(ngtcp2_conn *conn, uint32_t version, (void)user_data; if (ngtcp2_crypto_derive_and_install_vneg_initial_key( - conn, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, version, - client_dcid) != 0) { + conn, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, version, + client_dcid) != 0) { return NGTCP2_ERR_CALLBACK_FAILURE; } @@ -1420,7 +1622,7 @@ void ngtcp2_crypto_delete_crypto_aead_ctx_cb(ngtcp2_conn *conn, } void ngtcp2_crypto_delete_crypto_cipher_ctx_cb( - ngtcp2_conn *conn, ngtcp2_crypto_cipher_ctx *cipher_ctx, void *user_data) { + ngtcp2_conn *conn, ngtcp2_crypto_cipher_ctx *cipher_ctx, void *user_data) { (void)conn; (void)user_data; diff --git a/deps/ngtcp2/ngtcp2/crypto/shared.h b/deps/ngtcp2/ngtcp2/crypto/shared.h index d69fd21212d7d2..34158d3d02dbc0 100644 --- a/deps/ngtcp2/ngtcp2/crypto/shared.h +++ b/deps/ngtcp2/ngtcp2/crypto/shared.h @@ -22,12 +22,12 @@ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#ifndef NGTCP2_SHARED_H -#define NGTCP2_SHARED_H +#ifndef SHARED_H +#define SHARED_H #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -286,10 +286,10 @@ int ngtcp2_crypto_set_remote_transport_params(ngtcp2_conn *conn, void *tls); * This function returns 0 if it succeeds, or -1. */ int ngtcp2_crypto_derive_and_install_initial_key( - ngtcp2_conn *conn, uint8_t *rx_secret, uint8_t *tx_secret, - uint8_t *initial_secret, uint8_t *rx_key, uint8_t *rx_iv, uint8_t *rx_hp, - uint8_t *tx_key, uint8_t *tx_iv, uint8_t *tx_hp, uint32_t version, - const ngtcp2_cid *client_dcid); + ngtcp2_conn *conn, uint8_t *rx_secret, uint8_t *tx_secret, + uint8_t *initial_secret, uint8_t *rx_key, uint8_t *rx_iv, uint8_t *rx_hp, + uint8_t *tx_key, uint8_t *tx_iv, uint8_t *tx_hp, uint32_t version, + const ngtcp2_cid *client_dcid); /** * @function @@ -337,10 +337,10 @@ int ngtcp2_crypto_derive_and_install_initial_key( * This function returns 0 if it succeeds, or -1. */ int ngtcp2_crypto_derive_and_install_vneg_initial_key( - ngtcp2_conn *conn, uint8_t *rx_secret, uint8_t *tx_secret, - uint8_t *initial_secret, uint8_t *rx_key, uint8_t *rx_iv, uint8_t *rx_hp, - uint8_t *tx_key, uint8_t *tx_iv, uint8_t *tx_hp, uint32_t version, - const ngtcp2_cid *client_dcid); + ngtcp2_conn *conn, uint8_t *rx_secret, uint8_t *tx_secret, + uint8_t *initial_secret, uint8_t *rx_key, uint8_t *rx_iv, uint8_t *rx_hp, + uint8_t *tx_key, uint8_t *tx_iv, uint8_t *tx_hp, uint32_t version, + const ngtcp2_cid *client_dcid); /** * @function @@ -394,4 +394,4 @@ int ngtcp2_crypto_hkdf_expand_label(uint8_t *dest, size_t destlen, const uint8_t *secret, size_t secretlen, const uint8_t *label, size_t labellen); -#endif /* NGTCP2_SHARED_H */ +#endif /* !defined(SHARED_H) */ diff --git a/deps/ngtcp2/ngtcp2/crypto/wolfssl/wolfssl.c b/deps/ngtcp2/ngtcp2/crypto/wolfssl/wolfssl.c index 2b7b5321863915..bc9d9d84a862c5 100644 --- a/deps/ngtcp2/ngtcp2/crypto/wolfssl/wolfssl.c +++ b/deps/ngtcp2/ngtcp2/crypto/wolfssl/wolfssl.c @@ -24,7 +24,7 @@ */ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -39,9 +39,9 @@ #define PRINTF_DEBUG 0 #if PRINTF_DEBUG # define DEBUG_MSG(...) fprintf(stderr, __VA_ARGS__) -#else +#else /* !PRINTF_DEBUG */ # define DEBUG_MSG(...) (void)0 -#endif +#endif /* !PRINTF_DEBUG */ ngtcp2_crypto_aead *ngtcp2_crypto_aead_aes_128_gcm(ngtcp2_crypto_aead *aead) { return ngtcp2_crypto_aead_init(aead, (void *)wolfSSL_EVP_aes_128_gcm()); @@ -65,7 +65,7 @@ ngtcp2_crypto_aead *ngtcp2_crypto_aead_init(ngtcp2_crypto_aead *aead, void *aead_native_handle) { aead->native_handle = aead_native_handle; aead->max_overhead = wolfSSL_quic_get_aead_tag_len( - (const WOLFSSL_EVP_CIPHER *)(aead_native_handle)); + (const WOLFSSL_EVP_CIPHER *)(aead_native_handle)); return aead; } @@ -124,7 +124,7 @@ ngtcp2_crypto_ctx *ngtcp2_crypto_ctx_tls(ngtcp2_crypto_ctx *ctx, ctx->hp.native_handle = (void *)wolfSSL_quic_get_hp(ssl); ctx->max_encryption = crypto_aead_get_aead_max_encryption(aead); ctx->max_decryption_failure = - crypto_aead_get_aead_max_decryption_failure(aead); + crypto_aead_get_aead_max_decryption_failure(aead); return ctx; } @@ -203,7 +203,7 @@ int ngtcp2_crypto_cipher_ctx_encrypt_init(ngtcp2_crypto_cipher_ctx *cipher_ctx, WOLFSSL_EVP_CIPHER_CTX *actx; actx = - wolfSSL_quic_crypt_new(cipher->native_handle, key, NULL, /* encrypt */ 1); + wolfSSL_quic_crypt_new(cipher->native_handle, key, NULL, /* encrypt */ 1); if (actx == NULL) { return -1; } @@ -279,7 +279,6 @@ int ngtcp2_crypto_decrypt(uint8_t *dest, const ngtcp2_crypto_aead *aead, if (wolfSSL_quic_aead_decrypt(dest, aead_ctx->native_handle, ciphertext, ciphertextlen, nonce, aad, aadlen) != WOLFSSL_SUCCESS) { - DEBUG_MSG("WOLFSSL: decrypt FAILED\n"); return -1; } @@ -296,11 +295,11 @@ int ngtcp2_crypto_hp_mask(uint8_t *dest, const ngtcp2_crypto_cipher *hp, (void)hp; if (wolfSSL_EVP_EncryptInit_ex(actx, NULL, NULL, NULL, sample) != - WOLFSSL_SUCCESS || + WOLFSSL_SUCCESS || wolfSSL_EVP_CipherUpdate(actx, dest, &len, PLAINTEXT, sizeof(PLAINTEXT) - 1) != WOLFSSL_SUCCESS || wolfSSL_EVP_EncryptFinal_ex(actx, dest + sizeof(PLAINTEXT) - 1, &len) != - WOLFSSL_SUCCESS) { + WOLFSSL_SUCCESS) { DEBUG_MSG("WOLFSSL: hp_mask FAILED\n"); return -1; } @@ -309,11 +308,11 @@ int ngtcp2_crypto_hp_mask(uint8_t *dest, const ngtcp2_crypto_cipher *hp, } int ngtcp2_crypto_read_write_crypto_data( - ngtcp2_conn *conn, ngtcp2_encryption_level encryption_level, - const uint8_t *data, size_t datalen) { + ngtcp2_conn *conn, ngtcp2_encryption_level encryption_level, + const uint8_t *data, size_t datalen) { WOLFSSL *ssl = ngtcp2_conn_get_tls_native_handle(conn); WOLFSSL_ENCRYPTION_LEVEL level = - ngtcp2_crypto_wolfssl_from_ngtcp2_encryption_level(encryption_level); + ngtcp2_crypto_wolfssl_from_ngtcp2_encryption_level(encryption_level); int rv; int err; @@ -397,7 +396,7 @@ int ngtcp2_crypto_set_local_transport_params(void *tls, const uint8_t *buf, } ngtcp2_encryption_level ngtcp2_crypto_wolfssl_from_wolfssl_encryption_level( - WOLFSSL_ENCRYPTION_LEVEL wolfssl_level) { + WOLFSSL_ENCRYPTION_LEVEL wolfssl_level) { switch (wolfssl_level) { case wolfssl_encryption_initial: return NGTCP2_ENCRYPTION_LEVEL_INITIAL; @@ -415,7 +414,7 @@ ngtcp2_encryption_level ngtcp2_crypto_wolfssl_from_wolfssl_encryption_level( WOLFSSL_ENCRYPTION_LEVEL ngtcp2_crypto_wolfssl_from_ngtcp2_encryption_level( - ngtcp2_encryption_level encryption_level) { + ngtcp2_encryption_level encryption_level) { switch (encryption_level) { case NGTCP2_ENCRYPTION_LEVEL_INITIAL: return wolfssl_encryption_initial; @@ -458,7 +457,7 @@ static int set_encryption_secrets(WOLFSSL *ssl, ngtcp2_crypto_conn_ref *conn_ref = SSL_get_app_data(ssl); ngtcp2_conn *conn = conn_ref->get_conn(conn_ref); ngtcp2_encryption_level level = - ngtcp2_crypto_wolfssl_from_wolfssl_encryption_level(wolfssl_level); + ngtcp2_crypto_wolfssl_from_wolfssl_encryption_level(wolfssl_level); DEBUG_MSG("WOLFSSL: set encryption secrets, level=%d, rxlen=%lu, txlen=%lu\n", wolfssl_level, rx_secret ? secretlen : 0, @@ -484,7 +483,7 @@ static int add_handshake_data(WOLFSSL *ssl, ngtcp2_crypto_conn_ref *conn_ref = SSL_get_app_data(ssl); ngtcp2_conn *conn = conn_ref->get_conn(conn_ref); ngtcp2_encryption_level level = - ngtcp2_crypto_wolfssl_from_wolfssl_encryption_level(wolfssl_level); + ngtcp2_crypto_wolfssl_from_wolfssl_encryption_level(wolfssl_level); int rv; DEBUG_MSG("WOLFSSL: add handshake data, level=%d len=%lu\n", wolfssl_level, @@ -516,10 +515,10 @@ static int send_alert(WOLFSSL *ssl, enum wolfssl_encryption_level_t level, } static WOLFSSL_QUIC_METHOD quic_method = { - set_encryption_secrets, - add_handshake_data, - flush_flight, - send_alert, + set_encryption_secrets, + add_handshake_data, + flush_flight, + send_alert, }; static void crypto_wolfssl_configure_context(WOLFSSL_CTX *ssl_ctx) { @@ -532,7 +531,7 @@ int ngtcp2_crypto_wolfssl_configure_server_context(WOLFSSL_CTX *ssl_ctx) { crypto_wolfssl_configure_context(ssl_ctx); #if PRINTF_DEBUG wolfSSL_Debugging_ON(); -#endif +#endif /* PRINTF_DEBUG */ return 0; } @@ -541,6 +540,6 @@ int ngtcp2_crypto_wolfssl_configure_client_context(WOLFSSL_CTX *ssl_ctx) { wolfSSL_CTX_UseSessionTicket(ssl_ctx); #if PRINTF_DEBUG wolfSSL_Debugging_ON(); -#endif +#endif /* PRINTF_DEBUG */ return 0; } diff --git a/deps/ngtcp2/ngtcp2/lib/includes/ngtcp2/ngtcp2.h b/deps/ngtcp2/ngtcp2/lib/includes/ngtcp2/ngtcp2.h index 72c8142a5a5aa7..87976b1444b95d 100644 --- a/deps/ngtcp2/ngtcp2/lib/includes/ngtcp2/ngtcp2.h +++ b/deps/ngtcp2/ngtcp2/lib/includes/ngtcp2/ngtcp2.h @@ -30,12 +30,12 @@ libcurl) */ #if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) # define WIN32 -#endif +#endif /* (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) */ #ifdef _MSC_VER # pragma warning(push) # pragma warning(disable : 4324) -#endif +#endif /* defined(_MSC_VER) */ #include #if defined(_MSC_VER) && (_MSC_VER < 1800) @@ -43,9 +43,9 @@ compliant. See compiler macros and version number in https://sourceforge.net/p/predef/wiki/Compilers/ */ # include -#else /* !defined(_MSC_VER) || (_MSC_VER >= 1800) */ +#else /* !(defined(_MSC_VER) && (_MSC_VER < 1800)) */ # include -#endif /* !defined(_MSC_VER) || (_MSC_VER >= 1800) */ +#endif /* !(defined(_MSC_VER) && (_MSC_VER < 1800)) */ #include #include #include @@ -54,13 +54,13 @@ # ifdef WIN32 # ifndef WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN -# endif /* WIN32_LEAN_AND_MEAN */ +# endif /* !defined(WIN32_LEAN_AND_MEAN) */ # include -# else /* !WIN32 */ +# else /* !defined(WIN32) */ # include # include -# endif /* !WIN32 */ -#endif /* NGTCP2_USE_GENERIC_SOCKADDR */ +# endif /* !defined(WIN32) */ +#endif /* !defined(NGTCP2_USE_GENERIC_SOCKADDR) */ #include @@ -69,26 +69,26 @@ #elif defined(WIN32) # ifdef BUILDING_NGTCP2 # define NGTCP2_EXTERN __declspec(dllexport) -# else /* !BUILDING_NGTCP2 */ +# else /* !defined(BUILDING_NGTCP2) */ # define NGTCP2_EXTERN __declspec(dllimport) -# endif /* !BUILDING_NGTCP2 */ -#else /* !defined(WIN32) */ +# endif /* !defined(BUILDING_NGTCP2) */ +#else /* !(defined(NGTCP2_STATICLIB) || defined(WIN32)) */ # ifdef BUILDING_NGTCP2 # define NGTCP2_EXTERN __attribute__((visibility("default"))) -# else /* !BUILDING_NGTCP2 */ +# else /* !defined(BUILDING_NGTCP2) */ # define NGTCP2_EXTERN -# endif /* !BUILDING_NGTCP2 */ -#endif /* !defined(WIN32) */ +# endif /* !defined(BUILDING_NGTCP2) */ +#endif /* !(defined(NGTCP2_STATICLIB) || defined(WIN32)) */ #ifdef _MSC_VER # define NGTCP2_ALIGN(N) __declspec(align(N)) -#else /* !_MSC_VER */ +#else /* !defined(_MSC_VER) */ # define NGTCP2_ALIGN(N) __attribute__((aligned(N))) -#endif /* !_MSC_VER */ +#endif /* !defined(_MSC_VER) */ #ifdef __cplusplus extern "C" { -#endif +#endif /* defined(__cplusplus) */ /** * @typedef @@ -1229,11 +1229,11 @@ typedef struct ngtcp2_pkt_stateless_reset { #ifdef NGTCP2_USE_GENERIC_SOCKADDR # ifndef NGTCP2_AF_INET # error NGTCP2_AF_INET must be defined -# endif /* !NGTCP2_AF_INET */ +# endif /* !defined(NGTCP2_AF_INET) */ # ifndef NGTCP2_AF_INET6 # error NGTCP2_AF_INET6 must be defined -# endif /* !NGTCP2_AF_INET6 */ +# endif /* !defined(NGTCP2_AF_INET6) */ typedef unsigned short int ngtcp2_sa_family; typedef uint16_t ngtcp2_in_port; @@ -1267,7 +1267,7 @@ typedef struct ngtcp2_sockaddr_in6 { } ngtcp2_sockaddr_in6; typedef uint32_t ngtcp2_socklen; -#else /* !NGTCP2_USE_GENERIC_SOCKADDR */ +#else /* !defined(NGTCP2_USE_GENERIC_SOCKADDR) */ # define NGTCP2_AF_INET AF_INET # define NGTCP2_AF_INET6 AF_INET6 @@ -1303,7 +1303,7 @@ typedef struct sockaddr_in6 ngtcp2_sockaddr_in6; * uint32_t. */ typedef socklen_t ngtcp2_socklen; -#endif /* !NGTCP2_USE_GENERIC_SOCKADDR */ +#endif /* !defined(NGTCP2_USE_GENERIC_SOCKADDR) */ /** * @struct @@ -1471,7 +1471,9 @@ typedef struct ngtcp2_transport_params { uint64_t max_udp_payload_size; /** * :member:`active_connection_id_limit` is the maximum number of - * Connection ID that sender can store. + * Connection ID that sender can store. If specified, it must be in + * the range of [:macro:`NGTCP2_DEFAULT_ACTIVE_CONNECTION_ID_LIMIT`, + * 8], inclusive. */ uint64_t active_connection_id_limit; /** @@ -1689,7 +1691,8 @@ typedef enum ngtcp2_token_type { } ngtcp2_token_type; #define NGTCP2_SETTINGS_V1 1 -#define NGTCP2_SETTINGS_VERSION NGTCP2_SETTINGS_V1 +#define NGTCP2_SETTINGS_V2 2 +#define NGTCP2_SETTINGS_VERSION NGTCP2_SETTINGS_V2 /** * @struct @@ -1723,8 +1726,7 @@ typedef struct ngtcp2_settings { ngtcp2_printf log_printf; /** * :member:`max_tx_udp_payload_size` is the maximum size of UDP - * datagram payload that the local endpoint transmits. It is used - * by congestion controller to compute congestion window. + * datagram payload that the local endpoint transmits. */ size_t max_tx_udp_payload_size; /** @@ -1777,6 +1779,13 @@ typedef struct ngtcp2_settings { * or :member:`ngtcp2_transport_params.initial_max_stream_data_uni`, * depending on the type of stream. The window size is scaled up to * the value specified in this field. + * + * Please note that the auto-tuning is done per stream. Even if the + * previous stream gets larger window as a result of auto-tuning, + * the new stream still starts with the initial value set in + * transport parameters. This might become a bottleneck if + * congestion window of a remote server is wide open. If this + * causes an issue, do not enable auto-tuning. */ uint64_t max_stream_window; /** @@ -1873,10 +1882,29 @@ typedef struct ngtcp2_settings { */ uint8_t no_pmtud; /** - * :member:`pkt_num` is the initial packet number for each packet - * number space. It must be in range [0, INT32_MAX], inclusive. + * :member:`initial_pkt_num` is the initial packet number for each + * packet number space. It must be in range [0, INT32_MAX], + * inclusive. */ uint32_t initial_pkt_num; + /* The following fields have been added since NGTCP2_SETTINGS_V2. */ + /** + * :member:`pmtud_probes` is the array of UDP datagram payload size + * to probe during Path MTU Discovery. The discovery is done in the + * order appeared in this array. The size must be strictly larger + * than 1200, otherwise the behavior is undefined. The maximum + * value in this array should be set to + * :member:`max_tx_udp_payload_size`. If this field is not set, the + * predefined PMTUD probes are made. This field has been available + * since v1.4.0. + */ + const uint16_t *pmtud_probes; + /** + * :member:`pmtud_probeslen` is the number of elements that are + * contained in the array pointed by :member:`pmtud_probes`. This + * field has been available since v1.4.0. + */ + size_t pmtud_probeslen; } ngtcp2_settings; /** @@ -2080,8 +2108,8 @@ typedef struct ngtcp2_crypto_ctx { * Buffer is too small. */ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_transport_params_encode_versioned( - uint8_t *dest, size_t destlen, int transport_params_version, - const ngtcp2_transport_params *params); + uint8_t *dest, size_t destlen, int transport_params_version, + const ngtcp2_transport_params *params); /** * @function @@ -2324,8 +2352,8 @@ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_pkt_decode_hd_short(ngtcp2_pkt_hd *dest, * :macro:`NGTCP2_MIN_STATELESS_RESET_RANDLEN`. */ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_pkt_write_stateless_reset( - uint8_t *dest, size_t destlen, const uint8_t *stateless_reset_token, - const uint8_t *rand, size_t randlen); + uint8_t *dest, size_t destlen, const uint8_t *stateless_reset_token, + const uint8_t *rand, size_t randlen); /** * @function @@ -2347,9 +2375,9 @@ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_pkt_write_stateless_reset( * Buffer is too small. */ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_pkt_write_version_negotiation( - uint8_t *dest, size_t destlen, uint8_t unused_random, const uint8_t *dcid, - size_t dcidlen, const uint8_t *scid, size_t scidlen, const uint32_t *sv, - size_t nsv); + uint8_t *dest, size_t destlen, uint8_t unused_random, const uint8_t *dcid, + size_t dcidlen, const uint8_t *scid, size_t scidlen, const uint32_t *sv, + size_t nsv); /** * @struct @@ -2770,8 +2798,8 @@ typedef int (*ngtcp2_stream_reset)(ngtcp2_conn *conn, int64_t stream_id, * call return immediately. */ typedef int (*ngtcp2_acked_stream_data_offset)( - ngtcp2_conn *conn, int64_t stream_id, uint64_t offset, uint64_t datalen, - void *user_data, void *stream_user_data); + ngtcp2_conn *conn, int64_t stream_id, uint64_t offset, uint64_t datalen, + void *user_data, void *stream_user_data); /** * @functypedef @@ -2893,11 +2921,11 @@ typedef int (*ngtcp2_remove_connection_id)(ngtcp2_conn *conn, * immediately. */ typedef int (*ngtcp2_update_key)( - ngtcp2_conn *conn, uint8_t *rx_secret, uint8_t *tx_secret, - ngtcp2_crypto_aead_ctx *rx_aead_ctx, uint8_t *rx_iv, - ngtcp2_crypto_aead_ctx *tx_aead_ctx, uint8_t *tx_iv, - const uint8_t *current_rx_secret, const uint8_t *current_tx_secret, - size_t secretlen, void *user_data); + ngtcp2_conn *conn, uint8_t *rx_secret, uint8_t *tx_secret, + ngtcp2_crypto_aead_ctx *rx_aead_ctx, uint8_t *rx_iv, + ngtcp2_crypto_aead_ctx *tx_aead_ctx, uint8_t *tx_iv, + const uint8_t *current_rx_secret, const uint8_t *current_tx_secret, + size_t secretlen, void *user_data); /** * @macrosection @@ -3024,8 +3052,8 @@ typedef enum ngtcp2_connection_id_status_type { * immediately. */ typedef int (*ngtcp2_connection_id_status)( - ngtcp2_conn *conn, ngtcp2_connection_id_status_type type, uint64_t seq, - const ngtcp2_cid *cid, const uint8_t *token, void *user_data); + ngtcp2_conn *conn, ngtcp2_connection_id_status_type type, uint64_t seq, + const ngtcp2_cid *cid, const uint8_t *token, void *user_data); /** * @functypedef @@ -3064,7 +3092,7 @@ typedef void (*ngtcp2_delete_crypto_aead_ctx)(ngtcp2_conn *conn, * `. */ typedef void (*ngtcp2_delete_crypto_cipher_ctx)( - ngtcp2_conn *conn, ngtcp2_crypto_cipher_ctx *cipher_ctx, void *user_data); + ngtcp2_conn *conn, ngtcp2_crypto_cipher_ctx *cipher_ctx, void *user_data); /** * @macrosection @@ -3510,12 +3538,12 @@ typedef struct ngtcp2_callbacks { * Callback function failed. */ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_pkt_write_connection_close( - uint8_t *dest, size_t destlen, uint32_t version, const ngtcp2_cid *dcid, - const ngtcp2_cid *scid, uint64_t error_code, const uint8_t *reason, - size_t reasonlen, ngtcp2_encrypt encrypt, const ngtcp2_crypto_aead *aead, - const ngtcp2_crypto_aead_ctx *aead_ctx, const uint8_t *iv, - ngtcp2_hp_mask hp_mask, const ngtcp2_crypto_cipher *hp, - const ngtcp2_crypto_cipher_ctx *hp_ctx); + uint8_t *dest, size_t destlen, uint32_t version, const ngtcp2_cid *dcid, + const ngtcp2_cid *scid, uint64_t error_code, const uint8_t *reason, + size_t reasonlen, ngtcp2_encrypt encrypt, const ngtcp2_crypto_aead *aead, + const ngtcp2_crypto_aead_ctx *aead_ctx, const uint8_t *iv, + ngtcp2_hp_mask hp_mask, const ngtcp2_crypto_cipher *hp, + const ngtcp2_crypto_cipher_ctx *hp_ctx); /** * @function @@ -3542,10 +3570,10 @@ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_pkt_write_connection_close( * :macro:`NGTCP2_MIN_INITIAL_DCIDLEN`. */ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_pkt_write_retry( - uint8_t *dest, size_t destlen, uint32_t version, const ngtcp2_cid *dcid, - const ngtcp2_cid *scid, const ngtcp2_cid *odcid, const uint8_t *token, - size_t tokenlen, ngtcp2_encrypt encrypt, const ngtcp2_crypto_aead *aead, - const ngtcp2_crypto_aead_ctx *aead_ctx); + uint8_t *dest, size_t destlen, uint32_t version, const ngtcp2_cid *dcid, + const ngtcp2_cid *scid, const ngtcp2_cid *odcid, const uint8_t *token, + size_t tokenlen, ngtcp2_encrypt encrypt, const ngtcp2_crypto_aead *aead, + const ngtcp2_crypto_aead_ctx *aead_ctx); /** * @function @@ -3594,12 +3622,12 @@ NGTCP2_EXTERN int ngtcp2_accept(ngtcp2_pkt_hd *dest, const uint8_t *pkt, * Out of memory. */ NGTCP2_EXTERN int ngtcp2_conn_client_new_versioned( - ngtcp2_conn **pconn, const ngtcp2_cid *dcid, const ngtcp2_cid *scid, - const ngtcp2_path *path, uint32_t client_chosen_version, - int callbacks_version, const ngtcp2_callbacks *callbacks, - int settings_version, const ngtcp2_settings *settings, - int transport_params_version, const ngtcp2_transport_params *params, - const ngtcp2_mem *mem, void *user_data); + ngtcp2_conn **pconn, const ngtcp2_cid *dcid, const ngtcp2_cid *scid, + const ngtcp2_path *path, uint32_t client_chosen_version, + int callbacks_version, const ngtcp2_callbacks *callbacks, + int settings_version, const ngtcp2_settings *settings, + int transport_params_version, const ngtcp2_transport_params *params, + const ngtcp2_mem *mem, void *user_data); /** * @function @@ -3629,12 +3657,12 @@ NGTCP2_EXTERN int ngtcp2_conn_client_new_versioned( * Out of memory. */ NGTCP2_EXTERN int ngtcp2_conn_server_new_versioned( - ngtcp2_conn **pconn, const ngtcp2_cid *dcid, const ngtcp2_cid *scid, - const ngtcp2_path *path, uint32_t client_chosen_version, - int callbacks_version, const ngtcp2_callbacks *callbacks, - int settings_version, const ngtcp2_settings *settings, - int transport_params_version, const ngtcp2_transport_params *params, - const ngtcp2_mem *mem, void *user_data); + ngtcp2_conn **pconn, const ngtcp2_cid *dcid, const ngtcp2_cid *scid, + const ngtcp2_path *path, uint32_t client_chosen_version, + int callbacks_version, const ngtcp2_callbacks *callbacks, + int settings_version, const ngtcp2_settings *settings, + int transport_params_version, const ngtcp2_transport_params *params, + const ngtcp2_mem *mem, void *user_data); /** * @function @@ -3698,8 +3726,8 @@ ngtcp2_conn_read_pkt_versioned(ngtcp2_conn *conn, const ngtcp2_path *path, * and :macro:`NGTCP2_WRITE_STREAM_FLAG_NONE` as flags. */ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_conn_write_pkt_versioned( - ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, - ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, ngtcp2_tstamp ts); + ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, + ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, ngtcp2_tstamp ts); /** * @function @@ -3755,10 +3783,10 @@ NGTCP2_EXTERN int ngtcp2_conn_get_handshake_completed(ngtcp2_conn *conn); * Out of memory. */ NGTCP2_EXTERN int ngtcp2_conn_install_initial_key( - ngtcp2_conn *conn, const ngtcp2_crypto_aead_ctx *rx_aead_ctx, - const uint8_t *rx_iv, const ngtcp2_crypto_cipher_ctx *rx_hp_ctx, - const ngtcp2_crypto_aead_ctx *tx_aead_ctx, const uint8_t *tx_iv, - const ngtcp2_crypto_cipher_ctx *tx_hp_ctx, size_t ivlen); + ngtcp2_conn *conn, const ngtcp2_crypto_aead_ctx *rx_aead_ctx, + const uint8_t *rx_iv, const ngtcp2_crypto_cipher_ctx *rx_hp_ctx, + const ngtcp2_crypto_aead_ctx *tx_aead_ctx, const uint8_t *tx_iv, + const ngtcp2_crypto_cipher_ctx *tx_hp_ctx, size_t ivlen); /** * @function @@ -3790,11 +3818,11 @@ NGTCP2_EXTERN int ngtcp2_conn_install_initial_key( * Out of memory. */ NGTCP2_EXTERN int ngtcp2_conn_install_vneg_initial_key( - ngtcp2_conn *conn, uint32_t version, - const ngtcp2_crypto_aead_ctx *rx_aead_ctx, const uint8_t *rx_iv, - const ngtcp2_crypto_cipher_ctx *rx_hp_ctx, - const ngtcp2_crypto_aead_ctx *tx_aead_ctx, const uint8_t *tx_iv, - const ngtcp2_crypto_cipher_ctx *tx_hp_ctx, size_t ivlen); + ngtcp2_conn *conn, uint32_t version, + const ngtcp2_crypto_aead_ctx *rx_aead_ctx, const uint8_t *rx_iv, + const ngtcp2_crypto_cipher_ctx *rx_hp_ctx, + const ngtcp2_crypto_aead_ctx *tx_aead_ctx, const uint8_t *tx_iv, + const ngtcp2_crypto_cipher_ctx *tx_hp_ctx, size_t ivlen); /** * @function @@ -3821,8 +3849,8 @@ NGTCP2_EXTERN int ngtcp2_conn_install_vneg_initial_key( * Out of memory. */ NGTCP2_EXTERN int ngtcp2_conn_install_rx_handshake_key( - ngtcp2_conn *conn, const ngtcp2_crypto_aead_ctx *aead_ctx, - const uint8_t *iv, size_t ivlen, const ngtcp2_crypto_cipher_ctx *hp_ctx); + ngtcp2_conn *conn, const ngtcp2_crypto_aead_ctx *aead_ctx, const uint8_t *iv, + size_t ivlen, const ngtcp2_crypto_cipher_ctx *hp_ctx); /** * @function @@ -3849,8 +3877,8 @@ NGTCP2_EXTERN int ngtcp2_conn_install_rx_handshake_key( * Out of memory. */ NGTCP2_EXTERN int ngtcp2_conn_install_tx_handshake_key( - ngtcp2_conn *conn, const ngtcp2_crypto_aead_ctx *aead_ctx, - const uint8_t *iv, size_t ivlen, const ngtcp2_crypto_cipher_ctx *hp_ctx); + ngtcp2_conn *conn, const ngtcp2_crypto_aead_ctx *aead_ctx, const uint8_t *iv, + size_t ivlen, const ngtcp2_crypto_cipher_ctx *hp_ctx); /** * @function @@ -3876,8 +3904,8 @@ NGTCP2_EXTERN int ngtcp2_conn_install_tx_handshake_key( * Out of memory. */ NGTCP2_EXTERN int ngtcp2_conn_install_0rtt_key( - ngtcp2_conn *conn, const ngtcp2_crypto_aead_ctx *aead_ctx, - const uint8_t *iv, size_t ivlen, const ngtcp2_crypto_cipher_ctx *hp_ctx); + ngtcp2_conn *conn, const ngtcp2_crypto_aead_ctx *aead_ctx, const uint8_t *iv, + size_t ivlen, const ngtcp2_crypto_cipher_ctx *hp_ctx); /** * @function @@ -3906,9 +3934,9 @@ NGTCP2_EXTERN int ngtcp2_conn_install_0rtt_key( * Out of memory. */ NGTCP2_EXTERN int ngtcp2_conn_install_rx_key( - ngtcp2_conn *conn, const uint8_t *secret, size_t secretlen, - const ngtcp2_crypto_aead_ctx *aead_ctx, const uint8_t *iv, size_t ivlen, - const ngtcp2_crypto_cipher_ctx *hp_ctx); + ngtcp2_conn *conn, const uint8_t *secret, size_t secretlen, + const ngtcp2_crypto_aead_ctx *aead_ctx, const uint8_t *iv, size_t ivlen, + const ngtcp2_crypto_cipher_ctx *hp_ctx); /** * @function @@ -3937,9 +3965,9 @@ NGTCP2_EXTERN int ngtcp2_conn_install_rx_key( * Out of memory. */ NGTCP2_EXTERN int ngtcp2_conn_install_tx_key( - ngtcp2_conn *conn, const uint8_t *secret, size_t secretlen, - const ngtcp2_crypto_aead_ctx *aead_ctx, const uint8_t *iv, size_t ivlen, - const ngtcp2_crypto_cipher_ctx *hp_ctx); + ngtcp2_conn *conn, const uint8_t *secret, size_t secretlen, + const ngtcp2_crypto_aead_ctx *aead_ctx, const uint8_t *iv, size_t ivlen, + const ngtcp2_crypto_cipher_ctx *hp_ctx); /** * @function @@ -4063,7 +4091,7 @@ NGTCP2_EXTERN ngtcp2_duration ngtcp2_conn_get_pto(ngtcp2_conn *conn); * User callback failed */ NGTCP2_EXTERN int ngtcp2_conn_decode_and_set_remote_transport_params( - ngtcp2_conn *conn, const uint8_t *data, size_t datalen); + ngtcp2_conn *conn, const uint8_t *data, size_t datalen); /** * @function @@ -4148,7 +4176,7 @@ ngtcp2_ssize ngtcp2_conn_encode_0rtt_transport_params(ngtcp2_conn *conn, * The input is malformed. */ NGTCP2_EXTERN int ngtcp2_conn_decode_and_set_0rtt_transport_params( - ngtcp2_conn *conn, const uint8_t *data, size_t datalen); + ngtcp2_conn *conn, const uint8_t *data, size_t datalen); /** * @function @@ -4168,8 +4196,8 @@ NGTCP2_EXTERN int ngtcp2_conn_decode_and_set_0rtt_transport_params( * `ngtcp2_conn_install_tx_handshake_key` has been called. */ NGTCP2_EXTERN int ngtcp2_conn_set_local_transport_params_versioned( - ngtcp2_conn *conn, int transport_params_version, - const ngtcp2_transport_params *params); + ngtcp2_conn *conn, int transport_params_version, + const ngtcp2_transport_params *params); /** * @function @@ -4193,7 +4221,7 @@ ngtcp2_conn_get_local_transport_params(ngtcp2_conn *conn); * Buffer is too small. */ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_conn_encode_local_transport_params( - ngtcp2_conn *conn, uint8_t *dest, size_t destlen); + ngtcp2_conn *conn, uint8_t *dest, size_t destlen); /** * @function @@ -4374,10 +4402,10 @@ NGTCP2_EXTERN int ngtcp2_conn_shutdown_stream_read(ngtcp2_conn *conn, * conveniently accepts a single buffer. */ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_conn_write_stream_versioned( - ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, - ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, ngtcp2_ssize *pdatalen, - uint32_t flags, int64_t stream_id, const uint8_t *data, size_t datalen, - ngtcp2_tstamp ts); + ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, + ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, ngtcp2_ssize *pdatalen, + uint32_t flags, int64_t stream_id, const uint8_t *data, size_t datalen, + ngtcp2_tstamp ts); /** * @function @@ -4388,7 +4416,8 @@ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_conn_write_stream_versioned( * handshake as well. * * |destlen| should be at least - * :member:`ngtcp2_settings.max_tx_udp_payload_size`. + * :member:`ngtcp2_settings.max_tx_udp_payload_size`. It must be at + * least :macro:`NGTCP2_MAX_UDP_PAYLOAD_SIZE`. * * Specifying -1 to |stream_id| means no new stream data to send. * @@ -4418,8 +4447,10 @@ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_conn_write_stream_versioned( * In that case, |*pdatalen| would be -1 if |pdatalen| is not * ``NULL``. * - * If |flags| & :macro:`NGTCP2_WRITE_STREAM_FLAG_FIN` is nonzero, and - * 0 length STREAM frame is successfully serialized, |*pdatalen| would + * Empty data is treated specially, and it is only accepted if no + * data, including the empty data, is submitted to a stream or + * :macro:`NGTCP2_WRITE_STREAM_FLAG_FIN` is set in |flags|. If 0 + * length STREAM frame is successfully serialized, |*pdatalen| would * be 0. * * The number of data encoded in STREAM frame is stored in |*pdatalen| @@ -4525,10 +4556,10 @@ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_conn_write_stream_versioned( * sending it makes QUIC connection enter the closing state. */ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_conn_writev_stream_versioned( - ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, - ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, ngtcp2_ssize *pdatalen, - uint32_t flags, int64_t stream_id, const ngtcp2_vec *datav, size_t datavcnt, - ngtcp2_tstamp ts); + ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, + ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, ngtcp2_ssize *pdatalen, + uint32_t flags, int64_t stream_id, const ngtcp2_vec *datav, size_t datavcnt, + ngtcp2_tstamp ts); /** * @macrosection @@ -4559,10 +4590,10 @@ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_conn_writev_stream_versioned( * conveniently accepts a single buffer. */ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_conn_write_datagram_versioned( - ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, - ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, int *paccepted, - uint32_t flags, uint64_t dgram_id, const uint8_t *data, size_t datalen, - ngtcp2_tstamp ts); + ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, + ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, int *paccepted, + uint32_t flags, uint64_t dgram_id, const uint8_t *data, size_t datalen, + ngtcp2_tstamp ts); /** * @function @@ -4573,7 +4604,8 @@ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_conn_write_datagram_versioned( * as well. * * |destlen| should be at least - * :member:`ngtcp2_settings.max_tx_udp_payload_size`. + * :member:`ngtcp2_settings.max_tx_udp_payload_size`. It must be at + * least :macro:`NGTCP2_MAX_UDP_PAYLOAD_SIZE`. * * For |path| and |pi| parameters, refer to * `ngtcp2_conn_writev_stream`. @@ -4655,10 +4687,10 @@ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_conn_write_datagram_versioned( * sending it makes QUIC connection enter the closing state. */ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_conn_writev_datagram_versioned( - ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, - ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, int *paccepted, - uint32_t flags, uint64_t dgram_id, const ngtcp2_vec *datav, size_t datavcnt, - ngtcp2_tstamp ts); + ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, + ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, int *paccepted, + uint32_t flags, uint64_t dgram_id, const ngtcp2_vec *datav, size_t datavcnt, + ngtcp2_tstamp ts); /** * @function @@ -4992,7 +5024,7 @@ ngtcp2_conn_get_path_max_tx_udp_payload_size(ngtcp2_conn *conn); * Out of memory */ NGTCP2_EXTERN int ngtcp2_conn_initiate_immediate_migration( - ngtcp2_conn *conn, const ngtcp2_path *path, ngtcp2_tstamp ts); + ngtcp2_conn *conn, const ngtcp2_path *path, ngtcp2_tstamp ts); /** * @function @@ -5193,7 +5225,19 @@ typedef enum ngtcp2_ccerr_type { * transport error, and it indicates that connection is closed * because of idle timeout. */ - NGTCP2_CCERR_TYPE_IDLE_CLOSE + NGTCP2_CCERR_TYPE_IDLE_CLOSE, + /** + * :enum:`NGTCP2_CCERR_TYPE_DROP_CONN` is a special case of QUIC + * transport error, and it indicates that connection should be + * dropped without sending a CONNECTION_CLOSE frame. + */ + NGTCP2_CCERR_TYPE_DROP_CONN, + /** + * :enum:`NGTCP2_CCERR_TYPE_RETRY` is a special case of QUIC + * transport error, and it indicates that RETRY packet should be + * sent to a client. + */ + NGTCP2_CCERR_TYPE_RETRY } ngtcp2_ccerr_type; /** @@ -5284,6 +5328,18 @@ NGTCP2_EXTERN void ngtcp2_ccerr_set_transport_error(ngtcp2_ccerr *ccerr, * :member:`ccerr->error_code ` to * :macro:`NGTCP2_NO_ERROR`. * + * If |liberr| is :macro:`NGTCP2_ERR_DROP_CONN`, :member:`ccerr->type + * ` is set to + * :enum:`ngtcp2_ccerr_type.NGTCP2_CCERR_TYPE_DROP_CONN`, and + * :member:`ccerr->error_code ` to + * :macro:`NGTCP2_NO_ERROR`. + * + * If |liberr| is :macro:`NGTCP2_ERR_RETRY`, :member:`ccerr->type + * ` is set to + * :enum:`ngtcp2_ccerr_type.NGTCP2_CCERR_TYPE_RETRY`, and + * :member:`ccerr->error_type ` to + * :macro:`NGTCP2_NO_ERROR`. + * * Otherwise, :member:`ccerr->type ` is set to * :enum:`ngtcp2_ccerr_type.NGTCP2_CCERR_TYPE_TRANSPORT`, and * :member:`ccerr->error_code ` is set to an @@ -5380,9 +5436,9 @@ NGTCP2_EXTERN void ngtcp2_ccerr_set_application_error(ngtcp2_ccerr *ccerr, * User callback failed */ NGTCP2_EXTERN ngtcp2_ssize ngtcp2_conn_write_connection_close_versioned( - ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, - ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, - const ngtcp2_ccerr *ccerr, ngtcp2_tstamp ts); + ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, + ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, const ngtcp2_ccerr *ccerr, + ngtcp2_tstamp ts); /** * @function @@ -5734,8 +5790,8 @@ NGTCP2_EXTERN uint32_t ngtcp2_select_version(const uint32_t *preferred_versions, #define ngtcp2_conn_write_stream(CONN, PATH, PI, DEST, DESTLEN, PDATALEN, \ FLAGS, STREAM_ID, DATA, DATALEN, TS) \ ngtcp2_conn_write_stream_versioned( \ - (CONN), (PATH), NGTCP2_PKT_INFO_VERSION, (PI), (DEST), (DESTLEN), \ - (PDATALEN), (FLAGS), (STREAM_ID), (DATA), (DATALEN), (TS)) + (CONN), (PATH), NGTCP2_PKT_INFO_VERSION, (PI), (DEST), (DESTLEN), \ + (PDATALEN), (FLAGS), (STREAM_ID), (DATA), (DATALEN), (TS)) /* * `ngtcp2_conn_writev_stream` is a wrapper around @@ -5745,8 +5801,8 @@ NGTCP2_EXTERN uint32_t ngtcp2_select_version(const uint32_t *preferred_versions, #define ngtcp2_conn_writev_stream(CONN, PATH, PI, DEST, DESTLEN, PDATALEN, \ FLAGS, STREAM_ID, DATAV, DATAVCNT, TS) \ ngtcp2_conn_writev_stream_versioned( \ - (CONN), (PATH), NGTCP2_PKT_INFO_VERSION, (PI), (DEST), (DESTLEN), \ - (PDATALEN), (FLAGS), (STREAM_ID), (DATAV), (DATAVCNT), (TS)) + (CONN), (PATH), NGTCP2_PKT_INFO_VERSION, (PI), (DEST), (DESTLEN), \ + (PDATALEN), (FLAGS), (STREAM_ID), (DATAV), (DATAVCNT), (TS)) /* * `ngtcp2_conn_write_datagram` is a wrapper around @@ -5756,8 +5812,8 @@ NGTCP2_EXTERN uint32_t ngtcp2_select_version(const uint32_t *preferred_versions, #define ngtcp2_conn_write_datagram(CONN, PATH, PI, DEST, DESTLEN, PACCEPTED, \ FLAGS, DGRAM_ID, DATA, DATALEN, TS) \ ngtcp2_conn_write_datagram_versioned( \ - (CONN), (PATH), NGTCP2_PKT_INFO_VERSION, (PI), (DEST), (DESTLEN), \ - (PACCEPTED), (FLAGS), (DGRAM_ID), (DATA), (DATALEN), (TS)) + (CONN), (PATH), NGTCP2_PKT_INFO_VERSION, (PI), (DEST), (DESTLEN), \ + (PACCEPTED), (FLAGS), (DGRAM_ID), (DATA), (DATALEN), (TS)) /* * `ngtcp2_conn_writev_datagram` is a wrapper around @@ -5767,8 +5823,8 @@ NGTCP2_EXTERN uint32_t ngtcp2_select_version(const uint32_t *preferred_versions, #define ngtcp2_conn_writev_datagram(CONN, PATH, PI, DEST, DESTLEN, PACCEPTED, \ FLAGS, DGRAM_ID, DATAV, DATAVCNT, TS) \ ngtcp2_conn_writev_datagram_versioned( \ - (CONN), (PATH), NGTCP2_PKT_INFO_VERSION, (PI), (DEST), (DESTLEN), \ - (PACCEPTED), (FLAGS), (DGRAM_ID), (DATAV), (DATAVCNT), (TS)) + (CONN), (PATH), NGTCP2_PKT_INFO_VERSION, (PI), (DEST), (DESTLEN), \ + (PACCEPTED), (FLAGS), (DGRAM_ID), (DATAV), (DATAVCNT), (TS)) /* * `ngtcp2_conn_write_connection_close` is a wrapper around @@ -5778,8 +5834,8 @@ NGTCP2_EXTERN uint32_t ngtcp2_select_version(const uint32_t *preferred_versions, #define ngtcp2_conn_write_connection_close(CONN, PATH, PI, DEST, DESTLEN, \ CCERR, TS) \ ngtcp2_conn_write_connection_close_versioned( \ - (CONN), (PATH), NGTCP2_PKT_INFO_VERSION, (PI), (DEST), (DESTLEN), \ - (CCERR), (TS)) + (CONN), (PATH), NGTCP2_PKT_INFO_VERSION, (PI), (DEST), (DESTLEN), (CCERR), \ + (TS)) /* * `ngtcp2_transport_params_encode` is a wrapper around @@ -5788,7 +5844,7 @@ NGTCP2_EXTERN uint32_t ngtcp2_select_version(const uint32_t *preferred_versions, */ #define ngtcp2_transport_params_encode(DEST, DESTLEN, PARAMS) \ ngtcp2_transport_params_encode_versioned( \ - (DEST), (DESTLEN), NGTCP2_TRANSPORT_PARAMS_VERSION, (PARAMS)) + (DEST), (DESTLEN), NGTCP2_TRANSPORT_PARAMS_VERSION, (PARAMS)) /* * `ngtcp2_transport_params_decode` is a wrapper around @@ -5807,9 +5863,9 @@ NGTCP2_EXTERN uint32_t ngtcp2_select_version(const uint32_t *preferred_versions, #define ngtcp2_conn_client_new(PCONN, DCID, SCID, PATH, VERSION, CALLBACKS, \ SETTINGS, PARAMS, MEM, USER_DATA) \ ngtcp2_conn_client_new_versioned( \ - (PCONN), (DCID), (SCID), (PATH), (VERSION), NGTCP2_CALLBACKS_VERSION, \ - (CALLBACKS), NGTCP2_SETTINGS_VERSION, (SETTINGS), \ - NGTCP2_TRANSPORT_PARAMS_VERSION, (PARAMS), (MEM), (USER_DATA)) + (PCONN), (DCID), (SCID), (PATH), (VERSION), NGTCP2_CALLBACKS_VERSION, \ + (CALLBACKS), NGTCP2_SETTINGS_VERSION, (SETTINGS), \ + NGTCP2_TRANSPORT_PARAMS_VERSION, (PARAMS), (MEM), (USER_DATA)) /* * `ngtcp2_conn_server_new` is a wrapper around @@ -5819,9 +5875,9 @@ NGTCP2_EXTERN uint32_t ngtcp2_select_version(const uint32_t *preferred_versions, #define ngtcp2_conn_server_new(PCONN, DCID, SCID, PATH, VERSION, CALLBACKS, \ SETTINGS, PARAMS, MEM, USER_DATA) \ ngtcp2_conn_server_new_versioned( \ - (PCONN), (DCID), (SCID), (PATH), (VERSION), NGTCP2_CALLBACKS_VERSION, \ - (CALLBACKS), NGTCP2_SETTINGS_VERSION, (SETTINGS), \ - NGTCP2_TRANSPORT_PARAMS_VERSION, (PARAMS), (MEM), (USER_DATA)) + (PCONN), (DCID), (SCID), (PATH), (VERSION), NGTCP2_CALLBACKS_VERSION, \ + (CALLBACKS), NGTCP2_SETTINGS_VERSION, (SETTINGS), \ + NGTCP2_TRANSPORT_PARAMS_VERSION, (PARAMS), (MEM), (USER_DATA)) /* * `ngtcp2_conn_set_local_transport_params` is a wrapper around @@ -5830,7 +5886,7 @@ NGTCP2_EXTERN uint32_t ngtcp2_select_version(const uint32_t *preferred_versions, */ #define ngtcp2_conn_set_local_transport_params(CONN, PARAMS) \ ngtcp2_conn_set_local_transport_params_versioned( \ - (CONN), NGTCP2_TRANSPORT_PARAMS_VERSION, (PARAMS)) + (CONN), NGTCP2_TRANSPORT_PARAMS_VERSION, (PARAMS)) /* * `ngtcp2_transport_params_default` is a wrapper around @@ -5859,10 +5915,10 @@ NGTCP2_EXTERN uint32_t ngtcp2_select_version(const uint32_t *preferred_versions, #ifdef _MSC_VER # pragma warning(pop) -#endif +#endif /* defined(_MSC_VER) */ #ifdef __cplusplus } -#endif +#endif /* defined(__cplusplus) */ -#endif /* NGTCP2_H */ +#endif /* !defined(NGTCP2_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/includes/ngtcp2/version.h b/deps/ngtcp2/ngtcp2/lib/includes/ngtcp2/version.h index 801c6cb2681386..20c4ac24d2ebcd 100644 --- a/deps/ngtcp2/ngtcp2/lib/includes/ngtcp2/version.h +++ b/deps/ngtcp2/ngtcp2/lib/includes/ngtcp2/version.h @@ -22,8 +22,8 @@ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#ifndef VERSION_H -#define VERSION_H +#ifndef NGTCP2_VERSION_H +#define NGTCP2_VERSION_H /** * @macrosection @@ -36,7 +36,7 @@ * * Version number of the ngtcp2 library release. */ -#define NGTCP2_VERSION "1.3.0" +#define NGTCP2_VERSION "1.10.0" /** * @macro @@ -46,6 +46,6 @@ * number, 8 bits for minor and 8 bits for patch. Version 1.2.3 * becomes 0x010203. */ -#define NGTCP2_VERSION_NUM 0x010300 +#define NGTCP2_VERSION_NUM 0x010a00 -#endif /* VERSION_H */ +#endif /* !defined(NGTCP2_VERSION_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_acktr.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_acktr.c index d4778d66accf31..0e5bfe069e9fab 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_acktr.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_acktr.c @@ -29,7 +29,7 @@ #include "ngtcp2_macro.h" #include "ngtcp2_tstamp.h" -ngtcp2_objalloc_def(acktr_entry, ngtcp2_acktr_entry, oplent); +ngtcp2_objalloc_def(acktr_entry, ngtcp2_acktr_entry, oplent) static void acktr_entry_init(ngtcp2_acktr_entry *ent, int64_t pkt_num, ngtcp2_tstamp tstamp) { @@ -56,41 +56,26 @@ void ngtcp2_acktr_entry_objalloc_del(ngtcp2_acktr_entry *ent, ngtcp2_objalloc_acktr_entry_release(objalloc, ent); } -static int greater(const ngtcp2_ksl_key *lhs, const ngtcp2_ksl_key *rhs) { - return *(int64_t *)lhs > *(int64_t *)rhs; -} - -int ngtcp2_acktr_init(ngtcp2_acktr *acktr, ngtcp2_log *log, - const ngtcp2_mem *mem) { - int rv; +void ngtcp2_acktr_init(ngtcp2_acktr *acktr, ngtcp2_log *log, + const ngtcp2_mem *mem) { + ngtcp2_objalloc_acktr_entry_init(&acktr->objalloc, NGTCP2_ACKTR_MAX_ENT + 1, + mem); - ngtcp2_objalloc_acktr_entry_init(&acktr->objalloc, 32, mem); + ngtcp2_static_ringbuf_acks_init(&acktr->acks); - rv = ngtcp2_ringbuf_init(&acktr->acks, 32, sizeof(ngtcp2_acktr_ack_entry), - mem); - if (rv != 0) { - goto fail_acks_init; - } - - ngtcp2_ksl_init(&acktr->ents, greater, sizeof(int64_t), mem); + ngtcp2_ksl_init(&acktr->ents, ngtcp2_ksl_int64_greater, + ngtcp2_ksl_int64_greater_search, sizeof(int64_t), mem); acktr->log = log; - acktr->mem = mem; acktr->flags = NGTCP2_ACKTR_FLAG_NONE; acktr->first_unacked_ts = UINT64_MAX; acktr->rx_npkt = 0; - - return 0; - -fail_acks_init: - ngtcp2_objalloc_free(&acktr->objalloc); - return rv; } void ngtcp2_acktr_free(ngtcp2_acktr *acktr) { #ifdef NOMEMPOOL ngtcp2_ksl_it it; -#endif /* NOMEMPOOL */ +#endif /* defined(NOMEMPOOL) */ if (acktr == NULL) { return; @@ -101,12 +86,10 @@ void ngtcp2_acktr_free(ngtcp2_acktr *acktr) { ngtcp2_ksl_it_next(&it)) { ngtcp2_acktr_entry_objalloc_del(ngtcp2_ksl_it_get(&it), &acktr->objalloc); } -#endif /* NOMEMPOOL */ +#endif /* defined(NOMEMPOOL) */ ngtcp2_ksl_free(&acktr->ents); - ngtcp2_ringbuf_free(&acktr->acks); - ngtcp2_objalloc_free(&acktr->objalloc); } @@ -213,11 +196,11 @@ void ngtcp2_acktr_forget(ngtcp2_acktr *acktr, ngtcp2_acktr_entry *ent) { } } -ngtcp2_ksl_it ngtcp2_acktr_get(ngtcp2_acktr *acktr) { +ngtcp2_ksl_it ngtcp2_acktr_get(const ngtcp2_acktr *acktr) { return ngtcp2_ksl_begin(&acktr->ents); } -int ngtcp2_acktr_empty(ngtcp2_acktr *acktr) { +int ngtcp2_acktr_empty(const ngtcp2_acktr *acktr) { ngtcp2_ksl_it it = ngtcp2_ksl_begin(&acktr->ents); return ngtcp2_ksl_it_end(&it); } @@ -225,7 +208,7 @@ int ngtcp2_acktr_empty(ngtcp2_acktr *acktr) { ngtcp2_acktr_ack_entry *ngtcp2_acktr_add_ack(ngtcp2_acktr *acktr, int64_t pkt_num, int64_t largest_ack) { - ngtcp2_acktr_ack_entry *ent = ngtcp2_ringbuf_push_front(&acktr->acks); + ngtcp2_acktr_ack_entry *ent = ngtcp2_ringbuf_push_front(&acktr->acks.rb); ent->largest_ack = largest_ack; ent->pkt_num = pkt_num; @@ -266,8 +249,10 @@ static void acktr_on_ack(ngtcp2_acktr *acktr, ngtcp2_ringbuf *rb, ngtcp2_ksl_it_prev(&it); ent = ngtcp2_ksl_it_get(&it); - if (ent->pkt_num > ack_ent->largest_ack && - ack_ent->largest_ack >= ent->pkt_num - (int64_t)(ent->len - 1)) { + + assert(ent->pkt_num > ack_ent->largest_ack); + + if (ack_ent->largest_ack + (int64_t)ent->len > ent->pkt_num) { ent->len = (size_t)(ent->pkt_num - ack_ent->largest_ack); } } @@ -279,7 +264,7 @@ void ngtcp2_acktr_recv_ack(ngtcp2_acktr *acktr, const ngtcp2_ack *fr) { ngtcp2_acktr_ack_entry *ent; int64_t largest_ack = fr->largest_ack, min_ack; size_t i, j; - ngtcp2_ringbuf *rb = &acktr->acks; + ngtcp2_ringbuf *rb = &acktr->acks.rb; size_t nacks = ngtcp2_ringbuf_len(rb); /* Assume that ngtcp2_pkt_validate_ack(fr) returns 0 */ @@ -295,7 +280,7 @@ void ngtcp2_acktr_recv_ack(ngtcp2_acktr *acktr, const ngtcp2_ack *fr) { min_ack = largest_ack - (int64_t)fr->first_ack_range; - if (min_ack <= ent->pkt_num && ent->pkt_num <= largest_ack) { + if (min_ack <= ent->pkt_num) { acktr_on_ack(acktr, rb, j); return; } @@ -306,8 +291,7 @@ void ngtcp2_acktr_recv_ack(ngtcp2_acktr *acktr, const ngtcp2_ack *fr) { for (;;) { if (ent->pkt_num > largest_ack) { - ++j; - if (j == nacks) { + if (++j == nacks) { return; } ent = ngtcp2_ringbuf_get(rb, j); @@ -330,7 +314,7 @@ void ngtcp2_acktr_commit_ack(ngtcp2_acktr *acktr) { acktr->rx_npkt = 0; } -int ngtcp2_acktr_require_active_ack(ngtcp2_acktr *acktr, +int ngtcp2_acktr_require_active_ack(const ngtcp2_acktr *acktr, ngtcp2_duration max_ack_delay, ngtcp2_tstamp ts) { return ngtcp2_tstamp_elapsed(acktr->first_unacked_ts, max_ack_delay, ts); diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_acktr.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_acktr.h index 809fb692adc3c8..16aee42f275f67 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_acktr.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_acktr.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -39,7 +39,7 @@ /* NGTCP2_ACKTR_MAX_ENT is the maximum number of ngtcp2_acktr_entry which ngtcp2_acktr stores. */ -#define NGTCP2_ACKTR_MAX_ENT 1024 +#define NGTCP2_ACKTR_MAX_ENT (NGTCP2_MAX_ACK_RANGES + 1) typedef struct ngtcp2_log ngtcp2_log; @@ -65,7 +65,7 @@ typedef struct ngtcp2_acktr_entry { }; } ngtcp2_acktr_entry; -ngtcp2_objalloc_decl(acktr_entry, ngtcp2_acktr_entry, oplent); +ngtcp2_objalloc_decl(acktr_entry, ngtcp2_acktr_entry, oplent) /* * ngtcp2_acktr_entry_objalloc_new allocates memory for ent, and @@ -108,17 +108,18 @@ typedef struct ngtcp2_acktr_ack_entry { expired and canceled. */ #define NGTCP2_ACKTR_FLAG_CANCEL_TIMER 0x0100u +ngtcp2_static_ringbuf_def(acks, 32, sizeof(ngtcp2_acktr_ack_entry)) + /* * ngtcp2_acktr tracks received packets which we have to send ack. */ typedef struct ngtcp2_acktr { ngtcp2_objalloc objalloc; - ngtcp2_ringbuf acks; + ngtcp2_static_ringbuf_acks acks; /* ents includes ngtcp2_acktr_entry sorted by decreasing order of packet number. */ ngtcp2_ksl ents; ngtcp2_log *log; - const ngtcp2_mem *mem; /* flags is bitwise OR of zero, or more of NGTCP2_ACKTR_FLAG_*. */ uint16_t flags; /* first_unacked_ts is timestamp when ngtcp2_acktr_entry is added @@ -131,15 +132,9 @@ typedef struct ngtcp2_acktr { /* * ngtcp2_acktr_init initializes |acktr|. - * - * This function returns 0 if it succeeds, or one of the following - * negative error codes: - * - * NGTCP2_ERR_NOMEM - * Out of memory. */ -int ngtcp2_acktr_init(ngtcp2_acktr *acktr, ngtcp2_log *log, - const ngtcp2_mem *mem); +void ngtcp2_acktr_init(ngtcp2_acktr *acktr, ngtcp2_log *log, + const ngtcp2_mem *mem); /* * ngtcp2_acktr_free frees resources allocated for |acktr|. It frees @@ -174,13 +169,13 @@ void ngtcp2_acktr_forget(ngtcp2_acktr *acktr, ngtcp2_acktr_entry *ent); * has the largest packet number to be acked. If there is no entry, * returned value satisfies ngtcp2_ksl_it_end(&it) != 0. */ -ngtcp2_ksl_it ngtcp2_acktr_get(ngtcp2_acktr *acktr); +ngtcp2_ksl_it ngtcp2_acktr_get(const ngtcp2_acktr *acktr); /* * ngtcp2_acktr_empty returns nonzero if it has no packet to * acknowledge. */ -int ngtcp2_acktr_empty(ngtcp2_acktr *acktr); +int ngtcp2_acktr_empty(const ngtcp2_acktr *acktr); /* * ngtcp2_acktr_add_ack records outgoing ACK frame whose largest @@ -208,7 +203,7 @@ void ngtcp2_acktr_commit_ack(ngtcp2_acktr *acktr); * ngtcp2_acktr_require_active_ack returns nonzero if ACK frame should * be generated actively. */ -int ngtcp2_acktr_require_active_ack(ngtcp2_acktr *acktr, +int ngtcp2_acktr_require_active_ack(const ngtcp2_acktr *acktr, ngtcp2_duration max_ack_delay, ngtcp2_tstamp ts); @@ -218,4 +213,4 @@ int ngtcp2_acktr_require_active_ack(ngtcp2_acktr *acktr, */ void ngtcp2_acktr_immediate_ack(ngtcp2_acktr *acktr); -#endif /* NGTCP2_ACKTR_H */ +#endif /* !defined(NGTCP2_ACKTR_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_addr.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_addr.h index 8e3a9f591d9977..65ee7cd9f3006b 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_addr.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_addr.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -68,4 +68,4 @@ uint32_t ngtcp2_addr_compare(const ngtcp2_addr *a, const ngtcp2_addr *b); */ int ngtcp2_addr_empty(const ngtcp2_addr *addr); -#endif /* NGTCP2_ADDR_H */ +#endif /* !defined(NGTCP2_ADDR_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_balloc.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_balloc.c index 5cc39ee3b03da4..4a6797689fcc01 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_balloc.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_balloc.c @@ -66,7 +66,7 @@ int ngtcp2_balloc_get(ngtcp2_balloc *balloc, void **pbuf, size_t n) { if (ngtcp2_buf_left(&balloc->buf) < n) { p = ngtcp2_mem_malloc(balloc->mem, - sizeof(ngtcp2_memblock_hd) + 0x10u + balloc->blklen); + sizeof(ngtcp2_memblock_hd) + 0x8u + balloc->blklen); if (p == NULL) { return NGTCP2_ERR_NOMEM; } @@ -75,10 +75,10 @@ int ngtcp2_balloc_get(ngtcp2_balloc *balloc, void **pbuf, size_t n) { hd->next = balloc->head; balloc->head = hd; ngtcp2_buf_init( - &balloc->buf, - (uint8_t *)(((uintptr_t)p + sizeof(ngtcp2_memblock_hd) + 0xfu) & - ~(uintptr_t)0xfu), - balloc->blklen); + &balloc->buf, + (uint8_t *)(((uintptr_t)p + sizeof(ngtcp2_memblock_hd) + 0xfu) & + ~(uintptr_t)0xfu), + balloc->blklen); } assert(((uintptr_t)balloc->buf.last & 0xfu) == 0); diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_balloc.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_balloc.h index 1fb16325d9953d..c0e2a3f7562968 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_balloc.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_balloc.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -39,7 +39,10 @@ typedef struct ngtcp2_memblock_hd ngtcp2_memblock_hd; * ngtcp2_memblock_hd is the header of memory block. */ struct ngtcp2_memblock_hd { - ngtcp2_memblock_hd *next; + union { + ngtcp2_memblock_hd *next; + uint64_t pad; + }; }; /* @@ -60,7 +63,7 @@ typedef struct ngtcp2_balloc { /* * ngtcp2_balloc_init initializes |balloc| with |blklen| which is the - * size of memory block. + * size of memory block. |blklen| must be divisible by 16. */ void ngtcp2_balloc_init(ngtcp2_balloc *balloc, size_t blklen, const ngtcp2_mem *mem); @@ -88,4 +91,4 @@ int ngtcp2_balloc_get(ngtcp2_balloc *balloc, void **pbuf, size_t n); */ void ngtcp2_balloc_clear(ngtcp2_balloc *balloc); -#endif /* NGTCP2_BALLOC_H */ +#endif /* !defined(NGTCP2_BALLOC_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_bbr.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_bbr.c index 27c4667c03924a..8777ca4c8a1632 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_bbr.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_bbr.c @@ -39,8 +39,9 @@ #define NGTCP2_BBR_EXTRA_ACKED_FILTERLEN 10 #define NGTCP2_BBR_STARTUP_PACING_GAIN_H 277 +#define NGTCP2_BBR_DRAIN_PACING_GAIN_H 35 -#define NGTCP2_BBR_STARTUP_CWND_GAIN_H 200 +#define NGTCP2_BBR_DEFAULT_CWND_GAIN_H 200 #define NGTCP2_BBR_PROBE_RTT_CWND_GAIN_H 50 @@ -72,7 +73,7 @@ static void bbr_reset_lower_bounds(ngtcp2_cc_bbr *bbr); static void bbr_init_round_counting(ngtcp2_cc_bbr *bbr); -static void bbr_init_full_pipe(ngtcp2_cc_bbr *bbr); +static void bbr_reset_full_bw(ngtcp2_cc_bbr *bbr); static void bbr_init_pacing_rate(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat); @@ -84,8 +85,7 @@ static void bbr_set_pacing_rate(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat); static void bbr_enter_startup(ngtcp2_cc_bbr *bbr); -static void bbr_check_startup_done(ngtcp2_cc_bbr *bbr, - const ngtcp2_cc_ack *ack); +static void bbr_check_startup_done(ngtcp2_cc_bbr *bbr); static void bbr_update_on_ack(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, const ngtcp2_cc_ack *ack, ngtcp2_tstamp ts); @@ -148,16 +148,17 @@ static void bbr_start_probe_bw_cruise(ngtcp2_cc_bbr *bbr); static void bbr_start_probe_bw_refill(ngtcp2_cc_bbr *bbr); -static void bbr_start_probe_bw_up(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, - ngtcp2_tstamp ts); +static void bbr_start_probe_bw_up(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat); static void bbr_update_probe_bw_cycle_phase(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, const ngtcp2_cc_ack *ack, ngtcp2_tstamp ts); -static int bbr_check_time_to_cruise(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, - ngtcp2_tstamp ts); +static int bbr_is_time_to_cruise(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, + ngtcp2_tstamp ts); + +static int bbr_is_time_to_go_down(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat); static int bbr_has_elapsed_in_phase(ngtcp2_cc_bbr *bbr, ngtcp2_duration interval, ngtcp2_tstamp ts); @@ -175,9 +176,8 @@ static void bbr_probe_inflight_hi_upward(ngtcp2_cc_bbr *bbr, static void bbr_adapt_upper_bounds(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, const ngtcp2_cc_ack *ack, ngtcp2_tstamp ts); -static int bbr_check_time_to_probe_bw(ngtcp2_cc_bbr *bbr, - ngtcp2_conn_stat *cstat, - ngtcp2_tstamp ts); +static int bbr_is_time_to_probe_bw(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, + ngtcp2_tstamp ts); static void bbr_pick_probe_wait(ngtcp2_cc_bbr *bbr); @@ -197,6 +197,8 @@ static void bbr_handle_inflight_too_high(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, const ngtcp2_rs *rs, ngtcp2_tstamp ts); +static void bbr_note_loss(ngtcp2_cc_bbr *bbr); + static void bbr_handle_lost_packet(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, const ngtcp2_cc_pkt *pkt, ngtcp2_tstamp ts); @@ -227,15 +229,14 @@ static void bbr_handle_restart_from_idle(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, ngtcp2_tstamp ts); -static uint64_t bbr_bdp_multiple(ngtcp2_cc_bbr *bbr, uint64_t bw, - uint64_t gain_h); +static uint64_t bbr_bdp_multiple(ngtcp2_cc_bbr *bbr, uint64_t gain_h); static uint64_t bbr_quantization_budget(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, uint64_t inflight); static uint64_t bbr_inflight(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, - uint64_t bw, uint64_t gain_h); + uint64_t gain_h); static void bbr_update_max_inflight(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat); @@ -247,10 +248,6 @@ static uint64_t min_pipe_cwnd(size_t max_udp_payload_size); static void bbr_advance_max_bw_filter(ngtcp2_cc_bbr *bbr); -static void bbr_modulate_cwnd_for_recovery(ngtcp2_cc_bbr *bbr, - ngtcp2_conn_stat *cstat, - const ngtcp2_cc_ack *ack); - static void bbr_save_cwnd(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat); static void bbr_restore_cwnd(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat); @@ -272,7 +269,7 @@ static int in_congestion_recovery(const ngtcp2_conn_stat *cstat, ngtcp2_tstamp sent_time); static void bbr_handle_recovery(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, - const ngtcp2_cc_ack *ack, ngtcp2_tstamp ts); + const ngtcp2_cc_ack *ack); static void bbr_on_init(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, ngtcp2_tstamp initial_ts) { @@ -289,11 +286,12 @@ static void bbr_on_init(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, bbr->idle_restart = 0; bbr->extra_acked_interval_start = initial_ts; bbr->extra_acked_delivered = 0; + bbr->full_bw_reached = 0; bbr_reset_congestion_signals(bbr); bbr_reset_lower_bounds(bbr); bbr_init_round_counting(bbr); - bbr_init_full_pipe(bbr); + bbr_reset_full_bw(bbr); bbr_init_pacing_rate(bbr, cstat); bbr_enter_startup(bbr); @@ -326,23 +324,17 @@ static void bbr_on_init(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, bbr->bw_probe_up_acks = 0; bbr->inflight_hi = UINT64_MAX; - bbr->bw_hi = UINT64_MAX; bbr->probe_rtt_expired = 0; bbr->probe_rtt_min_delay = UINT64_MAX; bbr->probe_rtt_min_stamp = initial_ts; bbr->in_loss_recovery = 0; - bbr->packet_conservation = 0; + bbr->round_count_at_recovery = UINT64_MAX; bbr->max_inflight = 0; bbr->congestion_recovery_start_ts = UINT64_MAX; - bbr->congestion_recovery_next_round_delivered = 0; - - bbr->prior_inflight_lo = 0; - bbr->prior_inflight_hi = 0; - bbr->prior_bw_lo = 0; } static void bbr_reset_congestion_signals(ngtcp2_cc_bbr *bbr) { @@ -362,48 +354,53 @@ static void bbr_init_round_counting(ngtcp2_cc_bbr *bbr) { bbr->round_count = 0; } -static void bbr_init_full_pipe(ngtcp2_cc_bbr *bbr) { - bbr->filled_pipe = 0; +static void bbr_reset_full_bw(ngtcp2_cc_bbr *bbr) { bbr->full_bw = 0; bbr->full_bw_count = 0; + bbr->full_bw_now = 0; } -static void bbr_check_startup_full_bandwidth(ngtcp2_cc_bbr *bbr) { - if (bbr->filled_pipe || !bbr->round_start || bbr->rst->rs.is_app_limited) { +static void bbr_check_full_bw_reached(ngtcp2_cc_bbr *bbr, + ngtcp2_conn_stat *cstat) { + if (bbr->full_bw_now || bbr->rst->rs.is_app_limited) { return; } - if (bbr->max_bw * 100 >= bbr->full_bw * 125) { - bbr->full_bw = bbr->max_bw; - bbr->full_bw_count = 0; - } - - ++bbr->full_bw_count; - - if (bbr->full_bw_count >= 3) { - bbr->filled_pipe = 1; + if (cstat->delivery_rate_sec * 100 >= bbr->full_bw * 125) { + bbr_reset_full_bw(bbr); + bbr->full_bw = cstat->delivery_rate_sec; - ngtcp2_log_info(bbr->cc.log, NGTCP2_LOG_EVENT_CCA, - "bbr filled pipe, full_bw=%" PRIu64, bbr->full_bw); + return; } -} -static void bbr_check_startup_high_loss(ngtcp2_cc_bbr *bbr, - const ngtcp2_cc_ack *ack) { - if (bbr->filled_pipe || !bbr->round_start || bbr->rst->rs.is_app_limited) { + if (!bbr->round_start) { return; } - if (bbr->loss_events_in_round <= 3) { + ++bbr->full_bw_count; + + bbr->full_bw_now = bbr->full_bw_count >= 3; + if (!bbr->full_bw_now) { return; } - /* loss_thresh = 2% */ - if (bbr->bytes_lost_in_round * 100 <= ack->prior_bytes_in_flight * 2) { + bbr->full_bw_reached = 1; + + ngtcp2_log_info(bbr->cc.log, NGTCP2_LOG_EVENT_CCA, + "bbr reached full bandwidth, full_bw=%" PRIu64, bbr->full_bw); +} + +static void bbr_check_startup_high_loss(ngtcp2_cc_bbr *bbr) { + if (bbr->full_bw_reached || bbr->loss_events_in_round <= 6 || + (bbr->in_loss_recovery && + bbr->round_count <= bbr->round_count_at_recovery) || + !is_inflight_too_high(&bbr->rst->rs)) { return; } - bbr->filled_pipe = 1; + bbr->full_bw_reached = 1; + bbr->inflight_hi = ngtcp2_max_uint64(bbr_bdp_multiple(bbr, bbr->cwnd_gain_h), + bbr->inflight_latest); } static void bbr_init_pacing_rate(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat) { @@ -423,7 +420,7 @@ static void bbr_set_pacing_rate_with_gain(ngtcp2_cc_bbr *bbr, interval = NGTCP2_SECONDS * 100 * 100 / pacing_gain_h / bbr->bw / (100 - NGTCP2_BBR_PACING_MARGIN_PERCENT); - if (bbr->filled_pipe || interval < cstat->pacing_interval) { + if (bbr->full_bw_reached || interval < cstat->pacing_interval) { cstat->pacing_interval = interval; } } @@ -437,15 +434,13 @@ static void bbr_enter_startup(ngtcp2_cc_bbr *bbr) { bbr->state = NGTCP2_BBR_STATE_STARTUP; bbr->pacing_gain_h = NGTCP2_BBR_STARTUP_PACING_GAIN_H; - bbr->cwnd_gain_h = NGTCP2_BBR_STARTUP_CWND_GAIN_H; + bbr->cwnd_gain_h = NGTCP2_BBR_DEFAULT_CWND_GAIN_H; } -static void bbr_check_startup_done(ngtcp2_cc_bbr *bbr, - const ngtcp2_cc_ack *ack) { - bbr_check_startup_full_bandwidth(bbr); - bbr_check_startup_high_loss(bbr, ack); +static void bbr_check_startup_done(ngtcp2_cc_bbr *bbr) { + bbr_check_startup_high_loss(bbr); - if (bbr->state == NGTCP2_BBR_STATE_STARTUP && bbr->filled_pipe) { + if (bbr->state == NGTCP2_BBR_STATE_STARTUP && bbr->full_bw_reached) { bbr_enter_drain(bbr); } } @@ -468,7 +463,8 @@ static void bbr_update_model_and_state(ngtcp2_cc_bbr *bbr, bbr_update_latest_delivery_signals(bbr, cstat); bbr_update_congestion_signals(bbr, cstat, ack); bbr_update_ack_aggregation(bbr, cstat, ack, ts); - bbr_check_startup_done(bbr, ack); + bbr_check_full_bw_reached(bbr, cstat); + bbr_check_startup_done(bbr); bbr_check_drain(bbr, cstat, ts); bbr_update_probe_bw_cycle_phase(bbr, cstat, ack, ts); bbr_update_min_rtt(bbr, ack, ts); @@ -493,9 +489,9 @@ static void bbr_update_on_loss(ngtcp2_cc_bbr *cc, ngtcp2_conn_stat *cstat, static void bbr_update_latest_delivery_signals(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat) { bbr->loss_round_start = 0; - bbr->bw_latest = ngtcp2_max(bbr->bw_latest, cstat->delivery_rate_sec); + bbr->bw_latest = ngtcp2_max_uint64(bbr->bw_latest, cstat->delivery_rate_sec); bbr->inflight_latest = - ngtcp2_max(bbr->inflight_latest, bbr->rst->rs.delivered); + ngtcp2_max_uint64(bbr->inflight_latest, bbr->rst->rs.delivered); if (bbr->rst->rs.prior_delivered >= bbr->loss_round_delivered) { bbr->loss_round_delivered = bbr->rst->delivered; @@ -519,11 +515,6 @@ static void bbr_update_congestion_signals(ngtcp2_cc_bbr *bbr, if (ack->bytes_lost) { bbr->bytes_lost_in_round += ack->bytes_lost; ++bbr->loss_events_in_round; - - if (!bbr->loss_in_round) { - bbr->loss_in_round = 1; - bbr->loss_round_delivered = bbr->rst->delivered; - } } if (!bbr->loss_round_start) { @@ -558,16 +549,15 @@ static void bbr_init_lower_bounds(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat) { } static void bbr_loss_lower_bounds(ngtcp2_cc_bbr *bbr) { - bbr->bw_lo = ngtcp2_max(bbr->bw_latest, bbr->bw_lo * NGTCP2_BBR_BETA_NUMER / - NGTCP2_BBR_BETA_DENOM); - bbr->inflight_lo = ngtcp2_max(bbr->inflight_latest, - bbr->inflight_lo * NGTCP2_BBR_BETA_NUMER / - NGTCP2_BBR_BETA_DENOM); + bbr->bw_lo = ngtcp2_max_uint64( + bbr->bw_latest, bbr->bw_lo * NGTCP2_BBR_BETA_NUMER / NGTCP2_BBR_BETA_DENOM); + bbr->inflight_lo = ngtcp2_max_uint64( + bbr->inflight_latest, + bbr->inflight_lo * NGTCP2_BBR_BETA_NUMER / NGTCP2_BBR_BETA_DENOM); } static void bbr_bound_bw_for_model(ngtcp2_cc_bbr *bbr) { - bbr->bw = ngtcp2_min(bbr->max_bw, bbr->bw_lo); - bbr->bw = ngtcp2_min(bbr->bw, bbr->bw_hi); + bbr->bw = ngtcp2_min_uint64(bbr->max_bw, bbr->bw_lo); } static void bbr_update_max_bw(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, @@ -633,7 +623,13 @@ static void bbr_update_ack_aggregation(ngtcp2_cc_bbr *bbr, bbr->extra_acked_delivered += ack->bytes_delivered; extra = bbr->extra_acked_delivered - expected_delivered; - extra = ngtcp2_min(extra, cstat->cwnd); + extra = ngtcp2_min_uint64(extra, cstat->cwnd); + + if (bbr->full_bw_reached) { + bbr->extra_acked_filter.window_length = NGTCP2_BBR_EXTRA_ACKED_FILTERLEN; + } else { + bbr->extra_acked_filter.window_length = 1; + } ngtcp2_window_filter_update(&bbr->extra_acked_filter, extra, bbr->round_count); @@ -645,14 +641,14 @@ static void bbr_enter_drain(ngtcp2_cc_bbr *bbr) { ngtcp2_log_info(bbr->cc.log, NGTCP2_LOG_EVENT_CCA, "bbr enter Drain"); bbr->state = NGTCP2_BBR_STATE_DRAIN; - bbr->pacing_gain_h = 100 * 100 / NGTCP2_BBR_STARTUP_CWND_GAIN_H; - bbr->cwnd_gain_h = NGTCP2_BBR_STARTUP_CWND_GAIN_H; + bbr->pacing_gain_h = NGTCP2_BBR_DRAIN_PACING_GAIN_H; + bbr->cwnd_gain_h = NGTCP2_BBR_DEFAULT_CWND_GAIN_H; } static void bbr_check_drain(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, ngtcp2_tstamp ts) { if (bbr->state == NGTCP2_BBR_STATE_DRAIN && - cstat->bytes_in_flight <= bbr_inflight(bbr, cstat, bbr->bw, 100)) { + cstat->bytes_in_flight <= bbr_inflight(bbr, cstat, 100)) { bbr_enter_probe_bw(bbr, ts); } } @@ -677,7 +673,7 @@ static void bbr_start_probe_bw_down(ngtcp2_cc_bbr *bbr, ngtcp2_tstamp ts) { bbr->state = NGTCP2_BBR_STATE_PROBE_BW_DOWN; bbr->pacing_gain_h = 90; - bbr->cwnd_gain_h = 200; + bbr->cwnd_gain_h = NGTCP2_BBR_DEFAULT_CWND_GAIN_H; } static void bbr_start_probe_bw_cruise(ngtcp2_cc_bbr *bbr) { @@ -686,7 +682,7 @@ static void bbr_start_probe_bw_cruise(ngtcp2_cc_bbr *bbr) { bbr->state = NGTCP2_BBR_STATE_PROBE_BW_CRUISE; bbr->pacing_gain_h = 100; - bbr->cwnd_gain_h = 200; + bbr->cwnd_gain_h = NGTCP2_BBR_DEFAULT_CWND_GAIN_H; } static void bbr_start_probe_bw_refill(ngtcp2_cc_bbr *bbr) { @@ -703,18 +699,18 @@ static void bbr_start_probe_bw_refill(ngtcp2_cc_bbr *bbr) { bbr->state = NGTCP2_BBR_STATE_PROBE_BW_REFILL; bbr->pacing_gain_h = 100; - bbr->cwnd_gain_h = 200; + bbr->cwnd_gain_h = NGTCP2_BBR_DEFAULT_CWND_GAIN_H; } -static void bbr_start_probe_bw_up(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, - ngtcp2_tstamp ts) { +static void bbr_start_probe_bw_up(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat) { ngtcp2_log_info(bbr->cc.log, NGTCP2_LOG_EVENT_CCA, "bbr start ProbeBW_UP"); bbr->ack_phase = NGTCP2_BBR_ACK_PHASE_ACKS_PROBE_STARTING; bbr_start_round(bbr); + bbr_reset_full_bw(bbr); - bbr->cycle_stamp = ts; + bbr->full_bw = cstat->delivery_rate_sec; bbr->state = NGTCP2_BBR_STATE_PROBE_BW_UP; bbr->pacing_gain_h = 125; bbr->cwnd_gain_h = 225; @@ -726,7 +722,7 @@ static void bbr_update_probe_bw_cycle_phase(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, const ngtcp2_cc_ack *ack, ngtcp2_tstamp ts) { - if (!bbr->filled_pipe) { + if (!bbr->full_bw_reached) { return; } @@ -738,17 +734,17 @@ static void bbr_update_probe_bw_cycle_phase(ngtcp2_cc_bbr *bbr, switch (bbr->state) { case NGTCP2_BBR_STATE_PROBE_BW_DOWN: - if (bbr_check_time_to_probe_bw(bbr, cstat, ts)) { + if (bbr_is_time_to_probe_bw(bbr, cstat, ts)) { return; } - if (bbr_check_time_to_cruise(bbr, cstat, ts)) { + if (bbr_is_time_to_cruise(bbr, cstat, ts)) { bbr_start_probe_bw_cruise(bbr); } break; case NGTCP2_BBR_STATE_PROBE_BW_CRUISE: - if (bbr_check_time_to_probe_bw(bbr, cstat, ts)) { + if (bbr_is_time_to_probe_bw(bbr, cstat, ts)) { return; } @@ -756,13 +752,12 @@ static void bbr_update_probe_bw_cycle_phase(ngtcp2_cc_bbr *bbr, case NGTCP2_BBR_STATE_PROBE_BW_REFILL: if (bbr->round_start) { bbr->bw_probe_samples = 1; - bbr_start_probe_bw_up(bbr, cstat, ts); + bbr_start_probe_bw_up(bbr, cstat); } break; case NGTCP2_BBR_STATE_PROBE_BW_UP: - if (bbr_has_elapsed_in_phase(bbr, bbr->min_rtt, ts) && - cstat->bytes_in_flight > bbr_inflight(bbr, cstat, bbr->max_bw, 125)) { + if (bbr_is_time_to_go_down(bbr, cstat)) { bbr_start_probe_bw_down(bbr, ts); } @@ -772,15 +767,26 @@ static void bbr_update_probe_bw_cycle_phase(ngtcp2_cc_bbr *bbr, } } -static int bbr_check_time_to_cruise(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, - ngtcp2_tstamp ts) { +static int bbr_is_time_to_cruise(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, + ngtcp2_tstamp ts) { (void)ts; if (cstat->bytes_in_flight > bbr_inflight_with_headroom(bbr, cstat)) { return 0; } - if (cstat->bytes_in_flight <= bbr_inflight(bbr, cstat, bbr->max_bw, 100)) { + if (cstat->bytes_in_flight <= bbr_inflight(bbr, cstat, 100)) { + return 1; + } + + return 0; +} + +static int bbr_is_time_to_go_down(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat) { + if (bbr->rst->is_cwnd_limited && cstat->cwnd >= bbr->inflight_hi) { + bbr_reset_full_bw(bbr); + bbr->full_bw = cstat->delivery_rate_sec; + } else if (bbr->full_bw_now) { return 1; } @@ -801,13 +807,13 @@ static uint64_t bbr_inflight_with_headroom(ngtcp2_cc_bbr *bbr, return UINT64_MAX; } - headroom = ngtcp2_max(cstat->max_tx_udp_payload_size, - bbr->inflight_hi * NGTCP2_BBR_HEADROOM_NUMER / - NGTCP2_BBR_HEADROOM_DENOM); + headroom = ngtcp2_max_uint64(cstat->max_tx_udp_payload_size, + bbr->inflight_hi * NGTCP2_BBR_HEADROOM_NUMER / + NGTCP2_BBR_HEADROOM_DENOM); mpcwnd = min_pipe_cwnd(cstat->max_tx_udp_payload_size); if (bbr->inflight_hi > headroom) { - return ngtcp2_max(bbr->inflight_hi - headroom, mpcwnd); + return ngtcp2_max_uint64(bbr->inflight_hi - headroom, mpcwnd); } return mpcwnd; @@ -818,8 +824,8 @@ static void bbr_raise_inflight_hi_slope(ngtcp2_cc_bbr *bbr, uint64_t growth_this_round = cstat->max_tx_udp_payload_size << bbr->bw_probe_up_rounds; - bbr->bw_probe_up_rounds = ngtcp2_min(bbr->bw_probe_up_rounds + 1, 30); - bbr->probe_up_cnt = ngtcp2_max(cstat->cwnd / growth_this_round, 1) * + bbr->bw_probe_up_rounds = ngtcp2_min_size(bbr->bw_probe_up_rounds + 1, 30); + bbr->probe_up_cnt = ngtcp2_max_uint64(cstat->cwnd / growth_this_round, 1) * cstat->max_tx_udp_payload_size; } @@ -860,8 +866,7 @@ static void bbr_adapt_upper_bounds(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, } if (!bbr_check_inflight_too_high(bbr, cstat, ts)) { - /* bbr->bw_hi never be updated */ - if (bbr->inflight_hi == UINT64_MAX /* || bbr->bw_hi == UINT64_MAX */) { + if (bbr->inflight_hi == UINT64_MAX) { return; } @@ -869,19 +874,14 @@ static void bbr_adapt_upper_bounds(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, bbr->inflight_hi = bbr->rst->rs.tx_in_flight; } - if (cstat->delivery_rate_sec > bbr->bw_hi) { - bbr->bw_hi = cstat->delivery_rate_sec; - } - if (bbr->state == NGTCP2_BBR_STATE_PROBE_BW_UP) { bbr_probe_inflight_hi_upward(bbr, cstat, ack); } } } -static int bbr_check_time_to_probe_bw(ngtcp2_cc_bbr *bbr, - ngtcp2_conn_stat *cstat, - ngtcp2_tstamp ts) { +static int bbr_is_time_to_probe_bw(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, + ngtcp2_tstamp ts) { if (bbr_has_elapsed_in_phase(bbr, bbr->bw_probe_wait, ts) || bbr_is_reno_coexistence_probe_time(bbr, cstat)) { bbr_start_probe_bw_refill(bbr); @@ -902,22 +902,22 @@ static void bbr_pick_probe_wait(ngtcp2_cc_bbr *bbr) { bbr->rand(&rand, 1, &bbr->rand_ctx); bbr->bw_probe_wait = - 2 * NGTCP2_SECONDS + (ngtcp2_tstamp)(NGTCP2_SECONDS * rand / 255); + 2 * NGTCP2_SECONDS + (ngtcp2_tstamp)(NGTCP2_SECONDS * rand / 255); } static int bbr_is_reno_coexistence_probe_time(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat) { uint64_t reno_rounds = - bbr_target_inflight(bbr, cstat) / cstat->max_tx_udp_payload_size; + bbr_target_inflight(bbr, cstat) / cstat->max_tx_udp_payload_size; - return bbr->rounds_since_bw_probe >= ngtcp2_min(reno_rounds, 63); + return bbr->rounds_since_bw_probe >= ngtcp2_min_uint64(reno_rounds, 63); } static uint64_t bbr_target_inflight(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat) { - uint64_t bdp = bbr_inflight(bbr, cstat, bbr->bw, 100); + uint64_t bdp = bbr_bdp_multiple(bbr, bbr->cwnd_gain_h); - return ngtcp2_min(bdp, cstat->cwnd); + return ngtcp2_min_uint64(bdp, cstat->cwnd); } static int bbr_check_inflight_too_high(ngtcp2_cc_bbr *bbr, @@ -946,9 +946,9 @@ static void bbr_handle_inflight_too_high(ngtcp2_cc_bbr *bbr, bbr->bw_probe_samples = 0; if (!rs->is_app_limited) { - bbr->inflight_hi = ngtcp2_max( - rs->tx_in_flight, bbr_target_inflight(bbr, cstat) * - NGTCP2_BBR_BETA_NUMER / NGTCP2_BBR_BETA_DENOM); + bbr->inflight_hi = ngtcp2_max_uint64( + rs->tx_in_flight, bbr_target_inflight(bbr, cstat) * + NGTCP2_BBR_BETA_NUMER / NGTCP2_BBR_BETA_DENOM); } if (bbr->state == NGTCP2_BBR_STATE_PROBE_BW_UP) { @@ -956,10 +956,21 @@ static void bbr_handle_inflight_too_high(ngtcp2_cc_bbr *bbr, } } +static void bbr_note_loss(ngtcp2_cc_bbr *bbr) { + if (bbr->loss_in_round) { + return; + } + + bbr->loss_in_round = 1; + bbr->loss_round_delivered = bbr->rst->delivered; +} + static void bbr_handle_lost_packet(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, const ngtcp2_cc_pkt *pkt, ngtcp2_tstamp ts) { ngtcp2_rs rs = {0}; + bbr_note_loss(bbr); + if (!bbr->bw_probe_samples) { return; } @@ -1007,7 +1018,7 @@ static void bbr_update_min_rtt(ngtcp2_cc_bbr *bbr, const ngtcp2_cc_ack *ack, int min_rtt_expired; bbr->probe_rtt_expired = - ts > bbr->probe_rtt_min_stamp + NGTCP2_BBR_PROBE_RTT_INTERVAL; + ts > bbr->probe_rtt_min_stamp + NGTCP2_BBR_PROBE_RTT_INTERVAL; if (ack->rtt != UINT64_MAX && (ack->rtt < bbr->probe_rtt_min_delay || bbr->probe_rtt_expired)) { @@ -1106,7 +1117,7 @@ static void bbr_mark_connection_app_limited(ngtcp2_cc_bbr *bbr, static void bbr_exit_probe_rtt(ngtcp2_cc_bbr *bbr, ngtcp2_tstamp ts) { bbr_reset_lower_bounds(bbr); - if (bbr->filled_pipe) { + if (bbr->full_bw_reached) { bbr_start_probe_bw_down(bbr, ts); bbr_start_probe_bw_cruise(bbr); } else { @@ -1131,15 +1142,14 @@ static void bbr_handle_restart_from_idle(ngtcp2_cc_bbr *bbr, } } -static uint64_t bbr_bdp_multiple(ngtcp2_cc_bbr *bbr, uint64_t bw, - uint64_t gain_h) { +static uint64_t bbr_bdp_multiple(ngtcp2_cc_bbr *bbr, uint64_t gain_h) { uint64_t bdp; if (bbr->min_rtt == UINT64_MAX) { return bbr->initial_cwnd; } - bdp = bw * bbr->min_rtt / NGTCP2_SECONDS; + bdp = ngtcp2_max_uint64(bbr->bw * bbr->min_rtt / NGTCP2_SECONDS, 1); return (uint64_t)(bdp * gain_h / 100); } @@ -1153,9 +1163,9 @@ static uint64_t bbr_quantization_budget(ngtcp2_cc_bbr *bbr, uint64_t inflight) { bbr_update_offload_budget(bbr, cstat); - inflight = ngtcp2_max(inflight, bbr->offload_budget); + inflight = ngtcp2_max_uint64(inflight, bbr->offload_budget); inflight = - ngtcp2_max(inflight, min_pipe_cwnd(cstat->max_tx_udp_payload_size)); + ngtcp2_max_uint64(inflight, min_pipe_cwnd(cstat->max_tx_udp_payload_size)); if (bbr->state == NGTCP2_BBR_STATE_PROBE_BW_UP) { inflight += 2 * cstat->max_tx_udp_payload_size; @@ -1165,8 +1175,8 @@ static uint64_t bbr_quantization_budget(ngtcp2_cc_bbr *bbr, } static uint64_t bbr_inflight(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, - uint64_t bw, uint64_t gain_h) { - uint64_t inflight = bbr_bdp_multiple(bbr, bw, gain_h); + uint64_t gain_h) { + uint64_t inflight = bbr_bdp_multiple(bbr, gain_h); return bbr_quantization_budget(bbr, cstat, inflight); } @@ -1178,8 +1188,7 @@ static void bbr_update_max_inflight(ngtcp2_cc_bbr *bbr, /* Not documented */ /* bbr_update_aggregation_budget(bbr); */ - inflight = - bbr_bdp_multiple(bbr, bbr->bw, bbr->cwnd_gain_h) + bbr->extra_acked; + inflight = bbr_bdp_multiple(bbr, bbr->cwnd_gain_h) + bbr->extra_acked; bbr->max_inflight = bbr_quantization_budget(bbr, cstat, inflight); } @@ -1192,44 +1201,26 @@ static void bbr_advance_max_bw_filter(ngtcp2_cc_bbr *bbr) { ++bbr->cycle_count; } -static void bbr_modulate_cwnd_for_recovery(ngtcp2_cc_bbr *bbr, - ngtcp2_conn_stat *cstat, - const ngtcp2_cc_ack *ack) { - if (ack->bytes_lost > 0) { - if (cstat->cwnd > ack->bytes_lost) { - cstat->cwnd -= ack->bytes_lost; - cstat->cwnd = ngtcp2_max(cstat->cwnd, 2 * cstat->max_tx_udp_payload_size); - } else { - cstat->cwnd = 2 * cstat->max_tx_udp_payload_size; - } - } - - if (bbr->packet_conservation) { - cstat->cwnd = - ngtcp2_max(cstat->cwnd, cstat->bytes_in_flight + ack->bytes_delivered); - } -} - static void bbr_save_cwnd(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat) { if (!bbr->in_loss_recovery && bbr->state != NGTCP2_BBR_STATE_PROBE_RTT) { bbr->prior_cwnd = cstat->cwnd; return; } - bbr->prior_cwnd = ngtcp2_max(bbr->prior_cwnd, cstat->cwnd); + bbr->prior_cwnd = ngtcp2_max_uint64(bbr->prior_cwnd, cstat->cwnd); } static void bbr_restore_cwnd(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat) { - cstat->cwnd = ngtcp2_max(cstat->cwnd, bbr->prior_cwnd); + cstat->cwnd = ngtcp2_max_uint64(cstat->cwnd, bbr->prior_cwnd); } static uint64_t bbr_probe_rtt_cwnd(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat) { uint64_t probe_rtt_cwnd = - bbr_bdp_multiple(bbr, bbr->bw, NGTCP2_BBR_PROBE_RTT_CWND_GAIN_H); + bbr_bdp_multiple(bbr, NGTCP2_BBR_PROBE_RTT_CWND_GAIN_H); uint64_t mpcwnd = min_pipe_cwnd(cstat->max_tx_udp_payload_size); - return ngtcp2_max(probe_rtt_cwnd, mpcwnd); + return ngtcp2_max_uint64(probe_rtt_cwnd, mpcwnd); } static void bbr_bound_cwnd_for_probe_rtt(ngtcp2_cc_bbr *bbr, @@ -1239,7 +1230,7 @@ static void bbr_bound_cwnd_for_probe_rtt(ngtcp2_cc_bbr *bbr, if (bbr->state == NGTCP2_BBR_STATE_PROBE_RTT) { probe_rtt_cwnd = bbr_probe_rtt_cwnd(bbr, cstat); - cstat->cwnd = ngtcp2_min(cstat->cwnd, probe_rtt_cwnd); + cstat->cwnd = ngtcp2_min_uint64(cstat->cwnd, probe_rtt_cwnd); } } @@ -1248,21 +1239,18 @@ static void bbr_set_cwnd(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, uint64_t mpcwnd; bbr_update_max_inflight(bbr, cstat); - bbr_modulate_cwnd_for_recovery(bbr, cstat, ack); - - if (!bbr->packet_conservation) { - if (bbr->filled_pipe) { - cstat->cwnd += ack->bytes_delivered; - cstat->cwnd = ngtcp2_min(cstat->cwnd, bbr->max_inflight); - } else if (cstat->cwnd < bbr->max_inflight || - bbr->rst->delivered < bbr->initial_cwnd) { - cstat->cwnd += ack->bytes_delivered; - } - mpcwnd = min_pipe_cwnd(cstat->max_tx_udp_payload_size); - cstat->cwnd = ngtcp2_max(cstat->cwnd, mpcwnd); + if (bbr->full_bw_reached) { + cstat->cwnd += ack->bytes_delivered; + cstat->cwnd = ngtcp2_min_uint64(cstat->cwnd, bbr->max_inflight); + } else if (cstat->cwnd < bbr->max_inflight || + bbr->rst->delivered < bbr->initial_cwnd) { + cstat->cwnd += ack->bytes_delivered; } + mpcwnd = min_pipe_cwnd(cstat->max_tx_udp_payload_size); + cstat->cwnd = ngtcp2_max_uint64(cstat->cwnd, mpcwnd); + bbr_bound_cwnd_for_probe_rtt(bbr, cstat); bbr_bound_cwnd_for_model(bbr, cstat); } @@ -1280,30 +1268,23 @@ static void bbr_bound_cwnd_for_model(ngtcp2_cc_bbr *bbr, cap = bbr_inflight_with_headroom(bbr, cstat); } - cap = ngtcp2_min(cap, bbr->inflight_lo); - cap = ngtcp2_max(cap, mpcwnd); + cap = ngtcp2_min_uint64(cap, bbr->inflight_lo); + cap = ngtcp2_max_uint64(cap, mpcwnd); - cstat->cwnd = ngtcp2_min(cstat->cwnd, cap); + cstat->cwnd = ngtcp2_min_uint64(cstat->cwnd, cap); } static void bbr_set_send_quantum(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat) { - size_t floor, send_quantum; + size_t send_quantum = 64 * 1024; (void)bbr; - if (cstat->pacing_interval > (NGTCP2_SECONDS * 8 * 10 / 12) >> 20) { - floor = cstat->max_tx_udp_payload_size; - } else { - floor = 2 * cstat->max_tx_udp_payload_size; - } - if (cstat->pacing_interval) { - send_quantum = (size_t)(NGTCP2_MILLISECONDS / cstat->pacing_interval); - send_quantum = ngtcp2_min(send_quantum, 64 * 1024); - } else { - send_quantum = 64 * 1024; + send_quantum = ngtcp2_min_size( + send_quantum, (size_t)(NGTCP2_MILLISECONDS / cstat->pacing_interval)); } - cstat->send_quantum = ngtcp2_max(send_quantum, floor); + cstat->send_quantum = + ngtcp2_max_size(send_quantum, 2 * cstat->max_tx_udp_payload_size); } static int in_congestion_recovery(const ngtcp2_conn_stat *cstat, @@ -1313,16 +1294,12 @@ static int in_congestion_recovery(const ngtcp2_conn_stat *cstat, } static void bbr_handle_recovery(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, - const ngtcp2_cc_ack *ack, ngtcp2_tstamp ts) { + const ngtcp2_cc_ack *ack) { if (bbr->in_loss_recovery) { - if (ts - cstat->congestion_recovery_start_ts >= cstat->smoothed_rtt) { - bbr->packet_conservation = 0; - } - if (ack->largest_pkt_sent_ts != UINT64_MAX && !in_congestion_recovery(cstat, ack->largest_pkt_sent_ts)) { bbr->in_loss_recovery = 0; - bbr->packet_conservation = 0; + bbr->round_count_at_recovery = UINT64_MAX; bbr_restore_cwnd(bbr, cstat); } @@ -1331,18 +1308,15 @@ static void bbr_handle_recovery(ngtcp2_cc_bbr *bbr, ngtcp2_conn_stat *cstat, if (bbr->congestion_recovery_start_ts != UINT64_MAX) { bbr->in_loss_recovery = 1; + bbr->round_count_at_recovery = + bbr->round_start ? bbr->round_count : bbr->round_count + 1; bbr_save_cwnd(bbr, cstat); cstat->cwnd = - cstat->bytes_in_flight + - ngtcp2_max(ack->bytes_delivered, cstat->max_tx_udp_payload_size); + cstat->bytes_in_flight + + ngtcp2_max_uint64(ack->bytes_delivered, cstat->max_tx_udp_payload_size); cstat->congestion_recovery_start_ts = bbr->congestion_recovery_start_ts; bbr->congestion_recovery_start_ts = UINT64_MAX; - bbr->packet_conservation = 1; - bbr->congestion_recovery_next_round_delivered = bbr->rst->delivered; - bbr->prior_inflight_hi = bbr->inflight_hi; - bbr->prior_inflight_lo = bbr->inflight_lo; - bbr->prior_bw_lo = bbr->bw_lo; } } @@ -1350,12 +1324,18 @@ static void bbr_cc_on_pkt_lost(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, const ngtcp2_cc_pkt *pkt, ngtcp2_tstamp ts) { ngtcp2_cc_bbr *bbr = ngtcp2_struct_of(cc, ngtcp2_cc_bbr, cc); + if (bbr->state == NGTCP2_BBR_STATE_STARTUP) { + return; + } + bbr_update_on_loss(bbr, cstat, pkt, ts); } static void bbr_cc_congestion_event(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, - ngtcp2_tstamp sent_ts, ngtcp2_tstamp ts) { + ngtcp2_tstamp sent_ts, uint64_t bytes_lost, + ngtcp2_tstamp ts) { ngtcp2_cc_bbr *bbr = ngtcp2_struct_of(cc, ngtcp2_cc_bbr, cc); + (void)bytes_lost; if (bbr->in_loss_recovery || bbr->congestion_recovery_start_ts != UINT64_MAX || @@ -1377,13 +1357,8 @@ static void bbr_cc_on_spurious_congestion(ngtcp2_cc *cc, if (bbr->in_loss_recovery) { bbr->in_loss_recovery = 0; - bbr->packet_conservation = 0; + bbr->round_count_at_recovery = UINT64_MAX; bbr_restore_cwnd(bbr, cstat); - bbr->full_bw_count = 0; - bbr->loss_in_round = 0; - bbr->inflight_lo = ngtcp2_max(bbr->inflight_lo, bbr->prior_inflight_lo); - bbr->inflight_hi = ngtcp2_max(bbr->inflight_hi, bbr->prior_inflight_hi); - bbr->bw_lo = ngtcp2_max(bbr->bw_lo, bbr->prior_bw_lo); } } @@ -1396,19 +1371,19 @@ static void bbr_cc_on_persistent_congestion(ngtcp2_cc *cc, cstat->congestion_recovery_start_ts = UINT64_MAX; bbr->congestion_recovery_start_ts = UINT64_MAX; bbr->in_loss_recovery = 0; - bbr->packet_conservation = 0; + bbr->round_count_at_recovery = UINT64_MAX; bbr_save_cwnd(bbr, cstat); cstat->cwnd = cstat->bytes_in_flight + cstat->max_tx_udp_payload_size; - cstat->cwnd = - ngtcp2_max(cstat->cwnd, min_pipe_cwnd(cstat->max_tx_udp_payload_size)); + cstat->cwnd = ngtcp2_max_uint64( + cstat->cwnd, min_pipe_cwnd(cstat->max_tx_udp_payload_size)); } static void bbr_cc_on_ack_recv(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, const ngtcp2_cc_ack *ack, ngtcp2_tstamp ts) { ngtcp2_cc_bbr *bbr = ngtcp2_struct_of(cc, ngtcp2_cc_bbr, cc); - bbr_handle_recovery(bbr, cstat, ack, ts); + bbr_handle_recovery(bbr, cstat, ack); bbr_update_on_ack(bbr, cstat, ack, ts); } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_bbr.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_bbr.h index 0017be35010e66..f266ec5d71e4e4 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_bbr.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_bbr.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -95,9 +95,10 @@ typedef struct ngtcp2_cc_bbr { uint64_t round_count; /* Full pipe */ - int filled_pipe; uint64_t full_bw; size_t full_bw_count; + int full_bw_reached; + int full_bw_now; /* Pacing rate */ uint64_t pacing_gain_h; @@ -123,19 +124,13 @@ typedef struct ngtcp2_cc_bbr { size_t bw_probe_up_rounds; uint64_t bw_probe_up_acks; uint64_t inflight_hi; - uint64_t bw_hi; int probe_rtt_expired; ngtcp2_duration probe_rtt_min_delay; ngtcp2_tstamp probe_rtt_min_stamp; int in_loss_recovery; - int packet_conservation; + uint64_t round_count_at_recovery; uint64_t max_inflight; ngtcp2_tstamp congestion_recovery_start_ts; - uint64_t congestion_recovery_next_round_delivered; - - uint64_t prior_inflight_lo; - uint64_t prior_inflight_hi; - uint64_t prior_bw_lo; } ngtcp2_cc_bbr; void ngtcp2_cc_bbr_init(ngtcp2_cc_bbr *bbr, ngtcp2_log *log, @@ -143,4 +138,4 @@ void ngtcp2_cc_bbr_init(ngtcp2_cc_bbr *bbr, ngtcp2_log *log, ngtcp2_tstamp initial_ts, ngtcp2_rand rand, const ngtcp2_rand_ctx *rand_ctx); -#endif /* NGTCP2_BBR_H */ +#endif /* !defined(NGTCP2_BBR_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_buf.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_buf.h index 85b5f4ddf0464a..e87adb119916ca 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_buf.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_buf.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -105,4 +105,4 @@ int ngtcp2_buf_chain_new(ngtcp2_buf_chain **pbufchain, size_t len, */ void ngtcp2_buf_chain_del(ngtcp2_buf_chain *bufchain, const ngtcp2_mem *mem); -#endif /* NGTCP2_BUF_H */ +#endif /* !defined(NGTCP2_BUF_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_cc.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_cc.c index 9ad37fbdb6395a..1ff59f315c5b66 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_cc.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_cc.c @@ -32,16 +32,13 @@ #include "ngtcp2_mem.h" #include "ngtcp2_rcvry.h" #include "ngtcp2_conn_stat.h" +#include "ngtcp2_rst.h" #include "ngtcp2_unreachable.h" -/* NGTCP2_CC_DELIVERY_RATE_SEC_FILTERLEN is the window length of - delivery rate filter driven by ACK clocking. */ -#define NGTCP2_CC_DELIVERY_RATE_SEC_FILTERLEN 10 - uint64_t ngtcp2_cc_compute_initcwnd(size_t max_udp_payload_size) { uint64_t n = 2 * max_udp_payload_size; - n = ngtcp2_max(n, 14720); - return ngtcp2_min(10 * max_udp_payload_size, n); + n = ngtcp2_max_uint64(n, 14720); + return ngtcp2_min_uint64(10 * max_udp_payload_size, n); } ngtcp2_cc_pkt *ngtcp2_cc_pkt_init(ngtcp2_cc_pkt *pkt, int64_t pkt_num, @@ -59,13 +56,7 @@ ngtcp2_cc_pkt *ngtcp2_cc_pkt_init(ngtcp2_cc_pkt *pkt, int64_t pkt_num, return pkt; } -static void reno_cc_reset(ngtcp2_cc_reno *reno) { - ngtcp2_window_filter_init(&reno->delivery_rate_sec_filter, - NGTCP2_CC_DELIVERY_RATE_SEC_FILTERLEN); - reno->ack_count = 0; - reno->target_cwnd = 0; - reno->pending_add = 0; -} +static void reno_cc_reset(ngtcp2_cc_reno *reno) { reno->pending_add = 0; } void ngtcp2_cc_reno_init(ngtcp2_cc_reno *reno, ngtcp2_log *log) { memset(reno, 0, sizeof(*reno)); @@ -74,8 +65,7 @@ void ngtcp2_cc_reno_init(ngtcp2_cc_reno *reno, ngtcp2_log *log) { reno->cc.on_pkt_acked = ngtcp2_cc_reno_cc_on_pkt_acked; reno->cc.congestion_event = ngtcp2_cc_reno_cc_congestion_event; reno->cc.on_persistent_congestion = - ngtcp2_cc_reno_cc_on_persistent_congestion; - reno->cc.on_ack_recv = ngtcp2_cc_reno_cc_on_ack_recv; + ngtcp2_cc_reno_cc_on_persistent_congestion; reno->cc.reset = ngtcp2_cc_reno_cc_reset; reno_cc_reset(reno); @@ -94,11 +84,7 @@ void ngtcp2_cc_reno_cc_on_pkt_acked(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, uint64_t m; (void)ts; - if (in_congestion_recovery(cstat, pkt->sent_ts)) { - return; - } - - if (reno->target_cwnd && reno->target_cwnd < cstat->cwnd) { + if (in_congestion_recovery(cstat, pkt->sent_ts) || pkt->is_app_limited) { return; } @@ -118,9 +104,10 @@ void ngtcp2_cc_reno_cc_on_pkt_acked(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, void ngtcp2_cc_reno_cc_congestion_event(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, ngtcp2_tstamp sent_ts, - ngtcp2_tstamp ts) { + uint64_t bytes_lost, ngtcp2_tstamp ts) { ngtcp2_cc_reno *reno = ngtcp2_struct_of(cc, ngtcp2_cc_reno, cc); uint64_t min_cwnd; + (void)bytes_lost; if (in_congestion_recovery(cstat, sent_ts)) { return; @@ -129,7 +116,7 @@ void ngtcp2_cc_reno_cc_congestion_event(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, cstat->congestion_recovery_start_ts = ts; cstat->cwnd >>= NGTCP2_LOSS_REDUCTION_FACTOR_BITS; min_cwnd = 2 * cstat->max_tx_udp_payload_size; - cstat->cwnd = ngtcp2_max(cstat->cwnd, min_cwnd); + cstat->cwnd = ngtcp2_max_uint64(cstat->cwnd, min_cwnd); cstat->ssthresh = cstat->cwnd; reno->pending_add = 0; @@ -149,35 +136,6 @@ void ngtcp2_cc_reno_cc_on_persistent_congestion(ngtcp2_cc *cc, cstat->congestion_recovery_start_ts = UINT64_MAX; } -void ngtcp2_cc_reno_cc_on_ack_recv(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, - const ngtcp2_cc_ack *ack, ngtcp2_tstamp ts) { - ngtcp2_cc_reno *reno = ngtcp2_struct_of(cc, ngtcp2_cc_reno, cc); - uint64_t target_cwnd, initcwnd; - uint64_t max_delivery_rate_sec; - (void)ack; - (void)ts; - - ++reno->ack_count; - - ngtcp2_window_filter_update(&reno->delivery_rate_sec_filter, - cstat->delivery_rate_sec, reno->ack_count); - - max_delivery_rate_sec = - ngtcp2_window_filter_get_best(&reno->delivery_rate_sec_filter); - - if (cstat->min_rtt != UINT64_MAX && max_delivery_rate_sec) { - target_cwnd = max_delivery_rate_sec * cstat->smoothed_rtt / NGTCP2_SECONDS; - initcwnd = ngtcp2_cc_compute_initcwnd(cstat->max_tx_udp_payload_size); - reno->target_cwnd = ngtcp2_max(initcwnd, target_cwnd) * 289 / 100; - - ngtcp2_log_info(reno->cc.log, NGTCP2_LOG_EVENT_CCA, - "target_cwnd=%" PRIu64 " max_delivery_rate_sec=%" PRIu64 - " smoothed_rtt=%" PRIu64, - reno->target_cwnd, max_delivery_rate_sec, - cstat->smoothed_rtt); - } -} - void ngtcp2_cc_reno_cc_reset(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, ngtcp2_tstamp ts) { ngtcp2_cc_reno *reno = ngtcp2_struct_of(cc, ngtcp2_cc_reno, cc); @@ -187,45 +145,49 @@ void ngtcp2_cc_reno_cc_reset(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, reno_cc_reset(reno); } +static void cubic_vars_reset(ngtcp2_cubic_vars *v) { + v->cwnd_prior = 0; + v->w_max = 0; + v->k = 0; + v->epoch_start = UINT64_MAX; + v->w_est = 0; + + v->state = NGTCP2_CUBIC_STATE_INITIAL; + v->app_limited_start_ts = UINT64_MAX; + v->app_limited_duration = 0; + v->pending_bytes_delivered = 0; + v->pending_est_bytes_delivered = 0; +} + static void cubic_cc_reset(ngtcp2_cc_cubic *cubic) { - ngtcp2_window_filter_init(&cubic->delivery_rate_sec_filter, - NGTCP2_CC_DELIVERY_RATE_SEC_FILTERLEN); - cubic->ack_count = 0; - cubic->target_cwnd = 0; - cubic->w_last_max = 0; - cubic->w_tcp = 0; - cubic->origin_point = 0; - cubic->epoch_start = UINT64_MAX; - cubic->k = 0; - - cubic->prior.cwnd = 0; - cubic->prior.ssthresh = 0; - cubic->prior.w_last_max = 0; - cubic->prior.w_tcp = 0; - cubic->prior.origin_point = 0; - cubic->prior.epoch_start = UINT64_MAX; - cubic->prior.k = 0; - - cubic->rtt_sample_count = 0; - cubic->current_round_min_rtt = UINT64_MAX; - cubic->last_round_min_rtt = UINT64_MAX; - cubic->window_end = -1; + cubic_vars_reset(&cubic->current); + cubic_vars_reset(&cubic->undo.v); + cubic->undo.cwnd = 0; + cubic->undo.ssthresh = 0; + + cubic->hs.current_round_min_rtt = UINT64_MAX; + cubic->hs.last_round_min_rtt = UINT64_MAX; + cubic->hs.curr_rtt = UINT64_MAX; + cubic->hs.rtt_sample_count = 0; + cubic->hs.css_baseline_min_rtt = UINT64_MAX; + cubic->hs.css_round = 0; + + cubic->next_round_delivered = 0; } -void ngtcp2_cc_cubic_init(ngtcp2_cc_cubic *cubic, ngtcp2_log *log) { +void ngtcp2_cc_cubic_init(ngtcp2_cc_cubic *cubic, ngtcp2_log *log, + ngtcp2_rst *rst) { memset(cubic, 0, sizeof(*cubic)); cubic->cc.log = log; - cubic->cc.on_pkt_acked = ngtcp2_cc_cubic_cc_on_pkt_acked; + cubic->cc.on_ack_recv = ngtcp2_cc_cubic_cc_on_ack_recv; cubic->cc.congestion_event = ngtcp2_cc_cubic_cc_congestion_event; cubic->cc.on_spurious_congestion = ngtcp2_cc_cubic_cc_on_spurious_congestion; cubic->cc.on_persistent_congestion = - ngtcp2_cc_cubic_cc_on_persistent_congestion; - cubic->cc.on_ack_recv = ngtcp2_cc_cubic_cc_on_ack_recv; - cubic->cc.on_pkt_sent = ngtcp2_cc_cubic_cc_on_pkt_sent; - cubic->cc.new_rtt_sample = ngtcp2_cc_cubic_cc_new_rtt_sample; + ngtcp2_cc_cubic_cc_on_persistent_congestion; cubic->cc.reset = ngtcp2_cc_cubic_cc_reset; - cubic->cc.event = ngtcp2_cc_cubic_cc_event; + + cubic->rst = rst; cubic_cc_reset(cubic); } @@ -254,191 +216,250 @@ uint64_t ngtcp2_cbrt(uint64_t n) { return y; } -/* HyStart++ constants */ -#define NGTCP2_HS_MIN_SSTHRESH 16 +/* RFC 9406 HyStart++ constants */ +#define NGTCP2_HS_MIN_RTT_THRESH (4 * NGTCP2_MILLISECONDS) +#define NGTCP2_HS_MAX_RTT_THRESH (16 * NGTCP2_MILLISECONDS) +#define NGTCP2_HS_MIN_RTT_DIVISOR 8 #define NGTCP2_HS_N_RTT_SAMPLE 8 -#define NGTCP2_HS_MIN_ETA (4 * NGTCP2_MILLISECONDS) -#define NGTCP2_HS_MAX_ETA (16 * NGTCP2_MILLISECONDS) +#define NGTCP2_HS_CSS_GROWTH_DIVISOR 4 +#define NGTCP2_HS_CSS_ROUNDS 5 + +static uint64_t cubic_cc_compute_w_cubic(ngtcp2_cc_cubic *cubic, + const ngtcp2_conn_stat *cstat, + ngtcp2_tstamp ts) { + ngtcp2_duration t = ts - cubic->current.epoch_start; + uint64_t delta; + uint64_t tx = (t << 10) / NGTCP2_SECONDS; + uint64_t kx = (cubic->current.k << 10) / NGTCP2_SECONDS; + uint64_t time_delta; + + if (tx < kx) { + return UINT64_MAX; + } + + time_delta = tx - kx; + + delta = cstat->max_tx_udp_payload_size * + ((((time_delta * time_delta) >> 10) * time_delta) >> 10) * 4 / 10; -void ngtcp2_cc_cubic_cc_on_pkt_acked(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, - const ngtcp2_cc_pkt *pkt, - ngtcp2_tstamp ts) { + return cubic->current.w_max + (delta >> 10); +} + +void ngtcp2_cc_cubic_cc_on_ack_recv(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, + const ngtcp2_cc_ack *ack, + ngtcp2_tstamp ts) { ngtcp2_cc_cubic *cubic = ngtcp2_struct_of(cc, ngtcp2_cc_cubic, cc); - ngtcp2_duration t, eta; - uint64_t target, cwnd_thres; - uint64_t tx, kx, time_delta, delta; - uint64_t add, tcp_add; - uint64_t m; + uint64_t w_cubic, w_cubic_next, target, m; + ngtcp2_duration rtt_thresh; + int round_start; - if (pkt->pktns_id == NGTCP2_PKTNS_ID_APPLICATION && cubic->window_end != -1 && - cubic->window_end <= pkt->pkt_num) { - cubic->window_end = -1; + if (in_congestion_recovery(cstat, ack->largest_pkt_sent_ts)) { + return; } - if (in_congestion_recovery(cstat, pkt->sent_ts)) { + if (cubic->current.state == NGTCP2_CUBIC_STATE_CONGESTION_AVOIDANCE) { + if (cubic->rst->rs.is_app_limited && !cubic->rst->is_cwnd_limited) { + if (cubic->current.app_limited_start_ts == UINT64_MAX) { + cubic->current.app_limited_start_ts = ts; + } + + return; + } + + if (cubic->current.app_limited_start_ts != UINT64_MAX) { + cubic->current.app_limited_duration += + ts - cubic->current.app_limited_start_ts; + cubic->current.app_limited_start_ts = UINT64_MAX; + } + } else if (cubic->rst->rs.is_app_limited && !cubic->rst->is_cwnd_limited) { return; } + round_start = ack->pkt_delivered >= cubic->next_round_delivered; + if (round_start) { + cubic->next_round_delivered = cubic->rst->delivered; + + cubic->rst->is_cwnd_limited = 0; + } + if (cstat->cwnd < cstat->ssthresh) { /* slow-start */ - if (cubic->target_cwnd == 0 || cubic->target_cwnd > cstat->cwnd) { - cstat->cwnd += pkt->pktlen; + if (cubic->hs.css_round) { + cstat->cwnd += ack->bytes_delivered / NGTCP2_HS_CSS_GROWTH_DIVISOR; + } else { + cstat->cwnd += ack->bytes_delivered; } ngtcp2_log_info(cubic->cc.log, NGTCP2_LOG_EVENT_CCA, - "pkn=%" PRId64 " acked, slow start cwnd=%" PRIu64, - pkt->pkt_num, cstat->cwnd); + "%" PRIu64 " bytes acked, slow start cwnd=%" PRIu64, + ack->bytes_delivered, cstat->cwnd); + + if (round_start) { + cubic->hs.last_round_min_rtt = cubic->hs.current_round_min_rtt; + cubic->hs.current_round_min_rtt = UINT64_MAX; + cubic->hs.rtt_sample_count = 0; - if (cubic->last_round_min_rtt != UINT64_MAX && - cubic->current_round_min_rtt != UINT64_MAX && - cstat->cwnd >= - NGTCP2_HS_MIN_SSTHRESH * cstat->max_tx_udp_payload_size && - cubic->rtt_sample_count >= NGTCP2_HS_N_RTT_SAMPLE) { - eta = cubic->last_round_min_rtt / 8; - - if (eta < NGTCP2_HS_MIN_ETA) { - eta = NGTCP2_HS_MIN_ETA; - } else if (eta > NGTCP2_HS_MAX_ETA) { - eta = NGTCP2_HS_MAX_ETA; + if (cubic->hs.css_round) { + ++cubic->hs.css_round; } + } + + cubic->hs.current_round_min_rtt = + ngtcp2_min_uint64(cubic->hs.current_round_min_rtt, ack->rtt); + ++cubic->hs.rtt_sample_count; - if (cubic->current_round_min_rtt >= cubic->last_round_min_rtt + eta) { + if (cubic->hs.css_round) { + if (cubic->hs.current_round_min_rtt < cubic->hs.css_baseline_min_rtt) { + cubic->hs.css_baseline_min_rtt = UINT64_MAX; + cubic->hs.css_round = 0; + return; + } + + if (cubic->hs.css_round >= NGTCP2_HS_CSS_ROUNDS) { ngtcp2_log_info(cubic->cc.log, NGTCP2_LOG_EVENT_CCA, "HyStart++ exit slow start"); - cubic->w_last_max = cstat->cwnd; cstat->ssthresh = cstat->cwnd; } - } - - return; - } - /* congestion avoidance */ - - if (cubic->epoch_start == UINT64_MAX) { - cubic->epoch_start = ts; - if (cstat->cwnd < cubic->w_last_max) { - cubic->k = ngtcp2_cbrt((cubic->w_last_max - cstat->cwnd) * 10 / 4 / - cstat->max_tx_udp_payload_size); - cubic->origin_point = cubic->w_last_max; - } else { - cubic->k = 0; - cubic->origin_point = cstat->cwnd; + return; } - cubic->w_tcp = cstat->cwnd; - - ngtcp2_log_info(cubic->cc.log, NGTCP2_LOG_EVENT_CCA, - "cubic-ca epoch_start=%" PRIu64 " k=%" PRIu64 - " origin_point=%" PRIu64, - cubic->epoch_start, cubic->k, cubic->origin_point); + if (cubic->hs.rtt_sample_count >= NGTCP2_HS_N_RTT_SAMPLE && + cubic->hs.current_round_min_rtt != UINT64_MAX && + cubic->hs.last_round_min_rtt != UINT64_MAX) { + rtt_thresh = + ngtcp2_max_uint64(NGTCP2_HS_MIN_RTT_THRESH, + ngtcp2_min_uint64(cubic->hs.last_round_min_rtt / + NGTCP2_HS_MIN_RTT_DIVISOR, + NGTCP2_HS_MAX_RTT_THRESH)); + + if (cubic->hs.current_round_min_rtt >= + cubic->hs.last_round_min_rtt + rtt_thresh) { + cubic->hs.css_baseline_min_rtt = cubic->hs.current_round_min_rtt; + cubic->hs.css_round = 1; + } + } - cubic->pending_add = 0; - cubic->pending_w_add = 0; + return; } - t = ts - cubic->epoch_start; - - tx = (t << 10) / NGTCP2_SECONDS; - kx = (cubic->k << 10); + /* congestion avoidance */ - if (tx > kx) { - time_delta = tx - kx; - } else { - time_delta = kx - tx; + switch (cubic->current.state) { + case NGTCP2_CUBIC_STATE_INITIAL: + m = cstat->max_tx_udp_payload_size * ack->bytes_delivered + + cubic->current.pending_bytes_delivered; + cstat->cwnd += m / cstat->cwnd; + cubic->current.pending_bytes_delivered = m % cstat->cwnd; + return; + case NGTCP2_CUBIC_STATE_RECOVERY: + cubic->current.state = NGTCP2_CUBIC_STATE_CONGESTION_AVOIDANCE; + cubic->current.epoch_start = ts; + break; + default: + break; } - delta = cstat->max_tx_udp_payload_size * - ((((time_delta * time_delta) >> 10) * time_delta) >> 10) * 4 / 10; - delta >>= 10; - - if (tx > kx) { - target = cubic->origin_point + delta; - } else { - target = cubic->origin_point - delta; - } + w_cubic = cubic_cc_compute_w_cubic(cubic, cstat, + ts - cubic->current.app_limited_duration); + w_cubic_next = cubic_cc_compute_w_cubic( + cubic, cstat, + ts - cubic->current.app_limited_duration + cstat->smoothed_rtt); - cwnd_thres = - (target * (((t + cstat->smoothed_rtt) << 10) / NGTCP2_SECONDS)) >> 10; - if (cwnd_thres < cstat->cwnd) { + if (w_cubic_next == UINT64_MAX || w_cubic_next < cstat->cwnd) { target = cstat->cwnd; - } else if (2 * cwnd_thres > 3 * cstat->cwnd) { + } else if (2 * w_cubic_next > 3 * cstat->cwnd) { target = cstat->cwnd * 3 / 2; } else { - target = cwnd_thres; + target = w_cubic_next; } - if (target > cstat->cwnd) { - m = cubic->pending_add + - cstat->max_tx_udp_payload_size * (target - cstat->cwnd); - add = m / cstat->cwnd; - cubic->pending_add = m % cstat->cwnd; - } else { - m = cubic->pending_add + cstat->max_tx_udp_payload_size; - add = m / (100 * cstat->cwnd); - cubic->pending_add = m % (100 * cstat->cwnd); - } - - m = cubic->pending_w_add + cstat->max_tx_udp_payload_size * pkt->pktlen; - - cubic->w_tcp += m / cstat->cwnd; - cubic->pending_w_add = m % cstat->cwnd; + m = ack->bytes_delivered * cstat->max_tx_udp_payload_size + + cubic->current.pending_est_bytes_delivered; + cubic->current.pending_est_bytes_delivered = m % cstat->cwnd; - if (cubic->w_tcp > cstat->cwnd) { - tcp_add = cstat->max_tx_udp_payload_size * (cubic->w_tcp - cstat->cwnd) / - cstat->cwnd; - if (tcp_add > add) { - add = tcp_add; - } + if (cubic->current.w_est < cubic->current.cwnd_prior) { + cubic->current.w_est += m * 9 / 17 / cstat->cwnd; + } else { + cubic->current.w_est += m / cstat->cwnd; } - if (cubic->target_cwnd == 0 || cubic->target_cwnd > cstat->cwnd) { - cstat->cwnd += add; + if (w_cubic == UINT64_MAX || cubic->current.w_est > w_cubic) { + cstat->cwnd = cubic->current.w_est; + } else { + m = (target - cstat->cwnd) * cstat->max_tx_udp_payload_size + + cubic->current.pending_bytes_delivered; + cstat->cwnd += m / cstat->cwnd; + cubic->current.pending_bytes_delivered = m % cstat->cwnd; } ngtcp2_log_info(cubic->cc.log, NGTCP2_LOG_EVENT_CCA, - "pkn=%" PRId64 " acked, cubic-ca cwnd=%" PRIu64 " t=%" PRIu64 - " k=%" PRIi64 " time_delta=%" PRIu64 " delta=%" PRIu64 - " target=%" PRIu64 " w_tcp=%" PRIu64, - pkt->pkt_num, cstat->cwnd, t, cubic->k, time_delta >> 4, - delta, target, cubic->w_tcp); + "%" PRIu64 " bytes acked, cubic-ca cwnd=%" PRIu64 + " k=%" PRIi64 " target=%" PRIu64 " w_est=%" PRIu64, + ack->bytes_delivered, cstat->cwnd, cubic->current.k, target, + cubic->current.w_est); } void ngtcp2_cc_cubic_cc_congestion_event(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, ngtcp2_tstamp sent_ts, + uint64_t bytes_lost, ngtcp2_tstamp ts) { ngtcp2_cc_cubic *cubic = ngtcp2_struct_of(cc, ngtcp2_cc_cubic, cc); - uint64_t min_cwnd; + uint64_t flight_size; if (in_congestion_recovery(cstat, sent_ts)) { return; } - if (cubic->prior.cwnd < cstat->cwnd) { - cubic->prior.cwnd = cstat->cwnd; - cubic->prior.ssthresh = cstat->ssthresh; - cubic->prior.w_last_max = cubic->w_last_max; - cubic->prior.w_tcp = cubic->w_tcp; - cubic->prior.origin_point = cubic->origin_point; - cubic->prior.epoch_start = cubic->epoch_start; - cubic->prior.k = cubic->k; + if (cubic->undo.cwnd < cstat->cwnd) { + cubic->undo.v = cubic->current; + cubic->undo.cwnd = cstat->cwnd; + cubic->undo.ssthresh = cstat->ssthresh; } cstat->congestion_recovery_start_ts = ts; - cubic->epoch_start = UINT64_MAX; - if (cstat->cwnd < cubic->w_last_max) { - cubic->w_last_max = cstat->cwnd * 17 / 10 / 2; + cubic->current.state = NGTCP2_CUBIC_STATE_RECOVERY; + cubic->current.epoch_start = UINT64_MAX; + cubic->current.app_limited_start_ts = UINT64_MAX; + cubic->current.app_limited_duration = 0; + cubic->current.pending_bytes_delivered = 0; + cubic->current.pending_est_bytes_delivered = 0; + + if (cstat->cwnd < cubic->current.w_max) { + cubic->current.w_max = cstat->cwnd * 17 / 20; } else { - cubic->w_last_max = cstat->cwnd; + cubic->current.w_max = cstat->cwnd; } - min_cwnd = 2 * cstat->max_tx_udp_payload_size; cstat->ssthresh = cstat->cwnd * 7 / 10; - cstat->ssthresh = ngtcp2_max(cstat->ssthresh, min_cwnd); + + if (cubic->rst->rs.delivered * 2 < cstat->cwnd) { + flight_size = cstat->bytes_in_flight + bytes_lost; + cstat->ssthresh = ngtcp2_min_uint64( + cstat->ssthresh, + ngtcp2_max_uint64(cubic->rst->rs.delivered, flight_size) * 7 / 10); + } + + cstat->ssthresh = + ngtcp2_max_uint64(cstat->ssthresh, 2 * cstat->max_tx_udp_payload_size); + + cubic->current.cwnd_prior = cstat->cwnd; cstat->cwnd = cstat->ssthresh; + cubic->current.w_est = cstat->cwnd; + + if (cstat->cwnd < cubic->current.w_max) { + cubic->current.k = + ngtcp2_cbrt(((cubic->current.w_max - cstat->cwnd) << 10) * 10 / 4 / + cstat->max_tx_udp_payload_size) * + NGTCP2_SECONDS; + cubic->current.k >>= 10; + } else { + cubic->current.k = 0; + } + ngtcp2_log_info(cubic->cc.log, NGTCP2_LOG_EVENT_CCA, "reduce cwnd because of packet loss cwnd=%" PRIu64, cstat->cwnd); @@ -450,101 +471,34 @@ void ngtcp2_cc_cubic_cc_on_spurious_congestion(ngtcp2_cc *cc, ngtcp2_cc_cubic *cubic = ngtcp2_struct_of(cc, ngtcp2_cc_cubic, cc); (void)ts; - if (cstat->cwnd >= cubic->prior.cwnd) { - return; - } - - cstat->congestion_recovery_start_ts = UINT64_MAX; - - cstat->cwnd = cubic->prior.cwnd; - cstat->ssthresh = cubic->prior.ssthresh; - cubic->w_last_max = cubic->prior.w_last_max; - cubic->w_tcp = cubic->prior.w_tcp; - cubic->origin_point = cubic->prior.origin_point; - cubic->epoch_start = cubic->prior.epoch_start; - cubic->k = cubic->prior.k; - - cubic->prior.cwnd = 0; - cubic->prior.ssthresh = 0; - cubic->prior.w_last_max = 0; - cubic->prior.w_tcp = 0; - cubic->prior.origin_point = 0; - cubic->prior.epoch_start = UINT64_MAX; - cubic->prior.k = 0; - - ngtcp2_log_info(cubic->cc.log, NGTCP2_LOG_EVENT_CCA, - "spurious congestion is detected and congestion state is " - "restored cwnd=%" PRIu64, - cstat->cwnd); -} - -void ngtcp2_cc_cubic_cc_on_persistent_congestion(ngtcp2_cc *cc, - ngtcp2_conn_stat *cstat, - ngtcp2_tstamp ts) { - (void)cc; - (void)ts; - - cstat->cwnd = 2 * cstat->max_tx_udp_payload_size; cstat->congestion_recovery_start_ts = UINT64_MAX; -} - -void ngtcp2_cc_cubic_cc_on_ack_recv(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, - const ngtcp2_cc_ack *ack, - ngtcp2_tstamp ts) { - ngtcp2_cc_cubic *cubic = ngtcp2_struct_of(cc, ngtcp2_cc_cubic, cc); - uint64_t target_cwnd, initcwnd; - uint64_t max_delivery_rate_sec; - (void)ack; - (void)ts; - - ++cubic->ack_count; - - ngtcp2_window_filter_update(&cubic->delivery_rate_sec_filter, - cstat->delivery_rate_sec, cubic->ack_count); - max_delivery_rate_sec = - ngtcp2_window_filter_get_best(&cubic->delivery_rate_sec_filter); - - if (cstat->min_rtt != UINT64_MAX && max_delivery_rate_sec) { - target_cwnd = max_delivery_rate_sec * cstat->smoothed_rtt / NGTCP2_SECONDS; - initcwnd = ngtcp2_cc_compute_initcwnd(cstat->max_tx_udp_payload_size); - cubic->target_cwnd = ngtcp2_max(initcwnd, target_cwnd) * 289 / 100; + if (cstat->cwnd < cubic->undo.cwnd) { + cubic->current = cubic->undo.v; + cstat->cwnd = cubic->undo.cwnd; + cstat->ssthresh = cubic->undo.ssthresh; ngtcp2_log_info(cubic->cc.log, NGTCP2_LOG_EVENT_CCA, - "target_cwnd=%" PRIu64 " max_delivery_rate_sec=%" PRIu64 - " smoothed_rtt=%" PRIu64, - cubic->target_cwnd, max_delivery_rate_sec, - cstat->smoothed_rtt); + "spurious congestion is detected and congestion state is " + "restored cwnd=%" PRIu64, + cstat->cwnd); } -} - -void ngtcp2_cc_cubic_cc_on_pkt_sent(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, - const ngtcp2_cc_pkt *pkt) { - ngtcp2_cc_cubic *cubic = ngtcp2_struct_of(cc, ngtcp2_cc_cubic, cc); - (void)cstat; - if (pkt->pktns_id != NGTCP2_PKTNS_ID_APPLICATION || cubic->window_end != -1) { - return; - } - - cubic->window_end = pkt->pkt_num; - cubic->last_round_min_rtt = cubic->current_round_min_rtt; - cubic->current_round_min_rtt = UINT64_MAX; - cubic->rtt_sample_count = 0; + cubic_vars_reset(&cubic->undo.v); + cubic->undo.cwnd = 0; + cubic->undo.ssthresh = 0; } -void ngtcp2_cc_cubic_cc_new_rtt_sample(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, - ngtcp2_tstamp ts) { +void ngtcp2_cc_cubic_cc_on_persistent_congestion(ngtcp2_cc *cc, + ngtcp2_conn_stat *cstat, + ngtcp2_tstamp ts) { ngtcp2_cc_cubic *cubic = ngtcp2_struct_of(cc, ngtcp2_cc_cubic, cc); (void)ts; - if (cubic->window_end == -1) { - return; - } + cubic_cc_reset(cubic); - cubic->current_round_min_rtt = - ngtcp2_min(cubic->current_round_min_rtt, cstat->latest_rtt); - ++cubic->rtt_sample_count; + cstat->cwnd = 2 * cstat->max_tx_udp_payload_size; + cstat->congestion_recovery_start_ts = UINT64_MAX; } void ngtcp2_cc_cubic_cc_reset(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, @@ -555,23 +509,3 @@ void ngtcp2_cc_cubic_cc_reset(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, cubic_cc_reset(cubic); } - -void ngtcp2_cc_cubic_cc_event(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, - ngtcp2_cc_event_type event, ngtcp2_tstamp ts) { - ngtcp2_cc_cubic *cubic = ngtcp2_struct_of(cc, ngtcp2_cc_cubic, cc); - ngtcp2_tstamp last_ts; - - if (event != NGTCP2_CC_EVENT_TYPE_TX_START || - cubic->epoch_start == UINT64_MAX) { - return; - } - - last_ts = cstat->last_tx_pkt_ts[NGTCP2_PKTNS_ID_APPLICATION]; - if (last_ts == UINT64_MAX || last_ts <= cubic->epoch_start) { - return; - } - - assert(ts >= last_ts); - - cubic->epoch_start += ts - last_ts; -} diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_cc.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_cc.h index 524bcdb7e4bf86..e3c363a51bb85a 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_cc.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_cc.h @@ -27,18 +27,18 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include #include "ngtcp2_pktns_id.h" -#include "ngtcp2_window_filter.h" #define NGTCP2_LOSS_REDUCTION_FACTOR_BITS 1 #define NGTCP2_PERSISTENT_CONGESTION_THRESHOLD 3 typedef struct ngtcp2_log ngtcp2_log; typedef struct ngtcp2_conn_stat ngtcp2_conn_stat; +typedef struct ngtcp2_rst ngtcp2_rst; /** * @struct @@ -144,10 +144,12 @@ typedef void (*ngtcp2_cc_on_pkt_lost)(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, * * :type:`ngtcp2_cc_congestion_event` is a callback function which is * called when congestion event happens (e.g., when packet is lost). + * |bytes_lost| is the number of bytes lost in this congestion event. */ typedef void (*ngtcp2_cc_congestion_event)(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, ngtcp2_tstamp sent_ts, + uint64_t bytes_lost, ngtcp2_tstamp ts); /** @@ -305,9 +307,6 @@ ngtcp2_cc_pkt *ngtcp2_cc_pkt_init(ngtcp2_cc_pkt *pkt, int64_t pkt_num, /* ngtcp2_cc_reno is the RENO congestion controller. */ typedef struct ngtcp2_cc_reno { ngtcp2_cc cc; - ngtcp2_window_filter delivery_rate_sec_filter; - uint64_t ack_count; - uint64_t target_cwnd; uint64_t pending_add; } ngtcp2_cc_reno; @@ -318,59 +317,81 @@ void ngtcp2_cc_reno_cc_on_pkt_acked(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, void ngtcp2_cc_reno_cc_congestion_event(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, ngtcp2_tstamp sent_ts, - ngtcp2_tstamp ts); + uint64_t bytes_lost, ngtcp2_tstamp ts); void ngtcp2_cc_reno_cc_on_persistent_congestion(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, ngtcp2_tstamp ts); -void ngtcp2_cc_reno_cc_on_ack_recv(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, - const ngtcp2_cc_ack *ack, ngtcp2_tstamp ts); - void ngtcp2_cc_reno_cc_reset(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, ngtcp2_tstamp ts); +typedef enum ngtcp2_cubic_state { + /* NGTCP2_CUBIC_STATE_INITIAL is the state where CUBIC is in slow + start phase, or congestion avoidance phase before congestion + events occur. */ + NGTCP2_CUBIC_STATE_INITIAL, + /* NGTCP2_CUBIC_STATE_RECOVERY is the state that a connection is in + recovery period. */ + NGTCP2_CUBIC_STATE_RECOVERY, + /* NGTCP2_CUBIC_STATE_CONGESTION_AVOIDANCE is the state where CUBIC + is in congestion avoidance phase after recovery period ends. */ + NGTCP2_CUBIC_STATE_CONGESTION_AVOIDANCE, +} ngtcp2_cubic_state; + +typedef struct ngtcp2_cubic_vars { + uint64_t cwnd_prior; + uint64_t w_max; + ngtcp2_duration k; + ngtcp2_tstamp epoch_start; + uint64_t w_est; + + ngtcp2_cubic_state state; + /* app_limited_start_ts is the timestamp where app limited period + started. */ + ngtcp2_tstamp app_limited_start_ts; + /* app_limited_duration is the cumulative duration where a + connection is under app limited when ACK is received. */ + ngtcp2_duration app_limited_duration; + uint64_t pending_bytes_delivered; + uint64_t pending_est_bytes_delivered; +} ngtcp2_cubic_vars; + /* ngtcp2_cc_cubic is CUBIC congestion controller. */ typedef struct ngtcp2_cc_cubic { ngtcp2_cc cc; - ngtcp2_window_filter delivery_rate_sec_filter; - uint64_t ack_count; - uint64_t target_cwnd; - uint64_t w_last_max; - uint64_t w_tcp; - uint64_t origin_point; - ngtcp2_tstamp epoch_start; - uint64_t k; - /* prior stores the congestion state when a congestion event occurs + ngtcp2_rst *rst; + /* current is a set of variables that are currently in effect. */ + ngtcp2_cubic_vars current; + /* undo stores the congestion state when a congestion event occurs in order to restore the state when it turns out that the event is spurious. */ struct { + ngtcp2_cubic_vars v; uint64_t cwnd; uint64_t ssthresh; - uint64_t w_last_max; - uint64_t w_tcp; - uint64_t origin_point; - ngtcp2_tstamp epoch_start; - uint64_t k; - } prior; + } undo; /* HyStart++ variables */ - size_t rtt_sample_count; - uint64_t current_round_min_rtt; - uint64_t last_round_min_rtt; - int64_t window_end; - uint64_t pending_add; - uint64_t pending_w_add; + struct { + ngtcp2_duration current_round_min_rtt; + ngtcp2_duration last_round_min_rtt; + ngtcp2_duration curr_rtt; + size_t rtt_sample_count; + ngtcp2_duration css_baseline_min_rtt; + size_t css_round; + } hs; + uint64_t next_round_delivered; } ngtcp2_cc_cubic; -void ngtcp2_cc_cubic_init(ngtcp2_cc_cubic *cc, ngtcp2_log *log); +void ngtcp2_cc_cubic_init(ngtcp2_cc_cubic *cc, ngtcp2_log *log, + ngtcp2_rst *rst); -void ngtcp2_cc_cubic_cc_on_pkt_acked(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, - const ngtcp2_cc_pkt *pkt, - ngtcp2_tstamp ts); +void ngtcp2_cc_cubic_cc_on_ack_recv(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, + const ngtcp2_cc_ack *ack, ngtcp2_tstamp ts); void ngtcp2_cc_cubic_cc_congestion_event(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, ngtcp2_tstamp sent_ts, - ngtcp2_tstamp ts); + uint64_t bytes_lost, ngtcp2_tstamp ts); void ngtcp2_cc_cubic_cc_on_spurious_congestion(ngtcp2_cc *ccx, ngtcp2_conn_stat *cstat, @@ -380,21 +401,9 @@ void ngtcp2_cc_cubic_cc_on_persistent_congestion(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, ngtcp2_tstamp ts); -void ngtcp2_cc_cubic_cc_on_ack_recv(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, - const ngtcp2_cc_ack *ack, ngtcp2_tstamp ts); - -void ngtcp2_cc_cubic_cc_on_pkt_sent(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, - const ngtcp2_cc_pkt *pkt); - -void ngtcp2_cc_cubic_cc_new_rtt_sample(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, - ngtcp2_tstamp ts); - void ngtcp2_cc_cubic_cc_reset(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, ngtcp2_tstamp ts); -void ngtcp2_cc_cubic_cc_event(ngtcp2_cc *cc, ngtcp2_conn_stat *cstat, - ngtcp2_cc_event_type event, ngtcp2_tstamp ts); - uint64_t ngtcp2_cbrt(uint64_t n); -#endif /* NGTCP2_CC_H */ +#endif /* !defined(NGTCP2_CC_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_cid.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_cid.c index f3b92b569ec928..181850cfcbc87a 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_cid.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_cid.c @@ -36,6 +36,7 @@ void ngtcp2_cid_init(ngtcp2_cid *cid, const uint8_t *data, size_t datalen) { assert(datalen <= NGTCP2_MAX_CIDLEN); cid->datalen = datalen; + if (datalen) { ngtcp2_cpymem(cid->data, data, datalen); } @@ -74,12 +75,14 @@ void ngtcp2_dcid_init(ngtcp2_dcid *dcid, uint64_t seq, const ngtcp2_cid *cid, const uint8_t *token) { dcid->seq = seq; dcid->cid = *cid; + if (token) { memcpy(dcid->token, token, NGTCP2_STATELESS_RESET_TOKENLEN); dcid->flags = NGTCP2_DCID_FLAG_TOKEN_PRESENT; } else { dcid->flags = NGTCP2_DCID_FLAG_NONE; } + ngtcp2_path_storage_zero(&dcid->ps); dcid->retired_ts = UINT64_MAX; dcid->bound_ts = UINT64_MAX; @@ -115,6 +118,7 @@ void ngtcp2_dcid_copy(ngtcp2_dcid *dest, const ngtcp2_dcid *src) { void ngtcp2_dcid_copy_cid_token(ngtcp2_dcid *dest, const ngtcp2_dcid *src) { dest->seq = src->seq; dest->cid = src->cid; + if (src->flags & NGTCP2_DCID_FLAG_TOKEN_PRESENT) { dest->flags |= NGTCP2_DCID_FLAG_TOKEN_PRESENT; memcpy(dest->token, src->token, NGTCP2_STATELESS_RESET_TOKENLEN); @@ -123,15 +127,14 @@ void ngtcp2_dcid_copy_cid_token(ngtcp2_dcid *dest, const ngtcp2_dcid *src) { } } -int ngtcp2_dcid_verify_uniqueness(ngtcp2_dcid *dcid, uint64_t seq, +int ngtcp2_dcid_verify_uniqueness(const ngtcp2_dcid *dcid, uint64_t seq, const ngtcp2_cid *cid, const uint8_t *token) { if (dcid->seq == seq) { return ngtcp2_cid_eq(&dcid->cid, cid) && - (dcid->flags & NGTCP2_DCID_FLAG_TOKEN_PRESENT) && - memcmp(dcid->token, token, - NGTCP2_STATELESS_RESET_TOKENLEN) == 0 - ? 0 - : NGTCP2_ERR_PROTO; + (dcid->flags & NGTCP2_DCID_FLAG_TOKEN_PRESENT) && + memcmp(dcid->token, token, NGTCP2_STATELESS_RESET_TOKENLEN) == 0 + ? 0 + : NGTCP2_ERR_PROTO; } return !ngtcp2_cid_eq(&dcid->cid, cid) ? 0 : NGTCP2_ERR_PROTO; @@ -140,8 +143,7 @@ int ngtcp2_dcid_verify_uniqueness(ngtcp2_dcid *dcid, uint64_t seq, int ngtcp2_dcid_verify_stateless_reset_token(const ngtcp2_dcid *dcid, const uint8_t *token) { return (dcid->flags & NGTCP2_DCID_FLAG_TOKEN_PRESENT) && - ngtcp2_cmemeq(dcid->token, token, - NGTCP2_STATELESS_RESET_TOKENLEN) - ? 0 - : NGTCP2_ERR_INVALID_ARGUMENT; + ngtcp2_cmemeq(dcid->token, token, NGTCP2_STATELESS_RESET_TOKENLEN) + ? 0 + : NGTCP2_ERR_INVALID_ARGUMENT; } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_cid.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_cid.h index 0b37441178c72a..6372ef113d6454 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_cid.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_cid.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -37,20 +37,20 @@ /* NGTCP2_SCID_FLAG_NONE indicates that no flag is set. */ #define NGTCP2_SCID_FLAG_NONE 0x00u /* NGTCP2_SCID_FLAG_USED indicates that a local endpoint observed that - a remote endpoint uses a particular Connection ID. */ + a remote endpoint uses this particular Connection ID. */ #define NGTCP2_SCID_FLAG_USED 0x01u -/* NGTCP2_SCID_FLAG_RETIRED indicates that a particular Connection ID - is retired. */ +/* NGTCP2_SCID_FLAG_RETIRED indicates that this particular Connection + ID is retired. */ #define NGTCP2_SCID_FLAG_RETIRED 0x02u typedef struct ngtcp2_scid { ngtcp2_pq_entry pe; - /* seq is the sequence number associated to the CID. */ + /* seq is the sequence number associated to the Connection ID. */ uint64_t seq; /* cid is a connection ID */ ngtcp2_cid cid; - /* retired_ts is the timestamp when peer tells that this CID is - retired. */ + /* retired_ts is the timestamp when a remote endpoint tells that + this Connection ID is retired. */ ngtcp2_tstamp retired_ts; /* flags is the bitwise OR of zero or more of NGTCP2_SCID_FLAG_*. */ uint8_t flags; @@ -66,33 +66,33 @@ typedef struct ngtcp2_scid { #define NGTCP2_DCID_FLAG_TOKEN_PRESENT 0x02u typedef struct ngtcp2_dcid { - /* seq is the sequence number associated to the CID. */ + /* seq is the sequence number associated to the Connection ID. */ uint64_t seq; - /* cid is a connection ID */ + /* cid is a Connection ID */ ngtcp2_cid cid; /* path is a path which cid is bound to. The addresses are zero length if cid has not been bound to a particular path yet. */ ngtcp2_path_storage ps; - /* retired_ts is the timestamp when peer tells that this CID is + /* retired_ts is the timestamp when this Connection ID is retired. */ ngtcp2_tstamp retired_ts; - /* bound_ts is the timestamp when this connection ID is bound to a - particular path. It is only assigned when a connection ID is - used just for sending PATH_RESPONSE and is not zero-length. */ + /* bound_ts is the timestamp when this Connection ID is bound to a + particular path. It is only assigned when a Connection ID is + used just for sending PATH_RESPONSE, and is not zero-length. */ ngtcp2_tstamp bound_ts; /* bytes_sent is the number of bytes sent to an associated path. */ uint64_t bytes_sent; /* bytes_recv is the number of bytes received from an associated path. */ uint64_t bytes_recv; - /* max_udp_payload_size is the maximum size of UDP payload that is - allowed to send to this path. */ + /* max_udp_payload_size is the maximum size of UDP datagram payload + that is allowed to be sent to this path. */ size_t max_udp_payload_size; /* flags is bitwise OR of zero or more of NGTCP2_DCID_FLAG_*. */ uint8_t flags; - /* token is a stateless reset token associated to this CID. - Actually, the stateless reset token is tied to the connection, - not to the particular connection ID. */ + /* token is a stateless reset token received along with this + Connection ID. The stateless reset token is tied to the + connection, not to the particular Connection ID. */ uint8_t token[NGTCP2_STATELESS_RESET_TOKENLEN]; } ngtcp2_dcid; @@ -106,7 +106,7 @@ void ngtcp2_cid_zero(ngtcp2_cid *cid); int ngtcp2_cid_less(const ngtcp2_cid *lhs, const ngtcp2_cid *rhs); /* - * ngtcp2_cid_empty returns nonzero if |cid| includes empty connection + * ngtcp2_cid_empty returns nonzero if |cid| includes empty Connection * ID. */ int ngtcp2_cid_empty(const ngtcp2_cid *cid); @@ -123,7 +123,7 @@ void ngtcp2_scid_copy(ngtcp2_scid *dest, const ngtcp2_scid *src); /* * ngtcp2_dcid_init initializes |dcid| with the given parameters. If - * |token| is NULL, the function fills dcid->token it with 0. |token| + * |token| is NULL, the function fills dcid->token with 0. |token| * must be NGTCP2_STATELESS_RESET_TOKENLEN bytes long. */ void ngtcp2_dcid_init(ngtcp2_dcid *dcid, uint64_t seq, const ngtcp2_cid *cid, @@ -131,14 +131,14 @@ void ngtcp2_dcid_init(ngtcp2_dcid *dcid, uint64_t seq, const ngtcp2_cid *cid, /* * ngtcp2_dcid_set_token sets |token| to |dcid|. |token| must not be - * NULL and must be NGTCP2_STATELESS_RESET_TOKENLEN bytes long. + * NULL, and must be NGTCP2_STATELESS_RESET_TOKENLEN bytes long. */ void ngtcp2_dcid_set_token(ngtcp2_dcid *dcid, const uint8_t *token); /* * ngtcp2_dcid_set_path sets |path| to |dcid|. It sets - * max_udp_payload_size to the minimum UDP payload size supported - * by the IP protocol version. + * max_udp_payload_size to the minimum UDP datagram payload size + * supported by the IP protocol version. */ void ngtcp2_dcid_set_path(ngtcp2_dcid *dcid, const ngtcp2_path *path); @@ -149,7 +149,7 @@ void ngtcp2_dcid_copy(ngtcp2_dcid *dest, const ngtcp2_dcid *src); /* * ngtcp2_dcid_copy_cid_token behaves like ngtcp2_dcid_copy, but it - * only copies cid, seq, and path. + * only copies cid, seq, and token. */ void ngtcp2_dcid_copy_cid_token(ngtcp2_dcid *dest, const ngtcp2_dcid *src); @@ -157,14 +157,15 @@ void ngtcp2_dcid_copy_cid_token(ngtcp2_dcid *dest, const ngtcp2_dcid *src); * ngtcp2_dcid_verify_uniqueness verifies uniqueness of (|seq|, |cid|, * |token|) tuple against |dcid|. */ -int ngtcp2_dcid_verify_uniqueness(ngtcp2_dcid *dcid, uint64_t seq, +int ngtcp2_dcid_verify_uniqueness(const ngtcp2_dcid *dcid, uint64_t seq, const ngtcp2_cid *cid, const uint8_t *token); /* * ngtcp2_dcid_verify_stateless_reset_token verifies stateless reset - * token |token| against the one included in |dcid|. This function - * returns 0 if the verification succeeds, or one of the following - * negative error codes: + * token |token| against the one included in |dcid|. Tokens are + * compared in constant time. This function returns 0 if the + * verification succeeds, or one of the following negative error + * codes: * * NGTCP2_ERR_INVALID_ARGUMENT * Tokens do not match; or |dcid| does not contain a token. @@ -172,4 +173,4 @@ int ngtcp2_dcid_verify_uniqueness(ngtcp2_dcid *dcid, uint64_t seq, int ngtcp2_dcid_verify_stateless_reset_token(const ngtcp2_dcid *dcid, const uint8_t *token); -#endif /* NGTCP2_CID_H */ +#endif /* !defined(NGTCP2_CID_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn.c index c8caf47ea76232..765e4a877e00d7 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn.c @@ -37,7 +37,8 @@ #include "ngtcp2_rcvry.h" #include "ngtcp2_unreachable.h" #include "ngtcp2_net.h" -#include "ngtcp2_conversion.h" +#include "ngtcp2_transport_params.h" +#include "ngtcp2_settings.h" #include "ngtcp2_tstamp.h" #include "ngtcp2_frame_chain.h" @@ -50,8 +51,12 @@ /* NGTCP2_MIN_COALESCED_PAYLOADLEN is the minimum length of QUIC packet payload that should be coalesced to a long packet. */ #define NGTCP2_MIN_COALESCED_PAYLOADLEN 128 +/* NGTCP2_MAX_ACK_PER_PKT is the maximum number of ACK frame per an + incoming QUIC packet to process. ACK frames that exceed this limit + are not processed. */ +#define NGTCP2_MAX_ACK_PER_PKT 1 -ngtcp2_objalloc_def(strm, ngtcp2_strm, oplent); +ngtcp2_objalloc_def(strm, ngtcp2_strm, oplent) /* * conn_local_stream returns nonzero if |stream_id| indicates that it @@ -323,8 +328,8 @@ static int conn_call_select_preferred_addr(ngtcp2_conn *conn, assert(conn->remote.transport_params->preferred_addr_present); rv = conn->callbacks.select_preferred_addr( - conn, dest, &conn->remote.transport_params->preferred_addr, - conn->user_data); + conn, dest, &conn->remote.transport_params->preferred_addr, + conn->user_data); if (rv != 0) { return NGTCP2_ERR_CALLBACK_FAILURE; } @@ -377,7 +382,7 @@ static int conn_call_extend_max_stream_data(ngtcp2_conn *conn, } rv = conn->callbacks.extend_max_stream_data( - conn, stream_id, datalen, conn->user_data, strm->stream_user_data); + conn, stream_id, datalen, conn->user_data, strm->stream_user_data); if (rv != 0) { return NGTCP2_ERR_CALLBACK_FAILURE; } @@ -395,9 +400,9 @@ static int conn_call_dcid_status(ngtcp2_conn *conn, } rv = conn->callbacks.dcid_status( - conn, type, dcid->seq, &dcid->cid, - (dcid->flags & NGTCP2_DCID_FLAG_TOKEN_PRESENT) ? dcid->token : NULL, - conn->user_data); + conn, type, dcid->seq, &dcid->cid, + (dcid->flags & NGTCP2_DCID_FLAG_TOKEN_PRESENT) ? dcid->token : NULL, + conn->user_data); if (rv != 0) { return NGTCP2_ERR_CALLBACK_FAILURE; } @@ -413,7 +418,7 @@ static int conn_call_activate_dcid(ngtcp2_conn *conn, const ngtcp2_dcid *dcid) { static int conn_call_deactivate_dcid(ngtcp2_conn *conn, const ngtcp2_dcid *dcid) { return conn_call_dcid_status( - conn, NGTCP2_CONNECTION_ID_STATUS_TYPE_DEACTIVATE, dcid); + conn, NGTCP2_CONNECTION_ID_STATUS_TYPE_DEACTIVATE, dcid); } static int conn_call_stream_stop_sending(ngtcp2_conn *conn, int64_t stream_id, @@ -587,8 +592,8 @@ static int conn_call_recv_datagram(ngtcp2_conn *conn, flags |= NGTCP2_DATAGRAM_FLAG_0RTT; } - rv = conn->callbacks.recv_datagram(conn, flags, data, datalen, - conn->user_data); + rv = + conn->callbacks.recv_datagram(conn, flags, data, datalen, conn->user_data); if (rv != 0) { return NGTCP2_ERR_CALLBACK_FAILURE; } @@ -607,8 +612,8 @@ conn_call_update_key(ngtcp2_conn *conn, uint8_t *rx_secret, uint8_t *tx_secret, assert(conn->callbacks.update_key); rv = conn->callbacks.update_key( - conn, rx_secret, tx_secret, rx_aead_ctx, rx_iv, tx_aead_ctx, tx_iv, - current_rx_secret, current_tx_secret, secretlen, conn->user_data); + conn, rx_secret, tx_secret, rx_aead_ctx, rx_iv, tx_aead_ctx, tx_iv, + current_rx_secret, current_tx_secret, secretlen, conn->user_data); if (rv != 0) { return NGTCP2_ERR_CALLBACK_FAILURE; } @@ -623,7 +628,7 @@ static int conn_call_version_negotiation(ngtcp2_conn *conn, uint32_t version, assert(conn->callbacks.version_negotiation); rv = - conn->callbacks.version_negotiation(conn, version, dcid, conn->user_data); + conn->callbacks.version_negotiation(conn, version, dcid, conn->user_data); if (rv != 0) { return NGTCP2_ERR_CALLBACK_FAILURE; } @@ -663,13 +668,11 @@ static int conn_call_recv_tx_key(ngtcp2_conn *conn, return 0; } -static int pktns_init(ngtcp2_pktns *pktns, ngtcp2_pktns_id pktns_id, - ngtcp2_rst *rst, ngtcp2_cc *cc, int64_t initial_pkt_num, - ngtcp2_log *log, ngtcp2_qlog *qlog, - ngtcp2_objalloc *rtb_entry_objalloc, - ngtcp2_objalloc *frc_objalloc, const ngtcp2_mem *mem) { - int rv; - +static void pktns_init(ngtcp2_pktns *pktns, ngtcp2_pktns_id pktns_id, + ngtcp2_rst *rst, ngtcp2_cc *cc, int64_t initial_pkt_num, + ngtcp2_log *log, ngtcp2_qlog *qlog, + ngtcp2_objalloc *rtb_entry_objalloc, + ngtcp2_objalloc *frc_objalloc, const ngtcp2_mem *mem) { memset(pktns, 0, sizeof(*pktns)); ngtcp2_gaptr_init(&pktns->rx.pngap, mem); @@ -678,25 +681,15 @@ static int pktns_init(ngtcp2_pktns *pktns, ngtcp2_pktns_id pktns_id, pktns->tx.non_ack_pkt_start_ts = UINT64_MAX; pktns->rx.max_pkt_num = -1; pktns->rx.max_ack_eliciting_pkt_num = -1; + pktns->id = pktns_id; - rv = ngtcp2_acktr_init(&pktns->acktr, log, mem); - if (rv != 0) { - goto fail_acktr_init; - } + ngtcp2_acktr_init(&pktns->acktr, log, mem); ngtcp2_strm_init(&pktns->crypto.strm, 0, NGTCP2_STRM_FLAG_NONE, 0, 0, NULL, frc_objalloc, mem); - ngtcp2_rtb_init(&pktns->rtb, pktns_id, &pktns->crypto.strm, rst, cc, - initial_pkt_num, log, qlog, rtb_entry_objalloc, frc_objalloc, - mem); - - return 0; - -fail_acktr_init: - ngtcp2_gaptr_free(&pktns->rx.pngap); - - return rv; + ngtcp2_rtb_init(&pktns->rtb, rst, cc, initial_pkt_num, log, qlog, + rtb_entry_objalloc, frc_objalloc, mem); } static int pktns_new(ngtcp2_pktns **ppktns, ngtcp2_pktns_id pktns_id, @@ -704,20 +697,15 @@ static int pktns_new(ngtcp2_pktns **ppktns, ngtcp2_pktns_id pktns_id, ngtcp2_log *log, ngtcp2_qlog *qlog, ngtcp2_objalloc *rtb_entry_objalloc, ngtcp2_objalloc *frc_objalloc, const ngtcp2_mem *mem) { - int rv; - *ppktns = ngtcp2_mem_malloc(mem, sizeof(ngtcp2_pktns)); if (*ppktns == NULL) { return NGTCP2_ERR_NOMEM; } - rv = pktns_init(*ppktns, pktns_id, rst, cc, initial_pkt_num, log, qlog, - rtb_entry_objalloc, frc_objalloc, mem); - if (rv != 0) { - ngtcp2_mem_free(mem, *ppktns); - } + pktns_init(*ppktns, pktns_id, rst, cc, initial_pkt_num, log, qlog, + rtb_entry_objalloc, frc_objalloc, mem); - return rv; + return 0; } static int cycle_less(const ngtcp2_pq_entry *lhs, const ngtcp2_pq_entry *rhs) { @@ -783,6 +771,8 @@ static int cid_less(const ngtcp2_ksl_key *lhs, const ngtcp2_ksl_key *rhs) { return ngtcp2_cid_less(lhs, rhs); } +ngtcp2_ksl_search_def(cid_less, cid_less) + static int retired_ts_less(const ngtcp2_pq_entry *lhs, const ngtcp2_pq_entry *rhs) { const ngtcp2_scid *a = ngtcp2_struct_of(lhs, ngtcp2_scid, pe); @@ -803,8 +793,9 @@ static void conn_reset_conn_stat_cc(ngtcp2_conn *conn, cstat->first_rtt_sample_ts = UINT64_MAX; cstat->pto_count = 0; cstat->loss_detection_timer = UINT64_MAX; - cstat->cwnd = - ngtcp2_cc_compute_initcwnd(conn->local.settings.max_tx_udp_payload_size); + cstat->max_tx_udp_payload_size = + ngtcp2_conn_get_path_max_tx_udp_payload_size(conn); + cstat->cwnd = ngtcp2_cc_compute_initcwnd(cstat->max_tx_udp_payload_size); cstat->ssthresh = UINT64_MAX; cstat->congestion_recovery_start_ts = UINT64_MAX; cstat->bytes_in_flight = 0; @@ -847,7 +838,7 @@ static void delete_scid(ngtcp2_ksl *scids, const ngtcp2_mem *mem) { static ngtcp2_duration compute_pto(ngtcp2_duration smoothed_rtt, ngtcp2_duration rttvar, ngtcp2_duration max_ack_delay) { - ngtcp2_duration var = ngtcp2_max(4 * rttvar, NGTCP2_GRANULARITY); + ngtcp2_duration var = ngtcp2_max_uint64(4 * rttvar, NGTCP2_GRANULARITY); return smoothed_rtt + var + max_ack_delay; } @@ -859,7 +850,7 @@ static ngtcp2_duration conn_compute_initial_pto(ngtcp2_conn *conn, ngtcp2_duration initial_rtt = conn->local.settings.initial_rtt; ngtcp2_duration max_ack_delay; - if (pktns->rtb.pktns_id == NGTCP2_PKTNS_ID_APPLICATION && + if (pktns->id == NGTCP2_PKTNS_ID_APPLICATION && conn->remote.transport_params) { max_ack_delay = conn->remote.transport_params->max_ack_delay; } else { @@ -876,7 +867,7 @@ static ngtcp2_duration conn_compute_pto(ngtcp2_conn *conn, ngtcp2_conn_stat *cstat = &conn->cstat; ngtcp2_duration max_ack_delay; - if (pktns->rtb.pktns_id == NGTCP2_PKTNS_ID_APPLICATION && + if (pktns->id == NGTCP2_PKTNS_ID_APPLICATION && conn->remote.transport_params) { max_ack_delay = conn->remote.transport_params->max_ack_delay; } else { @@ -898,7 +889,7 @@ static ngtcp2_duration conn_compute_pv_timeout_pto(ngtcp2_conn *conn, ngtcp2_duration pto) { ngtcp2_duration initial_pto = conn_compute_initial_pto(conn, &conn->pktns); - return 3 * ngtcp2_max(pto, initial_pto); + return 3 * ngtcp2_max_uint64(pto, initial_pto); } /* @@ -1007,28 +998,15 @@ static void conn_reset_ecn_validation_state(ngtcp2_conn *conn) { static uint8_t server_default_available_versions[] = {0, 0, 0, 1}; /* - * available_versions_new allocates new buffer, and writes |versions| - * of length |versionslen| in network byte order, suitable for sending - * in available_versions field of version_information QUIC transport - * parameter. The pointer to the allocated buffer is assigned to - * |*pbuf|. - * - * This function returns 0 if it succeeds, or one of the negative - * error codes: - * - * NGTCP2_ERR_NOMEM - * Out of memory. + * available_versions_init writes |versions| of length |versionslen| + * in network byte order to the buffer pointed by |buf|, suitable for + * sending in available_versions field of version_information QUIC + * transport parameter. This function returns the pointer to the one + * beyond the last byte written. */ -static int available_versions_new(uint8_t **pbuf, const uint32_t *versions, - size_t versionslen, const ngtcp2_mem *mem) { +static void *available_versions_init(void *buf, const uint32_t *versions, + size_t versionslen) { size_t i; - uint8_t *buf = ngtcp2_mem_malloc(mem, sizeof(uint32_t) * versionslen); - - if (buf == NULL) { - return NGTCP2_ERR_NOMEM; - } - - *pbuf = buf; for (i = 0; i < versionslen; ++i) { buf = ngtcp2_put_uint32be(buf, versions[i]); @@ -1055,6 +1033,16 @@ conn_set_local_transport_params(ngtcp2_conn *conn, p->version_info_present = 1; } +static size_t buflen_align(size_t buflen) { + return (buflen + 0x7) & (size_t)~0x7; +} + +static void *buf_align(void *buf) { + return (void *)((uintptr_t)((uint8_t *)buf + 0x7) & (uintptr_t)~0x7); +} + +static void *buf_advance(void *buf, size_t n) { return (uint8_t *)buf + n; } + static int conn_new(ngtcp2_conn **pconn, const ngtcp2_cid *dcid, const ngtcp2_cid *scid, const ngtcp2_path *path, uint32_t client_chosen_version, int callbacks_version, @@ -1065,16 +1053,20 @@ static int conn_new(ngtcp2_conn **pconn, const ngtcp2_cid *dcid, const ngtcp2_mem *mem, void *user_data, int server) { int rv; ngtcp2_scid *scident; - uint8_t *buf; + void *buf, *tokenbuf; + size_t buflen; uint8_t fixed_bit_byte; size_t i; uint32_t *preferred_versions; + ngtcp2_settings settingsbuf; ngtcp2_transport_params paramsbuf; (void)callbacks_version; (void)settings_version; + settings = + ngtcp2_settings_convert_to_latest(&settingsbuf, settings_version, settings); params = ngtcp2_transport_params_convert_to_latest( - ¶msbuf, transport_params_version, params); + ¶msbuf, transport_params_version, params); assert(settings->max_window <= NGTCP2_MAX_VARINT); assert(settings->max_stream_window <= NGTCP2_MAX_VARINT); @@ -1111,21 +1103,59 @@ static int conn_new(ngtcp2_conn **pconn, const ngtcp2_cid *dcid, assert(callbacks->get_path_challenge_data); assert(!server || !ngtcp2_is_reserved_version(client_chosen_version)); + for (i = 0; i < settings->pmtud_probeslen; ++i) { + assert(settings->pmtud_probes[i] > NGTCP2_MAX_UDP_PAYLOAD_SIZE); + } + if (mem == NULL) { mem = ngtcp2_mem_default(); } - *pconn = ngtcp2_mem_calloc(mem, 1, sizeof(ngtcp2_conn)); - if (*pconn == NULL) { - rv = NGTCP2_ERR_NOMEM; - goto fail_conn; + buflen = sizeof(ngtcp2_conn); + if (settings->qlog_write) { + buflen = buflen_align(buflen); + buflen += NGTCP2_QLOG_BUFLEN; + } + + if (settings->pmtud_probeslen) { + buflen = buflen_align(buflen); + buflen += sizeof(settings->pmtud_probes[0]) * settings->pmtud_probeslen; + } + + if (settings->preferred_versionslen) { + buflen = buflen_align(buflen); + buflen += + sizeof(settings->preferred_versions[0]) * settings->preferred_versionslen; + } + + if (settings->available_versionslen) { + buflen = buflen_align(buflen); + buflen += + sizeof(settings->available_versions[0]) * settings->available_versionslen; + } else if (server) { + if (settings->preferred_versionslen) { + buflen = buflen_align(buflen); + buflen += sizeof(settings->preferred_versions[0]) * + settings->preferred_versionslen; + } + } else if (!ngtcp2_is_reserved_version(client_chosen_version)) { + buflen = buflen_align(buflen); + buflen += sizeof(client_chosen_version); + } + + buf = ngtcp2_mem_calloc(mem, 1, buflen); + if (buf == NULL) { + return NGTCP2_ERR_NOMEM; } + *pconn = buf; + buf = buf_advance(buf, sizeof(ngtcp2_conn)); + (*pconn)->server = server; - ngtcp2_objalloc_frame_chain_init(&(*pconn)->frc_objalloc, 64, mem); - ngtcp2_objalloc_rtb_entry_init(&(*pconn)->rtb_entry_objalloc, 64, mem); - ngtcp2_objalloc_strm_init(&(*pconn)->strm_objalloc, 64, mem); + ngtcp2_objalloc_frame_chain_init(&(*pconn)->frc_objalloc, 16, mem); + ngtcp2_objalloc_rtb_entry_init(&(*pconn)->rtb_entry_objalloc, 16, mem); + ngtcp2_objalloc_strm_init(&(*pconn)->strm_objalloc, 16, mem); ngtcp2_static_ringbuf_dcid_bound_init(&(*pconn)->dcid.bound); @@ -1135,7 +1165,8 @@ static int conn_new(ngtcp2_conn **pconn, const ngtcp2_cid *dcid, ngtcp2_gaptr_init(&(*pconn)->dcid.seqgap, mem); - ngtcp2_ksl_init(&(*pconn)->scid.set, cid_less, sizeof(ngtcp2_cid), mem); + ngtcp2_ksl_init(&(*pconn)->scid.set, cid_less, ksl_cid_less_search, + sizeof(ngtcp2_cid), mem); ngtcp2_pq_init(&(*pconn)->scid.used, retired_ts_less, mem); @@ -1143,9 +1174,9 @@ static int conn_new(ngtcp2_conn **pconn, const ngtcp2_cid *dcid, ngtcp2_pq_init(&(*pconn)->tx.strmq, cycle_less, mem); - ngtcp2_idtr_init(&(*pconn)->remote.bidi.idtr, !server, mem); + ngtcp2_idtr_init(&(*pconn)->remote.bidi.idtr, mem); - ngtcp2_idtr_init(&(*pconn)->remote.uni.idtr, !server, mem); + ngtcp2_idtr_init(&(*pconn)->remote.uni.idtr, mem); ngtcp2_static_ringbuf_path_challenge_init(&(*pconn)->rx.path_challenge); @@ -1154,36 +1185,46 @@ static int conn_new(ngtcp2_conn **pconn, const ngtcp2_cid *dcid, ngtcp2_qlog_init(&(*pconn)->qlog, settings->qlog_write, settings->initial_ts, user_data); if ((*pconn)->qlog.write) { - buf = ngtcp2_mem_malloc(mem, NGTCP2_QLOG_BUFLEN); - if (buf == NULL) { - rv = NGTCP2_ERR_NOMEM; - goto fail_qlog_buf; - } + buf = buf_align(buf); ngtcp2_buf_init(&(*pconn)->qlog.buf, buf, NGTCP2_QLOG_BUFLEN); + buf = buf_advance(buf, NGTCP2_QLOG_BUFLEN); } (*pconn)->local.settings = *settings; if (settings->tokenlen) { - buf = ngtcp2_mem_malloc(mem, settings->tokenlen); - if (buf == NULL) { + tokenbuf = ngtcp2_mem_malloc(mem, settings->tokenlen); + if (tokenbuf == NULL) { rv = NGTCP2_ERR_NOMEM; goto fail_token; } - memcpy(buf, settings->token, settings->tokenlen); - (*pconn)->local.settings.token = buf; + memcpy(tokenbuf, settings->token, settings->tokenlen); + (*pconn)->local.settings.token = tokenbuf; } else { (*pconn)->local.settings.token = NULL; } + if (settings->pmtud_probeslen) { + (*pconn)->local.settings.pmtud_probes = buf_align(buf); + buf = ngtcp2_cpymem( + (uint16_t *)(*pconn)->local.settings.pmtud_probes, settings->pmtud_probes, + sizeof(settings->pmtud_probes[0]) * settings->pmtud_probeslen); + } + if (!(*pconn)->local.settings.original_version) { (*pconn)->local.settings.original_version = client_chosen_version; } + ngtcp2_dcid_init(&(*pconn)->dcid.current, 0, dcid, NULL); + ngtcp2_dcid_set_path(&(*pconn)->dcid.current, path); + + rv = ngtcp2_gaptr_push(&(*pconn)->dcid.seqgap, 0, 1); + if (rv != 0) { + goto fail_seqgap_push; + } + conn_reset_conn_stat(*pconn, &(*pconn)->cstat); (*pconn)->cstat.initial_rtt = settings->initial_rtt; - (*pconn)->cstat.max_tx_udp_payload_size = - (*pconn)->local.settings.max_tx_udp_payload_size; ngtcp2_rst_init(&(*pconn)->rst); @@ -1195,7 +1236,7 @@ static int conn_new(ngtcp2_conn **pconn, const ngtcp2_cid *dcid, break; case NGTCP2_CC_ALGO_CUBIC: - ngtcp2_cc_cubic_init(&(*pconn)->cubic, &(*pconn)->log); + ngtcp2_cc_cubic_init(&(*pconn)->cubic, &(*pconn)->log, &(*pconn)->rst); break; case NGTCP2_CC_ALGO_BBR: @@ -1224,13 +1265,10 @@ static int conn_new(ngtcp2_conn **pconn, const ngtcp2_cid *dcid, goto fail_hs_pktns_init; } - rv = pktns_init(&(*pconn)->pktns, NGTCP2_PKTNS_ID_APPLICATION, &(*pconn)->rst, - &(*pconn)->cc, settings->initial_pkt_num, &(*pconn)->log, - &(*pconn)->qlog, &(*pconn)->rtb_entry_objalloc, - &(*pconn)->frc_objalloc, mem); - if (rv != 0) { - goto fail_pktns_init; - } + pktns_init(&(*pconn)->pktns, NGTCP2_PKTNS_ID_APPLICATION, &(*pconn)->rst, + &(*pconn)->cc, settings->initial_pkt_num, &(*pconn)->log, + &(*pconn)->qlog, &(*pconn)->rtb_entry_objalloc, + &(*pconn)->frc_objalloc, mem); scident = ngtcp2_mem_malloc(mem, sizeof(*scident)); if (scident == NULL) { @@ -1249,14 +1287,6 @@ static int conn_new(ngtcp2_conn **pconn, const ngtcp2_cid *dcid, scident = NULL; - ngtcp2_dcid_init(&(*pconn)->dcid.current, 0, dcid, NULL); - ngtcp2_dcid_set_path(&(*pconn)->dcid.current, path); - - rv = ngtcp2_gaptr_push(&(*pconn)->dcid.seqgap, 0, 1); - if (rv != 0) { - goto fail_seqgap_push; - } - if (settings->preferred_versionslen) { if (!server && !ngtcp2_is_reserved_version(client_chosen_version)) { for (i = 0; i < settings->preferred_versionslen; ++i) { @@ -1268,12 +1298,9 @@ static int conn_new(ngtcp2_conn **pconn, const ngtcp2_cid *dcid, assert(i < settings->preferred_versionslen); } - preferred_versions = ngtcp2_mem_malloc( - mem, sizeof(uint32_t) * settings->preferred_versionslen); - if (preferred_versions == NULL) { - rv = NGTCP2_ERR_NOMEM; - goto fail_preferred_versions; - } + preferred_versions = buf_align(buf); + buf = buf_advance(preferred_versions, sizeof(preferred_versions[0]) * + settings->preferred_versionslen); for (i = 0; i < settings->preferred_versionslen; ++i) { assert(ngtcp2_is_supported_version(settings->preferred_versions[i])); @@ -1304,39 +1331,33 @@ static int conn_new(ngtcp2_conn **pconn, const ngtcp2_cid *dcid, ngtcp2_is_supported_version(settings->available_versions[i])); } - rv = available_versions_new(&buf, settings->available_versions, - settings->available_versionslen, mem); - if (rv != 0) { - goto fail_available_versions; - } - - (*pconn)->vneg.available_versions = buf; + (*pconn)->vneg.available_versions = buf_align(buf); (*pconn)->vneg.available_versionslen = - sizeof(uint32_t) * settings->available_versionslen; + sizeof(uint32_t) * settings->available_versionslen; + + buf = available_versions_init((*pconn)->vneg.available_versions, + settings->available_versions, + settings->available_versionslen); } else if (server) { if (settings->preferred_versionslen) { - rv = available_versions_new(&buf, settings->preferred_versions, - settings->preferred_versionslen, mem); - if (rv != 0) { - goto fail_available_versions; - } - - (*pconn)->vneg.available_versions = buf; + (*pconn)->vneg.available_versions = buf_align(buf); (*pconn)->vneg.available_versionslen = - sizeof(uint32_t) * settings->preferred_versionslen; + sizeof(uint32_t) * settings->preferred_versionslen; + + buf = available_versions_init((*pconn)->vneg.available_versions, + settings->preferred_versions, + settings->preferred_versionslen); } else { (*pconn)->vneg.available_versions = server_default_available_versions; (*pconn)->vneg.available_versionslen = - sizeof(server_default_available_versions); + sizeof(server_default_available_versions); } - } else if (!server && !ngtcp2_is_reserved_version(client_chosen_version)) { - rv = available_versions_new(&buf, &client_chosen_version, 1, mem); - if (rv != 0) { - goto fail_available_versions; - } - - (*pconn)->vneg.available_versions = buf; + } else if (!ngtcp2_is_reserved_version(client_chosen_version)) { + (*pconn)->vneg.available_versions = buf_align(buf); (*pconn)->vneg.available_versionslen = sizeof(uint32_t); + + buf = available_versions_init((*pconn)->vneg.available_versions, + &client_chosen_version, 1); } (*pconn)->local.settings.available_versions = NULL; @@ -1367,54 +1388,39 @@ static int conn_new(ngtcp2_conn **pconn, const ngtcp2_cid *dcid, conn_reset_ecn_validation_state(*pconn); - ngtcp2_qlog_start( - &(*pconn)->qlog, - server ? ((*pconn)->local.transport_params.retry_scid_present - ? &(*pconn)->local.transport_params.retry_scid - : &(*pconn)->local.transport_params.original_dcid) - : dcid, - server); + ngtcp2_qlog_start(&(*pconn)->qlog, + server + ? ((*pconn)->local.transport_params.retry_scid_present + ? &(*pconn)->local.transport_params.retry_scid + : &(*pconn)->local.transport_params.original_dcid) + : dcid, + server); return 0; -fail_available_versions: - ngtcp2_mem_free(mem, (*pconn)->vneg.preferred_versions); -fail_preferred_versions: -fail_seqgap_push: fail_scid_set_insert: ngtcp2_mem_free(mem, scident); fail_scident: - pktns_free(&(*pconn)->pktns, mem); -fail_pktns_init: pktns_del((*pconn)->hs_pktns, mem); fail_hs_pktns_init: pktns_del((*pconn)->in_pktns, mem); fail_in_pktns_init: + ngtcp2_gaptr_free(&(*pconn)->dcid.seqgap); +fail_seqgap_push: ngtcp2_mem_free(mem, (uint8_t *)(*pconn)->local.settings.token); fail_token: - ngtcp2_mem_free(mem, (*pconn)->qlog.buf.begin); -fail_qlog_buf: - ngtcp2_idtr_free(&(*pconn)->remote.uni.idtr); - ngtcp2_idtr_free(&(*pconn)->remote.bidi.idtr); - ngtcp2_map_free(&(*pconn)->strms); - delete_scid(&(*pconn)->scid.set, mem); - ngtcp2_ksl_free(&(*pconn)->scid.set); - ngtcp2_gaptr_free(&(*pconn)->dcid.seqgap); - ngtcp2_objalloc_free(&(*pconn)->strm_objalloc); - ngtcp2_objalloc_free(&(*pconn)->rtb_entry_objalloc); - ngtcp2_objalloc_free(&(*pconn)->frc_objalloc); ngtcp2_mem_free(mem, *pconn); -fail_conn: + return rv; } int ngtcp2_conn_client_new_versioned( - ngtcp2_conn **pconn, const ngtcp2_cid *dcid, const ngtcp2_cid *scid, - const ngtcp2_path *path, uint32_t client_chosen_version, - int callbacks_version, const ngtcp2_callbacks *callbacks, - int settings_version, const ngtcp2_settings *settings, - int transport_params_version, const ngtcp2_transport_params *params, - const ngtcp2_mem *mem, void *user_data) { + ngtcp2_conn **pconn, const ngtcp2_cid *dcid, const ngtcp2_cid *scid, + const ngtcp2_path *path, uint32_t client_chosen_version, + int callbacks_version, const ngtcp2_callbacks *callbacks, + int settings_version, const ngtcp2_settings *settings, + int transport_params_version, const ngtcp2_transport_params *params, + const ngtcp2_mem *mem, void *user_data) { int rv; rv = conn_new(pconn, dcid, scid, path, client_chosen_version, @@ -1438,12 +1444,12 @@ int ngtcp2_conn_client_new_versioned( } int ngtcp2_conn_server_new_versioned( - ngtcp2_conn **pconn, const ngtcp2_cid *dcid, const ngtcp2_cid *scid, - const ngtcp2_path *path, uint32_t client_chosen_version, - int callbacks_version, const ngtcp2_callbacks *callbacks, - int settings_version, const ngtcp2_settings *settings, - int transport_params_version, const ngtcp2_transport_params *params, - const ngtcp2_mem *mem, void *user_data) { + ngtcp2_conn **pconn, const ngtcp2_cid *dcid, const ngtcp2_cid *scid, + const ngtcp2_path *path, uint32_t client_chosen_version, + int callbacks_version, const ngtcp2_callbacks *callbacks, + int settings_version, const ngtcp2_settings *settings, + int transport_params_version, const ngtcp2_transport_params *params, + const ngtcp2_mem *mem, void *user_data) { int rv; rv = conn_new(pconn, dcid, scid, path, client_chosen_version, @@ -1471,8 +1477,8 @@ int ngtcp2_conn_server_new_versioned( * credits are considered. */ static uint64_t conn_fc_credits(ngtcp2_conn *conn, ngtcp2_strm *strm) { - return ngtcp2_min(strm->tx.max_offset - strm->tx.offset, - conn->tx.max_offset - conn->tx.offset); + return ngtcp2_min_uint64(strm->tx.max_offset - strm->tx.offset, + conn->tx.max_offset - conn->tx.offset); } /* @@ -1483,7 +1489,7 @@ static uint64_t conn_fc_credits(ngtcp2_conn *conn, ngtcp2_strm *strm) { static uint64_t conn_enforce_flow_control(ngtcp2_conn *conn, ngtcp2_strm *strm, uint64_t len) { uint64_t fc_credits = conn_fc_credits(conn, strm); - return ngtcp2_min(len, fc_credits); + return ngtcp2_min_uint64(len, fc_credits); } static int delete_strms_each(void *data, void *ptr) { @@ -1525,15 +1531,15 @@ void ngtcp2_conn_del(ngtcp2_conn *conn) { if (conn->crypto.key_update.old_rx_ckm) { conn_call_delete_crypto_aead_ctx( - conn, &conn->crypto.key_update.old_rx_ckm->aead_ctx); + conn, &conn->crypto.key_update.old_rx_ckm->aead_ctx); } if (conn->crypto.key_update.new_rx_ckm) { conn_call_delete_crypto_aead_ctx( - conn, &conn->crypto.key_update.new_rx_ckm->aead_ctx); + conn, &conn->crypto.key_update.new_rx_ckm->aead_ctx); } if (conn->crypto.key_update.new_tx_ckm) { conn_call_delete_crypto_aead_ctx( - conn, &conn->crypto.key_update.new_tx_ckm->aead_ctx); + conn, &conn->crypto.key_update.new_tx_ckm->aead_ctx); } if (conn->pktns.crypto.rx.ckm) { @@ -1551,26 +1557,26 @@ void ngtcp2_conn_del(ngtcp2_conn *conn) { if (conn->hs_pktns) { if (conn->hs_pktns->crypto.rx.ckm) { conn_call_delete_crypto_aead_ctx( - conn, &conn->hs_pktns->crypto.rx.ckm->aead_ctx); + conn, &conn->hs_pktns->crypto.rx.ckm->aead_ctx); } conn_call_delete_crypto_cipher_ctx(conn, &conn->hs_pktns->crypto.rx.hp_ctx); if (conn->hs_pktns->crypto.tx.ckm) { conn_call_delete_crypto_aead_ctx( - conn, &conn->hs_pktns->crypto.tx.ckm->aead_ctx); + conn, &conn->hs_pktns->crypto.tx.ckm->aead_ctx); } conn_call_delete_crypto_cipher_ctx(conn, &conn->hs_pktns->crypto.tx.hp_ctx); } if (conn->in_pktns) { if (conn->in_pktns->crypto.rx.ckm) { conn_call_delete_crypto_aead_ctx( - conn, &conn->in_pktns->crypto.rx.ckm->aead_ctx); + conn, &conn->in_pktns->crypto.rx.ckm->aead_ctx); } conn_call_delete_crypto_cipher_ctx(conn, &conn->in_pktns->crypto.rx.hp_ctx); if (conn->in_pktns->crypto.tx.ckm) { conn_call_delete_crypto_aead_ctx( - conn, &conn->in_pktns->crypto.tx.ckm->aead_ctx); + conn, &conn->in_pktns->crypto.tx.ckm->aead_ctx); } conn_call_delete_crypto_cipher_ctx(conn, &conn->in_pktns->crypto.tx.hp_ctx); } @@ -1582,11 +1588,6 @@ void ngtcp2_conn_del(ngtcp2_conn *conn) { conn_vneg_crypto_free(conn); - ngtcp2_mem_free(conn->mem, conn->vneg.preferred_versions); - if (conn->vneg.available_versions != server_default_available_versions) { - ngtcp2_mem_free(conn->mem, conn->vneg.available_versions); - } - ngtcp2_mem_free(conn->mem, conn->crypto.decrypt_buf.base); ngtcp2_mem_free(conn->mem, conn->crypto.decrypt_hp_buf.base); ngtcp2_mem_free(conn->mem, (uint8_t *)conn->local.settings.token); @@ -1600,8 +1601,6 @@ void ngtcp2_conn_del(ngtcp2_conn *conn) { pktns_del(conn->hs_pktns, conn->mem); pktns_del(conn->in_pktns, conn->mem); - ngtcp2_mem_free(conn->mem, conn->qlog.buf.begin); - ngtcp2_pmtud_del(conn->pmtud); ngtcp2_pv_del(conn->pv); @@ -1611,7 +1610,7 @@ void ngtcp2_conn_del(ngtcp2_conn *conn) { ngtcp2_idtr_free(&conn->remote.bidi.idtr); ngtcp2_mem_free(conn->mem, conn->tx.ack); ngtcp2_pq_free(&conn->tx.strmq); - ngtcp2_map_each_free(&conn->strms, delete_strms_each, (void *)conn); + ngtcp2_map_each(&conn->strms, delete_strms_each, (void *)conn); ngtcp2_map_free(&conn->strms); ngtcp2_pq_free(&conn->scid.used); @@ -1665,8 +1664,9 @@ static int conn_ensure_ack_ranges(ngtcp2_conn *conn, size_t n) { * ACK. */ static ngtcp2_duration conn_compute_ack_delay(ngtcp2_conn *conn) { - return ngtcp2_min(conn->local.transport_params.max_ack_delay, - conn->cstat.smoothed_rtt / 8); + return ngtcp2_min_uint64( + conn->local.transport_params.max_ack_delay, + ngtcp2_max_uint64(conn->cstat.smoothed_rtt / 8, NGTCP2_NANOSECONDS)); } int ngtcp2_conn_create_ack_frame(ngtcp2_conn *conn, ngtcp2_frame **pfr, @@ -1702,8 +1702,8 @@ int ngtcp2_conn_create_ack_frame(ngtcp2_conn *conn, ngtcp2_frame **pfr, if (conn->tx.ack == NULL) { conn->tx.ack = ngtcp2_mem_malloc( - conn->mem, - sizeof(ngtcp2_ack) + sizeof(ngtcp2_ack_range) * initial_max_ack_ranges); + conn->mem, + sizeof(ngtcp2_ack) + sizeof(ngtcp2_ack_range) * initial_max_ack_ranges); if (conn->tx.ack == NULL) { return NGTCP2_ERR_NOMEM; } @@ -1844,8 +1844,9 @@ static int conn_ppe_write_frame(ngtcp2_conn *conn, ngtcp2_ppe *ppe, * NGTCP2_ERR_NOMEM * Out of memory */ -static int conn_on_pkt_sent(ngtcp2_conn *conn, ngtcp2_rtb *rtb, +static int conn_on_pkt_sent(ngtcp2_conn *conn, ngtcp2_pktns *pktns, ngtcp2_rtb_entry *ent) { + ngtcp2_rtb *rtb = &pktns->rtb; int rv; /* This function implements OnPacketSent, but it handles only @@ -1856,7 +1857,7 @@ static int conn_on_pkt_sent(ngtcp2_conn *conn, ngtcp2_rtb *rtb, } if (ent->flags & NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING) { - conn->cstat.last_tx_pkt_ts[rtb->pktns_id] = ent->ts; + conn->cstat.last_tx_pkt_ts[pktns->id] = ent->ts; } ngtcp2_conn_set_loss_detection_timer(conn, ent->ts); @@ -1898,8 +1899,8 @@ static size_t pktns_select_pkt_numlen(ngtcp2_pktns *pktns) { */ static uint64_t conn_get_cwnd(ngtcp2_conn *conn) { return conn->pv && (conn->pv->flags & NGTCP2_PV_FLAG_FALLBACK_ON_FAILURE) - ? ngtcp2_cc_compute_initcwnd(conn->cstat.max_tx_udp_payload_size) - : conn->cstat.cwnd; + ? ngtcp2_cc_compute_initcwnd(conn->cstat.max_tx_udp_payload_size) + : conn->cstat.cwnd; } /* @@ -1947,7 +1948,7 @@ static uint64_t conn_retry_early_payloadlen(ngtcp2_conn *conn) { /* Take the min because in conn_should_pad_pkt we take max in order to deal with unbreakable DATAGRAM. */ - return ngtcp2_min(len, NGTCP2_MIN_COALESCED_PAYLOADLEN); + return ngtcp2_min_uint64(len, NGTCP2_MIN_COALESCED_PAYLOADLEN); } return 0; @@ -2021,12 +2022,13 @@ static int conn_should_pad_pkt(ngtcp2_conn *conn, uint8_t type, size_t left, return 0; } - if (conn->hs_pktns->crypto.tx.ckm && - (conn->hs_pktns->rtb.probe_pkt_left || - !ngtcp2_strm_streamfrq_empty(&conn->hs_pktns->crypto.strm) || - !ngtcp2_acktr_empty(&conn->hs_pktns->acktr))) { - /* If we have something to send in Handshake packet, then add - PADDING in Handshake packet. */ + if ((conn->hs_pktns->crypto.tx.ckm && + (conn->hs_pktns->rtb.probe_pkt_left || + !ngtcp2_strm_streamfrq_empty(&conn->hs_pktns->crypto.strm) || + !ngtcp2_acktr_empty(&conn->hs_pktns->acktr))) || + conn->pktns.crypto.tx.ckm) { + /* If we have something to send in Handshake or 1RTT packet, + then add PADDING in that packet. */ min_payloadlen = NGTCP2_MIN_COALESCED_PAYLOADLEN; } else { return 1; @@ -2044,7 +2046,7 @@ static int conn_should_pad_pkt(ngtcp2_conn *conn, uint8_t type, size_t left, PADDING in that packet. Take maximum in case that write_datalen includes DATAGRAM which cannot be split. */ min_payloadlen = - ngtcp2_max(write_datalen, NGTCP2_MIN_COALESCED_PAYLOADLEN); + ngtcp2_max_uint64(write_datalen, NGTCP2_MIN_COALESCED_PAYLOADLEN); } else { return 1; } @@ -2067,8 +2069,8 @@ static int conn_should_pad_pkt(ngtcp2_conn *conn, uint8_t type, size_t left, return left < /* TODO Assuming that pkt_num is encoded in 1 byte. */ NGTCP2_MIN_LONG_HEADERLEN + conn->dcid.current.cid.datalen + - conn->oscid.datalen + NGTCP2_PKT_LENGTHLEN - 1 + min_payloadlen + - NGTCP2_MAX_AEAD_OVERHEAD; + conn->oscid.datalen + NGTCP2_PKT_LENGTHLEN - 1 + min_payloadlen + + NGTCP2_MAX_AEAD_OVERHEAD; } static void conn_restart_timer_on_write(ngtcp2_conn *conn, ngtcp2_tstamp ts) { @@ -2189,15 +2191,18 @@ static uint8_t conn_pkt_flags_long(ngtcp2_conn *conn) { static uint8_t conn_pkt_flags_short(ngtcp2_conn *conn) { return (uint8_t)(conn_pkt_flags(conn) | ((conn->pktns.crypto.tx.ckm->flags & NGTCP2_CRYPTO_KM_FLAG_KEY_PHASE_ONE) - ? NGTCP2_PKT_FLAG_KEY_PHASE - : NGTCP2_PKT_FLAG_NONE)); + ? NGTCP2_PKT_FLAG_KEY_PHASE + : NGTCP2_PKT_FLAG_NONE)); } +static size_t conn_min_pktlen(ngtcp2_conn *conn); + /* * conn_write_handshake_pkt writes handshake packet in the buffer - * pointed by |dest| whose length is |destlen|. |type| specifies long - * packet type. It should be either NGTCP2_PKT_INITIAL or - * NGTCP2_PKT_HANDSHAKE_PKT. + * pointed by |dest| whose length is |destlen|. |dgram_offset| is the + * offset in UDP datagram payload where this QUIC packet is positioned + * at. |type| specifies long packet type. It should be either + * NGTCP2_PKT_INITIAL or NGTCP2_PKT_HANDSHAKE_PKT. * * |write_datalen| is the minimum length of application data ready to * send in subsequent 0RTT packet. @@ -2212,8 +2217,9 @@ static uint8_t conn_pkt_flags_short(ngtcp2_conn *conn) { */ static ngtcp2_ssize conn_write_handshake_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, uint8_t *dest, - size_t destlen, uint8_t type, uint8_t flags, - uint64_t write_datalen, ngtcp2_tstamp ts) { + size_t destlen, size_t dgram_offset, uint8_t type, + uint8_t flags, uint64_t write_datalen, + ngtcp2_tstamp ts) { int rv; ngtcp2_ppe ppe; ngtcp2_pkt_hd hd; @@ -2228,6 +2234,7 @@ conn_write_handshake_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, uint8_t *dest, uint16_t rtb_entry_flags = NGTCP2_RTB_ENTRY_FLAG_NONE; int require_padding = (flags & NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING) != 0; int pkt_empty = 1; + int min_padded = 0; int padded = 0; int hd_logged = 0; uint64_t crypto_offset; @@ -2271,10 +2278,9 @@ conn_write_handshake_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, uint8_t *dest, cc.encrypt = conn->callbacks.encrypt; cc.hp_mask = conn->callbacks.hp_mask; - ngtcp2_pkt_hd_init(&hd, conn_pkt_flags_long(conn), type, - &conn->dcid.current.cid, &conn->oscid, - pktns->tx.last_pkt_num + 1, pktns_select_pkt_numlen(pktns), - version, 0); + ngtcp2_pkt_hd_init( + &hd, conn_pkt_flags_long(conn), type, &conn->dcid.current.cid, &conn->oscid, + pktns->tx.last_pkt_num + 1, pktns_select_pkt_numlen(pktns), version, 0); if (!conn->server && type == NGTCP2_PKT_INITIAL && conn->local.settings.tokenlen) { @@ -2282,7 +2288,7 @@ conn_write_handshake_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, uint8_t *dest, hd.tokenlen = conn->local.settings.tokenlen; } - ngtcp2_ppe_init(&ppe, dest, destlen, &cc); + ngtcp2_ppe_init(&ppe, dest, destlen, dgram_offset, &cc); rv = ngtcp2_ppe_encode_hd(&ppe, &hd); if (rv != 0) { @@ -2395,7 +2401,7 @@ conn_write_handshake_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, uint8_t *dest, assert(rv == NGTCP2_ERR_NOBUF); } else { rtb_entry_flags |= - NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING | NGTCP2_RTB_ENTRY_FLAG_PROBE; + NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING | NGTCP2_RTB_ENTRY_FLAG_PROBE; pkt_empty = 0; } } @@ -2412,6 +2418,7 @@ conn_write_handshake_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, uint8_t *dest, } else { rtb_entry_flags |= NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING; pktns->tx.non_ack_pkt_start_ts = UINT64_MAX; + pkt_empty = 0; } } else if (pktns->tx.non_ack_pkt_start_ts == UINT64_MAX) { pktns->tx.non_ack_pkt_start_ts = ts; @@ -2429,20 +2436,24 @@ conn_write_handshake_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, uint8_t *dest, /* If we cannot write another packet, then we need to add padding to Initial here. */ if (conn_should_pad_pkt( - conn, type, ngtcp2_ppe_left(&ppe), write_datalen, - (rtb_entry_flags & NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING) != 0, - require_padding)) { + conn, type, ngtcp2_ppe_left(&ppe), write_datalen, + (rtb_entry_flags & NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING) != 0, + require_padding)) { lfr.type = NGTCP2_FRAME_PADDING; - lfr.padding.len = ngtcp2_ppe_padding(&ppe); + lfr.padding.len = ngtcp2_ppe_dgram_padding(&ppe); } else if (pkt_empty) { return 0; } else { lfr.type = NGTCP2_FRAME_PADDING; - lfr.padding.len = ngtcp2_ppe_padding_hp_sample(&ppe); + lfr.padding.len = ngtcp2_ppe_padding_size(&ppe, conn_min_pktlen(conn)); + min_padded = 1; } if (lfr.padding.len) { - padded = 1; + if (!min_padded || + (rtb_entry_flags & NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING)) { + padded = 1; + } ngtcp2_log_tx_fr(&conn->log, &hd, &lfr); ngtcp2_qlog_write_frame(&conn->qlog, &lfr); } @@ -2461,16 +2472,16 @@ conn_write_handshake_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, uint8_t *dest, conn_handle_tx_ecn(conn, pi, &rtb_entry_flags, pktns, &hd, ts); } - rv = ngtcp2_rtb_entry_objalloc_new(&rtbent, &hd, frq, ts, (size_t)spktlen, - rtb_entry_flags, - &conn->rtb_entry_objalloc); + rv = + ngtcp2_rtb_entry_objalloc_new(&rtbent, &hd, frq, ts, (size_t)spktlen, + rtb_entry_flags, &conn->rtb_entry_objalloc); if (rv != 0) { assert(ngtcp2_err_is_fatal(rv)); ngtcp2_frame_chain_list_objalloc_del(frq, &conn->frc_objalloc, conn->mem); return rv; } - rv = conn_on_pkt_sent(conn, &pktns->rtb, rtbent); + rv = conn_on_pkt_sent(conn, pktns, rtbent); if (rv != 0) { ngtcp2_rtb_entry_objalloc_del(rtbent, &conn->rtb_entry_objalloc, &conn->frc_objalloc, conn->mem); @@ -2565,8 +2576,8 @@ static ngtcp2_ssize conn_write_ack_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, } spktlen = ngtcp2_conn_write_single_frame_pkt( - conn, pi, dest, destlen, type, NGTCP2_WRITE_PKT_FLAG_NONE, - &conn->dcid.current.cid, ackfr, NGTCP2_RTB_ENTRY_FLAG_NONE, NULL, ts); + conn, pi, dest, destlen, type, NGTCP2_WRITE_PKT_FLAG_NONE, + &conn->dcid.current.cid, ackfr, NGTCP2_RTB_ENTRY_FLAG_NONE, NULL, ts); if (spktlen <= 0) { return spktlen; @@ -2588,8 +2599,8 @@ static void conn_discard_pktns(ngtcp2_conn *conn, ngtcp2_pktns **ppktns, conn->cstat.bytes_in_flight -= bytes_in_flight; conn->cstat.pto_count = 0; - conn->cstat.last_tx_pkt_ts[pktns->rtb.pktns_id] = UINT64_MAX; - conn->cstat.loss_time[pktns->rtb.pktns_id] = UINT64_MAX; + conn->cstat.last_tx_pkt_ts[pktns->id] = UINT64_MAX; + conn->cstat.loss_time[pktns->id] = UINT64_MAX; conn_call_delete_crypto_aead_ctx(conn, &pktns->crypto.rx.ckm->aead_ctx); conn_call_delete_crypto_cipher_ctx(conn, &pktns->crypto.rx.hp_ctx); @@ -2602,11 +2613,7 @@ static void conn_discard_pktns(ngtcp2_conn *conn, ngtcp2_pktns **ppktns, ngtcp2_conn_set_loss_detection_timer(conn, ts); } -/* - * conn_discard_initial_state discards state for Initial packet number - * space. - */ -static void conn_discard_initial_state(ngtcp2_conn *conn, ngtcp2_tstamp ts) { +void ngtcp2_conn_discard_initial_state(ngtcp2_conn *conn, ngtcp2_tstamp ts) { if (!conn->in_pktns) { return; } @@ -2622,11 +2629,7 @@ static void conn_discard_initial_state(ngtcp2_conn *conn, ngtcp2_tstamp ts) { memset(&conn->vneg.tx, 0, sizeof(conn->vneg.tx)); } -/* - * conn_discard_handshake_state discards state for Handshake packet - * number space. - */ -static void conn_discard_handshake_state(ngtcp2_conn *conn, ngtcp2_tstamp ts) { +void ngtcp2_conn_discard_handshake_state(ngtcp2_conn *conn, ngtcp2_tstamp ts) { if (!conn->hs_pktns) { return; } @@ -2672,7 +2675,7 @@ static ngtcp2_ssize conn_write_handshake_ack_pkts(ngtcp2_conn *conn, to send ACK is give server RTT measurement early. */ if (conn->server && conn->in_pktns) { nwrite = - conn_write_ack_pkt(conn, pi, dest, destlen, NGTCP2_PKT_INITIAL, ts); + conn_write_ack_pkt(conn, pi, dest, destlen, NGTCP2_PKT_INITIAL, ts); if (nwrite < 0) { assert(nwrite != NGTCP2_ERR_NOBUF); return nwrite; @@ -2685,7 +2688,7 @@ static ngtcp2_ssize conn_write_handshake_ack_pkts(ngtcp2_conn *conn, if (conn->hs_pktns->crypto.tx.ckm) { nwrite = - conn_write_ack_pkt(conn, pi, dest, destlen, NGTCP2_PKT_HANDSHAKE, ts); + conn_write_ack_pkt(conn, pi, dest, destlen, NGTCP2_PKT_HANDSHAKE, ts); if (nwrite < 0) { assert(nwrite != NGTCP2_ERR_NOBUF); return nwrite; @@ -2694,7 +2697,7 @@ static ngtcp2_ssize conn_write_handshake_ack_pkts(ngtcp2_conn *conn, res += nwrite; if (!conn->server && nwrite) { - conn_discard_initial_state(conn, ts); + ngtcp2_conn_discard_initial_state(conn, ts); } } @@ -2725,9 +2728,9 @@ static ngtcp2_ssize conn_write_client_initial(ngtcp2_conn *conn, return rv; } - return conn_write_handshake_pkt(conn, pi, dest, destlen, NGTCP2_PKT_INITIAL, - NGTCP2_WRITE_PKT_FLAG_NONE, early_datalen, - ts); + return conn_write_handshake_pkt( + conn, pi, dest, destlen, 0, NGTCP2_PKT_INITIAL, NGTCP2_WRITE_PKT_FLAG_NONE, + early_datalen, ts); } /* @@ -2807,11 +2810,11 @@ static ngtcp2_ssize conn_write_handshake_pkts(ngtcp2_conn *conn, conn->hs_pktns->rtb.probe_pkt_left)) { /* Discard Initial state here so that Handshake packet is not padded. */ - conn_discard_initial_state(conn, ts); + ngtcp2_conn_discard_initial_state(conn, ts); } else if (conn->in_pktns) { nwrite = - conn_write_handshake_pkt(conn, pi, dest, destlen, NGTCP2_PKT_INITIAL, - NGTCP2_WRITE_PKT_FLAG_NONE, write_datalen, ts); + conn_write_handshake_pkt(conn, pi, dest, destlen, 0, NGTCP2_PKT_INITIAL, + NGTCP2_WRITE_PKT_FLAG_NONE, write_datalen, ts); if (nwrite < 0) { assert(nwrite != NGTCP2_ERR_NOBUF); return nwrite; @@ -2823,11 +2826,11 @@ static ngtcp2_ssize conn_write_handshake_pkts(ngtcp2_conn *conn, !ngtcp2_strm_streamfrq_empty(&conn->in_pktns->crypto.strm))) { if (cstat->loss_detection_timer != UINT64_MAX && conn_server_tx_left(conn, &conn->dcid.current) < - NGTCP2_MAX_UDP_PAYLOAD_SIZE) { + NGTCP2_MAX_UDP_PAYLOAD_SIZE) { ngtcp2_log_info( - &conn->log, NGTCP2_LOG_EVENT_LDC, - "loss detection timer canceled due to amplification limit"); - cstat->loss_detection_timer = UINT64_MAX; + &conn->log, NGTCP2_LOG_EVENT_LDC, + "loss detection timer canceled due to amplification limit"); + ngtcp2_conn_cancel_loss_detection_timer(conn); } return 0; @@ -2837,10 +2840,10 @@ static ngtcp2_ssize conn_write_handshake_pkts(ngtcp2_conn *conn, dest += nwrite; destlen -= (size_t)nwrite; - if (destlen) { - /* We might have already added padding to Initial, but in that - case, we should have destlen == 0 and no Handshake packet - will be written. */ + /* If initial packet size is at least + NGTCP2_MAX_UDP_PAYLOAD_SIZE, no extra padding is needed in a + subsequent packet. */ + if (nwrite < NGTCP2_MAX_UDP_PAYLOAD_SIZE) { if (conn->server) { it = ngtcp2_rtb_head(&conn->in_pktns->rtb); if (!ngtcp2_ksl_it_end(&it)) { @@ -2856,8 +2859,9 @@ static ngtcp2_ssize conn_write_handshake_pkts(ngtcp2_conn *conn, } } - nwrite = conn_write_handshake_pkt( - conn, pi, dest, destlen, NGTCP2_PKT_HANDSHAKE, wflags, write_datalen, ts); + nwrite = + conn_write_handshake_pkt(conn, pi, dest, destlen, (size_t)res, + NGTCP2_PKT_HANDSHAKE, wflags, write_datalen, ts); if (nwrite < 0) { assert(nwrite != NGTCP2_ERR_NOBUF); return nwrite; @@ -2869,7 +2873,7 @@ static ngtcp2_ssize conn_write_handshake_pkts(ngtcp2_conn *conn, /* We don't need to send further Initial packet if we have Handshake key and sent something with it. So discard initial state here. */ - conn_discard_initial_state(conn, ts); + ngtcp2_conn_discard_initial_state(conn, ts); } return res; @@ -2905,7 +2909,7 @@ static int conn_should_send_max_stream_data(ngtcp2_conn *conn, uint64_t inc = strm->rx.unsent_max_offset - strm->rx.max_offset; (void)conn; - return strm->rx.window < 2 * inc; + return strm->rx.window < 4 * inc; } /* @@ -2915,7 +2919,7 @@ static int conn_should_send_max_stream_data(ngtcp2_conn *conn, static int conn_should_send_max_data(ngtcp2_conn *conn) { uint64_t inc = conn->rx.unsent_max_offset - conn->rx.max_offset; - return conn->rx.window < 2 * inc; + return conn->rx.window < 4 * inc; } /* @@ -2948,9 +2952,9 @@ static size_t conn_required_num_new_connection_id(ngtcp2_conn *conn) { n = conn->remote.transport_params->active_connection_id_limit + conn->scid.num_retired; - n = ngtcp2_min(NGTCP2_MAX_SCID_POOL_SIZE, n) - len; + n = ngtcp2_min_uint64(NGTCP2_MAX_SCID_POOL_SIZE, n) - len; - return (size_t)ngtcp2_min(lim, n); + return (size_t)ngtcp2_min_uint64(lim, n); } /* @@ -3093,11 +3097,12 @@ static int conn_remove_retired_connection_id(ngtcp2_conn *conn, } /* - * conn_min_short_pktlen returns the minimum length of Short packet - * this endpoint sends. + * conn_min_pktlen returns the minimum length of packet this endpoint + * sends. It may underestimate the length because this does not take + * into account header protection sample. */ -static size_t conn_min_short_pktlen(ngtcp2_conn *conn) { - return conn->dcid.current.cid.datalen + NGTCP2_MIN_PKT_EXPANDLEN; +static size_t conn_min_pktlen(ngtcp2_conn *conn) { + return conn->oscid.datalen + NGTCP2_MIN_PKT_EXPANDLEN; } /* @@ -3155,8 +3160,10 @@ static void conn_reset_ppe_pending(ngtcp2_conn *conn) { /* * conn_write_pkt writes a protected packet in the buffer pointed by - * |dest| whose length if |destlen|. |type| specifies the type of - * packet. It can be NGTCP2_PKT_1RTT or NGTCP2_PKT_0RTT. + * |dest| whose length if |destlen|. |dgram_offset| is the offset in + * UDP datagram payload where this QUIC packet is positioned at. + * |type| specifies the type of packet. It can be NGTCP2_PKT_1RTT or + * NGTCP2_PKT_0RTT. * * This function can send new stream data. In order to send stream * data, specify the underlying stream and parameters to @@ -3183,8 +3190,9 @@ static void conn_reset_ppe_pending(ngtcp2_conn *conn) { */ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, - ngtcp2_vmsg *vmsg, uint8_t type, - uint8_t flags, ngtcp2_tstamp ts) { + size_t dgram_offset, ngtcp2_vmsg *vmsg, + uint8_t type, uint8_t flags, + ngtcp2_tstamp ts) { int rv = 0; ngtcp2_crypto_cc *cc = &conn->pkt.cc; ngtcp2_ppe *ppe = &conn->pkt.ppe; @@ -3211,7 +3219,8 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, int require_padding = (flags & NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING) != 0; int write_more = (flags & NGTCP2_WRITE_PKT_FLAG_MORE) != 0; int ppe_pending = (conn->flags & NGTCP2_CONN_FLAG_PPE_PENDING) != 0; - size_t min_pktlen = conn_min_short_pktlen(conn); + size_t min_pktlen = conn_min_pktlen(conn); + int min_padded = 0; int padded = 0; ngtcp2_cc_pkt cc_pkt; uint64_t crypto_offset; @@ -3311,7 +3320,7 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, if (conn->local.settings.max_window && conn->tx.last_max_data_ts != UINT64_MAX && ts - conn->tx.last_max_data_ts < - NGTCP2_FLOW_WINDOW_RTT_FACTOR * cstat->smoothed_rtt && + NGTCP2_FLOW_WINDOW_RTT_FACTOR * cstat->smoothed_rtt && conn->local.settings.max_window > conn->rx.window) { target_max_data = NGTCP2_FLOW_WINDOW_SCALING_FACTOR * conn->rx.window; if (target_max_data > conn->local.settings.max_window) { @@ -3336,7 +3345,7 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, pktns->tx.frq = nfrc; conn->rx.max_offset = conn->rx.unsent_max_offset = - nfrc->fr.max_data.max_data; + nfrc->fr.max_data.max_data; } if (stream_blocked && conn_should_send_max_data(conn)) { @@ -3369,7 +3378,7 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, pktns->tx.last_pkt_num + 1, pktns_select_pkt_numlen(pktns), version, 0); - ngtcp2_ppe_init(ppe, dest, destlen, cc); + ngtcp2_ppe_init(ppe, dest, destlen, dgram_offset, cc); rv = ngtcp2_ppe_encode_hd(ppe, hd); if (rv != 0) { @@ -3407,8 +3416,8 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, } rv = ngtcp2_conn_create_ack_frame( - conn, &ackfr, pktns, type, ts, conn_compute_ack_delay(conn), - conn->local.transport_params.ack_delay_exponent); + conn, &ackfr, pktns, type, ts, conn_compute_ack_delay(conn), + conn->local.transport_params.ack_delay_exponent); if (rv != 0) { assert(ngtcp2_err_is_fatal(rv)); return rv; @@ -3422,10 +3431,9 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, ngtcp2_acktr_commit_ack(&pktns->acktr); ngtcp2_acktr_add_ack(&pktns->acktr, hd->pkt_num, ackfr->ack.largest_ack); - if (type == NGTCP2_PKT_1RTT) { - conn_handle_unconfirmed_key_update_from_remote( - conn, ackfr->ack.largest_ack, ts); - } + assert(NGTCP2_PKT_1RTT == type); + conn_handle_unconfirmed_key_update_from_remote( + conn, ackfr->ack.largest_ack, ts); pkt_empty = 0; } } @@ -3443,7 +3451,7 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, switch ((*pfrc)->fr.type) { case NGTCP2_FRAME_RESET_STREAM: strm = - ngtcp2_conn_find_stream(conn, (*pfrc)->fr.reset_stream.stream_id); + ngtcp2_conn_find_stream(conn, (*pfrc)->fr.reset_stream.stream_id); if (strm == NULL || !ngtcp2_strm_require_retransmit_reset_stream(strm)) { frc = *pfrc; @@ -3454,7 +3462,7 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, break; case NGTCP2_FRAME_STOP_SENDING: strm = - ngtcp2_conn_find_stream(conn, (*pfrc)->fr.stop_sending.stream_id); + ngtcp2_conn_find_stream(conn, (*pfrc)->fr.stop_sending.stream_id); if (strm == NULL || !ngtcp2_strm_require_retransmit_stop_sending(strm)) { frc = *pfrc; @@ -3484,10 +3492,10 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, } break; case NGTCP2_FRAME_MAX_STREAM_DATA: - strm = ngtcp2_conn_find_stream(conn, - (*pfrc)->fr.max_stream_data.stream_id); + strm = + ngtcp2_conn_find_stream(conn, (*pfrc)->fr.max_stream_data.stream_id); if (strm == NULL || !ngtcp2_strm_require_retransmit_max_stream_data( - strm, &(*pfrc)->fr.max_stream_data)) { + strm, &(*pfrc)->fr.max_stream_data)) { frc = *pfrc; *pfrc = (*pfrc)->next; ngtcp2_frame_chain_objalloc_del(frc, &conn->frc_objalloc, conn->mem); @@ -3504,9 +3512,9 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, break; case NGTCP2_FRAME_STREAM_DATA_BLOCKED: strm = ngtcp2_conn_find_stream( - conn, (*pfrc)->fr.stream_data_blocked.stream_id); + conn, (*pfrc)->fr.stream_data_blocked.stream_id); if (strm == NULL || !ngtcp2_strm_require_retransmit_stream_data_blocked( - strm, &(*pfrc)->fr.stream_data_blocked)) { + strm, &(*pfrc)->fr.stream_data_blocked)) { frc = *pfrc; *pfrc = (*pfrc)->next; ngtcp2_frame_chain_objalloc_del(frc, &conn->frc_objalloc, conn->mem); @@ -3543,7 +3551,7 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, left = ngtcp2_ppe_left(ppe); crypto_offset = - ngtcp2_strm_streamfrq_unacked_offset(&pktns->crypto.strm); + ngtcp2_strm_streamfrq_unacked_offset(&pktns->crypto.strm); if (crypto_offset == (uint64_t)-1) { ngtcp2_strm_streamfrq_clear(&pktns->crypto.strm); break; @@ -3593,14 +3601,14 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, nfrc->fr.type = NGTCP2_FRAME_RESET_STREAM; nfrc->fr.reset_stream.stream_id = strm->stream_id; nfrc->fr.reset_stream.app_error_code = - strm->tx.reset_stream_app_error_code; + strm->tx.reset_stream_app_error_code; nfrc->fr.reset_stream.final_size = strm->tx.offset; *pfrc = nfrc; strm->flags &= ~NGTCP2_STRM_FLAG_SEND_RESET_STREAM; rv = - conn_ppe_write_frame_hd_log(conn, ppe, &hd_logged, hd, &nfrc->fr); + conn_ppe_write_frame_hd_log(conn, ppe, &hd_logged, hd, &nfrc->fr); if (rv != 0) { assert(NGTCP2_ERR_NOBUF == rv); @@ -3620,8 +3628,8 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, strm->flags &= ~NGTCP2_STRM_FLAG_SEND_STOP_SENDING; } else { rv = conn_call_stream_stop_sending( - conn, strm->stream_id, strm->tx.stop_sending_app_error_code, - strm->stream_user_data); + conn, strm->stream_id, strm->tx.stop_sending_app_error_code, + strm->stream_user_data); if (rv != 0) { assert(ngtcp2_err_is_fatal(rv)); @@ -3636,13 +3644,13 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, nfrc->fr.type = NGTCP2_FRAME_STOP_SENDING; nfrc->fr.stop_sending.stream_id = strm->stream_id; nfrc->fr.stop_sending.app_error_code = - strm->tx.stop_sending_app_error_code; + strm->tx.stop_sending_app_error_code; *pfrc = nfrc; strm->flags &= ~NGTCP2_STRM_FLAG_SEND_STOP_SENDING; - rv = conn_ppe_write_frame_hd_log(conn, ppe, &hd_logged, hd, - &nfrc->fr); + rv = + conn_ppe_write_frame_hd_log(conn, ppe, &hd_logged, hd, &nfrc->fr); if (rv != 0) { assert(NGTCP2_ERR_NOBUF == rv); @@ -3672,7 +3680,7 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, strm->tx.last_blocked_offset = strm->tx.max_offset; rv = - conn_ppe_write_frame_hd_log(conn, ppe, &hd_logged, hd, &nfrc->fr); + conn_ppe_write_frame_hd_log(conn, ppe, &hd_logged, hd, &nfrc->fr); if (rv != 0) { assert(NGTCP2_ERR_NOBUF == rv); @@ -3698,10 +3706,10 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, if (conn->local.settings.max_stream_window && strm->tx.last_max_stream_data_ts != UINT64_MAX && ts - strm->tx.last_max_stream_data_ts < - NGTCP2_FLOW_WINDOW_RTT_FACTOR * cstat->smoothed_rtt && + NGTCP2_FLOW_WINDOW_RTT_FACTOR * cstat->smoothed_rtt && conn->local.settings.max_stream_window > strm->rx.window) { target_max_data = - NGTCP2_FLOW_WINDOW_SCALING_FACTOR * strm->rx.window; + NGTCP2_FLOW_WINDOW_SCALING_FACTOR * strm->rx.window; if (target_max_data > conn->local.settings.max_stream_window) { target_max_data = conn->local.settings.max_stream_window; } @@ -3721,14 +3729,14 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, nfrc->fr.type = NGTCP2_FRAME_MAX_STREAM_DATA; nfrc->fr.max_stream_data.stream_id = strm->stream_id; nfrc->fr.max_stream_data.max_stream_data = - strm->rx.unsent_max_offset + delta; + strm->rx.unsent_max_offset + delta; *pfrc = nfrc; strm->rx.max_offset = strm->rx.unsent_max_offset = - nfrc->fr.max_stream_data.max_stream_data; + nfrc->fr.max_stream_data.max_stream_data; rv = - conn_ppe_write_frame_hd_log(conn, ppe, &hd_logged, hd, &nfrc->fr); + conn_ppe_write_frame_hd_log(conn, ppe, &hd_logged, hd, &nfrc->fr); if (rv != 0) { assert(NGTCP2_ERR_NOBUF == rv); break; @@ -3806,7 +3814,7 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, if (*pfrc == NULL && conn->remote.bidi.unsent_max_streams > conn->remote.bidi.max_streams) { rv = conn_call_extend_max_remote_streams_bidi( - conn, conn->remote.bidi.unsent_max_streams); + conn, conn->remote.bidi.unsent_max_streams); if (rv != 0) { assert(ngtcp2_err_is_fatal(rv)); return rv; @@ -3838,7 +3846,7 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, if (*pfrc == NULL && conn->remote.uni.unsent_max_streams > conn->remote.uni.max_streams) { rv = conn_call_extend_max_remote_streams_uni( - conn, conn->remote.uni.unsent_max_streams); + conn, conn->remote.uni.unsent_max_streams); if (rv != 0) { assert(ngtcp2_err_is_fatal(rv)); return rv; @@ -3901,8 +3909,8 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, if (*pfrc == NULL && send_stream && (ndatalen = ngtcp2_pkt_stream_max_datalen( - vmsg->stream.strm->stream_id, vmsg->stream.strm->tx.offset, ndatalen, - left)) != (size_t)-1 && + vmsg->stream.strm->stream_id, vmsg->stream.strm->tx.offset, ndatalen, + left)) != (size_t)-1 && (ndatalen || datalen == 0)) { datacnt = ngtcp2_vec_copy_at_most(data, NGTCP2_MAX_STREAM_DATACNT, vmsg->stream.data, vmsg->stream.datacnt, @@ -3912,7 +3920,7 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, assert((datacnt == 0 && datalen == 0) || (datacnt && datalen)); rv = ngtcp2_frame_chain_stream_datacnt_objalloc_new( - &nfrc, datacnt, &conn->frc_objalloc, conn->mem); + &nfrc, datacnt, &conn->frc_objalloc, conn->mem); if (rv != 0) { assert(ngtcp2_err_is_fatal(rv)); return rv; @@ -3944,6 +3952,7 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, vmsg->stream.strm->tx.offset += ndatalen; conn->tx.offset += ndatalen; + vmsg->stream.strm->flags |= NGTCP2_STRM_FLAG_ANY_SENT; if (fin) { ngtcp2_strm_shutdown(vmsg->stream.strm, NGTCP2_STRM_FLAG_SHUT_WR); @@ -4095,7 +4104,7 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, } keep_alive_expired = - type == NGTCP2_PKT_1RTT && conn_keep_alive_expired(conn, ts); + type == NGTCP2_PKT_1RTT && conn_keep_alive_expired(conn, ts); if (conn->pktns.rtb.probe_pkt_left == 0 && !keep_alive_expired && !require_padding) { @@ -4154,8 +4163,11 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, rtb_entry_flags |= NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING; if (conn->pktns.rtb.probe_pkt_left) { rtb_entry_flags |= NGTCP2_RTB_ENTRY_FLAG_PROBE; + } else { + rtb_entry_flags |= NGTCP2_RTB_ENTRY_FLAG_PTO_ELICITING; } pktns->tx.non_ack_pkt_start_ts = UINT64_MAX; + pkt_empty = 0; } } else if (pktns->tx.non_ack_pkt_start_ts == UINT64_MAX) { pktns->tx.non_ack_pkt_start_ts = ts; @@ -4166,19 +4178,19 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, /* TODO Push STREAM frame back to ngtcp2_strm if there is an error before ngtcp2_rtb_entry is safely created and added. */ - if (require_padding || - /* Making full sized packet will help GSO a bit */ - ngtcp2_ppe_left(ppe) < 10) { - lfr.padding.len = ngtcp2_ppe_padding(ppe); - } else if (type == NGTCP2_PKT_1RTT) { - lfr.padding.len = ngtcp2_ppe_padding_size(ppe, min_pktlen); + if (require_padding) { + lfr.padding.len = ngtcp2_ppe_dgram_padding(ppe); } else { - lfr.padding.len = ngtcp2_ppe_padding_hp_sample(ppe); + lfr.padding.len = ngtcp2_ppe_padding_size(ppe, min_pktlen); + min_padded = 1; } if (lfr.padding.len) { + if (!min_padded || + (rtb_entry_flags & NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING)) { + padded = 1; + } lfr.type = NGTCP2_FRAME_PADDING; - padded = 1; ngtcp2_log_tx_fr(&conn->log, hd, &lfr); ngtcp2_qlog_write_frame(&conn->qlog, &lfr); } @@ -4200,11 +4212,11 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, conn_handle_tx_ecn(conn, pi, &rtb_entry_flags, pktns, hd, ts); } - rv = ngtcp2_rtb_entry_objalloc_new(&ent, hd, NULL, ts, (size_t)nwrite, - rtb_entry_flags, - &conn->rtb_entry_objalloc); + rv = + ngtcp2_rtb_entry_objalloc_new(&ent, hd, NULL, ts, (size_t)nwrite, + rtb_entry_flags, &conn->rtb_entry_objalloc); if (rv != 0) { - assert(ngtcp2_err_is_fatal((int)nwrite)); + assert(ngtcp2_err_is_fatal(rv)); return rv; } @@ -4220,7 +4232,7 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, ts); } - rv = conn_on_pkt_sent(conn, &pktns->rtb, ent); + rv = conn_on_pkt_sent(conn, pktns, ent); if (rv != 0) { assert(ngtcp2_err_is_fatal(rv)); ngtcp2_rtb_entry_objalloc_del(ent, &conn->rtb_entry_objalloc, @@ -4231,10 +4243,10 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, if (rtb_entry_flags & NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING) { if (conn->cc.on_pkt_sent) { conn->cc.on_pkt_sent( - &conn->cc, &conn->cstat, - ngtcp2_cc_pkt_init(&cc_pkt, hd->pkt_num, (size_t)nwrite, - NGTCP2_PKTNS_ID_APPLICATION, ts, ent->rst.lost, - ent->rst.tx_in_flight, ent->rst.is_app_limited)); + &conn->cc, &conn->cstat, + ngtcp2_cc_pkt_init(&cc_pkt, hd->pkt_num, (size_t)nwrite, + NGTCP2_PKTNS_ID_APPLICATION, ts, ent->rst.lost, + ent->rst.tx_in_flight, ent->rst.is_app_limited)); } if (conn->flags & NGTCP2_CONN_FLAG_RESTART_IDLE_TIMER_ON_WRITE) { @@ -4269,9 +4281,9 @@ static ngtcp2_ssize conn_write_pkt(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, } ngtcp2_ssize ngtcp2_conn_write_single_frame_pkt( - ngtcp2_conn *conn, ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, - uint8_t type, uint8_t flags, const ngtcp2_cid *dcid, ngtcp2_frame *fr, - uint16_t rtb_entry_flags, const ngtcp2_path *path, ngtcp2_tstamp ts) { + ngtcp2_conn *conn, ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, + uint8_t type, uint8_t flags, const ngtcp2_cid *dcid, ngtcp2_frame *fr, + uint16_t rtb_entry_flags, const ngtcp2_path *path, ngtcp2_tstamp ts) { int rv; ngtcp2_ppe ppe; ngtcp2_pkt_hd hd; @@ -4332,7 +4344,7 @@ ngtcp2_ssize ngtcp2_conn_write_single_frame_pkt( pktns->tx.last_pkt_num + 1, pktns_select_pkt_numlen(pktns), version, 0); - ngtcp2_ppe_init(&ppe, dest, destlen, &cc); + ngtcp2_ppe_init(&ppe, dest, destlen, 0, &cc); rv = ngtcp2_ppe_encode_hd(&ppe, &hd); if (rv != 0) { @@ -4354,25 +4366,22 @@ ngtcp2_ssize ngtcp2_conn_write_single_frame_pkt( } lfr.type = NGTCP2_FRAME_PADDING; - if (flags & NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING) { - lfr.padding.len = ngtcp2_ppe_padding(&ppe); + if (flags & NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING_FULL) { + lfr.padding.len = ngtcp2_ppe_dgram_padding_size(&ppe, destlen); + } else if (flags & NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING) { + lfr.padding.len = ngtcp2_ppe_dgram_padding(&ppe); } else { switch (fr->type) { case NGTCP2_FRAME_PATH_CHALLENGE: case NGTCP2_FRAME_PATH_RESPONSE: if (!conn->server || destlen >= NGTCP2_MAX_UDP_PAYLOAD_SIZE) { - lfr.padding.len = ngtcp2_ppe_padding(&ppe); + lfr.padding.len = ngtcp2_ppe_dgram_padding(&ppe); } else { lfr.padding.len = 0; } break; default: - if (type == NGTCP2_PKT_1RTT) { - lfr.padding.len = - ngtcp2_ppe_padding_size(&ppe, conn_min_short_pktlen(conn)); - } else { - lfr.padding.len = ngtcp2_ppe_padding_hp_sample(&ppe); - } + lfr.padding.len = ngtcp2_ppe_padding_size(&ppe, conn_min_pktlen(conn)); } } if (lfr.padding.len) { @@ -4402,6 +4411,12 @@ ngtcp2_ssize ngtcp2_conn_write_single_frame_pkt( conn_handle_unconfirmed_key_update_from_remote(conn, fr->ack.largest_ack, ts); } + + if (!(flags & (NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING_FULL | + NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING))) { + padded = 0; + } + break; } @@ -4412,14 +4427,14 @@ ngtcp2_ssize ngtcp2_conn_write_single_frame_pkt( conn_handle_tx_ecn(conn, pi, &rtb_entry_flags, pktns, &hd, ts); } - rv = ngtcp2_rtb_entry_objalloc_new(&rtbent, &hd, NULL, ts, (size_t)nwrite, - rtb_entry_flags, - &conn->rtb_entry_objalloc); + rv = + ngtcp2_rtb_entry_objalloc_new(&rtbent, &hd, NULL, ts, (size_t)nwrite, + rtb_entry_flags, &conn->rtb_entry_objalloc); if (rv != 0) { return rv; } - rv = conn_on_pkt_sent(conn, &pktns->rtb, rtbent); + rv = conn_on_pkt_sent(conn, pktns, rtbent); if (rv != 0) { ngtcp2_rtb_entry_objalloc_del(rtbent, &conn->rtb_entry_objalloc, &conn->frc_objalloc, conn->mem); @@ -4522,6 +4537,10 @@ static int conn_retire_dcid_seq(ngtcp2_conn *conn, uint64_t seq) { ngtcp2_frame_chain *nfrc; int rv; + if (ngtcp2_conn_check_retired_dcid_tracked(conn, seq)) { + return 0; + } + rv = ngtcp2_conn_track_retired_dcid_seq(conn, seq); if (rv != 0) { return rv; @@ -4658,13 +4677,15 @@ static int conn_start_pmtud(ngtcp2_conn *conn) { assert(conn->remote.transport_params->max_udp_payload_size >= NGTCP2_MAX_UDP_PAYLOAD_SIZE); - hard_max_udp_payload_size = (size_t)ngtcp2_min( - conn->remote.transport_params->max_udp_payload_size, - (uint64_t)conn->local.settings.max_tx_udp_payload_size); + hard_max_udp_payload_size = (size_t)ngtcp2_min_uint64( + conn->remote.transport_params->max_udp_payload_size, + (uint64_t)conn->local.settings.max_tx_udp_payload_size); - rv = ngtcp2_pmtud_new(&conn->pmtud, conn->dcid.current.max_udp_payload_size, - hard_max_udp_payload_size, - conn->pktns.tx.last_pkt_num + 1, conn->mem); + rv = + ngtcp2_pmtud_new(&conn->pmtud, conn->dcid.current.max_udp_payload_size, + hard_max_udp_payload_size, conn->pktns.tx.last_pkt_num + 1, + conn->local.settings.pmtud_probes, + conn->local.settings.pmtud_probeslen, conn->mem); if (rv != 0) { return rv; } @@ -4715,12 +4736,11 @@ static ngtcp2_ssize conn_write_pmtud_probe(ngtcp2_conn *conn, lfr.type = NGTCP2_FRAME_PING; nwrite = ngtcp2_conn_write_single_frame_pkt( - conn, pi, dest, probelen, NGTCP2_PKT_1RTT, - NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING, &conn->dcid.current.cid, &lfr, - NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING | - NGTCP2_RTB_ENTRY_FLAG_PTO_ELICITING | - NGTCP2_RTB_ENTRY_FLAG_PMTUD_PROBE, - NULL, ts); + conn, pi, dest, probelen, NGTCP2_PKT_1RTT, + NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING_FULL, &conn->dcid.current.cid, &lfr, + NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING | NGTCP2_RTB_ENTRY_FLAG_PTO_ELICITING | + NGTCP2_RTB_ENTRY_FLAG_PMTUD_PROBE, + NULL, ts); if (nwrite < 0) { return nwrite; } @@ -4813,19 +4833,19 @@ static size_t conn_shape_udp_payload(ngtcp2_conn *conn, const ngtcp2_dcid *dcid, assert(conn->remote.transport_params->max_udp_payload_size >= NGTCP2_MAX_UDP_PAYLOAD_SIZE); - payloadlen = - (size_t)ngtcp2_min((uint64_t)payloadlen, - conn->remote.transport_params->max_udp_payload_size); + payloadlen = (size_t)ngtcp2_min_uint64( + (uint64_t)payloadlen, + conn->remote.transport_params->max_udp_payload_size); } payloadlen = - ngtcp2_min(payloadlen, conn->local.settings.max_tx_udp_payload_size); + ngtcp2_min_size(payloadlen, conn->local.settings.max_tx_udp_payload_size); if (conn->local.settings.no_tx_udp_payload_size_shaping) { return payloadlen; } - return ngtcp2_min(payloadlen, dcid->max_udp_payload_size); + return ngtcp2_min_size(payloadlen, dcid->max_udp_payload_size); } static void conn_reset_congestion_state(ngtcp2_conn *conn, ngtcp2_tstamp ts); @@ -4920,15 +4940,15 @@ static ngtcp2_ssize conn_write_path_challenge(ngtcp2_conn *conn, initial_pto = conn_compute_initial_pto(conn, &conn->pktns); timeout = conn_compute_pto(conn, &conn->pktns); - timeout = ngtcp2_max(timeout, initial_pto); + timeout = ngtcp2_max_uint64(timeout, initial_pto); expiry = ts + timeout * (1ULL << pv->round); - destlen = ngtcp2_min(destlen, NGTCP2_MAX_UDP_PAYLOAD_SIZE); + destlen = ngtcp2_min_size(destlen, NGTCP2_MAX_UDP_PAYLOAD_SIZE); if (conn->server) { if (!(pv->dcid.flags & NGTCP2_DCID_FLAG_PATH_VALIDATED)) { tx_left = conn_server_tx_left(conn, &pv->dcid); - destlen = (size_t)ngtcp2_min((uint64_t)destlen, tx_left); + destlen = (size_t)ngtcp2_min_uint64((uint64_t)destlen, tx_left); if (destlen == 0) { return 0; } @@ -4946,10 +4966,10 @@ static ngtcp2_ssize conn_write_path_challenge(ngtcp2_conn *conn, ngtcp2_pv_add_entry(pv, lfr.path_challenge.data, expiry, flags, ts); nwrite = ngtcp2_conn_write_single_frame_pkt( - conn, pi, dest, destlen, NGTCP2_PKT_1RTT, NGTCP2_WRITE_PKT_FLAG_NONE, - &pv->dcid.cid, &lfr, - NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING | NGTCP2_RTB_ENTRY_FLAG_PTO_ELICITING, - &pv->dcid.ps.path, ts); + conn, pi, dest, destlen, NGTCP2_PKT_1RTT, NGTCP2_WRITE_PKT_FLAG_NONE, + &pv->dcid.cid, &lfr, + NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING | NGTCP2_RTB_ENTRY_FLAG_PTO_ELICITING, + &pv->dcid.ps.path, ts); if (nwrite <= 0) { return nwrite; } @@ -5039,11 +5059,11 @@ static ngtcp2_ssize conn_write_path_response(ngtcp2_conn *conn, } } - destlen = ngtcp2_min(destlen, NGTCP2_MAX_UDP_PAYLOAD_SIZE); + destlen = ngtcp2_min_size(destlen, NGTCP2_MAX_UDP_PAYLOAD_SIZE); if (conn->server && !(dcid->flags & NGTCP2_DCID_FLAG_PATH_VALIDATED)) { tx_left = conn_server_tx_left(conn, dcid); - destlen = (size_t)ngtcp2_min((uint64_t)destlen, tx_left); + destlen = (size_t)ngtcp2_min_uint64((uint64_t)destlen, tx_left); if (destlen == 0) { return 0; } @@ -5053,9 +5073,8 @@ static ngtcp2_ssize conn_write_path_response(ngtcp2_conn *conn, memcpy(lfr.path_response.data, pcent->data, sizeof(lfr.path_response.data)); nwrite = ngtcp2_conn_write_single_frame_pkt( - conn, pi, dest, destlen, NGTCP2_PKT_1RTT, NGTCP2_WRITE_PKT_FLAG_NONE, - &dcid->cid, &lfr, NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING, &pcent->ps.path, - ts); + conn, pi, dest, destlen, NGTCP2_PKT_1RTT, NGTCP2_WRITE_PKT_FLAG_NONE, + &dcid->cid, &lfr, NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING, &pcent->ps.path, ts); if (nwrite <= 0) { return nwrite; } @@ -5077,10 +5096,10 @@ ngtcp2_ssize ngtcp2_conn_write_pkt_versioned(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, ngtcp2_tstamp ts) { return ngtcp2_conn_writev_stream_versioned( - conn, path, pkt_info_version, pi, dest, destlen, - /* pdatalen = */ NULL, NGTCP2_WRITE_STREAM_FLAG_NONE, - /* stream_id = */ -1, - /* datav = */ NULL, /* datavcnt = */ 0, ts); + conn, path, pkt_info_version, pi, dest, destlen, + /* pdatalen = */ NULL, NGTCP2_WRITE_STREAM_FLAG_NONE, + /* stream_id = */ -1, + /* datav = */ NULL, /* datavcnt = */ 0, ts); } /* @@ -5225,8 +5244,8 @@ static int conn_on_retry(ngtcp2_conn *conn, const ngtcp2_pkt_hd *hd, retry.odcid = conn->dcid.current.cid; rv = ngtcp2_pkt_verify_retry_tag( - conn->client_chosen_version, &retry, pkt, pktlen, conn->callbacks.encrypt, - &conn->crypto.retry_aead, &conn->crypto.retry_aead_ctx); + conn->client_chosen_version, &retry, pkt, pktlen, conn->callbacks.encrypt, + &conn->crypto.retry_aead, &conn->crypto.retry_aead_ctx); if (rv != 0) { ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_PKT, "unable to verify Retry packet integrity"); @@ -5303,15 +5322,14 @@ int ngtcp2_conn_detect_lost_pkt(ngtcp2_conn *conn, ngtcp2_pktns *pktns, * conn_recv_ack processes received ACK frame |fr|. |pkt_ts| is the * timestamp when packet is received. |ts| should be the current * time. Usually they are the same, but for buffered packets, - * |pkt_ts| would be earlier than |ts|. + * |pkt_ts| would be earlier than |ts|. This function needs to be + * called after |fr| is validated by ngtcp2_pkt_validate_ack. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * NGTCP2_ERR_NOMEM * Out of memory - * NGTCP2_ERR_ACK_FRAME - * ACK frame is malformed. * NGTCP2_ERR_PROTO * |fr| acknowledges a packet this endpoint has not sent. * NGTCP2_ERR_CALLBACK_FAILURE @@ -5319,7 +5337,6 @@ int ngtcp2_conn_detect_lost_pkt(ngtcp2_conn *conn, ngtcp2_pktns *pktns, */ static int conn_recv_ack(ngtcp2_conn *conn, ngtcp2_pktns *pktns, ngtcp2_ack *fr, ngtcp2_tstamp pkt_ts, ngtcp2_tstamp ts) { - int rv; ngtcp2_ssize num_acked; ngtcp2_conn_stat *cstat = &conn->cstat; @@ -5327,15 +5344,10 @@ static int conn_recv_ack(ngtcp2_conn *conn, ngtcp2_pktns *pktns, ngtcp2_ack *fr, return NGTCP2_ERR_PROTO; } - rv = ngtcp2_pkt_validate_ack(fr, conn->local.settings.initial_pkt_num); - if (rv != 0) { - return rv; - } - ngtcp2_acktr_recv_ack(&pktns->acktr, fr); - num_acked = ngtcp2_rtb_recv_ack(&pktns->rtb, fr, &conn->cstat, conn, pktns, - pkt_ts, ts); + num_acked = + ngtcp2_rtb_recv_ack(&pktns->rtb, fr, &conn->cstat, conn, pktns, pkt_ts, ts); if (num_acked < 0) { assert(ngtcp2_err_is_fatal((int)num_acked)); return (int)num_acked; @@ -5351,7 +5363,7 @@ static int conn_recv_ack(ngtcp2_conn *conn, ngtcp2_pktns *pktns, ngtcp2_ack *fr, (conn->server || (conn->flags & NGTCP2_CONN_FLAG_SERVER_ADDR_VERIFIED))) { /* Reset PTO count but no less than 2 to avoid frequent probe packet transmission. */ - cstat->pto_count = ngtcp2_min(cstat->pto_count, 2); + cstat->pto_count = ngtcp2_min_size(cstat->pto_count, 2); } ngtcp2_conn_set_loss_detection_timer(conn, ts); @@ -5366,7 +5378,7 @@ static int conn_recv_ack(ngtcp2_conn *conn, ngtcp2_pktns *pktns, ngtcp2_ack *fr, static void assign_recved_ack_delay_unscaled(ngtcp2_ack *fr, uint64_t ack_delay_exponent) { fr->ack_delay_unscaled = - fr->ack_delay * (1ULL << ack_delay_exponent) * NGTCP2_MICROSECONDS; + fr->ack_delay * (1ULL << ack_delay_exponent) * NGTCP2_MICROSECONDS; } /* @@ -5467,7 +5479,7 @@ static int conn_recv_max_stream_data(ngtcp2_conn *conn, * conn_recv_max_data processes received MAX_DATA frame |fr|. */ static void conn_recv_max_data(ngtcp2_conn *conn, const ngtcp2_max_data *fr) { - conn->tx.max_offset = ngtcp2_max(conn->tx.max_offset, fr->max_data); + conn->tx.max_offset = ngtcp2_max_uint64(conn->tx.max_offset, fr->max_data); } /* @@ -5496,7 +5508,7 @@ static int conn_buffer_pkt(ngtcp2_conn *conn, ngtcp2_pktns *pktns, } rv = - ngtcp2_pkt_chain_new(&pc, path, pi, pkt, pktlen, dgramlen, ts, conn->mem); + ngtcp2_pkt_chain_new(&pc, path, pi, pkt, pktlen, dgramlen, ts, conn->mem); if (rv != 0) { return rv; } @@ -5695,8 +5707,8 @@ conn_emit_pending_crypto_data(ngtcp2_conn *conn, offset = rx_offset; rx_offset += datalen; - rv = conn_call_recv_crypto_data(conn, encryption_level, offset, data, - datalen); + rv = + conn_call_recv_crypto_data(conn, encryption_level, offset, data, datalen); if (rv != 0) { return rv; } @@ -5735,7 +5747,7 @@ static int conn_recv_connection_close(ngtcp2_conn *conn, } } - ccerr->reasonlen = ngtcp2_min(fr->reasonlen, NGTCP2_CCERR_MAX_REASONLEN); + ccerr->reasonlen = ngtcp2_min_size(fr->reasonlen, NGTCP2_CCERR_MAX_REASONLEN); ngtcp2_cpymem((uint8_t *)ccerr->reason, fr->reason, ccerr->reasonlen); return 0; @@ -5907,9 +5919,9 @@ static int pktns_commit_recv_pkt_num(ngtcp2_pktns *pktns, int64_t pkt_num, if (pktns->rx.max_ack_eliciting_pkt_num != -1) { if (pkt_num < pktns->rx.max_ack_eliciting_pkt_num) { ngtcp2_acktr_immediate_ack(&pktns->acktr); - } else if (pkt_num > pktns->rx.max_ack_eliciting_pkt_num) { + } else if (pkt_num != pktns->rx.max_ack_eliciting_pkt_num + 1) { r = ngtcp2_gaptr_get_first_gap_after( - &pktns->rx.pngap, (uint64_t)pktns->rx.max_ack_eliciting_pkt_num); + &pktns->rx.pngap, (uint64_t)pktns->rx.max_ack_eliciting_pkt_num); if (r.begin < (uint64_t)pkt_num) { ngtcp2_acktr_immediate_ack(&pktns->acktr); @@ -5977,7 +5989,7 @@ static int vneg_available_versions_includes(const uint8_t *available_versions, } for (i = 0; i < available_versionslen; i += sizeof(uint32_t)) { - available_versions = ngtcp2_get_uint32(&v, available_versions); + available_versions = ngtcp2_get_uint32be(&v, available_versions); if (version == v) { return 1; @@ -6097,6 +6109,7 @@ conn_recv_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, ngtcp2_strm *crypto; ngtcp2_encryption_level encryption_level; int invalid_reserved_bits = 0; + size_t num_ack_processed = 0; if (pktlen == 0) { return 0; @@ -6116,8 +6129,8 @@ conn_recv_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_CON, "buffering 1RTT packet len=%zu", pktlen); - rv = conn_buffer_pkt(conn, &conn->pktns, path, pi, pkt, pktlen, dgramlen, - ts); + rv = + conn_buffer_pkt(conn, &conn->pktns, path, pi, pkt, pktlen, dgramlen, ts); if (rv != 0) { assert(ngtcp2_err_is_fatal(rv)); return rv; @@ -6158,8 +6171,8 @@ conn_recv_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, "packet was ignored because of mismatched SCID"); return NGTCP2_ERR_DISCARD_PKT; } - rv = conn_on_version_negotiation(conn, &hd, pkt + hdpktlen, - pktlen - hdpktlen); + rv = + conn_on_version_negotiation(conn, &hd, pkt + hdpktlen, pktlen - hdpktlen); if (rv != 0) { if (ngtcp2_err_is_fatal(rv)) { return rv; @@ -6250,7 +6263,7 @@ conn_recv_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, ngtcp2_ssize nread2; /* TODO Avoid to parse header twice. */ nread2 = - conn_recv_pkt(conn, path, pi, pkt, pktlen, dgramlen, pkt_ts, ts); + conn_recv_pkt(conn, path, pi, pkt, pktlen, dgramlen, pkt_ts, ts); if (nread2 < 0) { return nread2; } @@ -6275,8 +6288,8 @@ conn_recv_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, case NGTCP2_PKT_INITIAL: if (!conn->in_pktns) { ngtcp2_log_info( - &conn->log, NGTCP2_LOG_EVENT_PKT, - "Initial packet is discarded because keys have been discarded"); + &conn->log, NGTCP2_LOG_EVENT_PKT, + "Initial packet is discarded because keys have been discarded"); return (ngtcp2_ssize)pktlen; } @@ -6285,10 +6298,10 @@ conn_recv_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, if (conn->server) { if (dgramlen < NGTCP2_MAX_UDP_PAYLOAD_SIZE) { ngtcp2_log_info( - &conn->log, NGTCP2_LOG_EVENT_PKT, - "Initial packet was ignored because it is included in UDP datagram " - "less than %zu bytes: %zu bytes", - NGTCP2_MAX_UDP_PAYLOAD_SIZE, dgramlen); + &conn->log, NGTCP2_LOG_EVENT_PKT, + "Initial packet was ignored because it is included in UDP datagram " + "less than %zu bytes: %zu bytes", + NGTCP2_MAX_UDP_PAYLOAD_SIZE, dgramlen); return NGTCP2_ERR_DISCARD_PKT; } if (conn->local.settings.tokenlen) { @@ -6329,10 +6342,9 @@ conn_recv_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, /* Install new Initial keys using QUIC version = hd.version */ rv = conn_call_version_negotiation( - conn, hd.version, - (conn->flags & NGTCP2_CONN_FLAG_RECV_RETRY) - ? &conn->dcid.current.cid - : &conn->rcid); + conn, hd.version, + (conn->flags & NGTCP2_CONN_FLAG_RECV_RETRY) ? &conn->dcid.current.cid + : &conn->rcid); if (rv != 0) { return rv; } @@ -6364,8 +6376,8 @@ conn_recv_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, if (!conn->hs_pktns->crypto.rx.ckm) { if (conn->server) { ngtcp2_log_info( - &conn->log, NGTCP2_LOG_EVENT_PKT, - "Handshake packet at this point is unexpected and discarded"); + &conn->log, NGTCP2_LOG_EVENT_PKT, + "Handshake packet at this point is unexpected and discarded"); return (ngtcp2_ssize)pktlen; } ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_CON, @@ -6420,8 +6432,8 @@ conn_recv_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, payload = pkt + hdpktlen; payloadlen = hd.len - hd.pkt_numlen; - hd.pkt_num = ngtcp2_pkt_adjust_pkt_num(pktns->rx.max_pkt_num, hd.pkt_num, - hd.pkt_numlen); + hd.pkt_num = + ngtcp2_pkt_adjust_pkt_num(pktns->rx.max_pkt_num, hd.pkt_num, hd.pkt_numlen); if (hd.pkt_num > NGTCP2_MAX_PKT_NUM) { ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_PKT, "pkn=%" PRId64 " is greater than maximum pkn", hd.pkt_num); @@ -6542,6 +6554,13 @@ conn_recv_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, case NGTCP2_FRAME_ACK_ECN: fr->ack.ack_delay = 0; fr->ack.ack_delay_unscaled = 0; + + rv = + ngtcp2_pkt_validate_ack(&fr->ack, conn->local.settings.initial_pkt_num); + if (rv != 0) { + return rv; + } + break; } @@ -6550,6 +6569,9 @@ conn_recv_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, switch (fr->type) { case NGTCP2_FRAME_ACK: case NGTCP2_FRAME_ACK_ECN: + if (num_ack_processed >= NGTCP2_MAX_ACK_PER_PKT) { + break; + } if (!conn->server && hd.type == NGTCP2_PKT_HANDSHAKE) { conn->flags |= NGTCP2_CONN_FLAG_SERVER_ADDR_VERIFIED; } @@ -6557,6 +6579,7 @@ conn_recv_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, if (rv != 0) { return rv; } + ++num_ack_processed; break; case NGTCP2_FRAME_PADDING: break; @@ -6609,8 +6632,8 @@ conn_recv_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, /* Initial and Handshake are always acknowledged without delay. No need to call ngtcp2_acktr_immediate_ack(). */ - rv = ngtcp2_conn_sched_ack(conn, &pktns->acktr, hd.pkt_num, require_ack, - pkt_ts); + rv = + ngtcp2_conn_sched_ack(conn, &pktns->acktr, hd.pkt_num, require_ack, pkt_ts); if (rv != 0) { return rv; } @@ -6661,7 +6684,7 @@ static ngtcp2_ssize conn_recv_handshake_cpkt(ngtcp2_conn *conn, while (pktlen) { nread = - conn_recv_handshake_pkt(conn, path, pi, pkt, pktlen, dgramlen, ts, ts); + conn_recv_handshake_pkt(conn, path, pi, pkt, pktlen, dgramlen, ts, ts); if (nread < 0) { if (ngtcp2_err_is_fatal((int)nread)) { return nread; @@ -6673,7 +6696,7 @@ static ngtcp2_ssize conn_recv_handshake_cpkt(ngtcp2_conn *conn, if ((pkt[0] & NGTCP2_HEADER_FORM_BIT) && pktlen > 4) { /* Not a Version Negotiation packet */ - ngtcp2_get_uint32(&version, &pkt[1]); + ngtcp2_get_uint32be(&version, &pkt[1]); if (ngtcp2_pkt_get_type_long(version, pkt[0]) == NGTCP2_PKT_INITIAL) { if (conn->server) { if (is_unrecoverable_error((int)nread)) { @@ -6738,14 +6761,14 @@ int ngtcp2_conn_init_stream(ngtcp2_conn *conn, ngtcp2_strm *strm, if (bidi_stream(stream_id)) { if (local_stream) { max_rx_offset = - conn->local.transport_params.initial_max_stream_data_bidi_local; + conn->local.transport_params.initial_max_stream_data_bidi_local; max_tx_offset = - conn->remote.transport_params->initial_max_stream_data_bidi_remote; + conn->remote.transport_params->initial_max_stream_data_bidi_remote; } else { max_rx_offset = - conn->local.transport_params.initial_max_stream_data_bidi_remote; + conn->local.transport_params.initial_max_stream_data_bidi_remote; max_tx_offset = - conn->remote.transport_params->initial_max_stream_data_bidi_local; + conn->remote.transport_params->initial_max_stream_data_bidi_local; } } else if (local_stream) { max_rx_offset = 0; @@ -6759,8 +6782,8 @@ int ngtcp2_conn_init_stream(ngtcp2_conn *conn, ngtcp2_strm *strm, max_tx_offset, stream_user_data, &conn->frc_objalloc, conn->mem); - rv = ngtcp2_map_insert(&conn->strms, (ngtcp2_map_key_type)strm->stream_id, - strm); + rv = + ngtcp2_map_insert(&conn->strms, (ngtcp2_map_key_type)strm->stream_id, strm); if (rv != 0) { assert(rv != NGTCP2_ERR_INVALID_ARGUMENT); goto fail; @@ -6833,6 +6856,12 @@ static int conn_emit_pending_stream_data(ngtcp2_conn *conn, ngtcp2_strm *strm, return rv; } + /* ngtcp2_conn_shutdown_stream_read from a callback will free + strm->rx.rob. */ + if (!strm->rx.rob) { + return 0; + } + ngtcp2_rob_pop(strm->rx.rob, rx_offset - datalen, datalen); } } @@ -6901,7 +6930,8 @@ static int conn_recv_crypto(ngtcp2_conn *conn, return 0; } - crypto->rx.last_offset = ngtcp2_max(crypto->rx.last_offset, fr_end_offset); + crypto->rx.last_offset = + ngtcp2_max_uint64(crypto->rx.last_offset, fr_end_offset); /* TODO Before dispatching incoming data to TLS stack, make sure that previous data in previous encryption level has been @@ -6917,14 +6947,14 @@ static int conn_recv_crypto(ngtcp2_conn *conn, rx_offset += datalen; ngtcp2_strm_update_rx_offset(crypto, rx_offset); - rv = conn_call_recv_crypto_data(conn, encryption_level, offset, data, - datalen); + rv = + conn_call_recv_crypto_data(conn, encryption_level, offset, data, datalen); if (rv != 0) { return rv; } - rv = conn_emit_pending_crypto_data(conn, encryption_level, crypto, - rx_offset); + rv = + conn_emit_pending_crypto_data(conn, encryption_level, crypto, rx_offset); if (rv != 0) { return rv; } @@ -7100,7 +7130,8 @@ static int conn_recv_stream(ngtcp2_conn *conn, const ngtcp2_stream *fr) { return NGTCP2_ERR_FINAL_SIZE; } - strm->rx.last_offset = ngtcp2_max(strm->rx.last_offset, fr_end_offset); + strm->rx.last_offset = + ngtcp2_max_uint64(strm->rx.last_offset, fr_end_offset); if (fr_end_offset <= rx_offset) { return 0; @@ -7220,9 +7251,9 @@ handle_max_remote_streams_extension(uint64_t *punsent_max_remote_streams, size_t n) { if ( #if SIZE_MAX > UINT32_MAX - NGTCP2_MAX_STREAMS < n || + NGTCP2_MAX_STREAMS < n || #endif /* SIZE_MAX > UINT32_MAX */ - *punsent_max_remote_streams > (uint64_t)(NGTCP2_MAX_STREAMS - n)) { + *punsent_max_remote_streams > (uint64_t)(NGTCP2_MAX_STREAMS - n)) { *punsent_max_remote_streams = NGTCP2_MAX_STREAMS; } else { *punsent_max_remote_streams += n; @@ -7360,7 +7391,7 @@ static int conn_recv_reset_stream(ngtcp2_conn *conn, which are not passed to application. */ if (!(strm->flags & NGTCP2_STRM_FLAG_STOP_SENDING)) { ngtcp2_conn_extend_max_offset(conn, strm->rx.last_offset - - ngtcp2_strm_rx_offset(strm)); + ngtcp2_strm_rx_offset(strm)); } conn->rx.offset += datalen; @@ -7368,7 +7399,7 @@ static int conn_recv_reset_stream(ngtcp2_conn *conn, strm->rx.last_offset = fr->final_size; strm->flags |= - NGTCP2_STRM_FLAG_SHUT_RD | NGTCP2_STRM_FLAG_RESET_STREAM_RECVED; + NGTCP2_STRM_FLAG_SHUT_RD | NGTCP2_STRM_FLAG_RESET_STREAM_RECVED; ngtcp2_strm_set_app_error_code(strm, fr->app_error_code); @@ -7471,7 +7502,7 @@ static int conn_recv_stop_sending(ngtcp2_conn *conn, } strm->flags |= - NGTCP2_STRM_FLAG_SHUT_WR | NGTCP2_STRM_FLAG_STOP_SENDING_RECVED; + NGTCP2_STRM_FLAG_SHUT_WR | NGTCP2_STRM_FLAG_STOP_SENDING_RECVED; ngtcp2_strm_streamfrq_clear(strm); @@ -7487,7 +7518,7 @@ static int check_stateless_reset(const ngtcp2_dcid *dcid, const ngtcp2_pkt_stateless_reset *sr) { return ngtcp2_path_eq(&dcid->ps.path, path) && ngtcp2_dcid_verify_stateless_reset_token( - dcid, sr->stateless_reset_token) == 0; + dcid, sr->stateless_reset_token) == 0; } /* @@ -7576,7 +7607,7 @@ static int conn_recv_max_streams(ngtcp2_conn *conn, return NGTCP2_ERR_FRAME_ENCODING; } - n = ngtcp2_min(fr->max_streams, NGTCP2_MAX_STREAMS); + n = ngtcp2_min_uint64(fr->max_streams, NGTCP2_MAX_STREAMS); if (fr->type == NGTCP2_FRAME_MAX_STREAMS_BIDI) { if (conn->local.bidi.max_streams < n) { @@ -8221,7 +8252,7 @@ static int conn_recv_handshake_done(ngtcp2_conn *conn, ngtcp2_tstamp ts) { conn->pktns.rtb.persistent_congestion_start_ts = ts; - conn_discard_handshake_state(conn, ts); + ngtcp2_conn_discard_handshake_state(conn, ts); assert(conn->remote.transport_params); @@ -8323,9 +8354,9 @@ static int conn_prepare_key_update(ngtcp2_conn *conn, ngtcp2_tstamp ts) { new_tx_ckm = conn->crypto.key_update.new_tx_ckm; rv = conn_call_update_key( - conn, new_rx_ckm->secret.base, new_tx_ckm->secret.base, &rx_aead_ctx, - new_rx_ckm->iv.base, &tx_aead_ctx, new_tx_ckm->iv.base, - rx_ckm->secret.base, tx_ckm->secret.base, secretlen); + conn, new_rx_ckm->secret.base, new_tx_ckm->secret.base, &rx_aead_ctx, + new_rx_ckm->iv.base, &tx_aead_ctx, new_tx_ckm->iv.base, rx_ckm->secret.base, + tx_ckm->secret.base, secretlen); if (rv != 0) { return rv; } @@ -8340,7 +8371,7 @@ static int conn_prepare_key_update(ngtcp2_conn *conn, ngtcp2_tstamp ts) { if (conn->crypto.key_update.old_rx_ckm) { conn_call_delete_crypto_aead_ctx( - conn, &conn->crypto.key_update.old_rx_ckm->aead_ctx); + conn, &conn->crypto.key_update.old_rx_ckm->aead_ctx); ngtcp2_crypto_km_del(conn->crypto.key_update.old_rx_ckm, conn->mem); conn->crypto.key_update.old_rx_ckm = NULL; } @@ -8412,7 +8443,6 @@ static int conn_recv_non_probing_pkt_on_new_path(ngtcp2_conn *conn, size_t dgramlen, int new_cid_used, ngtcp2_tstamp ts) { - ngtcp2_dcid dcid, *bound_dcid, *last; ngtcp2_pv *pv; int rv; @@ -8448,9 +8478,9 @@ static int conn_recv_non_probing_pkt_on_new_path(ngtcp2_conn *conn, } remote_addr_cmp = - ngtcp2_addr_compare(&conn->dcid.current.ps.path.remote, &path->remote); + ngtcp2_addr_compare(&conn->dcid.current.ps.path.remote, &path->remote); local_addr_eq = - ngtcp2_addr_eq(&conn->dcid.current.ps.path.local, &path->local); + ngtcp2_addr_eq(&conn->dcid.current.ps.path.local, &path->local); /* * When to change DCID? RFC 9002 section 9.5 says: @@ -8480,8 +8510,8 @@ static int conn_recv_non_probing_pkt_on_new_path(ngtcp2_conn *conn, bound_dcid = ngtcp2_ringbuf_get(&conn->dcid.bound.rb, i); if (ngtcp2_path_eq(&bound_dcid->ps.path, path)) { ngtcp2_log_info( - &conn->log, NGTCP2_LOG_EVENT_CON, - "Found DCID which has already been bound to the new path"); + &conn->log, NGTCP2_LOG_EVENT_CON, + "Found DCID which has already been bound to the new path"); ngtcp2_dcid_copy(&dcid, bound_dcid); if (i == 0) { @@ -8550,21 +8580,21 @@ static int conn_recv_non_probing_pkt_on_new_path(ngtcp2_conn *conn, pv->fallback_pto = pto; } + ngtcp2_dcid_copy(&conn->dcid.current, &dcid); + if (!local_addr_eq || (remote_addr_cmp & (NGTCP2_ADDR_COMPARE_FLAG_ADDR | NGTCP2_ADDR_COMPARE_FLAG_FAMILY))) { conn_reset_congestion_state(conn, ts); } - ngtcp2_dcid_copy(&conn->dcid.current, &dcid); - conn_reset_ecn_validation_state(conn); ngtcp2_conn_stop_pmtud(conn); if (conn->pv) { ngtcp2_log_info( - &conn->log, NGTCP2_LOG_EVENT_PTV, - "path migration is aborted because new migration has started"); + &conn->log, NGTCP2_LOG_EVENT_PTV, + "path migration is aborted because new migration has started"); rv = conn_abort_pv(conn, ts); if (rv != 0) { return rv; @@ -8658,6 +8688,7 @@ conn_recv_delayed_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_pkt_info *pi, int rv; int require_ack = 0; ngtcp2_pktns *pktns; + size_t num_ack_processed = 0; assert(hd->type == NGTCP2_PKT_HANDSHAKE); @@ -8684,6 +8715,13 @@ conn_recv_delayed_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_pkt_info *pi, case NGTCP2_FRAME_ACK_ECN: fr->ack.ack_delay = 0; fr->ack.ack_delay_unscaled = 0; + + rv = + ngtcp2_pkt_validate_ack(&fr->ack, conn->local.settings.initial_pkt_num); + if (rv != 0) { + return rv; + } + break; } @@ -8692,6 +8730,9 @@ conn_recv_delayed_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_pkt_info *pi, switch (fr->type) { case NGTCP2_FRAME_ACK: case NGTCP2_FRAME_ACK_ECN: + if (num_ack_processed >= NGTCP2_MAX_ACK_PER_PKT) { + break; + } if (!conn->server) { conn->flags |= NGTCP2_CONN_FLAG_SERVER_ADDR_VERIFIED; } @@ -8699,6 +8740,7 @@ conn_recv_delayed_handshake_pkt(ngtcp2_conn *conn, const ngtcp2_pkt_info *pi, if (rv != 0) { return rv; } + ++num_ack_processed; break; case NGTCP2_FRAME_PADDING: break; @@ -8762,7 +8804,7 @@ conn_allow_path_change_under_disable_active_migration(ngtcp2_conn *conn, (NAT rebinding). */ if (ngtcp2_addr_eq(&conn->dcid.current.ps.path.local, &path->local)) { remote_addr_cmp = - ngtcp2_addr_compare(&conn->dcid.current.ps.path.remote, &path->remote); + ngtcp2_addr_compare(&conn->dcid.current.ps.path.remote, &path->remote); return (remote_addr_cmp | NGTCP2_ADDR_COMPARE_FLAG_PORT) == NGTCP2_ADDR_COMPARE_FLAG_PORT; @@ -8860,6 +8902,7 @@ static ngtcp2_ssize conn_recv_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, int recv_ncid = 0; int new_cid_used = 0; int path_challenge_recved = 0; + size_t num_ack_processed = 0; if (conn->server && conn->local.transport_params.disable_active_migration && !ngtcp2_path_eq(&conn->dcid.current.ps.path, path) && @@ -8992,8 +9035,8 @@ static ngtcp2_ssize conn_recv_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, payload = pkt + hdpktlen; payloadlen = pktlen - hdpktlen; - hd.pkt_num = ngtcp2_pkt_adjust_pkt_num(pktns->rx.max_pkt_num, hd.pkt_num, - hd.pkt_numlen); + hd.pkt_num = + ngtcp2_pkt_adjust_pkt_num(pktns->rx.max_pkt_num, hd.pkt_num, hd.pkt_numlen); if (hd.pkt_num > NGTCP2_MAX_PKT_NUM) { ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_PKT, "pkn=%" PRId64 " is greater than maximum pkn", hd.pkt_num); @@ -9057,7 +9100,7 @@ static ngtcp2_ssize conn_recv_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, if (hd.type == NGTCP2_PKT_1RTT && ++conn->crypto.decryption_failure_count >= - pktns->crypto.ctx.max_decryption_failure) { + pktns->crypto.ctx.max_decryption_failure) { return NGTCP2_ERR_AEAD_LIMIT_REACHED; } @@ -9163,7 +9206,14 @@ static ngtcp2_ssize conn_recv_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, } assert(conn->remote.transport_params); assign_recved_ack_delay_unscaled( - &fr->ack, conn->remote.transport_params->ack_delay_exponent); + &fr->ack, conn->remote.transport_params->ack_delay_exponent); + + rv = + ngtcp2_pkt_validate_ack(&fr->ack, conn->local.settings.initial_pkt_num); + if (rv != 0) { + return rv; + } + break; } @@ -9210,6 +9260,9 @@ static ngtcp2_ssize conn_recv_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, switch (fr->type) { case NGTCP2_FRAME_ACK: case NGTCP2_FRAME_ACK_ECN: + if (num_ack_processed >= NGTCP2_MAX_ACK_PER_PKT) { + break; + } if (!conn->server) { conn->flags |= NGTCP2_CONN_FLAG_SERVER_ADDR_VERIFIED; } @@ -9218,6 +9271,7 @@ static ngtcp2_ssize conn_recv_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, return rv; } non_probing_pkt = 1; + ++num_ack_processed; break; case NGTCP2_FRAME_STREAM: rv = conn_recv_stream(conn, &fr->stream); @@ -9429,8 +9483,8 @@ static ngtcp2_ssize conn_recv_pkt(ngtcp2_conn *conn, const ngtcp2_path *path, ngtcp2_acktr_immediate_ack(&pktns->acktr); } - rv = ngtcp2_conn_sched_ack(conn, &pktns->acktr, hd.pkt_num, require_ack, - pkt_ts); + rv = + ngtcp2_conn_sched_ack(conn, &pktns->acktr, hd.pkt_num, require_ack, pkt_ts); if (rv != 0) { return rv; } @@ -9602,8 +9656,8 @@ static int conn_handshake_completed(ngtcp2_conn *conn) { } } if (conn->local.uni.max_streams > 0) { - rv = conn_call_extend_max_local_streams_uni(conn, - conn->local.uni.max_streams); + rv = + conn_call_extend_max_local_streams_uni(conn, conn->local.uni.max_streams); if (rv != 0) { return rv; } @@ -9822,7 +9876,7 @@ static ngtcp2_ssize conn_read_handshake(ngtcp2_conn *conn, } if (conn->hs_pktns->rx.max_pkt_num != -1) { - conn_discard_initial_state(conn, ts); + ngtcp2_conn_discard_initial_state(conn, ts); } if (!conn_is_tls_handshake_completed(conn)) { @@ -9888,7 +9942,7 @@ static ngtcp2_ssize conn_read_handshake(ngtcp2_conn *conn, return rv; } - conn_discard_handshake_state(conn, ts); + ngtcp2_conn_discard_handshake_state(conn, ts); rv = conn_enqueue_handshake_done(conn); if (rv != 0) { @@ -9936,7 +9990,7 @@ int ngtcp2_conn_read_pkt_versioned(ngtcp2_conn *conn, const ngtcp2_path *path, pktlen); if (pktlen == 0) { - return NGTCP2_ERR_INVALID_ARGUMENT; + return 0; } /* client does not expect a packet from unknown path. */ @@ -10035,13 +10089,12 @@ static int conn_check_pkt_num_exhausted(ngtcp2_conn *conn) { * conn_retransmit_retry_early retransmits 0RTT packet after Retry is * received from server. */ -static ngtcp2_ssize conn_retransmit_retry_early(ngtcp2_conn *conn, - ngtcp2_pkt_info *pi, - uint8_t *dest, size_t destlen, - uint8_t flags, - ngtcp2_tstamp ts) { - return conn_write_pkt(conn, pi, dest, destlen, NULL, NGTCP2_PKT_0RTT, flags, - ts); +static ngtcp2_ssize +conn_retransmit_retry_early(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, + uint8_t *dest, size_t destlen, size_t dgram_offset, + uint8_t flags, ngtcp2_tstamp ts) { + return conn_write_pkt(conn, pi, dest, destlen, dgram_offset, NULL, + NGTCP2_PKT_0RTT, flags, ts); } /* @@ -10067,21 +10120,21 @@ static int conn_validate_early_transport_params_limits(ngtcp2_conn *conn) { assert(params); if (conn->early.transport_params.active_connection_id_limit > - params->active_connection_id_limit || + params->active_connection_id_limit || conn->early.transport_params.initial_max_data > - params->initial_max_data || + params->initial_max_data || conn->early.transport_params.initial_max_stream_data_bidi_local > - params->initial_max_stream_data_bidi_local || + params->initial_max_stream_data_bidi_local || conn->early.transport_params.initial_max_stream_data_bidi_remote > - params->initial_max_stream_data_bidi_remote || + params->initial_max_stream_data_bidi_remote || conn->early.transport_params.initial_max_stream_data_uni > - params->initial_max_stream_data_uni || + params->initial_max_stream_data_uni || conn->early.transport_params.initial_max_streams_bidi > - params->initial_max_streams_bidi || + params->initial_max_streams_bidi || conn->early.transport_params.initial_max_streams_uni > - params->initial_max_streams_uni || + params->initial_max_streams_uni || conn->early.transport_params.max_datagram_frame_size > - params->max_datagram_frame_size) { + params->max_datagram_frame_size) { return NGTCP2_ERR_PROTO; } @@ -10131,14 +10184,14 @@ static ngtcp2_ssize conn_write_handshake(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, if (!(conn->flags & NGTCP2_CONN_FLAG_RECV_RETRY)) { nwrite = - conn_write_client_initial(conn, pi, dest, destlen, write_datalen, ts); + conn_write_client_initial(conn, pi, dest, destlen, write_datalen, ts); if (nwrite <= 0) { return nwrite; } } else { - nwrite = conn_write_handshake_pkt( - conn, pi, dest, destlen, NGTCP2_PKT_INITIAL, - NGTCP2_WRITE_PKT_FLAG_NONE, write_datalen, ts); + nwrite = + conn_write_handshake_pkt(conn, pi, dest, destlen, 0, NGTCP2_PKT_INITIAL, + NGTCP2_WRITE_PKT_FLAG_NONE, write_datalen, ts); if (nwrite < 0) { return nwrite; } @@ -10146,10 +10199,10 @@ static ngtcp2_ssize conn_write_handshake(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, if (pending_early_datalen) { early_spktlen = conn_retransmit_retry_early( - conn, pi, dest + nwrite, destlen - (size_t)nwrite, - nwrite ? NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING - : NGTCP2_WRITE_PKT_FLAG_NONE, - ts); + conn, pi, dest + nwrite, destlen - (size_t)nwrite, (size_t)nwrite, + nwrite ? NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING + : NGTCP2_WRITE_PKT_FLAG_NONE, + ts); if (early_spktlen < 0) { assert(ngtcp2_err_is_fatal((int)early_spktlen)); @@ -10163,6 +10216,8 @@ static ngtcp2_ssize conn_write_handshake(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, return res; case NGTCP2_CS_CLIENT_WAIT_HANDSHAKE: + pending_early_datalen = 0; + if (!conn_handshake_probe_left(conn) && conn_cwnd_is_zero(conn)) { destlen = 0; } else { @@ -10174,7 +10229,7 @@ static ngtcp2_ssize conn_write_handshake(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, } nwrite = - conn_write_handshake_pkts(conn, pi, dest, destlen, write_datalen, ts); + conn_write_handshake_pkts(conn, pi, dest, destlen, write_datalen, ts); if (nwrite < 0) { return nwrite; } @@ -10185,9 +10240,10 @@ static ngtcp2_ssize conn_write_handshake(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, } if (!conn_is_tls_handshake_completed(conn)) { - if (!(conn->flags & NGTCP2_CONN_FLAG_EARLY_DATA_REJECTED)) { - nwrite = conn_retransmit_retry_early(conn, pi, dest, destlen, - NGTCP2_WRITE_PKT_FLAG_NONE, ts); + if (pending_early_datalen && + !(conn->flags & NGTCP2_CONN_FLAG_EARLY_DATA_REJECTED)) { + nwrite = conn_retransmit_retry_early( + conn, pi, dest, destlen, (size_t)res, NGTCP2_WRITE_PKT_FLAG_NONE, ts); if (nwrite < 0) { return nwrite; } @@ -10250,8 +10306,8 @@ static ngtcp2_ssize conn_write_handshake(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, assert(conn->dcid.current.seq == 0); assert(!(conn->dcid.current.flags & NGTCP2_DCID_FLAG_TOKEN_PRESENT)); ngtcp2_dcid_set_token( - &conn->dcid.current, - conn->remote.transport_params->stateless_reset_token); + &conn->dcid.current, + conn->remote.transport_params->stateless_reset_token); } rv = conn_call_activate_dcid(conn, &conn->dcid.current); @@ -10271,7 +10327,7 @@ static ngtcp2_ssize conn_write_handshake(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, return res; case NGTCP2_CS_SERVER_INITIAL: nwrite = - conn_write_handshake_pkts(conn, pi, dest, destlen, write_datalen, ts); + conn_write_handshake_pkts(conn, pi, dest, destlen, write_datalen, ts); if (nwrite < 0) { return nwrite; } @@ -10284,7 +10340,7 @@ static ngtcp2_ssize conn_write_handshake(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, case NGTCP2_CS_SERVER_WAIT_HANDSHAKE: if (conn_handshake_probe_left(conn) || !conn_cwnd_is_zero(conn)) { nwrite = - conn_write_handshake_pkts(conn, pi, dest, destlen, write_datalen, ts); + conn_write_handshake_pkts(conn, pi, dest, destlen, write_datalen, ts); if (nwrite < 0) { return nwrite; } @@ -10363,8 +10419,8 @@ static ngtcp2_ssize conn_client_write_handshake(ngtcp2_conn *conn, datalen = ngtcp2_vec_len(vmsg->stream.data, vmsg->stream.datacnt); send_stream = conn_retry_early_payloadlen(conn) == 0; if (send_stream) { - write_datalen = ngtcp2_min(datalen + NGTCP2_STREAM_OVERHEAD, - NGTCP2_MIN_COALESCED_PAYLOADLEN); + write_datalen = ngtcp2_min_uint64(datalen + NGTCP2_STREAM_OVERHEAD, + NGTCP2_MIN_COALESCED_PAYLOADLEN); if (vmsg->stream.flags & NGTCP2_WRITE_STREAM_FLAG_MORE) { wflags |= NGTCP2_WRITE_PKT_FLAG_MORE; @@ -10428,8 +10484,8 @@ static ngtcp2_ssize conn_client_write_handshake(ngtcp2_conn *conn, return spktlen; } - early_spktlen = conn_write_pkt(conn, pi, dest, destlen, vmsg, NGTCP2_PKT_0RTT, - wflags, ts); + early_spktlen = conn_write_pkt(conn, pi, dest, destlen, (size_t)spktlen, vmsg, + NGTCP2_PKT_0RTT, wflags, ts); if (early_spktlen < 0) { switch (early_spktlen) { case NGTCP2_ERR_STREAM_DATA_BLOCKED: @@ -10520,10 +10576,10 @@ int ngtcp2_accept(ngtcp2_pkt_hd *dest, const uint8_t *pkt, size_t pktlen) { } int ngtcp2_conn_install_initial_key( - ngtcp2_conn *conn, const ngtcp2_crypto_aead_ctx *rx_aead_ctx, - const uint8_t *rx_iv, const ngtcp2_crypto_cipher_ctx *rx_hp_ctx, - const ngtcp2_crypto_aead_ctx *tx_aead_ctx, const uint8_t *tx_iv, - const ngtcp2_crypto_cipher_ctx *tx_hp_ctx, size_t ivlen) { + ngtcp2_conn *conn, const ngtcp2_crypto_aead_ctx *rx_aead_ctx, + const uint8_t *rx_iv, const ngtcp2_crypto_cipher_ctx *rx_hp_ctx, + const ngtcp2_crypto_aead_ctx *tx_aead_ctx, const uint8_t *tx_iv, + const ngtcp2_crypto_cipher_ctx *tx_hp_ctx, size_t ivlen) { ngtcp2_pktns *pktns = conn->in_pktns; int rv; @@ -10571,11 +10627,11 @@ int ngtcp2_conn_install_initial_key( } int ngtcp2_conn_install_vneg_initial_key( - ngtcp2_conn *conn, uint32_t version, - const ngtcp2_crypto_aead_ctx *rx_aead_ctx, const uint8_t *rx_iv, - const ngtcp2_crypto_cipher_ctx *rx_hp_ctx, - const ngtcp2_crypto_aead_ctx *tx_aead_ctx, const uint8_t *tx_iv, - const ngtcp2_crypto_cipher_ctx *tx_hp_ctx, size_t ivlen) { + ngtcp2_conn *conn, uint32_t version, + const ngtcp2_crypto_aead_ctx *rx_aead_ctx, const uint8_t *rx_iv, + const ngtcp2_crypto_cipher_ctx *rx_hp_ctx, + const ngtcp2_crypto_aead_ctx *tx_aead_ctx, const uint8_t *tx_iv, + const ngtcp2_crypto_cipher_ctx *tx_hp_ctx, size_t ivlen) { int rv; assert(ivlen >= 8); @@ -10622,8 +10678,8 @@ int ngtcp2_conn_install_vneg_initial_key( } int ngtcp2_conn_install_rx_handshake_key( - ngtcp2_conn *conn, const ngtcp2_crypto_aead_ctx *aead_ctx, - const uint8_t *iv, size_t ivlen, const ngtcp2_crypto_cipher_ctx *hp_ctx) { + ngtcp2_conn *conn, const ngtcp2_crypto_aead_ctx *aead_ctx, const uint8_t *iv, + size_t ivlen, const ngtcp2_crypto_cipher_ctx *hp_ctx) { ngtcp2_pktns *pktns = conn->hs_pktns; int rv; @@ -10654,8 +10710,8 @@ int ngtcp2_conn_install_rx_handshake_key( } int ngtcp2_conn_install_tx_handshake_key( - ngtcp2_conn *conn, const ngtcp2_crypto_aead_ctx *aead_ctx, - const uint8_t *iv, size_t ivlen, const ngtcp2_crypto_cipher_ctx *hp_ctx) { + ngtcp2_conn *conn, const ngtcp2_crypto_aead_ctx *aead_ctx, const uint8_t *iv, + size_t ivlen, const ngtcp2_crypto_cipher_ctx *hp_ctx) { ngtcp2_pktns *pktns = conn->hs_pktns; int rv; @@ -10905,7 +10961,7 @@ ngtcp2_tstamp ngtcp2_conn_loss_detection_expiry(ngtcp2_conn *conn) { } ngtcp2_tstamp ngtcp2_conn_internal_expiry(ngtcp2_conn *conn) { - ngtcp2_tstamp res = UINT64_MAX, t; + ngtcp2_tstamp res = UINT64_MAX; ngtcp2_duration pto = conn_compute_pto(conn, &conn->pktns); ngtcp2_scid *scid; ngtcp2_dcid *dcid; @@ -10916,21 +10972,19 @@ ngtcp2_tstamp ngtcp2_conn_internal_expiry(ngtcp2_conn *conn) { } if (conn->pmtud) { - res = ngtcp2_min(res, conn->pmtud->expiry); + res = ngtcp2_min_uint64(res, conn->pmtud->expiry); } if (!ngtcp2_pq_empty(&conn->scid.used)) { scid = ngtcp2_struct_of(ngtcp2_pq_top(&conn->scid.used), ngtcp2_scid, pe); if (scid->retired_ts != UINT64_MAX) { - t = scid->retired_ts + pto; - res = ngtcp2_min(res, t); + res = ngtcp2_min_uint64(res, scid->retired_ts + pto); } } if (ngtcp2_ringbuf_len(&conn->dcid.retired.rb)) { dcid = ngtcp2_ringbuf_get(&conn->dcid.retired.rb, 0); - t = dcid->retired_ts + pto; - res = ngtcp2_min(res, t); + res = ngtcp2_min_uint64(res, dcid->retired_ts + pto); } if (conn->dcid.current.cid.datalen) { @@ -10941,15 +10995,13 @@ ngtcp2_tstamp ngtcp2_conn_internal_expiry(ngtcp2_conn *conn) { assert(dcid->cid.datalen); assert(dcid->bound_ts != UINT64_MAX); - t = dcid->bound_ts + 3 * pto; - res = ngtcp2_min(res, t); + res = ngtcp2_min_uint64(res, dcid->bound_ts + 3 * pto); } } if (conn->server && conn->early.ckm && conn->early.discard_started_ts != UINT64_MAX) { - t = conn->early.discard_started_ts + 3 * pto; - res = ngtcp2_min(res, t); + res = ngtcp2_min_uint64(res, conn->early.discard_started_ts + 3 * pto); } return res; @@ -10969,7 +11021,7 @@ static ngtcp2_tstamp conn_handshake_expiry(ngtcp2_conn *conn) { if (conn_is_tls_handshake_completed(conn) || conn->local.settings.handshake_timeout == UINT64_MAX || conn->local.settings.initial_ts >= - UINT64_MAX - conn->local.settings.handshake_timeout) { + UINT64_MAX - conn->local.settings.handshake_timeout) { return UINT64_MAX; } @@ -10978,20 +11030,14 @@ static ngtcp2_tstamp conn_handshake_expiry(ngtcp2_conn *conn) { } ngtcp2_tstamp ngtcp2_conn_get_expiry(ngtcp2_conn *conn) { - ngtcp2_tstamp t1 = ngtcp2_conn_loss_detection_expiry(conn); - ngtcp2_tstamp t2 = ngtcp2_conn_ack_delay_expiry(conn); - ngtcp2_tstamp t3 = ngtcp2_conn_internal_expiry(conn); - ngtcp2_tstamp t4 = ngtcp2_conn_lost_pkt_expiry(conn); - ngtcp2_tstamp t5 = conn_keep_alive_expiry(conn); - ngtcp2_tstamp t6 = conn_handshake_expiry(conn); - ngtcp2_tstamp t7 = ngtcp2_conn_get_idle_expiry(conn); - ngtcp2_tstamp res = ngtcp2_min(t1, t2); - res = ngtcp2_min(res, t3); - res = ngtcp2_min(res, t4); - res = ngtcp2_min(res, t5); - res = ngtcp2_min(res, t6); - res = ngtcp2_min(res, t7); - return ngtcp2_min(res, conn->tx.pacing.next_ts); + ngtcp2_tstamp res = ngtcp2_min_uint64(ngtcp2_conn_loss_detection_expiry(conn), + ngtcp2_conn_ack_delay_expiry(conn)); + res = ngtcp2_min_uint64(res, ngtcp2_conn_internal_expiry(conn)); + res = ngtcp2_min_uint64(res, ngtcp2_conn_lost_pkt_expiry(conn)); + res = ngtcp2_min_uint64(res, conn_keep_alive_expiry(conn)); + res = ngtcp2_min_uint64(res, conn_handshake_expiry(conn)); + res = ngtcp2_min_uint64(res, ngtcp2_conn_get_idle_expiry(conn)); + return ngtcp2_min_uint64(res, conn->tx.pacing.next_ts); } int ngtcp2_conn_handle_expiry(ngtcp2_conn *conn, ngtcp2_tstamp ts) { @@ -11089,7 +11135,7 @@ ngtcp2_tstamp ngtcp2_conn_lost_pkt_expiry(ngtcp2_conn *conn) { ts = ngtcp2_rtb_lost_pkt_ts(&conn->in_pktns->rtb); if (ts != UINT64_MAX) { ts += conn_compute_pto(conn, conn->in_pktns); - res = ngtcp2_min(res, ts); + res = ngtcp2_min_uint64(res, ts); } } @@ -11097,14 +11143,14 @@ ngtcp2_tstamp ngtcp2_conn_lost_pkt_expiry(ngtcp2_conn *conn) { ts = ngtcp2_rtb_lost_pkt_ts(&conn->hs_pktns->rtb); if (ts != UINT64_MAX) { ts += conn_compute_pto(conn, conn->hs_pktns); - res = ngtcp2_min(res, ts); + res = ngtcp2_min_uint64(res, ts); } } ts = ngtcp2_rtb_lost_pkt_ts(&conn->pktns.rtb); if (ts != UINT64_MAX) { ts += conn_compute_pto(conn, &conn->pktns); - res = ngtcp2_min(res, ts); + res = ngtcp2_min_uint64(res, ts); } return res; @@ -11153,7 +11199,7 @@ static uint32_t select_preferred_version(const uint32_t *preferred_versions, } for (j = 0, p = available_versions; j < available_versionslen; j += sizeof(uint32_t)) { - p = ngtcp2_get_uint32(&v, p); + p = ngtcp2_get_uint32be(&v, p); if (preferred_versions[i] == v) { return v; @@ -11266,13 +11312,13 @@ ngtcp2_conn_server_negotiate_version(ngtcp2_conn *conn, assert(conn->client_chosen_version == version_info->chosen_version); return select_preferred_version( - conn->vneg.preferred_versions, conn->vneg.preferred_versionslen, - version_info->chosen_version, version_info->available_versions, - version_info->available_versionslen, version_info->chosen_version); + conn->vneg.preferred_versions, conn->vneg.preferred_versionslen, + version_info->chosen_version, version_info->available_versions, + version_info->available_versionslen, version_info->chosen_version); } int ngtcp2_conn_set_remote_transport_params( - ngtcp2_conn *conn, const ngtcp2_transport_params *params) { + ngtcp2_conn *conn, const ngtcp2_transport_params *params) { int rv; /* We expect this function is called once per QUIC connection, but @@ -11315,9 +11361,9 @@ int ngtcp2_conn_set_remote_transport_params( if (params->version_info_present) { if (!vneg_available_versions_includes( - params->version_info.available_versions, - params->version_info.available_versionslen, - params->version_info.chosen_version)) { + params->version_info.available_versions, + params->version_info.available_versionslen, + params->version_info.chosen_version)) { return NGTCP2_ERR_TRANSPORT_PARAM; } @@ -11326,7 +11372,7 @@ int ngtcp2_conn_set_remote_transport_params( } conn->negotiated_version = - ngtcp2_conn_server_negotiate_version(conn, ¶ms->version_info); + ngtcp2_conn_server_negotiate_version(conn, ¶ms->version_info); if (conn->negotiated_version != conn->client_chosen_version) { rv = conn_call_version_negotiation(conn, conn->negotiated_version, &conn->rcid); @@ -11339,7 +11385,7 @@ int ngtcp2_conn_set_remote_transport_params( } conn->local.transport_params.version_info.chosen_version = - conn->negotiated_version; + conn->negotiated_version; ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_CON, "the negotiated version is 0x%08x", @@ -11372,7 +11418,7 @@ int ngtcp2_conn_set_remote_transport_params( assert(!conn->remote.pending_transport_params); rv = ngtcp2_transport_params_copy_new( - &conn->remote.pending_transport_params, params, conn->mem); + &conn->remote.pending_transport_params, params, conn->mem); if (rv != 0) { return rv; } @@ -11424,9 +11470,9 @@ ngtcp2_ssize ngtcp2_conn_encode_0rtt_transport_params(ngtcp2_conn *conn, params.initial_max_streams_bidi = src->initial_max_streams_bidi; params.initial_max_streams_uni = src->initial_max_streams_uni; params.initial_max_stream_data_bidi_local = - src->initial_max_stream_data_bidi_local; + src->initial_max_stream_data_bidi_local; params.initial_max_stream_data_bidi_remote = - src->initial_max_stream_data_bidi_remote; + src->initial_max_stream_data_bidi_remote; params.initial_max_stream_data_uni = src->initial_max_stream_data_uni; params.initial_max_data = src->initial_max_data; params.active_connection_id_limit = src->active_connection_id_limit; @@ -11456,7 +11502,7 @@ int ngtcp2_conn_decode_and_set_0rtt_transport_params(ngtcp2_conn *conn, } int ngtcp2_conn_set_0rtt_remote_transport_params( - ngtcp2_conn *conn, const ngtcp2_transport_params *params) { + ngtcp2_conn *conn, const ngtcp2_transport_params *params) { ngtcp2_transport_params *p; assert(!conn->server); @@ -11475,41 +11521,41 @@ int ngtcp2_conn_set_0rtt_remote_transport_params( p->initial_max_streams_bidi = params->initial_max_streams_bidi; p->initial_max_streams_uni = params->initial_max_streams_uni; p->initial_max_stream_data_bidi_local = - params->initial_max_stream_data_bidi_local; + params->initial_max_stream_data_bidi_local; p->initial_max_stream_data_bidi_remote = - params->initial_max_stream_data_bidi_remote; + params->initial_max_stream_data_bidi_remote; p->initial_max_stream_data_uni = params->initial_max_stream_data_uni; p->initial_max_data = params->initial_max_data; /* we might hit garbage, then set the sane default. */ p->active_connection_id_limit = - ngtcp2_max(NGTCP2_DEFAULT_ACTIVE_CONNECTION_ID_LIMIT, - params->active_connection_id_limit); + ngtcp2_max_uint64(NGTCP2_DEFAULT_ACTIVE_CONNECTION_ID_LIMIT, + params->active_connection_id_limit); p->max_datagram_frame_size = params->max_datagram_frame_size; /* we might hit garbage, then set the sane default. */ if (params->max_udp_payload_size) { - p->max_udp_payload_size = - ngtcp2_max(NGTCP2_MAX_UDP_PAYLOAD_SIZE, params->max_udp_payload_size); + p->max_udp_payload_size = ngtcp2_max_uint64(NGTCP2_MAX_UDP_PAYLOAD_SIZE, + params->max_udp_payload_size); } /* These parameters are treated specially. If server accepts early data, it must not set values for these parameters that are smaller than these remembered values. */ conn->early.transport_params.initial_max_streams_bidi = - params->initial_max_streams_bidi; + params->initial_max_streams_bidi; conn->early.transport_params.initial_max_streams_uni = - params->initial_max_streams_uni; + params->initial_max_streams_uni; conn->early.transport_params.initial_max_stream_data_bidi_local = - params->initial_max_stream_data_bidi_local; + params->initial_max_stream_data_bidi_local; conn->early.transport_params.initial_max_stream_data_bidi_remote = - params->initial_max_stream_data_bidi_remote; + params->initial_max_stream_data_bidi_remote; conn->early.transport_params.initial_max_stream_data_uni = - params->initial_max_stream_data_uni; + params->initial_max_stream_data_uni; conn->early.transport_params.initial_max_data = params->initial_max_data; conn->early.transport_params.active_connection_id_limit = - params->active_connection_id_limit; + params->active_connection_id_limit; conn->early.transport_params.max_datagram_frame_size = - params->max_datagram_frame_size; + params->max_datagram_frame_size; conn_sync_stream_id_limit(conn); @@ -11522,12 +11568,12 @@ int ngtcp2_conn_set_0rtt_remote_transport_params( } int ngtcp2_conn_set_local_transport_params_versioned( - ngtcp2_conn *conn, int transport_params_version, - const ngtcp2_transport_params *params) { + ngtcp2_conn *conn, int transport_params_version, + const ngtcp2_transport_params *params) { ngtcp2_transport_params paramsbuf; params = ngtcp2_transport_params_convert_to_latest( - ¶msbuf, transport_params_version, params); + ¶msbuf, transport_params_version, params); assert(conn->server); assert(params->active_connection_id_limit >= @@ -11576,7 +11622,7 @@ int ngtcp2_conn_commit_local_transport_params(ngtcp2_conn *conn) { } conn->rx.window = conn->rx.unsent_max_offset = conn->rx.max_offset = - params->initial_max_data; + params->initial_max_data; conn->remote.bidi.unsent_max_streams = params->initial_max_streams_bidi; conn->remote.bidi.max_streams = params->initial_max_streams_bidi; conn->remote.uni.unsent_max_streams = params->initial_max_streams_uni; @@ -11662,10 +11708,10 @@ ngtcp2_strm *ngtcp2_conn_find_stream(ngtcp2_conn *conn, int64_t stream_id) { } ngtcp2_ssize ngtcp2_conn_write_stream_versioned( - ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, - ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, ngtcp2_ssize *pdatalen, - uint32_t flags, int64_t stream_id, const uint8_t *data, size_t datalen, - ngtcp2_tstamp ts) { + ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, + ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, ngtcp2_ssize *pdatalen, + uint32_t flags, int64_t stream_id, const uint8_t *data, size_t datalen, + ngtcp2_tstamp ts) { ngtcp2_vec datav; datav.len = datalen; @@ -11693,9 +11739,11 @@ static ngtcp2_ssize conn_write_vmsg_wrapper(ngtcp2_conn *conn, if (cstat->bytes_in_flight >= cstat->cwnd) { conn->rst.is_cwnd_limited = 1; - } - - if (nwrite == 0 && cstat->bytes_in_flight < cstat->cwnd) { + } else if (conn->rst.app_limited == 0 && + (cstat->cwnd >= cstat->ssthresh || + cstat->bytes_in_flight * 2 < cstat->cwnd) && + nwrite == 0 && conn_pacing_pkt_tx_allowed(conn, ts) && + (conn->flags & NGTCP2_CONN_FLAG_HANDSHAKE_COMPLETED)) { conn->rst.app_limited = conn->rst.delivered + cstat->bytes_in_flight; if (conn->rst.app_limited == 0) { @@ -11707,10 +11755,10 @@ static ngtcp2_ssize conn_write_vmsg_wrapper(ngtcp2_conn *conn, } ngtcp2_ssize ngtcp2_conn_writev_stream_versioned( - ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, - ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, ngtcp2_ssize *pdatalen, - uint32_t flags, int64_t stream_id, const ngtcp2_vec *datav, size_t datavcnt, - ngtcp2_tstamp ts) { + ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, + ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, ngtcp2_ssize *pdatalen, + uint32_t flags, int64_t stream_id, const ngtcp2_vec *datav, size_t datavcnt, + ngtcp2_tstamp ts) { ngtcp2_vmsg vmsg, *pvmsg; ngtcp2_strm *strm; int64_t datalen; @@ -11734,19 +11782,24 @@ ngtcp2_ssize ngtcp2_conn_writev_stream_versioned( return NGTCP2_ERR_INVALID_ARGUMENT; } - if ((uint64_t)datalen > NGTCP2_MAX_VARINT - strm->tx.offset || - (uint64_t)datalen > NGTCP2_MAX_VARINT - conn->tx.offset) { - return NGTCP2_ERR_INVALID_ARGUMENT; - } + if (datalen == 0 && !(flags & NGTCP2_WRITE_STREAM_FLAG_FIN) && + (strm->flags & NGTCP2_STRM_FLAG_ANY_SENT)) { + pvmsg = NULL; + } else { + if ((uint64_t)datalen > NGTCP2_MAX_VARINT - strm->tx.offset || + (uint64_t)datalen > NGTCP2_MAX_VARINT - conn->tx.offset) { + return NGTCP2_ERR_INVALID_ARGUMENT; + } - vmsg.type = NGTCP2_VMSG_TYPE_STREAM; - vmsg.stream.strm = strm; - vmsg.stream.flags = flags; - vmsg.stream.data = datav; - vmsg.stream.datacnt = datavcnt; - vmsg.stream.pdatalen = pdatalen; + vmsg.type = NGTCP2_VMSG_TYPE_STREAM; + vmsg.stream.strm = strm; + vmsg.stream.flags = flags; + vmsg.stream.data = datav; + vmsg.stream.datacnt = datavcnt; + vmsg.stream.pdatalen = pdatalen; - pvmsg = &vmsg; + pvmsg = &vmsg; + } } else { pvmsg = NULL; } @@ -11756,10 +11809,10 @@ ngtcp2_ssize ngtcp2_conn_writev_stream_versioned( } ngtcp2_ssize ngtcp2_conn_write_datagram_versioned( - ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, - ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, int *paccepted, - uint32_t flags, uint64_t dgram_id, const uint8_t *data, size_t datalen, - ngtcp2_tstamp ts) { + ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, + ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, int *paccepted, + uint32_t flags, uint64_t dgram_id, const uint8_t *data, size_t datalen, + ngtcp2_tstamp ts) { ngtcp2_vec datav; datav.len = datalen; @@ -11771,10 +11824,10 @@ ngtcp2_ssize ngtcp2_conn_write_datagram_versioned( } ngtcp2_ssize ngtcp2_conn_writev_datagram_versioned( - ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, - ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, int *paccepted, - uint32_t flags, uint64_t dgram_id, const ngtcp2_vec *datav, size_t datavcnt, - ngtcp2_tstamp ts) { + ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, + ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, int *paccepted, + uint32_t flags, uint64_t dgram_id, const ngtcp2_vec *datav, size_t datavcnt, + ngtcp2_tstamp ts) { ngtcp2_vmsg vmsg; int64_t datalen; @@ -11837,7 +11890,7 @@ ngtcp2_ssize ngtcp2_conn_write_vmsg(ngtcp2_conn *conn, ngtcp2_path *path, } origlen = destlen = - conn_shape_udp_payload(conn, &conn->dcid.current, destlen); + conn_shape_udp_payload(conn, &conn->dcid.current, destlen); if (!ppe_pending && pi) { pi->ecn = NGTCP2_ECN_NOT_ECT; @@ -11867,10 +11920,9 @@ ngtcp2_ssize ngtcp2_conn_write_vmsg(ngtcp2_conn *conn, ngtcp2_path *path, assert(dest[0] & NGTCP2_HEADER_FORM_BIT); assert(conn->negotiated_version); - if (ngtcp2_pkt_get_type_long(conn->negotiated_version, dest[0]) == - NGTCP2_PKT_INITIAL) { - /* We have added padding already, but in that case, there is no - space left to write 1RTT packet. */ + if (nwrite < NGTCP2_MAX_UDP_PAYLOAD_SIZE && + ngtcp2_pkt_get_type_long(conn->negotiated_version, dest[0]) == + NGTCP2_PKT_INITIAL) { wflags |= NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING; } @@ -11890,7 +11942,7 @@ ngtcp2_ssize ngtcp2_conn_write_vmsg(ngtcp2_conn *conn, ngtcp2_path *path, return 0; } - origlen = (size_t)ngtcp2_min((uint64_t)origlen, server_tx_left); + origlen = (size_t)ngtcp2_min_uint64((uint64_t)origlen, server_tx_left); } return conn_write_handshake_ack_pkts(conn, pi, dest, origlen, ts); @@ -11902,15 +11954,15 @@ ngtcp2_ssize ngtcp2_conn_write_vmsg(ngtcp2_conn *conn, ngtcp2_path *path, if (server_tx_left == 0) { if (cstat->loss_detection_timer != UINT64_MAX) { ngtcp2_log_info( - &conn->log, NGTCP2_LOG_EVENT_LDC, - "loss detection timer canceled due to amplification limit"); - cstat->loss_detection_timer = UINT64_MAX; + &conn->log, NGTCP2_LOG_EVENT_LDC, + "loss detection timer canceled due to amplification limit"); + ngtcp2_conn_cancel_loss_detection_timer(conn); } return 0; } - destlen = (size_t)ngtcp2_min((uint64_t)destlen, server_tx_left); + destlen = (size_t)ngtcp2_min_uint64((uint64_t)destlen, server_tx_left); } if (conn->in_pktns) { @@ -11931,14 +11983,12 @@ ngtcp2_ssize ngtcp2_conn_write_vmsg(ngtcp2_conn *conn, ngtcp2_path *path, dest += nwrite; destlen -= (size_t)nwrite; - if (conn->in_pktns && nwrite > 0) { + if (res < NGTCP2_MAX_UDP_PAYLOAD_SIZE && conn->in_pktns && nwrite > 0) { it = ngtcp2_rtb_head(&conn->in_pktns->rtb); if (!ngtcp2_ksl_it_end(&it)) { rtbent = ngtcp2_ksl_it_get(&it); if (rtbent->hd.pkt_num != prev_in_pkt_num && (rtbent->flags & NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING)) { - /* We have added padding already, but in that case, there - is no space left to write 1RTT packet. */ wflags |= NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING; } } @@ -11959,7 +12009,7 @@ ngtcp2_ssize ngtcp2_conn_write_vmsg(ngtcp2_conn *conn, ngtcp2_path *path, return 0; } - origlen = (size_t)ngtcp2_min((uint64_t)origlen, server_tx_left); + origlen = (size_t)ngtcp2_min_uint64((uint64_t)origlen, server_tx_left); } return conn_write_ack_pkt(conn, pi, dest, origlen, NGTCP2_PKT_1RTT, ts); @@ -12004,12 +12054,12 @@ ngtcp2_ssize ngtcp2_conn_write_vmsg(ngtcp2_conn *conn, ngtcp2_path *path, } /* dest and destlen have already been adjusted in ppe in the first run. They are adjusted for probe packet later. */ - nwrite = conn_write_pkt(conn, pi, dest, destlen, vmsg, NGTCP2_PKT_1RTT, - wflags, ts); + nwrite = conn_write_pkt(conn, pi, dest, destlen, (size_t)res, vmsg, + NGTCP2_PKT_1RTT, wflags, ts); goto fin; } else { conn->pkt.require_padding = - (wflags & NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING); + (wflags & NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING); if (conn->state == NGTCP2_CS_POST_HANDSHAKE) { rv = conn_prepare_key_update(conn, ts); @@ -12023,14 +12073,14 @@ ngtcp2_ssize ngtcp2_conn_write_vmsg(ngtcp2_conn *conn, ngtcp2_path *path, } else { if (res == 0) { nwrite = - conn_write_path_response(conn, path, pi, dest, origdestlen, ts); + conn_write_path_response(conn, path, pi, dest, origdestlen, ts); if (nwrite) { goto fin; } if (conn->pv) { nwrite = - conn_write_path_challenge(conn, path, pi, dest, origdestlen, ts); + conn_write_path_challenge(conn, path, pi, dest, origdestlen, ts); if (nwrite) { goto fin; } @@ -12051,15 +12101,15 @@ ngtcp2_ssize ngtcp2_conn_write_vmsg(ngtcp2_conn *conn, ngtcp2_path *path, if (conn->server && !(conn->dcid.current.flags & NGTCP2_DCID_FLAG_PATH_VALIDATED)) { server_tx_left = conn_server_tx_left(conn, &conn->dcid.current); - origlen = (size_t)ngtcp2_min((uint64_t)origlen, server_tx_left); - destlen = (size_t)ngtcp2_min((uint64_t)destlen, server_tx_left); + origlen = (size_t)ngtcp2_min_uint64((uint64_t)origlen, server_tx_left); + destlen = (size_t)ngtcp2_min_uint64((uint64_t)destlen, server_tx_left); if (server_tx_left == 0 && conn->cstat.loss_detection_timer != UINT64_MAX) { ngtcp2_log_info( - &conn->log, NGTCP2_LOG_EVENT_LDC, - "loss detection timer canceled due to amplification limit"); - conn->cstat.loss_detection_timer = UINT64_MAX; + &conn->log, NGTCP2_LOG_EVENT_LDC, + "loss detection timer canceled due to amplification limit"); + ngtcp2_conn_cancel_loss_detection_timer(conn); } } } @@ -12100,14 +12150,14 @@ ngtcp2_ssize ngtcp2_conn_write_vmsg(ngtcp2_conn *conn, ngtcp2_path *path, "transmit probe pkt left=%zu", conn->pktns.rtb.probe_pkt_left); - nwrite = conn_write_pkt(conn, pi, dest, destlen, vmsg, NGTCP2_PKT_1RTT, - wflags, ts); + nwrite = conn_write_pkt(conn, pi, dest, destlen, (size_t)res, vmsg, + NGTCP2_PKT_1RTT, wflags, ts); goto fin; } - nwrite = conn_write_pkt(conn, pi, dest, destlen, vmsg, NGTCP2_PKT_1RTT, - wflags, ts); + nwrite = conn_write_pkt(conn, pi, dest, destlen, (size_t)res, vmsg, + NGTCP2_PKT_1RTT, wflags, ts); if (nwrite) { assert(nwrite != NGTCP2_ERR_NOBUF); goto fin; @@ -12162,9 +12212,8 @@ conn_write_connection_close(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, pkt_type != NGTCP2_PKT_INITIAL) { if (in_pktns && conn->server) { nwrite = ngtcp2_conn_write_single_frame_pkt( - conn, pi, dest, destlen, NGTCP2_PKT_INITIAL, - NGTCP2_WRITE_PKT_FLAG_NONE, &conn->dcid.current.cid, &fr, - NGTCP2_RTB_ENTRY_FLAG_NONE, NULL, ts); + conn, pi, dest, destlen, NGTCP2_PKT_INITIAL, NGTCP2_WRITE_PKT_FLAG_NONE, + &conn->dcid.current.cid, &fr, NGTCP2_RTB_ENTRY_FLAG_NONE, NULL, ts); if (nwrite < 0) { return nwrite; } @@ -12177,9 +12226,9 @@ conn_write_connection_close(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, if (pkt_type != NGTCP2_PKT_HANDSHAKE && hs_pktns && hs_pktns->crypto.tx.ckm) { nwrite = ngtcp2_conn_write_single_frame_pkt( - conn, pi, dest, destlen, NGTCP2_PKT_HANDSHAKE, - NGTCP2_WRITE_PKT_FLAG_NONE, &conn->dcid.current.cid, &fr, - NGTCP2_RTB_ENTRY_FLAG_NONE, NULL, ts); + conn, pi, dest, destlen, NGTCP2_PKT_HANDSHAKE, + NGTCP2_WRITE_PKT_FLAG_NONE, &conn->dcid.current.cid, &fr, + NGTCP2_RTB_ENTRY_FLAG_NONE, NULL, ts); if (nwrite < 0) { return nwrite; } @@ -12195,8 +12244,8 @@ conn_write_connection_close(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, } nwrite = ngtcp2_conn_write_single_frame_pkt( - conn, pi, dest, destlen, pkt_type, flags, &conn->dcid.current.cid, &fr, - NGTCP2_RTB_ENTRY_FLAG_NONE, NULL, ts); + conn, pi, dest, destlen, pkt_type, flags, &conn->dcid.current.cid, &fr, + NGTCP2_RTB_ENTRY_FLAG_NONE, NULL, ts); if (nwrite < 0) { return nwrite; @@ -12212,9 +12261,9 @@ conn_write_connection_close(ngtcp2_conn *conn, ngtcp2_pkt_info *pi, } ngtcp2_ssize ngtcp2_conn_write_connection_close_pkt( - ngtcp2_conn *conn, ngtcp2_path *path, ngtcp2_pkt_info *pi, uint8_t *dest, - size_t destlen, uint64_t error_code, const uint8_t *reason, - size_t reasonlen, ngtcp2_tstamp ts) { + ngtcp2_conn *conn, ngtcp2_path *path, ngtcp2_pkt_info *pi, uint8_t *dest, + size_t destlen, uint64_t error_code, const uint8_t *reason, size_t reasonlen, + ngtcp2_tstamp ts) { ngtcp2_pktns *in_pktns = conn->in_pktns; ngtcp2_pktns *hs_pktns = conn->hs_pktns; uint8_t pkt_type; @@ -12247,7 +12296,7 @@ ngtcp2_ssize ngtcp2_conn_write_connection_close_pkt( if (conn->server) { server_tx_left = conn_server_tx_left(conn, &conn->dcid.current); - destlen = (size_t)ngtcp2_min((uint64_t)destlen, server_tx_left); + destlen = (size_t)ngtcp2_min_uint64((uint64_t)destlen, server_tx_left); } if (conn->state == NGTCP2_CS_POST_HANDSHAKE || @@ -12275,9 +12324,9 @@ ngtcp2_ssize ngtcp2_conn_write_connection_close_pkt( } ngtcp2_ssize ngtcp2_conn_write_application_close_pkt( - ngtcp2_conn *conn, ngtcp2_path *path, ngtcp2_pkt_info *pi, uint8_t *dest, - size_t destlen, uint64_t app_error_code, const uint8_t *reason, - size_t reasonlen, ngtcp2_tstamp ts) { + ngtcp2_conn *conn, ngtcp2_path *path, ngtcp2_pkt_info *pi, uint8_t *dest, + size_t destlen, uint64_t app_error_code, const uint8_t *reason, + size_t reasonlen, ngtcp2_tstamp ts) { ngtcp2_ssize nwrite; ngtcp2_ssize res = 0; ngtcp2_frame fr; @@ -12309,15 +12358,14 @@ ngtcp2_ssize ngtcp2_conn_write_application_close_pkt( if (conn->server) { server_tx_left = conn_server_tx_left(conn, &conn->dcid.current); - destlen = (size_t)ngtcp2_min((uint64_t)destlen, server_tx_left); + destlen = (size_t)ngtcp2_min_uint64((uint64_t)destlen, server_tx_left); } if (!(conn->flags & NGTCP2_CONN_FLAG_HANDSHAKE_CONFIRMED)) { - nwrite = conn_write_connection_close(conn, pi, dest, destlen, - conn->hs_pktns->crypto.tx.ckm - ? NGTCP2_PKT_HANDSHAKE - : NGTCP2_PKT_INITIAL, - NGTCP2_APPLICATION_ERROR, NULL, 0, ts); + nwrite = conn_write_connection_close( + conn, pi, dest, destlen, + conn->hs_pktns->crypto.tx.ckm ? NGTCP2_PKT_HANDSHAKE : NGTCP2_PKT_INITIAL, + NGTCP2_APPLICATION_ERROR, NULL, 0, ts); if (nwrite < 0) { return nwrite; } @@ -12326,12 +12374,9 @@ ngtcp2_ssize ngtcp2_conn_write_application_close_pkt( destlen -= (size_t)nwrite; } - if (conn->state != NGTCP2_CS_POST_HANDSHAKE) { - assert(res); - - if (!conn->server || !conn->pktns.crypto.tx.ckm) { - return res; - } + if (conn->state != NGTCP2_CS_POST_HANDSHAKE && + (!conn->server || !conn->pktns.crypto.tx.ckm)) { + return res; } assert(conn->pktns.crypto.tx.ckm); @@ -12343,8 +12388,8 @@ ngtcp2_ssize ngtcp2_conn_write_application_close_pkt( fr.connection_close.reason = (uint8_t *)reason; nwrite = ngtcp2_conn_write_single_frame_pkt( - conn, pi, dest, destlen, NGTCP2_PKT_1RTT, NGTCP2_WRITE_PKT_FLAG_NONE, - &conn->dcid.current.cid, &fr, NGTCP2_RTB_ENTRY_FLAG_NONE, NULL, ts); + conn, pi, dest, destlen, NGTCP2_PKT_1RTT, NGTCP2_WRITE_PKT_FLAG_NONE, + &conn->dcid.current.cid, &fr, NGTCP2_RTB_ENTRY_FLAG_NONE, NULL, ts); if (nwrite < 0) { return nwrite; @@ -12392,12 +12437,22 @@ void ngtcp2_ccerr_set_liberr(ngtcp2_ccerr *ccerr, int liberr, ccerr_init(ccerr, NGTCP2_CCERR_TYPE_IDLE_CLOSE, NGTCP2_NO_ERROR, reason, reasonlen); + return; + case NGTCP2_ERR_DROP_CONN: + ccerr_init(ccerr, NGTCP2_CCERR_TYPE_DROP_CONN, NGTCP2_NO_ERROR, reason, + reasonlen); + + return; + case NGTCP2_ERR_RETRY: + ccerr_init(ccerr, NGTCP2_CCERR_TYPE_RETRY, NGTCP2_NO_ERROR, reason, + reasonlen); + return; }; ngtcp2_ccerr_set_transport_error( - ccerr, ngtcp2_err_infer_quic_transport_error_code(liberr), reason, - reasonlen); + ccerr, ngtcp2_err_infer_quic_transport_error_code(liberr), reason, + reasonlen); } void ngtcp2_ccerr_set_tls_alert(ngtcp2_ccerr *ccerr, uint8_t tls_alert, @@ -12415,9 +12470,9 @@ void ngtcp2_ccerr_set_application_error(ngtcp2_ccerr *ccerr, } ngtcp2_ssize ngtcp2_conn_write_connection_close_versioned( - ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, - ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, - const ngtcp2_ccerr *ccerr, ngtcp2_tstamp ts) { + ngtcp2_conn *conn, ngtcp2_path *path, int pkt_info_version, + ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, const ngtcp2_ccerr *ccerr, + ngtcp2_tstamp ts) { (void)pkt_info_version; conn_update_timestamp(conn, ts); @@ -12425,12 +12480,12 @@ ngtcp2_ssize ngtcp2_conn_write_connection_close_versioned( switch (ccerr->type) { case NGTCP2_CCERR_TYPE_TRANSPORT: return ngtcp2_conn_write_connection_close_pkt( - conn, path, pi, dest, destlen, ccerr->error_code, ccerr->reason, - ccerr->reasonlen, ts); + conn, path, pi, dest, destlen, ccerr->error_code, ccerr->reason, + ccerr->reasonlen, ts); case NGTCP2_CCERR_TYPE_APPLICATION: return ngtcp2_conn_write_application_close_pkt( - conn, path, pi, dest, destlen, ccerr->error_code, ccerr->reason, - ccerr->reasonlen, ts); + conn, path, pi, dest, destlen, ccerr->error_code, ccerr->reason, + ccerr->reasonlen, ts); default: return 0; } @@ -12471,7 +12526,7 @@ int ngtcp2_conn_close_stream(ngtcp2_conn *conn, ngtcp2_strm *strm) { int ngtcp2_conn_close_stream_if_shut_rdwr(ngtcp2_conn *conn, ngtcp2_strm *strm) { if ((strm->flags & NGTCP2_STRM_FLAG_SHUT_RDWR) == - NGTCP2_STRM_FLAG_SHUT_RDWR && + NGTCP2_STRM_FLAG_SHUT_RDWR && ((strm->flags & NGTCP2_STRM_FLAG_RESET_STREAM_RECVED) || ngtcp2_strm_rx_offset(strm) == strm->rx.last_offset) && (((strm->flags & NGTCP2_STRM_FLAG_RESET_STREAM) && @@ -12537,7 +12592,7 @@ static int conn_shutdown_stream_read(ngtcp2_conn *conn, ngtcp2_strm *strm, which are not passed to application. */ if (!(strm->flags & NGTCP2_STRM_FLAG_RESET_STREAM_RECVED)) { ngtcp2_conn_extend_max_offset(conn, strm->rx.last_offset - - ngtcp2_strm_rx_offset(strm)); + ngtcp2_strm_rx_offset(strm)); } strm->flags |= NGTCP2_STRM_FLAG_STOP_SENDING; @@ -12720,20 +12775,20 @@ static void conn_discard_early_data_state(ngtcp2_conn *conn) { ngtcp2_rtb_remove_early_data(&conn->pktns.rtb, &conn->cstat); - ngtcp2_map_each_free(&conn->strms, delete_strms_pq_each, conn); + ngtcp2_map_each(&conn->strms, delete_strms_pq_each, conn); ngtcp2_map_clear(&conn->strms); conn->tx.offset = 0; conn->tx.last_blocked_offset = UINT64_MAX; conn->rx.unsent_max_offset = conn->rx.max_offset = - conn->local.transport_params.initial_max_data; + conn->local.transport_params.initial_max_data; conn->remote.bidi.unsent_max_streams = conn->remote.bidi.max_streams = - conn->local.transport_params.initial_max_streams_bidi; + conn->local.transport_params.initial_max_streams_bidi; conn->remote.uni.unsent_max_streams = conn->remote.uni.max_streams = - conn->local.transport_params.initial_max_streams_uni; + conn->local.transport_params.initial_max_streams_uni; if (conn->server) { conn->local.bidi.next_stream_id = 1; @@ -12778,6 +12833,8 @@ int ngtcp2_conn_update_rtt(ngtcp2_conn *conn, ngtcp2_duration rtt, ngtcp2_duration ack_delay, ngtcp2_tstamp ts) { ngtcp2_conn_stat *cstat = &conn->cstat; + assert(rtt > 0); + if (cstat->min_rtt == UINT64_MAX) { cstat->latest_rtt = rtt; cstat->min_rtt = rtt; @@ -12788,43 +12845,43 @@ int ngtcp2_conn_update_rtt(ngtcp2_conn *conn, ngtcp2_duration rtt, if (conn->flags & NGTCP2_CONN_FLAG_HANDSHAKE_CONFIRMED) { assert(conn->remote.transport_params); - ack_delay = - ngtcp2_min(ack_delay, conn->remote.transport_params->max_ack_delay); + ack_delay = ngtcp2_min_uint64( + ack_delay, conn->remote.transport_params->max_ack_delay); } else if (ack_delay > 0 && rtt >= cstat->min_rtt && rtt < cstat->min_rtt + ack_delay) { /* Ignore RTT sample if adjusting ack_delay causes the sample less than min_rtt before handshake confirmation. */ ngtcp2_log_info( - &conn->log, NGTCP2_LOG_EVENT_LDC, - "ignore rtt sample because ack_delay is too large latest_rtt=%" PRIu64 - " min_rtt=%" PRIu64 " ack_delay=%" PRIu64, - rtt / NGTCP2_MILLISECONDS, cstat->min_rtt / NGTCP2_MILLISECONDS, - ack_delay / NGTCP2_MILLISECONDS); + &conn->log, NGTCP2_LOG_EVENT_LDC, + "ignore rtt sample because ack_delay is too large latest_rtt=%" PRIu64 + " min_rtt=%" PRIu64 " ack_delay=%" PRIu64, + rtt / NGTCP2_MILLISECONDS, cstat->min_rtt / NGTCP2_MILLISECONDS, + ack_delay / NGTCP2_MILLISECONDS); return NGTCP2_ERR_INVALID_ARGUMENT; } cstat->latest_rtt = rtt; - cstat->min_rtt = ngtcp2_min(cstat->min_rtt, rtt); + cstat->min_rtt = ngtcp2_min_uint64(cstat->min_rtt, rtt); if (rtt >= cstat->min_rtt + ack_delay) { rtt -= ack_delay; } cstat->rttvar = (cstat->rttvar * 3 + (cstat->smoothed_rtt < rtt - ? rtt - cstat->smoothed_rtt - : cstat->smoothed_rtt - rtt)) / + ? rtt - cstat->smoothed_rtt + : cstat->smoothed_rtt - rtt)) / 4; cstat->smoothed_rtt = (cstat->smoothed_rtt * 7 + rtt) / 8; } ngtcp2_log_info( - &conn->log, NGTCP2_LOG_EVENT_LDC, - "latest_rtt=%" PRIu64 " min_rtt=%" PRIu64 " smoothed_rtt=%" PRIu64 - " rttvar=%" PRIu64 " ack_delay=%" PRIu64, - cstat->latest_rtt / NGTCP2_MILLISECONDS, - cstat->min_rtt / NGTCP2_MILLISECONDS, - cstat->smoothed_rtt / NGTCP2_MILLISECONDS, - cstat->rttvar / NGTCP2_MILLISECONDS, ack_delay / NGTCP2_MILLISECONDS); + &conn->log, NGTCP2_LOG_EVENT_LDC, + "latest_rtt=%" PRIu64 " min_rtt=%" PRIu64 " smoothed_rtt=%" PRIu64 + " rttvar=%" PRIu64 " ack_delay=%" PRIu64, + cstat->latest_rtt / NGTCP2_MILLISECONDS, + cstat->min_rtt / NGTCP2_MILLISECONDS, + cstat->smoothed_rtt / NGTCP2_MILLISECONDS, + cstat->rttvar / NGTCP2_MILLISECONDS, ack_delay / NGTCP2_MILLISECONDS); return 0; } @@ -12879,8 +12936,8 @@ static ngtcp2_tstamp conn_get_earliest_pto_expiry(ngtcp2_conn *conn, ngtcp2_conn_stat *cstat = &conn->cstat; ngtcp2_tstamp *times = cstat->last_tx_pkt_ts; ngtcp2_duration duration = - compute_pto(cstat->smoothed_rtt, cstat->rttvar, /* max_ack_delay = */ 0) * - (1ULL << cstat->pto_count); + compute_pto(cstat->smoothed_rtt, cstat->rttvar, /* max_ack_delay = */ 0) * + (1ULL << cstat->pto_count); for (i = NGTCP2_PKTNS_ID_INITIAL; i < NGTCP2_PKTNS_ID_MAX; ++i) { if (ns[i] == NULL || ns[i]->rtb.num_pto_eliciting == 0 || @@ -12939,8 +12996,7 @@ void ngtcp2_conn_set_loss_detection_timer(ngtcp2_conn *conn, ngtcp2_tstamp ts) { if (cstat->loss_detection_timer != UINT64_MAX) { ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_LDC, "loss detection timer canceled"); - cstat->loss_detection_timer = UINT64_MAX; - cstat->pto_count = 0; + ngtcp2_conn_cancel_loss_detection_timer(conn); } return; } @@ -12948,13 +13004,20 @@ void ngtcp2_conn_set_loss_detection_timer(ngtcp2_conn *conn, ngtcp2_tstamp ts) { cstat->loss_detection_timer = conn_get_earliest_pto_expiry(conn, ts); timeout = - cstat->loss_detection_timer > ts ? cstat->loss_detection_timer - ts : 0; + cstat->loss_detection_timer > ts ? cstat->loss_detection_timer - ts : 0; ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_LDC, "loss_detection_timer=%" PRIu64 " timeout=%" PRIu64, cstat->loss_detection_timer, timeout / NGTCP2_MILLISECONDS); } +void ngtcp2_conn_cancel_loss_detection_timer(ngtcp2_conn *conn) { + ngtcp2_conn_stat *cstat = &conn->cstat; + + cstat->loss_detection_timer = UINT64_MAX; + cstat->pto_count = 0; +} + int ngtcp2_conn_on_loss_detection_timer(ngtcp2_conn *conn, ngtcp2_tstamp ts) { ngtcp2_conn_stat *cstat = &conn->cstat; int rv; @@ -12966,8 +13029,7 @@ int ngtcp2_conn_on_loss_detection_timer(ngtcp2_conn *conn, ngtcp2_tstamp ts) { switch (conn->state) { case NGTCP2_CS_CLOSING: case NGTCP2_CS_DRAINING: - cstat->loss_detection_timer = UINT64_MAX; - cstat->pto_count = 0; + ngtcp2_conn_cancel_loss_detection_timer(conn); return 0; default: break; @@ -13042,7 +13104,8 @@ static int conn_buffer_crypto_data(ngtcp2_conn *conn, const uint8_t **pdata, } if (!*pbufchain) { - rv = ngtcp2_buf_chain_new(pbufchain, ngtcp2_max(1024, datalen), conn->mem); + rv = ngtcp2_buf_chain_new(pbufchain, ngtcp2_max_size(1024, datalen), + conn->mem); if (rv != 0) { return rv; } @@ -13125,7 +13188,7 @@ int ngtcp2_conn_submit_new_token(ngtcp2_conn *conn, const uint8_t *token, assert(tokenlen); rv = ngtcp2_frame_chain_new_token_objalloc_new( - &nfrc, token, tokenlen, &conn->frc_objalloc, conn->mem); + &nfrc, token, tokenlen, &conn->frc_objalloc, conn->mem); if (rv != 0) { return rv; } @@ -13208,7 +13271,7 @@ static void copy_dcid_to_cid_token(ngtcp2_cid_token *dest, dest->cid = src->cid; ngtcp2_path_storage_init2(&dest->ps, &src->ps.path); if ((dest->token_present = - (src->flags & NGTCP2_DCID_FLAG_TOKEN_PRESENT) != 0)) { + (src->flags & NGTCP2_DCID_FLAG_TOKEN_PRESENT) != 0)) { memcpy(dest->token, src->token, NGTCP2_STATELESS_RESET_TOKENLEN); } } @@ -13411,8 +13474,8 @@ uint64_t ngtcp2_conn_get_streams_bidi_left(ngtcp2_conn *conn) { uint64_t n = ngtcp2_ord_stream_id(conn->local.bidi.next_stream_id); return n > conn->local.bidi.max_streams - ? 0 - : conn->local.bidi.max_streams - n + 1; + ? 0 + : conn->local.bidi.max_streams - n + 1; } uint64_t ngtcp2_conn_get_streams_uni_left(ngtcp2_conn *conn) { @@ -13444,7 +13507,7 @@ ngtcp2_tstamp ngtcp2_conn_get_idle_expiry(ngtcp2_conn *conn) { conn->remote.transport_params->max_idle_timeout == 0 || (conn->local.transport_params.max_idle_timeout && conn->local.transport_params.max_idle_timeout < - conn->remote.transport_params->max_idle_timeout)) { + conn->remote.transport_params->max_idle_timeout)) { idle_timeout = conn->local.transport_params.max_idle_timeout; } else { idle_timeout = conn->remote.transport_params->max_idle_timeout; @@ -13455,10 +13518,10 @@ ngtcp2_tstamp ngtcp2_conn_get_idle_expiry(ngtcp2_conn *conn) { } trpto = 3 * conn_compute_pto(conn, conn_is_tls_handshake_completed(conn) - ? &conn->pktns - : conn->hs_pktns); + ? &conn->pktns + : conn->hs_pktns); - idle_timeout = ngtcp2_max(idle_timeout, trpto); + idle_timeout = ngtcp2_max_uint64(idle_timeout, trpto); if (conn->idle_ts >= UINT64_MAX - idle_timeout) { return UINT64_MAX; @@ -13469,8 +13532,8 @@ ngtcp2_tstamp ngtcp2_conn_get_idle_expiry(ngtcp2_conn *conn) { ngtcp2_duration ngtcp2_conn_get_pto(ngtcp2_conn *conn) { return conn_compute_pto(conn, conn_is_tls_handshake_completed(conn) - ? &conn->pktns - : conn->hs_pktns); + ? &conn->pktns + : conn->hs_pktns); } void ngtcp2_conn_set_initial_crypto_ctx(ngtcp2_conn *conn, @@ -13581,8 +13644,8 @@ void ngtcp2_conn_update_pkt_tx_time(ngtcp2_conn *conn, ngtcp2_tstamp ts) { /* 1.25 is the under-utilization avoidance factor described in https://datatracker.ietf.org/doc/html/rfc9002#section-7.7 */ pacing_interval = (conn->cstat.first_rtt_sample_ts == UINT64_MAX - ? NGTCP2_MILLISECONDS - : conn->cstat.smoothed_rtt) * + ? NGTCP2_MILLISECONDS + : conn->cstat.smoothed_rtt) * 100 / 125 / conn->cstat.cwnd; } @@ -13597,20 +13660,11 @@ size_t ngtcp2_conn_get_send_quantum(ngtcp2_conn *conn) { } int ngtcp2_conn_track_retired_dcid_seq(ngtcp2_conn *conn, uint64_t seq) { - size_t i; - if (conn->dcid.retire_unacked.len >= ngtcp2_arraylen(conn->dcid.retire_unacked.seqs)) { return NGTCP2_ERR_CONNECTION_ID_LIMIT; } - /* Make sure that we do not have a duplicate */ - for (i = 0; i < conn->dcid.retire_unacked.len; ++i) { - if (conn->dcid.retire_unacked.seqs[i] == seq) { - ngtcp2_unreachable(); - } - } - conn->dcid.retire_unacked.seqs[conn->dcid.retire_unacked.len++] = seq; return 0; @@ -13626,7 +13680,7 @@ void ngtcp2_conn_untrack_retired_dcid_seq(ngtcp2_conn *conn, uint64_t seq) { if (i != conn->dcid.retire_unacked.len - 1) { conn->dcid.retire_unacked.seqs[i] = - conn->dcid.retire_unacked.seqs[conn->dcid.retire_unacked.len - 1]; + conn->dcid.retire_unacked.seqs[conn->dcid.retire_unacked.len - 1]; } --conn->dcid.retire_unacked.len; @@ -13635,6 +13689,18 @@ void ngtcp2_conn_untrack_retired_dcid_seq(ngtcp2_conn *conn, uint64_t seq) { } } +int ngtcp2_conn_check_retired_dcid_tracked(ngtcp2_conn *conn, uint64_t seq) { + size_t i; + + for (i = 0; i < conn->dcid.retire_unacked.len; ++i) { + if (conn->dcid.retire_unacked.seqs[i] == seq) { + return 1; + } + } + + return 0; +} + size_t ngtcp2_conn_get_stream_loss_count(ngtcp2_conn *conn, int64_t stream_id) { ngtcp2_strm *strm = ngtcp2_conn_find_stream(conn, stream_id); @@ -13652,56 +13718,17 @@ void ngtcp2_path_challenge_entry_init(ngtcp2_path_challenge_entry *pcent, memcpy(pcent->data, data, sizeof(pcent->data)); } -void ngtcp2_settings_default_versioned(int settings_version, - ngtcp2_settings *settings) { - (void)settings_version; - - memset(settings, 0, sizeof(*settings)); - settings->cc_algo = NGTCP2_CC_ALGO_CUBIC; - settings->initial_rtt = NGTCP2_DEFAULT_INITIAL_RTT; - settings->ack_thresh = 2; - settings->max_tx_udp_payload_size = 1500 - 48; - settings->handshake_timeout = UINT64_MAX; -} - -void ngtcp2_transport_params_default_versioned( - int transport_params_version, ngtcp2_transport_params *params) { - size_t len; - - switch (transport_params_version) { - case NGTCP2_TRANSPORT_PARAMS_VERSION: - len = sizeof(*params); - - break; - default: - ngtcp2_unreachable(); - } - - memset(params, 0, len); - - switch (transport_params_version) { - case NGTCP2_TRANSPORT_PARAMS_VERSION: - params->max_udp_payload_size = NGTCP2_DEFAULT_MAX_RECV_UDP_PAYLOAD_SIZE; - params->active_connection_id_limit = - NGTCP2_DEFAULT_ACTIVE_CONNECTION_ID_LIMIT; - params->ack_delay_exponent = NGTCP2_DEFAULT_ACK_DELAY_EXPONENT; - params->max_ack_delay = NGTCP2_DEFAULT_MAX_ACK_DELAY; - - break; - } -} - /* The functions prefixed with ngtcp2_pkt_ are usually put inside ngtcp2_pkt.c. This function uses encryption construct and uses test data defined only in ngtcp2_conn_test.c, so it is written here. */ ngtcp2_ssize ngtcp2_pkt_write_connection_close( - uint8_t *dest, size_t destlen, uint32_t version, const ngtcp2_cid *dcid, - const ngtcp2_cid *scid, uint64_t error_code, const uint8_t *reason, - size_t reasonlen, ngtcp2_encrypt encrypt, const ngtcp2_crypto_aead *aead, - const ngtcp2_crypto_aead_ctx *aead_ctx, const uint8_t *iv, - ngtcp2_hp_mask hp_mask, const ngtcp2_crypto_cipher *hp, - const ngtcp2_crypto_cipher_ctx *hp_ctx) { + uint8_t *dest, size_t destlen, uint32_t version, const ngtcp2_cid *dcid, + const ngtcp2_cid *scid, uint64_t error_code, const uint8_t *reason, + size_t reasonlen, ngtcp2_encrypt encrypt, const ngtcp2_crypto_aead *aead, + const ngtcp2_crypto_aead_ctx *aead_ctx, const uint8_t *iv, + ngtcp2_hp_mask hp_mask, const ngtcp2_crypto_cipher *hp, + const ngtcp2_crypto_cipher_ctx *hp_ctx) { ngtcp2_pkt_hd hd; ngtcp2_crypto_km ckm; ngtcp2_crypto_cc cc; @@ -13726,7 +13753,7 @@ ngtcp2_ssize ngtcp2_pkt_write_connection_close( cc.encrypt = encrypt; cc.hp_mask = hp_mask; - ngtcp2_ppe_init(&ppe, dest, destlen, &cc); + ngtcp2_ppe_init(&ppe, dest, destlen, 0, &cc); rv = ngtcp2_ppe_encode_hd(&ppe, &hd); if (rv != 0) { diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn.h index 4ed67876bc3749..55073fcc828d73 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -65,9 +65,6 @@ typedef enum { NGTCP2_CS_DRAINING, } ngtcp2_conn_state; -/* NGTCP2_MAX_STREAMS is the maximum number of streams. */ -#define NGTCP2_MAX_STREAMS (1LL << 60) - /* NGTCP2_MAX_NUM_BUFFED_RX_PKTS is the maximum number of buffered reordered packets. */ #define NGTCP2_MAX_NUM_BUFFED_RX_PKTS 4 @@ -77,15 +74,6 @@ typedef enum { unreceived data. */ #define NGTCP2_MAX_REORDERED_CRYPTO_DATA 65536 -/* NGTCP2_MAX_RX_INITIAL_CRYPTO_DATA is the maximum offset of received - crypto stream in Initial packet. We set this hard limit here - because crypto stream is unbounded. */ -#define NGTCP2_MAX_RX_INITIAL_CRYPTO_DATA 65536 -/* NGTCP2_MAX_RX_HANDSHAKE_CRYPTO_DATA is the maximum offset of - received crypto stream in Handshake packet. We set this hard limit - here because crypto stream is unbounded. */ -#define NGTCP2_MAX_RX_HANDSHAKE_CRYPTO_DATA 65536 - /* NGTCP2_MAX_RETRIES is the number of Retry packet which client can accept. */ #define NGTCP2_MAX_RETRIES 3 @@ -121,12 +109,18 @@ typedef enum { /* NGTCP2_WRITE_PKT_FLAG_NONE indicates that no flag is set. */ #define NGTCP2_WRITE_PKT_FLAG_NONE 0x00u /* NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING indicates that packet other - than Initial packet should be padded. Initial packet might be - padded based on QUIC requirement regardless of this flag. */ + than Initial packet should be padded so that UDP datagram payload + is at least NGTCP2_MAX_UDP_PAYLOAD_SIZE bytes. Initial packet + might be padded based on QUIC requirement regardless of this + flag. */ #define NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING 0x01u /* NGTCP2_WRITE_PKT_FLAG_MORE indicates that more frames might come and it should be encoded into the current packet. */ #define NGTCP2_WRITE_PKT_FLAG_MORE 0x02u +/* NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING_FULL is just like + NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING, but it requests to add + padding to the full UDP datagram payload size. */ +#define NGTCP2_WRITE_PKT_FLAG_REQUIRE_PADDING_FULL 0x04u /* * ngtcp2_max_frame is defined so that it covers the largest ACK @@ -319,6 +313,7 @@ typedef struct ngtcp2_pktns { ngtcp2_acktr acktr; ngtcp2_rtb rtb; + ngtcp2_pktns_id id; } ngtcp2_pktns; typedef enum ngtcp2_ecn_state { @@ -342,15 +337,15 @@ typedef struct ngtcp2_early_transport_params { } ngtcp2_early_transport_params; ngtcp2_static_ringbuf_def(dcid_bound, NGTCP2_MAX_BOUND_DCID_POOL_SIZE, - sizeof(ngtcp2_dcid)); + sizeof(ngtcp2_dcid)) ngtcp2_static_ringbuf_def(dcid_unused, NGTCP2_MAX_DCID_POOL_SIZE, - sizeof(ngtcp2_dcid)); + sizeof(ngtcp2_dcid)) ngtcp2_static_ringbuf_def(dcid_retired, NGTCP2_MAX_DCID_RETIRED_SIZE, - sizeof(ngtcp2_dcid)); + sizeof(ngtcp2_dcid)) ngtcp2_static_ringbuf_def(path_challenge, 4, - sizeof(ngtcp2_path_challenge_entry)); + sizeof(ngtcp2_path_challenge_entry)) -ngtcp2_objalloc_decl(strm, ngtcp2_strm, oplent); +ngtcp2_objalloc_decl(strm, ngtcp2_strm, oplent) struct ngtcp2_conn { ngtcp2_objalloc frc_objalloc; @@ -813,6 +808,8 @@ int ngtcp2_conn_update_rtt(ngtcp2_conn *conn, ngtcp2_duration rtt, void ngtcp2_conn_set_loss_detection_timer(ngtcp2_conn *conn, ngtcp2_tstamp ts); +void ngtcp2_conn_cancel_loss_detection_timer(ngtcp2_conn *conn); + int ngtcp2_conn_on_loss_detection_timer(ngtcp2_conn *conn, ngtcp2_tstamp ts); /* @@ -878,9 +875,9 @@ ngtcp2_ssize ngtcp2_conn_write_vmsg(ngtcp2_conn *conn, ngtcp2_path *path, * User-defined callback function failed. */ ngtcp2_ssize ngtcp2_conn_write_single_frame_pkt( - ngtcp2_conn *conn, ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, - uint8_t type, uint8_t flags, const ngtcp2_cid *dcid, ngtcp2_frame *fr, - uint16_t rtb_entry_flags, const ngtcp2_path *path, ngtcp2_tstamp ts); + ngtcp2_conn *conn, ngtcp2_pkt_info *pi, uint8_t *dest, size_t destlen, + uint8_t type, uint8_t flags, const ngtcp2_cid *dcid, ngtcp2_frame *fr, + uint16_t rtb_entry_flags, const ngtcp2_path *path, ngtcp2_tstamp ts); /* * ngtcp2_conn_commit_local_transport_params commits the local @@ -973,6 +970,12 @@ int ngtcp2_conn_track_retired_dcid_seq(ngtcp2_conn *conn, uint64_t seq); */ void ngtcp2_conn_untrack_retired_dcid_seq(ngtcp2_conn *conn, uint64_t seq); +/* + * ngtcp2_conn_check_retired_dcid_tracked returns nonzero if |seq| has + * already been tracked. + */ +int ngtcp2_conn_check_retired_dcid_tracked(ngtcp2_conn *conn, uint64_t seq); + /* * ngtcp2_conn_server_negotiate_version negotiates QUIC version. It * is compatible version negotiation. It returns the negotiated QUIC @@ -1020,9 +1023,9 @@ ngtcp2_conn_server_negotiate_version(ngtcp2_conn *conn, * User callback failed */ ngtcp2_ssize ngtcp2_conn_write_connection_close_pkt( - ngtcp2_conn *conn, ngtcp2_path *path, ngtcp2_pkt_info *pi, uint8_t *dest, - size_t destlen, uint64_t error_code, const uint8_t *reason, - size_t reasonlen, ngtcp2_tstamp ts); + ngtcp2_conn *conn, ngtcp2_path *path, ngtcp2_pkt_info *pi, uint8_t *dest, + size_t destlen, uint64_t error_code, const uint8_t *reason, size_t reasonlen, + ngtcp2_tstamp ts); /** * @function @@ -1066,9 +1069,9 @@ ngtcp2_ssize ngtcp2_conn_write_connection_close_pkt( * User callback failed */ ngtcp2_ssize ngtcp2_conn_write_application_close_pkt( - ngtcp2_conn *conn, ngtcp2_path *path, ngtcp2_pkt_info *pi, uint8_t *dest, - size_t destlen, uint64_t app_error_code, const uint8_t *reason, - size_t reasonlen, ngtcp2_tstamp ts); + ngtcp2_conn *conn, ngtcp2_path *path, ngtcp2_pkt_info *pi, uint8_t *dest, + size_t destlen, uint64_t app_error_code, const uint8_t *reason, + size_t reasonlen, ngtcp2_tstamp ts); int ngtcp2_conn_start_pmtud(ngtcp2_conn *conn); @@ -1093,7 +1096,7 @@ void ngtcp2_conn_stop_pmtud(ngtcp2_conn *conn); * Out of memory. */ int ngtcp2_conn_set_remote_transport_params( - ngtcp2_conn *conn, const ngtcp2_transport_params *params); + ngtcp2_conn *conn, const ngtcp2_transport_params *params); /** * @function @@ -1132,7 +1135,7 @@ int ngtcp2_conn_set_remote_transport_params( * Out of memory. */ int ngtcp2_conn_set_0rtt_remote_transport_params( - ngtcp2_conn *conn, const ngtcp2_transport_params *params); + ngtcp2_conn *conn, const ngtcp2_transport_params *params); /* * ngtcp2_conn_create_ack_frame creates ACK frame, and assigns its @@ -1156,4 +1159,16 @@ int ngtcp2_conn_create_ack_frame(ngtcp2_conn *conn, ngtcp2_frame **pfr, ngtcp2_tstamp ts, ngtcp2_duration ack_delay, uint64_t ack_delay_exponent); -#endif /* NGTCP2_CONN_H */ +/* + * ngtcp2_conn_discard_initial_state discards state for Initial packet + * number space. + */ +void ngtcp2_conn_discard_initial_state(ngtcp2_conn *conn, ngtcp2_tstamp ts); + +/* + * ngtcp2_conn_discard_handshake_state discards state for Handshake + * packet number space. + */ +void ngtcp2_conn_discard_handshake_state(ngtcp2_conn *conn, ngtcp2_tstamp ts); + +#endif /* !defined(NGTCP2_CONN_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn_stat.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn_stat.h index 1a93867aab3cae..ad2b7329f48df2 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn_stat.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_conn_stat.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -105,8 +105,9 @@ typedef struct ngtcp2_conn_stat { uint64_t bytes_in_flight; /** * :member:`max_tx_udp_payload_size` is the maximum size of UDP - * datagram payload that this endpoint transmits. It is used by - * congestion controller to compute congestion window. + * datagram payload that this endpoint transmits to the current + * path. It is used by congestion controller to compute congestion + * window. */ size_t max_tx_udp_payload_size; /** @@ -129,4 +130,4 @@ typedef struct ngtcp2_conn_stat { size_t send_quantum; } ngtcp2_conn_stat; -#endif /* NGTCP2_CONN_STAT_H */ +#endif /* !defined(NGTCP2_CONN_STAT_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_conv.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_conv.c index 336721772b4e4c..6528011cc0edf4 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_conv.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_conv.c @@ -32,47 +32,37 @@ #include "ngtcp2_net.h" #include "ngtcp2_unreachable.h" -const uint8_t *ngtcp2_get_uint64(uint64_t *dest, const uint8_t *p) { - uint64_t n; - memcpy(&n, p, sizeof(n)); - *dest = ngtcp2_ntohl64(n); - return p + sizeof(n); -} - -const uint8_t *ngtcp2_get_uint48(uint64_t *dest, const uint8_t *p) { - uint64_t n = 0; - memcpy(((uint8_t *)&n) + 2, p, 6); - *dest = ngtcp2_ntohl64(n); - return p + 6; +const uint8_t *ngtcp2_get_uint64be(uint64_t *dest, const uint8_t *p) { + memcpy(dest, p, sizeof(*dest)); + *dest = ngtcp2_ntohl64(*dest); + return p + sizeof(*dest); } -const uint8_t *ngtcp2_get_uint32(uint32_t *dest, const uint8_t *p) { - uint32_t n; - memcpy(&n, p, sizeof(n)); - *dest = ngtcp2_ntohl(n); - return p + sizeof(n); +const uint8_t *ngtcp2_get_uint32be(uint32_t *dest, const uint8_t *p) { + memcpy(dest, p, sizeof(*dest)); + *dest = ngtcp2_ntohl(*dest); + return p + sizeof(*dest); } -const uint8_t *ngtcp2_get_uint24(uint32_t *dest, const uint8_t *p) { - uint32_t n = 0; - memcpy(((uint8_t *)&n) + 1, p, 3); - *dest = ngtcp2_ntohl(n); +const uint8_t *ngtcp2_get_uint24be(uint32_t *dest, const uint8_t *p) { + *dest = 0; + memcpy(((uint8_t *)dest) + 1, p, 3); + *dest = ngtcp2_ntohl(*dest); return p + 3; } -const uint8_t *ngtcp2_get_uint16(uint16_t *dest, const uint8_t *p) { - uint16_t n; - memcpy(&n, p, sizeof(n)); - *dest = ngtcp2_ntohs(n); - return p + sizeof(n); +const uint8_t *ngtcp2_get_uint16be(uint16_t *dest, const uint8_t *p) { + memcpy(dest, p, sizeof(*dest)); + *dest = ngtcp2_ntohs(*dest); + return p + sizeof(*dest); } -const uint8_t *ngtcp2_get_uint16be(uint16_t *dest, const uint8_t *p) { +const uint8_t *ngtcp2_get_uint16(uint16_t *dest, const uint8_t *p) { memcpy(dest, p, sizeof(*dest)); return p + sizeof(*dest); } -static uint64_t get_uvarint(size_t *plen, const uint8_t *p) { +static const uint8_t *get_uvarint(uint64_t *dest, const uint8_t *p) { union { uint8_t n8; uint16_t n16; @@ -80,42 +70,39 @@ static uint64_t get_uvarint(size_t *plen, const uint8_t *p) { uint64_t n64; } n; - *plen = (size_t)(1u << (*p >> 6)); - - switch (*plen) { + switch (*p >> 6) { + case 0: + *dest = *p++; + return p; case 1: - return *p; - case 2: memcpy(&n, p, 2); n.n8 &= 0x3f; - return ngtcp2_ntohs(n.n16); - case 4: + *dest = ngtcp2_ntohs(n.n16); + + return p + 2; + case 2: memcpy(&n, p, 4); n.n8 &= 0x3f; - return ngtcp2_ntohl(n.n32); - case 8: + *dest = ngtcp2_ntohl(n.n32); + + return p + 4; + case 3: memcpy(&n, p, 8); n.n8 &= 0x3f; - return ngtcp2_ntohl64(n.n64); + *dest = ngtcp2_ntohl64(n.n64); + + return p + 8; default: ngtcp2_unreachable(); } } const uint8_t *ngtcp2_get_uvarint(uint64_t *dest, const uint8_t *p) { - size_t len; - - *dest = get_uvarint(&len, p); - - return p + len; + return get_uvarint(dest, p); } const uint8_t *ngtcp2_get_varint(int64_t *dest, const uint8_t *p) { - size_t len; - - *dest = (int64_t)get_uvarint(&len, p); - - return p + len; + return get_uvarint((uint64_t *)dest, p); } int64_t ngtcp2_get_pkt_num(const uint8_t *p, size_t pkt_numlen) { @@ -126,13 +113,13 @@ int64_t ngtcp2_get_pkt_num(const uint8_t *p, size_t pkt_numlen) { case 1: return *p; case 2: - ngtcp2_get_uint16(&s, p); + ngtcp2_get_uint16be(&s, p); return (int64_t)s; case 3: - ngtcp2_get_uint24(&l, p); + ngtcp2_get_uint24be(&l, p); return (int64_t)l; case 4: - ngtcp2_get_uint32(&l, p); + ngtcp2_get_uint32be(&l, p); return (int64_t)l; default: ngtcp2_unreachable(); @@ -144,11 +131,6 @@ uint8_t *ngtcp2_put_uint64be(uint8_t *p, uint64_t n) { return ngtcp2_cpymem(p, (const uint8_t *)&n, sizeof(n)); } -uint8_t *ngtcp2_put_uint48be(uint8_t *p, uint64_t n) { - n = ngtcp2_htonl64(n); - return ngtcp2_cpymem(p, ((const uint8_t *)&n) + 2, 6); -} - uint8_t *ngtcp2_put_uint32be(uint8_t *p, uint32_t n) { n = ngtcp2_htonl(n); return ngtcp2_cpymem(p, (const uint8_t *)&n, sizeof(n)); @@ -207,14 +189,11 @@ uint8_t *ngtcp2_put_pkt_num(uint8_t *p, int64_t pkt_num, size_t len) { *p++ = (uint8_t)pkt_num; return p; case 2: - ngtcp2_put_uint16be(p, (uint16_t)pkt_num); - return p + 2; + return ngtcp2_put_uint16be(p, (uint16_t)pkt_num); case 3: - ngtcp2_put_uint24be(p, (uint32_t)pkt_num); - return p + 3; + return ngtcp2_put_uint24be(p, (uint32_t)pkt_num); case 4: - ngtcp2_put_uint32be(p, (uint32_t)pkt_num); - return p + 4; + return ngtcp2_put_uint32be(p, (uint32_t)pkt_num); default: ngtcp2_unreachable(); } @@ -238,54 +217,6 @@ size_t ngtcp2_put_uvarintlen(uint64_t n) { return 8; } -int64_t ngtcp2_nth_server_bidi_id(uint64_t n) { - if (n == 0) { - return 0; - } - - if ((NGTCP2_MAX_VARINT >> 2) < n - 1) { - return NGTCP2_MAX_SERVER_STREAM_ID_BIDI; - } - - return (int64_t)(((n - 1) << 2) | 0x01); -} - -int64_t ngtcp2_nth_client_bidi_id(uint64_t n) { - if (n == 0) { - return 0; - } - - if ((NGTCP2_MAX_VARINT >> 2) < n - 1) { - return NGTCP2_MAX_CLIENT_STREAM_ID_BIDI; - } - - return (int64_t)((n - 1) << 2); -} - -int64_t ngtcp2_nth_server_uni_id(uint64_t n) { - if (n == 0) { - return 0; - } - - if ((NGTCP2_MAX_VARINT >> 2) < n - 1) { - return NGTCP2_MAX_SERVER_STREAM_ID_UNI; - } - - return (int64_t)(((n - 1) << 2) | 0x03); -} - -int64_t ngtcp2_nth_client_uni_id(uint64_t n) { - if (n == 0) { - return 0; - } - - if ((NGTCP2_MAX_VARINT >> 2) < n - 1) { - return NGTCP2_MAX_CLIENT_STREAM_ID_UNI; - } - - return (int64_t)(((n - 1) << 2) | 0x02); -} - uint64_t ngtcp2_ord_stream_id(int64_t stream_id) { return (uint64_t)(stream_id >> 2) + 1; } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_conv.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_conv.h index ef089a971a37f1..ad924683b8dc10 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_conv.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_conv.h @@ -27,51 +27,44 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include /* - * ngtcp2_get_uint64 reads 8 bytes from |p| as 64 bits unsigned + * ngtcp2_get_uint64be reads 8 bytes from |p| as 64 bits unsigned * integer encoded as network byte order, and stores it in the buffer * pointed by |dest| in host byte order. It returns |p| + 8. */ -const uint8_t *ngtcp2_get_uint64(uint64_t *dest, const uint8_t *p); +const uint8_t *ngtcp2_get_uint64be(uint64_t *dest, const uint8_t *p); /* - * ngtcp2_get_uint48 reads 6 bytes from |p| as 48 bits unsigned - * integer encoded as network byte order, and stores it in the buffer - * pointed by |dest| in host byte order. It returns |p| + 6. - */ -const uint8_t *ngtcp2_get_uint48(uint64_t *dest, const uint8_t *p); - -/* - * ngtcp2_get_uint32 reads 4 bytes from |p| as 32 bits unsigned + * ngtcp2_get_uint32be reads 4 bytes from |p| as 32 bits unsigned * integer encoded as network byte order, and stores it in the buffer * pointed by |dest| in host byte order. It returns |p| + 4. */ -const uint8_t *ngtcp2_get_uint32(uint32_t *dest, const uint8_t *p); +const uint8_t *ngtcp2_get_uint32be(uint32_t *dest, const uint8_t *p); /* - * ngtcp2_get_uint24 reads 3 bytes from |p| as 24 bits unsigned + * ngtcp2_get_uint24be reads 3 bytes from |p| as 24 bits unsigned * integer encoded as network byte order, and stores it in the buffer * pointed by |dest| in host byte order. It returns |p| + 3. */ -const uint8_t *ngtcp2_get_uint24(uint32_t *dest, const uint8_t *p); +const uint8_t *ngtcp2_get_uint24be(uint32_t *dest, const uint8_t *p); /* - * ngtcp2_get_uint16 reads 2 bytes from |p| as 16 bits unsigned + * ngtcp2_get_uint16be reads 2 bytes from |p| as 16 bits unsigned * integer encoded as network byte order, and stores it in the buffer * pointed by |dest| in host byte order. It returns |p| + 2. */ -const uint8_t *ngtcp2_get_uint16(uint16_t *dest, const uint8_t *p); +const uint8_t *ngtcp2_get_uint16be(uint16_t *dest, const uint8_t *p); /* - * ngtcp2_get_uint16be reads 2 bytes from |p| as 16 bits unsigned + * ngtcp2_get_uint16 reads 2 bytes from |p| as 16 bits unsigned * integer encoded as network byte order, and stores it in the buffer * pointed by |dest| as is. It returns |p| + 2. */ -const uint8_t *ngtcp2_get_uint16be(uint16_t *dest, const uint8_t *p); +const uint8_t *ngtcp2_get_uint16(uint16_t *dest, const uint8_t *p); /* * ngtcp2_get_uvarint reads variable-length unsigned integer from |p|, @@ -102,13 +95,6 @@ int64_t ngtcp2_get_pkt_num(const uint8_t *p, size_t pkt_numlen); */ uint8_t *ngtcp2_put_uint64be(uint8_t *p, uint64_t n); -/* - * ngtcp2_put_uint48be writes |n| in host byte order in |p| in network - * byte order. It writes only least significant 48 bits. It returns - * the one beyond of the last written position. - */ -uint8_t *ngtcp2_put_uint48be(uint8_t *p, uint64_t n); - /* * ngtcp2_put_uint32be writes |n| in host byte order in |p| in network * byte order. It returns the one beyond of the last written @@ -168,41 +154,9 @@ size_t ngtcp2_get_uvarintlen(const uint8_t *p); */ size_t ngtcp2_put_uvarintlen(uint64_t n); -/* - * ngtcp2_nth_server_bidi_id returns |n|-th server bidirectional - * stream ID. If |n| is 0, it returns 0. If the |n|-th stream ID is - * larger than NGTCP2_MAX_SERVER_STREAM_ID_BIDI, this function returns - * NGTCP2_MAX_SERVER_STREAM_ID_BIDI. - */ -int64_t ngtcp2_nth_server_bidi_id(uint64_t n); - -/* - * ngtcp2_nth_client_bidi_id returns |n|-th client bidirectional - * stream ID. If |n| is 0, it returns 0. If the |n|-th stream ID is - * larger than NGTCP2_MAX_CLIENT_STREAM_ID_BIDI, this function returns - * NGTCP2_MAX_CLIENT_STREAM_ID_BIDI. - */ -int64_t ngtcp2_nth_client_bidi_id(uint64_t n); - -/* - * ngtcp2_nth_server_uni_id returns |n|-th server unidirectional - * stream ID. If |n| is 0, it returns 0. If the |n|-th stream ID is - * larger than NGTCP2_MAX_SERVER_STREAM_ID_UNI, this function returns - * NGTCP2_MAX_SERVER_STREAM_ID_UNI. - */ -int64_t ngtcp2_nth_server_uni_id(uint64_t n); - -/* - * ngtcp2_nth_client_uni_id returns |n|-th client unidirectional - * stream ID. If |n| is 0, it returns 0. If the |n|-th stream ID is - * larger than NGTCP2_MAX_CLIENT_STREAM_ID_UNI, this function returns - * NGTCP2_MAX_CLIENT_STREAM_ID_UNI. - */ -int64_t ngtcp2_nth_client_uni_id(uint64_t n); - /* * ngtcp2_ord_stream_id returns the ordinal number of |stream_id|. */ uint64_t ngtcp2_ord_stream_id(int64_t stream_id); -#endif /* NGTCP2_CONV_H */ +#endif /* !defined(NGTCP2_CONV_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_conversion.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_conversion.c deleted file mode 100644 index eb85687a068449..00000000000000 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_conversion.c +++ /dev/null @@ -1,66 +0,0 @@ -/* - * ngtcp2 - * - * Copyright (c) 2023 ngtcp2 contributors - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ -#include "ngtcp2_conversion.h" - -#include -#include - -static void transport_params_copy(int transport_params_version, - ngtcp2_transport_params *dest, - const ngtcp2_transport_params *src) { - assert(transport_params_version != NGTCP2_TRANSPORT_PARAMS_VERSION); - - switch (transport_params_version) { - case NGTCP2_TRANSPORT_PARAMS_V1: - memcpy(dest, src, - offsetof(ngtcp2_transport_params, version_info_present) + - sizeof(src->version_info_present)); - - break; - } -} - -const ngtcp2_transport_params * -ngtcp2_transport_params_convert_to_latest(ngtcp2_transport_params *dest, - int transport_params_version, - const ngtcp2_transport_params *src) { - if (transport_params_version == NGTCP2_TRANSPORT_PARAMS_VERSION) { - return src; - } - - ngtcp2_transport_params_default(dest); - - transport_params_copy(transport_params_version, dest, src); - - return dest; -} - -void ngtcp2_transport_params_convert_to_old( - int transport_params_version, ngtcp2_transport_params *dest, - const ngtcp2_transport_params *src) { - assert(transport_params_version != NGTCP2_TRANSPORT_PARAMS_VERSION); - - transport_params_copy(transport_params_version, dest, src); -} diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_conversion.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_conversion.h deleted file mode 100644 index 3457a8f2053aba..00000000000000 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_conversion.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - * ngtcp2 - * - * Copyright (c) 2023 ngtcp2 contributors - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ -#ifndef NGTCP2_CONVERSION_H -#define NGTCP2_CONVERSION_H - -#ifdef HAVE_CONFIG_H -# include -#endif /* HAVE_CONFIG_H */ - -#include - -/* - * ngtcp2_transport_params_convert_to_latest converts |src| of version - * |transport_params_version| to the latest version - * NGTCP2_TRANSPORT_PARAMS_VERSION. - * - * |dest| must point to the latest version. |src| may be the older - * version, and if so, it may have fewer fields. Accessing those - * fields causes undefined behavior. - * - * If |transport_params_version| == NGTCP2_TRANSPORT_PARAMS_VERSION, - * no conversion is made, and |src| is returned. Otherwise, first - * |dest| is initialized via ngtcp2_transport_params_default, and then - * all valid fields in |src| are copied into |dest|. Finally, |dest| - * is returned. - */ -const ngtcp2_transport_params * -ngtcp2_transport_params_convert_to_latest(ngtcp2_transport_params *dest, - int transport_params_version, - const ngtcp2_transport_params *src); - -/* - * ngtcp2_transport_params_convert_to_old converts |src| of the latest - * version to |dest| of version |transport_params_version|. - * - * |transport_params_version| must not be the latest version - * NGTCP2_TRANSPORT_PARAMS_VERSION. - * - * |dest| points to the older version, and it may have fewer fields. - * Accessing those fields causes undefined behavior. - * - * This function copies all valid fields in version - * |transport_params_version| from |src| to |dest|. - */ -void ngtcp2_transport_params_convert_to_old(int transport_params_version, - ngtcp2_transport_params *dest, - const ngtcp2_transport_params *src); - -#endif /* NGTCP2_CONVERSION_H */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_crypto.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_crypto.c index 0a3ecf6a2440cb..1f74e8c58397b1 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_crypto.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_crypto.c @@ -27,11 +27,7 @@ #include #include -#include "ngtcp2_str.h" -#include "ngtcp2_conv.h" -#include "ngtcp2_conn.h" #include "ngtcp2_net.h" -#include "ngtcp2_conversion.h" int ngtcp2_crypto_km_new(ngtcp2_crypto_km **pckm, const uint8_t *secret, size_t secretlen, @@ -46,9 +42,11 @@ int ngtcp2_crypto_km_new(ngtcp2_crypto_km **pckm, const uint8_t *secret, if (secretlen) { memcpy((*pckm)->secret.base, secret, secretlen); } + if (aead_ctx) { (*pckm)->aead_ctx = *aead_ctx; } + memcpy((*pckm)->iv.base, iv, ivlen); return 0; @@ -85,825 +83,30 @@ void ngtcp2_crypto_km_del(ngtcp2_crypto_km *ckm, const ngtcp2_mem *mem) { return; } + if (ckm->secret.len) { +#ifdef WIN32 + SecureZeroMemory(ckm->secret.base, ckm->secret.len); +#elif defined(HAVE_EXPLICIT_BZERO) + explicit_bzero(ckm->secret.base, ckm->secret.len); +#elif defined(HAVE_MEMSET_S) + memset_s(ckm->secret.base, ckm->secret.len, 0, ckm->secret.len); +#endif /* defined(HAVE_MEMSET_S) */ + } + ngtcp2_mem_free(mem, ckm); } void ngtcp2_crypto_create_nonce(uint8_t *dest, const uint8_t *iv, size_t ivlen, int64_t pkt_num) { - size_t i; uint64_t n; - assert(ivlen >= 8); + assert(ivlen >= sizeof(n)); memcpy(dest, iv, ivlen); - n = ngtcp2_htonl64((uint64_t)pkt_num); - - for (i = 0; i < 8; ++i) { - dest[ivlen - 8 + i] ^= ((uint8_t *)&n)[i]; - } -} - -/* - * varint_paramlen returns the length of a single transport parameter - * which has variable integer in its parameter. - */ -static size_t varint_paramlen(ngtcp2_transport_param_id id, uint64_t param) { - size_t valuelen = ngtcp2_put_uvarintlen(param); - return ngtcp2_put_uvarintlen(id) + ngtcp2_put_uvarintlen(valuelen) + valuelen; -} - -/* - * write_varint_param writes parameter |id| of the given |value| in - * varint encoding. It returns p + the number of bytes written. - */ -static uint8_t *write_varint_param(uint8_t *p, ngtcp2_transport_param_id id, - uint64_t value) { - p = ngtcp2_put_uvarint(p, id); - p = ngtcp2_put_uvarint(p, ngtcp2_put_uvarintlen(value)); - return ngtcp2_put_uvarint(p, value); -} - -/* - * zero_paramlen returns the length of a single transport parameter - * which has zero length value in its parameter. - */ -static size_t zero_paramlen(ngtcp2_transport_param_id id) { - return ngtcp2_put_uvarintlen(id) + 1; -} - -/* - * write_zero_param writes parameter |id| that has zero length value. - * It returns p + the number of bytes written. - */ -static uint8_t *write_zero_param(uint8_t *p, ngtcp2_transport_param_id id) { - p = ngtcp2_put_uvarint(p, id); - *p++ = 0; - - return p; -} - -/* - * cid_paramlen returns the length of a single transport parameter - * which has |cid| as value. - */ -static size_t cid_paramlen(ngtcp2_transport_param_id id, - const ngtcp2_cid *cid) { - return ngtcp2_put_uvarintlen(id) + ngtcp2_put_uvarintlen(cid->datalen) + - cid->datalen; -} - -/* - * write_cid_param writes parameter |id| of the given |cid|. It - * returns p + the number of bytes written. - */ -static uint8_t *write_cid_param(uint8_t *p, ngtcp2_transport_param_id id, - const ngtcp2_cid *cid) { - assert(cid->datalen == 0 || cid->datalen >= NGTCP2_MIN_CIDLEN); - assert(cid->datalen <= NGTCP2_MAX_CIDLEN); - - p = ngtcp2_put_uvarint(p, id); - p = ngtcp2_put_uvarint(p, cid->datalen); - if (cid->datalen) { - p = ngtcp2_cpymem(p, cid->data, cid->datalen); - } - return p; -} - -static const uint8_t empty_address[16]; - -ngtcp2_ssize ngtcp2_transport_params_encode_versioned( - uint8_t *dest, size_t destlen, int transport_params_version, - const ngtcp2_transport_params *params) { - uint8_t *p; - size_t len = 0; - /* For some reason, gcc 7.3.0 requires this initialization. */ - size_t preferred_addrlen = 0; - size_t version_infolen = 0; - const ngtcp2_sockaddr_in *sa_in; - const ngtcp2_sockaddr_in6 *sa_in6; - ngtcp2_transport_params paramsbuf; - - params = ngtcp2_transport_params_convert_to_latest( - ¶msbuf, transport_params_version, params); - - if (params->original_dcid_present) { - len += - cid_paramlen(NGTCP2_TRANSPORT_PARAM_ORIGINAL_DESTINATION_CONNECTION_ID, - ¶ms->original_dcid); - } - - if (params->stateless_reset_token_present) { - len += ngtcp2_put_uvarintlen(NGTCP2_TRANSPORT_PARAM_STATELESS_RESET_TOKEN) + - ngtcp2_put_uvarintlen(NGTCP2_STATELESS_RESET_TOKENLEN) + - NGTCP2_STATELESS_RESET_TOKENLEN; - } - - if (params->preferred_addr_present) { - assert(params->preferred_addr.cid.datalen >= NGTCP2_MIN_CIDLEN); - assert(params->preferred_addr.cid.datalen <= NGTCP2_MAX_CIDLEN); - preferred_addrlen = 4 /* ipv4Address */ + 2 /* ipv4Port */ + - 16 /* ipv6Address */ + 2 /* ipv6Port */ - + 1 + params->preferred_addr.cid.datalen /* CID */ + - NGTCP2_STATELESS_RESET_TOKENLEN; - len += ngtcp2_put_uvarintlen(NGTCP2_TRANSPORT_PARAM_PREFERRED_ADDRESS) + - ngtcp2_put_uvarintlen(preferred_addrlen) + preferred_addrlen; - } - if (params->retry_scid_present) { - len += cid_paramlen(NGTCP2_TRANSPORT_PARAM_RETRY_SOURCE_CONNECTION_ID, - ¶ms->retry_scid); - } - - if (params->initial_scid_present) { - len += cid_paramlen(NGTCP2_TRANSPORT_PARAM_INITIAL_SOURCE_CONNECTION_ID, - ¶ms->initial_scid); - } - - if (params->initial_max_stream_data_bidi_local) { - len += varint_paramlen( - NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_BIDI_LOCAL, - params->initial_max_stream_data_bidi_local); - } - if (params->initial_max_stream_data_bidi_remote) { - len += varint_paramlen( - NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_BIDI_REMOTE, - params->initial_max_stream_data_bidi_remote); - } - if (params->initial_max_stream_data_uni) { - len += varint_paramlen(NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_UNI, - params->initial_max_stream_data_uni); - } - if (params->initial_max_data) { - len += varint_paramlen(NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_DATA, - params->initial_max_data); - } - if (params->initial_max_streams_bidi) { - len += varint_paramlen(NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAMS_BIDI, - params->initial_max_streams_bidi); - } - if (params->initial_max_streams_uni) { - len += varint_paramlen(NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAMS_UNI, - params->initial_max_streams_uni); - } - if (params->max_udp_payload_size != - NGTCP2_DEFAULT_MAX_RECV_UDP_PAYLOAD_SIZE) { - len += varint_paramlen(NGTCP2_TRANSPORT_PARAM_MAX_UDP_PAYLOAD_SIZE, - params->max_udp_payload_size); - } - if (params->ack_delay_exponent != NGTCP2_DEFAULT_ACK_DELAY_EXPONENT) { - len += varint_paramlen(NGTCP2_TRANSPORT_PARAM_ACK_DELAY_EXPONENT, - params->ack_delay_exponent); - } - if (params->disable_active_migration) { - len += zero_paramlen(NGTCP2_TRANSPORT_PARAM_DISABLE_ACTIVE_MIGRATION); - } - if (params->max_ack_delay != NGTCP2_DEFAULT_MAX_ACK_DELAY) { - len += varint_paramlen(NGTCP2_TRANSPORT_PARAM_MAX_ACK_DELAY, - params->max_ack_delay / NGTCP2_MILLISECONDS); - } - if (params->max_idle_timeout) { - len += varint_paramlen(NGTCP2_TRANSPORT_PARAM_MAX_IDLE_TIMEOUT, - params->max_idle_timeout / NGTCP2_MILLISECONDS); - } - if (params->active_connection_id_limit && - params->active_connection_id_limit != - NGTCP2_DEFAULT_ACTIVE_CONNECTION_ID_LIMIT) { - len += varint_paramlen(NGTCP2_TRANSPORT_PARAM_ACTIVE_CONNECTION_ID_LIMIT, - params->active_connection_id_limit); - } - if (params->max_datagram_frame_size) { - len += varint_paramlen(NGTCP2_TRANSPORT_PARAM_MAX_DATAGRAM_FRAME_SIZE, - params->max_datagram_frame_size); - } - if (params->grease_quic_bit) { - len += zero_paramlen(NGTCP2_TRANSPORT_PARAM_GREASE_QUIC_BIT); - } - if (params->version_info_present) { - version_infolen = - sizeof(uint32_t) + params->version_info.available_versionslen; - len += ngtcp2_put_uvarintlen(NGTCP2_TRANSPORT_PARAM_VERSION_INFORMATION) + - ngtcp2_put_uvarintlen(version_infolen) + version_infolen; - } - - if (dest == NULL && destlen == 0) { - return (ngtcp2_ssize)len; - } - - if (destlen < len) { - return NGTCP2_ERR_NOBUF; - } - - p = dest; - - if (params->original_dcid_present) { - p = write_cid_param( - p, NGTCP2_TRANSPORT_PARAM_ORIGINAL_DESTINATION_CONNECTION_ID, - ¶ms->original_dcid); - } - - if (params->stateless_reset_token_present) { - p = ngtcp2_put_uvarint(p, NGTCP2_TRANSPORT_PARAM_STATELESS_RESET_TOKEN); - p = ngtcp2_put_uvarint(p, sizeof(params->stateless_reset_token)); - p = ngtcp2_cpymem(p, params->stateless_reset_token, - sizeof(params->stateless_reset_token)); - } - - if (params->preferred_addr_present) { - p = ngtcp2_put_uvarint(p, NGTCP2_TRANSPORT_PARAM_PREFERRED_ADDRESS); - p = ngtcp2_put_uvarint(p, preferred_addrlen); - - if (params->preferred_addr.ipv4_present) { - sa_in = ¶ms->preferred_addr.ipv4; - p = ngtcp2_cpymem(p, &sa_in->sin_addr, sizeof(sa_in->sin_addr)); - p = ngtcp2_put_uint16(p, sa_in->sin_port); - } else { - p = ngtcp2_cpymem(p, empty_address, sizeof(sa_in->sin_addr)); - p = ngtcp2_put_uint16(p, 0); - } - - if (params->preferred_addr.ipv6_present) { - sa_in6 = ¶ms->preferred_addr.ipv6; - p = ngtcp2_cpymem(p, &sa_in6->sin6_addr, sizeof(sa_in6->sin6_addr)); - p = ngtcp2_put_uint16(p, sa_in6->sin6_port); - } else { - p = ngtcp2_cpymem(p, empty_address, sizeof(sa_in6->sin6_addr)); - p = ngtcp2_put_uint16(p, 0); - } - - *p++ = (uint8_t)params->preferred_addr.cid.datalen; - if (params->preferred_addr.cid.datalen) { - p = ngtcp2_cpymem(p, params->preferred_addr.cid.data, - params->preferred_addr.cid.datalen); - } - p = ngtcp2_cpymem(p, params->preferred_addr.stateless_reset_token, - sizeof(params->preferred_addr.stateless_reset_token)); - } - - if (params->retry_scid_present) { - p = write_cid_param(p, NGTCP2_TRANSPORT_PARAM_RETRY_SOURCE_CONNECTION_ID, - ¶ms->retry_scid); - } - - if (params->initial_scid_present) { - p = write_cid_param(p, NGTCP2_TRANSPORT_PARAM_INITIAL_SOURCE_CONNECTION_ID, - ¶ms->initial_scid); - } - - if (params->initial_max_stream_data_bidi_local) { - p = write_varint_param( - p, NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_BIDI_LOCAL, - params->initial_max_stream_data_bidi_local); - } - - if (params->initial_max_stream_data_bidi_remote) { - p = write_varint_param( - p, NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_BIDI_REMOTE, - params->initial_max_stream_data_bidi_remote); - } - - if (params->initial_max_stream_data_uni) { - p = write_varint_param(p, - NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_UNI, - params->initial_max_stream_data_uni); - } - - if (params->initial_max_data) { - p = write_varint_param(p, NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_DATA, - params->initial_max_data); - } - - if (params->initial_max_streams_bidi) { - p = write_varint_param(p, NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAMS_BIDI, - params->initial_max_streams_bidi); - } - - if (params->initial_max_streams_uni) { - p = write_varint_param(p, NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAMS_UNI, - params->initial_max_streams_uni); - } - - if (params->max_udp_payload_size != - NGTCP2_DEFAULT_MAX_RECV_UDP_PAYLOAD_SIZE) { - p = write_varint_param(p, NGTCP2_TRANSPORT_PARAM_MAX_UDP_PAYLOAD_SIZE, - params->max_udp_payload_size); - } - - if (params->ack_delay_exponent != NGTCP2_DEFAULT_ACK_DELAY_EXPONENT) { - p = write_varint_param(p, NGTCP2_TRANSPORT_PARAM_ACK_DELAY_EXPONENT, - params->ack_delay_exponent); - } - - if (params->disable_active_migration) { - p = write_zero_param(p, NGTCP2_TRANSPORT_PARAM_DISABLE_ACTIVE_MIGRATION); - } - - if (params->max_ack_delay != NGTCP2_DEFAULT_MAX_ACK_DELAY) { - p = write_varint_param(p, NGTCP2_TRANSPORT_PARAM_MAX_ACK_DELAY, - params->max_ack_delay / NGTCP2_MILLISECONDS); - } - - if (params->max_idle_timeout) { - p = write_varint_param(p, NGTCP2_TRANSPORT_PARAM_MAX_IDLE_TIMEOUT, - params->max_idle_timeout / NGTCP2_MILLISECONDS); - } - - if (params->active_connection_id_limit && - params->active_connection_id_limit != - NGTCP2_DEFAULT_ACTIVE_CONNECTION_ID_LIMIT) { - p = write_varint_param(p, NGTCP2_TRANSPORT_PARAM_ACTIVE_CONNECTION_ID_LIMIT, - params->active_connection_id_limit); - } - - if (params->max_datagram_frame_size) { - p = write_varint_param(p, NGTCP2_TRANSPORT_PARAM_MAX_DATAGRAM_FRAME_SIZE, - params->max_datagram_frame_size); - } - - if (params->grease_quic_bit) { - p = write_zero_param(p, NGTCP2_TRANSPORT_PARAM_GREASE_QUIC_BIT); - } - - if (params->version_info_present) { - p = ngtcp2_put_uvarint(p, NGTCP2_TRANSPORT_PARAM_VERSION_INFORMATION); - p = ngtcp2_put_uvarint(p, version_infolen); - p = ngtcp2_put_uint32be(p, params->version_info.chosen_version); - if (params->version_info.available_versionslen) { - p = ngtcp2_cpymem(p, params->version_info.available_versions, - params->version_info.available_versionslen); - } - } - - assert((size_t)(p - dest) == len); - - return (ngtcp2_ssize)len; -} - -/* - * decode_varint decodes a single varint from the buffer pointed by - * |*pp| of length |end - *pp|. If it decodes an integer - * successfully, it stores the integer in |*pdest|, increment |*pp| by - * the number of bytes read from |*pp|, and returns 0. Otherwise it - * returns -1. - */ -static int decode_varint(uint64_t *pdest, const uint8_t **pp, - const uint8_t *end) { - const uint8_t *p = *pp; - size_t len; - - if (p == end) { - return -1; - } - - len = ngtcp2_get_uvarintlen(p); - if ((uint64_t)(end - p) < len) { - return -1; - } - - *pp = ngtcp2_get_uvarint(pdest, p); - - return 0; -} - -/* - * decode_varint_param decodes length prefixed value from the buffer - * pointed by |*pp| of length |end - *pp|. The length and value are - * encoded in varint form. If it decodes a value successfully, it - * stores the value in |*pdest|, increment |*pp| by the number of - * bytes read from |*pp|, and returns 0. Otherwise it returns -1. - */ -static int decode_varint_param(uint64_t *pdest, const uint8_t **pp, - const uint8_t *end) { - const uint8_t *p = *pp; - uint64_t valuelen; - - if (decode_varint(&valuelen, &p, end) != 0) { - return -1; - } - - if (p == end) { - return -1; - } - - if ((uint64_t)(end - p) < valuelen) { - return -1; - } - - if (ngtcp2_get_uvarintlen(p) != valuelen) { - return -1; - } - - *pp = ngtcp2_get_uvarint(pdest, p); - - return 0; -} - -/* - * decode_zero_param decodes zero length value from the buffer pointed - * by |*pp| of length |end - *pp|. The length is encoded in varint - * form. If it decodes zero length value successfully, it increments - * |*pp| by 1, and returns 0. Otherwise it returns -1. - */ -static int decode_zero_param(const uint8_t **pp, const uint8_t *end) { - if (*pp == end || **pp != 0) { - return -1; - } - - ++*pp; - - return 0; -} - -/* - * decode_cid_param decodes length prefixed ngtcp2_cid from the buffer - * pointed by |*pp| of length |end - *pp|. The length is encoded in - * varint form. If it decodes a value successfully, it stores the - * value in |*pdest|, increment |*pp| by the number of read from - * |*pp|, and returns the number of bytes read. Otherwise it returns - * the one of the negative error code: - * - * NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM - * Could not decode Connection ID. - */ -static int decode_cid_param(ngtcp2_cid *pdest, const uint8_t **pp, - const uint8_t *end) { - const uint8_t *p = *pp; - uint64_t valuelen; - - if (decode_varint(&valuelen, &p, end) != 0) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - - if ((valuelen != 0 && valuelen < NGTCP2_MIN_CIDLEN) || - valuelen > NGTCP2_MAX_CIDLEN || (size_t)(end - p) < valuelen) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - - ngtcp2_cid_init(pdest, p, (size_t)valuelen); - - p += valuelen; - - *pp = p; - - return 0; -} - -int ngtcp2_transport_params_decode_versioned(int transport_params_version, - ngtcp2_transport_params *dest, - const uint8_t *data, - size_t datalen) { - const uint8_t *p, *end, *lend; - size_t len; - uint64_t param_type; - uint64_t valuelen; - int rv; - ngtcp2_sockaddr_in *sa_in; - ngtcp2_sockaddr_in6 *sa_in6; - uint32_t version; - ngtcp2_transport_params *params, paramsbuf; - if (transport_params_version == NGTCP2_TRANSPORT_PARAMS_VERSION) { - params = dest; - } else { - params = ¶msbuf; - } - - /* Set default values */ - memset(params, 0, sizeof(*params)); - params->original_dcid_present = 0; - params->initial_scid_present = 0; - params->initial_max_streams_bidi = 0; - params->initial_max_streams_uni = 0; - params->initial_max_stream_data_bidi_local = 0; - params->initial_max_stream_data_bidi_remote = 0; - params->initial_max_stream_data_uni = 0; - params->max_udp_payload_size = NGTCP2_DEFAULT_MAX_RECV_UDP_PAYLOAD_SIZE; - params->ack_delay_exponent = NGTCP2_DEFAULT_ACK_DELAY_EXPONENT; - params->stateless_reset_token_present = 0; - params->preferred_addr_present = 0; - params->disable_active_migration = 0; - params->max_ack_delay = NGTCP2_DEFAULT_MAX_ACK_DELAY; - params->max_idle_timeout = 0; - params->active_connection_id_limit = - NGTCP2_DEFAULT_ACTIVE_CONNECTION_ID_LIMIT; - params->retry_scid_present = 0; - params->max_datagram_frame_size = 0; - memset(¶ms->retry_scid, 0, sizeof(params->retry_scid)); - memset(¶ms->initial_scid, 0, sizeof(params->initial_scid)); - memset(¶ms->original_dcid, 0, sizeof(params->original_dcid)); - params->version_info_present = 0; - - p = data; - end = data + datalen; - - for (; (size_t)(end - p) >= 2;) { - if (decode_varint(¶m_type, &p, end) != 0) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - - switch (param_type) { - case NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_BIDI_LOCAL: - if (decode_varint_param(¶ms->initial_max_stream_data_bidi_local, &p, - end) != 0) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - break; - case NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_BIDI_REMOTE: - if (decode_varint_param(¶ms->initial_max_stream_data_bidi_remote, &p, - end) != 0) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - break; - case NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_UNI: - if (decode_varint_param(¶ms->initial_max_stream_data_uni, &p, end) != - 0) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - break; - case NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_DATA: - if (decode_varint_param(¶ms->initial_max_data, &p, end) != 0) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - break; - case NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAMS_BIDI: - if (decode_varint_param(¶ms->initial_max_streams_bidi, &p, end) != - 0) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - if (params->initial_max_streams_bidi > NGTCP2_MAX_STREAMS) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - break; - case NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAMS_UNI: - if (decode_varint_param(¶ms->initial_max_streams_uni, &p, end) != 0) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - if (params->initial_max_streams_uni > NGTCP2_MAX_STREAMS) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - break; - case NGTCP2_TRANSPORT_PARAM_MAX_IDLE_TIMEOUT: - if (decode_varint_param(¶ms->max_idle_timeout, &p, end) != 0) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - params->max_idle_timeout *= NGTCP2_MILLISECONDS; - break; - case NGTCP2_TRANSPORT_PARAM_MAX_UDP_PAYLOAD_SIZE: - if (decode_varint_param(¶ms->max_udp_payload_size, &p, end) != 0) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - break; - case NGTCP2_TRANSPORT_PARAM_STATELESS_RESET_TOKEN: - if (decode_varint(&valuelen, &p, end) != 0) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - if ((size_t)valuelen != sizeof(params->stateless_reset_token)) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - if ((size_t)(end - p) < sizeof(params->stateless_reset_token)) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - - p = ngtcp2_get_bytes(params->stateless_reset_token, p, - sizeof(params->stateless_reset_token)); - params->stateless_reset_token_present = 1; - - break; - case NGTCP2_TRANSPORT_PARAM_ACK_DELAY_EXPONENT: - if (decode_varint_param(¶ms->ack_delay_exponent, &p, end) != 0) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - if (params->ack_delay_exponent > 20) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - break; - case NGTCP2_TRANSPORT_PARAM_PREFERRED_ADDRESS: - if (decode_varint(&valuelen, &p, end) != 0) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - if ((size_t)(end - p) < valuelen) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - len = 4 /* ipv4Address */ + 2 /* ipv4Port */ + 16 /* ipv6Address */ + - 2 /* ipv6Port */ - + 1 /* cid length */ + NGTCP2_STATELESS_RESET_TOKENLEN; - if (valuelen < len) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - - sa_in = ¶ms->preferred_addr.ipv4; - - p = ngtcp2_get_bytes(&sa_in->sin_addr, p, sizeof(sa_in->sin_addr)); - p = ngtcp2_get_uint16be(&sa_in->sin_port, p); - - if (sa_in->sin_port || memcmp(empty_address, &sa_in->sin_addr, - sizeof(sa_in->sin_addr)) != 0) { - sa_in->sin_family = NGTCP2_AF_INET; - params->preferred_addr.ipv4_present = 1; - } - - sa_in6 = ¶ms->preferred_addr.ipv6; - - p = ngtcp2_get_bytes(&sa_in6->sin6_addr, p, sizeof(sa_in6->sin6_addr)); - p = ngtcp2_get_uint16be(&sa_in6->sin6_port, p); - - if (sa_in6->sin6_port || memcmp(empty_address, &sa_in6->sin6_addr, - sizeof(sa_in6->sin6_addr)) != 0) { - sa_in6->sin6_family = NGTCP2_AF_INET6; - params->preferred_addr.ipv6_present = 1; - } - - /* cid */ - params->preferred_addr.cid.datalen = *p++; - len += params->preferred_addr.cid.datalen; - if (valuelen != len || - params->preferred_addr.cid.datalen > NGTCP2_MAX_CIDLEN || - params->preferred_addr.cid.datalen < NGTCP2_MIN_CIDLEN) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - if (params->preferred_addr.cid.datalen) { - p = ngtcp2_get_bytes(params->preferred_addr.cid.data, p, - params->preferred_addr.cid.datalen); - } - - /* stateless reset token */ - p = ngtcp2_get_bytes( - params->preferred_addr.stateless_reset_token, p, - sizeof(params->preferred_addr.stateless_reset_token)); - params->preferred_addr_present = 1; - break; - case NGTCP2_TRANSPORT_PARAM_DISABLE_ACTIVE_MIGRATION: - if (decode_zero_param(&p, end) != 0) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - params->disable_active_migration = 1; - break; - case NGTCP2_TRANSPORT_PARAM_ORIGINAL_DESTINATION_CONNECTION_ID: - rv = decode_cid_param(¶ms->original_dcid, &p, end); - if (rv != 0) { - return rv; - } - params->original_dcid_present = 1; - break; - case NGTCP2_TRANSPORT_PARAM_RETRY_SOURCE_CONNECTION_ID: - rv = decode_cid_param(¶ms->retry_scid, &p, end); - if (rv != 0) { - return rv; - } - params->retry_scid_present = 1; - break; - case NGTCP2_TRANSPORT_PARAM_INITIAL_SOURCE_CONNECTION_ID: - rv = decode_cid_param(¶ms->initial_scid, &p, end); - if (rv != 0) { - return rv; - } - params->initial_scid_present = 1; - break; - case NGTCP2_TRANSPORT_PARAM_MAX_ACK_DELAY: - if (decode_varint_param(¶ms->max_ack_delay, &p, end) != 0) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - if (params->max_ack_delay >= 16384) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - params->max_ack_delay *= NGTCP2_MILLISECONDS; - break; - case NGTCP2_TRANSPORT_PARAM_ACTIVE_CONNECTION_ID_LIMIT: - if (decode_varint_param(¶ms->active_connection_id_limit, &p, end) != - 0) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - break; - case NGTCP2_TRANSPORT_PARAM_MAX_DATAGRAM_FRAME_SIZE: - if (decode_varint_param(¶ms->max_datagram_frame_size, &p, end) != 0) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - break; - case NGTCP2_TRANSPORT_PARAM_GREASE_QUIC_BIT: - if (decode_zero_param(&p, end) != 0) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - params->grease_quic_bit = 1; - break; - case NGTCP2_TRANSPORT_PARAM_VERSION_INFORMATION: - if (decode_varint(&valuelen, &p, end) != 0) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - if ((size_t)(end - p) < valuelen) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - if (valuelen < sizeof(uint32_t) || (valuelen & 0x3)) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - p = ngtcp2_get_uint32(¶ms->version_info.chosen_version, p); - if (params->version_info.chosen_version == 0) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - if (valuelen > sizeof(uint32_t)) { - params->version_info.available_versions = (uint8_t *)p; - params->version_info.available_versionslen = - (size_t)valuelen - sizeof(uint32_t); - - for (lend = p + (valuelen - sizeof(uint32_t)); p != lend;) { - p = ngtcp2_get_uint32(&version, p); - if (version == 0) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - } - } - params->version_info_present = 1; - break; - default: - /* Ignore unknown parameter */ - if (decode_varint(&valuelen, &p, end) != 0) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - if ((size_t)(end - p) < valuelen) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - p += valuelen; - break; - } - } - - if (end - p != 0) { - return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; - } - - if (transport_params_version != NGTCP2_TRANSPORT_PARAMS_VERSION) { - ngtcp2_transport_params_convert_to_old(transport_params_version, dest, - params); - } - - return 0; -} - -static int transport_params_copy_new(ngtcp2_transport_params **pdest, - const ngtcp2_transport_params *src, - const ngtcp2_mem *mem) { - size_t len = sizeof(**pdest); - ngtcp2_transport_params *dest; - uint8_t *p; - - if (src->version_info_present) { - len += src->version_info.available_versionslen; - } - - dest = ngtcp2_mem_malloc(mem, len); - if (dest == NULL) { - return NGTCP2_ERR_NOMEM; - } - - *dest = *src; - - if (src->version_info_present && src->version_info.available_versionslen) { - p = (uint8_t *)dest + sizeof(*dest); - memcpy(p, src->version_info.available_versions, - src->version_info.available_versionslen); - dest->version_info.available_versions = p; - } - - *pdest = dest; - - return 0; -} - -int ngtcp2_transport_params_decode_new(ngtcp2_transport_params **pparams, - const uint8_t *data, size_t datalen, - const ngtcp2_mem *mem) { - int rv; - ngtcp2_transport_params params; - - rv = ngtcp2_transport_params_decode(¶ms, data, datalen); - if (rv < 0) { - return rv; - } - - if (mem == NULL) { - mem = ngtcp2_mem_default(); - } - - return transport_params_copy_new(pparams, ¶ms, mem); -} - -void ngtcp2_transport_params_del(ngtcp2_transport_params *params, - const ngtcp2_mem *mem) { - if (params == NULL) { - return; - } - - if (mem == NULL) { - mem = ngtcp2_mem_default(); - } - - ngtcp2_mem_free(mem, params); -} - -int ngtcp2_transport_params_copy_new(ngtcp2_transport_params **pdest, - const ngtcp2_transport_params *src, - const ngtcp2_mem *mem) { - if (src == NULL) { - *pdest = NULL; - return 0; - } + dest += ivlen - sizeof(n); - return transport_params_copy_new(pdest, src, mem); + memcpy(&n, dest, sizeof(n)); + n ^= ngtcp2_htonl64((uint64_t)pkt_num); + memcpy(dest, &n, sizeof(n)); } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_crypto.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_crypto.h index b78429bb38f582..ca6d494846f324 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_crypto.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_crypto.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -38,36 +38,9 @@ bytes. */ #define NGTCP2_INITIAL_AEAD_OVERHEAD 16 -/* NGTCP2_MAX_AEAD_OVERHEAD is expected maximum AEAD overhead. */ +/* NGTCP2_MAX_AEAD_OVERHEAD is the maximum AEAD overhead. */ #define NGTCP2_MAX_AEAD_OVERHEAD 16 -/* ngtcp2_transport_param_id is the registry of QUIC transport - parameter ID. */ -typedef uint64_t ngtcp2_transport_param_id; - -#define NGTCP2_TRANSPORT_PARAM_ORIGINAL_DESTINATION_CONNECTION_ID 0x00 -#define NGTCP2_TRANSPORT_PARAM_MAX_IDLE_TIMEOUT 0x01 -#define NGTCP2_TRANSPORT_PARAM_STATELESS_RESET_TOKEN 0x02 -#define NGTCP2_TRANSPORT_PARAM_MAX_UDP_PAYLOAD_SIZE 0x03 -#define NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_DATA 0x04 -#define NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_BIDI_LOCAL 0x05 -#define NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_BIDI_REMOTE 0x06 -#define NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_UNI 0x07 -#define NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAMS_BIDI 0x08 -#define NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAMS_UNI 0x09 -#define NGTCP2_TRANSPORT_PARAM_ACK_DELAY_EXPONENT 0x0a -#define NGTCP2_TRANSPORT_PARAM_MAX_ACK_DELAY 0x0b -#define NGTCP2_TRANSPORT_PARAM_DISABLE_ACTIVE_MIGRATION 0x0c -#define NGTCP2_TRANSPORT_PARAM_PREFERRED_ADDRESS 0x0d -#define NGTCP2_TRANSPORT_PARAM_ACTIVE_CONNECTION_ID_LIMIT 0x0e -#define NGTCP2_TRANSPORT_PARAM_INITIAL_SOURCE_CONNECTION_ID 0x0f -#define NGTCP2_TRANSPORT_PARAM_RETRY_SOURCE_CONNECTION_ID 0x10 -/* https://datatracker.ietf.org/doc/html/rfc9221 */ -#define NGTCP2_TRANSPORT_PARAM_MAX_DATAGRAM_FRAME_SIZE 0x20 -#define NGTCP2_TRANSPORT_PARAM_GREASE_QUIC_BIT 0x2ab2 -/* https://datatracker.ietf.org/doc/html/rfc9368 */ -#define NGTCP2_TRANSPORT_PARAM_VERSION_INFORMATION 0x11 - /* NGTCP2_CRYPTO_KM_FLAG_NONE indicates that no flag is set. */ #define NGTCP2_CRYPTO_KM_FLAG_NONE 0x00u /* NGTCP2_CRYPTO_KM_FLAG_KEY_PHASE_ONE is set if key phase bit is @@ -83,8 +56,7 @@ typedef struct ngtcp2_crypto_km { a packet. For decryption key, it is the lowest packet number of a packet which can be decrypted with this keying material. */ int64_t pkt_num; - /* use_count is the number of encryption applied with this key. - This field is only used for tx key. */ + /* use_count is the number of encryption applied with this key. */ uint64_t use_count; /* flags is the bitwise OR of zero or more of NGTCP2_CRYPTO_KM_FLAG_*. */ @@ -92,12 +64,12 @@ typedef struct ngtcp2_crypto_km { } ngtcp2_crypto_km; /* - * ngtcp2_crypto_km_new creates new ngtcp2_crypto_km object and + * ngtcp2_crypto_km_new creates new ngtcp2_crypto_km object, and * assigns its pointer to |*pckm|. The |secret| of length - * |secretlen|, the |key| of length |keylen| and the |iv| of length - * |ivlen| are copied to |*pckm|. If |secretlen| == 0, the function - * assumes no secret is given which is acceptable. The sole reason to - * store secret is update keys. Only 1RTT key can be updated. + * |secretlen|, |aead_ctx|, and the |iv| of length |ivlen| are copied + * to |*pckm|. If |secretlen| == 0, the function assumes no secret is + * given which is acceptable. The sole reason to store secret is + * update keys. Only 1RTT key can be updated. */ int ngtcp2_crypto_km_new(ngtcp2_crypto_km **pckm, const uint8_t *secret, size_t secretlen, @@ -107,7 +79,7 @@ int ngtcp2_crypto_km_new(ngtcp2_crypto_km **pckm, const uint8_t *secret, /* * ngtcp2_crypto_km_nocopy_new is similar to ngtcp2_crypto_km_new, but - * it does not copy secret, key and IV. + * it does not copy secret, aead context, and IV. */ int ngtcp2_crypto_km_nocopy_new(ngtcp2_crypto_km **pckm, size_t secretlen, size_t ivlen, const ngtcp2_mem *mem); @@ -127,21 +99,4 @@ typedef struct ngtcp2_crypto_cc { void ngtcp2_crypto_create_nonce(uint8_t *dest, const uint8_t *iv, size_t ivlen, int64_t pkt_num); -/* - * ngtcp2_transport_params_copy_new makes a copy of |src|, and assigns - * it to |*pdest|. If |src| is NULL, NULL is assigned to |*pdest|. - * - * Caller is responsible to call ngtcp2_transport_params_del to free - * the memory assigned to |*pdest|. - * - * This function returns 0 if it succeeds, or one of the following - * negative error codes: - * - * NGTCP2_ERR_NOMEM - * Out of memory. - */ -int ngtcp2_transport_params_copy_new(ngtcp2_transport_params **pdest, - const ngtcp2_transport_params *src, - const ngtcp2_mem *mem); - -#endif /* NGTCP2_CRYPTO_H */ +#endif /* !defined(NGTCP2_CRYPTO_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_err.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_err.h index 9229f5425a63cf..44527b11bdec47 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_err.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_err.h @@ -27,8 +27,8 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include -#endif /* NGTCP2_ERR_H */ +#endif /* !defined(NGTCP2_ERR_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_frame_chain.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_frame_chain.c index 41c2a6a755cc8a..6a8a22c3f0d010 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_frame_chain.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_frame_chain.c @@ -27,7 +27,7 @@ #include #include -ngtcp2_objalloc_def(frame_chain, ngtcp2_frame_chain, oplent); +ngtcp2_objalloc_def(frame_chain, ngtcp2_frame_chain, oplent) int ngtcp2_frame_chain_new(ngtcp2_frame_chain **pfrc, const ngtcp2_mem *mem) { *pfrc = ngtcp2_mem_malloc(mem, sizeof(ngtcp2_frame_chain)); @@ -68,14 +68,11 @@ int ngtcp2_frame_chain_stream_datacnt_objalloc_new(ngtcp2_frame_chain **pfrc, size_t datacnt, ngtcp2_objalloc *objalloc, const ngtcp2_mem *mem) { - size_t need, avail = sizeof(ngtcp2_frame) - sizeof(ngtcp2_stream); - - if (datacnt > 1) { - need = sizeof(ngtcp2_vec) * (datacnt - 1); - - if (need > avail) { - return ngtcp2_frame_chain_extralen_new(pfrc, need - avail, mem); - } + if (datacnt > NGTCP2_FRAME_CHAIN_STREAM_DATACNT_THRES) { + return ngtcp2_frame_chain_extralen_new(pfrc, + sizeof(ngtcp2_vec) * (datacnt - 1) - + NGTCP2_FRAME_CHAIN_STREAM_AVAIL, + mem); } return ngtcp2_frame_chain_objalloc_new(pfrc, objalloc); @@ -139,9 +136,7 @@ void ngtcp2_frame_chain_objalloc_del(ngtcp2_frame_chain *frc, switch (frc->fr.type) { case NGTCP2_FRAME_CRYPTO: case NGTCP2_FRAME_STREAM: - if (frc->fr.stream.datacnt && - sizeof(ngtcp2_vec) * (frc->fr.stream.datacnt - 1) > - sizeof(ngtcp2_frame) - sizeof(ngtcp2_stream)) { + if (frc->fr.stream.datacnt > NGTCP2_FRAME_CHAIN_STREAM_DATACNT_THRES) { ngtcp2_frame_chain_del(frc, mem); return; diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_frame_chain.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_frame_chain.h index 656fa5b799450e..e5b6779c0f03c2 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_frame_chain.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_frame_chain.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -74,7 +74,7 @@ struct ngtcp2_frame_chain { }; }; -ngtcp2_objalloc_decl(frame_chain, ngtcp2_frame_chain, oplent); +ngtcp2_objalloc_decl(frame_chain, ngtcp2_frame_chain, oplent) /* * ngtcp2_bind_frame_chains binds two frame chains |a| and |b| using @@ -121,12 +121,29 @@ int ngtcp2_frame_chain_objalloc_new(ngtcp2_frame_chain **pfrc, int ngtcp2_frame_chain_extralen_new(ngtcp2_frame_chain **pfrc, size_t extralen, const ngtcp2_mem *mem); +/* NGTCP2_FRAME_CHAIN_STREAM_AVAIL is the number of additional bytes + available after ngtcp2_stream when it is embedded in + ngtcp2_frame. */ +#define NGTCP2_FRAME_CHAIN_STREAM_AVAIL \ + (sizeof(ngtcp2_frame) - sizeof(ngtcp2_stream)) + +/* NGTCP2_FRAME_CHAIN_STREAM_DATACNT_THRES is the number of datacnt + that changes allocation method. If datacnt is more than this + value, ngtcp2_frame_chain is allocated without ngtcp2_objalloc. + Otherwise, it is allocated using ngtcp2_objalloc. */ +#define NGTCP2_FRAME_CHAIN_STREAM_DATACNT_THRES \ + (NGTCP2_FRAME_CHAIN_STREAM_AVAIL / sizeof(ngtcp2_vec) + 1) + /* * ngtcp2_frame_chain_stream_datacnt_objalloc_new works like * ngtcp2_frame_chain_new, but it allocates enough data to store * additional |datacnt| - 1 ngtcp2_vec object after ngtcp2_stream - * object. If no additional space is required, - * ngtcp2_frame_chain_objalloc_new is called internally. + * object. If no additional space is required, in other words, + * |datacnt| <= NGTCP2_FRAME_CHAIN_STREAM_DATACNT_THRES, + * ngtcp2_frame_chain_objalloc_new is called internally. Otherwise, + * ngtcp2_frame_chain_extralen_new is used and objalloc is not used. + * Therefore, it is important to call ngtcp2_frame_chain_objalloc_del + * without changing datacnt field. */ int ngtcp2_frame_chain_stream_datacnt_objalloc_new(ngtcp2_frame_chain **pfrc, size_t datacnt, @@ -168,4 +185,4 @@ void ngtcp2_frame_chain_list_objalloc_del(ngtcp2_frame_chain *frc, ngtcp2_objalloc *objalloc, const ngtcp2_mem *mem); -#endif /* NGTCP2_FRAME_CHAIN_H */ +#endif /* !defined(NGTCP2_FRAME_CHAIN_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_gaptr.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_gaptr.c index 87c23898e8207d..3bfa398480c382 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_gaptr.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_gaptr.c @@ -28,22 +28,16 @@ #include void ngtcp2_gaptr_init(ngtcp2_gaptr *gaptr, const ngtcp2_mem *mem) { - ngtcp2_ksl_init(&gaptr->gap, ngtcp2_ksl_range_compar, sizeof(ngtcp2_range), - mem); + ngtcp2_ksl_init(&gaptr->gap, ngtcp2_ksl_range_compar, ngtcp2_ksl_range_search, + sizeof(ngtcp2_range), mem); gaptr->mem = mem; } static int gaptr_gap_init(ngtcp2_gaptr *gaptr) { ngtcp2_range range = {0, UINT64_MAX}; - int rv; - - rv = ngtcp2_ksl_insert(&gaptr->gap, NULL, &range, NULL); - if (rv != 0) { - return rv; - } - return 0; + return ngtcp2_ksl_insert(&gaptr->gap, NULL, &range, NULL); } void ngtcp2_gaptr_free(ngtcp2_gaptr *gaptr) { @@ -66,8 +60,8 @@ int ngtcp2_gaptr_push(ngtcp2_gaptr *gaptr, uint64_t offset, uint64_t datalen) { } } - it = ngtcp2_ksl_lower_bound_compar(&gaptr->gap, &q, - ngtcp2_ksl_range_exclusive_compar); + it = ngtcp2_ksl_lower_bound_search(&gaptr->gap, &q, + ngtcp2_ksl_range_exclusive_search); for (; !ngtcp2_ksl_it_end(&it);) { k = *(ngtcp2_range *)ngtcp2_ksl_it_key(&it); @@ -80,7 +74,9 @@ int ngtcp2_gaptr_push(ngtcp2_gaptr *gaptr, uint64_t offset, uint64_t datalen) { ngtcp2_ksl_remove_hint(&gaptr->gap, &it, &it, &k); continue; } + ngtcp2_range_cut(&l, &r, &k, &m); + if (ngtcp2_range_len(&l)) { ngtcp2_ksl_update_key(&gaptr->gap, &k, &l); @@ -93,26 +89,26 @@ int ngtcp2_gaptr_push(ngtcp2_gaptr *gaptr, uint64_t offset, uint64_t datalen) { } else if (ngtcp2_range_len(&r)) { ngtcp2_ksl_update_key(&gaptr->gap, &k, &r); } + ngtcp2_ksl_it_next(&it); } + return 0; } -uint64_t ngtcp2_gaptr_first_gap_offset(ngtcp2_gaptr *gaptr) { +uint64_t ngtcp2_gaptr_first_gap_offset(const ngtcp2_gaptr *gaptr) { ngtcp2_ksl_it it; - ngtcp2_range r; if (ngtcp2_ksl_len(&gaptr->gap) == 0) { return 0; } it = ngtcp2_ksl_begin(&gaptr->gap); - r = *(ngtcp2_range *)ngtcp2_ksl_it_key(&it); - return r.begin; + return ((ngtcp2_range *)ngtcp2_ksl_it_key(&it))->begin; } -ngtcp2_range ngtcp2_gaptr_get_first_gap_after(ngtcp2_gaptr *gaptr, +ngtcp2_range ngtcp2_gaptr_get_first_gap_after(const ngtcp2_gaptr *gaptr, uint64_t offset) { ngtcp2_range q = {offset, offset + 1}; ngtcp2_ksl_it it; @@ -122,29 +118,27 @@ ngtcp2_range ngtcp2_gaptr_get_first_gap_after(ngtcp2_gaptr *gaptr, return r; } - it = ngtcp2_ksl_lower_bound_compar(&gaptr->gap, &q, - ngtcp2_ksl_range_exclusive_compar); + it = ngtcp2_ksl_lower_bound_search(&gaptr->gap, &q, + ngtcp2_ksl_range_exclusive_search); assert(!ngtcp2_ksl_it_end(&it)); return *(ngtcp2_range *)ngtcp2_ksl_it_key(&it); } -int ngtcp2_gaptr_is_pushed(ngtcp2_gaptr *gaptr, uint64_t offset, +int ngtcp2_gaptr_is_pushed(const ngtcp2_gaptr *gaptr, uint64_t offset, uint64_t datalen) { ngtcp2_range q = {offset, offset + datalen}; ngtcp2_ksl_it it; - ngtcp2_range k; ngtcp2_range m; if (ngtcp2_ksl_len(&gaptr->gap) == 0) { return 0; } - it = ngtcp2_ksl_lower_bound_compar(&gaptr->gap, &q, - ngtcp2_ksl_range_exclusive_compar); - k = *(ngtcp2_range *)ngtcp2_ksl_it_key(&it); - m = ngtcp2_range_intersect(&q, &k); + it = ngtcp2_ksl_lower_bound_search(&gaptr->gap, &q, + ngtcp2_ksl_range_exclusive_search); + m = ngtcp2_range_intersect(&q, (ngtcp2_range *)ngtcp2_ksl_it_key(&it)); return ngtcp2_range_len(&m) == 0; } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_gaptr.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_gaptr.h index 0f100a81c4286c..3120676cf849d4 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_gaptr.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_gaptr.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -39,8 +39,9 @@ * ngtcp2_gaptr maintains the gap in the range [0, UINT64_MAX). */ typedef struct ngtcp2_gaptr { - /* gap maintains the range of offset which is not received - yet. Initially, its range is [0, UINT64_MAX). */ + /* gap maintains the range of offset which is not pushed + yet. Initially, its range is [0, UINT64_MAX). "gap" is the range + that is not pushed yet. */ ngtcp2_ksl gap; /* mem is custom memory allocator */ const ngtcp2_mem *mem; @@ -57,8 +58,7 @@ void ngtcp2_gaptr_init(ngtcp2_gaptr *gaptr, const ngtcp2_mem *mem); void ngtcp2_gaptr_free(ngtcp2_gaptr *gaptr); /* - * ngtcp2_gaptr_push adds new data of length |datalen| at the stream - * offset |offset|. + * ngtcp2_gaptr_push pushes the range [offset, offset + datalen). * * This function returns 0 if it succeeds, or one of the following * negative error codes: @@ -72,20 +72,20 @@ int ngtcp2_gaptr_push(ngtcp2_gaptr *gaptr, uint64_t offset, uint64_t datalen); * ngtcp2_gaptr_first_gap_offset returns the offset to the first gap. * If there is no gap, it returns UINT64_MAX. */ -uint64_t ngtcp2_gaptr_first_gap_offset(ngtcp2_gaptr *gaptr); +uint64_t ngtcp2_gaptr_first_gap_offset(const ngtcp2_gaptr *gaptr); /* * ngtcp2_gaptr_get_first_gap_after returns the first gap which - * overlaps or comes after |offset|. + * includes or comes after |offset|. */ -ngtcp2_range ngtcp2_gaptr_get_first_gap_after(ngtcp2_gaptr *gaptr, +ngtcp2_range ngtcp2_gaptr_get_first_gap_after(const ngtcp2_gaptr *gaptr, uint64_t offset); /* * ngtcp2_gaptr_is_pushed returns nonzero if range [offset, offset + * datalen) is completely pushed into this object. */ -int ngtcp2_gaptr_is_pushed(ngtcp2_gaptr *gaptr, uint64_t offset, +int ngtcp2_gaptr_is_pushed(const ngtcp2_gaptr *gaptr, uint64_t offset, uint64_t datalen); /* @@ -95,4 +95,4 @@ int ngtcp2_gaptr_is_pushed(ngtcp2_gaptr *gaptr, uint64_t offset, */ void ngtcp2_gaptr_drop_first_gap(ngtcp2_gaptr *gaptr); -#endif /* NGTCP2_GAPTR_H */ +#endif /* !defined(NGTCP2_GAPTR_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_idtr.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_idtr.c index d9880227690faf..2cf9d3cbfd1393 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_idtr.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_idtr.c @@ -26,10 +26,8 @@ #include -void ngtcp2_idtr_init(ngtcp2_idtr *idtr, int server, const ngtcp2_mem *mem) { +void ngtcp2_idtr_init(ngtcp2_idtr *idtr, const ngtcp2_mem *mem) { ngtcp2_gaptr_init(&idtr->gap, mem); - - idtr->server = server; } void ngtcp2_idtr_free(ngtcp2_idtr *idtr) { @@ -41,8 +39,7 @@ void ngtcp2_idtr_free(ngtcp2_idtr *idtr) { } /* - * id_from_stream_id translates |stream_id| to id space used by - * ngtcp2_idtr. + * id_from_stream_id translates |stream_id| to an internal ID. */ static uint64_t id_from_stream_id(int64_t stream_id) { return (uint64_t)(stream_id >> 2); @@ -51,9 +48,6 @@ static uint64_t id_from_stream_id(int64_t stream_id) { int ngtcp2_idtr_open(ngtcp2_idtr *idtr, int64_t stream_id) { uint64_t q; - assert((idtr->server && (stream_id % 2)) || - (!idtr->server && (stream_id % 2)) == 0); - q = id_from_stream_id(stream_id); if (ngtcp2_gaptr_is_pushed(&idtr->gap, q, 1)) { @@ -63,17 +57,10 @@ int ngtcp2_idtr_open(ngtcp2_idtr *idtr, int64_t stream_id) { return ngtcp2_gaptr_push(&idtr->gap, q, 1); } -int ngtcp2_idtr_is_open(ngtcp2_idtr *idtr, int64_t stream_id) { +int ngtcp2_idtr_is_open(const ngtcp2_idtr *idtr, int64_t stream_id) { uint64_t q; - assert((idtr->server && (stream_id % 2)) || - (!idtr->server && (stream_id % 2)) == 0); - q = id_from_stream_id(stream_id); return ngtcp2_gaptr_is_pushed(&idtr->gap, q, 1); } - -uint64_t ngtcp2_idtr_first_gap(ngtcp2_idtr *idtr) { - return ngtcp2_gaptr_first_gap_offset(&idtr->gap); -} diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_idtr.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_idtr.h index edb8c68c8db9b5..0671f5ed91a5cd 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_idtr.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_idtr.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -38,21 +38,17 @@ * ngtcp2_idtr tracks the usage of stream ID. */ typedef struct ngtcp2_idtr { - /* gap maintains the range of ID which is not used yet. Initially, - its range is [0, UINT64_MAX). */ + /* gap maintains the range of an internal ID which is not used yet. + Initially, its range is [0, UINT64_MAX). The internal ID and + stream ID are in the different number spaces. See + id_from_stream_id to convert a stream ID to an internal ID. */ ngtcp2_gaptr gap; - /* server is nonzero if this object records server initiated stream - ID. */ - int server; } ngtcp2_idtr; /* * ngtcp2_idtr_init initializes |idtr|. - * - * If this object records server initiated ID (even number), set - * |server| to nonzero. */ -void ngtcp2_idtr_init(ngtcp2_idtr *idtr, int server, const ngtcp2_mem *mem); +void ngtcp2_idtr_init(ngtcp2_idtr *idtr, const ngtcp2_mem *mem); /* * ngtcp2_idtr_free frees resources allocated for |idtr|. @@ -60,30 +56,21 @@ void ngtcp2_idtr_init(ngtcp2_idtr *idtr, int server, const ngtcp2_mem *mem); void ngtcp2_idtr_free(ngtcp2_idtr *idtr); /* - * ngtcp2_idtr_open claims that |stream_id| is in used. + * ngtcp2_idtr_open claims that |stream_id| is in use. * * It returns 0 if it succeeds, or one of the following negative error * codes: * * NGTCP2_ERR_STREAM_IN_USE - * ID has already been used. + * |stream_id| has already been used. * NGTCP2_ERR_NOMEM * Out of memory. */ int ngtcp2_idtr_open(ngtcp2_idtr *idtr, int64_t stream_id); /* - * ngtcp2_idtr_open tells whether ID |stream_id| is in used or not. - * - * It returns nonzero if |stream_id| is used. - */ -int ngtcp2_idtr_is_open(ngtcp2_idtr *idtr, int64_t stream_id); - -/* - * ngtcp2_idtr_first_gap returns the first id of first gap. If there - * is no gap, it returns UINT64_MAX. The returned id is an id space - * used in this object internally, and not stream ID. + * ngtcp2_idtr_open returns nonzero if |stream_id| is in use. */ -uint64_t ngtcp2_idtr_first_gap(ngtcp2_idtr *idtr); +int ngtcp2_idtr_is_open(const ngtcp2_idtr *idtr, int64_t stream_id); -#endif /* NGTCP2_IDTR_H */ +#endif /* !defined(NGTCP2_IDTR_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_ksl.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_ksl.c index 0ccc048b5b16b1..5e74f647241816 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_ksl.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_ksl.c @@ -35,11 +35,13 @@ static ngtcp2_ksl_blk null_blk = {{{NULL, NULL, 0, 0, {0}}}}; -ngtcp2_objalloc_def(ksl_blk, ngtcp2_ksl_blk, oplent); +ngtcp2_objalloc_def(ksl_blk, ngtcp2_ksl_blk, oplent) static size_t ksl_nodelen(size_t keylen) { - return (sizeof(ngtcp2_ksl_node) + keylen - sizeof(uint64_t) + 0xfu) & - ~(uintptr_t)0xfu; + assert(keylen >= sizeof(uint64_t)); + + return (sizeof(ngtcp2_ksl_node) + keylen - sizeof(uint64_t) + 0x7u) & + ~(uintptr_t)0x7u; } static size_t ksl_blklen(size_t nodelen) { @@ -55,20 +57,21 @@ static void ksl_node_set_key(ngtcp2_ksl *ksl, ngtcp2_ksl_node *node, memcpy(node->key, key, ksl->keylen); } -void ngtcp2_ksl_init(ngtcp2_ksl *ksl, ngtcp2_ksl_compar compar, size_t keylen, +void ngtcp2_ksl_init(ngtcp2_ksl *ksl, ngtcp2_ksl_compar compar, + ngtcp2_ksl_search search, size_t keylen, const ngtcp2_mem *mem) { size_t nodelen = ksl_nodelen(keylen); ngtcp2_objalloc_init(&ksl->blkalloc, - ((ksl_blklen(nodelen) + 0xfu) & ~(uintptr_t)0xfu) * 8, - mem); + (ksl_blklen(nodelen) + 0xfu) & ~(uintptr_t)0xfu, mem); ksl->head = NULL; ksl->front = ksl->back = NULL; ksl->compar = compar; + ksl->search = search; + ksl->n = 0; ksl->keylen = keylen; ksl->nodelen = nodelen; - ksl->n = 0; } static ngtcp2_ksl_blk *ksl_blk_objalloc_new(ngtcp2_ksl *ksl) { @@ -82,6 +85,7 @@ static void ksl_blk_objalloc_del(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk) { static int ksl_head_init(ngtcp2_ksl *ksl) { ngtcp2_ksl_blk *head = ksl_blk_objalloc_new(ksl); + if (!head) { return NGTCP2_ERR_NOMEM; } @@ -111,7 +115,7 @@ static void ksl_free_blk(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk) { ksl_blk_objalloc_del(ksl, blk); } -#endif /* NOMEMPOOL */ +#endif /* defined(NOMEMPOOL) */ void ngtcp2_ksl_free(ngtcp2_ksl *ksl) { if (!ksl || !ksl->head) { @@ -120,7 +124,7 @@ void ngtcp2_ksl_free(ngtcp2_ksl *ksl) { #ifdef NOMEMPOOL ksl_free_blk(ksl, ksl->head); -#endif /* NOMEMPOOL */ +#endif /* defined(NOMEMPOOL) */ ngtcp2_objalloc_free(&ksl->blkalloc); } @@ -143,21 +147,22 @@ static ngtcp2_ksl_blk *ksl_split_blk(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk) { rblk->next = blk->next; blk->next = rblk; + if (rblk->next) { rblk->next->prev = rblk; } else if (ksl->back == blk) { ksl->back = rblk; } + rblk->prev = blk; rblk->leaf = blk->leaf; rblk->n = blk->n / 2; + blk->n -= rblk->n; - memcpy(rblk->nodes, blk->nodes + ksl->nodelen * (blk->n - rblk->n), + memcpy(rblk->nodes, blk->nodes + ksl->nodelen * blk->n, ksl->nodelen * rblk->n); - blk->n -= rblk->n; - assert(blk->n >= NGTCP2_KSL_MIN_NBLK); assert(rblk->n >= NGTCP2_KSL_MIN_NBLK); @@ -173,7 +178,7 @@ static ngtcp2_ksl_blk *ksl_split_blk(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk) { * codes: * * NGTCP2_ERR_NOMEM - * Out of memory. + * Out of memory. */ static int ksl_split_node(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t i) { ngtcp2_ksl_node *node; @@ -207,7 +212,7 @@ static int ksl_split_node(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t i) { * codes: * * NGTCP2_ERR_NOMEM - * Out of memory. + * Out of memory. */ static int ksl_split_head(ngtcp2_ksl *ksl) { ngtcp2_ksl_blk *rblk = NULL, *lblk, *nhead = NULL; @@ -221,10 +226,12 @@ static int ksl_split_head(ngtcp2_ksl *ksl) { lblk = ksl->head; nhead = ksl_blk_objalloc_new(ksl); + if (nhead == NULL) { ksl_blk_objalloc_del(ksl, rblk); return NGTCP2_ERR_NOMEM; } + nhead->next = nhead->prev = NULL; nhead->n = 2; nhead->leaf = 0; @@ -243,9 +250,9 @@ static int ksl_split_head(ngtcp2_ksl *ksl) { } /* - * insert_node inserts a node whose key is |key| with the associated - * |data| at the index of |i|. This function assumes that the number - * of nodes contained by |blk| is strictly less than + * ksl_insert_node inserts a node whose key is |key| with the + * associated |data| at the index of |i|. This function assumes that + * the number of nodes contained by |blk| is strictly less than * NGTCP2_KSL_MAX_NBLK. */ static void ksl_insert_node(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t i, @@ -264,19 +271,6 @@ static void ksl_insert_node(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t i, ++blk->n; } -static size_t ksl_bsearch(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, - const ngtcp2_ksl_key *key, ngtcp2_ksl_compar compar) { - size_t i; - ngtcp2_ksl_node *node; - - for (i = 0, node = (ngtcp2_ksl_node *)(void *)blk->nodes; - i < blk->n && compar((ngtcp2_ksl_key *)node->key, key); - ++i, node = (ngtcp2_ksl_node *)(void *)((uint8_t *)node + ksl->nodelen)) - ; - - return i; -} - int ngtcp2_ksl_insert(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, const ngtcp2_ksl_key *key, void *data) { ngtcp2_ksl_blk *blk; @@ -291,18 +285,17 @@ int ngtcp2_ksl_insert(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, } } - blk = ksl->head; - - if (blk->n == NGTCP2_KSL_MAX_NBLK) { + if (ksl->head->n == NGTCP2_KSL_MAX_NBLK) { rv = ksl_split_head(ksl); if (rv != 0) { return rv; } - blk = ksl->head; } + blk = ksl->head; + for (;;) { - i = ksl_bsearch(ksl, blk, key, ksl->compar); + i = ksl->search(ksl, blk, key); if (blk->leaf) { if (i < blk->n && @@ -310,13 +303,17 @@ int ngtcp2_ksl_insert(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, if (it) { *it = ngtcp2_ksl_end(ksl); } + return NGTCP2_ERR_INVALID_ARGUMENT; } + ksl_insert_node(ksl, blk, i, key, data); ++ksl->n; + if (it) { ngtcp2_ksl_it_init(it, ksl, blk, i); } + return 0; } @@ -329,16 +326,21 @@ int ngtcp2_ksl_insert(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, if (rv != 0) { return rv; } + node = ngtcp2_ksl_nth_node(ksl, blk, blk->n - 1); } + ksl_node_set_key(ksl, node, key); blk = node->blk; } + ksl_insert_node(ksl, blk, blk->n, key, data); ++ksl->n; + if (it) { ngtcp2_ksl_it_init(it, ksl, blk, blk->n - 1); } + return 0; } @@ -349,8 +351,10 @@ int ngtcp2_ksl_insert(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, if (rv != 0) { return rv; } + if (ksl->compar((ngtcp2_ksl_key *)node->key, key)) { node = ngtcp2_ksl_nth_node(ksl, blk, i + 1); + if (ksl->compar((ngtcp2_ksl_key *)node->key, key)) { ksl_node_set_key(ksl, node, key); } @@ -376,19 +380,22 @@ static void ksl_remove_node(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t i) { * ksl_merge_node merges 2 nodes which are the nodes at the index of * |i| and |i + 1|. * - * If |blk| is the direct descendant of head (root) block and the head - * block contains just 2 nodes, the merged block becomes head block, - * which decreases the height of |ksl| by 1. + * If |blk| is the head (root) block and it contains just 2 nodes + * before merging nodes, the merged block becomes head block, which + * decreases the height of |ksl| by 1. * * This function returns the pointer to the merged block. */ static ngtcp2_ksl_blk *ksl_merge_node(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t i) { + ngtcp2_ksl_node *lnode; ngtcp2_ksl_blk *lblk, *rblk; assert(i + 1 < blk->n); - lblk = ngtcp2_ksl_nth_node(ksl, blk, i)->blk; + lnode = ngtcp2_ksl_nth_node(ksl, blk, i); + + lblk = lnode->blk; rblk = ngtcp2_ksl_nth_node(ksl, blk, i + 1)->blk; assert(lblk->n + rblk->n < NGTCP2_KSL_MAX_NBLK); @@ -398,6 +405,7 @@ static ngtcp2_ksl_blk *ksl_merge_node(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, lblk->n += rblk->n; lblk->next = rblk->next; + if (lblk->next) { lblk->next->prev = lblk; } else if (ksl->back == rblk) { @@ -411,7 +419,7 @@ static ngtcp2_ksl_blk *ksl_merge_node(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, ksl->head = lblk; } else { ksl_remove_node(ksl, blk, i + 1); - ksl_node_set_key(ksl, ngtcp2_ksl_nth_node(ksl, blk, i), + ksl_node_set_key(ksl, lnode, ngtcp2_ksl_nth_node(ksl, lblk, lblk->n - 1)->key); } @@ -425,6 +433,7 @@ static ngtcp2_ksl_blk *ksl_merge_node(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, */ static void ksl_shift_left(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t i) { ngtcp2_ksl_node *lnode, *rnode; + ngtcp2_ksl_blk *lblk, *rblk; size_t n; assert(i > 0); @@ -432,35 +441,37 @@ static void ksl_shift_left(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t i) { lnode = ngtcp2_ksl_nth_node(ksl, blk, i - 1); rnode = ngtcp2_ksl_nth_node(ksl, blk, i); - assert(lnode->blk->n < NGTCP2_KSL_MAX_NBLK); - assert(rnode->blk->n > NGTCP2_KSL_MIN_NBLK); + lblk = lnode->blk; + rblk = rnode->blk; + + assert(lblk->n < NGTCP2_KSL_MAX_NBLK); + assert(rblk->n > NGTCP2_KSL_MIN_NBLK); - n = (lnode->blk->n + rnode->blk->n + 1) / 2 - lnode->blk->n; + n = (lblk->n + rblk->n + 1) / 2 - lblk->n; assert(n > 0); - assert(lnode->blk->n <= NGTCP2_KSL_MAX_NBLK - n); - assert(rnode->blk->n >= NGTCP2_KSL_MIN_NBLK + n); + assert(lblk->n <= NGTCP2_KSL_MAX_NBLK - n); + assert(rblk->n >= NGTCP2_KSL_MIN_NBLK + n); - memcpy(lnode->blk->nodes + ksl->nodelen * lnode->blk->n, rnode->blk->nodes, - ksl->nodelen * n); + memcpy(lblk->nodes + ksl->nodelen * lblk->n, rblk->nodes, ksl->nodelen * n); - lnode->blk->n += (uint32_t)n; - rnode->blk->n -= (uint32_t)n; + lblk->n += (uint32_t)n; + rblk->n -= (uint32_t)n; - ksl_node_set_key( - ksl, lnode, ngtcp2_ksl_nth_node(ksl, lnode->blk, lnode->blk->n - 1)->key); + ksl_node_set_key(ksl, lnode, + ngtcp2_ksl_nth_node(ksl, lblk, lblk->n - 1)->key); - memmove(rnode->blk->nodes, rnode->blk->nodes + ksl->nodelen * n, - ksl->nodelen * rnode->blk->n); + memmove(rblk->nodes, rblk->nodes + ksl->nodelen * n, ksl->nodelen * rblk->n); } /* * ksl_shift_right moves the last nodes in blk->nodes[i]->blk->nodes * to blk->nodes[i + 1]->blk->nodes in a manner that they have the - * same amount of nodes as much as possible.. + * same amount of nodes as much as possible. */ static void ksl_shift_right(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t i) { ngtcp2_ksl_node *lnode, *rnode; + ngtcp2_ksl_blk *lblk, *rblk; size_t n; assert(i < blk->n - 1); @@ -468,26 +479,27 @@ static void ksl_shift_right(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t i) { lnode = ngtcp2_ksl_nth_node(ksl, blk, i); rnode = ngtcp2_ksl_nth_node(ksl, blk, i + 1); - assert(lnode->blk->n > NGTCP2_KSL_MIN_NBLK); - assert(rnode->blk->n < NGTCP2_KSL_MAX_NBLK); + lblk = lnode->blk; + rblk = rnode->blk; - n = (lnode->blk->n + rnode->blk->n + 1) / 2 - rnode->blk->n; + assert(lblk->n > NGTCP2_KSL_MIN_NBLK); + assert(rblk->n < NGTCP2_KSL_MAX_NBLK); + + n = (lblk->n + rblk->n + 1) / 2 - rblk->n; assert(n > 0); - assert(lnode->blk->n >= NGTCP2_KSL_MIN_NBLK + n); - assert(rnode->blk->n <= NGTCP2_KSL_MAX_NBLK - n); + assert(lblk->n >= NGTCP2_KSL_MIN_NBLK + n); + assert(rblk->n <= NGTCP2_KSL_MAX_NBLK - n); - memmove(rnode->blk->nodes + ksl->nodelen * n, rnode->blk->nodes, - ksl->nodelen * rnode->blk->n); + memmove(rblk->nodes + ksl->nodelen * n, rblk->nodes, ksl->nodelen * rblk->n); - rnode->blk->n += (uint32_t)n; - lnode->blk->n -= (uint32_t)n; + rblk->n += (uint32_t)n; + lblk->n -= (uint32_t)n; - memcpy(rnode->blk->nodes, lnode->blk->nodes + ksl->nodelen * lnode->blk->n, - ksl->nodelen * n); + memcpy(rblk->nodes, lblk->nodes + ksl->nodelen * lblk->n, ksl->nodelen * n); - ksl_node_set_key( - ksl, lnode, ngtcp2_ksl_nth_node(ksl, lnode->blk, lnode->blk->n - 1)->key); + ksl_node_set_key(ksl, lnode, + ngtcp2_ksl_nth_node(ksl, lblk, lblk->n - 1)->key); } /* @@ -531,23 +543,24 @@ int ngtcp2_ksl_remove(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, ngtcp2_ksl_node *node; size_t i; - if (!ksl->head) { + if (!blk) { return NGTCP2_ERR_INVALID_ARGUMENT; } if (!blk->leaf && blk->n == 2 && ngtcp2_ksl_nth_node(ksl, blk, 0)->blk->n == NGTCP2_KSL_MIN_NBLK && ngtcp2_ksl_nth_node(ksl, blk, 1)->blk->n == NGTCP2_KSL_MIN_NBLK) { - blk = ksl_merge_node(ksl, ksl->head, 0); + blk = ksl_merge_node(ksl, blk, 0); } for (;;) { - i = ksl_bsearch(ksl, blk, key, ksl->compar); + i = ksl->search(ksl, blk, key); if (i == blk->n) { if (it) { *it = ngtcp2_ksl_end(ksl); } + return NGTCP2_ERR_INVALID_ARGUMENT; } @@ -556,10 +569,13 @@ int ngtcp2_ksl_remove(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, if (it) { *it = ngtcp2_ksl_end(ksl); } + return NGTCP2_ERR_INVALID_ARGUMENT; } + ksl_remove_node(ksl, blk, i); --ksl->n; + if (it) { if (blk->n == i && blk->next) { ngtcp2_ksl_it_init(it, ksl, blk->next, 0); @@ -567,6 +583,7 @@ int ngtcp2_ksl_remove(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, ngtcp2_ksl_it_init(it, ksl, blk, i); } } + return 0; } @@ -583,6 +600,7 @@ int ngtcp2_ksl_remove(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, ngtcp2_ksl_nth_node(ksl, blk, i + 1)->blk->n > NGTCP2_KSL_MIN_NBLK) { ksl_shift_left(ksl, blk, i + 1); blk = node->blk; + continue; } @@ -590,6 +608,7 @@ int ngtcp2_ksl_remove(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, ngtcp2_ksl_nth_node(ksl, blk, i - 1)->blk->n > NGTCP2_KSL_MIN_NBLK) { ksl_shift_right(ksl, blk, i - 1); blk = node->blk; + continue; } @@ -604,50 +623,14 @@ int ngtcp2_ksl_remove(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, } } -ngtcp2_ksl_it ngtcp2_ksl_lower_bound(ngtcp2_ksl *ksl, +ngtcp2_ksl_it ngtcp2_ksl_lower_bound(const ngtcp2_ksl *ksl, const ngtcp2_ksl_key *key) { - ngtcp2_ksl_blk *blk = ksl->head; - ngtcp2_ksl_it it; - size_t i; - - if (!blk) { - ngtcp2_ksl_it_init(&it, ksl, &null_blk, 0); - return it; - } - - for (;;) { - i = ksl_bsearch(ksl, blk, key, ksl->compar); - - if (blk->leaf) { - if (i == blk->n && blk->next) { - blk = blk->next; - i = 0; - } - ngtcp2_ksl_it_init(&it, ksl, blk, i); - return it; - } - - if (i == blk->n) { - /* This happens if descendant has smaller key. Fast forward to - find last node in this subtree. */ - for (; !blk->leaf; blk = ngtcp2_ksl_nth_node(ksl, blk, blk->n - 1)->blk) - ; - if (blk->next) { - blk = blk->next; - i = 0; - } else { - i = blk->n; - } - ngtcp2_ksl_it_init(&it, ksl, blk, i); - return it; - } - blk = ngtcp2_ksl_nth_node(ksl, blk, i)->blk; - } + return ngtcp2_ksl_lower_bound_search(ksl, key, ksl->search); } -ngtcp2_ksl_it ngtcp2_ksl_lower_bound_compar(ngtcp2_ksl *ksl, +ngtcp2_ksl_it ngtcp2_ksl_lower_bound_search(const ngtcp2_ksl *ksl, const ngtcp2_ksl_key *key, - ngtcp2_ksl_compar compar) { + ngtcp2_ksl_search search) { ngtcp2_ksl_blk *blk = ksl->head; ngtcp2_ksl_it it; size_t i; @@ -658,14 +641,16 @@ ngtcp2_ksl_it ngtcp2_ksl_lower_bound_compar(ngtcp2_ksl *ksl, } for (;;) { - i = ksl_bsearch(ksl, blk, key, compar); + i = search(ksl, blk, key); if (blk->leaf) { if (i == blk->n && blk->next) { blk = blk->next; i = 0; } + ngtcp2_ksl_it_init(&it, ksl, blk, i); + return it; } @@ -674,15 +659,19 @@ ngtcp2_ksl_it ngtcp2_ksl_lower_bound_compar(ngtcp2_ksl *ksl, find last node in this subtree. */ for (; !blk->leaf; blk = ngtcp2_ksl_nth_node(ksl, blk, blk->n - 1)->blk) ; + if (blk->next) { blk = blk->next; i = 0; } else { i = blk->n; } + ngtcp2_ksl_it_init(&it, ksl, blk, i); + return it; } + blk = ngtcp2_ksl_nth_node(ksl, blk, i)->blk; } } @@ -696,7 +685,7 @@ void ngtcp2_ksl_update_key(ngtcp2_ksl *ksl, const ngtcp2_ksl_key *old_key, assert(ksl->head); for (;;) { - i = ksl_bsearch(ksl, blk, old_key, ksl->compar); + i = ksl->search(ksl, blk, old_key); assert(i < blk->n); node = ngtcp2_ksl_nth_node(ksl, blk, i); @@ -704,6 +693,7 @@ void ngtcp2_ksl_update_key(ngtcp2_ksl *ksl, const ngtcp2_ksl_key *old_key, if (blk->leaf) { assert(key_equal(ksl->compar, (ngtcp2_ksl_key *)node->key, old_key)); ksl_node_set_key(ksl, node, new_key); + return; } @@ -716,7 +706,7 @@ void ngtcp2_ksl_update_key(ngtcp2_ksl *ksl, const ngtcp2_ksl_key *old_key, } } -size_t ngtcp2_ksl_len(ngtcp2_ksl *ksl) { return ksl->n; } +size_t ngtcp2_ksl_len(const ngtcp2_ksl *ksl) { return ksl->n; } void ngtcp2_ksl_clear(ngtcp2_ksl *ksl) { if (!ksl->head) { @@ -725,7 +715,7 @@ void ngtcp2_ksl_clear(ngtcp2_ksl *ksl) { #ifdef NOMEMPOOL ksl_free_blk(ksl, ksl->head); -#endif /* NOMEMPOOL */ +#endif /* defined(NOMEMPOOL) */ ksl->front = ksl->back = ksl->head = NULL; ksl->n = 0; @@ -734,7 +724,8 @@ void ngtcp2_ksl_clear(ngtcp2_ksl *ksl) { } #ifndef WIN32 -static void ksl_print(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t level) { +static void ksl_print(const ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, + size_t level) { size_t i; ngtcp2_ksl_node *node; @@ -745,7 +736,9 @@ static void ksl_print(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t level) { node = ngtcp2_ksl_nth_node(ksl, blk, i); fprintf(stderr, " %" PRId64, *(int64_t *)(void *)node->key); } + fprintf(stderr, "\n"); + return; } @@ -754,14 +747,14 @@ static void ksl_print(ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, size_t level) { } } -void ngtcp2_ksl_print(ngtcp2_ksl *ksl) { +void ngtcp2_ksl_print(const ngtcp2_ksl *ksl) { if (!ksl->head) { return; } ksl_print(ksl, ksl->head, 0); } -#endif /* !WIN32 */ +#endif /* !defined(WIN32) */ ngtcp2_ksl_it ngtcp2_ksl_begin(const ngtcp2_ksl *ksl) { ngtcp2_ksl_it it; @@ -815,9 +808,49 @@ int ngtcp2_ksl_range_compar(const ngtcp2_ksl_key *lhs, return a->begin < b->begin; } +ngtcp2_ksl_search_def(range, ngtcp2_ksl_range_compar) + +size_t ngtcp2_ksl_range_search(const ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, + const ngtcp2_ksl_key *key) { + return ksl_range_search(ksl, blk, key); +} + int ngtcp2_ksl_range_exclusive_compar(const ngtcp2_ksl_key *lhs, const ngtcp2_ksl_key *rhs) { const ngtcp2_range *a = lhs, *b = rhs; - return a->begin < b->begin && - !(ngtcp2_max(a->begin, b->begin) < ngtcp2_min(a->end, b->end)); + return a->begin < b->begin && !(ngtcp2_max_uint64(a->begin, b->begin) < + ngtcp2_min_uint64(a->end, b->end)); +} + +ngtcp2_ksl_search_def(range_exclusive, ngtcp2_ksl_range_exclusive_compar) + +size_t ngtcp2_ksl_range_exclusive_search(const ngtcp2_ksl *ksl, + ngtcp2_ksl_blk *blk, + const ngtcp2_ksl_key *key) { + return ksl_range_exclusive_search(ksl, blk, key); +} + +int ngtcp2_ksl_uint64_less(const ngtcp2_ksl_key *lhs, + const ngtcp2_ksl_key *rhs) { + return *(uint64_t *)lhs < *(uint64_t *)rhs; +} + +ngtcp2_ksl_search_def(uint64_less, ngtcp2_ksl_uint64_less) + +size_t ngtcp2_ksl_uint64_less_search(const ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, + const ngtcp2_ksl_key *key) { + return ksl_uint64_less_search(ksl, blk, key); +} + +int ngtcp2_ksl_int64_greater(const ngtcp2_ksl_key *lhs, + const ngtcp2_ksl_key *rhs) { + return *(int64_t *)lhs > *(int64_t *)rhs; +} + +ngtcp2_ksl_search_def(int64_greater, ngtcp2_ksl_int64_greater) + +size_t ngtcp2_ksl_int64_greater_search(const ngtcp2_ksl *ksl, + ngtcp2_ksl_blk *blk, + const ngtcp2_ksl_key *key) { + return ksl_int64_greater_search(ksl, blk, key); } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_ksl.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_ksl.h index 7e08f15cdae6e8..de78bcb8070f53 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_ksl.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_ksl.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -35,16 +35,12 @@ #include "ngtcp2_objalloc.h" -/* - * Skip List using single key instead of range. - */ - #define NGTCP2_KSL_DEGR 16 /* NGTCP2_KSL_MAX_NBLK is the maximum number of nodes which a single block can contain. */ #define NGTCP2_KSL_MAX_NBLK (2 * NGTCP2_KSL_DEGR - 1) /* NGTCP2_KSL_MIN_NBLK is the minimum number of nodes which a single - block other than root must contains. */ + block other than root must contain. */ #define NGTCP2_KSL_MIN_NBLK (NGTCP2_KSL_DEGR - 1) /* @@ -85,7 +81,8 @@ struct ngtcp2_ksl_blk { struct { /* next points to the next block if leaf field is nonzero. */ ngtcp2_ksl_blk *next; - /* prev points to the previous block if leaf field is nonzero. */ + /* prev points to the previous block if leaf field is + nonzero. */ ngtcp2_ksl_blk *prev; /* n is the number of nodes this object contains in nodes. */ uint32_t n; @@ -106,7 +103,7 @@ struct ngtcp2_ksl_blk { }; }; -ngtcp2_objalloc_decl(ksl_blk, ngtcp2_ksl_blk, oplent); +ngtcp2_objalloc_decl(ksl_blk, ngtcp2_ksl_blk, oplent) /* * ngtcp2_ksl_compar is a function type which returns nonzero if key @@ -117,10 +114,37 @@ typedef int (*ngtcp2_ksl_compar)(const ngtcp2_ksl_key *lhs, typedef struct ngtcp2_ksl ngtcp2_ksl; +/* + * ngtcp2_ksl_search is a function to search for the first element in + * |blk|->nodes which is not ordered before |key|. It returns the + * index of such element. It returns |blk|->n if there is no such + * element. + */ +typedef size_t (*ngtcp2_ksl_search)(const ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, + const ngtcp2_ksl_key *key); + +/* + * ngtcp2_ksl_search_def is a macro to implement ngtcp2_ksl_search + * with COMPAR which is supposed to be ngtcp2_ksl_compar. + */ +#define ngtcp2_ksl_search_def(NAME, COMPAR) \ + static size_t ksl_##NAME##_search( \ + const ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, const ngtcp2_ksl_key *key) { \ + size_t i; \ + ngtcp2_ksl_node *node; \ + \ + for (i = 0, node = (ngtcp2_ksl_node *)(void *)blk->nodes; \ + i < blk->n && COMPAR((ngtcp2_ksl_key *)node->key, key); ++i, \ + node = (ngtcp2_ksl_node *)(void *)((uint8_t *)node + ksl->nodelen)) \ + ; \ + \ + return i; \ + } + typedef struct ngtcp2_ksl_it ngtcp2_ksl_it; /* - * ngtcp2_ksl_it is a forward iterator to iterate nodes. + * ngtcp2_ksl_it is a bidirectional iterator to iterate nodes. */ struct ngtcp2_ksl_it { const ngtcp2_ksl *ksl; @@ -140,6 +164,8 @@ struct ngtcp2_ksl { /* back points to the last leaf block. */ ngtcp2_ksl_blk *back; ngtcp2_ksl_compar compar; + ngtcp2_ksl_search search; + /* n is the number of elements stored. */ size_t n; /* keylen is the size of key */ size_t keylen; @@ -150,9 +176,12 @@ struct ngtcp2_ksl { /* * ngtcp2_ksl_init initializes |ksl|. |compar| specifies compare - * function. |keylen| is the length of key. + * function. |search| is a search function which must use |compar|. + * |keylen| is the length of key and must be at least + * sizeof(uint64_t). */ -void ngtcp2_ksl_init(ngtcp2_ksl *ksl, ngtcp2_ksl_compar compar, size_t keylen, +void ngtcp2_ksl_init(ngtcp2_ksl *ksl, ngtcp2_ksl_compar compar, + ngtcp2_ksl_search search, size_t keylen, const ngtcp2_mem *mem); /* @@ -165,15 +194,15 @@ void ngtcp2_ksl_free(ngtcp2_ksl *ksl); /* * ngtcp2_ksl_insert inserts |key| with its associated |data|. On * successful insertion, the iterator points to the inserted node is - * stored in |*it|. + * stored in |*it| if |it| is not NULL. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * NGTCP2_ERR_NOMEM - * Out of memory. + * Out of memory. * NGTCP2_ERR_INVALID_ARGUMENT - * |key| already exists. + * |key| already exists. */ int ngtcp2_ksl_insert(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, const ngtcp2_ksl_key *key, void *data); @@ -184,13 +213,14 @@ int ngtcp2_ksl_insert(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, * This function assigns the iterator to |*it|, which points to the * node which is located at the right next of the removed node if |it| * is not NULL. If |key| is not found, no deletion takes place and - * the return value of ngtcp2_ksl_end(ksl) is assigned to |*it|. + * the return value of ngtcp2_ksl_end(ksl) is assigned to |*it| if + * |it| is not NULL. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * NGTCP2_ERR_INVALID_ARGUMENT - * |key| does not exist. + * |key| does not exist. */ int ngtcp2_ksl_remove(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, const ngtcp2_ksl_key *key); @@ -213,16 +243,16 @@ int ngtcp2_ksl_remove_hint(ngtcp2_ksl *ksl, ngtcp2_ksl_it *it, * node, it returns the iterator which satisfies ngtcp2_ksl_it_end(it) * != 0. */ -ngtcp2_ksl_it ngtcp2_ksl_lower_bound(ngtcp2_ksl *ksl, +ngtcp2_ksl_it ngtcp2_ksl_lower_bound(const ngtcp2_ksl *ksl, const ngtcp2_ksl_key *key); /* - * ngtcp2_ksl_lower_bound_compar works like ngtcp2_ksl_lower_bound, - * but it takes custom function |compar| to do lower bound search. + * ngtcp2_ksl_lower_bound_search works like ngtcp2_ksl_lower_bound, + * but it takes custom function |search| to do lower bound search. */ -ngtcp2_ksl_it ngtcp2_ksl_lower_bound_compar(ngtcp2_ksl *ksl, +ngtcp2_ksl_it ngtcp2_ksl_lower_bound_search(const ngtcp2_ksl *ksl, const ngtcp2_ksl_key *key, - ngtcp2_ksl_compar compar); + ngtcp2_ksl_search search); /* * ngtcp2_ksl_update_key replaces the key of nodes which has |old_key| @@ -235,7 +265,8 @@ void ngtcp2_ksl_update_key(ngtcp2_ksl *ksl, const ngtcp2_ksl_key *old_key, /* * ngtcp2_ksl_begin returns the iterator which points to the first * node. If there is no node in |ksl|, it returns the iterator which - * satisfies ngtcp2_ksl_it_end(it) != 0. + * satisfies both ngtcp2_ksl_it_begin(it) != 0 and + * ngtcp2_ksl_it_end(it) != 0. */ ngtcp2_ksl_it ngtcp2_ksl_begin(const ngtcp2_ksl *ksl); @@ -243,14 +274,15 @@ ngtcp2_ksl_it ngtcp2_ksl_begin(const ngtcp2_ksl *ksl); * ngtcp2_ksl_end returns the iterator which points to the node * following the last node. The returned object satisfies * ngtcp2_ksl_it_end(). If there is no node in |ksl|, it returns the - * iterator which satisfies ngtcp2_ksl_it_begin(it) != 0. + * iterator which satisfies ngtcp2_ksl_it_begin(it) != 0 and + * ngtcp2_ksl_it_end(it) != 0. */ ngtcp2_ksl_it ngtcp2_ksl_end(const ngtcp2_ksl *ksl); /* * ngtcp2_ksl_len returns the number of elements stored in |ksl|. */ -size_t ngtcp2_ksl_len(ngtcp2_ksl *ksl); +size_t ngtcp2_ksl_len(const ngtcp2_ksl *ksl); /* * ngtcp2_ksl_clear removes all elements stored in |ksl|. @@ -269,8 +301,8 @@ void ngtcp2_ksl_clear(ngtcp2_ksl *ksl); * that the key is of type int64_t. This function should be used for * the debugging purpose only. */ -void ngtcp2_ksl_print(ngtcp2_ksl *ksl); -#endif /* !WIN32 */ +void ngtcp2_ksl_print(const ngtcp2_ksl *ksl); +#endif /* !defined(WIN32) */ /* * ngtcp2_ksl_it_init initializes |it|. @@ -293,8 +325,8 @@ void ngtcp2_ksl_it_init(ngtcp2_ksl_it *it, const ngtcp2_ksl *ksl, */ #define ngtcp2_ksl_it_next(IT) \ (++(IT)->i == (IT)->blk->n && (IT)->blk->next \ - ? ((IT)->blk = (IT)->blk->next, (IT)->i = 0) \ - : 0) + ? ((IT)->blk = (IT)->blk->next, (IT)->i = 0) \ + : 0) /* * ngtcp2_ksl_it_prev moves backward the iterator by one. It is @@ -304,16 +336,16 @@ void ngtcp2_ksl_it_init(ngtcp2_ksl_it *it, const ngtcp2_ksl *ksl, void ngtcp2_ksl_it_prev(ngtcp2_ksl_it *it); /* - * ngtcp2_ksl_it_end returns nonzero if |it| points to the beyond the - * last node. + * ngtcp2_ksl_it_end returns nonzero if |it| points to the one beyond + * the last node. */ #define ngtcp2_ksl_it_end(IT) \ ((IT)->blk->n == (IT)->i && (IT)->blk->next == NULL) /* * ngtcp2_ksl_it_begin returns nonzero if |it| points to the first - * node. |it| might satisfy both ngtcp2_ksl_it_begin(&it) and - * ngtcp2_ksl_it_end(&it) if the skip list has no node. + * node. |it| might satisfy both ngtcp2_ksl_it_begin(it) != 0 and + * ngtcp2_ksl_it_end(it) != 0 if the skip list has no node. */ int ngtcp2_ksl_it_begin(const ngtcp2_ksl_it *it); @@ -327,21 +359,67 @@ int ngtcp2_ksl_it_begin(const ngtcp2_ksl_it *it); /* * ngtcp2_ksl_range_compar is an implementation of ngtcp2_ksl_compar. - * lhs->ptr and rhs->ptr must point to ngtcp2_range object and the - * function returns nonzero if (const ngtcp2_range *)(lhs->ptr)->begin - * < (const ngtcp2_range *)(rhs->ptr)->begin. + * |lhs| and |rhs| must point to ngtcp2_range object, and the function + * returns nonzero if ((const ngtcp2_range *)lhs)->begin < ((const + * ngtcp2_range *)rhs)->begin. */ int ngtcp2_ksl_range_compar(const ngtcp2_ksl_key *lhs, const ngtcp2_ksl_key *rhs); +/* + * ngtcp2_ksl_range_search is an implementation of ngtcp2_ksl_search + * that uses ngtcp2_ksl_range_compar. + */ +size_t ngtcp2_ksl_range_search(const ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, + const ngtcp2_ksl_key *key); + /* * ngtcp2_ksl_range_exclusive_compar is an implementation of - * ngtcp2_ksl_compar. lhs->ptr and rhs->ptr must point to - * ngtcp2_range object and the function returns nonzero if (const - * ngtcp2_range *)(lhs->ptr)->begin < (const ngtcp2_range - * *)(rhs->ptr)->begin and the 2 ranges do not intersect. + * ngtcp2_ksl_compar. |lhs| and |rhs| must point to ngtcp2_range + * object, and the function returns nonzero if ((const ngtcp2_range + * *)lhs)->begin < ((const ngtcp2_range *)rhs)->begin, and the 2 + * ranges do not intersect. */ int ngtcp2_ksl_range_exclusive_compar(const ngtcp2_ksl_key *lhs, const ngtcp2_ksl_key *rhs); -#endif /* NGTCP2_KSL_H */ +/* + * ngtcp2_ksl_range_exclusive_search is an implementation of + * ngtcp2_ksl_search that uses ngtcp2_ksl_range_exclusive_compar. + */ +size_t ngtcp2_ksl_range_exclusive_search(const ngtcp2_ksl *ksl, + ngtcp2_ksl_blk *blk, + const ngtcp2_ksl_key *key); + +/* + * ngtcp2_ksl_uint64_less is an implementation of ngtcp2_ksl_compar. + * |lhs| and |rhs| must point to uint64_t objects, and the function + * returns nonzero if *(uint64_t *)|lhs| < *(uint64_t *)|rhs|. + */ +int ngtcp2_ksl_uint64_less(const ngtcp2_ksl_key *lhs, + const ngtcp2_ksl_key *rhs); + +/* + * ngtcp2_ksl_uint64_less_search is an implementation of + * ngtcp2_ksl_search that uses ngtcp2_ksl_uint64_less. + */ +size_t ngtcp2_ksl_uint64_less_search(const ngtcp2_ksl *ksl, ngtcp2_ksl_blk *blk, + const ngtcp2_ksl_key *key); + +/* + * ngtcp2_ksl_int64_greater is an implementation of ngtcp2_ksl_compar. + * |lhs| and |rhs| must point to int64_t objects, and the function + * returns nonzero if *(int64_t *)|lhs| > *(int64_t *)|rhs|. + */ +int ngtcp2_ksl_int64_greater(const ngtcp2_ksl_key *lhs, + const ngtcp2_ksl_key *rhs); + +/* + * ngtcp2_ksl_int64_greater_search is an implementation of + * ngtcp2_ksl_search that uses ngtcp2_ksl_int64_greater. + */ +size_t ngtcp2_ksl_int64_greater_search(const ngtcp2_ksl *ksl, + ngtcp2_ksl_blk *blk, + const ngtcp2_ksl_key *key); + +#endif /* !defined(NGTCP2_KSL_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_log.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_log.c index 93922a29c319f4..fc4eb443517d40 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_log.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_log.c @@ -27,7 +27,7 @@ #include #ifdef HAVE_UNISTD_H # include -#endif +#endif /* defined(HAVE_UNISTD_H) */ #include #include @@ -99,11 +99,11 @@ void ngtcp2_log_init(ngtcp2_log *log, const ngtcp2_cid *scid, #define NGTCP2_LOG_FRM_HD_FIELDS(DIR) \ timestamp_cast(log->last_ts - log->ts), (const char *)log->scid, "frm", \ - (DIR), hd->pkt_num, strpkttype(hd) + (DIR), hd->pkt_num, strpkttype(hd) #define NGTCP2_LOG_PKT_HD_FIELDS(DIR) \ timestamp_cast(log->last_ts - log->ts), (const char *)log->scid, "pkt", \ - (DIR), hd->pkt_num, strpkttype(hd) + (DIR), hd->pkt_num, strpkttype(hd) #define NGTCP2_LOG_TP_HD_FIELDS \ timestamp_cast(log->last_ts - log->ts), (const char *)log->scid, "cry" @@ -223,12 +223,12 @@ static uint64_t timestamp_cast(uint64_t ns) { return ns / NGTCP2_MILLISECONDS; } static void log_fr_stream(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, const ngtcp2_stream *fr, const char *dir) { log->log_printf( - log->user_data, - (NGTCP2_LOG_PKT " STREAM(0x%02" PRIx64 ") id=0x%" PRIx64 - " fin=%d offset=%" PRIu64 " len=%" PRIu64 " uni=%d"), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type | fr->flags, fr->stream_id, - fr->fin, fr->offset, ngtcp2_vec_len(fr->data, fr->datacnt), - (fr->stream_id & 0x2) != 0); + log->user_data, + (NGTCP2_LOG_PKT " STREAM(0x%02" PRIx64 ") id=0x%" PRIx64 + " fin=%d offset=%" PRIu64 " len=%" PRIu64 " uni=%d"), + NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type | fr->flags, fr->stream_id, fr->fin, + fr->offset, ngtcp2_vec_len(fr->data, fr->datacnt), + (fr->stream_id & 0x2) != 0); } static void log_fr_ack(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, @@ -236,13 +236,12 @@ static void log_fr_ack(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, int64_t largest_ack, min_ack; size_t i; - log->log_printf(log->user_data, - (NGTCP2_LOG_PKT " ACK(0x%02" PRIx64 ") largest_ack=%" PRId64 - " ack_delay=%" PRIu64 "(%" PRIu64 - ") ack_range_count=%zu"), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->largest_ack, - fr->ack_delay_unscaled / NGTCP2_MILLISECONDS, fr->ack_delay, - fr->rangecnt); + log->log_printf( + log->user_data, + (NGTCP2_LOG_PKT " ACK(0x%02" PRIx64 ") largest_ack=%" PRId64 + " ack_delay=%" PRIu64 "(%" PRIu64 ") ack_range_count=%zu"), + NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->largest_ack, + fr->ack_delay_unscaled / NGTCP2_MILLISECONDS, fr->ack_delay, fr->rangecnt); largest_ack = fr->largest_ack; min_ack = fr->largest_ack - (int64_t)fr->first_ack_range; @@ -285,38 +284,37 @@ static void log_fr_reset_stream(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, const ngtcp2_reset_stream *fr, const char *dir) { log->log_printf( - log->user_data, - (NGTCP2_LOG_PKT " RESET_STREAM(0x%02" PRIx64 ") id=0x%" PRIx64 - " app_error_code=%s(0x%" PRIx64 ") final_size=%" PRIu64), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->stream_id, - strapperrorcode(fr->app_error_code), fr->app_error_code, fr->final_size); + log->user_data, + (NGTCP2_LOG_PKT " RESET_STREAM(0x%02" PRIx64 ") id=0x%" PRIx64 + " app_error_code=%s(0x%" PRIx64 ") final_size=%" PRIu64), + NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->stream_id, + strapperrorcode(fr->app_error_code), fr->app_error_code, fr->final_size); } static void log_fr_connection_close(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, const ngtcp2_connection_close *fr, const char *dir) { char reason[256]; - size_t reasonlen = ngtcp2_min(sizeof(reason) - 1, fr->reasonlen); + size_t reasonlen = ngtcp2_min_size(sizeof(reason) - 1, fr->reasonlen); - log->log_printf(log->user_data, - (NGTCP2_LOG_PKT " CONNECTION_CLOSE(0x%02" PRIx64 - ") error_code=%s(0x%" PRIx64 ") " - "frame_type=%" PRIx64 - " reason_len=%zu reason=[%s]"), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, - fr->type == NGTCP2_FRAME_CONNECTION_CLOSE - ? strerrorcode(fr->error_code) - : strapperrorcode(fr->error_code), - fr->error_code, fr->frame_type, fr->reasonlen, - ngtcp2_encode_printable_ascii(reason, fr->reason, reasonlen)); + log->log_printf( + log->user_data, + (NGTCP2_LOG_PKT " CONNECTION_CLOSE(0x%02" PRIx64 + ") error_code=%s(0x%" PRIx64 ") " + "frame_type=%" PRIx64 " reason_len=%zu reason=[%s]"), + NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, + fr->type == NGTCP2_FRAME_CONNECTION_CLOSE ? strerrorcode(fr->error_code) + : strapperrorcode(fr->error_code), + fr->error_code, fr->frame_type, fr->reasonlen, + ngtcp2_encode_printable_ascii(reason, fr->reason, reasonlen)); } static void log_fr_max_data(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, const ngtcp2_max_data *fr, const char *dir) { log->log_printf( - log->user_data, - (NGTCP2_LOG_PKT " MAX_DATA(0x%02" PRIx64 ") max_data=%" PRIu64), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->max_data); + log->user_data, + (NGTCP2_LOG_PKT " MAX_DATA(0x%02" PRIx64 ") max_data=%" PRIu64), + NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->max_data); } static void log_fr_max_stream_data(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, @@ -333,9 +331,9 @@ static void log_fr_max_stream_data(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, static void log_fr_max_streams(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, const ngtcp2_max_streams *fr, const char *dir) { log->log_printf( - log->user_data, - (NGTCP2_LOG_PKT " MAX_STREAMS(0x%02" PRIx64 ") max_streams=%" PRIu64), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->max_streams); + log->user_data, + (NGTCP2_LOG_PKT " MAX_STREAMS(0x%02" PRIx64 ") max_streams=%" PRIu64), + NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->max_streams); } static void log_fr_ping(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, @@ -348,9 +346,9 @@ static void log_fr_data_blocked(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, const ngtcp2_data_blocked *fr, const char *dir) { log->log_printf( - log->user_data, - (NGTCP2_LOG_PKT " DATA_BLOCKED(0x%02" PRIx64 ") offset=%" PRIu64), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->offset); + log->user_data, + (NGTCP2_LOG_PKT " DATA_BLOCKED(0x%02" PRIx64 ") offset=%" PRIu64), + NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->offset); } static void log_fr_stream_data_blocked(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, @@ -367,9 +365,9 @@ static void log_fr_streams_blocked(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, const ngtcp2_streams_blocked *fr, const char *dir) { log->log_printf( - log->user_data, - (NGTCP2_LOG_PKT " STREAMS_BLOCKED(0x%02" PRIx64 ") max_streams=%" PRIu64), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->max_streams); + log->user_data, + (NGTCP2_LOG_PKT " STREAMS_BLOCKED(0x%02" PRIx64 ") max_streams=%" PRIu64), + NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->max_streams); } static void log_fr_new_connection_id(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, @@ -379,15 +377,15 @@ static void log_fr_new_connection_id(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, uint8_t cid[sizeof(fr->cid.data) * 2 + 1]; log->log_printf( - log->user_data, - (NGTCP2_LOG_PKT " NEW_CONNECTION_ID(0x%02" PRIx64 ") seq=%" PRIu64 - " cid=0x%s retire_prior_to=%" PRIu64 - " stateless_reset_token=0x%s"), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->seq, - (const char *)ngtcp2_encode_hex(cid, fr->cid.data, fr->cid.datalen), - fr->retire_prior_to, - (const char *)ngtcp2_encode_hex(buf, fr->stateless_reset_token, - sizeof(fr->stateless_reset_token))); + log->user_data, + (NGTCP2_LOG_PKT " NEW_CONNECTION_ID(0x%02" PRIx64 ") seq=%" PRIu64 + " cid=0x%s retire_prior_to=%" PRIu64 + " stateless_reset_token=0x%s"), + NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->seq, + (const char *)ngtcp2_encode_hex(cid, fr->cid.data, fr->cid.datalen), + fr->retire_prior_to, + (const char *)ngtcp2_encode_hex(buf, fr->stateless_reset_token, + sizeof(fr->stateless_reset_token))); } static void log_fr_stop_sending(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, @@ -406,10 +404,10 @@ static void log_fr_path_challenge(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, uint8_t buf[sizeof(fr->data) * 2 + 1]; log->log_printf( - log->user_data, - (NGTCP2_LOG_PKT " PATH_CHALLENGE(0x%02" PRIx64 ") data=0x%s"), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, - (const char *)ngtcp2_encode_hex(buf, fr->data, sizeof(fr->data))); + log->user_data, + (NGTCP2_LOG_PKT " PATH_CHALLENGE(0x%02" PRIx64 ") data=0x%s"), + NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, + (const char *)ngtcp2_encode_hex(buf, fr->data, sizeof(fr->data))); } static void log_fr_path_response(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, @@ -418,19 +416,19 @@ static void log_fr_path_response(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, uint8_t buf[sizeof(fr->data) * 2 + 1]; log->log_printf( - log->user_data, - (NGTCP2_LOG_PKT " PATH_RESPONSE(0x%02" PRIx64 ") data=0x%s"), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, - (const char *)ngtcp2_encode_hex(buf, fr->data, sizeof(fr->data))); + log->user_data, + (NGTCP2_LOG_PKT " PATH_RESPONSE(0x%02" PRIx64 ") data=0x%s"), + NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, + (const char *)ngtcp2_encode_hex(buf, fr->data, sizeof(fr->data))); } static void log_fr_crypto(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, const ngtcp2_stream *fr, const char *dir) { - log->log_printf(log->user_data, - (NGTCP2_LOG_PKT " CRYPTO(0x%02" PRIx64 ") offset=%" PRIu64 - " len=%" PRIu64), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->offset, - ngtcp2_vec_len(fr->data, fr->datacnt)); + log->log_printf( + log->user_data, + (NGTCP2_LOG_PKT " CRYPTO(0x%02" PRIx64 ") offset=%" PRIu64 " len=%" PRIu64), + NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->offset, + ngtcp2_vec_len(fr->data, fr->datacnt)); } static void log_fr_new_token(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, @@ -448,9 +446,9 @@ static void log_fr_new_token(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, p = ngtcp2_encode_hex(buf, fr->token, fr->tokenlen); } log->log_printf( - log->user_data, - (NGTCP2_LOG_PKT " NEW_TOKEN(0x%02" PRIx64 ") token=0x%s len=%zu"), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, (const char *)p, fr->tokenlen); + log->user_data, + (NGTCP2_LOG_PKT " NEW_TOKEN(0x%02" PRIx64 ") token=0x%s len=%zu"), + NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, (const char *)p, fr->tokenlen); } static void log_fr_retire_connection_id(ngtcp2_log *log, @@ -458,9 +456,9 @@ static void log_fr_retire_connection_id(ngtcp2_log *log, const ngtcp2_retire_connection_id *fr, const char *dir) { log->log_printf( - log->user_data, - (NGTCP2_LOG_PKT " RETIRE_CONNECTION_ID(0x%02" PRIx64 ") seq=%" PRIu64), - NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->seq); + log->user_data, + (NGTCP2_LOG_PKT " RETIRE_CONNECTION_ID(0x%02" PRIx64 ") seq=%" PRIu64), + NGTCP2_LOG_FRM_HD_FIELDS(dir), fr->type, fr->seq); } static void log_fr_handshake_done(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, @@ -601,11 +599,11 @@ void ngtcp2_log_rx_sr(ngtcp2_log *log, const ngtcp2_pkt_stateless_reset *sr) { shd.type = NGTCP2_PKT_STATELESS_RESET; log->log_printf( - log->user_data, (NGTCP2_LOG_PKT " token=0x%s randlen=%zu"), - NGTCP2_LOG_PKT_HD_FIELDS("rx"), - (const char *)ngtcp2_encode_hex(buf, sr->stateless_reset_token, - sizeof(sr->stateless_reset_token)), - sr->randlen); + log->user_data, (NGTCP2_LOG_PKT " token=0x%s randlen=%zu"), + NGTCP2_LOG_PKT_HD_FIELDS("rx"), + (const char *)ngtcp2_encode_hex(buf, sr->stateless_reset_token, + sizeof(sr->stateless_reset_token)), + sr->randlen); } void ngtcp2_log_remote_tp(ngtcp2_log *log, @@ -625,10 +623,10 @@ void ngtcp2_log_remote_tp(ngtcp2_log *log, if (params->stateless_reset_token_present) { log->log_printf( - log->user_data, (NGTCP2_LOG_TP " stateless_reset_token=0x%s"), - NGTCP2_LOG_TP_HD_FIELDS, - (const char *)ngtcp2_encode_hex(token, params->stateless_reset_token, - sizeof(params->stateless_reset_token))); + log->user_data, (NGTCP2_LOG_TP " stateless_reset_token=0x%s"), + NGTCP2_LOG_TP_HD_FIELDS, + (const char *)ngtcp2_encode_hex(token, params->stateless_reset_token, + sizeof(params->stateless_reset_token))); } if (params->preferred_addr_present) { @@ -639,7 +637,7 @@ void ngtcp2_log_remote_tp(ngtcp2_log *log, (NGTCP2_LOG_TP " preferred_address.ipv4_addr=%s"), NGTCP2_LOG_TP_HD_FIELDS, (const char *)ngtcp2_encode_ipv4( - addr, (const uint8_t *)&sa_in->sin_addr)); + addr, (const uint8_t *)&sa_in->sin_addr)); log->log_printf(log->user_data, (NGTCP2_LOG_TP " preferred_address.ipv4_port=%u"), NGTCP2_LOG_TP_HD_FIELDS, ngtcp2_ntohs(sa_in->sin_port)); @@ -652,59 +650,59 @@ void ngtcp2_log_remote_tp(ngtcp2_log *log, (NGTCP2_LOG_TP " preferred_address.ipv6_addr=%s"), NGTCP2_LOG_TP_HD_FIELDS, (const char *)ngtcp2_encode_ipv6( - addr, (const uint8_t *)&sa_in6->sin6_addr)); + addr, (const uint8_t *)&sa_in6->sin6_addr)); log->log_printf(log->user_data, (NGTCP2_LOG_TP " preferred_address.ipv6_port=%u"), NGTCP2_LOG_TP_HD_FIELDS, ngtcp2_ntohs(sa_in6->sin6_port)); } log->log_printf( - log->user_data, (NGTCP2_LOG_TP " preferred_address.cid=0x%s"), - NGTCP2_LOG_TP_HD_FIELDS, - (const char *)ngtcp2_encode_hex(cid, params->preferred_addr.cid.data, - params->preferred_addr.cid.datalen)); + log->user_data, (NGTCP2_LOG_TP " preferred_address.cid=0x%s"), + NGTCP2_LOG_TP_HD_FIELDS, + (const char *)ngtcp2_encode_hex(cid, params->preferred_addr.cid.data, + params->preferred_addr.cid.datalen)); log->log_printf( - log->user_data, - (NGTCP2_LOG_TP " preferred_address.stateless_reset_token=0x%s"), - NGTCP2_LOG_TP_HD_FIELDS, - (const char *)ngtcp2_encode_hex( - token, params->preferred_addr.stateless_reset_token, - sizeof(params->preferred_addr.stateless_reset_token))); + log->user_data, + (NGTCP2_LOG_TP " preferred_address.stateless_reset_token=0x%s"), + NGTCP2_LOG_TP_HD_FIELDS, + (const char *)ngtcp2_encode_hex( + token, params->preferred_addr.stateless_reset_token, + sizeof(params->preferred_addr.stateless_reset_token))); } if (params->original_dcid_present) { log->log_printf( - log->user_data, - (NGTCP2_LOG_TP " original_destination_connection_id=0x%s"), - NGTCP2_LOG_TP_HD_FIELDS, - (const char *)ngtcp2_encode_hex(cid, params->original_dcid.data, - params->original_dcid.datalen)); + log->user_data, + (NGTCP2_LOG_TP " original_destination_connection_id=0x%s"), + NGTCP2_LOG_TP_HD_FIELDS, + (const char *)ngtcp2_encode_hex(cid, params->original_dcid.data, + params->original_dcid.datalen)); } if (params->retry_scid_present) { log->log_printf( - log->user_data, (NGTCP2_LOG_TP " retry_source_connection_id=0x%s"), - NGTCP2_LOG_TP_HD_FIELDS, - (const char *)ngtcp2_encode_hex(cid, params->retry_scid.data, - params->retry_scid.datalen)); + log->user_data, (NGTCP2_LOG_TP " retry_source_connection_id=0x%s"), + NGTCP2_LOG_TP_HD_FIELDS, + (const char *)ngtcp2_encode_hex(cid, params->retry_scid.data, + params->retry_scid.datalen)); } if (params->initial_scid_present) { log->log_printf( - log->user_data, (NGTCP2_LOG_TP " initial_source_connection_id=0x%s"), - NGTCP2_LOG_TP_HD_FIELDS, - (const char *)ngtcp2_encode_hex(cid, params->initial_scid.data, - params->initial_scid.datalen)); + log->user_data, (NGTCP2_LOG_TP " initial_source_connection_id=0x%s"), + NGTCP2_LOG_TP_HD_FIELDS, + (const char *)ngtcp2_encode_hex(cid, params->initial_scid.data, + params->initial_scid.datalen)); } log->log_printf( - log->user_data, - (NGTCP2_LOG_TP " initial_max_stream_data_bidi_local=%" PRIu64), - NGTCP2_LOG_TP_HD_FIELDS, params->initial_max_stream_data_bidi_local); + log->user_data, + (NGTCP2_LOG_TP " initial_max_stream_data_bidi_local=%" PRIu64), + NGTCP2_LOG_TP_HD_FIELDS, params->initial_max_stream_data_bidi_local); log->log_printf( - log->user_data, - (NGTCP2_LOG_TP " initial_max_stream_data_bidi_remote=%" PRIu64), - NGTCP2_LOG_TP_HD_FIELDS, params->initial_max_stream_data_bidi_remote); + log->user_data, + (NGTCP2_LOG_TP " initial_max_stream_data_bidi_remote=%" PRIu64), + NGTCP2_LOG_TP_HD_FIELDS, params->initial_max_stream_data_bidi_remote); log->log_printf(log->user_data, (NGTCP2_LOG_TP " initial_max_stream_data_uni=%" PRIu64), NGTCP2_LOG_TP_HD_FIELDS, params->initial_max_stream_data_uni); @@ -742,21 +740,21 @@ void ngtcp2_log_remote_tp(ngtcp2_log *log, if (params->version_info_present) { log->log_printf( - log->user_data, - (NGTCP2_LOG_TP " version_information.chosen_version=0x%08x"), - NGTCP2_LOG_TP_HD_FIELDS, params->version_info.chosen_version); + log->user_data, + (NGTCP2_LOG_TP " version_information.chosen_version=0x%08x"), + NGTCP2_LOG_TP_HD_FIELDS, params->version_info.chosen_version); assert(!(params->version_info.available_versionslen & 0x3)); for (i = 0, p = params->version_info.available_versions; i < params->version_info.available_versionslen; i += sizeof(uint32_t)) { - p = ngtcp2_get_uint32(&version, p); + p = ngtcp2_get_uint32be(&version, p); log->log_printf( - log->user_data, - (NGTCP2_LOG_TP " version_information.available_versions[%zu]=0x%08x"), - NGTCP2_LOG_TP_HD_FIELDS, i >> 2, version); + log->user_data, + (NGTCP2_LOG_TP " version_information.available_versions[%zu]=0x%08x"), + NGTCP2_LOG_TP_HD_FIELDS, i >> 2, version); } } } @@ -783,18 +781,18 @@ static void log_pkt_hd(ngtcp2_log *log, const ngtcp2_pkt_hd *hd, if (hd->type == NGTCP2_PKT_1RTT) { ngtcp2_log_info( - log, NGTCP2_LOG_EVENT_PKT, "%s pkn=%" PRId64 " dcid=0x%s type=%s k=%d", - dir, hd->pkt_num, - (const char *)ngtcp2_encode_hex(dcid, hd->dcid.data, hd->dcid.datalen), - strpkttype(hd), (hd->flags & NGTCP2_PKT_FLAG_KEY_PHASE) != 0); + log, NGTCP2_LOG_EVENT_PKT, "%s pkn=%" PRId64 " dcid=0x%s type=%s k=%d", + dir, hd->pkt_num, + (const char *)ngtcp2_encode_hex(dcid, hd->dcid.data, hd->dcid.datalen), + strpkttype(hd), (hd->flags & NGTCP2_PKT_FLAG_KEY_PHASE) != 0); } else { ngtcp2_log_info( - log, NGTCP2_LOG_EVENT_PKT, - "%s pkn=%" PRId64 " dcid=0x%s scid=0x%s version=0x%08x type=%s len=%zu", - dir, hd->pkt_num, - (const char *)ngtcp2_encode_hex(dcid, hd->dcid.data, hd->dcid.datalen), - (const char *)ngtcp2_encode_hex(scid, hd->scid.data, hd->scid.datalen), - hd->version, strpkttype(hd), hd->len); + log, NGTCP2_LOG_EVENT_PKT, + "%s pkn=%" PRId64 " dcid=0x%s scid=0x%s version=0x%08x type=%s len=%zu", + dir, hd->pkt_num, + (const char *)ngtcp2_encode_hex(dcid, hd->dcid.data, hd->dcid.datalen), + (const char *)ngtcp2_encode_hex(scid, hd->scid.data, hd->scid.datalen), + hd->version, strpkttype(hd), hd->len); } } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_log.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_log.h index 1280ce04d6385a..13fb81a72e1d51 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_log.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_log.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -129,4 +129,4 @@ void ngtcp2_log_tx_cancel(ngtcp2_log *log, const ngtcp2_pkt_hd *hd); void ngtcp2_log_info(ngtcp2_log *log, ngtcp2_log_event ev, const char *fmt, ...); -#endif /* NGTCP2_LOG_H */ +#endif /* !defined(NGTCP2_LOG_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_macro.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_macro.h index 28d3461bef9238..dfe5e0aed220f8 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_macro.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_macro.h @@ -27,17 +27,14 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include #include -#define ngtcp2_min(A, B) ((A) < (B) ? (A) : (B)) -#define ngtcp2_max(A, B) ((A) > (B) ? (A) : (B)) - #define ngtcp2_struct_of(ptr, type, member) \ - ((type *)(void *)((char *)(ptr)-offsetof(type, member))) + ((type *)(void *)((char *)(ptr) - offsetof(type, member))) /* ngtcp2_list_insert inserts |T| before |*PD|. The contract is that this is singly linked list, and the next element is pointed by next @@ -55,4 +52,30 @@ */ #define ngtcp2_arraylen(A) (sizeof(A) / sizeof(A[0])) -#endif /* NGTCP2_MACRO_H */ +#define ngtcp2_max_def(SUFFIX, T) \ + static inline T ngtcp2_max_##SUFFIX(T a, T b) { return a < b ? b : a; } + +ngtcp2_max_def(int8, int8_t) +ngtcp2_max_def(int16, int16_t) +ngtcp2_max_def(int32, int32_t) +ngtcp2_max_def(int64, int64_t) +ngtcp2_max_def(uint8, uint8_t) +ngtcp2_max_def(uint16, uint16_t) +ngtcp2_max_def(uint32, uint32_t) +ngtcp2_max_def(uint64, uint64_t) +ngtcp2_max_def(size, size_t) + +#define ngtcp2_min_def(SUFFIX, T) \ + static inline T ngtcp2_min_##SUFFIX(T a, T b) { return a < b ? a : b; } + +ngtcp2_min_def(int8, int8_t) +ngtcp2_min_def(int16, int16_t) +ngtcp2_min_def(int32, int32_t) +ngtcp2_min_def(int64, int64_t) +ngtcp2_min_def(uint8, uint8_t) +ngtcp2_min_def(uint16, uint16_t) +ngtcp2_min_def(uint32, uint32_t) +ngtcp2_min_def(uint64, uint64_t) +ngtcp2_min_def(size, size_t) + +#endif /* !defined(NGTCP2_MACRO_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_map.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_map.c index 33e9fcc018b5db..0b66fceac6c993 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_map.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_map.c @@ -31,12 +31,11 @@ #include "ngtcp2_conv.h" -#define NGTCP2_INITIAL_TABLE_LENBITS 4 +#define NGTCP2_INITIAL_HASHBITS 4 void ngtcp2_map_init(ngtcp2_map *map, const ngtcp2_mem *mem) { map->mem = mem; - map->tablelen = 0; - map->tablelenbits = 0; + map->hashbits = 0; map->table = NULL; map->size = 0; } @@ -49,33 +48,20 @@ void ngtcp2_map_free(ngtcp2_map *map) { ngtcp2_mem_free(map->mem, map->table); } -void ngtcp2_map_each_free(ngtcp2_map *map, int (*func)(void *data, void *ptr), - void *ptr) { - uint32_t i; - ngtcp2_map_bucket *bkt; - - for (i = 0; i < map->tablelen; ++i) { - bkt = &map->table[i]; - - if (bkt->data == NULL) { - continue; - } - - func(bkt->data, ptr); - } -} - -int ngtcp2_map_each(ngtcp2_map *map, int (*func)(void *data, void *ptr), +int ngtcp2_map_each(const ngtcp2_map *map, int (*func)(void *data, void *ptr), void *ptr) { int rv; - uint32_t i; + size_t i; ngtcp2_map_bucket *bkt; + size_t tablelen; if (map->size == 0) { return 0; } - for (i = 0; i < map->tablelen; ++i) { + tablelen = 1u << map->hashbits; + + for (i = 0; i < tablelen; ++i) { bkt = &map->table[i]; if (bkt->data == NULL) { @@ -91,82 +77,61 @@ int ngtcp2_map_each(ngtcp2_map *map, int (*func)(void *data, void *ptr), return 0; } -static uint32_t hash(ngtcp2_map_key_type key) { - return (uint32_t)((key * 11400714819323198485llu) >> 32); -} - -static size_t h2idx(uint32_t hash, uint32_t bits) { - return hash >> (32 - bits); -} - -static size_t distance(uint32_t tablelen, uint32_t tablelenbits, - ngtcp2_map_bucket *bkt, size_t idx) { - return (idx - h2idx(bkt->hash, tablelenbits)) & (tablelen - 1); +static size_t hash(ngtcp2_map_key_type key, size_t bits) { + return (size_t)((key * 11400714819323198485llu) >> (64 - bits)); } -static void map_bucket_swap(ngtcp2_map_bucket *bkt, uint32_t *phash, - ngtcp2_map_key_type *pkey, void **pdata) { - uint32_t h = bkt->hash; - ngtcp2_map_key_type key = bkt->key; - void *data = bkt->data; - - bkt->hash = *phash; - bkt->key = *pkey; - bkt->data = *pdata; +static void map_bucket_swap(ngtcp2_map_bucket *a, ngtcp2_map_bucket *b) { + ngtcp2_map_bucket c = *a; - *phash = h; - *pkey = key; - *pdata = data; -} - -static void map_bucket_set_data(ngtcp2_map_bucket *bkt, uint32_t hash, - ngtcp2_map_key_type key, void *data) { - bkt->hash = hash; - bkt->key = key; - bkt->data = data; + *a = *b; + *b = c; } #ifndef WIN32 -void ngtcp2_map_print_distance(ngtcp2_map *map) { - uint32_t i; +void ngtcp2_map_print_distance(const ngtcp2_map *map) { + size_t i; size_t idx; ngtcp2_map_bucket *bkt; + size_t tablelen; - for (i = 0; i < map->tablelen; ++i) { + if (map->size == 0) { + return; + } + + tablelen = 1u << map->hashbits; + + for (i = 0; i < tablelen; ++i) { bkt = &map->table[i]; if (bkt->data == NULL) { - fprintf(stderr, "@%u \n", i); + fprintf(stderr, "@%zu \n", i); continue; } - idx = h2idx(bkt->hash, map->tablelenbits); - fprintf(stderr, "@%u hash=%08x key=%" PRIu64 " base=%zu distance=%zu\n", i, - bkt->hash, bkt->key, idx, - distance(map->tablelen, map->tablelenbits, bkt, idx)); + idx = hash(bkt->key, map->hashbits); + fprintf(stderr, "@%zu hash=%zu key=%" PRIu64 " base=%zu distance=%u\n", i, + hash(bkt->key, map->hashbits), bkt->key, idx, bkt->psl); } } -#endif /* !WIN32 */ +#endif /* !defined(WIN32) */ -static int insert(ngtcp2_map_bucket *table, uint32_t tablelen, - uint32_t tablelenbits, uint32_t hash, ngtcp2_map_key_type key, - void *data) { - size_t idx = h2idx(hash, tablelenbits); - size_t d = 0, dd; - ngtcp2_map_bucket *bkt; +static int insert(ngtcp2_map_bucket *table, size_t hashbits, + ngtcp2_map_key_type key, void *data) { + size_t idx = hash(key, hashbits); + ngtcp2_map_bucket b = {0, key, data}, *bkt; + size_t mask = (1u << hashbits) - 1; for (;;) { bkt = &table[idx]; if (bkt->data == NULL) { - map_bucket_set_data(bkt, hash, key, data); + *bkt = b; return 0; } - dd = distance(tablelen, tablelenbits, bkt, idx); - if (d > dd) { - map_bucket_swap(bkt, &hash, &key, &data); - d = dd; + if (b.psl > bkt->psl) { + map_bucket_swap(bkt, &b); } else if (bkt->key == key) { /* TODO This check is just a waste after first swap or if this function is called from map_resize. That said, there is no @@ -175,41 +140,42 @@ static int insert(ngtcp2_map_bucket *table, uint32_t tablelen, return NGTCP2_ERR_INVALID_ARGUMENT; } - ++d; - idx = (idx + 1) & (tablelen - 1); + ++b.psl; + idx = (idx + 1) & mask; } } -/* new_tablelen must be power of 2 and new_tablelen == (1 << - new_tablelenbits) must hold. */ -static int map_resize(ngtcp2_map *map, uint32_t new_tablelen, - uint32_t new_tablelenbits) { - uint32_t i; +static int map_resize(ngtcp2_map *map, size_t new_hashbits) { + size_t i; ngtcp2_map_bucket *new_table; ngtcp2_map_bucket *bkt; + size_t tablelen; int rv; (void)rv; new_table = - ngtcp2_mem_calloc(map->mem, new_tablelen, sizeof(ngtcp2_map_bucket)); + ngtcp2_mem_calloc(map->mem, 1u << new_hashbits, sizeof(ngtcp2_map_bucket)); if (new_table == NULL) { return NGTCP2_ERR_NOMEM; } - for (i = 0; i < map->tablelen; ++i) { - bkt = &map->table[i]; - if (bkt->data == NULL) { - continue; - } - rv = insert(new_table, new_tablelen, new_tablelenbits, bkt->hash, bkt->key, - bkt->data); + if (map->size) { + tablelen = 1u << map->hashbits; - assert(0 == rv); + for (i = 0; i < tablelen; ++i) { + bkt = &map->table[i]; + if (bkt->data == NULL) { + continue; + } + + rv = insert(new_table, new_hashbits, bkt->key, bkt->data); + + assert(0 == rv); + } } ngtcp2_mem_free(map->mem, map->table); - map->tablelen = new_tablelen; - map->tablelenbits = new_tablelenbits; + map->hashbits = new_hashbits; map->table = new_table; return 0; @@ -221,48 +187,49 @@ int ngtcp2_map_insert(ngtcp2_map *map, ngtcp2_map_key_type key, void *data) { assert(data); /* Load factor is 0.75 */ - if ((map->size + 1) * 4 > map->tablelen * 3) { - if (map->tablelen) { - rv = map_resize(map, map->tablelen * 2, map->tablelenbits + 1); + /* Under the very initial condition, that is map->size == 0 and + map->hashbits == 0, 4 > 3 still holds nicely. */ + if ((map->size + 1) * 4 > (1u << map->hashbits) * 3) { + if (map->hashbits) { + rv = map_resize(map, map->hashbits + 1); if (rv != 0) { return rv; } } else { - rv = map_resize(map, 1 << NGTCP2_INITIAL_TABLE_LENBITS, - NGTCP2_INITIAL_TABLE_LENBITS); + rv = map_resize(map, NGTCP2_INITIAL_HASHBITS); if (rv != 0) { return rv; } } } - rv = insert(map->table, map->tablelen, map->tablelenbits, hash(key), key, - data); + rv = insert(map->table, map->hashbits, key, data); if (rv != 0) { return rv; } + ++map->size; + return 0; } -void *ngtcp2_map_find(ngtcp2_map *map, ngtcp2_map_key_type key) { - uint32_t h; +void *ngtcp2_map_find(const ngtcp2_map *map, ngtcp2_map_key_type key) { size_t idx; ngtcp2_map_bucket *bkt; - size_t d = 0; + size_t psl = 0; + size_t mask; if (map->size == 0) { return NULL; } - h = hash(key); - idx = h2idx(h, map->tablelenbits); + idx = hash(key, map->hashbits); + mask = (1u << map->hashbits) - 1; for (;;) { bkt = &map->table[idx]; - if (bkt->data == NULL || - d > distance(map->tablelen, map->tablelenbits, bkt, idx)) { + if (bkt->data == NULL || psl > bkt->psl) { return NULL; } @@ -270,50 +237,47 @@ void *ngtcp2_map_find(ngtcp2_map *map, ngtcp2_map_key_type key) { return bkt->data; } - ++d; - idx = (idx + 1) & (map->tablelen - 1); + ++psl; + idx = (idx + 1) & mask; } } int ngtcp2_map_remove(ngtcp2_map *map, ngtcp2_map_key_type key) { - uint32_t h; - size_t idx, didx; - ngtcp2_map_bucket *bkt; - size_t d = 0; + size_t idx; + ngtcp2_map_bucket *b, *bkt; + size_t psl = 0; + size_t mask; if (map->size == 0) { return NGTCP2_ERR_INVALID_ARGUMENT; } - h = hash(key); - idx = h2idx(h, map->tablelenbits); + idx = hash(key, map->hashbits); + mask = (1u << map->hashbits) - 1; for (;;) { bkt = &map->table[idx]; - if (bkt->data == NULL || - d > distance(map->tablelen, map->tablelenbits, bkt, idx)) { + if (bkt->data == NULL || psl > bkt->psl) { return NGTCP2_ERR_INVALID_ARGUMENT; } if (bkt->key == key) { - map_bucket_set_data(bkt, 0, 0, NULL); - - didx = idx; - idx = (idx + 1) & (map->tablelen - 1); + b = bkt; + idx = (idx + 1) & mask; for (;;) { bkt = &map->table[idx]; - if (bkt->data == NULL || - distance(map->tablelen, map->tablelenbits, bkt, idx) == 0) { + if (bkt->data == NULL || bkt->psl == 0) { + b->data = NULL; break; } - map->table[didx] = *bkt; - map_bucket_set_data(bkt, 0, 0, NULL); - didx = idx; + --bkt->psl; + *b = *bkt; + b = bkt; - idx = (idx + 1) & (map->tablelen - 1); + idx = (idx + 1) & mask; } --map->size; @@ -321,18 +285,18 @@ int ngtcp2_map_remove(ngtcp2_map *map, ngtcp2_map_key_type key) { return 0; } - ++d; - idx = (idx + 1) & (map->tablelen - 1); + ++psl; + idx = (idx + 1) & mask; } } void ngtcp2_map_clear(ngtcp2_map *map) { - if (map->tablelen == 0) { + if (map->size == 0) { return; } - memset(map->table, 0, sizeof(*map->table) * map->tablelen); + memset(map->table, 0, sizeof(*map->table) * (1u << map->hashbits)); map->size = 0; } -size_t ngtcp2_map_size(ngtcp2_map *map) { return map->size; } +size_t ngtcp2_map_size(const ngtcp2_map *map) { return map->size; } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_map.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_map.h index d05b1657489e45..9d882fb20088d8 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_map.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_map.h @@ -28,7 +28,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -39,7 +39,7 @@ typedef uint64_t ngtcp2_map_key_type; typedef struct ngtcp2_map_bucket { - uint32_t hash; + uint32_t psl; ngtcp2_map_key_type key; void *data; } ngtcp2_map_bucket; @@ -48,33 +48,24 @@ typedef struct ngtcp2_map { ngtcp2_map_bucket *table; const ngtcp2_mem *mem; size_t size; - uint32_t tablelen; - uint32_t tablelenbits; + size_t hashbits; } ngtcp2_map; /* - * Initializes the map |map|. + * ngtcp2_map_init initializes the map |map|. */ void ngtcp2_map_init(ngtcp2_map *map, const ngtcp2_mem *mem); /* - * Deallocates any resources allocated for |map|. The stored entries - * are not freed by this function. Use ngtcp2_map_each_free() to free - * each entries. + * ngtcp2_map_free deallocates any resources allocated for |map|. The + * stored entries are not freed by this function. Use + * ngtcp2_map_each() to free each entry. */ void ngtcp2_map_free(ngtcp2_map *map); /* - * Deallocates each entries using |func| function and any resources - * allocated for |map|. The |func| function is responsible for freeing - * given the |data| object. The |ptr| will be passed to the |func| as - * send argument. The return value of the |func| will be ignored. - */ -void ngtcp2_map_each_free(ngtcp2_map *map, int (*func)(void *data, void *ptr), - void *ptr); - -/* - * Inserts the new |data| with the |key| to the map |map|. + * ngtcp2_map_insert inserts the new |data| with the |key| to the map + * |map|. * * This function returns 0 if it succeeds, or one of the following * negative error codes: @@ -82,57 +73,56 @@ void ngtcp2_map_each_free(ngtcp2_map *map, int (*func)(void *data, void *ptr), * NGTCP2_ERR_INVALID_ARGUMENT * The item associated by |key| already exists. * NGTCP2_ERR_NOMEM - * Out of memory + * Out of memory */ int ngtcp2_map_insert(ngtcp2_map *map, ngtcp2_map_key_type key, void *data); /* - * Returns the data associated by the key |key|. If there is no such - * data, this function returns NULL. + * ngtcp2_map_find returns the entry associated by the key |key|. If + * there is no such entry, this function returns NULL. */ -void *ngtcp2_map_find(ngtcp2_map *map, ngtcp2_map_key_type key); +void *ngtcp2_map_find(const ngtcp2_map *map, ngtcp2_map_key_type key); /* - * Removes the data associated by the key |key| from the |map|. The - * removed data is not freed by this function. + * ngtcp2_map_remove removes the entry associated by the key |key| + * from the |map|. The removed entry is not freed by this function. * * This function returns 0 if it succeeds, or one of the following * negative error codes: * * NGTCP2_ERR_INVALID_ARGUMENT - * The data associated by |key| does not exist. + * The entry associated by |key| does not exist. */ int ngtcp2_map_remove(ngtcp2_map *map, ngtcp2_map_key_type key); /* - * Removes all entries from |map|. + * ngtcp2_map_clear removes all entries from |map|. The removed entry + * is not freed by this function. */ void ngtcp2_map_clear(ngtcp2_map *map); /* - * Returns the number of items stored in the map |map|. + * ngtcp2_map_size returns the number of items stored in the map + * |map|. */ -size_t ngtcp2_map_size(ngtcp2_map *map); +size_t ngtcp2_map_size(const ngtcp2_map *map); /* - * Applies the function |func| to each data in the |map| with the - * optional user supplied pointer |ptr|. + * ngtcp2_map_each applies the function |func| to each entry in the + * |map| with the optional user supplied pointer |ptr|. * * If the |func| returns 0, this function calls the |func| with the - * next data. If the |func| returns nonzero, it will not call the + * next entry. If the |func| returns nonzero, it will not call the * |func| for further entries and return the return value of the * |func| immediately. Thus, this function returns 0 if all the * invocations of the |func| return 0, or nonzero value which the last * invocation of |func| returns. - * - * Don't use this function to free each data. Use - * ngtcp2_map_each_free() instead. */ -int ngtcp2_map_each(ngtcp2_map *map, int (*func)(void *data, void *ptr), +int ngtcp2_map_each(const ngtcp2_map *map, int (*func)(void *data, void *ptr), void *ptr); #ifndef WIN32 -void ngtcp2_map_print_distance(ngtcp2_map *map); -#endif /* !WIN32 */ +void ngtcp2_map_print_distance(const ngtcp2_map *map); +#endif /* !defined(WIN32) */ -#endif /* NGTCP2_MAP_H */ +#endif /* !defined(NGTCP2_MAP_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_mem.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_mem.c index bcce0b5cdfcf02..d30e1f986e97d3 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_mem.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_mem.c @@ -72,7 +72,7 @@ void *ngtcp2_mem_calloc(const ngtcp2_mem *mem, size_t nmemb, size_t size) { void *ngtcp2_mem_realloc(const ngtcp2_mem *mem, void *ptr, size_t size) { return mem->realloc(ptr, size, mem->user_data); } -#else /* MEMDEBUG */ +#else /* defined(MEMDEBUG) */ void *ngtcp2_mem_malloc_debug(const ngtcp2_mem *mem, size_t size, const char *func, const char *file, size_t line) { void *nptr = mem->malloc(size, mem->user_data); @@ -110,4 +110,4 @@ void *ngtcp2_mem_realloc_debug(const ngtcp2_mem *mem, void *ptr, size_t size, return nptr; } -#endif /* MEMDEBUG */ +#endif /* defined(MEMDEBUG) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_mem.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_mem.h index c99b6c59726891..9f818752125523 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_mem.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_mem.h @@ -28,7 +28,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -42,7 +42,7 @@ void ngtcp2_mem_free(const ngtcp2_mem *mem, void *ptr); void *ngtcp2_mem_calloc(const ngtcp2_mem *mem, size_t nmemb, size_t size); void *ngtcp2_mem_realloc(const ngtcp2_mem *mem, void *ptr, size_t size); -#else /* MEMDEBUG */ +#else /* defined(MEMDEBUG) */ void *ngtcp2_mem_malloc_debug(const ngtcp2_mem *mem, size_t size, const char *func, const char *file, size_t line); @@ -67,6 +67,6 @@ void *ngtcp2_mem_realloc_debug(const ngtcp2_mem *mem, void *ptr, size_t size, # define ngtcp2_mem_realloc(MEM, PTR, SIZE) \ ngtcp2_mem_realloc_debug((MEM), (PTR), (SIZE), __func__, __FILE__, __LINE__) -#endif /* MEMDEBUG */ +#endif /* defined(MEMDEBUG) */ -#endif /* NGTCP2_MEM_H */ +#endif /* !defined(NGTCP2_MEM_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_net.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_net.h index 4a2c4041d4d170..103a2fb2d80714 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_net.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_net.h @@ -30,70 +30,68 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #ifdef HAVE_ARPA_INET_H # include -#endif /* HAVE_ARPA_INET_H */ +#endif /* defined(HAVE_ARPA_INET_H) */ #ifdef HAVE_NETINET_IN_H # include -#endif /* HAVE_NETINET_IN_H */ +#endif /* defined(HAVE_NETINET_IN_H) */ #ifdef HAVE_BYTESWAP_H # include -#endif /* HAVE_BYTESWAP_H */ +#endif /* defined(HAVE_BYTESWAP_H) */ #ifdef HAVE_ENDIAN_H # include -#endif /* HAVE_ENDIAN_H */ +#endif /* defined(HAVE_ENDIAN_H) */ #ifdef HAVE_SYS_ENDIAN_H # include -#endif /* HAVE_SYS_ENDIAN_H */ +#endif /* defined(HAVE_SYS_ENDIAN_H) */ -#if defined(__APPLE__) +#ifdef __APPLE__ # include -#endif // __APPLE__ +#endif /* defined(__APPLE__) */ #include -#if defined(HAVE_BE64TOH) || \ - (defined(HAVE_DECL_BE64TOH) && HAVE_DECL_BE64TOH > 0) +#if HAVE_DECL_BE64TOH # define ngtcp2_ntohl64(N) be64toh(N) # define ngtcp2_htonl64(N) htobe64(N) -#else /* !HAVE_BE64TOH */ -# if defined(WORDS_BIGENDIAN) +#else /* !HAVE_DECL_BE64TOH */ +# ifdef WORDS_BIGENDIAN # define ngtcp2_ntohl64(N) (N) # define ngtcp2_htonl64(N) (N) -# else /* !WORDS_BIGENDIAN */ -# if defined(HAVE_BSWAP_64) || \ - (defined(HAVE_DECL_BSWAP_64) && HAVE_DECL_BSWAP_64 > 0) +# else /* !defined(WORDS_BIGENDIAN) */ +# if HAVE_DECL_BSWAP_64 # define ngtcp2_bswap64 bswap_64 # elif defined(WIN32) # define ngtcp2_bswap64 _byteswap_uint64 # elif defined(__APPLE__) # define ngtcp2_bswap64 OSSwapInt64 -# else /* !HAVE_BSWAP_64 && !WIN32 && !__APPLE__ */ +# else /* !(HAVE_DECL_BSWAP_64 || defined(WIN32) || defined(__APPLE__)) */ # define ngtcp2_bswap64(N) \ ((uint64_t)(ngtcp2_ntohl((uint32_t)(N))) << 32 | \ ngtcp2_ntohl((uint32_t)((N) >> 32))) -# endif /* !HAVE_BSWAP_64 && !WIN32 && !__APPLE__ */ +# endif /* !(HAVE_DECL_BSWAP_64 || defined(WIN32) || defined(__APPLE__)) */ # define ngtcp2_ntohl64(N) ngtcp2_bswap64(N) # define ngtcp2_htonl64(N) ngtcp2_bswap64(N) -# endif /* !WORDS_BIGENDIAN */ -#endif /* !HAVE_BE64TOH */ +# endif /* !defined(WORDS_BIGENDIAN) */ +#endif /* !HAVE_DECL_BE64TOH */ -#if defined(WIN32) +#ifdef WIN32 /* Windows requires ws2_32 library for ntonl family functions. We define inline functions for those function so that we don't have dependency on that lib. */ # ifdef _MSC_VER # define STIN static __inline -# else +# else /* !defined(_MSC_VER) */ # define STIN static inline -# endif +# endif /* !defined(_MSC_VER) */ STIN uint32_t ngtcp2_htonl(uint32_t hostlong) { uint32_t res; @@ -131,13 +129,13 @@ STIN uint16_t ngtcp2_ntohs(uint16_t netshort) { return res; } -#else /* !WIN32 */ +#else /* !defined(WIN32) */ # define ngtcp2_htonl htonl # define ngtcp2_htons htons # define ngtcp2_ntohl ntohl # define ngtcp2_ntohs ntohs -#endif /* !WIN32 */ +#endif /* !defined(WIN32) */ -#endif /* NGTCP2_NET_H */ +#endif /* !defined(NGTCP2_NET_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_objalloc.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_objalloc.h index ea73e788317681..cf23de7b2b7f20 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_objalloc.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_objalloc.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -67,9 +67,9 @@ void ngtcp2_objalloc_clear(ngtcp2_objalloc *objalloc); #ifndef NOMEMPOOL # define ngtcp2_objalloc_decl(NAME, TYPE, OPLENTFIELD) \ inline static void ngtcp2_objalloc_##NAME##_init( \ - ngtcp2_objalloc *objalloc, size_t nmemb, const ngtcp2_mem *mem) { \ + ngtcp2_objalloc *objalloc, size_t nmemb, const ngtcp2_mem *mem) { \ ngtcp2_objalloc_init( \ - objalloc, ((sizeof(TYPE) + 0xfu) & ~(uintptr_t)0xfu) * nmemb, mem); \ + objalloc, ((sizeof(TYPE) + 0xfu) & ~(uintptr_t)0xfu) * nmemb, mem); \ } \ \ TYPE *ngtcp2_objalloc_##NAME##_get(ngtcp2_objalloc *objalloc); \ @@ -78,7 +78,7 @@ void ngtcp2_objalloc_clear(ngtcp2_objalloc *objalloc); size_t len); \ \ inline static void ngtcp2_objalloc_##NAME##_release( \ - ngtcp2_objalloc *objalloc, TYPE *obj) { \ + ngtcp2_objalloc *objalloc, TYPE *obj) { \ ngtcp2_opl_push(&objalloc->opl, &obj->OPLENTFIELD); \ } @@ -90,7 +90,7 @@ void ngtcp2_objalloc_clear(ngtcp2_objalloc *objalloc); \ if (!oplent) { \ rv = \ - ngtcp2_balloc_get(&objalloc->balloc, (void **)&obj, sizeof(TYPE)); \ + ngtcp2_balloc_get(&objalloc->balloc, (void **)&obj, sizeof(TYPE)); \ if (rv != 0) { \ return NULL; \ } \ @@ -118,30 +118,30 @@ void ngtcp2_objalloc_clear(ngtcp2_objalloc *objalloc); \ return ngtcp2_struct_of(oplent, TYPE, OPLENTFIELD); \ } -#else /* NOMEMPOOL */ +#else /* defined(NOMEMPOOL) */ # define ngtcp2_objalloc_decl(NAME, TYPE, OPLENTFIELD) \ inline static void ngtcp2_objalloc_##NAME##_init( \ - ngtcp2_objalloc *objalloc, size_t nmemb, const ngtcp2_mem *mem) { \ + ngtcp2_objalloc *objalloc, size_t nmemb, const ngtcp2_mem *mem) { \ ngtcp2_objalloc_init( \ - objalloc, ((sizeof(TYPE) + 0xfu) & ~(uintptr_t)0xfu) * nmemb, mem); \ + objalloc, ((sizeof(TYPE) + 0xfu) & ~(uintptr_t)0xfu) * nmemb, mem); \ } \ \ inline static TYPE *ngtcp2_objalloc_##NAME##_get( \ - ngtcp2_objalloc *objalloc) { \ + ngtcp2_objalloc *objalloc) { \ return ngtcp2_mem_malloc(objalloc->balloc.mem, sizeof(TYPE)); \ } \ \ inline static TYPE *ngtcp2_objalloc_##NAME##_len_get( \ - ngtcp2_objalloc *objalloc, size_t len) { \ + ngtcp2_objalloc *objalloc, size_t len) { \ return ngtcp2_mem_malloc(objalloc->balloc.mem, len); \ } \ \ inline static void ngtcp2_objalloc_##NAME##_release( \ - ngtcp2_objalloc *objalloc, TYPE *obj) { \ + ngtcp2_objalloc *objalloc, TYPE *obj) { \ ngtcp2_mem_free(objalloc->balloc.mem, obj); \ } # define ngtcp2_objalloc_def(NAME, TYPE, OPLENTFIELD) -#endif /* NOMEMPOOL */ +#endif /* defined(NOMEMPOOL) */ -#endif /* NGTCP2_OBJALLOC_H */ +#endif /* !defined(NGTCP2_OBJALLOC_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_opl.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_opl.h index 714aa366304f0d..f2df3f6dccd45e 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_opl.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_opl.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -62,4 +62,4 @@ ngtcp2_opl_entry *ngtcp2_opl_pop(ngtcp2_opl *opl); void ngtcp2_opl_clear(ngtcp2_opl *opl); -#endif /* NGTCP2_OPL_H */ +#endif /* !defined(NGTCP2_OPL_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_path.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_path.h index 0c360e936231c8..a708378db32fbb 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_path.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_path.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -46,4 +46,4 @@ void ngtcp2_path_init(ngtcp2_path *path, const ngtcp2_addr *local, void ngtcp2_path_storage_init2(ngtcp2_path_storage *ps, const ngtcp2_path *path); -#endif /* NGTCP2_PATH_H */ +#endif /* !defined(NGTCP2_PATH_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pkt.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pkt.c index 1687ff254d94c7..5c82e1bd503f98 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pkt.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pkt.c @@ -83,16 +83,19 @@ int ngtcp2_pkt_decode_version_cid(ngtcp2_version_cid *dest, const uint8_t *data, dcidlen = data[5]; len += dcidlen; + if (datalen < len) { return NGTCP2_ERR_INVALID_ARGUMENT; } + scidlen = data[5 + 1 + dcidlen]; len += scidlen; + if (datalen < len) { return NGTCP2_ERR_INVALID_ARGUMENT; } - ngtcp2_get_uint32(&version, &data[1]); + ngtcp2_get_uint32be(&version, &data[1]); supported_version = ngtcp2_is_supported_version(version); @@ -120,6 +123,7 @@ int ngtcp2_pkt_decode_version_cid(ngtcp2_version_cid *dest, const uint8_t *data, if (!supported_version) { return NGTCP2_ERR_VERSION_NEGOTIATION; } + return 0; } @@ -145,16 +149,19 @@ void ngtcp2_pkt_hd_init(ngtcp2_pkt_hd *hd, uint8_t flags, uint8_t type, size_t len) { hd->flags = flags; hd->type = type; + if (dcid) { hd->dcid = *dcid; } else { ngtcp2_cid_zero(&hd->dcid); } + if (scid) { hd->scid = *scid; } else { ngtcp2_cid_zero(&hd->scid); } + hd->pkt_num = pkt_num; hd->token = NULL; hd->tokenlen = 0; @@ -170,10 +177,11 @@ ngtcp2_ssize ngtcp2_pkt_decode_hd_long(ngtcp2_pkt_hd *dest, const uint8_t *pkt, size_t dcil, scil; const uint8_t *p; size_t len = 0; - size_t n; size_t ntokenlen = 0; const uint8_t *token = NULL; size_t tokenlen = 0; + size_t nlonglen = 0; + size_t longlen = 0; uint64_t vi; uint8_t flags = NGTCP2_PKT_FLAG_LONG_FORM; @@ -185,7 +193,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_hd_long(ngtcp2_pkt_hd *dest, const uint8_t *pkt, return NGTCP2_ERR_INVALID_ARGUMENT; } - ngtcp2_get_uint32(&version, &pkt[1]); + ngtcp2_get_uint32be(&version, &pkt[1]); if (version == 0) { type = NGTCP2_PKT_VERSION_NEGOTIATION; @@ -227,6 +235,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_hd_long(ngtcp2_pkt_hd *dest, const uint8_t *pkt, p = &pkt[5]; dcil = *p; + if (dcil > NGTCP2_MAX_CIDLEN) { /* QUIC v1 implementation never expect to receive CID length more than NGTCP2_MAX_CIDLEN. */ @@ -240,9 +249,11 @@ ngtcp2_ssize ngtcp2_pkt_decode_hd_long(ngtcp2_pkt_hd *dest, const uint8_t *pkt, p += 1 + dcil; scil = *p; + if (scil > NGTCP2_MAX_CIDLEN) { return NGTCP2_ERR_INVALID_ARGUMENT; } + len += scil; if (pktlen < len) { @@ -264,6 +275,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_hd_long(ngtcp2_pkt_hd *dest, const uint8_t *pkt, if (pktlen - len < vi) { return NGTCP2_ERR_INVALID_ARGUMENT; } + tokenlen = (size_t)vi; len += tokenlen; @@ -285,12 +297,21 @@ ngtcp2_ssize ngtcp2_pkt_decode_hd_long(ngtcp2_pkt_hd *dest, const uint8_t *pkt, } /* Length */ - n = ngtcp2_get_uvarintlen(p); - len += n - 1; + nlonglen = ngtcp2_get_uvarintlen(p); + len += nlonglen - 1; if (pktlen < len) { return NGTCP2_ERR_INVALID_ARGUMENT; } + + ngtcp2_get_uvarint(&vi, p); +#if SIZE_MAX > UINT32_MAX + if (vi > SIZE_MAX) { + return NGTCP2_ERR_INVALID_ARGUMENT; + } +#endif /* SIZE_MAX > UINT32_MAX */ + + longlen = (size_t)vi; } dest->flags = flags; @@ -309,24 +330,11 @@ ngtcp2_ssize ngtcp2_pkt_decode_hd_long(ngtcp2_pkt_hd *dest, const uint8_t *pkt, dest->tokenlen = tokenlen; p += ntokenlen + tokenlen; - switch (type) { - case NGTCP2_PKT_RETRY: - dest->len = 0; - break; - default: - if (!(flags & NGTCP2_PKT_FLAG_LONG_FORM)) { - assert(type == NGTCP2_PKT_VERSION_NEGOTIATION); - /* Version Negotiation is not a long header packet. */ - dest->len = 0; - break; - } + dest->len = longlen; - p = ngtcp2_get_uvarint(&vi, p); - if (vi > SIZE_MAX) { - return NGTCP2_ERR_INVALID_ARGUMENT; - } - dest->len = (size_t)vi; - } +#ifndef NDEBUG + p += nlonglen; +#endif /* !defined(NDEBUG) */ assert((size_t)(p - pkt) == len); @@ -401,6 +409,7 @@ ngtcp2_ssize ngtcp2_pkt_encode_hd_long(uint8_t *out, size_t outlen, *p = (uint8_t)(NGTCP2_HEADER_FORM_BIT | (ngtcp2_pkt_versioned_type(hd->version, hd->type) << 4) | (uint8_t)(hd->pkt_numlen - 1)); + if (!(hd->flags & NGTCP2_PKT_FLAG_FIXED_BIT_CLEAR)) { *p |= NGTCP2_FIXED_BIT_MASK; } @@ -409,16 +418,20 @@ ngtcp2_ssize ngtcp2_pkt_encode_hd_long(uint8_t *out, size_t outlen, p = ngtcp2_put_uint32be(p, hd->version); *p++ = (uint8_t)hd->dcid.datalen; + if (hd->dcid.datalen) { p = ngtcp2_cpymem(p, hd->dcid.data, hd->dcid.datalen); } + *p++ = (uint8_t)hd->scid.datalen; + if (hd->scid.datalen) { p = ngtcp2_cpymem(p, hd->scid.data, hd->scid.datalen); } if (hd->type == NGTCP2_PKT_INITIAL) { p = ngtcp2_put_uvarint(p, hd->tokenlen); + if (hd->tokenlen) { p = ngtcp2_cpymem(p, hd->token, hd->tokenlen); } @@ -446,9 +459,11 @@ ngtcp2_ssize ngtcp2_pkt_encode_hd_short(uint8_t *out, size_t outlen, p = out; *p = (uint8_t)(hd->pkt_numlen - 1); + if (!(hd->flags & NGTCP2_PKT_FLAG_FIXED_BIT_CLEAR)) { *p |= NGTCP2_FIXED_BIT_MASK; } + if (hd->flags & NGTCP2_PKT_FLAG_KEY_PHASE) { *p |= NGTCP2_SHORT_KEY_PHASE_BIT; } @@ -503,7 +518,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_frame(ngtcp2_frame *dest, const uint8_t *payload, payloadlen); case NGTCP2_FRAME_STREAM_DATA_BLOCKED: return ngtcp2_pkt_decode_stream_data_blocked_frame( - &dest->stream_data_blocked, payload, payloadlen); + &dest->stream_data_blocked, payload, payloadlen); case NGTCP2_FRAME_STREAMS_BLOCKED_BIDI: case NGTCP2_FRAME_STREAMS_BLOCKED_UNI: return ngtcp2_pkt_decode_streams_blocked_frame(&dest->streams_blocked, @@ -530,7 +545,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_frame(ngtcp2_frame *dest, const uint8_t *payload, payloadlen); case NGTCP2_FRAME_RETIRE_CONNECTION_ID: return ngtcp2_pkt_decode_retire_connection_id_frame( - &dest->retire_connection_id, payload, payloadlen); + &dest->retire_connection_id, payload, payloadlen); case NGTCP2_FRAME_HANDSHAKE_DONE: return ngtcp2_pkt_decode_handshake_done_frame(&dest->handshake_done, payload, payloadlen); @@ -613,6 +628,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_stream_frame(ngtcp2_stream *dest, if (payloadlen - len < vi) { return NGTCP2_ERR_FRAME_ENCODING; } + datalen = (size_t)vi; len += datalen; } else { @@ -752,7 +768,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_ack_frame(ngtcp2_ack *dest, } /* TODO We might not decode all ranges. It could be very large. */ - max_rangecnt = ngtcp2_min(NGTCP2_MAX_ACK_RANGES, rangecnt); + max_rangecnt = ngtcp2_min_size(NGTCP2_MAX_ACK_RANGES, rangecnt); p = payload + 1; @@ -770,7 +786,8 @@ ngtcp2_ssize ngtcp2_pkt_decode_ack_frame(ngtcp2_ack *dest, p = ngtcp2_get_uvarint(&range->gap, p); p = ngtcp2_get_uvarint(&range->len, p); } - for (i = max_rangecnt; i < rangecnt; ++i) { + + for (; i < rangecnt; ++i) { p += ngtcp2_get_uvarintlen(p); p += ngtcp2_get_uvarintlen(p); } @@ -820,18 +837,23 @@ ngtcp2_ssize ngtcp2_pkt_decode_reset_stream_frame(ngtcp2_reset_stream *dest, n = ngtcp2_get_uvarintlen(p); len += n - 1; + if (payloadlen < len) { return NGTCP2_ERR_FRAME_ENCODING; } + p += n; n = ngtcp2_get_uvarintlen(p); len += n - 1; + if (payloadlen < len) { return NGTCP2_ERR_FRAME_ENCODING; } + p += n; n = ngtcp2_get_uvarintlen(p); len += n - 1; + if (payloadlen < len) { return NGTCP2_ERR_FRAME_ENCODING; } @@ -849,7 +871,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_reset_stream_frame(ngtcp2_reset_stream *dest, } ngtcp2_ssize ngtcp2_pkt_decode_connection_close_frame( - ngtcp2_connection_close *dest, const uint8_t *payload, size_t payloadlen) { + ngtcp2_connection_close *dest, const uint8_t *payload, size_t payloadlen) { size_t len = 1 + 1 + 1; const uint8_t *p; size_t reasonlen; @@ -868,6 +890,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_connection_close_frame( n = ngtcp2_get_uvarintlen(p); len += n - 1; + if (payloadlen < len) { return NGTCP2_ERR_FRAME_ENCODING; } @@ -879,6 +902,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_connection_close_frame( n = ngtcp2_get_uvarintlen(p); len += n - 1; + if (payloadlen < len) { return NGTCP2_ERR_FRAME_ENCODING; } @@ -888,6 +912,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_connection_close_frame( nreasonlen = ngtcp2_get_uvarintlen(p); len += nreasonlen - 1; + if (payloadlen < len) { return NGTCP2_ERR_FRAME_ENCODING; } @@ -896,6 +921,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_connection_close_frame( if (payloadlen - len < vi) { return NGTCP2_ERR_FRAME_ENCODING; } + reasonlen = (size_t)vi; len += reasonlen; @@ -903,13 +929,16 @@ ngtcp2_ssize ngtcp2_pkt_decode_connection_close_frame( dest->type = type; p = ngtcp2_get_uvarint(&dest->error_code, p); + if (type == NGTCP2_FRAME_CONNECTION_CLOSE) { p = ngtcp2_get_uvarint(&dest->frame_type, p); } else { dest->frame_type = 0; } + dest->reasonlen = reasonlen; p += nreasonlen; + if (reasonlen == 0) { dest->reason = NULL; } else { @@ -951,7 +980,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_max_data_frame(ngtcp2_max_data *dest, } ngtcp2_ssize ngtcp2_pkt_decode_max_stream_data_frame( - ngtcp2_max_stream_data *dest, const uint8_t *payload, size_t payloadlen) { + ngtcp2_max_stream_data *dest, const uint8_t *payload, size_t payloadlen) { size_t len = 1 + 1 + 1; const uint8_t *p; size_t n; @@ -1055,10 +1084,8 @@ ngtcp2_ssize ngtcp2_pkt_decode_data_blocked_frame(ngtcp2_data_blocked *dest, return (ngtcp2_ssize)len; } -ngtcp2_ssize -ngtcp2_pkt_decode_stream_data_blocked_frame(ngtcp2_stream_data_blocked *dest, - const uint8_t *payload, - size_t payloadlen) { +ngtcp2_ssize ngtcp2_pkt_decode_stream_data_blocked_frame( + ngtcp2_stream_data_blocked *dest, const uint8_t *payload, size_t payloadlen) { size_t len = 1 + 1 + 1; const uint8_t *p; size_t n; @@ -1097,7 +1124,7 @@ ngtcp2_pkt_decode_stream_data_blocked_frame(ngtcp2_stream_data_blocked *dest, } ngtcp2_ssize ngtcp2_pkt_decode_streams_blocked_frame( - ngtcp2_streams_blocked *dest, const uint8_t *payload, size_t payloadlen) { + ngtcp2_streams_blocked *dest, const uint8_t *payload, size_t payloadlen) { size_t len = 1 + 1; const uint8_t *p; size_t n; @@ -1124,7 +1151,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_streams_blocked_frame( } ngtcp2_ssize ngtcp2_pkt_decode_new_connection_id_frame( - ngtcp2_new_connection_id *dest, const uint8_t *payload, size_t payloadlen) { + ngtcp2_new_connection_id *dest, const uint8_t *payload, size_t payloadlen) { size_t len = 1 + 1 + 1 + 1 + 16; const uint8_t *p; size_t n; @@ -1138,6 +1165,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_new_connection_id_frame( n = ngtcp2_get_uvarintlen(p); len += n - 1; + if (payloadlen < len) { return NGTCP2_ERR_FRAME_ENCODING; } @@ -1146,6 +1174,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_new_connection_id_frame( n = ngtcp2_get_uvarintlen(p); len += n - 1; + if (payloadlen < len) { return NGTCP2_ERR_FRAME_ENCODING; } @@ -1197,6 +1226,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_stop_sending_frame(ngtcp2_stop_sending *dest, if (payloadlen < len) { return NGTCP2_ERR_FRAME_ENCODING; } + p += n; n = ngtcp2_get_uvarintlen(p); len += n - 1; @@ -1307,6 +1337,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_crypto_frame(ngtcp2_stream *dest, p = ngtcp2_get_uvarint(&dest->offset, p); dest->data[0].len = datalen; p += ndatalen; + if (dest->data[0].len) { dest->data[0].base = (uint8_t *)p; p += dest->data[0].len; @@ -1347,6 +1378,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_new_token_frame(ngtcp2_new_token *dest, if (payloadlen - len < vi) { return NGTCP2_ERR_FRAME_ENCODING; } + datalen = (size_t)vi; len += datalen; @@ -1442,6 +1474,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_datagram_frame(ngtcp2_datagram *dest, datalen = (size_t)vi; len += datalen; + break; default: ngtcp2_unreachable(); @@ -1496,7 +1529,7 @@ ngtcp2_ssize ngtcp2_pkt_encode_frame(uint8_t *out, size_t outlen, return ngtcp2_pkt_encode_data_blocked_frame(out, outlen, &fr->data_blocked); case NGTCP2_FRAME_STREAM_DATA_BLOCKED: return ngtcp2_pkt_encode_stream_data_blocked_frame( - out, outlen, &fr->stream_data_blocked); + out, outlen, &fr->stream_data_blocked); case NGTCP2_FRAME_STREAMS_BLOCKED_BIDI: case NGTCP2_FRAME_STREAMS_BLOCKED_UNI: return ngtcp2_pkt_encode_streams_blocked_frame(out, outlen, @@ -1518,7 +1551,7 @@ ngtcp2_ssize ngtcp2_pkt_encode_frame(uint8_t *out, size_t outlen, return ngtcp2_pkt_encode_new_token_frame(out, outlen, &fr->new_token); case NGTCP2_FRAME_RETIRE_CONNECTION_ID: return ngtcp2_pkt_encode_retire_connection_id_frame( - out, outlen, &fr->retire_connection_id); + out, outlen, &fr->retire_connection_id); case NGTCP2_FRAME_HANDSHAKE_DONE: return ngtcp2_pkt_encode_handshake_done_frame(out, outlen, &fr->handshake_done); @@ -1586,7 +1619,7 @@ ngtcp2_ssize ngtcp2_pkt_encode_stream_frame(uint8_t *out, size_t outlen, } ngtcp2_ssize ngtcp2_pkt_encode_ack_frame(uint8_t *out, size_t outlen, - ngtcp2_ack *fr) { + const ngtcp2_ack *fr) { size_t len = 1 + ngtcp2_put_uvarintlen((uint64_t)fr->largest_ack) + ngtcp2_put_uvarintlen(fr->ack_delay) + ngtcp2_put_uvarintlen(fr->rangecnt) + @@ -1676,8 +1709,8 @@ ngtcp2_pkt_encode_connection_close_frame(uint8_t *out, size_t outlen, const ngtcp2_connection_close *fr) { size_t len = 1 + ngtcp2_put_uvarintlen(fr->error_code) + (fr->type == NGTCP2_FRAME_CONNECTION_CLOSE - ? ngtcp2_put_uvarintlen(fr->frame_type) - : 0) + + ? ngtcp2_put_uvarintlen(fr->frame_type) + : 0) + ngtcp2_put_uvarintlen(fr->reasonlen) + fr->reasonlen; uint8_t *p; @@ -1689,10 +1722,13 @@ ngtcp2_pkt_encode_connection_close_frame(uint8_t *out, size_t outlen, *p++ = (uint8_t)fr->type; p = ngtcp2_put_uvarint(p, fr->error_code); + if (fr->type == NGTCP2_FRAME_CONNECTION_CLOSE) { p = ngtcp2_put_uvarint(p, fr->frame_type); } + p = ngtcp2_put_uvarint(p, fr->reasonlen); + if (fr->reasonlen) { p = ngtcp2_cpymem(p, fr->reason, fr->reasonlen); } @@ -1796,7 +1832,7 @@ ngtcp2_pkt_encode_data_blocked_frame(uint8_t *out, size_t outlen, } ngtcp2_ssize ngtcp2_pkt_encode_stream_data_blocked_frame( - uint8_t *out, size_t outlen, const ngtcp2_stream_data_blocked *fr) { + uint8_t *out, size_t outlen, const ngtcp2_stream_data_blocked *fr) { size_t len = 1 + ngtcp2_put_uvarintlen((uint64_t)fr->stream_id) + ngtcp2_put_uvarintlen(fr->offset); uint8_t *p; @@ -1986,7 +2022,7 @@ ngtcp2_ssize ngtcp2_pkt_encode_new_token_frame(uint8_t *out, size_t outlen, } ngtcp2_ssize ngtcp2_pkt_encode_retire_connection_id_frame( - uint8_t *out, size_t outlen, const ngtcp2_retire_connection_id *fr) { + uint8_t *out, size_t outlen, const ngtcp2_retire_connection_id *fr) { size_t len = 1 + ngtcp2_put_uvarintlen(fr->seq); uint8_t *p; @@ -2023,9 +2059,9 @@ ngtcp2_ssize ngtcp2_pkt_encode_datagram_frame(uint8_t *out, size_t outlen, const ngtcp2_datagram *fr) { uint64_t datalen = ngtcp2_vec_len(fr->data, fr->datacnt); uint64_t len = - 1 + - (fr->type == NGTCP2_FRAME_DATAGRAM ? 0 : ngtcp2_put_uvarintlen(datalen)) + - datalen; + 1 + + (fr->type == NGTCP2_FRAME_DATAGRAM ? 0 : ngtcp2_put_uvarintlen(datalen)) + + datalen; uint8_t *p; size_t i; @@ -2039,6 +2075,7 @@ ngtcp2_ssize ngtcp2_pkt_encode_datagram_frame(uint8_t *out, size_t outlen, p = out; *p++ = (uint8_t)fr->type; + if (fr->type == NGTCP2_FRAME_DATAGRAM_LEN) { p = ngtcp2_put_uvarint(p, datalen); } @@ -2055,9 +2092,9 @@ ngtcp2_ssize ngtcp2_pkt_encode_datagram_frame(uint8_t *out, size_t outlen, } ngtcp2_ssize ngtcp2_pkt_write_version_negotiation( - uint8_t *dest, size_t destlen, uint8_t unused_random, const uint8_t *dcid, - size_t dcidlen, const uint8_t *scid, size_t scidlen, const uint32_t *sv, - size_t nsv) { + uint8_t *dest, size_t destlen, uint8_t unused_random, const uint8_t *dcid, + size_t dcidlen, const uint8_t *scid, size_t scidlen, const uint32_t *sv, + size_t nsv) { size_t len = 1 + 4 + 1 + dcidlen + 1 + scidlen + nsv * 4; uint8_t *p; size_t i; @@ -2074,10 +2111,13 @@ ngtcp2_ssize ngtcp2_pkt_write_version_negotiation( *p++ = 0xc0 | unused_random; p = ngtcp2_put_uint32be(p, 0); *p++ = (uint8_t)dcidlen; + if (dcidlen) { p = ngtcp2_cpymem(p, dcid, dcidlen); } + *p++ = (uint8_t)scidlen; + if (scidlen) { p = ngtcp2_cpymem(p, scid, scidlen); } @@ -2099,7 +2139,7 @@ size_t ngtcp2_pkt_decode_version_negotiation(uint32_t *dest, assert((payloadlen % sizeof(uint32_t)) == 0); for (; payload != end;) { - payload = ngtcp2_get_uint32(dest++, payload); + payload = ngtcp2_get_uint32be(dest++, payload); } return payloadlen / sizeof(uint32_t); @@ -2150,13 +2190,15 @@ int64_t ngtcp2_pkt_adjust_pkt_num(int64_t max_pkt_num, int64_t pkt_num, assert(cand <= (int64_t)NGTCP2_MAX_VARINT - win); return cand + win; } + if (cand > expected + hwin && cand >= win) { return cand - win; } + return cand; } -int ngtcp2_pkt_validate_ack(ngtcp2_ack *fr, int64_t min_pkt_num) { +int ngtcp2_pkt_validate_ack(const ngtcp2_ack *fr, int64_t min_pkt_num) { int64_t largest_ack = fr->largest_ack; size_t i; @@ -2208,7 +2250,7 @@ ngtcp2_pkt_write_stateless_reset(uint8_t *dest, size_t destlen, p = dest; - randlen = ngtcp2_min(destlen - NGTCP2_STATELESS_RESET_TOKENLEN, randlen); + randlen = ngtcp2_min_size(destlen - NGTCP2_STATELESS_RESET_TOKENLEN, randlen); p = ngtcp2_cpymem(p, rand, randlen); p = ngtcp2_cpymem(p, stateless_reset_token, NGTCP2_STATELESS_RESET_TOKENLEN); @@ -2218,10 +2260,10 @@ ngtcp2_pkt_write_stateless_reset(uint8_t *dest, size_t destlen, } ngtcp2_ssize ngtcp2_pkt_write_retry( - uint8_t *dest, size_t destlen, uint32_t version, const ngtcp2_cid *dcid, - const ngtcp2_cid *scid, const ngtcp2_cid *odcid, const uint8_t *token, - size_t tokenlen, ngtcp2_encrypt encrypt, const ngtcp2_crypto_aead *aead, - const ngtcp2_crypto_aead_ctx *aead_ctx) { + uint8_t *dest, size_t destlen, uint32_t version, const ngtcp2_cid *dcid, + const ngtcp2_cid *scid, const ngtcp2_cid *odcid, const uint8_t *token, + size_t tokenlen, ngtcp2_encrypt encrypt, const ngtcp2_crypto_aead *aead, + const ngtcp2_crypto_aead_ctx *aead_ctx) { ngtcp2_pkt_hd hd; uint8_t pseudo_retry[1500]; ngtcp2_ssize pseudo_retrylen; @@ -2247,8 +2289,8 @@ ngtcp2_ssize ngtcp2_pkt_write_retry( /* len = */ 0); pseudo_retrylen = - ngtcp2_pkt_encode_pseudo_retry(pseudo_retry, sizeof(pseudo_retry), &hd, - /* unused = */ 0, odcid, token, tokenlen); + ngtcp2_pkt_encode_pseudo_retry(pseudo_retry, sizeof(pseudo_retry), &hd, + /* unused = */ 0, odcid, token, tokenlen); if (pseudo_retrylen < 0) { return pseudo_retrylen; } @@ -2285,8 +2327,8 @@ ngtcp2_ssize ngtcp2_pkt_write_retry( } ngtcp2_ssize ngtcp2_pkt_encode_pseudo_retry( - uint8_t *dest, size_t destlen, const ngtcp2_pkt_hd *hd, uint8_t unused, - const ngtcp2_cid *odcid, const uint8_t *token, size_t tokenlen) { + uint8_t *dest, size_t destlen, const ngtcp2_pkt_hd *hd, uint8_t unused, + const ngtcp2_cid *odcid, const uint8_t *token, size_t tokenlen) { uint8_t *p = dest; ngtcp2_ssize nwrite; @@ -2382,23 +2424,23 @@ size_t ngtcp2_pkt_stream_max_datalen(int64_t stream_id, uint64_t offset, if (left > 8 + 1073741823 && len > 1073741823) { #if SIZE_MAX > UINT32_MAX - len = ngtcp2_min(len, 4611686018427387903lu); + len = ngtcp2_min_uint64(len, 4611686018427387903lu); #endif /* SIZE_MAX > UINT32_MAX */ - return (size_t)ngtcp2_min(len, (uint64_t)(left - 8)); + return (size_t)ngtcp2_min_uint64(len, (uint64_t)(left - 8)); } if (left > 4 + 16383 && len > 16383) { - len = ngtcp2_min(len, 1073741823); - return (size_t)ngtcp2_min(len, (uint64_t)(left - 4)); + len = ngtcp2_min_uint64(len, 1073741823); + return (size_t)ngtcp2_min_uint64(len, (uint64_t)(left - 4)); } if (left > 2 + 63 && len > 63) { - len = ngtcp2_min(len, 16383); - return (size_t)ngtcp2_min(len, (uint64_t)(left - 2)); + len = ngtcp2_min_uint64(len, 16383); + return (size_t)ngtcp2_min_uint64(len, (uint64_t)(left - 2)); } - len = ngtcp2_min(len, 63); - return (size_t)ngtcp2_min(len, (uint64_t)(left - 1)); + len = ngtcp2_min_uint64(len, 63); + return (size_t)ngtcp2_min_uint64(len, (uint64_t)(left - 1)); } size_t ngtcp2_pkt_crypto_max_datalen(uint64_t offset, size_t len, size_t left) { @@ -2414,23 +2456,23 @@ size_t ngtcp2_pkt_crypto_max_datalen(uint64_t offset, size_t len, size_t left) { if (left > 8 + 1073741823 && len > 1073741823) { #if SIZE_MAX > UINT32_MAX - len = ngtcp2_min(len, 4611686018427387903lu); + len = ngtcp2_min_size(len, 4611686018427387903lu); #endif /* SIZE_MAX > UINT32_MAX */ - return ngtcp2_min(len, left - 8); + return ngtcp2_min_size(len, left - 8); } if (left > 4 + 16383 && len > 16383) { - len = ngtcp2_min(len, 1073741823); - return ngtcp2_min(len, left - 4); + len = ngtcp2_min_size(len, 1073741823); + return ngtcp2_min_size(len, left - 4); } if (left > 2 + 63 && len > 63) { - len = ngtcp2_min(len, 16383); - return ngtcp2_min(len, left - 2); + len = ngtcp2_min_size(len, 16383); + return ngtcp2_min_size(len, left - 2); } - len = ngtcp2_min(len, 63); - return ngtcp2_min(len, left - 1); + len = ngtcp2_min_size(len, 63); + return ngtcp2_min_size(len, left - 1); } size_t ngtcp2_pkt_datagram_framelen(size_t len) { @@ -2528,5 +2570,6 @@ int ngtcp2_pkt_verify_reserved_bits(uint8_t c) { if (c & NGTCP2_HEADER_FORM_BIT) { return (c & NGTCP2_LONG_RESERVED_BIT_MASK) == 0 ? 0 : NGTCP2_ERR_PROTO; } + return (c & NGTCP2_SHORT_RESERVED_BIT_MASK) == 0 ? 0 : NGTCP2_ERR_PROTO; } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pkt.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pkt.h index feec4d32c97bdd..86ebecef7bc870 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pkt.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pkt.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -41,7 +41,6 @@ #define NGTCP2_LONG_RESERVED_BIT_MASK 0x0c /* Short header specific macros */ -#define NGTCP2_SHORT_SPIN_BIT_MASK 0x20 #define NGTCP2_SHORT_RESERVED_BIT_MASK 0x18 #define NGTCP2_SHORT_KEY_PHASE_BIT 0x04 @@ -53,6 +52,7 @@ LENGTH<1> + PKN<1> */ #define NGTCP2_MIN_LONG_HEADERLEN (1 + 4 + 1 + 1 + 1 + 1) +/* STREAM frame specific macros */ #define NGTCP2_STREAM_FIN_BIT 0x01 #define NGTCP2_STREAM_LEN_BIT 0x02 #define NGTCP2_STREAM_OFF_BIT 0x04 @@ -72,9 +72,6 @@ the beginning of the payload. */ #define NGTCP2_DATAGRAM_OVERHEAD (1 + 8) -/* NGTCP2_MIN_FRAME_PAYLOADLEN is the minimum frame payload length. */ -#define NGTCP2_MIN_FRAME_PAYLOADLEN 16 - /* NGTCP2_MAX_SERVER_STREAM_ID_BIDI is the maximum bidirectional server stream ID. */ #define NGTCP2_MAX_SERVER_STREAM_ID_BIDI ((int64_t)0x3ffffffffffffffdll) @@ -95,16 +92,15 @@ /* NGTCP2_MAX_PKT_NUM is the maximum packet number. */ #define NGTCP2_MAX_PKT_NUM ((int64_t)((1ll << 62) - 1)) -/* NGTCP2_MIN_PKT_EXPANDLEN is the minimum packet size expansion in - addition to the minimum DCID length to hide/trigger Stateless - Reset. */ +/* NGTCP2_MIN_PKT_EXPANDLEN is the minimum packet size expansion to + hide/trigger Stateless Reset. */ #define NGTCP2_MIN_PKT_EXPANDLEN 22 /* NGTCP2_RETRY_TAGLEN is the length of Retry packet integrity tag. */ #define NGTCP2_RETRY_TAGLEN 16 -/* NGTCP2_HARD_MAX_UDP_PAYLOAD_SIZE is the maximum UDP payload size - that this library can write. */ +/* NGTCP2_HARD_MAX_UDP_PAYLOAD_SIZE is the maximum UDP datagram + payload size that this library can write. */ #define NGTCP2_HARD_MAX_UDP_PAYLOAD_SIZE ((1 << 24) - 1) /* NGTCP2_PKT_LENGTHLEN is the number of bytes that is occupied by @@ -357,6 +353,11 @@ typedef union ngtcp2_frame { ngtcp2_retire_connection_id retire_connection_id; ngtcp2_handshake_done handshake_done; ngtcp2_datagram datagram; + /* Extend ngtcp2_frame so that ngtcp2_stream has at least additional + 3 ngtcp2_vec, totaling 4 slots, which can store HEADERS header, + HEADERS payload, DATA header, and DATA payload in the standard + sized ngtcp2_frame_chain. */ + uint8_t pad[sizeof(ngtcp2_stream) + sizeof(ngtcp2_vec) * 3]; } ngtcp2_frame; typedef struct ngtcp2_pkt_chain ngtcp2_pkt_chain; @@ -371,7 +372,7 @@ struct ngtcp2_pkt_chain { uint8_t *pkt; /* pktlen is length of a QUIC packet. */ size_t pktlen; - /* dgramlen is length of UDP datagram that a QUIC packet is + /* dgramlen is length of UDP datagram payload that a QUIC packet is included. */ size_t dgramlen; ngtcp2_tstamp ts; @@ -403,11 +404,11 @@ void ngtcp2_pkt_chain_del(ngtcp2_pkt_chain *pc, const ngtcp2_mem *mem); /* * ngtcp2_pkt_hd_init initializes |hd| with the given values. If - * |dcid| and/or |scid| is NULL, DCID and SCID of |hd| is empty - * respectively. |pkt_numlen| is the number of bytes used to encode - * |pkt_num| and either 1, 2, or 4. |version| is QUIC version for - * long header. |len| is the length field of Initial, 0RTT, and - * Handshake packets. + * |dcid| and/or |scid| is NULL, Destination Connection ID and/or + * Source Connection ID of |hd| is empty respectively. |pkt_numlen| + * is the number of bytes used to encode |pkt_num| and either 1, 2, or + * 4. |version| is QUIC version for long header. |len| is the length + * field of Initial, 0RTT, and Handshake packets. */ void ngtcp2_pkt_hd_init(ngtcp2_pkt_hd *hd, uint8_t flags, uint8_t type, const ngtcp2_cid *dcid, const ngtcp2_cid *scid, @@ -417,8 +418,8 @@ void ngtcp2_pkt_hd_init(ngtcp2_pkt_hd *hd, uint8_t flags, uint8_t type, /* * ngtcp2_pkt_encode_hd_long encodes |hd| as QUIC long header into * |out| which has length |outlen|. It returns the number of bytes - * written into |outlen| if it succeeds, or one of the following - * negative error codes: + * written into |out| if it succeeds, or one of the following negative + * error codes: * * NGTCP2_ERR_NOBUF * Buffer is too short @@ -429,8 +430,8 @@ ngtcp2_ssize ngtcp2_pkt_encode_hd_long(uint8_t *out, size_t outlen, /* * ngtcp2_pkt_encode_hd_short encodes |hd| as QUIC short header into * |out| which has length |outlen|. It returns the number of bytes - * written into |outlen| if it succeeds, or one of the following - * negative error codes: + * written into |out| if it succeeds, or one of the following negative + * error codes: * * NGTCP2_ERR_NOBUF * Buffer is too short @@ -457,7 +458,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_frame(ngtcp2_frame *dest, const uint8_t *payload, /** * @function * - * `ngtcp2_pkt_encode_frame` encodes a frame |fm| into the buffer + * `ngtcp2_pkt_encode_frame` encodes a frame |fr| into the buffer * pointed by |out| of length |outlen|. * * This function returns the number of bytes written to the buffer, or @@ -543,7 +544,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_ack_frame(ngtcp2_ack *dest, /* * ngtcp2_pkt_decode_padding_frame decodes contiguous PADDING frames * from |payload| of length |payloadlen|. It continues to parse - * frames as long as the frame type is PADDING. This finishes when it + * frames as long as the frame type is PADDING. It finishes when it * encounters the frame type which is not PADDING, or all input data * is read. The first byte (payload[0]) must be NGTCP2_FRAME_PADDING. * This function returns the exact number of bytes read to decode @@ -573,7 +574,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_reset_stream_frame(ngtcp2_reset_stream *dest, * ngtcp2_pkt_decode_connection_close_frame decodes CONNECTION_CLOSE * frame from |payload| of length |payloadlen|. The result is stored * in the object pointed by |dest|. CONNECTION_CLOSE frame must start - * at payload[0]. This function finishes it decodes one + * at payload[0]. This function finishes when it decodes one * CONNECTION_CLOSE frame, and returns the exact number of bytes read * to decode a frame if it succeeds, or one of the following negative * error codes: @@ -582,7 +583,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_reset_stream_frame(ngtcp2_reset_stream *dest, * Payload is too short to include CONNECTION_CLOSE frame. */ ngtcp2_ssize ngtcp2_pkt_decode_connection_close_frame( - ngtcp2_connection_close *dest, const uint8_t *payload, size_t payloadlen); + ngtcp2_connection_close *dest, const uint8_t *payload, size_t payloadlen); /* * ngtcp2_pkt_decode_max_data_frame decodes MAX_DATA frame from @@ -612,7 +613,7 @@ ngtcp2_ssize ngtcp2_pkt_decode_max_data_frame(ngtcp2_max_data *dest, * Payload is too short to include MAX_STREAM_DATA frame. */ ngtcp2_ssize ngtcp2_pkt_decode_max_stream_data_frame( - ngtcp2_max_stream_data *dest, const uint8_t *payload, size_t payloadlen); + ngtcp2_max_stream_data *dest, const uint8_t *payload, size_t payloadlen); /* * ngtcp2_pkt_decode_max_streams_frame decodes MAX_STREAMS frame from @@ -668,10 +669,8 @@ ngtcp2_ssize ngtcp2_pkt_decode_data_blocked_frame(ngtcp2_data_blocked *dest, * NGTCP2_ERR_FRAME_ENCODING * Payload is too short to include STREAM_DATA_BLOCKED frame. */ -ngtcp2_ssize -ngtcp2_pkt_decode_stream_data_blocked_frame(ngtcp2_stream_data_blocked *dest, - const uint8_t *payload, - size_t payloadlen); +ngtcp2_ssize ngtcp2_pkt_decode_stream_data_blocked_frame( + ngtcp2_stream_data_blocked *dest, const uint8_t *payload, size_t payloadlen); /* * ngtcp2_pkt_decode_streams_blocked_frame decodes STREAMS_BLOCKED @@ -686,7 +685,7 @@ ngtcp2_pkt_decode_stream_data_blocked_frame(ngtcp2_stream_data_blocked *dest, * Payload is too short to include STREAMS_BLOCKED frame. */ ngtcp2_ssize ngtcp2_pkt_decode_streams_blocked_frame( - ngtcp2_streams_blocked *dest, const uint8_t *payload, size_t payloadlen); + ngtcp2_streams_blocked *dest, const uint8_t *payload, size_t payloadlen); /* * ngtcp2_pkt_decode_new_connection_id_frame decodes NEW_CONNECTION_ID @@ -699,11 +698,11 @@ ngtcp2_ssize ngtcp2_pkt_decode_streams_blocked_frame( * * NGTCP2_ERR_FRAME_ENCODING * Payload is too short to include NEW_CONNECTION_ID frame; or the - * length of CID is strictly less than NGTCP2_MIN_CIDLEN or - * greater than NGTCP2_MAX_CIDLEN. + * length of Connection ID is strictly less than NGTCP2_MIN_CIDLEN + * or greater than NGTCP2_MAX_CIDLEN. */ ngtcp2_ssize ngtcp2_pkt_decode_new_connection_id_frame( - ngtcp2_new_connection_id *dest, const uint8_t *payload, size_t payloadlen); + ngtcp2_new_connection_id *dest, const uint8_t *payload, size_t payloadlen); /* * ngtcp2_pkt_decode_stop_sending_frame decodes STOP_SENDING frame @@ -784,20 +783,19 @@ ngtcp2_ssize ngtcp2_pkt_decode_new_token_frame(ngtcp2_new_token *dest, size_t payloadlen); /* - * ngtcp2_pkt_decode_retire_connection_id_frame decodes RETIRE_CONNECTION_ID - * frame from |payload| of length |payloadlen|. The result is stored in the - * object pointed by |dest|. RETIRE_CONNECTION_ID frame must start at - * payload[0]. This function finishes when it decodes one RETIRE_CONNECTION_ID - * frame, and returns the exact number of bytes read to decode a frame - * if it succeeds, or one of the following negative error codes: + * ngtcp2_pkt_decode_retire_connection_id_frame decodes + * RETIRE_CONNECTION_ID frame from |payload| of length |payloadlen|. + * The result is stored in the object pointed by |dest|. + * RETIRE_CONNECTION_ID frame must start at payload[0]. This function + * finishes when it decodes one RETIRE_CONNECTION_ID frame, and + * returns the exact number of bytes read to decode a frame if it + * succeeds, or one of the following negative error codes: * * NGTCP2_ERR_FRAME_ENCODING * Payload is too short to include RETIRE_CONNECTION_ID frame. */ -ngtcp2_ssize -ngtcp2_pkt_decode_retire_connection_id_frame(ngtcp2_retire_connection_id *dest, - const uint8_t *payload, - size_t payloadlen); +ngtcp2_ssize ngtcp2_pkt_decode_retire_connection_id_frame( + ngtcp2_retire_connection_id *dest, const uint8_t *payload, size_t payloadlen); /* * ngtcp2_pkt_decode_handshake_done_frame decodes HANDSHAKE_DONE frame @@ -846,9 +844,6 @@ ngtcp2_ssize ngtcp2_pkt_encode_stream_frame(uint8_t *out, size_t outlen, * ngtcp2_pkt_encode_ack_frame encodes ACK frame |fr| into the buffer * pointed by |out| of length |outlen|. * - * This function assigns & - * ~NGTCP2_FRAME_ACK to fr->flags. - * * This function returns the number of bytes written if it succeeds, * or one of the following negative error codes: * @@ -856,7 +851,7 @@ ngtcp2_ssize ngtcp2_pkt_encode_stream_frame(uint8_t *out, size_t outlen, * Buffer does not have enough capacity to write a frame. */ ngtcp2_ssize ngtcp2_pkt_encode_ack_frame(uint8_t *out, size_t outlen, - ngtcp2_ack *fr); + const ngtcp2_ack *fr); /* * ngtcp2_pkt_encode_padding_frame encodes PADDING frame |fr| into the @@ -980,7 +975,7 @@ ngtcp2_pkt_encode_data_blocked_frame(uint8_t *out, size_t outlen, * Buffer does not have enough capacity to write a frame. */ ngtcp2_ssize ngtcp2_pkt_encode_stream_data_blocked_frame( - uint8_t *out, size_t outlen, const ngtcp2_stream_data_blocked *fr); + uint8_t *out, size_t outlen, const ngtcp2_stream_data_blocked *fr); /* * ngtcp2_pkt_encode_streams_blocked_frame encodes STREAMS_BLOCKED @@ -1079,8 +1074,9 @@ ngtcp2_ssize ngtcp2_pkt_encode_new_token_frame(uint8_t *out, size_t outlen, const ngtcp2_new_token *fr); /* - * ngtcp2_pkt_encode_retire_connection_id_frame encodes RETIRE_CONNECTION_ID - * frame |fr| into the buffer pointed by |out| of length |outlen|. + * ngtcp2_pkt_encode_retire_connection_id_frame encodes + * RETIRE_CONNECTION_ID frame |fr| into the buffer pointed by |out| of + * length |outlen|. * * This function returns the number of bytes written if it succeeds, * or one of the following negative error codes: @@ -1089,7 +1085,7 @@ ngtcp2_ssize ngtcp2_pkt_encode_new_token_frame(uint8_t *out, size_t outlen, * Buffer does not have enough capacity to write a frame. */ ngtcp2_ssize ngtcp2_pkt_encode_retire_connection_id_frame( - uint8_t *out, size_t outlen, const ngtcp2_retire_connection_id *fr); + uint8_t *out, size_t outlen, const ngtcp2_retire_connection_id *fr); /* * ngtcp2_pkt_encode_handshake_done_frame encodes HANDSHAKE_DONE frame @@ -1119,7 +1115,7 @@ ngtcp2_ssize ngtcp2_pkt_encode_datagram_frame(uint8_t *out, size_t outlen, const ngtcp2_datagram *fr); /* - * ngtcp2_pkt_adjust_pkt_num find the full 64 bits packet number for + * ngtcp2_pkt_adjust_pkt_num finds the full 62 bits packet number for * |pkt_num|, which is encoded in |pkt_numlen| bytes. The * |max_pkt_num| is the highest successfully authenticated packet * number. @@ -1128,10 +1124,10 @@ int64_t ngtcp2_pkt_adjust_pkt_num(int64_t max_pkt_num, int64_t pkt_num, size_t pkt_numlen); /* - * ngtcp2_pkt_validate_ack checks that ack is malformed or not. - * |min_pkt_num| is the minimum packet number that an endpoint sends. - * It is an error to receive acknowledgements for a packet less than - * |min_pkt_num|. + * ngtcp2_pkt_validate_ack verifies whether |fr| is malformed or not. + * |min_pkt_num| is the minimum packet number that a local endpoint + * sends. It is an error to receive acknowledgements for a packet + * less than |min_pkt_num|. * * This function returns 0 if it succeeds, or one of the following * negative error codes: @@ -1141,13 +1137,13 @@ int64_t ngtcp2_pkt_adjust_pkt_num(int64_t max_pkt_num, int64_t pkt_num, * NGTCP2_ERR_PROTO * |fr| contains a packet number less than |min_pkt_num|. */ -int ngtcp2_pkt_validate_ack(ngtcp2_ack *fr, int64_t min_pkt_num); +int ngtcp2_pkt_validate_ack(const ngtcp2_ack *fr, int64_t min_pkt_num); /* * ngtcp2_pkt_stream_max_datalen returns the maximum number of bytes * which can be sent for stream denoted by |stream_id|. |offset| is - * an offset of within the stream. |len| is the estimated number of - * bytes to be sent. |left| is the size of buffer. If |left| is too + * an offset within the stream. |len| is the estimated number of + * bytes to send. |left| is the size of buffer. If |left| is too * small to write STREAM frame, this function returns (size_t)-1. */ size_t ngtcp2_pkt_stream_max_datalen(int64_t stream_id, uint64_t offset, @@ -1155,10 +1151,10 @@ size_t ngtcp2_pkt_stream_max_datalen(int64_t stream_id, uint64_t offset, /* * ngtcp2_pkt_crypto_max_datalen returns the maximum number of bytes - * which can be sent for crypto stream. |offset| is an offset of - * within the crypto stream. |len| is the estimated number of bytes - * to be sent. |left| is the size of buffer. If |left| is too small - * to write CRYPTO frame, this function returns (size_t)-1. + * which can be sent for crypto stream. |offset| is an offset within + * the crypto stream. |len| is the estimated number of bytes to send. + * |left| is the size of buffer. If |left| is too small to write + * CRYPTO frame, this function returns (size_t)-1. */ size_t ngtcp2_pkt_crypto_max_datalen(uint64_t offset, size_t len, size_t left); @@ -1191,8 +1187,8 @@ int ngtcp2_pkt_verify_reserved_bits(uint8_t c); * Buffer is too short. */ ngtcp2_ssize ngtcp2_pkt_encode_pseudo_retry( - uint8_t *dest, size_t destlen, const ngtcp2_pkt_hd *hd, uint8_t unused, - const ngtcp2_cid *odcid, const uint8_t *token, size_t tokenlen); + uint8_t *dest, size_t destlen, const ngtcp2_pkt_hd *hd, uint8_t unused, + const ngtcp2_cid *odcid, const uint8_t *token, size_t tokenlen); /* * ngtcp2_pkt_verify_retry_tag verifies Retry packet. The buffer @@ -1229,4 +1225,4 @@ uint8_t ngtcp2_pkt_versioned_type(uint32_t version, uint32_t pkt_type); */ uint8_t ngtcp2_pkt_get_type_long(uint32_t version, uint8_t c); -#endif /* NGTCP2_PKT_H */ +#endif /* !defined(NGTCP2_PKT_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pktns_id.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pktns_id.h index 66b0ee9e6c13cf..9cf8444d32d7eb 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pktns_id.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pktns_id.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -59,4 +59,4 @@ typedef enum ngtcp2_pktns_id { NGTCP2_PKTNS_ID_MAX } ngtcp2_pktns_id; -#endif /* NGTCP2_PKTNS_ID_H */ +#endif /* !defined(NGTCP2_PKTNS_ID_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pmtud.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pmtud.c index 771ef5e026d12d..ebd113f6746217 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pmtud.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pmtud.c @@ -33,18 +33,17 @@ for each probe. */ #define NGTCP2_PMTUD_PROBE_NUM_MAX 3 -static size_t mtu_probes[] = { - 1454 - 48, /* The well known MTU used by a domestic optic fiber - service in Japan. */ - 1390 - 48, /* Typical Tunneled MTU */ - 1280 - 48, /* IPv6 minimum MTU */ - 1492 - 48, /* PPPoE */ +static uint16_t pmtud_default_probes[] = { + 1454 - 48, /* The well known MTU used by a domestic optic fiber + service in Japan. */ + 1390 - 48, /* Typical Tunneled MTU */ + 1280 - 48, /* IPv6 minimum MTU */ + 1492 - 48, /* PPPoE */ }; -#define NGTCP2_MTU_PROBESLEN ngtcp2_arraylen(mtu_probes) - int ngtcp2_pmtud_new(ngtcp2_pmtud **ppmtud, size_t max_udp_payload_size, size_t hard_max_udp_payload_size, int64_t tx_pkt_num, + const uint16_t *probes, size_t probeslen, const ngtcp2_mem *mem) { ngtcp2_pmtud *pmtud = ngtcp2_mem_malloc(mem, sizeof(ngtcp2_pmtud)); @@ -61,11 +60,19 @@ int ngtcp2_pmtud_new(ngtcp2_pmtud **ppmtud, size_t max_udp_payload_size, pmtud->hard_max_udp_payload_size = hard_max_udp_payload_size; pmtud->min_fail_udp_payload_size = SIZE_MAX; - for (; pmtud->mtu_idx < NGTCP2_MTU_PROBESLEN; ++pmtud->mtu_idx) { - if (mtu_probes[pmtud->mtu_idx] > pmtud->hard_max_udp_payload_size) { + if (probeslen) { + pmtud->probes = probes; + pmtud->probeslen = probeslen; + } else { + pmtud->probes = pmtud_default_probes; + pmtud->probeslen = ngtcp2_arraylen(pmtud_default_probes); + } + + for (; pmtud->mtu_idx < pmtud->probeslen; ++pmtud->mtu_idx) { + if (pmtud->probes[pmtud->mtu_idx] > pmtud->hard_max_udp_payload_size) { continue; } - if (mtu_probes[pmtud->mtu_idx] > pmtud->max_udp_payload_size) { + if (pmtud->probes[pmtud->mtu_idx] > pmtud->max_udp_payload_size) { break; } } @@ -84,9 +91,9 @@ void ngtcp2_pmtud_del(ngtcp2_pmtud *pmtud) { } size_t ngtcp2_pmtud_probelen(ngtcp2_pmtud *pmtud) { - assert(pmtud->mtu_idx < NGTCP2_MTU_PROBESLEN); + assert(pmtud->mtu_idx < pmtud->probeslen); - return mtu_probes[pmtud->mtu_idx]; + return pmtud->probes[pmtud->mtu_idx]; } void ngtcp2_pmtud_probe_sent(ngtcp2_pmtud *pmtud, ngtcp2_duration pto, @@ -107,19 +114,19 @@ int ngtcp2_pmtud_require_probe(ngtcp2_pmtud *pmtud) { } static void pmtud_next_probe(ngtcp2_pmtud *pmtud) { - assert(pmtud->mtu_idx < NGTCP2_MTU_PROBESLEN); + assert(pmtud->mtu_idx < pmtud->probeslen); ++pmtud->mtu_idx; pmtud->num_pkts_sent = 0; pmtud->expiry = UINT64_MAX; - for (; pmtud->mtu_idx < NGTCP2_MTU_PROBESLEN; ++pmtud->mtu_idx) { - if (mtu_probes[pmtud->mtu_idx] <= pmtud->max_udp_payload_size || - mtu_probes[pmtud->mtu_idx] > pmtud->hard_max_udp_payload_size) { + for (; pmtud->mtu_idx < pmtud->probeslen; ++pmtud->mtu_idx) { + if (pmtud->probes[pmtud->mtu_idx] <= pmtud->max_udp_payload_size || + pmtud->probes[pmtud->mtu_idx] > pmtud->hard_max_udp_payload_size) { continue; } - if (mtu_probes[pmtud->mtu_idx] < pmtud->min_fail_udp_payload_size) { + if (pmtud->probes[pmtud->mtu_idx] < pmtud->min_fail_udp_payload_size) { break; } } @@ -127,11 +134,11 @@ static void pmtud_next_probe(ngtcp2_pmtud *pmtud) { void ngtcp2_pmtud_probe_success(ngtcp2_pmtud *pmtud, size_t payloadlen) { pmtud->max_udp_payload_size = - ngtcp2_max(pmtud->max_udp_payload_size, payloadlen); + ngtcp2_max_size(pmtud->max_udp_payload_size, payloadlen); - assert(pmtud->mtu_idx < NGTCP2_MTU_PROBESLEN); + assert(pmtud->mtu_idx < pmtud->probeslen); - if (mtu_probes[pmtud->mtu_idx] > pmtud->max_udp_payload_size) { + if (pmtud->probes[pmtud->mtu_idx] > pmtud->max_udp_payload_size) { return; } @@ -149,12 +156,12 @@ void ngtcp2_pmtud_handle_expiry(ngtcp2_pmtud *pmtud, ngtcp2_tstamp ts) { return; } - pmtud->min_fail_udp_payload_size = - ngtcp2_min(pmtud->min_fail_udp_payload_size, mtu_probes[pmtud->mtu_idx]); + pmtud->min_fail_udp_payload_size = ngtcp2_min_size( + pmtud->min_fail_udp_payload_size, pmtud->probes[pmtud->mtu_idx]); pmtud_next_probe(pmtud); } int ngtcp2_pmtud_finished(ngtcp2_pmtud *pmtud) { - return pmtud->mtu_idx >= NGTCP2_MTU_PROBESLEN; + return pmtud->mtu_idx >= pmtud->probeslen; } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pmtud.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pmtud.h index 6b2e691cfc793a..53fc6a538292e0 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pmtud.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pmtud.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -58,6 +58,10 @@ typedef struct ngtcp2_pmtud { /* min_fail_udp_payload_size is the minimum UDP payload size that is known to fail. */ size_t min_fail_udp_payload_size; + /* probes is the array of UDP datagram payload size to probe. */ + const uint16_t *probes; + /* probeslen is the number of probes pointed by probes. */ + size_t probeslen; } ngtcp2_pmtud; /* @@ -70,6 +74,10 @@ typedef struct ngtcp2_pmtud { * larger than or equal to all UDP payload probe candidates. * Therefore, call ngtcp2_pmtud_finished to check this situation. * + * The array pointed by |pmtud_probes| of length |pmtud_probeslen| + * specifies UDP datagram payload size to probe. If |pmtud_probeslen| + * is zero, the default probes are used. + * * This function returns 0 if it succeeds, or one of the following * negative error codes: * @@ -78,6 +86,7 @@ typedef struct ngtcp2_pmtud { */ int ngtcp2_pmtud_new(ngtcp2_pmtud **ppmtud, size_t max_udp_payload_size, size_t hard_max_udp_payload_size, int64_t tx_pkt_num, + const uint16_t *pmtud_probes, size_t pmtud_probeslen, const ngtcp2_mem *mem); /* @@ -120,4 +129,4 @@ void ngtcp2_pmtud_handle_expiry(ngtcp2_pmtud *pmtud, ngtcp2_tstamp ts); */ int ngtcp2_pmtud_finished(ngtcp2_pmtud *pmtud); -#endif /* NGTCP2_PMTUD_H */ +#endif /* !defined(NGTCP2_PMTUD_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_ppe.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_ppe.c index f7c122b1ab406b..13ef2b24908905 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_ppe.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_ppe.c @@ -29,11 +29,13 @@ #include "ngtcp2_str.h" #include "ngtcp2_conv.h" +#include "ngtcp2_macro.h" void ngtcp2_ppe_init(ngtcp2_ppe *ppe, uint8_t *out, size_t outlen, - ngtcp2_crypto_cc *cc) { + size_t dgram_offset, ngtcp2_crypto_cc *cc) { ngtcp2_buf_init(&ppe->buf, out, outlen); + ppe->dgram_offset = dgram_offset; ppe->hdlen = 0; ppe->len_offset = 0; ppe->pkt_num_offset = 0; @@ -53,17 +55,22 @@ int ngtcp2_ppe_encode_hd(ngtcp2_ppe *ppe, const ngtcp2_pkt_hd *hd) { if (hd->flags & NGTCP2_PKT_FLAG_LONG_FORM) { ppe->len_offset = 1 + 4 + 1 + hd->dcid.datalen + 1 + hd->scid.datalen; + if (hd->type == NGTCP2_PKT_INITIAL) { ppe->len_offset += ngtcp2_put_uvarintlen(hd->tokenlen) + hd->tokenlen; } + ppe->pkt_num_offset = ppe->len_offset + NGTCP2_PKT_LENGTHLEN; + rv = ngtcp2_pkt_encode_hd_long( - buf->last, ngtcp2_buf_left(buf) - cc->aead.max_overhead, hd); + buf->last, ngtcp2_buf_left(buf) - cc->aead.max_overhead, hd); } else { ppe->pkt_num_offset = 1 + hd->dcid.datalen; + rv = ngtcp2_pkt_encode_hd_short( - buf->last, ngtcp2_buf_left(buf) - cc->aead.max_overhead, hd); + buf->last, ngtcp2_buf_left(buf) - cc->aead.max_overhead, hd); } + if (rv < 0) { return (int)rv; } @@ -72,7 +79,6 @@ int ngtcp2_ppe_encode_hd(ngtcp2_ppe *ppe, const ngtcp2_pkt_hd *hd) { ppe->pkt_numlen = hd->pkt_numlen; ppe->hdlen = (size_t)rv; - ppe->pkt_num = hd->pkt_num; return 0; @@ -88,7 +94,7 @@ int ngtcp2_ppe_encode_frame(ngtcp2_ppe *ppe, ngtcp2_frame *fr) { } rv = ngtcp2_pkt_encode_frame( - buf->last, ngtcp2_buf_left(buf) - cc->aead.max_overhead, fr); + buf->last, ngtcp2_buf_left(buf) - cc->aead.max_overhead, fr); if (rv < 0) { return (int)rv; } @@ -121,8 +127,8 @@ ngtcp2_ssize ngtcp2_ppe_final(ngtcp2_ppe *ppe, const uint8_t **ppkt) { if (ppe->len_offset) { ngtcp2_put_uvarint30( - buf->begin + ppe->len_offset, - (uint16_t)(payloadlen + ppe->pkt_numlen + cc->aead.max_overhead)); + buf->begin + ppe->len_offset, + (uint16_t)(payloadlen + ppe->pkt_numlen + cc->aead.max_overhead)); } ngtcp2_crypto_create_nonce(ppe->nonce, cc->ckm->iv.base, cc->ckm->iv.len, @@ -136,7 +142,7 @@ ngtcp2_ssize ngtcp2_ppe_final(ngtcp2_ppe *ppe, const uint8_t **ppkt) { buf->last = payload + payloadlen + cc->aead.max_overhead; - /* TODO Check that we have enough space to get sample */ + /* Make sure that we have enough space to get sample */ assert(ppe_sample_offset(ppe) + NGTCP2_HP_SAMPLELEN <= ngtcp2_buf_len(buf)); rv = cc->hp_mask(mask, &cc->hp, &cc->hp_ctx, @@ -164,7 +170,7 @@ ngtcp2_ssize ngtcp2_ppe_final(ngtcp2_ppe *ppe, const uint8_t **ppkt) { return (ngtcp2_ssize)ngtcp2_buf_len(buf); } -size_t ngtcp2_ppe_left(ngtcp2_ppe *ppe) { +size_t ngtcp2_ppe_left(const ngtcp2_ppe *ppe) { ngtcp2_crypto_cc *cc = ppe->cc; if (ngtcp2_buf_left(&ppe->buf) < cc->aead.max_overhead) { @@ -174,57 +180,57 @@ size_t ngtcp2_ppe_left(ngtcp2_ppe *ppe) { return ngtcp2_buf_left(&ppe->buf) - cc->aead.max_overhead; } -size_t ngtcp2_ppe_pktlen(ngtcp2_ppe *ppe) { +size_t ngtcp2_ppe_pktlen(const ngtcp2_ppe *ppe) { ngtcp2_crypto_cc *cc = ppe->cc; return ngtcp2_buf_len(&ppe->buf) + cc->aead.max_overhead; } -size_t ngtcp2_ppe_padding(ngtcp2_ppe *ppe) { - ngtcp2_crypto_cc *cc = ppe->cc; - ngtcp2_buf *buf = &ppe->buf; - size_t len; - - assert(ngtcp2_buf_left(buf) >= cc->aead.max_overhead); - - len = ngtcp2_buf_left(buf) - cc->aead.max_overhead; - memset(buf->last, 0, len); - buf->last += len; - - return len; -} - -size_t ngtcp2_ppe_padding_hp_sample(ngtcp2_ppe *ppe) { +size_t ngtcp2_ppe_padding_size(ngtcp2_ppe *ppe, size_t n) { ngtcp2_crypto_cc *cc = ppe->cc; ngtcp2_buf *buf = &ppe->buf; - size_t max_samplelen; + size_t pktlen = ngtcp2_buf_len(buf) + cc->aead.max_overhead; size_t len = 0; + size_t max_samplelen; - assert(cc->aead.max_overhead); + n = ngtcp2_min_size(n, ngtcp2_buf_cap(buf)); + if (pktlen < n) { + len = n - pktlen; + } + /* Ensure header protection sample */ max_samplelen = - ngtcp2_buf_len(buf) + cc->aead.max_overhead - ppe_sample_offset(ppe); + ngtcp2_buf_len(buf) + cc->aead.max_overhead - ppe_sample_offset(ppe); + if (max_samplelen < NGTCP2_HP_SAMPLELEN) { - len = NGTCP2_HP_SAMPLELEN - max_samplelen; - assert(ngtcp2_ppe_left(ppe) >= len); - memset(buf->last, 0, len); - buf->last += len; + len = ngtcp2_max_size(len, NGTCP2_HP_SAMPLELEN - max_samplelen); } + assert(ngtcp2_buf_left(buf) >= len + cc->aead.max_overhead); + + buf->last = ngtcp2_setmem(buf->last, 0, len); + return len; } -size_t ngtcp2_ppe_padding_size(ngtcp2_ppe *ppe, size_t n) { +size_t ngtcp2_ppe_dgram_padding(ngtcp2_ppe *ppe) { + return ngtcp2_ppe_dgram_padding_size(ppe, NGTCP2_MAX_UDP_PAYLOAD_SIZE); +} + +size_t ngtcp2_ppe_dgram_padding_size(ngtcp2_ppe *ppe, size_t n) { ngtcp2_crypto_cc *cc = ppe->cc; ngtcp2_buf *buf = &ppe->buf; - size_t pktlen = ngtcp2_buf_len(buf) + cc->aead.max_overhead; + size_t dgramlen = + ppe->dgram_offset + ngtcp2_buf_len(buf) + cc->aead.max_overhead; size_t len; - if (pktlen >= n) { + n = ngtcp2_min_size(n, ppe->dgram_offset + ngtcp2_buf_cap(buf)); + + if (dgramlen >= n) { return 0; } - len = n - pktlen; + len = n - dgramlen; buf->last = ngtcp2_setmem(buf->last, 0, len); return len; @@ -232,5 +238,6 @@ size_t ngtcp2_ppe_padding_size(ngtcp2_ppe *ppe, size_t n) { int ngtcp2_ppe_ensure_hp_sample(ngtcp2_ppe *ppe) { ngtcp2_buf *buf = &ppe->buf; + return ngtcp2_buf_left(buf) >= (4 - ppe->pkt_numlen) + NGTCP2_HP_SAMPLELEN; } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_ppe.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_ppe.h index 2a069ef33451ab..660b1482b56671 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_ppe.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_ppe.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -36,11 +36,17 @@ #include "ngtcp2_crypto.h" /* - * ngtcp2_ppe is the Protected Packet Encoder. + * ngtcp2_ppe is the QUIC Packet Encoder. */ typedef struct ngtcp2_ppe { + /* buf is the buffer where a QUIC packet is written. */ ngtcp2_buf buf; + /* cc is the encryption context that includes callback functions to + encrypt a QUIC packet, and AEAD cipher, etc. */ ngtcp2_crypto_cc *cc; + /* dgram_offset is the offset in UDP datagram payload that this QUIC + packet is positioned at. */ + size_t dgram_offset; /* hdlen is the number of bytes for packet header written in buf. */ size_t hdlen; /* len_offset is the offset to Length field. */ @@ -53,7 +59,7 @@ typedef struct ngtcp2_ppe { /* pkt_num is the packet number written in buf. */ int64_t pkt_num; /* nonce is the buffer to store nonce. It should be equal or longer - than then length of IV. */ + than the length of IV. */ uint8_t nonce[32]; } ngtcp2_ppe; @@ -61,7 +67,7 @@ typedef struct ngtcp2_ppe { * ngtcp2_ppe_init initializes |ppe| with the given buffer. */ void ngtcp2_ppe_init(ngtcp2_ppe *ppe, uint8_t *out, size_t outlen, - ngtcp2_crypto_cc *cc); + size_t dgram_offset, ngtcp2_crypto_cc *cc); /* * ngtcp2_ppe_encode_hd encodes |hd|. @@ -86,7 +92,7 @@ int ngtcp2_ppe_encode_hd(ngtcp2_ppe *ppe, const ngtcp2_pkt_hd *hd); int ngtcp2_ppe_encode_frame(ngtcp2_ppe *ppe, ngtcp2_frame *fr); /* - * ngtcp2_ppe_final encrypts QUIC packet payload. If |**ppkt| is not + * ngtcp2_ppe_final encrypts QUIC packet payload. If |ppkt| is not * NULL, the pointer to the packet is assigned to it. * * This function returns the length of QUIC packet, including header, @@ -102,39 +108,46 @@ ngtcp2_ssize ngtcp2_ppe_final(ngtcp2_ppe *ppe, const uint8_t **ppkt); * ngtcp2_ppe_left returns the number of bytes left to write * additional frames. This does not count AEAD overhead. */ -size_t ngtcp2_ppe_left(ngtcp2_ppe *ppe); +size_t ngtcp2_ppe_left(const ngtcp2_ppe *ppe); /* * ngtcp2_ppe_pktlen returns the provisional packet length. It * includes AEAD overhead. */ -size_t ngtcp2_ppe_pktlen(ngtcp2_ppe *ppe); +size_t ngtcp2_ppe_pktlen(const ngtcp2_ppe *ppe); -/** - * @function +/* + * ngtcp2_ppe_dgram_padding is equivalent to call + * ngtcp2_ppe_dgram_padding_size(ppe, NGTCP2_MAX_UDP_PAYLOAD_SIZE). + * This function should be called just before calling + * ngtcp2_ppe_final(). * - * `ngtcp2_ppe_padding` encodes PADDING frames to the end of the - * buffer. This function returns the number of bytes padded. + * This function returns the number of bytes padded. */ -size_t ngtcp2_ppe_padding(ngtcp2_ppe *ppe); +size_t ngtcp2_ppe_dgram_padding(ngtcp2_ppe *ppe); /* - * ngtcp2_ppe_padding_hp_sample adds PADDING frame if the current - * payload does not have enough space for header protection sample. - * This function should be called just before calling - * ngtcp2_ppe_final(). + * ngtcp2_ppe_dgram_padding_size adds PADDING frame so that the size + * of a UDP datagram payload is at least |n| bytes long. If it is + * unable to add PADDING in that way, this function still adds PADDING + * frame as much as possible. This function should be called just + * before calling ngtcp2_ppe_final(). * * This function returns the number of bytes added as padding. */ -size_t ngtcp2_ppe_padding_hp_sample(ngtcp2_ppe *ppe); +size_t ngtcp2_ppe_dgram_padding_size(ngtcp2_ppe *ppe, size_t n); /* * ngtcp2_ppe_padding_size adds PADDING frame so that the size of QUIC - * packet is at least |n| bytes long. If it is unable to add PADDING - * in that way, this function still adds PADDING frame as much as - * possible. This function should be called just before calling - * ngtcp2_ppe_final(). For Short packet, this function should be - * called instead of ngtcp2_ppe_padding_hp_sample. + * packet is at least |n| bytes long and the current payload has + * enough space for header protection sample. If it is unable to add + * PADDING at least |n| bytes, this function still adds PADDING frames + * as much as possible. This function also adds PADDING frames so + * that the minimum padding requirement of header protection is met. + * Those padding may be larger than |n| bytes. It is recommended to + * make sure that ngtcp2_ppe_ensure_hp_sample succeeds after writing + * QUIC packet header. This function should be called just before + * calling ngtcp2_ppe_final(). * * This function returns the number of bytes added as padding. */ @@ -147,4 +160,4 @@ size_t ngtcp2_ppe_padding_size(ngtcp2_ppe *ppe, size_t n); */ int ngtcp2_ppe_ensure_hp_sample(ngtcp2_ppe *ppe); -#endif /* NGTCP2_PPE_H */ +#endif /* !defined(NGTCP2_PPE_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pq.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pq.c index 5e1003d7942e53..19e3e3e36aa5e6 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pq.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pq.c @@ -29,17 +29,20 @@ #include "ngtcp2_macro.h" -void ngtcp2_pq_init(ngtcp2_pq *pq, ngtcp2_less less, const ngtcp2_mem *mem) { - pq->mem = mem; - pq->capacity = 0; +void ngtcp2_pq_init(ngtcp2_pq *pq, ngtcp2_pq_less less, const ngtcp2_mem *mem) { pq->q = NULL; + pq->mem = mem; pq->length = 0; + pq->capacity = 0; pq->less = less; } void ngtcp2_pq_free(ngtcp2_pq *pq) { + if (!pq) { + return; + } + ngtcp2_mem_free(pq->mem, pq->q); - pq->q = NULL; } static void swap(ngtcp2_pq *pq, size_t i, size_t j) { @@ -54,11 +57,13 @@ static void swap(ngtcp2_pq *pq, size_t i, size_t j) { static void bubble_up(ngtcp2_pq *pq, size_t index) { size_t parent; - while (index != 0) { + + while (index) { parent = (index - 1) / 2; if (!pq->less(pq->q[index], pq->q[parent])) { return; } + swap(pq, parent, index); index = parent; } @@ -69,56 +74,64 @@ int ngtcp2_pq_push(ngtcp2_pq *pq, ngtcp2_pq_entry *item) { void *nq; size_t ncapacity; - ncapacity = ngtcp2_max(4, (pq->capacity * 2)); + ncapacity = ngtcp2_max_size(4, pq->capacity * 2); - nq = ngtcp2_mem_realloc(pq->mem, pq->q, - ncapacity * sizeof(ngtcp2_pq_entry *)); + nq = + ngtcp2_mem_realloc(pq->mem, pq->q, ncapacity * sizeof(ngtcp2_pq_entry *)); if (nq == NULL) { return NGTCP2_ERR_NOMEM; } + pq->capacity = ncapacity; pq->q = nq; } + pq->q[pq->length] = item; item->index = pq->length; ++pq->length; - bubble_up(pq, pq->length - 1); + bubble_up(pq, item->index); + return 0; } -ngtcp2_pq_entry *ngtcp2_pq_top(ngtcp2_pq *pq) { +ngtcp2_pq_entry *ngtcp2_pq_top(const ngtcp2_pq *pq) { assert(pq->length); return pq->q[0]; } static void bubble_down(ngtcp2_pq *pq, size_t index) { size_t i, j, minindex; + for (;;) { j = index * 2 + 1; minindex = index; + for (i = 0; i < 2; ++i, ++j) { if (j >= pq->length) { break; } + if (pq->less(pq->q[j], pq->q[minindex])) { minindex = j; } } + if (minindex == index) { return; } + swap(pq, index, minindex); index = minindex; } } void ngtcp2_pq_pop(ngtcp2_pq *pq) { - if (pq->length > 0) { - pq->q[0] = pq->q[pq->length - 1]; - pq->q[0]->index = 0; - --pq->length; - bubble_down(pq, 0); - } + assert(pq->length); + + pq->q[0] = pq->q[pq->length - 1]; + pq->q[0]->index = 0; + --pq->length; + bubble_down(pq, 0); } void ngtcp2_pq_remove(ngtcp2_pq *pq, ngtcp2_pq_entry *item) { @@ -145,20 +158,22 @@ void ngtcp2_pq_remove(ngtcp2_pq *pq, ngtcp2_pq_entry *item) { } } -int ngtcp2_pq_empty(ngtcp2_pq *pq) { return pq->length == 0; } +int ngtcp2_pq_empty(const ngtcp2_pq *pq) { return pq->length == 0; } -size_t ngtcp2_pq_size(ngtcp2_pq *pq) { return pq->length; } +size_t ngtcp2_pq_size(const ngtcp2_pq *pq) { return pq->length; } -int ngtcp2_pq_each(ngtcp2_pq *pq, ngtcp2_pq_item_cb fun, void *arg) { +int ngtcp2_pq_each(const ngtcp2_pq *pq, ngtcp2_pq_item_cb fun, void *arg) { size_t i; if (pq->length == 0) { return 0; } + for (i = 0; i < pq->length; ++i) { if ((*fun)(pq->q[i], arg)) { return 1; } } + return 0; } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pq.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pq.h index 484c8f21f75de2..84961c9143978c 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pq.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pq.h @@ -28,7 +28,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -45,37 +45,39 @@ typedef struct ngtcp2_pq_entry { size_t index; } ngtcp2_pq_entry; -/* "less" function, return nonzero if |lhs| is less than |rhs|. */ -typedef int (*ngtcp2_less)(const ngtcp2_pq_entry *lhs, - const ngtcp2_pq_entry *rhs); +/* ngtcp2_pq_less is a "less" function, that returns nonzero if |lhs| + is considered to be less than |rhs|. */ +typedef int (*ngtcp2_pq_less)(const ngtcp2_pq_entry *lhs, + const ngtcp2_pq_entry *rhs); typedef struct ngtcp2_pq { - /* The pointer to the pointer to the item stored */ + /* q is a pointer to an array that stores the items. */ ngtcp2_pq_entry **q; - /* Memory allocator */ + /* mem is a memory allocator. */ const ngtcp2_mem *mem; - /* The number of items stored */ + /* length is the number of items stored. */ size_t length; - /* The maximum number of items this pq can store. This is - automatically extended when length is reached to this value. */ + /* capacity is the maximum number of items this queue can store. + This is automatically extended when length is reached to this + limit. */ size_t capacity; - /* The less function between items */ - ngtcp2_less less; + /* less is the less function to compare items. */ + ngtcp2_pq_less less; } ngtcp2_pq; /* - * Initializes priority queue |pq| with compare function |cmp|. + * ngtcp2_pq_init initializes |pq| with compare function |cmp|. */ -void ngtcp2_pq_init(ngtcp2_pq *pq, ngtcp2_less less, const ngtcp2_mem *mem); +void ngtcp2_pq_init(ngtcp2_pq *pq, ngtcp2_pq_less less, const ngtcp2_mem *mem); /* - * Deallocates any resources allocated for |pq|. The stored items are - * not freed by this function. + * ngtcp2_pq_free deallocates any resources allocated for |pq|. The + * stored items are not freed by this function. */ void ngtcp2_pq_free(ngtcp2_pq *pq); /* - * Adds |item| to the priority queue |pq|. + * ngtcp2_pq_push adds |item| to |pq|. * * This function returns 0 if it succeeds, or one of the following * negative error codes: @@ -86,41 +88,42 @@ void ngtcp2_pq_free(ngtcp2_pq *pq); int ngtcp2_pq_push(ngtcp2_pq *pq, ngtcp2_pq_entry *item); /* - * Returns item at the top of the queue |pq|. It is undefined if the - * queue is empty. + * ngtcp2_pq_top returns item at the top of |pq|. It is undefined if + * |pq| is empty. */ -ngtcp2_pq_entry *ngtcp2_pq_top(ngtcp2_pq *pq); +ngtcp2_pq_entry *ngtcp2_pq_top(const ngtcp2_pq *pq); /* - * Pops item at the top of the queue |pq|. The popped item is not - * freed by this function. + * ngtcp2_pq_pop pops item at the top of |pq|. The popped item is not + * freed by this function. It is undefined if |pq| is empty. */ void ngtcp2_pq_pop(ngtcp2_pq *pq); /* - * Returns nonzero if the queue |pq| is empty. + * ngtcp2_pq_empty returns nonzero if |pq| is empty. */ -int ngtcp2_pq_empty(ngtcp2_pq *pq); +int ngtcp2_pq_empty(const ngtcp2_pq *pq); /* - * Returns the number of items in the queue |pq|. + * ngtcp2_pq_size returns the number of items |pq| contains. */ -size_t ngtcp2_pq_size(ngtcp2_pq *pq); +size_t ngtcp2_pq_size(const ngtcp2_pq *pq); typedef int (*ngtcp2_pq_item_cb)(ngtcp2_pq_entry *item, void *arg); /* - * Applies |fun| to each item in |pq|. The |arg| is passed as arg - * parameter to callback function. This function must not change the - * ordering key. If the return value from callback is nonzero, this - * function returns 1 immediately without iterating remaining items. - * Otherwise this function returns 0. + * ngtcp2_pq_each applies |fun| to each item in |pq|. The |arg| is + * passed as arg parameter to callback function. This function must + * not change the ordering key. If the return value from callback is + * nonzero, this function returns 1 immediately without iterating + * remaining items. Otherwise this function returns 0. */ -int ngtcp2_pq_each(ngtcp2_pq *pq, ngtcp2_pq_item_cb fun, void *arg); +int ngtcp2_pq_each(const ngtcp2_pq *pq, ngtcp2_pq_item_cb fun, void *arg); /* - * Removes |item| from priority queue. + * ngtcp2_pq_remove removes |item| from |pq|. |pq| must contain + * |item| otherwise the behavior is undefined. */ void ngtcp2_pq_remove(ngtcp2_pq *pq, ngtcp2_pq_entry *item); -#endif /* NGTCP2_PQ_H */ +#endif /* !defined(NGTCP2_PQ_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pv.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pv.c index 314e005293c279..e4fee94eb558d3 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pv.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pv.c @@ -143,7 +143,7 @@ int ngtcp2_pv_validation_timed_out(ngtcp2_pv *pv, ngtcp2_tstamp ts) { ent = ngtcp2_ringbuf_get(&pv->ents.rb, ngtcp2_ringbuf_len(&pv->ents.rb) - 1); t = pv->started_ts + pv->timeout; - t = ngtcp2_max(t, ent->expiry); + t = ngtcp2_max_uint64(t, ent->expiry); return t <= ts; } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pv.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pv.h index c9da15248a3e2b..e9573da497bee4 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_pv.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_pv.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -83,7 +83,7 @@ void ngtcp2_pv_entry_init(ngtcp2_pv_entry *pvent, const uint8_t *data, typedef struct ngtcp2_pv ngtcp2_pv; ngtcp2_static_ringbuf_def(pv_ents, NGTCP2_PV_MAX_ENTRIES, - sizeof(ngtcp2_pv_entry)); + sizeof(ngtcp2_pv_entry)) /* * ngtcp2_pv is the context of a single path validation. */ @@ -191,4 +191,4 @@ ngtcp2_tstamp ngtcp2_pv_next_expiry(ngtcp2_pv *pv); */ void ngtcp2_pv_cancel_expired_timer(ngtcp2_pv *pv, ngtcp2_tstamp ts); -#endif /* NGTCP2_PV_H */ +#endif /* !defined(NGTCP2_PV_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_qlog.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_qlog.c index 27675347794b2a..c0f920746a4dff 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_qlog.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_qlog.c @@ -184,13 +184,12 @@ static uint8_t *write_pair_cid_impl(uint8_t *p, const uint8_t *name, write_pair_cid_impl((DEST), (const uint8_t *)(NAME), sizeof(NAME) - 1, \ (VALUE)) -#define ngtcp2_make_vec_lit(S) \ - { (uint8_t *)(S), sizeof((S)) - 1 } +#define ngtcp2_make_vec_lit(S) {(uint8_t *)(S), sizeof((S)) - 1} static uint8_t *write_common_fields(uint8_t *p, const ngtcp2_cid *odcid) { p = write_verbatim( - p, "\"common_fields\":{\"protocol_type\":[\"QUIC\"],\"time_format\":" - "\"relative\",\"reference_time\":0,\"group_id\":"); + p, "\"common_fields\":{\"protocol_type\":[\"QUIC\"],\"time_format\":" + "\"relative\",\"reference_time\":0,\"group_id\":"); p = write_cid(p, odcid); *p++ = '}'; return p; @@ -198,7 +197,7 @@ static uint8_t *write_common_fields(uint8_t *p, const ngtcp2_cid *odcid) { static uint8_t *write_trace(uint8_t *p, int server, const ngtcp2_cid *odcid) { p = write_verbatim( - p, "\"trace\":{\"vantage_point\":{\"name\":\"ngtcp2\",\"type\":"); + p, "\"trace\":{\"vantage_point\":{\"name\":\"ngtcp2\",\"type\":"); if (server) { p = write_string(p, "server"); } else { @@ -219,7 +218,7 @@ void ngtcp2_qlog_start(ngtcp2_qlog *qlog, const ngtcp2_cid *odcid, int server) { } p = write_verbatim( - p, "\x1e{\"qlog_format\":\"JSON-SEQ\",\"qlog_version\":\"0.3\","); + p, "\x1e{\"qlog_format\":\"JSON-SEQ\",\"qlog_version\":\"0.3\","); p = write_trace(p, server, odcid); p = write_verbatim(p, "}\n"); @@ -243,9 +242,9 @@ static ngtcp2_vec vec_pkt_type_0rtt = ngtcp2_make_vec_lit("0RTT"); static ngtcp2_vec vec_pkt_type_1rtt = ngtcp2_make_vec_lit("1RTT"); static ngtcp2_vec vec_pkt_type_retry = ngtcp2_make_vec_lit("retry"); static ngtcp2_vec vec_pkt_type_version_negotiation = - ngtcp2_make_vec_lit("version_negotiation"); + ngtcp2_make_vec_lit("version_negotiation"); static ngtcp2_vec vec_pkt_type_stateless_reset = - ngtcp2_make_vec_lit("stateless_reset"); + ngtcp2_make_vec_lit("stateless_reset"); static ngtcp2_vec vec_pkt_type_unknown = ngtcp2_make_vec_lit("unknown"); static const ngtcp2_vec *qlog_pkt_type(const ngtcp2_pkt_hd *hd) { @@ -638,8 +637,8 @@ write_connection_close_frame(uint8_t *p, const ngtcp2_connection_close *fr) { */ #define NGTCP2_QLOG_CONNECTION_CLOSE_FRAME_OVERHEAD 131 - p = write_verbatim(p, - "{\"frame_type\":\"connection_close\",\"error_space\":"); + p = + write_verbatim(p, "{\"frame_type\":\"connection_close\",\"error_space\":"); if (fr->type == NGTCP2_FRAME_CONNECTION_CLOSE) { p = write_string(p, "transport"); } else { @@ -772,10 +771,10 @@ void ngtcp2_qlog_write_frame(ngtcp2_qlog *qlog, const ngtcp2_frame *fr) { case NGTCP2_FRAME_ACK_ECN: if (ngtcp2_buf_left(&qlog->buf) < NGTCP2_QLOG_ACK_FRAME_BASE_OVERHEAD + - (size_t)(fr->type == NGTCP2_FRAME_ACK_ECN - ? NGTCP2_QLOG_ACK_FRAME_ECN_OVERHEAD - : 0) + - NGTCP2_QLOG_ACK_FRAME_RANGE_OVERHEAD * (1 + fr->ack.rangecnt) + 1) { + (size_t)(fr->type == NGTCP2_FRAME_ACK_ECN + ? NGTCP2_QLOG_ACK_FRAME_ECN_OVERHEAD + : 0) + + NGTCP2_QLOG_ACK_FRAME_RANGE_OVERHEAD * (1 + fr->ack.rangecnt) + 1) { return; } p = write_ack_frame(p, &fr->ack); @@ -934,8 +933,8 @@ void ngtcp2_qlog_pkt_sent_end(ngtcp2_qlog *qlog, const ngtcp2_pkt_hd *hd, } void ngtcp2_qlog_parameters_set_transport_params( - ngtcp2_qlog *qlog, const ngtcp2_transport_params *params, int server, - ngtcp2_qlog_side side) { + ngtcp2_qlog *qlog, const ngtcp2_transport_params *params, int server, + ngtcp2_qlog_side side) { uint8_t buf[1024]; uint8_t *p = buf; const ngtcp2_preferred_addr *paddr; @@ -950,7 +949,7 @@ void ngtcp2_qlog_parameters_set_transport_params( *p++ = '{'; p = qlog_write_time(qlog, p); p = write_verbatim( - p, ",\"name\":\"transport:parameters_set\",\"data\":{\"owner\":"); + p, ",\"name\":\"transport:parameters_set\",\"data\":{\"owner\":"); if (side == NGTCP2_QLOG_SIDE_LOCAL) { p = write_string(p, "local"); @@ -982,8 +981,8 @@ void ngtcp2_qlog_parameters_set_transport_params( *p++ = ','; p = write_pair_duration(p, "max_idle_timeout", params->max_idle_timeout); *p++ = ','; - p = write_pair_number(p, "max_udp_payload_size", - params->max_udp_payload_size); + p = + write_pair_number(p, "max_udp_payload_size", params->max_udp_payload_size); *p++ = ','; p = write_pair_number(p, "ack_delay_exponent", params->ack_delay_exponent); *p++ = ','; @@ -1106,7 +1105,7 @@ void ngtcp2_qlog_pkt_lost(ngtcp2_qlog *qlog, ngtcp2_rtb_entry *ent) { *p++ = '{'; p = qlog_write_time(qlog, p); p = write_verbatim( - p, ",\"name\":\"recovery:packet_lost\",\"data\":{\"header\":"); + p, ",\"name\":\"recovery:packet_lost\",\"data\":{\"header\":"); hd.type = ent->hd.type; hd.flags = ent->hd.flags; @@ -1134,13 +1133,11 @@ void ngtcp2_qlog_retry_pkt_received(ngtcp2_qlog *qlog, const ngtcp2_pkt_hd *hd, *buf.last++ = '{'; buf.last = qlog_write_time(qlog, buf.last); buf.last = write_verbatim( - buf.last, - ",\"name\":\"transport:packet_received\",\"data\":{\"header\":"); + buf.last, ",\"name\":\"transport:packet_received\",\"data\":{\"header\":"); - if (ngtcp2_buf_left(&buf) < - NGTCP2_QLOG_PKT_HD_OVERHEAD + hd->tokenlen * 2 + - sizeof(",\"retry_token\":{\"data\":\"\"}}}\n") - 1 + - retry->tokenlen * 2) { + if (ngtcp2_buf_left(&buf) < NGTCP2_QLOG_PKT_HD_OVERHEAD + hd->tokenlen * 2 + + sizeof(",\"retry_token\":{\"data\":\"\"}}}\n") - + 1 + retry->tokenlen * 2) { return; } @@ -1154,7 +1151,7 @@ void ngtcp2_qlog_retry_pkt_received(ngtcp2_qlog *qlog, const ngtcp2_pkt_hd *hd, } void ngtcp2_qlog_stateless_reset_pkt_received( - ngtcp2_qlog *qlog, const ngtcp2_pkt_stateless_reset *sr) { + ngtcp2_qlog *qlog, const ngtcp2_pkt_stateless_reset *sr) { uint8_t buf[256]; uint8_t *p = buf; ngtcp2_pkt_hd hd = {0}; @@ -1169,7 +1166,7 @@ void ngtcp2_qlog_stateless_reset_pkt_received( *p++ = '{'; p = qlog_write_time(qlog, p); p = write_verbatim( - p, ",\"name\":\"transport:packet_received\",\"data\":{\"header\":"); + p, ",\"name\":\"transport:packet_received\",\"data\":{\"header\":"); p = write_pkt_hd(p, &hd); *p++ = ','; p = write_pair_hex(p, "stateless_reset_token", sr->stateless_reset_token, @@ -1199,8 +1196,7 @@ void ngtcp2_qlog_version_negotiation_pkt_received(ngtcp2_qlog *qlog, *buf.last++ = '{'; buf.last = qlog_write_time(qlog, buf.last); buf.last = write_verbatim( - buf.last, - ",\"name\":\"transport:packet_received\",\"data\":{\"header\":"); + buf.last, ",\"name\":\"transport:packet_received\",\"data\":{\"header\":"); buf.last = write_pkt_hd(buf.last, hd); buf.last = write_verbatim(buf.last, ",\"supported_versions\":["); diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_qlog.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_qlog.h index b9107c0e5c031a..d2a5f1038c0f42 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_qlog.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_qlog.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -120,8 +120,8 @@ void ngtcp2_qlog_pkt_sent_end(ngtcp2_qlog *qlog, const ngtcp2_pkt_hd *hd, * "local", otherwise "remote". */ void ngtcp2_qlog_parameters_set_transport_params( - ngtcp2_qlog *qlog, const ngtcp2_transport_params *params, int server, - ngtcp2_qlog_side side); + ngtcp2_qlog *qlog, const ngtcp2_transport_params *params, int server, + ngtcp2_qlog_side side); /* * ngtcp2_qlog_metrics_updated writes metrics_updated event of @@ -147,7 +147,7 @@ void ngtcp2_qlog_retry_pkt_received(ngtcp2_qlog *qlog, const ngtcp2_pkt_hd *hd, * event for a received Stateless Reset packet. */ void ngtcp2_qlog_stateless_reset_pkt_received( - ngtcp2_qlog *qlog, const ngtcp2_pkt_stateless_reset *sr); + ngtcp2_qlog *qlog, const ngtcp2_pkt_stateless_reset *sr); /* * ngtcp2_qlog_version_negotiation_pkt_received writes packet_received @@ -158,4 +158,4 @@ void ngtcp2_qlog_version_negotiation_pkt_received(ngtcp2_qlog *qlog, const uint32_t *sv, size_t nsv); -#endif /* NGTCP2_QLOG_H */ +#endif /* !defined(NGTCP2_QLOG_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_range.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_range.c index 9379496b7d4b53..7bbefc0175c595 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_range.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_range.c @@ -33,11 +33,13 @@ void ngtcp2_range_init(ngtcp2_range *r, uint64_t begin, uint64_t end) { ngtcp2_range ngtcp2_range_intersect(const ngtcp2_range *a, const ngtcp2_range *b) { ngtcp2_range r = {0, 0}; - uint64_t begin = ngtcp2_max(a->begin, b->begin); - uint64_t end = ngtcp2_min(a->end, b->end); + uint64_t begin = ngtcp2_max_uint64(a->begin, b->begin); + uint64_t end = ngtcp2_min_uint64(a->end, b->end); + if (begin < end) { ngtcp2_range_init(&r, begin, end); } + return r; } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_range.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_range.h index a776c4ec4768ce..22cd2951859ef1 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_range.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_range.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -58,7 +58,7 @@ uint64_t ngtcp2_range_len(const ngtcp2_range *r); /* * ngtcp2_range_eq returns nonzero if |a| equals |b|, such that - * a->begin == b->begin, and a->end == b->end hold. + * a->begin == b->begin and a->end == b->end hold. */ int ngtcp2_range_eq(const ngtcp2_range *a, const ngtcp2_range *b); @@ -77,4 +77,4 @@ void ngtcp2_range_cut(ngtcp2_range *left, ngtcp2_range *right, */ int ngtcp2_range_not_after(const ngtcp2_range *a, const ngtcp2_range *b); -#endif /* NGTCP2_RANGE_H */ +#endif /* !defined(NGTCP2_RANGE_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_rcvry.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_rcvry.h index 4cb40882192a77..e6321061b59cd1 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_rcvry.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_rcvry.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -37,4 +37,4 @@ /* NGTCP2_GRANULARITY is kGranularity described in RFC 9002. */ #define NGTCP2_GRANULARITY NGTCP2_MILLISECONDS -#endif /* NGTCP2_RCVRY_H */ +#endif /* !defined(NGTCP2_RCVRY_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_ringbuf.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_ringbuf.c index ecfdeb63b3485b..41446739bf699d 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_ringbuf.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_ringbuf.c @@ -27,24 +27,29 @@ #include #ifdef WIN32 # include -#endif +#endif /* defined(WIN32) */ #include "ngtcp2_macro.h" -#if defined(_MSC_VER) && _MSC_VER < 1941 && !defined(__clang__) && \ - (defined(_M_ARM) || defined(_M_ARM64)) -static unsigned int __popcnt(unsigned int x) { - unsigned int c = 0; - for (; x; ++c) { - x &= x - 1; - } - return c; +#ifndef NDEBUG +static int ispow2(size_t n) { +# if defined(_MSC_VER) && !defined(__clang__) && \ + (defined(_M_ARM) || (defined(_M_ARM64) && _MSC_VER < 1941)) + return n && !(n & (n - 1)); +# elif defined(WIN32) + return 1 == __popcnt((unsigned int)n); +# else /* !((defined(_MSC_VER) && !defined(__clang__) && (defined(_M_ARM) || \ + (defined(_M_ARM64) && _MSC_VER < 1941))) || defined(WIN32)) */ + return 1 == __builtin_popcount((unsigned int)n); +# endif /* !((defined(_MSC_VER) && !defined(__clang__) && (defined(_M_ARM) || \ + (defined(_M_ARM64) && _MSC_VER < 1941))) || defined(WIN32)) */ } -#endif +#endif /* !defined(NDEBUG) */ int ngtcp2_ringbuf_init(ngtcp2_ringbuf *rb, size_t nmemb, size_t size, const ngtcp2_mem *mem) { uint8_t *buf = ngtcp2_mem_malloc(mem, nmemb * size); + if (buf == NULL) { return NGTCP2_ERR_NOMEM; } @@ -56,11 +61,7 @@ int ngtcp2_ringbuf_init(ngtcp2_ringbuf *rb, size_t nmemb, size_t size, void ngtcp2_ringbuf_buf_init(ngtcp2_ringbuf *rb, size_t nmemb, size_t size, uint8_t *buf, const ngtcp2_mem *mem) { -#ifdef WIN32 - assert(1 == __popcnt((unsigned int)nmemb)); -#else - assert(1 == __builtin_popcount((unsigned int)nmemb)); -#endif + assert(ispow2(nmemb)); rb->buf = buf; rb->mem = mem; @@ -114,9 +115,10 @@ void ngtcp2_ringbuf_resize(ngtcp2_ringbuf *rb, size_t len) { rb->len = len; } -void *ngtcp2_ringbuf_get(ngtcp2_ringbuf *rb, size_t offset) { +void *ngtcp2_ringbuf_get(const ngtcp2_ringbuf *rb, size_t offset) { assert(offset < rb->len); offset = (rb->first + offset) & rb->mask; + return &rb->buf[offset * rb->size]; } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_ringbuf.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_ringbuf.h index b28a882c4bae84..6953ea6278f88d 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_ringbuf.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_ringbuf.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -51,7 +51,7 @@ typedef struct ngtcp2_ringbuf { /* * ngtcp2_ringbuf_init initializes |rb|. |nmemb| is the number of * elements that can be stored in this buffer. |size| is the size of - * each element. |size| must be power of 2. + * each element. |nmemb| must be power of 2. * * This function returns 0 if it succeeds, or one of the following * negative error codes: @@ -64,7 +64,7 @@ int ngtcp2_ringbuf_init(ngtcp2_ringbuf *rb, size_t nmemb, size_t size, /* * ngtcp2_ringbuf_buf_init initializes |rb| with given buffer and - * size. + * size. Same restrictions are applied as ngtcp2_ringbuf_init. */ void ngtcp2_ringbuf_buf_init(ngtcp2_ringbuf *rb, size_t nmemb, size_t size, uint8_t *buf, const ngtcp2_mem *mem); @@ -79,15 +79,16 @@ void ngtcp2_ringbuf_free(ngtcp2_ringbuf *rb); the buffer backward, and returns the pointer to the element. Caller can store data to the buffer pointed by the returned pointer. If this action exceeds the capacity of the ring buffer, - the last element is silently overwritten, and rb->len remains - unchanged. */ + this function returns the pointer to the last element, and rb->len + remains unchanged. */ void *ngtcp2_ringbuf_push_front(ngtcp2_ringbuf *rb); /* ngtcp2_ringbuf_push_back moves the offset to the last element in the buffer forward, and returns the pointer to the element. Caller can store data to the buffer pointed by the returned pointer. If - this action exceeds the capacity of the ring buffer, the first - element is silently overwritten, and rb->len remains unchanged. */ + this action exceeds the capacity of the ring buffer, this function + returns the pointer to the first element, and rb->len remains + unchanged. */ void *ngtcp2_ringbuf_push_back(ngtcp2_ringbuf *rb); /* @@ -106,7 +107,7 @@ void ngtcp2_ringbuf_resize(ngtcp2_ringbuf *rb, size_t len); /* ngtcp2_ringbuf_get returns the pointer to the element at |offset|. */ -void *ngtcp2_ringbuf_get(ngtcp2_ringbuf *rb, size_t offset); +void *ngtcp2_ringbuf_get(const ngtcp2_ringbuf *rb, size_t offset); /* ngtcp2_ringbuf_len returns the number of elements stored. */ #define ngtcp2_ringbuf_len(RB) ((RB)->len) @@ -115,9 +116,8 @@ void *ngtcp2_ringbuf_get(ngtcp2_ringbuf *rb, size_t offset); int ngtcp2_ringbuf_full(ngtcp2_ringbuf *rb); /* ngtcp2_static_ringbuf_def defines ngtcp2_ringbuf struct wrapper - which uses a statically allocated buffer that is suitable for a - usage that does not change buffer size with ngtcp2_ringbuf_resize. - ngtcp2_ringbuf_free should never be called for rb field. */ + which uses a statically allocated buffer. ngtcp2_ringbuf_free + should never be called for rb field. */ #define ngtcp2_static_ringbuf_def(NAME, NMEMB, SIZE) \ typedef struct ngtcp2_static_ringbuf_##NAME { \ ngtcp2_ringbuf rb; \ @@ -125,8 +125,8 @@ int ngtcp2_ringbuf_full(ngtcp2_ringbuf *rb); } ngtcp2_static_ringbuf_##NAME; \ \ static inline void ngtcp2_static_ringbuf_##NAME##_init( \ - ngtcp2_static_ringbuf_##NAME *srb) { \ + ngtcp2_static_ringbuf_##NAME *srb) { \ ngtcp2_ringbuf_buf_init(&srb->rb, (NMEMB), (SIZE), srb->buf, NULL); \ } -#endif /* NGTCP2_RINGBUF_H */ +#endif /* !defined(NGTCP2_RINGBUF_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_rob.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_rob.c index 5cac383f7bb166..ce6c2113ddf1ce 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_rob.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_rob.c @@ -56,7 +56,6 @@ int ngtcp2_rob_data_new(ngtcp2_rob_data **pd, uint64_t offset, size_t chunk, (*pd)->range.begin = offset; (*pd)->range.end = offset + chunk; (*pd)->begin = (uint8_t *)(*pd) + sizeof(ngtcp2_rob_data); - (*pd)->end = (*pd)->begin + chunk; return 0; } @@ -69,8 +68,8 @@ int ngtcp2_rob_init(ngtcp2_rob *rob, size_t chunk, const ngtcp2_mem *mem) { int rv; ngtcp2_rob_gap *g; - ngtcp2_ksl_init(&rob->gapksl, ngtcp2_ksl_range_compar, sizeof(ngtcp2_range), - mem); + ngtcp2_ksl_init(&rob->gapksl, ngtcp2_ksl_range_compar, + ngtcp2_ksl_range_search, sizeof(ngtcp2_range), mem); rv = ngtcp2_rob_gap_new(&g, 0, UINT64_MAX, mem); if (rv != 0) { @@ -82,8 +81,8 @@ int ngtcp2_rob_init(ngtcp2_rob *rob, size_t chunk, const ngtcp2_mem *mem) { goto fail_gapksl_ksl_insert; } - ngtcp2_ksl_init(&rob->dataksl, ngtcp2_ksl_range_compar, sizeof(ngtcp2_range), - mem); + ngtcp2_ksl_init(&rob->dataksl, ngtcp2_ksl_range_compar, + ngtcp2_ksl_range_search, sizeof(ngtcp2_range), mem); rob->chunk = chunk; rob->mem = mem; @@ -126,8 +125,8 @@ static int rob_write_data(ngtcp2_rob *rob, uint64_t offset, const uint8_t *data, ngtcp2_range range = {offset, offset + len}; ngtcp2_ksl_it it; - for (it = ngtcp2_ksl_lower_bound_compar(&rob->dataksl, &range, - ngtcp2_ksl_range_exclusive_compar); + for (it = ngtcp2_ksl_lower_bound_search(&rob->dataksl, &range, + ngtcp2_ksl_range_exclusive_search); len; ngtcp2_ksl_it_next(&it)) { if (ngtcp2_ksl_it_end(&it)) { d = NULL; @@ -149,7 +148,8 @@ static int rob_write_data(ngtcp2_rob *rob, uint64_t offset, const uint8_t *data, } } - n = (size_t)ngtcp2_min((uint64_t)len, d->range.begin + rob->chunk - offset); + n = (size_t)ngtcp2_min_uint64((uint64_t)len, + d->range.begin + rob->chunk - offset); memcpy(d->begin + (offset - d->range.begin), data, n); offset += n; data += n; @@ -166,8 +166,8 @@ int ngtcp2_rob_push(ngtcp2_rob *rob, uint64_t offset, const uint8_t *data, ngtcp2_range m, l, r, q = {offset, offset + datalen}; ngtcp2_ksl_it it; - it = ngtcp2_ksl_lower_bound_compar(&rob->gapksl, &q, - ngtcp2_ksl_range_exclusive_compar); + it = ngtcp2_ksl_lower_bound_search(&rob->gapksl, &q, + ngtcp2_ksl_range_exclusive_search); for (; !ngtcp2_ksl_it_end(&it);) { g = ngtcp2_ksl_it_get(&it); @@ -176,9 +176,11 @@ int ngtcp2_rob_push(ngtcp2_rob *rob, uint64_t offset, const uint8_t *data, if (!ngtcp2_range_len(&m)) { break; } + if (ngtcp2_range_eq(&g->range, &m)) { ngtcp2_ksl_remove_hint(&rob->gapksl, &it, &it, &g->range); ngtcp2_rob_gap_del(g, rob->mem); + rv = rob_write_data(rob, m.begin, data + (m.begin - offset), (size_t)ngtcp2_range_len(&m)); if (rv != 0) { @@ -187,17 +189,21 @@ int ngtcp2_rob_push(ngtcp2_rob *rob, uint64_t offset, const uint8_t *data, continue; } + ngtcp2_range_cut(&l, &r, &g->range, &m); + if (ngtcp2_range_len(&l)) { ngtcp2_ksl_update_key(&rob->gapksl, &g->range, &l); g->range = l; if (ngtcp2_range_len(&r)) { ngtcp2_rob_gap *ng; + rv = ngtcp2_rob_gap_new(&ng, r.begin, r.end, rob->mem); if (rv != 0) { return rv; } + rv = ngtcp2_ksl_insert(&rob->gapksl, &it, &ng->range, ng); if (rv != 0) { ngtcp2_rob_gap_del(ng, rob->mem); @@ -208,13 +214,16 @@ int ngtcp2_rob_push(ngtcp2_rob *rob, uint64_t offset, const uint8_t *data, ngtcp2_ksl_update_key(&rob->gapksl, &g->range, &r); g->range = r; } + rv = rob_write_data(rob, m.begin, data + (m.begin - offset), (size_t)ngtcp2_range_len(&m)); if (rv != 0) { return rv; } + ngtcp2_ksl_it_next(&it); } + return 0; } @@ -230,12 +239,16 @@ void ngtcp2_rob_remove_prefix(ngtcp2_rob *rob, uint64_t offset) { if (offset <= g->range.begin) { break; } + if (offset < g->range.end) { ngtcp2_range r = {offset, g->range.end}; + ngtcp2_ksl_update_key(&rob->gapksl, &g->range, &r); g->range.begin = offset; + break; } + ngtcp2_ksl_remove_hint(&rob->gapksl, &it, &it, &g->range); ngtcp2_rob_gap_del(g, rob->mem); } @@ -247,12 +260,13 @@ void ngtcp2_rob_remove_prefix(ngtcp2_rob *rob, uint64_t offset) { if (offset < d->range.begin + rob->chunk) { return; } + ngtcp2_ksl_remove_hint(&rob->dataksl, &it, &it, &d->range); ngtcp2_rob_data_del(d, rob->mem); } } -size_t ngtcp2_rob_data_at(ngtcp2_rob *rob, const uint8_t **pdest, +size_t ngtcp2_rob_data_at(const ngtcp2_rob *rob, const uint8_t **pdest, uint64_t offset) { ngtcp2_rob_gap *g; ngtcp2_rob_data *d; @@ -278,8 +292,9 @@ size_t ngtcp2_rob_data_at(ngtcp2_rob *rob, const uint8_t **pdest, *pdest = d->begin + (offset - d->range.begin); - return (size_t)(ngtcp2_min(g->range.begin, d->range.begin + rob->chunk) - - offset); + return ( + size_t)(ngtcp2_min_uint64(g->range.begin, d->range.begin + rob->chunk) - + offset); } void ngtcp2_rob_pop(ngtcp2_rob *rob, uint64_t offset, size_t len) { @@ -299,7 +314,7 @@ void ngtcp2_rob_pop(ngtcp2_rob *rob, uint64_t offset, size_t len) { ngtcp2_rob_data_del(d, rob->mem); } -uint64_t ngtcp2_rob_first_gap_offset(ngtcp2_rob *rob) { +uint64_t ngtcp2_rob_first_gap_offset(const ngtcp2_rob *rob) { ngtcp2_ksl_it it = ngtcp2_ksl_begin(&rob->gapksl); ngtcp2_rob_gap *g; @@ -312,6 +327,6 @@ uint64_t ngtcp2_rob_first_gap_offset(ngtcp2_rob *rob) { return g->range.begin; } -int ngtcp2_rob_data_buffered(ngtcp2_rob *rob) { +int ngtcp2_rob_data_buffered(const ngtcp2_rob *rob) { return ngtcp2_ksl_len(&rob->dataksl) != 0; } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_rob.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_rob.h index 6518d56c539185..d53b5160b10230 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_rob.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_rob.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -70,12 +70,10 @@ void ngtcp2_rob_gap_del(ngtcp2_rob_gap *g, const ngtcp2_mem *mem); * ngtcp2_rob_data holds the buffered stream data. */ typedef struct ngtcp2_rob_data { - /* range is the range of this gap. */ + /* range is the range of this data. */ ngtcp2_range range; /* begin points to the buffer. */ uint8_t *begin; - /* end points to the one beyond of the last byte of the buffer */ - uint8_t *end; } ngtcp2_rob_data; /* @@ -110,8 +108,8 @@ typedef struct ngtcp2_rob { /* gapksl maintains the range of offset which is not received yet. Initially, its range is [0, UINT64_MAX). */ ngtcp2_ksl gapksl; - /* dataksl maintains the list of buffers which store received data - ordered by stream offset. */ + /* dataksl maintains the buffers which store received out-of-order + data ordered by stream offset. */ ngtcp2_ksl dataksl; /* mem is custom memory allocator */ const ngtcp2_mem *mem; @@ -137,8 +135,8 @@ int ngtcp2_rob_init(ngtcp2_rob *rob, size_t chunk, const ngtcp2_mem *mem); void ngtcp2_rob_free(ngtcp2_rob *rob); /* - * ngtcp2_rob_push adds new data of length |datalen| at the stream - * offset |offset|. + * ngtcp2_rob_push adds new data pointed by |data| of length |datalen| + * at the stream offset |offset|. * * This function returns 0 if it succeeds, or one of the following * negative error codes: @@ -151,7 +149,8 @@ int ngtcp2_rob_push(ngtcp2_rob *rob, uint64_t offset, const uint8_t *data, /* * ngtcp2_rob_remove_prefix removes gap up to |offset|, exclusive. It - * also removes data buffer if it is completely included in |offset|. + * also removes buffered data if it is completely included in + * |offset|. */ void ngtcp2_rob_remove_prefix(ngtcp2_rob *rob, uint64_t offset); @@ -159,9 +158,10 @@ void ngtcp2_rob_remove_prefix(ngtcp2_rob *rob, uint64_t offset); * ngtcp2_rob_data_at stores the pointer to the buffer of stream * offset |offset| to |*pdest| if it is available, and returns the * valid length of available data. If no data is available, it - * returns 0. + * returns 0. This function only returns the data before the first + * gap. It returns 0 even if data is available after the first gap. */ -size_t ngtcp2_rob_data_at(ngtcp2_rob *rob, const uint8_t **pdest, +size_t ngtcp2_rob_data_at(const ngtcp2_rob *rob, const uint8_t **pdest, uint64_t offset); /* @@ -181,11 +181,11 @@ void ngtcp2_rob_pop(ngtcp2_rob *rob, uint64_t offset, size_t len); * ngtcp2_rob_first_gap_offset returns the offset to the first gap. * If there is no gap, it returns UINT64_MAX. */ -uint64_t ngtcp2_rob_first_gap_offset(ngtcp2_rob *rob); +uint64_t ngtcp2_rob_first_gap_offset(const ngtcp2_rob *rob); /* * ngtcp2_rob_data_buffered returns nonzero if any data is buffered. */ -int ngtcp2_rob_data_buffered(ngtcp2_rob *rob); +int ngtcp2_rob_data_buffered(const ngtcp2_rob *rob); -#endif /* NGTCP2_ROB_H */ +#endif /* !defined(NGTCP2_ROB_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_rst.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_rst.c index b8587e3e9dbac8..89c89acdc265a2 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_rst.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_rst.c @@ -35,26 +35,25 @@ void ngtcp2_rs_init(ngtcp2_rs *rs) { rs->interval = UINT64_MAX; rs->delivered = 0; rs->prior_delivered = 0; - rs->prior_ts = 0; + rs->prior_ts = UINT64_MAX; rs->tx_in_flight = 0; rs->lost = 0; rs->prior_lost = 0; rs->send_elapsed = 0; rs->ack_elapsed = 0; + rs->last_end_seq = -1; rs->is_app_limited = 0; } void ngtcp2_rst_init(ngtcp2_rst *rst) { ngtcp2_rs_init(&rst->rs); - ngtcp2_window_filter_init(&rst->wf, 12); rst->delivered = 0; rst->delivered_ts = 0; rst->first_sent_ts = 0; rst->app_limited = 0; - rst->next_round_delivered = 0; - rst->round_count = 0; rst->is_cwnd_limited = 0; rst->lost = 0; + rst->last_seq = -1; } void ngtcp2_rst_on_pkt_sent(ngtcp2_rst *rst, ngtcp2_rtb_entry *ent, @@ -68,27 +67,21 @@ void ngtcp2_rst_on_pkt_sent(ngtcp2_rst *rst, ngtcp2_rtb_entry *ent, ent->rst.is_app_limited = rst->app_limited != 0; ent->rst.tx_in_flight = cstat->bytes_in_flight + ent->pktlen; ent->rst.lost = rst->lost; + ent->rst.end_seq = ++rst->last_seq; } -void ngtcp2_rst_on_ack_recv(ngtcp2_rst *rst, ngtcp2_conn_stat *cstat, - uint64_t pkt_delivered) { +void ngtcp2_rst_on_ack_recv(ngtcp2_rst *rst, ngtcp2_conn_stat *cstat) { ngtcp2_rs *rs = &rst->rs; - uint64_t rate; if (rst->app_limited && rst->delivered > rst->app_limited) { rst->app_limited = 0; } - if (pkt_delivered >= rst->next_round_delivered) { - rst->next_round_delivered = pkt_delivered; - ++rst->round_count; - } - - if (rs->prior_ts == 0) { + if (rs->prior_ts == UINT64_MAX) { return; } - rs->interval = ngtcp2_max(rs->send_elapsed, rs->ack_elapsed); + rs->interval = ngtcp2_max_uint64(rs->send_elapsed, rs->ack_elapsed); rs->delivered = rst->delivered - rs->prior_delivered; rs->lost = rst->lost - rs->prior_lost; @@ -102,12 +95,13 @@ void ngtcp2_rst_on_ack_recv(ngtcp2_rst *rst, ngtcp2_conn_stat *cstat, return; } - rate = rs->delivered * NGTCP2_SECONDS / rs->interval; + cstat->delivery_rate_sec = rs->delivered * NGTCP2_SECONDS / rs->interval; +} - if (rate > ngtcp2_window_filter_get_best(&rst->wf) || !rst->app_limited) { - ngtcp2_window_filter_update(&rst->wf, rate, rst->round_count); - cstat->delivery_rate_sec = ngtcp2_window_filter_get_best(&rst->wf); - } +static int rst_is_newest_pkt(const ngtcp2_rst *rst, const ngtcp2_rtb_entry *ent, + const ngtcp2_rs *rs) { + return ent->ts > rst->first_sent_ts || + (ent->ts == rst->first_sent_ts && ent->rst.end_seq > rs->last_end_seq); } void ngtcp2_rst_update_rate_sample(ngtcp2_rst *rst, const ngtcp2_rtb_entry *ent, @@ -117,7 +111,7 @@ void ngtcp2_rst_update_rate_sample(ngtcp2_rst *rst, const ngtcp2_rtb_entry *ent, rst->delivered += ent->pktlen; rst->delivered_ts = ts; - if (ent->rst.delivered > rs->prior_delivered) { + if (rs->prior_ts == UINT64_MAX || rst_is_newest_pkt(rst, ent, rs)) { rs->prior_delivered = ent->rst.delivered; rs->prior_ts = ent->rst.delivered_ts; rs->is_app_limited = ent->rst.is_app_limited; @@ -125,6 +119,7 @@ void ngtcp2_rst_update_rate_sample(ngtcp2_rst *rst, const ngtcp2_rtb_entry *ent, rs->ack_elapsed = rst->delivered_ts - ent->rst.delivered_ts; rs->tx_in_flight = ent->rst.tx_in_flight; rs->prior_lost = ent->rst.lost; + rs->last_end_seq = ent->rst.end_seq; rst->first_sent_ts = ent->ts; } } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_rst.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_rst.h index c9e1e161b7766f..95616eee97d99f 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_rst.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_rst.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -51,6 +51,7 @@ typedef struct ngtcp2_rs { uint64_t prior_lost; ngtcp2_duration send_elapsed; ngtcp2_duration ack_elapsed; + int64_t last_end_seq; int is_app_limited; } ngtcp2_rs; @@ -58,18 +59,20 @@ void ngtcp2_rs_init(ngtcp2_rs *rs); /* * ngtcp2_rst implements delivery rate estimation described in - * https://tools.ietf.org/html/draft-cheng-iccrg-delivery-rate-estimation-00 + * https://ietf-wg-ccwg.github.io/draft-cardwell-ccwg-bbr/draft-cardwell-ccwg-bbr.html */ typedef struct ngtcp2_rst { ngtcp2_rs rs; - ngtcp2_window_filter wf; uint64_t delivered; ngtcp2_tstamp delivered_ts; ngtcp2_tstamp first_sent_ts; uint64_t app_limited; - uint64_t next_round_delivered; - uint64_t round_count; uint64_t lost; + /* last_seq is the sequence number of packets across all packet + number spaces. If we would adopt single packet number sequence + across all packet number spaces, we can replace this with a + packet number. */ + int64_t last_seq; int is_cwnd_limited; } ngtcp2_rst; @@ -77,10 +80,9 @@ void ngtcp2_rst_init(ngtcp2_rst *rst); void ngtcp2_rst_on_pkt_sent(ngtcp2_rst *rst, ngtcp2_rtb_entry *ent, const ngtcp2_conn_stat *cstat); -void ngtcp2_rst_on_ack_recv(ngtcp2_rst *rst, ngtcp2_conn_stat *cstat, - uint64_t pkt_delivered); +void ngtcp2_rst_on_ack_recv(ngtcp2_rst *rst, ngtcp2_conn_stat *cstat); void ngtcp2_rst_update_rate_sample(ngtcp2_rst *rst, const ngtcp2_rtb_entry *ent, ngtcp2_tstamp ts); void ngtcp2_rst_update_app_limited(ngtcp2_rst *rst, ngtcp2_conn_stat *cstat); -#endif /* NGTCP2_RST_H */ +#endif /* !defined(NGTCP2_RST_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_rtb.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_rtb.c index 5ebdce7d0e2715..090355f5dbc938 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_rtb.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_rtb.c @@ -38,7 +38,7 @@ #include "ngtcp2_tstamp.h" #include "ngtcp2_frame_chain.h" -ngtcp2_objalloc_def(rtb_entry, ngtcp2_rtb_entry, oplent); +ngtcp2_objalloc_def(rtb_entry, ngtcp2_rtb_entry, oplent) static void rtb_entry_init(ngtcp2_rtb_entry *ent, const ngtcp2_pkt_hd *hd, ngtcp2_frame_chain *frc, ngtcp2_tstamp ts, @@ -53,7 +53,6 @@ static void rtb_entry_init(ngtcp2_rtb_entry *ent, const ngtcp2_pkt_hd *hd, ent->lost_ts = UINT64_MAX; ent->pktlen = pktlen; ent->flags = flags; - ent->next = NULL; } int ngtcp2_rtb_entry_objalloc_new(ngtcp2_rtb_entry **pent, @@ -82,19 +81,14 @@ void ngtcp2_rtb_entry_objalloc_del(ngtcp2_rtb_entry *ent, ngtcp2_objalloc_rtb_entry_release(objalloc, ent); } -static int greater(const ngtcp2_ksl_key *lhs, const ngtcp2_ksl_key *rhs) { - return *(int64_t *)lhs > *(int64_t *)rhs; -} - -void ngtcp2_rtb_init(ngtcp2_rtb *rtb, ngtcp2_pktns_id pktns_id, - ngtcp2_strm *crypto, ngtcp2_rst *rst, ngtcp2_cc *cc, +void ngtcp2_rtb_init(ngtcp2_rtb *rtb, ngtcp2_rst *rst, ngtcp2_cc *cc, int64_t cc_pkt_num, ngtcp2_log *log, ngtcp2_qlog *qlog, ngtcp2_objalloc *rtb_entry_objalloc, ngtcp2_objalloc *frc_objalloc, const ngtcp2_mem *mem) { rtb->rtb_entry_objalloc = rtb_entry_objalloc; rtb->frc_objalloc = frc_objalloc; - ngtcp2_ksl_init(&rtb->ents, greater, sizeof(int64_t), mem); - rtb->crypto = crypto; + ngtcp2_ksl_init(&rtb->ents, ngtcp2_ksl_int64_greater, + ngtcp2_ksl_int64_greater_search, sizeof(int64_t), mem); rtb->rst = rst; rtb->cc = cc; rtb->log = log; @@ -105,7 +99,6 @@ void ngtcp2_rtb_init(ngtcp2_rtb *rtb, ngtcp2_pktns_id pktns_id, rtb->num_retransmittable = 0; rtb->num_pto_eliciting = 0; rtb->probe_pkt_left = 0; - rtb->pktns_id = pktns_id; rtb->cc_pkt_num = cc_pkt_num; rtb->cc_bytes_in_flight = 0; rtb->persistent_congestion_start_ts = UINT64_MAX; @@ -145,9 +138,11 @@ static void rtb_on_add(ngtcp2_rtb *rtb, ngtcp2_rtb_entry *ent, if (ent->flags & NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING) { ++rtb->num_ack_eliciting; } + if (ent->flags & NGTCP2_RTB_ENTRY_FLAG_RETRANSMITTABLE) { ++rtb->num_retransmittable; } + if (ent->flags & NGTCP2_RTB_ENTRY_FLAG_PTO_ELICITING) { ++rtb->num_pto_eliciting; } @@ -209,10 +204,10 @@ static size_t rtb_on_remove(ngtcp2_rtb *rtb, ngtcp2_rtb_entry *ent, #define NGTCP2_RECLAIM_FLAG_ON_LOSS 0x01u /* - * rtb_reclaim_frame queues unacknowledged frames included in |ent| - * for retransmission. The re-queued frames are not deleted from - * |ent|. It returns the number of frames queued. |flags| is bitwise - * OR of 0 or more of NGTCP2_RECLAIM_FLAG_*. + * rtb_reclaim_frame copies and queues frames included in |ent| for + * retransmission. The frames are not deleted from |ent|. It returns + * the number of frames queued. |flags| is bitwise OR of 0 or more of + * NGTCP2_RECLAIM_FLAG_*. */ static ngtcp2_ssize rtb_reclaim_frame(ngtcp2_rtb *rtb, uint8_t flags, ngtcp2_conn *conn, ngtcp2_pktns *pktns, @@ -229,11 +224,13 @@ static ngtcp2_ssize rtb_reclaim_frame(ngtcp2_rtb *rtb, uint8_t flags, /* TODO Reconsider the order of pfrc */ for (frc = ent->frc; frc; frc = frc->next) { fr = &frc->fr; + /* Check that a late ACK acknowledged this frame. */ if (frc->binder && (frc->binder->flags & NGTCP2_FRAME_CHAIN_BINDER_FLAG_ACK)) { continue; } + switch (frc->fr.type) { case NGTCP2_FRAME_STREAM: strm = ngtcp2_conn_find_stream(conn, fr->stream.stream_id); @@ -244,16 +241,20 @@ static ngtcp2_ssize rtb_reclaim_frame(ngtcp2_rtb *rtb, uint8_t flags, gap = ngtcp2_strm_get_unacked_range_after(strm, fr->stream.offset); range.begin = fr->stream.offset; - range.end = fr->stream.offset + - ngtcp2_vec_len(fr->stream.data, fr->stream.datacnt); + range.end = + fr->stream.offset + ngtcp2_vec_len(fr->stream.data, fr->stream.datacnt); range = ngtcp2_range_intersect(&range, &gap); + if (ngtcp2_range_len(&range) == 0) { if (!fr->stream.fin) { /* 0 length STREAM frame with offset == 0 must be - retransmitted if no non-empty data is sent to this stream - and no data in this stream is acknowledged. */ + retransmitted if no non-empty data are sent to this + stream, fin flag is not set, and no data in this stream + are acknowledged. */ if (fr->stream.offset != 0 || fr->stream.datacnt != 0 || - strm->tx.offset || (strm->flags & NGTCP2_STRM_FLAG_ANY_ACKED)) { + strm->tx.offset || + (strm->flags & + (NGTCP2_STRM_FLAG_SHUT_WR | NGTCP2_STRM_FLAG_ANY_ACKED))) { continue; } } else if (strm->flags & NGTCP2_STRM_FLAG_FIN_ACKED) { @@ -268,7 +269,7 @@ static ngtcp2_ssize rtb_reclaim_frame(ngtcp2_rtb *rtb, uint8_t flags, } rv = ngtcp2_frame_chain_stream_datacnt_objalloc_new( - &nfrc, fr->stream.datacnt, rtb->frc_objalloc, rtb->mem); + &nfrc, fr->stream.datacnt, rtb->frc_objalloc, rtb->mem); if (rv != 0) { return rv; } @@ -282,8 +283,10 @@ static ngtcp2_ssize rtb_reclaim_frame(ngtcp2_rtb *rtb, uint8_t flags, ngtcp2_frame_chain_objalloc_del(nfrc, rtb->frc_objalloc, rtb->mem); return rv; } + if (!ngtcp2_strm_is_tx_queued(strm)) { strm->cycle = ngtcp2_conn_tx_strmq_first_cycle(conn); + rv = ngtcp2_conn_tx_strmq_push(conn, strm); if (rv != 0) { return rv; @@ -294,20 +297,22 @@ static ngtcp2_ssize rtb_reclaim_frame(ngtcp2_rtb *rtb, uint8_t flags, continue; case NGTCP2_FRAME_CRYPTO: - /* Don't resend CRYPTO frame if the whole region it contains has - been acknowledged */ - gap = ngtcp2_strm_get_unacked_range_after(rtb->crypto, fr->stream.offset); + /* Do not resend CRYPTO frame if the whole region it contains + has been acknowledged */ + gap = ngtcp2_strm_get_unacked_range_after(&pktns->crypto.strm, + fr->stream.offset); range.begin = fr->stream.offset; - range.end = fr->stream.offset + - ngtcp2_vec_len(fr->stream.data, fr->stream.datacnt); + range.end = + fr->stream.offset + ngtcp2_vec_len(fr->stream.data, fr->stream.datacnt); range = ngtcp2_range_intersect(&range, &gap); + if (ngtcp2_range_len(&range) == 0) { continue; } rv = ngtcp2_frame_chain_stream_datacnt_objalloc_new( - &nfrc, fr->stream.datacnt, rtb->frc_objalloc, rtb->mem); + &nfrc, fr->stream.datacnt, rtb->frc_objalloc, rtb->mem); if (rv != 0) { return rv; } @@ -328,8 +333,8 @@ static ngtcp2_ssize rtb_reclaim_frame(ngtcp2_rtb *rtb, uint8_t flags, continue; case NGTCP2_FRAME_NEW_TOKEN: rv = ngtcp2_frame_chain_new_token_objalloc_new( - &nfrc, fr->new_token.token, fr->new_token.tokenlen, rtb->frc_objalloc, - rtb->mem); + &nfrc, fr->new_token.token, fr->new_token.tokenlen, rtb->frc_objalloc, + rtb->mem); if (rv != 0) { return rv; } @@ -366,7 +371,7 @@ static ngtcp2_ssize rtb_reclaim_frame(ngtcp2_rtb *rtb, uint8_t flags, case NGTCP2_FRAME_MAX_STREAM_DATA: strm = ngtcp2_conn_find_stream(conn, fr->max_stream_data.stream_id); if (strm == NULL || !ngtcp2_strm_require_retransmit_max_stream_data( - strm, &fr->max_stream_data)) { + strm, &fr->max_stream_data)) { continue; } @@ -374,7 +379,7 @@ static ngtcp2_ssize rtb_reclaim_frame(ngtcp2_rtb *rtb, uint8_t flags, case NGTCP2_FRAME_STREAM_DATA_BLOCKED: strm = ngtcp2_conn_find_stream(conn, fr->stream_data_blocked.stream_id); if (strm == NULL || !ngtcp2_strm_require_retransmit_stream_data_blocked( - strm, &fr->stream_data_blocked)) { + strm, &fr->stream_data_blocked)) { continue; } @@ -423,6 +428,7 @@ static int conn_process_lost_datagram(ngtcp2_conn *conn, if (rv != 0) { return NGTCP2_ERR_CALLBACK_FAILURE; } + break; } } @@ -430,10 +436,9 @@ static int conn_process_lost_datagram(ngtcp2_conn *conn, return 0; } -static int rtb_on_pkt_lost(ngtcp2_rtb *rtb, ngtcp2_ksl_it *it, - ngtcp2_rtb_entry *ent, ngtcp2_conn_stat *cstat, - ngtcp2_conn *conn, ngtcp2_pktns *pktns, - ngtcp2_tstamp ts) { +static int rtb_on_pkt_lost(ngtcp2_rtb *rtb, ngtcp2_rtb_entry *ent, + ngtcp2_conn_stat *cstat, ngtcp2_conn *conn, + ngtcp2_pktns *pktns, ngtcp2_tstamp ts) { int rv; ngtcp2_ssize reclaimed; ngtcp2_cc *cc = rtb->cc; @@ -451,7 +456,7 @@ static int rtb_on_pkt_lost(ngtcp2_rtb *rtb, ngtcp2_ksl_it *it, } else if (rtb->cc->on_pkt_lost) { cc->on_pkt_lost(cc, cstat, ngtcp2_cc_pkt_init(&pkt, ent->hd.pkt_num, ent->pktlen, - rtb->pktns_id, ent->ts, ent->rst.lost, + pktns->id, ent->ts, ent->rst.lost, ent->rst.tx_in_flight, ent->rst.is_app_limited), ts); @@ -463,34 +468,25 @@ static int rtb_on_pkt_lost(ngtcp2_rtb *rtb, ngtcp2_ksl_it *it, ent->hd.pkt_num); assert(!(ent->flags & NGTCP2_RTB_ENTRY_FLAG_LOST_RETRANSMITTED)); assert(UINT64_MAX == ent->lost_ts); - - ent->flags |= NGTCP2_RTB_ENTRY_FLAG_LOST_RETRANSMITTED; - ent->lost_ts = ts; - - ++rtb->num_lost_pkts; - - ngtcp2_ksl_it_next(it); - - return 0; - } - - if (conn->callbacks.lost_datagram && - (ent->flags & NGTCP2_RTB_ENTRY_FLAG_DATAGRAM)) { - rv = conn_process_lost_datagram(conn, ent); - if (rv != 0) { - return rv; + } else { + if (conn->callbacks.lost_datagram && + (ent->flags & NGTCP2_RTB_ENTRY_FLAG_DATAGRAM)) { + rv = conn_process_lost_datagram(conn, ent); + if (rv != 0) { + return rv; + } } - } - if (ent->flags & NGTCP2_RTB_ENTRY_FLAG_RETRANSMITTABLE) { - assert(ent->frc); - assert(!(ent->flags & NGTCP2_RTB_ENTRY_FLAG_LOST_RETRANSMITTED)); - assert(UINT64_MAX == ent->lost_ts); + if (ent->flags & NGTCP2_RTB_ENTRY_FLAG_RETRANSMITTABLE) { + assert(ent->frc); + assert(!(ent->flags & NGTCP2_RTB_ENTRY_FLAG_LOST_RETRANSMITTED)); + assert(UINT64_MAX == ent->lost_ts); - reclaimed = + reclaimed = rtb_reclaim_frame(rtb, NGTCP2_RECLAIM_FLAG_ON_LOSS, conn, pktns, ent); - if (reclaimed < 0) { - return (int)reclaimed; + if (reclaimed < 0) { + return (int)reclaimed; + } } } @@ -499,8 +495,6 @@ static int rtb_on_pkt_lost(ngtcp2_rtb *rtb, ngtcp2_ksl_it *it, ++rtb->num_lost_pkts; - ngtcp2_ksl_it_next(it); - return 0; } @@ -518,7 +512,7 @@ int ngtcp2_rtb_add(ngtcp2_rtb *rtb, ngtcp2_rtb_entry *ent, return 0; } -ngtcp2_ksl_it ngtcp2_rtb_head(ngtcp2_rtb *rtb) { +ngtcp2_ksl_it ngtcp2_rtb_head(const ngtcp2_rtb *rtb) { return ngtcp2_ksl_begin(&rtb->ents); } @@ -566,22 +560,24 @@ static void conn_ack_crypto_data(ngtcp2_conn *conn, ngtcp2_pktns *pktns, return; } -static int rtb_process_acked_pkt(ngtcp2_rtb *rtb, ngtcp2_rtb_entry *ent, - ngtcp2_conn *conn) { +static int process_acked_pkt(ngtcp2_rtb_entry *ent, ngtcp2_conn *conn, + ngtcp2_pktns *pktns) { ngtcp2_frame_chain *frc; uint64_t prev_stream_offset, stream_offset; ngtcp2_strm *strm; int rv; uint64_t datalen; - ngtcp2_strm *crypto = rtb->crypto; - ngtcp2_pktns *pktns = NULL; + ngtcp2_strm *crypto = &pktns->crypto.strm; if ((ent->flags & NGTCP2_RTB_ENTRY_FLAG_PMTUD_PROBE) && conn->pmtud && conn->pmtud->tx_pkt_num <= ent->hd.pkt_num) { ngtcp2_pmtud_probe_success(conn->pmtud, ent->pktlen); - conn->dcid.current.max_udp_payload_size = - ngtcp2_max(conn->dcid.current.max_udp_payload_size, ent->pktlen); + if (conn->dcid.current.max_udp_payload_size < ent->pktlen) { + conn->dcid.current.max_udp_payload_size = ent->pktlen; + conn->cstat.max_tx_udp_payload_size = + ngtcp2_conn_get_path_max_tx_udp_payload_size(conn); + } if (ngtcp2_pmtud_finished(conn->pmtud)) { ngtcp2_conn_stop_pmtud(conn); @@ -611,23 +607,25 @@ static int rtb_process_acked_pkt(ngtcp2_rtb *rtb, ngtcp2_rtb_entry *ent, } prev_stream_offset = ngtcp2_strm_get_acked_offset(strm); + rv = ngtcp2_strm_ack_data( - strm, frc->fr.stream.offset, - ngtcp2_vec_len(frc->fr.stream.data, frc->fr.stream.datacnt)); + strm, frc->fr.stream.offset, + ngtcp2_vec_len(frc->fr.stream.data, frc->fr.stream.datacnt)); if (rv != 0) { return rv; } if (conn->callbacks.acked_stream_data_offset) { stream_offset = ngtcp2_strm_get_acked_offset(strm); + datalen = stream_offset - prev_stream_offset; if (datalen == 0 && !frc->fr.stream.fin) { break; } rv = conn->callbacks.acked_stream_data_offset( - conn, strm->stream_id, prev_stream_offset, datalen, conn->user_data, - strm->stream_user_data); + conn, strm->stream_id, prev_stream_offset, datalen, conn->user_data, + strm->stream_user_data); if (rv != 0) { return NGTCP2_ERR_CALLBACK_FAILURE; } @@ -637,36 +635,25 @@ static int rtb_process_acked_pkt(ngtcp2_rtb *rtb, ngtcp2_rtb_entry *ent, if (rv != 0) { return rv; } + break; case NGTCP2_FRAME_CRYPTO: prev_stream_offset = ngtcp2_strm_get_acked_offset(crypto); + rv = ngtcp2_strm_ack_data( - crypto, frc->fr.stream.offset, - ngtcp2_vec_len(frc->fr.stream.data, frc->fr.stream.datacnt)); + crypto, frc->fr.stream.offset, + ngtcp2_vec_len(frc->fr.stream.data, frc->fr.stream.datacnt)); if (rv != 0) { return rv; } stream_offset = ngtcp2_strm_get_acked_offset(crypto); + datalen = stream_offset - prev_stream_offset; if (datalen == 0) { break; } - switch (rtb->pktns_id) { - case NGTCP2_PKTNS_ID_INITIAL: - pktns = conn->in_pktns; - break; - case NGTCP2_PKTNS_ID_HANDSHAKE: - pktns = conn->hs_pktns; - break; - case NGTCP2_PKTNS_ID_APPLICATION: - pktns = &conn->pktns; - break; - default: - ngtcp2_unreachable(); - } - conn_ack_crypto_data(conn, pktns, datalen); break; @@ -675,11 +662,14 @@ static int rtb_process_acked_pkt(ngtcp2_rtb *rtb, ngtcp2_rtb_entry *ent, if (strm == NULL) { break; } + strm->flags |= NGTCP2_STRM_FLAG_RESET_STREAM_ACKED; + rv = ngtcp2_conn_close_stream_if_shut_rdwr(conn, strm); if (rv != 0) { return rv; } + break; case NGTCP2_FRAME_RETIRE_CONNECTION_ID: ngtcp2_conn_untrack_retired_dcid_seq(conn, @@ -702,14 +692,17 @@ static int rtb_process_acked_pkt(ngtcp2_rtb *rtb, ngtcp2_rtb_entry *ent, if (rv != 0) { return NGTCP2_ERR_CALLBACK_FAILURE; } + break; } } + return 0; } static void rtb_on_pkt_acked(ngtcp2_rtb *rtb, ngtcp2_rtb_entry *ent, - ngtcp2_conn_stat *cstat, ngtcp2_tstamp ts) { + ngtcp2_conn_stat *cstat, const ngtcp2_pktns *pktns, + ngtcp2_tstamp ts) { ngtcp2_cc *cc = rtb->cc; ngtcp2_cc_pkt pkt; @@ -718,7 +711,7 @@ static void rtb_on_pkt_acked(ngtcp2_rtb *rtb, ngtcp2_rtb_entry *ent, if (cc->on_pkt_acked) { cc->on_pkt_acked(cc, cstat, ngtcp2_cc_pkt_init(&pkt, ent->hd.pkt_num, ent->pktlen, - rtb->pktns_id, ent->ts, ent->rst.lost, + pktns->id, ent->ts, ent->rst.lost, ent->rst.tx_in_flight, ent->rst.is_app_limited), ts); @@ -745,12 +738,13 @@ static void conn_verify_ecn(ngtcp2_conn *conn, ngtcp2_pktns *pktns, pktns->rx.ecn.ack.ect1 > fr->ecn.ect1 || pktns->rx.ecn.ack.ce > fr->ecn.ce || (fr->ecn.ect0 - pktns->rx.ecn.ack.ect0) + - (fr->ecn.ce - pktns->rx.ecn.ack.ce) < - ecn_acked || + (fr->ecn.ce - pktns->rx.ecn.ack.ce) < + ecn_acked || fr->ecn.ect0 > pktns->tx.ecn.ect0 || fr->ecn.ect1))) { ngtcp2_log_info(&conn->log, NGTCP2_LOG_EVENT_CON, "path is not ECN capable"); conn->tx.ecn.state = NGTCP2_ECN_STATE_FAILED; + return; } @@ -762,7 +756,7 @@ static void conn_verify_ecn(ngtcp2_conn *conn, ngtcp2_pktns *pktns, if (fr->type == NGTCP2_FRAME_ACK_ECN) { if (cc->congestion_event && largest_pkt_sent_ts != UINT64_MAX && fr->ecn.ce > pktns->rx.ecn.ack.ce) { - cc->congestion_event(cc, cstat, largest_pkt_sent_ts, ts); + cc->congestion_event(cc, cstat, largest_pkt_sent_ts, 0, ts); } pktns->rx.ecn.ack.ect0 = fr->ecn.ect0; @@ -784,7 +778,7 @@ ngtcp2_ssize ngtcp2_rtb_recv_ack(ngtcp2_rtb *rtb, const ngtcp2_ack *fr, size_t i; int rv; ngtcp2_ksl_it it; - ngtcp2_ssize num_acked = 0; + size_t num_acked = 0; ngtcp2_tstamp largest_pkt_sent_ts = UINT64_MAX; int64_t pkt_num; ngtcp2_cc *cc = rtb->cc; @@ -820,6 +814,7 @@ ngtcp2_ssize ngtcp2_rtb_recv_ack(ngtcp2_rtb *rtb, const ngtcp2_ack *fr, conn_verify_ecn(conn, pktns, rtb->cc, cstat, fr, ecn_acked, largest_pkt_sent_ts, ts); } + return 0; } @@ -848,7 +843,7 @@ ngtcp2_ssize ngtcp2_rtb_recv_ack(ngtcp2_rtb *rtb, const ngtcp2_ack *fr, ++num_acked; } - for (i = 0; i < fr->rangecnt;) { + for (i = 0; i < fr->rangecnt; ++i) { largest_ack = min_ack - (int64_t)fr->ranges[i].gap - 2; min_ack = largest_ack - (int64_t)fr->ranges[i].len; @@ -862,6 +857,7 @@ ngtcp2_ssize ngtcp2_rtb_recv_ack(ngtcp2_rtb *rtb, const ngtcp2_ack *fr, if (pkt_num < min_ack) { break; } + ent = ngtcp2_ksl_it_get(&it); if (ent->flags & NGTCP2_RTB_ENTRY_FLAG_ACK_ELICITING) { @@ -871,12 +867,11 @@ ngtcp2_ssize ngtcp2_rtb_recv_ack(ngtcp2_rtb *rtb, const ngtcp2_ack *fr, rtb_remove(rtb, &it, &acked_ent, ent, cstat); ++num_acked; } - - ++i; } if (largest_pkt_sent_ts != UINT64_MAX && ack_eliciting_pkt_acked) { - cc_ack.rtt = pkt_ts - largest_pkt_sent_ts; + cc_ack.rtt = + ngtcp2_max_uint64(pkt_ts - largest_pkt_sent_ts, NGTCP2_NANOSECONDS); rv = ngtcp2_conn_update_rtt(conn, cc_ack.rtt, fr->ack_delay_unscaled, ts); if (rv == 0 && cc->new_rtt_sample) { @@ -891,7 +886,7 @@ ngtcp2_ssize ngtcp2_rtb_recv_ack(ngtcp2_rtb *rtb, const ngtcp2_ack *fr, ++ecn_acked; } - rv = rtb_process_acked_pkt(rtb, ent, conn); + rv = process_acked_pkt(ent, conn, pktns); if (rv != 0) { goto fail; } @@ -903,7 +898,7 @@ ngtcp2_ssize ngtcp2_rtb_recv_ack(ngtcp2_rtb *rtb, const ngtcp2_ack *fr, cc_ack.pkt_delivered = ent->rst.delivered; } - rtb_on_pkt_acked(rtb, ent, cstat, ts); + rtb_on_pkt_acked(rtb, ent, cstat, pktns, ts); acked_ent = ent->next; ngtcp2_rtb_entry_objalloc_del(ent, rtb->rtb_entry_objalloc, rtb->frc_objalloc, rtb->mem); @@ -916,7 +911,7 @@ ngtcp2_ssize ngtcp2_rtb_recv_ack(ngtcp2_rtb *rtb, const ngtcp2_ack *fr, } else { /* For unit tests */ for (ent = acked_ent; ent; ent = acked_ent) { - rtb_on_pkt_acked(rtb, ent, cstat, ts); + rtb_on_pkt_acked(rtb, ent, cstat, pktns, ts); acked_ent = ent->next; ngtcp2_rtb_entry_objalloc_del(ent, rtb->rtb_entry_objalloc, rtb->frc_objalloc, rtb->mem); @@ -924,27 +919,29 @@ ngtcp2_ssize ngtcp2_rtb_recv_ack(ngtcp2_rtb *rtb, const ngtcp2_ack *fr, } if (rtb->cc->on_spurious_congestion && num_lost_pkts && - rtb->num_lost_pkts - rtb->num_lost_pmtud_pkts == 0) { + rtb->num_lost_pkts == rtb->num_lost_pmtud_pkts) { rtb->cc->on_spurious_congestion(cc, cstat, ts); } - ngtcp2_rst_on_ack_recv(rtb->rst, cstat, cc_ack.pkt_delivered); + if (num_acked) { + ngtcp2_rst_on_ack_recv(rtb->rst, cstat); - if (conn && num_acked > 0) { - rv = rtb_detect_lost_pkt(rtb, &cc_ack.bytes_lost, conn, pktns, cstat, ts); - if (rv != 0) { - return rv; + if (conn) { + rv = rtb_detect_lost_pkt(rtb, &cc_ack.bytes_lost, conn, pktns, cstat, ts); + if (rv != 0) { + return rv; + } } } rtb->rst->lost += cc_ack.bytes_lost; cc_ack.largest_pkt_sent_ts = largest_pkt_sent_ts; - if (cc->on_ack_recv) { + if (num_acked && cc->on_ack_recv) { cc->on_ack_recv(cc, cstat, &cc_ack, ts); } - return num_acked; + return (ngtcp2_ssize)num_acked; fail: for (ent = acked_ent; ent; ent = acked_ent) { @@ -958,7 +955,8 @@ ngtcp2_ssize ngtcp2_rtb_recv_ack(ngtcp2_rtb *rtb, const ngtcp2_ack *fr, static int rtb_pkt_lost(ngtcp2_rtb *rtb, ngtcp2_conn_stat *cstat, const ngtcp2_rtb_entry *ent, ngtcp2_duration loss_delay, - size_t pkt_thres, ngtcp2_tstamp ts) { + size_t pkt_thres, const ngtcp2_pktns *pktns, + ngtcp2_tstamp ts) { ngtcp2_tstamp loss_time; if (ngtcp2_tstamp_elapsed(ent->ts, loss_delay, ts) || @@ -966,27 +964,27 @@ static int rtb_pkt_lost(ngtcp2_rtb *rtb, ngtcp2_conn_stat *cstat, return 1; } - loss_time = cstat->loss_time[rtb->pktns_id]; + loss_time = cstat->loss_time[pktns->id]; if (loss_time == UINT64_MAX) { loss_time = ent->ts + loss_delay; } else { - loss_time = ngtcp2_min(loss_time, ent->ts + loss_delay); + loss_time = ngtcp2_min_uint64(loss_time, ent->ts + loss_delay); } - cstat->loss_time[rtb->pktns_id] = loss_time; + cstat->loss_time[pktns->id] = loss_time; return 0; } /* - * rtb_compute_pkt_loss_delay computes loss delay. + * compute_pkt_loss_delay computes loss delay. */ static ngtcp2_duration compute_pkt_loss_delay(const ngtcp2_conn_stat *cstat) { /* 9/8 is kTimeThreshold */ ngtcp2_duration loss_delay = - ngtcp2_max(cstat->latest_rtt, cstat->smoothed_rtt) * 9 / 8; - return ngtcp2_max(loss_delay, NGTCP2_GRANULARITY); + ngtcp2_max_uint64(cstat->latest_rtt, cstat->smoothed_rtt) * 9 / 8; + return ngtcp2_max_uint64(loss_delay, NGTCP2_GRANULARITY); } /* @@ -999,9 +997,9 @@ static int conn_all_ecn_pkt_lost(ngtcp2_conn *conn) { ngtcp2_pktns *pktns = &conn->pktns; return (!in_pktns || in_pktns->tx.ecn.validation_pkt_sent == - in_pktns->tx.ecn.validation_pkt_lost) && + in_pktns->tx.ecn.validation_pkt_lost) && (!hs_pktns || hs_pktns->tx.ecn.validation_pkt_sent == - hs_pktns->tx.ecn.validation_pkt_lost) && + hs_pktns->tx.ecn.validation_pkt_lost) && pktns->tx.ecn.validation_pkt_sent == pktns->tx.ecn.validation_pkt_lost; } @@ -1017,16 +1015,16 @@ static int rtb_detect_lost_pkt(ngtcp2_rtb *rtb, uint64_t *ppkt_lost, ngtcp2_cc *cc = rtb->cc; int rv; uint64_t pkt_thres = - rtb->cc_bytes_in_flight / cstat->max_tx_udp_payload_size / 2; + rtb->cc_bytes_in_flight / cstat->max_tx_udp_payload_size / 2; size_t ecn_pkt_lost = 0; ngtcp2_tstamp start_ts; ngtcp2_duration pto = ngtcp2_conn_compute_pto(conn, pktns); uint64_t bytes_lost = 0; ngtcp2_duration max_ack_delay; - pkt_thres = ngtcp2_max(pkt_thres, NGTCP2_PKT_THRESHOLD); - pkt_thres = ngtcp2_min(pkt_thres, 256); - cstat->loss_time[rtb->pktns_id] = UINT64_MAX; + pkt_thres = ngtcp2_max_uint64(pkt_thres, NGTCP2_PKT_THRESHOLD); + pkt_thres = ngtcp2_min_uint64(pkt_thres, 256); + cstat->loss_time[pktns->id] = UINT64_MAX; loss_delay = compute_pkt_loss_delay(cstat); it = ngtcp2_ksl_lower_bound(&rtb->ents, &rtb->largest_acked_tx_pkt_num); @@ -1037,25 +1035,27 @@ static int rtb_detect_lost_pkt(ngtcp2_rtb *rtb, uint64_t *ppkt_lost, break; } - if (rtb_pkt_lost(rtb, cstat, ent, loss_delay, (size_t)pkt_thres, ts)) { + if (rtb_pkt_lost(rtb, cstat, ent, loss_delay, (size_t)pkt_thres, pktns, + ts)) { /* All entries from ent are considered to be lost. */ latest_ts = oldest_ts = ent->ts; /* +1 to pick this packet for persistent congestion in the following loop. */ last_lost_pkt_num = ent->hd.pkt_num + 1; max_ack_delay = conn->remote.transport_params - ? conn->remote.transport_params->max_ack_delay - : 0; + ? conn->remote.transport_params->max_ack_delay + : 0; congestion_period = - (cstat->smoothed_rtt + - ngtcp2_max(4 * cstat->rttvar, NGTCP2_GRANULARITY) + max_ack_delay) * - NGTCP2_PERSISTENT_CONGESTION_THRESHOLD; + (cstat->smoothed_rtt + + ngtcp2_max_uint64(4 * cstat->rttvar, NGTCP2_GRANULARITY) + + max_ack_delay) * + NGTCP2_PERSISTENT_CONGESTION_THRESHOLD; - start_ts = ngtcp2_max(rtb->persistent_congestion_start_ts, - cstat->first_rtt_sample_ts); + start_ts = ngtcp2_max_uint64(rtb->persistent_congestion_start_ts, + cstat->first_rtt_sample_ts); - for (; !ngtcp2_ksl_it_end(&it);) { + for (; !ngtcp2_ksl_it_end(&it); ngtcp2_ksl_it_next(&it)) { ent = ngtcp2_ksl_it_get(&it); if (last_lost_pkt_num == ent->hd.pkt_num + 1 && ent->ts >= start_ts) { @@ -1066,12 +1066,12 @@ static int rtb_detect_lost_pkt(ngtcp2_rtb *rtb, uint64_t *ppkt_lost, } if ((ent->flags & NGTCP2_RTB_ENTRY_FLAG_LOST_RETRANSMITTED)) { - if (rtb->pktns_id != NGTCP2_PKTNS_ID_APPLICATION || + if (pktns->id != NGTCP2_PKTNS_ID_APPLICATION || last_lost_pkt_num == -1 || latest_ts - oldest_ts >= congestion_period) { break; } - ngtcp2_ksl_it_next(&it); + continue; } @@ -1081,7 +1081,7 @@ static int rtb_detect_lost_pkt(ngtcp2_rtb *rtb, uint64_t *ppkt_lost, } bytes_lost += rtb_on_remove(rtb, ent, cstat); - rv = rtb_on_pkt_lost(rtb, &it, ent, cstat, conn, pktns, ts); + rv = rtb_on_pkt_lost(rtb, ent, cstat, conn, pktns, ts); if (rv != 0) { return rv; } @@ -1098,13 +1098,16 @@ static int rtb_detect_lost_pkt(ngtcp2_rtb *rtb, uint64_t *ppkt_lost, if (conn->tx.ecn.validation_start_ts == UINT64_MAX) { break; } + if (ts - conn->tx.ecn.validation_start_ts < 3 * pto) { pktns->tx.ecn.validation_pkt_lost += ecn_pkt_lost; assert(pktns->tx.ecn.validation_pkt_sent >= pktns->tx.ecn.validation_pkt_lost); break; } + conn->tx.ecn.state = NGTCP2_ECN_STATE_UNKNOWN; + /* fall through */ case NGTCP2_ECN_STATE_UNKNOWN: pktns->tx.ecn.validation_pkt_lost += ecn_pkt_lost; @@ -1119,7 +1122,7 @@ static int rtb_detect_lost_pkt(ngtcp2_rtb *rtb, uint64_t *ppkt_lost, } if (cc->congestion_event) { - cc->congestion_event(cc, cstat, latest_ts, ts); + cc->congestion_event(cc, cstat, latest_ts, bytes_lost, ts); } loss_window = latest_ts - oldest_ts; @@ -1130,23 +1133,22 @@ static int rtb_detect_lost_pkt(ngtcp2_rtb *rtb, uint64_t *ppkt_lost, * persistent congestion there, then it is a lot easier to just * not enable it during handshake. */ - if (rtb->pktns_id == NGTCP2_PKTNS_ID_APPLICATION && loss_window > 0) { - if (loss_window >= congestion_period) { - ngtcp2_log_info(rtb->log, NGTCP2_LOG_EVENT_LDC, - "persistent congestion loss_window=%" PRIu64 - " congestion_period=%" PRIu64, - loss_window, congestion_period); - - /* Reset min_rtt, srtt, and rttvar here. Next new RTT - sample will be used to recalculate these values. */ - cstat->min_rtt = UINT64_MAX; - cstat->smoothed_rtt = conn->local.settings.initial_rtt; - cstat->rttvar = conn->local.settings.initial_rtt / 2; - cstat->first_rtt_sample_ts = UINT64_MAX; - - if (cc->on_persistent_congestion) { - cc->on_persistent_congestion(cc, cstat, ts); - } + if (pktns->id == NGTCP2_PKTNS_ID_APPLICATION && loss_window && + loss_window >= congestion_period) { + ngtcp2_log_info(rtb->log, NGTCP2_LOG_EVENT_LDC, + "persistent congestion loss_window=%" PRIu64 + " congestion_period=%" PRIu64, + loss_window, congestion_period); + + /* Reset min_rtt, srtt, and rttvar here. Next new RTT + sample will be used to recalculate these values. */ + cstat->min_rtt = UINT64_MAX; + cstat->smoothed_rtt = conn->local.settings.initial_rtt; + cstat->rttvar = conn->local.settings.initial_rtt / 2; + cstat->first_rtt_sample_ts = UINT64_MAX; + + if (cc->on_persistent_congestion) { + cc->on_persistent_congestion(cc, cstat, ts); } } @@ -1243,7 +1245,7 @@ void ngtcp2_rtb_remove_expired_lost_pkt(ngtcp2_rtb *rtb, ngtcp2_duration pto, } } -ngtcp2_tstamp ngtcp2_rtb_lost_pkt_ts(ngtcp2_rtb *rtb) { +ngtcp2_tstamp ngtcp2_rtb_lost_pkt_ts(const ngtcp2_rtb *rtb) { ngtcp2_ksl_it it; ngtcp2_rtb_entry *ent; @@ -1285,14 +1287,6 @@ static int rtb_on_pkt_lost_resched_move(ngtcp2_rtb *rtb, ngtcp2_conn *conn, return 0; } - if (ent->flags & NGTCP2_RTB_ENTRY_FLAG_PMTUD_PROBE) { - ngtcp2_log_info(rtb->log, NGTCP2_LOG_EVENT_LDC, - "pkn=%" PRId64 - " is a PMTUD probe packet, no retransmission is necessary", - ent->hd.pkt_num); - return 0; - } - if (ent->flags & NGTCP2_RTB_ENTRY_FLAG_LOST_RETRANSMITTED) { --rtb->num_lost_pkts; @@ -1338,11 +1332,13 @@ static int rtb_on_pkt_lost_resched_move(ngtcp2_rtb *rtb, ngtcp2_conn *conn, ngtcp2_frame_chain_objalloc_del(frc, rtb->frc_objalloc, rtb->mem); break; } + rv = ngtcp2_strm_streamfrq_push(strm, frc); if (rv != 0) { ngtcp2_frame_chain_objalloc_del(frc, rtb->frc_objalloc, rtb->mem); return rv; } + if (!ngtcp2_strm_is_tx_queued(strm)) { strm->cycle = ngtcp2_conn_tx_strmq_first_cycle(conn); rv = ngtcp2_conn_tx_strmq_push(conn, strm); @@ -1350,6 +1346,7 @@ static int rtb_on_pkt_lost_resched_move(ngtcp2_rtb *rtb, ngtcp2_conn *conn, return rv; } } + break; case NGTCP2_FRAME_CRYPTO: frc = *pfrc; @@ -1363,6 +1360,7 @@ static int rtb_on_pkt_lost_resched_move(ngtcp2_rtb *rtb, ngtcp2_conn *conn, ngtcp2_frame_chain_objalloc_del(frc, rtb->frc_objalloc, rtb->mem); return rv; } + break; case NGTCP2_FRAME_DATAGRAM: case NGTCP2_FRAME_DATAGRAM_LEN: @@ -1379,6 +1377,7 @@ static int rtb_on_pkt_lost_resched_move(ngtcp2_rtb *rtb, ngtcp2_conn *conn, *pfrc = (*pfrc)->next; ngtcp2_frame_chain_objalloc_del(frc, rtb->frc_objalloc, rtb->mem); + break; default: pfrc = &(*pfrc)->next; @@ -1408,8 +1407,10 @@ int ngtcp2_rtb_remove_all(ngtcp2_rtb *rtb, ngtcp2_conn *conn, assert(0 == rv); rv = rtb_on_pkt_lost_resched_move(rtb, conn, pktns, ent); + ngtcp2_rtb_entry_objalloc_del(ent, rtb->rtb_entry_objalloc, rtb->frc_objalloc, rtb->mem); + if (rv != 0) { return rv; } @@ -1443,7 +1444,7 @@ void ngtcp2_rtb_remove_early_data(ngtcp2_rtb *rtb, ngtcp2_conn_stat *cstat) { } } -int ngtcp2_rtb_empty(ngtcp2_rtb *rtb) { +int ngtcp2_rtb_empty(const ngtcp2_rtb *rtb) { return ngtcp2_ksl_len(&rtb->ents) == 0; } @@ -1460,7 +1461,7 @@ ngtcp2_ssize ngtcp2_rtb_reclaim_on_pto(ngtcp2_rtb *rtb, ngtcp2_conn *conn, size_t atmost = num_pkts; it = ngtcp2_ksl_end(&rtb->ents); - for (; !ngtcp2_ksl_it_begin(&it) && num_pkts >= 1;) { + for (; !ngtcp2_ksl_it_begin(&it) && num_pkts;) { ngtcp2_ksl_it_prev(&it); ent = ngtcp2_ksl_it_get(&it); @@ -1473,13 +1474,13 @@ ngtcp2_ssize ngtcp2_rtb_reclaim_on_pto(ngtcp2_rtb *rtb, ngtcp2_conn *conn, assert(ent->frc); reclaimed = - rtb_reclaim_frame(rtb, NGTCP2_RECLAIM_FLAG_NONE, conn, pktns, ent); + rtb_reclaim_frame(rtb, NGTCP2_RECLAIM_FLAG_NONE, conn, pktns, ent); if (reclaimed < 0) { return reclaimed; } - /* Mark reclaimed even if reclaimed == 0 so that we can skip it in - the next run. */ + /* Mark ent reclaimed even if reclaimed == 0 so that we can skip + it in the next run. */ ent->flags |= NGTCP2_RTB_ENTRY_FLAG_PTO_RECLAIMED; assert(rtb->num_retransmittable); diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_rtb.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_rtb.h index a1ff208b19eac7..2ef772b2e14f4b 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_rtb.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_rtb.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -85,7 +85,7 @@ typedef struct ngtcp2_rtb_entry ngtcp2_rtb_entry; /* * ngtcp2_rtb_entry is an object stored in ngtcp2_rtb. It corresponds - * to the one packet which is waiting for its ACK. + * to the one packet which is waiting for its acknowledgement. */ struct ngtcp2_rtb_entry { union { @@ -98,10 +98,11 @@ struct ngtcp2_rtb_entry { uint8_t flags; } hd; ngtcp2_frame_chain *frc; - /* ts is the time point when a packet included in this entry is sent - to a peer. */ + /* ts is the time point when a packet included in this entry is + sent to a remote endpoint. */ ngtcp2_tstamp ts; - /* lost_ts is the time when this entry is marked lost. */ + /* lost_ts is the time when this entry is declared to be + lost. */ ngtcp2_tstamp lost_ts; /* pktlen is the length of QUIC packet */ size_t pktlen; @@ -111,6 +112,7 @@ struct ngtcp2_rtb_entry { ngtcp2_tstamp first_sent_ts; uint64_t tx_in_flight; uint64_t lost; + int64_t end_seq; int is_app_limited; } rst; /* flags is bitwise-OR of zero or more of @@ -122,11 +124,11 @@ struct ngtcp2_rtb_entry { }; }; -ngtcp2_objalloc_decl(rtb_entry, ngtcp2_rtb_entry, oplent); +ngtcp2_objalloc_decl(rtb_entry, ngtcp2_rtb_entry, oplent) /* - * ngtcp2_rtb_entry_new allocates ngtcp2_rtb_entry object, and assigns - * its pointer to |*pent|. + * ngtcp2_rtb_entry_objalloc_new allocates ngtcp2_rtb_entry object via + * |objalloc|, and assigns its pointer to |*pent|. */ int ngtcp2_rtb_entry_objalloc_new(ngtcp2_rtb_entry **pent, const ngtcp2_pkt_hd *hd, @@ -145,7 +147,7 @@ void ngtcp2_rtb_entry_objalloc_del(ngtcp2_rtb_entry *ent, const ngtcp2_mem *mem); /* - * ngtcp2_rtb tracks sent packets, and its ACK timeout for + * ngtcp2_rtb tracks sent packets, and its acknowledgement timeout for * retransmission. */ typedef struct ngtcp2_rtb { @@ -154,34 +156,33 @@ typedef struct ngtcp2_rtb { /* ents includes ngtcp2_rtb_entry sorted by decreasing order of packet number. */ ngtcp2_ksl ents; - /* crypto is CRYPTO stream. */ - ngtcp2_strm *crypto; ngtcp2_rst *rst; ngtcp2_cc *cc; ngtcp2_log *log; ngtcp2_qlog *qlog; const ngtcp2_mem *mem; /* largest_acked_tx_pkt_num is the largest packet number - acknowledged by the peer. */ + acknowledged by a remote endpoint. */ int64_t largest_acked_tx_pkt_num; - /* num_ack_eliciting is the number of ACK eliciting entries. */ + /* num_ack_eliciting is the number of ACK eliciting entries in + ents. */ size_t num_ack_eliciting; /* num_retransmittable is the number of packets which contain frames - that must be retransmitted on loss. */ + that must be retransmitted on loss in ents. */ size_t num_retransmittable; /* num_pto_eliciting is the number of packets that elicit PTO probe - packets. */ + packets in ents. */ size_t num_pto_eliciting; /* probe_pkt_left is the number of probe packet to send */ size_t probe_pkt_left; - /* pktns_id is the identifier of packet number space. */ - ngtcp2_pktns_id pktns_id; /* cc_pkt_num is the smallest packet number that is contributed to ngtcp2_conn_stat.bytes_in_flight. */ int64_t cc_pkt_num; /* cc_bytes_in_flight is the number of in-flight bytes that is contributed to ngtcp2_conn_stat.bytes_in_flight. It only - includes the bytes after congestion state is reset. */ + includes the bytes after congestion state is reset, that is only + count a packet whose packet number is greater than or equals to + cc_pkt_num. */ uint64_t cc_bytes_in_flight; /* persistent_congestion_start_ts is the time when persistent congestion evaluation is started. It happens roughly after @@ -199,8 +200,7 @@ typedef struct ngtcp2_rtb { /* * ngtcp2_rtb_init initializes |rtb|. */ -void ngtcp2_rtb_init(ngtcp2_rtb *rtb, ngtcp2_pktns_id pktns_id, - ngtcp2_strm *crypto, ngtcp2_rst *rst, ngtcp2_cc *cc, +void ngtcp2_rtb_init(ngtcp2_rtb *rtb, ngtcp2_rst *rst, ngtcp2_cc *cc, int64_t cc_pkt_num, ngtcp2_log *log, ngtcp2_qlog *qlog, ngtcp2_objalloc *rtb_entry_objalloc, ngtcp2_objalloc *frc_objalloc, const ngtcp2_mem *mem); @@ -227,13 +227,13 @@ int ngtcp2_rtb_add(ngtcp2_rtb *rtb, ngtcp2_rtb_entry *ent, * which has the largest packet number. If there is no entry, * returned value satisfies ngtcp2_ksl_it_end(&it) != 0. */ -ngtcp2_ksl_it ngtcp2_rtb_head(ngtcp2_rtb *rtb); +ngtcp2_ksl_it ngtcp2_rtb_head(const ngtcp2_rtb *rtb); /* - * ngtcp2_rtb_recv_ack removes acked ngtcp2_rtb_entry from |rtb|. - * |pkt_num| is a packet number which includes |fr|. |pkt_ts| is the - * timestamp when packet is received. |ts| should be the current - * time. Usually they are the same, but for buffered packets, + * ngtcp2_rtb_recv_ack removes an acknowledged ngtcp2_rtb_entry from + * |rtb|. |pkt_num| is a packet number which includes |fr|. |pkt_ts| + * is the timestamp when packet is received. |ts| should be the + * current time. Usually they are the same, but for buffered packets, * |pkt_ts| would be earlier than |ts|. * * This function returns the number of newly acknowledged packets if @@ -252,7 +252,7 @@ ngtcp2_ssize ngtcp2_rtb_recv_ack(ngtcp2_rtb *rtb, const ngtcp2_ack *fr, /* * ngtcp2_rtb_detect_lost_pkt detects lost packets and prepends the * frames contained them to |*pfrc|. Even when this function fails, - * some frames might be prepended to |*pfrc| and the caller should + * some frames might be prepended to |*pfrc|, and the caller should * handle them. */ int ngtcp2_rtb_detect_lost_pkt(ngtcp2_rtb *rtb, ngtcp2_conn *conn, @@ -266,16 +266,16 @@ void ngtcp2_rtb_remove_expired_lost_pkt(ngtcp2_rtb *rtb, ngtcp2_duration pto, ngtcp2_tstamp ts); /* - * ngtcp2_rtb_lost_pkt_ts returns the earliest time when the still - * retained packet was lost. It returns UINT64_MAX if no such packet - * exists. + * ngtcp2_rtb_lost_pkt_ts returns the timestamp when an oldest lost + * packet tracked by |rtb| was declared lost. It returns UINT64_MAX + * if no such packet exists. */ -ngtcp2_tstamp ngtcp2_rtb_lost_pkt_ts(ngtcp2_rtb *rtb); +ngtcp2_tstamp ngtcp2_rtb_lost_pkt_ts(const ngtcp2_rtb *rtb); /* - * ngtcp2_rtb_remove_all removes all packets from |rtb| and prepends + * ngtcp2_rtb_remove_all removes all packets from |rtb|, and prepends * all frames to |*pfrc|. Even when this function fails, some frames - * might be prepended to |*pfrc| and the caller should handle them. + * might be prepended to |*pfrc|, and the caller should handle them. */ int ngtcp2_rtb_remove_all(ngtcp2_rtb *rtb, ngtcp2_conn *conn, ngtcp2_pktns *pktns, ngtcp2_conn_stat *cstat); @@ -286,9 +286,9 @@ int ngtcp2_rtb_remove_all(ngtcp2_rtb *rtb, ngtcp2_conn *conn, void ngtcp2_rtb_remove_early_data(ngtcp2_rtb *rtb, ngtcp2_conn_stat *cstat); /* - * ngtcp2_rtb_empty returns nonzero if |rtb| have no entry. + * ngtcp2_rtb_empty returns nonzero if |rtb| has no entry. */ -int ngtcp2_rtb_empty(ngtcp2_rtb *rtb); +int ngtcp2_rtb_empty(const ngtcp2_rtb *rtb); /* * ngtcp2_rtb_reset_cc_state resets congestion state in |rtb|. @@ -298,15 +298,15 @@ int ngtcp2_rtb_empty(ngtcp2_rtb *rtb); void ngtcp2_rtb_reset_cc_state(ngtcp2_rtb *rtb, int64_t cc_pkt_num); /* - * ngtcp2_rtb_remove_expired_lost_pkt ensures that the number of lost - * packets at most |n|. + * ngtcp2_rtb_remove_excessive_lost_pkt ensures that the number of + * lost packets is at most |n|. */ void ngtcp2_rtb_remove_excessive_lost_pkt(ngtcp2_rtb *rtb, size_t n); /* * ngtcp2_rtb_reclaim_on_pto reclaims up to |num_pkts| packets which - * are in-flight and not marked lost to send them in PTO probe. The - * reclaimed frames are chained to |*pfrc|. + * are in-flight and not marked lost. The reclaimed frames may be + * sent in a PTO probe packet. * * This function returns the number of packets reclaimed if it * succeeds, or one of the following negative error codes: @@ -317,4 +317,4 @@ void ngtcp2_rtb_remove_excessive_lost_pkt(ngtcp2_rtb *rtb, size_t n); ngtcp2_ssize ngtcp2_rtb_reclaim_on_pto(ngtcp2_rtb *rtb, ngtcp2_conn *conn, ngtcp2_pktns *pktns, size_t num_pkts); -#endif /* NGTCP2_RTB_H */ +#endif /* !defined(NGTCP2_RTB_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_settings.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_settings.c new file mode 100644 index 00000000000000..77a68bd112e3b2 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_settings.c @@ -0,0 +1,91 @@ +/* + * ngtcp2 + * + * Copyright (c) 2024 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "ngtcp2_settings.h" + +#include +#include + +#include "ngtcp2_unreachable.h" + +void ngtcp2_settings_default_versioned(int settings_version, + ngtcp2_settings *settings) { + size_t len = ngtcp2_settingslen_version(settings_version); + + memset(settings, 0, len); + + switch (settings_version) { + case NGTCP2_SETTINGS_VERSION: + case NGTCP2_SETTINGS_V1: + settings->cc_algo = NGTCP2_CC_ALGO_CUBIC; + settings->initial_rtt = NGTCP2_DEFAULT_INITIAL_RTT; + settings->ack_thresh = 2; + settings->max_tx_udp_payload_size = 1500 - 48; + settings->handshake_timeout = UINT64_MAX; + + break; + } +} + +static void settings_copy(ngtcp2_settings *dest, const ngtcp2_settings *src, + int settings_version) { + assert(settings_version != NGTCP2_SETTINGS_VERSION); + + memcpy(dest, src, ngtcp2_settingslen_version(settings_version)); +} + +const ngtcp2_settings * +ngtcp2_settings_convert_to_latest(ngtcp2_settings *dest, int settings_version, + const ngtcp2_settings *src) { + if (settings_version == NGTCP2_SETTINGS_VERSION) { + return src; + } + + ngtcp2_settings_default(dest); + + settings_copy(dest, src, settings_version); + + return dest; +} + +void ngtcp2_settings_convert_to_old(int settings_version, ngtcp2_settings *dest, + const ngtcp2_settings *src) { + assert(settings_version != NGTCP2_SETTINGS_VERSION); + + settings_copy(dest, src, settings_version); +} + +size_t ngtcp2_settingslen_version(int settings_version) { + ngtcp2_settings settings; + + switch (settings_version) { + case NGTCP2_SETTINGS_VERSION: + return sizeof(settings); + case NGTCP2_SETTINGS_V1: + return offsetof(ngtcp2_settings, initial_pkt_num) + + sizeof(settings.initial_pkt_num); + default: + ngtcp2_unreachable(); + } +} diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_settings.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_settings.h new file mode 100644 index 00000000000000..80466d43e47a7a --- /dev/null +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_settings.h @@ -0,0 +1,73 @@ +/* + * ngtcp2 + * + * Copyright (c) 2024 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef NGTCP2_SETTINGS_H +#define NGTCP2_SETTINGS_H + +#ifdef HAVE_CONFIG_H +# include +#endif /* defined(HAVE_CONFIG_H) */ + +#include + +/* + * ngtcp2_settings_convert_to_latest converts |src| of version + * |settings_version| to the latest version NGTCP2_SETTINGS_VERSION. + * + * |dest| must point to the latest version. |src| may be the older + * version, and if so, it may have fewer fields. Accessing those + * fields causes undefined behavior. + * + * If |settings_version| == NGTCP2_SETTINGS_VERSION, no conversion is + * made, and |src| is returned. Otherwise, first |dest| is + * initialized via ngtcp2_settings_default, and then all valid fields + * in |src| are copied into |dest|. Finally, |dest| is returned. + */ +const ngtcp2_settings * +ngtcp2_settings_convert_to_latest(ngtcp2_settings *dest, int settings_version, + const ngtcp2_settings *src); + +/* + * ngtcp2_settings_convert_to_old converts |src| of the latest version + * to |dest| of version |settings_version|. + * + * |settings_version| must not be the latest version + * NGTCP2_SETTINGS_VERSION. + * + * |dest| points to the older version, and it may have fewer fields. + * Accessing those fields causes undefined behavior. + * + * This function copies all valid fields in version |settings_version| + * from |src| to |dest|. + */ +void ngtcp2_settings_convert_to_old(int settings_version, ngtcp2_settings *dest, + const ngtcp2_settings *src); + +/* + * ngtcp2_settingslen_version returns the effective length of + * ngtcp2_settings at the version |settings_version|. + */ +size_t ngtcp2_settingslen_version(int settings_version); + +#endif /* !defined(NGTCP2_SETTINGS_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_str.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_str.h index deb75e356d70d4..f970c153e805a8 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_str.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_str.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -91,4 +91,4 @@ char *ngtcp2_encode_printable_ascii(char *dest, const uint8_t *data, */ int ngtcp2_cmemeq(const uint8_t *a, const uint8_t *b, size_t n); -#endif /* NGTCP2_STR_H */ +#endif /* !defined(NGTCP2_STR_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_strm.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_strm.c index c00e86fa8c1afa..8ea969c4addbdc 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_strm.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_strm.c @@ -32,16 +32,13 @@ #include "ngtcp2_vec.h" #include "ngtcp2_frame_chain.h" -static int offset_less(const ngtcp2_ksl_key *lhs, const ngtcp2_ksl_key *rhs) { - return *(int64_t *)lhs < *(int64_t *)rhs; -} - void ngtcp2_strm_init(ngtcp2_strm *strm, int64_t stream_id, uint32_t flags, uint64_t max_rx_offset, uint64_t max_tx_offset, void *stream_user_data, ngtcp2_objalloc *frc_objalloc, const ngtcp2_mem *mem) { - strm->frc_objalloc = frc_objalloc; + strm->pe.index = NGTCP2_PQ_BAD_INDEX; strm->cycle = 0; + strm->frc_objalloc = frc_objalloc; strm->tx.acked_offset = NULL; strm->tx.cont_acked_offset = 0; strm->tx.streamfrq = NULL; @@ -56,13 +53,12 @@ void ngtcp2_strm_init(ngtcp2_strm *strm, int64_t stream_id, uint32_t flags, strm->rx.rob = NULL; strm->rx.cont_offset = 0; strm->rx.last_offset = 0; + strm->rx.max_offset = strm->rx.unsent_max_offset = strm->rx.window = + max_rx_offset; + strm->mem = mem; strm->stream_id = stream_id; - strm->flags = flags; strm->stream_user_data = stream_user_data; - strm->rx.window = strm->rx.max_offset = strm->rx.unsent_max_offset = - max_rx_offset; - strm->pe.index = NGTCP2_PQ_BAD_INDEX; - strm->mem = mem; + strm->flags = flags; strm->app_error_code = 0; } @@ -114,7 +110,7 @@ static int strm_rob_init(ngtcp2_strm *strm) { return 0; } -uint64_t ngtcp2_strm_rx_offset(ngtcp2_strm *strm) { +uint64_t ngtcp2_strm_rx_offset(const ngtcp2_strm *strm) { if (strm->rx.rob == NULL) { return strm->rx.cont_offset; } @@ -123,7 +119,7 @@ uint64_t ngtcp2_strm_rx_offset(ngtcp2_strm *strm) { /* strm_rob_heavily_fragmented returns nonzero if the number of gaps in |rob| exceeds the limit. */ -static int strm_rob_heavily_fragmented(ngtcp2_rob *rob) { +static int strm_rob_heavily_fragmented(const ngtcp2_rob *rob) { return ngtcp2_ksl_len(&rob->gapksl) >= 5000; } @@ -180,7 +176,8 @@ static int strm_streamfrq_init(ngtcp2_strm *strm) { return NGTCP2_ERR_NOMEM; } - ngtcp2_ksl_init(streamfrq, offset_less, sizeof(uint64_t), strm->mem); + ngtcp2_ksl_init(streamfrq, ngtcp2_ksl_uint64_less, + ngtcp2_ksl_uint64_less_search, sizeof(uint64_t), strm->mem); strm->tx.streamfrq = streamfrq; @@ -271,6 +268,7 @@ static int strm_streamfrq_unacked_pop(ngtcp2_strm *strm, } ngtcp2_frame_chain_objalloc_del(frc, strm->frc_objalloc, strm->mem); + continue; } @@ -306,11 +304,12 @@ static int strm_streamfrq_unacked_pop(ngtcp2_strm *strm, fr->data[0].len -= (size_t)base_offset; *pfrc = frc; + return 0; } rv = ngtcp2_frame_chain_stream_datacnt_objalloc_new( - &nfrc, fr->datacnt - end_idx, strm->frc_objalloc, strm->mem); + &nfrc, fr->datacnt - end_idx, strm->frc_objalloc, strm->mem); if (rv != 0) { ngtcp2_frame_chain_objalloc_del(frc, strm->frc_objalloc, strm->mem); return rv; @@ -336,6 +335,7 @@ static int strm_streamfrq_unacked_pop(ngtcp2_strm *strm, assert(ngtcp2_err_is_fatal(rv)); ngtcp2_frame_chain_objalloc_del(nfrc, strm->frc_objalloc, strm->mem); ngtcp2_frame_chain_objalloc_del(frc, strm->frc_objalloc, strm->mem); + return rv; } @@ -350,14 +350,17 @@ static int strm_streamfrq_unacked_pop(ngtcp2_strm *strm, fr->fin = 0; fr->offset = offset + base_offset; fr->datacnt = end_idx - idx; + if (end_base_offset) { assert(fr->data[fr->datacnt - 1].len > end_base_offset); fr->data[fr->datacnt - 1].len = (size_t)end_base_offset; } + fr->data[0].base += base_offset; fr->data[0].len -= (size_t)base_offset; *pfrc = frc; + return 0; } @@ -367,7 +370,7 @@ static int strm_streamfrq_unacked_pop(ngtcp2_strm *strm, int ngtcp2_strm_streamfrq_pop(ngtcp2_strm *strm, ngtcp2_frame_chain **pfrc, size_t left) { ngtcp2_stream *fr, *nfr; - ngtcp2_frame_chain *frc, *nfrc; + ngtcp2_frame_chain *frc, *nfrc, *sfrc; int rv; size_t nmerged; uint64_t datalen; @@ -385,6 +388,7 @@ int ngtcp2_strm_streamfrq_pop(ngtcp2_strm *strm, ngtcp2_frame_chain **pfrc, if (rv != 0) { return rv; } + if (frc == NULL) { *pfrc = NULL; return 0; @@ -401,7 +405,9 @@ int ngtcp2_strm_streamfrq_pop(ngtcp2_strm *strm, ngtcp2_frame_chain **pfrc, ngtcp2_frame_chain_objalloc_del(frc, strm->frc_objalloc, strm->mem); return rv; } + *pfrc = NULL; + return 0; } @@ -410,13 +416,13 @@ int ngtcp2_strm_streamfrq_pop(ngtcp2_strm *strm, ngtcp2_frame_chain **pfrc, acnt = fr->datacnt; bcnt = 0; - ngtcp2_vec_split(a, &acnt, b, &bcnt, left, NGTCP2_MAX_STREAM_DATACNT); + ngtcp2_vec_split(b, &bcnt, a, &acnt, left, NGTCP2_MAX_STREAM_DATACNT); assert(acnt > 0); assert(bcnt > 0); rv = ngtcp2_frame_chain_stream_datacnt_objalloc_new( - &nfrc, bcnt, strm->frc_objalloc, strm->mem); + &nfrc, bcnt, strm->frc_objalloc, strm->mem); if (rv != 0) { assert(ngtcp2_err_is_fatal(rv)); ngtcp2_frame_chain_objalloc_del(frc, strm->frc_objalloc, strm->mem); @@ -437,11 +443,12 @@ int ngtcp2_strm_streamfrq_pop(ngtcp2_strm *strm, ngtcp2_frame_chain **pfrc, assert(ngtcp2_err_is_fatal(rv)); ngtcp2_frame_chain_objalloc_del(nfrc, strm->frc_objalloc, strm->mem); ngtcp2_frame_chain_objalloc_del(frc, strm->frc_objalloc, strm->mem); + return rv; } rv = ngtcp2_frame_chain_stream_datacnt_objalloc_new( - &nfrc, acnt, strm->frc_objalloc, strm->mem); + &nfrc, acnt, strm->frc_objalloc, strm->mem); if (rv != 0) { assert(ngtcp2_err_is_fatal(rv)); ngtcp2_frame_chain_objalloc_del(frc, strm->frc_objalloc, strm->mem); @@ -491,7 +498,9 @@ int ngtcp2_strm_streamfrq_pop(ngtcp2_strm *strm, ngtcp2_frame_chain **pfrc, break; } - nmerged = ngtcp2_vec_merge(a, &acnt, nfr->data, &nfr->datacnt, left, + bcnt = nfr->datacnt; + + nmerged = ngtcp2_vec_merge(a, &acnt, nfr->data, &bcnt, left, NGTCP2_MAX_STREAM_DATACNT); if (nmerged == 0) { rv = ngtcp2_ksl_insert(strm->tx.streamfrq, NULL, &nfr->offset, nfrc); @@ -499,27 +508,56 @@ int ngtcp2_strm_streamfrq_pop(ngtcp2_strm *strm, ngtcp2_frame_chain **pfrc, assert(ngtcp2_err_is_fatal(rv)); ngtcp2_frame_chain_objalloc_del(nfrc, strm->frc_objalloc, strm->mem); ngtcp2_frame_chain_objalloc_del(frc, strm->frc_objalloc, strm->mem); + return rv; } + break; } datalen += nmerged; left -= nmerged; - if (nfr->datacnt == 0) { + if (bcnt == 0) { fr->fin = nfr->fin; ngtcp2_frame_chain_objalloc_del(nfrc, strm->frc_objalloc, strm->mem); continue; } - nfr->offset += nmerged; + if (nfr->datacnt <= NGTCP2_FRAME_CHAIN_STREAM_DATACNT_THRES || + bcnt > NGTCP2_FRAME_CHAIN_STREAM_DATACNT_THRES) { + nfr->offset += nmerged; + nfr->datacnt = bcnt; + + rv = ngtcp2_ksl_insert(strm->tx.streamfrq, NULL, &nfr->offset, nfrc); + if (rv != 0) { + ngtcp2_frame_chain_objalloc_del(nfrc, strm->frc_objalloc, strm->mem); + ngtcp2_frame_chain_objalloc_del(frc, strm->frc_objalloc, strm->mem); + return rv; + } + } else { + rv = ngtcp2_frame_chain_stream_datacnt_objalloc_new( + &sfrc, bcnt, strm->frc_objalloc, strm->mem); + if (rv != 0) { + ngtcp2_frame_chain_objalloc_del(nfrc, strm->frc_objalloc, strm->mem); + ngtcp2_frame_chain_objalloc_del(frc, strm->frc_objalloc, strm->mem); + return rv; + } + + sfrc->fr.stream = nfrc->fr.stream; + sfrc->fr.stream.offset += nmerged; + sfrc->fr.stream.datacnt = bcnt; + ngtcp2_vec_copy(sfrc->fr.stream.data, nfrc->fr.stream.data, bcnt); - rv = ngtcp2_ksl_insert(strm->tx.streamfrq, NULL, &nfr->offset, nfrc); - if (rv != 0) { ngtcp2_frame_chain_objalloc_del(nfrc, strm->frc_objalloc, strm->mem); - ngtcp2_frame_chain_objalloc_del(frc, strm->frc_objalloc, strm->mem); - return rv; + + rv = ngtcp2_ksl_insert(strm->tx.streamfrq, NULL, &sfrc->fr.stream.offset, + sfrc); + if (rv != 0) { + ngtcp2_frame_chain_objalloc_del(sfrc, strm->frc_objalloc, strm->mem); + ngtcp2_frame_chain_objalloc_del(frc, strm->frc_objalloc, strm->mem); + return rv; + } } break; @@ -531,13 +569,14 @@ int ngtcp2_strm_streamfrq_pop(ngtcp2_strm *strm, ngtcp2_frame_chain **pfrc, } *pfrc = frc; + return 0; } assert(acnt > fr->datacnt); rv = ngtcp2_frame_chain_stream_datacnt_objalloc_new( - &nfrc, acnt, strm->frc_objalloc, strm->mem); + &nfrc, acnt, strm->frc_objalloc, strm->mem); if (rv != 0) { ngtcp2_frame_chain_objalloc_del(frc, strm->frc_objalloc, strm->mem); return rv; @@ -555,7 +594,7 @@ int ngtcp2_strm_streamfrq_pop(ngtcp2_strm *strm, ngtcp2_frame_chain **pfrc, return 0; } -uint64_t ngtcp2_strm_streamfrq_unacked_offset(ngtcp2_strm *strm) { +uint64_t ngtcp2_strm_streamfrq_unacked_offset(const ngtcp2_strm *strm) { ngtcp2_frame_chain *frc; ngtcp2_stream *fr; ngtcp2_range gap; @@ -577,9 +616,11 @@ uint64_t ngtcp2_strm_streamfrq_unacked_offset(ngtcp2_strm *strm) { if (gap.begin <= fr->offset) { return fr->offset; } + if (gap.begin < fr->offset + datalen) { return gap.begin; } + if (fr->offset + datalen == gap.begin && fr->fin && !(strm->flags & NGTCP2_STRM_FLAG_FIN_ACKED)) { return fr->offset + datalen; @@ -589,17 +630,18 @@ uint64_t ngtcp2_strm_streamfrq_unacked_offset(ngtcp2_strm *strm) { return (uint64_t)-1; } -ngtcp2_frame_chain *ngtcp2_strm_streamfrq_top(ngtcp2_strm *strm) { +ngtcp2_frame_chain *ngtcp2_strm_streamfrq_top(const ngtcp2_strm *strm) { ngtcp2_ksl_it it; assert(strm->tx.streamfrq); assert(ngtcp2_ksl_len(strm->tx.streamfrq)); it = ngtcp2_ksl_begin(strm->tx.streamfrq); + return ngtcp2_ksl_it_get(&it); } -int ngtcp2_strm_streamfrq_empty(ngtcp2_strm *strm) { +int ngtcp2_strm_streamfrq_empty(const ngtcp2_strm *strm) { return strm->tx.streamfrq == NULL || ngtcp2_ksl_len(strm->tx.streamfrq) == 0; } @@ -616,14 +658,15 @@ void ngtcp2_strm_streamfrq_clear(ngtcp2_strm *strm) { frc = ngtcp2_ksl_it_get(&it); ngtcp2_frame_chain_objalloc_del(frc, strm->frc_objalloc, strm->mem); } + ngtcp2_ksl_clear(strm->tx.streamfrq); } -int ngtcp2_strm_is_tx_queued(ngtcp2_strm *strm) { +int ngtcp2_strm_is_tx_queued(const ngtcp2_strm *strm) { return strm->pe.index != NGTCP2_PQ_BAD_INDEX; } -int ngtcp2_strm_is_all_tx_data_acked(ngtcp2_strm *strm) { +int ngtcp2_strm_is_all_tx_data_acked(const ngtcp2_strm *strm) { if (strm->tx.acked_offset == NULL) { return strm->tx.cont_acked_offset == strm->tx.offset; } @@ -632,12 +675,12 @@ int ngtcp2_strm_is_all_tx_data_acked(ngtcp2_strm *strm) { strm->tx.offset; } -int ngtcp2_strm_is_all_tx_data_fin_acked(ngtcp2_strm *strm) { +int ngtcp2_strm_is_all_tx_data_fin_acked(const ngtcp2_strm *strm) { return (strm->flags & NGTCP2_STRM_FLAG_FIN_ACKED) && ngtcp2_strm_is_all_tx_data_acked(strm); } -ngtcp2_range ngtcp2_strm_get_unacked_range_after(ngtcp2_strm *strm, +ngtcp2_range ngtcp2_strm_get_unacked_range_after(const ngtcp2_strm *strm, uint64_t offset) { ngtcp2_range gap; @@ -650,7 +693,7 @@ ngtcp2_range ngtcp2_strm_get_unacked_range_after(ngtcp2_strm *strm, return ngtcp2_gaptr_get_first_gap_after(strm->tx.acked_offset, offset); } -uint64_t ngtcp2_strm_get_acked_offset(ngtcp2_strm *strm) { +uint64_t ngtcp2_strm_get_acked_offset(const ngtcp2_strm *strm) { if (strm->tx.acked_offset == NULL) { return strm->tx.cont_acked_offset; } @@ -660,7 +703,7 @@ uint64_t ngtcp2_strm_get_acked_offset(ngtcp2_strm *strm) { static int strm_acked_offset_init(ngtcp2_strm *strm) { ngtcp2_gaptr *acked_offset = - ngtcp2_mem_malloc(strm->mem, sizeof(*acked_offset)); + ngtcp2_mem_malloc(strm->mem, sizeof(*acked_offset)); if (acked_offset == NULL) { return NGTCP2_ERR_NOMEM; @@ -688,7 +731,7 @@ int ngtcp2_strm_ack_data(ngtcp2_strm *strm, uint64_t offset, uint64_t len) { } rv = - ngtcp2_gaptr_push(strm->tx.acked_offset, 0, strm->tx.cont_acked_offset); + ngtcp2_gaptr_push(strm->tx.acked_offset, 0, strm->tx.cont_acked_offset); if (rv != 0) { return rv; } @@ -709,24 +752,24 @@ void ngtcp2_strm_set_app_error_code(ngtcp2_strm *strm, strm->app_error_code = app_error_code; } -int ngtcp2_strm_require_retransmit_reset_stream(ngtcp2_strm *strm) { +int ngtcp2_strm_require_retransmit_reset_stream(const ngtcp2_strm *strm) { return !ngtcp2_strm_is_all_tx_data_fin_acked(strm); } -int ngtcp2_strm_require_retransmit_stop_sending(ngtcp2_strm *strm) { +int ngtcp2_strm_require_retransmit_stop_sending(const ngtcp2_strm *strm) { return !(strm->flags & NGTCP2_STRM_FLAG_SHUT_RD) || ngtcp2_strm_rx_offset(strm) != strm->rx.last_offset; } -int ngtcp2_strm_require_retransmit_max_stream_data(ngtcp2_strm *strm, - ngtcp2_max_stream_data *fr) { +int ngtcp2_strm_require_retransmit_max_stream_data( + const ngtcp2_strm *strm, const ngtcp2_max_stream_data *fr) { return fr->max_stream_data == strm->rx.max_offset && !(strm->flags & (NGTCP2_STRM_FLAG_SHUT_RD | NGTCP2_STRM_FLAG_STOP_SENDING)); } int ngtcp2_strm_require_retransmit_stream_data_blocked( - ngtcp2_strm *strm, ngtcp2_stream_data_blocked *fr) { + const ngtcp2_strm *strm, const ngtcp2_stream_data_blocked *fr) { return fr->offset == strm->tx.max_offset && !(strm->flags & NGTCP2_STRM_FLAG_SHUT_WR); } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_strm.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_strm.h index 385302a5eafa9f..c72f8b9dc89aca 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_strm.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_strm.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -86,6 +86,9 @@ typedef struct ngtcp2_frame_chain ngtcp2_frame_chain; received from the remote endpoint. In this case, NGTCP2_STRM_FLAG_SHUT_WR is also set. */ #define NGTCP2_STRM_FLAG_STOP_SENDING_RECVED 0x800u +/* NGTCP2_STRM_FLAG_ANY_SENT indicates that any STREAM frame, + including empty one, has been sent. */ +#define NGTCP2_STRM_FLAG_ANY_SENT 0x1000u typedef struct ngtcp2_strm ngtcp2_strm; @@ -105,13 +108,13 @@ struct ngtcp2_strm { acked_offset is used instead. */ uint64_t cont_acked_offset; /* streamfrq contains STREAM or CRYPTO frame for - retransmission. The flow control credits have been paid - when they are transmitted first time. There are no + retransmission. The flow control credits have already been + paid when they are transmitted first time. There are no restriction regarding flow control for retransmission. */ ngtcp2_ksl *streamfrq; - /* offset is the next offset of outgoing data. In other words, it - is the number of bytes sent in this stream without - duplication. */ + /* offset is the next offset of new outgoing data. In other + words, it is the number of bytes sent in this stream + without duplication. */ uint64_t offset; /* max_tx_offset is the maximum offset that local endpoint can send for this stream. */ @@ -200,7 +203,7 @@ void ngtcp2_strm_free(ngtcp2_strm *strm); * ngtcp2_strm_rx_offset returns the minimum offset of stream data * which is not received yet. */ -uint64_t ngtcp2_strm_rx_offset(ngtcp2_strm *strm); +uint64_t ngtcp2_strm_rx_offset(const ngtcp2_strm *strm); /* * ngtcp2_strm_recv_reordering handles reordered data. @@ -215,8 +218,8 @@ int ngtcp2_strm_recv_reordering(ngtcp2_strm *strm, const uint8_t *data, size_t datalen, uint64_t offset); /* - * ngtcp2_strm_update_rx_offset tells that data up to offset bytes are - * received in order. + * ngtcp2_strm_update_rx_offset tells that data up to |offset| bytes + * are received in order. */ void ngtcp2_strm_update_rx_offset(ngtcp2_strm *strm, uint64_t offset); @@ -227,13 +230,14 @@ void ngtcp2_strm_update_rx_offset(ngtcp2_strm *strm, uint64_t offset); void ngtcp2_strm_discard_reordered_data(ngtcp2_strm *strm); /* - * ngtcp2_strm_shutdown shutdowns |strm|. |flags| should be - * NGTCP2_STRM_FLAG_SHUT_RD, and/or NGTCP2_STRM_FLAG_SHUT_WR. + * ngtcp2_strm_shutdown shutdowns |strm|. |flags| should be one of + * NGTCP2_STRM_FLAG_SHUT_RD, NGTCP2_STRM_FLAG_SHUT_WR, and + * NGTCP2_STRM_FLAG_SHUT_RDWR. */ void ngtcp2_strm_shutdown(ngtcp2_strm *strm, uint32_t flags); /* - * ngtcp2_strm_streamfrq_push pushes |frc| to streamfrq for + * ngtcp2_strm_streamfrq_push pushes |frc| to strm->tx.streamfrq for * retransmission. * * This function returns 0 if it succeeds, or one of the following @@ -245,11 +249,12 @@ void ngtcp2_strm_shutdown(ngtcp2_strm *strm, uint32_t flags); int ngtcp2_strm_streamfrq_push(ngtcp2_strm *strm, ngtcp2_frame_chain *frc); /* - * ngtcp2_strm_streamfrq_pop pops the first ngtcp2_frame_chain and - * assigns it to |*pfrc|. This function splits into or merges several - * ngtcp2_frame_chain objects so that the returned ngtcp2_frame_chain - * has at most |left| data length. If there is no frames to send, - * this function returns 0 and |*pfrc| is NULL. + * ngtcp2_strm_streamfrq_pop assigns a ngtcp2_frame_chain that only + * contains unacknowledged stream data with smallest offset to |*pfrc| + * for retransmission. The assigned ngtcp2_frame_chain has stream + * data at most |left| bytes. strm->tx.streamfrq is adjusted to + * exclude the portion of data included in it. If there is no stream + * data to send, this function returns 0 and |*pfrc| is NULL. * * This function returns 0 if it succeeds, or one of the following * negative error codes: @@ -264,18 +269,18 @@ int ngtcp2_strm_streamfrq_pop(ngtcp2_strm *strm, ngtcp2_frame_chain **pfrc, * ngtcp2_strm_streamfrq_unacked_offset returns the smallest offset of * unacknowledged stream data held in strm->tx.streamfrq. */ -uint64_t ngtcp2_strm_streamfrq_unacked_offset(ngtcp2_strm *strm); +uint64_t ngtcp2_strm_streamfrq_unacked_offset(const ngtcp2_strm *strm); /* * ngtcp2_strm_streamfrq_top returns the first ngtcp2_frame_chain. * The queue must not be empty. */ -ngtcp2_frame_chain *ngtcp2_strm_streamfrq_top(ngtcp2_strm *strm); +ngtcp2_frame_chain *ngtcp2_strm_streamfrq_top(const ngtcp2_strm *strm); /* * ngtcp2_strm_streamfrq_empty returns nonzero if streamfrq is empty. */ -int ngtcp2_strm_streamfrq_empty(ngtcp2_strm *strm); +int ngtcp2_strm_streamfrq_empty(const ngtcp2_strm *strm); /* * ngtcp2_strm_streamfrq_clear removes all frames from streamfrq. @@ -285,26 +290,26 @@ void ngtcp2_strm_streamfrq_clear(ngtcp2_strm *strm); /* * ngtcp2_strm_is_tx_queued returns nonzero if |strm| is queued. */ -int ngtcp2_strm_is_tx_queued(ngtcp2_strm *strm); +int ngtcp2_strm_is_tx_queued(const ngtcp2_strm *strm); /* * ngtcp2_strm_is_all_tx_data_acked returns nonzero if all outgoing * data for |strm| which have sent so far have been acknowledged. */ -int ngtcp2_strm_is_all_tx_data_acked(ngtcp2_strm *strm); +int ngtcp2_strm_is_all_tx_data_acked(const ngtcp2_strm *strm); /* * ngtcp2_strm_is_all_tx_data_fin_acked behaves like * ngtcp2_strm_is_all_tx_data_acked, but it also requires that STREAM * frame with fin bit set is acknowledged. */ -int ngtcp2_strm_is_all_tx_data_fin_acked(ngtcp2_strm *strm); +int ngtcp2_strm_is_all_tx_data_fin_acked(const ngtcp2_strm *strm); /* * ngtcp2_strm_get_unacked_range_after returns the range that is not - * acknowledged yet and intersects or comes after |offset|. + * acknowledged yet and includes or comes after |offset|. */ -ngtcp2_range ngtcp2_strm_get_unacked_range_after(ngtcp2_strm *strm, +ngtcp2_range ngtcp2_strm_get_unacked_range_after(const ngtcp2_strm *strm, uint64_t offset); /* @@ -312,11 +317,11 @@ ngtcp2_range ngtcp2_strm_get_unacked_range_after(ngtcp2_strm *strm, * this offset have been acknowledged by a remote endpoint. It * returns 0 if no data is acknowledged. */ -uint64_t ngtcp2_strm_get_acked_offset(ngtcp2_strm *strm); +uint64_t ngtcp2_strm_get_acked_offset(const ngtcp2_strm *strm); /* - * ngtcp2_strm_ack_data tells |strm| that the data [offset, - * offset+len) is acknowledged by a remote endpoint. + * ngtcp2_strm_ack_data tells |strm| that the data [|offset|, |offset| + * + |len|) is acknowledged by a remote endpoint. */ int ngtcp2_strm_ack_data(ngtcp2_strm *strm, uint64_t offset, uint64_t len); @@ -331,26 +336,26 @@ void ngtcp2_strm_set_app_error_code(ngtcp2_strm *strm, uint64_t app_error_code); * ngtcp2_strm_require_retransmit_reset_stream returns nonzero if * RESET_STREAM frame should be retransmitted. */ -int ngtcp2_strm_require_retransmit_reset_stream(ngtcp2_strm *strm); +int ngtcp2_strm_require_retransmit_reset_stream(const ngtcp2_strm *strm); /* * ngtcp2_strm_require_retransmit_stop_sending returns nonzero if * STOP_SENDING frame should be retransmitted. */ -int ngtcp2_strm_require_retransmit_stop_sending(ngtcp2_strm *strm); +int ngtcp2_strm_require_retransmit_stop_sending(const ngtcp2_strm *strm); /* * ngtcp2_strm_require_retransmit_max_stream_data returns nonzero if * MAX_STREAM_DATA frame should be retransmitted. */ -int ngtcp2_strm_require_retransmit_max_stream_data(ngtcp2_strm *strm, - ngtcp2_max_stream_data *fr); +int ngtcp2_strm_require_retransmit_max_stream_data( + const ngtcp2_strm *strm, const ngtcp2_max_stream_data *fr); /* * ngtcp2_strm_require_retransmit_stream_data_blocked returns nonzero * if STREAM_DATA_BLOCKED frame frame should be retransmitted. */ int ngtcp2_strm_require_retransmit_stream_data_blocked( - ngtcp2_strm *strm, ngtcp2_stream_data_blocked *fr); + const ngtcp2_strm *strm, const ngtcp2_stream_data_blocked *fr); -#endif /* NGTCP2_STRM_H */ +#endif /* !defined(NGTCP2_STRM_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_transport_params.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_transport_params.c new file mode 100644 index 00000000000000..dda59c48858185 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_transport_params.c @@ -0,0 +1,886 @@ +/* + * ngtcp2 + * + * Copyright (c) 2023 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include "ngtcp2_transport_params.h" + +#include +#include + +#include "ngtcp2_conv.h" +#include "ngtcp2_str.h" +#include "ngtcp2_mem.h" +#include "ngtcp2_unreachable.h" + +void ngtcp2_transport_params_default_versioned( + int transport_params_version, ngtcp2_transport_params *params) { + size_t len; + + switch (transport_params_version) { + case NGTCP2_TRANSPORT_PARAMS_VERSION: + len = sizeof(*params); + + break; + default: + ngtcp2_unreachable(); + } + + memset(params, 0, len); + + switch (transport_params_version) { + case NGTCP2_TRANSPORT_PARAMS_VERSION: + params->max_udp_payload_size = NGTCP2_DEFAULT_MAX_RECV_UDP_PAYLOAD_SIZE; + params->active_connection_id_limit = + NGTCP2_DEFAULT_ACTIVE_CONNECTION_ID_LIMIT; + params->ack_delay_exponent = NGTCP2_DEFAULT_ACK_DELAY_EXPONENT; + params->max_ack_delay = NGTCP2_DEFAULT_MAX_ACK_DELAY; + + break; + } +} + +/* + * varint_paramlen returns the length of a single transport parameter + * which has variable integer in its parameter. + */ +static size_t varint_paramlen(ngtcp2_transport_param_id id, uint64_t param) { + size_t valuelen = ngtcp2_put_uvarintlen(param); + return ngtcp2_put_uvarintlen(id) + ngtcp2_put_uvarintlen(valuelen) + valuelen; +} + +/* + * write_varint_param writes parameter |id| of the given |value| in + * varint encoding. It returns p + the number of bytes written. + */ +static uint8_t *write_varint_param(uint8_t *p, ngtcp2_transport_param_id id, + uint64_t value) { + p = ngtcp2_put_uvarint(p, id); + p = ngtcp2_put_uvarint(p, ngtcp2_put_uvarintlen(value)); + return ngtcp2_put_uvarint(p, value); +} + +/* + * zero_paramlen returns the length of a single transport parameter + * which has zero length value in its parameter. + */ +static size_t zero_paramlen(ngtcp2_transport_param_id id) { + return ngtcp2_put_uvarintlen(id) + 1; +} + +/* + * write_zero_param writes parameter |id| that has zero length value. + * It returns p + the number of bytes written. + */ +static uint8_t *write_zero_param(uint8_t *p, ngtcp2_transport_param_id id) { + p = ngtcp2_put_uvarint(p, id); + *p++ = 0; + + return p; +} + +/* + * cid_paramlen returns the length of a single transport parameter + * which has |cid| as value. + */ +static size_t cid_paramlen(ngtcp2_transport_param_id id, + const ngtcp2_cid *cid) { + return ngtcp2_put_uvarintlen(id) + ngtcp2_put_uvarintlen(cid->datalen) + + cid->datalen; +} + +/* + * write_cid_param writes parameter |id| of the given |cid|. It + * returns p + the number of bytes written. + */ +static uint8_t *write_cid_param(uint8_t *p, ngtcp2_transport_param_id id, + const ngtcp2_cid *cid) { + assert(cid->datalen == 0 || cid->datalen >= NGTCP2_MIN_CIDLEN); + assert(cid->datalen <= NGTCP2_MAX_CIDLEN); + + p = ngtcp2_put_uvarint(p, id); + p = ngtcp2_put_uvarint(p, cid->datalen); + if (cid->datalen) { + p = ngtcp2_cpymem(p, cid->data, cid->datalen); + } + return p; +} + +static const uint8_t empty_address[16]; + +ngtcp2_ssize ngtcp2_transport_params_encode_versioned( + uint8_t *dest, size_t destlen, int transport_params_version, + const ngtcp2_transport_params *params) { + uint8_t *p; + size_t len = 0; + /* For some reason, gcc 7.3.0 requires this initialization. */ + size_t preferred_addrlen = 0; + size_t version_infolen = 0; + const ngtcp2_sockaddr_in *sa_in; + const ngtcp2_sockaddr_in6 *sa_in6; + ngtcp2_transport_params paramsbuf; + + params = ngtcp2_transport_params_convert_to_latest( + ¶msbuf, transport_params_version, params); + + if (params->original_dcid_present) { + len += + cid_paramlen(NGTCP2_TRANSPORT_PARAM_ORIGINAL_DESTINATION_CONNECTION_ID, + ¶ms->original_dcid); + } + + if (params->stateless_reset_token_present) { + len += ngtcp2_put_uvarintlen(NGTCP2_TRANSPORT_PARAM_STATELESS_RESET_TOKEN) + + ngtcp2_put_uvarintlen(NGTCP2_STATELESS_RESET_TOKENLEN) + + NGTCP2_STATELESS_RESET_TOKENLEN; + } + + if (params->preferred_addr_present) { + assert(params->preferred_addr.cid.datalen >= NGTCP2_MIN_CIDLEN); + assert(params->preferred_addr.cid.datalen <= NGTCP2_MAX_CIDLEN); + preferred_addrlen = 4 /* ipv4Address */ + 2 /* ipv4Port */ + + 16 /* ipv6Address */ + 2 /* ipv6Port */ + + 1 + params->preferred_addr.cid.datalen /* CID */ + + NGTCP2_STATELESS_RESET_TOKENLEN; + len += ngtcp2_put_uvarintlen(NGTCP2_TRANSPORT_PARAM_PREFERRED_ADDRESS) + + ngtcp2_put_uvarintlen(preferred_addrlen) + preferred_addrlen; + } + if (params->retry_scid_present) { + len += cid_paramlen(NGTCP2_TRANSPORT_PARAM_RETRY_SOURCE_CONNECTION_ID, + ¶ms->retry_scid); + } + + if (params->initial_scid_present) { + len += cid_paramlen(NGTCP2_TRANSPORT_PARAM_INITIAL_SOURCE_CONNECTION_ID, + ¶ms->initial_scid); + } + + if (params->initial_max_stream_data_bidi_local) { + len += + varint_paramlen(NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_BIDI_LOCAL, + params->initial_max_stream_data_bidi_local); + } + if (params->initial_max_stream_data_bidi_remote) { + len += varint_paramlen( + NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_BIDI_REMOTE, + params->initial_max_stream_data_bidi_remote); + } + if (params->initial_max_stream_data_uni) { + len += varint_paramlen(NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_UNI, + params->initial_max_stream_data_uni); + } + if (params->initial_max_data) { + len += varint_paramlen(NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_DATA, + params->initial_max_data); + } + if (params->initial_max_streams_bidi) { + len += varint_paramlen(NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAMS_BIDI, + params->initial_max_streams_bidi); + } + if (params->initial_max_streams_uni) { + len += varint_paramlen(NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAMS_UNI, + params->initial_max_streams_uni); + } + if (params->max_udp_payload_size != + NGTCP2_DEFAULT_MAX_RECV_UDP_PAYLOAD_SIZE) { + len += varint_paramlen(NGTCP2_TRANSPORT_PARAM_MAX_UDP_PAYLOAD_SIZE, + params->max_udp_payload_size); + } + if (params->ack_delay_exponent != NGTCP2_DEFAULT_ACK_DELAY_EXPONENT) { + len += varint_paramlen(NGTCP2_TRANSPORT_PARAM_ACK_DELAY_EXPONENT, + params->ack_delay_exponent); + } + if (params->disable_active_migration) { + len += zero_paramlen(NGTCP2_TRANSPORT_PARAM_DISABLE_ACTIVE_MIGRATION); + } + if (params->max_ack_delay != NGTCP2_DEFAULT_MAX_ACK_DELAY) { + len += varint_paramlen(NGTCP2_TRANSPORT_PARAM_MAX_ACK_DELAY, + params->max_ack_delay / NGTCP2_MILLISECONDS); + } + if (params->max_idle_timeout) { + len += varint_paramlen(NGTCP2_TRANSPORT_PARAM_MAX_IDLE_TIMEOUT, + params->max_idle_timeout / NGTCP2_MILLISECONDS); + } + if (params->active_connection_id_limit && + params->active_connection_id_limit != + NGTCP2_DEFAULT_ACTIVE_CONNECTION_ID_LIMIT) { + len += varint_paramlen(NGTCP2_TRANSPORT_PARAM_ACTIVE_CONNECTION_ID_LIMIT, + params->active_connection_id_limit); + } + if (params->max_datagram_frame_size) { + len += varint_paramlen(NGTCP2_TRANSPORT_PARAM_MAX_DATAGRAM_FRAME_SIZE, + params->max_datagram_frame_size); + } + if (params->grease_quic_bit) { + len += zero_paramlen(NGTCP2_TRANSPORT_PARAM_GREASE_QUIC_BIT); + } + if (params->version_info_present) { + version_infolen = + sizeof(uint32_t) + params->version_info.available_versionslen; + len += ngtcp2_put_uvarintlen(NGTCP2_TRANSPORT_PARAM_VERSION_INFORMATION) + + ngtcp2_put_uvarintlen(version_infolen) + version_infolen; + } + + if (dest == NULL && destlen == 0) { + return (ngtcp2_ssize)len; + } + + if (destlen < len) { + return NGTCP2_ERR_NOBUF; + } + + p = dest; + + if (params->original_dcid_present) { + p = write_cid_param( + p, NGTCP2_TRANSPORT_PARAM_ORIGINAL_DESTINATION_CONNECTION_ID, + ¶ms->original_dcid); + } + + if (params->stateless_reset_token_present) { + p = ngtcp2_put_uvarint(p, NGTCP2_TRANSPORT_PARAM_STATELESS_RESET_TOKEN); + p = ngtcp2_put_uvarint(p, sizeof(params->stateless_reset_token)); + p = ngtcp2_cpymem(p, params->stateless_reset_token, + sizeof(params->stateless_reset_token)); + } + + if (params->preferred_addr_present) { + p = ngtcp2_put_uvarint(p, NGTCP2_TRANSPORT_PARAM_PREFERRED_ADDRESS); + p = ngtcp2_put_uvarint(p, preferred_addrlen); + + if (params->preferred_addr.ipv4_present) { + sa_in = ¶ms->preferred_addr.ipv4; + p = ngtcp2_cpymem(p, &sa_in->sin_addr, sizeof(sa_in->sin_addr)); + p = ngtcp2_put_uint16(p, sa_in->sin_port); + } else { + p = ngtcp2_cpymem(p, empty_address, sizeof(sa_in->sin_addr)); + p = ngtcp2_put_uint16(p, 0); + } + + if (params->preferred_addr.ipv6_present) { + sa_in6 = ¶ms->preferred_addr.ipv6; + p = ngtcp2_cpymem(p, &sa_in6->sin6_addr, sizeof(sa_in6->sin6_addr)); + p = ngtcp2_put_uint16(p, sa_in6->sin6_port); + } else { + p = ngtcp2_cpymem(p, empty_address, sizeof(sa_in6->sin6_addr)); + p = ngtcp2_put_uint16(p, 0); + } + + *p++ = (uint8_t)params->preferred_addr.cid.datalen; + if (params->preferred_addr.cid.datalen) { + p = ngtcp2_cpymem(p, params->preferred_addr.cid.data, + params->preferred_addr.cid.datalen); + } + p = ngtcp2_cpymem(p, params->preferred_addr.stateless_reset_token, + sizeof(params->preferred_addr.stateless_reset_token)); + } + + if (params->retry_scid_present) { + p = write_cid_param(p, NGTCP2_TRANSPORT_PARAM_RETRY_SOURCE_CONNECTION_ID, + ¶ms->retry_scid); + } + + if (params->initial_scid_present) { + p = write_cid_param(p, NGTCP2_TRANSPORT_PARAM_INITIAL_SOURCE_CONNECTION_ID, + ¶ms->initial_scid); + } + + if (params->initial_max_stream_data_bidi_local) { + p = write_varint_param( + p, NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_BIDI_LOCAL, + params->initial_max_stream_data_bidi_local); + } + + if (params->initial_max_stream_data_bidi_remote) { + p = write_varint_param( + p, NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_BIDI_REMOTE, + params->initial_max_stream_data_bidi_remote); + } + + if (params->initial_max_stream_data_uni) { + p = + write_varint_param(p, NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_UNI, + params->initial_max_stream_data_uni); + } + + if (params->initial_max_data) { + p = write_varint_param(p, NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_DATA, + params->initial_max_data); + } + + if (params->initial_max_streams_bidi) { + p = write_varint_param(p, NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAMS_BIDI, + params->initial_max_streams_bidi); + } + + if (params->initial_max_streams_uni) { + p = write_varint_param(p, NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAMS_UNI, + params->initial_max_streams_uni); + } + + if (params->max_udp_payload_size != + NGTCP2_DEFAULT_MAX_RECV_UDP_PAYLOAD_SIZE) { + p = write_varint_param(p, NGTCP2_TRANSPORT_PARAM_MAX_UDP_PAYLOAD_SIZE, + params->max_udp_payload_size); + } + + if (params->ack_delay_exponent != NGTCP2_DEFAULT_ACK_DELAY_EXPONENT) { + p = write_varint_param(p, NGTCP2_TRANSPORT_PARAM_ACK_DELAY_EXPONENT, + params->ack_delay_exponent); + } + + if (params->disable_active_migration) { + p = write_zero_param(p, NGTCP2_TRANSPORT_PARAM_DISABLE_ACTIVE_MIGRATION); + } + + if (params->max_ack_delay != NGTCP2_DEFAULT_MAX_ACK_DELAY) { + p = write_varint_param(p, NGTCP2_TRANSPORT_PARAM_MAX_ACK_DELAY, + params->max_ack_delay / NGTCP2_MILLISECONDS); + } + + if (params->max_idle_timeout) { + p = write_varint_param(p, NGTCP2_TRANSPORT_PARAM_MAX_IDLE_TIMEOUT, + params->max_idle_timeout / NGTCP2_MILLISECONDS); + } + + if (params->active_connection_id_limit && + params->active_connection_id_limit != + NGTCP2_DEFAULT_ACTIVE_CONNECTION_ID_LIMIT) { + p = write_varint_param(p, NGTCP2_TRANSPORT_PARAM_ACTIVE_CONNECTION_ID_LIMIT, + params->active_connection_id_limit); + } + + if (params->max_datagram_frame_size) { + p = write_varint_param(p, NGTCP2_TRANSPORT_PARAM_MAX_DATAGRAM_FRAME_SIZE, + params->max_datagram_frame_size); + } + + if (params->grease_quic_bit) { + p = write_zero_param(p, NGTCP2_TRANSPORT_PARAM_GREASE_QUIC_BIT); + } + + if (params->version_info_present) { + p = ngtcp2_put_uvarint(p, NGTCP2_TRANSPORT_PARAM_VERSION_INFORMATION); + p = ngtcp2_put_uvarint(p, version_infolen); + p = ngtcp2_put_uint32be(p, params->version_info.chosen_version); + if (params->version_info.available_versionslen) { + p = ngtcp2_cpymem(p, params->version_info.available_versions, + params->version_info.available_versionslen); + } + } + + assert((size_t)(p - dest) == len); + + return (ngtcp2_ssize)len; +} + +/* + * decode_varint decodes a single varint from the buffer pointed by + * |*pp| of length |end - *pp|. If it decodes an integer + * successfully, it stores the integer in |*pdest|, increment |*pp| by + * the number of bytes read from |*pp|, and returns 0. Otherwise it + * returns -1. + */ +static int decode_varint(uint64_t *pdest, const uint8_t **pp, + const uint8_t *end) { + const uint8_t *p = *pp; + size_t len; + + if (p == end) { + return -1; + } + + len = ngtcp2_get_uvarintlen(p); + if ((uint64_t)(end - p) < len) { + return -1; + } + + *pp = ngtcp2_get_uvarint(pdest, p); + + return 0; +} + +/* + * decode_varint_param decodes length prefixed value from the buffer + * pointed by |*pp| of length |end - *pp|. The length and value are + * encoded in varint form. If it decodes a value successfully, it + * stores the value in |*pdest|, increment |*pp| by the number of + * bytes read from |*pp|, and returns 0. Otherwise it returns -1. + */ +static int decode_varint_param(uint64_t *pdest, const uint8_t **pp, + const uint8_t *end) { + const uint8_t *p = *pp; + uint64_t valuelen; + + if (decode_varint(&valuelen, &p, end) != 0) { + return -1; + } + + if (p == end) { + return -1; + } + + if ((uint64_t)(end - p) < valuelen) { + return -1; + } + + if (ngtcp2_get_uvarintlen(p) != valuelen) { + return -1; + } + + *pp = ngtcp2_get_uvarint(pdest, p); + + return 0; +} + +/* + * decode_zero_param decodes zero length value from the buffer pointed + * by |*pp| of length |end - *pp|. The length is encoded in varint + * form. If it decodes zero length value successfully, it increments + * |*pp| by 1, and returns 0. Otherwise it returns -1. + */ +static int decode_zero_param(const uint8_t **pp, const uint8_t *end) { + if (*pp == end || **pp != 0) { + return -1; + } + + ++*pp; + + return 0; +} + +/* + * decode_cid_param decodes length prefixed ngtcp2_cid from the buffer + * pointed by |*pp| of length |end - *pp|. The length is encoded in + * varint form. If it decodes a value successfully, it stores the + * value in |*pdest|, increment |*pp| by the number of read from + * |*pp|, and returns the number of bytes read. Otherwise it returns + * the one of the negative error code: + * + * NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM + * Could not decode Connection ID. + */ +static int decode_cid_param(ngtcp2_cid *pdest, const uint8_t **pp, + const uint8_t *end) { + const uint8_t *p = *pp; + uint64_t valuelen; + + if (decode_varint(&valuelen, &p, end) != 0) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + + if ((valuelen != 0 && valuelen < NGTCP2_MIN_CIDLEN) || + valuelen > NGTCP2_MAX_CIDLEN || (size_t)(end - p) < valuelen) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + + ngtcp2_cid_init(pdest, p, (size_t)valuelen); + + p += valuelen; + + *pp = p; + + return 0; +} + +int ngtcp2_transport_params_decode_versioned(int transport_params_version, + ngtcp2_transport_params *dest, + const uint8_t *data, + size_t datalen) { + const uint8_t *p, *end, *lend; + size_t len; + uint64_t param_type; + uint64_t valuelen; + int rv; + ngtcp2_sockaddr_in *sa_in; + ngtcp2_sockaddr_in6 *sa_in6; + uint32_t version; + ngtcp2_transport_params *params, paramsbuf; + + if (transport_params_version == NGTCP2_TRANSPORT_PARAMS_VERSION) { + params = dest; + } else { + params = ¶msbuf; + } + + /* Set default values */ + memset(params, 0, sizeof(*params)); + params->max_udp_payload_size = NGTCP2_DEFAULT_MAX_RECV_UDP_PAYLOAD_SIZE; + params->ack_delay_exponent = NGTCP2_DEFAULT_ACK_DELAY_EXPONENT; + params->max_ack_delay = NGTCP2_DEFAULT_MAX_ACK_DELAY; + params->active_connection_id_limit = + NGTCP2_DEFAULT_ACTIVE_CONNECTION_ID_LIMIT; + + p = data; + end = data + datalen; + + for (; (size_t)(end - p) >= 2;) { + if (decode_varint(¶m_type, &p, end) != 0) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + + switch (param_type) { + case NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_BIDI_LOCAL: + if (decode_varint_param(¶ms->initial_max_stream_data_bidi_local, &p, + end) != 0) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + break; + case NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_BIDI_REMOTE: + if (decode_varint_param(¶ms->initial_max_stream_data_bidi_remote, &p, + end) != 0) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + break; + case NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_UNI: + if (decode_varint_param(¶ms->initial_max_stream_data_uni, &p, end) != + 0) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + break; + case NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_DATA: + if (decode_varint_param(¶ms->initial_max_data, &p, end) != 0) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + break; + case NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAMS_BIDI: + if (decode_varint_param(¶ms->initial_max_streams_bidi, &p, end) != + 0) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + if (params->initial_max_streams_bidi > NGTCP2_MAX_STREAMS) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + break; + case NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAMS_UNI: + if (decode_varint_param(¶ms->initial_max_streams_uni, &p, end) != 0) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + if (params->initial_max_streams_uni > NGTCP2_MAX_STREAMS) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + break; + case NGTCP2_TRANSPORT_PARAM_MAX_IDLE_TIMEOUT: + if (decode_varint_param(¶ms->max_idle_timeout, &p, end) != 0) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + params->max_idle_timeout *= NGTCP2_MILLISECONDS; + break; + case NGTCP2_TRANSPORT_PARAM_MAX_UDP_PAYLOAD_SIZE: + if (decode_varint_param(¶ms->max_udp_payload_size, &p, end) != 0) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + break; + case NGTCP2_TRANSPORT_PARAM_STATELESS_RESET_TOKEN: + if (decode_varint(&valuelen, &p, end) != 0) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + if ((size_t)valuelen != sizeof(params->stateless_reset_token)) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + if ((size_t)(end - p) < sizeof(params->stateless_reset_token)) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + + p = ngtcp2_get_bytes(params->stateless_reset_token, p, + sizeof(params->stateless_reset_token)); + params->stateless_reset_token_present = 1; + + break; + case NGTCP2_TRANSPORT_PARAM_ACK_DELAY_EXPONENT: + if (decode_varint_param(¶ms->ack_delay_exponent, &p, end) != 0) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + if (params->ack_delay_exponent > 20) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + break; + case NGTCP2_TRANSPORT_PARAM_PREFERRED_ADDRESS: + if (decode_varint(&valuelen, &p, end) != 0) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + if ((size_t)(end - p) < valuelen) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + len = 4 /* ipv4Address */ + 2 /* ipv4Port */ + 16 /* ipv6Address */ + + 2 /* ipv6Port */ + + 1 /* cid length */ + NGTCP2_STATELESS_RESET_TOKENLEN; + if (valuelen < len) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + + sa_in = ¶ms->preferred_addr.ipv4; + + p = ngtcp2_get_bytes(&sa_in->sin_addr, p, sizeof(sa_in->sin_addr)); + p = ngtcp2_get_uint16(&sa_in->sin_port, p); + + if (sa_in->sin_port || memcmp(empty_address, &sa_in->sin_addr, + sizeof(sa_in->sin_addr)) != 0) { + sa_in->sin_family = NGTCP2_AF_INET; + params->preferred_addr.ipv4_present = 1; + } + + sa_in6 = ¶ms->preferred_addr.ipv6; + + p = ngtcp2_get_bytes(&sa_in6->sin6_addr, p, sizeof(sa_in6->sin6_addr)); + p = ngtcp2_get_uint16(&sa_in6->sin6_port, p); + + if (sa_in6->sin6_port || memcmp(empty_address, &sa_in6->sin6_addr, + sizeof(sa_in6->sin6_addr)) != 0) { + sa_in6->sin6_family = NGTCP2_AF_INET6; + params->preferred_addr.ipv6_present = 1; + } + + /* cid */ + params->preferred_addr.cid.datalen = *p++; + len += params->preferred_addr.cid.datalen; + if (valuelen != len || + params->preferred_addr.cid.datalen > NGTCP2_MAX_CIDLEN || + params->preferred_addr.cid.datalen < NGTCP2_MIN_CIDLEN) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + if (params->preferred_addr.cid.datalen) { + p = ngtcp2_get_bytes(params->preferred_addr.cid.data, p, + params->preferred_addr.cid.datalen); + } + + /* stateless reset token */ + p = + ngtcp2_get_bytes(params->preferred_addr.stateless_reset_token, p, + sizeof(params->preferred_addr.stateless_reset_token)); + params->preferred_addr_present = 1; + break; + case NGTCP2_TRANSPORT_PARAM_DISABLE_ACTIVE_MIGRATION: + if (decode_zero_param(&p, end) != 0) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + params->disable_active_migration = 1; + break; + case NGTCP2_TRANSPORT_PARAM_ORIGINAL_DESTINATION_CONNECTION_ID: + rv = decode_cid_param(¶ms->original_dcid, &p, end); + if (rv != 0) { + return rv; + } + params->original_dcid_present = 1; + break; + case NGTCP2_TRANSPORT_PARAM_RETRY_SOURCE_CONNECTION_ID: + rv = decode_cid_param(¶ms->retry_scid, &p, end); + if (rv != 0) { + return rv; + } + params->retry_scid_present = 1; + break; + case NGTCP2_TRANSPORT_PARAM_INITIAL_SOURCE_CONNECTION_ID: + rv = decode_cid_param(¶ms->initial_scid, &p, end); + if (rv != 0) { + return rv; + } + params->initial_scid_present = 1; + break; + case NGTCP2_TRANSPORT_PARAM_MAX_ACK_DELAY: + if (decode_varint_param(¶ms->max_ack_delay, &p, end) != 0) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + if (params->max_ack_delay >= 16384) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + params->max_ack_delay *= NGTCP2_MILLISECONDS; + break; + case NGTCP2_TRANSPORT_PARAM_ACTIVE_CONNECTION_ID_LIMIT: + if (decode_varint_param(¶ms->active_connection_id_limit, &p, end) != + 0) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + break; + case NGTCP2_TRANSPORT_PARAM_MAX_DATAGRAM_FRAME_SIZE: + if (decode_varint_param(¶ms->max_datagram_frame_size, &p, end) != 0) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + break; + case NGTCP2_TRANSPORT_PARAM_GREASE_QUIC_BIT: + if (decode_zero_param(&p, end) != 0) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + params->grease_quic_bit = 1; + break; + case NGTCP2_TRANSPORT_PARAM_VERSION_INFORMATION: + if (decode_varint(&valuelen, &p, end) != 0) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + if ((size_t)(end - p) < valuelen) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + if (valuelen < sizeof(uint32_t) || (valuelen & 0x3)) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + p = ngtcp2_get_uint32be(¶ms->version_info.chosen_version, p); + if (params->version_info.chosen_version == 0) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + if (valuelen > sizeof(uint32_t)) { + params->version_info.available_versions = (uint8_t *)p; + params->version_info.available_versionslen = + (size_t)valuelen - sizeof(uint32_t); + + for (lend = p + (valuelen - sizeof(uint32_t)); p != lend;) { + p = ngtcp2_get_uint32be(&version, p); + if (version == 0) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + } + } + params->version_info_present = 1; + break; + default: + /* Ignore unknown parameter */ + if (decode_varint(&valuelen, &p, end) != 0) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + if ((size_t)(end - p) < valuelen) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + p += valuelen; + break; + } + } + + if (end - p != 0) { + return NGTCP2_ERR_MALFORMED_TRANSPORT_PARAM; + } + + if (transport_params_version != NGTCP2_TRANSPORT_PARAMS_VERSION) { + ngtcp2_transport_params_convert_to_old(transport_params_version, dest, + params); + } + + return 0; +} + +static int transport_params_copy_new(ngtcp2_transport_params **pdest, + const ngtcp2_transport_params *src, + const ngtcp2_mem *mem) { + size_t len = sizeof(**pdest); + ngtcp2_transport_params *dest; + uint8_t *p; + + if (src->version_info_present) { + len += src->version_info.available_versionslen; + } + + dest = ngtcp2_mem_malloc(mem, len); + if (dest == NULL) { + return NGTCP2_ERR_NOMEM; + } + + *dest = *src; + + if (src->version_info_present && src->version_info.available_versionslen) { + p = (uint8_t *)dest + sizeof(*dest); + memcpy(p, src->version_info.available_versions, + src->version_info.available_versionslen); + dest->version_info.available_versions = p; + } + + *pdest = dest; + + return 0; +} + +int ngtcp2_transport_params_decode_new(ngtcp2_transport_params **pparams, + const uint8_t *data, size_t datalen, + const ngtcp2_mem *mem) { + int rv; + ngtcp2_transport_params params; + + rv = ngtcp2_transport_params_decode(¶ms, data, datalen); + if (rv < 0) { + return rv; + } + + if (mem == NULL) { + mem = ngtcp2_mem_default(); + } + + return transport_params_copy_new(pparams, ¶ms, mem); +} + +void ngtcp2_transport_params_del(ngtcp2_transport_params *params, + const ngtcp2_mem *mem) { + if (params == NULL) { + return; + } + + if (mem == NULL) { + mem = ngtcp2_mem_default(); + } + + ngtcp2_mem_free(mem, params); +} + +int ngtcp2_transport_params_copy_new(ngtcp2_transport_params **pdest, + const ngtcp2_transport_params *src, + const ngtcp2_mem *mem) { + if (src == NULL) { + *pdest = NULL; + return 0; + } + + return transport_params_copy_new(pdest, src, mem); +} + +static void transport_params_copy(ngtcp2_transport_params *dest, + const ngtcp2_transport_params *src, + int transport_params_version) { + assert(transport_params_version != NGTCP2_TRANSPORT_PARAMS_VERSION); + + switch (transport_params_version) { + case NGTCP2_TRANSPORT_PARAMS_V1: + memcpy(dest, src, + offsetof(ngtcp2_transport_params, version_info_present) + + sizeof(src->version_info_present)); + + break; + } +} + +const ngtcp2_transport_params * +ngtcp2_transport_params_convert_to_latest(ngtcp2_transport_params *dest, + int transport_params_version, + const ngtcp2_transport_params *src) { + if (transport_params_version == NGTCP2_TRANSPORT_PARAMS_VERSION) { + return src; + } + + ngtcp2_transport_params_default(dest); + + transport_params_copy(dest, src, transport_params_version); + + return dest; +} + +void ngtcp2_transport_params_convert_to_old( + int transport_params_version, ngtcp2_transport_params *dest, + const ngtcp2_transport_params *src) { + assert(transport_params_version != NGTCP2_TRANSPORT_PARAMS_VERSION); + + transport_params_copy(dest, src, transport_params_version); +} diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_transport_params.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_transport_params.h new file mode 100644 index 00000000000000..c077f06a9dd717 --- /dev/null +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_transport_params.h @@ -0,0 +1,118 @@ +/* + * ngtcp2 + * + * Copyright (c) 2023 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef NGTCP2_TRANSPORT_PARAMS_H +#define NGTCP2_TRANSPORT_PARAMS_H + +#ifdef HAVE_CONFIG_H +# include +#endif /* defined(HAVE_CONFIG_H) */ + +#include + +/* ngtcp2_transport_param_id is the registry of QUIC transport + parameter ID. */ +typedef uint64_t ngtcp2_transport_param_id; + +#define NGTCP2_TRANSPORT_PARAM_ORIGINAL_DESTINATION_CONNECTION_ID 0x00 +#define NGTCP2_TRANSPORT_PARAM_MAX_IDLE_TIMEOUT 0x01 +#define NGTCP2_TRANSPORT_PARAM_STATELESS_RESET_TOKEN 0x02 +#define NGTCP2_TRANSPORT_PARAM_MAX_UDP_PAYLOAD_SIZE 0x03 +#define NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_DATA 0x04 +#define NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_BIDI_LOCAL 0x05 +#define NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_BIDI_REMOTE 0x06 +#define NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAM_DATA_UNI 0x07 +#define NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAMS_BIDI 0x08 +#define NGTCP2_TRANSPORT_PARAM_INITIAL_MAX_STREAMS_UNI 0x09 +#define NGTCP2_TRANSPORT_PARAM_ACK_DELAY_EXPONENT 0x0a +#define NGTCP2_TRANSPORT_PARAM_MAX_ACK_DELAY 0x0b +#define NGTCP2_TRANSPORT_PARAM_DISABLE_ACTIVE_MIGRATION 0x0c +#define NGTCP2_TRANSPORT_PARAM_PREFERRED_ADDRESS 0x0d +#define NGTCP2_TRANSPORT_PARAM_ACTIVE_CONNECTION_ID_LIMIT 0x0e +#define NGTCP2_TRANSPORT_PARAM_INITIAL_SOURCE_CONNECTION_ID 0x0f +#define NGTCP2_TRANSPORT_PARAM_RETRY_SOURCE_CONNECTION_ID 0x10 +/* https://datatracker.ietf.org/doc/html/rfc9221 */ +#define NGTCP2_TRANSPORT_PARAM_MAX_DATAGRAM_FRAME_SIZE 0x20 +#define NGTCP2_TRANSPORT_PARAM_GREASE_QUIC_BIT 0x2ab2 +/* https://datatracker.ietf.org/doc/html/rfc9368 */ +#define NGTCP2_TRANSPORT_PARAM_VERSION_INFORMATION 0x11 + +/* NGTCP2_MAX_STREAMS is the maximum number of streams. */ +#define NGTCP2_MAX_STREAMS (1LL << 60) + +/* + * ngtcp2_transport_params_copy_new makes a copy of |src|, and assigns + * it to |*pdest|. If |src| is NULL, NULL is assigned to |*pdest|. + * + * Caller is responsible to call ngtcp2_transport_params_del to free + * the memory assigned to |*pdest|. + * + * This function returns 0 if it succeeds, or one of the following + * negative error codes: + * + * NGTCP2_ERR_NOMEM + * Out of memory. + */ +int ngtcp2_transport_params_copy_new(ngtcp2_transport_params **pdest, + const ngtcp2_transport_params *src, + const ngtcp2_mem *mem); + +/* + * ngtcp2_transport_params_convert_to_latest converts |src| of version + * |transport_params_version| to the latest version + * NGTCP2_TRANSPORT_PARAMS_VERSION. + * + * |dest| must point to the latest version. |src| may be the older + * version, and if so, it may have fewer fields. Accessing those + * fields causes undefined behavior. + * + * If |transport_params_version| == NGTCP2_TRANSPORT_PARAMS_VERSION, + * no conversion is made, and |src| is returned. Otherwise, first + * |dest| is initialized via ngtcp2_transport_params_default, and then + * all valid fields in |src| are copied into |dest|. Finally, |dest| + * is returned. + */ +const ngtcp2_transport_params * +ngtcp2_transport_params_convert_to_latest(ngtcp2_transport_params *dest, + int transport_params_version, + const ngtcp2_transport_params *src); + +/* + * ngtcp2_transport_params_convert_to_old converts |src| of the latest + * version to |dest| of version |transport_params_version|. + * + * |transport_params_version| must not be the latest version + * NGTCP2_TRANSPORT_PARAMS_VERSION. + * + * |dest| points to the older version, and it may have fewer fields. + * Accessing those fields causes undefined behavior. + * + * This function copies all valid fields in version + * |transport_params_version| from |src| to |dest|. + */ +void ngtcp2_transport_params_convert_to_old(int transport_params_version, + ngtcp2_transport_params *dest, + const ngtcp2_transport_params *src); + +#endif /* !defined(NGTCP2_TRANSPORT_PARAMS_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_tstamp.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_tstamp.h index 9a210a320dc1ca..2b1bb51d87edc6 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_tstamp.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_tstamp.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -65,4 +65,4 @@ static inline int ngtcp2_tstamp_not_elapsed(ngtcp2_tstamp base, return base != UINT64_MAX && (base >= UINT64_MAX - d || base + d > ts); } -#endif /* NGTCP2_TSTAMP_H */ +#endif /* !defined(NGTCP2_TSTAMP_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_unreachable.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_unreachable.c index 7c7d9ae78e914d..5ab1db72cc5384 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_unreachable.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_unreachable.c @@ -26,20 +26,22 @@ #include #include +#include #ifdef HAVE_UNISTD_H +# define NGTCP2_UNREACHABLE_LOG # include -#endif /* HAVE_UNISTD_H */ -#include -#ifdef WIN32 +#elif defined(WIN32) +# define NGTCP2_UNREACHABLE_LOG # include -#endif /* WIN32 */ +#endif /* defined(WIN32) */ void ngtcp2_unreachable_fail(const char *file, int line, const char *func) { +#ifdef NGTCP2_UNREACHABLE_LOG char *buf; size_t buflen; int rv; -#define NGTCP2_UNREACHABLE_TEMPLATE "%s:%d %s: Unreachable.\n" +# define NGTCP2_UNREACHABLE_TEMPLATE "%s:%d %s: Unreachable.\n" rv = snprintf(NULL, 0, NGTCP2_UNREACHABLE_TEMPLATE, file, line, func); if (rv < 0) { @@ -58,14 +60,15 @@ void ngtcp2_unreachable_fail(const char *file, int line, const char *func) { abort(); } -#ifndef WIN32 +# ifndef WIN32 while (write(STDERR_FILENO, buf, (size_t)rv) == -1 && errno == EINTR) ; -#else /* WIN32 */ +# else /* defined(WIN32) */ _write(_fileno(stderr), buf, (unsigned int)rv); -#endif /* WIN32 */ +# endif /* defined(WIN32) */ free(buf); +#endif /* defined(NGTCP2_UNREACHABLE_LOG) */ abort(); } diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_unreachable.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_unreachable.h index a5276fd505463f..ca7123865279f9 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_unreachable.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_unreachable.h @@ -27,26 +27,26 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include #ifdef __FILE_NAME__ # define NGTCP2_FILE_NAME __FILE_NAME__ -#else /* !__FILE_NAME__ */ +#else /* !defined(__FILE_NAME__) */ # define NGTCP2_FILE_NAME "(file)" -#endif /* !__FILE_NAME__ */ +#endif /* !defined(__FILE_NAME__) */ #define ngtcp2_unreachable() \ ngtcp2_unreachable_fail(NGTCP2_FILE_NAME, __LINE__, __func__) #ifdef _MSC_VER __declspec(noreturn) -#endif /* _MSC_VER */ +#endif /* defined(_MSC_VER) */ void ngtcp2_unreachable_fail(const char *file, int line, const char *func) #ifndef _MSC_VER __attribute__((noreturn)) -#endif /* !_MSC_VER */ +#endif /* !defined(_MSC_VER) */ ; -#endif /* NGTCP2_UNREACHABLE_H */ +#endif /* !defined(NGTCP2_UNREACHABLE_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_vec.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_vec.c index dbc7b668042695..0b9c92d47d7d88 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_vec.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_vec.c @@ -50,6 +50,7 @@ int ngtcp2_vec_new(ngtcp2_vec **pvec, const uint8_t *data, size_t datalen, p = (uint8_t *)(*pvec) + sizeof(ngtcp2_vec); (*pvec)->base = p; (*pvec)->len = datalen; + if (datalen) { /* p = */ ngtcp2_cpymem(p, data, datalen); } @@ -89,8 +90,8 @@ int64_t ngtcp2_vec_len_varint(const ngtcp2_vec *vec, size_t n) { return (int64_t)res; } -ngtcp2_ssize ngtcp2_vec_split(ngtcp2_vec *src, size_t *psrccnt, ngtcp2_vec *dst, - size_t *pdstcnt, size_t left, size_t maxcnt) { +ngtcp2_ssize ngtcp2_vec_split(ngtcp2_vec *dst, size_t *pdstcnt, ngtcp2_vec *src, + size_t *psrccnt, size_t left, size_t maxcnt) { size_t i; size_t srccnt = *psrccnt; size_t nmove; @@ -203,6 +204,7 @@ size_t ngtcp2_vec_merge(ngtcp2_vec *dst, size_t *pdstcnt, ngtcp2_vec *src, } else { dst[(*pdstcnt)++] = *b; } + left -= b->len; } @@ -222,11 +224,14 @@ size_t ngtcp2_vec_copy_at_most(ngtcp2_vec *dst, size_t dstcnt, ++i; continue; } + dst[j] = src[i]; + if (dst[j].len > left) { dst[j].len = left; return j + 1; } + left -= dst[j].len; ++i; ++j; diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_vec.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_vec.h index a39c4392fd2627..f7611efcb7d6ce 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_vec.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_vec.h @@ -27,7 +27,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -74,19 +74,21 @@ uint64_t ngtcp2_vec_len(const ngtcp2_vec *vec, size_t n); int64_t ngtcp2_vec_len_varint(const ngtcp2_vec *vec, size_t n); /* - * ngtcp2_vec_split splits |src| to |dst| so that the sum of the - * length in |src| does not exceed |left| bytes. The |maxcnt| is the - * maximum number of elements which |dst| array can contain. The - * caller must set |*psrccnt| to the number of elements of |src|. - * Similarly, the caller must set |*pdstcnt| to the number of elements - * of |dst|. The split does not necessarily occur at the boundary of - * ngtcp2_vec object. After split has done, this function updates - * |*psrccnt| and |*pdstcnt|. This function returns the number of - * bytes moved from |src| to |dst|. If split cannot be made because - * doing so exceeds |maxcnt|, this function returns -1. + * ngtcp2_vec_split splits |src| at the data position where + * ngtcp2_vec_len(|src|) does not exceed |left| bytes. The removed + * vectors are moved to |dst|. The existing elements in |dst| are + * moved forward to make up a space. The |maxcnt| is the maximum + * number of elements which |dst| array can contain. The caller must + * set |*psrccnt| to the number of elements of |src|. Similarly, the + * caller must set |*pdstcnt| to the number of elements of |dst|. The + * split does not necessarily occur at the boundary of ngtcp2_vec + * object. After split has done, this function updates |*psrccnt| and + * |*pdstcnt|. This function returns the number of bytes moved from + * |src| to |dst|. If split cannot be made because doing so exceeds + * |maxcnt|, this function returns -1. */ -ngtcp2_ssize ngtcp2_vec_split(ngtcp2_vec *src, size_t *psrccnt, ngtcp2_vec *dst, - size_t *pdstcnt, size_t left, size_t maxcnt); +ngtcp2_ssize ngtcp2_vec_split(ngtcp2_vec *dst, size_t *pdstcnt, ngtcp2_vec *src, + size_t *psrccnt, size_t left, size_t maxcnt); /* * ngtcp2_vec_merge merges |src| into |dst| by moving at most |left| @@ -117,4 +119,4 @@ size_t ngtcp2_vec_copy_at_most(ngtcp2_vec *dst, size_t dstcnt, */ void ngtcp2_vec_copy(ngtcp2_vec *dst, const ngtcp2_vec *src, size_t cnt); -#endif /* NGTCP2_VEC_H */ +#endif /* !defined(NGTCP2_VEC_H) */ diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_version.c b/deps/ngtcp2/ngtcp2/lib/ngtcp2_version.c index b31162c3ebe0d7..d2557e9ef8a580 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_version.c +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_version.c @@ -24,7 +24,7 @@ */ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include diff --git a/deps/ngtcp2/ngtcp2/lib/ngtcp2_window_filter.h b/deps/ngtcp2/ngtcp2/lib/ngtcp2_window_filter.h index 50415f10b8c37b..c90a9fdb9078da 100644 --- a/deps/ngtcp2/ngtcp2/lib/ngtcp2_window_filter.h +++ b/deps/ngtcp2/ngtcp2/lib/ngtcp2_window_filter.h @@ -37,7 +37,7 @@ #ifdef HAVE_CONFIG_H # include -#endif /* HAVE_CONFIG_H */ +#endif /* defined(HAVE_CONFIG_H) */ #include @@ -62,4 +62,4 @@ void ngtcp2_window_filter_reset(ngtcp2_window_filter *wf, uint64_t new_sample, uint64_t ngtcp2_window_filter_get_best(ngtcp2_window_filter *wf); -#endif /* NGTCP2_WINDOW_FILTER_H */ +#endif /* !defined(NGTCP2_WINDOW_FILTER_H) */ diff --git a/deps/ngtcp2/unofficial.gni b/deps/ngtcp2/unofficial.gni index 26b8070c5a9c7f..cf9ba5363907e0 100644 --- a/deps/ngtcp2/unofficial.gni +++ b/deps/ngtcp2/unofficial.gni @@ -68,8 +68,7 @@ template("ngtcp2_gn_build") { cflags_c = [ "-Wno-extra-semi", "-Wno-implicit-fallthrough", - # Remove after https://github.com/ngtcp2/ngtcp2/issues/1050 is fixed. - "-Wno-sometimes-uninitialized", + "-Wno-unused-function", ] } } diff --git a/deps/npm/docs/content/commands/npm-ls.md b/deps/npm/docs/content/commands/npm-ls.md index 3abedf9cd8e4e6..69bc86f85f3508 100644 --- a/deps/npm/docs/content/commands/npm-ls.md +++ b/deps/npm/docs/content/commands/npm-ls.md @@ -27,7 +27,7 @@ packages will *also* show the paths to the specified packages. For example, running `npm ls promzard` in npm's source tree will show: ```bash -npm@10.9.0 /path/to/npm +npm@10.9.2 /path/to/npm └─┬ init-package-json@0.0.4 └── promzard@0.1.5 ``` diff --git a/deps/npm/docs/content/commands/npm.md b/deps/npm/docs/content/commands/npm.md index d92892ec544eb9..029b9fa7631544 100644 --- a/deps/npm/docs/content/commands/npm.md +++ b/deps/npm/docs/content/commands/npm.md @@ -14,7 +14,7 @@ Note: This command is unaware of workspaces. ### Version -10.9.0 +10.9.2 ### Description diff --git a/deps/npm/docs/output/commands/npm-access.html b/deps/npm/docs/output/commands/npm-access.html index 0a839663fcb016..9ce3c00e3525d8 100644 --- a/deps/npm/docs/output/commands/npm-access.html +++ b/deps/npm/docs/output/commands/npm-access.html @@ -141,9 +141,9 @@
-

+

npm-access - @10.9.0 + @10.9.2

Set access level on published packages
diff --git a/deps/npm/docs/output/commands/npm-adduser.html b/deps/npm/docs/output/commands/npm-adduser.html index 2ac615ad13978d..5f6627229d2c8b 100644 --- a/deps/npm/docs/output/commands/npm-adduser.html +++ b/deps/npm/docs/output/commands/npm-adduser.html @@ -141,9 +141,9 @@
-

+

npm-adduser - @10.9.0 + @10.9.2

Add a registry user account
diff --git a/deps/npm/docs/output/commands/npm-audit.html b/deps/npm/docs/output/commands/npm-audit.html index d7374ccfa66089..a8934d172e3602 100644 --- a/deps/npm/docs/output/commands/npm-audit.html +++ b/deps/npm/docs/output/commands/npm-audit.html @@ -141,9 +141,9 @@
-

+

npm-audit - @10.9.0 + @10.9.2

Run a security audit
diff --git a/deps/npm/docs/output/commands/npm-bugs.html b/deps/npm/docs/output/commands/npm-bugs.html index 9186bc100ae8f6..3ec74a05673259 100644 --- a/deps/npm/docs/output/commands/npm-bugs.html +++ b/deps/npm/docs/output/commands/npm-bugs.html @@ -141,9 +141,9 @@
-

+

npm-bugs - @10.9.0 + @10.9.2

Report bugs for a package in a web browser
diff --git a/deps/npm/docs/output/commands/npm-cache.html b/deps/npm/docs/output/commands/npm-cache.html index 55cec217dbdfb7..0a4fd00a276a47 100644 --- a/deps/npm/docs/output/commands/npm-cache.html +++ b/deps/npm/docs/output/commands/npm-cache.html @@ -141,9 +141,9 @@
-

+

npm-cache - @10.9.0 + @10.9.2

Manipulates packages cache
diff --git a/deps/npm/docs/output/commands/npm-ci.html b/deps/npm/docs/output/commands/npm-ci.html index efe858777565a9..3af67dc55c81db 100644 --- a/deps/npm/docs/output/commands/npm-ci.html +++ b/deps/npm/docs/output/commands/npm-ci.html @@ -141,9 +141,9 @@
-

+

npm-ci - @10.9.0 + @10.9.2

Clean install a project
diff --git a/deps/npm/docs/output/commands/npm-completion.html b/deps/npm/docs/output/commands/npm-completion.html index 4a91a94498f33b..3f8b509e4ec8d6 100644 --- a/deps/npm/docs/output/commands/npm-completion.html +++ b/deps/npm/docs/output/commands/npm-completion.html @@ -141,9 +141,9 @@
-

+

npm-completion - @10.9.0 + @10.9.2

Tab Completion for npm
diff --git a/deps/npm/docs/output/commands/npm-config.html b/deps/npm/docs/output/commands/npm-config.html index d18998fea8471d..c9b9a2c7550bcc 100644 --- a/deps/npm/docs/output/commands/npm-config.html +++ b/deps/npm/docs/output/commands/npm-config.html @@ -141,9 +141,9 @@
-

+

npm-config - @10.9.0 + @10.9.2

Manage the npm configuration files
diff --git a/deps/npm/docs/output/commands/npm-dedupe.html b/deps/npm/docs/output/commands/npm-dedupe.html index 194ea085383df3..0aa8bf5a5bde77 100644 --- a/deps/npm/docs/output/commands/npm-dedupe.html +++ b/deps/npm/docs/output/commands/npm-dedupe.html @@ -141,9 +141,9 @@
-

+

npm-dedupe - @10.9.0 + @10.9.2

Reduce duplication in the package tree
diff --git a/deps/npm/docs/output/commands/npm-deprecate.html b/deps/npm/docs/output/commands/npm-deprecate.html index ae40adfbbab051..0019583ee2135a 100644 --- a/deps/npm/docs/output/commands/npm-deprecate.html +++ b/deps/npm/docs/output/commands/npm-deprecate.html @@ -141,9 +141,9 @@
-

+

npm-deprecate - @10.9.0 + @10.9.2

Deprecate a version of a package
diff --git a/deps/npm/docs/output/commands/npm-diff.html b/deps/npm/docs/output/commands/npm-diff.html index 257b1c21572083..fe2123ee60fdc8 100644 --- a/deps/npm/docs/output/commands/npm-diff.html +++ b/deps/npm/docs/output/commands/npm-diff.html @@ -141,9 +141,9 @@
-

+

npm-diff - @10.9.0 + @10.9.2

The registry diff command
diff --git a/deps/npm/docs/output/commands/npm-dist-tag.html b/deps/npm/docs/output/commands/npm-dist-tag.html index 08e7770a0c1745..dce3f752ba4eaa 100644 --- a/deps/npm/docs/output/commands/npm-dist-tag.html +++ b/deps/npm/docs/output/commands/npm-dist-tag.html @@ -141,9 +141,9 @@
-

+

npm-dist-tag - @10.9.0 + @10.9.2

Modify package distribution tags
diff --git a/deps/npm/docs/output/commands/npm-docs.html b/deps/npm/docs/output/commands/npm-docs.html index 8b647251f36740..caef5afe3b1bd4 100644 --- a/deps/npm/docs/output/commands/npm-docs.html +++ b/deps/npm/docs/output/commands/npm-docs.html @@ -141,9 +141,9 @@
-

+

npm-docs - @10.9.0 + @10.9.2

Open documentation for a package in a web browser
diff --git a/deps/npm/docs/output/commands/npm-doctor.html b/deps/npm/docs/output/commands/npm-doctor.html index 110ec2f9b20bf0..d9f7a71450ab75 100644 --- a/deps/npm/docs/output/commands/npm-doctor.html +++ b/deps/npm/docs/output/commands/npm-doctor.html @@ -141,9 +141,9 @@
-

+

npm-doctor - @10.9.0 + @10.9.2

Check the health of your npm environment
diff --git a/deps/npm/docs/output/commands/npm-edit.html b/deps/npm/docs/output/commands/npm-edit.html index 9e4f7b361a5cb6..ab835ddcd352f9 100644 --- a/deps/npm/docs/output/commands/npm-edit.html +++ b/deps/npm/docs/output/commands/npm-edit.html @@ -141,9 +141,9 @@
-

+

npm-edit - @10.9.0 + @10.9.2

Edit an installed package
diff --git a/deps/npm/docs/output/commands/npm-exec.html b/deps/npm/docs/output/commands/npm-exec.html index 695fa35ab825c2..b5b8f66bdbb54f 100644 --- a/deps/npm/docs/output/commands/npm-exec.html +++ b/deps/npm/docs/output/commands/npm-exec.html @@ -141,9 +141,9 @@
-

+

npm-exec - @10.9.0 + @10.9.2

Run a command from a local or remote npm package
diff --git a/deps/npm/docs/output/commands/npm-explain.html b/deps/npm/docs/output/commands/npm-explain.html index e79255ff5fa6c6..812ce85f73a130 100644 --- a/deps/npm/docs/output/commands/npm-explain.html +++ b/deps/npm/docs/output/commands/npm-explain.html @@ -141,9 +141,9 @@
-

+

npm-explain - @10.9.0 + @10.9.2

Explain installed packages
diff --git a/deps/npm/docs/output/commands/npm-explore.html b/deps/npm/docs/output/commands/npm-explore.html index e296f4146aff98..20d761c0db149c 100644 --- a/deps/npm/docs/output/commands/npm-explore.html +++ b/deps/npm/docs/output/commands/npm-explore.html @@ -141,9 +141,9 @@
-

+

npm-explore - @10.9.0 + @10.9.2

Browse an installed package
diff --git a/deps/npm/docs/output/commands/npm-find-dupes.html b/deps/npm/docs/output/commands/npm-find-dupes.html index a8c914a0dd3d44..9b2810cf1b17ac 100644 --- a/deps/npm/docs/output/commands/npm-find-dupes.html +++ b/deps/npm/docs/output/commands/npm-find-dupes.html @@ -141,9 +141,9 @@
-

+

npm-find-dupes - @10.9.0 + @10.9.2

Find duplication in the package tree
diff --git a/deps/npm/docs/output/commands/npm-fund.html b/deps/npm/docs/output/commands/npm-fund.html index 36a63253439b60..91e0a71c3b32af 100644 --- a/deps/npm/docs/output/commands/npm-fund.html +++ b/deps/npm/docs/output/commands/npm-fund.html @@ -141,9 +141,9 @@
-

+

npm-fund - @10.9.0 + @10.9.2

Retrieve funding information
diff --git a/deps/npm/docs/output/commands/npm-help-search.html b/deps/npm/docs/output/commands/npm-help-search.html index 76dea45d852e75..35e2ec587c48e8 100644 --- a/deps/npm/docs/output/commands/npm-help-search.html +++ b/deps/npm/docs/output/commands/npm-help-search.html @@ -141,9 +141,9 @@
-

+

npm-help-search - @10.9.0 + @10.9.2

Search npm help documentation
diff --git a/deps/npm/docs/output/commands/npm-help.html b/deps/npm/docs/output/commands/npm-help.html index e6b14af2f9ec6c..17403f14c89427 100644 --- a/deps/npm/docs/output/commands/npm-help.html +++ b/deps/npm/docs/output/commands/npm-help.html @@ -141,9 +141,9 @@
-

+

npm-help - @10.9.0 + @10.9.2

Get help on npm
diff --git a/deps/npm/docs/output/commands/npm-hook.html b/deps/npm/docs/output/commands/npm-hook.html index 393700a9a7165a..d06784faf03624 100644 --- a/deps/npm/docs/output/commands/npm-hook.html +++ b/deps/npm/docs/output/commands/npm-hook.html @@ -141,9 +141,9 @@
-

+

npm-hook - @10.9.0 + @10.9.2

Manage registry hooks
diff --git a/deps/npm/docs/output/commands/npm-init.html b/deps/npm/docs/output/commands/npm-init.html index 8ff01b2f7a76d0..430763db6ba6af 100644 --- a/deps/npm/docs/output/commands/npm-init.html +++ b/deps/npm/docs/output/commands/npm-init.html @@ -141,9 +141,9 @@
-

+

npm-init - @10.9.0 + @10.9.2

Create a package.json file
diff --git a/deps/npm/docs/output/commands/npm-install-ci-test.html b/deps/npm/docs/output/commands/npm-install-ci-test.html index b0f9d237ed8e98..6a29d2d54f679e 100644 --- a/deps/npm/docs/output/commands/npm-install-ci-test.html +++ b/deps/npm/docs/output/commands/npm-install-ci-test.html @@ -141,9 +141,9 @@
-

+

npm-install-ci-test - @10.9.0 + @10.9.2

Install a project with a clean slate and run tests
diff --git a/deps/npm/docs/output/commands/npm-install-test.html b/deps/npm/docs/output/commands/npm-install-test.html index b0fbd63887fff5..32bd2271074fb6 100644 --- a/deps/npm/docs/output/commands/npm-install-test.html +++ b/deps/npm/docs/output/commands/npm-install-test.html @@ -141,9 +141,9 @@
-

+

npm-install-test - @10.9.0 + @10.9.2

Install package(s) and run tests
diff --git a/deps/npm/docs/output/commands/npm-install.html b/deps/npm/docs/output/commands/npm-install.html index fa57e02eaf9ad5..db7d717d18160b 100644 --- a/deps/npm/docs/output/commands/npm-install.html +++ b/deps/npm/docs/output/commands/npm-install.html @@ -141,9 +141,9 @@
-

+

npm-install - @10.9.0 + @10.9.2

Install a package
diff --git a/deps/npm/docs/output/commands/npm-link.html b/deps/npm/docs/output/commands/npm-link.html index 4e461ebefafd42..5778cc2a6268d2 100644 --- a/deps/npm/docs/output/commands/npm-link.html +++ b/deps/npm/docs/output/commands/npm-link.html @@ -141,9 +141,9 @@
-

+

npm-link - @10.9.0 + @10.9.2

Symlink a package folder
diff --git a/deps/npm/docs/output/commands/npm-login.html b/deps/npm/docs/output/commands/npm-login.html index 9c1584ca36bc41..81555fcecefd3e 100644 --- a/deps/npm/docs/output/commands/npm-login.html +++ b/deps/npm/docs/output/commands/npm-login.html @@ -141,9 +141,9 @@
-

+

npm-login - @10.9.0 + @10.9.2

Login to a registry user account
diff --git a/deps/npm/docs/output/commands/npm-logout.html b/deps/npm/docs/output/commands/npm-logout.html index 8908b329395254..1b6cdf8b923034 100644 --- a/deps/npm/docs/output/commands/npm-logout.html +++ b/deps/npm/docs/output/commands/npm-logout.html @@ -141,9 +141,9 @@
-

+

npm-logout - @10.9.0 + @10.9.2

Log out of the registry
diff --git a/deps/npm/docs/output/commands/npm-ls.html b/deps/npm/docs/output/commands/npm-ls.html index 2615a492a75e38..c9aa847abf1dd4 100644 --- a/deps/npm/docs/output/commands/npm-ls.html +++ b/deps/npm/docs/output/commands/npm-ls.html @@ -141,9 +141,9 @@
-

+

npm-ls - @10.9.0 + @10.9.2

List installed packages
@@ -168,7 +168,7 @@

Description

the results to only the paths to the packages named. Note that nested packages will also show the paths to the specified packages. For example, running npm ls promzard in npm's source tree will show:

-
npm@10.9.0 /path/to/npm
+
npm@10.9.2 /path/to/npm
 └─┬ init-package-json@0.0.4
   └── promzard@0.1.5
 
diff --git a/deps/npm/docs/output/commands/npm-org.html b/deps/npm/docs/output/commands/npm-org.html index 66d823f7f3c2de..6c45111f034994 100644 --- a/deps/npm/docs/output/commands/npm-org.html +++ b/deps/npm/docs/output/commands/npm-org.html @@ -141,9 +141,9 @@
-

+

npm-org - @10.9.0 + @10.9.2

Manage orgs
diff --git a/deps/npm/docs/output/commands/npm-outdated.html b/deps/npm/docs/output/commands/npm-outdated.html index 6002ff1818da2c..9be28fdfd239e1 100644 --- a/deps/npm/docs/output/commands/npm-outdated.html +++ b/deps/npm/docs/output/commands/npm-outdated.html @@ -141,9 +141,9 @@
-

+

npm-outdated - @10.9.0 + @10.9.2

Check for outdated packages
diff --git a/deps/npm/docs/output/commands/npm-owner.html b/deps/npm/docs/output/commands/npm-owner.html index e8b7a05274aa91..fc0899e5e5d66b 100644 --- a/deps/npm/docs/output/commands/npm-owner.html +++ b/deps/npm/docs/output/commands/npm-owner.html @@ -141,9 +141,9 @@
-

+

npm-owner - @10.9.0 + @10.9.2

Manage package owners
diff --git a/deps/npm/docs/output/commands/npm-pack.html b/deps/npm/docs/output/commands/npm-pack.html index 596ba9a35e3ac5..359d463780e510 100644 --- a/deps/npm/docs/output/commands/npm-pack.html +++ b/deps/npm/docs/output/commands/npm-pack.html @@ -141,9 +141,9 @@
-

+

npm-pack - @10.9.0 + @10.9.2

Create a tarball from a package
diff --git a/deps/npm/docs/output/commands/npm-ping.html b/deps/npm/docs/output/commands/npm-ping.html index de393dbd0b5d71..4b3fbbc698cbb7 100644 --- a/deps/npm/docs/output/commands/npm-ping.html +++ b/deps/npm/docs/output/commands/npm-ping.html @@ -141,9 +141,9 @@
-

+

npm-ping - @10.9.0 + @10.9.2

Ping npm registry
diff --git a/deps/npm/docs/output/commands/npm-pkg.html b/deps/npm/docs/output/commands/npm-pkg.html index ffb153cc440ce4..f1fe76e8073150 100644 --- a/deps/npm/docs/output/commands/npm-pkg.html +++ b/deps/npm/docs/output/commands/npm-pkg.html @@ -141,9 +141,9 @@
-

+

npm-pkg - @10.9.0 + @10.9.2

Manages your package.json
diff --git a/deps/npm/docs/output/commands/npm-prefix.html b/deps/npm/docs/output/commands/npm-prefix.html index da63644f2df42a..9708e55234ab4c 100644 --- a/deps/npm/docs/output/commands/npm-prefix.html +++ b/deps/npm/docs/output/commands/npm-prefix.html @@ -141,9 +141,9 @@
-

+

npm-prefix - @10.9.0 + @10.9.2

Display prefix
diff --git a/deps/npm/docs/output/commands/npm-profile.html b/deps/npm/docs/output/commands/npm-profile.html index c3679196a85bc4..6bb08b1fda63a6 100644 --- a/deps/npm/docs/output/commands/npm-profile.html +++ b/deps/npm/docs/output/commands/npm-profile.html @@ -141,9 +141,9 @@
-

+

npm-profile - @10.9.0 + @10.9.2

Change settings on your registry profile
diff --git a/deps/npm/docs/output/commands/npm-prune.html b/deps/npm/docs/output/commands/npm-prune.html index 4e844ab9f02cbb..818522d63754f9 100644 --- a/deps/npm/docs/output/commands/npm-prune.html +++ b/deps/npm/docs/output/commands/npm-prune.html @@ -141,9 +141,9 @@
-

+

npm-prune - @10.9.0 + @10.9.2

Remove extraneous packages
diff --git a/deps/npm/docs/output/commands/npm-publish.html b/deps/npm/docs/output/commands/npm-publish.html index b808cc29a15744..37c19e0b8f357c 100644 --- a/deps/npm/docs/output/commands/npm-publish.html +++ b/deps/npm/docs/output/commands/npm-publish.html @@ -141,9 +141,9 @@
-

+

npm-publish - @10.9.0 + @10.9.2

Publish a package
diff --git a/deps/npm/docs/output/commands/npm-query.html b/deps/npm/docs/output/commands/npm-query.html index d85a2f6c27ff79..4a0210e62f58ea 100644 --- a/deps/npm/docs/output/commands/npm-query.html +++ b/deps/npm/docs/output/commands/npm-query.html @@ -141,9 +141,9 @@
-

+

npm-query - @10.9.0 + @10.9.2

Dependency selector query
diff --git a/deps/npm/docs/output/commands/npm-rebuild.html b/deps/npm/docs/output/commands/npm-rebuild.html index ff28b35b86bced..0a356397c4a95b 100644 --- a/deps/npm/docs/output/commands/npm-rebuild.html +++ b/deps/npm/docs/output/commands/npm-rebuild.html @@ -141,9 +141,9 @@
-

+

npm-rebuild - @10.9.0 + @10.9.2

Rebuild a package
diff --git a/deps/npm/docs/output/commands/npm-repo.html b/deps/npm/docs/output/commands/npm-repo.html index 8ee7e9d6d2d074..ad86f81682375d 100644 --- a/deps/npm/docs/output/commands/npm-repo.html +++ b/deps/npm/docs/output/commands/npm-repo.html @@ -141,9 +141,9 @@
-

+

npm-repo - @10.9.0 + @10.9.2

Open package repository page in the browser
diff --git a/deps/npm/docs/output/commands/npm-restart.html b/deps/npm/docs/output/commands/npm-restart.html index e3171bf280910b..4a2244b048ecbc 100644 --- a/deps/npm/docs/output/commands/npm-restart.html +++ b/deps/npm/docs/output/commands/npm-restart.html @@ -141,9 +141,9 @@
-

+

npm-restart - @10.9.0 + @10.9.2

Restart a package
diff --git a/deps/npm/docs/output/commands/npm-root.html b/deps/npm/docs/output/commands/npm-root.html index 4e2e82e5bb259c..499bc84358b3e5 100644 --- a/deps/npm/docs/output/commands/npm-root.html +++ b/deps/npm/docs/output/commands/npm-root.html @@ -141,9 +141,9 @@
-

+

npm-root - @10.9.0 + @10.9.2

Display npm root
diff --git a/deps/npm/docs/output/commands/npm-run-script.html b/deps/npm/docs/output/commands/npm-run-script.html index 4673e733f49fcd..9c0ef4fedbc16e 100644 --- a/deps/npm/docs/output/commands/npm-run-script.html +++ b/deps/npm/docs/output/commands/npm-run-script.html @@ -141,9 +141,9 @@
-

+

npm-run-script - @10.9.0 + @10.9.2

Run arbitrary package scripts
diff --git a/deps/npm/docs/output/commands/npm-sbom.html b/deps/npm/docs/output/commands/npm-sbom.html index 00508eca6cd91a..b648df1654e8a6 100644 --- a/deps/npm/docs/output/commands/npm-sbom.html +++ b/deps/npm/docs/output/commands/npm-sbom.html @@ -141,9 +141,9 @@
-

+

npm-sbom - @10.9.0 + @10.9.2

Generate a Software Bill of Materials (SBOM)
diff --git a/deps/npm/docs/output/commands/npm-search.html b/deps/npm/docs/output/commands/npm-search.html index edf4e437e65400..bfd70c2a8abe92 100644 --- a/deps/npm/docs/output/commands/npm-search.html +++ b/deps/npm/docs/output/commands/npm-search.html @@ -141,9 +141,9 @@
-

+

npm-search - @10.9.0 + @10.9.2

Search for packages
diff --git a/deps/npm/docs/output/commands/npm-shrinkwrap.html b/deps/npm/docs/output/commands/npm-shrinkwrap.html index f225abaed9218f..60d198f85ce67e 100644 --- a/deps/npm/docs/output/commands/npm-shrinkwrap.html +++ b/deps/npm/docs/output/commands/npm-shrinkwrap.html @@ -141,9 +141,9 @@
-

+

npm-shrinkwrap - @10.9.0 + @10.9.2

Lock down dependency versions for publication
diff --git a/deps/npm/docs/output/commands/npm-star.html b/deps/npm/docs/output/commands/npm-star.html index 04b36628ad2176..ccda8bb3297d70 100644 --- a/deps/npm/docs/output/commands/npm-star.html +++ b/deps/npm/docs/output/commands/npm-star.html @@ -141,9 +141,9 @@
-

+

npm-star - @10.9.0 + @10.9.2

Mark your favorite packages
diff --git a/deps/npm/docs/output/commands/npm-stars.html b/deps/npm/docs/output/commands/npm-stars.html index 3183aa047f1f89..2f9619190f0122 100644 --- a/deps/npm/docs/output/commands/npm-stars.html +++ b/deps/npm/docs/output/commands/npm-stars.html @@ -141,9 +141,9 @@
-

+

npm-stars - @10.9.0 + @10.9.2

View packages marked as favorites
diff --git a/deps/npm/docs/output/commands/npm-start.html b/deps/npm/docs/output/commands/npm-start.html index b81caefe0a4431..fad3ce05c3a2c9 100644 --- a/deps/npm/docs/output/commands/npm-start.html +++ b/deps/npm/docs/output/commands/npm-start.html @@ -141,9 +141,9 @@
-

+

npm-start - @10.9.0 + @10.9.2

Start a package
diff --git a/deps/npm/docs/output/commands/npm-stop.html b/deps/npm/docs/output/commands/npm-stop.html index 85d4c782a736e7..bc70086d9991d5 100644 --- a/deps/npm/docs/output/commands/npm-stop.html +++ b/deps/npm/docs/output/commands/npm-stop.html @@ -141,9 +141,9 @@
-

+

npm-stop - @10.9.0 + @10.9.2

Stop a package
diff --git a/deps/npm/docs/output/commands/npm-team.html b/deps/npm/docs/output/commands/npm-team.html index 6ad869fa3bed9e..e03442dc68bf9c 100644 --- a/deps/npm/docs/output/commands/npm-team.html +++ b/deps/npm/docs/output/commands/npm-team.html @@ -141,9 +141,9 @@
-

+

npm-team - @10.9.0 + @10.9.2

Manage organization teams and team memberships
diff --git a/deps/npm/docs/output/commands/npm-test.html b/deps/npm/docs/output/commands/npm-test.html index bce16c92e4f087..b30af4ed9b3b30 100644 --- a/deps/npm/docs/output/commands/npm-test.html +++ b/deps/npm/docs/output/commands/npm-test.html @@ -141,9 +141,9 @@
-

+

npm-test - @10.9.0 + @10.9.2

Test a package
diff --git a/deps/npm/docs/output/commands/npm-token.html b/deps/npm/docs/output/commands/npm-token.html index 99fcafd9b8f53b..353709607b4bd4 100644 --- a/deps/npm/docs/output/commands/npm-token.html +++ b/deps/npm/docs/output/commands/npm-token.html @@ -141,9 +141,9 @@
-

+

npm-token - @10.9.0 + @10.9.2

Manage your authentication tokens
diff --git a/deps/npm/docs/output/commands/npm-uninstall.html b/deps/npm/docs/output/commands/npm-uninstall.html index dd8e7a2234604e..633dbbe58f933e 100644 --- a/deps/npm/docs/output/commands/npm-uninstall.html +++ b/deps/npm/docs/output/commands/npm-uninstall.html @@ -141,9 +141,9 @@
-

+

npm-uninstall - @10.9.0 + @10.9.2

Remove a package
diff --git a/deps/npm/docs/output/commands/npm-unpublish.html b/deps/npm/docs/output/commands/npm-unpublish.html index 56e2c59f62addb..e4f4090936d4ff 100644 --- a/deps/npm/docs/output/commands/npm-unpublish.html +++ b/deps/npm/docs/output/commands/npm-unpublish.html @@ -141,9 +141,9 @@
-

+

npm-unpublish - @10.9.0 + @10.9.2

Remove a package from the registry
diff --git a/deps/npm/docs/output/commands/npm-unstar.html b/deps/npm/docs/output/commands/npm-unstar.html index 710d8a947d665f..741ed8e707a4f9 100644 --- a/deps/npm/docs/output/commands/npm-unstar.html +++ b/deps/npm/docs/output/commands/npm-unstar.html @@ -141,9 +141,9 @@
-

+

npm-unstar - @10.9.0 + @10.9.2

Remove an item from your favorite packages
diff --git a/deps/npm/docs/output/commands/npm-update.html b/deps/npm/docs/output/commands/npm-update.html index e587ec92f8614a..287ed19fe9f5f6 100644 --- a/deps/npm/docs/output/commands/npm-update.html +++ b/deps/npm/docs/output/commands/npm-update.html @@ -141,9 +141,9 @@
-

+

npm-update - @10.9.0 + @10.9.2

Update packages
diff --git a/deps/npm/docs/output/commands/npm-version.html b/deps/npm/docs/output/commands/npm-version.html index 196a0236093673..43b978ffa94c80 100644 --- a/deps/npm/docs/output/commands/npm-version.html +++ b/deps/npm/docs/output/commands/npm-version.html @@ -141,9 +141,9 @@
-

+

npm-version - @10.9.0 + @10.9.2

Bump a package version
diff --git a/deps/npm/docs/output/commands/npm-view.html b/deps/npm/docs/output/commands/npm-view.html index 0eebee3037748d..1e388cfb922462 100644 --- a/deps/npm/docs/output/commands/npm-view.html +++ b/deps/npm/docs/output/commands/npm-view.html @@ -141,9 +141,9 @@
-

+

npm-view - @10.9.0 + @10.9.2

View registry info
diff --git a/deps/npm/docs/output/commands/npm-whoami.html b/deps/npm/docs/output/commands/npm-whoami.html index 0d1fa5ea9b87d7..944a762ad4aea1 100644 --- a/deps/npm/docs/output/commands/npm-whoami.html +++ b/deps/npm/docs/output/commands/npm-whoami.html @@ -141,9 +141,9 @@
-

+

npm-whoami - @10.9.0 + @10.9.2

Display npm username
diff --git a/deps/npm/docs/output/commands/npm.html b/deps/npm/docs/output/commands/npm.html index 005009c1dba277..eae0fdc7b20659 100644 --- a/deps/npm/docs/output/commands/npm.html +++ b/deps/npm/docs/output/commands/npm.html @@ -141,9 +141,9 @@
-

+

npm - @10.9.0 + @10.9.2

javascript package manager
@@ -158,7 +158,7 @@

Table of contents

Note: This command is unaware of workspaces.

Version

-

10.9.0

+

10.9.2

Description

npm is the package manager for the Node JavaScript platform. It puts modules in place so that node can find them, and manages dependency diff --git a/deps/npm/docs/output/commands/npx.html b/deps/npm/docs/output/commands/npx.html index d3239ed320bb70..ec5547306359f7 100644 --- a/deps/npm/docs/output/commands/npx.html +++ b/deps/npm/docs/output/commands/npx.html @@ -141,9 +141,9 @@

-

+

npx - @10.9.0 + @10.9.2

Run a command from a local or remote npm package
diff --git a/deps/npm/docs/output/configuring-npm/folders.html b/deps/npm/docs/output/configuring-npm/folders.html index f23aef6354f73d..daca0c019a942b 100644 --- a/deps/npm/docs/output/configuring-npm/folders.html +++ b/deps/npm/docs/output/configuring-npm/folders.html @@ -141,9 +141,9 @@
-

+

folders - @10.9.0 + @10.9.2

Folder Structures Used by npm
diff --git a/deps/npm/docs/output/configuring-npm/install.html b/deps/npm/docs/output/configuring-npm/install.html index cddbcaae2de8be..abda3bcc06ab62 100644 --- a/deps/npm/docs/output/configuring-npm/install.html +++ b/deps/npm/docs/output/configuring-npm/install.html @@ -141,9 +141,9 @@
-

+

install - @10.9.0 + @10.9.2

Download and install node and npm
diff --git a/deps/npm/docs/output/configuring-npm/npm-global.html b/deps/npm/docs/output/configuring-npm/npm-global.html index f23aef6354f73d..daca0c019a942b 100644 --- a/deps/npm/docs/output/configuring-npm/npm-global.html +++ b/deps/npm/docs/output/configuring-npm/npm-global.html @@ -141,9 +141,9 @@
-

+

folders - @10.9.0 + @10.9.2

Folder Structures Used by npm
diff --git a/deps/npm/docs/output/configuring-npm/npm-json.html b/deps/npm/docs/output/configuring-npm/npm-json.html index 0cd27f8d82fdd8..1645e91a762b8f 100644 --- a/deps/npm/docs/output/configuring-npm/npm-json.html +++ b/deps/npm/docs/output/configuring-npm/npm-json.html @@ -141,9 +141,9 @@
-

+

package.json - @10.9.0 + @10.9.2

Specifics of npm's package.json handling
diff --git a/deps/npm/docs/output/configuring-npm/npm-shrinkwrap-json.html b/deps/npm/docs/output/configuring-npm/npm-shrinkwrap-json.html index 5f20e99541a7a7..65f0b0c184bef9 100644 --- a/deps/npm/docs/output/configuring-npm/npm-shrinkwrap-json.html +++ b/deps/npm/docs/output/configuring-npm/npm-shrinkwrap-json.html @@ -141,9 +141,9 @@
-

+

npm-shrinkwrap.json - @10.9.0 + @10.9.2

A publishable lockfile
diff --git a/deps/npm/docs/output/configuring-npm/npmrc.html b/deps/npm/docs/output/configuring-npm/npmrc.html index a20c3d807d3d83..e5e94afe63a94c 100644 --- a/deps/npm/docs/output/configuring-npm/npmrc.html +++ b/deps/npm/docs/output/configuring-npm/npmrc.html @@ -141,9 +141,9 @@
-

+

npmrc - @10.9.0 + @10.9.2

The npm config files
diff --git a/deps/npm/docs/output/configuring-npm/package-json.html b/deps/npm/docs/output/configuring-npm/package-json.html index 0cd27f8d82fdd8..1645e91a762b8f 100644 --- a/deps/npm/docs/output/configuring-npm/package-json.html +++ b/deps/npm/docs/output/configuring-npm/package-json.html @@ -141,9 +141,9 @@
-

+

package.json - @10.9.0 + @10.9.2

Specifics of npm's package.json handling
diff --git a/deps/npm/docs/output/configuring-npm/package-lock-json.html b/deps/npm/docs/output/configuring-npm/package-lock-json.html index 58598df7ae4fbc..80fa8bf8bd4ac8 100644 --- a/deps/npm/docs/output/configuring-npm/package-lock-json.html +++ b/deps/npm/docs/output/configuring-npm/package-lock-json.html @@ -141,9 +141,9 @@
-

+

package-lock.json - @10.9.0 + @10.9.2

A manifestation of the manifest
diff --git a/deps/npm/docs/output/using-npm/config.html b/deps/npm/docs/output/using-npm/config.html index 5d70bb7e8e803e..487cc56439e9ed 100644 --- a/deps/npm/docs/output/using-npm/config.html +++ b/deps/npm/docs/output/using-npm/config.html @@ -141,9 +141,9 @@
-

+

config - @10.9.0 + @10.9.2

More than you probably want to know about npm configuration
diff --git a/deps/npm/docs/output/using-npm/dependency-selectors.html b/deps/npm/docs/output/using-npm/dependency-selectors.html index 008377b3ab55ff..24e34408de9c52 100644 --- a/deps/npm/docs/output/using-npm/dependency-selectors.html +++ b/deps/npm/docs/output/using-npm/dependency-selectors.html @@ -141,9 +141,9 @@
-

+

Dependency Selector Syntax & Querying - @10.9.0 + @10.9.2

Dependency Selector Syntax & Querying
diff --git a/deps/npm/docs/output/using-npm/developers.html b/deps/npm/docs/output/using-npm/developers.html index e75223cd623a54..d7848c6e6647f3 100644 --- a/deps/npm/docs/output/using-npm/developers.html +++ b/deps/npm/docs/output/using-npm/developers.html @@ -141,9 +141,9 @@
-

+

developers - @10.9.0 + @10.9.2

Developer Guide
diff --git a/deps/npm/docs/output/using-npm/logging.html b/deps/npm/docs/output/using-npm/logging.html index 5499bd53e285f2..d1e6b0a7532253 100644 --- a/deps/npm/docs/output/using-npm/logging.html +++ b/deps/npm/docs/output/using-npm/logging.html @@ -141,9 +141,9 @@
-

+

Logging - @10.9.0 + @10.9.2

Why, What & How We Log
diff --git a/deps/npm/docs/output/using-npm/orgs.html b/deps/npm/docs/output/using-npm/orgs.html index c9ed80f6421c5e..5b7007b3618406 100644 --- a/deps/npm/docs/output/using-npm/orgs.html +++ b/deps/npm/docs/output/using-npm/orgs.html @@ -141,9 +141,9 @@
-

+

orgs - @10.9.0 + @10.9.2

Working with Teams & Orgs
diff --git a/deps/npm/docs/output/using-npm/package-spec.html b/deps/npm/docs/output/using-npm/package-spec.html index a370699bb555bd..eee81153269653 100644 --- a/deps/npm/docs/output/using-npm/package-spec.html +++ b/deps/npm/docs/output/using-npm/package-spec.html @@ -141,9 +141,9 @@
-

+

package-spec - @10.9.0 + @10.9.2

Package name specifier
diff --git a/deps/npm/docs/output/using-npm/registry.html b/deps/npm/docs/output/using-npm/registry.html index 9d9f8a539333c9..bd464be3fd67c9 100644 --- a/deps/npm/docs/output/using-npm/registry.html +++ b/deps/npm/docs/output/using-npm/registry.html @@ -141,9 +141,9 @@
-

+

registry - @10.9.0 + @10.9.2

The JavaScript Package Registry
diff --git a/deps/npm/docs/output/using-npm/removal.html b/deps/npm/docs/output/using-npm/removal.html index 2668dd9dd8a440..f0ccb74eb50811 100644 --- a/deps/npm/docs/output/using-npm/removal.html +++ b/deps/npm/docs/output/using-npm/removal.html @@ -141,9 +141,9 @@
-

+

removal - @10.9.0 + @10.9.2

Cleaning the Slate
diff --git a/deps/npm/docs/output/using-npm/scope.html b/deps/npm/docs/output/using-npm/scope.html index 0441f8ef703e95..35ed91f147f107 100644 --- a/deps/npm/docs/output/using-npm/scope.html +++ b/deps/npm/docs/output/using-npm/scope.html @@ -141,9 +141,9 @@
-

+

scope - @10.9.0 + @10.9.2

Scoped packages
diff --git a/deps/npm/docs/output/using-npm/scripts.html b/deps/npm/docs/output/using-npm/scripts.html index ff37c2ede18062..9982862814e73a 100644 --- a/deps/npm/docs/output/using-npm/scripts.html +++ b/deps/npm/docs/output/using-npm/scripts.html @@ -141,9 +141,9 @@
-

+

scripts - @10.9.0 + @10.9.2

How npm handles the "scripts" field
diff --git a/deps/npm/docs/output/using-npm/workspaces.html b/deps/npm/docs/output/using-npm/workspaces.html index 19195cc868db4b..5e2756479c7636 100644 --- a/deps/npm/docs/output/using-npm/workspaces.html +++ b/deps/npm/docs/output/using-npm/workspaces.html @@ -141,9 +141,9 @@
-

+

workspaces - @10.9.0 + @10.9.2

Working with workspaces
diff --git a/deps/npm/lib/cli.js b/deps/npm/lib/cli.js index e11729fe3205b9..00b4fc0bd7fb72 100644 --- a/deps/npm/lib/cli.js +++ b/deps/npm/lib/cli.js @@ -1,3 +1,11 @@ +try { + const { enableCompileCache } = require('node:module') + /* istanbul ignore next */ + if (enableCompileCache) { + enableCompileCache() + } +} catch (e) { /* istanbul ignore next */ } + const validateEngines = require('./cli/validate-engines.js') const cliEntry = require('node:path').resolve(__dirname, 'cli/entry.js') diff --git a/deps/npm/man/man1/npm-access.1 b/deps/npm/man/man1/npm-access.1 index 602193f3b8e3e8..96beab28fc365d 100644 --- a/deps/npm/man/man1/npm-access.1 +++ b/deps/npm/man/man1/npm-access.1 @@ -1,4 +1,4 @@ -.TH "NPM-ACCESS" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-ACCESS" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-access\fR - Set access level on published packages .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-adduser.1 b/deps/npm/man/man1/npm-adduser.1 index 467384ec0ec40e..0096f28229122d 100644 --- a/deps/npm/man/man1/npm-adduser.1 +++ b/deps/npm/man/man1/npm-adduser.1 @@ -1,4 +1,4 @@ -.TH "NPM-ADDUSER" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-ADDUSER" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-adduser\fR - Add a registry user account .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-audit.1 b/deps/npm/man/man1/npm-audit.1 index 64bf5d5461a157..38b977d3871d59 100644 --- a/deps/npm/man/man1/npm-audit.1 +++ b/deps/npm/man/man1/npm-audit.1 @@ -1,4 +1,4 @@ -.TH "NPM-AUDIT" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-AUDIT" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-audit\fR - Run a security audit .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-bugs.1 b/deps/npm/man/man1/npm-bugs.1 index c25b04b6814137..92c57c2c3c4146 100644 --- a/deps/npm/man/man1/npm-bugs.1 +++ b/deps/npm/man/man1/npm-bugs.1 @@ -1,4 +1,4 @@ -.TH "NPM-BUGS" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-BUGS" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-bugs\fR - Report bugs for a package in a web browser .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-cache.1 b/deps/npm/man/man1/npm-cache.1 index e9da044a5b4479..da188a0914e016 100644 --- a/deps/npm/man/man1/npm-cache.1 +++ b/deps/npm/man/man1/npm-cache.1 @@ -1,4 +1,4 @@ -.TH "NPM-CACHE" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-CACHE" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-cache\fR - Manipulates packages cache .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-ci.1 b/deps/npm/man/man1/npm-ci.1 index 1ad1419cb1f98f..1ae5e934e2d2b7 100644 --- a/deps/npm/man/man1/npm-ci.1 +++ b/deps/npm/man/man1/npm-ci.1 @@ -1,4 +1,4 @@ -.TH "NPM-CI" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-CI" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-ci\fR - Clean install a project .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-completion.1 b/deps/npm/man/man1/npm-completion.1 index 6f246c436cead3..ea44a0c9c56a51 100644 --- a/deps/npm/man/man1/npm-completion.1 +++ b/deps/npm/man/man1/npm-completion.1 @@ -1,4 +1,4 @@ -.TH "NPM-COMPLETION" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-COMPLETION" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-completion\fR - Tab Completion for npm .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-config.1 b/deps/npm/man/man1/npm-config.1 index 1bef58e188b68c..dbe609ba3b727f 100644 --- a/deps/npm/man/man1/npm-config.1 +++ b/deps/npm/man/man1/npm-config.1 @@ -1,4 +1,4 @@ -.TH "NPM-CONFIG" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-CONFIG" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-config\fR - Manage the npm configuration files .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-dedupe.1 b/deps/npm/man/man1/npm-dedupe.1 index b1e21f0478ed4f..530de6344d5f4e 100644 --- a/deps/npm/man/man1/npm-dedupe.1 +++ b/deps/npm/man/man1/npm-dedupe.1 @@ -1,4 +1,4 @@ -.TH "NPM-DEDUPE" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-DEDUPE" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-dedupe\fR - Reduce duplication in the package tree .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-deprecate.1 b/deps/npm/man/man1/npm-deprecate.1 index 31e9e56cd95382..0333772b97c690 100644 --- a/deps/npm/man/man1/npm-deprecate.1 +++ b/deps/npm/man/man1/npm-deprecate.1 @@ -1,4 +1,4 @@ -.TH "NPM-DEPRECATE" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-DEPRECATE" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-deprecate\fR - Deprecate a version of a package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-diff.1 b/deps/npm/man/man1/npm-diff.1 index c29ae3266d1543..168f4397430854 100644 --- a/deps/npm/man/man1/npm-diff.1 +++ b/deps/npm/man/man1/npm-diff.1 @@ -1,4 +1,4 @@ -.TH "NPM-DIFF" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-DIFF" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-diff\fR - The registry diff command .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-dist-tag.1 b/deps/npm/man/man1/npm-dist-tag.1 index 46e5cf8ac3492a..97e2927ac1e2fa 100644 --- a/deps/npm/man/man1/npm-dist-tag.1 +++ b/deps/npm/man/man1/npm-dist-tag.1 @@ -1,4 +1,4 @@ -.TH "NPM-DIST-TAG" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-DIST-TAG" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-dist-tag\fR - Modify package distribution tags .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-docs.1 b/deps/npm/man/man1/npm-docs.1 index 6cda2d87abe163..6b09a835bbf318 100644 --- a/deps/npm/man/man1/npm-docs.1 +++ b/deps/npm/man/man1/npm-docs.1 @@ -1,4 +1,4 @@ -.TH "NPM-DOCS" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-DOCS" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-docs\fR - Open documentation for a package in a web browser .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-doctor.1 b/deps/npm/man/man1/npm-doctor.1 index 7a67ed1e6b32b1..9a0374b0896b52 100644 --- a/deps/npm/man/man1/npm-doctor.1 +++ b/deps/npm/man/man1/npm-doctor.1 @@ -1,4 +1,4 @@ -.TH "NPM-DOCTOR" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-DOCTOR" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-doctor\fR - Check the health of your npm environment .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-edit.1 b/deps/npm/man/man1/npm-edit.1 index 5ae7e24b67d60e..779feeede13656 100644 --- a/deps/npm/man/man1/npm-edit.1 +++ b/deps/npm/man/man1/npm-edit.1 @@ -1,4 +1,4 @@ -.TH "NPM-EDIT" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-EDIT" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-edit\fR - Edit an installed package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-exec.1 b/deps/npm/man/man1/npm-exec.1 index 20c21e67919d65..3b5fe4c425ee3e 100644 --- a/deps/npm/man/man1/npm-exec.1 +++ b/deps/npm/man/man1/npm-exec.1 @@ -1,4 +1,4 @@ -.TH "NPM-EXEC" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-EXEC" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-exec\fR - Run a command from a local or remote npm package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-explain.1 b/deps/npm/man/man1/npm-explain.1 index 65ef0e086e2ce0..5f86d19236fdb0 100644 --- a/deps/npm/man/man1/npm-explain.1 +++ b/deps/npm/man/man1/npm-explain.1 @@ -1,4 +1,4 @@ -.TH "NPM-EXPLAIN" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-EXPLAIN" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-explain\fR - Explain installed packages .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-explore.1 b/deps/npm/man/man1/npm-explore.1 index 6b92a81c2abc0d..eb71089b62446f 100644 --- a/deps/npm/man/man1/npm-explore.1 +++ b/deps/npm/man/man1/npm-explore.1 @@ -1,4 +1,4 @@ -.TH "NPM-EXPLORE" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-EXPLORE" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-explore\fR - Browse an installed package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-find-dupes.1 b/deps/npm/man/man1/npm-find-dupes.1 index 261313e1b23ad1..88a42adcec1f20 100644 --- a/deps/npm/man/man1/npm-find-dupes.1 +++ b/deps/npm/man/man1/npm-find-dupes.1 @@ -1,4 +1,4 @@ -.TH "NPM-FIND-DUPES" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-FIND-DUPES" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-find-dupes\fR - Find duplication in the package tree .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-fund.1 b/deps/npm/man/man1/npm-fund.1 index b87d57d20c0f50..31c5ceb7ff8c1f 100644 --- a/deps/npm/man/man1/npm-fund.1 +++ b/deps/npm/man/man1/npm-fund.1 @@ -1,4 +1,4 @@ -.TH "NPM-FUND" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-FUND" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-fund\fR - Retrieve funding information .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-help-search.1 b/deps/npm/man/man1/npm-help-search.1 index 9660ca29697e9f..c954795c2778c7 100644 --- a/deps/npm/man/man1/npm-help-search.1 +++ b/deps/npm/man/man1/npm-help-search.1 @@ -1,4 +1,4 @@ -.TH "NPM-HELP-SEARCH" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-HELP-SEARCH" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-help-search\fR - Search npm help documentation .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-help.1 b/deps/npm/man/man1/npm-help.1 index a8c70fdc88a9ae..2d0fc6e3a2c0e7 100644 --- a/deps/npm/man/man1/npm-help.1 +++ b/deps/npm/man/man1/npm-help.1 @@ -1,4 +1,4 @@ -.TH "NPM-HELP" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-HELP" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-help\fR - Get help on npm .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-hook.1 b/deps/npm/man/man1/npm-hook.1 index 2c07a5afadbb64..8d5d9334692b9e 100644 --- a/deps/npm/man/man1/npm-hook.1 +++ b/deps/npm/man/man1/npm-hook.1 @@ -1,4 +1,4 @@ -.TH "NPM-HOOK" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-HOOK" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-hook\fR - Manage registry hooks .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-init.1 b/deps/npm/man/man1/npm-init.1 index cb7339dc0f4ff0..1c1b008baa1deb 100644 --- a/deps/npm/man/man1/npm-init.1 +++ b/deps/npm/man/man1/npm-init.1 @@ -1,4 +1,4 @@ -.TH "NPM-INIT" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-INIT" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-init\fR - Create a package.json file .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-install-ci-test.1 b/deps/npm/man/man1/npm-install-ci-test.1 index 52defde693a506..4bbbb51140521b 100644 --- a/deps/npm/man/man1/npm-install-ci-test.1 +++ b/deps/npm/man/man1/npm-install-ci-test.1 @@ -1,4 +1,4 @@ -.TH "NPM-INSTALL-CI-TEST" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-INSTALL-CI-TEST" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-install-ci-test\fR - Install a project with a clean slate and run tests .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-install-test.1 b/deps/npm/man/man1/npm-install-test.1 index e2023e1a985474..eef940c066c709 100644 --- a/deps/npm/man/man1/npm-install-test.1 +++ b/deps/npm/man/man1/npm-install-test.1 @@ -1,4 +1,4 @@ -.TH "NPM-INSTALL-TEST" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-INSTALL-TEST" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-install-test\fR - Install package(s) and run tests .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-install.1 b/deps/npm/man/man1/npm-install.1 index 59b3a8c81ac73f..bbe4a43c10863e 100644 --- a/deps/npm/man/man1/npm-install.1 +++ b/deps/npm/man/man1/npm-install.1 @@ -1,4 +1,4 @@ -.TH "NPM-INSTALL" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-INSTALL" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-install\fR - Install a package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-link.1 b/deps/npm/man/man1/npm-link.1 index e6106495400fdc..9aca1f4a7fb80d 100644 --- a/deps/npm/man/man1/npm-link.1 +++ b/deps/npm/man/man1/npm-link.1 @@ -1,4 +1,4 @@ -.TH "NPM-LINK" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-LINK" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-link\fR - Symlink a package folder .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-login.1 b/deps/npm/man/man1/npm-login.1 index 36f2bf2d0f35dc..a5e0cb71bb0d98 100644 --- a/deps/npm/man/man1/npm-login.1 +++ b/deps/npm/man/man1/npm-login.1 @@ -1,4 +1,4 @@ -.TH "NPM-LOGIN" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-LOGIN" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-login\fR - Login to a registry user account .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-logout.1 b/deps/npm/man/man1/npm-logout.1 index 78cba39ccd85c9..8ac69429ea320d 100644 --- a/deps/npm/man/man1/npm-logout.1 +++ b/deps/npm/man/man1/npm-logout.1 @@ -1,4 +1,4 @@ -.TH "NPM-LOGOUT" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-LOGOUT" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-logout\fR - Log out of the registry .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-ls.1 b/deps/npm/man/man1/npm-ls.1 index b0364fe1531753..47d20120898b59 100644 --- a/deps/npm/man/man1/npm-ls.1 +++ b/deps/npm/man/man1/npm-ls.1 @@ -1,4 +1,4 @@ -.TH "NPM-LS" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-LS" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-ls\fR - List installed packages .SS "Synopsis" @@ -20,7 +20,7 @@ Positional arguments are \fBname@version-range\fR identifiers, which will limit .P .RS 2 .nf -npm@10.9.0 /path/to/npm +npm@10.9.2 /path/to/npm └─┬ init-package-json@0.0.4 └── promzard@0.1.5 .fi diff --git a/deps/npm/man/man1/npm-org.1 b/deps/npm/man/man1/npm-org.1 index 0465a6b5bddb54..88df3325a344fd 100644 --- a/deps/npm/man/man1/npm-org.1 +++ b/deps/npm/man/man1/npm-org.1 @@ -1,4 +1,4 @@ -.TH "NPM-ORG" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-ORG" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-org\fR - Manage orgs .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-outdated.1 b/deps/npm/man/man1/npm-outdated.1 index ad1cf07823630f..17aabbd0857183 100644 --- a/deps/npm/man/man1/npm-outdated.1 +++ b/deps/npm/man/man1/npm-outdated.1 @@ -1,4 +1,4 @@ -.TH "NPM-OUTDATED" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-OUTDATED" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-outdated\fR - Check for outdated packages .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-owner.1 b/deps/npm/man/man1/npm-owner.1 index 5842e5a51d125f..f01e67e6464e7f 100644 --- a/deps/npm/man/man1/npm-owner.1 +++ b/deps/npm/man/man1/npm-owner.1 @@ -1,4 +1,4 @@ -.TH "NPM-OWNER" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-OWNER" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-owner\fR - Manage package owners .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-pack.1 b/deps/npm/man/man1/npm-pack.1 index 6cc2acd4b580f7..b9b56a31e30eef 100644 --- a/deps/npm/man/man1/npm-pack.1 +++ b/deps/npm/man/man1/npm-pack.1 @@ -1,4 +1,4 @@ -.TH "NPM-PACK" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-PACK" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-pack\fR - Create a tarball from a package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-ping.1 b/deps/npm/man/man1/npm-ping.1 index ad03cbbb6a1398..2d16431b030ea8 100644 --- a/deps/npm/man/man1/npm-ping.1 +++ b/deps/npm/man/man1/npm-ping.1 @@ -1,4 +1,4 @@ -.TH "NPM-PING" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-PING" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-ping\fR - Ping npm registry .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-pkg.1 b/deps/npm/man/man1/npm-pkg.1 index 2f45876234ec3d..e55a0280d1211b 100644 --- a/deps/npm/man/man1/npm-pkg.1 +++ b/deps/npm/man/man1/npm-pkg.1 @@ -1,4 +1,4 @@ -.TH "NPM-PKG" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-PKG" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-pkg\fR - Manages your package.json .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-prefix.1 b/deps/npm/man/man1/npm-prefix.1 index cac44344c71d79..dca8d0c47497b4 100644 --- a/deps/npm/man/man1/npm-prefix.1 +++ b/deps/npm/man/man1/npm-prefix.1 @@ -1,4 +1,4 @@ -.TH "NPM-PREFIX" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-PREFIX" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-prefix\fR - Display prefix .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-profile.1 b/deps/npm/man/man1/npm-profile.1 index 28e3f41244ace1..89837b408f5a67 100644 --- a/deps/npm/man/man1/npm-profile.1 +++ b/deps/npm/man/man1/npm-profile.1 @@ -1,4 +1,4 @@ -.TH "NPM-PROFILE" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-PROFILE" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-profile\fR - Change settings on your registry profile .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-prune.1 b/deps/npm/man/man1/npm-prune.1 index 7634c75f0901fa..243426dffaf20f 100644 --- a/deps/npm/man/man1/npm-prune.1 +++ b/deps/npm/man/man1/npm-prune.1 @@ -1,4 +1,4 @@ -.TH "NPM-PRUNE" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-PRUNE" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-prune\fR - Remove extraneous packages .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-publish.1 b/deps/npm/man/man1/npm-publish.1 index c6724b6fe2ce51..1110b097182988 100644 --- a/deps/npm/man/man1/npm-publish.1 +++ b/deps/npm/man/man1/npm-publish.1 @@ -1,4 +1,4 @@ -.TH "NPM-PUBLISH" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-PUBLISH" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-publish\fR - Publish a package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-query.1 b/deps/npm/man/man1/npm-query.1 index 0a3c6e665e7ecf..983f2cad388940 100644 --- a/deps/npm/man/man1/npm-query.1 +++ b/deps/npm/man/man1/npm-query.1 @@ -1,4 +1,4 @@ -.TH "NPM-QUERY" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-QUERY" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-query\fR - Dependency selector query .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-rebuild.1 b/deps/npm/man/man1/npm-rebuild.1 index e537cec373e3c6..396d9adf779cb1 100644 --- a/deps/npm/man/man1/npm-rebuild.1 +++ b/deps/npm/man/man1/npm-rebuild.1 @@ -1,4 +1,4 @@ -.TH "NPM-REBUILD" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-REBUILD" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-rebuild\fR - Rebuild a package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-repo.1 b/deps/npm/man/man1/npm-repo.1 index 869541f6faaa51..b9c7bbdfbc233c 100644 --- a/deps/npm/man/man1/npm-repo.1 +++ b/deps/npm/man/man1/npm-repo.1 @@ -1,4 +1,4 @@ -.TH "NPM-REPO" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-REPO" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-repo\fR - Open package repository page in the browser .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-restart.1 b/deps/npm/man/man1/npm-restart.1 index b0e3b0deead7ef..1112bf9180cece 100644 --- a/deps/npm/man/man1/npm-restart.1 +++ b/deps/npm/man/man1/npm-restart.1 @@ -1,4 +1,4 @@ -.TH "NPM-RESTART" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-RESTART" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-restart\fR - Restart a package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-root.1 b/deps/npm/man/man1/npm-root.1 index 94a132557e3979..2456bdba6d1816 100644 --- a/deps/npm/man/man1/npm-root.1 +++ b/deps/npm/man/man1/npm-root.1 @@ -1,4 +1,4 @@ -.TH "NPM-ROOT" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-ROOT" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-root\fR - Display npm root .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-run-script.1 b/deps/npm/man/man1/npm-run-script.1 index 424c733d6a0523..a05362361848d2 100644 --- a/deps/npm/man/man1/npm-run-script.1 +++ b/deps/npm/man/man1/npm-run-script.1 @@ -1,4 +1,4 @@ -.TH "NPM-RUN-SCRIPT" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-RUN-SCRIPT" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-run-script\fR - Run arbitrary package scripts .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-sbom.1 b/deps/npm/man/man1/npm-sbom.1 index 7bb8199c8b11c8..f784a53edd4c08 100644 --- a/deps/npm/man/man1/npm-sbom.1 +++ b/deps/npm/man/man1/npm-sbom.1 @@ -1,4 +1,4 @@ -.TH "NPM-SBOM" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-SBOM" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-sbom\fR - Generate a Software Bill of Materials (SBOM) .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-search.1 b/deps/npm/man/man1/npm-search.1 index 4fe67890bc949a..3ee7bcb7cb4e92 100644 --- a/deps/npm/man/man1/npm-search.1 +++ b/deps/npm/man/man1/npm-search.1 @@ -1,4 +1,4 @@ -.TH "NPM-SEARCH" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-SEARCH" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-search\fR - Search for packages .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-shrinkwrap.1 b/deps/npm/man/man1/npm-shrinkwrap.1 index ed3c0cb03ccca7..d7e64493a90754 100644 --- a/deps/npm/man/man1/npm-shrinkwrap.1 +++ b/deps/npm/man/man1/npm-shrinkwrap.1 @@ -1,4 +1,4 @@ -.TH "NPM-SHRINKWRAP" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-SHRINKWRAP" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-shrinkwrap\fR - Lock down dependency versions for publication .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-star.1 b/deps/npm/man/man1/npm-star.1 index 83d0ff230ec1bb..7c3a528ec3a04f 100644 --- a/deps/npm/man/man1/npm-star.1 +++ b/deps/npm/man/man1/npm-star.1 @@ -1,4 +1,4 @@ -.TH "NPM-STAR" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-STAR" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-star\fR - Mark your favorite packages .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-stars.1 b/deps/npm/man/man1/npm-stars.1 index bdeffec7a3b1b5..61d60d9534da40 100644 --- a/deps/npm/man/man1/npm-stars.1 +++ b/deps/npm/man/man1/npm-stars.1 @@ -1,4 +1,4 @@ -.TH "NPM-STARS" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-STARS" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-stars\fR - View packages marked as favorites .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-start.1 b/deps/npm/man/man1/npm-start.1 index c3cb48c6f72576..4c687a1ecba49e 100644 --- a/deps/npm/man/man1/npm-start.1 +++ b/deps/npm/man/man1/npm-start.1 @@ -1,4 +1,4 @@ -.TH "NPM-START" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-START" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-start\fR - Start a package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-stop.1 b/deps/npm/man/man1/npm-stop.1 index 36ef105209b7f0..dadebe98c52834 100644 --- a/deps/npm/man/man1/npm-stop.1 +++ b/deps/npm/man/man1/npm-stop.1 @@ -1,4 +1,4 @@ -.TH "NPM-STOP" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-STOP" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-stop\fR - Stop a package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-team.1 b/deps/npm/man/man1/npm-team.1 index 6712c8f92b23c8..42ee63f4743b6e 100644 --- a/deps/npm/man/man1/npm-team.1 +++ b/deps/npm/man/man1/npm-team.1 @@ -1,4 +1,4 @@ -.TH "NPM-TEAM" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-TEAM" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-team\fR - Manage organization teams and team memberships .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-test.1 b/deps/npm/man/man1/npm-test.1 index 5e63e9c6d76ab3..80eb6a1d7bb9e7 100644 --- a/deps/npm/man/man1/npm-test.1 +++ b/deps/npm/man/man1/npm-test.1 @@ -1,4 +1,4 @@ -.TH "NPM-TEST" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-TEST" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-test\fR - Test a package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-token.1 b/deps/npm/man/man1/npm-token.1 index 29a2c361574121..1d14f81553b5c9 100644 --- a/deps/npm/man/man1/npm-token.1 +++ b/deps/npm/man/man1/npm-token.1 @@ -1,4 +1,4 @@ -.TH "NPM-TOKEN" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-TOKEN" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-token\fR - Manage your authentication tokens .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-uninstall.1 b/deps/npm/man/man1/npm-uninstall.1 index 0c10a60c1f07e7..f5e25641fc57c5 100644 --- a/deps/npm/man/man1/npm-uninstall.1 +++ b/deps/npm/man/man1/npm-uninstall.1 @@ -1,4 +1,4 @@ -.TH "NPM-UNINSTALL" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-UNINSTALL" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-uninstall\fR - Remove a package .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-unpublish.1 b/deps/npm/man/man1/npm-unpublish.1 index 098af2e59310bc..fcf62bbd7da263 100644 --- a/deps/npm/man/man1/npm-unpublish.1 +++ b/deps/npm/man/man1/npm-unpublish.1 @@ -1,4 +1,4 @@ -.TH "NPM-UNPUBLISH" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-UNPUBLISH" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-unpublish\fR - Remove a package from the registry .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-unstar.1 b/deps/npm/man/man1/npm-unstar.1 index 7326984aa8b4d2..e9edf3ab6634dd 100644 --- a/deps/npm/man/man1/npm-unstar.1 +++ b/deps/npm/man/man1/npm-unstar.1 @@ -1,4 +1,4 @@ -.TH "NPM-UNSTAR" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-UNSTAR" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-unstar\fR - Remove an item from your favorite packages .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-update.1 b/deps/npm/man/man1/npm-update.1 index 797a9e601cf3d2..052008d73485c9 100644 --- a/deps/npm/man/man1/npm-update.1 +++ b/deps/npm/man/man1/npm-update.1 @@ -1,4 +1,4 @@ -.TH "NPM-UPDATE" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-UPDATE" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-update\fR - Update packages .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-version.1 b/deps/npm/man/man1/npm-version.1 index d0a7dcee6fea65..f79a0c84c3f8fd 100644 --- a/deps/npm/man/man1/npm-version.1 +++ b/deps/npm/man/man1/npm-version.1 @@ -1,4 +1,4 @@ -.TH "NPM-VERSION" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-VERSION" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-version\fR - Bump a package version .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-view.1 b/deps/npm/man/man1/npm-view.1 index 2925f8d7d2cffe..e862ddc4b8780d 100644 --- a/deps/npm/man/man1/npm-view.1 +++ b/deps/npm/man/man1/npm-view.1 @@ -1,4 +1,4 @@ -.TH "NPM-VIEW" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-VIEW" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-view\fR - View registry info .SS "Synopsis" diff --git a/deps/npm/man/man1/npm-whoami.1 b/deps/npm/man/man1/npm-whoami.1 index f283db5c9d247a..a003f634a2b293 100644 --- a/deps/npm/man/man1/npm-whoami.1 +++ b/deps/npm/man/man1/npm-whoami.1 @@ -1,4 +1,4 @@ -.TH "NPM-WHOAMI" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM-WHOAMI" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-whoami\fR - Display npm username .SS "Synopsis" diff --git a/deps/npm/man/man1/npm.1 b/deps/npm/man/man1/npm.1 index b2034bc50fa5e3..28e8774ad1b4d0 100644 --- a/deps/npm/man/man1/npm.1 +++ b/deps/npm/man/man1/npm.1 @@ -1,4 +1,4 @@ -.TH "NPM" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPM" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm\fR - javascript package manager .SS "Synopsis" @@ -12,7 +12,7 @@ npm Note: This command is unaware of workspaces. .SS "Version" .P -10.9.0 +10.9.2 .SS "Description" .P npm is the package manager for the Node JavaScript platform. It puts modules in place so that node can find them, and manages dependency conflicts intelligently. diff --git a/deps/npm/man/man1/npx.1 b/deps/npm/man/man1/npx.1 index a1000443cc665e..9b4ba1af1dc365 100644 --- a/deps/npm/man/man1/npx.1 +++ b/deps/npm/man/man1/npx.1 @@ -1,4 +1,4 @@ -.TH "NPX" "1" "October 2024" "NPM@10.9.0" "" +.TH "NPX" "1" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpx\fR - Run a command from a local or remote npm package .SS "Synopsis" diff --git a/deps/npm/man/man5/folders.5 b/deps/npm/man/man5/folders.5 index 6e3045729c46ca..8eb8a8230333f9 100644 --- a/deps/npm/man/man5/folders.5 +++ b/deps/npm/man/man5/folders.5 @@ -1,4 +1,4 @@ -.TH "FOLDERS" "5" "October 2024" "NPM@10.9.0" "" +.TH "FOLDERS" "5" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBfolders\fR - Folder Structures Used by npm .SS "Description" diff --git a/deps/npm/man/man5/install.5 b/deps/npm/man/man5/install.5 index f5fabf02d7431b..0b75adf308685a 100644 --- a/deps/npm/man/man5/install.5 +++ b/deps/npm/man/man5/install.5 @@ -1,4 +1,4 @@ -.TH "INSTALL" "5" "October 2024" "NPM@10.9.0" "" +.TH "INSTALL" "5" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBinstall\fR - Download and install node and npm .SS "Description" diff --git a/deps/npm/man/man5/npm-global.5 b/deps/npm/man/man5/npm-global.5 index 6e3045729c46ca..8eb8a8230333f9 100644 --- a/deps/npm/man/man5/npm-global.5 +++ b/deps/npm/man/man5/npm-global.5 @@ -1,4 +1,4 @@ -.TH "FOLDERS" "5" "October 2024" "NPM@10.9.0" "" +.TH "FOLDERS" "5" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBfolders\fR - Folder Structures Used by npm .SS "Description" diff --git a/deps/npm/man/man5/npm-json.5 b/deps/npm/man/man5/npm-json.5 index 49773dda01d706..81fa9a8c95b8dc 100644 --- a/deps/npm/man/man5/npm-json.5 +++ b/deps/npm/man/man5/npm-json.5 @@ -1,4 +1,4 @@ -.TH "PACKAGE.JSON" "5" "October 2024" "NPM@10.9.0" "" +.TH "PACKAGE.JSON" "5" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBpackage.json\fR - Specifics of npm's package.json handling .SS "Description" diff --git a/deps/npm/man/man5/npm-shrinkwrap-json.5 b/deps/npm/man/man5/npm-shrinkwrap-json.5 index d1f394d23aa1ce..7e8efb285e959e 100644 --- a/deps/npm/man/man5/npm-shrinkwrap-json.5 +++ b/deps/npm/man/man5/npm-shrinkwrap-json.5 @@ -1,4 +1,4 @@ -.TH "NPM-SHRINKWRAP.JSON" "5" "October 2024" "NPM@10.9.0" "" +.TH "NPM-SHRINKWRAP.JSON" "5" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpm-shrinkwrap.json\fR - A publishable lockfile .SS "Description" diff --git a/deps/npm/man/man5/npmrc.5 b/deps/npm/man/man5/npmrc.5 index 3b78f989c23545..947a0fe433faa3 100644 --- a/deps/npm/man/man5/npmrc.5 +++ b/deps/npm/man/man5/npmrc.5 @@ -1,4 +1,4 @@ -.TH "NPMRC" "5" "October 2024" "NPM@10.9.0" "" +.TH "NPMRC" "5" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBnpmrc\fR - The npm config files .SS "Description" diff --git a/deps/npm/man/man5/package-json.5 b/deps/npm/man/man5/package-json.5 index 49773dda01d706..81fa9a8c95b8dc 100644 --- a/deps/npm/man/man5/package-json.5 +++ b/deps/npm/man/man5/package-json.5 @@ -1,4 +1,4 @@ -.TH "PACKAGE.JSON" "5" "October 2024" "NPM@10.9.0" "" +.TH "PACKAGE.JSON" "5" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBpackage.json\fR - Specifics of npm's package.json handling .SS "Description" diff --git a/deps/npm/man/man5/package-lock-json.5 b/deps/npm/man/man5/package-lock-json.5 index df3dcca1c4fa75..78deecab3757c1 100644 --- a/deps/npm/man/man5/package-lock-json.5 +++ b/deps/npm/man/man5/package-lock-json.5 @@ -1,4 +1,4 @@ -.TH "PACKAGE-LOCK.JSON" "5" "October 2024" "NPM@10.9.0" "" +.TH "PACKAGE-LOCK.JSON" "5" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBpackage-lock.json\fR - A manifestation of the manifest .SS "Description" diff --git a/deps/npm/man/man7/config.7 b/deps/npm/man/man7/config.7 index ee166c9d4ccee9..0ce1f25f38d5d3 100644 --- a/deps/npm/man/man7/config.7 +++ b/deps/npm/man/man7/config.7 @@ -1,4 +1,4 @@ -.TH "CONFIG" "7" "October 2024" "NPM@10.9.0" "" +.TH "CONFIG" "7" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBconfig\fR - More than you probably want to know about npm configuration .SS "Description" diff --git a/deps/npm/man/man7/dependency-selectors.7 b/deps/npm/man/man7/dependency-selectors.7 index 54d80fee4dc58d..e15648cb400af4 100644 --- a/deps/npm/man/man7/dependency-selectors.7 +++ b/deps/npm/man/man7/dependency-selectors.7 @@ -1,4 +1,4 @@ -.TH "QUERYING" "7" "October 2024" "NPM@10.9.0" "" +.TH "QUERYING" "7" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBQuerying\fR - Dependency Selector Syntax & Querying .SS "Description" diff --git a/deps/npm/man/man7/developers.7 b/deps/npm/man/man7/developers.7 index aa907f3f51deda..a5d429c60a5cef 100644 --- a/deps/npm/man/man7/developers.7 +++ b/deps/npm/man/man7/developers.7 @@ -1,4 +1,4 @@ -.TH "DEVELOPERS" "7" "October 2024" "NPM@10.9.0" "" +.TH "DEVELOPERS" "7" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBdevelopers\fR - Developer Guide .SS "Description" diff --git a/deps/npm/man/man7/logging.7 b/deps/npm/man/man7/logging.7 index f36ae6e4703048..200ad578584521 100644 --- a/deps/npm/man/man7/logging.7 +++ b/deps/npm/man/man7/logging.7 @@ -1,4 +1,4 @@ -.TH "LOGGING" "7" "October 2024" "NPM@10.9.0" "" +.TH "LOGGING" "7" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBLogging\fR - Why, What & How We Log .SS "Description" diff --git a/deps/npm/man/man7/orgs.7 b/deps/npm/man/man7/orgs.7 index 2866d7dd9800a5..8f12f6e0434a19 100644 --- a/deps/npm/man/man7/orgs.7 +++ b/deps/npm/man/man7/orgs.7 @@ -1,4 +1,4 @@ -.TH "ORGS" "7" "October 2024" "NPM@10.9.0" "" +.TH "ORGS" "7" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBorgs\fR - Working with Teams & Orgs .SS "Description" diff --git a/deps/npm/man/man7/package-spec.7 b/deps/npm/man/man7/package-spec.7 index 0d76a5f3017253..f8a0ac73903272 100644 --- a/deps/npm/man/man7/package-spec.7 +++ b/deps/npm/man/man7/package-spec.7 @@ -1,4 +1,4 @@ -.TH "PACKAGE-SPEC" "7" "October 2024" "NPM@10.9.0" "" +.TH "PACKAGE-SPEC" "7" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBpackage-spec\fR - Package name specifier .SS "Description" diff --git a/deps/npm/man/man7/registry.7 b/deps/npm/man/man7/registry.7 index 61ad2702f7b235..1e8134daaf751d 100644 --- a/deps/npm/man/man7/registry.7 +++ b/deps/npm/man/man7/registry.7 @@ -1,4 +1,4 @@ -.TH "REGISTRY" "7" "October 2024" "NPM@10.9.0" "" +.TH "REGISTRY" "7" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBregistry\fR - The JavaScript Package Registry .SS "Description" diff --git a/deps/npm/man/man7/removal.7 b/deps/npm/man/man7/removal.7 index a76b743553c304..74a7703f177e47 100644 --- a/deps/npm/man/man7/removal.7 +++ b/deps/npm/man/man7/removal.7 @@ -1,4 +1,4 @@ -.TH "REMOVAL" "7" "October 2024" "NPM@10.9.0" "" +.TH "REMOVAL" "7" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBremoval\fR - Cleaning the Slate .SS "Synopsis" diff --git a/deps/npm/man/man7/scope.7 b/deps/npm/man/man7/scope.7 index 94c22ccbd9f8fa..ccf0d9e7ee99c4 100644 --- a/deps/npm/man/man7/scope.7 +++ b/deps/npm/man/man7/scope.7 @@ -1,4 +1,4 @@ -.TH "SCOPE" "7" "October 2024" "NPM@10.9.0" "" +.TH "SCOPE" "7" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBscope\fR - Scoped packages .SS "Description" diff --git a/deps/npm/man/man7/scripts.7 b/deps/npm/man/man7/scripts.7 index 925d3181dc9174..1758473fc89dbb 100644 --- a/deps/npm/man/man7/scripts.7 +++ b/deps/npm/man/man7/scripts.7 @@ -1,4 +1,4 @@ -.TH "SCRIPTS" "7" "October 2024" "NPM@10.9.0" "" +.TH "SCRIPTS" "7" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBscripts\fR - How npm handles the "scripts" field .SS "Description" diff --git a/deps/npm/man/man7/workspaces.7 b/deps/npm/man/man7/workspaces.7 index 1812eb73eb7ece..cd7df95b81cf3e 100644 --- a/deps/npm/man/man7/workspaces.7 +++ b/deps/npm/man/man7/workspaces.7 @@ -1,4 +1,4 @@ -.TH "WORKSPACES" "7" "October 2024" "NPM@10.9.0" "" +.TH "WORKSPACES" "7" "December 2024" "NPM@10.9.2" "" .SH "NAME" \fBworkspaces\fR - Working with workspaces .SS "Description" diff --git a/deps/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex/index.js b/deps/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex/index.js index 130a0929b8ce8c..ddfdba39a783a4 100644 --- a/deps/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex/index.js +++ b/deps/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex/index.js @@ -1,7 +1,9 @@ export default function ansiRegex({onlyFirst = false} = {}) { + // Valid string terminator sequences are BEL, ESC\, and 0x9c + const ST = '(?:\\u0007|\\u001B\\u005C|\\u009C)'; const pattern = [ - '[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)', - '(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))' + `[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?${ST})`, + '(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]))', ].join('|'); return new RegExp(pattern, onlyFirst ? undefined : 'g'); diff --git a/deps/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex/package.json b/deps/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex/package.json index 7bbb563bf2a70a..49f3f61021512b 100644 --- a/deps/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex/package.json +++ b/deps/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex/package.json @@ -1,6 +1,6 @@ { "name": "ansi-regex", - "version": "6.0.1", + "version": "6.1.0", "description": "Regular expression for matching ANSI escape codes", "license": "MIT", "repository": "chalk/ansi-regex", @@ -12,6 +12,8 @@ }, "type": "module", "exports": "./index.js", + "types": "./index.d.ts", + "sideEffects": false, "engines": { "node": ">=12" }, @@ -51,8 +53,9 @@ "pattern" ], "devDependencies": { + "ansi-escapes": "^5.0.0", "ava": "^3.15.0", - "tsd": "^0.14.0", - "xo": "^0.38.2" + "tsd": "^0.21.0", + "xo": "^0.54.2" } } diff --git a/deps/npm/node_modules/@npmcli/map-workspaces/lib/index.js b/deps/npm/node_modules/@npmcli/map-workspaces/lib/index.js index 1b39d2e3f67e08..f38b8cd33b74f7 100644 --- a/deps/npm/node_modules/@npmcli/map-workspaces/lib/index.js +++ b/deps/npm/node_modules/@npmcli/map-workspaces/lib/index.js @@ -134,7 +134,7 @@ async function mapWorkspaces (opts = {}) { try { pkg = await pkgJson.normalize(path.join(opts.cwd, match)) } catch (err) { - if (err.code === 'ENOENT') { + if (err.code === 'ENOENT' || err.code === 'ENOTDIR') { continue } else { throw err diff --git a/deps/npm/node_modules/@npmcli/map-workspaces/package.json b/deps/npm/node_modules/@npmcli/map-workspaces/package.json index f2667f25e9d5d2..78a515e027b011 100644 --- a/deps/npm/node_modules/@npmcli/map-workspaces/package.json +++ b/deps/npm/node_modules/@npmcli/map-workspaces/package.json @@ -1,6 +1,6 @@ { "name": "@npmcli/map-workspaces", - "version": "4.0.1", + "version": "4.0.2", "main": "lib/index.js", "files": [ "bin/", @@ -44,7 +44,7 @@ }, "devDependencies": { "@npmcli/eslint-config": "^5.0.0", - "@npmcli/template-oss": "4.23.3", + "@npmcli/template-oss": "4.23.4", "tap": "^16.0.1" }, "dependencies": { @@ -55,7 +55,7 @@ }, "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.23.3", + "version": "4.23.4", "publish": "true" } } diff --git a/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/LICENSE b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/LICENSE new file mode 100644 index 00000000000000..a03cd0ed0b338b --- /dev/null +++ b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter, Kat Marchán, npm, Inc., and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/README.md b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/README.md new file mode 100644 index 00000000000000..dbb0051de23a4d --- /dev/null +++ b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/README.md @@ -0,0 +1,283 @@ +# pacote + +Fetches package manifests and tarballs from the npm registry. + +## USAGE + +```js +const pacote = require('pacote') + +// get a package manifest +pacote.manifest('foo@1.x').then(manifest => console.log('got it', manifest)) + +// extract a package into a folder +pacote.extract('github:npm/cli', 'some/path', options) + .then(({from, resolved, integrity}) => { + console.log('extracted!', from, resolved, integrity) + }) + +pacote.tarball('https://server.com/package.tgz').then(data => { + console.log('got ' + data.length + ' bytes of tarball data') +}) +``` + +`pacote` works with any kind of package specifier that npm can install. If +you can pass it to the npm CLI, you can pass it to pacote. (In fact, that's +exactly what the npm CLI does.) + +Anything that you can do with one kind of package, you can do with another. + +Data that isn't relevant (like a packument for a tarball) will be +simulated. + +`prepare` scripts will be run when generating tarballs from `git` and +`directory` locations, to simulate what _would_ be published to the +registry, so that you get a working package instead of just raw source +code that might need to be transpiled. + +## CLI + +This module exports a command line interface that can do most of what is +described below. Run `pacote -h` to learn more. + +``` +Pacote - The JavaScript Package Handler, v10.1.1 + +Usage: + + pacote resolve + Resolve a specifier and output the fully resolved target + Returns integrity and from if '--long' flag is set. + + pacote manifest + Fetch a manifest and print to stdout + + pacote packument + Fetch a full packument and print to stdout + + pacote tarball [] + Fetch a package tarball and save to + If is missing or '-', the tarball will be streamed to stdout. + + pacote extract + Extract a package to the destination folder. + +Configuration values all match the names of configs passed to npm, or +options passed to Pacote. Additional flags for this executable: + + --long Print an object from 'resolve', including integrity and spec. + --json Print result objects as JSON rather than node's default. + (This is the default if stdout is not a TTY.) + --help -h Print this helpful text. + +For example '--cache=/path/to/folder' will use that folder as the cache. +``` + +## API + +The `spec` refers to any kind of package specifier that npm can install. +If you can pass it to the npm CLI, you can pass it to pacote. (In fact, +that's exactly what the npm CLI does.) + +See below for valid `opts` values. + +* `pacote.resolve(spec, opts)` Resolve a specifier like `foo@latest` or + `github:user/project` all the way to a tarball url, tarball file, or git + repo with commit hash. + +* `pacote.extract(spec, dest, opts)` Extract a package's tarball into a + destination folder. Returns a promise that resolves to the + `{from,resolved,integrity}` of the extracted package. + +* `pacote.manifest(spec, opts)` Fetch (or simulate) a package's manifest + (basically, the `package.json` file, plus a bit of metadata). + See below for more on manifests and packuments. Returns a Promise that + resolves to the manifest object. + +* `pacote.packument(spec, opts)` Fetch (or simulate) a package's packument + (basically, the top-level package document listing all the manifests that + the registry returns). See below for more on manifests and packuments. + Returns a Promise that resolves to the packument object. + +* `pacote.tarball(spec, opts)` Get a package tarball data as a buffer in + memory. Returns a Promise that resolves to the tarball data Buffer, with + `from`, `resolved`, and `integrity` fields attached. + +* `pacote.tarball.file(spec, dest, opts)` Save a package tarball data to + a file on disk. Returns a Promise that resolves to + `{from,integrity,resolved}` of the fetched tarball. + +* `pacote.tarball.stream(spec, streamHandler, opts)` Fetch a tarball and + make the stream available to the `streamHandler` function. + + This is mostly an internal function, but it is exposed because it does + provide some functionality that may be difficult to achieve otherwise. + + The `streamHandler` function MUST return a Promise that resolves when + the stream (and all associated work) is ended, or rejects if the stream + has an error. + + The `streamHandler` function MAY be called multiple times, as Pacote + retries requests in some scenarios, such as cache corruption or + retriable network failures. + +### Options + +Options are passed to +[`npm-registry-fetch`](http://npm.im/npm-registry-fetch) and +[`cacache`](http://npm.im/cacache), so in addition to these, anything for +those modules can be given to pacote as well. + +Options object is cloned, and mutated along the way to add integrity, +resolved, and other properties, as they are determined. + +* `cache` Where to store cache entries and temp files. Passed to + [`cacache`](http://npm.im/cacache). Defaults to the same cache directory + that npm will use by default, based on platform and environment. +* `where` Base folder for resolving relative `file:` dependencies. +* `resolved` Shortcut for looking up resolved values. Should be specified + if known. +* `integrity` Expected integrity of fetched package tarball. If specified, + tarballs with mismatched integrity values will raise an `EINTEGRITY` + error. +* `umask` Permission mode mask for extracted files and directories. + Defaults to `0o22`. See "Extracted File Modes" below. +* `fmode` Minimum permission mode for extracted files. Defaults to + `0o666`. See "Extracted File Modes" below. +* `dmode` Minimum permission mode for extracted directories. Defaults to + `0o777`. See "Extracted File Modes" below. +* `preferOnline` Prefer to revalidate cache entries, even when it would not + be strictly necessary. Default `false`. +* `before` When picking a manifest from a packument, only consider + packages published before the specified date. Default `null`. +* `defaultTag` The default `dist-tag` to use when choosing a manifest from a + packument. Defaults to `latest`. +* `registry` The npm registry to use by default. Defaults to + `https://registry.npmjs.org/`. +* `fullMetadata` Fetch the full metadata from the registry for packuments, + including information not strictly required for installation (author, + description, etc.) Defaults to `true` when `before` is set, since the + version publish time is part of the extended packument metadata. +* `fullReadJson` Use the slower `read-package-json` package insted of + `read-package-json-fast` in order to include extra fields like "readme" in + the manifest. Defaults to `false`. +* `packumentCache` For registry packuments only, you may provide a `Map` + object which will be used to cache packument requests between pacote + calls. This allows you to easily avoid hitting the registry multiple + times (even just to validate the cache) for a given packument, since it + is unlikely to change in the span of a single command. +* `verifySignatures` A boolean that will make pacote verify the + integrity signature of a manifest, if present. There must be a + configured `_keys` entry in the config that is scoped to the + registry the manifest is being fetched from. +* `verifyAttestations` A boolean that will make pacote verify Sigstore + attestations, if present. There must be a configured `_keys` entry in the + config that is scoped to the registry the manifest is being fetched from. +* `tufCache` Where to store metadata/target files when retrieving the package + attestation key material via TUF. Defaults to the same cache directory that + npm will use by default, based on platform and environment. + +### Advanced API + +Each different type of fetcher is exposed for more advanced usage such as +using helper methods from this classes: + +* `DirFetcher` +* `FileFetcher` +* `GitFetcher` +* `RegistryFetcher` +* `RemoteFetcher` + +## Extracted File Modes + +Files are extracted with a mode matching the following formula: + +``` +( (tarball entry mode value) | (minimum mode option) ) ~ (umask) +``` + +This is in order to prevent unreadable files or unlistable directories from +cluttering a project's `node_modules` folder, even if the package tarball +specifies that the file should be inaccessible. + +It also prevents files from being group- or world-writable without explicit +opt-in by the user, because all file and directory modes are masked against +the `umask` value. + +So, a file which is `0o771` in the tarball, using the default `fmode` of +`0o666` and `umask` of `0o22`, will result in a file mode of `0o755`: + +``` +(0o771 | 0o666) => 0o777 +(0o777 ~ 0o22) => 0o755 +``` + +In almost every case, the defaults are appropriate. To respect exactly +what is in the package tarball (even if this makes an unusable system), set +both `dmode` and `fmode` options to `0`. Otherwise, the `umask` config +should be used in most cases where file mode modifications are required, +and this functions more or less the same as the `umask` value in most Unix +systems. + +## Extracted File Ownership + +When running as `root` on Unix systems, all extracted files and folders +will have their owning `uid` and `gid` values set to match the ownership +of the containing folder. + +This prevents `root`-owned files showing up in a project's `node_modules` +folder when a user runs `sudo npm install`. + +## Manifests + +A `manifest` is similar to a `package.json` file. However, it has a few +pieces of extra metadata, and sometimes lacks metadata that is inessential +to package installation. + +In addition to the common `package.json` fields, manifests include: + +* `manifest._resolved` The tarball url or file path where the package + artifact can be found. +* `manifest._from` A normalized form of the spec passed in as an argument. +* `manifest._integrity` The integrity value for the package artifact. +* `manifest._id` The canonical spec of this package version: name@version. +* `manifest.dist` Registry manifests (those included in a packument) have a + `dist` object. Only `tarball` is required, though at least one of + `shasum` or `integrity` is almost always present. + + * `tarball` The url to the associated package artifact. (Copied by + Pacote to `manifest._resolved`.) + * `integrity` The integrity SRI string for the artifact. This may not + be present for older packages on the npm registry. (Copied by Pacote + to `manifest._integrity`.) + * `shasum` Legacy integrity value. Hexadecimal-encoded sha1 hash. + (Converted to an SRI string and copied by Pacote to + `manifest._integrity` when `dist.integrity` is not present.) + * `fileCount` Number of files in the tarball. + * `unpackedSize` Size on disk of the package when unpacked. + * `signatures` Signatures of the shasum. Includes the keyid that + correlates to a [`key from the npm + registry`](https://registry.npmjs.org/-/npm/v1/keys) + +## Packuments + +A packument is the top-level package document that lists the set of +manifests for available versions for a package. + +When a packument is fetched with `accept: +application/vnd.npm.install-v1+json` in the HTTP headers, only the most +minimum necessary metadata is returned. Additional metadata is returned +when fetched with only `accept: application/json`. + +For Pacote's purposes, the following fields are relevant: + +* `versions` An object where each key is a version, and each value is the + manifest for that version. +* `dist-tags` An object mapping dist-tags to version numbers. This is how + `foo@latest` gets turned into `foo@1.2.3`. +* `time` In the full packument, an object mapping version numbers to + publication times, for the `opts.before` functionality. + +Pacote adds the following field, regardless of the accept header: + +* `_contentLength` The size of the packument. diff --git a/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/bin/index.js b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/bin/index.js new file mode 100755 index 00000000000000..f35b62ca71a537 --- /dev/null +++ b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/bin/index.js @@ -0,0 +1,158 @@ +#!/usr/bin/env node + +const run = conf => { + const pacote = require('../') + switch (conf._[0]) { + case 'resolve': + case 'manifest': + case 'packument': + if (conf._[0] === 'resolve' && conf.long) { + return pacote.manifest(conf._[1], conf).then(mani => ({ + resolved: mani._resolved, + integrity: mani._integrity, + from: mani._from, + })) + } + return pacote[conf._[0]](conf._[1], conf) + + case 'tarball': + if (!conf._[2] || conf._[2] === '-') { + return pacote.tarball.stream(conf._[1], stream => { + stream.pipe( + conf.testStdout || + /* istanbul ignore next */ + process.stdout + ) + // make sure it resolves something falsey + return stream.promise().then(() => { + return false + }) + }, conf) + } else { + return pacote.tarball.file(conf._[1], conf._[2], conf) + } + + case 'extract': + return pacote.extract(conf._[1], conf._[2], conf) + + default: /* istanbul ignore next */ { + throw new Error(`bad command: ${conf._[0]}`) + } + } +} + +const version = require('../package.json').version +const usage = () => +`Pacote - The JavaScript Package Handler, v${version} + +Usage: + + pacote resolve + Resolve a specifier and output the fully resolved target + Returns integrity and from if '--long' flag is set. + + pacote manifest + Fetch a manifest and print to stdout + + pacote packument + Fetch a full packument and print to stdout + + pacote tarball [] + Fetch a package tarball and save to + If is missing or '-', the tarball will be streamed to stdout. + + pacote extract + Extract a package to the destination folder. + +Configuration values all match the names of configs passed to npm, or +options passed to Pacote. Additional flags for this executable: + + --long Print an object from 'resolve', including integrity and spec. + --json Print result objects as JSON rather than node's default. + (This is the default if stdout is not a TTY.) + --help -h Print this helpful text. + +For example '--cache=/path/to/folder' will use that folder as the cache. +` + +const shouldJSON = (conf, result) => + conf.json || + !process.stdout.isTTY && + conf.json === undefined && + result && + typeof result === 'object' + +const pretty = (conf, result) => + shouldJSON(conf, result) ? JSON.stringify(result, 0, 2) : result + +let addedLogListener = false +const main = args => { + const conf = parse(args) + if (conf.help || conf.h) { + return console.log(usage()) + } + + if (!addedLogListener) { + process.on('log', console.error) + addedLogListener = true + } + + try { + return run(conf) + .then(result => result && console.log(pretty(conf, result))) + .catch(er => { + console.error(er) + process.exit(1) + }) + } catch (er) { + console.error(er.message) + console.error(usage()) + } +} + +const parseArg = arg => { + const split = arg.slice(2).split('=') + const k = split.shift() + const v = split.join('=') + const no = /^no-/.test(k) && !v + const key = (no ? k.slice(3) : k) + .replace(/^tag$/, 'defaultTag') + .replace(/-([a-z])/g, (_, c) => c.toUpperCase()) + const value = v ? v.replace(/^~/, process.env.HOME) : !no + return { key, value } +} + +const parse = args => { + const conf = { + _: [], + cache: process.env.HOME + '/.npm/_cacache', + } + let dashdash = false + args.forEach(arg => { + if (dashdash) { + conf._.push(arg) + } else if (arg === '--') { + dashdash = true + } else if (arg === '-h') { + conf.help = true + } else if (/^--/.test(arg)) { + const { key, value } = parseArg(arg) + conf[key] = value + } else { + conf._.push(arg) + } + }) + return conf +} + +if (module === require.main) { + main(process.argv.slice(2)) +} else { + module.exports = { + main, + run, + usage, + parseArg, + parse, + } +} diff --git a/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/dir.js b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/dir.js new file mode 100644 index 00000000000000..04846eb8a6e221 --- /dev/null +++ b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/dir.js @@ -0,0 +1,105 @@ +const { resolve } = require('node:path') +const packlist = require('npm-packlist') +const runScript = require('@npmcli/run-script') +const tar = require('tar') +const { Minipass } = require('minipass') +const Fetcher = require('./fetcher.js') +const FileFetcher = require('./file.js') +const _ = require('./util/protected.js') +const tarCreateOptions = require('./util/tar-create-options.js') + +class DirFetcher extends Fetcher { + constructor (spec, opts) { + super(spec, opts) + // just the fully resolved filename + this.resolved = this.spec.fetchSpec + + this.tree = opts.tree || null + this.Arborist = opts.Arborist || null + } + + // exposes tarCreateOptions as public API + static tarCreateOptions (manifest) { + return tarCreateOptions(manifest) + } + + get types () { + return ['directory'] + } + + #prepareDir () { + return this.manifest().then(mani => { + if (!mani.scripts || !mani.scripts.prepare) { + return + } + if (this.opts.ignoreScripts) { + return + } + + // we *only* run prepare. + // pre/post-pack is run by the npm CLI for publish and pack, + // but this function is *also* run when installing git deps + const stdio = this.opts.foregroundScripts ? 'inherit' : 'pipe' + + return runScript({ + // this || undefined is because runScript will be unhappy with the default null value + scriptShell: this.opts.scriptShell || undefined, + pkg: mani, + event: 'prepare', + path: this.resolved, + stdio, + env: { + npm_package_resolved: this.resolved, + npm_package_integrity: this.integrity, + npm_package_json: resolve(this.resolved, 'package.json'), + }, + }) + }) + } + + [_.tarballFromResolved] () { + if (!this.tree && !this.Arborist) { + throw new Error('DirFetcher requires either a tree or an Arborist constructor to pack') + } + + const stream = new Minipass() + stream.resolved = this.resolved + stream.integrity = this.integrity + + const { prefix, workspaces } = this.opts + + // run the prepare script, get the list of files, and tar it up + // pipe to the stream, and proxy errors the chain. + this.#prepareDir() + .then(async () => { + if (!this.tree) { + const arb = new this.Arborist({ path: this.resolved }) + this.tree = await arb.loadActual() + } + return packlist(this.tree, { path: this.resolved, prefix, workspaces }) + }) + .then(files => tar.c(tarCreateOptions(this.package), files) + .on('error', er => stream.emit('error', er)).pipe(stream)) + .catch(er => stream.emit('error', er)) + return stream + } + + manifest () { + if (this.package) { + return Promise.resolve(this.package) + } + + return this[_.readPackageJson](this.resolved) + .then(mani => this.package = { + ...mani, + _integrity: this.integrity && String(this.integrity), + _resolved: this.resolved, + _from: this.from, + }) + } + + packument () { + return FileFetcher.prototype.packument.apply(this) + } +} +module.exports = DirFetcher diff --git a/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/fetcher.js b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/fetcher.js new file mode 100644 index 00000000000000..f2ac97619d3af1 --- /dev/null +++ b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/fetcher.js @@ -0,0 +1,497 @@ +// This is the base class that the other fetcher types in lib +// all descend from. +// It handles the unpacking and retry logic that is shared among +// all of the other Fetcher types. + +const { basename, dirname } = require('node:path') +const { rm, mkdir } = require('node:fs/promises') +const PackageJson = require('@npmcli/package-json') +const cacache = require('cacache') +const fsm = require('fs-minipass') +const getContents = require('@npmcli/installed-package-contents') +const npa = require('npm-package-arg') +const retry = require('promise-retry') +const ssri = require('ssri') +const tar = require('tar') +const { Minipass } = require('minipass') +const { log } = require('proc-log') +const _ = require('./util/protected.js') +const cacheDir = require('./util/cache-dir.js') +const isPackageBin = require('./util/is-package-bin.js') +const removeTrailingSlashes = require('./util/trailing-slashes.js') + +// Pacote is only concerned with the package.json contents +const packageJsonPrepare = (p) => PackageJson.prepare(p).then(pkg => pkg.content) +const packageJsonNormalize = (p) => PackageJson.normalize(p).then(pkg => pkg.content) + +class FetcherBase { + constructor (spec, opts) { + if (!opts || typeof opts !== 'object') { + throw new TypeError('options object is required') + } + this.spec = npa(spec, opts.where) + + this.allowGitIgnore = !!opts.allowGitIgnore + + // a bit redundant because presumably the caller already knows this, + // but it makes it easier to not have to keep track of the requested + // spec when we're dispatching thousands of these at once, and normalizing + // is nice. saveSpec is preferred if set, because it turns stuff like + // x/y#committish into github:x/y#committish. use name@rawSpec for + // registry deps so that we turn xyz and xyz@ -> xyz@ + this.from = this.spec.registry + ? `${this.spec.name}@${this.spec.rawSpec}` : this.spec.saveSpec + + this.#assertType() + // clone the opts object so that others aren't upset when we mutate it + // by adding/modifying the integrity value. + this.opts = { ...opts } + + this.cache = opts.cache || cacheDir().cacache + this.tufCache = opts.tufCache || cacheDir().tufcache + this.resolved = opts.resolved || null + + // default to caching/verifying with sha512, that's what we usually have + // need to change this default, or start overriding it, when sha512 + // is no longer strong enough. + this.defaultIntegrityAlgorithm = opts.defaultIntegrityAlgorithm || 'sha512' + + if (typeof opts.integrity === 'string') { + this.opts.integrity = ssri.parse(opts.integrity) + } + + this.package = null + this.type = this.constructor.name + this.fmode = opts.fmode || 0o666 + this.dmode = opts.dmode || 0o777 + // we don't need a default umask, because we don't chmod files coming + // out of package tarballs. they're forced to have a mode that is + // valid, regardless of what's in the tarball entry, and then we let + // the process's umask setting do its job. but if configured, we do + // respect it. + this.umask = opts.umask || 0 + + this.preferOnline = !!opts.preferOnline + this.preferOffline = !!opts.preferOffline + this.offline = !!opts.offline + + this.before = opts.before + this.fullMetadata = this.before ? true : !!opts.fullMetadata + this.fullReadJson = !!opts.fullReadJson + this[_.readPackageJson] = this.fullReadJson + ? packageJsonPrepare + : packageJsonNormalize + + // rrh is a registry hostname or 'never' or 'always' + // defaults to registry.npmjs.org + this.replaceRegistryHost = (!opts.replaceRegistryHost || opts.replaceRegistryHost === 'npmjs') ? + 'registry.npmjs.org' : opts.replaceRegistryHost + + this.defaultTag = opts.defaultTag || 'latest' + this.registry = removeTrailingSlashes(opts.registry || 'https://registry.npmjs.org') + + // command to run 'prepare' scripts on directories and git dirs + // To use pacote with yarn, for example, set npmBin to 'yarn' + // and npmCliConfig with yarn's equivalents. + this.npmBin = opts.npmBin || 'npm' + + // command to install deps for preparing + this.npmInstallCmd = opts.npmInstallCmd || ['install', '--force'] + + // XXX fill more of this in based on what we know from this.opts + // we explicitly DO NOT fill in --tag, though, since we are often + // going to be packing in the context of a publish, which may set + // a dist-tag, but certainly wants to keep defaulting to latest. + this.npmCliConfig = opts.npmCliConfig || [ + `--cache=${dirname(this.cache)}`, + `--prefer-offline=${!!this.preferOffline}`, + `--prefer-online=${!!this.preferOnline}`, + `--offline=${!!this.offline}`, + ...(this.before ? [`--before=${this.before.toISOString()}`] : []), + '--no-progress', + '--no-save', + '--no-audit', + // override any omit settings from the environment + '--include=dev', + '--include=peer', + '--include=optional', + // we need the actual things, not just the lockfile + '--no-package-lock-only', + '--no-dry-run', + ] + } + + get integrity () { + return this.opts.integrity || null + } + + set integrity (i) { + if (!i) { + return + } + + i = ssri.parse(i) + const current = this.opts.integrity + + // do not ever update an existing hash value, but do + // merge in NEW algos and hashes that we don't already have. + if (current) { + current.merge(i) + } else { + this.opts.integrity = i + } + } + + get notImplementedError () { + return new Error('not implemented in this fetcher type: ' + this.type) + } + + // override in child classes + // Returns a Promise that resolves to this.resolved string value + resolve () { + return this.resolved ? Promise.resolve(this.resolved) + : Promise.reject(this.notImplementedError) + } + + packument () { + return Promise.reject(this.notImplementedError) + } + + // override in child class + // returns a manifest containing: + // - name + // - version + // - _resolved + // - _integrity + // - plus whatever else was in there (corgi, full metadata, or pj file) + manifest () { + return Promise.reject(this.notImplementedError) + } + + // private, should be overridden. + // Note that they should *not* calculate or check integrity or cache, + // but *just* return the raw tarball data stream. + [_.tarballFromResolved] () { + throw this.notImplementedError + } + + // public, should not be overridden + tarball () { + return this.tarballStream(stream => stream.concat().then(data => { + data.integrity = this.integrity && String(this.integrity) + data.resolved = this.resolved + data.from = this.from + return data + })) + } + + // private + // Note: cacache will raise a EINTEGRITY error if the integrity doesn't match + #tarballFromCache () { + const startTime = Date.now() + const stream = cacache.get.stream.byDigest(this.cache, this.integrity, this.opts) + const elapsedTime = Date.now() - startTime + // cache is good, so log it as a hit in particular since there was no fetch logged + log.http( + 'cache', + `${this.spec} ${elapsedTime}ms (cache hit)` + ) + return stream + } + + get [_.cacheFetches] () { + return true + } + + #istream (stream) { + // if not caching this, just return it + if (!this.opts.cache || !this[_.cacheFetches]) { + // instead of creating a new integrity stream, we only piggyback on the + // provided stream's events + if (stream.hasIntegrityEmitter) { + stream.on('integrity', i => this.integrity = i) + return stream + } + + const istream = ssri.integrityStream(this.opts) + istream.on('integrity', i => this.integrity = i) + stream.on('error', err => istream.emit('error', err)) + return stream.pipe(istream) + } + + // we have to return a stream that gets ALL the data, and proxies errors, + // but then pipe from the original tarball stream into the cache as well. + // To do this without losing any data, and since the cacache put stream + // is not a passthrough, we have to pipe from the original stream into + // the cache AFTER we pipe into the middleStream. Since the cache stream + // has an asynchronous flush to write its contents to disk, we need to + // defer the middleStream end until the cache stream ends. + const middleStream = new Minipass() + stream.on('error', err => middleStream.emit('error', err)) + stream.pipe(middleStream, { end: false }) + const cstream = cacache.put.stream( + this.opts.cache, + `pacote:tarball:${this.from}`, + this.opts + ) + cstream.on('integrity', i => this.integrity = i) + cstream.on('error', err => stream.emit('error', err)) + stream.pipe(cstream) + + // eslint-disable-next-line promise/catch-or-return + cstream.promise().catch(() => {}).then(() => middleStream.end()) + return middleStream + } + + pickIntegrityAlgorithm () { + return this.integrity ? this.integrity.pickAlgorithm(this.opts) + : this.defaultIntegrityAlgorithm + } + + // TODO: check error class, once those are rolled out to our deps + isDataCorruptionError (er) { + return er.code === 'EINTEGRITY' || er.code === 'Z_DATA_ERROR' + } + + // override the types getter + get types () { + return false + } + + #assertType () { + if (this.types && !this.types.includes(this.spec.type)) { + throw new TypeError(`Wrong spec type (${ + this.spec.type + }) for ${ + this.constructor.name + }. Supported types: ${this.types.join(', ')}`) + } + } + + // We allow ENOENTs from cacache, but not anywhere else. + // An ENOENT trying to read a tgz file, for example, is Right Out. + isRetriableError (er) { + // TODO: check error class, once those are rolled out to our deps + return this.isDataCorruptionError(er) || + er.code === 'ENOENT' || + er.code === 'EISDIR' + } + + // Mostly internal, but has some uses + // Pass in a function which returns a promise + // Function will be called 1 or more times with streams that may fail. + // Retries: + // Function MUST handle errors on the stream by rejecting the promise, + // so that retry logic can pick it up and either retry or fail whatever + // promise it was making (ie, failing extraction, etc.) + // + // The return value of this method is a Promise that resolves the same + // as whatever the streamHandler resolves to. + // + // This should never be overridden by child classes, but it is public. + tarballStream (streamHandler) { + // Only short-circuit via cache if we have everything else we'll need, + // and the user has not expressed a preference for checking online. + + const fromCache = ( + !this.preferOnline && + this.integrity && + this.resolved + ) ? streamHandler(this.#tarballFromCache()).catch(er => { + if (this.isDataCorruptionError(er)) { + log.warn('tarball', `cached data for ${ + this.spec + } (${this.integrity}) seems to be corrupted. Refreshing cache.`) + return this.cleanupCached().then(() => { + throw er + }) + } else { + throw er + } + }) : null + + const fromResolved = er => { + if (er) { + if (!this.isRetriableError(er)) { + throw er + } + log.silly('tarball', `no local data for ${ + this.spec + }. Extracting by manifest.`) + } + return this.resolve().then(() => retry(tryAgain => + streamHandler(this.#istream(this[_.tarballFromResolved]())) + .catch(streamErr => { + // Most likely data integrity. A cache ENOENT error is unlikely + // here, since we're definitely not reading from the cache, but it + // IS possible that the fetch subsystem accessed the cache, and the + // entry got blown away or something. Try one more time to be sure. + if (this.isRetriableError(streamErr)) { + log.warn('tarball', `tarball data for ${ + this.spec + } (${this.integrity}) seems to be corrupted. Trying again.`) + return this.cleanupCached().then(() => tryAgain(streamErr)) + } + throw streamErr + }), { retries: 1, minTimeout: 0, maxTimeout: 0 })) + } + + return fromCache ? fromCache.catch(fromResolved) : fromResolved() + } + + cleanupCached () { + return cacache.rm.content(this.cache, this.integrity, this.opts) + } + + #empty (path) { + return getContents({ path, depth: 1 }).then(contents => Promise.all( + contents.map(entry => rm(entry, { recursive: true, force: true })))) + } + + async #mkdir (dest) { + await this.#empty(dest) + return await mkdir(dest, { recursive: true }) + } + + // extraction is always the same. the only difference is where + // the tarball comes from. + async extract (dest) { + await this.#mkdir(dest) + return this.tarballStream((tarball) => this.#extract(dest, tarball)) + } + + #toFile (dest) { + return this.tarballStream(str => new Promise((res, rej) => { + const writer = new fsm.WriteStream(dest) + str.on('error', er => writer.emit('error', er)) + writer.on('error', er => rej(er)) + writer.on('close', () => res({ + integrity: this.integrity && String(this.integrity), + resolved: this.resolved, + from: this.from, + })) + str.pipe(writer) + })) + } + + // don't use this.#mkdir because we don't want to rimraf anything + async tarballFile (dest) { + const dir = dirname(dest) + await mkdir(dir, { recursive: true }) + return this.#toFile(dest) + } + + #extract (dest, tarball) { + const extractor = tar.x(this.#tarxOptions({ cwd: dest })) + const p = new Promise((resolve, reject) => { + extractor.on('end', () => { + resolve({ + resolved: this.resolved, + integrity: this.integrity && String(this.integrity), + from: this.from, + }) + }) + + extractor.on('error', er => { + log.warn('tar', er.message) + log.silly('tar', er) + reject(er) + }) + + tarball.on('error', er => reject(er)) + }) + + tarball.pipe(extractor) + return p + } + + // always ensure that entries are at least as permissive as our configured + // dmode/fmode, but never more permissive than the umask allows. + #entryMode (path, mode, type) { + const m = /Directory|GNUDumpDir/.test(type) ? this.dmode + : /File$/.test(type) ? this.fmode + : /* istanbul ignore next - should never happen in a pkg */ 0 + + // make sure package bins are executable + const exe = isPackageBin(this.package, path) ? 0o111 : 0 + // always ensure that files are read/writable by the owner + return ((mode | m) & ~this.umask) | exe | 0o600 + } + + #tarxOptions ({ cwd }) { + const sawIgnores = new Set() + return { + cwd, + noChmod: true, + noMtime: true, + filter: (name, entry) => { + if (/Link$/.test(entry.type)) { + return false + } + entry.mode = this.#entryMode(entry.path, entry.mode, entry.type) + // this replicates the npm pack behavior where .gitignore files + // are treated like .npmignore files, but only if a .npmignore + // file is not present. + if (/File$/.test(entry.type)) { + const base = basename(entry.path) + if (base === '.npmignore') { + sawIgnores.add(entry.path) + } else if (base === '.gitignore' && !this.allowGitIgnore) { + // rename, but only if there's not already a .npmignore + const ni = entry.path.replace(/\.gitignore$/, '.npmignore') + if (sawIgnores.has(ni)) { + return false + } + entry.path = ni + } + return true + } + }, + strip: 1, + onwarn: /* istanbul ignore next - we can trust that tar logs */ + (code, msg, data) => { + log.warn('tar', code, msg) + log.silly('tar', code, msg, data) + }, + umask: this.umask, + // always ignore ownership info from tarball metadata + preserveOwner: false, + } + } +} + +module.exports = FetcherBase + +// Child classes +const GitFetcher = require('./git.js') +const RegistryFetcher = require('./registry.js') +const FileFetcher = require('./file.js') +const DirFetcher = require('./dir.js') +const RemoteFetcher = require('./remote.js') + +// Get an appropriate fetcher object from a spec and options +FetcherBase.get = (rawSpec, opts = {}) => { + const spec = npa(rawSpec, opts.where) + switch (spec.type) { + case 'git': + return new GitFetcher(spec, opts) + + case 'remote': + return new RemoteFetcher(spec, opts) + + case 'version': + case 'range': + case 'tag': + case 'alias': + return new RegistryFetcher(spec.subSpec || spec, opts) + + case 'file': + return new FileFetcher(spec, opts) + + case 'directory': + return new DirFetcher(spec, opts) + + default: + throw new TypeError('Unknown spec type: ' + spec.type) + } +} diff --git a/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/file.js b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/file.js new file mode 100644 index 00000000000000..2021325085e4f0 --- /dev/null +++ b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/file.js @@ -0,0 +1,94 @@ +const { resolve } = require('node:path') +const { stat, chmod } = require('node:fs/promises') +const cacache = require('cacache') +const fsm = require('fs-minipass') +const Fetcher = require('./fetcher.js') +const _ = require('./util/protected.js') + +class FileFetcher extends Fetcher { + constructor (spec, opts) { + super(spec, opts) + // just the fully resolved filename + this.resolved = this.spec.fetchSpec + } + + get types () { + return ['file'] + } + + manifest () { + if (this.package) { + return Promise.resolve(this.package) + } + + // have to unpack the tarball for this. + return cacache.tmp.withTmp(this.cache, this.opts, dir => + this.extract(dir) + .then(() => this[_.readPackageJson](dir)) + .then(mani => this.package = { + ...mani, + _integrity: this.integrity && String(this.integrity), + _resolved: this.resolved, + _from: this.from, + })) + } + + #exeBins (pkg, dest) { + if (!pkg.bin) { + return Promise.resolve() + } + + return Promise.all(Object.keys(pkg.bin).map(async k => { + const script = resolve(dest, pkg.bin[k]) + // Best effort. Ignore errors here, the only result is that + // a bin script is not executable. But if it's missing or + // something, we just leave it for a later stage to trip over + // when we can provide a more useful contextual error. + try { + const st = await stat(script) + const mode = st.mode | 0o111 + if (mode === st.mode) { + return + } + await chmod(script, mode) + } catch { + // Ignore errors here + } + })) + } + + extract (dest) { + // if we've already loaded the manifest, then the super got it. + // but if not, read the unpacked manifest and chmod properly. + return super.extract(dest) + .then(result => this.package ? result + : this[_.readPackageJson](dest).then(pkg => + this.#exeBins(pkg, dest)).then(() => result)) + } + + [_.tarballFromResolved] () { + // create a read stream and return it + return new fsm.ReadStream(this.resolved) + } + + packument () { + // simulate based on manifest + return this.manifest().then(mani => ({ + name: mani.name, + 'dist-tags': { + [this.defaultTag]: mani.version, + }, + versions: { + [mani.version]: { + ...mani, + dist: { + tarball: `file:${this.resolved}`, + integrity: this.integrity && String(this.integrity), + }, + }, + }, + })) + } +} + +module.exports = FileFetcher diff --git a/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/git.js b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/git.js new file mode 100644 index 00000000000000..077193a86f026f --- /dev/null +++ b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/git.js @@ -0,0 +1,317 @@ +const cacache = require('cacache') +const git = require('@npmcli/git') +const npa = require('npm-package-arg') +const pickManifest = require('npm-pick-manifest') +const { Minipass } = require('minipass') +const { log } = require('proc-log') +const DirFetcher = require('./dir.js') +const Fetcher = require('./fetcher.js') +const FileFetcher = require('./file.js') +const RemoteFetcher = require('./remote.js') +const _ = require('./util/protected.js') +const addGitSha = require('./util/add-git-sha.js') +const npm = require('./util/npm.js') + +const hashre = /^[a-f0-9]{40}$/ + +// get the repository url. +// prefer https if there's auth, since ssh will drop that. +// otherwise, prefer ssh if available (more secure). +// We have to add the git+ back because npa suppresses it. +const repoUrl = (h, opts) => + h.sshurl && !(h.https && h.auth) && addGitPlus(h.sshurl(opts)) || + h.https && addGitPlus(h.https(opts)) + +// add git+ to the url, but only one time. +const addGitPlus = url => url && `git+${url}`.replace(/^(git\+)+/, 'git+') + +class GitFetcher extends Fetcher { + constructor (spec, opts) { + super(spec, opts) + + // we never want to compare integrity for git dependencies: npm/rfcs#525 + if (this.opts.integrity) { + delete this.opts.integrity + log.warn(`skipping integrity check for git dependency ${this.spec.fetchSpec}`) + } + + this.resolvedRef = null + if (this.spec.hosted) { + this.from = this.spec.hosted.shortcut({ noCommittish: false }) + } + + // shortcut: avoid full clone when we can go straight to the tgz + // if we have the full sha and it's a hosted git platform + if (this.spec.gitCommittish && hashre.test(this.spec.gitCommittish)) { + this.resolvedSha = this.spec.gitCommittish + // use hosted.tarball() when we shell to RemoteFetcher later + this.resolved = this.spec.hosted + ? repoUrl(this.spec.hosted, { noCommittish: false }) + : this.spec.rawSpec + } else { + this.resolvedSha = '' + } + + this.Arborist = opts.Arborist || null + } + + // just exposed to make it easier to test all the combinations + static repoUrl (hosted, opts) { + return repoUrl(hosted, opts) + } + + get types () { + return ['git'] + } + + resolve () { + // likely a hosted git repo with a sha, so get the tarball url + // but in general, no reason to resolve() more than necessary! + if (this.resolved) { + return super.resolve() + } + + // fetch the git repo and then look at the current hash + const h = this.spec.hosted + // try to use ssh, fall back to git. + return h + ? this.#resolvedFromHosted(h) + : this.#resolvedFromRepo(this.spec.fetchSpec) + } + + // first try https, since that's faster and passphrase-less for + // public repos, and supports private repos when auth is provided. + // Fall back to SSH to support private repos + // NB: we always store the https url in resolved field if auth + // is present, otherwise ssh if the hosted type provides it + #resolvedFromHosted (hosted) { + return this.#resolvedFromRepo(hosted.https && hosted.https()).catch(er => { + // Throw early since we know pathspec errors will fail again if retried + if (er instanceof git.errors.GitPathspecError) { + throw er + } + const ssh = hosted.sshurl && hosted.sshurl() + // no fallthrough if we can't fall through or have https auth + if (!ssh || hosted.auth) { + throw er + } + return this.#resolvedFromRepo(ssh) + }) + } + + #resolvedFromRepo (gitRemote) { + // XXX make this a custom error class + if (!gitRemote) { + return Promise.reject(new Error(`No git url for ${this.spec}`)) + } + const gitRange = this.spec.gitRange + const name = this.spec.name + return git.revs(gitRemote, this.opts).then(remoteRefs => { + return gitRange ? pickManifest({ + versions: remoteRefs.versions, + 'dist-tags': remoteRefs['dist-tags'], + name, + }, gitRange, this.opts) + : this.spec.gitCommittish ? + remoteRefs.refs[this.spec.gitCommittish] || + remoteRefs.refs[remoteRefs.shas[this.spec.gitCommittish]] + : remoteRefs.refs.HEAD // no git committish, get default head + }).then(revDoc => { + // the committish provided isn't in the rev list + // things like HEAD~3 or @yesterday can land here. + if (!revDoc || !revDoc.sha) { + return this.#resolvedFromClone() + } + + this.resolvedRef = revDoc + this.resolvedSha = revDoc.sha + this.#addGitSha(revDoc.sha) + return this.resolved + }) + } + + #setResolvedWithSha (withSha) { + // we haven't cloned, so a tgz download is still faster + // of course, if it's not a known host, we can't do that. + this.resolved = !this.spec.hosted ? withSha + : repoUrl(npa(withSha).hosted, { noCommittish: false }) + } + + // when we get the git sha, we affix it to our spec to build up + // either a git url with a hash, or a tarball download URL + #addGitSha (sha) { + this.#setResolvedWithSha(addGitSha(this.spec, sha)) + } + + #resolvedFromClone () { + // do a full or shallow clone, then look at the HEAD + // kind of wasteful, but no other option, really + return this.#clone(() => this.resolved) + } + + #prepareDir (dir) { + return this[_.readPackageJson](dir).then(mani => { + // no need if we aren't going to do any preparation. + const scripts = mani.scripts + if (!mani.workspaces && (!scripts || !( + scripts.postinstall || + scripts.build || + scripts.preinstall || + scripts.install || + scripts.prepack || + scripts.prepare))) { + return + } + + // to avoid cases where we have an cycle of git deps that depend + // on one another, we only ever do preparation for one instance + // of a given git dep along the chain of installations. + // Note that this does mean that a dependency MAY in theory end up + // trying to run its prepare script using a dependency that has not + // been properly prepared itself, but that edge case is smaller + // and less hazardous than a fork bomb of npm and git commands. + const noPrepare = !process.env._PACOTE_NO_PREPARE_ ? [] + : process.env._PACOTE_NO_PREPARE_.split('\n') + if (noPrepare.includes(this.resolved)) { + log.info('prepare', 'skip prepare, already seen', this.resolved) + return + } + noPrepare.push(this.resolved) + + // the DirFetcher will do its own preparation to run the prepare scripts + // All we have to do is put the deps in place so that it can succeed. + return npm( + this.npmBin, + [].concat(this.npmInstallCmd).concat(this.npmCliConfig), + dir, + { ...process.env, _PACOTE_NO_PREPARE_: noPrepare.join('\n') }, + { message: 'git dep preparation failed' } + ) + }) + } + + [_.tarballFromResolved] () { + const stream = new Minipass() + stream.resolved = this.resolved + stream.from = this.from + + // check it out and then shell out to the DirFetcher tarball packer + this.#clone(dir => this.#prepareDir(dir) + .then(() => new Promise((res, rej) => { + if (!this.Arborist) { + throw new Error('GitFetcher requires an Arborist constructor to pack a tarball') + } + const df = new DirFetcher(`file:${dir}`, { + ...this.opts, + Arborist: this.Arborist, + resolved: null, + integrity: null, + }) + const dirStream = df[_.tarballFromResolved]() + dirStream.on('error', rej) + dirStream.on('end', res) + dirStream.pipe(stream) + }))).catch( + /* istanbul ignore next: very unlikely and hard to test */ + er => stream.emit('error', er) + ) + return stream + } + + // clone a git repo into a temp folder (or fetch and unpack if possible) + // handler accepts a directory, and returns a promise that resolves + // when we're done with it, at which point, cacache deletes it + // + // TODO: after cloning, create a tarball of the folder, and add to the cache + // with cacache.put.stream(), using a key that's deterministic based on the + // spec and repo, so that we don't ever clone the same thing multiple times. + #clone (handler, tarballOk = true) { + const o = { tmpPrefix: 'git-clone' } + const ref = this.resolvedSha || this.spec.gitCommittish + const h = this.spec.hosted + const resolved = this.resolved + + // can be set manually to false to fall back to actual git clone + tarballOk = tarballOk && + h && resolved === repoUrl(h, { noCommittish: false }) && h.tarball + + return cacache.tmp.withTmp(this.cache, o, async tmp => { + // if we're resolved, and have a tarball url, shell out to RemoteFetcher + if (tarballOk) { + const nameat = this.spec.name ? `${this.spec.name}@` : '' + return new RemoteFetcher(h.tarball({ noCommittish: false }), { + ...this.opts, + allowGitIgnore: true, + pkgid: `git:${nameat}${this.resolved}`, + resolved: this.resolved, + integrity: null, // it'll always be different, if we have one + }).extract(tmp).then(() => handler(tmp), er => { + // fall back to ssh download if tarball fails + if (er.constructor.name.match(/^Http/)) { + return this.#clone(handler, false) + } else { + throw er + } + }) + } + + const sha = await ( + h ? this.#cloneHosted(ref, tmp) + : this.#cloneRepo(this.spec.fetchSpec, ref, tmp) + ) + this.resolvedSha = sha + if (!this.resolved) { + await this.#addGitSha(sha) + } + return handler(tmp) + }) + } + + // first try https, since that's faster and passphrase-less for + // public repos, and supports private repos when auth is provided. + // Fall back to SSH to support private repos + // NB: we always store the https url in resolved field if auth + // is present, otherwise ssh if the hosted type provides it + #cloneHosted (ref, tmp) { + const hosted = this.spec.hosted + return this.#cloneRepo(hosted.https({ noCommittish: true }), ref, tmp) + .catch(er => { + // Throw early since we know pathspec errors will fail again if retried + if (er instanceof git.errors.GitPathspecError) { + throw er + } + const ssh = hosted.sshurl && hosted.sshurl({ noCommittish: true }) + // no fallthrough if we can't fall through or have https auth + if (!ssh || hosted.auth) { + throw er + } + return this.#cloneRepo(ssh, ref, tmp) + }) + } + + #cloneRepo (repo, ref, tmp) { + const { opts, spec } = this + return git.clone(repo, ref, tmp, { ...opts, spec }) + } + + manifest () { + if (this.package) { + return Promise.resolve(this.package) + } + + return this.spec.hosted && this.resolved + ? FileFetcher.prototype.manifest.apply(this) + : this.#clone(dir => + this[_.readPackageJson](dir) + .then(mani => this.package = { + ...mani, + _resolved: this.resolved, + _from: this.from, + })) + } + + packument () { + return FileFetcher.prototype.packument.apply(this) + } +} +module.exports = GitFetcher diff --git a/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/index.js b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/index.js new file mode 100644 index 00000000000000..f35314d275d5fd --- /dev/null +++ b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/index.js @@ -0,0 +1,23 @@ +const { get } = require('./fetcher.js') +const GitFetcher = require('./git.js') +const RegistryFetcher = require('./registry.js') +const FileFetcher = require('./file.js') +const DirFetcher = require('./dir.js') +const RemoteFetcher = require('./remote.js') + +const tarball = (spec, opts) => get(spec, opts).tarball() +tarball.stream = (spec, handler, opts) => get(spec, opts).tarballStream(handler) +tarball.file = (spec, dest, opts) => get(spec, opts).tarballFile(dest) + +module.exports = { + GitFetcher, + RegistryFetcher, + FileFetcher, + DirFetcher, + RemoteFetcher, + resolve: (spec, opts) => get(spec, opts).resolve(), + extract: (spec, dest, opts) => get(spec, opts).extract(dest), + manifest: (spec, opts) => get(spec, opts).manifest(), + packument: (spec, opts) => get(spec, opts).packument(), + tarball, +} diff --git a/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/registry.js b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/registry.js new file mode 100644 index 00000000000000..1ecf4ee1773499 --- /dev/null +++ b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/registry.js @@ -0,0 +1,369 @@ +const crypto = require('node:crypto') +const PackageJson = require('@npmcli/package-json') +const pickManifest = require('npm-pick-manifest') +const ssri = require('ssri') +const npa = require('npm-package-arg') +const sigstore = require('sigstore') +const fetch = require('npm-registry-fetch') +const Fetcher = require('./fetcher.js') +const RemoteFetcher = require('./remote.js') +const pacoteVersion = require('../package.json').version +const removeTrailingSlashes = require('./util/trailing-slashes.js') +const _ = require('./util/protected.js') + +// Corgis are cute. 🐕🐶 +const corgiDoc = 'application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8, */*' +const fullDoc = 'application/json' + +// Some really old packages have no time field in their packument so we need a +// cutoff date. +const MISSING_TIME_CUTOFF = '2015-01-01T00:00:00.000Z' + +class RegistryFetcher extends Fetcher { + #cacheKey + constructor (spec, opts) { + super(spec, opts) + + // you usually don't want to fetch the same packument multiple times in + // the span of a given script or command, no matter how many pacote calls + // are made, so this lets us avoid doing that. It's only relevant for + // registry fetchers, because other types simulate their packument from + // the manifest, which they memoize on this.package, so it's very cheap + // already. + this.packumentCache = this.opts.packumentCache || null + + this.registry = fetch.pickRegistry(spec, opts) + this.packumentUrl = `${removeTrailingSlashes(this.registry)}/${this.spec.escapedName}` + this.#cacheKey = `${this.fullMetadata ? 'full' : 'corgi'}:${this.packumentUrl}` + + const parsed = new URL(this.registry) + const regKey = `//${parsed.host}${parsed.pathname}` + // unlike the nerf-darted auth keys, this one does *not* allow a mismatch + // of trailing slashes. It must match exactly. + if (this.opts[`${regKey}:_keys`]) { + this.registryKeys = this.opts[`${regKey}:_keys`] + } + + // XXX pacote <=9 has some logic to ignore opts.resolved if + // the resolved URL doesn't go to the same registry. + // Consider reproducing that here, to throw away this.resolved + // in that case. + } + + async resolve () { + // fetching the manifest sets resolved and (if present) integrity + await this.manifest() + if (!this.resolved) { + throw Object.assign( + new Error('Invalid package manifest: no `dist.tarball` field'), + { package: this.spec.toString() } + ) + } + return this.resolved + } + + #headers () { + return { + // npm will override UA, but ensure that we always send *something* + 'user-agent': this.opts.userAgent || + `pacote/${pacoteVersion} node/${process.version}`, + ...(this.opts.headers || {}), + 'pacote-version': pacoteVersion, + 'pacote-req-type': 'packument', + 'pacote-pkg-id': `registry:${this.spec.name}`, + accept: this.fullMetadata ? fullDoc : corgiDoc, + } + } + + async packument () { + // note this might be either an in-flight promise for a request, + // or the actual packument, but we never want to make more than + // one request at a time for the same thing regardless. + if (this.packumentCache?.has(this.#cacheKey)) { + return this.packumentCache.get(this.#cacheKey) + } + + // npm-registry-fetch the packument + // set the appropriate header for corgis if fullMetadata isn't set + // return the res.json() promise + try { + const res = await fetch(this.packumentUrl, { + ...this.opts, + headers: this.#headers(), + spec: this.spec, + + // never check integrity for packuments themselves + integrity: null, + }) + const packument = await res.json() + const contentLength = res.headers.get('content-length') + if (contentLength) { + packument._contentLength = Number(contentLength) + } + this.packumentCache?.set(this.#cacheKey, packument) + return packument + } catch (err) { + this.packumentCache?.delete(this.#cacheKey) + if (err.code !== 'E404' || this.fullMetadata) { + throw err + } + // possible that corgis are not supported by this registry + this.fullMetadata = true + return this.packument() + } + } + + async manifest () { + if (this.package) { + return this.package + } + + // When verifying signatures, we need to fetch the full/uncompressed + // packument to get publish time as this is not included in the + // corgi/compressed packument. + if (this.opts.verifySignatures) { + this.fullMetadata = true + } + + const packument = await this.packument() + const steps = PackageJson.normalizeSteps.filter(s => s !== '_attributes') + const mani = await new PackageJson().fromContent(pickManifest(packument, this.spec.fetchSpec, { + ...this.opts, + defaultTag: this.defaultTag, + before: this.before, + })).normalize({ steps }).then(p => p.content) + + /* XXX add ETARGET and E403 revalidation of cached packuments here */ + + // add _time from packument if fetched with fullMetadata + const time = packument.time?.[mani.version] + if (time) { + mani._time = time + } + + // add _resolved and _integrity from dist object + const { dist } = mani + if (dist) { + this.resolved = mani._resolved = dist.tarball + mani._from = this.from + const distIntegrity = dist.integrity ? ssri.parse(dist.integrity) + : dist.shasum ? ssri.fromHex(dist.shasum, 'sha1', { ...this.opts }) + : null + if (distIntegrity) { + if (this.integrity && !this.integrity.match(distIntegrity)) { + // only bork if they have algos in common. + // otherwise we end up breaking if we have saved a sha512 + // previously for the tarball, but the manifest only + // provides a sha1, which is possible for older publishes. + // Otherwise, this is almost certainly a case of holding it + // wrong, and will result in weird or insecure behavior + // later on when building package tree. + for (const algo of Object.keys(this.integrity)) { + if (distIntegrity[algo]) { + throw Object.assign(new Error( + `Integrity checksum failed when using ${algo}: ` + + `wanted ${this.integrity} but got ${distIntegrity}.` + ), { code: 'EINTEGRITY' }) + } + } + } + // made it this far, the integrity is worthwhile. accept it. + // the setter here will take care of merging it into what we already + // had. + this.integrity = distIntegrity + } + } + if (this.integrity) { + mani._integrity = String(this.integrity) + if (dist.signatures) { + if (this.opts.verifySignatures) { + // validate and throw on error, then set _signatures + const message = `${mani._id}:${mani._integrity}` + for (const signature of dist.signatures) { + const publicKey = this.registryKeys && + this.registryKeys.filter(key => (key.keyid === signature.keyid))[0] + if (!publicKey) { + throw Object.assign(new Error( + `${mani._id} has a registry signature with keyid: ${signature.keyid} ` + + 'but no corresponding public key can be found' + ), { code: 'EMISSINGSIGNATUREKEY' }) + } + + const publishedTime = Date.parse(mani._time || MISSING_TIME_CUTOFF) + const validPublicKey = !publicKey.expires || + publishedTime < Date.parse(publicKey.expires) + if (!validPublicKey) { + throw Object.assign(new Error( + `${mani._id} has a registry signature with keyid: ${signature.keyid} ` + + `but the corresponding public key has expired ${publicKey.expires}` + ), { code: 'EEXPIREDSIGNATUREKEY' }) + } + const verifier = crypto.createVerify('SHA256') + verifier.write(message) + verifier.end() + const valid = verifier.verify( + publicKey.pemkey, + signature.sig, + 'base64' + ) + if (!valid) { + throw Object.assign(new Error( + `${mani._id} has an invalid registry signature with ` + + `keyid: ${publicKey.keyid} and signature: ${signature.sig}` + ), { + code: 'EINTEGRITYSIGNATURE', + keyid: publicKey.keyid, + signature: signature.sig, + resolved: mani._resolved, + integrity: mani._integrity, + }) + } + } + mani._signatures = dist.signatures + } else { + mani._signatures = dist.signatures + } + } + + if (dist.attestations) { + if (this.opts.verifyAttestations) { + // Always fetch attestations from the current registry host + const attestationsPath = new URL(dist.attestations.url).pathname + const attestationsUrl = removeTrailingSlashes(this.registry) + attestationsPath + const res = await fetch(attestationsUrl, { + ...this.opts, + // disable integrity check for attestations json payload, we check the + // integrity in the verification steps below + integrity: null, + }) + const { attestations } = await res.json() + const bundles = attestations.map(({ predicateType, bundle }) => { + const statement = JSON.parse( + Buffer.from(bundle.dsseEnvelope.payload, 'base64').toString('utf8') + ) + const keyid = bundle.dsseEnvelope.signatures[0].keyid + const signature = bundle.dsseEnvelope.signatures[0].sig + + return { + predicateType, + bundle, + statement, + keyid, + signature, + } + }) + + const attestationKeyIds = bundles.map((b) => b.keyid).filter((k) => !!k) + const attestationRegistryKeys = (this.registryKeys || []) + .filter(key => attestationKeyIds.includes(key.keyid)) + if (!attestationRegistryKeys.length) { + throw Object.assign(new Error( + `${mani._id} has attestations but no corresponding public key(s) can be found` + ), { code: 'EMISSINGSIGNATUREKEY' }) + } + + for (const { predicateType, bundle, keyid, signature, statement } of bundles) { + const publicKey = attestationRegistryKeys.find(key => key.keyid === keyid) + // Publish attestations have a keyid set and a valid public key must be found + if (keyid) { + if (!publicKey) { + throw Object.assign(new Error( + `${mani._id} has attestations with keyid: ${keyid} ` + + 'but no corresponding public key can be found' + ), { code: 'EMISSINGSIGNATUREKEY' }) + } + + const integratedTime = new Date( + Number( + bundle.verificationMaterial.tlogEntries[0].integratedTime + ) * 1000 + ) + const validPublicKey = !publicKey.expires || + (integratedTime < Date.parse(publicKey.expires)) + if (!validPublicKey) { + throw Object.assign(new Error( + `${mani._id} has attestations with keyid: ${keyid} ` + + `but the corresponding public key has expired ${publicKey.expires}` + ), { code: 'EEXPIREDSIGNATUREKEY' }) + } + } + + const subject = { + name: statement.subject[0].name, + sha512: statement.subject[0].digest.sha512, + } + + // Only type 'version' can be turned into a PURL + const purl = this.spec.type === 'version' ? npa.toPurl(this.spec) : this.spec + // Verify the statement subject matches the package, version + if (subject.name !== purl) { + throw Object.assign(new Error( + `${mani._id} package name and version (PURL): ${purl} ` + + `doesn't match what was signed: ${subject.name}` + ), { code: 'EATTESTATIONSUBJECT' }) + } + + // Verify the statement subject matches the tarball integrity + const integrityHexDigest = ssri.parse(this.integrity).hexDigest() + if (subject.sha512 !== integrityHexDigest) { + throw Object.assign(new Error( + `${mani._id} package integrity (hex digest): ` + + `${integrityHexDigest} ` + + `doesn't match what was signed: ${subject.sha512}` + ), { code: 'EATTESTATIONSUBJECT' }) + } + + try { + // Provenance attestations are signed with a signing certificate + // (including the key) so we don't need to return a public key. + // + // Publish attestations are signed with a keyid so we need to + // specify a public key from the keys endpoint: `registry-host.tld/-/npm/v1/keys` + const options = { + tufCachePath: this.tufCache, + tufForceCache: true, + keySelector: publicKey ? () => publicKey.pemkey : undefined, + } + await sigstore.verify(bundle, options) + } catch (e) { + throw Object.assign(new Error( + `${mani._id} failed to verify attestation: ${e.message}` + ), { + code: 'EATTESTATIONVERIFY', + predicateType, + keyid, + signature, + resolved: mani._resolved, + integrity: mani._integrity, + }) + } + } + mani._attestations = dist.attestations + } else { + mani._attestations = dist.attestations + } + } + } + + this.package = mani + return this.package + } + + [_.tarballFromResolved] () { + // we use a RemoteFetcher to get the actual tarball stream + return new RemoteFetcher(this.resolved, { + ...this.opts, + resolved: this.resolved, + pkgid: `registry:${this.spec.name}@${this.resolved}`, + })[_.tarballFromResolved]() + } + + get types () { + return [ + 'tag', + 'version', + 'range', + ] + } +} +module.exports = RegistryFetcher diff --git a/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/remote.js b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/remote.js new file mode 100644 index 00000000000000..bd321e65a1f18a --- /dev/null +++ b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/remote.js @@ -0,0 +1,89 @@ +const fetch = require('npm-registry-fetch') +const { Minipass } = require('minipass') +const Fetcher = require('./fetcher.js') +const FileFetcher = require('./file.js') +const _ = require('./util/protected.js') +const pacoteVersion = require('../package.json').version + +class RemoteFetcher extends Fetcher { + constructor (spec, opts) { + super(spec, opts) + this.resolved = this.spec.fetchSpec + const resolvedURL = new URL(this.resolved) + if (this.replaceRegistryHost !== 'never' + && (this.replaceRegistryHost === 'always' + || this.replaceRegistryHost === resolvedURL.host)) { + this.resolved = new URL(resolvedURL.pathname, this.registry).href + } + + // nam is a fermented pork sausage that is good to eat + const nameat = this.spec.name ? `${this.spec.name}@` : '' + this.pkgid = opts.pkgid ? opts.pkgid : `remote:${nameat}${this.resolved}` + } + + // Don't need to cache tarball fetches in pacote, because make-fetch-happen + // will write into cacache anyway. + get [_.cacheFetches] () { + return false + } + + [_.tarballFromResolved] () { + const stream = new Minipass() + stream.hasIntegrityEmitter = true + + const fetchOpts = { + ...this.opts, + headers: this.#headers(), + spec: this.spec, + integrity: this.integrity, + algorithms: [this.pickIntegrityAlgorithm()], + } + + // eslint-disable-next-line promise/always-return + fetch(this.resolved, fetchOpts).then(res => { + res.body.on('error', + /* istanbul ignore next - exceedingly rare and hard to simulate */ + er => stream.emit('error', er) + ) + + res.body.on('integrity', i => { + this.integrity = i + stream.emit('integrity', i) + }) + + res.body.pipe(stream) + }).catch(er => stream.emit('error', er)) + + return stream + } + + #headers () { + return { + // npm will override this, but ensure that we always send *something* + 'user-agent': this.opts.userAgent || + `pacote/${pacoteVersion} node/${process.version}`, + ...(this.opts.headers || {}), + 'pacote-version': pacoteVersion, + 'pacote-req-type': 'tarball', + 'pacote-pkg-id': this.pkgid, + ...(this.integrity ? { 'pacote-integrity': String(this.integrity) } + : {}), + ...(this.opts.headers || {}), + } + } + + get types () { + return ['remote'] + } + + // getting a packument and/or manifest is the same as with a file: spec. + // unpack the tarball stream, and then read from the package.json file. + packument () { + return FileFetcher.prototype.packument.apply(this) + } + + manifest () { + return FileFetcher.prototype.manifest.apply(this) + } +} +module.exports = RemoteFetcher diff --git a/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/add-git-sha.js b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/add-git-sha.js new file mode 100644 index 00000000000000..843fe5b600cafa --- /dev/null +++ b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/add-git-sha.js @@ -0,0 +1,15 @@ +// add a sha to a git remote url spec +const addGitSha = (spec, sha) => { + if (spec.hosted) { + const h = spec.hosted + const opt = { noCommittish: true } + const base = h.https && h.auth ? h.https(opt) : h.shortcut(opt) + + return `${base}#${sha}` + } else { + // don't use new URL for this, because it doesn't handle scp urls + return spec.rawSpec.replace(/#.*$/, '') + `#${sha}` + } +} + +module.exports = addGitSha diff --git a/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/cache-dir.js b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/cache-dir.js new file mode 100644 index 00000000000000..ba5683a7bb5bf3 --- /dev/null +++ b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/cache-dir.js @@ -0,0 +1,15 @@ +const { resolve } = require('node:path') +const { tmpdir, homedir } = require('node:os') + +module.exports = (fakePlatform = false) => { + const temp = tmpdir() + const uidOrPid = process.getuid ? process.getuid() : process.pid + const home = homedir() || resolve(temp, 'npm-' + uidOrPid) + const platform = fakePlatform || process.platform + const cacheExtra = platform === 'win32' ? 'npm-cache' : '.npm' + const cacheRoot = (platform === 'win32' && process.env.LOCALAPPDATA) || home + return { + cacache: resolve(cacheRoot, cacheExtra, '_cacache'), + tufcache: resolve(cacheRoot, cacheExtra, '_tuf'), + } +} diff --git a/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/is-package-bin.js b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/is-package-bin.js new file mode 100644 index 00000000000000..49a3f73f537ce9 --- /dev/null +++ b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/is-package-bin.js @@ -0,0 +1,25 @@ +// Function to determine whether a path is in the package.bin set. +// Used to prevent issues when people publish a package from a +// windows machine, and then install with --no-bin-links. +// +// Note: this is not possible in remote or file fetchers, since +// we don't have the manifest until AFTER we've unpacked. But the +// main use case is registry fetching with git a distant second, +// so that's an acceptable edge case to not handle. + +const binObj = (name, bin) => + typeof bin === 'string' ? { [name]: bin } : bin + +const hasBin = (pkg, path) => { + const bin = binObj(pkg.name, pkg.bin) + const p = path.replace(/^[^\\/]*\//, '') + for (const kv of Object.entries(bin)) { + if (kv[1] === p) { + return true + } + } + return false +} + +module.exports = (pkg, path) => + pkg && pkg.bin ? hasBin(pkg, path) : false diff --git a/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/npm.js b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/npm.js new file mode 100644 index 00000000000000..a3005c255565fb --- /dev/null +++ b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/npm.js @@ -0,0 +1,14 @@ +// run an npm command +const spawn = require('@npmcli/promise-spawn') + +module.exports = (npmBin, npmCommand, cwd, env, extra) => { + const isJS = npmBin.endsWith('.js') + const cmd = isJS ? process.execPath : npmBin + const args = (isJS ? [npmBin] : []).concat(npmCommand) + // when installing to run the `prepare` script for a git dep, we need + // to ensure that we don't run into a cycle of checking out packages + // in temp directories. this lets us link previously-seen repos that + // are also being prepared. + + return spawn(cmd, args, { cwd, env }, extra) +} diff --git a/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/protected.js b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/protected.js new file mode 100644 index 00000000000000..e05203b481e6aa --- /dev/null +++ b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/protected.js @@ -0,0 +1,5 @@ +module.exports = { + cacheFetches: Symbol.for('pacote.Fetcher._cacheFetches'), + readPackageJson: Symbol.for('package.Fetcher._readPackageJson'), + tarballFromResolved: Symbol.for('pacote.Fetcher._tarballFromResolved'), +} diff --git a/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/tar-create-options.js b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/tar-create-options.js new file mode 100644 index 00000000000000..d070f0f7ba2d4e --- /dev/null +++ b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/tar-create-options.js @@ -0,0 +1,31 @@ +const isPackageBin = require('./is-package-bin.js') + +const tarCreateOptions = manifest => ({ + cwd: manifest._resolved, + prefix: 'package/', + portable: true, + gzip: { + // forcing the level to 9 seems to avoid some + // platform specific optimizations that cause + // integrity mismatch errors due to differing + // end results after compression + level: 9, + }, + + // ensure that package bins are always executable + // Note that npm-packlist is already filtering out + // anything that is not a regular file, ignored by + // .npmignore or package.json "files", etc. + filter: (path, stat) => { + if (isPackageBin(manifest, path)) { + stat.mode |= 0o111 + } + return true + }, + + // Provide a specific date in the 1980s for the benefit of zip, + // which is confounded by files dated at the Unix epoch 0. + mtime: new Date('1985-10-26T08:15:00.000Z'), +}) + +module.exports = tarCreateOptions diff --git a/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/trailing-slashes.js b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/trailing-slashes.js new file mode 100644 index 00000000000000..c50cb6173b92eb --- /dev/null +++ b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/lib/util/trailing-slashes.js @@ -0,0 +1,10 @@ +const removeTrailingSlashes = (input) => { + // in order to avoid regexp redos detection + let output = input + while (output.endsWith('/')) { + output = output.slice(0, -1) + } + return output +} + +module.exports = removeTrailingSlashes diff --git a/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/package.json b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/package.json new file mode 100644 index 00000000000000..335c7a6c87bd3c --- /dev/null +++ b/deps/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote/package.json @@ -0,0 +1,79 @@ +{ + "name": "pacote", + "version": "20.0.0", + "description": "JavaScript package downloader", + "author": "GitHub Inc.", + "bin": { + "pacote": "bin/index.js" + }, + "license": "ISC", + "main": "lib/index.js", + "scripts": { + "test": "tap", + "snap": "tap", + "lint": "npm run eslint", + "postlint": "template-oss-check", + "lintfix": "npm run eslint -- --fix", + "posttest": "npm run lint", + "template-oss-apply": "template-oss-apply --force", + "eslint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"" + }, + "tap": { + "timeout": 300, + "nyc-arg": [ + "--exclude", + "tap-snapshots/**" + ] + }, + "devDependencies": { + "@npmcli/arborist": "^7.1.0", + "@npmcli/eslint-config": "^5.0.0", + "@npmcli/template-oss": "4.23.3", + "hosted-git-info": "^8.0.0", + "mutate-fs": "^2.1.1", + "nock": "^13.2.4", + "npm-registry-mock": "^1.3.2", + "tap": "^16.0.1" + }, + "files": [ + "bin/", + "lib/" + ], + "keywords": [ + "packages", + "npm", + "git" + ], + "dependencies": { + "@npmcli/git": "^6.0.0", + "@npmcli/installed-package-contents": "^3.0.0", + "@npmcli/package-json": "^6.0.0", + "@npmcli/promise-spawn": "^8.0.0", + "@npmcli/run-script": "^9.0.0", + "cacache": "^19.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^12.0.0", + "npm-packlist": "^9.0.0", + "npm-pick-manifest": "^10.0.0", + "npm-registry-fetch": "^18.0.0", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1", + "sigstore": "^3.0.0", + "ssri": "^12.0.0", + "tar": "^6.1.11" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/npm/pacote.git" + }, + "templateOSS": { + "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", + "version": "4.23.3", + "windowsCI": false, + "publish": "true" + } +} diff --git a/deps/npm/node_modules/@npmcli/metavuln-calculator/package.json b/deps/npm/node_modules/@npmcli/metavuln-calculator/package.json index d4c3cf54d83ea7..df0b8f2f4faf1c 100644 --- a/deps/npm/node_modules/@npmcli/metavuln-calculator/package.json +++ b/deps/npm/node_modules/@npmcli/metavuln-calculator/package.json @@ -1,6 +1,6 @@ { "name": "@npmcli/metavuln-calculator", - "version": "8.0.0", + "version": "8.0.1", "main": "lib/index.js", "files": [ "bin/", @@ -41,7 +41,7 @@ "dependencies": { "cacache": "^19.0.0", "json-parse-even-better-errors": "^4.0.0", - "pacote": "^19.0.0", + "pacote": "^20.0.0", "proc-log": "^5.0.0", "semver": "^7.3.5" }, diff --git a/deps/npm/node_modules/@npmcli/package-json/lib/index.js b/deps/npm/node_modules/@npmcli/package-json/lib/index.js index f165ee23b75ab9..23f326dd59359f 100644 --- a/deps/npm/node_modules/@npmcli/package-json/lib/index.js +++ b/deps/npm/node_modules/@npmcli/package-json/lib/index.js @@ -7,6 +7,7 @@ const updateScripts = require('./update-scripts.js') const updateWorkspaces = require('./update-workspaces.js') const normalize = require('./normalize.js') const { read, parse } = require('./read-package.js') +const { packageSort } = require('./sort.js') // a list of handy specialized helper functions that take // care of special cases that are handled by the npm cli @@ -230,19 +231,23 @@ class PackageJson { return this } - async save () { + async save ({ sort } = {}) { if (!this.#canSave) { throw new Error('No package.json to save to') } const { [Symbol.for('indent')]: indent, [Symbol.for('newline')]: newline, + ...rest } = this.content const format = indent === undefined ? ' ' : indent const eol = newline === undefined ? '\n' : newline + + const content = sort ? packageSort(rest) : rest + const fileContent = `${ - JSON.stringify(this.content, null, format) + JSON.stringify(content, null, format) }\n` .replace(/\n/g, eol) diff --git a/deps/npm/node_modules/@npmcli/package-json/lib/sort.js b/deps/npm/node_modules/@npmcli/package-json/lib/sort.js new file mode 100644 index 00000000000000..0bd0d5199da583 --- /dev/null +++ b/deps/npm/node_modules/@npmcli/package-json/lib/sort.js @@ -0,0 +1,101 @@ +/** + * arbitrary sort order for package.json largely pulled from: + * https://github.com/keithamus/sort-package-json/blob/main/defaultRules.md + * + * cross checked with: + * https://github.com/npm/types/blob/main/types/index.d.ts#L104 + * https://docs.npmjs.com/cli/configuring-npm/package-json + */ +function packageSort (json) { + const { + name, + version, + private: isPrivate, + description, + keywords, + homepage, + bugs, + repository, + funding, + license, + author, + maintainers, + contributors, + type, + imports, + exports, + main, + browser, + types, + bin, + man, + directories, + files, + workspaces, + scripts, + config, + dependencies, + devDependencies, + peerDependencies, + peerDependenciesMeta, + optionalDependencies, + bundledDependencies, + bundleDependencies, + engines, + os, + cpu, + publishConfig, + devEngines, + licenses, + overrides, + ...rest + } = json + + return { + ...(typeof name !== 'undefined' ? { name } : {}), + ...(typeof version !== 'undefined' ? { version } : {}), + ...(typeof isPrivate !== 'undefined' ? { private: isPrivate } : {}), + ...(typeof description !== 'undefined' ? { description } : {}), + ...(typeof keywords !== 'undefined' ? { keywords } : {}), + ...(typeof homepage !== 'undefined' ? { homepage } : {}), + ...(typeof bugs !== 'undefined' ? { bugs } : {}), + ...(typeof repository !== 'undefined' ? { repository } : {}), + ...(typeof funding !== 'undefined' ? { funding } : {}), + ...(typeof license !== 'undefined' ? { license } : {}), + ...(typeof author !== 'undefined' ? { author } : {}), + ...(typeof maintainers !== 'undefined' ? { maintainers } : {}), + ...(typeof contributors !== 'undefined' ? { contributors } : {}), + ...(typeof type !== 'undefined' ? { type } : {}), + ...(typeof imports !== 'undefined' ? { imports } : {}), + ...(typeof exports !== 'undefined' ? { exports } : {}), + ...(typeof main !== 'undefined' ? { main } : {}), + ...(typeof browser !== 'undefined' ? { browser } : {}), + ...(typeof types !== 'undefined' ? { types } : {}), + ...(typeof bin !== 'undefined' ? { bin } : {}), + ...(typeof man !== 'undefined' ? { man } : {}), + ...(typeof directories !== 'undefined' ? { directories } : {}), + ...(typeof files !== 'undefined' ? { files } : {}), + ...(typeof workspaces !== 'undefined' ? { workspaces } : {}), + ...(typeof scripts !== 'undefined' ? { scripts } : {}), + ...(typeof config !== 'undefined' ? { config } : {}), + ...(typeof dependencies !== 'undefined' ? { dependencies } : {}), + ...(typeof devDependencies !== 'undefined' ? { devDependencies } : {}), + ...(typeof peerDependencies !== 'undefined' ? { peerDependencies } : {}), + ...(typeof peerDependenciesMeta !== 'undefined' ? { peerDependenciesMeta } : {}), + ...(typeof optionalDependencies !== 'undefined' ? { optionalDependencies } : {}), + ...(typeof bundledDependencies !== 'undefined' ? { bundledDependencies } : {}), + ...(typeof bundleDependencies !== 'undefined' ? { bundleDependencies } : {}), + ...(typeof engines !== 'undefined' ? { engines } : {}), + ...(typeof os !== 'undefined' ? { os } : {}), + ...(typeof cpu !== 'undefined' ? { cpu } : {}), + ...(typeof publishConfig !== 'undefined' ? { publishConfig } : {}), + ...(typeof devEngines !== 'undefined' ? { devEngines } : {}), + ...(typeof licenses !== 'undefined' ? { licenses } : {}), + ...(typeof overrides !== 'undefined' ? { overrides } : {}), + ...rest, + } +} + +module.exports = { + packageSort, +} diff --git a/deps/npm/node_modules/@npmcli/package-json/package.json b/deps/npm/node_modules/@npmcli/package-json/package.json index e766e8ccb4bbf5..97070e27d0d22e 100644 --- a/deps/npm/node_modules/@npmcli/package-json/package.json +++ b/deps/npm/node_modules/@npmcli/package-json/package.json @@ -1,7 +1,17 @@ { "name": "@npmcli/package-json", - "version": "6.0.1", + "version": "6.1.0", "description": "Programmatic API to update package.json", + "keywords": [ + "npm", + "oss" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/npm/package-json.git" + }, + "license": "ISC", + "author": "GitHub Inc.", "main": "lib/index.js", "files": [ "bin/", @@ -18,19 +28,6 @@ "template-oss-apply": "template-oss-apply --force", "eslint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"" }, - "keywords": [ - "npm", - "oss" - ], - "author": "GitHub Inc.", - "license": "ISC", - "devDependencies": { - "@npmcli/eslint-config": "^5.0.0", - "@npmcli/template-oss": "4.23.3", - "read-package-json": "^7.0.0", - "read-package-json-fast": "^4.0.0", - "tap": "^16.0.1" - }, "dependencies": { "@npmcli/git": "^6.0.0", "glob": "^10.2.2", @@ -40,16 +37,19 @@ "proc-log": "^5.0.0", "semver": "^7.5.3" }, - "repository": { - "type": "git", - "url": "git+https://github.com/npm/package-json.git" + "devDependencies": { + "@npmcli/eslint-config": "^5.0.0", + "@npmcli/template-oss": "4.23.5", + "read-package-json": "^7.0.0", + "read-package-json-fast": "^4.0.0", + "tap": "^16.0.1" }, "engines": { "node": "^18.17.0 || >=20.5.0" }, "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.23.3", + "version": "4.23.5", "publish": "true" }, "tap": { diff --git a/deps/npm/node_modules/@npmcli/promise-spawn/lib/index.js b/deps/npm/node_modules/@npmcli/promise-spawn/lib/index.js index e147cb8f9c746f..aa7b55d8f038d4 100644 --- a/deps/npm/node_modules/@npmcli/promise-spawn/lib/index.js +++ b/deps/npm/node_modules/@npmcli/promise-spawn/lib/index.js @@ -131,9 +131,19 @@ const open = (_args, opts = {}, extra = {}) => { let platform = process.platform // process.platform === 'linux' may actually indicate WSL, if that's the case - // we want to treat things as win32 anyway so the host can open the argument + // open the argument with sensible-browser which is pre-installed + // In WSL, set the default browser using, for example, + // export BROWSER="/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe" + // or + // export BROWSER="/mnt/c/Program Files (x86)/Microsoft/Edge/Application/msedge.exe" + // To permanently set the default browser, add the appropriate entry to your shell's + // RC file, e.g. .bashrc or .zshrc. if (platform === 'linux' && os.release().toLowerCase().includes('microsoft')) { - platform = 'win32' + platform = 'wsl' + if (!process.env.BROWSER) { + return Promise.reject( + new Error('Set the BROWSER environment variable to your desired browser.')) + } } let command = options.command @@ -146,6 +156,8 @@ const open = (_args, opts = {}, extra = {}) => { // accidentally interpret the first arg as the title, we stick an empty // string immediately after the start command command = 'start ""' + } else if (platform === 'wsl') { + command = 'sensible-browser' } else if (platform === 'darwin') { command = 'open' } else { diff --git a/deps/npm/node_modules/@npmcli/promise-spawn/package.json b/deps/npm/node_modules/@npmcli/promise-spawn/package.json index 9914063f85156d..f5fb026be50e85 100644 --- a/deps/npm/node_modules/@npmcli/promise-spawn/package.json +++ b/deps/npm/node_modules/@npmcli/promise-spawn/package.json @@ -1,6 +1,6 @@ { "name": "@npmcli/promise-spawn", - "version": "8.0.1", + "version": "8.0.2", "files": [ "bin/", "lib/" @@ -33,7 +33,7 @@ }, "devDependencies": { "@npmcli/eslint-config": "^5.0.0", - "@npmcli/template-oss": "4.23.3", + "@npmcli/template-oss": "4.23.4", "spawk": "^1.7.1", "tap": "^16.0.1" }, @@ -42,7 +42,7 @@ }, "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.23.3", + "version": "4.23.4", "publish": true }, "dependencies": { diff --git a/deps/npm/node_modules/@npmcli/run-script/package.json b/deps/npm/node_modules/@npmcli/run-script/package.json index e5fd2fef62e5ce..38a2ac9f87772b 100644 --- a/deps/npm/node_modules/@npmcli/run-script/package.json +++ b/deps/npm/node_modules/@npmcli/run-script/package.json @@ -1,6 +1,6 @@ { "name": "@npmcli/run-script", - "version": "9.0.1", + "version": "9.0.2", "description": "Run a lifecycle script for a package (descendant of npm-lifecycle)", "author": "GitHub Inc.", "license": "ISC", @@ -16,7 +16,7 @@ }, "devDependencies": { "@npmcli/eslint-config": "^5.0.0", - "@npmcli/template-oss": "4.23.3", + "@npmcli/template-oss": "4.23.4", "spawk": "^1.8.1", "tap": "^16.0.1" }, @@ -24,7 +24,7 @@ "@npmcli/node-gyp": "^4.0.0", "@npmcli/package-json": "^6.0.0", "@npmcli/promise-spawn": "^8.0.0", - "node-gyp": "^10.0.0", + "node-gyp": "^11.0.0", "proc-log": "^5.0.0", "which": "^5.0.0" }, @@ -42,7 +42,7 @@ }, "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.23.3", + "version": "4.23.4", "publish": "true" }, "tap": { diff --git a/deps/npm/node_modules/@sigstore/bundle/dist/bundle.js b/deps/npm/node_modules/@sigstore/bundle/dist/bundle.js deleted file mode 100644 index dbd35df2ca2bb3..00000000000000 --- a/deps/npm/node_modules/@sigstore/bundle/dist/bundle.js +++ /dev/null @@ -1,24 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.isBundleWithDsseEnvelope = exports.isBundleWithMessageSignature = exports.isBundleWithPublicKey = exports.isBundleWithCertificateChain = exports.BUNDLE_V03_MEDIA_TYPE = exports.BUNDLE_V03_LEGACY_MEDIA_TYPE = exports.BUNDLE_V02_MEDIA_TYPE = exports.BUNDLE_V01_MEDIA_TYPE = void 0; -exports.BUNDLE_V01_MEDIA_TYPE = 'application/vnd.dev.sigstore.bundle+json;version=0.1'; -exports.BUNDLE_V02_MEDIA_TYPE = 'application/vnd.dev.sigstore.bundle+json;version=0.2'; -exports.BUNDLE_V03_LEGACY_MEDIA_TYPE = 'application/vnd.dev.sigstore.bundle+json;version=0.3'; -exports.BUNDLE_V03_MEDIA_TYPE = 'application/vnd.dev.sigstore.bundle.v0.3+json'; -// Type guards for bundle variants. -function isBundleWithCertificateChain(b) { - return b.verificationMaterial.content.$case === 'x509CertificateChain'; -} -exports.isBundleWithCertificateChain = isBundleWithCertificateChain; -function isBundleWithPublicKey(b) { - return b.verificationMaterial.content.$case === 'publicKey'; -} -exports.isBundleWithPublicKey = isBundleWithPublicKey; -function isBundleWithMessageSignature(b) { - return b.content.$case === 'messageSignature'; -} -exports.isBundleWithMessageSignature = isBundleWithMessageSignature; -function isBundleWithDsseEnvelope(b) { - return b.content.$case === 'dsseEnvelope'; -} -exports.isBundleWithDsseEnvelope = isBundleWithDsseEnvelope; diff --git a/deps/npm/node_modules/@sigstore/bundle/package.json b/deps/npm/node_modules/@sigstore/bundle/package.json deleted file mode 100644 index dd853897226d2f..00000000000000 --- a/deps/npm/node_modules/@sigstore/bundle/package.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "@sigstore/bundle", - "version": "2.3.2", - "description": "Sigstore bundle type", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "scripts": { - "clean": "shx rm -rf dist *.tsbuildinfo", - "build": "tsc --build", - "test": "jest" - }, - "files": [ - "dist", - "store" - ], - "author": "bdehamer@github.com", - "license": "Apache-2.0", - "repository": { - "type": "git", - "url": "git+https://github.com/sigstore/sigstore-js.git" - }, - "bugs": { - "url": "https://github.com/sigstore/sigstore-js/issues" - }, - "homepage": "https://github.com/sigstore/sigstore-js/tree/main/packages/bundle#readme", - "publishConfig": { - "provenance": true - }, - "dependencies": { - "@sigstore/protobuf-specs": "^0.3.2" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } -} diff --git a/deps/npm/node_modules/@sigstore/core/dist/asn1/parse.js b/deps/npm/node_modules/@sigstore/core/dist/asn1/parse.js deleted file mode 100644 index 482c7239e83162..00000000000000 --- a/deps/npm/node_modules/@sigstore/core/dist/asn1/parse.js +++ /dev/null @@ -1,125 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.parseBitString = exports.parseBoolean = exports.parseOID = exports.parseTime = exports.parseStringASCII = exports.parseInteger = void 0; -/* -Copyright 2023 The Sigstore Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -const RE_TIME_SHORT_YEAR = /^(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\.\d{3})?Z$/; -const RE_TIME_LONG_YEAR = /^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\.\d{3})?Z$/; -// Parse a BigInt from the DER-encoded buffer -// https://learn.microsoft.com/en-us/windows/win32/seccertenroll/about-integer -function parseInteger(buf) { - let pos = 0; - const end = buf.length; - let val = buf[pos]; - const neg = val > 0x7f; - // Consume any padding bytes - const pad = neg ? 0xff : 0x00; - while (val == pad && ++pos < end) { - val = buf[pos]; - } - // Calculate remaining bytes to read - const len = end - pos; - if (len === 0) - return BigInt(neg ? -1 : 0); - // Handle two's complement for negative numbers - val = neg ? val - 256 : val; - // Parse remaining bytes - let n = BigInt(val); - for (let i = pos + 1; i < end; ++i) { - n = n * BigInt(256) + BigInt(buf[i]); - } - return n; -} -exports.parseInteger = parseInteger; -// Parse an ASCII string from the DER-encoded buffer -// https://learn.microsoft.com/en-us/windows/win32/seccertenroll/about-basic-types#boolean -function parseStringASCII(buf) { - return buf.toString('ascii'); -} -exports.parseStringASCII = parseStringASCII; -// Parse a Date from the DER-encoded buffer -// https://www.rfc-editor.org/rfc/rfc5280#section-4.1.2.5.1 -function parseTime(buf, shortYear) { - const timeStr = parseStringASCII(buf); - // Parse the time string into matches - captured groups start at index 1 - const m = shortYear - ? RE_TIME_SHORT_YEAR.exec(timeStr) - : RE_TIME_LONG_YEAR.exec(timeStr); - if (!m) { - throw new Error('invalid time'); - } - // Translate dates with a 2-digit year to 4 digits per the spec - if (shortYear) { - let year = Number(m[1]); - year += year >= 50 ? 1900 : 2000; - m[1] = year.toString(); - } - // Translate to ISO8601 format and parse - return new Date(`${m[1]}-${m[2]}-${m[3]}T${m[4]}:${m[5]}:${m[6]}Z`); -} -exports.parseTime = parseTime; -// Parse an OID from the DER-encoded buffer -// https://learn.microsoft.com/en-us/windows/win32/seccertenroll/about-object-identifier -function parseOID(buf) { - let pos = 0; - const end = buf.length; - // Consume first byte which encodes the first two OID components - let n = buf[pos++]; - const first = Math.floor(n / 40); - const second = n % 40; - let oid = `${first}.${second}`; - // Consume remaining bytes - let val = 0; - for (; pos < end; ++pos) { - n = buf[pos]; - val = (val << 7) + (n & 0x7f); - // If the left-most bit is NOT set, then this is the last byte in the - // sequence and we can add the value to the OID and reset the accumulator - if ((n & 0x80) === 0) { - oid += `.${val}`; - val = 0; - } - } - return oid; -} -exports.parseOID = parseOID; -// Parse a boolean from the DER-encoded buffer -// https://learn.microsoft.com/en-us/windows/win32/seccertenroll/about-basic-types#boolean -function parseBoolean(buf) { - return buf[0] !== 0; -} -exports.parseBoolean = parseBoolean; -// Parse a bit string from the DER-encoded buffer -// https://learn.microsoft.com/en-us/windows/win32/seccertenroll/about-bit-string -function parseBitString(buf) { - // First byte tell us how many unused bits are in the last byte - const unused = buf[0]; - const start = 1; - const end = buf.length; - const bits = []; - for (let i = start; i < end; ++i) { - const byte = buf[i]; - // The skip value is only used for the last byte - const skip = i === end - 1 ? unused : 0; - // Iterate over each bit in the byte (most significant first) - for (let j = 7; j >= skip; --j) { - // Read the bit and add it to the bit string - bits.push((byte >> j) & 0x01); - } - } - return bits; -} -exports.parseBitString = parseBitString; diff --git a/deps/npm/node_modules/@sigstore/core/dist/dsse.js b/deps/npm/node_modules/@sigstore/core/dist/dsse.js deleted file mode 100644 index a78783c919a256..00000000000000 --- a/deps/npm/node_modules/@sigstore/core/dist/dsse.js +++ /dev/null @@ -1,31 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.preAuthEncoding = void 0; -/* -Copyright 2023 The Sigstore Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -const PAE_PREFIX = 'DSSEv1'; -// DSSE Pre-Authentication Encoding -function preAuthEncoding(payloadType, payload) { - const prefix = [ - PAE_PREFIX, - payloadType.length, - payloadType, - payload.length, - '', - ].join(' '); - return Buffer.concat([Buffer.from(prefix, 'ascii'), payload]); -} -exports.preAuthEncoding = preAuthEncoding; diff --git a/deps/npm/node_modules/@sigstore/core/dist/encoding.js b/deps/npm/node_modules/@sigstore/core/dist/encoding.js deleted file mode 100644 index b020ac4d6ecd42..00000000000000 --- a/deps/npm/node_modules/@sigstore/core/dist/encoding.js +++ /dev/null @@ -1,28 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.base64Decode = exports.base64Encode = void 0; -/* -Copyright 2023 The Sigstore Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -const BASE64_ENCODING = 'base64'; -const UTF8_ENCODING = 'utf-8'; -function base64Encode(str) { - return Buffer.from(str, UTF8_ENCODING).toString(BASE64_ENCODING); -} -exports.base64Encode = base64Encode; -function base64Decode(str) { - return Buffer.from(str, BASE64_ENCODING).toString(UTF8_ENCODING); -} -exports.base64Decode = base64Decode; diff --git a/deps/npm/node_modules/@sigstore/core/package.json b/deps/npm/node_modules/@sigstore/core/package.json deleted file mode 100644 index 621ff1715bcd1c..00000000000000 --- a/deps/npm/node_modules/@sigstore/core/package.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "@sigstore/core", - "version": "1.1.0", - "description": "Base library for Sigstore", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "scripts": { - "clean": "shx rm -rf dist *.tsbuildinfo", - "build": "tsc --build", - "test": "jest" - }, - "files": [ - "dist" - ], - "author": "bdehamer@github.com", - "license": "Apache-2.0", - "repository": { - "type": "git", - "url": "git+https://github.com/sigstore/sigstore-js.git" - }, - "bugs": { - "url": "https://github.com/sigstore/sigstore-js/issues" - }, - "homepage": "https://github.com/sigstore/sigstore-js/tree/main/packages/core#readme", - "publishConfig": { - "provenance": true - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } -} diff --git a/deps/npm/node_modules/@sigstore/sign/dist/bundler/bundle.js b/deps/npm/node_modules/@sigstore/sign/dist/bundler/bundle.js deleted file mode 100644 index 7c2ca9164f0dfe..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/dist/bundler/bundle.js +++ /dev/null @@ -1,71 +0,0 @@ -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.toDSSEBundle = exports.toMessageSignatureBundle = void 0; -/* -Copyright 2023 The Sigstore Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -const sigstore = __importStar(require("@sigstore/bundle")); -const util_1 = require("../util"); -// Helper functions for assembling the parts of a Sigstore bundle -// Message signature bundle - $case: 'messageSignature' -function toMessageSignatureBundle(artifact, signature) { - const digest = util_1.crypto.hash(artifact.data); - return sigstore.toMessageSignatureBundle({ - digest, - signature: signature.signature, - certificate: signature.key.$case === 'x509Certificate' - ? util_1.pem.toDER(signature.key.certificate) - : undefined, - keyHint: signature.key.$case === 'publicKey' ? signature.key.hint : undefined, - }); -} -exports.toMessageSignatureBundle = toMessageSignatureBundle; -// DSSE envelope bundle - $case: 'dsseEnvelope' -function toDSSEBundle(artifact, signature, singleCertificate) { - return sigstore.toDSSEBundle({ - artifact: artifact.data, - artifactType: artifact.type, - signature: signature.signature, - certificate: signature.key.$case === 'x509Certificate' - ? util_1.pem.toDER(signature.key.certificate) - : undefined, - keyHint: signature.key.$case === 'publicKey' ? signature.key.hint : undefined, - singleCertificate, - }); -} -exports.toDSSEBundle = toDSSEBundle; diff --git a/deps/npm/node_modules/@sigstore/sign/dist/bundler/dsse.js b/deps/npm/node_modules/@sigstore/sign/dist/bundler/dsse.js deleted file mode 100644 index 621700df93842a..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/dist/bundler/dsse.js +++ /dev/null @@ -1,46 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.DSSEBundleBuilder = void 0; -/* -Copyright 2023 The Sigstore Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -const util_1 = require("../util"); -const base_1 = require("./base"); -const bundle_1 = require("./bundle"); -// BundleBuilder implementation for DSSE wrapped attestations -class DSSEBundleBuilder extends base_1.BaseBundleBuilder { - constructor(options) { - super(options); - this.singleCertificate = options.singleCertificate ?? false; - } - // DSSE requires the artifact to be pre-encoded with the payload type - // before the signature is generated. - async prepare(artifact) { - const a = artifactDefaults(artifact); - return util_1.dsse.preAuthEncoding(a.type, a.data); - } - // Packages the artifact and signature into a DSSE bundle - async package(artifact, signature) { - return (0, bundle_1.toDSSEBundle)(artifactDefaults(artifact), signature, this.singleCertificate); - } -} -exports.DSSEBundleBuilder = DSSEBundleBuilder; -// Defaults the artifact type to an empty string if not provided -function artifactDefaults(artifact) { - return { - ...artifact, - type: artifact.type ?? '', - }; -} diff --git a/deps/npm/node_modules/@sigstore/sign/dist/external/fetch.js b/deps/npm/node_modules/@sigstore/sign/dist/external/fetch.js deleted file mode 100644 index b2d81bde7be16f..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/dist/external/fetch.js +++ /dev/null @@ -1,99 +0,0 @@ -"use strict"; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.fetchWithRetry = void 0; -/* -Copyright 2023 The Sigstore Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -const http2_1 = require("http2"); -const make_fetch_happen_1 = __importDefault(require("make-fetch-happen")); -const proc_log_1 = require("proc-log"); -const promise_retry_1 = __importDefault(require("promise-retry")); -const util_1 = require("../util"); -const error_1 = require("./error"); -const { HTTP2_HEADER_LOCATION, HTTP2_HEADER_CONTENT_TYPE, HTTP2_HEADER_USER_AGENT, HTTP_STATUS_INTERNAL_SERVER_ERROR, HTTP_STATUS_TOO_MANY_REQUESTS, HTTP_STATUS_REQUEST_TIMEOUT, } = http2_1.constants; -async function fetchWithRetry(url, options) { - return (0, promise_retry_1.default)(async (retry, attemptNum) => { - const method = options.method || 'POST'; - const headers = { - [HTTP2_HEADER_USER_AGENT]: util_1.ua.getUserAgent(), - ...options.headers, - }; - const response = await (0, make_fetch_happen_1.default)(url, { - method, - headers, - body: options.body, - timeout: options.timeout, - retry: false, // We're handling retries ourselves - }).catch((reason) => { - proc_log_1.log.http('fetch', `${method} ${url} attempt ${attemptNum} failed with ${reason}`); - return retry(reason); - }); - if (response.ok) { - return response; - } - else { - const error = await errorFromResponse(response); - proc_log_1.log.http('fetch', `${method} ${url} attempt ${attemptNum} failed with ${response.status}`); - if (retryable(response.status)) { - return retry(error); - } - else { - throw error; - } - } - }, retryOpts(options.retry)); -} -exports.fetchWithRetry = fetchWithRetry; -// Translate a Response into an HTTPError instance. This will attempt to parse -// the response body for a message, but will default to the statusText if none -// is found. -const errorFromResponse = async (response) => { - let message = response.statusText; - const location = response.headers?.get(HTTP2_HEADER_LOCATION) || undefined; - const contentType = response.headers?.get(HTTP2_HEADER_CONTENT_TYPE); - // If response type is JSON, try to parse the body for a message - if (contentType?.includes('application/json')) { - try { - const body = await response.json(); - message = body.message || message; - } - catch (e) { - // ignore - } - } - return new error_1.HTTPError({ - status: response.status, - message: message, - location: location, - }); -}; -// Determine if a status code is retryable. This includes 5xx errors, 408, and -// 429. -const retryable = (status) => [HTTP_STATUS_REQUEST_TIMEOUT, HTTP_STATUS_TOO_MANY_REQUESTS].includes(status) || status >= HTTP_STATUS_INTERNAL_SERVER_ERROR; -// Normalize the retry options to the format expected by promise-retry -const retryOpts = (retry) => { - if (typeof retry === 'boolean') { - return { retries: retry ? 1 : 0 }; - } - else if (typeof retry === 'number') { - return { retries: retry }; - } - else { - return { retries: 0, ...retry }; - } -}; diff --git a/deps/npm/node_modules/@sigstore/sign/dist/witness/tlog/entry.js b/deps/npm/node_modules/@sigstore/sign/dist/witness/tlog/entry.js deleted file mode 100644 index f6c165380ba45d..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/dist/witness/tlog/entry.js +++ /dev/null @@ -1,136 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.toProposedEntry = void 0; -/* -Copyright 2023 The Sigstore Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -const bundle_1 = require("@sigstore/bundle"); -const util_1 = require("../../util"); -function toProposedEntry(content, publicKey, -// TODO: Remove this parameter once have completely switched to 'dsse' entries -entryType = 'intoto') { - switch (content.$case) { - case 'dsseEnvelope': - // TODO: Remove this conditional once have completely switched to 'dsse' entries - if (entryType === 'dsse') { - return toProposedDSSEEntry(content.dsseEnvelope, publicKey); - } - return toProposedIntotoEntry(content.dsseEnvelope, publicKey); - case 'messageSignature': - return toProposedHashedRekordEntry(content.messageSignature, publicKey); - } -} -exports.toProposedEntry = toProposedEntry; -// Returns a properly formatted Rekor "hashedrekord" entry for the given digest -// and signature -function toProposedHashedRekordEntry(messageSignature, publicKey) { - const hexDigest = messageSignature.messageDigest.digest.toString('hex'); - const b64Signature = messageSignature.signature.toString('base64'); - const b64Key = util_1.encoding.base64Encode(publicKey); - return { - apiVersion: '0.0.1', - kind: 'hashedrekord', - spec: { - data: { - hash: { - algorithm: 'sha256', - value: hexDigest, - }, - }, - signature: { - content: b64Signature, - publicKey: { - content: b64Key, - }, - }, - }, - }; -} -// Returns a properly formatted Rekor "dsse" entry for the given DSSE envelope -// and signature -function toProposedDSSEEntry(envelope, publicKey) { - const envelopeJSON = JSON.stringify((0, bundle_1.envelopeToJSON)(envelope)); - const encodedKey = util_1.encoding.base64Encode(publicKey); - return { - apiVersion: '0.0.1', - kind: 'dsse', - spec: { - proposedContent: { - envelope: envelopeJSON, - verifiers: [encodedKey], - }, - }, - }; -} -// Returns a properly formatted Rekor "intoto" entry for the given DSSE -// envelope and signature -function toProposedIntotoEntry(envelope, publicKey) { - // Calculate the value for the payloadHash field in the Rekor entry - const payloadHash = util_1.crypto.hash(envelope.payload).toString('hex'); - // Calculate the value for the hash field in the Rekor entry - const envelopeHash = calculateDSSEHash(envelope, publicKey); - // Collect values for re-creating the DSSE envelope. - // Double-encode payload and signature cause that's what Rekor expects - const payload = util_1.encoding.base64Encode(envelope.payload.toString('base64')); - const sig = util_1.encoding.base64Encode(envelope.signatures[0].sig.toString('base64')); - const keyid = envelope.signatures[0].keyid; - const encodedKey = util_1.encoding.base64Encode(publicKey); - // Create the envelope portion of the entry. Note the inclusion of the - // publicKey in the signature struct is not a standard part of a DSSE - // envelope, but is required by Rekor. - const dsse = { - payloadType: envelope.payloadType, - payload: payload, - signatures: [{ sig, publicKey: encodedKey }], - }; - // If the keyid is an empty string, Rekor seems to remove it altogether. We - // need to do the same here so that we can properly recreate the entry for - // verification. - if (keyid.length > 0) { - dsse.signatures[0].keyid = keyid; - } - return { - apiVersion: '0.0.2', - kind: 'intoto', - spec: { - content: { - envelope: dsse, - hash: { algorithm: 'sha256', value: envelopeHash }, - payloadHash: { algorithm: 'sha256', value: payloadHash }, - }, - }, - }; -} -// Calculates the hash of a DSSE envelope for inclusion in a Rekor entry. -// There is no standard way to do this, so the scheme we're using as as -// follows: -// * payload is base64 encoded -// * signature is base64 encoded (only the first signature is used) -// * keyid is included ONLY if it is NOT an empty string -// * The resulting JSON is canonicalized and hashed to a hex string -function calculateDSSEHash(envelope, publicKey) { - const dsse = { - payloadType: envelope.payloadType, - payload: envelope.payload.toString('base64'), - signatures: [ - { sig: envelope.signatures[0].sig.toString('base64'), publicKey }, - ], - }; - // If the keyid is an empty string, Rekor seems to remove it altogether. - if (envelope.signatures[0].keyid.length > 0) { - dsse.signatures[0].keyid = envelope.signatures[0].keyid; - } - return util_1.crypto.hash(util_1.json.canonicalize(dsse)).toString('hex'); -} diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/agent/lib/agents.js b/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/agent/lib/agents.js deleted file mode 100644 index c541b93001517e..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/agent/lib/agents.js +++ /dev/null @@ -1,206 +0,0 @@ -'use strict' - -const net = require('net') -const tls = require('tls') -const { once } = require('events') -const timers = require('timers/promises') -const { normalizeOptions, cacheOptions } = require('./options') -const { getProxy, getProxyAgent, proxyCache } = require('./proxy.js') -const Errors = require('./errors.js') -const { Agent: AgentBase } = require('agent-base') - -module.exports = class Agent extends AgentBase { - #options - #timeouts - #proxy - #noProxy - #ProxyAgent - - constructor (options = {}) { - const { timeouts, proxy, noProxy, ...normalizedOptions } = normalizeOptions(options) - - super(normalizedOptions) - - this.#options = normalizedOptions - this.#timeouts = timeouts - - if (proxy) { - this.#proxy = new URL(proxy) - this.#noProxy = noProxy - this.#ProxyAgent = getProxyAgent(proxy) - } - } - - get proxy () { - return this.#proxy ? { url: this.#proxy } : {} - } - - #getProxy (options) { - if (!this.#proxy) { - return - } - - const proxy = getProxy(`${options.protocol}//${options.host}:${options.port}`, { - proxy: this.#proxy, - noProxy: this.#noProxy, - }) - - if (!proxy) { - return - } - - const cacheKey = cacheOptions({ - ...options, - ...this.#options, - timeouts: this.#timeouts, - proxy, - }) - - if (proxyCache.has(cacheKey)) { - return proxyCache.get(cacheKey) - } - - let ProxyAgent = this.#ProxyAgent - if (Array.isArray(ProxyAgent)) { - ProxyAgent = this.isSecureEndpoint(options) ? ProxyAgent[1] : ProxyAgent[0] - } - - const proxyAgent = new ProxyAgent(proxy, { - ...this.#options, - socketOptions: { family: this.#options.family }, - }) - proxyCache.set(cacheKey, proxyAgent) - - return proxyAgent - } - - // takes an array of promises and races them against the connection timeout - // which will throw the necessary error if it is hit. This will return the - // result of the promise race. - async #timeoutConnection ({ promises, options, timeout }, ac = new AbortController()) { - if (timeout) { - const connectionTimeout = timers.setTimeout(timeout, null, { signal: ac.signal }) - .then(() => { - throw new Errors.ConnectionTimeoutError(`${options.host}:${options.port}`) - }).catch((err) => { - if (err.name === 'AbortError') { - return - } - throw err - }) - promises.push(connectionTimeout) - } - - let result - try { - result = await Promise.race(promises) - ac.abort() - } catch (err) { - ac.abort() - throw err - } - return result - } - - async connect (request, options) { - // if the connection does not have its own lookup function - // set, then use the one from our options - options.lookup ??= this.#options.lookup - - let socket - let timeout = this.#timeouts.connection - const isSecureEndpoint = this.isSecureEndpoint(options) - - const proxy = this.#getProxy(options) - if (proxy) { - // some of the proxies will wait for the socket to fully connect before - // returning so we have to await this while also racing it against the - // connection timeout. - const start = Date.now() - socket = await this.#timeoutConnection({ - options, - timeout, - promises: [proxy.connect(request, options)], - }) - // see how much time proxy.connect took and subtract it from - // the timeout - if (timeout) { - timeout = timeout - (Date.now() - start) - } - } else { - socket = (isSecureEndpoint ? tls : net).connect(options) - } - - socket.setKeepAlive(this.keepAlive, this.keepAliveMsecs) - socket.setNoDelay(this.keepAlive) - - const abortController = new AbortController() - const { signal } = abortController - - const connectPromise = socket[isSecureEndpoint ? 'secureConnecting' : 'connecting'] - ? once(socket, isSecureEndpoint ? 'secureConnect' : 'connect', { signal }) - : Promise.resolve() - - await this.#timeoutConnection({ - options, - timeout, - promises: [ - connectPromise, - once(socket, 'error', { signal }).then((err) => { - throw err[0] - }), - ], - }, abortController) - - if (this.#timeouts.idle) { - socket.setTimeout(this.#timeouts.idle, () => { - socket.destroy(new Errors.IdleTimeoutError(`${options.host}:${options.port}`)) - }) - } - - return socket - } - - addRequest (request, options) { - const proxy = this.#getProxy(options) - // it would be better to call proxy.addRequest here but this causes the - // http-proxy-agent to call its super.addRequest which causes the request - // to be added to the agent twice. since we only support 3 agents - // currently (see the required agents in proxy.js) we have manually - // checked that the only public methods we need to call are called in the - // next block. this could change in the future and presumably we would get - // failing tests until we have properly called the necessary methods on - // each of our proxy agents - if (proxy?.setRequestProps) { - proxy.setRequestProps(request, options) - } - - request.setHeader('connection', this.keepAlive ? 'keep-alive' : 'close') - - if (this.#timeouts.response) { - let responseTimeout - request.once('finish', () => { - setTimeout(() => { - request.destroy(new Errors.ResponseTimeoutError(request, this.#proxy)) - }, this.#timeouts.response) - }) - request.once('response', () => { - clearTimeout(responseTimeout) - }) - } - - if (this.#timeouts.transfer) { - let transferTimeout - request.once('response', (res) => { - setTimeout(() => { - res.destroy(new Errors.TransferTimeoutError(request, this.#proxy)) - }, this.#timeouts.transfer) - res.once('close', () => { - clearTimeout(transferTimeout) - }) - }) - } - - return super.addRequest(request, options) - } -} diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/agent/lib/dns.js b/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/agent/lib/dns.js deleted file mode 100644 index 3c6946c566d736..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/agent/lib/dns.js +++ /dev/null @@ -1,53 +0,0 @@ -'use strict' - -const { LRUCache } = require('lru-cache') -const dns = require('dns') - -// this is a factory so that each request can have its own opts (i.e. ttl) -// while still sharing the cache across all requests -const cache = new LRUCache({ max: 50 }) - -const getOptions = ({ - family = 0, - hints = dns.ADDRCONFIG, - all = false, - verbatim = undefined, - ttl = 5 * 60 * 1000, - lookup = dns.lookup, -}) => ({ - // hints and lookup are returned since both are top level properties to (net|tls).connect - hints, - lookup: (hostname, ...args) => { - const callback = args.pop() // callback is always last arg - const lookupOptions = args[0] ?? {} - - const options = { - family, - hints, - all, - verbatim, - ...(typeof lookupOptions === 'number' ? { family: lookupOptions } : lookupOptions), - } - - const key = JSON.stringify({ hostname, ...options }) - - if (cache.has(key)) { - const cached = cache.get(key) - return process.nextTick(callback, null, ...cached) - } - - lookup(hostname, options, (err, ...result) => { - if (err) { - return callback(err) - } - - cache.set(key, result, { ttl }) - return callback(null, ...result) - }) - }, -}) - -module.exports = { - cache, - getOptions, -} diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/agent/lib/errors.js b/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/agent/lib/errors.js deleted file mode 100644 index 70475aec8eb357..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/agent/lib/errors.js +++ /dev/null @@ -1,61 +0,0 @@ -'use strict' - -class InvalidProxyProtocolError extends Error { - constructor (url) { - super(`Invalid protocol \`${url.protocol}\` connecting to proxy \`${url.host}\``) - this.code = 'EINVALIDPROXY' - this.proxy = url - } -} - -class ConnectionTimeoutError extends Error { - constructor (host) { - super(`Timeout connecting to host \`${host}\``) - this.code = 'ECONNECTIONTIMEOUT' - this.host = host - } -} - -class IdleTimeoutError extends Error { - constructor (host) { - super(`Idle timeout reached for host \`${host}\``) - this.code = 'EIDLETIMEOUT' - this.host = host - } -} - -class ResponseTimeoutError extends Error { - constructor (request, proxy) { - let msg = 'Response timeout ' - if (proxy) { - msg += `from proxy \`${proxy.host}\` ` - } - msg += `connecting to host \`${request.host}\`` - super(msg) - this.code = 'ERESPONSETIMEOUT' - this.proxy = proxy - this.request = request - } -} - -class TransferTimeoutError extends Error { - constructor (request, proxy) { - let msg = 'Transfer timeout ' - if (proxy) { - msg += `from proxy \`${proxy.host}\` ` - } - msg += `for \`${request.host}\`` - super(msg) - this.code = 'ETRANSFERTIMEOUT' - this.proxy = proxy - this.request = request - } -} - -module.exports = { - InvalidProxyProtocolError, - ConnectionTimeoutError, - IdleTimeoutError, - ResponseTimeoutError, - TransferTimeoutError, -} diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/agent/lib/index.js b/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/agent/lib/index.js deleted file mode 100644 index b33d6eaef07a21..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/agent/lib/index.js +++ /dev/null @@ -1,56 +0,0 @@ -'use strict' - -const { LRUCache } = require('lru-cache') -const { normalizeOptions, cacheOptions } = require('./options') -const { getProxy, proxyCache } = require('./proxy.js') -const dns = require('./dns.js') -const Agent = require('./agents.js') - -const agentCache = new LRUCache({ max: 20 }) - -const getAgent = (url, { agent, proxy, noProxy, ...options } = {}) => { - // false has meaning so this can't be a simple truthiness check - if (agent != null) { - return agent - } - - url = new URL(url) - - const proxyForUrl = getProxy(url, { proxy, noProxy }) - const normalizedOptions = { - ...normalizeOptions(options), - proxy: proxyForUrl, - } - - const cacheKey = cacheOptions({ - ...normalizedOptions, - secureEndpoint: url.protocol === 'https:', - }) - - if (agentCache.has(cacheKey)) { - return agentCache.get(cacheKey) - } - - const newAgent = new Agent(normalizedOptions) - agentCache.set(cacheKey, newAgent) - - return newAgent -} - -module.exports = { - getAgent, - Agent, - // these are exported for backwards compatability - HttpAgent: Agent, - HttpsAgent: Agent, - cache: { - proxy: proxyCache, - agent: agentCache, - dns: dns.cache, - clear: () => { - proxyCache.clear() - agentCache.clear() - dns.cache.clear() - }, - }, -} diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/agent/lib/options.js b/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/agent/lib/options.js deleted file mode 100644 index 0bf53f725f0846..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/agent/lib/options.js +++ /dev/null @@ -1,86 +0,0 @@ -'use strict' - -const dns = require('./dns') - -const normalizeOptions = (opts) => { - const family = parseInt(opts.family ?? '0', 10) - const keepAlive = opts.keepAlive ?? true - - const normalized = { - // nodejs http agent options. these are all the defaults - // but kept here to increase the likelihood of cache hits - // https://nodejs.org/api/http.html#new-agentoptions - keepAliveMsecs: keepAlive ? 1000 : undefined, - maxSockets: opts.maxSockets ?? 15, - maxTotalSockets: Infinity, - maxFreeSockets: keepAlive ? 256 : undefined, - scheduling: 'fifo', - // then spread the rest of the options - ...opts, - // we already set these to their defaults that we want - family, - keepAlive, - // our custom timeout options - timeouts: { - // the standard timeout option is mapped to our idle timeout - // and then deleted below - idle: opts.timeout ?? 0, - connection: 0, - response: 0, - transfer: 0, - ...opts.timeouts, - }, - // get the dns options that go at the top level of socket connection - ...dns.getOptions({ family, ...opts.dns }), - } - - // remove timeout since we already used it to set our own idle timeout - delete normalized.timeout - - return normalized -} - -const createKey = (obj) => { - let key = '' - const sorted = Object.entries(obj).sort((a, b) => a[0] - b[0]) - for (let [k, v] of sorted) { - if (v == null) { - v = 'null' - } else if (v instanceof URL) { - v = v.toString() - } else if (typeof v === 'object') { - v = createKey(v) - } - key += `${k}:${v}:` - } - return key -} - -const cacheOptions = ({ secureEndpoint, ...options }) => createKey({ - secureEndpoint: !!secureEndpoint, - // socket connect options - family: options.family, - hints: options.hints, - localAddress: options.localAddress, - // tls specific connect options - strictSsl: secureEndpoint ? !!options.rejectUnauthorized : false, - ca: secureEndpoint ? options.ca : null, - cert: secureEndpoint ? options.cert : null, - key: secureEndpoint ? options.key : null, - // http agent options - keepAlive: options.keepAlive, - keepAliveMsecs: options.keepAliveMsecs, - maxSockets: options.maxSockets, - maxTotalSockets: options.maxTotalSockets, - maxFreeSockets: options.maxFreeSockets, - scheduling: options.scheduling, - // timeout options - timeouts: options.timeouts, - // proxy - proxy: options.proxy, -}) - -module.exports = { - normalizeOptions, - cacheOptions, -} diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/agent/lib/proxy.js b/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/agent/lib/proxy.js deleted file mode 100644 index 6272e929e57bcf..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/agent/lib/proxy.js +++ /dev/null @@ -1,88 +0,0 @@ -'use strict' - -const { HttpProxyAgent } = require('http-proxy-agent') -const { HttpsProxyAgent } = require('https-proxy-agent') -const { SocksProxyAgent } = require('socks-proxy-agent') -const { LRUCache } = require('lru-cache') -const { InvalidProxyProtocolError } = require('./errors.js') - -const PROXY_CACHE = new LRUCache({ max: 20 }) - -const SOCKS_PROTOCOLS = new Set(SocksProxyAgent.protocols) - -const PROXY_ENV_KEYS = new Set(['https_proxy', 'http_proxy', 'proxy', 'no_proxy']) - -const PROXY_ENV = Object.entries(process.env).reduce((acc, [key, value]) => { - key = key.toLowerCase() - if (PROXY_ENV_KEYS.has(key)) { - acc[key] = value - } - return acc -}, {}) - -const getProxyAgent = (url) => { - url = new URL(url) - - const protocol = url.protocol.slice(0, -1) - if (SOCKS_PROTOCOLS.has(protocol)) { - return SocksProxyAgent - } - if (protocol === 'https' || protocol === 'http') { - return [HttpProxyAgent, HttpsProxyAgent] - } - - throw new InvalidProxyProtocolError(url) -} - -const isNoProxy = (url, noProxy) => { - if (typeof noProxy === 'string') { - noProxy = noProxy.split(',').map((p) => p.trim()).filter(Boolean) - } - - if (!noProxy || !noProxy.length) { - return false - } - - const hostSegments = url.hostname.split('.').reverse() - - return noProxy.some((no) => { - const noSegments = no.split('.').filter(Boolean).reverse() - if (!noSegments.length) { - return false - } - - for (let i = 0; i < noSegments.length; i++) { - if (hostSegments[i] !== noSegments[i]) { - return false - } - } - - return true - }) -} - -const getProxy = (url, { proxy, noProxy }) => { - url = new URL(url) - - if (!proxy) { - proxy = url.protocol === 'https:' - ? PROXY_ENV.https_proxy - : PROXY_ENV.https_proxy || PROXY_ENV.http_proxy || PROXY_ENV.proxy - } - - if (!noProxy) { - noProxy = PROXY_ENV.no_proxy - } - - if (!proxy || isNoProxy(url, noProxy)) { - return null - } - - return new URL(proxy) -} - -module.exports = { - getProxyAgent, - getProxy, - proxyCache: PROXY_CACHE, -} diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/agent/package.json b/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/agent/package.json deleted file mode 100644 index ef5b4e3228cc46..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/agent/package.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "name": "@npmcli/agent", - "version": "2.2.2", - "description": "the http/https agent used by the npm cli", - "main": "lib/index.js", - "scripts": { - "gencerts": "bash scripts/create-cert.sh", - "test": "tap", - "lint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"", - "postlint": "template-oss-check", - "template-oss-apply": "template-oss-apply --force", - "lintfix": "npm run lint -- --fix", - "snap": "tap", - "posttest": "npm run lint" - }, - "author": "GitHub Inc.", - "license": "ISC", - "bugs": { - "url": "https://github.com/npm/agent/issues" - }, - "homepage": "https://github.com/npm/agent#readme", - "files": [ - "bin/", - "lib/" - ], - "engines": { - "node": "^16.14.0 || >=18.0.0" - }, - "templateOSS": { - "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.21.3", - "publish": "true" - }, - "dependencies": { - "agent-base": "^7.1.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.1", - "lru-cache": "^10.0.1", - "socks-proxy-agent": "^8.0.3" - }, - "devDependencies": { - "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.21.3", - "minipass-fetch": "^3.0.3", - "nock": "^13.2.7", - "semver": "^7.5.4", - "simple-socks": "^3.1.0", - "tap": "^16.3.0" - }, - "repository": { - "type": "git", - "url": "https://github.com/npm/agent.git" - }, - "tap": { - "nyc-arg": [ - "--exclude", - "tap-snapshots/**" - ] - } -} diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/fs/LICENSE.md b/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/fs/LICENSE.md deleted file mode 100644 index 5fc208ff122e08..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/fs/LICENSE.md +++ /dev/null @@ -1,20 +0,0 @@ - - -ISC License - -Copyright npm, Inc. - -Permission to use, copy, modify, and/or distribute this -software for any purpose with or without fee is hereby -granted, provided that the above copyright notice and this -permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND NPM DISCLAIMS ALL -WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO -EVENT SHALL NPM BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE -USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/fs/lib/common/get-options.js b/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/fs/lib/common/get-options.js deleted file mode 100644 index cb5982f79077ac..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/fs/lib/common/get-options.js +++ /dev/null @@ -1,20 +0,0 @@ -// given an input that may or may not be an object, return an object that has -// a copy of every defined property listed in 'copy'. if the input is not an -// object, assign it to the property named by 'wrap' -const getOptions = (input, { copy, wrap }) => { - const result = {} - - if (input && typeof input === 'object') { - for (const prop of copy) { - if (input[prop] !== undefined) { - result[prop] = input[prop] - } - } - } else { - result[wrap] = input - } - - return result -} - -module.exports = getOptions diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/fs/lib/common/node.js b/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/fs/lib/common/node.js deleted file mode 100644 index 4d13bc037359d7..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/fs/lib/common/node.js +++ /dev/null @@ -1,9 +0,0 @@ -const semver = require('semver') - -const satisfies = (range) => { - return semver.satisfies(process.version, range, { includePrerelease: true }) -} - -module.exports = { - satisfies, -} diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/fs/lib/cp/LICENSE b/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/fs/lib/cp/LICENSE deleted file mode 100644 index 93546dfb7655bf..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/fs/lib/cp/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -(The MIT License) - -Copyright (c) 2011-2017 JP Richardson - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files -(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, - merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS -OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/fs/lib/cp/errors.js b/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/fs/lib/cp/errors.js deleted file mode 100644 index 1cd1e05d0c533d..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/fs/lib/cp/errors.js +++ /dev/null @@ -1,129 +0,0 @@ -'use strict' -const { inspect } = require('util') - -// adapted from node's internal/errors -// https://github.com/nodejs/node/blob/c8a04049/lib/internal/errors.js - -// close copy of node's internal SystemError class. -class SystemError { - constructor (code, prefix, context) { - // XXX context.code is undefined in all constructors used in cp/polyfill - // that may be a bug copied from node, maybe the constructor should use - // `code` not `errno`? nodejs/node#41104 - let message = `${prefix}: ${context.syscall} returned ` + - `${context.code} (${context.message})` - - if (context.path !== undefined) { - message += ` ${context.path}` - } - if (context.dest !== undefined) { - message += ` => ${context.dest}` - } - - this.code = code - Object.defineProperties(this, { - name: { - value: 'SystemError', - enumerable: false, - writable: true, - configurable: true, - }, - message: { - value: message, - enumerable: false, - writable: true, - configurable: true, - }, - info: { - value: context, - enumerable: true, - configurable: true, - writable: false, - }, - errno: { - get () { - return context.errno - }, - set (value) { - context.errno = value - }, - enumerable: true, - configurable: true, - }, - syscall: { - get () { - return context.syscall - }, - set (value) { - context.syscall = value - }, - enumerable: true, - configurable: true, - }, - }) - - if (context.path !== undefined) { - Object.defineProperty(this, 'path', { - get () { - return context.path - }, - set (value) { - context.path = value - }, - enumerable: true, - configurable: true, - }) - } - - if (context.dest !== undefined) { - Object.defineProperty(this, 'dest', { - get () { - return context.dest - }, - set (value) { - context.dest = value - }, - enumerable: true, - configurable: true, - }) - } - } - - toString () { - return `${this.name} [${this.code}]: ${this.message}` - } - - [Symbol.for('nodejs.util.inspect.custom')] (_recurseTimes, ctx) { - return inspect(this, { - ...ctx, - getters: true, - customInspect: false, - }) - } -} - -function E (code, message) { - module.exports[code] = class NodeError extends SystemError { - constructor (ctx) { - super(code, message, ctx) - } - } -} - -E('ERR_FS_CP_DIR_TO_NON_DIR', 'Cannot overwrite directory with non-directory') -E('ERR_FS_CP_EEXIST', 'Target already exists') -E('ERR_FS_CP_EINVAL', 'Invalid src or dest') -E('ERR_FS_CP_FIFO_PIPE', 'Cannot copy a FIFO pipe') -E('ERR_FS_CP_NON_DIR_TO_DIR', 'Cannot overwrite non-directory with directory') -E('ERR_FS_CP_SOCKET', 'Cannot copy a socket file') -E('ERR_FS_CP_SYMLINK_TO_SUBDIRECTORY', 'Cannot overwrite symlink in subdirectory of self') -E('ERR_FS_CP_UNKNOWN', 'Cannot copy an unknown file type') -E('ERR_FS_EISDIR', 'Path is a directory') - -module.exports.ERR_INVALID_ARG_TYPE = class ERR_INVALID_ARG_TYPE extends Error { - constructor (name, expected, actual) { - super() - this.code = 'ERR_INVALID_ARG_TYPE' - this.message = `The ${name} argument must be ${expected}. Received ${typeof actual}` - } -} diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/fs/lib/cp/index.js b/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/fs/lib/cp/index.js deleted file mode 100644 index 972ce7aa12abef..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/fs/lib/cp/index.js +++ /dev/null @@ -1,22 +0,0 @@ -const fs = require('fs/promises') -const getOptions = require('../common/get-options.js') -const node = require('../common/node.js') -const polyfill = require('./polyfill.js') - -// node 16.7.0 added fs.cp -const useNative = node.satisfies('>=16.7.0') - -const cp = async (src, dest, opts) => { - const options = getOptions(opts, { - copy: ['dereference', 'errorOnExist', 'filter', 'force', 'preserveTimestamps', 'recursive'], - }) - - // the polyfill is tested separately from this module, no need to hack - // process.version to try to trigger it just for coverage - // istanbul ignore next - return useNative - ? fs.cp(src, dest, options) - : polyfill(src, dest, options) -} - -module.exports = cp diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/fs/lib/cp/polyfill.js b/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/fs/lib/cp/polyfill.js deleted file mode 100644 index 80eb10de971918..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/fs/lib/cp/polyfill.js +++ /dev/null @@ -1,428 +0,0 @@ -// this file is a modified version of the code in node 17.2.0 -// which is, in turn, a modified version of the fs-extra module on npm -// node core changes: -// - Use of the assert module has been replaced with core's error system. -// - All code related to the glob dependency has been removed. -// - Bring your own custom fs module is not currently supported. -// - Some basic code cleanup. -// changes here: -// - remove all callback related code -// - drop sync support -// - change assertions back to non-internal methods (see options.js) -// - throws ENOTDIR when rmdir gets an ENOENT for a path that exists in Windows -'use strict' - -const { - ERR_FS_CP_DIR_TO_NON_DIR, - ERR_FS_CP_EEXIST, - ERR_FS_CP_EINVAL, - ERR_FS_CP_FIFO_PIPE, - ERR_FS_CP_NON_DIR_TO_DIR, - ERR_FS_CP_SOCKET, - ERR_FS_CP_SYMLINK_TO_SUBDIRECTORY, - ERR_FS_CP_UNKNOWN, - ERR_FS_EISDIR, - ERR_INVALID_ARG_TYPE, -} = require('./errors.js') -const { - constants: { - errno: { - EEXIST, - EISDIR, - EINVAL, - ENOTDIR, - }, - }, -} = require('os') -const { - chmod, - copyFile, - lstat, - mkdir, - readdir, - readlink, - stat, - symlink, - unlink, - utimes, -} = require('fs/promises') -const { - dirname, - isAbsolute, - join, - parse, - resolve, - sep, - toNamespacedPath, -} = require('path') -const { fileURLToPath } = require('url') - -const defaultOptions = { - dereference: false, - errorOnExist: false, - filter: undefined, - force: true, - preserveTimestamps: false, - recursive: false, -} - -async function cp (src, dest, opts) { - if (opts != null && typeof opts !== 'object') { - throw new ERR_INVALID_ARG_TYPE('options', ['Object'], opts) - } - return cpFn( - toNamespacedPath(getValidatedPath(src)), - toNamespacedPath(getValidatedPath(dest)), - { ...defaultOptions, ...opts }) -} - -function getValidatedPath (fileURLOrPath) { - const path = fileURLOrPath != null && fileURLOrPath.href - && fileURLOrPath.origin - ? fileURLToPath(fileURLOrPath) - : fileURLOrPath - return path -} - -async function cpFn (src, dest, opts) { - // Warn about using preserveTimestamps on 32-bit node - // istanbul ignore next - if (opts.preserveTimestamps && process.arch === 'ia32') { - const warning = 'Using the preserveTimestamps option in 32-bit ' + - 'node is not recommended' - process.emitWarning(warning, 'TimestampPrecisionWarning') - } - const stats = await checkPaths(src, dest, opts) - const { srcStat, destStat } = stats - await checkParentPaths(src, srcStat, dest) - if (opts.filter) { - return handleFilter(checkParentDir, destStat, src, dest, opts) - } - return checkParentDir(destStat, src, dest, opts) -} - -async function checkPaths (src, dest, opts) { - const { 0: srcStat, 1: destStat } = await getStats(src, dest, opts) - if (destStat) { - if (areIdentical(srcStat, destStat)) { - throw new ERR_FS_CP_EINVAL({ - message: 'src and dest cannot be the same', - path: dest, - syscall: 'cp', - errno: EINVAL, - }) - } - if (srcStat.isDirectory() && !destStat.isDirectory()) { - throw new ERR_FS_CP_DIR_TO_NON_DIR({ - message: `cannot overwrite directory ${src} ` + - `with non-directory ${dest}`, - path: dest, - syscall: 'cp', - errno: EISDIR, - }) - } - if (!srcStat.isDirectory() && destStat.isDirectory()) { - throw new ERR_FS_CP_NON_DIR_TO_DIR({ - message: `cannot overwrite non-directory ${src} ` + - `with directory ${dest}`, - path: dest, - syscall: 'cp', - errno: ENOTDIR, - }) - } - } - - if (srcStat.isDirectory() && isSrcSubdir(src, dest)) { - throw new ERR_FS_CP_EINVAL({ - message: `cannot copy ${src} to a subdirectory of self ${dest}`, - path: dest, - syscall: 'cp', - errno: EINVAL, - }) - } - return { srcStat, destStat } -} - -function areIdentical (srcStat, destStat) { - return destStat.ino && destStat.dev && destStat.ino === srcStat.ino && - destStat.dev === srcStat.dev -} - -function getStats (src, dest, opts) { - const statFunc = opts.dereference ? - (file) => stat(file, { bigint: true }) : - (file) => lstat(file, { bigint: true }) - return Promise.all([ - statFunc(src), - statFunc(dest).catch((err) => { - // istanbul ignore next: unsure how to cover. - if (err.code === 'ENOENT') { - return null - } - // istanbul ignore next: unsure how to cover. - throw err - }), - ]) -} - -async function checkParentDir (destStat, src, dest, opts) { - const destParent = dirname(dest) - const dirExists = await pathExists(destParent) - if (dirExists) { - return getStatsForCopy(destStat, src, dest, opts) - } - await mkdir(destParent, { recursive: true }) - return getStatsForCopy(destStat, src, dest, opts) -} - -function pathExists (dest) { - return stat(dest).then( - () => true, - // istanbul ignore next: not sure when this would occur - (err) => (err.code === 'ENOENT' ? false : Promise.reject(err))) -} - -// Recursively check if dest parent is a subdirectory of src. -// It works for all file types including symlinks since it -// checks the src and dest inodes. It starts from the deepest -// parent and stops once it reaches the src parent or the root path. -async function checkParentPaths (src, srcStat, dest) { - const srcParent = resolve(dirname(src)) - const destParent = resolve(dirname(dest)) - if (destParent === srcParent || destParent === parse(destParent).root) { - return - } - let destStat - try { - destStat = await stat(destParent, { bigint: true }) - } catch (err) { - // istanbul ignore else: not sure when this would occur - if (err.code === 'ENOENT') { - return - } - // istanbul ignore next: not sure when this would occur - throw err - } - if (areIdentical(srcStat, destStat)) { - throw new ERR_FS_CP_EINVAL({ - message: `cannot copy ${src} to a subdirectory of self ${dest}`, - path: dest, - syscall: 'cp', - errno: EINVAL, - }) - } - return checkParentPaths(src, srcStat, destParent) -} - -const normalizePathToArray = (path) => - resolve(path).split(sep).filter(Boolean) - -// Return true if dest is a subdir of src, otherwise false. -// It only checks the path strings. -function isSrcSubdir (src, dest) { - const srcArr = normalizePathToArray(src) - const destArr = normalizePathToArray(dest) - return srcArr.every((cur, i) => destArr[i] === cur) -} - -async function handleFilter (onInclude, destStat, src, dest, opts, cb) { - const include = await opts.filter(src, dest) - if (include) { - return onInclude(destStat, src, dest, opts, cb) - } -} - -function startCopy (destStat, src, dest, opts) { - if (opts.filter) { - return handleFilter(getStatsForCopy, destStat, src, dest, opts) - } - return getStatsForCopy(destStat, src, dest, opts) -} - -async function getStatsForCopy (destStat, src, dest, opts) { - const statFn = opts.dereference ? stat : lstat - const srcStat = await statFn(src) - // istanbul ignore else: can't portably test FIFO - if (srcStat.isDirectory() && opts.recursive) { - return onDir(srcStat, destStat, src, dest, opts) - } else if (srcStat.isDirectory()) { - throw new ERR_FS_EISDIR({ - message: `${src} is a directory (not copied)`, - path: src, - syscall: 'cp', - errno: EINVAL, - }) - } else if (srcStat.isFile() || - srcStat.isCharacterDevice() || - srcStat.isBlockDevice()) { - return onFile(srcStat, destStat, src, dest, opts) - } else if (srcStat.isSymbolicLink()) { - return onLink(destStat, src, dest) - } else if (srcStat.isSocket()) { - throw new ERR_FS_CP_SOCKET({ - message: `cannot copy a socket file: ${dest}`, - path: dest, - syscall: 'cp', - errno: EINVAL, - }) - } else if (srcStat.isFIFO()) { - throw new ERR_FS_CP_FIFO_PIPE({ - message: `cannot copy a FIFO pipe: ${dest}`, - path: dest, - syscall: 'cp', - errno: EINVAL, - }) - } - // istanbul ignore next: should be unreachable - throw new ERR_FS_CP_UNKNOWN({ - message: `cannot copy an unknown file type: ${dest}`, - path: dest, - syscall: 'cp', - errno: EINVAL, - }) -} - -function onFile (srcStat, destStat, src, dest, opts) { - if (!destStat) { - return _copyFile(srcStat, src, dest, opts) - } - return mayCopyFile(srcStat, src, dest, opts) -} - -async function mayCopyFile (srcStat, src, dest, opts) { - if (opts.force) { - await unlink(dest) - return _copyFile(srcStat, src, dest, opts) - } else if (opts.errorOnExist) { - throw new ERR_FS_CP_EEXIST({ - message: `${dest} already exists`, - path: dest, - syscall: 'cp', - errno: EEXIST, - }) - } -} - -async function _copyFile (srcStat, src, dest, opts) { - await copyFile(src, dest) - if (opts.preserveTimestamps) { - return handleTimestampsAndMode(srcStat.mode, src, dest) - } - return setDestMode(dest, srcStat.mode) -} - -async function handleTimestampsAndMode (srcMode, src, dest) { - // Make sure the file is writable before setting the timestamp - // otherwise open fails with EPERM when invoked with 'r+' - // (through utimes call) - if (fileIsNotWritable(srcMode)) { - await makeFileWritable(dest, srcMode) - return setDestTimestampsAndMode(srcMode, src, dest) - } - return setDestTimestampsAndMode(srcMode, src, dest) -} - -function fileIsNotWritable (srcMode) { - return (srcMode & 0o200) === 0 -} - -function makeFileWritable (dest, srcMode) { - return setDestMode(dest, srcMode | 0o200) -} - -async function setDestTimestampsAndMode (srcMode, src, dest) { - await setDestTimestamps(src, dest) - return setDestMode(dest, srcMode) -} - -function setDestMode (dest, srcMode) { - return chmod(dest, srcMode) -} - -async function setDestTimestamps (src, dest) { - // The initial srcStat.atime cannot be trusted - // because it is modified by the read(2) system call - // (See https://nodejs.org/api/fs.html#fs_stat_time_values) - const updatedSrcStat = await stat(src) - return utimes(dest, updatedSrcStat.atime, updatedSrcStat.mtime) -} - -function onDir (srcStat, destStat, src, dest, opts) { - if (!destStat) { - return mkDirAndCopy(srcStat.mode, src, dest, opts) - } - return copyDir(src, dest, opts) -} - -async function mkDirAndCopy (srcMode, src, dest, opts) { - await mkdir(dest) - await copyDir(src, dest, opts) - return setDestMode(dest, srcMode) -} - -async function copyDir (src, dest, opts) { - const dir = await readdir(src) - for (let i = 0; i < dir.length; i++) { - const item = dir[i] - const srcItem = join(src, item) - const destItem = join(dest, item) - const { destStat } = await checkPaths(srcItem, destItem, opts) - await startCopy(destStat, srcItem, destItem, opts) - } -} - -async function onLink (destStat, src, dest) { - let resolvedSrc = await readlink(src) - if (!isAbsolute(resolvedSrc)) { - resolvedSrc = resolve(dirname(src), resolvedSrc) - } - if (!destStat) { - return symlink(resolvedSrc, dest) - } - let resolvedDest - try { - resolvedDest = await readlink(dest) - } catch (err) { - // Dest exists and is a regular file or directory, - // Windows may throw UNKNOWN error. If dest already exists, - // fs throws error anyway, so no need to guard against it here. - // istanbul ignore next: can only test on windows - if (err.code === 'EINVAL' || err.code === 'UNKNOWN') { - return symlink(resolvedSrc, dest) - } - // istanbul ignore next: should not be possible - throw err - } - if (!isAbsolute(resolvedDest)) { - resolvedDest = resolve(dirname(dest), resolvedDest) - } - if (isSrcSubdir(resolvedSrc, resolvedDest)) { - throw new ERR_FS_CP_EINVAL({ - message: `cannot copy ${resolvedSrc} to a subdirectory of self ` + - `${resolvedDest}`, - path: dest, - syscall: 'cp', - errno: EINVAL, - }) - } - // Do not copy if src is a subdir of dest since unlinking - // dest in this case would result in removing src contents - // and therefore a broken symlink would be created. - const srcStat = await stat(src) - if (srcStat.isDirectory() && isSrcSubdir(resolvedDest, resolvedSrc)) { - throw new ERR_FS_CP_SYMLINK_TO_SUBDIRECTORY({ - message: `cannot overwrite ${resolvedDest} with ${resolvedSrc}`, - path: dest, - syscall: 'cp', - errno: EINVAL, - }) - } - return copyLink(resolvedSrc, dest) -} - -async function copyLink (resolvedSrc, dest) { - await unlink(dest) - return symlink(resolvedSrc, dest) -} - -module.exports = cp diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/fs/lib/index.js b/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/fs/lib/index.js deleted file mode 100644 index 81c746304cc428..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/fs/lib/index.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict' - -const cp = require('./cp/index.js') -const withTempDir = require('./with-temp-dir.js') -const readdirScoped = require('./readdir-scoped.js') -const moveFile = require('./move-file.js') - -module.exports = { - cp, - withTempDir, - readdirScoped, - moveFile, -} diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/fs/lib/move-file.js b/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/fs/lib/move-file.js deleted file mode 100644 index d56e06d384659a..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/fs/lib/move-file.js +++ /dev/null @@ -1,78 +0,0 @@ -const { dirname, join, resolve, relative, isAbsolute } = require('path') -const fs = require('fs/promises') - -const pathExists = async path => { - try { - await fs.access(path) - return true - } catch (er) { - return er.code !== 'ENOENT' - } -} - -const moveFile = async (source, destination, options = {}, root = true, symlinks = []) => { - if (!source || !destination) { - throw new TypeError('`source` and `destination` file required') - } - - options = { - overwrite: true, - ...options, - } - - if (!options.overwrite && await pathExists(destination)) { - throw new Error(`The destination file exists: ${destination}`) - } - - await fs.mkdir(dirname(destination), { recursive: true }) - - try { - await fs.rename(source, destination) - } catch (error) { - if (error.code === 'EXDEV' || error.code === 'EPERM') { - const sourceStat = await fs.lstat(source) - if (sourceStat.isDirectory()) { - const files = await fs.readdir(source) - await Promise.all(files.map((file) => - moveFile(join(source, file), join(destination, file), options, false, symlinks) - )) - } else if (sourceStat.isSymbolicLink()) { - symlinks.push({ source, destination }) - } else { - await fs.copyFile(source, destination) - } - } else { - throw error - } - } - - if (root) { - await Promise.all(symlinks.map(async ({ source: symSource, destination: symDestination }) => { - let target = await fs.readlink(symSource) - // junction symlinks in windows will be absolute paths, so we need to - // make sure they point to the symlink destination - if (isAbsolute(target)) { - target = resolve(symDestination, relative(symSource, target)) - } - // try to determine what the actual file is so we can create the correct - // type of symlink in windows - let targetStat = 'file' - try { - targetStat = await fs.stat(resolve(dirname(symSource), target)) - if (targetStat.isDirectory()) { - targetStat = 'junction' - } - } catch { - // targetStat remains 'file' - } - await fs.symlink( - target, - symDestination, - targetStat - ) - })) - await fs.rm(source, { recursive: true, force: true }) - } -} - -module.exports = moveFile diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/fs/lib/readdir-scoped.js b/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/fs/lib/readdir-scoped.js deleted file mode 100644 index cd601dfbe7486b..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/fs/lib/readdir-scoped.js +++ /dev/null @@ -1,20 +0,0 @@ -const { readdir } = require('fs/promises') -const { join } = require('path') - -const readdirScoped = async (dir) => { - const results = [] - - for (const item of await readdir(dir)) { - if (item.startsWith('@')) { - for (const scopedItem of await readdir(join(dir, item))) { - results.push(join(item, scopedItem)) - } - } else { - results.push(item) - } - } - - return results -} - -module.exports = readdirScoped diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/fs/lib/with-temp-dir.js b/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/fs/lib/with-temp-dir.js deleted file mode 100644 index 0738ac4f29e1be..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/fs/lib/with-temp-dir.js +++ /dev/null @@ -1,39 +0,0 @@ -const { join, sep } = require('path') - -const getOptions = require('./common/get-options.js') -const { mkdir, mkdtemp, rm } = require('fs/promises') - -// create a temp directory, ensure its permissions match its parent, then call -// the supplied function passing it the path to the directory. clean up after -// the function finishes, whether it throws or not -const withTempDir = async (root, fn, opts) => { - const options = getOptions(opts, { - copy: ['tmpPrefix'], - }) - // create the directory - await mkdir(root, { recursive: true }) - - const target = await mkdtemp(join(`${root}${sep}`, options.tmpPrefix || '')) - let err - let result - - try { - result = await fn(target) - } catch (_err) { - err = _err - } - - try { - await rm(target, { force: true, recursive: true }) - } catch { - // ignore errors - } - - if (err) { - throw err - } - - return result -} - -module.exports = withTempDir diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/fs/package.json b/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/fs/package.json deleted file mode 100644 index 5261a11b78000e..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/@npmcli/fs/package.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "name": "@npmcli/fs", - "version": "3.1.1", - "description": "filesystem utilities for the npm cli", - "main": "lib/index.js", - "files": [ - "bin/", - "lib/" - ], - "scripts": { - "snap": "tap", - "test": "tap", - "npmclilint": "npmcli-lint", - "lint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"", - "lintfix": "npm run lint -- --fix", - "posttest": "npm run lint", - "postsnap": "npm run lintfix --", - "postlint": "template-oss-check", - "template-oss-apply": "template-oss-apply --force" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/npm/fs.git" - }, - "keywords": [ - "npm", - "oss" - ], - "author": "GitHub Inc.", - "license": "ISC", - "devDependencies": { - "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.22.0", - "tap": "^16.0.1" - }, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "templateOSS": { - "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.22.0" - }, - "tap": { - "nyc-arg": [ - "--exclude", - "tap-snapshots/**" - ] - } -} diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/LICENSE.md b/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/LICENSE.md deleted file mode 100644 index 8d28acf866d932..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/LICENSE.md +++ /dev/null @@ -1,16 +0,0 @@ -ISC License - -Copyright (c) npm, Inc. - -Permission to use, copy, modify, and/or distribute this software for -any purpose with or without fee is hereby granted, provided that the -above copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE COPYRIGHT HOLDER DISCLAIMS -ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR -CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE -OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE -USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/lib/content/path.js b/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/lib/content/path.js deleted file mode 100644 index ad5a76a4f73f26..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/lib/content/path.js +++ /dev/null @@ -1,29 +0,0 @@ -'use strict' - -const contentVer = require('../../package.json')['cache-version'].content -const hashToSegments = require('../util/hash-to-segments') -const path = require('path') -const ssri = require('ssri') - -// Current format of content file path: -// -// sha512-BaSE64Hex= -> -// ~/.my-cache/content-v2/sha512/ba/da/55deadbeefc0ffee -// -module.exports = contentPath - -function contentPath (cache, integrity) { - const sri = ssri.parse(integrity, { single: true }) - // contentPath is the *strongest* algo given - return path.join( - contentDir(cache), - sri.algorithm, - ...hashToSegments(sri.hexDigest()) - ) -} - -module.exports.contentDir = contentDir - -function contentDir (cache) { - return path.join(cache, `content-v${contentVer}`) -} diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/lib/content/read.js b/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/lib/content/read.js deleted file mode 100644 index 5f6192c3cec566..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/lib/content/read.js +++ /dev/null @@ -1,165 +0,0 @@ -'use strict' - -const fs = require('fs/promises') -const fsm = require('fs-minipass') -const ssri = require('ssri') -const contentPath = require('./path') -const Pipeline = require('minipass-pipeline') - -module.exports = read - -const MAX_SINGLE_READ_SIZE = 64 * 1024 * 1024 -async function read (cache, integrity, opts = {}) { - const { size } = opts - const { stat, cpath, sri } = await withContentSri(cache, integrity, async (cpath, sri) => { - // get size - const stat = size ? { size } : await fs.stat(cpath) - return { stat, cpath, sri } - }) - - if (stat.size > MAX_SINGLE_READ_SIZE) { - return readPipeline(cpath, stat.size, sri, new Pipeline()).concat() - } - - const data = await fs.readFile(cpath, { encoding: null }) - - if (stat.size !== data.length) { - throw sizeError(stat.size, data.length) - } - - if (!ssri.checkData(data, sri)) { - throw integrityError(sri, cpath) - } - - return data -} - -const readPipeline = (cpath, size, sri, stream) => { - stream.push( - new fsm.ReadStream(cpath, { - size, - readSize: MAX_SINGLE_READ_SIZE, - }), - ssri.integrityStream({ - integrity: sri, - size, - }) - ) - return stream -} - -module.exports.stream = readStream -module.exports.readStream = readStream - -function readStream (cache, integrity, opts = {}) { - const { size } = opts - const stream = new Pipeline() - // Set all this up to run on the stream and then just return the stream - Promise.resolve().then(async () => { - const { stat, cpath, sri } = await withContentSri(cache, integrity, async (cpath, sri) => { - // get size - const stat = size ? { size } : await fs.stat(cpath) - return { stat, cpath, sri } - }) - - return readPipeline(cpath, stat.size, sri, stream) - }).catch(err => stream.emit('error', err)) - - return stream -} - -module.exports.copy = copy - -function copy (cache, integrity, dest) { - return withContentSri(cache, integrity, (cpath) => { - return fs.copyFile(cpath, dest) - }) -} - -module.exports.hasContent = hasContent - -async function hasContent (cache, integrity) { - if (!integrity) { - return false - } - - try { - return await withContentSri(cache, integrity, async (cpath, sri) => { - const stat = await fs.stat(cpath) - return { size: stat.size, sri, stat } - }) - } catch (err) { - if (err.code === 'ENOENT') { - return false - } - - if (err.code === 'EPERM') { - /* istanbul ignore else */ - if (process.platform !== 'win32') { - throw err - } else { - return false - } - } - } -} - -async function withContentSri (cache, integrity, fn) { - const sri = ssri.parse(integrity) - // If `integrity` has multiple entries, pick the first digest - // with available local data. - const algo = sri.pickAlgorithm() - const digests = sri[algo] - - if (digests.length <= 1) { - const cpath = contentPath(cache, digests[0]) - return fn(cpath, digests[0]) - } else { - // Can't use race here because a generic error can happen before - // a ENOENT error, and can happen before a valid result - const results = await Promise.all(digests.map(async (meta) => { - try { - return await withContentSri(cache, meta, fn) - } catch (err) { - if (err.code === 'ENOENT') { - return Object.assign( - new Error('No matching content found for ' + sri.toString()), - { code: 'ENOENT' } - ) - } - return err - } - })) - // Return the first non error if it is found - const result = results.find((r) => !(r instanceof Error)) - if (result) { - return result - } - - // Throw the No matching content found error - const enoentError = results.find((r) => r.code === 'ENOENT') - if (enoentError) { - throw enoentError - } - - // Throw generic error - throw results.find((r) => r instanceof Error) - } -} - -function sizeError (expected, found) { - /* eslint-disable-next-line max-len */ - const err = new Error(`Bad data size: expected inserted data to be ${expected} bytes, but got ${found} instead`) - err.expected = expected - err.found = found - err.code = 'EBADSIZE' - return err -} - -function integrityError (sri, path) { - const err = new Error(`Integrity verification failed for ${sri} (${path})`) - err.code = 'EINTEGRITY' - err.sri = sri - err.path = path - return err -} diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/lib/content/rm.js b/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/lib/content/rm.js deleted file mode 100644 index ce58d679e4cb25..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/lib/content/rm.js +++ /dev/null @@ -1,18 +0,0 @@ -'use strict' - -const fs = require('fs/promises') -const contentPath = require('./path') -const { hasContent } = require('./read') - -module.exports = rm - -async function rm (cache, integrity) { - const content = await hasContent(cache, integrity) - // ~pretty~ sure we can't end up with a content lacking sri, but be safe - if (content && content.sri) { - await fs.rm(contentPath(cache, content.sri), { recursive: true, force: true }) - return true - } else { - return false - } -} diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/lib/content/write.js b/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/lib/content/write.js deleted file mode 100644 index e7187abca8788a..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/lib/content/write.js +++ /dev/null @@ -1,206 +0,0 @@ -'use strict' - -const events = require('events') - -const contentPath = require('./path') -const fs = require('fs/promises') -const { moveFile } = require('@npmcli/fs') -const { Minipass } = require('minipass') -const Pipeline = require('minipass-pipeline') -const Flush = require('minipass-flush') -const path = require('path') -const ssri = require('ssri') -const uniqueFilename = require('unique-filename') -const fsm = require('fs-minipass') - -module.exports = write - -// Cache of move operations in process so we don't duplicate -const moveOperations = new Map() - -async function write (cache, data, opts = {}) { - const { algorithms, size, integrity } = opts - - if (typeof size === 'number' && data.length !== size) { - throw sizeError(size, data.length) - } - - const sri = ssri.fromData(data, algorithms ? { algorithms } : {}) - if (integrity && !ssri.checkData(data, integrity, opts)) { - throw checksumError(integrity, sri) - } - - for (const algo in sri) { - const tmp = await makeTmp(cache, opts) - const hash = sri[algo].toString() - try { - await fs.writeFile(tmp.target, data, { flag: 'wx' }) - await moveToDestination(tmp, cache, hash, opts) - } finally { - if (!tmp.moved) { - await fs.rm(tmp.target, { recursive: true, force: true }) - } - } - } - return { integrity: sri, size: data.length } -} - -module.exports.stream = writeStream - -// writes proxied to the 'inputStream' that is passed to the Promise -// 'end' is deferred until content is handled. -class CacacheWriteStream extends Flush { - constructor (cache, opts) { - super() - this.opts = opts - this.cache = cache - this.inputStream = new Minipass() - this.inputStream.on('error', er => this.emit('error', er)) - this.inputStream.on('drain', () => this.emit('drain')) - this.handleContentP = null - } - - write (chunk, encoding, cb) { - if (!this.handleContentP) { - this.handleContentP = handleContent( - this.inputStream, - this.cache, - this.opts - ) - this.handleContentP.catch(error => this.emit('error', error)) - } - return this.inputStream.write(chunk, encoding, cb) - } - - flush (cb) { - this.inputStream.end(() => { - if (!this.handleContentP) { - const e = new Error('Cache input stream was empty') - e.code = 'ENODATA' - // empty streams are probably emitting end right away. - // defer this one tick by rejecting a promise on it. - return Promise.reject(e).catch(cb) - } - // eslint-disable-next-line promise/catch-or-return - this.handleContentP.then( - (res) => { - res.integrity && this.emit('integrity', res.integrity) - // eslint-disable-next-line promise/always-return - res.size !== null && this.emit('size', res.size) - cb() - }, - (er) => cb(er) - ) - }) - } -} - -function writeStream (cache, opts = {}) { - return new CacacheWriteStream(cache, opts) -} - -async function handleContent (inputStream, cache, opts) { - const tmp = await makeTmp(cache, opts) - try { - const res = await pipeToTmp(inputStream, cache, tmp.target, opts) - await moveToDestination( - tmp, - cache, - res.integrity, - opts - ) - return res - } finally { - if (!tmp.moved) { - await fs.rm(tmp.target, { recursive: true, force: true }) - } - } -} - -async function pipeToTmp (inputStream, cache, tmpTarget, opts) { - const outStream = new fsm.WriteStream(tmpTarget, { - flags: 'wx', - }) - - if (opts.integrityEmitter) { - // we need to create these all simultaneously since they can fire in any order - const [integrity, size] = await Promise.all([ - events.once(opts.integrityEmitter, 'integrity').then(res => res[0]), - events.once(opts.integrityEmitter, 'size').then(res => res[0]), - new Pipeline(inputStream, outStream).promise(), - ]) - return { integrity, size } - } - - let integrity - let size - const hashStream = ssri.integrityStream({ - integrity: opts.integrity, - algorithms: opts.algorithms, - size: opts.size, - }) - hashStream.on('integrity', i => { - integrity = i - }) - hashStream.on('size', s => { - size = s - }) - - const pipeline = new Pipeline(inputStream, hashStream, outStream) - await pipeline.promise() - return { integrity, size } -} - -async function makeTmp (cache, opts) { - const tmpTarget = uniqueFilename(path.join(cache, 'tmp'), opts.tmpPrefix) - await fs.mkdir(path.dirname(tmpTarget), { recursive: true }) - return { - target: tmpTarget, - moved: false, - } -} - -async function moveToDestination (tmp, cache, sri) { - const destination = contentPath(cache, sri) - const destDir = path.dirname(destination) - if (moveOperations.has(destination)) { - return moveOperations.get(destination) - } - moveOperations.set( - destination, - fs.mkdir(destDir, { recursive: true }) - .then(async () => { - await moveFile(tmp.target, destination, { overwrite: false }) - tmp.moved = true - return tmp.moved - }) - .catch(err => { - if (!err.message.startsWith('The destination file exists')) { - throw Object.assign(err, { code: 'EEXIST' }) - } - }).finally(() => { - moveOperations.delete(destination) - }) - - ) - return moveOperations.get(destination) -} - -function sizeError (expected, found) { - /* eslint-disable-next-line max-len */ - const err = new Error(`Bad data size: expected inserted data to be ${expected} bytes, but got ${found} instead`) - err.expected = expected - err.found = found - err.code = 'EBADSIZE' - return err -} - -function checksumError (expected, found) { - const err = new Error(`Integrity check failed: - Wanted: ${expected} - Found: ${found}`) - err.code = 'EINTEGRITY' - err.expected = expected - err.found = found - return err -} diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/lib/entry-index.js b/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/lib/entry-index.js deleted file mode 100644 index 89c28f2f257d48..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/lib/entry-index.js +++ /dev/null @@ -1,336 +0,0 @@ -'use strict' - -const crypto = require('crypto') -const { - appendFile, - mkdir, - readFile, - readdir, - rm, - writeFile, -} = require('fs/promises') -const { Minipass } = require('minipass') -const path = require('path') -const ssri = require('ssri') -const uniqueFilename = require('unique-filename') - -const contentPath = require('./content/path') -const hashToSegments = require('./util/hash-to-segments') -const indexV = require('../package.json')['cache-version'].index -const { moveFile } = require('@npmcli/fs') - -const pMap = require('p-map') -const lsStreamConcurrency = 5 - -module.exports.NotFoundError = class NotFoundError extends Error { - constructor (cache, key) { - super(`No cache entry for ${key} found in ${cache}`) - this.code = 'ENOENT' - this.cache = cache - this.key = key - } -} - -module.exports.compact = compact - -async function compact (cache, key, matchFn, opts = {}) { - const bucket = bucketPath(cache, key) - const entries = await bucketEntries(bucket) - const newEntries = [] - // we loop backwards because the bottom-most result is the newest - // since we add new entries with appendFile - for (let i = entries.length - 1; i >= 0; --i) { - const entry = entries[i] - // a null integrity could mean either a delete was appended - // or the user has simply stored an index that does not map - // to any content. we determine if the user wants to keep the - // null integrity based on the validateEntry function passed in options. - // if the integrity is null and no validateEntry is provided, we break - // as we consider the null integrity to be a deletion of everything - // that came before it. - if (entry.integrity === null && !opts.validateEntry) { - break - } - - // if this entry is valid, and it is either the first entry or - // the newEntries array doesn't already include an entry that - // matches this one based on the provided matchFn, then we add - // it to the beginning of our list - if ((!opts.validateEntry || opts.validateEntry(entry) === true) && - (newEntries.length === 0 || - !newEntries.find((oldEntry) => matchFn(oldEntry, entry)))) { - newEntries.unshift(entry) - } - } - - const newIndex = '\n' + newEntries.map((entry) => { - const stringified = JSON.stringify(entry) - const hash = hashEntry(stringified) - return `${hash}\t${stringified}` - }).join('\n') - - const setup = async () => { - const target = uniqueFilename(path.join(cache, 'tmp'), opts.tmpPrefix) - await mkdir(path.dirname(target), { recursive: true }) - return { - target, - moved: false, - } - } - - const teardown = async (tmp) => { - if (!tmp.moved) { - return rm(tmp.target, { recursive: true, force: true }) - } - } - - const write = async (tmp) => { - await writeFile(tmp.target, newIndex, { flag: 'wx' }) - await mkdir(path.dirname(bucket), { recursive: true }) - // we use @npmcli/move-file directly here because we - // want to overwrite the existing file - await moveFile(tmp.target, bucket) - tmp.moved = true - } - - // write the file atomically - const tmp = await setup() - try { - await write(tmp) - } finally { - await teardown(tmp) - } - - // we reverse the list we generated such that the newest - // entries come first in order to make looping through them easier - // the true passed to formatEntry tells it to keep null - // integrity values, if they made it this far it's because - // validateEntry returned true, and as such we should return it - return newEntries.reverse().map((entry) => formatEntry(cache, entry, true)) -} - -module.exports.insert = insert - -async function insert (cache, key, integrity, opts = {}) { - const { metadata, size, time } = opts - const bucket = bucketPath(cache, key) - const entry = { - key, - integrity: integrity && ssri.stringify(integrity), - time: time || Date.now(), - size, - metadata, - } - try { - await mkdir(path.dirname(bucket), { recursive: true }) - const stringified = JSON.stringify(entry) - // NOTE - Cleverness ahoy! - // - // This works because it's tremendously unlikely for an entry to corrupt - // another while still preserving the string length of the JSON in - // question. So, we just slap the length in there and verify it on read. - // - // Thanks to @isaacs for the whiteboarding session that ended up with - // this. - await appendFile(bucket, `\n${hashEntry(stringified)}\t${stringified}`) - } catch (err) { - if (err.code === 'ENOENT') { - return undefined - } - - throw err - } - return formatEntry(cache, entry) -} - -module.exports.find = find - -async function find (cache, key) { - const bucket = bucketPath(cache, key) - try { - const entries = await bucketEntries(bucket) - return entries.reduce((latest, next) => { - if (next && next.key === key) { - return formatEntry(cache, next) - } else { - return latest - } - }, null) - } catch (err) { - if (err.code === 'ENOENT') { - return null - } else { - throw err - } - } -} - -module.exports.delete = del - -function del (cache, key, opts = {}) { - if (!opts.removeFully) { - return insert(cache, key, null, opts) - } - - const bucket = bucketPath(cache, key) - return rm(bucket, { recursive: true, force: true }) -} - -module.exports.lsStream = lsStream - -function lsStream (cache) { - const indexDir = bucketDir(cache) - const stream = new Minipass({ objectMode: true }) - - // Set all this up to run on the stream and then just return the stream - Promise.resolve().then(async () => { - const buckets = await readdirOrEmpty(indexDir) - await pMap(buckets, async (bucket) => { - const bucketPath = path.join(indexDir, bucket) - const subbuckets = await readdirOrEmpty(bucketPath) - await pMap(subbuckets, async (subbucket) => { - const subbucketPath = path.join(bucketPath, subbucket) - - // "/cachename//./*" - const subbucketEntries = await readdirOrEmpty(subbucketPath) - await pMap(subbucketEntries, async (entry) => { - const entryPath = path.join(subbucketPath, entry) - try { - const entries = await bucketEntries(entryPath) - // using a Map here prevents duplicate keys from showing up - // twice, I guess? - const reduced = entries.reduce((acc, entry) => { - acc.set(entry.key, entry) - return acc - }, new Map()) - // reduced is a map of key => entry - for (const entry of reduced.values()) { - const formatted = formatEntry(cache, entry) - if (formatted) { - stream.write(formatted) - } - } - } catch (err) { - if (err.code === 'ENOENT') { - return undefined - } - throw err - } - }, - { concurrency: lsStreamConcurrency }) - }, - { concurrency: lsStreamConcurrency }) - }, - { concurrency: lsStreamConcurrency }) - stream.end() - return stream - }).catch(err => stream.emit('error', err)) - - return stream -} - -module.exports.ls = ls - -async function ls (cache) { - const entries = await lsStream(cache).collect() - return entries.reduce((acc, xs) => { - acc[xs.key] = xs - return acc - }, {}) -} - -module.exports.bucketEntries = bucketEntries - -async function bucketEntries (bucket, filter) { - const data = await readFile(bucket, 'utf8') - return _bucketEntries(data, filter) -} - -function _bucketEntries (data) { - const entries = [] - data.split('\n').forEach((entry) => { - if (!entry) { - return - } - - const pieces = entry.split('\t') - if (!pieces[1] || hashEntry(pieces[1]) !== pieces[0]) { - // Hash is no good! Corruption or malice? Doesn't matter! - // EJECT EJECT - return - } - let obj - try { - obj = JSON.parse(pieces[1]) - } catch (_) { - // eslint-ignore-next-line no-empty-block - } - // coverage disabled here, no need to test with an entry that parses to something falsey - // istanbul ignore else - if (obj) { - entries.push(obj) - } - }) - return entries -} - -module.exports.bucketDir = bucketDir - -function bucketDir (cache) { - return path.join(cache, `index-v${indexV}`) -} - -module.exports.bucketPath = bucketPath - -function bucketPath (cache, key) { - const hashed = hashKey(key) - return path.join.apply( - path, - [bucketDir(cache)].concat(hashToSegments(hashed)) - ) -} - -module.exports.hashKey = hashKey - -function hashKey (key) { - return hash(key, 'sha256') -} - -module.exports.hashEntry = hashEntry - -function hashEntry (str) { - return hash(str, 'sha1') -} - -function hash (str, digest) { - return crypto - .createHash(digest) - .update(str) - .digest('hex') -} - -function formatEntry (cache, entry, keepAll) { - // Treat null digests as deletions. They'll shadow any previous entries. - if (!entry.integrity && !keepAll) { - return null - } - - return { - key: entry.key, - integrity: entry.integrity, - path: entry.integrity ? contentPath(cache, entry.integrity) : undefined, - size: entry.size, - time: entry.time, - metadata: entry.metadata, - } -} - -function readdirOrEmpty (dir) { - return readdir(dir).catch((err) => { - if (err.code === 'ENOENT' || err.code === 'ENOTDIR') { - return [] - } - - throw err - }) -} diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/lib/get.js b/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/lib/get.js deleted file mode 100644 index 80ec206c7ecaaa..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/lib/get.js +++ /dev/null @@ -1,170 +0,0 @@ -'use strict' - -const Collect = require('minipass-collect') -const { Minipass } = require('minipass') -const Pipeline = require('minipass-pipeline') - -const index = require('./entry-index') -const memo = require('./memoization') -const read = require('./content/read') - -async function getData (cache, key, opts = {}) { - const { integrity, memoize, size } = opts - const memoized = memo.get(cache, key, opts) - if (memoized && memoize !== false) { - return { - metadata: memoized.entry.metadata, - data: memoized.data, - integrity: memoized.entry.integrity, - size: memoized.entry.size, - } - } - - const entry = await index.find(cache, key, opts) - if (!entry) { - throw new index.NotFoundError(cache, key) - } - const data = await read(cache, entry.integrity, { integrity, size }) - if (memoize) { - memo.put(cache, entry, data, opts) - } - - return { - data, - metadata: entry.metadata, - size: entry.size, - integrity: entry.integrity, - } -} -module.exports = getData - -async function getDataByDigest (cache, key, opts = {}) { - const { integrity, memoize, size } = opts - const memoized = memo.get.byDigest(cache, key, opts) - if (memoized && memoize !== false) { - return memoized - } - - const res = await read(cache, key, { integrity, size }) - if (memoize) { - memo.put.byDigest(cache, key, res, opts) - } - return res -} -module.exports.byDigest = getDataByDigest - -const getMemoizedStream = (memoized) => { - const stream = new Minipass() - stream.on('newListener', function (ev, cb) { - ev === 'metadata' && cb(memoized.entry.metadata) - ev === 'integrity' && cb(memoized.entry.integrity) - ev === 'size' && cb(memoized.entry.size) - }) - stream.end(memoized.data) - return stream -} - -function getStream (cache, key, opts = {}) { - const { memoize, size } = opts - const memoized = memo.get(cache, key, opts) - if (memoized && memoize !== false) { - return getMemoizedStream(memoized) - } - - const stream = new Pipeline() - // Set all this up to run on the stream and then just return the stream - Promise.resolve().then(async () => { - const entry = await index.find(cache, key) - if (!entry) { - throw new index.NotFoundError(cache, key) - } - - stream.emit('metadata', entry.metadata) - stream.emit('integrity', entry.integrity) - stream.emit('size', entry.size) - stream.on('newListener', function (ev, cb) { - ev === 'metadata' && cb(entry.metadata) - ev === 'integrity' && cb(entry.integrity) - ev === 'size' && cb(entry.size) - }) - - const src = read.readStream( - cache, - entry.integrity, - { ...opts, size: typeof size !== 'number' ? entry.size : size } - ) - - if (memoize) { - const memoStream = new Collect.PassThrough() - memoStream.on('collect', data => memo.put(cache, entry, data, opts)) - stream.unshift(memoStream) - } - stream.unshift(src) - return stream - }).catch((err) => stream.emit('error', err)) - - return stream -} - -module.exports.stream = getStream - -function getStreamDigest (cache, integrity, opts = {}) { - const { memoize } = opts - const memoized = memo.get.byDigest(cache, integrity, opts) - if (memoized && memoize !== false) { - const stream = new Minipass() - stream.end(memoized) - return stream - } else { - const stream = read.readStream(cache, integrity, opts) - if (!memoize) { - return stream - } - - const memoStream = new Collect.PassThrough() - memoStream.on('collect', data => memo.put.byDigest( - cache, - integrity, - data, - opts - )) - return new Pipeline(stream, memoStream) - } -} - -module.exports.stream.byDigest = getStreamDigest - -function info (cache, key, opts = {}) { - const { memoize } = opts - const memoized = memo.get(cache, key, opts) - if (memoized && memoize !== false) { - return Promise.resolve(memoized.entry) - } else { - return index.find(cache, key) - } -} -module.exports.info = info - -async function copy (cache, key, dest, opts = {}) { - const entry = await index.find(cache, key, opts) - if (!entry) { - throw new index.NotFoundError(cache, key) - } - await read.copy(cache, entry.integrity, dest, opts) - return { - metadata: entry.metadata, - size: entry.size, - integrity: entry.integrity, - } -} - -module.exports.copy = copy - -async function copyByDigest (cache, key, dest, opts = {}) { - await read.copy(cache, key, dest, opts) - return key -} - -module.exports.copy.byDigest = copyByDigest - -module.exports.hasContent = read.hasContent diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/lib/index.js b/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/lib/index.js deleted file mode 100644 index c9b0da5f3a271b..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/lib/index.js +++ /dev/null @@ -1,42 +0,0 @@ -'use strict' - -const get = require('./get.js') -const put = require('./put.js') -const rm = require('./rm.js') -const verify = require('./verify.js') -const { clearMemoized } = require('./memoization.js') -const tmp = require('./util/tmp.js') -const index = require('./entry-index.js') - -module.exports.index = {} -module.exports.index.compact = index.compact -module.exports.index.insert = index.insert - -module.exports.ls = index.ls -module.exports.ls.stream = index.lsStream - -module.exports.get = get -module.exports.get.byDigest = get.byDigest -module.exports.get.stream = get.stream -module.exports.get.stream.byDigest = get.stream.byDigest -module.exports.get.copy = get.copy -module.exports.get.copy.byDigest = get.copy.byDigest -module.exports.get.info = get.info -module.exports.get.hasContent = get.hasContent - -module.exports.put = put -module.exports.put.stream = put.stream - -module.exports.rm = rm.entry -module.exports.rm.all = rm.all -module.exports.rm.entry = module.exports.rm -module.exports.rm.content = rm.content - -module.exports.clearMemoized = clearMemoized - -module.exports.tmp = {} -module.exports.tmp.mkdir = tmp.mkdir -module.exports.tmp.withTmp = tmp.withTmp - -module.exports.verify = verify -module.exports.verify.lastRun = verify.lastRun diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/lib/memoization.js b/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/lib/memoization.js deleted file mode 100644 index 2ecc60912e4563..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/lib/memoization.js +++ /dev/null @@ -1,72 +0,0 @@ -'use strict' - -const { LRUCache } = require('lru-cache') - -const MEMOIZED = new LRUCache({ - max: 500, - maxSize: 50 * 1024 * 1024, // 50MB - ttl: 3 * 60 * 1000, // 3 minutes - sizeCalculation: (entry, key) => key.startsWith('key:') ? entry.data.length : entry.length, -}) - -module.exports.clearMemoized = clearMemoized - -function clearMemoized () { - const old = {} - MEMOIZED.forEach((v, k) => { - old[k] = v - }) - MEMOIZED.clear() - return old -} - -module.exports.put = put - -function put (cache, entry, data, opts) { - pickMem(opts).set(`key:${cache}:${entry.key}`, { entry, data }) - putDigest(cache, entry.integrity, data, opts) -} - -module.exports.put.byDigest = putDigest - -function putDigest (cache, integrity, data, opts) { - pickMem(opts).set(`digest:${cache}:${integrity}`, data) -} - -module.exports.get = get - -function get (cache, key, opts) { - return pickMem(opts).get(`key:${cache}:${key}`) -} - -module.exports.get.byDigest = getDigest - -function getDigest (cache, integrity, opts) { - return pickMem(opts).get(`digest:${cache}:${integrity}`) -} - -class ObjProxy { - constructor (obj) { - this.obj = obj - } - - get (key) { - return this.obj[key] - } - - set (key, val) { - this.obj[key] = val - } -} - -function pickMem (opts) { - if (!opts || !opts.memoize) { - return MEMOIZED - } else if (opts.memoize.get && opts.memoize.set) { - return opts.memoize - } else if (typeof opts.memoize === 'object') { - return new ObjProxy(opts.memoize) - } else { - return MEMOIZED - } -} diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/lib/put.js b/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/lib/put.js deleted file mode 100644 index 9fc932d5f6dec5..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/lib/put.js +++ /dev/null @@ -1,80 +0,0 @@ -'use strict' - -const index = require('./entry-index') -const memo = require('./memoization') -const write = require('./content/write') -const Flush = require('minipass-flush') -const { PassThrough } = require('minipass-collect') -const Pipeline = require('minipass-pipeline') - -const putOpts = (opts) => ({ - algorithms: ['sha512'], - ...opts, -}) - -module.exports = putData - -async function putData (cache, key, data, opts = {}) { - const { memoize } = opts - opts = putOpts(opts) - const res = await write(cache, data, opts) - const entry = await index.insert(cache, key, res.integrity, { ...opts, size: res.size }) - if (memoize) { - memo.put(cache, entry, data, opts) - } - - return res.integrity -} - -module.exports.stream = putStream - -function putStream (cache, key, opts = {}) { - const { memoize } = opts - opts = putOpts(opts) - let integrity - let size - let error - - let memoData - const pipeline = new Pipeline() - // first item in the pipeline is the memoizer, because we need - // that to end first and get the collected data. - if (memoize) { - const memoizer = new PassThrough().on('collect', data => { - memoData = data - }) - pipeline.push(memoizer) - } - - // contentStream is a write-only, not a passthrough - // no data comes out of it. - const contentStream = write.stream(cache, opts) - .on('integrity', (int) => { - integrity = int - }) - .on('size', (s) => { - size = s - }) - .on('error', (err) => { - error = err - }) - - pipeline.push(contentStream) - - // last but not least, we write the index and emit hash and size, - // and memoize if we're doing that - pipeline.push(new Flush({ - async flush () { - if (!error) { - const entry = await index.insert(cache, key, integrity, { ...opts, size }) - if (memoize && memoData) { - memo.put(cache, entry, memoData, opts) - } - pipeline.emit('integrity', integrity) - pipeline.emit('size', size) - } - }, - })) - - return pipeline -} diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/lib/rm.js b/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/lib/rm.js deleted file mode 100644 index a94760c7cf2430..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/lib/rm.js +++ /dev/null @@ -1,31 +0,0 @@ -'use strict' - -const { rm } = require('fs/promises') -const glob = require('./util/glob.js') -const index = require('./entry-index') -const memo = require('./memoization') -const path = require('path') -const rmContent = require('./content/rm') - -module.exports = entry -module.exports.entry = entry - -function entry (cache, key, opts) { - memo.clearMemoized() - return index.delete(cache, key, opts) -} - -module.exports.content = content - -function content (cache, integrity) { - memo.clearMemoized() - return rmContent(cache, integrity) -} - -module.exports.all = all - -async function all (cache) { - memo.clearMemoized() - const paths = await glob(path.join(cache, '*(content-*|index-*)'), { silent: true, nosort: true }) - return Promise.all(paths.map((p) => rm(p, { recursive: true, force: true }))) -} diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/lib/util/glob.js b/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/lib/util/glob.js deleted file mode 100644 index 8500c1c16a429f..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/lib/util/glob.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict' - -const { glob } = require('glob') -const path = require('path') - -const globify = (pattern) => pattern.split(path.win32.sep).join(path.posix.sep) -module.exports = (path, options) => glob(globify(path), options) diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/lib/util/hash-to-segments.js b/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/lib/util/hash-to-segments.js deleted file mode 100644 index 445599b5038088..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/lib/util/hash-to-segments.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict' - -module.exports = hashToSegments - -function hashToSegments (hash) { - return [hash.slice(0, 2), hash.slice(2, 4), hash.slice(4)] -} diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/lib/util/tmp.js b/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/lib/util/tmp.js deleted file mode 100644 index 0bf5302136ebeb..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/lib/util/tmp.js +++ /dev/null @@ -1,26 +0,0 @@ -'use strict' - -const { withTempDir } = require('@npmcli/fs') -const fs = require('fs/promises') -const path = require('path') - -module.exports.mkdir = mktmpdir - -async function mktmpdir (cache, opts = {}) { - const { tmpPrefix } = opts - const tmpDir = path.join(cache, 'tmp') - await fs.mkdir(tmpDir, { recursive: true, owner: 'inherit' }) - // do not use path.join(), it drops the trailing / if tmpPrefix is unset - const target = `${tmpDir}${path.sep}${tmpPrefix || ''}` - return fs.mkdtemp(target, { owner: 'inherit' }) -} - -module.exports.withTmp = withTmp - -function withTmp (cache, opts, cb) { - if (!cb) { - cb = opts - opts = {} - } - return withTempDir(path.join(cache, 'tmp'), cb, opts) -} diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/lib/verify.js b/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/lib/verify.js deleted file mode 100644 index d7423da1295b68..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/lib/verify.js +++ /dev/null @@ -1,257 +0,0 @@ -'use strict' - -const { - mkdir, - readFile, - rm, - stat, - truncate, - writeFile, -} = require('fs/promises') -const pMap = require('p-map') -const contentPath = require('./content/path') -const fsm = require('fs-minipass') -const glob = require('./util/glob.js') -const index = require('./entry-index') -const path = require('path') -const ssri = require('ssri') - -const hasOwnProperty = (obj, key) => - Object.prototype.hasOwnProperty.call(obj, key) - -const verifyOpts = (opts) => ({ - concurrency: 20, - log: { silly () {} }, - ...opts, -}) - -module.exports = verify - -async function verify (cache, opts) { - opts = verifyOpts(opts) - opts.log.silly('verify', 'verifying cache at', cache) - - const steps = [ - markStartTime, - fixPerms, - garbageCollect, - rebuildIndex, - cleanTmp, - writeVerifile, - markEndTime, - ] - - const stats = {} - for (const step of steps) { - const label = step.name - const start = new Date() - const s = await step(cache, opts) - if (s) { - Object.keys(s).forEach((k) => { - stats[k] = s[k] - }) - } - const end = new Date() - if (!stats.runTime) { - stats.runTime = {} - } - stats.runTime[label] = end - start - } - stats.runTime.total = stats.endTime - stats.startTime - opts.log.silly( - 'verify', - 'verification finished for', - cache, - 'in', - `${stats.runTime.total}ms` - ) - return stats -} - -async function markStartTime () { - return { startTime: new Date() } -} - -async function markEndTime () { - return { endTime: new Date() } -} - -async function fixPerms (cache, opts) { - opts.log.silly('verify', 'fixing cache permissions') - await mkdir(cache, { recursive: true }) - return null -} - -// Implements a naive mark-and-sweep tracing garbage collector. -// -// The algorithm is basically as follows: -// 1. Read (and filter) all index entries ("pointers") -// 2. Mark each integrity value as "live" -// 3. Read entire filesystem tree in `content-vX/` dir -// 4. If content is live, verify its checksum and delete it if it fails -// 5. If content is not marked as live, rm it. -// -async function garbageCollect (cache, opts) { - opts.log.silly('verify', 'garbage collecting content') - const indexStream = index.lsStream(cache) - const liveContent = new Set() - indexStream.on('data', (entry) => { - if (opts.filter && !opts.filter(entry)) { - return - } - - // integrity is stringified, re-parse it so we can get each hash - const integrity = ssri.parse(entry.integrity) - for (const algo in integrity) { - liveContent.add(integrity[algo].toString()) - } - }) - await new Promise((resolve, reject) => { - indexStream.on('end', resolve).on('error', reject) - }) - const contentDir = contentPath.contentDir(cache) - const files = await glob(path.join(contentDir, '**'), { - follow: false, - nodir: true, - nosort: true, - }) - const stats = { - verifiedContent: 0, - reclaimedCount: 0, - reclaimedSize: 0, - badContentCount: 0, - keptSize: 0, - } - await pMap( - files, - async (f) => { - const split = f.split(/[/\\]/) - const digest = split.slice(split.length - 3).join('') - const algo = split[split.length - 4] - const integrity = ssri.fromHex(digest, algo) - if (liveContent.has(integrity.toString())) { - const info = await verifyContent(f, integrity) - if (!info.valid) { - stats.reclaimedCount++ - stats.badContentCount++ - stats.reclaimedSize += info.size - } else { - stats.verifiedContent++ - stats.keptSize += info.size - } - } else { - // No entries refer to this content. We can delete. - stats.reclaimedCount++ - const s = await stat(f) - await rm(f, { recursive: true, force: true }) - stats.reclaimedSize += s.size - } - return stats - }, - { concurrency: opts.concurrency } - ) - return stats -} - -async function verifyContent (filepath, sri) { - const contentInfo = {} - try { - const { size } = await stat(filepath) - contentInfo.size = size - contentInfo.valid = true - await ssri.checkStream(new fsm.ReadStream(filepath), sri) - } catch (err) { - if (err.code === 'ENOENT') { - return { size: 0, valid: false } - } - if (err.code !== 'EINTEGRITY') { - throw err - } - - await rm(filepath, { recursive: true, force: true }) - contentInfo.valid = false - } - return contentInfo -} - -async function rebuildIndex (cache, opts) { - opts.log.silly('verify', 'rebuilding index') - const entries = await index.ls(cache) - const stats = { - missingContent: 0, - rejectedEntries: 0, - totalEntries: 0, - } - const buckets = {} - for (const k in entries) { - /* istanbul ignore else */ - if (hasOwnProperty(entries, k)) { - const hashed = index.hashKey(k) - const entry = entries[k] - const excluded = opts.filter && !opts.filter(entry) - excluded && stats.rejectedEntries++ - if (buckets[hashed] && !excluded) { - buckets[hashed].push(entry) - } else if (buckets[hashed] && excluded) { - // skip - } else if (excluded) { - buckets[hashed] = [] - buckets[hashed]._path = index.bucketPath(cache, k) - } else { - buckets[hashed] = [entry] - buckets[hashed]._path = index.bucketPath(cache, k) - } - } - } - await pMap( - Object.keys(buckets), - (key) => { - return rebuildBucket(cache, buckets[key], stats, opts) - }, - { concurrency: opts.concurrency } - ) - return stats -} - -async function rebuildBucket (cache, bucket, stats) { - await truncate(bucket._path) - // This needs to be serialized because cacache explicitly - // lets very racy bucket conflicts clobber each other. - for (const entry of bucket) { - const content = contentPath(cache, entry.integrity) - try { - await stat(content) - await index.insert(cache, entry.key, entry.integrity, { - metadata: entry.metadata, - size: entry.size, - time: entry.time, - }) - stats.totalEntries++ - } catch (err) { - if (err.code === 'ENOENT') { - stats.rejectedEntries++ - stats.missingContent++ - } else { - throw err - } - } - } -} - -function cleanTmp (cache, opts) { - opts.log.silly('verify', 'cleaning tmp directory') - return rm(path.join(cache, 'tmp'), { recursive: true, force: true }) -} - -async function writeVerifile (cache, opts) { - const verifile = path.join(cache, '_lastverified') - opts.log.silly('verify', 'writing verifile to ' + verifile) - return writeFile(verifile, `${Date.now()}`) -} - -module.exports.lastRun = lastRun - -async function lastRun (cache) { - const data = await readFile(path.join(cache, '_lastverified'), { encoding: 'utf8' }) - return new Date(+data) -} diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/package.json b/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/package.json deleted file mode 100644 index 6e6219158ed759..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/cacache/package.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "name": "cacache", - "version": "18.0.4", - "cache-version": { - "content": "2", - "index": "5" - }, - "description": "Fast, fault-tolerant, cross-platform, disk-based, data-agnostic, content-addressable cache.", - "main": "lib/index.js", - "files": [ - "bin/", - "lib/" - ], - "scripts": { - "test": "tap", - "snap": "tap", - "coverage": "tap", - "test-docker": "docker run -it --rm --name pacotest -v \"$PWD\":/tmp -w /tmp node:latest npm test", - "lint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"", - "npmclilint": "npmcli-lint", - "lintfix": "npm run lint -- --fix", - "postsnap": "npm run lintfix --", - "postlint": "template-oss-check", - "posttest": "npm run lint", - "template-oss-apply": "template-oss-apply --force" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/npm/cacache.git" - }, - "keywords": [ - "cache", - "caching", - "content-addressable", - "sri", - "sri hash", - "subresource integrity", - "cache", - "storage", - "store", - "file store", - "filesystem", - "disk cache", - "disk storage" - ], - "license": "ISC", - "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^10.0.1", - "minipass": "^7.0.3", - "minipass-collect": "^2.0.1", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, - "devDependencies": { - "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.22.0", - "tap": "^16.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - }, - "templateOSS": { - "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "windowsCI": false, - "version": "4.22.0", - "publish": "true" - }, - "author": "GitHub Inc.", - "tap": { - "nyc-arg": [ - "--exclude", - "tap-snapshots/**" - ] - } -} diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/make-fetch-happen/LICENSE b/deps/npm/node_modules/@sigstore/sign/node_modules/make-fetch-happen/LICENSE deleted file mode 100644 index 1808eb2844231c..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/make-fetch-happen/LICENSE +++ /dev/null @@ -1,16 +0,0 @@ -ISC License - -Copyright 2017-2022 (c) npm, Inc. - -Permission to use, copy, modify, and/or distribute this software for -any purpose with or without fee is hereby granted, provided that the -above copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE COPYRIGHT HOLDER DISCLAIMS -ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR -CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE -OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE -USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/make-fetch-happen/lib/cache/entry.js b/deps/npm/node_modules/@sigstore/sign/node_modules/make-fetch-happen/lib/cache/entry.js deleted file mode 100644 index bfcfacbcc95e18..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/make-fetch-happen/lib/cache/entry.js +++ /dev/null @@ -1,471 +0,0 @@ -const { Request, Response } = require('minipass-fetch') -const { Minipass } = require('minipass') -const MinipassFlush = require('minipass-flush') -const cacache = require('cacache') -const url = require('url') - -const CachingMinipassPipeline = require('../pipeline.js') -const CachePolicy = require('./policy.js') -const cacheKey = require('./key.js') -const remote = require('../remote.js') - -const hasOwnProperty = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop) - -// allow list for request headers that will be written to the cache index -// note: we will also store any request headers -// that are named in a response's vary header -const KEEP_REQUEST_HEADERS = [ - 'accept-charset', - 'accept-encoding', - 'accept-language', - 'accept', - 'cache-control', -] - -// allow list for response headers that will be written to the cache index -// note: we must not store the real response's age header, or when we load -// a cache policy based on the metadata it will think the cached response -// is always stale -const KEEP_RESPONSE_HEADERS = [ - 'cache-control', - 'content-encoding', - 'content-language', - 'content-type', - 'date', - 'etag', - 'expires', - 'last-modified', - 'link', - 'location', - 'pragma', - 'vary', -] - -// return an object containing all metadata to be written to the index -const getMetadata = (request, response, options) => { - const metadata = { - time: Date.now(), - url: request.url, - reqHeaders: {}, - resHeaders: {}, - - // options on which we must match the request and vary the response - options: { - compress: options.compress != null ? options.compress : request.compress, - }, - } - - // only save the status if it's not a 200 or 304 - if (response.status !== 200 && response.status !== 304) { - metadata.status = response.status - } - - for (const name of KEEP_REQUEST_HEADERS) { - if (request.headers.has(name)) { - metadata.reqHeaders[name] = request.headers.get(name) - } - } - - // if the request's host header differs from the host in the url - // we need to keep it, otherwise it's just noise and we ignore it - const host = request.headers.get('host') - const parsedUrl = new url.URL(request.url) - if (host && parsedUrl.host !== host) { - metadata.reqHeaders.host = host - } - - // if the response has a vary header, make sure - // we store the relevant request headers too - if (response.headers.has('vary')) { - const vary = response.headers.get('vary') - // a vary of "*" means every header causes a different response. - // in that scenario, we do not include any additional headers - // as the freshness check will always fail anyway and we don't - // want to bloat the cache indexes - if (vary !== '*') { - // copy any other request headers that will vary the response - const varyHeaders = vary.trim().toLowerCase().split(/\s*,\s*/) - for (const name of varyHeaders) { - if (request.headers.has(name)) { - metadata.reqHeaders[name] = request.headers.get(name) - } - } - } - } - - for (const name of KEEP_RESPONSE_HEADERS) { - if (response.headers.has(name)) { - metadata.resHeaders[name] = response.headers.get(name) - } - } - - for (const name of options.cacheAdditionalHeaders) { - if (response.headers.has(name)) { - metadata.resHeaders[name] = response.headers.get(name) - } - } - - return metadata -} - -// symbols used to hide objects that may be lazily evaluated in a getter -const _request = Symbol('request') -const _response = Symbol('response') -const _policy = Symbol('policy') - -class CacheEntry { - constructor ({ entry, request, response, options }) { - if (entry) { - this.key = entry.key - this.entry = entry - // previous versions of this module didn't write an explicit timestamp in - // the metadata, so fall back to the entry's timestamp. we can't use the - // entry timestamp to determine staleness because cacache will update it - // when it verifies its data - this.entry.metadata.time = this.entry.metadata.time || this.entry.time - } else { - this.key = cacheKey(request) - } - - this.options = options - - // these properties are behind getters that lazily evaluate - this[_request] = request - this[_response] = response - this[_policy] = null - } - - // returns a CacheEntry instance that satisfies the given request - // or undefined if no existing entry satisfies - static async find (request, options) { - try { - // compacts the index and returns an array of unique entries - var matches = await cacache.index.compact(options.cachePath, cacheKey(request), (A, B) => { - const entryA = new CacheEntry({ entry: A, options }) - const entryB = new CacheEntry({ entry: B, options }) - return entryA.policy.satisfies(entryB.request) - }, { - validateEntry: (entry) => { - // clean out entries with a buggy content-encoding value - if (entry.metadata && - entry.metadata.resHeaders && - entry.metadata.resHeaders['content-encoding'] === null) { - return false - } - - // if an integrity is null, it needs to have a status specified - if (entry.integrity === null) { - return !!(entry.metadata && entry.metadata.status) - } - - return true - }, - }) - } catch (err) { - // if the compact request fails, ignore the error and return - return - } - - // a cache mode of 'reload' means to behave as though we have no cache - // on the way to the network. return undefined to allow cacheFetch to - // create a brand new request no matter what. - if (options.cache === 'reload') { - return - } - - // find the specific entry that satisfies the request - let match - for (const entry of matches) { - const _entry = new CacheEntry({ - entry, - options, - }) - - if (_entry.policy.satisfies(request)) { - match = _entry - break - } - } - - return match - } - - // if the user made a PUT/POST/PATCH then we invalidate our - // cache for the same url by deleting the index entirely - static async invalidate (request, options) { - const key = cacheKey(request) - try { - await cacache.rm.entry(options.cachePath, key, { removeFully: true }) - } catch (err) { - // ignore errors - } - } - - get request () { - if (!this[_request]) { - this[_request] = new Request(this.entry.metadata.url, { - method: 'GET', - headers: this.entry.metadata.reqHeaders, - ...this.entry.metadata.options, - }) - } - - return this[_request] - } - - get response () { - if (!this[_response]) { - this[_response] = new Response(null, { - url: this.entry.metadata.url, - counter: this.options.counter, - status: this.entry.metadata.status || 200, - headers: { - ...this.entry.metadata.resHeaders, - 'content-length': this.entry.size, - }, - }) - } - - return this[_response] - } - - get policy () { - if (!this[_policy]) { - this[_policy] = new CachePolicy({ - entry: this.entry, - request: this.request, - response: this.response, - options: this.options, - }) - } - - return this[_policy] - } - - // wraps the response in a pipeline that stores the data - // in the cache while the user consumes it - async store (status) { - // if we got a status other than 200, 301, or 308, - // or the CachePolicy forbid storage, append the - // cache status header and return it untouched - if ( - this.request.method !== 'GET' || - ![200, 301, 308].includes(this.response.status) || - !this.policy.storable() - ) { - this.response.headers.set('x-local-cache-status', 'skip') - return this.response - } - - const size = this.response.headers.get('content-length') - const cacheOpts = { - algorithms: this.options.algorithms, - metadata: getMetadata(this.request, this.response, this.options), - size, - integrity: this.options.integrity, - integrityEmitter: this.response.body.hasIntegrityEmitter && this.response.body, - } - - let body = null - // we only set a body if the status is a 200, redirects are - // stored as metadata only - if (this.response.status === 200) { - let cacheWriteResolve, cacheWriteReject - const cacheWritePromise = new Promise((resolve, reject) => { - cacheWriteResolve = resolve - cacheWriteReject = reject - }).catch((err) => { - body.emit('error', err) - }) - - body = new CachingMinipassPipeline({ events: ['integrity', 'size'] }, new MinipassFlush({ - flush () { - return cacheWritePromise - }, - })) - // this is always true since if we aren't reusing the one from the remote fetch, we - // are using the one from cacache - body.hasIntegrityEmitter = true - - const onResume = () => { - const tee = new Minipass() - const cacheStream = cacache.put.stream(this.options.cachePath, this.key, cacheOpts) - // re-emit the integrity and size events on our new response body so they can be reused - cacheStream.on('integrity', i => body.emit('integrity', i)) - cacheStream.on('size', s => body.emit('size', s)) - // stick a flag on here so downstream users will know if they can expect integrity events - tee.pipe(cacheStream) - // TODO if the cache write fails, log a warning but return the response anyway - // eslint-disable-next-line promise/catch-or-return - cacheStream.promise().then(cacheWriteResolve, cacheWriteReject) - body.unshift(tee) - body.unshift(this.response.body) - } - - body.once('resume', onResume) - body.once('end', () => body.removeListener('resume', onResume)) - } else { - await cacache.index.insert(this.options.cachePath, this.key, null, cacheOpts) - } - - // note: we do not set the x-local-cache-hash header because we do not know - // the hash value until after the write to the cache completes, which doesn't - // happen until after the response has been sent and it's too late to write - // the header anyway - this.response.headers.set('x-local-cache', encodeURIComponent(this.options.cachePath)) - this.response.headers.set('x-local-cache-key', encodeURIComponent(this.key)) - this.response.headers.set('x-local-cache-mode', 'stream') - this.response.headers.set('x-local-cache-status', status) - this.response.headers.set('x-local-cache-time', new Date().toISOString()) - const newResponse = new Response(body, { - url: this.response.url, - status: this.response.status, - headers: this.response.headers, - counter: this.options.counter, - }) - return newResponse - } - - // use the cached data to create a response and return it - async respond (method, options, status) { - let response - if (method === 'HEAD' || [301, 308].includes(this.response.status)) { - // if the request is a HEAD, or the response is a redirect, - // then the metadata in the entry already includes everything - // we need to build a response - response = this.response - } else { - // we're responding with a full cached response, so create a body - // that reads from cacache and attach it to a new Response - const body = new Minipass() - const headers = { ...this.policy.responseHeaders() } - - const onResume = () => { - const cacheStream = cacache.get.stream.byDigest( - this.options.cachePath, this.entry.integrity, { memoize: this.options.memoize } - ) - cacheStream.on('error', async (err) => { - cacheStream.pause() - if (err.code === 'EINTEGRITY') { - await cacache.rm.content( - this.options.cachePath, this.entry.integrity, { memoize: this.options.memoize } - ) - } - if (err.code === 'ENOENT' || err.code === 'EINTEGRITY') { - await CacheEntry.invalidate(this.request, this.options) - } - body.emit('error', err) - cacheStream.resume() - }) - // emit the integrity and size events based on our metadata so we're consistent - body.emit('integrity', this.entry.integrity) - body.emit('size', Number(headers['content-length'])) - cacheStream.pipe(body) - } - - body.once('resume', onResume) - body.once('end', () => body.removeListener('resume', onResume)) - response = new Response(body, { - url: this.entry.metadata.url, - counter: options.counter, - status: 200, - headers, - }) - } - - response.headers.set('x-local-cache', encodeURIComponent(this.options.cachePath)) - response.headers.set('x-local-cache-hash', encodeURIComponent(this.entry.integrity)) - response.headers.set('x-local-cache-key', encodeURIComponent(this.key)) - response.headers.set('x-local-cache-mode', 'stream') - response.headers.set('x-local-cache-status', status) - response.headers.set('x-local-cache-time', new Date(this.entry.metadata.time).toUTCString()) - return response - } - - // use the provided request along with this cache entry to - // revalidate the stored response. returns a response, either - // from the cache or from the update - async revalidate (request, options) { - const revalidateRequest = new Request(request, { - headers: this.policy.revalidationHeaders(request), - }) - - try { - // NOTE: be sure to remove the headers property from the - // user supplied options, since we have already defined - // them on the new request object. if they're still in the - // options then those will overwrite the ones from the policy - var response = await remote(revalidateRequest, { - ...options, - headers: undefined, - }) - } catch (err) { - // if the network fetch fails, return the stale - // cached response unless it has a cache-control - // of 'must-revalidate' - if (!this.policy.mustRevalidate) { - return this.respond(request.method, options, 'stale') - } - - throw err - } - - if (this.policy.revalidated(revalidateRequest, response)) { - // we got a 304, write a new index to the cache and respond from cache - const metadata = getMetadata(request, response, options) - // 304 responses do not include headers that are specific to the response data - // since they do not include a body, so we copy values for headers that were - // in the old cache entry to the new one, if the new metadata does not already - // include that header - for (const name of KEEP_RESPONSE_HEADERS) { - if ( - !hasOwnProperty(metadata.resHeaders, name) && - hasOwnProperty(this.entry.metadata.resHeaders, name) - ) { - metadata.resHeaders[name] = this.entry.metadata.resHeaders[name] - } - } - - for (const name of options.cacheAdditionalHeaders) { - const inMeta = hasOwnProperty(metadata.resHeaders, name) - const inEntry = hasOwnProperty(this.entry.metadata.resHeaders, name) - const inPolicy = hasOwnProperty(this.policy.response.headers, name) - - // if the header is in the existing entry, but it is not in the metadata - // then we need to write it to the metadata as this will refresh the on-disk cache - if (!inMeta && inEntry) { - metadata.resHeaders[name] = this.entry.metadata.resHeaders[name] - } - // if the header is in the metadata, but not in the policy, then we need to set - // it in the policy so that it's included in the immediate response. future - // responses will load a new cache entry, so we don't need to change that - if (!inPolicy && inMeta) { - this.policy.response.headers[name] = metadata.resHeaders[name] - } - } - - try { - await cacache.index.insert(options.cachePath, this.key, this.entry.integrity, { - size: this.entry.size, - metadata, - }) - } catch (err) { - // if updating the cache index fails, we ignore it and - // respond anyway - } - return this.respond(request.method, options, 'revalidated') - } - - // if we got a modified response, create a new entry based on it - const newEntry = new CacheEntry({ - request, - response, - options, - }) - - // respond with the new entry while writing it to the cache - return newEntry.store('updated') - } -} - -module.exports = CacheEntry diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/make-fetch-happen/lib/cache/errors.js b/deps/npm/node_modules/@sigstore/sign/node_modules/make-fetch-happen/lib/cache/errors.js deleted file mode 100644 index 67a66573bebe66..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/make-fetch-happen/lib/cache/errors.js +++ /dev/null @@ -1,11 +0,0 @@ -class NotCachedError extends Error { - constructor (url) { - /* eslint-disable-next-line max-len */ - super(`request to ${url} failed: cache mode is 'only-if-cached' but no cached response is available.`) - this.code = 'ENOTCACHED' - } -} - -module.exports = { - NotCachedError, -} diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/make-fetch-happen/lib/cache/index.js b/deps/npm/node_modules/@sigstore/sign/node_modules/make-fetch-happen/lib/cache/index.js deleted file mode 100644 index 0de49d23fb9336..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/make-fetch-happen/lib/cache/index.js +++ /dev/null @@ -1,49 +0,0 @@ -const { NotCachedError } = require('./errors.js') -const CacheEntry = require('./entry.js') -const remote = require('../remote.js') - -// do whatever is necessary to get a Response and return it -const cacheFetch = async (request, options) => { - // try to find a cached entry that satisfies this request - const entry = await CacheEntry.find(request, options) - if (!entry) { - // no cached result, if the cache mode is 'only-if-cached' that's a failure - if (options.cache === 'only-if-cached') { - throw new NotCachedError(request.url) - } - - // otherwise, we make a request, store it and return it - const response = await remote(request, options) - const newEntry = new CacheEntry({ request, response, options }) - return newEntry.store('miss') - } - - // we have a cached response that satisfies this request, however if the cache - // mode is 'no-cache' then we send the revalidation request no matter what - if (options.cache === 'no-cache') { - return entry.revalidate(request, options) - } - - // if the cached entry is not stale, or if the cache mode is 'force-cache' or - // 'only-if-cached' we can respond with the cached entry. set the status - // based on the result of needsRevalidation and respond - const _needsRevalidation = entry.policy.needsRevalidation(request) - if (options.cache === 'force-cache' || - options.cache === 'only-if-cached' || - !_needsRevalidation) { - return entry.respond(request.method, options, _needsRevalidation ? 'stale' : 'hit') - } - - // if we got here, the cache entry is stale so revalidate it - return entry.revalidate(request, options) -} - -cacheFetch.invalidate = async (request, options) => { - if (!options.cachePath) { - return - } - - return CacheEntry.invalidate(request, options) -} - -module.exports = cacheFetch diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/make-fetch-happen/lib/cache/key.js b/deps/npm/node_modules/@sigstore/sign/node_modules/make-fetch-happen/lib/cache/key.js deleted file mode 100644 index f7684d562b7fae..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/make-fetch-happen/lib/cache/key.js +++ /dev/null @@ -1,17 +0,0 @@ -const { URL, format } = require('url') - -// options passed to url.format() when generating a key -const formatOptions = { - auth: false, - fragment: false, - search: true, - unicode: false, -} - -// returns a string to be used as the cache key for the Request -const cacheKey = (request) => { - const parsed = new URL(request.url) - return `make-fetch-happen:request-cache:${format(parsed, formatOptions)}` -} - -module.exports = cacheKey diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/make-fetch-happen/lib/cache/policy.js b/deps/npm/node_modules/@sigstore/sign/node_modules/make-fetch-happen/lib/cache/policy.js deleted file mode 100644 index ada3c8600dae92..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/make-fetch-happen/lib/cache/policy.js +++ /dev/null @@ -1,161 +0,0 @@ -const CacheSemantics = require('http-cache-semantics') -const Negotiator = require('negotiator') -const ssri = require('ssri') - -// options passed to http-cache-semantics constructor -const policyOptions = { - shared: false, - ignoreCargoCult: true, -} - -// a fake empty response, used when only testing the -// request for storability -const emptyResponse = { status: 200, headers: {} } - -// returns a plain object representation of the Request -const requestObject = (request) => { - const _obj = { - method: request.method, - url: request.url, - headers: {}, - compress: request.compress, - } - - request.headers.forEach((value, key) => { - _obj.headers[key] = value - }) - - return _obj -} - -// returns a plain object representation of the Response -const responseObject = (response) => { - const _obj = { - status: response.status, - headers: {}, - } - - response.headers.forEach((value, key) => { - _obj.headers[key] = value - }) - - return _obj -} - -class CachePolicy { - constructor ({ entry, request, response, options }) { - this.entry = entry - this.request = requestObject(request) - this.response = responseObject(response) - this.options = options - this.policy = new CacheSemantics(this.request, this.response, policyOptions) - - if (this.entry) { - // if we have an entry, copy the timestamp to the _responseTime - // this is necessary because the CacheSemantics constructor forces - // the value to Date.now() which means a policy created from a - // cache entry is likely to always identify itself as stale - this.policy._responseTime = this.entry.metadata.time - } - } - - // static method to quickly determine if a request alone is storable - static storable (request, options) { - // no cachePath means no caching - if (!options.cachePath) { - return false - } - - // user explicitly asked not to cache - if (options.cache === 'no-store') { - return false - } - - // we only cache GET and HEAD requests - if (!['GET', 'HEAD'].includes(request.method)) { - return false - } - - // otherwise, let http-cache-semantics make the decision - // based on the request's headers - const policy = new CacheSemantics(requestObject(request), emptyResponse, policyOptions) - return policy.storable() - } - - // returns true if the policy satisfies the request - satisfies (request) { - const _req = requestObject(request) - if (this.request.headers.host !== _req.headers.host) { - return false - } - - if (this.request.compress !== _req.compress) { - return false - } - - const negotiatorA = new Negotiator(this.request) - const negotiatorB = new Negotiator(_req) - - if (JSON.stringify(negotiatorA.mediaTypes()) !== JSON.stringify(negotiatorB.mediaTypes())) { - return false - } - - if (JSON.stringify(negotiatorA.languages()) !== JSON.stringify(negotiatorB.languages())) { - return false - } - - if (JSON.stringify(negotiatorA.encodings()) !== JSON.stringify(negotiatorB.encodings())) { - return false - } - - if (this.options.integrity) { - return ssri.parse(this.options.integrity).match(this.entry.integrity) - } - - return true - } - - // returns true if the request and response allow caching - storable () { - return this.policy.storable() - } - - // NOTE: this is a hack to avoid parsing the cache-control - // header ourselves, it returns true if the response's - // cache-control contains must-revalidate - get mustRevalidate () { - return !!this.policy._rescc['must-revalidate'] - } - - // returns true if the cached response requires revalidation - // for the given request - needsRevalidation (request) { - const _req = requestObject(request) - // force method to GET because we only cache GETs - // but can serve a HEAD from a cached GET - _req.method = 'GET' - return !this.policy.satisfiesWithoutRevalidation(_req) - } - - responseHeaders () { - return this.policy.responseHeaders() - } - - // returns a new object containing the appropriate headers - // to send a revalidation request - revalidationHeaders (request) { - const _req = requestObject(request) - return this.policy.revalidationHeaders(_req) - } - - // returns true if the request/response was revalidated - // successfully. returns false if a new response was received - revalidated (request, response) { - const _req = requestObject(request) - const _res = responseObject(response) - const policy = this.policy.revalidatedPolicy(_req, _res) - return !policy.modified - } -} - -module.exports = CachePolicy diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/make-fetch-happen/lib/fetch.js b/deps/npm/node_modules/@sigstore/sign/node_modules/make-fetch-happen/lib/fetch.js deleted file mode 100644 index 233ba67e165502..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/make-fetch-happen/lib/fetch.js +++ /dev/null @@ -1,118 +0,0 @@ -'use strict' - -const { FetchError, Request, isRedirect } = require('minipass-fetch') -const url = require('url') - -const CachePolicy = require('./cache/policy.js') -const cache = require('./cache/index.js') -const remote = require('./remote.js') - -// given a Request, a Response and user options -// return true if the response is a redirect that -// can be followed. we throw errors that will result -// in the fetch being rejected if the redirect is -// possible but invalid for some reason -const canFollowRedirect = (request, response, options) => { - if (!isRedirect(response.status)) { - return false - } - - if (options.redirect === 'manual') { - return false - } - - if (options.redirect === 'error') { - throw new FetchError(`redirect mode is set to error: ${request.url}`, - 'no-redirect', { code: 'ENOREDIRECT' }) - } - - if (!response.headers.has('location')) { - throw new FetchError(`redirect location header missing for: ${request.url}`, - 'no-location', { code: 'EINVALIDREDIRECT' }) - } - - if (request.counter >= request.follow) { - throw new FetchError(`maximum redirect reached at: ${request.url}`, - 'max-redirect', { code: 'EMAXREDIRECT' }) - } - - return true -} - -// given a Request, a Response, and the user's options return an object -// with a new Request and a new options object that will be used for -// following the redirect -const getRedirect = (request, response, options) => { - const _opts = { ...options } - const location = response.headers.get('location') - const redirectUrl = new url.URL(location, /^https?:/.test(location) ? undefined : request.url) - // Comment below is used under the following license: - /** - * @license - * Copyright (c) 2010-2012 Mikeal Rogers - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an "AS - * IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either - * express or implied. See the License for the specific language - * governing permissions and limitations under the License. - */ - - // Remove authorization if changing hostnames (but not if just - // changing ports or protocols). This matches the behavior of request: - // https://github.com/request/request/blob/b12a6245/lib/redirect.js#L134-L138 - if (new url.URL(request.url).hostname !== redirectUrl.hostname) { - request.headers.delete('authorization') - request.headers.delete('cookie') - } - - // for POST request with 301/302 response, or any request with 303 response, - // use GET when following redirect - if ( - response.status === 303 || - (request.method === 'POST' && [301, 302].includes(response.status)) - ) { - _opts.method = 'GET' - _opts.body = null - request.headers.delete('content-length') - } - - _opts.headers = {} - request.headers.forEach((value, key) => { - _opts.headers[key] = value - }) - - _opts.counter = ++request.counter - const redirectReq = new Request(url.format(redirectUrl), _opts) - return { - request: redirectReq, - options: _opts, - } -} - -const fetch = async (request, options) => { - const response = CachePolicy.storable(request, options) - ? await cache(request, options) - : await remote(request, options) - - // if the request wasn't a GET or HEAD, and the response - // status is between 200 and 399 inclusive, invalidate the - // request url - if (!['GET', 'HEAD'].includes(request.method) && - response.status >= 200 && - response.status <= 399) { - await cache.invalidate(request, options) - } - - if (!canFollowRedirect(request, response, options)) { - return response - } - - const redirect = getRedirect(request, response, options) - return fetch(redirect.request, redirect.options) -} - -module.exports = fetch diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/make-fetch-happen/lib/index.js b/deps/npm/node_modules/@sigstore/sign/node_modules/make-fetch-happen/lib/index.js deleted file mode 100644 index 2f12e8e1b61131..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/make-fetch-happen/lib/index.js +++ /dev/null @@ -1,41 +0,0 @@ -const { FetchError, Headers, Request, Response } = require('minipass-fetch') - -const configureOptions = require('./options.js') -const fetch = require('./fetch.js') - -const makeFetchHappen = (url, opts) => { - const options = configureOptions(opts) - - const request = new Request(url, options) - return fetch(request, options) -} - -makeFetchHappen.defaults = (defaultUrl, defaultOptions = {}, wrappedFetch = makeFetchHappen) => { - if (typeof defaultUrl === 'object') { - defaultOptions = defaultUrl - defaultUrl = null - } - - const defaultedFetch = (url, options = {}) => { - const finalUrl = url || defaultUrl - const finalOptions = { - ...defaultOptions, - ...options, - headers: { - ...defaultOptions.headers, - ...options.headers, - }, - } - return wrappedFetch(finalUrl, finalOptions) - } - - defaultedFetch.defaults = (defaultUrl1, defaultOptions1 = {}) => - makeFetchHappen.defaults(defaultUrl1, defaultOptions1, defaultedFetch) - return defaultedFetch -} - -module.exports = makeFetchHappen -module.exports.FetchError = FetchError -module.exports.Headers = Headers -module.exports.Request = Request -module.exports.Response = Response diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/make-fetch-happen/lib/options.js b/deps/npm/node_modules/@sigstore/sign/node_modules/make-fetch-happen/lib/options.js deleted file mode 100644 index f77511279f831d..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/make-fetch-happen/lib/options.js +++ /dev/null @@ -1,54 +0,0 @@ -const dns = require('dns') - -const conditionalHeaders = [ - 'if-modified-since', - 'if-none-match', - 'if-unmodified-since', - 'if-match', - 'if-range', -] - -const configureOptions = (opts) => { - const { strictSSL, ...options } = { ...opts } - options.method = options.method ? options.method.toUpperCase() : 'GET' - options.rejectUnauthorized = strictSSL !== false - - if (!options.retry) { - options.retry = { retries: 0 } - } else if (typeof options.retry === 'string') { - const retries = parseInt(options.retry, 10) - if (isFinite(retries)) { - options.retry = { retries } - } else { - options.retry = { retries: 0 } - } - } else if (typeof options.retry === 'number') { - options.retry = { retries: options.retry } - } else { - options.retry = { retries: 0, ...options.retry } - } - - options.dns = { ttl: 5 * 60 * 1000, lookup: dns.lookup, ...options.dns } - - options.cache = options.cache || 'default' - if (options.cache === 'default') { - const hasConditionalHeader = Object.keys(options.headers || {}).some((name) => { - return conditionalHeaders.includes(name.toLowerCase()) - }) - if (hasConditionalHeader) { - options.cache = 'no-store' - } - } - - options.cacheAdditionalHeaders = options.cacheAdditionalHeaders || [] - - // cacheManager is deprecated, but if it's set and - // cachePath is not we should copy it to the new field - if (options.cacheManager && !options.cachePath) { - options.cachePath = options.cacheManager - } - - return options -} - -module.exports = configureOptions diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/make-fetch-happen/lib/pipeline.js b/deps/npm/node_modules/@sigstore/sign/node_modules/make-fetch-happen/lib/pipeline.js deleted file mode 100644 index b1d221b2d0ce31..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/make-fetch-happen/lib/pipeline.js +++ /dev/null @@ -1,41 +0,0 @@ -'use strict' - -const MinipassPipeline = require('minipass-pipeline') - -class CachingMinipassPipeline extends MinipassPipeline { - #events = [] - #data = new Map() - - constructor (opts, ...streams) { - // CRITICAL: do NOT pass the streams to the call to super(), this will start - // the flow of data and potentially cause the events we need to catch to emit - // before we've finished our own setup. instead we call super() with no args, - // finish our setup, and then push the streams into ourselves to start the - // data flow - super() - this.#events = opts.events - - /* istanbul ignore next - coverage disabled because this is pointless to test here */ - if (streams.length) { - this.push(...streams) - } - } - - on (event, handler) { - if (this.#events.includes(event) && this.#data.has(event)) { - return handler(...this.#data.get(event)) - } - - return super.on(event, handler) - } - - emit (event, ...data) { - if (this.#events.includes(event)) { - this.#data.set(event, data) - } - - return super.emit(event, ...data) - } -} - -module.exports = CachingMinipassPipeline diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/make-fetch-happen/lib/remote.js b/deps/npm/node_modules/@sigstore/sign/node_modules/make-fetch-happen/lib/remote.js deleted file mode 100644 index 8554564074de6e..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/make-fetch-happen/lib/remote.js +++ /dev/null @@ -1,131 +0,0 @@ -const { Minipass } = require('minipass') -const fetch = require('minipass-fetch') -const promiseRetry = require('promise-retry') -const ssri = require('ssri') -const { log } = require('proc-log') - -const CachingMinipassPipeline = require('./pipeline.js') -const { getAgent } = require('@npmcli/agent') -const pkg = require('../package.json') - -const USER_AGENT = `${pkg.name}/${pkg.version} (+https://npm.im/${pkg.name})` - -const RETRY_ERRORS = [ - 'ECONNRESET', // remote socket closed on us - 'ECONNREFUSED', // remote host refused to open connection - 'EADDRINUSE', // failed to bind to a local port (proxy?) - 'ETIMEDOUT', // someone in the transaction is WAY TOO SLOW - // from @npmcli/agent - 'ECONNECTIONTIMEOUT', - 'EIDLETIMEOUT', - 'ERESPONSETIMEOUT', - 'ETRANSFERTIMEOUT', - // Known codes we do NOT retry on: - // ENOTFOUND (getaddrinfo failure. Either bad hostname, or offline) - // EINVALIDPROXY // invalid protocol from @npmcli/agent - // EINVALIDRESPONSE // invalid status code from @npmcli/agent -] - -const RETRY_TYPES = [ - 'request-timeout', -] - -// make a request directly to the remote source, -// retrying certain classes of errors as well as -// following redirects (through the cache if necessary) -// and verifying response integrity -const remoteFetch = (request, options) => { - const agent = getAgent(request.url, options) - if (!request.headers.has('connection')) { - request.headers.set('connection', agent ? 'keep-alive' : 'close') - } - - if (!request.headers.has('user-agent')) { - request.headers.set('user-agent', USER_AGENT) - } - - // keep our own options since we're overriding the agent - // and the redirect mode - const _opts = { - ...options, - agent, - redirect: 'manual', - } - - return promiseRetry(async (retryHandler, attemptNum) => { - const req = new fetch.Request(request, _opts) - try { - let res = await fetch(req, _opts) - if (_opts.integrity && res.status === 200) { - // we got a 200 response and the user has specified an expected - // integrity value, so wrap the response in an ssri stream to verify it - const integrityStream = ssri.integrityStream({ - algorithms: _opts.algorithms, - integrity: _opts.integrity, - size: _opts.size, - }) - const pipeline = new CachingMinipassPipeline({ - events: ['integrity', 'size'], - }, res.body, integrityStream) - // we also propagate the integrity and size events out to the pipeline so we can use - // this new response body as an integrityEmitter for cacache - integrityStream.on('integrity', i => pipeline.emit('integrity', i)) - integrityStream.on('size', s => pipeline.emit('size', s)) - res = new fetch.Response(pipeline, res) - // set an explicit flag so we know if our response body will emit integrity and size - res.body.hasIntegrityEmitter = true - } - - res.headers.set('x-fetch-attempts', attemptNum) - - // do not retry POST requests, or requests with a streaming body - // do retry requests with a 408, 420, 429 or 500+ status in the response - const isStream = Minipass.isStream(req.body) - const isRetriable = req.method !== 'POST' && - !isStream && - ([408, 420, 429].includes(res.status) || res.status >= 500) - - if (isRetriable) { - if (typeof options.onRetry === 'function') { - options.onRetry(res) - } - - /* eslint-disable-next-line max-len */ - log.http('fetch', `${req.method} ${req.url} attempt ${attemptNum} failed with ${res.status}`) - return retryHandler(res) - } - - return res - } catch (err) { - const code = (err.code === 'EPROMISERETRY') - ? err.retried.code - : err.code - - // err.retried will be the thing that was thrown from above - // if it's a response, we just got a bad status code and we - // can re-throw to allow the retry - const isRetryError = err.retried instanceof fetch.Response || - (RETRY_ERRORS.includes(code) && RETRY_TYPES.includes(err.type)) - - if (req.method === 'POST' || isRetryError) { - throw err - } - - if (typeof options.onRetry === 'function') { - options.onRetry(err) - } - - log.http('fetch', `${req.method} ${req.url} attempt ${attemptNum} failed with ${err.code}`) - return retryHandler(err) - } - }, options.retry).catch((err) => { - // don't reject for http errors, just return them - if (err.status >= 400 && err.type !== 'system') { - return err - } - - throw err - }) -} - -module.exports = remoteFetch diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/make-fetch-happen/package.json b/deps/npm/node_modules/@sigstore/sign/node_modules/make-fetch-happen/package.json deleted file mode 100644 index 7adb4d1e7f9719..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/make-fetch-happen/package.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "name": "make-fetch-happen", - "version": "13.0.1", - "description": "Opinionated, caching, retrying fetch client", - "main": "lib/index.js", - "files": [ - "bin/", - "lib/" - ], - "scripts": { - "test": "tap", - "posttest": "npm run lint", - "eslint": "eslint", - "lint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"", - "lintfix": "npm run lint -- --fix", - "postlint": "template-oss-check", - "snap": "tap", - "template-oss-apply": "template-oss-apply --force" - }, - "repository": { - "type": "git", - "url": "https://github.com/npm/make-fetch-happen.git" - }, - "keywords": [ - "http", - "request", - "fetch", - "mean girls", - "caching", - "cache", - "subresource integrity" - ], - "author": "GitHub Inc.", - "license": "ISC", - "dependencies": { - "@npmcli/agent": "^2.0.0", - "cacache": "^18.0.0", - "http-cache-semantics": "^4.1.1", - "is-lambda": "^1.0.1", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "proc-log": "^4.2.0", - "promise-retry": "^2.0.1", - "ssri": "^10.0.0" - }, - "devDependencies": { - "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.21.4", - "nock": "^13.2.4", - "safe-buffer": "^5.2.1", - "standard-version": "^9.3.2", - "tap": "^16.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - }, - "tap": { - "color": 1, - "files": "test/*.js", - "check-coverage": true, - "timeout": 60, - "nyc-arg": [ - "--exclude", - "tap-snapshots/**" - ] - }, - "templateOSS": { - "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.21.4", - "publish": "true" - } -} diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/minipass-fetch/LICENSE b/deps/npm/node_modules/@sigstore/sign/node_modules/minipass-fetch/LICENSE deleted file mode 100644 index 3c3410cdc12ee3..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/minipass-fetch/LICENSE +++ /dev/null @@ -1,28 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Isaac Z. Schlueter and Contributors -Copyright (c) 2016 David Frank - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - ---- - -Note: This is a derivative work based on "node-fetch" by David Frank, -modified and distributed under the terms of the MIT license above. -https://github.com/bitinn/node-fetch diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/minipass-fetch/lib/abort-error.js b/deps/npm/node_modules/@sigstore/sign/node_modules/minipass-fetch/lib/abort-error.js deleted file mode 100644 index b18f643269e375..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/minipass-fetch/lib/abort-error.js +++ /dev/null @@ -1,17 +0,0 @@ -'use strict' -class AbortError extends Error { - constructor (message) { - super(message) - this.code = 'FETCH_ABORTED' - this.type = 'aborted' - Error.captureStackTrace(this, this.constructor) - } - - get name () { - return 'AbortError' - } - - // don't allow name to be overridden, but don't throw either - set name (s) {} -} -module.exports = AbortError diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/minipass-fetch/lib/blob.js b/deps/npm/node_modules/@sigstore/sign/node_modules/minipass-fetch/lib/blob.js deleted file mode 100644 index 121b1730102e72..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/minipass-fetch/lib/blob.js +++ /dev/null @@ -1,97 +0,0 @@ -'use strict' -const { Minipass } = require('minipass') -const TYPE = Symbol('type') -const BUFFER = Symbol('buffer') - -class Blob { - constructor (blobParts, options) { - this[TYPE] = '' - - const buffers = [] - let size = 0 - - if (blobParts) { - const a = blobParts - const length = Number(a.length) - for (let i = 0; i < length; i++) { - const element = a[i] - const buffer = element instanceof Buffer ? element - : ArrayBuffer.isView(element) - ? Buffer.from(element.buffer, element.byteOffset, element.byteLength) - : element instanceof ArrayBuffer ? Buffer.from(element) - : element instanceof Blob ? element[BUFFER] - : typeof element === 'string' ? Buffer.from(element) - : Buffer.from(String(element)) - size += buffer.length - buffers.push(buffer) - } - } - - this[BUFFER] = Buffer.concat(buffers, size) - - const type = options && options.type !== undefined - && String(options.type).toLowerCase() - if (type && !/[^\u0020-\u007E]/.test(type)) { - this[TYPE] = type - } - } - - get size () { - return this[BUFFER].length - } - - get type () { - return this[TYPE] - } - - text () { - return Promise.resolve(this[BUFFER].toString()) - } - - arrayBuffer () { - const buf = this[BUFFER] - const off = buf.byteOffset - const len = buf.byteLength - const ab = buf.buffer.slice(off, off + len) - return Promise.resolve(ab) - } - - stream () { - return new Minipass().end(this[BUFFER]) - } - - slice (start, end, type) { - const size = this.size - const relativeStart = start === undefined ? 0 - : start < 0 ? Math.max(size + start, 0) - : Math.min(start, size) - const relativeEnd = end === undefined ? size - : end < 0 ? Math.max(size + end, 0) - : Math.min(end, size) - const span = Math.max(relativeEnd - relativeStart, 0) - - const buffer = this[BUFFER] - const slicedBuffer = buffer.slice( - relativeStart, - relativeStart + span - ) - const blob = new Blob([], { type }) - blob[BUFFER] = slicedBuffer - return blob - } - - get [Symbol.toStringTag] () { - return 'Blob' - } - - static get BUFFER () { - return BUFFER - } -} - -Object.defineProperties(Blob.prototype, { - size: { enumerable: true }, - type: { enumerable: true }, -}) - -module.exports = Blob diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/minipass-fetch/lib/body.js b/deps/npm/node_modules/@sigstore/sign/node_modules/minipass-fetch/lib/body.js deleted file mode 100644 index 62286bd1de0d91..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/minipass-fetch/lib/body.js +++ /dev/null @@ -1,350 +0,0 @@ -'use strict' -const { Minipass } = require('minipass') -const MinipassSized = require('minipass-sized') - -const Blob = require('./blob.js') -const { BUFFER } = Blob -const FetchError = require('./fetch-error.js') - -// optional dependency on 'encoding' -let convert -try { - convert = require('encoding').convert -} catch (e) { - // defer error until textConverted is called -} - -const INTERNALS = Symbol('Body internals') -const CONSUME_BODY = Symbol('consumeBody') - -class Body { - constructor (bodyArg, options = {}) { - const { size = 0, timeout = 0 } = options - const body = bodyArg === undefined || bodyArg === null ? null - : isURLSearchParams(bodyArg) ? Buffer.from(bodyArg.toString()) - : isBlob(bodyArg) ? bodyArg - : Buffer.isBuffer(bodyArg) ? bodyArg - : Object.prototype.toString.call(bodyArg) === '[object ArrayBuffer]' - ? Buffer.from(bodyArg) - : ArrayBuffer.isView(bodyArg) - ? Buffer.from(bodyArg.buffer, bodyArg.byteOffset, bodyArg.byteLength) - : Minipass.isStream(bodyArg) ? bodyArg - : Buffer.from(String(bodyArg)) - - this[INTERNALS] = { - body, - disturbed: false, - error: null, - } - - this.size = size - this.timeout = timeout - - if (Minipass.isStream(body)) { - body.on('error', er => { - const error = er.name === 'AbortError' ? er - : new FetchError(`Invalid response while trying to fetch ${ - this.url}: ${er.message}`, 'system', er) - this[INTERNALS].error = error - }) - } - } - - get body () { - return this[INTERNALS].body - } - - get bodyUsed () { - return this[INTERNALS].disturbed - } - - arrayBuffer () { - return this[CONSUME_BODY]().then(buf => - buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength)) - } - - blob () { - const ct = this.headers && this.headers.get('content-type') || '' - return this[CONSUME_BODY]().then(buf => Object.assign( - new Blob([], { type: ct.toLowerCase() }), - { [BUFFER]: buf } - )) - } - - async json () { - const buf = await this[CONSUME_BODY]() - try { - return JSON.parse(buf.toString()) - } catch (er) { - throw new FetchError( - `invalid json response body at ${this.url} reason: ${er.message}`, - 'invalid-json' - ) - } - } - - text () { - return this[CONSUME_BODY]().then(buf => buf.toString()) - } - - buffer () { - return this[CONSUME_BODY]() - } - - textConverted () { - return this[CONSUME_BODY]().then(buf => convertBody(buf, this.headers)) - } - - [CONSUME_BODY] () { - if (this[INTERNALS].disturbed) { - return Promise.reject(new TypeError(`body used already for: ${ - this.url}`)) - } - - this[INTERNALS].disturbed = true - - if (this[INTERNALS].error) { - return Promise.reject(this[INTERNALS].error) - } - - // body is null - if (this.body === null) { - return Promise.resolve(Buffer.alloc(0)) - } - - if (Buffer.isBuffer(this.body)) { - return Promise.resolve(this.body) - } - - const upstream = isBlob(this.body) ? this.body.stream() : this.body - - /* istanbul ignore if: should never happen */ - if (!Minipass.isStream(upstream)) { - return Promise.resolve(Buffer.alloc(0)) - } - - const stream = this.size && upstream instanceof MinipassSized ? upstream - : !this.size && upstream instanceof Minipass && - !(upstream instanceof MinipassSized) ? upstream - : this.size ? new MinipassSized({ size: this.size }) - : new Minipass() - - // allow timeout on slow response body, but only if the stream is still writable. this - // makes the timeout center on the socket stream from lib/index.js rather than the - // intermediary minipass stream we create to receive the data - const resTimeout = this.timeout && stream.writable ? setTimeout(() => { - stream.emit('error', new FetchError( - `Response timeout while trying to fetch ${ - this.url} (over ${this.timeout}ms)`, 'body-timeout')) - }, this.timeout) : null - - // do not keep the process open just for this timeout, even - // though we expect it'll get cleared eventually. - if (resTimeout && resTimeout.unref) { - resTimeout.unref() - } - - // do the pipe in the promise, because the pipe() can send too much - // data through right away and upset the MP Sized object - return new Promise((resolve) => { - // if the stream is some other kind of stream, then pipe through a MP - // so we can collect it more easily. - if (stream !== upstream) { - upstream.on('error', er => stream.emit('error', er)) - upstream.pipe(stream) - } - resolve() - }).then(() => stream.concat()).then(buf => { - clearTimeout(resTimeout) - return buf - }).catch(er => { - clearTimeout(resTimeout) - // request was aborted, reject with this Error - if (er.name === 'AbortError' || er.name === 'FetchError') { - throw er - } else if (er.name === 'RangeError') { - throw new FetchError(`Could not create Buffer from response body for ${ - this.url}: ${er.message}`, 'system', er) - } else { - // other errors, such as incorrect content-encoding or content-length - throw new FetchError(`Invalid response body while trying to fetch ${ - this.url}: ${er.message}`, 'system', er) - } - }) - } - - static clone (instance) { - if (instance.bodyUsed) { - throw new Error('cannot clone body after it is used') - } - - const body = instance.body - - // check that body is a stream and not form-data object - // NB: can't clone the form-data object without having it as a dependency - if (Minipass.isStream(body) && typeof body.getBoundary !== 'function') { - // create a dedicated tee stream so that we don't lose data - // potentially sitting in the body stream's buffer by writing it - // immediately to p1 and not having it for p2. - const tee = new Minipass() - const p1 = new Minipass() - const p2 = new Minipass() - tee.on('error', er => { - p1.emit('error', er) - p2.emit('error', er) - }) - body.on('error', er => tee.emit('error', er)) - tee.pipe(p1) - tee.pipe(p2) - body.pipe(tee) - // set instance body to one fork, return the other - instance[INTERNALS].body = p1 - return p2 - } else { - return instance.body - } - } - - static extractContentType (body) { - return body === null || body === undefined ? null - : typeof body === 'string' ? 'text/plain;charset=UTF-8' - : isURLSearchParams(body) - ? 'application/x-www-form-urlencoded;charset=UTF-8' - : isBlob(body) ? body.type || null - : Buffer.isBuffer(body) ? null - : Object.prototype.toString.call(body) === '[object ArrayBuffer]' ? null - : ArrayBuffer.isView(body) ? null - : typeof body.getBoundary === 'function' - ? `multipart/form-data;boundary=${body.getBoundary()}` - : Minipass.isStream(body) ? null - : 'text/plain;charset=UTF-8' - } - - static getTotalBytes (instance) { - const { body } = instance - return (body === null || body === undefined) ? 0 - : isBlob(body) ? body.size - : Buffer.isBuffer(body) ? body.length - : body && typeof body.getLengthSync === 'function' && ( - // detect form data input from form-data module - body._lengthRetrievers && - /* istanbul ignore next */ body._lengthRetrievers.length === 0 || // 1.x - body.hasKnownLength && body.hasKnownLength()) // 2.x - ? body.getLengthSync() - : null - } - - static writeToStream (dest, instance) { - const { body } = instance - - if (body === null || body === undefined) { - dest.end() - } else if (Buffer.isBuffer(body) || typeof body === 'string') { - dest.end(body) - } else { - // body is stream or blob - const stream = isBlob(body) ? body.stream() : body - stream.on('error', er => dest.emit('error', er)).pipe(dest) - } - - return dest - } -} - -Object.defineProperties(Body.prototype, { - body: { enumerable: true }, - bodyUsed: { enumerable: true }, - arrayBuffer: { enumerable: true }, - blob: { enumerable: true }, - json: { enumerable: true }, - text: { enumerable: true }, -}) - -const isURLSearchParams = obj => - // Duck-typing as a necessary condition. - (typeof obj !== 'object' || - typeof obj.append !== 'function' || - typeof obj.delete !== 'function' || - typeof obj.get !== 'function' || - typeof obj.getAll !== 'function' || - typeof obj.has !== 'function' || - typeof obj.set !== 'function') ? false - // Brand-checking and more duck-typing as optional condition. - : obj.constructor.name === 'URLSearchParams' || - Object.prototype.toString.call(obj) === '[object URLSearchParams]' || - typeof obj.sort === 'function' - -const isBlob = obj => - typeof obj === 'object' && - typeof obj.arrayBuffer === 'function' && - typeof obj.type === 'string' && - typeof obj.stream === 'function' && - typeof obj.constructor === 'function' && - typeof obj.constructor.name === 'string' && - /^(Blob|File)$/.test(obj.constructor.name) && - /^(Blob|File)$/.test(obj[Symbol.toStringTag]) - -const convertBody = (buffer, headers) => { - /* istanbul ignore if */ - if (typeof convert !== 'function') { - throw new Error('The package `encoding` must be installed to use the textConverted() function') - } - - const ct = headers && headers.get('content-type') - let charset = 'utf-8' - let res - - // header - if (ct) { - res = /charset=([^;]*)/i.exec(ct) - } - - // no charset in content type, peek at response body for at most 1024 bytes - const str = buffer.slice(0, 1024).toString() - - // html5 - if (!res && str) { - res = / this.expect - ? 'max-size' : type - this.message = message - Error.captureStackTrace(this, this.constructor) - } - - get name () { - return 'FetchError' - } - - // don't allow name to be overwritten - set name (n) {} - - get [Symbol.toStringTag] () { - return 'FetchError' - } -} -module.exports = FetchError diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/minipass-fetch/lib/headers.js b/deps/npm/node_modules/@sigstore/sign/node_modules/minipass-fetch/lib/headers.js deleted file mode 100644 index dd6e854d5ba399..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/minipass-fetch/lib/headers.js +++ /dev/null @@ -1,267 +0,0 @@ -'use strict' -const invalidTokenRegex = /[^^_`a-zA-Z\-0-9!#$%&'*+.|~]/ -const invalidHeaderCharRegex = /[^\t\x20-\x7e\x80-\xff]/ - -const validateName = name => { - name = `${name}` - if (invalidTokenRegex.test(name) || name === '') { - throw new TypeError(`${name} is not a legal HTTP header name`) - } -} - -const validateValue = value => { - value = `${value}` - if (invalidHeaderCharRegex.test(value)) { - throw new TypeError(`${value} is not a legal HTTP header value`) - } -} - -const find = (map, name) => { - name = name.toLowerCase() - for (const key in map) { - if (key.toLowerCase() === name) { - return key - } - } - return undefined -} - -const MAP = Symbol('map') -class Headers { - constructor (init = undefined) { - this[MAP] = Object.create(null) - if (init instanceof Headers) { - const rawHeaders = init.raw() - const headerNames = Object.keys(rawHeaders) - for (const headerName of headerNames) { - for (const value of rawHeaders[headerName]) { - this.append(headerName, value) - } - } - return - } - - // no-op - if (init === undefined || init === null) { - return - } - - if (typeof init === 'object') { - const method = init[Symbol.iterator] - if (method !== null && method !== undefined) { - if (typeof method !== 'function') { - throw new TypeError('Header pairs must be iterable') - } - - // sequence> - // Note: per spec we have to first exhaust the lists then process them - const pairs = [] - for (const pair of init) { - if (typeof pair !== 'object' || - typeof pair[Symbol.iterator] !== 'function') { - throw new TypeError('Each header pair must be iterable') - } - const arrPair = Array.from(pair) - if (arrPair.length !== 2) { - throw new TypeError('Each header pair must be a name/value tuple') - } - pairs.push(arrPair) - } - - for (const pair of pairs) { - this.append(pair[0], pair[1]) - } - } else { - // record - for (const key of Object.keys(init)) { - this.append(key, init[key]) - } - } - } else { - throw new TypeError('Provided initializer must be an object') - } - } - - get (name) { - name = `${name}` - validateName(name) - const key = find(this[MAP], name) - if (key === undefined) { - return null - } - - return this[MAP][key].join(', ') - } - - forEach (callback, thisArg = undefined) { - let pairs = getHeaders(this) - for (let i = 0; i < pairs.length; i++) { - const [name, value] = pairs[i] - callback.call(thisArg, value, name, this) - // refresh in case the callback added more headers - pairs = getHeaders(this) - } - } - - set (name, value) { - name = `${name}` - value = `${value}` - validateName(name) - validateValue(value) - const key = find(this[MAP], name) - this[MAP][key !== undefined ? key : name] = [value] - } - - append (name, value) { - name = `${name}` - value = `${value}` - validateName(name) - validateValue(value) - const key = find(this[MAP], name) - if (key !== undefined) { - this[MAP][key].push(value) - } else { - this[MAP][name] = [value] - } - } - - has (name) { - name = `${name}` - validateName(name) - return find(this[MAP], name) !== undefined - } - - delete (name) { - name = `${name}` - validateName(name) - const key = find(this[MAP], name) - if (key !== undefined) { - delete this[MAP][key] - } - } - - raw () { - return this[MAP] - } - - keys () { - return new HeadersIterator(this, 'key') - } - - values () { - return new HeadersIterator(this, 'value') - } - - [Symbol.iterator] () { - return new HeadersIterator(this, 'key+value') - } - - entries () { - return new HeadersIterator(this, 'key+value') - } - - get [Symbol.toStringTag] () { - return 'Headers' - } - - static exportNodeCompatibleHeaders (headers) { - const obj = Object.assign(Object.create(null), headers[MAP]) - - // http.request() only supports string as Host header. This hack makes - // specifying custom Host header possible. - const hostHeaderKey = find(headers[MAP], 'Host') - if (hostHeaderKey !== undefined) { - obj[hostHeaderKey] = obj[hostHeaderKey][0] - } - - return obj - } - - static createHeadersLenient (obj) { - const headers = new Headers() - for (const name of Object.keys(obj)) { - if (invalidTokenRegex.test(name)) { - continue - } - - if (Array.isArray(obj[name])) { - for (const val of obj[name]) { - if (invalidHeaderCharRegex.test(val)) { - continue - } - - if (headers[MAP][name] === undefined) { - headers[MAP][name] = [val] - } else { - headers[MAP][name].push(val) - } - } - } else if (!invalidHeaderCharRegex.test(obj[name])) { - headers[MAP][name] = [obj[name]] - } - } - return headers - } -} - -Object.defineProperties(Headers.prototype, { - get: { enumerable: true }, - forEach: { enumerable: true }, - set: { enumerable: true }, - append: { enumerable: true }, - has: { enumerable: true }, - delete: { enumerable: true }, - keys: { enumerable: true }, - values: { enumerable: true }, - entries: { enumerable: true }, -}) - -const getHeaders = (headers, kind = 'key+value') => - Object.keys(headers[MAP]).sort().map( - kind === 'key' ? k => k.toLowerCase() - : kind === 'value' ? k => headers[MAP][k].join(', ') - : k => [k.toLowerCase(), headers[MAP][k].join(', ')] - ) - -const INTERNAL = Symbol('internal') - -class HeadersIterator { - constructor (target, kind) { - this[INTERNAL] = { - target, - kind, - index: 0, - } - } - - get [Symbol.toStringTag] () { - return 'HeadersIterator' - } - - next () { - /* istanbul ignore if: should be impossible */ - if (!this || Object.getPrototypeOf(this) !== HeadersIterator.prototype) { - throw new TypeError('Value of `this` is not a HeadersIterator') - } - - const { target, kind, index } = this[INTERNAL] - const values = getHeaders(target, kind) - const len = values.length - if (index >= len) { - return { - value: undefined, - done: true, - } - } - - this[INTERNAL].index++ - - return { value: values[index], done: false } - } -} - -// manually extend because 'extends' requires a ctor -Object.setPrototypeOf(HeadersIterator.prototype, - Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]()))) - -module.exports = Headers diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/minipass-fetch/lib/index.js b/deps/npm/node_modules/@sigstore/sign/node_modules/minipass-fetch/lib/index.js deleted file mode 100644 index da402161670e65..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/minipass-fetch/lib/index.js +++ /dev/null @@ -1,377 +0,0 @@ -'use strict' -const { URL } = require('url') -const http = require('http') -const https = require('https') -const zlib = require('minizlib') -const { Minipass } = require('minipass') - -const Body = require('./body.js') -const { writeToStream, getTotalBytes } = Body -const Response = require('./response.js') -const Headers = require('./headers.js') -const { createHeadersLenient } = Headers -const Request = require('./request.js') -const { getNodeRequestOptions } = Request -const FetchError = require('./fetch-error.js') -const AbortError = require('./abort-error.js') - -// XXX this should really be split up and unit-ized for easier testing -// and better DRY implementation of data/http request aborting -const fetch = async (url, opts) => { - if (/^data:/.test(url)) { - const request = new Request(url, opts) - // delay 1 promise tick so that the consumer can abort right away - return Promise.resolve().then(() => new Promise((resolve, reject) => { - let type, data - try { - const { pathname, search } = new URL(url) - const split = pathname.split(',') - if (split.length < 2) { - throw new Error('invalid data: URI') - } - const mime = split.shift() - const base64 = /;base64$/.test(mime) - type = base64 ? mime.slice(0, -1 * ';base64'.length) : mime - const rawData = decodeURIComponent(split.join(',') + search) - data = base64 ? Buffer.from(rawData, 'base64') : Buffer.from(rawData) - } catch (er) { - return reject(new FetchError(`[${request.method}] ${ - request.url} invalid URL, ${er.message}`, 'system', er)) - } - - const { signal } = request - if (signal && signal.aborted) { - return reject(new AbortError('The user aborted a request.')) - } - - const headers = { 'Content-Length': data.length } - if (type) { - headers['Content-Type'] = type - } - return resolve(new Response(data, { headers })) - })) - } - - return new Promise((resolve, reject) => { - // build request object - const request = new Request(url, opts) - let options - try { - options = getNodeRequestOptions(request) - } catch (er) { - return reject(er) - } - - const send = (options.protocol === 'https:' ? https : http).request - const { signal } = request - let response = null - const abort = () => { - const error = new AbortError('The user aborted a request.') - reject(error) - if (Minipass.isStream(request.body) && - typeof request.body.destroy === 'function') { - request.body.destroy(error) - } - if (response && response.body) { - response.body.emit('error', error) - } - } - - if (signal && signal.aborted) { - return abort() - } - - const abortAndFinalize = () => { - abort() - finalize() - } - - const finalize = () => { - req.abort() - if (signal) { - signal.removeEventListener('abort', abortAndFinalize) - } - clearTimeout(reqTimeout) - } - - // send request - const req = send(options) - - if (signal) { - signal.addEventListener('abort', abortAndFinalize) - } - - let reqTimeout = null - if (request.timeout) { - req.once('socket', () => { - reqTimeout = setTimeout(() => { - reject(new FetchError(`network timeout at: ${ - request.url}`, 'request-timeout')) - finalize() - }, request.timeout) - }) - } - - req.on('error', er => { - // if a 'response' event is emitted before the 'error' event, then by the - // time this handler is run it's too late to reject the Promise for the - // response. instead, we forward the error event to the response stream - // so that the error will surface to the user when they try to consume - // the body. this is done as a side effect of aborting the request except - // for in windows, where we must forward the event manually, otherwise - // there is no longer a ref'd socket attached to the request and the - // stream never ends so the event loop runs out of work and the process - // exits without warning. - // coverage skipped here due to the difficulty in testing - // istanbul ignore next - if (req.res) { - req.res.emit('error', er) - } - reject(new FetchError(`request to ${request.url} failed, reason: ${ - er.message}`, 'system', er)) - finalize() - }) - - req.on('response', res => { - clearTimeout(reqTimeout) - - const headers = createHeadersLenient(res.headers) - - // HTTP fetch step 5 - if (fetch.isRedirect(res.statusCode)) { - // HTTP fetch step 5.2 - const location = headers.get('Location') - - // HTTP fetch step 5.3 - let locationURL = null - try { - locationURL = location === null ? null : new URL(location, request.url).toString() - } catch { - // error here can only be invalid URL in Location: header - // do not throw when options.redirect == manual - // let the user extract the errorneous redirect URL - if (request.redirect !== 'manual') { - /* eslint-disable-next-line max-len */ - reject(new FetchError(`uri requested responds with an invalid redirect URL: ${location}`, 'invalid-redirect')) - finalize() - return - } - } - - // HTTP fetch step 5.5 - if (request.redirect === 'error') { - reject(new FetchError('uri requested responds with a redirect, ' + - `redirect mode is set to error: ${request.url}`, 'no-redirect')) - finalize() - return - } else if (request.redirect === 'manual') { - // node-fetch-specific step: make manual redirect a bit easier to - // use by setting the Location header value to the resolved URL. - if (locationURL !== null) { - // handle corrupted header - try { - headers.set('Location', locationURL) - } catch (err) { - /* istanbul ignore next: nodejs server prevent invalid - response headers, we can't test this through normal - request */ - reject(err) - } - } - } else if (request.redirect === 'follow' && locationURL !== null) { - // HTTP-redirect fetch step 5 - if (request.counter >= request.follow) { - reject(new FetchError(`maximum redirect reached at: ${ - request.url}`, 'max-redirect')) - finalize() - return - } - - // HTTP-redirect fetch step 9 - if (res.statusCode !== 303 && - request.body && - getTotalBytes(request) === null) { - reject(new FetchError( - 'Cannot follow redirect with body being a readable stream', - 'unsupported-redirect' - )) - finalize() - return - } - - // Update host due to redirection - request.headers.set('host', (new URL(locationURL)).host) - - // HTTP-redirect fetch step 6 (counter increment) - // Create a new Request object. - const requestOpts = { - headers: new Headers(request.headers), - follow: request.follow, - counter: request.counter + 1, - agent: request.agent, - compress: request.compress, - method: request.method, - body: request.body, - signal: request.signal, - timeout: request.timeout, - } - - // if the redirect is to a new hostname, strip the authorization and cookie headers - const parsedOriginal = new URL(request.url) - const parsedRedirect = new URL(locationURL) - if (parsedOriginal.hostname !== parsedRedirect.hostname) { - requestOpts.headers.delete('authorization') - requestOpts.headers.delete('cookie') - } - - // HTTP-redirect fetch step 11 - if (res.statusCode === 303 || ( - (res.statusCode === 301 || res.statusCode === 302) && - request.method === 'POST' - )) { - requestOpts.method = 'GET' - requestOpts.body = undefined - requestOpts.headers.delete('content-length') - } - - // HTTP-redirect fetch step 15 - resolve(fetch(new Request(locationURL, requestOpts))) - finalize() - return - } - } // end if(isRedirect) - - // prepare response - res.once('end', () => - signal && signal.removeEventListener('abort', abortAndFinalize)) - - const body = new Minipass() - // if an error occurs, either on the response stream itself, on one of the - // decoder streams, or a response length timeout from the Body class, we - // forward the error through to our internal body stream. If we see an - // error event on that, we call finalize to abort the request and ensure - // we don't leave a socket believing a request is in flight. - // this is difficult to test, so lacks specific coverage. - body.on('error', finalize) - // exceedingly rare that the stream would have an error, - // but just in case we proxy it to the stream in use. - res.on('error', /* istanbul ignore next */ er => body.emit('error', er)) - res.on('data', (chunk) => body.write(chunk)) - res.on('end', () => body.end()) - - const responseOptions = { - url: request.url, - status: res.statusCode, - statusText: res.statusMessage, - headers: headers, - size: request.size, - timeout: request.timeout, - counter: request.counter, - trailer: new Promise(resolveTrailer => - res.on('end', () => resolveTrailer(createHeadersLenient(res.trailers)))), - } - - // HTTP-network fetch step 12.1.1.3 - const codings = headers.get('Content-Encoding') - - // HTTP-network fetch step 12.1.1.4: handle content codings - - // in following scenarios we ignore compression support - // 1. compression support is disabled - // 2. HEAD request - // 3. no Content-Encoding header - // 4. no content response (204) - // 5. content not modified response (304) - if (!request.compress || - request.method === 'HEAD' || - codings === null || - res.statusCode === 204 || - res.statusCode === 304) { - response = new Response(body, responseOptions) - resolve(response) - return - } - - // Be less strict when decoding compressed responses, since sometimes - // servers send slightly invalid responses that are still accepted - // by common browsers. - // Always using Z_SYNC_FLUSH is what cURL does. - const zlibOptions = { - flush: zlib.constants.Z_SYNC_FLUSH, - finishFlush: zlib.constants.Z_SYNC_FLUSH, - } - - // for gzip - if (codings === 'gzip' || codings === 'x-gzip') { - const unzip = new zlib.Gunzip(zlibOptions) - response = new Response( - // exceedingly rare that the stream would have an error, - // but just in case we proxy it to the stream in use. - body.on('error', /* istanbul ignore next */ er => unzip.emit('error', er)).pipe(unzip), - responseOptions - ) - resolve(response) - return - } - - // for deflate - if (codings === 'deflate' || codings === 'x-deflate') { - // handle the infamous raw deflate response from old servers - // a hack for old IIS and Apache servers - const raw = res.pipe(new Minipass()) - raw.once('data', chunk => { - // see http://stackoverflow.com/questions/37519828 - const decoder = (chunk[0] & 0x0F) === 0x08 - ? new zlib.Inflate() - : new zlib.InflateRaw() - // exceedingly rare that the stream would have an error, - // but just in case we proxy it to the stream in use. - body.on('error', /* istanbul ignore next */ er => decoder.emit('error', er)).pipe(decoder) - response = new Response(decoder, responseOptions) - resolve(response) - }) - return - } - - // for br - if (codings === 'br') { - // ignoring coverage so tests don't have to fake support (or lack of) for brotli - // istanbul ignore next - try { - var decoder = new zlib.BrotliDecompress() - } catch (err) { - reject(err) - finalize() - return - } - // exceedingly rare that the stream would have an error, - // but just in case we proxy it to the stream in use. - body.on('error', /* istanbul ignore next */ er => decoder.emit('error', er)).pipe(decoder) - response = new Response(decoder, responseOptions) - resolve(response) - return - } - - // otherwise, use response as-is - response = new Response(body, responseOptions) - resolve(response) - }) - - writeToStream(req, request) - }) -} - -module.exports = fetch - -fetch.isRedirect = code => - code === 301 || - code === 302 || - code === 303 || - code === 307 || - code === 308 - -fetch.Headers = Headers -fetch.Request = Request -fetch.Response = Response -fetch.FetchError = FetchError -fetch.AbortError = AbortError diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/minipass-fetch/lib/request.js b/deps/npm/node_modules/@sigstore/sign/node_modules/minipass-fetch/lib/request.js deleted file mode 100644 index 054439e6699107..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/minipass-fetch/lib/request.js +++ /dev/null @@ -1,282 +0,0 @@ -'use strict' -const { URL } = require('url') -const { Minipass } = require('minipass') -const Headers = require('./headers.js') -const { exportNodeCompatibleHeaders } = Headers -const Body = require('./body.js') -const { clone, extractContentType, getTotalBytes } = Body - -const version = require('../package.json').version -const defaultUserAgent = - `minipass-fetch/${version} (+https://github.com/isaacs/minipass-fetch)` - -const INTERNALS = Symbol('Request internals') - -const isRequest = input => - typeof input === 'object' && typeof input[INTERNALS] === 'object' - -const isAbortSignal = signal => { - const proto = ( - signal - && typeof signal === 'object' - && Object.getPrototypeOf(signal) - ) - return !!(proto && proto.constructor.name === 'AbortSignal') -} - -class Request extends Body { - constructor (input, init = {}) { - const parsedURL = isRequest(input) ? new URL(input.url) - : input && input.href ? new URL(input.href) - : new URL(`${input}`) - - if (isRequest(input)) { - init = { ...input[INTERNALS], ...init } - } else if (!input || typeof input === 'string') { - input = {} - } - - const method = (init.method || input.method || 'GET').toUpperCase() - const isGETHEAD = method === 'GET' || method === 'HEAD' - - if ((init.body !== null && init.body !== undefined || - isRequest(input) && input.body !== null) && isGETHEAD) { - throw new TypeError('Request with GET/HEAD method cannot have body') - } - - const inputBody = init.body !== null && init.body !== undefined ? init.body - : isRequest(input) && input.body !== null ? clone(input) - : null - - super(inputBody, { - timeout: init.timeout || input.timeout || 0, - size: init.size || input.size || 0, - }) - - const headers = new Headers(init.headers || input.headers || {}) - - if (inputBody !== null && inputBody !== undefined && - !headers.has('Content-Type')) { - const contentType = extractContentType(inputBody) - if (contentType) { - headers.append('Content-Type', contentType) - } - } - - const signal = 'signal' in init ? init.signal - : null - - if (signal !== null && signal !== undefined && !isAbortSignal(signal)) { - throw new TypeError('Expected signal must be an instanceof AbortSignal') - } - - // TLS specific options that are handled by node - const { - ca, - cert, - ciphers, - clientCertEngine, - crl, - dhparam, - ecdhCurve, - family, - honorCipherOrder, - key, - passphrase, - pfx, - rejectUnauthorized = process.env.NODE_TLS_REJECT_UNAUTHORIZED !== '0', - secureOptions, - secureProtocol, - servername, - sessionIdContext, - } = init - - this[INTERNALS] = { - method, - redirect: init.redirect || input.redirect || 'follow', - headers, - parsedURL, - signal, - ca, - cert, - ciphers, - clientCertEngine, - crl, - dhparam, - ecdhCurve, - family, - honorCipherOrder, - key, - passphrase, - pfx, - rejectUnauthorized, - secureOptions, - secureProtocol, - servername, - sessionIdContext, - } - - // node-fetch-only options - this.follow = init.follow !== undefined ? init.follow - : input.follow !== undefined ? input.follow - : 20 - this.compress = init.compress !== undefined ? init.compress - : input.compress !== undefined ? input.compress - : true - this.counter = init.counter || input.counter || 0 - this.agent = init.agent || input.agent - } - - get method () { - return this[INTERNALS].method - } - - get url () { - return this[INTERNALS].parsedURL.toString() - } - - get headers () { - return this[INTERNALS].headers - } - - get redirect () { - return this[INTERNALS].redirect - } - - get signal () { - return this[INTERNALS].signal - } - - clone () { - return new Request(this) - } - - get [Symbol.toStringTag] () { - return 'Request' - } - - static getNodeRequestOptions (request) { - const parsedURL = request[INTERNALS].parsedURL - const headers = new Headers(request[INTERNALS].headers) - - // fetch step 1.3 - if (!headers.has('Accept')) { - headers.set('Accept', '*/*') - } - - // Basic fetch - if (!/^https?:$/.test(parsedURL.protocol)) { - throw new TypeError('Only HTTP(S) protocols are supported') - } - - if (request.signal && - Minipass.isStream(request.body) && - typeof request.body.destroy !== 'function') { - throw new Error( - 'Cancellation of streamed requests with AbortSignal is not supported') - } - - // HTTP-network-or-cache fetch steps 2.4-2.7 - const contentLengthValue = - (request.body === null || request.body === undefined) && - /^(POST|PUT)$/i.test(request.method) ? '0' - : request.body !== null && request.body !== undefined - ? getTotalBytes(request) - : null - - if (contentLengthValue) { - headers.set('Content-Length', contentLengthValue + '') - } - - // HTTP-network-or-cache fetch step 2.11 - if (!headers.has('User-Agent')) { - headers.set('User-Agent', defaultUserAgent) - } - - // HTTP-network-or-cache fetch step 2.15 - if (request.compress && !headers.has('Accept-Encoding')) { - headers.set('Accept-Encoding', 'gzip,deflate') - } - - const agent = typeof request.agent === 'function' - ? request.agent(parsedURL) - : request.agent - - if (!headers.has('Connection') && !agent) { - headers.set('Connection', 'close') - } - - // TLS specific options that are handled by node - const { - ca, - cert, - ciphers, - clientCertEngine, - crl, - dhparam, - ecdhCurve, - family, - honorCipherOrder, - key, - passphrase, - pfx, - rejectUnauthorized, - secureOptions, - secureProtocol, - servername, - sessionIdContext, - } = request[INTERNALS] - - // HTTP-network fetch step 4.2 - // chunked encoding is handled by Node.js - - // we cannot spread parsedURL directly, so we have to read each property one-by-one - // and map them to the equivalent https?.request() method options - const urlProps = { - auth: parsedURL.username || parsedURL.password - ? `${parsedURL.username}:${parsedURL.password}` - : '', - host: parsedURL.host, - hostname: parsedURL.hostname, - path: `${parsedURL.pathname}${parsedURL.search}`, - port: parsedURL.port, - protocol: parsedURL.protocol, - } - - return { - ...urlProps, - method: request.method, - headers: exportNodeCompatibleHeaders(headers), - agent, - ca, - cert, - ciphers, - clientCertEngine, - crl, - dhparam, - ecdhCurve, - family, - honorCipherOrder, - key, - passphrase, - pfx, - rejectUnauthorized, - secureOptions, - secureProtocol, - servername, - sessionIdContext, - timeout: request.timeout, - } - } -} - -module.exports = Request - -Object.defineProperties(Request.prototype, { - method: { enumerable: true }, - url: { enumerable: true }, - headers: { enumerable: true }, - redirect: { enumerable: true }, - clone: { enumerable: true }, - signal: { enumerable: true }, -}) diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/minipass-fetch/lib/response.js b/deps/npm/node_modules/@sigstore/sign/node_modules/minipass-fetch/lib/response.js deleted file mode 100644 index 54cb52db3594a7..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/minipass-fetch/lib/response.js +++ /dev/null @@ -1,90 +0,0 @@ -'use strict' -const http = require('http') -const { STATUS_CODES } = http - -const Headers = require('./headers.js') -const Body = require('./body.js') -const { clone, extractContentType } = Body - -const INTERNALS = Symbol('Response internals') - -class Response extends Body { - constructor (body = null, opts = {}) { - super(body, opts) - - const status = opts.status || 200 - const headers = new Headers(opts.headers) - - if (body !== null && body !== undefined && !headers.has('Content-Type')) { - const contentType = extractContentType(body) - if (contentType) { - headers.append('Content-Type', contentType) - } - } - - this[INTERNALS] = { - url: opts.url, - status, - statusText: opts.statusText || STATUS_CODES[status], - headers, - counter: opts.counter, - trailer: Promise.resolve(opts.trailer || new Headers()), - } - } - - get trailer () { - return this[INTERNALS].trailer - } - - get url () { - return this[INTERNALS].url || '' - } - - get status () { - return this[INTERNALS].status - } - - get ok () { - return this[INTERNALS].status >= 200 && this[INTERNALS].status < 300 - } - - get redirected () { - return this[INTERNALS].counter > 0 - } - - get statusText () { - return this[INTERNALS].statusText - } - - get headers () { - return this[INTERNALS].headers - } - - clone () { - return new Response(clone(this), { - url: this.url, - status: this.status, - statusText: this.statusText, - headers: this.headers, - ok: this.ok, - redirected: this.redirected, - trailer: this.trailer, - }) - } - - get [Symbol.toStringTag] () { - return 'Response' - } -} - -module.exports = Response - -Object.defineProperties(Response.prototype, { - url: { enumerable: true }, - status: { enumerable: true }, - ok: { enumerable: true }, - redirected: { enumerable: true }, - statusText: { enumerable: true }, - headers: { enumerable: true }, - clone: { enumerable: true }, -}) diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/minipass-fetch/package.json b/deps/npm/node_modules/@sigstore/sign/node_modules/minipass-fetch/package.json deleted file mode 100644 index d491a7fba126d0..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/minipass-fetch/package.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "name": "minipass-fetch", - "version": "3.0.5", - "description": "An implementation of window.fetch in Node.js using Minipass streams", - "license": "MIT", - "main": "lib/index.js", - "scripts": { - "test:tls-fixtures": "./test/fixtures/tls/setup.sh", - "test": "tap", - "snap": "tap", - "lint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"", - "postlint": "template-oss-check", - "lintfix": "npm run lint -- --fix", - "posttest": "npm run lint", - "template-oss-apply": "template-oss-apply --force" - }, - "tap": { - "coverage-map": "map.js", - "check-coverage": true, - "nyc-arg": [ - "--exclude", - "tap-snapshots/**" - ] - }, - "devDependencies": { - "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.22.0", - "@ungap/url-search-params": "^0.2.2", - "abort-controller": "^3.0.0", - "abortcontroller-polyfill": "~1.7.3", - "encoding": "^0.1.13", - "form-data": "^4.0.0", - "nock": "^13.2.4", - "parted": "^0.1.1", - "string-to-arraybuffer": "^1.0.2", - "tap": "^16.0.0" - }, - "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/npm/minipass-fetch.git" - }, - "keywords": [ - "fetch", - "minipass", - "node-fetch", - "window.fetch" - ], - "files": [ - "bin/", - "lib/" - ], - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "author": "GitHub Inc.", - "templateOSS": { - "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.22.0", - "publish": "true" - } -} diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/proc-log/LICENSE b/deps/npm/node_modules/@sigstore/sign/node_modules/proc-log/LICENSE deleted file mode 100644 index 83837797202b70..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/proc-log/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) GitHub, Inc. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/proc-log/lib/index.js b/deps/npm/node_modules/@sigstore/sign/node_modules/proc-log/lib/index.js deleted file mode 100644 index 86d90861078dab..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/proc-log/lib/index.js +++ /dev/null @@ -1,153 +0,0 @@ -const META = Symbol('proc-log.meta') -module.exports = { - META: META, - output: { - LEVELS: [ - 'standard', - 'error', - 'buffer', - 'flush', - ], - KEYS: { - standard: 'standard', - error: 'error', - buffer: 'buffer', - flush: 'flush', - }, - standard: function (...args) { - return process.emit('output', 'standard', ...args) - }, - error: function (...args) { - return process.emit('output', 'error', ...args) - }, - buffer: function (...args) { - return process.emit('output', 'buffer', ...args) - }, - flush: function (...args) { - return process.emit('output', 'flush', ...args) - }, - }, - log: { - LEVELS: [ - 'notice', - 'error', - 'warn', - 'info', - 'verbose', - 'http', - 'silly', - 'timing', - 'pause', - 'resume', - ], - KEYS: { - notice: 'notice', - error: 'error', - warn: 'warn', - info: 'info', - verbose: 'verbose', - http: 'http', - silly: 'silly', - timing: 'timing', - pause: 'pause', - resume: 'resume', - }, - error: function (...args) { - return process.emit('log', 'error', ...args) - }, - notice: function (...args) { - return process.emit('log', 'notice', ...args) - }, - warn: function (...args) { - return process.emit('log', 'warn', ...args) - }, - info: function (...args) { - return process.emit('log', 'info', ...args) - }, - verbose: function (...args) { - return process.emit('log', 'verbose', ...args) - }, - http: function (...args) { - return process.emit('log', 'http', ...args) - }, - silly: function (...args) { - return process.emit('log', 'silly', ...args) - }, - timing: function (...args) { - return process.emit('log', 'timing', ...args) - }, - pause: function () { - return process.emit('log', 'pause') - }, - resume: function () { - return process.emit('log', 'resume') - }, - }, - time: { - LEVELS: [ - 'start', - 'end', - ], - KEYS: { - start: 'start', - end: 'end', - }, - start: function (name, fn) { - process.emit('time', 'start', name) - function end () { - return process.emit('time', 'end', name) - } - if (typeof fn === 'function') { - const res = fn() - if (res && res.finally) { - return res.finally(end) - } - end() - return res - } - return end - }, - end: function (name) { - return process.emit('time', 'end', name) - }, - }, - input: { - LEVELS: [ - 'start', - 'end', - 'read', - ], - KEYS: { - start: 'start', - end: 'end', - read: 'read', - }, - start: function (fn) { - process.emit('input', 'start') - function end () { - return process.emit('input', 'end') - } - if (typeof fn === 'function') { - const res = fn() - if (res && res.finally) { - return res.finally(end) - } - end() - return res - } - return end - }, - end: function () { - return process.emit('input', 'end') - }, - read: function (...args) { - let resolve, reject - const promise = new Promise((_resolve, _reject) => { - resolve = _resolve - reject = _reject - }) - process.emit('input', 'read', resolve, reject, ...args) - return promise - }, - }, -} diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/proc-log/package.json b/deps/npm/node_modules/@sigstore/sign/node_modules/proc-log/package.json deleted file mode 100644 index 4ab89102ecc9b5..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/proc-log/package.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "name": "proc-log", - "version": "4.2.0", - "files": [ - "bin/", - "lib/" - ], - "main": "lib/index.js", - "description": "just emit 'log' events on the process object", - "repository": { - "type": "git", - "url": "https://github.com/npm/proc-log.git" - }, - "author": "GitHub Inc.", - "license": "ISC", - "scripts": { - "test": "tap", - "snap": "tap", - "posttest": "npm run lint", - "postsnap": "eslint index.js test/*.js --fix", - "lint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"", - "postlint": "template-oss-check", - "lintfix": "npm run lint -- --fix", - "template-oss-apply": "template-oss-apply --force" - }, - "devDependencies": { - "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.21.3", - "tap": "^16.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "templateOSS": { - "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.21.3", - "publish": true - }, - "tap": { - "nyc-arg": [ - "--exclude", - "tap-snapshots/**" - ] - } -} diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/ssri/LICENSE.md b/deps/npm/node_modules/@sigstore/sign/node_modules/ssri/LICENSE.md deleted file mode 100644 index e335388869f50f..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/ssri/LICENSE.md +++ /dev/null @@ -1,16 +0,0 @@ -ISC License - -Copyright 2021 (c) npm, Inc. - -Permission to use, copy, modify, and/or distribute this software for -any purpose with or without fee is hereby granted, provided that the -above copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE COPYRIGHT HOLDER DISCLAIMS -ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR -CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE -OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE -USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/ssri/lib/index.js b/deps/npm/node_modules/@sigstore/sign/node_modules/ssri/lib/index.js deleted file mode 100644 index 7d749ed480fb98..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/ssri/lib/index.js +++ /dev/null @@ -1,580 +0,0 @@ -'use strict' - -const crypto = require('crypto') -const { Minipass } = require('minipass') - -const SPEC_ALGORITHMS = ['sha512', 'sha384', 'sha256'] -const DEFAULT_ALGORITHMS = ['sha512'] - -// TODO: this should really be a hardcoded list of algorithms we support, -// rather than [a-z0-9]. -const BASE64_REGEX = /^[a-z0-9+/]+(?:=?=?)$/i -const SRI_REGEX = /^([a-z0-9]+)-([^?]+)([?\S*]*)$/ -const STRICT_SRI_REGEX = /^([a-z0-9]+)-([A-Za-z0-9+/=]{44,88})(\?[\x21-\x7E]*)?$/ -const VCHAR_REGEX = /^[\x21-\x7E]+$/ - -const getOptString = options => options?.length ? `?${options.join('?')}` : '' - -class IntegrityStream extends Minipass { - #emittedIntegrity - #emittedSize - #emittedVerified - - constructor (opts) { - super() - this.size = 0 - this.opts = opts - - // may be overridden later, but set now for class consistency - this.#getOptions() - - // options used for calculating stream. can't be changed. - if (opts?.algorithms) { - this.algorithms = [...opts.algorithms] - } else { - this.algorithms = [...DEFAULT_ALGORITHMS] - } - if (this.algorithm !== null && !this.algorithms.includes(this.algorithm)) { - this.algorithms.push(this.algorithm) - } - - this.hashes = this.algorithms.map(crypto.createHash) - } - - #getOptions () { - // For verification - this.sri = this.opts?.integrity ? parse(this.opts?.integrity, this.opts) : null - this.expectedSize = this.opts?.size - - if (!this.sri) { - this.algorithm = null - } else if (this.sri.isHash) { - this.goodSri = true - this.algorithm = this.sri.algorithm - } else { - this.goodSri = !this.sri.isEmpty() - this.algorithm = this.sri.pickAlgorithm(this.opts) - } - - this.digests = this.goodSri ? this.sri[this.algorithm] : null - this.optString = getOptString(this.opts?.options) - } - - on (ev, handler) { - if (ev === 'size' && this.#emittedSize) { - return handler(this.#emittedSize) - } - - if (ev === 'integrity' && this.#emittedIntegrity) { - return handler(this.#emittedIntegrity) - } - - if (ev === 'verified' && this.#emittedVerified) { - return handler(this.#emittedVerified) - } - - return super.on(ev, handler) - } - - emit (ev, data) { - if (ev === 'end') { - this.#onEnd() - } - return super.emit(ev, data) - } - - write (data) { - this.size += data.length - this.hashes.forEach(h => h.update(data)) - return super.write(data) - } - - #onEnd () { - if (!this.goodSri) { - this.#getOptions() - } - const newSri = parse(this.hashes.map((h, i) => { - return `${this.algorithms[i]}-${h.digest('base64')}${this.optString}` - }).join(' '), this.opts) - // Integrity verification mode - const match = this.goodSri && newSri.match(this.sri, this.opts) - if (typeof this.expectedSize === 'number' && this.size !== this.expectedSize) { - /* eslint-disable-next-line max-len */ - const err = new Error(`stream size mismatch when checking ${this.sri}.\n Wanted: ${this.expectedSize}\n Found: ${this.size}`) - err.code = 'EBADSIZE' - err.found = this.size - err.expected = this.expectedSize - err.sri = this.sri - this.emit('error', err) - } else if (this.sri && !match) { - /* eslint-disable-next-line max-len */ - const err = new Error(`${this.sri} integrity checksum failed when using ${this.algorithm}: wanted ${this.digests} but got ${newSri}. (${this.size} bytes)`) - err.code = 'EINTEGRITY' - err.found = newSri - err.expected = this.digests - err.algorithm = this.algorithm - err.sri = this.sri - this.emit('error', err) - } else { - this.#emittedSize = this.size - this.emit('size', this.size) - this.#emittedIntegrity = newSri - this.emit('integrity', newSri) - if (match) { - this.#emittedVerified = match - this.emit('verified', match) - } - } - } -} - -class Hash { - get isHash () { - return true - } - - constructor (hash, opts) { - const strict = opts?.strict - this.source = hash.trim() - - // set default values so that we make V8 happy to - // always see a familiar object template. - this.digest = '' - this.algorithm = '' - this.options = [] - - // 3.1. Integrity metadata (called "Hash" by ssri) - // https://w3c.github.io/webappsec-subresource-integrity/#integrity-metadata-description - const match = this.source.match( - strict - ? STRICT_SRI_REGEX - : SRI_REGEX - ) - if (!match) { - return - } - if (strict && !SPEC_ALGORITHMS.includes(match[1])) { - return - } - this.algorithm = match[1] - this.digest = match[2] - - const rawOpts = match[3] - if (rawOpts) { - this.options = rawOpts.slice(1).split('?') - } - } - - hexDigest () { - return this.digest && Buffer.from(this.digest, 'base64').toString('hex') - } - - toJSON () { - return this.toString() - } - - match (integrity, opts) { - const other = parse(integrity, opts) - if (!other) { - return false - } - if (other.isIntegrity) { - const algo = other.pickAlgorithm(opts, [this.algorithm]) - - if (!algo) { - return false - } - - const foundHash = other[algo].find(hash => hash.digest === this.digest) - - if (foundHash) { - return foundHash - } - - return false - } - return other.digest === this.digest ? other : false - } - - toString (opts) { - if (opts?.strict) { - // Strict mode enforces the standard as close to the foot of the - // letter as it can. - if (!( - // The spec has very restricted productions for algorithms. - // https://www.w3.org/TR/CSP2/#source-list-syntax - SPEC_ALGORITHMS.includes(this.algorithm) && - // Usually, if someone insists on using a "different" base64, we - // leave it as-is, since there's multiple standards, and the - // specified is not a URL-safe variant. - // https://www.w3.org/TR/CSP2/#base64_value - this.digest.match(BASE64_REGEX) && - // Option syntax is strictly visual chars. - // https://w3c.github.io/webappsec-subresource-integrity/#grammardef-option-expression - // https://tools.ietf.org/html/rfc5234#appendix-B.1 - this.options.every(opt => opt.match(VCHAR_REGEX)) - )) { - return '' - } - } - return `${this.algorithm}-${this.digest}${getOptString(this.options)}` - } -} - -function integrityHashToString (toString, sep, opts, hashes) { - const toStringIsNotEmpty = toString !== '' - - let shouldAddFirstSep = false - let complement = '' - - const lastIndex = hashes.length - 1 - - for (let i = 0; i < lastIndex; i++) { - const hashString = Hash.prototype.toString.call(hashes[i], opts) - - if (hashString) { - shouldAddFirstSep = true - - complement += hashString - complement += sep - } - } - - const finalHashString = Hash.prototype.toString.call(hashes[lastIndex], opts) - - if (finalHashString) { - shouldAddFirstSep = true - complement += finalHashString - } - - if (toStringIsNotEmpty && shouldAddFirstSep) { - return toString + sep + complement - } - - return toString + complement -} - -class Integrity { - get isIntegrity () { - return true - } - - toJSON () { - return this.toString() - } - - isEmpty () { - return Object.keys(this).length === 0 - } - - toString (opts) { - let sep = opts?.sep || ' ' - let toString = '' - - if (opts?.strict) { - // Entries must be separated by whitespace, according to spec. - sep = sep.replace(/\S+/g, ' ') - - for (const hash of SPEC_ALGORITHMS) { - if (this[hash]) { - toString = integrityHashToString(toString, sep, opts, this[hash]) - } - } - } else { - for (const hash of Object.keys(this)) { - toString = integrityHashToString(toString, sep, opts, this[hash]) - } - } - - return toString - } - - concat (integrity, opts) { - const other = typeof integrity === 'string' - ? integrity - : stringify(integrity, opts) - return parse(`${this.toString(opts)} ${other}`, opts) - } - - hexDigest () { - return parse(this, { single: true }).hexDigest() - } - - // add additional hashes to an integrity value, but prevent - // *changing* an existing integrity hash. - merge (integrity, opts) { - const other = parse(integrity, opts) - for (const algo in other) { - if (this[algo]) { - if (!this[algo].find(hash => - other[algo].find(otherhash => - hash.digest === otherhash.digest))) { - throw new Error('hashes do not match, cannot update integrity') - } - } else { - this[algo] = other[algo] - } - } - } - - match (integrity, opts) { - const other = parse(integrity, opts) - if (!other) { - return false - } - const algo = other.pickAlgorithm(opts, Object.keys(this)) - return ( - !!algo && - this[algo] && - other[algo] && - this[algo].find(hash => - other[algo].find(otherhash => - hash.digest === otherhash.digest - ) - ) - ) || false - } - - // Pick the highest priority algorithm present, optionally also limited to a - // set of hashes found in another integrity. When limiting it may return - // nothing. - pickAlgorithm (opts, hashes) { - const pickAlgorithm = opts?.pickAlgorithm || getPrioritizedHash - const keys = Object.keys(this).filter(k => { - if (hashes?.length) { - return hashes.includes(k) - } - return true - }) - if (keys.length) { - return keys.reduce((acc, algo) => pickAlgorithm(acc, algo) || acc) - } - // no intersection between this and hashes, - return null - } -} - -module.exports.parse = parse -function parse (sri, opts) { - if (!sri) { - return null - } - if (typeof sri === 'string') { - return _parse(sri, opts) - } else if (sri.algorithm && sri.digest) { - const fullSri = new Integrity() - fullSri[sri.algorithm] = [sri] - return _parse(stringify(fullSri, opts), opts) - } else { - return _parse(stringify(sri, opts), opts) - } -} - -function _parse (integrity, opts) { - // 3.4.3. Parse metadata - // https://w3c.github.io/webappsec-subresource-integrity/#parse-metadata - if (opts?.single) { - return new Hash(integrity, opts) - } - const hashes = integrity.trim().split(/\s+/).reduce((acc, string) => { - const hash = new Hash(string, opts) - if (hash.algorithm && hash.digest) { - const algo = hash.algorithm - if (!acc[algo]) { - acc[algo] = [] - } - acc[algo].push(hash) - } - return acc - }, new Integrity()) - return hashes.isEmpty() ? null : hashes -} - -module.exports.stringify = stringify -function stringify (obj, opts) { - if (obj.algorithm && obj.digest) { - return Hash.prototype.toString.call(obj, opts) - } else if (typeof obj === 'string') { - return stringify(parse(obj, opts), opts) - } else { - return Integrity.prototype.toString.call(obj, opts) - } -} - -module.exports.fromHex = fromHex -function fromHex (hexDigest, algorithm, opts) { - const optString = getOptString(opts?.options) - return parse( - `${algorithm}-${ - Buffer.from(hexDigest, 'hex').toString('base64') - }${optString}`, opts - ) -} - -module.exports.fromData = fromData -function fromData (data, opts) { - const algorithms = opts?.algorithms || [...DEFAULT_ALGORITHMS] - const optString = getOptString(opts?.options) - return algorithms.reduce((acc, algo) => { - const digest = crypto.createHash(algo).update(data).digest('base64') - const hash = new Hash( - `${algo}-${digest}${optString}`, - opts - ) - /* istanbul ignore else - it would be VERY strange if the string we - * just calculated with an algo did not have an algo or digest. - */ - if (hash.algorithm && hash.digest) { - const hashAlgo = hash.algorithm - if (!acc[hashAlgo]) { - acc[hashAlgo] = [] - } - acc[hashAlgo].push(hash) - } - return acc - }, new Integrity()) -} - -module.exports.fromStream = fromStream -function fromStream (stream, opts) { - const istream = integrityStream(opts) - return new Promise((resolve, reject) => { - stream.pipe(istream) - stream.on('error', reject) - istream.on('error', reject) - let sri - istream.on('integrity', s => { - sri = s - }) - istream.on('end', () => resolve(sri)) - istream.resume() - }) -} - -module.exports.checkData = checkData -function checkData (data, sri, opts) { - sri = parse(sri, opts) - if (!sri || !Object.keys(sri).length) { - if (opts?.error) { - throw Object.assign( - new Error('No valid integrity hashes to check against'), { - code: 'EINTEGRITY', - } - ) - } else { - return false - } - } - const algorithm = sri.pickAlgorithm(opts) - const digest = crypto.createHash(algorithm).update(data).digest('base64') - const newSri = parse({ algorithm, digest }) - const match = newSri.match(sri, opts) - opts = opts || {} - if (match || !(opts.error)) { - return match - } else if (typeof opts.size === 'number' && (data.length !== opts.size)) { - /* eslint-disable-next-line max-len */ - const err = new Error(`data size mismatch when checking ${sri}.\n Wanted: ${opts.size}\n Found: ${data.length}`) - err.code = 'EBADSIZE' - err.found = data.length - err.expected = opts.size - err.sri = sri - throw err - } else { - /* eslint-disable-next-line max-len */ - const err = new Error(`Integrity checksum failed when using ${algorithm}: Wanted ${sri}, but got ${newSri}. (${data.length} bytes)`) - err.code = 'EINTEGRITY' - err.found = newSri - err.expected = sri - err.algorithm = algorithm - err.sri = sri - throw err - } -} - -module.exports.checkStream = checkStream -function checkStream (stream, sri, opts) { - opts = opts || Object.create(null) - opts.integrity = sri - sri = parse(sri, opts) - if (!sri || !Object.keys(sri).length) { - return Promise.reject(Object.assign( - new Error('No valid integrity hashes to check against'), { - code: 'EINTEGRITY', - } - )) - } - const checker = integrityStream(opts) - return new Promise((resolve, reject) => { - stream.pipe(checker) - stream.on('error', reject) - checker.on('error', reject) - let verified - checker.on('verified', s => { - verified = s - }) - checker.on('end', () => resolve(verified)) - checker.resume() - }) -} - -module.exports.integrityStream = integrityStream -function integrityStream (opts = Object.create(null)) { - return new IntegrityStream(opts) -} - -module.exports.create = createIntegrity -function createIntegrity (opts) { - const algorithms = opts?.algorithms || [...DEFAULT_ALGORITHMS] - const optString = getOptString(opts?.options) - - const hashes = algorithms.map(crypto.createHash) - - return { - update: function (chunk, enc) { - hashes.forEach(h => h.update(chunk, enc)) - return this - }, - digest: function () { - const integrity = algorithms.reduce((acc, algo) => { - const digest = hashes.shift().digest('base64') - const hash = new Hash( - `${algo}-${digest}${optString}`, - opts - ) - /* istanbul ignore else - it would be VERY strange if the hash we - * just calculated with an algo did not have an algo or digest. - */ - if (hash.algorithm && hash.digest) { - const hashAlgo = hash.algorithm - if (!acc[hashAlgo]) { - acc[hashAlgo] = [] - } - acc[hashAlgo].push(hash) - } - return acc - }, new Integrity()) - - return integrity - }, - } -} - -const NODE_HASHES = crypto.getHashes() - -// This is a Best Effort™ at a reasonable priority for hash algos -const DEFAULT_PRIORITY = [ - 'md5', 'whirlpool', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512', - // TODO - it's unclear _which_ of these Node will actually use as its name - // for the algorithm, so we guesswork it based on the OpenSSL names. - 'sha3', - 'sha3-256', 'sha3-384', 'sha3-512', - 'sha3_256', 'sha3_384', 'sha3_512', -].filter(algo => NODE_HASHES.includes(algo)) - -function getPrioritizedHash (algo1, algo2) { - /* eslint-disable-next-line max-len */ - return DEFAULT_PRIORITY.indexOf(algo1.toLowerCase()) >= DEFAULT_PRIORITY.indexOf(algo2.toLowerCase()) - ? algo1 - : algo2 -} diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/ssri/package.json b/deps/npm/node_modules/@sigstore/sign/node_modules/ssri/package.json deleted file mode 100644 index 28395414e4643c..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/ssri/package.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "name": "ssri", - "version": "10.0.6", - "description": "Standard Subresource Integrity library -- parses, serializes, generates, and verifies integrity metadata according to the SRI spec.", - "main": "lib/index.js", - "files": [ - "bin/", - "lib/" - ], - "scripts": { - "prerelease": "npm t", - "postrelease": "npm publish", - "posttest": "npm run lint", - "test": "tap", - "coverage": "tap", - "lint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"", - "postlint": "template-oss-check", - "template-oss-apply": "template-oss-apply --force", - "lintfix": "npm run lint -- --fix", - "snap": "tap" - }, - "tap": { - "check-coverage": true, - "nyc-arg": [ - "--exclude", - "tap-snapshots/**" - ] - }, - "repository": { - "type": "git", - "url": "git+https://github.com/npm/ssri.git" - }, - "keywords": [ - "w3c", - "web", - "security", - "integrity", - "checksum", - "hashing", - "subresource integrity", - "sri", - "sri hash", - "sri string", - "sri generator", - "html" - ], - "author": "GitHub Inc.", - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "devDependencies": { - "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.22.0", - "tap": "^16.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "templateOSS": { - "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.22.0", - "publish": "true" - } -} diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/unique-filename/LICENSE b/deps/npm/node_modules/@sigstore/sign/node_modules/unique-filename/LICENSE deleted file mode 100644 index 69619c125ea7ef..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/unique-filename/LICENSE +++ /dev/null @@ -1,5 +0,0 @@ -Copyright npm, Inc - -Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/unique-filename/lib/index.js b/deps/npm/node_modules/@sigstore/sign/node_modules/unique-filename/lib/index.js deleted file mode 100644 index d067d2e709809a..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/unique-filename/lib/index.js +++ /dev/null @@ -1,7 +0,0 @@ -var path = require('path') - -var uniqueSlug = require('unique-slug') - -module.exports = function (filepath, prefix, uniq) { - return path.join(filepath, (prefix ? prefix + '-' : '') + uniqueSlug(uniq)) -} diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/unique-filename/package.json b/deps/npm/node_modules/@sigstore/sign/node_modules/unique-filename/package.json deleted file mode 100644 index b2fbf0666489a6..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/unique-filename/package.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "name": "unique-filename", - "version": "3.0.0", - "description": "Generate a unique filename for use in temporary directories or caches.", - "main": "lib/index.js", - "scripts": { - "test": "tap", - "lint": "eslint \"**/*.js\"", - "postlint": "template-oss-check", - "template-oss-apply": "template-oss-apply --force", - "lintfix": "npm run lint -- --fix", - "snap": "tap", - "posttest": "npm run lint" - }, - "repository": { - "type": "git", - "url": "https://github.com/npm/unique-filename.git" - }, - "keywords": [], - "author": "GitHub Inc.", - "license": "ISC", - "bugs": { - "url": "https://github.com/iarna/unique-filename/issues" - }, - "homepage": "https://github.com/iarna/unique-filename", - "devDependencies": { - "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.5.1", - "tap": "^16.3.0" - }, - "dependencies": { - "unique-slug": "^4.0.0" - }, - "files": [ - "bin/", - "lib/" - ], - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "templateOSS": { - "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.5.1" - }, - "tap": { - "nyc-arg": [ - "--exclude", - "tap-snapshots/**" - ] - } -} diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/unique-slug/LICENSE b/deps/npm/node_modules/@sigstore/sign/node_modules/unique-slug/LICENSE deleted file mode 100644 index 7953647e7760b8..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/unique-slug/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright npm, Inc - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/unique-slug/lib/index.js b/deps/npm/node_modules/@sigstore/sign/node_modules/unique-slug/lib/index.js deleted file mode 100644 index 1bac84d95d7307..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/unique-slug/lib/index.js +++ /dev/null @@ -1,11 +0,0 @@ -'use strict' -var MurmurHash3 = require('imurmurhash') - -module.exports = function (uniq) { - if (uniq) { - var hash = new MurmurHash3(uniq) - return ('00000000' + hash.result().toString(16)).slice(-8) - } else { - return (Math.random().toString(16) + '0000000').slice(2, 10) - } -} diff --git a/deps/npm/node_modules/@sigstore/sign/node_modules/unique-slug/package.json b/deps/npm/node_modules/@sigstore/sign/node_modules/unique-slug/package.json deleted file mode 100644 index 33732cdbb42859..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/node_modules/unique-slug/package.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "name": "unique-slug", - "version": "4.0.0", - "description": "Generate a unique character string suitible for use in files and URLs.", - "main": "lib/index.js", - "scripts": { - "test": "tap", - "lint": "eslint \"**/*.js\"", - "postlint": "template-oss-check", - "template-oss-apply": "template-oss-apply --force", - "lintfix": "npm run lint -- --fix", - "snap": "tap", - "posttest": "npm run lint" - }, - "keywords": [], - "author": "GitHub Inc.", - "license": "ISC", - "devDependencies": { - "@npmcli/eslint-config": "^3.1.0", - "@npmcli/template-oss": "4.5.1", - "tap": "^16.3.0" - }, - "repository": { - "type": "git", - "url": "https://github.com/npm/unique-slug.git" - }, - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "files": [ - "bin/", - "lib/" - ], - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "templateOSS": { - "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.5.1" - }, - "tap": { - "nyc-arg": [ - "--exclude", - "tap-snapshots/**" - ] - } -} diff --git a/deps/npm/node_modules/@sigstore/sign/package.json b/deps/npm/node_modules/@sigstore/sign/package.json deleted file mode 100644 index 4adb3d24c6fa68..00000000000000 --- a/deps/npm/node_modules/@sigstore/sign/package.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "name": "@sigstore/sign", - "version": "2.3.2", - "description": "Sigstore signing library", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "scripts": { - "clean": "shx rm -rf dist *.tsbuildinfo", - "build": "tsc --build", - "test": "jest" - }, - "files": [ - "dist" - ], - "author": "bdehamer@github.com", - "license": "Apache-2.0", - "repository": { - "type": "git", - "url": "git+https://github.com/sigstore/sigstore-js.git" - }, - "bugs": { - "url": "https://github.com/sigstore/sigstore-js/issues" - }, - "homepage": "https://github.com/sigstore/sigstore-js/tree/main/packages/sign#readme", - "publishConfig": { - "provenance": true - }, - "devDependencies": { - "@sigstore/jest": "^0.0.0", - "@sigstore/mock": "^0.7.4", - "@sigstore/rekor-types": "^2.0.0", - "@types/make-fetch-happen": "^10.0.4", - "@types/promise-retry": "^1.1.6" - }, - "dependencies": { - "@sigstore/bundle": "^2.3.2", - "@sigstore/core": "^1.0.0", - "@sigstore/protobuf-specs": "^0.3.2", - "make-fetch-happen": "^13.0.1", - "proc-log": "^4.2.0", - "promise-retry": "^2.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } -} diff --git a/deps/npm/node_modules/@sigstore/tuf/dist/appdata.js b/deps/npm/node_modules/@sigstore/tuf/dist/appdata.js index c9a8ee92b531eb..06a8143e70da2f 100644 --- a/deps/npm/node_modules/@sigstore/tuf/dist/appdata.js +++ b/deps/npm/node_modules/@sigstore/tuf/dist/appdata.js @@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.appDataPath = void 0; +exports.appDataPath = appDataPath; /* Copyright 2023 The Sigstore Authors. @@ -41,4 +41,3 @@ function appDataPath(name) { } } } -exports.appDataPath = appDataPath; diff --git a/deps/npm/node_modules/@sigstore/tuf/dist/client.js b/deps/npm/node_modules/@sigstore/tuf/dist/client.js index 2019c1fd30f886..328f49e40dbbd7 100644 --- a/deps/npm/node_modules/@sigstore/tuf/dist/client.js +++ b/deps/npm/node_modules/@sigstore/tuf/dist/client.js @@ -79,7 +79,6 @@ function seedCache({ cachePath, mirrorURL, tufRootPath, forceInit, }) { fs_1.default.copyFileSync(tufRootPath, cachedRootPath); } else { - /* eslint-disable @typescript-eslint/no-var-requires */ const seeds = require('../seeds.json'); const repoSeed = seeds[mirrorURL]; if (!repoSeed) { diff --git a/deps/npm/node_modules/@sigstore/tuf/dist/index.js b/deps/npm/node_modules/@sigstore/tuf/dist/index.js index 678c81d45d21ed..2af5de93ec5d2f 100644 --- a/deps/npm/node_modules/@sigstore/tuf/dist/index.js +++ b/deps/npm/node_modules/@sigstore/tuf/dist/index.js @@ -1,6 +1,8 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.TUFError = exports.initTUF = exports.getTrustedRoot = exports.DEFAULT_MIRROR_URL = void 0; +exports.TUFError = exports.DEFAULT_MIRROR_URL = void 0; +exports.getTrustedRoot = getTrustedRoot; +exports.initTUF = initTUF; /* Copyright 2023 The Sigstore Authors. @@ -31,14 +33,12 @@ options = {}) { const trustedRoot = await client.getTarget(TRUSTED_ROOT_TARGET); return protobuf_specs_1.TrustedRoot.fromJSON(JSON.parse(trustedRoot)); } -exports.getTrustedRoot = getTrustedRoot; async function initTUF( /* istanbul ignore next */ options = {}) { const client = createClient(options); return client.refresh().then(() => client); } -exports.initTUF = initTUF; // Create a TUF client with default options function createClient(options) { /* istanbul ignore next */ diff --git a/deps/npm/node_modules/@sigstore/tuf/dist/target.js b/deps/npm/node_modules/@sigstore/tuf/dist/target.js index 29eaf99a7e721c..5c6675bdfbf5fe 100644 --- a/deps/npm/node_modules/@sigstore/tuf/dist/target.js +++ b/deps/npm/node_modules/@sigstore/tuf/dist/target.js @@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.readTarget = void 0; +exports.readTarget = readTarget; /* Copyright 2023 The Sigstore Authors. @@ -39,7 +39,6 @@ async function readTarget(tuf, targetPath) { }); }); } -exports.readTarget = readTarget; // Returns the local path to the specified target. If the target is not yet // cached locally, the provided TUF Updater will be used to download and // cache the target. diff --git a/deps/npm/node_modules/@sigstore/tuf/package.json b/deps/npm/node_modules/@sigstore/tuf/package.json index b7fd34ac9674eb..808689dfddf92f 100644 --- a/deps/npm/node_modules/@sigstore/tuf/package.json +++ b/deps/npm/node_modules/@sigstore/tuf/package.json @@ -1,6 +1,6 @@ { "name": "@sigstore/tuf", - "version": "2.3.4", + "version": "3.0.0", "description": "Client for the Sigstore TUF repository", "main": "dist/index.js", "types": "dist/index.d.ts", @@ -28,14 +28,14 @@ }, "devDependencies": { "@sigstore/jest": "^0.0.0", - "@tufjs/repo-mock": "^2.0.1", + "@tufjs/repo-mock": "^3.0.1", "@types/make-fetch-happen": "^10.0.4" }, "dependencies": { "@sigstore/protobuf-specs": "^0.3.2", - "tuf-js": "^2.2.1" + "tuf-js": "^3.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } } diff --git a/deps/npm/node_modules/@sigstore/tuf/seeds.json b/deps/npm/node_modules/@sigstore/tuf/seeds.json index e8d97d5fa7a672..d1d3c6b5c46040 100644 --- a/deps/npm/node_modules/@sigstore/tuf/seeds.json +++ b/deps/npm/node_modules/@sigstore/tuf/seeds.json @@ -1 +1 @@ -{"https://tuf-repo-cdn.sigstore.dev":{"root.json":"ewoJInNpZ25lZCI6IHsKCQkiX3R5cGUiOiAicm9vdCIsCgkJInNwZWNfdmVyc2lvbiI6ICIxLjAiLAoJCSJ2ZXJzaW9uIjogOSwKCQkiZXhwaXJlcyI6ICIyMDI0LTA5LTEyVDA2OjUzOjEwWiIsCgkJImtleXMiOiB7CgkJCSIxZTFkNjVjZTk4YjEwYWRkYWQ0NzY0ZmViZjdkZGEyZDA0MzZiM2QzYTM4OTM1NzljMGRkZGFlYTIwZTU0ODQ5IjogewoJCQkJImtleXR5cGUiOiAiZWNkc2EiLAoJCQkJInNjaGVtZSI6ICJlY2RzYS1zaGEyLW5pc3RwMjU2IiwKCQkJCSJrZXlpZF9oYXNoX2FsZ29yaXRobXMiOiBbCgkJCQkJInNoYTI1NiIsCgkJCQkJInNoYTUxMiIKCQkJCV0sCgkJCQkia2V5dmFsIjogewoJCQkJCSJwdWJsaWMiOiAiLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRXpCelZPbUhDUG9qTVZMU0kzNjRXaWlWOE5QckRcbjZJZ1J4Vmxpc2t6L3YreTNKRVI1bWNWR2NPTmxpRGNXTUM1SjJsZkhtalBOUGhiNEg3eG04THpmU0E9PVxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tXG4iCgkJCQl9CgkJCX0sCgkJCSIyMzBlMjEyNjE2Mjc0YTQxOTVjZGMyOGU5ZmNlNzgyYzIwZTZjNzIwZjFhODExYjQwZjk4MjI4Mzc2YmRkM2FjIjogewoJCQkJImtleXR5cGUiOiAiZWNkc2EiLAoJCQkJInNjaGVtZSI6ICJlY2RzYS1zaGEyLW5pc3RwMjU2IiwKCQkJCSJrZXlpZF9oYXNoX2FsZ29yaXRobXMiOiBbCgkJCQkJInNoYTI1NiIsCgkJCQkJInNoYTUxMiIKCQkJCV0sCgkJCQkia2V5dmFsIjogewoJCQkJCSJwdWJsaWMiOiAiLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRUxyV3ZOdDk0djRSMDg1RUxlZUNNeEhwN1BsZEZcbjAvVDFHeHVrVWgyT0R1Z2dMR0pFMHBjMWU4Q1NCZjZDUzkxRndvOUZVT3VSc2pCVWxkK1ZxU3lDZFE9PVxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tXG4iCgkJCQl9CgkJCX0sCgkJCSIzYzM0NGFhMDY4ZmQ0Y2M0ZTg3ZGM1MGI2MTJjMDI0MzFmYmM3NzFlOTUwMDM5OTM2ODNhMmIwYmYyNjBjZjBlIjogewoJCQkJImtleXR5cGUiOiAiZWNkc2EiLAoJCQkJInNjaGVtZSI6ICJlY2RzYS1zaGEyLW5pc3RwMjU2IiwKCQkJCSJrZXlpZF9oYXNoX2FsZ29yaXRobXMiOiBbCgkJCQkJInNoYTI1NiIsCgkJCQkJInNoYTUxMiIKCQkJCV0sCgkJCQkia2V5dmFsIjogewoJCQkJCSJwdWJsaWMiOiAiLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRXk4WEtzbWhCWURJOEpjMEd3ekJ4ZUtheDBjbTVcblNUS0VVNjVIUEZ1blVuNDFzVDhwaTBGak00SWtIei9ZVW13bUxVTzBXdDdseGhqNkJrTElLNHFZQXc9PVxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tXG4iCgkJCQl9CgkJCX0sCgkJCSI5MjNiYjM5ZTYwZGQ2ZmEyYzMxZTZlYTU1NDczYWE5M2I2NGRkNGU1M2UxNmZiZTQyZjZhMjA3ZDNmOTdkZTJkIjogewoJCQkJImtleXR5cGUiOiAiZWNkc2EiLAoJCQkJInNjaGVtZSI6ICJlY2RzYS1zaGEyLW5pc3RwMjU2IiwKCQkJCSJrZXlpZF9oYXNoX2FsZ29yaXRobXMiOiBbCgkJCQkJInNoYTI1NiIsCgkJCQkJInNoYTUxMiIKCQkJCV0sCgkJCQkia2V5dmFsIjogewoJCQkJCSJwdWJsaWMiOiAiLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRVdSaUdyNStqKzNKNVNzSCtadHI1bkUySDJ3TzdcbkJWK25PM3M5M2dMY2ExOHFUT3pIWTFvV3lBR0R5a01Tc0dUVUJTdDlEK0FuMEtmS3NEMm1mU000MlE9PVxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tXG4iCgkJCQl9CgkJCX0sCgkJCSJlMmY1OWFjYjk0ODg1MTk0MDdlMThjYmZjOTMyOTUxMGJlMDNjMDRhY2E5OTI5ZDJmMDMwMTM0M2ZlYzg1NTIzIjogewoJCQkJImtleXR5cGUiOiAiZWNkc2EiLAoJCQkJInNjaGVtZSI6ICJlY2RzYS1zaGEyLW5pc3RwMjU2IiwKCQkJCSJrZXlpZF9oYXNoX2FsZ29yaXRobXMiOiBbCgkJCQkJInNoYTI1NiIsCgkJCQkJInNoYTUxMiIKCQkJCV0sCgkJCQkia2V5dmFsIjogewoJCQkJCSJwdWJsaWMiOiAiLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRWluaWtTc0FRbVlrTmVINWVZcS9Dbkl6TGFhY09cbnhsU2Fhd1FET3dxS3kvdENxeHE1eHhQU0pjMjFLNFdJaHM5R3lPa0tmenVlWTNHSUx6Y01KWjRjV3c9PVxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tXG4iCgkJCQl9CgkJCX0sCgkJCSJlYzgxNjY5NzM0ZTAxNzk5NmM1Yjg1ZjNkMDJjM2RlMWRkNDYzN2ExNTIwMTlmZTFhZjEyNWQyZjkzNjhiOTVlIjogewoJCQkJImtleXR5cGUiOiAiZWNkc2EiLAoJCQkJInNjaGVtZSI6ICJlY2RzYS1zaGEyLW5pc3RwMjU2IiwKCQkJCSJrZXlpZF9oYXNoX2FsZ29yaXRobXMiOiBbCgkJCQkJInNoYTI1NiIsCgkJCQkJInNoYTUxMiIKCQkJCV0sCgkJCQkia2V5dmFsIjogewoJCQkJCSJwdWJsaWMiOiAiLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRUVYc3ozU1pYRmI4ak1WNDJqNnBKbHlqYmpSOEtcbk4zQndvY2V4cTZMTUliNXFzV0tPUXZMTjE2TlVlZkxjNEhzd09vdW1Sc1ZWYWFqU3BRUzZmb2JrUnc9PVxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tXG4iCgkJCQl9CgkJCX0sCgkJCSJmZGZhODNhMDdiNWE4MzU4OWI4N2RlZDQxZjc3ZjM5ZDIzMmFkOTFmN2NjZTUyODY4ZGFjZDA2YmEwODk4NDlmIjogewoJCQkJImtleXR5cGUiOiAiZWNkc2EiLAoJCQkJInNjaGVtZSI6ICJlY2RzYS1zaGEyLW5pc3RwMjU2IiwKCQkJCSJrZXlpZF9oYXNoX2FsZ29yaXRobXMiOiBbCgkJCQkJInNoYTI1NiIsCgkJCQkJInNoYTUxMiIKCQkJCV0sCgkJCQkia2V5dmFsIjogewoJCQkJCSJwdWJsaWMiOiAiLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRTBnaHJoOTJMdzFZcjNpZEdWNVdxQ3RNREI4Q3hcbitEOGhkQzR3MlpMTklwbFZSb1ZHTHNrWWEzZ2hlTXlPamlKOGtQaTE1YVEyLy83UCtvajdVdkpQR3c9PVxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tXG4iCgkJCQl9CgkJCX0KCQl9LAoJCSJyb2xlcyI6IHsKCQkJInJvb3QiOiB7CgkJCQkia2V5aWRzIjogWwoJCQkJCSIzYzM0NGFhMDY4ZmQ0Y2M0ZTg3ZGM1MGI2MTJjMDI0MzFmYmM3NzFlOTUwMDM5OTM2ODNhMmIwYmYyNjBjZjBlIiwKCQkJCQkiZWM4MTY2OTczNGUwMTc5OTZjNWI4NWYzZDAyYzNkZTFkZDQ2MzdhMTUyMDE5ZmUxYWYxMjVkMmY5MzY4Yjk1ZSIsCgkJCQkJIjFlMWQ2NWNlOThiMTBhZGRhZDQ3NjRmZWJmN2RkYTJkMDQzNmIzZDNhMzg5MzU3OWMwZGRkYWVhMjBlNTQ4NDkiLAoJCQkJCSJlMmY1OWFjYjk0ODg1MTk0MDdlMThjYmZjOTMyOTUxMGJlMDNjMDRhY2E5OTI5ZDJmMDMwMTM0M2ZlYzg1NTIzIiwKCQkJCQkiZmRmYTgzYTA3YjVhODM1ODliODdkZWQ0MWY3N2YzOWQyMzJhZDkxZjdjY2U1Mjg2OGRhY2QwNmJhMDg5ODQ5ZiIKCQkJCV0sCgkJCQkidGhyZXNob2xkIjogMwoJCQl9LAoJCQkic25hcHNob3QiOiB7CgkJCQkia2V5aWRzIjogWwoJCQkJCSIyMzBlMjEyNjE2Mjc0YTQxOTVjZGMyOGU5ZmNlNzgyYzIwZTZjNzIwZjFhODExYjQwZjk4MjI4Mzc2YmRkM2FjIgoJCQkJXSwKCQkJCSJ0aHJlc2hvbGQiOiAxCgkJCX0sCgkJCSJ0YXJnZXRzIjogewoJCQkJImtleWlkcyI6IFsKCQkJCQkiM2MzNDRhYTA2OGZkNGNjNGU4N2RjNTBiNjEyYzAyNDMxZmJjNzcxZTk1MDAzOTkzNjgzYTJiMGJmMjYwY2YwZSIsCgkJCQkJImVjODE2Njk3MzRlMDE3OTk2YzViODVmM2QwMmMzZGUxZGQ0NjM3YTE1MjAxOWZlMWFmMTI1ZDJmOTM2OGI5NWUiLAoJCQkJCSIxZTFkNjVjZTk4YjEwYWRkYWQ0NzY0ZmViZjdkZGEyZDA0MzZiM2QzYTM4OTM1NzljMGRkZGFlYTIwZTU0ODQ5IiwKCQkJCQkiZTJmNTlhY2I5NDg4NTE5NDA3ZTE4Y2JmYzkzMjk1MTBiZTAzYzA0YWNhOTkyOWQyZjAzMDEzNDNmZWM4NTUyMyIsCgkJCQkJImZkZmE4M2EwN2I1YTgzNTg5Yjg3ZGVkNDFmNzdmMzlkMjMyYWQ5MWY3Y2NlNTI4NjhkYWNkMDZiYTA4OTg0OWYiCgkJCQldLAoJCQkJInRocmVzaG9sZCI6IDMKCQkJfSwKCQkJInRpbWVzdGFtcCI6IHsKCQkJCSJrZXlpZHMiOiBbCgkJCQkJIjkyM2JiMzllNjBkZDZmYTJjMzFlNmVhNTU0NzNhYTkzYjY0ZGQ0ZTUzZTE2ZmJlNDJmNmEyMDdkM2Y5N2RlMmQiCgkJCQldLAoJCQkJInRocmVzaG9sZCI6IDEKCQkJfQoJCX0sCgkJImNvbnNpc3RlbnRfc25hcHNob3QiOiB0cnVlCgl9LAoJInNpZ25hdHVyZXMiOiBbCgkJewoJCQkia2V5aWQiOiAiZmY1MWUxN2ZjZjI1MzExOWI3MDMzZjZmNTc1MTI2MzFkYTRhMDk2OTQ0MmFmY2Y5ZmM4YjE0MWM3ZjJiZTk5YyIsCgkJCSJzaWciOiAiMzA0NTAyMjEwMDhiNzhmODk0YzNjZmVkM2JkNDg2Mzc5YzRlMGUwZGZiM2U3ZGQ4Y2JjNGQ1NTk4ZDI4MThlZWExYmEzYzc1NTAwMjIwMjlkM2QwNmU4OWQwNGQzNzg0OTk4NWRjNDZjMGUxMGRjNWIxZmM2OGRjNzBhZjFlYzk5MTAzMDNhMWYzZWUyZiIKCQl9LAoJCXsKCQkJImtleWlkIjogIjI1YTBlYjQ1MGZkM2VlMmJkNzkyMThjOTYzZGNlM2YxY2M2MTE4YmFkZjI1MWJmMTQ5ZjBiZDA3ZDVjYWJlOTkiLAoJCQkic2lnIjogIjMwNDUwMjIxMDA5ZTZiOTBiOTM1ZTA5YjgzN2E5MGQ0NDAyZWFhMjdkNWVhMjZlYjc4OTE5NDhiYTBlZDcwOTA4NDEyNDhmNDM2MDIyMDAzZGMyMjUxYzRkNGE3OTk5YjkxZTlhZDA4Njg3NjVhZTA5YWM3MjY5Mjc5ZjJhNzg5OWJhZmVmN2EyZDkyNjAiCgkJfSwKCQl7CgkJCSJrZXlpZCI6ICJmNTMxMmY1NDJjMjEyNzNkOTQ4NWE0OTM5NDM4NmM0NTc1ODA0NzcwNjY3ZjJkZGI1OWIzYmYwNjY5ZmRkZDJmIiwKCQkJInNpZyI6ICIzMDQ0MDIyMDA5OWU5MDdkY2Y5MGI3YjZlMTA5ZmQxZDZlNDQyMDA2ZmNjYmI0ODg5NGFhYWZmNDdhYjgyNGIwM2ZiMzVkMGQwMjIwMmFhMGEwNmMyMWE0MjMzZjM3OTAwYTQ4YmM4Nzc3ZDNiNDdmNTllM2EzODYxNmNlNjMxYTA0ZGY1N2Y5NjczNiIKCQl9LAoJCXsKCQkJImtleWlkIjogIjNjMzQ0YWEwNjhmZDRjYzRlODdkYzUwYjYxMmMwMjQzMWZiYzc3MWU5NTAwMzk5MzY4M2EyYjBiZjI2MGNmMGUiLAoJCQkic2lnIjogIjMwNDUwMjIxMDA4Yjc4Zjg5NGMzY2ZlZDNiZDQ4NjM3OWM0ZTBlMGRmYjNlN2RkOGNiYzRkNTU5OGQyODE4ZWVhMWJhM2M3NTUwMDIyMDI5ZDNkMDZlODlkMDRkMzc4NDk5ODVkYzQ2YzBlMTBkYzViMWZjNjhkYzcwYWYxZWM5OTEwMzAzYTFmM2VlMmYiCgkJfSwKCQl7CgkJCSJrZXlpZCI6ICJlYzgxNjY5NzM0ZTAxNzk5NmM1Yjg1ZjNkMDJjM2RlMWRkNDYzN2ExNTIwMTlmZTFhZjEyNWQyZjkzNjhiOTVlIiwKCQkJInNpZyI6ICIzMDQ1MDIyMTAwOWU2YjkwYjkzNWUwOWI4MzdhOTBkNDQwMmVhYTI3ZDVlYTI2ZWI3ODkxOTQ4YmEwZWQ3MDkwODQxMjQ4ZjQzNjAyMjAwM2RjMjI1MWM0ZDRhNzk5OWI5MWU5YWQwODY4NzY1YWUwOWFjNzI2OTI3OWYyYTc4OTliYWZlZjdhMmQ5MjYwIgoJCX0sCgkJewoJCQkia2V5aWQiOiAiZTJmNTlhY2I5NDg4NTE5NDA3ZTE4Y2JmYzkzMjk1MTBiZTAzYzA0YWNhOTkyOWQyZjAzMDEzNDNmZWM4NTUyMyIsCgkJCSJzaWciOiAiMzA0NTAyMjAwZTU2MTNiOTAxZTBmM2UwOGVjZWFiZGRjNzNmOThiNTBkZGY4OTJlOTk4ZDBiMzY5YzZlM2Q0NTFhYzQ4ODc1MDIyMTAwOTQwY2Y5MmQxZjQzZWUyZTVjZGJiMjI1NzJiYjUyOTI1ZWQzODYzYTY4OGY3ZmZkZDRiZDJlMmU1NmYwMjhiMyIKCQl9LAoJCXsKCQkJImtleWlkIjogIjJlNjFjZDBjYmY0YThmNDU4MDliZGE5ZjdmNzhjMGQzM2FkMTE4NDJmZjk0YWUzNDA4NzNlMjY2NGRjODQzZGUiLAoJCQkic2lnIjogIjMwNDUwMjIwMmNmZjQ0ZjIyMTVkN2E0N2IyOGI4ZjVmNTgwYzJjZmJiZDFiZmNmY2JiZTc4ZGUzMjMwNDViMmMwYmFkYzVlOTAyMjEwMGM3NDM5NDllYjNmNGVhNWE0YjlhZTI3YWM2ZWRkZWExZjBmZjliZmQwMDRmOGE5YTlkMThjNmU0MTQyYjZlNzUiCgkJfSwKCQl7CgkJCSJrZXlpZCI6ICIxZTFkNjVjZTk4YjEwYWRkYWQ0NzY0ZmViZjdkZGEyZDA0MzZiM2QzYTM4OTM1NzljMGRkZGFlYTIwZTU0ODQ5IiwKCQkJInNpZyI6ICIzMDQ0MDIyMDA5OWU5MDdkY2Y5MGI3YjZlMTA5ZmQxZDZlNDQyMDA2ZmNjYmI0ODg5NGFhYWZmNDdhYjgyNGIwM2ZiMzVkMGQwMjIwMmFhMGEwNmMyMWE0MjMzZjM3OTAwYTQ4YmM4Nzc3ZDNiNDdmNTllM2EzODYxNmNlNjMxYTA0ZGY1N2Y5NjczNiIKCQl9LAoJCXsKCQkJImtleWlkIjogImZkZmE4M2EwN2I1YTgzNTg5Yjg3ZGVkNDFmNzdmMzlkMjMyYWQ5MWY3Y2NlNTI4NjhkYWNkMDZiYTA4OTg0OWYiLAoJCQkic2lnIjogIjMwNDUwMjIwMmNmZjQ0ZjIyMTVkN2E0N2IyOGI4ZjVmNTgwYzJjZmJiZDFiZmNmY2JiZTc4ZGUzMjMwNDViMmMwYmFkYzVlOTAyMjEwMGM3NDM5NDllYjNmNGVhNWE0YjlhZTI3YWM2ZWRkZWExZjBmZjliZmQwMDRmOGE5YTlkMThjNmU0MTQyYjZlNzUiCgkJfSwKCQl7CgkJCSJrZXlpZCI6ICI3Zjc1MTNiMjU0MjlhNjQ0NzNlMTBjZTNhZDJmM2RhMzcyYmJkZDE0YjY1ZDA3YmJhZjU0N2U3YzhiYmJlNjJiIiwKCQkJInNpZyI6ICIzMDQ1MDIyMDBlNTYxM2I5MDFlMGYzZTA4ZWNlYWJkZGM3M2Y5OGI1MGRkZjg5MmU5OThkMGIzNjljNmUzZDQ1MWFjNDg4NzUwMjIxMDA5NDBjZjkyZDFmNDNlZTJlNWNkYmIyMjU3MmJiNTI5MjVlZDM4NjNhNjg4ZjdmZmRkNGJkMmUyZTU2ZjAyOGIzIgoJCX0KCV0KfQ==","targets":{"trusted_root.json":"ewogICJtZWRpYVR5cGUiOiAiYXBwbGljYXRpb24vdm5kLmRldi5zaWdzdG9yZS50cnVzdGVkcm9vdCtqc29uO3ZlcnNpb249MC4xIiwKICAidGxvZ3MiOiBbCiAgICB7CiAgICAgICJiYXNlVXJsIjogImh0dHBzOi8vcmVrb3Iuc2lnc3RvcmUuZGV2IiwKICAgICAgImhhc2hBbGdvcml0aG0iOiAiU0hBMl8yNTYiLAogICAgICAicHVibGljS2V5IjogewogICAgICAgICJyYXdCeXRlcyI6ICJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUUyRzJZKzJ0YWJkVFY1QmNHaUJJeDBhOWZBRndya0JibUxTR3RrczRMM3FYNnlZWTB6dWZCbmhDOFVyL2l5NTVHaFdQLzlBL2JZMkxoQzMwTTkrUll0dz09IiwKICAgICAgICAia2V5RGV0YWlscyI6ICJQS0lYX0VDRFNBX1AyNTZfU0hBXzI1NiIsCiAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgInN0YXJ0IjogIjIwMjEtMDEtMTJUMTE6NTM6MjcuMDAwWiIKICAgICAgICB9CiAgICAgIH0sCiAgICAgICJsb2dJZCI6IHsKICAgICAgICAia2V5SWQiOiAid05JOWF0UUdseitWV2ZPNkxSeWdINFFVZlkvOFc0UkZ3aVQ1aTVXUmdCMD0iCiAgICAgIH0KICAgIH0KICBdLAogICJjZXJ0aWZpY2F0ZUF1dGhvcml0aWVzIjogWwogICAgewogICAgICAic3ViamVjdCI6IHsKICAgICAgICAib3JnYW5pemF0aW9uIjogInNpZ3N0b3JlLmRldiIsCiAgICAgICAgImNvbW1vbk5hbWUiOiAic2lnc3RvcmUiCiAgICAgIH0sCiAgICAgICJ1cmkiOiAiaHR0cHM6Ly9mdWxjaW8uc2lnc3RvcmUuZGV2IiwKICAgICAgImNlcnRDaGFpbiI6IHsKICAgICAgICAiY2VydGlmaWNhdGVzIjogWwogICAgICAgICAgewogICAgICAgICAgICAicmF3Qnl0ZXMiOiAiTUlJQitEQ0NBWDZnQXdJQkFnSVROVmtEWm9DaW9mUERzeTdkZm02Z2VMYnVoekFLQmdncWhrak9QUVFEQXpBcU1SVXdFd1lEVlFRS0V3eHphV2R6ZEc5eVpTNWtaWFl4RVRBUEJnTlZCQU1UQ0hOcFozTjBiM0psTUI0WERUSXhNRE13TnpBek1qQXlPVm9YRFRNeE1ESXlNekF6TWpBeU9Wb3dLakVWTUJNR0ExVUVDaE1NYzJsbmMzUnZjbVV1WkdWMk1SRXdEd1lEVlFRREV3aHphV2R6ZEc5eVpUQjJNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWlBMklBQkxTeUE3SWk1aytwTk84WkVXWTB5bGVtV0Rvd09rTmEza0wrR1pFNVo1R1dlaEw5L0E5YlJOQTNSYnJzWjVpMEpjYXN0YVJMN1NwNWZwL2pENWR4cWMvVWRUVm5sdlMxNmFuKzJZZnN3ZS9RdUxvbFJVQ3JjT0UyKzJpQTUrdHpkNk5tTUdRd0RnWURWUjBQQVFIL0JBUURBZ0VHTUJJR0ExVWRFd0VCL3dRSU1BWUJBZjhDQVFFd0hRWURWUjBPQkJZRUZNakZIUUJCbWlRcE1sRWs2dzJ1U3UxS0J0UHNNQjhHQTFVZEl3UVlNQmFBRk1qRkhRQkJtaVFwTWxFazZ3MnVTdTFLQnRQc01Bb0dDQ3FHU000OUJBTURBMmdBTUdVQ01IOGxpV0pmTXVpNnZYWEJoakRnWTRNd3NsbU4vVEp4VmUvODNXckZvbXdtTmYwNTZ5MVg0OEY5YzRtM2Ezb3pYQUl4QUtqUmF5NS9hai9qc0tLR0lrbVFhdGpJOHV1cEhyLytDeEZ2YUpXbXBZcU5rTERHUlUrOW9yemg1aEkyUnJjdWFRPT0iCiAgICAgICAgICB9CiAgICAgICAgXQogICAgICB9LAogICAgICAidmFsaWRGb3IiOiB7CiAgICAgICAgInN0YXJ0IjogIjIwMjEtMDMtMDdUMDM6MjA6MjkuMDAwWiIsCiAgICAgICAgImVuZCI6ICIyMDIyLTEyLTMxVDIzOjU5OjU5Ljk5OVoiCiAgICAgIH0KICAgIH0sCiAgICB7CiAgICAgICJzdWJqZWN0IjogewogICAgICAgICJvcmdhbml6YXRpb24iOiAic2lnc3RvcmUuZGV2IiwKICAgICAgICAiY29tbW9uTmFtZSI6ICJzaWdzdG9yZSIKICAgICAgfSwKICAgICAgInVyaSI6ICJodHRwczovL2Z1bGNpby5zaWdzdG9yZS5kZXYiLAogICAgICAiY2VydENoYWluIjogewogICAgICAgICJjZXJ0aWZpY2F0ZXMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJyYXdCeXRlcyI6ICJNSUlDR2pDQ0FhR2dBd0lCQWdJVUFMblZpVmZuVTBickphc21Sa0hybi9VbmZhUXdDZ1lJS29aSXpqMEVBd013S2pFVk1CTUdBMVVFQ2hNTWMybG5jM1J2Y21VdVpHVjJNUkV3RHdZRFZRUURFd2h6YVdkemRHOXlaVEFlRncweU1qQTBNVE15TURBMk1UVmFGdzB6TVRFd01EVXhNelUyTlRoYU1EY3hGVEFUQmdOVkJBb1RESE5wWjNOMGIzSmxMbVJsZGpFZU1Cd0dBMVVFQXhNVmMybG5jM1J2Y21VdGFXNTBaWEp0WldScFlYUmxNSFl3RUFZSEtvWkl6ajBDQVFZRks0RUVBQ0lEWWdBRThSVlMveXNIK05PdnVEWnlQSVp0aWxnVUY5TmxhcllwQWQ5SFAxdkJCSDFVNUNWNzdMU1M3czBaaUg0bkU3SHY3cHRTNkx2dlIvU1RrNzk4TFZnTXpMbEo0SGVJZkYzdEhTYWV4TGNZcFNBU3Ixa1MwTi9SZ0JKei85aldDaVhubzNzd2VUQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0V3WURWUjBsQkF3d0NnWUlLd1lCQlFVSEF3TXdFZ1lEVlIwVEFRSC9CQWd3QmdFQi93SUJBREFkQmdOVkhRNEVGZ1FVMzlQcHoxWWtFWmI1cU5qcEtGV2l4aTRZWkQ4d0h3WURWUjBqQkJnd0ZvQVVXTUFlWDVGRnBXYXBlc3lRb1pNaTBDckZ4Zm93Q2dZSUtvWkl6ajBFQXdNRFp3QXdaQUl3UENzUUs0RFlpWllEUElhRGk1SEZLbmZ4WHg2QVNTVm1FUmZzeW5ZQmlYMlg2U0pSblpVODQvOURaZG5GdnZ4bUFqQk90NlFwQmxjNEovMER4dmtUQ3FwY2x2emlMNkJDQ1BuamRsSUIzUHUzQnhzUG15Z1VZN0lpMnpiZENkbGlpb3c9IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInJhd0J5dGVzIjogIk1JSUI5ekNDQVh5Z0F3SUJBZ0lVQUxaTkFQRmR4SFB3amVEbG9Ed3lZQ2hBTy80d0NnWUlLb1pJemowRUF3TXdLakVWTUJNR0ExVUVDaE1NYzJsbmMzUnZjbVV1WkdWMk1SRXdEd1lEVlFRREV3aHphV2R6ZEc5eVpUQWVGdzB5TVRFd01EY3hNelUyTlRsYUZ3MHpNVEV3TURVeE16VTJOVGhhTUNveEZUQVRCZ05WQkFvVERITnBaM04wYjNKbExtUmxkakVSTUE4R0ExVUVBeE1JYzJsbmMzUnZjbVV3ZGpBUUJnY3Foa2pPUFFJQkJnVXJnUVFBSWdOaUFBVDdYZUZUNHJiM1BRR3dTNElhanRMazMvT2xucGdhbmdhQmNsWXBzWUJyNWkrNHluQjA3Y2ViM0xQME9JT1pkeGV4WDY5YzVpVnV5SlJRK0h6MDV5aStVRjN1QldBbEhwaVM1c2gwK0gyR0hFN1NYcmsxRUM1bTFUcjE5TDlnZzkyall6QmhNQTRHQTFVZER3RUIvd1FFQXdJQkJqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUll3QjVma1VXbFpxbDZ6SkNoa3lMUUtzWEYrakFmQmdOVkhTTUVHREFXZ0JSWXdCNWZrVVdsWnFsNnpKQ2hreUxRS3NYRitqQUtCZ2dxaGtqT1BRUURBd05wQURCbUFqRUFqMW5IZVhacCsxM05XQk5hK0VEc0RQOEcxV1dnMXRDTVdQL1dIUHFwYVZvMGpoc3dlTkZaZ1NzMGVFN3dZSTRxQWpFQTJXQjlvdDk4c0lrb0YzdlpZZGQzL1Z0V0I1YjlUTk1lYTdJeC9zdEo1VGZjTExlQUJMRTRCTkpPc1E0dm5CSEoiCiAgICAgICAgICB9CiAgICAgICAgXQogICAgICB9LAogICAgICAidmFsaWRGb3IiOiB7CiAgICAgICAgInN0YXJ0IjogIjIwMjItMDQtMTNUMjA6MDY6MTUuMDAwWiIKICAgICAgfQogICAgfQogIF0sCiAgImN0bG9ncyI6IFsKICAgIHsKICAgICAgImJhc2VVcmwiOiAiaHR0cHM6Ly9jdGZlLnNpZ3N0b3JlLmRldi90ZXN0IiwKICAgICAgImhhc2hBbGdvcml0aG0iOiAiU0hBMl8yNTYiLAogICAgICAicHVibGljS2V5IjogewogICAgICAgICJyYXdCeXRlcyI6ICJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUViZndSK1JKdWRYc2NnUkJScEtYMVhGRHkzUHl1ZER4ei9TZm5SaTFmVDhla3BmQmQyTzF1b3o3anIzWjhuS3p4QTY5RVVRK2VGQ0ZJM3pldWJQV1U3dz09IiwKICAgICAgICAia2V5RGV0YWlscyI6ICJQS0lYX0VDRFNBX1AyNTZfU0hBXzI1NiIsCiAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgInN0YXJ0IjogIjIwMjEtMDMtMTRUMDA6MDA6MDAuMDAwWiIsCiAgICAgICAgICAiZW5kIjogIjIwMjItMTAtMzFUMjM6NTk6NTkuOTk5WiIKICAgICAgICB9CiAgICAgIH0sCiAgICAgICJsb2dJZCI6IHsKICAgICAgICAia2V5SWQiOiAiQ0dDUzhDaFMvMmhGMGRGcko0U2NSV2NZckJZOXd6alNiZWE4SWdZMmIzST0iCiAgICAgIH0KICAgIH0sCiAgICB7CiAgICAgICJiYXNlVXJsIjogImh0dHBzOi8vY3RmZS5zaWdzdG9yZS5kZXYvMjAyMiIsCiAgICAgICJoYXNoQWxnb3JpdGhtIjogIlNIQTJfMjU2IiwKICAgICAgInB1YmxpY0tleSI6IHsKICAgICAgICAicmF3Qnl0ZXMiOiAiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFaVBTbEZpMENtRlRmRWpDVXFGOUh1Q0VjWVhOS0FhWWFsSUptQlo4eXllelBqVHFoeHJLQnBNbmFvY1Z0TEpCSTFlTTN1WG5RelFHQUpkSjRnczlGeXc9PSIsCiAgICAgICAgImtleURldGFpbHMiOiAiUEtJWF9FQ0RTQV9QMjU2X1NIQV8yNTYiLAogICAgICAgICJ2YWxpZEZvciI6IHsKICAgICAgICAgICJzdGFydCI6ICIyMDIyLTEwLTIwVDAwOjAwOjAwLjAwMFoiCiAgICAgICAgfQogICAgICB9LAogICAgICAibG9nSWQiOiB7CiAgICAgICAgImtleUlkIjogIjNUMHdhc2JIRVRKakdSNGNtV2MzQXFKS1hyamVQSzMvaDRweWdDOHA3bzQ9IgogICAgICB9CiAgICB9CiAgXSwKICAidGltZXN0YW1wQXV0aG9yaXRpZXMiOiBbCiAgICB7CiAgICAgICJzdWJqZWN0IjogewogICAgICAgICJvcmdhbml6YXRpb24iOiAiR2l0SHViLCBJbmMuIiwKICAgICAgICAiY29tbW9uTmFtZSI6ICJJbnRlcm5hbCBTZXJ2aWNlcyBSb290IgogICAgICB9LAogICAgICAiY2VydENoYWluIjogewogICAgICAgICJjZXJ0aWZpY2F0ZXMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJyYXdCeXRlcyI6ICJNSUlCM0RDQ0FXS2dBd0lCQWdJVWNoa05zSDM2WGEwNGIxTHFJYytxcjlEVmVjTXdDZ1lJS29aSXpqMEVBd013TWpFVk1CTUdBMVVFQ2hNTVIybDBTSFZpTENCSmJtTXVNUmt3RndZRFZRUURFeEJVVTBFZ2FXNTBaWEp0WldScFlYUmxNQjRYRFRJek1EUXhOREF3TURBd01Gb1hEVEkwTURReE16QXdNREF3TUZvd01qRVZNQk1HQTFVRUNoTU1SMmwwU0hWaUxDQkpibU11TVJrd0Z3WURWUVFERXhCVVUwRWdWR2x0WlhOMFlXMXdhVzVuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFVUQ1Wk5iU3FZTWQ2cjhxcE9PRVg5aWJHblpUOUdzdVhPaHIvZjhVOUZKdWdCR0V4S1lwNDBPVUxTMGVyalpXN3hWOXhWNTJObkpmNU9lRHE0ZTVaS3FOV01GUXdEZ1lEVlIwUEFRSC9CQVFEQWdlQU1CTUdBMVVkSlFRTU1Bb0dDQ3NHQVFVRkJ3TUlNQXdHQTFVZEV3RUIvd1FDTUFBd0h3WURWUjBqQkJnd0ZvQVVhVzFSdWRPZ1Z0MGxlcVkwV0tZYnVQcjQ3d0F3Q2dZSUtvWkl6ajBFQXdNRGFBQXdaUUl3YlVIOUh2RDRlakNaSk9XUW5xQWxrcVVSbGx2dTlNOCtWcUxiaVJLK3pTZlpDWndzaWxqUm44TVFRUlNrWEVFNUFqRUFnK1Z4cXRvamZWZnU4RGh6emhDeDlHS0VUYkpIYjE5aVY3Mm1NS1ViREFGbXpaNmJROGI1NFpiOHRpZHk1YVdlIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInJhd0J5dGVzIjogIk1JSUNFRENDQVpXZ0F3SUJBZ0lVWDhaTzVRWFA3dk40ZE1RNWU5c1UzbnViOE9nd0NnWUlLb1pJemowRUF3TXdPREVWTUJNR0ExVUVDaE1NUjJsMFNIVmlMQ0JKYm1NdU1SOHdIUVlEVlFRREV4WkpiblJsY201aGJDQlRaWEoyYVdObGN5QlNiMjkwTUI0WERUSXpNRFF4TkRBd01EQXdNRm9YRFRJNE1EUXhNakF3TURBd01Gb3dNakVWTUJNR0ExVUVDaE1NUjJsMFNIVmlMQ0JKYm1NdU1Sa3dGd1lEVlFRREV4QlVVMEVnYVc1MFpYSnRaV1JwWVhSbE1IWXdFQVlIS29aSXpqMENBUVlGSzRFRUFDSURZZ0FFdk1MWS9kVFZidklKWUFOQXVzekV3Sm5RRTFsbGZ0eW55TUtJTWhoNDhIbXFiVnI1eWd5YnpzTFJMVktiQldPZFoyMWFlSnorZ1ppeXRaZXRxY3lGOVdsRVI1TkVNZjZKVjdaTm9qUXB4SHE0UkhHb0dTY2VRdi9xdlRpWnhFREtvMll3WkRBT0JnTlZIUThCQWY4RUJBTUNBUVl3RWdZRFZSMFRBUUgvQkFnd0JnRUIvd0lCQURBZEJnTlZIUTRFRmdRVWFXMVJ1ZE9nVnQwbGVxWTBXS1lidVByNDd3QXdId1lEVlIwakJCZ3dGb0FVOU5ZWWxvYm5BRzRjMC9xanh5SC9scS93eitRd0NnWUlLb1pJemowRUF3TURhUUF3WmdJeEFLMUIxODV5Z0NySVlGbElzM0dqc3dqbndTTUc2TFk4d29MVmRha0tEWnhWYThmOGNxTXMxRGhjeEowKzA5dzk1UUl4QU8rdEJ6Wms3dmpVSjlpSmdENFI2WldUeFFXS3FObTc0ak85OW8rbzlzdjRGSS9TWlRaVEZ5TW4wSUpFSGRObXlBPT0iCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicmF3Qnl0ZXMiOiAiTUlJQjlEQ0NBWHFnQXdJQkFnSVVhL0pBa2RVaks0SlV3c3F0YWlSSkdXaHFMU293Q2dZSUtvWkl6ajBFQXdNd09ERVZNQk1HQTFVRUNoTU1SMmwwU0hWaUxDQkpibU11TVI4d0hRWURWUVFERXhaSmJuUmxjbTVoYkNCVFpYSjJhV05sY3lCU2IyOTBNQjRYRFRJek1EUXhOREF3TURBd01Gb1hEVE16TURReE1UQXdNREF3TUZvd09ERVZNQk1HQTFVRUNoTU1SMmwwU0hWaUxDQkpibU11TVI4d0hRWURWUVFERXhaSmJuUmxjbTVoYkNCVFpYSjJhV05sY3lCU2IyOTBNSFl3RUFZSEtvWkl6ajBDQVFZRks0RUVBQ0lEWWdBRWY5akZBWHh6NGt4NjhBSFJNT2tGQmhmbERjTVR2emFYejR4L0ZDY1hqSi8xcUVLb24vcVBJR25hVVJza0R0eU5iTkRPcGVKVERERnF0NDhpTVBybnpweDZJWndxZW1mVUpONHhCRVpmemErcFl0L2l5b2QrOXRacjIwUlJXU3YvbzBVd1F6QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0VnWURWUjBUQVFIL0JBZ3dCZ0VCL3dJQkFqQWRCZ05WSFE0RUZnUVU5TllZbG9ibkFHNGMwL3FqeHlIL2xxL3d6K1F3Q2dZSUtvWkl6ajBFQXdNRGFBQXdaUUl4QUxaTFo4QmdSWHpLeExNTU45VklsTytlNGhyQm5OQmdGN3R6N0hucm93djJOZXRaRXJJQUNLRnltQmx2V0R2dE1BSXdaTytraTZzc1ExYnNabzk4TzhtRUFmMk5aN2lpQ2dERFUwVndqZWNvNnp5ZWgwekJUczkvN2dWNkFITlE1M3hEIgogICAgICAgICAgfQogICAgICAgIF0KICAgICAgfSwKICAgICAgInZhbGlkRm9yIjogewogICAgICAgICJzdGFydCI6ICIyMDIzLTA0LTE0VDAwOjAwOjAwLjAwMFoiCiAgICAgIH0KICAgIH0KICBdCn0K","registry.npmjs.org%2Fkeys.json":"ewogICAgImtleXMiOiBbCiAgICAgICAgewogICAgICAgICAgICAia2V5SWQiOiAiU0hBMjU2OmpsM2J3c3d1ODBQampva0NnaDBvMnc1YzJVNExoUUFFNTdnajljejFrekEiLAogICAgICAgICAgICAia2V5VXNhZ2UiOiAibnBtOnNpZ25hdHVyZXMiLAogICAgICAgICAgICAicHVibGljS2V5IjogewogICAgICAgICAgICAgICAgInJhd0J5dGVzIjogIk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRTFPbGIzek1BRkZ4WEtIaUlrUU81Y0ozWWhsNWk2VVBwK0lodXRlQkpidUhjQTVVb2dLbzBFV3RsV3dXNktTYUtvVE5FWUw3SmxDUWlWbmtoQmt0VWdnPT0iLAogICAgICAgICAgICAgICAgImtleURldGFpbHMiOiAiUEtJWF9FQ0RTQV9QMjU2X1NIQV8yNTYiLAogICAgICAgICAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgICAgICAgICAgICJzdGFydCI6ICIxOTk5LTAxLTAxVDAwOjAwOjAwLjAwMFoiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgImtleUlkIjogIlNIQTI1NjpqbDNid3N3dTgwUGpqb2tDZ2gwbzJ3NWMyVTRMaFFBRTU3Z2o5Y3oxa3pBIiwKICAgICAgICAgICAgImtleVVzYWdlIjogIm5wbTphdHRlc3RhdGlvbnMiLAogICAgICAgICAgICAicHVibGljS2V5IjogewogICAgICAgICAgICAgICAgInJhd0J5dGVzIjogIk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRTFPbGIzek1BRkZ4WEtIaUlrUU81Y0ozWWhsNWk2VVBwK0lodXRlQkpidUhjQTVVb2dLbzBFV3RsV3dXNktTYUtvVE5FWUw3SmxDUWlWbmtoQmt0VWdnPT0iLAogICAgICAgICAgICAgICAgImtleURldGFpbHMiOiAiUEtJWF9FQ0RTQV9QMjU2X1NIQV8yNTYiLAogICAgICAgICAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgICAgICAgICAgICJzdGFydCI6ICIyMDIyLTEyLTAxVDAwOjAwOjAwLjAwMFoiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICBdCn0K"}}} +{"https://tuf-repo-cdn.sigstore.dev":{"root.json":"ewogInNpZ25hdHVyZXMiOiBbCiAgewogICAia2V5aWQiOiAiNmYyNjAwODlkNTkyM2RhZjIwMTY2Y2E2NTdjNTQzYWY2MTgzNDZhYjk3MTg4NGE5OTk2MmIwMTk4OGJiZTBjMyIsCiAgICJzaWciOiAiMzA0NjAyMjEwMDhhYjFmNmYxN2Q0ZjllNmQ3ZGNmMWM4ODkxMmI2YjUzY2MxMDM4ODY0NGFlMWYwOWJjMzdhMDgyY2QwNjAwM2UwMjIxMDBlMTQ1ZWY0YzdiNzgyZDRlODEwN2I1MzQzN2U2NjlkMDQ3Njg5MmNlOTk5OTAzYWUzM2QxNDQ0ODM2Njk5NmU3IgogIH0sCiAgewogICAia2V5aWQiOiAiZTcxYTU0ZDU0MzgzNWJhODZhZGFkOTQ2MDM3OWM3NjQxZmI4NzI2ZDE2NGVhNzY2ODAxYTFjNTIyYWJhN2VhMiIsCiAgICJzaWciOiAiMzA0NTAyMjEwMGM3NjhiMmY4NmRhOTk1NjkwMTljMTYwYTA4MWRhNTRhZTM2YzM0YzBhMzEyMGQzY2I2OWI1M2I3ZDExMzc1OGUwMjIwNGY2NzE1MThmNjE3YjIwZDQ2NTM3ZmFlNmMzYjYzYmFlODkxM2Y0ZjE5NjIxNTYxMDVjYzRmMDE5YWMzNWM2YSIKICB9LAogIHsKICAgImtleWlkIjogIjIyZjRjYWVjNmQ4ZTZmOTU1NWFmNjZiM2Q0YzNjYjA2YTNiYjIzZmRjN2UzOWM5MTZjNjFmNDYyZTZmNTJiMDYiLAogICAic2lnIjogIjMwNDUwMjIxMDBiNDQzNGU2OTk1ZDM2OGQyM2U3NDc1OWFjZDBjYjkwMTNjODNhNWQzNTExZjBmOTk3ZWM1NGM0NTZhZTQzNTBhMDIyMDE1YjBlMjY1ZDE4MmQyYjYxZGM3NGUxNTVkOThiM2MzZmJlNTY0YmEwNTI4NmFhMTRjOGRmMDJjOWI3NTY1MTYiCiAgfSwKICB7CiAgICJrZXlpZCI6ICI2MTY0MzgzODEyNWI0NDBiNDBkYjY5NDJmNWNiNWEzMWMwZGMwNDM2ODMxNmViMmFhYTU4Yjk1OTA0YTU4MjIyIiwKICAgInNpZyI6ICIzMDQ1MDIyMTAwODJjNTg0MTFkOTg5ZWI5Zjg2MTQxMDg1N2Q0MjM4MTU5MGVjOTQyNGRiZGFhNTFlNzhlZDEzNTE1NDMxOTA0ZTAyMjAxMTgxODVkYTZhNmMyOTQ3MTMxYzE3Nzk3ZTJiYjc2MjBjZTI2ZTVmMzAxZDFjZWFjNWYyYTdlNThmOWRjZjJlIgogIH0sCiAgewogICAia2V5aWQiOiAiYTY4N2U1YmY0ZmFiODJiMGVlNThkNDZlMDVjOTUzNTE0NWEyYzlhZmI0NThmNDNkNDJiNDVjYTBmZGNlMmE3MCIsCiAgICJzaWciOiAiMzA0NjAyMjEwMGM3ODUxMzg1NGNhZTljMzJlYWE2Yjg4ZTE4OTEyZjQ4MDA2YzI3NTdhMjU4ZjkxNzMxMmNhYmE3NTk0OGViOWUwMjIxMDBkOWUxYjRjZTBhZGZlOWZkMmUyMTQ4ZDdmYTI3YTJmNDBiYTExMjJiZDY5ZGE3NjEyZDhkMTc3NmIwMTNjOTFkIgogIH0sCiAgewogICAia2V5aWQiOiAiZmRmYTgzYTA3YjVhODM1ODliODdkZWQ0MWY3N2YzOWQyMzJhZDkxZjdjY2U1Mjg2OGRhY2QwNmJhMDg5ODQ5ZiIsCiAgICJzaWciOiAiMzA0NTAyMjA1NjQ4M2EyZDVkOWVhOWNlYzZlMTFlYWRmYjMzYzQ4NGI2MTQyOThmYWNhMTVhY2YxYzQzMWIxMWVkN2Y3MzRjMDIyMTAwZDBjMWQ3MjZhZjkyYTg3ZTRlNjY0NTljYTVhZGYzOGEwNWI0NGUxZjk0MzE4NDIzZjk1NGJhZThiY2E1YmIyZSIKICB9LAogIHsKICAgImtleWlkIjogImUyZjU5YWNiOTQ4ODUxOTQwN2UxOGNiZmM5MzI5NTEwYmUwM2MwNGFjYTk5MjlkMmYwMzAxMzQzZmVjODU1MjMiLAogICAic2lnIjogIjMwNDYwMjIxMDBkMDA0ZGU4ODAyNGMzMmRjNTY1M2E5ZjQ4NDNjZmM1MjE1NDI3MDQ4YWQ5NjAwZDJjZjljOTY5ZTZlZGZmM2QyMDIyMTAwZDllYmI3OThmNWZjNjZhZjEwODk5ZGVjZTAxNGE4NjI4Y2NmM2M1NDAyY2Q0YTQyNzAyMDc0NzJmOGY2ZTcxMiIKICB9LAogIHsKICAgImtleWlkIjogIjNjMzQ0YWEwNjhmZDRjYzRlODdkYzUwYjYxMmMwMjQzMWZiYzc3MWU5NTAwMzk5MzY4M2EyYjBiZjI2MGNmMGUiLAogICAic2lnIjogIjMwNDYwMjIxMDBiN2IwOTk5NmM0NWNhMmQ0YjA1NjAzZTU2YmFlZmEyOTcxOGEwYjcxMTQ3Y2Y4YzZlNjYzNDliYWE2MTQ3N2RmMDIyMTAwYzRkYTgwYzcxN2I0ZmE3YmJhMGZkNWM3MmRhOGEwNDk5MzU4YjAxMzU4YjIzMDlmNDFkMTQ1NmVhMWU3ZTFkOSIKICB9LAogIHsKICAgImtleWlkIjogImVjODE2Njk3MzRlMDE3OTk2YzViODVmM2QwMmMzZGUxZGQ0NjM3YTE1MjAxOWZlMWFmMTI1ZDJmOTM2OGI5NWUiLAogICAic2lnIjogIjMwNDYwMjIxMDBiZTk3ODJjMzA3NDRlNDExYTgyZmE4NWI1MTM4ZDYwMWNlMTQ4YmMxOTI1OGFlYzY0ZTdlYzI0NDc4ZjM4ODEyMDIyMTAwY2FlZjYzZGNhZjFhNGI5YTUwMGQzYmQwZTNmMTY0ZWMxOGYxYjYzZDdhOTQ2MGQ5YWNhYjEwNjZkYjBmMDE2ZCIKICB9LAogIHsKICAgImtleWlkIjogIjFlMWQ2NWNlOThiMTBhZGRhZDQ3NjRmZWJmN2RkYTJkMDQzNmIzZDNhMzg5MzU3OWMwZGRkYWVhMjBlNTQ4NDkiLAogICAic2lnIjogIjMwNDUwMjIwNzQ2ZWMzZjg1MzRjZTU1NTMxZDBkMDFmZjY0OTY0ZWY0NDBkMWU3ZDJjNGMxNDI0MDliOGU5NzY5ZjFhZGE2ZjAyMjEwMGUzYjkyOWZjZDkzZWExOGZlYWEwODI1ODg3YTcyMTA0ODk4NzlhNjY3ODBjMDdhODNmNGJkNDZlMmYwOWFiM2IiCiAgfQogXSwKICJzaWduZWQiOiB7CiAgIl90eXBlIjogInJvb3QiLAogICJjb25zaXN0ZW50X3NuYXBzaG90IjogdHJ1ZSwKICAiZXhwaXJlcyI6ICIyMDI1LTAyLTE5VDA4OjA0OjMyWiIsCiAgImtleXMiOiB7CiAgICIyMmY0Y2FlYzZkOGU2Zjk1NTVhZjY2YjNkNGMzY2IwNmEzYmIyM2ZkYzdlMzljOTE2YzYxZjQ2MmU2ZjUyYjA2IjogewogICAgImtleWlkX2hhc2hfYWxnb3JpdGhtcyI6IFsKICAgICAic2hhMjU2IiwKICAgICAic2hhNTEyIgogICAgXSwKICAgICJrZXl0eXBlIjogImVjZHNhIiwKICAgICJrZXl2YWwiOiB7CiAgICAgInB1YmxpYyI6ICItLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLVxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFekJ6Vk9tSENQb2pNVkxTSTM2NFdpaVY4TlByRFxuNklnUnhWbGlza3ovdit5M0pFUjVtY1ZHY09ObGlEY1dNQzVKMmxmSG1qUE5QaGI0SDd4bThMemZTQT09XG4tLS0tLUVORCBQVUJMSUMgS0VZLS0tLS1cbiIKICAgIH0sCiAgICAic2NoZW1lIjogImVjZHNhLXNoYTItbmlzdHAyNTYiLAogICAgIngtdHVmLW9uLWNpLWtleW93bmVyIjogIkBzYW50aWFnb3RvcnJlcyIKICAgfSwKICAgIjYxNjQzODM4MTI1YjQ0MGI0MGRiNjk0MmY1Y2I1YTMxYzBkYzA0MzY4MzE2ZWIyYWFhNThiOTU5MDRhNTgyMjIiOiB7CiAgICAia2V5aWRfaGFzaF9hbGdvcml0aG1zIjogWwogICAgICJzaGEyNTYiLAogICAgICJzaGE1MTIiCiAgICBdLAogICAgImtleXR5cGUiOiAiZWNkc2EiLAogICAgImtleXZhbCI6IHsKICAgICAicHVibGljIjogIi0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tXG5NRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVpbmlrU3NBUW1Za05lSDVlWXEvQ25JekxhYWNPXG54bFNhYXdRRE93cUt5L3RDcXhxNXh4UFNKYzIxSzRXSWhzOUd5T2tLZnp1ZVkzR0lMemNNSlo0Y1d3PT1cbi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLVxuIgogICAgfSwKICAgICJzY2hlbWUiOiAiZWNkc2Etc2hhMi1uaXN0cDI1NiIsCiAgICAieC10dWYtb24tY2kta2V5b3duZXIiOiAiQGJvYmNhbGxhd2F5IgogICB9LAogICAiNmYyNjAwODlkNTkyM2RhZjIwMTY2Y2E2NTdjNTQzYWY2MTgzNDZhYjk3MTg4NGE5OTk2MmIwMTk4OGJiZTBjMyI6IHsKICAgICJrZXlpZF9oYXNoX2FsZ29yaXRobXMiOiBbCiAgICAgInNoYTI1NiIsCiAgICAgInNoYTUxMiIKICAgIF0sCiAgICAia2V5dHlwZSI6ICJlY2RzYSIsCiAgICAia2V5dmFsIjogewogICAgICJwdWJsaWMiOiAiLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRXk4WEtzbWhCWURJOEpjMEd3ekJ4ZUtheDBjbTVcblNUS0VVNjVIUEZ1blVuNDFzVDhwaTBGak00SWtIei9ZVW13bUxVTzBXdDdseGhqNkJrTElLNHFZQXc9PVxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tXG4iCiAgICB9LAogICAgInNjaGVtZSI6ICJlY2RzYS1zaGEyLW5pc3RwMjU2IiwKICAgICJ4LXR1Zi1vbi1jaS1rZXlvd25lciI6ICJAZGxvcmVuYyIKICAgfSwKICAgIjcyNDdmMGRiYWQ4NWIxNDdlMTg2M2JhZGU3NjEyNDNjYzc4NWRjYjdhYTQxMGU3MTA1ZGQzZDJiNjFhMzZkMmMiOiB7CiAgICAia2V5aWRfaGFzaF9hbGdvcml0aG1zIjogWwogICAgICJzaGEyNTYiLAogICAgICJzaGE1MTIiCiAgICBdLAogICAgImtleXR5cGUiOiAiZWNkc2EiLAogICAgImtleXZhbCI6IHsKICAgICAicHVibGljIjogIi0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tXG5NRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVXUmlHcjUraiszSjVTc0grWnRyNW5FMkgyd083XG5CVituTzNzOTNnTGNhMThxVE96SFkxb1d5QUdEeWtNU3NHVFVCU3Q5RCtBbjBLZktzRDJtZlNNNDJRPT1cbi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLVxuIgogICAgfSwKICAgICJzY2hlbWUiOiAiZWNkc2Etc2hhMi1uaXN0cDI1NiIsCiAgICAieC10dWYtb24tY2ktb25saW5lLXVyaSI6ICJnY3BrbXM6Ly9wcm9qZWN0cy9zaWdzdG9yZS1yb290LXNpZ25pbmcvbG9jYXRpb25zL2dsb2JhbC9rZXlSaW5ncy9yb290L2NyeXB0b0tleXMvdGltZXN0YW1wIgogICB9LAogICAiYTY4N2U1YmY0ZmFiODJiMGVlNThkNDZlMDVjOTUzNTE0NWEyYzlhZmI0NThmNDNkNDJiNDVjYTBmZGNlMmE3MCI6IHsKICAgICJrZXlpZF9oYXNoX2FsZ29yaXRobXMiOiBbCiAgICAgInNoYTI1NiIsCiAgICAgInNoYTUxMiIKICAgIF0sCiAgICAia2V5dHlwZSI6ICJlY2RzYSIsCiAgICAia2V5dmFsIjogewogICAgICJwdWJsaWMiOiAiLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRTBnaHJoOTJMdzFZcjNpZEdWNVdxQ3RNREI4Q3hcbitEOGhkQzR3MlpMTklwbFZSb1ZHTHNrWWEzZ2hlTXlPamlKOGtQaTE1YVEyLy83UCtvajdVdkpQR3c9PVxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tXG4iCiAgICB9LAogICAgInNjaGVtZSI6ICJlY2RzYS1zaGEyLW5pc3RwMjU2IiwKICAgICJ4LXR1Zi1vbi1jaS1rZXlvd25lciI6ICJAam9zaHVhZ2wiCiAgIH0sCiAgICJlNzFhNTRkNTQzODM1YmE4NmFkYWQ5NDYwMzc5Yzc2NDFmYjg3MjZkMTY0ZWE3NjY4MDFhMWM1MjJhYmE3ZWEyIjogewogICAgImtleWlkX2hhc2hfYWxnb3JpdGhtcyI6IFsKICAgICAic2hhMjU2IiwKICAgICAic2hhNTEyIgogICAgXSwKICAgICJrZXl0eXBlIjogImVjZHNhIiwKICAgICJrZXl2YWwiOiB7CiAgICAgInB1YmxpYyI6ICItLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLVxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFRVhzejNTWlhGYjhqTVY0Mmo2cEpseWpialI4S1xuTjNCd29jZXhxNkxNSWI1cXNXS09RdkxOMTZOVWVmTGM0SHN3T291bVJzVlZhYWpTcFFTNmZvYmtSdz09XG4tLS0tLUVORCBQVUJMSUMgS0VZLS0tLS1cbiIKICAgIH0sCiAgICAic2NoZW1lIjogImVjZHNhLXNoYTItbmlzdHAyNTYiLAogICAgIngtdHVmLW9uLWNpLWtleW93bmVyIjogIkBtbm02NzgiCiAgIH0KICB9LAogICJyb2xlcyI6IHsKICAgInJvb3QiOiB7CiAgICAia2V5aWRzIjogWwogICAgICI2ZjI2MDA4OWQ1OTIzZGFmMjAxNjZjYTY1N2M1NDNhZjYxODM0NmFiOTcxODg0YTk5OTYyYjAxOTg4YmJlMGMzIiwKICAgICAiZTcxYTU0ZDU0MzgzNWJhODZhZGFkOTQ2MDM3OWM3NjQxZmI4NzI2ZDE2NGVhNzY2ODAxYTFjNTIyYWJhN2VhMiIsCiAgICAgIjIyZjRjYWVjNmQ4ZTZmOTU1NWFmNjZiM2Q0YzNjYjA2YTNiYjIzZmRjN2UzOWM5MTZjNjFmNDYyZTZmNTJiMDYiLAogICAgICI2MTY0MzgzODEyNWI0NDBiNDBkYjY5NDJmNWNiNWEzMWMwZGMwNDM2ODMxNmViMmFhYTU4Yjk1OTA0YTU4MjIyIiwKICAgICAiYTY4N2U1YmY0ZmFiODJiMGVlNThkNDZlMDVjOTUzNTE0NWEyYzlhZmI0NThmNDNkNDJiNDVjYTBmZGNlMmE3MCIKICAgIF0sCiAgICAidGhyZXNob2xkIjogMwogICB9LAogICAic25hcHNob3QiOiB7CiAgICAia2V5aWRzIjogWwogICAgICI3MjQ3ZjBkYmFkODViMTQ3ZTE4NjNiYWRlNzYxMjQzY2M3ODVkY2I3YWE0MTBlNzEwNWRkM2QyYjYxYTM2ZDJjIgogICAgXSwKICAgICJ0aHJlc2hvbGQiOiAxLAogICAgIngtdHVmLW9uLWNpLWV4cGlyeS1wZXJpb2QiOiAzNjUwLAogICAgIngtdHVmLW9uLWNpLXNpZ25pbmctcGVyaW9kIjogMzY1CiAgIH0sCiAgICJ0YXJnZXRzIjogewogICAgImtleWlkcyI6IFsKICAgICAiNmYyNjAwODlkNTkyM2RhZjIwMTY2Y2E2NTdjNTQzYWY2MTgzNDZhYjk3MTg4NGE5OTk2MmIwMTk4OGJiZTBjMyIsCiAgICAgImU3MWE1NGQ1NDM4MzViYTg2YWRhZDk0NjAzNzljNzY0MWZiODcyNmQxNjRlYTc2NjgwMWExYzUyMmFiYTdlYTIiLAogICAgICIyMmY0Y2FlYzZkOGU2Zjk1NTVhZjY2YjNkNGMzY2IwNmEzYmIyM2ZkYzdlMzljOTE2YzYxZjQ2MmU2ZjUyYjA2IiwKICAgICAiNjE2NDM4MzgxMjViNDQwYjQwZGI2OTQyZjVjYjVhMzFjMGRjMDQzNjgzMTZlYjJhYWE1OGI5NTkwNGE1ODIyMiIsCiAgICAgImE2ODdlNWJmNGZhYjgyYjBlZTU4ZDQ2ZTA1Yzk1MzUxNDVhMmM5YWZiNDU4ZjQzZDQyYjQ1Y2EwZmRjZTJhNzAiCiAgICBdLAogICAgInRocmVzaG9sZCI6IDMKICAgfSwKICAgInRpbWVzdGFtcCI6IHsKICAgICJrZXlpZHMiOiBbCiAgICAgIjcyNDdmMGRiYWQ4NWIxNDdlMTg2M2JhZGU3NjEyNDNjYzc4NWRjYjdhYTQxMGU3MTA1ZGQzZDJiNjFhMzZkMmMiCiAgICBdLAogICAgInRocmVzaG9sZCI6IDEsCiAgICAieC10dWYtb24tY2ktZXhwaXJ5LXBlcmlvZCI6IDcsCiAgICAieC10dWYtb24tY2ktc2lnbmluZy1wZXJpb2QiOiA0CiAgIH0KICB9LAogICJzcGVjX3ZlcnNpb24iOiAiMS4wIiwKICAidmVyc2lvbiI6IDEwLAogICJ4LXR1Zi1vbi1jaS1leHBpcnktcGVyaW9kIjogMTgyLAogICJ4LXR1Zi1vbi1jaS1zaWduaW5nLXBlcmlvZCI6IDMxCiB9Cn0=","targets":{"trusted_root.json":"ewogICJtZWRpYVR5cGUiOiAiYXBwbGljYXRpb24vdm5kLmRldi5zaWdzdG9yZS50cnVzdGVkcm9vdCtqc29uO3ZlcnNpb249MC4xIiwKICAidGxvZ3MiOiBbCiAgICB7CiAgICAgICJiYXNlVXJsIjogImh0dHBzOi8vcmVrb3Iuc2lnc3RvcmUuZGV2IiwKICAgICAgImhhc2hBbGdvcml0aG0iOiAiU0hBMl8yNTYiLAogICAgICAicHVibGljS2V5IjogewogICAgICAgICJyYXdCeXRlcyI6ICJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUUyRzJZKzJ0YWJkVFY1QmNHaUJJeDBhOWZBRndya0JibUxTR3RrczRMM3FYNnlZWTB6dWZCbmhDOFVyL2l5NTVHaFdQLzlBL2JZMkxoQzMwTTkrUll0dz09IiwKICAgICAgICAia2V5RGV0YWlscyI6ICJQS0lYX0VDRFNBX1AyNTZfU0hBXzI1NiIsCiAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgInN0YXJ0IjogIjIwMjEtMDEtMTJUMTE6NTM6MjcuMDAwWiIKICAgICAgICB9CiAgICAgIH0sCiAgICAgICJsb2dJZCI6IHsKICAgICAgICAia2V5SWQiOiAid05JOWF0UUdseitWV2ZPNkxSeWdINFFVZlkvOFc0UkZ3aVQ1aTVXUmdCMD0iCiAgICAgIH0KICAgIH0KICBdLAogICJjZXJ0aWZpY2F0ZUF1dGhvcml0aWVzIjogWwogICAgewogICAgICAic3ViamVjdCI6IHsKICAgICAgICAib3JnYW5pemF0aW9uIjogInNpZ3N0b3JlLmRldiIsCiAgICAgICAgImNvbW1vbk5hbWUiOiAic2lnc3RvcmUiCiAgICAgIH0sCiAgICAgICJ1cmkiOiAiaHR0cHM6Ly9mdWxjaW8uc2lnc3RvcmUuZGV2IiwKICAgICAgImNlcnRDaGFpbiI6IHsKICAgICAgICAiY2VydGlmaWNhdGVzIjogWwogICAgICAgICAgewogICAgICAgICAgICAicmF3Qnl0ZXMiOiAiTUlJQitEQ0NBWDZnQXdJQkFnSVROVmtEWm9DaW9mUERzeTdkZm02Z2VMYnVoekFLQmdncWhrak9QUVFEQXpBcU1SVXdFd1lEVlFRS0V3eHphV2R6ZEc5eVpTNWtaWFl4RVRBUEJnTlZCQU1UQ0hOcFozTjBiM0psTUI0WERUSXhNRE13TnpBek1qQXlPVm9YRFRNeE1ESXlNekF6TWpBeU9Wb3dLakVWTUJNR0ExVUVDaE1NYzJsbmMzUnZjbVV1WkdWMk1SRXdEd1lEVlFRREV3aHphV2R6ZEc5eVpUQjJNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWlBMklBQkxTeUE3SWk1aytwTk84WkVXWTB5bGVtV0Rvd09rTmEza0wrR1pFNVo1R1dlaEw5L0E5YlJOQTNSYnJzWjVpMEpjYXN0YVJMN1NwNWZwL2pENWR4cWMvVWRUVm5sdlMxNmFuKzJZZnN3ZS9RdUxvbFJVQ3JjT0UyKzJpQTUrdHpkNk5tTUdRd0RnWURWUjBQQVFIL0JBUURBZ0VHTUJJR0ExVWRFd0VCL3dRSU1BWUJBZjhDQVFFd0hRWURWUjBPQkJZRUZNakZIUUJCbWlRcE1sRWs2dzJ1U3UxS0J0UHNNQjhHQTFVZEl3UVlNQmFBRk1qRkhRQkJtaVFwTWxFazZ3MnVTdTFLQnRQc01Bb0dDQ3FHU000OUJBTURBMmdBTUdVQ01IOGxpV0pmTXVpNnZYWEJoakRnWTRNd3NsbU4vVEp4VmUvODNXckZvbXdtTmYwNTZ5MVg0OEY5YzRtM2Ezb3pYQUl4QUtqUmF5NS9hai9qc0tLR0lrbVFhdGpJOHV1cEhyLytDeEZ2YUpXbXBZcU5rTERHUlUrOW9yemg1aEkyUnJjdWFRPT0iCiAgICAgICAgICB9CiAgICAgICAgXQogICAgICB9LAogICAgICAidmFsaWRGb3IiOiB7CiAgICAgICAgInN0YXJ0IjogIjIwMjEtMDMtMDdUMDM6MjA6MjkuMDAwWiIsCiAgICAgICAgImVuZCI6ICIyMDIyLTEyLTMxVDIzOjU5OjU5Ljk5OVoiCiAgICAgIH0KICAgIH0sCiAgICB7CiAgICAgICJzdWJqZWN0IjogewogICAgICAgICJvcmdhbml6YXRpb24iOiAic2lnc3RvcmUuZGV2IiwKICAgICAgICAiY29tbW9uTmFtZSI6ICJzaWdzdG9yZSIKICAgICAgfSwKICAgICAgInVyaSI6ICJodHRwczovL2Z1bGNpby5zaWdzdG9yZS5kZXYiLAogICAgICAiY2VydENoYWluIjogewogICAgICAgICJjZXJ0aWZpY2F0ZXMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJyYXdCeXRlcyI6ICJNSUlDR2pDQ0FhR2dBd0lCQWdJVUFMblZpVmZuVTBickphc21Sa0hybi9VbmZhUXdDZ1lJS29aSXpqMEVBd013S2pFVk1CTUdBMVVFQ2hNTWMybG5jM1J2Y21VdVpHVjJNUkV3RHdZRFZRUURFd2h6YVdkemRHOXlaVEFlRncweU1qQTBNVE15TURBMk1UVmFGdzB6TVRFd01EVXhNelUyTlRoYU1EY3hGVEFUQmdOVkJBb1RESE5wWjNOMGIzSmxMbVJsZGpFZU1Cd0dBMVVFQXhNVmMybG5jM1J2Y21VdGFXNTBaWEp0WldScFlYUmxNSFl3RUFZSEtvWkl6ajBDQVFZRks0RUVBQ0lEWWdBRThSVlMveXNIK05PdnVEWnlQSVp0aWxnVUY5TmxhcllwQWQ5SFAxdkJCSDFVNUNWNzdMU1M3czBaaUg0bkU3SHY3cHRTNkx2dlIvU1RrNzk4TFZnTXpMbEo0SGVJZkYzdEhTYWV4TGNZcFNBU3Ixa1MwTi9SZ0JKei85aldDaVhubzNzd2VUQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0V3WURWUjBsQkF3d0NnWUlLd1lCQlFVSEF3TXdFZ1lEVlIwVEFRSC9CQWd3QmdFQi93SUJBREFkQmdOVkhRNEVGZ1FVMzlQcHoxWWtFWmI1cU5qcEtGV2l4aTRZWkQ4d0h3WURWUjBqQkJnd0ZvQVVXTUFlWDVGRnBXYXBlc3lRb1pNaTBDckZ4Zm93Q2dZSUtvWkl6ajBFQXdNRFp3QXdaQUl3UENzUUs0RFlpWllEUElhRGk1SEZLbmZ4WHg2QVNTVm1FUmZzeW5ZQmlYMlg2U0pSblpVODQvOURaZG5GdnZ4bUFqQk90NlFwQmxjNEovMER4dmtUQ3FwY2x2emlMNkJDQ1BuamRsSUIzUHUzQnhzUG15Z1VZN0lpMnpiZENkbGlpb3c9IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInJhd0J5dGVzIjogIk1JSUI5ekNDQVh5Z0F3SUJBZ0lVQUxaTkFQRmR4SFB3amVEbG9Ed3lZQ2hBTy80d0NnWUlLb1pJemowRUF3TXdLakVWTUJNR0ExVUVDaE1NYzJsbmMzUnZjbVV1WkdWMk1SRXdEd1lEVlFRREV3aHphV2R6ZEc5eVpUQWVGdzB5TVRFd01EY3hNelUyTlRsYUZ3MHpNVEV3TURVeE16VTJOVGhhTUNveEZUQVRCZ05WQkFvVERITnBaM04wYjNKbExtUmxkakVSTUE4R0ExVUVBeE1JYzJsbmMzUnZjbVV3ZGpBUUJnY3Foa2pPUFFJQkJnVXJnUVFBSWdOaUFBVDdYZUZUNHJiM1BRR3dTNElhanRMazMvT2xucGdhbmdhQmNsWXBzWUJyNWkrNHluQjA3Y2ViM0xQME9JT1pkeGV4WDY5YzVpVnV5SlJRK0h6MDV5aStVRjN1QldBbEhwaVM1c2gwK0gyR0hFN1NYcmsxRUM1bTFUcjE5TDlnZzkyall6QmhNQTRHQTFVZER3RUIvd1FFQXdJQkJqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUll3QjVma1VXbFpxbDZ6SkNoa3lMUUtzWEYrakFmQmdOVkhTTUVHREFXZ0JSWXdCNWZrVVdsWnFsNnpKQ2hreUxRS3NYRitqQUtCZ2dxaGtqT1BRUURBd05wQURCbUFqRUFqMW5IZVhacCsxM05XQk5hK0VEc0RQOEcxV1dnMXRDTVdQL1dIUHFwYVZvMGpoc3dlTkZaZ1NzMGVFN3dZSTRxQWpFQTJXQjlvdDk4c0lrb0YzdlpZZGQzL1Z0V0I1YjlUTk1lYTdJeC9zdEo1VGZjTExlQUJMRTRCTkpPc1E0dm5CSEoiCiAgICAgICAgICB9CiAgICAgICAgXQogICAgICB9LAogICAgICAidmFsaWRGb3IiOiB7CiAgICAgICAgInN0YXJ0IjogIjIwMjItMDQtMTNUMjA6MDY6MTUuMDAwWiIKICAgICAgfQogICAgfQogIF0sCiAgImN0bG9ncyI6IFsKICAgIHsKICAgICAgImJhc2VVcmwiOiAiaHR0cHM6Ly9jdGZlLnNpZ3N0b3JlLmRldi90ZXN0IiwKICAgICAgImhhc2hBbGdvcml0aG0iOiAiU0hBMl8yNTYiLAogICAgICAicHVibGljS2V5IjogewogICAgICAgICJyYXdCeXRlcyI6ICJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUViZndSK1JKdWRYc2NnUkJScEtYMVhGRHkzUHl1ZER4ei9TZm5SaTFmVDhla3BmQmQyTzF1b3o3anIzWjhuS3p4QTY5RVVRK2VGQ0ZJM3pldWJQV1U3dz09IiwKICAgICAgICAia2V5RGV0YWlscyI6ICJQS0lYX0VDRFNBX1AyNTZfU0hBXzI1NiIsCiAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgInN0YXJ0IjogIjIwMjEtMDMtMTRUMDA6MDA6MDAuMDAwWiIsCiAgICAgICAgICAiZW5kIjogIjIwMjItMTAtMzFUMjM6NTk6NTkuOTk5WiIKICAgICAgICB9CiAgICAgIH0sCiAgICAgICJsb2dJZCI6IHsKICAgICAgICAia2V5SWQiOiAiQ0dDUzhDaFMvMmhGMGRGcko0U2NSV2NZckJZOXd6alNiZWE4SWdZMmIzST0iCiAgICAgIH0KICAgIH0sCiAgICB7CiAgICAgICJiYXNlVXJsIjogImh0dHBzOi8vY3RmZS5zaWdzdG9yZS5kZXYvMjAyMiIsCiAgICAgICJoYXNoQWxnb3JpdGhtIjogIlNIQTJfMjU2IiwKICAgICAgInB1YmxpY0tleSI6IHsKICAgICAgICAicmF3Qnl0ZXMiOiAiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFaVBTbEZpMENtRlRmRWpDVXFGOUh1Q0VjWVhOS0FhWWFsSUptQlo4eXllelBqVHFoeHJLQnBNbmFvY1Z0TEpCSTFlTTN1WG5RelFHQUpkSjRnczlGeXc9PSIsCiAgICAgICAgImtleURldGFpbHMiOiAiUEtJWF9FQ0RTQV9QMjU2X1NIQV8yNTYiLAogICAgICAgICJ2YWxpZEZvciI6IHsKICAgICAgICAgICJzdGFydCI6ICIyMDIyLTEwLTIwVDAwOjAwOjAwLjAwMFoiCiAgICAgICAgfQogICAgICB9LAogICAgICAibG9nSWQiOiB7CiAgICAgICAgImtleUlkIjogIjNUMHdhc2JIRVRKakdSNGNtV2MzQXFKS1hyamVQSzMvaDRweWdDOHA3bzQ9IgogICAgICB9CiAgICB9CiAgXSwKICAidGltZXN0YW1wQXV0aG9yaXRpZXMiOiBbCiAgICB7CiAgICAgICJzdWJqZWN0IjogewogICAgICAgICJvcmdhbml6YXRpb24iOiAiR2l0SHViLCBJbmMuIiwKICAgICAgICAiY29tbW9uTmFtZSI6ICJJbnRlcm5hbCBTZXJ2aWNlcyBSb290IgogICAgICB9LAogICAgICAiY2VydENoYWluIjogewogICAgICAgICJjZXJ0aWZpY2F0ZXMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJyYXdCeXRlcyI6ICJNSUlCM0RDQ0FXS2dBd0lCQWdJVWNoa05zSDM2WGEwNGIxTHFJYytxcjlEVmVjTXdDZ1lJS29aSXpqMEVBd013TWpFVk1CTUdBMVVFQ2hNTVIybDBTSFZpTENCSmJtTXVNUmt3RndZRFZRUURFeEJVVTBFZ2FXNTBaWEp0WldScFlYUmxNQjRYRFRJek1EUXhOREF3TURBd01Gb1hEVEkwTURReE16QXdNREF3TUZvd01qRVZNQk1HQTFVRUNoTU1SMmwwU0hWaUxDQkpibU11TVJrd0Z3WURWUVFERXhCVVUwRWdWR2x0WlhOMFlXMXdhVzVuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFVUQ1Wk5iU3FZTWQ2cjhxcE9PRVg5aWJHblpUOUdzdVhPaHIvZjhVOUZKdWdCR0V4S1lwNDBPVUxTMGVyalpXN3hWOXhWNTJObkpmNU9lRHE0ZTVaS3FOV01GUXdEZ1lEVlIwUEFRSC9CQVFEQWdlQU1CTUdBMVVkSlFRTU1Bb0dDQ3NHQVFVRkJ3TUlNQXdHQTFVZEV3RUIvd1FDTUFBd0h3WURWUjBqQkJnd0ZvQVVhVzFSdWRPZ1Z0MGxlcVkwV0tZYnVQcjQ3d0F3Q2dZSUtvWkl6ajBFQXdNRGFBQXdaUUl3YlVIOUh2RDRlakNaSk9XUW5xQWxrcVVSbGx2dTlNOCtWcUxiaVJLK3pTZlpDWndzaWxqUm44TVFRUlNrWEVFNUFqRUFnK1Z4cXRvamZWZnU4RGh6emhDeDlHS0VUYkpIYjE5aVY3Mm1NS1ViREFGbXpaNmJROGI1NFpiOHRpZHk1YVdlIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInJhd0J5dGVzIjogIk1JSUNFRENDQVpXZ0F3SUJBZ0lVWDhaTzVRWFA3dk40ZE1RNWU5c1UzbnViOE9nd0NnWUlLb1pJemowRUF3TXdPREVWTUJNR0ExVUVDaE1NUjJsMFNIVmlMQ0JKYm1NdU1SOHdIUVlEVlFRREV4WkpiblJsY201aGJDQlRaWEoyYVdObGN5QlNiMjkwTUI0WERUSXpNRFF4TkRBd01EQXdNRm9YRFRJNE1EUXhNakF3TURBd01Gb3dNakVWTUJNR0ExVUVDaE1NUjJsMFNIVmlMQ0JKYm1NdU1Sa3dGd1lEVlFRREV4QlVVMEVnYVc1MFpYSnRaV1JwWVhSbE1IWXdFQVlIS29aSXpqMENBUVlGSzRFRUFDSURZZ0FFdk1MWS9kVFZidklKWUFOQXVzekV3Sm5RRTFsbGZ0eW55TUtJTWhoNDhIbXFiVnI1eWd5YnpzTFJMVktiQldPZFoyMWFlSnorZ1ppeXRaZXRxY3lGOVdsRVI1TkVNZjZKVjdaTm9qUXB4SHE0UkhHb0dTY2VRdi9xdlRpWnhFREtvMll3WkRBT0JnTlZIUThCQWY4RUJBTUNBUVl3RWdZRFZSMFRBUUgvQkFnd0JnRUIvd0lCQURBZEJnTlZIUTRFRmdRVWFXMVJ1ZE9nVnQwbGVxWTBXS1lidVByNDd3QXdId1lEVlIwakJCZ3dGb0FVOU5ZWWxvYm5BRzRjMC9xanh5SC9scS93eitRd0NnWUlLb1pJemowRUF3TURhUUF3WmdJeEFLMUIxODV5Z0NySVlGbElzM0dqc3dqbndTTUc2TFk4d29MVmRha0tEWnhWYThmOGNxTXMxRGhjeEowKzA5dzk1UUl4QU8rdEJ6Wms3dmpVSjlpSmdENFI2WldUeFFXS3FObTc0ak85OW8rbzlzdjRGSS9TWlRaVEZ5TW4wSUpFSGRObXlBPT0iCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicmF3Qnl0ZXMiOiAiTUlJQjlEQ0NBWHFnQXdJQkFnSVVhL0pBa2RVaks0SlV3c3F0YWlSSkdXaHFMU293Q2dZSUtvWkl6ajBFQXdNd09ERVZNQk1HQTFVRUNoTU1SMmwwU0hWaUxDQkpibU11TVI4d0hRWURWUVFERXhaSmJuUmxjbTVoYkNCVFpYSjJhV05sY3lCU2IyOTBNQjRYRFRJek1EUXhOREF3TURBd01Gb1hEVE16TURReE1UQXdNREF3TUZvd09ERVZNQk1HQTFVRUNoTU1SMmwwU0hWaUxDQkpibU11TVI4d0hRWURWUVFERXhaSmJuUmxjbTVoYkNCVFpYSjJhV05sY3lCU2IyOTBNSFl3RUFZSEtvWkl6ajBDQVFZRks0RUVBQ0lEWWdBRWY5akZBWHh6NGt4NjhBSFJNT2tGQmhmbERjTVR2emFYejR4L0ZDY1hqSi8xcUVLb24vcVBJR25hVVJza0R0eU5iTkRPcGVKVERERnF0NDhpTVBybnpweDZJWndxZW1mVUpONHhCRVpmemErcFl0L2l5b2QrOXRacjIwUlJXU3YvbzBVd1F6QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0VnWURWUjBUQVFIL0JBZ3dCZ0VCL3dJQkFqQWRCZ05WSFE0RUZnUVU5TllZbG9ibkFHNGMwL3FqeHlIL2xxL3d6K1F3Q2dZSUtvWkl6ajBFQXdNRGFBQXdaUUl4QUxaTFo4QmdSWHpLeExNTU45VklsTytlNGhyQm5OQmdGN3R6N0hucm93djJOZXRaRXJJQUNLRnltQmx2V0R2dE1BSXdaTytraTZzc1ExYnNabzk4TzhtRUFmMk5aN2lpQ2dERFUwVndqZWNvNnp5ZWgwekJUczkvN2dWNkFITlE1M3hEIgogICAgICAgICAgfQogICAgICAgIF0KICAgICAgfSwKICAgICAgInZhbGlkRm9yIjogewogICAgICAgICJzdGFydCI6ICIyMDIzLTA0LTE0VDAwOjAwOjAwLjAwMFoiCiAgICAgIH0KICAgIH0KICBdCn0K","registry.npmjs.org%2Fkeys.json":"ewogICAgImtleXMiOiBbCiAgICAgICAgewogICAgICAgICAgICAia2V5SWQiOiAiU0hBMjU2OmpsM2J3c3d1ODBQampva0NnaDBvMnc1YzJVNExoUUFFNTdnajljejFrekEiLAogICAgICAgICAgICAia2V5VXNhZ2UiOiAibnBtOnNpZ25hdHVyZXMiLAogICAgICAgICAgICAicHVibGljS2V5IjogewogICAgICAgICAgICAgICAgInJhd0J5dGVzIjogIk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRTFPbGIzek1BRkZ4WEtIaUlrUU81Y0ozWWhsNWk2VVBwK0lodXRlQkpidUhjQTVVb2dLbzBFV3RsV3dXNktTYUtvVE5FWUw3SmxDUWlWbmtoQmt0VWdnPT0iLAogICAgICAgICAgICAgICAgImtleURldGFpbHMiOiAiUEtJWF9FQ0RTQV9QMjU2X1NIQV8yNTYiLAogICAgICAgICAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgICAgICAgICAgICJzdGFydCI6ICIxOTk5LTAxLTAxVDAwOjAwOjAwLjAwMFoiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgImtleUlkIjogIlNIQTI1NjpqbDNid3N3dTgwUGpqb2tDZ2gwbzJ3NWMyVTRMaFFBRTU3Z2o5Y3oxa3pBIiwKICAgICAgICAgICAgImtleVVzYWdlIjogIm5wbTphdHRlc3RhdGlvbnMiLAogICAgICAgICAgICAicHVibGljS2V5IjogewogICAgICAgICAgICAgICAgInJhd0J5dGVzIjogIk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRTFPbGIzek1BRkZ4WEtIaUlrUU81Y0ozWWhsNWk2VVBwK0lodXRlQkpidUhjQTVVb2dLbzBFV3RsV3dXNktTYUtvVE5FWUw3SmxDUWlWbmtoQmt0VWdnPT0iLAogICAgICAgICAgICAgICAgImtleURldGFpbHMiOiAiUEtJWF9FQ0RTQV9QMjU2X1NIQV8yNTYiLAogICAgICAgICAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgICAgICAgICAgICJzdGFydCI6ICIyMDIyLTEyLTAxVDAwOjAwOjAwLjAwMFoiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICBdCn0K"}}} diff --git a/deps/npm/node_modules/@sigstore/verify/dist/bundle/dsse.js b/deps/npm/node_modules/@sigstore/verify/dist/bundle/dsse.js deleted file mode 100644 index 193f875fd1014e..00000000000000 --- a/deps/npm/node_modules/@sigstore/verify/dist/bundle/dsse.js +++ /dev/null @@ -1,43 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.DSSESignatureContent = void 0; -/* -Copyright 2023 The Sigstore Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -const core_1 = require("@sigstore/core"); -class DSSESignatureContent { - constructor(env) { - this.env = env; - } - compareDigest(digest) { - return core_1.crypto.bufferEqual(digest, core_1.crypto.hash(this.env.payload)); - } - compareSignature(signature) { - return core_1.crypto.bufferEqual(signature, this.signature); - } - verifySignature(key) { - return core_1.crypto.verify(this.preAuthEncoding, key, this.signature); - } - get signature() { - return this.env.signatures.length > 0 - ? this.env.signatures[0].sig - : Buffer.from(''); - } - // DSSE Pre-Authentication Encoding - get preAuthEncoding() { - return core_1.dsse.preAuthEncoding(this.env.payloadType, this.env.payload); - } -} -exports.DSSESignatureContent = DSSESignatureContent; diff --git a/deps/npm/node_modules/@sigstore/verify/dist/bundle/index.js b/deps/npm/node_modules/@sigstore/verify/dist/bundle/index.js deleted file mode 100644 index 63f8d4c4998811..00000000000000 --- a/deps/npm/node_modules/@sigstore/verify/dist/bundle/index.js +++ /dev/null @@ -1,58 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.signatureContent = exports.toSignedEntity = void 0; -const core_1 = require("@sigstore/core"); -const dsse_1 = require("./dsse"); -const message_1 = require("./message"); -function toSignedEntity(bundle, artifact) { - const { tlogEntries, timestampVerificationData } = bundle.verificationMaterial; - const timestamps = []; - for (const entry of tlogEntries) { - timestamps.push({ - $case: 'transparency-log', - tlogEntry: entry, - }); - } - for (const ts of timestampVerificationData?.rfc3161Timestamps ?? []) { - timestamps.push({ - $case: 'timestamp-authority', - timestamp: core_1.RFC3161Timestamp.parse(ts.signedTimestamp), - }); - } - return { - signature: signatureContent(bundle, artifact), - key: key(bundle), - tlogEntries, - timestamps, - }; -} -exports.toSignedEntity = toSignedEntity; -function signatureContent(bundle, artifact) { - switch (bundle.content.$case) { - case 'dsseEnvelope': - return new dsse_1.DSSESignatureContent(bundle.content.dsseEnvelope); - case 'messageSignature': - return new message_1.MessageSignatureContent(bundle.content.messageSignature, artifact); - } -} -exports.signatureContent = signatureContent; -function key(bundle) { - switch (bundle.verificationMaterial.content.$case) { - case 'publicKey': - return { - $case: 'public-key', - hint: bundle.verificationMaterial.content.publicKey.hint, - }; - case 'x509CertificateChain': - return { - $case: 'certificate', - certificate: core_1.X509Certificate.parse(bundle.verificationMaterial.content.x509CertificateChain - .certificates[0].rawBytes), - }; - case 'certificate': - return { - $case: 'certificate', - certificate: core_1.X509Certificate.parse(bundle.verificationMaterial.content.certificate.rawBytes), - }; - } -} diff --git a/deps/npm/node_modules/@sigstore/verify/dist/key/index.js b/deps/npm/node_modules/@sigstore/verify/dist/key/index.js deleted file mode 100644 index 682a306803a991..00000000000000 --- a/deps/npm/node_modules/@sigstore/verify/dist/key/index.js +++ /dev/null @@ -1,72 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.verifyCertificate = exports.verifyPublicKey = void 0; -/* -Copyright 2023 The Sigstore Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -const core_1 = require("@sigstore/core"); -const error_1 = require("../error"); -const certificate_1 = require("./certificate"); -const sct_1 = require("./sct"); -const OID_FULCIO_ISSUER_V1 = '1.3.6.1.4.1.57264.1.1'; -const OID_FULCIO_ISSUER_V2 = '1.3.6.1.4.1.57264.1.8'; -function verifyPublicKey(hint, timestamps, trustMaterial) { - const key = trustMaterial.publicKey(hint); - timestamps.forEach((timestamp) => { - if (!key.validFor(timestamp)) { - throw new error_1.VerificationError({ - code: 'PUBLIC_KEY_ERROR', - message: `Public key is not valid for timestamp: ${timestamp.toISOString()}`, - }); - } - }); - return { key: key.publicKey }; -} -exports.verifyPublicKey = verifyPublicKey; -function verifyCertificate(leaf, timestamps, trustMaterial) { - // Check that leaf certificate chains to a trusted CA - const path = (0, certificate_1.verifyCertificateChain)(leaf, trustMaterial.certificateAuthorities); - // Check that ALL certificates are valid for ALL of the timestamps - const validForDate = timestamps.every((timestamp) => path.every((cert) => cert.validForDate(timestamp))); - if (!validForDate) { - throw new error_1.VerificationError({ - code: 'CERTIFICATE_ERROR', - message: 'certificate is not valid or expired at the specified date', - }); - } - return { - scts: (0, sct_1.verifySCTs)(path[0], path[1], trustMaterial.ctlogs), - signer: getSigner(path[0]), - }; -} -exports.verifyCertificate = verifyCertificate; -function getSigner(cert) { - let issuer; - const issuerExtension = cert.extension(OID_FULCIO_ISSUER_V2); - if (issuerExtension) { - issuer = issuerExtension.valueObj.subs?.[0]?.value.toString('ascii'); - } - else { - issuer = cert.extension(OID_FULCIO_ISSUER_V1)?.value.toString('ascii'); - } - const identity = { - extensions: { issuer }, - subjectAlternativeName: cert.subjectAltName, - }; - return { - key: core_1.crypto.createPublicKey(cert.publicKey), - identity, - }; -} diff --git a/deps/npm/node_modules/@sigstore/verify/dist/policy.js b/deps/npm/node_modules/@sigstore/verify/dist/policy.js deleted file mode 100644 index 731e5c83328475..00000000000000 --- a/deps/npm/node_modules/@sigstore/verify/dist/policy.js +++ /dev/null @@ -1,25 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.verifyExtensions = exports.verifySubjectAlternativeName = void 0; -const error_1 = require("./error"); -function verifySubjectAlternativeName(policyIdentity, signerIdentity) { - if (signerIdentity === undefined || !signerIdentity.match(policyIdentity)) { - throw new error_1.PolicyError({ - code: 'UNTRUSTED_SIGNER_ERROR', - message: `certificate identity error - expected ${policyIdentity}, got ${signerIdentity}`, - }); - } -} -exports.verifySubjectAlternativeName = verifySubjectAlternativeName; -function verifyExtensions(policyExtensions, signerExtensions = {}) { - let key; - for (key in policyExtensions) { - if (signerExtensions[key] !== policyExtensions[key]) { - throw new error_1.PolicyError({ - code: 'UNTRUSTED_SIGNER_ERROR', - message: `invalid certificate extension - expected ${key}=${policyExtensions[key]}, got ${key}=${signerExtensions[key]}`, - }); - } - } -} -exports.verifyExtensions = verifyExtensions; diff --git a/deps/npm/node_modules/@sigstore/verify/dist/timestamp/index.js b/deps/npm/node_modules/@sigstore/verify/dist/timestamp/index.js deleted file mode 100644 index 0da554f648d25e..00000000000000 --- a/deps/npm/node_modules/@sigstore/verify/dist/timestamp/index.js +++ /dev/null @@ -1,47 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.verifyTLogTimestamp = exports.verifyTSATimestamp = void 0; -const error_1 = require("../error"); -const checkpoint_1 = require("./checkpoint"); -const merkle_1 = require("./merkle"); -const set_1 = require("./set"); -const tsa_1 = require("./tsa"); -function verifyTSATimestamp(timestamp, data, timestampAuthorities) { - (0, tsa_1.verifyRFC3161Timestamp)(timestamp, data, timestampAuthorities); - return { - type: 'timestamp-authority', - logID: timestamp.signerSerialNumber, - timestamp: timestamp.signingTime, - }; -} -exports.verifyTSATimestamp = verifyTSATimestamp; -function verifyTLogTimestamp(entry, tlogAuthorities) { - let inclusionVerified = false; - if (isTLogEntryWithInclusionPromise(entry)) { - (0, set_1.verifyTLogSET)(entry, tlogAuthorities); - inclusionVerified = true; - } - if (isTLogEntryWithInclusionProof(entry)) { - (0, merkle_1.verifyMerkleInclusion)(entry); - (0, checkpoint_1.verifyCheckpoint)(entry, tlogAuthorities); - inclusionVerified = true; - } - if (!inclusionVerified) { - throw new error_1.VerificationError({ - code: 'TLOG_MISSING_INCLUSION_ERROR', - message: 'inclusion could not be verified', - }); - } - return { - type: 'transparency-log', - logID: entry.logId.keyId, - timestamp: new Date(Number(entry.integratedTime) * 1000), - }; -} -exports.verifyTLogTimestamp = verifyTLogTimestamp; -function isTLogEntryWithInclusionPromise(entry) { - return entry.inclusionPromise !== undefined; -} -function isTLogEntryWithInclusionProof(entry) { - return entry.inclusionProof !== undefined; -} diff --git a/deps/npm/node_modules/@sigstore/verify/dist/timestamp/set.js b/deps/npm/node_modules/@sigstore/verify/dist/timestamp/set.js deleted file mode 100644 index a6357c06999cba..00000000000000 --- a/deps/npm/node_modules/@sigstore/verify/dist/timestamp/set.js +++ /dev/null @@ -1,61 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.verifyTLogSET = void 0; -/* -Copyright 2023 The Sigstore Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -const core_1 = require("@sigstore/core"); -const error_1 = require("../error"); -const trust_1 = require("../trust"); -// Verifies the SET for the given entry against the list of trusted -// transparency logs. Returns true if the SET can be verified against at least -// one of the trusted logs; otherwise, returns false. -function verifyTLogSET(entry, tlogs) { - // Filter the list of tlog instances to only those which might be able to - // verify the SET - const validTLogs = (0, trust_1.filterTLogAuthorities)(tlogs, { - logID: entry.logId.keyId, - targetDate: new Date(Number(entry.integratedTime) * 1000), - }); - // Check to see if we can verify the SET against any of the valid tlogs - const verified = validTLogs.some((tlog) => { - // Re-create the original Rekor verification payload - const payload = toVerificationPayload(entry); - // Canonicalize the payload and turn into a buffer for verification - const data = Buffer.from(core_1.json.canonicalize(payload), 'utf8'); - // Extract the SET from the tlog entry - const signature = entry.inclusionPromise.signedEntryTimestamp; - return core_1.crypto.verify(data, tlog.publicKey, signature); - }); - if (!verified) { - throw new error_1.VerificationError({ - code: 'TLOG_INCLUSION_PROMISE_ERROR', - message: 'inclusion promise could not be verified', - }); - } -} -exports.verifyTLogSET = verifyTLogSET; -// Returns a properly formatted "VerificationPayload" for one of the -// transaction log entires in the given bundle which can be used for SET -// verification. -function toVerificationPayload(entry) { - const { integratedTime, logIndex, logId, canonicalizedBody } = entry; - return { - body: canonicalizedBody.toString('base64'), - integratedTime: Number(integratedTime), - logIndex: Number(logIndex), - logID: logId.keyId.toString('hex'), - }; -} diff --git a/deps/npm/node_modules/@sigstore/verify/dist/tlog/dsse.js b/deps/npm/node_modules/@sigstore/verify/dist/tlog/dsse.js deleted file mode 100644 index bf430e61dde563..00000000000000 --- a/deps/npm/node_modules/@sigstore/verify/dist/tlog/dsse.js +++ /dev/null @@ -1,58 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.verifyDSSETLogBody = void 0; -/* -Copyright 2023 The Sigstore Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -const error_1 = require("../error"); -// Compare the given intoto tlog entry to the given bundle -function verifyDSSETLogBody(tlogEntry, content) { - switch (tlogEntry.apiVersion) { - case '0.0.1': - return verifyDSSE001TLogBody(tlogEntry, content); - default: - throw new error_1.VerificationError({ - code: 'TLOG_BODY_ERROR', - message: `unsupported dsse version: ${tlogEntry.apiVersion}`, - }); - } -} -exports.verifyDSSETLogBody = verifyDSSETLogBody; -// Compare the given dsse v0.0.1 tlog entry to the given DSSE envelope. -function verifyDSSE001TLogBody(tlogEntry, content) { - // Ensure the bundle's DSSE only contains a single signature - if (tlogEntry.spec.signatures?.length !== 1) { - throw new error_1.VerificationError({ - code: 'TLOG_BODY_ERROR', - message: 'signature count mismatch', - }); - } - const tlogSig = tlogEntry.spec.signatures[0].signature; - // Ensure that the signature in the bundle's DSSE matches tlog entry - if (!content.compareSignature(Buffer.from(tlogSig, 'base64'))) - throw new error_1.VerificationError({ - code: 'TLOG_BODY_ERROR', - message: 'tlog entry signature mismatch', - }); - // Ensure the digest of the bundle's DSSE payload matches the digest in the - // tlog entry - const tlogHash = tlogEntry.spec.payloadHash?.value || ''; - if (!content.compareDigest(Buffer.from(tlogHash, 'hex'))) { - throw new error_1.VerificationError({ - code: 'TLOG_BODY_ERROR', - message: 'DSSE payload hash mismatch', - }); - } -} diff --git a/deps/npm/node_modules/@sigstore/verify/dist/tlog/index.js b/deps/npm/node_modules/@sigstore/verify/dist/tlog/index.js deleted file mode 100644 index adfc70ed51ad05..00000000000000 --- a/deps/npm/node_modules/@sigstore/verify/dist/tlog/index.js +++ /dev/null @@ -1,48 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.verifyTLogBody = void 0; -/* -Copyright 2023 The Sigstore Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -const error_1 = require("../error"); -const dsse_1 = require("./dsse"); -const hashedrekord_1 = require("./hashedrekord"); -const intoto_1 = require("./intoto"); -// Verifies that the given tlog entry matches the supplied signature content. -function verifyTLogBody(entry, sigContent) { - const { kind, version } = entry.kindVersion; - const body = JSON.parse(entry.canonicalizedBody.toString('utf8')); - if (kind !== body.kind || version !== body.apiVersion) { - throw new error_1.VerificationError({ - code: 'TLOG_BODY_ERROR', - message: `kind/version mismatch - expected: ${kind}/${version}, received: ${body.kind}/${body.apiVersion}`, - }); - } - switch (body.kind) { - case 'dsse': - return (0, dsse_1.verifyDSSETLogBody)(body, sigContent); - case 'intoto': - return (0, intoto_1.verifyIntotoTLogBody)(body, sigContent); - case 'hashedrekord': - return (0, hashedrekord_1.verifyHashedRekordTLogBody)(body, sigContent); - /* istanbul ignore next */ - default: - throw new error_1.VerificationError({ - code: 'TLOG_BODY_ERROR', - message: `unsupported kind: ${kind}`, - }); - } -} -exports.verifyTLogBody = verifyTLogBody; diff --git a/deps/npm/node_modules/@sigstore/verify/dist/trust/index.js b/deps/npm/node_modules/@sigstore/verify/dist/trust/index.js deleted file mode 100644 index 954de558415902..00000000000000 --- a/deps/npm/node_modules/@sigstore/verify/dist/trust/index.js +++ /dev/null @@ -1,84 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.toTrustMaterial = exports.filterTLogAuthorities = exports.filterCertAuthorities = void 0; -/* -Copyright 2023 The Sigstore Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -const core_1 = require("@sigstore/core"); -const protobuf_specs_1 = require("@sigstore/protobuf-specs"); -const error_1 = require("../error"); -const BEGINNING_OF_TIME = new Date(0); -const END_OF_TIME = new Date(8640000000000000); -var filter_1 = require("./filter"); -Object.defineProperty(exports, "filterCertAuthorities", { enumerable: true, get: function () { return filter_1.filterCertAuthorities; } }); -Object.defineProperty(exports, "filterTLogAuthorities", { enumerable: true, get: function () { return filter_1.filterTLogAuthorities; } }); -function toTrustMaterial(root, keys) { - const keyFinder = typeof keys === 'function' ? keys : keyLocator(keys); - return { - certificateAuthorities: root.certificateAuthorities.map(createCertAuthority), - timestampAuthorities: root.timestampAuthorities.map(createCertAuthority), - tlogs: root.tlogs.map(createTLogAuthority), - ctlogs: root.ctlogs.map(createTLogAuthority), - publicKey: keyFinder, - }; -} -exports.toTrustMaterial = toTrustMaterial; -function createTLogAuthority(tlogInstance) { - const keyDetails = tlogInstance.publicKey.keyDetails; - const keyType = keyDetails === protobuf_specs_1.PublicKeyDetails.PKCS1_RSA_PKCS1V5 || - keyDetails === protobuf_specs_1.PublicKeyDetails.PKIX_RSA_PKCS1V5 || - keyDetails === protobuf_specs_1.PublicKeyDetails.PKIX_RSA_PKCS1V15_2048_SHA256 || - keyDetails === protobuf_specs_1.PublicKeyDetails.PKIX_RSA_PKCS1V15_3072_SHA256 || - keyDetails === protobuf_specs_1.PublicKeyDetails.PKIX_RSA_PKCS1V15_4096_SHA256 - ? 'pkcs1' - : 'spki'; - return { - logID: tlogInstance.logId.keyId, - publicKey: core_1.crypto.createPublicKey(tlogInstance.publicKey.rawBytes, keyType), - validFor: { - start: tlogInstance.publicKey.validFor?.start || BEGINNING_OF_TIME, - end: tlogInstance.publicKey.validFor?.end || END_OF_TIME, - }, - }; -} -function createCertAuthority(ca) { - return { - certChain: ca.certChain.certificates.map((cert) => { - return core_1.X509Certificate.parse(cert.rawBytes); - }), - validFor: { - start: ca.validFor?.start || BEGINNING_OF_TIME, - end: ca.validFor?.end || END_OF_TIME, - }, - }; -} -function keyLocator(keys) { - return (hint) => { - const key = (keys || {})[hint]; - if (!key) { - throw new error_1.VerificationError({ - code: 'PUBLIC_KEY_ERROR', - message: `key not found: ${hint}`, - }); - } - return { - publicKey: core_1.crypto.createPublicKey(key.rawBytes), - validFor: (date) => { - return ((key.validFor?.start || BEGINNING_OF_TIME) <= date && - (key.validFor?.end || END_OF_TIME) >= date); - }, - }; - }; -} diff --git a/deps/npm/node_modules/@sigstore/verify/package.json b/deps/npm/node_modules/@sigstore/verify/package.json deleted file mode 100644 index cd0c845a797e47..00000000000000 --- a/deps/npm/node_modules/@sigstore/verify/package.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "@sigstore/verify", - "version": "1.2.1", - "description": "Verification of Sigstore signatures", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "scripts": { - "clean": "shx rm -rf dist *.tsbuildinfo", - "build": "tsc --build", - "test": "jest" - }, - "files": [ - "dist" - ], - "author": "bdehamer@github.com", - "license": "Apache-2.0", - "repository": { - "type": "git", - "url": "git+https://github.com/sigstore/sigstore-js.git" - }, - "bugs": { - "url": "https://github.com/sigstore/sigstore-js/issues" - }, - "homepage": "https://github.com/sigstore/sigstore-js/tree/main/packages/verify#readme", - "publishConfig": { - "provenance": true - }, - "dependencies": { - "@sigstore/protobuf-specs": "^0.3.2", - "@sigstore/bundle": "^2.3.2", - "@sigstore/core": "^1.1.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } -} diff --git a/deps/npm/node_modules/@tufjs/models/dist/utils/key.js b/deps/npm/node_modules/@tufjs/models/dist/utils/key.js deleted file mode 100644 index 1f795ba1a2733f..00000000000000 --- a/deps/npm/node_modules/@tufjs/models/dist/utils/key.js +++ /dev/null @@ -1,143 +0,0 @@ -"use strict"; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.getPublicKey = void 0; -const crypto_1 = __importDefault(require("crypto")); -const error_1 = require("../error"); -const oid_1 = require("./oid"); -const ASN1_TAG_SEQUENCE = 0x30; -const ANS1_TAG_BIT_STRING = 0x03; -const NULL_BYTE = 0x00; -const OID_EDDSA = '1.3.101.112'; -const OID_EC_PUBLIC_KEY = '1.2.840.10045.2.1'; -const OID_EC_CURVE_P256V1 = '1.2.840.10045.3.1.7'; -const PEM_HEADER = '-----BEGIN PUBLIC KEY-----'; -function getPublicKey(keyInfo) { - switch (keyInfo.keyType) { - case 'rsa': - return getRSAPublicKey(keyInfo); - case 'ed25519': - return getED25519PublicKey(keyInfo); - case 'ecdsa': - case 'ecdsa-sha2-nistp256': - case 'ecdsa-sha2-nistp384': - return getECDCSAPublicKey(keyInfo); - default: - throw new error_1.UnsupportedAlgorithmError(`Unsupported key type: ${keyInfo.keyType}`); - } -} -exports.getPublicKey = getPublicKey; -function getRSAPublicKey(keyInfo) { - // Only support PEM-encoded RSA keys - if (!keyInfo.keyVal.startsWith(PEM_HEADER)) { - throw new error_1.CryptoError('Invalid key format'); - } - const key = crypto_1.default.createPublicKey(keyInfo.keyVal); - switch (keyInfo.scheme) { - case 'rsassa-pss-sha256': - return { - key: key, - padding: crypto_1.default.constants.RSA_PKCS1_PSS_PADDING, - }; - default: - throw new error_1.UnsupportedAlgorithmError(`Unsupported RSA scheme: ${keyInfo.scheme}`); - } -} -function getED25519PublicKey(keyInfo) { - let key; - // If key is already PEM-encoded we can just parse it - if (keyInfo.keyVal.startsWith(PEM_HEADER)) { - key = crypto_1.default.createPublicKey(keyInfo.keyVal); - } - else { - // If key is not PEM-encoded it had better be hex - if (!isHex(keyInfo.keyVal)) { - throw new error_1.CryptoError('Invalid key format'); - } - key = crypto_1.default.createPublicKey({ - key: ed25519.hexToDER(keyInfo.keyVal), - format: 'der', - type: 'spki', - }); - } - return { key }; -} -function getECDCSAPublicKey(keyInfo) { - let key; - // If key is already PEM-encoded we can just parse it - if (keyInfo.keyVal.startsWith(PEM_HEADER)) { - key = crypto_1.default.createPublicKey(keyInfo.keyVal); - } - else { - // If key is not PEM-encoded it had better be hex - if (!isHex(keyInfo.keyVal)) { - throw new error_1.CryptoError('Invalid key format'); - } - key = crypto_1.default.createPublicKey({ - key: ecdsa.hexToDER(keyInfo.keyVal), - format: 'der', - type: 'spki', - }); - } - return { key }; -} -const ed25519 = { - // Translates a hex key into a crypto KeyObject - // https://keygen.sh/blog/how-to-use-hexadecimal-ed25519-keys-in-node/ - hexToDER: (hex) => { - const key = Buffer.from(hex, 'hex'); - const oid = (0, oid_1.encodeOIDString)(OID_EDDSA); - // Create a byte sequence containing the OID and key - const elements = Buffer.concat([ - Buffer.concat([ - Buffer.from([ASN1_TAG_SEQUENCE]), - Buffer.from([oid.length]), - oid, - ]), - Buffer.concat([ - Buffer.from([ANS1_TAG_BIT_STRING]), - Buffer.from([key.length + 1]), - Buffer.from([NULL_BYTE]), - key, - ]), - ]); - // Wrap up by creating a sequence of elements - const der = Buffer.concat([ - Buffer.from([ASN1_TAG_SEQUENCE]), - Buffer.from([elements.length]), - elements, - ]); - return der; - }, -}; -const ecdsa = { - hexToDER: (hex) => { - const key = Buffer.from(hex, 'hex'); - const bitString = Buffer.concat([ - Buffer.from([ANS1_TAG_BIT_STRING]), - Buffer.from([key.length + 1]), - Buffer.from([NULL_BYTE]), - key, - ]); - const oids = Buffer.concat([ - (0, oid_1.encodeOIDString)(OID_EC_PUBLIC_KEY), - (0, oid_1.encodeOIDString)(OID_EC_CURVE_P256V1), - ]); - const oidSequence = Buffer.concat([ - Buffer.from([ASN1_TAG_SEQUENCE]), - Buffer.from([oids.length]), - oids, - ]); - // Wrap up by creating a sequence of elements - const der = Buffer.concat([ - Buffer.from([ASN1_TAG_SEQUENCE]), - Buffer.from([oidSequence.length + bitString.length]), - oidSequence, - bitString, - ]); - return der; - }, -}; -const isHex = (key) => /^[0-9a-fA-F]+$/.test(key); diff --git a/deps/npm/node_modules/@tufjs/models/package.json b/deps/npm/node_modules/@tufjs/models/package.json deleted file mode 100644 index be581591a0f3a3..00000000000000 --- a/deps/npm/node_modules/@tufjs/models/package.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "name": "@tufjs/models", - "version": "2.0.1", - "description": "TUF metadata models", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "files": [ - "dist" - ], - "scripts": { - "build": "tsc --build", - "clean": "rm -rf dist && rm tsconfig.tsbuildinfo", - "test": "jest" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/theupdateframework/tuf-js.git" - }, - "keywords": [ - "tuf", - "security", - "update" - ], - "author": "bdehamer@github.com", - "license": "MIT", - "bugs": { - "url": "https://github.com/theupdateframework/tuf-js/issues" - }, - "homepage": "https://github.com/theupdateframework/tuf-js/tree/main/packages/models#readme", - "dependencies": { - "@tufjs/canonical-json": "2.0.0", - "minimatch": "^9.0.4" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } -} diff --git a/deps/npm/node_modules/ci-info/index.js b/deps/npm/node_modules/ci-info/index.js index 47907264581eb1..9eba6940c4147e 100644 --- a/deps/npm/node_modules/ci-info/index.js +++ b/deps/npm/node_modules/ci-info/index.js @@ -13,6 +13,7 @@ Object.defineProperty(exports, '_vendors', { exports.name = null exports.isPR = null +exports.id = null vendors.forEach(function (vendor) { const envs = Array.isArray(vendor.env) ? vendor.env : [vendor.env] @@ -27,45 +28,23 @@ vendors.forEach(function (vendor) { } exports.name = vendor.name - - switch (typeof vendor.pr) { - case 'string': - // "pr": "CIRRUS_PR" - exports.isPR = !!env[vendor.pr] - break - case 'object': - if ('env' in vendor.pr) { - // "pr": { "env": "BUILDKITE_PULL_REQUEST", "ne": "false" } - exports.isPR = vendor.pr.env in env && env[vendor.pr.env] !== vendor.pr.ne - } else if ('any' in vendor.pr) { - // "pr": { "any": ["ghprbPullId", "CHANGE_ID"] } - exports.isPR = vendor.pr.any.some(function (key) { - return !!env[key] - }) - } else { - // "pr": { "DRONE_BUILD_EVENT": "pull_request" } - exports.isPR = checkEnv(vendor.pr) - } - break - default: - // PR detection not supported for this vendor - exports.isPR = null - } + exports.isPR = checkPR(vendor) + exports.id = vendor.constant }) exports.isCI = !!( env.CI !== 'false' && // Bypass all checks if CI env is explicitly set to 'false' (env.BUILD_ID || // Jenkins, Cloudbees - env.BUILD_NUMBER || // Jenkins, TeamCity - env.CI || // Travis CI, CircleCI, Cirrus CI, Gitlab CI, Appveyor, CodeShip, dsari - env.CI_APP_ID || // Appflow - env.CI_BUILD_ID || // Appflow - env.CI_BUILD_NUMBER || // Appflow - env.CI_NAME || // Codeship and others - env.CONTINUOUS_INTEGRATION || // Travis CI, Cirrus CI - env.RUN_ID || // TaskCluster, dsari - exports.name || - false) + env.BUILD_NUMBER || // Jenkins, TeamCity + env.CI || // Travis CI, CircleCI, Cirrus CI, Gitlab CI, Appveyor, CodeShip, dsari + env.CI_APP_ID || // Appflow + env.CI_BUILD_ID || // Appflow + env.CI_BUILD_NUMBER || // Appflow + env.CI_NAME || // Codeship and others + env.CONTINUOUS_INTEGRATION || // Travis CI, Cirrus CI + env.RUN_ID || // TaskCluster, dsari + exports.name || + false) ) function checkEnv (obj) { @@ -79,12 +58,45 @@ function checkEnv (obj) { return env[obj.env] && env[obj.env].includes(obj.includes) // } } + if ('any' in obj) { return obj.any.some(function (k) { return !!env[k] }) } + return Object.keys(obj).every(function (k) { return env[k] === obj[k] }) } + +function checkPR (vendor) { + switch (typeof vendor.pr) { + case 'string': + // "pr": "CIRRUS_PR" + return !!env[vendor.pr] + case 'object': + if ('env' in vendor.pr) { + if ('any' in vendor.pr) { + // "pr": { "env": "CODEBUILD_WEBHOOK_EVENT", "any": ["PULL_REQUEST_CREATED", "PULL_REQUEST_UPDATED"] } + return vendor.pr.any.some(function (key) { + return env[vendor.pr.env] === key + }) + } else { + // "pr": { "env": "BUILDKITE_PULL_REQUEST", "ne": "false" } + return vendor.pr.env in env && env[vendor.pr.env] !== vendor.pr.ne + } + } else if ('any' in vendor.pr) { + // "pr": { "any": ["ghprbPullId", "CHANGE_ID"] } + return vendor.pr.any.some(function (key) { + return !!env[key] + }) + } else { + // "pr": { "DRONE_BUILD_EVENT": "pull_request" } + return checkEnv(vendor.pr) + } + default: + // PR detection not supported for this vendor + return null + } +} diff --git a/deps/npm/node_modules/ci-info/package.json b/deps/npm/node_modules/ci-info/package.json index 3c6b9e4adac8e8..156329d2ce379c 100644 --- a/deps/npm/node_modules/ci-info/package.json +++ b/deps/npm/node_modules/ci-info/package.json @@ -1,6 +1,6 @@ { "name": "ci-info", - "version": "4.0.0", + "version": "4.1.0", "description": "Get details about the current Continuous Integration environment", "main": "index.js", "typings": "index.d.ts", @@ -9,6 +9,18 @@ "repository": "https://github.com/watson/ci-info.git", "bugs": "https://github.com/watson/ci-info/issues", "homepage": "https://github.com/watson/ci-info", + "contributors": [ + { + "name": "Sibiraj", + "url": "https://github.com/sibiraj-s" + } + ], + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], "keywords": [ "ci", "continuous", @@ -22,22 +34,16 @@ "index.d.ts", "CHANGELOG.md" ], - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], "scripts": { "lint:fix": "standard --fix", "test": "standard && node test.js", - "prepare": "husky install" + "prepare": "husky install || true" }, "devDependencies": { "clear-module": "^4.1.2", - "husky": "^8.0.3", - "standard": "^17.1.0", - "tape": "^5.7.0" + "husky": "^9.1.6", + "standard": "^17.1.2", + "tape": "^5.9.0" }, "engines": { "node": ">=8" diff --git a/deps/npm/node_modules/ci-info/vendors.json b/deps/npm/node_modules/ci-info/vendors.json index 6b65e3f9b541f8..64d5924d1a557e 100644 --- a/deps/npm/node_modules/ci-info/vendors.json +++ b/deps/npm/node_modules/ci-info/vendors.json @@ -8,7 +8,11 @@ { "name": "Appcircle", "constant": "APPCIRCLE", - "env": "AC_APPCIRCLE" + "env": "AC_APPCIRCLE", + "pr": { + "env": "AC_GIT_PR", + "ne": "false" + } }, { "name": "AppVeyor", @@ -19,7 +23,15 @@ { "name": "AWS CodeBuild", "constant": "CODEBUILD", - "env": "CODEBUILD_BUILD_ARN" + "env": "CODEBUILD_BUILD_ARN", + "pr": { + "env": "CODEBUILD_WEBHOOK_EVENT", + "any": [ + "PULL_REQUEST_CREATED", + "PULL_REQUEST_UPDATED", + "PULL_REQUEST_REOPENED" + ] + } }, { "name": "Azure Pipelines", diff --git a/deps/npm/node_modules/cross-spawn/lib/enoent.js b/deps/npm/node_modules/cross-spawn/lib/enoent.js index 14df9b623d0a20..da33471369c23f 100644 --- a/deps/npm/node_modules/cross-spawn/lib/enoent.js +++ b/deps/npm/node_modules/cross-spawn/lib/enoent.js @@ -24,7 +24,7 @@ function hookChildProcess(cp, parsed) { // the command exists and emit an "error" instead // See https://github.com/IndigoUnited/node-cross-spawn/issues/16 if (name === 'exit') { - const err = verifyENOENT(arg1, parsed, 'spawn'); + const err = verifyENOENT(arg1, parsed); if (err) { return originalEmit.call(cp, 'error', err); diff --git a/deps/npm/node_modules/cross-spawn/lib/util/escape.js b/deps/npm/node_modules/cross-spawn/lib/util/escape.js index b0bb84c3a14092..7bf2905cd035ad 100644 --- a/deps/npm/node_modules/cross-spawn/lib/util/escape.js +++ b/deps/npm/node_modules/cross-spawn/lib/util/escape.js @@ -15,15 +15,17 @@ function escapeArgument(arg, doubleEscapeMetaChars) { arg = `${arg}`; // Algorithm below is based on https://qntm.org/cmd + // It's slightly altered to disable JS backtracking to avoid hanging on specially crafted input + // Please see https://github.com/moxystudio/node-cross-spawn/pull/160 for more information // Sequence of backslashes followed by a double quote: // double up all the backslashes and escape the double quote - arg = arg.replace(/(\\*)"/g, '$1$1\\"'); + arg = arg.replace(/(?=(\\+?)?)\1"/g, '$1$1\\"'); // Sequence of backslashes followed by the end of the string // (which will become a double quote later): // double up all the backslashes - arg = arg.replace(/(\\*)$/, '$1$1'); + arg = arg.replace(/(?=(\\+?)?)\1$/, '$1$1'); // All other backslashes occur literally diff --git a/deps/npm/node_modules/cross-spawn/package.json b/deps/npm/node_modules/cross-spawn/package.json index 232ff97e04b213..24b2eb4c9900cf 100644 --- a/deps/npm/node_modules/cross-spawn/package.json +++ b/deps/npm/node_modules/cross-spawn/package.json @@ -1,6 +1,6 @@ { "name": "cross-spawn", - "version": "7.0.3", + "version": "7.0.6", "description": "Cross platform child_process#spawn and child_process#spawnSync", "keywords": [ "spawn", @@ -65,7 +65,7 @@ "lint-staged": "^9.2.5", "mkdirp": "^0.5.1", "rimraf": "^3.0.0", - "standard-version": "^7.0.0" + "standard-version": "^9.5.0" }, "engines": { "node": ">= 8" diff --git a/deps/npm/node_modules/debug/node_modules/ms/index.js b/deps/npm/node_modules/debug/node_modules/ms/index.js deleted file mode 100644 index c4498bcc212589..00000000000000 --- a/deps/npm/node_modules/debug/node_modules/ms/index.js +++ /dev/null @@ -1,162 +0,0 @@ -/** - * Helpers. - */ - -var s = 1000; -var m = s * 60; -var h = m * 60; -var d = h * 24; -var w = d * 7; -var y = d * 365.25; - -/** - * Parse or format the given `val`. - * - * Options: - * - * - `long` verbose formatting [false] - * - * @param {String|Number} val - * @param {Object} [options] - * @throws {Error} throw an error if val is not a non-empty string or a number - * @return {String|Number} - * @api public - */ - -module.exports = function(val, options) { - options = options || {}; - var type = typeof val; - if (type === 'string' && val.length > 0) { - return parse(val); - } else if (type === 'number' && isFinite(val)) { - return options.long ? fmtLong(val) : fmtShort(val); - } - throw new Error( - 'val is not a non-empty string or a valid number. val=' + - JSON.stringify(val) - ); -}; - -/** - * Parse the given `str` and return milliseconds. - * - * @param {String} str - * @return {Number} - * @api private - */ - -function parse(str) { - str = String(str); - if (str.length > 100) { - return; - } - var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec( - str - ); - if (!match) { - return; - } - var n = parseFloat(match[1]); - var type = (match[2] || 'ms').toLowerCase(); - switch (type) { - case 'years': - case 'year': - case 'yrs': - case 'yr': - case 'y': - return n * y; - case 'weeks': - case 'week': - case 'w': - return n * w; - case 'days': - case 'day': - case 'd': - return n * d; - case 'hours': - case 'hour': - case 'hrs': - case 'hr': - case 'h': - return n * h; - case 'minutes': - case 'minute': - case 'mins': - case 'min': - case 'm': - return n * m; - case 'seconds': - case 'second': - case 'secs': - case 'sec': - case 's': - return n * s; - case 'milliseconds': - case 'millisecond': - case 'msecs': - case 'msec': - case 'ms': - return n; - default: - return undefined; - } -} - -/** - * Short format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function fmtShort(ms) { - var msAbs = Math.abs(ms); - if (msAbs >= d) { - return Math.round(ms / d) + 'd'; - } - if (msAbs >= h) { - return Math.round(ms / h) + 'h'; - } - if (msAbs >= m) { - return Math.round(ms / m) + 'm'; - } - if (msAbs >= s) { - return Math.round(ms / s) + 's'; - } - return ms + 'ms'; -} - -/** - * Long format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function fmtLong(ms) { - var msAbs = Math.abs(ms); - if (msAbs >= d) { - return plural(ms, msAbs, d, 'day'); - } - if (msAbs >= h) { - return plural(ms, msAbs, h, 'hour'); - } - if (msAbs >= m) { - return plural(ms, msAbs, m, 'minute'); - } - if (msAbs >= s) { - return plural(ms, msAbs, s, 'second'); - } - return ms + ' ms'; -} - -/** - * Pluralization helper. - */ - -function plural(ms, msAbs, n, name) { - var isPlural = msAbs >= n * 1.5; - return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : ''); -} diff --git a/deps/npm/node_modules/debug/node_modules/ms/license.md b/deps/npm/node_modules/debug/node_modules/ms/license.md deleted file mode 100644 index 69b61253a38926..00000000000000 --- a/deps/npm/node_modules/debug/node_modules/ms/license.md +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2016 Zeit, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/deps/npm/node_modules/debug/node_modules/ms/package.json b/deps/npm/node_modules/debug/node_modules/ms/package.json deleted file mode 100644 index eea666e1fb03d6..00000000000000 --- a/deps/npm/node_modules/debug/node_modules/ms/package.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "name": "ms", - "version": "2.1.2", - "description": "Tiny millisecond conversion utility", - "repository": "zeit/ms", - "main": "./index", - "files": [ - "index.js" - ], - "scripts": { - "precommit": "lint-staged", - "lint": "eslint lib/* bin/*", - "test": "mocha tests.js" - }, - "eslintConfig": { - "extends": "eslint:recommended", - "env": { - "node": true, - "es6": true - } - }, - "lint-staged": { - "*.js": [ - "npm run lint", - "prettier --single-quote --write", - "git add" - ] - }, - "license": "MIT", - "devDependencies": { - "eslint": "4.12.1", - "expect.js": "0.3.1", - "husky": "0.14.3", - "lint-staged": "5.0.0", - "mocha": "4.0.1" - } -} diff --git a/deps/npm/node_modules/debug/package.json b/deps/npm/node_modules/debug/package.json index 8eea05520554eb..2f782eb9aef450 100644 --- a/deps/npm/node_modules/debug/package.json +++ b/deps/npm/node_modules/debug/package.json @@ -1,6 +1,6 @@ { "name": "debug", - "version": "4.3.6", + "version": "4.3.7", "repository": { "type": "git", "url": "git://github.com/debug-js/debug.git" @@ -31,7 +31,7 @@ "test:coverage": "cat ./coverage/lcov.info | coveralls" }, "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "devDependencies": { "brfs": "^2.0.1", diff --git a/deps/npm/node_modules/hosted-git-info/lib/hosts.js b/deps/npm/node_modules/hosted-git-info/lib/hosts.js index 9a08efd1b2d7e9..2a88e95927772a 100644 --- a/deps/npm/node_modules/hosted-git-info/lib/hosts.js +++ b/deps/npm/node_modules/hosted-git-info/lib/hosts.js @@ -4,7 +4,11 @@ const maybeJoin = (...args) => args.every(arg => arg) ? args.join('') : '' const maybeEncode = (arg) => arg ? encodeURIComponent(arg) : '' -const formatHashFragment = (f) => f.toLowerCase().replace(/^\W+|\/|\W+$/g, '').replace(/\W+/g, '-') +const formatHashFragment = (f) => f.toLowerCase() + .replace(/^\W+/g, '') // strip leading non-characters + .replace(/(? diff --git a/deps/npm/node_modules/hosted-git-info/package.json b/deps/npm/node_modules/hosted-git-info/package.json index 3bb8bcd1f49825..78356159af7723 100644 --- a/deps/npm/node_modules/hosted-git-info/package.json +++ b/deps/npm/node_modules/hosted-git-info/package.json @@ -1,6 +1,6 @@ { "name": "hosted-git-info", - "version": "8.0.0", + "version": "8.0.2", "description": "Provides metadata and conversions from repository urls for GitHub, Bitbucket and GitLab", "main": "./lib/index.js", "repository": { @@ -35,7 +35,7 @@ }, "devDependencies": { "@npmcli/eslint-config": "^5.0.0", - "@npmcli/template-oss": "4.23.3", + "@npmcli/template-oss": "4.23.4", "tap": "^16.0.1" }, "files": [ @@ -55,7 +55,7 @@ }, "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.23.3", + "version": "4.23.4", "publish": "true" } } diff --git a/deps/npm/node_modules/init-package-json/lib/default-input.js b/deps/npm/node_modules/init-package-json/lib/default-input.js index 490e83c139887f..0a01bfa05fa45c 100644 --- a/deps/npm/node_modules/init-package-json/lib/default-input.js +++ b/deps/npm/node_modules/init-package-json/lib/default-input.js @@ -199,16 +199,17 @@ if (!package.scripts) { if (!package.repository) { exports.repository = async () => { - const gconf = await fs.readFile('.git/config', 'utf8').catch(() => '') + const gitConfigPath = path.resolve(dirname, '.git', 'config') + const gconf = await fs.readFile(gitConfigPath, 'utf8').catch(() => '') const lines = gconf.split(/\r?\n/) let url const i = lines.indexOf('[remote "origin"]') if (i !== -1) { - url = gconf[i + 1] + url = lines[i + 1] if (!url.match(/^\s*url =/)) { - url = gconf[i + 2] + url = lines[i + 2] } if (!url.match(/^\s*url =/)) { url = null diff --git a/deps/npm/node_modules/init-package-json/package.json b/deps/npm/node_modules/init-package-json/package.json index 21021ab701244b..d1de96476a9f14 100644 --- a/deps/npm/node_modules/init-package-json/package.json +++ b/deps/npm/node_modules/init-package-json/package.json @@ -1,6 +1,6 @@ { "name": "init-package-json", - "version": "7.0.1", + "version": "7.0.2", "main": "lib/init-package-json.js", "scripts": { "test": "tap", diff --git a/deps/npm/node_modules/is-lambda/LICENSE b/deps/npm/node_modules/is-lambda/LICENSE deleted file mode 100644 index 4a59c94175c2a3..00000000000000 --- a/deps/npm/node_modules/is-lambda/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2016-2017 Thomas Watson Steen - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/deps/npm/node_modules/is-lambda/index.js b/deps/npm/node_modules/is-lambda/index.js deleted file mode 100644 index b245ab1c68df1a..00000000000000 --- a/deps/npm/node_modules/is-lambda/index.js +++ /dev/null @@ -1,6 +0,0 @@ -'use strict' - -module.exports = !!( - (process.env.LAMBDA_TASK_ROOT && process.env.AWS_EXECUTION_ENV) || - false -) diff --git a/deps/npm/node_modules/is-lambda/package.json b/deps/npm/node_modules/is-lambda/package.json deleted file mode 100644 index d8550898b4e4d9..00000000000000 --- a/deps/npm/node_modules/is-lambda/package.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "is-lambda", - "version": "1.0.1", - "description": "Detect if your code is running on an AWS Lambda server", - "main": "index.js", - "dependencies": {}, - "devDependencies": { - "clear-require": "^1.0.1", - "standard": "^10.0.2" - }, - "scripts": { - "test": "standard && node test.js" - }, - "repository": { - "type": "git", - "url": "https://github.com/watson/is-lambda.git" - }, - "keywords": [ - "aws", - "hosting", - "hosted", - "lambda", - "detect" - ], - "author": "Thomas Watson Steen (https://twitter.com/wa7son)", - "license": "MIT", - "bugs": { - "url": "https://github.com/watson/is-lambda/issues" - }, - "homepage": "https://github.com/watson/is-lambda", - "coordinates": [ - 37.3859955, - -122.0838831 - ] -} diff --git a/deps/npm/node_modules/is-lambda/test.js b/deps/npm/node_modules/is-lambda/test.js deleted file mode 100644 index e8e73257ad4ad7..00000000000000 --- a/deps/npm/node_modules/is-lambda/test.js +++ /dev/null @@ -1,16 +0,0 @@ -'use strict' - -var assert = require('assert') -var clearRequire = require('clear-require') - -process.env.AWS_EXECUTION_ENV = 'AWS_Lambda_nodejs6.10' -process.env.LAMBDA_TASK_ROOT = '/var/task' - -var isCI = require('./') -assert(isCI) - -delete process.env.AWS_EXECUTION_ENV - -clearRequire('./') -isCI = require('./') -assert(!isCI) diff --git a/deps/npm/node_modules/libnpmpublish/lib/publish.js b/deps/npm/node_modules/libnpmpublish/lib/publish.js index 93d546efb5f0e1..2bcab4f3ba304e 100644 --- a/deps/npm/node_modules/libnpmpublish/lib/publish.js +++ b/deps/npm/node_modules/libnpmpublish/lib/publish.js @@ -137,7 +137,7 @@ const buildMetadata = async (registry, manifest, tarballData, spec, opts) => { if (provenance === true) { await ensureProvenanceGeneration(registry, spec, opts) - provenanceBundle = await generateProvenance([subject], opts) + provenanceBundle = await generateProvenance([subject], { legacyCompatibility: true, ...opts }) /* eslint-disable-next-line max-len */ log.notice('publish', `Signed provenance statement with source and build information from ${ciInfo.name}`) diff --git a/deps/npm/node_modules/libnpmpublish/package.json b/deps/npm/node_modules/libnpmpublish/package.json index f63d50f4e7b9c1..594f5041480b4a 100644 --- a/deps/npm/node_modules/libnpmpublish/package.json +++ b/deps/npm/node_modules/libnpmpublish/package.json @@ -1,6 +1,6 @@ { "name": "libnpmpublish", - "version": "10.0.0", + "version": "10.0.1", "description": "Programmatic API for the bits behind npm publish and unpublish", "author": "GitHub Inc.", "main": "lib/index.js", @@ -45,7 +45,7 @@ "npm-registry-fetch": "^18.0.1", "proc-log": "^5.0.0", "semver": "^7.3.7", - "sigstore": "^2.2.0", + "sigstore": "^3.0.0", "ssri": "^12.0.0" }, "engines": { diff --git a/deps/npm/node_modules/make-fetch-happen/lib/options.js b/deps/npm/node_modules/make-fetch-happen/lib/options.js index f77511279f831d..db51cc63248176 100644 --- a/deps/npm/node_modules/make-fetch-happen/lib/options.js +++ b/deps/npm/node_modules/make-fetch-happen/lib/options.js @@ -11,7 +11,12 @@ const conditionalHeaders = [ const configureOptions = (opts) => { const { strictSSL, ...options } = { ...opts } options.method = options.method ? options.method.toUpperCase() : 'GET' - options.rejectUnauthorized = strictSSL !== false + + if (strictSSL === undefined || strictSSL === null) { + options.rejectUnauthorized = process.env.NODE_TLS_REJECT_UNAUTHORIZED !== '0' + } else { + options.rejectUnauthorized = strictSSL !== false + } if (!options.retry) { options.retry = { retries: 0 } diff --git a/deps/npm/node_modules/make-fetch-happen/lib/remote.js b/deps/npm/node_modules/make-fetch-happen/lib/remote.js index 8554564074de6e..1d640e5380baaf 100644 --- a/deps/npm/node_modules/make-fetch-happen/lib/remote.js +++ b/deps/npm/node_modules/make-fetch-happen/lib/remote.js @@ -35,7 +35,8 @@ const RETRY_TYPES = [ // following redirects (through the cache if necessary) // and verifying response integrity const remoteFetch = (request, options) => { - const agent = getAgent(request.url, options) + // options.signal is intended for the fetch itself, not the agent. Attaching it to the agent will re-use that signal across multiple requests, which prevents any connections beyond the first one. + const agent = getAgent(request.url, { ...options, signal: undefined }) if (!request.headers.has('connection')) { request.headers.set('connection', agent ? 'keep-alive' : 'close') } diff --git a/deps/npm/node_modules/negotiator/HISTORY.md b/deps/npm/node_modules/make-fetch-happen/node_modules/negotiator/HISTORY.md similarity index 95% rename from deps/npm/node_modules/negotiator/HISTORY.md rename to deps/npm/node_modules/make-fetch-happen/node_modules/negotiator/HISTORY.md index a9a544914c43bb..63d537d3f68114 100644 --- a/deps/npm/node_modules/negotiator/HISTORY.md +++ b/deps/npm/node_modules/make-fetch-happen/node_modules/negotiator/HISTORY.md @@ -1,3 +1,9 @@ +1.0.0 / 2024-08-31 +================== + + * Drop support for node <18 + * Added an option preferred encodings array #59 + 0.6.3 / 2022-01-22 ================== diff --git a/deps/npm/node_modules/negotiator/LICENSE b/deps/npm/node_modules/make-fetch-happen/node_modules/negotiator/LICENSE similarity index 100% rename from deps/npm/node_modules/negotiator/LICENSE rename to deps/npm/node_modules/make-fetch-happen/node_modules/negotiator/LICENSE diff --git a/deps/npm/node_modules/make-fetch-happen/node_modules/negotiator/index.js b/deps/npm/node_modules/make-fetch-happen/node_modules/negotiator/index.js new file mode 100644 index 00000000000000..4f51315d6af4bd --- /dev/null +++ b/deps/npm/node_modules/make-fetch-happen/node_modules/negotiator/index.js @@ -0,0 +1,83 @@ +/*! + * negotiator + * Copyright(c) 2012 Federico Romero + * Copyright(c) 2012-2014 Isaac Z. Schlueter + * Copyright(c) 2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict'; + +var preferredCharsets = require('./lib/charset') +var preferredEncodings = require('./lib/encoding') +var preferredLanguages = require('./lib/language') +var preferredMediaTypes = require('./lib/mediaType') + +/** + * Module exports. + * @public + */ + +module.exports = Negotiator; +module.exports.Negotiator = Negotiator; + +/** + * Create a Negotiator instance from a request. + * @param {object} request + * @public + */ + +function Negotiator(request) { + if (!(this instanceof Negotiator)) { + return new Negotiator(request); + } + + this.request = request; +} + +Negotiator.prototype.charset = function charset(available) { + var set = this.charsets(available); + return set && set[0]; +}; + +Negotiator.prototype.charsets = function charsets(available) { + return preferredCharsets(this.request.headers['accept-charset'], available); +}; + +Negotiator.prototype.encoding = function encoding(available, opts) { + var set = this.encodings(available, opts); + return set && set[0]; +}; + +Negotiator.prototype.encodings = function encodings(available, options) { + var opts = options || {}; + return preferredEncodings(this.request.headers['accept-encoding'], available, opts.preferred); +}; + +Negotiator.prototype.language = function language(available) { + var set = this.languages(available); + return set && set[0]; +}; + +Negotiator.prototype.languages = function languages(available) { + return preferredLanguages(this.request.headers['accept-language'], available); +}; + +Negotiator.prototype.mediaType = function mediaType(available) { + var set = this.mediaTypes(available); + return set && set[0]; +}; + +Negotiator.prototype.mediaTypes = function mediaTypes(available) { + return preferredMediaTypes(this.request.headers.accept, available); +}; + +// Backwards compatibility +Negotiator.prototype.preferredCharset = Negotiator.prototype.charset; +Negotiator.prototype.preferredCharsets = Negotiator.prototype.charsets; +Negotiator.prototype.preferredEncoding = Negotiator.prototype.encoding; +Negotiator.prototype.preferredEncodings = Negotiator.prototype.encodings; +Negotiator.prototype.preferredLanguage = Negotiator.prototype.language; +Negotiator.prototype.preferredLanguages = Negotiator.prototype.languages; +Negotiator.prototype.preferredMediaType = Negotiator.prototype.mediaType; +Negotiator.prototype.preferredMediaTypes = Negotiator.prototype.mediaTypes; diff --git a/deps/npm/node_modules/negotiator/lib/charset.js b/deps/npm/node_modules/make-fetch-happen/node_modules/negotiator/lib/charset.js similarity index 100% rename from deps/npm/node_modules/negotiator/lib/charset.js rename to deps/npm/node_modules/make-fetch-happen/node_modules/negotiator/lib/charset.js diff --git a/deps/npm/node_modules/make-fetch-happen/node_modules/negotiator/lib/encoding.js b/deps/npm/node_modules/make-fetch-happen/node_modules/negotiator/lib/encoding.js new file mode 100644 index 00000000000000..9ebb633d677433 --- /dev/null +++ b/deps/npm/node_modules/make-fetch-happen/node_modules/negotiator/lib/encoding.js @@ -0,0 +1,205 @@ +/** + * negotiator + * Copyright(c) 2012 Isaac Z. Schlueter + * Copyright(c) 2014 Federico Romero + * Copyright(c) 2014-2015 Douglas Christopher Wilson + * MIT Licensed + */ + +'use strict'; + +/** + * Module exports. + * @public + */ + +module.exports = preferredEncodings; +module.exports.preferredEncodings = preferredEncodings; + +/** + * Module variables. + * @private + */ + +var simpleEncodingRegExp = /^\s*([^\s;]+)\s*(?:;(.*))?$/; + +/** + * Parse the Accept-Encoding header. + * @private + */ + +function parseAcceptEncoding(accept) { + var accepts = accept.split(','); + var hasIdentity = false; + var minQuality = 1; + + for (var i = 0, j = 0; i < accepts.length; i++) { + var encoding = parseEncoding(accepts[i].trim(), i); + + if (encoding) { + accepts[j++] = encoding; + hasIdentity = hasIdentity || specify('identity', encoding); + minQuality = Math.min(minQuality, encoding.q || 1); + } + } + + if (!hasIdentity) { + /* + * If identity doesn't explicitly appear in the accept-encoding header, + * it's added to the list of acceptable encoding with the lowest q + */ + accepts[j++] = { + encoding: 'identity', + q: minQuality, + i: i + }; + } + + // trim accepts + accepts.length = j; + + return accepts; +} + +/** + * Parse an encoding from the Accept-Encoding header. + * @private + */ + +function parseEncoding(str, i) { + var match = simpleEncodingRegExp.exec(str); + if (!match) return null; + + var encoding = match[1]; + var q = 1; + if (match[2]) { + var params = match[2].split(';'); + for (var j = 0; j < params.length; j++) { + var p = params[j].trim().split('='); + if (p[0] === 'q') { + q = parseFloat(p[1]); + break; + } + } + } + + return { + encoding: encoding, + q: q, + i: i + }; +} + +/** + * Get the priority of an encoding. + * @private + */ + +function getEncodingPriority(encoding, accepted, index) { + var priority = {encoding: encoding, o: -1, q: 0, s: 0}; + + for (var i = 0; i < accepted.length; i++) { + var spec = specify(encoding, accepted[i], index); + + if (spec && (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0) { + priority = spec; + } + } + + return priority; +} + +/** + * Get the specificity of the encoding. + * @private + */ + +function specify(encoding, spec, index) { + var s = 0; + if(spec.encoding.toLowerCase() === encoding.toLowerCase()){ + s |= 1; + } else if (spec.encoding !== '*' ) { + return null + } + + return { + encoding: encoding, + i: index, + o: spec.i, + q: spec.q, + s: s + } +}; + +/** + * Get the preferred encodings from an Accept-Encoding header. + * @public + */ + +function preferredEncodings(accept, provided, preferred) { + var accepts = parseAcceptEncoding(accept || ''); + + var comparator = preferred ? function comparator (a, b) { + if (a.q !== b.q) { + return b.q - a.q // higher quality first + } + + var aPreferred = preferred.indexOf(a.encoding) + var bPreferred = preferred.indexOf(b.encoding) + + if (aPreferred === -1 && bPreferred === -1) { + // consider the original specifity/order + return (b.s - a.s) || (a.o - b.o) || (a.i - b.i) + } + + if (aPreferred !== -1 && bPreferred !== -1) { + return aPreferred - bPreferred // consider the preferred order + } + + return aPreferred === -1 ? 1 : -1 // preferred first + } : compareSpecs; + + if (!provided) { + // sorted list of all encodings + return accepts + .filter(isQuality) + .sort(comparator) + .map(getFullEncoding); + } + + var priorities = provided.map(function getPriority(type, index) { + return getEncodingPriority(type, accepts, index); + }); + + // sorted list of accepted encodings + return priorities.filter(isQuality).sort(comparator).map(function getEncoding(priority) { + return provided[priorities.indexOf(priority)]; + }); +} + +/** + * Compare two specs. + * @private + */ + +function compareSpecs(a, b) { + return (b.q - a.q) || (b.s - a.s) || (a.o - b.o) || (a.i - b.i); +} + +/** + * Get full encoding string. + * @private + */ + +function getFullEncoding(spec) { + return spec.encoding; +} + +/** + * Check if a spec has any quality. + * @private + */ + +function isQuality(spec) { + return spec.q > 0; +} diff --git a/deps/npm/node_modules/negotiator/lib/language.js b/deps/npm/node_modules/make-fetch-happen/node_modules/negotiator/lib/language.js similarity index 100% rename from deps/npm/node_modules/negotiator/lib/language.js rename to deps/npm/node_modules/make-fetch-happen/node_modules/negotiator/lib/language.js diff --git a/deps/npm/node_modules/negotiator/lib/mediaType.js b/deps/npm/node_modules/make-fetch-happen/node_modules/negotiator/lib/mediaType.js similarity index 98% rename from deps/npm/node_modules/negotiator/lib/mediaType.js rename to deps/npm/node_modules/make-fetch-happen/node_modules/negotiator/lib/mediaType.js index 67309dd75f1b62..8e402ea88394c0 100644 --- a/deps/npm/node_modules/negotiator/lib/mediaType.js +++ b/deps/npm/node_modules/make-fetch-happen/node_modules/negotiator/lib/mediaType.js @@ -69,7 +69,7 @@ function parseMediaType(str, i) { // get the value, unwrapping quotes var value = val && val[0] === '"' && val[val.length - 1] === '"' - ? val.substr(1, val.length - 2) + ? val.slice(1, -1) : val; if (key === 'q') { @@ -238,8 +238,8 @@ function splitKeyValuePair(str) { if (index === -1) { key = str; } else { - key = str.substr(0, index); - val = str.substr(index + 1); + key = str.slice(0, index); + val = str.slice(index + 1); } return [key, val]; diff --git a/deps/npm/node_modules/make-fetch-happen/node_modules/negotiator/package.json b/deps/npm/node_modules/make-fetch-happen/node_modules/negotiator/package.json new file mode 100644 index 00000000000000..e4bdc1ef4f7481 --- /dev/null +++ b/deps/npm/node_modules/make-fetch-happen/node_modules/negotiator/package.json @@ -0,0 +1,43 @@ +{ + "name": "negotiator", + "description": "HTTP content negotiation", + "version": "1.0.0", + "contributors": [ + "Douglas Christopher Wilson ", + "Federico Romero ", + "Isaac Z. Schlueter (http://blog.izs.me/)" + ], + "license": "MIT", + "keywords": [ + "http", + "content negotiation", + "accept", + "accept-language", + "accept-encoding", + "accept-charset" + ], + "repository": "jshttp/negotiator", + "devDependencies": { + "eslint": "7.32.0", + "eslint-plugin-markdown": "2.2.1", + "mocha": "9.1.3", + "nyc": "15.1.0" + }, + "files": [ + "lib/", + "HISTORY.md", + "LICENSE", + "index.js", + "README.md" + ], + "engines": { + "node": ">= 0.6" + }, + "scripts": { + "lint": "eslint .", + "test": "mocha --reporter spec --check-leaks --bail test/", + "test:debug": "mocha --reporter spec --check-leaks --inspect --inspect-brk test/", + "test-ci": "nyc --reporter=lcov --reporter=text npm test", + "test-cov": "nyc --reporter=html --reporter=text npm test" + } +} diff --git a/deps/npm/node_modules/make-fetch-happen/package.json b/deps/npm/node_modules/make-fetch-happen/package.json index 0868ff6d7efa54..054fe841f13b73 100644 --- a/deps/npm/node_modules/make-fetch-happen/package.json +++ b/deps/npm/node_modules/make-fetch-happen/package.json @@ -1,6 +1,6 @@ { "name": "make-fetch-happen", - "version": "14.0.1", + "version": "14.0.3", "description": "Opinionated, caching, retrying fetch client", "main": "lib/index.js", "files": [ @@ -40,14 +40,14 @@ "minipass-fetch": "^4.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", + "negotiator": "^1.0.0", "proc-log": "^5.0.0", "promise-retry": "^2.0.1", "ssri": "^12.0.0" }, "devDependencies": { "@npmcli/eslint-config": "^5.0.0", - "@npmcli/template-oss": "4.23.3", + "@npmcli/template-oss": "4.23.4", "nock": "^13.2.4", "safe-buffer": "^5.2.1", "standard-version": "^9.3.2", @@ -68,7 +68,7 @@ }, "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.23.3", + "version": "4.23.4", "publish": "true" } } diff --git a/deps/npm/node_modules/negotiator/index.js b/deps/npm/node_modules/negotiator/index.js deleted file mode 100644 index 4788264b16c9f2..00000000000000 --- a/deps/npm/node_modules/negotiator/index.js +++ /dev/null @@ -1,82 +0,0 @@ -/*! - * negotiator - * Copyright(c) 2012 Federico Romero - * Copyright(c) 2012-2014 Isaac Z. Schlueter - * Copyright(c) 2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict'; - -var preferredCharsets = require('./lib/charset') -var preferredEncodings = require('./lib/encoding') -var preferredLanguages = require('./lib/language') -var preferredMediaTypes = require('./lib/mediaType') - -/** - * Module exports. - * @public - */ - -module.exports = Negotiator; -module.exports.Negotiator = Negotiator; - -/** - * Create a Negotiator instance from a request. - * @param {object} request - * @public - */ - -function Negotiator(request) { - if (!(this instanceof Negotiator)) { - return new Negotiator(request); - } - - this.request = request; -} - -Negotiator.prototype.charset = function charset(available) { - var set = this.charsets(available); - return set && set[0]; -}; - -Negotiator.prototype.charsets = function charsets(available) { - return preferredCharsets(this.request.headers['accept-charset'], available); -}; - -Negotiator.prototype.encoding = function encoding(available) { - var set = this.encodings(available); - return set && set[0]; -}; - -Negotiator.prototype.encodings = function encodings(available) { - return preferredEncodings(this.request.headers['accept-encoding'], available); -}; - -Negotiator.prototype.language = function language(available) { - var set = this.languages(available); - return set && set[0]; -}; - -Negotiator.prototype.languages = function languages(available) { - return preferredLanguages(this.request.headers['accept-language'], available); -}; - -Negotiator.prototype.mediaType = function mediaType(available) { - var set = this.mediaTypes(available); - return set && set[0]; -}; - -Negotiator.prototype.mediaTypes = function mediaTypes(available) { - return preferredMediaTypes(this.request.headers.accept, available); -}; - -// Backwards compatibility -Negotiator.prototype.preferredCharset = Negotiator.prototype.charset; -Negotiator.prototype.preferredCharsets = Negotiator.prototype.charsets; -Negotiator.prototype.preferredEncoding = Negotiator.prototype.encoding; -Negotiator.prototype.preferredEncodings = Negotiator.prototype.encodings; -Negotiator.prototype.preferredLanguage = Negotiator.prototype.language; -Negotiator.prototype.preferredLanguages = Negotiator.prototype.languages; -Negotiator.prototype.preferredMediaType = Negotiator.prototype.mediaType; -Negotiator.prototype.preferredMediaTypes = Negotiator.prototype.mediaTypes; diff --git a/deps/npm/node_modules/negotiator/lib/encoding.js b/deps/npm/node_modules/negotiator/lib/encoding.js deleted file mode 100644 index 8432cd77b8a969..00000000000000 --- a/deps/npm/node_modules/negotiator/lib/encoding.js +++ /dev/null @@ -1,184 +0,0 @@ -/** - * negotiator - * Copyright(c) 2012 Isaac Z. Schlueter - * Copyright(c) 2014 Federico Romero - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict'; - -/** - * Module exports. - * @public - */ - -module.exports = preferredEncodings; -module.exports.preferredEncodings = preferredEncodings; - -/** - * Module variables. - * @private - */ - -var simpleEncodingRegExp = /^\s*([^\s;]+)\s*(?:;(.*))?$/; - -/** - * Parse the Accept-Encoding header. - * @private - */ - -function parseAcceptEncoding(accept) { - var accepts = accept.split(','); - var hasIdentity = false; - var minQuality = 1; - - for (var i = 0, j = 0; i < accepts.length; i++) { - var encoding = parseEncoding(accepts[i].trim(), i); - - if (encoding) { - accepts[j++] = encoding; - hasIdentity = hasIdentity || specify('identity', encoding); - minQuality = Math.min(minQuality, encoding.q || 1); - } - } - - if (!hasIdentity) { - /* - * If identity doesn't explicitly appear in the accept-encoding header, - * it's added to the list of acceptable encoding with the lowest q - */ - accepts[j++] = { - encoding: 'identity', - q: minQuality, - i: i - }; - } - - // trim accepts - accepts.length = j; - - return accepts; -} - -/** - * Parse an encoding from the Accept-Encoding header. - * @private - */ - -function parseEncoding(str, i) { - var match = simpleEncodingRegExp.exec(str); - if (!match) return null; - - var encoding = match[1]; - var q = 1; - if (match[2]) { - var params = match[2].split(';'); - for (var j = 0; j < params.length; j++) { - var p = params[j].trim().split('='); - if (p[0] === 'q') { - q = parseFloat(p[1]); - break; - } - } - } - - return { - encoding: encoding, - q: q, - i: i - }; -} - -/** - * Get the priority of an encoding. - * @private - */ - -function getEncodingPriority(encoding, accepted, index) { - var priority = {o: -1, q: 0, s: 0}; - - for (var i = 0; i < accepted.length; i++) { - var spec = specify(encoding, accepted[i], index); - - if (spec && (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0) { - priority = spec; - } - } - - return priority; -} - -/** - * Get the specificity of the encoding. - * @private - */ - -function specify(encoding, spec, index) { - var s = 0; - if(spec.encoding.toLowerCase() === encoding.toLowerCase()){ - s |= 1; - } else if (spec.encoding !== '*' ) { - return null - } - - return { - i: index, - o: spec.i, - q: spec.q, - s: s - } -}; - -/** - * Get the preferred encodings from an Accept-Encoding header. - * @public - */ - -function preferredEncodings(accept, provided) { - var accepts = parseAcceptEncoding(accept || ''); - - if (!provided) { - // sorted list of all encodings - return accepts - .filter(isQuality) - .sort(compareSpecs) - .map(getFullEncoding); - } - - var priorities = provided.map(function getPriority(type, index) { - return getEncodingPriority(type, accepts, index); - }); - - // sorted list of accepted encodings - return priorities.filter(isQuality).sort(compareSpecs).map(function getEncoding(priority) { - return provided[priorities.indexOf(priority)]; - }); -} - -/** - * Compare two specs. - * @private - */ - -function compareSpecs(a, b) { - return (b.q - a.q) || (b.s - a.s) || (a.o - b.o) || (a.i - b.i) || 0; -} - -/** - * Get full encoding string. - * @private - */ - -function getFullEncoding(spec) { - return spec.encoding; -} - -/** - * Check if a spec has any quality. - * @private - */ - -function isQuality(spec) { - return spec.q > 0; -} diff --git a/deps/npm/node_modules/negotiator/package.json b/deps/npm/node_modules/negotiator/package.json deleted file mode 100644 index 297635f6d34177..00000000000000 --- a/deps/npm/node_modules/negotiator/package.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "negotiator", - "description": "HTTP content negotiation", - "version": "0.6.3", - "contributors": [ - "Douglas Christopher Wilson ", - "Federico Romero ", - "Isaac Z. Schlueter (http://blog.izs.me/)" - ], - "license": "MIT", - "keywords": [ - "http", - "content negotiation", - "accept", - "accept-language", - "accept-encoding", - "accept-charset" - ], - "repository": "jshttp/negotiator", - "devDependencies": { - "eslint": "7.32.0", - "eslint-plugin-markdown": "2.2.1", - "mocha": "9.1.3", - "nyc": "15.1.0" - }, - "files": [ - "lib/", - "HISTORY.md", - "LICENSE", - "index.js", - "README.md" - ], - "engines": { - "node": ">= 0.6" - }, - "scripts": { - "lint": "eslint .", - "test": "mocha --reporter spec --check-leaks --bail test/", - "test-ci": "nyc --reporter=lcov --reporter=text npm test", - "test-cov": "nyc --reporter=html --reporter=text npm test" - } -} diff --git a/deps/npm/node_modules/node-gyp/.release-please-manifest.json b/deps/npm/node_modules/node-gyp/.release-please-manifest.json index 01db3293b948bd..26a3463a2e0bb3 100644 --- a/deps/npm/node_modules/node-gyp/.release-please-manifest.json +++ b/deps/npm/node_modules/node-gyp/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "10.2.0" + ".": "11.0.0" } diff --git a/deps/npm/node_modules/node-gyp/CHANGELOG.md b/deps/npm/node_modules/node-gyp/CHANGELOG.md index 1d4e4185320bd6..8374a920b7caaa 100644 --- a/deps/npm/node_modules/node-gyp/CHANGELOG.md +++ b/deps/npm/node_modules/node-gyp/CHANGELOG.md @@ -1,5 +1,46 @@ # Changelog +## [11.0.0](https://github.com/nodejs/node-gyp/compare/v10.3.1...v11.0.0) (2024-12-03) + + +### ⚠ BREAKING CHANGES + +* drop node 16 support ([#3102](https://github.com/nodejs/node-gyp/issues/3102)) + +### Features + +* drop node 16 support ([#3102](https://github.com/nodejs/node-gyp/issues/3102)) ([0e6b6f8](https://github.com/nodejs/node-gyp/commit/0e6b6f8bea615cf031d76ecff9102a38e5474c72)) + + +### Miscellaneous + +* migrate from standard to neostandard ([#3103](https://github.com/nodejs/node-gyp/issues/3103)) ([a130178](https://github.com/nodejs/node-gyp/commit/a13017807d0ae7da8fa076b0bcf23153af7c60a6)) + +## [10.3.1](https://github.com/nodejs/node-gyp/compare/v10.3.0...v10.3.1) (2024-12-02) + + +### Miscellaneous + +* fix npm-publish dependencies and add provenance ([#3099](https://github.com/nodejs/node-gyp/issues/3099)) ([6dded88](https://github.com/nodejs/node-gyp/commit/6dded88065872a32f44114e60731ba4b701ec057)) + +## [10.3.0](https://github.com/nodejs/node-gyp/compare/v10.2.0...v10.3.0) (2024-11-29) + + +### Features + +* prohibit compiling with ClangCL on Windows ([#3098](https://github.com/nodejs/node-gyp/issues/3098)) ([88260bf](https://github.com/nodejs/node-gyp/commit/88260bf86aeb4c39959b78104a5edc3dc88d3aef)) + + +### Bug Fixes + +* **ci:** use correct release-please-action domain after organization url was changed ([#3032](https://github.com/nodejs/node-gyp/issues/3032)) ([d1ed3d4](https://github.com/nodejs/node-gyp/commit/d1ed3d4dc3a53b8ccab4093d002e43945bbece0e)) + + +### Miscellaneous + +* add links to Code of Conduct from root file ([#2196](https://github.com/nodejs/node-gyp/issues/2196)) ([d22e2eb](https://github.com/nodejs/node-gyp/commit/d22e2eb080807c6290533a67249c343a7605a989)) +* publish to npm with release-please ([#3051](https://github.com/nodejs/node-gyp/issues/3051)) ([8319847](https://github.com/nodejs/node-gyp/commit/831984736393a3ea8417efec5255f95d53a70785)) + ## [10.2.0](https://github.com/nodejs/node-gyp/compare/v10.1.0...v10.2.0) (2024-07-09) diff --git a/deps/npm/node_modules/node-gyp/CODE_OF_CONDUCT.md b/deps/npm/node_modules/node-gyp/CODE_OF_CONDUCT.md new file mode 100644 index 00000000000000..4c211405596cb4 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/CODE_OF_CONDUCT.md @@ -0,0 +1,4 @@ +# Code of Conduct + +* [Node.js Code of Conduct](https://github.com/nodejs/admin/blob/master/CODE_OF_CONDUCT.md) +* [Node.js Moderation Policy](https://github.com/nodejs/admin/blob/master/Moderation-Policy.md) diff --git a/deps/npm/node_modules/node-gyp/eslint.config.js b/deps/npm/node_modules/node-gyp/eslint.config.js new file mode 100644 index 00000000000000..5212dc93d5304d --- /dev/null +++ b/deps/npm/node_modules/node-gyp/eslint.config.js @@ -0,0 +1,3 @@ +'use strict' + +module.exports = require('neostandard')({}) diff --git a/deps/npm/node_modules/node-gyp/lib/create-config-gypi.js b/deps/npm/node_modules/node-gyp/lib/create-config-gypi.js index d598dea6e2e7fa..01a820e9f2f312 100644 --- a/deps/npm/node_modules/node-gyp/lib/create-config-gypi.js +++ b/deps/npm/node_modules/node-gyp/lib/create-config-gypi.js @@ -96,6 +96,9 @@ async function getCurrentConfigGypi ({ gyp, nodeDir, vsInfo, python }) { } } variables.msbuild_path = vsInfo.msBuild + if (config.variables.clang === 1) { + config.variables.clang = 0 + } } // loop through the rest of the opts and add the unknown ones as variables. diff --git a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/lib/agents.js b/deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/lib/agents.js deleted file mode 100644 index c541b93001517e..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/lib/agents.js +++ /dev/null @@ -1,206 +0,0 @@ -'use strict' - -const net = require('net') -const tls = require('tls') -const { once } = require('events') -const timers = require('timers/promises') -const { normalizeOptions, cacheOptions } = require('./options') -const { getProxy, getProxyAgent, proxyCache } = require('./proxy.js') -const Errors = require('./errors.js') -const { Agent: AgentBase } = require('agent-base') - -module.exports = class Agent extends AgentBase { - #options - #timeouts - #proxy - #noProxy - #ProxyAgent - - constructor (options = {}) { - const { timeouts, proxy, noProxy, ...normalizedOptions } = normalizeOptions(options) - - super(normalizedOptions) - - this.#options = normalizedOptions - this.#timeouts = timeouts - - if (proxy) { - this.#proxy = new URL(proxy) - this.#noProxy = noProxy - this.#ProxyAgent = getProxyAgent(proxy) - } - } - - get proxy () { - return this.#proxy ? { url: this.#proxy } : {} - } - - #getProxy (options) { - if (!this.#proxy) { - return - } - - const proxy = getProxy(`${options.protocol}//${options.host}:${options.port}`, { - proxy: this.#proxy, - noProxy: this.#noProxy, - }) - - if (!proxy) { - return - } - - const cacheKey = cacheOptions({ - ...options, - ...this.#options, - timeouts: this.#timeouts, - proxy, - }) - - if (proxyCache.has(cacheKey)) { - return proxyCache.get(cacheKey) - } - - let ProxyAgent = this.#ProxyAgent - if (Array.isArray(ProxyAgent)) { - ProxyAgent = this.isSecureEndpoint(options) ? ProxyAgent[1] : ProxyAgent[0] - } - - const proxyAgent = new ProxyAgent(proxy, { - ...this.#options, - socketOptions: { family: this.#options.family }, - }) - proxyCache.set(cacheKey, proxyAgent) - - return proxyAgent - } - - // takes an array of promises and races them against the connection timeout - // which will throw the necessary error if it is hit. This will return the - // result of the promise race. - async #timeoutConnection ({ promises, options, timeout }, ac = new AbortController()) { - if (timeout) { - const connectionTimeout = timers.setTimeout(timeout, null, { signal: ac.signal }) - .then(() => { - throw new Errors.ConnectionTimeoutError(`${options.host}:${options.port}`) - }).catch((err) => { - if (err.name === 'AbortError') { - return - } - throw err - }) - promises.push(connectionTimeout) - } - - let result - try { - result = await Promise.race(promises) - ac.abort() - } catch (err) { - ac.abort() - throw err - } - return result - } - - async connect (request, options) { - // if the connection does not have its own lookup function - // set, then use the one from our options - options.lookup ??= this.#options.lookup - - let socket - let timeout = this.#timeouts.connection - const isSecureEndpoint = this.isSecureEndpoint(options) - - const proxy = this.#getProxy(options) - if (proxy) { - // some of the proxies will wait for the socket to fully connect before - // returning so we have to await this while also racing it against the - // connection timeout. - const start = Date.now() - socket = await this.#timeoutConnection({ - options, - timeout, - promises: [proxy.connect(request, options)], - }) - // see how much time proxy.connect took and subtract it from - // the timeout - if (timeout) { - timeout = timeout - (Date.now() - start) - } - } else { - socket = (isSecureEndpoint ? tls : net).connect(options) - } - - socket.setKeepAlive(this.keepAlive, this.keepAliveMsecs) - socket.setNoDelay(this.keepAlive) - - const abortController = new AbortController() - const { signal } = abortController - - const connectPromise = socket[isSecureEndpoint ? 'secureConnecting' : 'connecting'] - ? once(socket, isSecureEndpoint ? 'secureConnect' : 'connect', { signal }) - : Promise.resolve() - - await this.#timeoutConnection({ - options, - timeout, - promises: [ - connectPromise, - once(socket, 'error', { signal }).then((err) => { - throw err[0] - }), - ], - }, abortController) - - if (this.#timeouts.idle) { - socket.setTimeout(this.#timeouts.idle, () => { - socket.destroy(new Errors.IdleTimeoutError(`${options.host}:${options.port}`)) - }) - } - - return socket - } - - addRequest (request, options) { - const proxy = this.#getProxy(options) - // it would be better to call proxy.addRequest here but this causes the - // http-proxy-agent to call its super.addRequest which causes the request - // to be added to the agent twice. since we only support 3 agents - // currently (see the required agents in proxy.js) we have manually - // checked that the only public methods we need to call are called in the - // next block. this could change in the future and presumably we would get - // failing tests until we have properly called the necessary methods on - // each of our proxy agents - if (proxy?.setRequestProps) { - proxy.setRequestProps(request, options) - } - - request.setHeader('connection', this.keepAlive ? 'keep-alive' : 'close') - - if (this.#timeouts.response) { - let responseTimeout - request.once('finish', () => { - setTimeout(() => { - request.destroy(new Errors.ResponseTimeoutError(request, this.#proxy)) - }, this.#timeouts.response) - }) - request.once('response', () => { - clearTimeout(responseTimeout) - }) - } - - if (this.#timeouts.transfer) { - let transferTimeout - request.once('response', (res) => { - setTimeout(() => { - res.destroy(new Errors.TransferTimeoutError(request, this.#proxy)) - }, this.#timeouts.transfer) - res.once('close', () => { - clearTimeout(transferTimeout) - }) - }) - } - - return super.addRequest(request, options) - } -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/lib/dns.js b/deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/lib/dns.js deleted file mode 100644 index 3c6946c566d736..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/lib/dns.js +++ /dev/null @@ -1,53 +0,0 @@ -'use strict' - -const { LRUCache } = require('lru-cache') -const dns = require('dns') - -// this is a factory so that each request can have its own opts (i.e. ttl) -// while still sharing the cache across all requests -const cache = new LRUCache({ max: 50 }) - -const getOptions = ({ - family = 0, - hints = dns.ADDRCONFIG, - all = false, - verbatim = undefined, - ttl = 5 * 60 * 1000, - lookup = dns.lookup, -}) => ({ - // hints and lookup are returned since both are top level properties to (net|tls).connect - hints, - lookup: (hostname, ...args) => { - const callback = args.pop() // callback is always last arg - const lookupOptions = args[0] ?? {} - - const options = { - family, - hints, - all, - verbatim, - ...(typeof lookupOptions === 'number' ? { family: lookupOptions } : lookupOptions), - } - - const key = JSON.stringify({ hostname, ...options }) - - if (cache.has(key)) { - const cached = cache.get(key) - return process.nextTick(callback, null, ...cached) - } - - lookup(hostname, options, (err, ...result) => { - if (err) { - return callback(err) - } - - cache.set(key, result, { ttl }) - return callback(null, ...result) - }) - }, -}) - -module.exports = { - cache, - getOptions, -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/lib/errors.js b/deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/lib/errors.js deleted file mode 100644 index 70475aec8eb357..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/lib/errors.js +++ /dev/null @@ -1,61 +0,0 @@ -'use strict' - -class InvalidProxyProtocolError extends Error { - constructor (url) { - super(`Invalid protocol \`${url.protocol}\` connecting to proxy \`${url.host}\``) - this.code = 'EINVALIDPROXY' - this.proxy = url - } -} - -class ConnectionTimeoutError extends Error { - constructor (host) { - super(`Timeout connecting to host \`${host}\``) - this.code = 'ECONNECTIONTIMEOUT' - this.host = host - } -} - -class IdleTimeoutError extends Error { - constructor (host) { - super(`Idle timeout reached for host \`${host}\``) - this.code = 'EIDLETIMEOUT' - this.host = host - } -} - -class ResponseTimeoutError extends Error { - constructor (request, proxy) { - let msg = 'Response timeout ' - if (proxy) { - msg += `from proxy \`${proxy.host}\` ` - } - msg += `connecting to host \`${request.host}\`` - super(msg) - this.code = 'ERESPONSETIMEOUT' - this.proxy = proxy - this.request = request - } -} - -class TransferTimeoutError extends Error { - constructor (request, proxy) { - let msg = 'Transfer timeout ' - if (proxy) { - msg += `from proxy \`${proxy.host}\` ` - } - msg += `for \`${request.host}\`` - super(msg) - this.code = 'ETRANSFERTIMEOUT' - this.proxy = proxy - this.request = request - } -} - -module.exports = { - InvalidProxyProtocolError, - ConnectionTimeoutError, - IdleTimeoutError, - ResponseTimeoutError, - TransferTimeoutError, -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/lib/index.js b/deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/lib/index.js deleted file mode 100644 index b33d6eaef07a21..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/lib/index.js +++ /dev/null @@ -1,56 +0,0 @@ -'use strict' - -const { LRUCache } = require('lru-cache') -const { normalizeOptions, cacheOptions } = require('./options') -const { getProxy, proxyCache } = require('./proxy.js') -const dns = require('./dns.js') -const Agent = require('./agents.js') - -const agentCache = new LRUCache({ max: 20 }) - -const getAgent = (url, { agent, proxy, noProxy, ...options } = {}) => { - // false has meaning so this can't be a simple truthiness check - if (agent != null) { - return agent - } - - url = new URL(url) - - const proxyForUrl = getProxy(url, { proxy, noProxy }) - const normalizedOptions = { - ...normalizeOptions(options), - proxy: proxyForUrl, - } - - const cacheKey = cacheOptions({ - ...normalizedOptions, - secureEndpoint: url.protocol === 'https:', - }) - - if (agentCache.has(cacheKey)) { - return agentCache.get(cacheKey) - } - - const newAgent = new Agent(normalizedOptions) - agentCache.set(cacheKey, newAgent) - - return newAgent -} - -module.exports = { - getAgent, - Agent, - // these are exported for backwards compatability - HttpAgent: Agent, - HttpsAgent: Agent, - cache: { - proxy: proxyCache, - agent: agentCache, - dns: dns.cache, - clear: () => { - proxyCache.clear() - agentCache.clear() - dns.cache.clear() - }, - }, -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/lib/options.js b/deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/lib/options.js deleted file mode 100644 index 0bf53f725f0846..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/lib/options.js +++ /dev/null @@ -1,86 +0,0 @@ -'use strict' - -const dns = require('./dns') - -const normalizeOptions = (opts) => { - const family = parseInt(opts.family ?? '0', 10) - const keepAlive = opts.keepAlive ?? true - - const normalized = { - // nodejs http agent options. these are all the defaults - // but kept here to increase the likelihood of cache hits - // https://nodejs.org/api/http.html#new-agentoptions - keepAliveMsecs: keepAlive ? 1000 : undefined, - maxSockets: opts.maxSockets ?? 15, - maxTotalSockets: Infinity, - maxFreeSockets: keepAlive ? 256 : undefined, - scheduling: 'fifo', - // then spread the rest of the options - ...opts, - // we already set these to their defaults that we want - family, - keepAlive, - // our custom timeout options - timeouts: { - // the standard timeout option is mapped to our idle timeout - // and then deleted below - idle: opts.timeout ?? 0, - connection: 0, - response: 0, - transfer: 0, - ...opts.timeouts, - }, - // get the dns options that go at the top level of socket connection - ...dns.getOptions({ family, ...opts.dns }), - } - - // remove timeout since we already used it to set our own idle timeout - delete normalized.timeout - - return normalized -} - -const createKey = (obj) => { - let key = '' - const sorted = Object.entries(obj).sort((a, b) => a[0] - b[0]) - for (let [k, v] of sorted) { - if (v == null) { - v = 'null' - } else if (v instanceof URL) { - v = v.toString() - } else if (typeof v === 'object') { - v = createKey(v) - } - key += `${k}:${v}:` - } - return key -} - -const cacheOptions = ({ secureEndpoint, ...options }) => createKey({ - secureEndpoint: !!secureEndpoint, - // socket connect options - family: options.family, - hints: options.hints, - localAddress: options.localAddress, - // tls specific connect options - strictSsl: secureEndpoint ? !!options.rejectUnauthorized : false, - ca: secureEndpoint ? options.ca : null, - cert: secureEndpoint ? options.cert : null, - key: secureEndpoint ? options.key : null, - // http agent options - keepAlive: options.keepAlive, - keepAliveMsecs: options.keepAliveMsecs, - maxSockets: options.maxSockets, - maxTotalSockets: options.maxTotalSockets, - maxFreeSockets: options.maxFreeSockets, - scheduling: options.scheduling, - // timeout options - timeouts: options.timeouts, - // proxy - proxy: options.proxy, -}) - -module.exports = { - normalizeOptions, - cacheOptions, -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/lib/proxy.js b/deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/lib/proxy.js deleted file mode 100644 index 6272e929e57bcf..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/lib/proxy.js +++ /dev/null @@ -1,88 +0,0 @@ -'use strict' - -const { HttpProxyAgent } = require('http-proxy-agent') -const { HttpsProxyAgent } = require('https-proxy-agent') -const { SocksProxyAgent } = require('socks-proxy-agent') -const { LRUCache } = require('lru-cache') -const { InvalidProxyProtocolError } = require('./errors.js') - -const PROXY_CACHE = new LRUCache({ max: 20 }) - -const SOCKS_PROTOCOLS = new Set(SocksProxyAgent.protocols) - -const PROXY_ENV_KEYS = new Set(['https_proxy', 'http_proxy', 'proxy', 'no_proxy']) - -const PROXY_ENV = Object.entries(process.env).reduce((acc, [key, value]) => { - key = key.toLowerCase() - if (PROXY_ENV_KEYS.has(key)) { - acc[key] = value - } - return acc -}, {}) - -const getProxyAgent = (url) => { - url = new URL(url) - - const protocol = url.protocol.slice(0, -1) - if (SOCKS_PROTOCOLS.has(protocol)) { - return SocksProxyAgent - } - if (protocol === 'https' || protocol === 'http') { - return [HttpProxyAgent, HttpsProxyAgent] - } - - throw new InvalidProxyProtocolError(url) -} - -const isNoProxy = (url, noProxy) => { - if (typeof noProxy === 'string') { - noProxy = noProxy.split(',').map((p) => p.trim()).filter(Boolean) - } - - if (!noProxy || !noProxy.length) { - return false - } - - const hostSegments = url.hostname.split('.').reverse() - - return noProxy.some((no) => { - const noSegments = no.split('.').filter(Boolean).reverse() - if (!noSegments.length) { - return false - } - - for (let i = 0; i < noSegments.length; i++) { - if (hostSegments[i] !== noSegments[i]) { - return false - } - } - - return true - }) -} - -const getProxy = (url, { proxy, noProxy }) => { - url = new URL(url) - - if (!proxy) { - proxy = url.protocol === 'https:' - ? PROXY_ENV.https_proxy - : PROXY_ENV.https_proxy || PROXY_ENV.http_proxy || PROXY_ENV.proxy - } - - if (!noProxy) { - noProxy = PROXY_ENV.no_proxy - } - - if (!proxy || isNoProxy(url, noProxy)) { - return null - } - - return new URL(proxy) -} - -module.exports = { - getProxyAgent, - getProxy, - proxyCache: PROXY_CACHE, -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/package.json b/deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/package.json deleted file mode 100644 index ef5b4e3228cc46..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/agent/package.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "name": "@npmcli/agent", - "version": "2.2.2", - "description": "the http/https agent used by the npm cli", - "main": "lib/index.js", - "scripts": { - "gencerts": "bash scripts/create-cert.sh", - "test": "tap", - "lint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"", - "postlint": "template-oss-check", - "template-oss-apply": "template-oss-apply --force", - "lintfix": "npm run lint -- --fix", - "snap": "tap", - "posttest": "npm run lint" - }, - "author": "GitHub Inc.", - "license": "ISC", - "bugs": { - "url": "https://github.com/npm/agent/issues" - }, - "homepage": "https://github.com/npm/agent#readme", - "files": [ - "bin/", - "lib/" - ], - "engines": { - "node": "^16.14.0 || >=18.0.0" - }, - "templateOSS": { - "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.21.3", - "publish": "true" - }, - "dependencies": { - "agent-base": "^7.1.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.1", - "lru-cache": "^10.0.1", - "socks-proxy-agent": "^8.0.3" - }, - "devDependencies": { - "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.21.3", - "minipass-fetch": "^3.0.3", - "nock": "^13.2.7", - "semver": "^7.5.4", - "simple-socks": "^3.1.0", - "tap": "^16.3.0" - }, - "repository": { - "type": "git", - "url": "https://github.com/npm/agent.git" - }, - "tap": { - "nyc-arg": [ - "--exclude", - "tap-snapshots/**" - ] - } -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/fs/LICENSE.md b/deps/npm/node_modules/node-gyp/node_modules/@npmcli/fs/LICENSE.md deleted file mode 100644 index 5fc208ff122e08..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/fs/LICENSE.md +++ /dev/null @@ -1,20 +0,0 @@ - - -ISC License - -Copyright npm, Inc. - -Permission to use, copy, modify, and/or distribute this -software for any purpose with or without fee is hereby -granted, provided that the above copyright notice and this -permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND NPM DISCLAIMS ALL -WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO -EVENT SHALL NPM BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE -USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/fs/lib/common/get-options.js b/deps/npm/node_modules/node-gyp/node_modules/@npmcli/fs/lib/common/get-options.js deleted file mode 100644 index cb5982f79077ac..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/fs/lib/common/get-options.js +++ /dev/null @@ -1,20 +0,0 @@ -// given an input that may or may not be an object, return an object that has -// a copy of every defined property listed in 'copy'. if the input is not an -// object, assign it to the property named by 'wrap' -const getOptions = (input, { copy, wrap }) => { - const result = {} - - if (input && typeof input === 'object') { - for (const prop of copy) { - if (input[prop] !== undefined) { - result[prop] = input[prop] - } - } - } else { - result[wrap] = input - } - - return result -} - -module.exports = getOptions diff --git a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/fs/lib/common/node.js b/deps/npm/node_modules/node-gyp/node_modules/@npmcli/fs/lib/common/node.js deleted file mode 100644 index 4d13bc037359d7..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/fs/lib/common/node.js +++ /dev/null @@ -1,9 +0,0 @@ -const semver = require('semver') - -const satisfies = (range) => { - return semver.satisfies(process.version, range, { includePrerelease: true }) -} - -module.exports = { - satisfies, -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/fs/lib/cp/LICENSE b/deps/npm/node_modules/node-gyp/node_modules/@npmcli/fs/lib/cp/LICENSE deleted file mode 100644 index 93546dfb7655bf..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/fs/lib/cp/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -(The MIT License) - -Copyright (c) 2011-2017 JP Richardson - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files -(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, - merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS -OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/fs/lib/cp/errors.js b/deps/npm/node_modules/node-gyp/node_modules/@npmcli/fs/lib/cp/errors.js deleted file mode 100644 index 1cd1e05d0c533d..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/fs/lib/cp/errors.js +++ /dev/null @@ -1,129 +0,0 @@ -'use strict' -const { inspect } = require('util') - -// adapted from node's internal/errors -// https://github.com/nodejs/node/blob/c8a04049/lib/internal/errors.js - -// close copy of node's internal SystemError class. -class SystemError { - constructor (code, prefix, context) { - // XXX context.code is undefined in all constructors used in cp/polyfill - // that may be a bug copied from node, maybe the constructor should use - // `code` not `errno`? nodejs/node#41104 - let message = `${prefix}: ${context.syscall} returned ` + - `${context.code} (${context.message})` - - if (context.path !== undefined) { - message += ` ${context.path}` - } - if (context.dest !== undefined) { - message += ` => ${context.dest}` - } - - this.code = code - Object.defineProperties(this, { - name: { - value: 'SystemError', - enumerable: false, - writable: true, - configurable: true, - }, - message: { - value: message, - enumerable: false, - writable: true, - configurable: true, - }, - info: { - value: context, - enumerable: true, - configurable: true, - writable: false, - }, - errno: { - get () { - return context.errno - }, - set (value) { - context.errno = value - }, - enumerable: true, - configurable: true, - }, - syscall: { - get () { - return context.syscall - }, - set (value) { - context.syscall = value - }, - enumerable: true, - configurable: true, - }, - }) - - if (context.path !== undefined) { - Object.defineProperty(this, 'path', { - get () { - return context.path - }, - set (value) { - context.path = value - }, - enumerable: true, - configurable: true, - }) - } - - if (context.dest !== undefined) { - Object.defineProperty(this, 'dest', { - get () { - return context.dest - }, - set (value) { - context.dest = value - }, - enumerable: true, - configurable: true, - }) - } - } - - toString () { - return `${this.name} [${this.code}]: ${this.message}` - } - - [Symbol.for('nodejs.util.inspect.custom')] (_recurseTimes, ctx) { - return inspect(this, { - ...ctx, - getters: true, - customInspect: false, - }) - } -} - -function E (code, message) { - module.exports[code] = class NodeError extends SystemError { - constructor (ctx) { - super(code, message, ctx) - } - } -} - -E('ERR_FS_CP_DIR_TO_NON_DIR', 'Cannot overwrite directory with non-directory') -E('ERR_FS_CP_EEXIST', 'Target already exists') -E('ERR_FS_CP_EINVAL', 'Invalid src or dest') -E('ERR_FS_CP_FIFO_PIPE', 'Cannot copy a FIFO pipe') -E('ERR_FS_CP_NON_DIR_TO_DIR', 'Cannot overwrite non-directory with directory') -E('ERR_FS_CP_SOCKET', 'Cannot copy a socket file') -E('ERR_FS_CP_SYMLINK_TO_SUBDIRECTORY', 'Cannot overwrite symlink in subdirectory of self') -E('ERR_FS_CP_UNKNOWN', 'Cannot copy an unknown file type') -E('ERR_FS_EISDIR', 'Path is a directory') - -module.exports.ERR_INVALID_ARG_TYPE = class ERR_INVALID_ARG_TYPE extends Error { - constructor (name, expected, actual) { - super() - this.code = 'ERR_INVALID_ARG_TYPE' - this.message = `The ${name} argument must be ${expected}. Received ${typeof actual}` - } -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/fs/lib/cp/index.js b/deps/npm/node_modules/node-gyp/node_modules/@npmcli/fs/lib/cp/index.js deleted file mode 100644 index 972ce7aa12abef..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/fs/lib/cp/index.js +++ /dev/null @@ -1,22 +0,0 @@ -const fs = require('fs/promises') -const getOptions = require('../common/get-options.js') -const node = require('../common/node.js') -const polyfill = require('./polyfill.js') - -// node 16.7.0 added fs.cp -const useNative = node.satisfies('>=16.7.0') - -const cp = async (src, dest, opts) => { - const options = getOptions(opts, { - copy: ['dereference', 'errorOnExist', 'filter', 'force', 'preserveTimestamps', 'recursive'], - }) - - // the polyfill is tested separately from this module, no need to hack - // process.version to try to trigger it just for coverage - // istanbul ignore next - return useNative - ? fs.cp(src, dest, options) - : polyfill(src, dest, options) -} - -module.exports = cp diff --git a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/fs/lib/cp/polyfill.js b/deps/npm/node_modules/node-gyp/node_modules/@npmcli/fs/lib/cp/polyfill.js deleted file mode 100644 index 80eb10de971918..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/fs/lib/cp/polyfill.js +++ /dev/null @@ -1,428 +0,0 @@ -// this file is a modified version of the code in node 17.2.0 -// which is, in turn, a modified version of the fs-extra module on npm -// node core changes: -// - Use of the assert module has been replaced with core's error system. -// - All code related to the glob dependency has been removed. -// - Bring your own custom fs module is not currently supported. -// - Some basic code cleanup. -// changes here: -// - remove all callback related code -// - drop sync support -// - change assertions back to non-internal methods (see options.js) -// - throws ENOTDIR when rmdir gets an ENOENT for a path that exists in Windows -'use strict' - -const { - ERR_FS_CP_DIR_TO_NON_DIR, - ERR_FS_CP_EEXIST, - ERR_FS_CP_EINVAL, - ERR_FS_CP_FIFO_PIPE, - ERR_FS_CP_NON_DIR_TO_DIR, - ERR_FS_CP_SOCKET, - ERR_FS_CP_SYMLINK_TO_SUBDIRECTORY, - ERR_FS_CP_UNKNOWN, - ERR_FS_EISDIR, - ERR_INVALID_ARG_TYPE, -} = require('./errors.js') -const { - constants: { - errno: { - EEXIST, - EISDIR, - EINVAL, - ENOTDIR, - }, - }, -} = require('os') -const { - chmod, - copyFile, - lstat, - mkdir, - readdir, - readlink, - stat, - symlink, - unlink, - utimes, -} = require('fs/promises') -const { - dirname, - isAbsolute, - join, - parse, - resolve, - sep, - toNamespacedPath, -} = require('path') -const { fileURLToPath } = require('url') - -const defaultOptions = { - dereference: false, - errorOnExist: false, - filter: undefined, - force: true, - preserveTimestamps: false, - recursive: false, -} - -async function cp (src, dest, opts) { - if (opts != null && typeof opts !== 'object') { - throw new ERR_INVALID_ARG_TYPE('options', ['Object'], opts) - } - return cpFn( - toNamespacedPath(getValidatedPath(src)), - toNamespacedPath(getValidatedPath(dest)), - { ...defaultOptions, ...opts }) -} - -function getValidatedPath (fileURLOrPath) { - const path = fileURLOrPath != null && fileURLOrPath.href - && fileURLOrPath.origin - ? fileURLToPath(fileURLOrPath) - : fileURLOrPath - return path -} - -async function cpFn (src, dest, opts) { - // Warn about using preserveTimestamps on 32-bit node - // istanbul ignore next - if (opts.preserveTimestamps && process.arch === 'ia32') { - const warning = 'Using the preserveTimestamps option in 32-bit ' + - 'node is not recommended' - process.emitWarning(warning, 'TimestampPrecisionWarning') - } - const stats = await checkPaths(src, dest, opts) - const { srcStat, destStat } = stats - await checkParentPaths(src, srcStat, dest) - if (opts.filter) { - return handleFilter(checkParentDir, destStat, src, dest, opts) - } - return checkParentDir(destStat, src, dest, opts) -} - -async function checkPaths (src, dest, opts) { - const { 0: srcStat, 1: destStat } = await getStats(src, dest, opts) - if (destStat) { - if (areIdentical(srcStat, destStat)) { - throw new ERR_FS_CP_EINVAL({ - message: 'src and dest cannot be the same', - path: dest, - syscall: 'cp', - errno: EINVAL, - }) - } - if (srcStat.isDirectory() && !destStat.isDirectory()) { - throw new ERR_FS_CP_DIR_TO_NON_DIR({ - message: `cannot overwrite directory ${src} ` + - `with non-directory ${dest}`, - path: dest, - syscall: 'cp', - errno: EISDIR, - }) - } - if (!srcStat.isDirectory() && destStat.isDirectory()) { - throw new ERR_FS_CP_NON_DIR_TO_DIR({ - message: `cannot overwrite non-directory ${src} ` + - `with directory ${dest}`, - path: dest, - syscall: 'cp', - errno: ENOTDIR, - }) - } - } - - if (srcStat.isDirectory() && isSrcSubdir(src, dest)) { - throw new ERR_FS_CP_EINVAL({ - message: `cannot copy ${src} to a subdirectory of self ${dest}`, - path: dest, - syscall: 'cp', - errno: EINVAL, - }) - } - return { srcStat, destStat } -} - -function areIdentical (srcStat, destStat) { - return destStat.ino && destStat.dev && destStat.ino === srcStat.ino && - destStat.dev === srcStat.dev -} - -function getStats (src, dest, opts) { - const statFunc = opts.dereference ? - (file) => stat(file, { bigint: true }) : - (file) => lstat(file, { bigint: true }) - return Promise.all([ - statFunc(src), - statFunc(dest).catch((err) => { - // istanbul ignore next: unsure how to cover. - if (err.code === 'ENOENT') { - return null - } - // istanbul ignore next: unsure how to cover. - throw err - }), - ]) -} - -async function checkParentDir (destStat, src, dest, opts) { - const destParent = dirname(dest) - const dirExists = await pathExists(destParent) - if (dirExists) { - return getStatsForCopy(destStat, src, dest, opts) - } - await mkdir(destParent, { recursive: true }) - return getStatsForCopy(destStat, src, dest, opts) -} - -function pathExists (dest) { - return stat(dest).then( - () => true, - // istanbul ignore next: not sure when this would occur - (err) => (err.code === 'ENOENT' ? false : Promise.reject(err))) -} - -// Recursively check if dest parent is a subdirectory of src. -// It works for all file types including symlinks since it -// checks the src and dest inodes. It starts from the deepest -// parent and stops once it reaches the src parent or the root path. -async function checkParentPaths (src, srcStat, dest) { - const srcParent = resolve(dirname(src)) - const destParent = resolve(dirname(dest)) - if (destParent === srcParent || destParent === parse(destParent).root) { - return - } - let destStat - try { - destStat = await stat(destParent, { bigint: true }) - } catch (err) { - // istanbul ignore else: not sure when this would occur - if (err.code === 'ENOENT') { - return - } - // istanbul ignore next: not sure when this would occur - throw err - } - if (areIdentical(srcStat, destStat)) { - throw new ERR_FS_CP_EINVAL({ - message: `cannot copy ${src} to a subdirectory of self ${dest}`, - path: dest, - syscall: 'cp', - errno: EINVAL, - }) - } - return checkParentPaths(src, srcStat, destParent) -} - -const normalizePathToArray = (path) => - resolve(path).split(sep).filter(Boolean) - -// Return true if dest is a subdir of src, otherwise false. -// It only checks the path strings. -function isSrcSubdir (src, dest) { - const srcArr = normalizePathToArray(src) - const destArr = normalizePathToArray(dest) - return srcArr.every((cur, i) => destArr[i] === cur) -} - -async function handleFilter (onInclude, destStat, src, dest, opts, cb) { - const include = await opts.filter(src, dest) - if (include) { - return onInclude(destStat, src, dest, opts, cb) - } -} - -function startCopy (destStat, src, dest, opts) { - if (opts.filter) { - return handleFilter(getStatsForCopy, destStat, src, dest, opts) - } - return getStatsForCopy(destStat, src, dest, opts) -} - -async function getStatsForCopy (destStat, src, dest, opts) { - const statFn = opts.dereference ? stat : lstat - const srcStat = await statFn(src) - // istanbul ignore else: can't portably test FIFO - if (srcStat.isDirectory() && opts.recursive) { - return onDir(srcStat, destStat, src, dest, opts) - } else if (srcStat.isDirectory()) { - throw new ERR_FS_EISDIR({ - message: `${src} is a directory (not copied)`, - path: src, - syscall: 'cp', - errno: EINVAL, - }) - } else if (srcStat.isFile() || - srcStat.isCharacterDevice() || - srcStat.isBlockDevice()) { - return onFile(srcStat, destStat, src, dest, opts) - } else if (srcStat.isSymbolicLink()) { - return onLink(destStat, src, dest) - } else if (srcStat.isSocket()) { - throw new ERR_FS_CP_SOCKET({ - message: `cannot copy a socket file: ${dest}`, - path: dest, - syscall: 'cp', - errno: EINVAL, - }) - } else if (srcStat.isFIFO()) { - throw new ERR_FS_CP_FIFO_PIPE({ - message: `cannot copy a FIFO pipe: ${dest}`, - path: dest, - syscall: 'cp', - errno: EINVAL, - }) - } - // istanbul ignore next: should be unreachable - throw new ERR_FS_CP_UNKNOWN({ - message: `cannot copy an unknown file type: ${dest}`, - path: dest, - syscall: 'cp', - errno: EINVAL, - }) -} - -function onFile (srcStat, destStat, src, dest, opts) { - if (!destStat) { - return _copyFile(srcStat, src, dest, opts) - } - return mayCopyFile(srcStat, src, dest, opts) -} - -async function mayCopyFile (srcStat, src, dest, opts) { - if (opts.force) { - await unlink(dest) - return _copyFile(srcStat, src, dest, opts) - } else if (opts.errorOnExist) { - throw new ERR_FS_CP_EEXIST({ - message: `${dest} already exists`, - path: dest, - syscall: 'cp', - errno: EEXIST, - }) - } -} - -async function _copyFile (srcStat, src, dest, opts) { - await copyFile(src, dest) - if (opts.preserveTimestamps) { - return handleTimestampsAndMode(srcStat.mode, src, dest) - } - return setDestMode(dest, srcStat.mode) -} - -async function handleTimestampsAndMode (srcMode, src, dest) { - // Make sure the file is writable before setting the timestamp - // otherwise open fails with EPERM when invoked with 'r+' - // (through utimes call) - if (fileIsNotWritable(srcMode)) { - await makeFileWritable(dest, srcMode) - return setDestTimestampsAndMode(srcMode, src, dest) - } - return setDestTimestampsAndMode(srcMode, src, dest) -} - -function fileIsNotWritable (srcMode) { - return (srcMode & 0o200) === 0 -} - -function makeFileWritable (dest, srcMode) { - return setDestMode(dest, srcMode | 0o200) -} - -async function setDestTimestampsAndMode (srcMode, src, dest) { - await setDestTimestamps(src, dest) - return setDestMode(dest, srcMode) -} - -function setDestMode (dest, srcMode) { - return chmod(dest, srcMode) -} - -async function setDestTimestamps (src, dest) { - // The initial srcStat.atime cannot be trusted - // because it is modified by the read(2) system call - // (See https://nodejs.org/api/fs.html#fs_stat_time_values) - const updatedSrcStat = await stat(src) - return utimes(dest, updatedSrcStat.atime, updatedSrcStat.mtime) -} - -function onDir (srcStat, destStat, src, dest, opts) { - if (!destStat) { - return mkDirAndCopy(srcStat.mode, src, dest, opts) - } - return copyDir(src, dest, opts) -} - -async function mkDirAndCopy (srcMode, src, dest, opts) { - await mkdir(dest) - await copyDir(src, dest, opts) - return setDestMode(dest, srcMode) -} - -async function copyDir (src, dest, opts) { - const dir = await readdir(src) - for (let i = 0; i < dir.length; i++) { - const item = dir[i] - const srcItem = join(src, item) - const destItem = join(dest, item) - const { destStat } = await checkPaths(srcItem, destItem, opts) - await startCopy(destStat, srcItem, destItem, opts) - } -} - -async function onLink (destStat, src, dest) { - let resolvedSrc = await readlink(src) - if (!isAbsolute(resolvedSrc)) { - resolvedSrc = resolve(dirname(src), resolvedSrc) - } - if (!destStat) { - return symlink(resolvedSrc, dest) - } - let resolvedDest - try { - resolvedDest = await readlink(dest) - } catch (err) { - // Dest exists and is a regular file or directory, - // Windows may throw UNKNOWN error. If dest already exists, - // fs throws error anyway, so no need to guard against it here. - // istanbul ignore next: can only test on windows - if (err.code === 'EINVAL' || err.code === 'UNKNOWN') { - return symlink(resolvedSrc, dest) - } - // istanbul ignore next: should not be possible - throw err - } - if (!isAbsolute(resolvedDest)) { - resolvedDest = resolve(dirname(dest), resolvedDest) - } - if (isSrcSubdir(resolvedSrc, resolvedDest)) { - throw new ERR_FS_CP_EINVAL({ - message: `cannot copy ${resolvedSrc} to a subdirectory of self ` + - `${resolvedDest}`, - path: dest, - syscall: 'cp', - errno: EINVAL, - }) - } - // Do not copy if src is a subdir of dest since unlinking - // dest in this case would result in removing src contents - // and therefore a broken symlink would be created. - const srcStat = await stat(src) - if (srcStat.isDirectory() && isSrcSubdir(resolvedDest, resolvedSrc)) { - throw new ERR_FS_CP_SYMLINK_TO_SUBDIRECTORY({ - message: `cannot overwrite ${resolvedDest} with ${resolvedSrc}`, - path: dest, - syscall: 'cp', - errno: EINVAL, - }) - } - return copyLink(resolvedSrc, dest) -} - -async function copyLink (resolvedSrc, dest) { - await unlink(dest) - return symlink(resolvedSrc, dest) -} - -module.exports = cp diff --git a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/fs/lib/index.js b/deps/npm/node_modules/node-gyp/node_modules/@npmcli/fs/lib/index.js deleted file mode 100644 index 81c746304cc428..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/fs/lib/index.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict' - -const cp = require('./cp/index.js') -const withTempDir = require('./with-temp-dir.js') -const readdirScoped = require('./readdir-scoped.js') -const moveFile = require('./move-file.js') - -module.exports = { - cp, - withTempDir, - readdirScoped, - moveFile, -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/fs/lib/move-file.js b/deps/npm/node_modules/node-gyp/node_modules/@npmcli/fs/lib/move-file.js deleted file mode 100644 index d56e06d384659a..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/fs/lib/move-file.js +++ /dev/null @@ -1,78 +0,0 @@ -const { dirname, join, resolve, relative, isAbsolute } = require('path') -const fs = require('fs/promises') - -const pathExists = async path => { - try { - await fs.access(path) - return true - } catch (er) { - return er.code !== 'ENOENT' - } -} - -const moveFile = async (source, destination, options = {}, root = true, symlinks = []) => { - if (!source || !destination) { - throw new TypeError('`source` and `destination` file required') - } - - options = { - overwrite: true, - ...options, - } - - if (!options.overwrite && await pathExists(destination)) { - throw new Error(`The destination file exists: ${destination}`) - } - - await fs.mkdir(dirname(destination), { recursive: true }) - - try { - await fs.rename(source, destination) - } catch (error) { - if (error.code === 'EXDEV' || error.code === 'EPERM') { - const sourceStat = await fs.lstat(source) - if (sourceStat.isDirectory()) { - const files = await fs.readdir(source) - await Promise.all(files.map((file) => - moveFile(join(source, file), join(destination, file), options, false, symlinks) - )) - } else if (sourceStat.isSymbolicLink()) { - symlinks.push({ source, destination }) - } else { - await fs.copyFile(source, destination) - } - } else { - throw error - } - } - - if (root) { - await Promise.all(symlinks.map(async ({ source: symSource, destination: symDestination }) => { - let target = await fs.readlink(symSource) - // junction symlinks in windows will be absolute paths, so we need to - // make sure they point to the symlink destination - if (isAbsolute(target)) { - target = resolve(symDestination, relative(symSource, target)) - } - // try to determine what the actual file is so we can create the correct - // type of symlink in windows - let targetStat = 'file' - try { - targetStat = await fs.stat(resolve(dirname(symSource), target)) - if (targetStat.isDirectory()) { - targetStat = 'junction' - } - } catch { - // targetStat remains 'file' - } - await fs.symlink( - target, - symDestination, - targetStat - ) - })) - await fs.rm(source, { recursive: true, force: true }) - } -} - -module.exports = moveFile diff --git a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/fs/lib/readdir-scoped.js b/deps/npm/node_modules/node-gyp/node_modules/@npmcli/fs/lib/readdir-scoped.js deleted file mode 100644 index cd601dfbe7486b..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/fs/lib/readdir-scoped.js +++ /dev/null @@ -1,20 +0,0 @@ -const { readdir } = require('fs/promises') -const { join } = require('path') - -const readdirScoped = async (dir) => { - const results = [] - - for (const item of await readdir(dir)) { - if (item.startsWith('@')) { - for (const scopedItem of await readdir(join(dir, item))) { - results.push(join(item, scopedItem)) - } - } else { - results.push(item) - } - } - - return results -} - -module.exports = readdirScoped diff --git a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/fs/lib/with-temp-dir.js b/deps/npm/node_modules/node-gyp/node_modules/@npmcli/fs/lib/with-temp-dir.js deleted file mode 100644 index 0738ac4f29e1be..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/fs/lib/with-temp-dir.js +++ /dev/null @@ -1,39 +0,0 @@ -const { join, sep } = require('path') - -const getOptions = require('./common/get-options.js') -const { mkdir, mkdtemp, rm } = require('fs/promises') - -// create a temp directory, ensure its permissions match its parent, then call -// the supplied function passing it the path to the directory. clean up after -// the function finishes, whether it throws or not -const withTempDir = async (root, fn, opts) => { - const options = getOptions(opts, { - copy: ['tmpPrefix'], - }) - // create the directory - await mkdir(root, { recursive: true }) - - const target = await mkdtemp(join(`${root}${sep}`, options.tmpPrefix || '')) - let err - let result - - try { - result = await fn(target) - } catch (_err) { - err = _err - } - - try { - await rm(target, { force: true, recursive: true }) - } catch { - // ignore errors - } - - if (err) { - throw err - } - - return result -} - -module.exports = withTempDir diff --git a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/fs/package.json b/deps/npm/node_modules/node-gyp/node_modules/@npmcli/fs/package.json deleted file mode 100644 index 5261a11b78000e..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/@npmcli/fs/package.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "name": "@npmcli/fs", - "version": "3.1.1", - "description": "filesystem utilities for the npm cli", - "main": "lib/index.js", - "files": [ - "bin/", - "lib/" - ], - "scripts": { - "snap": "tap", - "test": "tap", - "npmclilint": "npmcli-lint", - "lint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"", - "lintfix": "npm run lint -- --fix", - "posttest": "npm run lint", - "postsnap": "npm run lintfix --", - "postlint": "template-oss-check", - "template-oss-apply": "template-oss-apply --force" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/npm/fs.git" - }, - "keywords": [ - "npm", - "oss" - ], - "author": "GitHub Inc.", - "license": "ISC", - "devDependencies": { - "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.22.0", - "tap": "^16.0.1" - }, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "templateOSS": { - "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.22.0" - }, - "tap": { - "nyc-arg": [ - "--exclude", - "tap-snapshots/**" - ] - } -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/abbrev/LICENSE b/deps/npm/node_modules/node-gyp/node_modules/abbrev/LICENSE deleted file mode 100644 index 9bcfa9d7d8d26e..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/abbrev/LICENSE +++ /dev/null @@ -1,46 +0,0 @@ -This software is dual-licensed under the ISC and MIT licenses. -You may use this software under EITHER of the following licenses. - ----------- - -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - ----------- - -Copyright Isaac Z. Schlueter and Contributors -All rights reserved. - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. diff --git a/deps/npm/node_modules/node-gyp/node_modules/abbrev/lib/index.js b/deps/npm/node_modules/node-gyp/node_modules/abbrev/lib/index.js deleted file mode 100644 index 9f48801f049c9e..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/abbrev/lib/index.js +++ /dev/null @@ -1,50 +0,0 @@ -module.exports = abbrev - -function abbrev (...args) { - let list = args.length === 1 || Array.isArray(args[0]) ? args[0] : args - - for (let i = 0, l = list.length; i < l; i++) { - list[i] = typeof list[i] === 'string' ? list[i] : String(list[i]) - } - - // sort them lexicographically, so that they're next to their nearest kin - list = list.sort(lexSort) - - // walk through each, seeing how much it has in common with the next and previous - const abbrevs = {} - let prev = '' - for (let ii = 0, ll = list.length; ii < ll; ii++) { - const current = list[ii] - const next = list[ii + 1] || '' - let nextMatches = true - let prevMatches = true - if (current === next) { - continue - } - let j = 0 - const cl = current.length - for (; j < cl; j++) { - const curChar = current.charAt(j) - nextMatches = nextMatches && curChar === next.charAt(j) - prevMatches = prevMatches && curChar === prev.charAt(j) - if (!nextMatches && !prevMatches) { - j++ - break - } - } - prev = current - if (j === cl) { - abbrevs[current] = current - continue - } - for (let a = current.slice(0, j); j <= cl; j++) { - abbrevs[a] = current - a += current.charAt(j) - } - } - return abbrevs -} - -function lexSort (a, b) { - return a === b ? 0 : a > b ? 1 : -1 -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/abbrev/package.json b/deps/npm/node_modules/node-gyp/node_modules/abbrev/package.json deleted file mode 100644 index e26400445631ad..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/abbrev/package.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "abbrev", - "version": "2.0.0", - "description": "Like ruby's abbrev module, but in js", - "author": "GitHub Inc.", - "main": "lib/index.js", - "scripts": { - "test": "tap", - "lint": "eslint \"**/*.js\"", - "postlint": "template-oss-check", - "template-oss-apply": "template-oss-apply --force", - "lintfix": "npm run lint -- --fix", - "snap": "tap", - "posttest": "npm run lint" - }, - "repository": { - "type": "git", - "url": "https://github.com/npm/abbrev-js.git" - }, - "license": "ISC", - "devDependencies": { - "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.8.0", - "tap": "^16.3.0" - }, - "tap": { - "nyc-arg": [ - "--exclude", - "tap-snapshots/**" - ] - }, - "files": [ - "bin/", - "lib/" - ], - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "templateOSS": { - "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.8.0" - } -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/LICENSE.md b/deps/npm/node_modules/node-gyp/node_modules/cacache/LICENSE.md deleted file mode 100644 index 8d28acf866d932..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/LICENSE.md +++ /dev/null @@ -1,16 +0,0 @@ -ISC License - -Copyright (c) npm, Inc. - -Permission to use, copy, modify, and/or distribute this software for -any purpose with or without fee is hereby granted, provided that the -above copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE COPYRIGHT HOLDER DISCLAIMS -ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR -CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE -OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE -USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/content/path.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/content/path.js deleted file mode 100644 index ad5a76a4f73f26..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/content/path.js +++ /dev/null @@ -1,29 +0,0 @@ -'use strict' - -const contentVer = require('../../package.json')['cache-version'].content -const hashToSegments = require('../util/hash-to-segments') -const path = require('path') -const ssri = require('ssri') - -// Current format of content file path: -// -// sha512-BaSE64Hex= -> -// ~/.my-cache/content-v2/sha512/ba/da/55deadbeefc0ffee -// -module.exports = contentPath - -function contentPath (cache, integrity) { - const sri = ssri.parse(integrity, { single: true }) - // contentPath is the *strongest* algo given - return path.join( - contentDir(cache), - sri.algorithm, - ...hashToSegments(sri.hexDigest()) - ) -} - -module.exports.contentDir = contentDir - -function contentDir (cache) { - return path.join(cache, `content-v${contentVer}`) -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/content/read.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/content/read.js deleted file mode 100644 index 5f6192c3cec566..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/content/read.js +++ /dev/null @@ -1,165 +0,0 @@ -'use strict' - -const fs = require('fs/promises') -const fsm = require('fs-minipass') -const ssri = require('ssri') -const contentPath = require('./path') -const Pipeline = require('minipass-pipeline') - -module.exports = read - -const MAX_SINGLE_READ_SIZE = 64 * 1024 * 1024 -async function read (cache, integrity, opts = {}) { - const { size } = opts - const { stat, cpath, sri } = await withContentSri(cache, integrity, async (cpath, sri) => { - // get size - const stat = size ? { size } : await fs.stat(cpath) - return { stat, cpath, sri } - }) - - if (stat.size > MAX_SINGLE_READ_SIZE) { - return readPipeline(cpath, stat.size, sri, new Pipeline()).concat() - } - - const data = await fs.readFile(cpath, { encoding: null }) - - if (stat.size !== data.length) { - throw sizeError(stat.size, data.length) - } - - if (!ssri.checkData(data, sri)) { - throw integrityError(sri, cpath) - } - - return data -} - -const readPipeline = (cpath, size, sri, stream) => { - stream.push( - new fsm.ReadStream(cpath, { - size, - readSize: MAX_SINGLE_READ_SIZE, - }), - ssri.integrityStream({ - integrity: sri, - size, - }) - ) - return stream -} - -module.exports.stream = readStream -module.exports.readStream = readStream - -function readStream (cache, integrity, opts = {}) { - const { size } = opts - const stream = new Pipeline() - // Set all this up to run on the stream and then just return the stream - Promise.resolve().then(async () => { - const { stat, cpath, sri } = await withContentSri(cache, integrity, async (cpath, sri) => { - // get size - const stat = size ? { size } : await fs.stat(cpath) - return { stat, cpath, sri } - }) - - return readPipeline(cpath, stat.size, sri, stream) - }).catch(err => stream.emit('error', err)) - - return stream -} - -module.exports.copy = copy - -function copy (cache, integrity, dest) { - return withContentSri(cache, integrity, (cpath) => { - return fs.copyFile(cpath, dest) - }) -} - -module.exports.hasContent = hasContent - -async function hasContent (cache, integrity) { - if (!integrity) { - return false - } - - try { - return await withContentSri(cache, integrity, async (cpath, sri) => { - const stat = await fs.stat(cpath) - return { size: stat.size, sri, stat } - }) - } catch (err) { - if (err.code === 'ENOENT') { - return false - } - - if (err.code === 'EPERM') { - /* istanbul ignore else */ - if (process.platform !== 'win32') { - throw err - } else { - return false - } - } - } -} - -async function withContentSri (cache, integrity, fn) { - const sri = ssri.parse(integrity) - // If `integrity` has multiple entries, pick the first digest - // with available local data. - const algo = sri.pickAlgorithm() - const digests = sri[algo] - - if (digests.length <= 1) { - const cpath = contentPath(cache, digests[0]) - return fn(cpath, digests[0]) - } else { - // Can't use race here because a generic error can happen before - // a ENOENT error, and can happen before a valid result - const results = await Promise.all(digests.map(async (meta) => { - try { - return await withContentSri(cache, meta, fn) - } catch (err) { - if (err.code === 'ENOENT') { - return Object.assign( - new Error('No matching content found for ' + sri.toString()), - { code: 'ENOENT' } - ) - } - return err - } - })) - // Return the first non error if it is found - const result = results.find((r) => !(r instanceof Error)) - if (result) { - return result - } - - // Throw the No matching content found error - const enoentError = results.find((r) => r.code === 'ENOENT') - if (enoentError) { - throw enoentError - } - - // Throw generic error - throw results.find((r) => r instanceof Error) - } -} - -function sizeError (expected, found) { - /* eslint-disable-next-line max-len */ - const err = new Error(`Bad data size: expected inserted data to be ${expected} bytes, but got ${found} instead`) - err.expected = expected - err.found = found - err.code = 'EBADSIZE' - return err -} - -function integrityError (sri, path) { - const err = new Error(`Integrity verification failed for ${sri} (${path})`) - err.code = 'EINTEGRITY' - err.sri = sri - err.path = path - return err -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/content/rm.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/content/rm.js deleted file mode 100644 index ce58d679e4cb25..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/content/rm.js +++ /dev/null @@ -1,18 +0,0 @@ -'use strict' - -const fs = require('fs/promises') -const contentPath = require('./path') -const { hasContent } = require('./read') - -module.exports = rm - -async function rm (cache, integrity) { - const content = await hasContent(cache, integrity) - // ~pretty~ sure we can't end up with a content lacking sri, but be safe - if (content && content.sri) { - await fs.rm(contentPath(cache, content.sri), { recursive: true, force: true }) - return true - } else { - return false - } -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/content/write.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/content/write.js deleted file mode 100644 index e7187abca8788a..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/content/write.js +++ /dev/null @@ -1,206 +0,0 @@ -'use strict' - -const events = require('events') - -const contentPath = require('./path') -const fs = require('fs/promises') -const { moveFile } = require('@npmcli/fs') -const { Minipass } = require('minipass') -const Pipeline = require('minipass-pipeline') -const Flush = require('minipass-flush') -const path = require('path') -const ssri = require('ssri') -const uniqueFilename = require('unique-filename') -const fsm = require('fs-minipass') - -module.exports = write - -// Cache of move operations in process so we don't duplicate -const moveOperations = new Map() - -async function write (cache, data, opts = {}) { - const { algorithms, size, integrity } = opts - - if (typeof size === 'number' && data.length !== size) { - throw sizeError(size, data.length) - } - - const sri = ssri.fromData(data, algorithms ? { algorithms } : {}) - if (integrity && !ssri.checkData(data, integrity, opts)) { - throw checksumError(integrity, sri) - } - - for (const algo in sri) { - const tmp = await makeTmp(cache, opts) - const hash = sri[algo].toString() - try { - await fs.writeFile(tmp.target, data, { flag: 'wx' }) - await moveToDestination(tmp, cache, hash, opts) - } finally { - if (!tmp.moved) { - await fs.rm(tmp.target, { recursive: true, force: true }) - } - } - } - return { integrity: sri, size: data.length } -} - -module.exports.stream = writeStream - -// writes proxied to the 'inputStream' that is passed to the Promise -// 'end' is deferred until content is handled. -class CacacheWriteStream extends Flush { - constructor (cache, opts) { - super() - this.opts = opts - this.cache = cache - this.inputStream = new Minipass() - this.inputStream.on('error', er => this.emit('error', er)) - this.inputStream.on('drain', () => this.emit('drain')) - this.handleContentP = null - } - - write (chunk, encoding, cb) { - if (!this.handleContentP) { - this.handleContentP = handleContent( - this.inputStream, - this.cache, - this.opts - ) - this.handleContentP.catch(error => this.emit('error', error)) - } - return this.inputStream.write(chunk, encoding, cb) - } - - flush (cb) { - this.inputStream.end(() => { - if (!this.handleContentP) { - const e = new Error('Cache input stream was empty') - e.code = 'ENODATA' - // empty streams are probably emitting end right away. - // defer this one tick by rejecting a promise on it. - return Promise.reject(e).catch(cb) - } - // eslint-disable-next-line promise/catch-or-return - this.handleContentP.then( - (res) => { - res.integrity && this.emit('integrity', res.integrity) - // eslint-disable-next-line promise/always-return - res.size !== null && this.emit('size', res.size) - cb() - }, - (er) => cb(er) - ) - }) - } -} - -function writeStream (cache, opts = {}) { - return new CacacheWriteStream(cache, opts) -} - -async function handleContent (inputStream, cache, opts) { - const tmp = await makeTmp(cache, opts) - try { - const res = await pipeToTmp(inputStream, cache, tmp.target, opts) - await moveToDestination( - tmp, - cache, - res.integrity, - opts - ) - return res - } finally { - if (!tmp.moved) { - await fs.rm(tmp.target, { recursive: true, force: true }) - } - } -} - -async function pipeToTmp (inputStream, cache, tmpTarget, opts) { - const outStream = new fsm.WriteStream(tmpTarget, { - flags: 'wx', - }) - - if (opts.integrityEmitter) { - // we need to create these all simultaneously since they can fire in any order - const [integrity, size] = await Promise.all([ - events.once(opts.integrityEmitter, 'integrity').then(res => res[0]), - events.once(opts.integrityEmitter, 'size').then(res => res[0]), - new Pipeline(inputStream, outStream).promise(), - ]) - return { integrity, size } - } - - let integrity - let size - const hashStream = ssri.integrityStream({ - integrity: opts.integrity, - algorithms: opts.algorithms, - size: opts.size, - }) - hashStream.on('integrity', i => { - integrity = i - }) - hashStream.on('size', s => { - size = s - }) - - const pipeline = new Pipeline(inputStream, hashStream, outStream) - await pipeline.promise() - return { integrity, size } -} - -async function makeTmp (cache, opts) { - const tmpTarget = uniqueFilename(path.join(cache, 'tmp'), opts.tmpPrefix) - await fs.mkdir(path.dirname(tmpTarget), { recursive: true }) - return { - target: tmpTarget, - moved: false, - } -} - -async function moveToDestination (tmp, cache, sri) { - const destination = contentPath(cache, sri) - const destDir = path.dirname(destination) - if (moveOperations.has(destination)) { - return moveOperations.get(destination) - } - moveOperations.set( - destination, - fs.mkdir(destDir, { recursive: true }) - .then(async () => { - await moveFile(tmp.target, destination, { overwrite: false }) - tmp.moved = true - return tmp.moved - }) - .catch(err => { - if (!err.message.startsWith('The destination file exists')) { - throw Object.assign(err, { code: 'EEXIST' }) - } - }).finally(() => { - moveOperations.delete(destination) - }) - - ) - return moveOperations.get(destination) -} - -function sizeError (expected, found) { - /* eslint-disable-next-line max-len */ - const err = new Error(`Bad data size: expected inserted data to be ${expected} bytes, but got ${found} instead`) - err.expected = expected - err.found = found - err.code = 'EBADSIZE' - return err -} - -function checksumError (expected, found) { - const err = new Error(`Integrity check failed: - Wanted: ${expected} - Found: ${found}`) - err.code = 'EINTEGRITY' - err.expected = expected - err.found = found - return err -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/entry-index.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/entry-index.js deleted file mode 100644 index 89c28f2f257d48..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/entry-index.js +++ /dev/null @@ -1,336 +0,0 @@ -'use strict' - -const crypto = require('crypto') -const { - appendFile, - mkdir, - readFile, - readdir, - rm, - writeFile, -} = require('fs/promises') -const { Minipass } = require('minipass') -const path = require('path') -const ssri = require('ssri') -const uniqueFilename = require('unique-filename') - -const contentPath = require('./content/path') -const hashToSegments = require('./util/hash-to-segments') -const indexV = require('../package.json')['cache-version'].index -const { moveFile } = require('@npmcli/fs') - -const pMap = require('p-map') -const lsStreamConcurrency = 5 - -module.exports.NotFoundError = class NotFoundError extends Error { - constructor (cache, key) { - super(`No cache entry for ${key} found in ${cache}`) - this.code = 'ENOENT' - this.cache = cache - this.key = key - } -} - -module.exports.compact = compact - -async function compact (cache, key, matchFn, opts = {}) { - const bucket = bucketPath(cache, key) - const entries = await bucketEntries(bucket) - const newEntries = [] - // we loop backwards because the bottom-most result is the newest - // since we add new entries with appendFile - for (let i = entries.length - 1; i >= 0; --i) { - const entry = entries[i] - // a null integrity could mean either a delete was appended - // or the user has simply stored an index that does not map - // to any content. we determine if the user wants to keep the - // null integrity based on the validateEntry function passed in options. - // if the integrity is null and no validateEntry is provided, we break - // as we consider the null integrity to be a deletion of everything - // that came before it. - if (entry.integrity === null && !opts.validateEntry) { - break - } - - // if this entry is valid, and it is either the first entry or - // the newEntries array doesn't already include an entry that - // matches this one based on the provided matchFn, then we add - // it to the beginning of our list - if ((!opts.validateEntry || opts.validateEntry(entry) === true) && - (newEntries.length === 0 || - !newEntries.find((oldEntry) => matchFn(oldEntry, entry)))) { - newEntries.unshift(entry) - } - } - - const newIndex = '\n' + newEntries.map((entry) => { - const stringified = JSON.stringify(entry) - const hash = hashEntry(stringified) - return `${hash}\t${stringified}` - }).join('\n') - - const setup = async () => { - const target = uniqueFilename(path.join(cache, 'tmp'), opts.tmpPrefix) - await mkdir(path.dirname(target), { recursive: true }) - return { - target, - moved: false, - } - } - - const teardown = async (tmp) => { - if (!tmp.moved) { - return rm(tmp.target, { recursive: true, force: true }) - } - } - - const write = async (tmp) => { - await writeFile(tmp.target, newIndex, { flag: 'wx' }) - await mkdir(path.dirname(bucket), { recursive: true }) - // we use @npmcli/move-file directly here because we - // want to overwrite the existing file - await moveFile(tmp.target, bucket) - tmp.moved = true - } - - // write the file atomically - const tmp = await setup() - try { - await write(tmp) - } finally { - await teardown(tmp) - } - - // we reverse the list we generated such that the newest - // entries come first in order to make looping through them easier - // the true passed to formatEntry tells it to keep null - // integrity values, if they made it this far it's because - // validateEntry returned true, and as such we should return it - return newEntries.reverse().map((entry) => formatEntry(cache, entry, true)) -} - -module.exports.insert = insert - -async function insert (cache, key, integrity, opts = {}) { - const { metadata, size, time } = opts - const bucket = bucketPath(cache, key) - const entry = { - key, - integrity: integrity && ssri.stringify(integrity), - time: time || Date.now(), - size, - metadata, - } - try { - await mkdir(path.dirname(bucket), { recursive: true }) - const stringified = JSON.stringify(entry) - // NOTE - Cleverness ahoy! - // - // This works because it's tremendously unlikely for an entry to corrupt - // another while still preserving the string length of the JSON in - // question. So, we just slap the length in there and verify it on read. - // - // Thanks to @isaacs for the whiteboarding session that ended up with - // this. - await appendFile(bucket, `\n${hashEntry(stringified)}\t${stringified}`) - } catch (err) { - if (err.code === 'ENOENT') { - return undefined - } - - throw err - } - return formatEntry(cache, entry) -} - -module.exports.find = find - -async function find (cache, key) { - const bucket = bucketPath(cache, key) - try { - const entries = await bucketEntries(bucket) - return entries.reduce((latest, next) => { - if (next && next.key === key) { - return formatEntry(cache, next) - } else { - return latest - } - }, null) - } catch (err) { - if (err.code === 'ENOENT') { - return null - } else { - throw err - } - } -} - -module.exports.delete = del - -function del (cache, key, opts = {}) { - if (!opts.removeFully) { - return insert(cache, key, null, opts) - } - - const bucket = bucketPath(cache, key) - return rm(bucket, { recursive: true, force: true }) -} - -module.exports.lsStream = lsStream - -function lsStream (cache) { - const indexDir = bucketDir(cache) - const stream = new Minipass({ objectMode: true }) - - // Set all this up to run on the stream and then just return the stream - Promise.resolve().then(async () => { - const buckets = await readdirOrEmpty(indexDir) - await pMap(buckets, async (bucket) => { - const bucketPath = path.join(indexDir, bucket) - const subbuckets = await readdirOrEmpty(bucketPath) - await pMap(subbuckets, async (subbucket) => { - const subbucketPath = path.join(bucketPath, subbucket) - - // "/cachename//./*" - const subbucketEntries = await readdirOrEmpty(subbucketPath) - await pMap(subbucketEntries, async (entry) => { - const entryPath = path.join(subbucketPath, entry) - try { - const entries = await bucketEntries(entryPath) - // using a Map here prevents duplicate keys from showing up - // twice, I guess? - const reduced = entries.reduce((acc, entry) => { - acc.set(entry.key, entry) - return acc - }, new Map()) - // reduced is a map of key => entry - for (const entry of reduced.values()) { - const formatted = formatEntry(cache, entry) - if (formatted) { - stream.write(formatted) - } - } - } catch (err) { - if (err.code === 'ENOENT') { - return undefined - } - throw err - } - }, - { concurrency: lsStreamConcurrency }) - }, - { concurrency: lsStreamConcurrency }) - }, - { concurrency: lsStreamConcurrency }) - stream.end() - return stream - }).catch(err => stream.emit('error', err)) - - return stream -} - -module.exports.ls = ls - -async function ls (cache) { - const entries = await lsStream(cache).collect() - return entries.reduce((acc, xs) => { - acc[xs.key] = xs - return acc - }, {}) -} - -module.exports.bucketEntries = bucketEntries - -async function bucketEntries (bucket, filter) { - const data = await readFile(bucket, 'utf8') - return _bucketEntries(data, filter) -} - -function _bucketEntries (data) { - const entries = [] - data.split('\n').forEach((entry) => { - if (!entry) { - return - } - - const pieces = entry.split('\t') - if (!pieces[1] || hashEntry(pieces[1]) !== pieces[0]) { - // Hash is no good! Corruption or malice? Doesn't matter! - // EJECT EJECT - return - } - let obj - try { - obj = JSON.parse(pieces[1]) - } catch (_) { - // eslint-ignore-next-line no-empty-block - } - // coverage disabled here, no need to test with an entry that parses to something falsey - // istanbul ignore else - if (obj) { - entries.push(obj) - } - }) - return entries -} - -module.exports.bucketDir = bucketDir - -function bucketDir (cache) { - return path.join(cache, `index-v${indexV}`) -} - -module.exports.bucketPath = bucketPath - -function bucketPath (cache, key) { - const hashed = hashKey(key) - return path.join.apply( - path, - [bucketDir(cache)].concat(hashToSegments(hashed)) - ) -} - -module.exports.hashKey = hashKey - -function hashKey (key) { - return hash(key, 'sha256') -} - -module.exports.hashEntry = hashEntry - -function hashEntry (str) { - return hash(str, 'sha1') -} - -function hash (str, digest) { - return crypto - .createHash(digest) - .update(str) - .digest('hex') -} - -function formatEntry (cache, entry, keepAll) { - // Treat null digests as deletions. They'll shadow any previous entries. - if (!entry.integrity && !keepAll) { - return null - } - - return { - key: entry.key, - integrity: entry.integrity, - path: entry.integrity ? contentPath(cache, entry.integrity) : undefined, - size: entry.size, - time: entry.time, - metadata: entry.metadata, - } -} - -function readdirOrEmpty (dir) { - return readdir(dir).catch((err) => { - if (err.code === 'ENOENT' || err.code === 'ENOTDIR') { - return [] - } - - throw err - }) -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/get.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/get.js deleted file mode 100644 index 80ec206c7ecaaa..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/get.js +++ /dev/null @@ -1,170 +0,0 @@ -'use strict' - -const Collect = require('minipass-collect') -const { Minipass } = require('minipass') -const Pipeline = require('minipass-pipeline') - -const index = require('./entry-index') -const memo = require('./memoization') -const read = require('./content/read') - -async function getData (cache, key, opts = {}) { - const { integrity, memoize, size } = opts - const memoized = memo.get(cache, key, opts) - if (memoized && memoize !== false) { - return { - metadata: memoized.entry.metadata, - data: memoized.data, - integrity: memoized.entry.integrity, - size: memoized.entry.size, - } - } - - const entry = await index.find(cache, key, opts) - if (!entry) { - throw new index.NotFoundError(cache, key) - } - const data = await read(cache, entry.integrity, { integrity, size }) - if (memoize) { - memo.put(cache, entry, data, opts) - } - - return { - data, - metadata: entry.metadata, - size: entry.size, - integrity: entry.integrity, - } -} -module.exports = getData - -async function getDataByDigest (cache, key, opts = {}) { - const { integrity, memoize, size } = opts - const memoized = memo.get.byDigest(cache, key, opts) - if (memoized && memoize !== false) { - return memoized - } - - const res = await read(cache, key, { integrity, size }) - if (memoize) { - memo.put.byDigest(cache, key, res, opts) - } - return res -} -module.exports.byDigest = getDataByDigest - -const getMemoizedStream = (memoized) => { - const stream = new Minipass() - stream.on('newListener', function (ev, cb) { - ev === 'metadata' && cb(memoized.entry.metadata) - ev === 'integrity' && cb(memoized.entry.integrity) - ev === 'size' && cb(memoized.entry.size) - }) - stream.end(memoized.data) - return stream -} - -function getStream (cache, key, opts = {}) { - const { memoize, size } = opts - const memoized = memo.get(cache, key, opts) - if (memoized && memoize !== false) { - return getMemoizedStream(memoized) - } - - const stream = new Pipeline() - // Set all this up to run on the stream and then just return the stream - Promise.resolve().then(async () => { - const entry = await index.find(cache, key) - if (!entry) { - throw new index.NotFoundError(cache, key) - } - - stream.emit('metadata', entry.metadata) - stream.emit('integrity', entry.integrity) - stream.emit('size', entry.size) - stream.on('newListener', function (ev, cb) { - ev === 'metadata' && cb(entry.metadata) - ev === 'integrity' && cb(entry.integrity) - ev === 'size' && cb(entry.size) - }) - - const src = read.readStream( - cache, - entry.integrity, - { ...opts, size: typeof size !== 'number' ? entry.size : size } - ) - - if (memoize) { - const memoStream = new Collect.PassThrough() - memoStream.on('collect', data => memo.put(cache, entry, data, opts)) - stream.unshift(memoStream) - } - stream.unshift(src) - return stream - }).catch((err) => stream.emit('error', err)) - - return stream -} - -module.exports.stream = getStream - -function getStreamDigest (cache, integrity, opts = {}) { - const { memoize } = opts - const memoized = memo.get.byDigest(cache, integrity, opts) - if (memoized && memoize !== false) { - const stream = new Minipass() - stream.end(memoized) - return stream - } else { - const stream = read.readStream(cache, integrity, opts) - if (!memoize) { - return stream - } - - const memoStream = new Collect.PassThrough() - memoStream.on('collect', data => memo.put.byDigest( - cache, - integrity, - data, - opts - )) - return new Pipeline(stream, memoStream) - } -} - -module.exports.stream.byDigest = getStreamDigest - -function info (cache, key, opts = {}) { - const { memoize } = opts - const memoized = memo.get(cache, key, opts) - if (memoized && memoize !== false) { - return Promise.resolve(memoized.entry) - } else { - return index.find(cache, key) - } -} -module.exports.info = info - -async function copy (cache, key, dest, opts = {}) { - const entry = await index.find(cache, key, opts) - if (!entry) { - throw new index.NotFoundError(cache, key) - } - await read.copy(cache, entry.integrity, dest, opts) - return { - metadata: entry.metadata, - size: entry.size, - integrity: entry.integrity, - } -} - -module.exports.copy = copy - -async function copyByDigest (cache, key, dest, opts = {}) { - await read.copy(cache, key, dest, opts) - return key -} - -module.exports.copy.byDigest = copyByDigest - -module.exports.hasContent = read.hasContent diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/index.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/index.js deleted file mode 100644 index c9b0da5f3a271b..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/index.js +++ /dev/null @@ -1,42 +0,0 @@ -'use strict' - -const get = require('./get.js') -const put = require('./put.js') -const rm = require('./rm.js') -const verify = require('./verify.js') -const { clearMemoized } = require('./memoization.js') -const tmp = require('./util/tmp.js') -const index = require('./entry-index.js') - -module.exports.index = {} -module.exports.index.compact = index.compact -module.exports.index.insert = index.insert - -module.exports.ls = index.ls -module.exports.ls.stream = index.lsStream - -module.exports.get = get -module.exports.get.byDigest = get.byDigest -module.exports.get.stream = get.stream -module.exports.get.stream.byDigest = get.stream.byDigest -module.exports.get.copy = get.copy -module.exports.get.copy.byDigest = get.copy.byDigest -module.exports.get.info = get.info -module.exports.get.hasContent = get.hasContent - -module.exports.put = put -module.exports.put.stream = put.stream - -module.exports.rm = rm.entry -module.exports.rm.all = rm.all -module.exports.rm.entry = module.exports.rm -module.exports.rm.content = rm.content - -module.exports.clearMemoized = clearMemoized - -module.exports.tmp = {} -module.exports.tmp.mkdir = tmp.mkdir -module.exports.tmp.withTmp = tmp.withTmp - -module.exports.verify = verify -module.exports.verify.lastRun = verify.lastRun diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/memoization.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/memoization.js deleted file mode 100644 index 2ecc60912e4563..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/memoization.js +++ /dev/null @@ -1,72 +0,0 @@ -'use strict' - -const { LRUCache } = require('lru-cache') - -const MEMOIZED = new LRUCache({ - max: 500, - maxSize: 50 * 1024 * 1024, // 50MB - ttl: 3 * 60 * 1000, // 3 minutes - sizeCalculation: (entry, key) => key.startsWith('key:') ? entry.data.length : entry.length, -}) - -module.exports.clearMemoized = clearMemoized - -function clearMemoized () { - const old = {} - MEMOIZED.forEach((v, k) => { - old[k] = v - }) - MEMOIZED.clear() - return old -} - -module.exports.put = put - -function put (cache, entry, data, opts) { - pickMem(opts).set(`key:${cache}:${entry.key}`, { entry, data }) - putDigest(cache, entry.integrity, data, opts) -} - -module.exports.put.byDigest = putDigest - -function putDigest (cache, integrity, data, opts) { - pickMem(opts).set(`digest:${cache}:${integrity}`, data) -} - -module.exports.get = get - -function get (cache, key, opts) { - return pickMem(opts).get(`key:${cache}:${key}`) -} - -module.exports.get.byDigest = getDigest - -function getDigest (cache, integrity, opts) { - return pickMem(opts).get(`digest:${cache}:${integrity}`) -} - -class ObjProxy { - constructor (obj) { - this.obj = obj - } - - get (key) { - return this.obj[key] - } - - set (key, val) { - this.obj[key] = val - } -} - -function pickMem (opts) { - if (!opts || !opts.memoize) { - return MEMOIZED - } else if (opts.memoize.get && opts.memoize.set) { - return opts.memoize - } else if (typeof opts.memoize === 'object') { - return new ObjProxy(opts.memoize) - } else { - return MEMOIZED - } -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/put.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/put.js deleted file mode 100644 index 9fc932d5f6dec5..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/put.js +++ /dev/null @@ -1,80 +0,0 @@ -'use strict' - -const index = require('./entry-index') -const memo = require('./memoization') -const write = require('./content/write') -const Flush = require('minipass-flush') -const { PassThrough } = require('minipass-collect') -const Pipeline = require('minipass-pipeline') - -const putOpts = (opts) => ({ - algorithms: ['sha512'], - ...opts, -}) - -module.exports = putData - -async function putData (cache, key, data, opts = {}) { - const { memoize } = opts - opts = putOpts(opts) - const res = await write(cache, data, opts) - const entry = await index.insert(cache, key, res.integrity, { ...opts, size: res.size }) - if (memoize) { - memo.put(cache, entry, data, opts) - } - - return res.integrity -} - -module.exports.stream = putStream - -function putStream (cache, key, opts = {}) { - const { memoize } = opts - opts = putOpts(opts) - let integrity - let size - let error - - let memoData - const pipeline = new Pipeline() - // first item in the pipeline is the memoizer, because we need - // that to end first and get the collected data. - if (memoize) { - const memoizer = new PassThrough().on('collect', data => { - memoData = data - }) - pipeline.push(memoizer) - } - - // contentStream is a write-only, not a passthrough - // no data comes out of it. - const contentStream = write.stream(cache, opts) - .on('integrity', (int) => { - integrity = int - }) - .on('size', (s) => { - size = s - }) - .on('error', (err) => { - error = err - }) - - pipeline.push(contentStream) - - // last but not least, we write the index and emit hash and size, - // and memoize if we're doing that - pipeline.push(new Flush({ - async flush () { - if (!error) { - const entry = await index.insert(cache, key, integrity, { ...opts, size }) - if (memoize && memoData) { - memo.put(cache, entry, memoData, opts) - } - pipeline.emit('integrity', integrity) - pipeline.emit('size', size) - } - }, - })) - - return pipeline -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/rm.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/rm.js deleted file mode 100644 index a94760c7cf2430..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/rm.js +++ /dev/null @@ -1,31 +0,0 @@ -'use strict' - -const { rm } = require('fs/promises') -const glob = require('./util/glob.js') -const index = require('./entry-index') -const memo = require('./memoization') -const path = require('path') -const rmContent = require('./content/rm') - -module.exports = entry -module.exports.entry = entry - -function entry (cache, key, opts) { - memo.clearMemoized() - return index.delete(cache, key, opts) -} - -module.exports.content = content - -function content (cache, integrity) { - memo.clearMemoized() - return rmContent(cache, integrity) -} - -module.exports.all = all - -async function all (cache) { - memo.clearMemoized() - const paths = await glob(path.join(cache, '*(content-*|index-*)'), { silent: true, nosort: true }) - return Promise.all(paths.map((p) => rm(p, { recursive: true, force: true }))) -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/util/glob.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/util/glob.js deleted file mode 100644 index 8500c1c16a429f..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/util/glob.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict' - -const { glob } = require('glob') -const path = require('path') - -const globify = (pattern) => pattern.split(path.win32.sep).join(path.posix.sep) -module.exports = (path, options) => glob(globify(path), options) diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/util/hash-to-segments.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/util/hash-to-segments.js deleted file mode 100644 index 445599b5038088..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/util/hash-to-segments.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict' - -module.exports = hashToSegments - -function hashToSegments (hash) { - return [hash.slice(0, 2), hash.slice(2, 4), hash.slice(4)] -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/util/tmp.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/util/tmp.js deleted file mode 100644 index 0bf5302136ebeb..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/util/tmp.js +++ /dev/null @@ -1,26 +0,0 @@ -'use strict' - -const { withTempDir } = require('@npmcli/fs') -const fs = require('fs/promises') -const path = require('path') - -module.exports.mkdir = mktmpdir - -async function mktmpdir (cache, opts = {}) { - const { tmpPrefix } = opts - const tmpDir = path.join(cache, 'tmp') - await fs.mkdir(tmpDir, { recursive: true, owner: 'inherit' }) - // do not use path.join(), it drops the trailing / if tmpPrefix is unset - const target = `${tmpDir}${path.sep}${tmpPrefix || ''}` - return fs.mkdtemp(target, { owner: 'inherit' }) -} - -module.exports.withTmp = withTmp - -function withTmp (cache, opts, cb) { - if (!cb) { - cb = opts - opts = {} - } - return withTempDir(path.join(cache, 'tmp'), cb, opts) -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/verify.js b/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/verify.js deleted file mode 100644 index d7423da1295b68..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/lib/verify.js +++ /dev/null @@ -1,257 +0,0 @@ -'use strict' - -const { - mkdir, - readFile, - rm, - stat, - truncate, - writeFile, -} = require('fs/promises') -const pMap = require('p-map') -const contentPath = require('./content/path') -const fsm = require('fs-minipass') -const glob = require('./util/glob.js') -const index = require('./entry-index') -const path = require('path') -const ssri = require('ssri') - -const hasOwnProperty = (obj, key) => - Object.prototype.hasOwnProperty.call(obj, key) - -const verifyOpts = (opts) => ({ - concurrency: 20, - log: { silly () {} }, - ...opts, -}) - -module.exports = verify - -async function verify (cache, opts) { - opts = verifyOpts(opts) - opts.log.silly('verify', 'verifying cache at', cache) - - const steps = [ - markStartTime, - fixPerms, - garbageCollect, - rebuildIndex, - cleanTmp, - writeVerifile, - markEndTime, - ] - - const stats = {} - for (const step of steps) { - const label = step.name - const start = new Date() - const s = await step(cache, opts) - if (s) { - Object.keys(s).forEach((k) => { - stats[k] = s[k] - }) - } - const end = new Date() - if (!stats.runTime) { - stats.runTime = {} - } - stats.runTime[label] = end - start - } - stats.runTime.total = stats.endTime - stats.startTime - opts.log.silly( - 'verify', - 'verification finished for', - cache, - 'in', - `${stats.runTime.total}ms` - ) - return stats -} - -async function markStartTime () { - return { startTime: new Date() } -} - -async function markEndTime () { - return { endTime: new Date() } -} - -async function fixPerms (cache, opts) { - opts.log.silly('verify', 'fixing cache permissions') - await mkdir(cache, { recursive: true }) - return null -} - -// Implements a naive mark-and-sweep tracing garbage collector. -// -// The algorithm is basically as follows: -// 1. Read (and filter) all index entries ("pointers") -// 2. Mark each integrity value as "live" -// 3. Read entire filesystem tree in `content-vX/` dir -// 4. If content is live, verify its checksum and delete it if it fails -// 5. If content is not marked as live, rm it. -// -async function garbageCollect (cache, opts) { - opts.log.silly('verify', 'garbage collecting content') - const indexStream = index.lsStream(cache) - const liveContent = new Set() - indexStream.on('data', (entry) => { - if (opts.filter && !opts.filter(entry)) { - return - } - - // integrity is stringified, re-parse it so we can get each hash - const integrity = ssri.parse(entry.integrity) - for (const algo in integrity) { - liveContent.add(integrity[algo].toString()) - } - }) - await new Promise((resolve, reject) => { - indexStream.on('end', resolve).on('error', reject) - }) - const contentDir = contentPath.contentDir(cache) - const files = await glob(path.join(contentDir, '**'), { - follow: false, - nodir: true, - nosort: true, - }) - const stats = { - verifiedContent: 0, - reclaimedCount: 0, - reclaimedSize: 0, - badContentCount: 0, - keptSize: 0, - } - await pMap( - files, - async (f) => { - const split = f.split(/[/\\]/) - const digest = split.slice(split.length - 3).join('') - const algo = split[split.length - 4] - const integrity = ssri.fromHex(digest, algo) - if (liveContent.has(integrity.toString())) { - const info = await verifyContent(f, integrity) - if (!info.valid) { - stats.reclaimedCount++ - stats.badContentCount++ - stats.reclaimedSize += info.size - } else { - stats.verifiedContent++ - stats.keptSize += info.size - } - } else { - // No entries refer to this content. We can delete. - stats.reclaimedCount++ - const s = await stat(f) - await rm(f, { recursive: true, force: true }) - stats.reclaimedSize += s.size - } - return stats - }, - { concurrency: opts.concurrency } - ) - return stats -} - -async function verifyContent (filepath, sri) { - const contentInfo = {} - try { - const { size } = await stat(filepath) - contentInfo.size = size - contentInfo.valid = true - await ssri.checkStream(new fsm.ReadStream(filepath), sri) - } catch (err) { - if (err.code === 'ENOENT') { - return { size: 0, valid: false } - } - if (err.code !== 'EINTEGRITY') { - throw err - } - - await rm(filepath, { recursive: true, force: true }) - contentInfo.valid = false - } - return contentInfo -} - -async function rebuildIndex (cache, opts) { - opts.log.silly('verify', 'rebuilding index') - const entries = await index.ls(cache) - const stats = { - missingContent: 0, - rejectedEntries: 0, - totalEntries: 0, - } - const buckets = {} - for (const k in entries) { - /* istanbul ignore else */ - if (hasOwnProperty(entries, k)) { - const hashed = index.hashKey(k) - const entry = entries[k] - const excluded = opts.filter && !opts.filter(entry) - excluded && stats.rejectedEntries++ - if (buckets[hashed] && !excluded) { - buckets[hashed].push(entry) - } else if (buckets[hashed] && excluded) { - // skip - } else if (excluded) { - buckets[hashed] = [] - buckets[hashed]._path = index.bucketPath(cache, k) - } else { - buckets[hashed] = [entry] - buckets[hashed]._path = index.bucketPath(cache, k) - } - } - } - await pMap( - Object.keys(buckets), - (key) => { - return rebuildBucket(cache, buckets[key], stats, opts) - }, - { concurrency: opts.concurrency } - ) - return stats -} - -async function rebuildBucket (cache, bucket, stats) { - await truncate(bucket._path) - // This needs to be serialized because cacache explicitly - // lets very racy bucket conflicts clobber each other. - for (const entry of bucket) { - const content = contentPath(cache, entry.integrity) - try { - await stat(content) - await index.insert(cache, entry.key, entry.integrity, { - metadata: entry.metadata, - size: entry.size, - time: entry.time, - }) - stats.totalEntries++ - } catch (err) { - if (err.code === 'ENOENT') { - stats.rejectedEntries++ - stats.missingContent++ - } else { - throw err - } - } - } -} - -function cleanTmp (cache, opts) { - opts.log.silly('verify', 'cleaning tmp directory') - return rm(path.join(cache, 'tmp'), { recursive: true, force: true }) -} - -async function writeVerifile (cache, opts) { - const verifile = path.join(cache, '_lastverified') - opts.log.silly('verify', 'writing verifile to ' + verifile) - return writeFile(verifile, `${Date.now()}`) -} - -module.exports.lastRun = lastRun - -async function lastRun (cache) { - const data = await readFile(path.join(cache, '_lastverified'), { encoding: 'utf8' }) - return new Date(+data) -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/cacache/package.json b/deps/npm/node_modules/node-gyp/node_modules/cacache/package.json deleted file mode 100644 index 6e6219158ed759..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/cacache/package.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "name": "cacache", - "version": "18.0.4", - "cache-version": { - "content": "2", - "index": "5" - }, - "description": "Fast, fault-tolerant, cross-platform, disk-based, data-agnostic, content-addressable cache.", - "main": "lib/index.js", - "files": [ - "bin/", - "lib/" - ], - "scripts": { - "test": "tap", - "snap": "tap", - "coverage": "tap", - "test-docker": "docker run -it --rm --name pacotest -v \"$PWD\":/tmp -w /tmp node:latest npm test", - "lint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"", - "npmclilint": "npmcli-lint", - "lintfix": "npm run lint -- --fix", - "postsnap": "npm run lintfix --", - "postlint": "template-oss-check", - "posttest": "npm run lint", - "template-oss-apply": "template-oss-apply --force" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/npm/cacache.git" - }, - "keywords": [ - "cache", - "caching", - "content-addressable", - "sri", - "sri hash", - "subresource integrity", - "cache", - "storage", - "store", - "file store", - "filesystem", - "disk cache", - "disk storage" - ], - "license": "ISC", - "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^10.0.1", - "minipass": "^7.0.3", - "minipass-collect": "^2.0.1", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, - "devDependencies": { - "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.22.0", - "tap": "^16.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - }, - "templateOSS": { - "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "windowsCI": false, - "version": "4.22.0", - "publish": "true" - }, - "author": "GitHub Inc.", - "tap": { - "nyc-arg": [ - "--exclude", - "tap-snapshots/**" - ] - } -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/chownr/LICENSE.md b/deps/npm/node_modules/node-gyp/node_modules/chownr/LICENSE.md new file mode 100644 index 00000000000000..881248b6d7f0ca --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/chownr/LICENSE.md @@ -0,0 +1,63 @@ +All packages under `src/` are licensed according to the terms in +their respective `LICENSE` or `LICENSE.md` files. + +The remainder of this project is licensed under the Blue Oak +Model License, as follows: + +----- + +# Blue Oak Model License + +Version 1.0.0 + +## Purpose + +This license gives everyone as much permission to work with +this software as possible, while protecting contributors +from liability. + +## Acceptance + +In order to receive this license, you must agree to its +rules. The rules of this license are both obligations +under that agreement and conditions to your license. +You must not do anything with this software that triggers +a rule that you cannot or will not follow. + +## Copyright + +Each contributor licenses you to do everything with this +software that would otherwise infringe that contributor's +copyright in it. + +## Notices + +You must ensure that everyone who gets a copy of +any part of this software from you, with or without +changes, also gets the text of this license or a link to +. + +## Excuse + +If anyone notifies you in writing that you have not +complied with [Notices](#notices), you can keep your +license by taking all practical steps to comply within 30 +days after the notice. If you do not do so, your license +ends immediately. + +## Patent + +Each contributor licenses you to do everything with this +software that would otherwise infringe any patent claims +they can license or become able to license. + +## Reliability + +No contributor can revoke this license. + +## No Liability + +***As far as the law allows, this software comes as is, +without any warranty or condition, and no contributor +will be liable to anyone for any damages related to this +software or this license, under any kind of legal claim.*** diff --git a/deps/npm/node_modules/node-gyp/node_modules/chownr/dist/commonjs/index.js b/deps/npm/node_modules/node-gyp/node_modules/chownr/dist/commonjs/index.js new file mode 100644 index 00000000000000..6a7b68d5eac26e --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/chownr/dist/commonjs/index.js @@ -0,0 +1,93 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.chownrSync = exports.chownr = void 0; +const node_fs_1 = __importDefault(require("node:fs")); +const node_path_1 = __importDefault(require("node:path")); +const lchownSync = (path, uid, gid) => { + try { + return node_fs_1.default.lchownSync(path, uid, gid); + } + catch (er) { + if (er?.code !== 'ENOENT') + throw er; + } +}; +const chown = (cpath, uid, gid, cb) => { + node_fs_1.default.lchown(cpath, uid, gid, er => { + // Skip ENOENT error + cb(er && er?.code !== 'ENOENT' ? er : null); + }); +}; +const chownrKid = (p, child, uid, gid, cb) => { + if (child.isDirectory()) { + (0, exports.chownr)(node_path_1.default.resolve(p, child.name), uid, gid, (er) => { + if (er) + return cb(er); + const cpath = node_path_1.default.resolve(p, child.name); + chown(cpath, uid, gid, cb); + }); + } + else { + const cpath = node_path_1.default.resolve(p, child.name); + chown(cpath, uid, gid, cb); + } +}; +const chownr = (p, uid, gid, cb) => { + node_fs_1.default.readdir(p, { withFileTypes: true }, (er, children) => { + // any error other than ENOTDIR or ENOTSUP means it's not readable, + // or doesn't exist. give up. + if (er) { + if (er.code === 'ENOENT') + return cb(); + else if (er.code !== 'ENOTDIR' && er.code !== 'ENOTSUP') + return cb(er); + } + if (er || !children.length) + return chown(p, uid, gid, cb); + let len = children.length; + let errState = null; + const then = (er) => { + /* c8 ignore start */ + if (errState) + return; + /* c8 ignore stop */ + if (er) + return cb((errState = er)); + if (--len === 0) + return chown(p, uid, gid, cb); + }; + for (const child of children) { + chownrKid(p, child, uid, gid, then); + } + }); +}; +exports.chownr = chownr; +const chownrKidSync = (p, child, uid, gid) => { + if (child.isDirectory()) + (0, exports.chownrSync)(node_path_1.default.resolve(p, child.name), uid, gid); + lchownSync(node_path_1.default.resolve(p, child.name), uid, gid); +}; +const chownrSync = (p, uid, gid) => { + let children; + try { + children = node_fs_1.default.readdirSync(p, { withFileTypes: true }); + } + catch (er) { + const e = er; + if (e?.code === 'ENOENT') + return; + else if (e?.code === 'ENOTDIR' || e?.code === 'ENOTSUP') + return lchownSync(p, uid, gid); + else + throw e; + } + for (const child of children) { + chownrKidSync(p, child, uid, gid); + } + return lchownSync(p, uid, gid); +}; +exports.chownrSync = chownrSync; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/isexe/dist/cjs/package.json b/deps/npm/node_modules/node-gyp/node_modules/chownr/dist/commonjs/package.json similarity index 100% rename from deps/npm/node_modules/node-gyp/node_modules/isexe/dist/cjs/package.json rename to deps/npm/node_modules/node-gyp/node_modules/chownr/dist/commonjs/package.json diff --git a/deps/npm/node_modules/node-gyp/node_modules/chownr/dist/esm/index.js b/deps/npm/node_modules/node-gyp/node_modules/chownr/dist/esm/index.js new file mode 100644 index 00000000000000..5c2815297a67cb --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/chownr/dist/esm/index.js @@ -0,0 +1,85 @@ +import fs from 'node:fs'; +import path from 'node:path'; +const lchownSync = (path, uid, gid) => { + try { + return fs.lchownSync(path, uid, gid); + } + catch (er) { + if (er?.code !== 'ENOENT') + throw er; + } +}; +const chown = (cpath, uid, gid, cb) => { + fs.lchown(cpath, uid, gid, er => { + // Skip ENOENT error + cb(er && er?.code !== 'ENOENT' ? er : null); + }); +}; +const chownrKid = (p, child, uid, gid, cb) => { + if (child.isDirectory()) { + chownr(path.resolve(p, child.name), uid, gid, (er) => { + if (er) + return cb(er); + const cpath = path.resolve(p, child.name); + chown(cpath, uid, gid, cb); + }); + } + else { + const cpath = path.resolve(p, child.name); + chown(cpath, uid, gid, cb); + } +}; +export const chownr = (p, uid, gid, cb) => { + fs.readdir(p, { withFileTypes: true }, (er, children) => { + // any error other than ENOTDIR or ENOTSUP means it's not readable, + // or doesn't exist. give up. + if (er) { + if (er.code === 'ENOENT') + return cb(); + else if (er.code !== 'ENOTDIR' && er.code !== 'ENOTSUP') + return cb(er); + } + if (er || !children.length) + return chown(p, uid, gid, cb); + let len = children.length; + let errState = null; + const then = (er) => { + /* c8 ignore start */ + if (errState) + return; + /* c8 ignore stop */ + if (er) + return cb((errState = er)); + if (--len === 0) + return chown(p, uid, gid, cb); + }; + for (const child of children) { + chownrKid(p, child, uid, gid, then); + } + }); +}; +const chownrKidSync = (p, child, uid, gid) => { + if (child.isDirectory()) + chownrSync(path.resolve(p, child.name), uid, gid); + lchownSync(path.resolve(p, child.name), uid, gid); +}; +export const chownrSync = (p, uid, gid) => { + let children; + try { + children = fs.readdirSync(p, { withFileTypes: true }); + } + catch (er) { + const e = er; + if (e?.code === 'ENOENT') + return; + else if (e?.code === 'ENOTDIR' || e?.code === 'ENOTSUP') + return lchownSync(p, uid, gid); + else + throw e; + } + for (const child of children) { + chownrKidSync(p, child, uid, gid); + } + return lchownSync(p, uid, gid); +}; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/isexe/dist/mjs/package.json b/deps/npm/node_modules/node-gyp/node_modules/chownr/dist/esm/package.json similarity index 100% rename from deps/npm/node_modules/node-gyp/node_modules/isexe/dist/mjs/package.json rename to deps/npm/node_modules/node-gyp/node_modules/chownr/dist/esm/package.json diff --git a/deps/npm/node_modules/node-gyp/node_modules/chownr/package.json b/deps/npm/node_modules/node-gyp/node_modules/chownr/package.json new file mode 100644 index 00000000000000..09aa6b2e2e576d --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/chownr/package.json @@ -0,0 +1,69 @@ +{ + "author": "Isaac Z. Schlueter (http://blog.izs.me/)", + "name": "chownr", + "description": "like `chown -R`", + "version": "3.0.0", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/chownr.git" + }, + "files": [ + "dist" + ], + "devDependencies": { + "@types/node": "^20.12.5", + "mkdirp": "^3.0.1", + "prettier": "^3.2.5", + "rimraf": "^5.0.5", + "tap": "^18.7.2", + "tshy": "^1.13.1", + "typedoc": "^0.25.12" + }, + "scripts": { + "prepare": "tshy", + "pretest": "npm run prepare", + "test": "tap", + "preversion": "npm test", + "postversion": "npm publish", + "prepublishOnly": "git push origin --follow-tags", + "format": "prettier --write . --loglevel warn", + "typedoc": "typedoc --tsconfig .tshy/esm.json ./src/*.ts" + }, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + }, + "tshy": { + "exports": { + "./package.json": "./package.json", + ".": "./src/index.ts" + } + }, + "exports": { + "./package.json": "./package.json", + ".": { + "import": { + "types": "./dist/esm/index.d.ts", + "default": "./dist/esm/index.js" + }, + "require": { + "types": "./dist/commonjs/index.d.ts", + "default": "./dist/commonjs/index.js" + } + } + }, + "main": "./dist/commonjs/index.js", + "types": "./dist/commonjs/index.d.ts", + "type": "module", + "prettier": { + "semi": false, + "printWidth": 75, + "tabWidth": 2, + "useTabs": false, + "singleQuote": true, + "jsxSingleQuote": false, + "bracketSameLine": true, + "arrowParens": "avoid", + "endOfLine": "lf" + } +} diff --git a/deps/npm/node_modules/node-gyp/node_modules/isexe/LICENSE b/deps/npm/node_modules/node-gyp/node_modules/isexe/LICENSE deleted file mode 100644 index c925dbe826b670..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/isexe/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) 2016-2022 Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/deps/npm/node_modules/node-gyp/node_modules/isexe/dist/cjs/index.js b/deps/npm/node_modules/node-gyp/node_modules/isexe/dist/cjs/index.js deleted file mode 100644 index cefcb66b5c5434..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/isexe/dist/cjs/index.js +++ /dev/null @@ -1,46 +0,0 @@ -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -var __exportStar = (this && this.__exportStar) || function(m, exports) { - for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.sync = exports.isexe = exports.posix = exports.win32 = void 0; -const posix = __importStar(require("./posix.js")); -exports.posix = posix; -const win32 = __importStar(require("./win32.js")); -exports.win32 = win32; -__exportStar(require("./options.js"), exports); -const platform = process.env._ISEXE_TEST_PLATFORM_ || process.platform; -const impl = platform === 'win32' ? win32 : posix; -/** - * Determine whether a path is executable on the current platform. - */ -exports.isexe = impl.isexe; -/** - * Synchronously determine whether a path is executable on the - * current platform. - */ -exports.sync = impl.sync; -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/isexe/dist/cjs/options.js b/deps/npm/node_modules/node-gyp/node_modules/isexe/dist/cjs/options.js deleted file mode 100644 index 0dfad0762cc32c..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/isexe/dist/cjs/options.js +++ /dev/null @@ -1,3 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=options.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/isexe/dist/cjs/posix.js b/deps/npm/node_modules/node-gyp/node_modules/isexe/dist/cjs/posix.js deleted file mode 100644 index 3bc5e79d7007e9..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/isexe/dist/cjs/posix.js +++ /dev/null @@ -1,67 +0,0 @@ -"use strict"; -/** - * This is the Posix implementation of isexe, which uses the file - * mode and uid/gid values. - * - * @module - */ -Object.defineProperty(exports, "__esModule", { value: true }); -exports.sync = exports.isexe = void 0; -const fs_1 = require("fs"); -const promises_1 = require("fs/promises"); -/** - * Determine whether a path is executable according to the mode and - * current (or specified) user and group IDs. - */ -const isexe = async (path, options = {}) => { - const { ignoreErrors = false } = options; - try { - return checkStat(await (0, promises_1.stat)(path), options); - } - catch (e) { - const er = e; - if (ignoreErrors || er.code === 'EACCES') - return false; - throw er; - } -}; -exports.isexe = isexe; -/** - * Synchronously determine whether a path is executable according to - * the mode and current (or specified) user and group IDs. - */ -const sync = (path, options = {}) => { - const { ignoreErrors = false } = options; - try { - return checkStat((0, fs_1.statSync)(path), options); - } - catch (e) { - const er = e; - if (ignoreErrors || er.code === 'EACCES') - return false; - throw er; - } -}; -exports.sync = sync; -const checkStat = (stat, options) => stat.isFile() && checkMode(stat, options); -const checkMode = (stat, options) => { - const myUid = options.uid ?? process.getuid?.(); - const myGroups = options.groups ?? process.getgroups?.() ?? []; - const myGid = options.gid ?? process.getgid?.() ?? myGroups[0]; - if (myUid === undefined || myGid === undefined) { - throw new Error('cannot get uid or gid'); - } - const groups = new Set([myGid, ...myGroups]); - const mod = stat.mode; - const uid = stat.uid; - const gid = stat.gid; - const u = parseInt('100', 8); - const g = parseInt('010', 8); - const o = parseInt('001', 8); - const ug = u | g; - return !!(mod & o || - (mod & g && groups.has(gid)) || - (mod & u && uid === myUid) || - (mod & ug && myUid === 0)); -}; -//# sourceMappingURL=posix.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/isexe/dist/cjs/win32.js b/deps/npm/node_modules/node-gyp/node_modules/isexe/dist/cjs/win32.js deleted file mode 100644 index fa7a4d2f7d240d..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/isexe/dist/cjs/win32.js +++ /dev/null @@ -1,62 +0,0 @@ -"use strict"; -/** - * This is the Windows implementation of isexe, which uses the file - * extension and PATHEXT setting. - * - * @module - */ -Object.defineProperty(exports, "__esModule", { value: true }); -exports.sync = exports.isexe = void 0; -const fs_1 = require("fs"); -const promises_1 = require("fs/promises"); -/** - * Determine whether a path is executable based on the file extension - * and PATHEXT environment variable (or specified pathExt option) - */ -const isexe = async (path, options = {}) => { - const { ignoreErrors = false } = options; - try { - return checkStat(await (0, promises_1.stat)(path), path, options); - } - catch (e) { - const er = e; - if (ignoreErrors || er.code === 'EACCES') - return false; - throw er; - } -}; -exports.isexe = isexe; -/** - * Synchronously determine whether a path is executable based on the file - * extension and PATHEXT environment variable (or specified pathExt option) - */ -const sync = (path, options = {}) => { - const { ignoreErrors = false } = options; - try { - return checkStat((0, fs_1.statSync)(path), path, options); - } - catch (e) { - const er = e; - if (ignoreErrors || er.code === 'EACCES') - return false; - throw er; - } -}; -exports.sync = sync; -const checkPathExt = (path, options) => { - const { pathExt = process.env.PATHEXT || '' } = options; - const peSplit = pathExt.split(';'); - if (peSplit.indexOf('') !== -1) { - return true; - } - for (let i = 0; i < peSplit.length; i++) { - const p = peSplit[i].toLowerCase(); - const ext = path.substring(path.length - p.length).toLowerCase(); - if (p && ext === p) { - return true; - } - } - return false; -}; -const checkStat = (stat, path, options) => stat.isFile() && checkPathExt(path, options); -//# sourceMappingURL=win32.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/isexe/dist/mjs/index.js b/deps/npm/node_modules/node-gyp/node_modules/isexe/dist/mjs/index.js deleted file mode 100644 index 1e309acd7355ec..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/isexe/dist/mjs/index.js +++ /dev/null @@ -1,16 +0,0 @@ -import * as posix from './posix.js'; -import * as win32 from './win32.js'; -export * from './options.js'; -export { win32, posix }; -const platform = process.env._ISEXE_TEST_PLATFORM_ || process.platform; -const impl = platform === 'win32' ? win32 : posix; -/** - * Determine whether a path is executable on the current platform. - */ -export const isexe = impl.isexe; -/** - * Synchronously determine whether a path is executable on the - * current platform. - */ -export const sync = impl.sync; -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/isexe/dist/mjs/options.js b/deps/npm/node_modules/node-gyp/node_modules/isexe/dist/mjs/options.js deleted file mode 100644 index e9ded40bd5b2cd..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/isexe/dist/mjs/options.js +++ /dev/null @@ -1,2 +0,0 @@ -export {}; -//# sourceMappingURL=options.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/isexe/dist/mjs/posix.js b/deps/npm/node_modules/node-gyp/node_modules/isexe/dist/mjs/posix.js deleted file mode 100644 index c453776c0452f7..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/isexe/dist/mjs/posix.js +++ /dev/null @@ -1,62 +0,0 @@ -/** - * This is the Posix implementation of isexe, which uses the file - * mode and uid/gid values. - * - * @module - */ -import { statSync } from 'fs'; -import { stat } from 'fs/promises'; -/** - * Determine whether a path is executable according to the mode and - * current (or specified) user and group IDs. - */ -export const isexe = async (path, options = {}) => { - const { ignoreErrors = false } = options; - try { - return checkStat(await stat(path), options); - } - catch (e) { - const er = e; - if (ignoreErrors || er.code === 'EACCES') - return false; - throw er; - } -}; -/** - * Synchronously determine whether a path is executable according to - * the mode and current (or specified) user and group IDs. - */ -export const sync = (path, options = {}) => { - const { ignoreErrors = false } = options; - try { - return checkStat(statSync(path), options); - } - catch (e) { - const er = e; - if (ignoreErrors || er.code === 'EACCES') - return false; - throw er; - } -}; -const checkStat = (stat, options) => stat.isFile() && checkMode(stat, options); -const checkMode = (stat, options) => { - const myUid = options.uid ?? process.getuid?.(); - const myGroups = options.groups ?? process.getgroups?.() ?? []; - const myGid = options.gid ?? process.getgid?.() ?? myGroups[0]; - if (myUid === undefined || myGid === undefined) { - throw new Error('cannot get uid or gid'); - } - const groups = new Set([myGid, ...myGroups]); - const mod = stat.mode; - const uid = stat.uid; - const gid = stat.gid; - const u = parseInt('100', 8); - const g = parseInt('010', 8); - const o = parseInt('001', 8); - const ug = u | g; - return !!(mod & o || - (mod & g && groups.has(gid)) || - (mod & u && uid === myUid) || - (mod & ug && myUid === 0)); -}; -//# sourceMappingURL=posix.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/isexe/dist/mjs/win32.js b/deps/npm/node_modules/node-gyp/node_modules/isexe/dist/mjs/win32.js deleted file mode 100644 index a354ee2a5115c7..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/isexe/dist/mjs/win32.js +++ /dev/null @@ -1,57 +0,0 @@ -/** - * This is the Windows implementation of isexe, which uses the file - * extension and PATHEXT setting. - * - * @module - */ -import { statSync } from 'fs'; -import { stat } from 'fs/promises'; -/** - * Determine whether a path is executable based on the file extension - * and PATHEXT environment variable (or specified pathExt option) - */ -export const isexe = async (path, options = {}) => { - const { ignoreErrors = false } = options; - try { - return checkStat(await stat(path), path, options); - } - catch (e) { - const er = e; - if (ignoreErrors || er.code === 'EACCES') - return false; - throw er; - } -}; -/** - * Synchronously determine whether a path is executable based on the file - * extension and PATHEXT environment variable (or specified pathExt option) - */ -export const sync = (path, options = {}) => { - const { ignoreErrors = false } = options; - try { - return checkStat(statSync(path), path, options); - } - catch (e) { - const er = e; - if (ignoreErrors || er.code === 'EACCES') - return false; - throw er; - } -}; -const checkPathExt = (path, options) => { - const { pathExt = process.env.PATHEXT || '' } = options; - const peSplit = pathExt.split(';'); - if (peSplit.indexOf('') !== -1) { - return true; - } - for (let i = 0; i < peSplit.length; i++) { - const p = peSplit[i].toLowerCase(); - const ext = path.substring(path.length - p.length).toLowerCase(); - if (p && ext === p) { - return true; - } - } - return false; -}; -const checkStat = (stat, path, options) => stat.isFile() && checkPathExt(path, options); -//# sourceMappingURL=win32.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/isexe/package.json b/deps/npm/node_modules/node-gyp/node_modules/isexe/package.json deleted file mode 100644 index a0e2cd04bfdbfe..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/isexe/package.json +++ /dev/null @@ -1,96 +0,0 @@ -{ - "name": "isexe", - "version": "3.1.1", - "description": "Minimal module to check if a file is executable.", - "main": "./dist/cjs/index.js", - "module": "./dist/mjs/index.js", - "types": "./dist/cjs/index.js", - "files": [ - "dist" - ], - "exports": { - ".": { - "import": { - "types": "./dist/mjs/index.d.ts", - "default": "./dist/mjs/index.js" - }, - "require": { - "types": "./dist/cjs/index.d.ts", - "default": "./dist/cjs/index.js" - } - }, - "./posix": { - "import": { - "types": "./dist/mjs/posix.d.ts", - "default": "./dist/mjs/posix.js" - }, - "require": { - "types": "./dist/cjs/posix.d.ts", - "default": "./dist/cjs/posix.js" - } - }, - "./win32": { - "import": { - "types": "./dist/mjs/win32.d.ts", - "default": "./dist/mjs/win32.js" - }, - "require": { - "types": "./dist/cjs/win32.d.ts", - "default": "./dist/cjs/win32.js" - } - }, - "./package.json": "./package.json" - }, - "devDependencies": { - "@types/node": "^20.4.5", - "@types/tap": "^15.0.8", - "c8": "^8.0.1", - "mkdirp": "^0.5.1", - "prettier": "^2.8.8", - "rimraf": "^2.5.0", - "sync-content": "^1.0.2", - "tap": "^16.3.8", - "ts-node": "^10.9.1", - "typedoc": "^0.24.8", - "typescript": "^5.1.6" - }, - "scripts": { - "preversion": "npm test", - "postversion": "npm publish", - "prepublishOnly": "git push origin --follow-tags", - "prepare": "tsc -p tsconfig/cjs.json && tsc -p tsconfig/esm.json && bash ./scripts/fixup.sh", - "pretest": "npm run prepare", - "presnap": "npm run prepare", - "test": "c8 tap", - "snap": "c8 tap", - "format": "prettier --write . --loglevel warn --ignore-path ../../.prettierignore --cache", - "typedoc": "typedoc --tsconfig tsconfig/esm.json ./src/*.ts" - }, - "author": "Isaac Z. Schlueter (http://blog.izs.me/)", - "license": "ISC", - "tap": { - "coverage": false, - "node-arg": [ - "--enable-source-maps", - "--no-warnings", - "--loader", - "ts-node/esm" - ], - "ts": false - }, - "prettier": { - "semi": false, - "printWidth": 75, - "tabWidth": 2, - "useTabs": false, - "singleQuote": true, - "jsxSingleQuote": false, - "bracketSameLine": true, - "arrowParens": "avoid", - "endOfLine": "lf" - }, - "repository": "https://github.com/isaacs/isexe", - "engines": { - "node": ">=16" - } -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/LICENSE b/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/LICENSE deleted file mode 100644 index 1808eb2844231c..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/LICENSE +++ /dev/null @@ -1,16 +0,0 @@ -ISC License - -Copyright 2017-2022 (c) npm, Inc. - -Permission to use, copy, modify, and/or distribute this software for -any purpose with or without fee is hereby granted, provided that the -above copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE COPYRIGHT HOLDER DISCLAIMS -ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR -CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE -OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE -USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/entry.js b/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/entry.js deleted file mode 100644 index bfcfacbcc95e18..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/entry.js +++ /dev/null @@ -1,471 +0,0 @@ -const { Request, Response } = require('minipass-fetch') -const { Minipass } = require('minipass') -const MinipassFlush = require('minipass-flush') -const cacache = require('cacache') -const url = require('url') - -const CachingMinipassPipeline = require('../pipeline.js') -const CachePolicy = require('./policy.js') -const cacheKey = require('./key.js') -const remote = require('../remote.js') - -const hasOwnProperty = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop) - -// allow list for request headers that will be written to the cache index -// note: we will also store any request headers -// that are named in a response's vary header -const KEEP_REQUEST_HEADERS = [ - 'accept-charset', - 'accept-encoding', - 'accept-language', - 'accept', - 'cache-control', -] - -// allow list for response headers that will be written to the cache index -// note: we must not store the real response's age header, or when we load -// a cache policy based on the metadata it will think the cached response -// is always stale -const KEEP_RESPONSE_HEADERS = [ - 'cache-control', - 'content-encoding', - 'content-language', - 'content-type', - 'date', - 'etag', - 'expires', - 'last-modified', - 'link', - 'location', - 'pragma', - 'vary', -] - -// return an object containing all metadata to be written to the index -const getMetadata = (request, response, options) => { - const metadata = { - time: Date.now(), - url: request.url, - reqHeaders: {}, - resHeaders: {}, - - // options on which we must match the request and vary the response - options: { - compress: options.compress != null ? options.compress : request.compress, - }, - } - - // only save the status if it's not a 200 or 304 - if (response.status !== 200 && response.status !== 304) { - metadata.status = response.status - } - - for (const name of KEEP_REQUEST_HEADERS) { - if (request.headers.has(name)) { - metadata.reqHeaders[name] = request.headers.get(name) - } - } - - // if the request's host header differs from the host in the url - // we need to keep it, otherwise it's just noise and we ignore it - const host = request.headers.get('host') - const parsedUrl = new url.URL(request.url) - if (host && parsedUrl.host !== host) { - metadata.reqHeaders.host = host - } - - // if the response has a vary header, make sure - // we store the relevant request headers too - if (response.headers.has('vary')) { - const vary = response.headers.get('vary') - // a vary of "*" means every header causes a different response. - // in that scenario, we do not include any additional headers - // as the freshness check will always fail anyway and we don't - // want to bloat the cache indexes - if (vary !== '*') { - // copy any other request headers that will vary the response - const varyHeaders = vary.trim().toLowerCase().split(/\s*,\s*/) - for (const name of varyHeaders) { - if (request.headers.has(name)) { - metadata.reqHeaders[name] = request.headers.get(name) - } - } - } - } - - for (const name of KEEP_RESPONSE_HEADERS) { - if (response.headers.has(name)) { - metadata.resHeaders[name] = response.headers.get(name) - } - } - - for (const name of options.cacheAdditionalHeaders) { - if (response.headers.has(name)) { - metadata.resHeaders[name] = response.headers.get(name) - } - } - - return metadata -} - -// symbols used to hide objects that may be lazily evaluated in a getter -const _request = Symbol('request') -const _response = Symbol('response') -const _policy = Symbol('policy') - -class CacheEntry { - constructor ({ entry, request, response, options }) { - if (entry) { - this.key = entry.key - this.entry = entry - // previous versions of this module didn't write an explicit timestamp in - // the metadata, so fall back to the entry's timestamp. we can't use the - // entry timestamp to determine staleness because cacache will update it - // when it verifies its data - this.entry.metadata.time = this.entry.metadata.time || this.entry.time - } else { - this.key = cacheKey(request) - } - - this.options = options - - // these properties are behind getters that lazily evaluate - this[_request] = request - this[_response] = response - this[_policy] = null - } - - // returns a CacheEntry instance that satisfies the given request - // or undefined if no existing entry satisfies - static async find (request, options) { - try { - // compacts the index and returns an array of unique entries - var matches = await cacache.index.compact(options.cachePath, cacheKey(request), (A, B) => { - const entryA = new CacheEntry({ entry: A, options }) - const entryB = new CacheEntry({ entry: B, options }) - return entryA.policy.satisfies(entryB.request) - }, { - validateEntry: (entry) => { - // clean out entries with a buggy content-encoding value - if (entry.metadata && - entry.metadata.resHeaders && - entry.metadata.resHeaders['content-encoding'] === null) { - return false - } - - // if an integrity is null, it needs to have a status specified - if (entry.integrity === null) { - return !!(entry.metadata && entry.metadata.status) - } - - return true - }, - }) - } catch (err) { - // if the compact request fails, ignore the error and return - return - } - - // a cache mode of 'reload' means to behave as though we have no cache - // on the way to the network. return undefined to allow cacheFetch to - // create a brand new request no matter what. - if (options.cache === 'reload') { - return - } - - // find the specific entry that satisfies the request - let match - for (const entry of matches) { - const _entry = new CacheEntry({ - entry, - options, - }) - - if (_entry.policy.satisfies(request)) { - match = _entry - break - } - } - - return match - } - - // if the user made a PUT/POST/PATCH then we invalidate our - // cache for the same url by deleting the index entirely - static async invalidate (request, options) { - const key = cacheKey(request) - try { - await cacache.rm.entry(options.cachePath, key, { removeFully: true }) - } catch (err) { - // ignore errors - } - } - - get request () { - if (!this[_request]) { - this[_request] = new Request(this.entry.metadata.url, { - method: 'GET', - headers: this.entry.metadata.reqHeaders, - ...this.entry.metadata.options, - }) - } - - return this[_request] - } - - get response () { - if (!this[_response]) { - this[_response] = new Response(null, { - url: this.entry.metadata.url, - counter: this.options.counter, - status: this.entry.metadata.status || 200, - headers: { - ...this.entry.metadata.resHeaders, - 'content-length': this.entry.size, - }, - }) - } - - return this[_response] - } - - get policy () { - if (!this[_policy]) { - this[_policy] = new CachePolicy({ - entry: this.entry, - request: this.request, - response: this.response, - options: this.options, - }) - } - - return this[_policy] - } - - // wraps the response in a pipeline that stores the data - // in the cache while the user consumes it - async store (status) { - // if we got a status other than 200, 301, or 308, - // or the CachePolicy forbid storage, append the - // cache status header and return it untouched - if ( - this.request.method !== 'GET' || - ![200, 301, 308].includes(this.response.status) || - !this.policy.storable() - ) { - this.response.headers.set('x-local-cache-status', 'skip') - return this.response - } - - const size = this.response.headers.get('content-length') - const cacheOpts = { - algorithms: this.options.algorithms, - metadata: getMetadata(this.request, this.response, this.options), - size, - integrity: this.options.integrity, - integrityEmitter: this.response.body.hasIntegrityEmitter && this.response.body, - } - - let body = null - // we only set a body if the status is a 200, redirects are - // stored as metadata only - if (this.response.status === 200) { - let cacheWriteResolve, cacheWriteReject - const cacheWritePromise = new Promise((resolve, reject) => { - cacheWriteResolve = resolve - cacheWriteReject = reject - }).catch((err) => { - body.emit('error', err) - }) - - body = new CachingMinipassPipeline({ events: ['integrity', 'size'] }, new MinipassFlush({ - flush () { - return cacheWritePromise - }, - })) - // this is always true since if we aren't reusing the one from the remote fetch, we - // are using the one from cacache - body.hasIntegrityEmitter = true - - const onResume = () => { - const tee = new Minipass() - const cacheStream = cacache.put.stream(this.options.cachePath, this.key, cacheOpts) - // re-emit the integrity and size events on our new response body so they can be reused - cacheStream.on('integrity', i => body.emit('integrity', i)) - cacheStream.on('size', s => body.emit('size', s)) - // stick a flag on here so downstream users will know if they can expect integrity events - tee.pipe(cacheStream) - // TODO if the cache write fails, log a warning but return the response anyway - // eslint-disable-next-line promise/catch-or-return - cacheStream.promise().then(cacheWriteResolve, cacheWriteReject) - body.unshift(tee) - body.unshift(this.response.body) - } - - body.once('resume', onResume) - body.once('end', () => body.removeListener('resume', onResume)) - } else { - await cacache.index.insert(this.options.cachePath, this.key, null, cacheOpts) - } - - // note: we do not set the x-local-cache-hash header because we do not know - // the hash value until after the write to the cache completes, which doesn't - // happen until after the response has been sent and it's too late to write - // the header anyway - this.response.headers.set('x-local-cache', encodeURIComponent(this.options.cachePath)) - this.response.headers.set('x-local-cache-key', encodeURIComponent(this.key)) - this.response.headers.set('x-local-cache-mode', 'stream') - this.response.headers.set('x-local-cache-status', status) - this.response.headers.set('x-local-cache-time', new Date().toISOString()) - const newResponse = new Response(body, { - url: this.response.url, - status: this.response.status, - headers: this.response.headers, - counter: this.options.counter, - }) - return newResponse - } - - // use the cached data to create a response and return it - async respond (method, options, status) { - let response - if (method === 'HEAD' || [301, 308].includes(this.response.status)) { - // if the request is a HEAD, or the response is a redirect, - // then the metadata in the entry already includes everything - // we need to build a response - response = this.response - } else { - // we're responding with a full cached response, so create a body - // that reads from cacache and attach it to a new Response - const body = new Minipass() - const headers = { ...this.policy.responseHeaders() } - - const onResume = () => { - const cacheStream = cacache.get.stream.byDigest( - this.options.cachePath, this.entry.integrity, { memoize: this.options.memoize } - ) - cacheStream.on('error', async (err) => { - cacheStream.pause() - if (err.code === 'EINTEGRITY') { - await cacache.rm.content( - this.options.cachePath, this.entry.integrity, { memoize: this.options.memoize } - ) - } - if (err.code === 'ENOENT' || err.code === 'EINTEGRITY') { - await CacheEntry.invalidate(this.request, this.options) - } - body.emit('error', err) - cacheStream.resume() - }) - // emit the integrity and size events based on our metadata so we're consistent - body.emit('integrity', this.entry.integrity) - body.emit('size', Number(headers['content-length'])) - cacheStream.pipe(body) - } - - body.once('resume', onResume) - body.once('end', () => body.removeListener('resume', onResume)) - response = new Response(body, { - url: this.entry.metadata.url, - counter: options.counter, - status: 200, - headers, - }) - } - - response.headers.set('x-local-cache', encodeURIComponent(this.options.cachePath)) - response.headers.set('x-local-cache-hash', encodeURIComponent(this.entry.integrity)) - response.headers.set('x-local-cache-key', encodeURIComponent(this.key)) - response.headers.set('x-local-cache-mode', 'stream') - response.headers.set('x-local-cache-status', status) - response.headers.set('x-local-cache-time', new Date(this.entry.metadata.time).toUTCString()) - return response - } - - // use the provided request along with this cache entry to - // revalidate the stored response. returns a response, either - // from the cache or from the update - async revalidate (request, options) { - const revalidateRequest = new Request(request, { - headers: this.policy.revalidationHeaders(request), - }) - - try { - // NOTE: be sure to remove the headers property from the - // user supplied options, since we have already defined - // them on the new request object. if they're still in the - // options then those will overwrite the ones from the policy - var response = await remote(revalidateRequest, { - ...options, - headers: undefined, - }) - } catch (err) { - // if the network fetch fails, return the stale - // cached response unless it has a cache-control - // of 'must-revalidate' - if (!this.policy.mustRevalidate) { - return this.respond(request.method, options, 'stale') - } - - throw err - } - - if (this.policy.revalidated(revalidateRequest, response)) { - // we got a 304, write a new index to the cache and respond from cache - const metadata = getMetadata(request, response, options) - // 304 responses do not include headers that are specific to the response data - // since they do not include a body, so we copy values for headers that were - // in the old cache entry to the new one, if the new metadata does not already - // include that header - for (const name of KEEP_RESPONSE_HEADERS) { - if ( - !hasOwnProperty(metadata.resHeaders, name) && - hasOwnProperty(this.entry.metadata.resHeaders, name) - ) { - metadata.resHeaders[name] = this.entry.metadata.resHeaders[name] - } - } - - for (const name of options.cacheAdditionalHeaders) { - const inMeta = hasOwnProperty(metadata.resHeaders, name) - const inEntry = hasOwnProperty(this.entry.metadata.resHeaders, name) - const inPolicy = hasOwnProperty(this.policy.response.headers, name) - - // if the header is in the existing entry, but it is not in the metadata - // then we need to write it to the metadata as this will refresh the on-disk cache - if (!inMeta && inEntry) { - metadata.resHeaders[name] = this.entry.metadata.resHeaders[name] - } - // if the header is in the metadata, but not in the policy, then we need to set - // it in the policy so that it's included in the immediate response. future - // responses will load a new cache entry, so we don't need to change that - if (!inPolicy && inMeta) { - this.policy.response.headers[name] = metadata.resHeaders[name] - } - } - - try { - await cacache.index.insert(options.cachePath, this.key, this.entry.integrity, { - size: this.entry.size, - metadata, - }) - } catch (err) { - // if updating the cache index fails, we ignore it and - // respond anyway - } - return this.respond(request.method, options, 'revalidated') - } - - // if we got a modified response, create a new entry based on it - const newEntry = new CacheEntry({ - request, - response, - options, - }) - - // respond with the new entry while writing it to the cache - return newEntry.store('updated') - } -} - -module.exports = CacheEntry diff --git a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/errors.js b/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/errors.js deleted file mode 100644 index 67a66573bebe66..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/errors.js +++ /dev/null @@ -1,11 +0,0 @@ -class NotCachedError extends Error { - constructor (url) { - /* eslint-disable-next-line max-len */ - super(`request to ${url} failed: cache mode is 'only-if-cached' but no cached response is available.`) - this.code = 'ENOTCACHED' - } -} - -module.exports = { - NotCachedError, -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/index.js b/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/index.js deleted file mode 100644 index 0de49d23fb9336..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/index.js +++ /dev/null @@ -1,49 +0,0 @@ -const { NotCachedError } = require('./errors.js') -const CacheEntry = require('./entry.js') -const remote = require('../remote.js') - -// do whatever is necessary to get a Response and return it -const cacheFetch = async (request, options) => { - // try to find a cached entry that satisfies this request - const entry = await CacheEntry.find(request, options) - if (!entry) { - // no cached result, if the cache mode is 'only-if-cached' that's a failure - if (options.cache === 'only-if-cached') { - throw new NotCachedError(request.url) - } - - // otherwise, we make a request, store it and return it - const response = await remote(request, options) - const newEntry = new CacheEntry({ request, response, options }) - return newEntry.store('miss') - } - - // we have a cached response that satisfies this request, however if the cache - // mode is 'no-cache' then we send the revalidation request no matter what - if (options.cache === 'no-cache') { - return entry.revalidate(request, options) - } - - // if the cached entry is not stale, or if the cache mode is 'force-cache' or - // 'only-if-cached' we can respond with the cached entry. set the status - // based on the result of needsRevalidation and respond - const _needsRevalidation = entry.policy.needsRevalidation(request) - if (options.cache === 'force-cache' || - options.cache === 'only-if-cached' || - !_needsRevalidation) { - return entry.respond(request.method, options, _needsRevalidation ? 'stale' : 'hit') - } - - // if we got here, the cache entry is stale so revalidate it - return entry.revalidate(request, options) -} - -cacheFetch.invalidate = async (request, options) => { - if (!options.cachePath) { - return - } - - return CacheEntry.invalidate(request, options) -} - -module.exports = cacheFetch diff --git a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/key.js b/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/key.js deleted file mode 100644 index f7684d562b7fae..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/key.js +++ /dev/null @@ -1,17 +0,0 @@ -const { URL, format } = require('url') - -// options passed to url.format() when generating a key -const formatOptions = { - auth: false, - fragment: false, - search: true, - unicode: false, -} - -// returns a string to be used as the cache key for the Request -const cacheKey = (request) => { - const parsed = new URL(request.url) - return `make-fetch-happen:request-cache:${format(parsed, formatOptions)}` -} - -module.exports = cacheKey diff --git a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/policy.js b/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/policy.js deleted file mode 100644 index ada3c8600dae92..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/cache/policy.js +++ /dev/null @@ -1,161 +0,0 @@ -const CacheSemantics = require('http-cache-semantics') -const Negotiator = require('negotiator') -const ssri = require('ssri') - -// options passed to http-cache-semantics constructor -const policyOptions = { - shared: false, - ignoreCargoCult: true, -} - -// a fake empty response, used when only testing the -// request for storability -const emptyResponse = { status: 200, headers: {} } - -// returns a plain object representation of the Request -const requestObject = (request) => { - const _obj = { - method: request.method, - url: request.url, - headers: {}, - compress: request.compress, - } - - request.headers.forEach((value, key) => { - _obj.headers[key] = value - }) - - return _obj -} - -// returns a plain object representation of the Response -const responseObject = (response) => { - const _obj = { - status: response.status, - headers: {}, - } - - response.headers.forEach((value, key) => { - _obj.headers[key] = value - }) - - return _obj -} - -class CachePolicy { - constructor ({ entry, request, response, options }) { - this.entry = entry - this.request = requestObject(request) - this.response = responseObject(response) - this.options = options - this.policy = new CacheSemantics(this.request, this.response, policyOptions) - - if (this.entry) { - // if we have an entry, copy the timestamp to the _responseTime - // this is necessary because the CacheSemantics constructor forces - // the value to Date.now() which means a policy created from a - // cache entry is likely to always identify itself as stale - this.policy._responseTime = this.entry.metadata.time - } - } - - // static method to quickly determine if a request alone is storable - static storable (request, options) { - // no cachePath means no caching - if (!options.cachePath) { - return false - } - - // user explicitly asked not to cache - if (options.cache === 'no-store') { - return false - } - - // we only cache GET and HEAD requests - if (!['GET', 'HEAD'].includes(request.method)) { - return false - } - - // otherwise, let http-cache-semantics make the decision - // based on the request's headers - const policy = new CacheSemantics(requestObject(request), emptyResponse, policyOptions) - return policy.storable() - } - - // returns true if the policy satisfies the request - satisfies (request) { - const _req = requestObject(request) - if (this.request.headers.host !== _req.headers.host) { - return false - } - - if (this.request.compress !== _req.compress) { - return false - } - - const negotiatorA = new Negotiator(this.request) - const negotiatorB = new Negotiator(_req) - - if (JSON.stringify(negotiatorA.mediaTypes()) !== JSON.stringify(negotiatorB.mediaTypes())) { - return false - } - - if (JSON.stringify(negotiatorA.languages()) !== JSON.stringify(negotiatorB.languages())) { - return false - } - - if (JSON.stringify(negotiatorA.encodings()) !== JSON.stringify(negotiatorB.encodings())) { - return false - } - - if (this.options.integrity) { - return ssri.parse(this.options.integrity).match(this.entry.integrity) - } - - return true - } - - // returns true if the request and response allow caching - storable () { - return this.policy.storable() - } - - // NOTE: this is a hack to avoid parsing the cache-control - // header ourselves, it returns true if the response's - // cache-control contains must-revalidate - get mustRevalidate () { - return !!this.policy._rescc['must-revalidate'] - } - - // returns true if the cached response requires revalidation - // for the given request - needsRevalidation (request) { - const _req = requestObject(request) - // force method to GET because we only cache GETs - // but can serve a HEAD from a cached GET - _req.method = 'GET' - return !this.policy.satisfiesWithoutRevalidation(_req) - } - - responseHeaders () { - return this.policy.responseHeaders() - } - - // returns a new object containing the appropriate headers - // to send a revalidation request - revalidationHeaders (request) { - const _req = requestObject(request) - return this.policy.revalidationHeaders(_req) - } - - // returns true if the request/response was revalidated - // successfully. returns false if a new response was received - revalidated (request, response) { - const _req = requestObject(request) - const _res = responseObject(response) - const policy = this.policy.revalidatedPolicy(_req, _res) - return !policy.modified - } -} - -module.exports = CachePolicy diff --git a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/fetch.js b/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/fetch.js deleted file mode 100644 index 233ba67e165502..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/fetch.js +++ /dev/null @@ -1,118 +0,0 @@ -'use strict' - -const { FetchError, Request, isRedirect } = require('minipass-fetch') -const url = require('url') - -const CachePolicy = require('./cache/policy.js') -const cache = require('./cache/index.js') -const remote = require('./remote.js') - -// given a Request, a Response and user options -// return true if the response is a redirect that -// can be followed. we throw errors that will result -// in the fetch being rejected if the redirect is -// possible but invalid for some reason -const canFollowRedirect = (request, response, options) => { - if (!isRedirect(response.status)) { - return false - } - - if (options.redirect === 'manual') { - return false - } - - if (options.redirect === 'error') { - throw new FetchError(`redirect mode is set to error: ${request.url}`, - 'no-redirect', { code: 'ENOREDIRECT' }) - } - - if (!response.headers.has('location')) { - throw new FetchError(`redirect location header missing for: ${request.url}`, - 'no-location', { code: 'EINVALIDREDIRECT' }) - } - - if (request.counter >= request.follow) { - throw new FetchError(`maximum redirect reached at: ${request.url}`, - 'max-redirect', { code: 'EMAXREDIRECT' }) - } - - return true -} - -// given a Request, a Response, and the user's options return an object -// with a new Request and a new options object that will be used for -// following the redirect -const getRedirect = (request, response, options) => { - const _opts = { ...options } - const location = response.headers.get('location') - const redirectUrl = new url.URL(location, /^https?:/.test(location) ? undefined : request.url) - // Comment below is used under the following license: - /** - * @license - * Copyright (c) 2010-2012 Mikeal Rogers - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an "AS - * IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either - * express or implied. See the License for the specific language - * governing permissions and limitations under the License. - */ - - // Remove authorization if changing hostnames (but not if just - // changing ports or protocols). This matches the behavior of request: - // https://github.com/request/request/blob/b12a6245/lib/redirect.js#L134-L138 - if (new url.URL(request.url).hostname !== redirectUrl.hostname) { - request.headers.delete('authorization') - request.headers.delete('cookie') - } - - // for POST request with 301/302 response, or any request with 303 response, - // use GET when following redirect - if ( - response.status === 303 || - (request.method === 'POST' && [301, 302].includes(response.status)) - ) { - _opts.method = 'GET' - _opts.body = null - request.headers.delete('content-length') - } - - _opts.headers = {} - request.headers.forEach((value, key) => { - _opts.headers[key] = value - }) - - _opts.counter = ++request.counter - const redirectReq = new Request(url.format(redirectUrl), _opts) - return { - request: redirectReq, - options: _opts, - } -} - -const fetch = async (request, options) => { - const response = CachePolicy.storable(request, options) - ? await cache(request, options) - : await remote(request, options) - - // if the request wasn't a GET or HEAD, and the response - // status is between 200 and 399 inclusive, invalidate the - // request url - if (!['GET', 'HEAD'].includes(request.method) && - response.status >= 200 && - response.status <= 399) { - await cache.invalidate(request, options) - } - - if (!canFollowRedirect(request, response, options)) { - return response - } - - const redirect = getRedirect(request, response, options) - return fetch(redirect.request, redirect.options) -} - -module.exports = fetch diff --git a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/index.js b/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/index.js deleted file mode 100644 index 2f12e8e1b61131..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/index.js +++ /dev/null @@ -1,41 +0,0 @@ -const { FetchError, Headers, Request, Response } = require('minipass-fetch') - -const configureOptions = require('./options.js') -const fetch = require('./fetch.js') - -const makeFetchHappen = (url, opts) => { - const options = configureOptions(opts) - - const request = new Request(url, options) - return fetch(request, options) -} - -makeFetchHappen.defaults = (defaultUrl, defaultOptions = {}, wrappedFetch = makeFetchHappen) => { - if (typeof defaultUrl === 'object') { - defaultOptions = defaultUrl - defaultUrl = null - } - - const defaultedFetch = (url, options = {}) => { - const finalUrl = url || defaultUrl - const finalOptions = { - ...defaultOptions, - ...options, - headers: { - ...defaultOptions.headers, - ...options.headers, - }, - } - return wrappedFetch(finalUrl, finalOptions) - } - - defaultedFetch.defaults = (defaultUrl1, defaultOptions1 = {}) => - makeFetchHappen.defaults(defaultUrl1, defaultOptions1, defaultedFetch) - return defaultedFetch -} - -module.exports = makeFetchHappen -module.exports.FetchError = FetchError -module.exports.Headers = Headers -module.exports.Request = Request -module.exports.Response = Response diff --git a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/options.js b/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/options.js deleted file mode 100644 index f77511279f831d..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/options.js +++ /dev/null @@ -1,54 +0,0 @@ -const dns = require('dns') - -const conditionalHeaders = [ - 'if-modified-since', - 'if-none-match', - 'if-unmodified-since', - 'if-match', - 'if-range', -] - -const configureOptions = (opts) => { - const { strictSSL, ...options } = { ...opts } - options.method = options.method ? options.method.toUpperCase() : 'GET' - options.rejectUnauthorized = strictSSL !== false - - if (!options.retry) { - options.retry = { retries: 0 } - } else if (typeof options.retry === 'string') { - const retries = parseInt(options.retry, 10) - if (isFinite(retries)) { - options.retry = { retries } - } else { - options.retry = { retries: 0 } - } - } else if (typeof options.retry === 'number') { - options.retry = { retries: options.retry } - } else { - options.retry = { retries: 0, ...options.retry } - } - - options.dns = { ttl: 5 * 60 * 1000, lookup: dns.lookup, ...options.dns } - - options.cache = options.cache || 'default' - if (options.cache === 'default') { - const hasConditionalHeader = Object.keys(options.headers || {}).some((name) => { - return conditionalHeaders.includes(name.toLowerCase()) - }) - if (hasConditionalHeader) { - options.cache = 'no-store' - } - } - - options.cacheAdditionalHeaders = options.cacheAdditionalHeaders || [] - - // cacheManager is deprecated, but if it's set and - // cachePath is not we should copy it to the new field - if (options.cacheManager && !options.cachePath) { - options.cachePath = options.cacheManager - } - - return options -} - -module.exports = configureOptions diff --git a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/pipeline.js b/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/pipeline.js deleted file mode 100644 index b1d221b2d0ce31..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/pipeline.js +++ /dev/null @@ -1,41 +0,0 @@ -'use strict' - -const MinipassPipeline = require('minipass-pipeline') - -class CachingMinipassPipeline extends MinipassPipeline { - #events = [] - #data = new Map() - - constructor (opts, ...streams) { - // CRITICAL: do NOT pass the streams to the call to super(), this will start - // the flow of data and potentially cause the events we need to catch to emit - // before we've finished our own setup. instead we call super() with no args, - // finish our setup, and then push the streams into ourselves to start the - // data flow - super() - this.#events = opts.events - - /* istanbul ignore next - coverage disabled because this is pointless to test here */ - if (streams.length) { - this.push(...streams) - } - } - - on (event, handler) { - if (this.#events.includes(event) && this.#data.has(event)) { - return handler(...this.#data.get(event)) - } - - return super.on(event, handler) - } - - emit (event, ...data) { - if (this.#events.includes(event)) { - this.#data.set(event, data) - } - - return super.emit(event, ...data) - } -} - -module.exports = CachingMinipassPipeline diff --git a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/remote.js b/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/remote.js deleted file mode 100644 index 8554564074de6e..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/lib/remote.js +++ /dev/null @@ -1,131 +0,0 @@ -const { Minipass } = require('minipass') -const fetch = require('minipass-fetch') -const promiseRetry = require('promise-retry') -const ssri = require('ssri') -const { log } = require('proc-log') - -const CachingMinipassPipeline = require('./pipeline.js') -const { getAgent } = require('@npmcli/agent') -const pkg = require('../package.json') - -const USER_AGENT = `${pkg.name}/${pkg.version} (+https://npm.im/${pkg.name})` - -const RETRY_ERRORS = [ - 'ECONNRESET', // remote socket closed on us - 'ECONNREFUSED', // remote host refused to open connection - 'EADDRINUSE', // failed to bind to a local port (proxy?) - 'ETIMEDOUT', // someone in the transaction is WAY TOO SLOW - // from @npmcli/agent - 'ECONNECTIONTIMEOUT', - 'EIDLETIMEOUT', - 'ERESPONSETIMEOUT', - 'ETRANSFERTIMEOUT', - // Known codes we do NOT retry on: - // ENOTFOUND (getaddrinfo failure. Either bad hostname, or offline) - // EINVALIDPROXY // invalid protocol from @npmcli/agent - // EINVALIDRESPONSE // invalid status code from @npmcli/agent -] - -const RETRY_TYPES = [ - 'request-timeout', -] - -// make a request directly to the remote source, -// retrying certain classes of errors as well as -// following redirects (through the cache if necessary) -// and verifying response integrity -const remoteFetch = (request, options) => { - const agent = getAgent(request.url, options) - if (!request.headers.has('connection')) { - request.headers.set('connection', agent ? 'keep-alive' : 'close') - } - - if (!request.headers.has('user-agent')) { - request.headers.set('user-agent', USER_AGENT) - } - - // keep our own options since we're overriding the agent - // and the redirect mode - const _opts = { - ...options, - agent, - redirect: 'manual', - } - - return promiseRetry(async (retryHandler, attemptNum) => { - const req = new fetch.Request(request, _opts) - try { - let res = await fetch(req, _opts) - if (_opts.integrity && res.status === 200) { - // we got a 200 response and the user has specified an expected - // integrity value, so wrap the response in an ssri stream to verify it - const integrityStream = ssri.integrityStream({ - algorithms: _opts.algorithms, - integrity: _opts.integrity, - size: _opts.size, - }) - const pipeline = new CachingMinipassPipeline({ - events: ['integrity', 'size'], - }, res.body, integrityStream) - // we also propagate the integrity and size events out to the pipeline so we can use - // this new response body as an integrityEmitter for cacache - integrityStream.on('integrity', i => pipeline.emit('integrity', i)) - integrityStream.on('size', s => pipeline.emit('size', s)) - res = new fetch.Response(pipeline, res) - // set an explicit flag so we know if our response body will emit integrity and size - res.body.hasIntegrityEmitter = true - } - - res.headers.set('x-fetch-attempts', attemptNum) - - // do not retry POST requests, or requests with a streaming body - // do retry requests with a 408, 420, 429 or 500+ status in the response - const isStream = Minipass.isStream(req.body) - const isRetriable = req.method !== 'POST' && - !isStream && - ([408, 420, 429].includes(res.status) || res.status >= 500) - - if (isRetriable) { - if (typeof options.onRetry === 'function') { - options.onRetry(res) - } - - /* eslint-disable-next-line max-len */ - log.http('fetch', `${req.method} ${req.url} attempt ${attemptNum} failed with ${res.status}`) - return retryHandler(res) - } - - return res - } catch (err) { - const code = (err.code === 'EPROMISERETRY') - ? err.retried.code - : err.code - - // err.retried will be the thing that was thrown from above - // if it's a response, we just got a bad status code and we - // can re-throw to allow the retry - const isRetryError = err.retried instanceof fetch.Response || - (RETRY_ERRORS.includes(code) && RETRY_TYPES.includes(err.type)) - - if (req.method === 'POST' || isRetryError) { - throw err - } - - if (typeof options.onRetry === 'function') { - options.onRetry(err) - } - - log.http('fetch', `${req.method} ${req.url} attempt ${attemptNum} failed with ${err.code}`) - return retryHandler(err) - } - }, options.retry).catch((err) => { - // don't reject for http errors, just return them - if (err.status >= 400 && err.type !== 'system') { - return err - } - - throw err - }) -} - -module.exports = remoteFetch diff --git a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/package.json b/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/package.json deleted file mode 100644 index 7adb4d1e7f9719..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/make-fetch-happen/package.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "name": "make-fetch-happen", - "version": "13.0.1", - "description": "Opinionated, caching, retrying fetch client", - "main": "lib/index.js", - "files": [ - "bin/", - "lib/" - ], - "scripts": { - "test": "tap", - "posttest": "npm run lint", - "eslint": "eslint", - "lint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"", - "lintfix": "npm run lint -- --fix", - "postlint": "template-oss-check", - "snap": "tap", - "template-oss-apply": "template-oss-apply --force" - }, - "repository": { - "type": "git", - "url": "https://github.com/npm/make-fetch-happen.git" - }, - "keywords": [ - "http", - "request", - "fetch", - "mean girls", - "caching", - "cache", - "subresource integrity" - ], - "author": "GitHub Inc.", - "license": "ISC", - "dependencies": { - "@npmcli/agent": "^2.0.0", - "cacache": "^18.0.0", - "http-cache-semantics": "^4.1.1", - "is-lambda": "^1.0.1", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "proc-log": "^4.2.0", - "promise-retry": "^2.0.1", - "ssri": "^10.0.0" - }, - "devDependencies": { - "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.21.4", - "nock": "^13.2.4", - "safe-buffer": "^5.2.1", - "standard-version": "^9.3.2", - "tap": "^16.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - }, - "tap": { - "color": 1, - "files": "test/*.js", - "check-coverage": true, - "timeout": 60, - "nyc-arg": [ - "--exclude", - "tap-snapshots/**" - ] - }, - "templateOSS": { - "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.21.4", - "publish": "true" - } -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/minipass-fetch/LICENSE b/deps/npm/node_modules/node-gyp/node_modules/minipass-fetch/LICENSE deleted file mode 100644 index 3c3410cdc12ee3..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/minipass-fetch/LICENSE +++ /dev/null @@ -1,28 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Isaac Z. Schlueter and Contributors -Copyright (c) 2016 David Frank - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - ---- - -Note: This is a derivative work based on "node-fetch" by David Frank, -modified and distributed under the terms of the MIT license above. -https://github.com/bitinn/node-fetch diff --git a/deps/npm/node_modules/node-gyp/node_modules/minipass-fetch/lib/abort-error.js b/deps/npm/node_modules/node-gyp/node_modules/minipass-fetch/lib/abort-error.js deleted file mode 100644 index b18f643269e375..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/minipass-fetch/lib/abort-error.js +++ /dev/null @@ -1,17 +0,0 @@ -'use strict' -class AbortError extends Error { - constructor (message) { - super(message) - this.code = 'FETCH_ABORTED' - this.type = 'aborted' - Error.captureStackTrace(this, this.constructor) - } - - get name () { - return 'AbortError' - } - - // don't allow name to be overridden, but don't throw either - set name (s) {} -} -module.exports = AbortError diff --git a/deps/npm/node_modules/node-gyp/node_modules/minipass-fetch/lib/blob.js b/deps/npm/node_modules/node-gyp/node_modules/minipass-fetch/lib/blob.js deleted file mode 100644 index 121b1730102e72..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/minipass-fetch/lib/blob.js +++ /dev/null @@ -1,97 +0,0 @@ -'use strict' -const { Minipass } = require('minipass') -const TYPE = Symbol('type') -const BUFFER = Symbol('buffer') - -class Blob { - constructor (blobParts, options) { - this[TYPE] = '' - - const buffers = [] - let size = 0 - - if (blobParts) { - const a = blobParts - const length = Number(a.length) - for (let i = 0; i < length; i++) { - const element = a[i] - const buffer = element instanceof Buffer ? element - : ArrayBuffer.isView(element) - ? Buffer.from(element.buffer, element.byteOffset, element.byteLength) - : element instanceof ArrayBuffer ? Buffer.from(element) - : element instanceof Blob ? element[BUFFER] - : typeof element === 'string' ? Buffer.from(element) - : Buffer.from(String(element)) - size += buffer.length - buffers.push(buffer) - } - } - - this[BUFFER] = Buffer.concat(buffers, size) - - const type = options && options.type !== undefined - && String(options.type).toLowerCase() - if (type && !/[^\u0020-\u007E]/.test(type)) { - this[TYPE] = type - } - } - - get size () { - return this[BUFFER].length - } - - get type () { - return this[TYPE] - } - - text () { - return Promise.resolve(this[BUFFER].toString()) - } - - arrayBuffer () { - const buf = this[BUFFER] - const off = buf.byteOffset - const len = buf.byteLength - const ab = buf.buffer.slice(off, off + len) - return Promise.resolve(ab) - } - - stream () { - return new Minipass().end(this[BUFFER]) - } - - slice (start, end, type) { - const size = this.size - const relativeStart = start === undefined ? 0 - : start < 0 ? Math.max(size + start, 0) - : Math.min(start, size) - const relativeEnd = end === undefined ? size - : end < 0 ? Math.max(size + end, 0) - : Math.min(end, size) - const span = Math.max(relativeEnd - relativeStart, 0) - - const buffer = this[BUFFER] - const slicedBuffer = buffer.slice( - relativeStart, - relativeStart + span - ) - const blob = new Blob([], { type }) - blob[BUFFER] = slicedBuffer - return blob - } - - get [Symbol.toStringTag] () { - return 'Blob' - } - - static get BUFFER () { - return BUFFER - } -} - -Object.defineProperties(Blob.prototype, { - size: { enumerable: true }, - type: { enumerable: true }, -}) - -module.exports = Blob diff --git a/deps/npm/node_modules/node-gyp/node_modules/minipass-fetch/lib/body.js b/deps/npm/node_modules/node-gyp/node_modules/minipass-fetch/lib/body.js deleted file mode 100644 index 62286bd1de0d91..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/minipass-fetch/lib/body.js +++ /dev/null @@ -1,350 +0,0 @@ -'use strict' -const { Minipass } = require('minipass') -const MinipassSized = require('minipass-sized') - -const Blob = require('./blob.js') -const { BUFFER } = Blob -const FetchError = require('./fetch-error.js') - -// optional dependency on 'encoding' -let convert -try { - convert = require('encoding').convert -} catch (e) { - // defer error until textConverted is called -} - -const INTERNALS = Symbol('Body internals') -const CONSUME_BODY = Symbol('consumeBody') - -class Body { - constructor (bodyArg, options = {}) { - const { size = 0, timeout = 0 } = options - const body = bodyArg === undefined || bodyArg === null ? null - : isURLSearchParams(bodyArg) ? Buffer.from(bodyArg.toString()) - : isBlob(bodyArg) ? bodyArg - : Buffer.isBuffer(bodyArg) ? bodyArg - : Object.prototype.toString.call(bodyArg) === '[object ArrayBuffer]' - ? Buffer.from(bodyArg) - : ArrayBuffer.isView(bodyArg) - ? Buffer.from(bodyArg.buffer, bodyArg.byteOffset, bodyArg.byteLength) - : Minipass.isStream(bodyArg) ? bodyArg - : Buffer.from(String(bodyArg)) - - this[INTERNALS] = { - body, - disturbed: false, - error: null, - } - - this.size = size - this.timeout = timeout - - if (Minipass.isStream(body)) { - body.on('error', er => { - const error = er.name === 'AbortError' ? er - : new FetchError(`Invalid response while trying to fetch ${ - this.url}: ${er.message}`, 'system', er) - this[INTERNALS].error = error - }) - } - } - - get body () { - return this[INTERNALS].body - } - - get bodyUsed () { - return this[INTERNALS].disturbed - } - - arrayBuffer () { - return this[CONSUME_BODY]().then(buf => - buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength)) - } - - blob () { - const ct = this.headers && this.headers.get('content-type') || '' - return this[CONSUME_BODY]().then(buf => Object.assign( - new Blob([], { type: ct.toLowerCase() }), - { [BUFFER]: buf } - )) - } - - async json () { - const buf = await this[CONSUME_BODY]() - try { - return JSON.parse(buf.toString()) - } catch (er) { - throw new FetchError( - `invalid json response body at ${this.url} reason: ${er.message}`, - 'invalid-json' - ) - } - } - - text () { - return this[CONSUME_BODY]().then(buf => buf.toString()) - } - - buffer () { - return this[CONSUME_BODY]() - } - - textConverted () { - return this[CONSUME_BODY]().then(buf => convertBody(buf, this.headers)) - } - - [CONSUME_BODY] () { - if (this[INTERNALS].disturbed) { - return Promise.reject(new TypeError(`body used already for: ${ - this.url}`)) - } - - this[INTERNALS].disturbed = true - - if (this[INTERNALS].error) { - return Promise.reject(this[INTERNALS].error) - } - - // body is null - if (this.body === null) { - return Promise.resolve(Buffer.alloc(0)) - } - - if (Buffer.isBuffer(this.body)) { - return Promise.resolve(this.body) - } - - const upstream = isBlob(this.body) ? this.body.stream() : this.body - - /* istanbul ignore if: should never happen */ - if (!Minipass.isStream(upstream)) { - return Promise.resolve(Buffer.alloc(0)) - } - - const stream = this.size && upstream instanceof MinipassSized ? upstream - : !this.size && upstream instanceof Minipass && - !(upstream instanceof MinipassSized) ? upstream - : this.size ? new MinipassSized({ size: this.size }) - : new Minipass() - - // allow timeout on slow response body, but only if the stream is still writable. this - // makes the timeout center on the socket stream from lib/index.js rather than the - // intermediary minipass stream we create to receive the data - const resTimeout = this.timeout && stream.writable ? setTimeout(() => { - stream.emit('error', new FetchError( - `Response timeout while trying to fetch ${ - this.url} (over ${this.timeout}ms)`, 'body-timeout')) - }, this.timeout) : null - - // do not keep the process open just for this timeout, even - // though we expect it'll get cleared eventually. - if (resTimeout && resTimeout.unref) { - resTimeout.unref() - } - - // do the pipe in the promise, because the pipe() can send too much - // data through right away and upset the MP Sized object - return new Promise((resolve) => { - // if the stream is some other kind of stream, then pipe through a MP - // so we can collect it more easily. - if (stream !== upstream) { - upstream.on('error', er => stream.emit('error', er)) - upstream.pipe(stream) - } - resolve() - }).then(() => stream.concat()).then(buf => { - clearTimeout(resTimeout) - return buf - }).catch(er => { - clearTimeout(resTimeout) - // request was aborted, reject with this Error - if (er.name === 'AbortError' || er.name === 'FetchError') { - throw er - } else if (er.name === 'RangeError') { - throw new FetchError(`Could not create Buffer from response body for ${ - this.url}: ${er.message}`, 'system', er) - } else { - // other errors, such as incorrect content-encoding or content-length - throw new FetchError(`Invalid response body while trying to fetch ${ - this.url}: ${er.message}`, 'system', er) - } - }) - } - - static clone (instance) { - if (instance.bodyUsed) { - throw new Error('cannot clone body after it is used') - } - - const body = instance.body - - // check that body is a stream and not form-data object - // NB: can't clone the form-data object without having it as a dependency - if (Minipass.isStream(body) && typeof body.getBoundary !== 'function') { - // create a dedicated tee stream so that we don't lose data - // potentially sitting in the body stream's buffer by writing it - // immediately to p1 and not having it for p2. - const tee = new Minipass() - const p1 = new Minipass() - const p2 = new Minipass() - tee.on('error', er => { - p1.emit('error', er) - p2.emit('error', er) - }) - body.on('error', er => tee.emit('error', er)) - tee.pipe(p1) - tee.pipe(p2) - body.pipe(tee) - // set instance body to one fork, return the other - instance[INTERNALS].body = p1 - return p2 - } else { - return instance.body - } - } - - static extractContentType (body) { - return body === null || body === undefined ? null - : typeof body === 'string' ? 'text/plain;charset=UTF-8' - : isURLSearchParams(body) - ? 'application/x-www-form-urlencoded;charset=UTF-8' - : isBlob(body) ? body.type || null - : Buffer.isBuffer(body) ? null - : Object.prototype.toString.call(body) === '[object ArrayBuffer]' ? null - : ArrayBuffer.isView(body) ? null - : typeof body.getBoundary === 'function' - ? `multipart/form-data;boundary=${body.getBoundary()}` - : Minipass.isStream(body) ? null - : 'text/plain;charset=UTF-8' - } - - static getTotalBytes (instance) { - const { body } = instance - return (body === null || body === undefined) ? 0 - : isBlob(body) ? body.size - : Buffer.isBuffer(body) ? body.length - : body && typeof body.getLengthSync === 'function' && ( - // detect form data input from form-data module - body._lengthRetrievers && - /* istanbul ignore next */ body._lengthRetrievers.length === 0 || // 1.x - body.hasKnownLength && body.hasKnownLength()) // 2.x - ? body.getLengthSync() - : null - } - - static writeToStream (dest, instance) { - const { body } = instance - - if (body === null || body === undefined) { - dest.end() - } else if (Buffer.isBuffer(body) || typeof body === 'string') { - dest.end(body) - } else { - // body is stream or blob - const stream = isBlob(body) ? body.stream() : body - stream.on('error', er => dest.emit('error', er)).pipe(dest) - } - - return dest - } -} - -Object.defineProperties(Body.prototype, { - body: { enumerable: true }, - bodyUsed: { enumerable: true }, - arrayBuffer: { enumerable: true }, - blob: { enumerable: true }, - json: { enumerable: true }, - text: { enumerable: true }, -}) - -const isURLSearchParams = obj => - // Duck-typing as a necessary condition. - (typeof obj !== 'object' || - typeof obj.append !== 'function' || - typeof obj.delete !== 'function' || - typeof obj.get !== 'function' || - typeof obj.getAll !== 'function' || - typeof obj.has !== 'function' || - typeof obj.set !== 'function') ? false - // Brand-checking and more duck-typing as optional condition. - : obj.constructor.name === 'URLSearchParams' || - Object.prototype.toString.call(obj) === '[object URLSearchParams]' || - typeof obj.sort === 'function' - -const isBlob = obj => - typeof obj === 'object' && - typeof obj.arrayBuffer === 'function' && - typeof obj.type === 'string' && - typeof obj.stream === 'function' && - typeof obj.constructor === 'function' && - typeof obj.constructor.name === 'string' && - /^(Blob|File)$/.test(obj.constructor.name) && - /^(Blob|File)$/.test(obj[Symbol.toStringTag]) - -const convertBody = (buffer, headers) => { - /* istanbul ignore if */ - if (typeof convert !== 'function') { - throw new Error('The package `encoding` must be installed to use the textConverted() function') - } - - const ct = headers && headers.get('content-type') - let charset = 'utf-8' - let res - - // header - if (ct) { - res = /charset=([^;]*)/i.exec(ct) - } - - // no charset in content type, peek at response body for at most 1024 bytes - const str = buffer.slice(0, 1024).toString() - - // html5 - if (!res && str) { - res = / this.expect - ? 'max-size' : type - this.message = message - Error.captureStackTrace(this, this.constructor) - } - - get name () { - return 'FetchError' - } - - // don't allow name to be overwritten - set name (n) {} - - get [Symbol.toStringTag] () { - return 'FetchError' - } -} -module.exports = FetchError diff --git a/deps/npm/node_modules/node-gyp/node_modules/minipass-fetch/lib/headers.js b/deps/npm/node_modules/node-gyp/node_modules/minipass-fetch/lib/headers.js deleted file mode 100644 index dd6e854d5ba399..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/minipass-fetch/lib/headers.js +++ /dev/null @@ -1,267 +0,0 @@ -'use strict' -const invalidTokenRegex = /[^^_`a-zA-Z\-0-9!#$%&'*+.|~]/ -const invalidHeaderCharRegex = /[^\t\x20-\x7e\x80-\xff]/ - -const validateName = name => { - name = `${name}` - if (invalidTokenRegex.test(name) || name === '') { - throw new TypeError(`${name} is not a legal HTTP header name`) - } -} - -const validateValue = value => { - value = `${value}` - if (invalidHeaderCharRegex.test(value)) { - throw new TypeError(`${value} is not a legal HTTP header value`) - } -} - -const find = (map, name) => { - name = name.toLowerCase() - for (const key in map) { - if (key.toLowerCase() === name) { - return key - } - } - return undefined -} - -const MAP = Symbol('map') -class Headers { - constructor (init = undefined) { - this[MAP] = Object.create(null) - if (init instanceof Headers) { - const rawHeaders = init.raw() - const headerNames = Object.keys(rawHeaders) - for (const headerName of headerNames) { - for (const value of rawHeaders[headerName]) { - this.append(headerName, value) - } - } - return - } - - // no-op - if (init === undefined || init === null) { - return - } - - if (typeof init === 'object') { - const method = init[Symbol.iterator] - if (method !== null && method !== undefined) { - if (typeof method !== 'function') { - throw new TypeError('Header pairs must be iterable') - } - - // sequence> - // Note: per spec we have to first exhaust the lists then process them - const pairs = [] - for (const pair of init) { - if (typeof pair !== 'object' || - typeof pair[Symbol.iterator] !== 'function') { - throw new TypeError('Each header pair must be iterable') - } - const arrPair = Array.from(pair) - if (arrPair.length !== 2) { - throw new TypeError('Each header pair must be a name/value tuple') - } - pairs.push(arrPair) - } - - for (const pair of pairs) { - this.append(pair[0], pair[1]) - } - } else { - // record - for (const key of Object.keys(init)) { - this.append(key, init[key]) - } - } - } else { - throw new TypeError('Provided initializer must be an object') - } - } - - get (name) { - name = `${name}` - validateName(name) - const key = find(this[MAP], name) - if (key === undefined) { - return null - } - - return this[MAP][key].join(', ') - } - - forEach (callback, thisArg = undefined) { - let pairs = getHeaders(this) - for (let i = 0; i < pairs.length; i++) { - const [name, value] = pairs[i] - callback.call(thisArg, value, name, this) - // refresh in case the callback added more headers - pairs = getHeaders(this) - } - } - - set (name, value) { - name = `${name}` - value = `${value}` - validateName(name) - validateValue(value) - const key = find(this[MAP], name) - this[MAP][key !== undefined ? key : name] = [value] - } - - append (name, value) { - name = `${name}` - value = `${value}` - validateName(name) - validateValue(value) - const key = find(this[MAP], name) - if (key !== undefined) { - this[MAP][key].push(value) - } else { - this[MAP][name] = [value] - } - } - - has (name) { - name = `${name}` - validateName(name) - return find(this[MAP], name) !== undefined - } - - delete (name) { - name = `${name}` - validateName(name) - const key = find(this[MAP], name) - if (key !== undefined) { - delete this[MAP][key] - } - } - - raw () { - return this[MAP] - } - - keys () { - return new HeadersIterator(this, 'key') - } - - values () { - return new HeadersIterator(this, 'value') - } - - [Symbol.iterator] () { - return new HeadersIterator(this, 'key+value') - } - - entries () { - return new HeadersIterator(this, 'key+value') - } - - get [Symbol.toStringTag] () { - return 'Headers' - } - - static exportNodeCompatibleHeaders (headers) { - const obj = Object.assign(Object.create(null), headers[MAP]) - - // http.request() only supports string as Host header. This hack makes - // specifying custom Host header possible. - const hostHeaderKey = find(headers[MAP], 'Host') - if (hostHeaderKey !== undefined) { - obj[hostHeaderKey] = obj[hostHeaderKey][0] - } - - return obj - } - - static createHeadersLenient (obj) { - const headers = new Headers() - for (const name of Object.keys(obj)) { - if (invalidTokenRegex.test(name)) { - continue - } - - if (Array.isArray(obj[name])) { - for (const val of obj[name]) { - if (invalidHeaderCharRegex.test(val)) { - continue - } - - if (headers[MAP][name] === undefined) { - headers[MAP][name] = [val] - } else { - headers[MAP][name].push(val) - } - } - } else if (!invalidHeaderCharRegex.test(obj[name])) { - headers[MAP][name] = [obj[name]] - } - } - return headers - } -} - -Object.defineProperties(Headers.prototype, { - get: { enumerable: true }, - forEach: { enumerable: true }, - set: { enumerable: true }, - append: { enumerable: true }, - has: { enumerable: true }, - delete: { enumerable: true }, - keys: { enumerable: true }, - values: { enumerable: true }, - entries: { enumerable: true }, -}) - -const getHeaders = (headers, kind = 'key+value') => - Object.keys(headers[MAP]).sort().map( - kind === 'key' ? k => k.toLowerCase() - : kind === 'value' ? k => headers[MAP][k].join(', ') - : k => [k.toLowerCase(), headers[MAP][k].join(', ')] - ) - -const INTERNAL = Symbol('internal') - -class HeadersIterator { - constructor (target, kind) { - this[INTERNAL] = { - target, - kind, - index: 0, - } - } - - get [Symbol.toStringTag] () { - return 'HeadersIterator' - } - - next () { - /* istanbul ignore if: should be impossible */ - if (!this || Object.getPrototypeOf(this) !== HeadersIterator.prototype) { - throw new TypeError('Value of `this` is not a HeadersIterator') - } - - const { target, kind, index } = this[INTERNAL] - const values = getHeaders(target, kind) - const len = values.length - if (index >= len) { - return { - value: undefined, - done: true, - } - } - - this[INTERNAL].index++ - - return { value: values[index], done: false } - } -} - -// manually extend because 'extends' requires a ctor -Object.setPrototypeOf(HeadersIterator.prototype, - Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]()))) - -module.exports = Headers diff --git a/deps/npm/node_modules/node-gyp/node_modules/minipass-fetch/lib/index.js b/deps/npm/node_modules/node-gyp/node_modules/minipass-fetch/lib/index.js deleted file mode 100644 index da402161670e65..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/minipass-fetch/lib/index.js +++ /dev/null @@ -1,377 +0,0 @@ -'use strict' -const { URL } = require('url') -const http = require('http') -const https = require('https') -const zlib = require('minizlib') -const { Minipass } = require('minipass') - -const Body = require('./body.js') -const { writeToStream, getTotalBytes } = Body -const Response = require('./response.js') -const Headers = require('./headers.js') -const { createHeadersLenient } = Headers -const Request = require('./request.js') -const { getNodeRequestOptions } = Request -const FetchError = require('./fetch-error.js') -const AbortError = require('./abort-error.js') - -// XXX this should really be split up and unit-ized for easier testing -// and better DRY implementation of data/http request aborting -const fetch = async (url, opts) => { - if (/^data:/.test(url)) { - const request = new Request(url, opts) - // delay 1 promise tick so that the consumer can abort right away - return Promise.resolve().then(() => new Promise((resolve, reject) => { - let type, data - try { - const { pathname, search } = new URL(url) - const split = pathname.split(',') - if (split.length < 2) { - throw new Error('invalid data: URI') - } - const mime = split.shift() - const base64 = /;base64$/.test(mime) - type = base64 ? mime.slice(0, -1 * ';base64'.length) : mime - const rawData = decodeURIComponent(split.join(',') + search) - data = base64 ? Buffer.from(rawData, 'base64') : Buffer.from(rawData) - } catch (er) { - return reject(new FetchError(`[${request.method}] ${ - request.url} invalid URL, ${er.message}`, 'system', er)) - } - - const { signal } = request - if (signal && signal.aborted) { - return reject(new AbortError('The user aborted a request.')) - } - - const headers = { 'Content-Length': data.length } - if (type) { - headers['Content-Type'] = type - } - return resolve(new Response(data, { headers })) - })) - } - - return new Promise((resolve, reject) => { - // build request object - const request = new Request(url, opts) - let options - try { - options = getNodeRequestOptions(request) - } catch (er) { - return reject(er) - } - - const send = (options.protocol === 'https:' ? https : http).request - const { signal } = request - let response = null - const abort = () => { - const error = new AbortError('The user aborted a request.') - reject(error) - if (Minipass.isStream(request.body) && - typeof request.body.destroy === 'function') { - request.body.destroy(error) - } - if (response && response.body) { - response.body.emit('error', error) - } - } - - if (signal && signal.aborted) { - return abort() - } - - const abortAndFinalize = () => { - abort() - finalize() - } - - const finalize = () => { - req.abort() - if (signal) { - signal.removeEventListener('abort', abortAndFinalize) - } - clearTimeout(reqTimeout) - } - - // send request - const req = send(options) - - if (signal) { - signal.addEventListener('abort', abortAndFinalize) - } - - let reqTimeout = null - if (request.timeout) { - req.once('socket', () => { - reqTimeout = setTimeout(() => { - reject(new FetchError(`network timeout at: ${ - request.url}`, 'request-timeout')) - finalize() - }, request.timeout) - }) - } - - req.on('error', er => { - // if a 'response' event is emitted before the 'error' event, then by the - // time this handler is run it's too late to reject the Promise for the - // response. instead, we forward the error event to the response stream - // so that the error will surface to the user when they try to consume - // the body. this is done as a side effect of aborting the request except - // for in windows, where we must forward the event manually, otherwise - // there is no longer a ref'd socket attached to the request and the - // stream never ends so the event loop runs out of work and the process - // exits without warning. - // coverage skipped here due to the difficulty in testing - // istanbul ignore next - if (req.res) { - req.res.emit('error', er) - } - reject(new FetchError(`request to ${request.url} failed, reason: ${ - er.message}`, 'system', er)) - finalize() - }) - - req.on('response', res => { - clearTimeout(reqTimeout) - - const headers = createHeadersLenient(res.headers) - - // HTTP fetch step 5 - if (fetch.isRedirect(res.statusCode)) { - // HTTP fetch step 5.2 - const location = headers.get('Location') - - // HTTP fetch step 5.3 - let locationURL = null - try { - locationURL = location === null ? null : new URL(location, request.url).toString() - } catch { - // error here can only be invalid URL in Location: header - // do not throw when options.redirect == manual - // let the user extract the errorneous redirect URL - if (request.redirect !== 'manual') { - /* eslint-disable-next-line max-len */ - reject(new FetchError(`uri requested responds with an invalid redirect URL: ${location}`, 'invalid-redirect')) - finalize() - return - } - } - - // HTTP fetch step 5.5 - if (request.redirect === 'error') { - reject(new FetchError('uri requested responds with a redirect, ' + - `redirect mode is set to error: ${request.url}`, 'no-redirect')) - finalize() - return - } else if (request.redirect === 'manual') { - // node-fetch-specific step: make manual redirect a bit easier to - // use by setting the Location header value to the resolved URL. - if (locationURL !== null) { - // handle corrupted header - try { - headers.set('Location', locationURL) - } catch (err) { - /* istanbul ignore next: nodejs server prevent invalid - response headers, we can't test this through normal - request */ - reject(err) - } - } - } else if (request.redirect === 'follow' && locationURL !== null) { - // HTTP-redirect fetch step 5 - if (request.counter >= request.follow) { - reject(new FetchError(`maximum redirect reached at: ${ - request.url}`, 'max-redirect')) - finalize() - return - } - - // HTTP-redirect fetch step 9 - if (res.statusCode !== 303 && - request.body && - getTotalBytes(request) === null) { - reject(new FetchError( - 'Cannot follow redirect with body being a readable stream', - 'unsupported-redirect' - )) - finalize() - return - } - - // Update host due to redirection - request.headers.set('host', (new URL(locationURL)).host) - - // HTTP-redirect fetch step 6 (counter increment) - // Create a new Request object. - const requestOpts = { - headers: new Headers(request.headers), - follow: request.follow, - counter: request.counter + 1, - agent: request.agent, - compress: request.compress, - method: request.method, - body: request.body, - signal: request.signal, - timeout: request.timeout, - } - - // if the redirect is to a new hostname, strip the authorization and cookie headers - const parsedOriginal = new URL(request.url) - const parsedRedirect = new URL(locationURL) - if (parsedOriginal.hostname !== parsedRedirect.hostname) { - requestOpts.headers.delete('authorization') - requestOpts.headers.delete('cookie') - } - - // HTTP-redirect fetch step 11 - if (res.statusCode === 303 || ( - (res.statusCode === 301 || res.statusCode === 302) && - request.method === 'POST' - )) { - requestOpts.method = 'GET' - requestOpts.body = undefined - requestOpts.headers.delete('content-length') - } - - // HTTP-redirect fetch step 15 - resolve(fetch(new Request(locationURL, requestOpts))) - finalize() - return - } - } // end if(isRedirect) - - // prepare response - res.once('end', () => - signal && signal.removeEventListener('abort', abortAndFinalize)) - - const body = new Minipass() - // if an error occurs, either on the response stream itself, on one of the - // decoder streams, or a response length timeout from the Body class, we - // forward the error through to our internal body stream. If we see an - // error event on that, we call finalize to abort the request and ensure - // we don't leave a socket believing a request is in flight. - // this is difficult to test, so lacks specific coverage. - body.on('error', finalize) - // exceedingly rare that the stream would have an error, - // but just in case we proxy it to the stream in use. - res.on('error', /* istanbul ignore next */ er => body.emit('error', er)) - res.on('data', (chunk) => body.write(chunk)) - res.on('end', () => body.end()) - - const responseOptions = { - url: request.url, - status: res.statusCode, - statusText: res.statusMessage, - headers: headers, - size: request.size, - timeout: request.timeout, - counter: request.counter, - trailer: new Promise(resolveTrailer => - res.on('end', () => resolveTrailer(createHeadersLenient(res.trailers)))), - } - - // HTTP-network fetch step 12.1.1.3 - const codings = headers.get('Content-Encoding') - - // HTTP-network fetch step 12.1.1.4: handle content codings - - // in following scenarios we ignore compression support - // 1. compression support is disabled - // 2. HEAD request - // 3. no Content-Encoding header - // 4. no content response (204) - // 5. content not modified response (304) - if (!request.compress || - request.method === 'HEAD' || - codings === null || - res.statusCode === 204 || - res.statusCode === 304) { - response = new Response(body, responseOptions) - resolve(response) - return - } - - // Be less strict when decoding compressed responses, since sometimes - // servers send slightly invalid responses that are still accepted - // by common browsers. - // Always using Z_SYNC_FLUSH is what cURL does. - const zlibOptions = { - flush: zlib.constants.Z_SYNC_FLUSH, - finishFlush: zlib.constants.Z_SYNC_FLUSH, - } - - // for gzip - if (codings === 'gzip' || codings === 'x-gzip') { - const unzip = new zlib.Gunzip(zlibOptions) - response = new Response( - // exceedingly rare that the stream would have an error, - // but just in case we proxy it to the stream in use. - body.on('error', /* istanbul ignore next */ er => unzip.emit('error', er)).pipe(unzip), - responseOptions - ) - resolve(response) - return - } - - // for deflate - if (codings === 'deflate' || codings === 'x-deflate') { - // handle the infamous raw deflate response from old servers - // a hack for old IIS and Apache servers - const raw = res.pipe(new Minipass()) - raw.once('data', chunk => { - // see http://stackoverflow.com/questions/37519828 - const decoder = (chunk[0] & 0x0F) === 0x08 - ? new zlib.Inflate() - : new zlib.InflateRaw() - // exceedingly rare that the stream would have an error, - // but just in case we proxy it to the stream in use. - body.on('error', /* istanbul ignore next */ er => decoder.emit('error', er)).pipe(decoder) - response = new Response(decoder, responseOptions) - resolve(response) - }) - return - } - - // for br - if (codings === 'br') { - // ignoring coverage so tests don't have to fake support (or lack of) for brotli - // istanbul ignore next - try { - var decoder = new zlib.BrotliDecompress() - } catch (err) { - reject(err) - finalize() - return - } - // exceedingly rare that the stream would have an error, - // but just in case we proxy it to the stream in use. - body.on('error', /* istanbul ignore next */ er => decoder.emit('error', er)).pipe(decoder) - response = new Response(decoder, responseOptions) - resolve(response) - return - } - - // otherwise, use response as-is - response = new Response(body, responseOptions) - resolve(response) - }) - - writeToStream(req, request) - }) -} - -module.exports = fetch - -fetch.isRedirect = code => - code === 301 || - code === 302 || - code === 303 || - code === 307 || - code === 308 - -fetch.Headers = Headers -fetch.Request = Request -fetch.Response = Response -fetch.FetchError = FetchError -fetch.AbortError = AbortError diff --git a/deps/npm/node_modules/node-gyp/node_modules/minipass-fetch/lib/request.js b/deps/npm/node_modules/node-gyp/node_modules/minipass-fetch/lib/request.js deleted file mode 100644 index 054439e6699107..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/minipass-fetch/lib/request.js +++ /dev/null @@ -1,282 +0,0 @@ -'use strict' -const { URL } = require('url') -const { Minipass } = require('minipass') -const Headers = require('./headers.js') -const { exportNodeCompatibleHeaders } = Headers -const Body = require('./body.js') -const { clone, extractContentType, getTotalBytes } = Body - -const version = require('../package.json').version -const defaultUserAgent = - `minipass-fetch/${version} (+https://github.com/isaacs/minipass-fetch)` - -const INTERNALS = Symbol('Request internals') - -const isRequest = input => - typeof input === 'object' && typeof input[INTERNALS] === 'object' - -const isAbortSignal = signal => { - const proto = ( - signal - && typeof signal === 'object' - && Object.getPrototypeOf(signal) - ) - return !!(proto && proto.constructor.name === 'AbortSignal') -} - -class Request extends Body { - constructor (input, init = {}) { - const parsedURL = isRequest(input) ? new URL(input.url) - : input && input.href ? new URL(input.href) - : new URL(`${input}`) - - if (isRequest(input)) { - init = { ...input[INTERNALS], ...init } - } else if (!input || typeof input === 'string') { - input = {} - } - - const method = (init.method || input.method || 'GET').toUpperCase() - const isGETHEAD = method === 'GET' || method === 'HEAD' - - if ((init.body !== null && init.body !== undefined || - isRequest(input) && input.body !== null) && isGETHEAD) { - throw new TypeError('Request with GET/HEAD method cannot have body') - } - - const inputBody = init.body !== null && init.body !== undefined ? init.body - : isRequest(input) && input.body !== null ? clone(input) - : null - - super(inputBody, { - timeout: init.timeout || input.timeout || 0, - size: init.size || input.size || 0, - }) - - const headers = new Headers(init.headers || input.headers || {}) - - if (inputBody !== null && inputBody !== undefined && - !headers.has('Content-Type')) { - const contentType = extractContentType(inputBody) - if (contentType) { - headers.append('Content-Type', contentType) - } - } - - const signal = 'signal' in init ? init.signal - : null - - if (signal !== null && signal !== undefined && !isAbortSignal(signal)) { - throw new TypeError('Expected signal must be an instanceof AbortSignal') - } - - // TLS specific options that are handled by node - const { - ca, - cert, - ciphers, - clientCertEngine, - crl, - dhparam, - ecdhCurve, - family, - honorCipherOrder, - key, - passphrase, - pfx, - rejectUnauthorized = process.env.NODE_TLS_REJECT_UNAUTHORIZED !== '0', - secureOptions, - secureProtocol, - servername, - sessionIdContext, - } = init - - this[INTERNALS] = { - method, - redirect: init.redirect || input.redirect || 'follow', - headers, - parsedURL, - signal, - ca, - cert, - ciphers, - clientCertEngine, - crl, - dhparam, - ecdhCurve, - family, - honorCipherOrder, - key, - passphrase, - pfx, - rejectUnauthorized, - secureOptions, - secureProtocol, - servername, - sessionIdContext, - } - - // node-fetch-only options - this.follow = init.follow !== undefined ? init.follow - : input.follow !== undefined ? input.follow - : 20 - this.compress = init.compress !== undefined ? init.compress - : input.compress !== undefined ? input.compress - : true - this.counter = init.counter || input.counter || 0 - this.agent = init.agent || input.agent - } - - get method () { - return this[INTERNALS].method - } - - get url () { - return this[INTERNALS].parsedURL.toString() - } - - get headers () { - return this[INTERNALS].headers - } - - get redirect () { - return this[INTERNALS].redirect - } - - get signal () { - return this[INTERNALS].signal - } - - clone () { - return new Request(this) - } - - get [Symbol.toStringTag] () { - return 'Request' - } - - static getNodeRequestOptions (request) { - const parsedURL = request[INTERNALS].parsedURL - const headers = new Headers(request[INTERNALS].headers) - - // fetch step 1.3 - if (!headers.has('Accept')) { - headers.set('Accept', '*/*') - } - - // Basic fetch - if (!/^https?:$/.test(parsedURL.protocol)) { - throw new TypeError('Only HTTP(S) protocols are supported') - } - - if (request.signal && - Minipass.isStream(request.body) && - typeof request.body.destroy !== 'function') { - throw new Error( - 'Cancellation of streamed requests with AbortSignal is not supported') - } - - // HTTP-network-or-cache fetch steps 2.4-2.7 - const contentLengthValue = - (request.body === null || request.body === undefined) && - /^(POST|PUT)$/i.test(request.method) ? '0' - : request.body !== null && request.body !== undefined - ? getTotalBytes(request) - : null - - if (contentLengthValue) { - headers.set('Content-Length', contentLengthValue + '') - } - - // HTTP-network-or-cache fetch step 2.11 - if (!headers.has('User-Agent')) { - headers.set('User-Agent', defaultUserAgent) - } - - // HTTP-network-or-cache fetch step 2.15 - if (request.compress && !headers.has('Accept-Encoding')) { - headers.set('Accept-Encoding', 'gzip,deflate') - } - - const agent = typeof request.agent === 'function' - ? request.agent(parsedURL) - : request.agent - - if (!headers.has('Connection') && !agent) { - headers.set('Connection', 'close') - } - - // TLS specific options that are handled by node - const { - ca, - cert, - ciphers, - clientCertEngine, - crl, - dhparam, - ecdhCurve, - family, - honorCipherOrder, - key, - passphrase, - pfx, - rejectUnauthorized, - secureOptions, - secureProtocol, - servername, - sessionIdContext, - } = request[INTERNALS] - - // HTTP-network fetch step 4.2 - // chunked encoding is handled by Node.js - - // we cannot spread parsedURL directly, so we have to read each property one-by-one - // and map them to the equivalent https?.request() method options - const urlProps = { - auth: parsedURL.username || parsedURL.password - ? `${parsedURL.username}:${parsedURL.password}` - : '', - host: parsedURL.host, - hostname: parsedURL.hostname, - path: `${parsedURL.pathname}${parsedURL.search}`, - port: parsedURL.port, - protocol: parsedURL.protocol, - } - - return { - ...urlProps, - method: request.method, - headers: exportNodeCompatibleHeaders(headers), - agent, - ca, - cert, - ciphers, - clientCertEngine, - crl, - dhparam, - ecdhCurve, - family, - honorCipherOrder, - key, - passphrase, - pfx, - rejectUnauthorized, - secureOptions, - secureProtocol, - servername, - sessionIdContext, - timeout: request.timeout, - } - } -} - -module.exports = Request - -Object.defineProperties(Request.prototype, { - method: { enumerable: true }, - url: { enumerable: true }, - headers: { enumerable: true }, - redirect: { enumerable: true }, - clone: { enumerable: true }, - signal: { enumerable: true }, -}) diff --git a/deps/npm/node_modules/node-gyp/node_modules/minipass-fetch/lib/response.js b/deps/npm/node_modules/node-gyp/node_modules/minipass-fetch/lib/response.js deleted file mode 100644 index 54cb52db3594a7..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/minipass-fetch/lib/response.js +++ /dev/null @@ -1,90 +0,0 @@ -'use strict' -const http = require('http') -const { STATUS_CODES } = http - -const Headers = require('./headers.js') -const Body = require('./body.js') -const { clone, extractContentType } = Body - -const INTERNALS = Symbol('Response internals') - -class Response extends Body { - constructor (body = null, opts = {}) { - super(body, opts) - - const status = opts.status || 200 - const headers = new Headers(opts.headers) - - if (body !== null && body !== undefined && !headers.has('Content-Type')) { - const contentType = extractContentType(body) - if (contentType) { - headers.append('Content-Type', contentType) - } - } - - this[INTERNALS] = { - url: opts.url, - status, - statusText: opts.statusText || STATUS_CODES[status], - headers, - counter: opts.counter, - trailer: Promise.resolve(opts.trailer || new Headers()), - } - } - - get trailer () { - return this[INTERNALS].trailer - } - - get url () { - return this[INTERNALS].url || '' - } - - get status () { - return this[INTERNALS].status - } - - get ok () { - return this[INTERNALS].status >= 200 && this[INTERNALS].status < 300 - } - - get redirected () { - return this[INTERNALS].counter > 0 - } - - get statusText () { - return this[INTERNALS].statusText - } - - get headers () { - return this[INTERNALS].headers - } - - clone () { - return new Response(clone(this), { - url: this.url, - status: this.status, - statusText: this.statusText, - headers: this.headers, - ok: this.ok, - redirected: this.redirected, - trailer: this.trailer, - }) - } - - get [Symbol.toStringTag] () { - return 'Response' - } -} - -module.exports = Response - -Object.defineProperties(Response.prototype, { - url: { enumerable: true }, - status: { enumerable: true }, - ok: { enumerable: true }, - redirected: { enumerable: true }, - statusText: { enumerable: true }, - headers: { enumerable: true }, - clone: { enumerable: true }, -}) diff --git a/deps/npm/node_modules/node-gyp/node_modules/minipass-fetch/package.json b/deps/npm/node_modules/node-gyp/node_modules/minipass-fetch/package.json deleted file mode 100644 index d491a7fba126d0..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/minipass-fetch/package.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "name": "minipass-fetch", - "version": "3.0.5", - "description": "An implementation of window.fetch in Node.js using Minipass streams", - "license": "MIT", - "main": "lib/index.js", - "scripts": { - "test:tls-fixtures": "./test/fixtures/tls/setup.sh", - "test": "tap", - "snap": "tap", - "lint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"", - "postlint": "template-oss-check", - "lintfix": "npm run lint -- --fix", - "posttest": "npm run lint", - "template-oss-apply": "template-oss-apply --force" - }, - "tap": { - "coverage-map": "map.js", - "check-coverage": true, - "nyc-arg": [ - "--exclude", - "tap-snapshots/**" - ] - }, - "devDependencies": { - "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.22.0", - "@ungap/url-search-params": "^0.2.2", - "abort-controller": "^3.0.0", - "abortcontroller-polyfill": "~1.7.3", - "encoding": "^0.1.13", - "form-data": "^4.0.0", - "nock": "^13.2.4", - "parted": "^0.1.1", - "string-to-arraybuffer": "^1.0.2", - "tap": "^16.0.0" - }, - "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/npm/minipass-fetch.git" - }, - "keywords": [ - "fetch", - "minipass", - "node-fetch", - "window.fetch" - ], - "files": [ - "bin/", - "lib/" - ], - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "author": "GitHub Inc.", - "templateOSS": { - "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.22.0", - "publish": "true" - } -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/minizlib/LICENSE b/deps/npm/node_modules/node-gyp/node_modules/minizlib/LICENSE new file mode 100644 index 00000000000000..49f7efe431c9ea --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/minizlib/LICENSE @@ -0,0 +1,26 @@ +Minizlib was created by Isaac Z. Schlueter. +It is a derivative work of the Node.js project. + +""" +Copyright (c) 2017-2023 Isaac Z. Schlueter and Contributors +Copyright (c) 2017-2023 Node.js contributors. All rights reserved. +Copyright (c) 2017-2023 Joyent, Inc. and other Node contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" diff --git a/deps/npm/node_modules/node-gyp/node_modules/minizlib/dist/commonjs/constants.js b/deps/npm/node_modules/node-gyp/node_modules/minizlib/dist/commonjs/constants.js new file mode 100644 index 00000000000000..dfc2c1957bfc99 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/minizlib/dist/commonjs/constants.js @@ -0,0 +1,123 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.constants = void 0; +// Update with any zlib constants that are added or changed in the future. +// Node v6 didn't export this, so we just hard code the version and rely +// on all the other hard-coded values from zlib v4736. When node v6 +// support drops, we can just export the realZlibConstants object. +const zlib_1 = __importDefault(require("zlib")); +/* c8 ignore start */ +const realZlibConstants = zlib_1.default.constants || { ZLIB_VERNUM: 4736 }; +/* c8 ignore stop */ +exports.constants = Object.freeze(Object.assign(Object.create(null), { + Z_NO_FLUSH: 0, + Z_PARTIAL_FLUSH: 1, + Z_SYNC_FLUSH: 2, + Z_FULL_FLUSH: 3, + Z_FINISH: 4, + Z_BLOCK: 5, + Z_OK: 0, + Z_STREAM_END: 1, + Z_NEED_DICT: 2, + Z_ERRNO: -1, + Z_STREAM_ERROR: -2, + Z_DATA_ERROR: -3, + Z_MEM_ERROR: -4, + Z_BUF_ERROR: -5, + Z_VERSION_ERROR: -6, + Z_NO_COMPRESSION: 0, + Z_BEST_SPEED: 1, + Z_BEST_COMPRESSION: 9, + Z_DEFAULT_COMPRESSION: -1, + Z_FILTERED: 1, + Z_HUFFMAN_ONLY: 2, + Z_RLE: 3, + Z_FIXED: 4, + Z_DEFAULT_STRATEGY: 0, + DEFLATE: 1, + INFLATE: 2, + GZIP: 3, + GUNZIP: 4, + DEFLATERAW: 5, + INFLATERAW: 6, + UNZIP: 7, + BROTLI_DECODE: 8, + BROTLI_ENCODE: 9, + Z_MIN_WINDOWBITS: 8, + Z_MAX_WINDOWBITS: 15, + Z_DEFAULT_WINDOWBITS: 15, + Z_MIN_CHUNK: 64, + Z_MAX_CHUNK: Infinity, + Z_DEFAULT_CHUNK: 16384, + Z_MIN_MEMLEVEL: 1, + Z_MAX_MEMLEVEL: 9, + Z_DEFAULT_MEMLEVEL: 8, + Z_MIN_LEVEL: -1, + Z_MAX_LEVEL: 9, + Z_DEFAULT_LEVEL: -1, + BROTLI_OPERATION_PROCESS: 0, + BROTLI_OPERATION_FLUSH: 1, + BROTLI_OPERATION_FINISH: 2, + BROTLI_OPERATION_EMIT_METADATA: 3, + BROTLI_MODE_GENERIC: 0, + BROTLI_MODE_TEXT: 1, + BROTLI_MODE_FONT: 2, + BROTLI_DEFAULT_MODE: 0, + BROTLI_MIN_QUALITY: 0, + BROTLI_MAX_QUALITY: 11, + BROTLI_DEFAULT_QUALITY: 11, + BROTLI_MIN_WINDOW_BITS: 10, + BROTLI_MAX_WINDOW_BITS: 24, + BROTLI_LARGE_MAX_WINDOW_BITS: 30, + BROTLI_DEFAULT_WINDOW: 22, + BROTLI_MIN_INPUT_BLOCK_BITS: 16, + BROTLI_MAX_INPUT_BLOCK_BITS: 24, + BROTLI_PARAM_MODE: 0, + BROTLI_PARAM_QUALITY: 1, + BROTLI_PARAM_LGWIN: 2, + BROTLI_PARAM_LGBLOCK: 3, + BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING: 4, + BROTLI_PARAM_SIZE_HINT: 5, + BROTLI_PARAM_LARGE_WINDOW: 6, + BROTLI_PARAM_NPOSTFIX: 7, + BROTLI_PARAM_NDIRECT: 8, + BROTLI_DECODER_RESULT_ERROR: 0, + BROTLI_DECODER_RESULT_SUCCESS: 1, + BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT: 2, + BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT: 3, + BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION: 0, + BROTLI_DECODER_PARAM_LARGE_WINDOW: 1, + BROTLI_DECODER_NO_ERROR: 0, + BROTLI_DECODER_SUCCESS: 1, + BROTLI_DECODER_NEEDS_MORE_INPUT: 2, + BROTLI_DECODER_NEEDS_MORE_OUTPUT: 3, + BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE: -1, + BROTLI_DECODER_ERROR_FORMAT_RESERVED: -2, + BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE: -3, + BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET: -4, + BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME: -5, + BROTLI_DECODER_ERROR_FORMAT_CL_SPACE: -6, + BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE: -7, + BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT: -8, + BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1: -9, + BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2: -10, + BROTLI_DECODER_ERROR_FORMAT_TRANSFORM: -11, + BROTLI_DECODER_ERROR_FORMAT_DICTIONARY: -12, + BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS: -13, + BROTLI_DECODER_ERROR_FORMAT_PADDING_1: -14, + BROTLI_DECODER_ERROR_FORMAT_PADDING_2: -15, + BROTLI_DECODER_ERROR_FORMAT_DISTANCE: -16, + BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET: -19, + BROTLI_DECODER_ERROR_INVALID_ARGUMENTS: -20, + BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES: -21, + BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS: -22, + BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP: -25, + BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1: -26, + BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2: -27, + BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES: -30, + BROTLI_DECODER_ERROR_UNREACHABLE: -31, +}, realZlibConstants)); +//# sourceMappingURL=constants.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/minizlib/dist/commonjs/index.js b/deps/npm/node_modules/node-gyp/node_modules/minizlib/dist/commonjs/index.js new file mode 100644 index 00000000000000..ad65eef0495076 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/minizlib/dist/commonjs/index.js @@ -0,0 +1,352 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BrotliDecompress = exports.BrotliCompress = exports.Brotli = exports.Unzip = exports.InflateRaw = exports.DeflateRaw = exports.Gunzip = exports.Gzip = exports.Inflate = exports.Deflate = exports.Zlib = exports.ZlibError = exports.constants = void 0; +const assert_1 = __importDefault(require("assert")); +const buffer_1 = require("buffer"); +const minipass_1 = require("minipass"); +const zlib_1 = __importDefault(require("zlib")); +const constants_js_1 = require("./constants.js"); +var constants_js_2 = require("./constants.js"); +Object.defineProperty(exports, "constants", { enumerable: true, get: function () { return constants_js_2.constants; } }); +const OriginalBufferConcat = buffer_1.Buffer.concat; +const _superWrite = Symbol('_superWrite'); +class ZlibError extends Error { + code; + errno; + constructor(err) { + super('zlib: ' + err.message); + this.code = err.code; + this.errno = err.errno; + /* c8 ignore next */ + if (!this.code) + this.code = 'ZLIB_ERROR'; + this.message = 'zlib: ' + err.message; + Error.captureStackTrace(this, this.constructor); + } + get name() { + return 'ZlibError'; + } +} +exports.ZlibError = ZlibError; +// the Zlib class they all inherit from +// This thing manages the queue of requests, and returns +// true or false if there is anything in the queue when +// you call the .write() method. +const _flushFlag = Symbol('flushFlag'); +class ZlibBase extends minipass_1.Minipass { + #sawError = false; + #ended = false; + #flushFlag; + #finishFlushFlag; + #fullFlushFlag; + #handle; + #onError; + get sawError() { + return this.#sawError; + } + get handle() { + return this.#handle; + } + /* c8 ignore start */ + get flushFlag() { + return this.#flushFlag; + } + /* c8 ignore stop */ + constructor(opts, mode) { + if (!opts || typeof opts !== 'object') + throw new TypeError('invalid options for ZlibBase constructor'); + //@ts-ignore + super(opts); + /* c8 ignore start */ + this.#flushFlag = opts.flush ?? 0; + this.#finishFlushFlag = opts.finishFlush ?? 0; + this.#fullFlushFlag = opts.fullFlushFlag ?? 0; + /* c8 ignore stop */ + // this will throw if any options are invalid for the class selected + try { + // @types/node doesn't know that it exports the classes, but they're there + //@ts-ignore + this.#handle = new zlib_1.default[mode](opts); + } + catch (er) { + // make sure that all errors get decorated properly + throw new ZlibError(er); + } + this.#onError = err => { + // no sense raising multiple errors, since we abort on the first one. + if (this.#sawError) + return; + this.#sawError = true; + // there is no way to cleanly recover. + // continuing only obscures problems. + this.close(); + this.emit('error', err); + }; + this.#handle?.on('error', er => this.#onError(new ZlibError(er))); + this.once('end', () => this.close); + } + close() { + if (this.#handle) { + this.#handle.close(); + this.#handle = undefined; + this.emit('close'); + } + } + reset() { + if (!this.#sawError) { + (0, assert_1.default)(this.#handle, 'zlib binding closed'); + //@ts-ignore + return this.#handle.reset?.(); + } + } + flush(flushFlag) { + if (this.ended) + return; + if (typeof flushFlag !== 'number') + flushFlag = this.#fullFlushFlag; + this.write(Object.assign(buffer_1.Buffer.alloc(0), { [_flushFlag]: flushFlag })); + } + end(chunk, encoding, cb) { + /* c8 ignore start */ + if (typeof chunk === 'function') { + cb = chunk; + encoding = undefined; + chunk = undefined; + } + if (typeof encoding === 'function') { + cb = encoding; + encoding = undefined; + } + /* c8 ignore stop */ + if (chunk) { + if (encoding) + this.write(chunk, encoding); + else + this.write(chunk); + } + this.flush(this.#finishFlushFlag); + this.#ended = true; + return super.end(cb); + } + get ended() { + return this.#ended; + } + // overridden in the gzip classes to do portable writes + [_superWrite](data) { + return super.write(data); + } + write(chunk, encoding, cb) { + // process the chunk using the sync process + // then super.write() all the outputted chunks + if (typeof encoding === 'function') + (cb = encoding), (encoding = 'utf8'); + if (typeof chunk === 'string') + chunk = buffer_1.Buffer.from(chunk, encoding); + if (this.#sawError) + return; + (0, assert_1.default)(this.#handle, 'zlib binding closed'); + // _processChunk tries to .close() the native handle after it's done, so we + // intercept that by temporarily making it a no-op. + // diving into the node:zlib internals a bit here + const nativeHandle = this.#handle + ._handle; + const originalNativeClose = nativeHandle.close; + nativeHandle.close = () => { }; + const originalClose = this.#handle.close; + this.#handle.close = () => { }; + // It also calls `Buffer.concat()` at the end, which may be convenient + // for some, but which we are not interested in as it slows us down. + buffer_1.Buffer.concat = args => args; + let result = undefined; + try { + const flushFlag = typeof chunk[_flushFlag] === 'number' + ? chunk[_flushFlag] + : this.#flushFlag; + result = this.#handle._processChunk(chunk, flushFlag); + // if we don't throw, reset it back how it was + buffer_1.Buffer.concat = OriginalBufferConcat; + } + catch (err) { + // or if we do, put Buffer.concat() back before we emit error + // Error events call into user code, which may call Buffer.concat() + buffer_1.Buffer.concat = OriginalBufferConcat; + this.#onError(new ZlibError(err)); + } + finally { + if (this.#handle) { + // Core zlib resets `_handle` to null after attempting to close the + // native handle. Our no-op handler prevented actual closure, but we + // need to restore the `._handle` property. + ; + this.#handle._handle = + nativeHandle; + nativeHandle.close = originalNativeClose; + this.#handle.close = originalClose; + // `_processChunk()` adds an 'error' listener. If we don't remove it + // after each call, these handlers start piling up. + this.#handle.removeAllListeners('error'); + // make sure OUR error listener is still attached tho + } + } + if (this.#handle) + this.#handle.on('error', er => this.#onError(new ZlibError(er))); + let writeReturn; + if (result) { + if (Array.isArray(result) && result.length > 0) { + const r = result[0]; + // The first buffer is always `handle._outBuffer`, which would be + // re-used for later invocations; so, we always have to copy that one. + writeReturn = this[_superWrite](buffer_1.Buffer.from(r)); + for (let i = 1; i < result.length; i++) { + writeReturn = this[_superWrite](result[i]); + } + } + else { + // either a single Buffer or an empty array + writeReturn = this[_superWrite](buffer_1.Buffer.from(result)); + } + } + if (cb) + cb(); + return writeReturn; + } +} +class Zlib extends ZlibBase { + #level; + #strategy; + constructor(opts, mode) { + opts = opts || {}; + opts.flush = opts.flush || constants_js_1.constants.Z_NO_FLUSH; + opts.finishFlush = opts.finishFlush || constants_js_1.constants.Z_FINISH; + opts.fullFlushFlag = constants_js_1.constants.Z_FULL_FLUSH; + super(opts, mode); + this.#level = opts.level; + this.#strategy = opts.strategy; + } + params(level, strategy) { + if (this.sawError) + return; + if (!this.handle) + throw new Error('cannot switch params when binding is closed'); + // no way to test this without also not supporting params at all + /* c8 ignore start */ + if (!this.handle.params) + throw new Error('not supported in this implementation'); + /* c8 ignore stop */ + if (this.#level !== level || this.#strategy !== strategy) { + this.flush(constants_js_1.constants.Z_SYNC_FLUSH); + (0, assert_1.default)(this.handle, 'zlib binding closed'); + // .params() calls .flush(), but the latter is always async in the + // core zlib. We override .flush() temporarily to intercept that and + // flush synchronously. + const origFlush = this.handle.flush; + this.handle.flush = (flushFlag, cb) => { + /* c8 ignore start */ + if (typeof flushFlag === 'function') { + cb = flushFlag; + flushFlag = this.flushFlag; + } + /* c8 ignore stop */ + this.flush(flushFlag); + cb?.(); + }; + try { + ; + this.handle.params(level, strategy); + } + finally { + this.handle.flush = origFlush; + } + /* c8 ignore start */ + if (this.handle) { + this.#level = level; + this.#strategy = strategy; + } + /* c8 ignore stop */ + } + } +} +exports.Zlib = Zlib; +// minimal 2-byte header +class Deflate extends Zlib { + constructor(opts) { + super(opts, 'Deflate'); + } +} +exports.Deflate = Deflate; +class Inflate extends Zlib { + constructor(opts) { + super(opts, 'Inflate'); + } +} +exports.Inflate = Inflate; +class Gzip extends Zlib { + #portable; + constructor(opts) { + super(opts, 'Gzip'); + this.#portable = opts && !!opts.portable; + } + [_superWrite](data) { + if (!this.#portable) + return super[_superWrite](data); + // we'll always get the header emitted in one first chunk + // overwrite the OS indicator byte with 0xFF + this.#portable = false; + data[9] = 255; + return super[_superWrite](data); + } +} +exports.Gzip = Gzip; +class Gunzip extends Zlib { + constructor(opts) { + super(opts, 'Gunzip'); + } +} +exports.Gunzip = Gunzip; +// raw - no header +class DeflateRaw extends Zlib { + constructor(opts) { + super(opts, 'DeflateRaw'); + } +} +exports.DeflateRaw = DeflateRaw; +class InflateRaw extends Zlib { + constructor(opts) { + super(opts, 'InflateRaw'); + } +} +exports.InflateRaw = InflateRaw; +// auto-detect header. +class Unzip extends Zlib { + constructor(opts) { + super(opts, 'Unzip'); + } +} +exports.Unzip = Unzip; +class Brotli extends ZlibBase { + constructor(opts, mode) { + opts = opts || {}; + opts.flush = opts.flush || constants_js_1.constants.BROTLI_OPERATION_PROCESS; + opts.finishFlush = + opts.finishFlush || constants_js_1.constants.BROTLI_OPERATION_FINISH; + opts.fullFlushFlag = constants_js_1.constants.BROTLI_OPERATION_FLUSH; + super(opts, mode); + } +} +exports.Brotli = Brotli; +class BrotliCompress extends Brotli { + constructor(opts) { + super(opts, 'BrotliCompress'); + } +} +exports.BrotliCompress = BrotliCompress; +class BrotliDecompress extends Brotli { + constructor(opts) { + super(opts, 'BrotliDecompress'); + } +} +exports.BrotliDecompress = BrotliDecompress; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/minizlib/dist/commonjs/package.json b/deps/npm/node_modules/node-gyp/node_modules/minizlib/dist/commonjs/package.json new file mode 100644 index 00000000000000..5bbefffbabee39 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/minizlib/dist/commonjs/package.json @@ -0,0 +1,3 @@ +{ + "type": "commonjs" +} diff --git a/deps/npm/node_modules/node-gyp/node_modules/minizlib/dist/esm/constants.js b/deps/npm/node_modules/node-gyp/node_modules/minizlib/dist/esm/constants.js new file mode 100644 index 00000000000000..7faf40be5068d0 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/minizlib/dist/esm/constants.js @@ -0,0 +1,117 @@ +// Update with any zlib constants that are added or changed in the future. +// Node v6 didn't export this, so we just hard code the version and rely +// on all the other hard-coded values from zlib v4736. When node v6 +// support drops, we can just export the realZlibConstants object. +import realZlib from 'zlib'; +/* c8 ignore start */ +const realZlibConstants = realZlib.constants || { ZLIB_VERNUM: 4736 }; +/* c8 ignore stop */ +export const constants = Object.freeze(Object.assign(Object.create(null), { + Z_NO_FLUSH: 0, + Z_PARTIAL_FLUSH: 1, + Z_SYNC_FLUSH: 2, + Z_FULL_FLUSH: 3, + Z_FINISH: 4, + Z_BLOCK: 5, + Z_OK: 0, + Z_STREAM_END: 1, + Z_NEED_DICT: 2, + Z_ERRNO: -1, + Z_STREAM_ERROR: -2, + Z_DATA_ERROR: -3, + Z_MEM_ERROR: -4, + Z_BUF_ERROR: -5, + Z_VERSION_ERROR: -6, + Z_NO_COMPRESSION: 0, + Z_BEST_SPEED: 1, + Z_BEST_COMPRESSION: 9, + Z_DEFAULT_COMPRESSION: -1, + Z_FILTERED: 1, + Z_HUFFMAN_ONLY: 2, + Z_RLE: 3, + Z_FIXED: 4, + Z_DEFAULT_STRATEGY: 0, + DEFLATE: 1, + INFLATE: 2, + GZIP: 3, + GUNZIP: 4, + DEFLATERAW: 5, + INFLATERAW: 6, + UNZIP: 7, + BROTLI_DECODE: 8, + BROTLI_ENCODE: 9, + Z_MIN_WINDOWBITS: 8, + Z_MAX_WINDOWBITS: 15, + Z_DEFAULT_WINDOWBITS: 15, + Z_MIN_CHUNK: 64, + Z_MAX_CHUNK: Infinity, + Z_DEFAULT_CHUNK: 16384, + Z_MIN_MEMLEVEL: 1, + Z_MAX_MEMLEVEL: 9, + Z_DEFAULT_MEMLEVEL: 8, + Z_MIN_LEVEL: -1, + Z_MAX_LEVEL: 9, + Z_DEFAULT_LEVEL: -1, + BROTLI_OPERATION_PROCESS: 0, + BROTLI_OPERATION_FLUSH: 1, + BROTLI_OPERATION_FINISH: 2, + BROTLI_OPERATION_EMIT_METADATA: 3, + BROTLI_MODE_GENERIC: 0, + BROTLI_MODE_TEXT: 1, + BROTLI_MODE_FONT: 2, + BROTLI_DEFAULT_MODE: 0, + BROTLI_MIN_QUALITY: 0, + BROTLI_MAX_QUALITY: 11, + BROTLI_DEFAULT_QUALITY: 11, + BROTLI_MIN_WINDOW_BITS: 10, + BROTLI_MAX_WINDOW_BITS: 24, + BROTLI_LARGE_MAX_WINDOW_BITS: 30, + BROTLI_DEFAULT_WINDOW: 22, + BROTLI_MIN_INPUT_BLOCK_BITS: 16, + BROTLI_MAX_INPUT_BLOCK_BITS: 24, + BROTLI_PARAM_MODE: 0, + BROTLI_PARAM_QUALITY: 1, + BROTLI_PARAM_LGWIN: 2, + BROTLI_PARAM_LGBLOCK: 3, + BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING: 4, + BROTLI_PARAM_SIZE_HINT: 5, + BROTLI_PARAM_LARGE_WINDOW: 6, + BROTLI_PARAM_NPOSTFIX: 7, + BROTLI_PARAM_NDIRECT: 8, + BROTLI_DECODER_RESULT_ERROR: 0, + BROTLI_DECODER_RESULT_SUCCESS: 1, + BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT: 2, + BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT: 3, + BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION: 0, + BROTLI_DECODER_PARAM_LARGE_WINDOW: 1, + BROTLI_DECODER_NO_ERROR: 0, + BROTLI_DECODER_SUCCESS: 1, + BROTLI_DECODER_NEEDS_MORE_INPUT: 2, + BROTLI_DECODER_NEEDS_MORE_OUTPUT: 3, + BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE: -1, + BROTLI_DECODER_ERROR_FORMAT_RESERVED: -2, + BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE: -3, + BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET: -4, + BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME: -5, + BROTLI_DECODER_ERROR_FORMAT_CL_SPACE: -6, + BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE: -7, + BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT: -8, + BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1: -9, + BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2: -10, + BROTLI_DECODER_ERROR_FORMAT_TRANSFORM: -11, + BROTLI_DECODER_ERROR_FORMAT_DICTIONARY: -12, + BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS: -13, + BROTLI_DECODER_ERROR_FORMAT_PADDING_1: -14, + BROTLI_DECODER_ERROR_FORMAT_PADDING_2: -15, + BROTLI_DECODER_ERROR_FORMAT_DISTANCE: -16, + BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET: -19, + BROTLI_DECODER_ERROR_INVALID_ARGUMENTS: -20, + BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES: -21, + BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS: -22, + BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP: -25, + BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1: -26, + BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2: -27, + BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES: -30, + BROTLI_DECODER_ERROR_UNREACHABLE: -31, +}, realZlibConstants)); +//# sourceMappingURL=constants.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/minizlib/dist/esm/index.js b/deps/npm/node_modules/node-gyp/node_modules/minizlib/dist/esm/index.js new file mode 100644 index 00000000000000..a6269b505f47cc --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/minizlib/dist/esm/index.js @@ -0,0 +1,333 @@ +import assert from 'assert'; +import { Buffer } from 'buffer'; +import { Minipass } from 'minipass'; +import realZlib from 'zlib'; +import { constants } from './constants.js'; +export { constants } from './constants.js'; +const OriginalBufferConcat = Buffer.concat; +const _superWrite = Symbol('_superWrite'); +export class ZlibError extends Error { + code; + errno; + constructor(err) { + super('zlib: ' + err.message); + this.code = err.code; + this.errno = err.errno; + /* c8 ignore next */ + if (!this.code) + this.code = 'ZLIB_ERROR'; + this.message = 'zlib: ' + err.message; + Error.captureStackTrace(this, this.constructor); + } + get name() { + return 'ZlibError'; + } +} +// the Zlib class they all inherit from +// This thing manages the queue of requests, and returns +// true or false if there is anything in the queue when +// you call the .write() method. +const _flushFlag = Symbol('flushFlag'); +class ZlibBase extends Minipass { + #sawError = false; + #ended = false; + #flushFlag; + #finishFlushFlag; + #fullFlushFlag; + #handle; + #onError; + get sawError() { + return this.#sawError; + } + get handle() { + return this.#handle; + } + /* c8 ignore start */ + get flushFlag() { + return this.#flushFlag; + } + /* c8 ignore stop */ + constructor(opts, mode) { + if (!opts || typeof opts !== 'object') + throw new TypeError('invalid options for ZlibBase constructor'); + //@ts-ignore + super(opts); + /* c8 ignore start */ + this.#flushFlag = opts.flush ?? 0; + this.#finishFlushFlag = opts.finishFlush ?? 0; + this.#fullFlushFlag = opts.fullFlushFlag ?? 0; + /* c8 ignore stop */ + // this will throw if any options are invalid for the class selected + try { + // @types/node doesn't know that it exports the classes, but they're there + //@ts-ignore + this.#handle = new realZlib[mode](opts); + } + catch (er) { + // make sure that all errors get decorated properly + throw new ZlibError(er); + } + this.#onError = err => { + // no sense raising multiple errors, since we abort on the first one. + if (this.#sawError) + return; + this.#sawError = true; + // there is no way to cleanly recover. + // continuing only obscures problems. + this.close(); + this.emit('error', err); + }; + this.#handle?.on('error', er => this.#onError(new ZlibError(er))); + this.once('end', () => this.close); + } + close() { + if (this.#handle) { + this.#handle.close(); + this.#handle = undefined; + this.emit('close'); + } + } + reset() { + if (!this.#sawError) { + assert(this.#handle, 'zlib binding closed'); + //@ts-ignore + return this.#handle.reset?.(); + } + } + flush(flushFlag) { + if (this.ended) + return; + if (typeof flushFlag !== 'number') + flushFlag = this.#fullFlushFlag; + this.write(Object.assign(Buffer.alloc(0), { [_flushFlag]: flushFlag })); + } + end(chunk, encoding, cb) { + /* c8 ignore start */ + if (typeof chunk === 'function') { + cb = chunk; + encoding = undefined; + chunk = undefined; + } + if (typeof encoding === 'function') { + cb = encoding; + encoding = undefined; + } + /* c8 ignore stop */ + if (chunk) { + if (encoding) + this.write(chunk, encoding); + else + this.write(chunk); + } + this.flush(this.#finishFlushFlag); + this.#ended = true; + return super.end(cb); + } + get ended() { + return this.#ended; + } + // overridden in the gzip classes to do portable writes + [_superWrite](data) { + return super.write(data); + } + write(chunk, encoding, cb) { + // process the chunk using the sync process + // then super.write() all the outputted chunks + if (typeof encoding === 'function') + (cb = encoding), (encoding = 'utf8'); + if (typeof chunk === 'string') + chunk = Buffer.from(chunk, encoding); + if (this.#sawError) + return; + assert(this.#handle, 'zlib binding closed'); + // _processChunk tries to .close() the native handle after it's done, so we + // intercept that by temporarily making it a no-op. + // diving into the node:zlib internals a bit here + const nativeHandle = this.#handle + ._handle; + const originalNativeClose = nativeHandle.close; + nativeHandle.close = () => { }; + const originalClose = this.#handle.close; + this.#handle.close = () => { }; + // It also calls `Buffer.concat()` at the end, which may be convenient + // for some, but which we are not interested in as it slows us down. + Buffer.concat = args => args; + let result = undefined; + try { + const flushFlag = typeof chunk[_flushFlag] === 'number' + ? chunk[_flushFlag] + : this.#flushFlag; + result = this.#handle._processChunk(chunk, flushFlag); + // if we don't throw, reset it back how it was + Buffer.concat = OriginalBufferConcat; + } + catch (err) { + // or if we do, put Buffer.concat() back before we emit error + // Error events call into user code, which may call Buffer.concat() + Buffer.concat = OriginalBufferConcat; + this.#onError(new ZlibError(err)); + } + finally { + if (this.#handle) { + // Core zlib resets `_handle` to null after attempting to close the + // native handle. Our no-op handler prevented actual closure, but we + // need to restore the `._handle` property. + ; + this.#handle._handle = + nativeHandle; + nativeHandle.close = originalNativeClose; + this.#handle.close = originalClose; + // `_processChunk()` adds an 'error' listener. If we don't remove it + // after each call, these handlers start piling up. + this.#handle.removeAllListeners('error'); + // make sure OUR error listener is still attached tho + } + } + if (this.#handle) + this.#handle.on('error', er => this.#onError(new ZlibError(er))); + let writeReturn; + if (result) { + if (Array.isArray(result) && result.length > 0) { + const r = result[0]; + // The first buffer is always `handle._outBuffer`, which would be + // re-used for later invocations; so, we always have to copy that one. + writeReturn = this[_superWrite](Buffer.from(r)); + for (let i = 1; i < result.length; i++) { + writeReturn = this[_superWrite](result[i]); + } + } + else { + // either a single Buffer or an empty array + writeReturn = this[_superWrite](Buffer.from(result)); + } + } + if (cb) + cb(); + return writeReturn; + } +} +export class Zlib extends ZlibBase { + #level; + #strategy; + constructor(opts, mode) { + opts = opts || {}; + opts.flush = opts.flush || constants.Z_NO_FLUSH; + opts.finishFlush = opts.finishFlush || constants.Z_FINISH; + opts.fullFlushFlag = constants.Z_FULL_FLUSH; + super(opts, mode); + this.#level = opts.level; + this.#strategy = opts.strategy; + } + params(level, strategy) { + if (this.sawError) + return; + if (!this.handle) + throw new Error('cannot switch params when binding is closed'); + // no way to test this without also not supporting params at all + /* c8 ignore start */ + if (!this.handle.params) + throw new Error('not supported in this implementation'); + /* c8 ignore stop */ + if (this.#level !== level || this.#strategy !== strategy) { + this.flush(constants.Z_SYNC_FLUSH); + assert(this.handle, 'zlib binding closed'); + // .params() calls .flush(), but the latter is always async in the + // core zlib. We override .flush() temporarily to intercept that and + // flush synchronously. + const origFlush = this.handle.flush; + this.handle.flush = (flushFlag, cb) => { + /* c8 ignore start */ + if (typeof flushFlag === 'function') { + cb = flushFlag; + flushFlag = this.flushFlag; + } + /* c8 ignore stop */ + this.flush(flushFlag); + cb?.(); + }; + try { + ; + this.handle.params(level, strategy); + } + finally { + this.handle.flush = origFlush; + } + /* c8 ignore start */ + if (this.handle) { + this.#level = level; + this.#strategy = strategy; + } + /* c8 ignore stop */ + } + } +} +// minimal 2-byte header +export class Deflate extends Zlib { + constructor(opts) { + super(opts, 'Deflate'); + } +} +export class Inflate extends Zlib { + constructor(opts) { + super(opts, 'Inflate'); + } +} +export class Gzip extends Zlib { + #portable; + constructor(opts) { + super(opts, 'Gzip'); + this.#portable = opts && !!opts.portable; + } + [_superWrite](data) { + if (!this.#portable) + return super[_superWrite](data); + // we'll always get the header emitted in one first chunk + // overwrite the OS indicator byte with 0xFF + this.#portable = false; + data[9] = 255; + return super[_superWrite](data); + } +} +export class Gunzip extends Zlib { + constructor(opts) { + super(opts, 'Gunzip'); + } +} +// raw - no header +export class DeflateRaw extends Zlib { + constructor(opts) { + super(opts, 'DeflateRaw'); + } +} +export class InflateRaw extends Zlib { + constructor(opts) { + super(opts, 'InflateRaw'); + } +} +// auto-detect header. +export class Unzip extends Zlib { + constructor(opts) { + super(opts, 'Unzip'); + } +} +export class Brotli extends ZlibBase { + constructor(opts, mode) { + opts = opts || {}; + opts.flush = opts.flush || constants.BROTLI_OPERATION_PROCESS; + opts.finishFlush = + opts.finishFlush || constants.BROTLI_OPERATION_FINISH; + opts.fullFlushFlag = constants.BROTLI_OPERATION_FLUSH; + super(opts, mode); + } +} +export class BrotliCompress extends Brotli { + constructor(opts) { + super(opts, 'BrotliCompress'); + } +} +export class BrotliDecompress extends Brotli { + constructor(opts) { + super(opts, 'BrotliDecompress'); + } +} +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/minizlib/dist/esm/package.json b/deps/npm/node_modules/node-gyp/node_modules/minizlib/dist/esm/package.json new file mode 100644 index 00000000000000..3dbc1ca591c055 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/minizlib/dist/esm/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/deps/npm/node_modules/node-gyp/node_modules/minizlib/package.json b/deps/npm/node_modules/node-gyp/node_modules/minizlib/package.json new file mode 100644 index 00000000000000..e94623ff43d353 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/minizlib/package.json @@ -0,0 +1,81 @@ +{ + "name": "minizlib", + "version": "3.0.1", + "description": "A small fast zlib stream built on [minipass](http://npm.im/minipass) and Node.js's zlib binding.", + "main": "./dist/commonjs/index.js", + "dependencies": { + "minipass": "^7.0.4", + "rimraf": "^5.0.5" + }, + "scripts": { + "prepare": "tshy", + "pretest": "npm run prepare", + "test": "tap", + "preversion": "npm test", + "postversion": "npm publish", + "prepublishOnly": "git push origin --follow-tags", + "format": "prettier --write . --loglevel warn", + "typedoc": "typedoc --tsconfig .tshy/esm.json ./src/*.ts" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/isaacs/minizlib.git" + }, + "keywords": [ + "zlib", + "gzip", + "gunzip", + "deflate", + "inflate", + "compression", + "zip", + "unzip" + ], + "author": "Isaac Z. Schlueter (http://blog.izs.me/)", + "license": "MIT", + "devDependencies": { + "@types/node": "^20.11.29", + "mkdirp": "^3.0.1", + "tap": "^18.7.1", + "tshy": "^1.12.0", + "typedoc": "^0.25.12" + }, + "files": [ + "dist" + ], + "engines": { + "node": ">= 18" + }, + "tshy": { + "exports": { + "./package.json": "./package.json", + ".": "./src/index.ts" + } + }, + "exports": { + "./package.json": "./package.json", + ".": { + "import": { + "types": "./dist/esm/index.d.ts", + "default": "./dist/esm/index.js" + }, + "require": { + "types": "./dist/commonjs/index.d.ts", + "default": "./dist/commonjs/index.js" + } + } + }, + "types": "./dist/commonjs/index.d.ts", + "type": "module", + "prettier": { + "semi": false, + "printWidth": 75, + "tabWidth": 2, + "useTabs": false, + "singleQuote": true, + "jsxSingleQuote": false, + "bracketSameLine": true, + "arrowParens": "avoid", + "endOfLine": "lf" + } +} diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/LICENSE b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/LICENSE new file mode 100644 index 00000000000000..0a034db7a73b5d --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/LICENSE @@ -0,0 +1,21 @@ +Copyright (c) 2011-2023 James Halliday (mail@substack.net) and Isaac Z. Schlueter (i@izs.me) + +This project is free software released under the MIT license: + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/package.json b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/package.json new file mode 100644 index 00000000000000..9d04a66e16cd93 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/package.json @@ -0,0 +1,91 @@ +{ + "name": "mkdirp", + "description": "Recursively mkdir, like `mkdir -p`", + "version": "3.0.1", + "keywords": [ + "mkdir", + "directory", + "make dir", + "make", + "dir", + "recursive", + "native" + ], + "bin": "./dist/cjs/src/bin.js", + "main": "./dist/cjs/src/index.js", + "module": "./dist/mjs/index.js", + "types": "./dist/mjs/index.d.ts", + "exports": { + ".": { + "import": { + "types": "./dist/mjs/index.d.ts", + "default": "./dist/mjs/index.js" + }, + "require": { + "types": "./dist/cjs/src/index.d.ts", + "default": "./dist/cjs/src/index.js" + } + } + }, + "files": [ + "dist" + ], + "scripts": { + "preversion": "npm test", + "postversion": "npm publish", + "prepublishOnly": "git push origin --follow-tags", + "preprepare": "rm -rf dist", + "prepare": "tsc -p tsconfig.json && tsc -p tsconfig-esm.json", + "postprepare": "bash fixup.sh", + "pretest": "npm run prepare", + "presnap": "npm run prepare", + "test": "c8 tap", + "snap": "c8 tap", + "format": "prettier --write . --loglevel warn", + "benchmark": "node benchmark/index.js", + "typedoc": "typedoc --tsconfig tsconfig-esm.json ./src/*.ts" + }, + "prettier": { + "semi": false, + "printWidth": 80, + "tabWidth": 2, + "useTabs": false, + "singleQuote": true, + "jsxSingleQuote": false, + "bracketSameLine": true, + "arrowParens": "avoid", + "endOfLine": "lf" + }, + "devDependencies": { + "@types/brace-expansion": "^1.1.0", + "@types/node": "^18.11.9", + "@types/tap": "^15.0.7", + "c8": "^7.12.0", + "eslint-config-prettier": "^8.6.0", + "prettier": "^2.8.2", + "tap": "^16.3.3", + "ts-node": "^10.9.1", + "typedoc": "^0.23.21", + "typescript": "^4.9.3" + }, + "tap": { + "coverage": false, + "node-arg": [ + "--no-warnings", + "--loader", + "ts-node/esm" + ], + "ts": false + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "repository": { + "type": "git", + "url": "https://github.com/isaacs/node-mkdirp.git" + }, + "license": "MIT", + "engines": { + "node": ">=10" + } +} diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/bin.d.ts b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/bin.d.ts new file mode 100644 index 00000000000000..34e005228653c8 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/bin.d.ts @@ -0,0 +1,3 @@ +#!/usr/bin/env node +export {}; +//# sourceMappingURL=bin.d.ts.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/bin.d.ts.map b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/bin.d.ts.map new file mode 100644 index 00000000000000..c10c656ec75109 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/bin.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../../../src/bin.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/bin.js b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/bin.js new file mode 100755 index 00000000000000..757aae1fd96cb2 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/bin.js @@ -0,0 +1,80 @@ +#!/usr/bin/env node +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const package_json_1 = require("../package.json"); +const usage = () => ` +usage: mkdirp [DIR1,DIR2..] {OPTIONS} + + Create each supplied directory including any necessary parent directories + that don't yet exist. + + If the directory already exists, do nothing. + +OPTIONS are: + + -m If a directory needs to be created, set the mode as an octal + --mode= permission string. + + -v --version Print the mkdirp version number + + -h --help Print this helpful banner + + -p --print Print the first directories created for each path provided + + --manual Use manual implementation, even if native is available +`; +const dirs = []; +const opts = {}; +let doPrint = false; +let dashdash = false; +let manual = false; +for (const arg of process.argv.slice(2)) { + if (dashdash) + dirs.push(arg); + else if (arg === '--') + dashdash = true; + else if (arg === '--manual') + manual = true; + else if (/^-h/.test(arg) || /^--help/.test(arg)) { + console.log(usage()); + process.exit(0); + } + else if (arg === '-v' || arg === '--version') { + console.log(package_json_1.version); + process.exit(0); + } + else if (arg === '-p' || arg === '--print') { + doPrint = true; + } + else if (/^-m/.test(arg) || /^--mode=/.test(arg)) { + // these don't get covered in CI, but work locally + // weird because the tests below show as passing in the output. + /* c8 ignore start */ + const mode = parseInt(arg.replace(/^(-m|--mode=)/, ''), 8); + if (isNaN(mode)) { + console.error(`invalid mode argument: ${arg}\nMust be an octal number.`); + process.exit(1); + } + /* c8 ignore stop */ + opts.mode = mode; + } + else + dirs.push(arg); +} +const index_js_1 = require("./index.js"); +const impl = manual ? index_js_1.mkdirp.manual : index_js_1.mkdirp; +if (dirs.length === 0) { + console.error(usage()); +} +// these don't get covered in CI, but work locally +/* c8 ignore start */ +Promise.all(dirs.map(dir => impl(dir, opts))) + .then(made => (doPrint ? made.forEach(m => m && console.log(m)) : null)) + .catch(er => { + console.error(er.message); + if (er.code) + console.error(' code: ' + er.code); + process.exit(1); +}); +/* c8 ignore stop */ +//# sourceMappingURL=bin.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/bin.js.map b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/bin.js.map new file mode 100644 index 00000000000000..d99295301b5fa7 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/bin.js.map @@ -0,0 +1 @@ +{"version":3,"file":"bin.js","sourceRoot":"","sources":["../../../src/bin.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\n\nimport { version } from '../package.json'\nimport { MkdirpOptions } from './opts-arg.js'\n\nconst usage = () => `\nusage: mkdirp [DIR1,DIR2..] {OPTIONS}\n\n Create each supplied directory including any necessary parent directories\n that don't yet exist.\n\n If the directory already exists, do nothing.\n\nOPTIONS are:\n\n -m If a directory needs to be created, set the mode as an octal\n --mode= permission string.\n\n -v --version Print the mkdirp version number\n\n -h --help Print this helpful banner\n\n -p --print Print the first directories created for each path provided\n\n --manual Use manual implementation, even if native is available\n`\n\nconst dirs: string[] = []\nconst opts: MkdirpOptions = {}\nlet doPrint: boolean = false\nlet dashdash = false\nlet manual = false\nfor (const arg of process.argv.slice(2)) {\n if (dashdash) dirs.push(arg)\n else if (arg === '--') dashdash = true\n else if (arg === '--manual') manual = true\n else if (/^-h/.test(arg) || /^--help/.test(arg)) {\n console.log(usage())\n process.exit(0)\n } else if (arg === '-v' || arg === '--version') {\n console.log(version)\n process.exit(0)\n } else if (arg === '-p' || arg === '--print') {\n doPrint = true\n } else if (/^-m/.test(arg) || /^--mode=/.test(arg)) {\n // these don't get covered in CI, but work locally\n // weird because the tests below show as passing in the output.\n /* c8 ignore start */\n const mode = parseInt(arg.replace(/^(-m|--mode=)/, ''), 8)\n if (isNaN(mode)) {\n console.error(`invalid mode argument: ${arg}\\nMust be an octal number.`)\n process.exit(1)\n }\n /* c8 ignore stop */\n opts.mode = mode\n } else dirs.push(arg)\n}\n\nimport { mkdirp } from './index.js'\nconst impl = manual ? mkdirp.manual : mkdirp\nif (dirs.length === 0) {\n console.error(usage())\n}\n\n// these don't get covered in CI, but work locally\n/* c8 ignore start */\nPromise.all(dirs.map(dir => impl(dir, opts)))\n .then(made => (doPrint ? made.forEach(m => m && console.log(m)) : null))\n .catch(er => {\n console.error(er.message)\n if (er.code) console.error(' code: ' + er.code)\n process.exit(1)\n })\n/* c8 ignore stop */\n"]} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/find-made.d.ts b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/find-made.d.ts new file mode 100644 index 00000000000000..e47794b3bb72a3 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/find-made.d.ts @@ -0,0 +1,4 @@ +import { MkdirpOptionsResolved } from './opts-arg.js'; +export declare const findMade: (opts: MkdirpOptionsResolved, parent: string, path?: string) => Promise; +export declare const findMadeSync: (opts: MkdirpOptionsResolved, parent: string, path?: string) => undefined | string; +//# sourceMappingURL=find-made.d.ts.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/find-made.d.ts.map b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/find-made.d.ts.map new file mode 100644 index 00000000000000..00d5d1a4dbefdf --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/find-made.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"find-made.d.ts","sourceRoot":"","sources":["../../../src/find-made.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAErD,eAAO,MAAM,QAAQ,SACb,qBAAqB,UACnB,MAAM,SACP,MAAM,KACZ,QAAQ,SAAS,GAAG,MAAM,CAe5B,CAAA;AAED,eAAO,MAAM,YAAY,SACjB,qBAAqB,UACnB,MAAM,SACP,MAAM,KACZ,SAAS,GAAG,MAad,CAAA"} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/find-made.js b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/find-made.js new file mode 100644 index 00000000000000..e831ef27cadc1d --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/find-made.js @@ -0,0 +1,35 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.findMadeSync = exports.findMade = void 0; +const path_1 = require("path"); +const findMade = async (opts, parent, path) => { + // we never want the 'made' return value to be a root directory + if (path === parent) { + return; + } + return opts.statAsync(parent).then(st => (st.isDirectory() ? path : undefined), // will fail later + // will fail later + er => { + const fer = er; + return fer && fer.code === 'ENOENT' + ? (0, exports.findMade)(opts, (0, path_1.dirname)(parent), parent) + : undefined; + }); +}; +exports.findMade = findMade; +const findMadeSync = (opts, parent, path) => { + if (path === parent) { + return undefined; + } + try { + return opts.statSync(parent).isDirectory() ? path : undefined; + } + catch (er) { + const fer = er; + return fer && fer.code === 'ENOENT' + ? (0, exports.findMadeSync)(opts, (0, path_1.dirname)(parent), parent) + : undefined; + } +}; +exports.findMadeSync = findMadeSync; +//# sourceMappingURL=find-made.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/find-made.js.map b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/find-made.js.map new file mode 100644 index 00000000000000..30a0d66398878d --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/find-made.js.map @@ -0,0 +1 @@ +{"version":3,"file":"find-made.js","sourceRoot":"","sources":["../../../src/find-made.ts"],"names":[],"mappings":";;;AAAA,+BAA8B;AAGvB,MAAM,QAAQ,GAAG,KAAK,EAC3B,IAA2B,EAC3B,MAAc,EACd,IAAa,EACgB,EAAE;IAC/B,+DAA+D;IAC/D,IAAI,IAAI,KAAK,MAAM,EAAE;QACnB,OAAM;KACP;IAED,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAChC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,kBAAkB;IAC/D,AAD6C,kBAAkB;IAC/D,EAAE,CAAC,EAAE;QACH,MAAM,GAAG,GAAG,EAA2B,CAAA;QACvC,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;YACjC,CAAC,CAAC,IAAA,gBAAQ,EAAC,IAAI,EAAE,IAAA,cAAO,EAAC,MAAM,CAAC,EAAE,MAAM,CAAC;YACzC,CAAC,CAAC,SAAS,CAAA;IACf,CAAC,CACF,CAAA;AACH,CAAC,CAAA;AAnBY,QAAA,QAAQ,YAmBpB;AAEM,MAAM,YAAY,GAAG,CAC1B,IAA2B,EAC3B,MAAc,EACd,IAAa,EACO,EAAE;IACtB,IAAI,IAAI,KAAK,MAAM,EAAE;QACnB,OAAO,SAAS,CAAA;KACjB;IAED,IAAI;QACF,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAA;KAC9D;IAAC,OAAO,EAAE,EAAE;QACX,MAAM,GAAG,GAAG,EAA2B,CAAA;QACvC,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;YACjC,CAAC,CAAC,IAAA,oBAAY,EAAC,IAAI,EAAE,IAAA,cAAO,EAAC,MAAM,CAAC,EAAE,MAAM,CAAC;YAC7C,CAAC,CAAC,SAAS,CAAA;KACd;AACH,CAAC,CAAA;AAjBY,QAAA,YAAY,gBAiBxB","sourcesContent":["import { dirname } from 'path'\nimport { MkdirpOptionsResolved } from './opts-arg.js'\n\nexport const findMade = async (\n opts: MkdirpOptionsResolved,\n parent: string,\n path?: string\n): Promise => {\n // we never want the 'made' return value to be a root directory\n if (path === parent) {\n return\n }\n\n return opts.statAsync(parent).then(\n st => (st.isDirectory() ? path : undefined), // will fail later\n er => {\n const fer = er as NodeJS.ErrnoException\n return fer && fer.code === 'ENOENT'\n ? findMade(opts, dirname(parent), parent)\n : undefined\n }\n )\n}\n\nexport const findMadeSync = (\n opts: MkdirpOptionsResolved,\n parent: string,\n path?: string\n): undefined | string => {\n if (path === parent) {\n return undefined\n }\n\n try {\n return opts.statSync(parent).isDirectory() ? path : undefined\n } catch (er) {\n const fer = er as NodeJS.ErrnoException\n return fer && fer.code === 'ENOENT'\n ? findMadeSync(opts, dirname(parent), parent)\n : undefined\n }\n}\n"]} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/index.d.ts b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/index.d.ts new file mode 100644 index 00000000000000..fc9e43b3a45de1 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/index.d.ts @@ -0,0 +1,39 @@ +import { MkdirpOptions } from './opts-arg.js'; +export { mkdirpManual, mkdirpManualSync } from './mkdirp-manual.js'; +export { mkdirpNative, mkdirpNativeSync } from './mkdirp-native.js'; +export { useNative, useNativeSync } from './use-native.js'; +export declare const mkdirpSync: (path: string, opts?: MkdirpOptions) => string | void; +export declare const sync: (path: string, opts?: MkdirpOptions) => string | void; +export declare const manual: ((path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => Promise) & { + sync: (path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => string | void | undefined; +}; +export declare const manualSync: (path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => string | void | undefined; +export declare const native: ((path: string, options?: MkdirpOptions | undefined) => Promise) & { + sync: (path: string, options?: MkdirpOptions | undefined) => string | void | undefined; +}; +export declare const nativeSync: (path: string, options?: MkdirpOptions | undefined) => string | void | undefined; +export declare const mkdirp: ((path: string, opts?: MkdirpOptions) => Promise) & { + mkdirpSync: (path: string, opts?: MkdirpOptions) => string | void; + mkdirpNative: ((path: string, options?: MkdirpOptions | undefined) => Promise) & { + sync: (path: string, options?: MkdirpOptions | undefined) => string | void | undefined; + }; + mkdirpNativeSync: (path: string, options?: MkdirpOptions | undefined) => string | void | undefined; + mkdirpManual: ((path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => Promise) & { + sync: (path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => string | void | undefined; + }; + mkdirpManualSync: (path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => string | void | undefined; + sync: (path: string, opts?: MkdirpOptions) => string | void; + native: ((path: string, options?: MkdirpOptions | undefined) => Promise) & { + sync: (path: string, options?: MkdirpOptions | undefined) => string | void | undefined; + }; + nativeSync: (path: string, options?: MkdirpOptions | undefined) => string | void | undefined; + manual: ((path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => Promise) & { + sync: (path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => string | void | undefined; + }; + manualSync: (path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => string | void | undefined; + useNative: ((opts?: MkdirpOptions | undefined) => boolean) & { + sync: (opts?: MkdirpOptions | undefined) => boolean; + }; + useNativeSync: (opts?: MkdirpOptions | undefined) => boolean; +}; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/index.d.ts.map b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/index.d.ts.map new file mode 100644 index 00000000000000..0e915bbc9a0c7a --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAW,MAAM,eAAe,CAAA;AAItD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACnE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACnE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAG1D,eAAO,MAAM,UAAU,SAAU,MAAM,SAAS,aAAa,kBAM5D,CAAA;AAED,eAAO,MAAM,IAAI,SARgB,MAAM,SAAS,aAAa,kBAQ/B,CAAA;AAC9B,eAAO,MAAM,MAAM;;CAAe,CAAA;AAClC,eAAO,MAAM,UAAU,oHAAmB,CAAA;AAC1C,eAAO,MAAM,MAAM;;CAAe,CAAA;AAClC,eAAO,MAAM,UAAU,kFAAmB,CAAA;AAC1C,eAAO,MAAM,MAAM,UACJ,MAAM,SAAS,aAAa;uBAdV,MAAM,SAAS,aAAa;;;;;;;;;iBAA5B,MAAM,SAAS,aAAa;;;;;;;;;;;;;CAoC5D,CAAA"} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/index.js b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/index.js new file mode 100644 index 00000000000000..ab9dc62cddda36 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/index.js @@ -0,0 +1,53 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.mkdirp = exports.nativeSync = exports.native = exports.manualSync = exports.manual = exports.sync = exports.mkdirpSync = exports.useNativeSync = exports.useNative = exports.mkdirpNativeSync = exports.mkdirpNative = exports.mkdirpManualSync = exports.mkdirpManual = void 0; +const mkdirp_manual_js_1 = require("./mkdirp-manual.js"); +const mkdirp_native_js_1 = require("./mkdirp-native.js"); +const opts_arg_js_1 = require("./opts-arg.js"); +const path_arg_js_1 = require("./path-arg.js"); +const use_native_js_1 = require("./use-native.js"); +/* c8 ignore start */ +var mkdirp_manual_js_2 = require("./mkdirp-manual.js"); +Object.defineProperty(exports, "mkdirpManual", { enumerable: true, get: function () { return mkdirp_manual_js_2.mkdirpManual; } }); +Object.defineProperty(exports, "mkdirpManualSync", { enumerable: true, get: function () { return mkdirp_manual_js_2.mkdirpManualSync; } }); +var mkdirp_native_js_2 = require("./mkdirp-native.js"); +Object.defineProperty(exports, "mkdirpNative", { enumerable: true, get: function () { return mkdirp_native_js_2.mkdirpNative; } }); +Object.defineProperty(exports, "mkdirpNativeSync", { enumerable: true, get: function () { return mkdirp_native_js_2.mkdirpNativeSync; } }); +var use_native_js_2 = require("./use-native.js"); +Object.defineProperty(exports, "useNative", { enumerable: true, get: function () { return use_native_js_2.useNative; } }); +Object.defineProperty(exports, "useNativeSync", { enumerable: true, get: function () { return use_native_js_2.useNativeSync; } }); +/* c8 ignore stop */ +const mkdirpSync = (path, opts) => { + path = (0, path_arg_js_1.pathArg)(path); + const resolved = (0, opts_arg_js_1.optsArg)(opts); + return (0, use_native_js_1.useNativeSync)(resolved) + ? (0, mkdirp_native_js_1.mkdirpNativeSync)(path, resolved) + : (0, mkdirp_manual_js_1.mkdirpManualSync)(path, resolved); +}; +exports.mkdirpSync = mkdirpSync; +exports.sync = exports.mkdirpSync; +exports.manual = mkdirp_manual_js_1.mkdirpManual; +exports.manualSync = mkdirp_manual_js_1.mkdirpManualSync; +exports.native = mkdirp_native_js_1.mkdirpNative; +exports.nativeSync = mkdirp_native_js_1.mkdirpNativeSync; +exports.mkdirp = Object.assign(async (path, opts) => { + path = (0, path_arg_js_1.pathArg)(path); + const resolved = (0, opts_arg_js_1.optsArg)(opts); + return (0, use_native_js_1.useNative)(resolved) + ? (0, mkdirp_native_js_1.mkdirpNative)(path, resolved) + : (0, mkdirp_manual_js_1.mkdirpManual)(path, resolved); +}, { + mkdirpSync: exports.mkdirpSync, + mkdirpNative: mkdirp_native_js_1.mkdirpNative, + mkdirpNativeSync: mkdirp_native_js_1.mkdirpNativeSync, + mkdirpManual: mkdirp_manual_js_1.mkdirpManual, + mkdirpManualSync: mkdirp_manual_js_1.mkdirpManualSync, + sync: exports.mkdirpSync, + native: mkdirp_native_js_1.mkdirpNative, + nativeSync: mkdirp_native_js_1.mkdirpNativeSync, + manual: mkdirp_manual_js_1.mkdirpManual, + manualSync: mkdirp_manual_js_1.mkdirpManualSync, + useNative: use_native_js_1.useNative, + useNativeSync: use_native_js_1.useNativeSync, +}); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/index.js.map b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/index.js.map new file mode 100644 index 00000000000000..fdb572677a98ef --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":";;;AAAA,yDAAmE;AACnE,yDAAmE;AACnE,+CAAsD;AACtD,+CAAuC;AACvC,mDAA0D;AAC1D,qBAAqB;AACrB,uDAAmE;AAA1D,gHAAA,YAAY,OAAA;AAAE,oHAAA,gBAAgB,OAAA;AACvC,uDAAmE;AAA1D,gHAAA,YAAY,OAAA;AAAE,oHAAA,gBAAgB,OAAA;AACvC,iDAA0D;AAAjD,0GAAA,SAAS,OAAA;AAAE,8GAAA,aAAa,OAAA;AACjC,oBAAoB;AAEb,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,IAAoB,EAAE,EAAE;IAC/D,IAAI,GAAG,IAAA,qBAAO,EAAC,IAAI,CAAC,CAAA;IACpB,MAAM,QAAQ,GAAG,IAAA,qBAAO,EAAC,IAAI,CAAC,CAAA;IAC9B,OAAO,IAAA,6BAAa,EAAC,QAAQ,CAAC;QAC5B,CAAC,CAAC,IAAA,mCAAgB,EAAC,IAAI,EAAE,QAAQ,CAAC;QAClC,CAAC,CAAC,IAAA,mCAAgB,EAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;AACtC,CAAC,CAAA;AANY,QAAA,UAAU,cAMtB;AAEY,QAAA,IAAI,GAAG,kBAAU,CAAA;AACjB,QAAA,MAAM,GAAG,+BAAY,CAAA;AACrB,QAAA,UAAU,GAAG,mCAAgB,CAAA;AAC7B,QAAA,MAAM,GAAG,+BAAY,CAAA;AACrB,QAAA,UAAU,GAAG,mCAAgB,CAAA;AAC7B,QAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CACjC,KAAK,EAAE,IAAY,EAAE,IAAoB,EAAE,EAAE;IAC3C,IAAI,GAAG,IAAA,qBAAO,EAAC,IAAI,CAAC,CAAA;IACpB,MAAM,QAAQ,GAAG,IAAA,qBAAO,EAAC,IAAI,CAAC,CAAA;IAC9B,OAAO,IAAA,yBAAS,EAAC,QAAQ,CAAC;QACxB,CAAC,CAAC,IAAA,+BAAY,EAAC,IAAI,EAAE,QAAQ,CAAC;QAC9B,CAAC,CAAC,IAAA,+BAAY,EAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;AAClC,CAAC,EACD;IACE,UAAU,EAAV,kBAAU;IACV,YAAY,EAAZ,+BAAY;IACZ,gBAAgB,EAAhB,mCAAgB;IAChB,YAAY,EAAZ,+BAAY;IACZ,gBAAgB,EAAhB,mCAAgB;IAEhB,IAAI,EAAE,kBAAU;IAChB,MAAM,EAAE,+BAAY;IACpB,UAAU,EAAE,mCAAgB;IAC5B,MAAM,EAAE,+BAAY;IACpB,UAAU,EAAE,mCAAgB;IAC5B,SAAS,EAAT,yBAAS;IACT,aAAa,EAAb,6BAAa;CACd,CACF,CAAA","sourcesContent":["import { mkdirpManual, mkdirpManualSync } from './mkdirp-manual.js'\nimport { mkdirpNative, mkdirpNativeSync } from './mkdirp-native.js'\nimport { MkdirpOptions, optsArg } from './opts-arg.js'\nimport { pathArg } from './path-arg.js'\nimport { useNative, useNativeSync } from './use-native.js'\n/* c8 ignore start */\nexport { mkdirpManual, mkdirpManualSync } from './mkdirp-manual.js'\nexport { mkdirpNative, mkdirpNativeSync } from './mkdirp-native.js'\nexport { useNative, useNativeSync } from './use-native.js'\n/* c8 ignore stop */\n\nexport const mkdirpSync = (path: string, opts?: MkdirpOptions) => {\n path = pathArg(path)\n const resolved = optsArg(opts)\n return useNativeSync(resolved)\n ? mkdirpNativeSync(path, resolved)\n : mkdirpManualSync(path, resolved)\n}\n\nexport const sync = mkdirpSync\nexport const manual = mkdirpManual\nexport const manualSync = mkdirpManualSync\nexport const native = mkdirpNative\nexport const nativeSync = mkdirpNativeSync\nexport const mkdirp = Object.assign(\n async (path: string, opts?: MkdirpOptions) => {\n path = pathArg(path)\n const resolved = optsArg(opts)\n return useNative(resolved)\n ? mkdirpNative(path, resolved)\n : mkdirpManual(path, resolved)\n },\n {\n mkdirpSync,\n mkdirpNative,\n mkdirpNativeSync,\n mkdirpManual,\n mkdirpManualSync,\n\n sync: mkdirpSync,\n native: mkdirpNative,\n nativeSync: mkdirpNativeSync,\n manual: mkdirpManual,\n manualSync: mkdirpManualSync,\n useNative,\n useNativeSync,\n }\n)\n"]} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/mkdirp-manual.d.ts b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/mkdirp-manual.d.ts new file mode 100644 index 00000000000000..e49cdf9f1bd122 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/mkdirp-manual.d.ts @@ -0,0 +1,6 @@ +import { MkdirpOptions } from './opts-arg.js'; +export declare const mkdirpManualSync: (path: string, options?: MkdirpOptions, made?: string | undefined | void) => string | undefined | void; +export declare const mkdirpManual: ((path: string, options?: MkdirpOptions, made?: string | undefined | void) => Promise) & { + sync: (path: string, options?: MkdirpOptions, made?: string | undefined | void) => string | undefined | void; +}; +//# sourceMappingURL=mkdirp-manual.d.ts.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/mkdirp-manual.d.ts.map b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/mkdirp-manual.d.ts.map new file mode 100644 index 00000000000000..9301bab1ffb35b --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/mkdirp-manual.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"mkdirp-manual.d.ts","sourceRoot":"","sources":["../../../src/mkdirp-manual.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAW,MAAM,eAAe,CAAA;AAEtD,eAAO,MAAM,gBAAgB,SACrB,MAAM,YACF,aAAa,SAChB,MAAM,GAAG,SAAS,GAAG,IAAI,KAC/B,MAAM,GAAG,SAAS,GAAG,IAmCvB,CAAA;AAED,eAAO,MAAM,YAAY,UAEf,MAAM,YACF,aAAa,SAChB,MAAM,GAAG,SAAS,GAAG,IAAI,KAC/B,QAAQ,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;iBA7C/B,MAAM,YACF,aAAa,SAChB,MAAM,GAAG,SAAS,GAAG,IAAI,KAC/B,MAAM,GAAG,SAAS,GAAG,IAAI;CAqF3B,CAAA"} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/mkdirp-manual.js b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/mkdirp-manual.js new file mode 100644 index 00000000000000..d9bd1d8bb5a49b --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/mkdirp-manual.js @@ -0,0 +1,79 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.mkdirpManual = exports.mkdirpManualSync = void 0; +const path_1 = require("path"); +const opts_arg_js_1 = require("./opts-arg.js"); +const mkdirpManualSync = (path, options, made) => { + const parent = (0, path_1.dirname)(path); + const opts = { ...(0, opts_arg_js_1.optsArg)(options), recursive: false }; + if (parent === path) { + try { + return opts.mkdirSync(path, opts); + } + catch (er) { + // swallowed by recursive implementation on posix systems + // any other error is a failure + const fer = er; + if (fer && fer.code !== 'EISDIR') { + throw er; + } + return; + } + } + try { + opts.mkdirSync(path, opts); + return made || path; + } + catch (er) { + const fer = er; + if (fer && fer.code === 'ENOENT') { + return (0, exports.mkdirpManualSync)(path, opts, (0, exports.mkdirpManualSync)(parent, opts, made)); + } + if (fer && fer.code !== 'EEXIST' && fer && fer.code !== 'EROFS') { + throw er; + } + try { + if (!opts.statSync(path).isDirectory()) + throw er; + } + catch (_) { + throw er; + } + } +}; +exports.mkdirpManualSync = mkdirpManualSync; +exports.mkdirpManual = Object.assign(async (path, options, made) => { + const opts = (0, opts_arg_js_1.optsArg)(options); + opts.recursive = false; + const parent = (0, path_1.dirname)(path); + if (parent === path) { + return opts.mkdirAsync(path, opts).catch(er => { + // swallowed by recursive implementation on posix systems + // any other error is a failure + const fer = er; + if (fer && fer.code !== 'EISDIR') { + throw er; + } + }); + } + return opts.mkdirAsync(path, opts).then(() => made || path, async (er) => { + const fer = er; + if (fer && fer.code === 'ENOENT') { + return (0, exports.mkdirpManual)(parent, opts).then((made) => (0, exports.mkdirpManual)(path, opts, made)); + } + if (fer && fer.code !== 'EEXIST' && fer.code !== 'EROFS') { + throw er; + } + return opts.statAsync(path).then(st => { + if (st.isDirectory()) { + return made; + } + else { + throw er; + } + }, () => { + throw er; + }); + }); +}, { sync: exports.mkdirpManualSync }); +//# sourceMappingURL=mkdirp-manual.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/mkdirp-manual.js.map b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/mkdirp-manual.js.map new file mode 100644 index 00000000000000..ff7ba24dca32ad --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/mkdirp-manual.js.map @@ -0,0 +1 @@ +{"version":3,"file":"mkdirp-manual.js","sourceRoot":"","sources":["../../../src/mkdirp-manual.ts"],"names":[],"mappings":"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","sourcesContent":["import { dirname } from 'path'\nimport { MkdirpOptions, optsArg } from './opts-arg.js'\n\nexport const mkdirpManualSync = (\n path: string,\n options?: MkdirpOptions,\n made?: string | undefined | void\n): string | undefined | void => {\n const parent = dirname(path)\n const opts = { ...optsArg(options), recursive: false }\n\n if (parent === path) {\n try {\n return opts.mkdirSync(path, opts)\n } catch (er) {\n // swallowed by recursive implementation on posix systems\n // any other error is a failure\n const fer = er as NodeJS.ErrnoException\n if (fer && fer.code !== 'EISDIR') {\n throw er\n }\n return\n }\n }\n\n try {\n opts.mkdirSync(path, opts)\n return made || path\n } catch (er) {\n const fer = er as NodeJS.ErrnoException\n if (fer && fer.code === 'ENOENT') {\n return mkdirpManualSync(path, opts, mkdirpManualSync(parent, opts, made))\n }\n if (fer && fer.code !== 'EEXIST' && fer && fer.code !== 'EROFS') {\n throw er\n }\n try {\n if (!opts.statSync(path).isDirectory()) throw er\n } catch (_) {\n throw er\n }\n }\n}\n\nexport const mkdirpManual = Object.assign(\n async (\n path: string,\n options?: MkdirpOptions,\n made?: string | undefined | void\n ): Promise => {\n const opts = optsArg(options)\n opts.recursive = false\n const parent = dirname(path)\n if (parent === path) {\n return opts.mkdirAsync(path, opts).catch(er => {\n // swallowed by recursive implementation on posix systems\n // any other error is a failure\n const fer = er as NodeJS.ErrnoException\n if (fer && fer.code !== 'EISDIR') {\n throw er\n }\n })\n }\n\n return opts.mkdirAsync(path, opts).then(\n () => made || path,\n async er => {\n const fer = er as NodeJS.ErrnoException\n if (fer && fer.code === 'ENOENT') {\n return mkdirpManual(parent, opts).then(\n (made?: string | undefined | void) => mkdirpManual(path, opts, made)\n )\n }\n if (fer && fer.code !== 'EEXIST' && fer.code !== 'EROFS') {\n throw er\n }\n return opts.statAsync(path).then(\n st => {\n if (st.isDirectory()) {\n return made\n } else {\n throw er\n }\n },\n () => {\n throw er\n }\n )\n }\n )\n },\n { sync: mkdirpManualSync }\n)\n"]} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/mkdirp-native.d.ts b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/mkdirp-native.d.ts new file mode 100644 index 00000000000000..28b64814b2545a --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/mkdirp-native.d.ts @@ -0,0 +1,6 @@ +import { MkdirpOptions } from './opts-arg.js'; +export declare const mkdirpNativeSync: (path: string, options?: MkdirpOptions) => string | void | undefined; +export declare const mkdirpNative: ((path: string, options?: MkdirpOptions) => Promise) & { + sync: (path: string, options?: MkdirpOptions) => string | void | undefined; +}; +//# sourceMappingURL=mkdirp-native.d.ts.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/mkdirp-native.d.ts.map b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/mkdirp-native.d.ts.map new file mode 100644 index 00000000000000..379c0f6591c686 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/mkdirp-native.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"mkdirp-native.d.ts","sourceRoot":"","sources":["../../../src/mkdirp-native.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAW,MAAM,eAAe,CAAA;AAEtD,eAAO,MAAM,gBAAgB,SACrB,MAAM,YACF,aAAa,KACtB,MAAM,GAAG,IAAI,GAAG,SAoBlB,CAAA;AAED,eAAO,MAAM,YAAY,UAEf,MAAM,YACF,aAAa,KACtB,QAAQ,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;iBA5B/B,MAAM,YACF,aAAa,KACtB,MAAM,GAAG,IAAI,GAAG,SAAS;CAgD3B,CAAA"} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/mkdirp-native.js b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/mkdirp-native.js new file mode 100644 index 00000000000000..9f00567d7cc200 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/mkdirp-native.js @@ -0,0 +1,50 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.mkdirpNative = exports.mkdirpNativeSync = void 0; +const path_1 = require("path"); +const find_made_js_1 = require("./find-made.js"); +const mkdirp_manual_js_1 = require("./mkdirp-manual.js"); +const opts_arg_js_1 = require("./opts-arg.js"); +const mkdirpNativeSync = (path, options) => { + const opts = (0, opts_arg_js_1.optsArg)(options); + opts.recursive = true; + const parent = (0, path_1.dirname)(path); + if (parent === path) { + return opts.mkdirSync(path, opts); + } + const made = (0, find_made_js_1.findMadeSync)(opts, path); + try { + opts.mkdirSync(path, opts); + return made; + } + catch (er) { + const fer = er; + if (fer && fer.code === 'ENOENT') { + return (0, mkdirp_manual_js_1.mkdirpManualSync)(path, opts); + } + else { + throw er; + } + } +}; +exports.mkdirpNativeSync = mkdirpNativeSync; +exports.mkdirpNative = Object.assign(async (path, options) => { + const opts = { ...(0, opts_arg_js_1.optsArg)(options), recursive: true }; + const parent = (0, path_1.dirname)(path); + if (parent === path) { + return await opts.mkdirAsync(path, opts); + } + return (0, find_made_js_1.findMade)(opts, path).then((made) => opts + .mkdirAsync(path, opts) + .then(m => made || m) + .catch(er => { + const fer = er; + if (fer && fer.code === 'ENOENT') { + return (0, mkdirp_manual_js_1.mkdirpManual)(path, opts); + } + else { + throw er; + } + })); +}, { sync: exports.mkdirpNativeSync }); +//# sourceMappingURL=mkdirp-native.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/mkdirp-native.js.map b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/mkdirp-native.js.map new file mode 100644 index 00000000000000..1f889ee98876cc --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/mkdirp-native.js.map @@ -0,0 +1 @@ +{"version":3,"file":"mkdirp-native.js","sourceRoot":"","sources":["../../../src/mkdirp-native.ts"],"names":[],"mappings":";;;AAAA,+BAA8B;AAC9B,iDAAuD;AACvD,yDAAmE;AACnE,+CAAsD;AAE/C,MAAM,gBAAgB,GAAG,CAC9B,IAAY,EACZ,OAAuB,EACI,EAAE;IAC7B,MAAM,IAAI,GAAG,IAAA,qBAAO,EAAC,OAAO,CAAC,CAAA;IAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;IACrB,MAAM,MAAM,GAAG,IAAA,cAAO,EAAC,IAAI,CAAC,CAAA;IAC5B,IAAI,MAAM,KAAK,IAAI,EAAE;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;KAClC;IAED,MAAM,IAAI,GAAG,IAAA,2BAAY,EAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IACrC,IAAI;QACF,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QAC1B,OAAO,IAAI,CAAA;KACZ;IAAC,OAAO,EAAE,EAAE;QACX,MAAM,GAAG,GAAG,EAA2B,CAAA;QACvC,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;YAChC,OAAO,IAAA,mCAAgB,EAAC,IAAI,EAAE,IAAI,CAAC,CAAA;SACpC;aAAM;YACL,MAAM,EAAE,CAAA;SACT;KACF;AACH,CAAC,CAAA;AAvBY,QAAA,gBAAgB,oBAuB5B;AAEY,QAAA,YAAY,GAAG,MAAM,CAAC,MAAM,CACvC,KAAK,EACH,IAAY,EACZ,OAAuB,EACa,EAAE;IACtC,MAAM,IAAI,GAAG,EAAE,GAAG,IAAA,qBAAO,EAAC,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAA;IACrD,MAAM,MAAM,GAAG,IAAA,cAAO,EAAC,IAAI,CAAC,CAAA;IAC5B,IAAI,MAAM,KAAK,IAAI,EAAE;QACnB,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;KACzC;IAED,OAAO,IAAA,uBAAQ,EAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAyB,EAAE,EAAE,CAC7D,IAAI;SACD,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC;SACtB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC;SACpB,KAAK,CAAC,EAAE,CAAC,EAAE;QACV,MAAM,GAAG,GAAG,EAA2B,CAAA;QACvC,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;YAChC,OAAO,IAAA,+BAAY,EAAC,IAAI,EAAE,IAAI,CAAC,CAAA;SAChC;aAAM;YACL,MAAM,EAAE,CAAA;SACT;IACH,CAAC,CAAC,CACL,CAAA;AACH,CAAC,EACD,EAAE,IAAI,EAAE,wBAAgB,EAAE,CAC3B,CAAA","sourcesContent":["import { dirname } from 'path'\nimport { findMade, findMadeSync } from './find-made.js'\nimport { mkdirpManual, mkdirpManualSync } from './mkdirp-manual.js'\nimport { MkdirpOptions, optsArg } from './opts-arg.js'\n\nexport const mkdirpNativeSync = (\n path: string,\n options?: MkdirpOptions\n): string | void | undefined => {\n const opts = optsArg(options)\n opts.recursive = true\n const parent = dirname(path)\n if (parent === path) {\n return opts.mkdirSync(path, opts)\n }\n\n const made = findMadeSync(opts, path)\n try {\n opts.mkdirSync(path, opts)\n return made\n } catch (er) {\n const fer = er as NodeJS.ErrnoException\n if (fer && fer.code === 'ENOENT') {\n return mkdirpManualSync(path, opts)\n } else {\n throw er\n }\n }\n}\n\nexport const mkdirpNative = Object.assign(\n async (\n path: string,\n options?: MkdirpOptions\n ): Promise => {\n const opts = { ...optsArg(options), recursive: true }\n const parent = dirname(path)\n if (parent === path) {\n return await opts.mkdirAsync(path, opts)\n }\n\n return findMade(opts, path).then((made?: string | undefined) =>\n opts\n .mkdirAsync(path, opts)\n .then(m => made || m)\n .catch(er => {\n const fer = er as NodeJS.ErrnoException\n if (fer && fer.code === 'ENOENT') {\n return mkdirpManual(path, opts)\n } else {\n throw er\n }\n })\n )\n },\n { sync: mkdirpNativeSync }\n)\n"]} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/opts-arg.d.ts b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/opts-arg.d.ts new file mode 100644 index 00000000000000..73d076b3b6923c --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/opts-arg.d.ts @@ -0,0 +1,42 @@ +/// +/// +import { MakeDirectoryOptions, Stats } from 'fs'; +export interface FsProvider { + stat?: (path: string, callback: (err: NodeJS.ErrnoException | null, stats: Stats) => any) => any; + mkdir?: (path: string, opts: MakeDirectoryOptions & { + recursive?: boolean; + }, callback: (err: NodeJS.ErrnoException | null, made?: string) => any) => any; + statSync?: (path: string) => Stats; + mkdirSync?: (path: string, opts: MakeDirectoryOptions & { + recursive?: boolean; + }) => string | undefined; +} +interface Options extends FsProvider { + mode?: number | string; + fs?: FsProvider; + mkdirAsync?: (path: string, opts: MakeDirectoryOptions & { + recursive?: boolean; + }) => Promise; + statAsync?: (path: string) => Promise; +} +export type MkdirpOptions = Options | number | string; +export interface MkdirpOptionsResolved { + mode: number; + fs: FsProvider; + mkdirAsync: (path: string, opts: MakeDirectoryOptions & { + recursive?: boolean; + }) => Promise; + statAsync: (path: string) => Promise; + stat: (path: string, callback: (err: NodeJS.ErrnoException | null, stats: Stats) => any) => any; + mkdir: (path: string, opts: MakeDirectoryOptions & { + recursive?: boolean; + }, callback: (err: NodeJS.ErrnoException | null, made?: string) => any) => any; + statSync: (path: string) => Stats; + mkdirSync: (path: string, opts: MakeDirectoryOptions & { + recursive?: boolean; + }) => string | undefined; + recursive?: boolean; +} +export declare const optsArg: (opts?: MkdirpOptions) => MkdirpOptionsResolved; +export {}; +//# sourceMappingURL=opts-arg.d.ts.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/opts-arg.d.ts.map b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/opts-arg.d.ts.map new file mode 100644 index 00000000000000..e575161714f651 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/opts-arg.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"opts-arg.d.ts","sourceRoot":"","sources":["../../../src/opts-arg.ts"],"names":[],"mappings":";;AAAA,OAAO,EACL,oBAAoB,EAIpB,KAAK,EAEN,MAAM,IAAI,CAAA;AAEX,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,CACL,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,cAAc,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,KAAK,GAAG,KAC/D,GAAG,CAAA;IACR,KAAK,CAAC,EAAE,CACN,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,oBAAoB,GAAG;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,EACpD,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,cAAc,GAAG,IAAI,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,GAAG,KAChE,GAAG,CAAA;IACR,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK,CAAA;IAClC,SAAS,CAAC,EAAE,CACV,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,oBAAoB,GAAG;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,KACjD,MAAM,GAAG,SAAS,CAAA;CACxB;AAED,UAAU,OAAQ,SAAQ,UAAU;IAClC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACtB,EAAE,CAAC,EAAE,UAAU,CAAA;IACf,UAAU,CAAC,EAAE,CACX,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,oBAAoB,GAAG;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,KACjD,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;IAChC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC,CAAA;CAC7C;AAED,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAA;AAErD,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,UAAU,CAAA;IACd,UAAU,EAAE,CACV,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,oBAAoB,GAAG;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,KACjD,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;IAChC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC,CAAA;IAC3C,IAAI,EAAE,CACJ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,cAAc,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,KAAK,GAAG,KAC/D,GAAG,CAAA;IACR,KAAK,EAAE,CACL,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,oBAAoB,GAAG;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,EACpD,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,cAAc,GAAG,IAAI,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,GAAG,KAChE,GAAG,CAAA;IACR,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK,CAAA;IACjC,SAAS,EAAE,CACT,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,oBAAoB,GAAG;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,KACjD,MAAM,GAAG,SAAS,CAAA;IACvB,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,eAAO,MAAM,OAAO,UAAW,aAAa,KAAG,qBA2C9C,CAAA"} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/opts-arg.js b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/opts-arg.js new file mode 100644 index 00000000000000..e8f486c0905957 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/opts-arg.js @@ -0,0 +1,38 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.optsArg = void 0; +const fs_1 = require("fs"); +const optsArg = (opts) => { + if (!opts) { + opts = { mode: 0o777 }; + } + else if (typeof opts === 'object') { + opts = { mode: 0o777, ...opts }; + } + else if (typeof opts === 'number') { + opts = { mode: opts }; + } + else if (typeof opts === 'string') { + opts = { mode: parseInt(opts, 8) }; + } + else { + throw new TypeError('invalid options argument'); + } + const resolved = opts; + const optsFs = opts.fs || {}; + opts.mkdir = opts.mkdir || optsFs.mkdir || fs_1.mkdir; + opts.mkdirAsync = opts.mkdirAsync + ? opts.mkdirAsync + : async (path, options) => { + return new Promise((res, rej) => resolved.mkdir(path, options, (er, made) => er ? rej(er) : res(made))); + }; + opts.stat = opts.stat || optsFs.stat || fs_1.stat; + opts.statAsync = opts.statAsync + ? opts.statAsync + : async (path) => new Promise((res, rej) => resolved.stat(path, (err, stats) => (err ? rej(err) : res(stats)))); + opts.statSync = opts.statSync || optsFs.statSync || fs_1.statSync; + opts.mkdirSync = opts.mkdirSync || optsFs.mkdirSync || fs_1.mkdirSync; + return resolved; +}; +exports.optsArg = optsArg; +//# sourceMappingURL=opts-arg.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/opts-arg.js.map b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/opts-arg.js.map new file mode 100644 index 00000000000000..fd5590f40f54cd --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/opts-arg.js.map @@ -0,0 +1 @@ +{"version":3,"file":"opts-arg.js","sourceRoot":"","sources":["../../../src/opts-arg.ts"],"names":[],"mappings":";;;AAAA,2BAOW;AAwDJ,MAAM,OAAO,GAAG,CAAC,IAAoB,EAAyB,EAAE;IACrE,IAAI,CAAC,IAAI,EAAE;QACT,IAAI,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;KACvB;SAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QACnC,IAAI,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,CAAA;KAChC;SAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QACnC,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;KACtB;SAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QACnC,IAAI,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAA;KACnC;SAAM;QACL,MAAM,IAAI,SAAS,CAAC,0BAA0B,CAAC,CAAA;KAChD;IAED,MAAM,QAAQ,GAAG,IAA6B,CAAA;IAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,IAAI,EAAE,CAAA;IAE5B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,IAAI,UAAK,CAAA;IAEhD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU;QAC/B,CAAC,CAAC,IAAI,CAAC,UAAU;QACjB,CAAC,CAAC,KAAK,EACH,IAAY,EACZ,OAAuD,EAC1B,EAAE;YAC/B,OAAO,IAAI,OAAO,CAAqB,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAClD,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CACzC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CACzB,CACF,CAAA;QACH,CAAC,CAAA;IAEL,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,IAAI,SAAI,CAAA;IAC5C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS;QAC7B,CAAC,CAAC,IAAI,CAAC,SAAS;QAChB,CAAC,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE,CACrB,IAAI,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CACvB,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CACnE,CAAA;IAEP,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,IAAI,aAAQ,CAAA;IAC5D,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,IAAI,cAAS,CAAA;IAEhE,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AA3CY,QAAA,OAAO,WA2CnB","sourcesContent":["import {\n MakeDirectoryOptions,\n mkdir,\n mkdirSync,\n stat,\n Stats,\n statSync,\n} from 'fs'\n\nexport interface FsProvider {\n stat?: (\n path: string,\n callback: (err: NodeJS.ErrnoException | null, stats: Stats) => any\n ) => any\n mkdir?: (\n path: string,\n opts: MakeDirectoryOptions & { recursive?: boolean },\n callback: (err: NodeJS.ErrnoException | null, made?: string) => any\n ) => any\n statSync?: (path: string) => Stats\n mkdirSync?: (\n path: string,\n opts: MakeDirectoryOptions & { recursive?: boolean }\n ) => string | undefined\n}\n\ninterface Options extends FsProvider {\n mode?: number | string\n fs?: FsProvider\n mkdirAsync?: (\n path: string,\n opts: MakeDirectoryOptions & { recursive?: boolean }\n ) => Promise\n statAsync?: (path: string) => Promise\n}\n\nexport type MkdirpOptions = Options | number | string\n\nexport interface MkdirpOptionsResolved {\n mode: number\n fs: FsProvider\n mkdirAsync: (\n path: string,\n opts: MakeDirectoryOptions & { recursive?: boolean }\n ) => Promise\n statAsync: (path: string) => Promise\n stat: (\n path: string,\n callback: (err: NodeJS.ErrnoException | null, stats: Stats) => any\n ) => any\n mkdir: (\n path: string,\n opts: MakeDirectoryOptions & { recursive?: boolean },\n callback: (err: NodeJS.ErrnoException | null, made?: string) => any\n ) => any\n statSync: (path: string) => Stats\n mkdirSync: (\n path: string,\n opts: MakeDirectoryOptions & { recursive?: boolean }\n ) => string | undefined\n recursive?: boolean\n}\n\nexport const optsArg = (opts?: MkdirpOptions): MkdirpOptionsResolved => {\n if (!opts) {\n opts = { mode: 0o777 }\n } else if (typeof opts === 'object') {\n opts = { mode: 0o777, ...opts }\n } else if (typeof opts === 'number') {\n opts = { mode: opts }\n } else if (typeof opts === 'string') {\n opts = { mode: parseInt(opts, 8) }\n } else {\n throw new TypeError('invalid options argument')\n }\n\n const resolved = opts as MkdirpOptionsResolved\n const optsFs = opts.fs || {}\n\n opts.mkdir = opts.mkdir || optsFs.mkdir || mkdir\n\n opts.mkdirAsync = opts.mkdirAsync\n ? opts.mkdirAsync\n : async (\n path: string,\n options: MakeDirectoryOptions & { recursive?: boolean }\n ): Promise => {\n return new Promise((res, rej) =>\n resolved.mkdir(path, options, (er, made) =>\n er ? rej(er) : res(made)\n )\n )\n }\n\n opts.stat = opts.stat || optsFs.stat || stat\n opts.statAsync = opts.statAsync\n ? opts.statAsync\n : async (path: string) =>\n new Promise((res, rej) =>\n resolved.stat(path, (err, stats) => (err ? rej(err) : res(stats)))\n )\n\n opts.statSync = opts.statSync || optsFs.statSync || statSync\n opts.mkdirSync = opts.mkdirSync || optsFs.mkdirSync || mkdirSync\n\n return resolved\n}\n"]} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/path-arg.d.ts b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/path-arg.d.ts new file mode 100644 index 00000000000000..ad0ccfc482a485 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/path-arg.d.ts @@ -0,0 +1,2 @@ +export declare const pathArg: (path: string) => string; +//# sourceMappingURL=path-arg.d.ts.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/path-arg.d.ts.map b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/path-arg.d.ts.map new file mode 100644 index 00000000000000..3b52b077c6c05c --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/path-arg.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"path-arg.d.ts","sourceRoot":"","sources":["../../../src/path-arg.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,OAAO,SAAU,MAAM,WAyBnC,CAAA"} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/path-arg.js b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/path-arg.js new file mode 100644 index 00000000000000..a6b457f6e23d58 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/path-arg.js @@ -0,0 +1,28 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.pathArg = void 0; +const platform = process.env.__TESTING_MKDIRP_PLATFORM__ || process.platform; +const path_1 = require("path"); +const pathArg = (path) => { + if (/\0/.test(path)) { + // simulate same failure that node raises + throw Object.assign(new TypeError('path must be a string without null bytes'), { + path, + code: 'ERR_INVALID_ARG_VALUE', + }); + } + path = (0, path_1.resolve)(path); + if (platform === 'win32') { + const badWinChars = /[*|"<>?:]/; + const { root } = (0, path_1.parse)(path); + if (badWinChars.test(path.substring(root.length))) { + throw Object.assign(new Error('Illegal characters in path.'), { + path, + code: 'EINVAL', + }); + } + } + return path; +}; +exports.pathArg = pathArg; +//# sourceMappingURL=path-arg.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/path-arg.js.map b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/path-arg.js.map new file mode 100644 index 00000000000000..ad3b5d38cad3cd --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/path-arg.js.map @@ -0,0 +1 @@ +{"version":3,"file":"path-arg.js","sourceRoot":"","sources":["../../../src/path-arg.ts"],"names":[],"mappings":";;;AAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,OAAO,CAAC,QAAQ,CAAA;AAC5E,+BAAqC;AAC9B,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,EAAE;IACtC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QACnB,yCAAyC;QACzC,MAAM,MAAM,CAAC,MAAM,CACjB,IAAI,SAAS,CAAC,0CAA0C,CAAC,EACzD;YACE,IAAI;YACJ,IAAI,EAAE,uBAAuB;SAC9B,CACF,CAAA;KACF;IAED,IAAI,GAAG,IAAA,cAAO,EAAC,IAAI,CAAC,CAAA;IACpB,IAAI,QAAQ,KAAK,OAAO,EAAE;QACxB,MAAM,WAAW,GAAG,WAAW,CAAA;QAC/B,MAAM,EAAE,IAAI,EAAE,GAAG,IAAA,YAAK,EAAC,IAAI,CAAC,CAAA;QAC5B,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE;YACjD,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,EAAE;gBAC5D,IAAI;gBACJ,IAAI,EAAE,QAAQ;aACf,CAAC,CAAA;SACH;KACF;IAED,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAzBY,QAAA,OAAO,WAyBnB","sourcesContent":["const platform = process.env.__TESTING_MKDIRP_PLATFORM__ || process.platform\nimport { parse, resolve } from 'path'\nexport const pathArg = (path: string) => {\n if (/\\0/.test(path)) {\n // simulate same failure that node raises\n throw Object.assign(\n new TypeError('path must be a string without null bytes'),\n {\n path,\n code: 'ERR_INVALID_ARG_VALUE',\n }\n )\n }\n\n path = resolve(path)\n if (platform === 'win32') {\n const badWinChars = /[*|\"<>?:]/\n const { root } = parse(path)\n if (badWinChars.test(path.substring(root.length))) {\n throw Object.assign(new Error('Illegal characters in path.'), {\n path,\n code: 'EINVAL',\n })\n }\n }\n\n return path\n}\n"]} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/use-native.d.ts b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/use-native.d.ts new file mode 100644 index 00000000000000..1c6cb619e30405 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/use-native.d.ts @@ -0,0 +1,6 @@ +import { MkdirpOptions } from './opts-arg.js'; +export declare const useNativeSync: (opts?: MkdirpOptions) => boolean; +export declare const useNative: ((opts?: MkdirpOptions) => boolean) & { + sync: (opts?: MkdirpOptions) => boolean; +}; +//# sourceMappingURL=use-native.d.ts.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/use-native.d.ts.map b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/use-native.d.ts.map new file mode 100644 index 00000000000000..7dc275e322ea3b --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/use-native.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"use-native.d.ts","sourceRoot":"","sources":["../../../src/use-native.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAW,MAAM,eAAe,CAAA;AAMtD,eAAO,MAAM,aAAa,UAEd,aAAa,YAA0C,CAAA;AAEnE,eAAO,MAAM,SAAS,WAGR,aAAa;kBALf,aAAa;CASxB,CAAA"} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/use-native.js b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/use-native.js new file mode 100644 index 00000000000000..550b3452688ee5 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/use-native.js @@ -0,0 +1,17 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.useNative = exports.useNativeSync = void 0; +const fs_1 = require("fs"); +const opts_arg_js_1 = require("./opts-arg.js"); +const version = process.env.__TESTING_MKDIRP_NODE_VERSION__ || process.version; +const versArr = version.replace(/^v/, '').split('.'); +const hasNative = +versArr[0] > 10 || (+versArr[0] === 10 && +versArr[1] >= 12); +exports.useNativeSync = !hasNative + ? () => false + : (opts) => (0, opts_arg_js_1.optsArg)(opts).mkdirSync === fs_1.mkdirSync; +exports.useNative = Object.assign(!hasNative + ? () => false + : (opts) => (0, opts_arg_js_1.optsArg)(opts).mkdir === fs_1.mkdir, { + sync: exports.useNativeSync, +}); +//# sourceMappingURL=use-native.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/use-native.js.map b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/use-native.js.map new file mode 100644 index 00000000000000..9a15efebb9ec28 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/cjs/src/use-native.js.map @@ -0,0 +1 @@ +{"version":3,"file":"use-native.js","sourceRoot":"","sources":["../../../src/use-native.ts"],"names":[],"mappings":";;;AAAA,2BAAqC;AACrC,+CAAsD;AAEtD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,+BAA+B,IAAI,OAAO,CAAC,OAAO,CAAA;AAC9E,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;AACpD,MAAM,SAAS,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;AAElE,QAAA,aAAa,GAAG,CAAC,SAAS;IACrC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK;IACb,CAAC,CAAC,CAAC,IAAoB,EAAE,EAAE,CAAC,IAAA,qBAAO,EAAC,IAAI,CAAC,CAAC,SAAS,KAAK,cAAS,CAAA;AAEtD,QAAA,SAAS,GAAG,MAAM,CAAC,MAAM,CACpC,CAAC,SAAS;IACR,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK;IACb,CAAC,CAAC,CAAC,IAAoB,EAAE,EAAE,CAAC,IAAA,qBAAO,EAAC,IAAI,CAAC,CAAC,KAAK,KAAK,UAAK,EAC3D;IACE,IAAI,EAAE,qBAAa;CACpB,CACF,CAAA","sourcesContent":["import { mkdir, mkdirSync } from 'fs'\nimport { MkdirpOptions, optsArg } from './opts-arg.js'\n\nconst version = process.env.__TESTING_MKDIRP_NODE_VERSION__ || process.version\nconst versArr = version.replace(/^v/, '').split('.')\nconst hasNative = +versArr[0] > 10 || (+versArr[0] === 10 && +versArr[1] >= 12)\n\nexport const useNativeSync = !hasNative\n ? () => false\n : (opts?: MkdirpOptions) => optsArg(opts).mkdirSync === mkdirSync\n\nexport const useNative = Object.assign(\n !hasNative\n ? () => false\n : (opts?: MkdirpOptions) => optsArg(opts).mkdir === mkdir,\n {\n sync: useNativeSync,\n }\n)\n"]} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/find-made.d.ts b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/find-made.d.ts new file mode 100644 index 00000000000000..e47794b3bb72a3 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/find-made.d.ts @@ -0,0 +1,4 @@ +import { MkdirpOptionsResolved } from './opts-arg.js'; +export declare const findMade: (opts: MkdirpOptionsResolved, parent: string, path?: string) => Promise; +export declare const findMadeSync: (opts: MkdirpOptionsResolved, parent: string, path?: string) => undefined | string; +//# sourceMappingURL=find-made.d.ts.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/find-made.d.ts.map b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/find-made.d.ts.map new file mode 100644 index 00000000000000..411aad1410eb7a --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/find-made.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"find-made.d.ts","sourceRoot":"","sources":["../../src/find-made.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAErD,eAAO,MAAM,QAAQ,SACb,qBAAqB,UACnB,MAAM,SACP,MAAM,KACZ,QAAQ,SAAS,GAAG,MAAM,CAe5B,CAAA;AAED,eAAO,MAAM,YAAY,SACjB,qBAAqB,UACnB,MAAM,SACP,MAAM,KACZ,SAAS,GAAG,MAad,CAAA"} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/find-made.js b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/find-made.js new file mode 100644 index 00000000000000..3e72fd59a2c1fb --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/find-made.js @@ -0,0 +1,30 @@ +import { dirname } from 'path'; +export const findMade = async (opts, parent, path) => { + // we never want the 'made' return value to be a root directory + if (path === parent) { + return; + } + return opts.statAsync(parent).then(st => (st.isDirectory() ? path : undefined), // will fail later + // will fail later + er => { + const fer = er; + return fer && fer.code === 'ENOENT' + ? findMade(opts, dirname(parent), parent) + : undefined; + }); +}; +export const findMadeSync = (opts, parent, path) => { + if (path === parent) { + return undefined; + } + try { + return opts.statSync(parent).isDirectory() ? path : undefined; + } + catch (er) { + const fer = er; + return fer && fer.code === 'ENOENT' + ? findMadeSync(opts, dirname(parent), parent) + : undefined; + } +}; +//# sourceMappingURL=find-made.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/find-made.js.map b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/find-made.js.map new file mode 100644 index 00000000000000..7b58089c6266c1 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/find-made.js.map @@ -0,0 +1 @@ +{"version":3,"file":"find-made.js","sourceRoot":"","sources":["../../src/find-made.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAG9B,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAC3B,IAA2B,EAC3B,MAAc,EACd,IAAa,EACgB,EAAE;IAC/B,+DAA+D;IAC/D,IAAI,IAAI,KAAK,MAAM,EAAE;QACnB,OAAM;KACP;IAED,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAChC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,kBAAkB;IAC/D,AAD6C,kBAAkB;IAC/D,EAAE,CAAC,EAAE;QACH,MAAM,GAAG,GAAG,EAA2B,CAAA;QACvC,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;YACjC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;YACzC,CAAC,CAAC,SAAS,CAAA;IACf,CAAC,CACF,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,IAA2B,EAC3B,MAAc,EACd,IAAa,EACO,EAAE;IACtB,IAAI,IAAI,KAAK,MAAM,EAAE;QACnB,OAAO,SAAS,CAAA;KACjB;IAED,IAAI;QACF,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAA;KAC9D;IAAC,OAAO,EAAE,EAAE;QACX,MAAM,GAAG,GAAG,EAA2B,CAAA;QACvC,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;YACjC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;YAC7C,CAAC,CAAC,SAAS,CAAA;KACd;AACH,CAAC,CAAA","sourcesContent":["import { dirname } from 'path'\nimport { MkdirpOptionsResolved } from './opts-arg.js'\n\nexport const findMade = async (\n opts: MkdirpOptionsResolved,\n parent: string,\n path?: string\n): Promise => {\n // we never want the 'made' return value to be a root directory\n if (path === parent) {\n return\n }\n\n return opts.statAsync(parent).then(\n st => (st.isDirectory() ? path : undefined), // will fail later\n er => {\n const fer = er as NodeJS.ErrnoException\n return fer && fer.code === 'ENOENT'\n ? findMade(opts, dirname(parent), parent)\n : undefined\n }\n )\n}\n\nexport const findMadeSync = (\n opts: MkdirpOptionsResolved,\n parent: string,\n path?: string\n): undefined | string => {\n if (path === parent) {\n return undefined\n }\n\n try {\n return opts.statSync(parent).isDirectory() ? path : undefined\n } catch (er) {\n const fer = er as NodeJS.ErrnoException\n return fer && fer.code === 'ENOENT'\n ? findMadeSync(opts, dirname(parent), parent)\n : undefined\n }\n}\n"]} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/index.d.ts b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/index.d.ts new file mode 100644 index 00000000000000..fc9e43b3a45de1 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/index.d.ts @@ -0,0 +1,39 @@ +import { MkdirpOptions } from './opts-arg.js'; +export { mkdirpManual, mkdirpManualSync } from './mkdirp-manual.js'; +export { mkdirpNative, mkdirpNativeSync } from './mkdirp-native.js'; +export { useNative, useNativeSync } from './use-native.js'; +export declare const mkdirpSync: (path: string, opts?: MkdirpOptions) => string | void; +export declare const sync: (path: string, opts?: MkdirpOptions) => string | void; +export declare const manual: ((path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => Promise) & { + sync: (path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => string | void | undefined; +}; +export declare const manualSync: (path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => string | void | undefined; +export declare const native: ((path: string, options?: MkdirpOptions | undefined) => Promise) & { + sync: (path: string, options?: MkdirpOptions | undefined) => string | void | undefined; +}; +export declare const nativeSync: (path: string, options?: MkdirpOptions | undefined) => string | void | undefined; +export declare const mkdirp: ((path: string, opts?: MkdirpOptions) => Promise) & { + mkdirpSync: (path: string, opts?: MkdirpOptions) => string | void; + mkdirpNative: ((path: string, options?: MkdirpOptions | undefined) => Promise) & { + sync: (path: string, options?: MkdirpOptions | undefined) => string | void | undefined; + }; + mkdirpNativeSync: (path: string, options?: MkdirpOptions | undefined) => string | void | undefined; + mkdirpManual: ((path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => Promise) & { + sync: (path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => string | void | undefined; + }; + mkdirpManualSync: (path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => string | void | undefined; + sync: (path: string, opts?: MkdirpOptions) => string | void; + native: ((path: string, options?: MkdirpOptions | undefined) => Promise) & { + sync: (path: string, options?: MkdirpOptions | undefined) => string | void | undefined; + }; + nativeSync: (path: string, options?: MkdirpOptions | undefined) => string | void | undefined; + manual: ((path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => Promise) & { + sync: (path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => string | void | undefined; + }; + manualSync: (path: string, options?: MkdirpOptions | undefined, made?: string | void | undefined) => string | void | undefined; + useNative: ((opts?: MkdirpOptions | undefined) => boolean) & { + sync: (opts?: MkdirpOptions | undefined) => boolean; + }; + useNativeSync: (opts?: MkdirpOptions | undefined) => boolean; +}; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/index.d.ts.map b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/index.d.ts.map new file mode 100644 index 00000000000000..cfcc78083857b1 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAW,MAAM,eAAe,CAAA;AAItD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACnE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACnE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAG1D,eAAO,MAAM,UAAU,SAAU,MAAM,SAAS,aAAa,kBAM5D,CAAA;AAED,eAAO,MAAM,IAAI,SARgB,MAAM,SAAS,aAAa,kBAQ/B,CAAA;AAC9B,eAAO,MAAM,MAAM;;CAAe,CAAA;AAClC,eAAO,MAAM,UAAU,oHAAmB,CAAA;AAC1C,eAAO,MAAM,MAAM;;CAAe,CAAA;AAClC,eAAO,MAAM,UAAU,kFAAmB,CAAA;AAC1C,eAAO,MAAM,MAAM,UACJ,MAAM,SAAS,aAAa;uBAdV,MAAM,SAAS,aAAa;;;;;;;;;iBAA5B,MAAM,SAAS,aAAa;;;;;;;;;;;;;CAoC5D,CAAA"} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/index.js b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/index.js new file mode 100644 index 00000000000000..0217ecc8cdd83d --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/index.js @@ -0,0 +1,43 @@ +import { mkdirpManual, mkdirpManualSync } from './mkdirp-manual.js'; +import { mkdirpNative, mkdirpNativeSync } from './mkdirp-native.js'; +import { optsArg } from './opts-arg.js'; +import { pathArg } from './path-arg.js'; +import { useNative, useNativeSync } from './use-native.js'; +/* c8 ignore start */ +export { mkdirpManual, mkdirpManualSync } from './mkdirp-manual.js'; +export { mkdirpNative, mkdirpNativeSync } from './mkdirp-native.js'; +export { useNative, useNativeSync } from './use-native.js'; +/* c8 ignore stop */ +export const mkdirpSync = (path, opts) => { + path = pathArg(path); + const resolved = optsArg(opts); + return useNativeSync(resolved) + ? mkdirpNativeSync(path, resolved) + : mkdirpManualSync(path, resolved); +}; +export const sync = mkdirpSync; +export const manual = mkdirpManual; +export const manualSync = mkdirpManualSync; +export const native = mkdirpNative; +export const nativeSync = mkdirpNativeSync; +export const mkdirp = Object.assign(async (path, opts) => { + path = pathArg(path); + const resolved = optsArg(opts); + return useNative(resolved) + ? mkdirpNative(path, resolved) + : mkdirpManual(path, resolved); +}, { + mkdirpSync, + mkdirpNative, + mkdirpNativeSync, + mkdirpManual, + mkdirpManualSync, + sync: mkdirpSync, + native: mkdirpNative, + nativeSync: mkdirpNativeSync, + manual: mkdirpManual, + manualSync: mkdirpManualSync, + useNative, + useNativeSync, +}); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/index.js.map b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/index.js.map new file mode 100644 index 00000000000000..47a8133a070c8f --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACnE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACnE,OAAO,EAAiB,OAAO,EAAE,MAAM,eAAe,CAAA;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC1D,qBAAqB;AACrB,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACnE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACnE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC1D,oBAAoB;AAEpB,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,IAAoB,EAAE,EAAE;IAC/D,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACpB,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9B,OAAO,aAAa,CAAC,QAAQ,CAAC;QAC5B,CAAC,CAAC,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC;QAClC,CAAC,CAAC,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;AACtC,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,UAAU,CAAA;AAC9B,MAAM,CAAC,MAAM,MAAM,GAAG,YAAY,CAAA;AAClC,MAAM,CAAC,MAAM,UAAU,GAAG,gBAAgB,CAAA;AAC1C,MAAM,CAAC,MAAM,MAAM,GAAG,YAAY,CAAA;AAClC,MAAM,CAAC,MAAM,UAAU,GAAG,gBAAgB,CAAA;AAC1C,MAAM,CAAC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CACjC,KAAK,EAAE,IAAY,EAAE,IAAoB,EAAE,EAAE;IAC3C,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACpB,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9B,OAAO,SAAS,CAAC,QAAQ,CAAC;QACxB,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC;QAC9B,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;AAClC,CAAC,EACD;IACE,UAAU;IACV,YAAY;IACZ,gBAAgB;IAChB,YAAY;IACZ,gBAAgB;IAEhB,IAAI,EAAE,UAAU;IAChB,MAAM,EAAE,YAAY;IACpB,UAAU,EAAE,gBAAgB;IAC5B,MAAM,EAAE,YAAY;IACpB,UAAU,EAAE,gBAAgB;IAC5B,SAAS;IACT,aAAa;CACd,CACF,CAAA","sourcesContent":["import { mkdirpManual, mkdirpManualSync } from './mkdirp-manual.js'\nimport { mkdirpNative, mkdirpNativeSync } from './mkdirp-native.js'\nimport { MkdirpOptions, optsArg } from './opts-arg.js'\nimport { pathArg } from './path-arg.js'\nimport { useNative, useNativeSync } from './use-native.js'\n/* c8 ignore start */\nexport { mkdirpManual, mkdirpManualSync } from './mkdirp-manual.js'\nexport { mkdirpNative, mkdirpNativeSync } from './mkdirp-native.js'\nexport { useNative, useNativeSync } from './use-native.js'\n/* c8 ignore stop */\n\nexport const mkdirpSync = (path: string, opts?: MkdirpOptions) => {\n path = pathArg(path)\n const resolved = optsArg(opts)\n return useNativeSync(resolved)\n ? mkdirpNativeSync(path, resolved)\n : mkdirpManualSync(path, resolved)\n}\n\nexport const sync = mkdirpSync\nexport const manual = mkdirpManual\nexport const manualSync = mkdirpManualSync\nexport const native = mkdirpNative\nexport const nativeSync = mkdirpNativeSync\nexport const mkdirp = Object.assign(\n async (path: string, opts?: MkdirpOptions) => {\n path = pathArg(path)\n const resolved = optsArg(opts)\n return useNative(resolved)\n ? mkdirpNative(path, resolved)\n : mkdirpManual(path, resolved)\n },\n {\n mkdirpSync,\n mkdirpNative,\n mkdirpNativeSync,\n mkdirpManual,\n mkdirpManualSync,\n\n sync: mkdirpSync,\n native: mkdirpNative,\n nativeSync: mkdirpNativeSync,\n manual: mkdirpManual,\n manualSync: mkdirpManualSync,\n useNative,\n useNativeSync,\n }\n)\n"]} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/mkdirp-manual.d.ts b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/mkdirp-manual.d.ts new file mode 100644 index 00000000000000..e49cdf9f1bd122 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/mkdirp-manual.d.ts @@ -0,0 +1,6 @@ +import { MkdirpOptions } from './opts-arg.js'; +export declare const mkdirpManualSync: (path: string, options?: MkdirpOptions, made?: string | undefined | void) => string | undefined | void; +export declare const mkdirpManual: ((path: string, options?: MkdirpOptions, made?: string | undefined | void) => Promise) & { + sync: (path: string, options?: MkdirpOptions, made?: string | undefined | void) => string | undefined | void; +}; +//# sourceMappingURL=mkdirp-manual.d.ts.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/mkdirp-manual.d.ts.map b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/mkdirp-manual.d.ts.map new file mode 100644 index 00000000000000..ae7f243d3ca78b --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/mkdirp-manual.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"mkdirp-manual.d.ts","sourceRoot":"","sources":["../../src/mkdirp-manual.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAW,MAAM,eAAe,CAAA;AAEtD,eAAO,MAAM,gBAAgB,SACrB,MAAM,YACF,aAAa,SAChB,MAAM,GAAG,SAAS,GAAG,IAAI,KAC/B,MAAM,GAAG,SAAS,GAAG,IAmCvB,CAAA;AAED,eAAO,MAAM,YAAY,UAEf,MAAM,YACF,aAAa,SAChB,MAAM,GAAG,SAAS,GAAG,IAAI,KAC/B,QAAQ,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;iBA7C/B,MAAM,YACF,aAAa,SAChB,MAAM,GAAG,SAAS,GAAG,IAAI,KAC/B,MAAM,GAAG,SAAS,GAAG,IAAI;CAqF3B,CAAA"} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/mkdirp-manual.js b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/mkdirp-manual.js new file mode 100644 index 00000000000000..a4d044e02d3bfc --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/mkdirp-manual.js @@ -0,0 +1,75 @@ +import { dirname } from 'path'; +import { optsArg } from './opts-arg.js'; +export const mkdirpManualSync = (path, options, made) => { + const parent = dirname(path); + const opts = { ...optsArg(options), recursive: false }; + if (parent === path) { + try { + return opts.mkdirSync(path, opts); + } + catch (er) { + // swallowed by recursive implementation on posix systems + // any other error is a failure + const fer = er; + if (fer && fer.code !== 'EISDIR') { + throw er; + } + return; + } + } + try { + opts.mkdirSync(path, opts); + return made || path; + } + catch (er) { + const fer = er; + if (fer && fer.code === 'ENOENT') { + return mkdirpManualSync(path, opts, mkdirpManualSync(parent, opts, made)); + } + if (fer && fer.code !== 'EEXIST' && fer && fer.code !== 'EROFS') { + throw er; + } + try { + if (!opts.statSync(path).isDirectory()) + throw er; + } + catch (_) { + throw er; + } + } +}; +export const mkdirpManual = Object.assign(async (path, options, made) => { + const opts = optsArg(options); + opts.recursive = false; + const parent = dirname(path); + if (parent === path) { + return opts.mkdirAsync(path, opts).catch(er => { + // swallowed by recursive implementation on posix systems + // any other error is a failure + const fer = er; + if (fer && fer.code !== 'EISDIR') { + throw er; + } + }); + } + return opts.mkdirAsync(path, opts).then(() => made || path, async (er) => { + const fer = er; + if (fer && fer.code === 'ENOENT') { + return mkdirpManual(parent, opts).then((made) => mkdirpManual(path, opts, made)); + } + if (fer && fer.code !== 'EEXIST' && fer.code !== 'EROFS') { + throw er; + } + return opts.statAsync(path).then(st => { + if (st.isDirectory()) { + return made; + } + else { + throw er; + } + }, () => { + throw er; + }); + }); +}, { sync: mkdirpManualSync }); +//# sourceMappingURL=mkdirp-manual.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/mkdirp-manual.js.map b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/mkdirp-manual.js.map new file mode 100644 index 00000000000000..29eab250e126c8 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/mkdirp-manual.js.map @@ -0,0 +1 @@ +{"version":3,"file":"mkdirp-manual.js","sourceRoot":"","sources":["../../src/mkdirp-manual.ts"],"names":[],"mappings":"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","sourcesContent":["import { dirname } from 'path'\nimport { MkdirpOptions, optsArg } from './opts-arg.js'\n\nexport const mkdirpManualSync = (\n path: string,\n options?: MkdirpOptions,\n made?: string | undefined | void\n): string | undefined | void => {\n const parent = dirname(path)\n const opts = { ...optsArg(options), recursive: false }\n\n if (parent === path) {\n try {\n return opts.mkdirSync(path, opts)\n } catch (er) {\n // swallowed by recursive implementation on posix systems\n // any other error is a failure\n const fer = er as NodeJS.ErrnoException\n if (fer && fer.code !== 'EISDIR') {\n throw er\n }\n return\n }\n }\n\n try {\n opts.mkdirSync(path, opts)\n return made || path\n } catch (er) {\n const fer = er as NodeJS.ErrnoException\n if (fer && fer.code === 'ENOENT') {\n return mkdirpManualSync(path, opts, mkdirpManualSync(parent, opts, made))\n }\n if (fer && fer.code !== 'EEXIST' && fer && fer.code !== 'EROFS') {\n throw er\n }\n try {\n if (!opts.statSync(path).isDirectory()) throw er\n } catch (_) {\n throw er\n }\n }\n}\n\nexport const mkdirpManual = Object.assign(\n async (\n path: string,\n options?: MkdirpOptions,\n made?: string | undefined | void\n ): Promise => {\n const opts = optsArg(options)\n opts.recursive = false\n const parent = dirname(path)\n if (parent === path) {\n return opts.mkdirAsync(path, opts).catch(er => {\n // swallowed by recursive implementation on posix systems\n // any other error is a failure\n const fer = er as NodeJS.ErrnoException\n if (fer && fer.code !== 'EISDIR') {\n throw er\n }\n })\n }\n\n return opts.mkdirAsync(path, opts).then(\n () => made || path,\n async er => {\n const fer = er as NodeJS.ErrnoException\n if (fer && fer.code === 'ENOENT') {\n return mkdirpManual(parent, opts).then(\n (made?: string | undefined | void) => mkdirpManual(path, opts, made)\n )\n }\n if (fer && fer.code !== 'EEXIST' && fer.code !== 'EROFS') {\n throw er\n }\n return opts.statAsync(path).then(\n st => {\n if (st.isDirectory()) {\n return made\n } else {\n throw er\n }\n },\n () => {\n throw er\n }\n )\n }\n )\n },\n { sync: mkdirpManualSync }\n)\n"]} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/mkdirp-native.d.ts b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/mkdirp-native.d.ts new file mode 100644 index 00000000000000..28b64814b2545a --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/mkdirp-native.d.ts @@ -0,0 +1,6 @@ +import { MkdirpOptions } from './opts-arg.js'; +export declare const mkdirpNativeSync: (path: string, options?: MkdirpOptions) => string | void | undefined; +export declare const mkdirpNative: ((path: string, options?: MkdirpOptions) => Promise) & { + sync: (path: string, options?: MkdirpOptions) => string | void | undefined; +}; +//# sourceMappingURL=mkdirp-native.d.ts.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/mkdirp-native.d.ts.map b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/mkdirp-native.d.ts.map new file mode 100644 index 00000000000000..517dfabe7d1213 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/mkdirp-native.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"mkdirp-native.d.ts","sourceRoot":"","sources":["../../src/mkdirp-native.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAW,MAAM,eAAe,CAAA;AAEtD,eAAO,MAAM,gBAAgB,SACrB,MAAM,YACF,aAAa,KACtB,MAAM,GAAG,IAAI,GAAG,SAoBlB,CAAA;AAED,eAAO,MAAM,YAAY,UAEf,MAAM,YACF,aAAa,KACtB,QAAQ,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;iBA5B/B,MAAM,YACF,aAAa,KACtB,MAAM,GAAG,IAAI,GAAG,SAAS;CAgD3B,CAAA"} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/mkdirp-native.js b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/mkdirp-native.js new file mode 100644 index 00000000000000..99d10a5425dade --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/mkdirp-native.js @@ -0,0 +1,46 @@ +import { dirname } from 'path'; +import { findMade, findMadeSync } from './find-made.js'; +import { mkdirpManual, mkdirpManualSync } from './mkdirp-manual.js'; +import { optsArg } from './opts-arg.js'; +export const mkdirpNativeSync = (path, options) => { + const opts = optsArg(options); + opts.recursive = true; + const parent = dirname(path); + if (parent === path) { + return opts.mkdirSync(path, opts); + } + const made = findMadeSync(opts, path); + try { + opts.mkdirSync(path, opts); + return made; + } + catch (er) { + const fer = er; + if (fer && fer.code === 'ENOENT') { + return mkdirpManualSync(path, opts); + } + else { + throw er; + } + } +}; +export const mkdirpNative = Object.assign(async (path, options) => { + const opts = { ...optsArg(options), recursive: true }; + const parent = dirname(path); + if (parent === path) { + return await opts.mkdirAsync(path, opts); + } + return findMade(opts, path).then((made) => opts + .mkdirAsync(path, opts) + .then(m => made || m) + .catch(er => { + const fer = er; + if (fer && fer.code === 'ENOENT') { + return mkdirpManual(path, opts); + } + else { + throw er; + } + })); +}, { sync: mkdirpNativeSync }); +//# sourceMappingURL=mkdirp-native.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/mkdirp-native.js.map b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/mkdirp-native.js.map new file mode 100644 index 00000000000000..27de32d9436d67 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/mkdirp-native.js.map @@ -0,0 +1 @@ +{"version":3,"file":"mkdirp-native.js","sourceRoot":"","sources":["../../src/mkdirp-native.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAC9B,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AACvD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACnE,OAAO,EAAiB,OAAO,EAAE,MAAM,eAAe,CAAA;AAEtD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,IAAY,EACZ,OAAuB,EACI,EAAE;IAC7B,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;IACrB,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5B,IAAI,MAAM,KAAK,IAAI,EAAE;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;KAClC;IAED,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IACrC,IAAI;QACF,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QAC1B,OAAO,IAAI,CAAA;KACZ;IAAC,OAAO,EAAE,EAAE;QACX,MAAM,GAAG,GAAG,EAA2B,CAAA;QACvC,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;YAChC,OAAO,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;SACpC;aAAM;YACL,MAAM,EAAE,CAAA;SACT;KACF;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CACvC,KAAK,EACH,IAAY,EACZ,OAAuB,EACa,EAAE;IACtC,MAAM,IAAI,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAA;IACrD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5B,IAAI,MAAM,KAAK,IAAI,EAAE;QACnB,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;KACzC;IAED,OAAO,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAyB,EAAE,EAAE,CAC7D,IAAI;SACD,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC;SACtB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC;SACpB,KAAK,CAAC,EAAE,CAAC,EAAE;QACV,MAAM,GAAG,GAAG,EAA2B,CAAA;QACvC,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;YAChC,OAAO,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;SAChC;aAAM;YACL,MAAM,EAAE,CAAA;SACT;IACH,CAAC,CAAC,CACL,CAAA;AACH,CAAC,EACD,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAC3B,CAAA","sourcesContent":["import { dirname } from 'path'\nimport { findMade, findMadeSync } from './find-made.js'\nimport { mkdirpManual, mkdirpManualSync } from './mkdirp-manual.js'\nimport { MkdirpOptions, optsArg } from './opts-arg.js'\n\nexport const mkdirpNativeSync = (\n path: string,\n options?: MkdirpOptions\n): string | void | undefined => {\n const opts = optsArg(options)\n opts.recursive = true\n const parent = dirname(path)\n if (parent === path) {\n return opts.mkdirSync(path, opts)\n }\n\n const made = findMadeSync(opts, path)\n try {\n opts.mkdirSync(path, opts)\n return made\n } catch (er) {\n const fer = er as NodeJS.ErrnoException\n if (fer && fer.code === 'ENOENT') {\n return mkdirpManualSync(path, opts)\n } else {\n throw er\n }\n }\n}\n\nexport const mkdirpNative = Object.assign(\n async (\n path: string,\n options?: MkdirpOptions\n ): Promise => {\n const opts = { ...optsArg(options), recursive: true }\n const parent = dirname(path)\n if (parent === path) {\n return await opts.mkdirAsync(path, opts)\n }\n\n return findMade(opts, path).then((made?: string | undefined) =>\n opts\n .mkdirAsync(path, opts)\n .then(m => made || m)\n .catch(er => {\n const fer = er as NodeJS.ErrnoException\n if (fer && fer.code === 'ENOENT') {\n return mkdirpManual(path, opts)\n } else {\n throw er\n }\n })\n )\n },\n { sync: mkdirpNativeSync }\n)\n"]} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/opts-arg.d.ts b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/opts-arg.d.ts new file mode 100644 index 00000000000000..73d076b3b6923c --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/opts-arg.d.ts @@ -0,0 +1,42 @@ +/// +/// +import { MakeDirectoryOptions, Stats } from 'fs'; +export interface FsProvider { + stat?: (path: string, callback: (err: NodeJS.ErrnoException | null, stats: Stats) => any) => any; + mkdir?: (path: string, opts: MakeDirectoryOptions & { + recursive?: boolean; + }, callback: (err: NodeJS.ErrnoException | null, made?: string) => any) => any; + statSync?: (path: string) => Stats; + mkdirSync?: (path: string, opts: MakeDirectoryOptions & { + recursive?: boolean; + }) => string | undefined; +} +interface Options extends FsProvider { + mode?: number | string; + fs?: FsProvider; + mkdirAsync?: (path: string, opts: MakeDirectoryOptions & { + recursive?: boolean; + }) => Promise; + statAsync?: (path: string) => Promise; +} +export type MkdirpOptions = Options | number | string; +export interface MkdirpOptionsResolved { + mode: number; + fs: FsProvider; + mkdirAsync: (path: string, opts: MakeDirectoryOptions & { + recursive?: boolean; + }) => Promise; + statAsync: (path: string) => Promise; + stat: (path: string, callback: (err: NodeJS.ErrnoException | null, stats: Stats) => any) => any; + mkdir: (path: string, opts: MakeDirectoryOptions & { + recursive?: boolean; + }, callback: (err: NodeJS.ErrnoException | null, made?: string) => any) => any; + statSync: (path: string) => Stats; + mkdirSync: (path: string, opts: MakeDirectoryOptions & { + recursive?: boolean; + }) => string | undefined; + recursive?: boolean; +} +export declare const optsArg: (opts?: MkdirpOptions) => MkdirpOptionsResolved; +export {}; +//# sourceMappingURL=opts-arg.d.ts.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/opts-arg.d.ts.map b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/opts-arg.d.ts.map new file mode 100644 index 00000000000000..717deb5f9cb0c6 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/opts-arg.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"opts-arg.d.ts","sourceRoot":"","sources":["../../src/opts-arg.ts"],"names":[],"mappings":";;AAAA,OAAO,EACL,oBAAoB,EAIpB,KAAK,EAEN,MAAM,IAAI,CAAA;AAEX,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,CACL,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,cAAc,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,KAAK,GAAG,KAC/D,GAAG,CAAA;IACR,KAAK,CAAC,EAAE,CACN,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,oBAAoB,GAAG;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,EACpD,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,cAAc,GAAG,IAAI,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,GAAG,KAChE,GAAG,CAAA;IACR,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK,CAAA;IAClC,SAAS,CAAC,EAAE,CACV,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,oBAAoB,GAAG;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,KACjD,MAAM,GAAG,SAAS,CAAA;CACxB;AAED,UAAU,OAAQ,SAAQ,UAAU;IAClC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACtB,EAAE,CAAC,EAAE,UAAU,CAAA;IACf,UAAU,CAAC,EAAE,CACX,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,oBAAoB,GAAG;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,KACjD,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;IAChC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC,CAAA;CAC7C;AAED,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAA;AAErD,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,UAAU,CAAA;IACd,UAAU,EAAE,CACV,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,oBAAoB,GAAG;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,KACjD,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;IAChC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC,CAAA;IAC3C,IAAI,EAAE,CACJ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,cAAc,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,KAAK,GAAG,KAC/D,GAAG,CAAA;IACR,KAAK,EAAE,CACL,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,oBAAoB,GAAG;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,EACpD,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,cAAc,GAAG,IAAI,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,GAAG,KAChE,GAAG,CAAA;IACR,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK,CAAA;IACjC,SAAS,EAAE,CACT,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,oBAAoB,GAAG;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,KACjD,MAAM,GAAG,SAAS,CAAA;IACvB,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,eAAO,MAAM,OAAO,UAAW,aAAa,KAAG,qBA2C9C,CAAA"} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/opts-arg.js b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/opts-arg.js new file mode 100644 index 00000000000000..d47e2927fee4c0 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/opts-arg.js @@ -0,0 +1,34 @@ +import { mkdir, mkdirSync, stat, statSync, } from 'fs'; +export const optsArg = (opts) => { + if (!opts) { + opts = { mode: 0o777 }; + } + else if (typeof opts === 'object') { + opts = { mode: 0o777, ...opts }; + } + else if (typeof opts === 'number') { + opts = { mode: opts }; + } + else if (typeof opts === 'string') { + opts = { mode: parseInt(opts, 8) }; + } + else { + throw new TypeError('invalid options argument'); + } + const resolved = opts; + const optsFs = opts.fs || {}; + opts.mkdir = opts.mkdir || optsFs.mkdir || mkdir; + opts.mkdirAsync = opts.mkdirAsync + ? opts.mkdirAsync + : async (path, options) => { + return new Promise((res, rej) => resolved.mkdir(path, options, (er, made) => er ? rej(er) : res(made))); + }; + opts.stat = opts.stat || optsFs.stat || stat; + opts.statAsync = opts.statAsync + ? opts.statAsync + : async (path) => new Promise((res, rej) => resolved.stat(path, (err, stats) => (err ? rej(err) : res(stats)))); + opts.statSync = opts.statSync || optsFs.statSync || statSync; + opts.mkdirSync = opts.mkdirSync || optsFs.mkdirSync || mkdirSync; + return resolved; +}; +//# sourceMappingURL=opts-arg.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/opts-arg.js.map b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/opts-arg.js.map new file mode 100644 index 00000000000000..663286dc7212ed --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/opts-arg.js.map @@ -0,0 +1 @@ +{"version":3,"file":"opts-arg.js","sourceRoot":"","sources":["../../src/opts-arg.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,EACL,SAAS,EACT,IAAI,EAEJ,QAAQ,GACT,MAAM,IAAI,CAAA;AAwDX,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,IAAoB,EAAyB,EAAE;IACrE,IAAI,CAAC,IAAI,EAAE;QACT,IAAI,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;KACvB;SAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QACnC,IAAI,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,CAAA;KAChC;SAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QACnC,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;KACtB;SAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QACnC,IAAI,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAA;KACnC;SAAM;QACL,MAAM,IAAI,SAAS,CAAC,0BAA0B,CAAC,CAAA;KAChD;IAED,MAAM,QAAQ,GAAG,IAA6B,CAAA;IAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,IAAI,EAAE,CAAA;IAE5B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,IAAI,KAAK,CAAA;IAEhD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU;QAC/B,CAAC,CAAC,IAAI,CAAC,UAAU;QACjB,CAAC,CAAC,KAAK,EACH,IAAY,EACZ,OAAuD,EAC1B,EAAE;YAC/B,OAAO,IAAI,OAAO,CAAqB,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAClD,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CACzC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CACzB,CACF,CAAA;QACH,CAAC,CAAA;IAEL,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,IAAI,IAAI,CAAA;IAC5C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS;QAC7B,CAAC,CAAC,IAAI,CAAC,SAAS;QAChB,CAAC,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE,CACrB,IAAI,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CACvB,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CACnE,CAAA;IAEP,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,IAAI,QAAQ,CAAA;IAC5D,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,IAAI,SAAS,CAAA;IAEhE,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA","sourcesContent":["import {\n MakeDirectoryOptions,\n mkdir,\n mkdirSync,\n stat,\n Stats,\n statSync,\n} from 'fs'\n\nexport interface FsProvider {\n stat?: (\n path: string,\n callback: (err: NodeJS.ErrnoException | null, stats: Stats) => any\n ) => any\n mkdir?: (\n path: string,\n opts: MakeDirectoryOptions & { recursive?: boolean },\n callback: (err: NodeJS.ErrnoException | null, made?: string) => any\n ) => any\n statSync?: (path: string) => Stats\n mkdirSync?: (\n path: string,\n opts: MakeDirectoryOptions & { recursive?: boolean }\n ) => string | undefined\n}\n\ninterface Options extends FsProvider {\n mode?: number | string\n fs?: FsProvider\n mkdirAsync?: (\n path: string,\n opts: MakeDirectoryOptions & { recursive?: boolean }\n ) => Promise\n statAsync?: (path: string) => Promise\n}\n\nexport type MkdirpOptions = Options | number | string\n\nexport interface MkdirpOptionsResolved {\n mode: number\n fs: FsProvider\n mkdirAsync: (\n path: string,\n opts: MakeDirectoryOptions & { recursive?: boolean }\n ) => Promise\n statAsync: (path: string) => Promise\n stat: (\n path: string,\n callback: (err: NodeJS.ErrnoException | null, stats: Stats) => any\n ) => any\n mkdir: (\n path: string,\n opts: MakeDirectoryOptions & { recursive?: boolean },\n callback: (err: NodeJS.ErrnoException | null, made?: string) => any\n ) => any\n statSync: (path: string) => Stats\n mkdirSync: (\n path: string,\n opts: MakeDirectoryOptions & { recursive?: boolean }\n ) => string | undefined\n recursive?: boolean\n}\n\nexport const optsArg = (opts?: MkdirpOptions): MkdirpOptionsResolved => {\n if (!opts) {\n opts = { mode: 0o777 }\n } else if (typeof opts === 'object') {\n opts = { mode: 0o777, ...opts }\n } else if (typeof opts === 'number') {\n opts = { mode: opts }\n } else if (typeof opts === 'string') {\n opts = { mode: parseInt(opts, 8) }\n } else {\n throw new TypeError('invalid options argument')\n }\n\n const resolved = opts as MkdirpOptionsResolved\n const optsFs = opts.fs || {}\n\n opts.mkdir = opts.mkdir || optsFs.mkdir || mkdir\n\n opts.mkdirAsync = opts.mkdirAsync\n ? opts.mkdirAsync\n : async (\n path: string,\n options: MakeDirectoryOptions & { recursive?: boolean }\n ): Promise => {\n return new Promise((res, rej) =>\n resolved.mkdir(path, options, (er, made) =>\n er ? rej(er) : res(made)\n )\n )\n }\n\n opts.stat = opts.stat || optsFs.stat || stat\n opts.statAsync = opts.statAsync\n ? opts.statAsync\n : async (path: string) =>\n new Promise((res, rej) =>\n resolved.stat(path, (err, stats) => (err ? rej(err) : res(stats)))\n )\n\n opts.statSync = opts.statSync || optsFs.statSync || statSync\n opts.mkdirSync = opts.mkdirSync || optsFs.mkdirSync || mkdirSync\n\n return resolved\n}\n"]} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/package.json b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/package.json new file mode 100644 index 00000000000000..3dbc1ca591c055 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/path-arg.d.ts b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/path-arg.d.ts new file mode 100644 index 00000000000000..ad0ccfc482a485 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/path-arg.d.ts @@ -0,0 +1,2 @@ +export declare const pathArg: (path: string) => string; +//# sourceMappingURL=path-arg.d.ts.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/path-arg.d.ts.map b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/path-arg.d.ts.map new file mode 100644 index 00000000000000..801799e766fabc --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/path-arg.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"path-arg.d.ts","sourceRoot":"","sources":["../../src/path-arg.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,OAAO,SAAU,MAAM,WAyBnC,CAAA"} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/path-arg.js b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/path-arg.js new file mode 100644 index 00000000000000..03539cc5a94f98 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/path-arg.js @@ -0,0 +1,24 @@ +const platform = process.env.__TESTING_MKDIRP_PLATFORM__ || process.platform; +import { parse, resolve } from 'path'; +export const pathArg = (path) => { + if (/\0/.test(path)) { + // simulate same failure that node raises + throw Object.assign(new TypeError('path must be a string without null bytes'), { + path, + code: 'ERR_INVALID_ARG_VALUE', + }); + } + path = resolve(path); + if (platform === 'win32') { + const badWinChars = /[*|"<>?:]/; + const { root } = parse(path); + if (badWinChars.test(path.substring(root.length))) { + throw Object.assign(new Error('Illegal characters in path.'), { + path, + code: 'EINVAL', + }); + } + } + return path; +}; +//# sourceMappingURL=path-arg.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/path-arg.js.map b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/path-arg.js.map new file mode 100644 index 00000000000000..43efe1e3a9976f --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/path-arg.js.map @@ -0,0 +1 @@ +{"version":3,"file":"path-arg.js","sourceRoot":"","sources":["../../src/path-arg.ts"],"names":[],"mappings":"AAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,OAAO,CAAC,QAAQ,CAAA;AAC5E,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AACrC,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,EAAE;IACtC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QACnB,yCAAyC;QACzC,MAAM,MAAM,CAAC,MAAM,CACjB,IAAI,SAAS,CAAC,0CAA0C,CAAC,EACzD;YACE,IAAI;YACJ,IAAI,EAAE,uBAAuB;SAC9B,CACF,CAAA;KACF;IAED,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACpB,IAAI,QAAQ,KAAK,OAAO,EAAE;QACxB,MAAM,WAAW,GAAG,WAAW,CAAA;QAC/B,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,CAAA;QAC5B,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE;YACjD,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,EAAE;gBAC5D,IAAI;gBACJ,IAAI,EAAE,QAAQ;aACf,CAAC,CAAA;SACH;KACF;IAED,OAAO,IAAI,CAAA;AACb,CAAC,CAAA","sourcesContent":["const platform = process.env.__TESTING_MKDIRP_PLATFORM__ || process.platform\nimport { parse, resolve } from 'path'\nexport const pathArg = (path: string) => {\n if (/\\0/.test(path)) {\n // simulate same failure that node raises\n throw Object.assign(\n new TypeError('path must be a string without null bytes'),\n {\n path,\n code: 'ERR_INVALID_ARG_VALUE',\n }\n )\n }\n\n path = resolve(path)\n if (platform === 'win32') {\n const badWinChars = /[*|\"<>?:]/\n const { root } = parse(path)\n if (badWinChars.test(path.substring(root.length))) {\n throw Object.assign(new Error('Illegal characters in path.'), {\n path,\n code: 'EINVAL',\n })\n }\n }\n\n return path\n}\n"]} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/use-native.d.ts b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/use-native.d.ts new file mode 100644 index 00000000000000..1c6cb619e30405 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/use-native.d.ts @@ -0,0 +1,6 @@ +import { MkdirpOptions } from './opts-arg.js'; +export declare const useNativeSync: (opts?: MkdirpOptions) => boolean; +export declare const useNative: ((opts?: MkdirpOptions) => boolean) & { + sync: (opts?: MkdirpOptions) => boolean; +}; +//# sourceMappingURL=use-native.d.ts.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/use-native.d.ts.map b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/use-native.d.ts.map new file mode 100644 index 00000000000000..e2484228a04472 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/use-native.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"use-native.d.ts","sourceRoot":"","sources":["../../src/use-native.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAW,MAAM,eAAe,CAAA;AAMtD,eAAO,MAAM,aAAa,UAEd,aAAa,YAA0C,CAAA;AAEnE,eAAO,MAAM,SAAS,WAGR,aAAa;kBALf,aAAa;CASxB,CAAA"} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/use-native.js b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/use-native.js new file mode 100644 index 00000000000000..ad2093867eb74e --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/use-native.js @@ -0,0 +1,14 @@ +import { mkdir, mkdirSync } from 'fs'; +import { optsArg } from './opts-arg.js'; +const version = process.env.__TESTING_MKDIRP_NODE_VERSION__ || process.version; +const versArr = version.replace(/^v/, '').split('.'); +const hasNative = +versArr[0] > 10 || (+versArr[0] === 10 && +versArr[1] >= 12); +export const useNativeSync = !hasNative + ? () => false + : (opts) => optsArg(opts).mkdirSync === mkdirSync; +export const useNative = Object.assign(!hasNative + ? () => false + : (opts) => optsArg(opts).mkdir === mkdir, { + sync: useNativeSync, +}); +//# sourceMappingURL=use-native.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/use-native.js.map b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/use-native.js.map new file mode 100644 index 00000000000000..08c616d365510f --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/dist/mjs/use-native.js.map @@ -0,0 +1 @@ +{"version":3,"file":"use-native.js","sourceRoot":"","sources":["../../src/use-native.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AACrC,OAAO,EAAiB,OAAO,EAAE,MAAM,eAAe,CAAA;AAEtD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,+BAA+B,IAAI,OAAO,CAAC,OAAO,CAAA;AAC9E,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;AACpD,MAAM,SAAS,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;AAE/E,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,SAAS;IACrC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK;IACb,CAAC,CAAC,CAAC,IAAoB,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS,CAAA;AAEnE,MAAM,CAAC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CACpC,CAAC,SAAS;IACR,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK;IACb,CAAC,CAAC,CAAC,IAAoB,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,EAC3D;IACE,IAAI,EAAE,aAAa;CACpB,CACF,CAAA","sourcesContent":["import { mkdir, mkdirSync } from 'fs'\nimport { MkdirpOptions, optsArg } from './opts-arg.js'\n\nconst version = process.env.__TESTING_MKDIRP_NODE_VERSION__ || process.version\nconst versArr = version.replace(/^v/, '').split('.')\nconst hasNative = +versArr[0] > 10 || (+versArr[0] === 10 && +versArr[1] >= 12)\n\nexport const useNativeSync = !hasNative\n ? () => false\n : (opts?: MkdirpOptions) => optsArg(opts).mkdirSync === mkdirSync\n\nexport const useNative = Object.assign(\n !hasNative\n ? () => false\n : (opts?: MkdirpOptions) => optsArg(opts).mkdir === mkdir,\n {\n sync: useNativeSync,\n }\n)\n"]} \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/package.json b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/package.json new file mode 100644 index 00000000000000..f31ac3314d6f6a --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/package.json @@ -0,0 +1,91 @@ +{ + "name": "mkdirp", + "description": "Recursively mkdir, like `mkdir -p`", + "version": "3.0.1", + "keywords": [ + "mkdir", + "directory", + "make dir", + "make", + "dir", + "recursive", + "native" + ], + "bin": "./dist/cjs/src/bin.js", + "main": "./dist/cjs/src/index.js", + "module": "./dist/mjs/index.js", + "types": "./dist/mjs/index.d.ts", + "exports": { + ".": { + "import": { + "types": "./dist/mjs/index.d.ts", + "default": "./dist/mjs/index.js" + }, + "require": { + "types": "./dist/cjs/src/index.d.ts", + "default": "./dist/cjs/src/index.js" + } + } + }, + "files": [ + "dist" + ], + "scripts": { + "preversion": "npm test", + "postversion": "npm publish", + "prepublishOnly": "git push origin --follow-tags", + "preprepare": "rm -rf dist", + "prepare": "tsc -p tsconfig.json && tsc -p tsconfig-esm.json", + "postprepare": "bash fixup.sh", + "pretest": "npm run prepare", + "presnap": "npm run prepare", + "test": "c8 tap", + "snap": "c8 tap", + "format": "prettier --write . --loglevel warn", + "benchmark": "node benchmark/index.js", + "typedoc": "typedoc --tsconfig tsconfig-esm.json ./src/*.ts" + }, + "prettier": { + "semi": false, + "printWidth": 80, + "tabWidth": 2, + "useTabs": false, + "singleQuote": true, + "jsxSingleQuote": false, + "bracketSameLine": true, + "arrowParens": "avoid", + "endOfLine": "lf" + }, + "devDependencies": { + "@types/brace-expansion": "^1.1.0", + "@types/node": "^18.11.9", + "@types/tap": "^15.0.7", + "c8": "^7.12.0", + "eslint-config-prettier": "^8.6.0", + "prettier": "^2.8.2", + "tap": "^16.3.3", + "ts-node": "^10.9.1", + "typedoc": "^0.23.21", + "typescript": "^4.9.3" + }, + "tap": { + "coverage": false, + "node-arg": [ + "--no-warnings", + "--loader", + "ts-node/esm" + ], + "ts": false + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "repository": { + "type": "git", + "url": "https://github.com/isaacs/node-mkdirp.git" + }, + "license": "MIT", + "engines": { + "node": ">=10" + } +} diff --git a/deps/npm/node_modules/node-gyp/node_modules/mkdirp/readme.markdown b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/readme.markdown new file mode 100644 index 00000000000000..df654b808755f5 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/mkdirp/readme.markdown @@ -0,0 +1,281 @@ +# mkdirp + +Like `mkdir -p`, but in Node.js! + +Now with a modern API and no\* bugs! + +\* may contain some bugs + +# example + +## pow.js + +```js +// hybrid module, import or require() both work +import { mkdirp } from 'mkdirp' +// or: +const { mkdirp } = require('mkdirp') + +// return value is a Promise resolving to the first directory created +mkdirp('/tmp/foo/bar/baz').then(made => + console.log(`made directories, starting with ${made}`) +) +``` + +Output (where `/tmp/foo` already exists) + +``` +made directories, starting with /tmp/foo/bar +``` + +Or, if you don't have time to wait around for promises: + +```js +import { mkdirp } from 'mkdirp' + +// return value is the first directory created +const made = mkdirp.sync('/tmp/foo/bar/baz') +console.log(`made directories, starting with ${made}`) +``` + +And now /tmp/foo/bar/baz exists, huzzah! + +# methods + +```js +import { mkdirp } from 'mkdirp' +``` + +## `mkdirp(dir: string, opts?: MkdirpOptions) => Promise` + +Create a new directory and any necessary subdirectories at `dir` +with octal permission string `opts.mode`. If `opts` is a string +or number, it will be treated as the `opts.mode`. + +If `opts.mode` isn't specified, it defaults to `0o777`. + +Promise resolves to first directory `made` that had to be +created, or `undefined` if everything already exists. Promise +rejects if any errors are encountered. Note that, in the case of +promise rejection, some directories _may_ have been created, as +recursive directory creation is not an atomic operation. + +You can optionally pass in an alternate `fs` implementation by +passing in `opts.fs`. Your implementation should have +`opts.fs.mkdir(path, opts, cb)` and `opts.fs.stat(path, cb)`. + +You can also override just one or the other of `mkdir` and `stat` +by passing in `opts.stat` or `opts.mkdir`, or providing an `fs` +option that only overrides one of these. + +## `mkdirp.sync(dir: string, opts: MkdirpOptions) => string|undefined` + +Synchronously create a new directory and any necessary +subdirectories at `dir` with octal permission string `opts.mode`. +If `opts` is a string or number, it will be treated as the +`opts.mode`. + +If `opts.mode` isn't specified, it defaults to `0o777`. + +Returns the first directory that had to be created, or undefined +if everything already exists. + +You can optionally pass in an alternate `fs` implementation by +passing in `opts.fs`. Your implementation should have +`opts.fs.mkdirSync(path, mode)` and `opts.fs.statSync(path)`. + +You can also override just one or the other of `mkdirSync` and +`statSync` by passing in `opts.statSync` or `opts.mkdirSync`, or +providing an `fs` option that only overrides one of these. + +## `mkdirp.manual`, `mkdirp.manualSync` + +Use the manual implementation (not the native one). This is the +default when the native implementation is not available or the +stat/mkdir implementation is overridden. + +## `mkdirp.native`, `mkdirp.nativeSync` + +Use the native implementation (not the manual one). This is the +default when the native implementation is available and +stat/mkdir are not overridden. + +# implementation + +On Node.js v10.12.0 and above, use the native `fs.mkdir(p, +{recursive:true})` option, unless `fs.mkdir`/`fs.mkdirSync` has +been overridden by an option. + +## native implementation + +- If the path is a root directory, then pass it to the underlying + implementation and return the result/error. (In this case, + it'll either succeed or fail, but we aren't actually creating + any dirs.) +- Walk up the path statting each directory, to find the first + path that will be created, `made`. +- Call `fs.mkdir(path, { recursive: true })` (or `fs.mkdirSync`) +- If error, raise it to the caller. +- Return `made`. + +## manual implementation + +- Call underlying `fs.mkdir` implementation, with `recursive: +false` +- If error: + - If path is a root directory, raise to the caller and do not + handle it + - If ENOENT, mkdirp parent dir, store result as `made` + - stat(path) + - If error, raise original `mkdir` error + - If directory, return `made` + - Else, raise original `mkdir` error +- else + - return `undefined` if a root dir, or `made` if set, or `path` + +## windows vs unix caveat + +On Windows file systems, attempts to create a root directory (ie, +a drive letter or root UNC path) will fail. If the root +directory exists, then it will fail with `EPERM`. If the root +directory does not exist, then it will fail with `ENOENT`. + +On posix file systems, attempts to create a root directory (in +recursive mode) will succeed silently, as it is treated like just +another directory that already exists. (In non-recursive mode, +of course, it fails with `EEXIST`.) + +In order to preserve this system-specific behavior (and because +it's not as if we can create the parent of a root directory +anyway), attempts to create a root directory are passed directly +to the `fs` implementation, and any errors encountered are not +handled. + +## native error caveat + +The native implementation (as of at least Node.js v13.4.0) does +not provide appropriate errors in some cases (see +[nodejs/node#31481](https://github.com/nodejs/node/issues/31481) +and +[nodejs/node#28015](https://github.com/nodejs/node/issues/28015)). + +In order to work around this issue, the native implementation +will fall back to the manual implementation if an `ENOENT` error +is encountered. + +# choosing a recursive mkdir implementation + +There are a few to choose from! Use the one that suits your +needs best :D + +## use `fs.mkdir(path, {recursive: true}, cb)` if: + +- You wish to optimize performance even at the expense of other + factors. +- You don't need to know the first dir created. +- You are ok with getting `ENOENT` as the error when some other + problem is the actual cause. +- You can limit your platforms to Node.js v10.12 and above. +- You're ok with using callbacks instead of promises. +- You don't need/want a CLI. +- You don't need to override the `fs` methods in use. + +## use this module (mkdirp 1.x or 2.x) if: + +- You need to know the first directory that was created. +- You wish to use the native implementation if available, but + fall back when it's not. +- You prefer promise-returning APIs to callback-taking APIs. +- You want more useful error messages than the native recursive + mkdir provides (at least as of Node.js v13.4), and are ok with + re-trying on `ENOENT` to achieve this. +- You need (or at least, are ok with) a CLI. +- You need to override the `fs` methods in use. + +## use [`make-dir`](http://npm.im/make-dir) if: + +- You do not need to know the first dir created (and wish to save + a few `stat` calls when using the native implementation for + this reason). +- You wish to use the native implementation if available, but + fall back when it's not. +- You prefer promise-returning APIs to callback-taking APIs. +- You are ok with occasionally getting `ENOENT` errors for + failures that are actually related to something other than a + missing file system entry. +- You don't need/want a CLI. +- You need to override the `fs` methods in use. + +## use mkdirp 0.x if: + +- You need to know the first directory that was created. +- You need (or at least, are ok with) a CLI. +- You need to override the `fs` methods in use. +- You're ok with using callbacks instead of promises. +- You are not running on Windows, where the root-level ENOENT + errors can lead to infinite regress. +- You think vinyl just sounds warmer and richer for some weird + reason. +- You are supporting truly ancient Node.js versions, before even + the advent of a `Promise` language primitive. (Please don't. + You deserve better.) + +# cli + +This package also ships with a `mkdirp` command. + +``` +$ mkdirp -h + +usage: mkdirp [DIR1,DIR2..] {OPTIONS} + + Create each supplied directory including any necessary parent directories + that don't yet exist. + + If the directory already exists, do nothing. + +OPTIONS are: + + -m If a directory needs to be created, set the mode as an octal + --mode= permission string. + + -v --version Print the mkdirp version number + + -h --help Print this helpful banner + + -p --print Print the first directories created for each path provided + + --manual Use manual implementation, even if native is available +``` + +# install + +With [npm](http://npmjs.org) do: + +``` +npm install mkdirp +``` + +to get the library locally, or + +``` +npm install -g mkdirp +``` + +to get the command everywhere, or + +``` +npx mkdirp ... +``` + +to run the command without installing it globally. + +# platform support + +This module works on node v8, but only v10 and above are officially +supported, as Node v8 reached its LTS end of life 2020-01-01, which is in +the past, as of this writing. + +# license + +MIT diff --git a/deps/npm/node_modules/node-gyp/node_modules/nopt/README.md b/deps/npm/node_modules/node-gyp/node_modules/nopt/README.md deleted file mode 100644 index a99531c04655fe..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/nopt/README.md +++ /dev/null @@ -1,213 +0,0 @@ -If you want to write an option parser, and have it be good, there are -two ways to do it. The Right Way, and the Wrong Way. - -The Wrong Way is to sit down and write an option parser. We've all done -that. - -The Right Way is to write some complex configurable program with so many -options that you hit the limit of your frustration just trying to -manage them all, and defer it with duct-tape solutions until you see -exactly to the core of the problem, and finally snap and write an -awesome option parser. - -If you want to write an option parser, don't write an option parser. -Write a package manager, or a source control system, or a service -restarter, or an operating system. You probably won't end up with a -good one of those, but if you don't give up, and you are relentless and -diligent enough in your procrastination, you may just end up with a very -nice option parser. - -## USAGE - -```javascript -// my-program.js -var nopt = require("nopt") - , Stream = require("stream").Stream - , path = require("path") - , knownOpts = { "foo" : [String, null] - , "bar" : [Stream, Number] - , "baz" : path - , "bloo" : [ "big", "medium", "small" ] - , "flag" : Boolean - , "pick" : Boolean - , "many1" : [String, Array] - , "many2" : [path, Array] - } - , shortHands = { "foofoo" : ["--foo", "Mr. Foo"] - , "b7" : ["--bar", "7"] - , "m" : ["--bloo", "medium"] - , "p" : ["--pick"] - , "f" : ["--flag"] - } - // everything is optional. - // knownOpts and shorthands default to {} - // arg list defaults to process.argv - // slice defaults to 2 - , parsed = nopt(knownOpts, shortHands, process.argv, 2) -console.log(parsed) -``` - -This would give you support for any of the following: - -```console -$ node my-program.js --foo "blerp" --no-flag -{ "foo" : "blerp", "flag" : false } - -$ node my-program.js ---bar 7 --foo "Mr. Hand" --flag -{ bar: 7, foo: "Mr. Hand", flag: true } - -$ node my-program.js --foo "blerp" -f -----p -{ foo: "blerp", flag: true, pick: true } - -$ node my-program.js -fp --foofoo -{ foo: "Mr. Foo", flag: true, pick: true } - -$ node my-program.js --foofoo -- -fp # -- stops the flag parsing. -{ foo: "Mr. Foo", argv: { remain: ["-fp"] } } - -$ node my-program.js --blatzk -fp # unknown opts are ok. -{ blatzk: true, flag: true, pick: true } - -$ node my-program.js --blatzk=1000 -fp # but you need to use = if they have a value -{ blatzk: 1000, flag: true, pick: true } - -$ node my-program.js --no-blatzk -fp # unless they start with "no-" -{ blatzk: false, flag: true, pick: true } - -$ node my-program.js --baz b/a/z # known paths are resolved. -{ baz: "/Users/isaacs/b/a/z" } - -# if Array is one of the types, then it can take many -# values, and will always be an array. The other types provided -# specify what types are allowed in the list. - -$ node my-program.js --many1 5 --many1 null --many1 foo -{ many1: ["5", "null", "foo"] } - -$ node my-program.js --many2 foo --many2 bar -{ many2: ["/path/to/foo", "path/to/bar"] } -``` - -Read the tests at the bottom of `lib/nopt.js` for more examples of -what this puppy can do. - -## Types - -The following types are supported, and defined on `nopt.typeDefs` - -* String: A normal string. No parsing is done. -* path: A file system path. Gets resolved against cwd if not absolute. -* url: A url. If it doesn't parse, it isn't accepted. -* Number: Must be numeric. -* Date: Must parse as a date. If it does, and `Date` is one of the options, - then it will return a Date object, not a string. -* Boolean: Must be either `true` or `false`. If an option is a boolean, - then it does not need a value, and its presence will imply `true` as - the value. To negate boolean flags, do `--no-whatever` or `--whatever - false` -* NaN: Means that the option is strictly not allowed. Any value will - fail. -* Stream: An object matching the "Stream" class in node. Valuable - for use when validating programmatically. (npm uses this to let you - supply any WriteStream on the `outfd` and `logfd` config options.) -* Array: If `Array` is specified as one of the types, then the value - will be parsed as a list of options. This means that multiple values - can be specified, and that the value will always be an array. - -If a type is an array of values not on this list, then those are -considered valid values. For instance, in the example above, the -`--bloo` option can only be one of `"big"`, `"medium"`, or `"small"`, -and any other value will be rejected. - -When parsing unknown fields, `"true"`, `"false"`, and `"null"` will be -interpreted as their JavaScript equivalents. - -You can also mix types and values, or multiple types, in a list. For -instance `{ blah: [Number, null] }` would allow a value to be set to -either a Number or null. When types are ordered, this implies a -preference, and the first type that can be used to properly interpret -the value will be used. - -To define a new type, add it to `nopt.typeDefs`. Each item in that -hash is an object with a `type` member and a `validate` method. The -`type` member is an object that matches what goes in the type list. The -`validate` method is a function that gets called with `validate(data, -key, val)`. Validate methods should assign `data[key]` to the valid -value of `val` if it can be handled properly, or return boolean -`false` if it cannot. - -You can also call `nopt.clean(data, types, typeDefs)` to clean up a -config object and remove its invalid properties. - -## Error Handling - -By default, nopt outputs a warning to standard error when invalid values for -known options are found. You can change this behavior by assigning a method -to `nopt.invalidHandler`. This method will be called with -the offending `nopt.invalidHandler(key, val, types)`. - -If no `nopt.invalidHandler` is assigned, then it will console.error -its whining. If it is assigned to boolean `false` then the warning is -suppressed. - -## Abbreviations - -Yes, they are supported. If you define options like this: - -```javascript -{ "foolhardyelephants" : Boolean -, "pileofmonkeys" : Boolean } -``` - -Then this will work: - -```bash -node program.js --foolhar --pil -node program.js --no-f --pileofmon -# etc. -``` - -## Shorthands - -Shorthands are a hash of shorter option names to a snippet of args that -they expand to. - -If multiple one-character shorthands are all combined, and the -combination does not unambiguously match any other option or shorthand, -then they will be broken up into their constituent parts. For example: - -```json -{ "s" : ["--loglevel", "silent"] -, "g" : "--global" -, "f" : "--force" -, "p" : "--parseable" -, "l" : "--long" -} -``` - -```bash -npm ls -sgflp -# just like doing this: -npm ls --loglevel silent --global --force --long --parseable -``` - -## The Rest of the args - -The config object returned by nopt is given a special member called -`argv`, which is an object with the following fields: - -* `remain`: The remaining args after all the parsing has occurred. -* `original`: The args as they originally appeared. -* `cooked`: The args after flags and shorthands are expanded. - -## Slicing - -Node programs are called with more or less the exact argv as it appears -in C land, after the v8 and node-specific options have been plucked off. -As such, `argv[0]` is always `node` and `argv[1]` is always the -JavaScript program being run. - -That's usually not very useful to you. So they're sliced off by -default. If you want them, then you can pass in `0` as the last -argument, or any other number that you'd like to slice off the start of -the list. diff --git a/deps/npm/node_modules/node-gyp/node_modules/nopt/bin/nopt.js b/deps/npm/node_modules/node-gyp/node_modules/nopt/bin/nopt.js deleted file mode 100755 index 6ed2082064b5ea..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/nopt/bin/nopt.js +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env node -const nopt = require('../lib/nopt') -const path = require('path') -console.log('parsed', nopt({ - num: Number, - bool: Boolean, - help: Boolean, - list: Array, - 'num-list': [Number, Array], - 'str-list': [String, Array], - 'bool-list': [Boolean, Array], - str: String, - clear: Boolean, - config: Boolean, - length: Number, - file: path, -}, { - s: ['--str', 'astring'], - b: ['--bool'], - nb: ['--no-bool'], - tft: ['--bool-list', '--no-bool-list', '--bool-list', 'true'], - '?': ['--help'], - h: ['--help'], - H: ['--help'], - n: ['--num', '125'], - c: ['--config'], - l: ['--length'], - f: ['--file'], -}, process.argv, 2)) diff --git a/deps/npm/node_modules/node-gyp/node_modules/nopt/lib/debug.js b/deps/npm/node_modules/node-gyp/node_modules/nopt/lib/debug.js deleted file mode 100644 index 544ab382ca85c0..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/nopt/lib/debug.js +++ /dev/null @@ -1,5 +0,0 @@ -/* istanbul ignore next */ -module.exports = process.env.DEBUG_NOPT || process.env.NOPT_DEBUG - // eslint-disable-next-line no-console - ? (...a) => console.error(...a) - : () => {} diff --git a/deps/npm/node_modules/node-gyp/node_modules/nopt/lib/nopt-lib.js b/deps/npm/node_modules/node-gyp/node_modules/nopt/lib/nopt-lib.js deleted file mode 100644 index d3d1de0255ba9b..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/nopt/lib/nopt-lib.js +++ /dev/null @@ -1,479 +0,0 @@ -const abbrev = require('abbrev') -const debug = require('./debug') -const defaultTypeDefs = require('./type-defs') - -const hasOwn = (o, k) => Object.prototype.hasOwnProperty.call(o, k) - -const getType = (k, { types, dynamicTypes }) => { - let hasType = hasOwn(types, k) - let type = types[k] - if (!hasType && typeof dynamicTypes === 'function') { - const matchedType = dynamicTypes(k) - if (matchedType !== undefined) { - type = matchedType - hasType = true - } - } - return [hasType, type] -} - -const isTypeDef = (type, def) => def && type === def -const hasTypeDef = (type, def) => def && type.indexOf(def) !== -1 -const doesNotHaveTypeDef = (type, def) => def && !hasTypeDef(type, def) - -function nopt (args, { - types, - shorthands, - typeDefs, - invalidHandler, - typeDefault, - dynamicTypes, -} = {}) { - debug(types, shorthands, args, typeDefs) - - const data = {} - const argv = { - remain: [], - cooked: args, - original: args.slice(0), - } - - parse(args, data, argv.remain, { typeDefs, types, dynamicTypes, shorthands }) - - // now data is full - clean(data, { types, dynamicTypes, typeDefs, invalidHandler, typeDefault }) - data.argv = argv - - Object.defineProperty(data.argv, 'toString', { - value: function () { - return this.original.map(JSON.stringify).join(' ') - }, - enumerable: false, - }) - - return data -} - -function clean (data, { - types = {}, - typeDefs = {}, - dynamicTypes, - invalidHandler, - typeDefault, -} = {}) { - const StringType = typeDefs.String?.type - const NumberType = typeDefs.Number?.type - const ArrayType = typeDefs.Array?.type - const BooleanType = typeDefs.Boolean?.type - const DateType = typeDefs.Date?.type - - const hasTypeDefault = typeof typeDefault !== 'undefined' - if (!hasTypeDefault) { - typeDefault = [false, true, null] - if (StringType) { - typeDefault.push(StringType) - } - if (ArrayType) { - typeDefault.push(ArrayType) - } - } - - const remove = {} - - Object.keys(data).forEach((k) => { - if (k === 'argv') { - return - } - let val = data[k] - debug('val=%j', val) - const isArray = Array.isArray(val) - let [hasType, rawType] = getType(k, { types, dynamicTypes }) - let type = rawType - if (!isArray) { - val = [val] - } - if (!type) { - type = typeDefault - } - if (isTypeDef(type, ArrayType)) { - type = typeDefault.concat(ArrayType) - } - if (!Array.isArray(type)) { - type = [type] - } - - debug('val=%j', val) - debug('types=', type) - val = val.map((v) => { - // if it's an unknown value, then parse false/true/null/numbers/dates - if (typeof v === 'string') { - debug('string %j', v) - v = v.trim() - if ((v === 'null' && ~type.indexOf(null)) - || (v === 'true' && - (~type.indexOf(true) || hasTypeDef(type, BooleanType))) - || (v === 'false' && - (~type.indexOf(false) || hasTypeDef(type, BooleanType)))) { - v = JSON.parse(v) - debug('jsonable %j', v) - } else if (hasTypeDef(type, NumberType) && !isNaN(v)) { - debug('convert to number', v) - v = +v - } else if (hasTypeDef(type, DateType) && !isNaN(Date.parse(v))) { - debug('convert to date', v) - v = new Date(v) - } - } - - if (!hasType) { - if (!hasTypeDefault) { - return v - } - // if the default type has been passed in then we want to validate the - // unknown data key instead of bailing out earlier. we also set the raw - // type which is passed to the invalid handler so that it can be - // determined if during validation if it is unknown vs invalid - rawType = typeDefault - } - - // allow `--no-blah` to set 'blah' to null if null is allowed - if (v === false && ~type.indexOf(null) && - !(~type.indexOf(false) || hasTypeDef(type, BooleanType))) { - v = null - } - - const d = {} - d[k] = v - debug('prevalidated val', d, v, rawType) - if (!validate(d, k, v, rawType, { typeDefs })) { - if (invalidHandler) { - invalidHandler(k, v, rawType, data) - } else if (invalidHandler !== false) { - debug('invalid: ' + k + '=' + v, rawType) - } - return remove - } - debug('validated v', d, v, rawType) - return d[k] - }).filter((v) => v !== remove) - - // if we allow Array specifically, then an empty array is how we - // express 'no value here', not null. Allow it. - if (!val.length && doesNotHaveTypeDef(type, ArrayType)) { - debug('VAL HAS NO LENGTH, DELETE IT', val, k, type.indexOf(ArrayType)) - delete data[k] - } else if (isArray) { - debug(isArray, data[k], val) - data[k] = val - } else { - data[k] = val[0] - } - - debug('k=%s val=%j', k, val, data[k]) - }) -} - -function validate (data, k, val, type, { typeDefs } = {}) { - const ArrayType = typeDefs?.Array?.type - // arrays are lists of types. - if (Array.isArray(type)) { - for (let i = 0, l = type.length; i < l; i++) { - if (isTypeDef(type[i], ArrayType)) { - continue - } - if (validate(data, k, val, type[i], { typeDefs })) { - return true - } - } - delete data[k] - return false - } - - // an array of anything? - if (isTypeDef(type, ArrayType)) { - return true - } - - // Original comment: - // NaN is poisonous. Means that something is not allowed. - // New comment: Changing this to an isNaN check breaks a lot of tests. - // Something is being assumed here that is not actually what happens in - // practice. Fixing it is outside the scope of getting linting to pass in - // this repo. Leaving as-is for now. - /* eslint-disable-next-line no-self-compare */ - if (type !== type) { - debug('Poison NaN', k, val, type) - delete data[k] - return false - } - - // explicit list of values - if (val === type) { - debug('Explicitly allowed %j', val) - data[k] = val - return true - } - - // now go through the list of typeDefs, validate against each one. - let ok = false - const types = Object.keys(typeDefs) - for (let i = 0, l = types.length; i < l; i++) { - debug('test type %j %j %j', k, val, types[i]) - const t = typeDefs[types[i]] - if (t && ( - (type && type.name && t.type && t.type.name) ? - (type.name === t.type.name) : - (type === t.type) - )) { - const d = {} - ok = t.validate(d, k, val) !== false - val = d[k] - if (ok) { - data[k] = val - break - } - } - } - debug('OK? %j (%j %j %j)', ok, k, val, types[types.length - 1]) - - if (!ok) { - delete data[k] - } - return ok -} - -function parse (args, data, remain, { - types = {}, - typeDefs = {}, - shorthands = {}, - dynamicTypes, -} = {}) { - const StringType = typeDefs.String?.type - const NumberType = typeDefs.Number?.type - const ArrayType = typeDefs.Array?.type - const BooleanType = typeDefs.Boolean?.type - - debug('parse', args, data, remain) - - const abbrevs = abbrev(Object.keys(types)) - debug('abbrevs=%j', abbrevs) - const shortAbbr = abbrev(Object.keys(shorthands)) - - for (let i = 0; i < args.length; i++) { - let arg = args[i] - debug('arg', arg) - - if (arg.match(/^-{2,}$/)) { - // done with keys. - // the rest are args. - remain.push.apply(remain, args.slice(i + 1)) - args[i] = '--' - break - } - let hadEq = false - if (arg.charAt(0) === '-' && arg.length > 1) { - const at = arg.indexOf('=') - if (at > -1) { - hadEq = true - const v = arg.slice(at + 1) - arg = arg.slice(0, at) - args.splice(i, 1, arg, v) - } - - // see if it's a shorthand - // if so, splice and back up to re-parse it. - const shRes = resolveShort(arg, shortAbbr, abbrevs, { shorthands }) - debug('arg=%j shRes=%j', arg, shRes) - if (shRes) { - args.splice.apply(args, [i, 1].concat(shRes)) - if (arg !== shRes[0]) { - i-- - continue - } - } - arg = arg.replace(/^-+/, '') - let no = null - while (arg.toLowerCase().indexOf('no-') === 0) { - no = !no - arg = arg.slice(3) - } - - if (abbrevs[arg]) { - arg = abbrevs[arg] - } - - let [hasType, argType] = getType(arg, { types, dynamicTypes }) - let isTypeArray = Array.isArray(argType) - if (isTypeArray && argType.length === 1) { - isTypeArray = false - argType = argType[0] - } - - let isArray = isTypeDef(argType, ArrayType) || - isTypeArray && hasTypeDef(argType, ArrayType) - - // allow unknown things to be arrays if specified multiple times. - if (!hasType && hasOwn(data, arg)) { - if (!Array.isArray(data[arg])) { - data[arg] = [data[arg]] - } - isArray = true - } - - let val - let la = args[i + 1] - - const isBool = typeof no === 'boolean' || - isTypeDef(argType, BooleanType) || - isTypeArray && hasTypeDef(argType, BooleanType) || - (typeof argType === 'undefined' && !hadEq) || - (la === 'false' && - (argType === null || - isTypeArray && ~argType.indexOf(null))) - - if (isBool) { - // just set and move along - val = !no - // however, also support --bool true or --bool false - if (la === 'true' || la === 'false') { - val = JSON.parse(la) - la = null - if (no) { - val = !val - } - i++ - } - - // also support "foo":[Boolean, "bar"] and "--foo bar" - if (isTypeArray && la) { - if (~argType.indexOf(la)) { - // an explicit type - val = la - i++ - } else if (la === 'null' && ~argType.indexOf(null)) { - // null allowed - val = null - i++ - } else if (!la.match(/^-{2,}[^-]/) && - !isNaN(la) && - hasTypeDef(argType, NumberType)) { - // number - val = +la - i++ - } else if (!la.match(/^-[^-]/) && hasTypeDef(argType, StringType)) { - // string - val = la - i++ - } - } - - if (isArray) { - (data[arg] = data[arg] || []).push(val) - } else { - data[arg] = val - } - - continue - } - - if (isTypeDef(argType, StringType)) { - if (la === undefined) { - la = '' - } else if (la.match(/^-{1,2}[^-]+/)) { - la = '' - i-- - } - } - - if (la && la.match(/^-{2,}$/)) { - la = undefined - i-- - } - - val = la === undefined ? true : la - if (isArray) { - (data[arg] = data[arg] || []).push(val) - } else { - data[arg] = val - } - - i++ - continue - } - remain.push(arg) - } -} - -const SINGLES = Symbol('singles') -const singleCharacters = (arg, shorthands) => { - let singles = shorthands[SINGLES] - if (!singles) { - singles = Object.keys(shorthands).filter((s) => s.length === 1).reduce((l, r) => { - l[r] = true - return l - }, {}) - shorthands[SINGLES] = singles - debug('shorthand singles', singles) - } - const chrs = arg.split('').filter((c) => singles[c]) - return chrs.join('') === arg ? chrs : null -} - -function resolveShort (arg, ...rest) { - const { types = {}, shorthands = {} } = rest.length ? rest.pop() : {} - const shortAbbr = rest[0] ?? abbrev(Object.keys(shorthands)) - const abbrevs = rest[1] ?? abbrev(Object.keys(types)) - - // handle single-char shorthands glommed together, like - // npm ls -glp, but only if there is one dash, and only if - // all of the chars are single-char shorthands, and it's - // not a match to some other abbrev. - arg = arg.replace(/^-+/, '') - - // if it's an exact known option, then don't go any further - if (abbrevs[arg] === arg) { - return null - } - - // if it's an exact known shortopt, same deal - if (shorthands[arg]) { - // make it an array, if it's a list of words - if (shorthands[arg] && !Array.isArray(shorthands[arg])) { - shorthands[arg] = shorthands[arg].split(/\s+/) - } - - return shorthands[arg] - } - - // first check to see if this arg is a set of single-char shorthands - const chrs = singleCharacters(arg, shorthands) - if (chrs) { - return chrs.map((c) => shorthands[c]).reduce((l, r) => l.concat(r), []) - } - - // if it's an arg abbrev, and not a literal shorthand, then prefer the arg - if (abbrevs[arg] && !shorthands[arg]) { - return null - } - - // if it's an abbr for a shorthand, then use that - if (shortAbbr[arg]) { - arg = shortAbbr[arg] - } - - // make it an array, if it's a list of words - if (shorthands[arg] && !Array.isArray(shorthands[arg])) { - shorthands[arg] = shorthands[arg].split(/\s+/) - } - - return shorthands[arg] -} - -module.exports = { - nopt, - clean, - parse, - validate, - resolveShort, - typeDefs: defaultTypeDefs, -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/nopt/lib/nopt.js b/deps/npm/node_modules/node-gyp/node_modules/nopt/lib/nopt.js deleted file mode 100644 index 37f01a08783f87..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/nopt/lib/nopt.js +++ /dev/null @@ -1,30 +0,0 @@ -const lib = require('./nopt-lib') -const defaultTypeDefs = require('./type-defs') - -// This is the version of nopt's API that requires setting typeDefs and invalidHandler -// on the required `nopt` object since it is a singleton. To not do a breaking change -// an API that requires all options be passed in is located in `nopt-lib.js` and -// exported here as lib. -// TODO(breaking): make API only work in non-singleton mode - -module.exports = exports = nopt -exports.clean = clean -exports.typeDefs = defaultTypeDefs -exports.lib = lib - -function nopt (types, shorthands, args = process.argv, slice = 2) { - return lib.nopt(args.slice(slice), { - types: types || {}, - shorthands: shorthands || {}, - typeDefs: exports.typeDefs, - invalidHandler: exports.invalidHandler, - }) -} - -function clean (data, types, typeDefs = exports.typeDefs) { - return lib.clean(data, { - types: types || {}, - typeDefs, - invalidHandler: exports.invalidHandler, - }) -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/nopt/lib/type-defs.js b/deps/npm/node_modules/node-gyp/node_modules/nopt/lib/type-defs.js deleted file mode 100644 index 608352ee248cc4..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/nopt/lib/type-defs.js +++ /dev/null @@ -1,91 +0,0 @@ -const url = require('url') -const path = require('path') -const Stream = require('stream').Stream -const os = require('os') -const debug = require('./debug') - -function validateString (data, k, val) { - data[k] = String(val) -} - -function validatePath (data, k, val) { - if (val === true) { - return false - } - if (val === null) { - return true - } - - val = String(val) - - const isWin = process.platform === 'win32' - const homePattern = isWin ? /^~(\/|\\)/ : /^~\// - const home = os.homedir() - - if (home && val.match(homePattern)) { - data[k] = path.resolve(home, val.slice(2)) - } else { - data[k] = path.resolve(val) - } - return true -} - -function validateNumber (data, k, val) { - debug('validate Number %j %j %j', k, val, isNaN(val)) - if (isNaN(val)) { - return false - } - data[k] = +val -} - -function validateDate (data, k, val) { - const s = Date.parse(val) - debug('validate Date %j %j %j', k, val, s) - if (isNaN(s)) { - return false - } - data[k] = new Date(val) -} - -function validateBoolean (data, k, val) { - if (typeof val === 'string') { - if (!isNaN(val)) { - val = !!(+val) - } else if (val === 'null' || val === 'false') { - val = false - } else { - val = true - } - } else { - val = !!val - } - data[k] = val -} - -function validateUrl (data, k, val) { - // Changing this would be a breaking change in the npm cli - /* eslint-disable-next-line node/no-deprecated-api */ - val = url.parse(String(val)) - if (!val.host) { - return false - } - data[k] = val.href -} - -function validateStream (data, k, val) { - if (!(val instanceof Stream)) { - return false - } - data[k] = val -} - -module.exports = { - String: { type: String, validate: validateString }, - Boolean: { type: Boolean, validate: validateBoolean }, - url: { type: url, validate: validateUrl }, - Number: { type: Number, validate: validateNumber }, - path: { type: path, validate: validatePath }, - Stream: { type: Stream, validate: validateStream }, - Date: { type: Date, validate: validateDate }, - Array: { type: Array }, -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/nopt/package.json b/deps/npm/node_modules/node-gyp/node_modules/nopt/package.json deleted file mode 100644 index 37b770ad487711..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/nopt/package.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "name": "nopt", - "version": "7.2.1", - "description": "Option parsing for Node, supporting types, shorthands, etc. Used by npm.", - "author": "GitHub Inc.", - "main": "lib/nopt.js", - "scripts": { - "test": "tap", - "lint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"", - "postlint": "template-oss-check", - "template-oss-apply": "template-oss-apply --force", - "lintfix": "npm run lint -- --fix", - "snap": "tap", - "posttest": "npm run lint" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/npm/nopt.git" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "license": "ISC", - "dependencies": { - "abbrev": "^2.0.0" - }, - "devDependencies": { - "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.22.0", - "tap": "^16.3.0" - }, - "tap": { - "nyc-arg": [ - "--exclude", - "tap-snapshots/**" - ] - }, - "files": [ - "bin/", - "lib/" - ], - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "templateOSS": { - "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "windowsCI": false, - "version": "4.22.0", - "publish": true - } -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/proc-log/LICENSE b/deps/npm/node_modules/node-gyp/node_modules/proc-log/LICENSE deleted file mode 100644 index 83837797202b70..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/proc-log/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) GitHub, Inc. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/deps/npm/node_modules/node-gyp/node_modules/proc-log/lib/index.js b/deps/npm/node_modules/node-gyp/node_modules/proc-log/lib/index.js deleted file mode 100644 index 86d90861078dab..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/proc-log/lib/index.js +++ /dev/null @@ -1,153 +0,0 @@ -const META = Symbol('proc-log.meta') -module.exports = { - META: META, - output: { - LEVELS: [ - 'standard', - 'error', - 'buffer', - 'flush', - ], - KEYS: { - standard: 'standard', - error: 'error', - buffer: 'buffer', - flush: 'flush', - }, - standard: function (...args) { - return process.emit('output', 'standard', ...args) - }, - error: function (...args) { - return process.emit('output', 'error', ...args) - }, - buffer: function (...args) { - return process.emit('output', 'buffer', ...args) - }, - flush: function (...args) { - return process.emit('output', 'flush', ...args) - }, - }, - log: { - LEVELS: [ - 'notice', - 'error', - 'warn', - 'info', - 'verbose', - 'http', - 'silly', - 'timing', - 'pause', - 'resume', - ], - KEYS: { - notice: 'notice', - error: 'error', - warn: 'warn', - info: 'info', - verbose: 'verbose', - http: 'http', - silly: 'silly', - timing: 'timing', - pause: 'pause', - resume: 'resume', - }, - error: function (...args) { - return process.emit('log', 'error', ...args) - }, - notice: function (...args) { - return process.emit('log', 'notice', ...args) - }, - warn: function (...args) { - return process.emit('log', 'warn', ...args) - }, - info: function (...args) { - return process.emit('log', 'info', ...args) - }, - verbose: function (...args) { - return process.emit('log', 'verbose', ...args) - }, - http: function (...args) { - return process.emit('log', 'http', ...args) - }, - silly: function (...args) { - return process.emit('log', 'silly', ...args) - }, - timing: function (...args) { - return process.emit('log', 'timing', ...args) - }, - pause: function () { - return process.emit('log', 'pause') - }, - resume: function () { - return process.emit('log', 'resume') - }, - }, - time: { - LEVELS: [ - 'start', - 'end', - ], - KEYS: { - start: 'start', - end: 'end', - }, - start: function (name, fn) { - process.emit('time', 'start', name) - function end () { - return process.emit('time', 'end', name) - } - if (typeof fn === 'function') { - const res = fn() - if (res && res.finally) { - return res.finally(end) - } - end() - return res - } - return end - }, - end: function (name) { - return process.emit('time', 'end', name) - }, - }, - input: { - LEVELS: [ - 'start', - 'end', - 'read', - ], - KEYS: { - start: 'start', - end: 'end', - read: 'read', - }, - start: function (fn) { - process.emit('input', 'start') - function end () { - return process.emit('input', 'end') - } - if (typeof fn === 'function') { - const res = fn() - if (res && res.finally) { - return res.finally(end) - } - end() - return res - } - return end - }, - end: function () { - return process.emit('input', 'end') - }, - read: function (...args) { - let resolve, reject - const promise = new Promise((_resolve, _reject) => { - resolve = _resolve - reject = _reject - }) - process.emit('input', 'read', resolve, reject, ...args) - return promise - }, - }, -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/proc-log/package.json b/deps/npm/node_modules/node-gyp/node_modules/proc-log/package.json deleted file mode 100644 index 4ab89102ecc9b5..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/proc-log/package.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "name": "proc-log", - "version": "4.2.0", - "files": [ - "bin/", - "lib/" - ], - "main": "lib/index.js", - "description": "just emit 'log' events on the process object", - "repository": { - "type": "git", - "url": "https://github.com/npm/proc-log.git" - }, - "author": "GitHub Inc.", - "license": "ISC", - "scripts": { - "test": "tap", - "snap": "tap", - "posttest": "npm run lint", - "postsnap": "eslint index.js test/*.js --fix", - "lint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"", - "postlint": "template-oss-check", - "lintfix": "npm run lint -- --fix", - "template-oss-apply": "template-oss-apply --force" - }, - "devDependencies": { - "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.21.3", - "tap": "^16.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "templateOSS": { - "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.21.3", - "publish": true - }, - "tap": { - "nyc-arg": [ - "--exclude", - "tap-snapshots/**" - ] - } -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/ssri/LICENSE.md b/deps/npm/node_modules/node-gyp/node_modules/ssri/LICENSE.md deleted file mode 100644 index e335388869f50f..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/ssri/LICENSE.md +++ /dev/null @@ -1,16 +0,0 @@ -ISC License - -Copyright 2021 (c) npm, Inc. - -Permission to use, copy, modify, and/or distribute this software for -any purpose with or without fee is hereby granted, provided that the -above copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE COPYRIGHT HOLDER DISCLAIMS -ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR -CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE -OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE -USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/deps/npm/node_modules/node-gyp/node_modules/ssri/lib/index.js b/deps/npm/node_modules/node-gyp/node_modules/ssri/lib/index.js deleted file mode 100644 index 7d749ed480fb98..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/ssri/lib/index.js +++ /dev/null @@ -1,580 +0,0 @@ -'use strict' - -const crypto = require('crypto') -const { Minipass } = require('minipass') - -const SPEC_ALGORITHMS = ['sha512', 'sha384', 'sha256'] -const DEFAULT_ALGORITHMS = ['sha512'] - -// TODO: this should really be a hardcoded list of algorithms we support, -// rather than [a-z0-9]. -const BASE64_REGEX = /^[a-z0-9+/]+(?:=?=?)$/i -const SRI_REGEX = /^([a-z0-9]+)-([^?]+)([?\S*]*)$/ -const STRICT_SRI_REGEX = /^([a-z0-9]+)-([A-Za-z0-9+/=]{44,88})(\?[\x21-\x7E]*)?$/ -const VCHAR_REGEX = /^[\x21-\x7E]+$/ - -const getOptString = options => options?.length ? `?${options.join('?')}` : '' - -class IntegrityStream extends Minipass { - #emittedIntegrity - #emittedSize - #emittedVerified - - constructor (opts) { - super() - this.size = 0 - this.opts = opts - - // may be overridden later, but set now for class consistency - this.#getOptions() - - // options used for calculating stream. can't be changed. - if (opts?.algorithms) { - this.algorithms = [...opts.algorithms] - } else { - this.algorithms = [...DEFAULT_ALGORITHMS] - } - if (this.algorithm !== null && !this.algorithms.includes(this.algorithm)) { - this.algorithms.push(this.algorithm) - } - - this.hashes = this.algorithms.map(crypto.createHash) - } - - #getOptions () { - // For verification - this.sri = this.opts?.integrity ? parse(this.opts?.integrity, this.opts) : null - this.expectedSize = this.opts?.size - - if (!this.sri) { - this.algorithm = null - } else if (this.sri.isHash) { - this.goodSri = true - this.algorithm = this.sri.algorithm - } else { - this.goodSri = !this.sri.isEmpty() - this.algorithm = this.sri.pickAlgorithm(this.opts) - } - - this.digests = this.goodSri ? this.sri[this.algorithm] : null - this.optString = getOptString(this.opts?.options) - } - - on (ev, handler) { - if (ev === 'size' && this.#emittedSize) { - return handler(this.#emittedSize) - } - - if (ev === 'integrity' && this.#emittedIntegrity) { - return handler(this.#emittedIntegrity) - } - - if (ev === 'verified' && this.#emittedVerified) { - return handler(this.#emittedVerified) - } - - return super.on(ev, handler) - } - - emit (ev, data) { - if (ev === 'end') { - this.#onEnd() - } - return super.emit(ev, data) - } - - write (data) { - this.size += data.length - this.hashes.forEach(h => h.update(data)) - return super.write(data) - } - - #onEnd () { - if (!this.goodSri) { - this.#getOptions() - } - const newSri = parse(this.hashes.map((h, i) => { - return `${this.algorithms[i]}-${h.digest('base64')}${this.optString}` - }).join(' '), this.opts) - // Integrity verification mode - const match = this.goodSri && newSri.match(this.sri, this.opts) - if (typeof this.expectedSize === 'number' && this.size !== this.expectedSize) { - /* eslint-disable-next-line max-len */ - const err = new Error(`stream size mismatch when checking ${this.sri}.\n Wanted: ${this.expectedSize}\n Found: ${this.size}`) - err.code = 'EBADSIZE' - err.found = this.size - err.expected = this.expectedSize - err.sri = this.sri - this.emit('error', err) - } else if (this.sri && !match) { - /* eslint-disable-next-line max-len */ - const err = new Error(`${this.sri} integrity checksum failed when using ${this.algorithm}: wanted ${this.digests} but got ${newSri}. (${this.size} bytes)`) - err.code = 'EINTEGRITY' - err.found = newSri - err.expected = this.digests - err.algorithm = this.algorithm - err.sri = this.sri - this.emit('error', err) - } else { - this.#emittedSize = this.size - this.emit('size', this.size) - this.#emittedIntegrity = newSri - this.emit('integrity', newSri) - if (match) { - this.#emittedVerified = match - this.emit('verified', match) - } - } - } -} - -class Hash { - get isHash () { - return true - } - - constructor (hash, opts) { - const strict = opts?.strict - this.source = hash.trim() - - // set default values so that we make V8 happy to - // always see a familiar object template. - this.digest = '' - this.algorithm = '' - this.options = [] - - // 3.1. Integrity metadata (called "Hash" by ssri) - // https://w3c.github.io/webappsec-subresource-integrity/#integrity-metadata-description - const match = this.source.match( - strict - ? STRICT_SRI_REGEX - : SRI_REGEX - ) - if (!match) { - return - } - if (strict && !SPEC_ALGORITHMS.includes(match[1])) { - return - } - this.algorithm = match[1] - this.digest = match[2] - - const rawOpts = match[3] - if (rawOpts) { - this.options = rawOpts.slice(1).split('?') - } - } - - hexDigest () { - return this.digest && Buffer.from(this.digest, 'base64').toString('hex') - } - - toJSON () { - return this.toString() - } - - match (integrity, opts) { - const other = parse(integrity, opts) - if (!other) { - return false - } - if (other.isIntegrity) { - const algo = other.pickAlgorithm(opts, [this.algorithm]) - - if (!algo) { - return false - } - - const foundHash = other[algo].find(hash => hash.digest === this.digest) - - if (foundHash) { - return foundHash - } - - return false - } - return other.digest === this.digest ? other : false - } - - toString (opts) { - if (opts?.strict) { - // Strict mode enforces the standard as close to the foot of the - // letter as it can. - if (!( - // The spec has very restricted productions for algorithms. - // https://www.w3.org/TR/CSP2/#source-list-syntax - SPEC_ALGORITHMS.includes(this.algorithm) && - // Usually, if someone insists on using a "different" base64, we - // leave it as-is, since there's multiple standards, and the - // specified is not a URL-safe variant. - // https://www.w3.org/TR/CSP2/#base64_value - this.digest.match(BASE64_REGEX) && - // Option syntax is strictly visual chars. - // https://w3c.github.io/webappsec-subresource-integrity/#grammardef-option-expression - // https://tools.ietf.org/html/rfc5234#appendix-B.1 - this.options.every(opt => opt.match(VCHAR_REGEX)) - )) { - return '' - } - } - return `${this.algorithm}-${this.digest}${getOptString(this.options)}` - } -} - -function integrityHashToString (toString, sep, opts, hashes) { - const toStringIsNotEmpty = toString !== '' - - let shouldAddFirstSep = false - let complement = '' - - const lastIndex = hashes.length - 1 - - for (let i = 0; i < lastIndex; i++) { - const hashString = Hash.prototype.toString.call(hashes[i], opts) - - if (hashString) { - shouldAddFirstSep = true - - complement += hashString - complement += sep - } - } - - const finalHashString = Hash.prototype.toString.call(hashes[lastIndex], opts) - - if (finalHashString) { - shouldAddFirstSep = true - complement += finalHashString - } - - if (toStringIsNotEmpty && shouldAddFirstSep) { - return toString + sep + complement - } - - return toString + complement -} - -class Integrity { - get isIntegrity () { - return true - } - - toJSON () { - return this.toString() - } - - isEmpty () { - return Object.keys(this).length === 0 - } - - toString (opts) { - let sep = opts?.sep || ' ' - let toString = '' - - if (opts?.strict) { - // Entries must be separated by whitespace, according to spec. - sep = sep.replace(/\S+/g, ' ') - - for (const hash of SPEC_ALGORITHMS) { - if (this[hash]) { - toString = integrityHashToString(toString, sep, opts, this[hash]) - } - } - } else { - for (const hash of Object.keys(this)) { - toString = integrityHashToString(toString, sep, opts, this[hash]) - } - } - - return toString - } - - concat (integrity, opts) { - const other = typeof integrity === 'string' - ? integrity - : stringify(integrity, opts) - return parse(`${this.toString(opts)} ${other}`, opts) - } - - hexDigest () { - return parse(this, { single: true }).hexDigest() - } - - // add additional hashes to an integrity value, but prevent - // *changing* an existing integrity hash. - merge (integrity, opts) { - const other = parse(integrity, opts) - for (const algo in other) { - if (this[algo]) { - if (!this[algo].find(hash => - other[algo].find(otherhash => - hash.digest === otherhash.digest))) { - throw new Error('hashes do not match, cannot update integrity') - } - } else { - this[algo] = other[algo] - } - } - } - - match (integrity, opts) { - const other = parse(integrity, opts) - if (!other) { - return false - } - const algo = other.pickAlgorithm(opts, Object.keys(this)) - return ( - !!algo && - this[algo] && - other[algo] && - this[algo].find(hash => - other[algo].find(otherhash => - hash.digest === otherhash.digest - ) - ) - ) || false - } - - // Pick the highest priority algorithm present, optionally also limited to a - // set of hashes found in another integrity. When limiting it may return - // nothing. - pickAlgorithm (opts, hashes) { - const pickAlgorithm = opts?.pickAlgorithm || getPrioritizedHash - const keys = Object.keys(this).filter(k => { - if (hashes?.length) { - return hashes.includes(k) - } - return true - }) - if (keys.length) { - return keys.reduce((acc, algo) => pickAlgorithm(acc, algo) || acc) - } - // no intersection between this and hashes, - return null - } -} - -module.exports.parse = parse -function parse (sri, opts) { - if (!sri) { - return null - } - if (typeof sri === 'string') { - return _parse(sri, opts) - } else if (sri.algorithm && sri.digest) { - const fullSri = new Integrity() - fullSri[sri.algorithm] = [sri] - return _parse(stringify(fullSri, opts), opts) - } else { - return _parse(stringify(sri, opts), opts) - } -} - -function _parse (integrity, opts) { - // 3.4.3. Parse metadata - // https://w3c.github.io/webappsec-subresource-integrity/#parse-metadata - if (opts?.single) { - return new Hash(integrity, opts) - } - const hashes = integrity.trim().split(/\s+/).reduce((acc, string) => { - const hash = new Hash(string, opts) - if (hash.algorithm && hash.digest) { - const algo = hash.algorithm - if (!acc[algo]) { - acc[algo] = [] - } - acc[algo].push(hash) - } - return acc - }, new Integrity()) - return hashes.isEmpty() ? null : hashes -} - -module.exports.stringify = stringify -function stringify (obj, opts) { - if (obj.algorithm && obj.digest) { - return Hash.prototype.toString.call(obj, opts) - } else if (typeof obj === 'string') { - return stringify(parse(obj, opts), opts) - } else { - return Integrity.prototype.toString.call(obj, opts) - } -} - -module.exports.fromHex = fromHex -function fromHex (hexDigest, algorithm, opts) { - const optString = getOptString(opts?.options) - return parse( - `${algorithm}-${ - Buffer.from(hexDigest, 'hex').toString('base64') - }${optString}`, opts - ) -} - -module.exports.fromData = fromData -function fromData (data, opts) { - const algorithms = opts?.algorithms || [...DEFAULT_ALGORITHMS] - const optString = getOptString(opts?.options) - return algorithms.reduce((acc, algo) => { - const digest = crypto.createHash(algo).update(data).digest('base64') - const hash = new Hash( - `${algo}-${digest}${optString}`, - opts - ) - /* istanbul ignore else - it would be VERY strange if the string we - * just calculated with an algo did not have an algo or digest. - */ - if (hash.algorithm && hash.digest) { - const hashAlgo = hash.algorithm - if (!acc[hashAlgo]) { - acc[hashAlgo] = [] - } - acc[hashAlgo].push(hash) - } - return acc - }, new Integrity()) -} - -module.exports.fromStream = fromStream -function fromStream (stream, opts) { - const istream = integrityStream(opts) - return new Promise((resolve, reject) => { - stream.pipe(istream) - stream.on('error', reject) - istream.on('error', reject) - let sri - istream.on('integrity', s => { - sri = s - }) - istream.on('end', () => resolve(sri)) - istream.resume() - }) -} - -module.exports.checkData = checkData -function checkData (data, sri, opts) { - sri = parse(sri, opts) - if (!sri || !Object.keys(sri).length) { - if (opts?.error) { - throw Object.assign( - new Error('No valid integrity hashes to check against'), { - code: 'EINTEGRITY', - } - ) - } else { - return false - } - } - const algorithm = sri.pickAlgorithm(opts) - const digest = crypto.createHash(algorithm).update(data).digest('base64') - const newSri = parse({ algorithm, digest }) - const match = newSri.match(sri, opts) - opts = opts || {} - if (match || !(opts.error)) { - return match - } else if (typeof opts.size === 'number' && (data.length !== opts.size)) { - /* eslint-disable-next-line max-len */ - const err = new Error(`data size mismatch when checking ${sri}.\n Wanted: ${opts.size}\n Found: ${data.length}`) - err.code = 'EBADSIZE' - err.found = data.length - err.expected = opts.size - err.sri = sri - throw err - } else { - /* eslint-disable-next-line max-len */ - const err = new Error(`Integrity checksum failed when using ${algorithm}: Wanted ${sri}, but got ${newSri}. (${data.length} bytes)`) - err.code = 'EINTEGRITY' - err.found = newSri - err.expected = sri - err.algorithm = algorithm - err.sri = sri - throw err - } -} - -module.exports.checkStream = checkStream -function checkStream (stream, sri, opts) { - opts = opts || Object.create(null) - opts.integrity = sri - sri = parse(sri, opts) - if (!sri || !Object.keys(sri).length) { - return Promise.reject(Object.assign( - new Error('No valid integrity hashes to check against'), { - code: 'EINTEGRITY', - } - )) - } - const checker = integrityStream(opts) - return new Promise((resolve, reject) => { - stream.pipe(checker) - stream.on('error', reject) - checker.on('error', reject) - let verified - checker.on('verified', s => { - verified = s - }) - checker.on('end', () => resolve(verified)) - checker.resume() - }) -} - -module.exports.integrityStream = integrityStream -function integrityStream (opts = Object.create(null)) { - return new IntegrityStream(opts) -} - -module.exports.create = createIntegrity -function createIntegrity (opts) { - const algorithms = opts?.algorithms || [...DEFAULT_ALGORITHMS] - const optString = getOptString(opts?.options) - - const hashes = algorithms.map(crypto.createHash) - - return { - update: function (chunk, enc) { - hashes.forEach(h => h.update(chunk, enc)) - return this - }, - digest: function () { - const integrity = algorithms.reduce((acc, algo) => { - const digest = hashes.shift().digest('base64') - const hash = new Hash( - `${algo}-${digest}${optString}`, - opts - ) - /* istanbul ignore else - it would be VERY strange if the hash we - * just calculated with an algo did not have an algo or digest. - */ - if (hash.algorithm && hash.digest) { - const hashAlgo = hash.algorithm - if (!acc[hashAlgo]) { - acc[hashAlgo] = [] - } - acc[hashAlgo].push(hash) - } - return acc - }, new Integrity()) - - return integrity - }, - } -} - -const NODE_HASHES = crypto.getHashes() - -// This is a Best Effort™ at a reasonable priority for hash algos -const DEFAULT_PRIORITY = [ - 'md5', 'whirlpool', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512', - // TODO - it's unclear _which_ of these Node will actually use as its name - // for the algorithm, so we guesswork it based on the OpenSSL names. - 'sha3', - 'sha3-256', 'sha3-384', 'sha3-512', - 'sha3_256', 'sha3_384', 'sha3_512', -].filter(algo => NODE_HASHES.includes(algo)) - -function getPrioritizedHash (algo1, algo2) { - /* eslint-disable-next-line max-len */ - return DEFAULT_PRIORITY.indexOf(algo1.toLowerCase()) >= DEFAULT_PRIORITY.indexOf(algo2.toLowerCase()) - ? algo1 - : algo2 -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/ssri/package.json b/deps/npm/node_modules/node-gyp/node_modules/ssri/package.json deleted file mode 100644 index 28395414e4643c..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/ssri/package.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "name": "ssri", - "version": "10.0.6", - "description": "Standard Subresource Integrity library -- parses, serializes, generates, and verifies integrity metadata according to the SRI spec.", - "main": "lib/index.js", - "files": [ - "bin/", - "lib/" - ], - "scripts": { - "prerelease": "npm t", - "postrelease": "npm publish", - "posttest": "npm run lint", - "test": "tap", - "coverage": "tap", - "lint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"", - "postlint": "template-oss-check", - "template-oss-apply": "template-oss-apply --force", - "lintfix": "npm run lint -- --fix", - "snap": "tap" - }, - "tap": { - "check-coverage": true, - "nyc-arg": [ - "--exclude", - "tap-snapshots/**" - ] - }, - "repository": { - "type": "git", - "url": "git+https://github.com/npm/ssri.git" - }, - "keywords": [ - "w3c", - "web", - "security", - "integrity", - "checksum", - "hashing", - "subresource integrity", - "sri", - "sri hash", - "sri string", - "sri generator", - "html" - ], - "author": "GitHub Inc.", - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "devDependencies": { - "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.22.0", - "tap": "^16.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "templateOSS": { - "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.22.0", - "publish": "true" - } -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/nopt/LICENSE b/deps/npm/node_modules/node-gyp/node_modules/tar/LICENSE similarity index 100% rename from deps/npm/node_modules/node-gyp/node_modules/nopt/LICENSE rename to deps/npm/node_modules/node-gyp/node_modules/tar/LICENSE diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/create.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/create.js new file mode 100644 index 00000000000000..3190afc48318f9 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/create.js @@ -0,0 +1,83 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.create = void 0; +const fs_minipass_1 = require("@isaacs/fs-minipass"); +const node_path_1 = __importDefault(require("node:path")); +const list_js_1 = require("./list.js"); +const make_command_js_1 = require("./make-command.js"); +const pack_js_1 = require("./pack.js"); +const createFileSync = (opt, files) => { + const p = new pack_js_1.PackSync(opt); + const stream = new fs_minipass_1.WriteStreamSync(opt.file, { + mode: opt.mode || 0o666, + }); + p.pipe(stream); + addFilesSync(p, files); +}; +const createFile = (opt, files) => { + const p = new pack_js_1.Pack(opt); + const stream = new fs_minipass_1.WriteStream(opt.file, { + mode: opt.mode || 0o666, + }); + p.pipe(stream); + const promise = new Promise((res, rej) => { + stream.on('error', rej); + stream.on('close', res); + p.on('error', rej); + }); + addFilesAsync(p, files); + return promise; +}; +const addFilesSync = (p, files) => { + files.forEach(file => { + if (file.charAt(0) === '@') { + (0, list_js_1.list)({ + file: node_path_1.default.resolve(p.cwd, file.slice(1)), + sync: true, + noResume: true, + onReadEntry: entry => p.add(entry), + }); + } + else { + p.add(file); + } + }); + p.end(); +}; +const addFilesAsync = async (p, files) => { + for (let i = 0; i < files.length; i++) { + const file = String(files[i]); + if (file.charAt(0) === '@') { + await (0, list_js_1.list)({ + file: node_path_1.default.resolve(String(p.cwd), file.slice(1)), + noResume: true, + onReadEntry: entry => { + p.add(entry); + }, + }); + } + else { + p.add(file); + } + } + p.end(); +}; +const createSync = (opt, files) => { + const p = new pack_js_1.PackSync(opt); + addFilesSync(p, files); + return p; +}; +const createAsync = (opt, files) => { + const p = new pack_js_1.Pack(opt); + addFilesAsync(p, files); + return p; +}; +exports.create = (0, make_command_js_1.makeCommand)(createFileSync, createFile, createSync, createAsync, (_opt, files) => { + if (!files?.length) { + throw new TypeError('no paths specified to add to archive'); + } +}); +//# sourceMappingURL=create.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/cwd-error.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/cwd-error.js new file mode 100644 index 00000000000000..d703a7772be3a5 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/cwd-error.js @@ -0,0 +1,18 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CwdError = void 0; +class CwdError extends Error { + path; + code; + syscall = 'chdir'; + constructor(path, code) { + super(`${code}: Cannot cd into '${path}'`); + this.path = path; + this.code = code; + } + get name() { + return 'CwdError'; + } +} +exports.CwdError = CwdError; +//# sourceMappingURL=cwd-error.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/extract.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/extract.js new file mode 100644 index 00000000000000..f848cbcbf779e8 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/extract.js @@ -0,0 +1,78 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.extract = void 0; +// tar -x +const fsm = __importStar(require("@isaacs/fs-minipass")); +const node_fs_1 = __importDefault(require("node:fs")); +const list_js_1 = require("./list.js"); +const make_command_js_1 = require("./make-command.js"); +const unpack_js_1 = require("./unpack.js"); +const extractFileSync = (opt) => { + const u = new unpack_js_1.UnpackSync(opt); + const file = opt.file; + const stat = node_fs_1.default.statSync(file); + // This trades a zero-byte read() syscall for a stat + // However, it will usually result in less memory allocation + const readSize = opt.maxReadSize || 16 * 1024 * 1024; + const stream = new fsm.ReadStreamSync(file, { + readSize: readSize, + size: stat.size, + }); + stream.pipe(u); +}; +const extractFile = (opt, _) => { + const u = new unpack_js_1.Unpack(opt); + const readSize = opt.maxReadSize || 16 * 1024 * 1024; + const file = opt.file; + const p = new Promise((resolve, reject) => { + u.on('error', reject); + u.on('close', resolve); + // This trades a zero-byte read() syscall for a stat + // However, it will usually result in less memory allocation + node_fs_1.default.stat(file, (er, stat) => { + if (er) { + reject(er); + } + else { + const stream = new fsm.ReadStream(file, { + readSize: readSize, + size: stat.size, + }); + stream.on('error', reject); + stream.pipe(u); + } + }); + }); + return p; +}; +exports.extract = (0, make_command_js_1.makeCommand)(extractFileSync, extractFile, opt => new unpack_js_1.UnpackSync(opt), opt => new unpack_js_1.Unpack(opt), (opt, files) => { + if (files?.length) + (0, list_js_1.filesFilter)(opt, files); +}); +//# sourceMappingURL=extract.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/get-write-flag.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/get-write-flag.js new file mode 100644 index 00000000000000..94add8f6b2231c --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/get-write-flag.js @@ -0,0 +1,29 @@ +"use strict"; +// Get the appropriate flag to use for creating files +// We use fmap on Windows platforms for files less than +// 512kb. This is a fairly low limit, but avoids making +// things slower in some cases. Since most of what this +// library is used for is extracting tarballs of many +// relatively small files in npm packages and the like, +// it can be a big boost on Windows platforms. +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getWriteFlag = void 0; +const fs_1 = __importDefault(require("fs")); +const platform = process.env.__FAKE_PLATFORM__ || process.platform; +const isWindows = platform === 'win32'; +/* c8 ignore start */ +const { O_CREAT, O_TRUNC, O_WRONLY } = fs_1.default.constants; +const UV_FS_O_FILEMAP = Number(process.env.__FAKE_FS_O_FILENAME__) || + fs_1.default.constants.UV_FS_O_FILEMAP || + 0; +/* c8 ignore stop */ +const fMapEnabled = isWindows && !!UV_FS_O_FILEMAP; +const fMapLimit = 512 * 1024; +const fMapFlag = UV_FS_O_FILEMAP | O_TRUNC | O_CREAT | O_WRONLY; +exports.getWriteFlag = !fMapEnabled ? + () => 'w' + : (size) => (size < fMapLimit ? fMapFlag : 'w'); +//# sourceMappingURL=get-write-flag.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/header.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/header.js new file mode 100644 index 00000000000000..b3a48037b849ab --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/header.js @@ -0,0 +1,306 @@ +"use strict"; +// parse a 512-byte header block to a data object, or vice-versa +// encode returns `true` if a pax extended header is needed, because +// the data could not be faithfully encoded in a simple header. +// (Also, check header.needPax to see if it needs a pax header.) +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Header = void 0; +const node_path_1 = require("node:path"); +const large = __importStar(require("./large-numbers.js")); +const types = __importStar(require("./types.js")); +class Header { + cksumValid = false; + needPax = false; + nullBlock = false; + block; + path; + mode; + uid; + gid; + size; + cksum; + #type = 'Unsupported'; + linkpath; + uname; + gname; + devmaj = 0; + devmin = 0; + atime; + ctime; + mtime; + charset; + comment; + constructor(data, off = 0, ex, gex) { + if (Buffer.isBuffer(data)) { + this.decode(data, off || 0, ex, gex); + } + else if (data) { + this.#slurp(data); + } + } + decode(buf, off, ex, gex) { + if (!off) { + off = 0; + } + if (!buf || !(buf.length >= off + 512)) { + throw new Error('need 512 bytes for header'); + } + this.path = decString(buf, off, 100); + this.mode = decNumber(buf, off + 100, 8); + this.uid = decNumber(buf, off + 108, 8); + this.gid = decNumber(buf, off + 116, 8); + this.size = decNumber(buf, off + 124, 12); + this.mtime = decDate(buf, off + 136, 12); + this.cksum = decNumber(buf, off + 148, 12); + // if we have extended or global extended headers, apply them now + // See https://github.com/npm/node-tar/pull/187 + // Apply global before local, so it overrides + if (gex) + this.#slurp(gex, true); + if (ex) + this.#slurp(ex); + // old tar versions marked dirs as a file with a trailing / + const t = decString(buf, off + 156, 1); + if (types.isCode(t)) { + this.#type = t || '0'; + } + if (this.#type === '0' && this.path.slice(-1) === '/') { + this.#type = '5'; + } + // tar implementations sometimes incorrectly put the stat(dir).size + // as the size in the tarball, even though Directory entries are + // not able to have any body at all. In the very rare chance that + // it actually DOES have a body, we weren't going to do anything with + // it anyway, and it'll just be a warning about an invalid header. + if (this.#type === '5') { + this.size = 0; + } + this.linkpath = decString(buf, off + 157, 100); + if (buf.subarray(off + 257, off + 265).toString() === + 'ustar\u000000') { + this.uname = decString(buf, off + 265, 32); + this.gname = decString(buf, off + 297, 32); + /* c8 ignore start */ + this.devmaj = decNumber(buf, off + 329, 8) ?? 0; + this.devmin = decNumber(buf, off + 337, 8) ?? 0; + /* c8 ignore stop */ + if (buf[off + 475] !== 0) { + // definitely a prefix, definitely >130 chars. + const prefix = decString(buf, off + 345, 155); + this.path = prefix + '/' + this.path; + } + else { + const prefix = decString(buf, off + 345, 130); + if (prefix) { + this.path = prefix + '/' + this.path; + } + this.atime = decDate(buf, off + 476, 12); + this.ctime = decDate(buf, off + 488, 12); + } + } + let sum = 8 * 0x20; + for (let i = off; i < off + 148; i++) { + sum += buf[i]; + } + for (let i = off + 156; i < off + 512; i++) { + sum += buf[i]; + } + this.cksumValid = sum === this.cksum; + if (this.cksum === undefined && sum === 8 * 0x20) { + this.nullBlock = true; + } + } + #slurp(ex, gex = false) { + Object.assign(this, Object.fromEntries(Object.entries(ex).filter(([k, v]) => { + // we slurp in everything except for the path attribute in + // a global extended header, because that's weird. Also, any + // null/undefined values are ignored. + return !(v === null || + v === undefined || + (k === 'path' && gex) || + (k === 'linkpath' && gex) || + k === 'global'); + }))); + } + encode(buf, off = 0) { + if (!buf) { + buf = this.block = Buffer.alloc(512); + } + if (this.#type === 'Unsupported') { + this.#type = '0'; + } + if (!(buf.length >= off + 512)) { + throw new Error('need 512 bytes for header'); + } + const prefixSize = this.ctime || this.atime ? 130 : 155; + const split = splitPrefix(this.path || '', prefixSize); + const path = split[0]; + const prefix = split[1]; + this.needPax = !!split[2]; + this.needPax = encString(buf, off, 100, path) || this.needPax; + this.needPax = + encNumber(buf, off + 100, 8, this.mode) || this.needPax; + this.needPax = + encNumber(buf, off + 108, 8, this.uid) || this.needPax; + this.needPax = + encNumber(buf, off + 116, 8, this.gid) || this.needPax; + this.needPax = + encNumber(buf, off + 124, 12, this.size) || this.needPax; + this.needPax = + encDate(buf, off + 136, 12, this.mtime) || this.needPax; + buf[off + 156] = this.#type.charCodeAt(0); + this.needPax = + encString(buf, off + 157, 100, this.linkpath) || this.needPax; + buf.write('ustar\u000000', off + 257, 8); + this.needPax = + encString(buf, off + 265, 32, this.uname) || this.needPax; + this.needPax = + encString(buf, off + 297, 32, this.gname) || this.needPax; + this.needPax = + encNumber(buf, off + 329, 8, this.devmaj) || this.needPax; + this.needPax = + encNumber(buf, off + 337, 8, this.devmin) || this.needPax; + this.needPax = + encString(buf, off + 345, prefixSize, prefix) || this.needPax; + if (buf[off + 475] !== 0) { + this.needPax = + encString(buf, off + 345, 155, prefix) || this.needPax; + } + else { + this.needPax = + encString(buf, off + 345, 130, prefix) || this.needPax; + this.needPax = + encDate(buf, off + 476, 12, this.atime) || this.needPax; + this.needPax = + encDate(buf, off + 488, 12, this.ctime) || this.needPax; + } + let sum = 8 * 0x20; + for (let i = off; i < off + 148; i++) { + sum += buf[i]; + } + for (let i = off + 156; i < off + 512; i++) { + sum += buf[i]; + } + this.cksum = sum; + encNumber(buf, off + 148, 8, this.cksum); + this.cksumValid = true; + return this.needPax; + } + get type() { + return (this.#type === 'Unsupported' ? + this.#type + : types.name.get(this.#type)); + } + get typeKey() { + return this.#type; + } + set type(type) { + const c = String(types.code.get(type)); + if (types.isCode(c) || c === 'Unsupported') { + this.#type = c; + } + else if (types.isCode(type)) { + this.#type = type; + } + else { + throw new TypeError('invalid entry type: ' + type); + } + } +} +exports.Header = Header; +const splitPrefix = (p, prefixSize) => { + const pathSize = 100; + let pp = p; + let prefix = ''; + let ret = undefined; + const root = node_path_1.posix.parse(p).root || '.'; + if (Buffer.byteLength(pp) < pathSize) { + ret = [pp, prefix, false]; + } + else { + // first set prefix to the dir, and path to the base + prefix = node_path_1.posix.dirname(pp); + pp = node_path_1.posix.basename(pp); + do { + if (Buffer.byteLength(pp) <= pathSize && + Buffer.byteLength(prefix) <= prefixSize) { + // both fit! + ret = [pp, prefix, false]; + } + else if (Buffer.byteLength(pp) > pathSize && + Buffer.byteLength(prefix) <= prefixSize) { + // prefix fits in prefix, but path doesn't fit in path + ret = [pp.slice(0, pathSize - 1), prefix, true]; + } + else { + // make path take a bit from prefix + pp = node_path_1.posix.join(node_path_1.posix.basename(prefix), pp); + prefix = node_path_1.posix.dirname(prefix); + } + } while (prefix !== root && ret === undefined); + // at this point, found no resolution, just truncate + if (!ret) { + ret = [p.slice(0, pathSize - 1), '', true]; + } + } + return ret; +}; +const decString = (buf, off, size) => buf + .subarray(off, off + size) + .toString('utf8') + .replace(/\0.*/, ''); +const decDate = (buf, off, size) => numToDate(decNumber(buf, off, size)); +const numToDate = (num) => num === undefined ? undefined : new Date(num * 1000); +const decNumber = (buf, off, size) => Number(buf[off]) & 0x80 ? + large.parse(buf.subarray(off, off + size)) + : decSmallNumber(buf, off, size); +const nanUndef = (value) => (isNaN(value) ? undefined : value); +const decSmallNumber = (buf, off, size) => nanUndef(parseInt(buf + .subarray(off, off + size) + .toString('utf8') + .replace(/\0.*$/, '') + .trim(), 8)); +// the maximum encodable as a null-terminated octal, by field size +const MAXNUM = { + 12: 0o77777777777, + 8: 0o7777777, +}; +const encNumber = (buf, off, size, num) => num === undefined ? false + : num > MAXNUM[size] || num < 0 ? + (large.encode(num, buf.subarray(off, off + size)), true) + : (encSmallNumber(buf, off, size, num), false); +const encSmallNumber = (buf, off, size, num) => buf.write(octalString(num, size), off, size, 'ascii'); +const octalString = (num, size) => padOctal(Math.floor(num).toString(8), size); +const padOctal = (str, size) => (str.length === size - 1 ? + str + : new Array(size - str.length - 1).join('0') + str + ' ') + '\0'; +const encDate = (buf, off, size, date) => date === undefined ? false : (encNumber(buf, off, size, date.getTime() / 1000)); +// enough to fill the longest string we've got +const NULLS = new Array(156).join('\0'); +// pad with nulls, return true if it's longer or non-ascii +const encString = (buf, off, size, str) => str === undefined ? false : ((buf.write(str + NULLS, off, size, 'utf8'), + str.length !== Buffer.byteLength(str) || str.length > size)); +//# sourceMappingURL=header.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/index.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/index.js new file mode 100644 index 00000000000000..e93ed5ad54aa6e --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/index.js @@ -0,0 +1,54 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.u = exports.types = exports.r = exports.t = exports.x = exports.c = void 0; +__exportStar(require("./create.js"), exports); +var create_js_1 = require("./create.js"); +Object.defineProperty(exports, "c", { enumerable: true, get: function () { return create_js_1.create; } }); +__exportStar(require("./extract.js"), exports); +var extract_js_1 = require("./extract.js"); +Object.defineProperty(exports, "x", { enumerable: true, get: function () { return extract_js_1.extract; } }); +__exportStar(require("./header.js"), exports); +__exportStar(require("./list.js"), exports); +var list_js_1 = require("./list.js"); +Object.defineProperty(exports, "t", { enumerable: true, get: function () { return list_js_1.list; } }); +// classes +__exportStar(require("./pack.js"), exports); +__exportStar(require("./parse.js"), exports); +__exportStar(require("./pax.js"), exports); +__exportStar(require("./read-entry.js"), exports); +__exportStar(require("./replace.js"), exports); +var replace_js_1 = require("./replace.js"); +Object.defineProperty(exports, "r", { enumerable: true, get: function () { return replace_js_1.replace; } }); +exports.types = __importStar(require("./types.js")); +__exportStar(require("./unpack.js"), exports); +__exportStar(require("./update.js"), exports); +var update_js_1 = require("./update.js"); +Object.defineProperty(exports, "u", { enumerable: true, get: function () { return update_js_1.update; } }); +__exportStar(require("./write-entry.js"), exports); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/large-numbers.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/large-numbers.js new file mode 100644 index 00000000000000..5b07aa7f71b48d --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/large-numbers.js @@ -0,0 +1,99 @@ +"use strict"; +// Tar can encode large and negative numbers using a leading byte of +// 0xff for negative, and 0x80 for positive. +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parse = exports.encode = void 0; +const encode = (num, buf) => { + if (!Number.isSafeInteger(num)) { + // The number is so large that javascript cannot represent it with integer + // precision. + throw Error('cannot encode number outside of javascript safe integer range'); + } + else if (num < 0) { + encodeNegative(num, buf); + } + else { + encodePositive(num, buf); + } + return buf; +}; +exports.encode = encode; +const encodePositive = (num, buf) => { + buf[0] = 0x80; + for (var i = buf.length; i > 1; i--) { + buf[i - 1] = num & 0xff; + num = Math.floor(num / 0x100); + } +}; +const encodeNegative = (num, buf) => { + buf[0] = 0xff; + var flipped = false; + num = num * -1; + for (var i = buf.length; i > 1; i--) { + var byte = num & 0xff; + num = Math.floor(num / 0x100); + if (flipped) { + buf[i - 1] = onesComp(byte); + } + else if (byte === 0) { + buf[i - 1] = 0; + } + else { + flipped = true; + buf[i - 1] = twosComp(byte); + } + } +}; +const parse = (buf) => { + const pre = buf[0]; + const value = pre === 0x80 ? pos(buf.subarray(1, buf.length)) + : pre === 0xff ? twos(buf) + : null; + if (value === null) { + throw Error('invalid base256 encoding'); + } + if (!Number.isSafeInteger(value)) { + // The number is so large that javascript cannot represent it with integer + // precision. + throw Error('parsed number outside of javascript safe integer range'); + } + return value; +}; +exports.parse = parse; +const twos = (buf) => { + var len = buf.length; + var sum = 0; + var flipped = false; + for (var i = len - 1; i > -1; i--) { + var byte = Number(buf[i]); + var f; + if (flipped) { + f = onesComp(byte); + } + else if (byte === 0) { + f = byte; + } + else { + flipped = true; + f = twosComp(byte); + } + if (f !== 0) { + sum -= f * Math.pow(256, len - i - 1); + } + } + return sum; +}; +const pos = (buf) => { + var len = buf.length; + var sum = 0; + for (var i = len - 1; i > -1; i--) { + var byte = Number(buf[i]); + if (byte !== 0) { + sum += byte * Math.pow(256, len - i - 1); + } + } + return sum; +}; +const onesComp = (byte) => (0xff ^ byte) & 0xff; +const twosComp = (byte) => ((0xff ^ byte) + 1) & 0xff; +//# sourceMappingURL=large-numbers.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/list.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/list.js new file mode 100644 index 00000000000000..3cd34bb4bad481 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/list.js @@ -0,0 +1,136 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.list = exports.filesFilter = void 0; +// tar -t +const fsm = __importStar(require("@isaacs/fs-minipass")); +const node_fs_1 = __importDefault(require("node:fs")); +const path_1 = require("path"); +const make_command_js_1 = require("./make-command.js"); +const parse_js_1 = require("./parse.js"); +const strip_trailing_slashes_js_1 = require("./strip-trailing-slashes.js"); +const onReadEntryFunction = (opt) => { + const onReadEntry = opt.onReadEntry; + opt.onReadEntry = + onReadEntry ? + e => { + onReadEntry(e); + e.resume(); + } + : e => e.resume(); +}; +// construct a filter that limits the file entries listed +// include child entries if a dir is included +const filesFilter = (opt, files) => { + const map = new Map(files.map(f => [(0, strip_trailing_slashes_js_1.stripTrailingSlashes)(f), true])); + const filter = opt.filter; + const mapHas = (file, r = '') => { + const root = r || (0, path_1.parse)(file).root || '.'; + let ret; + if (file === root) + ret = false; + else { + const m = map.get(file); + if (m !== undefined) { + ret = m; + } + else { + ret = mapHas((0, path_1.dirname)(file), root); + } + } + map.set(file, ret); + return ret; + }; + opt.filter = + filter ? + (file, entry) => filter(file, entry) && mapHas((0, strip_trailing_slashes_js_1.stripTrailingSlashes)(file)) + : file => mapHas((0, strip_trailing_slashes_js_1.stripTrailingSlashes)(file)); +}; +exports.filesFilter = filesFilter; +const listFileSync = (opt) => { + const p = new parse_js_1.Parser(opt); + const file = opt.file; + let fd; + try { + const stat = node_fs_1.default.statSync(file); + const readSize = opt.maxReadSize || 16 * 1024 * 1024; + if (stat.size < readSize) { + p.end(node_fs_1.default.readFileSync(file)); + } + else { + let pos = 0; + const buf = Buffer.allocUnsafe(readSize); + fd = node_fs_1.default.openSync(file, 'r'); + while (pos < stat.size) { + const bytesRead = node_fs_1.default.readSync(fd, buf, 0, readSize, pos); + pos += bytesRead; + p.write(buf.subarray(0, bytesRead)); + } + p.end(); + } + } + finally { + if (typeof fd === 'number') { + try { + node_fs_1.default.closeSync(fd); + /* c8 ignore next */ + } + catch (er) { } + } + } +}; +const listFile = (opt, _files) => { + const parse = new parse_js_1.Parser(opt); + const readSize = opt.maxReadSize || 16 * 1024 * 1024; + const file = opt.file; + const p = new Promise((resolve, reject) => { + parse.on('error', reject); + parse.on('end', resolve); + node_fs_1.default.stat(file, (er, stat) => { + if (er) { + reject(er); + } + else { + const stream = new fsm.ReadStream(file, { + readSize: readSize, + size: stat.size, + }); + stream.on('error', reject); + stream.pipe(parse); + } + }); + }); + return p; +}; +exports.list = (0, make_command_js_1.makeCommand)(listFileSync, listFile, opt => new parse_js_1.Parser(opt), opt => new parse_js_1.Parser(opt), (opt, files) => { + if (files?.length) + (0, exports.filesFilter)(opt, files); + if (!opt.noResume) + onReadEntryFunction(opt); +}); +//# sourceMappingURL=list.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/make-command.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/make-command.js new file mode 100644 index 00000000000000..1814319e78bc62 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/make-command.js @@ -0,0 +1,61 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.makeCommand = void 0; +const options_js_1 = require("./options.js"); +const makeCommand = (syncFile, asyncFile, syncNoFile, asyncNoFile, validate) => { + return Object.assign((opt_ = [], entries, cb) => { + if (Array.isArray(opt_)) { + entries = opt_; + opt_ = {}; + } + if (typeof entries === 'function') { + cb = entries; + entries = undefined; + } + if (!entries) { + entries = []; + } + else { + entries = Array.from(entries); + } + const opt = (0, options_js_1.dealias)(opt_); + validate?.(opt, entries); + if ((0, options_js_1.isSyncFile)(opt)) { + if (typeof cb === 'function') { + throw new TypeError('callback not supported for sync tar functions'); + } + return syncFile(opt, entries); + } + else if ((0, options_js_1.isAsyncFile)(opt)) { + const p = asyncFile(opt, entries); + // weirdness to make TS happy + const c = cb ? cb : undefined; + return c ? p.then(() => c(), c) : p; + } + else if ((0, options_js_1.isSyncNoFile)(opt)) { + if (typeof cb === 'function') { + throw new TypeError('callback not supported for sync tar functions'); + } + return syncNoFile(opt, entries); + } + else if ((0, options_js_1.isAsyncNoFile)(opt)) { + if (typeof cb === 'function') { + throw new TypeError('callback only supported with file option'); + } + return asyncNoFile(opt, entries); + /* c8 ignore start */ + } + else { + throw new Error('impossible options??'); + } + /* c8 ignore stop */ + }, { + syncFile, + asyncFile, + syncNoFile, + asyncNoFile, + validate, + }); +}; +exports.makeCommand = makeCommand; +//# sourceMappingURL=make-command.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/mkdir.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/mkdir.js new file mode 100644 index 00000000000000..2b13ecbab6723e --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/mkdir.js @@ -0,0 +1,209 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.mkdirSync = exports.mkdir = void 0; +const chownr_1 = require("chownr"); +const fs_1 = __importDefault(require("fs")); +const mkdirp_1 = require("mkdirp"); +const node_path_1 = __importDefault(require("node:path")); +const cwd_error_js_1 = require("./cwd-error.js"); +const normalize_windows_path_js_1 = require("./normalize-windows-path.js"); +const symlink_error_js_1 = require("./symlink-error.js"); +const cGet = (cache, key) => cache.get((0, normalize_windows_path_js_1.normalizeWindowsPath)(key)); +const cSet = (cache, key, val) => cache.set((0, normalize_windows_path_js_1.normalizeWindowsPath)(key), val); +const checkCwd = (dir, cb) => { + fs_1.default.stat(dir, (er, st) => { + if (er || !st.isDirectory()) { + er = new cwd_error_js_1.CwdError(dir, er?.code || 'ENOTDIR'); + } + cb(er); + }); +}; +/** + * Wrapper around mkdirp for tar's needs. + * + * The main purpose is to avoid creating directories if we know that + * they already exist (and track which ones exist for this purpose), + * and prevent entries from being extracted into symlinked folders, + * if `preservePaths` is not set. + */ +const mkdir = (dir, opt, cb) => { + dir = (0, normalize_windows_path_js_1.normalizeWindowsPath)(dir); + // if there's any overlap between mask and mode, + // then we'll need an explicit chmod + /* c8 ignore next */ + const umask = opt.umask ?? 0o22; + const mode = opt.mode | 0o0700; + const needChmod = (mode & umask) !== 0; + const uid = opt.uid; + const gid = opt.gid; + const doChown = typeof uid === 'number' && + typeof gid === 'number' && + (uid !== opt.processUid || gid !== opt.processGid); + const preserve = opt.preserve; + const unlink = opt.unlink; + const cache = opt.cache; + const cwd = (0, normalize_windows_path_js_1.normalizeWindowsPath)(opt.cwd); + const done = (er, created) => { + if (er) { + cb(er); + } + else { + cSet(cache, dir, true); + if (created && doChown) { + (0, chownr_1.chownr)(created, uid, gid, er => done(er)); + } + else if (needChmod) { + fs_1.default.chmod(dir, mode, cb); + } + else { + cb(); + } + } + }; + if (cache && cGet(cache, dir) === true) { + return done(); + } + if (dir === cwd) { + return checkCwd(dir, done); + } + if (preserve) { + return (0, mkdirp_1.mkdirp)(dir, { mode }).then(made => done(null, made ?? undefined), // oh, ts + done); + } + const sub = (0, normalize_windows_path_js_1.normalizeWindowsPath)(node_path_1.default.relative(cwd, dir)); + const parts = sub.split('/'); + mkdir_(cwd, parts, mode, cache, unlink, cwd, undefined, done); +}; +exports.mkdir = mkdir; +const mkdir_ = (base, parts, mode, cache, unlink, cwd, created, cb) => { + if (!parts.length) { + return cb(null, created); + } + const p = parts.shift(); + const part = (0, normalize_windows_path_js_1.normalizeWindowsPath)(node_path_1.default.resolve(base + '/' + p)); + if (cGet(cache, part)) { + return mkdir_(part, parts, mode, cache, unlink, cwd, created, cb); + } + fs_1.default.mkdir(part, mode, onmkdir(part, parts, mode, cache, unlink, cwd, created, cb)); +}; +const onmkdir = (part, parts, mode, cache, unlink, cwd, created, cb) => (er) => { + if (er) { + fs_1.default.lstat(part, (statEr, st) => { + if (statEr) { + statEr.path = + statEr.path && (0, normalize_windows_path_js_1.normalizeWindowsPath)(statEr.path); + cb(statEr); + } + else if (st.isDirectory()) { + mkdir_(part, parts, mode, cache, unlink, cwd, created, cb); + } + else if (unlink) { + fs_1.default.unlink(part, er => { + if (er) { + return cb(er); + } + fs_1.default.mkdir(part, mode, onmkdir(part, parts, mode, cache, unlink, cwd, created, cb)); + }); + } + else if (st.isSymbolicLink()) { + return cb(new symlink_error_js_1.SymlinkError(part, part + '/' + parts.join('/'))); + } + else { + cb(er); + } + }); + } + else { + created = created || part; + mkdir_(part, parts, mode, cache, unlink, cwd, created, cb); + } +}; +const checkCwdSync = (dir) => { + let ok = false; + let code = undefined; + try { + ok = fs_1.default.statSync(dir).isDirectory(); + } + catch (er) { + code = er?.code; + } + finally { + if (!ok) { + throw new cwd_error_js_1.CwdError(dir, code ?? 'ENOTDIR'); + } + } +}; +const mkdirSync = (dir, opt) => { + dir = (0, normalize_windows_path_js_1.normalizeWindowsPath)(dir); + // if there's any overlap between mask and mode, + // then we'll need an explicit chmod + /* c8 ignore next */ + const umask = opt.umask ?? 0o22; + const mode = opt.mode | 0o700; + const needChmod = (mode & umask) !== 0; + const uid = opt.uid; + const gid = opt.gid; + const doChown = typeof uid === 'number' && + typeof gid === 'number' && + (uid !== opt.processUid || gid !== opt.processGid); + const preserve = opt.preserve; + const unlink = opt.unlink; + const cache = opt.cache; + const cwd = (0, normalize_windows_path_js_1.normalizeWindowsPath)(opt.cwd); + const done = (created) => { + cSet(cache, dir, true); + if (created && doChown) { + (0, chownr_1.chownrSync)(created, uid, gid); + } + if (needChmod) { + fs_1.default.chmodSync(dir, mode); + } + }; + if (cache && cGet(cache, dir) === true) { + return done(); + } + if (dir === cwd) { + checkCwdSync(cwd); + return done(); + } + if (preserve) { + return done((0, mkdirp_1.mkdirpSync)(dir, mode) ?? undefined); + } + const sub = (0, normalize_windows_path_js_1.normalizeWindowsPath)(node_path_1.default.relative(cwd, dir)); + const parts = sub.split('/'); + let created = undefined; + for (let p = parts.shift(), part = cwd; p && (part += '/' + p); p = parts.shift()) { + part = (0, normalize_windows_path_js_1.normalizeWindowsPath)(node_path_1.default.resolve(part)); + if (cGet(cache, part)) { + continue; + } + try { + fs_1.default.mkdirSync(part, mode); + created = created || part; + cSet(cache, part, true); + } + catch (er) { + const st = fs_1.default.lstatSync(part); + if (st.isDirectory()) { + cSet(cache, part, true); + continue; + } + else if (unlink) { + fs_1.default.unlinkSync(part); + fs_1.default.mkdirSync(part, mode); + created = created || part; + cSet(cache, part, true); + continue; + } + else if (st.isSymbolicLink()) { + return new symlink_error_js_1.SymlinkError(part, part + '/' + parts.join('/')); + } + } + } + return done(created); +}; +exports.mkdirSync = mkdirSync; +//# sourceMappingURL=mkdir.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/mode-fix.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/mode-fix.js new file mode 100644 index 00000000000000..49dd727961d290 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/mode-fix.js @@ -0,0 +1,29 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.modeFix = void 0; +const modeFix = (mode, isDir, portable) => { + mode &= 0o7777; + // in portable mode, use the minimum reasonable umask + // if this system creates files with 0o664 by default + // (as some linux distros do), then we'll write the + // archive with 0o644 instead. Also, don't ever create + // a file that is not readable/writable by the owner. + if (portable) { + mode = (mode | 0o600) & ~0o22; + } + // if dirs are readable, then they should be listable + if (isDir) { + if (mode & 0o400) { + mode |= 0o100; + } + if (mode & 0o40) { + mode |= 0o10; + } + if (mode & 0o4) { + mode |= 0o1; + } + } + return mode; +}; +exports.modeFix = modeFix; +//# sourceMappingURL=mode-fix.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/normalize-unicode.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/normalize-unicode.js new file mode 100644 index 00000000000000..2f08ce46d98c4c --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/normalize-unicode.js @@ -0,0 +1,17 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.normalizeUnicode = void 0; +// warning: extremely hot code path. +// This has been meticulously optimized for use +// within npm install on large package trees. +// Do not edit without careful benchmarking. +const normalizeCache = Object.create(null); +const { hasOwnProperty } = Object.prototype; +const normalizeUnicode = (s) => { + if (!hasOwnProperty.call(normalizeCache, s)) { + normalizeCache[s] = s.normalize('NFD'); + } + return normalizeCache[s]; +}; +exports.normalizeUnicode = normalizeUnicode; +//# sourceMappingURL=normalize-unicode.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/normalize-windows-path.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/normalize-windows-path.js new file mode 100644 index 00000000000000..b0c7aaa9f2d175 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/normalize-windows-path.js @@ -0,0 +1,12 @@ +"use strict"; +// on windows, either \ or / are valid directory separators. +// on unix, \ is a valid character in filenames. +// so, on windows, and only on windows, we replace all \ chars with /, +// so that we can use / as our one and only directory separator char. +Object.defineProperty(exports, "__esModule", { value: true }); +exports.normalizeWindowsPath = void 0; +const platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform; +exports.normalizeWindowsPath = platform !== 'win32' ? + (p) => p + : (p) => p && p.replace(/\\/g, '/'); +//# sourceMappingURL=normalize-windows-path.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/options.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/options.js new file mode 100644 index 00000000000000..4cd06505bc72b2 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/options.js @@ -0,0 +1,66 @@ +"use strict"; +// turn tar(1) style args like `C` into the more verbose things like `cwd` +Object.defineProperty(exports, "__esModule", { value: true }); +exports.dealias = exports.isNoFile = exports.isFile = exports.isAsync = exports.isSync = exports.isAsyncNoFile = exports.isSyncNoFile = exports.isAsyncFile = exports.isSyncFile = void 0; +const argmap = new Map([ + ['C', 'cwd'], + ['f', 'file'], + ['z', 'gzip'], + ['P', 'preservePaths'], + ['U', 'unlink'], + ['strip-components', 'strip'], + ['stripComponents', 'strip'], + ['keep-newer', 'newer'], + ['keepNewer', 'newer'], + ['keep-newer-files', 'newer'], + ['keepNewerFiles', 'newer'], + ['k', 'keep'], + ['keep-existing', 'keep'], + ['keepExisting', 'keep'], + ['m', 'noMtime'], + ['no-mtime', 'noMtime'], + ['p', 'preserveOwner'], + ['L', 'follow'], + ['h', 'follow'], + ['onentry', 'onReadEntry'], +]); +const isSyncFile = (o) => !!o.sync && !!o.file; +exports.isSyncFile = isSyncFile; +const isAsyncFile = (o) => !o.sync && !!o.file; +exports.isAsyncFile = isAsyncFile; +const isSyncNoFile = (o) => !!o.sync && !o.file; +exports.isSyncNoFile = isSyncNoFile; +const isAsyncNoFile = (o) => !o.sync && !o.file; +exports.isAsyncNoFile = isAsyncNoFile; +const isSync = (o) => !!o.sync; +exports.isSync = isSync; +const isAsync = (o) => !o.sync; +exports.isAsync = isAsync; +const isFile = (o) => !!o.file; +exports.isFile = isFile; +const isNoFile = (o) => !o.file; +exports.isNoFile = isNoFile; +const dealiasKey = (k) => { + const d = argmap.get(k); + if (d) + return d; + return k; +}; +const dealias = (opt = {}) => { + if (!opt) + return {}; + const result = {}; + for (const [key, v] of Object.entries(opt)) { + // TS doesn't know that aliases are going to always be the same type + const k = dealiasKey(key); + result[k] = v; + } + // affordance for deprecated noChmod -> chmod + if (result.chmod === undefined && result.noChmod === false) { + result.chmod = true; + } + delete result.noChmod; + return result; +}; +exports.dealias = dealias; +//# sourceMappingURL=options.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/pack.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/pack.js new file mode 100644 index 00000000000000..303e93063c2db4 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/pack.js @@ -0,0 +1,477 @@ +"use strict"; +// A readable tar stream creator +// Technically, this is a transform stream that you write paths into, +// and tar format comes out of. +// The `add()` method is like `write()` but returns this, +// and end() return `this` as well, so you can +// do `new Pack(opt).add('files').add('dir').end().pipe(output) +// You could also do something like: +// streamOfPaths().pipe(new Pack()).pipe(new fs.WriteStream('out.tar')) +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.PackSync = exports.Pack = exports.PackJob = void 0; +const fs_1 = __importDefault(require("fs")); +const write_entry_js_1 = require("./write-entry.js"); +class PackJob { + path; + absolute; + entry; + stat; + readdir; + pending = false; + ignore = false; + piped = false; + constructor(path, absolute) { + this.path = path || './'; + this.absolute = absolute; + } +} +exports.PackJob = PackJob; +const minipass_1 = require("minipass"); +const zlib = __importStar(require("minizlib")); +const yallist_1 = require("yallist"); +const read_entry_js_1 = require("./read-entry.js"); +const warn_method_js_1 = require("./warn-method.js"); +const EOF = Buffer.alloc(1024); +const ONSTAT = Symbol('onStat'); +const ENDED = Symbol('ended'); +const QUEUE = Symbol('queue'); +const CURRENT = Symbol('current'); +const PROCESS = Symbol('process'); +const PROCESSING = Symbol('processing'); +const PROCESSJOB = Symbol('processJob'); +const JOBS = Symbol('jobs'); +const JOBDONE = Symbol('jobDone'); +const ADDFSENTRY = Symbol('addFSEntry'); +const ADDTARENTRY = Symbol('addTarEntry'); +const STAT = Symbol('stat'); +const READDIR = Symbol('readdir'); +const ONREADDIR = Symbol('onreaddir'); +const PIPE = Symbol('pipe'); +const ENTRY = Symbol('entry'); +const ENTRYOPT = Symbol('entryOpt'); +const WRITEENTRYCLASS = Symbol('writeEntryClass'); +const WRITE = Symbol('write'); +const ONDRAIN = Symbol('ondrain'); +const path_1 = __importDefault(require("path")); +const normalize_windows_path_js_1 = require("./normalize-windows-path.js"); +class Pack extends minipass_1.Minipass { + opt; + cwd; + maxReadSize; + preservePaths; + strict; + noPax; + prefix; + linkCache; + statCache; + file; + portable; + zip; + readdirCache; + noDirRecurse; + follow; + noMtime; + mtime; + filter; + jobs; + [WRITEENTRYCLASS]; + onWriteEntry; + [QUEUE]; + [JOBS] = 0; + [PROCESSING] = false; + [ENDED] = false; + constructor(opt = {}) { + //@ts-ignore + super(); + this.opt = opt; + this.file = opt.file || ''; + this.cwd = opt.cwd || process.cwd(); + this.maxReadSize = opt.maxReadSize; + this.preservePaths = !!opt.preservePaths; + this.strict = !!opt.strict; + this.noPax = !!opt.noPax; + this.prefix = (0, normalize_windows_path_js_1.normalizeWindowsPath)(opt.prefix || ''); + this.linkCache = opt.linkCache || new Map(); + this.statCache = opt.statCache || new Map(); + this.readdirCache = opt.readdirCache || new Map(); + this.onWriteEntry = opt.onWriteEntry; + this[WRITEENTRYCLASS] = write_entry_js_1.WriteEntry; + if (typeof opt.onwarn === 'function') { + this.on('warn', opt.onwarn); + } + this.portable = !!opt.portable; + if (opt.gzip || opt.brotli) { + if (opt.gzip && opt.brotli) { + throw new TypeError('gzip and brotli are mutually exclusive'); + } + if (opt.gzip) { + if (typeof opt.gzip !== 'object') { + opt.gzip = {}; + } + if (this.portable) { + opt.gzip.portable = true; + } + this.zip = new zlib.Gzip(opt.gzip); + } + if (opt.brotli) { + if (typeof opt.brotli !== 'object') { + opt.brotli = {}; + } + this.zip = new zlib.BrotliCompress(opt.brotli); + } + /* c8 ignore next */ + if (!this.zip) + throw new Error('impossible'); + const zip = this.zip; + zip.on('data', chunk => super.write(chunk)); + zip.on('end', () => super.end()); + zip.on('drain', () => this[ONDRAIN]()); + this.on('resume', () => zip.resume()); + } + else { + this.on('drain', this[ONDRAIN]); + } + this.noDirRecurse = !!opt.noDirRecurse; + this.follow = !!opt.follow; + this.noMtime = !!opt.noMtime; + if (opt.mtime) + this.mtime = opt.mtime; + this.filter = + typeof opt.filter === 'function' ? opt.filter : () => true; + this[QUEUE] = new yallist_1.Yallist(); + this[JOBS] = 0; + this.jobs = Number(opt.jobs) || 4; + this[PROCESSING] = false; + this[ENDED] = false; + } + [WRITE](chunk) { + return super.write(chunk); + } + add(path) { + this.write(path); + return this; + } + end(path, encoding, cb) { + /* c8 ignore start */ + if (typeof path === 'function') { + cb = path; + path = undefined; + } + if (typeof encoding === 'function') { + cb = encoding; + encoding = undefined; + } + /* c8 ignore stop */ + if (path) { + this.add(path); + } + this[ENDED] = true; + this[PROCESS](); + /* c8 ignore next */ + if (cb) + cb(); + return this; + } + write(path) { + if (this[ENDED]) { + throw new Error('write after end'); + } + if (path instanceof read_entry_js_1.ReadEntry) { + this[ADDTARENTRY](path); + } + else { + this[ADDFSENTRY](path); + } + return this.flowing; + } + [ADDTARENTRY](p) { + const absolute = (0, normalize_windows_path_js_1.normalizeWindowsPath)(path_1.default.resolve(this.cwd, p.path)); + // in this case, we don't have to wait for the stat + if (!this.filter(p.path, p)) { + p.resume(); + } + else { + const job = new PackJob(p.path, absolute); + job.entry = new write_entry_js_1.WriteEntryTar(p, this[ENTRYOPT](job)); + job.entry.on('end', () => this[JOBDONE](job)); + this[JOBS] += 1; + this[QUEUE].push(job); + } + this[PROCESS](); + } + [ADDFSENTRY](p) { + const absolute = (0, normalize_windows_path_js_1.normalizeWindowsPath)(path_1.default.resolve(this.cwd, p)); + this[QUEUE].push(new PackJob(p, absolute)); + this[PROCESS](); + } + [STAT](job) { + job.pending = true; + this[JOBS] += 1; + const stat = this.follow ? 'stat' : 'lstat'; + fs_1.default[stat](job.absolute, (er, stat) => { + job.pending = false; + this[JOBS] -= 1; + if (er) { + this.emit('error', er); + } + else { + this[ONSTAT](job, stat); + } + }); + } + [ONSTAT](job, stat) { + this.statCache.set(job.absolute, stat); + job.stat = stat; + // now we have the stat, we can filter it. + if (!this.filter(job.path, stat)) { + job.ignore = true; + } + this[PROCESS](); + } + [READDIR](job) { + job.pending = true; + this[JOBS] += 1; + fs_1.default.readdir(job.absolute, (er, entries) => { + job.pending = false; + this[JOBS] -= 1; + if (er) { + return this.emit('error', er); + } + this[ONREADDIR](job, entries); + }); + } + [ONREADDIR](job, entries) { + this.readdirCache.set(job.absolute, entries); + job.readdir = entries; + this[PROCESS](); + } + [PROCESS]() { + if (this[PROCESSING]) { + return; + } + this[PROCESSING] = true; + for (let w = this[QUEUE].head; !!w && this[JOBS] < this.jobs; w = w.next) { + this[PROCESSJOB](w.value); + if (w.value.ignore) { + const p = w.next; + this[QUEUE].removeNode(w); + w.next = p; + } + } + this[PROCESSING] = false; + if (this[ENDED] && !this[QUEUE].length && this[JOBS] === 0) { + if (this.zip) { + this.zip.end(EOF); + } + else { + super.write(EOF); + super.end(); + } + } + } + get [CURRENT]() { + return this[QUEUE] && this[QUEUE].head && this[QUEUE].head.value; + } + [JOBDONE](_job) { + this[QUEUE].shift(); + this[JOBS] -= 1; + this[PROCESS](); + } + [PROCESSJOB](job) { + if (job.pending) { + return; + } + if (job.entry) { + if (job === this[CURRENT] && !job.piped) { + this[PIPE](job); + } + return; + } + if (!job.stat) { + const sc = this.statCache.get(job.absolute); + if (sc) { + this[ONSTAT](job, sc); + } + else { + this[STAT](job); + } + } + if (!job.stat) { + return; + } + // filtered out! + if (job.ignore) { + return; + } + if (!this.noDirRecurse && + job.stat.isDirectory() && + !job.readdir) { + const rc = this.readdirCache.get(job.absolute); + if (rc) { + this[ONREADDIR](job, rc); + } + else { + this[READDIR](job); + } + if (!job.readdir) { + return; + } + } + // we know it doesn't have an entry, because that got checked above + job.entry = this[ENTRY](job); + if (!job.entry) { + job.ignore = true; + return; + } + if (job === this[CURRENT] && !job.piped) { + this[PIPE](job); + } + } + [ENTRYOPT](job) { + return { + onwarn: (code, msg, data) => this.warn(code, msg, data), + noPax: this.noPax, + cwd: this.cwd, + absolute: job.absolute, + preservePaths: this.preservePaths, + maxReadSize: this.maxReadSize, + strict: this.strict, + portable: this.portable, + linkCache: this.linkCache, + statCache: this.statCache, + noMtime: this.noMtime, + mtime: this.mtime, + prefix: this.prefix, + onWriteEntry: this.onWriteEntry, + }; + } + [ENTRY](job) { + this[JOBS] += 1; + try { + const e = new this[WRITEENTRYCLASS](job.path, this[ENTRYOPT](job)); + return e + .on('end', () => this[JOBDONE](job)) + .on('error', er => this.emit('error', er)); + } + catch (er) { + this.emit('error', er); + } + } + [ONDRAIN]() { + if (this[CURRENT] && this[CURRENT].entry) { + this[CURRENT].entry.resume(); + } + } + // like .pipe() but using super, because our write() is special + [PIPE](job) { + job.piped = true; + if (job.readdir) { + job.readdir.forEach(entry => { + const p = job.path; + const base = p === './' ? '' : p.replace(/\/*$/, '/'); + this[ADDFSENTRY](base + entry); + }); + } + const source = job.entry; + const zip = this.zip; + /* c8 ignore start */ + if (!source) + throw new Error('cannot pipe without source'); + /* c8 ignore stop */ + if (zip) { + source.on('data', chunk => { + if (!zip.write(chunk)) { + source.pause(); + } + }); + } + else { + source.on('data', chunk => { + if (!super.write(chunk)) { + source.pause(); + } + }); + } + } + pause() { + if (this.zip) { + this.zip.pause(); + } + return super.pause(); + } + warn(code, message, data = {}) { + (0, warn_method_js_1.warnMethod)(this, code, message, data); + } +} +exports.Pack = Pack; +class PackSync extends Pack { + sync = true; + constructor(opt) { + super(opt); + this[WRITEENTRYCLASS] = write_entry_js_1.WriteEntrySync; + } + // pause/resume are no-ops in sync streams. + pause() { } + resume() { } + [STAT](job) { + const stat = this.follow ? 'statSync' : 'lstatSync'; + this[ONSTAT](job, fs_1.default[stat](job.absolute)); + } + [READDIR](job) { + this[ONREADDIR](job, fs_1.default.readdirSync(job.absolute)); + } + // gotta get it all in this tick + [PIPE](job) { + const source = job.entry; + const zip = this.zip; + if (job.readdir) { + job.readdir.forEach(entry => { + const p = job.path; + const base = p === './' ? '' : p.replace(/\/*$/, '/'); + this[ADDFSENTRY](base + entry); + }); + } + /* c8 ignore start */ + if (!source) + throw new Error('Cannot pipe without source'); + /* c8 ignore stop */ + if (zip) { + source.on('data', chunk => { + zip.write(chunk); + }); + } + else { + source.on('data', chunk => { + super[WRITE](chunk); + }); + } + } +} +exports.PackSync = PackSync; +//# sourceMappingURL=pack.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/package.json b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/package.json new file mode 100644 index 00000000000000..5bbefffbabee39 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/package.json @@ -0,0 +1,3 @@ +{ + "type": "commonjs" +} diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/parse.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/parse.js new file mode 100644 index 00000000000000..1f7e5fd65e869f --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/parse.js @@ -0,0 +1,599 @@ +"use strict"; +// this[BUFFER] is the remainder of a chunk if we're waiting for +// the full 512 bytes of a header to come in. We will Buffer.concat() +// it to the next write(), which is a mem copy, but a small one. +// +// this[QUEUE] is a Yallist of entries that haven't been emitted +// yet this can only get filled up if the user keeps write()ing after +// a write() returns false, or does a write() with more than one entry +// +// We don't buffer chunks, we always parse them and either create an +// entry, or push it into the active entry. The ReadEntry class knows +// to throw data away if .ignore=true +// +// Shift entry off the buffer when it emits 'end', and emit 'entry' for +// the next one in the list. +// +// At any time, we're pushing body chunks into the entry at WRITEENTRY, +// and waiting for 'end' on the entry at READENTRY +// +// ignored entries get .resume() called on them straight away +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Parser = void 0; +const events_1 = require("events"); +const minizlib_1 = require("minizlib"); +const yallist_1 = require("yallist"); +const header_js_1 = require("./header.js"); +const pax_js_1 = require("./pax.js"); +const read_entry_js_1 = require("./read-entry.js"); +const warn_method_js_1 = require("./warn-method.js"); +const maxMetaEntrySize = 1024 * 1024; +const gzipHeader = Buffer.from([0x1f, 0x8b]); +const STATE = Symbol('state'); +const WRITEENTRY = Symbol('writeEntry'); +const READENTRY = Symbol('readEntry'); +const NEXTENTRY = Symbol('nextEntry'); +const PROCESSENTRY = Symbol('processEntry'); +const EX = Symbol('extendedHeader'); +const GEX = Symbol('globalExtendedHeader'); +const META = Symbol('meta'); +const EMITMETA = Symbol('emitMeta'); +const BUFFER = Symbol('buffer'); +const QUEUE = Symbol('queue'); +const ENDED = Symbol('ended'); +const EMITTEDEND = Symbol('emittedEnd'); +const EMIT = Symbol('emit'); +const UNZIP = Symbol('unzip'); +const CONSUMECHUNK = Symbol('consumeChunk'); +const CONSUMECHUNKSUB = Symbol('consumeChunkSub'); +const CONSUMEBODY = Symbol('consumeBody'); +const CONSUMEMETA = Symbol('consumeMeta'); +const CONSUMEHEADER = Symbol('consumeHeader'); +const CONSUMING = Symbol('consuming'); +const BUFFERCONCAT = Symbol('bufferConcat'); +const MAYBEEND = Symbol('maybeEnd'); +const WRITING = Symbol('writing'); +const ABORTED = Symbol('aborted'); +const DONE = Symbol('onDone'); +const SAW_VALID_ENTRY = Symbol('sawValidEntry'); +const SAW_NULL_BLOCK = Symbol('sawNullBlock'); +const SAW_EOF = Symbol('sawEOF'); +const CLOSESTREAM = Symbol('closeStream'); +const noop = () => true; +class Parser extends events_1.EventEmitter { + file; + strict; + maxMetaEntrySize; + filter; + brotli; + writable = true; + readable = false; + [QUEUE] = new yallist_1.Yallist(); + [BUFFER]; + [READENTRY]; + [WRITEENTRY]; + [STATE] = 'begin'; + [META] = ''; + [EX]; + [GEX]; + [ENDED] = false; + [UNZIP]; + [ABORTED] = false; + [SAW_VALID_ENTRY]; + [SAW_NULL_BLOCK] = false; + [SAW_EOF] = false; + [WRITING] = false; + [CONSUMING] = false; + [EMITTEDEND] = false; + constructor(opt = {}) { + super(); + this.file = opt.file || ''; + // these BADARCHIVE errors can't be detected early. listen on DONE. + this.on(DONE, () => { + if (this[STATE] === 'begin' || + this[SAW_VALID_ENTRY] === false) { + // either less than 1 block of data, or all entries were invalid. + // Either way, probably not even a tarball. + this.warn('TAR_BAD_ARCHIVE', 'Unrecognized archive format'); + } + }); + if (opt.ondone) { + this.on(DONE, opt.ondone); + } + else { + this.on(DONE, () => { + this.emit('prefinish'); + this.emit('finish'); + this.emit('end'); + }); + } + this.strict = !!opt.strict; + this.maxMetaEntrySize = opt.maxMetaEntrySize || maxMetaEntrySize; + this.filter = typeof opt.filter === 'function' ? opt.filter : noop; + // Unlike gzip, brotli doesn't have any magic bytes to identify it + // Users need to explicitly tell us they're extracting a brotli file + // Or we infer from the file extension + const isTBR = opt.file && + (opt.file.endsWith('.tar.br') || opt.file.endsWith('.tbr')); + // if it's a tbr file it MIGHT be brotli, but we don't know until + // we look at it and verify it's not a valid tar file. + this.brotli = + !opt.gzip && opt.brotli !== undefined ? opt.brotli + : isTBR ? undefined + : false; + // have to set this so that streams are ok piping into it + this.on('end', () => this[CLOSESTREAM]()); + if (typeof opt.onwarn === 'function') { + this.on('warn', opt.onwarn); + } + if (typeof opt.onReadEntry === 'function') { + this.on('entry', opt.onReadEntry); + } + } + warn(code, message, data = {}) { + (0, warn_method_js_1.warnMethod)(this, code, message, data); + } + [CONSUMEHEADER](chunk, position) { + if (this[SAW_VALID_ENTRY] === undefined) { + this[SAW_VALID_ENTRY] = false; + } + let header; + try { + header = new header_js_1.Header(chunk, position, this[EX], this[GEX]); + } + catch (er) { + return this.warn('TAR_ENTRY_INVALID', er); + } + if (header.nullBlock) { + if (this[SAW_NULL_BLOCK]) { + this[SAW_EOF] = true; + // ending an archive with no entries. pointless, but legal. + if (this[STATE] === 'begin') { + this[STATE] = 'header'; + } + this[EMIT]('eof'); + } + else { + this[SAW_NULL_BLOCK] = true; + this[EMIT]('nullBlock'); + } + } + else { + this[SAW_NULL_BLOCK] = false; + if (!header.cksumValid) { + this.warn('TAR_ENTRY_INVALID', 'checksum failure', { header }); + } + else if (!header.path) { + this.warn('TAR_ENTRY_INVALID', 'path is required', { header }); + } + else { + const type = header.type; + if (/^(Symbolic)?Link$/.test(type) && !header.linkpath) { + this.warn('TAR_ENTRY_INVALID', 'linkpath required', { + header, + }); + } + else if (!/^(Symbolic)?Link$/.test(type) && + !/^(Global)?ExtendedHeader$/.test(type) && + header.linkpath) { + this.warn('TAR_ENTRY_INVALID', 'linkpath forbidden', { + header, + }); + } + else { + const entry = (this[WRITEENTRY] = new read_entry_js_1.ReadEntry(header, this[EX], this[GEX])); + // we do this for meta & ignored entries as well, because they + // are still valid tar, or else we wouldn't know to ignore them + if (!this[SAW_VALID_ENTRY]) { + if (entry.remain) { + // this might be the one! + const onend = () => { + if (!entry.invalid) { + this[SAW_VALID_ENTRY] = true; + } + }; + entry.on('end', onend); + } + else { + this[SAW_VALID_ENTRY] = true; + } + } + if (entry.meta) { + if (entry.size > this.maxMetaEntrySize) { + entry.ignore = true; + this[EMIT]('ignoredEntry', entry); + this[STATE] = 'ignore'; + entry.resume(); + } + else if (entry.size > 0) { + this[META] = ''; + entry.on('data', c => (this[META] += c)); + this[STATE] = 'meta'; + } + } + else { + this[EX] = undefined; + entry.ignore = + entry.ignore || !this.filter(entry.path, entry); + if (entry.ignore) { + // probably valid, just not something we care about + this[EMIT]('ignoredEntry', entry); + this[STATE] = entry.remain ? 'ignore' : 'header'; + entry.resume(); + } + else { + if (entry.remain) { + this[STATE] = 'body'; + } + else { + this[STATE] = 'header'; + entry.end(); + } + if (!this[READENTRY]) { + this[QUEUE].push(entry); + this[NEXTENTRY](); + } + else { + this[QUEUE].push(entry); + } + } + } + } + } + } + } + [CLOSESTREAM]() { + queueMicrotask(() => this.emit('close')); + } + [PROCESSENTRY](entry) { + let go = true; + if (!entry) { + this[READENTRY] = undefined; + go = false; + } + else if (Array.isArray(entry)) { + const [ev, ...args] = entry; + this.emit(ev, ...args); + } + else { + this[READENTRY] = entry; + this.emit('entry', entry); + if (!entry.emittedEnd) { + entry.on('end', () => this[NEXTENTRY]()); + go = false; + } + } + return go; + } + [NEXTENTRY]() { + do { } while (this[PROCESSENTRY](this[QUEUE].shift())); + if (!this[QUEUE].length) { + // At this point, there's nothing in the queue, but we may have an + // entry which is being consumed (readEntry). + // If we don't, then we definitely can handle more data. + // If we do, and either it's flowing, or it has never had any data + // written to it, then it needs more. + // The only other possibility is that it has returned false from a + // write() call, so we wait for the next drain to continue. + const re = this[READENTRY]; + const drainNow = !re || re.flowing || re.size === re.remain; + if (drainNow) { + if (!this[WRITING]) { + this.emit('drain'); + } + } + else { + re.once('drain', () => this.emit('drain')); + } + } + } + [CONSUMEBODY](chunk, position) { + // write up to but no more than writeEntry.blockRemain + const entry = this[WRITEENTRY]; + /* c8 ignore start */ + if (!entry) { + throw new Error('attempt to consume body without entry??'); + } + const br = entry.blockRemain ?? 0; + /* c8 ignore stop */ + const c = br >= chunk.length && position === 0 ? + chunk + : chunk.subarray(position, position + br); + entry.write(c); + if (!entry.blockRemain) { + this[STATE] = 'header'; + this[WRITEENTRY] = undefined; + entry.end(); + } + return c.length; + } + [CONSUMEMETA](chunk, position) { + const entry = this[WRITEENTRY]; + const ret = this[CONSUMEBODY](chunk, position); + // if we finished, then the entry is reset + if (!this[WRITEENTRY] && entry) { + this[EMITMETA](entry); + } + return ret; + } + [EMIT](ev, data, extra) { + if (!this[QUEUE].length && !this[READENTRY]) { + this.emit(ev, data, extra); + } + else { + this[QUEUE].push([ev, data, extra]); + } + } + [EMITMETA](entry) { + this[EMIT]('meta', this[META]); + switch (entry.type) { + case 'ExtendedHeader': + case 'OldExtendedHeader': + this[EX] = pax_js_1.Pax.parse(this[META], this[EX], false); + break; + case 'GlobalExtendedHeader': + this[GEX] = pax_js_1.Pax.parse(this[META], this[GEX], true); + break; + case 'NextFileHasLongPath': + case 'OldGnuLongPath': { + const ex = this[EX] ?? Object.create(null); + this[EX] = ex; + ex.path = this[META].replace(/\0.*/, ''); + break; + } + case 'NextFileHasLongLinkpath': { + const ex = this[EX] || Object.create(null); + this[EX] = ex; + ex.linkpath = this[META].replace(/\0.*/, ''); + break; + } + /* c8 ignore start */ + default: + throw new Error('unknown meta: ' + entry.type); + /* c8 ignore stop */ + } + } + abort(error) { + this[ABORTED] = true; + this.emit('abort', error); + // always throws, even in non-strict mode + this.warn('TAR_ABORT', error, { recoverable: false }); + } + write(chunk, encoding, cb) { + if (typeof encoding === 'function') { + cb = encoding; + encoding = undefined; + } + if (typeof chunk === 'string') { + chunk = Buffer.from(chunk, + /* c8 ignore next */ + typeof encoding === 'string' ? encoding : 'utf8'); + } + if (this[ABORTED]) { + /* c8 ignore next */ + cb?.(); + return false; + } + // first write, might be gzipped + const needSniff = this[UNZIP] === undefined || + (this.brotli === undefined && this[UNZIP] === false); + if (needSniff && chunk) { + if (this[BUFFER]) { + chunk = Buffer.concat([this[BUFFER], chunk]); + this[BUFFER] = undefined; + } + if (chunk.length < gzipHeader.length) { + this[BUFFER] = chunk; + /* c8 ignore next */ + cb?.(); + return true; + } + // look for gzip header + for (let i = 0; this[UNZIP] === undefined && i < gzipHeader.length; i++) { + if (chunk[i] !== gzipHeader[i]) { + this[UNZIP] = false; + } + } + const maybeBrotli = this.brotli === undefined; + if (this[UNZIP] === false && maybeBrotli) { + // read the first header to see if it's a valid tar file. If so, + // we can safely assume that it's not actually brotli, despite the + // .tbr or .tar.br file extension. + // if we ended before getting a full chunk, yes, def brotli + if (chunk.length < 512) { + if (this[ENDED]) { + this.brotli = true; + } + else { + this[BUFFER] = chunk; + /* c8 ignore next */ + cb?.(); + return true; + } + } + else { + // if it's tar, it's pretty reliably not brotli, chances of + // that happening are astronomical. + try { + new header_js_1.Header(chunk.subarray(0, 512)); + this.brotli = false; + } + catch (_) { + this.brotli = true; + } + } + } + if (this[UNZIP] === undefined || + (this[UNZIP] === false && this.brotli)) { + const ended = this[ENDED]; + this[ENDED] = false; + this[UNZIP] = + this[UNZIP] === undefined ? + new minizlib_1.Unzip({}) + : new minizlib_1.BrotliDecompress({}); + this[UNZIP].on('data', chunk => this[CONSUMECHUNK](chunk)); + this[UNZIP].on('error', er => this.abort(er)); + this[UNZIP].on('end', () => { + this[ENDED] = true; + this[CONSUMECHUNK](); + }); + this[WRITING] = true; + const ret = !!this[UNZIP][ended ? 'end' : 'write'](chunk); + this[WRITING] = false; + cb?.(); + return ret; + } + } + this[WRITING] = true; + if (this[UNZIP]) { + this[UNZIP].write(chunk); + } + else { + this[CONSUMECHUNK](chunk); + } + this[WRITING] = false; + // return false if there's a queue, or if the current entry isn't flowing + const ret = this[QUEUE].length ? false + : this[READENTRY] ? this[READENTRY].flowing + : true; + // if we have no queue, then that means a clogged READENTRY + if (!ret && !this[QUEUE].length) { + this[READENTRY]?.once('drain', () => this.emit('drain')); + } + /* c8 ignore next */ + cb?.(); + return ret; + } + [BUFFERCONCAT](c) { + if (c && !this[ABORTED]) { + this[BUFFER] = + this[BUFFER] ? Buffer.concat([this[BUFFER], c]) : c; + } + } + [MAYBEEND]() { + if (this[ENDED] && + !this[EMITTEDEND] && + !this[ABORTED] && + !this[CONSUMING]) { + this[EMITTEDEND] = true; + const entry = this[WRITEENTRY]; + if (entry && entry.blockRemain) { + // truncated, likely a damaged file + const have = this[BUFFER] ? this[BUFFER].length : 0; + this.warn('TAR_BAD_ARCHIVE', `Truncated input (needed ${entry.blockRemain} more bytes, only ${have} available)`, { entry }); + if (this[BUFFER]) { + entry.write(this[BUFFER]); + } + entry.end(); + } + this[EMIT](DONE); + } + } + [CONSUMECHUNK](chunk) { + if (this[CONSUMING] && chunk) { + this[BUFFERCONCAT](chunk); + } + else if (!chunk && !this[BUFFER]) { + this[MAYBEEND](); + } + else if (chunk) { + this[CONSUMING] = true; + if (this[BUFFER]) { + this[BUFFERCONCAT](chunk); + const c = this[BUFFER]; + this[BUFFER] = undefined; + this[CONSUMECHUNKSUB](c); + } + else { + this[CONSUMECHUNKSUB](chunk); + } + while (this[BUFFER] && + this[BUFFER]?.length >= 512 && + !this[ABORTED] && + !this[SAW_EOF]) { + const c = this[BUFFER]; + this[BUFFER] = undefined; + this[CONSUMECHUNKSUB](c); + } + this[CONSUMING] = false; + } + if (!this[BUFFER] || this[ENDED]) { + this[MAYBEEND](); + } + } + [CONSUMECHUNKSUB](chunk) { + // we know that we are in CONSUMING mode, so anything written goes into + // the buffer. Advance the position and put any remainder in the buffer. + let position = 0; + const length = chunk.length; + while (position + 512 <= length && + !this[ABORTED] && + !this[SAW_EOF]) { + switch (this[STATE]) { + case 'begin': + case 'header': + this[CONSUMEHEADER](chunk, position); + position += 512; + break; + case 'ignore': + case 'body': + position += this[CONSUMEBODY](chunk, position); + break; + case 'meta': + position += this[CONSUMEMETA](chunk, position); + break; + /* c8 ignore start */ + default: + throw new Error('invalid state: ' + this[STATE]); + /* c8 ignore stop */ + } + } + if (position < length) { + if (this[BUFFER]) { + this[BUFFER] = Buffer.concat([ + chunk.subarray(position), + this[BUFFER], + ]); + } + else { + this[BUFFER] = chunk.subarray(position); + } + } + } + end(chunk, encoding, cb) { + if (typeof chunk === 'function') { + cb = chunk; + encoding = undefined; + chunk = undefined; + } + if (typeof encoding === 'function') { + cb = encoding; + encoding = undefined; + } + if (typeof chunk === 'string') { + chunk = Buffer.from(chunk, encoding); + } + if (cb) + this.once('finish', cb); + if (!this[ABORTED]) { + if (this[UNZIP]) { + /* c8 ignore start */ + if (chunk) + this[UNZIP].write(chunk); + /* c8 ignore stop */ + this[UNZIP].end(); + } + else { + this[ENDED] = true; + if (this.brotli === undefined) + chunk = chunk || Buffer.alloc(0); + if (chunk) + this.write(chunk); + this[MAYBEEND](); + } + } + return this; + } +} +exports.Parser = Parser; +//# sourceMappingURL=parse.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/path-reservations.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/path-reservations.js new file mode 100644 index 00000000000000..9ff391c44092c7 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/path-reservations.js @@ -0,0 +1,170 @@ +"use strict"; +// A path exclusive reservation system +// reserve([list, of, paths], fn) +// When the fn is first in line for all its paths, it +// is called with a cb that clears the reservation. +// +// Used by async unpack to avoid clobbering paths in use, +// while still allowing maximal safe parallelization. +Object.defineProperty(exports, "__esModule", { value: true }); +exports.PathReservations = void 0; +const node_path_1 = require("node:path"); +const normalize_unicode_js_1 = require("./normalize-unicode.js"); +const strip_trailing_slashes_js_1 = require("./strip-trailing-slashes.js"); +const platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform; +const isWindows = platform === 'win32'; +// return a set of parent dirs for a given path +// '/a/b/c/d' -> ['/', '/a', '/a/b', '/a/b/c', '/a/b/c/d'] +const getDirs = (path) => { + const dirs = path + .split('/') + .slice(0, -1) + .reduce((set, path) => { + const s = set[set.length - 1]; + if (s !== undefined) { + path = (0, node_path_1.join)(s, path); + } + set.push(path || '/'); + return set; + }, []); + return dirs; +}; +class PathReservations { + // path => [function or Set] + // A Set object means a directory reservation + // A fn is a direct reservation on that path + #queues = new Map(); + // fn => {paths:[path,...], dirs:[path, ...]} + #reservations = new Map(); + // functions currently running + #running = new Set(); + reserve(paths, fn) { + paths = + isWindows ? + ['win32 parallelization disabled'] + : paths.map(p => { + // don't need normPath, because we skip this entirely for windows + return (0, strip_trailing_slashes_js_1.stripTrailingSlashes)((0, node_path_1.join)((0, normalize_unicode_js_1.normalizeUnicode)(p))).toLowerCase(); + }); + const dirs = new Set(paths.map(path => getDirs(path)).reduce((a, b) => a.concat(b))); + this.#reservations.set(fn, { dirs, paths }); + for (const p of paths) { + const q = this.#queues.get(p); + if (!q) { + this.#queues.set(p, [fn]); + } + else { + q.push(fn); + } + } + for (const dir of dirs) { + const q = this.#queues.get(dir); + if (!q) { + this.#queues.set(dir, [new Set([fn])]); + } + else { + const l = q[q.length - 1]; + if (l instanceof Set) { + l.add(fn); + } + else { + q.push(new Set([fn])); + } + } + } + return this.#run(fn); + } + // return the queues for each path the function cares about + // fn => {paths, dirs} + #getQueues(fn) { + const res = this.#reservations.get(fn); + /* c8 ignore start */ + if (!res) { + throw new Error('function does not have any path reservations'); + } + /* c8 ignore stop */ + return { + paths: res.paths.map((path) => this.#queues.get(path)), + dirs: [...res.dirs].map(path => this.#queues.get(path)), + }; + } + // check if fn is first in line for all its paths, and is + // included in the first set for all its dir queues + check(fn) { + const { paths, dirs } = this.#getQueues(fn); + return (paths.every(q => q && q[0] === fn) && + dirs.every(q => q && q[0] instanceof Set && q[0].has(fn))); + } + // run the function if it's first in line and not already running + #run(fn) { + if (this.#running.has(fn) || !this.check(fn)) { + return false; + } + this.#running.add(fn); + fn(() => this.#clear(fn)); + return true; + } + #clear(fn) { + if (!this.#running.has(fn)) { + return false; + } + const res = this.#reservations.get(fn); + /* c8 ignore start */ + if (!res) { + throw new Error('invalid reservation'); + } + /* c8 ignore stop */ + const { paths, dirs } = res; + const next = new Set(); + for (const path of paths) { + const q = this.#queues.get(path); + /* c8 ignore start */ + if (!q || q?.[0] !== fn) { + continue; + } + /* c8 ignore stop */ + const q0 = q[1]; + if (!q0) { + this.#queues.delete(path); + continue; + } + q.shift(); + if (typeof q0 === 'function') { + next.add(q0); + } + else { + for (const f of q0) { + next.add(f); + } + } + } + for (const dir of dirs) { + const q = this.#queues.get(dir); + const q0 = q?.[0]; + /* c8 ignore next - type safety only */ + if (!q || !(q0 instanceof Set)) + continue; + if (q0.size === 1 && q.length === 1) { + this.#queues.delete(dir); + continue; + } + else if (q0.size === 1) { + q.shift(); + // next one must be a function, + // or else the Set would've been reused + const n = q[0]; + if (typeof n === 'function') { + next.add(n); + } + } + else { + q0.delete(fn); + } + } + this.#running.delete(fn); + next.forEach(fn => this.#run(fn)); + return true; + } +} +exports.PathReservations = PathReservations; +//# sourceMappingURL=path-reservations.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/pax.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/pax.js new file mode 100644 index 00000000000000..d30c0f3efbe9ea --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/pax.js @@ -0,0 +1,158 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Pax = void 0; +const node_path_1 = require("node:path"); +const header_js_1 = require("./header.js"); +class Pax { + atime; + mtime; + ctime; + charset; + comment; + gid; + uid; + gname; + uname; + linkpath; + dev; + ino; + nlink; + path; + size; + mode; + global; + constructor(obj, global = false) { + this.atime = obj.atime; + this.charset = obj.charset; + this.comment = obj.comment; + this.ctime = obj.ctime; + this.dev = obj.dev; + this.gid = obj.gid; + this.global = global; + this.gname = obj.gname; + this.ino = obj.ino; + this.linkpath = obj.linkpath; + this.mtime = obj.mtime; + this.nlink = obj.nlink; + this.path = obj.path; + this.size = obj.size; + this.uid = obj.uid; + this.uname = obj.uname; + } + encode() { + const body = this.encodeBody(); + if (body === '') { + return Buffer.allocUnsafe(0); + } + const bodyLen = Buffer.byteLength(body); + // round up to 512 bytes + // add 512 for header + const bufLen = 512 * Math.ceil(1 + bodyLen / 512); + const buf = Buffer.allocUnsafe(bufLen); + // 0-fill the header section, it might not hit every field + for (let i = 0; i < 512; i++) { + buf[i] = 0; + } + new header_js_1.Header({ + // XXX split the path + // then the path should be PaxHeader + basename, but less than 99, + // prepend with the dirname + /* c8 ignore start */ + path: ('PaxHeader/' + (0, node_path_1.basename)(this.path ?? '')).slice(0, 99), + /* c8 ignore stop */ + mode: this.mode || 0o644, + uid: this.uid, + gid: this.gid, + size: bodyLen, + mtime: this.mtime, + type: this.global ? 'GlobalExtendedHeader' : 'ExtendedHeader', + linkpath: '', + uname: this.uname || '', + gname: this.gname || '', + devmaj: 0, + devmin: 0, + atime: this.atime, + ctime: this.ctime, + }).encode(buf); + buf.write(body, 512, bodyLen, 'utf8'); + // null pad after the body + for (let i = bodyLen + 512; i < buf.length; i++) { + buf[i] = 0; + } + return buf; + } + encodeBody() { + return (this.encodeField('path') + + this.encodeField('ctime') + + this.encodeField('atime') + + this.encodeField('dev') + + this.encodeField('ino') + + this.encodeField('nlink') + + this.encodeField('charset') + + this.encodeField('comment') + + this.encodeField('gid') + + this.encodeField('gname') + + this.encodeField('linkpath') + + this.encodeField('mtime') + + this.encodeField('size') + + this.encodeField('uid') + + this.encodeField('uname')); + } + encodeField(field) { + if (this[field] === undefined) { + return ''; + } + const r = this[field]; + const v = r instanceof Date ? r.getTime() / 1000 : r; + const s = ' ' + + (field === 'dev' || field === 'ino' || field === 'nlink' ? + 'SCHILY.' + : '') + + field + + '=' + + v + + '\n'; + const byteLen = Buffer.byteLength(s); + // the digits includes the length of the digits in ascii base-10 + // so if it's 9 characters, then adding 1 for the 9 makes it 10 + // which makes it 11 chars. + let digits = Math.floor(Math.log(byteLen) / Math.log(10)) + 1; + if (byteLen + digits >= Math.pow(10, digits)) { + digits += 1; + } + const len = digits + byteLen; + return len + s; + } + static parse(str, ex, g = false) { + return new Pax(merge(parseKV(str), ex), g); + } +} +exports.Pax = Pax; +const merge = (a, b) => b ? Object.assign({}, b, a) : a; +const parseKV = (str) => str + .replace(/\n$/, '') + .split('\n') + .reduce(parseKVLine, Object.create(null)); +const parseKVLine = (set, line) => { + const n = parseInt(line, 10); + // XXX Values with \n in them will fail this. + // Refactor to not be a naive line-by-line parse. + if (n !== Buffer.byteLength(line) + 1) { + return set; + } + line = line.slice((n + ' ').length); + const kv = line.split('='); + const r = kv.shift(); + if (!r) { + return set; + } + const k = r.replace(/^SCHILY\.(dev|ino|nlink)/, '$1'); + const v = kv.join('='); + set[k] = + /^([A-Z]+\.)?([mac]|birth|creation)time$/.test(k) ? + new Date(Number(v) * 1000) + : /^[0-9]+$/.test(v) ? +v + : v; + return set; +}; +//# sourceMappingURL=pax.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/read-entry.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/read-entry.js new file mode 100644 index 00000000000000..15e2d55c938a43 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/read-entry.js @@ -0,0 +1,140 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ReadEntry = void 0; +const minipass_1 = require("minipass"); +const normalize_windows_path_js_1 = require("./normalize-windows-path.js"); +class ReadEntry extends minipass_1.Minipass { + extended; + globalExtended; + header; + startBlockSize; + blockRemain; + remain; + type; + meta = false; + ignore = false; + path; + mode; + uid; + gid; + uname; + gname; + size = 0; + mtime; + atime; + ctime; + linkpath; + dev; + ino; + nlink; + invalid = false; + absolute; + unsupported = false; + constructor(header, ex, gex) { + super({}); + // read entries always start life paused. this is to avoid the + // situation where Minipass's auto-ending empty streams results + // in an entry ending before we're ready for it. + this.pause(); + this.extended = ex; + this.globalExtended = gex; + this.header = header; + /* c8 ignore start */ + this.remain = header.size ?? 0; + /* c8 ignore stop */ + this.startBlockSize = 512 * Math.ceil(this.remain / 512); + this.blockRemain = this.startBlockSize; + this.type = header.type; + switch (this.type) { + case 'File': + case 'OldFile': + case 'Link': + case 'SymbolicLink': + case 'CharacterDevice': + case 'BlockDevice': + case 'Directory': + case 'FIFO': + case 'ContiguousFile': + case 'GNUDumpDir': + break; + case 'NextFileHasLongLinkpath': + case 'NextFileHasLongPath': + case 'OldGnuLongPath': + case 'GlobalExtendedHeader': + case 'ExtendedHeader': + case 'OldExtendedHeader': + this.meta = true; + break; + // NOTE: gnutar and bsdtar treat unrecognized types as 'File' + // it may be worth doing the same, but with a warning. + default: + this.ignore = true; + } + /* c8 ignore start */ + if (!header.path) { + throw new Error('no path provided for tar.ReadEntry'); + } + /* c8 ignore stop */ + this.path = (0, normalize_windows_path_js_1.normalizeWindowsPath)(header.path); + this.mode = header.mode; + if (this.mode) { + this.mode = this.mode & 0o7777; + } + this.uid = header.uid; + this.gid = header.gid; + this.uname = header.uname; + this.gname = header.gname; + this.size = this.remain; + this.mtime = header.mtime; + this.atime = header.atime; + this.ctime = header.ctime; + /* c8 ignore start */ + this.linkpath = + header.linkpath ? + (0, normalize_windows_path_js_1.normalizeWindowsPath)(header.linkpath) + : undefined; + /* c8 ignore stop */ + this.uname = header.uname; + this.gname = header.gname; + if (ex) { + this.#slurp(ex); + } + if (gex) { + this.#slurp(gex, true); + } + } + write(data) { + const writeLen = data.length; + if (writeLen > this.blockRemain) { + throw new Error('writing more to entry than is appropriate'); + } + const r = this.remain; + const br = this.blockRemain; + this.remain = Math.max(0, r - writeLen); + this.blockRemain = Math.max(0, br - writeLen); + if (this.ignore) { + return true; + } + if (r >= writeLen) { + return super.write(data); + } + // r < writeLen + return super.write(data.subarray(0, r)); + } + #slurp(ex, gex = false) { + if (ex.path) + ex.path = (0, normalize_windows_path_js_1.normalizeWindowsPath)(ex.path); + if (ex.linkpath) + ex.linkpath = (0, normalize_windows_path_js_1.normalizeWindowsPath)(ex.linkpath); + Object.assign(this, Object.fromEntries(Object.entries(ex).filter(([k, v]) => { + // we slurp in everything except for the path attribute in + // a global extended header, because that's weird. Also, any + // null/undefined values are ignored. + return !(v === null || + v === undefined || + (k === 'path' && gex)); + }))); + } +} +exports.ReadEntry = ReadEntry; +//# sourceMappingURL=read-entry.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/replace.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/replace.js new file mode 100644 index 00000000000000..22eff246d4d75f --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/replace.js @@ -0,0 +1,231 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.replace = void 0; +// tar -r +const fs_minipass_1 = require("@isaacs/fs-minipass"); +const node_fs_1 = __importDefault(require("node:fs")); +const node_path_1 = __importDefault(require("node:path")); +const header_js_1 = require("./header.js"); +const list_js_1 = require("./list.js"); +const make_command_js_1 = require("./make-command.js"); +const options_js_1 = require("./options.js"); +const pack_js_1 = require("./pack.js"); +// starting at the head of the file, read a Header +// If the checksum is invalid, that's our position to start writing +// If it is, jump forward by the specified size (round up to 512) +// and try again. +// Write the new Pack stream starting there. +const replaceSync = (opt, files) => { + const p = new pack_js_1.PackSync(opt); + let threw = true; + let fd; + let position; + try { + try { + fd = node_fs_1.default.openSync(opt.file, 'r+'); + } + catch (er) { + if (er?.code === 'ENOENT') { + fd = node_fs_1.default.openSync(opt.file, 'w+'); + } + else { + throw er; + } + } + const st = node_fs_1.default.fstatSync(fd); + const headBuf = Buffer.alloc(512); + POSITION: for (position = 0; position < st.size; position += 512) { + for (let bufPos = 0, bytes = 0; bufPos < 512; bufPos += bytes) { + bytes = node_fs_1.default.readSync(fd, headBuf, bufPos, headBuf.length - bufPos, position + bufPos); + if (position === 0 && + headBuf[0] === 0x1f && + headBuf[1] === 0x8b) { + throw new Error('cannot append to compressed archives'); + } + if (!bytes) { + break POSITION; + } + } + const h = new header_js_1.Header(headBuf); + if (!h.cksumValid) { + break; + } + const entryBlockSize = 512 * Math.ceil((h.size || 0) / 512); + if (position + entryBlockSize + 512 > st.size) { + break; + } + // the 512 for the header we just parsed will be added as well + // also jump ahead all the blocks for the body + position += entryBlockSize; + if (opt.mtimeCache && h.mtime) { + opt.mtimeCache.set(String(h.path), h.mtime); + } + } + threw = false; + streamSync(opt, p, position, fd, files); + } + finally { + if (threw) { + try { + node_fs_1.default.closeSync(fd); + } + catch (er) { } + } + } +}; +const streamSync = (opt, p, position, fd, files) => { + const stream = new fs_minipass_1.WriteStreamSync(opt.file, { + fd: fd, + start: position, + }); + p.pipe(stream); + addFilesSync(p, files); +}; +const replaceAsync = (opt, files) => { + files = Array.from(files); + const p = new pack_js_1.Pack(opt); + const getPos = (fd, size, cb_) => { + const cb = (er, pos) => { + if (er) { + node_fs_1.default.close(fd, _ => cb_(er)); + } + else { + cb_(null, pos); + } + }; + let position = 0; + if (size === 0) { + return cb(null, 0); + } + let bufPos = 0; + const headBuf = Buffer.alloc(512); + const onread = (er, bytes) => { + if (er || typeof bytes === 'undefined') { + return cb(er); + } + bufPos += bytes; + if (bufPos < 512 && bytes) { + return node_fs_1.default.read(fd, headBuf, bufPos, headBuf.length - bufPos, position + bufPos, onread); + } + if (position === 0 && + headBuf[0] === 0x1f && + headBuf[1] === 0x8b) { + return cb(new Error('cannot append to compressed archives')); + } + // truncated header + if (bufPos < 512) { + return cb(null, position); + } + const h = new header_js_1.Header(headBuf); + if (!h.cksumValid) { + return cb(null, position); + } + /* c8 ignore next */ + const entryBlockSize = 512 * Math.ceil((h.size ?? 0) / 512); + if (position + entryBlockSize + 512 > size) { + return cb(null, position); + } + position += entryBlockSize + 512; + if (position >= size) { + return cb(null, position); + } + if (opt.mtimeCache && h.mtime) { + opt.mtimeCache.set(String(h.path), h.mtime); + } + bufPos = 0; + node_fs_1.default.read(fd, headBuf, 0, 512, position, onread); + }; + node_fs_1.default.read(fd, headBuf, 0, 512, position, onread); + }; + const promise = new Promise((resolve, reject) => { + p.on('error', reject); + let flag = 'r+'; + const onopen = (er, fd) => { + if (er && er.code === 'ENOENT' && flag === 'r+') { + flag = 'w+'; + return node_fs_1.default.open(opt.file, flag, onopen); + } + if (er || !fd) { + return reject(er); + } + node_fs_1.default.fstat(fd, (er, st) => { + if (er) { + return node_fs_1.default.close(fd, () => reject(er)); + } + getPos(fd, st.size, (er, position) => { + if (er) { + return reject(er); + } + const stream = new fs_minipass_1.WriteStream(opt.file, { + fd: fd, + start: position, + }); + p.pipe(stream); + stream.on('error', reject); + stream.on('close', resolve); + addFilesAsync(p, files); + }); + }); + }; + node_fs_1.default.open(opt.file, flag, onopen); + }); + return promise; +}; +const addFilesSync = (p, files) => { + files.forEach(file => { + if (file.charAt(0) === '@') { + (0, list_js_1.list)({ + file: node_path_1.default.resolve(p.cwd, file.slice(1)), + sync: true, + noResume: true, + onReadEntry: entry => p.add(entry), + }); + } + else { + p.add(file); + } + }); + p.end(); +}; +const addFilesAsync = async (p, files) => { + for (let i = 0; i < files.length; i++) { + const file = String(files[i]); + if (file.charAt(0) === '@') { + await (0, list_js_1.list)({ + file: node_path_1.default.resolve(String(p.cwd), file.slice(1)), + noResume: true, + onReadEntry: entry => p.add(entry), + }); + } + else { + p.add(file); + } + } + p.end(); +}; +exports.replace = (0, make_command_js_1.makeCommand)(replaceSync, replaceAsync, +/* c8 ignore start */ +() => { + throw new TypeError('file is required'); +}, () => { + throw new TypeError('file is required'); +}, +/* c8 ignore stop */ +(opt, entries) => { + if (!(0, options_js_1.isFile)(opt)) { + throw new TypeError('file is required'); + } + if (opt.gzip || + opt.brotli || + opt.file.endsWith('.br') || + opt.file.endsWith('.tbr')) { + throw new TypeError('cannot append to compressed archives'); + } + if (!entries?.length) { + throw new TypeError('no paths specified to add/replace'); + } +}); +//# sourceMappingURL=replace.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/strip-absolute-path.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/strip-absolute-path.js new file mode 100644 index 00000000000000..bb7639c35a1104 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/strip-absolute-path.js @@ -0,0 +1,29 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.stripAbsolutePath = void 0; +// unix absolute paths are also absolute on win32, so we use this for both +const node_path_1 = require("node:path"); +const { isAbsolute, parse } = node_path_1.win32; +// returns [root, stripped] +// Note that windows will think that //x/y/z/a has a "root" of //x/y, and in +// those cases, we want to sanitize it to x/y/z/a, not z/a, so we strip / +// explicitly if it's the first character. +// drive-specific relative paths on Windows get their root stripped off even +// though they are not absolute, so `c:../foo` becomes ['c:', '../foo'] +const stripAbsolutePath = (path) => { + let r = ''; + let parsed = parse(path); + while (isAbsolute(path) || parsed.root) { + // windows will think that //x/y/z has a "root" of //x/y/ + // but strip the //?/C:/ off of //?/C:/path + const root = path.charAt(0) === '/' && path.slice(0, 4) !== '//?/' ? + '/' + : parsed.root; + path = path.slice(root.length); + r += root; + parsed = parse(path); + } + return [r, path]; +}; +exports.stripAbsolutePath = stripAbsolutePath; +//# sourceMappingURL=strip-absolute-path.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/strip-trailing-slashes.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/strip-trailing-slashes.js new file mode 100644 index 00000000000000..6fa74ad6a4ac93 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/strip-trailing-slashes.js @@ -0,0 +1,18 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.stripTrailingSlashes = void 0; +// warning: extremely hot code path. +// This has been meticulously optimized for use +// within npm install on large package trees. +// Do not edit without careful benchmarking. +const stripTrailingSlashes = (str) => { + let i = str.length - 1; + let slashesStart = -1; + while (i > -1 && str.charAt(i) === '/') { + slashesStart = i; + i--; + } + return slashesStart === -1 ? str : str.slice(0, slashesStart); +}; +exports.stripTrailingSlashes = stripTrailingSlashes; +//# sourceMappingURL=strip-trailing-slashes.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/symlink-error.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/symlink-error.js new file mode 100644 index 00000000000000..cc19ac1a2e3c6b --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/symlink-error.js @@ -0,0 +1,19 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SymlinkError = void 0; +class SymlinkError extends Error { + path; + symlink; + syscall = 'symlink'; + code = 'TAR_SYMLINK_ERROR'; + constructor(symlink, path) { + super('TAR_SYMLINK_ERROR: Cannot extract through symbolic link'); + this.symlink = symlink; + this.path = path; + } + get name() { + return 'SymlinkError'; + } +} +exports.SymlinkError = SymlinkError; +//# sourceMappingURL=symlink-error.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/types.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/types.js new file mode 100644 index 00000000000000..cb9b684e843b72 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/types.js @@ -0,0 +1,50 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.code = exports.name = exports.isName = exports.isCode = void 0; +const isCode = (c) => exports.name.has(c); +exports.isCode = isCode; +const isName = (c) => exports.code.has(c); +exports.isName = isName; +// map types from key to human-friendly name +exports.name = new Map([ + ['0', 'File'], + // same as File + ['', 'OldFile'], + ['1', 'Link'], + ['2', 'SymbolicLink'], + // Devices and FIFOs aren't fully supported + // they are parsed, but skipped when unpacking + ['3', 'CharacterDevice'], + ['4', 'BlockDevice'], + ['5', 'Directory'], + ['6', 'FIFO'], + // same as File + ['7', 'ContiguousFile'], + // pax headers + ['g', 'GlobalExtendedHeader'], + ['x', 'ExtendedHeader'], + // vendor-specific stuff + // skip + ['A', 'SolarisACL'], + // like 5, but with data, which should be skipped + ['D', 'GNUDumpDir'], + // metadata only, skip + ['I', 'Inode'], + // data = link path of next file + ['K', 'NextFileHasLongLinkpath'], + // data = path of next file + ['L', 'NextFileHasLongPath'], + // skip + ['M', 'ContinuationFile'], + // like L + ['N', 'OldGnuLongPath'], + // skip + ['S', 'SparseFile'], + // skip + ['V', 'TapeVolumeHeader'], + // like x + ['X', 'OldExtendedHeader'], +]); +// map the other direction +exports.code = new Map(Array.from(exports.name).map(kv => [kv[1], kv[0]])); +//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/unpack.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/unpack.js new file mode 100644 index 00000000000000..edf8acbb18c408 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/unpack.js @@ -0,0 +1,919 @@ +"use strict"; +// the PEND/UNPEND stuff tracks whether we're ready to emit end/close yet. +// but the path reservations are required to avoid race conditions where +// parallelized unpack ops may mess with one another, due to dependencies +// (like a Link depending on its target) or destructive operations (like +// clobbering an fs object to create one of a different type.) +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.UnpackSync = exports.Unpack = void 0; +const fsm = __importStar(require("@isaacs/fs-minipass")); +const node_assert_1 = __importDefault(require("node:assert")); +const node_crypto_1 = require("node:crypto"); +const node_fs_1 = __importDefault(require("node:fs")); +const node_path_1 = __importDefault(require("node:path")); +const get_write_flag_js_1 = require("./get-write-flag.js"); +const mkdir_js_1 = require("./mkdir.js"); +const normalize_unicode_js_1 = require("./normalize-unicode.js"); +const normalize_windows_path_js_1 = require("./normalize-windows-path.js"); +const parse_js_1 = require("./parse.js"); +const strip_absolute_path_js_1 = require("./strip-absolute-path.js"); +const strip_trailing_slashes_js_1 = require("./strip-trailing-slashes.js"); +const wc = __importStar(require("./winchars.js")); +const path_reservations_js_1 = require("./path-reservations.js"); +const ONENTRY = Symbol('onEntry'); +const CHECKFS = Symbol('checkFs'); +const CHECKFS2 = Symbol('checkFs2'); +const PRUNECACHE = Symbol('pruneCache'); +const ISREUSABLE = Symbol('isReusable'); +const MAKEFS = Symbol('makeFs'); +const FILE = Symbol('file'); +const DIRECTORY = Symbol('directory'); +const LINK = Symbol('link'); +const SYMLINK = Symbol('symlink'); +const HARDLINK = Symbol('hardlink'); +const UNSUPPORTED = Symbol('unsupported'); +const CHECKPATH = Symbol('checkPath'); +const MKDIR = Symbol('mkdir'); +const ONERROR = Symbol('onError'); +const PENDING = Symbol('pending'); +const PEND = Symbol('pend'); +const UNPEND = Symbol('unpend'); +const ENDED = Symbol('ended'); +const MAYBECLOSE = Symbol('maybeClose'); +const SKIP = Symbol('skip'); +const DOCHOWN = Symbol('doChown'); +const UID = Symbol('uid'); +const GID = Symbol('gid'); +const CHECKED_CWD = Symbol('checkedCwd'); +const platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform; +const isWindows = platform === 'win32'; +const DEFAULT_MAX_DEPTH = 1024; +// Unlinks on Windows are not atomic. +// +// This means that if you have a file entry, followed by another +// file entry with an identical name, and you cannot re-use the file +// (because it's a hardlink, or because unlink:true is set, or it's +// Windows, which does not have useful nlink values), then the unlink +// will be committed to the disk AFTER the new file has been written +// over the old one, deleting the new file. +// +// To work around this, on Windows systems, we rename the file and then +// delete the renamed file. It's a sloppy kludge, but frankly, I do not +// know of a better way to do this, given windows' non-atomic unlink +// semantics. +// +// See: https://github.com/npm/node-tar/issues/183 +/* c8 ignore start */ +const unlinkFile = (path, cb) => { + if (!isWindows) { + return node_fs_1.default.unlink(path, cb); + } + const name = path + '.DELETE.' + (0, node_crypto_1.randomBytes)(16).toString('hex'); + node_fs_1.default.rename(path, name, er => { + if (er) { + return cb(er); + } + node_fs_1.default.unlink(name, cb); + }); +}; +/* c8 ignore stop */ +/* c8 ignore start */ +const unlinkFileSync = (path) => { + if (!isWindows) { + return node_fs_1.default.unlinkSync(path); + } + const name = path + '.DELETE.' + (0, node_crypto_1.randomBytes)(16).toString('hex'); + node_fs_1.default.renameSync(path, name); + node_fs_1.default.unlinkSync(name); +}; +/* c8 ignore stop */ +// this.gid, entry.gid, this.processUid +const uint32 = (a, b, c) => a !== undefined && a === a >>> 0 ? a + : b !== undefined && b === b >>> 0 ? b + : c; +// clear the cache if it's a case-insensitive unicode-squashing match. +// we can't know if the current file system is case-sensitive or supports +// unicode fully, so we check for similarity on the maximally compatible +// representation. Err on the side of pruning, since all it's doing is +// preventing lstats, and it's not the end of the world if we get a false +// positive. +// Note that on windows, we always drop the entire cache whenever a +// symbolic link is encountered, because 8.3 filenames are impossible +// to reason about, and collisions are hazards rather than just failures. +const cacheKeyNormalize = (path) => (0, strip_trailing_slashes_js_1.stripTrailingSlashes)((0, normalize_windows_path_js_1.normalizeWindowsPath)((0, normalize_unicode_js_1.normalizeUnicode)(path))).toLowerCase(); +// remove all cache entries matching ${abs}/** +const pruneCache = (cache, abs) => { + abs = cacheKeyNormalize(abs); + for (const path of cache.keys()) { + const pnorm = cacheKeyNormalize(path); + if (pnorm === abs || pnorm.indexOf(abs + '/') === 0) { + cache.delete(path); + } + } +}; +const dropCache = (cache) => { + for (const key of cache.keys()) { + cache.delete(key); + } +}; +class Unpack extends parse_js_1.Parser { + [ENDED] = false; + [CHECKED_CWD] = false; + [PENDING] = 0; + reservations = new path_reservations_js_1.PathReservations(); + transform; + writable = true; + readable = false; + dirCache; + uid; + gid; + setOwner; + preserveOwner; + processGid; + processUid; + maxDepth; + forceChown; + win32; + newer; + keep; + noMtime; + preservePaths; + unlink; + cwd; + strip; + processUmask; + umask; + dmode; + fmode; + chmod; + constructor(opt = {}) { + opt.ondone = () => { + this[ENDED] = true; + this[MAYBECLOSE](); + }; + super(opt); + this.transform = opt.transform; + this.dirCache = opt.dirCache || new Map(); + this.chmod = !!opt.chmod; + if (typeof opt.uid === 'number' || typeof opt.gid === 'number') { + // need both or neither + if (typeof opt.uid !== 'number' || + typeof opt.gid !== 'number') { + throw new TypeError('cannot set owner without number uid and gid'); + } + if (opt.preserveOwner) { + throw new TypeError('cannot preserve owner in archive and also set owner explicitly'); + } + this.uid = opt.uid; + this.gid = opt.gid; + this.setOwner = true; + } + else { + this.uid = undefined; + this.gid = undefined; + this.setOwner = false; + } + // default true for root + if (opt.preserveOwner === undefined && + typeof opt.uid !== 'number') { + this.preserveOwner = !!(process.getuid && process.getuid() === 0); + } + else { + this.preserveOwner = !!opt.preserveOwner; + } + this.processUid = + (this.preserveOwner || this.setOwner) && process.getuid ? + process.getuid() + : undefined; + this.processGid = + (this.preserveOwner || this.setOwner) && process.getgid ? + process.getgid() + : undefined; + // prevent excessively deep nesting of subfolders + // set to `Infinity` to remove this restriction + this.maxDepth = + typeof opt.maxDepth === 'number' ? + opt.maxDepth + : DEFAULT_MAX_DEPTH; + // mostly just for testing, but useful in some cases. + // Forcibly trigger a chown on every entry, no matter what + this.forceChown = opt.forceChown === true; + // turn > this[ONENTRY](entry)); + } + // a bad or damaged archive is a warning for Parser, but an error + // when extracting. Mark those errors as unrecoverable, because + // the Unpack contract cannot be met. + warn(code, msg, data = {}) { + if (code === 'TAR_BAD_ARCHIVE' || code === 'TAR_ABORT') { + data.recoverable = false; + } + return super.warn(code, msg, data); + } + [MAYBECLOSE]() { + if (this[ENDED] && this[PENDING] === 0) { + this.emit('prefinish'); + this.emit('finish'); + this.emit('end'); + } + } + [CHECKPATH](entry) { + const p = (0, normalize_windows_path_js_1.normalizeWindowsPath)(entry.path); + const parts = p.split('/'); + if (this.strip) { + if (parts.length < this.strip) { + return false; + } + if (entry.type === 'Link') { + const linkparts = (0, normalize_windows_path_js_1.normalizeWindowsPath)(String(entry.linkpath)).split('/'); + if (linkparts.length >= this.strip) { + entry.linkpath = linkparts.slice(this.strip).join('/'); + } + else { + return false; + } + } + parts.splice(0, this.strip); + entry.path = parts.join('/'); + } + if (isFinite(this.maxDepth) && parts.length > this.maxDepth) { + this.warn('TAR_ENTRY_ERROR', 'path excessively deep', { + entry, + path: p, + depth: parts.length, + maxDepth: this.maxDepth, + }); + return false; + } + if (!this.preservePaths) { + if (parts.includes('..') || + /* c8 ignore next */ + (isWindows && /^[a-z]:\.\.$/i.test(parts[0] ?? ''))) { + this.warn('TAR_ENTRY_ERROR', `path contains '..'`, { + entry, + path: p, + }); + return false; + } + // strip off the root + const [root, stripped] = (0, strip_absolute_path_js_1.stripAbsolutePath)(p); + if (root) { + entry.path = String(stripped); + this.warn('TAR_ENTRY_INFO', `stripping ${root} from absolute path`, { + entry, + path: p, + }); + } + } + if (node_path_1.default.isAbsolute(entry.path)) { + entry.absolute = (0, normalize_windows_path_js_1.normalizeWindowsPath)(node_path_1.default.resolve(entry.path)); + } + else { + entry.absolute = (0, normalize_windows_path_js_1.normalizeWindowsPath)(node_path_1.default.resolve(this.cwd, entry.path)); + } + // if we somehow ended up with a path that escapes the cwd, and we are + // not in preservePaths mode, then something is fishy! This should have + // been prevented above, so ignore this for coverage. + /* c8 ignore start - defense in depth */ + if (!this.preservePaths && + typeof entry.absolute === 'string' && + entry.absolute.indexOf(this.cwd + '/') !== 0 && + entry.absolute !== this.cwd) { + this.warn('TAR_ENTRY_ERROR', 'path escaped extraction target', { + entry, + path: (0, normalize_windows_path_js_1.normalizeWindowsPath)(entry.path), + resolvedPath: entry.absolute, + cwd: this.cwd, + }); + return false; + } + /* c8 ignore stop */ + // an archive can set properties on the extraction directory, but it + // may not replace the cwd with a different kind of thing entirely. + if (entry.absolute === this.cwd && + entry.type !== 'Directory' && + entry.type !== 'GNUDumpDir') { + return false; + } + // only encode : chars that aren't drive letter indicators + if (this.win32) { + const { root: aRoot } = node_path_1.default.win32.parse(String(entry.absolute)); + entry.absolute = + aRoot + wc.encode(String(entry.absolute).slice(aRoot.length)); + const { root: pRoot } = node_path_1.default.win32.parse(entry.path); + entry.path = pRoot + wc.encode(entry.path.slice(pRoot.length)); + } + return true; + } + [ONENTRY](entry) { + if (!this[CHECKPATH](entry)) { + return entry.resume(); + } + node_assert_1.default.equal(typeof entry.absolute, 'string'); + switch (entry.type) { + case 'Directory': + case 'GNUDumpDir': + if (entry.mode) { + entry.mode = entry.mode | 0o700; + } + // eslint-disable-next-line no-fallthrough + case 'File': + case 'OldFile': + case 'ContiguousFile': + case 'Link': + case 'SymbolicLink': + return this[CHECKFS](entry); + case 'CharacterDevice': + case 'BlockDevice': + case 'FIFO': + default: + return this[UNSUPPORTED](entry); + } + } + [ONERROR](er, entry) { + // Cwd has to exist, or else nothing works. That's serious. + // Other errors are warnings, which raise the error in strict + // mode, but otherwise continue on. + if (er.name === 'CwdError') { + this.emit('error', er); + } + else { + this.warn('TAR_ENTRY_ERROR', er, { entry }); + this[UNPEND](); + entry.resume(); + } + } + [MKDIR](dir, mode, cb) { + (0, mkdir_js_1.mkdir)((0, normalize_windows_path_js_1.normalizeWindowsPath)(dir), { + uid: this.uid, + gid: this.gid, + processUid: this.processUid, + processGid: this.processGid, + umask: this.processUmask, + preserve: this.preservePaths, + unlink: this.unlink, + cache: this.dirCache, + cwd: this.cwd, + mode: mode, + }, cb); + } + [DOCHOWN](entry) { + // in preserve owner mode, chown if the entry doesn't match process + // in set owner mode, chown if setting doesn't match process + return (this.forceChown || + (this.preserveOwner && + ((typeof entry.uid === 'number' && + entry.uid !== this.processUid) || + (typeof entry.gid === 'number' && + entry.gid !== this.processGid))) || + (typeof this.uid === 'number' && + this.uid !== this.processUid) || + (typeof this.gid === 'number' && this.gid !== this.processGid)); + } + [UID](entry) { + return uint32(this.uid, entry.uid, this.processUid); + } + [GID](entry) { + return uint32(this.gid, entry.gid, this.processGid); + } + [FILE](entry, fullyDone) { + const mode = typeof entry.mode === 'number' ? + entry.mode & 0o7777 + : this.fmode; + const stream = new fsm.WriteStream(String(entry.absolute), { + // slight lie, but it can be numeric flags + flags: (0, get_write_flag_js_1.getWriteFlag)(entry.size), + mode: mode, + autoClose: false, + }); + stream.on('error', (er) => { + if (stream.fd) { + node_fs_1.default.close(stream.fd, () => { }); + } + // flush all the data out so that we aren't left hanging + // if the error wasn't actually fatal. otherwise the parse + // is blocked, and we never proceed. + stream.write = () => true; + this[ONERROR](er, entry); + fullyDone(); + }); + let actions = 1; + const done = (er) => { + if (er) { + /* c8 ignore start - we should always have a fd by now */ + if (stream.fd) { + node_fs_1.default.close(stream.fd, () => { }); + } + /* c8 ignore stop */ + this[ONERROR](er, entry); + fullyDone(); + return; + } + if (--actions === 0) { + if (stream.fd !== undefined) { + node_fs_1.default.close(stream.fd, er => { + if (er) { + this[ONERROR](er, entry); + } + else { + this[UNPEND](); + } + fullyDone(); + }); + } + } + }; + stream.on('finish', () => { + // if futimes fails, try utimes + // if utimes fails, fail with the original error + // same for fchown/chown + const abs = String(entry.absolute); + const fd = stream.fd; + if (typeof fd === 'number' && entry.mtime && !this.noMtime) { + actions++; + const atime = entry.atime || new Date(); + const mtime = entry.mtime; + node_fs_1.default.futimes(fd, atime, mtime, er => er ? + node_fs_1.default.utimes(abs, atime, mtime, er2 => done(er2 && er)) + : done()); + } + if (typeof fd === 'number' && this[DOCHOWN](entry)) { + actions++; + const uid = this[UID](entry); + const gid = this[GID](entry); + if (typeof uid === 'number' && typeof gid === 'number') { + node_fs_1.default.fchown(fd, uid, gid, er => er ? + node_fs_1.default.chown(abs, uid, gid, er2 => done(er2 && er)) + : done()); + } + } + done(); + }); + const tx = this.transform ? this.transform(entry) || entry : entry; + if (tx !== entry) { + tx.on('error', (er) => { + this[ONERROR](er, entry); + fullyDone(); + }); + entry.pipe(tx); + } + tx.pipe(stream); + } + [DIRECTORY](entry, fullyDone) { + const mode = typeof entry.mode === 'number' ? + entry.mode & 0o7777 + : this.dmode; + this[MKDIR](String(entry.absolute), mode, er => { + if (er) { + this[ONERROR](er, entry); + fullyDone(); + return; + } + let actions = 1; + const done = () => { + if (--actions === 0) { + fullyDone(); + this[UNPEND](); + entry.resume(); + } + }; + if (entry.mtime && !this.noMtime) { + actions++; + node_fs_1.default.utimes(String(entry.absolute), entry.atime || new Date(), entry.mtime, done); + } + if (this[DOCHOWN](entry)) { + actions++; + node_fs_1.default.chown(String(entry.absolute), Number(this[UID](entry)), Number(this[GID](entry)), done); + } + done(); + }); + } + [UNSUPPORTED](entry) { + entry.unsupported = true; + this.warn('TAR_ENTRY_UNSUPPORTED', `unsupported entry type: ${entry.type}`, { entry }); + entry.resume(); + } + [SYMLINK](entry, done) { + this[LINK](entry, String(entry.linkpath), 'symlink', done); + } + [HARDLINK](entry, done) { + const linkpath = (0, normalize_windows_path_js_1.normalizeWindowsPath)(node_path_1.default.resolve(this.cwd, String(entry.linkpath))); + this[LINK](entry, linkpath, 'link', done); + } + [PEND]() { + this[PENDING]++; + } + [UNPEND]() { + this[PENDING]--; + this[MAYBECLOSE](); + } + [SKIP](entry) { + this[UNPEND](); + entry.resume(); + } + // Check if we can reuse an existing filesystem entry safely and + // overwrite it, rather than unlinking and recreating + // Windows doesn't report a useful nlink, so we just never reuse entries + [ISREUSABLE](entry, st) { + return (entry.type === 'File' && + !this.unlink && + st.isFile() && + st.nlink <= 1 && + !isWindows); + } + // check if a thing is there, and if so, try to clobber it + [CHECKFS](entry) { + this[PEND](); + const paths = [entry.path]; + if (entry.linkpath) { + paths.push(entry.linkpath); + } + this.reservations.reserve(paths, done => this[CHECKFS2](entry, done)); + } + [PRUNECACHE](entry) { + // if we are not creating a directory, and the path is in the dirCache, + // then that means we are about to delete the directory we created + // previously, and it is no longer going to be a directory, and neither + // is any of its children. + // If a symbolic link is encountered, all bets are off. There is no + // reasonable way to sanitize the cache in such a way we will be able to + // avoid having filesystem collisions. If this happens with a non-symlink + // entry, it'll just fail to unpack, but a symlink to a directory, using an + // 8.3 shortname or certain unicode attacks, can evade detection and lead + // to arbitrary writes to anywhere on the system. + if (entry.type === 'SymbolicLink') { + dropCache(this.dirCache); + } + else if (entry.type !== 'Directory') { + pruneCache(this.dirCache, String(entry.absolute)); + } + } + [CHECKFS2](entry, fullyDone) { + this[PRUNECACHE](entry); + const done = (er) => { + this[PRUNECACHE](entry); + fullyDone(er); + }; + const checkCwd = () => { + this[MKDIR](this.cwd, this.dmode, er => { + if (er) { + this[ONERROR](er, entry); + done(); + return; + } + this[CHECKED_CWD] = true; + start(); + }); + }; + const start = () => { + if (entry.absolute !== this.cwd) { + const parent = (0, normalize_windows_path_js_1.normalizeWindowsPath)(node_path_1.default.dirname(String(entry.absolute))); + if (parent !== this.cwd) { + return this[MKDIR](parent, this.dmode, er => { + if (er) { + this[ONERROR](er, entry); + done(); + return; + } + afterMakeParent(); + }); + } + } + afterMakeParent(); + }; + const afterMakeParent = () => { + node_fs_1.default.lstat(String(entry.absolute), (lstatEr, st) => { + if (st && + (this.keep || + /* c8 ignore next */ + (this.newer && st.mtime > (entry.mtime ?? st.mtime)))) { + this[SKIP](entry); + done(); + return; + } + if (lstatEr || this[ISREUSABLE](entry, st)) { + return this[MAKEFS](null, entry, done); + } + if (st.isDirectory()) { + if (entry.type === 'Directory') { + const needChmod = this.chmod && + entry.mode && + (st.mode & 0o7777) !== entry.mode; + const afterChmod = (er) => this[MAKEFS](er ?? null, entry, done); + if (!needChmod) { + return afterChmod(); + } + return node_fs_1.default.chmod(String(entry.absolute), Number(entry.mode), afterChmod); + } + // Not a dir entry, have to remove it. + // NB: the only way to end up with an entry that is the cwd + // itself, in such a way that == does not detect, is a + // tricky windows absolute path with UNC or 8.3 parts (and + // preservePaths:true, or else it will have been stripped). + // In that case, the user has opted out of path protections + // explicitly, so if they blow away the cwd, c'est la vie. + if (entry.absolute !== this.cwd) { + return node_fs_1.default.rmdir(String(entry.absolute), (er) => this[MAKEFS](er ?? null, entry, done)); + } + } + // not a dir, and not reusable + // don't remove if the cwd, we want that error + if (entry.absolute === this.cwd) { + return this[MAKEFS](null, entry, done); + } + unlinkFile(String(entry.absolute), er => this[MAKEFS](er ?? null, entry, done)); + }); + }; + if (this[CHECKED_CWD]) { + start(); + } + else { + checkCwd(); + } + } + [MAKEFS](er, entry, done) { + if (er) { + this[ONERROR](er, entry); + done(); + return; + } + switch (entry.type) { + case 'File': + case 'OldFile': + case 'ContiguousFile': + return this[FILE](entry, done); + case 'Link': + return this[HARDLINK](entry, done); + case 'SymbolicLink': + return this[SYMLINK](entry, done); + case 'Directory': + case 'GNUDumpDir': + return this[DIRECTORY](entry, done); + } + } + [LINK](entry, linkpath, link, done) { + // XXX: get the type ('symlink' or 'junction') for windows + node_fs_1.default[link](linkpath, String(entry.absolute), er => { + if (er) { + this[ONERROR](er, entry); + } + else { + this[UNPEND](); + entry.resume(); + } + done(); + }); + } +} +exports.Unpack = Unpack; +const callSync = (fn) => { + try { + return [null, fn()]; + } + catch (er) { + return [er, null]; + } +}; +class UnpackSync extends Unpack { + sync = true; + [MAKEFS](er, entry) { + return super[MAKEFS](er, entry, () => { }); + } + [CHECKFS](entry) { + this[PRUNECACHE](entry); + if (!this[CHECKED_CWD]) { + const er = this[MKDIR](this.cwd, this.dmode); + if (er) { + return this[ONERROR](er, entry); + } + this[CHECKED_CWD] = true; + } + // don't bother to make the parent if the current entry is the cwd, + // we've already checked it. + if (entry.absolute !== this.cwd) { + const parent = (0, normalize_windows_path_js_1.normalizeWindowsPath)(node_path_1.default.dirname(String(entry.absolute))); + if (parent !== this.cwd) { + const mkParent = this[MKDIR](parent, this.dmode); + if (mkParent) { + return this[ONERROR](mkParent, entry); + } + } + } + const [lstatEr, st] = callSync(() => node_fs_1.default.lstatSync(String(entry.absolute))); + if (st && + (this.keep || + /* c8 ignore next */ + (this.newer && st.mtime > (entry.mtime ?? st.mtime)))) { + return this[SKIP](entry); + } + if (lstatEr || this[ISREUSABLE](entry, st)) { + return this[MAKEFS](null, entry); + } + if (st.isDirectory()) { + if (entry.type === 'Directory') { + const needChmod = this.chmod && + entry.mode && + (st.mode & 0o7777) !== entry.mode; + const [er] = needChmod ? + callSync(() => { + node_fs_1.default.chmodSync(String(entry.absolute), Number(entry.mode)); + }) + : []; + return this[MAKEFS](er, entry); + } + // not a dir entry, have to remove it + const [er] = callSync(() => node_fs_1.default.rmdirSync(String(entry.absolute))); + this[MAKEFS](er, entry); + } + // not a dir, and not reusable. + // don't remove if it's the cwd, since we want that error. + const [er] = entry.absolute === this.cwd ? + [] + : callSync(() => unlinkFileSync(String(entry.absolute))); + this[MAKEFS](er, entry); + } + [FILE](entry, done) { + const mode = typeof entry.mode === 'number' ? + entry.mode & 0o7777 + : this.fmode; + const oner = (er) => { + let closeError; + try { + node_fs_1.default.closeSync(fd); + } + catch (e) { + closeError = e; + } + if (er || closeError) { + this[ONERROR](er || closeError, entry); + } + done(); + }; + let fd; + try { + fd = node_fs_1.default.openSync(String(entry.absolute), (0, get_write_flag_js_1.getWriteFlag)(entry.size), mode); + } + catch (er) { + return oner(er); + } + const tx = this.transform ? this.transform(entry) || entry : entry; + if (tx !== entry) { + tx.on('error', (er) => this[ONERROR](er, entry)); + entry.pipe(tx); + } + tx.on('data', (chunk) => { + try { + node_fs_1.default.writeSync(fd, chunk, 0, chunk.length); + } + catch (er) { + oner(er); + } + }); + tx.on('end', () => { + let er = null; + // try both, falling futimes back to utimes + // if either fails, handle the first error + if (entry.mtime && !this.noMtime) { + const atime = entry.atime || new Date(); + const mtime = entry.mtime; + try { + node_fs_1.default.futimesSync(fd, atime, mtime); + } + catch (futimeser) { + try { + node_fs_1.default.utimesSync(String(entry.absolute), atime, mtime); + } + catch (utimeser) { + er = futimeser; + } + } + } + if (this[DOCHOWN](entry)) { + const uid = this[UID](entry); + const gid = this[GID](entry); + try { + node_fs_1.default.fchownSync(fd, Number(uid), Number(gid)); + } + catch (fchowner) { + try { + node_fs_1.default.chownSync(String(entry.absolute), Number(uid), Number(gid)); + } + catch (chowner) { + er = er || fchowner; + } + } + } + oner(er); + }); + } + [DIRECTORY](entry, done) { + const mode = typeof entry.mode === 'number' ? + entry.mode & 0o7777 + : this.dmode; + const er = this[MKDIR](String(entry.absolute), mode); + if (er) { + this[ONERROR](er, entry); + done(); + return; + } + if (entry.mtime && !this.noMtime) { + try { + node_fs_1.default.utimesSync(String(entry.absolute), entry.atime || new Date(), entry.mtime); + /* c8 ignore next */ + } + catch (er) { } + } + if (this[DOCHOWN](entry)) { + try { + node_fs_1.default.chownSync(String(entry.absolute), Number(this[UID](entry)), Number(this[GID](entry))); + } + catch (er) { } + } + done(); + entry.resume(); + } + [MKDIR](dir, mode) { + try { + return (0, mkdir_js_1.mkdirSync)((0, normalize_windows_path_js_1.normalizeWindowsPath)(dir), { + uid: this.uid, + gid: this.gid, + processUid: this.processUid, + processGid: this.processGid, + umask: this.processUmask, + preserve: this.preservePaths, + unlink: this.unlink, + cache: this.dirCache, + cwd: this.cwd, + mode: mode, + }); + } + catch (er) { + return er; + } + } + [LINK](entry, linkpath, link, done) { + const ls = `${link}Sync`; + try { + node_fs_1.default[ls](linkpath, String(entry.absolute)); + done(); + entry.resume(); + } + catch (er) { + return this[ONERROR](er, entry); + } + } +} +exports.UnpackSync = UnpackSync; +//# sourceMappingURL=unpack.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/update.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/update.js new file mode 100644 index 00000000000000..7687896f4bfeeb --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/update.js @@ -0,0 +1,33 @@ +"use strict"; +// tar -u +Object.defineProperty(exports, "__esModule", { value: true }); +exports.update = void 0; +const make_command_js_1 = require("./make-command.js"); +const replace_js_1 = require("./replace.js"); +// just call tar.r with the filter and mtimeCache +exports.update = (0, make_command_js_1.makeCommand)(replace_js_1.replace.syncFile, replace_js_1.replace.asyncFile, replace_js_1.replace.syncNoFile, replace_js_1.replace.asyncNoFile, (opt, entries = []) => { + replace_js_1.replace.validate?.(opt, entries); + mtimeFilter(opt); +}); +const mtimeFilter = (opt) => { + const filter = opt.filter; + if (!opt.mtimeCache) { + opt.mtimeCache = new Map(); + } + opt.filter = + filter ? + (path, stat) => filter(path, stat) && + !( + /* c8 ignore start */ + ((opt.mtimeCache?.get(path) ?? stat.mtime ?? 0) > + (stat.mtime ?? 0)) + /* c8 ignore stop */ + ) + : (path, stat) => !( + /* c8 ignore start */ + ((opt.mtimeCache?.get(path) ?? stat.mtime ?? 0) > + (stat.mtime ?? 0)) + /* c8 ignore stop */ + ); +}; +//# sourceMappingURL=update.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/warn-method.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/warn-method.js new file mode 100644 index 00000000000000..f25502776e36a3 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/warn-method.js @@ -0,0 +1,31 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.warnMethod = void 0; +const warnMethod = (self, code, message, data = {}) => { + if (self.file) { + data.file = self.file; + } + if (self.cwd) { + data.cwd = self.cwd; + } + data.code = + (message instanceof Error && + message.code) || + code; + data.tarCode = code; + if (!self.strict && data.recoverable !== false) { + if (message instanceof Error) { + data = Object.assign(message, data); + message = message.message; + } + self.emit('warn', code, message, data); + } + else if (message instanceof Error) { + self.emit('error', Object.assign(message, data)); + } + else { + self.emit('error', Object.assign(new Error(`${code}: ${message}`), data)); + } +}; +exports.warnMethod = warnMethod; +//# sourceMappingURL=warn-method.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/winchars.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/winchars.js new file mode 100644 index 00000000000000..c0a4405812929e --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/winchars.js @@ -0,0 +1,14 @@ +"use strict"; +// When writing files on Windows, translate the characters to their +// 0xf000 higher-encoded versions. +Object.defineProperty(exports, "__esModule", { value: true }); +exports.decode = exports.encode = void 0; +const raw = ['|', '<', '>', '?', ':']; +const win = raw.map(char => String.fromCharCode(0xf000 + char.charCodeAt(0))); +const toWin = new Map(raw.map((char, i) => [char, win[i]])); +const toRaw = new Map(win.map((char, i) => [char, raw[i]])); +const encode = (s) => raw.reduce((s, c) => s.split(c).join(toWin.get(c)), s); +exports.encode = encode; +const decode = (s) => win.reduce((s, c) => s.split(c).join(toRaw.get(c)), s); +exports.decode = decode; +//# sourceMappingURL=winchars.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/write-entry.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/write-entry.js new file mode 100644 index 00000000000000..45b7efeb795027 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/commonjs/write-entry.js @@ -0,0 +1,689 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.WriteEntryTar = exports.WriteEntrySync = exports.WriteEntry = void 0; +const fs_1 = __importDefault(require("fs")); +const minipass_1 = require("minipass"); +const path_1 = __importDefault(require("path")); +const header_js_1 = require("./header.js"); +const mode_fix_js_1 = require("./mode-fix.js"); +const normalize_windows_path_js_1 = require("./normalize-windows-path.js"); +const options_js_1 = require("./options.js"); +const pax_js_1 = require("./pax.js"); +const strip_absolute_path_js_1 = require("./strip-absolute-path.js"); +const strip_trailing_slashes_js_1 = require("./strip-trailing-slashes.js"); +const warn_method_js_1 = require("./warn-method.js"); +const winchars = __importStar(require("./winchars.js")); +const prefixPath = (path, prefix) => { + if (!prefix) { + return (0, normalize_windows_path_js_1.normalizeWindowsPath)(path); + } + path = (0, normalize_windows_path_js_1.normalizeWindowsPath)(path).replace(/^\.(\/|$)/, ''); + return (0, strip_trailing_slashes_js_1.stripTrailingSlashes)(prefix) + '/' + path; +}; +const maxReadSize = 16 * 1024 * 1024; +const PROCESS = Symbol('process'); +const FILE = Symbol('file'); +const DIRECTORY = Symbol('directory'); +const SYMLINK = Symbol('symlink'); +const HARDLINK = Symbol('hardlink'); +const HEADER = Symbol('header'); +const READ = Symbol('read'); +const LSTAT = Symbol('lstat'); +const ONLSTAT = Symbol('onlstat'); +const ONREAD = Symbol('onread'); +const ONREADLINK = Symbol('onreadlink'); +const OPENFILE = Symbol('openfile'); +const ONOPENFILE = Symbol('onopenfile'); +const CLOSE = Symbol('close'); +const MODE = Symbol('mode'); +const AWAITDRAIN = Symbol('awaitDrain'); +const ONDRAIN = Symbol('ondrain'); +const PREFIX = Symbol('prefix'); +class WriteEntry extends minipass_1.Minipass { + path; + portable; + myuid = (process.getuid && process.getuid()) || 0; + // until node has builtin pwnam functions, this'll have to do + myuser = process.env.USER || ''; + maxReadSize; + linkCache; + statCache; + preservePaths; + cwd; + strict; + mtime; + noPax; + noMtime; + prefix; + fd; + blockLen = 0; + blockRemain = 0; + buf; + pos = 0; + remain = 0; + length = 0; + offset = 0; + win32; + absolute; + header; + type; + linkpath; + stat; + onWriteEntry; + #hadError = false; + constructor(p, opt_ = {}) { + const opt = (0, options_js_1.dealias)(opt_); + super(); + this.path = (0, normalize_windows_path_js_1.normalizeWindowsPath)(p); + // suppress atime, ctime, uid, gid, uname, gname + this.portable = !!opt.portable; + this.maxReadSize = opt.maxReadSize || maxReadSize; + this.linkCache = opt.linkCache || new Map(); + this.statCache = opt.statCache || new Map(); + this.preservePaths = !!opt.preservePaths; + this.cwd = (0, normalize_windows_path_js_1.normalizeWindowsPath)(opt.cwd || process.cwd()); + this.strict = !!opt.strict; + this.noPax = !!opt.noPax; + this.noMtime = !!opt.noMtime; + this.mtime = opt.mtime; + this.prefix = + opt.prefix ? (0, normalize_windows_path_js_1.normalizeWindowsPath)(opt.prefix) : undefined; + this.onWriteEntry = opt.onWriteEntry; + if (typeof opt.onwarn === 'function') { + this.on('warn', opt.onwarn); + } + let pathWarn = false; + if (!this.preservePaths) { + const [root, stripped] = (0, strip_absolute_path_js_1.stripAbsolutePath)(this.path); + if (root && typeof stripped === 'string') { + this.path = stripped; + pathWarn = root; + } + } + this.win32 = !!opt.win32 || process.platform === 'win32'; + if (this.win32) { + // force the \ to / normalization, since we might not *actually* + // be on windows, but want \ to be considered a path separator. + this.path = winchars.decode(this.path.replace(/\\/g, '/')); + p = p.replace(/\\/g, '/'); + } + this.absolute = (0, normalize_windows_path_js_1.normalizeWindowsPath)(opt.absolute || path_1.default.resolve(this.cwd, p)); + if (this.path === '') { + this.path = './'; + } + if (pathWarn) { + this.warn('TAR_ENTRY_INFO', `stripping ${pathWarn} from absolute path`, { + entry: this, + path: pathWarn + this.path, + }); + } + const cs = this.statCache.get(this.absolute); + if (cs) { + this[ONLSTAT](cs); + } + else { + this[LSTAT](); + } + } + warn(code, message, data = {}) { + return (0, warn_method_js_1.warnMethod)(this, code, message, data); + } + emit(ev, ...data) { + if (ev === 'error') { + this.#hadError = true; + } + return super.emit(ev, ...data); + } + [LSTAT]() { + fs_1.default.lstat(this.absolute, (er, stat) => { + if (er) { + return this.emit('error', er); + } + this[ONLSTAT](stat); + }); + } + [ONLSTAT](stat) { + this.statCache.set(this.absolute, stat); + this.stat = stat; + if (!stat.isFile()) { + stat.size = 0; + } + this.type = getType(stat); + this.emit('stat', stat); + this[PROCESS](); + } + [PROCESS]() { + switch (this.type) { + case 'File': + return this[FILE](); + case 'Directory': + return this[DIRECTORY](); + case 'SymbolicLink': + return this[SYMLINK](); + // unsupported types are ignored. + default: + return this.end(); + } + } + [MODE](mode) { + return (0, mode_fix_js_1.modeFix)(mode, this.type === 'Directory', this.portable); + } + [PREFIX](path) { + return prefixPath(path, this.prefix); + } + [HEADER]() { + /* c8 ignore start */ + if (!this.stat) { + throw new Error('cannot write header before stat'); + } + /* c8 ignore stop */ + if (this.type === 'Directory' && this.portable) { + this.noMtime = true; + } + this.onWriteEntry?.(this); + this.header = new header_js_1.Header({ + path: this[PREFIX](this.path), + // only apply the prefix to hard links. + linkpath: this.type === 'Link' && this.linkpath !== undefined ? + this[PREFIX](this.linkpath) + : this.linkpath, + // only the permissions and setuid/setgid/sticky bitflags + // not the higher-order bits that specify file type + mode: this[MODE](this.stat.mode), + uid: this.portable ? undefined : this.stat.uid, + gid: this.portable ? undefined : this.stat.gid, + size: this.stat.size, + mtime: this.noMtime ? undefined : this.mtime || this.stat.mtime, + /* c8 ignore next */ + type: this.type === 'Unsupported' ? undefined : this.type, + uname: this.portable ? undefined + : this.stat.uid === this.myuid ? this.myuser + : '', + atime: this.portable ? undefined : this.stat.atime, + ctime: this.portable ? undefined : this.stat.ctime, + }); + if (this.header.encode() && !this.noPax) { + super.write(new pax_js_1.Pax({ + atime: this.portable ? undefined : this.header.atime, + ctime: this.portable ? undefined : this.header.ctime, + gid: this.portable ? undefined : this.header.gid, + mtime: this.noMtime ? undefined : (this.mtime || this.header.mtime), + path: this[PREFIX](this.path), + linkpath: this.type === 'Link' && this.linkpath !== undefined ? + this[PREFIX](this.linkpath) + : this.linkpath, + size: this.header.size, + uid: this.portable ? undefined : this.header.uid, + uname: this.portable ? undefined : this.header.uname, + dev: this.portable ? undefined : this.stat.dev, + ino: this.portable ? undefined : this.stat.ino, + nlink: this.portable ? undefined : this.stat.nlink, + }).encode()); + } + const block = this.header?.block; + /* c8 ignore start */ + if (!block) { + throw new Error('failed to encode header'); + } + /* c8 ignore stop */ + super.write(block); + } + [DIRECTORY]() { + /* c8 ignore start */ + if (!this.stat) { + throw new Error('cannot create directory entry without stat'); + } + /* c8 ignore stop */ + if (this.path.slice(-1) !== '/') { + this.path += '/'; + } + this.stat.size = 0; + this[HEADER](); + this.end(); + } + [SYMLINK]() { + fs_1.default.readlink(this.absolute, (er, linkpath) => { + if (er) { + return this.emit('error', er); + } + this[ONREADLINK](linkpath); + }); + } + [ONREADLINK](linkpath) { + this.linkpath = (0, normalize_windows_path_js_1.normalizeWindowsPath)(linkpath); + this[HEADER](); + this.end(); + } + [HARDLINK](linkpath) { + /* c8 ignore start */ + if (!this.stat) { + throw new Error('cannot create link entry without stat'); + } + /* c8 ignore stop */ + this.type = 'Link'; + this.linkpath = (0, normalize_windows_path_js_1.normalizeWindowsPath)(path_1.default.relative(this.cwd, linkpath)); + this.stat.size = 0; + this[HEADER](); + this.end(); + } + [FILE]() { + /* c8 ignore start */ + if (!this.stat) { + throw new Error('cannot create file entry without stat'); + } + /* c8 ignore stop */ + if (this.stat.nlink > 1) { + const linkKey = `${this.stat.dev}:${this.stat.ino}`; + const linkpath = this.linkCache.get(linkKey); + if (linkpath?.indexOf(this.cwd) === 0) { + return this[HARDLINK](linkpath); + } + this.linkCache.set(linkKey, this.absolute); + } + this[HEADER](); + if (this.stat.size === 0) { + return this.end(); + } + this[OPENFILE](); + } + [OPENFILE]() { + fs_1.default.open(this.absolute, 'r', (er, fd) => { + if (er) { + return this.emit('error', er); + } + this[ONOPENFILE](fd); + }); + } + [ONOPENFILE](fd) { + this.fd = fd; + if (this.#hadError) { + return this[CLOSE](); + } + /* c8 ignore start */ + if (!this.stat) { + throw new Error('should stat before calling onopenfile'); + } + /* c8 ignore start */ + this.blockLen = 512 * Math.ceil(this.stat.size / 512); + this.blockRemain = this.blockLen; + const bufLen = Math.min(this.blockLen, this.maxReadSize); + this.buf = Buffer.allocUnsafe(bufLen); + this.offset = 0; + this.pos = 0; + this.remain = this.stat.size; + this.length = this.buf.length; + this[READ](); + } + [READ]() { + const { fd, buf, offset, length, pos } = this; + if (fd === undefined || buf === undefined) { + throw new Error('cannot read file without first opening'); + } + fs_1.default.read(fd, buf, offset, length, pos, (er, bytesRead) => { + if (er) { + // ignoring the error from close(2) is a bad practice, but at + // this point we already have an error, don't need another one + return this[CLOSE](() => this.emit('error', er)); + } + this[ONREAD](bytesRead); + }); + } + /* c8 ignore start */ + [CLOSE](cb = () => { }) { + /* c8 ignore stop */ + if (this.fd !== undefined) + fs_1.default.close(this.fd, cb); + } + [ONREAD](bytesRead) { + if (bytesRead <= 0 && this.remain > 0) { + const er = Object.assign(new Error('encountered unexpected EOF'), { + path: this.absolute, + syscall: 'read', + code: 'EOF', + }); + return this[CLOSE](() => this.emit('error', er)); + } + if (bytesRead > this.remain) { + const er = Object.assign(new Error('did not encounter expected EOF'), { + path: this.absolute, + syscall: 'read', + code: 'EOF', + }); + return this[CLOSE](() => this.emit('error', er)); + } + /* c8 ignore start */ + if (!this.buf) { + throw new Error('should have created buffer prior to reading'); + } + /* c8 ignore stop */ + // null out the rest of the buffer, if we could fit the block padding + // at the end of this loop, we've incremented bytesRead and this.remain + // to be incremented up to the blockRemain level, as if we had expected + // to get a null-padded file, and read it until the end. then we will + // decrement both remain and blockRemain by bytesRead, and know that we + // reached the expected EOF, without any null buffer to append. + if (bytesRead === this.remain) { + for (let i = bytesRead; i < this.length && bytesRead < this.blockRemain; i++) { + this.buf[i + this.offset] = 0; + bytesRead++; + this.remain++; + } + } + const chunk = this.offset === 0 && bytesRead === this.buf.length ? + this.buf + : this.buf.subarray(this.offset, this.offset + bytesRead); + const flushed = this.write(chunk); + if (!flushed) { + this[AWAITDRAIN](() => this[ONDRAIN]()); + } + else { + this[ONDRAIN](); + } + } + [AWAITDRAIN](cb) { + this.once('drain', cb); + } + write(chunk, encoding, cb) { + /* c8 ignore start - just junk to comply with NodeJS.WritableStream */ + if (typeof encoding === 'function') { + cb = encoding; + encoding = undefined; + } + if (typeof chunk === 'string') { + chunk = Buffer.from(chunk, typeof encoding === 'string' ? encoding : 'utf8'); + } + /* c8 ignore stop */ + if (this.blockRemain < chunk.length) { + const er = Object.assign(new Error('writing more data than expected'), { + path: this.absolute, + }); + return this.emit('error', er); + } + this.remain -= chunk.length; + this.blockRemain -= chunk.length; + this.pos += chunk.length; + this.offset += chunk.length; + return super.write(chunk, null, cb); + } + [ONDRAIN]() { + if (!this.remain) { + if (this.blockRemain) { + super.write(Buffer.alloc(this.blockRemain)); + } + return this[CLOSE](er => er ? this.emit('error', er) : this.end()); + } + /* c8 ignore start */ + if (!this.buf) { + throw new Error('buffer lost somehow in ONDRAIN'); + } + /* c8 ignore stop */ + if (this.offset >= this.length) { + // if we only have a smaller bit left to read, alloc a smaller buffer + // otherwise, keep it the same length it was before. + this.buf = Buffer.allocUnsafe(Math.min(this.blockRemain, this.buf.length)); + this.offset = 0; + } + this.length = this.buf.length - this.offset; + this[READ](); + } +} +exports.WriteEntry = WriteEntry; +class WriteEntrySync extends WriteEntry { + sync = true; + [LSTAT]() { + this[ONLSTAT](fs_1.default.lstatSync(this.absolute)); + } + [SYMLINK]() { + this[ONREADLINK](fs_1.default.readlinkSync(this.absolute)); + } + [OPENFILE]() { + this[ONOPENFILE](fs_1.default.openSync(this.absolute, 'r')); + } + [READ]() { + let threw = true; + try { + const { fd, buf, offset, length, pos } = this; + /* c8 ignore start */ + if (fd === undefined || buf === undefined) { + throw new Error('fd and buf must be set in READ method'); + } + /* c8 ignore stop */ + const bytesRead = fs_1.default.readSync(fd, buf, offset, length, pos); + this[ONREAD](bytesRead); + threw = false; + } + finally { + // ignoring the error from close(2) is a bad practice, but at + // this point we already have an error, don't need another one + if (threw) { + try { + this[CLOSE](() => { }); + } + catch (er) { } + } + } + } + [AWAITDRAIN](cb) { + cb(); + } + /* c8 ignore start */ + [CLOSE](cb = () => { }) { + /* c8 ignore stop */ + if (this.fd !== undefined) + fs_1.default.closeSync(this.fd); + cb(); + } +} +exports.WriteEntrySync = WriteEntrySync; +class WriteEntryTar extends minipass_1.Minipass { + blockLen = 0; + blockRemain = 0; + buf = 0; + pos = 0; + remain = 0; + length = 0; + preservePaths; + portable; + strict; + noPax; + noMtime; + readEntry; + type; + prefix; + path; + mode; + uid; + gid; + uname; + gname; + header; + mtime; + atime; + ctime; + linkpath; + size; + onWriteEntry; + warn(code, message, data = {}) { + return (0, warn_method_js_1.warnMethod)(this, code, message, data); + } + constructor(readEntry, opt_ = {}) { + const opt = (0, options_js_1.dealias)(opt_); + super(); + this.preservePaths = !!opt.preservePaths; + this.portable = !!opt.portable; + this.strict = !!opt.strict; + this.noPax = !!opt.noPax; + this.noMtime = !!opt.noMtime; + this.onWriteEntry = opt.onWriteEntry; + this.readEntry = readEntry; + const { type } = readEntry; + /* c8 ignore start */ + if (type === 'Unsupported') { + throw new Error('writing entry that should be ignored'); + } + /* c8 ignore stop */ + this.type = type; + if (this.type === 'Directory' && this.portable) { + this.noMtime = true; + } + this.prefix = opt.prefix; + this.path = (0, normalize_windows_path_js_1.normalizeWindowsPath)(readEntry.path); + this.mode = + readEntry.mode !== undefined ? + this[MODE](readEntry.mode) + : undefined; + this.uid = this.portable ? undefined : readEntry.uid; + this.gid = this.portable ? undefined : readEntry.gid; + this.uname = this.portable ? undefined : readEntry.uname; + this.gname = this.portable ? undefined : readEntry.gname; + this.size = readEntry.size; + this.mtime = + this.noMtime ? undefined : opt.mtime || readEntry.mtime; + this.atime = this.portable ? undefined : readEntry.atime; + this.ctime = this.portable ? undefined : readEntry.ctime; + this.linkpath = + readEntry.linkpath !== undefined ? + (0, normalize_windows_path_js_1.normalizeWindowsPath)(readEntry.linkpath) + : undefined; + if (typeof opt.onwarn === 'function') { + this.on('warn', opt.onwarn); + } + let pathWarn = false; + if (!this.preservePaths) { + const [root, stripped] = (0, strip_absolute_path_js_1.stripAbsolutePath)(this.path); + if (root && typeof stripped === 'string') { + this.path = stripped; + pathWarn = root; + } + } + this.remain = readEntry.size; + this.blockRemain = readEntry.startBlockSize; + this.onWriteEntry?.(this); + this.header = new header_js_1.Header({ + path: this[PREFIX](this.path), + linkpath: this.type === 'Link' && this.linkpath !== undefined ? + this[PREFIX](this.linkpath) + : this.linkpath, + // only the permissions and setuid/setgid/sticky bitflags + // not the higher-order bits that specify file type + mode: this.mode, + uid: this.portable ? undefined : this.uid, + gid: this.portable ? undefined : this.gid, + size: this.size, + mtime: this.noMtime ? undefined : this.mtime, + type: this.type, + uname: this.portable ? undefined : this.uname, + atime: this.portable ? undefined : this.atime, + ctime: this.portable ? undefined : this.ctime, + }); + if (pathWarn) { + this.warn('TAR_ENTRY_INFO', `stripping ${pathWarn} from absolute path`, { + entry: this, + path: pathWarn + this.path, + }); + } + if (this.header.encode() && !this.noPax) { + super.write(new pax_js_1.Pax({ + atime: this.portable ? undefined : this.atime, + ctime: this.portable ? undefined : this.ctime, + gid: this.portable ? undefined : this.gid, + mtime: this.noMtime ? undefined : this.mtime, + path: this[PREFIX](this.path), + linkpath: this.type === 'Link' && this.linkpath !== undefined ? + this[PREFIX](this.linkpath) + : this.linkpath, + size: this.size, + uid: this.portable ? undefined : this.uid, + uname: this.portable ? undefined : this.uname, + dev: this.portable ? undefined : this.readEntry.dev, + ino: this.portable ? undefined : this.readEntry.ino, + nlink: this.portable ? undefined : this.readEntry.nlink, + }).encode()); + } + const b = this.header?.block; + /* c8 ignore start */ + if (!b) + throw new Error('failed to encode header'); + /* c8 ignore stop */ + super.write(b); + readEntry.pipe(this); + } + [PREFIX](path) { + return prefixPath(path, this.prefix); + } + [MODE](mode) { + return (0, mode_fix_js_1.modeFix)(mode, this.type === 'Directory', this.portable); + } + write(chunk, encoding, cb) { + /* c8 ignore start - just junk to comply with NodeJS.WritableStream */ + if (typeof encoding === 'function') { + cb = encoding; + encoding = undefined; + } + if (typeof chunk === 'string') { + chunk = Buffer.from(chunk, typeof encoding === 'string' ? encoding : 'utf8'); + } + /* c8 ignore stop */ + const writeLen = chunk.length; + if (writeLen > this.blockRemain) { + throw new Error('writing more to entry than is appropriate'); + } + this.blockRemain -= writeLen; + return super.write(chunk, cb); + } + end(chunk, encoding, cb) { + if (this.blockRemain) { + super.write(Buffer.alloc(this.blockRemain)); + } + /* c8 ignore start - just junk to comply with NodeJS.WritableStream */ + if (typeof chunk === 'function') { + cb = chunk; + encoding = undefined; + chunk = undefined; + } + if (typeof encoding === 'function') { + cb = encoding; + encoding = undefined; + } + if (typeof chunk === 'string') { + chunk = Buffer.from(chunk, encoding ?? 'utf8'); + } + if (cb) + this.once('finish', cb); + chunk ? super.end(chunk, cb) : super.end(cb); + /* c8 ignore stop */ + return this; + } +} +exports.WriteEntryTar = WriteEntryTar; +const getType = (stat) => stat.isFile() ? 'File' + : stat.isDirectory() ? 'Directory' + : stat.isSymbolicLink() ? 'SymbolicLink' + : 'Unsupported'; +//# sourceMappingURL=write-entry.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/create.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/create.js new file mode 100644 index 00000000000000..512a9911d70d5b --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/create.js @@ -0,0 +1,77 @@ +import { WriteStream, WriteStreamSync } from '@isaacs/fs-minipass'; +import path from 'node:path'; +import { list } from './list.js'; +import { makeCommand } from './make-command.js'; +import { Pack, PackSync } from './pack.js'; +const createFileSync = (opt, files) => { + const p = new PackSync(opt); + const stream = new WriteStreamSync(opt.file, { + mode: opt.mode || 0o666, + }); + p.pipe(stream); + addFilesSync(p, files); +}; +const createFile = (opt, files) => { + const p = new Pack(opt); + const stream = new WriteStream(opt.file, { + mode: opt.mode || 0o666, + }); + p.pipe(stream); + const promise = new Promise((res, rej) => { + stream.on('error', rej); + stream.on('close', res); + p.on('error', rej); + }); + addFilesAsync(p, files); + return promise; +}; +const addFilesSync = (p, files) => { + files.forEach(file => { + if (file.charAt(0) === '@') { + list({ + file: path.resolve(p.cwd, file.slice(1)), + sync: true, + noResume: true, + onReadEntry: entry => p.add(entry), + }); + } + else { + p.add(file); + } + }); + p.end(); +}; +const addFilesAsync = async (p, files) => { + for (let i = 0; i < files.length; i++) { + const file = String(files[i]); + if (file.charAt(0) === '@') { + await list({ + file: path.resolve(String(p.cwd), file.slice(1)), + noResume: true, + onReadEntry: entry => { + p.add(entry); + }, + }); + } + else { + p.add(file); + } + } + p.end(); +}; +const createSync = (opt, files) => { + const p = new PackSync(opt); + addFilesSync(p, files); + return p; +}; +const createAsync = (opt, files) => { + const p = new Pack(opt); + addFilesAsync(p, files); + return p; +}; +export const create = makeCommand(createFileSync, createFile, createSync, createAsync, (_opt, files) => { + if (!files?.length) { + throw new TypeError('no paths specified to add to archive'); + } +}); +//# sourceMappingURL=create.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/cwd-error.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/cwd-error.js new file mode 100644 index 00000000000000..289a066b8e0317 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/cwd-error.js @@ -0,0 +1,14 @@ +export class CwdError extends Error { + path; + code; + syscall = 'chdir'; + constructor(path, code) { + super(`${code}: Cannot cd into '${path}'`); + this.path = path; + this.code = code; + } + get name() { + return 'CwdError'; + } +} +//# sourceMappingURL=cwd-error.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/extract.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/extract.js new file mode 100644 index 00000000000000..2274feef26e78f --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/extract.js @@ -0,0 +1,49 @@ +// tar -x +import * as fsm from '@isaacs/fs-minipass'; +import fs from 'node:fs'; +import { filesFilter } from './list.js'; +import { makeCommand } from './make-command.js'; +import { Unpack, UnpackSync } from './unpack.js'; +const extractFileSync = (opt) => { + const u = new UnpackSync(opt); + const file = opt.file; + const stat = fs.statSync(file); + // This trades a zero-byte read() syscall for a stat + // However, it will usually result in less memory allocation + const readSize = opt.maxReadSize || 16 * 1024 * 1024; + const stream = new fsm.ReadStreamSync(file, { + readSize: readSize, + size: stat.size, + }); + stream.pipe(u); +}; +const extractFile = (opt, _) => { + const u = new Unpack(opt); + const readSize = opt.maxReadSize || 16 * 1024 * 1024; + const file = opt.file; + const p = new Promise((resolve, reject) => { + u.on('error', reject); + u.on('close', resolve); + // This trades a zero-byte read() syscall for a stat + // However, it will usually result in less memory allocation + fs.stat(file, (er, stat) => { + if (er) { + reject(er); + } + else { + const stream = new fsm.ReadStream(file, { + readSize: readSize, + size: stat.size, + }); + stream.on('error', reject); + stream.pipe(u); + } + }); + }); + return p; +}; +export const extract = makeCommand(extractFileSync, extractFile, opt => new UnpackSync(opt), opt => new Unpack(opt), (opt, files) => { + if (files?.length) + filesFilter(opt, files); +}); +//# sourceMappingURL=extract.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/get-write-flag.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/get-write-flag.js new file mode 100644 index 00000000000000..2c7f3e8b28fdaf --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/get-write-flag.js @@ -0,0 +1,23 @@ +// Get the appropriate flag to use for creating files +// We use fmap on Windows platforms for files less than +// 512kb. This is a fairly low limit, but avoids making +// things slower in some cases. Since most of what this +// library is used for is extracting tarballs of many +// relatively small files in npm packages and the like, +// it can be a big boost on Windows platforms. +import fs from 'fs'; +const platform = process.env.__FAKE_PLATFORM__ || process.platform; +const isWindows = platform === 'win32'; +/* c8 ignore start */ +const { O_CREAT, O_TRUNC, O_WRONLY } = fs.constants; +const UV_FS_O_FILEMAP = Number(process.env.__FAKE_FS_O_FILENAME__) || + fs.constants.UV_FS_O_FILEMAP || + 0; +/* c8 ignore stop */ +const fMapEnabled = isWindows && !!UV_FS_O_FILEMAP; +const fMapLimit = 512 * 1024; +const fMapFlag = UV_FS_O_FILEMAP | O_TRUNC | O_CREAT | O_WRONLY; +export const getWriteFlag = !fMapEnabled ? + () => 'w' + : (size) => (size < fMapLimit ? fMapFlag : 'w'); +//# sourceMappingURL=get-write-flag.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/header.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/header.js new file mode 100644 index 00000000000000..e15192b14b16e1 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/header.js @@ -0,0 +1,279 @@ +// parse a 512-byte header block to a data object, or vice-versa +// encode returns `true` if a pax extended header is needed, because +// the data could not be faithfully encoded in a simple header. +// (Also, check header.needPax to see if it needs a pax header.) +import { posix as pathModule } from 'node:path'; +import * as large from './large-numbers.js'; +import * as types from './types.js'; +export class Header { + cksumValid = false; + needPax = false; + nullBlock = false; + block; + path; + mode; + uid; + gid; + size; + cksum; + #type = 'Unsupported'; + linkpath; + uname; + gname; + devmaj = 0; + devmin = 0; + atime; + ctime; + mtime; + charset; + comment; + constructor(data, off = 0, ex, gex) { + if (Buffer.isBuffer(data)) { + this.decode(data, off || 0, ex, gex); + } + else if (data) { + this.#slurp(data); + } + } + decode(buf, off, ex, gex) { + if (!off) { + off = 0; + } + if (!buf || !(buf.length >= off + 512)) { + throw new Error('need 512 bytes for header'); + } + this.path = decString(buf, off, 100); + this.mode = decNumber(buf, off + 100, 8); + this.uid = decNumber(buf, off + 108, 8); + this.gid = decNumber(buf, off + 116, 8); + this.size = decNumber(buf, off + 124, 12); + this.mtime = decDate(buf, off + 136, 12); + this.cksum = decNumber(buf, off + 148, 12); + // if we have extended or global extended headers, apply them now + // See https://github.com/npm/node-tar/pull/187 + // Apply global before local, so it overrides + if (gex) + this.#slurp(gex, true); + if (ex) + this.#slurp(ex); + // old tar versions marked dirs as a file with a trailing / + const t = decString(buf, off + 156, 1); + if (types.isCode(t)) { + this.#type = t || '0'; + } + if (this.#type === '0' && this.path.slice(-1) === '/') { + this.#type = '5'; + } + // tar implementations sometimes incorrectly put the stat(dir).size + // as the size in the tarball, even though Directory entries are + // not able to have any body at all. In the very rare chance that + // it actually DOES have a body, we weren't going to do anything with + // it anyway, and it'll just be a warning about an invalid header. + if (this.#type === '5') { + this.size = 0; + } + this.linkpath = decString(buf, off + 157, 100); + if (buf.subarray(off + 257, off + 265).toString() === + 'ustar\u000000') { + this.uname = decString(buf, off + 265, 32); + this.gname = decString(buf, off + 297, 32); + /* c8 ignore start */ + this.devmaj = decNumber(buf, off + 329, 8) ?? 0; + this.devmin = decNumber(buf, off + 337, 8) ?? 0; + /* c8 ignore stop */ + if (buf[off + 475] !== 0) { + // definitely a prefix, definitely >130 chars. + const prefix = decString(buf, off + 345, 155); + this.path = prefix + '/' + this.path; + } + else { + const prefix = decString(buf, off + 345, 130); + if (prefix) { + this.path = prefix + '/' + this.path; + } + this.atime = decDate(buf, off + 476, 12); + this.ctime = decDate(buf, off + 488, 12); + } + } + let sum = 8 * 0x20; + for (let i = off; i < off + 148; i++) { + sum += buf[i]; + } + for (let i = off + 156; i < off + 512; i++) { + sum += buf[i]; + } + this.cksumValid = sum === this.cksum; + if (this.cksum === undefined && sum === 8 * 0x20) { + this.nullBlock = true; + } + } + #slurp(ex, gex = false) { + Object.assign(this, Object.fromEntries(Object.entries(ex).filter(([k, v]) => { + // we slurp in everything except for the path attribute in + // a global extended header, because that's weird. Also, any + // null/undefined values are ignored. + return !(v === null || + v === undefined || + (k === 'path' && gex) || + (k === 'linkpath' && gex) || + k === 'global'); + }))); + } + encode(buf, off = 0) { + if (!buf) { + buf = this.block = Buffer.alloc(512); + } + if (this.#type === 'Unsupported') { + this.#type = '0'; + } + if (!(buf.length >= off + 512)) { + throw new Error('need 512 bytes for header'); + } + const prefixSize = this.ctime || this.atime ? 130 : 155; + const split = splitPrefix(this.path || '', prefixSize); + const path = split[0]; + const prefix = split[1]; + this.needPax = !!split[2]; + this.needPax = encString(buf, off, 100, path) || this.needPax; + this.needPax = + encNumber(buf, off + 100, 8, this.mode) || this.needPax; + this.needPax = + encNumber(buf, off + 108, 8, this.uid) || this.needPax; + this.needPax = + encNumber(buf, off + 116, 8, this.gid) || this.needPax; + this.needPax = + encNumber(buf, off + 124, 12, this.size) || this.needPax; + this.needPax = + encDate(buf, off + 136, 12, this.mtime) || this.needPax; + buf[off + 156] = this.#type.charCodeAt(0); + this.needPax = + encString(buf, off + 157, 100, this.linkpath) || this.needPax; + buf.write('ustar\u000000', off + 257, 8); + this.needPax = + encString(buf, off + 265, 32, this.uname) || this.needPax; + this.needPax = + encString(buf, off + 297, 32, this.gname) || this.needPax; + this.needPax = + encNumber(buf, off + 329, 8, this.devmaj) || this.needPax; + this.needPax = + encNumber(buf, off + 337, 8, this.devmin) || this.needPax; + this.needPax = + encString(buf, off + 345, prefixSize, prefix) || this.needPax; + if (buf[off + 475] !== 0) { + this.needPax = + encString(buf, off + 345, 155, prefix) || this.needPax; + } + else { + this.needPax = + encString(buf, off + 345, 130, prefix) || this.needPax; + this.needPax = + encDate(buf, off + 476, 12, this.atime) || this.needPax; + this.needPax = + encDate(buf, off + 488, 12, this.ctime) || this.needPax; + } + let sum = 8 * 0x20; + for (let i = off; i < off + 148; i++) { + sum += buf[i]; + } + for (let i = off + 156; i < off + 512; i++) { + sum += buf[i]; + } + this.cksum = sum; + encNumber(buf, off + 148, 8, this.cksum); + this.cksumValid = true; + return this.needPax; + } + get type() { + return (this.#type === 'Unsupported' ? + this.#type + : types.name.get(this.#type)); + } + get typeKey() { + return this.#type; + } + set type(type) { + const c = String(types.code.get(type)); + if (types.isCode(c) || c === 'Unsupported') { + this.#type = c; + } + else if (types.isCode(type)) { + this.#type = type; + } + else { + throw new TypeError('invalid entry type: ' + type); + } + } +} +const splitPrefix = (p, prefixSize) => { + const pathSize = 100; + let pp = p; + let prefix = ''; + let ret = undefined; + const root = pathModule.parse(p).root || '.'; + if (Buffer.byteLength(pp) < pathSize) { + ret = [pp, prefix, false]; + } + else { + // first set prefix to the dir, and path to the base + prefix = pathModule.dirname(pp); + pp = pathModule.basename(pp); + do { + if (Buffer.byteLength(pp) <= pathSize && + Buffer.byteLength(prefix) <= prefixSize) { + // both fit! + ret = [pp, prefix, false]; + } + else if (Buffer.byteLength(pp) > pathSize && + Buffer.byteLength(prefix) <= prefixSize) { + // prefix fits in prefix, but path doesn't fit in path + ret = [pp.slice(0, pathSize - 1), prefix, true]; + } + else { + // make path take a bit from prefix + pp = pathModule.join(pathModule.basename(prefix), pp); + prefix = pathModule.dirname(prefix); + } + } while (prefix !== root && ret === undefined); + // at this point, found no resolution, just truncate + if (!ret) { + ret = [p.slice(0, pathSize - 1), '', true]; + } + } + return ret; +}; +const decString = (buf, off, size) => buf + .subarray(off, off + size) + .toString('utf8') + .replace(/\0.*/, ''); +const decDate = (buf, off, size) => numToDate(decNumber(buf, off, size)); +const numToDate = (num) => num === undefined ? undefined : new Date(num * 1000); +const decNumber = (buf, off, size) => Number(buf[off]) & 0x80 ? + large.parse(buf.subarray(off, off + size)) + : decSmallNumber(buf, off, size); +const nanUndef = (value) => (isNaN(value) ? undefined : value); +const decSmallNumber = (buf, off, size) => nanUndef(parseInt(buf + .subarray(off, off + size) + .toString('utf8') + .replace(/\0.*$/, '') + .trim(), 8)); +// the maximum encodable as a null-terminated octal, by field size +const MAXNUM = { + 12: 0o77777777777, + 8: 0o7777777, +}; +const encNumber = (buf, off, size, num) => num === undefined ? false + : num > MAXNUM[size] || num < 0 ? + (large.encode(num, buf.subarray(off, off + size)), true) + : (encSmallNumber(buf, off, size, num), false); +const encSmallNumber = (buf, off, size, num) => buf.write(octalString(num, size), off, size, 'ascii'); +const octalString = (num, size) => padOctal(Math.floor(num).toString(8), size); +const padOctal = (str, size) => (str.length === size - 1 ? + str + : new Array(size - str.length - 1).join('0') + str + ' ') + '\0'; +const encDate = (buf, off, size, date) => date === undefined ? false : (encNumber(buf, off, size, date.getTime() / 1000)); +// enough to fill the longest string we've got +const NULLS = new Array(156).join('\0'); +// pad with nulls, return true if it's longer or non-ascii +const encString = (buf, off, size, str) => str === undefined ? false : ((buf.write(str + NULLS, off, size, 'utf8'), + str.length !== Buffer.byteLength(str) || str.length > size)); +//# sourceMappingURL=header.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/index.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/index.js new file mode 100644 index 00000000000000..1bac6415c8d732 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/index.js @@ -0,0 +1,20 @@ +export * from './create.js'; +export { create as c } from './create.js'; +export * from './extract.js'; +export { extract as x } from './extract.js'; +export * from './header.js'; +export * from './list.js'; +export { list as t } from './list.js'; +// classes +export * from './pack.js'; +export * from './parse.js'; +export * from './pax.js'; +export * from './read-entry.js'; +export * from './replace.js'; +export { replace as r } from './replace.js'; +export * as types from './types.js'; +export * from './unpack.js'; +export * from './update.js'; +export { update as u } from './update.js'; +export * from './write-entry.js'; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/large-numbers.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/large-numbers.js new file mode 100644 index 00000000000000..4f2f7e5f14fc1b --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/large-numbers.js @@ -0,0 +1,94 @@ +// Tar can encode large and negative numbers using a leading byte of +// 0xff for negative, and 0x80 for positive. +export const encode = (num, buf) => { + if (!Number.isSafeInteger(num)) { + // The number is so large that javascript cannot represent it with integer + // precision. + throw Error('cannot encode number outside of javascript safe integer range'); + } + else if (num < 0) { + encodeNegative(num, buf); + } + else { + encodePositive(num, buf); + } + return buf; +}; +const encodePositive = (num, buf) => { + buf[0] = 0x80; + for (var i = buf.length; i > 1; i--) { + buf[i - 1] = num & 0xff; + num = Math.floor(num / 0x100); + } +}; +const encodeNegative = (num, buf) => { + buf[0] = 0xff; + var flipped = false; + num = num * -1; + for (var i = buf.length; i > 1; i--) { + var byte = num & 0xff; + num = Math.floor(num / 0x100); + if (flipped) { + buf[i - 1] = onesComp(byte); + } + else if (byte === 0) { + buf[i - 1] = 0; + } + else { + flipped = true; + buf[i - 1] = twosComp(byte); + } + } +}; +export const parse = (buf) => { + const pre = buf[0]; + const value = pre === 0x80 ? pos(buf.subarray(1, buf.length)) + : pre === 0xff ? twos(buf) + : null; + if (value === null) { + throw Error('invalid base256 encoding'); + } + if (!Number.isSafeInteger(value)) { + // The number is so large that javascript cannot represent it with integer + // precision. + throw Error('parsed number outside of javascript safe integer range'); + } + return value; +}; +const twos = (buf) => { + var len = buf.length; + var sum = 0; + var flipped = false; + for (var i = len - 1; i > -1; i--) { + var byte = Number(buf[i]); + var f; + if (flipped) { + f = onesComp(byte); + } + else if (byte === 0) { + f = byte; + } + else { + flipped = true; + f = twosComp(byte); + } + if (f !== 0) { + sum -= f * Math.pow(256, len - i - 1); + } + } + return sum; +}; +const pos = (buf) => { + var len = buf.length; + var sum = 0; + for (var i = len - 1; i > -1; i--) { + var byte = Number(buf[i]); + if (byte !== 0) { + sum += byte * Math.pow(256, len - i - 1); + } + } + return sum; +}; +const onesComp = (byte) => (0xff ^ byte) & 0xff; +const twosComp = (byte) => ((0xff ^ byte) + 1) & 0xff; +//# sourceMappingURL=large-numbers.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/list.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/list.js new file mode 100644 index 00000000000000..f49068400b6c92 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/list.js @@ -0,0 +1,106 @@ +// tar -t +import * as fsm from '@isaacs/fs-minipass'; +import fs from 'node:fs'; +import { dirname, parse } from 'path'; +import { makeCommand } from './make-command.js'; +import { Parser } from './parse.js'; +import { stripTrailingSlashes } from './strip-trailing-slashes.js'; +const onReadEntryFunction = (opt) => { + const onReadEntry = opt.onReadEntry; + opt.onReadEntry = + onReadEntry ? + e => { + onReadEntry(e); + e.resume(); + } + : e => e.resume(); +}; +// construct a filter that limits the file entries listed +// include child entries if a dir is included +export const filesFilter = (opt, files) => { + const map = new Map(files.map(f => [stripTrailingSlashes(f), true])); + const filter = opt.filter; + const mapHas = (file, r = '') => { + const root = r || parse(file).root || '.'; + let ret; + if (file === root) + ret = false; + else { + const m = map.get(file); + if (m !== undefined) { + ret = m; + } + else { + ret = mapHas(dirname(file), root); + } + } + map.set(file, ret); + return ret; + }; + opt.filter = + filter ? + (file, entry) => filter(file, entry) && mapHas(stripTrailingSlashes(file)) + : file => mapHas(stripTrailingSlashes(file)); +}; +const listFileSync = (opt) => { + const p = new Parser(opt); + const file = opt.file; + let fd; + try { + const stat = fs.statSync(file); + const readSize = opt.maxReadSize || 16 * 1024 * 1024; + if (stat.size < readSize) { + p.end(fs.readFileSync(file)); + } + else { + let pos = 0; + const buf = Buffer.allocUnsafe(readSize); + fd = fs.openSync(file, 'r'); + while (pos < stat.size) { + const bytesRead = fs.readSync(fd, buf, 0, readSize, pos); + pos += bytesRead; + p.write(buf.subarray(0, bytesRead)); + } + p.end(); + } + } + finally { + if (typeof fd === 'number') { + try { + fs.closeSync(fd); + /* c8 ignore next */ + } + catch (er) { } + } + } +}; +const listFile = (opt, _files) => { + const parse = new Parser(opt); + const readSize = opt.maxReadSize || 16 * 1024 * 1024; + const file = opt.file; + const p = new Promise((resolve, reject) => { + parse.on('error', reject); + parse.on('end', resolve); + fs.stat(file, (er, stat) => { + if (er) { + reject(er); + } + else { + const stream = new fsm.ReadStream(file, { + readSize: readSize, + size: stat.size, + }); + stream.on('error', reject); + stream.pipe(parse); + } + }); + }); + return p; +}; +export const list = makeCommand(listFileSync, listFile, opt => new Parser(opt), opt => new Parser(opt), (opt, files) => { + if (files?.length) + filesFilter(opt, files); + if (!opt.noResume) + onReadEntryFunction(opt); +}); +//# sourceMappingURL=list.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/make-command.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/make-command.js new file mode 100644 index 00000000000000..f2f737bca78fd7 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/make-command.js @@ -0,0 +1,57 @@ +import { dealias, isAsyncFile, isAsyncNoFile, isSyncFile, isSyncNoFile, } from './options.js'; +export const makeCommand = (syncFile, asyncFile, syncNoFile, asyncNoFile, validate) => { + return Object.assign((opt_ = [], entries, cb) => { + if (Array.isArray(opt_)) { + entries = opt_; + opt_ = {}; + } + if (typeof entries === 'function') { + cb = entries; + entries = undefined; + } + if (!entries) { + entries = []; + } + else { + entries = Array.from(entries); + } + const opt = dealias(opt_); + validate?.(opt, entries); + if (isSyncFile(opt)) { + if (typeof cb === 'function') { + throw new TypeError('callback not supported for sync tar functions'); + } + return syncFile(opt, entries); + } + else if (isAsyncFile(opt)) { + const p = asyncFile(opt, entries); + // weirdness to make TS happy + const c = cb ? cb : undefined; + return c ? p.then(() => c(), c) : p; + } + else if (isSyncNoFile(opt)) { + if (typeof cb === 'function') { + throw new TypeError('callback not supported for sync tar functions'); + } + return syncNoFile(opt, entries); + } + else if (isAsyncNoFile(opt)) { + if (typeof cb === 'function') { + throw new TypeError('callback only supported with file option'); + } + return asyncNoFile(opt, entries); + /* c8 ignore start */ + } + else { + throw new Error('impossible options??'); + } + /* c8 ignore stop */ + }, { + syncFile, + asyncFile, + syncNoFile, + asyncNoFile, + validate, + }); +}; +//# sourceMappingURL=make-command.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/mkdir.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/mkdir.js new file mode 100644 index 00000000000000..13498ef0082f0b --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/mkdir.js @@ -0,0 +1,201 @@ +import { chownr, chownrSync } from 'chownr'; +import fs from 'fs'; +import { mkdirp, mkdirpSync } from 'mkdirp'; +import path from 'node:path'; +import { CwdError } from './cwd-error.js'; +import { normalizeWindowsPath } from './normalize-windows-path.js'; +import { SymlinkError } from './symlink-error.js'; +const cGet = (cache, key) => cache.get(normalizeWindowsPath(key)); +const cSet = (cache, key, val) => cache.set(normalizeWindowsPath(key), val); +const checkCwd = (dir, cb) => { + fs.stat(dir, (er, st) => { + if (er || !st.isDirectory()) { + er = new CwdError(dir, er?.code || 'ENOTDIR'); + } + cb(er); + }); +}; +/** + * Wrapper around mkdirp for tar's needs. + * + * The main purpose is to avoid creating directories if we know that + * they already exist (and track which ones exist for this purpose), + * and prevent entries from being extracted into symlinked folders, + * if `preservePaths` is not set. + */ +export const mkdir = (dir, opt, cb) => { + dir = normalizeWindowsPath(dir); + // if there's any overlap between mask and mode, + // then we'll need an explicit chmod + /* c8 ignore next */ + const umask = opt.umask ?? 0o22; + const mode = opt.mode | 0o0700; + const needChmod = (mode & umask) !== 0; + const uid = opt.uid; + const gid = opt.gid; + const doChown = typeof uid === 'number' && + typeof gid === 'number' && + (uid !== opt.processUid || gid !== opt.processGid); + const preserve = opt.preserve; + const unlink = opt.unlink; + const cache = opt.cache; + const cwd = normalizeWindowsPath(opt.cwd); + const done = (er, created) => { + if (er) { + cb(er); + } + else { + cSet(cache, dir, true); + if (created && doChown) { + chownr(created, uid, gid, er => done(er)); + } + else if (needChmod) { + fs.chmod(dir, mode, cb); + } + else { + cb(); + } + } + }; + if (cache && cGet(cache, dir) === true) { + return done(); + } + if (dir === cwd) { + return checkCwd(dir, done); + } + if (preserve) { + return mkdirp(dir, { mode }).then(made => done(null, made ?? undefined), // oh, ts + done); + } + const sub = normalizeWindowsPath(path.relative(cwd, dir)); + const parts = sub.split('/'); + mkdir_(cwd, parts, mode, cache, unlink, cwd, undefined, done); +}; +const mkdir_ = (base, parts, mode, cache, unlink, cwd, created, cb) => { + if (!parts.length) { + return cb(null, created); + } + const p = parts.shift(); + const part = normalizeWindowsPath(path.resolve(base + '/' + p)); + if (cGet(cache, part)) { + return mkdir_(part, parts, mode, cache, unlink, cwd, created, cb); + } + fs.mkdir(part, mode, onmkdir(part, parts, mode, cache, unlink, cwd, created, cb)); +}; +const onmkdir = (part, parts, mode, cache, unlink, cwd, created, cb) => (er) => { + if (er) { + fs.lstat(part, (statEr, st) => { + if (statEr) { + statEr.path = + statEr.path && normalizeWindowsPath(statEr.path); + cb(statEr); + } + else if (st.isDirectory()) { + mkdir_(part, parts, mode, cache, unlink, cwd, created, cb); + } + else if (unlink) { + fs.unlink(part, er => { + if (er) { + return cb(er); + } + fs.mkdir(part, mode, onmkdir(part, parts, mode, cache, unlink, cwd, created, cb)); + }); + } + else if (st.isSymbolicLink()) { + return cb(new SymlinkError(part, part + '/' + parts.join('/'))); + } + else { + cb(er); + } + }); + } + else { + created = created || part; + mkdir_(part, parts, mode, cache, unlink, cwd, created, cb); + } +}; +const checkCwdSync = (dir) => { + let ok = false; + let code = undefined; + try { + ok = fs.statSync(dir).isDirectory(); + } + catch (er) { + code = er?.code; + } + finally { + if (!ok) { + throw new CwdError(dir, code ?? 'ENOTDIR'); + } + } +}; +export const mkdirSync = (dir, opt) => { + dir = normalizeWindowsPath(dir); + // if there's any overlap between mask and mode, + // then we'll need an explicit chmod + /* c8 ignore next */ + const umask = opt.umask ?? 0o22; + const mode = opt.mode | 0o700; + const needChmod = (mode & umask) !== 0; + const uid = opt.uid; + const gid = opt.gid; + const doChown = typeof uid === 'number' && + typeof gid === 'number' && + (uid !== opt.processUid || gid !== opt.processGid); + const preserve = opt.preserve; + const unlink = opt.unlink; + const cache = opt.cache; + const cwd = normalizeWindowsPath(opt.cwd); + const done = (created) => { + cSet(cache, dir, true); + if (created && doChown) { + chownrSync(created, uid, gid); + } + if (needChmod) { + fs.chmodSync(dir, mode); + } + }; + if (cache && cGet(cache, dir) === true) { + return done(); + } + if (dir === cwd) { + checkCwdSync(cwd); + return done(); + } + if (preserve) { + return done(mkdirpSync(dir, mode) ?? undefined); + } + const sub = normalizeWindowsPath(path.relative(cwd, dir)); + const parts = sub.split('/'); + let created = undefined; + for (let p = parts.shift(), part = cwd; p && (part += '/' + p); p = parts.shift()) { + part = normalizeWindowsPath(path.resolve(part)); + if (cGet(cache, part)) { + continue; + } + try { + fs.mkdirSync(part, mode); + created = created || part; + cSet(cache, part, true); + } + catch (er) { + const st = fs.lstatSync(part); + if (st.isDirectory()) { + cSet(cache, part, true); + continue; + } + else if (unlink) { + fs.unlinkSync(part); + fs.mkdirSync(part, mode); + created = created || part; + cSet(cache, part, true); + continue; + } + else if (st.isSymbolicLink()) { + return new SymlinkError(part, part + '/' + parts.join('/')); + } + } + } + return done(created); +}; +//# sourceMappingURL=mkdir.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/mode-fix.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/mode-fix.js new file mode 100644 index 00000000000000..5fd3bb88c1cb25 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/mode-fix.js @@ -0,0 +1,25 @@ +export const modeFix = (mode, isDir, portable) => { + mode &= 0o7777; + // in portable mode, use the minimum reasonable umask + // if this system creates files with 0o664 by default + // (as some linux distros do), then we'll write the + // archive with 0o644 instead. Also, don't ever create + // a file that is not readable/writable by the owner. + if (portable) { + mode = (mode | 0o600) & ~0o22; + } + // if dirs are readable, then they should be listable + if (isDir) { + if (mode & 0o400) { + mode |= 0o100; + } + if (mode & 0o40) { + mode |= 0o10; + } + if (mode & 0o4) { + mode |= 0o1; + } + } + return mode; +}; +//# sourceMappingURL=mode-fix.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/normalize-unicode.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/normalize-unicode.js new file mode 100644 index 00000000000000..94e5095476d6e0 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/normalize-unicode.js @@ -0,0 +1,13 @@ +// warning: extremely hot code path. +// This has been meticulously optimized for use +// within npm install on large package trees. +// Do not edit without careful benchmarking. +const normalizeCache = Object.create(null); +const { hasOwnProperty } = Object.prototype; +export const normalizeUnicode = (s) => { + if (!hasOwnProperty.call(normalizeCache, s)) { + normalizeCache[s] = s.normalize('NFD'); + } + return normalizeCache[s]; +}; +//# sourceMappingURL=normalize-unicode.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/normalize-windows-path.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/normalize-windows-path.js new file mode 100644 index 00000000000000..2d97d2b884e627 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/normalize-windows-path.js @@ -0,0 +1,9 @@ +// on windows, either \ or / are valid directory separators. +// on unix, \ is a valid character in filenames. +// so, on windows, and only on windows, we replace all \ chars with /, +// so that we can use / as our one and only directory separator char. +const platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform; +export const normalizeWindowsPath = platform !== 'win32' ? + (p) => p + : (p) => p && p.replace(/\\/g, '/'); +//# sourceMappingURL=normalize-windows-path.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/options.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/options.js new file mode 100644 index 00000000000000..a006d36c23c923 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/options.js @@ -0,0 +1,54 @@ +// turn tar(1) style args like `C` into the more verbose things like `cwd` +const argmap = new Map([ + ['C', 'cwd'], + ['f', 'file'], + ['z', 'gzip'], + ['P', 'preservePaths'], + ['U', 'unlink'], + ['strip-components', 'strip'], + ['stripComponents', 'strip'], + ['keep-newer', 'newer'], + ['keepNewer', 'newer'], + ['keep-newer-files', 'newer'], + ['keepNewerFiles', 'newer'], + ['k', 'keep'], + ['keep-existing', 'keep'], + ['keepExisting', 'keep'], + ['m', 'noMtime'], + ['no-mtime', 'noMtime'], + ['p', 'preserveOwner'], + ['L', 'follow'], + ['h', 'follow'], + ['onentry', 'onReadEntry'], +]); +export const isSyncFile = (o) => !!o.sync && !!o.file; +export const isAsyncFile = (o) => !o.sync && !!o.file; +export const isSyncNoFile = (o) => !!o.sync && !o.file; +export const isAsyncNoFile = (o) => !o.sync && !o.file; +export const isSync = (o) => !!o.sync; +export const isAsync = (o) => !o.sync; +export const isFile = (o) => !!o.file; +export const isNoFile = (o) => !o.file; +const dealiasKey = (k) => { + const d = argmap.get(k); + if (d) + return d; + return k; +}; +export const dealias = (opt = {}) => { + if (!opt) + return {}; + const result = {}; + for (const [key, v] of Object.entries(opt)) { + // TS doesn't know that aliases are going to always be the same type + const k = dealiasKey(key); + result[k] = v; + } + // affordance for deprecated noChmod -> chmod + if (result.chmod === undefined && result.noChmod === false) { + result.chmod = true; + } + delete result.noChmod; + return result; +}; +//# sourceMappingURL=options.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/pack.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/pack.js new file mode 100644 index 00000000000000..f59f32f94201fa --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/pack.js @@ -0,0 +1,445 @@ +// A readable tar stream creator +// Technically, this is a transform stream that you write paths into, +// and tar format comes out of. +// The `add()` method is like `write()` but returns this, +// and end() return `this` as well, so you can +// do `new Pack(opt).add('files').add('dir').end().pipe(output) +// You could also do something like: +// streamOfPaths().pipe(new Pack()).pipe(new fs.WriteStream('out.tar')) +import fs from 'fs'; +import { WriteEntry, WriteEntrySync, WriteEntryTar, } from './write-entry.js'; +export class PackJob { + path; + absolute; + entry; + stat; + readdir; + pending = false; + ignore = false; + piped = false; + constructor(path, absolute) { + this.path = path || './'; + this.absolute = absolute; + } +} +import { Minipass } from 'minipass'; +import * as zlib from 'minizlib'; +import { Yallist } from 'yallist'; +import { ReadEntry } from './read-entry.js'; +import { warnMethod, } from './warn-method.js'; +const EOF = Buffer.alloc(1024); +const ONSTAT = Symbol('onStat'); +const ENDED = Symbol('ended'); +const QUEUE = Symbol('queue'); +const CURRENT = Symbol('current'); +const PROCESS = Symbol('process'); +const PROCESSING = Symbol('processing'); +const PROCESSJOB = Symbol('processJob'); +const JOBS = Symbol('jobs'); +const JOBDONE = Symbol('jobDone'); +const ADDFSENTRY = Symbol('addFSEntry'); +const ADDTARENTRY = Symbol('addTarEntry'); +const STAT = Symbol('stat'); +const READDIR = Symbol('readdir'); +const ONREADDIR = Symbol('onreaddir'); +const PIPE = Symbol('pipe'); +const ENTRY = Symbol('entry'); +const ENTRYOPT = Symbol('entryOpt'); +const WRITEENTRYCLASS = Symbol('writeEntryClass'); +const WRITE = Symbol('write'); +const ONDRAIN = Symbol('ondrain'); +import path from 'path'; +import { normalizeWindowsPath } from './normalize-windows-path.js'; +export class Pack extends Minipass { + opt; + cwd; + maxReadSize; + preservePaths; + strict; + noPax; + prefix; + linkCache; + statCache; + file; + portable; + zip; + readdirCache; + noDirRecurse; + follow; + noMtime; + mtime; + filter; + jobs; + [WRITEENTRYCLASS]; + onWriteEntry; + [QUEUE]; + [JOBS] = 0; + [PROCESSING] = false; + [ENDED] = false; + constructor(opt = {}) { + //@ts-ignore + super(); + this.opt = opt; + this.file = opt.file || ''; + this.cwd = opt.cwd || process.cwd(); + this.maxReadSize = opt.maxReadSize; + this.preservePaths = !!opt.preservePaths; + this.strict = !!opt.strict; + this.noPax = !!opt.noPax; + this.prefix = normalizeWindowsPath(opt.prefix || ''); + this.linkCache = opt.linkCache || new Map(); + this.statCache = opt.statCache || new Map(); + this.readdirCache = opt.readdirCache || new Map(); + this.onWriteEntry = opt.onWriteEntry; + this[WRITEENTRYCLASS] = WriteEntry; + if (typeof opt.onwarn === 'function') { + this.on('warn', opt.onwarn); + } + this.portable = !!opt.portable; + if (opt.gzip || opt.brotli) { + if (opt.gzip && opt.brotli) { + throw new TypeError('gzip and brotli are mutually exclusive'); + } + if (opt.gzip) { + if (typeof opt.gzip !== 'object') { + opt.gzip = {}; + } + if (this.portable) { + opt.gzip.portable = true; + } + this.zip = new zlib.Gzip(opt.gzip); + } + if (opt.brotli) { + if (typeof opt.brotli !== 'object') { + opt.brotli = {}; + } + this.zip = new zlib.BrotliCompress(opt.brotli); + } + /* c8 ignore next */ + if (!this.zip) + throw new Error('impossible'); + const zip = this.zip; + zip.on('data', chunk => super.write(chunk)); + zip.on('end', () => super.end()); + zip.on('drain', () => this[ONDRAIN]()); + this.on('resume', () => zip.resume()); + } + else { + this.on('drain', this[ONDRAIN]); + } + this.noDirRecurse = !!opt.noDirRecurse; + this.follow = !!opt.follow; + this.noMtime = !!opt.noMtime; + if (opt.mtime) + this.mtime = opt.mtime; + this.filter = + typeof opt.filter === 'function' ? opt.filter : () => true; + this[QUEUE] = new Yallist(); + this[JOBS] = 0; + this.jobs = Number(opt.jobs) || 4; + this[PROCESSING] = false; + this[ENDED] = false; + } + [WRITE](chunk) { + return super.write(chunk); + } + add(path) { + this.write(path); + return this; + } + end(path, encoding, cb) { + /* c8 ignore start */ + if (typeof path === 'function') { + cb = path; + path = undefined; + } + if (typeof encoding === 'function') { + cb = encoding; + encoding = undefined; + } + /* c8 ignore stop */ + if (path) { + this.add(path); + } + this[ENDED] = true; + this[PROCESS](); + /* c8 ignore next */ + if (cb) + cb(); + return this; + } + write(path) { + if (this[ENDED]) { + throw new Error('write after end'); + } + if (path instanceof ReadEntry) { + this[ADDTARENTRY](path); + } + else { + this[ADDFSENTRY](path); + } + return this.flowing; + } + [ADDTARENTRY](p) { + const absolute = normalizeWindowsPath(path.resolve(this.cwd, p.path)); + // in this case, we don't have to wait for the stat + if (!this.filter(p.path, p)) { + p.resume(); + } + else { + const job = new PackJob(p.path, absolute); + job.entry = new WriteEntryTar(p, this[ENTRYOPT](job)); + job.entry.on('end', () => this[JOBDONE](job)); + this[JOBS] += 1; + this[QUEUE].push(job); + } + this[PROCESS](); + } + [ADDFSENTRY](p) { + const absolute = normalizeWindowsPath(path.resolve(this.cwd, p)); + this[QUEUE].push(new PackJob(p, absolute)); + this[PROCESS](); + } + [STAT](job) { + job.pending = true; + this[JOBS] += 1; + const stat = this.follow ? 'stat' : 'lstat'; + fs[stat](job.absolute, (er, stat) => { + job.pending = false; + this[JOBS] -= 1; + if (er) { + this.emit('error', er); + } + else { + this[ONSTAT](job, stat); + } + }); + } + [ONSTAT](job, stat) { + this.statCache.set(job.absolute, stat); + job.stat = stat; + // now we have the stat, we can filter it. + if (!this.filter(job.path, stat)) { + job.ignore = true; + } + this[PROCESS](); + } + [READDIR](job) { + job.pending = true; + this[JOBS] += 1; + fs.readdir(job.absolute, (er, entries) => { + job.pending = false; + this[JOBS] -= 1; + if (er) { + return this.emit('error', er); + } + this[ONREADDIR](job, entries); + }); + } + [ONREADDIR](job, entries) { + this.readdirCache.set(job.absolute, entries); + job.readdir = entries; + this[PROCESS](); + } + [PROCESS]() { + if (this[PROCESSING]) { + return; + } + this[PROCESSING] = true; + for (let w = this[QUEUE].head; !!w && this[JOBS] < this.jobs; w = w.next) { + this[PROCESSJOB](w.value); + if (w.value.ignore) { + const p = w.next; + this[QUEUE].removeNode(w); + w.next = p; + } + } + this[PROCESSING] = false; + if (this[ENDED] && !this[QUEUE].length && this[JOBS] === 0) { + if (this.zip) { + this.zip.end(EOF); + } + else { + super.write(EOF); + super.end(); + } + } + } + get [CURRENT]() { + return this[QUEUE] && this[QUEUE].head && this[QUEUE].head.value; + } + [JOBDONE](_job) { + this[QUEUE].shift(); + this[JOBS] -= 1; + this[PROCESS](); + } + [PROCESSJOB](job) { + if (job.pending) { + return; + } + if (job.entry) { + if (job === this[CURRENT] && !job.piped) { + this[PIPE](job); + } + return; + } + if (!job.stat) { + const sc = this.statCache.get(job.absolute); + if (sc) { + this[ONSTAT](job, sc); + } + else { + this[STAT](job); + } + } + if (!job.stat) { + return; + } + // filtered out! + if (job.ignore) { + return; + } + if (!this.noDirRecurse && + job.stat.isDirectory() && + !job.readdir) { + const rc = this.readdirCache.get(job.absolute); + if (rc) { + this[ONREADDIR](job, rc); + } + else { + this[READDIR](job); + } + if (!job.readdir) { + return; + } + } + // we know it doesn't have an entry, because that got checked above + job.entry = this[ENTRY](job); + if (!job.entry) { + job.ignore = true; + return; + } + if (job === this[CURRENT] && !job.piped) { + this[PIPE](job); + } + } + [ENTRYOPT](job) { + return { + onwarn: (code, msg, data) => this.warn(code, msg, data), + noPax: this.noPax, + cwd: this.cwd, + absolute: job.absolute, + preservePaths: this.preservePaths, + maxReadSize: this.maxReadSize, + strict: this.strict, + portable: this.portable, + linkCache: this.linkCache, + statCache: this.statCache, + noMtime: this.noMtime, + mtime: this.mtime, + prefix: this.prefix, + onWriteEntry: this.onWriteEntry, + }; + } + [ENTRY](job) { + this[JOBS] += 1; + try { + const e = new this[WRITEENTRYCLASS](job.path, this[ENTRYOPT](job)); + return e + .on('end', () => this[JOBDONE](job)) + .on('error', er => this.emit('error', er)); + } + catch (er) { + this.emit('error', er); + } + } + [ONDRAIN]() { + if (this[CURRENT] && this[CURRENT].entry) { + this[CURRENT].entry.resume(); + } + } + // like .pipe() but using super, because our write() is special + [PIPE](job) { + job.piped = true; + if (job.readdir) { + job.readdir.forEach(entry => { + const p = job.path; + const base = p === './' ? '' : p.replace(/\/*$/, '/'); + this[ADDFSENTRY](base + entry); + }); + } + const source = job.entry; + const zip = this.zip; + /* c8 ignore start */ + if (!source) + throw new Error('cannot pipe without source'); + /* c8 ignore stop */ + if (zip) { + source.on('data', chunk => { + if (!zip.write(chunk)) { + source.pause(); + } + }); + } + else { + source.on('data', chunk => { + if (!super.write(chunk)) { + source.pause(); + } + }); + } + } + pause() { + if (this.zip) { + this.zip.pause(); + } + return super.pause(); + } + warn(code, message, data = {}) { + warnMethod(this, code, message, data); + } +} +export class PackSync extends Pack { + sync = true; + constructor(opt) { + super(opt); + this[WRITEENTRYCLASS] = WriteEntrySync; + } + // pause/resume are no-ops in sync streams. + pause() { } + resume() { } + [STAT](job) { + const stat = this.follow ? 'statSync' : 'lstatSync'; + this[ONSTAT](job, fs[stat](job.absolute)); + } + [READDIR](job) { + this[ONREADDIR](job, fs.readdirSync(job.absolute)); + } + // gotta get it all in this tick + [PIPE](job) { + const source = job.entry; + const zip = this.zip; + if (job.readdir) { + job.readdir.forEach(entry => { + const p = job.path; + const base = p === './' ? '' : p.replace(/\/*$/, '/'); + this[ADDFSENTRY](base + entry); + }); + } + /* c8 ignore start */ + if (!source) + throw new Error('Cannot pipe without source'); + /* c8 ignore stop */ + if (zip) { + source.on('data', chunk => { + zip.write(chunk); + }); + } + else { + source.on('data', chunk => { + super[WRITE](chunk); + }); + } + } +} +//# sourceMappingURL=pack.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/package.json b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/package.json new file mode 100644 index 00000000000000..3dbc1ca591c055 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/parse.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/parse.js new file mode 100644 index 00000000000000..f2c802e6eef04d --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/parse.js @@ -0,0 +1,595 @@ +// this[BUFFER] is the remainder of a chunk if we're waiting for +// the full 512 bytes of a header to come in. We will Buffer.concat() +// it to the next write(), which is a mem copy, but a small one. +// +// this[QUEUE] is a Yallist of entries that haven't been emitted +// yet this can only get filled up if the user keeps write()ing after +// a write() returns false, or does a write() with more than one entry +// +// We don't buffer chunks, we always parse them and either create an +// entry, or push it into the active entry. The ReadEntry class knows +// to throw data away if .ignore=true +// +// Shift entry off the buffer when it emits 'end', and emit 'entry' for +// the next one in the list. +// +// At any time, we're pushing body chunks into the entry at WRITEENTRY, +// and waiting for 'end' on the entry at READENTRY +// +// ignored entries get .resume() called on them straight away +import { EventEmitter as EE } from 'events'; +import { BrotliDecompress, Unzip } from 'minizlib'; +import { Yallist } from 'yallist'; +import { Header } from './header.js'; +import { Pax } from './pax.js'; +import { ReadEntry } from './read-entry.js'; +import { warnMethod, } from './warn-method.js'; +const maxMetaEntrySize = 1024 * 1024; +const gzipHeader = Buffer.from([0x1f, 0x8b]); +const STATE = Symbol('state'); +const WRITEENTRY = Symbol('writeEntry'); +const READENTRY = Symbol('readEntry'); +const NEXTENTRY = Symbol('nextEntry'); +const PROCESSENTRY = Symbol('processEntry'); +const EX = Symbol('extendedHeader'); +const GEX = Symbol('globalExtendedHeader'); +const META = Symbol('meta'); +const EMITMETA = Symbol('emitMeta'); +const BUFFER = Symbol('buffer'); +const QUEUE = Symbol('queue'); +const ENDED = Symbol('ended'); +const EMITTEDEND = Symbol('emittedEnd'); +const EMIT = Symbol('emit'); +const UNZIP = Symbol('unzip'); +const CONSUMECHUNK = Symbol('consumeChunk'); +const CONSUMECHUNKSUB = Symbol('consumeChunkSub'); +const CONSUMEBODY = Symbol('consumeBody'); +const CONSUMEMETA = Symbol('consumeMeta'); +const CONSUMEHEADER = Symbol('consumeHeader'); +const CONSUMING = Symbol('consuming'); +const BUFFERCONCAT = Symbol('bufferConcat'); +const MAYBEEND = Symbol('maybeEnd'); +const WRITING = Symbol('writing'); +const ABORTED = Symbol('aborted'); +const DONE = Symbol('onDone'); +const SAW_VALID_ENTRY = Symbol('sawValidEntry'); +const SAW_NULL_BLOCK = Symbol('sawNullBlock'); +const SAW_EOF = Symbol('sawEOF'); +const CLOSESTREAM = Symbol('closeStream'); +const noop = () => true; +export class Parser extends EE { + file; + strict; + maxMetaEntrySize; + filter; + brotli; + writable = true; + readable = false; + [QUEUE] = new Yallist(); + [BUFFER]; + [READENTRY]; + [WRITEENTRY]; + [STATE] = 'begin'; + [META] = ''; + [EX]; + [GEX]; + [ENDED] = false; + [UNZIP]; + [ABORTED] = false; + [SAW_VALID_ENTRY]; + [SAW_NULL_BLOCK] = false; + [SAW_EOF] = false; + [WRITING] = false; + [CONSUMING] = false; + [EMITTEDEND] = false; + constructor(opt = {}) { + super(); + this.file = opt.file || ''; + // these BADARCHIVE errors can't be detected early. listen on DONE. + this.on(DONE, () => { + if (this[STATE] === 'begin' || + this[SAW_VALID_ENTRY] === false) { + // either less than 1 block of data, or all entries were invalid. + // Either way, probably not even a tarball. + this.warn('TAR_BAD_ARCHIVE', 'Unrecognized archive format'); + } + }); + if (opt.ondone) { + this.on(DONE, opt.ondone); + } + else { + this.on(DONE, () => { + this.emit('prefinish'); + this.emit('finish'); + this.emit('end'); + }); + } + this.strict = !!opt.strict; + this.maxMetaEntrySize = opt.maxMetaEntrySize || maxMetaEntrySize; + this.filter = typeof opt.filter === 'function' ? opt.filter : noop; + // Unlike gzip, brotli doesn't have any magic bytes to identify it + // Users need to explicitly tell us they're extracting a brotli file + // Or we infer from the file extension + const isTBR = opt.file && + (opt.file.endsWith('.tar.br') || opt.file.endsWith('.tbr')); + // if it's a tbr file it MIGHT be brotli, but we don't know until + // we look at it and verify it's not a valid tar file. + this.brotli = + !opt.gzip && opt.brotli !== undefined ? opt.brotli + : isTBR ? undefined + : false; + // have to set this so that streams are ok piping into it + this.on('end', () => this[CLOSESTREAM]()); + if (typeof opt.onwarn === 'function') { + this.on('warn', opt.onwarn); + } + if (typeof opt.onReadEntry === 'function') { + this.on('entry', opt.onReadEntry); + } + } + warn(code, message, data = {}) { + warnMethod(this, code, message, data); + } + [CONSUMEHEADER](chunk, position) { + if (this[SAW_VALID_ENTRY] === undefined) { + this[SAW_VALID_ENTRY] = false; + } + let header; + try { + header = new Header(chunk, position, this[EX], this[GEX]); + } + catch (er) { + return this.warn('TAR_ENTRY_INVALID', er); + } + if (header.nullBlock) { + if (this[SAW_NULL_BLOCK]) { + this[SAW_EOF] = true; + // ending an archive with no entries. pointless, but legal. + if (this[STATE] === 'begin') { + this[STATE] = 'header'; + } + this[EMIT]('eof'); + } + else { + this[SAW_NULL_BLOCK] = true; + this[EMIT]('nullBlock'); + } + } + else { + this[SAW_NULL_BLOCK] = false; + if (!header.cksumValid) { + this.warn('TAR_ENTRY_INVALID', 'checksum failure', { header }); + } + else if (!header.path) { + this.warn('TAR_ENTRY_INVALID', 'path is required', { header }); + } + else { + const type = header.type; + if (/^(Symbolic)?Link$/.test(type) && !header.linkpath) { + this.warn('TAR_ENTRY_INVALID', 'linkpath required', { + header, + }); + } + else if (!/^(Symbolic)?Link$/.test(type) && + !/^(Global)?ExtendedHeader$/.test(type) && + header.linkpath) { + this.warn('TAR_ENTRY_INVALID', 'linkpath forbidden', { + header, + }); + } + else { + const entry = (this[WRITEENTRY] = new ReadEntry(header, this[EX], this[GEX])); + // we do this for meta & ignored entries as well, because they + // are still valid tar, or else we wouldn't know to ignore them + if (!this[SAW_VALID_ENTRY]) { + if (entry.remain) { + // this might be the one! + const onend = () => { + if (!entry.invalid) { + this[SAW_VALID_ENTRY] = true; + } + }; + entry.on('end', onend); + } + else { + this[SAW_VALID_ENTRY] = true; + } + } + if (entry.meta) { + if (entry.size > this.maxMetaEntrySize) { + entry.ignore = true; + this[EMIT]('ignoredEntry', entry); + this[STATE] = 'ignore'; + entry.resume(); + } + else if (entry.size > 0) { + this[META] = ''; + entry.on('data', c => (this[META] += c)); + this[STATE] = 'meta'; + } + } + else { + this[EX] = undefined; + entry.ignore = + entry.ignore || !this.filter(entry.path, entry); + if (entry.ignore) { + // probably valid, just not something we care about + this[EMIT]('ignoredEntry', entry); + this[STATE] = entry.remain ? 'ignore' : 'header'; + entry.resume(); + } + else { + if (entry.remain) { + this[STATE] = 'body'; + } + else { + this[STATE] = 'header'; + entry.end(); + } + if (!this[READENTRY]) { + this[QUEUE].push(entry); + this[NEXTENTRY](); + } + else { + this[QUEUE].push(entry); + } + } + } + } + } + } + } + [CLOSESTREAM]() { + queueMicrotask(() => this.emit('close')); + } + [PROCESSENTRY](entry) { + let go = true; + if (!entry) { + this[READENTRY] = undefined; + go = false; + } + else if (Array.isArray(entry)) { + const [ev, ...args] = entry; + this.emit(ev, ...args); + } + else { + this[READENTRY] = entry; + this.emit('entry', entry); + if (!entry.emittedEnd) { + entry.on('end', () => this[NEXTENTRY]()); + go = false; + } + } + return go; + } + [NEXTENTRY]() { + do { } while (this[PROCESSENTRY](this[QUEUE].shift())); + if (!this[QUEUE].length) { + // At this point, there's nothing in the queue, but we may have an + // entry which is being consumed (readEntry). + // If we don't, then we definitely can handle more data. + // If we do, and either it's flowing, or it has never had any data + // written to it, then it needs more. + // The only other possibility is that it has returned false from a + // write() call, so we wait for the next drain to continue. + const re = this[READENTRY]; + const drainNow = !re || re.flowing || re.size === re.remain; + if (drainNow) { + if (!this[WRITING]) { + this.emit('drain'); + } + } + else { + re.once('drain', () => this.emit('drain')); + } + } + } + [CONSUMEBODY](chunk, position) { + // write up to but no more than writeEntry.blockRemain + const entry = this[WRITEENTRY]; + /* c8 ignore start */ + if (!entry) { + throw new Error('attempt to consume body without entry??'); + } + const br = entry.blockRemain ?? 0; + /* c8 ignore stop */ + const c = br >= chunk.length && position === 0 ? + chunk + : chunk.subarray(position, position + br); + entry.write(c); + if (!entry.blockRemain) { + this[STATE] = 'header'; + this[WRITEENTRY] = undefined; + entry.end(); + } + return c.length; + } + [CONSUMEMETA](chunk, position) { + const entry = this[WRITEENTRY]; + const ret = this[CONSUMEBODY](chunk, position); + // if we finished, then the entry is reset + if (!this[WRITEENTRY] && entry) { + this[EMITMETA](entry); + } + return ret; + } + [EMIT](ev, data, extra) { + if (!this[QUEUE].length && !this[READENTRY]) { + this.emit(ev, data, extra); + } + else { + this[QUEUE].push([ev, data, extra]); + } + } + [EMITMETA](entry) { + this[EMIT]('meta', this[META]); + switch (entry.type) { + case 'ExtendedHeader': + case 'OldExtendedHeader': + this[EX] = Pax.parse(this[META], this[EX], false); + break; + case 'GlobalExtendedHeader': + this[GEX] = Pax.parse(this[META], this[GEX], true); + break; + case 'NextFileHasLongPath': + case 'OldGnuLongPath': { + const ex = this[EX] ?? Object.create(null); + this[EX] = ex; + ex.path = this[META].replace(/\0.*/, ''); + break; + } + case 'NextFileHasLongLinkpath': { + const ex = this[EX] || Object.create(null); + this[EX] = ex; + ex.linkpath = this[META].replace(/\0.*/, ''); + break; + } + /* c8 ignore start */ + default: + throw new Error('unknown meta: ' + entry.type); + /* c8 ignore stop */ + } + } + abort(error) { + this[ABORTED] = true; + this.emit('abort', error); + // always throws, even in non-strict mode + this.warn('TAR_ABORT', error, { recoverable: false }); + } + write(chunk, encoding, cb) { + if (typeof encoding === 'function') { + cb = encoding; + encoding = undefined; + } + if (typeof chunk === 'string') { + chunk = Buffer.from(chunk, + /* c8 ignore next */ + typeof encoding === 'string' ? encoding : 'utf8'); + } + if (this[ABORTED]) { + /* c8 ignore next */ + cb?.(); + return false; + } + // first write, might be gzipped + const needSniff = this[UNZIP] === undefined || + (this.brotli === undefined && this[UNZIP] === false); + if (needSniff && chunk) { + if (this[BUFFER]) { + chunk = Buffer.concat([this[BUFFER], chunk]); + this[BUFFER] = undefined; + } + if (chunk.length < gzipHeader.length) { + this[BUFFER] = chunk; + /* c8 ignore next */ + cb?.(); + return true; + } + // look for gzip header + for (let i = 0; this[UNZIP] === undefined && i < gzipHeader.length; i++) { + if (chunk[i] !== gzipHeader[i]) { + this[UNZIP] = false; + } + } + const maybeBrotli = this.brotli === undefined; + if (this[UNZIP] === false && maybeBrotli) { + // read the first header to see if it's a valid tar file. If so, + // we can safely assume that it's not actually brotli, despite the + // .tbr or .tar.br file extension. + // if we ended before getting a full chunk, yes, def brotli + if (chunk.length < 512) { + if (this[ENDED]) { + this.brotli = true; + } + else { + this[BUFFER] = chunk; + /* c8 ignore next */ + cb?.(); + return true; + } + } + else { + // if it's tar, it's pretty reliably not brotli, chances of + // that happening are astronomical. + try { + new Header(chunk.subarray(0, 512)); + this.brotli = false; + } + catch (_) { + this.brotli = true; + } + } + } + if (this[UNZIP] === undefined || + (this[UNZIP] === false && this.brotli)) { + const ended = this[ENDED]; + this[ENDED] = false; + this[UNZIP] = + this[UNZIP] === undefined ? + new Unzip({}) + : new BrotliDecompress({}); + this[UNZIP].on('data', chunk => this[CONSUMECHUNK](chunk)); + this[UNZIP].on('error', er => this.abort(er)); + this[UNZIP].on('end', () => { + this[ENDED] = true; + this[CONSUMECHUNK](); + }); + this[WRITING] = true; + const ret = !!this[UNZIP][ended ? 'end' : 'write'](chunk); + this[WRITING] = false; + cb?.(); + return ret; + } + } + this[WRITING] = true; + if (this[UNZIP]) { + this[UNZIP].write(chunk); + } + else { + this[CONSUMECHUNK](chunk); + } + this[WRITING] = false; + // return false if there's a queue, or if the current entry isn't flowing + const ret = this[QUEUE].length ? false + : this[READENTRY] ? this[READENTRY].flowing + : true; + // if we have no queue, then that means a clogged READENTRY + if (!ret && !this[QUEUE].length) { + this[READENTRY]?.once('drain', () => this.emit('drain')); + } + /* c8 ignore next */ + cb?.(); + return ret; + } + [BUFFERCONCAT](c) { + if (c && !this[ABORTED]) { + this[BUFFER] = + this[BUFFER] ? Buffer.concat([this[BUFFER], c]) : c; + } + } + [MAYBEEND]() { + if (this[ENDED] && + !this[EMITTEDEND] && + !this[ABORTED] && + !this[CONSUMING]) { + this[EMITTEDEND] = true; + const entry = this[WRITEENTRY]; + if (entry && entry.blockRemain) { + // truncated, likely a damaged file + const have = this[BUFFER] ? this[BUFFER].length : 0; + this.warn('TAR_BAD_ARCHIVE', `Truncated input (needed ${entry.blockRemain} more bytes, only ${have} available)`, { entry }); + if (this[BUFFER]) { + entry.write(this[BUFFER]); + } + entry.end(); + } + this[EMIT](DONE); + } + } + [CONSUMECHUNK](chunk) { + if (this[CONSUMING] && chunk) { + this[BUFFERCONCAT](chunk); + } + else if (!chunk && !this[BUFFER]) { + this[MAYBEEND](); + } + else if (chunk) { + this[CONSUMING] = true; + if (this[BUFFER]) { + this[BUFFERCONCAT](chunk); + const c = this[BUFFER]; + this[BUFFER] = undefined; + this[CONSUMECHUNKSUB](c); + } + else { + this[CONSUMECHUNKSUB](chunk); + } + while (this[BUFFER] && + this[BUFFER]?.length >= 512 && + !this[ABORTED] && + !this[SAW_EOF]) { + const c = this[BUFFER]; + this[BUFFER] = undefined; + this[CONSUMECHUNKSUB](c); + } + this[CONSUMING] = false; + } + if (!this[BUFFER] || this[ENDED]) { + this[MAYBEEND](); + } + } + [CONSUMECHUNKSUB](chunk) { + // we know that we are in CONSUMING mode, so anything written goes into + // the buffer. Advance the position and put any remainder in the buffer. + let position = 0; + const length = chunk.length; + while (position + 512 <= length && + !this[ABORTED] && + !this[SAW_EOF]) { + switch (this[STATE]) { + case 'begin': + case 'header': + this[CONSUMEHEADER](chunk, position); + position += 512; + break; + case 'ignore': + case 'body': + position += this[CONSUMEBODY](chunk, position); + break; + case 'meta': + position += this[CONSUMEMETA](chunk, position); + break; + /* c8 ignore start */ + default: + throw new Error('invalid state: ' + this[STATE]); + /* c8 ignore stop */ + } + } + if (position < length) { + if (this[BUFFER]) { + this[BUFFER] = Buffer.concat([ + chunk.subarray(position), + this[BUFFER], + ]); + } + else { + this[BUFFER] = chunk.subarray(position); + } + } + } + end(chunk, encoding, cb) { + if (typeof chunk === 'function') { + cb = chunk; + encoding = undefined; + chunk = undefined; + } + if (typeof encoding === 'function') { + cb = encoding; + encoding = undefined; + } + if (typeof chunk === 'string') { + chunk = Buffer.from(chunk, encoding); + } + if (cb) + this.once('finish', cb); + if (!this[ABORTED]) { + if (this[UNZIP]) { + /* c8 ignore start */ + if (chunk) + this[UNZIP].write(chunk); + /* c8 ignore stop */ + this[UNZIP].end(); + } + else { + this[ENDED] = true; + if (this.brotli === undefined) + chunk = chunk || Buffer.alloc(0); + if (chunk) + this.write(chunk); + this[MAYBEEND](); + } + } + return this; + } +} +//# sourceMappingURL=parse.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/path-reservations.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/path-reservations.js new file mode 100644 index 00000000000000..e63b9c91e9a808 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/path-reservations.js @@ -0,0 +1,166 @@ +// A path exclusive reservation system +// reserve([list, of, paths], fn) +// When the fn is first in line for all its paths, it +// is called with a cb that clears the reservation. +// +// Used by async unpack to avoid clobbering paths in use, +// while still allowing maximal safe parallelization. +import { join } from 'node:path'; +import { normalizeUnicode } from './normalize-unicode.js'; +import { stripTrailingSlashes } from './strip-trailing-slashes.js'; +const platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform; +const isWindows = platform === 'win32'; +// return a set of parent dirs for a given path +// '/a/b/c/d' -> ['/', '/a', '/a/b', '/a/b/c', '/a/b/c/d'] +const getDirs = (path) => { + const dirs = path + .split('/') + .slice(0, -1) + .reduce((set, path) => { + const s = set[set.length - 1]; + if (s !== undefined) { + path = join(s, path); + } + set.push(path || '/'); + return set; + }, []); + return dirs; +}; +export class PathReservations { + // path => [function or Set] + // A Set object means a directory reservation + // A fn is a direct reservation on that path + #queues = new Map(); + // fn => {paths:[path,...], dirs:[path, ...]} + #reservations = new Map(); + // functions currently running + #running = new Set(); + reserve(paths, fn) { + paths = + isWindows ? + ['win32 parallelization disabled'] + : paths.map(p => { + // don't need normPath, because we skip this entirely for windows + return stripTrailingSlashes(join(normalizeUnicode(p))).toLowerCase(); + }); + const dirs = new Set(paths.map(path => getDirs(path)).reduce((a, b) => a.concat(b))); + this.#reservations.set(fn, { dirs, paths }); + for (const p of paths) { + const q = this.#queues.get(p); + if (!q) { + this.#queues.set(p, [fn]); + } + else { + q.push(fn); + } + } + for (const dir of dirs) { + const q = this.#queues.get(dir); + if (!q) { + this.#queues.set(dir, [new Set([fn])]); + } + else { + const l = q[q.length - 1]; + if (l instanceof Set) { + l.add(fn); + } + else { + q.push(new Set([fn])); + } + } + } + return this.#run(fn); + } + // return the queues for each path the function cares about + // fn => {paths, dirs} + #getQueues(fn) { + const res = this.#reservations.get(fn); + /* c8 ignore start */ + if (!res) { + throw new Error('function does not have any path reservations'); + } + /* c8 ignore stop */ + return { + paths: res.paths.map((path) => this.#queues.get(path)), + dirs: [...res.dirs].map(path => this.#queues.get(path)), + }; + } + // check if fn is first in line for all its paths, and is + // included in the first set for all its dir queues + check(fn) { + const { paths, dirs } = this.#getQueues(fn); + return (paths.every(q => q && q[0] === fn) && + dirs.every(q => q && q[0] instanceof Set && q[0].has(fn))); + } + // run the function if it's first in line and not already running + #run(fn) { + if (this.#running.has(fn) || !this.check(fn)) { + return false; + } + this.#running.add(fn); + fn(() => this.#clear(fn)); + return true; + } + #clear(fn) { + if (!this.#running.has(fn)) { + return false; + } + const res = this.#reservations.get(fn); + /* c8 ignore start */ + if (!res) { + throw new Error('invalid reservation'); + } + /* c8 ignore stop */ + const { paths, dirs } = res; + const next = new Set(); + for (const path of paths) { + const q = this.#queues.get(path); + /* c8 ignore start */ + if (!q || q?.[0] !== fn) { + continue; + } + /* c8 ignore stop */ + const q0 = q[1]; + if (!q0) { + this.#queues.delete(path); + continue; + } + q.shift(); + if (typeof q0 === 'function') { + next.add(q0); + } + else { + for (const f of q0) { + next.add(f); + } + } + } + for (const dir of dirs) { + const q = this.#queues.get(dir); + const q0 = q?.[0]; + /* c8 ignore next - type safety only */ + if (!q || !(q0 instanceof Set)) + continue; + if (q0.size === 1 && q.length === 1) { + this.#queues.delete(dir); + continue; + } + else if (q0.size === 1) { + q.shift(); + // next one must be a function, + // or else the Set would've been reused + const n = q[0]; + if (typeof n === 'function') { + next.add(n); + } + } + else { + q0.delete(fn); + } + } + this.#running.delete(fn); + next.forEach(fn => this.#run(fn)); + return true; + } +} +//# sourceMappingURL=path-reservations.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/pax.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/pax.js new file mode 100644 index 00000000000000..832808f344da53 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/pax.js @@ -0,0 +1,154 @@ +import { basename } from 'node:path'; +import { Header } from './header.js'; +export class Pax { + atime; + mtime; + ctime; + charset; + comment; + gid; + uid; + gname; + uname; + linkpath; + dev; + ino; + nlink; + path; + size; + mode; + global; + constructor(obj, global = false) { + this.atime = obj.atime; + this.charset = obj.charset; + this.comment = obj.comment; + this.ctime = obj.ctime; + this.dev = obj.dev; + this.gid = obj.gid; + this.global = global; + this.gname = obj.gname; + this.ino = obj.ino; + this.linkpath = obj.linkpath; + this.mtime = obj.mtime; + this.nlink = obj.nlink; + this.path = obj.path; + this.size = obj.size; + this.uid = obj.uid; + this.uname = obj.uname; + } + encode() { + const body = this.encodeBody(); + if (body === '') { + return Buffer.allocUnsafe(0); + } + const bodyLen = Buffer.byteLength(body); + // round up to 512 bytes + // add 512 for header + const bufLen = 512 * Math.ceil(1 + bodyLen / 512); + const buf = Buffer.allocUnsafe(bufLen); + // 0-fill the header section, it might not hit every field + for (let i = 0; i < 512; i++) { + buf[i] = 0; + } + new Header({ + // XXX split the path + // then the path should be PaxHeader + basename, but less than 99, + // prepend with the dirname + /* c8 ignore start */ + path: ('PaxHeader/' + basename(this.path ?? '')).slice(0, 99), + /* c8 ignore stop */ + mode: this.mode || 0o644, + uid: this.uid, + gid: this.gid, + size: bodyLen, + mtime: this.mtime, + type: this.global ? 'GlobalExtendedHeader' : 'ExtendedHeader', + linkpath: '', + uname: this.uname || '', + gname: this.gname || '', + devmaj: 0, + devmin: 0, + atime: this.atime, + ctime: this.ctime, + }).encode(buf); + buf.write(body, 512, bodyLen, 'utf8'); + // null pad after the body + for (let i = bodyLen + 512; i < buf.length; i++) { + buf[i] = 0; + } + return buf; + } + encodeBody() { + return (this.encodeField('path') + + this.encodeField('ctime') + + this.encodeField('atime') + + this.encodeField('dev') + + this.encodeField('ino') + + this.encodeField('nlink') + + this.encodeField('charset') + + this.encodeField('comment') + + this.encodeField('gid') + + this.encodeField('gname') + + this.encodeField('linkpath') + + this.encodeField('mtime') + + this.encodeField('size') + + this.encodeField('uid') + + this.encodeField('uname')); + } + encodeField(field) { + if (this[field] === undefined) { + return ''; + } + const r = this[field]; + const v = r instanceof Date ? r.getTime() / 1000 : r; + const s = ' ' + + (field === 'dev' || field === 'ino' || field === 'nlink' ? + 'SCHILY.' + : '') + + field + + '=' + + v + + '\n'; + const byteLen = Buffer.byteLength(s); + // the digits includes the length of the digits in ascii base-10 + // so if it's 9 characters, then adding 1 for the 9 makes it 10 + // which makes it 11 chars. + let digits = Math.floor(Math.log(byteLen) / Math.log(10)) + 1; + if (byteLen + digits >= Math.pow(10, digits)) { + digits += 1; + } + const len = digits + byteLen; + return len + s; + } + static parse(str, ex, g = false) { + return new Pax(merge(parseKV(str), ex), g); + } +} +const merge = (a, b) => b ? Object.assign({}, b, a) : a; +const parseKV = (str) => str + .replace(/\n$/, '') + .split('\n') + .reduce(parseKVLine, Object.create(null)); +const parseKVLine = (set, line) => { + const n = parseInt(line, 10); + // XXX Values with \n in them will fail this. + // Refactor to not be a naive line-by-line parse. + if (n !== Buffer.byteLength(line) + 1) { + return set; + } + line = line.slice((n + ' ').length); + const kv = line.split('='); + const r = kv.shift(); + if (!r) { + return set; + } + const k = r.replace(/^SCHILY\.(dev|ino|nlink)/, '$1'); + const v = kv.join('='); + set[k] = + /^([A-Z]+\.)?([mac]|birth|creation)time$/.test(k) ? + new Date(Number(v) * 1000) + : /^[0-9]+$/.test(v) ? +v + : v; + return set; +}; +//# sourceMappingURL=pax.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/read-entry.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/read-entry.js new file mode 100644 index 00000000000000..23cc673e610879 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/read-entry.js @@ -0,0 +1,136 @@ +import { Minipass } from 'minipass'; +import { normalizeWindowsPath } from './normalize-windows-path.js'; +export class ReadEntry extends Minipass { + extended; + globalExtended; + header; + startBlockSize; + blockRemain; + remain; + type; + meta = false; + ignore = false; + path; + mode; + uid; + gid; + uname; + gname; + size = 0; + mtime; + atime; + ctime; + linkpath; + dev; + ino; + nlink; + invalid = false; + absolute; + unsupported = false; + constructor(header, ex, gex) { + super({}); + // read entries always start life paused. this is to avoid the + // situation where Minipass's auto-ending empty streams results + // in an entry ending before we're ready for it. + this.pause(); + this.extended = ex; + this.globalExtended = gex; + this.header = header; + /* c8 ignore start */ + this.remain = header.size ?? 0; + /* c8 ignore stop */ + this.startBlockSize = 512 * Math.ceil(this.remain / 512); + this.blockRemain = this.startBlockSize; + this.type = header.type; + switch (this.type) { + case 'File': + case 'OldFile': + case 'Link': + case 'SymbolicLink': + case 'CharacterDevice': + case 'BlockDevice': + case 'Directory': + case 'FIFO': + case 'ContiguousFile': + case 'GNUDumpDir': + break; + case 'NextFileHasLongLinkpath': + case 'NextFileHasLongPath': + case 'OldGnuLongPath': + case 'GlobalExtendedHeader': + case 'ExtendedHeader': + case 'OldExtendedHeader': + this.meta = true; + break; + // NOTE: gnutar and bsdtar treat unrecognized types as 'File' + // it may be worth doing the same, but with a warning. + default: + this.ignore = true; + } + /* c8 ignore start */ + if (!header.path) { + throw new Error('no path provided for tar.ReadEntry'); + } + /* c8 ignore stop */ + this.path = normalizeWindowsPath(header.path); + this.mode = header.mode; + if (this.mode) { + this.mode = this.mode & 0o7777; + } + this.uid = header.uid; + this.gid = header.gid; + this.uname = header.uname; + this.gname = header.gname; + this.size = this.remain; + this.mtime = header.mtime; + this.atime = header.atime; + this.ctime = header.ctime; + /* c8 ignore start */ + this.linkpath = + header.linkpath ? + normalizeWindowsPath(header.linkpath) + : undefined; + /* c8 ignore stop */ + this.uname = header.uname; + this.gname = header.gname; + if (ex) { + this.#slurp(ex); + } + if (gex) { + this.#slurp(gex, true); + } + } + write(data) { + const writeLen = data.length; + if (writeLen > this.blockRemain) { + throw new Error('writing more to entry than is appropriate'); + } + const r = this.remain; + const br = this.blockRemain; + this.remain = Math.max(0, r - writeLen); + this.blockRemain = Math.max(0, br - writeLen); + if (this.ignore) { + return true; + } + if (r >= writeLen) { + return super.write(data); + } + // r < writeLen + return super.write(data.subarray(0, r)); + } + #slurp(ex, gex = false) { + if (ex.path) + ex.path = normalizeWindowsPath(ex.path); + if (ex.linkpath) + ex.linkpath = normalizeWindowsPath(ex.linkpath); + Object.assign(this, Object.fromEntries(Object.entries(ex).filter(([k, v]) => { + // we slurp in everything except for the path attribute in + // a global extended header, because that's weird. Also, any + // null/undefined values are ignored. + return !(v === null || + v === undefined || + (k === 'path' && gex)); + }))); + } +} +//# sourceMappingURL=read-entry.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/replace.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/replace.js new file mode 100644 index 00000000000000..c461a4c7d8b63c --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/replace.js @@ -0,0 +1,225 @@ +// tar -r +import { WriteStream, WriteStreamSync } from '@isaacs/fs-minipass'; +import fs from 'node:fs'; +import path from 'node:path'; +import { Header } from './header.js'; +import { list } from './list.js'; +import { makeCommand } from './make-command.js'; +import { isFile, } from './options.js'; +import { Pack, PackSync } from './pack.js'; +// starting at the head of the file, read a Header +// If the checksum is invalid, that's our position to start writing +// If it is, jump forward by the specified size (round up to 512) +// and try again. +// Write the new Pack stream starting there. +const replaceSync = (opt, files) => { + const p = new PackSync(opt); + let threw = true; + let fd; + let position; + try { + try { + fd = fs.openSync(opt.file, 'r+'); + } + catch (er) { + if (er?.code === 'ENOENT') { + fd = fs.openSync(opt.file, 'w+'); + } + else { + throw er; + } + } + const st = fs.fstatSync(fd); + const headBuf = Buffer.alloc(512); + POSITION: for (position = 0; position < st.size; position += 512) { + for (let bufPos = 0, bytes = 0; bufPos < 512; bufPos += bytes) { + bytes = fs.readSync(fd, headBuf, bufPos, headBuf.length - bufPos, position + bufPos); + if (position === 0 && + headBuf[0] === 0x1f && + headBuf[1] === 0x8b) { + throw new Error('cannot append to compressed archives'); + } + if (!bytes) { + break POSITION; + } + } + const h = new Header(headBuf); + if (!h.cksumValid) { + break; + } + const entryBlockSize = 512 * Math.ceil((h.size || 0) / 512); + if (position + entryBlockSize + 512 > st.size) { + break; + } + // the 512 for the header we just parsed will be added as well + // also jump ahead all the blocks for the body + position += entryBlockSize; + if (opt.mtimeCache && h.mtime) { + opt.mtimeCache.set(String(h.path), h.mtime); + } + } + threw = false; + streamSync(opt, p, position, fd, files); + } + finally { + if (threw) { + try { + fs.closeSync(fd); + } + catch (er) { } + } + } +}; +const streamSync = (opt, p, position, fd, files) => { + const stream = new WriteStreamSync(opt.file, { + fd: fd, + start: position, + }); + p.pipe(stream); + addFilesSync(p, files); +}; +const replaceAsync = (opt, files) => { + files = Array.from(files); + const p = new Pack(opt); + const getPos = (fd, size, cb_) => { + const cb = (er, pos) => { + if (er) { + fs.close(fd, _ => cb_(er)); + } + else { + cb_(null, pos); + } + }; + let position = 0; + if (size === 0) { + return cb(null, 0); + } + let bufPos = 0; + const headBuf = Buffer.alloc(512); + const onread = (er, bytes) => { + if (er || typeof bytes === 'undefined') { + return cb(er); + } + bufPos += bytes; + if (bufPos < 512 && bytes) { + return fs.read(fd, headBuf, bufPos, headBuf.length - bufPos, position + bufPos, onread); + } + if (position === 0 && + headBuf[0] === 0x1f && + headBuf[1] === 0x8b) { + return cb(new Error('cannot append to compressed archives')); + } + // truncated header + if (bufPos < 512) { + return cb(null, position); + } + const h = new Header(headBuf); + if (!h.cksumValid) { + return cb(null, position); + } + /* c8 ignore next */ + const entryBlockSize = 512 * Math.ceil((h.size ?? 0) / 512); + if (position + entryBlockSize + 512 > size) { + return cb(null, position); + } + position += entryBlockSize + 512; + if (position >= size) { + return cb(null, position); + } + if (opt.mtimeCache && h.mtime) { + opt.mtimeCache.set(String(h.path), h.mtime); + } + bufPos = 0; + fs.read(fd, headBuf, 0, 512, position, onread); + }; + fs.read(fd, headBuf, 0, 512, position, onread); + }; + const promise = new Promise((resolve, reject) => { + p.on('error', reject); + let flag = 'r+'; + const onopen = (er, fd) => { + if (er && er.code === 'ENOENT' && flag === 'r+') { + flag = 'w+'; + return fs.open(opt.file, flag, onopen); + } + if (er || !fd) { + return reject(er); + } + fs.fstat(fd, (er, st) => { + if (er) { + return fs.close(fd, () => reject(er)); + } + getPos(fd, st.size, (er, position) => { + if (er) { + return reject(er); + } + const stream = new WriteStream(opt.file, { + fd: fd, + start: position, + }); + p.pipe(stream); + stream.on('error', reject); + stream.on('close', resolve); + addFilesAsync(p, files); + }); + }); + }; + fs.open(opt.file, flag, onopen); + }); + return promise; +}; +const addFilesSync = (p, files) => { + files.forEach(file => { + if (file.charAt(0) === '@') { + list({ + file: path.resolve(p.cwd, file.slice(1)), + sync: true, + noResume: true, + onReadEntry: entry => p.add(entry), + }); + } + else { + p.add(file); + } + }); + p.end(); +}; +const addFilesAsync = async (p, files) => { + for (let i = 0; i < files.length; i++) { + const file = String(files[i]); + if (file.charAt(0) === '@') { + await list({ + file: path.resolve(String(p.cwd), file.slice(1)), + noResume: true, + onReadEntry: entry => p.add(entry), + }); + } + else { + p.add(file); + } + } + p.end(); +}; +export const replace = makeCommand(replaceSync, replaceAsync, +/* c8 ignore start */ +() => { + throw new TypeError('file is required'); +}, () => { + throw new TypeError('file is required'); +}, +/* c8 ignore stop */ +(opt, entries) => { + if (!isFile(opt)) { + throw new TypeError('file is required'); + } + if (opt.gzip || + opt.brotli || + opt.file.endsWith('.br') || + opt.file.endsWith('.tbr')) { + throw new TypeError('cannot append to compressed archives'); + } + if (!entries?.length) { + throw new TypeError('no paths specified to add/replace'); + } +}); +//# sourceMappingURL=replace.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/strip-absolute-path.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/strip-absolute-path.js new file mode 100644 index 00000000000000..cce5ff80b00db3 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/strip-absolute-path.js @@ -0,0 +1,25 @@ +// unix absolute paths are also absolute on win32, so we use this for both +import { win32 } from 'node:path'; +const { isAbsolute, parse } = win32; +// returns [root, stripped] +// Note that windows will think that //x/y/z/a has a "root" of //x/y, and in +// those cases, we want to sanitize it to x/y/z/a, not z/a, so we strip / +// explicitly if it's the first character. +// drive-specific relative paths on Windows get their root stripped off even +// though they are not absolute, so `c:../foo` becomes ['c:', '../foo'] +export const stripAbsolutePath = (path) => { + let r = ''; + let parsed = parse(path); + while (isAbsolute(path) || parsed.root) { + // windows will think that //x/y/z has a "root" of //x/y/ + // but strip the //?/C:/ off of //?/C:/path + const root = path.charAt(0) === '/' && path.slice(0, 4) !== '//?/' ? + '/' + : parsed.root; + path = path.slice(root.length); + r += root; + parsed = parse(path); + } + return [r, path]; +}; +//# sourceMappingURL=strip-absolute-path.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/strip-trailing-slashes.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/strip-trailing-slashes.js new file mode 100644 index 00000000000000..ace4218a7547bf --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/strip-trailing-slashes.js @@ -0,0 +1,14 @@ +// warning: extremely hot code path. +// This has been meticulously optimized for use +// within npm install on large package trees. +// Do not edit without careful benchmarking. +export const stripTrailingSlashes = (str) => { + let i = str.length - 1; + let slashesStart = -1; + while (i > -1 && str.charAt(i) === '/') { + slashesStart = i; + i--; + } + return slashesStart === -1 ? str : str.slice(0, slashesStart); +}; +//# sourceMappingURL=strip-trailing-slashes.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/symlink-error.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/symlink-error.js new file mode 100644 index 00000000000000..d31766e2e0afa0 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/symlink-error.js @@ -0,0 +1,15 @@ +export class SymlinkError extends Error { + path; + symlink; + syscall = 'symlink'; + code = 'TAR_SYMLINK_ERROR'; + constructor(symlink, path) { + super('TAR_SYMLINK_ERROR: Cannot extract through symbolic link'); + this.symlink = symlink; + this.path = path; + } + get name() { + return 'SymlinkError'; + } +} +//# sourceMappingURL=symlink-error.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/types.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/types.js new file mode 100644 index 00000000000000..27b982ae1e0922 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/types.js @@ -0,0 +1,45 @@ +export const isCode = (c) => name.has(c); +export const isName = (c) => code.has(c); +// map types from key to human-friendly name +export const name = new Map([ + ['0', 'File'], + // same as File + ['', 'OldFile'], + ['1', 'Link'], + ['2', 'SymbolicLink'], + // Devices and FIFOs aren't fully supported + // they are parsed, but skipped when unpacking + ['3', 'CharacterDevice'], + ['4', 'BlockDevice'], + ['5', 'Directory'], + ['6', 'FIFO'], + // same as File + ['7', 'ContiguousFile'], + // pax headers + ['g', 'GlobalExtendedHeader'], + ['x', 'ExtendedHeader'], + // vendor-specific stuff + // skip + ['A', 'SolarisACL'], + // like 5, but with data, which should be skipped + ['D', 'GNUDumpDir'], + // metadata only, skip + ['I', 'Inode'], + // data = link path of next file + ['K', 'NextFileHasLongLinkpath'], + // data = path of next file + ['L', 'NextFileHasLongPath'], + // skip + ['M', 'ContinuationFile'], + // like L + ['N', 'OldGnuLongPath'], + // skip + ['S', 'SparseFile'], + // skip + ['V', 'TapeVolumeHeader'], + // like x + ['X', 'OldExtendedHeader'], +]); +// map the other direction +export const code = new Map(Array.from(name).map(kv => [kv[1], kv[0]])); +//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/unpack.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/unpack.js new file mode 100644 index 00000000000000..6e744cfc1a6f9f --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/unpack.js @@ -0,0 +1,888 @@ +// the PEND/UNPEND stuff tracks whether we're ready to emit end/close yet. +// but the path reservations are required to avoid race conditions where +// parallelized unpack ops may mess with one another, due to dependencies +// (like a Link depending on its target) or destructive operations (like +// clobbering an fs object to create one of a different type.) +import * as fsm from '@isaacs/fs-minipass'; +import assert from 'node:assert'; +import { randomBytes } from 'node:crypto'; +import fs from 'node:fs'; +import path from 'node:path'; +import { getWriteFlag } from './get-write-flag.js'; +import { mkdir, mkdirSync } from './mkdir.js'; +import { normalizeUnicode } from './normalize-unicode.js'; +import { normalizeWindowsPath } from './normalize-windows-path.js'; +import { Parser } from './parse.js'; +import { stripAbsolutePath } from './strip-absolute-path.js'; +import { stripTrailingSlashes } from './strip-trailing-slashes.js'; +import * as wc from './winchars.js'; +import { PathReservations } from './path-reservations.js'; +const ONENTRY = Symbol('onEntry'); +const CHECKFS = Symbol('checkFs'); +const CHECKFS2 = Symbol('checkFs2'); +const PRUNECACHE = Symbol('pruneCache'); +const ISREUSABLE = Symbol('isReusable'); +const MAKEFS = Symbol('makeFs'); +const FILE = Symbol('file'); +const DIRECTORY = Symbol('directory'); +const LINK = Symbol('link'); +const SYMLINK = Symbol('symlink'); +const HARDLINK = Symbol('hardlink'); +const UNSUPPORTED = Symbol('unsupported'); +const CHECKPATH = Symbol('checkPath'); +const MKDIR = Symbol('mkdir'); +const ONERROR = Symbol('onError'); +const PENDING = Symbol('pending'); +const PEND = Symbol('pend'); +const UNPEND = Symbol('unpend'); +const ENDED = Symbol('ended'); +const MAYBECLOSE = Symbol('maybeClose'); +const SKIP = Symbol('skip'); +const DOCHOWN = Symbol('doChown'); +const UID = Symbol('uid'); +const GID = Symbol('gid'); +const CHECKED_CWD = Symbol('checkedCwd'); +const platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform; +const isWindows = platform === 'win32'; +const DEFAULT_MAX_DEPTH = 1024; +// Unlinks on Windows are not atomic. +// +// This means that if you have a file entry, followed by another +// file entry with an identical name, and you cannot re-use the file +// (because it's a hardlink, or because unlink:true is set, or it's +// Windows, which does not have useful nlink values), then the unlink +// will be committed to the disk AFTER the new file has been written +// over the old one, deleting the new file. +// +// To work around this, on Windows systems, we rename the file and then +// delete the renamed file. It's a sloppy kludge, but frankly, I do not +// know of a better way to do this, given windows' non-atomic unlink +// semantics. +// +// See: https://github.com/npm/node-tar/issues/183 +/* c8 ignore start */ +const unlinkFile = (path, cb) => { + if (!isWindows) { + return fs.unlink(path, cb); + } + const name = path + '.DELETE.' + randomBytes(16).toString('hex'); + fs.rename(path, name, er => { + if (er) { + return cb(er); + } + fs.unlink(name, cb); + }); +}; +/* c8 ignore stop */ +/* c8 ignore start */ +const unlinkFileSync = (path) => { + if (!isWindows) { + return fs.unlinkSync(path); + } + const name = path + '.DELETE.' + randomBytes(16).toString('hex'); + fs.renameSync(path, name); + fs.unlinkSync(name); +}; +/* c8 ignore stop */ +// this.gid, entry.gid, this.processUid +const uint32 = (a, b, c) => a !== undefined && a === a >>> 0 ? a + : b !== undefined && b === b >>> 0 ? b + : c; +// clear the cache if it's a case-insensitive unicode-squashing match. +// we can't know if the current file system is case-sensitive or supports +// unicode fully, so we check for similarity on the maximally compatible +// representation. Err on the side of pruning, since all it's doing is +// preventing lstats, and it's not the end of the world if we get a false +// positive. +// Note that on windows, we always drop the entire cache whenever a +// symbolic link is encountered, because 8.3 filenames are impossible +// to reason about, and collisions are hazards rather than just failures. +const cacheKeyNormalize = (path) => stripTrailingSlashes(normalizeWindowsPath(normalizeUnicode(path))).toLowerCase(); +// remove all cache entries matching ${abs}/** +const pruneCache = (cache, abs) => { + abs = cacheKeyNormalize(abs); + for (const path of cache.keys()) { + const pnorm = cacheKeyNormalize(path); + if (pnorm === abs || pnorm.indexOf(abs + '/') === 0) { + cache.delete(path); + } + } +}; +const dropCache = (cache) => { + for (const key of cache.keys()) { + cache.delete(key); + } +}; +export class Unpack extends Parser { + [ENDED] = false; + [CHECKED_CWD] = false; + [PENDING] = 0; + reservations = new PathReservations(); + transform; + writable = true; + readable = false; + dirCache; + uid; + gid; + setOwner; + preserveOwner; + processGid; + processUid; + maxDepth; + forceChown; + win32; + newer; + keep; + noMtime; + preservePaths; + unlink; + cwd; + strip; + processUmask; + umask; + dmode; + fmode; + chmod; + constructor(opt = {}) { + opt.ondone = () => { + this[ENDED] = true; + this[MAYBECLOSE](); + }; + super(opt); + this.transform = opt.transform; + this.dirCache = opt.dirCache || new Map(); + this.chmod = !!opt.chmod; + if (typeof opt.uid === 'number' || typeof opt.gid === 'number') { + // need both or neither + if (typeof opt.uid !== 'number' || + typeof opt.gid !== 'number') { + throw new TypeError('cannot set owner without number uid and gid'); + } + if (opt.preserveOwner) { + throw new TypeError('cannot preserve owner in archive and also set owner explicitly'); + } + this.uid = opt.uid; + this.gid = opt.gid; + this.setOwner = true; + } + else { + this.uid = undefined; + this.gid = undefined; + this.setOwner = false; + } + // default true for root + if (opt.preserveOwner === undefined && + typeof opt.uid !== 'number') { + this.preserveOwner = !!(process.getuid && process.getuid() === 0); + } + else { + this.preserveOwner = !!opt.preserveOwner; + } + this.processUid = + (this.preserveOwner || this.setOwner) && process.getuid ? + process.getuid() + : undefined; + this.processGid = + (this.preserveOwner || this.setOwner) && process.getgid ? + process.getgid() + : undefined; + // prevent excessively deep nesting of subfolders + // set to `Infinity` to remove this restriction + this.maxDepth = + typeof opt.maxDepth === 'number' ? + opt.maxDepth + : DEFAULT_MAX_DEPTH; + // mostly just for testing, but useful in some cases. + // Forcibly trigger a chown on every entry, no matter what + this.forceChown = opt.forceChown === true; + // turn > this[ONENTRY](entry)); + } + // a bad or damaged archive is a warning for Parser, but an error + // when extracting. Mark those errors as unrecoverable, because + // the Unpack contract cannot be met. + warn(code, msg, data = {}) { + if (code === 'TAR_BAD_ARCHIVE' || code === 'TAR_ABORT') { + data.recoverable = false; + } + return super.warn(code, msg, data); + } + [MAYBECLOSE]() { + if (this[ENDED] && this[PENDING] === 0) { + this.emit('prefinish'); + this.emit('finish'); + this.emit('end'); + } + } + [CHECKPATH](entry) { + const p = normalizeWindowsPath(entry.path); + const parts = p.split('/'); + if (this.strip) { + if (parts.length < this.strip) { + return false; + } + if (entry.type === 'Link') { + const linkparts = normalizeWindowsPath(String(entry.linkpath)).split('/'); + if (linkparts.length >= this.strip) { + entry.linkpath = linkparts.slice(this.strip).join('/'); + } + else { + return false; + } + } + parts.splice(0, this.strip); + entry.path = parts.join('/'); + } + if (isFinite(this.maxDepth) && parts.length > this.maxDepth) { + this.warn('TAR_ENTRY_ERROR', 'path excessively deep', { + entry, + path: p, + depth: parts.length, + maxDepth: this.maxDepth, + }); + return false; + } + if (!this.preservePaths) { + if (parts.includes('..') || + /* c8 ignore next */ + (isWindows && /^[a-z]:\.\.$/i.test(parts[0] ?? ''))) { + this.warn('TAR_ENTRY_ERROR', `path contains '..'`, { + entry, + path: p, + }); + return false; + } + // strip off the root + const [root, stripped] = stripAbsolutePath(p); + if (root) { + entry.path = String(stripped); + this.warn('TAR_ENTRY_INFO', `stripping ${root} from absolute path`, { + entry, + path: p, + }); + } + } + if (path.isAbsolute(entry.path)) { + entry.absolute = normalizeWindowsPath(path.resolve(entry.path)); + } + else { + entry.absolute = normalizeWindowsPath(path.resolve(this.cwd, entry.path)); + } + // if we somehow ended up with a path that escapes the cwd, and we are + // not in preservePaths mode, then something is fishy! This should have + // been prevented above, so ignore this for coverage. + /* c8 ignore start - defense in depth */ + if (!this.preservePaths && + typeof entry.absolute === 'string' && + entry.absolute.indexOf(this.cwd + '/') !== 0 && + entry.absolute !== this.cwd) { + this.warn('TAR_ENTRY_ERROR', 'path escaped extraction target', { + entry, + path: normalizeWindowsPath(entry.path), + resolvedPath: entry.absolute, + cwd: this.cwd, + }); + return false; + } + /* c8 ignore stop */ + // an archive can set properties on the extraction directory, but it + // may not replace the cwd with a different kind of thing entirely. + if (entry.absolute === this.cwd && + entry.type !== 'Directory' && + entry.type !== 'GNUDumpDir') { + return false; + } + // only encode : chars that aren't drive letter indicators + if (this.win32) { + const { root: aRoot } = path.win32.parse(String(entry.absolute)); + entry.absolute = + aRoot + wc.encode(String(entry.absolute).slice(aRoot.length)); + const { root: pRoot } = path.win32.parse(entry.path); + entry.path = pRoot + wc.encode(entry.path.slice(pRoot.length)); + } + return true; + } + [ONENTRY](entry) { + if (!this[CHECKPATH](entry)) { + return entry.resume(); + } + assert.equal(typeof entry.absolute, 'string'); + switch (entry.type) { + case 'Directory': + case 'GNUDumpDir': + if (entry.mode) { + entry.mode = entry.mode | 0o700; + } + // eslint-disable-next-line no-fallthrough + case 'File': + case 'OldFile': + case 'ContiguousFile': + case 'Link': + case 'SymbolicLink': + return this[CHECKFS](entry); + case 'CharacterDevice': + case 'BlockDevice': + case 'FIFO': + default: + return this[UNSUPPORTED](entry); + } + } + [ONERROR](er, entry) { + // Cwd has to exist, or else nothing works. That's serious. + // Other errors are warnings, which raise the error in strict + // mode, but otherwise continue on. + if (er.name === 'CwdError') { + this.emit('error', er); + } + else { + this.warn('TAR_ENTRY_ERROR', er, { entry }); + this[UNPEND](); + entry.resume(); + } + } + [MKDIR](dir, mode, cb) { + mkdir(normalizeWindowsPath(dir), { + uid: this.uid, + gid: this.gid, + processUid: this.processUid, + processGid: this.processGid, + umask: this.processUmask, + preserve: this.preservePaths, + unlink: this.unlink, + cache: this.dirCache, + cwd: this.cwd, + mode: mode, + }, cb); + } + [DOCHOWN](entry) { + // in preserve owner mode, chown if the entry doesn't match process + // in set owner mode, chown if setting doesn't match process + return (this.forceChown || + (this.preserveOwner && + ((typeof entry.uid === 'number' && + entry.uid !== this.processUid) || + (typeof entry.gid === 'number' && + entry.gid !== this.processGid))) || + (typeof this.uid === 'number' && + this.uid !== this.processUid) || + (typeof this.gid === 'number' && this.gid !== this.processGid)); + } + [UID](entry) { + return uint32(this.uid, entry.uid, this.processUid); + } + [GID](entry) { + return uint32(this.gid, entry.gid, this.processGid); + } + [FILE](entry, fullyDone) { + const mode = typeof entry.mode === 'number' ? + entry.mode & 0o7777 + : this.fmode; + const stream = new fsm.WriteStream(String(entry.absolute), { + // slight lie, but it can be numeric flags + flags: getWriteFlag(entry.size), + mode: mode, + autoClose: false, + }); + stream.on('error', (er) => { + if (stream.fd) { + fs.close(stream.fd, () => { }); + } + // flush all the data out so that we aren't left hanging + // if the error wasn't actually fatal. otherwise the parse + // is blocked, and we never proceed. + stream.write = () => true; + this[ONERROR](er, entry); + fullyDone(); + }); + let actions = 1; + const done = (er) => { + if (er) { + /* c8 ignore start - we should always have a fd by now */ + if (stream.fd) { + fs.close(stream.fd, () => { }); + } + /* c8 ignore stop */ + this[ONERROR](er, entry); + fullyDone(); + return; + } + if (--actions === 0) { + if (stream.fd !== undefined) { + fs.close(stream.fd, er => { + if (er) { + this[ONERROR](er, entry); + } + else { + this[UNPEND](); + } + fullyDone(); + }); + } + } + }; + stream.on('finish', () => { + // if futimes fails, try utimes + // if utimes fails, fail with the original error + // same for fchown/chown + const abs = String(entry.absolute); + const fd = stream.fd; + if (typeof fd === 'number' && entry.mtime && !this.noMtime) { + actions++; + const atime = entry.atime || new Date(); + const mtime = entry.mtime; + fs.futimes(fd, atime, mtime, er => er ? + fs.utimes(abs, atime, mtime, er2 => done(er2 && er)) + : done()); + } + if (typeof fd === 'number' && this[DOCHOWN](entry)) { + actions++; + const uid = this[UID](entry); + const gid = this[GID](entry); + if (typeof uid === 'number' && typeof gid === 'number') { + fs.fchown(fd, uid, gid, er => er ? + fs.chown(abs, uid, gid, er2 => done(er2 && er)) + : done()); + } + } + done(); + }); + const tx = this.transform ? this.transform(entry) || entry : entry; + if (tx !== entry) { + tx.on('error', (er) => { + this[ONERROR](er, entry); + fullyDone(); + }); + entry.pipe(tx); + } + tx.pipe(stream); + } + [DIRECTORY](entry, fullyDone) { + const mode = typeof entry.mode === 'number' ? + entry.mode & 0o7777 + : this.dmode; + this[MKDIR](String(entry.absolute), mode, er => { + if (er) { + this[ONERROR](er, entry); + fullyDone(); + return; + } + let actions = 1; + const done = () => { + if (--actions === 0) { + fullyDone(); + this[UNPEND](); + entry.resume(); + } + }; + if (entry.mtime && !this.noMtime) { + actions++; + fs.utimes(String(entry.absolute), entry.atime || new Date(), entry.mtime, done); + } + if (this[DOCHOWN](entry)) { + actions++; + fs.chown(String(entry.absolute), Number(this[UID](entry)), Number(this[GID](entry)), done); + } + done(); + }); + } + [UNSUPPORTED](entry) { + entry.unsupported = true; + this.warn('TAR_ENTRY_UNSUPPORTED', `unsupported entry type: ${entry.type}`, { entry }); + entry.resume(); + } + [SYMLINK](entry, done) { + this[LINK](entry, String(entry.linkpath), 'symlink', done); + } + [HARDLINK](entry, done) { + const linkpath = normalizeWindowsPath(path.resolve(this.cwd, String(entry.linkpath))); + this[LINK](entry, linkpath, 'link', done); + } + [PEND]() { + this[PENDING]++; + } + [UNPEND]() { + this[PENDING]--; + this[MAYBECLOSE](); + } + [SKIP](entry) { + this[UNPEND](); + entry.resume(); + } + // Check if we can reuse an existing filesystem entry safely and + // overwrite it, rather than unlinking and recreating + // Windows doesn't report a useful nlink, so we just never reuse entries + [ISREUSABLE](entry, st) { + return (entry.type === 'File' && + !this.unlink && + st.isFile() && + st.nlink <= 1 && + !isWindows); + } + // check if a thing is there, and if so, try to clobber it + [CHECKFS](entry) { + this[PEND](); + const paths = [entry.path]; + if (entry.linkpath) { + paths.push(entry.linkpath); + } + this.reservations.reserve(paths, done => this[CHECKFS2](entry, done)); + } + [PRUNECACHE](entry) { + // if we are not creating a directory, and the path is in the dirCache, + // then that means we are about to delete the directory we created + // previously, and it is no longer going to be a directory, and neither + // is any of its children. + // If a symbolic link is encountered, all bets are off. There is no + // reasonable way to sanitize the cache in such a way we will be able to + // avoid having filesystem collisions. If this happens with a non-symlink + // entry, it'll just fail to unpack, but a symlink to a directory, using an + // 8.3 shortname or certain unicode attacks, can evade detection and lead + // to arbitrary writes to anywhere on the system. + if (entry.type === 'SymbolicLink') { + dropCache(this.dirCache); + } + else if (entry.type !== 'Directory') { + pruneCache(this.dirCache, String(entry.absolute)); + } + } + [CHECKFS2](entry, fullyDone) { + this[PRUNECACHE](entry); + const done = (er) => { + this[PRUNECACHE](entry); + fullyDone(er); + }; + const checkCwd = () => { + this[MKDIR](this.cwd, this.dmode, er => { + if (er) { + this[ONERROR](er, entry); + done(); + return; + } + this[CHECKED_CWD] = true; + start(); + }); + }; + const start = () => { + if (entry.absolute !== this.cwd) { + const parent = normalizeWindowsPath(path.dirname(String(entry.absolute))); + if (parent !== this.cwd) { + return this[MKDIR](parent, this.dmode, er => { + if (er) { + this[ONERROR](er, entry); + done(); + return; + } + afterMakeParent(); + }); + } + } + afterMakeParent(); + }; + const afterMakeParent = () => { + fs.lstat(String(entry.absolute), (lstatEr, st) => { + if (st && + (this.keep || + /* c8 ignore next */ + (this.newer && st.mtime > (entry.mtime ?? st.mtime)))) { + this[SKIP](entry); + done(); + return; + } + if (lstatEr || this[ISREUSABLE](entry, st)) { + return this[MAKEFS](null, entry, done); + } + if (st.isDirectory()) { + if (entry.type === 'Directory') { + const needChmod = this.chmod && + entry.mode && + (st.mode & 0o7777) !== entry.mode; + const afterChmod = (er) => this[MAKEFS](er ?? null, entry, done); + if (!needChmod) { + return afterChmod(); + } + return fs.chmod(String(entry.absolute), Number(entry.mode), afterChmod); + } + // Not a dir entry, have to remove it. + // NB: the only way to end up with an entry that is the cwd + // itself, in such a way that == does not detect, is a + // tricky windows absolute path with UNC or 8.3 parts (and + // preservePaths:true, or else it will have been stripped). + // In that case, the user has opted out of path protections + // explicitly, so if they blow away the cwd, c'est la vie. + if (entry.absolute !== this.cwd) { + return fs.rmdir(String(entry.absolute), (er) => this[MAKEFS](er ?? null, entry, done)); + } + } + // not a dir, and not reusable + // don't remove if the cwd, we want that error + if (entry.absolute === this.cwd) { + return this[MAKEFS](null, entry, done); + } + unlinkFile(String(entry.absolute), er => this[MAKEFS](er ?? null, entry, done)); + }); + }; + if (this[CHECKED_CWD]) { + start(); + } + else { + checkCwd(); + } + } + [MAKEFS](er, entry, done) { + if (er) { + this[ONERROR](er, entry); + done(); + return; + } + switch (entry.type) { + case 'File': + case 'OldFile': + case 'ContiguousFile': + return this[FILE](entry, done); + case 'Link': + return this[HARDLINK](entry, done); + case 'SymbolicLink': + return this[SYMLINK](entry, done); + case 'Directory': + case 'GNUDumpDir': + return this[DIRECTORY](entry, done); + } + } + [LINK](entry, linkpath, link, done) { + // XXX: get the type ('symlink' or 'junction') for windows + fs[link](linkpath, String(entry.absolute), er => { + if (er) { + this[ONERROR](er, entry); + } + else { + this[UNPEND](); + entry.resume(); + } + done(); + }); + } +} +const callSync = (fn) => { + try { + return [null, fn()]; + } + catch (er) { + return [er, null]; + } +}; +export class UnpackSync extends Unpack { + sync = true; + [MAKEFS](er, entry) { + return super[MAKEFS](er, entry, () => { }); + } + [CHECKFS](entry) { + this[PRUNECACHE](entry); + if (!this[CHECKED_CWD]) { + const er = this[MKDIR](this.cwd, this.dmode); + if (er) { + return this[ONERROR](er, entry); + } + this[CHECKED_CWD] = true; + } + // don't bother to make the parent if the current entry is the cwd, + // we've already checked it. + if (entry.absolute !== this.cwd) { + const parent = normalizeWindowsPath(path.dirname(String(entry.absolute))); + if (parent !== this.cwd) { + const mkParent = this[MKDIR](parent, this.dmode); + if (mkParent) { + return this[ONERROR](mkParent, entry); + } + } + } + const [lstatEr, st] = callSync(() => fs.lstatSync(String(entry.absolute))); + if (st && + (this.keep || + /* c8 ignore next */ + (this.newer && st.mtime > (entry.mtime ?? st.mtime)))) { + return this[SKIP](entry); + } + if (lstatEr || this[ISREUSABLE](entry, st)) { + return this[MAKEFS](null, entry); + } + if (st.isDirectory()) { + if (entry.type === 'Directory') { + const needChmod = this.chmod && + entry.mode && + (st.mode & 0o7777) !== entry.mode; + const [er] = needChmod ? + callSync(() => { + fs.chmodSync(String(entry.absolute), Number(entry.mode)); + }) + : []; + return this[MAKEFS](er, entry); + } + // not a dir entry, have to remove it + const [er] = callSync(() => fs.rmdirSync(String(entry.absolute))); + this[MAKEFS](er, entry); + } + // not a dir, and not reusable. + // don't remove if it's the cwd, since we want that error. + const [er] = entry.absolute === this.cwd ? + [] + : callSync(() => unlinkFileSync(String(entry.absolute))); + this[MAKEFS](er, entry); + } + [FILE](entry, done) { + const mode = typeof entry.mode === 'number' ? + entry.mode & 0o7777 + : this.fmode; + const oner = (er) => { + let closeError; + try { + fs.closeSync(fd); + } + catch (e) { + closeError = e; + } + if (er || closeError) { + this[ONERROR](er || closeError, entry); + } + done(); + }; + let fd; + try { + fd = fs.openSync(String(entry.absolute), getWriteFlag(entry.size), mode); + } + catch (er) { + return oner(er); + } + const tx = this.transform ? this.transform(entry) || entry : entry; + if (tx !== entry) { + tx.on('error', (er) => this[ONERROR](er, entry)); + entry.pipe(tx); + } + tx.on('data', (chunk) => { + try { + fs.writeSync(fd, chunk, 0, chunk.length); + } + catch (er) { + oner(er); + } + }); + tx.on('end', () => { + let er = null; + // try both, falling futimes back to utimes + // if either fails, handle the first error + if (entry.mtime && !this.noMtime) { + const atime = entry.atime || new Date(); + const mtime = entry.mtime; + try { + fs.futimesSync(fd, atime, mtime); + } + catch (futimeser) { + try { + fs.utimesSync(String(entry.absolute), atime, mtime); + } + catch (utimeser) { + er = futimeser; + } + } + } + if (this[DOCHOWN](entry)) { + const uid = this[UID](entry); + const gid = this[GID](entry); + try { + fs.fchownSync(fd, Number(uid), Number(gid)); + } + catch (fchowner) { + try { + fs.chownSync(String(entry.absolute), Number(uid), Number(gid)); + } + catch (chowner) { + er = er || fchowner; + } + } + } + oner(er); + }); + } + [DIRECTORY](entry, done) { + const mode = typeof entry.mode === 'number' ? + entry.mode & 0o7777 + : this.dmode; + const er = this[MKDIR](String(entry.absolute), mode); + if (er) { + this[ONERROR](er, entry); + done(); + return; + } + if (entry.mtime && !this.noMtime) { + try { + fs.utimesSync(String(entry.absolute), entry.atime || new Date(), entry.mtime); + /* c8 ignore next */ + } + catch (er) { } + } + if (this[DOCHOWN](entry)) { + try { + fs.chownSync(String(entry.absolute), Number(this[UID](entry)), Number(this[GID](entry))); + } + catch (er) { } + } + done(); + entry.resume(); + } + [MKDIR](dir, mode) { + try { + return mkdirSync(normalizeWindowsPath(dir), { + uid: this.uid, + gid: this.gid, + processUid: this.processUid, + processGid: this.processGid, + umask: this.processUmask, + preserve: this.preservePaths, + unlink: this.unlink, + cache: this.dirCache, + cwd: this.cwd, + mode: mode, + }); + } + catch (er) { + return er; + } + } + [LINK](entry, linkpath, link, done) { + const ls = `${link}Sync`; + try { + fs[ls](linkpath, String(entry.absolute)); + done(); + entry.resume(); + } + catch (er) { + return this[ONERROR](er, entry); + } + } +} +//# sourceMappingURL=unpack.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/update.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/update.js new file mode 100644 index 00000000000000..21398e9766663d --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/update.js @@ -0,0 +1,30 @@ +// tar -u +import { makeCommand } from './make-command.js'; +import { replace as r } from './replace.js'; +// just call tar.r with the filter and mtimeCache +export const update = makeCommand(r.syncFile, r.asyncFile, r.syncNoFile, r.asyncNoFile, (opt, entries = []) => { + r.validate?.(opt, entries); + mtimeFilter(opt); +}); +const mtimeFilter = (opt) => { + const filter = opt.filter; + if (!opt.mtimeCache) { + opt.mtimeCache = new Map(); + } + opt.filter = + filter ? + (path, stat) => filter(path, stat) && + !( + /* c8 ignore start */ + ((opt.mtimeCache?.get(path) ?? stat.mtime ?? 0) > + (stat.mtime ?? 0)) + /* c8 ignore stop */ + ) + : (path, stat) => !( + /* c8 ignore start */ + ((opt.mtimeCache?.get(path) ?? stat.mtime ?? 0) > + (stat.mtime ?? 0)) + /* c8 ignore stop */ + ); +}; +//# sourceMappingURL=update.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/warn-method.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/warn-method.js new file mode 100644 index 00000000000000..13e798afefc85e --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/warn-method.js @@ -0,0 +1,27 @@ +export const warnMethod = (self, code, message, data = {}) => { + if (self.file) { + data.file = self.file; + } + if (self.cwd) { + data.cwd = self.cwd; + } + data.code = + (message instanceof Error && + message.code) || + code; + data.tarCode = code; + if (!self.strict && data.recoverable !== false) { + if (message instanceof Error) { + data = Object.assign(message, data); + message = message.message; + } + self.emit('warn', code, message, data); + } + else if (message instanceof Error) { + self.emit('error', Object.assign(message, data)); + } + else { + self.emit('error', Object.assign(new Error(`${code}: ${message}`), data)); + } +}; +//# sourceMappingURL=warn-method.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/winchars.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/winchars.js new file mode 100644 index 00000000000000..c41eb86d69a4bb --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/winchars.js @@ -0,0 +1,9 @@ +// When writing files on Windows, translate the characters to their +// 0xf000 higher-encoded versions. +const raw = ['|', '<', '>', '?', ':']; +const win = raw.map(char => String.fromCharCode(0xf000 + char.charCodeAt(0))); +const toWin = new Map(raw.map((char, i) => [char, win[i]])); +const toRaw = new Map(win.map((char, i) => [char, raw[i]])); +export const encode = (s) => raw.reduce((s, c) => s.split(c).join(toWin.get(c)), s); +export const decode = (s) => win.reduce((s, c) => s.split(c).join(toRaw.get(c)), s); +//# sourceMappingURL=winchars.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/write-entry.js b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/write-entry.js new file mode 100644 index 00000000000000..9028cd676b4cd2 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/dist/esm/write-entry.js @@ -0,0 +1,657 @@ +import fs from 'fs'; +import { Minipass } from 'minipass'; +import path from 'path'; +import { Header } from './header.js'; +import { modeFix } from './mode-fix.js'; +import { normalizeWindowsPath } from './normalize-windows-path.js'; +import { dealias, } from './options.js'; +import { Pax } from './pax.js'; +import { stripAbsolutePath } from './strip-absolute-path.js'; +import { stripTrailingSlashes } from './strip-trailing-slashes.js'; +import { warnMethod, } from './warn-method.js'; +import * as winchars from './winchars.js'; +const prefixPath = (path, prefix) => { + if (!prefix) { + return normalizeWindowsPath(path); + } + path = normalizeWindowsPath(path).replace(/^\.(\/|$)/, ''); + return stripTrailingSlashes(prefix) + '/' + path; +}; +const maxReadSize = 16 * 1024 * 1024; +const PROCESS = Symbol('process'); +const FILE = Symbol('file'); +const DIRECTORY = Symbol('directory'); +const SYMLINK = Symbol('symlink'); +const HARDLINK = Symbol('hardlink'); +const HEADER = Symbol('header'); +const READ = Symbol('read'); +const LSTAT = Symbol('lstat'); +const ONLSTAT = Symbol('onlstat'); +const ONREAD = Symbol('onread'); +const ONREADLINK = Symbol('onreadlink'); +const OPENFILE = Symbol('openfile'); +const ONOPENFILE = Symbol('onopenfile'); +const CLOSE = Symbol('close'); +const MODE = Symbol('mode'); +const AWAITDRAIN = Symbol('awaitDrain'); +const ONDRAIN = Symbol('ondrain'); +const PREFIX = Symbol('prefix'); +export class WriteEntry extends Minipass { + path; + portable; + myuid = (process.getuid && process.getuid()) || 0; + // until node has builtin pwnam functions, this'll have to do + myuser = process.env.USER || ''; + maxReadSize; + linkCache; + statCache; + preservePaths; + cwd; + strict; + mtime; + noPax; + noMtime; + prefix; + fd; + blockLen = 0; + blockRemain = 0; + buf; + pos = 0; + remain = 0; + length = 0; + offset = 0; + win32; + absolute; + header; + type; + linkpath; + stat; + onWriteEntry; + #hadError = false; + constructor(p, opt_ = {}) { + const opt = dealias(opt_); + super(); + this.path = normalizeWindowsPath(p); + // suppress atime, ctime, uid, gid, uname, gname + this.portable = !!opt.portable; + this.maxReadSize = opt.maxReadSize || maxReadSize; + this.linkCache = opt.linkCache || new Map(); + this.statCache = opt.statCache || new Map(); + this.preservePaths = !!opt.preservePaths; + this.cwd = normalizeWindowsPath(opt.cwd || process.cwd()); + this.strict = !!opt.strict; + this.noPax = !!opt.noPax; + this.noMtime = !!opt.noMtime; + this.mtime = opt.mtime; + this.prefix = + opt.prefix ? normalizeWindowsPath(opt.prefix) : undefined; + this.onWriteEntry = opt.onWriteEntry; + if (typeof opt.onwarn === 'function') { + this.on('warn', opt.onwarn); + } + let pathWarn = false; + if (!this.preservePaths) { + const [root, stripped] = stripAbsolutePath(this.path); + if (root && typeof stripped === 'string') { + this.path = stripped; + pathWarn = root; + } + } + this.win32 = !!opt.win32 || process.platform === 'win32'; + if (this.win32) { + // force the \ to / normalization, since we might not *actually* + // be on windows, but want \ to be considered a path separator. + this.path = winchars.decode(this.path.replace(/\\/g, '/')); + p = p.replace(/\\/g, '/'); + } + this.absolute = normalizeWindowsPath(opt.absolute || path.resolve(this.cwd, p)); + if (this.path === '') { + this.path = './'; + } + if (pathWarn) { + this.warn('TAR_ENTRY_INFO', `stripping ${pathWarn} from absolute path`, { + entry: this, + path: pathWarn + this.path, + }); + } + const cs = this.statCache.get(this.absolute); + if (cs) { + this[ONLSTAT](cs); + } + else { + this[LSTAT](); + } + } + warn(code, message, data = {}) { + return warnMethod(this, code, message, data); + } + emit(ev, ...data) { + if (ev === 'error') { + this.#hadError = true; + } + return super.emit(ev, ...data); + } + [LSTAT]() { + fs.lstat(this.absolute, (er, stat) => { + if (er) { + return this.emit('error', er); + } + this[ONLSTAT](stat); + }); + } + [ONLSTAT](stat) { + this.statCache.set(this.absolute, stat); + this.stat = stat; + if (!stat.isFile()) { + stat.size = 0; + } + this.type = getType(stat); + this.emit('stat', stat); + this[PROCESS](); + } + [PROCESS]() { + switch (this.type) { + case 'File': + return this[FILE](); + case 'Directory': + return this[DIRECTORY](); + case 'SymbolicLink': + return this[SYMLINK](); + // unsupported types are ignored. + default: + return this.end(); + } + } + [MODE](mode) { + return modeFix(mode, this.type === 'Directory', this.portable); + } + [PREFIX](path) { + return prefixPath(path, this.prefix); + } + [HEADER]() { + /* c8 ignore start */ + if (!this.stat) { + throw new Error('cannot write header before stat'); + } + /* c8 ignore stop */ + if (this.type === 'Directory' && this.portable) { + this.noMtime = true; + } + this.onWriteEntry?.(this); + this.header = new Header({ + path: this[PREFIX](this.path), + // only apply the prefix to hard links. + linkpath: this.type === 'Link' && this.linkpath !== undefined ? + this[PREFIX](this.linkpath) + : this.linkpath, + // only the permissions and setuid/setgid/sticky bitflags + // not the higher-order bits that specify file type + mode: this[MODE](this.stat.mode), + uid: this.portable ? undefined : this.stat.uid, + gid: this.portable ? undefined : this.stat.gid, + size: this.stat.size, + mtime: this.noMtime ? undefined : this.mtime || this.stat.mtime, + /* c8 ignore next */ + type: this.type === 'Unsupported' ? undefined : this.type, + uname: this.portable ? undefined + : this.stat.uid === this.myuid ? this.myuser + : '', + atime: this.portable ? undefined : this.stat.atime, + ctime: this.portable ? undefined : this.stat.ctime, + }); + if (this.header.encode() && !this.noPax) { + super.write(new Pax({ + atime: this.portable ? undefined : this.header.atime, + ctime: this.portable ? undefined : this.header.ctime, + gid: this.portable ? undefined : this.header.gid, + mtime: this.noMtime ? undefined : (this.mtime || this.header.mtime), + path: this[PREFIX](this.path), + linkpath: this.type === 'Link' && this.linkpath !== undefined ? + this[PREFIX](this.linkpath) + : this.linkpath, + size: this.header.size, + uid: this.portable ? undefined : this.header.uid, + uname: this.portable ? undefined : this.header.uname, + dev: this.portable ? undefined : this.stat.dev, + ino: this.portable ? undefined : this.stat.ino, + nlink: this.portable ? undefined : this.stat.nlink, + }).encode()); + } + const block = this.header?.block; + /* c8 ignore start */ + if (!block) { + throw new Error('failed to encode header'); + } + /* c8 ignore stop */ + super.write(block); + } + [DIRECTORY]() { + /* c8 ignore start */ + if (!this.stat) { + throw new Error('cannot create directory entry without stat'); + } + /* c8 ignore stop */ + if (this.path.slice(-1) !== '/') { + this.path += '/'; + } + this.stat.size = 0; + this[HEADER](); + this.end(); + } + [SYMLINK]() { + fs.readlink(this.absolute, (er, linkpath) => { + if (er) { + return this.emit('error', er); + } + this[ONREADLINK](linkpath); + }); + } + [ONREADLINK](linkpath) { + this.linkpath = normalizeWindowsPath(linkpath); + this[HEADER](); + this.end(); + } + [HARDLINK](linkpath) { + /* c8 ignore start */ + if (!this.stat) { + throw new Error('cannot create link entry without stat'); + } + /* c8 ignore stop */ + this.type = 'Link'; + this.linkpath = normalizeWindowsPath(path.relative(this.cwd, linkpath)); + this.stat.size = 0; + this[HEADER](); + this.end(); + } + [FILE]() { + /* c8 ignore start */ + if (!this.stat) { + throw new Error('cannot create file entry without stat'); + } + /* c8 ignore stop */ + if (this.stat.nlink > 1) { + const linkKey = `${this.stat.dev}:${this.stat.ino}`; + const linkpath = this.linkCache.get(linkKey); + if (linkpath?.indexOf(this.cwd) === 0) { + return this[HARDLINK](linkpath); + } + this.linkCache.set(linkKey, this.absolute); + } + this[HEADER](); + if (this.stat.size === 0) { + return this.end(); + } + this[OPENFILE](); + } + [OPENFILE]() { + fs.open(this.absolute, 'r', (er, fd) => { + if (er) { + return this.emit('error', er); + } + this[ONOPENFILE](fd); + }); + } + [ONOPENFILE](fd) { + this.fd = fd; + if (this.#hadError) { + return this[CLOSE](); + } + /* c8 ignore start */ + if (!this.stat) { + throw new Error('should stat before calling onopenfile'); + } + /* c8 ignore start */ + this.blockLen = 512 * Math.ceil(this.stat.size / 512); + this.blockRemain = this.blockLen; + const bufLen = Math.min(this.blockLen, this.maxReadSize); + this.buf = Buffer.allocUnsafe(bufLen); + this.offset = 0; + this.pos = 0; + this.remain = this.stat.size; + this.length = this.buf.length; + this[READ](); + } + [READ]() { + const { fd, buf, offset, length, pos } = this; + if (fd === undefined || buf === undefined) { + throw new Error('cannot read file without first opening'); + } + fs.read(fd, buf, offset, length, pos, (er, bytesRead) => { + if (er) { + // ignoring the error from close(2) is a bad practice, but at + // this point we already have an error, don't need another one + return this[CLOSE](() => this.emit('error', er)); + } + this[ONREAD](bytesRead); + }); + } + /* c8 ignore start */ + [CLOSE](cb = () => { }) { + /* c8 ignore stop */ + if (this.fd !== undefined) + fs.close(this.fd, cb); + } + [ONREAD](bytesRead) { + if (bytesRead <= 0 && this.remain > 0) { + const er = Object.assign(new Error('encountered unexpected EOF'), { + path: this.absolute, + syscall: 'read', + code: 'EOF', + }); + return this[CLOSE](() => this.emit('error', er)); + } + if (bytesRead > this.remain) { + const er = Object.assign(new Error('did not encounter expected EOF'), { + path: this.absolute, + syscall: 'read', + code: 'EOF', + }); + return this[CLOSE](() => this.emit('error', er)); + } + /* c8 ignore start */ + if (!this.buf) { + throw new Error('should have created buffer prior to reading'); + } + /* c8 ignore stop */ + // null out the rest of the buffer, if we could fit the block padding + // at the end of this loop, we've incremented bytesRead and this.remain + // to be incremented up to the blockRemain level, as if we had expected + // to get a null-padded file, and read it until the end. then we will + // decrement both remain and blockRemain by bytesRead, and know that we + // reached the expected EOF, without any null buffer to append. + if (bytesRead === this.remain) { + for (let i = bytesRead; i < this.length && bytesRead < this.blockRemain; i++) { + this.buf[i + this.offset] = 0; + bytesRead++; + this.remain++; + } + } + const chunk = this.offset === 0 && bytesRead === this.buf.length ? + this.buf + : this.buf.subarray(this.offset, this.offset + bytesRead); + const flushed = this.write(chunk); + if (!flushed) { + this[AWAITDRAIN](() => this[ONDRAIN]()); + } + else { + this[ONDRAIN](); + } + } + [AWAITDRAIN](cb) { + this.once('drain', cb); + } + write(chunk, encoding, cb) { + /* c8 ignore start - just junk to comply with NodeJS.WritableStream */ + if (typeof encoding === 'function') { + cb = encoding; + encoding = undefined; + } + if (typeof chunk === 'string') { + chunk = Buffer.from(chunk, typeof encoding === 'string' ? encoding : 'utf8'); + } + /* c8 ignore stop */ + if (this.blockRemain < chunk.length) { + const er = Object.assign(new Error('writing more data than expected'), { + path: this.absolute, + }); + return this.emit('error', er); + } + this.remain -= chunk.length; + this.blockRemain -= chunk.length; + this.pos += chunk.length; + this.offset += chunk.length; + return super.write(chunk, null, cb); + } + [ONDRAIN]() { + if (!this.remain) { + if (this.blockRemain) { + super.write(Buffer.alloc(this.blockRemain)); + } + return this[CLOSE](er => er ? this.emit('error', er) : this.end()); + } + /* c8 ignore start */ + if (!this.buf) { + throw new Error('buffer lost somehow in ONDRAIN'); + } + /* c8 ignore stop */ + if (this.offset >= this.length) { + // if we only have a smaller bit left to read, alloc a smaller buffer + // otherwise, keep it the same length it was before. + this.buf = Buffer.allocUnsafe(Math.min(this.blockRemain, this.buf.length)); + this.offset = 0; + } + this.length = this.buf.length - this.offset; + this[READ](); + } +} +export class WriteEntrySync extends WriteEntry { + sync = true; + [LSTAT]() { + this[ONLSTAT](fs.lstatSync(this.absolute)); + } + [SYMLINK]() { + this[ONREADLINK](fs.readlinkSync(this.absolute)); + } + [OPENFILE]() { + this[ONOPENFILE](fs.openSync(this.absolute, 'r')); + } + [READ]() { + let threw = true; + try { + const { fd, buf, offset, length, pos } = this; + /* c8 ignore start */ + if (fd === undefined || buf === undefined) { + throw new Error('fd and buf must be set in READ method'); + } + /* c8 ignore stop */ + const bytesRead = fs.readSync(fd, buf, offset, length, pos); + this[ONREAD](bytesRead); + threw = false; + } + finally { + // ignoring the error from close(2) is a bad practice, but at + // this point we already have an error, don't need another one + if (threw) { + try { + this[CLOSE](() => { }); + } + catch (er) { } + } + } + } + [AWAITDRAIN](cb) { + cb(); + } + /* c8 ignore start */ + [CLOSE](cb = () => { }) { + /* c8 ignore stop */ + if (this.fd !== undefined) + fs.closeSync(this.fd); + cb(); + } +} +export class WriteEntryTar extends Minipass { + blockLen = 0; + blockRemain = 0; + buf = 0; + pos = 0; + remain = 0; + length = 0; + preservePaths; + portable; + strict; + noPax; + noMtime; + readEntry; + type; + prefix; + path; + mode; + uid; + gid; + uname; + gname; + header; + mtime; + atime; + ctime; + linkpath; + size; + onWriteEntry; + warn(code, message, data = {}) { + return warnMethod(this, code, message, data); + } + constructor(readEntry, opt_ = {}) { + const opt = dealias(opt_); + super(); + this.preservePaths = !!opt.preservePaths; + this.portable = !!opt.portable; + this.strict = !!opt.strict; + this.noPax = !!opt.noPax; + this.noMtime = !!opt.noMtime; + this.onWriteEntry = opt.onWriteEntry; + this.readEntry = readEntry; + const { type } = readEntry; + /* c8 ignore start */ + if (type === 'Unsupported') { + throw new Error('writing entry that should be ignored'); + } + /* c8 ignore stop */ + this.type = type; + if (this.type === 'Directory' && this.portable) { + this.noMtime = true; + } + this.prefix = opt.prefix; + this.path = normalizeWindowsPath(readEntry.path); + this.mode = + readEntry.mode !== undefined ? + this[MODE](readEntry.mode) + : undefined; + this.uid = this.portable ? undefined : readEntry.uid; + this.gid = this.portable ? undefined : readEntry.gid; + this.uname = this.portable ? undefined : readEntry.uname; + this.gname = this.portable ? undefined : readEntry.gname; + this.size = readEntry.size; + this.mtime = + this.noMtime ? undefined : opt.mtime || readEntry.mtime; + this.atime = this.portable ? undefined : readEntry.atime; + this.ctime = this.portable ? undefined : readEntry.ctime; + this.linkpath = + readEntry.linkpath !== undefined ? + normalizeWindowsPath(readEntry.linkpath) + : undefined; + if (typeof opt.onwarn === 'function') { + this.on('warn', opt.onwarn); + } + let pathWarn = false; + if (!this.preservePaths) { + const [root, stripped] = stripAbsolutePath(this.path); + if (root && typeof stripped === 'string') { + this.path = stripped; + pathWarn = root; + } + } + this.remain = readEntry.size; + this.blockRemain = readEntry.startBlockSize; + this.onWriteEntry?.(this); + this.header = new Header({ + path: this[PREFIX](this.path), + linkpath: this.type === 'Link' && this.linkpath !== undefined ? + this[PREFIX](this.linkpath) + : this.linkpath, + // only the permissions and setuid/setgid/sticky bitflags + // not the higher-order bits that specify file type + mode: this.mode, + uid: this.portable ? undefined : this.uid, + gid: this.portable ? undefined : this.gid, + size: this.size, + mtime: this.noMtime ? undefined : this.mtime, + type: this.type, + uname: this.portable ? undefined : this.uname, + atime: this.portable ? undefined : this.atime, + ctime: this.portable ? undefined : this.ctime, + }); + if (pathWarn) { + this.warn('TAR_ENTRY_INFO', `stripping ${pathWarn} from absolute path`, { + entry: this, + path: pathWarn + this.path, + }); + } + if (this.header.encode() && !this.noPax) { + super.write(new Pax({ + atime: this.portable ? undefined : this.atime, + ctime: this.portable ? undefined : this.ctime, + gid: this.portable ? undefined : this.gid, + mtime: this.noMtime ? undefined : this.mtime, + path: this[PREFIX](this.path), + linkpath: this.type === 'Link' && this.linkpath !== undefined ? + this[PREFIX](this.linkpath) + : this.linkpath, + size: this.size, + uid: this.portable ? undefined : this.uid, + uname: this.portable ? undefined : this.uname, + dev: this.portable ? undefined : this.readEntry.dev, + ino: this.portable ? undefined : this.readEntry.ino, + nlink: this.portable ? undefined : this.readEntry.nlink, + }).encode()); + } + const b = this.header?.block; + /* c8 ignore start */ + if (!b) + throw new Error('failed to encode header'); + /* c8 ignore stop */ + super.write(b); + readEntry.pipe(this); + } + [PREFIX](path) { + return prefixPath(path, this.prefix); + } + [MODE](mode) { + return modeFix(mode, this.type === 'Directory', this.portable); + } + write(chunk, encoding, cb) { + /* c8 ignore start - just junk to comply with NodeJS.WritableStream */ + if (typeof encoding === 'function') { + cb = encoding; + encoding = undefined; + } + if (typeof chunk === 'string') { + chunk = Buffer.from(chunk, typeof encoding === 'string' ? encoding : 'utf8'); + } + /* c8 ignore stop */ + const writeLen = chunk.length; + if (writeLen > this.blockRemain) { + throw new Error('writing more to entry than is appropriate'); + } + this.blockRemain -= writeLen; + return super.write(chunk, cb); + } + end(chunk, encoding, cb) { + if (this.blockRemain) { + super.write(Buffer.alloc(this.blockRemain)); + } + /* c8 ignore start - just junk to comply with NodeJS.WritableStream */ + if (typeof chunk === 'function') { + cb = chunk; + encoding = undefined; + chunk = undefined; + } + if (typeof encoding === 'function') { + cb = encoding; + encoding = undefined; + } + if (typeof chunk === 'string') { + chunk = Buffer.from(chunk, encoding ?? 'utf8'); + } + if (cb) + this.once('finish', cb); + chunk ? super.end(chunk, cb) : super.end(cb); + /* c8 ignore stop */ + return this; + } +} +const getType = (stat) => stat.isFile() ? 'File' + : stat.isDirectory() ? 'Directory' + : stat.isSymbolicLink() ? 'SymbolicLink' + : 'Unsupported'; +//# sourceMappingURL=write-entry.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/tar/package.json b/deps/npm/node_modules/node-gyp/node_modules/tar/package.json new file mode 100644 index 00000000000000..0283103ee9eaf9 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/tar/package.json @@ -0,0 +1,325 @@ +{ + "author": "Isaac Z. Schlueter", + "name": "tar", + "description": "tar for node", + "version": "7.4.3", + "repository": { + "type": "git", + "url": "https://github.com/isaacs/node-tar.git" + }, + "scripts": { + "genparse": "node scripts/generate-parse-fixtures.js", + "snap": "tap", + "test": "tap", + "pretest": "npm run prepare", + "presnap": "npm run prepare", + "prepare": "tshy", + "preversion": "npm test", + "postversion": "npm publish", + "prepublishOnly": "git push origin --follow-tags", + "format": "prettier --write . --log-level warn", + "typedoc": "typedoc --tsconfig .tshy/esm.json ./src/*.ts" + }, + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, + "devDependencies": { + "chmodr": "^1.2.0", + "end-of-stream": "^1.4.3", + "events-to-array": "^2.0.3", + "mutate-fs": "^2.1.1", + "nock": "^13.5.4", + "prettier": "^3.2.5", + "rimraf": "^5.0.5", + "tap": "^18.7.2", + "tshy": "^1.13.1", + "typedoc": "^0.25.13" + }, + "license": "ISC", + "engines": { + "node": ">=18" + }, + "files": [ + "dist" + ], + "tap": { + "coverage-map": "map.js", + "timeout": 0, + "typecheck": true + }, + "prettier": { + "experimentalTernaries": true, + "semi": false, + "printWidth": 70, + "tabWidth": 2, + "useTabs": false, + "singleQuote": true, + "jsxSingleQuote": false, + "bracketSameLine": true, + "arrowParens": "avoid", + "endOfLine": "lf" + }, + "tshy": { + "exports": { + "./package.json": "./package.json", + ".": "./src/index.ts", + "./c": "./src/create.ts", + "./create": "./src/create.ts", + "./replace": "./src/create.ts", + "./r": "./src/create.ts", + "./list": "./src/list.ts", + "./t": "./src/list.ts", + "./update": "./src/update.ts", + "./u": "./src/update.ts", + "./extract": "./src/extract.ts", + "./x": "./src/extract.ts", + "./pack": "./src/pack.ts", + "./unpack": "./src/unpack.ts", + "./parse": "./src/parse.ts", + "./read-entry": "./src/read-entry.ts", + "./write-entry": "./src/write-entry.ts", + "./header": "./src/header.ts", + "./pax": "./src/pax.ts", + "./types": "./src/types.ts" + } + }, + "exports": { + "./package.json": "./package.json", + ".": { + "import": { + "source": "./src/index.ts", + "types": "./dist/esm/index.d.ts", + "default": "./dist/esm/index.js" + }, + "require": { + "source": "./src/index.ts", + "types": "./dist/commonjs/index.d.ts", + "default": "./dist/commonjs/index.js" + } + }, + "./c": { + "import": { + "source": "./src/create.ts", + "types": "./dist/esm/create.d.ts", + "default": "./dist/esm/create.js" + }, + "require": { + "source": "./src/create.ts", + "types": "./dist/commonjs/create.d.ts", + "default": "./dist/commonjs/create.js" + } + }, + "./create": { + "import": { + "source": "./src/create.ts", + "types": "./dist/esm/create.d.ts", + "default": "./dist/esm/create.js" + }, + "require": { + "source": "./src/create.ts", + "types": "./dist/commonjs/create.d.ts", + "default": "./dist/commonjs/create.js" + } + }, + "./replace": { + "import": { + "source": "./src/create.ts", + "types": "./dist/esm/create.d.ts", + "default": "./dist/esm/create.js" + }, + "require": { + "source": "./src/create.ts", + "types": "./dist/commonjs/create.d.ts", + "default": "./dist/commonjs/create.js" + } + }, + "./r": { + "import": { + "source": "./src/create.ts", + "types": "./dist/esm/create.d.ts", + "default": "./dist/esm/create.js" + }, + "require": { + "source": "./src/create.ts", + "types": "./dist/commonjs/create.d.ts", + "default": "./dist/commonjs/create.js" + } + }, + "./list": { + "import": { + "source": "./src/list.ts", + "types": "./dist/esm/list.d.ts", + "default": "./dist/esm/list.js" + }, + "require": { + "source": "./src/list.ts", + "types": "./dist/commonjs/list.d.ts", + "default": "./dist/commonjs/list.js" + } + }, + "./t": { + "import": { + "source": "./src/list.ts", + "types": "./dist/esm/list.d.ts", + "default": "./dist/esm/list.js" + }, + "require": { + "source": "./src/list.ts", + "types": "./dist/commonjs/list.d.ts", + "default": "./dist/commonjs/list.js" + } + }, + "./update": { + "import": { + "source": "./src/update.ts", + "types": "./dist/esm/update.d.ts", + "default": "./dist/esm/update.js" + }, + "require": { + "source": "./src/update.ts", + "types": "./dist/commonjs/update.d.ts", + "default": "./dist/commonjs/update.js" + } + }, + "./u": { + "import": { + "source": "./src/update.ts", + "types": "./dist/esm/update.d.ts", + "default": "./dist/esm/update.js" + }, + "require": { + "source": "./src/update.ts", + "types": "./dist/commonjs/update.d.ts", + "default": "./dist/commonjs/update.js" + } + }, + "./extract": { + "import": { + "source": "./src/extract.ts", + "types": "./dist/esm/extract.d.ts", + "default": "./dist/esm/extract.js" + }, + "require": { + "source": "./src/extract.ts", + "types": "./dist/commonjs/extract.d.ts", + "default": "./dist/commonjs/extract.js" + } + }, + "./x": { + "import": { + "source": "./src/extract.ts", + "types": "./dist/esm/extract.d.ts", + "default": "./dist/esm/extract.js" + }, + "require": { + "source": "./src/extract.ts", + "types": "./dist/commonjs/extract.d.ts", + "default": "./dist/commonjs/extract.js" + } + }, + "./pack": { + "import": { + "source": "./src/pack.ts", + "types": "./dist/esm/pack.d.ts", + "default": "./dist/esm/pack.js" + }, + "require": { + "source": "./src/pack.ts", + "types": "./dist/commonjs/pack.d.ts", + "default": "./dist/commonjs/pack.js" + } + }, + "./unpack": { + "import": { + "source": "./src/unpack.ts", + "types": "./dist/esm/unpack.d.ts", + "default": "./dist/esm/unpack.js" + }, + "require": { + "source": "./src/unpack.ts", + "types": "./dist/commonjs/unpack.d.ts", + "default": "./dist/commonjs/unpack.js" + } + }, + "./parse": { + "import": { + "source": "./src/parse.ts", + "types": "./dist/esm/parse.d.ts", + "default": "./dist/esm/parse.js" + }, + "require": { + "source": "./src/parse.ts", + "types": "./dist/commonjs/parse.d.ts", + "default": "./dist/commonjs/parse.js" + } + }, + "./read-entry": { + "import": { + "source": "./src/read-entry.ts", + "types": "./dist/esm/read-entry.d.ts", + "default": "./dist/esm/read-entry.js" + }, + "require": { + "source": "./src/read-entry.ts", + "types": "./dist/commonjs/read-entry.d.ts", + "default": "./dist/commonjs/read-entry.js" + } + }, + "./write-entry": { + "import": { + "source": "./src/write-entry.ts", + "types": "./dist/esm/write-entry.d.ts", + "default": "./dist/esm/write-entry.js" + }, + "require": { + "source": "./src/write-entry.ts", + "types": "./dist/commonjs/write-entry.d.ts", + "default": "./dist/commonjs/write-entry.js" + } + }, + "./header": { + "import": { + "source": "./src/header.ts", + "types": "./dist/esm/header.d.ts", + "default": "./dist/esm/header.js" + }, + "require": { + "source": "./src/header.ts", + "types": "./dist/commonjs/header.d.ts", + "default": "./dist/commonjs/header.js" + } + }, + "./pax": { + "import": { + "source": "./src/pax.ts", + "types": "./dist/esm/pax.d.ts", + "default": "./dist/esm/pax.js" + }, + "require": { + "source": "./src/pax.ts", + "types": "./dist/commonjs/pax.d.ts", + "default": "./dist/commonjs/pax.js" + } + }, + "./types": { + "import": { + "source": "./src/types.ts", + "types": "./dist/esm/types.d.ts", + "default": "./dist/esm/types.js" + }, + "require": { + "source": "./src/types.ts", + "types": "./dist/commonjs/types.d.ts", + "default": "./dist/commonjs/types.js" + } + } + }, + "type": "module", + "main": "./dist/commonjs/index.js", + "types": "./dist/commonjs/index.d.ts" +} diff --git a/deps/npm/node_modules/node-gyp/node_modules/unique-filename/LICENSE b/deps/npm/node_modules/node-gyp/node_modules/unique-filename/LICENSE deleted file mode 100644 index 69619c125ea7ef..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/unique-filename/LICENSE +++ /dev/null @@ -1,5 +0,0 @@ -Copyright npm, Inc - -Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/deps/npm/node_modules/node-gyp/node_modules/unique-filename/lib/index.js b/deps/npm/node_modules/node-gyp/node_modules/unique-filename/lib/index.js deleted file mode 100644 index d067d2e709809a..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/unique-filename/lib/index.js +++ /dev/null @@ -1,7 +0,0 @@ -var path = require('path') - -var uniqueSlug = require('unique-slug') - -module.exports = function (filepath, prefix, uniq) { - return path.join(filepath, (prefix ? prefix + '-' : '') + uniqueSlug(uniq)) -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/unique-filename/package.json b/deps/npm/node_modules/node-gyp/node_modules/unique-filename/package.json deleted file mode 100644 index b2fbf0666489a6..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/unique-filename/package.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "name": "unique-filename", - "version": "3.0.0", - "description": "Generate a unique filename for use in temporary directories or caches.", - "main": "lib/index.js", - "scripts": { - "test": "tap", - "lint": "eslint \"**/*.js\"", - "postlint": "template-oss-check", - "template-oss-apply": "template-oss-apply --force", - "lintfix": "npm run lint -- --fix", - "snap": "tap", - "posttest": "npm run lint" - }, - "repository": { - "type": "git", - "url": "https://github.com/npm/unique-filename.git" - }, - "keywords": [], - "author": "GitHub Inc.", - "license": "ISC", - "bugs": { - "url": "https://github.com/iarna/unique-filename/issues" - }, - "homepage": "https://github.com/iarna/unique-filename", - "devDependencies": { - "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.5.1", - "tap": "^16.3.0" - }, - "dependencies": { - "unique-slug": "^4.0.0" - }, - "files": [ - "bin/", - "lib/" - ], - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "templateOSS": { - "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.5.1" - }, - "tap": { - "nyc-arg": [ - "--exclude", - "tap-snapshots/**" - ] - } -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/unique-slug/LICENSE b/deps/npm/node_modules/node-gyp/node_modules/unique-slug/LICENSE deleted file mode 100644 index 7953647e7760b8..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/unique-slug/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright npm, Inc - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/deps/npm/node_modules/node-gyp/node_modules/unique-slug/lib/index.js b/deps/npm/node_modules/node-gyp/node_modules/unique-slug/lib/index.js deleted file mode 100644 index 1bac84d95d7307..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/unique-slug/lib/index.js +++ /dev/null @@ -1,11 +0,0 @@ -'use strict' -var MurmurHash3 = require('imurmurhash') - -module.exports = function (uniq) { - if (uniq) { - var hash = new MurmurHash3(uniq) - return ('00000000' + hash.result().toString(16)).slice(-8) - } else { - return (Math.random().toString(16) + '0000000').slice(2, 10) - } -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/unique-slug/package.json b/deps/npm/node_modules/node-gyp/node_modules/unique-slug/package.json deleted file mode 100644 index 33732cdbb42859..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/unique-slug/package.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "name": "unique-slug", - "version": "4.0.0", - "description": "Generate a unique character string suitible for use in files and URLs.", - "main": "lib/index.js", - "scripts": { - "test": "tap", - "lint": "eslint \"**/*.js\"", - "postlint": "template-oss-check", - "template-oss-apply": "template-oss-apply --force", - "lintfix": "npm run lint -- --fix", - "snap": "tap", - "posttest": "npm run lint" - }, - "keywords": [], - "author": "GitHub Inc.", - "license": "ISC", - "devDependencies": { - "@npmcli/eslint-config": "^3.1.0", - "@npmcli/template-oss": "4.5.1", - "tap": "^16.3.0" - }, - "repository": { - "type": "git", - "url": "https://github.com/npm/unique-slug.git" - }, - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "files": [ - "bin/", - "lib/" - ], - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "templateOSS": { - "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.5.1" - }, - "tap": { - "nyc-arg": [ - "--exclude", - "tap-snapshots/**" - ] - } -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/which/LICENSE b/deps/npm/node_modules/node-gyp/node_modules/which/LICENSE deleted file mode 100644 index 19129e315fe593..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/which/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/deps/npm/node_modules/node-gyp/node_modules/which/README.md b/deps/npm/node_modules/node-gyp/node_modules/which/README.md deleted file mode 100644 index 942bf1e0932b89..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/which/README.md +++ /dev/null @@ -1,51 +0,0 @@ -# which - -Like the unix `which` utility. - -Finds the first instance of a specified executable in the PATH -environment variable. Does not cache the results, so `hash -r` is not -needed when the PATH changes. - -## USAGE - -```javascript -const which = require('which') - -// async usage -// rejects if not found -const resolved = await which('node') - -// if nothrow option is used, returns null if not found -const resolvedOrNull = await which('node', { nothrow: true }) - -// sync usage -// throws if not found -const resolved = which.sync('node') - -// if nothrow option is used, returns null if not found -const resolvedOrNull = which.sync('node', { nothrow: true }) - -// Pass options to override the PATH and PATHEXT environment vars. -await which('node', { path: someOtherPath, pathExt: somePathExt }) -``` - -## CLI USAGE - -Just like the BSD `which(1)` binary but using `node-which`. - -``` -usage: node-which [-as] program ... -``` - -You can learn more about why the binary is `node-which` and not `which` -[here](https://github.com/npm/node-which/pull/67) - -## OPTIONS - -You may pass an options object as the second argument. - -- `path`: Use instead of the `PATH` environment variable. -- `pathExt`: Use instead of the `PATHEXT` environment variable. -- `all`: Return all matches, instead of just the first one. Note that - this means the function returns an array of strings instead of a - single string. diff --git a/deps/npm/node_modules/node-gyp/node_modules/which/bin/which.js b/deps/npm/node_modules/node-gyp/node_modules/which/bin/which.js deleted file mode 100755 index 6df16f21acf930..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/which/bin/which.js +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/env node - -const which = require('../lib') -const argv = process.argv.slice(2) - -const usage = (err) => { - if (err) { - console.error(`which: ${err}`) - } - console.error('usage: which [-as] program ...') - process.exit(1) -} - -if (!argv.length) { - return usage() -} - -let dashdash = false -const [commands, flags] = argv.reduce((acc, arg) => { - if (dashdash || arg === '--') { - dashdash = true - return acc - } - - if (!/^-/.test(arg)) { - acc[0].push(arg) - return acc - } - - for (const flag of arg.slice(1).split('')) { - if (flag === 's') { - acc[1].silent = true - } else if (flag === 'a') { - acc[1].all = true - } else { - usage(`illegal option -- ${flag}`) - } - } - - return acc -}, [[], {}]) - -for (const command of commands) { - try { - const res = which.sync(command, { all: flags.all }) - if (!flags.silent) { - console.log([].concat(res).join('\n')) - } - } catch (err) { - process.exitCode = 1 - } -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/which/lib/index.js b/deps/npm/node_modules/node-gyp/node_modules/which/lib/index.js deleted file mode 100644 index 2fd358baf888fd..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/which/lib/index.js +++ /dev/null @@ -1,111 +0,0 @@ -const { isexe, sync: isexeSync } = require('isexe') -const { join, delimiter, sep, posix } = require('path') - -const isWindows = process.platform === 'win32' - -// used to check for slashed in commands passed in. always checks for the posix -// seperator on all platforms, and checks for the current separator when not on -// a posix platform. don't use the isWindows check for this since that is mocked -// in tests but we still need the code to actually work when called. that is also -// why it is ignored from coverage. -/* istanbul ignore next */ -const rSlash = new RegExp(`[${posix.sep}${sep === posix.sep ? '' : sep}]`.replace(/(\\)/g, '\\$1')) -const rRel = new RegExp(`^\\.${rSlash.source}`) - -const getNotFoundError = (cmd) => - Object.assign(new Error(`not found: ${cmd}`), { code: 'ENOENT' }) - -const getPathInfo = (cmd, { - path: optPath = process.env.PATH, - pathExt: optPathExt = process.env.PATHEXT, - delimiter: optDelimiter = delimiter, -}) => { - // If it has a slash, then we don't bother searching the pathenv. - // just check the file itself, and that's it. - const pathEnv = cmd.match(rSlash) ? [''] : [ - // windows always checks the cwd first - ...(isWindows ? [process.cwd()] : []), - ...(optPath || /* istanbul ignore next: very unusual */ '').split(optDelimiter), - ] - - if (isWindows) { - const pathExtExe = optPathExt || - ['.EXE', '.CMD', '.BAT', '.COM'].join(optDelimiter) - const pathExt = pathExtExe.split(optDelimiter).flatMap((item) => [item, item.toLowerCase()]) - if (cmd.includes('.') && pathExt[0] !== '') { - pathExt.unshift('') - } - return { pathEnv, pathExt, pathExtExe } - } - - return { pathEnv, pathExt: [''] } -} - -const getPathPart = (raw, cmd) => { - const pathPart = /^".*"$/.test(raw) ? raw.slice(1, -1) : raw - const prefix = !pathPart && rRel.test(cmd) ? cmd.slice(0, 2) : '' - return prefix + join(pathPart, cmd) -} - -const which = async (cmd, opt = {}) => { - const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt) - const found = [] - - for (const envPart of pathEnv) { - const p = getPathPart(envPart, cmd) - - for (const ext of pathExt) { - const withExt = p + ext - const is = await isexe(withExt, { pathExt: pathExtExe, ignoreErrors: true }) - if (is) { - if (!opt.all) { - return withExt - } - found.push(withExt) - } - } - } - - if (opt.all && found.length) { - return found - } - - if (opt.nothrow) { - return null - } - - throw getNotFoundError(cmd) -} - -const whichSync = (cmd, opt = {}) => { - const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt) - const found = [] - - for (const pathEnvPart of pathEnv) { - const p = getPathPart(pathEnvPart, cmd) - - for (const ext of pathExt) { - const withExt = p + ext - const is = isexeSync(withExt, { pathExt: pathExtExe, ignoreErrors: true }) - if (is) { - if (!opt.all) { - return withExt - } - found.push(withExt) - } - } - } - - if (opt.all && found.length) { - return found - } - - if (opt.nothrow) { - return null - } - - throw getNotFoundError(cmd) -} - -module.exports = which -which.sync = whichSync diff --git a/deps/npm/node_modules/node-gyp/node_modules/which/package.json b/deps/npm/node_modules/node-gyp/node_modules/which/package.json deleted file mode 100644 index 515bfb22ca0e1e..00000000000000 --- a/deps/npm/node_modules/node-gyp/node_modules/which/package.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "author": "GitHub Inc.", - "name": "which", - "description": "Like which(1) unix command. Find the first instance of an executable in the PATH.", - "version": "4.0.0", - "repository": { - "type": "git", - "url": "https://github.com/npm/node-which.git" - }, - "main": "lib/index.js", - "bin": { - "node-which": "./bin/which.js" - }, - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "devDependencies": { - "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.18.0", - "tap": "^16.3.0" - }, - "scripts": { - "test": "tap", - "lint": "eslint \"**/*.js\"", - "postlint": "template-oss-check", - "template-oss-apply": "template-oss-apply --force", - "lintfix": "npm run lint -- --fix", - "snap": "tap", - "posttest": "npm run lint" - }, - "files": [ - "bin/", - "lib/" - ], - "tap": { - "check-coverage": true, - "nyc-arg": [ - "--exclude", - "tap-snapshots/**" - ] - }, - "engines": { - "node": "^16.13.0 || >=18.0.0" - }, - "templateOSS": { - "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "ciVersions": [ - "16.13.0", - "16.x", - "18.0.0", - "18.x" - ], - "version": "4.18.0", - "publish": "true" - } -} diff --git a/deps/npm/node_modules/node-gyp/node_modules/yallist/LICENSE.md b/deps/npm/node_modules/node-gyp/node_modules/yallist/LICENSE.md new file mode 100644 index 00000000000000..881248b6d7f0ca --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/yallist/LICENSE.md @@ -0,0 +1,63 @@ +All packages under `src/` are licensed according to the terms in +their respective `LICENSE` or `LICENSE.md` files. + +The remainder of this project is licensed under the Blue Oak +Model License, as follows: + +----- + +# Blue Oak Model License + +Version 1.0.0 + +## Purpose + +This license gives everyone as much permission to work with +this software as possible, while protecting contributors +from liability. + +## Acceptance + +In order to receive this license, you must agree to its +rules. The rules of this license are both obligations +under that agreement and conditions to your license. +You must not do anything with this software that triggers +a rule that you cannot or will not follow. + +## Copyright + +Each contributor licenses you to do everything with this +software that would otherwise infringe that contributor's +copyright in it. + +## Notices + +You must ensure that everyone who gets a copy of +any part of this software from you, with or without +changes, also gets the text of this license or a link to +. + +## Excuse + +If anyone notifies you in writing that you have not +complied with [Notices](#notices), you can keep your +license by taking all practical steps to comply within 30 +days after the notice. If you do not do so, your license +ends immediately. + +## Patent + +Each contributor licenses you to do everything with this +software that would otherwise infringe any patent claims +they can license or become able to license. + +## Reliability + +No contributor can revoke this license. + +## No Liability + +***As far as the law allows, this software comes as is, +without any warranty or condition, and no contributor +will be liable to anyone for any damages related to this +software or this license, under any kind of legal claim.*** diff --git a/deps/npm/node_modules/node-gyp/node_modules/yallist/dist/commonjs/index.js b/deps/npm/node_modules/node-gyp/node_modules/yallist/dist/commonjs/index.js new file mode 100644 index 00000000000000..c1e1e4741689d9 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/yallist/dist/commonjs/index.js @@ -0,0 +1,384 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Node = exports.Yallist = void 0; +class Yallist { + tail; + head; + length = 0; + static create(list = []) { + return new Yallist(list); + } + constructor(list = []) { + for (const item of list) { + this.push(item); + } + } + *[Symbol.iterator]() { + for (let walker = this.head; walker; walker = walker.next) { + yield walker.value; + } + } + removeNode(node) { + if (node.list !== this) { + throw new Error('removing node which does not belong to this list'); + } + const next = node.next; + const prev = node.prev; + if (next) { + next.prev = prev; + } + if (prev) { + prev.next = next; + } + if (node === this.head) { + this.head = next; + } + if (node === this.tail) { + this.tail = prev; + } + this.length--; + node.next = undefined; + node.prev = undefined; + node.list = undefined; + return next; + } + unshiftNode(node) { + if (node === this.head) { + return; + } + if (node.list) { + node.list.removeNode(node); + } + const head = this.head; + node.list = this; + node.next = head; + if (head) { + head.prev = node; + } + this.head = node; + if (!this.tail) { + this.tail = node; + } + this.length++; + } + pushNode(node) { + if (node === this.tail) { + return; + } + if (node.list) { + node.list.removeNode(node); + } + const tail = this.tail; + node.list = this; + node.prev = tail; + if (tail) { + tail.next = node; + } + this.tail = node; + if (!this.head) { + this.head = node; + } + this.length++; + } + push(...args) { + for (let i = 0, l = args.length; i < l; i++) { + push(this, args[i]); + } + return this.length; + } + unshift(...args) { + for (var i = 0, l = args.length; i < l; i++) { + unshift(this, args[i]); + } + return this.length; + } + pop() { + if (!this.tail) { + return undefined; + } + const res = this.tail.value; + const t = this.tail; + this.tail = this.tail.prev; + if (this.tail) { + this.tail.next = undefined; + } + else { + this.head = undefined; + } + t.list = undefined; + this.length--; + return res; + } + shift() { + if (!this.head) { + return undefined; + } + const res = this.head.value; + const h = this.head; + this.head = this.head.next; + if (this.head) { + this.head.prev = undefined; + } + else { + this.tail = undefined; + } + h.list = undefined; + this.length--; + return res; + } + forEach(fn, thisp) { + thisp = thisp || this; + for (let walker = this.head, i = 0; !!walker; i++) { + fn.call(thisp, walker.value, i, this); + walker = walker.next; + } + } + forEachReverse(fn, thisp) { + thisp = thisp || this; + for (let walker = this.tail, i = this.length - 1; !!walker; i--) { + fn.call(thisp, walker.value, i, this); + walker = walker.prev; + } + } + get(n) { + let i = 0; + let walker = this.head; + for (; !!walker && i < n; i++) { + walker = walker.next; + } + if (i === n && !!walker) { + return walker.value; + } + } + getReverse(n) { + let i = 0; + let walker = this.tail; + for (; !!walker && i < n; i++) { + // abort out of the list early if we hit a cycle + walker = walker.prev; + } + if (i === n && !!walker) { + return walker.value; + } + } + map(fn, thisp) { + thisp = thisp || this; + const res = new Yallist(); + for (let walker = this.head; !!walker;) { + res.push(fn.call(thisp, walker.value, this)); + walker = walker.next; + } + return res; + } + mapReverse(fn, thisp) { + thisp = thisp || this; + var res = new Yallist(); + for (let walker = this.tail; !!walker;) { + res.push(fn.call(thisp, walker.value, this)); + walker = walker.prev; + } + return res; + } + reduce(fn, initial) { + let acc; + let walker = this.head; + if (arguments.length > 1) { + acc = initial; + } + else if (this.head) { + walker = this.head.next; + acc = this.head.value; + } + else { + throw new TypeError('Reduce of empty list with no initial value'); + } + for (var i = 0; !!walker; i++) { + acc = fn(acc, walker.value, i); + walker = walker.next; + } + return acc; + } + reduceReverse(fn, initial) { + let acc; + let walker = this.tail; + if (arguments.length > 1) { + acc = initial; + } + else if (this.tail) { + walker = this.tail.prev; + acc = this.tail.value; + } + else { + throw new TypeError('Reduce of empty list with no initial value'); + } + for (let i = this.length - 1; !!walker; i--) { + acc = fn(acc, walker.value, i); + walker = walker.prev; + } + return acc; + } + toArray() { + const arr = new Array(this.length); + for (let i = 0, walker = this.head; !!walker; i++) { + arr[i] = walker.value; + walker = walker.next; + } + return arr; + } + toArrayReverse() { + const arr = new Array(this.length); + for (let i = 0, walker = this.tail; !!walker; i++) { + arr[i] = walker.value; + walker = walker.prev; + } + return arr; + } + slice(from = 0, to = this.length) { + if (to < 0) { + to += this.length; + } + if (from < 0) { + from += this.length; + } + const ret = new Yallist(); + if (to < from || to < 0) { + return ret; + } + if (from < 0) { + from = 0; + } + if (to > this.length) { + to = this.length; + } + let walker = this.head; + let i = 0; + for (i = 0; !!walker && i < from; i++) { + walker = walker.next; + } + for (; !!walker && i < to; i++, walker = walker.next) { + ret.push(walker.value); + } + return ret; + } + sliceReverse(from = 0, to = this.length) { + if (to < 0) { + to += this.length; + } + if (from < 0) { + from += this.length; + } + const ret = new Yallist(); + if (to < from || to < 0) { + return ret; + } + if (from < 0) { + from = 0; + } + if (to > this.length) { + to = this.length; + } + let i = this.length; + let walker = this.tail; + for (; !!walker && i > to; i--) { + walker = walker.prev; + } + for (; !!walker && i > from; i--, walker = walker.prev) { + ret.push(walker.value); + } + return ret; + } + splice(start, deleteCount = 0, ...nodes) { + if (start > this.length) { + start = this.length - 1; + } + if (start < 0) { + start = this.length + start; + } + let walker = this.head; + for (let i = 0; !!walker && i < start; i++) { + walker = walker.next; + } + const ret = []; + for (let i = 0; !!walker && i < deleteCount; i++) { + ret.push(walker.value); + walker = this.removeNode(walker); + } + if (!walker) { + walker = this.tail; + } + else if (walker !== this.tail) { + walker = walker.prev; + } + for (const v of nodes) { + walker = insertAfter(this, walker, v); + } + return ret; + } + reverse() { + const head = this.head; + const tail = this.tail; + for (let walker = head; !!walker; walker = walker.prev) { + const p = walker.prev; + walker.prev = walker.next; + walker.next = p; + } + this.head = tail; + this.tail = head; + return this; + } +} +exports.Yallist = Yallist; +// insertAfter undefined means "make the node the new head of list" +function insertAfter(self, node, value) { + const prev = node; + const next = node ? node.next : self.head; + const inserted = new Node(value, prev, next, self); + if (inserted.next === undefined) { + self.tail = inserted; + } + if (inserted.prev === undefined) { + self.head = inserted; + } + self.length++; + return inserted; +} +function push(self, item) { + self.tail = new Node(item, self.tail, undefined, self); + if (!self.head) { + self.head = self.tail; + } + self.length++; +} +function unshift(self, item) { + self.head = new Node(item, undefined, self.head, self); + if (!self.tail) { + self.tail = self.head; + } + self.length++; +} +class Node { + list; + next; + prev; + value; + constructor(value, prev, next, list) { + this.list = list; + this.value = value; + if (prev) { + prev.next = this; + this.prev = prev; + } + else { + this.prev = undefined; + } + if (next) { + next.prev = this; + this.next = next; + } + else { + this.next = undefined; + } + } +} +exports.Node = Node; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/yallist/dist/commonjs/package.json b/deps/npm/node_modules/node-gyp/node_modules/yallist/dist/commonjs/package.json new file mode 100644 index 00000000000000..5bbefffbabee39 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/yallist/dist/commonjs/package.json @@ -0,0 +1,3 @@ +{ + "type": "commonjs" +} diff --git a/deps/npm/node_modules/node-gyp/node_modules/yallist/dist/esm/index.js b/deps/npm/node_modules/node-gyp/node_modules/yallist/dist/esm/index.js new file mode 100644 index 00000000000000..3d81c5113b93a8 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/yallist/dist/esm/index.js @@ -0,0 +1,379 @@ +export class Yallist { + tail; + head; + length = 0; + static create(list = []) { + return new Yallist(list); + } + constructor(list = []) { + for (const item of list) { + this.push(item); + } + } + *[Symbol.iterator]() { + for (let walker = this.head; walker; walker = walker.next) { + yield walker.value; + } + } + removeNode(node) { + if (node.list !== this) { + throw new Error('removing node which does not belong to this list'); + } + const next = node.next; + const prev = node.prev; + if (next) { + next.prev = prev; + } + if (prev) { + prev.next = next; + } + if (node === this.head) { + this.head = next; + } + if (node === this.tail) { + this.tail = prev; + } + this.length--; + node.next = undefined; + node.prev = undefined; + node.list = undefined; + return next; + } + unshiftNode(node) { + if (node === this.head) { + return; + } + if (node.list) { + node.list.removeNode(node); + } + const head = this.head; + node.list = this; + node.next = head; + if (head) { + head.prev = node; + } + this.head = node; + if (!this.tail) { + this.tail = node; + } + this.length++; + } + pushNode(node) { + if (node === this.tail) { + return; + } + if (node.list) { + node.list.removeNode(node); + } + const tail = this.tail; + node.list = this; + node.prev = tail; + if (tail) { + tail.next = node; + } + this.tail = node; + if (!this.head) { + this.head = node; + } + this.length++; + } + push(...args) { + for (let i = 0, l = args.length; i < l; i++) { + push(this, args[i]); + } + return this.length; + } + unshift(...args) { + for (var i = 0, l = args.length; i < l; i++) { + unshift(this, args[i]); + } + return this.length; + } + pop() { + if (!this.tail) { + return undefined; + } + const res = this.tail.value; + const t = this.tail; + this.tail = this.tail.prev; + if (this.tail) { + this.tail.next = undefined; + } + else { + this.head = undefined; + } + t.list = undefined; + this.length--; + return res; + } + shift() { + if (!this.head) { + return undefined; + } + const res = this.head.value; + const h = this.head; + this.head = this.head.next; + if (this.head) { + this.head.prev = undefined; + } + else { + this.tail = undefined; + } + h.list = undefined; + this.length--; + return res; + } + forEach(fn, thisp) { + thisp = thisp || this; + for (let walker = this.head, i = 0; !!walker; i++) { + fn.call(thisp, walker.value, i, this); + walker = walker.next; + } + } + forEachReverse(fn, thisp) { + thisp = thisp || this; + for (let walker = this.tail, i = this.length - 1; !!walker; i--) { + fn.call(thisp, walker.value, i, this); + walker = walker.prev; + } + } + get(n) { + let i = 0; + let walker = this.head; + for (; !!walker && i < n; i++) { + walker = walker.next; + } + if (i === n && !!walker) { + return walker.value; + } + } + getReverse(n) { + let i = 0; + let walker = this.tail; + for (; !!walker && i < n; i++) { + // abort out of the list early if we hit a cycle + walker = walker.prev; + } + if (i === n && !!walker) { + return walker.value; + } + } + map(fn, thisp) { + thisp = thisp || this; + const res = new Yallist(); + for (let walker = this.head; !!walker;) { + res.push(fn.call(thisp, walker.value, this)); + walker = walker.next; + } + return res; + } + mapReverse(fn, thisp) { + thisp = thisp || this; + var res = new Yallist(); + for (let walker = this.tail; !!walker;) { + res.push(fn.call(thisp, walker.value, this)); + walker = walker.prev; + } + return res; + } + reduce(fn, initial) { + let acc; + let walker = this.head; + if (arguments.length > 1) { + acc = initial; + } + else if (this.head) { + walker = this.head.next; + acc = this.head.value; + } + else { + throw new TypeError('Reduce of empty list with no initial value'); + } + for (var i = 0; !!walker; i++) { + acc = fn(acc, walker.value, i); + walker = walker.next; + } + return acc; + } + reduceReverse(fn, initial) { + let acc; + let walker = this.tail; + if (arguments.length > 1) { + acc = initial; + } + else if (this.tail) { + walker = this.tail.prev; + acc = this.tail.value; + } + else { + throw new TypeError('Reduce of empty list with no initial value'); + } + for (let i = this.length - 1; !!walker; i--) { + acc = fn(acc, walker.value, i); + walker = walker.prev; + } + return acc; + } + toArray() { + const arr = new Array(this.length); + for (let i = 0, walker = this.head; !!walker; i++) { + arr[i] = walker.value; + walker = walker.next; + } + return arr; + } + toArrayReverse() { + const arr = new Array(this.length); + for (let i = 0, walker = this.tail; !!walker; i++) { + arr[i] = walker.value; + walker = walker.prev; + } + return arr; + } + slice(from = 0, to = this.length) { + if (to < 0) { + to += this.length; + } + if (from < 0) { + from += this.length; + } + const ret = new Yallist(); + if (to < from || to < 0) { + return ret; + } + if (from < 0) { + from = 0; + } + if (to > this.length) { + to = this.length; + } + let walker = this.head; + let i = 0; + for (i = 0; !!walker && i < from; i++) { + walker = walker.next; + } + for (; !!walker && i < to; i++, walker = walker.next) { + ret.push(walker.value); + } + return ret; + } + sliceReverse(from = 0, to = this.length) { + if (to < 0) { + to += this.length; + } + if (from < 0) { + from += this.length; + } + const ret = new Yallist(); + if (to < from || to < 0) { + return ret; + } + if (from < 0) { + from = 0; + } + if (to > this.length) { + to = this.length; + } + let i = this.length; + let walker = this.tail; + for (; !!walker && i > to; i--) { + walker = walker.prev; + } + for (; !!walker && i > from; i--, walker = walker.prev) { + ret.push(walker.value); + } + return ret; + } + splice(start, deleteCount = 0, ...nodes) { + if (start > this.length) { + start = this.length - 1; + } + if (start < 0) { + start = this.length + start; + } + let walker = this.head; + for (let i = 0; !!walker && i < start; i++) { + walker = walker.next; + } + const ret = []; + for (let i = 0; !!walker && i < deleteCount; i++) { + ret.push(walker.value); + walker = this.removeNode(walker); + } + if (!walker) { + walker = this.tail; + } + else if (walker !== this.tail) { + walker = walker.prev; + } + for (const v of nodes) { + walker = insertAfter(this, walker, v); + } + return ret; + } + reverse() { + const head = this.head; + const tail = this.tail; + for (let walker = head; !!walker; walker = walker.prev) { + const p = walker.prev; + walker.prev = walker.next; + walker.next = p; + } + this.head = tail; + this.tail = head; + return this; + } +} +// insertAfter undefined means "make the node the new head of list" +function insertAfter(self, node, value) { + const prev = node; + const next = node ? node.next : self.head; + const inserted = new Node(value, prev, next, self); + if (inserted.next === undefined) { + self.tail = inserted; + } + if (inserted.prev === undefined) { + self.head = inserted; + } + self.length++; + return inserted; +} +function push(self, item) { + self.tail = new Node(item, self.tail, undefined, self); + if (!self.head) { + self.head = self.tail; + } + self.length++; +} +function unshift(self, item) { + self.head = new Node(item, undefined, self.head, self); + if (!self.tail) { + self.tail = self.head; + } + self.length++; +} +export class Node { + list; + next; + prev; + value; + constructor(value, prev, next, list) { + this.list = list; + this.value = value; + if (prev) { + prev.next = this; + this.prev = prev; + } + else { + this.prev = undefined; + } + if (next) { + next.prev = this; + this.next = next; + } + else { + this.next = undefined; + } + } +} +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/deps/npm/node_modules/node-gyp/node_modules/yallist/dist/esm/package.json b/deps/npm/node_modules/node-gyp/node_modules/yallist/dist/esm/package.json new file mode 100644 index 00000000000000..3dbc1ca591c055 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/yallist/dist/esm/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/deps/npm/node_modules/node-gyp/node_modules/yallist/package.json b/deps/npm/node_modules/node-gyp/node_modules/yallist/package.json new file mode 100644 index 00000000000000..2f5247808bbea8 --- /dev/null +++ b/deps/npm/node_modules/node-gyp/node_modules/yallist/package.json @@ -0,0 +1,68 @@ +{ + "name": "yallist", + "version": "5.0.0", + "description": "Yet Another Linked List", + "files": [ + "dist" + ], + "devDependencies": { + "prettier": "^3.2.5", + "tap": "^18.7.2", + "tshy": "^1.13.1", + "typedoc": "^0.25.13" + }, + "scripts": { + "preversion": "npm test", + "postversion": "npm publish", + "prepublishOnly": "git push origin --follow-tags", + "prepare": "tshy", + "pretest": "npm run prepare", + "presnap": "npm run prepare", + "test": "tap", + "snap": "tap", + "format": "prettier --write . --loglevel warn --ignore-path ../../.prettierignore --cache", + "typedoc": "typedoc" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/isaacs/yallist.git" + }, + "author": "Isaac Z. Schlueter (http://blog.izs.me/)", + "license": "BlueOak-1.0.0", + "tshy": { + "exports": { + "./package.json": "./package.json", + ".": "./src/index.ts" + } + }, + "exports": { + "./package.json": "./package.json", + ".": { + "import": { + "types": "./dist/esm/index.d.ts", + "default": "./dist/esm/index.js" + }, + "require": { + "types": "./dist/commonjs/index.d.ts", + "default": "./dist/commonjs/index.js" + } + } + }, + "main": "./dist/commonjs/index.js", + "types": "./dist/commonjs/index.d.ts", + "type": "module", + "prettier": { + "semi": false, + "printWidth": 70, + "tabWidth": 2, + "useTabs": false, + "singleQuote": true, + "jsxSingleQuote": false, + "bracketSameLine": true, + "arrowParens": "avoid", + "endOfLine": "lf" + }, + "engines": { + "node": ">=18" + } +} diff --git a/deps/npm/node_modules/node-gyp/package.json b/deps/npm/node_modules/node-gyp/package.json index 8e2ea42510dd14..4a1cfb0eb1a283 100644 --- a/deps/npm/node_modules/node-gyp/package.json +++ b/deps/npm/node_modules/node-gyp/package.json @@ -11,7 +11,7 @@ "bindings", "gyp" ], - "version": "10.2.0", + "version": "11.0.0", "installVersion": 11, "author": "Nathan Rajlich (http://tootallnate.net)", "repository": { @@ -26,26 +26,27 @@ "exponential-backoff": "^3.1.1", "glob": "^10.3.10", "graceful-fs": "^4.2.6", - "make-fetch-happen": "^13.0.0", - "nopt": "^7.0.0", - "proc-log": "^4.1.0", + "make-fetch-happen": "^14.0.3", + "nopt": "^8.0.0", + "proc-log": "^5.0.0", "semver": "^7.3.5", - "tar": "^6.2.1", - "which": "^4.0.0" + "tar": "^7.4.3", + "which": "^5.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" }, "devDependencies": { "bindings": "^1.5.0", "cross-env": "^7.0.3", - "mocha": "^10.2.0", + "eslint": "^9.16.0", + "mocha": "^11.0.1", "nan": "^2.14.2", - "require-inject": "^1.4.4", - "standard": "^17.0.0" + "neostandard": "^0.11.9", + "require-inject": "^1.4.4" }, "scripts": { - "lint": "standard \"*/*.js\" \"test/**/*.js\" \".github/**/*.js\"", + "lint": "eslint \"*/*.js\" \"test/**/*.js\" \".github/**/*.js\"", "test": "cross-env NODE_GYP_NULL_LOGGER=true mocha --timeout 15000 test/test-download.js test/test-*" } } diff --git a/deps/npm/node_modules/npm-install-checks/lib/current-env.js b/deps/npm/node_modules/npm-install-checks/lib/current-env.js index 9babde1f277ff1..31f154aac59b32 100644 --- a/deps/npm/node_modules/npm-install-checks/lib/current-env.js +++ b/deps/npm/node_modules/npm-install-checks/lib/current-env.js @@ -1,5 +1,6 @@ const process = require('node:process') const nodeOs = require('node:os') +const fs = require('node:fs') function isMusl (file) { return file.includes('libc.musl-') || file.includes('ld-musl-') @@ -13,12 +14,23 @@ function cpu () { return process.arch } -function libc (osName) { - // this is to make it faster on non linux machines - if (osName !== 'linux') { +const LDD_PATH = '/usr/bin/ldd' +function getFamilyFromFilesystem () { + try { + const content = fs.readFileSync(LDD_PATH, 'utf-8') + if (content.includes('musl')) { + return 'musl' + } + if (content.includes('GNU C Library')) { + return 'glibc' + } + return null + } catch { return undefined } - let family +} + +function getFamilyFromReport () { const originalExclude = process.report.excludeNetwork process.report.excludeNetwork = true const report = process.report.getReport() @@ -27,6 +39,22 @@ function libc (osName) { family = 'glibc' } else if (Array.isArray(report.sharedObjects) && report.sharedObjects.some(isMusl)) { family = 'musl' + } else { + family = null + } + return family +} + +let family +function libc (osName) { + if (osName !== 'linux') { + return undefined + } + if (family === undefined) { + family = getFamilyFromFilesystem() + if (family === undefined) { + family = getFamilyFromReport() + } } return family } diff --git a/deps/npm/node_modules/npm-install-checks/package.json b/deps/npm/node_modules/npm-install-checks/package.json index e9e69575a6dc6d..967f5f659b2fac 100644 --- a/deps/npm/node_modules/npm-install-checks/package.json +++ b/deps/npm/node_modules/npm-install-checks/package.json @@ -1,6 +1,6 @@ { "name": "npm-install-checks", - "version": "7.1.0", + "version": "7.1.1", "description": "Check the engines and platform fields in package.json", "main": "lib/index.js", "dependencies": { @@ -8,7 +8,7 @@ }, "devDependencies": { "@npmcli/eslint-config": "^5.0.0", - "@npmcli/template-oss": "4.23.3", + "@npmcli/template-oss": "4.23.4", "tap": "^16.0.1" }, "scripts": { @@ -40,7 +40,7 @@ "author": "GitHub Inc.", "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.23.3", + "version": "4.23.4", "publish": "true" }, "tap": { diff --git a/deps/npm/node_modules/npm-registry-fetch/lib/check-response.js b/deps/npm/node_modules/npm-registry-fetch/lib/check-response.js index 65eea2963b0b4c..2f183082ab2ce2 100644 --- a/deps/npm/node_modules/npm-registry-fetch/lib/check-response.js +++ b/deps/npm/node_modules/npm-registry-fetch/lib/check-response.js @@ -48,10 +48,18 @@ function logRequest (method, res, startTime) { const cacheStr = cacheStatus ? ` (cache ${cacheStatus})` : '' const urlStr = cleanUrl(res.url) - log.http( - 'fetch', - `${method.toUpperCase()} ${res.status} ${urlStr} ${elapsedTime}ms${attemptStr}${cacheStr}` - ) + // If make-fetch-happen reports a cache hit, then there was no fetch + if (cacheStatus === 'hit') { + log.http( + 'cache', + `${urlStr} ${elapsedTime}ms${attemptStr}${cacheStr}` + ) + } else { + log.http( + 'fetch', + `${method.toUpperCase()} ${res.status} ${urlStr} ${elapsedTime}ms${attemptStr}${cacheStr}` + ) + } } function checkErrors (method, res, startTime, opts) { diff --git a/deps/npm/node_modules/npm-registry-fetch/package.json b/deps/npm/node_modules/npm-registry-fetch/package.json index 559473b964aaa5..bd7a79d35e26ac 100644 --- a/deps/npm/node_modules/npm-registry-fetch/package.json +++ b/deps/npm/node_modules/npm-registry-fetch/package.json @@ -1,6 +1,6 @@ { "name": "npm-registry-fetch", - "version": "18.0.1", + "version": "18.0.2", "description": "Fetch-based http client for use with npm registry APIs", "main": "lib", "files": [ @@ -42,8 +42,8 @@ }, "devDependencies": { "@npmcli/eslint-config": "^5.0.0", - "@npmcli/template-oss": "4.23.3", - "cacache": "^18.0.0", + "@npmcli/template-oss": "4.23.4", + "cacache": "^19.0.1", "nock": "^13.2.4", "require-inject": "^1.4.4", "ssri": "^12.0.0", @@ -62,7 +62,7 @@ }, "templateOSS": { "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.23.3", + "version": "4.23.4", "publish": "true" } } diff --git a/deps/npm/node_modules/package-json-from-dist/dist/commonjs/index.js b/deps/npm/node_modules/package-json-from-dist/dist/commonjs/index.js index 5cff210d855cb0..b966ac9fef535b 100644 --- a/deps/npm/node_modules/package-json-from-dist/dist/commonjs/index.js +++ b/deps/npm/node_modules/package-json-from-dist/dist/commonjs/index.js @@ -5,6 +5,8 @@ const node_fs_1 = require("node:fs"); const node_path_1 = require("node:path"); const node_url_1 = require("node:url"); const NM = `${node_path_1.sep}node_modules${node_path_1.sep}`; +const STORE = `.store${node_path_1.sep}`; +const PKG = `${node_path_1.sep}package${node_path_1.sep}`; const DIST = `${node_path_1.sep}dist${node_path_1.sep}`; /** * Find the package.json file, either from a TypeScript file somewhere not @@ -59,8 +61,16 @@ const findPackageJson = (from, pathFromSrc = '../package.json') => { // inside of node_modules. find the dist directly under package name. const nm = __dirname.substring(0, nms + NM.length); const pkgDir = __dirname.substring(nms + NM.length); + // affordance for yarn berry, which puts package contents in + // '.../node_modules/.store/${id}-${hash}/package/...' + if (pkgDir.startsWith(STORE)) { + const pkg = pkgDir.indexOf(PKG, STORE.length); + if (pkg) { + return (0, node_path_1.resolve)(nm, pkgDir.substring(0, pkg + PKG.length), 'package.json'); + } + } const pkgName = pkgDir.startsWith('@') ? - pkgDir.split(node_path_1.sep).slice(0, 2).join(node_path_1.sep) + pkgDir.split(node_path_1.sep, 2).join(node_path_1.sep) : String(pkgDir.split(node_path_1.sep)[0]); return (0, node_path_1.resolve)(nm, pkgName, 'package.json'); } diff --git a/deps/npm/node_modules/package-json-from-dist/dist/esm/index.js b/deps/npm/node_modules/package-json-from-dist/dist/esm/index.js index 0627645f9c35a4..426ad3c2d18597 100644 --- a/deps/npm/node_modules/package-json-from-dist/dist/esm/index.js +++ b/deps/npm/node_modules/package-json-from-dist/dist/esm/index.js @@ -2,6 +2,8 @@ import { readFileSync } from 'node:fs'; import { dirname, resolve, sep } from 'node:path'; import { fileURLToPath } from 'node:url'; const NM = `${sep}node_modules${sep}`; +const STORE = `.store${sep}`; +const PKG = `${sep}package${sep}`; const DIST = `${sep}dist${sep}`; /** * Find the package.json file, either from a TypeScript file somewhere not @@ -56,8 +58,16 @@ export const findPackageJson = (from, pathFromSrc = '../package.json') => { // inside of node_modules. find the dist directly under package name. const nm = __dirname.substring(0, nms + NM.length); const pkgDir = __dirname.substring(nms + NM.length); + // affordance for yarn berry, which puts package contents in + // '.../node_modules/.store/${id}-${hash}/package/...' + if (pkgDir.startsWith(STORE)) { + const pkg = pkgDir.indexOf(PKG, STORE.length); + if (pkg) { + return resolve(nm, pkgDir.substring(0, pkg + PKG.length), 'package.json'); + } + } const pkgName = pkgDir.startsWith('@') ? - pkgDir.split(sep).slice(0, 2).join(sep) + pkgDir.split(sep, 2).join(sep) : String(pkgDir.split(sep)[0]); return resolve(nm, pkgName, 'package.json'); } diff --git a/deps/npm/node_modules/package-json-from-dist/package.json b/deps/npm/node_modules/package-json-from-dist/package.json index 2d5526e87b7fa0..a2d03c3269d72d 100644 --- a/deps/npm/node_modules/package-json-from-dist/package.json +++ b/deps/npm/node_modules/package-json-from-dist/package.json @@ -1,6 +1,6 @@ { "name": "package-json-from-dist", - "version": "1.0.0", + "version": "1.0.1", "description": "Load the local package.json from either src or dist folder", "main": "./dist/commonjs/index.js", "exports": { @@ -28,7 +28,7 @@ "presnap": "npm run prepare", "test": "tap", "snap": "tap", - "format": "prettier --write . --loglevel warn --ignore-path ../../.prettierignore --cache", + "format": "prettier --write . --log-level warn", "typedoc": "typedoc" }, "author": "Isaac Z. Schlueter (https://izs.me)", diff --git a/deps/npm/node_modules/pacote/lib/dir.js b/deps/npm/node_modules/pacote/lib/dir.js index f3229b34e463ab..4ae97c216fe64f 100644 --- a/deps/npm/node_modules/pacote/lib/dir.js +++ b/deps/npm/node_modules/pacote/lib/dir.js @@ -39,6 +39,8 @@ class DirFetcher extends Fetcher { const stdio = this.opts.foregroundScripts ? 'inherit' : 'pipe' return runScript({ + // this || undefined is because runScript will be unhappy with the default null value + scriptShell: this.opts.scriptShell || undefined, pkg: mani, event: 'prepare', path: this.resolved, diff --git a/deps/npm/node_modules/pacote/lib/fetcher.js b/deps/npm/node_modules/pacote/lib/fetcher.js index cc2c2db70c697d..f2ac97619d3af1 100644 --- a/deps/npm/node_modules/pacote/lib/fetcher.js +++ b/deps/npm/node_modules/pacote/lib/fetcher.js @@ -188,7 +188,15 @@ class FetcherBase { // private // Note: cacache will raise a EINTEGRITY error if the integrity doesn't match #tarballFromCache () { - return cacache.get.stream.byDigest(this.cache, this.integrity, this.opts) + const startTime = Date.now() + const stream = cacache.get.stream.byDigest(this.cache, this.integrity, this.opts) + const elapsedTime = Date.now() - startTime + // cache is good, so log it as a hit in particular since there was no fetch logged + log.http( + 'cache', + `${this.spec} ${elapsedTime}ms (cache hit)` + ) + return stream } get [_.cacheFetches] () { diff --git a/deps/npm/node_modules/pacote/package.json b/deps/npm/node_modules/pacote/package.json index 0eb8261af96e0c..71c9aa1ce32572 100644 --- a/deps/npm/node_modules/pacote/package.json +++ b/deps/npm/node_modules/pacote/package.json @@ -1,6 +1,6 @@ { "name": "pacote", - "version": "19.0.0", + "version": "19.0.1", "description": "JavaScript package downloader", "author": "GitHub Inc.", "bin": { @@ -59,7 +59,7 @@ "npm-registry-fetch": "^18.0.0", "proc-log": "^5.0.0", "promise-retry": "^2.0.1", - "sigstore": "^2.2.0", + "sigstore": "^3.0.0", "ssri": "^12.0.0", "tar": "^6.1.11" }, diff --git a/deps/npm/node_modules/promise-call-limit/dist/commonjs/index.js b/deps/npm/node_modules/promise-call-limit/dist/commonjs/index.js index 6ce5cfcef9559e..b32a85bb11aa39 100644 --- a/deps/npm/node_modules/promise-call-limit/dist/commonjs/index.js +++ b/deps/npm/node_modules/promise-call-limit/dist/commonjs/index.js @@ -29,8 +29,8 @@ const os = __importStar(require("node:os")); // cpus() cpus() can return an empty list if /proc is not mounted, use 1 in // this case /* c8 ignore start */ -const defLimit = 'availableParallelism' in os - ? Math.max(1, os.availableParallelism() - 1) +const defLimit = 'availableParallelism' in os ? + Math.max(1, os.availableParallelism() - 1) : Math.max(1, os.cpus().length - 1); const callLimit = (queue, { limit = defLimit, rejectLate } = {}) => new Promise((res, rej) => { let active = 0; diff --git a/deps/npm/node_modules/promise-call-limit/dist/esm/index.js b/deps/npm/node_modules/promise-call-limit/dist/esm/index.js index 030099929b3483..fe709db7fc04cc 100644 --- a/deps/npm/node_modules/promise-call-limit/dist/esm/index.js +++ b/deps/npm/node_modules/promise-call-limit/dist/esm/index.js @@ -3,8 +3,8 @@ import * as os from 'node:os'; // cpus() cpus() can return an empty list if /proc is not mounted, use 1 in // this case /* c8 ignore start */ -const defLimit = 'availableParallelism' in os - ? Math.max(1, os.availableParallelism() - 1) +const defLimit = 'availableParallelism' in os ? + Math.max(1, os.availableParallelism() - 1) : Math.max(1, os.cpus().length - 1); export const callLimit = (queue, { limit = defLimit, rejectLate } = {}) => new Promise((res, rej) => { let active = 0; diff --git a/deps/npm/node_modules/promise-call-limit/package.json b/deps/npm/node_modules/promise-call-limit/package.json index a3aa548d6538ac..ab14595366e223 100644 --- a/deps/npm/node_modules/promise-call-limit/package.json +++ b/deps/npm/node_modules/promise-call-limit/package.json @@ -1,6 +1,6 @@ { "name": "promise-call-limit", - "version": "3.0.1", + "version": "3.0.2", "files": [ "dist" ], @@ -18,16 +18,17 @@ "test": "tap", "preversion": "npm test", "postversion": "npm publish", - "prepublishOnly": "git push origin --follow-tags" + "prepublishOnly": "git push origin --follow-tags", + "format": "prettier --write . --log-level warn --cache" }, "devDependencies": { - "prettier": "^3.2.1", - "tap": "^18.6.1", - "tshy": "^1.8.2", - "format": "prettier --write . --loglevel warn --ignore-path ../../.prettierignore --cache", - "typedoc": "typedoc" + "prettier": "^3.3.3", + "tap": "^21.0.1", + "tshy": "^3.0.2", + "typedoc": "^0.26.6" }, "prettier": { + "experimentalTernaries": true, "semi": false, "printWidth": 70, "tabWidth": 2, @@ -62,5 +63,6 @@ }, "main": "./dist/commonjs/index.js", "types": "./dist/commonjs/index.d.ts", - "type": "module" + "type": "module", + "module": "./dist/esm/index.js" } diff --git a/deps/npm/node_modules/sigstore/dist/config.js b/deps/npm/node_modules/sigstore/dist/config.js index b4f0eea74fa4b4..e8b2392f97f236 100644 --- a/deps/npm/node_modules/sigstore/dist/config.js +++ b/deps/npm/node_modules/sigstore/dist/config.js @@ -1,6 +1,9 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.createVerificationPolicy = exports.createKeyFinder = exports.createBundleBuilder = exports.DEFAULT_TIMEOUT = exports.DEFAULT_RETRY = void 0; +exports.DEFAULT_TIMEOUT = exports.DEFAULT_RETRY = void 0; +exports.createBundleBuilder = createBundleBuilder; +exports.createKeyFinder = createKeyFinder; +exports.createVerificationPolicy = createVerificationPolicy; /* Copyright 2023 The Sigstore Authors. @@ -30,10 +33,12 @@ function createBundleBuilder(bundleType, options) { case 'messageSignature': return new sign_1.MessageSignatureBundleBuilder(bundlerOptions); case 'dsseEnvelope': - return new sign_1.DSSEBundleBuilder(bundlerOptions); + return new sign_1.DSSEBundleBuilder({ + ...bundlerOptions, + certificateChain: options.legacyCompatibility, + }); } } -exports.createBundleBuilder = createBundleBuilder; // Translates the public KeySelector type into the KeyFinderFunc type needed by // the verifier. function createKeyFinder(keySelector) { @@ -51,7 +56,6 @@ function createKeyFinder(keySelector) { }; }; } -exports.createKeyFinder = createKeyFinder; function createVerificationPolicy(options) { const policy = {}; const san = options.certificateIdentityEmail || options.certificateIdentityURI; @@ -63,7 +67,6 @@ function createVerificationPolicy(options) { } return policy; } -exports.createVerificationPolicy = createVerificationPolicy; // Instantiate the FulcioSigner based on the supplied options. function initSigner(options) { return new sign_1.FulcioSigner({ @@ -92,6 +95,7 @@ function initWitnesses(options) { if (isRekorEnabled(options)) { witnesses.push(new sign_1.RekorWitness({ rekorBaseURL: options.rekorURL, + entryType: options.legacyCompatibility ? 'intoto' : 'dsse', fetchOnConflict: false, retry: options.retry ?? exports.DEFAULT_RETRY, timeout: options.timeout ?? exports.DEFAULT_TIMEOUT, diff --git a/deps/npm/node_modules/sigstore/dist/sigstore.js b/deps/npm/node_modules/sigstore/dist/sigstore.js index 79d3440670cd50..c45524bbe21c22 100644 --- a/deps/npm/node_modules/sigstore/dist/sigstore.js +++ b/deps/npm/node_modules/sigstore/dist/sigstore.js @@ -23,7 +23,10 @@ var __importStar = (this && this.__importStar) || function (mod) { return result; }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.createVerifier = exports.verify = exports.attest = exports.sign = void 0; +exports.sign = sign; +exports.attest = attest; +exports.verify = verify; +exports.createVerifier = createVerifier; /* Copyright 2023 The Sigstore Authors. @@ -50,7 +53,6 @@ options = {}) { const bundle = await bundler.create({ data: payload }); return (0, bundle_1.bundleToJSON)(bundle); } -exports.sign = sign; async function attest(payload, payloadType, /* istanbul ignore next */ options = {}) { @@ -58,7 +60,6 @@ options = {}) { const bundle = await bundler.create({ data: payload, type: payloadType }); return (0, bundle_1.bundleToJSON)(bundle); } -exports.attest = attest; async function verify(bundle, dataOrOptions, options) { let data; if (Buffer.isBuffer(dataOrOptions)) { @@ -69,7 +70,6 @@ async function verify(bundle, dataOrOptions, options) { } return createVerifier(options).then((verifier) => verifier.verify(bundle, data)); } -exports.verify = verify; async function createVerifier( /* istanbul ignore next */ options = {}) { @@ -100,4 +100,3 @@ options = {}) { }, }; } -exports.createVerifier = createVerifier; diff --git a/deps/npm/node_modules/@sigstore/bundle/LICENSE b/deps/npm/node_modules/sigstore/node_modules/@sigstore/bundle/LICENSE similarity index 100% rename from deps/npm/node_modules/@sigstore/bundle/LICENSE rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/bundle/LICENSE diff --git a/deps/npm/node_modules/@sigstore/bundle/dist/build.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/bundle/dist/build.js similarity index 87% rename from deps/npm/node_modules/@sigstore/bundle/dist/build.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/bundle/dist/build.js index 65c71b100ad58f..ade736407554c6 100644 --- a/deps/npm/node_modules/@sigstore/bundle/dist/build.js +++ b/deps/npm/node_modules/sigstore/node_modules/@sigstore/bundle/dist/build.js @@ -1,6 +1,7 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.toDSSEBundle = exports.toMessageSignatureBundle = void 0; +exports.toMessageSignatureBundle = toMessageSignatureBundle; +exports.toDSSEBundle = toDSSEBundle; /* Copyright 2023 The Sigstore Authors. @@ -21,9 +22,9 @@ const bundle_1 = require("./bundle"); // Message signature bundle - $case: 'messageSignature' function toMessageSignatureBundle(options) { return { - mediaType: options.singleCertificate - ? bundle_1.BUNDLE_V03_MEDIA_TYPE - : bundle_1.BUNDLE_V02_MEDIA_TYPE, + mediaType: options.certificateChain + ? bundle_1.BUNDLE_V02_MEDIA_TYPE + : bundle_1.BUNDLE_V03_MEDIA_TYPE, content: { $case: 'messageSignature', messageSignature: { @@ -37,13 +38,12 @@ function toMessageSignatureBundle(options) { verificationMaterial: toVerificationMaterial(options), }; } -exports.toMessageSignatureBundle = toMessageSignatureBundle; // DSSE envelope bundle - $case: 'dsseEnvelope' function toDSSEBundle(options) { return { - mediaType: options.singleCertificate - ? bundle_1.BUNDLE_V03_MEDIA_TYPE - : bundle_1.BUNDLE_V02_MEDIA_TYPE, + mediaType: options.certificateChain + ? bundle_1.BUNDLE_V02_MEDIA_TYPE + : bundle_1.BUNDLE_V03_MEDIA_TYPE, content: { $case: 'dsseEnvelope', dsseEnvelope: toEnvelope(options), @@ -51,7 +51,6 @@ function toDSSEBundle(options) { verificationMaterial: toVerificationMaterial(options), }; } -exports.toDSSEBundle = toDSSEBundle; function toEnvelope(options) { return { payloadType: options.artifactType, @@ -75,13 +74,7 @@ function toVerificationMaterial(options) { } function toKeyContent(options) { if (options.certificate) { - if (options.singleCertificate) { - return { - $case: 'certificate', - certificate: { rawBytes: options.certificate }, - }; - } - else { + if (options.certificateChain) { return { $case: 'x509CertificateChain', x509CertificateChain: { @@ -89,6 +82,12 @@ function toKeyContent(options) { }, }; } + else { + return { + $case: 'certificate', + certificate: { rawBytes: options.certificate }, + }; + } } else { return { diff --git a/deps/npm/node_modules/sigstore/node_modules/@sigstore/bundle/dist/bundle.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/bundle/dist/bundle.js new file mode 100644 index 00000000000000..eb67a0ddc17bbb --- /dev/null +++ b/deps/npm/node_modules/sigstore/node_modules/@sigstore/bundle/dist/bundle.js @@ -0,0 +1,24 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BUNDLE_V03_MEDIA_TYPE = exports.BUNDLE_V03_LEGACY_MEDIA_TYPE = exports.BUNDLE_V02_MEDIA_TYPE = exports.BUNDLE_V01_MEDIA_TYPE = void 0; +exports.isBundleWithCertificateChain = isBundleWithCertificateChain; +exports.isBundleWithPublicKey = isBundleWithPublicKey; +exports.isBundleWithMessageSignature = isBundleWithMessageSignature; +exports.isBundleWithDsseEnvelope = isBundleWithDsseEnvelope; +exports.BUNDLE_V01_MEDIA_TYPE = 'application/vnd.dev.sigstore.bundle+json;version=0.1'; +exports.BUNDLE_V02_MEDIA_TYPE = 'application/vnd.dev.sigstore.bundle+json;version=0.2'; +exports.BUNDLE_V03_LEGACY_MEDIA_TYPE = 'application/vnd.dev.sigstore.bundle+json;version=0.3'; +exports.BUNDLE_V03_MEDIA_TYPE = 'application/vnd.dev.sigstore.bundle.v0.3+json'; +// Type guards for bundle variants. +function isBundleWithCertificateChain(b) { + return b.verificationMaterial.content.$case === 'x509CertificateChain'; +} +function isBundleWithPublicKey(b) { + return b.verificationMaterial.content.$case === 'publicKey'; +} +function isBundleWithMessageSignature(b) { + return b.content.$case === 'messageSignature'; +} +function isBundleWithDsseEnvelope(b) { + return b.content.$case === 'dsseEnvelope'; +} diff --git a/deps/npm/node_modules/@sigstore/bundle/dist/error.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/bundle/dist/error.js similarity index 100% rename from deps/npm/node_modules/@sigstore/bundle/dist/error.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/bundle/dist/error.js diff --git a/deps/npm/node_modules/@sigstore/bundle/dist/index.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/bundle/dist/index.js similarity index 100% rename from deps/npm/node_modules/@sigstore/bundle/dist/index.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/bundle/dist/index.js diff --git a/deps/npm/node_modules/@sigstore/bundle/dist/serialized.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/bundle/dist/serialized.js similarity index 100% rename from deps/npm/node_modules/@sigstore/bundle/dist/serialized.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/bundle/dist/serialized.js diff --git a/deps/npm/node_modules/@sigstore/bundle/dist/utility.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/bundle/dist/utility.js similarity index 100% rename from deps/npm/node_modules/@sigstore/bundle/dist/utility.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/bundle/dist/utility.js diff --git a/deps/npm/node_modules/@sigstore/bundle/dist/validate.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/bundle/dist/validate.js similarity index 98% rename from deps/npm/node_modules/@sigstore/bundle/dist/validate.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/bundle/dist/validate.js index 67079cd1f680a9..21b8b5ee293ba1 100644 --- a/deps/npm/node_modules/@sigstore/bundle/dist/validate.js +++ b/deps/npm/node_modules/sigstore/node_modules/@sigstore/bundle/dist/validate.js @@ -1,6 +1,10 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.assertBundleLatest = exports.assertBundleV02 = exports.isBundleV01 = exports.assertBundleV01 = exports.assertBundle = void 0; +exports.assertBundle = assertBundle; +exports.assertBundleV01 = assertBundleV01; +exports.isBundleV01 = isBundleV01; +exports.assertBundleV02 = assertBundleV02; +exports.assertBundleLatest = assertBundleLatest; /* Copyright 2023 The Sigstore Authors. @@ -27,7 +31,6 @@ function assertBundle(b) { throw new error_1.ValidationError('invalid bundle', invalidValues); } } -exports.assertBundle = assertBundle; // Asserts that the given bundle conforms to the v0.1 bundle format. function assertBundleV01(b) { const invalidValues = []; @@ -37,7 +40,6 @@ function assertBundleV01(b) { throw new error_1.ValidationError('invalid v0.1 bundle', invalidValues); } } -exports.assertBundleV01 = assertBundleV01; // Type guard to determine if Bundle is a v0.1 bundle. function isBundleV01(b) { try { @@ -48,7 +50,6 @@ function isBundleV01(b) { return false; } } -exports.isBundleV01 = isBundleV01; // Asserts that the given bundle conforms to the v0.2 bundle format. function assertBundleV02(b) { const invalidValues = []; @@ -58,7 +59,6 @@ function assertBundleV02(b) { throw new error_1.ValidationError('invalid v0.2 bundle', invalidValues); } } -exports.assertBundleV02 = assertBundleV02; // Asserts that the given bundle conforms to the newest (0.3) bundle format. function assertBundleLatest(b) { const invalidValues = []; @@ -69,7 +69,6 @@ function assertBundleLatest(b) { throw new error_1.ValidationError('invalid bundle', invalidValues); } } -exports.assertBundleLatest = assertBundleLatest; function validateBundleBase(b) { const invalidValues = []; // Media type validation @@ -192,6 +191,7 @@ function validateInclusionProof(b) { // Necessary for V03 and later bundles function validateNoCertificateChain(b) { const invalidValues = []; + /* istanbul ignore next */ if (b.verificationMaterial?.content?.$case === 'x509CertificateChain') { invalidValues.push('verificationMaterial.content.$case'); } diff --git a/deps/npm/node_modules/sigstore/node_modules/@sigstore/bundle/package.json b/deps/npm/node_modules/sigstore/node_modules/@sigstore/bundle/package.json new file mode 100644 index 00000000000000..ee5d2b92b801a5 --- /dev/null +++ b/deps/npm/node_modules/sigstore/node_modules/@sigstore/bundle/package.json @@ -0,0 +1,35 @@ +{ + "name": "@sigstore/bundle", + "version": "3.0.0", + "description": "Sigstore bundle type", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "scripts": { + "clean": "shx rm -rf dist *.tsbuildinfo", + "build": "tsc --build", + "test": "jest" + }, + "files": [ + "dist", + "store" + ], + "author": "bdehamer@github.com", + "license": "Apache-2.0", + "repository": { + "type": "git", + "url": "git+https://github.com/sigstore/sigstore-js.git" + }, + "bugs": { + "url": "https://github.com/sigstore/sigstore-js/issues" + }, + "homepage": "https://github.com/sigstore/sigstore-js/tree/main/packages/bundle#readme", + "publishConfig": { + "provenance": true + }, + "dependencies": { + "@sigstore/protobuf-specs": "^0.3.2" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } +} diff --git a/deps/npm/node_modules/@sigstore/core/LICENSE b/deps/npm/node_modules/sigstore/node_modules/@sigstore/core/LICENSE similarity index 100% rename from deps/npm/node_modules/@sigstore/core/LICENSE rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/core/LICENSE diff --git a/deps/npm/node_modules/@sigstore/core/dist/asn1/error.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/asn1/error.js similarity index 100% rename from deps/npm/node_modules/@sigstore/core/dist/asn1/error.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/asn1/error.js diff --git a/deps/npm/node_modules/@sigstore/core/dist/asn1/index.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/asn1/index.js similarity index 100% rename from deps/npm/node_modules/@sigstore/core/dist/asn1/index.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/asn1/index.js diff --git a/deps/npm/node_modules/@sigstore/core/dist/asn1/length.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/asn1/length.js similarity index 97% rename from deps/npm/node_modules/@sigstore/core/dist/asn1/length.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/asn1/length.js index 36fdaf5b9777fd..cb7ebf09dbefa4 100644 --- a/deps/npm/node_modules/@sigstore/core/dist/asn1/length.js +++ b/deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/asn1/length.js @@ -15,7 +15,8 @@ See the License for the specific language governing permissions and limitations under the License. */ Object.defineProperty(exports, "__esModule", { value: true }); -exports.encodeLength = exports.decodeLength = void 0; +exports.decodeLength = decodeLength; +exports.encodeLength = encodeLength; const error_1 = require("./error"); // Decodes the length of a DER-encoded ANS.1 element from the supplied stream. // https://learn.microsoft.com/en-us/windows/win32/seccertenroll/about-encoded-length-and-value-bytes @@ -44,7 +45,6 @@ function decodeLength(stream) { } return len; } -exports.decodeLength = decodeLength; // Translates the supplied value to a DER-encoded length. function encodeLength(len) { if (len < 128) { @@ -60,4 +60,3 @@ function encodeLength(len) { } return Buffer.from([0x80 | bytes.length, ...bytes]); } -exports.encodeLength = encodeLength; diff --git a/deps/npm/node_modules/@sigstore/core/dist/asn1/obj.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/asn1/obj.js similarity index 100% rename from deps/npm/node_modules/@sigstore/core/dist/asn1/obj.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/asn1/obj.js diff --git a/deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/asn1/parse.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/asn1/parse.js new file mode 100644 index 00000000000000..7fbb42632c60e8 --- /dev/null +++ b/deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/asn1/parse.js @@ -0,0 +1,124 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parseInteger = parseInteger; +exports.parseStringASCII = parseStringASCII; +exports.parseTime = parseTime; +exports.parseOID = parseOID; +exports.parseBoolean = parseBoolean; +exports.parseBitString = parseBitString; +/* +Copyright 2023 The Sigstore Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +const RE_TIME_SHORT_YEAR = /^(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\.\d{3})?Z$/; +const RE_TIME_LONG_YEAR = /^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\.\d{3})?Z$/; +// Parse a BigInt from the DER-encoded buffer +// https://learn.microsoft.com/en-us/windows/win32/seccertenroll/about-integer +function parseInteger(buf) { + let pos = 0; + const end = buf.length; + let val = buf[pos]; + const neg = val > 0x7f; + // Consume any padding bytes + const pad = neg ? 0xff : 0x00; + while (val == pad && ++pos < end) { + val = buf[pos]; + } + // Calculate remaining bytes to read + const len = end - pos; + if (len === 0) + return BigInt(neg ? -1 : 0); + // Handle two's complement for negative numbers + val = neg ? val - 256 : val; + // Parse remaining bytes + let n = BigInt(val); + for (let i = pos + 1; i < end; ++i) { + n = n * BigInt(256) + BigInt(buf[i]); + } + return n; +} +// Parse an ASCII string from the DER-encoded buffer +// https://learn.microsoft.com/en-us/windows/win32/seccertenroll/about-basic-types#boolean +function parseStringASCII(buf) { + return buf.toString('ascii'); +} +// Parse a Date from the DER-encoded buffer +// https://www.rfc-editor.org/rfc/rfc5280#section-4.1.2.5.1 +function parseTime(buf, shortYear) { + const timeStr = parseStringASCII(buf); + // Parse the time string into matches - captured groups start at index 1 + const m = shortYear + ? RE_TIME_SHORT_YEAR.exec(timeStr) + : RE_TIME_LONG_YEAR.exec(timeStr); + if (!m) { + throw new Error('invalid time'); + } + // Translate dates with a 2-digit year to 4 digits per the spec + if (shortYear) { + let year = Number(m[1]); + year += year >= 50 ? 1900 : 2000; + m[1] = year.toString(); + } + // Translate to ISO8601 format and parse + return new Date(`${m[1]}-${m[2]}-${m[3]}T${m[4]}:${m[5]}:${m[6]}Z`); +} +// Parse an OID from the DER-encoded buffer +// https://learn.microsoft.com/en-us/windows/win32/seccertenroll/about-object-identifier +function parseOID(buf) { + let pos = 0; + const end = buf.length; + // Consume first byte which encodes the first two OID components + let n = buf[pos++]; + const first = Math.floor(n / 40); + const second = n % 40; + let oid = `${first}.${second}`; + // Consume remaining bytes + let val = 0; + for (; pos < end; ++pos) { + n = buf[pos]; + val = (val << 7) + (n & 0x7f); + // If the left-most bit is NOT set, then this is the last byte in the + // sequence and we can add the value to the OID and reset the accumulator + if ((n & 0x80) === 0) { + oid += `.${val}`; + val = 0; + } + } + return oid; +} +// Parse a boolean from the DER-encoded buffer +// https://learn.microsoft.com/en-us/windows/win32/seccertenroll/about-basic-types#boolean +function parseBoolean(buf) { + return buf[0] !== 0; +} +// Parse a bit string from the DER-encoded buffer +// https://learn.microsoft.com/en-us/windows/win32/seccertenroll/about-bit-string +function parseBitString(buf) { + // First byte tell us how many unused bits are in the last byte + const unused = buf[0]; + const start = 1; + const end = buf.length; + const bits = []; + for (let i = start; i < end; ++i) { + const byte = buf[i]; + // The skip value is only used for the last byte + const skip = i === end - 1 ? unused : 0; + // Iterate over each bit in the byte (most significant first) + for (let j = 7; j >= skip; --j) { + // Read the bit and add it to the bit string + bits.push((byte >> j) & 0x01); + } + } + return bits; +} diff --git a/deps/npm/node_modules/@sigstore/core/dist/asn1/tag.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/asn1/tag.js similarity index 100% rename from deps/npm/node_modules/@sigstore/core/dist/asn1/tag.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/asn1/tag.js diff --git a/deps/npm/node_modules/@sigstore/core/dist/crypto.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/crypto.js similarity index 83% rename from deps/npm/node_modules/@sigstore/core/dist/crypto.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/crypto.js index dbe65b165d3574..296b5ba43e86a0 100644 --- a/deps/npm/node_modules/@sigstore/core/dist/crypto.js +++ b/deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/crypto.js @@ -3,7 +3,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.bufferEqual = exports.verify = exports.hash = exports.digest = exports.createPublicKey = void 0; +exports.createPublicKey = createPublicKey; +exports.digest = digest; +exports.verify = verify; +exports.bufferEqual = bufferEqual; /* Copyright 2023 The Sigstore Authors. @@ -20,7 +23,6 @@ See the License for the specific language governing permissions and limitations under the License. */ const crypto_1 = __importDefault(require("crypto")); -const SHA256_ALGORITHM = 'sha256'; function createPublicKey(key, type = 'spki') { if (typeof key === 'string') { return crypto_1.default.createPublicKey(key); @@ -29,7 +31,6 @@ function createPublicKey(key, type = 'spki') { return crypto_1.default.createPublicKey({ key, format: 'der', type: type }); } } -exports.createPublicKey = createPublicKey; function digest(algorithm, ...data) { const hash = crypto_1.default.createHash(algorithm); for (const d of data) { @@ -37,16 +38,6 @@ function digest(algorithm, ...data) { } return hash.digest(); } -exports.digest = digest; -// TODO: deprecate this in favor of digest() -function hash(...data) { - const hash = crypto_1.default.createHash(SHA256_ALGORITHM); - for (const d of data) { - hash.update(d); - } - return hash.digest(); -} -exports.hash = hash; function verify(data, key, signature, algorithm) { // The try/catch is to work around an issue in Node 14.x where verify throws // an error in some scenarios if the signature is invalid. @@ -58,7 +49,6 @@ function verify(data, key, signature, algorithm) { return false; } } -exports.verify = verify; function bufferEqual(a, b) { try { return crypto_1.default.timingSafeEqual(a, b); @@ -68,4 +58,3 @@ function bufferEqual(a, b) { return false; } } -exports.bufferEqual = bufferEqual; diff --git a/deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/dsse.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/dsse.js new file mode 100644 index 00000000000000..ca7b63630e2ba9 --- /dev/null +++ b/deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/dsse.js @@ -0,0 +1,30 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.preAuthEncoding = preAuthEncoding; +/* +Copyright 2023 The Sigstore Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +const PAE_PREFIX = 'DSSEv1'; +// DSSE Pre-Authentication Encoding +function preAuthEncoding(payloadType, payload) { + const prefix = [ + PAE_PREFIX, + payloadType.length, + payloadType, + payload.length, + '', + ].join(' '); + return Buffer.concat([Buffer.from(prefix, 'ascii'), payload]); +} diff --git a/deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/encoding.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/encoding.js new file mode 100644 index 00000000000000..7113af66db4c2d --- /dev/null +++ b/deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/encoding.js @@ -0,0 +1,27 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.base64Encode = base64Encode; +exports.base64Decode = base64Decode; +/* +Copyright 2023 The Sigstore Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +const BASE64_ENCODING = 'base64'; +const UTF8_ENCODING = 'utf-8'; +function base64Encode(str) { + return Buffer.from(str, UTF8_ENCODING).toString(BASE64_ENCODING); +} +function base64Decode(str) { + return Buffer.from(str, BASE64_ENCODING).toString(UTF8_ENCODING); +} diff --git a/deps/npm/node_modules/@sigstore/core/dist/index.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/index.js similarity index 100% rename from deps/npm/node_modules/@sigstore/core/dist/index.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/index.js diff --git a/deps/npm/node_modules/@sigstore/core/dist/json.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/json.js similarity index 98% rename from deps/npm/node_modules/@sigstore/core/dist/json.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/json.js index a50df7233c7c58..7808d033b98cc9 100644 --- a/deps/npm/node_modules/@sigstore/core/dist/json.js +++ b/deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/json.js @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. */ Object.defineProperty(exports, "__esModule", { value: true }); -exports.canonicalize = void 0; +exports.canonicalize = canonicalize; // JSON canonicalization per https://github.com/cyberphone/json-canonicalization // eslint-disable-next-line @typescript-eslint/no-explicit-any function canonicalize(object) { @@ -58,4 +58,3 @@ function canonicalize(object) { } return buffer; } -exports.canonicalize = canonicalize; diff --git a/deps/npm/node_modules/@sigstore/core/dist/oid.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/oid.js similarity index 100% rename from deps/npm/node_modules/@sigstore/core/dist/oid.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/oid.js diff --git a/deps/npm/node_modules/@sigstore/core/dist/pem.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/pem.js similarity index 97% rename from deps/npm/node_modules/@sigstore/core/dist/pem.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/pem.js index f35bc3835bbd10..f1241d28d586ec 100644 --- a/deps/npm/node_modules/@sigstore/core/dist/pem.js +++ b/deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/pem.js @@ -1,6 +1,7 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.fromDER = exports.toDER = void 0; +exports.toDER = toDER; +exports.fromDER = fromDER; /* Copyright 2023 The Sigstore Authors. @@ -28,7 +29,6 @@ function toDER(certificate) { }); return Buffer.from(der, 'base64'); } -exports.toDER = toDER; // Translates a DER-encoded buffer into a PEM-encoded string. Standard PEM // encoding dictates that each certificate should have a trailing newline after // the footer. @@ -41,4 +41,3 @@ function fromDER(certificate, type = 'CERTIFICATE') { .join('\n') .concat('\n'); } -exports.fromDER = fromDER; diff --git a/deps/npm/node_modules/@sigstore/core/dist/rfc3161/error.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/rfc3161/error.js similarity index 100% rename from deps/npm/node_modules/@sigstore/core/dist/rfc3161/error.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/rfc3161/error.js diff --git a/deps/npm/node_modules/@sigstore/core/dist/rfc3161/index.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/rfc3161/index.js similarity index 100% rename from deps/npm/node_modules/@sigstore/core/dist/rfc3161/index.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/rfc3161/index.js diff --git a/deps/npm/node_modules/@sigstore/core/dist/rfc3161/timestamp.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/rfc3161/timestamp.js similarity index 100% rename from deps/npm/node_modules/@sigstore/core/dist/rfc3161/timestamp.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/rfc3161/timestamp.js diff --git a/deps/npm/node_modules/@sigstore/core/dist/rfc3161/tstinfo.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/rfc3161/tstinfo.js similarity index 100% rename from deps/npm/node_modules/@sigstore/core/dist/rfc3161/tstinfo.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/rfc3161/tstinfo.js diff --git a/deps/npm/node_modules/@sigstore/core/dist/stream.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/stream.js similarity index 100% rename from deps/npm/node_modules/@sigstore/core/dist/stream.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/stream.js diff --git a/deps/npm/node_modules/@sigstore/core/dist/x509/cert.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/x509/cert.js similarity index 96% rename from deps/npm/node_modules/@sigstore/core/dist/x509/cert.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/x509/cert.js index 16c0c40d858d8a..72ea8e0738bc83 100644 --- a/deps/npm/node_modules/@sigstore/core/dist/x509/cert.js +++ b/deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/x509/cert.js @@ -97,13 +97,15 @@ class X509Certificate { } get subjectAltName() { const ext = this.extSubjectAltName; - return ext?.uri || ext?.rfc822Name; + return ext?.uri || /* istanbul ignore next */ ext?.rfc822Name; } get extensions() { // The extension list is the first (and only) element of the extensions // context specific tag + /* istanbul ignore next */ const extSeq = this.extensionsObj?.subs[0]; - return extSeq?.subs || /* istanbul ignore next */ []; + /* istanbul ignore next */ + return extSeq?.subs || []; } get extKeyUsage() { const ext = this.findExtension(EXTENSION_OID_KEY_USAGE); @@ -135,8 +137,10 @@ class X509Certificate { const ca = this.extBasicConstraints?.isCA || false; // If the KeyUsage extension is present, keyCertSign must be set if (this.extKeyUsage) { - ca && this.extKeyUsage.keyCertSign; + return ca && this.extKeyUsage.keyCertSign; } + // TODO: test coverage for this case + /* istanbul ignore next */ return ca; } extension(oid) { diff --git a/deps/npm/node_modules/@sigstore/core/dist/x509/ext.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/x509/ext.js similarity index 100% rename from deps/npm/node_modules/@sigstore/core/dist/x509/ext.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/x509/ext.js diff --git a/deps/npm/node_modules/@sigstore/core/dist/x509/index.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/x509/index.js similarity index 100% rename from deps/npm/node_modules/@sigstore/core/dist/x509/index.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/x509/index.js diff --git a/deps/npm/node_modules/@sigstore/core/dist/x509/sct.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/x509/sct.js similarity index 100% rename from deps/npm/node_modules/@sigstore/core/dist/x509/sct.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/core/dist/x509/sct.js diff --git a/deps/npm/node_modules/sigstore/node_modules/@sigstore/core/package.json b/deps/npm/node_modules/sigstore/node_modules/@sigstore/core/package.json new file mode 100644 index 00000000000000..af5dd281ac90e4 --- /dev/null +++ b/deps/npm/node_modules/sigstore/node_modules/@sigstore/core/package.json @@ -0,0 +1,31 @@ +{ + "name": "@sigstore/core", + "version": "2.0.0", + "description": "Base library for Sigstore", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "scripts": { + "clean": "shx rm -rf dist *.tsbuildinfo", + "build": "tsc --build", + "test": "jest" + }, + "files": [ + "dist" + ], + "author": "bdehamer@github.com", + "license": "Apache-2.0", + "repository": { + "type": "git", + "url": "git+https://github.com/sigstore/sigstore-js.git" + }, + "bugs": { + "url": "https://github.com/sigstore/sigstore-js/issues" + }, + "homepage": "https://github.com/sigstore/sigstore-js/tree/main/packages/core#readme", + "publishConfig": { + "provenance": true + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } +} diff --git a/deps/npm/node_modules/@sigstore/sign/LICENSE b/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/LICENSE similarity index 100% rename from deps/npm/node_modules/@sigstore/sign/LICENSE rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/LICENSE diff --git a/deps/npm/node_modules/@sigstore/sign/dist/bundler/base.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/bundler/base.js similarity index 100% rename from deps/npm/node_modules/@sigstore/sign/dist/bundler/base.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/bundler/base.js diff --git a/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/bundler/bundle.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/bundler/bundle.js new file mode 100644 index 00000000000000..ed32286ad88efd --- /dev/null +++ b/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/bundler/bundle.js @@ -0,0 +1,71 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.toMessageSignatureBundle = toMessageSignatureBundle; +exports.toDSSEBundle = toDSSEBundle; +/* +Copyright 2023 The Sigstore Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +const sigstore = __importStar(require("@sigstore/bundle")); +const util_1 = require("../util"); +// Helper functions for assembling the parts of a Sigstore bundle +// Message signature bundle - $case: 'messageSignature' +function toMessageSignatureBundle(artifact, signature) { + const digest = util_1.crypto.digest('sha256', artifact.data); + return sigstore.toMessageSignatureBundle({ + digest, + signature: signature.signature, + certificate: signature.key.$case === 'x509Certificate' + ? util_1.pem.toDER(signature.key.certificate) + : undefined, + keyHint: signature.key.$case === 'publicKey' ? signature.key.hint : undefined, + certificateChain: true, + }); +} +// DSSE envelope bundle - $case: 'dsseEnvelope' +function toDSSEBundle(artifact, signature, certificateChain) { + return sigstore.toDSSEBundle({ + artifact: artifact.data, + artifactType: artifact.type, + signature: signature.signature, + certificate: signature.key.$case === 'x509Certificate' + ? util_1.pem.toDER(signature.key.certificate) + : undefined, + keyHint: signature.key.$case === 'publicKey' ? signature.key.hint : undefined, + certificateChain, + }); +} diff --git a/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/bundler/dsse.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/bundler/dsse.js new file mode 100644 index 00000000000000..86046ba8f3013b --- /dev/null +++ b/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/bundler/dsse.js @@ -0,0 +1,46 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DSSEBundleBuilder = void 0; +/* +Copyright 2023 The Sigstore Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +const util_1 = require("../util"); +const base_1 = require("./base"); +const bundle_1 = require("./bundle"); +// BundleBuilder implementation for DSSE wrapped attestations +class DSSEBundleBuilder extends base_1.BaseBundleBuilder { + constructor(options) { + super(options); + this.certificateChain = options.certificateChain ?? false; + } + // DSSE requires the artifact to be pre-encoded with the payload type + // before the signature is generated. + async prepare(artifact) { + const a = artifactDefaults(artifact); + return util_1.dsse.preAuthEncoding(a.type, a.data); + } + // Packages the artifact and signature into a DSSE bundle + async package(artifact, signature) { + return (0, bundle_1.toDSSEBundle)(artifactDefaults(artifact), signature, this.certificateChain); + } +} +exports.DSSEBundleBuilder = DSSEBundleBuilder; +// Defaults the artifact type to an empty string if not provided +function artifactDefaults(artifact) { + return { + ...artifact, + type: artifact.type ?? '', + }; +} diff --git a/deps/npm/node_modules/@sigstore/sign/dist/bundler/index.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/bundler/index.js similarity index 100% rename from deps/npm/node_modules/@sigstore/sign/dist/bundler/index.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/bundler/index.js diff --git a/deps/npm/node_modules/@sigstore/sign/dist/bundler/message.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/bundler/message.js similarity index 100% rename from deps/npm/node_modules/@sigstore/sign/dist/bundler/message.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/bundler/message.js diff --git a/deps/npm/node_modules/@sigstore/sign/dist/error.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/error.js similarity index 95% rename from deps/npm/node_modules/@sigstore/sign/dist/error.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/error.js index d57e4567fb89ee..d28f1913cc77e9 100644 --- a/deps/npm/node_modules/@sigstore/sign/dist/error.js +++ b/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/error.js @@ -15,7 +15,8 @@ See the License for the specific language governing permissions and limitations under the License. */ Object.defineProperty(exports, "__esModule", { value: true }); -exports.internalError = exports.InternalError = void 0; +exports.InternalError = void 0; +exports.internalError = internalError; const error_1 = require("./external/error"); class InternalError extends Error { constructor({ code, message, cause, }) { @@ -36,4 +37,3 @@ function internalError(err, code, message) { cause: err, }); } -exports.internalError = internalError; diff --git a/deps/npm/node_modules/@sigstore/sign/dist/external/error.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/external/error.js similarity index 100% rename from deps/npm/node_modules/@sigstore/sign/dist/external/error.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/external/error.js diff --git a/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/external/fetch.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/external/fetch.js new file mode 100644 index 00000000000000..116090f3c641ef --- /dev/null +++ b/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/external/fetch.js @@ -0,0 +1,98 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.fetchWithRetry = fetchWithRetry; +/* +Copyright 2023 The Sigstore Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +const http2_1 = require("http2"); +const make_fetch_happen_1 = __importDefault(require("make-fetch-happen")); +const proc_log_1 = require("proc-log"); +const promise_retry_1 = __importDefault(require("promise-retry")); +const util_1 = require("../util"); +const error_1 = require("./error"); +const { HTTP2_HEADER_LOCATION, HTTP2_HEADER_CONTENT_TYPE, HTTP2_HEADER_USER_AGENT, HTTP_STATUS_INTERNAL_SERVER_ERROR, HTTP_STATUS_TOO_MANY_REQUESTS, HTTP_STATUS_REQUEST_TIMEOUT, } = http2_1.constants; +async function fetchWithRetry(url, options) { + return (0, promise_retry_1.default)(async (retry, attemptNum) => { + const method = options.method || 'POST'; + const headers = { + [HTTP2_HEADER_USER_AGENT]: util_1.ua.getUserAgent(), + ...options.headers, + }; + const response = await (0, make_fetch_happen_1.default)(url, { + method, + headers, + body: options.body, + timeout: options.timeout, + retry: false, // We're handling retries ourselves + }).catch((reason) => { + proc_log_1.log.http('fetch', `${method} ${url} attempt ${attemptNum} failed with ${reason}`); + return retry(reason); + }); + if (response.ok) { + return response; + } + else { + const error = await errorFromResponse(response); + proc_log_1.log.http('fetch', `${method} ${url} attempt ${attemptNum} failed with ${response.status}`); + if (retryable(response.status)) { + return retry(error); + } + else { + throw error; + } + } + }, retryOpts(options.retry)); +} +// Translate a Response into an HTTPError instance. This will attempt to parse +// the response body for a message, but will default to the statusText if none +// is found. +const errorFromResponse = async (response) => { + let message = response.statusText; + const location = response.headers.get(HTTP2_HEADER_LOCATION) || undefined; + const contentType = response.headers.get(HTTP2_HEADER_CONTENT_TYPE); + // If response type is JSON, try to parse the body for a message + if (contentType?.includes('application/json')) { + try { + const body = await response.json(); + message = body.message || message; + } + catch (e) { + // ignore + } + } + return new error_1.HTTPError({ + status: response.status, + message: message, + location: location, + }); +}; +// Determine if a status code is retryable. This includes 5xx errors, 408, and +// 429. +const retryable = (status) => [HTTP_STATUS_REQUEST_TIMEOUT, HTTP_STATUS_TOO_MANY_REQUESTS].includes(status) || status >= HTTP_STATUS_INTERNAL_SERVER_ERROR; +// Normalize the retry options to the format expected by promise-retry +const retryOpts = (retry) => { + if (typeof retry === 'boolean') { + return { retries: retry ? 1 : 0 }; + } + else if (typeof retry === 'number') { + return { retries: retry }; + } + else { + return { retries: 0, ...retry }; + } +}; diff --git a/deps/npm/node_modules/@sigstore/sign/dist/external/fulcio.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/external/fulcio.js similarity index 100% rename from deps/npm/node_modules/@sigstore/sign/dist/external/fulcio.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/external/fulcio.js diff --git a/deps/npm/node_modules/@sigstore/sign/dist/external/rekor.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/external/rekor.js similarity index 100% rename from deps/npm/node_modules/@sigstore/sign/dist/external/rekor.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/external/rekor.js diff --git a/deps/npm/node_modules/@sigstore/sign/dist/external/tsa.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/external/tsa.js similarity index 100% rename from deps/npm/node_modules/@sigstore/sign/dist/external/tsa.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/external/tsa.js diff --git a/deps/npm/node_modules/@sigstore/sign/dist/identity/ci.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/identity/ci.js similarity index 100% rename from deps/npm/node_modules/@sigstore/sign/dist/identity/ci.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/identity/ci.js diff --git a/deps/npm/node_modules/@sigstore/sign/dist/identity/index.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/identity/index.js similarity index 100% rename from deps/npm/node_modules/@sigstore/sign/dist/identity/index.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/identity/index.js diff --git a/deps/npm/node_modules/@sigstore/sign/dist/identity/provider.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/identity/provider.js similarity index 100% rename from deps/npm/node_modules/@sigstore/sign/dist/identity/provider.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/identity/provider.js diff --git a/deps/npm/node_modules/@sigstore/sign/dist/index.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/index.js similarity index 100% rename from deps/npm/node_modules/@sigstore/sign/dist/index.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/index.js diff --git a/deps/npm/node_modules/@sigstore/sign/dist/signer/fulcio/ca.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/signer/fulcio/ca.js similarity index 96% rename from deps/npm/node_modules/@sigstore/sign/dist/signer/fulcio/ca.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/signer/fulcio/ca.js index 81b421eabadb2e..f01703cfab5645 100644 --- a/deps/npm/node_modules/@sigstore/sign/dist/signer/fulcio/ca.js +++ b/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/signer/fulcio/ca.js @@ -35,7 +35,6 @@ class CAClient { const cert = resp.signedCertificateEmbeddedSct ? resp.signedCertificateEmbeddedSct : resp.signedCertificateDetachedSct; - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion return cert.chain.certificates; } catch (err) { diff --git a/deps/npm/node_modules/@sigstore/sign/dist/signer/fulcio/ephemeral.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/signer/fulcio/ephemeral.js similarity index 100% rename from deps/npm/node_modules/@sigstore/sign/dist/signer/fulcio/ephemeral.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/signer/fulcio/ephemeral.js diff --git a/deps/npm/node_modules/@sigstore/sign/dist/signer/fulcio/index.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/signer/fulcio/index.js similarity index 100% rename from deps/npm/node_modules/@sigstore/sign/dist/signer/fulcio/index.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/signer/fulcio/index.js diff --git a/deps/npm/node_modules/@sigstore/sign/dist/signer/index.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/signer/index.js similarity index 100% rename from deps/npm/node_modules/@sigstore/sign/dist/signer/index.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/signer/index.js diff --git a/deps/npm/node_modules/@sigstore/sign/dist/signer/signer.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/signer/signer.js similarity index 100% rename from deps/npm/node_modules/@sigstore/sign/dist/signer/signer.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/signer/signer.js diff --git a/deps/npm/node_modules/@sigstore/sign/dist/types/fetch.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/types/fetch.js similarity index 100% rename from deps/npm/node_modules/@sigstore/sign/dist/types/fetch.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/types/fetch.js diff --git a/deps/npm/node_modules/@sigstore/sign/dist/util/index.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/util/index.js similarity index 100% rename from deps/npm/node_modules/@sigstore/sign/dist/util/index.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/util/index.js diff --git a/deps/npm/node_modules/@sigstore/sign/dist/util/oidc.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/util/oidc.js similarity index 96% rename from deps/npm/node_modules/@sigstore/sign/dist/util/oidc.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/util/oidc.js index 2f5947d7b6b878..37c5b168ee12e6 100644 --- a/deps/npm/node_modules/@sigstore/sign/dist/util/oidc.js +++ b/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/util/oidc.js @@ -1,6 +1,6 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.extractJWTSubject = void 0; +exports.extractJWTSubject = extractJWTSubject; /* Copyright 2023 The Sigstore Authors. @@ -28,4 +28,3 @@ function extractJWTSubject(jwt) { return payload.sub; } } -exports.extractJWTSubject = extractJWTSubject; diff --git a/deps/npm/node_modules/@sigstore/sign/dist/util/ua.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/util/ua.js similarity index 95% rename from deps/npm/node_modules/@sigstore/sign/dist/util/ua.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/util/ua.js index c142330eb8338c..b15ff2070fb9fc 100644 --- a/deps/npm/node_modules/@sigstore/sign/dist/util/ua.js +++ b/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/util/ua.js @@ -23,7 +23,6 @@ const os_1 = __importDefault(require("os")); // Format User-Agent: / () // source: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent const getUserAgent = () => { - // eslint-disable-next-line @typescript-eslint/no-var-requires const packageVersion = require('../../package.json').version; const nodeVersion = process.version; const platformName = os_1.default.platform(); diff --git a/deps/npm/node_modules/@sigstore/sign/dist/witness/index.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/witness/index.js similarity index 100% rename from deps/npm/node_modules/@sigstore/sign/dist/witness/index.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/witness/index.js diff --git a/deps/npm/node_modules/@sigstore/sign/dist/witness/tlog/client.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/witness/tlog/client.js similarity index 100% rename from deps/npm/node_modules/@sigstore/sign/dist/witness/tlog/client.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/witness/tlog/client.js diff --git a/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/witness/tlog/entry.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/witness/tlog/entry.js new file mode 100644 index 00000000000000..69a3b477e54429 --- /dev/null +++ b/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/witness/tlog/entry.js @@ -0,0 +1,140 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.toProposedEntry = toProposedEntry; +/* +Copyright 2023 The Sigstore Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +const bundle_1 = require("@sigstore/bundle"); +const util_1 = require("../../util"); +const SHA256_ALGORITHM = 'sha256'; +function toProposedEntry(content, publicKey, +// TODO: Remove this parameter once have completely switched to 'dsse' entries +entryType = 'dsse') { + switch (content.$case) { + case 'dsseEnvelope': + // TODO: Remove this conditional once have completely ditched "intoto" entries + if (entryType === 'intoto') { + return toProposedIntotoEntry(content.dsseEnvelope, publicKey); + } + return toProposedDSSEEntry(content.dsseEnvelope, publicKey); + case 'messageSignature': + return toProposedHashedRekordEntry(content.messageSignature, publicKey); + } +} +// Returns a properly formatted Rekor "hashedrekord" entry for the given digest +// and signature +function toProposedHashedRekordEntry(messageSignature, publicKey) { + const hexDigest = messageSignature.messageDigest.digest.toString('hex'); + const b64Signature = messageSignature.signature.toString('base64'); + const b64Key = util_1.encoding.base64Encode(publicKey); + return { + apiVersion: '0.0.1', + kind: 'hashedrekord', + spec: { + data: { + hash: { + algorithm: SHA256_ALGORITHM, + value: hexDigest, + }, + }, + signature: { + content: b64Signature, + publicKey: { + content: b64Key, + }, + }, + }, + }; +} +// Returns a properly formatted Rekor "dsse" entry for the given DSSE envelope +// and signature +function toProposedDSSEEntry(envelope, publicKey) { + const envelopeJSON = JSON.stringify((0, bundle_1.envelopeToJSON)(envelope)); + const encodedKey = util_1.encoding.base64Encode(publicKey); + return { + apiVersion: '0.0.1', + kind: 'dsse', + spec: { + proposedContent: { + envelope: envelopeJSON, + verifiers: [encodedKey], + }, + }, + }; +} +// Returns a properly formatted Rekor "intoto" entry for the given DSSE +// envelope and signature +function toProposedIntotoEntry(envelope, publicKey) { + // Calculate the value for the payloadHash field in the Rekor entry + const payloadHash = util_1.crypto + .digest(SHA256_ALGORITHM, envelope.payload) + .toString('hex'); + // Calculate the value for the hash field in the Rekor entry + const envelopeHash = calculateDSSEHash(envelope, publicKey); + // Collect values for re-creating the DSSE envelope. + // Double-encode payload and signature cause that's what Rekor expects + const payload = util_1.encoding.base64Encode(envelope.payload.toString('base64')); + const sig = util_1.encoding.base64Encode(envelope.signatures[0].sig.toString('base64')); + const keyid = envelope.signatures[0].keyid; + const encodedKey = util_1.encoding.base64Encode(publicKey); + // Create the envelope portion of the entry. Note the inclusion of the + // publicKey in the signature struct is not a standard part of a DSSE + // envelope, but is required by Rekor. + const dsse = { + payloadType: envelope.payloadType, + payload: payload, + signatures: [{ sig, publicKey: encodedKey }], + }; + // If the keyid is an empty string, Rekor seems to remove it altogether. We + // need to do the same here so that we can properly recreate the entry for + // verification. + if (keyid.length > 0) { + dsse.signatures[0].keyid = keyid; + } + return { + apiVersion: '0.0.2', + kind: 'intoto', + spec: { + content: { + envelope: dsse, + hash: { algorithm: SHA256_ALGORITHM, value: envelopeHash }, + payloadHash: { algorithm: SHA256_ALGORITHM, value: payloadHash }, + }, + }, + }; +} +// Calculates the hash of a DSSE envelope for inclusion in a Rekor entry. +// There is no standard way to do this, so the scheme we're using as as +// follows: +// * payload is base64 encoded +// * signature is base64 encoded (only the first signature is used) +// * keyid is included ONLY if it is NOT an empty string +// * The resulting JSON is canonicalized and hashed to a hex string +function calculateDSSEHash(envelope, publicKey) { + const dsse = { + payloadType: envelope.payloadType, + payload: envelope.payload.toString('base64'), + signatures: [ + { sig: envelope.signatures[0].sig.toString('base64'), publicKey }, + ], + }; + // If the keyid is an empty string, Rekor seems to remove it altogether. + if (envelope.signatures[0].keyid.length > 0) { + dsse.signatures[0].keyid = envelope.signatures[0].keyid; + } + return util_1.crypto + .digest(SHA256_ALGORITHM, util_1.json.canonicalize(dsse)) + .toString('hex'); +} diff --git a/deps/npm/node_modules/@sigstore/sign/dist/witness/tlog/index.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/witness/tlog/index.js similarity index 100% rename from deps/npm/node_modules/@sigstore/sign/dist/witness/tlog/index.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/witness/tlog/index.js diff --git a/deps/npm/node_modules/@sigstore/sign/dist/witness/tsa/client.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/witness/tsa/client.js similarity index 86% rename from deps/npm/node_modules/@sigstore/sign/dist/witness/tsa/client.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/witness/tsa/client.js index a334deb00b7756..754de3748dbb36 100644 --- a/deps/npm/node_modules/@sigstore/sign/dist/witness/tsa/client.js +++ b/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/witness/tsa/client.js @@ -19,6 +19,7 @@ limitations under the License. const error_1 = require("../../error"); const tsa_1 = require("../../external/tsa"); const util_1 = require("../../util"); +const SHA256_ALGORITHM = 'sha256'; class TSAClient { constructor(options) { this.tsa = new tsa_1.TimestampAuthority({ @@ -29,8 +30,10 @@ class TSAClient { } async createTimestamp(signature) { const request = { - artifactHash: util_1.crypto.hash(signature).toString('base64'), - hashAlgorithm: 'sha256', + artifactHash: util_1.crypto + .digest(SHA256_ALGORITHM, signature) + .toString('base64'), + hashAlgorithm: SHA256_ALGORITHM, }; try { return await this.tsa.createTimestamp(request); diff --git a/deps/npm/node_modules/@sigstore/sign/dist/witness/tsa/index.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/witness/tsa/index.js similarity index 100% rename from deps/npm/node_modules/@sigstore/sign/dist/witness/tsa/index.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/witness/tsa/index.js diff --git a/deps/npm/node_modules/@sigstore/sign/dist/witness/witness.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/witness/witness.js similarity index 100% rename from deps/npm/node_modules/@sigstore/sign/dist/witness/witness.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/dist/witness/witness.js diff --git a/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/package.json b/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/package.json new file mode 100644 index 00000000000000..fe05e8dc2d73ad --- /dev/null +++ b/deps/npm/node_modules/sigstore/node_modules/@sigstore/sign/package.json @@ -0,0 +1,46 @@ +{ + "name": "@sigstore/sign", + "version": "3.0.0", + "description": "Sigstore signing library", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "scripts": { + "clean": "shx rm -rf dist *.tsbuildinfo", + "build": "tsc --build", + "test": "jest" + }, + "files": [ + "dist" + ], + "author": "bdehamer@github.com", + "license": "Apache-2.0", + "repository": { + "type": "git", + "url": "git+https://github.com/sigstore/sigstore-js.git" + }, + "bugs": { + "url": "https://github.com/sigstore/sigstore-js/issues" + }, + "homepage": "https://github.com/sigstore/sigstore-js/tree/main/packages/sign#readme", + "publishConfig": { + "provenance": true + }, + "devDependencies": { + "@sigstore/jest": "^0.0.0", + "@sigstore/mock": "^0.8.0", + "@sigstore/rekor-types": "^3.0.0", + "@types/make-fetch-happen": "^10.0.4", + "@types/promise-retry": "^1.1.6" + }, + "dependencies": { + "@sigstore/bundle": "^3.0.0", + "@sigstore/core": "^2.0.0", + "@sigstore/protobuf-specs": "^0.3.2", + "make-fetch-happen": "^14.0.1", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } +} diff --git a/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/bundle/dsse.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/bundle/dsse.js new file mode 100644 index 00000000000000..1033fc422aba09 --- /dev/null +++ b/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/bundle/dsse.js @@ -0,0 +1,43 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DSSESignatureContent = void 0; +/* +Copyright 2023 The Sigstore Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +const core_1 = require("@sigstore/core"); +class DSSESignatureContent { + constructor(env) { + this.env = env; + } + compareDigest(digest) { + return core_1.crypto.bufferEqual(digest, core_1.crypto.digest('sha256', this.env.payload)); + } + compareSignature(signature) { + return core_1.crypto.bufferEqual(signature, this.signature); + } + verifySignature(key) { + return core_1.crypto.verify(this.preAuthEncoding, key, this.signature); + } + get signature() { + return this.env.signatures.length > 0 + ? this.env.signatures[0].sig + : Buffer.from(''); + } + // DSSE Pre-Authentication Encoding + get preAuthEncoding() { + return core_1.dsse.preAuthEncoding(this.env.payloadType, this.env.payload); + } +} +exports.DSSESignatureContent = DSSESignatureContent; diff --git a/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/bundle/index.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/bundle/index.js new file mode 100644 index 00000000000000..4287d8032b75f0 --- /dev/null +++ b/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/bundle/index.js @@ -0,0 +1,57 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.toSignedEntity = toSignedEntity; +exports.signatureContent = signatureContent; +const core_1 = require("@sigstore/core"); +const dsse_1 = require("./dsse"); +const message_1 = require("./message"); +function toSignedEntity(bundle, artifact) { + const { tlogEntries, timestampVerificationData } = bundle.verificationMaterial; + const timestamps = []; + for (const entry of tlogEntries) { + timestamps.push({ + $case: 'transparency-log', + tlogEntry: entry, + }); + } + for (const ts of timestampVerificationData?.rfc3161Timestamps ?? []) { + timestamps.push({ + $case: 'timestamp-authority', + timestamp: core_1.RFC3161Timestamp.parse(ts.signedTimestamp), + }); + } + return { + signature: signatureContent(bundle, artifact), + key: key(bundle), + tlogEntries, + timestamps, + }; +} +function signatureContent(bundle, artifact) { + switch (bundle.content.$case) { + case 'dsseEnvelope': + return new dsse_1.DSSESignatureContent(bundle.content.dsseEnvelope); + case 'messageSignature': + return new message_1.MessageSignatureContent(bundle.content.messageSignature, artifact); + } +} +function key(bundle) { + switch (bundle.verificationMaterial.content.$case) { + case 'publicKey': + return { + $case: 'public-key', + hint: bundle.verificationMaterial.content.publicKey.hint, + }; + case 'x509CertificateChain': + return { + $case: 'certificate', + certificate: core_1.X509Certificate.parse(bundle.verificationMaterial.content.x509CertificateChain + .certificates[0].rawBytes), + }; + case 'certificate': + return { + $case: 'certificate', + certificate: core_1.X509Certificate.parse(bundle.verificationMaterial.content.certificate.rawBytes), + }; + } +} diff --git a/deps/npm/node_modules/@sigstore/verify/dist/bundle/message.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/bundle/message.js similarity index 100% rename from deps/npm/node_modules/@sigstore/verify/dist/bundle/message.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/bundle/message.js diff --git a/deps/npm/node_modules/@sigstore/verify/dist/error.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/error.js similarity index 100% rename from deps/npm/node_modules/@sigstore/verify/dist/error.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/error.js diff --git a/deps/npm/node_modules/@sigstore/verify/dist/index.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/index.js similarity index 100% rename from deps/npm/node_modules/@sigstore/verify/dist/index.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/index.js diff --git a/deps/npm/node_modules/@sigstore/verify/dist/key/certificate.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/key/certificate.js similarity index 99% rename from deps/npm/node_modules/@sigstore/verify/dist/key/certificate.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/key/certificate.js index c9140dd98d58a6..a916de0e51e712 100644 --- a/deps/npm/node_modules/@sigstore/verify/dist/key/certificate.js +++ b/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/key/certificate.js @@ -1,6 +1,7 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.CertificateChainVerifier = exports.verifyCertificateChain = void 0; +exports.CertificateChainVerifier = void 0; +exports.verifyCertificateChain = verifyCertificateChain; const error_1 = require("../error"); const trust_1 = require("../trust"); function verifyCertificateChain(leaf, certificateAuthorities) { @@ -32,7 +33,6 @@ function verifyCertificateChain(leaf, certificateAuthorities) { cause: error, }); } -exports.verifyCertificateChain = verifyCertificateChain; class CertificateChainVerifier { constructor(opts) { this.untrustedCert = opts.untrustedCert; diff --git a/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/key/index.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/key/index.js new file mode 100644 index 00000000000000..cc894aab95a5d5 --- /dev/null +++ b/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/key/index.js @@ -0,0 +1,72 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.verifyPublicKey = verifyPublicKey; +exports.verifyCertificate = verifyCertificate; +/* +Copyright 2023 The Sigstore Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +const core_1 = require("@sigstore/core"); +const error_1 = require("../error"); +const certificate_1 = require("./certificate"); +const sct_1 = require("./sct"); +const OID_FULCIO_ISSUER_V1 = '1.3.6.1.4.1.57264.1.1'; +const OID_FULCIO_ISSUER_V2 = '1.3.6.1.4.1.57264.1.8'; +function verifyPublicKey(hint, timestamps, trustMaterial) { + const key = trustMaterial.publicKey(hint); + timestamps.forEach((timestamp) => { + if (!key.validFor(timestamp)) { + throw new error_1.VerificationError({ + code: 'PUBLIC_KEY_ERROR', + message: `Public key is not valid for timestamp: ${timestamp.toISOString()}`, + }); + } + }); + return { key: key.publicKey }; +} +function verifyCertificate(leaf, timestamps, trustMaterial) { + // Check that leaf certificate chains to a trusted CA + const path = (0, certificate_1.verifyCertificateChain)(leaf, trustMaterial.certificateAuthorities); + // Check that ALL certificates are valid for ALL of the timestamps + const validForDate = timestamps.every((timestamp) => path.every((cert) => cert.validForDate(timestamp))); + if (!validForDate) { + throw new error_1.VerificationError({ + code: 'CERTIFICATE_ERROR', + message: 'certificate is not valid or expired at the specified date', + }); + } + return { + scts: (0, sct_1.verifySCTs)(path[0], path[1], trustMaterial.ctlogs), + signer: getSigner(path[0]), + }; +} +function getSigner(cert) { + let issuer; + const issuerExtension = cert.extension(OID_FULCIO_ISSUER_V2); + /* istanbul ignore next */ + if (issuerExtension) { + issuer = issuerExtension.valueObj.subs?.[0]?.value.toString('ascii'); + } + else { + issuer = cert.extension(OID_FULCIO_ISSUER_V1)?.value.toString('ascii'); + } + const identity = { + extensions: { issuer }, + subjectAlternativeName: cert.subjectAltName, + }; + return { + key: core_1.crypto.createPublicKey(cert.publicKey), + identity, + }; +} diff --git a/deps/npm/node_modules/@sigstore/verify/dist/key/sct.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/key/sct.js similarity index 97% rename from deps/npm/node_modules/@sigstore/verify/dist/key/sct.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/key/sct.js index aea412840e1039..8eca48738096ee 100644 --- a/deps/npm/node_modules/@sigstore/verify/dist/key/sct.js +++ b/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/key/sct.js @@ -1,6 +1,6 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.verifySCTs = void 0; +exports.verifySCTs = verifySCTs; /* Copyright 2023 The Sigstore Authors. @@ -52,7 +52,7 @@ function verifySCTs(cert, issuer, ctlogs) { // https://www.rfc-editor.org/rfc/rfc6962#section-3.2 const preCert = new core_1.ByteStream(); // Calculate hash of the issuer's public key - const issuerId = core_1.crypto.hash(issuer.publicKey); + const issuerId = core_1.crypto.digest('sha256', issuer.publicKey); preCert.appendView(issuerId); // Re-encodes the certificate to DER after removing the SCT extension const tbs = clone.tbsCertificate.toDER(); @@ -76,4 +76,3 @@ function verifySCTs(cert, issuer, ctlogs) { return sct.logID; }); } -exports.verifySCTs = verifySCTs; diff --git a/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/policy.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/policy.js new file mode 100644 index 00000000000000..f5960cf047b84b --- /dev/null +++ b/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/policy.js @@ -0,0 +1,24 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.verifySubjectAlternativeName = verifySubjectAlternativeName; +exports.verifyExtensions = verifyExtensions; +const error_1 = require("./error"); +function verifySubjectAlternativeName(policyIdentity, signerIdentity) { + if (signerIdentity === undefined || !signerIdentity.match(policyIdentity)) { + throw new error_1.PolicyError({ + code: 'UNTRUSTED_SIGNER_ERROR', + message: `certificate identity error - expected ${policyIdentity}, got ${signerIdentity}`, + }); + } +} +function verifyExtensions(policyExtensions, signerExtensions = {}) { + let key; + for (key in policyExtensions) { + if (signerExtensions[key] !== policyExtensions[key]) { + throw new error_1.PolicyError({ + code: 'UNTRUSTED_SIGNER_ERROR', + message: `invalid certificate extension - expected ${key}=${policyExtensions[key]}, got ${key}=${signerExtensions[key]}`, + }); + } + } +} diff --git a/deps/npm/node_modules/@sigstore/verify/dist/shared.types.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/shared.types.js similarity index 100% rename from deps/npm/node_modules/@sigstore/verify/dist/shared.types.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/shared.types.js diff --git a/deps/npm/node_modules/@sigstore/verify/dist/timestamp/checkpoint.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/timestamp/checkpoint.js similarity index 99% rename from deps/npm/node_modules/@sigstore/verify/dist/timestamp/checkpoint.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/timestamp/checkpoint.js index 04a87383f0fd17..46619b675f8863 100644 --- a/deps/npm/node_modules/@sigstore/verify/dist/timestamp/checkpoint.js +++ b/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/timestamp/checkpoint.js @@ -1,6 +1,6 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.verifyCheckpoint = void 0; +exports.verifyCheckpoint = verifyCheckpoint; /* Copyright 2023 The Sigstore Authors. @@ -61,7 +61,6 @@ function verifyCheckpoint(entry, tlogs) { }); } } -exports.verifyCheckpoint = verifyCheckpoint; // Verifies the signatures in the SignedNote. For each signature, the // corresponding transparency log is looked up by the key hint and the // signature is verified against the public key in the transparency log. diff --git a/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/timestamp/index.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/timestamp/index.js new file mode 100644 index 00000000000000..56e948de19338d --- /dev/null +++ b/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/timestamp/index.js @@ -0,0 +1,46 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.verifyTSATimestamp = verifyTSATimestamp; +exports.verifyTLogTimestamp = verifyTLogTimestamp; +const error_1 = require("../error"); +const checkpoint_1 = require("./checkpoint"); +const merkle_1 = require("./merkle"); +const set_1 = require("./set"); +const tsa_1 = require("./tsa"); +function verifyTSATimestamp(timestamp, data, timestampAuthorities) { + (0, tsa_1.verifyRFC3161Timestamp)(timestamp, data, timestampAuthorities); + return { + type: 'timestamp-authority', + logID: timestamp.signerSerialNumber, + timestamp: timestamp.signingTime, + }; +} +function verifyTLogTimestamp(entry, tlogAuthorities) { + let inclusionVerified = false; + if (isTLogEntryWithInclusionPromise(entry)) { + (0, set_1.verifyTLogSET)(entry, tlogAuthorities); + inclusionVerified = true; + } + if (isTLogEntryWithInclusionProof(entry)) { + (0, merkle_1.verifyMerkleInclusion)(entry); + (0, checkpoint_1.verifyCheckpoint)(entry, tlogAuthorities); + inclusionVerified = true; + } + if (!inclusionVerified) { + throw new error_1.VerificationError({ + code: 'TLOG_MISSING_INCLUSION_ERROR', + message: 'inclusion could not be verified', + }); + } + return { + type: 'transparency-log', + logID: entry.logId.keyId, + timestamp: new Date(Number(entry.integratedTime) * 1000), + }; +} +function isTLogEntryWithInclusionPromise(entry) { + return entry.inclusionPromise !== undefined; +} +function isTLogEntryWithInclusionProof(entry) { + return entry.inclusionProof !== undefined; +} diff --git a/deps/npm/node_modules/@sigstore/verify/dist/timestamp/merkle.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/timestamp/merkle.js similarity index 95% rename from deps/npm/node_modules/@sigstore/verify/dist/timestamp/merkle.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/timestamp/merkle.js index 9895d01b7abc03..f57cae42002bd0 100644 --- a/deps/npm/node_modules/@sigstore/verify/dist/timestamp/merkle.js +++ b/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/timestamp/merkle.js @@ -1,6 +1,6 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.verifyMerkleInclusion = void 0; +exports.verifyMerkleInclusion = verifyMerkleInclusion; /* Copyright 2023 The Sigstore Authors. @@ -53,7 +53,6 @@ function verifyMerkleInclusion(entry) { }); } } -exports.verifyMerkleInclusion = verifyMerkleInclusion; // Breaks down inclusion proof for a leaf at the specified index in a tree of // the specified size. The split point is where paths to the index leaf and // the (size - 1) leaf diverge. Returns lengths of the bottom and upper proof @@ -98,8 +97,8 @@ function bitLength(n) { // Hashing logic according to RFC6962. // https://datatracker.ietf.org/doc/html/rfc6962#section-2 function hashChildren(left, right) { - return core_1.crypto.hash(RFC6962_NODE_HASH_PREFIX, left, right); + return core_1.crypto.digest('sha256', RFC6962_NODE_HASH_PREFIX, left, right); } function hashLeaf(leaf) { - return core_1.crypto.hash(RFC6962_LEAF_HASH_PREFIX, leaf); + return core_1.crypto.digest('sha256', RFC6962_LEAF_HASH_PREFIX, leaf); } diff --git a/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/timestamp/set.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/timestamp/set.js new file mode 100644 index 00000000000000..5d3f47bb88746a --- /dev/null +++ b/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/timestamp/set.js @@ -0,0 +1,60 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.verifyTLogSET = verifyTLogSET; +/* +Copyright 2023 The Sigstore Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +const core_1 = require("@sigstore/core"); +const error_1 = require("../error"); +const trust_1 = require("../trust"); +// Verifies the SET for the given entry against the list of trusted +// transparency logs. Returns true if the SET can be verified against at least +// one of the trusted logs; otherwise, returns false. +function verifyTLogSET(entry, tlogs) { + // Filter the list of tlog instances to only those which might be able to + // verify the SET + const validTLogs = (0, trust_1.filterTLogAuthorities)(tlogs, { + logID: entry.logId.keyId, + targetDate: new Date(Number(entry.integratedTime) * 1000), + }); + // Check to see if we can verify the SET against any of the valid tlogs + const verified = validTLogs.some((tlog) => { + // Re-create the original Rekor verification payload + const payload = toVerificationPayload(entry); + // Canonicalize the payload and turn into a buffer for verification + const data = Buffer.from(core_1.json.canonicalize(payload), 'utf8'); + // Extract the SET from the tlog entry + const signature = entry.inclusionPromise.signedEntryTimestamp; + return core_1.crypto.verify(data, tlog.publicKey, signature); + }); + if (!verified) { + throw new error_1.VerificationError({ + code: 'TLOG_INCLUSION_PROMISE_ERROR', + message: 'inclusion promise could not be verified', + }); + } +} +// Returns a properly formatted "VerificationPayload" for one of the +// transaction log entires in the given bundle which can be used for SET +// verification. +function toVerificationPayload(entry) { + const { integratedTime, logIndex, logId, canonicalizedBody } = entry; + return { + body: canonicalizedBody.toString('base64'), + integratedTime: Number(integratedTime), + logIndex: Number(logIndex), + logID: logId.keyId.toString('hex'), + }; +} diff --git a/deps/npm/node_modules/@sigstore/verify/dist/timestamp/tsa.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/timestamp/tsa.js similarity index 98% rename from deps/npm/node_modules/@sigstore/verify/dist/timestamp/tsa.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/timestamp/tsa.js index 7b095bc3a7f908..70388cd06c52d6 100644 --- a/deps/npm/node_modules/@sigstore/verify/dist/timestamp/tsa.js +++ b/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/timestamp/tsa.js @@ -1,6 +1,6 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.verifyRFC3161Timestamp = void 0; +exports.verifyRFC3161Timestamp = verifyRFC3161Timestamp; const core_1 = require("@sigstore/core"); const error_1 = require("../error"); const certificate_1 = require("../key/certificate"); @@ -35,7 +35,6 @@ function verifyRFC3161Timestamp(timestamp, data, timestampAuthorities) { }); } } -exports.verifyRFC3161Timestamp = verifyRFC3161Timestamp; function verifyTimestampForCA(timestamp, data, ca) { const [leaf, ...cas] = ca.certChain; const signingKey = core_1.crypto.createPublicKey(leaf.publicKey); diff --git a/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/tlog/dsse.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/tlog/dsse.js new file mode 100644 index 00000000000000..d71ed8c6e7ad9a --- /dev/null +++ b/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/tlog/dsse.js @@ -0,0 +1,57 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.verifyDSSETLogBody = verifyDSSETLogBody; +/* +Copyright 2023 The Sigstore Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +const error_1 = require("../error"); +// Compare the given intoto tlog entry to the given bundle +function verifyDSSETLogBody(tlogEntry, content) { + switch (tlogEntry.apiVersion) { + case '0.0.1': + return verifyDSSE001TLogBody(tlogEntry, content); + default: + throw new error_1.VerificationError({ + code: 'TLOG_BODY_ERROR', + message: `unsupported dsse version: ${tlogEntry.apiVersion}`, + }); + } +} +// Compare the given dsse v0.0.1 tlog entry to the given DSSE envelope. +function verifyDSSE001TLogBody(tlogEntry, content) { + // Ensure the bundle's DSSE only contains a single signature + if (tlogEntry.spec.signatures?.length !== 1) { + throw new error_1.VerificationError({ + code: 'TLOG_BODY_ERROR', + message: 'signature count mismatch', + }); + } + const tlogSig = tlogEntry.spec.signatures[0].signature; + // Ensure that the signature in the bundle's DSSE matches tlog entry + if (!content.compareSignature(Buffer.from(tlogSig, 'base64'))) + throw new error_1.VerificationError({ + code: 'TLOG_BODY_ERROR', + message: 'tlog entry signature mismatch', + }); + // Ensure the digest of the bundle's DSSE payload matches the digest in the + // tlog entry + const tlogHash = tlogEntry.spec.payloadHash?.value || ''; + if (!content.compareDigest(Buffer.from(tlogHash, 'hex'))) { + throw new error_1.VerificationError({ + code: 'TLOG_BODY_ERROR', + message: 'DSSE payload hash mismatch', + }); + } +} diff --git a/deps/npm/node_modules/@sigstore/verify/dist/tlog/hashedrekord.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/tlog/hashedrekord.js similarity index 97% rename from deps/npm/node_modules/@sigstore/verify/dist/tlog/hashedrekord.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/tlog/hashedrekord.js index d1758858f030d8..c4aa345b57ba7a 100644 --- a/deps/npm/node_modules/@sigstore/verify/dist/tlog/hashedrekord.js +++ b/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/tlog/hashedrekord.js @@ -1,6 +1,6 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.verifyHashedRekordTLogBody = void 0; +exports.verifyHashedRekordTLogBody = verifyHashedRekordTLogBody; /* Copyright 2023 The Sigstore Authors. @@ -29,7 +29,6 @@ function verifyHashedRekordTLogBody(tlogEntry, content) { }); } } -exports.verifyHashedRekordTLogBody = verifyHashedRekordTLogBody; // Compare the given hashedrekord v0.0.1 tlog entry to the given message // signature function verifyHashedrekord001TLogBody(tlogEntry, content) { diff --git a/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/tlog/index.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/tlog/index.js new file mode 100644 index 00000000000000..da235360c594a8 --- /dev/null +++ b/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/tlog/index.js @@ -0,0 +1,47 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.verifyTLogBody = verifyTLogBody; +/* +Copyright 2023 The Sigstore Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +const error_1 = require("../error"); +const dsse_1 = require("./dsse"); +const hashedrekord_1 = require("./hashedrekord"); +const intoto_1 = require("./intoto"); +// Verifies that the given tlog entry matches the supplied signature content. +function verifyTLogBody(entry, sigContent) { + const { kind, version } = entry.kindVersion; + const body = JSON.parse(entry.canonicalizedBody.toString('utf8')); + if (kind !== body.kind || version !== body.apiVersion) { + throw new error_1.VerificationError({ + code: 'TLOG_BODY_ERROR', + message: `kind/version mismatch - expected: ${kind}/${version}, received: ${body.kind}/${body.apiVersion}`, + }); + } + switch (body.kind) { + case 'dsse': + return (0, dsse_1.verifyDSSETLogBody)(body, sigContent); + case 'intoto': + return (0, intoto_1.verifyIntotoTLogBody)(body, sigContent); + case 'hashedrekord': + return (0, hashedrekord_1.verifyHashedRekordTLogBody)(body, sigContent); + /* istanbul ignore next */ + default: + throw new error_1.VerificationError({ + code: 'TLOG_BODY_ERROR', + message: `unsupported kind: ${kind}`, + }); + } +} diff --git a/deps/npm/node_modules/@sigstore/verify/dist/tlog/intoto.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/tlog/intoto.js similarity index 98% rename from deps/npm/node_modules/@sigstore/verify/dist/tlog/intoto.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/tlog/intoto.js index 74c7f50d763e1d..9096ae9418cc30 100644 --- a/deps/npm/node_modules/@sigstore/verify/dist/tlog/intoto.js +++ b/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/tlog/intoto.js @@ -1,6 +1,6 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.verifyIntotoTLogBody = void 0; +exports.verifyIntotoTLogBody = verifyIntotoTLogBody; /* Copyright 2023 The Sigstore Authors. @@ -29,7 +29,6 @@ function verifyIntotoTLogBody(tlogEntry, content) { }); } } -exports.verifyIntotoTLogBody = verifyIntotoTLogBody; // Compare the given intoto v0.0.2 tlog entry to the given DSSE envelope. function verifyIntoto002TLogBody(tlogEntry, content) { // Ensure the bundle's DSSE contains a single signature diff --git a/deps/npm/node_modules/@sigstore/verify/dist/trust/filter.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/trust/filter.js similarity index 93% rename from deps/npm/node_modules/@sigstore/verify/dist/trust/filter.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/trust/filter.js index c09d055913c4c7..880a16cf1940ea 100644 --- a/deps/npm/node_modules/@sigstore/verify/dist/trust/filter.js +++ b/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/trust/filter.js @@ -1,12 +1,12 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.filterTLogAuthorities = exports.filterCertAuthorities = void 0; +exports.filterCertAuthorities = filterCertAuthorities; +exports.filterTLogAuthorities = filterTLogAuthorities; function filterCertAuthorities(certAuthorities, criteria) { return certAuthorities.filter((ca) => { return (ca.validFor.start <= criteria.start && ca.validFor.end >= criteria.end); }); } -exports.filterCertAuthorities = filterCertAuthorities; // Filter the list of tlog instances to only those which match the given log // ID and have public keys which are valid for the given integrated time. function filterTLogAuthorities(tlogAuthorities, criteria) { @@ -21,4 +21,3 @@ function filterTLogAuthorities(tlogAuthorities, criteria) { criteria.targetDate <= tlog.validFor.end); }); } -exports.filterTLogAuthorities = filterTLogAuthorities; diff --git a/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/trust/index.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/trust/index.js new file mode 100644 index 00000000000000..bfab2eb4f9975a --- /dev/null +++ b/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/trust/index.js @@ -0,0 +1,86 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.filterTLogAuthorities = exports.filterCertAuthorities = void 0; +exports.toTrustMaterial = toTrustMaterial; +/* +Copyright 2023 The Sigstore Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +const core_1 = require("@sigstore/core"); +const protobuf_specs_1 = require("@sigstore/protobuf-specs"); +const error_1 = require("../error"); +const BEGINNING_OF_TIME = new Date(0); +const END_OF_TIME = new Date(8640000000000000); +var filter_1 = require("./filter"); +Object.defineProperty(exports, "filterCertAuthorities", { enumerable: true, get: function () { return filter_1.filterCertAuthorities; } }); +Object.defineProperty(exports, "filterTLogAuthorities", { enumerable: true, get: function () { return filter_1.filterTLogAuthorities; } }); +function toTrustMaterial(root, keys) { + const keyFinder = typeof keys === 'function' ? keys : keyLocator(keys); + return { + certificateAuthorities: root.certificateAuthorities.map(createCertAuthority), + timestampAuthorities: root.timestampAuthorities.map(createCertAuthority), + tlogs: root.tlogs.map(createTLogAuthority), + ctlogs: root.ctlogs.map(createTLogAuthority), + publicKey: keyFinder, + }; +} +function createTLogAuthority(tlogInstance) { + const keyDetails = tlogInstance.publicKey.keyDetails; + const keyType = keyDetails === protobuf_specs_1.PublicKeyDetails.PKCS1_RSA_PKCS1V5 || + keyDetails === protobuf_specs_1.PublicKeyDetails.PKIX_RSA_PKCS1V5 || + keyDetails === protobuf_specs_1.PublicKeyDetails.PKIX_RSA_PKCS1V15_2048_SHA256 || + keyDetails === protobuf_specs_1.PublicKeyDetails.PKIX_RSA_PKCS1V15_3072_SHA256 || + keyDetails === protobuf_specs_1.PublicKeyDetails.PKIX_RSA_PKCS1V15_4096_SHA256 + ? 'pkcs1' + : 'spki'; + return { + logID: tlogInstance.logId.keyId, + publicKey: core_1.crypto.createPublicKey(tlogInstance.publicKey.rawBytes, keyType), + validFor: { + start: tlogInstance.publicKey.validFor?.start || BEGINNING_OF_TIME, + end: tlogInstance.publicKey.validFor?.end || END_OF_TIME, + }, + }; +} +function createCertAuthority(ca) { + /* istanbul ignore next */ + return { + certChain: ca.certChain.certificates.map((cert) => { + return core_1.X509Certificate.parse(cert.rawBytes); + }), + validFor: { + start: ca.validFor?.start || BEGINNING_OF_TIME, + end: ca.validFor?.end || END_OF_TIME, + }, + }; +} +function keyLocator(keys) { + return (hint) => { + const key = (keys || {})[hint]; + if (!key) { + throw new error_1.VerificationError({ + code: 'PUBLIC_KEY_ERROR', + message: `key not found: ${hint}`, + }); + } + return { + publicKey: core_1.crypto.createPublicKey(key.rawBytes), + validFor: (date) => { + /* istanbul ignore next */ + return ((key.validFor?.start || BEGINNING_OF_TIME) <= date && + (key.validFor?.end || END_OF_TIME) >= date); + }, + }; + }; +} diff --git a/deps/npm/node_modules/@sigstore/verify/dist/trust/trust.types.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/trust/trust.types.js similarity index 100% rename from deps/npm/node_modules/@sigstore/verify/dist/trust/trust.types.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/trust/trust.types.js diff --git a/deps/npm/node_modules/@sigstore/verify/dist/verifier.js b/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/verifier.js similarity index 100% rename from deps/npm/node_modules/@sigstore/verify/dist/verifier.js rename to deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/dist/verifier.js diff --git a/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/package.json b/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/package.json new file mode 100644 index 00000000000000..edf72b8bfd9680 --- /dev/null +++ b/deps/npm/node_modules/sigstore/node_modules/@sigstore/verify/package.json @@ -0,0 +1,36 @@ +{ + "name": "@sigstore/verify", + "version": "2.0.0", + "description": "Verification of Sigstore signatures", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "scripts": { + "clean": "shx rm -rf dist *.tsbuildinfo", + "build": "tsc --build", + "test": "jest" + }, + "files": [ + "dist" + ], + "author": "bdehamer@github.com", + "license": "Apache-2.0", + "repository": { + "type": "git", + "url": "git+https://github.com/sigstore/sigstore-js.git" + }, + "bugs": { + "url": "https://github.com/sigstore/sigstore-js/issues" + }, + "homepage": "https://github.com/sigstore/sigstore-js/tree/main/packages/verify#readme", + "publishConfig": { + "provenance": true + }, + "dependencies": { + "@sigstore/protobuf-specs": "^0.3.2", + "@sigstore/bundle": "^3.0.0", + "@sigstore/core": "^2.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } +} diff --git a/deps/npm/node_modules/sigstore/package.json b/deps/npm/node_modules/sigstore/package.json index fa8744bf304a3f..0f798a263657b4 100644 --- a/deps/npm/node_modules/sigstore/package.json +++ b/deps/npm/node_modules/sigstore/package.json @@ -1,6 +1,6 @@ { "name": "sigstore", - "version": "2.3.1", + "version": "3.0.0", "description": "code-signing for npm packages", "main": "dist/index.js", "types": "dist/index.d.ts", @@ -27,21 +27,21 @@ "provenance": true }, "devDependencies": { - "@sigstore/rekor-types": "^2.0.0", + "@sigstore/rekor-types": "^3.0.0", "@sigstore/jest": "^0.0.0", - "@sigstore/mock": "^0.7.4", - "@tufjs/repo-mock": "^2.0.1", + "@sigstore/mock": "^0.8.0", + "@tufjs/repo-mock": "^3.0.1", "@types/make-fetch-happen": "^10.0.4" }, "dependencies": { - "@sigstore/bundle": "^2.3.2", - "@sigstore/core": "^1.0.0", + "@sigstore/bundle": "^3.0.0", + "@sigstore/core": "^2.0.0", "@sigstore/protobuf-specs": "^0.3.2", - "@sigstore/sign": "^2.3.2", - "@sigstore/tuf": "^2.3.4", - "@sigstore/verify": "^1.2.1" + "@sigstore/sign": "^3.0.0", + "@sigstore/tuf": "^3.0.0", + "@sigstore/verify": "^2.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } } diff --git a/deps/npm/node_modules/spdx-license-ids/deprecated.json b/deps/npm/node_modules/spdx-license-ids/deprecated.json index 278531e40c613d..4f70a14c7469da 100644 --- a/deps/npm/node_modules/spdx-license-ids/deprecated.json +++ b/deps/npm/node_modules/spdx-license-ids/deprecated.json @@ -19,6 +19,7 @@ "LGPL-2.0", "LGPL-2.1", "LGPL-3.0", + "Net-SNMP", "Nunit", "StandardML-NJ", "bzip2-1.0.5", diff --git a/deps/npm/node_modules/spdx-license-ids/index.json b/deps/npm/node_modules/spdx-license-ids/index.json index c7686a710d61d1..f43d5016bd95ab 100644 --- a/deps/npm/node_modules/spdx-license-ids/index.json +++ b/deps/npm/node_modules/spdx-license-ids/index.json @@ -197,6 +197,8 @@ "DRL-1.0", "DRL-1.1", "DSDP", + "DocBook-Schema", + "DocBook-XML", "Dotseqn", "ECL-1.0", "ECL-2.0", @@ -260,6 +262,7 @@ "Glulxe", "Graphics-Gems", "Gutmann", + "HIDAPI", "HP-1986", "HP-1989", "HPND", @@ -270,6 +273,7 @@ "HPND-Kevlin-Henney", "HPND-MIT-disclaimer", "HPND-Markus-Kuhn", + "HPND-Netrek", "HPND-Pbmplus", "HPND-UC", "HPND-UC-export-US", @@ -403,7 +407,6 @@ "NTP", "NTP-0", "Naumen", - "Net-SNMP", "NetCDF", "Newsletr", "Nokia", @@ -485,6 +488,7 @@ "RSCPL", "Rdisc", "Ruby", + "Ruby-pty", "SAX-PD", "SAX-PD-2.0", "SCEA", @@ -541,6 +545,7 @@ "UMich-Merit", "UPL-1.0", "URT-RLE", + "Ubuntu-font-1.0", "Unicode-3.0", "Unicode-DFS-2015", "Unicode-DFS-2016", @@ -559,6 +564,7 @@ "Wsuipa", "X11", "X11-distribute-modifications-variant", + "X11-swapped", "XFree86-1.1", "XSkat", "Xdebug-1.03", diff --git a/deps/npm/node_modules/spdx-license-ids/package.json b/deps/npm/node_modules/spdx-license-ids/package.json index 5f5ed9554f2579..7ab34aab6b8b1d 100644 --- a/deps/npm/node_modules/spdx-license-ids/package.json +++ b/deps/npm/node_modules/spdx-license-ids/package.json @@ -1,6 +1,6 @@ { "name": "spdx-license-ids", - "version": "3.0.18", + "version": "3.0.20", "description": "A list of SPDX license identifiers", "repository": "jslicense/spdx-license-ids", "author": "Shinnosuke Watanabe (https://github.com/shinnn)", diff --git a/deps/npm/node_modules/tuf-js/dist/config.js b/deps/npm/node_modules/tuf-js/dist/config.js index 6845679942fec5..c66d76af86b98c 100644 --- a/deps/npm/node_modules/tuf-js/dist/config.js +++ b/deps/npm/node_modules/tuf-js/dist/config.js @@ -2,7 +2,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.defaultConfig = void 0; exports.defaultConfig = { - maxRootRotations: 32, + maxRootRotations: 256, maxDelegations: 32, rootMaxLength: 512000, //bytes timestampMaxLength: 16384, // bytes diff --git a/deps/npm/node_modules/tuf-js/dist/updater.js b/deps/npm/node_modules/tuf-js/dist/updater.js index 5317f7e14659ac..8d5eb4428f044a 100644 --- a/deps/npm/node_modules/tuf-js/dist/updater.js +++ b/deps/npm/node_modules/tuf-js/dist/updater.js @@ -144,7 +144,7 @@ class Updater { const rootVersion = this.trustedSet.root.signed.version; const lowerBound = rootVersion + 1; const upperBound = lowerBound + this.config.maxRootRotations; - for (let version = lowerBound; version <= upperBound; version++) { + for (let version = lowerBound; version < upperBound; version++) { const rootUrl = url.join(this.metadataBaseUrl, `${version}.root.json`); try { // Client workflow 5.3.3: download new root metadata file @@ -155,7 +155,13 @@ class Updater { this.persistMetadata(models_1.MetadataKind.Root, bytesData); } catch (error) { - break; + if (error instanceof error_1.DownloadHTTPError) { + // 404/403 means current root is newest available + if ([403, 404].includes(error.statusCode)) { + break; + } + } + throw error; } } } @@ -247,7 +253,8 @@ class Updater { const version = this.trustedSet.root.signed.consistentSnapshot ? metaInfo.version : undefined; - const metadataUrl = url.join(this.metadataBaseUrl, version ? `${version}.${role}.json` : `${role}.json`); + const encodedRole = encodeURIComponent(role); + const metadataUrl = url.join(this.metadataBaseUrl, version ? `${version}.${encodedRole}.json` : `${encodedRole}.json`); try { // Client workflow 5.6.1: download targets metadata file const bytesData = await this.fetcher.downloadBytes(metadataUrl, maxLength); @@ -280,7 +287,6 @@ class Updater { while (visitedRoleNames.size <= this.config.maxDelegations && delegationsToVisit.length > 0) { // Pop the role name from the top of the stack. - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const { roleName, parentRoleName } = delegationsToVisit.pop(); // Skip any visited current role to prevent cycles. // Client workflow 5.6.7.1: skip already-visited roles @@ -330,13 +336,14 @@ class Updater { return path.join(this.targetDir, filePath); } persistMetadata(metaDataName, bytesData) { + const encodedName = encodeURIComponent(metaDataName); try { - const filePath = path.join(this.dir, `${metaDataName}.json`); + const filePath = path.join(this.dir, `${encodedName}.json`); log('WRITE %s', filePath); fs.writeFileSync(filePath, bytesData.toString('utf8')); } catch (error) { - throw new error_1.PersistError(`Failed to persist metadata ${metaDataName} error: ${error}`); + throw new error_1.PersistError(`Failed to persist metadata ${encodedName} error: ${error}`); } } } diff --git a/deps/npm/node_modules/tuf-js/dist/utils/url.js b/deps/npm/node_modules/tuf-js/dist/utils/url.js index ce67fe2c230535..359d1f3ef385b7 100644 --- a/deps/npm/node_modules/tuf-js/dist/utils/url.js +++ b/deps/npm/node_modules/tuf-js/dist/utils/url.js @@ -1,11 +1,10 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.join = void 0; +exports.join = join; const url_1 = require("url"); function join(base, path) { return new url_1.URL(ensureTrailingSlash(base) + removeLeadingSlash(path)).toString(); } -exports.join = join; function ensureTrailingSlash(path) { return path.endsWith('/') ? path : path + '/'; } diff --git a/deps/npm/node_modules/tuf-js/node_modules/@npmcli/agent/lib/agents.js b/deps/npm/node_modules/tuf-js/node_modules/@npmcli/agent/lib/agents.js deleted file mode 100644 index c541b93001517e..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/@npmcli/agent/lib/agents.js +++ /dev/null @@ -1,206 +0,0 @@ -'use strict' - -const net = require('net') -const tls = require('tls') -const { once } = require('events') -const timers = require('timers/promises') -const { normalizeOptions, cacheOptions } = require('./options') -const { getProxy, getProxyAgent, proxyCache } = require('./proxy.js') -const Errors = require('./errors.js') -const { Agent: AgentBase } = require('agent-base') - -module.exports = class Agent extends AgentBase { - #options - #timeouts - #proxy - #noProxy - #ProxyAgent - - constructor (options = {}) { - const { timeouts, proxy, noProxy, ...normalizedOptions } = normalizeOptions(options) - - super(normalizedOptions) - - this.#options = normalizedOptions - this.#timeouts = timeouts - - if (proxy) { - this.#proxy = new URL(proxy) - this.#noProxy = noProxy - this.#ProxyAgent = getProxyAgent(proxy) - } - } - - get proxy () { - return this.#proxy ? { url: this.#proxy } : {} - } - - #getProxy (options) { - if (!this.#proxy) { - return - } - - const proxy = getProxy(`${options.protocol}//${options.host}:${options.port}`, { - proxy: this.#proxy, - noProxy: this.#noProxy, - }) - - if (!proxy) { - return - } - - const cacheKey = cacheOptions({ - ...options, - ...this.#options, - timeouts: this.#timeouts, - proxy, - }) - - if (proxyCache.has(cacheKey)) { - return proxyCache.get(cacheKey) - } - - let ProxyAgent = this.#ProxyAgent - if (Array.isArray(ProxyAgent)) { - ProxyAgent = this.isSecureEndpoint(options) ? ProxyAgent[1] : ProxyAgent[0] - } - - const proxyAgent = new ProxyAgent(proxy, { - ...this.#options, - socketOptions: { family: this.#options.family }, - }) - proxyCache.set(cacheKey, proxyAgent) - - return proxyAgent - } - - // takes an array of promises and races them against the connection timeout - // which will throw the necessary error if it is hit. This will return the - // result of the promise race. - async #timeoutConnection ({ promises, options, timeout }, ac = new AbortController()) { - if (timeout) { - const connectionTimeout = timers.setTimeout(timeout, null, { signal: ac.signal }) - .then(() => { - throw new Errors.ConnectionTimeoutError(`${options.host}:${options.port}`) - }).catch((err) => { - if (err.name === 'AbortError') { - return - } - throw err - }) - promises.push(connectionTimeout) - } - - let result - try { - result = await Promise.race(promises) - ac.abort() - } catch (err) { - ac.abort() - throw err - } - return result - } - - async connect (request, options) { - // if the connection does not have its own lookup function - // set, then use the one from our options - options.lookup ??= this.#options.lookup - - let socket - let timeout = this.#timeouts.connection - const isSecureEndpoint = this.isSecureEndpoint(options) - - const proxy = this.#getProxy(options) - if (proxy) { - // some of the proxies will wait for the socket to fully connect before - // returning so we have to await this while also racing it against the - // connection timeout. - const start = Date.now() - socket = await this.#timeoutConnection({ - options, - timeout, - promises: [proxy.connect(request, options)], - }) - // see how much time proxy.connect took and subtract it from - // the timeout - if (timeout) { - timeout = timeout - (Date.now() - start) - } - } else { - socket = (isSecureEndpoint ? tls : net).connect(options) - } - - socket.setKeepAlive(this.keepAlive, this.keepAliveMsecs) - socket.setNoDelay(this.keepAlive) - - const abortController = new AbortController() - const { signal } = abortController - - const connectPromise = socket[isSecureEndpoint ? 'secureConnecting' : 'connecting'] - ? once(socket, isSecureEndpoint ? 'secureConnect' : 'connect', { signal }) - : Promise.resolve() - - await this.#timeoutConnection({ - options, - timeout, - promises: [ - connectPromise, - once(socket, 'error', { signal }).then((err) => { - throw err[0] - }), - ], - }, abortController) - - if (this.#timeouts.idle) { - socket.setTimeout(this.#timeouts.idle, () => { - socket.destroy(new Errors.IdleTimeoutError(`${options.host}:${options.port}`)) - }) - } - - return socket - } - - addRequest (request, options) { - const proxy = this.#getProxy(options) - // it would be better to call proxy.addRequest here but this causes the - // http-proxy-agent to call its super.addRequest which causes the request - // to be added to the agent twice. since we only support 3 agents - // currently (see the required agents in proxy.js) we have manually - // checked that the only public methods we need to call are called in the - // next block. this could change in the future and presumably we would get - // failing tests until we have properly called the necessary methods on - // each of our proxy agents - if (proxy?.setRequestProps) { - proxy.setRequestProps(request, options) - } - - request.setHeader('connection', this.keepAlive ? 'keep-alive' : 'close') - - if (this.#timeouts.response) { - let responseTimeout - request.once('finish', () => { - setTimeout(() => { - request.destroy(new Errors.ResponseTimeoutError(request, this.#proxy)) - }, this.#timeouts.response) - }) - request.once('response', () => { - clearTimeout(responseTimeout) - }) - } - - if (this.#timeouts.transfer) { - let transferTimeout - request.once('response', (res) => { - setTimeout(() => { - res.destroy(new Errors.TransferTimeoutError(request, this.#proxy)) - }, this.#timeouts.transfer) - res.once('close', () => { - clearTimeout(transferTimeout) - }) - }) - } - - return super.addRequest(request, options) - } -} diff --git a/deps/npm/node_modules/tuf-js/node_modules/@npmcli/agent/lib/dns.js b/deps/npm/node_modules/tuf-js/node_modules/@npmcli/agent/lib/dns.js deleted file mode 100644 index 3c6946c566d736..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/@npmcli/agent/lib/dns.js +++ /dev/null @@ -1,53 +0,0 @@ -'use strict' - -const { LRUCache } = require('lru-cache') -const dns = require('dns') - -// this is a factory so that each request can have its own opts (i.e. ttl) -// while still sharing the cache across all requests -const cache = new LRUCache({ max: 50 }) - -const getOptions = ({ - family = 0, - hints = dns.ADDRCONFIG, - all = false, - verbatim = undefined, - ttl = 5 * 60 * 1000, - lookup = dns.lookup, -}) => ({ - // hints and lookup are returned since both are top level properties to (net|tls).connect - hints, - lookup: (hostname, ...args) => { - const callback = args.pop() // callback is always last arg - const lookupOptions = args[0] ?? {} - - const options = { - family, - hints, - all, - verbatim, - ...(typeof lookupOptions === 'number' ? { family: lookupOptions } : lookupOptions), - } - - const key = JSON.stringify({ hostname, ...options }) - - if (cache.has(key)) { - const cached = cache.get(key) - return process.nextTick(callback, null, ...cached) - } - - lookup(hostname, options, (err, ...result) => { - if (err) { - return callback(err) - } - - cache.set(key, result, { ttl }) - return callback(null, ...result) - }) - }, -}) - -module.exports = { - cache, - getOptions, -} diff --git a/deps/npm/node_modules/tuf-js/node_modules/@npmcli/agent/lib/errors.js b/deps/npm/node_modules/tuf-js/node_modules/@npmcli/agent/lib/errors.js deleted file mode 100644 index 70475aec8eb357..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/@npmcli/agent/lib/errors.js +++ /dev/null @@ -1,61 +0,0 @@ -'use strict' - -class InvalidProxyProtocolError extends Error { - constructor (url) { - super(`Invalid protocol \`${url.protocol}\` connecting to proxy \`${url.host}\``) - this.code = 'EINVALIDPROXY' - this.proxy = url - } -} - -class ConnectionTimeoutError extends Error { - constructor (host) { - super(`Timeout connecting to host \`${host}\``) - this.code = 'ECONNECTIONTIMEOUT' - this.host = host - } -} - -class IdleTimeoutError extends Error { - constructor (host) { - super(`Idle timeout reached for host \`${host}\``) - this.code = 'EIDLETIMEOUT' - this.host = host - } -} - -class ResponseTimeoutError extends Error { - constructor (request, proxy) { - let msg = 'Response timeout ' - if (proxy) { - msg += `from proxy \`${proxy.host}\` ` - } - msg += `connecting to host \`${request.host}\`` - super(msg) - this.code = 'ERESPONSETIMEOUT' - this.proxy = proxy - this.request = request - } -} - -class TransferTimeoutError extends Error { - constructor (request, proxy) { - let msg = 'Transfer timeout ' - if (proxy) { - msg += `from proxy \`${proxy.host}\` ` - } - msg += `for \`${request.host}\`` - super(msg) - this.code = 'ETRANSFERTIMEOUT' - this.proxy = proxy - this.request = request - } -} - -module.exports = { - InvalidProxyProtocolError, - ConnectionTimeoutError, - IdleTimeoutError, - ResponseTimeoutError, - TransferTimeoutError, -} diff --git a/deps/npm/node_modules/tuf-js/node_modules/@npmcli/agent/lib/index.js b/deps/npm/node_modules/tuf-js/node_modules/@npmcli/agent/lib/index.js deleted file mode 100644 index b33d6eaef07a21..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/@npmcli/agent/lib/index.js +++ /dev/null @@ -1,56 +0,0 @@ -'use strict' - -const { LRUCache } = require('lru-cache') -const { normalizeOptions, cacheOptions } = require('./options') -const { getProxy, proxyCache } = require('./proxy.js') -const dns = require('./dns.js') -const Agent = require('./agents.js') - -const agentCache = new LRUCache({ max: 20 }) - -const getAgent = (url, { agent, proxy, noProxy, ...options } = {}) => { - // false has meaning so this can't be a simple truthiness check - if (agent != null) { - return agent - } - - url = new URL(url) - - const proxyForUrl = getProxy(url, { proxy, noProxy }) - const normalizedOptions = { - ...normalizeOptions(options), - proxy: proxyForUrl, - } - - const cacheKey = cacheOptions({ - ...normalizedOptions, - secureEndpoint: url.protocol === 'https:', - }) - - if (agentCache.has(cacheKey)) { - return agentCache.get(cacheKey) - } - - const newAgent = new Agent(normalizedOptions) - agentCache.set(cacheKey, newAgent) - - return newAgent -} - -module.exports = { - getAgent, - Agent, - // these are exported for backwards compatability - HttpAgent: Agent, - HttpsAgent: Agent, - cache: { - proxy: proxyCache, - agent: agentCache, - dns: dns.cache, - clear: () => { - proxyCache.clear() - agentCache.clear() - dns.cache.clear() - }, - }, -} diff --git a/deps/npm/node_modules/tuf-js/node_modules/@npmcli/agent/lib/options.js b/deps/npm/node_modules/tuf-js/node_modules/@npmcli/agent/lib/options.js deleted file mode 100644 index 0bf53f725f0846..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/@npmcli/agent/lib/options.js +++ /dev/null @@ -1,86 +0,0 @@ -'use strict' - -const dns = require('./dns') - -const normalizeOptions = (opts) => { - const family = parseInt(opts.family ?? '0', 10) - const keepAlive = opts.keepAlive ?? true - - const normalized = { - // nodejs http agent options. these are all the defaults - // but kept here to increase the likelihood of cache hits - // https://nodejs.org/api/http.html#new-agentoptions - keepAliveMsecs: keepAlive ? 1000 : undefined, - maxSockets: opts.maxSockets ?? 15, - maxTotalSockets: Infinity, - maxFreeSockets: keepAlive ? 256 : undefined, - scheduling: 'fifo', - // then spread the rest of the options - ...opts, - // we already set these to their defaults that we want - family, - keepAlive, - // our custom timeout options - timeouts: { - // the standard timeout option is mapped to our idle timeout - // and then deleted below - idle: opts.timeout ?? 0, - connection: 0, - response: 0, - transfer: 0, - ...opts.timeouts, - }, - // get the dns options that go at the top level of socket connection - ...dns.getOptions({ family, ...opts.dns }), - } - - // remove timeout since we already used it to set our own idle timeout - delete normalized.timeout - - return normalized -} - -const createKey = (obj) => { - let key = '' - const sorted = Object.entries(obj).sort((a, b) => a[0] - b[0]) - for (let [k, v] of sorted) { - if (v == null) { - v = 'null' - } else if (v instanceof URL) { - v = v.toString() - } else if (typeof v === 'object') { - v = createKey(v) - } - key += `${k}:${v}:` - } - return key -} - -const cacheOptions = ({ secureEndpoint, ...options }) => createKey({ - secureEndpoint: !!secureEndpoint, - // socket connect options - family: options.family, - hints: options.hints, - localAddress: options.localAddress, - // tls specific connect options - strictSsl: secureEndpoint ? !!options.rejectUnauthorized : false, - ca: secureEndpoint ? options.ca : null, - cert: secureEndpoint ? options.cert : null, - key: secureEndpoint ? options.key : null, - // http agent options - keepAlive: options.keepAlive, - keepAliveMsecs: options.keepAliveMsecs, - maxSockets: options.maxSockets, - maxTotalSockets: options.maxTotalSockets, - maxFreeSockets: options.maxFreeSockets, - scheduling: options.scheduling, - // timeout options - timeouts: options.timeouts, - // proxy - proxy: options.proxy, -}) - -module.exports = { - normalizeOptions, - cacheOptions, -} diff --git a/deps/npm/node_modules/tuf-js/node_modules/@npmcli/agent/lib/proxy.js b/deps/npm/node_modules/tuf-js/node_modules/@npmcli/agent/lib/proxy.js deleted file mode 100644 index 6272e929e57bcf..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/@npmcli/agent/lib/proxy.js +++ /dev/null @@ -1,88 +0,0 @@ -'use strict' - -const { HttpProxyAgent } = require('http-proxy-agent') -const { HttpsProxyAgent } = require('https-proxy-agent') -const { SocksProxyAgent } = require('socks-proxy-agent') -const { LRUCache } = require('lru-cache') -const { InvalidProxyProtocolError } = require('./errors.js') - -const PROXY_CACHE = new LRUCache({ max: 20 }) - -const SOCKS_PROTOCOLS = new Set(SocksProxyAgent.protocols) - -const PROXY_ENV_KEYS = new Set(['https_proxy', 'http_proxy', 'proxy', 'no_proxy']) - -const PROXY_ENV = Object.entries(process.env).reduce((acc, [key, value]) => { - key = key.toLowerCase() - if (PROXY_ENV_KEYS.has(key)) { - acc[key] = value - } - return acc -}, {}) - -const getProxyAgent = (url) => { - url = new URL(url) - - const protocol = url.protocol.slice(0, -1) - if (SOCKS_PROTOCOLS.has(protocol)) { - return SocksProxyAgent - } - if (protocol === 'https' || protocol === 'http') { - return [HttpProxyAgent, HttpsProxyAgent] - } - - throw new InvalidProxyProtocolError(url) -} - -const isNoProxy = (url, noProxy) => { - if (typeof noProxy === 'string') { - noProxy = noProxy.split(',').map((p) => p.trim()).filter(Boolean) - } - - if (!noProxy || !noProxy.length) { - return false - } - - const hostSegments = url.hostname.split('.').reverse() - - return noProxy.some((no) => { - const noSegments = no.split('.').filter(Boolean).reverse() - if (!noSegments.length) { - return false - } - - for (let i = 0; i < noSegments.length; i++) { - if (hostSegments[i] !== noSegments[i]) { - return false - } - } - - return true - }) -} - -const getProxy = (url, { proxy, noProxy }) => { - url = new URL(url) - - if (!proxy) { - proxy = url.protocol === 'https:' - ? PROXY_ENV.https_proxy - : PROXY_ENV.https_proxy || PROXY_ENV.http_proxy || PROXY_ENV.proxy - } - - if (!noProxy) { - noProxy = PROXY_ENV.no_proxy - } - - if (!proxy || isNoProxy(url, noProxy)) { - return null - } - - return new URL(proxy) -} - -module.exports = { - getProxyAgent, - getProxy, - proxyCache: PROXY_CACHE, -} diff --git a/deps/npm/node_modules/tuf-js/node_modules/@npmcli/agent/package.json b/deps/npm/node_modules/tuf-js/node_modules/@npmcli/agent/package.json deleted file mode 100644 index ef5b4e3228cc46..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/@npmcli/agent/package.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "name": "@npmcli/agent", - "version": "2.2.2", - "description": "the http/https agent used by the npm cli", - "main": "lib/index.js", - "scripts": { - "gencerts": "bash scripts/create-cert.sh", - "test": "tap", - "lint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"", - "postlint": "template-oss-check", - "template-oss-apply": "template-oss-apply --force", - "lintfix": "npm run lint -- --fix", - "snap": "tap", - "posttest": "npm run lint" - }, - "author": "GitHub Inc.", - "license": "ISC", - "bugs": { - "url": "https://github.com/npm/agent/issues" - }, - "homepage": "https://github.com/npm/agent#readme", - "files": [ - "bin/", - "lib/" - ], - "engines": { - "node": "^16.14.0 || >=18.0.0" - }, - "templateOSS": { - "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.21.3", - "publish": "true" - }, - "dependencies": { - "agent-base": "^7.1.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.1", - "lru-cache": "^10.0.1", - "socks-proxy-agent": "^8.0.3" - }, - "devDependencies": { - "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.21.3", - "minipass-fetch": "^3.0.3", - "nock": "^13.2.7", - "semver": "^7.5.4", - "simple-socks": "^3.1.0", - "tap": "^16.3.0" - }, - "repository": { - "type": "git", - "url": "https://github.com/npm/agent.git" - }, - "tap": { - "nyc-arg": [ - "--exclude", - "tap-snapshots/**" - ] - } -} diff --git a/deps/npm/node_modules/tuf-js/node_modules/@npmcli/fs/LICENSE.md b/deps/npm/node_modules/tuf-js/node_modules/@npmcli/fs/LICENSE.md deleted file mode 100644 index 5fc208ff122e08..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/@npmcli/fs/LICENSE.md +++ /dev/null @@ -1,20 +0,0 @@ - - -ISC License - -Copyright npm, Inc. - -Permission to use, copy, modify, and/or distribute this -software for any purpose with or without fee is hereby -granted, provided that the above copyright notice and this -permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND NPM DISCLAIMS ALL -WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO -EVENT SHALL NPM BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE -USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/deps/npm/node_modules/tuf-js/node_modules/@npmcli/fs/lib/common/get-options.js b/deps/npm/node_modules/tuf-js/node_modules/@npmcli/fs/lib/common/get-options.js deleted file mode 100644 index cb5982f79077ac..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/@npmcli/fs/lib/common/get-options.js +++ /dev/null @@ -1,20 +0,0 @@ -// given an input that may or may not be an object, return an object that has -// a copy of every defined property listed in 'copy'. if the input is not an -// object, assign it to the property named by 'wrap' -const getOptions = (input, { copy, wrap }) => { - const result = {} - - if (input && typeof input === 'object') { - for (const prop of copy) { - if (input[prop] !== undefined) { - result[prop] = input[prop] - } - } - } else { - result[wrap] = input - } - - return result -} - -module.exports = getOptions diff --git a/deps/npm/node_modules/tuf-js/node_modules/@npmcli/fs/lib/common/node.js b/deps/npm/node_modules/tuf-js/node_modules/@npmcli/fs/lib/common/node.js deleted file mode 100644 index 4d13bc037359d7..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/@npmcli/fs/lib/common/node.js +++ /dev/null @@ -1,9 +0,0 @@ -const semver = require('semver') - -const satisfies = (range) => { - return semver.satisfies(process.version, range, { includePrerelease: true }) -} - -module.exports = { - satisfies, -} diff --git a/deps/npm/node_modules/tuf-js/node_modules/@npmcli/fs/lib/cp/LICENSE b/deps/npm/node_modules/tuf-js/node_modules/@npmcli/fs/lib/cp/LICENSE deleted file mode 100644 index 93546dfb7655bf..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/@npmcli/fs/lib/cp/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -(The MIT License) - -Copyright (c) 2011-2017 JP Richardson - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files -(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, - merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS -OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/deps/npm/node_modules/tuf-js/node_modules/@npmcli/fs/lib/cp/errors.js b/deps/npm/node_modules/tuf-js/node_modules/@npmcli/fs/lib/cp/errors.js deleted file mode 100644 index 1cd1e05d0c533d..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/@npmcli/fs/lib/cp/errors.js +++ /dev/null @@ -1,129 +0,0 @@ -'use strict' -const { inspect } = require('util') - -// adapted from node's internal/errors -// https://github.com/nodejs/node/blob/c8a04049/lib/internal/errors.js - -// close copy of node's internal SystemError class. -class SystemError { - constructor (code, prefix, context) { - // XXX context.code is undefined in all constructors used in cp/polyfill - // that may be a bug copied from node, maybe the constructor should use - // `code` not `errno`? nodejs/node#41104 - let message = `${prefix}: ${context.syscall} returned ` + - `${context.code} (${context.message})` - - if (context.path !== undefined) { - message += ` ${context.path}` - } - if (context.dest !== undefined) { - message += ` => ${context.dest}` - } - - this.code = code - Object.defineProperties(this, { - name: { - value: 'SystemError', - enumerable: false, - writable: true, - configurable: true, - }, - message: { - value: message, - enumerable: false, - writable: true, - configurable: true, - }, - info: { - value: context, - enumerable: true, - configurable: true, - writable: false, - }, - errno: { - get () { - return context.errno - }, - set (value) { - context.errno = value - }, - enumerable: true, - configurable: true, - }, - syscall: { - get () { - return context.syscall - }, - set (value) { - context.syscall = value - }, - enumerable: true, - configurable: true, - }, - }) - - if (context.path !== undefined) { - Object.defineProperty(this, 'path', { - get () { - return context.path - }, - set (value) { - context.path = value - }, - enumerable: true, - configurable: true, - }) - } - - if (context.dest !== undefined) { - Object.defineProperty(this, 'dest', { - get () { - return context.dest - }, - set (value) { - context.dest = value - }, - enumerable: true, - configurable: true, - }) - } - } - - toString () { - return `${this.name} [${this.code}]: ${this.message}` - } - - [Symbol.for('nodejs.util.inspect.custom')] (_recurseTimes, ctx) { - return inspect(this, { - ...ctx, - getters: true, - customInspect: false, - }) - } -} - -function E (code, message) { - module.exports[code] = class NodeError extends SystemError { - constructor (ctx) { - super(code, message, ctx) - } - } -} - -E('ERR_FS_CP_DIR_TO_NON_DIR', 'Cannot overwrite directory with non-directory') -E('ERR_FS_CP_EEXIST', 'Target already exists') -E('ERR_FS_CP_EINVAL', 'Invalid src or dest') -E('ERR_FS_CP_FIFO_PIPE', 'Cannot copy a FIFO pipe') -E('ERR_FS_CP_NON_DIR_TO_DIR', 'Cannot overwrite non-directory with directory') -E('ERR_FS_CP_SOCKET', 'Cannot copy a socket file') -E('ERR_FS_CP_SYMLINK_TO_SUBDIRECTORY', 'Cannot overwrite symlink in subdirectory of self') -E('ERR_FS_CP_UNKNOWN', 'Cannot copy an unknown file type') -E('ERR_FS_EISDIR', 'Path is a directory') - -module.exports.ERR_INVALID_ARG_TYPE = class ERR_INVALID_ARG_TYPE extends Error { - constructor (name, expected, actual) { - super() - this.code = 'ERR_INVALID_ARG_TYPE' - this.message = `The ${name} argument must be ${expected}. Received ${typeof actual}` - } -} diff --git a/deps/npm/node_modules/tuf-js/node_modules/@npmcli/fs/lib/cp/index.js b/deps/npm/node_modules/tuf-js/node_modules/@npmcli/fs/lib/cp/index.js deleted file mode 100644 index 972ce7aa12abef..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/@npmcli/fs/lib/cp/index.js +++ /dev/null @@ -1,22 +0,0 @@ -const fs = require('fs/promises') -const getOptions = require('../common/get-options.js') -const node = require('../common/node.js') -const polyfill = require('./polyfill.js') - -// node 16.7.0 added fs.cp -const useNative = node.satisfies('>=16.7.0') - -const cp = async (src, dest, opts) => { - const options = getOptions(opts, { - copy: ['dereference', 'errorOnExist', 'filter', 'force', 'preserveTimestamps', 'recursive'], - }) - - // the polyfill is tested separately from this module, no need to hack - // process.version to try to trigger it just for coverage - // istanbul ignore next - return useNative - ? fs.cp(src, dest, options) - : polyfill(src, dest, options) -} - -module.exports = cp diff --git a/deps/npm/node_modules/tuf-js/node_modules/@npmcli/fs/lib/cp/polyfill.js b/deps/npm/node_modules/tuf-js/node_modules/@npmcli/fs/lib/cp/polyfill.js deleted file mode 100644 index 80eb10de971918..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/@npmcli/fs/lib/cp/polyfill.js +++ /dev/null @@ -1,428 +0,0 @@ -// this file is a modified version of the code in node 17.2.0 -// which is, in turn, a modified version of the fs-extra module on npm -// node core changes: -// - Use of the assert module has been replaced with core's error system. -// - All code related to the glob dependency has been removed. -// - Bring your own custom fs module is not currently supported. -// - Some basic code cleanup. -// changes here: -// - remove all callback related code -// - drop sync support -// - change assertions back to non-internal methods (see options.js) -// - throws ENOTDIR when rmdir gets an ENOENT for a path that exists in Windows -'use strict' - -const { - ERR_FS_CP_DIR_TO_NON_DIR, - ERR_FS_CP_EEXIST, - ERR_FS_CP_EINVAL, - ERR_FS_CP_FIFO_PIPE, - ERR_FS_CP_NON_DIR_TO_DIR, - ERR_FS_CP_SOCKET, - ERR_FS_CP_SYMLINK_TO_SUBDIRECTORY, - ERR_FS_CP_UNKNOWN, - ERR_FS_EISDIR, - ERR_INVALID_ARG_TYPE, -} = require('./errors.js') -const { - constants: { - errno: { - EEXIST, - EISDIR, - EINVAL, - ENOTDIR, - }, - }, -} = require('os') -const { - chmod, - copyFile, - lstat, - mkdir, - readdir, - readlink, - stat, - symlink, - unlink, - utimes, -} = require('fs/promises') -const { - dirname, - isAbsolute, - join, - parse, - resolve, - sep, - toNamespacedPath, -} = require('path') -const { fileURLToPath } = require('url') - -const defaultOptions = { - dereference: false, - errorOnExist: false, - filter: undefined, - force: true, - preserveTimestamps: false, - recursive: false, -} - -async function cp (src, dest, opts) { - if (opts != null && typeof opts !== 'object') { - throw new ERR_INVALID_ARG_TYPE('options', ['Object'], opts) - } - return cpFn( - toNamespacedPath(getValidatedPath(src)), - toNamespacedPath(getValidatedPath(dest)), - { ...defaultOptions, ...opts }) -} - -function getValidatedPath (fileURLOrPath) { - const path = fileURLOrPath != null && fileURLOrPath.href - && fileURLOrPath.origin - ? fileURLToPath(fileURLOrPath) - : fileURLOrPath - return path -} - -async function cpFn (src, dest, opts) { - // Warn about using preserveTimestamps on 32-bit node - // istanbul ignore next - if (opts.preserveTimestamps && process.arch === 'ia32') { - const warning = 'Using the preserveTimestamps option in 32-bit ' + - 'node is not recommended' - process.emitWarning(warning, 'TimestampPrecisionWarning') - } - const stats = await checkPaths(src, dest, opts) - const { srcStat, destStat } = stats - await checkParentPaths(src, srcStat, dest) - if (opts.filter) { - return handleFilter(checkParentDir, destStat, src, dest, opts) - } - return checkParentDir(destStat, src, dest, opts) -} - -async function checkPaths (src, dest, opts) { - const { 0: srcStat, 1: destStat } = await getStats(src, dest, opts) - if (destStat) { - if (areIdentical(srcStat, destStat)) { - throw new ERR_FS_CP_EINVAL({ - message: 'src and dest cannot be the same', - path: dest, - syscall: 'cp', - errno: EINVAL, - }) - } - if (srcStat.isDirectory() && !destStat.isDirectory()) { - throw new ERR_FS_CP_DIR_TO_NON_DIR({ - message: `cannot overwrite directory ${src} ` + - `with non-directory ${dest}`, - path: dest, - syscall: 'cp', - errno: EISDIR, - }) - } - if (!srcStat.isDirectory() && destStat.isDirectory()) { - throw new ERR_FS_CP_NON_DIR_TO_DIR({ - message: `cannot overwrite non-directory ${src} ` + - `with directory ${dest}`, - path: dest, - syscall: 'cp', - errno: ENOTDIR, - }) - } - } - - if (srcStat.isDirectory() && isSrcSubdir(src, dest)) { - throw new ERR_FS_CP_EINVAL({ - message: `cannot copy ${src} to a subdirectory of self ${dest}`, - path: dest, - syscall: 'cp', - errno: EINVAL, - }) - } - return { srcStat, destStat } -} - -function areIdentical (srcStat, destStat) { - return destStat.ino && destStat.dev && destStat.ino === srcStat.ino && - destStat.dev === srcStat.dev -} - -function getStats (src, dest, opts) { - const statFunc = opts.dereference ? - (file) => stat(file, { bigint: true }) : - (file) => lstat(file, { bigint: true }) - return Promise.all([ - statFunc(src), - statFunc(dest).catch((err) => { - // istanbul ignore next: unsure how to cover. - if (err.code === 'ENOENT') { - return null - } - // istanbul ignore next: unsure how to cover. - throw err - }), - ]) -} - -async function checkParentDir (destStat, src, dest, opts) { - const destParent = dirname(dest) - const dirExists = await pathExists(destParent) - if (dirExists) { - return getStatsForCopy(destStat, src, dest, opts) - } - await mkdir(destParent, { recursive: true }) - return getStatsForCopy(destStat, src, dest, opts) -} - -function pathExists (dest) { - return stat(dest).then( - () => true, - // istanbul ignore next: not sure when this would occur - (err) => (err.code === 'ENOENT' ? false : Promise.reject(err))) -} - -// Recursively check if dest parent is a subdirectory of src. -// It works for all file types including symlinks since it -// checks the src and dest inodes. It starts from the deepest -// parent and stops once it reaches the src parent or the root path. -async function checkParentPaths (src, srcStat, dest) { - const srcParent = resolve(dirname(src)) - const destParent = resolve(dirname(dest)) - if (destParent === srcParent || destParent === parse(destParent).root) { - return - } - let destStat - try { - destStat = await stat(destParent, { bigint: true }) - } catch (err) { - // istanbul ignore else: not sure when this would occur - if (err.code === 'ENOENT') { - return - } - // istanbul ignore next: not sure when this would occur - throw err - } - if (areIdentical(srcStat, destStat)) { - throw new ERR_FS_CP_EINVAL({ - message: `cannot copy ${src} to a subdirectory of self ${dest}`, - path: dest, - syscall: 'cp', - errno: EINVAL, - }) - } - return checkParentPaths(src, srcStat, destParent) -} - -const normalizePathToArray = (path) => - resolve(path).split(sep).filter(Boolean) - -// Return true if dest is a subdir of src, otherwise false. -// It only checks the path strings. -function isSrcSubdir (src, dest) { - const srcArr = normalizePathToArray(src) - const destArr = normalizePathToArray(dest) - return srcArr.every((cur, i) => destArr[i] === cur) -} - -async function handleFilter (onInclude, destStat, src, dest, opts, cb) { - const include = await opts.filter(src, dest) - if (include) { - return onInclude(destStat, src, dest, opts, cb) - } -} - -function startCopy (destStat, src, dest, opts) { - if (opts.filter) { - return handleFilter(getStatsForCopy, destStat, src, dest, opts) - } - return getStatsForCopy(destStat, src, dest, opts) -} - -async function getStatsForCopy (destStat, src, dest, opts) { - const statFn = opts.dereference ? stat : lstat - const srcStat = await statFn(src) - // istanbul ignore else: can't portably test FIFO - if (srcStat.isDirectory() && opts.recursive) { - return onDir(srcStat, destStat, src, dest, opts) - } else if (srcStat.isDirectory()) { - throw new ERR_FS_EISDIR({ - message: `${src} is a directory (not copied)`, - path: src, - syscall: 'cp', - errno: EINVAL, - }) - } else if (srcStat.isFile() || - srcStat.isCharacterDevice() || - srcStat.isBlockDevice()) { - return onFile(srcStat, destStat, src, dest, opts) - } else if (srcStat.isSymbolicLink()) { - return onLink(destStat, src, dest) - } else if (srcStat.isSocket()) { - throw new ERR_FS_CP_SOCKET({ - message: `cannot copy a socket file: ${dest}`, - path: dest, - syscall: 'cp', - errno: EINVAL, - }) - } else if (srcStat.isFIFO()) { - throw new ERR_FS_CP_FIFO_PIPE({ - message: `cannot copy a FIFO pipe: ${dest}`, - path: dest, - syscall: 'cp', - errno: EINVAL, - }) - } - // istanbul ignore next: should be unreachable - throw new ERR_FS_CP_UNKNOWN({ - message: `cannot copy an unknown file type: ${dest}`, - path: dest, - syscall: 'cp', - errno: EINVAL, - }) -} - -function onFile (srcStat, destStat, src, dest, opts) { - if (!destStat) { - return _copyFile(srcStat, src, dest, opts) - } - return mayCopyFile(srcStat, src, dest, opts) -} - -async function mayCopyFile (srcStat, src, dest, opts) { - if (opts.force) { - await unlink(dest) - return _copyFile(srcStat, src, dest, opts) - } else if (opts.errorOnExist) { - throw new ERR_FS_CP_EEXIST({ - message: `${dest} already exists`, - path: dest, - syscall: 'cp', - errno: EEXIST, - }) - } -} - -async function _copyFile (srcStat, src, dest, opts) { - await copyFile(src, dest) - if (opts.preserveTimestamps) { - return handleTimestampsAndMode(srcStat.mode, src, dest) - } - return setDestMode(dest, srcStat.mode) -} - -async function handleTimestampsAndMode (srcMode, src, dest) { - // Make sure the file is writable before setting the timestamp - // otherwise open fails with EPERM when invoked with 'r+' - // (through utimes call) - if (fileIsNotWritable(srcMode)) { - await makeFileWritable(dest, srcMode) - return setDestTimestampsAndMode(srcMode, src, dest) - } - return setDestTimestampsAndMode(srcMode, src, dest) -} - -function fileIsNotWritable (srcMode) { - return (srcMode & 0o200) === 0 -} - -function makeFileWritable (dest, srcMode) { - return setDestMode(dest, srcMode | 0o200) -} - -async function setDestTimestampsAndMode (srcMode, src, dest) { - await setDestTimestamps(src, dest) - return setDestMode(dest, srcMode) -} - -function setDestMode (dest, srcMode) { - return chmod(dest, srcMode) -} - -async function setDestTimestamps (src, dest) { - // The initial srcStat.atime cannot be trusted - // because it is modified by the read(2) system call - // (See https://nodejs.org/api/fs.html#fs_stat_time_values) - const updatedSrcStat = await stat(src) - return utimes(dest, updatedSrcStat.atime, updatedSrcStat.mtime) -} - -function onDir (srcStat, destStat, src, dest, opts) { - if (!destStat) { - return mkDirAndCopy(srcStat.mode, src, dest, opts) - } - return copyDir(src, dest, opts) -} - -async function mkDirAndCopy (srcMode, src, dest, opts) { - await mkdir(dest) - await copyDir(src, dest, opts) - return setDestMode(dest, srcMode) -} - -async function copyDir (src, dest, opts) { - const dir = await readdir(src) - for (let i = 0; i < dir.length; i++) { - const item = dir[i] - const srcItem = join(src, item) - const destItem = join(dest, item) - const { destStat } = await checkPaths(srcItem, destItem, opts) - await startCopy(destStat, srcItem, destItem, opts) - } -} - -async function onLink (destStat, src, dest) { - let resolvedSrc = await readlink(src) - if (!isAbsolute(resolvedSrc)) { - resolvedSrc = resolve(dirname(src), resolvedSrc) - } - if (!destStat) { - return symlink(resolvedSrc, dest) - } - let resolvedDest - try { - resolvedDest = await readlink(dest) - } catch (err) { - // Dest exists and is a regular file or directory, - // Windows may throw UNKNOWN error. If dest already exists, - // fs throws error anyway, so no need to guard against it here. - // istanbul ignore next: can only test on windows - if (err.code === 'EINVAL' || err.code === 'UNKNOWN') { - return symlink(resolvedSrc, dest) - } - // istanbul ignore next: should not be possible - throw err - } - if (!isAbsolute(resolvedDest)) { - resolvedDest = resolve(dirname(dest), resolvedDest) - } - if (isSrcSubdir(resolvedSrc, resolvedDest)) { - throw new ERR_FS_CP_EINVAL({ - message: `cannot copy ${resolvedSrc} to a subdirectory of self ` + - `${resolvedDest}`, - path: dest, - syscall: 'cp', - errno: EINVAL, - }) - } - // Do not copy if src is a subdir of dest since unlinking - // dest in this case would result in removing src contents - // and therefore a broken symlink would be created. - const srcStat = await stat(src) - if (srcStat.isDirectory() && isSrcSubdir(resolvedDest, resolvedSrc)) { - throw new ERR_FS_CP_SYMLINK_TO_SUBDIRECTORY({ - message: `cannot overwrite ${resolvedDest} with ${resolvedSrc}`, - path: dest, - syscall: 'cp', - errno: EINVAL, - }) - } - return copyLink(resolvedSrc, dest) -} - -async function copyLink (resolvedSrc, dest) { - await unlink(dest) - return symlink(resolvedSrc, dest) -} - -module.exports = cp diff --git a/deps/npm/node_modules/tuf-js/node_modules/@npmcli/fs/lib/index.js b/deps/npm/node_modules/tuf-js/node_modules/@npmcli/fs/lib/index.js deleted file mode 100644 index 81c746304cc428..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/@npmcli/fs/lib/index.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict' - -const cp = require('./cp/index.js') -const withTempDir = require('./with-temp-dir.js') -const readdirScoped = require('./readdir-scoped.js') -const moveFile = require('./move-file.js') - -module.exports = { - cp, - withTempDir, - readdirScoped, - moveFile, -} diff --git a/deps/npm/node_modules/tuf-js/node_modules/@npmcli/fs/lib/move-file.js b/deps/npm/node_modules/tuf-js/node_modules/@npmcli/fs/lib/move-file.js deleted file mode 100644 index d56e06d384659a..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/@npmcli/fs/lib/move-file.js +++ /dev/null @@ -1,78 +0,0 @@ -const { dirname, join, resolve, relative, isAbsolute } = require('path') -const fs = require('fs/promises') - -const pathExists = async path => { - try { - await fs.access(path) - return true - } catch (er) { - return er.code !== 'ENOENT' - } -} - -const moveFile = async (source, destination, options = {}, root = true, symlinks = []) => { - if (!source || !destination) { - throw new TypeError('`source` and `destination` file required') - } - - options = { - overwrite: true, - ...options, - } - - if (!options.overwrite && await pathExists(destination)) { - throw new Error(`The destination file exists: ${destination}`) - } - - await fs.mkdir(dirname(destination), { recursive: true }) - - try { - await fs.rename(source, destination) - } catch (error) { - if (error.code === 'EXDEV' || error.code === 'EPERM') { - const sourceStat = await fs.lstat(source) - if (sourceStat.isDirectory()) { - const files = await fs.readdir(source) - await Promise.all(files.map((file) => - moveFile(join(source, file), join(destination, file), options, false, symlinks) - )) - } else if (sourceStat.isSymbolicLink()) { - symlinks.push({ source, destination }) - } else { - await fs.copyFile(source, destination) - } - } else { - throw error - } - } - - if (root) { - await Promise.all(symlinks.map(async ({ source: symSource, destination: symDestination }) => { - let target = await fs.readlink(symSource) - // junction symlinks in windows will be absolute paths, so we need to - // make sure they point to the symlink destination - if (isAbsolute(target)) { - target = resolve(symDestination, relative(symSource, target)) - } - // try to determine what the actual file is so we can create the correct - // type of symlink in windows - let targetStat = 'file' - try { - targetStat = await fs.stat(resolve(dirname(symSource), target)) - if (targetStat.isDirectory()) { - targetStat = 'junction' - } - } catch { - // targetStat remains 'file' - } - await fs.symlink( - target, - symDestination, - targetStat - ) - })) - await fs.rm(source, { recursive: true, force: true }) - } -} - -module.exports = moveFile diff --git a/deps/npm/node_modules/tuf-js/node_modules/@npmcli/fs/lib/readdir-scoped.js b/deps/npm/node_modules/tuf-js/node_modules/@npmcli/fs/lib/readdir-scoped.js deleted file mode 100644 index cd601dfbe7486b..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/@npmcli/fs/lib/readdir-scoped.js +++ /dev/null @@ -1,20 +0,0 @@ -const { readdir } = require('fs/promises') -const { join } = require('path') - -const readdirScoped = async (dir) => { - const results = [] - - for (const item of await readdir(dir)) { - if (item.startsWith('@')) { - for (const scopedItem of await readdir(join(dir, item))) { - results.push(join(item, scopedItem)) - } - } else { - results.push(item) - } - } - - return results -} - -module.exports = readdirScoped diff --git a/deps/npm/node_modules/tuf-js/node_modules/@npmcli/fs/lib/with-temp-dir.js b/deps/npm/node_modules/tuf-js/node_modules/@npmcli/fs/lib/with-temp-dir.js deleted file mode 100644 index 0738ac4f29e1be..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/@npmcli/fs/lib/with-temp-dir.js +++ /dev/null @@ -1,39 +0,0 @@ -const { join, sep } = require('path') - -const getOptions = require('./common/get-options.js') -const { mkdir, mkdtemp, rm } = require('fs/promises') - -// create a temp directory, ensure its permissions match its parent, then call -// the supplied function passing it the path to the directory. clean up after -// the function finishes, whether it throws or not -const withTempDir = async (root, fn, opts) => { - const options = getOptions(opts, { - copy: ['tmpPrefix'], - }) - // create the directory - await mkdir(root, { recursive: true }) - - const target = await mkdtemp(join(`${root}${sep}`, options.tmpPrefix || '')) - let err - let result - - try { - result = await fn(target) - } catch (_err) { - err = _err - } - - try { - await rm(target, { force: true, recursive: true }) - } catch { - // ignore errors - } - - if (err) { - throw err - } - - return result -} - -module.exports = withTempDir diff --git a/deps/npm/node_modules/tuf-js/node_modules/@npmcli/fs/package.json b/deps/npm/node_modules/tuf-js/node_modules/@npmcli/fs/package.json deleted file mode 100644 index 5261a11b78000e..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/@npmcli/fs/package.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "name": "@npmcli/fs", - "version": "3.1.1", - "description": "filesystem utilities for the npm cli", - "main": "lib/index.js", - "files": [ - "bin/", - "lib/" - ], - "scripts": { - "snap": "tap", - "test": "tap", - "npmclilint": "npmcli-lint", - "lint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"", - "lintfix": "npm run lint -- --fix", - "posttest": "npm run lint", - "postsnap": "npm run lintfix --", - "postlint": "template-oss-check", - "template-oss-apply": "template-oss-apply --force" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/npm/fs.git" - }, - "keywords": [ - "npm", - "oss" - ], - "author": "GitHub Inc.", - "license": "ISC", - "devDependencies": { - "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.22.0", - "tap": "^16.0.1" - }, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "templateOSS": { - "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.22.0" - }, - "tap": { - "nyc-arg": [ - "--exclude", - "tap-snapshots/**" - ] - } -} diff --git a/deps/npm/node_modules/@tufjs/models/LICENSE b/deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/LICENSE similarity index 100% rename from deps/npm/node_modules/@tufjs/models/LICENSE rename to deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/LICENSE diff --git a/deps/npm/node_modules/@tufjs/models/dist/base.js b/deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/base.js similarity index 80% rename from deps/npm/node_modules/@tufjs/models/dist/base.js rename to deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/base.js index 259f6799c13a0d..85e45d8fc1151e 100644 --- a/deps/npm/node_modules/@tufjs/models/dist/base.js +++ b/deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/base.js @@ -3,7 +3,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.Signed = exports.isMetadataKind = exports.MetadataKind = void 0; +exports.Signed = exports.MetadataKind = void 0; +exports.isMetadataKind = isMetadataKind; const util_1 = __importDefault(require("util")); const error_1 = require("./error"); const utils_1 = require("./utils"); @@ -19,7 +20,6 @@ function isMetadataKind(value) { return (typeof value === 'string' && Object.values(MetadataKind).includes(value)); } -exports.isMetadataKind = isMetadataKind; /*** * A base class for the signed part of TUF metadata. * @@ -39,8 +39,8 @@ class Signed { if (specList[0] != SPECIFICATION_VERSION[0]) { throw new error_1.ValueError('Unsupported specVersion'); } - this.expires = options.expires || new Date().toISOString(); - this.version = options.version || 1; + this.expires = options.expires; + this.version = options.version; this.unrecognizedFields = options.unrecognizedFields || {}; } equals(other) { @@ -60,13 +60,22 @@ class Signed { } static commonFieldsFromJSON(data) { const { spec_version, expires, version, ...rest } = data; - if (utils_1.guard.isDefined(spec_version) && !(typeof spec_version === 'string')) { + if (!utils_1.guard.isDefined(spec_version)) { + throw new error_1.ValueError('spec_version is not defined'); + } + else if (typeof spec_version !== 'string') { throw new TypeError('spec_version must be a string'); } - if (utils_1.guard.isDefined(expires) && !(typeof expires === 'string')) { + if (!utils_1.guard.isDefined(expires)) { + throw new error_1.ValueError('expires is not defined'); + } + else if (!(typeof expires === 'string')) { throw new TypeError('expires must be a string'); } - if (utils_1.guard.isDefined(version) && !(typeof version === 'number')) { + if (!utils_1.guard.isDefined(version)) { + throw new error_1.ValueError('version is not defined'); + } + else if (!(typeof version === 'number')) { throw new TypeError('version must be a number'); } return { diff --git a/deps/npm/node_modules/@tufjs/models/dist/delegations.js b/deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/delegations.js similarity index 100% rename from deps/npm/node_modules/@tufjs/models/dist/delegations.js rename to deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/delegations.js diff --git a/deps/npm/node_modules/@tufjs/models/dist/error.js b/deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/error.js similarity index 100% rename from deps/npm/node_modules/@tufjs/models/dist/error.js rename to deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/error.js diff --git a/deps/npm/node_modules/@tufjs/models/dist/file.js b/deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/file.js similarity index 100% rename from deps/npm/node_modules/@tufjs/models/dist/file.js rename to deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/file.js diff --git a/deps/npm/node_modules/@tufjs/models/dist/index.js b/deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/index.js similarity index 100% rename from deps/npm/node_modules/@tufjs/models/dist/index.js rename to deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/index.js diff --git a/deps/npm/node_modules/@tufjs/models/dist/key.js b/deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/key.js similarity index 100% rename from deps/npm/node_modules/@tufjs/models/dist/key.js rename to deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/key.js diff --git a/deps/npm/node_modules/@tufjs/models/dist/metadata.js b/deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/metadata.js similarity index 91% rename from deps/npm/node_modules/@tufjs/models/dist/metadata.js rename to deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/metadata.js index 9668b6f14fa701..389d2504e0b53d 100644 --- a/deps/npm/node_modules/@tufjs/models/dist/metadata.js +++ b/deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/metadata.js @@ -125,6 +125,9 @@ class Metadata { if (type !== signed._type) { throw new error_1.ValueError(`expected '${type}', got ${signed['_type']}`); } + if (!utils_1.guard.isObjectArray(signatures)) { + throw new TypeError('signatures is not an array'); + } let signedObj; switch (type) { case base_1.MetadataKind.Root: @@ -142,17 +145,16 @@ class Metadata { default: throw new TypeError('invalid metadata type'); } - const sigMap = signaturesFromJSON(signatures); + const sigMap = {}; + // Ensure that each signature is unique + signatures.forEach((sigData) => { + const sig = signature_1.Signature.fromJSON(sigData); + if (sigMap[sig.keyID]) { + throw new error_1.ValueError(`multiple signatures found for keyid: ${sig.keyID}`); + } + sigMap[sig.keyID] = sig; + }); return new Metadata(signedObj, sigMap, rest); } } exports.Metadata = Metadata; -function signaturesFromJSON(data) { - if (!utils_1.guard.isObjectArray(data)) { - throw new TypeError('signatures is not an array'); - } - return data.reduce((acc, sigData) => { - const signature = signature_1.Signature.fromJSON(sigData); - return { ...acc, [signature.keyID]: signature }; - }, {}); -} diff --git a/deps/npm/node_modules/@tufjs/models/dist/role.js b/deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/role.js similarity index 100% rename from deps/npm/node_modules/@tufjs/models/dist/role.js rename to deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/role.js diff --git a/deps/npm/node_modules/@tufjs/models/dist/root.js b/deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/root.js similarity index 100% rename from deps/npm/node_modules/@tufjs/models/dist/root.js rename to deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/root.js diff --git a/deps/npm/node_modules/@tufjs/models/dist/signature.js b/deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/signature.js similarity index 100% rename from deps/npm/node_modules/@tufjs/models/dist/signature.js rename to deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/signature.js diff --git a/deps/npm/node_modules/@tufjs/models/dist/snapshot.js b/deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/snapshot.js similarity index 100% rename from deps/npm/node_modules/@tufjs/models/dist/snapshot.js rename to deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/snapshot.js diff --git a/deps/npm/node_modules/@tufjs/models/dist/targets.js b/deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/targets.js similarity index 100% rename from deps/npm/node_modules/@tufjs/models/dist/targets.js rename to deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/targets.js diff --git a/deps/npm/node_modules/@tufjs/models/dist/timestamp.js b/deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/timestamp.js similarity index 100% rename from deps/npm/node_modules/@tufjs/models/dist/timestamp.js rename to deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/timestamp.js diff --git a/deps/npm/node_modules/@tufjs/models/dist/utils/guard.js b/deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/utils/guard.js similarity index 88% rename from deps/npm/node_modules/@tufjs/models/dist/utils/guard.js rename to deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/utils/guard.js index efe558852303ce..911e8475986bbc 100644 --- a/deps/npm/node_modules/@tufjs/models/dist/utils/guard.js +++ b/deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/utils/guard.js @@ -1,33 +1,32 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.isObjectRecord = exports.isStringRecord = exports.isObjectArray = exports.isStringArray = exports.isObject = exports.isDefined = void 0; +exports.isDefined = isDefined; +exports.isObject = isObject; +exports.isStringArray = isStringArray; +exports.isObjectArray = isObjectArray; +exports.isStringRecord = isStringRecord; +exports.isObjectRecord = isObjectRecord; function isDefined(val) { return val !== undefined; } -exports.isDefined = isDefined; function isObject(value) { return typeof value === 'object' && value !== null; } -exports.isObject = isObject; function isStringArray(value) { return Array.isArray(value) && value.every((v) => typeof v === 'string'); } -exports.isStringArray = isStringArray; function isObjectArray(value) { return Array.isArray(value) && value.every(isObject); } -exports.isObjectArray = isObjectArray; function isStringRecord(value) { return (typeof value === 'object' && value !== null && Object.keys(value).every((k) => typeof k === 'string') && Object.values(value).every((v) => typeof v === 'string')); } -exports.isStringRecord = isStringRecord; function isObjectRecord(value) { return (typeof value === 'object' && value !== null && Object.keys(value).every((k) => typeof k === 'string') && Object.values(value).every((v) => typeof v === 'object' && v !== null)); } -exports.isObjectRecord = isObjectRecord; diff --git a/deps/npm/node_modules/@tufjs/models/dist/utils/index.js b/deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/utils/index.js similarity index 100% rename from deps/npm/node_modules/@tufjs/models/dist/utils/index.js rename to deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/utils/index.js diff --git a/deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/utils/key.js b/deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/utils/key.js new file mode 100644 index 00000000000000..3c3ec07f1425a7 --- /dev/null +++ b/deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/utils/key.js @@ -0,0 +1,142 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getPublicKey = getPublicKey; +const crypto_1 = __importDefault(require("crypto")); +const error_1 = require("../error"); +const oid_1 = require("./oid"); +const ASN1_TAG_SEQUENCE = 0x30; +const ANS1_TAG_BIT_STRING = 0x03; +const NULL_BYTE = 0x00; +const OID_EDDSA = '1.3.101.112'; +const OID_EC_PUBLIC_KEY = '1.2.840.10045.2.1'; +const OID_EC_CURVE_P256V1 = '1.2.840.10045.3.1.7'; +const PEM_HEADER = '-----BEGIN PUBLIC KEY-----'; +function getPublicKey(keyInfo) { + switch (keyInfo.keyType) { + case 'rsa': + return getRSAPublicKey(keyInfo); + case 'ed25519': + return getED25519PublicKey(keyInfo); + case 'ecdsa': + case 'ecdsa-sha2-nistp256': + case 'ecdsa-sha2-nistp384': + return getECDCSAPublicKey(keyInfo); + default: + throw new error_1.UnsupportedAlgorithmError(`Unsupported key type: ${keyInfo.keyType}`); + } +} +function getRSAPublicKey(keyInfo) { + // Only support PEM-encoded RSA keys + if (!keyInfo.keyVal.startsWith(PEM_HEADER)) { + throw new error_1.CryptoError('Invalid key format'); + } + const key = crypto_1.default.createPublicKey(keyInfo.keyVal); + switch (keyInfo.scheme) { + case 'rsassa-pss-sha256': + return { + key: key, + padding: crypto_1.default.constants.RSA_PKCS1_PSS_PADDING, + }; + default: + throw new error_1.UnsupportedAlgorithmError(`Unsupported RSA scheme: ${keyInfo.scheme}`); + } +} +function getED25519PublicKey(keyInfo) { + let key; + // If key is already PEM-encoded we can just parse it + if (keyInfo.keyVal.startsWith(PEM_HEADER)) { + key = crypto_1.default.createPublicKey(keyInfo.keyVal); + } + else { + // If key is not PEM-encoded it had better be hex + if (!isHex(keyInfo.keyVal)) { + throw new error_1.CryptoError('Invalid key format'); + } + key = crypto_1.default.createPublicKey({ + key: ed25519.hexToDER(keyInfo.keyVal), + format: 'der', + type: 'spki', + }); + } + return { key }; +} +function getECDCSAPublicKey(keyInfo) { + let key; + // If key is already PEM-encoded we can just parse it + if (keyInfo.keyVal.startsWith(PEM_HEADER)) { + key = crypto_1.default.createPublicKey(keyInfo.keyVal); + } + else { + // If key is not PEM-encoded it had better be hex + if (!isHex(keyInfo.keyVal)) { + throw new error_1.CryptoError('Invalid key format'); + } + key = crypto_1.default.createPublicKey({ + key: ecdsa.hexToDER(keyInfo.keyVal), + format: 'der', + type: 'spki', + }); + } + return { key }; +} +const ed25519 = { + // Translates a hex key into a crypto KeyObject + // https://keygen.sh/blog/how-to-use-hexadecimal-ed25519-keys-in-node/ + hexToDER: (hex) => { + const key = Buffer.from(hex, 'hex'); + const oid = (0, oid_1.encodeOIDString)(OID_EDDSA); + // Create a byte sequence containing the OID and key + const elements = Buffer.concat([ + Buffer.concat([ + Buffer.from([ASN1_TAG_SEQUENCE]), + Buffer.from([oid.length]), + oid, + ]), + Buffer.concat([ + Buffer.from([ANS1_TAG_BIT_STRING]), + Buffer.from([key.length + 1]), + Buffer.from([NULL_BYTE]), + key, + ]), + ]); + // Wrap up by creating a sequence of elements + const der = Buffer.concat([ + Buffer.from([ASN1_TAG_SEQUENCE]), + Buffer.from([elements.length]), + elements, + ]); + return der; + }, +}; +const ecdsa = { + hexToDER: (hex) => { + const key = Buffer.from(hex, 'hex'); + const bitString = Buffer.concat([ + Buffer.from([ANS1_TAG_BIT_STRING]), + Buffer.from([key.length + 1]), + Buffer.from([NULL_BYTE]), + key, + ]); + const oids = Buffer.concat([ + (0, oid_1.encodeOIDString)(OID_EC_PUBLIC_KEY), + (0, oid_1.encodeOIDString)(OID_EC_CURVE_P256V1), + ]); + const oidSequence = Buffer.concat([ + Buffer.from([ASN1_TAG_SEQUENCE]), + Buffer.from([oids.length]), + oids, + ]); + // Wrap up by creating a sequence of elements + const der = Buffer.concat([ + Buffer.from([ASN1_TAG_SEQUENCE]), + Buffer.from([oidSequence.length + bitString.length]), + oidSequence, + bitString, + ]); + return der; + }, +}; +const isHex = (key) => /^[0-9a-fA-F]+$/.test(key); diff --git a/deps/npm/node_modules/@tufjs/models/dist/utils/oid.js b/deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/utils/oid.js similarity index 96% rename from deps/npm/node_modules/@tufjs/models/dist/utils/oid.js rename to deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/utils/oid.js index e1bb7af5e54fbf..00b29c3030d1ec 100644 --- a/deps/npm/node_modules/@tufjs/models/dist/utils/oid.js +++ b/deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/utils/oid.js @@ -1,6 +1,6 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.encodeOIDString = void 0; +exports.encodeOIDString = encodeOIDString; const ANS1_TAG_OID = 0x06; function encodeOIDString(oid) { const parts = oid.split('.'); @@ -14,7 +14,6 @@ function encodeOIDString(oid) { const der = Buffer.from([first, ...rest]); return Buffer.from([ANS1_TAG_OID, der.length, ...der]); } -exports.encodeOIDString = encodeOIDString; function encodeVariableLengthInteger(value) { const bytes = []; let mask = 0x00; diff --git a/deps/npm/node_modules/@tufjs/models/dist/utils/types.js b/deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/utils/types.js similarity index 100% rename from deps/npm/node_modules/@tufjs/models/dist/utils/types.js rename to deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/utils/types.js diff --git a/deps/npm/node_modules/@tufjs/models/dist/utils/verify.js b/deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/utils/verify.js similarity index 100% rename from deps/npm/node_modules/@tufjs/models/dist/utils/verify.js rename to deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/dist/utils/verify.js diff --git a/deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/package.json b/deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/package.json new file mode 100644 index 00000000000000..8e5132ddf1079c --- /dev/null +++ b/deps/npm/node_modules/tuf-js/node_modules/@tufjs/models/package.json @@ -0,0 +1,37 @@ +{ + "name": "@tufjs/models", + "version": "3.0.1", + "description": "TUF metadata models", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "files": [ + "dist" + ], + "scripts": { + "build": "tsc --build", + "clean": "rm -rf dist && rm tsconfig.tsbuildinfo", + "test": "jest" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/theupdateframework/tuf-js.git" + }, + "keywords": [ + "tuf", + "security", + "update" + ], + "author": "bdehamer@github.com", + "license": "MIT", + "bugs": { + "url": "https://github.com/theupdateframework/tuf-js/issues" + }, + "homepage": "https://github.com/theupdateframework/tuf-js/tree/main/packages/models#readme", + "dependencies": { + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^9.0.5" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } +} diff --git a/deps/npm/node_modules/tuf-js/node_modules/cacache/LICENSE.md b/deps/npm/node_modules/tuf-js/node_modules/cacache/LICENSE.md deleted file mode 100644 index 8d28acf866d932..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/cacache/LICENSE.md +++ /dev/null @@ -1,16 +0,0 @@ -ISC License - -Copyright (c) npm, Inc. - -Permission to use, copy, modify, and/or distribute this software for -any purpose with or without fee is hereby granted, provided that the -above copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE COPYRIGHT HOLDER DISCLAIMS -ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR -CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE -OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE -USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/deps/npm/node_modules/tuf-js/node_modules/cacache/lib/content/path.js b/deps/npm/node_modules/tuf-js/node_modules/cacache/lib/content/path.js deleted file mode 100644 index ad5a76a4f73f26..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/cacache/lib/content/path.js +++ /dev/null @@ -1,29 +0,0 @@ -'use strict' - -const contentVer = require('../../package.json')['cache-version'].content -const hashToSegments = require('../util/hash-to-segments') -const path = require('path') -const ssri = require('ssri') - -// Current format of content file path: -// -// sha512-BaSE64Hex= -> -// ~/.my-cache/content-v2/sha512/ba/da/55deadbeefc0ffee -// -module.exports = contentPath - -function contentPath (cache, integrity) { - const sri = ssri.parse(integrity, { single: true }) - // contentPath is the *strongest* algo given - return path.join( - contentDir(cache), - sri.algorithm, - ...hashToSegments(sri.hexDigest()) - ) -} - -module.exports.contentDir = contentDir - -function contentDir (cache) { - return path.join(cache, `content-v${contentVer}`) -} diff --git a/deps/npm/node_modules/tuf-js/node_modules/cacache/lib/content/read.js b/deps/npm/node_modules/tuf-js/node_modules/cacache/lib/content/read.js deleted file mode 100644 index 5f6192c3cec566..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/cacache/lib/content/read.js +++ /dev/null @@ -1,165 +0,0 @@ -'use strict' - -const fs = require('fs/promises') -const fsm = require('fs-minipass') -const ssri = require('ssri') -const contentPath = require('./path') -const Pipeline = require('minipass-pipeline') - -module.exports = read - -const MAX_SINGLE_READ_SIZE = 64 * 1024 * 1024 -async function read (cache, integrity, opts = {}) { - const { size } = opts - const { stat, cpath, sri } = await withContentSri(cache, integrity, async (cpath, sri) => { - // get size - const stat = size ? { size } : await fs.stat(cpath) - return { stat, cpath, sri } - }) - - if (stat.size > MAX_SINGLE_READ_SIZE) { - return readPipeline(cpath, stat.size, sri, new Pipeline()).concat() - } - - const data = await fs.readFile(cpath, { encoding: null }) - - if (stat.size !== data.length) { - throw sizeError(stat.size, data.length) - } - - if (!ssri.checkData(data, sri)) { - throw integrityError(sri, cpath) - } - - return data -} - -const readPipeline = (cpath, size, sri, stream) => { - stream.push( - new fsm.ReadStream(cpath, { - size, - readSize: MAX_SINGLE_READ_SIZE, - }), - ssri.integrityStream({ - integrity: sri, - size, - }) - ) - return stream -} - -module.exports.stream = readStream -module.exports.readStream = readStream - -function readStream (cache, integrity, opts = {}) { - const { size } = opts - const stream = new Pipeline() - // Set all this up to run on the stream and then just return the stream - Promise.resolve().then(async () => { - const { stat, cpath, sri } = await withContentSri(cache, integrity, async (cpath, sri) => { - // get size - const stat = size ? { size } : await fs.stat(cpath) - return { stat, cpath, sri } - }) - - return readPipeline(cpath, stat.size, sri, stream) - }).catch(err => stream.emit('error', err)) - - return stream -} - -module.exports.copy = copy - -function copy (cache, integrity, dest) { - return withContentSri(cache, integrity, (cpath) => { - return fs.copyFile(cpath, dest) - }) -} - -module.exports.hasContent = hasContent - -async function hasContent (cache, integrity) { - if (!integrity) { - return false - } - - try { - return await withContentSri(cache, integrity, async (cpath, sri) => { - const stat = await fs.stat(cpath) - return { size: stat.size, sri, stat } - }) - } catch (err) { - if (err.code === 'ENOENT') { - return false - } - - if (err.code === 'EPERM') { - /* istanbul ignore else */ - if (process.platform !== 'win32') { - throw err - } else { - return false - } - } - } -} - -async function withContentSri (cache, integrity, fn) { - const sri = ssri.parse(integrity) - // If `integrity` has multiple entries, pick the first digest - // with available local data. - const algo = sri.pickAlgorithm() - const digests = sri[algo] - - if (digests.length <= 1) { - const cpath = contentPath(cache, digests[0]) - return fn(cpath, digests[0]) - } else { - // Can't use race here because a generic error can happen before - // a ENOENT error, and can happen before a valid result - const results = await Promise.all(digests.map(async (meta) => { - try { - return await withContentSri(cache, meta, fn) - } catch (err) { - if (err.code === 'ENOENT') { - return Object.assign( - new Error('No matching content found for ' + sri.toString()), - { code: 'ENOENT' } - ) - } - return err - } - })) - // Return the first non error if it is found - const result = results.find((r) => !(r instanceof Error)) - if (result) { - return result - } - - // Throw the No matching content found error - const enoentError = results.find((r) => r.code === 'ENOENT') - if (enoentError) { - throw enoentError - } - - // Throw generic error - throw results.find((r) => r instanceof Error) - } -} - -function sizeError (expected, found) { - /* eslint-disable-next-line max-len */ - const err = new Error(`Bad data size: expected inserted data to be ${expected} bytes, but got ${found} instead`) - err.expected = expected - err.found = found - err.code = 'EBADSIZE' - return err -} - -function integrityError (sri, path) { - const err = new Error(`Integrity verification failed for ${sri} (${path})`) - err.code = 'EINTEGRITY' - err.sri = sri - err.path = path - return err -} diff --git a/deps/npm/node_modules/tuf-js/node_modules/cacache/lib/content/rm.js b/deps/npm/node_modules/tuf-js/node_modules/cacache/lib/content/rm.js deleted file mode 100644 index ce58d679e4cb25..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/cacache/lib/content/rm.js +++ /dev/null @@ -1,18 +0,0 @@ -'use strict' - -const fs = require('fs/promises') -const contentPath = require('./path') -const { hasContent } = require('./read') - -module.exports = rm - -async function rm (cache, integrity) { - const content = await hasContent(cache, integrity) - // ~pretty~ sure we can't end up with a content lacking sri, but be safe - if (content && content.sri) { - await fs.rm(contentPath(cache, content.sri), { recursive: true, force: true }) - return true - } else { - return false - } -} diff --git a/deps/npm/node_modules/tuf-js/node_modules/cacache/lib/content/write.js b/deps/npm/node_modules/tuf-js/node_modules/cacache/lib/content/write.js deleted file mode 100644 index e7187abca8788a..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/cacache/lib/content/write.js +++ /dev/null @@ -1,206 +0,0 @@ -'use strict' - -const events = require('events') - -const contentPath = require('./path') -const fs = require('fs/promises') -const { moveFile } = require('@npmcli/fs') -const { Minipass } = require('minipass') -const Pipeline = require('minipass-pipeline') -const Flush = require('minipass-flush') -const path = require('path') -const ssri = require('ssri') -const uniqueFilename = require('unique-filename') -const fsm = require('fs-minipass') - -module.exports = write - -// Cache of move operations in process so we don't duplicate -const moveOperations = new Map() - -async function write (cache, data, opts = {}) { - const { algorithms, size, integrity } = opts - - if (typeof size === 'number' && data.length !== size) { - throw sizeError(size, data.length) - } - - const sri = ssri.fromData(data, algorithms ? { algorithms } : {}) - if (integrity && !ssri.checkData(data, integrity, opts)) { - throw checksumError(integrity, sri) - } - - for (const algo in sri) { - const tmp = await makeTmp(cache, opts) - const hash = sri[algo].toString() - try { - await fs.writeFile(tmp.target, data, { flag: 'wx' }) - await moveToDestination(tmp, cache, hash, opts) - } finally { - if (!tmp.moved) { - await fs.rm(tmp.target, { recursive: true, force: true }) - } - } - } - return { integrity: sri, size: data.length } -} - -module.exports.stream = writeStream - -// writes proxied to the 'inputStream' that is passed to the Promise -// 'end' is deferred until content is handled. -class CacacheWriteStream extends Flush { - constructor (cache, opts) { - super() - this.opts = opts - this.cache = cache - this.inputStream = new Minipass() - this.inputStream.on('error', er => this.emit('error', er)) - this.inputStream.on('drain', () => this.emit('drain')) - this.handleContentP = null - } - - write (chunk, encoding, cb) { - if (!this.handleContentP) { - this.handleContentP = handleContent( - this.inputStream, - this.cache, - this.opts - ) - this.handleContentP.catch(error => this.emit('error', error)) - } - return this.inputStream.write(chunk, encoding, cb) - } - - flush (cb) { - this.inputStream.end(() => { - if (!this.handleContentP) { - const e = new Error('Cache input stream was empty') - e.code = 'ENODATA' - // empty streams are probably emitting end right away. - // defer this one tick by rejecting a promise on it. - return Promise.reject(e).catch(cb) - } - // eslint-disable-next-line promise/catch-or-return - this.handleContentP.then( - (res) => { - res.integrity && this.emit('integrity', res.integrity) - // eslint-disable-next-line promise/always-return - res.size !== null && this.emit('size', res.size) - cb() - }, - (er) => cb(er) - ) - }) - } -} - -function writeStream (cache, opts = {}) { - return new CacacheWriteStream(cache, opts) -} - -async function handleContent (inputStream, cache, opts) { - const tmp = await makeTmp(cache, opts) - try { - const res = await pipeToTmp(inputStream, cache, tmp.target, opts) - await moveToDestination( - tmp, - cache, - res.integrity, - opts - ) - return res - } finally { - if (!tmp.moved) { - await fs.rm(tmp.target, { recursive: true, force: true }) - } - } -} - -async function pipeToTmp (inputStream, cache, tmpTarget, opts) { - const outStream = new fsm.WriteStream(tmpTarget, { - flags: 'wx', - }) - - if (opts.integrityEmitter) { - // we need to create these all simultaneously since they can fire in any order - const [integrity, size] = await Promise.all([ - events.once(opts.integrityEmitter, 'integrity').then(res => res[0]), - events.once(opts.integrityEmitter, 'size').then(res => res[0]), - new Pipeline(inputStream, outStream).promise(), - ]) - return { integrity, size } - } - - let integrity - let size - const hashStream = ssri.integrityStream({ - integrity: opts.integrity, - algorithms: opts.algorithms, - size: opts.size, - }) - hashStream.on('integrity', i => { - integrity = i - }) - hashStream.on('size', s => { - size = s - }) - - const pipeline = new Pipeline(inputStream, hashStream, outStream) - await pipeline.promise() - return { integrity, size } -} - -async function makeTmp (cache, opts) { - const tmpTarget = uniqueFilename(path.join(cache, 'tmp'), opts.tmpPrefix) - await fs.mkdir(path.dirname(tmpTarget), { recursive: true }) - return { - target: tmpTarget, - moved: false, - } -} - -async function moveToDestination (tmp, cache, sri) { - const destination = contentPath(cache, sri) - const destDir = path.dirname(destination) - if (moveOperations.has(destination)) { - return moveOperations.get(destination) - } - moveOperations.set( - destination, - fs.mkdir(destDir, { recursive: true }) - .then(async () => { - await moveFile(tmp.target, destination, { overwrite: false }) - tmp.moved = true - return tmp.moved - }) - .catch(err => { - if (!err.message.startsWith('The destination file exists')) { - throw Object.assign(err, { code: 'EEXIST' }) - } - }).finally(() => { - moveOperations.delete(destination) - }) - - ) - return moveOperations.get(destination) -} - -function sizeError (expected, found) { - /* eslint-disable-next-line max-len */ - const err = new Error(`Bad data size: expected inserted data to be ${expected} bytes, but got ${found} instead`) - err.expected = expected - err.found = found - err.code = 'EBADSIZE' - return err -} - -function checksumError (expected, found) { - const err = new Error(`Integrity check failed: - Wanted: ${expected} - Found: ${found}`) - err.code = 'EINTEGRITY' - err.expected = expected - err.found = found - return err -} diff --git a/deps/npm/node_modules/tuf-js/node_modules/cacache/lib/entry-index.js b/deps/npm/node_modules/tuf-js/node_modules/cacache/lib/entry-index.js deleted file mode 100644 index 89c28f2f257d48..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/cacache/lib/entry-index.js +++ /dev/null @@ -1,336 +0,0 @@ -'use strict' - -const crypto = require('crypto') -const { - appendFile, - mkdir, - readFile, - readdir, - rm, - writeFile, -} = require('fs/promises') -const { Minipass } = require('minipass') -const path = require('path') -const ssri = require('ssri') -const uniqueFilename = require('unique-filename') - -const contentPath = require('./content/path') -const hashToSegments = require('./util/hash-to-segments') -const indexV = require('../package.json')['cache-version'].index -const { moveFile } = require('@npmcli/fs') - -const pMap = require('p-map') -const lsStreamConcurrency = 5 - -module.exports.NotFoundError = class NotFoundError extends Error { - constructor (cache, key) { - super(`No cache entry for ${key} found in ${cache}`) - this.code = 'ENOENT' - this.cache = cache - this.key = key - } -} - -module.exports.compact = compact - -async function compact (cache, key, matchFn, opts = {}) { - const bucket = bucketPath(cache, key) - const entries = await bucketEntries(bucket) - const newEntries = [] - // we loop backwards because the bottom-most result is the newest - // since we add new entries with appendFile - for (let i = entries.length - 1; i >= 0; --i) { - const entry = entries[i] - // a null integrity could mean either a delete was appended - // or the user has simply stored an index that does not map - // to any content. we determine if the user wants to keep the - // null integrity based on the validateEntry function passed in options. - // if the integrity is null and no validateEntry is provided, we break - // as we consider the null integrity to be a deletion of everything - // that came before it. - if (entry.integrity === null && !opts.validateEntry) { - break - } - - // if this entry is valid, and it is either the first entry or - // the newEntries array doesn't already include an entry that - // matches this one based on the provided matchFn, then we add - // it to the beginning of our list - if ((!opts.validateEntry || opts.validateEntry(entry) === true) && - (newEntries.length === 0 || - !newEntries.find((oldEntry) => matchFn(oldEntry, entry)))) { - newEntries.unshift(entry) - } - } - - const newIndex = '\n' + newEntries.map((entry) => { - const stringified = JSON.stringify(entry) - const hash = hashEntry(stringified) - return `${hash}\t${stringified}` - }).join('\n') - - const setup = async () => { - const target = uniqueFilename(path.join(cache, 'tmp'), opts.tmpPrefix) - await mkdir(path.dirname(target), { recursive: true }) - return { - target, - moved: false, - } - } - - const teardown = async (tmp) => { - if (!tmp.moved) { - return rm(tmp.target, { recursive: true, force: true }) - } - } - - const write = async (tmp) => { - await writeFile(tmp.target, newIndex, { flag: 'wx' }) - await mkdir(path.dirname(bucket), { recursive: true }) - // we use @npmcli/move-file directly here because we - // want to overwrite the existing file - await moveFile(tmp.target, bucket) - tmp.moved = true - } - - // write the file atomically - const tmp = await setup() - try { - await write(tmp) - } finally { - await teardown(tmp) - } - - // we reverse the list we generated such that the newest - // entries come first in order to make looping through them easier - // the true passed to formatEntry tells it to keep null - // integrity values, if they made it this far it's because - // validateEntry returned true, and as such we should return it - return newEntries.reverse().map((entry) => formatEntry(cache, entry, true)) -} - -module.exports.insert = insert - -async function insert (cache, key, integrity, opts = {}) { - const { metadata, size, time } = opts - const bucket = bucketPath(cache, key) - const entry = { - key, - integrity: integrity && ssri.stringify(integrity), - time: time || Date.now(), - size, - metadata, - } - try { - await mkdir(path.dirname(bucket), { recursive: true }) - const stringified = JSON.stringify(entry) - // NOTE - Cleverness ahoy! - // - // This works because it's tremendously unlikely for an entry to corrupt - // another while still preserving the string length of the JSON in - // question. So, we just slap the length in there and verify it on read. - // - // Thanks to @isaacs for the whiteboarding session that ended up with - // this. - await appendFile(bucket, `\n${hashEntry(stringified)}\t${stringified}`) - } catch (err) { - if (err.code === 'ENOENT') { - return undefined - } - - throw err - } - return formatEntry(cache, entry) -} - -module.exports.find = find - -async function find (cache, key) { - const bucket = bucketPath(cache, key) - try { - const entries = await bucketEntries(bucket) - return entries.reduce((latest, next) => { - if (next && next.key === key) { - return formatEntry(cache, next) - } else { - return latest - } - }, null) - } catch (err) { - if (err.code === 'ENOENT') { - return null - } else { - throw err - } - } -} - -module.exports.delete = del - -function del (cache, key, opts = {}) { - if (!opts.removeFully) { - return insert(cache, key, null, opts) - } - - const bucket = bucketPath(cache, key) - return rm(bucket, { recursive: true, force: true }) -} - -module.exports.lsStream = lsStream - -function lsStream (cache) { - const indexDir = bucketDir(cache) - const stream = new Minipass({ objectMode: true }) - - // Set all this up to run on the stream and then just return the stream - Promise.resolve().then(async () => { - const buckets = await readdirOrEmpty(indexDir) - await pMap(buckets, async (bucket) => { - const bucketPath = path.join(indexDir, bucket) - const subbuckets = await readdirOrEmpty(bucketPath) - await pMap(subbuckets, async (subbucket) => { - const subbucketPath = path.join(bucketPath, subbucket) - - // "/cachename//./*" - const subbucketEntries = await readdirOrEmpty(subbucketPath) - await pMap(subbucketEntries, async (entry) => { - const entryPath = path.join(subbucketPath, entry) - try { - const entries = await bucketEntries(entryPath) - // using a Map here prevents duplicate keys from showing up - // twice, I guess? - const reduced = entries.reduce((acc, entry) => { - acc.set(entry.key, entry) - return acc - }, new Map()) - // reduced is a map of key => entry - for (const entry of reduced.values()) { - const formatted = formatEntry(cache, entry) - if (formatted) { - stream.write(formatted) - } - } - } catch (err) { - if (err.code === 'ENOENT') { - return undefined - } - throw err - } - }, - { concurrency: lsStreamConcurrency }) - }, - { concurrency: lsStreamConcurrency }) - }, - { concurrency: lsStreamConcurrency }) - stream.end() - return stream - }).catch(err => stream.emit('error', err)) - - return stream -} - -module.exports.ls = ls - -async function ls (cache) { - const entries = await lsStream(cache).collect() - return entries.reduce((acc, xs) => { - acc[xs.key] = xs - return acc - }, {}) -} - -module.exports.bucketEntries = bucketEntries - -async function bucketEntries (bucket, filter) { - const data = await readFile(bucket, 'utf8') - return _bucketEntries(data, filter) -} - -function _bucketEntries (data) { - const entries = [] - data.split('\n').forEach((entry) => { - if (!entry) { - return - } - - const pieces = entry.split('\t') - if (!pieces[1] || hashEntry(pieces[1]) !== pieces[0]) { - // Hash is no good! Corruption or malice? Doesn't matter! - // EJECT EJECT - return - } - let obj - try { - obj = JSON.parse(pieces[1]) - } catch (_) { - // eslint-ignore-next-line no-empty-block - } - // coverage disabled here, no need to test with an entry that parses to something falsey - // istanbul ignore else - if (obj) { - entries.push(obj) - } - }) - return entries -} - -module.exports.bucketDir = bucketDir - -function bucketDir (cache) { - return path.join(cache, `index-v${indexV}`) -} - -module.exports.bucketPath = bucketPath - -function bucketPath (cache, key) { - const hashed = hashKey(key) - return path.join.apply( - path, - [bucketDir(cache)].concat(hashToSegments(hashed)) - ) -} - -module.exports.hashKey = hashKey - -function hashKey (key) { - return hash(key, 'sha256') -} - -module.exports.hashEntry = hashEntry - -function hashEntry (str) { - return hash(str, 'sha1') -} - -function hash (str, digest) { - return crypto - .createHash(digest) - .update(str) - .digest('hex') -} - -function formatEntry (cache, entry, keepAll) { - // Treat null digests as deletions. They'll shadow any previous entries. - if (!entry.integrity && !keepAll) { - return null - } - - return { - key: entry.key, - integrity: entry.integrity, - path: entry.integrity ? contentPath(cache, entry.integrity) : undefined, - size: entry.size, - time: entry.time, - metadata: entry.metadata, - } -} - -function readdirOrEmpty (dir) { - return readdir(dir).catch((err) => { - if (err.code === 'ENOENT' || err.code === 'ENOTDIR') { - return [] - } - - throw err - }) -} diff --git a/deps/npm/node_modules/tuf-js/node_modules/cacache/lib/get.js b/deps/npm/node_modules/tuf-js/node_modules/cacache/lib/get.js deleted file mode 100644 index 80ec206c7ecaaa..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/cacache/lib/get.js +++ /dev/null @@ -1,170 +0,0 @@ -'use strict' - -const Collect = require('minipass-collect') -const { Minipass } = require('minipass') -const Pipeline = require('minipass-pipeline') - -const index = require('./entry-index') -const memo = require('./memoization') -const read = require('./content/read') - -async function getData (cache, key, opts = {}) { - const { integrity, memoize, size } = opts - const memoized = memo.get(cache, key, opts) - if (memoized && memoize !== false) { - return { - metadata: memoized.entry.metadata, - data: memoized.data, - integrity: memoized.entry.integrity, - size: memoized.entry.size, - } - } - - const entry = await index.find(cache, key, opts) - if (!entry) { - throw new index.NotFoundError(cache, key) - } - const data = await read(cache, entry.integrity, { integrity, size }) - if (memoize) { - memo.put(cache, entry, data, opts) - } - - return { - data, - metadata: entry.metadata, - size: entry.size, - integrity: entry.integrity, - } -} -module.exports = getData - -async function getDataByDigest (cache, key, opts = {}) { - const { integrity, memoize, size } = opts - const memoized = memo.get.byDigest(cache, key, opts) - if (memoized && memoize !== false) { - return memoized - } - - const res = await read(cache, key, { integrity, size }) - if (memoize) { - memo.put.byDigest(cache, key, res, opts) - } - return res -} -module.exports.byDigest = getDataByDigest - -const getMemoizedStream = (memoized) => { - const stream = new Minipass() - stream.on('newListener', function (ev, cb) { - ev === 'metadata' && cb(memoized.entry.metadata) - ev === 'integrity' && cb(memoized.entry.integrity) - ev === 'size' && cb(memoized.entry.size) - }) - stream.end(memoized.data) - return stream -} - -function getStream (cache, key, opts = {}) { - const { memoize, size } = opts - const memoized = memo.get(cache, key, opts) - if (memoized && memoize !== false) { - return getMemoizedStream(memoized) - } - - const stream = new Pipeline() - // Set all this up to run on the stream and then just return the stream - Promise.resolve().then(async () => { - const entry = await index.find(cache, key) - if (!entry) { - throw new index.NotFoundError(cache, key) - } - - stream.emit('metadata', entry.metadata) - stream.emit('integrity', entry.integrity) - stream.emit('size', entry.size) - stream.on('newListener', function (ev, cb) { - ev === 'metadata' && cb(entry.metadata) - ev === 'integrity' && cb(entry.integrity) - ev === 'size' && cb(entry.size) - }) - - const src = read.readStream( - cache, - entry.integrity, - { ...opts, size: typeof size !== 'number' ? entry.size : size } - ) - - if (memoize) { - const memoStream = new Collect.PassThrough() - memoStream.on('collect', data => memo.put(cache, entry, data, opts)) - stream.unshift(memoStream) - } - stream.unshift(src) - return stream - }).catch((err) => stream.emit('error', err)) - - return stream -} - -module.exports.stream = getStream - -function getStreamDigest (cache, integrity, opts = {}) { - const { memoize } = opts - const memoized = memo.get.byDigest(cache, integrity, opts) - if (memoized && memoize !== false) { - const stream = new Minipass() - stream.end(memoized) - return stream - } else { - const stream = read.readStream(cache, integrity, opts) - if (!memoize) { - return stream - } - - const memoStream = new Collect.PassThrough() - memoStream.on('collect', data => memo.put.byDigest( - cache, - integrity, - data, - opts - )) - return new Pipeline(stream, memoStream) - } -} - -module.exports.stream.byDigest = getStreamDigest - -function info (cache, key, opts = {}) { - const { memoize } = opts - const memoized = memo.get(cache, key, opts) - if (memoized && memoize !== false) { - return Promise.resolve(memoized.entry) - } else { - return index.find(cache, key) - } -} -module.exports.info = info - -async function copy (cache, key, dest, opts = {}) { - const entry = await index.find(cache, key, opts) - if (!entry) { - throw new index.NotFoundError(cache, key) - } - await read.copy(cache, entry.integrity, dest, opts) - return { - metadata: entry.metadata, - size: entry.size, - integrity: entry.integrity, - } -} - -module.exports.copy = copy - -async function copyByDigest (cache, key, dest, opts = {}) { - await read.copy(cache, key, dest, opts) - return key -} - -module.exports.copy.byDigest = copyByDigest - -module.exports.hasContent = read.hasContent diff --git a/deps/npm/node_modules/tuf-js/node_modules/cacache/lib/index.js b/deps/npm/node_modules/tuf-js/node_modules/cacache/lib/index.js deleted file mode 100644 index c9b0da5f3a271b..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/cacache/lib/index.js +++ /dev/null @@ -1,42 +0,0 @@ -'use strict' - -const get = require('./get.js') -const put = require('./put.js') -const rm = require('./rm.js') -const verify = require('./verify.js') -const { clearMemoized } = require('./memoization.js') -const tmp = require('./util/tmp.js') -const index = require('./entry-index.js') - -module.exports.index = {} -module.exports.index.compact = index.compact -module.exports.index.insert = index.insert - -module.exports.ls = index.ls -module.exports.ls.stream = index.lsStream - -module.exports.get = get -module.exports.get.byDigest = get.byDigest -module.exports.get.stream = get.stream -module.exports.get.stream.byDigest = get.stream.byDigest -module.exports.get.copy = get.copy -module.exports.get.copy.byDigest = get.copy.byDigest -module.exports.get.info = get.info -module.exports.get.hasContent = get.hasContent - -module.exports.put = put -module.exports.put.stream = put.stream - -module.exports.rm = rm.entry -module.exports.rm.all = rm.all -module.exports.rm.entry = module.exports.rm -module.exports.rm.content = rm.content - -module.exports.clearMemoized = clearMemoized - -module.exports.tmp = {} -module.exports.tmp.mkdir = tmp.mkdir -module.exports.tmp.withTmp = tmp.withTmp - -module.exports.verify = verify -module.exports.verify.lastRun = verify.lastRun diff --git a/deps/npm/node_modules/tuf-js/node_modules/cacache/lib/memoization.js b/deps/npm/node_modules/tuf-js/node_modules/cacache/lib/memoization.js deleted file mode 100644 index 2ecc60912e4563..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/cacache/lib/memoization.js +++ /dev/null @@ -1,72 +0,0 @@ -'use strict' - -const { LRUCache } = require('lru-cache') - -const MEMOIZED = new LRUCache({ - max: 500, - maxSize: 50 * 1024 * 1024, // 50MB - ttl: 3 * 60 * 1000, // 3 minutes - sizeCalculation: (entry, key) => key.startsWith('key:') ? entry.data.length : entry.length, -}) - -module.exports.clearMemoized = clearMemoized - -function clearMemoized () { - const old = {} - MEMOIZED.forEach((v, k) => { - old[k] = v - }) - MEMOIZED.clear() - return old -} - -module.exports.put = put - -function put (cache, entry, data, opts) { - pickMem(opts).set(`key:${cache}:${entry.key}`, { entry, data }) - putDigest(cache, entry.integrity, data, opts) -} - -module.exports.put.byDigest = putDigest - -function putDigest (cache, integrity, data, opts) { - pickMem(opts).set(`digest:${cache}:${integrity}`, data) -} - -module.exports.get = get - -function get (cache, key, opts) { - return pickMem(opts).get(`key:${cache}:${key}`) -} - -module.exports.get.byDigest = getDigest - -function getDigest (cache, integrity, opts) { - return pickMem(opts).get(`digest:${cache}:${integrity}`) -} - -class ObjProxy { - constructor (obj) { - this.obj = obj - } - - get (key) { - return this.obj[key] - } - - set (key, val) { - this.obj[key] = val - } -} - -function pickMem (opts) { - if (!opts || !opts.memoize) { - return MEMOIZED - } else if (opts.memoize.get && opts.memoize.set) { - return opts.memoize - } else if (typeof opts.memoize === 'object') { - return new ObjProxy(opts.memoize) - } else { - return MEMOIZED - } -} diff --git a/deps/npm/node_modules/tuf-js/node_modules/cacache/lib/put.js b/deps/npm/node_modules/tuf-js/node_modules/cacache/lib/put.js deleted file mode 100644 index 9fc932d5f6dec5..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/cacache/lib/put.js +++ /dev/null @@ -1,80 +0,0 @@ -'use strict' - -const index = require('./entry-index') -const memo = require('./memoization') -const write = require('./content/write') -const Flush = require('minipass-flush') -const { PassThrough } = require('minipass-collect') -const Pipeline = require('minipass-pipeline') - -const putOpts = (opts) => ({ - algorithms: ['sha512'], - ...opts, -}) - -module.exports = putData - -async function putData (cache, key, data, opts = {}) { - const { memoize } = opts - opts = putOpts(opts) - const res = await write(cache, data, opts) - const entry = await index.insert(cache, key, res.integrity, { ...opts, size: res.size }) - if (memoize) { - memo.put(cache, entry, data, opts) - } - - return res.integrity -} - -module.exports.stream = putStream - -function putStream (cache, key, opts = {}) { - const { memoize } = opts - opts = putOpts(opts) - let integrity - let size - let error - - let memoData - const pipeline = new Pipeline() - // first item in the pipeline is the memoizer, because we need - // that to end first and get the collected data. - if (memoize) { - const memoizer = new PassThrough().on('collect', data => { - memoData = data - }) - pipeline.push(memoizer) - } - - // contentStream is a write-only, not a passthrough - // no data comes out of it. - const contentStream = write.stream(cache, opts) - .on('integrity', (int) => { - integrity = int - }) - .on('size', (s) => { - size = s - }) - .on('error', (err) => { - error = err - }) - - pipeline.push(contentStream) - - // last but not least, we write the index and emit hash and size, - // and memoize if we're doing that - pipeline.push(new Flush({ - async flush () { - if (!error) { - const entry = await index.insert(cache, key, integrity, { ...opts, size }) - if (memoize && memoData) { - memo.put(cache, entry, memoData, opts) - } - pipeline.emit('integrity', integrity) - pipeline.emit('size', size) - } - }, - })) - - return pipeline -} diff --git a/deps/npm/node_modules/tuf-js/node_modules/cacache/lib/rm.js b/deps/npm/node_modules/tuf-js/node_modules/cacache/lib/rm.js deleted file mode 100644 index a94760c7cf2430..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/cacache/lib/rm.js +++ /dev/null @@ -1,31 +0,0 @@ -'use strict' - -const { rm } = require('fs/promises') -const glob = require('./util/glob.js') -const index = require('./entry-index') -const memo = require('./memoization') -const path = require('path') -const rmContent = require('./content/rm') - -module.exports = entry -module.exports.entry = entry - -function entry (cache, key, opts) { - memo.clearMemoized() - return index.delete(cache, key, opts) -} - -module.exports.content = content - -function content (cache, integrity) { - memo.clearMemoized() - return rmContent(cache, integrity) -} - -module.exports.all = all - -async function all (cache) { - memo.clearMemoized() - const paths = await glob(path.join(cache, '*(content-*|index-*)'), { silent: true, nosort: true }) - return Promise.all(paths.map((p) => rm(p, { recursive: true, force: true }))) -} diff --git a/deps/npm/node_modules/tuf-js/node_modules/cacache/lib/util/glob.js b/deps/npm/node_modules/tuf-js/node_modules/cacache/lib/util/glob.js deleted file mode 100644 index 8500c1c16a429f..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/cacache/lib/util/glob.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict' - -const { glob } = require('glob') -const path = require('path') - -const globify = (pattern) => pattern.split(path.win32.sep).join(path.posix.sep) -module.exports = (path, options) => glob(globify(path), options) diff --git a/deps/npm/node_modules/tuf-js/node_modules/cacache/lib/util/hash-to-segments.js b/deps/npm/node_modules/tuf-js/node_modules/cacache/lib/util/hash-to-segments.js deleted file mode 100644 index 445599b5038088..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/cacache/lib/util/hash-to-segments.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict' - -module.exports = hashToSegments - -function hashToSegments (hash) { - return [hash.slice(0, 2), hash.slice(2, 4), hash.slice(4)] -} diff --git a/deps/npm/node_modules/tuf-js/node_modules/cacache/lib/util/tmp.js b/deps/npm/node_modules/tuf-js/node_modules/cacache/lib/util/tmp.js deleted file mode 100644 index 0bf5302136ebeb..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/cacache/lib/util/tmp.js +++ /dev/null @@ -1,26 +0,0 @@ -'use strict' - -const { withTempDir } = require('@npmcli/fs') -const fs = require('fs/promises') -const path = require('path') - -module.exports.mkdir = mktmpdir - -async function mktmpdir (cache, opts = {}) { - const { tmpPrefix } = opts - const tmpDir = path.join(cache, 'tmp') - await fs.mkdir(tmpDir, { recursive: true, owner: 'inherit' }) - // do not use path.join(), it drops the trailing / if tmpPrefix is unset - const target = `${tmpDir}${path.sep}${tmpPrefix || ''}` - return fs.mkdtemp(target, { owner: 'inherit' }) -} - -module.exports.withTmp = withTmp - -function withTmp (cache, opts, cb) { - if (!cb) { - cb = opts - opts = {} - } - return withTempDir(path.join(cache, 'tmp'), cb, opts) -} diff --git a/deps/npm/node_modules/tuf-js/node_modules/cacache/lib/verify.js b/deps/npm/node_modules/tuf-js/node_modules/cacache/lib/verify.js deleted file mode 100644 index d7423da1295b68..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/cacache/lib/verify.js +++ /dev/null @@ -1,257 +0,0 @@ -'use strict' - -const { - mkdir, - readFile, - rm, - stat, - truncate, - writeFile, -} = require('fs/promises') -const pMap = require('p-map') -const contentPath = require('./content/path') -const fsm = require('fs-minipass') -const glob = require('./util/glob.js') -const index = require('./entry-index') -const path = require('path') -const ssri = require('ssri') - -const hasOwnProperty = (obj, key) => - Object.prototype.hasOwnProperty.call(obj, key) - -const verifyOpts = (opts) => ({ - concurrency: 20, - log: { silly () {} }, - ...opts, -}) - -module.exports = verify - -async function verify (cache, opts) { - opts = verifyOpts(opts) - opts.log.silly('verify', 'verifying cache at', cache) - - const steps = [ - markStartTime, - fixPerms, - garbageCollect, - rebuildIndex, - cleanTmp, - writeVerifile, - markEndTime, - ] - - const stats = {} - for (const step of steps) { - const label = step.name - const start = new Date() - const s = await step(cache, opts) - if (s) { - Object.keys(s).forEach((k) => { - stats[k] = s[k] - }) - } - const end = new Date() - if (!stats.runTime) { - stats.runTime = {} - } - stats.runTime[label] = end - start - } - stats.runTime.total = stats.endTime - stats.startTime - opts.log.silly( - 'verify', - 'verification finished for', - cache, - 'in', - `${stats.runTime.total}ms` - ) - return stats -} - -async function markStartTime () { - return { startTime: new Date() } -} - -async function markEndTime () { - return { endTime: new Date() } -} - -async function fixPerms (cache, opts) { - opts.log.silly('verify', 'fixing cache permissions') - await mkdir(cache, { recursive: true }) - return null -} - -// Implements a naive mark-and-sweep tracing garbage collector. -// -// The algorithm is basically as follows: -// 1. Read (and filter) all index entries ("pointers") -// 2. Mark each integrity value as "live" -// 3. Read entire filesystem tree in `content-vX/` dir -// 4. If content is live, verify its checksum and delete it if it fails -// 5. If content is not marked as live, rm it. -// -async function garbageCollect (cache, opts) { - opts.log.silly('verify', 'garbage collecting content') - const indexStream = index.lsStream(cache) - const liveContent = new Set() - indexStream.on('data', (entry) => { - if (opts.filter && !opts.filter(entry)) { - return - } - - // integrity is stringified, re-parse it so we can get each hash - const integrity = ssri.parse(entry.integrity) - for (const algo in integrity) { - liveContent.add(integrity[algo].toString()) - } - }) - await new Promise((resolve, reject) => { - indexStream.on('end', resolve).on('error', reject) - }) - const contentDir = contentPath.contentDir(cache) - const files = await glob(path.join(contentDir, '**'), { - follow: false, - nodir: true, - nosort: true, - }) - const stats = { - verifiedContent: 0, - reclaimedCount: 0, - reclaimedSize: 0, - badContentCount: 0, - keptSize: 0, - } - await pMap( - files, - async (f) => { - const split = f.split(/[/\\]/) - const digest = split.slice(split.length - 3).join('') - const algo = split[split.length - 4] - const integrity = ssri.fromHex(digest, algo) - if (liveContent.has(integrity.toString())) { - const info = await verifyContent(f, integrity) - if (!info.valid) { - stats.reclaimedCount++ - stats.badContentCount++ - stats.reclaimedSize += info.size - } else { - stats.verifiedContent++ - stats.keptSize += info.size - } - } else { - // No entries refer to this content. We can delete. - stats.reclaimedCount++ - const s = await stat(f) - await rm(f, { recursive: true, force: true }) - stats.reclaimedSize += s.size - } - return stats - }, - { concurrency: opts.concurrency } - ) - return stats -} - -async function verifyContent (filepath, sri) { - const contentInfo = {} - try { - const { size } = await stat(filepath) - contentInfo.size = size - contentInfo.valid = true - await ssri.checkStream(new fsm.ReadStream(filepath), sri) - } catch (err) { - if (err.code === 'ENOENT') { - return { size: 0, valid: false } - } - if (err.code !== 'EINTEGRITY') { - throw err - } - - await rm(filepath, { recursive: true, force: true }) - contentInfo.valid = false - } - return contentInfo -} - -async function rebuildIndex (cache, opts) { - opts.log.silly('verify', 'rebuilding index') - const entries = await index.ls(cache) - const stats = { - missingContent: 0, - rejectedEntries: 0, - totalEntries: 0, - } - const buckets = {} - for (const k in entries) { - /* istanbul ignore else */ - if (hasOwnProperty(entries, k)) { - const hashed = index.hashKey(k) - const entry = entries[k] - const excluded = opts.filter && !opts.filter(entry) - excluded && stats.rejectedEntries++ - if (buckets[hashed] && !excluded) { - buckets[hashed].push(entry) - } else if (buckets[hashed] && excluded) { - // skip - } else if (excluded) { - buckets[hashed] = [] - buckets[hashed]._path = index.bucketPath(cache, k) - } else { - buckets[hashed] = [entry] - buckets[hashed]._path = index.bucketPath(cache, k) - } - } - } - await pMap( - Object.keys(buckets), - (key) => { - return rebuildBucket(cache, buckets[key], stats, opts) - }, - { concurrency: opts.concurrency } - ) - return stats -} - -async function rebuildBucket (cache, bucket, stats) { - await truncate(bucket._path) - // This needs to be serialized because cacache explicitly - // lets very racy bucket conflicts clobber each other. - for (const entry of bucket) { - const content = contentPath(cache, entry.integrity) - try { - await stat(content) - await index.insert(cache, entry.key, entry.integrity, { - metadata: entry.metadata, - size: entry.size, - time: entry.time, - }) - stats.totalEntries++ - } catch (err) { - if (err.code === 'ENOENT') { - stats.rejectedEntries++ - stats.missingContent++ - } else { - throw err - } - } - } -} - -function cleanTmp (cache, opts) { - opts.log.silly('verify', 'cleaning tmp directory') - return rm(path.join(cache, 'tmp'), { recursive: true, force: true }) -} - -async function writeVerifile (cache, opts) { - const verifile = path.join(cache, '_lastverified') - opts.log.silly('verify', 'writing verifile to ' + verifile) - return writeFile(verifile, `${Date.now()}`) -} - -module.exports.lastRun = lastRun - -async function lastRun (cache) { - const data = await readFile(path.join(cache, '_lastverified'), { encoding: 'utf8' }) - return new Date(+data) -} diff --git a/deps/npm/node_modules/tuf-js/node_modules/cacache/package.json b/deps/npm/node_modules/tuf-js/node_modules/cacache/package.json deleted file mode 100644 index 6e6219158ed759..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/cacache/package.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "name": "cacache", - "version": "18.0.4", - "cache-version": { - "content": "2", - "index": "5" - }, - "description": "Fast, fault-tolerant, cross-platform, disk-based, data-agnostic, content-addressable cache.", - "main": "lib/index.js", - "files": [ - "bin/", - "lib/" - ], - "scripts": { - "test": "tap", - "snap": "tap", - "coverage": "tap", - "test-docker": "docker run -it --rm --name pacotest -v \"$PWD\":/tmp -w /tmp node:latest npm test", - "lint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"", - "npmclilint": "npmcli-lint", - "lintfix": "npm run lint -- --fix", - "postsnap": "npm run lintfix --", - "postlint": "template-oss-check", - "posttest": "npm run lint", - "template-oss-apply": "template-oss-apply --force" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/npm/cacache.git" - }, - "keywords": [ - "cache", - "caching", - "content-addressable", - "sri", - "sri hash", - "subresource integrity", - "cache", - "storage", - "store", - "file store", - "filesystem", - "disk cache", - "disk storage" - ], - "license": "ISC", - "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^10.0.1", - "minipass": "^7.0.3", - "minipass-collect": "^2.0.1", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, - "devDependencies": { - "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.22.0", - "tap": "^16.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - }, - "templateOSS": { - "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "windowsCI": false, - "version": "4.22.0", - "publish": "true" - }, - "author": "GitHub Inc.", - "tap": { - "nyc-arg": [ - "--exclude", - "tap-snapshots/**" - ] - } -} diff --git a/deps/npm/node_modules/tuf-js/node_modules/make-fetch-happen/LICENSE b/deps/npm/node_modules/tuf-js/node_modules/make-fetch-happen/LICENSE deleted file mode 100644 index 1808eb2844231c..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/make-fetch-happen/LICENSE +++ /dev/null @@ -1,16 +0,0 @@ -ISC License - -Copyright 2017-2022 (c) npm, Inc. - -Permission to use, copy, modify, and/or distribute this software for -any purpose with or without fee is hereby granted, provided that the -above copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE COPYRIGHT HOLDER DISCLAIMS -ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR -CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE -OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE -USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/deps/npm/node_modules/tuf-js/node_modules/make-fetch-happen/lib/cache/entry.js b/deps/npm/node_modules/tuf-js/node_modules/make-fetch-happen/lib/cache/entry.js deleted file mode 100644 index bfcfacbcc95e18..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/make-fetch-happen/lib/cache/entry.js +++ /dev/null @@ -1,471 +0,0 @@ -const { Request, Response } = require('minipass-fetch') -const { Minipass } = require('minipass') -const MinipassFlush = require('minipass-flush') -const cacache = require('cacache') -const url = require('url') - -const CachingMinipassPipeline = require('../pipeline.js') -const CachePolicy = require('./policy.js') -const cacheKey = require('./key.js') -const remote = require('../remote.js') - -const hasOwnProperty = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop) - -// allow list for request headers that will be written to the cache index -// note: we will also store any request headers -// that are named in a response's vary header -const KEEP_REQUEST_HEADERS = [ - 'accept-charset', - 'accept-encoding', - 'accept-language', - 'accept', - 'cache-control', -] - -// allow list for response headers that will be written to the cache index -// note: we must not store the real response's age header, or when we load -// a cache policy based on the metadata it will think the cached response -// is always stale -const KEEP_RESPONSE_HEADERS = [ - 'cache-control', - 'content-encoding', - 'content-language', - 'content-type', - 'date', - 'etag', - 'expires', - 'last-modified', - 'link', - 'location', - 'pragma', - 'vary', -] - -// return an object containing all metadata to be written to the index -const getMetadata = (request, response, options) => { - const metadata = { - time: Date.now(), - url: request.url, - reqHeaders: {}, - resHeaders: {}, - - // options on which we must match the request and vary the response - options: { - compress: options.compress != null ? options.compress : request.compress, - }, - } - - // only save the status if it's not a 200 or 304 - if (response.status !== 200 && response.status !== 304) { - metadata.status = response.status - } - - for (const name of KEEP_REQUEST_HEADERS) { - if (request.headers.has(name)) { - metadata.reqHeaders[name] = request.headers.get(name) - } - } - - // if the request's host header differs from the host in the url - // we need to keep it, otherwise it's just noise and we ignore it - const host = request.headers.get('host') - const parsedUrl = new url.URL(request.url) - if (host && parsedUrl.host !== host) { - metadata.reqHeaders.host = host - } - - // if the response has a vary header, make sure - // we store the relevant request headers too - if (response.headers.has('vary')) { - const vary = response.headers.get('vary') - // a vary of "*" means every header causes a different response. - // in that scenario, we do not include any additional headers - // as the freshness check will always fail anyway and we don't - // want to bloat the cache indexes - if (vary !== '*') { - // copy any other request headers that will vary the response - const varyHeaders = vary.trim().toLowerCase().split(/\s*,\s*/) - for (const name of varyHeaders) { - if (request.headers.has(name)) { - metadata.reqHeaders[name] = request.headers.get(name) - } - } - } - } - - for (const name of KEEP_RESPONSE_HEADERS) { - if (response.headers.has(name)) { - metadata.resHeaders[name] = response.headers.get(name) - } - } - - for (const name of options.cacheAdditionalHeaders) { - if (response.headers.has(name)) { - metadata.resHeaders[name] = response.headers.get(name) - } - } - - return metadata -} - -// symbols used to hide objects that may be lazily evaluated in a getter -const _request = Symbol('request') -const _response = Symbol('response') -const _policy = Symbol('policy') - -class CacheEntry { - constructor ({ entry, request, response, options }) { - if (entry) { - this.key = entry.key - this.entry = entry - // previous versions of this module didn't write an explicit timestamp in - // the metadata, so fall back to the entry's timestamp. we can't use the - // entry timestamp to determine staleness because cacache will update it - // when it verifies its data - this.entry.metadata.time = this.entry.metadata.time || this.entry.time - } else { - this.key = cacheKey(request) - } - - this.options = options - - // these properties are behind getters that lazily evaluate - this[_request] = request - this[_response] = response - this[_policy] = null - } - - // returns a CacheEntry instance that satisfies the given request - // or undefined if no existing entry satisfies - static async find (request, options) { - try { - // compacts the index and returns an array of unique entries - var matches = await cacache.index.compact(options.cachePath, cacheKey(request), (A, B) => { - const entryA = new CacheEntry({ entry: A, options }) - const entryB = new CacheEntry({ entry: B, options }) - return entryA.policy.satisfies(entryB.request) - }, { - validateEntry: (entry) => { - // clean out entries with a buggy content-encoding value - if (entry.metadata && - entry.metadata.resHeaders && - entry.metadata.resHeaders['content-encoding'] === null) { - return false - } - - // if an integrity is null, it needs to have a status specified - if (entry.integrity === null) { - return !!(entry.metadata && entry.metadata.status) - } - - return true - }, - }) - } catch (err) { - // if the compact request fails, ignore the error and return - return - } - - // a cache mode of 'reload' means to behave as though we have no cache - // on the way to the network. return undefined to allow cacheFetch to - // create a brand new request no matter what. - if (options.cache === 'reload') { - return - } - - // find the specific entry that satisfies the request - let match - for (const entry of matches) { - const _entry = new CacheEntry({ - entry, - options, - }) - - if (_entry.policy.satisfies(request)) { - match = _entry - break - } - } - - return match - } - - // if the user made a PUT/POST/PATCH then we invalidate our - // cache for the same url by deleting the index entirely - static async invalidate (request, options) { - const key = cacheKey(request) - try { - await cacache.rm.entry(options.cachePath, key, { removeFully: true }) - } catch (err) { - // ignore errors - } - } - - get request () { - if (!this[_request]) { - this[_request] = new Request(this.entry.metadata.url, { - method: 'GET', - headers: this.entry.metadata.reqHeaders, - ...this.entry.metadata.options, - }) - } - - return this[_request] - } - - get response () { - if (!this[_response]) { - this[_response] = new Response(null, { - url: this.entry.metadata.url, - counter: this.options.counter, - status: this.entry.metadata.status || 200, - headers: { - ...this.entry.metadata.resHeaders, - 'content-length': this.entry.size, - }, - }) - } - - return this[_response] - } - - get policy () { - if (!this[_policy]) { - this[_policy] = new CachePolicy({ - entry: this.entry, - request: this.request, - response: this.response, - options: this.options, - }) - } - - return this[_policy] - } - - // wraps the response in a pipeline that stores the data - // in the cache while the user consumes it - async store (status) { - // if we got a status other than 200, 301, or 308, - // or the CachePolicy forbid storage, append the - // cache status header and return it untouched - if ( - this.request.method !== 'GET' || - ![200, 301, 308].includes(this.response.status) || - !this.policy.storable() - ) { - this.response.headers.set('x-local-cache-status', 'skip') - return this.response - } - - const size = this.response.headers.get('content-length') - const cacheOpts = { - algorithms: this.options.algorithms, - metadata: getMetadata(this.request, this.response, this.options), - size, - integrity: this.options.integrity, - integrityEmitter: this.response.body.hasIntegrityEmitter && this.response.body, - } - - let body = null - // we only set a body if the status is a 200, redirects are - // stored as metadata only - if (this.response.status === 200) { - let cacheWriteResolve, cacheWriteReject - const cacheWritePromise = new Promise((resolve, reject) => { - cacheWriteResolve = resolve - cacheWriteReject = reject - }).catch((err) => { - body.emit('error', err) - }) - - body = new CachingMinipassPipeline({ events: ['integrity', 'size'] }, new MinipassFlush({ - flush () { - return cacheWritePromise - }, - })) - // this is always true since if we aren't reusing the one from the remote fetch, we - // are using the one from cacache - body.hasIntegrityEmitter = true - - const onResume = () => { - const tee = new Minipass() - const cacheStream = cacache.put.stream(this.options.cachePath, this.key, cacheOpts) - // re-emit the integrity and size events on our new response body so they can be reused - cacheStream.on('integrity', i => body.emit('integrity', i)) - cacheStream.on('size', s => body.emit('size', s)) - // stick a flag on here so downstream users will know if they can expect integrity events - tee.pipe(cacheStream) - // TODO if the cache write fails, log a warning but return the response anyway - // eslint-disable-next-line promise/catch-or-return - cacheStream.promise().then(cacheWriteResolve, cacheWriteReject) - body.unshift(tee) - body.unshift(this.response.body) - } - - body.once('resume', onResume) - body.once('end', () => body.removeListener('resume', onResume)) - } else { - await cacache.index.insert(this.options.cachePath, this.key, null, cacheOpts) - } - - // note: we do not set the x-local-cache-hash header because we do not know - // the hash value until after the write to the cache completes, which doesn't - // happen until after the response has been sent and it's too late to write - // the header anyway - this.response.headers.set('x-local-cache', encodeURIComponent(this.options.cachePath)) - this.response.headers.set('x-local-cache-key', encodeURIComponent(this.key)) - this.response.headers.set('x-local-cache-mode', 'stream') - this.response.headers.set('x-local-cache-status', status) - this.response.headers.set('x-local-cache-time', new Date().toISOString()) - const newResponse = new Response(body, { - url: this.response.url, - status: this.response.status, - headers: this.response.headers, - counter: this.options.counter, - }) - return newResponse - } - - // use the cached data to create a response and return it - async respond (method, options, status) { - let response - if (method === 'HEAD' || [301, 308].includes(this.response.status)) { - // if the request is a HEAD, or the response is a redirect, - // then the metadata in the entry already includes everything - // we need to build a response - response = this.response - } else { - // we're responding with a full cached response, so create a body - // that reads from cacache and attach it to a new Response - const body = new Minipass() - const headers = { ...this.policy.responseHeaders() } - - const onResume = () => { - const cacheStream = cacache.get.stream.byDigest( - this.options.cachePath, this.entry.integrity, { memoize: this.options.memoize } - ) - cacheStream.on('error', async (err) => { - cacheStream.pause() - if (err.code === 'EINTEGRITY') { - await cacache.rm.content( - this.options.cachePath, this.entry.integrity, { memoize: this.options.memoize } - ) - } - if (err.code === 'ENOENT' || err.code === 'EINTEGRITY') { - await CacheEntry.invalidate(this.request, this.options) - } - body.emit('error', err) - cacheStream.resume() - }) - // emit the integrity and size events based on our metadata so we're consistent - body.emit('integrity', this.entry.integrity) - body.emit('size', Number(headers['content-length'])) - cacheStream.pipe(body) - } - - body.once('resume', onResume) - body.once('end', () => body.removeListener('resume', onResume)) - response = new Response(body, { - url: this.entry.metadata.url, - counter: options.counter, - status: 200, - headers, - }) - } - - response.headers.set('x-local-cache', encodeURIComponent(this.options.cachePath)) - response.headers.set('x-local-cache-hash', encodeURIComponent(this.entry.integrity)) - response.headers.set('x-local-cache-key', encodeURIComponent(this.key)) - response.headers.set('x-local-cache-mode', 'stream') - response.headers.set('x-local-cache-status', status) - response.headers.set('x-local-cache-time', new Date(this.entry.metadata.time).toUTCString()) - return response - } - - // use the provided request along with this cache entry to - // revalidate the stored response. returns a response, either - // from the cache or from the update - async revalidate (request, options) { - const revalidateRequest = new Request(request, { - headers: this.policy.revalidationHeaders(request), - }) - - try { - // NOTE: be sure to remove the headers property from the - // user supplied options, since we have already defined - // them on the new request object. if they're still in the - // options then those will overwrite the ones from the policy - var response = await remote(revalidateRequest, { - ...options, - headers: undefined, - }) - } catch (err) { - // if the network fetch fails, return the stale - // cached response unless it has a cache-control - // of 'must-revalidate' - if (!this.policy.mustRevalidate) { - return this.respond(request.method, options, 'stale') - } - - throw err - } - - if (this.policy.revalidated(revalidateRequest, response)) { - // we got a 304, write a new index to the cache and respond from cache - const metadata = getMetadata(request, response, options) - // 304 responses do not include headers that are specific to the response data - // since they do not include a body, so we copy values for headers that were - // in the old cache entry to the new one, if the new metadata does not already - // include that header - for (const name of KEEP_RESPONSE_HEADERS) { - if ( - !hasOwnProperty(metadata.resHeaders, name) && - hasOwnProperty(this.entry.metadata.resHeaders, name) - ) { - metadata.resHeaders[name] = this.entry.metadata.resHeaders[name] - } - } - - for (const name of options.cacheAdditionalHeaders) { - const inMeta = hasOwnProperty(metadata.resHeaders, name) - const inEntry = hasOwnProperty(this.entry.metadata.resHeaders, name) - const inPolicy = hasOwnProperty(this.policy.response.headers, name) - - // if the header is in the existing entry, but it is not in the metadata - // then we need to write it to the metadata as this will refresh the on-disk cache - if (!inMeta && inEntry) { - metadata.resHeaders[name] = this.entry.metadata.resHeaders[name] - } - // if the header is in the metadata, but not in the policy, then we need to set - // it in the policy so that it's included in the immediate response. future - // responses will load a new cache entry, so we don't need to change that - if (!inPolicy && inMeta) { - this.policy.response.headers[name] = metadata.resHeaders[name] - } - } - - try { - await cacache.index.insert(options.cachePath, this.key, this.entry.integrity, { - size: this.entry.size, - metadata, - }) - } catch (err) { - // if updating the cache index fails, we ignore it and - // respond anyway - } - return this.respond(request.method, options, 'revalidated') - } - - // if we got a modified response, create a new entry based on it - const newEntry = new CacheEntry({ - request, - response, - options, - }) - - // respond with the new entry while writing it to the cache - return newEntry.store('updated') - } -} - -module.exports = CacheEntry diff --git a/deps/npm/node_modules/tuf-js/node_modules/make-fetch-happen/lib/cache/errors.js b/deps/npm/node_modules/tuf-js/node_modules/make-fetch-happen/lib/cache/errors.js deleted file mode 100644 index 67a66573bebe66..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/make-fetch-happen/lib/cache/errors.js +++ /dev/null @@ -1,11 +0,0 @@ -class NotCachedError extends Error { - constructor (url) { - /* eslint-disable-next-line max-len */ - super(`request to ${url} failed: cache mode is 'only-if-cached' but no cached response is available.`) - this.code = 'ENOTCACHED' - } -} - -module.exports = { - NotCachedError, -} diff --git a/deps/npm/node_modules/tuf-js/node_modules/make-fetch-happen/lib/cache/index.js b/deps/npm/node_modules/tuf-js/node_modules/make-fetch-happen/lib/cache/index.js deleted file mode 100644 index 0de49d23fb9336..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/make-fetch-happen/lib/cache/index.js +++ /dev/null @@ -1,49 +0,0 @@ -const { NotCachedError } = require('./errors.js') -const CacheEntry = require('./entry.js') -const remote = require('../remote.js') - -// do whatever is necessary to get a Response and return it -const cacheFetch = async (request, options) => { - // try to find a cached entry that satisfies this request - const entry = await CacheEntry.find(request, options) - if (!entry) { - // no cached result, if the cache mode is 'only-if-cached' that's a failure - if (options.cache === 'only-if-cached') { - throw new NotCachedError(request.url) - } - - // otherwise, we make a request, store it and return it - const response = await remote(request, options) - const newEntry = new CacheEntry({ request, response, options }) - return newEntry.store('miss') - } - - // we have a cached response that satisfies this request, however if the cache - // mode is 'no-cache' then we send the revalidation request no matter what - if (options.cache === 'no-cache') { - return entry.revalidate(request, options) - } - - // if the cached entry is not stale, or if the cache mode is 'force-cache' or - // 'only-if-cached' we can respond with the cached entry. set the status - // based on the result of needsRevalidation and respond - const _needsRevalidation = entry.policy.needsRevalidation(request) - if (options.cache === 'force-cache' || - options.cache === 'only-if-cached' || - !_needsRevalidation) { - return entry.respond(request.method, options, _needsRevalidation ? 'stale' : 'hit') - } - - // if we got here, the cache entry is stale so revalidate it - return entry.revalidate(request, options) -} - -cacheFetch.invalidate = async (request, options) => { - if (!options.cachePath) { - return - } - - return CacheEntry.invalidate(request, options) -} - -module.exports = cacheFetch diff --git a/deps/npm/node_modules/tuf-js/node_modules/make-fetch-happen/lib/cache/key.js b/deps/npm/node_modules/tuf-js/node_modules/make-fetch-happen/lib/cache/key.js deleted file mode 100644 index f7684d562b7fae..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/make-fetch-happen/lib/cache/key.js +++ /dev/null @@ -1,17 +0,0 @@ -const { URL, format } = require('url') - -// options passed to url.format() when generating a key -const formatOptions = { - auth: false, - fragment: false, - search: true, - unicode: false, -} - -// returns a string to be used as the cache key for the Request -const cacheKey = (request) => { - const parsed = new URL(request.url) - return `make-fetch-happen:request-cache:${format(parsed, formatOptions)}` -} - -module.exports = cacheKey diff --git a/deps/npm/node_modules/tuf-js/node_modules/make-fetch-happen/lib/cache/policy.js b/deps/npm/node_modules/tuf-js/node_modules/make-fetch-happen/lib/cache/policy.js deleted file mode 100644 index ada3c8600dae92..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/make-fetch-happen/lib/cache/policy.js +++ /dev/null @@ -1,161 +0,0 @@ -const CacheSemantics = require('http-cache-semantics') -const Negotiator = require('negotiator') -const ssri = require('ssri') - -// options passed to http-cache-semantics constructor -const policyOptions = { - shared: false, - ignoreCargoCult: true, -} - -// a fake empty response, used when only testing the -// request for storability -const emptyResponse = { status: 200, headers: {} } - -// returns a plain object representation of the Request -const requestObject = (request) => { - const _obj = { - method: request.method, - url: request.url, - headers: {}, - compress: request.compress, - } - - request.headers.forEach((value, key) => { - _obj.headers[key] = value - }) - - return _obj -} - -// returns a plain object representation of the Response -const responseObject = (response) => { - const _obj = { - status: response.status, - headers: {}, - } - - response.headers.forEach((value, key) => { - _obj.headers[key] = value - }) - - return _obj -} - -class CachePolicy { - constructor ({ entry, request, response, options }) { - this.entry = entry - this.request = requestObject(request) - this.response = responseObject(response) - this.options = options - this.policy = new CacheSemantics(this.request, this.response, policyOptions) - - if (this.entry) { - // if we have an entry, copy the timestamp to the _responseTime - // this is necessary because the CacheSemantics constructor forces - // the value to Date.now() which means a policy created from a - // cache entry is likely to always identify itself as stale - this.policy._responseTime = this.entry.metadata.time - } - } - - // static method to quickly determine if a request alone is storable - static storable (request, options) { - // no cachePath means no caching - if (!options.cachePath) { - return false - } - - // user explicitly asked not to cache - if (options.cache === 'no-store') { - return false - } - - // we only cache GET and HEAD requests - if (!['GET', 'HEAD'].includes(request.method)) { - return false - } - - // otherwise, let http-cache-semantics make the decision - // based on the request's headers - const policy = new CacheSemantics(requestObject(request), emptyResponse, policyOptions) - return policy.storable() - } - - // returns true if the policy satisfies the request - satisfies (request) { - const _req = requestObject(request) - if (this.request.headers.host !== _req.headers.host) { - return false - } - - if (this.request.compress !== _req.compress) { - return false - } - - const negotiatorA = new Negotiator(this.request) - const negotiatorB = new Negotiator(_req) - - if (JSON.stringify(negotiatorA.mediaTypes()) !== JSON.stringify(negotiatorB.mediaTypes())) { - return false - } - - if (JSON.stringify(negotiatorA.languages()) !== JSON.stringify(negotiatorB.languages())) { - return false - } - - if (JSON.stringify(negotiatorA.encodings()) !== JSON.stringify(negotiatorB.encodings())) { - return false - } - - if (this.options.integrity) { - return ssri.parse(this.options.integrity).match(this.entry.integrity) - } - - return true - } - - // returns true if the request and response allow caching - storable () { - return this.policy.storable() - } - - // NOTE: this is a hack to avoid parsing the cache-control - // header ourselves, it returns true if the response's - // cache-control contains must-revalidate - get mustRevalidate () { - return !!this.policy._rescc['must-revalidate'] - } - - // returns true if the cached response requires revalidation - // for the given request - needsRevalidation (request) { - const _req = requestObject(request) - // force method to GET because we only cache GETs - // but can serve a HEAD from a cached GET - _req.method = 'GET' - return !this.policy.satisfiesWithoutRevalidation(_req) - } - - responseHeaders () { - return this.policy.responseHeaders() - } - - // returns a new object containing the appropriate headers - // to send a revalidation request - revalidationHeaders (request) { - const _req = requestObject(request) - return this.policy.revalidationHeaders(_req) - } - - // returns true if the request/response was revalidated - // successfully. returns false if a new response was received - revalidated (request, response) { - const _req = requestObject(request) - const _res = responseObject(response) - const policy = this.policy.revalidatedPolicy(_req, _res) - return !policy.modified - } -} - -module.exports = CachePolicy diff --git a/deps/npm/node_modules/tuf-js/node_modules/make-fetch-happen/lib/fetch.js b/deps/npm/node_modules/tuf-js/node_modules/make-fetch-happen/lib/fetch.js deleted file mode 100644 index 233ba67e165502..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/make-fetch-happen/lib/fetch.js +++ /dev/null @@ -1,118 +0,0 @@ -'use strict' - -const { FetchError, Request, isRedirect } = require('minipass-fetch') -const url = require('url') - -const CachePolicy = require('./cache/policy.js') -const cache = require('./cache/index.js') -const remote = require('./remote.js') - -// given a Request, a Response and user options -// return true if the response is a redirect that -// can be followed. we throw errors that will result -// in the fetch being rejected if the redirect is -// possible but invalid for some reason -const canFollowRedirect = (request, response, options) => { - if (!isRedirect(response.status)) { - return false - } - - if (options.redirect === 'manual') { - return false - } - - if (options.redirect === 'error') { - throw new FetchError(`redirect mode is set to error: ${request.url}`, - 'no-redirect', { code: 'ENOREDIRECT' }) - } - - if (!response.headers.has('location')) { - throw new FetchError(`redirect location header missing for: ${request.url}`, - 'no-location', { code: 'EINVALIDREDIRECT' }) - } - - if (request.counter >= request.follow) { - throw new FetchError(`maximum redirect reached at: ${request.url}`, - 'max-redirect', { code: 'EMAXREDIRECT' }) - } - - return true -} - -// given a Request, a Response, and the user's options return an object -// with a new Request and a new options object that will be used for -// following the redirect -const getRedirect = (request, response, options) => { - const _opts = { ...options } - const location = response.headers.get('location') - const redirectUrl = new url.URL(location, /^https?:/.test(location) ? undefined : request.url) - // Comment below is used under the following license: - /** - * @license - * Copyright (c) 2010-2012 Mikeal Rogers - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an "AS - * IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either - * express or implied. See the License for the specific language - * governing permissions and limitations under the License. - */ - - // Remove authorization if changing hostnames (but not if just - // changing ports or protocols). This matches the behavior of request: - // https://github.com/request/request/blob/b12a6245/lib/redirect.js#L134-L138 - if (new url.URL(request.url).hostname !== redirectUrl.hostname) { - request.headers.delete('authorization') - request.headers.delete('cookie') - } - - // for POST request with 301/302 response, or any request with 303 response, - // use GET when following redirect - if ( - response.status === 303 || - (request.method === 'POST' && [301, 302].includes(response.status)) - ) { - _opts.method = 'GET' - _opts.body = null - request.headers.delete('content-length') - } - - _opts.headers = {} - request.headers.forEach((value, key) => { - _opts.headers[key] = value - }) - - _opts.counter = ++request.counter - const redirectReq = new Request(url.format(redirectUrl), _opts) - return { - request: redirectReq, - options: _opts, - } -} - -const fetch = async (request, options) => { - const response = CachePolicy.storable(request, options) - ? await cache(request, options) - : await remote(request, options) - - // if the request wasn't a GET or HEAD, and the response - // status is between 200 and 399 inclusive, invalidate the - // request url - if (!['GET', 'HEAD'].includes(request.method) && - response.status >= 200 && - response.status <= 399) { - await cache.invalidate(request, options) - } - - if (!canFollowRedirect(request, response, options)) { - return response - } - - const redirect = getRedirect(request, response, options) - return fetch(redirect.request, redirect.options) -} - -module.exports = fetch diff --git a/deps/npm/node_modules/tuf-js/node_modules/make-fetch-happen/lib/index.js b/deps/npm/node_modules/tuf-js/node_modules/make-fetch-happen/lib/index.js deleted file mode 100644 index 2f12e8e1b61131..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/make-fetch-happen/lib/index.js +++ /dev/null @@ -1,41 +0,0 @@ -const { FetchError, Headers, Request, Response } = require('minipass-fetch') - -const configureOptions = require('./options.js') -const fetch = require('./fetch.js') - -const makeFetchHappen = (url, opts) => { - const options = configureOptions(opts) - - const request = new Request(url, options) - return fetch(request, options) -} - -makeFetchHappen.defaults = (defaultUrl, defaultOptions = {}, wrappedFetch = makeFetchHappen) => { - if (typeof defaultUrl === 'object') { - defaultOptions = defaultUrl - defaultUrl = null - } - - const defaultedFetch = (url, options = {}) => { - const finalUrl = url || defaultUrl - const finalOptions = { - ...defaultOptions, - ...options, - headers: { - ...defaultOptions.headers, - ...options.headers, - }, - } - return wrappedFetch(finalUrl, finalOptions) - } - - defaultedFetch.defaults = (defaultUrl1, defaultOptions1 = {}) => - makeFetchHappen.defaults(defaultUrl1, defaultOptions1, defaultedFetch) - return defaultedFetch -} - -module.exports = makeFetchHappen -module.exports.FetchError = FetchError -module.exports.Headers = Headers -module.exports.Request = Request -module.exports.Response = Response diff --git a/deps/npm/node_modules/tuf-js/node_modules/make-fetch-happen/lib/options.js b/deps/npm/node_modules/tuf-js/node_modules/make-fetch-happen/lib/options.js deleted file mode 100644 index f77511279f831d..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/make-fetch-happen/lib/options.js +++ /dev/null @@ -1,54 +0,0 @@ -const dns = require('dns') - -const conditionalHeaders = [ - 'if-modified-since', - 'if-none-match', - 'if-unmodified-since', - 'if-match', - 'if-range', -] - -const configureOptions = (opts) => { - const { strictSSL, ...options } = { ...opts } - options.method = options.method ? options.method.toUpperCase() : 'GET' - options.rejectUnauthorized = strictSSL !== false - - if (!options.retry) { - options.retry = { retries: 0 } - } else if (typeof options.retry === 'string') { - const retries = parseInt(options.retry, 10) - if (isFinite(retries)) { - options.retry = { retries } - } else { - options.retry = { retries: 0 } - } - } else if (typeof options.retry === 'number') { - options.retry = { retries: options.retry } - } else { - options.retry = { retries: 0, ...options.retry } - } - - options.dns = { ttl: 5 * 60 * 1000, lookup: dns.lookup, ...options.dns } - - options.cache = options.cache || 'default' - if (options.cache === 'default') { - const hasConditionalHeader = Object.keys(options.headers || {}).some((name) => { - return conditionalHeaders.includes(name.toLowerCase()) - }) - if (hasConditionalHeader) { - options.cache = 'no-store' - } - } - - options.cacheAdditionalHeaders = options.cacheAdditionalHeaders || [] - - // cacheManager is deprecated, but if it's set and - // cachePath is not we should copy it to the new field - if (options.cacheManager && !options.cachePath) { - options.cachePath = options.cacheManager - } - - return options -} - -module.exports = configureOptions diff --git a/deps/npm/node_modules/tuf-js/node_modules/make-fetch-happen/lib/pipeline.js b/deps/npm/node_modules/tuf-js/node_modules/make-fetch-happen/lib/pipeline.js deleted file mode 100644 index b1d221b2d0ce31..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/make-fetch-happen/lib/pipeline.js +++ /dev/null @@ -1,41 +0,0 @@ -'use strict' - -const MinipassPipeline = require('minipass-pipeline') - -class CachingMinipassPipeline extends MinipassPipeline { - #events = [] - #data = new Map() - - constructor (opts, ...streams) { - // CRITICAL: do NOT pass the streams to the call to super(), this will start - // the flow of data and potentially cause the events we need to catch to emit - // before we've finished our own setup. instead we call super() with no args, - // finish our setup, and then push the streams into ourselves to start the - // data flow - super() - this.#events = opts.events - - /* istanbul ignore next - coverage disabled because this is pointless to test here */ - if (streams.length) { - this.push(...streams) - } - } - - on (event, handler) { - if (this.#events.includes(event) && this.#data.has(event)) { - return handler(...this.#data.get(event)) - } - - return super.on(event, handler) - } - - emit (event, ...data) { - if (this.#events.includes(event)) { - this.#data.set(event, data) - } - - return super.emit(event, ...data) - } -} - -module.exports = CachingMinipassPipeline diff --git a/deps/npm/node_modules/tuf-js/node_modules/make-fetch-happen/lib/remote.js b/deps/npm/node_modules/tuf-js/node_modules/make-fetch-happen/lib/remote.js deleted file mode 100644 index 8554564074de6e..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/make-fetch-happen/lib/remote.js +++ /dev/null @@ -1,131 +0,0 @@ -const { Minipass } = require('minipass') -const fetch = require('minipass-fetch') -const promiseRetry = require('promise-retry') -const ssri = require('ssri') -const { log } = require('proc-log') - -const CachingMinipassPipeline = require('./pipeline.js') -const { getAgent } = require('@npmcli/agent') -const pkg = require('../package.json') - -const USER_AGENT = `${pkg.name}/${pkg.version} (+https://npm.im/${pkg.name})` - -const RETRY_ERRORS = [ - 'ECONNRESET', // remote socket closed on us - 'ECONNREFUSED', // remote host refused to open connection - 'EADDRINUSE', // failed to bind to a local port (proxy?) - 'ETIMEDOUT', // someone in the transaction is WAY TOO SLOW - // from @npmcli/agent - 'ECONNECTIONTIMEOUT', - 'EIDLETIMEOUT', - 'ERESPONSETIMEOUT', - 'ETRANSFERTIMEOUT', - // Known codes we do NOT retry on: - // ENOTFOUND (getaddrinfo failure. Either bad hostname, or offline) - // EINVALIDPROXY // invalid protocol from @npmcli/agent - // EINVALIDRESPONSE // invalid status code from @npmcli/agent -] - -const RETRY_TYPES = [ - 'request-timeout', -] - -// make a request directly to the remote source, -// retrying certain classes of errors as well as -// following redirects (through the cache if necessary) -// and verifying response integrity -const remoteFetch = (request, options) => { - const agent = getAgent(request.url, options) - if (!request.headers.has('connection')) { - request.headers.set('connection', agent ? 'keep-alive' : 'close') - } - - if (!request.headers.has('user-agent')) { - request.headers.set('user-agent', USER_AGENT) - } - - // keep our own options since we're overriding the agent - // and the redirect mode - const _opts = { - ...options, - agent, - redirect: 'manual', - } - - return promiseRetry(async (retryHandler, attemptNum) => { - const req = new fetch.Request(request, _opts) - try { - let res = await fetch(req, _opts) - if (_opts.integrity && res.status === 200) { - // we got a 200 response and the user has specified an expected - // integrity value, so wrap the response in an ssri stream to verify it - const integrityStream = ssri.integrityStream({ - algorithms: _opts.algorithms, - integrity: _opts.integrity, - size: _opts.size, - }) - const pipeline = new CachingMinipassPipeline({ - events: ['integrity', 'size'], - }, res.body, integrityStream) - // we also propagate the integrity and size events out to the pipeline so we can use - // this new response body as an integrityEmitter for cacache - integrityStream.on('integrity', i => pipeline.emit('integrity', i)) - integrityStream.on('size', s => pipeline.emit('size', s)) - res = new fetch.Response(pipeline, res) - // set an explicit flag so we know if our response body will emit integrity and size - res.body.hasIntegrityEmitter = true - } - - res.headers.set('x-fetch-attempts', attemptNum) - - // do not retry POST requests, or requests with a streaming body - // do retry requests with a 408, 420, 429 or 500+ status in the response - const isStream = Minipass.isStream(req.body) - const isRetriable = req.method !== 'POST' && - !isStream && - ([408, 420, 429].includes(res.status) || res.status >= 500) - - if (isRetriable) { - if (typeof options.onRetry === 'function') { - options.onRetry(res) - } - - /* eslint-disable-next-line max-len */ - log.http('fetch', `${req.method} ${req.url} attempt ${attemptNum} failed with ${res.status}`) - return retryHandler(res) - } - - return res - } catch (err) { - const code = (err.code === 'EPROMISERETRY') - ? err.retried.code - : err.code - - // err.retried will be the thing that was thrown from above - // if it's a response, we just got a bad status code and we - // can re-throw to allow the retry - const isRetryError = err.retried instanceof fetch.Response || - (RETRY_ERRORS.includes(code) && RETRY_TYPES.includes(err.type)) - - if (req.method === 'POST' || isRetryError) { - throw err - } - - if (typeof options.onRetry === 'function') { - options.onRetry(err) - } - - log.http('fetch', `${req.method} ${req.url} attempt ${attemptNum} failed with ${err.code}`) - return retryHandler(err) - } - }, options.retry).catch((err) => { - // don't reject for http errors, just return them - if (err.status >= 400 && err.type !== 'system') { - return err - } - - throw err - }) -} - -module.exports = remoteFetch diff --git a/deps/npm/node_modules/tuf-js/node_modules/make-fetch-happen/package.json b/deps/npm/node_modules/tuf-js/node_modules/make-fetch-happen/package.json deleted file mode 100644 index 7adb4d1e7f9719..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/make-fetch-happen/package.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "name": "make-fetch-happen", - "version": "13.0.1", - "description": "Opinionated, caching, retrying fetch client", - "main": "lib/index.js", - "files": [ - "bin/", - "lib/" - ], - "scripts": { - "test": "tap", - "posttest": "npm run lint", - "eslint": "eslint", - "lint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"", - "lintfix": "npm run lint -- --fix", - "postlint": "template-oss-check", - "snap": "tap", - "template-oss-apply": "template-oss-apply --force" - }, - "repository": { - "type": "git", - "url": "https://github.com/npm/make-fetch-happen.git" - }, - "keywords": [ - "http", - "request", - "fetch", - "mean girls", - "caching", - "cache", - "subresource integrity" - ], - "author": "GitHub Inc.", - "license": "ISC", - "dependencies": { - "@npmcli/agent": "^2.0.0", - "cacache": "^18.0.0", - "http-cache-semantics": "^4.1.1", - "is-lambda": "^1.0.1", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "proc-log": "^4.2.0", - "promise-retry": "^2.0.1", - "ssri": "^10.0.0" - }, - "devDependencies": { - "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.21.4", - "nock": "^13.2.4", - "safe-buffer": "^5.2.1", - "standard-version": "^9.3.2", - "tap": "^16.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - }, - "tap": { - "color": 1, - "files": "test/*.js", - "check-coverage": true, - "timeout": 60, - "nyc-arg": [ - "--exclude", - "tap-snapshots/**" - ] - }, - "templateOSS": { - "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.21.4", - "publish": "true" - } -} diff --git a/deps/npm/node_modules/tuf-js/node_modules/minipass-fetch/LICENSE b/deps/npm/node_modules/tuf-js/node_modules/minipass-fetch/LICENSE deleted file mode 100644 index 3c3410cdc12ee3..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/minipass-fetch/LICENSE +++ /dev/null @@ -1,28 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Isaac Z. Schlueter and Contributors -Copyright (c) 2016 David Frank - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - ---- - -Note: This is a derivative work based on "node-fetch" by David Frank, -modified and distributed under the terms of the MIT license above. -https://github.com/bitinn/node-fetch diff --git a/deps/npm/node_modules/tuf-js/node_modules/minipass-fetch/lib/abort-error.js b/deps/npm/node_modules/tuf-js/node_modules/minipass-fetch/lib/abort-error.js deleted file mode 100644 index b18f643269e375..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/minipass-fetch/lib/abort-error.js +++ /dev/null @@ -1,17 +0,0 @@ -'use strict' -class AbortError extends Error { - constructor (message) { - super(message) - this.code = 'FETCH_ABORTED' - this.type = 'aborted' - Error.captureStackTrace(this, this.constructor) - } - - get name () { - return 'AbortError' - } - - // don't allow name to be overridden, but don't throw either - set name (s) {} -} -module.exports = AbortError diff --git a/deps/npm/node_modules/tuf-js/node_modules/minipass-fetch/lib/blob.js b/deps/npm/node_modules/tuf-js/node_modules/minipass-fetch/lib/blob.js deleted file mode 100644 index 121b1730102e72..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/minipass-fetch/lib/blob.js +++ /dev/null @@ -1,97 +0,0 @@ -'use strict' -const { Minipass } = require('minipass') -const TYPE = Symbol('type') -const BUFFER = Symbol('buffer') - -class Blob { - constructor (blobParts, options) { - this[TYPE] = '' - - const buffers = [] - let size = 0 - - if (blobParts) { - const a = blobParts - const length = Number(a.length) - for (let i = 0; i < length; i++) { - const element = a[i] - const buffer = element instanceof Buffer ? element - : ArrayBuffer.isView(element) - ? Buffer.from(element.buffer, element.byteOffset, element.byteLength) - : element instanceof ArrayBuffer ? Buffer.from(element) - : element instanceof Blob ? element[BUFFER] - : typeof element === 'string' ? Buffer.from(element) - : Buffer.from(String(element)) - size += buffer.length - buffers.push(buffer) - } - } - - this[BUFFER] = Buffer.concat(buffers, size) - - const type = options && options.type !== undefined - && String(options.type).toLowerCase() - if (type && !/[^\u0020-\u007E]/.test(type)) { - this[TYPE] = type - } - } - - get size () { - return this[BUFFER].length - } - - get type () { - return this[TYPE] - } - - text () { - return Promise.resolve(this[BUFFER].toString()) - } - - arrayBuffer () { - const buf = this[BUFFER] - const off = buf.byteOffset - const len = buf.byteLength - const ab = buf.buffer.slice(off, off + len) - return Promise.resolve(ab) - } - - stream () { - return new Minipass().end(this[BUFFER]) - } - - slice (start, end, type) { - const size = this.size - const relativeStart = start === undefined ? 0 - : start < 0 ? Math.max(size + start, 0) - : Math.min(start, size) - const relativeEnd = end === undefined ? size - : end < 0 ? Math.max(size + end, 0) - : Math.min(end, size) - const span = Math.max(relativeEnd - relativeStart, 0) - - const buffer = this[BUFFER] - const slicedBuffer = buffer.slice( - relativeStart, - relativeStart + span - ) - const blob = new Blob([], { type }) - blob[BUFFER] = slicedBuffer - return blob - } - - get [Symbol.toStringTag] () { - return 'Blob' - } - - static get BUFFER () { - return BUFFER - } -} - -Object.defineProperties(Blob.prototype, { - size: { enumerable: true }, - type: { enumerable: true }, -}) - -module.exports = Blob diff --git a/deps/npm/node_modules/tuf-js/node_modules/minipass-fetch/lib/body.js b/deps/npm/node_modules/tuf-js/node_modules/minipass-fetch/lib/body.js deleted file mode 100644 index 62286bd1de0d91..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/minipass-fetch/lib/body.js +++ /dev/null @@ -1,350 +0,0 @@ -'use strict' -const { Minipass } = require('minipass') -const MinipassSized = require('minipass-sized') - -const Blob = require('./blob.js') -const { BUFFER } = Blob -const FetchError = require('./fetch-error.js') - -// optional dependency on 'encoding' -let convert -try { - convert = require('encoding').convert -} catch (e) { - // defer error until textConverted is called -} - -const INTERNALS = Symbol('Body internals') -const CONSUME_BODY = Symbol('consumeBody') - -class Body { - constructor (bodyArg, options = {}) { - const { size = 0, timeout = 0 } = options - const body = bodyArg === undefined || bodyArg === null ? null - : isURLSearchParams(bodyArg) ? Buffer.from(bodyArg.toString()) - : isBlob(bodyArg) ? bodyArg - : Buffer.isBuffer(bodyArg) ? bodyArg - : Object.prototype.toString.call(bodyArg) === '[object ArrayBuffer]' - ? Buffer.from(bodyArg) - : ArrayBuffer.isView(bodyArg) - ? Buffer.from(bodyArg.buffer, bodyArg.byteOffset, bodyArg.byteLength) - : Minipass.isStream(bodyArg) ? bodyArg - : Buffer.from(String(bodyArg)) - - this[INTERNALS] = { - body, - disturbed: false, - error: null, - } - - this.size = size - this.timeout = timeout - - if (Minipass.isStream(body)) { - body.on('error', er => { - const error = er.name === 'AbortError' ? er - : new FetchError(`Invalid response while trying to fetch ${ - this.url}: ${er.message}`, 'system', er) - this[INTERNALS].error = error - }) - } - } - - get body () { - return this[INTERNALS].body - } - - get bodyUsed () { - return this[INTERNALS].disturbed - } - - arrayBuffer () { - return this[CONSUME_BODY]().then(buf => - buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength)) - } - - blob () { - const ct = this.headers && this.headers.get('content-type') || '' - return this[CONSUME_BODY]().then(buf => Object.assign( - new Blob([], { type: ct.toLowerCase() }), - { [BUFFER]: buf } - )) - } - - async json () { - const buf = await this[CONSUME_BODY]() - try { - return JSON.parse(buf.toString()) - } catch (er) { - throw new FetchError( - `invalid json response body at ${this.url} reason: ${er.message}`, - 'invalid-json' - ) - } - } - - text () { - return this[CONSUME_BODY]().then(buf => buf.toString()) - } - - buffer () { - return this[CONSUME_BODY]() - } - - textConverted () { - return this[CONSUME_BODY]().then(buf => convertBody(buf, this.headers)) - } - - [CONSUME_BODY] () { - if (this[INTERNALS].disturbed) { - return Promise.reject(new TypeError(`body used already for: ${ - this.url}`)) - } - - this[INTERNALS].disturbed = true - - if (this[INTERNALS].error) { - return Promise.reject(this[INTERNALS].error) - } - - // body is null - if (this.body === null) { - return Promise.resolve(Buffer.alloc(0)) - } - - if (Buffer.isBuffer(this.body)) { - return Promise.resolve(this.body) - } - - const upstream = isBlob(this.body) ? this.body.stream() : this.body - - /* istanbul ignore if: should never happen */ - if (!Minipass.isStream(upstream)) { - return Promise.resolve(Buffer.alloc(0)) - } - - const stream = this.size && upstream instanceof MinipassSized ? upstream - : !this.size && upstream instanceof Minipass && - !(upstream instanceof MinipassSized) ? upstream - : this.size ? new MinipassSized({ size: this.size }) - : new Minipass() - - // allow timeout on slow response body, but only if the stream is still writable. this - // makes the timeout center on the socket stream from lib/index.js rather than the - // intermediary minipass stream we create to receive the data - const resTimeout = this.timeout && stream.writable ? setTimeout(() => { - stream.emit('error', new FetchError( - `Response timeout while trying to fetch ${ - this.url} (over ${this.timeout}ms)`, 'body-timeout')) - }, this.timeout) : null - - // do not keep the process open just for this timeout, even - // though we expect it'll get cleared eventually. - if (resTimeout && resTimeout.unref) { - resTimeout.unref() - } - - // do the pipe in the promise, because the pipe() can send too much - // data through right away and upset the MP Sized object - return new Promise((resolve) => { - // if the stream is some other kind of stream, then pipe through a MP - // so we can collect it more easily. - if (stream !== upstream) { - upstream.on('error', er => stream.emit('error', er)) - upstream.pipe(stream) - } - resolve() - }).then(() => stream.concat()).then(buf => { - clearTimeout(resTimeout) - return buf - }).catch(er => { - clearTimeout(resTimeout) - // request was aborted, reject with this Error - if (er.name === 'AbortError' || er.name === 'FetchError') { - throw er - } else if (er.name === 'RangeError') { - throw new FetchError(`Could not create Buffer from response body for ${ - this.url}: ${er.message}`, 'system', er) - } else { - // other errors, such as incorrect content-encoding or content-length - throw new FetchError(`Invalid response body while trying to fetch ${ - this.url}: ${er.message}`, 'system', er) - } - }) - } - - static clone (instance) { - if (instance.bodyUsed) { - throw new Error('cannot clone body after it is used') - } - - const body = instance.body - - // check that body is a stream and not form-data object - // NB: can't clone the form-data object without having it as a dependency - if (Minipass.isStream(body) && typeof body.getBoundary !== 'function') { - // create a dedicated tee stream so that we don't lose data - // potentially sitting in the body stream's buffer by writing it - // immediately to p1 and not having it for p2. - const tee = new Minipass() - const p1 = new Minipass() - const p2 = new Minipass() - tee.on('error', er => { - p1.emit('error', er) - p2.emit('error', er) - }) - body.on('error', er => tee.emit('error', er)) - tee.pipe(p1) - tee.pipe(p2) - body.pipe(tee) - // set instance body to one fork, return the other - instance[INTERNALS].body = p1 - return p2 - } else { - return instance.body - } - } - - static extractContentType (body) { - return body === null || body === undefined ? null - : typeof body === 'string' ? 'text/plain;charset=UTF-8' - : isURLSearchParams(body) - ? 'application/x-www-form-urlencoded;charset=UTF-8' - : isBlob(body) ? body.type || null - : Buffer.isBuffer(body) ? null - : Object.prototype.toString.call(body) === '[object ArrayBuffer]' ? null - : ArrayBuffer.isView(body) ? null - : typeof body.getBoundary === 'function' - ? `multipart/form-data;boundary=${body.getBoundary()}` - : Minipass.isStream(body) ? null - : 'text/plain;charset=UTF-8' - } - - static getTotalBytes (instance) { - const { body } = instance - return (body === null || body === undefined) ? 0 - : isBlob(body) ? body.size - : Buffer.isBuffer(body) ? body.length - : body && typeof body.getLengthSync === 'function' && ( - // detect form data input from form-data module - body._lengthRetrievers && - /* istanbul ignore next */ body._lengthRetrievers.length === 0 || // 1.x - body.hasKnownLength && body.hasKnownLength()) // 2.x - ? body.getLengthSync() - : null - } - - static writeToStream (dest, instance) { - const { body } = instance - - if (body === null || body === undefined) { - dest.end() - } else if (Buffer.isBuffer(body) || typeof body === 'string') { - dest.end(body) - } else { - // body is stream or blob - const stream = isBlob(body) ? body.stream() : body - stream.on('error', er => dest.emit('error', er)).pipe(dest) - } - - return dest - } -} - -Object.defineProperties(Body.prototype, { - body: { enumerable: true }, - bodyUsed: { enumerable: true }, - arrayBuffer: { enumerable: true }, - blob: { enumerable: true }, - json: { enumerable: true }, - text: { enumerable: true }, -}) - -const isURLSearchParams = obj => - // Duck-typing as a necessary condition. - (typeof obj !== 'object' || - typeof obj.append !== 'function' || - typeof obj.delete !== 'function' || - typeof obj.get !== 'function' || - typeof obj.getAll !== 'function' || - typeof obj.has !== 'function' || - typeof obj.set !== 'function') ? false - // Brand-checking and more duck-typing as optional condition. - : obj.constructor.name === 'URLSearchParams' || - Object.prototype.toString.call(obj) === '[object URLSearchParams]' || - typeof obj.sort === 'function' - -const isBlob = obj => - typeof obj === 'object' && - typeof obj.arrayBuffer === 'function' && - typeof obj.type === 'string' && - typeof obj.stream === 'function' && - typeof obj.constructor === 'function' && - typeof obj.constructor.name === 'string' && - /^(Blob|File)$/.test(obj.constructor.name) && - /^(Blob|File)$/.test(obj[Symbol.toStringTag]) - -const convertBody = (buffer, headers) => { - /* istanbul ignore if */ - if (typeof convert !== 'function') { - throw new Error('The package `encoding` must be installed to use the textConverted() function') - } - - const ct = headers && headers.get('content-type') - let charset = 'utf-8' - let res - - // header - if (ct) { - res = /charset=([^;]*)/i.exec(ct) - } - - // no charset in content type, peek at response body for at most 1024 bytes - const str = buffer.slice(0, 1024).toString() - - // html5 - if (!res && str) { - res = / this.expect - ? 'max-size' : type - this.message = message - Error.captureStackTrace(this, this.constructor) - } - - get name () { - return 'FetchError' - } - - // don't allow name to be overwritten - set name (n) {} - - get [Symbol.toStringTag] () { - return 'FetchError' - } -} -module.exports = FetchError diff --git a/deps/npm/node_modules/tuf-js/node_modules/minipass-fetch/lib/headers.js b/deps/npm/node_modules/tuf-js/node_modules/minipass-fetch/lib/headers.js deleted file mode 100644 index dd6e854d5ba399..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/minipass-fetch/lib/headers.js +++ /dev/null @@ -1,267 +0,0 @@ -'use strict' -const invalidTokenRegex = /[^^_`a-zA-Z\-0-9!#$%&'*+.|~]/ -const invalidHeaderCharRegex = /[^\t\x20-\x7e\x80-\xff]/ - -const validateName = name => { - name = `${name}` - if (invalidTokenRegex.test(name) || name === '') { - throw new TypeError(`${name} is not a legal HTTP header name`) - } -} - -const validateValue = value => { - value = `${value}` - if (invalidHeaderCharRegex.test(value)) { - throw new TypeError(`${value} is not a legal HTTP header value`) - } -} - -const find = (map, name) => { - name = name.toLowerCase() - for (const key in map) { - if (key.toLowerCase() === name) { - return key - } - } - return undefined -} - -const MAP = Symbol('map') -class Headers { - constructor (init = undefined) { - this[MAP] = Object.create(null) - if (init instanceof Headers) { - const rawHeaders = init.raw() - const headerNames = Object.keys(rawHeaders) - for (const headerName of headerNames) { - for (const value of rawHeaders[headerName]) { - this.append(headerName, value) - } - } - return - } - - // no-op - if (init === undefined || init === null) { - return - } - - if (typeof init === 'object') { - const method = init[Symbol.iterator] - if (method !== null && method !== undefined) { - if (typeof method !== 'function') { - throw new TypeError('Header pairs must be iterable') - } - - // sequence> - // Note: per spec we have to first exhaust the lists then process them - const pairs = [] - for (const pair of init) { - if (typeof pair !== 'object' || - typeof pair[Symbol.iterator] !== 'function') { - throw new TypeError('Each header pair must be iterable') - } - const arrPair = Array.from(pair) - if (arrPair.length !== 2) { - throw new TypeError('Each header pair must be a name/value tuple') - } - pairs.push(arrPair) - } - - for (const pair of pairs) { - this.append(pair[0], pair[1]) - } - } else { - // record - for (const key of Object.keys(init)) { - this.append(key, init[key]) - } - } - } else { - throw new TypeError('Provided initializer must be an object') - } - } - - get (name) { - name = `${name}` - validateName(name) - const key = find(this[MAP], name) - if (key === undefined) { - return null - } - - return this[MAP][key].join(', ') - } - - forEach (callback, thisArg = undefined) { - let pairs = getHeaders(this) - for (let i = 0; i < pairs.length; i++) { - const [name, value] = pairs[i] - callback.call(thisArg, value, name, this) - // refresh in case the callback added more headers - pairs = getHeaders(this) - } - } - - set (name, value) { - name = `${name}` - value = `${value}` - validateName(name) - validateValue(value) - const key = find(this[MAP], name) - this[MAP][key !== undefined ? key : name] = [value] - } - - append (name, value) { - name = `${name}` - value = `${value}` - validateName(name) - validateValue(value) - const key = find(this[MAP], name) - if (key !== undefined) { - this[MAP][key].push(value) - } else { - this[MAP][name] = [value] - } - } - - has (name) { - name = `${name}` - validateName(name) - return find(this[MAP], name) !== undefined - } - - delete (name) { - name = `${name}` - validateName(name) - const key = find(this[MAP], name) - if (key !== undefined) { - delete this[MAP][key] - } - } - - raw () { - return this[MAP] - } - - keys () { - return new HeadersIterator(this, 'key') - } - - values () { - return new HeadersIterator(this, 'value') - } - - [Symbol.iterator] () { - return new HeadersIterator(this, 'key+value') - } - - entries () { - return new HeadersIterator(this, 'key+value') - } - - get [Symbol.toStringTag] () { - return 'Headers' - } - - static exportNodeCompatibleHeaders (headers) { - const obj = Object.assign(Object.create(null), headers[MAP]) - - // http.request() only supports string as Host header. This hack makes - // specifying custom Host header possible. - const hostHeaderKey = find(headers[MAP], 'Host') - if (hostHeaderKey !== undefined) { - obj[hostHeaderKey] = obj[hostHeaderKey][0] - } - - return obj - } - - static createHeadersLenient (obj) { - const headers = new Headers() - for (const name of Object.keys(obj)) { - if (invalidTokenRegex.test(name)) { - continue - } - - if (Array.isArray(obj[name])) { - for (const val of obj[name]) { - if (invalidHeaderCharRegex.test(val)) { - continue - } - - if (headers[MAP][name] === undefined) { - headers[MAP][name] = [val] - } else { - headers[MAP][name].push(val) - } - } - } else if (!invalidHeaderCharRegex.test(obj[name])) { - headers[MAP][name] = [obj[name]] - } - } - return headers - } -} - -Object.defineProperties(Headers.prototype, { - get: { enumerable: true }, - forEach: { enumerable: true }, - set: { enumerable: true }, - append: { enumerable: true }, - has: { enumerable: true }, - delete: { enumerable: true }, - keys: { enumerable: true }, - values: { enumerable: true }, - entries: { enumerable: true }, -}) - -const getHeaders = (headers, kind = 'key+value') => - Object.keys(headers[MAP]).sort().map( - kind === 'key' ? k => k.toLowerCase() - : kind === 'value' ? k => headers[MAP][k].join(', ') - : k => [k.toLowerCase(), headers[MAP][k].join(', ')] - ) - -const INTERNAL = Symbol('internal') - -class HeadersIterator { - constructor (target, kind) { - this[INTERNAL] = { - target, - kind, - index: 0, - } - } - - get [Symbol.toStringTag] () { - return 'HeadersIterator' - } - - next () { - /* istanbul ignore if: should be impossible */ - if (!this || Object.getPrototypeOf(this) !== HeadersIterator.prototype) { - throw new TypeError('Value of `this` is not a HeadersIterator') - } - - const { target, kind, index } = this[INTERNAL] - const values = getHeaders(target, kind) - const len = values.length - if (index >= len) { - return { - value: undefined, - done: true, - } - } - - this[INTERNAL].index++ - - return { value: values[index], done: false } - } -} - -// manually extend because 'extends' requires a ctor -Object.setPrototypeOf(HeadersIterator.prototype, - Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]()))) - -module.exports = Headers diff --git a/deps/npm/node_modules/tuf-js/node_modules/minipass-fetch/lib/index.js b/deps/npm/node_modules/tuf-js/node_modules/minipass-fetch/lib/index.js deleted file mode 100644 index da402161670e65..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/minipass-fetch/lib/index.js +++ /dev/null @@ -1,377 +0,0 @@ -'use strict' -const { URL } = require('url') -const http = require('http') -const https = require('https') -const zlib = require('minizlib') -const { Minipass } = require('minipass') - -const Body = require('./body.js') -const { writeToStream, getTotalBytes } = Body -const Response = require('./response.js') -const Headers = require('./headers.js') -const { createHeadersLenient } = Headers -const Request = require('./request.js') -const { getNodeRequestOptions } = Request -const FetchError = require('./fetch-error.js') -const AbortError = require('./abort-error.js') - -// XXX this should really be split up and unit-ized for easier testing -// and better DRY implementation of data/http request aborting -const fetch = async (url, opts) => { - if (/^data:/.test(url)) { - const request = new Request(url, opts) - // delay 1 promise tick so that the consumer can abort right away - return Promise.resolve().then(() => new Promise((resolve, reject) => { - let type, data - try { - const { pathname, search } = new URL(url) - const split = pathname.split(',') - if (split.length < 2) { - throw new Error('invalid data: URI') - } - const mime = split.shift() - const base64 = /;base64$/.test(mime) - type = base64 ? mime.slice(0, -1 * ';base64'.length) : mime - const rawData = decodeURIComponent(split.join(',') + search) - data = base64 ? Buffer.from(rawData, 'base64') : Buffer.from(rawData) - } catch (er) { - return reject(new FetchError(`[${request.method}] ${ - request.url} invalid URL, ${er.message}`, 'system', er)) - } - - const { signal } = request - if (signal && signal.aborted) { - return reject(new AbortError('The user aborted a request.')) - } - - const headers = { 'Content-Length': data.length } - if (type) { - headers['Content-Type'] = type - } - return resolve(new Response(data, { headers })) - })) - } - - return new Promise((resolve, reject) => { - // build request object - const request = new Request(url, opts) - let options - try { - options = getNodeRequestOptions(request) - } catch (er) { - return reject(er) - } - - const send = (options.protocol === 'https:' ? https : http).request - const { signal } = request - let response = null - const abort = () => { - const error = new AbortError('The user aborted a request.') - reject(error) - if (Minipass.isStream(request.body) && - typeof request.body.destroy === 'function') { - request.body.destroy(error) - } - if (response && response.body) { - response.body.emit('error', error) - } - } - - if (signal && signal.aborted) { - return abort() - } - - const abortAndFinalize = () => { - abort() - finalize() - } - - const finalize = () => { - req.abort() - if (signal) { - signal.removeEventListener('abort', abortAndFinalize) - } - clearTimeout(reqTimeout) - } - - // send request - const req = send(options) - - if (signal) { - signal.addEventListener('abort', abortAndFinalize) - } - - let reqTimeout = null - if (request.timeout) { - req.once('socket', () => { - reqTimeout = setTimeout(() => { - reject(new FetchError(`network timeout at: ${ - request.url}`, 'request-timeout')) - finalize() - }, request.timeout) - }) - } - - req.on('error', er => { - // if a 'response' event is emitted before the 'error' event, then by the - // time this handler is run it's too late to reject the Promise for the - // response. instead, we forward the error event to the response stream - // so that the error will surface to the user when they try to consume - // the body. this is done as a side effect of aborting the request except - // for in windows, where we must forward the event manually, otherwise - // there is no longer a ref'd socket attached to the request and the - // stream never ends so the event loop runs out of work and the process - // exits without warning. - // coverage skipped here due to the difficulty in testing - // istanbul ignore next - if (req.res) { - req.res.emit('error', er) - } - reject(new FetchError(`request to ${request.url} failed, reason: ${ - er.message}`, 'system', er)) - finalize() - }) - - req.on('response', res => { - clearTimeout(reqTimeout) - - const headers = createHeadersLenient(res.headers) - - // HTTP fetch step 5 - if (fetch.isRedirect(res.statusCode)) { - // HTTP fetch step 5.2 - const location = headers.get('Location') - - // HTTP fetch step 5.3 - let locationURL = null - try { - locationURL = location === null ? null : new URL(location, request.url).toString() - } catch { - // error here can only be invalid URL in Location: header - // do not throw when options.redirect == manual - // let the user extract the errorneous redirect URL - if (request.redirect !== 'manual') { - /* eslint-disable-next-line max-len */ - reject(new FetchError(`uri requested responds with an invalid redirect URL: ${location}`, 'invalid-redirect')) - finalize() - return - } - } - - // HTTP fetch step 5.5 - if (request.redirect === 'error') { - reject(new FetchError('uri requested responds with a redirect, ' + - `redirect mode is set to error: ${request.url}`, 'no-redirect')) - finalize() - return - } else if (request.redirect === 'manual') { - // node-fetch-specific step: make manual redirect a bit easier to - // use by setting the Location header value to the resolved URL. - if (locationURL !== null) { - // handle corrupted header - try { - headers.set('Location', locationURL) - } catch (err) { - /* istanbul ignore next: nodejs server prevent invalid - response headers, we can't test this through normal - request */ - reject(err) - } - } - } else if (request.redirect === 'follow' && locationURL !== null) { - // HTTP-redirect fetch step 5 - if (request.counter >= request.follow) { - reject(new FetchError(`maximum redirect reached at: ${ - request.url}`, 'max-redirect')) - finalize() - return - } - - // HTTP-redirect fetch step 9 - if (res.statusCode !== 303 && - request.body && - getTotalBytes(request) === null) { - reject(new FetchError( - 'Cannot follow redirect with body being a readable stream', - 'unsupported-redirect' - )) - finalize() - return - } - - // Update host due to redirection - request.headers.set('host', (new URL(locationURL)).host) - - // HTTP-redirect fetch step 6 (counter increment) - // Create a new Request object. - const requestOpts = { - headers: new Headers(request.headers), - follow: request.follow, - counter: request.counter + 1, - agent: request.agent, - compress: request.compress, - method: request.method, - body: request.body, - signal: request.signal, - timeout: request.timeout, - } - - // if the redirect is to a new hostname, strip the authorization and cookie headers - const parsedOriginal = new URL(request.url) - const parsedRedirect = new URL(locationURL) - if (parsedOriginal.hostname !== parsedRedirect.hostname) { - requestOpts.headers.delete('authorization') - requestOpts.headers.delete('cookie') - } - - // HTTP-redirect fetch step 11 - if (res.statusCode === 303 || ( - (res.statusCode === 301 || res.statusCode === 302) && - request.method === 'POST' - )) { - requestOpts.method = 'GET' - requestOpts.body = undefined - requestOpts.headers.delete('content-length') - } - - // HTTP-redirect fetch step 15 - resolve(fetch(new Request(locationURL, requestOpts))) - finalize() - return - } - } // end if(isRedirect) - - // prepare response - res.once('end', () => - signal && signal.removeEventListener('abort', abortAndFinalize)) - - const body = new Minipass() - // if an error occurs, either on the response stream itself, on one of the - // decoder streams, or a response length timeout from the Body class, we - // forward the error through to our internal body stream. If we see an - // error event on that, we call finalize to abort the request and ensure - // we don't leave a socket believing a request is in flight. - // this is difficult to test, so lacks specific coverage. - body.on('error', finalize) - // exceedingly rare that the stream would have an error, - // but just in case we proxy it to the stream in use. - res.on('error', /* istanbul ignore next */ er => body.emit('error', er)) - res.on('data', (chunk) => body.write(chunk)) - res.on('end', () => body.end()) - - const responseOptions = { - url: request.url, - status: res.statusCode, - statusText: res.statusMessage, - headers: headers, - size: request.size, - timeout: request.timeout, - counter: request.counter, - trailer: new Promise(resolveTrailer => - res.on('end', () => resolveTrailer(createHeadersLenient(res.trailers)))), - } - - // HTTP-network fetch step 12.1.1.3 - const codings = headers.get('Content-Encoding') - - // HTTP-network fetch step 12.1.1.4: handle content codings - - // in following scenarios we ignore compression support - // 1. compression support is disabled - // 2. HEAD request - // 3. no Content-Encoding header - // 4. no content response (204) - // 5. content not modified response (304) - if (!request.compress || - request.method === 'HEAD' || - codings === null || - res.statusCode === 204 || - res.statusCode === 304) { - response = new Response(body, responseOptions) - resolve(response) - return - } - - // Be less strict when decoding compressed responses, since sometimes - // servers send slightly invalid responses that are still accepted - // by common browsers. - // Always using Z_SYNC_FLUSH is what cURL does. - const zlibOptions = { - flush: zlib.constants.Z_SYNC_FLUSH, - finishFlush: zlib.constants.Z_SYNC_FLUSH, - } - - // for gzip - if (codings === 'gzip' || codings === 'x-gzip') { - const unzip = new zlib.Gunzip(zlibOptions) - response = new Response( - // exceedingly rare that the stream would have an error, - // but just in case we proxy it to the stream in use. - body.on('error', /* istanbul ignore next */ er => unzip.emit('error', er)).pipe(unzip), - responseOptions - ) - resolve(response) - return - } - - // for deflate - if (codings === 'deflate' || codings === 'x-deflate') { - // handle the infamous raw deflate response from old servers - // a hack for old IIS and Apache servers - const raw = res.pipe(new Minipass()) - raw.once('data', chunk => { - // see http://stackoverflow.com/questions/37519828 - const decoder = (chunk[0] & 0x0F) === 0x08 - ? new zlib.Inflate() - : new zlib.InflateRaw() - // exceedingly rare that the stream would have an error, - // but just in case we proxy it to the stream in use. - body.on('error', /* istanbul ignore next */ er => decoder.emit('error', er)).pipe(decoder) - response = new Response(decoder, responseOptions) - resolve(response) - }) - return - } - - // for br - if (codings === 'br') { - // ignoring coverage so tests don't have to fake support (or lack of) for brotli - // istanbul ignore next - try { - var decoder = new zlib.BrotliDecompress() - } catch (err) { - reject(err) - finalize() - return - } - // exceedingly rare that the stream would have an error, - // but just in case we proxy it to the stream in use. - body.on('error', /* istanbul ignore next */ er => decoder.emit('error', er)).pipe(decoder) - response = new Response(decoder, responseOptions) - resolve(response) - return - } - - // otherwise, use response as-is - response = new Response(body, responseOptions) - resolve(response) - }) - - writeToStream(req, request) - }) -} - -module.exports = fetch - -fetch.isRedirect = code => - code === 301 || - code === 302 || - code === 303 || - code === 307 || - code === 308 - -fetch.Headers = Headers -fetch.Request = Request -fetch.Response = Response -fetch.FetchError = FetchError -fetch.AbortError = AbortError diff --git a/deps/npm/node_modules/tuf-js/node_modules/minipass-fetch/lib/request.js b/deps/npm/node_modules/tuf-js/node_modules/minipass-fetch/lib/request.js deleted file mode 100644 index 054439e6699107..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/minipass-fetch/lib/request.js +++ /dev/null @@ -1,282 +0,0 @@ -'use strict' -const { URL } = require('url') -const { Minipass } = require('minipass') -const Headers = require('./headers.js') -const { exportNodeCompatibleHeaders } = Headers -const Body = require('./body.js') -const { clone, extractContentType, getTotalBytes } = Body - -const version = require('../package.json').version -const defaultUserAgent = - `minipass-fetch/${version} (+https://github.com/isaacs/minipass-fetch)` - -const INTERNALS = Symbol('Request internals') - -const isRequest = input => - typeof input === 'object' && typeof input[INTERNALS] === 'object' - -const isAbortSignal = signal => { - const proto = ( - signal - && typeof signal === 'object' - && Object.getPrototypeOf(signal) - ) - return !!(proto && proto.constructor.name === 'AbortSignal') -} - -class Request extends Body { - constructor (input, init = {}) { - const parsedURL = isRequest(input) ? new URL(input.url) - : input && input.href ? new URL(input.href) - : new URL(`${input}`) - - if (isRequest(input)) { - init = { ...input[INTERNALS], ...init } - } else if (!input || typeof input === 'string') { - input = {} - } - - const method = (init.method || input.method || 'GET').toUpperCase() - const isGETHEAD = method === 'GET' || method === 'HEAD' - - if ((init.body !== null && init.body !== undefined || - isRequest(input) && input.body !== null) && isGETHEAD) { - throw new TypeError('Request with GET/HEAD method cannot have body') - } - - const inputBody = init.body !== null && init.body !== undefined ? init.body - : isRequest(input) && input.body !== null ? clone(input) - : null - - super(inputBody, { - timeout: init.timeout || input.timeout || 0, - size: init.size || input.size || 0, - }) - - const headers = new Headers(init.headers || input.headers || {}) - - if (inputBody !== null && inputBody !== undefined && - !headers.has('Content-Type')) { - const contentType = extractContentType(inputBody) - if (contentType) { - headers.append('Content-Type', contentType) - } - } - - const signal = 'signal' in init ? init.signal - : null - - if (signal !== null && signal !== undefined && !isAbortSignal(signal)) { - throw new TypeError('Expected signal must be an instanceof AbortSignal') - } - - // TLS specific options that are handled by node - const { - ca, - cert, - ciphers, - clientCertEngine, - crl, - dhparam, - ecdhCurve, - family, - honorCipherOrder, - key, - passphrase, - pfx, - rejectUnauthorized = process.env.NODE_TLS_REJECT_UNAUTHORIZED !== '0', - secureOptions, - secureProtocol, - servername, - sessionIdContext, - } = init - - this[INTERNALS] = { - method, - redirect: init.redirect || input.redirect || 'follow', - headers, - parsedURL, - signal, - ca, - cert, - ciphers, - clientCertEngine, - crl, - dhparam, - ecdhCurve, - family, - honorCipherOrder, - key, - passphrase, - pfx, - rejectUnauthorized, - secureOptions, - secureProtocol, - servername, - sessionIdContext, - } - - // node-fetch-only options - this.follow = init.follow !== undefined ? init.follow - : input.follow !== undefined ? input.follow - : 20 - this.compress = init.compress !== undefined ? init.compress - : input.compress !== undefined ? input.compress - : true - this.counter = init.counter || input.counter || 0 - this.agent = init.agent || input.agent - } - - get method () { - return this[INTERNALS].method - } - - get url () { - return this[INTERNALS].parsedURL.toString() - } - - get headers () { - return this[INTERNALS].headers - } - - get redirect () { - return this[INTERNALS].redirect - } - - get signal () { - return this[INTERNALS].signal - } - - clone () { - return new Request(this) - } - - get [Symbol.toStringTag] () { - return 'Request' - } - - static getNodeRequestOptions (request) { - const parsedURL = request[INTERNALS].parsedURL - const headers = new Headers(request[INTERNALS].headers) - - // fetch step 1.3 - if (!headers.has('Accept')) { - headers.set('Accept', '*/*') - } - - // Basic fetch - if (!/^https?:$/.test(parsedURL.protocol)) { - throw new TypeError('Only HTTP(S) protocols are supported') - } - - if (request.signal && - Minipass.isStream(request.body) && - typeof request.body.destroy !== 'function') { - throw new Error( - 'Cancellation of streamed requests with AbortSignal is not supported') - } - - // HTTP-network-or-cache fetch steps 2.4-2.7 - const contentLengthValue = - (request.body === null || request.body === undefined) && - /^(POST|PUT)$/i.test(request.method) ? '0' - : request.body !== null && request.body !== undefined - ? getTotalBytes(request) - : null - - if (contentLengthValue) { - headers.set('Content-Length', contentLengthValue + '') - } - - // HTTP-network-or-cache fetch step 2.11 - if (!headers.has('User-Agent')) { - headers.set('User-Agent', defaultUserAgent) - } - - // HTTP-network-or-cache fetch step 2.15 - if (request.compress && !headers.has('Accept-Encoding')) { - headers.set('Accept-Encoding', 'gzip,deflate') - } - - const agent = typeof request.agent === 'function' - ? request.agent(parsedURL) - : request.agent - - if (!headers.has('Connection') && !agent) { - headers.set('Connection', 'close') - } - - // TLS specific options that are handled by node - const { - ca, - cert, - ciphers, - clientCertEngine, - crl, - dhparam, - ecdhCurve, - family, - honorCipherOrder, - key, - passphrase, - pfx, - rejectUnauthorized, - secureOptions, - secureProtocol, - servername, - sessionIdContext, - } = request[INTERNALS] - - // HTTP-network fetch step 4.2 - // chunked encoding is handled by Node.js - - // we cannot spread parsedURL directly, so we have to read each property one-by-one - // and map them to the equivalent https?.request() method options - const urlProps = { - auth: parsedURL.username || parsedURL.password - ? `${parsedURL.username}:${parsedURL.password}` - : '', - host: parsedURL.host, - hostname: parsedURL.hostname, - path: `${parsedURL.pathname}${parsedURL.search}`, - port: parsedURL.port, - protocol: parsedURL.protocol, - } - - return { - ...urlProps, - method: request.method, - headers: exportNodeCompatibleHeaders(headers), - agent, - ca, - cert, - ciphers, - clientCertEngine, - crl, - dhparam, - ecdhCurve, - family, - honorCipherOrder, - key, - passphrase, - pfx, - rejectUnauthorized, - secureOptions, - secureProtocol, - servername, - sessionIdContext, - timeout: request.timeout, - } - } -} - -module.exports = Request - -Object.defineProperties(Request.prototype, { - method: { enumerable: true }, - url: { enumerable: true }, - headers: { enumerable: true }, - redirect: { enumerable: true }, - clone: { enumerable: true }, - signal: { enumerable: true }, -}) diff --git a/deps/npm/node_modules/tuf-js/node_modules/minipass-fetch/lib/response.js b/deps/npm/node_modules/tuf-js/node_modules/minipass-fetch/lib/response.js deleted file mode 100644 index 54cb52db3594a7..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/minipass-fetch/lib/response.js +++ /dev/null @@ -1,90 +0,0 @@ -'use strict' -const http = require('http') -const { STATUS_CODES } = http - -const Headers = require('./headers.js') -const Body = require('./body.js') -const { clone, extractContentType } = Body - -const INTERNALS = Symbol('Response internals') - -class Response extends Body { - constructor (body = null, opts = {}) { - super(body, opts) - - const status = opts.status || 200 - const headers = new Headers(opts.headers) - - if (body !== null && body !== undefined && !headers.has('Content-Type')) { - const contentType = extractContentType(body) - if (contentType) { - headers.append('Content-Type', contentType) - } - } - - this[INTERNALS] = { - url: opts.url, - status, - statusText: opts.statusText || STATUS_CODES[status], - headers, - counter: opts.counter, - trailer: Promise.resolve(opts.trailer || new Headers()), - } - } - - get trailer () { - return this[INTERNALS].trailer - } - - get url () { - return this[INTERNALS].url || '' - } - - get status () { - return this[INTERNALS].status - } - - get ok () { - return this[INTERNALS].status >= 200 && this[INTERNALS].status < 300 - } - - get redirected () { - return this[INTERNALS].counter > 0 - } - - get statusText () { - return this[INTERNALS].statusText - } - - get headers () { - return this[INTERNALS].headers - } - - clone () { - return new Response(clone(this), { - url: this.url, - status: this.status, - statusText: this.statusText, - headers: this.headers, - ok: this.ok, - redirected: this.redirected, - trailer: this.trailer, - }) - } - - get [Symbol.toStringTag] () { - return 'Response' - } -} - -module.exports = Response - -Object.defineProperties(Response.prototype, { - url: { enumerable: true }, - status: { enumerable: true }, - ok: { enumerable: true }, - redirected: { enumerable: true }, - statusText: { enumerable: true }, - headers: { enumerable: true }, - clone: { enumerable: true }, -}) diff --git a/deps/npm/node_modules/tuf-js/node_modules/minipass-fetch/package.json b/deps/npm/node_modules/tuf-js/node_modules/minipass-fetch/package.json deleted file mode 100644 index d491a7fba126d0..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/minipass-fetch/package.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "name": "minipass-fetch", - "version": "3.0.5", - "description": "An implementation of window.fetch in Node.js using Minipass streams", - "license": "MIT", - "main": "lib/index.js", - "scripts": { - "test:tls-fixtures": "./test/fixtures/tls/setup.sh", - "test": "tap", - "snap": "tap", - "lint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"", - "postlint": "template-oss-check", - "lintfix": "npm run lint -- --fix", - "posttest": "npm run lint", - "template-oss-apply": "template-oss-apply --force" - }, - "tap": { - "coverage-map": "map.js", - "check-coverage": true, - "nyc-arg": [ - "--exclude", - "tap-snapshots/**" - ] - }, - "devDependencies": { - "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.22.0", - "@ungap/url-search-params": "^0.2.2", - "abort-controller": "^3.0.0", - "abortcontroller-polyfill": "~1.7.3", - "encoding": "^0.1.13", - "form-data": "^4.0.0", - "nock": "^13.2.4", - "parted": "^0.1.1", - "string-to-arraybuffer": "^1.0.2", - "tap": "^16.0.0" - }, - "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/npm/minipass-fetch.git" - }, - "keywords": [ - "fetch", - "minipass", - "node-fetch", - "window.fetch" - ], - "files": [ - "bin/", - "lib/" - ], - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "author": "GitHub Inc.", - "templateOSS": { - "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.22.0", - "publish": "true" - } -} diff --git a/deps/npm/node_modules/tuf-js/node_modules/proc-log/LICENSE b/deps/npm/node_modules/tuf-js/node_modules/proc-log/LICENSE deleted file mode 100644 index 83837797202b70..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/proc-log/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) GitHub, Inc. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/deps/npm/node_modules/tuf-js/node_modules/proc-log/lib/index.js b/deps/npm/node_modules/tuf-js/node_modules/proc-log/lib/index.js deleted file mode 100644 index 86d90861078dab..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/proc-log/lib/index.js +++ /dev/null @@ -1,153 +0,0 @@ -const META = Symbol('proc-log.meta') -module.exports = { - META: META, - output: { - LEVELS: [ - 'standard', - 'error', - 'buffer', - 'flush', - ], - KEYS: { - standard: 'standard', - error: 'error', - buffer: 'buffer', - flush: 'flush', - }, - standard: function (...args) { - return process.emit('output', 'standard', ...args) - }, - error: function (...args) { - return process.emit('output', 'error', ...args) - }, - buffer: function (...args) { - return process.emit('output', 'buffer', ...args) - }, - flush: function (...args) { - return process.emit('output', 'flush', ...args) - }, - }, - log: { - LEVELS: [ - 'notice', - 'error', - 'warn', - 'info', - 'verbose', - 'http', - 'silly', - 'timing', - 'pause', - 'resume', - ], - KEYS: { - notice: 'notice', - error: 'error', - warn: 'warn', - info: 'info', - verbose: 'verbose', - http: 'http', - silly: 'silly', - timing: 'timing', - pause: 'pause', - resume: 'resume', - }, - error: function (...args) { - return process.emit('log', 'error', ...args) - }, - notice: function (...args) { - return process.emit('log', 'notice', ...args) - }, - warn: function (...args) { - return process.emit('log', 'warn', ...args) - }, - info: function (...args) { - return process.emit('log', 'info', ...args) - }, - verbose: function (...args) { - return process.emit('log', 'verbose', ...args) - }, - http: function (...args) { - return process.emit('log', 'http', ...args) - }, - silly: function (...args) { - return process.emit('log', 'silly', ...args) - }, - timing: function (...args) { - return process.emit('log', 'timing', ...args) - }, - pause: function () { - return process.emit('log', 'pause') - }, - resume: function () { - return process.emit('log', 'resume') - }, - }, - time: { - LEVELS: [ - 'start', - 'end', - ], - KEYS: { - start: 'start', - end: 'end', - }, - start: function (name, fn) { - process.emit('time', 'start', name) - function end () { - return process.emit('time', 'end', name) - } - if (typeof fn === 'function') { - const res = fn() - if (res && res.finally) { - return res.finally(end) - } - end() - return res - } - return end - }, - end: function (name) { - return process.emit('time', 'end', name) - }, - }, - input: { - LEVELS: [ - 'start', - 'end', - 'read', - ], - KEYS: { - start: 'start', - end: 'end', - read: 'read', - }, - start: function (fn) { - process.emit('input', 'start') - function end () { - return process.emit('input', 'end') - } - if (typeof fn === 'function') { - const res = fn() - if (res && res.finally) { - return res.finally(end) - } - end() - return res - } - return end - }, - end: function () { - return process.emit('input', 'end') - }, - read: function (...args) { - let resolve, reject - const promise = new Promise((_resolve, _reject) => { - resolve = _resolve - reject = _reject - }) - process.emit('input', 'read', resolve, reject, ...args) - return promise - }, - }, -} diff --git a/deps/npm/node_modules/tuf-js/node_modules/proc-log/package.json b/deps/npm/node_modules/tuf-js/node_modules/proc-log/package.json deleted file mode 100644 index 4ab89102ecc9b5..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/proc-log/package.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "name": "proc-log", - "version": "4.2.0", - "files": [ - "bin/", - "lib/" - ], - "main": "lib/index.js", - "description": "just emit 'log' events on the process object", - "repository": { - "type": "git", - "url": "https://github.com/npm/proc-log.git" - }, - "author": "GitHub Inc.", - "license": "ISC", - "scripts": { - "test": "tap", - "snap": "tap", - "posttest": "npm run lint", - "postsnap": "eslint index.js test/*.js --fix", - "lint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"", - "postlint": "template-oss-check", - "lintfix": "npm run lint -- --fix", - "template-oss-apply": "template-oss-apply --force" - }, - "devDependencies": { - "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.21.3", - "tap": "^16.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "templateOSS": { - "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.21.3", - "publish": true - }, - "tap": { - "nyc-arg": [ - "--exclude", - "tap-snapshots/**" - ] - } -} diff --git a/deps/npm/node_modules/tuf-js/node_modules/ssri/LICENSE.md b/deps/npm/node_modules/tuf-js/node_modules/ssri/LICENSE.md deleted file mode 100644 index e335388869f50f..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/ssri/LICENSE.md +++ /dev/null @@ -1,16 +0,0 @@ -ISC License - -Copyright 2021 (c) npm, Inc. - -Permission to use, copy, modify, and/or distribute this software for -any purpose with or without fee is hereby granted, provided that the -above copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE COPYRIGHT HOLDER DISCLAIMS -ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR -CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE -OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE -USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/deps/npm/node_modules/tuf-js/node_modules/ssri/lib/index.js b/deps/npm/node_modules/tuf-js/node_modules/ssri/lib/index.js deleted file mode 100644 index 7d749ed480fb98..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/ssri/lib/index.js +++ /dev/null @@ -1,580 +0,0 @@ -'use strict' - -const crypto = require('crypto') -const { Minipass } = require('minipass') - -const SPEC_ALGORITHMS = ['sha512', 'sha384', 'sha256'] -const DEFAULT_ALGORITHMS = ['sha512'] - -// TODO: this should really be a hardcoded list of algorithms we support, -// rather than [a-z0-9]. -const BASE64_REGEX = /^[a-z0-9+/]+(?:=?=?)$/i -const SRI_REGEX = /^([a-z0-9]+)-([^?]+)([?\S*]*)$/ -const STRICT_SRI_REGEX = /^([a-z0-9]+)-([A-Za-z0-9+/=]{44,88})(\?[\x21-\x7E]*)?$/ -const VCHAR_REGEX = /^[\x21-\x7E]+$/ - -const getOptString = options => options?.length ? `?${options.join('?')}` : '' - -class IntegrityStream extends Minipass { - #emittedIntegrity - #emittedSize - #emittedVerified - - constructor (opts) { - super() - this.size = 0 - this.opts = opts - - // may be overridden later, but set now for class consistency - this.#getOptions() - - // options used for calculating stream. can't be changed. - if (opts?.algorithms) { - this.algorithms = [...opts.algorithms] - } else { - this.algorithms = [...DEFAULT_ALGORITHMS] - } - if (this.algorithm !== null && !this.algorithms.includes(this.algorithm)) { - this.algorithms.push(this.algorithm) - } - - this.hashes = this.algorithms.map(crypto.createHash) - } - - #getOptions () { - // For verification - this.sri = this.opts?.integrity ? parse(this.opts?.integrity, this.opts) : null - this.expectedSize = this.opts?.size - - if (!this.sri) { - this.algorithm = null - } else if (this.sri.isHash) { - this.goodSri = true - this.algorithm = this.sri.algorithm - } else { - this.goodSri = !this.sri.isEmpty() - this.algorithm = this.sri.pickAlgorithm(this.opts) - } - - this.digests = this.goodSri ? this.sri[this.algorithm] : null - this.optString = getOptString(this.opts?.options) - } - - on (ev, handler) { - if (ev === 'size' && this.#emittedSize) { - return handler(this.#emittedSize) - } - - if (ev === 'integrity' && this.#emittedIntegrity) { - return handler(this.#emittedIntegrity) - } - - if (ev === 'verified' && this.#emittedVerified) { - return handler(this.#emittedVerified) - } - - return super.on(ev, handler) - } - - emit (ev, data) { - if (ev === 'end') { - this.#onEnd() - } - return super.emit(ev, data) - } - - write (data) { - this.size += data.length - this.hashes.forEach(h => h.update(data)) - return super.write(data) - } - - #onEnd () { - if (!this.goodSri) { - this.#getOptions() - } - const newSri = parse(this.hashes.map((h, i) => { - return `${this.algorithms[i]}-${h.digest('base64')}${this.optString}` - }).join(' '), this.opts) - // Integrity verification mode - const match = this.goodSri && newSri.match(this.sri, this.opts) - if (typeof this.expectedSize === 'number' && this.size !== this.expectedSize) { - /* eslint-disable-next-line max-len */ - const err = new Error(`stream size mismatch when checking ${this.sri}.\n Wanted: ${this.expectedSize}\n Found: ${this.size}`) - err.code = 'EBADSIZE' - err.found = this.size - err.expected = this.expectedSize - err.sri = this.sri - this.emit('error', err) - } else if (this.sri && !match) { - /* eslint-disable-next-line max-len */ - const err = new Error(`${this.sri} integrity checksum failed when using ${this.algorithm}: wanted ${this.digests} but got ${newSri}. (${this.size} bytes)`) - err.code = 'EINTEGRITY' - err.found = newSri - err.expected = this.digests - err.algorithm = this.algorithm - err.sri = this.sri - this.emit('error', err) - } else { - this.#emittedSize = this.size - this.emit('size', this.size) - this.#emittedIntegrity = newSri - this.emit('integrity', newSri) - if (match) { - this.#emittedVerified = match - this.emit('verified', match) - } - } - } -} - -class Hash { - get isHash () { - return true - } - - constructor (hash, opts) { - const strict = opts?.strict - this.source = hash.trim() - - // set default values so that we make V8 happy to - // always see a familiar object template. - this.digest = '' - this.algorithm = '' - this.options = [] - - // 3.1. Integrity metadata (called "Hash" by ssri) - // https://w3c.github.io/webappsec-subresource-integrity/#integrity-metadata-description - const match = this.source.match( - strict - ? STRICT_SRI_REGEX - : SRI_REGEX - ) - if (!match) { - return - } - if (strict && !SPEC_ALGORITHMS.includes(match[1])) { - return - } - this.algorithm = match[1] - this.digest = match[2] - - const rawOpts = match[3] - if (rawOpts) { - this.options = rawOpts.slice(1).split('?') - } - } - - hexDigest () { - return this.digest && Buffer.from(this.digest, 'base64').toString('hex') - } - - toJSON () { - return this.toString() - } - - match (integrity, opts) { - const other = parse(integrity, opts) - if (!other) { - return false - } - if (other.isIntegrity) { - const algo = other.pickAlgorithm(opts, [this.algorithm]) - - if (!algo) { - return false - } - - const foundHash = other[algo].find(hash => hash.digest === this.digest) - - if (foundHash) { - return foundHash - } - - return false - } - return other.digest === this.digest ? other : false - } - - toString (opts) { - if (opts?.strict) { - // Strict mode enforces the standard as close to the foot of the - // letter as it can. - if (!( - // The spec has very restricted productions for algorithms. - // https://www.w3.org/TR/CSP2/#source-list-syntax - SPEC_ALGORITHMS.includes(this.algorithm) && - // Usually, if someone insists on using a "different" base64, we - // leave it as-is, since there's multiple standards, and the - // specified is not a URL-safe variant. - // https://www.w3.org/TR/CSP2/#base64_value - this.digest.match(BASE64_REGEX) && - // Option syntax is strictly visual chars. - // https://w3c.github.io/webappsec-subresource-integrity/#grammardef-option-expression - // https://tools.ietf.org/html/rfc5234#appendix-B.1 - this.options.every(opt => opt.match(VCHAR_REGEX)) - )) { - return '' - } - } - return `${this.algorithm}-${this.digest}${getOptString(this.options)}` - } -} - -function integrityHashToString (toString, sep, opts, hashes) { - const toStringIsNotEmpty = toString !== '' - - let shouldAddFirstSep = false - let complement = '' - - const lastIndex = hashes.length - 1 - - for (let i = 0; i < lastIndex; i++) { - const hashString = Hash.prototype.toString.call(hashes[i], opts) - - if (hashString) { - shouldAddFirstSep = true - - complement += hashString - complement += sep - } - } - - const finalHashString = Hash.prototype.toString.call(hashes[lastIndex], opts) - - if (finalHashString) { - shouldAddFirstSep = true - complement += finalHashString - } - - if (toStringIsNotEmpty && shouldAddFirstSep) { - return toString + sep + complement - } - - return toString + complement -} - -class Integrity { - get isIntegrity () { - return true - } - - toJSON () { - return this.toString() - } - - isEmpty () { - return Object.keys(this).length === 0 - } - - toString (opts) { - let sep = opts?.sep || ' ' - let toString = '' - - if (opts?.strict) { - // Entries must be separated by whitespace, according to spec. - sep = sep.replace(/\S+/g, ' ') - - for (const hash of SPEC_ALGORITHMS) { - if (this[hash]) { - toString = integrityHashToString(toString, sep, opts, this[hash]) - } - } - } else { - for (const hash of Object.keys(this)) { - toString = integrityHashToString(toString, sep, opts, this[hash]) - } - } - - return toString - } - - concat (integrity, opts) { - const other = typeof integrity === 'string' - ? integrity - : stringify(integrity, opts) - return parse(`${this.toString(opts)} ${other}`, opts) - } - - hexDigest () { - return parse(this, { single: true }).hexDigest() - } - - // add additional hashes to an integrity value, but prevent - // *changing* an existing integrity hash. - merge (integrity, opts) { - const other = parse(integrity, opts) - for (const algo in other) { - if (this[algo]) { - if (!this[algo].find(hash => - other[algo].find(otherhash => - hash.digest === otherhash.digest))) { - throw new Error('hashes do not match, cannot update integrity') - } - } else { - this[algo] = other[algo] - } - } - } - - match (integrity, opts) { - const other = parse(integrity, opts) - if (!other) { - return false - } - const algo = other.pickAlgorithm(opts, Object.keys(this)) - return ( - !!algo && - this[algo] && - other[algo] && - this[algo].find(hash => - other[algo].find(otherhash => - hash.digest === otherhash.digest - ) - ) - ) || false - } - - // Pick the highest priority algorithm present, optionally also limited to a - // set of hashes found in another integrity. When limiting it may return - // nothing. - pickAlgorithm (opts, hashes) { - const pickAlgorithm = opts?.pickAlgorithm || getPrioritizedHash - const keys = Object.keys(this).filter(k => { - if (hashes?.length) { - return hashes.includes(k) - } - return true - }) - if (keys.length) { - return keys.reduce((acc, algo) => pickAlgorithm(acc, algo) || acc) - } - // no intersection between this and hashes, - return null - } -} - -module.exports.parse = parse -function parse (sri, opts) { - if (!sri) { - return null - } - if (typeof sri === 'string') { - return _parse(sri, opts) - } else if (sri.algorithm && sri.digest) { - const fullSri = new Integrity() - fullSri[sri.algorithm] = [sri] - return _parse(stringify(fullSri, opts), opts) - } else { - return _parse(stringify(sri, opts), opts) - } -} - -function _parse (integrity, opts) { - // 3.4.3. Parse metadata - // https://w3c.github.io/webappsec-subresource-integrity/#parse-metadata - if (opts?.single) { - return new Hash(integrity, opts) - } - const hashes = integrity.trim().split(/\s+/).reduce((acc, string) => { - const hash = new Hash(string, opts) - if (hash.algorithm && hash.digest) { - const algo = hash.algorithm - if (!acc[algo]) { - acc[algo] = [] - } - acc[algo].push(hash) - } - return acc - }, new Integrity()) - return hashes.isEmpty() ? null : hashes -} - -module.exports.stringify = stringify -function stringify (obj, opts) { - if (obj.algorithm && obj.digest) { - return Hash.prototype.toString.call(obj, opts) - } else if (typeof obj === 'string') { - return stringify(parse(obj, opts), opts) - } else { - return Integrity.prototype.toString.call(obj, opts) - } -} - -module.exports.fromHex = fromHex -function fromHex (hexDigest, algorithm, opts) { - const optString = getOptString(opts?.options) - return parse( - `${algorithm}-${ - Buffer.from(hexDigest, 'hex').toString('base64') - }${optString}`, opts - ) -} - -module.exports.fromData = fromData -function fromData (data, opts) { - const algorithms = opts?.algorithms || [...DEFAULT_ALGORITHMS] - const optString = getOptString(opts?.options) - return algorithms.reduce((acc, algo) => { - const digest = crypto.createHash(algo).update(data).digest('base64') - const hash = new Hash( - `${algo}-${digest}${optString}`, - opts - ) - /* istanbul ignore else - it would be VERY strange if the string we - * just calculated with an algo did not have an algo or digest. - */ - if (hash.algorithm && hash.digest) { - const hashAlgo = hash.algorithm - if (!acc[hashAlgo]) { - acc[hashAlgo] = [] - } - acc[hashAlgo].push(hash) - } - return acc - }, new Integrity()) -} - -module.exports.fromStream = fromStream -function fromStream (stream, opts) { - const istream = integrityStream(opts) - return new Promise((resolve, reject) => { - stream.pipe(istream) - stream.on('error', reject) - istream.on('error', reject) - let sri - istream.on('integrity', s => { - sri = s - }) - istream.on('end', () => resolve(sri)) - istream.resume() - }) -} - -module.exports.checkData = checkData -function checkData (data, sri, opts) { - sri = parse(sri, opts) - if (!sri || !Object.keys(sri).length) { - if (opts?.error) { - throw Object.assign( - new Error('No valid integrity hashes to check against'), { - code: 'EINTEGRITY', - } - ) - } else { - return false - } - } - const algorithm = sri.pickAlgorithm(opts) - const digest = crypto.createHash(algorithm).update(data).digest('base64') - const newSri = parse({ algorithm, digest }) - const match = newSri.match(sri, opts) - opts = opts || {} - if (match || !(opts.error)) { - return match - } else if (typeof opts.size === 'number' && (data.length !== opts.size)) { - /* eslint-disable-next-line max-len */ - const err = new Error(`data size mismatch when checking ${sri}.\n Wanted: ${opts.size}\n Found: ${data.length}`) - err.code = 'EBADSIZE' - err.found = data.length - err.expected = opts.size - err.sri = sri - throw err - } else { - /* eslint-disable-next-line max-len */ - const err = new Error(`Integrity checksum failed when using ${algorithm}: Wanted ${sri}, but got ${newSri}. (${data.length} bytes)`) - err.code = 'EINTEGRITY' - err.found = newSri - err.expected = sri - err.algorithm = algorithm - err.sri = sri - throw err - } -} - -module.exports.checkStream = checkStream -function checkStream (stream, sri, opts) { - opts = opts || Object.create(null) - opts.integrity = sri - sri = parse(sri, opts) - if (!sri || !Object.keys(sri).length) { - return Promise.reject(Object.assign( - new Error('No valid integrity hashes to check against'), { - code: 'EINTEGRITY', - } - )) - } - const checker = integrityStream(opts) - return new Promise((resolve, reject) => { - stream.pipe(checker) - stream.on('error', reject) - checker.on('error', reject) - let verified - checker.on('verified', s => { - verified = s - }) - checker.on('end', () => resolve(verified)) - checker.resume() - }) -} - -module.exports.integrityStream = integrityStream -function integrityStream (opts = Object.create(null)) { - return new IntegrityStream(opts) -} - -module.exports.create = createIntegrity -function createIntegrity (opts) { - const algorithms = opts?.algorithms || [...DEFAULT_ALGORITHMS] - const optString = getOptString(opts?.options) - - const hashes = algorithms.map(crypto.createHash) - - return { - update: function (chunk, enc) { - hashes.forEach(h => h.update(chunk, enc)) - return this - }, - digest: function () { - const integrity = algorithms.reduce((acc, algo) => { - const digest = hashes.shift().digest('base64') - const hash = new Hash( - `${algo}-${digest}${optString}`, - opts - ) - /* istanbul ignore else - it would be VERY strange if the hash we - * just calculated with an algo did not have an algo or digest. - */ - if (hash.algorithm && hash.digest) { - const hashAlgo = hash.algorithm - if (!acc[hashAlgo]) { - acc[hashAlgo] = [] - } - acc[hashAlgo].push(hash) - } - return acc - }, new Integrity()) - - return integrity - }, - } -} - -const NODE_HASHES = crypto.getHashes() - -// This is a Best Effort™ at a reasonable priority for hash algos -const DEFAULT_PRIORITY = [ - 'md5', 'whirlpool', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512', - // TODO - it's unclear _which_ of these Node will actually use as its name - // for the algorithm, so we guesswork it based on the OpenSSL names. - 'sha3', - 'sha3-256', 'sha3-384', 'sha3-512', - 'sha3_256', 'sha3_384', 'sha3_512', -].filter(algo => NODE_HASHES.includes(algo)) - -function getPrioritizedHash (algo1, algo2) { - /* eslint-disable-next-line max-len */ - return DEFAULT_PRIORITY.indexOf(algo1.toLowerCase()) >= DEFAULT_PRIORITY.indexOf(algo2.toLowerCase()) - ? algo1 - : algo2 -} diff --git a/deps/npm/node_modules/tuf-js/node_modules/ssri/package.json b/deps/npm/node_modules/tuf-js/node_modules/ssri/package.json deleted file mode 100644 index 28395414e4643c..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/ssri/package.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "name": "ssri", - "version": "10.0.6", - "description": "Standard Subresource Integrity library -- parses, serializes, generates, and verifies integrity metadata according to the SRI spec.", - "main": "lib/index.js", - "files": [ - "bin/", - "lib/" - ], - "scripts": { - "prerelease": "npm t", - "postrelease": "npm publish", - "posttest": "npm run lint", - "test": "tap", - "coverage": "tap", - "lint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"", - "postlint": "template-oss-check", - "template-oss-apply": "template-oss-apply --force", - "lintfix": "npm run lint -- --fix", - "snap": "tap" - }, - "tap": { - "check-coverage": true, - "nyc-arg": [ - "--exclude", - "tap-snapshots/**" - ] - }, - "repository": { - "type": "git", - "url": "git+https://github.com/npm/ssri.git" - }, - "keywords": [ - "w3c", - "web", - "security", - "integrity", - "checksum", - "hashing", - "subresource integrity", - "sri", - "sri hash", - "sri string", - "sri generator", - "html" - ], - "author": "GitHub Inc.", - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "devDependencies": { - "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.22.0", - "tap": "^16.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "templateOSS": { - "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.22.0", - "publish": "true" - } -} diff --git a/deps/npm/node_modules/tuf-js/node_modules/unique-filename/LICENSE b/deps/npm/node_modules/tuf-js/node_modules/unique-filename/LICENSE deleted file mode 100644 index 69619c125ea7ef..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/unique-filename/LICENSE +++ /dev/null @@ -1,5 +0,0 @@ -Copyright npm, Inc - -Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/deps/npm/node_modules/tuf-js/node_modules/unique-filename/lib/index.js b/deps/npm/node_modules/tuf-js/node_modules/unique-filename/lib/index.js deleted file mode 100644 index d067d2e709809a..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/unique-filename/lib/index.js +++ /dev/null @@ -1,7 +0,0 @@ -var path = require('path') - -var uniqueSlug = require('unique-slug') - -module.exports = function (filepath, prefix, uniq) { - return path.join(filepath, (prefix ? prefix + '-' : '') + uniqueSlug(uniq)) -} diff --git a/deps/npm/node_modules/tuf-js/node_modules/unique-filename/package.json b/deps/npm/node_modules/tuf-js/node_modules/unique-filename/package.json deleted file mode 100644 index b2fbf0666489a6..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/unique-filename/package.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "name": "unique-filename", - "version": "3.0.0", - "description": "Generate a unique filename for use in temporary directories or caches.", - "main": "lib/index.js", - "scripts": { - "test": "tap", - "lint": "eslint \"**/*.js\"", - "postlint": "template-oss-check", - "template-oss-apply": "template-oss-apply --force", - "lintfix": "npm run lint -- --fix", - "snap": "tap", - "posttest": "npm run lint" - }, - "repository": { - "type": "git", - "url": "https://github.com/npm/unique-filename.git" - }, - "keywords": [], - "author": "GitHub Inc.", - "license": "ISC", - "bugs": { - "url": "https://github.com/iarna/unique-filename/issues" - }, - "homepage": "https://github.com/iarna/unique-filename", - "devDependencies": { - "@npmcli/eslint-config": "^4.0.0", - "@npmcli/template-oss": "4.5.1", - "tap": "^16.3.0" - }, - "dependencies": { - "unique-slug": "^4.0.0" - }, - "files": [ - "bin/", - "lib/" - ], - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "templateOSS": { - "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.5.1" - }, - "tap": { - "nyc-arg": [ - "--exclude", - "tap-snapshots/**" - ] - } -} diff --git a/deps/npm/node_modules/tuf-js/node_modules/unique-slug/LICENSE b/deps/npm/node_modules/tuf-js/node_modules/unique-slug/LICENSE deleted file mode 100644 index 7953647e7760b8..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/unique-slug/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright npm, Inc - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/deps/npm/node_modules/tuf-js/node_modules/unique-slug/lib/index.js b/deps/npm/node_modules/tuf-js/node_modules/unique-slug/lib/index.js deleted file mode 100644 index 1bac84d95d7307..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/unique-slug/lib/index.js +++ /dev/null @@ -1,11 +0,0 @@ -'use strict' -var MurmurHash3 = require('imurmurhash') - -module.exports = function (uniq) { - if (uniq) { - var hash = new MurmurHash3(uniq) - return ('00000000' + hash.result().toString(16)).slice(-8) - } else { - return (Math.random().toString(16) + '0000000').slice(2, 10) - } -} diff --git a/deps/npm/node_modules/tuf-js/node_modules/unique-slug/package.json b/deps/npm/node_modules/tuf-js/node_modules/unique-slug/package.json deleted file mode 100644 index 33732cdbb42859..00000000000000 --- a/deps/npm/node_modules/tuf-js/node_modules/unique-slug/package.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "name": "unique-slug", - "version": "4.0.0", - "description": "Generate a unique character string suitible for use in files and URLs.", - "main": "lib/index.js", - "scripts": { - "test": "tap", - "lint": "eslint \"**/*.js\"", - "postlint": "template-oss-check", - "template-oss-apply": "template-oss-apply --force", - "lintfix": "npm run lint -- --fix", - "snap": "tap", - "posttest": "npm run lint" - }, - "keywords": [], - "author": "GitHub Inc.", - "license": "ISC", - "devDependencies": { - "@npmcli/eslint-config": "^3.1.0", - "@npmcli/template-oss": "4.5.1", - "tap": "^16.3.0" - }, - "repository": { - "type": "git", - "url": "https://github.com/npm/unique-slug.git" - }, - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "files": [ - "bin/", - "lib/" - ], - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "templateOSS": { - "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", - "version": "4.5.1" - }, - "tap": { - "nyc-arg": [ - "--exclude", - "tap-snapshots/**" - ] - } -} diff --git a/deps/npm/node_modules/tuf-js/package.json b/deps/npm/node_modules/tuf-js/package.json index 9280719230d9ab..e79a3d45f3f06a 100644 --- a/deps/npm/node_modules/tuf-js/package.json +++ b/deps/npm/node_modules/tuf-js/package.json @@ -1,12 +1,12 @@ { "name": "tuf-js", - "version": "2.2.1", + "version": "3.0.1", "description": "JavaScript implementation of The Update Framework (TUF)", "main": "dist/index.js", "types": "dist/index.d.ts", "scripts": { "build": "tsc --build", - "clean": "rm -rf dist", + "clean": "rm -rf dist && rm tsconfig.tsbuildinfo", "test": "jest" }, "repository": { @@ -28,16 +28,16 @@ }, "homepage": "https://github.com/theupdateframework/tuf-js/tree/main/packages/client#readme", "devDependencies": { - "@tufjs/repo-mock": "2.0.1", + "@tufjs/repo-mock": "3.0.1", "@types/debug": "^4.1.12", "@types/make-fetch-happen": "^10.0.4" }, "dependencies": { - "@tufjs/models": "2.0.1", - "debug": "^4.3.4", - "make-fetch-happen": "^13.0.1" + "@tufjs/models": "3.0.1", + "debug": "^4.3.6", + "make-fetch-happen": "^14.0.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } } diff --git a/deps/npm/node_modules/wrap-ansi/node_modules/ansi-regex/index.js b/deps/npm/node_modules/wrap-ansi/node_modules/ansi-regex/index.js index 130a0929b8ce8c..ddfdba39a783a4 100644 --- a/deps/npm/node_modules/wrap-ansi/node_modules/ansi-regex/index.js +++ b/deps/npm/node_modules/wrap-ansi/node_modules/ansi-regex/index.js @@ -1,7 +1,9 @@ export default function ansiRegex({onlyFirst = false} = {}) { + // Valid string terminator sequences are BEL, ESC\, and 0x9c + const ST = '(?:\\u0007|\\u001B\\u005C|\\u009C)'; const pattern = [ - '[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)', - '(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))' + `[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?${ST})`, + '(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]))', ].join('|'); return new RegExp(pattern, onlyFirst ? undefined : 'g'); diff --git a/deps/npm/node_modules/wrap-ansi/node_modules/ansi-regex/package.json b/deps/npm/node_modules/wrap-ansi/node_modules/ansi-regex/package.json index 7bbb563bf2a70a..49f3f61021512b 100644 --- a/deps/npm/node_modules/wrap-ansi/node_modules/ansi-regex/package.json +++ b/deps/npm/node_modules/wrap-ansi/node_modules/ansi-regex/package.json @@ -1,6 +1,6 @@ { "name": "ansi-regex", - "version": "6.0.1", + "version": "6.1.0", "description": "Regular expression for matching ANSI escape codes", "license": "MIT", "repository": "chalk/ansi-regex", @@ -12,6 +12,8 @@ }, "type": "module", "exports": "./index.js", + "types": "./index.d.ts", + "sideEffects": false, "engines": { "node": ">=12" }, @@ -51,8 +53,9 @@ "pattern" ], "devDependencies": { + "ansi-escapes": "^5.0.0", "ava": "^3.15.0", - "tsd": "^0.14.0", - "xo": "^0.38.2" + "tsd": "^0.21.0", + "xo": "^0.54.2" } } diff --git a/deps/npm/package.json b/deps/npm/package.json index c92578506b30ac..8d01af4a7ce8d0 100644 --- a/deps/npm/package.json +++ b/deps/npm/package.json @@ -1,5 +1,5 @@ { - "version": "10.9.0", + "version": "10.9.2", "name": "npm", "description": "a package manager for JavaScript", "workspaces": [ @@ -55,25 +55,25 @@ "@npmcli/arborist": "^8.0.0", "@npmcli/config": "^9.0.0", "@npmcli/fs": "^4.0.0", - "@npmcli/map-workspaces": "^4.0.1", - "@npmcli/package-json": "^6.0.1", - "@npmcli/promise-spawn": "^8.0.1", + "@npmcli/map-workspaces": "^4.0.2", + "@npmcli/package-json": "^6.1.0", + "@npmcli/promise-spawn": "^8.0.2", "@npmcli/redact": "^3.0.0", "@npmcli/run-script": "^9.0.1", - "@sigstore/tuf": "^2.3.4", + "@sigstore/tuf": "^3.0.0", "abbrev": "^3.0.0", "archy": "~1.0.0", "cacache": "^19.0.1", "chalk": "^5.3.0", - "ci-info": "^4.0.0", + "ci-info": "^4.1.0", "cli-columns": "^4.0.0", "fastest-levenshtein": "^1.0.16", "fs-minipass": "^3.0.3", "glob": "^10.4.5", "graceful-fs": "^4.2.11", - "hosted-git-info": "^8.0.0", + "hosted-git-info": "^8.0.2", "ini": "^5.0.0", - "init-package-json": "^7.0.1", + "init-package-json": "^7.0.2", "is-cidr": "^5.1.0", "json-parse-even-better-errors": "^4.0.0", "libnpmaccess": "^9.0.0", @@ -83,27 +83,27 @@ "libnpmhook": "^11.0.0", "libnpmorg": "^7.0.0", "libnpmpack": "^8.0.0", - "libnpmpublish": "^10.0.0", + "libnpmpublish": "^10.0.1", "libnpmsearch": "^8.0.0", "libnpmteam": "^7.0.0", "libnpmversion": "^7.0.0", - "make-fetch-happen": "^14.0.1", + "make-fetch-happen": "^14.0.3", "minimatch": "^9.0.5", "minipass": "^7.1.1", "minipass-pipeline": "^1.2.4", "ms": "^2.1.2", - "node-gyp": "^10.2.0", + "node-gyp": "^11.0.0", "nopt": "^8.0.0", "normalize-package-data": "^7.0.0", "npm-audit-report": "^6.0.0", - "npm-install-checks": "^7.1.0", + "npm-install-checks": "^7.1.1", "npm-package-arg": "^12.0.0", "npm-pick-manifest": "^10.0.0", "npm-profile": "^11.0.1", - "npm-registry-fetch": "^18.0.1", + "npm-registry-fetch": "^18.0.2", "npm-user-validate": "^3.0.0", "p-map": "^4.0.0", - "pacote": "^19.0.0", + "pacote": "^19.0.1", "parse-conflict-json": "^4.0.0", "proc-log": "^5.0.0", "qrcode-terminal": "^0.12.0", diff --git a/deps/openssl/openssl.gyp b/deps/openssl/openssl.gyp index f6b157f8d60813..ea3a2dc09ef29b 100644 --- a/deps/openssl/openssl.gyp +++ b/deps/openssl/openssl.gyp @@ -5,19 +5,13 @@ 'nasm_version%': '0.0', 'openssl-cli': '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)openssl-cli<(EXECUTABLE_SUFFIX)', 'conditions': [ - ['OS == "win"', { - 'obj_dir_abs': '<(PRODUCT_DIR_ABS)/obj', - }], ['GENERATOR == "ninja"', { - 'obj_dir_abs': '<(PRODUCT_DIR_ABS)/obj', - 'modules_dir': '<(PRODUCT_DIR_ABS)/obj/lib/openssl-modules', + 'modules_dir': '<(PRODUCT_DIR_ABS_CSTR)/obj/lib/openssl-modules', }, { - 'obj_dir_abs%': '<(PRODUCT_DIR_ABS)/obj.target', - 'modules_dir': '<(PRODUCT_DIR_ABS)/obj.target/deps/openssl/lib/openssl-modules', + 'modules_dir': '<(PRODUCT_DIR_ABS_CSTR)/obj.target/deps/openssl/lib/openssl-modules', }], ['OS=="mac"', { - 'obj_dir_abs%': '<(PRODUCT_DIR_ABS)/obj.target', - 'modules_dir': '<(PRODUCT_DIR_ABS)/obj.target/deps/openssl/lib/openssl-modules', + 'modules_dir': '<(PRODUCT_DIR_ABS_CSTR)/obj.target/deps/openssl/lib/openssl-modules', }], ], }, diff --git a/deps/simdjson/simdjson.cpp b/deps/simdjson/simdjson.cpp index b5dd7243853217..d79fc703a815ca 100644 --- a/deps/simdjson/simdjson.cpp +++ b/deps/simdjson/simdjson.cpp @@ -1,4 +1,4 @@ -/* auto-generated on 2024-08-01 09:31:50 -0400. Do not edit! */ +/* auto-generated on 2024-08-26 09:37:03 -0400. Do not edit! */ /* including simdjson.cpp: */ /* begin file simdjson.cpp */ #define SIMDJSON_SRC_SIMDJSON_CPP @@ -332,6 +332,8 @@ double from_chars(const char *first, const char* end) noexcept; #define SIMDJSON_ISALIGNED_N(ptr, n) (((uintptr_t)(ptr) & ((n)-1)) == 0) #if SIMDJSON_REGULAR_VISUAL_STUDIO + // We could use [[deprecated]] but it requires C++14 + #define simdjson_deprecated __declspec(deprecated) #define simdjson_really_inline __forceinline #define simdjson_never_inline __declspec(noinline) @@ -370,6 +372,8 @@ double from_chars(const char *first, const char* end) noexcept; #define SIMDJSON_POP_DISABLE_UNUSED_WARNINGS #else // SIMDJSON_REGULAR_VISUAL_STUDIO + // We could use [[deprecated]] but it requires C++14 + #define simdjson_deprecated __attribute__((deprecated)) #define simdjson_really_inline inline __attribute__((always_inline)) #define simdjson_never_inline inline __attribute__((noinline)) diff --git a/deps/simdjson/simdjson.h b/deps/simdjson/simdjson.h index ddb6f2e4e0a6ed..f21cd9381eef59 100644 --- a/deps/simdjson/simdjson.h +++ b/deps/simdjson/simdjson.h @@ -1,4 +1,4 @@ -/* auto-generated on 2024-08-01 09:31:50 -0400. Do not edit! */ +/* auto-generated on 2024-08-26 09:37:03 -0400. Do not edit! */ /* including simdjson.h: */ /* begin file simdjson.h */ #ifndef SIMDJSON_H @@ -352,6 +352,8 @@ double from_chars(const char *first, const char* end) noexcept; #define SIMDJSON_ISALIGNED_N(ptr, n) (((uintptr_t)(ptr) & ((n)-1)) == 0) #if SIMDJSON_REGULAR_VISUAL_STUDIO + // We could use [[deprecated]] but it requires C++14 + #define simdjson_deprecated __declspec(deprecated) #define simdjson_really_inline __forceinline #define simdjson_never_inline __declspec(noinline) @@ -390,6 +392,8 @@ double from_chars(const char *first, const char* end) noexcept; #define SIMDJSON_POP_DISABLE_UNUSED_WARNINGS #else // SIMDJSON_REGULAR_VISUAL_STUDIO + // We could use [[deprecated]] but it requires C++14 + #define simdjson_deprecated __attribute__((deprecated)) #define simdjson_really_inline inline __attribute__((always_inline)) #define simdjson_never_inline inline __attribute__((noinline)) @@ -2366,7 +2370,7 @@ namespace std { #define SIMDJSON_SIMDJSON_VERSION_H /** The version of simdjson being used (major.minor.revision) */ -#define SIMDJSON_VERSION "3.10.0" +#define SIMDJSON_VERSION "3.10.1" namespace simdjson { enum { @@ -2381,7 +2385,7 @@ enum { /** * The revision (major.minor.REVISION) of simdjson being used. */ - SIMDJSON_VERSION_REVISION = 0 + SIMDJSON_VERSION_REVISION = 1 }; } // namespace simdjson @@ -34014,7 +34018,7 @@ class parser { private: /** @private [for benchmarking access] The implementation to use */ - std::unique_ptr implementation{}; + std::unique_ptr implementation{}; size_t _capacity{0}; size_t _max_capacity; size_t _max_depth{DEFAULT_MAX_DEPTH}; @@ -34557,7 +34561,7 @@ class document { " You may also add support for custom types, see our documentation."); } /** @overload template simdjson_result get() & noexcept */ - template simdjson_inline simdjson_result get() && noexcept { + template simdjson_deprecated simdjson_inline simdjson_result get() && noexcept { // Unless the simdjson library or the user provides an inline implementation, calling this method should // immediately fail. static_assert(!sizeof(T), "The get method with given type is not implemented by the simdjson library. " @@ -34580,7 +34584,7 @@ class document { */ template simdjson_inline error_code get(T &out) & noexcept; /** @overload template error_code get(T &out) & noexcept */ - template simdjson_inline error_code get(T &out) && noexcept; + template simdjson_deprecated simdjson_inline error_code get(T &out) && noexcept; #if SIMDJSON_EXCEPTIONS /** @@ -34593,7 +34597,10 @@ class document { * @returns An instance of type T */ template - explicit simdjson_inline operator T() noexcept(false); + explicit simdjson_inline operator T() & noexcept(false); + template + explicit simdjson_deprecated simdjson_inline operator T() && noexcept(false); + /** * Cast this JSON value to an array. * @@ -35159,7 +35166,7 @@ struct simdjson_result : public arm64::implementation simdjson_inline simdjson_result is_null() noexcept; template simdjson_inline simdjson_result get() & noexcept; - template simdjson_inline simdjson_result get() && noexcept; + template simdjson_deprecated simdjson_inline simdjson_result get() && noexcept; template simdjson_inline error_code get(T &out) & noexcept; template simdjson_inline error_code get(T &out) && noexcept; @@ -35599,7 +35606,7 @@ class document_stream { friend class document; friend class json_iterator; friend struct simdjson_result; - friend struct internal::simdjson_result_base; + friend struct simdjson::internal::simdjson_result_base; }; // document_stream } // namespace ondemand @@ -36561,16 +36568,14 @@ simdjson_inline simdjson_result &simdjson_resul /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ /* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array-inl.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array_iterator.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator-inl.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_path_to_pointer_conversion.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_path_to_pointer_conversion-inl.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object-inl.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array-inl.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator-inl.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object-inl.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator-inl.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ @@ -36725,24 +36730,26 @@ template<> simdjson_inline simdjson_result document::get() & noexcept { template<> simdjson_inline simdjson_result document::get() & noexcept { return get_bool(); } template<> simdjson_inline simdjson_result document::get() & noexcept { return get_value(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return get_raw_json_string(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return get_string(false); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_double(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_uint64(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_int64(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_bool(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return get_value(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return get_raw_json_string(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return get_string(false); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_double(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_uint64(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_int64(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_bool(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return get_value(); } template simdjson_inline error_code document::get(T &out) & noexcept { return get().get(out); } -template simdjson_inline error_code document::get(T &out) && noexcept { +template simdjson_deprecated simdjson_inline error_code document::get(T &out) && noexcept { return std::forward(*this).get().get(out); } #if SIMDJSON_EXCEPTIONS template -simdjson_inline document::operator T() noexcept(false) { return get(); } +simdjson_deprecated simdjson_inline document::operator T() && noexcept(false) { return get(); } +template +simdjson_inline document::operator T() & noexcept(false) { return get(); } simdjson_inline document::operator array() & noexcept(false) { return get_array(); } simdjson_inline document::operator object() & noexcept(false) { return get_object(); } simdjson_inline document::operator uint64_t() noexcept(false) { return get_uint64(); } @@ -37029,7 +37036,7 @@ simdjson_inline simdjson_result simdjson_result::g return first.get(); } template -simdjson_inline simdjson_result simdjson_result::get() && noexcept { +simdjson_deprecated simdjson_inline simdjson_result simdjson_result::get() && noexcept { if (error()) { return error(); } return std::forward(first).get(); } @@ -37045,7 +37052,7 @@ simdjson_inline error_code simdjson_result::get(T &ou } template<> simdjson_inline simdjson_result simdjson_result::get() & noexcept = delete; -template<> simdjson_inline simdjson_result simdjson_result::get() && noexcept { +template<> simdjson_deprecated simdjson_inline simdjson_result simdjson_result::get() && noexcept { if (error()) { return error(); } return std::forward(first); } @@ -40014,8 +40021,6 @@ simdjson_inline simdjson_result::simdjson_resul /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array_iterator.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_path_to_pointer_conversion.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_path_to_pointer_conversion-inl.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */ @@ -40561,9 +40566,9 @@ simdjson_inline simdjson_result simdjson_result implementation{}; + std::unique_ptr implementation{}; size_t _capacity{0}; size_t _max_capacity; size_t _max_depth{DEFAULT_MAX_DEPTH}; @@ -45023,7 +45028,7 @@ class document { " You may also add support for custom types, see our documentation."); } /** @overload template simdjson_result get() & noexcept */ - template simdjson_inline simdjson_result get() && noexcept { + template simdjson_deprecated simdjson_inline simdjson_result get() && noexcept { // Unless the simdjson library or the user provides an inline implementation, calling this method should // immediately fail. static_assert(!sizeof(T), "The get method with given type is not implemented by the simdjson library. " @@ -45046,7 +45051,7 @@ class document { */ template simdjson_inline error_code get(T &out) & noexcept; /** @overload template error_code get(T &out) & noexcept */ - template simdjson_inline error_code get(T &out) && noexcept; + template simdjson_deprecated simdjson_inline error_code get(T &out) && noexcept; #if SIMDJSON_EXCEPTIONS /** @@ -45059,7 +45064,10 @@ class document { * @returns An instance of type T */ template - explicit simdjson_inline operator T() noexcept(false); + explicit simdjson_inline operator T() & noexcept(false); + template + explicit simdjson_deprecated simdjson_inline operator T() && noexcept(false); + /** * Cast this JSON value to an array. * @@ -45625,7 +45633,7 @@ struct simdjson_result : public fallback::implemen simdjson_inline simdjson_result is_null() noexcept; template simdjson_inline simdjson_result get() & noexcept; - template simdjson_inline simdjson_result get() && noexcept; + template simdjson_deprecated simdjson_inline simdjson_result get() && noexcept; template simdjson_inline error_code get(T &out) & noexcept; template simdjson_inline error_code get(T &out) && noexcept; @@ -46065,7 +46073,7 @@ class document_stream { friend class document; friend class json_iterator; friend struct simdjson_result; - friend struct internal::simdjson_result_base; + friend struct simdjson::internal::simdjson_result_base; }; // document_stream } // namespace ondemand @@ -47027,16 +47035,14 @@ simdjson_inline simdjson_result &simdjson_re /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ /* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array-inl.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array_iterator.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator-inl.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_path_to_pointer_conversion.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_path_to_pointer_conversion-inl.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object-inl.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array-inl.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator-inl.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object-inl.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator-inl.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ @@ -47191,24 +47197,26 @@ template<> simdjson_inline simdjson_result document::get() & noexcept { template<> simdjson_inline simdjson_result document::get() & noexcept { return get_bool(); } template<> simdjson_inline simdjson_result document::get() & noexcept { return get_value(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return get_raw_json_string(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return get_string(false); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_double(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_uint64(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_int64(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_bool(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return get_value(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return get_raw_json_string(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return get_string(false); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_double(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_uint64(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_int64(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_bool(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return get_value(); } template simdjson_inline error_code document::get(T &out) & noexcept { return get().get(out); } -template simdjson_inline error_code document::get(T &out) && noexcept { +template simdjson_deprecated simdjson_inline error_code document::get(T &out) && noexcept { return std::forward(*this).get().get(out); } #if SIMDJSON_EXCEPTIONS template -simdjson_inline document::operator T() noexcept(false) { return get(); } +simdjson_deprecated simdjson_inline document::operator T() && noexcept(false) { return get(); } +template +simdjson_inline document::operator T() & noexcept(false) { return get(); } simdjson_inline document::operator array() & noexcept(false) { return get_array(); } simdjson_inline document::operator object() & noexcept(false) { return get_object(); } simdjson_inline document::operator uint64_t() noexcept(false) { return get_uint64(); } @@ -47495,7 +47503,7 @@ simdjson_inline simdjson_result simdjson_result return first.get(); } template -simdjson_inline simdjson_result simdjson_result::get() && noexcept { +simdjson_deprecated simdjson_inline simdjson_result simdjson_result::get() && noexcept { if (error()) { return error(); } return std::forward(first).get(); } @@ -47511,7 +47519,7 @@ simdjson_inline error_code simdjson_result::get(T } template<> simdjson_inline simdjson_result simdjson_result::get() & noexcept = delete; -template<> simdjson_inline simdjson_result simdjson_result::get() && noexcept { +template<> simdjson_deprecated simdjson_inline simdjson_result simdjson_result::get() && noexcept { if (error()) { return error(); } return std::forward(first); } @@ -50480,8 +50488,6 @@ simdjson_inline simdjson_result::simdjson_re /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array_iterator.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_path_to_pointer_conversion.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_path_to_pointer_conversion-inl.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */ @@ -51027,9 +51033,9 @@ simdjson_inline simdjson_result simdjson_result implementation{}; + std::unique_ptr implementation{}; size_t _capacity{0}; size_t _max_capacity; size_t _max_depth{DEFAULT_MAX_DEPTH}; @@ -55981,7 +55987,7 @@ class document { " You may also add support for custom types, see our documentation."); } /** @overload template simdjson_result get() & noexcept */ - template simdjson_inline simdjson_result get() && noexcept { + template simdjson_deprecated simdjson_inline simdjson_result get() && noexcept { // Unless the simdjson library or the user provides an inline implementation, calling this method should // immediately fail. static_assert(!sizeof(T), "The get method with given type is not implemented by the simdjson library. " @@ -56004,7 +56010,7 @@ class document { */ template simdjson_inline error_code get(T &out) & noexcept; /** @overload template error_code get(T &out) & noexcept */ - template simdjson_inline error_code get(T &out) && noexcept; + template simdjson_deprecated simdjson_inline error_code get(T &out) && noexcept; #if SIMDJSON_EXCEPTIONS /** @@ -56017,7 +56023,10 @@ class document { * @returns An instance of type T */ template - explicit simdjson_inline operator T() noexcept(false); + explicit simdjson_inline operator T() & noexcept(false); + template + explicit simdjson_deprecated simdjson_inline operator T() && noexcept(false); + /** * Cast this JSON value to an array. * @@ -56583,7 +56592,7 @@ struct simdjson_result : public haswell::implementa simdjson_inline simdjson_result is_null() noexcept; template simdjson_inline simdjson_result get() & noexcept; - template simdjson_inline simdjson_result get() && noexcept; + template simdjson_deprecated simdjson_inline simdjson_result get() && noexcept; template simdjson_inline error_code get(T &out) & noexcept; template simdjson_inline error_code get(T &out) && noexcept; @@ -57023,7 +57032,7 @@ class document_stream { friend class document; friend class json_iterator; friend struct simdjson_result; - friend struct internal::simdjson_result_base; + friend struct simdjson::internal::simdjson_result_base; }; // document_stream } // namespace ondemand @@ -57985,16 +57994,14 @@ simdjson_inline simdjson_result &simdjson_res /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ /* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array-inl.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array_iterator.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator-inl.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_path_to_pointer_conversion.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_path_to_pointer_conversion-inl.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object-inl.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array-inl.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator-inl.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object-inl.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator-inl.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ @@ -58149,24 +58156,26 @@ template<> simdjson_inline simdjson_result document::get() & noexcept { template<> simdjson_inline simdjson_result document::get() & noexcept { return get_bool(); } template<> simdjson_inline simdjson_result document::get() & noexcept { return get_value(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return get_raw_json_string(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return get_string(false); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_double(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_uint64(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_int64(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_bool(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return get_value(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return get_raw_json_string(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return get_string(false); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_double(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_uint64(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_int64(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_bool(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return get_value(); } template simdjson_inline error_code document::get(T &out) & noexcept { return get().get(out); } -template simdjson_inline error_code document::get(T &out) && noexcept { +template simdjson_deprecated simdjson_inline error_code document::get(T &out) && noexcept { return std::forward(*this).get().get(out); } #if SIMDJSON_EXCEPTIONS template -simdjson_inline document::operator T() noexcept(false) { return get(); } +simdjson_deprecated simdjson_inline document::operator T() && noexcept(false) { return get(); } +template +simdjson_inline document::operator T() & noexcept(false) { return get(); } simdjson_inline document::operator array() & noexcept(false) { return get_array(); } simdjson_inline document::operator object() & noexcept(false) { return get_object(); } simdjson_inline document::operator uint64_t() noexcept(false) { return get_uint64(); } @@ -58453,7 +58462,7 @@ simdjson_inline simdjson_result simdjson_result: return first.get(); } template -simdjson_inline simdjson_result simdjson_result::get() && noexcept { +simdjson_deprecated simdjson_inline simdjson_result simdjson_result::get() && noexcept { if (error()) { return error(); } return std::forward(first).get(); } @@ -58469,7 +58478,7 @@ simdjson_inline error_code simdjson_result::get(T & } template<> simdjson_inline simdjson_result simdjson_result::get() & noexcept = delete; -template<> simdjson_inline simdjson_result simdjson_result::get() && noexcept { +template<> simdjson_deprecated simdjson_inline simdjson_result simdjson_result::get() && noexcept { if (error()) { return error(); } return std::forward(first); } @@ -61438,8 +61447,6 @@ simdjson_inline simdjson_result::simdjson_res /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array_iterator.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_path_to_pointer_conversion.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_path_to_pointer_conversion-inl.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */ @@ -61985,9 +61992,9 @@ simdjson_inline simdjson_result simdjson_result implementation{}; + std::unique_ptr implementation{}; size_t _capacity{0}; size_t _max_capacity; size_t _max_depth{DEFAULT_MAX_DEPTH}; @@ -66938,7 +66945,7 @@ class document { " You may also add support for custom types, see our documentation."); } /** @overload template simdjson_result get() & noexcept */ - template simdjson_inline simdjson_result get() && noexcept { + template simdjson_deprecated simdjson_inline simdjson_result get() && noexcept { // Unless the simdjson library or the user provides an inline implementation, calling this method should // immediately fail. static_assert(!sizeof(T), "The get method with given type is not implemented by the simdjson library. " @@ -66961,7 +66968,7 @@ class document { */ template simdjson_inline error_code get(T &out) & noexcept; /** @overload template error_code get(T &out) & noexcept */ - template simdjson_inline error_code get(T &out) && noexcept; + template simdjson_deprecated simdjson_inline error_code get(T &out) && noexcept; #if SIMDJSON_EXCEPTIONS /** @@ -66974,7 +66981,10 @@ class document { * @returns An instance of type T */ template - explicit simdjson_inline operator T() noexcept(false); + explicit simdjson_inline operator T() & noexcept(false); + template + explicit simdjson_deprecated simdjson_inline operator T() && noexcept(false); + /** * Cast this JSON value to an array. * @@ -67540,7 +67550,7 @@ struct simdjson_result : public icelake::implementa simdjson_inline simdjson_result is_null() noexcept; template simdjson_inline simdjson_result get() & noexcept; - template simdjson_inline simdjson_result get() && noexcept; + template simdjson_deprecated simdjson_inline simdjson_result get() && noexcept; template simdjson_inline error_code get(T &out) & noexcept; template simdjson_inline error_code get(T &out) && noexcept; @@ -67980,7 +67990,7 @@ class document_stream { friend class document; friend class json_iterator; friend struct simdjson_result; - friend struct internal::simdjson_result_base; + friend struct simdjson::internal::simdjson_result_base; }; // document_stream } // namespace ondemand @@ -68942,16 +68952,14 @@ simdjson_inline simdjson_result &simdjson_res /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ /* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array-inl.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array_iterator.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator-inl.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_path_to_pointer_conversion.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_path_to_pointer_conversion-inl.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object-inl.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array-inl.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator-inl.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object-inl.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator-inl.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ @@ -69106,24 +69114,26 @@ template<> simdjson_inline simdjson_result document::get() & noexcept { template<> simdjson_inline simdjson_result document::get() & noexcept { return get_bool(); } template<> simdjson_inline simdjson_result document::get() & noexcept { return get_value(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return get_raw_json_string(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return get_string(false); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_double(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_uint64(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_int64(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_bool(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return get_value(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return get_raw_json_string(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return get_string(false); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_double(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_uint64(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_int64(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_bool(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return get_value(); } template simdjson_inline error_code document::get(T &out) & noexcept { return get().get(out); } -template simdjson_inline error_code document::get(T &out) && noexcept { +template simdjson_deprecated simdjson_inline error_code document::get(T &out) && noexcept { return std::forward(*this).get().get(out); } #if SIMDJSON_EXCEPTIONS template -simdjson_inline document::operator T() noexcept(false) { return get(); } +simdjson_deprecated simdjson_inline document::operator T() && noexcept(false) { return get(); } +template +simdjson_inline document::operator T() & noexcept(false) { return get(); } simdjson_inline document::operator array() & noexcept(false) { return get_array(); } simdjson_inline document::operator object() & noexcept(false) { return get_object(); } simdjson_inline document::operator uint64_t() noexcept(false) { return get_uint64(); } @@ -69410,7 +69420,7 @@ simdjson_inline simdjson_result simdjson_result: return first.get(); } template -simdjson_inline simdjson_result simdjson_result::get() && noexcept { +simdjson_deprecated simdjson_inline simdjson_result simdjson_result::get() && noexcept { if (error()) { return error(); } return std::forward(first).get(); } @@ -69426,7 +69436,7 @@ simdjson_inline error_code simdjson_result::get(T & } template<> simdjson_inline simdjson_result simdjson_result::get() & noexcept = delete; -template<> simdjson_inline simdjson_result simdjson_result::get() && noexcept { +template<> simdjson_deprecated simdjson_inline simdjson_result simdjson_result::get() && noexcept { if (error()) { return error(); } return std::forward(first); } @@ -72395,8 +72405,6 @@ simdjson_inline simdjson_result::simdjson_res /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array_iterator.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_path_to_pointer_conversion.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_path_to_pointer_conversion-inl.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */ @@ -72942,9 +72950,9 @@ simdjson_inline simdjson_result simdjson_result implementation{}; + std::unique_ptr implementation{}; size_t _capacity{0}; size_t _max_capacity; size_t _max_depth{DEFAULT_MAX_DEPTH}; @@ -78010,7 +78018,7 @@ class document { " You may also add support for custom types, see our documentation."); } /** @overload template simdjson_result get() & noexcept */ - template simdjson_inline simdjson_result get() && noexcept { + template simdjson_deprecated simdjson_inline simdjson_result get() && noexcept { // Unless the simdjson library or the user provides an inline implementation, calling this method should // immediately fail. static_assert(!sizeof(T), "The get method with given type is not implemented by the simdjson library. " @@ -78033,7 +78041,7 @@ class document { */ template simdjson_inline error_code get(T &out) & noexcept; /** @overload template error_code get(T &out) & noexcept */ - template simdjson_inline error_code get(T &out) && noexcept; + template simdjson_deprecated simdjson_inline error_code get(T &out) && noexcept; #if SIMDJSON_EXCEPTIONS /** @@ -78046,7 +78054,10 @@ class document { * @returns An instance of type T */ template - explicit simdjson_inline operator T() noexcept(false); + explicit simdjson_inline operator T() & noexcept(false); + template + explicit simdjson_deprecated simdjson_inline operator T() && noexcept(false); + /** * Cast this JSON value to an array. * @@ -78612,7 +78623,7 @@ struct simdjson_result : public ppc64::implementation simdjson_inline simdjson_result is_null() noexcept; template simdjson_inline simdjson_result get() & noexcept; - template simdjson_inline simdjson_result get() && noexcept; + template simdjson_deprecated simdjson_inline simdjson_result get() && noexcept; template simdjson_inline error_code get(T &out) & noexcept; template simdjson_inline error_code get(T &out) && noexcept; @@ -79052,7 +79063,7 @@ class document_stream { friend class document; friend class json_iterator; friend struct simdjson_result; - friend struct internal::simdjson_result_base; + friend struct simdjson::internal::simdjson_result_base; }; // document_stream } // namespace ondemand @@ -80014,16 +80025,14 @@ simdjson_inline simdjson_result &simdjson_resul /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ /* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array-inl.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array_iterator.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator-inl.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_path_to_pointer_conversion.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_path_to_pointer_conversion-inl.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object-inl.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array-inl.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator-inl.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object-inl.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator-inl.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ @@ -80178,24 +80187,26 @@ template<> simdjson_inline simdjson_result document::get() & noexcept { template<> simdjson_inline simdjson_result document::get() & noexcept { return get_bool(); } template<> simdjson_inline simdjson_result document::get() & noexcept { return get_value(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return get_raw_json_string(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return get_string(false); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_double(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_uint64(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_int64(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_bool(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return get_value(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return get_raw_json_string(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return get_string(false); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_double(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_uint64(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_int64(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_bool(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return get_value(); } template simdjson_inline error_code document::get(T &out) & noexcept { return get().get(out); } -template simdjson_inline error_code document::get(T &out) && noexcept { +template simdjson_deprecated simdjson_inline error_code document::get(T &out) && noexcept { return std::forward(*this).get().get(out); } #if SIMDJSON_EXCEPTIONS template -simdjson_inline document::operator T() noexcept(false) { return get(); } +simdjson_deprecated simdjson_inline document::operator T() && noexcept(false) { return get(); } +template +simdjson_inline document::operator T() & noexcept(false) { return get(); } simdjson_inline document::operator array() & noexcept(false) { return get_array(); } simdjson_inline document::operator object() & noexcept(false) { return get_object(); } simdjson_inline document::operator uint64_t() noexcept(false) { return get_uint64(); } @@ -80482,7 +80493,7 @@ simdjson_inline simdjson_result simdjson_result::g return first.get(); } template -simdjson_inline simdjson_result simdjson_result::get() && noexcept { +simdjson_deprecated simdjson_inline simdjson_result simdjson_result::get() && noexcept { if (error()) { return error(); } return std::forward(first).get(); } @@ -80498,7 +80509,7 @@ simdjson_inline error_code simdjson_result::get(T &ou } template<> simdjson_inline simdjson_result simdjson_result::get() & noexcept = delete; -template<> simdjson_inline simdjson_result simdjson_result::get() && noexcept { +template<> simdjson_deprecated simdjson_inline simdjson_result simdjson_result::get() && noexcept { if (error()) { return error(); } return std::forward(first); } @@ -83467,8 +83478,6 @@ simdjson_inline simdjson_result::simdjson_resul /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array_iterator.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_path_to_pointer_conversion.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_path_to_pointer_conversion-inl.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */ @@ -84014,9 +84023,9 @@ simdjson_inline simdjson_result simdjson_result implementation{}; + std::unique_ptr implementation{}; size_t _capacity{0}; size_t _max_capacity; size_t _max_depth{DEFAULT_MAX_DEPTH}; @@ -89405,7 +89414,7 @@ class document { " You may also add support for custom types, see our documentation."); } /** @overload template simdjson_result get() & noexcept */ - template simdjson_inline simdjson_result get() && noexcept { + template simdjson_deprecated simdjson_inline simdjson_result get() && noexcept { // Unless the simdjson library or the user provides an inline implementation, calling this method should // immediately fail. static_assert(!sizeof(T), "The get method with given type is not implemented by the simdjson library. " @@ -89428,7 +89437,7 @@ class document { */ template simdjson_inline error_code get(T &out) & noexcept; /** @overload template error_code get(T &out) & noexcept */ - template simdjson_inline error_code get(T &out) && noexcept; + template simdjson_deprecated simdjson_inline error_code get(T &out) && noexcept; #if SIMDJSON_EXCEPTIONS /** @@ -89441,7 +89450,10 @@ class document { * @returns An instance of type T */ template - explicit simdjson_inline operator T() noexcept(false); + explicit simdjson_inline operator T() & noexcept(false); + template + explicit simdjson_deprecated simdjson_inline operator T() && noexcept(false); + /** * Cast this JSON value to an array. * @@ -90007,7 +90019,7 @@ struct simdjson_result : public westmere::implemen simdjson_inline simdjson_result is_null() noexcept; template simdjson_inline simdjson_result get() & noexcept; - template simdjson_inline simdjson_result get() && noexcept; + template simdjson_deprecated simdjson_inline simdjson_result get() && noexcept; template simdjson_inline error_code get(T &out) & noexcept; template simdjson_inline error_code get(T &out) && noexcept; @@ -90447,7 +90459,7 @@ class document_stream { friend class document; friend class json_iterator; friend struct simdjson_result; - friend struct internal::simdjson_result_base; + friend struct simdjson::internal::simdjson_result_base; }; // document_stream } // namespace ondemand @@ -91409,16 +91421,14 @@ simdjson_inline simdjson_result &simdjson_re /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ /* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array-inl.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array_iterator.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator-inl.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_path_to_pointer_conversion.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_path_to_pointer_conversion-inl.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object-inl.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array-inl.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator-inl.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object-inl.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator-inl.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ @@ -91573,24 +91583,26 @@ template<> simdjson_inline simdjson_result document::get() & noexcept { template<> simdjson_inline simdjson_result document::get() & noexcept { return get_bool(); } template<> simdjson_inline simdjson_result document::get() & noexcept { return get_value(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return get_raw_json_string(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return get_string(false); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_double(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_uint64(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_int64(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_bool(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return get_value(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return get_raw_json_string(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return get_string(false); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_double(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_uint64(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_int64(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_bool(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return get_value(); } template simdjson_inline error_code document::get(T &out) & noexcept { return get().get(out); } -template simdjson_inline error_code document::get(T &out) && noexcept { +template simdjson_deprecated simdjson_inline error_code document::get(T &out) && noexcept { return std::forward(*this).get().get(out); } #if SIMDJSON_EXCEPTIONS template -simdjson_inline document::operator T() noexcept(false) { return get(); } +simdjson_deprecated simdjson_inline document::operator T() && noexcept(false) { return get(); } +template +simdjson_inline document::operator T() & noexcept(false) { return get(); } simdjson_inline document::operator array() & noexcept(false) { return get_array(); } simdjson_inline document::operator object() & noexcept(false) { return get_object(); } simdjson_inline document::operator uint64_t() noexcept(false) { return get_uint64(); } @@ -91877,7 +91889,7 @@ simdjson_inline simdjson_result simdjson_result return first.get(); } template -simdjson_inline simdjson_result simdjson_result::get() && noexcept { +simdjson_deprecated simdjson_inline simdjson_result simdjson_result::get() && noexcept { if (error()) { return error(); } return std::forward(first).get(); } @@ -91893,7 +91905,7 @@ simdjson_inline error_code simdjson_result::get(T } template<> simdjson_inline simdjson_result simdjson_result::get() & noexcept = delete; -template<> simdjson_inline simdjson_result simdjson_result::get() && noexcept { +template<> simdjson_deprecated simdjson_inline simdjson_result simdjson_result::get() && noexcept { if (error()) { return error(); } return std::forward(first); } @@ -94862,8 +94874,6 @@ simdjson_inline simdjson_result::simdjson_re /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array_iterator.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_path_to_pointer_conversion.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_path_to_pointer_conversion-inl.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */ @@ -95409,9 +95419,9 @@ simdjson_inline simdjson_result simdjson_result implementation{}; + std::unique_ptr implementation{}; size_t _capacity{0}; size_t _max_capacity; size_t _max_depth{DEFAULT_MAX_DEPTH}; @@ -100271,7 +100281,7 @@ class document { " You may also add support for custom types, see our documentation."); } /** @overload template simdjson_result get() & noexcept */ - template simdjson_inline simdjson_result get() && noexcept { + template simdjson_deprecated simdjson_inline simdjson_result get() && noexcept { // Unless the simdjson library or the user provides an inline implementation, calling this method should // immediately fail. static_assert(!sizeof(T), "The get method with given type is not implemented by the simdjson library. " @@ -100294,7 +100304,7 @@ class document { */ template simdjson_inline error_code get(T &out) & noexcept; /** @overload template error_code get(T &out) & noexcept */ - template simdjson_inline error_code get(T &out) && noexcept; + template simdjson_deprecated simdjson_inline error_code get(T &out) && noexcept; #if SIMDJSON_EXCEPTIONS /** @@ -100307,7 +100317,10 @@ class document { * @returns An instance of type T */ template - explicit simdjson_inline operator T() noexcept(false); + explicit simdjson_inline operator T() & noexcept(false); + template + explicit simdjson_deprecated simdjson_inline operator T() && noexcept(false); + /** * Cast this JSON value to an array. * @@ -100873,7 +100886,7 @@ struct simdjson_result : public lsx::implementation_sim simdjson_inline simdjson_result is_null() noexcept; template simdjson_inline simdjson_result get() & noexcept; - template simdjson_inline simdjson_result get() && noexcept; + template simdjson_deprecated simdjson_inline simdjson_result get() && noexcept; template simdjson_inline error_code get(T &out) & noexcept; template simdjson_inline error_code get(T &out) && noexcept; @@ -101313,7 +101326,7 @@ class document_stream { friend class document; friend class json_iterator; friend struct simdjson_result; - friend struct internal::simdjson_result_base; + friend struct simdjson::internal::simdjson_result_base; }; // document_stream } // namespace ondemand @@ -102275,16 +102288,14 @@ simdjson_inline simdjson_result &simdjson_result< /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ /* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array-inl.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array_iterator.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator-inl.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_path_to_pointer_conversion.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_path_to_pointer_conversion-inl.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object-inl.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array-inl.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator-inl.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object-inl.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator-inl.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ @@ -102439,24 +102450,26 @@ template<> simdjson_inline simdjson_result document::get() & noexcept { template<> simdjson_inline simdjson_result document::get() & noexcept { return get_bool(); } template<> simdjson_inline simdjson_result document::get() & noexcept { return get_value(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return get_raw_json_string(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return get_string(false); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_double(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_uint64(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_int64(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_bool(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return get_value(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return get_raw_json_string(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return get_string(false); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_double(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_uint64(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_int64(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_bool(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return get_value(); } template simdjson_inline error_code document::get(T &out) & noexcept { return get().get(out); } -template simdjson_inline error_code document::get(T &out) && noexcept { +template simdjson_deprecated simdjson_inline error_code document::get(T &out) && noexcept { return std::forward(*this).get().get(out); } #if SIMDJSON_EXCEPTIONS template -simdjson_inline document::operator T() noexcept(false) { return get(); } +simdjson_deprecated simdjson_inline document::operator T() && noexcept(false) { return get(); } +template +simdjson_inline document::operator T() & noexcept(false) { return get(); } simdjson_inline document::operator array() & noexcept(false) { return get_array(); } simdjson_inline document::operator object() & noexcept(false) { return get_object(); } simdjson_inline document::operator uint64_t() noexcept(false) { return get_uint64(); } @@ -102743,7 +102756,7 @@ simdjson_inline simdjson_result simdjson_result::get return first.get(); } template -simdjson_inline simdjson_result simdjson_result::get() && noexcept { +simdjson_deprecated simdjson_inline simdjson_result simdjson_result::get() && noexcept { if (error()) { return error(); } return std::forward(first).get(); } @@ -102759,7 +102772,7 @@ simdjson_inline error_code simdjson_result::get(T &out) } template<> simdjson_inline simdjson_result simdjson_result::get() & noexcept = delete; -template<> simdjson_inline simdjson_result simdjson_result::get() && noexcept { +template<> simdjson_deprecated simdjson_inline simdjson_result simdjson_result::get() && noexcept { if (error()) { return error(); } return std::forward(first); } @@ -105728,8 +105741,6 @@ simdjson_inline simdjson_result::simdjson_result( /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array_iterator.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_path_to_pointer_conversion.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_path_to_pointer_conversion-inl.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */ @@ -106275,9 +106286,9 @@ simdjson_inline simdjson_result simdjson_result implementation{}; + std::unique_ptr implementation{}; size_t _capacity{0}; size_t _max_capacity; size_t _max_depth{DEFAULT_MAX_DEPTH}; @@ -111150,7 +111161,7 @@ class document { " You may also add support for custom types, see our documentation."); } /** @overload template simdjson_result get() & noexcept */ - template simdjson_inline simdjson_result get() && noexcept { + template simdjson_deprecated simdjson_inline simdjson_result get() && noexcept { // Unless the simdjson library or the user provides an inline implementation, calling this method should // immediately fail. static_assert(!sizeof(T), "The get method with given type is not implemented by the simdjson library. " @@ -111173,7 +111184,7 @@ class document { */ template simdjson_inline error_code get(T &out) & noexcept; /** @overload template error_code get(T &out) & noexcept */ - template simdjson_inline error_code get(T &out) && noexcept; + template simdjson_deprecated simdjson_inline error_code get(T &out) && noexcept; #if SIMDJSON_EXCEPTIONS /** @@ -111186,7 +111197,10 @@ class document { * @returns An instance of type T */ template - explicit simdjson_inline operator T() noexcept(false); + explicit simdjson_inline operator T() & noexcept(false); + template + explicit simdjson_deprecated simdjson_inline operator T() && noexcept(false); + /** * Cast this JSON value to an array. * @@ -111752,7 +111766,7 @@ struct simdjson_result : public lasx::implementation_s simdjson_inline simdjson_result is_null() noexcept; template simdjson_inline simdjson_result get() & noexcept; - template simdjson_inline simdjson_result get() && noexcept; + template simdjson_deprecated simdjson_inline simdjson_result get() && noexcept; template simdjson_inline error_code get(T &out) & noexcept; template simdjson_inline error_code get(T &out) && noexcept; @@ -112192,7 +112206,7 @@ class document_stream { friend class document; friend class json_iterator; friend struct simdjson_result; - friend struct internal::simdjson_result_base; + friend struct simdjson::internal::simdjson_result_base; }; // document_stream } // namespace ondemand @@ -113154,16 +113168,14 @@ simdjson_inline simdjson_result &simdjson_result /* amalgamation skipped (editor-only): #ifndef SIMDJSON_CONDITIONAL_INCLUDE */ /* amalgamation skipped (editor-only): #define SIMDJSON_GENERIC_ONDEMAND_DOCUMENT_INL_H */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/base.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array-inl.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array_iterator.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/document.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator-inl.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_path_to_pointer_conversion.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_path_to_pointer_conversion-inl.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object-inl.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array-inl.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator-inl.h" */ +/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object-inl.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/value_iterator-inl.h" */ /* amalgamation skipped (editor-only): #endif // SIMDJSON_CONDITIONAL_INCLUDE */ @@ -113318,24 +113330,26 @@ template<> simdjson_inline simdjson_result document::get() & noexcept { template<> simdjson_inline simdjson_result document::get() & noexcept { return get_bool(); } template<> simdjson_inline simdjson_result document::get() & noexcept { return get_value(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return get_raw_json_string(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return get_string(false); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_double(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_uint64(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_int64(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_bool(); } -template<> simdjson_inline simdjson_result document::get() && noexcept { return get_value(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return get_raw_json_string(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return get_string(false); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_double(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_uint64(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_int64(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return std::forward(*this).get_bool(); } +template<> simdjson_deprecated simdjson_inline simdjson_result document::get() && noexcept { return get_value(); } template simdjson_inline error_code document::get(T &out) & noexcept { return get().get(out); } -template simdjson_inline error_code document::get(T &out) && noexcept { +template simdjson_deprecated simdjson_inline error_code document::get(T &out) && noexcept { return std::forward(*this).get().get(out); } #if SIMDJSON_EXCEPTIONS template -simdjson_inline document::operator T() noexcept(false) { return get(); } +simdjson_deprecated simdjson_inline document::operator T() && noexcept(false) { return get(); } +template +simdjson_inline document::operator T() & noexcept(false) { return get(); } simdjson_inline document::operator array() & noexcept(false) { return get_array(); } simdjson_inline document::operator object() & noexcept(false) { return get_object(); } simdjson_inline document::operator uint64_t() noexcept(false) { return get_uint64(); } @@ -113622,7 +113636,7 @@ simdjson_inline simdjson_result simdjson_result::ge return first.get(); } template -simdjson_inline simdjson_result simdjson_result::get() && noexcept { +simdjson_deprecated simdjson_inline simdjson_result simdjson_result::get() && noexcept { if (error()) { return error(); } return std::forward(first).get(); } @@ -113638,7 +113652,7 @@ simdjson_inline error_code simdjson_result::get(T &out } template<> simdjson_inline simdjson_result simdjson_result::get() & noexcept = delete; -template<> simdjson_inline simdjson_result simdjson_result::get() && noexcept { +template<> simdjson_deprecated simdjson_inline simdjson_result simdjson_result::get() && noexcept { if (error()) { return error(); } return std::forward(first); } @@ -116607,8 +116621,6 @@ simdjson_inline simdjson_result::simdjson_result /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/array_iterator.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_iterator.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_path_to_pointer_conversion.h" */ -/* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_path_to_pointer_conversion-inl.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/json_type.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/object.h" */ /* amalgamation skipped (editor-only): #include "simdjson/generic/ondemand/raw_json_string.h" */ @@ -117154,9 +117166,9 @@ simdjson_inline simdjson_result simdjson_result #include +static_assert(sizeof(uint8_t) == sizeof(char), + "simdutf requires that uint8_t be a char"); +static_assert(sizeof(uint16_t) == sizeof(char16_t), + "simdutf requires that char16_t be 16 bits"); +static_assert(sizeof(uint32_t) == sizeof(char32_t), + "simdutf requires that char32_t be 32 bits"); +// next line is redundant, but it is kept to catch defective systems. +static_assert(CHAR_BIT == 8, "simdutf requires 8-bit bytes"); + // Useful for debugging purposes namespace simdutf { namespace { @@ -6410,43 +6419,42 @@ SIMDUTF_UNTARGET_REGION #endif // SIMDUTF_RVV_H /* end file src/simdutf/rvv.h */ -/* begin file src/simdutf/fallback.h */ -#ifndef SIMDUTF_FALLBACK_H -#define SIMDUTF_FALLBACK_H +/* begin file src/simdutf/lsx.h */ +#ifndef SIMDUTF_LSX_H +#define SIMDUTF_LSX_H +#ifdef SIMDUTF_FALLBACK_H + #error "lsx.h must be included before fallback.h" +#endif -// Note that fallback.h is always imported last. -// Default Fallback to on unless a builtin implementation has already been -// selected. -#ifndef SIMDUTF_IMPLEMENTATION_FALLBACK - #if SIMDUTF_CAN_ALWAYS_RUN_ARM64 || SIMDUTF_CAN_ALWAYS_RUN_ICELAKE || \ - SIMDUTF_CAN_ALWAYS_RUN_HASWELL || SIMDUTF_CAN_ALWAYS_RUN_WESTMERE || \ - SIMDUTF_CAN_ALWAYS_RUN_PPC64 || SIMDUTF_CAN_ALWAYS_RUN_RVV - #define SIMDUTF_IMPLEMENTATION_FALLBACK 0 - #else - #define SIMDUTF_IMPLEMENTATION_FALLBACK 1 - #endif +#ifndef SIMDUTF_IMPLEMENTATION_LSX + #define SIMDUTF_IMPLEMENTATION_LSX (SIMDUTF_IS_LSX) +#endif +#if SIMDUTF_IMPLEMENTATION_LSX && SIMDUTF_IS_LSX + #define SIMDUTF_CAN_ALWAYS_RUN_LSX 1 +#else + #define SIMDUTF_CAN_ALWAYS_RUN_LSX 0 #endif #define SIMDUTF_CAN_ALWAYS_RUN_FALLBACK (SIMDUTF_IMPLEMENTATION_FALLBACK) -#if SIMDUTF_IMPLEMENTATION_FALLBACK +#if SIMDUTF_IMPLEMENTATION_LSX namespace simdutf { /** - * Fallback implementation (runs on any machine). + * Implementation for LoongArch SX. */ -namespace fallback {} // namespace fallback +namespace lsx {} // namespace lsx } // namespace simdutf -/* begin file src/simdutf/fallback/implementation.h */ -#ifndef SIMDUTF_FALLBACK_IMPLEMENTATION_H -#define SIMDUTF_FALLBACK_IMPLEMENTATION_H +/* begin file src/simdutf/lsx/implementation.h */ +#ifndef SIMDUTF_LSX_IMPLEMENTATION_H +#define SIMDUTF_LSX_IMPLEMENTATION_H namespace simdutf { -namespace fallback { +namespace lsx { namespace { using namespace simdutf; @@ -6455,8 +6463,8 @@ using namespace simdutf; class implementation final : public simdutf::implementation { public: simdutf_really_inline implementation() - : simdutf::implementation("fallback", "Generic fallback implementation", - 0) {} + : simdutf::implementation("lsx", "LOONGARCH SX", + internal::instruction_set::LSX) {} simdutf_warn_unused int detect_encodings(const char *input, size_t length) const noexcept final; simdutf_warn_unused bool validate_utf8(const char *buf, @@ -6541,12 +6549,6 @@ class implementation final : public simdutf::implementation { const char16_t *buf, size_t len, char *utf8_buffer) const noexcept final; simdutf_warn_unused size_t convert_valid_utf16be_to_utf8( const char16_t *buf, size_t len, char *utf8_buffer) const noexcept final; - simdutf_warn_unused size_t convert_utf32_to_utf8( - const char32_t *buf, size_t len, char *utf8_buffer) const noexcept final; - simdutf_warn_unused result convert_utf32_to_utf8_with_errors( - const char32_t *buf, size_t len, char *utf8_buffer) const noexcept final; - simdutf_warn_unused size_t convert_valid_utf32_to_utf8( - const char32_t *buf, size_t len, char *utf8_buffer) const noexcept final; simdutf_warn_unused size_t convert_utf32_to_latin1(const char32_t *buf, size_t len, char *latin1_output) const noexcept final; @@ -6556,6 +6558,12 @@ class implementation final : public simdutf::implementation { simdutf_warn_unused size_t convert_valid_utf32_to_latin1(const char32_t *buf, size_t len, char *latin1_output) const noexcept final; + simdutf_warn_unused size_t convert_utf32_to_utf8( + const char32_t *buf, size_t len, char *utf8_buffer) const noexcept final; + simdutf_warn_unused result convert_utf32_to_utf8_with_errors( + const char32_t *buf, size_t len, char *utf8_buffer) const noexcept final; + simdutf_warn_unused size_t convert_valid_utf32_to_utf8( + const char32_t *buf, size_t len, char *utf8_buffer) const noexcept final; simdutf_warn_unused size_t convert_utf32_to_utf16le(const char32_t *buf, size_t len, char16_t *utf16_buffer) const noexcept final; @@ -6630,3377 +6638,6228 @@ class implementation final : public simdutf::implementation { utf8_length_from_latin1(const char *input, size_t length) const noexcept; simdutf_warn_unused size_t maximal_binary_length_from_base64( const char *input, size_t length) const noexcept; - simdutf_warn_unused result base64_to_binary( - const char *input, size_t length, char *output, base64_options options, - last_chunk_handling_options last_chunk_options) const noexcept; - simdutf_warn_unused full_result base64_to_binary_details( - const char *input, size_t length, char *output, base64_options options, - last_chunk_handling_options last_chunk_options = - last_chunk_handling_options::loose) const noexcept; + simdutf_warn_unused result + base64_to_binary(const char *input, size_t length, char *output, + base64_options options) const noexcept; simdutf_warn_unused size_t maximal_binary_length_from_base64( const char16_t *input, size_t length) const noexcept; - simdutf_warn_unused result base64_to_binary( - const char16_t *input, size_t length, char *output, - base64_options options, - last_chunk_handling_options last_chunk_options) const noexcept; + simdutf_warn_unused result + base64_to_binary(const char16_t *input, size_t length, char *output, + base64_options options) const noexcept; simdutf_warn_unused size_t base64_length_from_binary( size_t length, base64_options options) const noexcept; - simdutf_warn_unused full_result base64_to_binary_details( + size_t binary_to_base64(const char *input, size_t length, char *output, + base64_options options) const noexcept; + + simdutf_warn_unused virtual result + base64_to_binary(const char *input, size_t length, char *output, + base64_options options, + last_chunk_handling_options last_chunk_options = + last_chunk_handling_options::loose) const noexcept; + simdutf_warn_unused virtual full_result base64_to_binary_details( + const char *input, size_t length, char *output, base64_options options, + last_chunk_handling_options last_chunk_options = + last_chunk_handling_options::loose) const noexcept; + simdutf_warn_unused virtual result + base64_to_binary(const char16_t *input, size_t length, char *output, + base64_options options, + last_chunk_handling_options last_chunk_options = + last_chunk_handling_options::loose) const noexcept; + simdutf_warn_unused virtual full_result base64_to_binary_details( const char16_t *input, size_t length, char *output, base64_options options, last_chunk_handling_options last_chunk_options = last_chunk_handling_options::loose) const noexcept; - size_t binary_to_base64(const char *input, size_t length, char *output, - base64_options options) const noexcept; }; -} // namespace fallback + +} // namespace lsx } // namespace simdutf -#endif // SIMDUTF_FALLBACK_IMPLEMENTATION_H -/* end file src/simdutf/fallback/implementation.h */ +#endif // SIMDUTF_LSX_IMPLEMENTATION_H +/* end file src/simdutf/lsx/implementation.h */ -/* begin file src/simdutf/fallback/begin.h */ -// redefining SIMDUTF_IMPLEMENTATION to "fallback" -// #define SIMDUTF_IMPLEMENTATION fallback -/* end file src/simdutf/fallback/begin.h */ +/* begin file src/simdutf/lsx/begin.h */ +// redefining SIMDUTF_IMPLEMENTATION to "lsx" +// #define SIMDUTF_IMPLEMENTATION lsx +/* end file src/simdutf/lsx/begin.h */ // Declarations -/* begin file src/simdutf/fallback/bitmanipulation.h */ -#ifndef SIMDUTF_FALLBACK_BITMANIPULATION_H -#define SIMDUTF_FALLBACK_BITMANIPULATION_H +/* begin file src/simdutf/lsx/intrinsics.h */ +#ifndef SIMDUTF_LSX_INTRINSICS_H +#define SIMDUTF_LSX_INTRINSICS_H + + +// This should be the correct header whether +// you use visual studio or other compilers. +#include + +#endif // SIMDUTF_LSX_INTRINSICS_H +/* end file src/simdutf/lsx/intrinsics.h */ +/* begin file src/simdutf/lsx/bitmanipulation.h */ +#ifndef SIMDUTF_LSX_BITMANIPULATION_H +#define SIMDUTF_LSX_BITMANIPULATION_H #include namespace simdutf { -namespace fallback { -namespace {} // unnamed namespace -} // namespace fallback -} // namespace simdutf +namespace lsx { +namespace { -#endif // SIMDUTF_FALLBACK_BITMANIPULATION_H -/* end file src/simdutf/fallback/bitmanipulation.h */ +simdutf_really_inline int count_ones(uint64_t input_num) { + return __lsx_vpickve2gr_w(__lsx_vpcnt_d(__lsx_vreplgr2vr_d(input_num)), 0); +} -/* begin file src/simdutf/fallback/end.h */ -/* end file src/simdutf/fallback/end.h */ +#if SIMDUTF_NEED_TRAILING_ZEROES +simdutf_really_inline int trailing_zeroes(uint64_t input_num) { + return __builtin_ctzll(input_num); +} +#endif -#endif // SIMDUTF_IMPLEMENTATION_FALLBACK -#endif // SIMDUTF_FALLBACK_H -/* end file src/simdutf/fallback.h */ +} // unnamed namespace +} // namespace lsx +} // namespace simdutf -/* begin file src/scalar/utf8.h */ -#ifndef SIMDUTF_UTF8_H -#define SIMDUTF_UTF8_H +#endif // SIMDUTF_LSX_BITMANIPULATION_H +/* end file src/simdutf/lsx/bitmanipulation.h */ +/* begin file src/simdutf/lsx/simd.h */ +#ifndef SIMDUTF_LSX_SIMD_H +#define SIMDUTF_LSX_SIMD_H + +#include namespace simdutf { -namespace scalar { +namespace lsx { namespace { -namespace utf8 { -#if SIMDUTF_IMPLEMENTATION_FALLBACK || SIMDUTF_IMPLEMENTATION_RVV -// only used by the fallback kernel. -// credit: based on code from Google Fuchsia (Apache Licensed) -inline simdutf_warn_unused bool validate(const char *buf, size_t len) noexcept { - const uint8_t *data = reinterpret_cast(buf); - uint64_t pos = 0; - uint32_t code_point = 0; - while (pos < len) { - // check of the next 16 bytes are ascii. - uint64_t next_pos = pos + 16; - if (next_pos <= - len) { // if it is safe to read 16 more bytes, check that they are ascii - uint64_t v1; - std::memcpy(&v1, data + pos, sizeof(uint64_t)); - uint64_t v2; - std::memcpy(&v2, data + pos + sizeof(uint64_t), sizeof(uint64_t)); - uint64_t v{v1 | v2}; - if ((v & 0x8080808080808080) == 0) { - pos = next_pos; - continue; - } - } - unsigned char byte = data[pos]; +namespace simd { - while (byte < 0b10000000) { - if (++pos == len) { - return true; - } - byte = data[pos]; - } +template struct simd8; - if ((byte & 0b11100000) == 0b11000000) { - next_pos = pos + 2; - if (next_pos > len) { - return false; - } - if ((data[pos + 1] & 0b11000000) != 0b10000000) { - return false; - } - // range check - code_point = (byte & 0b00011111) << 6 | (data[pos + 1] & 0b00111111); - if ((code_point < 0x80) || (0x7ff < code_point)) { - return false; - } - } else if ((byte & 0b11110000) == 0b11100000) { - next_pos = pos + 3; - if (next_pos > len) { - return false; - } - if ((data[pos + 1] & 0b11000000) != 0b10000000) { - return false; - } - if ((data[pos + 2] & 0b11000000) != 0b10000000) { - return false; - } - // range check - code_point = (byte & 0b00001111) << 12 | - (data[pos + 1] & 0b00111111) << 6 | - (data[pos + 2] & 0b00111111); - if ((code_point < 0x800) || (0xffff < code_point) || - (0xd7ff < code_point && code_point < 0xe000)) { - return false; - } - } else if ((byte & 0b11111000) == 0b11110000) { // 0b11110000 - next_pos = pos + 4; - if (next_pos > len) { - return false; - } - if ((data[pos + 1] & 0b11000000) != 0b10000000) { - return false; - } - if ((data[pos + 2] & 0b11000000) != 0b10000000) { - return false; - } - if ((data[pos + 3] & 0b11000000) != 0b10000000) { - return false; - } - // range check - code_point = - (byte & 0b00000111) << 18 | (data[pos + 1] & 0b00111111) << 12 | - (data[pos + 2] & 0b00111111) << 6 | (data[pos + 3] & 0b00111111); - if (code_point <= 0xffff || 0x10ffff < code_point) { - return false; - } - } else { - // we may have a continuation - return false; - } - pos = next_pos; - } - return true; -} -#endif +// +// Base class of simd8 and simd8, both of which use __m128i +// internally. +// +template > struct base_u8 { + __m128i value; + static const int SIZE = sizeof(value); -inline simdutf_warn_unused result validate_with_errors(const char *buf, - size_t len) noexcept { - const uint8_t *data = reinterpret_cast(buf); - size_t pos = 0; - uint32_t code_point = 0; - while (pos < len) { - // check of the next 16 bytes are ascii. - size_t next_pos = pos + 16; - if (next_pos <= - len) { // if it is safe to read 16 more bytes, check that they are ascii - uint64_t v1; - std::memcpy(&v1, data + pos, sizeof(uint64_t)); - uint64_t v2; - std::memcpy(&v2, data + pos + sizeof(uint64_t), sizeof(uint64_t)); - uint64_t v{v1 | v2}; - if ((v & 0x8080808080808080) == 0) { - pos = next_pos; - continue; - } - } - unsigned char byte = data[pos]; + // Conversion from/to SIMD register + simdutf_really_inline base_u8(const __m128i _value) : value(_value) {} + simdutf_really_inline operator const __m128i &() const { return this->value; } + simdutf_really_inline operator __m128i &() { return this->value; } + simdutf_really_inline T first() const { + return __lsx_vpickve2gr_bu(this->value, 0); + } + simdutf_really_inline T last() const { + return __lsx_vpickve2gr_bu(this->value, 15); + } - while (byte < 0b10000000) { - if (++pos == len) { - return result(error_code::SUCCESS, len); - } - byte = data[pos]; - } + // Bit operations + simdutf_really_inline simd8 operator|(const simd8 other) const { + return __lsx_vor_v(this->value, other); + } + simdutf_really_inline simd8 operator&(const simd8 other) const { + return __lsx_vand_v(this->value, other); + } + simdutf_really_inline simd8 operator^(const simd8 other) const { + return __lsx_vxor_v(this->value, other); + } + simdutf_really_inline simd8 bit_andnot(const simd8 other) const { + return __lsx_vandn_v(this->value, other); + } + simdutf_really_inline simd8 operator~() const { return *this ^ 0xFFu; } + simdutf_really_inline simd8 &operator|=(const simd8 other) { + auto this_cast = static_cast *>(this); + *this_cast = *this_cast | other; + return *this_cast; + } + simdutf_really_inline simd8 &operator&=(const simd8 other) { + auto this_cast = static_cast *>(this); + *this_cast = *this_cast & other; + return *this_cast; + } + simdutf_really_inline simd8 &operator^=(const simd8 other) { + auto this_cast = static_cast *>(this); + *this_cast = *this_cast ^ other; + return *this_cast; + } - if ((byte & 0b11100000) == 0b11000000) { - next_pos = pos + 2; - if (next_pos > len) { - return result(error_code::TOO_SHORT, pos); - } - if ((data[pos + 1] & 0b11000000) != 0b10000000) { - return result(error_code::TOO_SHORT, pos); - } - // range check - code_point = (byte & 0b00011111) << 6 | (data[pos + 1] & 0b00111111); - if ((code_point < 0x80) || (0x7ff < code_point)) { - return result(error_code::OVERLONG, pos); - } - } else if ((byte & 0b11110000) == 0b11100000) { - next_pos = pos + 3; - if (next_pos > len) { - return result(error_code::TOO_SHORT, pos); - } - if ((data[pos + 1] & 0b11000000) != 0b10000000) { - return result(error_code::TOO_SHORT, pos); - } - if ((data[pos + 2] & 0b11000000) != 0b10000000) { - return result(error_code::TOO_SHORT, pos); - } - // range check - code_point = (byte & 0b00001111) << 12 | - (data[pos + 1] & 0b00111111) << 6 | - (data[pos + 2] & 0b00111111); - if ((code_point < 0x800) || (0xffff < code_point)) { - return result(error_code::OVERLONG, pos); - } - if (0xd7ff < code_point && code_point < 0xe000) { - return result(error_code::SURROGATE, pos); - } - } else if ((byte & 0b11111000) == 0b11110000) { // 0b11110000 - next_pos = pos + 4; - if (next_pos > len) { - return result(error_code::TOO_SHORT, pos); - } - if ((data[pos + 1] & 0b11000000) != 0b10000000) { - return result(error_code::TOO_SHORT, pos); - } - if ((data[pos + 2] & 0b11000000) != 0b10000000) { - return result(error_code::TOO_SHORT, pos); - } - if ((data[pos + 3] & 0b11000000) != 0b10000000) { - return result(error_code::TOO_SHORT, pos); - } - // range check - code_point = - (byte & 0b00000111) << 18 | (data[pos + 1] & 0b00111111) << 12 | - (data[pos + 2] & 0b00111111) << 6 | (data[pos + 3] & 0b00111111); - if (code_point <= 0xffff) { - return result(error_code::OVERLONG, pos); - } - if (0x10ffff < code_point) { - return result(error_code::TOO_LARGE, pos); - } - } else { - // we either have too many continuation bytes or an invalid leading byte - if ((byte & 0b11000000) == 0b10000000) { - return result(error_code::TOO_LONG, pos); - } else { - return result(error_code::HEADER_BITS, pos); - } - } - pos = next_pos; + friend simdutf_really_inline Mask operator==(const simd8 lhs, + const simd8 rhs) { + return __lsx_vseq_b(lhs, rhs); } - return result(error_code::SUCCESS, len); -} -// Finds the previous leading byte starting backward from buf and validates with -// errors from there Used to pinpoint the location of an error when an invalid -// chunk is detected We assume that the stream starts with a leading byte, and -// to check that it is the case, we ask that you pass a pointer to the start of -// the stream (start). -inline simdutf_warn_unused result rewind_and_validate_with_errors( - const char *start, const char *buf, size_t len) noexcept { - // First check that we start with a leading byte - if ((*start & 0b11000000) == 0b10000000) { - return result(error_code::TOO_LONG, 0); + template + simdutf_really_inline simd8 prev(const simd8 prev_chunk) const { + return __lsx_vor_v(__lsx_vbsll_v(this->value, N), + __lsx_vbsrl_v(prev_chunk.value, 16 - N)); } - size_t extra_len{0}; - // A leading byte cannot be further than 4 bytes away - for (int i = 0; i < 5; i++) { - unsigned char byte = *buf; - if ((byte & 0b11000000) != 0b10000000) { - break; - } else { - buf--; - extra_len++; - } +}; + +// SIMD byte mask type (returned by things like eq and gt) +template <> struct simd8 : base_u8 { + typedef uint16_t bitmask_t; + typedef uint32_t bitmask2_t; + + static simdutf_really_inline simd8 splat(bool _value) { + return __lsx_vreplgr2vr_b(uint8_t(-(!!_value))); } - result res = validate_with_errors(buf, len + extra_len); - res.count -= extra_len; - return res; -} + simdutf_really_inline simd8(const __m128i _value) : base_u8(_value) {} + // False constructor + simdutf_really_inline simd8() : simd8(__lsx_vldi(0)) {} + // Splat constructor + simdutf_really_inline simd8(bool _value) : simd8(splat(_value)) {} + simdutf_really_inline void store(uint8_t dst[16]) const { + return __lsx_vst(this->value, dst, 0); + } -inline size_t count_code_points(const char *buf, size_t len) { - const int8_t *p = reinterpret_cast(buf); - size_t counter{0}; - for (size_t i = 0; i < len; i++) { - // -65 is 0b10111111, anything larger in two-complement's should start a new - // code point. - if (p[i] > -65) { - counter++; - } + simdutf_really_inline uint32_t to_bitmask() const { + return __lsx_vpickve2gr_wu(__lsx_vmsknz_b(*this), 0); } - return counter; -} -inline size_t utf16_length_from_utf8(const char *buf, size_t len) { - const int8_t *p = reinterpret_cast(buf); - size_t counter{0}; - for (size_t i = 0; i < len; i++) { - if (p[i] > -65) { - counter++; - } - if (uint8_t(p[i]) >= 240) { - counter++; - } + simdutf_really_inline bool any() const { + return __lsx_vpickve2gr_hu(__lsx_vmsknz_b(*this), 0) != 0; } - return counter; -} + simdutf_really_inline bool none() const { + return __lsx_vpickve2gr_hu(__lsx_vmsknz_b(*this), 0) == 0; + } + simdutf_really_inline bool all() const { + return __lsx_vpickve2gr_hu(__lsx_vmsknz_b(*this), 0) == 0xFFFF; + } +}; -simdutf_warn_unused inline size_t trim_partial_utf8(const char *input, - size_t length) { - if (length < 3) { - switch (length) { - case 2: - if (uint8_t(input[length - 1]) >= 0xc0) { - return length - 1; - } // 2-, 3- and 4-byte characters with only 1 byte left - if (uint8_t(input[length - 2]) >= 0xe0) { - return length - 2; - } // 3- and 4-byte characters with only 2 bytes left - return length; - case 1: - if (uint8_t(input[length - 1]) >= 0xc0) { - return length - 1; - } // 2-, 3- and 4-byte characters with only 1 byte left - return length; - case 0: - return length; - } +// Unsigned bytes +template <> struct simd8 : base_u8 { + static simdutf_really_inline simd8 splat(uint8_t _value) { + return __lsx_vreplgr2vr_b(_value); } - if (uint8_t(input[length - 1]) >= 0xc0) { - return length - 1; - } // 2-, 3- and 4-byte characters with only 1 byte left - if (uint8_t(input[length - 2]) >= 0xe0) { - return length - 2; - } // 3- and 4-byte characters with only 1 byte left - if (uint8_t(input[length - 3]) >= 0xf0) { - return length - 3; - } // 4-byte characters with only 3 bytes left - return length; -} + static simdutf_really_inline simd8 zero() { return __lsx_vldi(0); } + static simdutf_really_inline simd8 load(const uint8_t *values) { + return __lsx_vld(values, 0); + } + simdutf_really_inline simd8(const __m128i _value) + : base_u8(_value) {} + // Zero constructor + simdutf_really_inline simd8() : simd8(zero()) {} + // Array constructor + simdutf_really_inline simd8(const uint8_t values[16]) : simd8(load(values)) {} + // Splat constructor + simdutf_really_inline simd8(uint8_t _value) : simd8(splat(_value)) {} + // Member-by-member initialization -} // namespace utf8 -} // unnamed namespace -} // namespace scalar -} // namespace simdutf + simdutf_really_inline + simd8(uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, + uint8_t v6, uint8_t v7, uint8_t v8, uint8_t v9, uint8_t v10, + uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15) + : simd8((__m128i)v16u8{v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, + v12, v13, v14, v15}) {} -#endif -/* end file src/scalar/utf8.h */ -/* begin file src/scalar/utf16.h */ -#ifndef SIMDUTF_UTF16_H -#define SIMDUTF_UTF16_H + // Repeat 16 values as many times as necessary (usually for lookup tables) + simdutf_really_inline static simd8 + repeat_16(uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, + uint8_t v5, uint8_t v6, uint8_t v7, uint8_t v8, uint8_t v9, + uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, + uint8_t v15) { + return simd8(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, + v13, v14, v15); + } -namespace simdutf { -namespace scalar { -namespace { -namespace utf16 { + // Store to array + simdutf_really_inline void store(uint8_t dst[16]) const { + return __lsx_vst(this->value, dst, 0); + } -inline simdutf_warn_unused uint16_t swap_bytes(const uint16_t word) { - return uint16_t((word >> 8) | (word << 8)); -} + // Saturated math + simdutf_really_inline simd8 + saturating_add(const simd8 other) const { + return __lsx_vsadd_bu(this->value, other); + } + simdutf_really_inline simd8 + saturating_sub(const simd8 other) const { + return __lsx_vssub_bu(this->value, other); + } -template -inline simdutf_warn_unused bool validate(const char16_t *buf, - size_t len) noexcept { - const uint16_t *data = reinterpret_cast(buf); - uint64_t pos = 0; - while (pos < len) { - uint16_t word = - !match_system(big_endian) ? swap_bytes(data[pos]) : data[pos]; - if ((word & 0xF800) == 0xD800) { - if (pos + 1 >= len) { - return false; - } - uint16_t diff = uint16_t(word - 0xD800); - if (diff > 0x3FF) { - return false; - } - uint16_t next_word = - !match_system(big_endian) ? swap_bytes(data[pos + 1]) : data[pos + 1]; - uint16_t diff2 = uint16_t(next_word - 0xDC00); - if (diff2 > 0x3FF) { - return false; - } - pos += 2; - } else { - pos++; - } + // Addition/subtraction are the same for signed and unsigned + simdutf_really_inline simd8 + operator+(const simd8 other) const { + return __lsx_vadd_b(this->value, other); } - return true; -} - -template -inline simdutf_warn_unused result validate_with_errors(const char16_t *buf, - size_t len) noexcept { - const uint16_t *data = reinterpret_cast(buf); - size_t pos = 0; - while (pos < len) { - uint16_t word = - !match_system(big_endian) ? swap_bytes(data[pos]) : data[pos]; - if ((word & 0xF800) == 0xD800) { - if (pos + 1 >= len) { - return result(error_code::SURROGATE, pos); - } - uint16_t diff = uint16_t(word - 0xD800); - if (diff > 0x3FF) { - return result(error_code::SURROGATE, pos); - } - uint16_t next_word = - !match_system(big_endian) ? swap_bytes(data[pos + 1]) : data[pos + 1]; - uint16_t diff2 = uint16_t(next_word - 0xDC00); - if (diff2 > 0x3FF) { - return result(error_code::SURROGATE, pos); - } - pos += 2; - } else { - pos++; - } + simdutf_really_inline simd8 + operator-(const simd8 other) const { + return __lsx_vsub_b(this->value, other); } - return result(error_code::SUCCESS, pos); -} - -template -inline size_t count_code_points(const char16_t *buf, size_t len) { - // We are not BOM aware. - const uint16_t *p = reinterpret_cast(buf); - size_t counter{0}; - for (size_t i = 0; i < len; i++) { - uint16_t word = !match_system(big_endian) ? swap_bytes(p[i]) : p[i]; - counter += ((word & 0xFC00) != 0xDC00); + simdutf_really_inline simd8 &operator+=(const simd8 other) { + *this = *this + other; + return *this; } - return counter; -} - -template -inline size_t utf8_length_from_utf16(const char16_t *buf, size_t len) { - // We are not BOM aware. - const uint16_t *p = reinterpret_cast(buf); - size_t counter{0}; - for (size_t i = 0; i < len; i++) { - uint16_t word = !match_system(big_endian) ? swap_bytes(p[i]) : p[i]; - counter++; // ASCII - counter += static_cast( - word > - 0x7F); // non-ASCII is at least 2 bytes, surrogates are 2*2 == 4 bytes - counter += static_cast((word > 0x7FF && word <= 0xD7FF) || - (word >= 0xE000)); // three-byte + simdutf_really_inline simd8 &operator-=(const simd8 other) { + *this = *this - other; + return *this; } - return counter; -} -template -inline size_t utf32_length_from_utf16(const char16_t *buf, size_t len) { - // We are not BOM aware. - const uint16_t *p = reinterpret_cast(buf); - size_t counter{0}; - for (size_t i = 0; i < len; i++) { - uint16_t word = !match_system(big_endian) ? swap_bytes(p[i]) : p[i]; - counter += ((word & 0xFC00) != 0xDC00); + // Order-specific operations + simdutf_really_inline simd8 + max_val(const simd8 other) const { + return __lsx_vmax_bu(*this, other); + } + simdutf_really_inline simd8 + min_val(const simd8 other) const { + return __lsx_vmin_bu(*this, other); + } + simdutf_really_inline simd8 + operator<=(const simd8 other) const { + return __lsx_vsle_bu(*this, other); + } + simdutf_really_inline simd8 + operator>=(const simd8 other) const { + return __lsx_vsle_bu(other, *this); + } + simdutf_really_inline simd8 + operator<(const simd8 other) const { + return __lsx_vslt_bu(*this, other); + } + simdutf_really_inline simd8 + operator>(const simd8 other) const { + return __lsx_vslt_bu(other, *this); + } + // Same as >, but instead of guaranteeing all 1's == true, false = 0 and true + // = nonzero. For ARM, returns all 1's. + simdutf_really_inline simd8 + gt_bits(const simd8 other) const { + return simd8(*this > other); + } + // Same as <, but instead of guaranteeing all 1's == true, false = 0 and true + // = nonzero. For ARM, returns all 1's. + simdutf_really_inline simd8 + lt_bits(const simd8 other) const { + return simd8(*this < other); } - return counter; -} -inline size_t latin1_length_from_utf16(size_t len) { return len; } + // Bit-specific operations + simdutf_really_inline simd8 any_bits_set(simd8 bits) const { + return __lsx_vslt_bu(__lsx_vldi(0), __lsx_vand_v(this->value, bits)); + } + simdutf_really_inline bool is_ascii() const { + return __lsx_vpickve2gr_hu(__lsx_vmskgez_b(this->value), 0) == 0xFFFF; + } -simdutf_really_inline void change_endianness_utf16(const char16_t *in, - size_t size, char16_t *out) { - const uint16_t *input = reinterpret_cast(in); - uint16_t *output = reinterpret_cast(out); - for (size_t i = 0; i < size; i++) { - *output++ = uint16_t(input[i] >> 8 | input[i] << 8); + simdutf_really_inline bool any_bits_set_anywhere() const { + return __lsx_vpickve2gr_hu(__lsx_vmsknz_b(this->value), 0) > 0; + } + simdutf_really_inline bool any_bits_set_anywhere(simd8 bits) const { + return (*this & bits).any_bits_set_anywhere(); + } + template simdutf_really_inline simd8 shr() const { + return __lsx_vsrli_b(this->value, N); + } + template simdutf_really_inline simd8 shl() const { + return __lsx_vslli_b(this->value, N); } -} -template -simdutf_warn_unused inline size_t trim_partial_utf16(const char16_t *input, - size_t length) { - if (length <= 1) { - return length; + // Perform a lookup assuming the value is between 0 and 16 (undefined behavior + // for out of range values) + template + simdutf_really_inline simd8 lookup_16(simd8 lookup_table) const { + return lookup_table.apply_lookup_16_to(*this); } - uint16_t last_word = uint16_t(input[length - 1]); - last_word = !match_system(big_endian) ? swap_bytes(last_word) : last_word; - length -= ((last_word & 0xFC00) == 0xD800); - return length; -} -} // namespace utf16 -} // unnamed namespace -} // namespace scalar -} // namespace simdutf + template + simdutf_really_inline simd8 + lookup_16(L replace0, L replace1, L replace2, L replace3, L replace4, + L replace5, L replace6, L replace7, L replace8, L replace9, + L replace10, L replace11, L replace12, L replace13, L replace14, + L replace15) const { + return lookup_16(simd8::repeat_16( + replace0, replace1, replace2, replace3, replace4, replace5, replace6, + replace7, replace8, replace9, replace10, replace11, replace12, + replace13, replace14, replace15)); + } -#endif -/* end file src/scalar/utf16.h */ -/* begin file src/scalar/utf32.h */ -#ifndef SIMDUTF_UTF32_H -#define SIMDUTF_UTF32_H + template + simdutf_really_inline simd8 + apply_lookup_16_to(const simd8 original) const { + __m128i original_tmp = __lsx_vand_v(original, __lsx_vldi(0x1f)); + return __lsx_vshuf_b(__lsx_vldi(0), *this, simd8(original_tmp)); + } +}; -namespace simdutf { -namespace scalar { -namespace { -namespace utf32 { +// Signed bytes +template <> struct simd8 { + __m128i value; -inline simdutf_warn_unused bool validate(const char32_t *buf, - size_t len) noexcept { - const uint32_t *data = reinterpret_cast(buf); - uint64_t pos = 0; - for (; pos < len; pos++) { - uint32_t word = data[pos]; - if (word > 0x10FFFF || (word >= 0xD800 && word <= 0xDFFF)) { - return false; - } + static simdutf_really_inline simd8 splat(int8_t _value) { + return __lsx_vreplgr2vr_b(_value); + } + static simdutf_really_inline simd8 zero() { return __lsx_vldi(0); } + static simdutf_really_inline simd8 load(const int8_t values[16]) { + return __lsx_vld(values, 0); } - return true; -} -inline simdutf_warn_unused result validate_with_errors(const char32_t *buf, - size_t len) noexcept { - const uint32_t *data = reinterpret_cast(buf); - size_t pos = 0; - for (; pos < len; pos++) { - uint32_t word = data[pos]; - if (word > 0x10FFFF) { - return result(error_code::TOO_LARGE, pos); - } - if (word >= 0xD800 && word <= 0xDFFF) { - return result(error_code::SURROGATE, pos); + template + simdutf_really_inline void store_ascii_as_utf16(char16_t *p) const { + __m128i zero = __lsx_vldi(0); + if (match_system(big_endian)) { + __lsx_vst(__lsx_vilvl_b(zero, (__m128i)this->value), + reinterpret_cast(p), 0); + __lsx_vst(__lsx_vilvh_b(zero, (__m128i)this->value), + reinterpret_cast(p + 8), 0); + } else { + __lsx_vst(__lsx_vilvl_b((__m128i)this->value, zero), + reinterpret_cast(p), 0); + __lsx_vst(__lsx_vilvh_b((__m128i)this->value, zero), + reinterpret_cast(p + 8), 0); } } - return result(error_code::SUCCESS, pos); -} -inline size_t utf8_length_from_utf32(const char32_t *buf, size_t len) { - // We are not BOM aware. - const uint32_t *p = reinterpret_cast(buf); - size_t counter{0}; - for (size_t i = 0; i < len; i++) { - // credit: @ttsugriy for the vectorizable approach - counter++; // ASCII - counter += static_cast(p[i] > 0x7F); // two-byte - counter += static_cast(p[i] > 0x7FF); // three-byte - counter += static_cast(p[i] > 0xFFFF); // four-bytes + simdutf_really_inline void store_ascii_as_utf32(char32_t *p) const { + __m128i zero = __lsx_vldi(0); + __m128i in16low = __lsx_vilvl_b(zero, (__m128i)this->value); + __m128i in16high = __lsx_vilvh_b(zero, (__m128i)this->value); + __m128i in32_0 = __lsx_vilvl_h(zero, in16low); + __m128i in32_1 = __lsx_vilvh_h(zero, in16low); + __m128i in32_2 = __lsx_vilvl_h(zero, in16high); + __m128i in32_3 = __lsx_vilvh_h(zero, in16high); + __lsx_vst(in32_0, reinterpret_cast(p), 0); + __lsx_vst(in32_1, reinterpret_cast(p + 4), 0); + __lsx_vst(in32_2, reinterpret_cast(p + 8), 0); + __lsx_vst(in32_3, reinterpret_cast(p + 12), 0); } - return counter; -} -inline size_t utf16_length_from_utf32(const char32_t *buf, size_t len) { - // We are not BOM aware. - const uint32_t *p = reinterpret_cast(buf); - size_t counter{0}; - for (size_t i = 0; i < len; i++) { - counter++; // non-surrogate word - counter += static_cast(p[i] > 0xFFFF); // surrogate pair - } - return counter; -} + // In places where the table can be reused, which is most uses in simdutf, it + // is worth it to do 4 table lookups, as there is no direct zero extension + // from u8 to u32. + simdutf_really_inline void store_ascii_as_utf32_tbl(char32_t *p) const { + const simd8 tb1{0, 255, 255, 255, 1, 255, 255, 255, + 2, 255, 255, 255, 3, 255, 255, 255}; + const simd8 tb2{4, 255, 255, 255, 5, 255, 255, 255, + 6, 255, 255, 255, 7, 255, 255, 255}; + const simd8 tb3{8, 255, 255, 255, 9, 255, 255, 255, + 10, 255, 255, 255, 11, 255, 255, 255}; + const simd8 tb4{12, 255, 255, 255, 13, 255, 255, 255, + 14, 255, 255, 255, 15, 255, 255, 255}; -inline size_t latin1_length_from_utf32(size_t len) { - // We are not BOM aware. - return len; // a utf32 codepoint will always represent 1 latin1 character -} + // encourage store pairing and interleaving + const auto shuf1 = this->apply_lookup_16_to(tb1); + const auto shuf2 = this->apply_lookup_16_to(tb2); + shuf1.store(reinterpret_cast(p)); + shuf2.store(reinterpret_cast(p + 4)); -inline simdutf_warn_unused uint32_t swap_bytes(const uint32_t word) { - return ((word >> 24) & 0xff) | // move byte 3 to byte 0 - ((word << 8) & 0xff0000) | // move byte 1 to byte 2 - ((word >> 8) & 0xff00) | // move byte 2 to byte 1 - ((word << 24) & 0xff000000); // byte 0 to byte 3 -} + const auto shuf3 = this->apply_lookup_16_to(tb3); + const auto shuf4 = this->apply_lookup_16_to(tb4); + shuf3.store(reinterpret_cast(p + 8)); + shuf4.store(reinterpret_cast(p + 12)); + } + // Conversion from/to SIMD register + simdutf_really_inline simd8(const __m128i _value) : value(_value) {} + simdutf_really_inline operator const __m128i &() const { return this->value; } -} // namespace utf32 -} // unnamed namespace -} // namespace scalar -} // namespace simdutf + simdutf_really_inline operator const __m128i() const { return this->value; } -#endif -/* end file src/scalar/utf32.h */ -/* begin file src/scalar/base64.h */ -#ifndef SIMDUTF_BASE64_H -#define SIMDUTF_BASE64_H + simdutf_really_inline operator __m128i &() { return this->value; } -#include -#include -#include -#include + // Zero constructor + simdutf_really_inline simd8() : simd8(zero()) {} + // Splat constructor + simdutf_really_inline simd8(int8_t _value) : simd8(splat(_value)) {} + // Array constructor + simdutf_really_inline simd8(const int8_t *values) : simd8(load(values)) {} + // Member-by-member initialization -namespace simdutf { -namespace scalar { -namespace { -namespace base64 { + simdutf_really_inline simd8(int8_t v0, int8_t v1, int8_t v2, int8_t v3, + int8_t v4, int8_t v5, int8_t v6, int8_t v7, + int8_t v8, int8_t v9, int8_t v10, int8_t v11, + int8_t v12, int8_t v13, int8_t v14, int8_t v15) + : simd8((__m128i)v16i8{v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, + v12, v13, v14, v15}) {} -// This function is not expected to be fast. Do not use in long loops. -template bool is_ascii_white_space(char_type c) { - return c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == '\f'; -} + // Repeat 16 values as many times as necessary (usually for lookup tables) + simdutf_really_inline static simd8 + repeat_16(int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, + int8_t v6, int8_t v7, int8_t v8, int8_t v9, int8_t v10, int8_t v11, + int8_t v12, int8_t v13, int8_t v14, int8_t v15) { + return simd8(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, + v13, v14, v15); + } -template bool is_eight_byte(char_type c) { - if (sizeof(char_type) == 1) { - return true; + // Store to array + simdutf_really_inline void store(int8_t dst[16]) const { + return __lsx_vst(value, dst, 0); } - return uint8_t(c) == c; -} -// Returns true upon success. The destination buffer must be large enough. -// This functions assumes that the padding (=) has been removed. -template -full_result -base64_tail_decode(char *dst, const char_type *src, size_t length, - size_t padded_characters, // number of padding characters - // '=', typically 0, 1, 2. - base64_options options, - last_chunk_handling_options last_chunk_options) { - // This looks like 5 branches, but we expect the compiler to resolve this to a - // single branch: - const uint8_t *to_base64 = (options & base64_url) - ? tables::base64::to_base64_url_value - : tables::base64::to_base64_value; - const uint32_t *d0 = (options & base64_url) - ? tables::base64::base64_url::d0 - : tables::base64::base64_default::d0; - const uint32_t *d1 = (options & base64_url) - ? tables::base64::base64_url::d1 - : tables::base64::base64_default::d1; - const uint32_t *d2 = (options & base64_url) - ? tables::base64::base64_url::d2 - : tables::base64::base64_default::d2; - const uint32_t *d3 = (options & base64_url) - ? tables::base64::base64_url::d3 - : tables::base64::base64_default::d3; + simdutf_really_inline operator simd8() const { + return ((__m128i)this->value); + } - const char_type *srcend = src + length; - const char_type *srcinit = src; - const char *dstinit = dst; + simdutf_really_inline simd8 + operator|(const simd8 other) const { + return __lsx_vor_v((__m128i)value, (__m128i)other.value); + } + simdutf_really_inline simd8 + operator&(const simd8 other) const { + return __lsx_vand_v((__m128i)value, (__m128i)other.value); + } + simdutf_really_inline simd8 + operator^(const simd8 other) const { + return __lsx_vxor_v((__m128i)value, (__m128i)other.value); + } + simdutf_really_inline simd8 + bit_andnot(const simd8 other) const { + return __lsx_vandn_v((__m128i)other.value, (__m128i)value); + } - uint32_t x; - size_t idx; - uint8_t buffer[4]; - while (true) { - while (src + 4 <= srcend && is_eight_byte(src[0]) && - is_eight_byte(src[1]) && is_eight_byte(src[2]) && - is_eight_byte(src[3]) && - (x = d0[uint8_t(src[0])] | d1[uint8_t(src[1])] | - d2[uint8_t(src[2])] | d3[uint8_t(src[3])]) < 0x01FFFFFF) { - if (match_system(endianness::BIG)) { - x = scalar::utf32::swap_bytes(x); - } - std::memcpy(dst, &x, 3); // optimization opportunity: copy 4 bytes - dst += 3; - src += 4; - } - idx = 0; - // we need at least four characters. - while (idx < 4 && src < srcend) { - char_type c = *src; - uint8_t code = to_base64[uint8_t(c)]; - buffer[idx] = uint8_t(code); - if (is_eight_byte(c) && code <= 63) { - idx++; - } else if (code > 64 || !scalar::base64::is_eight_byte(c)) { - return {INVALID_BASE64_CHARACTER, size_t(src - srcinit), - size_t(dst - dstinit)}; - } else { - // We have a space or a newline. We ignore it. - } - src++; - } - if (idx != 4) { - if (last_chunk_options == last_chunk_handling_options::strict && - (idx != 1) && ((idx + padded_characters) & 3) != 0) { - // The partial chunk was at src - idx - return {BASE64_INPUT_REMAINDER, size_t(src - srcinit), - size_t(dst - dstinit)}; - } else if (last_chunk_options == - last_chunk_handling_options::stop_before_partial && - (idx != 1) && ((idx + padded_characters) & 3) != 0) { - // Rewind src to before partial chunk - src -= idx; - return {SUCCESS, size_t(src - srcinit), size_t(dst - dstinit)}; - } else { - if (idx == 2) { - uint32_t triple = - (uint32_t(buffer[0]) << 3 * 6) + (uint32_t(buffer[1]) << 2 * 6); - if ((last_chunk_options == last_chunk_handling_options::strict) && - (triple & 0xffff)) { - return {BASE64_EXTRA_BITS, size_t(src - srcinit), - size_t(dst - dstinit)}; - } - if (match_system(endianness::BIG)) { - triple <<= 8; - std::memcpy(dst, &triple, 1); - } else { - triple = scalar::utf32::swap_bytes(triple); - triple >>= 8; - std::memcpy(dst, &triple, 1); - } - dst += 1; - } else if (idx == 3) { - uint32_t triple = (uint32_t(buffer[0]) << 3 * 6) + - (uint32_t(buffer[1]) << 2 * 6) + - (uint32_t(buffer[2]) << 1 * 6); - if ((last_chunk_options == last_chunk_handling_options::strict) && - (triple & 0xff)) { - return {BASE64_EXTRA_BITS, size_t(src - srcinit), - size_t(dst - dstinit)}; - } - if (match_system(endianness::BIG)) { - triple <<= 8; - std::memcpy(dst, &triple, 2); - } else { - triple = scalar::utf32::swap_bytes(triple); - triple >>= 8; - std::memcpy(dst, &triple, 2); - } - dst += 2; - } else if (idx == 1) { - return {BASE64_INPUT_REMAINDER, size_t(src - srcinit), - size_t(dst - dstinit)}; - } - return {SUCCESS, size_t(src - srcinit), size_t(dst - dstinit)}; - } - } + // Math + simdutf_really_inline simd8 + operator+(const simd8 other) const { + return __lsx_vadd_b((__m128i)value, (__m128i)other.value); + } + simdutf_really_inline simd8 + operator-(const simd8 other) const { + return __lsx_vsub_b((__m128i)value, (__m128i)other.value); + } + simdutf_really_inline simd8 &operator+=(const simd8 other) { + *this = *this + other; + return *this; + } + simdutf_really_inline simd8 &operator-=(const simd8 other) { + *this = *this - other; + return *this; + } - uint32_t triple = - (uint32_t(buffer[0]) << 3 * 6) + (uint32_t(buffer[1]) << 2 * 6) + - (uint32_t(buffer[2]) << 1 * 6) + (uint32_t(buffer[3]) << 0 * 6); - if (match_system(endianness::BIG)) { - triple <<= 8; - std::memcpy(dst, &triple, 3); - } else { - triple = scalar::utf32::swap_bytes(triple); - triple >>= 8; - std::memcpy(dst, &triple, 3); - } - dst += 3; + simdutf_really_inline bool is_ascii() const { + return (__lsx_vpickve2gr_hu(__lsx_vmskgez_b((__m128i)this->value), 0) == + 0xffff); } -} -// like base64_tail_decode, but it will not write past the end of the output -// buffer. The outlen paramter is modified to reflect the number of bytes -// written. This functions assumes that the padding (=) has been removed. -template -result base64_tail_decode_safe( - char *dst, size_t &outlen, const char_type *&srcr, size_t length, - size_t padded_characters, // number of padding characters '=', typically 0, - // 1, 2. - base64_options options, last_chunk_handling_options last_chunk_options) { - const char_type *src = srcr; - if (length == 0) { - outlen = 0; - return {SUCCESS, 0}; + // Order-sensitive comparisons + simdutf_really_inline simd8 max_val(const simd8 other) const { + return __lsx_vmax_b((__m128i)value, (__m128i)other.value); + } + simdutf_really_inline simd8 min_val(const simd8 other) const { + return __lsx_vmin_b((__m128i)value, (__m128i)other.value); + } + simdutf_really_inline simd8 operator>(const simd8 other) const { + return __lsx_vslt_b((__m128i)other.value, (__m128i)value); + } + simdutf_really_inline simd8 operator<(const simd8 other) const { + return __lsx_vslt_b((__m128i)value, (__m128i)other.value); + } + simdutf_really_inline simd8 + operator==(const simd8 other) const { + return __lsx_vseq_b((__m128i)value, (__m128i)other.value); } - // This looks like 5 branches, but we expect the compiler to resolve this to a - // single branch: - const uint8_t *to_base64 = (options & base64_url) - ? tables::base64::to_base64_url_value - : tables::base64::to_base64_value; - const uint32_t *d0 = (options & base64_url) - ? tables::base64::base64_url::d0 - : tables::base64::base64_default::d0; - const uint32_t *d1 = (options & base64_url) - ? tables::base64::base64_url::d1 - : tables::base64::base64_default::d1; - const uint32_t *d2 = (options & base64_url) - ? tables::base64::base64_url::d2 - : tables::base64::base64_default::d2; - const uint32_t *d3 = (options & base64_url) - ? tables::base64::base64_url::d3 - : tables::base64::base64_default::d3; - const char_type *srcend = src + length; - const char_type *srcinit = src; - const char *dstinit = dst; - const char *dstend = dst + outlen; + template + simdutf_really_inline simd8 + prev(const simd8 prev_chunk) const { + return __lsx_vor_v(__lsx_vbsll_v(this->value, N), + __lsx_vbsrl_v(prev_chunk.value, 16 - N)); + } - uint32_t x; - size_t idx; - uint8_t buffer[4]; - while (true) { - while (src + 4 <= srcend && is_eight_byte(src[0]) && - is_eight_byte(src[1]) && is_eight_byte(src[2]) && - is_eight_byte(src[3]) && - (x = d0[uint8_t(src[0])] | d1[uint8_t(src[1])] | - d2[uint8_t(src[2])] | d3[uint8_t(src[3])]) < 0x01FFFFFF) { - if (dstend - dst < 3) { - outlen = size_t(dst - dstinit); - srcr = src; - return {OUTPUT_BUFFER_TOO_SMALL, size_t(src - srcinit)}; - } - if (match_system(endianness::BIG)) { - x = scalar::utf32::swap_bytes(x); - } - std::memcpy(dst, &x, 3); // optimization opportunity: copy 4 bytes - dst += 3; - src += 4; - } - idx = 0; - const char_type *srccur = src; - // We need at least four characters. - while (idx < 4 && src < srcend) { - char_type c = *src; - uint8_t code = to_base64[uint8_t(c)]; - - buffer[idx] = uint8_t(code); - if (is_eight_byte(c) && code <= 63) { - idx++; - } else if (code > 64 || !scalar::base64::is_eight_byte(c)) { - outlen = size_t(dst - dstinit); - srcr = src; - return {INVALID_BASE64_CHARACTER, size_t(src - srcinit)}; - } else { - // We have a space or a newline. We ignore it. - } - src++; - } - if (idx != 4) { - if (last_chunk_options == last_chunk_handling_options::strict && - ((idx + padded_characters) & 3) != 0) { - outlen = size_t(dst - dstinit); - srcr = src; - return {BASE64_INPUT_REMAINDER, size_t(src - srcinit)}; - } else if (last_chunk_options == - last_chunk_handling_options::stop_before_partial && - ((idx + padded_characters) & 3) != 0) { - // Rewind src to before partial chunk - srcr = srccur; - outlen = size_t(dst - dstinit); - return {SUCCESS, size_t(dst - dstinit)}; - } else { // loose mode - if (idx == 0) { - // No data left; return success - outlen = size_t(dst - dstinit); - srcr = src; - return {SUCCESS, size_t(dst - dstinit)}; - } else if (idx == 1) { - // Error: Incomplete chunk of length 1 is invalid in loose mode - outlen = size_t(dst - dstinit); - srcr = src; - return {BASE64_INPUT_REMAINDER, size_t(src - srcinit)}; - } else if (idx == 2 || idx == 3) { - // Check if there's enough space in the destination buffer - size_t required_space = (idx == 2) ? 1 : 2; - if (size_t(dstend - dst) < required_space) { - outlen = size_t(dst - dstinit); - srcr = src; - return {OUTPUT_BUFFER_TOO_SMALL, size_t(srccur - srcinit)}; - } - uint32_t triple = 0; - if (idx == 2) { - triple = (uint32_t(buffer[0]) << 18) + (uint32_t(buffer[1]) << 12); - if ((last_chunk_options == last_chunk_handling_options::strict) && - (triple & 0xffff)) { - srcr = src; - return {BASE64_EXTRA_BITS, size_t(src - srcinit)}; - } - // Extract the first byte - triple >>= 16; - dst[0] = static_cast(triple & 0xFF); - dst += 1; - } else if (idx == 3) { - triple = (uint32_t(buffer[0]) << 18) + (uint32_t(buffer[1]) << 12) + - (uint32_t(buffer[2]) << 6); - if ((last_chunk_options == last_chunk_handling_options::strict) && - (triple & 0xff)) { - srcr = src; - return {BASE64_EXTRA_BITS, size_t(src - srcinit)}; - } - // Extract the first two bytes - triple >>= 8; - dst[0] = static_cast((triple >> 8) & 0xFF); - dst[1] = static_cast(triple & 0xFF); - dst += 2; - } - outlen = size_t(dst - dstinit); - srcr = src; - return {SUCCESS, size_t(dst - dstinit)}; - } - } - } - - if (dstend - dst < 3) { - outlen = size_t(dst - dstinit); - srcr = src; - return {OUTPUT_BUFFER_TOO_SMALL, size_t(srccur - srcinit)}; - } - uint32_t triple = (uint32_t(buffer[0]) << 18) + - (uint32_t(buffer[1]) << 12) + (uint32_t(buffer[2]) << 6) + - (uint32_t(buffer[3])); - if (match_system(endianness::BIG)) { - triple <<= 8; - std::memcpy(dst, &triple, 3); - } else { - triple = scalar::utf32::swap_bytes(triple); - triple >>= 8; - std::memcpy(dst, &triple, 3); - } - dst += 3; + // Perform a lookup assuming no value is larger than 16 + template + simdutf_really_inline simd8 lookup_16(simd8 lookup_table) const { + return lookup_table.apply_lookup_16_to(*this); } -} - -// Returns the number of bytes written. The destination buffer must be large -// enough. It will add padding (=) if needed. -size_t tail_encode_base64(char *dst, const char *src, size_t srclen, - base64_options options) { - // By default, we use padding if we are not using the URL variant. - // This is check with ((options & base64_url) == 0) which returns true if we - // are not using the URL variant. However, we also allow 'inversion' of the - // convention with the base64_reverse_padding option. If the - // base64_reverse_padding option is set, we use padding if we are using the - // URL variant, and we omit it if we are not using the URL variant. This is - // checked with - // ((options & base64_reverse_padding) == base64_reverse_padding). - bool use_padding = - ((options & base64_url) == 0) ^ - ((options & base64_reverse_padding) == base64_reverse_padding); - // This looks like 3 branches, but we expect the compiler to resolve this to - // a single branch: - const char *e0 = (options & base64_url) ? tables::base64::base64_url::e0 - : tables::base64::base64_default::e0; - const char *e1 = (options & base64_url) ? tables::base64::base64_url::e1 - : tables::base64::base64_default::e1; - const char *e2 = (options & base64_url) ? tables::base64::base64_url::e2 - : tables::base64::base64_default::e2; - char *out = dst; - size_t i = 0; - uint8_t t1, t2, t3; - for (; i + 2 < srclen; i += 3) { - t1 = uint8_t(src[i]); - t2 = uint8_t(src[i + 1]); - t3 = uint8_t(src[i + 2]); - *out++ = e0[t1]; - *out++ = e1[((t1 & 0x03) << 4) | ((t2 >> 4) & 0x0F)]; - *out++ = e1[((t2 & 0x0F) << 2) | ((t3 >> 6) & 0x03)]; - *out++ = e2[t3]; + template + simdutf_really_inline simd8 + lookup_16(L replace0, L replace1, L replace2, L replace3, L replace4, + L replace5, L replace6, L replace7, L replace8, L replace9, + L replace10, L replace11, L replace12, L replace13, L replace14, + L replace15) const { + return lookup_16(simd8::repeat_16( + replace0, replace1, replace2, replace3, replace4, replace5, replace6, + replace7, replace8, replace9, replace10, replace11, replace12, + replace13, replace14, replace15)); } - switch (srclen - i) { - case 0: - break; - case 1: - t1 = uint8_t(src[i]); - *out++ = e0[t1]; - *out++ = e1[(t1 & 0x03) << 4]; - if (use_padding) { - *out++ = '='; - *out++ = '='; - } - break; - default: /* case 2 */ - t1 = uint8_t(src[i]); - t2 = uint8_t(src[i + 1]); - *out++ = e0[t1]; - *out++ = e1[((t1 & 0x03) << 4) | ((t2 >> 4) & 0x0F)]; - *out++ = e2[(t2 & 0x0F) << 2]; - if (use_padding) { - *out++ = '='; - } + + template + simdutf_really_inline simd8 + apply_lookup_16_to(const simd8 original) const { + __m128i original_tmp = __lsx_vand_v(original, __lsx_vldi(0x1f)); + return __lsx_vshuf_b(__lsx_vldi(0), (__m128i)this->value, + simd8(original_tmp)); } - return (size_t)(out - dst); -} +}; -template -simdutf_warn_unused size_t maximal_binary_length_from_base64( - const char_type *input, size_t length) noexcept { - // We follow https://infra.spec.whatwg.org/#forgiving-base64-decode - size_t padding = 0; - if (length > 0) { - if (input[length - 1] == '=') { - padding++; - if (length > 1 && input[length - 2] == '=') { - padding++; - } - } +template struct simd8x64 { + static constexpr int NUM_CHUNKS = 64 / sizeof(simd8); + static_assert( + NUM_CHUNKS == 4, + "LoongArch kernel should use four registers per 64-byte block."); + simd8 chunks[NUM_CHUNKS]; + + simd8x64(const simd8x64 &o) = delete; // no copy allowed + simd8x64 & + operator=(const simd8 other) = delete; // no assignment allowed + simd8x64() = delete; // no default constructor allowed + + simdutf_really_inline simd8x64(const simd8 chunk0, const simd8 chunk1, + const simd8 chunk2, const simd8 chunk3) + : chunks{chunk0, chunk1, chunk2, chunk3} {} + simdutf_really_inline simd8x64(const T *ptr) + : chunks{simd8::load(ptr), + simd8::load(ptr + sizeof(simd8) / sizeof(T)), + simd8::load(ptr + 2 * sizeof(simd8) / sizeof(T)), + simd8::load(ptr + 3 * sizeof(simd8) / sizeof(T))} {} + + simdutf_really_inline void store(T *ptr) const { + this->chunks[0].store(ptr + sizeof(simd8) * 0 / sizeof(T)); + this->chunks[1].store(ptr + sizeof(simd8) * 1 / sizeof(T)); + this->chunks[2].store(ptr + sizeof(simd8) * 2 / sizeof(T)); + this->chunks[3].store(ptr + sizeof(simd8) * 3 / sizeof(T)); } - size_t actual_length = length - padding; - if (actual_length % 4 <= 1) { - return actual_length / 4 * 3; + + simdutf_really_inline simd8x64 &operator|=(const simd8x64 &other) { + this->chunks[0] |= other.chunks[0]; + this->chunks[1] |= other.chunks[1]; + this->chunks[2] |= other.chunks[2]; + this->chunks[3] |= other.chunks[3]; + return *this; } - // if we have a valid input, then the remainder must be 2 or 3 adding one or - // two extra bytes. - return actual_length / 4 * 3 + (actual_length % 4) - 1; -} -simdutf_warn_unused size_t -base64_length_from_binary(size_t length, base64_options options) noexcept { - // By default, we use padding if we are not using the URL variant. - // This is check with ((options & base64_url) == 0) which returns true if we - // are not using the URL variant. However, we also allow 'inversion' of the - // convention with the base64_reverse_padding option. If the - // base64_reverse_padding option is set, we use padding if we are using the - // URL variant, and we omit it if we are not using the URL variant. This is - // checked with - // ((options & base64_reverse_padding) == base64_reverse_padding). - bool use_padding = - ((options & base64_url) == 0) ^ - ((options & base64_reverse_padding) == base64_reverse_padding); - if (!use_padding) { - return length / 3 * 4 + ((length % 3) ? (length % 3) + 1 : 0); + simdutf_really_inline simd8 reduce_or() const { + return (this->chunks[0] | this->chunks[1]) | + (this->chunks[2] | this->chunks[3]); } - return (length + 2) / 3 * - 4; // We use padding to make the length a multiple of 4. -} -} // namespace base64 -} // unnamed namespace -} // namespace scalar -} // namespace simdutf + simdutf_really_inline bool is_ascii() const { return reduce_or().is_ascii(); } -#endif -/* end file src/scalar/base64.h */ -/* begin file src/scalar/latin1_to_utf8/latin1_to_utf8.h */ -#ifndef SIMDUTF_LATIN1_TO_UTF8_H -#define SIMDUTF_LATIN1_TO_UTF8_H + template + simdutf_really_inline void store_ascii_as_utf16(char16_t *ptr) const { + this->chunks[0].template store_ascii_as_utf16(ptr + + sizeof(simd8) * 0); + this->chunks[1].template store_ascii_as_utf16(ptr + + sizeof(simd8) * 1); + this->chunks[2].template store_ascii_as_utf16(ptr + + sizeof(simd8) * 2); + this->chunks[3].template store_ascii_as_utf16(ptr + + sizeof(simd8) * 3); + } -namespace simdutf { -namespace scalar { -namespace { -namespace latin1_to_utf8 { + simdutf_really_inline void store_ascii_as_utf32(char32_t *ptr) const { + this->chunks[0].store_ascii_as_utf32_tbl(ptr + sizeof(simd8) * 0); + this->chunks[1].store_ascii_as_utf32_tbl(ptr + sizeof(simd8) * 1); + this->chunks[2].store_ascii_as_utf32_tbl(ptr + sizeof(simd8) * 2); + this->chunks[3].store_ascii_as_utf32_tbl(ptr + sizeof(simd8) * 3); + } -inline size_t convert(const char *buf, size_t len, char *utf8_output) { - const unsigned char *data = reinterpret_cast(buf); - size_t pos = 0; - size_t utf8_pos = 0; - while (pos < len) { - // try to convert the next block of 16 ASCII bytes - if (pos + 16 <= - len) { // if it is safe to read 16 more bytes, check that they are ascii - uint64_t v1; - ::memcpy(&v1, data + pos, sizeof(uint64_t)); - uint64_t v2; - ::memcpy(&v2, data + pos + sizeof(uint64_t), sizeof(uint64_t)); - uint64_t v{v1 | - v2}; // We are only interested in these bits: 1000 1000 1000 - // 1000, so it makes sense to concatenate everything - if ((v & 0x8080808080808080) == - 0) { // if NONE of these are set, e.g. all of them are zero, then - // everything is ASCII - size_t final_pos = pos + 16; - while (pos < final_pos) { - utf8_output[utf8_pos++] = char(buf[pos]); - pos++; - } - continue; - } - } + simdutf_really_inline uint64_t to_bitmask() const { + __m128i mask = __lsx_vbsll_v(__lsx_vmsknz_b(this->chunks[3]), 6); + mask = __lsx_vor_v(mask, __lsx_vbsll_v(__lsx_vmsknz_b(this->chunks[2]), 4)); + mask = __lsx_vor_v(mask, __lsx_vbsll_v(__lsx_vmsknz_b(this->chunks[1]), 2)); + mask = __lsx_vor_v(mask, __lsx_vmsknz_b(this->chunks[0])); + return __lsx_vpickve2gr_du(mask, 0); + } - unsigned char byte = data[pos]; - if ((byte & 0x80) == 0) { // if ASCII - // will generate one UTF-8 bytes - utf8_output[utf8_pos++] = char(byte); - pos++; - } else { - // will generate two UTF-8 bytes - utf8_output[utf8_pos++] = char((byte >> 6) | 0b11000000); - utf8_output[utf8_pos++] = char((byte & 0b111111) | 0b10000000); - pos++; - } + simdutf_really_inline uint64_t eq(const T m) const { + const simd8 mask = simd8::splat(m); + return simd8x64(this->chunks[0] == mask, this->chunks[1] == mask, + this->chunks[2] == mask, this->chunks[3] == mask) + .to_bitmask(); } - return utf8_pos; -} -inline size_t convert_safe(const char *buf, size_t len, char *utf8_output, - size_t utf8_len) { - const unsigned char *data = reinterpret_cast(buf); - size_t pos = 0; - size_t skip_pos = 0; - size_t utf8_pos = 0; - while (pos < len && utf8_pos < utf8_len) { - // try to convert the next block of 16 ASCII bytes - if (pos >= skip_pos && pos + 16 <= len && - utf8_pos + 16 <= utf8_len) { // if it is safe to read 16 more bytes, - // check that they are ascii - uint64_t v1; - ::memcpy(&v1, data + pos, sizeof(uint64_t)); - uint64_t v2; - ::memcpy(&v2, data + pos + sizeof(uint64_t), sizeof(uint64_t)); - uint64_t v{v1 | - v2}; // We are only interested in these bits: 1000 1000 1000 - // 1000, so it makes sense to concatenate everything - if ((v & 0x8080808080808080) == - 0) { // if NONE of these are set, e.g. all of them are zero, then - // everything is ASCII - ::memcpy(utf8_output + utf8_pos, buf + pos, 16); - utf8_pos += 16; - pos += 16; - } else { - // At least one of the next 16 bytes are not ASCII, we will process them - // one by one - skip_pos = pos + 16; - } - } else { - const auto byte = data[pos]; - if ((byte & 0x80) == 0) { // if ASCII - // will generate one UTF-8 bytes - utf8_output[utf8_pos++] = char(byte); - pos++; - } else if (utf8_pos + 2 <= utf8_len) { - // will generate two UTF-8 bytes - utf8_output[utf8_pos++] = char((byte >> 6) | 0b11000000); - utf8_output[utf8_pos++] = char((byte & 0b111111) | 0b10000000); - pos++; - } else { - break; - } - } + simdutf_really_inline uint64_t lteq(const T m) const { + const simd8 mask = simd8::splat(m); + return simd8x64(this->chunks[0] <= mask, this->chunks[1] <= mask, + this->chunks[2] <= mask, this->chunks[3] <= mask) + .to_bitmask(); } - return utf8_pos; -} -} // namespace latin1_to_utf8 -} // unnamed namespace -} // namespace scalar -} // namespace simdutf + simdutf_really_inline uint64_t in_range(const T low, const T high) const { + const simd8 mask_low = simd8::splat(low); + const simd8 mask_high = simd8::splat(high); -#endif -/* end file src/scalar/latin1_to_utf8/latin1_to_utf8.h */ + return simd8x64( + (this->chunks[0] <= mask_high) & (this->chunks[0] >= mask_low), + (this->chunks[1] <= mask_high) & (this->chunks[1] >= mask_low), + (this->chunks[2] <= mask_high) & (this->chunks[2] >= mask_low), + (this->chunks[3] <= mask_high) & (this->chunks[3] >= mask_low)) + .to_bitmask(); + } + simdutf_really_inline uint64_t not_in_range(const T low, const T high) const { + const simd8 mask_low = simd8::splat(low); + const simd8 mask_high = simd8::splat(high); + return simd8x64( + (this->chunks[0] > mask_high) | (this->chunks[0] < mask_low), + (this->chunks[1] > mask_high) | (this->chunks[1] < mask_low), + (this->chunks[2] > mask_high) | (this->chunks[2] < mask_low), + (this->chunks[3] > mask_high) | (this->chunks[3] < mask_low)) + .to_bitmask(); + } + simdutf_really_inline uint64_t lt(const T m) const { + const simd8 mask = simd8::splat(m); + return simd8x64(this->chunks[0] < mask, this->chunks[1] < mask, + this->chunks[2] < mask, this->chunks[3] < mask) + .to_bitmask(); + } + simdutf_really_inline uint64_t gt(const T m) const { + const simd8 mask = simd8::splat(m); + return simd8x64(this->chunks[0] > mask, this->chunks[1] > mask, + this->chunks[2] > mask, this->chunks[3] > mask) + .to_bitmask(); + } + simdutf_really_inline uint64_t gteq(const T m) const { + const simd8 mask = simd8::splat(m); + return simd8x64(this->chunks[0] >= mask, this->chunks[1] >= mask, + this->chunks[2] >= mask, this->chunks[3] >= mask) + .to_bitmask(); + } + simdutf_really_inline uint64_t gteq_unsigned(const uint8_t m) const { + const simd8 mask = simd8::splat(m); + return simd8x64(simd8(this->chunks[0].value) >= mask, + simd8(this->chunks[1].value) >= mask, + simd8(this->chunks[2].value) >= mask, + simd8(this->chunks[3].value) >= mask) + .to_bitmask(); + } +}; // struct simd8x64 +/* begin file src/simdutf/lsx/simd16-inl.h */ +template struct simd16; -namespace simdutf { -bool implementation::supported_by_runtime_system() const { - uint32_t required_instruction_sets = this->required_instruction_sets(); - uint32_t supported_instruction_sets = - internal::detect_supported_architectures(); - return ((supported_instruction_sets & required_instruction_sets) == - required_instruction_sets); -} +template > struct base_u16 { + __m128i value; + static const int SIZE = sizeof(value); -simdutf_warn_unused encoding_type implementation::autodetect_encoding( - const char *input, size_t length) const noexcept { - // If there is a BOM, then we trust it. - auto bom_encoding = simdutf::BOM::check_bom(input, length); - if (bom_encoding != encoding_type::unspecified) { - return bom_encoding; + // Conversion from/to SIMD register + simdutf_really_inline base_u16() = default; + simdutf_really_inline base_u16(const __m128i _value) : value(_value) {} + // Bit operations + simdutf_really_inline simd16 operator|(const simd16 other) const { + return __lsx_vor_v(this->value, other.value); } - // UTF8 is common, it includes ASCII, and is commonly represented - // without a BOM, so if it fits, go with that. Note that it is still - // possible to get it wrong, we are only 'guessing'. If some has UTF-16 - // data without a BOM, it could pass as UTF-8. - // - // An interesting twist might be to check for UTF-16 ASCII first (every - // other byte is zero). - if (validate_utf8(input, length)) { - return encoding_type::UTF8; + simdutf_really_inline simd16 operator&(const simd16 other) const { + return __lsx_vand_v(this->value, other.value); } - // The next most common encoding that might appear without BOM is probably - // UTF-16LE, so try that next. - if ((length % 2) == 0) { - // important: we need to divide by two - if (validate_utf16le(reinterpret_cast(input), - length / 2)) { - return encoding_type::UTF16_LE; - } + simdutf_really_inline simd16 operator^(const simd16 other) const { + return __lsx_vxor_v(this->value, other.value); } - if ((length % 4) == 0) { - if (validate_utf32(reinterpret_cast(input), length / 4)) { - return encoding_type::UTF32_LE; - } + simdutf_really_inline simd16 bit_andnot(const simd16 other) const { + return __lsx_vandn_v(this->value, other.value); + } + simdutf_really_inline simd16 operator~() const { return *this ^ 0xFFu; } + simdutf_really_inline simd16 &operator|=(const simd16 other) { + auto this_cast = static_cast *>(this); + *this_cast = *this_cast | other; + return *this_cast; + } + simdutf_really_inline simd16 &operator&=(const simd16 other) { + auto this_cast = static_cast *>(this); + *this_cast = *this_cast & other; + return *this_cast; + } + simdutf_really_inline simd16 &operator^=(const simd16 other) { + auto this_cast = static_cast *>(this); + *this_cast = *this_cast ^ other; + return *this_cast; } - return encoding_type::unspecified; -} - -namespace internal { -// When there is a single implementation, we should not pay a price -// for dispatching to the best implementation. We should just use the -// one we have. This is a compile-time check. -#define SIMDUTF_SINGLE_IMPLEMENTATION \ - (SIMDUTF_IMPLEMENTATION_ICELAKE + SIMDUTF_IMPLEMENTATION_HASWELL + \ - SIMDUTF_IMPLEMENTATION_WESTMERE + SIMDUTF_IMPLEMENTATION_ARM64 + \ - SIMDUTF_IMPLEMENTATION_PPC64 + SIMDUTF_IMPLEMENTATION_FALLBACK == \ - 1) -// Static array of known implementations. We are hoping these get baked into the -// executable without requiring a static initializer. - -#if SIMDUTF_IMPLEMENTATION_ICELAKE -static const icelake::implementation *get_icelake_singleton() { - static const icelake::implementation icelake_singleton{}; - return &icelake_singleton; -} -#endif -#if SIMDUTF_IMPLEMENTATION_HASWELL -static const haswell::implementation *get_haswell_singleton() { - static const haswell::implementation haswell_singleton{}; - return &haswell_singleton; -} -#endif -#if SIMDUTF_IMPLEMENTATION_WESTMERE -static const westmere::implementation *get_westmere_singleton() { - static const westmere::implementation westmere_singleton{}; - return &westmere_singleton; -} -#endif -#if SIMDUTF_IMPLEMENTATION_ARM64 -static const arm64::implementation *get_arm64_singleton() { - static const arm64::implementation arm64_singleton{}; - return &arm64_singleton; -} -#endif -#if SIMDUTF_IMPLEMENTATION_PPC64 -static const ppc64::implementation *get_ppc64_singleton() { - static const ppc64::implementation ppc64_singleton{}; - return &ppc64_singleton; -} -#endif -#if SIMDUTF_IMPLEMENTATION_RVV -static const rvv::implementation *get_rvv_singleton() { - static const rvv::implementation rvv_singleton{}; - return &rvv_singleton; -} -#endif -#if SIMDUTF_IMPLEMENTATION_FALLBACK -static const fallback::implementation *get_fallback_singleton() { - static const fallback::implementation fallback_singleton{}; - return &fallback_singleton; -} -#endif - -#if SIMDUTF_SINGLE_IMPLEMENTATION -static const implementation *get_single_implementation() { - return - #if SIMDUTF_IMPLEMENTATION_ICELAKE - get_icelake_singleton(); - #endif - #if SIMDUTF_IMPLEMENTATION_HASWELL - get_haswell_singleton(); - #endif - #if SIMDUTF_IMPLEMENTATION_WESTMERE - get_westmere_singleton(); - #endif - #if SIMDUTF_IMPLEMENTATION_ARM64 - get_arm64_singleton(); - #endif - #if SIMDUTF_IMPLEMENTATION_PPC64 - get_ppc64_singleton(); - #endif - #if SIMDUTF_IMPLEMENTATION_FALLBACK - get_fallback_singleton(); - #endif -} -#endif - -/** - * @private Detects best supported implementation on first use, and sets it - */ -class detect_best_supported_implementation_on_first_use final - : public implementation { -public: - std::string name() const noexcept final { return set_best()->name(); } - std::string description() const noexcept final { - return set_best()->description(); - } - uint32_t required_instruction_sets() const noexcept final { - return set_best()->required_instruction_sets(); - } - - simdutf_warn_unused int - detect_encodings(const char *input, size_t length) const noexcept override { - return set_best()->detect_encodings(input, length); + friend simdutf_really_inline Mask operator==(const simd16 lhs, + const simd16 rhs) { + return __lsx_vseq_h(lhs.value, rhs.value); } - simdutf_warn_unused bool - validate_utf8(const char *buf, size_t len) const noexcept final override { - return set_best()->validate_utf8(buf, len); + template + simdutf_really_inline simd16 prev(const simd16 prev_chunk) const { + return __lsx_vor_v(__lsx_vbsll_v(*this, N * 2), + __lsx_vbsrl_v(prev_chunk, 16 - N * 2)); } +}; - simdutf_warn_unused result validate_utf8_with_errors( - const char *buf, size_t len) const noexcept final override { - return set_best()->validate_utf8_with_errors(buf, len); - } +template > +struct base16 : base_u16 { + typedef uint16_t bitmask_t; + typedef uint32_t bitmask2_t; - simdutf_warn_unused bool - validate_ascii(const char *buf, size_t len) const noexcept final override { - return set_best()->validate_ascii(buf, len); - } + simdutf_really_inline base16() : base_u16() {} + simdutf_really_inline base16(const __m128i _value) : base_u16(_value) {} + template + simdutf_really_inline base16(const Pointer *ptr) + : base16(__lsx_vld(ptr, 0)) {} - simdutf_warn_unused result validate_ascii_with_errors( - const char *buf, size_t len) const noexcept final override { - return set_best()->validate_ascii_with_errors(buf, len); - } + static const int SIZE = sizeof(base_u16::value); - simdutf_warn_unused bool - validate_utf16le(const char16_t *buf, - size_t len) const noexcept final override { - return set_best()->validate_utf16le(buf, len); + template + simdutf_really_inline simd16 prev(const simd16 prev_chunk) const { + return __lsx_vor_v(__lsx_vbsll_v(*this, N * 2), + __lsx_vbsrl_v(prev_chunk, 16 - N * 2)); } +}; - simdutf_warn_unused bool - validate_utf16be(const char16_t *buf, - size_t len) const noexcept final override { - return set_best()->validate_utf16be(buf, len); +// SIMD byte mask type (returned by things like eq and gt) +template <> struct simd16 : base16 { + static simdutf_really_inline simd16 splat(bool _value) { + return __lsx_vreplgr2vr_h(uint16_t(-(!!_value))); } - simdutf_warn_unused result validate_utf16le_with_errors( - const char16_t *buf, size_t len) const noexcept final override { - return set_best()->validate_utf16le_with_errors(buf, len); - } + simdutf_really_inline simd16() : base16() {} + simdutf_really_inline simd16(const __m128i _value) : base16(_value) {} + // Splat constructor + simdutf_really_inline simd16(bool _value) : base16(splat(_value)) {} +}; - simdutf_warn_unused result validate_utf16be_with_errors( - const char16_t *buf, size_t len) const noexcept final override { - return set_best()->validate_utf16be_with_errors(buf, len); +template struct base16_numeric : base16 { + static simdutf_really_inline simd16 splat(T _value) { + return __lsx_vreplgr2vr_h(_value); } - - simdutf_warn_unused bool - validate_utf32(const char32_t *buf, - size_t len) const noexcept final override { - return set_best()->validate_utf32(buf, len); + static simdutf_really_inline simd16 zero() { return __lsx_vldi(0); } + static simdutf_really_inline simd16 load(const T values[8]) { + return __lsx_vld(reinterpret_cast(values), 0); } - simdutf_warn_unused result validate_utf32_with_errors( - const char32_t *buf, size_t len) const noexcept final override { - return set_best()->validate_utf32_with_errors(buf, len); - } + simdutf_really_inline base16_numeric() : base16() {} + simdutf_really_inline base16_numeric(const __m128i _value) + : base16(_value) {} - simdutf_warn_unused size_t - convert_latin1_to_utf8(const char *buf, size_t len, - char *utf8_output) const noexcept final override { - return set_best()->convert_latin1_to_utf8(buf, len, utf8_output); + // Store to array + simdutf_really_inline void store(T dst[8]) const { + return __lsx_vst(this->value, dst, 0); } - simdutf_warn_unused size_t convert_latin1_to_utf16le( - const char *buf, size_t len, - char16_t *utf16_output) const noexcept final override { - return set_best()->convert_latin1_to_utf16le(buf, len, utf16_output); - } + // Override to distinguish from bool version + simdutf_really_inline simd16 operator~() const { return *this ^ 0xFFu; } - simdutf_warn_unused size_t convert_latin1_to_utf16be( - const char *buf, size_t len, - char16_t *utf16_output) const noexcept final override { - return set_best()->convert_latin1_to_utf16be(buf, len, utf16_output); + // Addition/subtraction are the same for signed and unsigned + simdutf_really_inline simd16 operator+(const simd16 other) const { + return __lsx_vadd_b(*this, other); } - - simdutf_warn_unused size_t convert_latin1_to_utf32( - const char *buf, size_t len, - char32_t *latin1_output) const noexcept final override { - return set_best()->convert_latin1_to_utf32(buf, len, latin1_output); + simdutf_really_inline simd16 operator-(const simd16 other) const { + return __lsx_vsub_b(*this, other); } - - simdutf_warn_unused size_t - convert_utf8_to_latin1(const char *buf, size_t len, - char *latin1_output) const noexcept final override { - return set_best()->convert_utf8_to_latin1(buf, len, latin1_output); + simdutf_really_inline simd16 &operator+=(const simd16 other) { + *this = *this + other; + return *static_cast *>(this); } - - simdutf_warn_unused result convert_utf8_to_latin1_with_errors( - const char *buf, size_t len, - char *latin1_output) const noexcept final override { - return set_best()->convert_utf8_to_latin1_with_errors(buf, len, - latin1_output); + simdutf_really_inline simd16 &operator-=(const simd16 other) { + *this = *this - other; + return *static_cast *>(this); } +}; - simdutf_warn_unused size_t convert_valid_utf8_to_latin1( - const char *buf, size_t len, - char *latin1_output) const noexcept final override { - return set_best()->convert_valid_utf8_to_latin1(buf, len, latin1_output); - } +// Signed code unitstemplate<> +template <> struct simd16 : base16_numeric { + simdutf_really_inline simd16() : base16_numeric() {} + simdutf_really_inline simd16(const __m128i _value) + : base16_numeric(_value) {} + simdutf_really_inline simd16(simd16 other) + : base16_numeric(other.value) {} - simdutf_warn_unused size_t convert_utf8_to_utf16le( - const char *buf, size_t len, - char16_t *utf16_output) const noexcept final override { - return set_best()->convert_utf8_to_utf16le(buf, len, utf16_output); - } + // Splat constructor + simdutf_really_inline simd16(int16_t _value) : simd16(splat(_value)) {} + // Array constructor + simdutf_really_inline simd16(const int16_t *values) : simd16(load(values)) {} + simdutf_really_inline simd16(const char16_t *values) + : simd16(load(reinterpret_cast(values))) {} + simdutf_really_inline operator simd16() const; - simdutf_warn_unused size_t convert_utf8_to_utf16be( - const char *buf, size_t len, - char16_t *utf16_output) const noexcept final override { - return set_best()->convert_utf8_to_utf16be(buf, len, utf16_output); + // Order-sensitive comparisons + simdutf_really_inline simd16 + max_val(const simd16 other) const { + return __lsx_vmax_h(this->value, other.value); } - - simdutf_warn_unused result convert_utf8_to_utf16le_with_errors( - const char *buf, size_t len, - char16_t *utf16_output) const noexcept final override { - return set_best()->convert_utf8_to_utf16le_with_errors(buf, len, - utf16_output); + simdutf_really_inline simd16 + min_val(const simd16 other) const { + return __lsx_vmin_h(this->value, other.value); } - - simdutf_warn_unused result convert_utf8_to_utf16be_with_errors( - const char *buf, size_t len, - char16_t *utf16_output) const noexcept final override { - return set_best()->convert_utf8_to_utf16be_with_errors(buf, len, - utf16_output); + simdutf_really_inline simd16 + operator>(const simd16 other) const { + return __lsx_vsle_h(other.value, this->value); } - - simdutf_warn_unused size_t convert_valid_utf8_to_utf16le( - const char *buf, size_t len, - char16_t *utf16_output) const noexcept final override { - return set_best()->convert_valid_utf8_to_utf16le(buf, len, utf16_output); + simdutf_really_inline simd16 + operator<(const simd16 other) const { + return __lsx_vslt_h(this->value, other.value); } +}; - simdutf_warn_unused size_t convert_valid_utf8_to_utf16be( - const char *buf, size_t len, - char16_t *utf16_output) const noexcept final override { - return set_best()->convert_valid_utf8_to_utf16be(buf, len, utf16_output); - } +// Unsigned code unitstemplate<> +template <> struct simd16 : base16_numeric { + simdutf_really_inline simd16() : base16_numeric() {} + simdutf_really_inline simd16(const __m128i _value) + : base16_numeric((__m128i)_value) {} + simdutf_really_inline simd16(simd16 other) + : base16_numeric(other.value) {} - simdutf_warn_unused size_t - convert_utf8_to_utf32(const char *buf, size_t len, - char32_t *utf32_output) const noexcept final override { - return set_best()->convert_utf8_to_utf32(buf, len, utf32_output); - } + // Splat constructor + simdutf_really_inline simd16(uint16_t _value) : simd16(splat(_value)) {} + // Array constructor + simdutf_really_inline simd16(const uint16_t *values) : simd16(load(values)) {} + simdutf_really_inline simd16(const char16_t *values) + : simd16(load(reinterpret_cast(values))) {} - simdutf_warn_unused result convert_utf8_to_utf32_with_errors( - const char *buf, size_t len, - char32_t *utf32_output) const noexcept final override { - return set_best()->convert_utf8_to_utf32_with_errors(buf, len, - utf32_output); + // Saturated math + simdutf_really_inline simd16 + saturating_add(const simd16 other) const { + return __lsx_vsadd_hu(this->value, other.value); } - - simdutf_warn_unused size_t convert_valid_utf8_to_utf32( - const char *buf, size_t len, - char32_t *utf32_output) const noexcept final override { - return set_best()->convert_valid_utf8_to_utf32(buf, len, utf32_output); + simdutf_really_inline simd16 + saturating_sub(const simd16 other) const { + return __lsx_vssub_hu(this->value, other.value); } - simdutf_warn_unused size_t - convert_utf16le_to_latin1(const char16_t *buf, size_t len, - char *latin1_output) const noexcept final override { - return set_best()->convert_utf16le_to_latin1(buf, len, latin1_output); + // Order-specific operations + simdutf_really_inline simd16 + max_val(const simd16 other) const { + return __lsx_vmax_hu(this->value, other.value); } - - simdutf_warn_unused size_t - convert_utf16be_to_latin1(const char16_t *buf, size_t len, - char *latin1_output) const noexcept final override { - return set_best()->convert_utf16be_to_latin1(buf, len, latin1_output); + simdutf_really_inline simd16 + min_val(const simd16 other) const { + return __lsx_vmin_hu(this->value, other.value); } - - simdutf_warn_unused result convert_utf16le_to_latin1_with_errors( - const char16_t *buf, size_t len, - char *latin1_output) const noexcept final override { - return set_best()->convert_utf16le_to_latin1_with_errors(buf, len, - latin1_output); + // Same as >, but only guarantees true is nonzero (< guarantees true = -1) + simdutf_really_inline simd16 + gt_bits(const simd16 other) const { + return this->saturating_sub(other); } - - simdutf_warn_unused result convert_utf16be_to_latin1_with_errors( - const char16_t *buf, size_t len, - char *latin1_output) const noexcept final override { - return set_best()->convert_utf16be_to_latin1_with_errors(buf, len, - latin1_output); + // Same as <, but only guarantees true is nonzero (< guarantees true = -1) + simdutf_really_inline simd16 + lt_bits(const simd16 other) const { + return other.saturating_sub(*this); } - - simdutf_warn_unused size_t convert_valid_utf16le_to_latin1( - const char16_t *buf, size_t len, - char *latin1_output) const noexcept final override { - return set_best()->convert_valid_utf16le_to_latin1(buf, len, latin1_output); + simdutf_really_inline simd16 + operator<=(const simd16 other) const { + return __lsx_vsle_hu(this->value, other.value); } - - simdutf_warn_unused size_t convert_valid_utf16be_to_latin1( - const char16_t *buf, size_t len, - char *latin1_output) const noexcept final override { - return set_best()->convert_valid_utf16be_to_latin1(buf, len, latin1_output); + simdutf_really_inline simd16 + operator>=(const simd16 other) const { + return __lsx_vsle_hu(other.value, this->value); } - - simdutf_warn_unused size_t - convert_utf16le_to_utf8(const char16_t *buf, size_t len, - char *utf8_output) const noexcept final override { - return set_best()->convert_utf16le_to_utf8(buf, len, utf8_output); + simdutf_really_inline simd16 + operator>(const simd16 other) const { + return __lsx_vslt_hu(other.value, this->value); } - - simdutf_warn_unused size_t - convert_utf16be_to_utf8(const char16_t *buf, size_t len, - char *utf8_output) const noexcept final override { - return set_best()->convert_utf16be_to_utf8(buf, len, utf8_output); + simdutf_really_inline simd16 + operator<(const simd16 other) const { + return __lsx_vslt_hu(this->value, other.value); } - simdutf_warn_unused result convert_utf16le_to_utf8_with_errors( - const char16_t *buf, size_t len, - char *utf8_output) const noexcept final override { - return set_best()->convert_utf16le_to_utf8_with_errors(buf, len, - utf8_output); + // Bit-specific operations + simdutf_really_inline simd16 bits_not_set() const { + return *this == uint16_t(0); } - - simdutf_warn_unused result convert_utf16be_to_utf8_with_errors( - const char16_t *buf, size_t len, - char *utf8_output) const noexcept final override { - return set_best()->convert_utf16be_to_utf8_with_errors(buf, len, - utf8_output); + template simdutf_really_inline simd16 shr() const { + return simd16(__lsx_vsrli_h(this->value, N)); } - - simdutf_warn_unused size_t convert_valid_utf16le_to_utf8( - const char16_t *buf, size_t len, - char *utf8_output) const noexcept final override { - return set_best()->convert_valid_utf16le_to_utf8(buf, len, utf8_output); + template simdutf_really_inline simd16 shl() const { + return simd16(__lsx_vslli_h(this->value, N)); } - simdutf_warn_unused size_t convert_valid_utf16be_to_utf8( - const char16_t *buf, size_t len, - char *utf8_output) const noexcept final override { - return set_best()->convert_valid_utf16be_to_utf8(buf, len, utf8_output); + // logical operations + simdutf_really_inline simd16 + operator|(const simd16 other) const { + return __lsx_vor_v(this->value, other.value); } - - simdutf_warn_unused size_t - convert_utf32_to_latin1(const char32_t *buf, size_t len, - char *latin1_output) const noexcept final override { - return set_best()->convert_utf32_to_latin1(buf, len, latin1_output); + simdutf_really_inline simd16 + operator&(const simd16 other) const { + return __lsx_vand_v(this->value, other.value); } - - simdutf_warn_unused result convert_utf32_to_latin1_with_errors( - const char32_t *buf, size_t len, - char *latin1_output) const noexcept final override { - return set_best()->convert_utf32_to_latin1_with_errors(buf, len, - latin1_output); + simdutf_really_inline simd16 + operator^(const simd16 other) const { + return __lsx_vxor_v(this->value, other.value); } - simdutf_warn_unused size_t convert_valid_utf32_to_latin1( - const char32_t *buf, size_t len, - char *latin1_output) const noexcept final override { - return set_best()->convert_utf32_to_latin1(buf, len, latin1_output); + // Pack with the unsigned saturation of two uint16_t code units into single + // uint8_t vector + static simdutf_really_inline simd8 pack(const simd16 &v0, + const simd16 &v1) { + return __lsx_vssrlni_bu_h(v1.value, v0.value, 0); } - simdutf_warn_unused size_t - convert_utf32_to_utf8(const char32_t *buf, size_t len, - char *utf8_output) const noexcept final override { - return set_best()->convert_utf32_to_utf8(buf, len, utf8_output); + // Change the endianness + simdutf_really_inline simd16 swap_bytes() const { + return __lsx_vshuf4i_b(this->value, 0b10110001); } +}; - simdutf_warn_unused result convert_utf32_to_utf8_with_errors( - const char32_t *buf, size_t len, - char *utf8_output) const noexcept final override { - return set_best()->convert_utf32_to_utf8_with_errors(buf, len, utf8_output); - } +simdutf_really_inline simd16::operator simd16() const { + return this->value; +} - simdutf_warn_unused size_t - convert_valid_utf32_to_utf8(const char32_t *buf, size_t len, - char *utf8_output) const noexcept final override { - return set_best()->convert_valid_utf32_to_utf8(buf, len, utf8_output); - } +template struct simd16x32 { + static constexpr int NUM_CHUNKS = 64 / sizeof(simd16); + static_assert( + NUM_CHUNKS == 4, + "LOONGARCH kernel should use four registers per 64-byte block."); + simd16 chunks[NUM_CHUNKS]; - simdutf_warn_unused size_t convert_utf32_to_utf16le( - const char32_t *buf, size_t len, - char16_t *utf16_output) const noexcept final override { - return set_best()->convert_utf32_to_utf16le(buf, len, utf16_output); - } + simd16x32(const simd16x32 &o) = delete; // no copy allowed + simd16x32 & + operator=(const simd16 other) = delete; // no assignment allowed + simd16x32() = delete; // no default constructor allowed - simdutf_warn_unused size_t convert_utf32_to_utf16be( - const char32_t *buf, size_t len, - char16_t *utf16_output) const noexcept final override { - return set_best()->convert_utf32_to_utf16be(buf, len, utf16_output); - } + simdutf_really_inline + simd16x32(const simd16 chunk0, const simd16 chunk1, + const simd16 chunk2, const simd16 chunk3) + : chunks{chunk0, chunk1, chunk2, chunk3} {} + simdutf_really_inline simd16x32(const T *ptr) + : chunks{simd16::load(ptr), + simd16::load(ptr + sizeof(simd16) / sizeof(T)), + simd16::load(ptr + 2 * sizeof(simd16) / sizeof(T)), + simd16::load(ptr + 3 * sizeof(simd16) / sizeof(T))} {} - simdutf_warn_unused result convert_utf32_to_utf16le_with_errors( - const char32_t *buf, size_t len, - char16_t *utf16_output) const noexcept final override { - return set_best()->convert_utf32_to_utf16le_with_errors(buf, len, - utf16_output); + simdutf_really_inline void store(T *ptr) const { + this->chunks[0].store(ptr + sizeof(simd16) * 0 / sizeof(T)); + this->chunks[1].store(ptr + sizeof(simd16) * 1 / sizeof(T)); + this->chunks[2].store(ptr + sizeof(simd16) * 2 / sizeof(T)); + this->chunks[3].store(ptr + sizeof(simd16) * 3 / sizeof(T)); } - simdutf_warn_unused result convert_utf32_to_utf16be_with_errors( - const char32_t *buf, size_t len, - char16_t *utf16_output) const noexcept final override { - return set_best()->convert_utf32_to_utf16be_with_errors(buf, len, - utf16_output); + simdutf_really_inline simd16 reduce_or() const { + return (this->chunks[0] | this->chunks[1]) | + (this->chunks[2] | this->chunks[3]); } - simdutf_warn_unused size_t convert_valid_utf32_to_utf16le( - const char32_t *buf, size_t len, - char16_t *utf16_output) const noexcept final override { - return set_best()->convert_valid_utf32_to_utf16le(buf, len, utf16_output); - } + simdutf_really_inline bool is_ascii() const { return reduce_or().is_ascii(); } - simdutf_warn_unused size_t convert_valid_utf32_to_utf16be( - const char32_t *buf, size_t len, - char16_t *utf16_output) const noexcept final override { - return set_best()->convert_valid_utf32_to_utf16be(buf, len, utf16_output); + simdutf_really_inline void store_ascii_as_utf16(char16_t *ptr) const { + this->chunks[0].store_ascii_as_utf16(ptr + sizeof(simd16) * 0); + this->chunks[1].store_ascii_as_utf16(ptr + sizeof(simd16) * 1); + this->chunks[2].store_ascii_as_utf16(ptr + sizeof(simd16) * 2); + this->chunks[3].store_ascii_as_utf16(ptr + sizeof(simd16) * 3); } - simdutf_warn_unused size_t convert_utf16le_to_utf32( - const char16_t *buf, size_t len, - char32_t *utf32_output) const noexcept final override { - return set_best()->convert_utf16le_to_utf32(buf, len, utf32_output); + simdutf_really_inline uint64_t to_bitmask() const { + __m128i mask = __lsx_vbsll_v(__lsx_vmsknz_b((this->chunks[3]).value), 6); + mask = __lsx_vor_v( + mask, __lsx_vbsll_v(__lsx_vmsknz_b((this->chunks[2]).value), 4)); + mask = __lsx_vor_v( + mask, __lsx_vbsll_v(__lsx_vmsknz_b((this->chunks[1]).value), 2)); + mask = __lsx_vor_v(mask, __lsx_vmsknz_b((this->chunks[0]).value)); + return __lsx_vpickve2gr_du(mask, 0); } - simdutf_warn_unused size_t convert_utf16be_to_utf32( - const char16_t *buf, size_t len, - char32_t *utf32_output) const noexcept final override { - return set_best()->convert_utf16be_to_utf32(buf, len, utf32_output); + simdutf_really_inline void swap_bytes() { + this->chunks[0] = this->chunks[0].swap_bytes(); + this->chunks[1] = this->chunks[1].swap_bytes(); + this->chunks[2] = this->chunks[2].swap_bytes(); + this->chunks[3] = this->chunks[3].swap_bytes(); } - simdutf_warn_unused result convert_utf16le_to_utf32_with_errors( - const char16_t *buf, size_t len, - char32_t *utf32_output) const noexcept final override { - return set_best()->convert_utf16le_to_utf32_with_errors(buf, len, - utf32_output); + simdutf_really_inline uint64_t eq(const T m) const { + const simd16 mask = simd16::splat(m); + return simd16x32(this->chunks[0] == mask, this->chunks[1] == mask, + this->chunks[2] == mask, this->chunks[3] == mask) + .to_bitmask(); } - simdutf_warn_unused result convert_utf16be_to_utf32_with_errors( - const char16_t *buf, size_t len, - char32_t *utf32_output) const noexcept final override { - return set_best()->convert_utf16be_to_utf32_with_errors(buf, len, - utf32_output); + simdutf_really_inline uint64_t lteq(const T m) const { + const simd16 mask = simd16::splat(m); + return simd16x32(this->chunks[0] <= mask, this->chunks[1] <= mask, + this->chunks[2] <= mask, this->chunks[3] <= mask) + .to_bitmask(); } - simdutf_warn_unused size_t convert_valid_utf16le_to_utf32( - const char16_t *buf, size_t len, - char32_t *utf32_output) const noexcept final override { - return set_best()->convert_valid_utf16le_to_utf32(buf, len, utf32_output); - } - - simdutf_warn_unused size_t convert_valid_utf16be_to_utf32( - const char16_t *buf, size_t len, - char32_t *utf32_output) const noexcept final override { - return set_best()->convert_valid_utf16be_to_utf32(buf, len, utf32_output); - } - - void change_endianness_utf16(const char16_t *buf, size_t len, - char16_t *output) const noexcept final override { - set_best()->change_endianness_utf16(buf, len, output); - } - - simdutf_warn_unused size_t - count_utf16le(const char16_t *buf, size_t len) const noexcept final override { - return set_best()->count_utf16le(buf, len); - } - - simdutf_warn_unused size_t - count_utf16be(const char16_t *buf, size_t len) const noexcept final override { - return set_best()->count_utf16be(buf, len); - } - - simdutf_warn_unused size_t - count_utf8(const char *buf, size_t len) const noexcept final override { - return set_best()->count_utf8(buf, len); - } - - simdutf_warn_unused size_t - latin1_length_from_utf8(const char *buf, size_t len) const noexcept override { - return set_best()->latin1_length_from_utf8(buf, len); - } - - simdutf_warn_unused size_t - latin1_length_from_utf16(size_t len) const noexcept override { - return set_best()->latin1_length_from_utf16(len); - } - - simdutf_warn_unused size_t - latin1_length_from_utf32(size_t len) const noexcept override { - return set_best()->latin1_length_from_utf32(len); - } - - simdutf_warn_unused size_t - utf8_length_from_latin1(const char *buf, size_t len) const noexcept override { - return set_best()->utf8_length_from_latin1(buf, len); - } - - simdutf_warn_unused size_t utf8_length_from_utf16le( - const char16_t *buf, size_t len) const noexcept override { - return set_best()->utf8_length_from_utf16le(buf, len); - } - - simdutf_warn_unused size_t utf8_length_from_utf16be( - const char16_t *buf, size_t len) const noexcept override { - return set_best()->utf8_length_from_utf16be(buf, len); - } - - simdutf_warn_unused size_t - utf16_length_from_latin1(size_t len) const noexcept override { - return set_best()->utf16_length_from_latin1(len); - } - - simdutf_warn_unused size_t - utf32_length_from_latin1(size_t len) const noexcept override { - return set_best()->utf32_length_from_latin1(len); - } - - simdutf_warn_unused size_t utf32_length_from_utf16le( - const char16_t *buf, size_t len) const noexcept override { - return set_best()->utf32_length_from_utf16le(buf, len); - } - - simdutf_warn_unused size_t utf32_length_from_utf16be( - const char16_t *buf, size_t len) const noexcept override { - return set_best()->utf32_length_from_utf16be(buf, len); - } - - simdutf_warn_unused size_t - utf16_length_from_utf8(const char *buf, size_t len) const noexcept override { - return set_best()->utf16_length_from_utf8(buf, len); - } - - simdutf_warn_unused size_t utf8_length_from_utf32( - const char32_t *buf, size_t len) const noexcept override { - return set_best()->utf8_length_from_utf32(buf, len); - } - - simdutf_warn_unused size_t utf16_length_from_utf32( - const char32_t *buf, size_t len) const noexcept override { - return set_best()->utf16_length_from_utf32(buf, len); - } - - simdutf_warn_unused size_t - utf32_length_from_utf8(const char *buf, size_t len) const noexcept override { - return set_best()->utf32_length_from_utf8(buf, len); - } + simdutf_really_inline uint64_t in_range(const T low, const T high) const { + const simd16 mask_low = simd16::splat(low); + const simd16 mask_high = simd16::splat(high); - simdutf_warn_unused size_t maximal_binary_length_from_base64( - const char *input, size_t length) const noexcept override { - return set_best()->maximal_binary_length_from_base64(input, length); + return simd16x32( + (this->chunks[0] <= mask_high) & (this->chunks[0] >= mask_low), + (this->chunks[1] <= mask_high) & (this->chunks[1] >= mask_low), + (this->chunks[2] <= mask_high) & (this->chunks[2] >= mask_low), + (this->chunks[3] <= mask_high) & (this->chunks[3] >= mask_low)) + .to_bitmask(); } - - simdutf_warn_unused result base64_to_binary( - const char *input, size_t length, char *output, base64_options options, - last_chunk_handling_options last_chunk_handling_options = - last_chunk_handling_options::loose) const noexcept override { - return set_best()->base64_to_binary(input, length, output, options, - last_chunk_handling_options); + simdutf_really_inline uint64_t not_in_range(const T low, const T high) const { + const simd16 mask_low = simd16::splat(low); + const simd16 mask_high = simd16::splat(high); + return simd16x32( + (this->chunks[0] > mask_high) | (this->chunks[0] < mask_low), + (this->chunks[1] > mask_high) | (this->chunks[1] < mask_low), + (this->chunks[2] > mask_high) | (this->chunks[2] < mask_low), + (this->chunks[3] > mask_high) | (this->chunks[3] < mask_low)) + .to_bitmask(); } - - simdutf_warn_unused full_result base64_to_binary_details( - const char *input, size_t length, char *output, base64_options options, - last_chunk_handling_options last_chunk_handling_options = - last_chunk_handling_options::loose) const noexcept override { - return set_best()->base64_to_binary_details(input, length, output, options, - last_chunk_handling_options); + simdutf_really_inline uint64_t lt(const T m) const { + const simd16 mask = simd16::splat(m); + return simd16x32(this->chunks[0] < mask, this->chunks[1] < mask, + this->chunks[2] < mask, this->chunks[3] < mask) + .to_bitmask(); } - simdutf_warn_unused size_t maximal_binary_length_from_base64( - const char16_t *input, size_t length) const noexcept override { - return set_best()->maximal_binary_length_from_base64(input, length); - } +}; // struct simd16x32 - simdutf_warn_unused result base64_to_binary( - const char16_t *input, size_t length, char *output, - base64_options options, - last_chunk_handling_options last_chunk_handling_options = - last_chunk_handling_options::loose) const noexcept override { - return set_best()->base64_to_binary(input, length, output, options, - last_chunk_handling_options); - } +template <> +simdutf_really_inline uint64_t simd16x32::not_in_range( + const uint16_t low, const uint16_t high) const { + const simd16 mask_low = simd16::splat(low); + const simd16 mask_high = simd16::splat(high); + simd16x32 x(simd16((this->chunks[0] > mask_high) | + (this->chunks[0] < mask_low)), + simd16((this->chunks[1] > mask_high) | + (this->chunks[1] < mask_low)), + simd16((this->chunks[2] > mask_high) | + (this->chunks[2] < mask_low)), + simd16((this->chunks[3] > mask_high) | + (this->chunks[3] < mask_low))); + return x.to_bitmask(); +} +/* end file src/simdutf/lsx/simd16-inl.h */ +} // namespace simd +} // unnamed namespace +} // namespace lsx +} // namespace simdutf - simdutf_warn_unused full_result base64_to_binary_details( - const char16_t *input, size_t length, char *output, - base64_options options, - last_chunk_handling_options last_chunk_handling_options = - last_chunk_handling_options::loose) const noexcept override { - return set_best()->base64_to_binary_details(input, length, output, options, - last_chunk_handling_options); - } +#endif // SIMDUTF_LSX_SIMD_H +/* end file src/simdutf/lsx/simd.h */ - simdutf_warn_unused size_t base64_length_from_binary( - size_t length, base64_options options) const noexcept override { - return set_best()->base64_length_from_binary(length, options); - } +/* begin file src/simdutf/lsx/end.h */ +/* end file src/simdutf/lsx/end.h */ - size_t binary_to_base64(const char *input, size_t length, char *output, - base64_options options) const noexcept override { - return set_best()->binary_to_base64(input, length, output, options); - } +#endif // SIMDUTF_IMPLEMENTATION_LSX - simdutf_really_inline - detect_best_supported_implementation_on_first_use() noexcept - : implementation("best_supported_detector", - "Detects the best supported implementation and sets it", - 0) {} +#endif // SIMDUTF_LSX_H +/* end file src/simdutf/lsx.h */ +/* begin file src/simdutf/lasx.h */ +#ifndef SIMDUTF_LASX_H +#define SIMDUTF_LASX_H -private: - const implementation *set_best() const noexcept; -}; +#ifdef SIMDUTF_FALLBACK_H + #error "lasx.h must be included before fallback.h" +#endif -static_assert(std::is_trivially_destructible< - detect_best_supported_implementation_on_first_use>::value, - "detect_best_supported_implementation_on_first_use should be " - "trivially destructible"); -static const std::initializer_list & -get_available_implementation_pointers() { - static const std::initializer_list - available_implementation_pointers{ -#if SIMDUTF_IMPLEMENTATION_ICELAKE - get_icelake_singleton(), +#ifndef SIMDUTF_IMPLEMENTATION_LASX + #define SIMDUTF_IMPLEMENTATION_LASX (SIMDUTF_IS_LASX) #endif -#if SIMDUTF_IMPLEMENTATION_HASWELL - get_haswell_singleton(), -#endif -#if SIMDUTF_IMPLEMENTATION_WESTMERE - get_westmere_singleton(), -#endif -#if SIMDUTF_IMPLEMENTATION_ARM64 - get_arm64_singleton(), -#endif -#if SIMDUTF_IMPLEMENTATION_PPC64 - get_ppc64_singleton(), -#endif -#if SIMDUTF_IMPLEMENTATION_RVV - get_rvv_singleton(), -#endif -#if SIMDUTF_IMPLEMENTATION_FALLBACK - get_fallback_singleton(), +#if SIMDUTF_IMPLEMENTATION_LASX && SIMDUTF_IS_LASX + #define SIMDUTF_CAN_ALWAYS_RUN_LASX 1 +#else + #define SIMDUTF_CAN_ALWAYS_RUN_LASX 0 #endif - }; // available_implementation_pointers - return available_implementation_pointers; -} -// So we can return UNSUPPORTED_ARCHITECTURE from the parser when there is no -// support -class unsupported_implementation final : public implementation { -public: - simdutf_warn_unused int detect_encodings(const char *, - size_t) const noexcept override { - return encoding_type::unspecified; - } +#define SIMDUTF_CAN_ALWAYS_RUN_FALLBACK (SIMDUTF_IMPLEMENTATION_FALLBACK) - simdutf_warn_unused bool validate_utf8(const char *, - size_t) const noexcept final override { - return false; // Just refuse to validate. Given that we have a fallback - // implementation - // it seems unlikely that unsupported_implementation will ever be used. If - // it is used, then it will flag all strings as invalid. The alternative is - // to return an error_code from which the user has to figure out whether the - // string is valid UTF-8... which seems like a lot of work just to handle - // the very unlikely case that we have an unsupported implementation. And, - // when it does happen (that we have an unsupported implementation), what - // are the chances that the programmer has a fallback? Given that *we* - // provide the fallback, it implies that the programmer would need a - // fallback for our fallback. - } +#if SIMDUTF_IMPLEMENTATION_LASX - simdutf_warn_unused result validate_utf8_with_errors( - const char *, size_t) const noexcept final override { - return result(error_code::OTHER, 0); - } +namespace simdutf { +/** + * Implementation for LoongArch ASX. + */ +namespace lasx {} // namespace lasx +} // namespace simdutf - simdutf_warn_unused bool - validate_ascii(const char *, size_t) const noexcept final override { - return false; - } +/* begin file src/simdutf/lasx/implementation.h */ +#ifndef SIMDUTF_LASX_IMPLEMENTATION_H +#define SIMDUTF_LASX_IMPLEMENTATION_H - simdutf_warn_unused result validate_ascii_with_errors( - const char *, size_t) const noexcept final override { - return result(error_code::OTHER, 0); - } - simdutf_warn_unused bool - validate_utf16le(const char16_t *, size_t) const noexcept final override { - return false; - } +namespace simdutf { +namespace lasx { - simdutf_warn_unused bool - validate_utf16be(const char16_t *, size_t) const noexcept final override { - return false; - } +namespace { +using namespace simdutf; +} +class implementation final : public simdutf::implementation { +public: + simdutf_really_inline implementation() + : simdutf::implementation("lasx", "LOONGARCH ASX", + internal::instruction_set::LSX | + internal::instruction_set::LASX) {} + simdutf_warn_unused int detect_encodings(const char *input, + size_t length) const noexcept final; + simdutf_warn_unused bool validate_utf8(const char *buf, + size_t len) const noexcept final; + simdutf_warn_unused result + validate_utf8_with_errors(const char *buf, size_t len) const noexcept final; + simdutf_warn_unused bool validate_ascii(const char *buf, + size_t len) const noexcept final; + simdutf_warn_unused result + validate_ascii_with_errors(const char *buf, size_t len) const noexcept final; + simdutf_warn_unused bool validate_utf16le(const char16_t *buf, + size_t len) const noexcept final; + simdutf_warn_unused bool validate_utf16be(const char16_t *buf, + size_t len) const noexcept final; simdutf_warn_unused result validate_utf16le_with_errors( - const char16_t *, size_t) const noexcept final override { - return result(error_code::OTHER, 0); - } - + const char16_t *buf, size_t len) const noexcept final; simdutf_warn_unused result validate_utf16be_with_errors( - const char16_t *, size_t) const noexcept final override { - return result(error_code::OTHER, 0); - } - - simdutf_warn_unused bool - validate_utf32(const char32_t *, size_t) const noexcept final override { - return false; - } - + const char16_t *buf, size_t len) const noexcept final; + simdutf_warn_unused bool validate_utf32(const char32_t *buf, + size_t len) const noexcept final; simdutf_warn_unused result validate_utf32_with_errors( - const char32_t *, size_t) const noexcept final override { - return result(error_code::OTHER, 0); - } - + const char32_t *buf, size_t len) const noexcept final; simdutf_warn_unused size_t convert_latin1_to_utf8( - const char *, size_t, char *) const noexcept final override { - return 0; - } - + const char *buf, size_t len, char *utf8_output) const noexcept final; simdutf_warn_unused size_t convert_latin1_to_utf16le( - const char *, size_t, char16_t *) const noexcept final override { - return 0; - } - + const char *buf, size_t len, char16_t *utf16_buffer) const noexcept final; simdutf_warn_unused size_t convert_latin1_to_utf16be( - const char *, size_t, char16_t *) const noexcept final override { - return 0; - } - + const char *buf, size_t len, char16_t *utf16_buffer) const noexcept final; simdutf_warn_unused size_t convert_latin1_to_utf32( - const char *, size_t, char32_t *) const noexcept final override { - return 0; - } - + const char *buf, size_t len, char32_t *utf32_output) const noexcept final; simdutf_warn_unused size_t convert_utf8_to_latin1( - const char *, size_t, char *) const noexcept final override { - return 0; - } - + const char *buf, size_t len, char *latin1_output) const noexcept final; simdutf_warn_unused result convert_utf8_to_latin1_with_errors( - const char *, size_t, char *) const noexcept final override { - return result(error_code::OTHER, 0); - } - + const char *buf, size_t len, char *latin1_buffer) const noexcept final; simdutf_warn_unused size_t convert_valid_utf8_to_latin1( - const char *, size_t, char *) const noexcept final override { - return 0; - } - + const char *buf, size_t len, char *latin1_output) const noexcept final; simdutf_warn_unused size_t convert_utf8_to_utf16le( - const char *, size_t, char16_t *) const noexcept final override { - return 0; - } - + const char *buf, size_t len, char16_t *utf16_output) const noexcept final; simdutf_warn_unused size_t convert_utf8_to_utf16be( - const char *, size_t, char16_t *) const noexcept final override { - return 0; - } - + const char *buf, size_t len, char16_t *utf16_output) const noexcept final; simdutf_warn_unused result convert_utf8_to_utf16le_with_errors( - const char *, size_t, char16_t *) const noexcept final override { - return result(error_code::OTHER, 0); - } - + const char *buf, size_t len, char16_t *utf16_output) const noexcept final; simdutf_warn_unused result convert_utf8_to_utf16be_with_errors( - const char *, size_t, char16_t *) const noexcept final override { - return result(error_code::OTHER, 0); - } - + const char *buf, size_t len, char16_t *utf16_output) const noexcept final; simdutf_warn_unused size_t convert_valid_utf8_to_utf16le( - const char *, size_t, char16_t *) const noexcept final override { - return 0; - } - + const char *buf, size_t len, char16_t *utf16_buffer) const noexcept final; simdutf_warn_unused size_t convert_valid_utf8_to_utf16be( - const char *, size_t, char16_t *) const noexcept final override { - return 0; - } - + const char *buf, size_t len, char16_t *utf16_buffer) const noexcept final; simdutf_warn_unused size_t convert_utf8_to_utf32( - const char *, size_t, char32_t *) const noexcept final override { - return 0; - } - + const char *buf, size_t len, char32_t *utf32_output) const noexcept final; simdutf_warn_unused result convert_utf8_to_utf32_with_errors( - const char *, size_t, char32_t *) const noexcept final override { - return result(error_code::OTHER, 0); - } - + const char *buf, size_t len, char32_t *utf32_output) const noexcept final; simdutf_warn_unused size_t convert_valid_utf8_to_utf32( - const char *, size_t, char32_t *) const noexcept final override { - return 0; - } - - simdutf_warn_unused size_t convert_utf16le_to_latin1( - const char16_t *, size_t, char *) const noexcept final override { - return 0; - } - - simdutf_warn_unused size_t convert_utf16be_to_latin1( - const char16_t *, size_t, char *) const noexcept final override { - return 0; - } - + const char *buf, size_t len, char32_t *utf32_buffer) const noexcept final; + simdutf_warn_unused size_t + convert_utf16le_to_latin1(const char16_t *buf, size_t len, + char *latin1_buffer) const noexcept final; + simdutf_warn_unused size_t + convert_utf16be_to_latin1(const char16_t *buf, size_t len, + char *latin1_buffer) const noexcept final; simdutf_warn_unused result convert_utf16le_to_latin1_with_errors( - const char16_t *, size_t, char *) const noexcept final override { - return result(error_code::OTHER, 0); - } - + const char16_t *buf, size_t len, + char *latin1_buffer) const noexcept final; simdutf_warn_unused result convert_utf16be_to_latin1_with_errors( - const char16_t *, size_t, char *) const noexcept final override { - return result(error_code::OTHER, 0); - } - - simdutf_warn_unused size_t convert_valid_utf16le_to_latin1( - const char16_t *, size_t, char *) const noexcept final override { - return 0; - } - - simdutf_warn_unused size_t convert_valid_utf16be_to_latin1( - const char16_t *, size_t, char *) const noexcept final override { - return 0; - } - + const char16_t *buf, size_t len, + char *latin1_buffer) const noexcept final; + simdutf_warn_unused size_t + convert_valid_utf16le_to_latin1(const char16_t *buf, size_t len, + char *latin1_buffer) const noexcept final; + simdutf_warn_unused size_t + convert_valid_utf16be_to_latin1(const char16_t *buf, size_t len, + char *latin1_buffer) const noexcept final; simdutf_warn_unused size_t convert_utf16le_to_utf8( - const char16_t *, size_t, char *) const noexcept final override { - return 0; - } - + const char16_t *buf, size_t len, char *utf8_buffer) const noexcept final; simdutf_warn_unused size_t convert_utf16be_to_utf8( - const char16_t *, size_t, char *) const noexcept final override { - return 0; - } - + const char16_t *buf, size_t len, char *utf8_buffer) const noexcept final; simdutf_warn_unused result convert_utf16le_to_utf8_with_errors( - const char16_t *, size_t, char *) const noexcept final override { - return result(error_code::OTHER, 0); - } - + const char16_t *buf, size_t len, char *utf8_buffer) const noexcept final; simdutf_warn_unused result convert_utf16be_to_utf8_with_errors( - const char16_t *, size_t, char *) const noexcept final override { - return result(error_code::OTHER, 0); - } - + const char16_t *buf, size_t len, char *utf8_buffer) const noexcept final; simdutf_warn_unused size_t convert_valid_utf16le_to_utf8( - const char16_t *, size_t, char *) const noexcept final override { - return 0; - } - + const char16_t *buf, size_t len, char *utf8_buffer) const noexcept final; simdutf_warn_unused size_t convert_valid_utf16be_to_utf8( - const char16_t *, size_t, char *) const noexcept final override { - return 0; - } - - simdutf_warn_unused size_t convert_utf32_to_latin1( - const char32_t *, size_t, char *) const noexcept final override { - return 0; - } - - simdutf_warn_unused result convert_utf32_to_latin1_with_errors( - const char32_t *, size_t, char *) const noexcept final override { - return result(error_code::OTHER, 0); - } - - simdutf_warn_unused size_t convert_valid_utf32_to_latin1( - const char32_t *, size_t, char *) const noexcept final override { - return 0; - } - + const char16_t *buf, size_t len, char *utf8_buffer) const noexcept final; + simdutf_warn_unused size_t + convert_utf32_to_latin1(const char32_t *buf, size_t len, + char *latin1_output) const noexcept final; + simdutf_warn_unused result + convert_utf32_to_latin1_with_errors(const char32_t *buf, size_t len, + char *latin1_output) const noexcept final; + simdutf_warn_unused size_t + convert_valid_utf32_to_latin1(const char32_t *buf, size_t len, + char *latin1_output) const noexcept final; simdutf_warn_unused size_t convert_utf32_to_utf8( - const char32_t *, size_t, char *) const noexcept final override { - return 0; - } - + const char32_t *buf, size_t len, char *utf8_buffer) const noexcept final; simdutf_warn_unused result convert_utf32_to_utf8_with_errors( - const char32_t *, size_t, char *) const noexcept final override { - return result(error_code::OTHER, 0); - } - + const char32_t *buf, size_t len, char *utf8_buffer) const noexcept final; simdutf_warn_unused size_t convert_valid_utf32_to_utf8( - const char32_t *, size_t, char *) const noexcept final override { - return 0; - } - - simdutf_warn_unused size_t convert_utf32_to_utf16le( - const char32_t *, size_t, char16_t *) const noexcept final override { - return 0; - } + const char32_t *buf, size_t len, char *utf8_buffer) const noexcept final; + simdutf_warn_unused size_t + convert_utf32_to_utf16le(const char32_t *buf, size_t len, + char16_t *utf16_buffer) const noexcept final; + simdutf_warn_unused size_t + convert_utf32_to_utf16be(const char32_t *buf, size_t len, + char16_t *utf16_buffer) const noexcept final; + simdutf_warn_unused result convert_utf32_to_utf16le_with_errors( + const char32_t *buf, size_t len, + char16_t *utf16_buffer) const noexcept final; + simdutf_warn_unused result convert_utf32_to_utf16be_with_errors( + const char32_t *buf, size_t len, + char16_t *utf16_buffer) const noexcept final; + simdutf_warn_unused size_t + convert_valid_utf32_to_utf16le(const char32_t *buf, size_t len, + char16_t *utf16_buffer) const noexcept final; + simdutf_warn_unused size_t + convert_valid_utf32_to_utf16be(const char32_t *buf, size_t len, + char16_t *utf16_buffer) const noexcept final; + simdutf_warn_unused size_t + convert_utf16le_to_utf32(const char16_t *buf, size_t len, + char32_t *utf32_buffer) const noexcept final; + simdutf_warn_unused size_t + convert_utf16be_to_utf32(const char16_t *buf, size_t len, + char32_t *utf32_buffer) const noexcept final; + simdutf_warn_unused result convert_utf16le_to_utf32_with_errors( + const char16_t *buf, size_t len, + char32_t *utf32_buffer) const noexcept final; + simdutf_warn_unused result convert_utf16be_to_utf32_with_errors( + const char16_t *buf, size_t len, + char32_t *utf32_buffer) const noexcept final; + simdutf_warn_unused size_t + convert_valid_utf16le_to_utf32(const char16_t *buf, size_t len, + char32_t *utf32_buffer) const noexcept final; + simdutf_warn_unused size_t + convert_valid_utf16be_to_utf32(const char16_t *buf, size_t len, + char32_t *utf32_buffer) const noexcept final; + void change_endianness_utf16(const char16_t *buf, size_t length, + char16_t *output) const noexcept final; + simdutf_warn_unused size_t count_utf16le(const char16_t *buf, + size_t length) const noexcept; + simdutf_warn_unused size_t count_utf16be(const char16_t *buf, + size_t length) const noexcept; + simdutf_warn_unused size_t count_utf8(const char *buf, + size_t length) const noexcept; + simdutf_warn_unused size_t + utf8_length_from_utf16le(const char16_t *input, size_t length) const noexcept; + simdutf_warn_unused size_t + utf8_length_from_utf16be(const char16_t *input, size_t length) const noexcept; + simdutf_warn_unused size_t utf32_length_from_utf16le( + const char16_t *input, size_t length) const noexcept; + simdutf_warn_unused size_t utf32_length_from_utf16be( + const char16_t *input, size_t length) const noexcept; + simdutf_warn_unused size_t + utf16_length_from_utf8(const char *input, size_t length) const noexcept; + simdutf_warn_unused size_t + utf8_length_from_utf32(const char32_t *input, size_t length) const noexcept; + simdutf_warn_unused size_t + utf16_length_from_utf32(const char32_t *input, size_t length) const noexcept; + simdutf_warn_unused size_t + utf32_length_from_utf8(const char *input, size_t length) const noexcept; + simdutf_warn_unused size_t + latin1_length_from_utf8(const char *input, size_t length) const noexcept; + simdutf_warn_unused size_t + latin1_length_from_utf16(size_t length) const noexcept; + simdutf_warn_unused size_t + latin1_length_from_utf32(size_t length) const noexcept; + simdutf_warn_unused size_t + utf32_length_from_latin1(size_t length) const noexcept; + simdutf_warn_unused size_t + utf16_length_from_latin1(size_t length) const noexcept; + simdutf_warn_unused size_t + utf8_length_from_latin1(const char *input, size_t length) const noexcept; + simdutf_warn_unused size_t maximal_binary_length_from_base64( + const char *input, size_t length) const noexcept; + simdutf_warn_unused result + base64_to_binary(const char *input, size_t length, char *output, + base64_options options) const noexcept; + simdutf_warn_unused size_t maximal_binary_length_from_base64( + const char16_t *input, size_t length) const noexcept; + simdutf_warn_unused result + base64_to_binary(const char16_t *input, size_t length, char *output, + base64_options options) const noexcept; + simdutf_warn_unused size_t base64_length_from_binary( + size_t length, base64_options options) const noexcept; + size_t binary_to_base64(const char *input, size_t length, char *output, + base64_options options) const noexcept; - simdutf_warn_unused size_t convert_utf32_to_utf16be( - const char32_t *, size_t, char16_t *) const noexcept final override { - return 0; - } + simdutf_warn_unused virtual result + base64_to_binary(const char *input, size_t length, char *output, + base64_options options, + last_chunk_handling_options last_chunk_options = + last_chunk_handling_options::loose) const noexcept; + simdutf_warn_unused virtual full_result base64_to_binary_details( + const char *input, size_t length, char *output, base64_options options, + last_chunk_handling_options last_chunk_options = + last_chunk_handling_options::loose) const noexcept; + simdutf_warn_unused virtual result + base64_to_binary(const char16_t *input, size_t length, char *output, + base64_options options, + last_chunk_handling_options last_chunk_options = + last_chunk_handling_options::loose) const noexcept; + simdutf_warn_unused virtual full_result base64_to_binary_details( + const char16_t *input, size_t length, char *output, + base64_options options, + last_chunk_handling_options last_chunk_options = + last_chunk_handling_options::loose) const noexcept; +}; - simdutf_warn_unused result convert_utf32_to_utf16le_with_errors( - const char32_t *, size_t, char16_t *) const noexcept final override { - return result(error_code::OTHER, 0); - } +} // namespace lasx +} // namespace simdutf - simdutf_warn_unused result convert_utf32_to_utf16be_with_errors( - const char32_t *, size_t, char16_t *) const noexcept final override { - return result(error_code::OTHER, 0); - } +#endif // SIMDUTF_LASX_IMPLEMENTATION_H +/* end file src/simdutf/lasx/implementation.h */ - simdutf_warn_unused size_t convert_valid_utf32_to_utf16le( - const char32_t *, size_t, char16_t *) const noexcept final override { - return 0; - } +/* begin file src/simdutf/lasx/begin.h */ +// redefining SIMDUTF_IMPLEMENTATION to "lasx" +// #define SIMDUTF_IMPLEMENTATION lasx +/* end file src/simdutf/lasx/begin.h */ - simdutf_warn_unused size_t convert_valid_utf32_to_utf16be( - const char32_t *, size_t, char16_t *) const noexcept final override { - return 0; - } + // Declarations +/* begin file src/simdutf/lasx/intrinsics.h */ +#ifndef SIMDUTF_LASX_INTRINSICS_H +#define SIMDUTF_LASX_INTRINSICS_H - simdutf_warn_unused size_t convert_utf16le_to_utf32( - const char16_t *, size_t, char32_t *) const noexcept final override { - return 0; - } - simdutf_warn_unused size_t convert_utf16be_to_utf32( - const char16_t *, size_t, char32_t *) const noexcept final override { - return 0; - } +// This should be the correct header whether +// you use visual studio or other compilers. +#include +#include + +#if defined(__loongarch_asx) + #ifdef __clang__ + #define VREGS_PREFIX "$vr" + #define XREGS_PREFIX "$xr" + #else // GCC + #define VREGS_PREFIX "$f" + #define XREGS_PREFIX "$f" + #endif + #define __ALL_REGS \ + "0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26," \ + "27,28,29,30,31" +// Convert __m128i to __m256i +static inline __m256i ____m256i(__m128i in) { + __m256i out = __lasx_xvldi(0); + __asm__ volatile(".irp i," __ALL_REGS "\n\t" + " .ifc %[out], " XREGS_PREFIX "\\i \n\t" + " .irp j," __ALL_REGS "\n\t" + " .ifc %[in], " VREGS_PREFIX "\\j \n\t" + " xvpermi.q $xr\\i, $xr\\j, 0x0 \n\t" + " .endif \n\t" + " .endr \n\t" + " .endif \n\t" + ".endr \n\t" + : [out] "+f"(out) + : [in] "f"(in)); + return out; +} +// Convert two __m128i to __m256i +static inline __m256i lasx_set_q(__m128i inhi, __m128i inlo) { + __m256i out; + __asm__ volatile(".irp i," __ALL_REGS "\n\t" + " .ifc %[hi], " VREGS_PREFIX "\\i \n\t" + " .irp j," __ALL_REGS "\n\t" + " .ifc %[lo], " VREGS_PREFIX "\\j \n\t" + " xvpermi.q $xr\\i, $xr\\j, 0x20 \n\t" + " .endif \n\t" + " .endr \n\t" + " .endif \n\t" + ".endr \n\t" + ".ifnc %[out], %[hi] \n\t" + ".irp i," __ALL_REGS "\n\t" + " .ifc %[out], " XREGS_PREFIX "\\i \n\t" + " .irp j," __ALL_REGS "\n\t" + " .ifc %[hi], " VREGS_PREFIX "\\j \n\t" + " xvori.b $xr\\i, $xr\\j, 0 \n\t" + " .endif \n\t" + " .endr \n\t" + " .endif \n\t" + ".endr \n\t" + ".endif \n\t" + : [out] "=f"(out), [hi] "+f"(inhi) + : [lo] "f"(inlo)); + return out; +} +// Convert __m256i low part to __m128i +static inline __m128i lasx_extracti128_lo(__m256i in) { + __m128i out; + __asm__ volatile(".ifnc %[out], %[in] \n\t" + ".irp i," __ALL_REGS "\n\t" + " .ifc %[out], " VREGS_PREFIX "\\i \n\t" + " .irp j," __ALL_REGS "\n\t" + " .ifc %[in], " XREGS_PREFIX "\\j \n\t" + " vori.b $vr\\i, $vr\\j, 0 \n\t" + " .endif \n\t" + " .endr \n\t" + " .endif \n\t" + ".endr \n\t" + ".endif \n\t" + : [out] "=f"(out) + : [in] "f"(in)); + return out; +} +// Convert __m256i high part to __m128i +static inline __m128i lasx_extracti128_hi(__m256i in) { + __m128i out; + __asm__ volatile(".irp i," __ALL_REGS "\n\t" + " .ifc %[out], " VREGS_PREFIX "\\i \n\t" + " .irp j," __ALL_REGS "\n\t" + " .ifc %[in], " XREGS_PREFIX "\\j \n\t" + " xvpermi.q $xr\\i, $xr\\j, 0x11 \n\t" + " .endif \n\t" + " .endr \n\t" + " .endif \n\t" + ".endr \n\t" + : [out] "=f"(out) + : [in] "f"(in)); + return out; +} +#endif - simdutf_warn_unused result convert_utf16le_to_utf32_with_errors( - const char16_t *, size_t, char32_t *) const noexcept final override { - return result(error_code::OTHER, 0); - } +#endif // SIMDUTF_LASX_INTRINSICS_H +/* end file src/simdutf/lasx/intrinsics.h */ +/* begin file src/simdutf/lasx/bitmanipulation.h */ +#ifndef SIMDUTF_LASX_BITMANIPULATION_H +#define SIMDUTF_LASX_BITMANIPULATION_H - simdutf_warn_unused result convert_utf16be_to_utf32_with_errors( - const char16_t *, size_t, char32_t *) const noexcept final override { - return result(error_code::OTHER, 0); - } +#include - simdutf_warn_unused size_t convert_valid_utf16le_to_utf32( - const char16_t *, size_t, char32_t *) const noexcept final override { - return 0; - } +namespace simdutf { +namespace lasx { +namespace { - simdutf_warn_unused size_t convert_valid_utf16be_to_utf32( - const char16_t *, size_t, char32_t *) const noexcept final override { - return 0; - } +simdutf_really_inline int count_ones(uint64_t input_num) { + return __lsx_vpickve2gr_w(__lsx_vpcnt_d(__lsx_vreplgr2vr_d(input_num)), 0); +} - void change_endianness_utf16(const char16_t *, size_t, - char16_t *) const noexcept final override {} +#if SIMDUTF_NEED_TRAILING_ZEROES +simdutf_really_inline int trailing_zeroes(uint64_t input_num) { + return __builtin_ctzll(input_num); +} +#endif - simdutf_warn_unused size_t - count_utf16le(const char16_t *, size_t) const noexcept final override { - return 0; - } +} // unnamed namespace +} // namespace lasx +} // namespace simdutf - simdutf_warn_unused size_t - count_utf16be(const char16_t *, size_t) const noexcept final override { - return 0; - } +#endif // SIMDUTF_LASX_BITMANIPULATION_H +/* end file src/simdutf/lasx/bitmanipulation.h */ +/* begin file src/simdutf/lasx/simd.h */ +#ifndef SIMDUTF_LASX_SIMD_H +#define SIMDUTF_LASX_SIMD_H - simdutf_warn_unused size_t count_utf8(const char *, - size_t) const noexcept final override { - return 0; - } +#include - simdutf_warn_unused size_t - latin1_length_from_utf8(const char *, size_t) const noexcept override { - return 0; - } +namespace simdutf { +namespace lasx { +namespace { +namespace simd { - simdutf_warn_unused size_t - latin1_length_from_utf16(size_t) const noexcept override { - return 0; +__attribute__((aligned(32))) static const uint8_t prev_shuf_table[32][32] = { + {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, + {0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 31, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}, + {0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 30, 31, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}, + {0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, + 29, 30, 31, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}, + {0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 28, 29, 30, 31, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}, + {0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 27, 28, 29, 30, 31, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, + {0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 26, 27, 28, 29, 30, 31, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, + {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, + 25, 26, 27, 28, 29, 30, 31, 0, 1, 2, 3, 4, 5, 6, 7, 8}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, + 24, 25, 26, 27, 28, 29, 30, 31, 0, 1, 2, 3, 4, 5, 6, 7}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 0, 1, 2, 3, 4, 5, 6}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 0, 1, 2, 3, 4, 5}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 0, 1, 2, 3, 4}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 0, 1, 2, 3}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 0, 1, 2}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 0, 1}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 0}, + {15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 9, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 8, 9, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0}, + {7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0}, + {6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0}, + {5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0}, + {4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0}, + {3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 0, 0}, + {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 0}, + {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0}, + {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, +}; + +__attribute__((aligned(32))) static const uint8_t bitsel_mask_table[32][32] = { + {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, + {0xFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, + {0xFF, 0xFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, + {0xFF, 0xFF, 0xFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, + {0xFF, 0xFF, 0xFF, 0xFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, 0x0, 0x0, 0x0, 0x0}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, 0x0, 0x0, 0x0}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, 0x0, 0x0}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0, 0x0}, + {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0}}; + +// Forward-declared so they can be used by splat and friends. +template struct base { + __m256i value; + + // Zero constructor + simdutf_really_inline base() : value{__m256i()} {} + + // Conversion from SIMD register + simdutf_really_inline base(const __m256i _value) : value(_value) {} + // Conversion to SIMD register + simdutf_really_inline operator const __m256i &() const { return this->value; } + simdutf_really_inline operator __m256i &() { return this->value; } + template + simdutf_really_inline void store_ascii_as_utf16(char16_t *ptr) const { + if (big_endian) { + __m256i zero = __lasx_xvldi(0); + __m256i in8 = __lasx_xvpermi_d(this->value, 0b11011000); + __m256i inlow = __lasx_xvilvl_b(in8, zero); + __m256i inhigh = __lasx_xvilvh_b(in8, zero); + __lasx_xvst(inlow, reinterpret_cast(ptr), 0); + __lasx_xvst(inhigh, reinterpret_cast(ptr), 32); + } else { + __m256i inlow = __lasx_vext2xv_hu_bu(this->value); + __m256i inhigh = __lasx_vext2xv_hu_bu( + __lasx_xvpermi_q(this->value, this->value, 0b00000001)); + __lasx_xvst(inlow, reinterpret_cast<__m256i *>(ptr), 0); + __lasx_xvst(inhigh, reinterpret_cast<__m256i *>(ptr), 32); + } } + simdutf_really_inline void store_ascii_as_utf32(char32_t *ptr) const { + __m256i in32_0 = __lasx_vext2xv_wu_bu(this->value); + __lasx_xvst(in32_0, reinterpret_cast(ptr), 0); - simdutf_warn_unused size_t - latin1_length_from_utf32(size_t) const noexcept override { - return 0; + __m256i in8_1 = __lasx_xvpermi_d(this->value, 0b00000001); + __m256i in32_1 = __lasx_vext2xv_wu_bu(in8_1); + __lasx_xvst(in32_1, reinterpret_cast(ptr), 32); + + __m256i in8_2 = __lasx_xvpermi_d(this->value, 0b00000010); + __m256i in32_2 = __lasx_vext2xv_wu_bu(in8_2); + __lasx_xvst(in32_2, reinterpret_cast(ptr), 64); + + __m256i in8_3 = __lasx_xvpermi_d(this->value, 0b00000011); + __m256i in32_3 = __lasx_vext2xv_wu_bu(in8_3); + __lasx_xvst(in32_3, reinterpret_cast(ptr), 96); } - simdutf_warn_unused size_t - utf8_length_from_latin1(const char *, size_t) const noexcept override { - return 0; + // Bit operations + simdutf_really_inline Child operator|(const Child other) const { + return __lasx_xvor_v(this->value, other); } - - simdutf_warn_unused size_t - utf8_length_from_utf16le(const char16_t *, size_t) const noexcept override { - return 0; + simdutf_really_inline Child operator&(const Child other) const { + return __lasx_xvand_v(this->value, other); } - - simdutf_warn_unused size_t - utf8_length_from_utf16be(const char16_t *, size_t) const noexcept override { - return 0; + simdutf_really_inline Child operator^(const Child other) const { + return __lasx_xvxor_v(this->value, other); } - - simdutf_warn_unused size_t - utf32_length_from_utf16le(const char16_t *, size_t) const noexcept override { - return 0; + simdutf_really_inline Child bit_andnot(const Child other) const { + return __lasx_xvandn_v(this->value, other); } - - simdutf_warn_unused size_t - utf32_length_from_utf16be(const char16_t *, size_t) const noexcept override { - return 0; + simdutf_really_inline Child &operator|=(const Child other) { + auto this_cast = static_cast(this); + *this_cast = *this_cast | other; + return *this_cast; } - - simdutf_warn_unused size_t - utf32_length_from_latin1(size_t) const noexcept override { - return 0; + simdutf_really_inline Child &operator&=(const Child other) { + auto this_cast = static_cast(this); + *this_cast = *this_cast & other; + return *this_cast; + } + simdutf_really_inline Child &operator^=(const Child other) { + auto this_cast = static_cast(this); + *this_cast = *this_cast ^ other; + return *this_cast; } +}; - simdutf_warn_unused size_t - utf16_length_from_utf8(const char *, size_t) const noexcept override { - return 0; +template struct simd8; + +template > +struct base8 : base> { + typedef uint32_t bitmask_t; + typedef uint64_t bitmask2_t; + + simdutf_really_inline base8() : base>() {} + simdutf_really_inline base8(const __m256i _value) : base>(_value) {} + simdutf_really_inline T first() const { + return __lasx_xvpickve2gr_wu(this->value, 0); } - simdutf_warn_unused size_t - utf16_length_from_latin1(size_t) const noexcept override { - return 0; + simdutf_really_inline T last() const { + return __lasx_xvpickve2gr_wu(this->value, 7); } - simdutf_warn_unused size_t - utf8_length_from_utf32(const char32_t *, size_t) const noexcept override { - return 0; + friend simdutf_really_inline Mask operator==(const simd8 lhs, + const simd8 rhs) { + return __lasx_xvseq_b(lhs, rhs); } - simdutf_warn_unused size_t - utf16_length_from_utf32(const char32_t *, size_t) const noexcept override { - return 0; - } + static const int SIZE = sizeof(base::value); - simdutf_warn_unused size_t - utf32_length_from_utf8(const char *, size_t) const noexcept override { - return 0; + template + simdutf_really_inline simd8 prev(const simd8 prev_chunk) const { + if (!N) + return this->value; + + __m256i zero = __lasx_xvldi(0); + __m256i result, shuf; + if (N < 16) { + shuf = __lasx_xvld(prev_shuf_table[N], 0); + + result = __lasx_xvshuf_b( + __lasx_xvpermi_q(this->value, this->value, 0b00000001), this->value, + shuf); + __m256i srl_prev = __lasx_xvbsrl_v( + __lasx_xvpermi_q(zero, prev_chunk.value, 0b00110001), (16 - N)); + __m256i mask = __lasx_xvld(bitsel_mask_table[N], 0); + result = __lasx_xvbitsel_v(result, srl_prev, mask); + + return result; + } else if (N == 16) { + return __lasx_xvpermi_q(this->value, prev_chunk.value, 0b00100001); + } /*else { + __m256i sll_value = __lasx_xvbsll_v( + __lasx_xvpermi_q(zero, this->value, 0b00000011), (N - 16) % 32); + __m256i mask = __lasx_xvld(bitsel_mask_table[N], 0); + shuf = __lasx_xvld(prev_shuf_table[N], 0); + result = __lasx_xvshuf_b( + __lasx_xvpermi_q(prev_chunk.value, prev_chunk.value, 0b00000001), + prev_chunk.value, shuf); + result = __lasx_xvbitsel_v(sll_value, result, mask); + return result; + }*/ } +}; - simdutf_warn_unused size_t maximal_binary_length_from_base64( - const char *, size_t) const noexcept override { - return 0; +// SIMD byte mask type (returned by things like eq and gt) +template <> struct simd8 : base8 { + static simdutf_really_inline simd8 splat(bool _value) { + return __lasx_xvreplgr2vr_b(uint8_t(-(!!_value))); } - simdutf_warn_unused result - base64_to_binary(const char *, size_t, char *, base64_options, - last_chunk_handling_options) const noexcept override { - return result(error_code::OTHER, 0); - } + simdutf_really_inline simd8() : base8() {} + simdutf_really_inline simd8(const __m256i _value) : base8(_value) {} + // Splat constructor + simdutf_really_inline simd8(bool _value) : base8(splat(_value)) {} - simdutf_warn_unused full_result base64_to_binary_details( - const char *, size_t, char *, base64_options, - last_chunk_handling_options) const noexcept override { - return full_result(error_code::OTHER, 0, 0); + simdutf_really_inline uint32_t to_bitmask() const { + __m256i mask = __lasx_xvmsknz_b(this->value); + uint32_t mask0 = __lasx_xvpickve2gr_wu(mask, 0); + uint32_t mask1 = __lasx_xvpickve2gr_wu(mask, 4); + return (mask0 | (mask1 << 16)); } - - simdutf_warn_unused size_t maximal_binary_length_from_base64( - const char16_t *, size_t) const noexcept override { - return 0; + simdutf_really_inline bool any() const { + if (__lasx_xbz_b(this->value)) + return false; + return true; } - - simdutf_warn_unused result - base64_to_binary(const char16_t *, size_t, char *, base64_options, - last_chunk_handling_options) const noexcept override { - return result(error_code::OTHER, 0); + simdutf_really_inline bool none() const { + if (__lasx_xbz_b(this->value)) + return true; + return false; } - - simdutf_warn_unused full_result base64_to_binary_details( - const char16_t *, size_t, char *, base64_options, - last_chunk_handling_options) const noexcept override { - return full_result(error_code::OTHER, 0, 0); + simdutf_really_inline bool all() const { + if (__lasx_xbnz_b(this->value)) + return true; + return false; } + simdutf_really_inline simd8 operator~() const { return *this ^ true; } +}; - simdutf_warn_unused size_t - base64_length_from_binary(size_t, base64_options) const noexcept override { - return 0; +template struct base8_numeric : base8 { + static simdutf_really_inline simd8 splat(T _value) { + return __lasx_xvreplgr2vr_b(_value); } - - size_t binary_to_base64(const char *, size_t, char *, - base64_options) const noexcept override { - return 0; + static simdutf_really_inline simd8 zero() { return __lasx_xvldi(0); } + static simdutf_really_inline simd8 load(const T values[32]) { + return __lasx_xvld(reinterpret_cast(values), 0); + } + // Repeat 16 values as many times as necessary (usually for lookup tables) + static simdutf_really_inline simd8 repeat_16(T v0, T v1, T v2, T v3, T v4, + T v5, T v6, T v7, T v8, T v9, + T v10, T v11, T v12, T v13, + T v14, T v15) { + return simd8(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, + v14, v15, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, + v12, v13, v14, v15); } - unsupported_implementation() - : implementation("unsupported", - "Unsupported CPU (no detected SIMD instructions)", 0) {} -}; - -const unsupported_implementation *get_unsupported_singleton() { - static const unsupported_implementation unsupported_singleton{}; - return &unsupported_singleton; -} -static_assert(std::is_trivially_destructible::value, - "unsupported_singleton should be trivially destructible"); + simdutf_really_inline base8_numeric() : base8() {} + simdutf_really_inline base8_numeric(const __m256i _value) + : base8(_value) {} -size_t available_implementation_list::size() const noexcept { - return internal::get_available_implementation_pointers().size(); -} -const implementation *const * -available_implementation_list::begin() const noexcept { - return internal::get_available_implementation_pointers().begin(); -} -const implementation *const * -available_implementation_list::end() const noexcept { - return internal::get_available_implementation_pointers().end(); -} -const implementation * -available_implementation_list::detect_best_supported() const noexcept { - // They are prelisted in priority order, so we just go down the list - uint32_t supported_instruction_sets = - internal::detect_supported_architectures(); - for (const implementation *impl : - internal::get_available_implementation_pointers()) { - uint32_t required_instruction_sets = impl->required_instruction_sets(); - if ((supported_instruction_sets & required_instruction_sets) == - required_instruction_sets) { - return impl; - } + // Store to array + simdutf_really_inline void store(T dst[32]) const { + return __lasx_xvst(this->value, reinterpret_cast<__m256i *>(dst), 0); } - return get_unsupported_singleton(); // this should never happen? -} - -const implementation * -detect_best_supported_implementation_on_first_use::set_best() const noexcept { - SIMDUTF_PUSH_DISABLE_WARNINGS - SIMDUTF_DISABLE_DEPRECATED_WARNING // Disable CRT_SECURE warning on MSVC: - // manually verified this is safe - char *force_implementation_name = getenv("SIMDUTF_FORCE_IMPLEMENTATION"); - SIMDUTF_POP_DISABLE_WARNINGS - if (force_implementation_name) { - auto force_implementation = - get_available_implementations()[force_implementation_name]; - if (force_implementation) { - return get_active_implementation() = force_implementation; - } else { - // Note: abort() and stderr usage within the library is forbidden. - return get_active_implementation() = get_unsupported_singleton(); - } + // Addition/subtraction are the same for signed and unsigned + simdutf_really_inline simd8 operator+(const simd8 other) const { + return __lasx_xvadd_b(this->value, other); + } + simdutf_really_inline simd8 operator-(const simd8 other) const { + return __lasx_xvsub_b(this->value, other); + } + simdutf_really_inline simd8 &operator+=(const simd8 other) { + *this = *this + other; + return *static_cast *>(this); + } + simdutf_really_inline simd8 &operator-=(const simd8 other) { + *this = *this - other; + return *static_cast *>(this); } - return get_active_implementation() = - get_available_implementations().detect_best_supported(); -} -} // namespace internal + // Override to distinguish from bool version + simdutf_really_inline simd8 operator~() const { return *this ^ 0xFFu; } -/** - * The list of available implementations compiled into simdutf. - */ -SIMDUTF_DLLIMPORTEXPORT const internal::available_implementation_list & -get_available_implementations() { - static const internal::available_implementation_list - available_implementations{}; - return available_implementations; -} + // Perform a lookup assuming the value is between 0 and 16 (undefined behavior + // for out of range values) + template + simdutf_really_inline simd8 lookup_16(simd8 lookup_table) const { + __m256i origin = __lasx_xvand_v(this->value, __lasx_xvldi(0x1f)); + return __lasx_xvshuf_b(__lasx_xvldi(0), lookup_table, origin); + } -/** - * The active implementation. - */ -SIMDUTF_DLLIMPORTEXPORT internal::atomic_ptr & -get_active_implementation() { -#if SIMDUTF_SINGLE_IMPLEMENTATION - // skip runtime detection - static internal::atomic_ptr active_implementation{ - internal::get_single_implementation()}; - return active_implementation; -#else - static const internal::detect_best_supported_implementation_on_first_use - detect_best_supported_implementation_on_first_use_singleton; - static internal::atomic_ptr active_implementation{ - &detect_best_supported_implementation_on_first_use_singleton}; - return active_implementation; -#endif -} + template + simdutf_really_inline simd8 + lookup_16(L replace0, L replace1, L replace2, L replace3, L replace4, + L replace5, L replace6, L replace7, L replace8, L replace9, + L replace10, L replace11, L replace12, L replace13, L replace14, + L replace15) const { + return lookup_16(simd8::repeat_16( + replace0, replace1, replace2, replace3, replace4, replace5, replace6, + replace7, replace8, replace9, replace10, replace11, replace12, + replace13, replace14, replace15)); + } +}; -#if SIMDUTF_SINGLE_IMPLEMENTATION -const implementation *get_default_implementation() { - return internal::get_single_implementation(); -} -#else -internal::atomic_ptr &get_default_implementation() { - return get_active_implementation(); -} -#endif -#define SIMDUTF_GET_CURRENT_IMPLEMENTION +// Signed bytes +template <> struct simd8 : base8_numeric { + simdutf_really_inline simd8() : base8_numeric() {} + simdutf_really_inline simd8(const __m256i _value) + : base8_numeric(_value) {} -simdutf_warn_unused bool validate_utf8(const char *buf, size_t len) noexcept { - return get_default_implementation()->validate_utf8(buf, len); -} -simdutf_warn_unused result validate_utf8_with_errors(const char *buf, - size_t len) noexcept { - return get_default_implementation()->validate_utf8_with_errors(buf, len); -} -simdutf_warn_unused bool validate_ascii(const char *buf, size_t len) noexcept { - return get_default_implementation()->validate_ascii(buf, len); -} -simdutf_warn_unused result validate_ascii_with_errors(const char *buf, - size_t len) noexcept { - return get_default_implementation()->validate_ascii_with_errors(buf, len); -} -simdutf_warn_unused size_t convert_utf8_to_utf16( - const char *input, size_t length, char16_t *utf16_output) noexcept { -#if SIMDUTF_IS_BIG_ENDIAN - return convert_utf8_to_utf16be(input, length, utf16_output); -#else - return convert_utf8_to_utf16le(input, length, utf16_output); -#endif -} -simdutf_warn_unused size_t convert_latin1_to_utf8(const char *buf, size_t len, - char *utf8_output) noexcept { - return get_default_implementation()->convert_latin1_to_utf8(buf, len, - utf8_output); -} -simdutf_warn_unused size_t convert_latin1_to_utf16le( - const char *buf, size_t len, char16_t *utf16_output) noexcept { - return get_default_implementation()->convert_latin1_to_utf16le(buf, len, - utf16_output); -} -simdutf_warn_unused size_t convert_latin1_to_utf16be( - const char *buf, size_t len, char16_t *utf16_output) noexcept { - return get_default_implementation()->convert_latin1_to_utf16be(buf, len, - utf16_output); -} -simdutf_warn_unused size_t convert_latin1_to_utf32( - const char *buf, size_t len, char32_t *latin1_output) noexcept { - return get_default_implementation()->convert_latin1_to_utf32(buf, len, - latin1_output); -} -simdutf_warn_unused size_t convert_utf8_to_latin1( - const char *buf, size_t len, char *latin1_output) noexcept { - return get_default_implementation()->convert_utf8_to_latin1(buf, len, - latin1_output); -} -simdutf_warn_unused result convert_utf8_to_latin1_with_errors( - const char *buf, size_t len, char *latin1_output) noexcept { - return get_default_implementation()->convert_utf8_to_latin1_with_errors( - buf, len, latin1_output); -} -simdutf_warn_unused size_t convert_valid_utf8_to_latin1( - const char *buf, size_t len, char *latin1_output) noexcept { - return get_default_implementation()->convert_valid_utf8_to_latin1( - buf, len, latin1_output); -} -simdutf_warn_unused size_t convert_utf8_to_utf16le( - const char *input, size_t length, char16_t *utf16_output) noexcept { - return get_default_implementation()->convert_utf8_to_utf16le(input, length, - utf16_output); -} -simdutf_warn_unused size_t convert_utf8_to_utf16be( - const char *input, size_t length, char16_t *utf16_output) noexcept { - return get_default_implementation()->convert_utf8_to_utf16be(input, length, - utf16_output); -} -simdutf_warn_unused result convert_utf8_to_utf16_with_errors( - const char *input, size_t length, char16_t *utf16_output) noexcept { -#if SIMDUTF_IS_BIG_ENDIAN - return convert_utf8_to_utf16be_with_errors(input, length, utf16_output); -#else - return convert_utf8_to_utf16le_with_errors(input, length, utf16_output); -#endif -} -simdutf_warn_unused result convert_utf8_to_utf16le_with_errors( - const char *input, size_t length, char16_t *utf16_output) noexcept { - return get_default_implementation()->convert_utf8_to_utf16le_with_errors( - input, length, utf16_output); -} -simdutf_warn_unused result convert_utf8_to_utf16be_with_errors( - const char *input, size_t length, char16_t *utf16_output) noexcept { - return get_default_implementation()->convert_utf8_to_utf16be_with_errors( - input, length, utf16_output); -} -simdutf_warn_unused size_t convert_utf8_to_utf32( - const char *input, size_t length, char32_t *utf32_output) noexcept { - return get_default_implementation()->convert_utf8_to_utf32(input, length, - utf32_output); -} -simdutf_warn_unused result convert_utf8_to_utf32_with_errors( - const char *input, size_t length, char32_t *utf32_output) noexcept { - return get_default_implementation()->convert_utf8_to_utf32_with_errors( - input, length, utf32_output); -} -simdutf_warn_unused bool validate_utf16(const char16_t *buf, - size_t len) noexcept { -#if SIMDUTF_IS_BIG_ENDIAN - return validate_utf16be(buf, len); -#else - return validate_utf16le(buf, len); -#endif -} -simdutf_warn_unused bool validate_utf16le(const char16_t *buf, - size_t len) noexcept { - return get_default_implementation()->validate_utf16le(buf, len); -} -simdutf_warn_unused bool validate_utf16be(const char16_t *buf, - size_t len) noexcept { - return get_default_implementation()->validate_utf16be(buf, len); -} -simdutf_warn_unused result validate_utf16_with_errors(const char16_t *buf, - size_t len) noexcept { -#if SIMDUTF_IS_BIG_ENDIAN - return validate_utf16be_with_errors(buf, len); -#else - return validate_utf16le_with_errors(buf, len); -#endif -} -simdutf_warn_unused result validate_utf16le_with_errors(const char16_t *buf, - size_t len) noexcept { - return get_default_implementation()->validate_utf16le_with_errors(buf, len); -} -simdutf_warn_unused result validate_utf16be_with_errors(const char16_t *buf, - size_t len) noexcept { - return get_default_implementation()->validate_utf16be_with_errors(buf, len); -} -simdutf_warn_unused bool validate_utf32(const char32_t *buf, - size_t len) noexcept { - return get_default_implementation()->validate_utf32(buf, len); -} -simdutf_warn_unused result validate_utf32_with_errors(const char32_t *buf, - size_t len) noexcept { - return get_default_implementation()->validate_utf32_with_errors(buf, len); -} -simdutf_warn_unused size_t convert_valid_utf8_to_utf16( - const char *input, size_t length, char16_t *utf16_buffer) noexcept { -#if SIMDUTF_IS_BIG_ENDIAN - return convert_valid_utf8_to_utf16be(input, length, utf16_buffer); -#else - return convert_valid_utf8_to_utf16le(input, length, utf16_buffer); -#endif -} -simdutf_warn_unused size_t convert_valid_utf8_to_utf16le( - const char *input, size_t length, char16_t *utf16_buffer) noexcept { - return get_default_implementation()->convert_valid_utf8_to_utf16le( - input, length, utf16_buffer); -} -simdutf_warn_unused size_t convert_valid_utf8_to_utf16be( - const char *input, size_t length, char16_t *utf16_buffer) noexcept { - return get_default_implementation()->convert_valid_utf8_to_utf16be( - input, length, utf16_buffer); -} -simdutf_warn_unused size_t convert_valid_utf8_to_utf32( - const char *input, size_t length, char32_t *utf32_buffer) noexcept { - return get_default_implementation()->convert_valid_utf8_to_utf32( - input, length, utf32_buffer); -} -simdutf_warn_unused size_t convert_utf16_to_utf8(const char16_t *buf, - size_t len, - char *utf8_buffer) noexcept { -#if SIMDUTF_IS_BIG_ENDIAN - return convert_utf16be_to_utf8(buf, len, utf8_buffer); -#else - return convert_utf16le_to_utf8(buf, len, utf8_buffer); -#endif -} -simdutf_warn_unused size_t convert_utf16_to_latin1( - const char16_t *buf, size_t len, char *latin1_buffer) noexcept { -#if SIMDUTF_IS_BIG_ENDIAN - return convert_utf16be_to_latin1(buf, len, latin1_buffer); -#else - return convert_utf16le_to_latin1(buf, len, latin1_buffer); -#endif -} -simdutf_warn_unused size_t convert_latin1_to_utf16( - const char *buf, size_t len, char16_t *utf16_output) noexcept { -#if SIMDUTF_IS_BIG_ENDIAN - return convert_latin1_to_utf16be(buf, len, utf16_output); -#else - return convert_latin1_to_utf16le(buf, len, utf16_output); -#endif -} -simdutf_warn_unused size_t convert_utf16be_to_latin1( - const char16_t *buf, size_t len, char *latin1_buffer) noexcept { - return get_default_implementation()->convert_utf16be_to_latin1(buf, len, - latin1_buffer); -} -simdutf_warn_unused size_t convert_utf16le_to_latin1( - const char16_t *buf, size_t len, char *latin1_buffer) noexcept { - return get_default_implementation()->convert_utf16le_to_latin1(buf, len, - latin1_buffer); -} -simdutf_warn_unused size_t convert_valid_utf16be_to_latin1( - const char16_t *buf, size_t len, char *latin1_buffer) noexcept { - return get_default_implementation()->convert_valid_utf16be_to_latin1( - buf, len, latin1_buffer); -} -simdutf_warn_unused size_t convert_valid_utf16le_to_latin1( - const char16_t *buf, size_t len, char *latin1_buffer) noexcept { - return get_default_implementation()->convert_valid_utf16le_to_latin1( - buf, len, latin1_buffer); -} -simdutf_warn_unused result convert_utf16le_to_latin1_with_errors( - const char16_t *buf, size_t len, char *latin1_buffer) noexcept { - return get_default_implementation()->convert_utf16le_to_latin1_with_errors( - buf, len, latin1_buffer); -} -simdutf_warn_unused result convert_utf16be_to_latin1_with_errors( - const char16_t *buf, size_t len, char *latin1_buffer) noexcept { - return get_default_implementation()->convert_utf16be_to_latin1_with_errors( - buf, len, latin1_buffer); -} -simdutf_warn_unused size_t convert_utf16le_to_utf8(const char16_t *buf, - size_t len, - char *utf8_buffer) noexcept { - return get_default_implementation()->convert_utf16le_to_utf8(buf, len, - utf8_buffer); -} -simdutf_warn_unused size_t convert_utf16be_to_utf8(const char16_t *buf, - size_t len, - char *utf8_buffer) noexcept { - return get_default_implementation()->convert_utf16be_to_utf8(buf, len, - utf8_buffer); -} -simdutf_warn_unused result convert_utf16_to_utf8_with_errors( - const char16_t *buf, size_t len, char *utf8_buffer) noexcept { -#if SIMDUTF_IS_BIG_ENDIAN - return convert_utf16be_to_utf8_with_errors(buf, len, utf8_buffer); -#else - return convert_utf16le_to_utf8_with_errors(buf, len, utf8_buffer); -#endif -} -simdutf_warn_unused result convert_utf16_to_latin1_with_errors( - const char16_t *buf, size_t len, char *latin1_buffer) noexcept { -#if SIMDUTF_IS_BIG_ENDIAN - return convert_utf16be_to_latin1_with_errors(buf, len, latin1_buffer); -#else - return convert_utf16le_to_latin1_with_errors(buf, len, latin1_buffer); -#endif -} -simdutf_warn_unused result convert_utf16le_to_utf8_with_errors( - const char16_t *buf, size_t len, char *utf8_buffer) noexcept { - return get_default_implementation()->convert_utf16le_to_utf8_with_errors( - buf, len, utf8_buffer); -} -simdutf_warn_unused result convert_utf16be_to_utf8_with_errors( - const char16_t *buf, size_t len, char *utf8_buffer) noexcept { - return get_default_implementation()->convert_utf16be_to_utf8_with_errors( - buf, len, utf8_buffer); -} -simdutf_warn_unused size_t convert_valid_utf16_to_utf8( - const char16_t *buf, size_t len, char *utf8_buffer) noexcept { -#if SIMDUTF_IS_BIG_ENDIAN - return convert_valid_utf16be_to_utf8(buf, len, utf8_buffer); -#else - return convert_valid_utf16le_to_utf8(buf, len, utf8_buffer); -#endif -} -simdutf_warn_unused size_t convert_valid_utf16_to_latin1( - const char16_t *buf, size_t len, char *latin1_buffer) noexcept { -#if SIMDUTF_IS_BIG_ENDIAN - return convert_valid_utf16be_to_latin1(buf, len, latin1_buffer); -#else - return convert_valid_utf16le_to_latin1(buf, len, latin1_buffer); -#endif -} -simdutf_warn_unused size_t convert_valid_utf16le_to_utf8( - const char16_t *buf, size_t len, char *utf8_buffer) noexcept { - return get_default_implementation()->convert_valid_utf16le_to_utf8( - buf, len, utf8_buffer); -} -simdutf_warn_unused size_t convert_valid_utf16be_to_utf8( - const char16_t *buf, size_t len, char *utf8_buffer) noexcept { - return get_default_implementation()->convert_valid_utf16be_to_utf8( - buf, len, utf8_buffer); -} -simdutf_warn_unused size_t convert_utf32_to_utf8(const char32_t *buf, - size_t len, - char *utf8_buffer) noexcept { - return get_default_implementation()->convert_utf32_to_utf8(buf, len, - utf8_buffer); -} -simdutf_warn_unused result convert_utf32_to_utf8_with_errors( - const char32_t *buf, size_t len, char *utf8_buffer) noexcept { - return get_default_implementation()->convert_utf32_to_utf8_with_errors( - buf, len, utf8_buffer); -} -simdutf_warn_unused size_t convert_valid_utf32_to_utf8( - const char32_t *buf, size_t len, char *utf8_buffer) noexcept { - return get_default_implementation()->convert_valid_utf32_to_utf8(buf, len, - utf8_buffer); -} -simdutf_warn_unused size_t convert_utf32_to_utf16( - const char32_t *buf, size_t len, char16_t *utf16_buffer) noexcept { -#if SIMDUTF_IS_BIG_ENDIAN - return convert_utf32_to_utf16be(buf, len, utf16_buffer); -#else - return convert_utf32_to_utf16le(buf, len, utf16_buffer); -#endif -} -simdutf_warn_unused size_t convert_utf32_to_latin1( - const char32_t *input, size_t length, char *latin1_output) noexcept { - return get_default_implementation()->convert_utf32_to_latin1(input, length, - latin1_output); -} -simdutf_warn_unused size_t convert_utf32_to_utf16le( - const char32_t *buf, size_t len, char16_t *utf16_buffer) noexcept { - return get_default_implementation()->convert_utf32_to_utf16le(buf, len, - utf16_buffer); -} -simdutf_warn_unused size_t convert_utf32_to_utf16be( - const char32_t *buf, size_t len, char16_t *utf16_buffer) noexcept { - return get_default_implementation()->convert_utf32_to_utf16be(buf, len, - utf16_buffer); -} -simdutf_warn_unused result convert_utf32_to_utf16_with_errors( - const char32_t *buf, size_t len, char16_t *utf16_buffer) noexcept { -#if SIMDUTF_IS_BIG_ENDIAN - return convert_utf32_to_utf16be_with_errors(buf, len, utf16_buffer); -#else - return convert_utf32_to_utf16le_with_errors(buf, len, utf16_buffer); -#endif -} -simdutf_warn_unused result convert_utf32_to_utf16le_with_errors( - const char32_t *buf, size_t len, char16_t *utf16_buffer) noexcept { - return get_default_implementation()->convert_utf32_to_utf16le_with_errors( - buf, len, utf16_buffer); -} -simdutf_warn_unused result convert_utf32_to_utf16be_with_errors( - const char32_t *buf, size_t len, char16_t *utf16_buffer) noexcept { - return get_default_implementation()->convert_utf32_to_utf16be_with_errors( - buf, len, utf16_buffer); -} -simdutf_warn_unused size_t convert_valid_utf32_to_utf16( - const char32_t *buf, size_t len, char16_t *utf16_buffer) noexcept { -#if SIMDUTF_IS_BIG_ENDIAN - return convert_valid_utf32_to_utf16be(buf, len, utf16_buffer); -#else - return convert_valid_utf32_to_utf16le(buf, len, utf16_buffer); -#endif -} -simdutf_warn_unused size_t convert_valid_utf32_to_utf16le( - const char32_t *buf, size_t len, char16_t *utf16_buffer) noexcept { - return get_default_implementation()->convert_valid_utf32_to_utf16le( - buf, len, utf16_buffer); -} -simdutf_warn_unused size_t convert_valid_utf32_to_utf16be( - const char32_t *buf, size_t len, char16_t *utf16_buffer) noexcept { - return get_default_implementation()->convert_valid_utf32_to_utf16be( - buf, len, utf16_buffer); -} -simdutf_warn_unused size_t convert_utf16_to_utf32( - const char16_t *buf, size_t len, char32_t *utf32_buffer) noexcept { -#if SIMDUTF_IS_BIG_ENDIAN - return convert_utf16be_to_utf32(buf, len, utf32_buffer); -#else - return convert_utf16le_to_utf32(buf, len, utf32_buffer); -#endif -} -simdutf_warn_unused size_t convert_utf16le_to_utf32( - const char16_t *buf, size_t len, char32_t *utf32_buffer) noexcept { - return get_default_implementation()->convert_utf16le_to_utf32(buf, len, - utf32_buffer); -} -simdutf_warn_unused size_t convert_utf16be_to_utf32( - const char16_t *buf, size_t len, char32_t *utf32_buffer) noexcept { - return get_default_implementation()->convert_utf16be_to_utf32(buf, len, - utf32_buffer); -} -simdutf_warn_unused result convert_utf16_to_utf32_with_errors( - const char16_t *buf, size_t len, char32_t *utf32_buffer) noexcept { -#if SIMDUTF_IS_BIG_ENDIAN - return convert_utf16be_to_utf32_with_errors(buf, len, utf32_buffer); -#else - return convert_utf16le_to_utf32_with_errors(buf, len, utf32_buffer); -#endif -} -simdutf_warn_unused result convert_utf16le_to_utf32_with_errors( - const char16_t *buf, size_t len, char32_t *utf32_buffer) noexcept { - return get_default_implementation()->convert_utf16le_to_utf32_with_errors( - buf, len, utf32_buffer); -} -simdutf_warn_unused result convert_utf16be_to_utf32_with_errors( - const char16_t *buf, size_t len, char32_t *utf32_buffer) noexcept { - return get_default_implementation()->convert_utf16be_to_utf32_with_errors( - buf, len, utf32_buffer); -} -simdutf_warn_unused size_t convert_valid_utf16_to_utf32( - const char16_t *buf, size_t len, char32_t *utf32_buffer) noexcept { -#if SIMDUTF_IS_BIG_ENDIAN - return convert_valid_utf16be_to_utf32(buf, len, utf32_buffer); -#else - return convert_valid_utf16le_to_utf32(buf, len, utf32_buffer); -#endif -} -simdutf_warn_unused size_t convert_valid_utf16le_to_utf32( - const char16_t *buf, size_t len, char32_t *utf32_buffer) noexcept { - return get_default_implementation()->convert_valid_utf16le_to_utf32( - buf, len, utf32_buffer); -} -simdutf_warn_unused size_t convert_valid_utf16be_to_utf32( - const char16_t *buf, size_t len, char32_t *utf32_buffer) noexcept { - return get_default_implementation()->convert_valid_utf16be_to_utf32( - buf, len, utf32_buffer); -} -void change_endianness_utf16(const char16_t *input, size_t length, - char16_t *output) noexcept { - get_default_implementation()->change_endianness_utf16(input, length, output); -} -simdutf_warn_unused size_t count_utf16(const char16_t *input, - size_t length) noexcept { -#if SIMDUTF_IS_BIG_ENDIAN - return count_utf16be(input, length); -#else - return count_utf16le(input, length); -#endif -} -simdutf_warn_unused size_t count_utf16le(const char16_t *input, - size_t length) noexcept { - return get_default_implementation()->count_utf16le(input, length); -} -simdutf_warn_unused size_t count_utf16be(const char16_t *input, - size_t length) noexcept { - return get_default_implementation()->count_utf16be(input, length); -} -simdutf_warn_unused size_t count_utf8(const char *input, - size_t length) noexcept { - return get_default_implementation()->count_utf8(input, length); -} -simdutf_warn_unused size_t latin1_length_from_utf8(const char *buf, - size_t len) noexcept { - return get_default_implementation()->latin1_length_from_utf8(buf, len); -} -simdutf_warn_unused size_t latin1_length_from_utf16(size_t len) noexcept { - return get_default_implementation()->latin1_length_from_utf16(len); -} -simdutf_warn_unused size_t latin1_length_from_utf32(size_t len) noexcept { - return get_default_implementation()->latin1_length_from_utf32(len); -} -simdutf_warn_unused size_t utf8_length_from_latin1(const char *buf, - size_t len) noexcept { - return get_default_implementation()->utf8_length_from_latin1(buf, len); -} -simdutf_warn_unused size_t utf8_length_from_utf16(const char16_t *input, - size_t length) noexcept { -#if SIMDUTF_IS_BIG_ENDIAN - return utf8_length_from_utf16be(input, length); -#else - return utf8_length_from_utf16le(input, length); -#endif -} -simdutf_warn_unused size_t utf8_length_from_utf16le(const char16_t *input, - size_t length) noexcept { - return get_default_implementation()->utf8_length_from_utf16le(input, length); -} -simdutf_warn_unused size_t utf8_length_from_utf16be(const char16_t *input, - size_t length) noexcept { - return get_default_implementation()->utf8_length_from_utf16be(input, length); -} -simdutf_warn_unused size_t utf32_length_from_utf16(const char16_t *input, - size_t length) noexcept { -#if SIMDUTF_IS_BIG_ENDIAN - return utf32_length_from_utf16be(input, length); -#else - return utf32_length_from_utf16le(input, length); -#endif -} -simdutf_warn_unused size_t utf32_length_from_utf16le(const char16_t *input, - size_t length) noexcept { - return get_default_implementation()->utf32_length_from_utf16le(input, length); -} -simdutf_warn_unused size_t utf32_length_from_utf16be(const char16_t *input, - size_t length) noexcept { - return get_default_implementation()->utf32_length_from_utf16be(input, length); -} -simdutf_warn_unused size_t utf16_length_from_utf8(const char *input, - size_t length) noexcept { - return get_default_implementation()->utf16_length_from_utf8(input, length); -} -simdutf_warn_unused size_t utf16_length_from_latin1(size_t length) noexcept { - return get_default_implementation()->utf16_length_from_latin1(length); -} -simdutf_warn_unused size_t utf8_length_from_utf32(const char32_t *input, - size_t length) noexcept { - return get_default_implementation()->utf8_length_from_utf32(input, length); -} -simdutf_warn_unused size_t utf16_length_from_utf32(const char32_t *input, - size_t length) noexcept { - return get_default_implementation()->utf16_length_from_utf32(input, length); -} -simdutf_warn_unused size_t utf32_length_from_utf8(const char *input, - size_t length) noexcept { - return get_default_implementation()->utf32_length_from_utf8(input, length); -} - -simdutf_warn_unused size_t -maximal_binary_length_from_base64(const char *input, size_t length) noexcept { - return get_default_implementation()->maximal_binary_length_from_base64( - input, length); + // Splat constructor + simdutf_really_inline simd8(int8_t _value) : simd8(splat(_value)) {} + // Array constructor + simdutf_really_inline simd8(const int8_t values[32]) : simd8(load(values)) {} + simdutf_really_inline operator simd8() const; + // Member-by-member initialization + simdutf_really_inline + simd8(int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, + int8_t v6, int8_t v7, int8_t v8, int8_t v9, int8_t v10, int8_t v11, + int8_t v12, int8_t v13, int8_t v14, int8_t v15, int8_t v16, int8_t v17, + int8_t v18, int8_t v19, int8_t v20, int8_t v21, int8_t v22, int8_t v23, + int8_t v24, int8_t v25, int8_t v26, int8_t v27, int8_t v28, int8_t v29, + int8_t v30, int8_t v31) + : simd8((__m256i)v32i8{v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10, v11, v12, v13, v14, v15, + v16, v17, v18, v19, v20, v21, v22, v23, + v24, v25, v26, v27, v28, v29, v30, v31}) {} + // Repeat 16 values as many times as necessary (usually for lookup tables) + simdutf_really_inline static simd8 + repeat_16(int8_t v0, int8_t v1, int8_t v2, int8_t v3, int8_t v4, int8_t v5, + int8_t v6, int8_t v7, int8_t v8, int8_t v9, int8_t v10, int8_t v11, + int8_t v12, int8_t v13, int8_t v14, int8_t v15) { + return simd8(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, + v13, v14, v15, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, + v10, v11, v12, v13, v14, v15); + } + simdutf_really_inline bool is_ascii() const { + __m256i ascii_mask = __lasx_xvslti_b(this->value, 0); + if (__lasx_xbnz_v(ascii_mask)) + return false; + return true; + } + // Order-sensitive comparisons + simdutf_really_inline simd8 max_val(const simd8 other) const { + return __lasx_xvmax_b(this->value, other); + } + simdutf_really_inline simd8 min_val(const simd8 other) const { + return __lasx_xvmin_b(this->value, other); + } + simdutf_really_inline simd8 operator>(const simd8 other) const { + return __lasx_xvslt_b(other, this->value); + } + simdutf_really_inline simd8 operator<(const simd8 other) const { + return __lasx_xvslt_b(this->value, other); + } +}; + +// Unsigned bytes +template <> struct simd8 : base8_numeric { + simdutf_really_inline simd8() : base8_numeric() {} + simdutf_really_inline simd8(const __m256i _value) + : base8_numeric(_value) {} + // Splat constructor + simdutf_really_inline simd8(uint8_t _value) : simd8(splat(_value)) {} + // Array constructor + simdutf_really_inline simd8(const uint8_t values[32]) : simd8(load(values)) {} + // Member-by-member initialization + simdutf_really_inline + simd8(uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5, + uint8_t v6, uint8_t v7, uint8_t v8, uint8_t v9, uint8_t v10, + uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15, + uint8_t v16, uint8_t v17, uint8_t v18, uint8_t v19, uint8_t v20, + uint8_t v21, uint8_t v22, uint8_t v23, uint8_t v24, uint8_t v25, + uint8_t v26, uint8_t v27, uint8_t v28, uint8_t v29, uint8_t v30, + uint8_t v31) + : simd8((__m256i)v32u8{v0, v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10, v11, v12, v13, v14, v15, + v16, v17, v18, v19, v20, v21, v22, v23, + v24, v25, v26, v27, v28, v29, v30, v31}) {} + // Repeat 16 values as many times as necessary (usually for lookup tables) + simdutf_really_inline static simd8 + repeat_16(uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, + uint8_t v5, uint8_t v6, uint8_t v7, uint8_t v8, uint8_t v9, + uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, + uint8_t v15) { + return simd8(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, + v13, v14, v15, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, + v10, v11, v12, v13, v14, v15); + } + + // Saturated math + simdutf_really_inline simd8 + saturating_add(const simd8 other) const { + return __lasx_xvsadd_bu(this->value, other); + } + simdutf_really_inline simd8 + saturating_sub(const simd8 other) const { + return __lasx_xvssub_bu(this->value, other); + } + + // Order-specific operations + simdutf_really_inline simd8 + max_val(const simd8 other) const { + return __lasx_xvmax_bu(*this, other); + } + simdutf_really_inline simd8 + min_val(const simd8 other) const { + return __lasx_xvmin_bu(*this, other); + } + // Same as >, but only guarantees true is nonzero (< guarantees true = -1) + simdutf_really_inline simd8 + gt_bits(const simd8 other) const { + return this->saturating_sub(other); + } + // Same as <, but only guarantees true is nonzero (< guarantees true = -1) + simdutf_really_inline simd8 + lt_bits(const simd8 other) const { + return other.saturating_sub(*this); + } + simdutf_really_inline simd8 + operator<=(const simd8 other) const { + return __lasx_xvsle_bu(*this, other); + } + simdutf_really_inline simd8 + operator>=(const simd8 other) const { + return __lasx_xvsle_bu(other, *this); + } + simdutf_really_inline simd8 + operator>(const simd8 other) const { + return __lasx_xvslt_bu(*this, other); + } + simdutf_really_inline simd8 + operator<(const simd8 other) const { + return __lasx_xvslt_bu(other, *this); + } + + // Bit-specific operations + simdutf_really_inline simd8 bits_not_set() const { + return *this == uint8_t(0); + } + simdutf_really_inline simd8 bits_not_set(simd8 bits) const { + return (*this & bits).bits_not_set(); + } + simdutf_really_inline simd8 any_bits_set() const { + return ~this->bits_not_set(); + } + simdutf_really_inline simd8 any_bits_set(simd8 bits) const { + return ~this->bits_not_set(bits); + } + simdutf_really_inline bool is_ascii() const { + __m256i ascii_mask = __lasx_xvslti_b(this->value, 0); + if (__lasx_xbnz_v(ascii_mask)) + return false; + return true; + } + simdutf_really_inline bool any_bits_set_anywhere() const { + if (__lasx_xbnz_v(this->value)) + return true; + return false; + } + simdutf_really_inline bool any_bits_set_anywhere(simd8 bits) const { + return (*this & bits).any_bits_set_anywhere(); + } + template simdutf_really_inline simd8 shr() const { + return __lasx_xvsrli_b(this->value, N); + } + template simdutf_really_inline simd8 shl() const { + return __lasx_xvslli_b(this->value, N); + } +}; +simdutf_really_inline simd8::operator simd8() const { + return this->value; } -simdutf_warn_unused result base64_to_binary( - const char *input, size_t length, char *output, base64_options options, - last_chunk_handling_options last_chunk_handling_options) noexcept { - return get_default_implementation()->base64_to_binary( - input, length, output, options, last_chunk_handling_options); -} +template struct simd8x64 { + static constexpr int NUM_CHUNKS = 64 / sizeof(simd8); + static_assert(NUM_CHUNKS == 2, + "LASX kernel should use two registers per 64-byte block."); + simd8 chunks[NUM_CHUNKS]; -simdutf_warn_unused size_t maximal_binary_length_from_base64( - const char16_t *input, size_t length) noexcept { - return get_default_implementation()->maximal_binary_length_from_base64( - input, length); -} + simd8x64(const simd8x64 &o) = delete; // no copy allowed + simd8x64 & + operator=(const simd8 other) = delete; // no assignment allowed + simd8x64() = delete; // no default constructor allowed -simdutf_warn_unused result base64_to_binary( - const char16_t *input, size_t length, char *output, base64_options options, - last_chunk_handling_options last_chunk_handling_options) noexcept { - return get_default_implementation()->base64_to_binary( - input, length, output, options, last_chunk_handling_options); -} + simdutf_really_inline simd8x64(const simd8 chunk0, const simd8 chunk1) + : chunks{chunk0, chunk1} {} + simdutf_really_inline simd8x64(const T *ptr) + : chunks{simd8::load(ptr), + simd8::load(ptr + sizeof(simd8) / sizeof(T))} {} -template -simdutf_warn_unused result base64_to_binary_safe_impl( - const chartype *input, size_t length, char *output, size_t &outlen, - base64_options options, - last_chunk_handling_options last_chunk_handling_options) noexcept { - static_assert(std::is_same::value || - std::is_same::value, - "Only char and char16_t are supported."); - // The implementation could be nicer, but we expect that most times, the user - // will provide us with a buffer that is large enough. - size_t max_length = maximal_binary_length_from_base64(input, length); - if (outlen >= max_length) { - // fast path - full_result r = get_default_implementation()->base64_to_binary_details( - input, length, output, options, last_chunk_handling_options); - if (r.error != error_code::INVALID_BASE64_CHARACTER && - r.error != error_code::BASE64_EXTRA_BITS) { - outlen = r.output_count; - return {r.error, length}; - } - return r; - } - // The output buffer is maybe too small. We will decode a truncated version of - // the input. - size_t outlen3 = outlen / 3 * 3; // round down to multiple of 3 - size_t safe_input = base64_length_from_binary(outlen3, options); - full_result r = get_default_implementation()->base64_to_binary_details( - input, safe_input, output, options, loose); - if (r.error == error_code::INVALID_BASE64_CHARACTER) { - return r; + simdutf_really_inline void store(T *ptr) const { + this->chunks[0].store(ptr + sizeof(simd8) * 0 / sizeof(T)); + this->chunks[1].store(ptr + sizeof(simd8) * 1 / sizeof(T)); } - size_t offset = - (r.error == error_code::BASE64_INPUT_REMAINDER) - ? 1 - : ((r.output_count % 3) == 0 ? 0 : (r.output_count % 3) + 1); - size_t output_index = r.output_count - (r.output_count % 3); - size_t input_index = safe_input; - // offset is a value that is no larger than 3. We backtrack - // by up to offset characters + an undetermined number of - // white space characters. It is expected that the next loop - // runs at most 3 times + the number of white space characters - // in between them, so we are not worried about performance. - while (offset > 0 && input_index > 0) { - chartype c = input[--input_index]; - if (scalar::base64::is_ascii_white_space(c)) { - // skipping - } else { - offset--; - } + + simdutf_really_inline uint64_t to_bitmask() const { + uint64_t r_lo = uint32_t(this->chunks[0].to_bitmask()); + uint64_t r_hi = this->chunks[1].to_bitmask(); + return r_lo | (r_hi << 32); } - size_t remaining_out = outlen - output_index; - const chartype *tail_input = input + input_index; - size_t tail_length = length - input_index; - while (tail_length > 0 && - scalar::base64::is_ascii_white_space(tail_input[tail_length - 1])) { - tail_length--; + + simdutf_really_inline simd8x64 &operator|=(const simd8x64 &other) { + this->chunks[0] |= other.chunks[0]; + this->chunks[1] |= other.chunks[1]; + return *this; } - size_t padding_characts = 0; - if (tail_length > 0 && tail_input[tail_length - 1] == '=') { - tail_length--; - padding_characts++; - while (tail_length > 0 && - scalar::base64::is_ascii_white_space(tail_input[tail_length - 1])) { - tail_length--; - } - if (tail_length > 0 && tail_input[tail_length - 1] == '=') { - tail_length--; - padding_characts++; - } + + simdutf_really_inline simd8 reduce_or() const { + return this->chunks[0] | this->chunks[1]; } - // this will advance tail_input and tail_length - result rr = scalar::base64::base64_tail_decode_safe( - output + output_index, remaining_out, tail_input, tail_length, - padding_characts, options, last_chunk_handling_options); - outlen = output_index + remaining_out; - if (last_chunk_handling_options != stop_before_partial && - rr.error == error_code::SUCCESS && padding_characts > 0) { - // additional checks - if ((outlen % 3 == 0) || ((outlen % 3) + 1 + padding_characts != 4)) { - rr.error = error_code::INVALID_BASE64_CHARACTER; - } + + simdutf_really_inline bool is_ascii() const { + return this->reduce_or().is_ascii(); } - if (rr.error == error_code::SUCCESS && - last_chunk_handling_options == stop_before_partial) { - rr.count = tail_input - input; - return rr; + + template + simdutf_really_inline void store_ascii_as_utf16(char16_t *ptr) const { + this->chunks[0].template store_ascii_as_utf16(ptr + + sizeof(simd8) * 0); + this->chunks[1].template store_ascii_as_utf16(ptr + + sizeof(simd8) * 1); } - rr.count += input_index; - return rr; -} -simdutf_warn_unused size_t convert_latin1_to_utf8_safe( - const char *buf, size_t len, char *utf8_output, size_t utf8_len) noexcept { - const auto start{utf8_output}; + simdutf_really_inline void store_ascii_as_utf32(char32_t *ptr) const { + this->chunks[0].store_ascii_as_utf32(ptr + sizeof(simd8) * 0); + this->chunks[1].store_ascii_as_utf32(ptr + sizeof(simd8) * 1); + } - while (true) { - // convert_latin1_to_utf8 will never write more than input length * 2 - auto read_len = std::min(len, utf8_len >> 1); - if (read_len <= 16) { - break; - } + simdutf_really_inline simd8x64 bit_or(const T m) const { + const simd8 mask = simd8::splat(m); + return simd8x64(this->chunks[0] | mask, this->chunks[1] | mask); + } - const auto write_len = - simdutf::convert_latin1_to_utf8(buf, read_len, utf8_output); + simdutf_really_inline uint64_t eq(const T m) const { + const simd8 mask = simd8::splat(m); + return simd8x64(this->chunks[0] == mask, this->chunks[1] == mask) + .to_bitmask(); + } - utf8_output += write_len; - utf8_len -= write_len; - buf += read_len; - len -= read_len; + simdutf_really_inline uint64_t eq(const simd8x64 &other) const { + return simd8x64(this->chunks[0] == other.chunks[0], + this->chunks[1] == other.chunks[1]) + .to_bitmask(); } - utf8_output += - scalar::latin1_to_utf8::convert_safe(buf, len, utf8_output, utf8_len); + simdutf_really_inline uint64_t lteq(const T m) const { + const simd8 mask = simd8::splat(m); + return simd8x64(this->chunks[0] <= mask, this->chunks[1] <= mask) + .to_bitmask(); + } - return utf8_output - start; -} + simdutf_really_inline uint64_t in_range(const T low, const T high) const { + const simd8 mask_low = simd8::splat(low); + const simd8 mask_high = simd8::splat(high); -simdutf_warn_unused result base64_to_binary_safe( - const char *input, size_t length, char *output, size_t &outlen, - base64_options options, - last_chunk_handling_options last_chunk_handling_options) noexcept { - return base64_to_binary_safe_impl(input, length, output, outlen, - options, last_chunk_handling_options); -} -simdutf_warn_unused result base64_to_binary_safe( - const char16_t *input, size_t length, char *output, size_t &outlen, - base64_options options, - last_chunk_handling_options last_chunk_handling_options) noexcept { - return base64_to_binary_safe_impl( - input, length, output, outlen, options, last_chunk_handling_options); -} + return simd8x64( + (this->chunks[0] <= mask_high) & (this->chunks[0] >= mask_low), + (this->chunks[1] <= mask_high) & (this->chunks[1] >= mask_low)) + .to_bitmask(); + } + simdutf_really_inline uint64_t not_in_range(const T low, const T high) const { + const simd8 mask_low = simd8::splat(low); + const simd8 mask_high = simd8::splat(high); + return simd8x64( + (this->chunks[0] > mask_high) | (this->chunks[0] < mask_low), + (this->chunks[1] > mask_high) | (this->chunks[1] < mask_low)) + .to_bitmask(); + } + simdutf_really_inline uint64_t lt(const T m) const { + const simd8 mask = simd8::splat(m); + return simd8x64(this->chunks[0] < mask, this->chunks[1] < mask) + .to_bitmask(); + } -simdutf_warn_unused size_t -base64_length_from_binary(size_t length, base64_options options) noexcept { - return get_default_implementation()->base64_length_from_binary(length, - options); -} + simdutf_really_inline uint64_t gt(const T m) const { + const simd8 mask = simd8::splat(m); + return simd8x64(this->chunks[0] > mask, this->chunks[1] > mask) + .to_bitmask(); + } + simdutf_really_inline uint64_t gteq(const T m) const { + const simd8 mask = simd8::splat(m); + return simd8x64(this->chunks[0] >= mask, this->chunks[1] >= mask) + .to_bitmask(); + } + simdutf_really_inline uint64_t gteq_unsigned(const uint8_t m) const { + const simd8 mask = simd8::splat(m); + return simd8x64((simd8(__m256i(this->chunks[0])) >= mask), + (simd8(__m256i(this->chunks[1])) >= mask)) + .to_bitmask(); + } +}; // struct simd8x64 -size_t binary_to_base64(const char *input, size_t length, char *output, - base64_options options) noexcept { - return get_default_implementation()->binary_to_base64(input, length, output, - options); -} +/* begin file src/simdutf/lasx/simd16-inl.h */ +template struct simd16; -simdutf_warn_unused simdutf::encoding_type -autodetect_encoding(const char *buf, size_t length) noexcept { - return get_default_implementation()->autodetect_encoding(buf, length); -} -simdutf_warn_unused int detect_encodings(const char *buf, - size_t length) noexcept { - return get_default_implementation()->detect_encodings(buf, length); -} -const implementation *builtin_implementation() { - static const implementation *builtin_impl = - get_available_implementations()[SIMDUTF_STRINGIFY( - SIMDUTF_BUILTIN_IMPLEMENTATION)]; - return builtin_impl; -} +template > +struct base16 : base> { + using bitmask_type = uint32_t; -simdutf_warn_unused size_t trim_partial_utf8(const char *input, size_t length) { - return scalar::utf8::trim_partial_utf8(input, length); -} + simdutf_really_inline base16() : base>() {} + simdutf_really_inline base16(const __m256i _value) + : base>(_value) {} + template + simdutf_really_inline base16(const Pointer *ptr) + : base16(__lasx_xvld(reinterpret_cast(ptr), 0)) {} + friend simdutf_really_inline Mask operator==(const simd16 lhs, + const simd16 rhs) { + return __lasx_xvseq_h(lhs.value, rhs.value); + } -simdutf_warn_unused size_t trim_partial_utf16be(const char16_t *input, - size_t length) { - return scalar::utf16::trim_partial_utf16(input, length); -} + /// the size of vector in bytes + static const int SIZE = sizeof(base>::value); -simdutf_warn_unused size_t trim_partial_utf16le(const char16_t *input, - size_t length) { - return scalar::utf16::trim_partial_utf16(input, length); -} + /// the number of elements of type T a vector can hold + static const int ELEMENTS = SIZE / sizeof(T); -simdutf_warn_unused size_t trim_partial_utf16(const char16_t *input, - size_t length) { -#if SIMDUTF_IS_BIG_ENDIAN - return trim_partial_utf16be(input, length); -#else - return trim_partial_utf16le(input, length); -#endif -} + template + simdutf_really_inline simd16 prev(const simd16 prev_chunk) const { + if (!N) + return this->value; + + __m256i zero = __lasx_xvldi(0); + __m256i result, shuf; + if (N < 8) { + shuf = __lasx_xvld(prev_shuf_table[N * 2], 0); + + result = __lasx_xvshuf_b( + __lasx_xvpermi_q(this->value, this->value, 0b00000001), this->value, + shuf); + __m256i srl_prev = __lasx_xvbsrl_v( + __lasx_xvpermi_q(zero, prev_chunk, 0b00110001), (16 - N * 2)); + __m256i mask = __lasx_xvld(bitsel_mask_table[N], 0); + result = __lasx_xvbitsel_v(result, srl_prev, mask); + + return result; + } else if (N == 8) { + return __lasx_xvpermi_q(this->value, prev_chunk, 0b00100001); + } else { + __m256i sll_value = __lasx_xvbsll_v( + __lasx_xvpermi_q(zero, this->value, 0b00000011), (N * 2 - 16)); + __m256i mask = __lasx_xvld(bitsel_mask_table[N * 2], 0); + shuf = __lasx_xvld(prev_shuf_table[N * 2], 0); + result = + __lasx_xvshuf_b(__lasx_xvpermi_q(prev_chunk, prev_chunk, 0b00000001), + prev_chunk, shuf); + result = __lasx_xvbitsel_v(sll_value, result, mask); + return result; + } + } +}; -} // namespace simdutf -/* end file src/implementation.cpp */ -/* begin file src/encoding_types.cpp */ +// SIMD byte mask type (returned by things like eq and gt) +template <> struct simd16 : base16 { + static simdutf_really_inline simd16 splat(bool _value) { + return __lasx_xvreplgr2vr_h(uint8_t(-(!!_value))); + } -namespace simdutf { -bool match_system(endianness e) { -#if SIMDUTF_IS_BIG_ENDIAN - return e == endianness::BIG; -#else - return e == endianness::LITTLE; -#endif -} + simdutf_really_inline simd16() : base16() {} + simdutf_really_inline simd16(const __m256i _value) : base16(_value) {} + // Splat constructor + simdutf_really_inline simd16(bool _value) : base16(splat(_value)) {} -std::string to_string(encoding_type bom) { - switch (bom) { - case UTF16_LE: - return "UTF16 little-endian"; - case UTF16_BE: - return "UTF16 big-endian"; - case UTF32_LE: - return "UTF32 little-endian"; - case UTF32_BE: - return "UTF32 big-endian"; - case UTF8: - return "UTF8"; - case unspecified: - return "unknown"; - default: - return "error"; + simdutf_really_inline bitmask_type to_bitmask() const { + __m256i mask = __lasx_xvmsknz_b(this->value); + bitmask_type mask0 = __lasx_xvpickve2gr_wu(mask, 0); + bitmask_type mask1 = __lasx_xvpickve2gr_wu(mask, 4); + return (mask0 | (mask1 << 16)); } -} + simdutf_really_inline bool any() const { + if (__lasx_xbz_v(this->value)) + return false; + return true; + } + simdutf_really_inline simd16 operator~() const { return *this ^ true; } +}; -namespace BOM { -// Note that BOM for UTF8 is discouraged. -encoding_type check_bom(const uint8_t *byte, size_t length) { - if (length >= 2 && byte[0] == 0xff and byte[1] == 0xfe) { - if (length >= 4 && byte[2] == 0x00 and byte[3] == 0x0) { - return encoding_type::UTF32_LE; - } else { - return encoding_type::UTF16_LE; - } - } else if (length >= 2 && byte[0] == 0xfe and byte[1] == 0xff) { - return encoding_type::UTF16_BE; - } else if (length >= 4 && byte[0] == 0x00 and byte[1] == 0x00 and - byte[2] == 0xfe and byte[3] == 0xff) { - return encoding_type::UTF32_BE; - } else if (length >= 4 && byte[0] == 0xef and byte[1] == 0xbb and - byte[2] == 0xbf) { - return encoding_type::UTF8; +template struct base16_numeric : base16 { + static simdutf_really_inline simd16 splat(T _value) { + return __lasx_xvreplgr2vr_h((uint16_t)_value); + } + static simdutf_really_inline simd16 zero() { return __lasx_xvldi(0); } + static simdutf_really_inline simd16 load(const T values[8]) { + return __lasx_xvld(reinterpret_cast(values), 0); } - return encoding_type::unspecified; -} -encoding_type check_bom(const char *byte, size_t length) { - return check_bom(reinterpret_cast(byte), length); -} + simdutf_really_inline base16_numeric() : base16() {} + simdutf_really_inline base16_numeric(const __m256i _value) + : base16(_value) {} -size_t bom_byte_size(encoding_type bom) { - switch (bom) { - case UTF16_LE: - return 2; - case UTF16_BE: - return 2; - case UTF32_LE: - return 4; - case UTF32_BE: - return 4; - case UTF8: - return 3; - case unspecified: - return 0; - default: - return 0; + // Store to array + simdutf_really_inline void store(T dst[8]) const { + return __lasx_xvst(this->value, reinterpret_cast<__m256i *>(dst), 0); } -} -} // namespace BOM -} // namespace simdutf -/* end file src/encoding_types.cpp */ -/* begin file src/error.cpp */ -namespace simdutf { -// deliberately empty -} -/* end file src/error.cpp */ -// The large tables should be included once and they -// should not depend on a kernel. -/* begin file src/tables/utf8_to_utf16_tables.h */ -#ifndef SIMDUTF_UTF8_TO_UTF16_TABLES_H -#define SIMDUTF_UTF8_TO_UTF16_TABLES_H -#include + // Override to distinguish from bool version + simdutf_really_inline simd16 operator~() const { return *this ^ 0xFFFFu; } + + // Addition/subtraction are the same for signed and unsigned + simdutf_really_inline simd16 operator+(const simd16 other) const { + return __lasx_xvadd_h(*this, other); + } + simdutf_really_inline simd16 operator-(const simd16 other) const { + return __lasx_xvsub_h(*this, other); + } + simdutf_really_inline simd16 &operator+=(const simd16 other) { + *this = *this + other; + return *static_cast *>(this); + } + simdutf_really_inline simd16 &operator-=(const simd16 other) { + *this = *this - other; + return *static_cast *>(this); + } +}; + +// Signed code units +template <> struct simd16 : base16_numeric { + simdutf_really_inline simd16() : base16_numeric() {} + simdutf_really_inline simd16(const __m256i _value) + : base16_numeric(_value) {} + // Splat constructor + simdutf_really_inline simd16(int16_t _value) : simd16(splat(_value)) {} + // Array constructor + simdutf_really_inline simd16(const int16_t *values) : simd16(load(values)) {} + simdutf_really_inline simd16(const char16_t *values) + : simd16(load(reinterpret_cast(values))) {} + // Order-sensitive comparisons + simdutf_really_inline simd16 + max_val(const simd16 other) const { + return __lasx_xvmax_h(*this, other); + } + simdutf_really_inline simd16 + min_val(const simd16 other) const { + return __lasx_xvmin_h(*this, other); + } + simdutf_really_inline simd16 + operator>(const simd16 other) const { + return __lasx_xvsle_h(other.value, this->value); + } + simdutf_really_inline simd16 + operator<(const simd16 other) const { + return __lasx_xvslt_h(this->value, other.value); + } +}; + +// Unsigned code units +template <> struct simd16 : base16_numeric { + simdutf_really_inline simd16() : base16_numeric() {} + simdutf_really_inline simd16(const __m256i _value) + : base16_numeric(_value) {} + + // Splat constructor + simdutf_really_inline simd16(uint16_t _value) : simd16(splat(_value)) {} + // Array constructor + simdutf_really_inline simd16(const uint16_t *values) : simd16(load(values)) {} + simdutf_really_inline simd16(const char16_t *values) + : simd16(load(reinterpret_cast(values))) {} + + // Saturated math + simdutf_really_inline simd16 + saturating_add(const simd16 other) const { + return __lasx_xvsadd_hu(this->value, other.value); + } + simdutf_really_inline simd16 + saturating_sub(const simd16 other) const { + return __lasx_xvssub_hu(this->value, other.value); + } + + // Order-specific operations + simdutf_really_inline simd16 + max_val(const simd16 other) const { + return __lasx_xvmax_hu(this->value, other.value); + } + simdutf_really_inline simd16 + min_val(const simd16 other) const { + return __lasx_xvmin_hu(this->value, other.value); + } + // Same as >, but only guarantees true is nonzero (< guarantees true = -1) + simdutf_really_inline simd16 + gt_bits(const simd16 other) const { + return this->saturating_sub(other); + } + // Same as <, but only guarantees true is nonzero (< guarantees true = -1) + simdutf_really_inline simd16 + lt_bits(const simd16 other) const { + return other.saturating_sub(*this); + } + simdutf_really_inline simd16 + operator<=(const simd16 other) const { + return __lasx_xvsle_hu(this->value, other.value); + } + simdutf_really_inline simd16 + operator>=(const simd16 other) const { + return __lasx_xvsle_hu(other.value, this->value); + } + simdutf_really_inline simd16 + operator>(const simd16 other) const { + return __lasx_xvslt_hu(other.value, this->value); + } + simdutf_really_inline simd16 + operator<(const simd16 other) const { + return __lasx_xvslt_hu(this->value, other.value); + } + + // Bit-specific operations + simdutf_really_inline simd16 bits_not_set() const { + return *this == uint16_t(0); + } + simdutf_really_inline simd16 bits_not_set(simd16 bits) const { + return (*this & bits).bits_not_set(); + } + simdutf_really_inline simd16 any_bits_set() const { + return ~this->bits_not_set(); + } + simdutf_really_inline simd16 any_bits_set(simd16 bits) const { + return ~this->bits_not_set(bits); + } + + simdutf_really_inline bool any_bits_set_anywhere() const { + if (__lasx_xbnz_v(this->value)) + return true; + return false; + } + simdutf_really_inline bool + any_bits_set_anywhere(simd16 bits) const { + return (*this & bits).any_bits_set_anywhere(); + } + + template simdutf_really_inline simd16 shr() const { + return simd16(__lasx_xvsrli_h(this->value, N)); + } + template simdutf_really_inline simd16 shl() const { + return simd16(__lasx_xvslli_h(this->value, N)); + } + + // Change the endianness + simdutf_really_inline simd16 swap_bytes() const { + return __lasx_xvshuf4i_b(this->value, 0b10110001); + } + + // Pack with the unsigned saturation of two uint16_t code units into single + // uint8_t vector + static simdutf_really_inline simd8 pack(const simd16 &v0, + const simd16 &v1) { + return __lasx_xvpermi_d(__lasx_xvssrlni_bu_h(v1.value, v0.value, 0), + 0b11011000); + } +}; + +template struct simd16x32 { + static constexpr int NUM_CHUNKS = 64 / sizeof(simd16); + static_assert(NUM_CHUNKS == 2, + "LASX kernel should use two registers per 64-byte block."); + simd16 chunks[NUM_CHUNKS]; + + simd16x32(const simd16x32 &o) = delete; // no copy allowed + simd16x32 & + operator=(const simd16 other) = delete; // no assignment allowed + simd16x32() = delete; // no default constructor allowed + + simdutf_really_inline simd16x32(const simd16 chunk0, + const simd16 chunk1) + : chunks{chunk0, chunk1} {} + simdutf_really_inline simd16x32(const T *ptr) + : chunks{simd16::load(ptr), + simd16::load(ptr + sizeof(simd16) / sizeof(T))} {} + + simdutf_really_inline void store(T *ptr) const { + this->chunks[0].store(ptr + sizeof(simd16) * 0 / sizeof(T)); + this->chunks[1].store(ptr + sizeof(simd16) * 1 / sizeof(T)); + } + + simdutf_really_inline uint64_t to_bitmask() const { + uint64_t r_lo = uint32_t(this->chunks[0].to_bitmask()); + uint64_t r_hi = this->chunks[1].to_bitmask(); + return r_lo | (r_hi << 32); + } + + simdutf_really_inline simd16 reduce_or() const { + return this->chunks[0] | this->chunks[1]; + } + + simdutf_really_inline bool is_ascii() const { + return this->reduce_or().is_ascii(); + } + + simdutf_really_inline void store_ascii_as_utf16(char16_t *ptr) const { + this->chunks[0].store_ascii_as_utf16(ptr + sizeof(simd16) * 0); + this->chunks[1].store_ascii_as_utf16(ptr + sizeof(simd16)); + } + + simdutf_really_inline simd16x32 bit_or(const T m) const { + const simd16 mask = simd16::splat(m); + return simd16x32(this->chunks[0] | mask, this->chunks[1] | mask); + } + + simdutf_really_inline void swap_bytes() { + this->chunks[0] = this->chunks[0].swap_bytes(); + this->chunks[1] = this->chunks[1].swap_bytes(); + } + + simdutf_really_inline uint64_t eq(const T m) const { + const simd16 mask = simd16::splat(m); + return simd16x32(this->chunks[0] == mask, this->chunks[1] == mask) + .to_bitmask(); + } + + simdutf_really_inline uint64_t eq(const simd16x32 &other) const { + return simd16x32(this->chunks[0] == other.chunks[0], + this->chunks[1] == other.chunks[1]) + .to_bitmask(); + } + + simdutf_really_inline uint64_t lteq(const T m) const { + const simd16 mask = simd16::splat(m); + return simd16x32(this->chunks[0] <= mask, this->chunks[1] <= mask) + .to_bitmask(); + } + + simdutf_really_inline uint64_t in_range(const T low, const T high) const { + const simd16 mask_low = simd16::splat(low); + const simd16 mask_high = simd16::splat(high); + + return simd16x32( + (this->chunks[0] <= mask_high) & (this->chunks[0] >= mask_low), + (this->chunks[1] <= mask_high) & (this->chunks[1] >= mask_low)) + .to_bitmask(); + } + simdutf_really_inline uint64_t not_in_range(const T low, const T high) const { + const simd16 mask_low = simd16::splat(static_cast(low - 1)); + const simd16 mask_high = simd16::splat(static_cast(high + 1)); + return simd16x32( + (this->chunks[0] >= mask_high) | (this->chunks[0] <= mask_low), + (this->chunks[1] >= mask_high) | (this->chunks[1] <= mask_low)) + .to_bitmask(); + } + simdutf_really_inline uint64_t lt(const T m) const { + const simd16 mask = simd16::splat(m); + return simd16x32(this->chunks[0] < mask, this->chunks[1] < mask) + .to_bitmask(); + } +}; // struct simd16x32 +/* end file src/simdutf/lasx/simd16-inl.h */ +} // namespace simd +} // unnamed namespace +} // namespace lasx +} // namespace simdutf + +#endif // SIMDUTF_LASX_SIMD_H +/* end file src/simdutf/lasx/simd.h */ + +/* begin file src/simdutf/lasx/end.h */ +/* end file src/simdutf/lasx/end.h */ + +#endif // SIMDUTF_IMPLEMENTATION_LASX + +#endif // SIMDUTF_LASX_H +/* end file src/simdutf/lasx.h */ +/* begin file src/simdutf/fallback.h */ +#ifndef SIMDUTF_FALLBACK_H +#define SIMDUTF_FALLBACK_H + + +// Note that fallback.h is always imported last. + +// Default Fallback to on unless a builtin implementation has already been +// selected. +#ifndef SIMDUTF_IMPLEMENTATION_FALLBACK + #if SIMDUTF_CAN_ALWAYS_RUN_ARM64 || SIMDUTF_CAN_ALWAYS_RUN_ICELAKE || \ + SIMDUTF_CAN_ALWAYS_RUN_HASWELL || SIMDUTF_CAN_ALWAYS_RUN_WESTMERE || \ + SIMDUTF_CAN_ALWAYS_RUN_PPC64 || SIMDUTF_CAN_ALWAYS_RUN_RVV || \ + SIMDUTF_CAN_ALWAYS_RUN_LSX || SIMDUTF_CAN_ALWAYS_RUN_LASX + #define SIMDUTF_IMPLEMENTATION_FALLBACK 0 + #else + #define SIMDUTF_IMPLEMENTATION_FALLBACK 1 + #endif +#endif + +#define SIMDUTF_CAN_ALWAYS_RUN_FALLBACK (SIMDUTF_IMPLEMENTATION_FALLBACK) + +#if SIMDUTF_IMPLEMENTATION_FALLBACK namespace simdutf { -namespace { -namespace tables { -namespace utf8_to_utf16 { /** - * utf8bigindex uses about 8 kB - * shufutf8 uses about 3344 B - * - * So we use a bit over 11 kB. It would be - * easy to save about 4 kB by only - * storing the index in utf8bigindex, and - * deriving the consumed bytes otherwise. - * However, this may come at a significant (10% to 20%) - * performance penalty. + * Fallback implementation (runs on any machine). */ +namespace fallback {} // namespace fallback +} // namespace simdutf -const uint8_t shufutf8[209][16] = { - {0, 255, 1, 255, 2, 255, 3, 255, 4, 255, 5, 255, 0, 0, 0, 0}, - {0, 255, 1, 255, 2, 255, 3, 255, 4, 255, 6, 5, 0, 0, 0, 0}, - {0, 255, 1, 255, 2, 255, 3, 255, 5, 4, 6, 255, 0, 0, 0, 0}, - {0, 255, 1, 255, 2, 255, 3, 255, 5, 4, 7, 6, 0, 0, 0, 0}, - {0, 255, 1, 255, 2, 255, 4, 3, 5, 255, 6, 255, 0, 0, 0, 0}, - {0, 255, 1, 255, 2, 255, 4, 3, 5, 255, 7, 6, 0, 0, 0, 0}, - {0, 255, 1, 255, 2, 255, 4, 3, 6, 5, 7, 255, 0, 0, 0, 0}, - {0, 255, 1, 255, 2, 255, 4, 3, 6, 5, 8, 7, 0, 0, 0, 0}, - {0, 255, 1, 255, 3, 2, 4, 255, 5, 255, 6, 255, 0, 0, 0, 0}, - {0, 255, 1, 255, 3, 2, 4, 255, 5, 255, 7, 6, 0, 0, 0, 0}, - {0, 255, 1, 255, 3, 2, 4, 255, 6, 5, 7, 255, 0, 0, 0, 0}, - {0, 255, 1, 255, 3, 2, 4, 255, 6, 5, 8, 7, 0, 0, 0, 0}, - {0, 255, 1, 255, 3, 2, 5, 4, 6, 255, 7, 255, 0, 0, 0, 0}, - {0, 255, 1, 255, 3, 2, 5, 4, 6, 255, 8, 7, 0, 0, 0, 0}, - {0, 255, 1, 255, 3, 2, 5, 4, 7, 6, 8, 255, 0, 0, 0, 0}, - {0, 255, 1, 255, 3, 2, 5, 4, 7, 6, 9, 8, 0, 0, 0, 0}, - {0, 255, 2, 1, 3, 255, 4, 255, 5, 255, 6, 255, 0, 0, 0, 0}, - {0, 255, 2, 1, 3, 255, 4, 255, 5, 255, 7, 6, 0, 0, 0, 0}, - {0, 255, 2, 1, 3, 255, 4, 255, 6, 5, 7, 255, 0, 0, 0, 0}, - {0, 255, 2, 1, 3, 255, 4, 255, 6, 5, 8, 7, 0, 0, 0, 0}, - {0, 255, 2, 1, 3, 255, 5, 4, 6, 255, 7, 255, 0, 0, 0, 0}, - {0, 255, 2, 1, 3, 255, 5, 4, 6, 255, 8, 7, 0, 0, 0, 0}, - {0, 255, 2, 1, 3, 255, 5, 4, 7, 6, 8, 255, 0, 0, 0, 0}, - {0, 255, 2, 1, 3, 255, 5, 4, 7, 6, 9, 8, 0, 0, 0, 0}, - {0, 255, 2, 1, 4, 3, 5, 255, 6, 255, 7, 255, 0, 0, 0, 0}, - {0, 255, 2, 1, 4, 3, 5, 255, 6, 255, 8, 7, 0, 0, 0, 0}, - {0, 255, 2, 1, 4, 3, 5, 255, 7, 6, 8, 255, 0, 0, 0, 0}, - {0, 255, 2, 1, 4, 3, 5, 255, 7, 6, 9, 8, 0, 0, 0, 0}, - {0, 255, 2, 1, 4, 3, 6, 5, 7, 255, 8, 255, 0, 0, 0, 0}, - {0, 255, 2, 1, 4, 3, 6, 5, 7, 255, 9, 8, 0, 0, 0, 0}, - {0, 255, 2, 1, 4, 3, 6, 5, 8, 7, 9, 255, 0, 0, 0, 0}, - {0, 255, 2, 1, 4, 3, 6, 5, 8, 7, 10, 9, 0, 0, 0, 0}, - {1, 0, 2, 255, 3, 255, 4, 255, 5, 255, 6, 255, 0, 0, 0, 0}, - {1, 0, 2, 255, 3, 255, 4, 255, 5, 255, 7, 6, 0, 0, 0, 0}, - {1, 0, 2, 255, 3, 255, 4, 255, 6, 5, 7, 255, 0, 0, 0, 0}, - {1, 0, 2, 255, 3, 255, 4, 255, 6, 5, 8, 7, 0, 0, 0, 0}, - {1, 0, 2, 255, 3, 255, 5, 4, 6, 255, 7, 255, 0, 0, 0, 0}, - {1, 0, 2, 255, 3, 255, 5, 4, 6, 255, 8, 7, 0, 0, 0, 0}, - {1, 0, 2, 255, 3, 255, 5, 4, 7, 6, 8, 255, 0, 0, 0, 0}, - {1, 0, 2, 255, 3, 255, 5, 4, 7, 6, 9, 8, 0, 0, 0, 0}, - {1, 0, 2, 255, 4, 3, 5, 255, 6, 255, 7, 255, 0, 0, 0, 0}, - {1, 0, 2, 255, 4, 3, 5, 255, 6, 255, 8, 7, 0, 0, 0, 0}, - {1, 0, 2, 255, 4, 3, 5, 255, 7, 6, 8, 255, 0, 0, 0, 0}, - {1, 0, 2, 255, 4, 3, 5, 255, 7, 6, 9, 8, 0, 0, 0, 0}, - {1, 0, 2, 255, 4, 3, 6, 5, 7, 255, 8, 255, 0, 0, 0, 0}, - {1, 0, 2, 255, 4, 3, 6, 5, 7, 255, 9, 8, 0, 0, 0, 0}, - {1, 0, 2, 255, 4, 3, 6, 5, 8, 7, 9, 255, 0, 0, 0, 0}, - {1, 0, 2, 255, 4, 3, 6, 5, 8, 7, 10, 9, 0, 0, 0, 0}, - {1, 0, 3, 2, 4, 255, 5, 255, 6, 255, 7, 255, 0, 0, 0, 0}, - {1, 0, 3, 2, 4, 255, 5, 255, 6, 255, 8, 7, 0, 0, 0, 0}, - {1, 0, 3, 2, 4, 255, 5, 255, 7, 6, 8, 255, 0, 0, 0, 0}, - {1, 0, 3, 2, 4, 255, 5, 255, 7, 6, 9, 8, 0, 0, 0, 0}, - {1, 0, 3, 2, 4, 255, 6, 5, 7, 255, 8, 255, 0, 0, 0, 0}, - {1, 0, 3, 2, 4, 255, 6, 5, 7, 255, 9, 8, 0, 0, 0, 0}, - {1, 0, 3, 2, 4, 255, 6, 5, 8, 7, 9, 255, 0, 0, 0, 0}, - {1, 0, 3, 2, 4, 255, 6, 5, 8, 7, 10, 9, 0, 0, 0, 0}, - {1, 0, 3, 2, 5, 4, 6, 255, 7, 255, 8, 255, 0, 0, 0, 0}, - {1, 0, 3, 2, 5, 4, 6, 255, 7, 255, 9, 8, 0, 0, 0, 0}, - {1, 0, 3, 2, 5, 4, 6, 255, 8, 7, 9, 255, 0, 0, 0, 0}, - {1, 0, 3, 2, 5, 4, 6, 255, 8, 7, 10, 9, 0, 0, 0, 0}, - {1, 0, 3, 2, 5, 4, 7, 6, 8, 255, 9, 255, 0, 0, 0, 0}, - {1, 0, 3, 2, 5, 4, 7, 6, 8, 255, 10, 9, 0, 0, 0, 0}, - {1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 10, 255, 0, 0, 0, 0}, - {1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 0, 0, 0, 0}, - {0, 255, 255, 255, 1, 255, 255, 255, 2, 255, 255, 255, 3, 255, 255, 255}, - {0, 255, 255, 255, 1, 255, 255, 255, 2, 255, 255, 255, 4, 3, 255, 255}, - {0, 255, 255, 255, 1, 255, 255, 255, 2, 255, 255, 255, 5, 4, 3, 255}, - {0, 255, 255, 255, 1, 255, 255, 255, 3, 2, 255, 255, 4, 255, 255, 255}, - {0, 255, 255, 255, 1, 255, 255, 255, 3, 2, 255, 255, 5, 4, 255, 255}, - {0, 255, 255, 255, 1, 255, 255, 255, 3, 2, 255, 255, 6, 5, 4, 255}, - {0, 255, 255, 255, 1, 255, 255, 255, 4, 3, 2, 255, 5, 255, 255, 255}, - {0, 255, 255, 255, 1, 255, 255, 255, 4, 3, 2, 255, 6, 5, 255, 255}, - {0, 255, 255, 255, 1, 255, 255, 255, 4, 3, 2, 255, 7, 6, 5, 255}, - {0, 255, 255, 255, 2, 1, 255, 255, 3, 255, 255, 255, 4, 255, 255, 255}, - {0, 255, 255, 255, 2, 1, 255, 255, 3, 255, 255, 255, 5, 4, 255, 255}, - {0, 255, 255, 255, 2, 1, 255, 255, 3, 255, 255, 255, 6, 5, 4, 255}, - {0, 255, 255, 255, 2, 1, 255, 255, 4, 3, 255, 255, 5, 255, 255, 255}, - {0, 255, 255, 255, 2, 1, 255, 255, 4, 3, 255, 255, 6, 5, 255, 255}, - {0, 255, 255, 255, 2, 1, 255, 255, 4, 3, 255, 255, 7, 6, 5, 255}, - {0, 255, 255, 255, 2, 1, 255, 255, 5, 4, 3, 255, 6, 255, 255, 255}, - {0, 255, 255, 255, 2, 1, 255, 255, 5, 4, 3, 255, 7, 6, 255, 255}, - {0, 255, 255, 255, 2, 1, 255, 255, 5, 4, 3, 255, 8, 7, 6, 255}, - {0, 255, 255, 255, 3, 2, 1, 255, 4, 255, 255, 255, 5, 255, 255, 255}, - {0, 255, 255, 255, 3, 2, 1, 255, 4, 255, 255, 255, 6, 5, 255, 255}, - {0, 255, 255, 255, 3, 2, 1, 255, 4, 255, 255, 255, 7, 6, 5, 255}, - {0, 255, 255, 255, 3, 2, 1, 255, 5, 4, 255, 255, 6, 255, 255, 255}, - {0, 255, 255, 255, 3, 2, 1, 255, 5, 4, 255, 255, 7, 6, 255, 255}, - {0, 255, 255, 255, 3, 2, 1, 255, 5, 4, 255, 255, 8, 7, 6, 255}, - {0, 255, 255, 255, 3, 2, 1, 255, 6, 5, 4, 255, 7, 255, 255, 255}, - {0, 255, 255, 255, 3, 2, 1, 255, 6, 5, 4, 255, 8, 7, 255, 255}, - {0, 255, 255, 255, 3, 2, 1, 255, 6, 5, 4, 255, 9, 8, 7, 255}, - {1, 0, 255, 255, 2, 255, 255, 255, 3, 255, 255, 255, 4, 255, 255, 255}, - {1, 0, 255, 255, 2, 255, 255, 255, 3, 255, 255, 255, 5, 4, 255, 255}, - {1, 0, 255, 255, 2, 255, 255, 255, 3, 255, 255, 255, 6, 5, 4, 255}, - {1, 0, 255, 255, 2, 255, 255, 255, 4, 3, 255, 255, 5, 255, 255, 255}, - {1, 0, 255, 255, 2, 255, 255, 255, 4, 3, 255, 255, 6, 5, 255, 255}, - {1, 0, 255, 255, 2, 255, 255, 255, 4, 3, 255, 255, 7, 6, 5, 255}, - {1, 0, 255, 255, 2, 255, 255, 255, 5, 4, 3, 255, 6, 255, 255, 255}, - {1, 0, 255, 255, 2, 255, 255, 255, 5, 4, 3, 255, 7, 6, 255, 255}, - {1, 0, 255, 255, 2, 255, 255, 255, 5, 4, 3, 255, 8, 7, 6, 255}, - {1, 0, 255, 255, 3, 2, 255, 255, 4, 255, 255, 255, 5, 255, 255, 255}, - {1, 0, 255, 255, 3, 2, 255, 255, 4, 255, 255, 255, 6, 5, 255, 255}, - {1, 0, 255, 255, 3, 2, 255, 255, 4, 255, 255, 255, 7, 6, 5, 255}, - {1, 0, 255, 255, 3, 2, 255, 255, 5, 4, 255, 255, 6, 255, 255, 255}, - {1, 0, 255, 255, 3, 2, 255, 255, 5, 4, 255, 255, 7, 6, 255, 255}, - {1, 0, 255, 255, 3, 2, 255, 255, 5, 4, 255, 255, 8, 7, 6, 255}, - {1, 0, 255, 255, 3, 2, 255, 255, 6, 5, 4, 255, 7, 255, 255, 255}, - {1, 0, 255, 255, 3, 2, 255, 255, 6, 5, 4, 255, 8, 7, 255, 255}, - {1, 0, 255, 255, 3, 2, 255, 255, 6, 5, 4, 255, 9, 8, 7, 255}, - {1, 0, 255, 255, 4, 3, 2, 255, 5, 255, 255, 255, 6, 255, 255, 255}, - {1, 0, 255, 255, 4, 3, 2, 255, 5, 255, 255, 255, 7, 6, 255, 255}, - {1, 0, 255, 255, 4, 3, 2, 255, 5, 255, 255, 255, 8, 7, 6, 255}, - {1, 0, 255, 255, 4, 3, 2, 255, 6, 5, 255, 255, 7, 255, 255, 255}, - {1, 0, 255, 255, 4, 3, 2, 255, 6, 5, 255, 255, 8, 7, 255, 255}, - {1, 0, 255, 255, 4, 3, 2, 255, 6, 5, 255, 255, 9, 8, 7, 255}, - {1, 0, 255, 255, 4, 3, 2, 255, 7, 6, 5, 255, 8, 255, 255, 255}, - {1, 0, 255, 255, 4, 3, 2, 255, 7, 6, 5, 255, 9, 8, 255, 255}, - {1, 0, 255, 255, 4, 3, 2, 255, 7, 6, 5, 255, 10, 9, 8, 255}, - {2, 1, 0, 255, 3, 255, 255, 255, 4, 255, 255, 255, 5, 255, 255, 255}, - {2, 1, 0, 255, 3, 255, 255, 255, 4, 255, 255, 255, 6, 5, 255, 255}, - {2, 1, 0, 255, 3, 255, 255, 255, 4, 255, 255, 255, 7, 6, 5, 255}, - {2, 1, 0, 255, 3, 255, 255, 255, 5, 4, 255, 255, 6, 255, 255, 255}, - {2, 1, 0, 255, 3, 255, 255, 255, 5, 4, 255, 255, 7, 6, 255, 255}, - {2, 1, 0, 255, 3, 255, 255, 255, 5, 4, 255, 255, 8, 7, 6, 255}, - {2, 1, 0, 255, 3, 255, 255, 255, 6, 5, 4, 255, 7, 255, 255, 255}, - {2, 1, 0, 255, 3, 255, 255, 255, 6, 5, 4, 255, 8, 7, 255, 255}, - {2, 1, 0, 255, 3, 255, 255, 255, 6, 5, 4, 255, 9, 8, 7, 255}, - {2, 1, 0, 255, 4, 3, 255, 255, 5, 255, 255, 255, 6, 255, 255, 255}, - {2, 1, 0, 255, 4, 3, 255, 255, 5, 255, 255, 255, 7, 6, 255, 255}, - {2, 1, 0, 255, 4, 3, 255, 255, 5, 255, 255, 255, 8, 7, 6, 255}, - {2, 1, 0, 255, 4, 3, 255, 255, 6, 5, 255, 255, 7, 255, 255, 255}, - {2, 1, 0, 255, 4, 3, 255, 255, 6, 5, 255, 255, 8, 7, 255, 255}, - {2, 1, 0, 255, 4, 3, 255, 255, 6, 5, 255, 255, 9, 8, 7, 255}, - {2, 1, 0, 255, 4, 3, 255, 255, 7, 6, 5, 255, 8, 255, 255, 255}, - {2, 1, 0, 255, 4, 3, 255, 255, 7, 6, 5, 255, 9, 8, 255, 255}, - {2, 1, 0, 255, 4, 3, 255, 255, 7, 6, 5, 255, 10, 9, 8, 255}, - {2, 1, 0, 255, 5, 4, 3, 255, 6, 255, 255, 255, 7, 255, 255, 255}, - {2, 1, 0, 255, 5, 4, 3, 255, 6, 255, 255, 255, 8, 7, 255, 255}, - {2, 1, 0, 255, 5, 4, 3, 255, 6, 255, 255, 255, 9, 8, 7, 255}, - {2, 1, 0, 255, 5, 4, 3, 255, 7, 6, 255, 255, 8, 255, 255, 255}, - {2, 1, 0, 255, 5, 4, 3, 255, 7, 6, 255, 255, 9, 8, 255, 255}, - {2, 1, 0, 255, 5, 4, 3, 255, 7, 6, 255, 255, 10, 9, 8, 255}, - {2, 1, 0, 255, 5, 4, 3, 255, 8, 7, 6, 255, 9, 255, 255, 255}, - {2, 1, 0, 255, 5, 4, 3, 255, 8, 7, 6, 255, 10, 9, 255, 255}, - {2, 1, 0, 255, 5, 4, 3, 255, 8, 7, 6, 255, 11, 10, 9, 255}, - {0, 255, 255, 255, 1, 255, 255, 255, 2, 255, 255, 255, 0, 0, 0, 0}, - {0, 255, 255, 255, 1, 255, 255, 255, 3, 2, 255, 255, 0, 0, 0, 0}, - {0, 255, 255, 255, 1, 255, 255, 255, 4, 3, 2, 255, 0, 0, 0, 0}, - {0, 255, 255, 255, 1, 255, 255, 255, 5, 4, 3, 2, 0, 0, 0, 0}, - {0, 255, 255, 255, 2, 1, 255, 255, 3, 255, 255, 255, 0, 0, 0, 0}, - {0, 255, 255, 255, 2, 1, 255, 255, 4, 3, 255, 255, 0, 0, 0, 0}, - {0, 255, 255, 255, 2, 1, 255, 255, 5, 4, 3, 255, 0, 0, 0, 0}, - {0, 255, 255, 255, 2, 1, 255, 255, 6, 5, 4, 3, 0, 0, 0, 0}, - {0, 255, 255, 255, 3, 2, 1, 255, 4, 255, 255, 255, 0, 0, 0, 0}, - {0, 255, 255, 255, 3, 2, 1, 255, 5, 4, 255, 255, 0, 0, 0, 0}, - {0, 255, 255, 255, 3, 2, 1, 255, 6, 5, 4, 255, 0, 0, 0, 0}, - {0, 255, 255, 255, 3, 2, 1, 255, 7, 6, 5, 4, 0, 0, 0, 0}, - {0, 255, 255, 255, 4, 3, 2, 1, 5, 255, 255, 255, 0, 0, 0, 0}, - {0, 255, 255, 255, 4, 3, 2, 1, 6, 5, 255, 255, 0, 0, 0, 0}, - {0, 255, 255, 255, 4, 3, 2, 1, 7, 6, 5, 255, 0, 0, 0, 0}, - {0, 255, 255, 255, 4, 3, 2, 1, 8, 7, 6, 5, 0, 0, 0, 0}, - {1, 0, 255, 255, 2, 255, 255, 255, 3, 255, 255, 255, 0, 0, 0, 0}, - {1, 0, 255, 255, 2, 255, 255, 255, 4, 3, 255, 255, 0, 0, 0, 0}, - {1, 0, 255, 255, 2, 255, 255, 255, 5, 4, 3, 255, 0, 0, 0, 0}, - {1, 0, 255, 255, 2, 255, 255, 255, 6, 5, 4, 3, 0, 0, 0, 0}, - {1, 0, 255, 255, 3, 2, 255, 255, 4, 255, 255, 255, 0, 0, 0, 0}, - {1, 0, 255, 255, 3, 2, 255, 255, 5, 4, 255, 255, 0, 0, 0, 0}, - {1, 0, 255, 255, 3, 2, 255, 255, 6, 5, 4, 255, 0, 0, 0, 0}, - {1, 0, 255, 255, 3, 2, 255, 255, 7, 6, 5, 4, 0, 0, 0, 0}, - {1, 0, 255, 255, 4, 3, 2, 255, 5, 255, 255, 255, 0, 0, 0, 0}, - {1, 0, 255, 255, 4, 3, 2, 255, 6, 5, 255, 255, 0, 0, 0, 0}, - {1, 0, 255, 255, 4, 3, 2, 255, 7, 6, 5, 255, 0, 0, 0, 0}, - {1, 0, 255, 255, 4, 3, 2, 255, 8, 7, 6, 5, 0, 0, 0, 0}, - {1, 0, 255, 255, 5, 4, 3, 2, 6, 255, 255, 255, 0, 0, 0, 0}, - {1, 0, 255, 255, 5, 4, 3, 2, 7, 6, 255, 255, 0, 0, 0, 0}, - {1, 0, 255, 255, 5, 4, 3, 2, 8, 7, 6, 255, 0, 0, 0, 0}, - {1, 0, 255, 255, 5, 4, 3, 2, 9, 8, 7, 6, 0, 0, 0, 0}, - {2, 1, 0, 255, 3, 255, 255, 255, 4, 255, 255, 255, 0, 0, 0, 0}, - {2, 1, 0, 255, 3, 255, 255, 255, 5, 4, 255, 255, 0, 0, 0, 0}, - {2, 1, 0, 255, 3, 255, 255, 255, 6, 5, 4, 255, 0, 0, 0, 0}, - {2, 1, 0, 255, 3, 255, 255, 255, 7, 6, 5, 4, 0, 0, 0, 0}, - {2, 1, 0, 255, 4, 3, 255, 255, 5, 255, 255, 255, 0, 0, 0, 0}, - {2, 1, 0, 255, 4, 3, 255, 255, 6, 5, 255, 255, 0, 0, 0, 0}, - {2, 1, 0, 255, 4, 3, 255, 255, 7, 6, 5, 255, 0, 0, 0, 0}, - {2, 1, 0, 255, 4, 3, 255, 255, 8, 7, 6, 5, 0, 0, 0, 0}, - {2, 1, 0, 255, 5, 4, 3, 255, 6, 255, 255, 255, 0, 0, 0, 0}, - {2, 1, 0, 255, 5, 4, 3, 255, 7, 6, 255, 255, 0, 0, 0, 0}, - {2, 1, 0, 255, 5, 4, 3, 255, 8, 7, 6, 255, 0, 0, 0, 0}, - {2, 1, 0, 255, 5, 4, 3, 255, 9, 8, 7, 6, 0, 0, 0, 0}, - {2, 1, 0, 255, 6, 5, 4, 3, 7, 255, 255, 255, 0, 0, 0, 0}, - {2, 1, 0, 255, 6, 5, 4, 3, 8, 7, 255, 255, 0, 0, 0, 0}, - {2, 1, 0, 255, 6, 5, 4, 3, 9, 8, 7, 255, 0, 0, 0, 0}, - {2, 1, 0, 255, 6, 5, 4, 3, 10, 9, 8, 7, 0, 0, 0, 0}, - {3, 2, 1, 0, 4, 255, 255, 255, 5, 255, 255, 255, 0, 0, 0, 0}, - {3, 2, 1, 0, 4, 255, 255, 255, 6, 5, 255, 255, 0, 0, 0, 0}, - {3, 2, 1, 0, 4, 255, 255, 255, 7, 6, 5, 255, 0, 0, 0, 0}, - {3, 2, 1, 0, 4, 255, 255, 255, 8, 7, 6, 5, 0, 0, 0, 0}, - {3, 2, 1, 0, 5, 4, 255, 255, 6, 255, 255, 255, 0, 0, 0, 0}, - {3, 2, 1, 0, 5, 4, 255, 255, 7, 6, 255, 255, 0, 0, 0, 0}, - {3, 2, 1, 0, 5, 4, 255, 255, 8, 7, 6, 255, 0, 0, 0, 0}, - {3, 2, 1, 0, 5, 4, 255, 255, 9, 8, 7, 6, 0, 0, 0, 0}, - {3, 2, 1, 0, 6, 5, 4, 255, 7, 255, 255, 255, 0, 0, 0, 0}, - {3, 2, 1, 0, 6, 5, 4, 255, 8, 7, 255, 255, 0, 0, 0, 0}, - {3, 2, 1, 0, 6, 5, 4, 255, 9, 8, 7, 255, 0, 0, 0, 0}, - {3, 2, 1, 0, 6, 5, 4, 255, 10, 9, 8, 7, 0, 0, 0, 0}, - {3, 2, 1, 0, 7, 6, 5, 4, 8, 255, 255, 255, 0, 0, 0, 0}, - {3, 2, 1, 0, 7, 6, 5, 4, 9, 8, 255, 255, 0, 0, 0, 0}, - {3, 2, 1, 0, 7, 6, 5, 4, 10, 9, 8, 255, 0, 0, 0, 0}, - {3, 2, 1, 0, 7, 6, 5, 4, 11, 10, 9, 8, 0, 0, 0, 0}}; -/* number of two bytes : 64 */ -/* number of two + three bytes : 145 */ -/* number of two + three + four bytes : 209 */ -const uint8_t utf8bigindex[4096][2] = { - {209, 12}, {209, 12}, {209, 12}, {209, 12}, {209, 12}, {209, 12}, {209, 12}, - {145, 3}, {209, 12}, {209, 12}, {209, 12}, {146, 4}, {209, 12}, {149, 4}, - {161, 4}, {64, 4}, {209, 12}, {209, 12}, {209, 12}, {147, 5}, {209, 12}, - {150, 5}, {162, 5}, {65, 5}, {209, 12}, {153, 5}, {165, 5}, {67, 5}, - {177, 5}, {73, 5}, {91, 5}, {64, 4}, {209, 12}, {209, 12}, {209, 12}, - {148, 6}, {209, 12}, {151, 6}, {163, 6}, {66, 6}, {209, 12}, {154, 6}, - {166, 6}, {68, 6}, {178, 6}, {74, 6}, {92, 6}, {64, 4}, {209, 12}, - {157, 6}, {169, 6}, {70, 6}, {181, 6}, {76, 6}, {94, 6}, {65, 5}, - {193, 6}, {82, 6}, {100, 6}, {67, 5}, {118, 6}, {73, 5}, {91, 5}, - {0, 6}, {209, 12}, {209, 12}, {209, 12}, {209, 12}, {209, 12}, {152, 7}, - {164, 7}, {145, 3}, {209, 12}, {155, 7}, {167, 7}, {69, 7}, {179, 7}, - {75, 7}, {93, 7}, {64, 4}, {209, 12}, {158, 7}, {170, 7}, {71, 7}, - {182, 7}, {77, 7}, {95, 7}, {65, 5}, {194, 7}, {83, 7}, {101, 7}, - {67, 5}, {119, 7}, {73, 5}, {91, 5}, {1, 7}, {209, 12}, {209, 12}, - {173, 7}, {148, 6}, {185, 7}, {79, 7}, {97, 7}, {66, 6}, {197, 7}, - {85, 7}, {103, 7}, {68, 6}, {121, 7}, {74, 6}, {92, 6}, {2, 7}, - {209, 12}, {157, 6}, {109, 7}, {70, 6}, {127, 7}, {76, 6}, {94, 6}, - {4, 7}, {193, 6}, {82, 6}, {100, 6}, {8, 7}, {118, 6}, {16, 7}, - {32, 7}, {0, 6}, {209, 12}, {209, 12}, {209, 12}, {209, 12}, {209, 12}, - {209, 12}, {209, 12}, {145, 3}, {209, 12}, {156, 8}, {168, 8}, {146, 4}, - {180, 8}, {149, 4}, {161, 4}, {64, 4}, {209, 12}, {159, 8}, {171, 8}, - {72, 8}, {183, 8}, {78, 8}, {96, 8}, {65, 5}, {195, 8}, {84, 8}, - {102, 8}, {67, 5}, {120, 8}, {73, 5}, {91, 5}, {64, 4}, {209, 12}, - {209, 12}, {174, 8}, {148, 6}, {186, 8}, {80, 8}, {98, 8}, {66, 6}, - {198, 8}, {86, 8}, {104, 8}, {68, 6}, {122, 8}, {74, 6}, {92, 6}, +/* begin file src/simdutf/fallback/implementation.h */ +#ifndef SIMDUTF_FALLBACK_IMPLEMENTATION_H +#define SIMDUTF_FALLBACK_IMPLEMENTATION_H + + +namespace simdutf { +namespace fallback { + +namespace { +using namespace simdutf; +} + +class implementation final : public simdutf::implementation { +public: + simdutf_really_inline implementation() + : simdutf::implementation("fallback", "Generic fallback implementation", + 0) {} + simdutf_warn_unused int detect_encodings(const char *input, + size_t length) const noexcept final; + simdutf_warn_unused bool validate_utf8(const char *buf, + size_t len) const noexcept final; + simdutf_warn_unused result + validate_utf8_with_errors(const char *buf, size_t len) const noexcept final; + simdutf_warn_unused bool validate_ascii(const char *buf, + size_t len) const noexcept final; + simdutf_warn_unused result + validate_ascii_with_errors(const char *buf, size_t len) const noexcept final; + simdutf_warn_unused bool validate_utf16le(const char16_t *buf, + size_t len) const noexcept final; + simdutf_warn_unused bool validate_utf16be(const char16_t *buf, + size_t len) const noexcept final; + simdutf_warn_unused result validate_utf16le_with_errors( + const char16_t *buf, size_t len) const noexcept final; + simdutf_warn_unused result validate_utf16be_with_errors( + const char16_t *buf, size_t len) const noexcept final; + simdutf_warn_unused bool validate_utf32(const char32_t *buf, + size_t len) const noexcept final; + simdutf_warn_unused result validate_utf32_with_errors( + const char32_t *buf, size_t len) const noexcept final; + simdutf_warn_unused size_t convert_latin1_to_utf8( + const char *buf, size_t len, char *utf8_output) const noexcept final; + simdutf_warn_unused size_t convert_latin1_to_utf16le( + const char *buf, size_t len, char16_t *utf16_buffer) const noexcept final; + simdutf_warn_unused size_t convert_latin1_to_utf16be( + const char *buf, size_t len, char16_t *utf16_buffer) const noexcept final; + simdutf_warn_unused size_t convert_latin1_to_utf32( + const char *buf, size_t len, char32_t *utf32_output) const noexcept final; + simdutf_warn_unused size_t convert_utf8_to_latin1( + const char *buf, size_t len, char *latin1_output) const noexcept final; + simdutf_warn_unused result convert_utf8_to_latin1_with_errors( + const char *buf, size_t len, char *latin1_buffer) const noexcept final; + simdutf_warn_unused size_t convert_valid_utf8_to_latin1( + const char *buf, size_t len, char *latin1_output) const noexcept final; + simdutf_warn_unused size_t convert_utf8_to_utf16le( + const char *buf, size_t len, char16_t *utf16_output) const noexcept final; + simdutf_warn_unused size_t convert_utf8_to_utf16be( + const char *buf, size_t len, char16_t *utf16_output) const noexcept final; + simdutf_warn_unused result convert_utf8_to_utf16le_with_errors( + const char *buf, size_t len, char16_t *utf16_output) const noexcept final; + simdutf_warn_unused result convert_utf8_to_utf16be_with_errors( + const char *buf, size_t len, char16_t *utf16_output) const noexcept final; + simdutf_warn_unused size_t convert_valid_utf8_to_utf16le( + const char *buf, size_t len, char16_t *utf16_buffer) const noexcept final; + simdutf_warn_unused size_t convert_valid_utf8_to_utf16be( + const char *buf, size_t len, char16_t *utf16_buffer) const noexcept final; + simdutf_warn_unused size_t convert_utf8_to_utf32( + const char *buf, size_t len, char32_t *utf32_output) const noexcept final; + simdutf_warn_unused result convert_utf8_to_utf32_with_errors( + const char *buf, size_t len, char32_t *utf32_output) const noexcept final; + simdutf_warn_unused size_t convert_valid_utf8_to_utf32( + const char *buf, size_t len, char32_t *utf32_buffer) const noexcept final; + simdutf_warn_unused size_t + convert_utf16le_to_latin1(const char16_t *buf, size_t len, + char *latin1_buffer) const noexcept final; + simdutf_warn_unused size_t + convert_utf16be_to_latin1(const char16_t *buf, size_t len, + char *latin1_buffer) const noexcept final; + simdutf_warn_unused result convert_utf16le_to_latin1_with_errors( + const char16_t *buf, size_t len, + char *latin1_buffer) const noexcept final; + simdutf_warn_unused result convert_utf16be_to_latin1_with_errors( + const char16_t *buf, size_t len, + char *latin1_buffer) const noexcept final; + simdutf_warn_unused size_t + convert_valid_utf16le_to_latin1(const char16_t *buf, size_t len, + char *latin1_buffer) const noexcept final; + simdutf_warn_unused size_t + convert_valid_utf16be_to_latin1(const char16_t *buf, size_t len, + char *latin1_buffer) const noexcept final; + simdutf_warn_unused size_t convert_utf16le_to_utf8( + const char16_t *buf, size_t len, char *utf8_buffer) const noexcept final; + simdutf_warn_unused size_t convert_utf16be_to_utf8( + const char16_t *buf, size_t len, char *utf8_buffer) const noexcept final; + simdutf_warn_unused result convert_utf16le_to_utf8_with_errors( + const char16_t *buf, size_t len, char *utf8_buffer) const noexcept final; + simdutf_warn_unused result convert_utf16be_to_utf8_with_errors( + const char16_t *buf, size_t len, char *utf8_buffer) const noexcept final; + simdutf_warn_unused size_t convert_valid_utf16le_to_utf8( + const char16_t *buf, size_t len, char *utf8_buffer) const noexcept final; + simdutf_warn_unused size_t convert_valid_utf16be_to_utf8( + const char16_t *buf, size_t len, char *utf8_buffer) const noexcept final; + simdutf_warn_unused size_t convert_utf32_to_utf8( + const char32_t *buf, size_t len, char *utf8_buffer) const noexcept final; + simdutf_warn_unused result convert_utf32_to_utf8_with_errors( + const char32_t *buf, size_t len, char *utf8_buffer) const noexcept final; + simdutf_warn_unused size_t convert_valid_utf32_to_utf8( + const char32_t *buf, size_t len, char *utf8_buffer) const noexcept final; + simdutf_warn_unused size_t + convert_utf32_to_latin1(const char32_t *buf, size_t len, + char *latin1_output) const noexcept final; + simdutf_warn_unused result + convert_utf32_to_latin1_with_errors(const char32_t *buf, size_t len, + char *latin1_output) const noexcept final; + simdutf_warn_unused size_t + convert_valid_utf32_to_latin1(const char32_t *buf, size_t len, + char *latin1_output) const noexcept final; + simdutf_warn_unused size_t + convert_utf32_to_utf16le(const char32_t *buf, size_t len, + char16_t *utf16_buffer) const noexcept final; + simdutf_warn_unused size_t + convert_utf32_to_utf16be(const char32_t *buf, size_t len, + char16_t *utf16_buffer) const noexcept final; + simdutf_warn_unused result convert_utf32_to_utf16le_with_errors( + const char32_t *buf, size_t len, + char16_t *utf16_buffer) const noexcept final; + simdutf_warn_unused result convert_utf32_to_utf16be_with_errors( + const char32_t *buf, size_t len, + char16_t *utf16_buffer) const noexcept final; + simdutf_warn_unused size_t + convert_valid_utf32_to_utf16le(const char32_t *buf, size_t len, + char16_t *utf16_buffer) const noexcept final; + simdutf_warn_unused size_t + convert_valid_utf32_to_utf16be(const char32_t *buf, size_t len, + char16_t *utf16_buffer) const noexcept final; + simdutf_warn_unused size_t + convert_utf16le_to_utf32(const char16_t *buf, size_t len, + char32_t *utf32_buffer) const noexcept final; + simdutf_warn_unused size_t + convert_utf16be_to_utf32(const char16_t *buf, size_t len, + char32_t *utf32_buffer) const noexcept final; + simdutf_warn_unused result convert_utf16le_to_utf32_with_errors( + const char16_t *buf, size_t len, + char32_t *utf32_buffer) const noexcept final; + simdutf_warn_unused result convert_utf16be_to_utf32_with_errors( + const char16_t *buf, size_t len, + char32_t *utf32_buffer) const noexcept final; + simdutf_warn_unused size_t + convert_valid_utf16le_to_utf32(const char16_t *buf, size_t len, + char32_t *utf32_buffer) const noexcept final; + simdutf_warn_unused size_t + convert_valid_utf16be_to_utf32(const char16_t *buf, size_t len, + char32_t *utf32_buffer) const noexcept final; + void change_endianness_utf16(const char16_t *buf, size_t length, + char16_t *output) const noexcept final; + simdutf_warn_unused size_t count_utf16le(const char16_t *buf, + size_t length) const noexcept; + simdutf_warn_unused size_t count_utf16be(const char16_t *buf, + size_t length) const noexcept; + simdutf_warn_unused size_t count_utf8(const char *buf, + size_t length) const noexcept; + simdutf_warn_unused size_t + utf8_length_from_utf16le(const char16_t *input, size_t length) const noexcept; + simdutf_warn_unused size_t + utf8_length_from_utf16be(const char16_t *input, size_t length) const noexcept; + simdutf_warn_unused size_t utf32_length_from_utf16le( + const char16_t *input, size_t length) const noexcept; + simdutf_warn_unused size_t utf32_length_from_utf16be( + const char16_t *input, size_t length) const noexcept; + simdutf_warn_unused size_t + utf16_length_from_utf8(const char *input, size_t length) const noexcept; + simdutf_warn_unused size_t + utf8_length_from_utf32(const char32_t *input, size_t length) const noexcept; + simdutf_warn_unused size_t + utf16_length_from_utf32(const char32_t *input, size_t length) const noexcept; + simdutf_warn_unused size_t + utf32_length_from_utf8(const char *input, size_t length) const noexcept; + simdutf_warn_unused size_t + latin1_length_from_utf8(const char *input, size_t length) const noexcept; + simdutf_warn_unused size_t + latin1_length_from_utf16(size_t length) const noexcept; + simdutf_warn_unused size_t + latin1_length_from_utf32(size_t length) const noexcept; + simdutf_warn_unused size_t + utf32_length_from_latin1(size_t length) const noexcept; + simdutf_warn_unused size_t + utf16_length_from_latin1(size_t length) const noexcept; + simdutf_warn_unused size_t + utf8_length_from_latin1(const char *input, size_t length) const noexcept; + simdutf_warn_unused size_t maximal_binary_length_from_base64( + const char *input, size_t length) const noexcept; + simdutf_warn_unused result base64_to_binary( + const char *input, size_t length, char *output, base64_options options, + last_chunk_handling_options last_chunk_options) const noexcept; + simdutf_warn_unused full_result base64_to_binary_details( + const char *input, size_t length, char *output, base64_options options, + last_chunk_handling_options last_chunk_options = + last_chunk_handling_options::loose) const noexcept; + simdutf_warn_unused size_t maximal_binary_length_from_base64( + const char16_t *input, size_t length) const noexcept; + simdutf_warn_unused result base64_to_binary( + const char16_t *input, size_t length, char *output, + base64_options options, + last_chunk_handling_options last_chunk_options) const noexcept; + simdutf_warn_unused size_t base64_length_from_binary( + size_t length, base64_options options) const noexcept; + simdutf_warn_unused full_result base64_to_binary_details( + const char16_t *input, size_t length, char *output, + base64_options options, + last_chunk_handling_options last_chunk_options = + last_chunk_handling_options::loose) const noexcept; + size_t binary_to_base64(const char *input, size_t length, char *output, + base64_options options) const noexcept; +}; +} // namespace fallback +} // namespace simdutf + +#endif // SIMDUTF_FALLBACK_IMPLEMENTATION_H +/* end file src/simdutf/fallback/implementation.h */ + +/* begin file src/simdutf/fallback/begin.h */ +// redefining SIMDUTF_IMPLEMENTATION to "fallback" +// #define SIMDUTF_IMPLEMENTATION fallback +/* end file src/simdutf/fallback/begin.h */ + + // Declarations +/* begin file src/simdutf/fallback/bitmanipulation.h */ +#ifndef SIMDUTF_FALLBACK_BITMANIPULATION_H +#define SIMDUTF_FALLBACK_BITMANIPULATION_H + +#include + +namespace simdutf { +namespace fallback { +namespace {} // unnamed namespace +} // namespace fallback +} // namespace simdutf + +#endif // SIMDUTF_FALLBACK_BITMANIPULATION_H +/* end file src/simdutf/fallback/bitmanipulation.h */ + +/* begin file src/simdutf/fallback/end.h */ +/* end file src/simdutf/fallback/end.h */ + +#endif // SIMDUTF_IMPLEMENTATION_FALLBACK +#endif // SIMDUTF_FALLBACK_H +/* end file src/simdutf/fallback.h */ + +/* begin file src/scalar/utf8.h */ +#ifndef SIMDUTF_UTF8_H +#define SIMDUTF_UTF8_H + +namespace simdutf { +namespace scalar { +namespace { +namespace utf8 { +#if SIMDUTF_IMPLEMENTATION_FALLBACK || SIMDUTF_IMPLEMENTATION_RVV +// only used by the fallback kernel. +// credit: based on code from Google Fuchsia (Apache Licensed) +inline simdutf_warn_unused bool validate(const char *buf, size_t len) noexcept { + const uint8_t *data = reinterpret_cast(buf); + uint64_t pos = 0; + uint32_t code_point = 0; + while (pos < len) { + // check of the next 16 bytes are ascii. + uint64_t next_pos = pos + 16; + if (next_pos <= + len) { // if it is safe to read 16 more bytes, check that they are ascii + uint64_t v1; + std::memcpy(&v1, data + pos, sizeof(uint64_t)); + uint64_t v2; + std::memcpy(&v2, data + pos + sizeof(uint64_t), sizeof(uint64_t)); + uint64_t v{v1 | v2}; + if ((v & 0x8080808080808080) == 0) { + pos = next_pos; + continue; + } + } + unsigned char byte = data[pos]; + + while (byte < 0b10000000) { + if (++pos == len) { + return true; + } + byte = data[pos]; + } + + if ((byte & 0b11100000) == 0b11000000) { + next_pos = pos + 2; + if (next_pos > len) { + return false; + } + if ((data[pos + 1] & 0b11000000) != 0b10000000) { + return false; + } + // range check + code_point = (byte & 0b00011111) << 6 | (data[pos + 1] & 0b00111111); + if ((code_point < 0x80) || (0x7ff < code_point)) { + return false; + } + } else if ((byte & 0b11110000) == 0b11100000) { + next_pos = pos + 3; + if (next_pos > len) { + return false; + } + if ((data[pos + 1] & 0b11000000) != 0b10000000) { + return false; + } + if ((data[pos + 2] & 0b11000000) != 0b10000000) { + return false; + } + // range check + code_point = (byte & 0b00001111) << 12 | + (data[pos + 1] & 0b00111111) << 6 | + (data[pos + 2] & 0b00111111); + if ((code_point < 0x800) || (0xffff < code_point) || + (0xd7ff < code_point && code_point < 0xe000)) { + return false; + } + } else if ((byte & 0b11111000) == 0b11110000) { // 0b11110000 + next_pos = pos + 4; + if (next_pos > len) { + return false; + } + if ((data[pos + 1] & 0b11000000) != 0b10000000) { + return false; + } + if ((data[pos + 2] & 0b11000000) != 0b10000000) { + return false; + } + if ((data[pos + 3] & 0b11000000) != 0b10000000) { + return false; + } + // range check + code_point = + (byte & 0b00000111) << 18 | (data[pos + 1] & 0b00111111) << 12 | + (data[pos + 2] & 0b00111111) << 6 | (data[pos + 3] & 0b00111111); + if (code_point <= 0xffff || 0x10ffff < code_point) { + return false; + } + } else { + // we may have a continuation + return false; + } + pos = next_pos; + } + return true; +} +#endif + +inline simdutf_warn_unused result validate_with_errors(const char *buf, + size_t len) noexcept { + const uint8_t *data = reinterpret_cast(buf); + size_t pos = 0; + uint32_t code_point = 0; + while (pos < len) { + // check of the next 16 bytes are ascii. + size_t next_pos = pos + 16; + if (next_pos <= + len) { // if it is safe to read 16 more bytes, check that they are ascii + uint64_t v1; + std::memcpy(&v1, data + pos, sizeof(uint64_t)); + uint64_t v2; + std::memcpy(&v2, data + pos + sizeof(uint64_t), sizeof(uint64_t)); + uint64_t v{v1 | v2}; + if ((v & 0x8080808080808080) == 0) { + pos = next_pos; + continue; + } + } + unsigned char byte = data[pos]; + + while (byte < 0b10000000) { + if (++pos == len) { + return result(error_code::SUCCESS, len); + } + byte = data[pos]; + } + + if ((byte & 0b11100000) == 0b11000000) { + next_pos = pos + 2; + if (next_pos > len) { + return result(error_code::TOO_SHORT, pos); + } + if ((data[pos + 1] & 0b11000000) != 0b10000000) { + return result(error_code::TOO_SHORT, pos); + } + // range check + code_point = (byte & 0b00011111) << 6 | (data[pos + 1] & 0b00111111); + if ((code_point < 0x80) || (0x7ff < code_point)) { + return result(error_code::OVERLONG, pos); + } + } else if ((byte & 0b11110000) == 0b11100000) { + next_pos = pos + 3; + if (next_pos > len) { + return result(error_code::TOO_SHORT, pos); + } + if ((data[pos + 1] & 0b11000000) != 0b10000000) { + return result(error_code::TOO_SHORT, pos); + } + if ((data[pos + 2] & 0b11000000) != 0b10000000) { + return result(error_code::TOO_SHORT, pos); + } + // range check + code_point = (byte & 0b00001111) << 12 | + (data[pos + 1] & 0b00111111) << 6 | + (data[pos + 2] & 0b00111111); + if ((code_point < 0x800) || (0xffff < code_point)) { + return result(error_code::OVERLONG, pos); + } + if (0xd7ff < code_point && code_point < 0xe000) { + return result(error_code::SURROGATE, pos); + } + } else if ((byte & 0b11111000) == 0b11110000) { // 0b11110000 + next_pos = pos + 4; + if (next_pos > len) { + return result(error_code::TOO_SHORT, pos); + } + if ((data[pos + 1] & 0b11000000) != 0b10000000) { + return result(error_code::TOO_SHORT, pos); + } + if ((data[pos + 2] & 0b11000000) != 0b10000000) { + return result(error_code::TOO_SHORT, pos); + } + if ((data[pos + 3] & 0b11000000) != 0b10000000) { + return result(error_code::TOO_SHORT, pos); + } + // range check + code_point = + (byte & 0b00000111) << 18 | (data[pos + 1] & 0b00111111) << 12 | + (data[pos + 2] & 0b00111111) << 6 | (data[pos + 3] & 0b00111111); + if (code_point <= 0xffff) { + return result(error_code::OVERLONG, pos); + } + if (0x10ffff < code_point) { + return result(error_code::TOO_LARGE, pos); + } + } else { + // we either have too many continuation bytes or an invalid leading byte + if ((byte & 0b11000000) == 0b10000000) { + return result(error_code::TOO_LONG, pos); + } else { + return result(error_code::HEADER_BITS, pos); + } + } + pos = next_pos; + } + return result(error_code::SUCCESS, len); +} + +// Finds the previous leading byte starting backward from buf and validates with +// errors from there Used to pinpoint the location of an error when an invalid +// chunk is detected We assume that the stream starts with a leading byte, and +// to check that it is the case, we ask that you pass a pointer to the start of +// the stream (start). +inline simdutf_warn_unused result rewind_and_validate_with_errors( + const char *start, const char *buf, size_t len) noexcept { + // First check that we start with a leading byte + if ((*start & 0b11000000) == 0b10000000) { + return result(error_code::TOO_LONG, 0); + } + size_t extra_len{0}; + // A leading byte cannot be further than 4 bytes away + for (int i = 0; i < 5; i++) { + unsigned char byte = *buf; + if ((byte & 0b11000000) != 0b10000000) { + break; + } else { + buf--; + extra_len++; + } + } + + result res = validate_with_errors(buf, len + extra_len); + res.count -= extra_len; + return res; +} + +inline size_t count_code_points(const char *buf, size_t len) { + const int8_t *p = reinterpret_cast(buf); + size_t counter{0}; + for (size_t i = 0; i < len; i++) { + // -65 is 0b10111111, anything larger in two-complement's should start a new + // code point. + if (p[i] > -65) { + counter++; + } + } + return counter; +} + +inline size_t utf16_length_from_utf8(const char *buf, size_t len) { + const int8_t *p = reinterpret_cast(buf); + size_t counter{0}; + for (size_t i = 0; i < len; i++) { + if (p[i] > -65) { + counter++; + } + if (uint8_t(p[i]) >= 240) { + counter++; + } + } + return counter; +} + +simdutf_warn_unused inline size_t trim_partial_utf8(const char *input, + size_t length) { + if (length < 3) { + switch (length) { + case 2: + if (uint8_t(input[length - 1]) >= 0xc0) { + return length - 1; + } // 2-, 3- and 4-byte characters with only 1 byte left + if (uint8_t(input[length - 2]) >= 0xe0) { + return length - 2; + } // 3- and 4-byte characters with only 2 bytes left + return length; + case 1: + if (uint8_t(input[length - 1]) >= 0xc0) { + return length - 1; + } // 2-, 3- and 4-byte characters with only 1 byte left + return length; + case 0: + return length; + } + } + if (uint8_t(input[length - 1]) >= 0xc0) { + return length - 1; + } // 2-, 3- and 4-byte characters with only 1 byte left + if (uint8_t(input[length - 2]) >= 0xe0) { + return length - 2; + } // 3- and 4-byte characters with only 1 byte left + if (uint8_t(input[length - 3]) >= 0xf0) { + return length - 3; + } // 4-byte characters with only 3 bytes left + return length; +} + +} // namespace utf8 +} // unnamed namespace +} // namespace scalar +} // namespace simdutf + +#endif +/* end file src/scalar/utf8.h */ +/* begin file src/scalar/utf16.h */ +#ifndef SIMDUTF_UTF16_H +#define SIMDUTF_UTF16_H + +namespace simdutf { +namespace scalar { +namespace { +namespace utf16 { + +inline simdutf_warn_unused uint16_t swap_bytes(const uint16_t word) { + return uint16_t((word >> 8) | (word << 8)); +} + +template +inline simdutf_warn_unused bool validate(const char16_t *data, + size_t len) noexcept { + uint64_t pos = 0; + while (pos < len) { + char16_t word = + !match_system(big_endian) ? swap_bytes(data[pos]) : data[pos]; + if ((word & 0xF800) == 0xD800) { + if (pos + 1 >= len) { + return false; + } + char16_t diff = char16_t(word - 0xD800); + if (diff > 0x3FF) { + return false; + } + char16_t next_word = + !match_system(big_endian) ? swap_bytes(data[pos + 1]) : data[pos + 1]; + char16_t diff2 = char16_t(next_word - 0xDC00); + if (diff2 > 0x3FF) { + return false; + } + pos += 2; + } else { + pos++; + } + } + return true; +} + +template +inline simdutf_warn_unused result validate_with_errors(const char16_t *data, + size_t len) noexcept { + size_t pos = 0; + while (pos < len) { + char16_t word = + !match_system(big_endian) ? swap_bytes(data[pos]) : data[pos]; + if ((word & 0xF800) == 0xD800) { + if (pos + 1 >= len) { + return result(error_code::SURROGATE, pos); + } + char16_t diff = char16_t(word - 0xD800); + if (diff > 0x3FF) { + return result(error_code::SURROGATE, pos); + } + char16_t next_word = + !match_system(big_endian) ? swap_bytes(data[pos + 1]) : data[pos + 1]; + char16_t diff2 = uint16_t(next_word - 0xDC00); + if (diff2 > 0x3FF) { + return result(error_code::SURROGATE, pos); + } + pos += 2; + } else { + pos++; + } + } + return result(error_code::SUCCESS, pos); +} + +template +inline size_t count_code_points(const char16_t *p, size_t len) { + // We are not BOM aware. + size_t counter{0}; + for (size_t i = 0; i < len; i++) { + char16_t word = !match_system(big_endian) ? swap_bytes(p[i]) : p[i]; + counter += ((word & 0xFC00) != 0xDC00); + } + return counter; +} + +template +inline size_t utf8_length_from_utf16(const char16_t *p, size_t len) { + // We are not BOM aware. + size_t counter{0}; + for (size_t i = 0; i < len; i++) { + char16_t word = !match_system(big_endian) ? swap_bytes(p[i]) : p[i]; + counter++; // ASCII + counter += static_cast( + word > + 0x7F); // non-ASCII is at least 2 bytes, surrogates are 2*2 == 4 bytes + counter += static_cast((word > 0x7FF && word <= 0xD7FF) || + (word >= 0xE000)); // three-byte + } + return counter; +} + +template +inline size_t utf32_length_from_utf16(const char16_t *p, size_t len) { + // We are not BOM aware. + size_t counter{0}; + for (size_t i = 0; i < len; i++) { + char16_t word = !match_system(big_endian) ? swap_bytes(p[i]) : p[i]; + counter += ((word & 0xFC00) != 0xDC00); + } + return counter; +} + +inline size_t latin1_length_from_utf16(size_t len) { return len; } + +simdutf_really_inline void +change_endianness_utf16(const char16_t *input, size_t size, char16_t *output) { + for (size_t i = 0; i < size; i++) { + *output++ = char16_t(input[i] >> 8 | input[i] << 8); + } +} + +template +simdutf_warn_unused inline size_t trim_partial_utf16(const char16_t *input, + size_t length) { + if (length <= 1) { + return length; + } + uint16_t last_word = uint16_t(input[length - 1]); + last_word = !match_system(big_endian) ? swap_bytes(last_word) : last_word; + length -= ((last_word & 0xFC00) == 0xD800); + return length; +} + +} // namespace utf16 +} // unnamed namespace +} // namespace scalar +} // namespace simdutf + +#endif +/* end file src/scalar/utf16.h */ +/* begin file src/scalar/utf32.h */ +#ifndef SIMDUTF_UTF32_H +#define SIMDUTF_UTF32_H + +namespace simdutf { +namespace scalar { +namespace { +namespace utf32 { + +inline simdutf_warn_unused bool validate(const char32_t *buf, + size_t len) noexcept { + const uint32_t *data = reinterpret_cast(buf); + uint64_t pos = 0; + for (; pos < len; pos++) { + uint32_t word = data[pos]; + if (word > 0x10FFFF || (word >= 0xD800 && word <= 0xDFFF)) { + return false; + } + } + return true; +} + +inline simdutf_warn_unused result validate_with_errors(const char32_t *buf, + size_t len) noexcept { + const uint32_t *data = reinterpret_cast(buf); + size_t pos = 0; + for (; pos < len; pos++) { + uint32_t word = data[pos]; + if (word > 0x10FFFF) { + return result(error_code::TOO_LARGE, pos); + } + if (word >= 0xD800 && word <= 0xDFFF) { + return result(error_code::SURROGATE, pos); + } + } + return result(error_code::SUCCESS, pos); +} + +inline size_t utf8_length_from_utf32(const char32_t *buf, size_t len) { + // We are not BOM aware. + const uint32_t *p = reinterpret_cast(buf); + size_t counter{0}; + for (size_t i = 0; i < len; i++) { + // credit: @ttsugriy for the vectorizable approach + counter++; // ASCII + counter += static_cast(p[i] > 0x7F); // two-byte + counter += static_cast(p[i] > 0x7FF); // three-byte + counter += static_cast(p[i] > 0xFFFF); // four-bytes + } + return counter; +} + +inline size_t utf16_length_from_utf32(const char32_t *buf, size_t len) { + // We are not BOM aware. + const uint32_t *p = reinterpret_cast(buf); + size_t counter{0}; + for (size_t i = 0; i < len; i++) { + counter++; // non-surrogate word + counter += static_cast(p[i] > 0xFFFF); // surrogate pair + } + return counter; +} + +inline size_t latin1_length_from_utf32(size_t len) { + // We are not BOM aware. + return len; // a utf32 codepoint will always represent 1 latin1 character +} + +inline simdutf_warn_unused uint32_t swap_bytes(const uint32_t word) { + return ((word >> 24) & 0xff) | // move byte 3 to byte 0 + ((word << 8) & 0xff0000) | // move byte 1 to byte 2 + ((word >> 8) & 0xff00) | // move byte 2 to byte 1 + ((word << 24) & 0xff000000); // byte 0 to byte 3 +} + +} // namespace utf32 +} // unnamed namespace +} // namespace scalar +} // namespace simdutf + +#endif +/* end file src/scalar/utf32.h */ +/* begin file src/scalar/base64.h */ +#ifndef SIMDUTF_BASE64_H +#define SIMDUTF_BASE64_H + +#include +#include +#include +#include + +namespace simdutf { +namespace scalar { +namespace { +namespace base64 { + +// This function is not expected to be fast. Do not use in long loops. +template bool is_ascii_white_space(char_type c) { + return c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == '\f'; +} + +template bool is_ascii_white_space_or_padding(char_type c) { + return c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == '\f' || + c == '='; +} + +template bool is_eight_byte(char_type c) { + if (sizeof(char_type) == 1) { + return true; + } + return uint8_t(c) == c; +} + +// Returns true upon success. The destination buffer must be large enough. +// This functions assumes that the padding (=) has been removed. +template +full_result +base64_tail_decode(char *dst, const char_type *src, size_t length, + size_t padded_characters, // number of padding characters + // '=', typically 0, 1, 2. + base64_options options, + last_chunk_handling_options last_chunk_options) { + // This looks like 5 branches, but we expect the compiler to resolve this to a + // single branch: + const uint8_t *to_base64 = (options & base64_url) + ? tables::base64::to_base64_url_value + : tables::base64::to_base64_value; + const uint32_t *d0 = (options & base64_url) + ? tables::base64::base64_url::d0 + : tables::base64::base64_default::d0; + const uint32_t *d1 = (options & base64_url) + ? tables::base64::base64_url::d1 + : tables::base64::base64_default::d1; + const uint32_t *d2 = (options & base64_url) + ? tables::base64::base64_url::d2 + : tables::base64::base64_default::d2; + const uint32_t *d3 = (options & base64_url) + ? tables::base64::base64_url::d3 + : tables::base64::base64_default::d3; + + const char_type *srcend = src + length; + const char_type *srcinit = src; + const char *dstinit = dst; + const bool ignore_garbage = + (options == base64_options::base64_url_accept_garbage) || + (options == base64_options::base64_default_accept_garbage); + + uint32_t x; + size_t idx; + uint8_t buffer[4]; + while (true) { + while (src + 4 <= srcend && is_eight_byte(src[0]) && + is_eight_byte(src[1]) && is_eight_byte(src[2]) && + is_eight_byte(src[3]) && + (x = d0[uint8_t(src[0])] | d1[uint8_t(src[1])] | + d2[uint8_t(src[2])] | d3[uint8_t(src[3])]) < 0x01FFFFFF) { + if (match_system(endianness::BIG)) { + x = scalar::utf32::swap_bytes(x); + } + std::memcpy(dst, &x, 3); // optimization opportunity: copy 4 bytes + dst += 3; + src += 4; + } + idx = 0; + // we need at least four characters. +#ifdef __clang__ + // If possible, we read four characters at a time. (It is an optimization.) + if (ignore_garbage && src + 4 <= srcend) { + char_type c0 = src[0]; + char_type c1 = src[1]; + char_type c2 = src[2]; + char_type c3 = src[3]; + uint8_t code0 = to_base64[uint8_t(c0)]; + uint8_t code1 = to_base64[uint8_t(c1)]; + uint8_t code2 = to_base64[uint8_t(c2)]; + uint8_t code3 = to_base64[uint8_t(c3)]; + buffer[idx] = code0; + idx += (is_eight_byte(c0) && code0 <= 63); + buffer[idx] = code1; + idx += (is_eight_byte(c1) && code1 <= 63); + buffer[idx] = code2; + idx += (is_eight_byte(c2) && code2 <= 63); + buffer[idx] = code3; + idx += (is_eight_byte(c3) && code3 <= 63); + src += 4; + } +#endif + while ((idx < 4) && (src < srcend)) { + char_type c = *src; + uint8_t code = to_base64[uint8_t(c)]; + buffer[idx] = uint8_t(code); + if (is_eight_byte(c) && code <= 63) { + idx++; + } else if (!ignore_garbage && + (code > 64 || !scalar::base64::is_eight_byte(c))) { + return {INVALID_BASE64_CHARACTER, size_t(src - srcinit), + size_t(dst - dstinit)}; + } else { + // We have a space or a newline or garbage. We ignore it. + } + src++; + } + if (idx != 4) { + if (!ignore_garbage && + last_chunk_options == last_chunk_handling_options::strict && + (idx != 1) && ((idx + padded_characters) & 3) != 0) { + // The partial chunk was at src - idx + return {BASE64_INPUT_REMAINDER, size_t(src - srcinit), + size_t(dst - dstinit)}; + } else if (!ignore_garbage && + last_chunk_options == + last_chunk_handling_options::stop_before_partial && + (idx != 1) && ((idx + padded_characters) & 3) != 0) { + // Rewind src to before partial chunk + src -= idx; + return {SUCCESS, size_t(src - srcinit), size_t(dst - dstinit)}; + } else { + if (idx == 2) { + uint32_t triple = + (uint32_t(buffer[0]) << 3 * 6) + (uint32_t(buffer[1]) << 2 * 6); + if (!ignore_garbage && + (last_chunk_options == last_chunk_handling_options::strict) && + (triple & 0xffff)) { + return {BASE64_EXTRA_BITS, size_t(src - srcinit), + size_t(dst - dstinit)}; + } + if (match_system(endianness::BIG)) { + triple <<= 8; + std::memcpy(dst, &triple, 1); + } else { + triple = scalar::utf32::swap_bytes(triple); + triple >>= 8; + std::memcpy(dst, &triple, 1); + } + dst += 1; + } else if (idx == 3) { + uint32_t triple = (uint32_t(buffer[0]) << 3 * 6) + + (uint32_t(buffer[1]) << 2 * 6) + + (uint32_t(buffer[2]) << 1 * 6); + if (!ignore_garbage && + (last_chunk_options == last_chunk_handling_options::strict) && + (triple & 0xff)) { + return {BASE64_EXTRA_BITS, size_t(src - srcinit), + size_t(dst - dstinit)}; + } + if (match_system(endianness::BIG)) { + triple <<= 8; + std::memcpy(dst, &triple, 2); + } else { + triple = scalar::utf32::swap_bytes(triple); + triple >>= 8; + std::memcpy(dst, &triple, 2); + } + dst += 2; + } else if (!ignore_garbage && idx == 1) { + return {BASE64_INPUT_REMAINDER, size_t(src - srcinit), + size_t(dst - dstinit)}; + } + return {SUCCESS, size_t(src - srcinit), size_t(dst - dstinit)}; + } + } + + uint32_t triple = + (uint32_t(buffer[0]) << 3 * 6) + (uint32_t(buffer[1]) << 2 * 6) + + (uint32_t(buffer[2]) << 1 * 6) + (uint32_t(buffer[3]) << 0 * 6); + if (match_system(endianness::BIG)) { + triple <<= 8; + std::memcpy(dst, &triple, 3); + } else { + triple = scalar::utf32::swap_bytes(triple); + triple >>= 8; + std::memcpy(dst, &triple, 3); + } + dst += 3; + } +} + +// like base64_tail_decode, but it will not write past the end of the output +// buffer. The outlen paramter is modified to reflect the number of bytes +// written. This functions assumes that the padding (=) has been removed. +template +result base64_tail_decode_safe( + char *dst, size_t &outlen, const char_type *&srcr, size_t length, + size_t padded_characters, // number of padding characters '=', typically 0, + // 1, 2. + base64_options options, last_chunk_handling_options last_chunk_options) { + const char_type *src = srcr; + if (length == 0) { + outlen = 0; + return {SUCCESS, 0}; + } + // This looks like 5 branches, but we expect the compiler to resolve this to a + // single branch: + const uint8_t *to_base64 = (options & base64_url) + ? tables::base64::to_base64_url_value + : tables::base64::to_base64_value; + const uint32_t *d0 = (options & base64_url) + ? tables::base64::base64_url::d0 + : tables::base64::base64_default::d0; + const uint32_t *d1 = (options & base64_url) + ? tables::base64::base64_url::d1 + : tables::base64::base64_default::d1; + const uint32_t *d2 = (options & base64_url) + ? tables::base64::base64_url::d2 + : tables::base64::base64_default::d2; + const uint32_t *d3 = (options & base64_url) + ? tables::base64::base64_url::d3 + : tables::base64::base64_default::d3; + const bool ignore_garbage = + (options == base64_options::base64_url_accept_garbage) || + (options == base64_options::base64_default_accept_garbage); + + const char_type *srcend = src + length; + const char_type *srcinit = src; + const char *dstinit = dst; + const char *dstend = dst + outlen; + + uint32_t x; + size_t idx; + uint8_t buffer[4]; + while (true) { + while (src + 4 <= srcend && is_eight_byte(src[0]) && + is_eight_byte(src[1]) && is_eight_byte(src[2]) && + is_eight_byte(src[3]) && + (x = d0[uint8_t(src[0])] | d1[uint8_t(src[1])] | + d2[uint8_t(src[2])] | d3[uint8_t(src[3])]) < 0x01FFFFFF) { + if (dstend - dst < 3) { + outlen = size_t(dst - dstinit); + srcr = src; + return {OUTPUT_BUFFER_TOO_SMALL, size_t(src - srcinit)}; + } + if (match_system(endianness::BIG)) { + x = scalar::utf32::swap_bytes(x); + } + std::memcpy(dst, &x, 3); // optimization opportunity: copy 4 bytes + dst += 3; + src += 4; + } + idx = 0; + const char_type *srccur = src; + // We need at least four characters. +#ifdef __clang__ + // If possible, we read four characters at a time. (It is an optimization.) + if (ignore_garbage && src + 4 <= srcend) { + char_type c0 = src[0]; + char_type c1 = src[1]; + char_type c2 = src[2]; + char_type c3 = src[3]; + uint8_t code0 = to_base64[uint8_t(c0)]; + uint8_t code1 = to_base64[uint8_t(c1)]; + uint8_t code2 = to_base64[uint8_t(c2)]; + uint8_t code3 = to_base64[uint8_t(c3)]; + buffer[idx] = code0; + idx += (is_eight_byte(c0) && code0 <= 63); + buffer[idx] = code1; + idx += (is_eight_byte(c1) && code1 <= 63); + buffer[idx] = code2; + idx += (is_eight_byte(c2) && code2 <= 63); + buffer[idx] = code3; + idx += (is_eight_byte(c3) && code3 <= 63); + src += 4; + } +#endif + while (idx < 4 && src < srcend) { + char_type c = *src; + uint8_t code = to_base64[uint8_t(c)]; + + buffer[idx] = uint8_t(code); + if (is_eight_byte(c) && code <= 63) { + idx++; + } else if (!ignore_garbage && + (code > 64 || !scalar::base64::is_eight_byte(c))) { + outlen = size_t(dst - dstinit); + srcr = src; + return {INVALID_BASE64_CHARACTER, size_t(src - srcinit)}; + } else { + // We have a space or a newline or garbage. We ignore it. + } + src++; + } + if (idx != 4) { + if (!ignore_garbage && + last_chunk_options == last_chunk_handling_options::strict && + ((idx + padded_characters) & 3) != 0) { + outlen = size_t(dst - dstinit); + srcr = src; + return {BASE64_INPUT_REMAINDER, size_t(src - srcinit)}; + } else if (!ignore_garbage && + last_chunk_options == + last_chunk_handling_options::stop_before_partial && + ((idx + padded_characters) & 3) != 0) { + // Rewind src to before partial chunk + srcr = srccur; + outlen = size_t(dst - dstinit); + return {SUCCESS, size_t(dst - dstinit)}; + } else { // loose mode + if (idx == 0) { + // No data left; return success + outlen = size_t(dst - dstinit); + srcr = src; + return {SUCCESS, size_t(dst - dstinit)}; + } else if (!ignore_garbage && idx == 1) { + // Error: Incomplete chunk of length 1 is invalid in loose mode + outlen = size_t(dst - dstinit); + srcr = src; + return {BASE64_INPUT_REMAINDER, size_t(src - srcinit)}; + } else if (idx == 2 || idx == 3) { + // Check if there's enough space in the destination buffer + size_t required_space = (idx == 2) ? 1 : 2; + if (size_t(dstend - dst) < required_space) { + outlen = size_t(dst - dstinit); + srcr = src; + return {OUTPUT_BUFFER_TOO_SMALL, size_t(srccur - srcinit)}; + } + uint32_t triple = 0; + if (idx == 2) { + triple = (uint32_t(buffer[0]) << 18) + (uint32_t(buffer[1]) << 12); + if (!ignore_garbage && + (last_chunk_options == last_chunk_handling_options::strict) && + (triple & 0xffff)) { + srcr = src; + return {BASE64_EXTRA_BITS, size_t(src - srcinit)}; + } + // Extract the first byte + triple >>= 16; + dst[0] = static_cast(triple & 0xFF); + dst += 1; + } else if (idx == 3) { + triple = (uint32_t(buffer[0]) << 18) + (uint32_t(buffer[1]) << 12) + + (uint32_t(buffer[2]) << 6); + if (!ignore_garbage && + (last_chunk_options == last_chunk_handling_options::strict) && + (triple & 0xff)) { + srcr = src; + return {BASE64_EXTRA_BITS, size_t(src - srcinit)}; + } + // Extract the first two bytes + triple >>= 8; + dst[0] = static_cast((triple >> 8) & 0xFF); + dst[1] = static_cast(triple & 0xFF); + dst += 2; + } + outlen = size_t(dst - dstinit); + srcr = src; + return {SUCCESS, size_t(dst - dstinit)}; + } + } + } + + if (dstend - dst < 3) { + outlen = size_t(dst - dstinit); + srcr = src; + return {OUTPUT_BUFFER_TOO_SMALL, size_t(srccur - srcinit)}; + } + uint32_t triple = (uint32_t(buffer[0]) << 18) + + (uint32_t(buffer[1]) << 12) + (uint32_t(buffer[2]) << 6) + + (uint32_t(buffer[3])); + if (match_system(endianness::BIG)) { + triple <<= 8; + std::memcpy(dst, &triple, 3); + } else { + triple = scalar::utf32::swap_bytes(triple); + triple >>= 8; + std::memcpy(dst, &triple, 3); + } + dst += 3; + } +} + +// Returns the number of bytes written. The destination buffer must be large +// enough. It will add padding (=) if needed. +size_t tail_encode_base64(char *dst, const char *src, size_t srclen, + base64_options options) { + // By default, we use padding if we are not using the URL variant. + // This is check with ((options & base64_url) == 0) which returns true if we + // are not using the URL variant. However, we also allow 'inversion' of the + // convention with the base64_reverse_padding option. If the + // base64_reverse_padding option is set, we use padding if we are using the + // URL variant, and we omit it if we are not using the URL variant. This is + // checked with + // ((options & base64_reverse_padding) == base64_reverse_padding). + bool use_padding = + ((options & base64_url) == 0) ^ + ((options & base64_reverse_padding) == base64_reverse_padding); + // This looks like 3 branches, but we expect the compiler to resolve this to + // a single branch: + const char *e0 = (options & base64_url) ? tables::base64::base64_url::e0 + : tables::base64::base64_default::e0; + const char *e1 = (options & base64_url) ? tables::base64::base64_url::e1 + : tables::base64::base64_default::e1; + const char *e2 = (options & base64_url) ? tables::base64::base64_url::e2 + : tables::base64::base64_default::e2; + char *out = dst; + size_t i = 0; + uint8_t t1, t2, t3; + for (; i + 2 < srclen; i += 3) { + t1 = uint8_t(src[i]); + t2 = uint8_t(src[i + 1]); + t3 = uint8_t(src[i + 2]); + *out++ = e0[t1]; + *out++ = e1[((t1 & 0x03) << 4) | ((t2 >> 4) & 0x0F)]; + *out++ = e1[((t2 & 0x0F) << 2) | ((t3 >> 6) & 0x03)]; + *out++ = e2[t3]; + } + switch (srclen - i) { + case 0: + break; + case 1: + t1 = uint8_t(src[i]); + *out++ = e0[t1]; + *out++ = e1[(t1 & 0x03) << 4]; + if (use_padding) { + *out++ = '='; + *out++ = '='; + } + break; + default: /* case 2 */ + t1 = uint8_t(src[i]); + t2 = uint8_t(src[i + 1]); + *out++ = e0[t1]; + *out++ = e1[((t1 & 0x03) << 4) | ((t2 >> 4) & 0x0F)]; + *out++ = e2[(t2 & 0x0F) << 2]; + if (use_padding) { + *out++ = '='; + } + } + return (size_t)(out - dst); +} + +template +simdutf_warn_unused size_t maximal_binary_length_from_base64( + const char_type *input, size_t length) noexcept { + // We follow https://infra.spec.whatwg.org/#forgiving-base64-decode + size_t padding = 0; + if (length > 0) { + if (input[length - 1] == '=') { + padding++; + if (length > 1 && input[length - 2] == '=') { + padding++; + } + } + } + size_t actual_length = length - padding; + if (actual_length % 4 <= 1) { + return actual_length / 4 * 3; + } + // if we have a valid input, then the remainder must be 2 or 3 adding one or + // two extra bytes. + return actual_length / 4 * 3 + (actual_length % 4) - 1; +} + +simdutf_warn_unused size_t +base64_length_from_binary(size_t length, base64_options options) noexcept { + // By default, we use padding if we are not using the URL variant. + // This is check with ((options & base64_url) == 0) which returns true if we + // are not using the URL variant. However, we also allow 'inversion' of the + // convention with the base64_reverse_padding option. If the + // base64_reverse_padding option is set, we use padding if we are using the + // URL variant, and we omit it if we are not using the URL variant. This is + // checked with + // ((options & base64_reverse_padding) == base64_reverse_padding). + bool use_padding = + ((options & base64_url) == 0) ^ + ((options & base64_reverse_padding) == base64_reverse_padding); + if (!use_padding) { + return length / 3 * 4 + ((length % 3) ? (length % 3) + 1 : 0); + } + return (length + 2) / 3 * + 4; // We use padding to make the length a multiple of 4. +} + +} // namespace base64 +} // unnamed namespace +} // namespace scalar +} // namespace simdutf + +#endif +/* end file src/scalar/base64.h */ +/* begin file src/scalar/latin1_to_utf8/latin1_to_utf8.h */ +#ifndef SIMDUTF_LATIN1_TO_UTF8_H +#define SIMDUTF_LATIN1_TO_UTF8_H + +namespace simdutf { +namespace scalar { +namespace { +namespace latin1_to_utf8 { + +inline size_t convert(const char *buf, size_t len, char *utf8_output) { + const unsigned char *data = reinterpret_cast(buf); + size_t pos = 0; + size_t utf8_pos = 0; + while (pos < len) { + // try to convert the next block of 16 ASCII bytes + if (pos + 16 <= + len) { // if it is safe to read 16 more bytes, check that they are ascii + uint64_t v1; + ::memcpy(&v1, data + pos, sizeof(uint64_t)); + uint64_t v2; + ::memcpy(&v2, data + pos + sizeof(uint64_t), sizeof(uint64_t)); + uint64_t v{v1 | + v2}; // We are only interested in these bits: 1000 1000 1000 + // 1000, so it makes sense to concatenate everything + if ((v & 0x8080808080808080) == + 0) { // if NONE of these are set, e.g. all of them are zero, then + // everything is ASCII + size_t final_pos = pos + 16; + while (pos < final_pos) { + utf8_output[utf8_pos++] = char(buf[pos]); + pos++; + } + continue; + } + } + + unsigned char byte = data[pos]; + if ((byte & 0x80) == 0) { // if ASCII + // will generate one UTF-8 bytes + utf8_output[utf8_pos++] = char(byte); + pos++; + } else { + // will generate two UTF-8 bytes + utf8_output[utf8_pos++] = char((byte >> 6) | 0b11000000); + utf8_output[utf8_pos++] = char((byte & 0b111111) | 0b10000000); + pos++; + } + } + return utf8_pos; +} + +inline size_t convert_safe(const char *buf, size_t len, char *utf8_output, + size_t utf8_len) { + const unsigned char *data = reinterpret_cast(buf); + size_t pos = 0; + size_t skip_pos = 0; + size_t utf8_pos = 0; + while (pos < len && utf8_pos < utf8_len) { + // try to convert the next block of 16 ASCII bytes + if (pos >= skip_pos && pos + 16 <= len && + utf8_pos + 16 <= utf8_len) { // if it is safe to read 16 more bytes, + // check that they are ascii + uint64_t v1; + ::memcpy(&v1, data + pos, sizeof(uint64_t)); + uint64_t v2; + ::memcpy(&v2, data + pos + sizeof(uint64_t), sizeof(uint64_t)); + uint64_t v{v1 | + v2}; // We are only interested in these bits: 1000 1000 1000 + // 1000, so it makes sense to concatenate everything + if ((v & 0x8080808080808080) == + 0) { // if NONE of these are set, e.g. all of them are zero, then + // everything is ASCII + ::memcpy(utf8_output + utf8_pos, buf + pos, 16); + utf8_pos += 16; + pos += 16; + } else { + // At least one of the next 16 bytes are not ASCII, we will process them + // one by one + skip_pos = pos + 16; + } + } else { + const auto byte = data[pos]; + if ((byte & 0x80) == 0) { // if ASCII + // will generate one UTF-8 bytes + utf8_output[utf8_pos++] = char(byte); + pos++; + } else if (utf8_pos + 2 <= utf8_len) { + // will generate two UTF-8 bytes + utf8_output[utf8_pos++] = char((byte >> 6) | 0b11000000); + utf8_output[utf8_pos++] = char((byte & 0b111111) | 0b10000000); + pos++; + } else { + break; + } + } + } + return utf8_pos; +} + +} // namespace latin1_to_utf8 +} // unnamed namespace +} // namespace scalar +} // namespace simdutf + +#endif +/* end file src/scalar/latin1_to_utf8/latin1_to_utf8.h */ + +namespace simdutf { +bool implementation::supported_by_runtime_system() const { + uint32_t required_instruction_sets = this->required_instruction_sets(); + uint32_t supported_instruction_sets = + internal::detect_supported_architectures(); + return ((supported_instruction_sets & required_instruction_sets) == + required_instruction_sets); +} + +simdutf_warn_unused encoding_type implementation::autodetect_encoding( + const char *input, size_t length) const noexcept { + // If there is a BOM, then we trust it. + auto bom_encoding = simdutf::BOM::check_bom(input, length); + if (bom_encoding != encoding_type::unspecified) { + return bom_encoding; + } + // UTF8 is common, it includes ASCII, and is commonly represented + // without a BOM, so if it fits, go with that. Note that it is still + // possible to get it wrong, we are only 'guessing'. If some has UTF-16 + // data without a BOM, it could pass as UTF-8. + // + // An interesting twist might be to check for UTF-16 ASCII first (every + // other byte is zero). + if (validate_utf8(input, length)) { + return encoding_type::UTF8; + } + // The next most common encoding that might appear without BOM is probably + // UTF-16LE, so try that next. + if ((length % 2) == 0) { + // important: we need to divide by two + if (validate_utf16le(reinterpret_cast(input), + length / 2)) { + return encoding_type::UTF16_LE; + } + } + if ((length % 4) == 0) { + if (validate_utf32(reinterpret_cast(input), length / 4)) { + return encoding_type::UTF32_LE; + } + } + return encoding_type::unspecified; +} + +namespace internal { +// When there is a single implementation, we should not pay a price +// for dispatching to the best implementation. We should just use the +// one we have. This is a compile-time check. +#define SIMDUTF_SINGLE_IMPLEMENTATION \ + (SIMDUTF_IMPLEMENTATION_ICELAKE + SIMDUTF_IMPLEMENTATION_HASWELL + \ + SIMDUTF_IMPLEMENTATION_WESTMERE + SIMDUTF_IMPLEMENTATION_ARM64 + \ + SIMDUTF_IMPLEMENTATION_PPC64 + SIMDUTF_IMPLEMENTATION_LSX + \ + SIMDUTF_IMPLEMENTATION_LASX + SIMDUTF_IMPLEMENTATION_FALLBACK == \ + 1) + +// Static array of known implementations. We are hoping these get baked into the +// executable without requiring a static initializer. + +#if SIMDUTF_IMPLEMENTATION_ICELAKE +static const icelake::implementation *get_icelake_singleton() { + static const icelake::implementation icelake_singleton{}; + return &icelake_singleton; +} +#endif +#if SIMDUTF_IMPLEMENTATION_HASWELL +static const haswell::implementation *get_haswell_singleton() { + static const haswell::implementation haswell_singleton{}; + return &haswell_singleton; +} +#endif +#if SIMDUTF_IMPLEMENTATION_WESTMERE +static const westmere::implementation *get_westmere_singleton() { + static const westmere::implementation westmere_singleton{}; + return &westmere_singleton; +} +#endif +#if SIMDUTF_IMPLEMENTATION_ARM64 +static const arm64::implementation *get_arm64_singleton() { + static const arm64::implementation arm64_singleton{}; + return &arm64_singleton; +} +#endif +#if SIMDUTF_IMPLEMENTATION_PPC64 +static const ppc64::implementation *get_ppc64_singleton() { + static const ppc64::implementation ppc64_singleton{}; + return &ppc64_singleton; +} +#endif +#if SIMDUTF_IMPLEMENTATION_RVV +static const rvv::implementation *get_rvv_singleton() { + static const rvv::implementation rvv_singleton{}; + return &rvv_singleton; +} +#endif +#if SIMDUTF_IMPLEMENTATION_LSX +static const lsx::implementation *get_lsx_singleton() { + static const lsx::implementation lsx_singleton{}; + return &lsx_singleton; +} +#endif +#if SIMDUTF_IMPLEMENTATION_LASX +static const lasx::implementation *get_lasx_singleton() { + static const lasx::implementation lasx_singleton{}; + return &lasx_singleton; +} +#endif +#if SIMDUTF_IMPLEMENTATION_FALLBACK +static const fallback::implementation *get_fallback_singleton() { + static const fallback::implementation fallback_singleton{}; + return &fallback_singleton; +} +#endif + +#if SIMDUTF_SINGLE_IMPLEMENTATION +static const implementation *get_single_implementation() { + return + #if SIMDUTF_IMPLEMENTATION_ICELAKE + get_icelake_singleton(); + #endif + #if SIMDUTF_IMPLEMENTATION_HASWELL + get_haswell_singleton(); + #endif + #if SIMDUTF_IMPLEMENTATION_WESTMERE + get_westmere_singleton(); + #endif + #if SIMDUTF_IMPLEMENTATION_ARM64 + get_arm64_singleton(); + #endif + #if SIMDUTF_IMPLEMENTATION_PPC64 + get_ppc64_singleton(); + #endif + #if SIMDUTF_IMPLEMENTATION_LSX + get_lsx_singleton(); + #endif + #if SIMDUTF_IMPLEMENTATION_LASX + get_lasx_singleton(); + #endif + #if SIMDUTF_IMPLEMENTATION_FALLBACK + get_fallback_singleton(); + #endif +} +#endif + +/** + * @private Detects best supported implementation on first use, and sets it + */ +class detect_best_supported_implementation_on_first_use final + : public implementation { +public: + std::string name() const noexcept final { return set_best()->name(); } + std::string description() const noexcept final { + return set_best()->description(); + } + uint32_t required_instruction_sets() const noexcept final { + return set_best()->required_instruction_sets(); + } + + simdutf_warn_unused int + detect_encodings(const char *input, size_t length) const noexcept override { + return set_best()->detect_encodings(input, length); + } + + simdutf_warn_unused bool + validate_utf8(const char *buf, size_t len) const noexcept final override { + return set_best()->validate_utf8(buf, len); + } + + simdutf_warn_unused result validate_utf8_with_errors( + const char *buf, size_t len) const noexcept final override { + return set_best()->validate_utf8_with_errors(buf, len); + } + + simdutf_warn_unused bool + validate_ascii(const char *buf, size_t len) const noexcept final override { + return set_best()->validate_ascii(buf, len); + } + + simdutf_warn_unused result validate_ascii_with_errors( + const char *buf, size_t len) const noexcept final override { + return set_best()->validate_ascii_with_errors(buf, len); + } + + simdutf_warn_unused bool + validate_utf16le(const char16_t *buf, + size_t len) const noexcept final override { + return set_best()->validate_utf16le(buf, len); + } + + simdutf_warn_unused bool + validate_utf16be(const char16_t *buf, + size_t len) const noexcept final override { + return set_best()->validate_utf16be(buf, len); + } + + simdutf_warn_unused result validate_utf16le_with_errors( + const char16_t *buf, size_t len) const noexcept final override { + return set_best()->validate_utf16le_with_errors(buf, len); + } + + simdutf_warn_unused result validate_utf16be_with_errors( + const char16_t *buf, size_t len) const noexcept final override { + return set_best()->validate_utf16be_with_errors(buf, len); + } + + simdutf_warn_unused bool + validate_utf32(const char32_t *buf, + size_t len) const noexcept final override { + return set_best()->validate_utf32(buf, len); + } + + simdutf_warn_unused result validate_utf32_with_errors( + const char32_t *buf, size_t len) const noexcept final override { + return set_best()->validate_utf32_with_errors(buf, len); + } + + simdutf_warn_unused size_t + convert_latin1_to_utf8(const char *buf, size_t len, + char *utf8_output) const noexcept final override { + return set_best()->convert_latin1_to_utf8(buf, len, utf8_output); + } + + simdutf_warn_unused size_t convert_latin1_to_utf16le( + const char *buf, size_t len, + char16_t *utf16_output) const noexcept final override { + return set_best()->convert_latin1_to_utf16le(buf, len, utf16_output); + } + + simdutf_warn_unused size_t convert_latin1_to_utf16be( + const char *buf, size_t len, + char16_t *utf16_output) const noexcept final override { + return set_best()->convert_latin1_to_utf16be(buf, len, utf16_output); + } + + simdutf_warn_unused size_t convert_latin1_to_utf32( + const char *buf, size_t len, + char32_t *latin1_output) const noexcept final override { + return set_best()->convert_latin1_to_utf32(buf, len, latin1_output); + } + + simdutf_warn_unused size_t + convert_utf8_to_latin1(const char *buf, size_t len, + char *latin1_output) const noexcept final override { + return set_best()->convert_utf8_to_latin1(buf, len, latin1_output); + } + + simdutf_warn_unused result convert_utf8_to_latin1_with_errors( + const char *buf, size_t len, + char *latin1_output) const noexcept final override { + return set_best()->convert_utf8_to_latin1_with_errors(buf, len, + latin1_output); + } + + simdutf_warn_unused size_t convert_valid_utf8_to_latin1( + const char *buf, size_t len, + char *latin1_output) const noexcept final override { + return set_best()->convert_valid_utf8_to_latin1(buf, len, latin1_output); + } + + simdutf_warn_unused size_t convert_utf8_to_utf16le( + const char *buf, size_t len, + char16_t *utf16_output) const noexcept final override { + return set_best()->convert_utf8_to_utf16le(buf, len, utf16_output); + } + + simdutf_warn_unused size_t convert_utf8_to_utf16be( + const char *buf, size_t len, + char16_t *utf16_output) const noexcept final override { + return set_best()->convert_utf8_to_utf16be(buf, len, utf16_output); + } + + simdutf_warn_unused result convert_utf8_to_utf16le_with_errors( + const char *buf, size_t len, + char16_t *utf16_output) const noexcept final override { + return set_best()->convert_utf8_to_utf16le_with_errors(buf, len, + utf16_output); + } + + simdutf_warn_unused result convert_utf8_to_utf16be_with_errors( + const char *buf, size_t len, + char16_t *utf16_output) const noexcept final override { + return set_best()->convert_utf8_to_utf16be_with_errors(buf, len, + utf16_output); + } + + simdutf_warn_unused size_t convert_valid_utf8_to_utf16le( + const char *buf, size_t len, + char16_t *utf16_output) const noexcept final override { + return set_best()->convert_valid_utf8_to_utf16le(buf, len, utf16_output); + } + + simdutf_warn_unused size_t convert_valid_utf8_to_utf16be( + const char *buf, size_t len, + char16_t *utf16_output) const noexcept final override { + return set_best()->convert_valid_utf8_to_utf16be(buf, len, utf16_output); + } + + simdutf_warn_unused size_t + convert_utf8_to_utf32(const char *buf, size_t len, + char32_t *utf32_output) const noexcept final override { + return set_best()->convert_utf8_to_utf32(buf, len, utf32_output); + } + + simdutf_warn_unused result convert_utf8_to_utf32_with_errors( + const char *buf, size_t len, + char32_t *utf32_output) const noexcept final override { + return set_best()->convert_utf8_to_utf32_with_errors(buf, len, + utf32_output); + } + + simdutf_warn_unused size_t convert_valid_utf8_to_utf32( + const char *buf, size_t len, + char32_t *utf32_output) const noexcept final override { + return set_best()->convert_valid_utf8_to_utf32(buf, len, utf32_output); + } + + simdutf_warn_unused size_t + convert_utf16le_to_latin1(const char16_t *buf, size_t len, + char *latin1_output) const noexcept final override { + return set_best()->convert_utf16le_to_latin1(buf, len, latin1_output); + } + + simdutf_warn_unused size_t + convert_utf16be_to_latin1(const char16_t *buf, size_t len, + char *latin1_output) const noexcept final override { + return set_best()->convert_utf16be_to_latin1(buf, len, latin1_output); + } + + simdutf_warn_unused result convert_utf16le_to_latin1_with_errors( + const char16_t *buf, size_t len, + char *latin1_output) const noexcept final override { + return set_best()->convert_utf16le_to_latin1_with_errors(buf, len, + latin1_output); + } + + simdutf_warn_unused result convert_utf16be_to_latin1_with_errors( + const char16_t *buf, size_t len, + char *latin1_output) const noexcept final override { + return set_best()->convert_utf16be_to_latin1_with_errors(buf, len, + latin1_output); + } + + simdutf_warn_unused size_t convert_valid_utf16le_to_latin1( + const char16_t *buf, size_t len, + char *latin1_output) const noexcept final override { + return set_best()->convert_valid_utf16le_to_latin1(buf, len, latin1_output); + } + + simdutf_warn_unused size_t convert_valid_utf16be_to_latin1( + const char16_t *buf, size_t len, + char *latin1_output) const noexcept final override { + return set_best()->convert_valid_utf16be_to_latin1(buf, len, latin1_output); + } + + simdutf_warn_unused size_t + convert_utf16le_to_utf8(const char16_t *buf, size_t len, + char *utf8_output) const noexcept final override { + return set_best()->convert_utf16le_to_utf8(buf, len, utf8_output); + } + + simdutf_warn_unused size_t + convert_utf16be_to_utf8(const char16_t *buf, size_t len, + char *utf8_output) const noexcept final override { + return set_best()->convert_utf16be_to_utf8(buf, len, utf8_output); + } + + simdutf_warn_unused result convert_utf16le_to_utf8_with_errors( + const char16_t *buf, size_t len, + char *utf8_output) const noexcept final override { + return set_best()->convert_utf16le_to_utf8_with_errors(buf, len, + utf8_output); + } + + simdutf_warn_unused result convert_utf16be_to_utf8_with_errors( + const char16_t *buf, size_t len, + char *utf8_output) const noexcept final override { + return set_best()->convert_utf16be_to_utf8_with_errors(buf, len, + utf8_output); + } + + simdutf_warn_unused size_t convert_valid_utf16le_to_utf8( + const char16_t *buf, size_t len, + char *utf8_output) const noexcept final override { + return set_best()->convert_valid_utf16le_to_utf8(buf, len, utf8_output); + } + + simdutf_warn_unused size_t convert_valid_utf16be_to_utf8( + const char16_t *buf, size_t len, + char *utf8_output) const noexcept final override { + return set_best()->convert_valid_utf16be_to_utf8(buf, len, utf8_output); + } + + simdutf_warn_unused size_t + convert_utf32_to_latin1(const char32_t *buf, size_t len, + char *latin1_output) const noexcept final override { + return set_best()->convert_utf32_to_latin1(buf, len, latin1_output); + } + + simdutf_warn_unused result convert_utf32_to_latin1_with_errors( + const char32_t *buf, size_t len, + char *latin1_output) const noexcept final override { + return set_best()->convert_utf32_to_latin1_with_errors(buf, len, + latin1_output); + } + + simdutf_warn_unused size_t convert_valid_utf32_to_latin1( + const char32_t *buf, size_t len, + char *latin1_output) const noexcept final override { + return set_best()->convert_utf32_to_latin1(buf, len, latin1_output); + } + + simdutf_warn_unused size_t + convert_utf32_to_utf8(const char32_t *buf, size_t len, + char *utf8_output) const noexcept final override { + return set_best()->convert_utf32_to_utf8(buf, len, utf8_output); + } + + simdutf_warn_unused result convert_utf32_to_utf8_with_errors( + const char32_t *buf, size_t len, + char *utf8_output) const noexcept final override { + return set_best()->convert_utf32_to_utf8_with_errors(buf, len, utf8_output); + } + + simdutf_warn_unused size_t + convert_valid_utf32_to_utf8(const char32_t *buf, size_t len, + char *utf8_output) const noexcept final override { + return set_best()->convert_valid_utf32_to_utf8(buf, len, utf8_output); + } + + simdutf_warn_unused size_t convert_utf32_to_utf16le( + const char32_t *buf, size_t len, + char16_t *utf16_output) const noexcept final override { + return set_best()->convert_utf32_to_utf16le(buf, len, utf16_output); + } + + simdutf_warn_unused size_t convert_utf32_to_utf16be( + const char32_t *buf, size_t len, + char16_t *utf16_output) const noexcept final override { + return set_best()->convert_utf32_to_utf16be(buf, len, utf16_output); + } + + simdutf_warn_unused result convert_utf32_to_utf16le_with_errors( + const char32_t *buf, size_t len, + char16_t *utf16_output) const noexcept final override { + return set_best()->convert_utf32_to_utf16le_with_errors(buf, len, + utf16_output); + } + + simdutf_warn_unused result convert_utf32_to_utf16be_with_errors( + const char32_t *buf, size_t len, + char16_t *utf16_output) const noexcept final override { + return set_best()->convert_utf32_to_utf16be_with_errors(buf, len, + utf16_output); + } + + simdutf_warn_unused size_t convert_valid_utf32_to_utf16le( + const char32_t *buf, size_t len, + char16_t *utf16_output) const noexcept final override { + return set_best()->convert_valid_utf32_to_utf16le(buf, len, utf16_output); + } + + simdutf_warn_unused size_t convert_valid_utf32_to_utf16be( + const char32_t *buf, size_t len, + char16_t *utf16_output) const noexcept final override { + return set_best()->convert_valid_utf32_to_utf16be(buf, len, utf16_output); + } + + simdutf_warn_unused size_t convert_utf16le_to_utf32( + const char16_t *buf, size_t len, + char32_t *utf32_output) const noexcept final override { + return set_best()->convert_utf16le_to_utf32(buf, len, utf32_output); + } + + simdutf_warn_unused size_t convert_utf16be_to_utf32( + const char16_t *buf, size_t len, + char32_t *utf32_output) const noexcept final override { + return set_best()->convert_utf16be_to_utf32(buf, len, utf32_output); + } + + simdutf_warn_unused result convert_utf16le_to_utf32_with_errors( + const char16_t *buf, size_t len, + char32_t *utf32_output) const noexcept final override { + return set_best()->convert_utf16le_to_utf32_with_errors(buf, len, + utf32_output); + } + + simdutf_warn_unused result convert_utf16be_to_utf32_with_errors( + const char16_t *buf, size_t len, + char32_t *utf32_output) const noexcept final override { + return set_best()->convert_utf16be_to_utf32_with_errors(buf, len, + utf32_output); + } + + simdutf_warn_unused size_t convert_valid_utf16le_to_utf32( + const char16_t *buf, size_t len, + char32_t *utf32_output) const noexcept final override { + return set_best()->convert_valid_utf16le_to_utf32(buf, len, utf32_output); + } + + simdutf_warn_unused size_t convert_valid_utf16be_to_utf32( + const char16_t *buf, size_t len, + char32_t *utf32_output) const noexcept final override { + return set_best()->convert_valid_utf16be_to_utf32(buf, len, utf32_output); + } + + void change_endianness_utf16(const char16_t *buf, size_t len, + char16_t *output) const noexcept final override { + set_best()->change_endianness_utf16(buf, len, output); + } + + simdutf_warn_unused size_t + count_utf16le(const char16_t *buf, size_t len) const noexcept final override { + return set_best()->count_utf16le(buf, len); + } + + simdutf_warn_unused size_t + count_utf16be(const char16_t *buf, size_t len) const noexcept final override { + return set_best()->count_utf16be(buf, len); + } + + simdutf_warn_unused size_t + count_utf8(const char *buf, size_t len) const noexcept final override { + return set_best()->count_utf8(buf, len); + } + + simdutf_warn_unused size_t + latin1_length_from_utf8(const char *buf, size_t len) const noexcept override { + return set_best()->latin1_length_from_utf8(buf, len); + } + + simdutf_warn_unused size_t + latin1_length_from_utf16(size_t len) const noexcept override { + return set_best()->latin1_length_from_utf16(len); + } + + simdutf_warn_unused size_t + latin1_length_from_utf32(size_t len) const noexcept override { + return set_best()->latin1_length_from_utf32(len); + } + + simdutf_warn_unused size_t + utf8_length_from_latin1(const char *buf, size_t len) const noexcept override { + return set_best()->utf8_length_from_latin1(buf, len); + } + + simdutf_warn_unused size_t utf8_length_from_utf16le( + const char16_t *buf, size_t len) const noexcept override { + return set_best()->utf8_length_from_utf16le(buf, len); + } + + simdutf_warn_unused size_t utf8_length_from_utf16be( + const char16_t *buf, size_t len) const noexcept override { + return set_best()->utf8_length_from_utf16be(buf, len); + } + + simdutf_warn_unused size_t + utf16_length_from_latin1(size_t len) const noexcept override { + return set_best()->utf16_length_from_latin1(len); + } + + simdutf_warn_unused size_t + utf32_length_from_latin1(size_t len) const noexcept override { + return set_best()->utf32_length_from_latin1(len); + } + + simdutf_warn_unused size_t utf32_length_from_utf16le( + const char16_t *buf, size_t len) const noexcept override { + return set_best()->utf32_length_from_utf16le(buf, len); + } + + simdutf_warn_unused size_t utf32_length_from_utf16be( + const char16_t *buf, size_t len) const noexcept override { + return set_best()->utf32_length_from_utf16be(buf, len); + } + + simdutf_warn_unused size_t + utf16_length_from_utf8(const char *buf, size_t len) const noexcept override { + return set_best()->utf16_length_from_utf8(buf, len); + } + + simdutf_warn_unused size_t utf8_length_from_utf32( + const char32_t *buf, size_t len) const noexcept override { + return set_best()->utf8_length_from_utf32(buf, len); + } + + simdutf_warn_unused size_t utf16_length_from_utf32( + const char32_t *buf, size_t len) const noexcept override { + return set_best()->utf16_length_from_utf32(buf, len); + } + + simdutf_warn_unused size_t + utf32_length_from_utf8(const char *buf, size_t len) const noexcept override { + return set_best()->utf32_length_from_utf8(buf, len); + } + + simdutf_warn_unused size_t maximal_binary_length_from_base64( + const char *input, size_t length) const noexcept override { + return set_best()->maximal_binary_length_from_base64(input, length); + } + + simdutf_warn_unused result base64_to_binary( + const char *input, size_t length, char *output, base64_options options, + last_chunk_handling_options last_chunk_handling_options = + last_chunk_handling_options::loose) const noexcept override { + return set_best()->base64_to_binary(input, length, output, options, + last_chunk_handling_options); + } + + simdutf_warn_unused full_result base64_to_binary_details( + const char *input, size_t length, char *output, base64_options options, + last_chunk_handling_options last_chunk_handling_options = + last_chunk_handling_options::loose) const noexcept override { + return set_best()->base64_to_binary_details(input, length, output, options, + last_chunk_handling_options); + } + + simdutf_warn_unused size_t maximal_binary_length_from_base64( + const char16_t *input, size_t length) const noexcept override { + return set_best()->maximal_binary_length_from_base64(input, length); + } + + simdutf_warn_unused result base64_to_binary( + const char16_t *input, size_t length, char *output, + base64_options options, + last_chunk_handling_options last_chunk_handling_options = + last_chunk_handling_options::loose) const noexcept override { + return set_best()->base64_to_binary(input, length, output, options, + last_chunk_handling_options); + } + + simdutf_warn_unused full_result base64_to_binary_details( + const char16_t *input, size_t length, char *output, + base64_options options, + last_chunk_handling_options last_chunk_handling_options = + last_chunk_handling_options::loose) const noexcept override { + return set_best()->base64_to_binary_details(input, length, output, options, + last_chunk_handling_options); + } + + simdutf_warn_unused size_t base64_length_from_binary( + size_t length, base64_options options) const noexcept override { + return set_best()->base64_length_from_binary(length, options); + } + + size_t binary_to_base64(const char *input, size_t length, char *output, + base64_options options) const noexcept override { + return set_best()->binary_to_base64(input, length, output, options); + } + + simdutf_really_inline + detect_best_supported_implementation_on_first_use() noexcept + : implementation("best_supported_detector", + "Detects the best supported implementation and sets it", + 0) {} + +private: + const implementation *set_best() const noexcept; +}; + +static_assert(std::is_trivially_destructible< + detect_best_supported_implementation_on_first_use>::value, + "detect_best_supported_implementation_on_first_use should be " + "trivially destructible"); + +static const std::initializer_list & +get_available_implementation_pointers() { + static const std::initializer_list + available_implementation_pointers{ +#if SIMDUTF_IMPLEMENTATION_ICELAKE + get_icelake_singleton(), +#endif +#if SIMDUTF_IMPLEMENTATION_HASWELL + get_haswell_singleton(), +#endif +#if SIMDUTF_IMPLEMENTATION_WESTMERE + get_westmere_singleton(), +#endif +#if SIMDUTF_IMPLEMENTATION_ARM64 + get_arm64_singleton(), +#endif +#if SIMDUTF_IMPLEMENTATION_PPC64 + get_ppc64_singleton(), +#endif +#if SIMDUTF_IMPLEMENTATION_RVV + get_rvv_singleton(), +#endif +#if SIMDUTF_IMPLEMENTATION_LSX + get_lsx_singleton(), +#endif +#if SIMDUTF_IMPLEMENTATION_LASX + get_lasx_singleton(), +#endif +#if SIMDUTF_IMPLEMENTATION_FALLBACK + get_fallback_singleton(), +#endif + }; // available_implementation_pointers + return available_implementation_pointers; +} + +// So we can return UNSUPPORTED_ARCHITECTURE from the parser when there is no +// support +class unsupported_implementation final : public implementation { +public: + simdutf_warn_unused int detect_encodings(const char *, + size_t) const noexcept override { + return encoding_type::unspecified; + } + + simdutf_warn_unused bool validate_utf8(const char *, + size_t) const noexcept final override { + return false; // Just refuse to validate. Given that we have a fallback + // implementation + // it seems unlikely that unsupported_implementation will ever be used. If + // it is used, then it will flag all strings as invalid. The alternative is + // to return an error_code from which the user has to figure out whether the + // string is valid UTF-8... which seems like a lot of work just to handle + // the very unlikely case that we have an unsupported implementation. And, + // when it does happen (that we have an unsupported implementation), what + // are the chances that the programmer has a fallback? Given that *we* + // provide the fallback, it implies that the programmer would need a + // fallback for our fallback. + } + + simdutf_warn_unused result validate_utf8_with_errors( + const char *, size_t) const noexcept final override { + return result(error_code::OTHER, 0); + } + + simdutf_warn_unused bool + validate_ascii(const char *, size_t) const noexcept final override { + return false; + } + + simdutf_warn_unused result validate_ascii_with_errors( + const char *, size_t) const noexcept final override { + return result(error_code::OTHER, 0); + } + + simdutf_warn_unused bool + validate_utf16le(const char16_t *, size_t) const noexcept final override { + return false; + } + + simdutf_warn_unused bool + validate_utf16be(const char16_t *, size_t) const noexcept final override { + return false; + } + + simdutf_warn_unused result validate_utf16le_with_errors( + const char16_t *, size_t) const noexcept final override { + return result(error_code::OTHER, 0); + } + + simdutf_warn_unused result validate_utf16be_with_errors( + const char16_t *, size_t) const noexcept final override { + return result(error_code::OTHER, 0); + } + + simdutf_warn_unused bool + validate_utf32(const char32_t *, size_t) const noexcept final override { + return false; + } + + simdutf_warn_unused result validate_utf32_with_errors( + const char32_t *, size_t) const noexcept final override { + return result(error_code::OTHER, 0); + } + + simdutf_warn_unused size_t convert_latin1_to_utf8( + const char *, size_t, char *) const noexcept final override { + return 0; + } + + simdutf_warn_unused size_t convert_latin1_to_utf16le( + const char *, size_t, char16_t *) const noexcept final override { + return 0; + } + + simdutf_warn_unused size_t convert_latin1_to_utf16be( + const char *, size_t, char16_t *) const noexcept final override { + return 0; + } + + simdutf_warn_unused size_t convert_latin1_to_utf32( + const char *, size_t, char32_t *) const noexcept final override { + return 0; + } + + simdutf_warn_unused size_t convert_utf8_to_latin1( + const char *, size_t, char *) const noexcept final override { + return 0; + } + + simdutf_warn_unused result convert_utf8_to_latin1_with_errors( + const char *, size_t, char *) const noexcept final override { + return result(error_code::OTHER, 0); + } + + simdutf_warn_unused size_t convert_valid_utf8_to_latin1( + const char *, size_t, char *) const noexcept final override { + return 0; + } + + simdutf_warn_unused size_t convert_utf8_to_utf16le( + const char *, size_t, char16_t *) const noexcept final override { + return 0; + } + + simdutf_warn_unused size_t convert_utf8_to_utf16be( + const char *, size_t, char16_t *) const noexcept final override { + return 0; + } + + simdutf_warn_unused result convert_utf8_to_utf16le_with_errors( + const char *, size_t, char16_t *) const noexcept final override { + return result(error_code::OTHER, 0); + } + + simdutf_warn_unused result convert_utf8_to_utf16be_with_errors( + const char *, size_t, char16_t *) const noexcept final override { + return result(error_code::OTHER, 0); + } + + simdutf_warn_unused size_t convert_valid_utf8_to_utf16le( + const char *, size_t, char16_t *) const noexcept final override { + return 0; + } + + simdutf_warn_unused size_t convert_valid_utf8_to_utf16be( + const char *, size_t, char16_t *) const noexcept final override { + return 0; + } + + simdutf_warn_unused size_t convert_utf8_to_utf32( + const char *, size_t, char32_t *) const noexcept final override { + return 0; + } + + simdutf_warn_unused result convert_utf8_to_utf32_with_errors( + const char *, size_t, char32_t *) const noexcept final override { + return result(error_code::OTHER, 0); + } + + simdutf_warn_unused size_t convert_valid_utf8_to_utf32( + const char *, size_t, char32_t *) const noexcept final override { + return 0; + } + + simdutf_warn_unused size_t convert_utf16le_to_latin1( + const char16_t *, size_t, char *) const noexcept final override { + return 0; + } + + simdutf_warn_unused size_t convert_utf16be_to_latin1( + const char16_t *, size_t, char *) const noexcept final override { + return 0; + } + + simdutf_warn_unused result convert_utf16le_to_latin1_with_errors( + const char16_t *, size_t, char *) const noexcept final override { + return result(error_code::OTHER, 0); + } + + simdutf_warn_unused result convert_utf16be_to_latin1_with_errors( + const char16_t *, size_t, char *) const noexcept final override { + return result(error_code::OTHER, 0); + } + + simdutf_warn_unused size_t convert_valid_utf16le_to_latin1( + const char16_t *, size_t, char *) const noexcept final override { + return 0; + } + + simdutf_warn_unused size_t convert_valid_utf16be_to_latin1( + const char16_t *, size_t, char *) const noexcept final override { + return 0; + } + + simdutf_warn_unused size_t convert_utf16le_to_utf8( + const char16_t *, size_t, char *) const noexcept final override { + return 0; + } + + simdutf_warn_unused size_t convert_utf16be_to_utf8( + const char16_t *, size_t, char *) const noexcept final override { + return 0; + } + + simdutf_warn_unused result convert_utf16le_to_utf8_with_errors( + const char16_t *, size_t, char *) const noexcept final override { + return result(error_code::OTHER, 0); + } + + simdutf_warn_unused result convert_utf16be_to_utf8_with_errors( + const char16_t *, size_t, char *) const noexcept final override { + return result(error_code::OTHER, 0); + } + + simdutf_warn_unused size_t convert_valid_utf16le_to_utf8( + const char16_t *, size_t, char *) const noexcept final override { + return 0; + } + + simdutf_warn_unused size_t convert_valid_utf16be_to_utf8( + const char16_t *, size_t, char *) const noexcept final override { + return 0; + } + + simdutf_warn_unused size_t convert_utf32_to_latin1( + const char32_t *, size_t, char *) const noexcept final override { + return 0; + } + + simdutf_warn_unused result convert_utf32_to_latin1_with_errors( + const char32_t *, size_t, char *) const noexcept final override { + return result(error_code::OTHER, 0); + } + + simdutf_warn_unused size_t convert_valid_utf32_to_latin1( + const char32_t *, size_t, char *) const noexcept final override { + return 0; + } + + simdutf_warn_unused size_t convert_utf32_to_utf8( + const char32_t *, size_t, char *) const noexcept final override { + return 0; + } + + simdutf_warn_unused result convert_utf32_to_utf8_with_errors( + const char32_t *, size_t, char *) const noexcept final override { + return result(error_code::OTHER, 0); + } + + simdutf_warn_unused size_t convert_valid_utf32_to_utf8( + const char32_t *, size_t, char *) const noexcept final override { + return 0; + } + + simdutf_warn_unused size_t convert_utf32_to_utf16le( + const char32_t *, size_t, char16_t *) const noexcept final override { + return 0; + } + + simdutf_warn_unused size_t convert_utf32_to_utf16be( + const char32_t *, size_t, char16_t *) const noexcept final override { + return 0; + } + + simdutf_warn_unused result convert_utf32_to_utf16le_with_errors( + const char32_t *, size_t, char16_t *) const noexcept final override { + return result(error_code::OTHER, 0); + } + + simdutf_warn_unused result convert_utf32_to_utf16be_with_errors( + const char32_t *, size_t, char16_t *) const noexcept final override { + return result(error_code::OTHER, 0); + } + + simdutf_warn_unused size_t convert_valid_utf32_to_utf16le( + const char32_t *, size_t, char16_t *) const noexcept final override { + return 0; + } + + simdutf_warn_unused size_t convert_valid_utf32_to_utf16be( + const char32_t *, size_t, char16_t *) const noexcept final override { + return 0; + } + + simdutf_warn_unused size_t convert_utf16le_to_utf32( + const char16_t *, size_t, char32_t *) const noexcept final override { + return 0; + } + + simdutf_warn_unused size_t convert_utf16be_to_utf32( + const char16_t *, size_t, char32_t *) const noexcept final override { + return 0; + } + + simdutf_warn_unused result convert_utf16le_to_utf32_with_errors( + const char16_t *, size_t, char32_t *) const noexcept final override { + return result(error_code::OTHER, 0); + } + + simdutf_warn_unused result convert_utf16be_to_utf32_with_errors( + const char16_t *, size_t, char32_t *) const noexcept final override { + return result(error_code::OTHER, 0); + } + + simdutf_warn_unused size_t convert_valid_utf16le_to_utf32( + const char16_t *, size_t, char32_t *) const noexcept final override { + return 0; + } + + simdutf_warn_unused size_t convert_valid_utf16be_to_utf32( + const char16_t *, size_t, char32_t *) const noexcept final override { + return 0; + } + + void change_endianness_utf16(const char16_t *, size_t, + char16_t *) const noexcept final override {} + + simdutf_warn_unused size_t + count_utf16le(const char16_t *, size_t) const noexcept final override { + return 0; + } + + simdutf_warn_unused size_t + count_utf16be(const char16_t *, size_t) const noexcept final override { + return 0; + } + + simdutf_warn_unused size_t count_utf8(const char *, + size_t) const noexcept final override { + return 0; + } + + simdutf_warn_unused size_t + latin1_length_from_utf8(const char *, size_t) const noexcept override { + return 0; + } + + simdutf_warn_unused size_t + latin1_length_from_utf16(size_t) const noexcept override { + return 0; + } + + simdutf_warn_unused size_t + latin1_length_from_utf32(size_t) const noexcept override { + return 0; + } + simdutf_warn_unused size_t + utf8_length_from_latin1(const char *, size_t) const noexcept override { + return 0; + } + + simdutf_warn_unused size_t + utf8_length_from_utf16le(const char16_t *, size_t) const noexcept override { + return 0; + } + + simdutf_warn_unused size_t + utf8_length_from_utf16be(const char16_t *, size_t) const noexcept override { + return 0; + } + + simdutf_warn_unused size_t + utf32_length_from_utf16le(const char16_t *, size_t) const noexcept override { + return 0; + } + + simdutf_warn_unused size_t + utf32_length_from_utf16be(const char16_t *, size_t) const noexcept override { + return 0; + } + + simdutf_warn_unused size_t + utf32_length_from_latin1(size_t) const noexcept override { + return 0; + } + + simdutf_warn_unused size_t + utf16_length_from_utf8(const char *, size_t) const noexcept override { + return 0; + } + simdutf_warn_unused size_t + utf16_length_from_latin1(size_t) const noexcept override { + return 0; + } + simdutf_warn_unused size_t + utf8_length_from_utf32(const char32_t *, size_t) const noexcept override { + return 0; + } + + simdutf_warn_unused size_t + utf16_length_from_utf32(const char32_t *, size_t) const noexcept override { + return 0; + } + + simdutf_warn_unused size_t + utf32_length_from_utf8(const char *, size_t) const noexcept override { + return 0; + } + + simdutf_warn_unused size_t maximal_binary_length_from_base64( + const char *, size_t) const noexcept override { + return 0; + } + + simdutf_warn_unused result + base64_to_binary(const char *, size_t, char *, base64_options, + last_chunk_handling_options) const noexcept override { + return result(error_code::OTHER, 0); + } + + simdutf_warn_unused full_result base64_to_binary_details( + const char *, size_t, char *, base64_options, + last_chunk_handling_options) const noexcept override { + return full_result(error_code::OTHER, 0, 0); + } + + simdutf_warn_unused size_t maximal_binary_length_from_base64( + const char16_t *, size_t) const noexcept override { + return 0; + } + + simdutf_warn_unused result + base64_to_binary(const char16_t *, size_t, char *, base64_options, + last_chunk_handling_options) const noexcept override { + return result(error_code::OTHER, 0); + } + + simdutf_warn_unused full_result base64_to_binary_details( + const char16_t *, size_t, char *, base64_options, + last_chunk_handling_options) const noexcept override { + return full_result(error_code::OTHER, 0, 0); + } + + simdutf_warn_unused size_t + base64_length_from_binary(size_t, base64_options) const noexcept override { + return 0; + } + + size_t binary_to_base64(const char *, size_t, char *, + base64_options) const noexcept override { + return 0; + } + + unsupported_implementation() + : implementation("unsupported", + "Unsupported CPU (no detected SIMD instructions)", 0) {} +}; + +const unsupported_implementation *get_unsupported_singleton() { + static const unsupported_implementation unsupported_singleton{}; + return &unsupported_singleton; +} +static_assert(std::is_trivially_destructible::value, + "unsupported_singleton should be trivially destructible"); + +size_t available_implementation_list::size() const noexcept { + return internal::get_available_implementation_pointers().size(); +} +const implementation *const * +available_implementation_list::begin() const noexcept { + return internal::get_available_implementation_pointers().begin(); +} +const implementation *const * +available_implementation_list::end() const noexcept { + return internal::get_available_implementation_pointers().end(); +} +const implementation * +available_implementation_list::detect_best_supported() const noexcept { + // They are prelisted in priority order, so we just go down the list + uint32_t supported_instruction_sets = + internal::detect_supported_architectures(); + for (const implementation *impl : + internal::get_available_implementation_pointers()) { + uint32_t required_instruction_sets = impl->required_instruction_sets(); + if ((supported_instruction_sets & required_instruction_sets) == + required_instruction_sets) { + return impl; + } + } + return get_unsupported_singleton(); // this should never happen? +} + +const implementation * +detect_best_supported_implementation_on_first_use::set_best() const noexcept { + SIMDUTF_PUSH_DISABLE_WARNINGS + SIMDUTF_DISABLE_DEPRECATED_WARNING // Disable CRT_SECURE warning on MSVC: + // manually verified this is safe + char *force_implementation_name = getenv("SIMDUTF_FORCE_IMPLEMENTATION"); + SIMDUTF_POP_DISABLE_WARNINGS + + if (force_implementation_name) { + auto force_implementation = + get_available_implementations()[force_implementation_name]; + if (force_implementation) { + return get_active_implementation() = force_implementation; + } else { + // Note: abort() and stderr usage within the library is forbidden. + return get_active_implementation() = get_unsupported_singleton(); + } + } + return get_active_implementation() = + get_available_implementations().detect_best_supported(); +} + +} // namespace internal + +/** + * The list of available implementations compiled into simdutf. + */ +SIMDUTF_DLLIMPORTEXPORT const internal::available_implementation_list & +get_available_implementations() { + static const internal::available_implementation_list + available_implementations{}; + return available_implementations; +} + +/** + * The active implementation. + */ +SIMDUTF_DLLIMPORTEXPORT internal::atomic_ptr & +get_active_implementation() { +#if SIMDUTF_SINGLE_IMPLEMENTATION + // skip runtime detection + static internal::atomic_ptr active_implementation{ + internal::get_single_implementation()}; + return active_implementation; +#else + static const internal::detect_best_supported_implementation_on_first_use + detect_best_supported_implementation_on_first_use_singleton; + static internal::atomic_ptr active_implementation{ + &detect_best_supported_implementation_on_first_use_singleton}; + return active_implementation; +#endif +} + +#if SIMDUTF_SINGLE_IMPLEMENTATION +const implementation *get_default_implementation() { + return internal::get_single_implementation(); +} +#else +internal::atomic_ptr &get_default_implementation() { + return get_active_implementation(); +} +#endif +#define SIMDUTF_GET_CURRENT_IMPLEMENTION + +simdutf_warn_unused bool validate_utf8(const char *buf, size_t len) noexcept { + return get_default_implementation()->validate_utf8(buf, len); +} +simdutf_warn_unused result validate_utf8_with_errors(const char *buf, + size_t len) noexcept { + return get_default_implementation()->validate_utf8_with_errors(buf, len); +} +simdutf_warn_unused bool validate_ascii(const char *buf, size_t len) noexcept { + return get_default_implementation()->validate_ascii(buf, len); +} +simdutf_warn_unused result validate_ascii_with_errors(const char *buf, + size_t len) noexcept { + return get_default_implementation()->validate_ascii_with_errors(buf, len); +} +simdutf_warn_unused size_t convert_utf8_to_utf16( + const char *input, size_t length, char16_t *utf16_output) noexcept { +#if SIMDUTF_IS_BIG_ENDIAN + return convert_utf8_to_utf16be(input, length, utf16_output); +#else + return convert_utf8_to_utf16le(input, length, utf16_output); +#endif +} +simdutf_warn_unused size_t convert_latin1_to_utf8(const char *buf, size_t len, + char *utf8_output) noexcept { + return get_default_implementation()->convert_latin1_to_utf8(buf, len, + utf8_output); +} +simdutf_warn_unused size_t convert_latin1_to_utf16le( + const char *buf, size_t len, char16_t *utf16_output) noexcept { + return get_default_implementation()->convert_latin1_to_utf16le(buf, len, + utf16_output); +} +simdutf_warn_unused size_t convert_latin1_to_utf16be( + const char *buf, size_t len, char16_t *utf16_output) noexcept { + return get_default_implementation()->convert_latin1_to_utf16be(buf, len, + utf16_output); +} +simdutf_warn_unused size_t convert_latin1_to_utf32( + const char *buf, size_t len, char32_t *latin1_output) noexcept { + return get_default_implementation()->convert_latin1_to_utf32(buf, len, + latin1_output); +} +simdutf_warn_unused size_t convert_utf8_to_latin1( + const char *buf, size_t len, char *latin1_output) noexcept { + return get_default_implementation()->convert_utf8_to_latin1(buf, len, + latin1_output); +} +simdutf_warn_unused result convert_utf8_to_latin1_with_errors( + const char *buf, size_t len, char *latin1_output) noexcept { + return get_default_implementation()->convert_utf8_to_latin1_with_errors( + buf, len, latin1_output); +} +simdutf_warn_unused size_t convert_valid_utf8_to_latin1( + const char *buf, size_t len, char *latin1_output) noexcept { + return get_default_implementation()->convert_valid_utf8_to_latin1( + buf, len, latin1_output); +} +simdutf_warn_unused size_t convert_utf8_to_utf16le( + const char *input, size_t length, char16_t *utf16_output) noexcept { + return get_default_implementation()->convert_utf8_to_utf16le(input, length, + utf16_output); +} +simdutf_warn_unused size_t convert_utf8_to_utf16be( + const char *input, size_t length, char16_t *utf16_output) noexcept { + return get_default_implementation()->convert_utf8_to_utf16be(input, length, + utf16_output); +} +simdutf_warn_unused result convert_utf8_to_utf16_with_errors( + const char *input, size_t length, char16_t *utf16_output) noexcept { +#if SIMDUTF_IS_BIG_ENDIAN + return convert_utf8_to_utf16be_with_errors(input, length, utf16_output); +#else + return convert_utf8_to_utf16le_with_errors(input, length, utf16_output); +#endif +} +simdutf_warn_unused result convert_utf8_to_utf16le_with_errors( + const char *input, size_t length, char16_t *utf16_output) noexcept { + return get_default_implementation()->convert_utf8_to_utf16le_with_errors( + input, length, utf16_output); +} +simdutf_warn_unused result convert_utf8_to_utf16be_with_errors( + const char *input, size_t length, char16_t *utf16_output) noexcept { + return get_default_implementation()->convert_utf8_to_utf16be_with_errors( + input, length, utf16_output); +} +simdutf_warn_unused size_t convert_utf8_to_utf32( + const char *input, size_t length, char32_t *utf32_output) noexcept { + return get_default_implementation()->convert_utf8_to_utf32(input, length, + utf32_output); +} +simdutf_warn_unused result convert_utf8_to_utf32_with_errors( + const char *input, size_t length, char32_t *utf32_output) noexcept { + return get_default_implementation()->convert_utf8_to_utf32_with_errors( + input, length, utf32_output); +} +simdutf_warn_unused bool validate_utf16(const char16_t *buf, + size_t len) noexcept { +#if SIMDUTF_IS_BIG_ENDIAN + return validate_utf16be(buf, len); +#else + return validate_utf16le(buf, len); +#endif +} +simdutf_warn_unused bool validate_utf16le(const char16_t *buf, + size_t len) noexcept { + return get_default_implementation()->validate_utf16le(buf, len); +} +simdutf_warn_unused bool validate_utf16be(const char16_t *buf, + size_t len) noexcept { + return get_default_implementation()->validate_utf16be(buf, len); +} +simdutf_warn_unused result validate_utf16_with_errors(const char16_t *buf, + size_t len) noexcept { +#if SIMDUTF_IS_BIG_ENDIAN + return validate_utf16be_with_errors(buf, len); +#else + return validate_utf16le_with_errors(buf, len); +#endif +} +simdutf_warn_unused result validate_utf16le_with_errors(const char16_t *buf, + size_t len) noexcept { + return get_default_implementation()->validate_utf16le_with_errors(buf, len); +} +simdutf_warn_unused result validate_utf16be_with_errors(const char16_t *buf, + size_t len) noexcept { + return get_default_implementation()->validate_utf16be_with_errors(buf, len); +} +simdutf_warn_unused bool validate_utf32(const char32_t *buf, + size_t len) noexcept { + return get_default_implementation()->validate_utf32(buf, len); +} +simdutf_warn_unused result validate_utf32_with_errors(const char32_t *buf, + size_t len) noexcept { + return get_default_implementation()->validate_utf32_with_errors(buf, len); +} +simdutf_warn_unused size_t convert_valid_utf8_to_utf16( + const char *input, size_t length, char16_t *utf16_buffer) noexcept { +#if SIMDUTF_IS_BIG_ENDIAN + return convert_valid_utf8_to_utf16be(input, length, utf16_buffer); +#else + return convert_valid_utf8_to_utf16le(input, length, utf16_buffer); +#endif +} +simdutf_warn_unused size_t convert_valid_utf8_to_utf16le( + const char *input, size_t length, char16_t *utf16_buffer) noexcept { + return get_default_implementation()->convert_valid_utf8_to_utf16le( + input, length, utf16_buffer); +} +simdutf_warn_unused size_t convert_valid_utf8_to_utf16be( + const char *input, size_t length, char16_t *utf16_buffer) noexcept { + return get_default_implementation()->convert_valid_utf8_to_utf16be( + input, length, utf16_buffer); +} +simdutf_warn_unused size_t convert_valid_utf8_to_utf32( + const char *input, size_t length, char32_t *utf32_buffer) noexcept { + return get_default_implementation()->convert_valid_utf8_to_utf32( + input, length, utf32_buffer); +} +simdutf_warn_unused size_t convert_utf16_to_utf8(const char16_t *buf, + size_t len, + char *utf8_buffer) noexcept { +#if SIMDUTF_IS_BIG_ENDIAN + return convert_utf16be_to_utf8(buf, len, utf8_buffer); +#else + return convert_utf16le_to_utf8(buf, len, utf8_buffer); +#endif +} +simdutf_warn_unused size_t convert_utf16_to_latin1( + const char16_t *buf, size_t len, char *latin1_buffer) noexcept { +#if SIMDUTF_IS_BIG_ENDIAN + return convert_utf16be_to_latin1(buf, len, latin1_buffer); +#else + return convert_utf16le_to_latin1(buf, len, latin1_buffer); +#endif +} +simdutf_warn_unused size_t convert_latin1_to_utf16( + const char *buf, size_t len, char16_t *utf16_output) noexcept { +#if SIMDUTF_IS_BIG_ENDIAN + return convert_latin1_to_utf16be(buf, len, utf16_output); +#else + return convert_latin1_to_utf16le(buf, len, utf16_output); +#endif +} +simdutf_warn_unused size_t convert_utf16be_to_latin1( + const char16_t *buf, size_t len, char *latin1_buffer) noexcept { + return get_default_implementation()->convert_utf16be_to_latin1(buf, len, + latin1_buffer); +} +simdutf_warn_unused size_t convert_utf16le_to_latin1( + const char16_t *buf, size_t len, char *latin1_buffer) noexcept { + return get_default_implementation()->convert_utf16le_to_latin1(buf, len, + latin1_buffer); +} +simdutf_warn_unused size_t convert_valid_utf16be_to_latin1( + const char16_t *buf, size_t len, char *latin1_buffer) noexcept { + return get_default_implementation()->convert_valid_utf16be_to_latin1( + buf, len, latin1_buffer); +} +simdutf_warn_unused size_t convert_valid_utf16le_to_latin1( + const char16_t *buf, size_t len, char *latin1_buffer) noexcept { + return get_default_implementation()->convert_valid_utf16le_to_latin1( + buf, len, latin1_buffer); +} +simdutf_warn_unused result convert_utf16le_to_latin1_with_errors( + const char16_t *buf, size_t len, char *latin1_buffer) noexcept { + return get_default_implementation()->convert_utf16le_to_latin1_with_errors( + buf, len, latin1_buffer); +} +simdutf_warn_unused result convert_utf16be_to_latin1_with_errors( + const char16_t *buf, size_t len, char *latin1_buffer) noexcept { + return get_default_implementation()->convert_utf16be_to_latin1_with_errors( + buf, len, latin1_buffer); +} +simdutf_warn_unused size_t convert_utf16le_to_utf8(const char16_t *buf, + size_t len, + char *utf8_buffer) noexcept { + return get_default_implementation()->convert_utf16le_to_utf8(buf, len, + utf8_buffer); +} +simdutf_warn_unused size_t convert_utf16be_to_utf8(const char16_t *buf, + size_t len, + char *utf8_buffer) noexcept { + return get_default_implementation()->convert_utf16be_to_utf8(buf, len, + utf8_buffer); +} +simdutf_warn_unused result convert_utf16_to_utf8_with_errors( + const char16_t *buf, size_t len, char *utf8_buffer) noexcept { +#if SIMDUTF_IS_BIG_ENDIAN + return convert_utf16be_to_utf8_with_errors(buf, len, utf8_buffer); +#else + return convert_utf16le_to_utf8_with_errors(buf, len, utf8_buffer); +#endif +} +simdutf_warn_unused result convert_utf16_to_latin1_with_errors( + const char16_t *buf, size_t len, char *latin1_buffer) noexcept { +#if SIMDUTF_IS_BIG_ENDIAN + return convert_utf16be_to_latin1_with_errors(buf, len, latin1_buffer); +#else + return convert_utf16le_to_latin1_with_errors(buf, len, latin1_buffer); +#endif +} +simdutf_warn_unused result convert_utf16le_to_utf8_with_errors( + const char16_t *buf, size_t len, char *utf8_buffer) noexcept { + return get_default_implementation()->convert_utf16le_to_utf8_with_errors( + buf, len, utf8_buffer); +} +simdutf_warn_unused result convert_utf16be_to_utf8_with_errors( + const char16_t *buf, size_t len, char *utf8_buffer) noexcept { + return get_default_implementation()->convert_utf16be_to_utf8_with_errors( + buf, len, utf8_buffer); +} +simdutf_warn_unused size_t convert_valid_utf16_to_utf8( + const char16_t *buf, size_t len, char *utf8_buffer) noexcept { +#if SIMDUTF_IS_BIG_ENDIAN + return convert_valid_utf16be_to_utf8(buf, len, utf8_buffer); +#else + return convert_valid_utf16le_to_utf8(buf, len, utf8_buffer); +#endif +} +simdutf_warn_unused size_t convert_valid_utf16_to_latin1( + const char16_t *buf, size_t len, char *latin1_buffer) noexcept { +#if SIMDUTF_IS_BIG_ENDIAN + return convert_valid_utf16be_to_latin1(buf, len, latin1_buffer); +#else + return convert_valid_utf16le_to_latin1(buf, len, latin1_buffer); +#endif +} +simdutf_warn_unused size_t convert_valid_utf16le_to_utf8( + const char16_t *buf, size_t len, char *utf8_buffer) noexcept { + return get_default_implementation()->convert_valid_utf16le_to_utf8( + buf, len, utf8_buffer); +} +simdutf_warn_unused size_t convert_valid_utf16be_to_utf8( + const char16_t *buf, size_t len, char *utf8_buffer) noexcept { + return get_default_implementation()->convert_valid_utf16be_to_utf8( + buf, len, utf8_buffer); +} +simdutf_warn_unused size_t convert_utf32_to_utf8(const char32_t *buf, + size_t len, + char *utf8_buffer) noexcept { + return get_default_implementation()->convert_utf32_to_utf8(buf, len, + utf8_buffer); +} +simdutf_warn_unused result convert_utf32_to_utf8_with_errors( + const char32_t *buf, size_t len, char *utf8_buffer) noexcept { + return get_default_implementation()->convert_utf32_to_utf8_with_errors( + buf, len, utf8_buffer); +} +simdutf_warn_unused size_t convert_valid_utf32_to_utf8( + const char32_t *buf, size_t len, char *utf8_buffer) noexcept { + return get_default_implementation()->convert_valid_utf32_to_utf8(buf, len, + utf8_buffer); +} +simdutf_warn_unused size_t convert_utf32_to_utf16( + const char32_t *buf, size_t len, char16_t *utf16_buffer) noexcept { +#if SIMDUTF_IS_BIG_ENDIAN + return convert_utf32_to_utf16be(buf, len, utf16_buffer); +#else + return convert_utf32_to_utf16le(buf, len, utf16_buffer); +#endif +} +simdutf_warn_unused size_t convert_utf32_to_latin1( + const char32_t *input, size_t length, char *latin1_output) noexcept { + return get_default_implementation()->convert_utf32_to_latin1(input, length, + latin1_output); +} +simdutf_warn_unused size_t convert_utf32_to_utf16le( + const char32_t *buf, size_t len, char16_t *utf16_buffer) noexcept { + return get_default_implementation()->convert_utf32_to_utf16le(buf, len, + utf16_buffer); +} +simdutf_warn_unused size_t convert_utf32_to_utf16be( + const char32_t *buf, size_t len, char16_t *utf16_buffer) noexcept { + return get_default_implementation()->convert_utf32_to_utf16be(buf, len, + utf16_buffer); +} +simdutf_warn_unused result convert_utf32_to_utf16_with_errors( + const char32_t *buf, size_t len, char16_t *utf16_buffer) noexcept { +#if SIMDUTF_IS_BIG_ENDIAN + return convert_utf32_to_utf16be_with_errors(buf, len, utf16_buffer); +#else + return convert_utf32_to_utf16le_with_errors(buf, len, utf16_buffer); +#endif +} +simdutf_warn_unused result convert_utf32_to_utf16le_with_errors( + const char32_t *buf, size_t len, char16_t *utf16_buffer) noexcept { + return get_default_implementation()->convert_utf32_to_utf16le_with_errors( + buf, len, utf16_buffer); +} +simdutf_warn_unused result convert_utf32_to_utf16be_with_errors( + const char32_t *buf, size_t len, char16_t *utf16_buffer) noexcept { + return get_default_implementation()->convert_utf32_to_utf16be_with_errors( + buf, len, utf16_buffer); +} +simdutf_warn_unused size_t convert_valid_utf32_to_utf16( + const char32_t *buf, size_t len, char16_t *utf16_buffer) noexcept { +#if SIMDUTF_IS_BIG_ENDIAN + return convert_valid_utf32_to_utf16be(buf, len, utf16_buffer); +#else + return convert_valid_utf32_to_utf16le(buf, len, utf16_buffer); +#endif +} +simdutf_warn_unused size_t convert_valid_utf32_to_utf16le( + const char32_t *buf, size_t len, char16_t *utf16_buffer) noexcept { + return get_default_implementation()->convert_valid_utf32_to_utf16le( + buf, len, utf16_buffer); +} +simdutf_warn_unused size_t convert_valid_utf32_to_utf16be( + const char32_t *buf, size_t len, char16_t *utf16_buffer) noexcept { + return get_default_implementation()->convert_valid_utf32_to_utf16be( + buf, len, utf16_buffer); +} +simdutf_warn_unused size_t convert_utf16_to_utf32( + const char16_t *buf, size_t len, char32_t *utf32_buffer) noexcept { +#if SIMDUTF_IS_BIG_ENDIAN + return convert_utf16be_to_utf32(buf, len, utf32_buffer); +#else + return convert_utf16le_to_utf32(buf, len, utf32_buffer); +#endif +} +simdutf_warn_unused size_t convert_utf16le_to_utf32( + const char16_t *buf, size_t len, char32_t *utf32_buffer) noexcept { + return get_default_implementation()->convert_utf16le_to_utf32(buf, len, + utf32_buffer); +} +simdutf_warn_unused size_t convert_utf16be_to_utf32( + const char16_t *buf, size_t len, char32_t *utf32_buffer) noexcept { + return get_default_implementation()->convert_utf16be_to_utf32(buf, len, + utf32_buffer); +} +simdutf_warn_unused result convert_utf16_to_utf32_with_errors( + const char16_t *buf, size_t len, char32_t *utf32_buffer) noexcept { +#if SIMDUTF_IS_BIG_ENDIAN + return convert_utf16be_to_utf32_with_errors(buf, len, utf32_buffer); +#else + return convert_utf16le_to_utf32_with_errors(buf, len, utf32_buffer); +#endif +} +simdutf_warn_unused result convert_utf16le_to_utf32_with_errors( + const char16_t *buf, size_t len, char32_t *utf32_buffer) noexcept { + return get_default_implementation()->convert_utf16le_to_utf32_with_errors( + buf, len, utf32_buffer); +} +simdutf_warn_unused result convert_utf16be_to_utf32_with_errors( + const char16_t *buf, size_t len, char32_t *utf32_buffer) noexcept { + return get_default_implementation()->convert_utf16be_to_utf32_with_errors( + buf, len, utf32_buffer); +} +simdutf_warn_unused size_t convert_valid_utf16_to_utf32( + const char16_t *buf, size_t len, char32_t *utf32_buffer) noexcept { +#if SIMDUTF_IS_BIG_ENDIAN + return convert_valid_utf16be_to_utf32(buf, len, utf32_buffer); +#else + return convert_valid_utf16le_to_utf32(buf, len, utf32_buffer); +#endif +} +simdutf_warn_unused size_t convert_valid_utf16le_to_utf32( + const char16_t *buf, size_t len, char32_t *utf32_buffer) noexcept { + return get_default_implementation()->convert_valid_utf16le_to_utf32( + buf, len, utf32_buffer); +} +simdutf_warn_unused size_t convert_valid_utf16be_to_utf32( + const char16_t *buf, size_t len, char32_t *utf32_buffer) noexcept { + return get_default_implementation()->convert_valid_utf16be_to_utf32( + buf, len, utf32_buffer); +} +void change_endianness_utf16(const char16_t *input, size_t length, + char16_t *output) noexcept { + get_default_implementation()->change_endianness_utf16(input, length, output); +} +simdutf_warn_unused size_t count_utf16(const char16_t *input, + size_t length) noexcept { +#if SIMDUTF_IS_BIG_ENDIAN + return count_utf16be(input, length); +#else + return count_utf16le(input, length); +#endif +} +simdutf_warn_unused size_t count_utf16le(const char16_t *input, + size_t length) noexcept { + return get_default_implementation()->count_utf16le(input, length); +} +simdutf_warn_unused size_t count_utf16be(const char16_t *input, + size_t length) noexcept { + return get_default_implementation()->count_utf16be(input, length); +} +simdutf_warn_unused size_t count_utf8(const char *input, + size_t length) noexcept { + return get_default_implementation()->count_utf8(input, length); +} +simdutf_warn_unused size_t latin1_length_from_utf8(const char *buf, + size_t len) noexcept { + return get_default_implementation()->latin1_length_from_utf8(buf, len); +} +simdutf_warn_unused size_t latin1_length_from_utf16(size_t len) noexcept { + return get_default_implementation()->latin1_length_from_utf16(len); +} +simdutf_warn_unused size_t latin1_length_from_utf32(size_t len) noexcept { + return get_default_implementation()->latin1_length_from_utf32(len); +} +simdutf_warn_unused size_t utf8_length_from_latin1(const char *buf, + size_t len) noexcept { + return get_default_implementation()->utf8_length_from_latin1(buf, len); +} +simdutf_warn_unused size_t utf8_length_from_utf16(const char16_t *input, + size_t length) noexcept { +#if SIMDUTF_IS_BIG_ENDIAN + return utf8_length_from_utf16be(input, length); +#else + return utf8_length_from_utf16le(input, length); +#endif +} +simdutf_warn_unused size_t utf8_length_from_utf16le(const char16_t *input, + size_t length) noexcept { + return get_default_implementation()->utf8_length_from_utf16le(input, length); +} +simdutf_warn_unused size_t utf8_length_from_utf16be(const char16_t *input, + size_t length) noexcept { + return get_default_implementation()->utf8_length_from_utf16be(input, length); +} +simdutf_warn_unused size_t utf32_length_from_utf16(const char16_t *input, + size_t length) noexcept { +#if SIMDUTF_IS_BIG_ENDIAN + return utf32_length_from_utf16be(input, length); +#else + return utf32_length_from_utf16le(input, length); +#endif +} +simdutf_warn_unused size_t utf32_length_from_utf16le(const char16_t *input, + size_t length) noexcept { + return get_default_implementation()->utf32_length_from_utf16le(input, length); +} +simdutf_warn_unused size_t utf32_length_from_utf16be(const char16_t *input, + size_t length) noexcept { + return get_default_implementation()->utf32_length_from_utf16be(input, length); +} +simdutf_warn_unused size_t utf16_length_from_utf8(const char *input, + size_t length) noexcept { + return get_default_implementation()->utf16_length_from_utf8(input, length); +} +simdutf_warn_unused size_t utf16_length_from_latin1(size_t length) noexcept { + return get_default_implementation()->utf16_length_from_latin1(length); +} +simdutf_warn_unused size_t utf8_length_from_utf32(const char32_t *input, + size_t length) noexcept { + return get_default_implementation()->utf8_length_from_utf32(input, length); +} +simdutf_warn_unused size_t utf16_length_from_utf32(const char32_t *input, + size_t length) noexcept { + return get_default_implementation()->utf16_length_from_utf32(input, length); +} +simdutf_warn_unused size_t utf32_length_from_utf8(const char *input, + size_t length) noexcept { + return get_default_implementation()->utf32_length_from_utf8(input, length); +} + +simdutf_warn_unused size_t +maximal_binary_length_from_base64(const char *input, size_t length) noexcept { + return get_default_implementation()->maximal_binary_length_from_base64( + input, length); +} + +simdutf_warn_unused result base64_to_binary( + const char *input, size_t length, char *output, base64_options options, + last_chunk_handling_options last_chunk_handling_options) noexcept { + return get_default_implementation()->base64_to_binary( + input, length, output, options, last_chunk_handling_options); +} + +simdutf_warn_unused size_t maximal_binary_length_from_base64( + const char16_t *input, size_t length) noexcept { + return get_default_implementation()->maximal_binary_length_from_base64( + input, length); +} + +simdutf_warn_unused result base64_to_binary( + const char16_t *input, size_t length, char *output, base64_options options, + last_chunk_handling_options last_chunk_handling_options) noexcept { + return get_default_implementation()->base64_to_binary( + input, length, output, options, last_chunk_handling_options); +} + +template +simdutf_warn_unused result base64_to_binary_safe_impl( + const chartype *input, size_t length, char *output, size_t &outlen, + base64_options options, + last_chunk_handling_options last_chunk_handling_options) noexcept { + static_assert(std::is_same::value || + std::is_same::value, + "Only char and char16_t are supported."); + // The implementation could be nicer, but we expect that most times, the user + // will provide us with a buffer that is large enough. + size_t max_length = maximal_binary_length_from_base64(input, length); + if (outlen >= max_length) { + // fast path + full_result r = get_default_implementation()->base64_to_binary_details( + input, length, output, options, last_chunk_handling_options); + if (r.error != error_code::INVALID_BASE64_CHARACTER && + r.error != error_code::BASE64_EXTRA_BITS) { + outlen = r.output_count; + if (last_chunk_handling_options == stop_before_partial) { + if ((r.output_count % 3) != 0) { + bool empty_trail = true; + for (size_t i = r.input_count; i < length; i++) { + if (!scalar::base64::is_ascii_white_space_or_padding(input[i])) { + empty_trail = false; + break; + } + } + if (empty_trail) { + r.input_count = length; + } + } + return {r.error, r.input_count}; + } + return {r.error, length}; + } + return r; + } + // The output buffer is maybe too small. We will decode a truncated version of + // the input. + size_t outlen3 = outlen / 3 * 3; // round down to multiple of 3 + size_t safe_input = base64_length_from_binary(outlen3, options); + full_result r = get_default_implementation()->base64_to_binary_details( + input, safe_input, output, options, loose); + if (r.error == error_code::INVALID_BASE64_CHARACTER) { + return r; + } + size_t offset = + (r.error == error_code::BASE64_INPUT_REMAINDER) + ? 1 + : ((r.output_count % 3) == 0 ? 0 : (r.output_count % 3) + 1); + size_t output_index = r.output_count - (r.output_count % 3); + size_t input_index = safe_input; + // offset is a value that is no larger than 3. We backtrack + // by up to offset characters + an undetermined number of + // white space characters. It is expected that the next loop + // runs at most 3 times + the number of white space characters + // in between them, so we are not worried about performance. + while (offset > 0 && input_index > 0) { + chartype c = input[--input_index]; + if (scalar::base64::is_ascii_white_space(c)) { + // skipping + } else { + offset--; + } + } + size_t remaining_out = outlen - output_index; + const chartype *tail_input = input + input_index; + size_t tail_length = length - input_index; + while (tail_length > 0 && + scalar::base64::is_ascii_white_space(tail_input[tail_length - 1])) { + tail_length--; + } + size_t padding_characts = 0; + if (tail_length > 0 && tail_input[tail_length - 1] == '=') { + tail_length--; + padding_characts++; + while (tail_length > 0 && + scalar::base64::is_ascii_white_space(tail_input[tail_length - 1])) { + tail_length--; + } + if (tail_length > 0 && tail_input[tail_length - 1] == '=') { + tail_length--; + padding_characts++; + } + } + // this will advance tail_input and tail_length + result rr = scalar::base64::base64_tail_decode_safe( + output + output_index, remaining_out, tail_input, tail_length, + padding_characts, options, last_chunk_handling_options); + outlen = output_index + remaining_out; + if (last_chunk_handling_options != stop_before_partial && + rr.error == error_code::SUCCESS && padding_characts > 0) { + // additional checks + if ((outlen % 3 == 0) || ((outlen % 3) + 1 + padding_characts != 4)) { + rr.error = error_code::INVALID_BASE64_CHARACTER; + } + } + if (rr.error == error_code::SUCCESS && + last_chunk_handling_options == stop_before_partial) { + if (tail_input > input + input_index) { + rr.count = tail_input - input; + } else if (r.input_count > 0) { + rr.count = r.input_count + rr.count; + } + return rr; + } + rr.count += input_index; + return rr; +} + +simdutf_warn_unused size_t convert_latin1_to_utf8_safe( + const char *buf, size_t len, char *utf8_output, size_t utf8_len) noexcept { + const auto start{utf8_output}; + + while (true) { + // convert_latin1_to_utf8 will never write more than input length * 2 + auto read_len = std::min(len, utf8_len >> 1); + if (read_len <= 16) { + break; + } + + const auto write_len = + simdutf::convert_latin1_to_utf8(buf, read_len, utf8_output); + + utf8_output += write_len; + utf8_len -= write_len; + buf += read_len; + len -= read_len; + } + + utf8_output += + scalar::latin1_to_utf8::convert_safe(buf, len, utf8_output, utf8_len); + + return utf8_output - start; +} + +simdutf_warn_unused result base64_to_binary_safe( + const char *input, size_t length, char *output, size_t &outlen, + base64_options options, + last_chunk_handling_options last_chunk_handling_options) noexcept { + return base64_to_binary_safe_impl(input, length, output, outlen, + options, last_chunk_handling_options); +} +simdutf_warn_unused result base64_to_binary_safe( + const char16_t *input, size_t length, char *output, size_t &outlen, + base64_options options, + last_chunk_handling_options last_chunk_handling_options) noexcept { + return base64_to_binary_safe_impl( + input, length, output, outlen, options, last_chunk_handling_options); +} + +simdutf_warn_unused size_t +base64_length_from_binary(size_t length, base64_options options) noexcept { + return get_default_implementation()->base64_length_from_binary(length, + options); +} + +size_t binary_to_base64(const char *input, size_t length, char *output, + base64_options options) noexcept { + return get_default_implementation()->binary_to_base64(input, length, output, + options); +} + +simdutf_warn_unused simdutf::encoding_type +autodetect_encoding(const char *buf, size_t length) noexcept { + return get_default_implementation()->autodetect_encoding(buf, length); +} +simdutf_warn_unused int detect_encodings(const char *buf, + size_t length) noexcept { + return get_default_implementation()->detect_encodings(buf, length); +} +const implementation *builtin_implementation() { + static const implementation *builtin_impl = + get_available_implementations()[SIMDUTF_STRINGIFY( + SIMDUTF_BUILTIN_IMPLEMENTATION)]; + return builtin_impl; +} + +simdutf_warn_unused size_t trim_partial_utf8(const char *input, size_t length) { + return scalar::utf8::trim_partial_utf8(input, length); +} + +simdutf_warn_unused size_t trim_partial_utf16be(const char16_t *input, + size_t length) { + return scalar::utf16::trim_partial_utf16(input, length); +} + +simdutf_warn_unused size_t trim_partial_utf16le(const char16_t *input, + size_t length) { + return scalar::utf16::trim_partial_utf16(input, length); +} + +simdutf_warn_unused size_t trim_partial_utf16(const char16_t *input, + size_t length) { +#if SIMDUTF_IS_BIG_ENDIAN + return trim_partial_utf16be(input, length); +#else + return trim_partial_utf16le(input, length); +#endif +} + +} // namespace simdutf +/* end file src/implementation.cpp */ +/* begin file src/encoding_types.cpp */ + +namespace simdutf { +bool match_system(endianness e) { +#if SIMDUTF_IS_BIG_ENDIAN + return e == endianness::BIG; +#else + return e == endianness::LITTLE; +#endif +} + +std::string to_string(encoding_type bom) { + switch (bom) { + case UTF16_LE: + return "UTF16 little-endian"; + case UTF16_BE: + return "UTF16 big-endian"; + case UTF32_LE: + return "UTF32 little-endian"; + case UTF32_BE: + return "UTF32 big-endian"; + case UTF8: + return "UTF8"; + case unspecified: + return "unknown"; + default: + return "error"; + } +} + +namespace BOM { +// Note that BOM for UTF8 is discouraged. +encoding_type check_bom(const uint8_t *byte, size_t length) { + if (length >= 2 && byte[0] == 0xff and byte[1] == 0xfe) { + if (length >= 4 && byte[2] == 0x00 and byte[3] == 0x0) { + return encoding_type::UTF32_LE; + } else { + return encoding_type::UTF16_LE; + } + } else if (length >= 2 && byte[0] == 0xfe and byte[1] == 0xff) { + return encoding_type::UTF16_BE; + } else if (length >= 4 && byte[0] == 0x00 and byte[1] == 0x00 and + byte[2] == 0xfe and byte[3] == 0xff) { + return encoding_type::UTF32_BE; + } else if (length >= 4 && byte[0] == 0xef and byte[1] == 0xbb and + byte[2] == 0xbf) { + return encoding_type::UTF8; + } + return encoding_type::unspecified; +} + +encoding_type check_bom(const char *byte, size_t length) { + return check_bom(reinterpret_cast(byte), length); +} + +size_t bom_byte_size(encoding_type bom) { + switch (bom) { + case UTF16_LE: + return 2; + case UTF16_BE: + return 2; + case UTF32_LE: + return 4; + case UTF32_BE: + return 4; + case UTF8: + return 3; + case unspecified: + return 0; + default: + return 0; + } +} + +} // namespace BOM +} // namespace simdutf +/* end file src/encoding_types.cpp */ +/* begin file src/error.cpp */ +namespace simdutf { +// deliberately empty +} +/* end file src/error.cpp */ +// The large tables should be included once and they +// should not depend on a kernel. +/* begin file src/tables/utf8_to_utf16_tables.h */ +#ifndef SIMDUTF_UTF8_TO_UTF16_TABLES_H +#define SIMDUTF_UTF8_TO_UTF16_TABLES_H +#include + +namespace simdutf { +namespace { +namespace tables { +namespace utf8_to_utf16 { +/** + * utf8bigindex uses about 8 kB + * shufutf8 uses about 3344 B + * + * So we use a bit over 11 kB. It would be + * easy to save about 4 kB by only + * storing the index in utf8bigindex, and + * deriving the consumed bytes otherwise. + * However, this may come at a significant (10% to 20%) + * performance penalty. + */ + +const uint8_t shufutf8[209][16] = { + {0, 255, 1, 255, 2, 255, 3, 255, 4, 255, 5, 255, 0, 0, 0, 0}, + {0, 255, 1, 255, 2, 255, 3, 255, 4, 255, 6, 5, 0, 0, 0, 0}, + {0, 255, 1, 255, 2, 255, 3, 255, 5, 4, 6, 255, 0, 0, 0, 0}, + {0, 255, 1, 255, 2, 255, 3, 255, 5, 4, 7, 6, 0, 0, 0, 0}, + {0, 255, 1, 255, 2, 255, 4, 3, 5, 255, 6, 255, 0, 0, 0, 0}, + {0, 255, 1, 255, 2, 255, 4, 3, 5, 255, 7, 6, 0, 0, 0, 0}, + {0, 255, 1, 255, 2, 255, 4, 3, 6, 5, 7, 255, 0, 0, 0, 0}, + {0, 255, 1, 255, 2, 255, 4, 3, 6, 5, 8, 7, 0, 0, 0, 0}, + {0, 255, 1, 255, 3, 2, 4, 255, 5, 255, 6, 255, 0, 0, 0, 0}, + {0, 255, 1, 255, 3, 2, 4, 255, 5, 255, 7, 6, 0, 0, 0, 0}, + {0, 255, 1, 255, 3, 2, 4, 255, 6, 5, 7, 255, 0, 0, 0, 0}, + {0, 255, 1, 255, 3, 2, 4, 255, 6, 5, 8, 7, 0, 0, 0, 0}, + {0, 255, 1, 255, 3, 2, 5, 4, 6, 255, 7, 255, 0, 0, 0, 0}, + {0, 255, 1, 255, 3, 2, 5, 4, 6, 255, 8, 7, 0, 0, 0, 0}, + {0, 255, 1, 255, 3, 2, 5, 4, 7, 6, 8, 255, 0, 0, 0, 0}, + {0, 255, 1, 255, 3, 2, 5, 4, 7, 6, 9, 8, 0, 0, 0, 0}, + {0, 255, 2, 1, 3, 255, 4, 255, 5, 255, 6, 255, 0, 0, 0, 0}, + {0, 255, 2, 1, 3, 255, 4, 255, 5, 255, 7, 6, 0, 0, 0, 0}, + {0, 255, 2, 1, 3, 255, 4, 255, 6, 5, 7, 255, 0, 0, 0, 0}, + {0, 255, 2, 1, 3, 255, 4, 255, 6, 5, 8, 7, 0, 0, 0, 0}, + {0, 255, 2, 1, 3, 255, 5, 4, 6, 255, 7, 255, 0, 0, 0, 0}, + {0, 255, 2, 1, 3, 255, 5, 4, 6, 255, 8, 7, 0, 0, 0, 0}, + {0, 255, 2, 1, 3, 255, 5, 4, 7, 6, 8, 255, 0, 0, 0, 0}, + {0, 255, 2, 1, 3, 255, 5, 4, 7, 6, 9, 8, 0, 0, 0, 0}, + {0, 255, 2, 1, 4, 3, 5, 255, 6, 255, 7, 255, 0, 0, 0, 0}, + {0, 255, 2, 1, 4, 3, 5, 255, 6, 255, 8, 7, 0, 0, 0, 0}, + {0, 255, 2, 1, 4, 3, 5, 255, 7, 6, 8, 255, 0, 0, 0, 0}, + {0, 255, 2, 1, 4, 3, 5, 255, 7, 6, 9, 8, 0, 0, 0, 0}, + {0, 255, 2, 1, 4, 3, 6, 5, 7, 255, 8, 255, 0, 0, 0, 0}, + {0, 255, 2, 1, 4, 3, 6, 5, 7, 255, 9, 8, 0, 0, 0, 0}, + {0, 255, 2, 1, 4, 3, 6, 5, 8, 7, 9, 255, 0, 0, 0, 0}, + {0, 255, 2, 1, 4, 3, 6, 5, 8, 7, 10, 9, 0, 0, 0, 0}, + {1, 0, 2, 255, 3, 255, 4, 255, 5, 255, 6, 255, 0, 0, 0, 0}, + {1, 0, 2, 255, 3, 255, 4, 255, 5, 255, 7, 6, 0, 0, 0, 0}, + {1, 0, 2, 255, 3, 255, 4, 255, 6, 5, 7, 255, 0, 0, 0, 0}, + {1, 0, 2, 255, 3, 255, 4, 255, 6, 5, 8, 7, 0, 0, 0, 0}, + {1, 0, 2, 255, 3, 255, 5, 4, 6, 255, 7, 255, 0, 0, 0, 0}, + {1, 0, 2, 255, 3, 255, 5, 4, 6, 255, 8, 7, 0, 0, 0, 0}, + {1, 0, 2, 255, 3, 255, 5, 4, 7, 6, 8, 255, 0, 0, 0, 0}, + {1, 0, 2, 255, 3, 255, 5, 4, 7, 6, 9, 8, 0, 0, 0, 0}, + {1, 0, 2, 255, 4, 3, 5, 255, 6, 255, 7, 255, 0, 0, 0, 0}, + {1, 0, 2, 255, 4, 3, 5, 255, 6, 255, 8, 7, 0, 0, 0, 0}, + {1, 0, 2, 255, 4, 3, 5, 255, 7, 6, 8, 255, 0, 0, 0, 0}, + {1, 0, 2, 255, 4, 3, 5, 255, 7, 6, 9, 8, 0, 0, 0, 0}, + {1, 0, 2, 255, 4, 3, 6, 5, 7, 255, 8, 255, 0, 0, 0, 0}, + {1, 0, 2, 255, 4, 3, 6, 5, 7, 255, 9, 8, 0, 0, 0, 0}, + {1, 0, 2, 255, 4, 3, 6, 5, 8, 7, 9, 255, 0, 0, 0, 0}, + {1, 0, 2, 255, 4, 3, 6, 5, 8, 7, 10, 9, 0, 0, 0, 0}, + {1, 0, 3, 2, 4, 255, 5, 255, 6, 255, 7, 255, 0, 0, 0, 0}, + {1, 0, 3, 2, 4, 255, 5, 255, 6, 255, 8, 7, 0, 0, 0, 0}, + {1, 0, 3, 2, 4, 255, 5, 255, 7, 6, 8, 255, 0, 0, 0, 0}, + {1, 0, 3, 2, 4, 255, 5, 255, 7, 6, 9, 8, 0, 0, 0, 0}, + {1, 0, 3, 2, 4, 255, 6, 5, 7, 255, 8, 255, 0, 0, 0, 0}, + {1, 0, 3, 2, 4, 255, 6, 5, 7, 255, 9, 8, 0, 0, 0, 0}, + {1, 0, 3, 2, 4, 255, 6, 5, 8, 7, 9, 255, 0, 0, 0, 0}, + {1, 0, 3, 2, 4, 255, 6, 5, 8, 7, 10, 9, 0, 0, 0, 0}, + {1, 0, 3, 2, 5, 4, 6, 255, 7, 255, 8, 255, 0, 0, 0, 0}, + {1, 0, 3, 2, 5, 4, 6, 255, 7, 255, 9, 8, 0, 0, 0, 0}, + {1, 0, 3, 2, 5, 4, 6, 255, 8, 7, 9, 255, 0, 0, 0, 0}, + {1, 0, 3, 2, 5, 4, 6, 255, 8, 7, 10, 9, 0, 0, 0, 0}, + {1, 0, 3, 2, 5, 4, 7, 6, 8, 255, 9, 255, 0, 0, 0, 0}, + {1, 0, 3, 2, 5, 4, 7, 6, 8, 255, 10, 9, 0, 0, 0, 0}, + {1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 10, 255, 0, 0, 0, 0}, + {1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 0, 0, 0, 0}, + {0, 255, 255, 255, 1, 255, 255, 255, 2, 255, 255, 255, 3, 255, 255, 255}, + {0, 255, 255, 255, 1, 255, 255, 255, 2, 255, 255, 255, 4, 3, 255, 255}, + {0, 255, 255, 255, 1, 255, 255, 255, 2, 255, 255, 255, 5, 4, 3, 255}, + {0, 255, 255, 255, 1, 255, 255, 255, 3, 2, 255, 255, 4, 255, 255, 255}, + {0, 255, 255, 255, 1, 255, 255, 255, 3, 2, 255, 255, 5, 4, 255, 255}, + {0, 255, 255, 255, 1, 255, 255, 255, 3, 2, 255, 255, 6, 5, 4, 255}, + {0, 255, 255, 255, 1, 255, 255, 255, 4, 3, 2, 255, 5, 255, 255, 255}, + {0, 255, 255, 255, 1, 255, 255, 255, 4, 3, 2, 255, 6, 5, 255, 255}, + {0, 255, 255, 255, 1, 255, 255, 255, 4, 3, 2, 255, 7, 6, 5, 255}, + {0, 255, 255, 255, 2, 1, 255, 255, 3, 255, 255, 255, 4, 255, 255, 255}, + {0, 255, 255, 255, 2, 1, 255, 255, 3, 255, 255, 255, 5, 4, 255, 255}, + {0, 255, 255, 255, 2, 1, 255, 255, 3, 255, 255, 255, 6, 5, 4, 255}, + {0, 255, 255, 255, 2, 1, 255, 255, 4, 3, 255, 255, 5, 255, 255, 255}, + {0, 255, 255, 255, 2, 1, 255, 255, 4, 3, 255, 255, 6, 5, 255, 255}, + {0, 255, 255, 255, 2, 1, 255, 255, 4, 3, 255, 255, 7, 6, 5, 255}, + {0, 255, 255, 255, 2, 1, 255, 255, 5, 4, 3, 255, 6, 255, 255, 255}, + {0, 255, 255, 255, 2, 1, 255, 255, 5, 4, 3, 255, 7, 6, 255, 255}, + {0, 255, 255, 255, 2, 1, 255, 255, 5, 4, 3, 255, 8, 7, 6, 255}, + {0, 255, 255, 255, 3, 2, 1, 255, 4, 255, 255, 255, 5, 255, 255, 255}, + {0, 255, 255, 255, 3, 2, 1, 255, 4, 255, 255, 255, 6, 5, 255, 255}, + {0, 255, 255, 255, 3, 2, 1, 255, 4, 255, 255, 255, 7, 6, 5, 255}, + {0, 255, 255, 255, 3, 2, 1, 255, 5, 4, 255, 255, 6, 255, 255, 255}, + {0, 255, 255, 255, 3, 2, 1, 255, 5, 4, 255, 255, 7, 6, 255, 255}, + {0, 255, 255, 255, 3, 2, 1, 255, 5, 4, 255, 255, 8, 7, 6, 255}, + {0, 255, 255, 255, 3, 2, 1, 255, 6, 5, 4, 255, 7, 255, 255, 255}, + {0, 255, 255, 255, 3, 2, 1, 255, 6, 5, 4, 255, 8, 7, 255, 255}, + {0, 255, 255, 255, 3, 2, 1, 255, 6, 5, 4, 255, 9, 8, 7, 255}, + {1, 0, 255, 255, 2, 255, 255, 255, 3, 255, 255, 255, 4, 255, 255, 255}, + {1, 0, 255, 255, 2, 255, 255, 255, 3, 255, 255, 255, 5, 4, 255, 255}, + {1, 0, 255, 255, 2, 255, 255, 255, 3, 255, 255, 255, 6, 5, 4, 255}, + {1, 0, 255, 255, 2, 255, 255, 255, 4, 3, 255, 255, 5, 255, 255, 255}, + {1, 0, 255, 255, 2, 255, 255, 255, 4, 3, 255, 255, 6, 5, 255, 255}, + {1, 0, 255, 255, 2, 255, 255, 255, 4, 3, 255, 255, 7, 6, 5, 255}, + {1, 0, 255, 255, 2, 255, 255, 255, 5, 4, 3, 255, 6, 255, 255, 255}, + {1, 0, 255, 255, 2, 255, 255, 255, 5, 4, 3, 255, 7, 6, 255, 255}, + {1, 0, 255, 255, 2, 255, 255, 255, 5, 4, 3, 255, 8, 7, 6, 255}, + {1, 0, 255, 255, 3, 2, 255, 255, 4, 255, 255, 255, 5, 255, 255, 255}, + {1, 0, 255, 255, 3, 2, 255, 255, 4, 255, 255, 255, 6, 5, 255, 255}, + {1, 0, 255, 255, 3, 2, 255, 255, 4, 255, 255, 255, 7, 6, 5, 255}, + {1, 0, 255, 255, 3, 2, 255, 255, 5, 4, 255, 255, 6, 255, 255, 255}, + {1, 0, 255, 255, 3, 2, 255, 255, 5, 4, 255, 255, 7, 6, 255, 255}, + {1, 0, 255, 255, 3, 2, 255, 255, 5, 4, 255, 255, 8, 7, 6, 255}, + {1, 0, 255, 255, 3, 2, 255, 255, 6, 5, 4, 255, 7, 255, 255, 255}, + {1, 0, 255, 255, 3, 2, 255, 255, 6, 5, 4, 255, 8, 7, 255, 255}, + {1, 0, 255, 255, 3, 2, 255, 255, 6, 5, 4, 255, 9, 8, 7, 255}, + {1, 0, 255, 255, 4, 3, 2, 255, 5, 255, 255, 255, 6, 255, 255, 255}, + {1, 0, 255, 255, 4, 3, 2, 255, 5, 255, 255, 255, 7, 6, 255, 255}, + {1, 0, 255, 255, 4, 3, 2, 255, 5, 255, 255, 255, 8, 7, 6, 255}, + {1, 0, 255, 255, 4, 3, 2, 255, 6, 5, 255, 255, 7, 255, 255, 255}, + {1, 0, 255, 255, 4, 3, 2, 255, 6, 5, 255, 255, 8, 7, 255, 255}, + {1, 0, 255, 255, 4, 3, 2, 255, 6, 5, 255, 255, 9, 8, 7, 255}, + {1, 0, 255, 255, 4, 3, 2, 255, 7, 6, 5, 255, 8, 255, 255, 255}, + {1, 0, 255, 255, 4, 3, 2, 255, 7, 6, 5, 255, 9, 8, 255, 255}, + {1, 0, 255, 255, 4, 3, 2, 255, 7, 6, 5, 255, 10, 9, 8, 255}, + {2, 1, 0, 255, 3, 255, 255, 255, 4, 255, 255, 255, 5, 255, 255, 255}, + {2, 1, 0, 255, 3, 255, 255, 255, 4, 255, 255, 255, 6, 5, 255, 255}, + {2, 1, 0, 255, 3, 255, 255, 255, 4, 255, 255, 255, 7, 6, 5, 255}, + {2, 1, 0, 255, 3, 255, 255, 255, 5, 4, 255, 255, 6, 255, 255, 255}, + {2, 1, 0, 255, 3, 255, 255, 255, 5, 4, 255, 255, 7, 6, 255, 255}, + {2, 1, 0, 255, 3, 255, 255, 255, 5, 4, 255, 255, 8, 7, 6, 255}, + {2, 1, 0, 255, 3, 255, 255, 255, 6, 5, 4, 255, 7, 255, 255, 255}, + {2, 1, 0, 255, 3, 255, 255, 255, 6, 5, 4, 255, 8, 7, 255, 255}, + {2, 1, 0, 255, 3, 255, 255, 255, 6, 5, 4, 255, 9, 8, 7, 255}, + {2, 1, 0, 255, 4, 3, 255, 255, 5, 255, 255, 255, 6, 255, 255, 255}, + {2, 1, 0, 255, 4, 3, 255, 255, 5, 255, 255, 255, 7, 6, 255, 255}, + {2, 1, 0, 255, 4, 3, 255, 255, 5, 255, 255, 255, 8, 7, 6, 255}, + {2, 1, 0, 255, 4, 3, 255, 255, 6, 5, 255, 255, 7, 255, 255, 255}, + {2, 1, 0, 255, 4, 3, 255, 255, 6, 5, 255, 255, 8, 7, 255, 255}, + {2, 1, 0, 255, 4, 3, 255, 255, 6, 5, 255, 255, 9, 8, 7, 255}, + {2, 1, 0, 255, 4, 3, 255, 255, 7, 6, 5, 255, 8, 255, 255, 255}, + {2, 1, 0, 255, 4, 3, 255, 255, 7, 6, 5, 255, 9, 8, 255, 255}, + {2, 1, 0, 255, 4, 3, 255, 255, 7, 6, 5, 255, 10, 9, 8, 255}, + {2, 1, 0, 255, 5, 4, 3, 255, 6, 255, 255, 255, 7, 255, 255, 255}, + {2, 1, 0, 255, 5, 4, 3, 255, 6, 255, 255, 255, 8, 7, 255, 255}, + {2, 1, 0, 255, 5, 4, 3, 255, 6, 255, 255, 255, 9, 8, 7, 255}, + {2, 1, 0, 255, 5, 4, 3, 255, 7, 6, 255, 255, 8, 255, 255, 255}, + {2, 1, 0, 255, 5, 4, 3, 255, 7, 6, 255, 255, 9, 8, 255, 255}, + {2, 1, 0, 255, 5, 4, 3, 255, 7, 6, 255, 255, 10, 9, 8, 255}, + {2, 1, 0, 255, 5, 4, 3, 255, 8, 7, 6, 255, 9, 255, 255, 255}, + {2, 1, 0, 255, 5, 4, 3, 255, 8, 7, 6, 255, 10, 9, 255, 255}, + {2, 1, 0, 255, 5, 4, 3, 255, 8, 7, 6, 255, 11, 10, 9, 255}, + {0, 255, 255, 255, 1, 255, 255, 255, 2, 255, 255, 255, 0, 0, 0, 0}, + {0, 255, 255, 255, 1, 255, 255, 255, 3, 2, 255, 255, 0, 0, 0, 0}, + {0, 255, 255, 255, 1, 255, 255, 255, 4, 3, 2, 255, 0, 0, 0, 0}, + {0, 255, 255, 255, 1, 255, 255, 255, 5, 4, 3, 2, 0, 0, 0, 0}, + {0, 255, 255, 255, 2, 1, 255, 255, 3, 255, 255, 255, 0, 0, 0, 0}, + {0, 255, 255, 255, 2, 1, 255, 255, 4, 3, 255, 255, 0, 0, 0, 0}, + {0, 255, 255, 255, 2, 1, 255, 255, 5, 4, 3, 255, 0, 0, 0, 0}, + {0, 255, 255, 255, 2, 1, 255, 255, 6, 5, 4, 3, 0, 0, 0, 0}, + {0, 255, 255, 255, 3, 2, 1, 255, 4, 255, 255, 255, 0, 0, 0, 0}, + {0, 255, 255, 255, 3, 2, 1, 255, 5, 4, 255, 255, 0, 0, 0, 0}, + {0, 255, 255, 255, 3, 2, 1, 255, 6, 5, 4, 255, 0, 0, 0, 0}, + {0, 255, 255, 255, 3, 2, 1, 255, 7, 6, 5, 4, 0, 0, 0, 0}, + {0, 255, 255, 255, 4, 3, 2, 1, 5, 255, 255, 255, 0, 0, 0, 0}, + {0, 255, 255, 255, 4, 3, 2, 1, 6, 5, 255, 255, 0, 0, 0, 0}, + {0, 255, 255, 255, 4, 3, 2, 1, 7, 6, 5, 255, 0, 0, 0, 0}, + {0, 255, 255, 255, 4, 3, 2, 1, 8, 7, 6, 5, 0, 0, 0, 0}, + {1, 0, 255, 255, 2, 255, 255, 255, 3, 255, 255, 255, 0, 0, 0, 0}, + {1, 0, 255, 255, 2, 255, 255, 255, 4, 3, 255, 255, 0, 0, 0, 0}, + {1, 0, 255, 255, 2, 255, 255, 255, 5, 4, 3, 255, 0, 0, 0, 0}, + {1, 0, 255, 255, 2, 255, 255, 255, 6, 5, 4, 3, 0, 0, 0, 0}, + {1, 0, 255, 255, 3, 2, 255, 255, 4, 255, 255, 255, 0, 0, 0, 0}, + {1, 0, 255, 255, 3, 2, 255, 255, 5, 4, 255, 255, 0, 0, 0, 0}, + {1, 0, 255, 255, 3, 2, 255, 255, 6, 5, 4, 255, 0, 0, 0, 0}, + {1, 0, 255, 255, 3, 2, 255, 255, 7, 6, 5, 4, 0, 0, 0, 0}, + {1, 0, 255, 255, 4, 3, 2, 255, 5, 255, 255, 255, 0, 0, 0, 0}, + {1, 0, 255, 255, 4, 3, 2, 255, 6, 5, 255, 255, 0, 0, 0, 0}, + {1, 0, 255, 255, 4, 3, 2, 255, 7, 6, 5, 255, 0, 0, 0, 0}, + {1, 0, 255, 255, 4, 3, 2, 255, 8, 7, 6, 5, 0, 0, 0, 0}, + {1, 0, 255, 255, 5, 4, 3, 2, 6, 255, 255, 255, 0, 0, 0, 0}, + {1, 0, 255, 255, 5, 4, 3, 2, 7, 6, 255, 255, 0, 0, 0, 0}, + {1, 0, 255, 255, 5, 4, 3, 2, 8, 7, 6, 255, 0, 0, 0, 0}, + {1, 0, 255, 255, 5, 4, 3, 2, 9, 8, 7, 6, 0, 0, 0, 0}, + {2, 1, 0, 255, 3, 255, 255, 255, 4, 255, 255, 255, 0, 0, 0, 0}, + {2, 1, 0, 255, 3, 255, 255, 255, 5, 4, 255, 255, 0, 0, 0, 0}, + {2, 1, 0, 255, 3, 255, 255, 255, 6, 5, 4, 255, 0, 0, 0, 0}, + {2, 1, 0, 255, 3, 255, 255, 255, 7, 6, 5, 4, 0, 0, 0, 0}, + {2, 1, 0, 255, 4, 3, 255, 255, 5, 255, 255, 255, 0, 0, 0, 0}, + {2, 1, 0, 255, 4, 3, 255, 255, 6, 5, 255, 255, 0, 0, 0, 0}, + {2, 1, 0, 255, 4, 3, 255, 255, 7, 6, 5, 255, 0, 0, 0, 0}, + {2, 1, 0, 255, 4, 3, 255, 255, 8, 7, 6, 5, 0, 0, 0, 0}, + {2, 1, 0, 255, 5, 4, 3, 255, 6, 255, 255, 255, 0, 0, 0, 0}, + {2, 1, 0, 255, 5, 4, 3, 255, 7, 6, 255, 255, 0, 0, 0, 0}, + {2, 1, 0, 255, 5, 4, 3, 255, 8, 7, 6, 255, 0, 0, 0, 0}, + {2, 1, 0, 255, 5, 4, 3, 255, 9, 8, 7, 6, 0, 0, 0, 0}, + {2, 1, 0, 255, 6, 5, 4, 3, 7, 255, 255, 255, 0, 0, 0, 0}, + {2, 1, 0, 255, 6, 5, 4, 3, 8, 7, 255, 255, 0, 0, 0, 0}, + {2, 1, 0, 255, 6, 5, 4, 3, 9, 8, 7, 255, 0, 0, 0, 0}, + {2, 1, 0, 255, 6, 5, 4, 3, 10, 9, 8, 7, 0, 0, 0, 0}, + {3, 2, 1, 0, 4, 255, 255, 255, 5, 255, 255, 255, 0, 0, 0, 0}, + {3, 2, 1, 0, 4, 255, 255, 255, 6, 5, 255, 255, 0, 0, 0, 0}, + {3, 2, 1, 0, 4, 255, 255, 255, 7, 6, 5, 255, 0, 0, 0, 0}, + {3, 2, 1, 0, 4, 255, 255, 255, 8, 7, 6, 5, 0, 0, 0, 0}, + {3, 2, 1, 0, 5, 4, 255, 255, 6, 255, 255, 255, 0, 0, 0, 0}, + {3, 2, 1, 0, 5, 4, 255, 255, 7, 6, 255, 255, 0, 0, 0, 0}, + {3, 2, 1, 0, 5, 4, 255, 255, 8, 7, 6, 255, 0, 0, 0, 0}, + {3, 2, 1, 0, 5, 4, 255, 255, 9, 8, 7, 6, 0, 0, 0, 0}, + {3, 2, 1, 0, 6, 5, 4, 255, 7, 255, 255, 255, 0, 0, 0, 0}, + {3, 2, 1, 0, 6, 5, 4, 255, 8, 7, 255, 255, 0, 0, 0, 0}, + {3, 2, 1, 0, 6, 5, 4, 255, 9, 8, 7, 255, 0, 0, 0, 0}, + {3, 2, 1, 0, 6, 5, 4, 255, 10, 9, 8, 7, 0, 0, 0, 0}, + {3, 2, 1, 0, 7, 6, 5, 4, 8, 255, 255, 255, 0, 0, 0, 0}, + {3, 2, 1, 0, 7, 6, 5, 4, 9, 8, 255, 255, 0, 0, 0, 0}, + {3, 2, 1, 0, 7, 6, 5, 4, 10, 9, 8, 255, 0, 0, 0, 0}, + {3, 2, 1, 0, 7, 6, 5, 4, 11, 10, 9, 8, 0, 0, 0, 0}}; +/* number of two bytes : 64 */ +/* number of two + three bytes : 145 */ +/* number of two + three + four bytes : 209 */ +const uint8_t utf8bigindex[4096][2] = { + {209, 12}, {209, 12}, {209, 12}, {209, 12}, {209, 12}, {209, 12}, {209, 12}, + {145, 3}, {209, 12}, {209, 12}, {209, 12}, {146, 4}, {209, 12}, {149, 4}, + {161, 4}, {64, 4}, {209, 12}, {209, 12}, {209, 12}, {147, 5}, {209, 12}, + {150, 5}, {162, 5}, {65, 5}, {209, 12}, {153, 5}, {165, 5}, {67, 5}, + {177, 5}, {73, 5}, {91, 5}, {64, 4}, {209, 12}, {209, 12}, {209, 12}, + {148, 6}, {209, 12}, {151, 6}, {163, 6}, {66, 6}, {209, 12}, {154, 6}, + {166, 6}, {68, 6}, {178, 6}, {74, 6}, {92, 6}, {64, 4}, {209, 12}, + {157, 6}, {169, 6}, {70, 6}, {181, 6}, {76, 6}, {94, 6}, {65, 5}, + {193, 6}, {82, 6}, {100, 6}, {67, 5}, {118, 6}, {73, 5}, {91, 5}, + {0, 6}, {209, 12}, {209, 12}, {209, 12}, {209, 12}, {209, 12}, {152, 7}, + {164, 7}, {145, 3}, {209, 12}, {155, 7}, {167, 7}, {69, 7}, {179, 7}, + {75, 7}, {93, 7}, {64, 4}, {209, 12}, {158, 7}, {170, 7}, {71, 7}, + {182, 7}, {77, 7}, {95, 7}, {65, 5}, {194, 7}, {83, 7}, {101, 7}, + {67, 5}, {119, 7}, {73, 5}, {91, 5}, {1, 7}, {209, 12}, {209, 12}, + {173, 7}, {148, 6}, {185, 7}, {79, 7}, {97, 7}, {66, 6}, {197, 7}, + {85, 7}, {103, 7}, {68, 6}, {121, 7}, {74, 6}, {92, 6}, {2, 7}, + {209, 12}, {157, 6}, {109, 7}, {70, 6}, {127, 7}, {76, 6}, {94, 6}, + {4, 7}, {193, 6}, {82, 6}, {100, 6}, {8, 7}, {118, 6}, {16, 7}, + {32, 7}, {0, 6}, {209, 12}, {209, 12}, {209, 12}, {209, 12}, {209, 12}, + {209, 12}, {209, 12}, {145, 3}, {209, 12}, {156, 8}, {168, 8}, {146, 4}, + {180, 8}, {149, 4}, {161, 4}, {64, 4}, {209, 12}, {159, 8}, {171, 8}, + {72, 8}, {183, 8}, {78, 8}, {96, 8}, {65, 5}, {195, 8}, {84, 8}, + {102, 8}, {67, 5}, {120, 8}, {73, 5}, {91, 5}, {64, 4}, {209, 12}, + {209, 12}, {174, 8}, {148, 6}, {186, 8}, {80, 8}, {98, 8}, {66, 6}, + {198, 8}, {86, 8}, {104, 8}, {68, 6}, {122, 8}, {74, 6}, {92, 6}, {3, 8}, {209, 12}, {157, 6}, {110, 8}, {70, 6}, {128, 8}, {76, 6}, {94, 6}, {5, 8}, {193, 6}, {82, 6}, {100, 6}, {9, 8}, {118, 6}, {17, 8}, {33, 8}, {0, 6}, {209, 12}, {209, 12}, {209, 12}, {209, 12}, @@ -10563,14727 +13422,24668 @@ const uint8_t utf8bigindex[4096][2] = { {193, 6}, {82, 6}, {48, 8}, {8, 7}, {118, 6}, {16, 7}, {32, 7}, {0, 6}}; } // namespace utf8_to_utf16 -} // namespace tables +} // namespace tables +} // unnamed namespace +} // namespace simdutf + +#endif // SIMDUTF_UTF8_TO_UTF16_TABLES_H +/* end file src/tables/utf8_to_utf16_tables.h */ +/* begin file src/tables/utf16_to_utf8_tables.h */ +// file generated by scripts/sse_convert_utf16_to_utf8.py +#ifndef SIMDUTF_UTF16_TO_UTF8_TABLES_H +#define SIMDUTF_UTF16_TO_UTF8_TABLES_H + +namespace simdutf { +namespace { +namespace tables { +namespace utf16_to_utf8 { + +// 1 byte for length, 16 bytes for mask +const uint8_t pack_1_2_utf8_bytes[256][17] = { + {16, 1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14}, + {15, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14, 0x80}, + {15, 1, 0, 3, 2, 5, 4, 7, 6, 8, 11, 10, 13, 12, 15, 14, 0x80}, + {14, 0, 3, 2, 5, 4, 7, 6, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80}, + {15, 1, 0, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14, 0x80}, + {14, 0, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80}, + {14, 1, 0, 2, 5, 4, 7, 6, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80}, + {13, 0, 2, 5, 4, 7, 6, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80}, + {15, 1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 10, 13, 12, 15, 14, 0x80}, + {14, 0, 3, 2, 5, 4, 7, 6, 9, 8, 10, 13, 12, 15, 14, 0x80, 0x80}, + {14, 1, 0, 3, 2, 5, 4, 7, 6, 8, 10, 13, 12, 15, 14, 0x80, 0x80}, + {13, 0, 3, 2, 5, 4, 7, 6, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80}, + {14, 1, 0, 2, 5, 4, 7, 6, 9, 8, 10, 13, 12, 15, 14, 0x80, 0x80}, + {13, 0, 2, 5, 4, 7, 6, 9, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80}, + {13, 1, 0, 2, 5, 4, 7, 6, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80}, + {12, 0, 2, 5, 4, 7, 6, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, + {15, 1, 0, 3, 2, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14, 0x80}, + {14, 0, 3, 2, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80}, + {14, 1, 0, 3, 2, 4, 7, 6, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80}, + {13, 0, 3, 2, 4, 7, 6, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80}, + {14, 1, 0, 2, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80}, + {13, 0, 2, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80}, + {13, 1, 0, 2, 4, 7, 6, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80}, + {12, 0, 2, 4, 7, 6, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, + {14, 1, 0, 3, 2, 4, 7, 6, 9, 8, 10, 13, 12, 15, 14, 0x80, 0x80}, + {13, 0, 3, 2, 4, 7, 6, 9, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80}, + {13, 1, 0, 3, 2, 4, 7, 6, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80}, + {12, 0, 3, 2, 4, 7, 6, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, + {13, 1, 0, 2, 4, 7, 6, 9, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80}, + {12, 0, 2, 4, 7, 6, 9, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, + {12, 1, 0, 2, 4, 7, 6, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, + {11, 0, 2, 4, 7, 6, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {15, 1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 12, 15, 14, 0x80}, + {14, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 12, 15, 14, 0x80, 0x80}, + {14, 1, 0, 3, 2, 5, 4, 7, 6, 8, 11, 10, 12, 15, 14, 0x80, 0x80}, + {13, 0, 3, 2, 5, 4, 7, 6, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80}, + {14, 1, 0, 2, 5, 4, 7, 6, 9, 8, 11, 10, 12, 15, 14, 0x80, 0x80}, + {13, 0, 2, 5, 4, 7, 6, 9, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80}, + {13, 1, 0, 2, 5, 4, 7, 6, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80}, + {12, 0, 2, 5, 4, 7, 6, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, + {14, 1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 10, 12, 15, 14, 0x80, 0x80}, + {13, 0, 3, 2, 5, 4, 7, 6, 9, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80}, + {13, 1, 0, 3, 2, 5, 4, 7, 6, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80}, + {12, 0, 3, 2, 5, 4, 7, 6, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, + {13, 1, 0, 2, 5, 4, 7, 6, 9, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80}, + {12, 0, 2, 5, 4, 7, 6, 9, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, + {12, 1, 0, 2, 5, 4, 7, 6, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, + {11, 0, 2, 5, 4, 7, 6, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {14, 1, 0, 3, 2, 4, 7, 6, 9, 8, 11, 10, 12, 15, 14, 0x80, 0x80}, + {13, 0, 3, 2, 4, 7, 6, 9, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80}, + {13, 1, 0, 3, 2, 4, 7, 6, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80}, + {12, 0, 3, 2, 4, 7, 6, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, + {13, 1, 0, 2, 4, 7, 6, 9, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80}, + {12, 0, 2, 4, 7, 6, 9, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, + {12, 1, 0, 2, 4, 7, 6, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, + {11, 0, 2, 4, 7, 6, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {13, 1, 0, 3, 2, 4, 7, 6, 9, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80}, + {12, 0, 3, 2, 4, 7, 6, 9, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, + {12, 1, 0, 3, 2, 4, 7, 6, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, + {11, 0, 3, 2, 4, 7, 6, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {12, 1, 0, 2, 4, 7, 6, 9, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, + {11, 0, 2, 4, 7, 6, 9, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {11, 1, 0, 2, 4, 7, 6, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {10, 0, 2, 4, 7, 6, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {15, 1, 0, 3, 2, 5, 4, 6, 9, 8, 11, 10, 13, 12, 15, 14, 0x80}, + {14, 0, 3, 2, 5, 4, 6, 9, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80}, + {14, 1, 0, 3, 2, 5, 4, 6, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80}, + {13, 0, 3, 2, 5, 4, 6, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80}, + {14, 1, 0, 2, 5, 4, 6, 9, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80}, + {13, 0, 2, 5, 4, 6, 9, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80}, + {13, 1, 0, 2, 5, 4, 6, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80}, + {12, 0, 2, 5, 4, 6, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, + {14, 1, 0, 3, 2, 5, 4, 6, 9, 8, 10, 13, 12, 15, 14, 0x80, 0x80}, + {13, 0, 3, 2, 5, 4, 6, 9, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80}, + {13, 1, 0, 3, 2, 5, 4, 6, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80}, + {12, 0, 3, 2, 5, 4, 6, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, + {13, 1, 0, 2, 5, 4, 6, 9, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80}, + {12, 0, 2, 5, 4, 6, 9, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, + {12, 1, 0, 2, 5, 4, 6, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, + {11, 0, 2, 5, 4, 6, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {14, 1, 0, 3, 2, 4, 6, 9, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80}, + {13, 0, 3, 2, 4, 6, 9, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80}, + {13, 1, 0, 3, 2, 4, 6, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80}, + {12, 0, 3, 2, 4, 6, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, + {13, 1, 0, 2, 4, 6, 9, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80}, + {12, 0, 2, 4, 6, 9, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, + {12, 1, 0, 2, 4, 6, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, + {11, 0, 2, 4, 6, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {13, 1, 0, 3, 2, 4, 6, 9, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80}, + {12, 0, 3, 2, 4, 6, 9, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, + {12, 1, 0, 3, 2, 4, 6, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, + {11, 0, 3, 2, 4, 6, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {12, 1, 0, 2, 4, 6, 9, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, + {11, 0, 2, 4, 6, 9, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {11, 1, 0, 2, 4, 6, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {10, 0, 2, 4, 6, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {14, 1, 0, 3, 2, 5, 4, 6, 9, 8, 11, 10, 12, 15, 14, 0x80, 0x80}, + {13, 0, 3, 2, 5, 4, 6, 9, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80}, + {13, 1, 0, 3, 2, 5, 4, 6, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80}, + {12, 0, 3, 2, 5, 4, 6, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, + {13, 1, 0, 2, 5, 4, 6, 9, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80}, + {12, 0, 2, 5, 4, 6, 9, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, + {12, 1, 0, 2, 5, 4, 6, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, + {11, 0, 2, 5, 4, 6, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {13, 1, 0, 3, 2, 5, 4, 6, 9, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80}, + {12, 0, 3, 2, 5, 4, 6, 9, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, + {12, 1, 0, 3, 2, 5, 4, 6, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, + {11, 0, 3, 2, 5, 4, 6, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {12, 1, 0, 2, 5, 4, 6, 9, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, + {11, 0, 2, 5, 4, 6, 9, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {11, 1, 0, 2, 5, 4, 6, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {10, 0, 2, 5, 4, 6, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {13, 1, 0, 3, 2, 4, 6, 9, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80}, + {12, 0, 3, 2, 4, 6, 9, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, + {12, 1, 0, 3, 2, 4, 6, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, + {11, 0, 3, 2, 4, 6, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {12, 1, 0, 2, 4, 6, 9, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, + {11, 0, 2, 4, 6, 9, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {11, 1, 0, 2, 4, 6, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {10, 0, 2, 4, 6, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {12, 1, 0, 3, 2, 4, 6, 9, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, + {11, 0, 3, 2, 4, 6, 9, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {11, 1, 0, 3, 2, 4, 6, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {10, 0, 3, 2, 4, 6, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {11, 1, 0, 2, 4, 6, 9, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {10, 0, 2, 4, 6, 9, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {10, 1, 0, 2, 4, 6, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {9, 0, 2, 4, 6, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {15, 1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 14, 0x80}, + {14, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 14, 0x80, 0x80}, + {14, 1, 0, 3, 2, 5, 4, 7, 6, 8, 11, 10, 13, 12, 14, 0x80, 0x80}, + {13, 0, 3, 2, 5, 4, 7, 6, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80}, + {14, 1, 0, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 14, 0x80, 0x80}, + {13, 0, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80}, + {13, 1, 0, 2, 5, 4, 7, 6, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80}, + {12, 0, 2, 5, 4, 7, 6, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80}, + {14, 1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 10, 13, 12, 14, 0x80, 0x80}, + {13, 0, 3, 2, 5, 4, 7, 6, 9, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80}, + {13, 1, 0, 3, 2, 5, 4, 7, 6, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80}, + {12, 0, 3, 2, 5, 4, 7, 6, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80}, + {13, 1, 0, 2, 5, 4, 7, 6, 9, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80}, + {12, 0, 2, 5, 4, 7, 6, 9, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80}, + {12, 1, 0, 2, 5, 4, 7, 6, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80}, + {11, 0, 2, 5, 4, 7, 6, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {14, 1, 0, 3, 2, 4, 7, 6, 9, 8, 11, 10, 13, 12, 14, 0x80, 0x80}, + {13, 0, 3, 2, 4, 7, 6, 9, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80}, + {13, 1, 0, 3, 2, 4, 7, 6, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80}, + {12, 0, 3, 2, 4, 7, 6, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80}, + {13, 1, 0, 2, 4, 7, 6, 9, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80}, + {12, 0, 2, 4, 7, 6, 9, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80}, + {12, 1, 0, 2, 4, 7, 6, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80}, + {11, 0, 2, 4, 7, 6, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {13, 1, 0, 3, 2, 4, 7, 6, 9, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80}, + {12, 0, 3, 2, 4, 7, 6, 9, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80}, + {12, 1, 0, 3, 2, 4, 7, 6, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80}, + {11, 0, 3, 2, 4, 7, 6, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {12, 1, 0, 2, 4, 7, 6, 9, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80}, + {11, 0, 2, 4, 7, 6, 9, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {11, 1, 0, 2, 4, 7, 6, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {10, 0, 2, 4, 7, 6, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {14, 1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 12, 14, 0x80, 0x80}, + {13, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80}, + {13, 1, 0, 3, 2, 5, 4, 7, 6, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80}, + {12, 0, 3, 2, 5, 4, 7, 6, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80}, + {13, 1, 0, 2, 5, 4, 7, 6, 9, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80}, + {12, 0, 2, 5, 4, 7, 6, 9, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80}, + {12, 1, 0, 2, 5, 4, 7, 6, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80}, + {11, 0, 2, 5, 4, 7, 6, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {13, 1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 10, 12, 14, 0x80, 0x80, 0x80}, + {12, 0, 3, 2, 5, 4, 7, 6, 9, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80}, + {12, 1, 0, 3, 2, 5, 4, 7, 6, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80}, + {11, 0, 3, 2, 5, 4, 7, 6, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {12, 1, 0, 2, 5, 4, 7, 6, 9, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80}, + {11, 0, 2, 5, 4, 7, 6, 9, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {11, 1, 0, 2, 5, 4, 7, 6, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {10, 0, 2, 5, 4, 7, 6, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {13, 1, 0, 3, 2, 4, 7, 6, 9, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80}, + {12, 0, 3, 2, 4, 7, 6, 9, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80}, + {12, 1, 0, 3, 2, 4, 7, 6, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80}, + {11, 0, 3, 2, 4, 7, 6, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {12, 1, 0, 2, 4, 7, 6, 9, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80}, + {11, 0, 2, 4, 7, 6, 9, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {11, 1, 0, 2, 4, 7, 6, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {10, 0, 2, 4, 7, 6, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {12, 1, 0, 3, 2, 4, 7, 6, 9, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80}, + {11, 0, 3, 2, 4, 7, 6, 9, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {11, 1, 0, 3, 2, 4, 7, 6, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {10, 0, 3, 2, 4, 7, 6, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {11, 1, 0, 2, 4, 7, 6, 9, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {10, 0, 2, 4, 7, 6, 9, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {10, 1, 0, 2, 4, 7, 6, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {9, 0, 2, 4, 7, 6, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {14, 1, 0, 3, 2, 5, 4, 6, 9, 8, 11, 10, 13, 12, 14, 0x80, 0x80}, + {13, 0, 3, 2, 5, 4, 6, 9, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80}, + {13, 1, 0, 3, 2, 5, 4, 6, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80}, + {12, 0, 3, 2, 5, 4, 6, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80}, + {13, 1, 0, 2, 5, 4, 6, 9, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80}, + {12, 0, 2, 5, 4, 6, 9, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80}, + {12, 1, 0, 2, 5, 4, 6, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80}, + {11, 0, 2, 5, 4, 6, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {13, 1, 0, 3, 2, 5, 4, 6, 9, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80}, + {12, 0, 3, 2, 5, 4, 6, 9, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80}, + {12, 1, 0, 3, 2, 5, 4, 6, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80}, + {11, 0, 3, 2, 5, 4, 6, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {12, 1, 0, 2, 5, 4, 6, 9, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80}, + {11, 0, 2, 5, 4, 6, 9, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {11, 1, 0, 2, 5, 4, 6, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {10, 0, 2, 5, 4, 6, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {13, 1, 0, 3, 2, 4, 6, 9, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80}, + {12, 0, 3, 2, 4, 6, 9, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80}, + {12, 1, 0, 3, 2, 4, 6, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80}, + {11, 0, 3, 2, 4, 6, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {12, 1, 0, 2, 4, 6, 9, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80}, + {11, 0, 2, 4, 6, 9, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {11, 1, 0, 2, 4, 6, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {10, 0, 2, 4, 6, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {12, 1, 0, 3, 2, 4, 6, 9, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80}, + {11, 0, 3, 2, 4, 6, 9, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {11, 1, 0, 3, 2, 4, 6, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {10, 0, 3, 2, 4, 6, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {11, 1, 0, 2, 4, 6, 9, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {10, 0, 2, 4, 6, 9, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {10, 1, 0, 2, 4, 6, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {9, 0, 2, 4, 6, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {13, 1, 0, 3, 2, 5, 4, 6, 9, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80}, + {12, 0, 3, 2, 5, 4, 6, 9, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80}, + {12, 1, 0, 3, 2, 5, 4, 6, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80}, + {11, 0, 3, 2, 5, 4, 6, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {12, 1, 0, 2, 5, 4, 6, 9, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80}, + {11, 0, 2, 5, 4, 6, 9, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {11, 1, 0, 2, 5, 4, 6, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {10, 0, 2, 5, 4, 6, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {12, 1, 0, 3, 2, 5, 4, 6, 9, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80}, + {11, 0, 3, 2, 5, 4, 6, 9, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {11, 1, 0, 3, 2, 5, 4, 6, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {10, 0, 3, 2, 5, 4, 6, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {11, 1, 0, 2, 5, 4, 6, 9, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {10, 0, 2, 5, 4, 6, 9, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {10, 1, 0, 2, 5, 4, 6, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {9, 0, 2, 5, 4, 6, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {12, 1, 0, 3, 2, 4, 6, 9, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80}, + {11, 0, 3, 2, 4, 6, 9, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {11, 1, 0, 3, 2, 4, 6, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {10, 0, 3, 2, 4, 6, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {11, 1, 0, 2, 4, 6, 9, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {10, 0, 2, 4, 6, 9, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {10, 1, 0, 2, 4, 6, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {9, 0, 2, 4, 6, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {11, 1, 0, 3, 2, 4, 6, 9, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, + {10, 0, 3, 2, 4, 6, 9, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {10, 1, 0, 3, 2, 4, 6, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {9, 0, 3, 2, 4, 6, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {10, 1, 0, 2, 4, 6, 9, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {9, 0, 2, 4, 6, 9, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {9, 1, 0, 2, 4, 6, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {8, 0, 2, 4, 6, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}}; + +// 1 byte for length, 16 bytes for mask +const uint8_t pack_1_2_3_utf8_bytes[256][17] = { + {12, 2, 3, 1, 6, 7, 5, 10, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80}, + {9, 6, 7, 5, 10, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {11, 3, 1, 6, 7, 5, 10, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80}, + {10, 0, 6, 7, 5, 10, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {9, 2, 3, 1, 10, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {6, 10, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {8, 3, 1, 10, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {7, 0, 10, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {11, 2, 3, 1, 7, 5, 10, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80}, + {8, 7, 5, 10, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {10, 3, 1, 7, 5, 10, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {9, 0, 7, 5, 10, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {10, 2, 3, 1, 4, 10, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {7, 4, 10, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {9, 3, 1, 4, 10, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {8, 0, 4, 10, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {9, 2, 3, 1, 6, 7, 5, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {6, 6, 7, 5, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {8, 3, 1, 6, 7, 5, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {7, 0, 6, 7, 5, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {6, 2, 3, 1, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {3, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80}, + {5, 3, 1, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {4, 0, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80}, + {8, 2, 3, 1, 7, 5, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {5, 7, 5, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {7, 3, 1, 7, 5, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {6, 0, 7, 5, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {7, 2, 3, 1, 4, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {4, 4, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80}, + {6, 3, 1, 4, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {5, 0, 4, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {11, 2, 3, 1, 6, 7, 5, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80}, + {8, 6, 7, 5, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {10, 3, 1, 6, 7, 5, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {9, 0, 6, 7, 5, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {8, 2, 3, 1, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {5, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {7, 3, 1, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {6, 0, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {10, 2, 3, 1, 7, 5, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {7, 7, 5, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {9, 3, 1, 7, 5, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {8, 0, 7, 5, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {9, 2, 3, 1, 4, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {6, 4, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {8, 3, 1, 4, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {7, 0, 4, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {10, 2, 3, 1, 6, 7, 5, 8, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {7, 6, 7, 5, 8, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {9, 3, 1, 6, 7, 5, 8, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {8, 0, 6, 7, 5, 8, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {7, 2, 3, 1, 8, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {4, 8, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80}, + {6, 3, 1, 8, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {5, 0, 8, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {9, 2, 3, 1, 7, 5, 8, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {6, 7, 5, 8, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {8, 3, 1, 7, 5, 8, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {7, 0, 7, 5, 8, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {8, 2, 3, 1, 4, 8, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {5, 4, 8, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {7, 3, 1, 4, 8, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {6, 0, 4, 8, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {9, 2, 3, 1, 6, 7, 5, 10, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {6, 6, 7, 5, 10, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {8, 3, 1, 6, 7, 5, 10, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {7, 0, 6, 7, 5, 10, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {6, 2, 3, 1, 10, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {3, 10, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80}, + {5, 3, 1, 10, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {4, 0, 10, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80}, + {8, 2, 3, 1, 7, 5, 10, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {5, 7, 5, 10, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {7, 3, 1, 7, 5, 10, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {6, 0, 7, 5, 10, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {7, 2, 3, 1, 4, 10, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {4, 4, 10, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80}, + {6, 3, 1, 4, 10, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {5, 0, 4, 10, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {6, 2, 3, 1, 6, 7, 5, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {3, 6, 7, 5, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80}, + {5, 3, 1, 6, 7, 5, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {4, 0, 6, 7, 5, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {3, 2, 3, 1, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80}, + {0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80}, + {2, 3, 1, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80}, + {1, 0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80}, + {5, 2, 3, 1, 7, 5, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {2, 7, 5, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80}, + {4, 3, 1, 7, 5, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {3, 0, 7, 5, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80}, + {4, 2, 3, 1, 4, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {1, 4, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80}, + {3, 3, 1, 4, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80}, + {2, 0, 4, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80}, + {8, 2, 3, 1, 6, 7, 5, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {5, 6, 7, 5, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {7, 3, 1, 6, 7, 5, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {6, 0, 6, 7, 5, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {5, 2, 3, 1, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {2, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80}, + {4, 3, 1, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {3, 0, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80}, + {7, 2, 3, 1, 7, 5, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {4, 7, 5, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {6, 3, 1, 7, 5, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {5, 0, 7, 5, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {6, 2, 3, 1, 4, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {3, 4, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80}, + {5, 3, 1, 4, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {4, 0, 4, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {7, 2, 3, 1, 6, 7, 5, 8, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {4, 6, 7, 5, 8, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {6, 3, 1, 6, 7, 5, 8, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {5, 0, 6, 7, 5, 8, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {4, 2, 3, 1, 8, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {1, 8, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80}, + {3, 3, 1, 8, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80}, + {2, 0, 8, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80}, + {6, 2, 3, 1, 7, 5, 8, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {3, 7, 5, 8, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80}, + {5, 3, 1, 7, 5, 8, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {4, 0, 7, 5, 8, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {5, 2, 3, 1, 4, 8, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {2, 4, 8, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80}, + {4, 3, 1, 4, 8, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {3, 0, 4, 8, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80}, + {11, 2, 3, 1, 6, 7, 5, 10, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80}, + {8, 6, 7, 5, 10, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {10, 3, 1, 6, 7, 5, 10, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {9, 0, 6, 7, 5, 10, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {8, 2, 3, 1, 10, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {5, 10, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {7, 3, 1, 10, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {6, 0, 10, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {10, 2, 3, 1, 7, 5, 10, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {7, 7, 5, 10, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {9, 3, 1, 7, 5, 10, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {8, 0, 7, 5, 10, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {9, 2, 3, 1, 4, 10, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {6, 4, 10, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {8, 3, 1, 4, 10, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {7, 0, 4, 10, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {8, 2, 3, 1, 6, 7, 5, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {5, 6, 7, 5, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {7, 3, 1, 6, 7, 5, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {6, 0, 6, 7, 5, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {5, 2, 3, 1, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {2, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80}, + {4, 3, 1, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80}, + {3, 0, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80}, + {7, 2, 3, 1, 7, 5, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {4, 7, 5, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80}, + {6, 3, 1, 7, 5, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {5, 0, 7, 5, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {6, 2, 3, 1, 4, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {3, 4, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80}, + {5, 3, 1, 4, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {4, 0, 4, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80}, + {10, 2, 3, 1, 6, 7, 5, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {7, 6, 7, 5, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {9, 3, 1, 6, 7, 5, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {8, 0, 6, 7, 5, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {7, 2, 3, 1, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {4, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80}, + {6, 3, 1, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {5, 0, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {9, 2, 3, 1, 7, 5, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {6, 7, 5, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {8, 3, 1, 7, 5, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {7, 0, 7, 5, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {8, 2, 3, 1, 4, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {5, 4, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {7, 3, 1, 4, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {6, 0, 4, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {9, 2, 3, 1, 6, 7, 5, 8, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {6, 6, 7, 5, 8, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {8, 3, 1, 6, 7, 5, 8, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {7, 0, 6, 7, 5, 8, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {6, 2, 3, 1, 8, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {3, 8, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80}, + {5, 3, 1, 8, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {4, 0, 8, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80}, + {8, 2, 3, 1, 7, 5, 8, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {5, 7, 5, 8, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {7, 3, 1, 7, 5, 8, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {6, 0, 7, 5, 8, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {7, 2, 3, 1, 4, 8, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {4, 4, 8, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80}, + {6, 3, 1, 4, 8, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {5, 0, 4, 8, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {10, 2, 3, 1, 6, 7, 5, 10, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {7, 6, 7, 5, 10, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {9, 3, 1, 6, 7, 5, 10, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {8, 0, 6, 7, 5, 10, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {7, 2, 3, 1, 10, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {4, 10, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80}, + {6, 3, 1, 10, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {5, 0, 10, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {9, 2, 3, 1, 7, 5, 10, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {6, 7, 5, 10, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {8, 3, 1, 7, 5, 10, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {7, 0, 7, 5, 10, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {8, 2, 3, 1, 4, 10, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {5, 4, 10, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {7, 3, 1, 4, 10, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {6, 0, 4, 10, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {7, 2, 3, 1, 6, 7, 5, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {4, 6, 7, 5, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {6, 3, 1, 6, 7, 5, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {5, 0, 6, 7, 5, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {4, 2, 3, 1, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {1, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80}, + {3, 3, 1, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80}, + {2, 0, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80}, + {6, 2, 3, 1, 7, 5, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {3, 7, 5, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80}, + {5, 3, 1, 7, 5, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {4, 0, 7, 5, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {5, 2, 3, 1, 4, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {2, 4, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80}, + {4, 3, 1, 4, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {3, 0, 4, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80}, + {9, 2, 3, 1, 6, 7, 5, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, + {6, 6, 7, 5, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {8, 3, 1, 6, 7, 5, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {7, 0, 6, 7, 5, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {6, 2, 3, 1, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {3, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80}, + {5, 3, 1, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {4, 0, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80}, + {8, 2, 3, 1, 7, 5, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {5, 7, 5, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {7, 3, 1, 7, 5, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {6, 0, 7, 5, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {7, 2, 3, 1, 4, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {4, 4, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80}, + {6, 3, 1, 4, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {5, 0, 4, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {8, 2, 3, 1, 6, 7, 5, 8, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {5, 6, 7, 5, 8, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {7, 3, 1, 6, 7, 5, 8, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {6, 0, 6, 7, 5, 8, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {5, 2, 3, 1, 8, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {2, 8, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80}, + {4, 3, 1, 8, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {3, 0, 8, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80}, + {7, 2, 3, 1, 7, 5, 8, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {4, 7, 5, 8, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {6, 3, 1, 7, 5, 8, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {5, 0, 7, 5, 8, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {6, 2, 3, 1, 4, 8, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80}, + {3, 4, 8, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80}, + {5, 3, 1, 4, 8, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}, + {4, 0, 4, 8, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80}}; + +} // namespace utf16_to_utf8 +} // namespace tables +} // unnamed namespace +} // namespace simdutf + +#endif // SIMDUTF_UTF16_TO_UTF8_TABLES_H +/* end file src/tables/utf16_to_utf8_tables.h */ +// End of tables. + +// The scalar routines should be included once. +/* begin file src/scalar/ascii.h */ +#ifndef SIMDUTF_ASCII_H +#define SIMDUTF_ASCII_H + +namespace simdutf { +namespace scalar { +namespace { +namespace ascii { +#if SIMDUTF_IMPLEMENTATION_FALLBACK +// Only used by the fallback kernel. +inline simdutf_warn_unused bool validate(const char *buf, size_t len) noexcept { + const uint8_t *data = reinterpret_cast(buf); + uint64_t pos = 0; + // process in blocks of 16 bytes when possible + for (; pos + 16 <= len; pos += 16) { + uint64_t v1; + std::memcpy(&v1, data + pos, sizeof(uint64_t)); + uint64_t v2; + std::memcpy(&v2, data + pos + sizeof(uint64_t), sizeof(uint64_t)); + uint64_t v{v1 | v2}; + if ((v & 0x8080808080808080) != 0) { + return false; + } + } + // process the tail byte-by-byte + for (; pos < len; pos++) { + if (data[pos] >= 0b10000000) { + return false; + } + } + return true; +} +#endif + +inline simdutf_warn_unused result validate_with_errors(const char *buf, + size_t len) noexcept { + const uint8_t *data = reinterpret_cast(buf); + size_t pos = 0; + // process in blocks of 16 bytes when possible + for (; pos + 16 <= len; pos += 16) { + uint64_t v1; + std::memcpy(&v1, data + pos, sizeof(uint64_t)); + uint64_t v2; + std::memcpy(&v2, data + pos + sizeof(uint64_t), sizeof(uint64_t)); + uint64_t v{v1 | v2}; + if ((v & 0x8080808080808080) != 0) { + for (; pos < len; pos++) { + if (data[pos] >= 0b10000000) { + return result(error_code::TOO_LARGE, pos); + } + } + } + } + // process the tail byte-by-byte + for (; pos < len; pos++) { + if (data[pos] >= 0b10000000) { + return result(error_code::TOO_LARGE, pos); + } + } + return result(error_code::SUCCESS, pos); +} + +} // namespace ascii +} // unnamed namespace +} // namespace scalar +} // namespace simdutf + +#endif +/* end file src/scalar/ascii.h */ +/* begin file src/scalar/latin1.h */ +#ifndef SIMDUTF_LATIN1_H +#define SIMDUTF_LATIN1_H + +namespace simdutf { +namespace scalar { +namespace { +namespace latin1 { + +inline size_t utf32_length_from_latin1(size_t len) { + // We are not BOM aware. + return len; // a utf32 unit will always represent 1 latin1 character +} + +inline size_t utf8_length_from_latin1(const char *buf, size_t len) { + const uint8_t *c = reinterpret_cast(buf); + size_t answer = 0; + for (size_t i = 0; i < len; i++) { + if ((c[i] >> 7)) { + answer++; + } + } + return answer + len; +} + +inline size_t utf16_length_from_latin1(size_t len) { return len; } + +} // namespace latin1 +} // unnamed namespace +} // namespace scalar +} // namespace simdutf + +#endif +/* end file src/scalar/latin1.h */ + +/* begin file src/scalar/utf32_to_utf8/valid_utf32_to_utf8.h */ +#ifndef SIMDUTF_VALID_UTF32_TO_UTF8_H +#define SIMDUTF_VALID_UTF32_TO_UTF8_H + +namespace simdutf { +namespace scalar { +namespace { +namespace utf32_to_utf8 { + +#if SIMDUTF_IMPLEMENTATION_FALLBACK || SIMDUTF_IMPLEMENTATION_PPC64 +// only used by the fallback and POWER kernel +inline size_t convert_valid(const char32_t *buf, size_t len, + char *utf8_output) { + const uint32_t *data = reinterpret_cast(buf); + size_t pos = 0; + char *start{utf8_output}; + while (pos < len) { + // try to convert the next block of 2 ASCII characters + if (pos + 2 <= + len) { // if it is safe to read 8 more bytes, check that they are ascii + uint64_t v; + ::memcpy(&v, data + pos, sizeof(uint64_t)); + if ((v & 0xFFFFFF80FFFFFF80) == 0) { + *utf8_output++ = char(buf[pos]); + *utf8_output++ = char(buf[pos + 1]); + pos += 2; + continue; + } + } + uint32_t word = data[pos]; + if ((word & 0xFFFFFF80) == 0) { + // will generate one UTF-8 bytes + *utf8_output++ = char(word); + pos++; + } else if ((word & 0xFFFFF800) == 0) { + // will generate two UTF-8 bytes + // we have 0b110XXXXX 0b10XXXXXX + *utf8_output++ = char((word >> 6) | 0b11000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + pos++; + } else if ((word & 0xFFFF0000) == 0) { + // will generate three UTF-8 bytes + // we have 0b1110XXXX 0b10XXXXXX 0b10XXXXXX + *utf8_output++ = char((word >> 12) | 0b11100000); + *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + pos++; + } else { + // will generate four UTF-8 bytes + // we have 0b11110XXX 0b10XXXXXX 0b10XXXXXX 0b10XXXXXX + *utf8_output++ = char((word >> 18) | 0b11110000); + *utf8_output++ = char(((word >> 12) & 0b111111) | 0b10000000); + *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + pos++; + } + } + return utf8_output - start; +} +#endif // SIMDUTF_IMPLEMENTATION_FALLBACK || SIMDUTF_IMPLEMENTATION_PPC64 + +} // namespace utf32_to_utf8 +} // unnamed namespace +} // namespace scalar +} // namespace simdutf + +#endif +/* end file src/scalar/utf32_to_utf8/valid_utf32_to_utf8.h */ +/* begin file src/scalar/utf32_to_utf8/utf32_to_utf8.h */ +#ifndef SIMDUTF_UTF32_TO_UTF8_H +#define SIMDUTF_UTF32_TO_UTF8_H + +namespace simdutf { +namespace scalar { +namespace { +namespace utf32_to_utf8 { + +inline size_t convert(const char32_t *buf, size_t len, char *utf8_output) { + const uint32_t *data = reinterpret_cast(buf); + size_t pos = 0; + char *start{utf8_output}; + while (pos < len) { + // try to convert the next block of 2 ASCII characters + if (pos + 2 <= + len) { // if it is safe to read 8 more bytes, check that they are ascii + uint64_t v; + ::memcpy(&v, data + pos, sizeof(uint64_t)); + if ((v & 0xFFFFFF80FFFFFF80) == 0) { + *utf8_output++ = char(buf[pos]); + *utf8_output++ = char(buf[pos + 1]); + pos += 2; + continue; + } + } + uint32_t word = data[pos]; + if ((word & 0xFFFFFF80) == 0) { + // will generate one UTF-8 bytes + *utf8_output++ = char(word); + pos++; + } else if ((word & 0xFFFFF800) == 0) { + // will generate two UTF-8 bytes + // we have 0b110XXXXX 0b10XXXXXX + *utf8_output++ = char((word >> 6) | 0b11000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + pos++; + } else if ((word & 0xFFFF0000) == 0) { + // will generate three UTF-8 bytes + // we have 0b1110XXXX 0b10XXXXXX 0b10XXXXXX + if (word >= 0xD800 && word <= 0xDFFF) { + return 0; + } + *utf8_output++ = char((word >> 12) | 0b11100000); + *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + pos++; + } else { + // will generate four UTF-8 bytes + // we have 0b11110XXX 0b10XXXXXX 0b10XXXXXX 0b10XXXXXX + if (word > 0x10FFFF) { + return 0; + } + *utf8_output++ = char((word >> 18) | 0b11110000); + *utf8_output++ = char(((word >> 12) & 0b111111) | 0b10000000); + *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + pos++; + } + } + return utf8_output - start; +} + +inline result convert_with_errors(const char32_t *buf, size_t len, + char *utf8_output) { + const uint32_t *data = reinterpret_cast(buf); + size_t pos = 0; + char *start{utf8_output}; + while (pos < len) { + // try to convert the next block of 2 ASCII characters + if (pos + 2 <= + len) { // if it is safe to read 8 more bytes, check that they are ascii + uint64_t v; + ::memcpy(&v, data + pos, sizeof(uint64_t)); + if ((v & 0xFFFFFF80FFFFFF80) == 0) { + *utf8_output++ = char(buf[pos]); + *utf8_output++ = char(buf[pos + 1]); + pos += 2; + continue; + } + } + uint32_t word = data[pos]; + if ((word & 0xFFFFFF80) == 0) { + // will generate one UTF-8 bytes + *utf8_output++ = char(word); + pos++; + } else if ((word & 0xFFFFF800) == 0) { + // will generate two UTF-8 bytes + // we have 0b110XXXXX 0b10XXXXXX + *utf8_output++ = char((word >> 6) | 0b11000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + pos++; + } else if ((word & 0xFFFF0000) == 0) { + // will generate three UTF-8 bytes + // we have 0b1110XXXX 0b10XXXXXX 0b10XXXXXX + if (word >= 0xD800 && word <= 0xDFFF) { + return result(error_code::SURROGATE, pos); + } + *utf8_output++ = char((word >> 12) | 0b11100000); + *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + pos++; + } else { + // will generate four UTF-8 bytes + // we have 0b11110XXX 0b10XXXXXX 0b10XXXXXX 0b10XXXXXX + if (word > 0x10FFFF) { + return result(error_code::TOO_LARGE, pos); + } + *utf8_output++ = char((word >> 18) | 0b11110000); + *utf8_output++ = char(((word >> 12) & 0b111111) | 0b10000000); + *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + pos++; + } + } + return result(error_code::SUCCESS, utf8_output - start); +} + +} // namespace utf32_to_utf8 +} // unnamed namespace +} // namespace scalar +} // namespace simdutf + +#endif +/* end file src/scalar/utf32_to_utf8/utf32_to_utf8.h */ + +/* begin file src/scalar/utf32_to_utf16/valid_utf32_to_utf16.h */ +#ifndef SIMDUTF_VALID_UTF32_TO_UTF16_H +#define SIMDUTF_VALID_UTF32_TO_UTF16_H + +namespace simdutf { +namespace scalar { +namespace { +namespace utf32_to_utf16 { + +template +inline size_t convert_valid(const char32_t *buf, size_t len, + char16_t *utf16_output) { + const uint32_t *data = reinterpret_cast(buf); + size_t pos = 0; + char16_t *start{utf16_output}; + while (pos < len) { + uint32_t word = data[pos]; + if ((word & 0xFFFF0000) == 0) { + // will not generate a surrogate pair + *utf16_output++ = !match_system(big_endian) + ? char16_t(utf16::swap_bytes(uint16_t(word))) + : char16_t(word); + pos++; + } else { + // will generate a surrogate pair + word -= 0x10000; + uint16_t high_surrogate = uint16_t(0xD800 + (word >> 10)); + uint16_t low_surrogate = uint16_t(0xDC00 + (word & 0x3FF)); + if (!match_system(big_endian)) { + high_surrogate = utf16::swap_bytes(high_surrogate); + low_surrogate = utf16::swap_bytes(low_surrogate); + } + *utf16_output++ = char16_t(high_surrogate); + *utf16_output++ = char16_t(low_surrogate); + pos++; + } + } + return utf16_output - start; +} + +} // namespace utf32_to_utf16 +} // unnamed namespace +} // namespace scalar +} // namespace simdutf + +#endif +/* end file src/scalar/utf32_to_utf16/valid_utf32_to_utf16.h */ +/* begin file src/scalar/utf32_to_utf16/utf32_to_utf16.h */ +#ifndef SIMDUTF_UTF32_TO_UTF16_H +#define SIMDUTF_UTF32_TO_UTF16_H + +namespace simdutf { +namespace scalar { +namespace { +namespace utf32_to_utf16 { + +template +inline size_t convert(const char32_t *buf, size_t len, char16_t *utf16_output) { + const uint32_t *data = reinterpret_cast(buf); + size_t pos = 0; + char16_t *start{utf16_output}; + while (pos < len) { + uint32_t word = data[pos]; + if ((word & 0xFFFF0000) == 0) { + if (word >= 0xD800 && word <= 0xDFFF) { + return 0; + } + // will not generate a surrogate pair + *utf16_output++ = !match_system(big_endian) + ? char16_t(utf16::swap_bytes(uint16_t(word))) + : char16_t(word); + } else { + // will generate a surrogate pair + if (word > 0x10FFFF) { + return 0; + } + word -= 0x10000; + uint16_t high_surrogate = uint16_t(0xD800 + (word >> 10)); + uint16_t low_surrogate = uint16_t(0xDC00 + (word & 0x3FF)); + if (!match_system(big_endian)) { + high_surrogate = utf16::swap_bytes(high_surrogate); + low_surrogate = utf16::swap_bytes(low_surrogate); + } + *utf16_output++ = char16_t(high_surrogate); + *utf16_output++ = char16_t(low_surrogate); + } + pos++; + } + return utf16_output - start; +} + +template +inline result convert_with_errors(const char32_t *buf, size_t len, + char16_t *utf16_output) { + const uint32_t *data = reinterpret_cast(buf); + size_t pos = 0; + char16_t *start{utf16_output}; + while (pos < len) { + uint32_t word = data[pos]; + if ((word & 0xFFFF0000) == 0) { + if (word >= 0xD800 && word <= 0xDFFF) { + return result(error_code::SURROGATE, pos); + } + // will not generate a surrogate pair + *utf16_output++ = !match_system(big_endian) + ? char16_t(utf16::swap_bytes(uint16_t(word))) + : char16_t(word); + } else { + // will generate a surrogate pair + if (word > 0x10FFFF) { + return result(error_code::TOO_LARGE, pos); + } + word -= 0x10000; + uint16_t high_surrogate = uint16_t(0xD800 + (word >> 10)); + uint16_t low_surrogate = uint16_t(0xDC00 + (word & 0x3FF)); + if (!match_system(big_endian)) { + high_surrogate = utf16::swap_bytes(high_surrogate); + low_surrogate = utf16::swap_bytes(low_surrogate); + } + *utf16_output++ = char16_t(high_surrogate); + *utf16_output++ = char16_t(low_surrogate); + } + pos++; + } + return result(error_code::SUCCESS, utf16_output - start); +} + +} // namespace utf32_to_utf16 +} // unnamed namespace +} // namespace scalar +} // namespace simdutf + +#endif +/* end file src/scalar/utf32_to_utf16/utf32_to_utf16.h */ + +/* begin file src/scalar/utf16_to_utf8/valid_utf16_to_utf8.h */ +#ifndef SIMDUTF_VALID_UTF16_TO_UTF8_H +#define SIMDUTF_VALID_UTF16_TO_UTF8_H + +namespace simdutf { +namespace scalar { +namespace { +namespace utf16_to_utf8 { + +template +inline size_t convert_valid(const char16_t *buf, size_t len, + char *utf8_output) { + const uint16_t *data = reinterpret_cast(buf); + size_t pos = 0; + char *start{utf8_output}; + while (pos < len) { + // try to convert the next block of 4 ASCII characters + if (pos + 4 <= + len) { // if it is safe to read 8 more bytes, check that they are ascii + uint64_t v; + ::memcpy(&v, data + pos, sizeof(uint64_t)); + if (!match_system(big_endian)) { + v = (v >> 8) | (v << (64 - 8)); + } + if ((v & 0xFF80FF80FF80FF80) == 0) { + size_t final_pos = pos + 4; + while (pos < final_pos) { + *utf8_output++ = !match_system(big_endian) + ? char(utf16::swap_bytes(buf[pos])) + : char(buf[pos]); + pos++; + } + continue; + } + } + + uint16_t word = + !match_system(big_endian) ? utf16::swap_bytes(data[pos]) : data[pos]; + if ((word & 0xFF80) == 0) { + // will generate one UTF-8 bytes + *utf8_output++ = char(word); + pos++; + } else if ((word & 0xF800) == 0) { + // will generate two UTF-8 bytes + // we have 0b110XXXXX 0b10XXXXXX + *utf8_output++ = char((word >> 6) | 0b11000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + pos++; + } else if ((word & 0xF800) != 0xD800) { + // will generate three UTF-8 bytes + // we have 0b1110XXXX 0b10XXXXXX 0b10XXXXXX + *utf8_output++ = char((word >> 12) | 0b11100000); + *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + pos++; + } else { + // must be a surrogate pair + uint16_t diff = uint16_t(word - 0xD800); + if (pos + 1 >= len) { + return 0; + } // minimal bound checking + uint16_t next_word = !match_system(big_endian) + ? utf16::swap_bytes(data[pos + 1]) + : data[pos + 1]; + uint16_t diff2 = uint16_t(next_word - 0xDC00); + uint32_t value = (diff << 10) + diff2 + 0x10000; + // will generate four UTF-8 bytes + // we have 0b11110XXX 0b10XXXXXX 0b10XXXXXX 0b10XXXXXX + *utf8_output++ = char((value >> 18) | 0b11110000); + *utf8_output++ = char(((value >> 12) & 0b111111) | 0b10000000); + *utf8_output++ = char(((value >> 6) & 0b111111) | 0b10000000); + *utf8_output++ = char((value & 0b111111) | 0b10000000); + pos += 2; + } + } + return utf8_output - start; +} + +} // namespace utf16_to_utf8 +} // unnamed namespace +} // namespace scalar +} // namespace simdutf + +#endif +/* end file src/scalar/utf16_to_utf8/valid_utf16_to_utf8.h */ +/* begin file src/scalar/utf16_to_utf8/utf16_to_utf8.h */ +#ifndef SIMDUTF_UTF16_TO_UTF8_H +#define SIMDUTF_UTF16_TO_UTF8_H + +namespace simdutf { +namespace scalar { +namespace { +namespace utf16_to_utf8 { + +template +inline size_t convert(const char16_t *buf, size_t len, char *utf8_output) { + const uint16_t *data = reinterpret_cast(buf); + size_t pos = 0; + char *start{utf8_output}; + while (pos < len) { + // try to convert the next block of 8 bytes + if (pos + 4 <= + len) { // if it is safe to read 8 more bytes, check that they are ascii + uint64_t v; + ::memcpy(&v, data + pos, sizeof(uint64_t)); + if (!match_system(big_endian)) { + v = (v >> 8) | (v << (64 - 8)); + } + if ((v & 0xFF80FF80FF80FF80) == 0) { + size_t final_pos = pos + 4; + while (pos < final_pos) { + *utf8_output++ = !match_system(big_endian) + ? char(utf16::swap_bytes(buf[pos])) + : char(buf[pos]); + pos++; + } + continue; + } + } + uint16_t word = + !match_system(big_endian) ? utf16::swap_bytes(data[pos]) : data[pos]; + if ((word & 0xFF80) == 0) { + // will generate one UTF-8 bytes + *utf8_output++ = char(word); + pos++; + } else if ((word & 0xF800) == 0) { + // will generate two UTF-8 bytes + // we have 0b110XXXXX 0b10XXXXXX + *utf8_output++ = char((word >> 6) | 0b11000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + pos++; + } else if ((word & 0xF800) != 0xD800) { + // will generate three UTF-8 bytes + // we have 0b1110XXXX 0b10XXXXXX 0b10XXXXXX + *utf8_output++ = char((word >> 12) | 0b11100000); + *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + pos++; + } else { + // must be a surrogate pair + if (pos + 1 >= len) { + return 0; + } + uint16_t diff = uint16_t(word - 0xD800); + if (diff > 0x3FF) { + return 0; + } + uint16_t next_word = !match_system(big_endian) + ? utf16::swap_bytes(data[pos + 1]) + : data[pos + 1]; + uint16_t diff2 = uint16_t(next_word - 0xDC00); + if (diff2 > 0x3FF) { + return 0; + } + uint32_t value = (diff << 10) + diff2 + 0x10000; + // will generate four UTF-8 bytes + // we have 0b11110XXX 0b10XXXXXX 0b10XXXXXX 0b10XXXXXX + *utf8_output++ = char((value >> 18) | 0b11110000); + *utf8_output++ = char(((value >> 12) & 0b111111) | 0b10000000); + *utf8_output++ = char(((value >> 6) & 0b111111) | 0b10000000); + *utf8_output++ = char((value & 0b111111) | 0b10000000); + pos += 2; + } + } + return utf8_output - start; +} + +template +inline result convert_with_errors(const char16_t *buf, size_t len, + char *utf8_output) { + const uint16_t *data = reinterpret_cast(buf); + size_t pos = 0; + char *start{utf8_output}; + while (pos < len) { + // try to convert the next block of 8 bytes + if (pos + 4 <= + len) { // if it is safe to read 8 more bytes, check that they are ascii + uint64_t v; + ::memcpy(&v, data + pos, sizeof(uint64_t)); + if (!match_system(big_endian)) + v = (v >> 8) | (v << (64 - 8)); + if ((v & 0xFF80FF80FF80FF80) == 0) { + size_t final_pos = pos + 4; + while (pos < final_pos) { + *utf8_output++ = !match_system(big_endian) + ? char(utf16::swap_bytes(buf[pos])) + : char(buf[pos]); + pos++; + } + continue; + } + } + uint16_t word = + !match_system(big_endian) ? utf16::swap_bytes(data[pos]) : data[pos]; + if ((word & 0xFF80) == 0) { + // will generate one UTF-8 bytes + *utf8_output++ = char(word); + pos++; + } else if ((word & 0xF800) == 0) { + // will generate two UTF-8 bytes + // we have 0b110XXXXX 0b10XXXXXX + *utf8_output++ = char((word >> 6) | 0b11000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + pos++; + } else if ((word & 0xF800) != 0xD800) { + // will generate three UTF-8 bytes + // we have 0b1110XXXX 0b10XXXXXX 0b10XXXXXX + *utf8_output++ = char((word >> 12) | 0b11100000); + *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + pos++; + } else { + // must be a surrogate pair + if (pos + 1 >= len) { + return result(error_code::SURROGATE, pos); + } + uint16_t diff = uint16_t(word - 0xD800); + if (diff > 0x3FF) { + return result(error_code::SURROGATE, pos); + } + uint16_t next_word = !match_system(big_endian) + ? utf16::swap_bytes(data[pos + 1]) + : data[pos + 1]; + uint16_t diff2 = uint16_t(next_word - 0xDC00); + if (diff2 > 0x3FF) { + return result(error_code::SURROGATE, pos); + } + uint32_t value = (diff << 10) + diff2 + 0x10000; + // will generate four UTF-8 bytes + // we have 0b11110XXX 0b10XXXXXX 0b10XXXXXX 0b10XXXXXX + *utf8_output++ = char((value >> 18) | 0b11110000); + *utf8_output++ = char(((value >> 12) & 0b111111) | 0b10000000); + *utf8_output++ = char(((value >> 6) & 0b111111) | 0b10000000); + *utf8_output++ = char((value & 0b111111) | 0b10000000); + pos += 2; + } + } + return result(error_code::SUCCESS, utf8_output - start); +} + +} // namespace utf16_to_utf8 +} // unnamed namespace +} // namespace scalar +} // namespace simdutf + +#endif +/* end file src/scalar/utf16_to_utf8/utf16_to_utf8.h */ + +/* begin file src/scalar/utf16_to_utf32/valid_utf16_to_utf32.h */ +#ifndef SIMDUTF_VALID_UTF16_TO_UTF32_H +#define SIMDUTF_VALID_UTF16_TO_UTF32_H + +namespace simdutf { +namespace scalar { +namespace { +namespace utf16_to_utf32 { + +template +inline size_t convert_valid(const char16_t *buf, size_t len, + char32_t *utf32_output) { + const uint16_t *data = reinterpret_cast(buf); + size_t pos = 0; + char32_t *start{utf32_output}; + while (pos < len) { + uint16_t word = + !match_system(big_endian) ? utf16::swap_bytes(data[pos]) : data[pos]; + if ((word & 0xF800) != 0xD800) { + // No surrogate pair, extend 16-bit word to 32-bit word + *utf32_output++ = char32_t(word); + pos++; + } else { + // must be a surrogate pair + uint16_t diff = uint16_t(word - 0xD800); + if (pos + 1 >= len) { + return 0; + } // minimal bound checking + uint16_t next_word = !match_system(big_endian) + ? utf16::swap_bytes(data[pos + 1]) + : data[pos + 1]; + uint16_t diff2 = uint16_t(next_word - 0xDC00); + uint32_t value = (diff << 10) + diff2 + 0x10000; + *utf32_output++ = char32_t(value); + pos += 2; + } + } + return utf32_output - start; +} + +} // namespace utf16_to_utf32 +} // unnamed namespace +} // namespace scalar +} // namespace simdutf + +#endif +/* end file src/scalar/utf16_to_utf32/valid_utf16_to_utf32.h */ +/* begin file src/scalar/utf16_to_utf32/utf16_to_utf32.h */ +#ifndef SIMDUTF_UTF16_TO_UTF32_H +#define SIMDUTF_UTF16_TO_UTF32_H + +namespace simdutf { +namespace scalar { +namespace { +namespace utf16_to_utf32 { + +template +inline size_t convert(const char16_t *buf, size_t len, char32_t *utf32_output) { + const uint16_t *data = reinterpret_cast(buf); + size_t pos = 0; + char32_t *start{utf32_output}; + while (pos < len) { + uint16_t word = + !match_system(big_endian) ? utf16::swap_bytes(data[pos]) : data[pos]; + if ((word & 0xF800) != 0xD800) { + // No surrogate pair, extend 16-bit word to 32-bit word + *utf32_output++ = char32_t(word); + pos++; + } else { + // must be a surrogate pair + uint16_t diff = uint16_t(word - 0xD800); + if (diff > 0x3FF) { + return 0; + } + if (pos + 1 >= len) { + return 0; + } // minimal bound checking + uint16_t next_word = !match_system(big_endian) + ? utf16::swap_bytes(data[pos + 1]) + : data[pos + 1]; + uint16_t diff2 = uint16_t(next_word - 0xDC00); + if (diff2 > 0x3FF) { + return 0; + } + uint32_t value = (diff << 10) + diff2 + 0x10000; + *utf32_output++ = char32_t(value); + pos += 2; + } + } + return utf32_output - start; +} + +template +inline result convert_with_errors(const char16_t *buf, size_t len, + char32_t *utf32_output) { + const uint16_t *data = reinterpret_cast(buf); + size_t pos = 0; + char32_t *start{utf32_output}; + while (pos < len) { + uint16_t word = + !match_system(big_endian) ? utf16::swap_bytes(data[pos]) : data[pos]; + if ((word & 0xF800) != 0xD800) { + // No surrogate pair, extend 16-bit word to 32-bit word + *utf32_output++ = char32_t(word); + pos++; + } else { + // must be a surrogate pair + uint16_t diff = uint16_t(word - 0xD800); + if (diff > 0x3FF) { + return result(error_code::SURROGATE, pos); + } + if (pos + 1 >= len) { + return result(error_code::SURROGATE, pos); + } // minimal bound checking + uint16_t next_word = !match_system(big_endian) + ? utf16::swap_bytes(data[pos + 1]) + : data[pos + 1]; + uint16_t diff2 = uint16_t(next_word - 0xDC00); + if (diff2 > 0x3FF) { + return result(error_code::SURROGATE, pos); + } + uint32_t value = (diff << 10) + diff2 + 0x10000; + *utf32_output++ = char32_t(value); + pos += 2; + } + } + return result(error_code::SUCCESS, utf32_output - start); +} + +} // namespace utf16_to_utf32 +} // unnamed namespace +} // namespace scalar +} // namespace simdutf + +#endif +/* end file src/scalar/utf16_to_utf32/utf16_to_utf32.h */ + +/* begin file src/scalar/utf8_to_utf16/valid_utf8_to_utf16.h */ +#ifndef SIMDUTF_VALID_UTF8_TO_UTF16_H +#define SIMDUTF_VALID_UTF8_TO_UTF16_H + +namespace simdutf { +namespace scalar { +namespace { +namespace utf8_to_utf16 { + +template +inline size_t convert_valid(const char *buf, size_t len, + char16_t *utf16_output) { + const uint8_t *data = reinterpret_cast(buf); + size_t pos = 0; + char16_t *start{utf16_output}; + while (pos < len) { + // try to convert the next block of 8 ASCII bytes + if (pos + 8 <= + len) { // if it is safe to read 8 more bytes, check that they are ascii + uint64_t v; + ::memcpy(&v, data + pos, sizeof(uint64_t)); + if ((v & 0x8080808080808080) == 0) { + size_t final_pos = pos + 8; + while (pos < final_pos) { + *utf16_output++ = !match_system(big_endian) + ? char16_t(utf16::swap_bytes(buf[pos])) + : char16_t(buf[pos]); + pos++; + } + continue; + } + } + uint8_t leading_byte = data[pos]; // leading byte + if (leading_byte < 0b10000000) { + // converting one ASCII byte !!! + *utf16_output++ = !match_system(big_endian) + ? char16_t(utf16::swap_bytes(leading_byte)) + : char16_t(leading_byte); + pos++; + } else if ((leading_byte & 0b11100000) == 0b11000000) { + // We have a two-byte UTF-8, it should become + // a single UTF-16 word. + if (pos + 1 >= len) { + break; + } // minimal bound checking + uint16_t code_point = uint16_t(((leading_byte & 0b00011111) << 6) | + (data[pos + 1] & 0b00111111)); + if (!match_system(big_endian)) { + code_point = utf16::swap_bytes(uint16_t(code_point)); + } + *utf16_output++ = char16_t(code_point); + pos += 2; + } else if ((leading_byte & 0b11110000) == 0b11100000) { + // We have a three-byte UTF-8, it should become + // a single UTF-16 word. + if (pos + 2 >= len) { + break; + } // minimal bound checking + uint16_t code_point = uint16_t(((leading_byte & 0b00001111) << 12) | + ((data[pos + 1] & 0b00111111) << 6) | + (data[pos + 2] & 0b00111111)); + if (!match_system(big_endian)) { + code_point = utf16::swap_bytes(uint16_t(code_point)); + } + *utf16_output++ = char16_t(code_point); + pos += 3; + } else if ((leading_byte & 0b11111000) == 0b11110000) { // 0b11110000 + // we have a 4-byte UTF-8 word. + if (pos + 3 >= len) { + break; + } // minimal bound checking + uint32_t code_point = ((leading_byte & 0b00000111) << 18) | + ((data[pos + 1] & 0b00111111) << 12) | + ((data[pos + 2] & 0b00111111) << 6) | + (data[pos + 3] & 0b00111111); + code_point -= 0x10000; + uint16_t high_surrogate = uint16_t(0xD800 + (code_point >> 10)); + uint16_t low_surrogate = uint16_t(0xDC00 + (code_point & 0x3FF)); + if (!match_system(big_endian)) { + high_surrogate = utf16::swap_bytes(high_surrogate); + low_surrogate = utf16::swap_bytes(low_surrogate); + } + *utf16_output++ = char16_t(high_surrogate); + *utf16_output++ = char16_t(low_surrogate); + pos += 4; + } else { + // we may have a continuation but we do not do error checking + return 0; + } + } + return utf16_output - start; +} + +} // namespace utf8_to_utf16 +} // unnamed namespace +} // namespace scalar +} // namespace simdutf + +#endif +/* end file src/scalar/utf8_to_utf16/valid_utf8_to_utf16.h */ +/* begin file src/scalar/utf8_to_utf16/utf8_to_utf16.h */ +#ifndef SIMDUTF_UTF8_TO_UTF16_H +#define SIMDUTF_UTF8_TO_UTF16_H + +namespace simdutf { +namespace scalar { +namespace { +namespace utf8_to_utf16 { + +template +inline size_t convert(const char *buf, size_t len, char16_t *utf16_output) { + const uint8_t *data = reinterpret_cast(buf); + size_t pos = 0; + char16_t *start{utf16_output}; + while (pos < len) { + // try to convert the next block of 16 ASCII bytes + if (pos + 16 <= + len) { // if it is safe to read 16 more bytes, check that they are ascii + uint64_t v1; + ::memcpy(&v1, data + pos, sizeof(uint64_t)); + uint64_t v2; + ::memcpy(&v2, data + pos + sizeof(uint64_t), sizeof(uint64_t)); + uint64_t v{v1 | v2}; + if ((v & 0x8080808080808080) == 0) { + size_t final_pos = pos + 16; + while (pos < final_pos) { + *utf16_output++ = !match_system(big_endian) + ? char16_t(utf16::swap_bytes(buf[pos])) + : char16_t(buf[pos]); + pos++; + } + continue; + } + } + + uint8_t leading_byte = data[pos]; // leading byte + if (leading_byte < 0b10000000) { + // converting one ASCII byte !!! + *utf16_output++ = !match_system(big_endian) + ? char16_t(utf16::swap_bytes(leading_byte)) + : char16_t(leading_byte); + pos++; + } else if ((leading_byte & 0b11100000) == 0b11000000) { + // We have a two-byte UTF-8, it should become + // a single UTF-16 word. + if (pos + 1 >= len) { + return 0; + } // minimal bound checking + if ((data[pos + 1] & 0b11000000) != 0b10000000) { + return 0; + } + // range check + uint32_t code_point = + (leading_byte & 0b00011111) << 6 | (data[pos + 1] & 0b00111111); + if (code_point < 0x80 || 0x7ff < code_point) { + return 0; + } + if (!match_system(big_endian)) { + code_point = uint32_t(utf16::swap_bytes(uint16_t(code_point))); + } + *utf16_output++ = char16_t(code_point); + pos += 2; + } else if ((leading_byte & 0b11110000) == 0b11100000) { + // We have a three-byte UTF-8, it should become + // a single UTF-16 word. + if (pos + 2 >= len) { + return 0; + } // minimal bound checking + + if ((data[pos + 1] & 0b11000000) != 0b10000000) { + return 0; + } + if ((data[pos + 2] & 0b11000000) != 0b10000000) { + return 0; + } + // range check + uint32_t code_point = (leading_byte & 0b00001111) << 12 | + (data[pos + 1] & 0b00111111) << 6 | + (data[pos + 2] & 0b00111111); + if (code_point < 0x800 || 0xffff < code_point || + (0xd7ff < code_point && code_point < 0xe000)) { + return 0; + } + if (!match_system(big_endian)) { + code_point = uint32_t(utf16::swap_bytes(uint16_t(code_point))); + } + *utf16_output++ = char16_t(code_point); + pos += 3; + } else if ((leading_byte & 0b11111000) == 0b11110000) { // 0b11110000 + // we have a 4-byte UTF-8 word. + if (pos + 3 >= len) { + return 0; + } // minimal bound checking + if ((data[pos + 1] & 0b11000000) != 0b10000000) { + return 0; + } + if ((data[pos + 2] & 0b11000000) != 0b10000000) { + return 0; + } + if ((data[pos + 3] & 0b11000000) != 0b10000000) { + return 0; + } + + // range check + uint32_t code_point = (leading_byte & 0b00000111) << 18 | + (data[pos + 1] & 0b00111111) << 12 | + (data[pos + 2] & 0b00111111) << 6 | + (data[pos + 3] & 0b00111111); + if (code_point <= 0xffff || 0x10ffff < code_point) { + return 0; + } + code_point -= 0x10000; + uint16_t high_surrogate = uint16_t(0xD800 + (code_point >> 10)); + uint16_t low_surrogate = uint16_t(0xDC00 + (code_point & 0x3FF)); + if (!match_system(big_endian)) { + high_surrogate = utf16::swap_bytes(high_surrogate); + low_surrogate = utf16::swap_bytes(low_surrogate); + } + *utf16_output++ = char16_t(high_surrogate); + *utf16_output++ = char16_t(low_surrogate); + pos += 4; + } else { + return 0; + } + } + return utf16_output - start; +} + +template +inline result convert_with_errors(const char *buf, size_t len, + char16_t *utf16_output) { + const uint8_t *data = reinterpret_cast(buf); + size_t pos = 0; + char16_t *start{utf16_output}; + while (pos < len) { + // try to convert the next block of 16 ASCII bytes + if (pos + 16 <= + len) { // if it is safe to read 16 more bytes, check that they are ascii + uint64_t v1; + ::memcpy(&v1, data + pos, sizeof(uint64_t)); + uint64_t v2; + ::memcpy(&v2, data + pos + sizeof(uint64_t), sizeof(uint64_t)); + uint64_t v{v1 | v2}; + if ((v & 0x8080808080808080) == 0) { + size_t final_pos = pos + 16; + while (pos < final_pos) { + *utf16_output++ = !match_system(big_endian) + ? char16_t(utf16::swap_bytes(buf[pos])) + : char16_t(buf[pos]); + pos++; + } + continue; + } + } + uint8_t leading_byte = data[pos]; // leading byte + if (leading_byte < 0b10000000) { + // converting one ASCII byte !!! + *utf16_output++ = !match_system(big_endian) + ? char16_t(utf16::swap_bytes(leading_byte)) + : char16_t(leading_byte); + pos++; + } else if ((leading_byte & 0b11100000) == 0b11000000) { + // We have a two-byte UTF-8, it should become + // a single UTF-16 word. + if (pos + 1 >= len) { + return result(error_code::TOO_SHORT, pos); + } // minimal bound checking + if ((data[pos + 1] & 0b11000000) != 0b10000000) { + return result(error_code::TOO_SHORT, pos); + } + // range check + uint32_t code_point = + (leading_byte & 0b00011111) << 6 | (data[pos + 1] & 0b00111111); + if (code_point < 0x80 || 0x7ff < code_point) { + return result(error_code::OVERLONG, pos); + } + if (!match_system(big_endian)) { + code_point = uint32_t(utf16::swap_bytes(uint16_t(code_point))); + } + *utf16_output++ = char16_t(code_point); + pos += 2; + } else if ((leading_byte & 0b11110000) == 0b11100000) { + // We have a three-byte UTF-8, it should become + // a single UTF-16 word. + if (pos + 2 >= len) { + return result(error_code::TOO_SHORT, pos); + } // minimal bound checking + + if ((data[pos + 1] & 0b11000000) != 0b10000000) { + return result(error_code::TOO_SHORT, pos); + } + if ((data[pos + 2] & 0b11000000) != 0b10000000) { + return result(error_code::TOO_SHORT, pos); + } + // range check + uint32_t code_point = (leading_byte & 0b00001111) << 12 | + (data[pos + 1] & 0b00111111) << 6 | + (data[pos + 2] & 0b00111111); + if ((code_point < 0x800) || (0xffff < code_point)) { + return result(error_code::OVERLONG, pos); + } + if (0xd7ff < code_point && code_point < 0xe000) { + return result(error_code::SURROGATE, pos); + } + if (!match_system(big_endian)) { + code_point = uint32_t(utf16::swap_bytes(uint16_t(code_point))); + } + *utf16_output++ = char16_t(code_point); + pos += 3; + } else if ((leading_byte & 0b11111000) == 0b11110000) { // 0b11110000 + // we have a 4-byte UTF-8 word. + if (pos + 3 >= len) { + return result(error_code::TOO_SHORT, pos); + } // minimal bound checking + if ((data[pos + 1] & 0b11000000) != 0b10000000) { + return result(error_code::TOO_SHORT, pos); + } + if ((data[pos + 2] & 0b11000000) != 0b10000000) { + return result(error_code::TOO_SHORT, pos); + } + if ((data[pos + 3] & 0b11000000) != 0b10000000) { + return result(error_code::TOO_SHORT, pos); + } + + // range check + uint32_t code_point = (leading_byte & 0b00000111) << 18 | + (data[pos + 1] & 0b00111111) << 12 | + (data[pos + 2] & 0b00111111) << 6 | + (data[pos + 3] & 0b00111111); + if (code_point <= 0xffff) { + return result(error_code::OVERLONG, pos); + } + if (0x10ffff < code_point) { + return result(error_code::TOO_LARGE, pos); + } + code_point -= 0x10000; + uint16_t high_surrogate = uint16_t(0xD800 + (code_point >> 10)); + uint16_t low_surrogate = uint16_t(0xDC00 + (code_point & 0x3FF)); + if (!match_system(big_endian)) { + high_surrogate = utf16::swap_bytes(high_surrogate); + low_surrogate = utf16::swap_bytes(low_surrogate); + } + *utf16_output++ = char16_t(high_surrogate); + *utf16_output++ = char16_t(low_surrogate); + pos += 4; + } else { + // we either have too many continuation bytes or an invalid leading byte + if ((leading_byte & 0b11000000) == 0b10000000) { + return result(error_code::TOO_LONG, pos); + } else { + return result(error_code::HEADER_BITS, pos); + } + } + } + return result(error_code::SUCCESS, utf16_output - start); +} + +/** + * When rewind_and_convert_with_errors is called, we are pointing at 'buf' and + * we have up to len input bytes left, and we encountered some error. It is + * possible that the error is at 'buf' exactly, but it could also be in the + * previous bytes (up to 3 bytes back). + * + * prior_bytes indicates how many bytes, prior to 'buf' may belong to the + * current memory section and can be safely accessed. We prior_bytes to access + * safely up to three bytes before 'buf'. + * + * The caller is responsible to ensure that len > 0. + * + * If the error is believed to have occurred prior to 'buf', the count value + * contain in the result will be SIZE_T - 1, SIZE_T - 2, or SIZE_T - 3. + */ +template +inline result rewind_and_convert_with_errors(size_t prior_bytes, + const char *buf, size_t len, + char16_t *utf16_output) { + size_t extra_len{0}; + // We potentially need to go back in time and find a leading byte. + // In theory '3' would be sufficient, but sometimes the error can go back + // quite far. + size_t how_far_back = prior_bytes; + // size_t how_far_back = 3; // 3 bytes in the past + current position + // if(how_far_back >= prior_bytes) { how_far_back = prior_bytes; } + bool found_leading_bytes{false}; + // important: it is i <= how_far_back and not 'i < how_far_back'. + for (size_t i = 0; i <= how_far_back; i++) { + unsigned char byte = buf[-static_cast(i)]; + found_leading_bytes = ((byte & 0b11000000) != 0b10000000); + if (found_leading_bytes) { + if (i > 0 && byte < 128) { + // If we had to go back and the leading byte is ascii + // then we can stop right away. + return result(error_code::TOO_LONG, 0 - i + 1); + } + buf -= i; + extra_len = i; + break; + } + } + // + // It is possible for this function to return a negative count in its result. + // C++ Standard Section 18.1 defines size_t is in which is described + // in C Standard as . C Standard Section 4.1.5 defines size_t as an + // unsigned integral type of the result of the sizeof operator + // + // An unsigned type will simply wrap round arithmetically (well defined). + // + if (!found_leading_bytes) { + // If how_far_back == 3, we may have four consecutive continuation bytes!!! + // [....] [continuation] [continuation] [continuation] | [buf is + // continuation] Or we possibly have a stream that does not start with a + // leading byte. + return result(error_code::TOO_LONG, 0 - how_far_back); + } + result res = convert_with_errors(buf, len + extra_len, utf16_output); + if (res.error) { + res.count -= extra_len; + } + return res; +} + +} // namespace utf8_to_utf16 +} // unnamed namespace +} // namespace scalar +} // namespace simdutf + +#endif +/* end file src/scalar/utf8_to_utf16/utf8_to_utf16.h */ + +/* begin file src/scalar/utf8_to_utf32/valid_utf8_to_utf32.h */ +#ifndef SIMDUTF_VALID_UTF8_TO_UTF32_H +#define SIMDUTF_VALID_UTF8_TO_UTF32_H + +namespace simdutf { +namespace scalar { +namespace { +namespace utf8_to_utf32 { + +inline size_t convert_valid(const char *buf, size_t len, + char32_t *utf32_output) { + const uint8_t *data = reinterpret_cast(buf); + size_t pos = 0; + char32_t *start{utf32_output}; + while (pos < len) { + // try to convert the next block of 8 ASCII bytes + if (pos + 8 <= + len) { // if it is safe to read 8 more bytes, check that they are ascii + uint64_t v; + ::memcpy(&v, data + pos, sizeof(uint64_t)); + if ((v & 0x8080808080808080) == 0) { + size_t final_pos = pos + 8; + while (pos < final_pos) { + *utf32_output++ = char32_t(buf[pos]); + pos++; + } + continue; + } + } + uint8_t leading_byte = data[pos]; // leading byte + if (leading_byte < 0b10000000) { + // converting one ASCII byte !!! + *utf32_output++ = char32_t(leading_byte); + pos++; + } else if ((leading_byte & 0b11100000) == 0b11000000) { + // We have a two-byte UTF-8 + if (pos + 1 >= len) { + break; + } // minimal bound checking + *utf32_output++ = char32_t(((leading_byte & 0b00011111) << 6) | + (data[pos + 1] & 0b00111111)); + pos += 2; + } else if ((leading_byte & 0b11110000) == 0b11100000) { + // We have a three-byte UTF-8 + if (pos + 2 >= len) { + break; + } // minimal bound checking + *utf32_output++ = char32_t(((leading_byte & 0b00001111) << 12) | + ((data[pos + 1] & 0b00111111) << 6) | + (data[pos + 2] & 0b00111111)); + pos += 3; + } else if ((leading_byte & 0b11111000) == 0b11110000) { // 0b11110000 + // we have a 4-byte UTF-8 word. + if (pos + 3 >= len) { + break; + } // minimal bound checking + uint32_t code_word = ((leading_byte & 0b00000111) << 18) | + ((data[pos + 1] & 0b00111111) << 12) | + ((data[pos + 2] & 0b00111111) << 6) | + (data[pos + 3] & 0b00111111); + *utf32_output++ = char32_t(code_word); + pos += 4; + } else { + // we may have a continuation but we do not do error checking + return 0; + } + } + return utf32_output - start; +} + +} // namespace utf8_to_utf32 +} // unnamed namespace +} // namespace scalar +} // namespace simdutf + +#endif +/* end file src/scalar/utf8_to_utf32/valid_utf8_to_utf32.h */ +/* begin file src/scalar/utf8_to_utf32/utf8_to_utf32.h */ +#ifndef SIMDUTF_UTF8_TO_UTF32_H +#define SIMDUTF_UTF8_TO_UTF32_H + +namespace simdutf { +namespace scalar { +namespace { +namespace utf8_to_utf32 { + +inline size_t convert(const char *buf, size_t len, char32_t *utf32_output) { + const uint8_t *data = reinterpret_cast(buf); + size_t pos = 0; + char32_t *start{utf32_output}; + while (pos < len) { + // try to convert the next block of 16 ASCII bytes + if (pos + 16 <= + len) { // if it is safe to read 16 more bytes, check that they are ascii + uint64_t v1; + ::memcpy(&v1, data + pos, sizeof(uint64_t)); + uint64_t v2; + ::memcpy(&v2, data + pos + sizeof(uint64_t), sizeof(uint64_t)); + uint64_t v{v1 | v2}; + if ((v & 0x8080808080808080) == 0) { + size_t final_pos = pos + 16; + while (pos < final_pos) { + *utf32_output++ = char32_t(buf[pos]); + pos++; + } + continue; + } + } + uint8_t leading_byte = data[pos]; // leading byte + if (leading_byte < 0b10000000) { + // converting one ASCII byte !!! + *utf32_output++ = char32_t(leading_byte); + pos++; + } else if ((leading_byte & 0b11100000) == 0b11000000) { + // We have a two-byte UTF-8 + if (pos + 1 >= len) { + return 0; + } // minimal bound checking + if ((data[pos + 1] & 0b11000000) != 0b10000000) { + return 0; + } + // range check + uint32_t code_point = + (leading_byte & 0b00011111) << 6 | (data[pos + 1] & 0b00111111); + if (code_point < 0x80 || 0x7ff < code_point) { + return 0; + } + *utf32_output++ = char32_t(code_point); + pos += 2; + } else if ((leading_byte & 0b11110000) == 0b11100000) { + // We have a three-byte UTF-8 + if (pos + 2 >= len) { + return 0; + } // minimal bound checking + + if ((data[pos + 1] & 0b11000000) != 0b10000000) { + return 0; + } + if ((data[pos + 2] & 0b11000000) != 0b10000000) { + return 0; + } + // range check + uint32_t code_point = (leading_byte & 0b00001111) << 12 | + (data[pos + 1] & 0b00111111) << 6 | + (data[pos + 2] & 0b00111111); + if (code_point < 0x800 || 0xffff < code_point || + (0xd7ff < code_point && code_point < 0xe000)) { + return 0; + } + *utf32_output++ = char32_t(code_point); + pos += 3; + } else if ((leading_byte & 0b11111000) == 0b11110000) { // 0b11110000 + // we have a 4-byte UTF-8 word. + if (pos + 3 >= len) { + return 0; + } // minimal bound checking + if ((data[pos + 1] & 0b11000000) != 0b10000000) { + return 0; + } + if ((data[pos + 2] & 0b11000000) != 0b10000000) { + return 0; + } + if ((data[pos + 3] & 0b11000000) != 0b10000000) { + return 0; + } + + // range check + uint32_t code_point = (leading_byte & 0b00000111) << 18 | + (data[pos + 1] & 0b00111111) << 12 | + (data[pos + 2] & 0b00111111) << 6 | + (data[pos + 3] & 0b00111111); + if (code_point <= 0xffff || 0x10ffff < code_point) { + return 0; + } + *utf32_output++ = char32_t(code_point); + pos += 4; + } else { + return 0; + } + } + return utf32_output - start; +} + +inline result convert_with_errors(const char *buf, size_t len, + char32_t *utf32_output) { + const uint8_t *data = reinterpret_cast(buf); + size_t pos = 0; + char32_t *start{utf32_output}; + while (pos < len) { + // try to convert the next block of 16 ASCII bytes + if (pos + 16 <= + len) { // if it is safe to read 16 more bytes, check that they are ascii + uint64_t v1; + ::memcpy(&v1, data + pos, sizeof(uint64_t)); + uint64_t v2; + ::memcpy(&v2, data + pos + sizeof(uint64_t), sizeof(uint64_t)); + uint64_t v{v1 | v2}; + if ((v & 0x8080808080808080) == 0) { + size_t final_pos = pos + 16; + while (pos < final_pos) { + *utf32_output++ = char32_t(buf[pos]); + pos++; + } + continue; + } + } + uint8_t leading_byte = data[pos]; // leading byte + if (leading_byte < 0b10000000) { + // converting one ASCII byte !!! + *utf32_output++ = char32_t(leading_byte); + pos++; + } else if ((leading_byte & 0b11100000) == 0b11000000) { + // We have a two-byte UTF-8 + if (pos + 1 >= len) { + return result(error_code::TOO_SHORT, pos); + } // minimal bound checking + if ((data[pos + 1] & 0b11000000) != 0b10000000) { + return result(error_code::TOO_SHORT, pos); + } + // range check + uint32_t code_point = + (leading_byte & 0b00011111) << 6 | (data[pos + 1] & 0b00111111); + if (code_point < 0x80 || 0x7ff < code_point) { + return result(error_code::OVERLONG, pos); + } + *utf32_output++ = char32_t(code_point); + pos += 2; + } else if ((leading_byte & 0b11110000) == 0b11100000) { + // We have a three-byte UTF-8 + if (pos + 2 >= len) { + return result(error_code::TOO_SHORT, pos); + } // minimal bound checking + + if ((data[pos + 1] & 0b11000000) != 0b10000000) { + return result(error_code::TOO_SHORT, pos); + } + if ((data[pos + 2] & 0b11000000) != 0b10000000) { + return result(error_code::TOO_SHORT, pos); + } + // range check + uint32_t code_point = (leading_byte & 0b00001111) << 12 | + (data[pos + 1] & 0b00111111) << 6 | + (data[pos + 2] & 0b00111111); + if (code_point < 0x800 || 0xffff < code_point) { + return result(error_code::OVERLONG, pos); + } + if (0xd7ff < code_point && code_point < 0xe000) { + return result(error_code::SURROGATE, pos); + } + *utf32_output++ = char32_t(code_point); + pos += 3; + } else if ((leading_byte & 0b11111000) == 0b11110000) { // 0b11110000 + // we have a 4-byte UTF-8 word. + if (pos + 3 >= len) { + return result(error_code::TOO_SHORT, pos); + } // minimal bound checking + if ((data[pos + 1] & 0b11000000) != 0b10000000) { + return result(error_code::TOO_SHORT, pos); + } + if ((data[pos + 2] & 0b11000000) != 0b10000000) { + return result(error_code::TOO_SHORT, pos); + } + if ((data[pos + 3] & 0b11000000) != 0b10000000) { + return result(error_code::TOO_SHORT, pos); + } + + // range check + uint32_t code_point = (leading_byte & 0b00000111) << 18 | + (data[pos + 1] & 0b00111111) << 12 | + (data[pos + 2] & 0b00111111) << 6 | + (data[pos + 3] & 0b00111111); + if (code_point <= 0xffff) { + return result(error_code::OVERLONG, pos); + } + if (0x10ffff < code_point) { + return result(error_code::TOO_LARGE, pos); + } + *utf32_output++ = char32_t(code_point); + pos += 4; + } else { + // we either have too many continuation bytes or an invalid leading byte + if ((leading_byte & 0b11000000) == 0b10000000) { + return result(error_code::TOO_LONG, pos); + } else { + return result(error_code::HEADER_BITS, pos); + } + } + } + return result(error_code::SUCCESS, utf32_output - start); +} + +/** + * When rewind_and_convert_with_errors is called, we are pointing at 'buf' and + * we have up to len input bytes left, and we encountered some error. It is + * possible that the error is at 'buf' exactly, but it could also be in the + * previous bytes location (up to 3 bytes back). + * + * prior_bytes indicates how many bytes, prior to 'buf' may belong to the + * current memory section and can be safely accessed. We prior_bytes to access + * safely up to three bytes before 'buf'. + * + * The caller is responsible to ensure that len > 0. + * + * If the error is believed to have occurred prior to 'buf', the count value + * contain in the result will be SIZE_T - 1, SIZE_T - 2, or SIZE_T - 3. + */ +inline result rewind_and_convert_with_errors(size_t prior_bytes, + const char *buf, size_t len, + char32_t *utf32_output) { + size_t extra_len{0}; + // We potentially need to go back in time and find a leading byte. + size_t how_far_back = 3; // 3 bytes in the past + current position + if (how_far_back > prior_bytes) { + how_far_back = prior_bytes; + } + bool found_leading_bytes{false}; + // important: it is i <= how_far_back and not 'i < how_far_back'. + for (size_t i = 0; i <= how_far_back; i++) { + unsigned char byte = buf[-static_cast(i)]; + found_leading_bytes = ((byte & 0b11000000) != 0b10000000); + if (found_leading_bytes) { + if (i > 0 && byte < 128) { + // If we had to go back and the leading byte is ascii + // then we can stop right away. + return result(error_code::TOO_LONG, 0 - i + 1); + } + buf -= i; + extra_len = i; + break; + } + } + // + // It is possible for this function to return a negative count in its result. + // C++ Standard Section 18.1 defines size_t is in which is described + // in C Standard as . C Standard Section 4.1.5 defines size_t as an + // unsigned integral type of the result of the sizeof operator + // + // An unsigned type will simply wrap round arithmetically (well defined). + // + if (!found_leading_bytes) { + // If how_far_back == 3, we may have four consecutive continuation bytes!!! + // [....] [continuation] [continuation] [continuation] | [buf is + // continuation] Or we possibly have a stream that does not start with a + // leading byte. + return result(error_code::TOO_LONG, 0 - how_far_back); + } + + result res = convert_with_errors(buf, len + extra_len, utf32_output); + if (res.error) { + res.count -= extra_len; + } + return res; +} + +} // namespace utf8_to_utf32 +} // unnamed namespace +} // namespace scalar +} // namespace simdutf + +#endif +/* end file src/scalar/utf8_to_utf32/utf8_to_utf32.h */ + +/* begin file src/scalar/latin1_to_utf16/latin1_to_utf16.h */ +#ifndef SIMDUTF_LATIN1_TO_UTF16_H +#define SIMDUTF_LATIN1_TO_UTF16_H + +namespace simdutf { +namespace scalar { +namespace { +namespace latin1_to_utf16 { + +template +inline size_t convert(const char *buf, size_t len, char16_t *utf16_output) { + const uint8_t *data = reinterpret_cast(buf); + size_t pos = 0; + char16_t *start{utf16_output}; + + while (pos < len) { + uint16_t word = + uint16_t(data[pos]); // extend Latin-1 char to 16-bit Unicode code point + *utf16_output++ = + char16_t(match_system(big_endian) ? word : utf16::swap_bytes(word)); + pos++; + } + + return utf16_output - start; +} + +template +inline result convert_with_errors(const char *buf, size_t len, + char16_t *utf16_output) { + const uint8_t *data = reinterpret_cast(buf); + size_t pos = 0; + char16_t *start{utf16_output}; + + while (pos < len) { + uint16_t word = + uint16_t(data[pos]); // extend Latin-1 char to 16-bit Unicode code point + *utf16_output++ = + char16_t(match_system(big_endian) ? word : utf16::swap_bytes(word)); + pos++; + } + + return result(error_code::SUCCESS, utf16_output - start); +} + +} // namespace latin1_to_utf16 +} // unnamed namespace +} // namespace scalar +} // namespace simdutf + +#endif +/* end file src/scalar/latin1_to_utf16/latin1_to_utf16.h */ +/* begin file src/scalar/latin1_to_utf32/latin1_to_utf32.h */ +#ifndef SIMDUTF_LATIN1_TO_UTF32_H +#define SIMDUTF_LATIN1_TO_UTF32_H + +namespace simdutf { +namespace scalar { +namespace { +namespace latin1_to_utf32 { + +inline size_t convert(const char *buf, size_t len, char32_t *utf32_output) { + const unsigned char *data = reinterpret_cast(buf); + char32_t *start{utf32_output}; + for (size_t i = 0; i < len; i++) { + *utf32_output++ = (char32_t)data[i]; + } + return utf32_output - start; +} + +} // namespace latin1_to_utf32 +} // unnamed namespace +} // namespace scalar +} // namespace simdutf + +#endif +/* end file src/scalar/latin1_to_utf32/latin1_to_utf32.h */ + +/* begin file src/scalar/utf8_to_latin1/utf8_to_latin1.h */ +#ifndef SIMDUTF_UTF8_TO_LATIN1_H +#define SIMDUTF_UTF8_TO_LATIN1_H + +namespace simdutf { +namespace scalar { +namespace { +namespace utf8_to_latin1 { + +inline size_t convert(const char *buf, size_t len, char *latin_output) { + const uint8_t *data = reinterpret_cast(buf); + size_t pos = 0; + char *start{latin_output}; + + while (pos < len) { + // try to convert the next block of 16 ASCII bytes + if (pos + 16 <= + len) { // if it is safe to read 16 more bytes, check that they are ascii + uint64_t v1; + ::memcpy(&v1, data + pos, sizeof(uint64_t)); + uint64_t v2; + ::memcpy(&v2, data + pos + sizeof(uint64_t), sizeof(uint64_t)); + uint64_t v{v1 | v2}; // We are only interested in these bits: 1000 1000 + // 1000 1000 .... etc + if ((v & 0x8080808080808080) == + 0) { // if NONE of these are set, e.g. all of them are zero, then + // everything is ASCII + size_t final_pos = pos + 16; + while (pos < final_pos) { + *latin_output++ = char(buf[pos]); + pos++; + } + continue; + } + } + + // suppose it is not an all ASCII byte sequence + uint8_t leading_byte = data[pos]; // leading byte + if (leading_byte < 0b10000000) { + // converting one ASCII byte !!! + *latin_output++ = char(leading_byte); + pos++; + } else if ((leading_byte & 0b11100000) == + 0b11000000) { // the first three bits indicate: + // We have a two-byte UTF-8 + if (pos + 1 >= len) { + return 0; + } // minimal bound checking + if ((data[pos + 1] & 0b11000000) != 0b10000000) { + return 0; + } // checks if the next byte is a valid continuation byte in UTF-8. A + // valid continuation byte starts with 10. + // range check - + uint32_t code_point = + (leading_byte & 0b00011111) << 6 | + (data[pos + 1] & + 0b00111111); // assembles the Unicode code point from the two bytes. + // It does this by discarding the leading 110 and 10 + // bits from the two bytes, shifting the remaining bits + // of the first byte, and then combining the results + // with a bitwise OR operation. + if (code_point < 0x80 || 0xFF < code_point) { + return 0; // We only care about the range 129-255 which is Non-ASCII + // latin1 characters. A code_point beneath 0x80 is invalid as + // it is already covered by bytes whose leading bit is zero. + } + *latin_output++ = char(code_point); + pos += 2; + } else { + return 0; + } + } + return latin_output - start; +} + +inline result convert_with_errors(const char *buf, size_t len, + char *latin_output) { + const uint8_t *data = reinterpret_cast(buf); + size_t pos = 0; + char *start{latin_output}; + + while (pos < len) { + // try to convert the next block of 16 ASCII bytes + if (pos + 16 <= + len) { // if it is safe to read 16 more bytes, check that they are ascii + uint64_t v1; + ::memcpy(&v1, data + pos, sizeof(uint64_t)); + uint64_t v2; + ::memcpy(&v2, data + pos + sizeof(uint64_t), sizeof(uint64_t)); + uint64_t v{v1 | v2}; // We are only interested in these bits: 1000 1000 + // 1000 1000...etc + if ((v & 0x8080808080808080) == + 0) { // if NONE of these are set, e.g. all of them are zero, then + // everything is ASCII + size_t final_pos = pos + 16; + while (pos < final_pos) { + *latin_output++ = char(buf[pos]); + pos++; + } + continue; + } + } + // suppose it is not an all ASCII byte sequence + uint8_t leading_byte = data[pos]; // leading byte + if (leading_byte < 0b10000000) { + // converting one ASCII byte !!! + *latin_output++ = char(leading_byte); + pos++; + } else if ((leading_byte & 0b11100000) == + 0b11000000) { // the first three bits indicate: + // We have a two-byte UTF-8 + if (pos + 1 >= len) { + return result(error_code::TOO_SHORT, pos); + } // minimal bound checking + if ((data[pos + 1] & 0b11000000) != 0b10000000) { + return result(error_code::TOO_SHORT, pos); + } // checks if the next byte is a valid continuation byte in UTF-8. A + // valid continuation byte starts with 10. + // range check - + uint32_t code_point = + (leading_byte & 0b00011111) << 6 | + (data[pos + 1] & + 0b00111111); // assembles the Unicode code point from the two bytes. + // It does this by discarding the leading 110 and 10 + // bits from the two bytes, shifting the remaining bits + // of the first byte, and then combining the results + // with a bitwise OR operation. + if (code_point < 0x80) { + return result(error_code::OVERLONG, pos); + } + if (0xFF < code_point) { + return result(error_code::TOO_LARGE, pos); + } // We only care about the range 129-255 which is Non-ASCII latin1 + // characters + *latin_output++ = char(code_point); + pos += 2; + } else if ((leading_byte & 0b11110000) == 0b11100000) { + // We have a three-byte UTF-8 + return result(error_code::TOO_LARGE, pos); + } else if ((leading_byte & 0b11111000) == 0b11110000) { // 0b11110000 + // we have a 4-byte UTF-8 word. + return result(error_code::TOO_LARGE, pos); + } else { + // we either have too many continuation bytes or an invalid leading byte + if ((leading_byte & 0b11000000) == 0b10000000) { + return result(error_code::TOO_LONG, pos); + } + + return result(error_code::HEADER_BITS, pos); + } + } + return result(error_code::SUCCESS, latin_output - start); +} + +inline result rewind_and_convert_with_errors(size_t prior_bytes, + const char *buf, size_t len, + char *latin1_output) { + size_t extra_len{0}; + // We potentially need to go back in time and find a leading byte. + // In theory '3' would be sufficient, but sometimes the error can go back + // quite far. + size_t how_far_back = prior_bytes; + // size_t how_far_back = 3; // 3 bytes in the past + current position + // if(how_far_back >= prior_bytes) { how_far_back = prior_bytes; } + bool found_leading_bytes{false}; + // important: it is i <= how_far_back and not 'i < how_far_back'. + for (size_t i = 0; i <= how_far_back; i++) { + unsigned char byte = buf[-static_cast(i)]; + found_leading_bytes = ((byte & 0b11000000) != 0b10000000); + if (found_leading_bytes) { + if (i > 0 && byte < 128) { + // If we had to go back and the leading byte is ascii + // then we can stop right away. + return result(error_code::TOO_LONG, 0 - i + 1); + } + buf -= i; + extra_len = i; + break; + } + } + // + // It is possible for this function to return a negative count in its result. + // C++ Standard Section 18.1 defines size_t is in which is described + // in C Standard as . C Standard Section 4.1.5 defines size_t as an + // unsigned integral type of the result of the sizeof operator + // + // An unsigned type will simply wrap round arithmetically (well defined). + // + if (!found_leading_bytes) { + // If how_far_back == 3, we may have four consecutive continuation bytes!!! + // [....] [continuation] [continuation] [continuation] | [buf is + // continuation] Or we possibly have a stream that does not start with a + // leading byte. + return result(error_code::TOO_LONG, 0 - how_far_back); + } + result res = convert_with_errors(buf, len + extra_len, latin1_output); + if (res.error) { + res.count -= extra_len; + } + return res; +} + +} // namespace utf8_to_latin1 +} // unnamed namespace +} // namespace scalar +} // namespace simdutf + +#endif +/* end file src/scalar/utf8_to_latin1/utf8_to_latin1.h */ +/* begin file src/scalar/utf16_to_latin1/utf16_to_latin1.h */ +#ifndef SIMDUTF_UTF16_TO_LATIN1_H +#define SIMDUTF_UTF16_TO_LATIN1_H + +namespace simdutf { +namespace scalar { +namespace { +namespace utf16_to_latin1 { + +#include // for std::memcpy + +template +inline size_t convert(const char16_t *buf, size_t len, char *latin_output) { + if (len == 0) { + return 0; + } + const uint16_t *data = reinterpret_cast(buf); + size_t pos = 0; + char *current_write = latin_output; + uint16_t word = 0; + uint16_t too_large = 0; + + while (pos < len) { + word = !match_system(big_endian) ? utf16::swap_bytes(data[pos]) : data[pos]; + too_large |= word; + *current_write++ = char(word & 0xFF); + pos++; + } + if ((too_large & 0xFF00) != 0) { + return 0; + } + + return current_write - latin_output; +} + +template +inline result convert_with_errors(const char16_t *buf, size_t len, + char *latin_output) { + if (len == 0) { + return result(error_code::SUCCESS, 0); + } + const uint16_t *data = reinterpret_cast(buf); + size_t pos = 0; + char *start{latin_output}; + uint16_t word; + + while (pos < len) { + if (pos + 16 <= len) { // if it is safe to read 32 more bytes, check that + // they are Latin1 + uint64_t v1, v2, v3, v4; + ::memcpy(&v1, data + pos, sizeof(uint64_t)); + ::memcpy(&v2, data + pos + 4, sizeof(uint64_t)); + ::memcpy(&v3, data + pos + 8, sizeof(uint64_t)); + ::memcpy(&v4, data + pos + 12, sizeof(uint64_t)); + + if (!match_system(big_endian)) { + v1 = (v1 >> 8) | (v1 << (64 - 8)); + } + if (!match_system(big_endian)) { + v2 = (v2 >> 8) | (v2 << (64 - 8)); + } + if (!match_system(big_endian)) { + v3 = (v3 >> 8) | (v3 << (64 - 8)); + } + if (!match_system(big_endian)) { + v4 = (v4 >> 8) | (v4 << (64 - 8)); + } + + if (((v1 | v2 | v3 | v4) & 0xFF00FF00FF00FF00) == 0) { + size_t final_pos = pos + 16; + while (pos < final_pos) { + *latin_output++ = !match_system(big_endian) + ? char(utf16::swap_bytes(data[pos])) + : char(data[pos]); + pos++; + } + continue; + } + } + word = !match_system(big_endian) ? utf16::swap_bytes(data[pos]) : data[pos]; + if ((word & 0xFF00) == 0) { + *latin_output++ = char(word & 0xFF); + pos++; + } else { + return result(error_code::TOO_LARGE, pos); + } + } + return result(error_code::SUCCESS, latin_output - start); +} + +} // namespace utf16_to_latin1 +} // unnamed namespace +} // namespace scalar +} // namespace simdutf + +#endif +/* end file src/scalar/utf16_to_latin1/utf16_to_latin1.h */ +/* begin file src/scalar/utf32_to_latin1/utf32_to_latin1.h */ +#ifndef SIMDUTF_UTF32_TO_LATIN1_H +#define SIMDUTF_UTF32_TO_LATIN1_H + +namespace simdutf { +namespace scalar { +namespace { +namespace utf32_to_latin1 { + +inline size_t convert(const char32_t *buf, size_t len, char *latin1_output) { + const uint32_t *data = reinterpret_cast(buf); + char *start = latin1_output; + uint32_t utf32_char; + size_t pos = 0; + uint32_t too_large = 0; + + while (pos < len) { + utf32_char = (uint32_t)data[pos]; + too_large |= utf32_char; + *latin1_output++ = (char)(utf32_char & 0xFF); + pos++; + } + if ((too_large & 0xFFFFFF00) != 0) { + return 0; + } + return latin1_output - start; +} + +inline result convert_with_errors(const char32_t *buf, size_t len, + char *latin1_output) { + const uint32_t *data = reinterpret_cast(buf); + char *start{latin1_output}; + size_t pos = 0; + while (pos < len) { + if (pos + 2 <= + len) { // if it is safe to read 8 more bytes, check that they are Latin1 + uint64_t v; + ::memcpy(&v, data + pos, sizeof(uint64_t)); + if ((v & 0xFFFFFF00FFFFFF00) == 0) { + *latin1_output++ = char(buf[pos]); + *latin1_output++ = char(buf[pos + 1]); + pos += 2; + continue; + } + } + uint32_t utf32_char = data[pos]; + if ((utf32_char & 0xFFFFFF00) == + 0) { // Check if the character can be represented in Latin-1 + *latin1_output++ = (char)(utf32_char & 0xFF); + pos++; + } else { + return result(error_code::TOO_LARGE, pos); + }; + } + return result(error_code::SUCCESS, latin1_output - start); +} + +} // namespace utf32_to_latin1 +} // unnamed namespace +} // namespace scalar +} // namespace simdutf + +#endif +/* end file src/scalar/utf32_to_latin1/utf32_to_latin1.h */ + +/* begin file src/scalar/utf8_to_latin1/valid_utf8_to_latin1.h */ +#ifndef SIMDUTF_VALID_UTF8_TO_LATIN1_H +#define SIMDUTF_VALID_UTF8_TO_LATIN1_H + +namespace simdutf { +namespace scalar { +namespace { +namespace utf8_to_latin1 { + +inline size_t convert_valid(const char *buf, size_t len, char *latin_output) { + const uint8_t *data = reinterpret_cast(buf); + + size_t pos = 0; + char *start{latin_output}; + + while (pos < len) { + // try to convert the next block of 16 ASCII bytes + if (pos + 16 <= + len) { // if it is safe to read 16 more bytes, check that they are ascii + uint64_t v1; + ::memcpy(&v1, data + pos, sizeof(uint64_t)); + uint64_t v2; + ::memcpy(&v2, data + pos + sizeof(uint64_t), sizeof(uint64_t)); + uint64_t v{v1 | + v2}; // We are only interested in these bits: 1000 1000 1000 + // 1000, so it makes sense to concatenate everything + if ((v & 0x8080808080808080) == + 0) { // if NONE of these are set, e.g. all of them are zero, then + // everything is ASCII + size_t final_pos = pos + 16; + while (pos < final_pos) { + *latin_output++ = char(buf[pos]); + pos++; + } + continue; + } + } + + // suppose it is not an all ASCII byte sequence + uint8_t leading_byte = data[pos]; // leading byte + if (leading_byte < 0b10000000) { + // converting one ASCII byte !!! + *latin_output++ = char(leading_byte); + pos++; + } else if ((leading_byte & 0b11100000) == + 0b11000000) { // the first three bits indicate: + // We have a two-byte UTF-8 + if (pos + 1 >= len) { + break; + } // minimal bound checking + if ((data[pos + 1] & 0b11000000) != 0b10000000) { + return 0; + } // checks if the next byte is a valid continuation byte in UTF-8. A + // valid continuation byte starts with 10. + // range check - + uint32_t code_point = + (leading_byte & 0b00011111) << 6 | + (data[pos + 1] & + 0b00111111); // assembles the Unicode code point from the two bytes. + // It does this by discarding the leading 110 and 10 + // bits from the two bytes, shifting the remaining bits + // of the first byte, and then combining the results + // with a bitwise OR operation. + *latin_output++ = char(code_point); + pos += 2; + } else { + // we may have a continuation but we do not do error checking + return 0; + } + } + return latin_output - start; +} + +} // namespace utf8_to_latin1 +} // unnamed namespace +} // namespace scalar +} // namespace simdutf + +#endif +/* end file src/scalar/utf8_to_latin1/valid_utf8_to_latin1.h */ +/* begin file src/scalar/utf16_to_latin1/valid_utf16_to_latin1.h */ +#ifndef SIMDUTF_VALID_UTF16_TO_LATIN1_H +#define SIMDUTF_VALID_UTF16_TO_LATIN1_H + +namespace simdutf { +namespace scalar { +namespace { +namespace utf16_to_latin1 { + +template +inline size_t convert_valid(const char16_t *buf, size_t len, + char *latin_output) { + const uint16_t *data = reinterpret_cast(buf); + size_t pos = 0; + char *start{latin_output}; + uint16_t word = 0; + + while (pos < len) { + word = !match_system(big_endian) ? utf16::swap_bytes(data[pos]) : data[pos]; + *latin_output++ = char(word); + pos++; + } + + return latin_output - start; +} + +} // namespace utf16_to_latin1 +} // unnamed namespace +} // namespace scalar +} // namespace simdutf + +#endif +/* end file src/scalar/utf16_to_latin1/valid_utf16_to_latin1.h */ +/* begin file src/scalar/utf32_to_latin1/valid_utf32_to_latin1.h */ +#ifndef SIMDUTF_VALID_UTF32_TO_LATIN1_H +#define SIMDUTF_VALID_UTF32_TO_LATIN1_H + +namespace simdutf { +namespace scalar { +namespace { +namespace utf32_to_latin1 { + +inline size_t convert_valid(const char32_t *buf, size_t len, + char *latin1_output) { + const uint32_t *data = reinterpret_cast(buf); + char *start = latin1_output; + uint32_t utf32_char; + size_t pos = 0; + + while (pos < len) { + utf32_char = (uint32_t)data[pos]; + + if (pos + 2 <= + len) { // if it is safe to read 8 more bytes, check that they are Latin1 + uint64_t v; + ::memcpy(&v, data + pos, sizeof(uint64_t)); + if ((v & 0xFFFFFF00FFFFFF00) == 0) { + *latin1_output++ = char(buf[pos]); + *latin1_output++ = char(buf[pos + 1]); + pos += 2; + continue; + } else { + // output can not be represented in latin1 + return 0; + } + } + if ((utf32_char & 0xFFFFFF00) == 0) { + *latin1_output++ = char(utf32_char); + } else { + // output can not be represented in latin1 + return 0; + } + pos++; + } + return latin1_output - start; +} + +} // namespace utf32_to_latin1 +} // unnamed namespace +} // namespace scalar +} // namespace simdutf + +#endif +/* end file src/scalar/utf32_to_latin1/valid_utf32_to_latin1.h */ + +SIMDUTF_PUSH_DISABLE_WARNINGS +SIMDUTF_DISABLE_UNDESIRED_WARNINGS + +#if SIMDUTF_IMPLEMENTATION_ARM64 +/* begin file src/arm64/implementation.cpp */ +/* begin file src/simdutf/arm64/begin.h */ +// redefining SIMDUTF_IMPLEMENTATION to "arm64" +// #define SIMDUTF_IMPLEMENTATION arm64 +/* end file src/simdutf/arm64/begin.h */ +namespace simdutf { +namespace arm64 { +namespace { +#ifndef SIMDUTF_ARM64_H + #error "arm64.h must be included" +#endif +using namespace simd; + +simdutf_really_inline bool is_ascii(const simd8x64 &input) { + simd8 bits = input.reduce_or(); + return bits.max_val() < 0b10000000u; +} + +simdutf_unused simdutf_really_inline simd8 +must_be_continuation(const simd8 prev1, const simd8 prev2, + const simd8 prev3) { + simd8 is_second_byte = prev1 >= uint8_t(0b11000000u); + simd8 is_third_byte = prev2 >= uint8_t(0b11100000u); + simd8 is_fourth_byte = prev3 >= uint8_t(0b11110000u); + // Use ^ instead of | for is_*_byte, because ^ is commutative, and the caller + // is using ^ as well. This will work fine because we only have to report + // errors for cases with 0-1 lead bytes. Multiple lead bytes implies 2 + // overlapping multibyte characters, and if that happens, there is guaranteed + // to be at least *one* lead byte that is part of only 1 other multibyte + // character. The error will be detected there. + return is_second_byte ^ is_third_byte ^ is_fourth_byte; +} + +simdutf_really_inline simd8 +must_be_2_3_continuation(const simd8 prev2, + const simd8 prev3) { + simd8 is_third_byte = prev2 >= uint8_t(0b11100000u); + simd8 is_fourth_byte = prev3 >= uint8_t(0b11110000u); + return is_third_byte ^ is_fourth_byte; +} + +// common functions for utf8 conversions +simdutf_really_inline uint16x4_t convert_utf8_3_byte_to_utf16(uint8x16_t in) { + // Low half contains 10cccccc|1110aaaa + // High half contains 10bbbbbb|10bbbbbb +#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO + const uint8x16_t sh = simdutf_make_uint8x16_t(0, 2, 3, 5, 6, 8, 9, 11, 1, 1, + 4, 4, 7, 7, 10, 10); +#else + const uint8x16_t sh = {0, 2, 3, 5, 6, 8, 9, 11, 1, 1, 4, 4, 7, 7, 10, 10}; +#endif + uint8x16_t perm = vqtbl1q_u8(in, sh); + // Split into half vectors. + // 10cccccc|1110aaaa + uint8x8_t perm_low = vget_low_u8(perm); // no-op + // 10bbbbbb|10bbbbbb + uint8x8_t perm_high = vget_high_u8(perm); + // xxxxxxxx 10bbbbbb + uint16x4_t mid = vreinterpret_u16_u8(perm_high); // no-op + // xxxxxxxx 1110aaaa + uint16x4_t high = vreinterpret_u16_u8(perm_low); // no-op + // Assemble with shift left insert. + // xxxxxxaa aabbbbbb + uint16x4_t mid_high = vsli_n_u16(mid, high, 6); + // (perm_low << 8) | (perm_low >> 8) + // xxxxxxxx 10cccccc + uint16x4_t low = vreinterpret_u16_u8(vrev16_u8(perm_low)); + // Shift left insert into the low bits + // aaaabbbb bbcccccc + uint16x4_t composed = vsli_n_u16(low, mid_high, 6); + return composed; +} + +simdutf_really_inline uint16x8_t convert_utf8_2_byte_to_utf16(uint8x16_t in) { + // Converts 6 2 byte UTF-8 characters to 6 UTF-16 characters. + // Technically this calculates 8, but 6 does better and happens more often + // (The languages which use these codepoints use ASCII spaces so 8 would need + // to be in the middle of a very long word). + + // 10bbbbbb 110aaaaa + uint16x8_t upper = vreinterpretq_u16_u8(in); + // (in << 8) | (in >> 8) + // 110aaaaa 10bbbbbb + uint16x8_t lower = vreinterpretq_u16_u8(vrev16q_u8(in)); + // 00000000 000aaaaa + uint16x8_t upper_masked = vandq_u16(upper, vmovq_n_u16(0x1F)); + // Assemble with shift left insert. + // 00000aaa aabbbbbb + uint16x8_t composed = vsliq_n_u16(lower, upper_masked, 6); + return composed; +} + +simdutf_really_inline uint16x8_t +convert_utf8_1_to_2_byte_to_utf16(uint8x16_t in, size_t shufutf8_idx) { + // Converts 6 1-2 byte UTF-8 characters to 6 UTF-16 characters. + // This is a relatively easy scenario + // we process SIX (6) input code-code units. The max length in bytes of six + // code code units spanning between 1 and 2 bytes each is 12 bytes. + uint8x16_t sh = vld1q_u8(reinterpret_cast( + simdutf::tables::utf8_to_utf16::shufutf8[shufutf8_idx])); + // Shuffle + // 1 byte: 00000000 0bbbbbbb + // 2 byte: 110aaaaa 10bbbbbb + uint16x8_t perm = vreinterpretq_u16_u8(vqtbl1q_u8(in, sh)); + // Mask + // 1 byte: 00000000 0bbbbbbb + // 2 byte: 00000000 00bbbbbb + uint16x8_t ascii = vandq_u16(perm, vmovq_n_u16(0x7f)); // 6 or 7 bits + // 1 byte: 00000000 00000000 + // 2 byte: 000aaaaa 00000000 + uint16x8_t highbyte = vandq_u16(perm, vmovq_n_u16(0x1f00)); // 5 bits + // Combine with a shift right accumulate + // 1 byte: 00000000 0bbbbbbb + // 2 byte: 00000aaa aabbbbbb + uint16x8_t composed = vsraq_n_u16(ascii, highbyte, 2); + return composed; +} + +/* begin file src/arm64/arm_validate_utf16.cpp */ +template +const char16_t *arm_validate_utf16(const char16_t *input, size_t size) { + const char16_t *end = input + size; + const auto v_d8 = simd8::splat(0xd8); + const auto v_f8 = simd8::splat(0xf8); + const auto v_fc = simd8::splat(0xfc); + const auto v_dc = simd8::splat(0xdc); + while (end - input >= 16) { + // 0. Load data: since the validation takes into account only higher + // byte of each word, we compress the two vectors into one which + // consists only the higher bytes. + auto in0 = simd16(input); + auto in1 = + simd16(input + simd16::SIZE / sizeof(char16_t)); + if (!match_system(big_endian)) { + in0 = vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(in0))); + in1 = vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(in1))); + } + const auto t0 = in0.shr<8>(); + const auto t1 = in1.shr<8>(); + const simd8 in = simd16::pack(t0, t1); + // 1. Check whether we have any 0xD800..DFFF word (0b1101'1xxx'yyyy'yyyy). + const uint64_t surrogates_wordmask = ((in & v_f8) == v_d8).to_bitmask64(); + if (surrogates_wordmask == 0) { + input += 16; + } else { + // 2. We have some surrogates that have to be distinguished: + // - low surrogates: 0b1101'10xx'yyyy'yyyy (0xD800..0xDBFF) + // - high surrogates: 0b1101'11xx'yyyy'yyyy (0xDC00..0xDFFF) + // + // Fact: high surrogate has 11th bit set (3rd bit in the higher word) + + // V - non-surrogate code units + // V = not surrogates_wordmask + const uint64_t V = ~surrogates_wordmask; + + // H - word-mask for high surrogates: the six highest bits are 0b1101'11 + const auto vH = ((in & v_fc) == v_dc); + const uint64_t H = vH.to_bitmask64(); + + // L - word mask for low surrogates + // L = not H and surrogates_wordmask + const uint64_t L = ~H & surrogates_wordmask; + + const uint64_t a = + L & (H >> 4); // A low surrogate must be followed by high one. + // (A low surrogate placed in the 7th register's word + // is an exception we handle.) + const uint64_t b = + a << 4; // Just mark that the opposite fact is hold, + // thanks to that we have only two masks for valid case. + const uint64_t c = V | a | b; // Combine all the masks into the final one. + if (c == ~0ull) { + // The whole input register contains valid UTF-16, i.e., + // either single code units or proper surrogate pairs. + input += 16; + } else if (c == 0xfffffffffffffffull) { + // The 15 lower code units of the input register contains valid UTF-16. + // The 15th word may be either a low or high surrogate. It the next + // iteration we 1) check if the low surrogate is followed by a high + // one, 2) reject sole high surrogate. + input += 15; + } else { + return nullptr; + } + } + } + return input; +} + +template +const result arm_validate_utf16_with_errors(const char16_t *input, + size_t size) { + const char16_t *start = input; + const char16_t *end = input + size; + + const auto v_d8 = simd8::splat(0xd8); + const auto v_f8 = simd8::splat(0xf8); + const auto v_fc = simd8::splat(0xfc); + const auto v_dc = simd8::splat(0xdc); + while (input + 16 < end) { + // 0. Load data: since the validation takes into account only higher + // byte of each word, we compress the two vectors into one which + // consists only the higher bytes. + auto in0 = simd16(input); + auto in1 = + simd16(input + simd16::SIZE / sizeof(char16_t)); + + if (!match_system(big_endian)) { + in0 = vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(in0))); + in1 = vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(in1))); + } + const auto t0 = in0.shr<8>(); + const auto t1 = in1.shr<8>(); + const simd8 in = simd16::pack(t0, t1); + // 1. Check whether we have any 0xD800..DFFF word (0b1101'1xxx'yyyy'yyyy). + const uint64_t surrogates_wordmask = ((in & v_f8) == v_d8).to_bitmask64(); + if (surrogates_wordmask == 0) { + input += 16; + } else { + // 2. We have some surrogates that have to be distinguished: + // - low surrogates: 0b1101'10xx'yyyy'yyyy (0xD800..0xDBFF) + // - high surrogates: 0b1101'11xx'yyyy'yyyy (0xDC00..0xDFFF) + // + // Fact: high surrogate has 11th bit set (3rd bit in the higher word) + + // V - non-surrogate code units + // V = not surrogates_wordmask + const uint64_t V = ~surrogates_wordmask; + + // H - word-mask for high surrogates: the six highest bits are 0b1101'11 + const auto vH = ((in & v_fc) == v_dc); + const uint64_t H = vH.to_bitmask64(); + + // L - word mask for low surrogates + // L = not H and surrogates_wordmask + const uint64_t L = ~H & surrogates_wordmask; + + const uint64_t a = + L & (H >> 4); // A low surrogate must be followed by high one. + // (A low surrogate placed in the 7th register's word + // is an exception we handle.) + const uint64_t b = + a << 4; // Just mark that the opposite fact is hold, + // thanks to that we have only two masks for valid case. + const uint64_t c = V | a | b; // Combine all the masks into the final one. + if (c == ~0ull) { + // The whole input register contains valid UTF-16, i.e., + // either single code units or proper surrogate pairs. + input += 16; + } else if (c == 0xfffffffffffffffull) { + // The 15 lower code units of the input register contains valid UTF-16. + // The 15th word may be either a low or high surrogate. It the next + // iteration we 1) check if the low surrogate is followed by a high + // one, 2) reject sole high surrogate. + input += 15; + } else { + return result(error_code::SURROGATE, input - start); + } + } + } + return result(error_code::SUCCESS, input - start); +} +/* end file src/arm64/arm_validate_utf16.cpp */ +/* begin file src/arm64/arm_validate_utf32le.cpp */ + +const char32_t *arm_validate_utf32le(const char32_t *input, size_t size) { + const char32_t *end = input + size; + + const uint32x4_t standardmax = vmovq_n_u32(0x10ffff); + const uint32x4_t offset = vmovq_n_u32(0xffff2000); + const uint32x4_t standardoffsetmax = vmovq_n_u32(0xfffff7ff); + uint32x4_t currentmax = vmovq_n_u32(0x0); + uint32x4_t currentoffsetmax = vmovq_n_u32(0x0); + + while (end - input >= 4) { + const uint32x4_t in = vld1q_u32(reinterpret_cast(input)); + currentmax = vmaxq_u32(in, currentmax); + currentoffsetmax = vmaxq_u32(vaddq_u32(in, offset), currentoffsetmax); + input += 4; + } + + uint32x4_t is_zero = + veorq_u32(vmaxq_u32(currentmax, standardmax), standardmax); + if (vmaxvq_u32(is_zero) != 0) { + return nullptr; + } + + is_zero = veorq_u32(vmaxq_u32(currentoffsetmax, standardoffsetmax), + standardoffsetmax); + if (vmaxvq_u32(is_zero) != 0) { + return nullptr; + } + + return input; +} + +const result arm_validate_utf32le_with_errors(const char32_t *input, + size_t size) { + const char32_t *start = input; + const char32_t *end = input + size; + + const uint32x4_t standardmax = vmovq_n_u32(0x10ffff); + const uint32x4_t offset = vmovq_n_u32(0xffff2000); + const uint32x4_t standardoffsetmax = vmovq_n_u32(0xfffff7ff); + uint32x4_t currentmax = vmovq_n_u32(0x0); + uint32x4_t currentoffsetmax = vmovq_n_u32(0x0); + + while (end - input >= 4) { + const uint32x4_t in = vld1q_u32(reinterpret_cast(input)); + currentmax = vmaxq_u32(in, currentmax); + currentoffsetmax = vmaxq_u32(vaddq_u32(in, offset), currentoffsetmax); + + uint32x4_t is_zero = + veorq_u32(vmaxq_u32(currentmax, standardmax), standardmax); + if (vmaxvq_u32(is_zero) != 0) { + return result(error_code::TOO_LARGE, input - start); + } + + is_zero = veorq_u32(vmaxq_u32(currentoffsetmax, standardoffsetmax), + standardoffsetmax); + if (vmaxvq_u32(is_zero) != 0) { + return result(error_code::SURROGATE, input - start); + } + + input += 4; + } + + return result(error_code::SUCCESS, input - start); +} +/* end file src/arm64/arm_validate_utf32le.cpp */ + +/* begin file src/arm64/arm_convert_latin1_to_utf16.cpp */ +template +std::pair +arm_convert_latin1_to_utf16(const char *buf, size_t len, + char16_t *utf16_output) { + const char *end = buf + len; + + while (end - buf >= 16) { + uint8x16_t in8 = vld1q_u8(reinterpret_cast(buf)); + uint16x8_t inlow = vmovl_u8(vget_low_u8(in8)); + if (!match_system(big_endian)) { + inlow = vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(inlow))); + } + vst1q_u16(reinterpret_cast(utf16_output), inlow); + uint16x8_t inhigh = vmovl_u8(vget_high_u8(in8)); + if (!match_system(big_endian)) { + inhigh = vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(inhigh))); + } + vst1q_u16(reinterpret_cast(utf16_output + 8), inhigh); + utf16_output += 16; + buf += 16; + } + + return std::make_pair(buf, utf16_output); +} +/* end file src/arm64/arm_convert_latin1_to_utf16.cpp */ +/* begin file src/arm64/arm_convert_latin1_to_utf32.cpp */ +std::pair +arm_convert_latin1_to_utf32(const char *buf, size_t len, + char32_t *utf32_output) { + const char *end = buf + len; + + while (end - buf >= 16) { + uint8x16_t in8 = vld1q_u8(reinterpret_cast(buf)); + uint16x8_t in8low = vmovl_u8(vget_low_u8(in8)); + uint32x4_t in16lowlow = vmovl_u16(vget_low_u16(in8low)); + uint32x4_t in16lowhigh = vmovl_u16(vget_high_u16(in8low)); + uint16x8_t in8high = vmovl_u8(vget_high_u8(in8)); + uint32x4_t in8highlow = vmovl_u16(vget_low_u16(in8high)); + uint32x4_t in8highhigh = vmovl_u16(vget_high_u16(in8high)); + vst1q_u32(reinterpret_cast(utf32_output), in16lowlow); + vst1q_u32(reinterpret_cast(utf32_output + 4), in16lowhigh); + vst1q_u32(reinterpret_cast(utf32_output + 8), in8highlow); + vst1q_u32(reinterpret_cast(utf32_output + 12), in8highhigh); + + utf32_output += 16; + buf += 16; + } + + return std::make_pair(buf, utf32_output); +} +/* end file src/arm64/arm_convert_latin1_to_utf32.cpp */ +/* begin file src/arm64/arm_convert_latin1_to_utf8.cpp */ +/* + Returns a pair: the first unprocessed byte from buf and utf8_output + A scalar routing should carry on the conversion of the tail. +*/ +std::pair +arm_convert_latin1_to_utf8(const char *latin1_input, size_t len, + char *utf8_out) { + uint8_t *utf8_output = reinterpret_cast(utf8_out); + const char *end = latin1_input + len; + const uint16x8_t v_c080 = vmovq_n_u16((uint16_t)0xc080); + // We always write 16 bytes, of which more than the first 8 bytes + // are valid. A safety margin of 8 is more than sufficient. + while (end - latin1_input >= 16 + 8) { + uint8x16_t in8 = vld1q_u8(reinterpret_cast(latin1_input)); + if (vmaxvq_u8(in8) <= 0x7F) { // ASCII fast path!!!! + vst1q_u8(utf8_output, in8); + utf8_output += 16; + latin1_input += 16; + continue; + } + + // We just fallback on UTF-16 code. This could be optimized/simplified + // further. + uint16x8_t in16 = vmovl_u8(vget_low_u8(in8)); + // 1. prepare 2-byte values + // input 8-bit word : [aabb|bbbb] x 8 + // expected output : [1100|00aa|10bb|bbbb] x 8 + const uint16x8_t v_1f00 = vmovq_n_u16((int16_t)0x1f00); + const uint16x8_t v_003f = vmovq_n_u16((int16_t)0x003f); + + // t0 = [0000|00aa|bbbb|bb00] + const uint16x8_t t0 = vshlq_n_u16(in16, 2); + // t1 = [0000|00aa|0000|0000] + const uint16x8_t t1 = vandq_u16(t0, v_1f00); + // t2 = [0000|0000|00bb|bbbb] + const uint16x8_t t2 = vandq_u16(in16, v_003f); + // t3 = [0000|00aa|00bb|bbbb] + const uint16x8_t t3 = vorrq_u16(t1, t2); + // t4 = [1100|00aa|10bb|bbbb] + const uint16x8_t t4 = vorrq_u16(t3, v_c080); + // 2. merge ASCII and 2-byte codewords + const uint16x8_t v_007f = vmovq_n_u16((uint16_t)0x007F); + const uint16x8_t one_byte_bytemask = vcleq_u16(in16, v_007f); + const uint8x16_t utf8_unpacked = + vreinterpretq_u8_u16(vbslq_u16(one_byte_bytemask, in16, t4)); + // 3. prepare bitmask for 8-bit lookup +#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO + const uint16x8_t mask = simdutf_make_uint16x8_t( + 0x0001, 0x0004, 0x0010, 0x0040, 0x0002, 0x0008, 0x0020, 0x0080); +#else + const uint16x8_t mask = {0x0001, 0x0004, 0x0010, 0x0040, + 0x0002, 0x0008, 0x0020, 0x0080}; +#endif + uint16_t m2 = vaddvq_u16(vandq_u16(one_byte_bytemask, mask)); + // 4. pack the bytes + const uint8_t *row = + &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[m2][0]; + const uint8x16_t shuffle = vld1q_u8(row + 1); + const uint8x16_t utf8_packed = vqtbl1q_u8(utf8_unpacked, shuffle); + + // 5. store bytes + vst1q_u8(utf8_output, utf8_packed); + // 6. adjust pointers + latin1_input += 8; + utf8_output += row[0]; + + } // while + + return std::make_pair(latin1_input, reinterpret_cast(utf8_output)); +} +/* end file src/arm64/arm_convert_latin1_to_utf8.cpp */ + +/* begin file src/arm64/arm_convert_utf8_to_latin1.cpp */ +// Convert up to 16 bytes from utf8 to utf16 using a mask indicating the +// end of the code points. Only the least significant 12 bits of the mask +// are accessed. +// It returns how many bytes were consumed (up to 16, usually 12). +size_t convert_masked_utf8_to_latin1(const char *input, + uint64_t utf8_end_of_code_point_mask, + char *&latin1_output) { + // we use an approach where we try to process up to 12 input bytes. + // Why 12 input bytes and not 16? Because we are concerned with the size of + // the lookup tables. Also 12 is nicely divisible by two and three. + // + uint8x16_t in = vld1q_u8(reinterpret_cast(input)); + const uint16_t input_utf8_end_of_code_point_mask = + utf8_end_of_code_point_mask & 0xfff; + // + // Optimization note: our main path below is load-latency dependent. Thus it + // is maybe beneficial to have fast paths that depend on branch prediction but + // have less latency. This results in more instructions but, potentially, also + // higher speeds. + + // We first try a few fast paths. + // The obvious first test is ASCII, which actually consumes the full 16. + if (utf8_end_of_code_point_mask == 0xfff) { + // We process in chunks of 12 bytes + vst1q_u8(reinterpret_cast(latin1_output), in); + latin1_output += 12; // We wrote 12 18-bit characters. + return 12; // We consumed 12 bytes. + } + /// We do not have a fast path available, or the fast path is unimportant, so + /// we fallback. + const uint8_t idx = simdutf::tables::utf8_to_utf16::utf8bigindex + [input_utf8_end_of_code_point_mask][0]; + + const uint8_t consumed = simdutf::tables::utf8_to_utf16::utf8bigindex + [input_utf8_end_of_code_point_mask][1]; + // this indicates an invalid input: + if (idx >= 64) { + return consumed; + } + // Here we should have (idx < 64), if not, there is a bug in the validation or + // elsewhere. SIX (6) input code-code units this is a relatively easy scenario + // we process SIX (6) input code-code units. The max length in bytes of six + // code code units spanning between 1 and 2 bytes each is 12 bytes. Converts 6 + // 1-2 byte UTF-8 characters to 6 UTF-16 characters. This is a relatively easy + // scenario we process SIX (6) input code-code units. The max length in bytes + // of six code code units spanning between 1 and 2 bytes each is 12 bytes. + uint8x16_t sh = vld1q_u8(reinterpret_cast( + simdutf::tables::utf8_to_utf16::shufutf8[idx])); + // Shuffle + // 1 byte: 00000000 0bbbbbbb + // 2 byte: 110aaaaa 10bbbbbb + uint16x8_t perm = vreinterpretq_u16_u8(vqtbl1q_u8(in, sh)); + // Mask + // 1 byte: 00000000 0bbbbbbb + // 2 byte: 00000000 00bbbbbb + uint16x8_t ascii = vandq_u16(perm, vmovq_n_u16(0x7f)); // 6 or 7 bits + // 1 byte: 00000000 00000000 + // 2 byte: 000aaaaa 00000000 + uint16x8_t highbyte = vandq_u16(perm, vmovq_n_u16(0x1f00)); // 5 bits + // Combine with a shift right accumulate + // 1 byte: 00000000 0bbbbbbb + // 2 byte: 00000aaa aabbbbbb + uint16x8_t composed = vsraq_n_u16(ascii, highbyte, 2); + // writing 8 bytes even though we only care about the first 6 bytes. + uint8x8_t latin1_packed = vmovn_u16(composed); + vst1_u8(reinterpret_cast(latin1_output), latin1_packed); + latin1_output += 6; // We wrote 6 bytes. + return consumed; +} +/* end file src/arm64/arm_convert_utf8_to_latin1.cpp */ +/* begin file src/arm64/arm_convert_utf8_to_utf16.cpp */ +// Convert up to 16 bytes from utf8 to utf16 using a mask indicating the +// end of the code points. Only the least significant 12 bits of the mask +// are accessed. +// It returns how many bytes were consumed (up to 16, usually 12). +template +size_t convert_masked_utf8_to_utf16(const char *input, + uint64_t utf8_end_of_code_point_mask, + char16_t *&utf16_output) { + // we use an approach where we try to process up to 12 input bytes. + // Why 12 input bytes and not 16? Because we are concerned with the size of + // the lookup tables. Also 12 is nicely divisible by two and three. + // + uint8x16_t in = vld1q_u8(reinterpret_cast(input)); + const uint16_t input_utf8_end_of_code_point_mask = + utf8_end_of_code_point_mask & 0xfff; + // + // Optimization note: our main path below is load-latency dependent. Thus it + // is maybe beneficial to have fast paths that depend on branch prediction but + // have less latency. This results in more instructions but, potentially, also + // higher speeds. + + // We first try a few fast paths. + // The obvious first test is ASCII, which actually consumes the full 16. + if ((utf8_end_of_code_point_mask & 0xFFFF) == 0xffff) { + // We process in chunks of 16 bytes + // The routine in simd.h is reused. + simd8 temp{vreinterpretq_s8_u8(in)}; + temp.store_ascii_as_utf16(utf16_output); + utf16_output += 16; // We wrote 16 16-bit characters. + return 16; // We consumed 16 bytes. + } + + // 3 byte sequences are the next most common, as seen in CJK, which has long + // sequences of these. + if (input_utf8_end_of_code_point_mask == 0x924) { + // We want to take 4 3-byte UTF-8 code units and turn them into 4 2-byte + // UTF-16 code units. + uint16x4_t composed = convert_utf8_3_byte_to_utf16(in); + // Byte swap if necessary + if (!match_system(big_endian)) { + composed = vreinterpret_u16_u8(vrev16_u8(vreinterpret_u8_u16(composed))); + } + vst1_u16(reinterpret_cast(utf16_output), composed); + utf16_output += 4; // We wrote 4 16-bit characters. + return 12; // We consumed 12 bytes. + } + + // 2 byte sequences occur in short bursts in languages like Greek and Russian. + if ((utf8_end_of_code_point_mask & 0xFFF) == 0xaaa) { + // We want to take 6 2-byte UTF-8 code units and turn them into 6 2-byte + // UTF-16 code units. + uint16x8_t composed = convert_utf8_2_byte_to_utf16(in); + // Byte swap if necessary + if (!match_system(big_endian)) { + composed = + vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(composed))); + } + vst1q_u16(reinterpret_cast(utf16_output), composed); + + utf16_output += 6; // We wrote 6 16-bit characters. + return 12; // We consumed 12 bytes. + } + + /// We do not have a fast path available, or the fast path is unimportant, so + /// we fallback. + const uint8_t idx = simdutf::tables::utf8_to_utf16::utf8bigindex + [input_utf8_end_of_code_point_mask][0]; + + const uint8_t consumed = simdutf::tables::utf8_to_utf16::utf8bigindex + [input_utf8_end_of_code_point_mask][1]; + + if (idx < 64) { + // SIX (6) input code-code units + // Convert to UTF-16 + uint16x8_t composed = convert_utf8_1_to_2_byte_to_utf16(in, idx); + // Byte swap if necessary + if (!match_system(big_endian)) { + composed = + vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(composed))); + } + // Store + vst1q_u16(reinterpret_cast(utf16_output), composed); + utf16_output += 6; // We wrote 6 16-bit characters. + return consumed; + } else if (idx < 145) { + // FOUR (4) input code-code units + // UTF-16 and UTF-32 use similar algorithms, but UTF-32 skips the narrowing. + uint8x16_t sh = vld1q_u8(reinterpret_cast( + simdutf::tables::utf8_to_utf16::shufutf8[idx])); + // XXX: depending on the system scalar instructions might be faster. + // 1 byte: 00000000 00000000 0ccccccc + // 2 byte: 00000000 110bbbbb 10cccccc + // 3 byte: 1110aaaa 10bbbbbb 10cccccc + uint32x4_t perm = vreinterpretq_u32_u8(vqtbl1q_u8(in, sh)); + // 1 byte: 00000000 0ccccccc + // 2 byte: xx0bbbbb x0cccccc + // 3 byte: xxbbbbbb x0cccccc + uint16x4_t lowperm = vmovn_u32(perm); + // Partially mask with bic (doesn't require a temporary register unlike and) + // The shift left insert below will clear the top bits. + // 1 byte: 00000000 00000000 + // 2 byte: xx0bbbbb 00000000 + // 3 byte: xxbbbbbb 00000000 + uint16x4_t middlebyte = vbic_u16(lowperm, vmov_n_u16(uint16_t(~0xFF00))); + // ASCII + // 1 byte: 00000000 0ccccccc + // 2+byte: 00000000 00cccccc + uint16x4_t ascii = vand_u16(lowperm, vmov_n_u16(0x7F)); + // Split into narrow vectors. + // 2 byte: 00000000 00000000 + // 3 byte: 00000000 xxxxaaaa + uint16x4_t highperm = vshrn_n_u32(perm, 16); + // Shift right accumulate the middle byte + // 1 byte: 00000000 0ccccccc + // 2 byte: 00xx0bbb bbcccccc + // 3 byte: 00xxbbbb bbcccccc + uint16x4_t middlelow = vsra_n_u16(ascii, middlebyte, 2); + // Shift left and insert the top 4 bits, overwriting the garbage + // 1 byte: 00000000 0ccccccc + // 2 byte: 00000bbb bbcccccc + // 3 byte: aaaabbbb bbcccccc + uint16x4_t composed = vsli_n_u16(middlelow, highperm, 12); + // Byte swap if necessary + if (!match_system(big_endian)) { + composed = vreinterpret_u16_u8(vrev16_u8(vreinterpret_u8_u16(composed))); + } + vst1_u16(reinterpret_cast(utf16_output), composed); + + utf16_output += 4; // We wrote 4 16-bit codepoints + return consumed; + } else if (idx < 209) { + // THREE (3) input code-code units + if (input_utf8_end_of_code_point_mask == 0x888) { + // We want to take 3 4-byte UTF-8 code units and turn them into 3 4-byte + // UTF-16 pairs. Generating surrogate pairs is a little tricky though, but + // it is easier when we can assume they are all pairs. This version does + // not use the LUT, but 4 byte sequences are less common and the overhead + // of the extra memory access is less important than the early branch + // overhead in shorter sequences. + + // Swap byte pairs + // 10dddddd 10cccccc|10bbbbbb 11110aaa + // 10cccccc 10dddddd|11110aaa 10bbbbbb + uint8x16_t swap = vrev16q_u8(in); + // Shift left 2 bits + // cccccc00 dddddd00 xxxxxxxx bbbbbb00 + uint32x4_t shift = vreinterpretq_u32_u8(vshlq_n_u8(swap, 2)); + // Create a magic number containing the low 2 bits of the trail surrogate + // and all the corrections needed to create the pair. UTF-8 4b prefix = + // -0x0000|0xF000 surrogate offset = -0x0000|0x0040 (0x10000 << 6) + // surrogate high = +0x0000|0xD800 + // surrogate low = +0xDC00|0x0000 + // ------------------------------- + // = +0xDC00|0xE7C0 + uint32x4_t magic = vmovq_n_u32(0xDC00E7C0); + // Generate unadjusted trail surrogate minus lowest 2 bits + // xxxxxxxx xxxxxxxx|11110aaa bbbbbb00 + uint32x4_t trail = + vbslq_u32(vmovq_n_u32(0x0000FF00), vreinterpretq_u32_u8(swap), shift); + // Insert low 2 bits of trail surrogate to magic number for later + // 11011100 00000000 11100111 110000cc + uint16x8_t magic_with_low_2 = + vreinterpretq_u16_u32(vsraq_n_u32(magic, shift, 30)); + // Generate lead surrogate + // xxxxcccc ccdddddd|xxxxxxxx xxxxxxxx + uint32x4_t lead = vreinterpretq_u32_u16( + vsliq_n_u16(vreinterpretq_u16_u8(swap), vreinterpretq_u16_u8(in), 6)); + // Mask out lead + // 000000cc ccdddddd|xxxxxxxx xxxxxxxx + lead = vbicq_u32(lead, vmovq_n_u32(uint32_t(~0x03FFFFFF))); + // Blend pairs + // 000000cc ccdddddd|11110aaa bbbbbb00 + uint16x8_t blend = vreinterpretq_u16_u32( + vbslq_u32(vmovq_n_u32(0x0000FFFF), trail, lead)); + // Add magic number to finish the result + // 110111CC CCDDDDDD|110110AA BBBBBBCC + uint16x8_t composed = vaddq_u16(blend, magic_with_low_2); + // Byte swap if necessary + if (!match_system(big_endian)) { + composed = + vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(composed))); + } + uint16_t buffer[8]; + vst1q_u16(reinterpret_cast(buffer), composed); + for (int k = 0; k < 6; k++) { + utf16_output[k] = buffer[k]; + } // the loop might compiler to a couple of instructions. + utf16_output += 6; // We wrote 3 32-bit surrogate pairs. + return 12; // We consumed 12 bytes. + } + // 3 1-4 byte sequences + uint8x16_t sh = vld1q_u8(reinterpret_cast( + simdutf::tables::utf8_to_utf16::shufutf8[idx])); + + // 1 byte: 00000000 00000000 00000000 0ddddddd + // 3 byte: 00000000 00000000 110ccccc 10dddddd + // 3 byte: 00000000 1110bbbb 10cccccc 10dddddd + // 4 byte: 11110aaa 10bbbbbb 10cccccc 10dddddd + uint32x4_t perm = vreinterpretq_u32_u8(vqtbl1q_u8(in, sh)); + // added to fix issue https://github.com/simdutf/simdutf/issues/514 + // We only want to write 2 * 16-bit code units when that is actually what we + // have. Unfortunately, we cannot trust the input. So it is possible to get + // 0xff as an input byte and it should not result in a surrogate pair. We + // need to check for that. + uint32_t permbuffer[4]; + vst1q_u32(permbuffer, perm); + // Mask the low and middle bytes + // 00000000 00000000 00000000 0ddddddd + uint32x4_t ascii = vandq_u32(perm, vmovq_n_u32(0x7f)); + // Because the surrogates need more work, the high surrogate is computed + // first. + uint32x4_t middlehigh = vshlq_n_u32(perm, 2); + // 00000000 00000000 00cccccc 00000000 + uint32x4_t middlebyte = vandq_u32(perm, vmovq_n_u32(0x3F00)); + // Start assembling the sequence. Since the 4th byte is in the same position + // as it would be in a surrogate and there is no dependency, shift left + // instead of right. 3 byte: 00000000 10bbbbxx xxxxxxxx xxxxxxxx 4 byte: + // 11110aaa bbbbbbxx xxxxxxxx xxxxxxxx + uint32x4_t ab = vbslq_u32(vmovq_n_u32(0xFF000000), perm, middlehigh); + // Top 16 bits contains the high ten bits of the surrogate pair before + // correction 3 byte: 00000000 10bbbbcc|cccc0000 00000000 4 byte: 11110aaa + // bbbbbbcc|cccc0000 00000000 - high 10 bits correct w/o correction + uint32x4_t abc = + vbslq_u32(vmovq_n_u32(0xFFFC0000), ab, vshlq_n_u32(middlebyte, 4)); + // Combine the low 6 or 7 bits by a shift right accumulate + // 3 byte: 00000000 00000010|bbbbcccc ccdddddd - low 16 bits correct + // 4 byte: 00000011 110aaabb|bbbbcccc ccdddddd - low 10 bits correct w/o + // correction + uint32x4_t composed = vsraq_n_u32(ascii, abc, 6); + // After this is for surrogates + // Blend the low and high surrogates + // 4 byte: 11110aaa bbbbbbcc|bbbbcccc ccdddddd + uint32x4_t mixed = vbslq_u32(vmovq_n_u32(0xFFFF0000), abc, composed); + // Clear the upper 6 bits of the low surrogate. Don't clear the upper bits + // yet as 0x10000 was not subtracted from the codepoint yet. 4 byte: + // 11110aaa bbbbbbcc|000000cc ccdddddd + uint16x8_t masked_pair = vreinterpretq_u16_u32( + vbicq_u32(mixed, vmovq_n_u32(uint32_t(~0xFFFF03FF)))); + // Correct the remaining UTF-8 prefix, surrogate offset, and add the + // surrogate prefixes in one magic 16-bit addition. similar magic number but + // without the continue byte adjust and halfword swapped UTF-8 4b prefix = + // -0xF000|0x0000 surrogate offset = -0x0040|0x0000 (0x10000 << 6) + // surrogate high = +0xD800|0x0000 + // surrogate low = +0x0000|0xDC00 + // ----------------------------------- + // = +0xE7C0|0xDC00 + uint16x8_t magic = vreinterpretq_u16_u32(vmovq_n_u32(0xE7C0DC00)); + // 4 byte: 110110AA BBBBBBCC|110111CC CCDDDDDD - surrogate pair complete + uint32x4_t surrogates = + vreinterpretq_u32_u16(vaddq_u16(masked_pair, magic)); + // If the high bit is 1 (s32 less than zero), this needs a surrogate pair + uint32x4_t is_pair = vcltzq_s32(vreinterpretq_s32_u32(perm)); + + // Select either the 4 byte surrogate pair or the 2 byte solo codepoint + // 3 byte: 0xxxxxxx xxxxxxxx|bbbbcccc ccdddddd + // 4 byte: 110110AA BBBBBBCC|110111CC CCDDDDDD + uint32x4_t selected = vbslq_u32(is_pair, surrogates, composed); + // Byte swap if necessary + if (!match_system(big_endian)) { + selected = + vreinterpretq_u32_u8(vrev16q_u8(vreinterpretq_u8_u32(selected))); + } + // Attempting to shuffle and store would be complex, just scalarize. + uint32_t buffer[4]; + vst1q_u32(buffer, selected); + // Test for the top bit of the surrogate mask. Remove due to issue 514 + // const uint32_t SURROGATE_MASK = match_system(big_endian) ? 0x80000000 : + // 0x00800000; + for (size_t i = 0; i < 3; i++) { + // Surrogate + // Used to be if (buffer[i] & SURROGATE_MASK) { + // See discussion above. + // patch for issue https://github.com/simdutf/simdutf/issues/514 + if ((permbuffer[i] & 0xf8000000) == 0xf0000000) { + utf16_output[0] = uint16_t(buffer[i] >> 16); + utf16_output[1] = uint16_t(buffer[i] & 0xFFFF); + utf16_output += 2; + } else { + utf16_output[0] = uint16_t(buffer[i] & 0xFFFF); + utf16_output++; + } + } + return consumed; + } else { + // here we know that there is an error but we do not handle errors + return 12; + } +} +/* end file src/arm64/arm_convert_utf8_to_utf16.cpp */ +/* begin file src/arm64/arm_convert_utf8_to_utf32.cpp */ +// Convert up to 12 bytes from utf8 to utf32 using a mask indicating the +// end of the code points. Only the least significant 12 bits of the mask +// are accessed. +// It returns how many bytes were consumed (up to 12). +size_t convert_masked_utf8_to_utf32(const char *input, + uint64_t utf8_end_of_code_point_mask, + char32_t *&utf32_out) { + // we use an approach where we try to process up to 12 input bytes. + // Why 12 input bytes and not 16? Because we are concerned with the size of + // the lookup tables. Also 12 is nicely divisible by two and three. + // + uint32_t *&utf32_output = reinterpret_cast(utf32_out); + uint8x16_t in = vld1q_u8(reinterpret_cast(input)); + const uint16_t input_utf8_end_of_code_point_mask = + utf8_end_of_code_point_mask & 0xFFF; + // + // Optimization note: our main path below is load-latency dependent. Thus it + // is maybe beneficial to have fast paths that depend on branch prediction but + // have less latency. This results in more instructions but, potentially, also + // higher speeds. + // + // We first try a few fast paths. + if (utf8_end_of_code_point_mask == 0xfff) { + // We process in chunks of 12 bytes. + // use fast implementation in src/simdutf/arm64/simd.h + // Ideally the compiler can keep the tables in registers. + simd8 temp{vreinterpretq_s8_u8(in)}; + temp.store_ascii_as_utf32_tbl(utf32_out); + utf32_output += 12; // We wrote 12 32-bit characters. + return 12; // We consumed 12 bytes. + } + if (input_utf8_end_of_code_point_mask == 0x924) { + // We want to take 4 3-byte UTF-8 code units and turn them into 4 4-byte + // UTF-32 code units. Convert to UTF-16 + uint16x4_t composed_utf16 = convert_utf8_3_byte_to_utf16(in); + // Zero extend and store via ST2 with a zero. + uint16x4x2_t interleaver = {{composed_utf16, vmov_n_u16(0)}}; + vst2_u16(reinterpret_cast(utf32_output), interleaver); + utf32_output += 4; // We wrote 4 32-bit characters. + return 12; // We consumed 12 bytes. + } + + // 2 byte sequences occur in short bursts in languages like Greek and Russian. + if (input_utf8_end_of_code_point_mask == 0xaaa) { + // We want to take 6 2-byte UTF-8 code units and turn them into 6 4-byte + // UTF-32 code units. Convert to UTF-16 + uint16x8_t composed_utf16 = convert_utf8_2_byte_to_utf16(in); + // Zero extend and store via ST2 with a zero. + uint16x8x2_t interleaver = {{composed_utf16, vmovq_n_u16(0)}}; + vst2q_u16(reinterpret_cast(utf32_output), interleaver); + utf32_output += 6; // We wrote 6 32-bit characters. + return 12; // We consumed 12 bytes. + } + /// Either no fast path or an unimportant fast path. + + const uint8_t idx = simdutf::tables::utf8_to_utf16::utf8bigindex + [input_utf8_end_of_code_point_mask][0]; + const uint8_t consumed = simdutf::tables::utf8_to_utf16::utf8bigindex + [input_utf8_end_of_code_point_mask][1]; + + if (idx < 64) { + // SIX (6) input code-code units + // Convert to UTF-16 + uint16x8_t composed_utf16 = convert_utf8_1_to_2_byte_to_utf16(in, idx); + // Zero extend and store with ST2 and zero + uint16x8x2_t interleaver = {{composed_utf16, vmovq_n_u16(0)}}; + vst2q_u16(reinterpret_cast(utf32_output), interleaver); + utf32_output += 6; // We wrote 6 32-bit characters. + return consumed; + } else if (idx < 145) { + // FOUR (4) input code-code units + // UTF-16 and UTF-32 use similar algorithms, but UTF-32 skips the narrowing. + uint8x16_t sh = vld1q_u8(reinterpret_cast( + simdutf::tables::utf8_to_utf16::shufutf8[idx])); + // Shuffle + // 1 byte: 00000000 00000000 0ccccccc + // 2 byte: 00000000 110bbbbb 10cccccc + // 3 byte: 1110aaaa 10bbbbbb 10cccccc + uint32x4_t perm = vreinterpretq_u32_u8(vqtbl1q_u8(in, sh)); + // Split + // 00000000 00000000 0ccccccc + uint32x4_t ascii = vandq_u32(perm, vmovq_n_u32(0x7F)); // 6 or 7 bits + // Note: unmasked + // xxxxxxxx aaaaxxxx xxxxxxxx + uint32x4_t high = vshrq_n_u32(perm, 4); // 4 bits + // Use 16 bit bic instead of and. + // The top bits will be corrected later in the bsl + // 00000000 10bbbbbb 00000000 + uint32x4_t middle = vreinterpretq_u32_u16( + vbicq_u16(vreinterpretq_u16_u32(perm), + vmovq_n_u16(uint16_t(~0xff00)))); // 5 or 6 bits + // Combine low and middle with shift right accumulate + // 00000000 00xxbbbb bbcccccc + uint32x4_t lowmid = vsraq_n_u32(ascii, middle, 2); + // Insert top 4 bits from high byte with bitwise select + // 00000000 aaaabbbb bbcccccc + uint32x4_t composed = vbslq_u32(vmovq_n_u32(0x0000F000), high, lowmid); + vst1q_u32(utf32_output, composed); + utf32_output += 4; // We wrote 4 32-bit characters. + return consumed; + } else if (idx < 209) { + // THREE (3) input code-code units + if (input_utf8_end_of_code_point_mask == 0x888) { + // We want to take 3 4-byte UTF-8 code units and turn them into 3 4-byte + // UTF-32 code units. This uses the same method as the fixed 3 byte + // version, reversing and shift left insert. However, there is no need for + // a shuffle mask now, just rev16 and rev32. + // + // This version does not use the LUT, but 4 byte sequences are less common + // and the overhead of the extra memory access is less important than the + // early branch overhead in shorter sequences, so it comes last. + + // Swap pairs of bytes + // 10dddddd|10cccccc|10bbbbbb|11110aaa + // 10cccccc 10dddddd|11110aaa 10bbbbbb + uint16x8_t swap1 = vreinterpretq_u16_u8(vrev16q_u8(in)); + // Shift left and insert + // xxxxcccc ccdddddd|xxxxxxxa aabbbbbb + uint16x8_t merge1 = vsliq_n_u16(swap1, vreinterpretq_u16_u8(in), 6); + // Swap 16-bit lanes + // xxxxcccc ccdddddd xxxxxxxa aabbbbbb + // xxxxxxxa aabbbbbb xxxxcccc ccdddddd + uint32x4_t swap2 = vreinterpretq_u32_u16(vrev32q_u16(merge1)); + // Shift insert again + // xxxxxxxx xxxaaabb bbbbcccc ccdddddd + uint32x4_t merge2 = vsliq_n_u32(swap2, vreinterpretq_u32_u16(merge1), 12); + // Clear the garbage + // 00000000 000aaabb bbbbcccc ccdddddd + uint32x4_t composed = vandq_u32(merge2, vmovq_n_u32(0x1FFFFF)); + // Store + vst1q_u32(utf32_output, composed); + + utf32_output += 3; // We wrote 3 32-bit characters. + return 12; // We consumed 12 bytes. + } + // Unlike UTF-16, doing a fast codepath doesn't have nearly as much benefit + // due to surrogates no longer being involved. + uint8x16_t sh = vld1q_u8(reinterpret_cast( + simdutf::tables::utf8_to_utf16::shufutf8[idx])); + // 1 byte: 00000000 00000000 00000000 0ddddddd + // 2 byte: 00000000 00000000 110ccccc 10dddddd + // 3 byte: 00000000 1110bbbb 10cccccc 10dddddd + // 4 byte: 11110aaa 10bbbbbb 10cccccc 10dddddd + uint32x4_t perm = vreinterpretq_u32_u8(vqtbl1q_u8(in, sh)); + // Ascii + uint32x4_t ascii = vandq_u32(perm, vmovq_n_u32(0x7F)); + uint32x4_t middle = vandq_u32(perm, vmovq_n_u32(0x3f00)); + // When converting the way we do, the 3 byte prefix will be interpreted as + // the 18th bit being set, since the code would interpret the lead byte + // (0b1110bbbb) as a continuation byte (0b10bbbbbb). To fix this, we can + // either xor or do an 8 bit add of the 6th bit shifted right by 1. Since + // NEON has shift right accumulate, we use that. + // 4 byte 3 byte + // 10bbbbbb 1110bbbb + // 00000000 01000000 6th bit + // 00000000 00100000 shift right + // 10bbbbbb 0000bbbb add + // 00bbbbbb 0000bbbb mask + uint8x16_t correction = + vreinterpretq_u8_u32(vandq_u32(perm, vmovq_n_u32(0x00400000))); + uint32x4_t corrected = vreinterpretq_u32_u8( + vsraq_n_u8(vreinterpretq_u8_u32(perm), correction, 1)); + // 00000000 00000000 0000cccc ccdddddd + uint32x4_t cd = vsraq_n_u32(ascii, middle, 2); + // Insert twice + // xxxxxxxx xxxaaabb bbbbxxxx xxxxxxxx + uint32x4_t ab = vbslq_u32(vmovq_n_u32(0x01C0000), vshrq_n_u32(corrected, 6), + vshrq_n_u32(corrected, 4)); + // 00000000 000aaabb bbbbcccc ccdddddd + uint32x4_t composed = vbslq_u32(vmovq_n_u32(0xFFE00FFF), cd, ab); + // Store + vst1q_u32(utf32_output, composed); + utf32_output += 3; // We wrote 3 32-bit characters. + return consumed; + } else { + // here we know that there is an error but we do not handle errors + return 12; + } +} +/* end file src/arm64/arm_convert_utf8_to_utf32.cpp */ + +/* begin file src/arm64/arm_convert_utf16_to_latin1.cpp */ + +template +std::pair +arm_convert_utf16_to_latin1(const char16_t *buf, size_t len, + char *latin1_output) { + const char16_t *end = buf + len; + while (end - buf >= 8) { + uint16x8_t in = vld1q_u16(reinterpret_cast(buf)); + if (!match_system(big_endian)) { + in = vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(in))); + } + if (vmaxvq_u16(in) <= 0xff) { + // 1. pack the bytes + uint8x8_t latin1_packed = vmovn_u16(in); + // 2. store (8 bytes) + vst1_u8(reinterpret_cast(latin1_output), latin1_packed); + // 3. adjust pointers + buf += 8; + latin1_output += 8; + } else { + return std::make_pair(nullptr, reinterpret_cast(latin1_output)); + } + } // while + return std::make_pair(buf, latin1_output); +} + +template +std::pair +arm_convert_utf16_to_latin1_with_errors(const char16_t *buf, size_t len, + char *latin1_output) { + const char16_t *start = buf; + const char16_t *end = buf + len; + while (end - buf >= 8) { + uint16x8_t in = vld1q_u16(reinterpret_cast(buf)); + if (!match_system(big_endian)) { + in = vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(in))); + } + if (vmaxvq_u16(in) <= 0xff) { + // 1. pack the bytes + uint8x8_t latin1_packed = vmovn_u16(in); + // 2. store (8 bytes) + vst1_u8(reinterpret_cast(latin1_output), latin1_packed); + // 3. adjust pointers + buf += 8; + latin1_output += 8; + } else { + // Let us do a scalar fallback. + for (int k = 0; k < 8; k++) { + uint16_t word = !match_system(big_endian) + ? scalar::utf16::swap_bytes(buf[k]) + : buf[k]; + if (word <= 0xff) { + *latin1_output++ = char(word); + } else { + return std::make_pair(result(error_code::TOO_LARGE, buf - start + k), + latin1_output); + } + } + } + } // while + return std::make_pair(result(error_code::SUCCESS, buf - start), + latin1_output); +} +/* end file src/arm64/arm_convert_utf16_to_latin1.cpp */ +/* begin file src/arm64/arm_convert_utf16_to_utf32.cpp */ +/* + The vectorized algorithm works on single SSE register i.e., it + loads eight 16-bit code units. + + We consider three cases: + 1. an input register contains no surrogates and each value + is in range 0x0000 .. 0x07ff. + 2. an input register contains no surrogates and values are + is in range 0x0000 .. 0xffff. + 3. an input register contains surrogates --- i.e. codepoints + can have 16 or 32 bits. + + Ad 1. + + When values are less than 0x0800, it means that a 16-bit code unit + can be converted into: 1) single UTF8 byte (when it is an ASCII + char) or 2) two UTF8 bytes. + + For this case we do only some shuffle to obtain these 2-byte + codes and finally compress the whole SSE register with a single + shuffle. + + We need 256-entry lookup table to get a compression pattern + and the number of output bytes in the compressed vector register. + Each entry occupies 17 bytes. + + Ad 2. + + When values fit in 16-bit code units, but are above 0x07ff, then + a single word may produce one, two or three UTF8 bytes. + + We prepare data for all these three cases in two registers. + The first register contains lower two UTF8 bytes (used in all + cases), while the second one contains just the third byte for + the three-UTF8-bytes case. + + Finally these two registers are interleaved forming eight-element + array of 32-bit values. The array spans two SSE registers. + The bytes from the registers are compressed using two shuffles. + + We need 256-entry lookup table to get a compression pattern + and the number of output bytes in the compressed vector register. + Each entry occupies 17 bytes. + + + To summarize: + - We need two 256-entry tables that have 8704 bytes in total. +*/ +/* + Returns a pair: the first unprocessed byte from buf and utf8_output + A scalar routing should carry on the conversion of the tail. +*/ +template +std::pair +arm_convert_utf16_to_utf32(const char16_t *buf, size_t len, + char32_t *utf32_out) { + uint32_t *utf32_output = reinterpret_cast(utf32_out); + const char16_t *end = buf + len; + + const uint16x8_t v_f800 = vmovq_n_u16((uint16_t)0xf800); + const uint16x8_t v_d800 = vmovq_n_u16((uint16_t)0xd800); + + while (end - buf >= 8) { + uint16x8_t in = vld1q_u16(reinterpret_cast(buf)); + if (!match_system(big_endian)) { + in = vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(in))); + } + + const uint16x8_t surrogates_bytemask = + vceqq_u16(vandq_u16(in, v_f800), v_d800); + // It might seem like checking for surrogates_bitmask == 0xc000 could help. + // However, it is likely an uncommon occurrence. + if (vmaxvq_u16(surrogates_bytemask) == 0) { + // case: no surrogate pairs, extend all 16-bit code units to 32-bit code + // units + vst1q_u32(utf32_output, vmovl_u16(vget_low_u16(in))); + vst1q_u32(utf32_output + 4, vmovl_high_u16(in)); + utf32_output += 8; + buf += 8; + // surrogate pair(s) in a register + } else { + // Let us do a scalar fallback. + // It may seem wasteful to use scalar code, but being efficient with SIMD + // in the presence of surrogate pairs may require non-trivial tables. + size_t forward = 15; + size_t k = 0; + if (size_t(end - buf) < forward + 1) { + forward = size_t(end - buf - 1); + } + for (; k < forward; k++) { + uint16_t word = !match_system(big_endian) + ? scalar::utf16::swap_bytes(buf[k]) + : buf[k]; + if ((word & 0xF800) != 0xD800) { + *utf32_output++ = char32_t(word); + } else { + // must be a surrogate pair + uint16_t diff = uint16_t(word - 0xD800); + uint16_t next_word = !match_system(big_endian) + ? scalar::utf16::swap_bytes(buf[k + 1]) + : buf[k + 1]; + k++; + uint16_t diff2 = uint16_t(next_word - 0xDC00); + if ((diff | diff2) > 0x3FF) { + return std::make_pair(nullptr, + reinterpret_cast(utf32_output)); + } + uint32_t value = (diff << 10) + diff2 + 0x10000; + *utf32_output++ = char32_t(value); + } + } + buf += k; + } + } // while + return std::make_pair(buf, reinterpret_cast(utf32_output)); +} + +/* + Returns a pair: a result struct and utf8_output. + If there is an error, the count field of the result is the position of the + error. Otherwise, it is the position of the first unprocessed byte in buf + (even if finished). A scalar routing should carry on the conversion of the + tail if needed. +*/ +template +std::pair +arm_convert_utf16_to_utf32_with_errors(const char16_t *buf, size_t len, + char32_t *utf32_out) { + uint32_t *utf32_output = reinterpret_cast(utf32_out); + const char16_t *start = buf; + const char16_t *end = buf + len; + + const uint16x8_t v_f800 = vmovq_n_u16((uint16_t)0xf800); + const uint16x8_t v_d800 = vmovq_n_u16((uint16_t)0xd800); + + while ((end - buf) >= 8) { + uint16x8_t in = vld1q_u16(reinterpret_cast(buf)); + if (!match_system(big_endian)) { + in = vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(in))); + } + + const uint16x8_t surrogates_bytemask = + vceqq_u16(vandq_u16(in, v_f800), v_d800); + // It might seem like checking for surrogates_bitmask == 0xc000 could help. + // However, it is likely an uncommon occurrence. + if (vmaxvq_u16(surrogates_bytemask) == 0) { + // case: no surrogate pairs, extend all 16-bit code units to 32-bit code + // units + vst1q_u32(utf32_output, vmovl_u16(vget_low_u16(in))); + vst1q_u32(utf32_output + 4, vmovl_high_u16(in)); + utf32_output += 8; + buf += 8; + // surrogate pair(s) in a register + } else { + // Let us do a scalar fallback. + // It may seem wasteful to use scalar code, but being efficient with SIMD + // in the presence of surrogate pairs may require non-trivial tables. + size_t forward = 15; + size_t k = 0; + if (size_t(end - buf) < forward + 1) { + forward = size_t(end - buf - 1); + } + for (; k < forward; k++) { + uint16_t word = !match_system(big_endian) + ? scalar::utf16::swap_bytes(buf[k]) + : buf[k]; + if ((word & 0xF800) != 0xD800) { + *utf32_output++ = char32_t(word); + } else { + // must be a surrogate pair + uint16_t diff = uint16_t(word - 0xD800); + uint16_t next_word = !match_system(big_endian) + ? scalar::utf16::swap_bytes(buf[k + 1]) + : buf[k + 1]; + k++; + uint16_t diff2 = uint16_t(next_word - 0xDC00); + if ((diff | diff2) > 0x3FF) { + return std::make_pair( + result(error_code::SURROGATE, buf - start + k - 1), + reinterpret_cast(utf32_output)); + } + uint32_t value = (diff << 10) + diff2 + 0x10000; + *utf32_output++ = char32_t(value); + } + } + buf += k; + } + } // while + return std::make_pair(result(error_code::SUCCESS, buf - start), + reinterpret_cast(utf32_output)); +} +/* end file src/arm64/arm_convert_utf16_to_utf32.cpp */ +/* begin file src/arm64/arm_convert_utf16_to_utf8.cpp */ +/* + The vectorized algorithm works on single SSE register i.e., it + loads eight 16-bit code units. + + We consider three cases: + 1. an input register contains no surrogates and each value + is in range 0x0000 .. 0x07ff. + 2. an input register contains no surrogates and values are + is in range 0x0000 .. 0xffff. + 3. an input register contains surrogates --- i.e. codepoints + can have 16 or 32 bits. + + Ad 1. + + When values are less than 0x0800, it means that a 16-bit code unit + can be converted into: 1) single UTF8 byte (when it is an ASCII + char) or 2) two UTF8 bytes. + + For this case we do only some shuffle to obtain these 2-byte + codes and finally compress the whole SSE register with a single + shuffle. + + We need 256-entry lookup table to get a compression pattern + and the number of output bytes in the compressed vector register. + Each entry occupies 17 bytes. + + Ad 2. + + When values fit in 16-bit code units, but are above 0x07ff, then + a single word may produce one, two or three UTF8 bytes. + + We prepare data for all these three cases in two registers. + The first register contains lower two UTF8 bytes (used in all + cases), while the second one contains just the third byte for + the three-UTF8-bytes case. + + Finally these two registers are interleaved forming eight-element + array of 32-bit values. The array spans two SSE registers. + The bytes from the registers are compressed using two shuffles. + + We need 256-entry lookup table to get a compression pattern + and the number of output bytes in the compressed vector register. + Each entry occupies 17 bytes. + + + To summarize: + - We need two 256-entry tables that have 8704 bytes in total. +*/ +/* + Returns a pair: the first unprocessed byte from buf and utf8_output + A scalar routing should carry on the conversion of the tail. +*/ +template +std::pair +arm_convert_utf16_to_utf8(const char16_t *buf, size_t len, char *utf8_out) { + uint8_t *utf8_output = reinterpret_cast(utf8_out); + const char16_t *end = buf + len; + + const uint16x8_t v_f800 = vmovq_n_u16((uint16_t)0xf800); + const uint16x8_t v_d800 = vmovq_n_u16((uint16_t)0xd800); + const uint16x8_t v_c080 = vmovq_n_u16((uint16_t)0xc080); + const size_t safety_margin = + 12; // to avoid overruns, see issue + // https://github.com/simdutf/simdutf/issues/92 + while (end - buf >= std::ptrdiff_t(16 + safety_margin)) { + uint16x8_t in = vld1q_u16(reinterpret_cast(buf)); + if (!match_system(big_endian)) { + in = vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(in))); + } + if (vmaxvq_u16(in) <= 0x7F) { // ASCII fast path!!!! + // It is common enough that we have sequences of 16 consecutive ASCII + // characters. + uint16x8_t nextin = + vld1q_u16(reinterpret_cast(buf) + 8); + if (!match_system(big_endian)) { + nextin = vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(nextin))); + } + if (vmaxvq_u16(nextin) > 0x7F) { + // 1. pack the bytes + // obviously suboptimal. + uint8x8_t utf8_packed = vmovn_u16(in); + // 2. store (8 bytes) + vst1_u8(utf8_output, utf8_packed); + // 3. adjust pointers + buf += 8; + utf8_output += 8; + in = nextin; + } else { + // 1. pack the bytes + // obviously suboptimal. + uint8x16_t utf8_packed = vmovn_high_u16(vmovn_u16(in), nextin); + // 2. store (16 bytes) + vst1q_u8(utf8_output, utf8_packed); + // 3. adjust pointers + buf += 16; + utf8_output += 16; + continue; // we are done for this round! + } + } + + if (vmaxvq_u16(in) <= 0x7FF) { + // 1. prepare 2-byte values + // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8 + // expected output : [110a|aaaa|10bb|bbbb] x 8 + const uint16x8_t v_1f00 = vmovq_n_u16((int16_t)0x1f00); + const uint16x8_t v_003f = vmovq_n_u16((int16_t)0x003f); + + // t0 = [000a|aaaa|bbbb|bb00] + const uint16x8_t t0 = vshlq_n_u16(in, 2); + // t1 = [000a|aaaa|0000|0000] + const uint16x8_t t1 = vandq_u16(t0, v_1f00); + // t2 = [0000|0000|00bb|bbbb] + const uint16x8_t t2 = vandq_u16(in, v_003f); + // t3 = [000a|aaaa|00bb|bbbb] + const uint16x8_t t3 = vorrq_u16(t1, t2); + // t4 = [110a|aaaa|10bb|bbbb] + const uint16x8_t t4 = vorrq_u16(t3, v_c080); + // 2. merge ASCII and 2-byte codewords + const uint16x8_t v_007f = vmovq_n_u16((uint16_t)0x007F); + const uint16x8_t one_byte_bytemask = vcleq_u16(in, v_007f); + const uint8x16_t utf8_unpacked = + vreinterpretq_u8_u16(vbslq_u16(one_byte_bytemask, in, t4)); + // 3. prepare bitmask for 8-bit lookup +#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO + const uint16x8_t mask = simdutf_make_uint16x8_t( + 0x0001, 0x0004, 0x0010, 0x0040, 0x0002, 0x0008, 0x0020, 0x0080); +#else + const uint16x8_t mask = {0x0001, 0x0004, 0x0010, 0x0040, + 0x0002, 0x0008, 0x0020, 0x0080}; +#endif + uint16_t m2 = vaddvq_u16(vandq_u16(one_byte_bytemask, mask)); + // 4. pack the bytes + const uint8_t *row = + &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[m2][0]; + const uint8x16_t shuffle = vld1q_u8(row + 1); + const uint8x16_t utf8_packed = vqtbl1q_u8(utf8_unpacked, shuffle); + + // 5. store bytes + vst1q_u8(utf8_output, utf8_packed); + + // 6. adjust pointers + buf += 8; + utf8_output += row[0]; + continue; + } + const uint16x8_t surrogates_bytemask = + vceqq_u16(vandq_u16(in, v_f800), v_d800); + // It might seem like checking for surrogates_bitmask == 0xc000 could help. + // However, it is likely an uncommon occurrence. + if (vmaxvq_u16(surrogates_bytemask) == 0) { + // case: code units from register produce either 1, 2 or 3 UTF-8 bytes +#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO + const uint16x8_t dup_even = simdutf_make_uint16x8_t( + 0x0000, 0x0202, 0x0404, 0x0606, 0x0808, 0x0a0a, 0x0c0c, 0x0e0e); +#else + const uint16x8_t dup_even = {0x0000, 0x0202, 0x0404, 0x0606, + 0x0808, 0x0a0a, 0x0c0c, 0x0e0e}; +#endif + /* In this branch we handle three cases: + 1. [0000|0000|0ccc|cccc] => [0ccc|cccc] - + single UFT-8 byte + 2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc] - two + UTF-8 bytes + 3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - + three UTF-8 bytes + + We expand the input word (16-bit) into two code units (32-bit), thus + we have room for four bytes. However, we need five distinct bit + layouts. Note that the last byte in cases #2 and #3 is the same. + + We precompute byte 1 for case #1 and the common byte for cases #2 & #3 + in register t2. + + We precompute byte 1 for case #3 and -- **conditionally** -- precompute + either byte 1 for case #2 or byte 2 for case #3. Note that they + differ by exactly one bit. + + Finally from these two code units we build proper UTF-8 sequence, taking + into account the case (i.e, the number of bytes to write). + */ + /** + * Given [aaaa|bbbb|bbcc|cccc] our goal is to produce: + * t2 => [0ccc|cccc] [10cc|cccc] + * s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb]) + */ +#define simdutf_vec(x) vmovq_n_u16(static_cast(x)) + // [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc] + const uint16x8_t t0 = vreinterpretq_u16_u8( + vqtbl1q_u8(vreinterpretq_u8_u16(in), vreinterpretq_u8_u16(dup_even))); + // [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc] + const uint16x8_t t1 = vandq_u16(t0, simdutf_vec(0b0011111101111111)); + // [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc] + const uint16x8_t t2 = vorrq_u16(t1, simdutf_vec(0b1000000000000000)); + + // s0: [aaaa|bbbb|bbcc|cccc] => [0000|0000|0000|aaaa] + const uint16x8_t s0 = vshrq_n_u16(in, 12); + // s1: [aaaa|bbbb|bbcc|cccc] => [0000|bbbb|bb00|0000] + const uint16x8_t s1 = vandq_u16(in, simdutf_vec(0b0000111111000000)); + // [0000|bbbb|bb00|0000] => [00bb|bbbb|0000|0000] + const uint16x8_t s1s = vshlq_n_u16(s1, 2); + // [00bb|bbbb|0000|aaaa] + const uint16x8_t s2 = vorrq_u16(s0, s1s); + // s3: [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa] + const uint16x8_t s3 = vorrq_u16(s2, simdutf_vec(0b1100000011100000)); + const uint16x8_t v_07ff = vmovq_n_u16((uint16_t)0x07FF); + const uint16x8_t one_or_two_bytes_bytemask = vcleq_u16(in, v_07ff); + const uint16x8_t m0 = + vbicq_u16(simdutf_vec(0b0100000000000000), one_or_two_bytes_bytemask); + const uint16x8_t s4 = veorq_u16(s3, m0); +#undef simdutf_vec + + // 4. expand code units 16-bit => 32-bit + const uint8x16_t out0 = vreinterpretq_u8_u16(vzip1q_u16(t2, s4)); + const uint8x16_t out1 = vreinterpretq_u8_u16(vzip2q_u16(t2, s4)); + + // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle + const uint16x8_t v_007f = vmovq_n_u16((uint16_t)0x007F); + const uint16x8_t one_byte_bytemask = vcleq_u16(in, v_007f); +#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO + const uint16x8_t onemask = simdutf_make_uint16x8_t( + 0x0001, 0x0004, 0x0010, 0x0040, 0x0100, 0x0400, 0x1000, 0x4000); + const uint16x8_t twomask = simdutf_make_uint16x8_t( + 0x0002, 0x0008, 0x0020, 0x0080, 0x0200, 0x0800, 0x2000, 0x8000); +#else + const uint16x8_t onemask = {0x0001, 0x0004, 0x0010, 0x0040, + 0x0100, 0x0400, 0x1000, 0x4000}; + const uint16x8_t twomask = {0x0002, 0x0008, 0x0020, 0x0080, + 0x0200, 0x0800, 0x2000, 0x8000}; +#endif + const uint16x8_t combined = + vorrq_u16(vandq_u16(one_byte_bytemask, onemask), + vandq_u16(one_or_two_bytes_bytemask, twomask)); + const uint16_t mask = vaddvq_u16(combined); + // The following fast path may or may not be beneficial. + /*if(mask == 0) { + // We only have three-byte code units. Use fast path. + const uint8x16_t shuffle = {2,3,1,6,7,5,10,11,9,14,15,13,0,0,0,0}; + const uint8x16_t utf8_0 = vqtbl1q_u8(out0, shuffle); + const uint8x16_t utf8_1 = vqtbl1q_u8(out1, shuffle); + vst1q_u8(utf8_output, utf8_0); + utf8_output += 12; + vst1q_u8(utf8_output, utf8_1); + utf8_output += 12; + buf += 8; + continue; + }*/ + const uint8_t mask0 = uint8_t(mask); + + const uint8_t *row0 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask0][0]; + const uint8x16_t shuffle0 = vld1q_u8(row0 + 1); + const uint8x16_t utf8_0 = vqtbl1q_u8(out0, shuffle0); + + const uint8_t mask1 = static_cast(mask >> 8); + const uint8_t *row1 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask1][0]; + const uint8x16_t shuffle1 = vld1q_u8(row1 + 1); + const uint8x16_t utf8_1 = vqtbl1q_u8(out1, shuffle1); + + vst1q_u8(utf8_output, utf8_0); + utf8_output += row0[0]; + vst1q_u8(utf8_output, utf8_1); + utf8_output += row1[0]; + + buf += 8; + // surrogate pair(s) in a register + } else { + // Let us do a scalar fallback. + // It may seem wasteful to use scalar code, but being efficient with SIMD + // in the presence of surrogate pairs may require non-trivial tables. + size_t forward = 15; + size_t k = 0; + if (size_t(end - buf) < forward + 1) { + forward = size_t(end - buf - 1); + } + for (; k < forward; k++) { + uint16_t word = !match_system(big_endian) + ? scalar::utf16::swap_bytes(buf[k]) + : buf[k]; + if ((word & 0xFF80) == 0) { + *utf8_output++ = char(word); + } else if ((word & 0xF800) == 0) { + *utf8_output++ = char((word >> 6) | 0b11000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + } else if ((word & 0xF800) != 0xD800) { + *utf8_output++ = char((word >> 12) | 0b11100000); + *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + } else { + // must be a surrogate pair + uint16_t diff = uint16_t(word - 0xD800); + uint16_t next_word = !match_system(big_endian) + ? scalar::utf16::swap_bytes(buf[k + 1]) + : buf[k + 1]; + k++; + uint16_t diff2 = uint16_t(next_word - 0xDC00); + if ((diff | diff2) > 0x3FF) { + return std::make_pair(nullptr, + reinterpret_cast(utf8_output)); + } + uint32_t value = (diff << 10) + diff2 + 0x10000; + *utf8_output++ = char((value >> 18) | 0b11110000); + *utf8_output++ = char(((value >> 12) & 0b111111) | 0b10000000); + *utf8_output++ = char(((value >> 6) & 0b111111) | 0b10000000); + *utf8_output++ = char((value & 0b111111) | 0b10000000); + } + } + buf += k; + } + } // while + + return std::make_pair(buf, reinterpret_cast(utf8_output)); +} + +/* + Returns a pair: a result struct and utf8_output. + If there is an error, the count field of the result is the position of the + error. Otherwise, it is the position of the first unprocessed byte in buf + (even if finished). A scalar routing should carry on the conversion of the + tail if needed. +*/ +template +std::pair +arm_convert_utf16_to_utf8_with_errors(const char16_t *buf, size_t len, + char *utf8_out) { + uint8_t *utf8_output = reinterpret_cast(utf8_out); + const char16_t *start = buf; + const char16_t *end = buf + len; + + const uint16x8_t v_f800 = vmovq_n_u16((uint16_t)0xf800); + const uint16x8_t v_d800 = vmovq_n_u16((uint16_t)0xd800); + const uint16x8_t v_c080 = vmovq_n_u16((uint16_t)0xc080); + const size_t safety_margin = + 12; // to avoid overruns, see issue + // https://github.com/simdutf/simdutf/issues/92 + + while (end - buf >= std::ptrdiff_t(16 + safety_margin)) { + uint16x8_t in = vld1q_u16(reinterpret_cast(buf)); + if (!match_system(big_endian)) { + in = vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(in))); + } + if (vmaxvq_u16(in) <= 0x7F) { // ASCII fast path!!!! + // It is common enough that we have sequences of 16 consecutive ASCII + // characters. + uint16x8_t nextin = + vld1q_u16(reinterpret_cast(buf) + 8); + if (!match_system(big_endian)) { + nextin = vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(nextin))); + } + if (vmaxvq_u16(nextin) > 0x7F) { + // 1. pack the bytes + // obviously suboptimal. + uint8x8_t utf8_packed = vmovn_u16(in); + // 2. store (8 bytes) + vst1_u8(utf8_output, utf8_packed); + // 3. adjust pointers + buf += 8; + utf8_output += 8; + in = nextin; + } else { + // 1. pack the bytes + // obviously suboptimal. + uint8x16_t utf8_packed = vmovn_high_u16(vmovn_u16(in), nextin); + // 2. store (16 bytes) + vst1q_u8(utf8_output, utf8_packed); + // 3. adjust pointers + buf += 16; + utf8_output += 16; + continue; // we are done for this round! + } + } + + if (vmaxvq_u16(in) <= 0x7FF) { + // 1. prepare 2-byte values + // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8 + // expected output : [110a|aaaa|10bb|bbbb] x 8 + const uint16x8_t v_1f00 = vmovq_n_u16((int16_t)0x1f00); + const uint16x8_t v_003f = vmovq_n_u16((int16_t)0x003f); + + // t0 = [000a|aaaa|bbbb|bb00] + const uint16x8_t t0 = vshlq_n_u16(in, 2); + // t1 = [000a|aaaa|0000|0000] + const uint16x8_t t1 = vandq_u16(t0, v_1f00); + // t2 = [0000|0000|00bb|bbbb] + const uint16x8_t t2 = vandq_u16(in, v_003f); + // t3 = [000a|aaaa|00bb|bbbb] + const uint16x8_t t3 = vorrq_u16(t1, t2); + // t4 = [110a|aaaa|10bb|bbbb] + const uint16x8_t t4 = vorrq_u16(t3, v_c080); + // 2. merge ASCII and 2-byte codewords + const uint16x8_t v_007f = vmovq_n_u16((uint16_t)0x007F); + const uint16x8_t one_byte_bytemask = vcleq_u16(in, v_007f); + const uint8x16_t utf8_unpacked = + vreinterpretq_u8_u16(vbslq_u16(one_byte_bytemask, in, t4)); + // 3. prepare bitmask for 8-bit lookup +#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO + const uint16x8_t mask = simdutf_make_uint16x8_t( + 0x0001, 0x0004, 0x0010, 0x0040, 0x0002, 0x0008, 0x0020, 0x0080); +#else + const uint16x8_t mask = {0x0001, 0x0004, 0x0010, 0x0040, + 0x0002, 0x0008, 0x0020, 0x0080}; +#endif + uint16_t m2 = vaddvq_u16(vandq_u16(one_byte_bytemask, mask)); + // 4. pack the bytes + const uint8_t *row = + &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[m2][0]; + const uint8x16_t shuffle = vld1q_u8(row + 1); + const uint8x16_t utf8_packed = vqtbl1q_u8(utf8_unpacked, shuffle); + + // 5. store bytes + vst1q_u8(utf8_output, utf8_packed); + + // 6. adjust pointers + buf += 8; + utf8_output += row[0]; + continue; + } + const uint16x8_t surrogates_bytemask = + vceqq_u16(vandq_u16(in, v_f800), v_d800); + // It might seem like checking for surrogates_bitmask == 0xc000 could help. + // However, it is likely an uncommon occurrence. + if (vmaxvq_u16(surrogates_bytemask) == 0) { + // case: code units from register produce either 1, 2 or 3 UTF-8 bytes +#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO + const uint16x8_t dup_even = simdutf_make_uint16x8_t( + 0x0000, 0x0202, 0x0404, 0x0606, 0x0808, 0x0a0a, 0x0c0c, 0x0e0e); +#else + const uint16x8_t dup_even = {0x0000, 0x0202, 0x0404, 0x0606, + 0x0808, 0x0a0a, 0x0c0c, 0x0e0e}; +#endif + /* In this branch we handle three cases: + 1. [0000|0000|0ccc|cccc] => [0ccc|cccc] - + single UFT-8 byte + 2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc] - two + UTF-8 bytes + 3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - + three UTF-8 bytes + + We expand the input word (16-bit) into two code units (32-bit), thus + we have room for four bytes. However, we need five distinct bit + layouts. Note that the last byte in cases #2 and #3 is the same. + + We precompute byte 1 for case #1 and the common byte for cases #2 & #3 + in register t2. + + We precompute byte 1 for case #3 and -- **conditionally** -- precompute + either byte 1 for case #2 or byte 2 for case #3. Note that they + differ by exactly one bit. + + Finally from these two code units we build proper UTF-8 sequence, taking + into account the case (i.e, the number of bytes to write). + */ + /** + * Given [aaaa|bbbb|bbcc|cccc] our goal is to produce: + * t2 => [0ccc|cccc] [10cc|cccc] + * s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb]) + */ +#define simdutf_vec(x) vmovq_n_u16(static_cast(x)) + // [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc] + const uint16x8_t t0 = vreinterpretq_u16_u8( + vqtbl1q_u8(vreinterpretq_u8_u16(in), vreinterpretq_u8_u16(dup_even))); + // [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc] + const uint16x8_t t1 = vandq_u16(t0, simdutf_vec(0b0011111101111111)); + // [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc] + const uint16x8_t t2 = vorrq_u16(t1, simdutf_vec(0b1000000000000000)); + + // s0: [aaaa|bbbb|bbcc|cccc] => [0000|0000|0000|aaaa] + const uint16x8_t s0 = vshrq_n_u16(in, 12); + // s1: [aaaa|bbbb|bbcc|cccc] => [0000|bbbb|bb00|0000] + const uint16x8_t s1 = vandq_u16(in, simdutf_vec(0b0000111111000000)); + // [0000|bbbb|bb00|0000] => [00bb|bbbb|0000|0000] + const uint16x8_t s1s = vshlq_n_u16(s1, 2); + // [00bb|bbbb|0000|aaaa] + const uint16x8_t s2 = vorrq_u16(s0, s1s); + // s3: [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa] + const uint16x8_t s3 = vorrq_u16(s2, simdutf_vec(0b1100000011100000)); + const uint16x8_t v_07ff = vmovq_n_u16((uint16_t)0x07FF); + const uint16x8_t one_or_two_bytes_bytemask = vcleq_u16(in, v_07ff); + const uint16x8_t m0 = + vbicq_u16(simdutf_vec(0b0100000000000000), one_or_two_bytes_bytemask); + const uint16x8_t s4 = veorq_u16(s3, m0); +#undef simdutf_vec + + // 4. expand code units 16-bit => 32-bit + const uint8x16_t out0 = vreinterpretq_u8_u16(vzip1q_u16(t2, s4)); + const uint8x16_t out1 = vreinterpretq_u8_u16(vzip2q_u16(t2, s4)); + + // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle + const uint16x8_t v_007f = vmovq_n_u16((uint16_t)0x007F); + const uint16x8_t one_byte_bytemask = vcleq_u16(in, v_007f); +#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO + const uint16x8_t onemask = simdutf_make_uint16x8_t( + 0x0001, 0x0004, 0x0010, 0x0040, 0x0100, 0x0400, 0x1000, 0x4000); + const uint16x8_t twomask = simdutf_make_uint16x8_t( + 0x0002, 0x0008, 0x0020, 0x0080, 0x0200, 0x0800, 0x2000, 0x8000); +#else + const uint16x8_t onemask = {0x0001, 0x0004, 0x0010, 0x0040, + 0x0100, 0x0400, 0x1000, 0x4000}; + const uint16x8_t twomask = {0x0002, 0x0008, 0x0020, 0x0080, + 0x0200, 0x0800, 0x2000, 0x8000}; +#endif + const uint16x8_t combined = + vorrq_u16(vandq_u16(one_byte_bytemask, onemask), + vandq_u16(one_or_two_bytes_bytemask, twomask)); + const uint16_t mask = vaddvq_u16(combined); + // The following fast path may or may not be beneficial. + /*if(mask == 0) { + // We only have three-byte code units. Use fast path. + const uint8x16_t shuffle = {2,3,1,6,7,5,10,11,9,14,15,13,0,0,0,0}; + const uint8x16_t utf8_0 = vqtbl1q_u8(out0, shuffle); + const uint8x16_t utf8_1 = vqtbl1q_u8(out1, shuffle); + vst1q_u8(utf8_output, utf8_0); + utf8_output += 12; + vst1q_u8(utf8_output, utf8_1); + utf8_output += 12; + buf += 8; + continue; + }*/ + const uint8_t mask0 = uint8_t(mask); + + const uint8_t *row0 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask0][0]; + const uint8x16_t shuffle0 = vld1q_u8(row0 + 1); + const uint8x16_t utf8_0 = vqtbl1q_u8(out0, shuffle0); + + const uint8_t mask1 = static_cast(mask >> 8); + const uint8_t *row1 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask1][0]; + const uint8x16_t shuffle1 = vld1q_u8(row1 + 1); + const uint8x16_t utf8_1 = vqtbl1q_u8(out1, shuffle1); + + vst1q_u8(utf8_output, utf8_0); + utf8_output += row0[0]; + vst1q_u8(utf8_output, utf8_1); + utf8_output += row1[0]; + + buf += 8; + // surrogate pair(s) in a register + } else { + // Let us do a scalar fallback. + // It may seem wasteful to use scalar code, but being efficient with SIMD + // in the presence of surrogate pairs may require non-trivial tables. + size_t forward = 15; + size_t k = 0; + if (size_t(end - buf) < forward + 1) { + forward = size_t(end - buf - 1); + } + for (; k < forward; k++) { + uint16_t word = !match_system(big_endian) + ? scalar::utf16::swap_bytes(buf[k]) + : buf[k]; + if ((word & 0xFF80) == 0) { + *utf8_output++ = char(word); + } else if ((word & 0xF800) == 0) { + *utf8_output++ = char((word >> 6) | 0b11000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + } else if ((word & 0xF800) != 0xD800) { + *utf8_output++ = char((word >> 12) | 0b11100000); + *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + } else { + // must be a surrogate pair + uint16_t diff = uint16_t(word - 0xD800); + uint16_t next_word = !match_system(big_endian) + ? scalar::utf16::swap_bytes(buf[k + 1]) + : buf[k + 1]; + k++; + uint16_t diff2 = uint16_t(next_word - 0xDC00); + if ((diff | diff2) > 0x3FF) { + return std::make_pair( + result(error_code::SURROGATE, buf - start + k - 1), + reinterpret_cast(utf8_output)); + } + uint32_t value = (diff << 10) + diff2 + 0x10000; + *utf8_output++ = char((value >> 18) | 0b11110000); + *utf8_output++ = char(((value >> 12) & 0b111111) | 0b10000000); + *utf8_output++ = char(((value >> 6) & 0b111111) | 0b10000000); + *utf8_output++ = char((value & 0b111111) | 0b10000000); + } + } + buf += k; + } + } // while + + return std::make_pair(result(error_code::SUCCESS, buf - start), + reinterpret_cast(utf8_output)); +} +/* end file src/arm64/arm_convert_utf16_to_utf8.cpp */ + +/* begin file src/arm64/arm_base64.cpp */ +/** + * References and further reading: + * + * Wojciech Muła, Daniel Lemire, Base64 encoding and decoding at almost the + * speed of a memory copy, Software: Practice and Experience 50 (2), 2020. + * https://arxiv.org/abs/1910.05109 + * + * Wojciech Muła, Daniel Lemire, Faster Base64 Encoding and Decoding using AVX2 + * Instructions, ACM Transactions on the Web 12 (3), 2018. + * https://arxiv.org/abs/1704.00605 + * + * Simon Josefsson. 2006. The Base16, Base32, and Base64 Data Encodings. + * https://tools.ietf.org/html/rfc4648. (2006). Internet Engineering Task Force, + * Request for Comments: 4648. + * + * Alfred Klomp. 2014a. Fast Base64 encoding/decoding with SSE vectorization. + * http://www.alfredklomp.com/programming/sse-base64/. (2014). + * + * Alfred Klomp. 2014b. Fast Base64 stream encoder/decoder in C99, with SIMD + * acceleration. https://github.com/aklomp/base64. (2014). + * + * Hanson Char. 2014. A Fast and Correct Base 64 Codec. (2014). + * https://aws.amazon.com/blogs/developer/a-fast-and-correct-base-64-codec/ + * + * Nick Kopp. 2013. Base64 Encoding on a GPU. + * https://www.codeproject.com/Articles/276993/Base-Encoding-on-a-GPU. (2013). + */ + +size_t encode_base64(char *dst, const char *src, size_t srclen, + base64_options options) { + // credit: Wojciech Muła + uint8_t *out = (uint8_t *)dst; + constexpr static uint8_t source_table[64] = { + 'A', 'Q', 'g', 'w', 'B', 'R', 'h', 'x', 'C', 'S', 'i', 'y', 'D', + 'T', 'j', 'z', 'E', 'U', 'k', '0', 'F', 'V', 'l', '1', 'G', 'W', + 'm', '2', 'H', 'X', 'n', '3', 'I', 'Y', 'o', '4', 'J', 'Z', 'p', + '5', 'K', 'a', 'q', '6', 'L', 'b', 'r', '7', 'M', 'c', 's', '8', + 'N', 'd', 't', '9', 'O', 'e', 'u', '+', 'P', 'f', 'v', '/', + }; + constexpr static uint8_t source_table_url[64] = { + 'A', 'Q', 'g', 'w', 'B', 'R', 'h', 'x', 'C', 'S', 'i', 'y', 'D', + 'T', 'j', 'z', 'E', 'U', 'k', '0', 'F', 'V', 'l', '1', 'G', 'W', + 'm', '2', 'H', 'X', 'n', '3', 'I', 'Y', 'o', '4', 'J', 'Z', 'p', + '5', 'K', 'a', 'q', '6', 'L', 'b', 'r', '7', 'M', 'c', 's', '8', + 'N', 'd', 't', '9', 'O', 'e', 'u', '-', 'P', 'f', 'v', '_', + }; + const uint8x16_t v3f = vdupq_n_u8(0x3f); +#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO + // When trying to load a uint8_t array, Visual Studio might + // error with: error C2664: '__n128x4 neon_ld4m_q8(const char *)': + // cannot convert argument 1 from 'const uint8_t [64]' to 'const char * + const uint8x16x4_t table = vld4q_u8( + (reinterpret_cast(options & base64_url) ? source_table_url + : source_table)); +#else + const uint8x16x4_t table = + vld4q_u8((options & base64_url) ? source_table_url : source_table); +#endif + size_t i = 0; + for (; i + 16 * 3 <= srclen; i += 16 * 3) { + const uint8x16x3_t in = vld3q_u8((const uint8_t *)src + i); + uint8x16x4_t result; + result.val[0] = vshrq_n_u8(in.val[0], 2); + result.val[1] = + vandq_u8(vsliq_n_u8(vshrq_n_u8(in.val[1], 4), in.val[0], 4), v3f); + result.val[2] = + vandq_u8(vsliq_n_u8(vshrq_n_u8(in.val[2], 6), in.val[1], 2), v3f); + result.val[3] = vandq_u8(in.val[2], v3f); + result.val[0] = vqtbl4q_u8(table, result.val[0]); + result.val[1] = vqtbl4q_u8(table, result.val[1]); + result.val[2] = vqtbl4q_u8(table, result.val[2]); + result.val[3] = vqtbl4q_u8(table, result.val[3]); + vst4q_u8(out, result); + out += 64; + } + out += scalar::base64::tail_encode_base64((char *)out, src + i, srclen - i, + options); + + return size_t((char *)out - dst); +} + +static inline void compress(uint8x16_t data, uint16_t mask, char *output) { + if (mask == 0) { + vst1q_u8((uint8_t *)output, data); + return; + } + uint8_t mask1 = uint8_t(mask); // least significant 8 bits + uint8_t mask2 = uint8_t(mask >> 8); // most significant 8 bits + uint64x2_t compactmasku64 = {tables::base64::thintable_epi8[mask1], + tables::base64::thintable_epi8[mask2]}; + uint8x16_t compactmask = vreinterpretq_u8_u64(compactmasku64); +#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO + const uint8x16_t off = + simdutf_make_uint8x16_t(0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8); +#else + const uint8x16_t off = {0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8}; +#endif + + compactmask = vaddq_u8(compactmask, off); + uint8x16_t pruned = vqtbl1q_u8(data, compactmask); + + int pop1 = tables::base64::BitsSetTable256mul2[mask1]; + // then load the corresponding mask, what it does is to write + // only the first pop1 bytes from the first 8 bytes, and then + // it fills in with the bytes from the second 8 bytes + some filling + // at the end. + compactmask = vld1q_u8(tables::base64::pshufb_combine_table + pop1 * 8); + uint8x16_t answer = vqtbl1q_u8(pruned, compactmask); + vst1q_u8((uint8_t *)output, answer); +} + +struct block64 { + uint8x16_t chunks[4]; +}; + +static_assert(sizeof(block64) == 64, "block64 is not 64 bytes"); +template uint64_t to_base64_mask(block64 *b, bool *error) { + uint8x16_t v0f = vdupq_n_u8(0xf); + + uint8x16_t underscore0, underscore1, underscore2, underscore3; + if (base64_url) { + underscore0 = vceqq_u8(b->chunks[0], vdupq_n_u8(0x5f)); + underscore1 = vceqq_u8(b->chunks[1], vdupq_n_u8(0x5f)); + underscore2 = vceqq_u8(b->chunks[2], vdupq_n_u8(0x5f)); + underscore3 = vceqq_u8(b->chunks[3], vdupq_n_u8(0x5f)); + } else { + (void)underscore0; + (void)underscore1; + (void)underscore2; + (void)underscore3; + } + + uint8x16_t lo_nibbles0 = vandq_u8(b->chunks[0], v0f); + uint8x16_t lo_nibbles1 = vandq_u8(b->chunks[1], v0f); + uint8x16_t lo_nibbles2 = vandq_u8(b->chunks[2], v0f); + uint8x16_t lo_nibbles3 = vandq_u8(b->chunks[3], v0f); + + // Needed by the decoding step. + uint8x16_t hi_nibbles0 = vshrq_n_u8(b->chunks[0], 4); + uint8x16_t hi_nibbles1 = vshrq_n_u8(b->chunks[1], 4); + uint8x16_t hi_nibbles2 = vshrq_n_u8(b->chunks[2], 4); + uint8x16_t hi_nibbles3 = vshrq_n_u8(b->chunks[3], 4); + uint8x16_t lut_lo; +#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO + if (base64_url) { + lut_lo = + simdutf_make_uint8x16_t(0x3a, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, + 0x70, 0x61, 0xe1, 0xf4, 0xe5, 0xa5, 0xf4, 0xf4); + } else { + lut_lo = + simdutf_make_uint8x16_t(0x3a, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, + 0x70, 0x61, 0xe1, 0xb4, 0xe5, 0xe5, 0xf4, 0xb4); + } +#else + if (base64_url) { + lut_lo = uint8x16_t{0x3a, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, + 0x70, 0x61, 0xe1, 0xf4, 0xe5, 0xa5, 0xf4, 0xf4}; + } else { + lut_lo = uint8x16_t{0x3a, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, + 0x70, 0x61, 0xe1, 0xb4, 0xe5, 0xe5, 0xf4, 0xb4}; + } +#endif + uint8x16_t lo0 = vqtbl1q_u8(lut_lo, lo_nibbles0); + uint8x16_t lo1 = vqtbl1q_u8(lut_lo, lo_nibbles1); + uint8x16_t lo2 = vqtbl1q_u8(lut_lo, lo_nibbles2); + uint8x16_t lo3 = vqtbl1q_u8(lut_lo, lo_nibbles3); + uint8x16_t lut_hi; +#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO + if (base64_url) { + lut_hi = + simdutf_make_uint8x16_t(0x11, 0x20, 0x42, 0x80, 0x8, 0x4, 0x8, 0x4, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20); + } else { + lut_hi = + simdutf_make_uint8x16_t(0x11, 0x20, 0x42, 0x80, 0x8, 0x4, 0x8, 0x4, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20); + } +#else + if (base64_url) { + lut_hi = uint8x16_t{0x11, 0x20, 0x42, 0x80, 0x8, 0x4, 0x8, 0x4, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20}; + } else { + lut_hi = uint8x16_t{0x11, 0x20, 0x42, 0x80, 0x8, 0x4, 0x8, 0x4, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20}; + } +#endif + uint8x16_t hi0 = vqtbl1q_u8(lut_hi, hi_nibbles0); + uint8x16_t hi1 = vqtbl1q_u8(lut_hi, hi_nibbles1); + uint8x16_t hi2 = vqtbl1q_u8(lut_hi, hi_nibbles2); + uint8x16_t hi3 = vqtbl1q_u8(lut_hi, hi_nibbles3); + + if (base64_url) { + hi0 = vbicq_u8(hi0, underscore0); + hi1 = vbicq_u8(hi1, underscore1); + hi2 = vbicq_u8(hi2, underscore2); + hi3 = vbicq_u8(hi3, underscore3); + } + + uint8_t checks = + vmaxvq_u8(vorrq_u8(vorrq_u8(vandq_u8(lo0, hi0), vandq_u8(lo1, hi1)), + vorrq_u8(vandq_u8(lo2, hi2), vandq_u8(lo3, hi3)))); +#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO + const uint8x16_t bit_mask = + simdutf_make_uint8x16_t(0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, + 0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80); +#else + const uint8x16_t bit_mask = {0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, + 0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80}; +#endif + uint64_t badcharmask = 0; + *error = checks > 0x3; + if (checks) { + // Add each of the elements next to each other, successively, to stuff each + // 8 byte mask into one. + uint8x16_t test0 = vtstq_u8(lo0, hi0); + uint8x16_t test1 = vtstq_u8(lo1, hi1); + uint8x16_t test2 = vtstq_u8(lo2, hi2); + uint8x16_t test3 = vtstq_u8(lo3, hi3); + uint8x16_t sum0 = + vpaddq_u8(vandq_u8(test0, bit_mask), vandq_u8(test1, bit_mask)); + uint8x16_t sum1 = + vpaddq_u8(vandq_u8(test2, bit_mask), vandq_u8(test3, bit_mask)); + sum0 = vpaddq_u8(sum0, sum1); + sum0 = vpaddq_u8(sum0, sum0); + badcharmask = vgetq_lane_u64(vreinterpretq_u64_u8(sum0), 0); + } + // This is the transformation step that can be done while we are waiting for + // sum0 + uint8x16_t roll_lut; +#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO + if (base64_url) { + roll_lut = + simdutf_make_uint8x16_t(0xe0, 0x11, 0x13, 0x4, 0xbf, 0xbf, 0xb9, 0xb9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0); + } else { + roll_lut = + simdutf_make_uint8x16_t(0x0, 0x10, 0x13, 0x4, 0xbf, 0xbf, 0xb9, 0xb9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0); + } +#else + if (base64_url) { + roll_lut = uint8x16_t{0xe0, 0x11, 0x13, 0x4, 0xbf, 0xbf, 0xb9, 0xb9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}; + } else { + roll_lut = uint8x16_t{0x0, 0x10, 0x13, 0x4, 0xbf, 0xbf, 0xb9, 0xb9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}; + } +#endif + uint8x16_t vsecond_last = base64_url ? vdupq_n_u8(0x2d) : vdupq_n_u8(0x2f); + if (base64_url) { + hi_nibbles0 = vbicq_u8(hi_nibbles0, underscore0); + hi_nibbles1 = vbicq_u8(hi_nibbles1, underscore1); + hi_nibbles2 = vbicq_u8(hi_nibbles2, underscore2); + hi_nibbles3 = vbicq_u8(hi_nibbles3, underscore3); + } + uint8x16_t roll0 = vqtbl1q_u8( + roll_lut, vaddq_u8(vceqq_u8(b->chunks[0], vsecond_last), hi_nibbles0)); + uint8x16_t roll1 = vqtbl1q_u8( + roll_lut, vaddq_u8(vceqq_u8(b->chunks[1], vsecond_last), hi_nibbles1)); + uint8x16_t roll2 = vqtbl1q_u8( + roll_lut, vaddq_u8(vceqq_u8(b->chunks[2], vsecond_last), hi_nibbles2)); + uint8x16_t roll3 = vqtbl1q_u8( + roll_lut, vaddq_u8(vceqq_u8(b->chunks[3], vsecond_last), hi_nibbles3)); + b->chunks[0] = vaddq_u8(b->chunks[0], roll0); + b->chunks[1] = vaddq_u8(b->chunks[1], roll1); + b->chunks[2] = vaddq_u8(b->chunks[2], roll2); + b->chunks[3] = vaddq_u8(b->chunks[3], roll3); + return badcharmask; +} + +void copy_block(block64 *b, char *output) { + vst1q_u8((uint8_t *)output, b->chunks[0]); + vst1q_u8((uint8_t *)output + 16, b->chunks[1]); + vst1q_u8((uint8_t *)output + 32, b->chunks[2]); + vst1q_u8((uint8_t *)output + 48, b->chunks[3]); +} + +uint64_t compress_block(block64 *b, uint64_t mask, char *output) { + uint64_t popcounts = + vget_lane_u64(vreinterpret_u64_u8(vcnt_u8(vcreate_u8(~mask))), 0); + uint64_t offsets = popcounts * 0x0101010101010101; + compress(b->chunks[0], uint16_t(mask), output); + compress(b->chunks[1], uint16_t(mask >> 16), &output[(offsets >> 8) & 0xFF]); + compress(b->chunks[2], uint16_t(mask >> 32), &output[(offsets >> 24) & 0xFF]); + compress(b->chunks[3], uint16_t(mask >> 48), &output[(offsets >> 40) & 0xFF]); + return offsets >> 56; +} + +// The caller of this function is responsible to ensure that there are 64 bytes +// available from reading at src. The data is read into a block64 structure. +void load_block(block64 *b, const char *src) { + b->chunks[0] = vld1q_u8(reinterpret_cast(src)); + b->chunks[1] = vld1q_u8(reinterpret_cast(src) + 16); + b->chunks[2] = vld1q_u8(reinterpret_cast(src) + 32); + b->chunks[3] = vld1q_u8(reinterpret_cast(src) + 48); +} + +// The caller of this function is responsible to ensure that there are 32 bytes +// available from reading at data. It returns a 16-byte value, narrowing with +// saturation the 16-bit words. +inline uint8x16_t load_satured(const uint16_t *data) { + uint16x8_t in1 = vld1q_u16(data); + uint16x8_t in2 = vld1q_u16(data + 8); + return vqmovn_high_u16(vqmovn_u16(in1), in2); +} + +// The caller of this function is responsible to ensure that there are 128 bytes +// available from reading at src. The data is read into a block64 structure. +void load_block(block64 *b, const char16_t *src) { + b->chunks[0] = load_satured(reinterpret_cast(src)); + b->chunks[1] = load_satured(reinterpret_cast(src) + 16); + b->chunks[2] = load_satured(reinterpret_cast(src) + 32); + b->chunks[3] = load_satured(reinterpret_cast(src) + 48); +} + +// decode 64 bytes and output 48 bytes +void base64_decode_block(char *out, const char *src) { + uint8x16x4_t str = vld4q_u8((uint8_t *)src); + uint8x16x3_t outvec; + outvec.val[0] = + vorrq_u8(vshlq_n_u8(str.val[0], 2), vshrq_n_u8(str.val[1], 4)); + outvec.val[1] = + vorrq_u8(vshlq_n_u8(str.val[1], 4), vshrq_n_u8(str.val[2], 2)); + outvec.val[2] = vorrq_u8(vshlq_n_u8(str.val[2], 6), str.val[3]); + vst3q_u8((uint8_t *)out, outvec); +} + +template +full_result +compress_decode_base64(char *dst, const char_type *src, size_t srclen, + base64_options options, + last_chunk_handling_options last_chunk_options) { + const uint8_t *to_base64 = base64_url ? tables::base64::to_base64_url_value + : tables::base64::to_base64_value; + size_t equallocation = + srclen; // location of the first padding character if any + // skip trailing spaces + while (srclen > 0 && scalar::base64::is_eight_byte(src[srclen - 1]) && + to_base64[uint8_t(src[srclen - 1])] == 64) { + srclen--; + } + size_t equalsigns = 0; + if (srclen > 0 && src[srclen - 1] == '=') { + equallocation = srclen - 1; + srclen--; + equalsigns = 1; + // skip trailing spaces + while (srclen > 0 && scalar::base64::is_eight_byte(src[srclen - 1]) && + to_base64[uint8_t(src[srclen - 1])] == 64) { + srclen--; + } + if (srclen > 0 && src[srclen - 1] == '=') { + equallocation = srclen - 1; + srclen--; + equalsigns = 2; + } + } + if (srclen == 0) { + if (!ignore_garbage && equalsigns > 0) { + return {INVALID_BASE64_CHARACTER, equallocation, 0}; + } + return {SUCCESS, 0, 0}; + } + const char_type *const srcinit = src; + const char *const dstinit = dst; + const char_type *const srcend = src + srclen; + + constexpr size_t block_size = 10; + char buffer[block_size * 64]; + char *bufferptr = buffer; + if (srclen >= 64) { + const char_type *const srcend64 = src + srclen - 64; + while (src <= srcend64) { + block64 b; + load_block(&b, src); + src += 64; + bool error = false; + uint64_t badcharmask = to_base64_mask(&b, &error); + if (badcharmask) { + if (error && !ignore_garbage) { + src -= 64; + while (src < srcend && scalar::base64::is_eight_byte(*src) && + to_base64[uint8_t(*src)] <= 64) { + src++; + } + if (src < srcend) { + // should never happen + } + return {error_code::INVALID_BASE64_CHARACTER, size_t(src - srcinit), + size_t(dst - dstinit)}; + } + } + + if (badcharmask != 0) { + // optimization opportunity: check for simple masks like those made of + // continuous 1s followed by continuous 0s. And masks containing a + // single bad character. + bufferptr += compress_block(&b, badcharmask, bufferptr); + } else { + // optimization opportunity: if bufferptr == buffer and mask == 0, we + // can avoid the call to compress_block and decode directly. + copy_block(&b, bufferptr); + bufferptr += 64; + } + if (bufferptr >= (block_size - 1) * 64 + buffer) { + for (size_t i = 0; i < (block_size - 1); i++) { + base64_decode_block(dst, buffer + i * 64); + dst += 48; + } + std::memcpy(buffer, buffer + (block_size - 1) * 64, + 64); // 64 might be too much + bufferptr -= (block_size - 1) * 64; + } + } + } + char *buffer_start = buffer; + // Optimization note: if this is almost full, then it is worth our + // time, otherwise, we should just decode directly. + int last_block = (int)((bufferptr - buffer_start) % 64); + if (last_block != 0 && srcend - src + last_block >= 64) { + while ((bufferptr - buffer_start) % 64 != 0 && src < srcend) { + uint8_t val = to_base64[uint8_t(*src)]; + *bufferptr = char(val); + if ((!scalar::base64::is_eight_byte(*src) || val > 64) && + !ignore_garbage) { + return {error_code::INVALID_BASE64_CHARACTER, size_t(src - srcinit), + size_t(dst - dstinit)}; + } + bufferptr += (val <= 63); + src++; + } + } + + for (; buffer_start + 64 <= bufferptr; buffer_start += 64) { + base64_decode_block(dst, buffer_start); + dst += 48; + } + if ((bufferptr - buffer_start) % 64 != 0) { + while (buffer_start + 4 < bufferptr) { + uint32_t triple = ((uint32_t(uint8_t(buffer_start[0])) << 3 * 6) + + (uint32_t(uint8_t(buffer_start[1])) << 2 * 6) + + (uint32_t(uint8_t(buffer_start[2])) << 1 * 6) + + (uint32_t(uint8_t(buffer_start[3])) << 0 * 6)) + << 8; + triple = scalar::utf32::swap_bytes(triple); + std::memcpy(dst, &triple, 4); + + dst += 3; + buffer_start += 4; + } + if (buffer_start + 4 <= bufferptr) { + uint32_t triple = ((uint32_t(uint8_t(buffer_start[0])) << 3 * 6) + + (uint32_t(uint8_t(buffer_start[1])) << 2 * 6) + + (uint32_t(uint8_t(buffer_start[2])) << 1 * 6) + + (uint32_t(uint8_t(buffer_start[3])) << 0 * 6)) + << 8; + triple = scalar::utf32::swap_bytes(triple); + std::memcpy(dst, &triple, 3); + + dst += 3; + buffer_start += 4; + } + // we may have 1, 2 or 3 bytes left and we need to decode them so let us + // backtrack + int leftover = int(bufferptr - buffer_start); + while (leftover > 0) { + if (!ignore_garbage) { + while (to_base64[uint8_t(*(src - 1))] == 64) { + src--; + } + } else { + while (to_base64[uint8_t(*(src - 1))] >= 64) { + src--; + } + } + src--; + leftover--; + } + } + if (src < srcend + equalsigns) { + full_result r = scalar::base64::base64_tail_decode( + dst, src, srcend - src, equalsigns, options, last_chunk_options); + r.input_count += size_t(src - srcinit); + if (r.error == error_code::INVALID_BASE64_CHARACTER || + r.error == error_code::BASE64_EXTRA_BITS) { + return r; + } else { + r.output_count += size_t(dst - dstinit); + } + if (last_chunk_options != stop_before_partial && + r.error == error_code::SUCCESS && equalsigns > 0 && !ignore_garbage) { + // additional checks + if ((r.output_count % 3 == 0) || + ((r.output_count % 3) + 1 + equalsigns != 4)) { + r.error = error_code::INVALID_BASE64_CHARACTER; + r.input_count = equallocation; + } + } + return r; + } + if (equalsigns > 0 && !ignore_garbage) { + if ((size_t(dst - dstinit) % 3 == 0) || + ((size_t(dst - dstinit) % 3) + 1 + equalsigns != 4)) { + return {INVALID_BASE64_CHARACTER, equallocation, size_t(dst - dstinit)}; + } + } + return {SUCCESS, srclen, size_t(dst - dstinit)}; +} +/* end file src/arm64/arm_base64.cpp */ +/* begin file src/arm64/arm_convert_utf32_to_latin1.cpp */ +std::pair +arm_convert_utf32_to_latin1(const char32_t *buf, size_t len, + char *latin1_output) { + const char32_t *end = buf + len; + while (end - buf >= 8) { + uint32x4_t in1 = vld1q_u32(reinterpret_cast(buf)); + uint32x4_t in2 = vld1q_u32(reinterpret_cast(buf + 4)); + + uint16x8_t utf16_packed = vcombine_u16(vqmovn_u32(in1), vqmovn_u32(in2)); + if (vmaxvq_u16(utf16_packed) <= 0xff) { + // 1. pack the bytes + uint8x8_t latin1_packed = vmovn_u16(utf16_packed); + // 2. store (8 bytes) + vst1_u8(reinterpret_cast(latin1_output), latin1_packed); + // 3. adjust pointers + buf += 8; + latin1_output += 8; + } else { + return std::make_pair(nullptr, reinterpret_cast(latin1_output)); + } + } // while + return std::make_pair(buf, latin1_output); +} + +std::pair +arm_convert_utf32_to_latin1_with_errors(const char32_t *buf, size_t len, + char *latin1_output) { + const char32_t *start = buf; + const char32_t *end = buf + len; + + while (end - buf >= 8) { + uint32x4_t in1 = vld1q_u32(reinterpret_cast(buf)); + uint32x4_t in2 = vld1q_u32(reinterpret_cast(buf + 4)); + + uint16x8_t utf16_packed = vcombine_u16(vqmovn_u32(in1), vqmovn_u32(in2)); + + if (vmaxvq_u16(utf16_packed) <= 0xff) { + // 1. pack the bytes + uint8x8_t latin1_packed = vmovn_u16(utf16_packed); + // 2. store (8 bytes) + vst1_u8(reinterpret_cast(latin1_output), latin1_packed); + // 3. adjust pointers + buf += 8; + latin1_output += 8; + } else { + // Let us do a scalar fallback. + for (int k = 0; k < 8; k++) { + uint32_t word = buf[k]; + if (word <= 0xff) { + *latin1_output++ = char(word); + } else { + return std::make_pair(result(error_code::TOO_LARGE, buf - start + k), + latin1_output); + } + } + } + } // while + return std::make_pair(result(error_code::SUCCESS, buf - start), + latin1_output); +} +/* end file src/arm64/arm_convert_utf32_to_latin1.cpp */ +/* begin file src/arm64/arm_convert_utf32_to_utf16.cpp */ +template +std::pair +arm_convert_utf32_to_utf16(const char32_t *buf, size_t len, + char16_t *utf16_out) { + uint16_t *utf16_output = reinterpret_cast(utf16_out); + const char32_t *end = buf + len; + + uint16x4_t forbidden_bytemask = vmov_n_u16(0x0); + + while (end - buf >= 4) { + uint32x4_t in = vld1q_u32(reinterpret_cast(buf)); + + // Check if no bits set above 16th + if (vmaxvq_u32(in) <= 0xFFFF) { + uint16x4_t utf16_packed = vmovn_u32(in); + + const uint16x4_t v_d800 = vmov_n_u16((uint16_t)0xd800); + const uint16x4_t v_dfff = vmov_n_u16((uint16_t)0xdfff); + forbidden_bytemask = vorr_u16(vand_u16(vcle_u16(utf16_packed, v_dfff), + vcge_u16(utf16_packed, v_d800)), + forbidden_bytemask); + + if (!match_system(big_endian)) { + utf16_packed = + vreinterpret_u16_u8(vrev16_u8(vreinterpret_u8_u16(utf16_packed))); + } + vst1_u16(utf16_output, utf16_packed); + utf16_output += 4; + buf += 4; + } else { + size_t forward = 3; + size_t k = 0; + if (size_t(end - buf) < forward + 1) { + forward = size_t(end - buf - 1); + } + for (; k < forward; k++) { + uint32_t word = buf[k]; + if ((word & 0xFFFF0000) == 0) { + // will not generate a surrogate pair + if (word >= 0xD800 && word <= 0xDFFF) { + return std::make_pair(nullptr, + reinterpret_cast(utf16_output)); + } + *utf16_output++ = !match_system(big_endian) + ? char16_t(word >> 8 | word << 8) + : char16_t(word); + } else { + // will generate a surrogate pair + if (word > 0x10FFFF) { + return std::make_pair(nullptr, + reinterpret_cast(utf16_output)); + } + word -= 0x10000; + uint16_t high_surrogate = uint16_t(0xD800 + (word >> 10)); + uint16_t low_surrogate = uint16_t(0xDC00 + (word & 0x3FF)); + if (!match_system(big_endian)) { + high_surrogate = + uint16_t(high_surrogate >> 8 | high_surrogate << 8); + low_surrogate = uint16_t(low_surrogate << 8 | low_surrogate >> 8); + } + *utf16_output++ = char16_t(high_surrogate); + *utf16_output++ = char16_t(low_surrogate); + } + } + buf += k; + } + } + + // check for invalid input + if (vmaxv_u16(forbidden_bytemask) != 0) { + return std::make_pair(nullptr, reinterpret_cast(utf16_output)); + } + + return std::make_pair(buf, reinterpret_cast(utf16_output)); +} + +template +std::pair +arm_convert_utf32_to_utf16_with_errors(const char32_t *buf, size_t len, + char16_t *utf16_out) { + uint16_t *utf16_output = reinterpret_cast(utf16_out); + const char32_t *start = buf; + const char32_t *end = buf + len; + + while (end - buf >= 4) { + uint32x4_t in = vld1q_u32(reinterpret_cast(buf)); + + // Check if no bits set above 16th + if (vmaxvq_u32(in) <= 0xFFFF) { + uint16x4_t utf16_packed = vmovn_u32(in); + + const uint16x4_t v_d800 = vmov_n_u16((uint16_t)0xd800); + const uint16x4_t v_dfff = vmov_n_u16((uint16_t)0xdfff); + const uint16x4_t forbidden_bytemask = vand_u16( + vcle_u16(utf16_packed, v_dfff), vcge_u16(utf16_packed, v_d800)); + if (vmaxv_u16(forbidden_bytemask) != 0) { + return std::make_pair(result(error_code::SURROGATE, buf - start), + reinterpret_cast(utf16_output)); + } + + if (!match_system(big_endian)) { + utf16_packed = + vreinterpret_u16_u8(vrev16_u8(vreinterpret_u8_u16(utf16_packed))); + } + vst1_u16(utf16_output, utf16_packed); + utf16_output += 4; + buf += 4; + } else { + size_t forward = 3; + size_t k = 0; + if (size_t(end - buf) < forward + 1) { + forward = size_t(end - buf - 1); + } + for (; k < forward; k++) { + uint32_t word = buf[k]; + if ((word & 0xFFFF0000) == 0) { + // will not generate a surrogate pair + if (word >= 0xD800 && word <= 0xDFFF) { + return std::make_pair( + result(error_code::SURROGATE, buf - start + k), + reinterpret_cast(utf16_output)); + } + *utf16_output++ = !match_system(big_endian) + ? char16_t(word >> 8 | word << 8) + : char16_t(word); + } else { + // will generate a surrogate pair + if (word > 0x10FFFF) { + return std::make_pair( + result(error_code::TOO_LARGE, buf - start + k), + reinterpret_cast(utf16_output)); + } + word -= 0x10000; + uint16_t high_surrogate = uint16_t(0xD800 + (word >> 10)); + uint16_t low_surrogate = uint16_t(0xDC00 + (word & 0x3FF)); + if (!match_system(big_endian)) { + high_surrogate = + uint16_t(high_surrogate >> 8 | high_surrogate << 8); + low_surrogate = uint16_t(low_surrogate << 8 | low_surrogate >> 8); + } + *utf16_output++ = char16_t(high_surrogate); + *utf16_output++ = char16_t(low_surrogate); + } + } + buf += k; + } + } + + return std::make_pair(result(error_code::SUCCESS, buf - start), + reinterpret_cast(utf16_output)); +} +/* end file src/arm64/arm_convert_utf32_to_utf16.cpp */ +/* begin file src/arm64/arm_convert_utf32_to_utf8.cpp */ +std::pair +arm_convert_utf32_to_utf8(const char32_t *buf, size_t len, char *utf8_out) { + uint8_t *utf8_output = reinterpret_cast(utf8_out); + const char32_t *end = buf + len; + + const uint16x8_t v_c080 = vmovq_n_u16((uint16_t)0xc080); + + uint16x8_t forbidden_bytemask = vmovq_n_u16(0x0); + const size_t safety_margin = + 12; // to avoid overruns, see issue + // https://github.com/simdutf/simdutf/issues/92 + + while (buf + 16 + safety_margin < end) { + uint32x4_t in = vld1q_u32(reinterpret_cast(buf)); + uint32x4_t nextin = vld1q_u32(reinterpret_cast(buf + 4)); + + // Check if no bits set above 16th + if (vmaxvq_u32(vorrq_u32(in, nextin)) <= 0xFFFF) { + // Pack UTF-32 to UTF-16 safely (without surrogate pairs) + // Apply UTF-16 => UTF-8 routine (arm_convert_utf16_to_utf8.cpp) + uint16x8_t utf16_packed = vcombine_u16(vmovn_u32(in), vmovn_u32(nextin)); + if (vmaxvq_u16(utf16_packed) <= 0x7F) { // ASCII fast path!!!! + // 1. pack the bytes + // obviously suboptimal. + uint8x8_t utf8_packed = vmovn_u16(utf16_packed); + // 2. store (8 bytes) + vst1_u8(utf8_output, utf8_packed); + // 3. adjust pointers + buf += 8; + utf8_output += 8; + continue; // we are done for this round! + } + + if (vmaxvq_u16(utf16_packed) <= 0x7FF) { + // 1. prepare 2-byte values + // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8 + // expected output : [110a|aaaa|10bb|bbbb] x 8 + const uint16x8_t v_1f00 = vmovq_n_u16((int16_t)0x1f00); + const uint16x8_t v_003f = vmovq_n_u16((int16_t)0x003f); + + // t0 = [000a|aaaa|bbbb|bb00] + const uint16x8_t t0 = vshlq_n_u16(utf16_packed, 2); + // t1 = [000a|aaaa|0000|0000] + const uint16x8_t t1 = vandq_u16(t0, v_1f00); + // t2 = [0000|0000|00bb|bbbb] + const uint16x8_t t2 = vandq_u16(utf16_packed, v_003f); + // t3 = [000a|aaaa|00bb|bbbb] + const uint16x8_t t3 = vorrq_u16(t1, t2); + // t4 = [110a|aaaa|10bb|bbbb] + const uint16x8_t t4 = vorrq_u16(t3, v_c080); + // 2. merge ASCII and 2-byte codewords + const uint16x8_t v_007f = vmovq_n_u16((uint16_t)0x007F); + const uint16x8_t one_byte_bytemask = vcleq_u16(utf16_packed, v_007f); + const uint8x16_t utf8_unpacked = vreinterpretq_u8_u16( + vbslq_u16(one_byte_bytemask, utf16_packed, t4)); + // 3. prepare bitmask for 8-bit lookup +#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO + const uint16x8_t mask = simdutf_make_uint16x8_t( + 0x0001, 0x0004, 0x0010, 0x0040, 0x0002, 0x0008, 0x0020, 0x0080); +#else + const uint16x8_t mask = {0x0001, 0x0004, 0x0010, 0x0040, + 0x0002, 0x0008, 0x0020, 0x0080}; +#endif + uint16_t m2 = vaddvq_u16(vandq_u16(one_byte_bytemask, mask)); + // 4. pack the bytes + const uint8_t *row = + &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[m2][0]; + const uint8x16_t shuffle = vld1q_u8(row + 1); + const uint8x16_t utf8_packed = vqtbl1q_u8(utf8_unpacked, shuffle); + + // 5. store bytes + vst1q_u8(utf8_output, utf8_packed); + + // 6. adjust pointers + buf += 8; + utf8_output += row[0]; + continue; + } else { + // case: code units from register produce either 1, 2 or 3 UTF-8 bytes + const uint16x8_t v_d800 = vmovq_n_u16((uint16_t)0xd800); + const uint16x8_t v_dfff = vmovq_n_u16((uint16_t)0xdfff); + forbidden_bytemask = + vorrq_u16(vandq_u16(vcleq_u16(utf16_packed, v_dfff), + vcgeq_u16(utf16_packed, v_d800)), + forbidden_bytemask); + +#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO + const uint16x8_t dup_even = simdutf_make_uint16x8_t( + 0x0000, 0x0202, 0x0404, 0x0606, 0x0808, 0x0a0a, 0x0c0c, 0x0e0e); +#else + const uint16x8_t dup_even = {0x0000, 0x0202, 0x0404, 0x0606, + 0x0808, 0x0a0a, 0x0c0c, 0x0e0e}; +#endif + /* In this branch we handle three cases: + 1. [0000|0000|0ccc|cccc] => [0ccc|cccc] - + single UFT-8 byte + 2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc] - + two UTF-8 bytes + 3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - + three UTF-8 bytes + + We expand the input word (16-bit) into two code units (32-bit), thus + we have room for four bytes. However, we need five distinct bit + layouts. Note that the last byte in cases #2 and #3 is the same. + + We precompute byte 1 for case #1 and the common byte for cases #2 & #3 + in register t2. + + We precompute byte 1 for case #3 and -- **conditionally** -- + precompute either byte 1 for case #2 or byte 2 for case #3. Note that + they differ by exactly one bit. + + Finally from these two code units we build proper UTF-8 sequence, + taking into account the case (i.e, the number of bytes to write). + */ + /** + * Given [aaaa|bbbb|bbcc|cccc] our goal is to produce: + * t2 => [0ccc|cccc] [10cc|cccc] + * s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb]) + */ +#define simdutf_vec(x) vmovq_n_u16(static_cast(x)) + // [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc] + const uint16x8_t t0 = + vreinterpretq_u16_u8(vqtbl1q_u8(vreinterpretq_u8_u16(utf16_packed), + vreinterpretq_u8_u16(dup_even))); + // [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc] + const uint16x8_t t1 = vandq_u16(t0, simdutf_vec(0b0011111101111111)); + // [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc] + const uint16x8_t t2 = vorrq_u16(t1, simdutf_vec(0b1000000000000000)); + + // s0: [aaaa|bbbb|bbcc|cccc] => [0000|0000|0000|aaaa] + const uint16x8_t s0 = vshrq_n_u16(utf16_packed, 12); + // s1: [aaaa|bbbb|bbcc|cccc] => [0000|bbbb|bb00|0000] + const uint16x8_t s1 = + vandq_u16(utf16_packed, simdutf_vec(0b0000111111000000)); + // [0000|bbbb|bb00|0000] => [00bb|bbbb|0000|0000] + const uint16x8_t s1s = vshlq_n_u16(s1, 2); + // [00bb|bbbb|0000|aaaa] + const uint16x8_t s2 = vorrq_u16(s0, s1s); + // s3: [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa] + const uint16x8_t s3 = vorrq_u16(s2, simdutf_vec(0b1100000011100000)); + const uint16x8_t v_07ff = vmovq_n_u16((uint16_t)0x07FF); + const uint16x8_t one_or_two_bytes_bytemask = + vcleq_u16(utf16_packed, v_07ff); + const uint16x8_t m0 = vbicq_u16(simdutf_vec(0b0100000000000000), + one_or_two_bytes_bytemask); + const uint16x8_t s4 = veorq_u16(s3, m0); +#undef simdutf_vec + + // 4. expand code units 16-bit => 32-bit + const uint8x16_t out0 = vreinterpretq_u8_u16(vzip1q_u16(t2, s4)); + const uint8x16_t out1 = vreinterpretq_u8_u16(vzip2q_u16(t2, s4)); + + // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle + const uint16x8_t v_007f = vmovq_n_u16((uint16_t)0x007F); + const uint16x8_t one_byte_bytemask = vcleq_u16(utf16_packed, v_007f); +#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO + const uint16x8_t onemask = simdutf_make_uint16x8_t( + 0x0001, 0x0004, 0x0010, 0x0040, 0x0100, 0x0400, 0x1000, 0x4000); + const uint16x8_t twomask = simdutf_make_uint16x8_t( + 0x0002, 0x0008, 0x0020, 0x0080, 0x0200, 0x0800, 0x2000, 0x8000); +#else + const uint16x8_t onemask = {0x0001, 0x0004, 0x0010, 0x0040, + 0x0100, 0x0400, 0x1000, 0x4000}; + const uint16x8_t twomask = {0x0002, 0x0008, 0x0020, 0x0080, + 0x0200, 0x0800, 0x2000, 0x8000}; +#endif + const uint16x8_t combined = + vorrq_u16(vandq_u16(one_byte_bytemask, onemask), + vandq_u16(one_or_two_bytes_bytemask, twomask)); + const uint16_t mask = vaddvq_u16(combined); + // The following fast path may or may not be beneficial. + /*if(mask == 0) { + // We only have three-byte code units. Use fast path. + const uint8x16_t shuffle = {2,3,1,6,7,5,10,11,9,14,15,13,0,0,0,0}; + const uint8x16_t utf8_0 = vqtbl1q_u8(out0, shuffle); + const uint8x16_t utf8_1 = vqtbl1q_u8(out1, shuffle); + vst1q_u8(utf8_output, utf8_0); + utf8_output += 12; + vst1q_u8(utf8_output, utf8_1); + utf8_output += 12; + buf += 8; + continue; + }*/ + const uint8_t mask0 = uint8_t(mask); + const uint8_t *row0 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask0][0]; + const uint8x16_t shuffle0 = vld1q_u8(row0 + 1); + const uint8x16_t utf8_0 = vqtbl1q_u8(out0, shuffle0); + + const uint8_t mask1 = static_cast(mask >> 8); + const uint8_t *row1 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask1][0]; + const uint8x16_t shuffle1 = vld1q_u8(row1 + 1); + const uint8x16_t utf8_1 = vqtbl1q_u8(out1, shuffle1); + + vst1q_u8(utf8_output, utf8_0); + utf8_output += row0[0]; + vst1q_u8(utf8_output, utf8_1); + utf8_output += row1[0]; + + buf += 8; + } + // At least one 32-bit word will produce a surrogate pair in UTF-16 <=> + // will produce four UTF-8 bytes. + } else { + // Let us do a scalar fallback. + // It may seem wasteful to use scalar code, but being efficient with SIMD + // in the presence of surrogate pairs may require non-trivial tables. + size_t forward = 15; + size_t k = 0; + if (size_t(end - buf) < forward + 1) { + forward = size_t(end - buf - 1); + } + for (; k < forward; k++) { + uint32_t word = buf[k]; + if ((word & 0xFFFFFF80) == 0) { + *utf8_output++ = char(word); + } else if ((word & 0xFFFFF800) == 0) { + *utf8_output++ = char((word >> 6) | 0b11000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + } else if ((word & 0xFFFF0000) == 0) { + if (word >= 0xD800 && word <= 0xDFFF) { + return std::make_pair(nullptr, + reinterpret_cast(utf8_output)); + } + *utf8_output++ = char((word >> 12) | 0b11100000); + *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + } else { + if (word > 0x10FFFF) { + return std::make_pair(nullptr, + reinterpret_cast(utf8_output)); + } + *utf8_output++ = char((word >> 18) | 0b11110000); + *utf8_output++ = char(((word >> 12) & 0b111111) | 0b10000000); + *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + } + } + buf += k; + } + } // while + + // check for invalid input + if (vmaxvq_u16(forbidden_bytemask) != 0) { + return std::make_pair(nullptr, reinterpret_cast(utf8_output)); + } + return std::make_pair(buf, reinterpret_cast(utf8_output)); +} + +std::pair +arm_convert_utf32_to_utf8_with_errors(const char32_t *buf, size_t len, + char *utf8_out) { + uint8_t *utf8_output = reinterpret_cast(utf8_out); + const char32_t *start = buf; + const char32_t *end = buf + len; + + const uint16x8_t v_c080 = vmovq_n_u16((uint16_t)0xc080); + const size_t safety_margin = + 12; // to avoid overruns, see issue + // https://github.com/simdutf/simdutf/issues/92 + + while (buf + 16 + safety_margin < end) { + uint32x4_t in = vld1q_u32(reinterpret_cast(buf)); + uint32x4_t nextin = vld1q_u32(reinterpret_cast(buf + 4)); + + // Check if no bits set above 16th + if (vmaxvq_u32(vorrq_u32(in, nextin)) <= 0xFFFF) { + // Pack UTF-32 to UTF-16 safely (without surrogate pairs) + // Apply UTF-16 => UTF-8 routine (arm_convert_utf16_to_utf8.cpp) + uint16x8_t utf16_packed = vcombine_u16(vmovn_u32(in), vmovn_u32(nextin)); + if (vmaxvq_u16(utf16_packed) <= 0x7F) { // ASCII fast path!!!! + // 1. pack the bytes + // obviously suboptimal. + uint8x8_t utf8_packed = vmovn_u16(utf16_packed); + // 2. store (8 bytes) + vst1_u8(utf8_output, utf8_packed); + // 3. adjust pointers + buf += 8; + utf8_output += 8; + continue; // we are done for this round! + } + + if (vmaxvq_u16(utf16_packed) <= 0x7FF) { + // 1. prepare 2-byte values + // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8 + // expected output : [110a|aaaa|10bb|bbbb] x 8 + const uint16x8_t v_1f00 = vmovq_n_u16((int16_t)0x1f00); + const uint16x8_t v_003f = vmovq_n_u16((int16_t)0x003f); + + // t0 = [000a|aaaa|bbbb|bb00] + const uint16x8_t t0 = vshlq_n_u16(utf16_packed, 2); + // t1 = [000a|aaaa|0000|0000] + const uint16x8_t t1 = vandq_u16(t0, v_1f00); + // t2 = [0000|0000|00bb|bbbb] + const uint16x8_t t2 = vandq_u16(utf16_packed, v_003f); + // t3 = [000a|aaaa|00bb|bbbb] + const uint16x8_t t3 = vorrq_u16(t1, t2); + // t4 = [110a|aaaa|10bb|bbbb] + const uint16x8_t t4 = vorrq_u16(t3, v_c080); + // 2. merge ASCII and 2-byte codewords + const uint16x8_t v_007f = vmovq_n_u16((uint16_t)0x007F); + const uint16x8_t one_byte_bytemask = vcleq_u16(utf16_packed, v_007f); + const uint8x16_t utf8_unpacked = vreinterpretq_u8_u16( + vbslq_u16(one_byte_bytemask, utf16_packed, t4)); + // 3. prepare bitmask for 8-bit lookup +#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO + const uint16x8_t mask = simdutf_make_uint16x8_t( + 0x0001, 0x0004, 0x0010, 0x0040, 0x0002, 0x0008, 0x0020, 0x0080); +#else + const uint16x8_t mask = {0x0001, 0x0004, 0x0010, 0x0040, + 0x0002, 0x0008, 0x0020, 0x0080}; +#endif + uint16_t m2 = vaddvq_u16(vandq_u16(one_byte_bytemask, mask)); + // 4. pack the bytes + const uint8_t *row = + &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[m2][0]; + const uint8x16_t shuffle = vld1q_u8(row + 1); + const uint8x16_t utf8_packed = vqtbl1q_u8(utf8_unpacked, shuffle); + + // 5. store bytes + vst1q_u8(utf8_output, utf8_packed); + + // 6. adjust pointers + buf += 8; + utf8_output += row[0]; + continue; + } else { + // case: code units from register produce either 1, 2 or 3 UTF-8 bytes + + // check for invalid input + const uint16x8_t v_d800 = vmovq_n_u16((uint16_t)0xd800); + const uint16x8_t v_dfff = vmovq_n_u16((uint16_t)0xdfff); + const uint16x8_t forbidden_bytemask = vandq_u16( + vcleq_u16(utf16_packed, v_dfff), vcgeq_u16(utf16_packed, v_d800)); + if (vmaxvq_u16(forbidden_bytemask) != 0) { + return std::make_pair(result(error_code::SURROGATE, buf - start), + reinterpret_cast(utf8_output)); + } + +#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO + const uint16x8_t dup_even = simdutf_make_uint16x8_t( + 0x0000, 0x0202, 0x0404, 0x0606, 0x0808, 0x0a0a, 0x0c0c, 0x0e0e); +#else + const uint16x8_t dup_even = {0x0000, 0x0202, 0x0404, 0x0606, + 0x0808, 0x0a0a, 0x0c0c, 0x0e0e}; +#endif + /* In this branch we handle three cases: + 1. [0000|0000|0ccc|cccc] => [0ccc|cccc] - + single UFT-8 byte + 2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc] - + two UTF-8 bytes + 3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - + three UTF-8 bytes + + We expand the input word (16-bit) into two code units (32-bit), thus + we have room for four bytes. However, we need five distinct bit + layouts. Note that the last byte in cases #2 and #3 is the same. + + We precompute byte 1 for case #1 and the common byte for cases #2 & #3 + in register t2. + + We precompute byte 1 for case #3 and -- **conditionally** -- + precompute either byte 1 for case #2 or byte 2 for case #3. Note that + they differ by exactly one bit. + + Finally from these two code units we build proper UTF-8 sequence, + taking into account the case (i.e, the number of bytes to write). + */ + /** + * Given [aaaa|bbbb|bbcc|cccc] our goal is to produce: + * t2 => [0ccc|cccc] [10cc|cccc] + * s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb]) + */ +#define simdutf_vec(x) vmovq_n_u16(static_cast(x)) + // [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc] + const uint16x8_t t0 = + vreinterpretq_u16_u8(vqtbl1q_u8(vreinterpretq_u8_u16(utf16_packed), + vreinterpretq_u8_u16(dup_even))); + // [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc] + const uint16x8_t t1 = vandq_u16(t0, simdutf_vec(0b0011111101111111)); + // [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc] + const uint16x8_t t2 = vorrq_u16(t1, simdutf_vec(0b1000000000000000)); + + // s0: [aaaa|bbbb|bbcc|cccc] => [0000|0000|0000|aaaa] + const uint16x8_t s0 = vshrq_n_u16(utf16_packed, 12); + // s1: [aaaa|bbbb|bbcc|cccc] => [0000|bbbb|bb00|0000] + const uint16x8_t s1 = + vandq_u16(utf16_packed, simdutf_vec(0b0000111111000000)); + // [0000|bbbb|bb00|0000] => [00bb|bbbb|0000|0000] + const uint16x8_t s1s = vshlq_n_u16(s1, 2); + // [00bb|bbbb|0000|aaaa] + const uint16x8_t s2 = vorrq_u16(s0, s1s); + // s3: [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa] + const uint16x8_t s3 = vorrq_u16(s2, simdutf_vec(0b1100000011100000)); + const uint16x8_t v_07ff = vmovq_n_u16((uint16_t)0x07FF); + const uint16x8_t one_or_two_bytes_bytemask = + vcleq_u16(utf16_packed, v_07ff); + const uint16x8_t m0 = vbicq_u16(simdutf_vec(0b0100000000000000), + one_or_two_bytes_bytemask); + const uint16x8_t s4 = veorq_u16(s3, m0); +#undef simdutf_vec + + // 4. expand code units 16-bit => 32-bit + const uint8x16_t out0 = vreinterpretq_u8_u16(vzip1q_u16(t2, s4)); + const uint8x16_t out1 = vreinterpretq_u8_u16(vzip2q_u16(t2, s4)); + + // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle + const uint16x8_t v_007f = vmovq_n_u16((uint16_t)0x007F); + const uint16x8_t one_byte_bytemask = vcleq_u16(utf16_packed, v_007f); +#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO + const uint16x8_t onemask = simdutf_make_uint16x8_t( + 0x0001, 0x0004, 0x0010, 0x0040, 0x0100, 0x0400, 0x1000, 0x4000); + const uint16x8_t twomask = simdutf_make_uint16x8_t( + 0x0002, 0x0008, 0x0020, 0x0080, 0x0200, 0x0800, 0x2000, 0x8000); +#else + const uint16x8_t onemask = {0x0001, 0x0004, 0x0010, 0x0040, + 0x0100, 0x0400, 0x1000, 0x4000}; + const uint16x8_t twomask = {0x0002, 0x0008, 0x0020, 0x0080, + 0x0200, 0x0800, 0x2000, 0x8000}; +#endif + const uint16x8_t combined = + vorrq_u16(vandq_u16(one_byte_bytemask, onemask), + vandq_u16(one_or_two_bytes_bytemask, twomask)); + const uint16_t mask = vaddvq_u16(combined); + // The following fast path may or may not be beneficial. + /*if(mask == 0) { + // We only have three-byte code units. Use fast path. + const uint8x16_t shuffle = {2,3,1,6,7,5,10,11,9,14,15,13,0,0,0,0}; + const uint8x16_t utf8_0 = vqtbl1q_u8(out0, shuffle); + const uint8x16_t utf8_1 = vqtbl1q_u8(out1, shuffle); + vst1q_u8(utf8_output, utf8_0); + utf8_output += 12; + vst1q_u8(utf8_output, utf8_1); + utf8_output += 12; + buf += 8; + continue; + }*/ + const uint8_t mask0 = uint8_t(mask); + + const uint8_t *row0 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask0][0]; + const uint8x16_t shuffle0 = vld1q_u8(row0 + 1); + const uint8x16_t utf8_0 = vqtbl1q_u8(out0, shuffle0); + + const uint8_t mask1 = static_cast(mask >> 8); + const uint8_t *row1 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask1][0]; + const uint8x16_t shuffle1 = vld1q_u8(row1 + 1); + const uint8x16_t utf8_1 = vqtbl1q_u8(out1, shuffle1); + + vst1q_u8(utf8_output, utf8_0); + utf8_output += row0[0]; + vst1q_u8(utf8_output, utf8_1); + utf8_output += row1[0]; + + buf += 8; + } + // At least one 32-bit word will produce a surrogate pair in UTF-16 <=> + // will produce four UTF-8 bytes. + } else { + // Let us do a scalar fallback. + // It may seem wasteful to use scalar code, but being efficient with SIMD + // in the presence of surrogate pairs may require non-trivial tables. + size_t forward = 15; + size_t k = 0; + if (size_t(end - buf) < forward + 1) { + forward = size_t(end - buf - 1); + } + for (; k < forward; k++) { + uint32_t word = buf[k]; + if ((word & 0xFFFFFF80) == 0) { + *utf8_output++ = char(word); + } else if ((word & 0xFFFFF800) == 0) { + *utf8_output++ = char((word >> 6) | 0b11000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + } else if ((word & 0xFFFF0000) == 0) { + if (word >= 0xD800 && word <= 0xDFFF) { + return std::make_pair( + result(error_code::SURROGATE, buf - start + k), + reinterpret_cast(utf8_output)); + } + *utf8_output++ = char((word >> 12) | 0b11100000); + *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + } else { + if (word > 0x10FFFF) { + return std::make_pair( + result(error_code::TOO_LARGE, buf - start + k), + reinterpret_cast(utf8_output)); + } + *utf8_output++ = char((word >> 18) | 0b11110000); + *utf8_output++ = char(((word >> 12) & 0b111111) | 0b10000000); + *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + } + } + buf += k; + } + } // while + + return std::make_pair(result(error_code::SUCCESS, buf - start), + reinterpret_cast(utf8_output)); +} +/* end file src/arm64/arm_convert_utf32_to_utf8.cpp */ + +} // unnamed namespace +} // namespace arm64 +} // namespace simdutf +/* begin file src/generic/buf_block_reader.h */ +namespace simdutf { +namespace arm64 { +namespace { + +// Walks through a buffer in block-sized increments, loading the last part with +// spaces +template struct buf_block_reader { +public: + simdutf_really_inline buf_block_reader(const uint8_t *_buf, size_t _len); + simdutf_really_inline size_t block_index(); + simdutf_really_inline bool has_full_block() const; + simdutf_really_inline const uint8_t *full_block() const; + /** + * Get the last block, padded with spaces. + * + * There will always be a last block, with at least 1 byte, unless len == 0 + * (in which case this function fills the buffer with spaces and returns 0. In + * particular, if len == STEP_SIZE there will be 0 full_blocks and 1 remainder + * block with STEP_SIZE bytes and no spaces for padding. + * + * @return the number of effective characters in the last block. + */ + simdutf_really_inline size_t get_remainder(uint8_t *dst) const; + simdutf_really_inline void advance(); + +private: + const uint8_t *buf; + const size_t len; + const size_t lenminusstep; + size_t idx; +}; + +// Routines to print masks and text for debugging bitmask operations +simdutf_unused static char *format_input_text_64(const uint8_t *text) { + static char *buf = + reinterpret_cast(malloc(sizeof(simd8x64) + 1)); + for (size_t i = 0; i < sizeof(simd8x64); i++) { + buf[i] = int8_t(text[i]) < ' ' ? '_' : int8_t(text[i]); + } + buf[sizeof(simd8x64)] = '\0'; + return buf; +} + +// Routines to print masks and text for debugging bitmask operations +simdutf_unused static char *format_input_text(const simd8x64 &in) { + static char *buf = + reinterpret_cast(malloc(sizeof(simd8x64) + 1)); + in.store(reinterpret_cast(buf)); + for (size_t i = 0; i < sizeof(simd8x64); i++) { + if (buf[i] < ' ') { + buf[i] = '_'; + } + } + buf[sizeof(simd8x64)] = '\0'; + return buf; +} + +simdutf_unused static char *format_mask(uint64_t mask) { + static char *buf = reinterpret_cast(malloc(64 + 1)); + for (size_t i = 0; i < 64; i++) { + buf[i] = (mask & (size_t(1) << i)) ? 'X' : ' '; + } + buf[64] = '\0'; + return buf; +} + +template +simdutf_really_inline +buf_block_reader::buf_block_reader(const uint8_t *_buf, size_t _len) + : buf{_buf}, len{_len}, lenminusstep{len < STEP_SIZE ? 0 : len - STEP_SIZE}, + idx{0} {} + +template +simdutf_really_inline size_t buf_block_reader::block_index() { + return idx; +} + +template +simdutf_really_inline bool buf_block_reader::has_full_block() const { + return idx < lenminusstep; +} + +template +simdutf_really_inline const uint8_t * +buf_block_reader::full_block() const { + return &buf[idx]; +} + +template +simdutf_really_inline size_t +buf_block_reader::get_remainder(uint8_t *dst) const { + if (len == idx) { + return 0; + } // memcpy(dst, null, 0) will trigger an error with some sanitizers + std::memset(dst, 0x20, + STEP_SIZE); // std::memset STEP_SIZE because it is more efficient + // to write out 8 or 16 bytes at once. + std::memcpy(dst, buf + idx, len - idx); + return len - idx; +} + +template +simdutf_really_inline void buf_block_reader::advance() { + idx += STEP_SIZE; +} + +} // unnamed namespace +} // namespace arm64 +} // namespace simdutf +/* end file src/generic/buf_block_reader.h */ +/* begin file src/generic/utf8_validation/utf8_lookup4_algorithm.h */ +namespace simdutf { +namespace arm64 { +namespace { +namespace utf8_validation { + +using namespace simd; + +simdutf_really_inline simd8 +check_special_cases(const simd8 input, const simd8 prev1) { + // Bit 0 = Too Short (lead byte/ASCII followed by lead byte/ASCII) + // Bit 1 = Too Long (ASCII followed by continuation) + // Bit 2 = Overlong 3-byte + // Bit 4 = Surrogate + // Bit 5 = Overlong 2-byte + // Bit 7 = Two Continuations + constexpr const uint8_t TOO_SHORT = 1 << 0; // 11______ 0_______ + // 11______ 11______ + constexpr const uint8_t TOO_LONG = 1 << 1; // 0_______ 10______ + constexpr const uint8_t OVERLONG_3 = 1 << 2; // 11100000 100_____ + constexpr const uint8_t SURROGATE = 1 << 4; // 11101101 101_____ + constexpr const uint8_t OVERLONG_2 = 1 << 5; // 1100000_ 10______ + constexpr const uint8_t TWO_CONTS = 1 << 7; // 10______ 10______ + constexpr const uint8_t TOO_LARGE = 1 << 3; // 11110100 1001____ + // 11110100 101_____ + // 11110101 1001____ + // 11110101 101_____ + // 1111011_ 1001____ + // 1111011_ 101_____ + // 11111___ 1001____ + // 11111___ 101_____ + constexpr const uint8_t TOO_LARGE_1000 = 1 << 6; + // 11110101 1000____ + // 1111011_ 1000____ + // 11111___ 1000____ + constexpr const uint8_t OVERLONG_4 = 1 << 6; // 11110000 1000____ + + const simd8 byte_1_high = prev1.shr<4>().lookup_16( + // 0_______ ________ + TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, + TOO_LONG, + // 10______ ________ + TWO_CONTS, TWO_CONTS, TWO_CONTS, TWO_CONTS, + // 1100____ ________ + TOO_SHORT | OVERLONG_2, + // 1101____ ________ + TOO_SHORT, + // 1110____ ________ + TOO_SHORT | OVERLONG_3 | SURROGATE, + // 1111____ ________ + TOO_SHORT | TOO_LARGE | TOO_LARGE_1000 | OVERLONG_4); + constexpr const uint8_t CARRY = + TOO_SHORT | TOO_LONG | TWO_CONTS; // These all have ____ in byte 1 . + const simd8 byte_1_low = + (prev1 & 0x0F) + .lookup_16( + // ____0000 ________ + CARRY | OVERLONG_3 | OVERLONG_2 | OVERLONG_4, + // ____0001 ________ + CARRY | OVERLONG_2, + // ____001_ ________ + CARRY, CARRY, + + // ____0100 ________ + CARRY | TOO_LARGE, + // ____0101 ________ + CARRY | TOO_LARGE | TOO_LARGE_1000, + // ____011_ ________ + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + + // ____1___ ________ + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + // ____1101 ________ + CARRY | TOO_LARGE | TOO_LARGE_1000 | SURROGATE, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000); + const simd8 byte_2_high = input.shr<4>().lookup_16( + // ________ 0_______ + TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, + TOO_SHORT, TOO_SHORT, + + // ________ 1000____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE_1000 | + OVERLONG_4, + // ________ 1001____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE, + // ________ 101_____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, + TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, + + // ________ 11______ + TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT); + return (byte_1_high & byte_1_low & byte_2_high); +} +simdutf_really_inline simd8 +check_multibyte_lengths(const simd8 input, + const simd8 prev_input, + const simd8 sc) { + simd8 prev2 = input.prev<2>(prev_input); + simd8 prev3 = input.prev<3>(prev_input); + simd8 must23 = + simd8(must_be_2_3_continuation(prev2, prev3)); + simd8 must23_80 = must23 & uint8_t(0x80); + return must23_80 ^ sc; +} + +// +// Return nonzero if there are incomplete multibyte characters at the end of the +// block: e.g. if there is a 4-byte character, but it is 3 bytes from the end. +// +simdutf_really_inline simd8 is_incomplete(const simd8 input) { + // If the previous input's last 3 bytes match this, they're too short (they + // ended at EOF): + // ... 1111____ 111_____ 11______ + static const uint8_t max_array[32] = {255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 0b11110000u - 1, + 0b11100000u - 1, + 0b11000000u - 1}; + const simd8 max_value( + &max_array[sizeof(max_array) - sizeof(simd8)]); + return input.gt_bits(max_value); +} + +struct utf8_checker { + // If this is nonzero, there has been a UTF-8 error. + simd8 error; + // The last input we received + simd8 prev_input_block; + // Whether the last input we received was incomplete (used for ASCII fast + // path) + simd8 prev_incomplete; + + // + // Check whether the current bytes are valid UTF-8. + // + simdutf_really_inline void check_utf8_bytes(const simd8 input, + const simd8 prev_input) { + // Flip prev1...prev3 so we can easily determine if they are 2+, 3+ or 4+ + // lead bytes (2, 3, 4-byte leads become large positive numbers instead of + // small negative numbers) + simd8 prev1 = input.prev<1>(prev_input); + simd8 sc = check_special_cases(input, prev1); + this->error |= check_multibyte_lengths(input, prev_input, sc); + } + + // The only problem that can happen at EOF is that a multibyte character is + // too short or a byte value too large in the last bytes: check_special_cases + // only checks for bytes too large in the first of two bytes. + simdutf_really_inline void check_eof() { + // If the previous block had incomplete UTF-8 characters at the end, an + // ASCII block can't possibly finish them. + this->error |= this->prev_incomplete; + } + + simdutf_really_inline void check_next_input(const simd8x64 &input) { + if (simdutf_likely(is_ascii(input))) { + this->error |= this->prev_incomplete; + } else { + // you might think that a for-loop would work, but under Visual Studio, it + // is not good enough. + static_assert((simd8x64::NUM_CHUNKS == 2) || + (simd8x64::NUM_CHUNKS == 4), + "We support either two or four chunks per 64-byte block."); + if (simd8x64::NUM_CHUNKS == 2) { + this->check_utf8_bytes(input.chunks[0], this->prev_input_block); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + } else if (simd8x64::NUM_CHUNKS == 4) { + this->check_utf8_bytes(input.chunks[0], this->prev_input_block); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + this->check_utf8_bytes(input.chunks[2], input.chunks[1]); + this->check_utf8_bytes(input.chunks[3], input.chunks[2]); + } + this->prev_incomplete = + is_incomplete(input.chunks[simd8x64::NUM_CHUNKS - 1]); + this->prev_input_block = input.chunks[simd8x64::NUM_CHUNKS - 1]; + } + } + + // do not forget to call check_eof! + simdutf_really_inline bool errors() const { + return this->error.any_bits_set_anywhere(); + } + +}; // struct utf8_checker +} // namespace utf8_validation + +using utf8_validation::utf8_checker; + +} // unnamed namespace +} // namespace arm64 +} // namespace simdutf +/* end file src/generic/utf8_validation/utf8_lookup4_algorithm.h */ +/* begin file src/generic/utf8_validation/utf8_validator.h */ +namespace simdutf { +namespace arm64 { +namespace { +namespace utf8_validation { + +/** + * Validates that the string is actual UTF-8. + */ +template +bool generic_validate_utf8(const uint8_t *input, size_t length) { + checker c{}; + buf_block_reader<64> reader(input, length); + while (reader.has_full_block()) { + simd::simd8x64 in(reader.full_block()); + c.check_next_input(in); + reader.advance(); + } + uint8_t block[64]{}; + reader.get_remainder(block); + simd::simd8x64 in(block); + c.check_next_input(in); + reader.advance(); + c.check_eof(); + return !c.errors(); +} + +bool generic_validate_utf8(const char *input, size_t length) { + return generic_validate_utf8( + reinterpret_cast(input), length); +} + +/** + * Validates that the string is actual UTF-8 and stops on errors. + */ +template +result generic_validate_utf8_with_errors(const uint8_t *input, size_t length) { + checker c{}; + buf_block_reader<64> reader(input, length); + size_t count{0}; + while (reader.has_full_block()) { + simd::simd8x64 in(reader.full_block()); + c.check_next_input(in); + if (c.errors()) { + if (count != 0) { + count--; + } // Sometimes the error is only detected in the next chunk + result res = scalar::utf8::rewind_and_validate_with_errors( + reinterpret_cast(input), + reinterpret_cast(input + count), length - count); + res.count += count; + return res; + } + reader.advance(); + count += 64; + } + uint8_t block[64]{}; + reader.get_remainder(block); + simd::simd8x64 in(block); + c.check_next_input(in); + reader.advance(); + c.check_eof(); + if (c.errors()) { + if (count != 0) { + count--; + } // Sometimes the error is only detected in the next chunk + result res = scalar::utf8::rewind_and_validate_with_errors( + reinterpret_cast(input), + reinterpret_cast(input) + count, length - count); + res.count += count; + return res; + } else { + return result(error_code::SUCCESS, length); + } +} + +result generic_validate_utf8_with_errors(const char *input, size_t length) { + return generic_validate_utf8_with_errors( + reinterpret_cast(input), length); +} + +template +bool generic_validate_ascii(const uint8_t *input, size_t length) { + buf_block_reader<64> reader(input, length); + uint8_t blocks[64]{}; + simd::simd8x64 running_or(blocks); + while (reader.has_full_block()) { + simd::simd8x64 in(reader.full_block()); + running_or |= in; + reader.advance(); + } + uint8_t block[64]{}; + reader.get_remainder(block); + simd::simd8x64 in(block); + running_or |= in; + return running_or.is_ascii(); +} + +bool generic_validate_ascii(const char *input, size_t length) { + return generic_validate_ascii( + reinterpret_cast(input), length); +} + +template +result generic_validate_ascii_with_errors(const uint8_t *input, size_t length) { + buf_block_reader<64> reader(input, length); + size_t count{0}; + while (reader.has_full_block()) { + simd::simd8x64 in(reader.full_block()); + if (!in.is_ascii()) { + result res = scalar::ascii::validate_with_errors( + reinterpret_cast(input + count), length - count); + return result(res.error, count + res.count); + } + reader.advance(); + + count += 64; + } + uint8_t block[64]{}; + reader.get_remainder(block); + simd::simd8x64 in(block); + if (!in.is_ascii()) { + result res = scalar::ascii::validate_with_errors( + reinterpret_cast(input + count), length - count); + return result(res.error, count + res.count); + } else { + return result(error_code::SUCCESS, length); + } +} + +result generic_validate_ascii_with_errors(const char *input, size_t length) { + return generic_validate_ascii_with_errors( + reinterpret_cast(input), length); +} + +} // namespace utf8_validation +} // unnamed namespace +} // namespace arm64 +} // namespace simdutf +/* end file src/generic/utf8_validation/utf8_validator.h */ +// transcoding from UTF-8 to UTF-16 +/* begin file src/generic/utf8_to_utf16/utf8_to_utf16.h */ + +namespace simdutf { +namespace arm64 { +namespace { +namespace utf8_to_utf16 { +using namespace simd; + +simdutf_really_inline simd8 +check_special_cases(const simd8 input, const simd8 prev1) { + // Bit 0 = Too Short (lead byte/ASCII followed by lead byte/ASCII) + // Bit 1 = Too Long (ASCII followed by continuation) + // Bit 2 = Overlong 3-byte + // Bit 4 = Surrogate + // Bit 5 = Overlong 2-byte + // Bit 7 = Two Continuations + constexpr const uint8_t TOO_SHORT = 1 << 0; // 11______ 0_______ + // 11______ 11______ + constexpr const uint8_t TOO_LONG = 1 << 1; // 0_______ 10______ + constexpr const uint8_t OVERLONG_3 = 1 << 2; // 11100000 100_____ + constexpr const uint8_t SURROGATE = 1 << 4; // 11101101 101_____ + constexpr const uint8_t OVERLONG_2 = 1 << 5; // 1100000_ 10______ + constexpr const uint8_t TWO_CONTS = 1 << 7; // 10______ 10______ + constexpr const uint8_t TOO_LARGE = 1 << 3; // 11110100 1001____ + // 11110100 101_____ + // 11110101 1001____ + // 11110101 101_____ + // 1111011_ 1001____ + // 1111011_ 101_____ + // 11111___ 1001____ + // 11111___ 101_____ + constexpr const uint8_t TOO_LARGE_1000 = 1 << 6; + // 11110101 1000____ + // 1111011_ 1000____ + // 11111___ 1000____ + constexpr const uint8_t OVERLONG_4 = 1 << 6; // 11110000 1000____ + + const simd8 byte_1_high = prev1.shr<4>().lookup_16( + // 0_______ ________ + TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, + TOO_LONG, + // 10______ ________ + TWO_CONTS, TWO_CONTS, TWO_CONTS, TWO_CONTS, + // 1100____ ________ + TOO_SHORT | OVERLONG_2, + // 1101____ ________ + TOO_SHORT, + // 1110____ ________ + TOO_SHORT | OVERLONG_3 | SURROGATE, + // 1111____ ________ + TOO_SHORT | TOO_LARGE | TOO_LARGE_1000 | OVERLONG_4); + constexpr const uint8_t CARRY = + TOO_SHORT | TOO_LONG | TWO_CONTS; // These all have ____ in byte 1 . + const simd8 byte_1_low = + (prev1 & 0x0F) + .lookup_16( + // ____0000 ________ + CARRY | OVERLONG_3 | OVERLONG_2 | OVERLONG_4, + // ____0001 ________ + CARRY | OVERLONG_2, + // ____001_ ________ + CARRY, CARRY, + + // ____0100 ________ + CARRY | TOO_LARGE, + // ____0101 ________ + CARRY | TOO_LARGE | TOO_LARGE_1000, + // ____011_ ________ + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + + // ____1___ ________ + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + // ____1101 ________ + CARRY | TOO_LARGE | TOO_LARGE_1000 | SURROGATE, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000); + const simd8 byte_2_high = input.shr<4>().lookup_16( + // ________ 0_______ + TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, + TOO_SHORT, TOO_SHORT, + + // ________ 1000____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE_1000 | + OVERLONG_4, + // ________ 1001____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE, + // ________ 101_____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, + TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, + + // ________ 11______ + TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT); + return (byte_1_high & byte_1_low & byte_2_high); +} +simdutf_really_inline simd8 +check_multibyte_lengths(const simd8 input, + const simd8 prev_input, + const simd8 sc) { + simd8 prev2 = input.prev<2>(prev_input); + simd8 prev3 = input.prev<3>(prev_input); + simd8 must23 = + simd8(must_be_2_3_continuation(prev2, prev3)); + simd8 must23_80 = must23 & uint8_t(0x80); + return must23_80 ^ sc; +} + +struct validating_transcoder { + // If this is nonzero, there has been a UTF-8 error. + simd8 error; + + validating_transcoder() : error(uint8_t(0)) {} + // + // Check whether the current bytes are valid UTF-8. + // + simdutf_really_inline void check_utf8_bytes(const simd8 input, + const simd8 prev_input) { + // Flip prev1...prev3 so we can easily determine if they are 2+, 3+ or 4+ + // lead bytes (2, 3, 4-byte leads become large positive numbers instead of + // small negative numbers) + simd8 prev1 = input.prev<1>(prev_input); + simd8 sc = check_special_cases(input, prev1); + this->error |= check_multibyte_lengths(input, prev_input, sc); + } + + template + simdutf_really_inline size_t convert(const char *in, size_t size, + char16_t *utf16_output) { + size_t pos = 0; + char16_t *start{utf16_output}; + // In the worst case, we have the haswell kernel which can cause an overflow + // of 8 bytes when calling convert_masked_utf8_to_utf16. If you skip the + // last 16 bytes, and if the data is valid, then it is entirely safe because + // 16 UTF-8 bytes generate much more than 8 bytes. However, you cannot + // generally assume that you have valid UTF-8 input, so we are going to go + // back from the end counting 8 leading bytes, to give us a good margin. + size_t leading_byte = 0; + size_t margin = size; + for (; margin > 0 && leading_byte < 8; margin--) { + leading_byte += (int8_t(in[margin - 1]) > -65); + } + // If the input is long enough, then we have that margin-1 is the eight last + // leading byte. + const size_t safety_margin = size - margin + 1; // to avoid overruns! + while (pos + 64 + safety_margin <= size) { + simd8x64 input(reinterpret_cast(in + pos)); + if (input.is_ascii()) { + input.store_ascii_as_utf16(utf16_output); + utf16_output += 64; + pos += 64; + } else { + // you might think that a for-loop would work, but under Visual Studio, + // it is not good enough. + static_assert( + (simd8x64::NUM_CHUNKS == 2) || + (simd8x64::NUM_CHUNKS == 4), + "We support either two or four chunks per 64-byte block."); + auto zero = simd8{uint8_t(0)}; + if (simd8x64::NUM_CHUNKS == 2) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + } else if (simd8x64::NUM_CHUNKS == 4) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + this->check_utf8_bytes(input.chunks[2], input.chunks[1]); + this->check_utf8_bytes(input.chunks[3], input.chunks[2]); + } + uint64_t utf8_continuation_mask = input.lt(-65 + 1); + if (utf8_continuation_mask & 1) { + return 0; // error + } + uint64_t utf8_leading_mask = ~utf8_continuation_mask; + uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; + // We process in blocks of up to 12 bytes except possibly + // for fast paths which may process up to 16 bytes. For the + // slow path to work, we should have at least 12 input bytes left. + size_t max_starting_point = (pos + 64) - 12; + // Next loop is going to run at least five times. + while (pos < max_starting_point) { + // Performance note: our ability to compute 'consumed' and + // then shift and recompute is critical. If there is a + // latency of, say, 4 cycles on getting 'consumed', then + // the inner loop might have a total latency of about 6 cycles. + // Yet we process between 6 to 12 inputs bytes, thus we get + // a speed limit between 1 cycle/byte and 0.5 cycle/byte + // for this section of the code. Hence, there is a limit + // to how much we can further increase this latency before + // it seriously harms performance. + size_t consumed = convert_masked_utf8_to_utf16( + in + pos, utf8_end_of_code_point_mask, utf16_output); + pos += consumed; + utf8_end_of_code_point_mask >>= consumed; + } + // At this point there may remain between 0 and 12 bytes in the + // 64-byte block. These bytes will be processed again. So we have an + // 80% efficiency (in the worst case). In practice we expect an + // 85% to 90% efficiency. + } + } + if (errors()) { + return 0; + } + if (pos < size) { + size_t howmany = scalar::utf8_to_utf16::convert( + in + pos, size - pos, utf16_output); + if (howmany == 0) { + return 0; + } + utf16_output += howmany; + } + return utf16_output - start; + } + + template + simdutf_really_inline result convert_with_errors(const char *in, size_t size, + char16_t *utf16_output) { + size_t pos = 0; + char16_t *start{utf16_output}; + // In the worst case, we have the haswell kernel which can cause an overflow + // of 8 bytes when calling convert_masked_utf8_to_utf16. If you skip the + // last 16 bytes, and if the data is valid, then it is entirely safe because + // 16 UTF-8 bytes generate much more than 8 bytes. However, you cannot + // generally assume that you have valid UTF-8 input, so we are going to go + // back from the end counting 8 leading bytes, to give us a good margin. + size_t leading_byte = 0; + size_t margin = size; + for (; margin > 0 && leading_byte < 8; margin--) { + leading_byte += (int8_t(in[margin - 1]) > -65); + } + // If the input is long enough, then we have that margin-1 is the eight last + // leading byte. + const size_t safety_margin = size - margin + 1; // to avoid overruns! + while (pos + 64 + safety_margin <= size) { + simd8x64 input(reinterpret_cast(in + pos)); + if (input.is_ascii()) { + input.store_ascii_as_utf16(utf16_output); + utf16_output += 64; + pos += 64; + } else { + // you might think that a for-loop would work, but under Visual Studio, + // it is not good enough. + static_assert( + (simd8x64::NUM_CHUNKS == 2) || + (simd8x64::NUM_CHUNKS == 4), + "We support either two or four chunks per 64-byte block."); + auto zero = simd8{uint8_t(0)}; + if (simd8x64::NUM_CHUNKS == 2) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + } else if (simd8x64::NUM_CHUNKS == 4) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + this->check_utf8_bytes(input.chunks[2], input.chunks[1]); + this->check_utf8_bytes(input.chunks[3], input.chunks[2]); + } + uint64_t utf8_continuation_mask = input.lt(-65 + 1); + if (errors() || (utf8_continuation_mask & 1)) { + // rewind_and_convert_with_errors will seek a potential error from + // in+pos onward, with the ability to go back up to pos bytes, and + // read size-pos bytes forward. + result res = + scalar::utf8_to_utf16::rewind_and_convert_with_errors( + pos, in + pos, size - pos, utf16_output); + res.count += pos; + return res; + } + uint64_t utf8_leading_mask = ~utf8_continuation_mask; + uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; + // We process in blocks of up to 12 bytes except possibly + // for fast paths which may process up to 16 bytes. For the + // slow path to work, we should have at least 12 input bytes left. + size_t max_starting_point = (pos + 64) - 12; + // Next loop is going to run at least five times. + while (pos < max_starting_point) { + // Performance note: our ability to compute 'consumed' and + // then shift and recompute is critical. If there is a + // latency of, say, 4 cycles on getting 'consumed', then + // the inner loop might have a total latency of about 6 cycles. + // Yet we process between 6 to 12 inputs bytes, thus we get + // a speed limit between 1 cycle/byte and 0.5 cycle/byte + // for this section of the code. Hence, there is a limit + // to how much we can further increase this latency before + // it seriously harms performance. + size_t consumed = convert_masked_utf8_to_utf16( + in + pos, utf8_end_of_code_point_mask, utf16_output); + pos += consumed; + utf8_end_of_code_point_mask >>= consumed; + } + // At this point there may remain between 0 and 12 bytes in the + // 64-byte block. These bytes will be processed again. So we have an + // 80% efficiency (in the worst case). In practice we expect an + // 85% to 90% efficiency. + } + } + if (errors()) { + // rewind_and_convert_with_errors will seek a potential error from in+pos + // onward, with the ability to go back up to pos bytes, and read size-pos + // bytes forward. + result res = + scalar::utf8_to_utf16::rewind_and_convert_with_errors( + pos, in + pos, size - pos, utf16_output); + res.count += pos; + return res; + } + if (pos < size) { + // rewind_and_convert_with_errors will seek a potential error from in+pos + // onward, with the ability to go back up to pos bytes, and read size-pos + // bytes forward. + result res = + scalar::utf8_to_utf16::rewind_and_convert_with_errors( + pos, in + pos, size - pos, utf16_output); + if (res.error) { // In case of error, we want the error position + res.count += pos; + return res; + } else { // In case of success, we want the number of word written + utf16_output += res.count; + } + } + return result(error_code::SUCCESS, utf16_output - start); + } + + simdutf_really_inline bool errors() const { + return this->error.any_bits_set_anywhere(); + } + +}; // struct utf8_checker +} // namespace utf8_to_utf16 +} // unnamed namespace +} // namespace arm64 +} // namespace simdutf +/* end file src/generic/utf8_to_utf16/utf8_to_utf16.h */ +/* begin file src/generic/utf8_to_utf16/valid_utf8_to_utf16.h */ + +namespace simdutf { +namespace arm64 { +namespace { +namespace utf8_to_utf16 { + +using namespace simd; + +template +simdutf_warn_unused size_t convert_valid(const char *input, size_t size, + char16_t *utf16_output) noexcept { + // The implementation is not specific to haswell and should be moved to the + // generic directory. + size_t pos = 0; + char16_t *start{utf16_output}; + const size_t safety_margin = 16; // to avoid overruns! + while (pos + 64 + safety_margin <= size) { + // this loop could be unrolled further. For example, we could process the + // mask far more than 64 bytes. + simd8x64 in(reinterpret_cast(input + pos)); + if (in.is_ascii()) { + in.store_ascii_as_utf16(utf16_output); + utf16_output += 64; + pos += 64; + } else { + // Slow path. We hope that the compiler will recognize that this is a slow + // path. Anything that is not a continuation mask is a 'leading byte', + // that is, the start of a new code point. + uint64_t utf8_continuation_mask = in.lt(-65 + 1); + // -65 is 0b10111111 in two-complement's, so largest possible continuation + // byte + uint64_t utf8_leading_mask = ~utf8_continuation_mask; + // The *start* of code points is not so useful, rather, we want the *end* + // of code points. + uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; + // We process in blocks of up to 12 bytes except possibly + // for fast paths which may process up to 16 bytes. For the + // slow path to work, we should have at least 12 input bytes left. + size_t max_starting_point = (pos + 64) - 12; + // Next loop is going to run at least five times when using solely + // the slow/regular path, and at least four times if there are fast paths. + while (pos < max_starting_point) { + // Performance note: our ability to compute 'consumed' and + // then shift and recompute is critical. If there is a + // latency of, say, 4 cycles on getting 'consumed', then + // the inner loop might have a total latency of about 6 cycles. + // Yet we process between 6 to 12 inputs bytes, thus we get + // a speed limit between 1 cycle/byte and 0.5 cycle/byte + // for this section of the code. Hence, there is a limit + // to how much we can further increase this latency before + // it seriously harms performance. + // + // Thus we may allow convert_masked_utf8_to_utf16 to process + // more bytes at a time under a fast-path mode where 16 bytes + // are consumed at once (e.g., when encountering ASCII). + size_t consumed = convert_masked_utf8_to_utf16( + input + pos, utf8_end_of_code_point_mask, utf16_output); + pos += consumed; + utf8_end_of_code_point_mask >>= consumed; + } + // At this point there may remain between 0 and 12 bytes in the + // 64-byte block. These bytes will be processed again. So we have an + // 80% efficiency (in the worst case). In practice we expect an + // 85% to 90% efficiency. + } + } + utf16_output += scalar::utf8_to_utf16::convert_valid( + input + pos, size - pos, utf16_output); + return utf16_output - start; +} + +} // namespace utf8_to_utf16 +} // unnamed namespace +} // namespace arm64 +} // namespace simdutf +/* end file src/generic/utf8_to_utf16/valid_utf8_to_utf16.h */ +// transcoding from UTF-8 to UTF-32 +/* begin file src/generic/utf8_to_utf32/utf8_to_utf32.h */ + +namespace simdutf { +namespace arm64 { +namespace { +namespace utf8_to_utf32 { +using namespace simd; + +simdutf_really_inline simd8 +check_special_cases(const simd8 input, const simd8 prev1) { + // Bit 0 = Too Short (lead byte/ASCII followed by lead byte/ASCII) + // Bit 1 = Too Long (ASCII followed by continuation) + // Bit 2 = Overlong 3-byte + // Bit 4 = Surrogate + // Bit 5 = Overlong 2-byte + // Bit 7 = Two Continuations + constexpr const uint8_t TOO_SHORT = 1 << 0; // 11______ 0_______ + // 11______ 11______ + constexpr const uint8_t TOO_LONG = 1 << 1; // 0_______ 10______ + constexpr const uint8_t OVERLONG_3 = 1 << 2; // 11100000 100_____ + constexpr const uint8_t SURROGATE = 1 << 4; // 11101101 101_____ + constexpr const uint8_t OVERLONG_2 = 1 << 5; // 1100000_ 10______ + constexpr const uint8_t TWO_CONTS = 1 << 7; // 10______ 10______ + constexpr const uint8_t TOO_LARGE = 1 << 3; // 11110100 1001____ + // 11110100 101_____ + // 11110101 1001____ + // 11110101 101_____ + // 1111011_ 1001____ + // 1111011_ 101_____ + // 11111___ 1001____ + // 11111___ 101_____ + constexpr const uint8_t TOO_LARGE_1000 = 1 << 6; + // 11110101 1000____ + // 1111011_ 1000____ + // 11111___ 1000____ + constexpr const uint8_t OVERLONG_4 = 1 << 6; // 11110000 1000____ + + const simd8 byte_1_high = prev1.shr<4>().lookup_16( + // 0_______ ________ + TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, + TOO_LONG, + // 10______ ________ + TWO_CONTS, TWO_CONTS, TWO_CONTS, TWO_CONTS, + // 1100____ ________ + TOO_SHORT | OVERLONG_2, + // 1101____ ________ + TOO_SHORT, + // 1110____ ________ + TOO_SHORT | OVERLONG_3 | SURROGATE, + // 1111____ ________ + TOO_SHORT | TOO_LARGE | TOO_LARGE_1000 | OVERLONG_4); + constexpr const uint8_t CARRY = + TOO_SHORT | TOO_LONG | TWO_CONTS; // These all have ____ in byte 1 . + const simd8 byte_1_low = + (prev1 & 0x0F) + .lookup_16( + // ____0000 ________ + CARRY | OVERLONG_3 | OVERLONG_2 | OVERLONG_4, + // ____0001 ________ + CARRY | OVERLONG_2, + // ____001_ ________ + CARRY, CARRY, + + // ____0100 ________ + CARRY | TOO_LARGE, + // ____0101 ________ + CARRY | TOO_LARGE | TOO_LARGE_1000, + // ____011_ ________ + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + + // ____1___ ________ + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + // ____1101 ________ + CARRY | TOO_LARGE | TOO_LARGE_1000 | SURROGATE, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000); + const simd8 byte_2_high = input.shr<4>().lookup_16( + // ________ 0_______ + TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, + TOO_SHORT, TOO_SHORT, + + // ________ 1000____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE_1000 | + OVERLONG_4, + // ________ 1001____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE, + // ________ 101_____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, + TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, + + // ________ 11______ + TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT); + return (byte_1_high & byte_1_low & byte_2_high); +} +simdutf_really_inline simd8 +check_multibyte_lengths(const simd8 input, + const simd8 prev_input, + const simd8 sc) { + simd8 prev2 = input.prev<2>(prev_input); + simd8 prev3 = input.prev<3>(prev_input); + simd8 must23 = + simd8(must_be_2_3_continuation(prev2, prev3)); + simd8 must23_80 = must23 & uint8_t(0x80); + return must23_80 ^ sc; +} + +struct validating_transcoder { + // If this is nonzero, there has been a UTF-8 error. + simd8 error; + + validating_transcoder() : error(uint8_t(0)) {} + // + // Check whether the current bytes are valid UTF-8. + // + simdutf_really_inline void check_utf8_bytes(const simd8 input, + const simd8 prev_input) { + // Flip prev1...prev3 so we can easily determine if they are 2+, 3+ or 4+ + // lead bytes (2, 3, 4-byte leads become large positive numbers instead of + // small negative numbers) + simd8 prev1 = input.prev<1>(prev_input); + simd8 sc = check_special_cases(input, prev1); + this->error |= check_multibyte_lengths(input, prev_input, sc); + } + + simdutf_really_inline size_t convert(const char *in, size_t size, + char32_t *utf32_output) { + size_t pos = 0; + char32_t *start{utf32_output}; + // In the worst case, we have the haswell kernel which can cause an overflow + // of 8 words when calling convert_masked_utf8_to_utf32. If you skip the + // last 16 bytes, and if the data is valid, then it is entirely safe because + // 16 UTF-8 bytes generate much more than 8 bytes. However, you cannot + // generally assume that you have valid UTF-8 input, so we are going to go + // back from the end counting 16 leading bytes, to give us a good margin. + size_t leading_byte = 0; + size_t margin = size; + for (; margin > 0 && leading_byte < 8; margin--) { + leading_byte += (int8_t(in[margin - 1]) > -65); + } + // If the input is long enough, then we have that margin-1 is the fourth + // last leading byte. + const size_t safety_margin = size - margin + 1; // to avoid overruns! + while (pos + 64 + safety_margin <= size) { + simd8x64 input(reinterpret_cast(in + pos)); + if (input.is_ascii()) { + input.store_ascii_as_utf32(utf32_output); + utf32_output += 64; + pos += 64; + } else { + // you might think that a for-loop would work, but under Visual Studio, + // it is not good enough. + static_assert( + (simd8x64::NUM_CHUNKS == 2) || + (simd8x64::NUM_CHUNKS == 4), + "We support either two or four chunks per 64-byte block."); + auto zero = simd8{uint8_t(0)}; + if (simd8x64::NUM_CHUNKS == 2) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + } else if (simd8x64::NUM_CHUNKS == 4) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + this->check_utf8_bytes(input.chunks[2], input.chunks[1]); + this->check_utf8_bytes(input.chunks[3], input.chunks[2]); + } + uint64_t utf8_continuation_mask = input.lt(-65 + 1); + if (utf8_continuation_mask & 1) { + return 0; // we have an error + } + uint64_t utf8_leading_mask = ~utf8_continuation_mask; + uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; + // We process in blocks of up to 12 bytes except possibly + // for fast paths which may process up to 16 bytes. For the + // slow path to work, we should have at least 12 input bytes left. + size_t max_starting_point = (pos + 64) - 12; + // Next loop is going to run at least five times. + while (pos < max_starting_point) { + // Performance note: our ability to compute 'consumed' and + // then shift and recompute is critical. If there is a + // latency of, say, 4 cycles on getting 'consumed', then + // the inner loop might have a total latency of about 6 cycles. + // Yet we process between 6 to 12 inputs bytes, thus we get + // a speed limit between 1 cycle/byte and 0.5 cycle/byte + // for this section of the code. Hence, there is a limit + // to how much we can further increase this latency before + // it seriously harms performance. + size_t consumed = convert_masked_utf8_to_utf32( + in + pos, utf8_end_of_code_point_mask, utf32_output); + pos += consumed; + utf8_end_of_code_point_mask >>= consumed; + } + // At this point there may remain between 0 and 12 bytes in the + // 64-byte block. These bytes will be processed again. So we have an + // 80% efficiency (in the worst case). In practice we expect an + // 85% to 90% efficiency. + } + } + if (errors()) { + return 0; + } + if (pos < size) { + size_t howmany = + scalar::utf8_to_utf32::convert(in + pos, size - pos, utf32_output); + if (howmany == 0) { + return 0; + } + utf32_output += howmany; + } + return utf32_output - start; + } + + simdutf_really_inline result convert_with_errors(const char *in, size_t size, + char32_t *utf32_output) { + size_t pos = 0; + char32_t *start{utf32_output}; + // In the worst case, we have the haswell kernel which can cause an overflow + // of 8 bytes when calling convert_masked_utf8_to_utf32. If you skip the + // last 16 bytes, and if the data is valid, then it is entirely safe because + // 16 UTF-8 bytes generate much more than 8 bytes. However, you cannot + // generally assume that you have valid UTF-8 input, so we are going to go + // back from the end counting 8 leading bytes, to give us a good margin. + size_t leading_byte = 0; + size_t margin = size; + for (; margin > 0 && leading_byte < 8; margin--) { + leading_byte += (int8_t(in[margin - 1]) > -65); + } + // If the input is long enough, then we have that margin-1 is the fourth + // last leading byte. + const size_t safety_margin = size - margin + 1; // to avoid overruns! + while (pos + 64 + safety_margin <= size) { + simd8x64 input(reinterpret_cast(in + pos)); + if (input.is_ascii()) { + input.store_ascii_as_utf32(utf32_output); + utf32_output += 64; + pos += 64; + } else { + // you might think that a for-loop would work, but under Visual Studio, + // it is not good enough. + static_assert( + (simd8x64::NUM_CHUNKS == 2) || + (simd8x64::NUM_CHUNKS == 4), + "We support either two or four chunks per 64-byte block."); + auto zero = simd8{uint8_t(0)}; + if (simd8x64::NUM_CHUNKS == 2) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + } else if (simd8x64::NUM_CHUNKS == 4) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + this->check_utf8_bytes(input.chunks[2], input.chunks[1]); + this->check_utf8_bytes(input.chunks[3], input.chunks[2]); + } + uint64_t utf8_continuation_mask = input.lt(-65 + 1); + if (errors() || (utf8_continuation_mask & 1)) { + result res = scalar::utf8_to_utf32::rewind_and_convert_with_errors( + pos, in + pos, size - pos, utf32_output); + res.count += pos; + return res; + } + uint64_t utf8_leading_mask = ~utf8_continuation_mask; + uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; + // We process in blocks of up to 12 bytes except possibly + // for fast paths which may process up to 16 bytes. For the + // slow path to work, we should have at least 12 input bytes left. + size_t max_starting_point = (pos + 64) - 12; + // Next loop is going to run at least five times. + while (pos < max_starting_point) { + // Performance note: our ability to compute 'consumed' and + // then shift and recompute is critical. If there is a + // latency of, say, 4 cycles on getting 'consumed', then + // the inner loop might have a total latency of about 6 cycles. + // Yet we process between 6 to 12 inputs bytes, thus we get + // a speed limit between 1 cycle/byte and 0.5 cycle/byte + // for this section of the code. Hence, there is a limit + // to how much we can further increase this latency before + // it seriously harms performance. + size_t consumed = convert_masked_utf8_to_utf32( + in + pos, utf8_end_of_code_point_mask, utf32_output); + pos += consumed; + utf8_end_of_code_point_mask >>= consumed; + } + // At this point there may remain between 0 and 12 bytes in the + // 64-byte block. These bytes will be processed again. So we have an + // 80% efficiency (in the worst case). In practice we expect an + // 85% to 90% efficiency. + } + } + if (errors()) { + result res = scalar::utf8_to_utf32::rewind_and_convert_with_errors( + pos, in + pos, size - pos, utf32_output); + res.count += pos; + return res; + } + if (pos < size) { + result res = scalar::utf8_to_utf32::rewind_and_convert_with_errors( + pos, in + pos, size - pos, utf32_output); + if (res.error) { // In case of error, we want the error position + res.count += pos; + return res; + } else { // In case of success, we want the number of word written + utf32_output += res.count; + } + } + return result(error_code::SUCCESS, utf32_output - start); + } + + simdutf_really_inline bool errors() const { + return this->error.any_bits_set_anywhere(); + } + +}; // struct utf8_checker +} // namespace utf8_to_utf32 +} // unnamed namespace +} // namespace arm64 +} // namespace simdutf +/* end file src/generic/utf8_to_utf32/utf8_to_utf32.h */ +/* begin file src/generic/utf8_to_utf32/valid_utf8_to_utf32.h */ + +namespace simdutf { +namespace arm64 { +namespace { +namespace utf8_to_utf32 { + +using namespace simd; + +simdutf_warn_unused size_t convert_valid(const char *input, size_t size, + char32_t *utf32_output) noexcept { + size_t pos = 0; + char32_t *start{utf32_output}; + const size_t safety_margin = 16; // to avoid overruns! + while (pos + 64 + safety_margin <= size) { + simd8x64 in(reinterpret_cast(input + pos)); + if (in.is_ascii()) { + in.store_ascii_as_utf32(utf32_output); + utf32_output += 64; + pos += 64; + } else { + // -65 is 0b10111111 in two-complement's, so largest possible continuation + // byte + uint64_t utf8_continuation_mask = in.lt(-65 + 1); + uint64_t utf8_leading_mask = ~utf8_continuation_mask; + uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; + size_t max_starting_point = (pos + 64) - 12; + while (pos < max_starting_point) { + size_t consumed = convert_masked_utf8_to_utf32( + input + pos, utf8_end_of_code_point_mask, utf32_output); + pos += consumed; + utf8_end_of_code_point_mask >>= consumed; + } + } + } + utf32_output += scalar::utf8_to_utf32::convert_valid(input + pos, size - pos, + utf32_output); + return utf32_output - start; +} + +} // namespace utf8_to_utf32 +} // unnamed namespace +} // namespace arm64 +} // namespace simdutf +/* end file src/generic/utf8_to_utf32/valid_utf8_to_utf32.h */ +// other functions +/* begin file src/generic/utf16.h */ +namespace simdutf { +namespace arm64 { +namespace { +namespace utf16 { + +template +simdutf_really_inline size_t count_code_points(const char16_t *in, + size_t size) { + size_t pos = 0; + size_t count = 0; + for (; pos < size / 32 * 32; pos += 32) { + simd16x32 input(reinterpret_cast(in + pos)); + if (!match_system(big_endian)) { + input.swap_bytes(); + } + uint64_t not_pair = input.not_in_range(0xDC00, 0xDFFF); + count += count_ones(not_pair) / 2; + } + return count + + scalar::utf16::count_code_points(in + pos, size - pos); +} + +template +simdutf_really_inline size_t utf8_length_from_utf16(const char16_t *in, + size_t size) { + size_t pos = 0; + size_t count = 0; + // This algorithm could no doubt be improved! + for (; pos < size / 32 * 32; pos += 32) { + simd16x32 input(reinterpret_cast(in + pos)); + if (!match_system(big_endian)) { + input.swap_bytes(); + } + uint64_t ascii_mask = input.lteq(0x7F); + uint64_t twobyte_mask = input.lteq(0x7FF); + uint64_t not_pair_mask = input.not_in_range(0xD800, 0xDFFF); + + size_t ascii_count = count_ones(ascii_mask) / 2; + size_t twobyte_count = count_ones(twobyte_mask & ~ascii_mask) / 2; + size_t threebyte_count = count_ones(not_pair_mask & ~twobyte_mask) / 2; + size_t fourbyte_count = 32 - count_ones(not_pair_mask) / 2; + count += 2 * fourbyte_count + 3 * threebyte_count + 2 * twobyte_count + + ascii_count; + } + return count + scalar::utf16::utf8_length_from_utf16(in + pos, + size - pos); +} + +template +simdutf_really_inline size_t utf32_length_from_utf16(const char16_t *in, + size_t size) { + return count_code_points(in, size); +} + +simdutf_really_inline void +change_endianness_utf16(const char16_t *in, size_t size, char16_t *output) { + size_t pos = 0; + + while (pos < size / 32 * 32) { + simd16x32 input(reinterpret_cast(in + pos)); + input.swap_bytes(); + input.store(reinterpret_cast(output)); + pos += 32; + output += 32; + } + + scalar::utf16::change_endianness_utf16(in + pos, size - pos, output); +} + +} // namespace utf16 +} // unnamed namespace +} // namespace arm64 +} // namespace simdutf +/* end file src/generic/utf16.h */ +/* begin file src/generic/utf8.h */ + +namespace simdutf { +namespace arm64 { +namespace { +namespace utf8 { + +using namespace simd; + +simdutf_really_inline size_t count_code_points(const char *in, size_t size) { + size_t pos = 0; + size_t count = 0; + for (; pos + 64 <= size; pos += 64) { + simd8x64 input(reinterpret_cast(in + pos)); + uint64_t utf8_continuation_mask = input.gt(-65); + count += count_ones(utf8_continuation_mask); + } + return count + scalar::utf8::count_code_points(in + pos, size - pos); +} + +simdutf_really_inline size_t utf16_length_from_utf8(const char *in, + size_t size) { + size_t pos = 0; + size_t count = 0; + // This algorithm could no doubt be improved! + for (; pos + 64 <= size; pos += 64) { + simd8x64 input(reinterpret_cast(in + pos)); + uint64_t utf8_continuation_mask = input.lt(-65 + 1); + // We count one word for anything that is not a continuation (so + // leading bytes). + count += 64 - count_ones(utf8_continuation_mask); + int64_t utf8_4byte = input.gteq_unsigned(240); + count += count_ones(utf8_4byte); + } + return count + scalar::utf8::utf16_length_from_utf8(in + pos, size - pos); +} +} // namespace utf8 +} // unnamed namespace +} // namespace arm64 +} // namespace simdutf +/* end file src/generic/utf8.h */ +// transcoding from UTF-8 to Latin 1 +/* begin file src/generic/utf8_to_latin1/utf8_to_latin1.h */ + +namespace simdutf { +namespace arm64 { +namespace { +namespace utf8_to_latin1 { +using namespace simd; + +simdutf_really_inline simd8 +check_special_cases(const simd8 input, const simd8 prev1) { + // For UTF-8 to Latin 1, we can allow any ASCII character, and any + // continuation byte, but the non-ASCII leading bytes must be 0b11000011 or + // 0b11000010 and nothing else. + // + // Bit 0 = Too Short (lead byte/ASCII followed by lead byte/ASCII) + // Bit 1 = Too Long (ASCII followed by continuation) + // Bit 2 = Overlong 3-byte + // Bit 4 = Surrogate + // Bit 5 = Overlong 2-byte + // Bit 7 = Two Continuations + constexpr const uint8_t TOO_SHORT = 1 << 0; // 11______ 0_______ + // 11______ 11______ + constexpr const uint8_t TOO_LONG = 1 << 1; // 0_______ 10______ + constexpr const uint8_t OVERLONG_3 = 1 << 2; // 11100000 100_____ + constexpr const uint8_t SURROGATE = 1 << 4; // 11101101 101_____ + constexpr const uint8_t OVERLONG_2 = 1 << 5; // 1100000_ 10______ + constexpr const uint8_t TWO_CONTS = 1 << 7; // 10______ 10______ + constexpr const uint8_t TOO_LARGE = 1 << 3; // 11110100 1001____ + // 11110100 101_____ + // 11110101 1001____ + // 11110101 101_____ + // 1111011_ 1001____ + // 1111011_ 101_____ + // 11111___ 1001____ + // 11111___ 101_____ + constexpr const uint8_t TOO_LARGE_1000 = 1 << 6; + // 11110101 1000____ + // 1111011_ 1000____ + // 11111___ 1000____ + constexpr const uint8_t OVERLONG_4 = 1 << 6; // 11110000 1000____ + constexpr const uint8_t FORBIDDEN = 0xff; + + const simd8 byte_1_high = prev1.shr<4>().lookup_16( + // 0_______ ________ + TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, + TOO_LONG, + // 10______ ________ + TWO_CONTS, TWO_CONTS, TWO_CONTS, TWO_CONTS, + // 1100____ ________ + TOO_SHORT | OVERLONG_2, + // 1101____ ________ + FORBIDDEN, + // 1110____ ________ + FORBIDDEN, + // 1111____ ________ + FORBIDDEN); + constexpr const uint8_t CARRY = + TOO_SHORT | TOO_LONG | TWO_CONTS; // These all have ____ in byte 1 . + const simd8 byte_1_low = + (prev1 & 0x0F) + .lookup_16( + // ____0000 ________ + CARRY | OVERLONG_3 | OVERLONG_2 | OVERLONG_4, + // ____0001 ________ + CARRY | OVERLONG_2, + // ____001_ ________ + CARRY, CARRY, + + // ____0100 ________ + FORBIDDEN, + // ____0101 ________ + FORBIDDEN, + // ____011_ ________ + FORBIDDEN, FORBIDDEN, + + // ____1___ ________ + FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN, + // ____1101 ________ + FORBIDDEN, FORBIDDEN, FORBIDDEN); + const simd8 byte_2_high = input.shr<4>().lookup_16( + // ________ 0_______ + TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, + TOO_SHORT, TOO_SHORT, + + // ________ 1000____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE_1000 | + OVERLONG_4, + // ________ 1001____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE, + // ________ 101_____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, + TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, + + // ________ 11______ + TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT); + return (byte_1_high & byte_1_low & byte_2_high); +} + +struct validating_transcoder { + // If this is nonzero, there has been a UTF-8 error. + simd8 error; + + validating_transcoder() : error(uint8_t(0)) {} + // + // Check whether the current bytes are valid UTF-8. + // + simdutf_really_inline void check_utf8_bytes(const simd8 input, + const simd8 prev_input) { + // Flip prev1...prev3 so we can easily determine if they are 2+, 3+ or 4+ + // lead bytes (2, 3, 4-byte leads become large positive numbers instead of + // small negative numbers) + simd8 prev1 = input.prev<1>(prev_input); + this->error |= check_special_cases(input, prev1); + } + + simdutf_really_inline size_t convert(const char *in, size_t size, + char *latin1_output) { + size_t pos = 0; + char *start{latin1_output}; + // In the worst case, we have the haswell kernel which can cause an overflow + // of 8 bytes when calling convert_masked_utf8_to_latin1. If you skip the + // last 16 bytes, and if the data is valid, then it is entirely safe because + // 16 UTF-8 bytes generate much more than 8 bytes. However, you cannot + // generally assume that you have valid UTF-8 input, so we are going to go + // back from the end counting 16 leading bytes, to give us a good margin. + size_t leading_byte = 0; + size_t margin = size; + for (; margin > 0 && leading_byte < 16; margin--) { + leading_byte += (int8_t(in[margin - 1]) > + -65); // twos complement of -65 is 1011 1111 ... + } + // If the input is long enough, then we have that margin-1 is the eight last + // leading byte. + const size_t safety_margin = size - margin + 1; // to avoid overruns! + while (pos + 64 + safety_margin <= size) { + simd8x64 input(reinterpret_cast(in + pos)); + if (input.is_ascii()) { + input.store((int8_t *)latin1_output); + latin1_output += 64; + pos += 64; + } else { + // you might think that a for-loop would work, but under Visual Studio, + // it is not good enough. + static_assert( + (simd8x64::NUM_CHUNKS == 2) || + (simd8x64::NUM_CHUNKS == 4), + "We support either two or four chunks per 64-byte block."); + auto zero = simd8{uint8_t(0)}; + if (simd8x64::NUM_CHUNKS == 2) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + } else if (simd8x64::NUM_CHUNKS == 4) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + this->check_utf8_bytes(input.chunks[2], input.chunks[1]); + this->check_utf8_bytes(input.chunks[3], input.chunks[2]); + } + uint64_t utf8_continuation_mask = + input.lt(-65 + 1); // -64 is 1100 0000 in twos complement. Note: in + // this case, we also have ASCII to account for. + if (utf8_continuation_mask & 1) { + return 0; // error + } + uint64_t utf8_leading_mask = ~utf8_continuation_mask; + uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; + // We process in blocks of up to 12 bytes except possibly + // for fast paths which may process up to 16 bytes. For the + // slow path to work, we should have at least 12 input bytes left. + size_t max_starting_point = (pos + 64) - 12; + // Next loop is going to run at least five times. + while (pos < max_starting_point) { + // Performance note: our ability to compute 'consumed' and + // then shift and recompute is critical. If there is a + // latency of, say, 4 cycles on getting 'consumed', then + // the inner loop might have a total latency of about 6 cycles. + // Yet we process between 6 to 12 inputs bytes, thus we get + // a speed limit between 1 cycle/byte and 0.5 cycle/byte + // for this section of the code. Hence, there is a limit + // to how much we can further increase this latency before + // it seriously harms performance. + size_t consumed = convert_masked_utf8_to_latin1( + in + pos, utf8_end_of_code_point_mask, latin1_output); + pos += consumed; + utf8_end_of_code_point_mask >>= consumed; + } + // At this point there may remain between 0 and 12 bytes in the + // 64-byte block. These bytes will be processed again. So we have an + // 80% efficiency (in the worst case). In practice we expect an + // 85% to 90% efficiency. + } + } + if (errors()) { + return 0; + } + if (pos < size) { + size_t howmany = + scalar::utf8_to_latin1::convert(in + pos, size - pos, latin1_output); + if (howmany == 0) { + return 0; + } + latin1_output += howmany; + } + return latin1_output - start; + } + + simdutf_really_inline result convert_with_errors(const char *in, size_t size, + char *latin1_output) { + size_t pos = 0; + char *start{latin1_output}; + // In the worst case, we have the haswell kernel which can cause an overflow + // of 8 bytes when calling convert_masked_utf8_to_latin1. If you skip the + // last 16 bytes, and if the data is valid, then it is entirely safe because + // 16 UTF-8 bytes generate much more than 8 bytes. However, you cannot + // generally assume that you have valid UTF-8 input, so we are going to go + // back from the end counting 8 leading bytes, to give us a good margin. + size_t leading_byte = 0; + size_t margin = size; + for (; margin > 0 && leading_byte < 8; margin--) { + leading_byte += (int8_t(in[margin - 1]) > -65); + } + // If the input is long enough, then we have that margin-1 is the eight last + // leading byte. + const size_t safety_margin = size - margin + 1; // to avoid overruns! + while (pos + 64 + safety_margin <= size) { + simd8x64 input(reinterpret_cast(in + pos)); + if (input.is_ascii()) { + input.store((int8_t *)latin1_output); + latin1_output += 64; + pos += 64; + } else { + // you might think that a for-loop would work, but under Visual Studio, + // it is not good enough. + static_assert( + (simd8x64::NUM_CHUNKS == 2) || + (simd8x64::NUM_CHUNKS == 4), + "We support either two or four chunks per 64-byte block."); + auto zero = simd8{uint8_t(0)}; + if (simd8x64::NUM_CHUNKS == 2) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + } else if (simd8x64::NUM_CHUNKS == 4) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + this->check_utf8_bytes(input.chunks[2], input.chunks[1]); + this->check_utf8_bytes(input.chunks[3], input.chunks[2]); + } + if (errors()) { + // rewind_and_convert_with_errors will seek a potential error from + // in+pos onward, with the ability to go back up to pos bytes, and + // read size-pos bytes forward. + result res = scalar::utf8_to_latin1::rewind_and_convert_with_errors( + pos, in + pos, size - pos, latin1_output); + res.count += pos; + return res; + } + uint64_t utf8_continuation_mask = input.lt(-65 + 1); + uint64_t utf8_leading_mask = ~utf8_continuation_mask; + uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; + // We process in blocks of up to 12 bytes except possibly + // for fast paths which may process up to 16 bytes. For the + // slow path to work, we should have at least 12 input bytes left. + size_t max_starting_point = (pos + 64) - 12; + // Next loop is going to run at least five times. + while (pos < max_starting_point) { + // Performance note: our ability to compute 'consumed' and + // then shift and recompute is critical. If there is a + // latency of, say, 4 cycles on getting 'consumed', then + // the inner loop might have a total latency of about 6 cycles. + // Yet we process between 6 to 12 inputs bytes, thus we get + // a speed limit between 1 cycle/byte and 0.5 cycle/byte + // for this section of the code. Hence, there is a limit + // to how much we can further increase this latency before + // it seriously harms performance. + size_t consumed = convert_masked_utf8_to_latin1( + in + pos, utf8_end_of_code_point_mask, latin1_output); + pos += consumed; + utf8_end_of_code_point_mask >>= consumed; + } + // At this point there may remain between 0 and 12 bytes in the + // 64-byte block. These bytes will be processed again. So we have an + // 80% efficiency (in the worst case). In practice we expect an + // 85% to 90% efficiency. + } + } + if (errors()) { + // rewind_and_convert_with_errors will seek a potential error from in+pos + // onward, with the ability to go back up to pos bytes, and read size-pos + // bytes forward. + result res = scalar::utf8_to_latin1::rewind_and_convert_with_errors( + pos, in + pos, size - pos, latin1_output); + res.count += pos; + return res; + } + if (pos < size) { + // rewind_and_convert_with_errors will seek a potential error from in+pos + // onward, with the ability to go back up to pos bytes, and read size-pos + // bytes forward. + result res = scalar::utf8_to_latin1::rewind_and_convert_with_errors( + pos, in + pos, size - pos, latin1_output); + if (res.error) { // In case of error, we want the error position + res.count += pos; + return res; + } else { // In case of success, we want the number of word written + latin1_output += res.count; + } + } + return result(error_code::SUCCESS, latin1_output - start); + } + + simdutf_really_inline bool errors() const { + return this->error.any_bits_set_anywhere(); + } + +}; // struct utf8_checker +} // namespace utf8_to_latin1 } // unnamed namespace +} // namespace arm64 +} // namespace simdutf +/* end file src/generic/utf8_to_latin1/utf8_to_latin1.h */ +/* begin file src/generic/utf8_to_latin1/valid_utf8_to_latin1.h */ + +namespace simdutf { +namespace arm64 { +namespace { +namespace utf8_to_latin1 { +using namespace simd; + +simdutf_really_inline size_t convert_valid(const char *in, size_t size, + char *latin1_output) { + size_t pos = 0; + char *start{latin1_output}; + // In the worst case, we have the haswell kernel which can cause an overflow + // of 8 bytes when calling convert_masked_utf8_to_latin1. If you skip the last + // 16 bytes, and if the data is valid, then it is entirely safe because 16 + // UTF-8 bytes generate much more than 8 bytes. However, you cannot generally + // assume that you have valid UTF-8 input, so we are going to go back from the + // end counting 8 leading bytes, to give us a good margin. + size_t leading_byte = 0; + size_t margin = size; + for (; margin > 0 && leading_byte < 8; margin--) { + leading_byte += (int8_t(in[margin - 1]) > + -65); // twos complement of -65 is 1011 1111 ... + } + // If the input is long enough, then we have that margin-1 is the eight last + // leading byte. + const size_t safety_margin = size - margin + 1; // to avoid overruns! + while (pos + 64 + safety_margin <= size) { + simd8x64 input(reinterpret_cast(in + pos)); + if (input.is_ascii()) { + input.store((int8_t *)latin1_output); + latin1_output += 64; + pos += 64; + } else { + // you might think that a for-loop would work, but under Visual Studio, it + // is not good enough. + uint64_t utf8_continuation_mask = + input.lt(-65 + 1); // -64 is 1100 0000 in twos complement. Note: in + // this case, we also have ASCII to account for. + uint64_t utf8_leading_mask = ~utf8_continuation_mask; + uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; + // We process in blocks of up to 12 bytes except possibly + // for fast paths which may process up to 16 bytes. For the + // slow path to work, we should have at least 12 input bytes left. + size_t max_starting_point = (pos + 64) - 12; + // Next loop is going to run at least five times. + while (pos < max_starting_point) { + // Performance note: our ability to compute 'consumed' and + // then shift and recompute is critical. If there is a + // latency of, say, 4 cycles on getting 'consumed', then + // the inner loop might have a total latency of about 6 cycles. + // Yet we process between 6 to 12 inputs bytes, thus we get + // a speed limit between 1 cycle/byte and 0.5 cycle/byte + // for this section of the code. Hence, there is a limit + // to how much we can further increase this latency before + // it seriously harms performance. + size_t consumed = convert_masked_utf8_to_latin1( + in + pos, utf8_end_of_code_point_mask, latin1_output); + pos += consumed; + utf8_end_of_code_point_mask >>= consumed; + } + // At this point there may remain between 0 and 12 bytes in the + // 64-byte block. These bytes will be processed again. So we have an + // 80% efficiency (in the worst case). In practice we expect an + // 85% to 90% efficiency. + } + } + if (pos < size) { + size_t howmany = scalar::utf8_to_latin1::convert_valid(in + pos, size - pos, + latin1_output); + latin1_output += howmany; + } + return latin1_output - start; +} + +} // namespace utf8_to_latin1 +} // namespace +} // namespace arm64 +} // namespace simdutf + // namespace simdutf +/* end file src/generic/utf8_to_latin1/valid_utf8_to_latin1.h */ + +// placeholder scalars + +// +// Implementation-specific overrides +// +namespace simdutf { +namespace arm64 { + +simdutf_warn_unused int +implementation::detect_encodings(const char *input, + size_t length) const noexcept { + // If there is a BOM, then we trust it. + auto bom_encoding = simdutf::BOM::check_bom(input, length); + if (bom_encoding != encoding_type::unspecified) { + return bom_encoding; + } + // todo: reimplement as a one-pass algorithm. + int out = 0; + if (validate_utf8(input, length)) { + out |= encoding_type::UTF8; + } + if ((length % 2) == 0) { + if (validate_utf16le(reinterpret_cast(input), + length / 2)) { + out |= encoding_type::UTF16_LE; + } + } + if ((length % 4) == 0) { + if (validate_utf32(reinterpret_cast(input), length / 4)) { + out |= encoding_type::UTF32_LE; + } + } + return out; +} + +simdutf_warn_unused bool +implementation::validate_utf8(const char *buf, size_t len) const noexcept { + return arm64::utf8_validation::generic_validate_utf8(buf, len); +} + +simdutf_warn_unused result implementation::validate_utf8_with_errors( + const char *buf, size_t len) const noexcept { + return arm64::utf8_validation::generic_validate_utf8_with_errors(buf, len); +} + +simdutf_warn_unused bool +implementation::validate_ascii(const char *buf, size_t len) const noexcept { + return arm64::utf8_validation::generic_validate_ascii(buf, len); +} + +simdutf_warn_unused result implementation::validate_ascii_with_errors( + const char *buf, size_t len) const noexcept { + return arm64::utf8_validation::generic_validate_ascii_with_errors(buf, len); +} + +simdutf_warn_unused bool +implementation::validate_utf16le(const char16_t *buf, + size_t len) const noexcept { + if (simdutf_unlikely(len == 0)) { + // empty input is valid. protected the implementation from nullptr. + return true; + } + const char16_t *tail = arm_validate_utf16(buf, len); + if (tail) { + return scalar::utf16::validate(tail, + len - (tail - buf)); + } else { + return false; + } +} + +simdutf_warn_unused bool +implementation::validate_utf16be(const char16_t *buf, + size_t len) const noexcept { + if (simdutf_unlikely(len == 0)) { + // empty input is valid. protected the implementation from nullptr. + return true; + } + const char16_t *tail = arm_validate_utf16(buf, len); + if (tail) { + return scalar::utf16::validate(tail, len - (tail - buf)); + } else { + return false; + } +} + +simdutf_warn_unused result implementation::validate_utf16le_with_errors( + const char16_t *buf, size_t len) const noexcept { + if (simdutf_unlikely(len == 0)) { + return result(error_code::SUCCESS, 0); + } + result res = arm_validate_utf16_with_errors(buf, len); + if (res.count != len) { + result scalar_res = scalar::utf16::validate_with_errors( + buf + res.count, len - res.count); + return result(scalar_res.error, res.count + scalar_res.count); + } else { + return res; + } +} + +simdutf_warn_unused result implementation::validate_utf16be_with_errors( + const char16_t *buf, size_t len) const noexcept { + if (simdutf_unlikely(len == 0)) { + return result(error_code::SUCCESS, 0); + } + result res = arm_validate_utf16_with_errors(buf, len); + if (res.count != len) { + result scalar_res = scalar::utf16::validate_with_errors( + buf + res.count, len - res.count); + return result(scalar_res.error, res.count + scalar_res.count); + } else { + return res; + } +} + +simdutf_warn_unused bool +implementation::validate_utf32(const char32_t *buf, size_t len) const noexcept { + if (simdutf_unlikely(len == 0)) { + // empty input is valid. protected the implementation from nullptr. + return true; + } + const char32_t *tail = arm_validate_utf32le(buf, len); + if (tail) { + return scalar::utf32::validate(tail, len - (tail - buf)); + } else { + return false; + } +} + +simdutf_warn_unused result implementation::validate_utf32_with_errors( + const char32_t *buf, size_t len) const noexcept { + if (simdutf_unlikely(len == 0)) { + return result(error_code::SUCCESS, 0); + } + result res = arm_validate_utf32le_with_errors(buf, len); + if (res.count != len) { + result scalar_res = + scalar::utf32::validate_with_errors(buf + res.count, len - res.count); + return result(scalar_res.error, res.count + scalar_res.count); + } else { + return res; + } +} + +simdutf_warn_unused size_t implementation::convert_latin1_to_utf8( + const char *buf, size_t len, char *utf8_output) const noexcept { + std::pair ret = + arm_convert_latin1_to_utf8(buf, len, utf8_output); + size_t converted_chars = ret.second - utf8_output; + + if (ret.first != buf + len) { + const size_t scalar_converted_chars = scalar::latin1_to_utf8::convert( + ret.first, len - (ret.first - buf), ret.second); + converted_chars += scalar_converted_chars; + } + return converted_chars; +} + +simdutf_warn_unused size_t implementation::convert_latin1_to_utf16le( + const char *buf, size_t len, char16_t *utf16_output) const noexcept { + std::pair ret = + arm_convert_latin1_to_utf16(buf, len, utf16_output); + size_t converted_chars = ret.second - utf16_output; + if (ret.first != buf + len) { + const size_t scalar_converted_chars = + scalar::latin1_to_utf16::convert( + ret.first, len - (ret.first - buf), ret.second); + converted_chars += scalar_converted_chars; + } + return converted_chars; +} + +simdutf_warn_unused size_t implementation::convert_latin1_to_utf16be( + const char *buf, size_t len, char16_t *utf16_output) const noexcept { + std::pair ret = + arm_convert_latin1_to_utf16(buf, len, utf16_output); + size_t converted_chars = ret.second - utf16_output; + if (ret.first != buf + len) { + const size_t scalar_converted_chars = + scalar::latin1_to_utf16::convert( + ret.first, len - (ret.first - buf), ret.second); + converted_chars += scalar_converted_chars; + } + return converted_chars; +} + +simdutf_warn_unused size_t implementation::convert_latin1_to_utf32( + const char *buf, size_t len, char32_t *utf32_output) const noexcept { + std::pair ret = + arm_convert_latin1_to_utf32(buf, len, utf32_output); + size_t converted_chars = ret.second - utf32_output; + if (ret.first != buf + len) { + const size_t scalar_converted_chars = scalar::latin1_to_utf32::convert( + ret.first, len - (ret.first - buf), ret.second); + converted_chars += scalar_converted_chars; + } + return converted_chars; +} + +simdutf_warn_unused size_t implementation::convert_utf8_to_latin1( + const char *buf, size_t len, char *latin1_output) const noexcept { + utf8_to_latin1::validating_transcoder converter; + return converter.convert(buf, len, latin1_output); +} + +simdutf_warn_unused result implementation::convert_utf8_to_latin1_with_errors( + const char *buf, size_t len, char *latin1_output) const noexcept { + utf8_to_latin1::validating_transcoder converter; + return converter.convert_with_errors(buf, len, latin1_output); +} + +simdutf_warn_unused size_t implementation::convert_valid_utf8_to_latin1( + const char *buf, size_t len, char *latin1_output) const noexcept { + return arm64::utf8_to_latin1::convert_valid(buf, len, latin1_output); +} + +simdutf_warn_unused size_t implementation::convert_utf8_to_utf16le( + const char *buf, size_t len, char16_t *utf16_output) const noexcept { + utf8_to_utf16::validating_transcoder converter; + return converter.convert(buf, len, utf16_output); +} + +simdutf_warn_unused size_t implementation::convert_utf8_to_utf16be( + const char *buf, size_t len, char16_t *utf16_output) const noexcept { + utf8_to_utf16::validating_transcoder converter; + return converter.convert(buf, len, utf16_output); +} + +simdutf_warn_unused result implementation::convert_utf8_to_utf16le_with_errors( + const char *buf, size_t len, char16_t *utf16_output) const noexcept { + utf8_to_utf16::validating_transcoder converter; + return converter.convert_with_errors(buf, len, + utf16_output); +} + +simdutf_warn_unused result implementation::convert_utf8_to_utf16be_with_errors( + const char *buf, size_t len, char16_t *utf16_output) const noexcept { + utf8_to_utf16::validating_transcoder converter; + return converter.convert_with_errors(buf, len, utf16_output); +} + +simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf16le( + const char *input, size_t size, char16_t *utf16_output) const noexcept { + return utf8_to_utf16::convert_valid(input, size, + utf16_output); +} + +simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf16be( + const char *input, size_t size, char16_t *utf16_output) const noexcept { + return utf8_to_utf16::convert_valid(input, size, + utf16_output); +} + +simdutf_warn_unused size_t implementation::convert_utf8_to_utf32( + const char *buf, size_t len, char32_t *utf32_output) const noexcept { + utf8_to_utf32::validating_transcoder converter; + return converter.convert(buf, len, utf32_output); +} + +simdutf_warn_unused result implementation::convert_utf8_to_utf32_with_errors( + const char *buf, size_t len, char32_t *utf32_output) const noexcept { + utf8_to_utf32::validating_transcoder converter; + return converter.convert_with_errors(buf, len, utf32_output); +} + +simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf32( + const char *input, size_t size, char32_t *utf32_output) const noexcept { + return utf8_to_utf32::convert_valid(input, size, utf32_output); +} + +simdutf_warn_unused size_t implementation::convert_utf16le_to_latin1( + const char16_t *buf, size_t len, char *latin1_output) const noexcept { + std::pair ret = + arm_convert_utf16_to_latin1(buf, len, latin1_output); + if (ret.first == nullptr) { + return 0; + } + size_t saved_bytes = ret.second - latin1_output; + + if (ret.first != buf + len) { + const size_t scalar_saved_bytes = + scalar::utf16_to_latin1::convert( + ret.first, len - (ret.first - buf), ret.second); + if (scalar_saved_bytes == 0) { + return 0; + } + saved_bytes += scalar_saved_bytes; + } + return saved_bytes; +} + +simdutf_warn_unused size_t implementation::convert_utf16be_to_latin1( + const char16_t *buf, size_t len, char *latin1_output) const noexcept { + std::pair ret = + arm_convert_utf16_to_latin1(buf, len, latin1_output); + if (ret.first == nullptr) { + return 0; + } + size_t saved_bytes = ret.second - latin1_output; + + if (ret.first != buf + len) { + const size_t scalar_saved_bytes = + scalar::utf16_to_latin1::convert( + ret.first, len - (ret.first - buf), ret.second); + if (scalar_saved_bytes == 0) { + return 0; + } + saved_bytes += scalar_saved_bytes; + } + return saved_bytes; +} + +simdutf_warn_unused result +implementation::convert_utf16le_to_latin1_with_errors( + const char16_t *buf, size_t len, char *latin1_output) const noexcept { + std::pair ret = + arm_convert_utf16_to_latin1_with_errors( + buf, len, latin1_output); + if (ret.first.error) { + return ret.first; + } // Can return directly since scalar fallback already found correct + // ret.first.count + if (ret.first.count != len) { // All good so far, but not finished + result scalar_res = + scalar::utf16_to_latin1::convert_with_errors( + buf + ret.first.count, len - ret.first.count, ret.second); + if (scalar_res.error) { + scalar_res.count += ret.first.count; + return scalar_res; + } else { + ret.second += scalar_res.count; + } + } + ret.first.count = + ret.second - + latin1_output; // Set count to the number of 8-bit code units written + return ret.first; +} + +simdutf_warn_unused result +implementation::convert_utf16be_to_latin1_with_errors( + const char16_t *buf, size_t len, char *latin1_output) const noexcept { + std::pair ret = + arm_convert_utf16_to_latin1_with_errors(buf, len, + latin1_output); + if (ret.first.error) { + return ret.first; + } // Can return directly since scalar fallback already found correct + // ret.first.count + if (ret.first.count != len) { // All good so far, but not finished + result scalar_res = + scalar::utf16_to_latin1::convert_with_errors( + buf + ret.first.count, len - ret.first.count, ret.second); + if (scalar_res.error) { + scalar_res.count += ret.first.count; + return scalar_res; + } else { + ret.second += scalar_res.count; + } + } + ret.first.count = + ret.second - + latin1_output; // Set count to the number of 8-bit code units written + return ret.first; +} + +simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_latin1( + const char16_t *buf, size_t len, char *latin1_output) const noexcept { + // optimization opportunity: implement a custom function. + return convert_utf16be_to_latin1(buf, len, latin1_output); +} + +simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_latin1( + const char16_t *buf, size_t len, char *latin1_output) const noexcept { + // optimization opportunity: implement a custom function. + return convert_utf16le_to_latin1(buf, len, latin1_output); +} + +simdutf_warn_unused size_t implementation::convert_utf16le_to_utf8( + const char16_t *buf, size_t len, char *utf8_output) const noexcept { + std::pair ret = + arm_convert_utf16_to_utf8(buf, len, utf8_output); + if (ret.first == nullptr) { + return 0; + } + size_t saved_bytes = ret.second - utf8_output; + if (ret.first != buf + len) { + const size_t scalar_saved_bytes = + scalar::utf16_to_utf8::convert( + ret.first, len - (ret.first - buf), ret.second); + if (scalar_saved_bytes == 0) { + return 0; + } + saved_bytes += scalar_saved_bytes; + } + return saved_bytes; +} + +simdutf_warn_unused size_t implementation::convert_utf16be_to_utf8( + const char16_t *buf, size_t len, char *utf8_output) const noexcept { + std::pair ret = + arm_convert_utf16_to_utf8(buf, len, utf8_output); + if (ret.first == nullptr) { + return 0; + } + size_t saved_bytes = ret.second - utf8_output; + if (ret.first != buf + len) { + const size_t scalar_saved_bytes = + scalar::utf16_to_utf8::convert( + ret.first, len - (ret.first - buf), ret.second); + if (scalar_saved_bytes == 0) { + return 0; + } + saved_bytes += scalar_saved_bytes; + } + return saved_bytes; +} + +simdutf_warn_unused result implementation::convert_utf16le_to_utf8_with_errors( + const char16_t *buf, size_t len, char *utf8_output) const noexcept { + // ret.first.count is always the position in the buffer, not the number of + // code units written even if finished + std::pair ret = + arm_convert_utf16_to_utf8_with_errors(buf, len, + utf8_output); + if (ret.first.error) { + return ret.first; + } // Can return directly since scalar fallback already found correct + // ret.first.count + if (ret.first.count != len) { // All good so far, but not finished + result scalar_res = + scalar::utf16_to_utf8::convert_with_errors( + buf + ret.first.count, len - ret.first.count, ret.second); + if (scalar_res.error) { + scalar_res.count += ret.first.count; + return scalar_res; + } else { + ret.second += scalar_res.count; + } + } + ret.first.count = + ret.second - + utf8_output; // Set count to the number of 8-bit code units written + return ret.first; +} + +simdutf_warn_unused result implementation::convert_utf16be_to_utf8_with_errors( + const char16_t *buf, size_t len, char *utf8_output) const noexcept { + // ret.first.count is always the position in the buffer, not the number of + // code units written even if finished + std::pair ret = + arm_convert_utf16_to_utf8_with_errors(buf, len, + utf8_output); + if (ret.first.error) { + return ret.first; + } // Can return directly since scalar fallback already found correct + // ret.first.count + if (ret.first.count != len) { // All good so far, but not finished + result scalar_res = + scalar::utf16_to_utf8::convert_with_errors( + buf + ret.first.count, len - ret.first.count, ret.second); + if (scalar_res.error) { + scalar_res.count += ret.first.count; + return scalar_res; + } else { + ret.second += scalar_res.count; + } + } + ret.first.count = + ret.second - + utf8_output; // Set count to the number of 8-bit code units written + return ret.first; +} + +simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_utf8( + const char16_t *buf, size_t len, char *utf8_output) const noexcept { + return convert_utf16le_to_utf8(buf, len, utf8_output); +} + +simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_utf8( + const char16_t *buf, size_t len, char *utf8_output) const noexcept { + return convert_utf16be_to_utf8(buf, len, utf8_output); +} + +simdutf_warn_unused size_t implementation::convert_utf32_to_utf8( + const char32_t *buf, size_t len, char *utf8_output) const noexcept { + if (simdutf_unlikely(len == 0)) { + return 0; + } + std::pair ret = + arm_convert_utf32_to_utf8(buf, len, utf8_output); + if (ret.first == nullptr) { + return 0; + } + size_t saved_bytes = ret.second - utf8_output; + if (ret.first != buf + len) { + const size_t scalar_saved_bytes = scalar::utf32_to_utf8::convert( + ret.first, len - (ret.first - buf), ret.second); + if (scalar_saved_bytes == 0) { + return 0; + } + saved_bytes += scalar_saved_bytes; + } + return saved_bytes; +} + +simdutf_warn_unused result implementation::convert_utf32_to_utf8_with_errors( + const char32_t *buf, size_t len, char *utf8_output) const noexcept { + if (simdutf_unlikely(len == 0)) { + return result(error_code::SUCCESS, 0); + } + // ret.first.count is always the position in the buffer, not the number of + // code units written even if finished + std::pair ret = + arm_convert_utf32_to_utf8_with_errors(buf, len, utf8_output); + if (ret.first.count != len) { + result scalar_res = scalar::utf32_to_utf8::convert_with_errors( + buf + ret.first.count, len - ret.first.count, ret.second); + if (scalar_res.error) { + scalar_res.count += ret.first.count; + return scalar_res; + } else { + ret.second += scalar_res.count; + } + } + ret.first.count = + ret.second - + utf8_output; // Set count to the number of 8-bit code units written + return ret.first; +} + +simdutf_warn_unused size_t implementation::convert_utf16le_to_utf32( + const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { + std::pair ret = + arm_convert_utf16_to_utf32(buf, len, utf32_output); + if (ret.first == nullptr) { + return 0; + } + size_t saved_bytes = ret.second - utf32_output; + if (ret.first != buf + len) { + const size_t scalar_saved_bytes = + scalar::utf16_to_utf32::convert( + ret.first, len - (ret.first - buf), ret.second); + if (scalar_saved_bytes == 0) { + return 0; + } + saved_bytes += scalar_saved_bytes; + } + return saved_bytes; +} + +simdutf_warn_unused size_t implementation::convert_utf16be_to_utf32( + const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { + std::pair ret = + arm_convert_utf16_to_utf32(buf, len, utf32_output); + if (ret.first == nullptr) { + return 0; + } + size_t saved_bytes = ret.second - utf32_output; + if (ret.first != buf + len) { + const size_t scalar_saved_bytes = + scalar::utf16_to_utf32::convert( + ret.first, len - (ret.first - buf), ret.second); + if (scalar_saved_bytes == 0) { + return 0; + } + saved_bytes += scalar_saved_bytes; + } + return saved_bytes; +} + +simdutf_warn_unused result implementation::convert_utf16le_to_utf32_with_errors( + const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { + // ret.first.count is always the position in the buffer, not the number of + // code units written even if finished + std::pair ret = + arm_convert_utf16_to_utf32_with_errors(buf, len, + utf32_output); + if (ret.first.error) { + return ret.first; + } // Can return directly since scalar fallback already found correct + // ret.first.count + if (ret.first.count != len) { // All good so far, but not finished + result scalar_res = + scalar::utf16_to_utf32::convert_with_errors( + buf + ret.first.count, len - ret.first.count, ret.second); + if (scalar_res.error) { + scalar_res.count += ret.first.count; + return scalar_res; + } else { + ret.second += scalar_res.count; + } + } + ret.first.count = + ret.second - + utf32_output; // Set count to the number of 8-bit code units written + return ret.first; +} + +simdutf_warn_unused result implementation::convert_utf16be_to_utf32_with_errors( + const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { + // ret.first.count is always the position in the buffer, not the number of + // code units written even if finished + std::pair ret = + arm_convert_utf16_to_utf32_with_errors(buf, len, + utf32_output); + if (ret.first.error) { + return ret.first; + } // Can return directly since scalar fallback already found correct + // ret.first.count + if (ret.first.count != len) { // All good so far, but not finished + result scalar_res = + scalar::utf16_to_utf32::convert_with_errors( + buf + ret.first.count, len - ret.first.count, ret.second); + if (scalar_res.error) { + scalar_res.count += ret.first.count; + return scalar_res; + } else { + ret.second += scalar_res.count; + } + } + ret.first.count = + ret.second - + utf32_output; // Set count to the number of 8-bit code units written + return ret.first; +} + +simdutf_warn_unused size_t implementation::convert_utf32_to_latin1( + const char32_t *buf, size_t len, char *latin1_output) const noexcept { + std::pair ret = + arm_convert_utf32_to_latin1(buf, len, latin1_output); + if (ret.first == nullptr) { + return 0; + } + size_t saved_bytes = ret.second - latin1_output; + + if (ret.first != buf + len) { + const size_t scalar_saved_bytes = scalar::utf32_to_latin1::convert( + ret.first, len - (ret.first - buf), ret.second); + if (scalar_saved_bytes == 0) { + return 0; + } + saved_bytes += scalar_saved_bytes; + } + return saved_bytes; +} + +simdutf_warn_unused result implementation::convert_utf32_to_latin1_with_errors( + const char32_t *buf, size_t len, char *latin1_output) const noexcept { + std::pair ret = + arm_convert_utf32_to_latin1_with_errors(buf, len, latin1_output); + if (ret.first.error) { + return ret.first; + } // Can return directly since scalar fallback already found correct + // ret.first.count + if (ret.first.count != len) { // All good so far, but not finished + result scalar_res = scalar::utf32_to_latin1::convert_with_errors( + buf + ret.first.count, len - ret.first.count, ret.second); + if (scalar_res.error) { + scalar_res.count += ret.first.count; + return scalar_res; + } else { + ret.second += scalar_res.count; + } + } + ret.first.count = + ret.second - + latin1_output; // Set count to the number of 8-bit code units written + return ret.first; +} + +simdutf_warn_unused size_t implementation::convert_valid_utf32_to_latin1( + const char32_t *buf, size_t len, char *latin1_output) const noexcept { + std::pair ret = + arm_convert_utf32_to_latin1(buf, len, latin1_output); + if (ret.first == nullptr) { + return 0; + } + size_t saved_bytes = ret.second - latin1_output; + + if (ret.first != buf + len) { + const size_t scalar_saved_bytes = scalar::utf32_to_latin1::convert_valid( + ret.first, len - (ret.first - buf), ret.second); + saved_bytes += scalar_saved_bytes; + } + return saved_bytes; +} + +simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf8( + const char32_t *buf, size_t len, char *utf8_output) const noexcept { + // optimization opportunity: implement a custom function. + return convert_utf32_to_utf8(buf, len, utf8_output); +} + +simdutf_warn_unused size_t implementation::convert_utf32_to_utf16le( + const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { + std::pair ret = + arm_convert_utf32_to_utf16(buf, len, utf16_output); + if (ret.first == nullptr) { + return 0; + } + size_t saved_bytes = ret.second - utf16_output; + if (ret.first != buf + len) { + const size_t scalar_saved_bytes = + scalar::utf32_to_utf16::convert( + ret.first, len - (ret.first - buf), ret.second); + if (scalar_saved_bytes == 0) { + return 0; + } + saved_bytes += scalar_saved_bytes; + } + return saved_bytes; +} + +simdutf_warn_unused size_t implementation::convert_utf32_to_utf16be( + const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { + std::pair ret = + arm_convert_utf32_to_utf16(buf, len, utf16_output); + if (ret.first == nullptr) { + return 0; + } + size_t saved_bytes = ret.second - utf16_output; + if (ret.first != buf + len) { + const size_t scalar_saved_bytes = + scalar::utf32_to_utf16::convert( + ret.first, len - (ret.first - buf), ret.second); + if (scalar_saved_bytes == 0) { + return 0; + } + saved_bytes += scalar_saved_bytes; + } + return saved_bytes; +} + +simdutf_warn_unused result implementation::convert_utf32_to_utf16le_with_errors( + const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { + // ret.first.count is always the position in the buffer, not the number of + // code units written even if finished + std::pair ret = + arm_convert_utf32_to_utf16_with_errors(buf, len, + utf16_output); + if (ret.first.count != len) { + result scalar_res = + scalar::utf32_to_utf16::convert_with_errors( + buf + ret.first.count, len - ret.first.count, ret.second); + if (scalar_res.error) { + scalar_res.count += ret.first.count; + return scalar_res; + } else { + ret.second += scalar_res.count; + } + } + ret.first.count = + ret.second - + utf16_output; // Set count to the number of 8-bit code units written + return ret.first; +} + +simdutf_warn_unused result implementation::convert_utf32_to_utf16be_with_errors( + const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { + // ret.first.count is always the position in the buffer, not the number of + // code units written even if finished + std::pair ret = + arm_convert_utf32_to_utf16_with_errors(buf, len, + utf16_output); + if (ret.first.count != len) { + result scalar_res = + scalar::utf32_to_utf16::convert_with_errors( + buf + ret.first.count, len - ret.first.count, ret.second); + if (scalar_res.error) { + scalar_res.count += ret.first.count; + return scalar_res; + } else { + ret.second += scalar_res.count; + } + } + ret.first.count = + ret.second - + utf16_output; // Set count to the number of 8-bit code units written + return ret.first; +} + +simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf16le( + const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { + return convert_utf32_to_utf16le(buf, len, utf16_output); +} + +simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf16be( + const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { + return convert_utf32_to_utf16be(buf, len, utf16_output); +} + +simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_utf32( + const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { + return convert_utf16le_to_utf32(buf, len, utf32_output); +} + +simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_utf32( + const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { + return convert_utf16be_to_utf32(buf, len, utf32_output); +} + +void implementation::change_endianness_utf16(const char16_t *input, + size_t length, + char16_t *output) const noexcept { + utf16::change_endianness_utf16(input, length, output); +} + +simdutf_warn_unused size_t implementation::count_utf16le( + const char16_t *input, size_t length) const noexcept { + return utf16::count_code_points(input, length); +} + +simdutf_warn_unused size_t implementation::count_utf16be( + const char16_t *input, size_t length) const noexcept { + return utf16::count_code_points(input, length); +} + +simdutf_warn_unused size_t +implementation::count_utf8(const char *input, size_t length) const noexcept { + return utf8::count_code_points(input, length); +} + +simdutf_warn_unused size_t implementation::latin1_length_from_utf8( + const char *buf, size_t len) const noexcept { + return count_utf8(buf, len); +} + +simdutf_warn_unused size_t +implementation::latin1_length_from_utf16(size_t length) const noexcept { + return scalar::utf16::latin1_length_from_utf16(length); +} + +simdutf_warn_unused size_t +implementation::latin1_length_from_utf32(size_t length) const noexcept { + return scalar::utf32::latin1_length_from_utf32(length); +} + +simdutf_warn_unused size_t implementation::utf8_length_from_latin1( + const char *input, size_t length) const noexcept { + // See + // https://lemire.me/blog/2023/05/15/computing-the-utf-8-size-of-a-latin-1-string-quickly-arm-neon-edition/ + // credit to Pete Cawley + const uint8_t *data = reinterpret_cast(input); + uint64_t result = 0; + const int lanes = sizeof(uint8x16_t); + uint8_t rem = length % lanes; + const uint8_t *simd_end = data + (length / lanes) * lanes; + const uint8x16_t threshold = vdupq_n_u8(0x80); + for (; data < simd_end; data += lanes) { + // load 16 bytes + uint8x16_t input_vec = vld1q_u8(data); + // compare to threshold (0x80) + uint8x16_t withhighbit = vcgeq_u8(input_vec, threshold); + // vertical addition + result -= vaddvq_s8(vreinterpretq_s8_u8(withhighbit)); + } + return result + (length / lanes) * lanes + + scalar::latin1::utf8_length_from_latin1((const char *)simd_end, rem); +} + +simdutf_warn_unused size_t implementation::utf8_length_from_utf16le( + const char16_t *input, size_t length) const noexcept { + return utf16::utf8_length_from_utf16(input, length); +} + +simdutf_warn_unused size_t implementation::utf8_length_from_utf16be( + const char16_t *input, size_t length) const noexcept { + return utf16::utf8_length_from_utf16(input, length); +} + +simdutf_warn_unused size_t +implementation::utf16_length_from_latin1(size_t length) const noexcept { + return scalar::latin1::utf16_length_from_latin1(length); +} + +simdutf_warn_unused size_t +implementation::utf32_length_from_latin1(size_t length) const noexcept { + return scalar::latin1::utf32_length_from_latin1(length); +} + +simdutf_warn_unused size_t implementation::utf32_length_from_utf16le( + const char16_t *input, size_t length) const noexcept { + return utf16::utf32_length_from_utf16(input, length); +} + +simdutf_warn_unused size_t implementation::utf32_length_from_utf16be( + const char16_t *input, size_t length) const noexcept { + return utf16::utf32_length_from_utf16(input, length); +} + +simdutf_warn_unused size_t implementation::utf16_length_from_utf8( + const char *input, size_t length) const noexcept { + return utf8::utf16_length_from_utf8(input, length); +} + +simdutf_warn_unused size_t implementation::utf8_length_from_utf32( + const char32_t *input, size_t length) const noexcept { + const uint32x4_t v_7f = vmovq_n_u32((uint32_t)0x7f); + const uint32x4_t v_7ff = vmovq_n_u32((uint32_t)0x7ff); + const uint32x4_t v_ffff = vmovq_n_u32((uint32_t)0xffff); + const uint32x4_t v_1 = vmovq_n_u32((uint32_t)0x1); + size_t pos = 0; + size_t count = 0; + for (; pos + 4 <= length; pos += 4) { + uint32x4_t in = vld1q_u32(reinterpret_cast(input + pos)); + const uint32x4_t ascii_bytes_bytemask = vcleq_u32(in, v_7f); + const uint32x4_t one_two_bytes_bytemask = vcleq_u32(in, v_7ff); + const uint32x4_t two_bytes_bytemask = + veorq_u32(one_two_bytes_bytemask, ascii_bytes_bytemask); + const uint32x4_t three_bytes_bytemask = + veorq_u32(vcleq_u32(in, v_ffff), one_two_bytes_bytemask); + + const uint16x8_t reduced_ascii_bytes_bytemask = + vreinterpretq_u16_u32(vandq_u32(ascii_bytes_bytemask, v_1)); + const uint16x8_t reduced_two_bytes_bytemask = + vreinterpretq_u16_u32(vandq_u32(two_bytes_bytemask, v_1)); + const uint16x8_t reduced_three_bytes_bytemask = + vreinterpretq_u16_u32(vandq_u32(three_bytes_bytemask, v_1)); + + const uint16x8_t compressed_bytemask0 = + vpaddq_u16(reduced_ascii_bytes_bytemask, reduced_two_bytes_bytemask); + const uint16x8_t compressed_bytemask1 = + vpaddq_u16(reduced_three_bytes_bytemask, reduced_three_bytes_bytemask); + + size_t ascii_count = count_ones( + vgetq_lane_u64(vreinterpretq_u64_u16(compressed_bytemask0), 0)); + size_t two_bytes_count = count_ones( + vgetq_lane_u64(vreinterpretq_u64_u16(compressed_bytemask0), 1)); + size_t three_bytes_count = count_ones( + vgetq_lane_u64(vreinterpretq_u64_u16(compressed_bytemask1), 0)); + + count += 16 - 3 * ascii_count - 2 * two_bytes_count - three_bytes_count; + } + return count + + scalar::utf32::utf8_length_from_utf32(input + pos, length - pos); +} + +simdutf_warn_unused size_t implementation::utf16_length_from_utf32( + const char32_t *input, size_t length) const noexcept { + const uint32x4_t v_ffff = vmovq_n_u32((uint32_t)0xffff); + const uint32x4_t v_1 = vmovq_n_u32((uint32_t)0x1); + size_t pos = 0; + size_t count = 0; + for (; pos + 4 <= length; pos += 4) { + uint32x4_t in = vld1q_u32(reinterpret_cast(input + pos)); + const uint32x4_t surrogate_bytemask = vcgtq_u32(in, v_ffff); + const uint16x8_t reduced_bytemask = + vreinterpretq_u16_u32(vandq_u32(surrogate_bytemask, v_1)); + const uint16x8_t compressed_bytemask = + vpaddq_u16(reduced_bytemask, reduced_bytemask); + size_t surrogate_count = count_ones( + vgetq_lane_u64(vreinterpretq_u64_u16(compressed_bytemask), 0)); + count += 4 + surrogate_count; + } + return count + + scalar::utf32::utf16_length_from_utf32(input + pos, length - pos); +} + +simdutf_warn_unused size_t implementation::utf32_length_from_utf8( + const char *input, size_t length) const noexcept { + return utf8::count_code_points(input, length); +} + +simdutf_warn_unused size_t implementation::maximal_binary_length_from_base64( + const char *input, size_t length) const noexcept { + return scalar::base64::maximal_binary_length_from_base64(input, length); +} + +simdutf_warn_unused result implementation::base64_to_binary( + const char *input, size_t length, char *output, base64_options options, + last_chunk_handling_options last_chunk_options) const noexcept { + if (options & base64_url) { + if (options == base64_options::base64_url_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } + } else { + if (options == base64_options::base64_default_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, + options, last_chunk_options); + } + } +} + +simdutf_warn_unused full_result implementation::base64_to_binary_details( + const char *input, size_t length, char *output, base64_options options, + last_chunk_handling_options last_chunk_options) const noexcept { + if (options & base64_url) { + if (options == base64_options::base64_url_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } + } else { + if (options == base64_options::base64_default_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, + options, last_chunk_options); + } + } +} + +simdutf_warn_unused size_t implementation::maximal_binary_length_from_base64( + const char16_t *input, size_t length) const noexcept { + return scalar::base64::maximal_binary_length_from_base64(input, length); +} + +simdutf_warn_unused result implementation::base64_to_binary( + const char16_t *input, size_t length, char *output, base64_options options, + last_chunk_handling_options last_chunk_options) const noexcept { + if (options & base64_url) { + if (options == base64_options::base64_url_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } + } else { + if (options == base64_options::base64_default_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, + options, last_chunk_options); + } + } +} + +simdutf_warn_unused full_result implementation::base64_to_binary_details( + const char16_t *input, size_t length, char *output, base64_options options, + last_chunk_handling_options last_chunk_options) const noexcept { + if (options & base64_url) { + if (options == base64_options::base64_url_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } + } else { + if (options == base64_options::base64_default_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, + options, last_chunk_options); + } + } +} + +simdutf_warn_unused size_t implementation::base64_length_from_binary( + size_t length, base64_options options) const noexcept { + return scalar::base64::base64_length_from_binary(length, options); +} + +size_t implementation::binary_to_base64(const char *input, size_t length, + char *output, + base64_options options) const noexcept { + return encode_base64(output, input, length, options); +} + +} // namespace arm64 } // namespace simdutf -#endif // SIMDUTF_UTF8_TO_UTF16_TABLES_H -/* end file src/tables/utf8_to_utf16_tables.h */ -/* begin file src/tables/utf16_to_utf8_tables.h */ -// file generated by scripts/sse_convert_utf16_to_utf8.py -#ifndef SIMDUTF_UTF16_TO_UTF8_TABLES_H -#define SIMDUTF_UTF16_TO_UTF8_TABLES_H +/* begin file src/simdutf/arm64/end.h */ +/* end file src/simdutf/arm64/end.h */ +/* end file src/arm64/implementation.cpp */ +#endif +#if SIMDUTF_IMPLEMENTATION_FALLBACK +/* begin file src/fallback/implementation.cpp */ +/* begin file src/simdutf/fallback/begin.h */ +// redefining SIMDUTF_IMPLEMENTATION to "fallback" +// #define SIMDUTF_IMPLEMENTATION fallback +/* end file src/simdutf/fallback/begin.h */ + + + + + + + + +#include +#include + +namespace simdutf { +namespace fallback { + +simdutf_warn_unused int +implementation::detect_encodings(const char *input, + size_t length) const noexcept { + // If there is a BOM, then we trust it. + auto bom_encoding = simdutf::BOM::check_bom(input, length); + if (bom_encoding != encoding_type::unspecified) { + return bom_encoding; + } + // todo: reimplement as a one-pass algorithm. + int out = 0; + if (validate_utf8(input, length)) { + out |= encoding_type::UTF8; + } + if ((length % 2) == 0) { + if (validate_utf16le(reinterpret_cast(input), + length / 2)) { + out |= encoding_type::UTF16_LE; + } + } + if ((length % 4) == 0) { + if (validate_utf32(reinterpret_cast(input), length / 4)) { + out |= encoding_type::UTF32_LE; + } + } + return out; +} + +simdutf_warn_unused bool +implementation::validate_utf8(const char *buf, size_t len) const noexcept { + return scalar::utf8::validate(buf, len); +} + +simdutf_warn_unused result implementation::validate_utf8_with_errors( + const char *buf, size_t len) const noexcept { + return scalar::utf8::validate_with_errors(buf, len); +} + +simdutf_warn_unused bool +implementation::validate_ascii(const char *buf, size_t len) const noexcept { + return scalar::ascii::validate(buf, len); +} + +simdutf_warn_unused result implementation::validate_ascii_with_errors( + const char *buf, size_t len) const noexcept { + return scalar::ascii::validate_with_errors(buf, len); +} + +simdutf_warn_unused bool +implementation::validate_utf16le(const char16_t *buf, + size_t len) const noexcept { + return scalar::utf16::validate(buf, len); +} + +simdutf_warn_unused bool +implementation::validate_utf16be(const char16_t *buf, + size_t len) const noexcept { + return scalar::utf16::validate(buf, len); +} + +simdutf_warn_unused result implementation::validate_utf16le_with_errors( + const char16_t *buf, size_t len) const noexcept { + return scalar::utf16::validate_with_errors(buf, len); +} + +simdutf_warn_unused result implementation::validate_utf16be_with_errors( + const char16_t *buf, size_t len) const noexcept { + return scalar::utf16::validate_with_errors(buf, len); +} + +simdutf_warn_unused bool +implementation::validate_utf32(const char32_t *buf, size_t len) const noexcept { + return scalar::utf32::validate(buf, len); +} + +simdutf_warn_unused result implementation::validate_utf32_with_errors( + const char32_t *buf, size_t len) const noexcept { + return scalar::utf32::validate_with_errors(buf, len); +} + +simdutf_warn_unused size_t implementation::convert_latin1_to_utf8( + const char *buf, size_t len, char *utf8_output) const noexcept { + return scalar::latin1_to_utf8::convert(buf, len, utf8_output); +} + +simdutf_warn_unused size_t implementation::convert_latin1_to_utf16le( + const char *buf, size_t len, char16_t *utf16_output) const noexcept { + return scalar::latin1_to_utf16::convert(buf, len, + utf16_output); +} + +simdutf_warn_unused size_t implementation::convert_latin1_to_utf16be( + const char *buf, size_t len, char16_t *utf16_output) const noexcept { + return scalar::latin1_to_utf16::convert(buf, len, + utf16_output); +} + +simdutf_warn_unused size_t implementation::convert_latin1_to_utf32( + const char *buf, size_t len, char32_t *utf32_output) const noexcept { + return scalar::latin1_to_utf32::convert(buf, len, utf32_output); +} + +simdutf_warn_unused size_t implementation::convert_utf8_to_latin1( + const char *buf, size_t len, char *latin1_output) const noexcept { + return scalar::utf8_to_latin1::convert(buf, len, latin1_output); +} + +simdutf_warn_unused result implementation::convert_utf8_to_latin1_with_errors( + const char *buf, size_t len, char *latin1_output) const noexcept { + return scalar::utf8_to_latin1::convert_with_errors(buf, len, latin1_output); +} + +simdutf_warn_unused size_t implementation::convert_valid_utf8_to_latin1( + const char *buf, size_t len, char *latin1_output) const noexcept { + return scalar::utf8_to_latin1::convert_valid(buf, len, latin1_output); +} + +simdutf_warn_unused size_t implementation::convert_utf8_to_utf16le( + const char *buf, size_t len, char16_t *utf16_output) const noexcept { + return scalar::utf8_to_utf16::convert(buf, len, + utf16_output); +} + +simdutf_warn_unused size_t implementation::convert_utf8_to_utf16be( + const char *buf, size_t len, char16_t *utf16_output) const noexcept { + return scalar::utf8_to_utf16::convert(buf, len, + utf16_output); +} + +simdutf_warn_unused result implementation::convert_utf8_to_utf16le_with_errors( + const char *buf, size_t len, char16_t *utf16_output) const noexcept { + return scalar::utf8_to_utf16::convert_with_errors( + buf, len, utf16_output); +} + +simdutf_warn_unused result implementation::convert_utf8_to_utf16be_with_errors( + const char *buf, size_t len, char16_t *utf16_output) const noexcept { + return scalar::utf8_to_utf16::convert_with_errors( + buf, len, utf16_output); +} + +simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf16le( + const char *buf, size_t len, char16_t *utf16_output) const noexcept { + return scalar::utf8_to_utf16::convert_valid(buf, len, + utf16_output); +} + +simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf16be( + const char *buf, size_t len, char16_t *utf16_output) const noexcept { + return scalar::utf8_to_utf16::convert_valid(buf, len, + utf16_output); +} + +simdutf_warn_unused size_t implementation::convert_utf8_to_utf32( + const char *buf, size_t len, char32_t *utf32_output) const noexcept { + return scalar::utf8_to_utf32::convert(buf, len, utf32_output); +} + +simdutf_warn_unused result implementation::convert_utf8_to_utf32_with_errors( + const char *buf, size_t len, char32_t *utf32_output) const noexcept { + return scalar::utf8_to_utf32::convert_with_errors(buf, len, utf32_output); +} + +simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf32( + const char *input, size_t size, char32_t *utf32_output) const noexcept { + return scalar::utf8_to_utf32::convert_valid(input, size, utf32_output); +} + +simdutf_warn_unused size_t implementation::convert_utf16le_to_latin1( + const char16_t *buf, size_t len, char *latin1_output) const noexcept { + return scalar::utf16_to_latin1::convert(buf, len, + latin1_output); +} + +simdutf_warn_unused size_t implementation::convert_utf16be_to_latin1( + const char16_t *buf, size_t len, char *latin1_output) const noexcept { + return scalar::utf16_to_latin1::convert(buf, len, + latin1_output); +} + +simdutf_warn_unused result +implementation::convert_utf16le_to_latin1_with_errors( + const char16_t *buf, size_t len, char *latin1_output) const noexcept { + return scalar::utf16_to_latin1::convert_with_errors( + buf, len, latin1_output); +} + +simdutf_warn_unused result +implementation::convert_utf16be_to_latin1_with_errors( + const char16_t *buf, size_t len, char *latin1_output) const noexcept { + return scalar::utf16_to_latin1::convert_with_errors( + buf, len, latin1_output); +} + +simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_latin1( + const char16_t *buf, size_t len, char *latin1_output) const noexcept { + return scalar::utf16_to_latin1::convert_valid( + buf, len, latin1_output); +} + +simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_latin1( + const char16_t *buf, size_t len, char *latin1_output) const noexcept { + return scalar::utf16_to_latin1::convert_valid(buf, len, + latin1_output); +} + +simdutf_warn_unused size_t implementation::convert_utf16le_to_utf8( + const char16_t *buf, size_t len, char *utf8_output) const noexcept { + return scalar::utf16_to_utf8::convert(buf, len, + utf8_output); +} + +simdutf_warn_unused size_t implementation::convert_utf16be_to_utf8( + const char16_t *buf, size_t len, char *utf8_output) const noexcept { + return scalar::utf16_to_utf8::convert(buf, len, utf8_output); +} + +simdutf_warn_unused result implementation::convert_utf16le_to_utf8_with_errors( + const char16_t *buf, size_t len, char *utf8_output) const noexcept { + return scalar::utf16_to_utf8::convert_with_errors( + buf, len, utf8_output); +} + +simdutf_warn_unused result implementation::convert_utf16be_to_utf8_with_errors( + const char16_t *buf, size_t len, char *utf8_output) const noexcept { + return scalar::utf16_to_utf8::convert_with_errors( + buf, len, utf8_output); +} + +simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_utf8( + const char16_t *buf, size_t len, char *utf8_output) const noexcept { + return scalar::utf16_to_utf8::convert_valid(buf, len, + utf8_output); +} + +simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_utf8( + const char16_t *buf, size_t len, char *utf8_output) const noexcept { + return scalar::utf16_to_utf8::convert_valid(buf, len, + utf8_output); +} + +simdutf_warn_unused size_t implementation::convert_utf32_to_latin1( + const char32_t *buf, size_t len, char *latin1_output) const noexcept { + return scalar::utf32_to_latin1::convert(buf, len, latin1_output); +} + +simdutf_warn_unused result implementation::convert_utf32_to_latin1_with_errors( + const char32_t *buf, size_t len, char *latin1_output) const noexcept { + return scalar::utf32_to_latin1::convert_with_errors(buf, len, latin1_output); +} + +simdutf_warn_unused size_t implementation::convert_valid_utf32_to_latin1( + const char32_t *buf, size_t len, char *latin1_output) const noexcept { + return scalar::utf32_to_latin1::convert_valid(buf, len, latin1_output); +} + +simdutf_warn_unused size_t implementation::convert_utf32_to_utf8( + const char32_t *buf, size_t len, char *utf8_output) const noexcept { + return scalar::utf32_to_utf8::convert(buf, len, utf8_output); +} + +simdutf_warn_unused result implementation::convert_utf32_to_utf8_with_errors( + const char32_t *buf, size_t len, char *utf8_output) const noexcept { + return scalar::utf32_to_utf8::convert_with_errors(buf, len, utf8_output); +} + +simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf8( + const char32_t *buf, size_t len, char *utf8_output) const noexcept { + return scalar::utf32_to_utf8::convert_valid(buf, len, utf8_output); +} + +simdutf_warn_unused size_t implementation::convert_utf32_to_utf16le( + const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { + return scalar::utf32_to_utf16::convert(buf, len, + utf16_output); +} + +simdutf_warn_unused size_t implementation::convert_utf32_to_utf16be( + const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { + return scalar::utf32_to_utf16::convert(buf, len, + utf16_output); +} + +simdutf_warn_unused result implementation::convert_utf32_to_utf16le_with_errors( + const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { + return scalar::utf32_to_utf16::convert_with_errors( + buf, len, utf16_output); +} + +simdutf_warn_unused result implementation::convert_utf32_to_utf16be_with_errors( + const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { + return scalar::utf32_to_utf16::convert_with_errors( + buf, len, utf16_output); +} + +simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf16le( + const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { + return scalar::utf32_to_utf16::convert_valid( + buf, len, utf16_output); +} + +simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf16be( + const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { + return scalar::utf32_to_utf16::convert_valid(buf, len, + utf16_output); +} + +simdutf_warn_unused size_t implementation::convert_utf16le_to_utf32( + const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { + return scalar::utf16_to_utf32::convert(buf, len, + utf32_output); +} + +simdutf_warn_unused size_t implementation::convert_utf16be_to_utf32( + const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { + return scalar::utf16_to_utf32::convert(buf, len, + utf32_output); +} + +simdutf_warn_unused result implementation::convert_utf16le_to_utf32_with_errors( + const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { + return scalar::utf16_to_utf32::convert_with_errors( + buf, len, utf32_output); +} + +simdutf_warn_unused result implementation::convert_utf16be_to_utf32_with_errors( + const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { + return scalar::utf16_to_utf32::convert_with_errors( + buf, len, utf32_output); +} + +simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_utf32( + const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { + return scalar::utf16_to_utf32::convert_valid( + buf, len, utf32_output); +} + +simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_utf32( + const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { + return scalar::utf16_to_utf32::convert_valid(buf, len, + utf32_output); +} + +void implementation::change_endianness_utf16(const char16_t *input, + size_t length, + char16_t *output) const noexcept { + scalar::utf16::change_endianness_utf16(input, length, output); +} + +simdutf_warn_unused size_t implementation::count_utf16le( + const char16_t *input, size_t length) const noexcept { + return scalar::utf16::count_code_points(input, length); +} + +simdutf_warn_unused size_t implementation::count_utf16be( + const char16_t *input, size_t length) const noexcept { + return scalar::utf16::count_code_points(input, length); +} + +simdutf_warn_unused size_t +implementation::count_utf8(const char *input, size_t length) const noexcept { + return scalar::utf8::count_code_points(input, length); +} + +simdutf_warn_unused size_t implementation::latin1_length_from_utf8( + const char *buf, size_t len) const noexcept { + return scalar::utf8::count_code_points(buf, len); +} + +simdutf_warn_unused size_t +implementation::latin1_length_from_utf16(size_t length) const noexcept { + return scalar::utf16::latin1_length_from_utf16(length); +} + +simdutf_warn_unused size_t +implementation::latin1_length_from_utf32(size_t length) const noexcept { + return length; +} + +simdutf_warn_unused size_t implementation::utf8_length_from_latin1( + const char *input, size_t length) const noexcept { + size_t answer = length; + size_t i = 0; + auto pop = [](uint64_t v) { + return (size_t)(((v >> 7) & UINT64_C(0x0101010101010101)) * + UINT64_C(0x0101010101010101) >> + 56); + }; + for (; i + 32 <= length; i += 32) { + uint64_t v; + memcpy(&v, input + i, 8); + answer += pop(v); + memcpy(&v, input + i + 8, sizeof(v)); + answer += pop(v); + memcpy(&v, input + i + 16, sizeof(v)); + answer += pop(v); + memcpy(&v, input + i + 24, sizeof(v)); + answer += pop(v); + } + for (; i + 8 <= length; i += 8) { + uint64_t v; + memcpy(&v, input + i, sizeof(v)); + answer += pop(v); + } + for (; i + 1 <= length; i += 1) { + answer += static_cast(input[i]) >> 7; + } + return answer; +} + +simdutf_warn_unused size_t implementation::utf8_length_from_utf16le( + const char16_t *input, size_t length) const noexcept { + return scalar::utf16::utf8_length_from_utf16(input, + length); +} -namespace simdutf { -namespace { -namespace tables { -namespace utf16_to_utf8 { +simdutf_warn_unused size_t implementation::utf8_length_from_utf16be( + const char16_t *input, size_t length) const noexcept { + return scalar::utf16::utf8_length_from_utf16(input, length); +} -// 1 byte for length, 16 bytes for mask -const uint8_t pack_1_2_utf8_bytes[256][17] = { - {16, 1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14}, - {15, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14, 0x80}, - {15, 1, 0, 3, 2, 5, 4, 7, 6, 8, 11, 10, 13, 12, 15, 14, 0x80}, - {14, 0, 3, 2, 5, 4, 7, 6, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80}, - {15, 1, 0, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14, 0x80}, - {14, 0, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80}, - {14, 1, 0, 2, 5, 4, 7, 6, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80}, - {13, 0, 2, 5, 4, 7, 6, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80}, - {15, 1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 10, 13, 12, 15, 14, 0x80}, - {14, 0, 3, 2, 5, 4, 7, 6, 9, 8, 10, 13, 12, 15, 14, 0x80, 0x80}, - {14, 1, 0, 3, 2, 5, 4, 7, 6, 8, 10, 13, 12, 15, 14, 0x80, 0x80}, - {13, 0, 3, 2, 5, 4, 7, 6, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80}, - {14, 1, 0, 2, 5, 4, 7, 6, 9, 8, 10, 13, 12, 15, 14, 0x80, 0x80}, - {13, 0, 2, 5, 4, 7, 6, 9, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80}, - {13, 1, 0, 2, 5, 4, 7, 6, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80}, - {12, 0, 2, 5, 4, 7, 6, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, - {15, 1, 0, 3, 2, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14, 0x80}, - {14, 0, 3, 2, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80}, - {14, 1, 0, 3, 2, 4, 7, 6, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80}, - {13, 0, 3, 2, 4, 7, 6, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80}, - {14, 1, 0, 2, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80}, - {13, 0, 2, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80}, - {13, 1, 0, 2, 4, 7, 6, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80}, - {12, 0, 2, 4, 7, 6, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, - {14, 1, 0, 3, 2, 4, 7, 6, 9, 8, 10, 13, 12, 15, 14, 0x80, 0x80}, - {13, 0, 3, 2, 4, 7, 6, 9, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80}, - {13, 1, 0, 3, 2, 4, 7, 6, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80}, - {12, 0, 3, 2, 4, 7, 6, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, - {13, 1, 0, 2, 4, 7, 6, 9, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80}, - {12, 0, 2, 4, 7, 6, 9, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, - {12, 1, 0, 2, 4, 7, 6, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, - {11, 0, 2, 4, 7, 6, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {15, 1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 12, 15, 14, 0x80}, - {14, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 12, 15, 14, 0x80, 0x80}, - {14, 1, 0, 3, 2, 5, 4, 7, 6, 8, 11, 10, 12, 15, 14, 0x80, 0x80}, - {13, 0, 3, 2, 5, 4, 7, 6, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80}, - {14, 1, 0, 2, 5, 4, 7, 6, 9, 8, 11, 10, 12, 15, 14, 0x80, 0x80}, - {13, 0, 2, 5, 4, 7, 6, 9, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80}, - {13, 1, 0, 2, 5, 4, 7, 6, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80}, - {12, 0, 2, 5, 4, 7, 6, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, - {14, 1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 10, 12, 15, 14, 0x80, 0x80}, - {13, 0, 3, 2, 5, 4, 7, 6, 9, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80}, - {13, 1, 0, 3, 2, 5, 4, 7, 6, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80}, - {12, 0, 3, 2, 5, 4, 7, 6, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, - {13, 1, 0, 2, 5, 4, 7, 6, 9, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80}, - {12, 0, 2, 5, 4, 7, 6, 9, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, - {12, 1, 0, 2, 5, 4, 7, 6, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, - {11, 0, 2, 5, 4, 7, 6, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {14, 1, 0, 3, 2, 4, 7, 6, 9, 8, 11, 10, 12, 15, 14, 0x80, 0x80}, - {13, 0, 3, 2, 4, 7, 6, 9, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80}, - {13, 1, 0, 3, 2, 4, 7, 6, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80}, - {12, 0, 3, 2, 4, 7, 6, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, - {13, 1, 0, 2, 4, 7, 6, 9, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80}, - {12, 0, 2, 4, 7, 6, 9, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, - {12, 1, 0, 2, 4, 7, 6, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, - {11, 0, 2, 4, 7, 6, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {13, 1, 0, 3, 2, 4, 7, 6, 9, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80}, - {12, 0, 3, 2, 4, 7, 6, 9, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, - {12, 1, 0, 3, 2, 4, 7, 6, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, - {11, 0, 3, 2, 4, 7, 6, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {12, 1, 0, 2, 4, 7, 6, 9, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, - {11, 0, 2, 4, 7, 6, 9, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {11, 1, 0, 2, 4, 7, 6, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {10, 0, 2, 4, 7, 6, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {15, 1, 0, 3, 2, 5, 4, 6, 9, 8, 11, 10, 13, 12, 15, 14, 0x80}, - {14, 0, 3, 2, 5, 4, 6, 9, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80}, - {14, 1, 0, 3, 2, 5, 4, 6, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80}, - {13, 0, 3, 2, 5, 4, 6, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80}, - {14, 1, 0, 2, 5, 4, 6, 9, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80}, - {13, 0, 2, 5, 4, 6, 9, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80}, - {13, 1, 0, 2, 5, 4, 6, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80}, - {12, 0, 2, 5, 4, 6, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, - {14, 1, 0, 3, 2, 5, 4, 6, 9, 8, 10, 13, 12, 15, 14, 0x80, 0x80}, - {13, 0, 3, 2, 5, 4, 6, 9, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80}, - {13, 1, 0, 3, 2, 5, 4, 6, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80}, - {12, 0, 3, 2, 5, 4, 6, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, - {13, 1, 0, 2, 5, 4, 6, 9, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80}, - {12, 0, 2, 5, 4, 6, 9, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, - {12, 1, 0, 2, 5, 4, 6, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, - {11, 0, 2, 5, 4, 6, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {14, 1, 0, 3, 2, 4, 6, 9, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80}, - {13, 0, 3, 2, 4, 6, 9, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80}, - {13, 1, 0, 3, 2, 4, 6, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80}, - {12, 0, 3, 2, 4, 6, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, - {13, 1, 0, 2, 4, 6, 9, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80}, - {12, 0, 2, 4, 6, 9, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, - {12, 1, 0, 2, 4, 6, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, - {11, 0, 2, 4, 6, 8, 11, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {13, 1, 0, 3, 2, 4, 6, 9, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80}, - {12, 0, 3, 2, 4, 6, 9, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, - {12, 1, 0, 3, 2, 4, 6, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, - {11, 0, 3, 2, 4, 6, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {12, 1, 0, 2, 4, 6, 9, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, - {11, 0, 2, 4, 6, 9, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {11, 1, 0, 2, 4, 6, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {10, 0, 2, 4, 6, 8, 10, 13, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {14, 1, 0, 3, 2, 5, 4, 6, 9, 8, 11, 10, 12, 15, 14, 0x80, 0x80}, - {13, 0, 3, 2, 5, 4, 6, 9, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80}, - {13, 1, 0, 3, 2, 5, 4, 6, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80}, - {12, 0, 3, 2, 5, 4, 6, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, - {13, 1, 0, 2, 5, 4, 6, 9, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80}, - {12, 0, 2, 5, 4, 6, 9, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, - {12, 1, 0, 2, 5, 4, 6, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, - {11, 0, 2, 5, 4, 6, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {13, 1, 0, 3, 2, 5, 4, 6, 9, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80}, - {12, 0, 3, 2, 5, 4, 6, 9, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, - {12, 1, 0, 3, 2, 5, 4, 6, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, - {11, 0, 3, 2, 5, 4, 6, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {12, 1, 0, 2, 5, 4, 6, 9, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, - {11, 0, 2, 5, 4, 6, 9, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {11, 1, 0, 2, 5, 4, 6, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {10, 0, 2, 5, 4, 6, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {13, 1, 0, 3, 2, 4, 6, 9, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80}, - {12, 0, 3, 2, 4, 6, 9, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, - {12, 1, 0, 3, 2, 4, 6, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, - {11, 0, 3, 2, 4, 6, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {12, 1, 0, 2, 4, 6, 9, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, - {11, 0, 2, 4, 6, 9, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {11, 1, 0, 2, 4, 6, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {10, 0, 2, 4, 6, 8, 11, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {12, 1, 0, 3, 2, 4, 6, 9, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80}, - {11, 0, 3, 2, 4, 6, 9, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {11, 1, 0, 3, 2, 4, 6, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {10, 0, 3, 2, 4, 6, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {11, 1, 0, 2, 4, 6, 9, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {10, 0, 2, 4, 6, 9, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {10, 1, 0, 2, 4, 6, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {9, 0, 2, 4, 6, 8, 10, 12, 15, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {15, 1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 14, 0x80}, - {14, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 14, 0x80, 0x80}, - {14, 1, 0, 3, 2, 5, 4, 7, 6, 8, 11, 10, 13, 12, 14, 0x80, 0x80}, - {13, 0, 3, 2, 5, 4, 7, 6, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80}, - {14, 1, 0, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 14, 0x80, 0x80}, - {13, 0, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80}, - {13, 1, 0, 2, 5, 4, 7, 6, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80}, - {12, 0, 2, 5, 4, 7, 6, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80}, - {14, 1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 10, 13, 12, 14, 0x80, 0x80}, - {13, 0, 3, 2, 5, 4, 7, 6, 9, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80}, - {13, 1, 0, 3, 2, 5, 4, 7, 6, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80}, - {12, 0, 3, 2, 5, 4, 7, 6, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80}, - {13, 1, 0, 2, 5, 4, 7, 6, 9, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80}, - {12, 0, 2, 5, 4, 7, 6, 9, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80}, - {12, 1, 0, 2, 5, 4, 7, 6, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80}, - {11, 0, 2, 5, 4, 7, 6, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {14, 1, 0, 3, 2, 4, 7, 6, 9, 8, 11, 10, 13, 12, 14, 0x80, 0x80}, - {13, 0, 3, 2, 4, 7, 6, 9, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80}, - {13, 1, 0, 3, 2, 4, 7, 6, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80}, - {12, 0, 3, 2, 4, 7, 6, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80}, - {13, 1, 0, 2, 4, 7, 6, 9, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80}, - {12, 0, 2, 4, 7, 6, 9, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80}, - {12, 1, 0, 2, 4, 7, 6, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80}, - {11, 0, 2, 4, 7, 6, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {13, 1, 0, 3, 2, 4, 7, 6, 9, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80}, - {12, 0, 3, 2, 4, 7, 6, 9, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80}, - {12, 1, 0, 3, 2, 4, 7, 6, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80}, - {11, 0, 3, 2, 4, 7, 6, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {12, 1, 0, 2, 4, 7, 6, 9, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80}, - {11, 0, 2, 4, 7, 6, 9, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {11, 1, 0, 2, 4, 7, 6, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {10, 0, 2, 4, 7, 6, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {14, 1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 12, 14, 0x80, 0x80}, - {13, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80}, - {13, 1, 0, 3, 2, 5, 4, 7, 6, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80}, - {12, 0, 3, 2, 5, 4, 7, 6, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80}, - {13, 1, 0, 2, 5, 4, 7, 6, 9, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80}, - {12, 0, 2, 5, 4, 7, 6, 9, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80}, - {12, 1, 0, 2, 5, 4, 7, 6, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80}, - {11, 0, 2, 5, 4, 7, 6, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {13, 1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 10, 12, 14, 0x80, 0x80, 0x80}, - {12, 0, 3, 2, 5, 4, 7, 6, 9, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80}, - {12, 1, 0, 3, 2, 5, 4, 7, 6, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80}, - {11, 0, 3, 2, 5, 4, 7, 6, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {12, 1, 0, 2, 5, 4, 7, 6, 9, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80}, - {11, 0, 2, 5, 4, 7, 6, 9, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {11, 1, 0, 2, 5, 4, 7, 6, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {10, 0, 2, 5, 4, 7, 6, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {13, 1, 0, 3, 2, 4, 7, 6, 9, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80}, - {12, 0, 3, 2, 4, 7, 6, 9, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80}, - {12, 1, 0, 3, 2, 4, 7, 6, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80}, - {11, 0, 3, 2, 4, 7, 6, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {12, 1, 0, 2, 4, 7, 6, 9, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80}, - {11, 0, 2, 4, 7, 6, 9, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {11, 1, 0, 2, 4, 7, 6, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {10, 0, 2, 4, 7, 6, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {12, 1, 0, 3, 2, 4, 7, 6, 9, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80}, - {11, 0, 3, 2, 4, 7, 6, 9, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {11, 1, 0, 3, 2, 4, 7, 6, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {10, 0, 3, 2, 4, 7, 6, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {11, 1, 0, 2, 4, 7, 6, 9, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {10, 0, 2, 4, 7, 6, 9, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {10, 1, 0, 2, 4, 7, 6, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {9, 0, 2, 4, 7, 6, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {14, 1, 0, 3, 2, 5, 4, 6, 9, 8, 11, 10, 13, 12, 14, 0x80, 0x80}, - {13, 0, 3, 2, 5, 4, 6, 9, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80}, - {13, 1, 0, 3, 2, 5, 4, 6, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80}, - {12, 0, 3, 2, 5, 4, 6, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80}, - {13, 1, 0, 2, 5, 4, 6, 9, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80}, - {12, 0, 2, 5, 4, 6, 9, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80}, - {12, 1, 0, 2, 5, 4, 6, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80}, - {11, 0, 2, 5, 4, 6, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {13, 1, 0, 3, 2, 5, 4, 6, 9, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80}, - {12, 0, 3, 2, 5, 4, 6, 9, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80}, - {12, 1, 0, 3, 2, 5, 4, 6, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80}, - {11, 0, 3, 2, 5, 4, 6, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {12, 1, 0, 2, 5, 4, 6, 9, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80}, - {11, 0, 2, 5, 4, 6, 9, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {11, 1, 0, 2, 5, 4, 6, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {10, 0, 2, 5, 4, 6, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {13, 1, 0, 3, 2, 4, 6, 9, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80}, - {12, 0, 3, 2, 4, 6, 9, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80}, - {12, 1, 0, 3, 2, 4, 6, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80}, - {11, 0, 3, 2, 4, 6, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {12, 1, 0, 2, 4, 6, 9, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80}, - {11, 0, 2, 4, 6, 9, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {11, 1, 0, 2, 4, 6, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {10, 0, 2, 4, 6, 8, 11, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {12, 1, 0, 3, 2, 4, 6, 9, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80}, - {11, 0, 3, 2, 4, 6, 9, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {11, 1, 0, 3, 2, 4, 6, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {10, 0, 3, 2, 4, 6, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {11, 1, 0, 2, 4, 6, 9, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {10, 0, 2, 4, 6, 9, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {10, 1, 0, 2, 4, 6, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {9, 0, 2, 4, 6, 8, 10, 13, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {13, 1, 0, 3, 2, 5, 4, 6, 9, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80}, - {12, 0, 3, 2, 5, 4, 6, 9, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80}, - {12, 1, 0, 3, 2, 5, 4, 6, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80}, - {11, 0, 3, 2, 5, 4, 6, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {12, 1, 0, 2, 5, 4, 6, 9, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80}, - {11, 0, 2, 5, 4, 6, 9, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {11, 1, 0, 2, 5, 4, 6, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {10, 0, 2, 5, 4, 6, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {12, 1, 0, 3, 2, 5, 4, 6, 9, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80}, - {11, 0, 3, 2, 5, 4, 6, 9, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {11, 1, 0, 3, 2, 5, 4, 6, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {10, 0, 3, 2, 5, 4, 6, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {11, 1, 0, 2, 5, 4, 6, 9, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {10, 0, 2, 5, 4, 6, 9, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {10, 1, 0, 2, 5, 4, 6, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {9, 0, 2, 5, 4, 6, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {12, 1, 0, 3, 2, 4, 6, 9, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80}, - {11, 0, 3, 2, 4, 6, 9, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {11, 1, 0, 3, 2, 4, 6, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {10, 0, 3, 2, 4, 6, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {11, 1, 0, 2, 4, 6, 9, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {10, 0, 2, 4, 6, 9, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {10, 1, 0, 2, 4, 6, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {9, 0, 2, 4, 6, 8, 11, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {11, 1, 0, 3, 2, 4, 6, 9, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80}, - {10, 0, 3, 2, 4, 6, 9, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {10, 1, 0, 3, 2, 4, 6, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {9, 0, 3, 2, 4, 6, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {10, 1, 0, 2, 4, 6, 9, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {9, 0, 2, 4, 6, 9, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {9, 1, 0, 2, 4, 6, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {8, 0, 2, 4, 6, 8, 10, 12, 14, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}}; +simdutf_warn_unused size_t implementation::utf32_length_from_utf16le( + const char16_t *input, size_t length) const noexcept { + return scalar::utf16::utf32_length_from_utf16(input, + length); +} + +simdutf_warn_unused size_t implementation::utf32_length_from_utf16be( + const char16_t *input, size_t length) const noexcept { + return scalar::utf16::utf32_length_from_utf16(input, length); +} + +simdutf_warn_unused size_t +implementation::utf16_length_from_latin1(size_t length) const noexcept { + return scalar::latin1::utf16_length_from_latin1(length); +} + +simdutf_warn_unused size_t implementation::utf16_length_from_utf8( + const char *input, size_t length) const noexcept { + return scalar::utf8::utf16_length_from_utf8(input, length); +} + +simdutf_warn_unused size_t implementation::utf8_length_from_utf32( + const char32_t *input, size_t length) const noexcept { + return scalar::utf32::utf8_length_from_utf32(input, length); +} + +simdutf_warn_unused size_t implementation::utf16_length_from_utf32( + const char32_t *input, size_t length) const noexcept { + return scalar::utf32::utf16_length_from_utf32(input, length); +} + +simdutf_warn_unused size_t +implementation::utf32_length_from_latin1(size_t length) const noexcept { + return scalar::latin1::utf32_length_from_latin1(length); +} + +simdutf_warn_unused size_t implementation::utf32_length_from_utf8( + const char *input, size_t length) const noexcept { + return scalar::utf8::count_code_points(input, length); +} + +simdutf_warn_unused size_t implementation::maximal_binary_length_from_base64( + const char *input, size_t length) const noexcept { + return scalar::base64::maximal_binary_length_from_base64(input, length); +} + +simdutf_warn_unused result implementation::base64_to_binary( + const char *input, size_t length, char *output, base64_options options, + last_chunk_handling_options last_chunk_options) const noexcept { + const bool ignore_garbage = + (options == base64_options::base64_url_accept_garbage) || + (options == base64_options::base64_default_accept_garbage); + while (length > 0 && + scalar::base64::is_ascii_white_space(input[length - 1])) { + length--; + } + size_t equallocation = + length; // location of the first padding character if any + size_t equalsigns = 0; + if (length > 0 && input[length - 1] == '=') { + equallocation = length - 1; + length -= 1; + equalsigns++; + while (length > 0 && + scalar::base64::is_ascii_white_space(input[length - 1])) { + length--; + } + if (length > 0 && input[length - 1] == '=') { + equallocation = length - 1; + equalsigns++; + length -= 1; + } + } + if (length == 0) { + if (!ignore_garbage && equalsigns > 0) { + return {INVALID_BASE64_CHARACTER, equallocation}; + } + return {SUCCESS, 0}; + } + result r = scalar::base64::base64_tail_decode( + output, input, length, equalsigns, options, last_chunk_options); + if (last_chunk_options != stop_before_partial && + r.error == error_code::SUCCESS && equalsigns > 0 && !ignore_garbage) { + // additional checks + if ((r.count % 3 == 0) || ((r.count % 3) + 1 + equalsigns != 4)) { + return {INVALID_BASE64_CHARACTER, equallocation}; + } + } + return r; +} + +simdutf_warn_unused full_result implementation::base64_to_binary_details( + const char *input, size_t length, char *output, base64_options options, + last_chunk_handling_options last_chunk_options) const noexcept { + const bool ignore_garbage = + (options == base64_options::base64_url_accept_garbage) || + (options == base64_options::base64_default_accept_garbage); + while (length > 0 && + scalar::base64::is_ascii_white_space(input[length - 1])) { + length--; + } + size_t equallocation = + length; // location of the first padding character if any + size_t equalsigns = 0; + if (length > 0 && input[length - 1] == '=') { + equallocation = length - 1; + length -= 1; + equalsigns++; + while (length > 0 && + scalar::base64::is_ascii_white_space(input[length - 1])) { + length--; + } + if (length > 0 && input[length - 1] == '=') { + equallocation = length - 1; + equalsigns++; + length -= 1; + } + } + if (length == 0) { + if (!ignore_garbage && equalsigns > 0) { + return {INVALID_BASE64_CHARACTER, equallocation, 0}; + } + return {SUCCESS, 0, 0}; + } + full_result r = scalar::base64::base64_tail_decode( + output, input, length, equalsigns, options, last_chunk_options); + if (last_chunk_options != stop_before_partial && + r.error == error_code::SUCCESS && equalsigns > 0 && !ignore_garbage) { + // additional checks + if ((r.output_count % 3 == 0) || + ((r.output_count % 3) + 1 + equalsigns != 4)) { + return {INVALID_BASE64_CHARACTER, equallocation, r.output_count}; + } + } + return r; +} + +simdutf_warn_unused size_t implementation::maximal_binary_length_from_base64( + const char16_t *input, size_t length) const noexcept { + return scalar::base64::maximal_binary_length_from_base64(input, length); +} + +simdutf_warn_unused result implementation::base64_to_binary( + const char16_t *input, size_t length, char *output, base64_options options, + last_chunk_handling_options last_chunk_options) const noexcept { + const bool ignore_garbage = + (options == base64_options::base64_url_accept_garbage) || + (options == base64_options::base64_default_accept_garbage); + while (length > 0 && + scalar::base64::is_ascii_white_space(input[length - 1])) { + length--; + } + size_t equallocation = + length; // location of the first padding character if any + size_t equalsigns = 0; + if (length > 0 && input[length - 1] == '=') { + equallocation = length - 1; + length -= 1; + equalsigns++; + while (length > 0 && + scalar::base64::is_ascii_white_space(input[length - 1])) { + length--; + } + if (length > 0 && input[length - 1] == '=') { + equallocation = length - 1; + equalsigns++; + length -= 1; + } + } + if (length == 0) { + if (!ignore_garbage && equalsigns > 0) { + return {INVALID_BASE64_CHARACTER, equallocation}; + } + return {SUCCESS, 0}; + } + result r = scalar::base64::base64_tail_decode( + output, input, length, equalsigns, options, last_chunk_options); + if (last_chunk_options != stop_before_partial && + r.error == error_code::SUCCESS && equalsigns > 0 && !ignore_garbage) { + // additional checks + if ((r.count % 3 == 0) || ((r.count % 3) + 1 + equalsigns != 4)) { + return {INVALID_BASE64_CHARACTER, equallocation}; + } + } + return r; +} + +simdutf_warn_unused full_result implementation::base64_to_binary_details( + const char16_t *input, size_t length, char *output, base64_options options, + last_chunk_handling_options last_chunk_options) const noexcept { + const bool ignore_garbage = + (options == base64_options::base64_url_accept_garbage) || + (options == base64_options::base64_default_accept_garbage); + while (length > 0 && + scalar::base64::is_ascii_white_space(input[length - 1])) { + length--; + } + size_t equallocation = + length; // location of the first padding character if any + size_t equalsigns = 0; + if (length > 0 && input[length - 1] == '=') { + equallocation = length - 1; + length -= 1; + equalsigns++; + while (length > 0 && + scalar::base64::is_ascii_white_space(input[length - 1])) { + length--; + } + if (length > 0 && input[length - 1] == '=') { + equallocation = length - 1; + equalsigns++; + length -= 1; + } + } + if (length == 0) { + if (!ignore_garbage && equalsigns > 0) { + return {INVALID_BASE64_CHARACTER, equallocation, 0}; + } + return {SUCCESS, 0, 0}; + } + full_result r = scalar::base64::base64_tail_decode( + output, input, length, equalsigns, options, last_chunk_options); + if (last_chunk_options != stop_before_partial && + r.error == error_code::SUCCESS && equalsigns > 0 && !ignore_garbage) { + // additional checks + if ((r.output_count % 3 == 0) || + ((r.output_count % 3) + 1 + equalsigns != 4)) { + return {INVALID_BASE64_CHARACTER, equallocation, r.output_count}; + } + } + return r; +} -// 1 byte for length, 16 bytes for mask -const uint8_t pack_1_2_3_utf8_bytes[256][17] = { - {12, 2, 3, 1, 6, 7, 5, 10, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80}, - {9, 6, 7, 5, 10, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {11, 3, 1, 6, 7, 5, 10, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80}, - {10, 0, 6, 7, 5, 10, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {9, 2, 3, 1, 10, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {6, 10, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {8, 3, 1, 10, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {7, 0, 10, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {11, 2, 3, 1, 7, 5, 10, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80}, - {8, 7, 5, 10, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {10, 3, 1, 7, 5, 10, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {9, 0, 7, 5, 10, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {10, 2, 3, 1, 4, 10, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {7, 4, 10, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {9, 3, 1, 4, 10, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {8, 0, 4, 10, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {9, 2, 3, 1, 6, 7, 5, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {6, 6, 7, 5, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {8, 3, 1, 6, 7, 5, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {7, 0, 6, 7, 5, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {6, 2, 3, 1, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {3, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80}, - {5, 3, 1, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {4, 0, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80}, - {8, 2, 3, 1, 7, 5, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {5, 7, 5, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {7, 3, 1, 7, 5, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {6, 0, 7, 5, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {7, 2, 3, 1, 4, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {4, 4, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80}, - {6, 3, 1, 4, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {5, 0, 4, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {11, 2, 3, 1, 6, 7, 5, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80}, - {8, 6, 7, 5, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {10, 3, 1, 6, 7, 5, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {9, 0, 6, 7, 5, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {8, 2, 3, 1, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {5, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {7, 3, 1, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {6, 0, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {10, 2, 3, 1, 7, 5, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {7, 7, 5, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {9, 3, 1, 7, 5, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {8, 0, 7, 5, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {9, 2, 3, 1, 4, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {6, 4, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {8, 3, 1, 4, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {7, 0, 4, 11, 9, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {10, 2, 3, 1, 6, 7, 5, 8, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {7, 6, 7, 5, 8, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {9, 3, 1, 6, 7, 5, 8, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {8, 0, 6, 7, 5, 8, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {7, 2, 3, 1, 8, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {4, 8, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80}, - {6, 3, 1, 8, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {5, 0, 8, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {9, 2, 3, 1, 7, 5, 8, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {6, 7, 5, 8, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {8, 3, 1, 7, 5, 8, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {7, 0, 7, 5, 8, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {8, 2, 3, 1, 4, 8, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {5, 4, 8, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {7, 3, 1, 4, 8, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {6, 0, 4, 8, 14, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {9, 2, 3, 1, 6, 7, 5, 10, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {6, 6, 7, 5, 10, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {8, 3, 1, 6, 7, 5, 10, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {7, 0, 6, 7, 5, 10, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {6, 2, 3, 1, 10, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {3, 10, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80}, - {5, 3, 1, 10, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {4, 0, 10, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80}, - {8, 2, 3, 1, 7, 5, 10, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {5, 7, 5, 10, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {7, 3, 1, 7, 5, 10, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {6, 0, 7, 5, 10, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {7, 2, 3, 1, 4, 10, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {4, 4, 10, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80}, - {6, 3, 1, 4, 10, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {5, 0, 4, 10, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {6, 2, 3, 1, 6, 7, 5, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {3, 6, 7, 5, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80}, - {5, 3, 1, 6, 7, 5, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {4, 0, 6, 7, 5, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {3, 2, 3, 1, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80}, - {0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80}, - {2, 3, 1, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80}, - {1, 0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80}, - {5, 2, 3, 1, 7, 5, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {2, 7, 5, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80}, - {4, 3, 1, 7, 5, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {3, 0, 7, 5, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80}, - {4, 2, 3, 1, 4, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {1, 4, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80}, - {3, 3, 1, 4, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80}, - {2, 0, 4, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80}, - {8, 2, 3, 1, 6, 7, 5, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {5, 6, 7, 5, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {7, 3, 1, 6, 7, 5, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {6, 0, 6, 7, 5, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {5, 2, 3, 1, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {2, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80}, - {4, 3, 1, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {3, 0, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80}, - {7, 2, 3, 1, 7, 5, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {4, 7, 5, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {6, 3, 1, 7, 5, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {5, 0, 7, 5, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {6, 2, 3, 1, 4, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {3, 4, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80}, - {5, 3, 1, 4, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {4, 0, 4, 11, 9, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {7, 2, 3, 1, 6, 7, 5, 8, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {4, 6, 7, 5, 8, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {6, 3, 1, 6, 7, 5, 8, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {5, 0, 6, 7, 5, 8, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {4, 2, 3, 1, 8, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {1, 8, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80}, - {3, 3, 1, 8, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80}, - {2, 0, 8, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80}, - {6, 2, 3, 1, 7, 5, 8, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {3, 7, 5, 8, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80}, - {5, 3, 1, 7, 5, 8, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {4, 0, 7, 5, 8, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {5, 2, 3, 1, 4, 8, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {2, 4, 8, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80}, - {4, 3, 1, 4, 8, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {3, 0, 4, 8, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80}, - {11, 2, 3, 1, 6, 7, 5, 10, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80}, - {8, 6, 7, 5, 10, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {10, 3, 1, 6, 7, 5, 10, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {9, 0, 6, 7, 5, 10, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {8, 2, 3, 1, 10, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {5, 10, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {7, 3, 1, 10, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {6, 0, 10, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {10, 2, 3, 1, 7, 5, 10, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {7, 7, 5, 10, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {9, 3, 1, 7, 5, 10, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {8, 0, 7, 5, 10, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {9, 2, 3, 1, 4, 10, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {6, 4, 10, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {8, 3, 1, 4, 10, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {7, 0, 4, 10, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {8, 2, 3, 1, 6, 7, 5, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {5, 6, 7, 5, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {7, 3, 1, 6, 7, 5, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {6, 0, 6, 7, 5, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {5, 2, 3, 1, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {2, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80}, - {4, 3, 1, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80}, - {3, 0, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80}, - {7, 2, 3, 1, 7, 5, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {4, 7, 5, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80}, - {6, 3, 1, 7, 5, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {5, 0, 7, 5, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {6, 2, 3, 1, 4, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {3, 4, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80}, - {5, 3, 1, 4, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {4, 0, 4, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80}, - {10, 2, 3, 1, 6, 7, 5, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {7, 6, 7, 5, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {9, 3, 1, 6, 7, 5, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {8, 0, 6, 7, 5, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {7, 2, 3, 1, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {4, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80}, - {6, 3, 1, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {5, 0, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {9, 2, 3, 1, 7, 5, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {6, 7, 5, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {8, 3, 1, 7, 5, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {7, 0, 7, 5, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {8, 2, 3, 1, 4, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {5, 4, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {7, 3, 1, 4, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {6, 0, 4, 11, 9, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {9, 2, 3, 1, 6, 7, 5, 8, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {6, 6, 7, 5, 8, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {8, 3, 1, 6, 7, 5, 8, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {7, 0, 6, 7, 5, 8, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {6, 2, 3, 1, 8, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {3, 8, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80}, - {5, 3, 1, 8, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {4, 0, 8, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80}, - {8, 2, 3, 1, 7, 5, 8, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {5, 7, 5, 8, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {7, 3, 1, 7, 5, 8, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {6, 0, 7, 5, 8, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {7, 2, 3, 1, 4, 8, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {4, 4, 8, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80}, - {6, 3, 1, 4, 8, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {5, 0, 4, 8, 15, 13, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {10, 2, 3, 1, 6, 7, 5, 10, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {7, 6, 7, 5, 10, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {9, 3, 1, 6, 7, 5, 10, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {8, 0, 6, 7, 5, 10, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {7, 2, 3, 1, 10, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {4, 10, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80}, - {6, 3, 1, 10, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {5, 0, 10, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {9, 2, 3, 1, 7, 5, 10, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {6, 7, 5, 10, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {8, 3, 1, 7, 5, 10, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {7, 0, 7, 5, 10, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {8, 2, 3, 1, 4, 10, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {5, 4, 10, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {7, 3, 1, 4, 10, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {6, 0, 4, 10, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {7, 2, 3, 1, 6, 7, 5, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {4, 6, 7, 5, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {6, 3, 1, 6, 7, 5, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {5, 0, 6, 7, 5, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {4, 2, 3, 1, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {1, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80}, - {3, 3, 1, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80}, - {2, 0, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80}, - {6, 2, 3, 1, 7, 5, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {3, 7, 5, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80}, - {5, 3, 1, 7, 5, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {4, 0, 7, 5, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {5, 2, 3, 1, 4, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {2, 4, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80}, - {4, 3, 1, 4, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {3, 0, 4, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80}, - {9, 2, 3, 1, 6, 7, 5, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}, - {6, 6, 7, 5, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {8, 3, 1, 6, 7, 5, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {7, 0, 6, 7, 5, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {6, 2, 3, 1, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {3, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80}, - {5, 3, 1, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {4, 0, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80}, - {8, 2, 3, 1, 7, 5, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {5, 7, 5, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {7, 3, 1, 7, 5, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {6, 0, 7, 5, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {7, 2, 3, 1, 4, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {4, 4, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80}, - {6, 3, 1, 4, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {5, 0, 4, 11, 9, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {8, 2, 3, 1, 6, 7, 5, 8, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {5, 6, 7, 5, 8, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {7, 3, 1, 6, 7, 5, 8, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {6, 0, 6, 7, 5, 8, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {5, 2, 3, 1, 8, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {2, 8, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80}, - {4, 3, 1, 8, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {3, 0, 8, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80}, - {7, 2, 3, 1, 7, 5, 8, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {4, 7, 5, 8, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {6, 3, 1, 7, 5, 8, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {5, 0, 7, 5, 8, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {6, 2, 3, 1, 4, 8, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80}, - {3, 4, 8, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80}, - {5, 3, 1, 4, 8, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}, - {4, 0, 4, 8, 12, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80}}; +simdutf_warn_unused size_t implementation::base64_length_from_binary( + size_t length, base64_options options) const noexcept { + return scalar::base64::base64_length_from_binary(length, options); +} -} // namespace utf16_to_utf8 -} // namespace tables -} // unnamed namespace +size_t implementation::binary_to_base64(const char *input, size_t length, + char *output, + base64_options options) const noexcept { + return scalar::base64::tail_encode_base64(output, input, length, options); +} +} // namespace fallback } // namespace simdutf -#endif // SIMDUTF_UTF16_TO_UTF8_TABLES_H -/* end file src/tables/utf16_to_utf8_tables.h */ -// End of tables. +/* begin file src/simdutf/fallback/end.h */ +/* end file src/simdutf/fallback/end.h */ +/* end file src/fallback/implementation.cpp */ +#endif +#if SIMDUTF_IMPLEMENTATION_ICELAKE +/* begin file src/icelake/implementation.cpp */ + -// The scalar routines should be included once. -/* begin file src/scalar/ascii.h */ -#ifndef SIMDUTF_ASCII_H -#define SIMDUTF_ASCII_H +/* begin file src/simdutf/icelake/begin.h */ +// redefining SIMDUTF_IMPLEMENTATION to "icelake" +// #define SIMDUTF_IMPLEMENTATION icelake + +#if SIMDUTF_CAN_ALWAYS_RUN_ICELAKE +// nothing needed. +#else +SIMDUTF_TARGET_ICELAKE +#endif +#if SIMDUTF_GCC11ORMORE // workaround for + // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105593 +// clang-format off +SIMDUTF_DISABLE_GCC_WARNING(-Wmaybe-uninitialized) +// clang-format on +#endif // end of workaround +/* end file src/simdutf/icelake/begin.h */ namespace simdutf { -namespace scalar { +namespace icelake { namespace { -namespace ascii { -#if SIMDUTF_IMPLEMENTATION_FALLBACK -// Only used by the fallback kernel. -inline simdutf_warn_unused bool validate(const char *buf, size_t len) noexcept { - const uint8_t *data = reinterpret_cast(buf); - uint64_t pos = 0; - // process in blocks of 16 bytes when possible - for (; pos + 16 <= len; pos += 16) { - uint64_t v1; - std::memcpy(&v1, data + pos, sizeof(uint64_t)); - uint64_t v2; - std::memcpy(&v2, data + pos + sizeof(uint64_t), sizeof(uint64_t)); - uint64_t v{v1 | v2}; - if ((v & 0x8080808080808080) != 0) { +#ifndef SIMDUTF_ICELAKE_H + #error "icelake.h must be included" +#endif +/* begin file src/icelake/icelake_utf8_common.inl.cpp */ +// Common procedures for both validating and non-validating conversions from +// UTF-8. +enum block_processing_mode { SIMDUTF_FULL, SIMDUTF_TAIL }; + +using utf8_to_utf16_result = std::pair; +using utf8_to_utf32_result = std::pair; + +/* + process_block_utf8_to_utf16 converts up to 64 bytes from 'in' from UTF-8 + to UTF-16. When tail = SIMDUTF_FULL, then the full input buffer (64 bytes) + might be used. When tail = SIMDUTF_TAIL, we take into account 'gap' which + indicates how many input bytes are relevant. + + Returns true when the result is correct, otherwise it returns false. + + The provided in and out pointers are advanced according to how many input + bytes have been processed, upon success. +*/ +template +simdutf_really_inline bool +process_block_utf8_to_utf16(const char *&in, char16_t *&out, size_t gap) { + // constants + __m512i mask_identity = _mm512_set_epi8( + 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, + 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, + 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, + 8, 7, 6, 5, 4, 3, 2, 1, 0); + __m512i mask_c0c0c0c0 = _mm512_set1_epi32(0xc0c0c0c0); + __m512i mask_80808080 = _mm512_set1_epi32(0x80808080); + __m512i mask_f0f0f0f0 = _mm512_set1_epi32(0xf0f0f0f0); + __m512i mask_dfdfdfdf_tail = _mm512_set_epi64( + 0xffffdfdfdfdfdfdf, 0xdfdfdfdfdfdfdfdf, 0xdfdfdfdfdfdfdfdf, + 0xdfdfdfdfdfdfdfdf, 0xdfdfdfdfdfdfdfdf, 0xdfdfdfdfdfdfdfdf, + 0xdfdfdfdfdfdfdfdf, 0xdfdfdfdfdfdfdfdf); + __m512i mask_c2c2c2c2 = _mm512_set1_epi32(0xc2c2c2c2); + __m512i mask_ffffffff = _mm512_set1_epi32(0xffffffff); + __m512i mask_d7c0d7c0 = _mm512_set1_epi32(0xd7c0d7c0); + __m512i mask_dc00dc00 = _mm512_set1_epi32(0xdc00dc00); + __m512i byteflip = _mm512_setr_epi64(0x0607040502030001, 0x0e0f0c0d0a0b0809, + 0x0607040502030001, 0x0e0f0c0d0a0b0809, + 0x0607040502030001, 0x0e0f0c0d0a0b0809, + 0x0607040502030001, 0x0e0f0c0d0a0b0809); + // Note that 'tail' is a compile-time constant ! + __mmask64 b = + (tail == SIMDUTF_FULL) ? 0xFFFFFFFFFFFFFFFF : (uint64_t(1) << gap) - 1; + __m512i input = (tail == SIMDUTF_FULL) ? _mm512_loadu_si512(in) + : _mm512_maskz_loadu_epi8(b, in); + __mmask64 m1 = (tail == SIMDUTF_FULL) + ? _mm512_cmplt_epu8_mask(input, mask_80808080) + : _mm512_mask_cmplt_epu8_mask(b, input, mask_80808080); + if (_ktestc_mask64_u8(m1, + b)) { // NOT(m1) AND b -- if all zeroes, then all ASCII + // alternatively, we could do 'if (m1 == b) { ' + if (tail == SIMDUTF_FULL) { + in += 64; // consumed 64 bytes + // we convert a full 64-byte block, writing 128 bytes. + __m512i input1 = _mm512_cvtepu8_epi16(_mm512_castsi512_si256(input)); + if (big_endian) { + input1 = _mm512_shuffle_epi8(input1, byteflip); + } + _mm512_storeu_si512(out, input1); + out += 32; + __m512i input2 = + _mm512_cvtepu8_epi16(_mm512_extracti64x4_epi64(input, 1)); + if (big_endian) { + input2 = _mm512_shuffle_epi8(input2, byteflip); + } + _mm512_storeu_si512(out, input2); + out += 32; + return true; // we are done + } else { + in += gap; + if (gap <= 32) { + __m512i input1 = _mm512_cvtepu8_epi16(_mm512_castsi512_si256(input)); + if (big_endian) { + input1 = _mm512_shuffle_epi8(input1, byteflip); + } + _mm512_mask_storeu_epi16(out, __mmask32((uint64_t(1) << (gap)) - 1), + input1); + out += gap; + } else { + __m512i input1 = _mm512_cvtepu8_epi16(_mm512_castsi512_si256(input)); + if (big_endian) { + input1 = _mm512_shuffle_epi8(input1, byteflip); + } + _mm512_storeu_si512(out, input1); + out += 32; + __m512i input2 = + _mm512_cvtepu8_epi16(_mm512_extracti64x4_epi64(input, 1)); + if (big_endian) { + input2 = _mm512_shuffle_epi8(input2, byteflip); + } + _mm512_mask_storeu_epi16( + out, __mmask32((uint32_t(1) << (gap - 32)) - 1), input2); + out += gap - 32; + } + return true; // we are done + } + } + // classify characters further + __mmask64 m234 = _mm512_cmp_epu8_mask( + mask_c0c0c0c0, input, + _MM_CMPINT_LE); // 0xc0 <= input, 2, 3, or 4 leading byte + __mmask64 m34 = + _mm512_cmp_epu8_mask(mask_dfdfdfdf_tail, input, + _MM_CMPINT_LT); // 0xdf < input, 3 or 4 leading byte + + __mmask64 milltwobytes = _mm512_mask_cmp_epu8_mask( + m234, input, mask_c2c2c2c2, + _MM_CMPINT_LT); // 0xc0 <= input < 0xc2 (illegal two byte sequence) + // Overlong 2-byte sequence + if (_ktestz_mask64_u8(milltwobytes, milltwobytes) == 0) { + // Overlong 2-byte sequence + return false; + } + if (_ktestz_mask64_u8(m34, m34) == 0) { + // We have a 3-byte sequence and/or a 2-byte sequence, or possibly even a + // 4-byte sequence! + __mmask64 m4 = _mm512_cmp_epu8_mask( + input, mask_f0f0f0f0, + _MM_CMPINT_NLT); // 0xf0 <= zmm0 (4 byte start bytes) + + __mmask64 mask_not_ascii = (tail == SIMDUTF_FULL) + ? _knot_mask64(m1) + : _kand_mask64(_knot_mask64(m1), b); + + __mmask64 mp1 = _kshiftli_mask64(m234, 1); + __mmask64 mp2 = _kshiftli_mask64(m34, 2); + // We could do it as follows... + // if (_kortestz_mask64_u8(m4,m4)) { // compute the bitwise OR of the 64-bit + // masks a and b and return 1 if all zeroes but GCC generates better code + // when we do: + if (m4 == 0) { // compute the bitwise OR of the 64-bit masks a and b and + // return 1 if all zeroes + // Fast path with 1,2,3 bytes + __mmask64 mc = _kor_mask64(mp1, mp2); // expected continuation bytes + __mmask64 m1234 = _kor_mask64(m1, m234); + // mismatched continuation bytes: + if (tail == SIMDUTF_FULL) { + __mmask64 xnormcm1234 = _kxnor_mask64( + mc, + m1234); // XNOR of mc and m1234 should be all zero if they differ + // the presence of a 1 bit indicates that they overlap. + // _kortestz_mask64_u8: compute the bitwise OR of 64-bit masksand return + // 1 if all zeroes. + if (!_kortestz_mask64_u8(xnormcm1234, xnormcm1234)) { + return false; + } + } else { + __mmask64 bxorm1234 = _kxor_mask64(b, m1234); + if (mc != bxorm1234) { + return false; + } + } + // mend: identifying the last bytes of each sequence to be decoded + __mmask64 mend = _kshiftri_mask64(m1234, 1); + if (tail != SIMDUTF_FULL) { + mend = _kor_mask64(mend, (uint64_t(1) << (gap - 1))); + } + + __m512i last_and_third = _mm512_maskz_compress_epi8(mend, mask_identity); + __m512i last_and_thirdu16 = + _mm512_cvtepu8_epi16(_mm512_castsi512_si256(last_and_third)); + + __m512i nonasciitags = _mm512_maskz_mov_epi8( + mask_not_ascii, mask_c0c0c0c0); // ASCII: 00000000 other: 11000000 + __m512i clearedbytes = _mm512_andnot_si512( + nonasciitags, input); // high two bits cleared where not ASCII + __m512i lastbytes = _mm512_maskz_permutexvar_epi8( + 0x5555555555555555, last_and_thirdu16, + clearedbytes); // the last byte of each character + + __mmask64 mask_before_non_ascii = _kshiftri_mask64( + mask_not_ascii, 1); // bytes that precede non-ASCII bytes + __m512i indexofsecondlastbytes = _mm512_add_epi16( + mask_ffffffff, last_and_thirdu16); // indices of the second last bytes + __m512i beforeasciibytes = + _mm512_maskz_mov_epi8(mask_before_non_ascii, clearedbytes); + __m512i secondlastbytes = _mm512_maskz_permutexvar_epi8( + 0x5555555555555555, indexofsecondlastbytes, + beforeasciibytes); // the second last bytes (of two, three byte seq, + // surrogates) + secondlastbytes = + _mm512_slli_epi16(secondlastbytes, 6); // shifted into position + + __m512i indexofthirdlastbytes = _mm512_add_epi16( + mask_ffffffff, + indexofsecondlastbytes); // indices of the second last bytes + __m512i thirdlastbyte = + _mm512_maskz_mov_epi8(m34, + clearedbytes); // only those that are the third + // last byte of a sequence + __m512i thirdlastbytes = _mm512_maskz_permutexvar_epi8( + 0x5555555555555555, indexofthirdlastbytes, + thirdlastbyte); // the third last bytes (of three byte sequences, hi + // surrogate) + thirdlastbytes = + _mm512_slli_epi16(thirdlastbytes, 12); // shifted into position + __m512i Wout = _mm512_ternarylogic_epi32(lastbytes, secondlastbytes, + thirdlastbytes, 254); + // the elements of Wout excluding the last element if it happens to be a + // high surrogate: + + __mmask64 mprocessed = + (tail == SIMDUTF_FULL) + ? _pdep_u64(0xFFFFFFFF, mend) + : _pdep_u64( + 0xFFFFFFFF, + _kand_mask64( + mend, b)); // we adjust mend at the end of the output. + + // Encodings out of range... + { + // the location of 3-byte sequence start bytes in the input + __mmask64 m3 = m34 & (b ^ m4); + // code units in Wout corresponding to 3-byte sequences. + __mmask32 M3 = __mmask32(_pext_u64(m3 << 2, mend)); + __m512i mask_08000800 = _mm512_set1_epi32(0x08000800); + __mmask32 Msmall800 = + _mm512_mask_cmplt_epu16_mask(M3, Wout, mask_08000800); + __m512i mask_d800d800 = _mm512_set1_epi32(0xd800d800); + __m512i Moutminusd800 = _mm512_sub_epi16(Wout, mask_d800d800); + __mmask32 M3s = + _mm512_mask_cmplt_epu16_mask(M3, Moutminusd800, mask_08000800); + if (_kor_mask32(Msmall800, M3s)) { + return false; + } + } + int64_t nout = _mm_popcnt_u64(mprocessed); + in += 64 - _lzcnt_u64(mprocessed); + if (big_endian) { + Wout = _mm512_shuffle_epi8(Wout, byteflip); + } + _mm512_mask_storeu_epi16(out, __mmask32((uint64_t(1) << nout) - 1), Wout); + out += nout; + return true; // ok + } + // + // We have a 4-byte sequence, this is the general case. + // Slow! + __mmask64 mp3 = _kshiftli_mask64(m4, 3); + __mmask64 mc = + _kor_mask64(_kor_mask64(mp1, mp2), mp3); // expected continuation bytes + __mmask64 m1234 = _kor_mask64(m1, m234); + + // mend: identifying the last bytes of each sequence to be decoded + __mmask64 mend = + _kor_mask64(_kshiftri_mask64(_kor_mask64(mp3, m1234), 1), mp3); + if (tail != SIMDUTF_FULL) { + mend = _kor_mask64(mend, __mmask64(uint64_t(1) << (gap - 1))); + } + __m512i last_and_third = _mm512_maskz_compress_epi8(mend, mask_identity); + __m512i last_and_thirdu16 = + _mm512_cvtepu8_epi16(_mm512_castsi512_si256(last_and_third)); + + __m512i nonasciitags = _mm512_maskz_mov_epi8( + mask_not_ascii, mask_c0c0c0c0); // ASCII: 00000000 other: 11000000 + __m512i clearedbytes = _mm512_andnot_si512( + nonasciitags, input); // high two bits cleared where not ASCII + __m512i lastbytes = _mm512_maskz_permutexvar_epi8( + 0x5555555555555555, last_and_thirdu16, + clearedbytes); // the last byte of each character + + __mmask64 mask_before_non_ascii = _kshiftri_mask64( + mask_not_ascii, 1); // bytes that precede non-ASCII bytes + __m512i indexofsecondlastbytes = _mm512_add_epi16( + mask_ffffffff, last_and_thirdu16); // indices of the second last bytes + __m512i beforeasciibytes = + _mm512_maskz_mov_epi8(mask_before_non_ascii, clearedbytes); + __m512i secondlastbytes = _mm512_maskz_permutexvar_epi8( + 0x5555555555555555, indexofsecondlastbytes, + beforeasciibytes); // the second last bytes (of two, three byte seq, + // surrogates) + secondlastbytes = + _mm512_slli_epi16(secondlastbytes, 6); // shifted into position + + __m512i indexofthirdlastbytes = _mm512_add_epi16( + mask_ffffffff, + indexofsecondlastbytes); // indices of the second last bytes + __m512i thirdlastbyte = _mm512_maskz_mov_epi8( + m34, + clearedbytes); // only those that are the third last byte of a sequence + __m512i thirdlastbytes = _mm512_maskz_permutexvar_epi8( + 0x5555555555555555, indexofthirdlastbytes, + thirdlastbyte); // the third last bytes (of three byte sequences, hi + // surrogate) + thirdlastbytes = + _mm512_slli_epi16(thirdlastbytes, 12); // shifted into position + __m512i thirdsecondandlastbytes = _mm512_ternarylogic_epi32( + lastbytes, secondlastbytes, thirdlastbytes, 254); + uint64_t Mlo_uint64 = _pext_u64(mp3, mend); + __mmask32 Mlo = __mmask32(Mlo_uint64); + __mmask32 Mhi = __mmask32(Mlo_uint64 >> 1); + __m512i lo_surr_mask = _mm512_maskz_mov_epi16( + Mlo, + mask_dc00dc00); // lo surr: 1101110000000000, other: 0000000000000000 + __m512i shifted4_thirdsecondandlastbytes = + _mm512_srli_epi16(thirdsecondandlastbytes, + 4); // hi surr: 00000WVUTSRQPNML vuts = WVUTS - 1 + __m512i tagged_lo_surrogates = _mm512_or_si512( + thirdsecondandlastbytes, + lo_surr_mask); // lo surr: 110111KJHGFEDCBA, other: unchanged + __m512i Wout = _mm512_mask_add_epi16( + tagged_lo_surrogates, Mhi, shifted4_thirdsecondandlastbytes, + mask_d7c0d7c0); // hi sur: 110110vutsRQPNML, other: unchanged + // the elements of Wout excluding the last element if it happens to be a + // high surrogate: + __mmask32 Mout = ~(Mhi & 0x80000000); + __mmask64 mprocessed = + (tail == SIMDUTF_FULL) + ? _pdep_u64(Mout, mend) + : _pdep_u64( + Mout, + _kand_mask64(mend, + b)); // we adjust mend at the end of the output. + + // mismatched continuation bytes: + if (tail == SIMDUTF_FULL) { + __mmask64 xnormcm1234 = _kxnor_mask64( + mc, m1234); // XNOR of mc and m1234 should be all zero if they differ + // the presence of a 1 bit indicates that they overlap. + // _kortestz_mask64_u8: compute the bitwise OR of 64-bit masksand return 1 + // if all zeroes. + if (!_kortestz_mask64_u8(xnormcm1234, xnormcm1234)) { + return false; + } + } else { + __mmask64 bxorm1234 = _kxor_mask64(b, m1234); + if (mc != bxorm1234) { + return false; + } + } + // Encodings out of range... + { + // the location of 3-byte sequence start bytes in the input + __mmask64 m3 = m34 & (b ^ m4); + // code units in Wout corresponding to 3-byte sequences. + __mmask32 M3 = __mmask32(_pext_u64(m3 << 2, mend)); + __m512i mask_08000800 = _mm512_set1_epi32(0x08000800); + __mmask32 Msmall800 = + _mm512_mask_cmplt_epu16_mask(M3, Wout, mask_08000800); + __m512i mask_d800d800 = _mm512_set1_epi32(0xd800d800); + __m512i Moutminusd800 = _mm512_sub_epi16(Wout, mask_d800d800); + __mmask32 M3s = + _mm512_mask_cmplt_epu16_mask(M3, Moutminusd800, mask_08000800); + __m512i mask_04000400 = _mm512_set1_epi32(0x04000400); + __mmask32 M4s = + _mm512_mask_cmpge_epu16_mask(Mhi, Moutminusd800, mask_04000400); + if (!_kortestz_mask32_u8(M4s, _kor_mask32(Msmall800, M3s))) { + return false; + } + } + in += 64 - _lzcnt_u64(mprocessed); + int64_t nout = _mm_popcnt_u64(mprocessed); + if (big_endian) { + Wout = _mm512_shuffle_epi8(Wout, byteflip); + } + _mm512_mask_storeu_epi16(out, __mmask32((uint64_t(1) << nout) - 1), Wout); + out += nout; + return true; // ok + } + // Fast path 2: all ASCII or 2 byte + __mmask64 continuation_or_ascii = (tail == SIMDUTF_FULL) + ? _knot_mask64(m234) + : _kand_mask64(_knot_mask64(m234), b); + // on top of -0xc0 we subtract -2 which we get back later of the + // continuation byte tags + __m512i leading2byte = _mm512_maskz_sub_epi8(m234, input, mask_c2c2c2c2); + __mmask64 leading = tail == (tail == SIMDUTF_FULL) + ? _kor_mask64(m1, m234) + : _kand_mask64(_kor_mask64(m1, m234), + b); // first bytes of each sequence + if (tail == SIMDUTF_FULL) { + __mmask64 xnor234leading = + _kxnor_mask64(_kshiftli_mask64(m234, 1), leading); + if (!_kortestz_mask64_u8(xnor234leading, xnor234leading)) { + return false; + } + } else { + __mmask64 bxorleading = _kxor_mask64(b, leading); + if (_kshiftli_mask64(m234, 1) != bxorleading) { return false; } } - // process the tail byte-by-byte - for (; pos < len; pos++) { - if (data[pos] >= 0b10000000) { - return false; + // + if (tail == SIMDUTF_FULL) { + // In the two-byte/ASCII scenario, we are easily latency bound, so we want + // to increment the input buffer as quickly as possible. + // We process 32 bytes unless the byte at index 32 is a continuation byte, + // in which case we include it as well for a total of 33 bytes. + // Note that if x is an ASCII byte, then the following is false: + // int8_t(x) <= int8_t(0xc0) under two's complement. + in += 32; + if (int8_t(*in) <= int8_t(0xc0)) + in++; + // The alternative is to do + // in += 64 - _lzcnt_u64(_pdep_u64(0xFFFFFFFF, continuation_or_ascii)); + // but it requires loading the input, doing the mask computation, and + // converting back the mask to a general register. It just takes too long, + // leaving the processor likely to be idle. + } else { + in += 64 - _lzcnt_u64(_pdep_u64(0xFFFFFFFF, continuation_or_ascii)); + } + __m512i lead = _mm512_maskz_compress_epi8( + leading, leading2byte); // will contain zero for ascii, and the data + lead = _mm512_cvtepu8_epi16( + _mm512_castsi512_si256(lead)); // ... zero extended into code units + __m512i follow = _mm512_maskz_compress_epi8( + continuation_or_ascii, input); // the last bytes of each sequence + follow = _mm512_cvtepu8_epi16( + _mm512_castsi512_si256(follow)); // ... zero extended into code units + lead = _mm512_slli_epi16(lead, 6); // shifted into position + __m512i final = _mm512_add_epi16(follow, lead); // combining lead and follow + + if (big_endian) { + final = _mm512_shuffle_epi8(final, byteflip); + } + if (tail == SIMDUTF_FULL) { + // Next part is UTF-16 specific and can be generalized to UTF-32. + int nout = _mm_popcnt_u32(uint32_t(leading)); + _mm512_mask_storeu_epi16(out, __mmask32((uint64_t(1) << nout) - 1), final); + out += nout; // UTF-8 to UTF-16 is only expansionary in this case. + } else { + int nout = int(_mm_popcnt_u64(_pdep_u64(0xFFFFFFFF, leading))); + _mm512_mask_storeu_epi16(out, __mmask32((uint64_t(1) << nout) - 1), final); + out += nout; // UTF-8 to UTF-16 is only expansionary in this case. + } + + return true; // we are fine. +} + +/* + utf32_to_utf16_masked converts `count` lower UTF-32 code units + from input `utf32` into UTF-16. It differs from utf32_to_utf16 + in that it 'masks' the writes. + + Returns how many 16-bit code units were stored. + + byteflip is used for flipping 16-bit code units, and it should be + __m512i byteflip = _mm512_setr_epi64( + 0x0607040502030001, + 0x0e0f0c0d0a0b0809, + 0x0607040502030001, + 0x0e0f0c0d0a0b0809, + 0x0607040502030001, + 0x0e0f0c0d0a0b0809, + 0x0607040502030001, + 0x0e0f0c0d0a0b0809 + ); + We pass it to the (always inlined) function to encourage the compiler to + keep the value in a (constant) register. +*/ +template +simdutf_really_inline size_t utf32_to_utf16_masked(const __m512i byteflip, + __m512i utf32, + unsigned int count, + char16_t *output) { + + const __mmask16 valid = uint16_t((1 << count) - 1); + // 1. check if we have any surrogate pairs + const __m512i v_0000_ffff = _mm512_set1_epi32(0x0000ffff); + const __mmask16 sp_mask = + _mm512_mask_cmpgt_epu32_mask(valid, utf32, v_0000_ffff); + + if (sp_mask == 0) { + if (big_endian) { + _mm256_mask_storeu_epi16( + (__m256i *)output, valid, + _mm256_shuffle_epi8(_mm512_cvtepi32_epi16(utf32), + _mm512_castsi512_si256(byteflip))); + + } else { + _mm256_mask_storeu_epi16((__m256i *)output, valid, + _mm512_cvtepi32_epi16(utf32)); + } + return count; + } + + { + // build surrogate pair code units in 32-bit lanes + + // t0 = 8 x [000000000000aaaa|aaaaaabbbbbbbbbb] + const __m512i v_0001_0000 = _mm512_set1_epi32(0x00010000); + const __m512i t0 = _mm512_sub_epi32(utf32, v_0001_0000); + + // t1 = 8 x [000000aaaaaaaaaa|bbbbbbbbbb000000] + const __m512i t1 = _mm512_slli_epi32(t0, 6); + + // t2 = 8 x [000000aaaaaaaaaa|aaaaaabbbbbbbbbb] -- copy hi word from t1 + // to t0 + // 0xe4 = (t1 and v_ffff_0000) or (t0 and not v_ffff_0000) + const __m512i v_ffff_0000 = _mm512_set1_epi32(0xffff0000); + const __m512i t2 = _mm512_ternarylogic_epi32(t1, t0, v_ffff_0000, 0xe4); + + // t2 = 8 x [110110aaaaaaaaaa|110111bbbbbbbbbb] -- copy hi word from t1 + // to t0 + // 0xba = (t2 and not v_fc00_fc000) or v_d800_dc00 + const __m512i v_fc00_fc00 = _mm512_set1_epi32(0xfc00fc00); + const __m512i v_d800_dc00 = _mm512_set1_epi32(0xd800dc00); + const __m512i t3 = + _mm512_ternarylogic_epi32(t2, v_fc00_fc00, v_d800_dc00, 0xba); + const __m512i t4 = _mm512_mask_blend_epi32(sp_mask, utf32, t3); + __m512i t5 = _mm512_ror_epi32(t4, 16); + // Here we want to trim all of the upper 16-bit code units from the 2-byte + // characters represented as 4-byte values. We can compute it from + // sp_mask or the following... It can be more optimized! + const __mmask32 nonzero = _kor_mask32( + 0xaaaaaaaa, _mm512_cmpneq_epi16_mask(t5, _mm512_setzero_si512())); + const __mmask32 nonzero_masked = + _kand_mask32(nonzero, __mmask32((uint64_t(1) << (2 * count)) - 1)); + if (big_endian) { + t5 = _mm512_shuffle_epi8(t5, byteflip); } + // we deliberately avoid _mm512_mask_compressstoreu_epi16 for portability + // (zen4) + __m512i compressed = _mm512_maskz_compress_epi16(nonzero_masked, t5); + _mm512_mask_storeu_epi16( + output, + (1 << (count + static_cast(count_ones(sp_mask)))) - 1, + compressed); + //_mm512_mask_compressstoreu_epi16(output, nonzero_masked, t5); } - return true; + + return count + static_cast(count_ones(sp_mask)); } -#endif -inline simdutf_warn_unused result validate_with_errors(const char *buf, - size_t len) noexcept { - const uint8_t *data = reinterpret_cast(buf); - size_t pos = 0; - // process in blocks of 16 bytes when possible - for (; pos + 16 <= len; pos += 16) { - uint64_t v1; - std::memcpy(&v1, data + pos, sizeof(uint64_t)); - uint64_t v2; - std::memcpy(&v2, data + pos + sizeof(uint64_t), sizeof(uint64_t)); - uint64_t v{v1 | v2}; - if ((v & 0x8080808080808080) != 0) { - for (; pos < len; pos++) { - if (data[pos] >= 0b10000000) { - return result(error_code::TOO_LARGE, pos); - } - } +/* + utf32_to_utf16 converts `count` lower UTF-32 code units + from input `utf32` into UTF-16. It may overflow. + + Returns how many 16-bit code units were stored. + + byteflip is used for flipping 16-bit code units, and it should be + __m512i byteflip = _mm512_setr_epi64( + 0x0607040502030001, + 0x0e0f0c0d0a0b0809, + 0x0607040502030001, + 0x0e0f0c0d0a0b0809, + 0x0607040502030001, + 0x0e0f0c0d0a0b0809, + 0x0607040502030001, + 0x0e0f0c0d0a0b0809 + ); + We pass it to the (always inlined) function to encourage the compiler to + keep the value in a (constant) register. +*/ +template +simdutf_really_inline size_t utf32_to_utf16(const __m512i byteflip, + __m512i utf32, unsigned int count, + char16_t *output) { + // check if we have any surrogate pairs + const __m512i v_0000_ffff = _mm512_set1_epi32(0x0000ffff); + const __mmask16 sp_mask = _mm512_cmpgt_epu32_mask(utf32, v_0000_ffff); + + if (sp_mask == 0) { + // technically, it should be _mm256_storeu_epi16 + if (big_endian) { + _mm256_storeu_si256( + (__m256i *)output, + _mm256_shuffle_epi8(_mm512_cvtepi32_epi16(utf32), + _mm512_castsi512_si256(byteflip))); + } else { + _mm256_storeu_si256((__m256i *)output, _mm512_cvtepi32_epi16(utf32)); } + return count; } - // process the tail byte-by-byte - for (; pos < len; pos++) { - if (data[pos] >= 0b10000000) { - return result(error_code::TOO_LARGE, pos); + + { + // build surrogate pair code units in 32-bit lanes + + // t0 = 8 x [000000000000aaaa|aaaaaabbbbbbbbbb] + const __m512i v_0001_0000 = _mm512_set1_epi32(0x00010000); + const __m512i t0 = _mm512_sub_epi32(utf32, v_0001_0000); + + // t1 = 8 x [000000aaaaaaaaaa|bbbbbbbbbb000000] + const __m512i t1 = _mm512_slli_epi32(t0, 6); + + // t2 = 8 x [000000aaaaaaaaaa|aaaaaabbbbbbbbbb] -- copy hi word from t1 + // to t0 + // 0xe4 = (t1 and v_ffff_0000) or (t0 and not v_ffff_0000) + const __m512i v_ffff_0000 = _mm512_set1_epi32(0xffff0000); + const __m512i t2 = _mm512_ternarylogic_epi32(t1, t0, v_ffff_0000, 0xe4); + + // t2 = 8 x [110110aaaaaaaaaa|110111bbbbbbbbbb] -- copy hi word from t1 + // to t0 + // 0xba = (t2 and not v_fc00_fc000) or v_d800_dc00 + const __m512i v_fc00_fc00 = _mm512_set1_epi32(0xfc00fc00); + const __m512i v_d800_dc00 = _mm512_set1_epi32(0xd800dc00); + const __m512i t3 = + _mm512_ternarylogic_epi32(t2, v_fc00_fc00, v_d800_dc00, 0xba); + const __m512i t4 = _mm512_mask_blend_epi32(sp_mask, utf32, t3); + __m512i t5 = _mm512_ror_epi32(t4, 16); + const __mmask32 nonzero = _kor_mask32( + 0xaaaaaaaa, _mm512_cmpneq_epi16_mask(t5, _mm512_setzero_si512())); + if (big_endian) { + t5 = _mm512_shuffle_epi8(t5, byteflip); } + // we deliberately avoid _mm512_mask_compressstoreu_epi16 for portability + // (zen4) + __m512i compressed = _mm512_maskz_compress_epi16(nonzero, t5); + _mm512_mask_storeu_epi16( + output, + (1 << (count + static_cast(count_ones(sp_mask)))) - 1, + compressed); + //_mm512_mask_compressstoreu_epi16(output, nonzero, t5); } - return result(error_code::SUCCESS, pos); + + return count + static_cast(count_ones(sp_mask)); } -} // namespace ascii -} // unnamed namespace -} // namespace scalar -} // namespace simdutf +/** + * Store the last N bytes of previous followed by 512-N bytes from input. + */ +template __m512i prev(__m512i input, __m512i previous) { + static_assert(N <= 32, "N must be no larger than 32"); + const __m512i movemask = + _mm512_setr_epi32(28, 29, 30, 31, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11); + const __m512i rotated = _mm512_permutex2var_epi32(input, movemask, previous); +#if SIMDUTF_GCC8 || SIMDUTF_GCC9 + constexpr int shift = 16 - N; // workaround for GCC8,9 + return _mm512_alignr_epi8(input, rotated, shift); +#else + return _mm512_alignr_epi8(input, rotated, 16 - N); +#endif // SIMDUTF_GCC8 || SIMDUTF_GCC9 +} -#endif -/* end file src/scalar/ascii.h */ -/* begin file src/scalar/latin1.h */ -#ifndef SIMDUTF_LATIN1_H -#define SIMDUTF_LATIN1_H +template +__m512i shuffle_epi128(__m512i v) { + static_assert((idx0 >= 0 && idx0 <= 3), "idx0 must be in range 0..3"); + static_assert((idx1 >= 0 && idx1 <= 3), "idx1 must be in range 0..3"); + static_assert((idx2 >= 0 && idx2 <= 3), "idx2 must be in range 0..3"); + static_assert((idx3 >= 0 && idx3 <= 3), "idx3 must be in range 0..3"); -namespace simdutf { -namespace scalar { -namespace { -namespace latin1 { + constexpr unsigned shuffle = idx0 | (idx1 << 2) | (idx2 << 4) | (idx3 << 6); + return _mm512_shuffle_i32x4(v, v, shuffle); +} -inline size_t utf32_length_from_latin1(size_t len) { - // We are not BOM aware. - return len; // a utf32 unit will always represent 1 latin1 character +template constexpr __m512i broadcast_epi128(__m512i v) { + return shuffle_epi128(v); } -inline size_t utf8_length_from_latin1(const char *buf, size_t len) { - const uint8_t *c = reinterpret_cast(buf); - size_t answer = 0; - for (size_t i = 0; i < len; i++) { - if ((c[i] >> 7)) { - answer++; - } +/** + * Current unused. + */ +template __m512i rotate_by_N_epi8(const __m512i input) { + + // lanes order: 1, 2, 3, 0 => 0b00_11_10_01 + const __m512i permuted = _mm512_shuffle_i32x4(input, input, 0x39); + + return _mm512_alignr_epi8(permuted, input, N); +} + +/* + expanded_utf8_to_utf32 converts expanded UTF-8 characters (`utf8`) + stored at separate 32-bit lanes. + + For each lane we have also a character class (`char_class), given in form + 0x8080800N, where N is 4 highest bits from the leading byte; 0x80 resets + corresponding bytes during pshufb. +*/ +simdutf_really_inline __m512i expanded_utf8_to_utf32(__m512i char_class, + __m512i utf8) { + /* + Input: + - utf8: bytes stored at separate 32-bit code units + - valid: which code units have valid UTF-8 characters + + Bit layout of single word. We show 4 cases for each possible + UTF-8 character encoding. The `?` denotes bits we must not + assume their value. + + |10dd.dddd|10cc.cccc|10bb.bbbb|1111.0aaa| 4-byte char + |????.????|10cc.cccc|10bb.bbbb|1110.aaaa| 3-byte char + |????.????|????.????|10bb.bbbb|110a.aaaa| 2-byte char + |????.????|????.????|????.????|0aaa.aaaa| ASCII char + byte 3 byte 2 byte 1 byte 0 + */ + + /* 1. Reset control bits of continuation bytes and the MSB + of the leading byte; this makes all bytes unsigned (and + does not alter ASCII char). + + |00dd.dddd|00cc.cccc|00bb.bbbb|0111.0aaa| 4-byte char + |00??.????|00cc.cccc|00bb.bbbb|0110.aaaa| 3-byte char + |00??.????|00??.????|00bb.bbbb|010a.aaaa| 2-byte char + |00??.????|00??.????|00??.????|0aaa.aaaa| ASCII char + ^^ ^^ ^^ ^ + */ + __m512i values; + const __m512i v_3f3f_3f7f = _mm512_set1_epi32(0x3f3f3f7f); + values = _mm512_and_si512(utf8, v_3f3f_3f7f); + + /* 2. Swap and join fields A-B and C-D + + |0000.cccc|ccdd.dddd|0001.110a|aabb.bbbb| 4-byte char + |0000.cccc|cc??.????|0001.10aa|aabb.bbbb| 3-byte char + |0000.????|????.????|0001.0aaa|aabb.bbbb| 2-byte char + |0000.????|????.????|000a.aaaa|aa??.????| ASCII char */ + const __m512i v_0140_0140 = _mm512_set1_epi32(0x01400140); + values = _mm512_maddubs_epi16(values, v_0140_0140); + + /* 3. Swap and join fields AB & CD + + |0000.0001|110a.aabb|bbbb.cccc|ccdd.dddd| 4-byte char + |0000.0001|10aa.aabb|bbbb.cccc|cc??.????| 3-byte char + |0000.0001|0aaa.aabb|bbbb.????|????.????| 2-byte char + |0000.000a|aaaa.aa??|????.????|????.????| ASCII char */ + const __m512i v_0001_1000 = _mm512_set1_epi32(0x00011000); + values = _mm512_madd_epi16(values, v_0001_1000); + + /* 4. Shift left the values by variable amounts to reset highest UTF-8 bits + |aaab.bbbb|bccc.cccd|dddd.d000|0000.0000| 4-byte char -- by 11 + |aaaa.bbbb|bbcc.cccc|????.??00|0000.0000| 3-byte char -- by 10 + |aaaa.abbb|bbb?.????|????.???0|0000.0000| 2-byte char -- by 9 + |aaaa.aaa?|????.????|????.????|?000.0000| ASCII char -- by 7 */ + { + /** pshufb + + continuation = 0 + ascii = 7 + _2_bytes = 9 + _3_bytes = 10 + _4_bytes = 11 + + shift_left_v3 = 4 * [ + ascii, # 0000 + ascii, # 0001 + ascii, # 0010 + ascii, # 0011 + ascii, # 0100 + ascii, # 0101 + ascii, # 0110 + ascii, # 0111 + continuation, # 1000 + continuation, # 1001 + continuation, # 1010 + continuation, # 1011 + _2_bytes, # 1100 + _2_bytes, # 1101 + _3_bytes, # 1110 + _4_bytes, # 1111 + ] */ + const __m512i shift_left_v3 = _mm512_setr_epi64( + 0x0707070707070707, 0x0b0a090900000000, 0x0707070707070707, + 0x0b0a090900000000, 0x0707070707070707, 0x0b0a090900000000, + 0x0707070707070707, 0x0b0a090900000000); + + const __m512i shift = _mm512_shuffle_epi8(shift_left_v3, char_class); + values = _mm512_sllv_epi32(values, shift); } - return answer + len; + + /* 5. Shift right the values by variable amounts to reset lowest bits + |0000.0000|000a.aabb|bbbb.cccc|ccdd.dddd| 4-byte char -- by 11 + |0000.0000|0000.0000|aaaa.bbbb|bbcc.cccc| 3-byte char -- by 16 + |0000.0000|0000.0000|0000.0aaa|aabb.bbbb| 2-byte char -- by 21 + |0000.0000|0000.0000|0000.0000|0aaa.aaaa| ASCII char -- by 25 */ + { + // 4 * [25, 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 0, 21, 21, 16, 11] + const __m512i shift_right = _mm512_setr_epi64( + 0x1919191919191919, 0x0b10151500000000, 0x1919191919191919, + 0x0b10151500000000, 0x1919191919191919, 0x0b10151500000000, + 0x1919191919191919, 0x0b10151500000000); + + const __m512i shift = _mm512_shuffle_epi8(shift_right, char_class); + values = _mm512_srlv_epi32(values, shift); + } + + return values; } -inline size_t utf16_length_from_latin1(size_t len) { return len; } +simdutf_really_inline __m512i expand_and_identify(__m512i lane0, __m512i lane1, + int &count) { + const __m512i merged = _mm512_mask_mov_epi32(lane0, 0x1000, lane1); + const __m512i expand_ver2 = _mm512_setr_epi64( + 0x0403020103020100, 0x0605040305040302, 0x0807060507060504, + 0x0a09080709080706, 0x0c0b0a090b0a0908, 0x0e0d0c0b0d0c0b0a, + 0x000f0e0d0f0e0d0c, 0x0201000f01000f0e); + const __m512i input = _mm512_shuffle_epi8(merged, expand_ver2); + const __m512i v_0000_00c0 = _mm512_set1_epi32(0xc0); + const __m512i t0 = _mm512_and_si512(input, v_0000_00c0); + const __m512i v_0000_0080 = _mm512_set1_epi32(0x80); + const __mmask16 leading_bytes = _mm512_cmpneq_epu32_mask(t0, v_0000_0080); + count = static_cast(count_ones(leading_bytes)); + return _mm512_mask_compress_epi32(_mm512_setzero_si512(), leading_bytes, + input); +} -} // namespace latin1 -} // unnamed namespace -} // namespace scalar -} // namespace simdutf +simdutf_really_inline __m512i expand_utf8_to_utf32(__m512i input) { + __m512i char_class = _mm512_srli_epi32(input, 4); + /* char_class = ((input >> 4) & 0x0f) | 0x80808000 */ + const __m512i v_0000_000f = _mm512_set1_epi32(0x0f); + const __m512i v_8080_8000 = _mm512_set1_epi32(0x80808000); + char_class = + _mm512_ternarylogic_epi32(char_class, v_0000_000f, v_8080_8000, 0xea); + return expanded_utf8_to_utf32(char_class, input); +} +/* end file src/icelake/icelake_utf8_common.inl.cpp */ +/* begin file src/icelake/icelake_macros.inl.cpp */ -#endif -/* end file src/scalar/latin1.h */ +/* + This upcoming macro (SIMDUTF_ICELAKE_TRANSCODE16) takes 16 + 4 bytes (of a + UTF-8 string) and loads all possible 4-byte substring into an AVX512 + register. + + For example if we have bytes abcdefgh... we create following 32-bit lanes + + [abcd|bcde|cdef|defg|efgh|...] + ^ ^ + byte 0 of reg byte 63 of reg +*/ +/** pshufb + # lane{0,1,2} have got bytes: [ 0, 1, 2, 3, 4, 5, 6, 8, 9, 10, + 11, 12, 13, 14, 15] # lane3 has got bytes: [ 16, 17, 18, 19, 4, 5, + 6, 8, 9, 10, 11, 12, 13, 14, 15] + + expand_ver2 = [ + # lane 0: + 0, 1, 2, 3, + 1, 2, 3, 4, + 2, 3, 4, 5, + 3, 4, 5, 6, + + # lane 1: + 4, 5, 6, 7, + 5, 6, 7, 8, + 6, 7, 8, 9, + 7, 8, 9, 10, + + # lane 2: + 8, 9, 10, 11, + 9, 10, 11, 12, + 10, 11, 12, 13, + 11, 12, 13, 14, + + # lane 3 order: 13, 14, 15, 16 14, 15, 16, 17, 15, 16, 17, 18, 16, + 17, 18, 19 12, 13, 14, 15, 13, 14, 15, 0, 14, 15, 0, 1, 15, 0, 1, 2, + ] +*/ + +#define SIMDUTF_ICELAKE_TRANSCODE16(LANE0, LANE1, MASKED) \ + { \ + const __m512i merged = _mm512_mask_mov_epi32(LANE0, 0x1000, LANE1); \ + const __m512i expand_ver2 = _mm512_setr_epi64( \ + 0x0403020103020100, 0x0605040305040302, 0x0807060507060504, \ + 0x0a09080709080706, 0x0c0b0a090b0a0908, 0x0e0d0c0b0d0c0b0a, \ + 0x000f0e0d0f0e0d0c, 0x0201000f01000f0e); \ + const __m512i input = _mm512_shuffle_epi8(merged, expand_ver2); \ + \ + __mmask16 leading_bytes; \ + const __m512i v_0000_00c0 = _mm512_set1_epi32(0xc0); \ + const __m512i t0 = _mm512_and_si512(input, v_0000_00c0); \ + const __m512i v_0000_0080 = _mm512_set1_epi32(0x80); \ + leading_bytes = _mm512_cmpneq_epu32_mask(t0, v_0000_0080); \ + \ + __m512i char_class; \ + char_class = _mm512_srli_epi32(input, 4); \ + /* char_class = ((input >> 4) & 0x0f) | 0x80808000 */ \ + const __m512i v_0000_000f = _mm512_set1_epi32(0x0f); \ + const __m512i v_8080_8000 = _mm512_set1_epi32(0x80808000); \ + char_class = \ + _mm512_ternarylogic_epi32(char_class, v_0000_000f, v_8080_8000, 0xea); \ + \ + const int valid_count = static_cast(count_ones(leading_bytes)); \ + const __m512i utf32 = expanded_utf8_to_utf32(char_class, input); \ + \ + const __m512i out = _mm512_mask_compress_epi32(_mm512_setzero_si512(), \ + leading_bytes, utf32); \ + \ + if (UTF32) { \ + if (MASKED) { \ + const __mmask16 valid = uint16_t((1 << valid_count) - 1); \ + _mm512_mask_storeu_epi32((__m512i *)output, valid, out); \ + } else { \ + _mm512_storeu_si512((__m512i *)output, out); \ + } \ + output += valid_count; \ + } else { \ + if (MASKED) { \ + output += utf32_to_utf16_masked( \ + byteflip, out, valid_count, reinterpret_cast(output)); \ + } else { \ + output += utf32_to_utf16( \ + byteflip, out, valid_count, reinterpret_cast(output)); \ + } \ + } \ + } + +#define SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(INPUT, VALID_COUNT, MASKED) \ + { \ + if (UTF32) { \ + if (MASKED) { \ + const __mmask16 valid_mask = uint16_t((1 << VALID_COUNT) - 1); \ + _mm512_mask_storeu_epi32((__m512i *)output, valid_mask, INPUT); \ + } else { \ + _mm512_storeu_si512((__m512i *)output, INPUT); \ + } \ + output += VALID_COUNT; \ + } else { \ + if (MASKED) { \ + output += utf32_to_utf16_masked( \ + byteflip, INPUT, VALID_COUNT, \ + reinterpret_cast(output)); \ + } else { \ + output += \ + utf32_to_utf16(byteflip, INPUT, VALID_COUNT, \ + reinterpret_cast(output)); \ + } \ + } \ + } + +#define SIMDUTF_ICELAKE_STORE_ASCII(UTF32, utf8, output) \ + if (UTF32) { \ + const __m128i t0 = _mm512_castsi512_si128(utf8); \ + const __m128i t1 = _mm512_extracti32x4_epi32(utf8, 1); \ + const __m128i t2 = _mm512_extracti32x4_epi32(utf8, 2); \ + const __m128i t3 = _mm512_extracti32x4_epi32(utf8, 3); \ + _mm512_storeu_si512((__m512i *)(output + 0 * 16), \ + _mm512_cvtepu8_epi32(t0)); \ + _mm512_storeu_si512((__m512i *)(output + 1 * 16), \ + _mm512_cvtepu8_epi32(t1)); \ + _mm512_storeu_si512((__m512i *)(output + 2 * 16), \ + _mm512_cvtepu8_epi32(t2)); \ + _mm512_storeu_si512((__m512i *)(output + 3 * 16), \ + _mm512_cvtepu8_epi32(t3)); \ + } else { \ + const __m256i h0 = _mm512_castsi512_si256(utf8); \ + const __m256i h1 = _mm512_extracti64x4_epi64(utf8, 1); \ + if (big_endian) { \ + _mm512_storeu_si512( \ + (__m512i *)(output + 0 * 16), \ + _mm512_shuffle_epi8(_mm512_cvtepu8_epi16(h0), byteflip)); \ + _mm512_storeu_si512( \ + (__m512i *)(output + 2 * 16), \ + _mm512_shuffle_epi8(_mm512_cvtepu8_epi16(h1), byteflip)); \ + } else { \ + _mm512_storeu_si512((__m512i *)(output + 0 * 16), \ + _mm512_cvtepu8_epi16(h0)); \ + _mm512_storeu_si512((__m512i *)(output + 2 * 16), \ + _mm512_cvtepu8_epi16(h1)); \ + } \ + } +/* end file src/icelake/icelake_macros.inl.cpp */ +/* begin file src/icelake/icelake_from_valid_utf8.inl.cpp */ +// file included directly -/* begin file src/scalar/utf32_to_utf8/valid_utf32_to_utf8.h */ -#ifndef SIMDUTF_VALID_UTF32_TO_UTF8_H -#define SIMDUTF_VALID_UTF32_TO_UTF8_H +// File contains conversion procedure from VALID UTF-8 strings. -namespace simdutf { -namespace scalar { -namespace { -namespace utf32_to_utf8 { +/* + valid_utf8_to_fixed_length converts a valid UTF-8 string into UTF-32. -#if SIMDUTF_IMPLEMENTATION_FALLBACK || SIMDUTF_IMPLEMENTATION_PPC64 -// only used by the fallback and POWER kernel -inline size_t convert_valid(const char32_t *buf, size_t len, - char *utf8_output) { - const uint32_t *data = reinterpret_cast(buf); - size_t pos = 0; - char *start{utf8_output}; - while (pos < len) { - // try to convert the next block of 2 ASCII characters - if (pos + 2 <= - len) { // if it is safe to read 8 more bytes, check that they are ascii - uint64_t v; - ::memcpy(&v, data + pos, sizeof(uint64_t)); - if ((v & 0xFFFFFF80FFFFFF80) == 0) { - *utf8_output++ = char(buf[pos]); - *utf8_output++ = char(buf[pos + 1]); - pos += 2; - continue; - } - } - uint32_t word = data[pos]; - if ((word & 0xFFFFFF80) == 0) { - // will generate one UTF-8 bytes - *utf8_output++ = char(word); - pos++; - } else if ((word & 0xFFFFF800) == 0) { - // will generate two UTF-8 bytes - // we have 0b110XXXXX 0b10XXXXXX - *utf8_output++ = char((word >> 6) | 0b11000000); - *utf8_output++ = char((word & 0b111111) | 0b10000000); - pos++; - } else if ((word & 0xFFFF0000) == 0) { - // will generate three UTF-8 bytes - // we have 0b1110XXXX 0b10XXXXXX 0b10XXXXXX - *utf8_output++ = char((word >> 12) | 0b11100000); - *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); - *utf8_output++ = char((word & 0b111111) | 0b10000000); - pos++; - } else { - // will generate four UTF-8 bytes - // we have 0b11110XXX 0b10XXXXXX 0b10XXXXXX 0b10XXXXXX - *utf8_output++ = char((word >> 18) | 0b11110000); - *utf8_output++ = char(((word >> 12) & 0b111111) | 0b10000000); - *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); - *utf8_output++ = char((word & 0b111111) | 0b10000000); - pos++; - } - } - return utf8_output - start; -} -#endif // SIMDUTF_IMPLEMENTATION_FALLBACK || SIMDUTF_IMPLEMENTATION_PPC64 + The `OUTPUT` template type decides what to do with UTF-32: store + it directly or convert into UTF-16 (with AVX512). -} // namespace utf32_to_utf8 -} // unnamed namespace -} // namespace scalar -} // namespace simdutf + Input: + - str - valid UTF-8 string + - len - string length + - out_buffer - output buffer -#endif -/* end file src/scalar/utf32_to_utf8/valid_utf32_to_utf8.h */ -/* begin file src/scalar/utf32_to_utf8/utf32_to_utf8.h */ -#ifndef SIMDUTF_UTF32_TO_UTF8_H -#define SIMDUTF_UTF32_TO_UTF8_H + Result: + - pair.first - the first unprocessed input byte + - pair.second - the first unprocessed output word +*/ +template +std::pair +valid_utf8_to_fixed_length(const char *str, size_t len, OUTPUT *dwords) { + constexpr bool UTF32 = std::is_same::value; + constexpr bool UTF16 = std::is_same::value; + static_assert( + UTF32 or UTF16, + "output type has to be uint32_t (for UTF-32) or char16_t (for UTF-16)"); + static_assert(!(UTF32 and big_endian), + "we do not currently support big-endian UTF-32"); -namespace simdutf { -namespace scalar { -namespace { -namespace utf32_to_utf8 { + __m512i byteflip = _mm512_setr_epi64(0x0607040502030001, 0x0e0f0c0d0a0b0809, + 0x0607040502030001, 0x0e0f0c0d0a0b0809, + 0x0607040502030001, 0x0e0f0c0d0a0b0809, + 0x0607040502030001, 0x0e0f0c0d0a0b0809); + const char *ptr = str; + const char *end = ptr + len; -inline size_t convert(const char32_t *buf, size_t len, char *utf8_output) { - const uint32_t *data = reinterpret_cast(buf); - size_t pos = 0; - char *start{utf8_output}; - while (pos < len) { - // try to convert the next block of 2 ASCII characters - if (pos + 2 <= - len) { // if it is safe to read 8 more bytes, check that they are ascii - uint64_t v; - ::memcpy(&v, data + pos, sizeof(uint64_t)); - if ((v & 0xFFFFFF80FFFFFF80) == 0) { - *utf8_output++ = char(buf[pos]); - *utf8_output++ = char(buf[pos + 1]); - pos += 2; - continue; - } + OUTPUT *output = dwords; + /** + * In the main loop, we consume 64 bytes per iteration, + * but we access 64 + 4 bytes. + * We check for ptr + 64 + 64 <= end because + * we want to be do maskless writes without overruns. + */ + while (end - ptr >= 64 + 4) { + const __m512i utf8 = _mm512_loadu_si512((const __m512i *)ptr); + const __m512i v_80 = _mm512_set1_epi8(char(0x80)); + const __mmask64 ascii = _mm512_test_epi8_mask(utf8, v_80); + if (ascii == 0) { + SIMDUTF_ICELAKE_STORE_ASCII(UTF32, utf8, output) + output += 64; + ptr += 64; + continue; } - uint32_t word = data[pos]; - if ((word & 0xFFFFFF80) == 0) { - // will generate one UTF-8 bytes - *utf8_output++ = char(word); - pos++; - } else if ((word & 0xFFFFF800) == 0) { - // will generate two UTF-8 bytes - // we have 0b110XXXXX 0b10XXXXXX - *utf8_output++ = char((word >> 6) | 0b11000000); - *utf8_output++ = char((word & 0b111111) | 0b10000000); - pos++; - } else if ((word & 0xFFFF0000) == 0) { - // will generate three UTF-8 bytes - // we have 0b1110XXXX 0b10XXXXXX 0b10XXXXXX - if (word >= 0xD800 && word <= 0xDFFF) { - return 0; - } - *utf8_output++ = char((word >> 12) | 0b11100000); - *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); - *utf8_output++ = char((word & 0b111111) | 0b10000000); - pos++; + + const __m512i lane0 = broadcast_epi128<0>(utf8); + const __m512i lane1 = broadcast_epi128<1>(utf8); + int valid_count0; + __m512i vec0 = expand_and_identify(lane0, lane1, valid_count0); + const __m512i lane2 = broadcast_epi128<2>(utf8); + int valid_count1; + __m512i vec1 = expand_and_identify(lane1, lane2, valid_count1); + if (valid_count0 + valid_count1 <= 16) { + vec0 = _mm512_mask_expand_epi32( + vec0, __mmask16(((1 << valid_count1) - 1) << valid_count0), vec1); + valid_count0 += valid_count1; + vec0 = expand_utf8_to_utf32(vec0); + SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec0, valid_count0, true) } else { - // will generate four UTF-8 bytes - // we have 0b11110XXX 0b10XXXXXX 0b10XXXXXX 0b10XXXXXX - if (word > 0x10FFFF) { - return 0; - } - *utf8_output++ = char((word >> 18) | 0b11110000); - *utf8_output++ = char(((word >> 12) & 0b111111) | 0b10000000); - *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); - *utf8_output++ = char((word & 0b111111) | 0b10000000); - pos++; + vec0 = expand_utf8_to_utf32(vec0); + vec1 = expand_utf8_to_utf32(vec1); + SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec0, valid_count0, true) + SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec1, valid_count1, true) + } + const __m512i lane3 = broadcast_epi128<3>(utf8); + int valid_count2; + __m512i vec2 = expand_and_identify(lane2, lane3, valid_count2); + uint32_t tmp1; + ::memcpy(&tmp1, ptr + 64, sizeof(tmp1)); + const __m512i lane4 = _mm512_set1_epi32(tmp1); + int valid_count3; + __m512i vec3 = expand_and_identify(lane3, lane4, valid_count3); + if (valid_count2 + valid_count3 <= 16) { + vec2 = _mm512_mask_expand_epi32( + vec2, __mmask16(((1 << valid_count3) - 1) << valid_count2), vec3); + valid_count2 += valid_count3; + vec2 = expand_utf8_to_utf32(vec2); + SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec2, valid_count2, true) + } else { + vec2 = expand_utf8_to_utf32(vec2); + vec3 = expand_utf8_to_utf32(vec3); + SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec2, valid_count2, true) + SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec3, valid_count3, true) } + ptr += 4 * 16; } - return utf8_output - start; -} -inline result convert_with_errors(const char32_t *buf, size_t len, - char *utf8_output) { - const uint32_t *data = reinterpret_cast(buf); - size_t pos = 0; - char *start{utf8_output}; - while (pos < len) { - // try to convert the next block of 2 ASCII characters - if (pos + 2 <= - len) { // if it is safe to read 8 more bytes, check that they are ascii - uint64_t v; - ::memcpy(&v, data + pos, sizeof(uint64_t)); - if ((v & 0xFFFFFF80FFFFFF80) == 0) { - *utf8_output++ = char(buf[pos]); - *utf8_output++ = char(buf[pos + 1]); - pos += 2; - continue; - } - } - uint32_t word = data[pos]; - if ((word & 0xFFFFFF80) == 0) { - // will generate one UTF-8 bytes - *utf8_output++ = char(word); - pos++; - } else if ((word & 0xFFFFF800) == 0) { - // will generate two UTF-8 bytes - // we have 0b110XXXXX 0b10XXXXXX - *utf8_output++ = char((word >> 6) | 0b11000000); - *utf8_output++ = char((word & 0b111111) | 0b10000000); - pos++; - } else if ((word & 0xFFFF0000) == 0) { - // will generate three UTF-8 bytes - // we have 0b1110XXXX 0b10XXXXXX 0b10XXXXXX - if (word >= 0xD800 && word <= 0xDFFF) { - return result(error_code::SURROGATE, pos); - } - *utf8_output++ = char((word >> 12) | 0b11100000); - *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); - *utf8_output++ = char((word & 0b111111) | 0b10000000); - pos++; + if (end - ptr >= 64) { + const __m512i utf8 = _mm512_loadu_si512((const __m512i *)ptr); + const __m512i v_80 = _mm512_set1_epi8(char(0x80)); + const __mmask64 ascii = _mm512_test_epi8_mask(utf8, v_80); + if (ascii == 0) { + SIMDUTF_ICELAKE_STORE_ASCII(UTF32, utf8, output) + output += 64; + ptr += 64; } else { - // will generate four UTF-8 bytes - // we have 0b11110XXX 0b10XXXXXX 0b10XXXXXX 0b10XXXXXX - if (word > 0x10FFFF) { - return result(error_code::TOO_LARGE, pos); + const __m512i lane0 = broadcast_epi128<0>(utf8); + const __m512i lane1 = broadcast_epi128<1>(utf8); + int valid_count0; + __m512i vec0 = expand_and_identify(lane0, lane1, valid_count0); + const __m512i lane2 = broadcast_epi128<2>(utf8); + int valid_count1; + __m512i vec1 = expand_and_identify(lane1, lane2, valid_count1); + if (valid_count0 + valid_count1 <= 16) { + vec0 = _mm512_mask_expand_epi32( + vec0, __mmask16(((1 << valid_count1) - 1) << valid_count0), vec1); + valid_count0 += valid_count1; + vec0 = expand_utf8_to_utf32(vec0); + SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec0, valid_count0, true) + } else { + vec0 = expand_utf8_to_utf32(vec0); + vec1 = expand_utf8_to_utf32(vec1); + SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec0, valid_count0, true) + SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec1, valid_count1, true) } - *utf8_output++ = char((word >> 18) | 0b11110000); - *utf8_output++ = char(((word >> 12) & 0b111111) | 0b10000000); - *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); - *utf8_output++ = char((word & 0b111111) | 0b10000000); - pos++; + + const __m512i lane3 = broadcast_epi128<3>(utf8); + SIMDUTF_ICELAKE_TRANSCODE16(lane2, lane3, true) + + ptr += 3 * 16; } } - return result(error_code::SUCCESS, utf8_output - start); + return {ptr, output}; } -} // namespace utf32_to_utf8 -} // unnamed namespace -} // namespace scalar -} // namespace simdutf +using utf8_to_utf16_result = std::pair; +/* end file src/icelake/icelake_from_valid_utf8.inl.cpp */ +/* begin file src/icelake/icelake_utf8_validation.inl.cpp */ +// file included directly -#endif -/* end file src/scalar/utf32_to_utf8/utf32_to_utf8.h */ +simdutf_really_inline __m512i check_special_cases(__m512i input, + const __m512i prev1) { + __m512i mask1 = _mm512_setr_epi64(0x0202020202020202, 0x4915012180808080, + 0x0202020202020202, 0x4915012180808080, + 0x0202020202020202, 0x4915012180808080, + 0x0202020202020202, 0x4915012180808080); + const __m512i v_0f = _mm512_set1_epi8(0x0f); + __m512i index1 = _mm512_and_si512(_mm512_srli_epi16(prev1, 4), v_0f); -/* begin file src/scalar/utf32_to_utf16/valid_utf32_to_utf16.h */ -#ifndef SIMDUTF_VALID_UTF32_TO_UTF16_H -#define SIMDUTF_VALID_UTF32_TO_UTF16_H + __m512i byte_1_high = _mm512_shuffle_epi8(mask1, index1); + __m512i mask2 = _mm512_setr_epi64(0xcbcbcb8b8383a3e7, 0xcbcbdbcbcbcbcbcb, + 0xcbcbcb8b8383a3e7, 0xcbcbdbcbcbcbcbcb, + 0xcbcbcb8b8383a3e7, 0xcbcbdbcbcbcbcbcb, + 0xcbcbcb8b8383a3e7, 0xcbcbdbcbcbcbcbcb); + __m512i index2 = _mm512_and_si512(prev1, v_0f); -namespace simdutf { -namespace scalar { -namespace { -namespace utf32_to_utf16 { + __m512i byte_1_low = _mm512_shuffle_epi8(mask2, index2); + __m512i mask3 = + _mm512_setr_epi64(0x101010101010101, 0x1010101babaaee6, 0x101010101010101, + 0x1010101babaaee6, 0x101010101010101, 0x1010101babaaee6, + 0x101010101010101, 0x1010101babaaee6); + __m512i index3 = _mm512_and_si512(_mm512_srli_epi16(input, 4), v_0f); + __m512i byte_2_high = _mm512_shuffle_epi8(mask3, index3); + return _mm512_ternarylogic_epi64(byte_1_high, byte_1_low, byte_2_high, 128); +} -template -inline size_t convert_valid(const char32_t *buf, size_t len, - char16_t *utf16_output) { - const uint32_t *data = reinterpret_cast(buf); - size_t pos = 0; - char16_t *start{utf16_output}; - while (pos < len) { - uint32_t word = data[pos]; - if ((word & 0xFFFF0000) == 0) { - // will not generate a surrogate pair - *utf16_output++ = !match_system(big_endian) - ? char16_t(utf16::swap_bytes(uint16_t(word))) - : char16_t(word); - pos++; - } else { - // will generate a surrogate pair - word -= 0x10000; - uint16_t high_surrogate = uint16_t(0xD800 + (word >> 10)); - uint16_t low_surrogate = uint16_t(0xDC00 + (word & 0x3FF)); - if (!match_system(big_endian)) { - high_surrogate = utf16::swap_bytes(high_surrogate); - low_surrogate = utf16::swap_bytes(low_surrogate); - } - *utf16_output++ = char16_t(high_surrogate); - *utf16_output++ = char16_t(low_surrogate); - pos++; - } - } - return utf16_output - start; +simdutf_really_inline __m512i check_multibyte_lengths(const __m512i input, + const __m512i prev_input, + const __m512i sc) { + __m512i prev2 = prev<2>(input, prev_input); + __m512i prev3 = prev<3>(input, prev_input); + __m512i is_third_byte = _mm512_subs_epu8( + prev2, _mm512_set1_epi8(0b11100000u - 1)); // Only 111_____ will be > 0 + __m512i is_fourth_byte = _mm512_subs_epu8( + prev3, _mm512_set1_epi8(0b11110000u - 1)); // Only 1111____ will be > 0 + __m512i is_third_or_fourth_byte = + _mm512_or_si512(is_third_byte, is_fourth_byte); + const __m512i v_7f = _mm512_set1_epi8(char(0x7f)); + is_third_or_fourth_byte = _mm512_adds_epu8(v_7f, is_third_or_fourth_byte); + // We want to compute (is_third_or_fourth_byte AND v80) XOR sc. + const __m512i v_80 = _mm512_set1_epi8(char(0x80)); + return _mm512_ternarylogic_epi32(is_third_or_fourth_byte, v_80, sc, + 0b1101010); + //__m512i is_third_or_fourth_byte_mask = + //_mm512_and_si512(is_third_or_fourth_byte, v_80); return + // _mm512_xor_si512(is_third_or_fourth_byte_mask, sc); +} +// +// Return nonzero if there are incomplete multibyte characters at the end of the +// block: e.g. if there is a 4-byte character, but it is 3 bytes from the end. +// +simdutf_really_inline __m512i is_incomplete(const __m512i input) { + // If the previous input's last 3 bytes match this, they're too short (they + // ended at EOF): + // ... 1111____ 111_____ 11______ + __m512i max_value = _mm512_setr_epi64(0xffffffffffffffff, 0xffffffffffffffff, + 0xffffffffffffffff, 0xffffffffffffffff, + 0xffffffffffffffff, 0xffffffffffffffff, + 0xffffffffffffffff, 0xbfdfefffffffffff); + return _mm512_subs_epu8(input, max_value); } -} // namespace utf32_to_utf16 -} // unnamed namespace -} // namespace scalar -} // namespace simdutf +struct avx512_utf8_checker { + // If this is nonzero, there has been a UTF-8 error. + __m512i error{}; -#endif -/* end file src/scalar/utf32_to_utf16/valid_utf32_to_utf16.h */ -/* begin file src/scalar/utf32_to_utf16/utf32_to_utf16.h */ -#ifndef SIMDUTF_UTF32_TO_UTF16_H -#define SIMDUTF_UTF32_TO_UTF16_H + // The last input we received + __m512i prev_input_block{}; + // Whether the last input we received was incomplete (used for ASCII fast + // path) + __m512i prev_incomplete{}; -namespace simdutf { -namespace scalar { -namespace { -namespace utf32_to_utf16 { + // + // Check whether the current bytes are valid UTF-8. + // + simdutf_really_inline void check_utf8_bytes(const __m512i input, + const __m512i prev_input) { + // Flip prev1...prev3 so we can easily determine if they are 2+, 3+ or 4+ + // lead bytes (2, 3, 4-byte leads become large positive numbers instead of + // small negative numbers) + __m512i prev1 = prev<1>(input, prev_input); + __m512i sc = check_special_cases(input, prev1); + this->error = _mm512_or_si512( + check_multibyte_lengths(input, prev_input, sc), this->error); + } -template -inline size_t convert(const char32_t *buf, size_t len, char16_t *utf16_output) { - const uint32_t *data = reinterpret_cast(buf); - size_t pos = 0; - char16_t *start{utf16_output}; - while (pos < len) { - uint32_t word = data[pos]; - if ((word & 0xFFFF0000) == 0) { - if (word >= 0xD800 && word <= 0xDFFF) { - return 0; - } - // will not generate a surrogate pair - *utf16_output++ = !match_system(big_endian) - ? char16_t(utf16::swap_bytes(uint16_t(word))) - : char16_t(word); + // The only problem that can happen at EOF is that a multibyte character is + // too short or a byte value too large in the last bytes: check_special_cases + // only checks for bytes too large in the first of two bytes. + simdutf_really_inline void check_eof() { + // If the previous block had incomplete UTF-8 characters at the end, an + // ASCII block can't possibly finish them. + this->error = _mm512_or_si512(this->error, this->prev_incomplete); + } + + // returns true if ASCII. + simdutf_really_inline bool check_next_input(const __m512i input) { + const __m512i v_80 = _mm512_set1_epi8(char(0x80)); + const __mmask64 ascii = _mm512_test_epi8_mask(input, v_80); + if (ascii == 0) { + this->error = _mm512_or_si512(this->error, this->prev_incomplete); + return true; } else { - // will generate a surrogate pair - if (word > 0x10FFFF) { - return 0; - } - word -= 0x10000; - uint16_t high_surrogate = uint16_t(0xD800 + (word >> 10)); - uint16_t low_surrogate = uint16_t(0xDC00 + (word & 0x3FF)); - if (!match_system(big_endian)) { - high_surrogate = utf16::swap_bytes(high_surrogate); - low_surrogate = utf16::swap_bytes(low_surrogate); - } - *utf16_output++ = char16_t(high_surrogate); - *utf16_output++ = char16_t(low_surrogate); + this->check_utf8_bytes(input, this->prev_input_block); + this->prev_incomplete = is_incomplete(input); + this->prev_input_block = input; + return false; } - pos++; } - return utf16_output - start; -} + // do not forget to call check_eof! + simdutf_really_inline bool errors() const { + return _mm512_test_epi8_mask(this->error, this->error) != 0; + } +}; // struct avx512_utf8_checker +/* end file src/icelake/icelake_utf8_validation.inl.cpp */ +/* begin file src/icelake/icelake_from_utf8.inl.cpp */ +// file included directly + +// File contains conversion procedure from possibly invalid UTF-8 strings. + +/** + * Attempts to convert up to len 1-byte code units from in (in UTF-8 format) to + * out. + * Returns the position of the input and output after the processing is + * completed. Upon error, the output is set to null. + */ template -inline result convert_with_errors(const char32_t *buf, size_t len, - char16_t *utf16_output) { - const uint32_t *data = reinterpret_cast(buf); - size_t pos = 0; - char16_t *start{utf16_output}; - while (pos < len) { - uint32_t word = data[pos]; - if ((word & 0xFFFF0000) == 0) { - if (word >= 0xD800 && word <= 0xDFFF) { - return result(error_code::SURROGATE, pos); - } - // will not generate a surrogate pair - *utf16_output++ = !match_system(big_endian) - ? char16_t(utf16::swap_bytes(uint16_t(word))) - : char16_t(word); +utf8_to_utf16_result +fast_avx512_convert_utf8_to_utf16(const char *in, size_t len, char16_t *out) { + const char *const final_in = in + len; + bool result = true; + while (result) { + if (final_in - in >= 64) { + result = process_block_utf8_to_utf16( + in, out, final_in - in); + } else if (in < final_in) { + result = process_block_utf8_to_utf16( + in, out, final_in - in); } else { - // will generate a surrogate pair - if (word > 0x10FFFF) { - return result(error_code::TOO_LARGE, pos); - } - word -= 0x10000; - uint16_t high_surrogate = uint16_t(0xD800 + (word >> 10)); - uint16_t low_surrogate = uint16_t(0xDC00 + (word & 0x3FF)); - if (!match_system(big_endian)) { - high_surrogate = utf16::swap_bytes(high_surrogate); - low_surrogate = utf16::swap_bytes(low_surrogate); - } - *utf16_output++ = char16_t(high_surrogate); - *utf16_output++ = char16_t(low_surrogate); + break; } - pos++; } - return result(error_code::SUCCESS, utf16_output - start); + if (!result) { + out = nullptr; + } + return std::make_pair(in, out); } -} // namespace utf32_to_utf16 -} // unnamed namespace -} // namespace scalar -} // namespace simdutf - -#endif -/* end file src/scalar/utf32_to_utf16/utf32_to_utf16.h */ - -/* begin file src/scalar/utf16_to_utf8/valid_utf16_to_utf8.h */ -#ifndef SIMDUTF_VALID_UTF16_TO_UTF8_H -#define SIMDUTF_VALID_UTF16_TO_UTF8_H - -namespace simdutf { -namespace scalar { -namespace { -namespace utf16_to_utf8 { - template -inline size_t convert_valid(const char16_t *buf, size_t len, - char *utf8_output) { - const uint16_t *data = reinterpret_cast(buf); - size_t pos = 0; - char *start{utf8_output}; - while (pos < len) { - // try to convert the next block of 4 ASCII characters - if (pos + 4 <= - len) { // if it is safe to read 8 more bytes, check that they are ascii - uint64_t v; - ::memcpy(&v, data + pos, sizeof(uint64_t)); - if (!match_system(big_endian)) { - v = (v >> 8) | (v << (64 - 8)); - } - if ((v & 0xFF80FF80FF80FF80) == 0) { - size_t final_pos = pos + 4; - while (pos < final_pos) { - *utf8_output++ = !match_system(big_endian) - ? char(utf16::swap_bytes(buf[pos])) - : char(buf[pos]); - pos++; - } - continue; +simdutf::result fast_avx512_convert_utf8_to_utf16_with_errors(const char *in, + size_t len, + char16_t *out) { + const char *const init_in = in; + const char16_t *const init_out = out; + const char *const final_in = in + len; + bool result = true; + while (result) { + if (final_in - in >= 64) { + result = process_block_utf8_to_utf16( + in, out, final_in - in); + } else if (in < final_in) { + result = process_block_utf8_to_utf16( + in, out, final_in - in); + } else { + break; + } + } + if (!result) { + size_t pos = size_t(in - init_in); + if (pos < len && (init_in[pos] & 0xc0) == 0x80 && pos >= 64) { + // We must check whether we are the fourth continuation byte + bool c1 = (init_in[pos - 1] & 0xc0) == 0x80; + bool c2 = (init_in[pos - 2] & 0xc0) == 0x80; + bool c3 = (init_in[pos - 3] & 0xc0) == 0x80; + if (c1 && c2 && c3) { + return {simdutf::TOO_LONG, pos}; } } + // rewind_and_convert_with_errors will seek a potential error from in + // onward, with the ability to go back up to in - init_in bytes, and read + // final_in - in bytes forward. + simdutf::result res = + scalar::utf8_to_utf16::rewind_and_convert_with_errors( + in - init_in, in, final_in - in, out); + res.count += (in - init_in); + return res; + } else { + return simdutf::result(error_code::SUCCESS, out - init_out); + } +} - uint16_t word = - !match_system(big_endian) ? utf16::swap_bytes(data[pos]) : data[pos]; - if ((word & 0xFF80) == 0) { - // will generate one UTF-8 bytes - *utf8_output++ = char(word); - pos++; - } else if ((word & 0xF800) == 0) { - // will generate two UTF-8 bytes - // we have 0b110XXXXX 0b10XXXXXX - *utf8_output++ = char((word >> 6) | 0b11000000); - *utf8_output++ = char((word & 0b111111) | 0b10000000); - pos++; - } else if ((word & 0xF800) != 0xD800) { - // will generate three UTF-8 bytes - // we have 0b1110XXXX 0b10XXXXXX 0b10XXXXXX - *utf8_output++ = char((word >> 12) | 0b11100000); - *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); - *utf8_output++ = char((word & 0b111111) | 0b10000000); - pos++; +template +// todo: replace with the utf-8 to utf-16 routine adapted to utf-32. This code +// is legacy. +std::pair +validating_utf8_to_fixed_length(const char *str, size_t len, OUTPUT *dwords) { + constexpr bool UTF32 = std::is_same::value; + constexpr bool UTF16 = std::is_same::value; + static_assert( + UTF32 or UTF16, + "output type has to be uint32_t (for UTF-32) or char16_t (for UTF-16)"); + static_assert(!(UTF32 and big_endian), + "we do not currently support big-endian UTF-32"); + + const char *ptr = str; + const char *end = ptr + len; + __m512i byteflip = _mm512_setr_epi64(0x0607040502030001, 0x0e0f0c0d0a0b0809, + 0x0607040502030001, 0x0e0f0c0d0a0b0809, + 0x0607040502030001, 0x0e0f0c0d0a0b0809, + 0x0607040502030001, 0x0e0f0c0d0a0b0809); + OUTPUT *output = dwords; + avx512_utf8_checker checker{}; + /** + * In the main loop, we consume 64 bytes per iteration, + * but we access 64 + 4 bytes. + * We use masked writes to avoid overruns, see + * https://github.com/simdutf/simdutf/issues/471 + */ + while (end - ptr >= 64 + 4) { + const __m512i utf8 = _mm512_loadu_si512((const __m512i *)ptr); + if (checker.check_next_input(utf8)) { + SIMDUTF_ICELAKE_STORE_ASCII(UTF32, utf8, output) + output += 64; + ptr += 64; + continue; + } + const __m512i lane0 = broadcast_epi128<0>(utf8); + const __m512i lane1 = broadcast_epi128<1>(utf8); + int valid_count0; + __m512i vec0 = expand_and_identify(lane0, lane1, valid_count0); + const __m512i lane2 = broadcast_epi128<2>(utf8); + int valid_count1; + __m512i vec1 = expand_and_identify(lane1, lane2, valid_count1); + if (valid_count0 + valid_count1 <= 16) { + vec0 = _mm512_mask_expand_epi32( + vec0, __mmask16(((1 << valid_count1) - 1) << valid_count0), vec1); + valid_count0 += valid_count1; + vec0 = expand_utf8_to_utf32(vec0); + SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec0, valid_count0, true) } else { - // must be a surrogate pair - uint16_t diff = uint16_t(word - 0xD800); - if (pos + 1 >= len) { - return 0; - } // minimal bound checking - uint16_t next_word = !match_system(big_endian) - ? utf16::swap_bytes(data[pos + 1]) - : data[pos + 1]; - uint16_t diff2 = uint16_t(next_word - 0xDC00); - uint32_t value = (diff << 10) + diff2 + 0x10000; - // will generate four UTF-8 bytes - // we have 0b11110XXX 0b10XXXXXX 0b10XXXXXX 0b10XXXXXX - *utf8_output++ = char((value >> 18) | 0b11110000); - *utf8_output++ = char(((value >> 12) & 0b111111) | 0b10000000); - *utf8_output++ = char(((value >> 6) & 0b111111) | 0b10000000); - *utf8_output++ = char((value & 0b111111) | 0b10000000); - pos += 2; + vec0 = expand_utf8_to_utf32(vec0); + vec1 = expand_utf8_to_utf32(vec1); + SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec0, valid_count0, true) + SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec1, valid_count1, true) + } + const __m512i lane3 = broadcast_epi128<3>(utf8); + int valid_count2; + __m512i vec2 = expand_and_identify(lane2, lane3, valid_count2); + uint32_t tmp1; + ::memcpy(&tmp1, ptr + 64, sizeof(tmp1)); + const __m512i lane4 = _mm512_set1_epi32(tmp1); + int valid_count3; + __m512i vec3 = expand_and_identify(lane3, lane4, valid_count3); + if (valid_count2 + valid_count3 <= 16) { + vec2 = _mm512_mask_expand_epi32( + vec2, __mmask16(((1 << valid_count3) - 1) << valid_count2), vec3); + valid_count2 += valid_count3; + vec2 = expand_utf8_to_utf32(vec2); + SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec2, valid_count2, true) + } else { + vec2 = expand_utf8_to_utf32(vec2); + vec3 = expand_utf8_to_utf32(vec3); + SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec2, valid_count2, true) + SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec3, valid_count3, true) } + ptr += 4 * 16; } - return utf8_output - start; -} + const char *validatedptr = ptr; // validated up to ptr -} // namespace utf16_to_utf8 -} // unnamed namespace -} // namespace scalar -} // namespace simdutf + // For the final pass, we validate 64 bytes, but we only transcode + // 3*16 bytes, so we may end up double-validating 16 bytes. + if (end - ptr >= 64) { + const __m512i utf8 = _mm512_loadu_si512((const __m512i *)ptr); + if (checker.check_next_input(utf8)) { + SIMDUTF_ICELAKE_STORE_ASCII(UTF32, utf8, output) + output += 64; + ptr += 64; + } else { + const __m512i lane0 = broadcast_epi128<0>(utf8); + const __m512i lane1 = broadcast_epi128<1>(utf8); + int valid_count0; + __m512i vec0 = expand_and_identify(lane0, lane1, valid_count0); + const __m512i lane2 = broadcast_epi128<2>(utf8); + int valid_count1; + __m512i vec1 = expand_and_identify(lane1, lane2, valid_count1); + if (valid_count0 + valid_count1 <= 16) { + vec0 = _mm512_mask_expand_epi32( + vec0, __mmask16(((1 << valid_count1) - 1) << valid_count0), vec1); + valid_count0 += valid_count1; + vec0 = expand_utf8_to_utf32(vec0); + SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec0, valid_count0, true) + } else { + vec0 = expand_utf8_to_utf32(vec0); + vec1 = expand_utf8_to_utf32(vec1); + SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec0, valid_count0, true) + SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec1, valid_count1, true) + } -#endif -/* end file src/scalar/utf16_to_utf8/valid_utf16_to_utf8.h */ -/* begin file src/scalar/utf16_to_utf8/utf16_to_utf8.h */ -#ifndef SIMDUTF_UTF16_TO_UTF8_H -#define SIMDUTF_UTF16_TO_UTF8_H + const __m512i lane3 = broadcast_epi128<3>(utf8); + SIMDUTF_ICELAKE_TRANSCODE16(lane2, lane3, true) -namespace simdutf { -namespace scalar { -namespace { -namespace utf16_to_utf8 { + ptr += 3 * 16; + } + validatedptr += 4 * 16; + } + if (end != validatedptr) { + const __m512i utf8 = + _mm512_maskz_loadu_epi8(~UINT64_C(0) >> (64 - (end - validatedptr)), + (const __m512i *)validatedptr); + checker.check_next_input(utf8); + } + checker.check_eof(); + if (checker.errors()) { + return {ptr, nullptr}; // We found an error. + } + return {ptr, output}; +} -template -inline size_t convert(const char16_t *buf, size_t len, char *utf8_output) { - const uint16_t *data = reinterpret_cast(buf); - size_t pos = 0; - char *start{utf8_output}; - while (pos < len) { - // try to convert the next block of 8 bytes - if (pos + 4 <= - len) { // if it is safe to read 8 more bytes, check that they are ascii - uint64_t v; - ::memcpy(&v, data + pos, sizeof(uint64_t)); - if (!match_system(big_endian)) { - v = (v >> 8) | (v << (64 - 8)); - } - if ((v & 0xFF80FF80FF80FF80) == 0) { - size_t final_pos = pos + 4; - while (pos < final_pos) { - *utf8_output++ = !match_system(big_endian) - ? char(utf16::swap_bytes(buf[pos])) - : char(buf[pos]); - pos++; - } - continue; - } +// Like validating_utf8_to_fixed_length but returns as soon as an error is +// identified todo: replace with the utf-8 to utf-16 routine adapted to utf-32. +// This code is legacy. +template +std::tuple +validating_utf8_to_fixed_length_with_constant_checks(const char *str, + size_t len, + OUTPUT *dwords) { + constexpr bool UTF32 = std::is_same::value; + constexpr bool UTF16 = std::is_same::value; + static_assert( + UTF32 or UTF16, + "output type has to be uint32_t (for UTF-32) or char16_t (for UTF-16)"); + static_assert(!(UTF32 and big_endian), + "we do not currently support big-endian UTF-32"); + + const char *ptr = str; + const char *end = ptr + len; + __m512i byteflip = _mm512_setr_epi64(0x0607040502030001, 0x0e0f0c0d0a0b0809, + 0x0607040502030001, 0x0e0f0c0d0a0b0809, + 0x0607040502030001, 0x0e0f0c0d0a0b0809, + 0x0607040502030001, 0x0e0f0c0d0a0b0809); + OUTPUT *output = dwords; + avx512_utf8_checker checker{}; + /** + * In the main loop, we consume 64 bytes per iteration, + * but we access 64 + 4 bytes. + */ + while (end - ptr >= 4 + 64) { + const __m512i utf8 = _mm512_loadu_si512((const __m512i *)ptr); + bool ascii = checker.check_next_input(utf8); + if (checker.errors()) { + return {ptr, output, false}; // We found an error. } - uint16_t word = - !match_system(big_endian) ? utf16::swap_bytes(data[pos]) : data[pos]; - if ((word & 0xFF80) == 0) { - // will generate one UTF-8 bytes - *utf8_output++ = char(word); - pos++; - } else if ((word & 0xF800) == 0) { - // will generate two UTF-8 bytes - // we have 0b110XXXXX 0b10XXXXXX - *utf8_output++ = char((word >> 6) | 0b11000000); - *utf8_output++ = char((word & 0b111111) | 0b10000000); - pos++; - } else if ((word & 0xF800) != 0xD800) { - // will generate three UTF-8 bytes - // we have 0b1110XXXX 0b10XXXXXX 0b10XXXXXX - *utf8_output++ = char((word >> 12) | 0b11100000); - *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); - *utf8_output++ = char((word & 0b111111) | 0b10000000); - pos++; + if (ascii) { + SIMDUTF_ICELAKE_STORE_ASCII(UTF32, utf8, output) + output += 64; + ptr += 64; + continue; + } + const __m512i lane0 = broadcast_epi128<0>(utf8); + const __m512i lane1 = broadcast_epi128<1>(utf8); + int valid_count0; + __m512i vec0 = expand_and_identify(lane0, lane1, valid_count0); + const __m512i lane2 = broadcast_epi128<2>(utf8); + int valid_count1; + __m512i vec1 = expand_and_identify(lane1, lane2, valid_count1); + if (valid_count0 + valid_count1 <= 16) { + vec0 = _mm512_mask_expand_epi32( + vec0, __mmask16(((1 << valid_count1) - 1) << valid_count0), vec1); + valid_count0 += valid_count1; + vec0 = expand_utf8_to_utf32(vec0); + SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec0, valid_count0, true) } else { - // must be a surrogate pair - if (pos + 1 >= len) { - return 0; - } - uint16_t diff = uint16_t(word - 0xD800); - if (diff > 0x3FF) { - return 0; - } - uint16_t next_word = !match_system(big_endian) - ? utf16::swap_bytes(data[pos + 1]) - : data[pos + 1]; - uint16_t diff2 = uint16_t(next_word - 0xDC00); - if (diff2 > 0x3FF) { - return 0; - } - uint32_t value = (diff << 10) + diff2 + 0x10000; - // will generate four UTF-8 bytes - // we have 0b11110XXX 0b10XXXXXX 0b10XXXXXX 0b10XXXXXX - *utf8_output++ = char((value >> 18) | 0b11110000); - *utf8_output++ = char(((value >> 12) & 0b111111) | 0b10000000); - *utf8_output++ = char(((value >> 6) & 0b111111) | 0b10000000); - *utf8_output++ = char((value & 0b111111) | 0b10000000); - pos += 2; + vec0 = expand_utf8_to_utf32(vec0); + vec1 = expand_utf8_to_utf32(vec1); + SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec0, valid_count0, true) + SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec1, valid_count1, true) + } + const __m512i lane3 = broadcast_epi128<3>(utf8); + int valid_count2; + __m512i vec2 = expand_and_identify(lane2, lane3, valid_count2); + uint32_t tmp1; + ::memcpy(&tmp1, ptr + 64, sizeof(tmp1)); + const __m512i lane4 = _mm512_set1_epi32(tmp1); + int valid_count3; + __m512i vec3 = expand_and_identify(lane3, lane4, valid_count3); + if (valid_count2 + valid_count3 <= 16) { + vec2 = _mm512_mask_expand_epi32( + vec2, __mmask16(((1 << valid_count3) - 1) << valid_count2), vec3); + valid_count2 += valid_count3; + vec2 = expand_utf8_to_utf32(vec2); + SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec2, valid_count2, true) + } else { + vec2 = expand_utf8_to_utf32(vec2); + vec3 = expand_utf8_to_utf32(vec3); + SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec2, valid_count2, true) + SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec3, valid_count3, true) } + ptr += 4 * 16; } - return utf8_output - start; -} + const char *validatedptr = ptr; // validated up to ptr -template -inline result convert_with_errors(const char16_t *buf, size_t len, - char *utf8_output) { - const uint16_t *data = reinterpret_cast(buf); - size_t pos = 0; - char *start{utf8_output}; - while (pos < len) { - // try to convert the next block of 8 bytes - if (pos + 4 <= - len) { // if it is safe to read 8 more bytes, check that they are ascii - uint64_t v; - ::memcpy(&v, data + pos, sizeof(uint64_t)); - if (!match_system(big_endian)) - v = (v >> 8) | (v << (64 - 8)); - if ((v & 0xFF80FF80FF80FF80) == 0) { - size_t final_pos = pos + 4; - while (pos < final_pos) { - *utf8_output++ = !match_system(big_endian) - ? char(utf16::swap_bytes(buf[pos])) - : char(buf[pos]); - pos++; - } - continue; - } + // For the final pass, we validate 64 bytes, but we only transcode + // 3*16 bytes, so we may end up double-validating 16 bytes. + if (end - ptr >= 64) { + const __m512i utf8 = _mm512_loadu_si512((const __m512i *)ptr); + bool ascii = checker.check_next_input(utf8); + if (checker.errors()) { + return {ptr, output, false}; // We found an error. } - uint16_t word = - !match_system(big_endian) ? utf16::swap_bytes(data[pos]) : data[pos]; - if ((word & 0xFF80) == 0) { - // will generate one UTF-8 bytes - *utf8_output++ = char(word); - pos++; - } else if ((word & 0xF800) == 0) { - // will generate two UTF-8 bytes - // we have 0b110XXXXX 0b10XXXXXX - *utf8_output++ = char((word >> 6) | 0b11000000); - *utf8_output++ = char((word & 0b111111) | 0b10000000); - pos++; - } else if ((word & 0xF800) != 0xD800) { - // will generate three UTF-8 bytes - // we have 0b1110XXXX 0b10XXXXXX 0b10XXXXXX - *utf8_output++ = char((word >> 12) | 0b11100000); - *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); - *utf8_output++ = char((word & 0b111111) | 0b10000000); - pos++; + if (ascii) { + SIMDUTF_ICELAKE_STORE_ASCII(UTF32, utf8, output) + output += 64; + ptr += 64; } else { - // must be a surrogate pair - if (pos + 1 >= len) { - return result(error_code::SURROGATE, pos); - } - uint16_t diff = uint16_t(word - 0xD800); - if (diff > 0x3FF) { - return result(error_code::SURROGATE, pos); - } - uint16_t next_word = !match_system(big_endian) - ? utf16::swap_bytes(data[pos + 1]) - : data[pos + 1]; - uint16_t diff2 = uint16_t(next_word - 0xDC00); - if (diff2 > 0x3FF) { - return result(error_code::SURROGATE, pos); - } - uint32_t value = (diff << 10) + diff2 + 0x10000; - // will generate four UTF-8 bytes - // we have 0b11110XXX 0b10XXXXXX 0b10XXXXXX 0b10XXXXXX - *utf8_output++ = char((value >> 18) | 0b11110000); - *utf8_output++ = char(((value >> 12) & 0b111111) | 0b10000000); - *utf8_output++ = char(((value >> 6) & 0b111111) | 0b10000000); - *utf8_output++ = char((value & 0b111111) | 0b10000000); - pos += 2; + const __m512i lane0 = broadcast_epi128<0>(utf8); + const __m512i lane1 = broadcast_epi128<1>(utf8); + int valid_count0; + __m512i vec0 = expand_and_identify(lane0, lane1, valid_count0); + const __m512i lane2 = broadcast_epi128<2>(utf8); + int valid_count1; + __m512i vec1 = expand_and_identify(lane1, lane2, valid_count1); + if (valid_count0 + valid_count1 <= 16) { + vec0 = _mm512_mask_expand_epi32( + vec0, __mmask16(((1 << valid_count1) - 1) << valid_count0), vec1); + valid_count0 += valid_count1; + vec0 = expand_utf8_to_utf32(vec0); + SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec0, valid_count0, true) + } else { + vec0 = expand_utf8_to_utf32(vec0); + vec1 = expand_utf8_to_utf32(vec1); + SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec0, valid_count0, true) + SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec1, valid_count1, true) + } + + const __m512i lane3 = broadcast_epi128<3>(utf8); + SIMDUTF_ICELAKE_TRANSCODE16(lane2, lane3, true) + + ptr += 3 * 16; } + validatedptr += 4 * 16; } - return result(error_code::SUCCESS, utf8_output - start); + if (end != validatedptr) { + const __m512i utf8 = + _mm512_maskz_loadu_epi8(~UINT64_C(0) >> (64 - (end - validatedptr)), + (const __m512i *)validatedptr); + checker.check_next_input(utf8); + } + checker.check_eof(); + if (checker.errors()) { + return {ptr, output, false}; // We found an error. + } + return {ptr, output, true}; } +/* end file src/icelake/icelake_from_utf8.inl.cpp */ +/* begin file src/icelake/icelake_convert_utf8_to_latin1.inl.cpp */ +// file included directly -} // namespace utf16_to_utf8 -} // unnamed namespace -} // namespace scalar -} // namespace simdutf +// File contains conversion procedure from possibly invalid UTF-8 strings. -#endif -/* end file src/scalar/utf16_to_utf8/utf16_to_utf8.h */ +template +simdutf_really_inline size_t process_block_from_utf8_to_latin1( + const char *buf, size_t len, char *latin_output, __m512i minus64, + __m512i one, __mmask64 *next_leading_ptr, __mmask64 *next_bit6_ptr) { + __mmask64 load_mask = + is_remaining ? _bzhi_u64(~0ULL, (unsigned int)len) : ~0ULL; + __m512i input = _mm512_maskz_loadu_epi8(load_mask, (__m512i *)buf); + __mmask64 nonascii = _mm512_movepi8_mask(input); + if (nonascii == 0) { + if (*next_leading_ptr) { // If we ended with a leading byte, it is an error. + return 0; // Indicates error + } + is_remaining + ? _mm512_mask_storeu_epi8((__m512i *)latin_output, load_mask, input) + : _mm512_storeu_si512((__m512i *)latin_output, input); + return len; + } -/* begin file src/scalar/utf16_to_utf32/valid_utf16_to_utf32.h */ -#ifndef SIMDUTF_VALID_UTF16_TO_UTF32_H -#define SIMDUTF_VALID_UTF16_TO_UTF32_H + const __mmask64 leading = _mm512_cmpge_epu8_mask(input, minus64); -namespace simdutf { -namespace scalar { -namespace { -namespace utf16_to_utf32 { + __m512i highbits = _mm512_xor_si512(input, _mm512_set1_epi8(-62)); + __mmask64 invalid_leading_bytes = + _mm512_mask_cmpgt_epu8_mask(leading, highbits, one); -template -inline size_t convert_valid(const char16_t *buf, size_t len, - char32_t *utf32_output) { - const uint16_t *data = reinterpret_cast(buf); - size_t pos = 0; - char32_t *start{utf32_output}; - while (pos < len) { - uint16_t word = - !match_system(big_endian) ? utf16::swap_bytes(data[pos]) : data[pos]; - if ((word & 0xF800) != 0xD800) { - // No surrogate pair, extend 16-bit word to 32-bit word - *utf32_output++ = char32_t(word); - pos++; - } else { - // must be a surrogate pair - uint16_t diff = uint16_t(word - 0xD800); - if (pos + 1 >= len) { - return 0; - } // minimal bound checking - uint16_t next_word = !match_system(big_endian) - ? utf16::swap_bytes(data[pos + 1]) - : data[pos + 1]; - uint16_t diff2 = uint16_t(next_word - 0xDC00); - uint32_t value = (diff << 10) + diff2 + 0x10000; - *utf32_output++ = char32_t(value); - pos += 2; - } + if (invalid_leading_bytes) { + return 0; // Indicates error } - return utf32_output - start; -} -} // namespace utf16_to_utf32 -} // unnamed namespace -} // namespace scalar -} // namespace simdutf + __mmask64 leading_shift = (leading << 1) | *next_leading_ptr; -#endif -/* end file src/scalar/utf16_to_utf32/valid_utf16_to_utf32.h */ -/* begin file src/scalar/utf16_to_utf32/utf16_to_utf32.h */ -#ifndef SIMDUTF_UTF16_TO_UTF32_H -#define SIMDUTF_UTF16_TO_UTF32_H + if ((nonascii ^ leading) != leading_shift) { + return 0; // Indicates error + } -namespace simdutf { -namespace scalar { -namespace { -namespace utf16_to_utf32 { + const __mmask64 bit6 = _mm512_cmpeq_epi8_mask(highbits, one); + input = + _mm512_mask_sub_epi8(input, (bit6 << 1) | *next_bit6_ptr, input, minus64); -template -inline size_t convert(const char16_t *buf, size_t len, char32_t *utf32_output) { - const uint16_t *data = reinterpret_cast(buf); - size_t pos = 0; - char32_t *start{utf32_output}; - while (pos < len) { - uint16_t word = - !match_system(big_endian) ? utf16::swap_bytes(data[pos]) : data[pos]; - if ((word & 0xF800) != 0xD800) { - // No surrogate pair, extend 16-bit word to 32-bit word - *utf32_output++ = char32_t(word); - pos++; - } else { - // must be a surrogate pair - uint16_t diff = uint16_t(word - 0xD800); - if (diff > 0x3FF) { - return 0; - } - if (pos + 1 >= len) { - return 0; - } // minimal bound checking - uint16_t next_word = !match_system(big_endian) - ? utf16::swap_bytes(data[pos + 1]) - : data[pos + 1]; - uint16_t diff2 = uint16_t(next_word - 0xDC00); - if (diff2 > 0x3FF) { - return 0; - } - uint32_t value = (diff << 10) + diff2 + 0x10000; - *utf32_output++ = char32_t(value); - pos += 2; - } + __mmask64 retain = ~leading & load_mask; + __m512i output = _mm512_maskz_compress_epi8(retain, input); + int64_t written_out = count_ones(retain); + if (written_out == 0) { + return 0; // Indicates error } - return utf32_output - start; + *next_bit6_ptr = bit6 >> 63; + *next_leading_ptr = leading >> 63; + + __mmask64 store_mask = ~UINT64_C(0) >> (64 - written_out); + + _mm512_mask_storeu_epi8((__m512i *)latin_output, store_mask, output); + + return written_out; } -template -inline result convert_with_errors(const char16_t *buf, size_t len, - char32_t *utf32_output) { - const uint16_t *data = reinterpret_cast(buf); +size_t utf8_to_latin1_avx512(const char *&inbuf, size_t len, + char *&inlatin_output) { + const char *buf = inbuf; + char *latin_output = inlatin_output; + char *start = latin_output; size_t pos = 0; - char32_t *start{utf32_output}; - while (pos < len) { - uint16_t word = - !match_system(big_endian) ? utf16::swap_bytes(data[pos]) : data[pos]; - if ((word & 0xF800) != 0xD800) { - // No surrogate pair, extend 16-bit word to 32-bit word - *utf32_output++ = char32_t(word); - pos++; - } else { - // must be a surrogate pair - uint16_t diff = uint16_t(word - 0xD800); - if (diff > 0x3FF) { - return result(error_code::SURROGATE, pos); - } - if (pos + 1 >= len) { - return result(error_code::SURROGATE, pos); - } // minimal bound checking - uint16_t next_word = !match_system(big_endian) - ? utf16::swap_bytes(data[pos + 1]) - : data[pos + 1]; - uint16_t diff2 = uint16_t(next_word - 0xDC00); - if (diff2 > 0x3FF) { - return result(error_code::SURROGATE, pos); - } - uint32_t value = (diff << 10) + diff2 + 0x10000; - *utf32_output++ = char32_t(value); - pos += 2; + __m512i minus64 = _mm512_set1_epi8(-64); // 11111111111 ... 1100 0000 + __m512i one = _mm512_set1_epi8(1); + __mmask64 next_leading = 0; + __mmask64 next_bit6 = 0; + + while (pos + 64 <= len) { + size_t written = process_block_from_utf8_to_latin1( + buf + pos, 64, latin_output, minus64, one, &next_leading, &next_bit6); + if (written == 0) { + inlatin_output = latin_output; + inbuf = buf + pos - next_leading; + return 0; // Indicates error at pos or after, or just before pos (too + // short error) + } + latin_output += written; + pos += 64; + } + + if (pos < len) { + size_t remaining = len - pos; + size_t written = process_block_from_utf8_to_latin1( + buf + pos, remaining, latin_output, minus64, one, &next_leading, + &next_bit6); + if (written == 0) { + inbuf = buf + pos - next_leading; + inlatin_output = latin_output; + return 0; // Indicates error at pos or after, or just before pos (too + // short error) } + latin_output += written; } - return result(error_code::SUCCESS, utf32_output - start); + if (next_leading) { + inbuf = buf + len - next_leading; + inlatin_output = latin_output; + return 0; // Indicates error at end of buffer + } + inlatin_output = latin_output; + inbuf += len; + return size_t(latin_output - start); } +/* end file src/icelake/icelake_convert_utf8_to_latin1.inl.cpp */ +/* begin file src/icelake/icelake_convert_valid_utf8_to_latin1.inl.cpp */ +// file included directly -} // namespace utf16_to_utf32 -} // unnamed namespace -} // namespace scalar -} // namespace simdutf +// File contains conversion procedure from valid UTF-8 strings. -#endif -/* end file src/scalar/utf16_to_utf32/utf16_to_utf32.h */ +template +simdutf_really_inline size_t process_valid_block_from_utf8_to_latin1( + const char *buf, size_t len, char *latin_output, __m512i minus64, + __m512i one, __mmask64 *next_leading_ptr, __mmask64 *next_bit6_ptr) { + __mmask64 load_mask = + is_remaining ? _bzhi_u64(~0ULL, (unsigned int)len) : ~0ULL; + __m512i input = _mm512_maskz_loadu_epi8(load_mask, (__m512i *)buf); + __mmask64 nonascii = _mm512_movepi8_mask(input); -/* begin file src/scalar/utf8_to_utf16/valid_utf8_to_utf16.h */ -#ifndef SIMDUTF_VALID_UTF8_TO_UTF16_H -#define SIMDUTF_VALID_UTF8_TO_UTF16_H + if (nonascii == 0) { + is_remaining + ? _mm512_mask_storeu_epi8((__m512i *)latin_output, load_mask, input) + : _mm512_storeu_si512((__m512i *)latin_output, input); + return len; + } -namespace simdutf { -namespace scalar { -namespace { -namespace utf8_to_utf16 { + __mmask64 leading = _mm512_cmpge_epu8_mask(input, minus64); -template -inline size_t convert_valid(const char *buf, size_t len, - char16_t *utf16_output) { - const uint8_t *data = reinterpret_cast(buf); - size_t pos = 0; - char16_t *start{utf16_output}; - while (pos < len) { - // try to convert the next block of 8 ASCII bytes - if (pos + 8 <= - len) { // if it is safe to read 8 more bytes, check that they are ascii - uint64_t v; - ::memcpy(&v, data + pos, sizeof(uint64_t)); - if ((v & 0x8080808080808080) == 0) { - size_t final_pos = pos + 8; - while (pos < final_pos) { - *utf16_output++ = !match_system(big_endian) - ? char16_t(utf16::swap_bytes(buf[pos])) - : char16_t(buf[pos]); - pos++; - } - continue; - } - } - uint8_t leading_byte = data[pos]; // leading byte - if (leading_byte < 0b10000000) { - // converting one ASCII byte !!! - *utf16_output++ = !match_system(big_endian) - ? char16_t(utf16::swap_bytes(leading_byte)) - : char16_t(leading_byte); - pos++; - } else if ((leading_byte & 0b11100000) == 0b11000000) { - // We have a two-byte UTF-8, it should become - // a single UTF-16 word. - if (pos + 1 >= len) { - break; - } // minimal bound checking - uint16_t code_point = uint16_t(((leading_byte & 0b00011111) << 6) | - (data[pos + 1] & 0b00111111)); - if (!match_system(big_endian)) { - code_point = utf16::swap_bytes(uint16_t(code_point)); - } - *utf16_output++ = char16_t(code_point); - pos += 2; - } else if ((leading_byte & 0b11110000) == 0b11100000) { - // We have a three-byte UTF-8, it should become - // a single UTF-16 word. - if (pos + 2 >= len) { - break; - } // minimal bound checking - uint16_t code_point = uint16_t(((leading_byte & 0b00001111) << 12) | - ((data[pos + 1] & 0b00111111) << 6) | - (data[pos + 2] & 0b00111111)); - if (!match_system(big_endian)) { - code_point = utf16::swap_bytes(uint16_t(code_point)); - } - *utf16_output++ = char16_t(code_point); - pos += 3; - } else if ((leading_byte & 0b11111000) == 0b11110000) { // 0b11110000 - // we have a 4-byte UTF-8 word. - if (pos + 3 >= len) { - break; - } // minimal bound checking - uint32_t code_point = ((leading_byte & 0b00000111) << 18) | - ((data[pos + 1] & 0b00111111) << 12) | - ((data[pos + 2] & 0b00111111) << 6) | - (data[pos + 3] & 0b00111111); - code_point -= 0x10000; - uint16_t high_surrogate = uint16_t(0xD800 + (code_point >> 10)); - uint16_t low_surrogate = uint16_t(0xDC00 + (code_point & 0x3FF)); - if (!match_system(big_endian)) { - high_surrogate = utf16::swap_bytes(high_surrogate); - low_surrogate = utf16::swap_bytes(low_surrogate); - } - *utf16_output++ = char16_t(high_surrogate); - *utf16_output++ = char16_t(low_surrogate); - pos += 4; - } else { - // we may have a continuation but we do not do error checking - return 0; - } - } - return utf16_output - start; -} + __m512i highbits = _mm512_xor_si512(input, _mm512_set1_epi8(-62)); -} // namespace utf8_to_utf16 -} // unnamed namespace -} // namespace scalar -} // namespace simdutf + *next_leading_ptr = leading >> 63; -#endif -/* end file src/scalar/utf8_to_utf16/valid_utf8_to_utf16.h */ -/* begin file src/scalar/utf8_to_utf16/utf8_to_utf16.h */ -#ifndef SIMDUTF_UTF8_TO_UTF16_H -#define SIMDUTF_UTF8_TO_UTF16_H + __mmask64 bit6 = _mm512_cmpeq_epi8_mask(highbits, one); + input = + _mm512_mask_sub_epi8(input, (bit6 << 1) | *next_bit6_ptr, input, minus64); + *next_bit6_ptr = bit6 >> 63; -namespace simdutf { -namespace scalar { -namespace { -namespace utf8_to_utf16 { + __mmask64 retain = ~leading & load_mask; + __m512i output = _mm512_maskz_compress_epi8(retain, input); + int64_t written_out = count_ones(retain); + if (written_out == 0) { + return 0; // Indicates error + } + __mmask64 store_mask = ~UINT64_C(0) >> (64 - written_out); + // Optimization opportunity: sometimes, masked writes are not needed. + _mm512_mask_storeu_epi8((__m512i *)latin_output, store_mask, output); + return written_out; +} -template -inline size_t convert(const char *buf, size_t len, char16_t *utf16_output) { - const uint8_t *data = reinterpret_cast(buf); +size_t valid_utf8_to_latin1_avx512(const char *buf, size_t len, + char *latin_output) { + char *start = latin_output; size_t pos = 0; - char16_t *start{utf16_output}; - while (pos < len) { - // try to convert the next block of 16 ASCII bytes - if (pos + 16 <= - len) { // if it is safe to read 16 more bytes, check that they are ascii - uint64_t v1; - ::memcpy(&v1, data + pos, sizeof(uint64_t)); - uint64_t v2; - ::memcpy(&v2, data + pos + sizeof(uint64_t), sizeof(uint64_t)); - uint64_t v{v1 | v2}; - if ((v & 0x8080808080808080) == 0) { - size_t final_pos = pos + 16; - while (pos < final_pos) { - *utf16_output++ = !match_system(big_endian) - ? char16_t(utf16::swap_bytes(buf[pos])) - : char16_t(buf[pos]); - pos++; - } - continue; - } - } + __m512i minus64 = _mm512_set1_epi8(-64); // 11111111111 ... 1100 0000 + __m512i one = _mm512_set1_epi8(1); + __mmask64 next_leading = 0; + __mmask64 next_bit6 = 0; - uint8_t leading_byte = data[pos]; // leading byte - if (leading_byte < 0b10000000) { - // converting one ASCII byte !!! - *utf16_output++ = !match_system(big_endian) - ? char16_t(utf16::swap_bytes(leading_byte)) - : char16_t(leading_byte); - pos++; - } else if ((leading_byte & 0b11100000) == 0b11000000) { - // We have a two-byte UTF-8, it should become - // a single UTF-16 word. - if (pos + 1 >= len) { - return 0; - } // minimal bound checking - if ((data[pos + 1] & 0b11000000) != 0b10000000) { - return 0; - } - // range check - uint32_t code_point = - (leading_byte & 0b00011111) << 6 | (data[pos + 1] & 0b00111111); - if (code_point < 0x80 || 0x7ff < code_point) { - return 0; - } - if (!match_system(big_endian)) { - code_point = uint32_t(utf16::swap_bytes(uint16_t(code_point))); - } - *utf16_output++ = char16_t(code_point); - pos += 2; - } else if ((leading_byte & 0b11110000) == 0b11100000) { - // We have a three-byte UTF-8, it should become - // a single UTF-16 word. - if (pos + 2 >= len) { - return 0; - } // minimal bound checking + while (pos + 64 <= len) { + size_t written = process_valid_block_from_utf8_to_latin1( + buf + pos, 64, latin_output, minus64, one, &next_leading, &next_bit6); + latin_output += written; + pos += 64; + } - if ((data[pos + 1] & 0b11000000) != 0b10000000) { - return 0; - } - if ((data[pos + 2] & 0b11000000) != 0b10000000) { - return 0; - } - // range check - uint32_t code_point = (leading_byte & 0b00001111) << 12 | - (data[pos + 1] & 0b00111111) << 6 | - (data[pos + 2] & 0b00111111); - if (code_point < 0x800 || 0xffff < code_point || - (0xd7ff < code_point && code_point < 0xe000)) { - return 0; - } - if (!match_system(big_endian)) { - code_point = uint32_t(utf16::swap_bytes(uint16_t(code_point))); - } - *utf16_output++ = char16_t(code_point); - pos += 3; - } else if ((leading_byte & 0b11111000) == 0b11110000) { // 0b11110000 - // we have a 4-byte UTF-8 word. - if (pos + 3 >= len) { - return 0; - } // minimal bound checking - if ((data[pos + 1] & 0b11000000) != 0b10000000) { - return 0; - } - if ((data[pos + 2] & 0b11000000) != 0b10000000) { - return 0; - } - if ((data[pos + 3] & 0b11000000) != 0b10000000) { - return 0; - } + if (pos < len) { + size_t remaining = len - pos; + size_t written = process_valid_block_from_utf8_to_latin1( + buf + pos, remaining, latin_output, minus64, one, &next_leading, + &next_bit6); + latin_output += written; + } - // range check - uint32_t code_point = (leading_byte & 0b00000111) << 18 | - (data[pos + 1] & 0b00111111) << 12 | - (data[pos + 2] & 0b00111111) << 6 | - (data[pos + 3] & 0b00111111); - if (code_point <= 0xffff || 0x10ffff < code_point) { - return 0; - } - code_point -= 0x10000; - uint16_t high_surrogate = uint16_t(0xD800 + (code_point >> 10)); - uint16_t low_surrogate = uint16_t(0xDC00 + (code_point & 0x3FF)); - if (!match_system(big_endian)) { - high_surrogate = utf16::swap_bytes(high_surrogate); - low_surrogate = utf16::swap_bytes(low_surrogate); - } - *utf16_output++ = char16_t(high_surrogate); - *utf16_output++ = char16_t(low_surrogate); - pos += 4; - } else { + return (size_t)(latin_output - start); +} +/* end file src/icelake/icelake_convert_valid_utf8_to_latin1.inl.cpp */ +/* begin file src/icelake/icelake_convert_utf16_to_latin1.inl.cpp */ +// file included directly +template +size_t icelake_convert_utf16_to_latin1(const char16_t *buf, size_t len, + char *latin1_output) { + const char16_t *end = buf + len; + __m512i v_0xFF = _mm512_set1_epi16(0xff); + __m512i byteflip = _mm512_setr_epi64(0x0607040502030001, 0x0e0f0c0d0a0b0809, + 0x0607040502030001, 0x0e0f0c0d0a0b0809, + 0x0607040502030001, 0x0e0f0c0d0a0b0809, + 0x0607040502030001, 0x0e0f0c0d0a0b0809); + __m512i shufmask = _mm512_set_epi8( + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 62, 60, 58, 56, 54, 52, 50, 48, 46, 44, 42, 40, 38, + 36, 34, 32, 30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 0); + while (end - buf >= 32) { + __m512i in = _mm512_loadu_si512((__m512i *)buf); + if (big_endian) { + in = _mm512_shuffle_epi8(in, byteflip); + } + if (_mm512_cmpgt_epu16_mask(in, v_0xFF)) { return 0; } + _mm256_storeu_si256( + (__m256i *)latin1_output, + _mm512_castsi512_si256(_mm512_permutexvar_epi8(shufmask, in))); + latin1_output += 32; + buf += 32; } - return utf16_output - start; + if (buf < end) { + uint32_t mask(uint32_t(1 << (end - buf)) - 1); + __m512i in = _mm512_maskz_loadu_epi16(mask, buf); + if (big_endian) { + in = _mm512_shuffle_epi8(in, byteflip); + } + if (_mm512_cmpgt_epu16_mask(in, v_0xFF)) { + return 0; + } + _mm256_mask_storeu_epi8( + latin1_output, mask, + _mm512_castsi512_si256(_mm512_permutexvar_epi8(shufmask, in))); + } + return len; } template -inline result convert_with_errors(const char *buf, size_t len, - char16_t *utf16_output) { - const uint8_t *data = reinterpret_cast(buf); - size_t pos = 0; - char16_t *start{utf16_output}; - while (pos < len) { - // try to convert the next block of 16 ASCII bytes - if (pos + 16 <= - len) { // if it is safe to read 16 more bytes, check that they are ascii - uint64_t v1; - ::memcpy(&v1, data + pos, sizeof(uint64_t)); - uint64_t v2; - ::memcpy(&v2, data + pos + sizeof(uint64_t), sizeof(uint64_t)); - uint64_t v{v1 | v2}; - if ((v & 0x8080808080808080) == 0) { - size_t final_pos = pos + 16; - while (pos < final_pos) { - *utf16_output++ = !match_system(big_endian) - ? char16_t(utf16::swap_bytes(buf[pos])) - : char16_t(buf[pos]); - pos++; - } - continue; - } +std::pair +icelake_convert_utf16_to_latin1_with_errors(const char16_t *buf, size_t len, + char *latin1_output) { + const char16_t *end = buf + len; + const char16_t *start = buf; + __m512i byteflip = _mm512_setr_epi64(0x0607040502030001, 0x0e0f0c0d0a0b0809, + 0x0607040502030001, 0x0e0f0c0d0a0b0809, + 0x0607040502030001, 0x0e0f0c0d0a0b0809, + 0x0607040502030001, 0x0e0f0c0d0a0b0809); + __m512i v_0xFF = _mm512_set1_epi16(0xff); + __m512i shufmask = _mm512_set_epi8( + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 62, 60, 58, 56, 54, 52, 50, 48, 46, 44, 42, 40, 38, + 36, 34, 32, 30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 0); + while (end - buf >= 32) { + __m512i in = _mm512_loadu_si512((__m512i *)buf); + if (big_endian) { + in = _mm512_shuffle_epi8(in, byteflip); } - uint8_t leading_byte = data[pos]; // leading byte - if (leading_byte < 0b10000000) { - // converting one ASCII byte !!! - *utf16_output++ = !match_system(big_endian) - ? char16_t(utf16::swap_bytes(leading_byte)) - : char16_t(leading_byte); - pos++; - } else if ((leading_byte & 0b11100000) == 0b11000000) { - // We have a two-byte UTF-8, it should become - // a single UTF-16 word. - if (pos + 1 >= len) { - return result(error_code::TOO_SHORT, pos); - } // minimal bound checking - if ((data[pos + 1] & 0b11000000) != 0b10000000) { - return result(error_code::TOO_SHORT, pos); - } - // range check - uint32_t code_point = - (leading_byte & 0b00011111) << 6 | (data[pos + 1] & 0b00111111); - if (code_point < 0x80 || 0x7ff < code_point) { - return result(error_code::OVERLONG, pos); - } - if (!match_system(big_endian)) { - code_point = uint32_t(utf16::swap_bytes(uint16_t(code_point))); - } - *utf16_output++ = char16_t(code_point); - pos += 2; - } else if ((leading_byte & 0b11110000) == 0b11100000) { - // We have a three-byte UTF-8, it should become - // a single UTF-16 word. - if (pos + 2 >= len) { - return result(error_code::TOO_SHORT, pos); - } // minimal bound checking - - if ((data[pos + 1] & 0b11000000) != 0b10000000) { - return result(error_code::TOO_SHORT, pos); - } - if ((data[pos + 2] & 0b11000000) != 0b10000000) { - return result(error_code::TOO_SHORT, pos); - } - // range check - uint32_t code_point = (leading_byte & 0b00001111) << 12 | - (data[pos + 1] & 0b00111111) << 6 | - (data[pos + 2] & 0b00111111); - if ((code_point < 0x800) || (0xffff < code_point)) { - return result(error_code::OVERLONG, pos); - } - if (0xd7ff < code_point && code_point < 0xe000) { - return result(error_code::SURROGATE, pos); - } - if (!match_system(big_endian)) { - code_point = uint32_t(utf16::swap_bytes(uint16_t(code_point))); - } - *utf16_output++ = char16_t(code_point); - pos += 3; - } else if ((leading_byte & 0b11111000) == 0b11110000) { // 0b11110000 - // we have a 4-byte UTF-8 word. - if (pos + 3 >= len) { - return result(error_code::TOO_SHORT, pos); - } // minimal bound checking - if ((data[pos + 1] & 0b11000000) != 0b10000000) { - return result(error_code::TOO_SHORT, pos); - } - if ((data[pos + 2] & 0b11000000) != 0b10000000) { - return result(error_code::TOO_SHORT, pos); - } - if ((data[pos + 3] & 0b11000000) != 0b10000000) { - return result(error_code::TOO_SHORT, pos); + if (_mm512_cmpgt_epu16_mask(in, v_0xFF)) { + uint16_t word; + while ((word = (big_endian ? scalar::utf16::swap_bytes(uint16_t(*buf)) + : uint16_t(*buf))) <= 0xff) { + *latin1_output++ = uint8_t(word); + buf++; } + return std::make_pair(result(error_code::TOO_LARGE, buf - start), + latin1_output); + } + _mm256_storeu_si256( + (__m256i *)latin1_output, + _mm512_castsi512_si256(_mm512_permutexvar_epi8(shufmask, in))); + latin1_output += 32; + buf += 32; + } + if (buf < end) { + uint32_t mask(uint32_t(1 << (end - buf)) - 1); + __m512i in = _mm512_maskz_loadu_epi16(mask, buf); + if (big_endian) { + in = _mm512_shuffle_epi8(in, byteflip); + } + if (_mm512_cmpgt_epu16_mask(in, v_0xFF)) { - // range check - uint32_t code_point = (leading_byte & 0b00000111) << 18 | - (data[pos + 1] & 0b00111111) << 12 | - (data[pos + 2] & 0b00111111) << 6 | - (data[pos + 3] & 0b00111111); - if (code_point <= 0xffff) { - return result(error_code::OVERLONG, pos); - } - if (0x10ffff < code_point) { - return result(error_code::TOO_LARGE, pos); - } - code_point -= 0x10000; - uint16_t high_surrogate = uint16_t(0xD800 + (code_point >> 10)); - uint16_t low_surrogate = uint16_t(0xDC00 + (code_point & 0x3FF)); - if (!match_system(big_endian)) { - high_surrogate = utf16::swap_bytes(high_surrogate); - low_surrogate = utf16::swap_bytes(low_surrogate); - } - *utf16_output++ = char16_t(high_surrogate); - *utf16_output++ = char16_t(low_surrogate); - pos += 4; - } else { - // we either have too many continuation bytes or an invalid leading byte - if ((leading_byte & 0b11000000) == 0b10000000) { - return result(error_code::TOO_LONG, pos); - } else { - return result(error_code::HEADER_BITS, pos); + uint16_t word; + while ((word = (big_endian ? scalar::utf16::swap_bytes(uint16_t(*buf)) + : uint16_t(*buf))) <= 0xff) { + *latin1_output++ = uint8_t(word); + buf++; } + return std::make_pair(result(error_code::TOO_LARGE, buf - start), + latin1_output); } + _mm256_mask_storeu_epi8( + latin1_output, mask, + _mm512_castsi512_si256(_mm512_permutexvar_epi8(shufmask, in))); } - return result(error_code::SUCCESS, utf16_output - start); + return std::make_pair(result(error_code::SUCCESS, len), latin1_output); } +/* end file src/icelake/icelake_convert_utf16_to_latin1.inl.cpp */ +/* begin file src/icelake/icelake_convert_utf16_to_utf8.inl.cpp */ +// file included directly /** - * When rewind_and_convert_with_errors is called, we are pointing at 'buf' and - * we have up to len input bytes left, and we encountered some error. It is - * possible that the error is at 'buf' exactly, but it could also be in the - * previous bytes (up to 3 bytes back). - * - * prior_bytes indicates how many bytes, prior to 'buf' may belong to the - * current memory section and can be safely accessed. We prior_bytes to access - * safely up to three bytes before 'buf'. - * - * The caller is responsible to ensure that len > 0. - * - * If the error is believed to have occurred prior to 'buf', the count value - * contain in the result will be SIZE_T - 1, SIZE_T - 2, or SIZE_T - 3. + * This function converts the input (inbuf, inlen), assumed to be valid + * UTF16 (little endian) into UTF-8 (to outbuf). The number of code units + * written is written to 'outlen' and the function reports the number of input + * word consumed. */ -template -inline result rewind_and_convert_with_errors(size_t prior_bytes, - const char *buf, size_t len, - char16_t *utf16_output) { - size_t extra_len{0}; - // We potentially need to go back in time and find a leading byte. - // In theory '3' would be sufficient, but sometimes the error can go back - // quite far. - size_t how_far_back = prior_bytes; - // size_t how_far_back = 3; // 3 bytes in the past + current position - // if(how_far_back >= prior_bytes) { how_far_back = prior_bytes; } - bool found_leading_bytes{false}; - // important: it is i <= how_far_back and not 'i < how_far_back'. - for (size_t i = 0; i <= how_far_back; i++) { - unsigned char byte = buf[-static_cast(i)]; - found_leading_bytes = ((byte & 0b11000000) != 0b10000000); - if (found_leading_bytes) { - if (i > 0 && byte < 128) { - // If we had to go back and the leading byte is ascii - // then we can stop right away. - return result(error_code::TOO_LONG, 0 - i + 1); - } - buf -= i; - extra_len = i; - break; +template +size_t utf16_to_utf8_avx512i(const char16_t *inbuf, size_t inlen, + unsigned char *outbuf, size_t *outlen) { + __m512i in; + __mmask32 inmask = _cvtu32_mask32(0x7fffffff); + __m512i byteflip = _mm512_setr_epi64(0x0607040502030001, 0x0e0f0c0d0a0b0809, + 0x0607040502030001, 0x0e0f0c0d0a0b0809, + 0x0607040502030001, 0x0e0f0c0d0a0b0809, + 0x0607040502030001, 0x0e0f0c0d0a0b0809); + const char16_t *const inbuf_orig = inbuf; + const unsigned char *const outbuf_orig = outbuf; + int adjust = 0; + int carry = 0; + + while (inlen >= 32) { + in = _mm512_loadu_si512(inbuf); + if (big_endian) { + in = _mm512_shuffle_epi8(in, byteflip); } - } - // - // It is possible for this function to return a negative count in its result. - // C++ Standard Section 18.1 defines size_t is in which is described - // in C Standard as . C Standard Section 4.1.5 defines size_t as an - // unsigned integral type of the result of the sizeof operator - // - // An unsigned type will simply wrap round arithmetically (well defined). - // - if (!found_leading_bytes) { - // If how_far_back == 3, we may have four consecutive continuation bytes!!! - // [....] [continuation] [continuation] [continuation] | [buf is - // continuation] Or we possibly have a stream that does not start with a - // leading byte. - return result(error_code::TOO_LONG, 0 - how_far_back); - } - result res = convert_with_errors(buf, len + extra_len, utf16_output); - if (res.error) { - res.count -= extra_len; - } - return res; -} + inlen -= 31; + lastiteration: + inbuf += 31; -} // namespace utf8_to_utf16 -} // unnamed namespace -} // namespace scalar -} // namespace simdutf + failiteration: + const __mmask32 is234byte = _mm512_mask_cmp_epu16_mask( + inmask, in, _mm512_set1_epi16(0x0080), _MM_CMPINT_NLT); -#endif -/* end file src/scalar/utf8_to_utf16/utf8_to_utf16.h */ + if (_ktestz_mask32_u8(inmask, is234byte)) { + // fast path for ASCII only + _mm512_mask_cvtepi16_storeu_epi8(outbuf, inmask, in); + outbuf += 31; + carry = 0; -/* begin file src/scalar/utf8_to_utf32/valid_utf8_to_utf32.h */ -#ifndef SIMDUTF_VALID_UTF8_TO_UTF32_H -#define SIMDUTF_VALID_UTF8_TO_UTF32_H + if (inlen < 32) { + goto tail; + } else { + continue; + } + } -namespace simdutf { -namespace scalar { -namespace { -namespace utf8_to_utf32 { + const __mmask32 is12byte = + _mm512_cmp_epu16_mask(in, _mm512_set1_epi16(0x0800), _MM_CMPINT_LT); -inline size_t convert_valid(const char *buf, size_t len, - char32_t *utf32_output) { - const uint8_t *data = reinterpret_cast(buf); - size_t pos = 0; - char32_t *start{utf32_output}; - while (pos < len) { - // try to convert the next block of 8 ASCII bytes - if (pos + 8 <= - len) { // if it is safe to read 8 more bytes, check that they are ascii - uint64_t v; - ::memcpy(&v, data + pos, sizeof(uint64_t)); - if ((v & 0x8080808080808080) == 0) { - size_t final_pos = pos + 8; - while (pos < final_pos) { - *utf32_output++ = char32_t(buf[pos]); - pos++; - } + if (_ktestc_mask32_u8(is12byte, inmask)) { + // fast path for 1 and 2 byte only + + const __m512i twobytes = _mm512_ternarylogic_epi32( + _mm512_slli_epi16(in, 8), _mm512_srli_epi16(in, 6), + _mm512_set1_epi16(0x3f3f), 0xa8); // (A|B)&C + in = _mm512_mask_add_epi16(in, is234byte, twobytes, + _mm512_set1_epi16(int16_t(0x80c0))); + const __m512i cmpmask = + _mm512_mask_blend_epi16(inmask, _mm512_set1_epi16(int16_t(0xffff)), + _mm512_set1_epi16(0x0800)); + const __mmask64 smoosh = + _mm512_cmp_epu8_mask(in, cmpmask, _MM_CMPINT_NLT); + const __m512i out = _mm512_maskz_compress_epi8(smoosh, in); + _mm512_mask_storeu_epi8(outbuf, + _cvtu64_mask64(_pext_u64(_cvtmask64_u64(smoosh), + _cvtmask64_u64(smoosh))), + out); + outbuf += 31 + _mm_popcnt_u32(_cvtmask32_u32(is234byte)); + carry = 0; + + if (inlen < 32) { + goto tail; + } else { continue; } } - uint8_t leading_byte = data[pos]; // leading byte - if (leading_byte < 0b10000000) { - // converting one ASCII byte !!! - *utf32_output++ = char32_t(leading_byte); - pos++; - } else if ((leading_byte & 0b11100000) == 0b11000000) { - // We have a two-byte UTF-8 - if (pos + 1 >= len) { - break; - } // minimal bound checking - *utf32_output++ = char32_t(((leading_byte & 0b00011111) << 6) | - (data[pos + 1] & 0b00111111)); - pos += 2; - } else if ((leading_byte & 0b11110000) == 0b11100000) { - // We have a three-byte UTF-8 - if (pos + 2 >= len) { - break; - } // minimal bound checking - *utf32_output++ = char32_t(((leading_byte & 0b00001111) << 12) | - ((data[pos + 1] & 0b00111111) << 6) | - (data[pos + 2] & 0b00111111)); - pos += 3; - } else if ((leading_byte & 0b11111000) == 0b11110000) { // 0b11110000 - // we have a 4-byte UTF-8 word. - if (pos + 3 >= len) { - break; - } // minimal bound checking - uint32_t code_word = ((leading_byte & 0b00000111) << 18) | - ((data[pos + 1] & 0b00111111) << 12) | - ((data[pos + 2] & 0b00111111) << 6) | - (data[pos + 3] & 0b00111111); - *utf32_output++ = char32_t(code_word); - pos += 4; - } else { - // we may have a continuation but we do not do error checking - return 0; + __m512i lo = _mm512_cvtepu16_epi32(_mm512_castsi512_si256(in)); + __m512i hi = _mm512_cvtepu16_epi32(_mm512_extracti32x8_epi32(in, 1)); + + __m512i taglo = _mm512_set1_epi32(0x8080e000); + __m512i taghi = taglo; + + const __m512i fc00masked = + _mm512_and_epi32(in, _mm512_set1_epi16(int16_t(0xfc00))); + const __mmask32 hisurr = _mm512_mask_cmp_epu16_mask( + inmask, fc00masked, _mm512_set1_epi16(int16_t(0xd800)), _MM_CMPINT_EQ); + const __mmask32 losurr = _mm512_cmp_epu16_mask( + fc00masked, _mm512_set1_epi16(int16_t(0xdc00)), _MM_CMPINT_EQ); + + int carryout = 0; + if (!_kortestz_mask32_u8(hisurr, losurr)) { + // handle surrogates + + __m512i los = _mm512_alignr_epi32(hi, lo, 1); + __m512i his = _mm512_alignr_epi32(lo, hi, 1); + + const __mmask32 hisurrhi = _kshiftri_mask32(hisurr, 16); + taglo = _mm512_mask_mov_epi32(taglo, __mmask16(hisurr), + _mm512_set1_epi32(0x808080f0)); + taghi = _mm512_mask_mov_epi32(taghi, __mmask16(hisurrhi), + _mm512_set1_epi32(0x808080f0)); + + lo = _mm512_mask_slli_epi32(lo, __mmask16(hisurr), lo, 10); + hi = _mm512_mask_slli_epi32(hi, __mmask16(hisurrhi), hi, 10); + los = _mm512_add_epi32(los, _mm512_set1_epi32(0xfca02400)); + his = _mm512_add_epi32(his, _mm512_set1_epi32(0xfca02400)); + lo = _mm512_mask_add_epi32(lo, __mmask16(hisurr), lo, los); + hi = _mm512_mask_add_epi32(hi, __mmask16(hisurrhi), hi, his); + + carryout = _cvtu32_mask32(_kshiftri_mask32(hisurr, 30)); + + const uint32_t h = _cvtmask32_u32(hisurr); + const uint32_t l = _cvtmask32_u32(losurr); + // check for mismatched surrogates + if ((h + h + carry) ^ l) { + const uint32_t lonohi = l & ~(h + h + carry); + const uint32_t hinolo = h & ~(l >> 1); + inlen = _tzcnt_u32(hinolo | lonohi); + inmask = __mmask32(0x7fffffff & ((1U << inlen) - 1)); + in = _mm512_maskz_mov_epi16(inmask, in); + adjust = (int)inlen - 31; + inlen = 0; + goto failiteration; + } + } + + hi = _mm512_maskz_mov_epi32(_cvtu32_mask16(0x7fff), hi); + carry = carryout; + + __m512i mslo = + _mm512_multishift_epi64_epi8(_mm512_set1_epi64(0x20262c3200060c12), lo); + + __m512i mshi = + _mm512_multishift_epi64_epi8(_mm512_set1_epi64(0x20262c3200060c12), hi); + + const __mmask32 outmask = __mmask32(_kandn_mask64(losurr, inmask)); + const __mmask64 outmhi = _kshiftri_mask64(outmask, 16); + + const __mmask32 is1byte = __mmask32(_knot_mask64(is234byte)); + const __mmask64 is1bhi = _kshiftri_mask64(is1byte, 16); + const __mmask64 is12bhi = _kshiftri_mask64(is12byte, 16); + + taglo = _mm512_mask_mov_epi32(taglo, __mmask16(is12byte), + _mm512_set1_epi32(0x80c00000)); + taghi = _mm512_mask_mov_epi32(taghi, __mmask16(is12bhi), + _mm512_set1_epi32(0x80c00000)); + __m512i magiclo = _mm512_mask_blend_epi32(__mmask16(outmask), + _mm512_set1_epi32(0xffffffff), + _mm512_set1_epi32(0x00010101)); + __m512i magichi = _mm512_mask_blend_epi32(__mmask16(outmhi), + _mm512_set1_epi32(0xffffffff), + _mm512_set1_epi32(0x00010101)); + + magiclo = _mm512_mask_blend_epi32(__mmask16(outmask), + _mm512_set1_epi32(0xffffffff), + _mm512_set1_epi32(0x00010101)); + magichi = _mm512_mask_blend_epi32(__mmask16(outmhi), + _mm512_set1_epi32(0xffffffff), + _mm512_set1_epi32(0x00010101)); + + mslo = _mm512_ternarylogic_epi32(mslo, _mm512_set1_epi32(0x3f3f3f3f), taglo, + 0xea); // A&B|C + mshi = _mm512_ternarylogic_epi32(mshi, _mm512_set1_epi32(0x3f3f3f3f), taghi, + 0xea); + mslo = _mm512_mask_slli_epi32(mslo, __mmask16(is1byte), lo, 24); + + mshi = _mm512_mask_slli_epi32(mshi, __mmask16(is1bhi), hi, 24); + + const __mmask64 wantlo = + _mm512_cmp_epu8_mask(mslo, magiclo, _MM_CMPINT_NLT); + const __mmask64 wanthi = + _mm512_cmp_epu8_mask(mshi, magichi, _MM_CMPINT_NLT); + const __m512i outlo = _mm512_maskz_compress_epi8(wantlo, mslo); + const __m512i outhi = _mm512_maskz_compress_epi8(wanthi, mshi); + const uint64_t wantlo_uint64 = _cvtmask64_u64(wantlo); + const uint64_t wanthi_uint64 = _cvtmask64_u64(wanthi); + + uint64_t advlo = _mm_popcnt_u64(wantlo_uint64); + uint64_t advhi = _mm_popcnt_u64(wanthi_uint64); + + _mm512_mask_storeu_epi8( + outbuf, _cvtu64_mask64(_pext_u64(wantlo_uint64, wantlo_uint64)), outlo); + _mm512_mask_storeu_epi8( + outbuf + advlo, _cvtu64_mask64(_pext_u64(wanthi_uint64, wanthi_uint64)), + outhi); + outbuf += advlo + advhi; + } + outbuf += -adjust; + +tail: + if (inlen != 0) { + // We must have inlen < 31. + inmask = _cvtu32_mask32((1U << inlen) - 1); + in = _mm512_maskz_loadu_epi16(inmask, inbuf); + if (big_endian) { + in = _mm512_shuffle_epi8(in, byteflip); } + adjust = (int)inlen - 31; + inlen = 0; + goto lastiteration; } - return utf32_output - start; + *outlen = (outbuf - outbuf_orig) + adjust; + return ((inbuf - inbuf_orig) + adjust); } +/* end file src/icelake/icelake_convert_utf16_to_utf8.inl.cpp */ +/* begin file src/icelake/icelake_convert_utf16_to_utf32.inl.cpp */ +// file included directly -} // namespace utf8_to_utf32 -} // unnamed namespace -} // namespace scalar -} // namespace simdutf +/* + Returns a pair: the first unprocessed byte from buf and utf32_output + A scalar routing should carry on the conversion of the tail. +*/ +template +std::tuple +convert_utf16_to_utf32(const char16_t *buf, size_t len, + char32_t *utf32_output) { + const char16_t *end = buf + len; + const __m512i v_fc00 = _mm512_set1_epi16((uint16_t)0xfc00); + const __m512i v_d800 = _mm512_set1_epi16((uint16_t)0xd800); + const __m512i v_dc00 = _mm512_set1_epi16((uint16_t)0xdc00); + __mmask32 carry{0}; + const __m512i byteflip = _mm512_setr_epi64( + 0x0607040502030001, 0x0e0f0c0d0a0b0809, 0x0607040502030001, + 0x0e0f0c0d0a0b0809, 0x0607040502030001, 0x0e0f0c0d0a0b0809, + 0x0607040502030001, 0x0e0f0c0d0a0b0809); + while (std::distance(buf, end) >= 32) { + // Always safe because buf + 32 <= end so that end - buf >= 32 bytes: + __m512i in = _mm512_loadu_si512((__m512i *)buf); + if (big_endian) { + in = _mm512_shuffle_epi8(in, byteflip); + } -#endif -/* end file src/scalar/utf8_to_utf32/valid_utf8_to_utf32.h */ -/* begin file src/scalar/utf8_to_utf32/utf8_to_utf32.h */ -#ifndef SIMDUTF_UTF8_TO_UTF32_H -#define SIMDUTF_UTF8_TO_UTF32_H + // H - bitmask for high surrogates + const __mmask32 H = + _mm512_cmpeq_epi16_mask(_mm512_and_si512(in, v_fc00), v_d800); + // H - bitmask for low surrogates + const __mmask32 L = + _mm512_cmpeq_epi16_mask(_mm512_and_si512(in, v_fc00), v_dc00); -namespace simdutf { -namespace scalar { -namespace { -namespace utf8_to_utf32 { + if ((H | L)) { + // surrogate pair(s) in a register + const __mmask32 V = + (L ^ + (carry | (H << 1))); // A high surrogate must be followed by low one + // and a low one must be preceded by a high one. + // If valid, V should be equal to 0 -inline size_t convert(const char *buf, size_t len, char32_t *utf32_output) { - const uint8_t *data = reinterpret_cast(buf); - size_t pos = 0; - char32_t *start{utf32_output}; - while (pos < len) { - // try to convert the next block of 16 ASCII bytes - if (pos + 16 <= - len) { // if it is safe to read 16 more bytes, check that they are ascii - uint64_t v1; - ::memcpy(&v1, data + pos, sizeof(uint64_t)); - uint64_t v2; - ::memcpy(&v2, data + pos + sizeof(uint64_t), sizeof(uint64_t)); - uint64_t v{v1 | v2}; - if ((v & 0x8080808080808080) == 0) { - size_t final_pos = pos + 16; - while (pos < final_pos) { - *utf32_output++ = char32_t(buf[pos]); - pos++; - } - continue; - } - } - uint8_t leading_byte = data[pos]; // leading byte - if (leading_byte < 0b10000000) { - // converting one ASCII byte !!! - *utf32_output++ = char32_t(leading_byte); - pos++; - } else if ((leading_byte & 0b11100000) == 0b11000000) { - // We have a two-byte UTF-8 - if (pos + 1 >= len) { - return 0; - } // minimal bound checking - if ((data[pos + 1] & 0b11000000) != 0b10000000) { - return 0; - } - // range check - uint32_t code_point = - (leading_byte & 0b00011111) << 6 | (data[pos + 1] & 0b00111111); - if (code_point < 0x80 || 0x7ff < code_point) { - return 0; - } - *utf32_output++ = char32_t(code_point); - pos += 2; - } else if ((leading_byte & 0b11110000) == 0b11100000) { - // We have a three-byte UTF-8 - if (pos + 2 >= len) { - return 0; - } // minimal bound checking + if (V == 0) { + // valid case + /* + Input surrogate pair: + |1101.11aa.aaaa.aaaa|1101.10bb.bbbb.bbbb| + low surrogate high surrogate + */ + /* 1. Expand all code units to 32-bit code units + in + |0000.0000.0000.0000.1101.11aa.aaaa.aaaa|0000.0000.0000.0000.1101.10bb.bbbb.bbbb| + */ + const __m512i first = _mm512_cvtepu16_epi32(_mm512_castsi512_si256(in)); + const __m512i second = + _mm512_cvtepu16_epi32(_mm512_extracti32x8_epi32(in, 1)); - if ((data[pos + 1] & 0b11000000) != 0b10000000) { - return 0; - } - if ((data[pos + 2] & 0b11000000) != 0b10000000) { - return 0; - } - // range check - uint32_t code_point = (leading_byte & 0b00001111) << 12 | - (data[pos + 1] & 0b00111111) << 6 | - (data[pos + 2] & 0b00111111); - if (code_point < 0x800 || 0xffff < code_point || - (0xd7ff < code_point && code_point < 0xe000)) { - return 0; - } - *utf32_output++ = char32_t(code_point); - pos += 3; - } else if ((leading_byte & 0b11111000) == 0b11110000) { // 0b11110000 - // we have a 4-byte UTF-8 word. - if (pos + 3 >= len) { - return 0; - } // minimal bound checking - if ((data[pos + 1] & 0b11000000) != 0b10000000) { - return 0; - } - if ((data[pos + 2] & 0b11000000) != 0b10000000) { - return 0; - } - if ((data[pos + 3] & 0b11000000) != 0b10000000) { - return 0; - } + /* 2. Shift by one 16-bit word to align low surrogates with high + surrogates in + |0000.0000.0000.0000.1101.11aa.aaaa.aaaa|0000.0000.0000.0000.1101.10bb.bbbb.bbbb| + shifted + |????.????.????.????.????.????.????.????|0000.0000.0000.0000.1101.11aa.aaaa.aaaa| + */ + const __m512i shifted_first = _mm512_alignr_epi32(second, first, 1); + const __m512i shifted_second = + _mm512_alignr_epi32(_mm512_setzero_si512(), second, 1); - // range check - uint32_t code_point = (leading_byte & 0b00000111) << 18 | - (data[pos + 1] & 0b00111111) << 12 | - (data[pos + 2] & 0b00111111) << 6 | - (data[pos + 3] & 0b00111111); - if (code_point <= 0xffff || 0x10ffff < code_point) { - return 0; + /* 3. Align all high surrogates in first and second by shifting to the + left by 10 bits + |0000.0000.0000.0000.1101.11aa.aaaa.aaaa|0000.0011.0110.bbbb.bbbb.bb00.0000.0000| + */ + const __m512i aligned_first = + _mm512_mask_slli_epi32(first, (__mmask16)H, first, 10); + const __m512i aligned_second = + _mm512_mask_slli_epi32(second, (__mmask16)(H >> 16), second, 10); + + /* 4. Remove surrogate prefixes and add offset 0x10000 by adding in, + shifted and constant in + |0000.0000.0000.0000.1101.11aa.aaaa.aaaa|0000.0011.0110.bbbb.bbbb.bb00.0000.0000| + shifted + |????.????.????.????.????.????.????.????|0000.0000.0000.0000.1101.11aa.aaaa.aaaa| + constant|1111.1100.1010.0000.0010.0100.0000.0000|1111.1100.1010.0000.0010.0100.0000.0000| + */ + const __m512i constant = _mm512_set1_epi32((uint32_t)0xfca02400); + const __m512i added_first = _mm512_mask_add_epi32( + aligned_first, (__mmask16)H, aligned_first, shifted_first); + const __m512i utf32_first = _mm512_mask_add_epi32( + added_first, (__mmask16)H, added_first, constant); + + const __m512i added_second = + _mm512_mask_add_epi32(aligned_second, (__mmask16)(H >> 16), + aligned_second, shifted_second); + const __m512i utf32_second = _mm512_mask_add_epi32( + added_second, (__mmask16)(H >> 16), added_second, constant); + + // 5. Store all valid UTF-32 code units (low surrogate positions and + // 32nd word are invalid) + const __mmask32 valid = ~L & 0x7fffffff; + // We deliberately do a _mm512_maskz_compress_epi32 followed by + // storeu_epi32 to ease performance portability to Zen 4. + const __m512i compressed_first = + _mm512_maskz_compress_epi32((__mmask16)(valid), utf32_first); + const size_t howmany1 = count_ones((uint16_t)(valid)); + _mm512_storeu_si512((__m512i *)utf32_output, compressed_first); + utf32_output += howmany1; + const __m512i compressed_second = + _mm512_maskz_compress_epi32((__mmask16)(valid >> 16), utf32_second); + const size_t howmany2 = count_ones((uint16_t)(valid >> 16)); + // The following could be unsafe in some cases? + //_mm512_storeu_epi32((__m512i *) utf32_output, compressed_second); + _mm512_mask_storeu_epi32((__m512i *)utf32_output, + __mmask16((1 << howmany2) - 1), + compressed_second); + utf32_output += howmany2; + // Only process 31 code units, but keep track if the 31st word is a high + // surrogate as a carry + buf += 31; + carry = (H >> 30) & 0x1; + } else { + // invalid case + return std::make_tuple(buf + carry, utf32_output, false); } - *utf32_output++ = char32_t(code_point); - pos += 4; } else { + // no surrogates + // extend all thirty-two 16-bit code units to thirty-two 32-bit code units + _mm512_storeu_si512((__m512i *)(utf32_output), + _mm512_cvtepu16_epi32(_mm512_castsi512_si256(in))); + _mm512_storeu_si512( + (__m512i *)(utf32_output) + 1, + _mm512_cvtepu16_epi32(_mm512_extracti32x8_epi32(in, 1))); + utf32_output += 32; + buf += 32; + carry = 0; + } + } // while + return std::make_tuple(buf + carry, utf32_output, true); +} +/* end file src/icelake/icelake_convert_utf16_to_utf32.inl.cpp */ +/* begin file src/icelake/icelake_convert_utf32_to_latin1.inl.cpp */ +// file included directly +size_t icelake_convert_utf32_to_latin1(const char32_t *buf, size_t len, + char *latin1_output) { + const char32_t *end = buf + len; + __m512i v_0xFF = _mm512_set1_epi32(0xff); + __m512i shufmask = _mm512_set_epi8( + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, + 56, 52, 48, 44, 40, 36, 32, 28, 24, 20, 16, 12, 8, 4, 0); + while (end - buf >= 16) { + __m512i in = _mm512_loadu_si512((__m512i *)buf); + if (_mm512_cmpgt_epu32_mask(in, v_0xFF)) { return 0; } + _mm_storeu_si128( + (__m128i *)latin1_output, + _mm512_castsi512_si128(_mm512_permutexvar_epi8(shufmask, in))); + latin1_output += 16; + buf += 16; } - return utf32_output - start; + if (buf < end) { + uint16_t mask = uint16_t((1 << (end - buf)) - 1); + __m512i in = _mm512_maskz_loadu_epi32(mask, buf); + if (_mm512_cmpgt_epu32_mask(in, v_0xFF)) { + return 0; + } + _mm_mask_storeu_epi8( + latin1_output, mask, + _mm512_castsi512_si128(_mm512_permutexvar_epi8(shufmask, in))); + } + return len; } -inline result convert_with_errors(const char *buf, size_t len, - char32_t *utf32_output) { - const uint8_t *data = reinterpret_cast(buf); - size_t pos = 0; - char32_t *start{utf32_output}; - while (pos < len) { - // try to convert the next block of 16 ASCII bytes - if (pos + 16 <= - len) { // if it is safe to read 16 more bytes, check that they are ascii - uint64_t v1; - ::memcpy(&v1, data + pos, sizeof(uint64_t)); - uint64_t v2; - ::memcpy(&v2, data + pos + sizeof(uint64_t), sizeof(uint64_t)); - uint64_t v{v1 | v2}; - if ((v & 0x8080808080808080) == 0) { - size_t final_pos = pos + 16; - while (pos < final_pos) { - *utf32_output++ = char32_t(buf[pos]); - pos++; - } - continue; +std::pair +icelake_convert_utf32_to_latin1_with_errors(const char32_t *buf, size_t len, + char *latin1_output) { + const char32_t *end = buf + len; + const char32_t *start = buf; + __m512i v_0xFF = _mm512_set1_epi32(0xff); + __m512i shufmask = _mm512_set_epi8( + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, + 56, 52, 48, 44, 40, 36, 32, 28, 24, 20, 16, 12, 8, 4, 0); + while (end - buf >= 16) { + __m512i in = _mm512_loadu_si512((__m512i *)buf); + if (_mm512_cmpgt_epu32_mask(in, v_0xFF)) { + while (uint32_t(*buf) <= 0xff) { + *latin1_output++ = uint8_t(*buf++); } + return std::make_pair(result(error_code::TOO_LARGE, buf - start), + latin1_output); } - uint8_t leading_byte = data[pos]; // leading byte - if (leading_byte < 0b10000000) { - // converting one ASCII byte !!! - *utf32_output++ = char32_t(leading_byte); - pos++; - } else if ((leading_byte & 0b11100000) == 0b11000000) { - // We have a two-byte UTF-8 - if (pos + 1 >= len) { - return result(error_code::TOO_SHORT, pos); - } // minimal bound checking - if ((data[pos + 1] & 0b11000000) != 0b10000000) { - return result(error_code::TOO_SHORT, pos); - } - // range check - uint32_t code_point = - (leading_byte & 0b00011111) << 6 | (data[pos + 1] & 0b00111111); - if (code_point < 0x80 || 0x7ff < code_point) { - return result(error_code::OVERLONG, pos); - } - *utf32_output++ = char32_t(code_point); - pos += 2; - } else if ((leading_byte & 0b11110000) == 0b11100000) { - // We have a three-byte UTF-8 - if (pos + 2 >= len) { - return result(error_code::TOO_SHORT, pos); - } // minimal bound checking - - if ((data[pos + 1] & 0b11000000) != 0b10000000) { - return result(error_code::TOO_SHORT, pos); - } - if ((data[pos + 2] & 0b11000000) != 0b10000000) { - return result(error_code::TOO_SHORT, pos); - } - // range check - uint32_t code_point = (leading_byte & 0b00001111) << 12 | - (data[pos + 1] & 0b00111111) << 6 | - (data[pos + 2] & 0b00111111); - if (code_point < 0x800 || 0xffff < code_point) { - return result(error_code::OVERLONG, pos); - } - if (0xd7ff < code_point && code_point < 0xe000) { - return result(error_code::SURROGATE, pos); - } - *utf32_output++ = char32_t(code_point); - pos += 3; - } else if ((leading_byte & 0b11111000) == 0b11110000) { // 0b11110000 - // we have a 4-byte UTF-8 word. - if (pos + 3 >= len) { - return result(error_code::TOO_SHORT, pos); - } // minimal bound checking - if ((data[pos + 1] & 0b11000000) != 0b10000000) { - return result(error_code::TOO_SHORT, pos); - } - if ((data[pos + 2] & 0b11000000) != 0b10000000) { - return result(error_code::TOO_SHORT, pos); - } - if ((data[pos + 3] & 0b11000000) != 0b10000000) { - return result(error_code::TOO_SHORT, pos); - } - - // range check - uint32_t code_point = (leading_byte & 0b00000111) << 18 | - (data[pos + 1] & 0b00111111) << 12 | - (data[pos + 2] & 0b00111111) << 6 | - (data[pos + 3] & 0b00111111); - if (code_point <= 0xffff) { - return result(error_code::OVERLONG, pos); - } - if (0x10ffff < code_point) { - return result(error_code::TOO_LARGE, pos); - } - *utf32_output++ = char32_t(code_point); - pos += 4; - } else { - // we either have too many continuation bytes or an invalid leading byte - if ((leading_byte & 0b11000000) == 0b10000000) { - return result(error_code::TOO_LONG, pos); - } else { - return result(error_code::HEADER_BITS, pos); + _mm_storeu_si128( + (__m128i *)latin1_output, + _mm512_castsi512_si128(_mm512_permutexvar_epi8(shufmask, in))); + latin1_output += 16; + buf += 16; + } + if (buf < end) { + uint16_t mask = uint16_t((1 << (end - buf)) - 1); + __m512i in = _mm512_maskz_loadu_epi32(mask, buf); + if (_mm512_cmpgt_epu32_mask(in, v_0xFF)) { + while (uint32_t(*buf) <= 0xff) { + *latin1_output++ = uint8_t(*buf++); } + return std::make_pair(result(error_code::TOO_LARGE, buf - start), + latin1_output); } + _mm_mask_storeu_epi8( + latin1_output, mask, + _mm512_castsi512_si128(_mm512_permutexvar_epi8(shufmask, in))); } - return result(error_code::SUCCESS, utf32_output - start); + return std::make_pair(result(error_code::SUCCESS, len), latin1_output); } +/* end file src/icelake/icelake_convert_utf32_to_latin1.inl.cpp */ +/* begin file src/icelake/icelake_convert_utf32_to_utf8.inl.cpp */ +// file included directly -/** - * When rewind_and_convert_with_errors is called, we are pointing at 'buf' and - * we have up to len input bytes left, and we encountered some error. It is - * possible that the error is at 'buf' exactly, but it could also be in the - * previous bytes location (up to 3 bytes back). - * - * prior_bytes indicates how many bytes, prior to 'buf' may belong to the - * current memory section and can be safely accessed. We prior_bytes to access - * safely up to three bytes before 'buf'. - * - * The caller is responsible to ensure that len > 0. - * - * If the error is believed to have occurred prior to 'buf', the count value - * contain in the result will be SIZE_T - 1, SIZE_T - 2, or SIZE_T - 3. - */ -inline result rewind_and_convert_with_errors(size_t prior_bytes, - const char *buf, size_t len, - char32_t *utf32_output) { - size_t extra_len{0}; - // We potentially need to go back in time and find a leading byte. - size_t how_far_back = 3; // 3 bytes in the past + current position - if (how_far_back > prior_bytes) { - how_far_back = prior_bytes; - } - bool found_leading_bytes{false}; - // important: it is i <= how_far_back and not 'i < how_far_back'. - for (size_t i = 0; i <= how_far_back; i++) { - unsigned char byte = buf[-static_cast(i)]; - found_leading_bytes = ((byte & 0b11000000) != 0b10000000); - if (found_leading_bytes) { - if (i > 0 && byte < 128) { - // If we had to go back and the leading byte is ascii - // then we can stop right away. - return result(error_code::TOO_LONG, 0 - i + 1); - } - buf -= i; - extra_len = i; - break; +// Todo: currently, this is just the haswell code, optimize for icelake kernel. +std::pair +avx512_convert_utf32_to_utf8(const char32_t *buf, size_t len, + char *utf8_output) { + const char32_t *end = buf + len; + const __m256i v_0000 = _mm256_setzero_si256(); + const __m256i v_ffff0000 = _mm256_set1_epi32((uint32_t)0xffff0000); + const __m256i v_ff80 = _mm256_set1_epi16((uint16_t)0xff80); + const __m256i v_f800 = _mm256_set1_epi16((uint16_t)0xf800); + const __m256i v_c080 = _mm256_set1_epi16((uint16_t)0xc080); + const __m256i v_7fffffff = _mm256_set1_epi32((uint32_t)0x7fffffff); + __m256i running_max = _mm256_setzero_si256(); + __m256i forbidden_bytemask = _mm256_setzero_si256(); + + const size_t safety_margin = + 12; // to avoid overruns, see issue + // https://github.com/simdutf/simdutf/issues/92 + + while (end - buf >= std::ptrdiff_t(16 + safety_margin)) { + __m256i in = _mm256_loadu_si256((__m256i *)buf); + __m256i nextin = _mm256_loadu_si256((__m256i *)buf + 1); + running_max = _mm256_max_epu32(_mm256_max_epu32(in, running_max), nextin); + + // Pack 32-bit UTF-32 code units to 16-bit UTF-16 code units with unsigned + // saturation + __m256i in_16 = _mm256_packus_epi32(_mm256_and_si256(in, v_7fffffff), + _mm256_and_si256(nextin, v_7fffffff)); + in_16 = _mm256_permute4x64_epi64(in_16, 0b11011000); + + // Try to apply UTF-16 => UTF-8 routine on 256 bits + // (haswell/avx2_convert_utf16_to_utf8.cpp) + + if (_mm256_testz_si256(in_16, v_ff80)) { // ASCII fast path!!!! + // 1. pack the bytes + const __m128i utf8_packed = _mm_packus_epi16( + _mm256_castsi256_si128(in_16), _mm256_extractf128_si256(in_16, 1)); + // 2. store (16 bytes) + _mm_storeu_si128((__m128i *)utf8_output, utf8_packed); + // 3. adjust pointers + buf += 16; + utf8_output += 16; + continue; // we are done for this round! } - } - // - // It is possible for this function to return a negative count in its result. - // C++ Standard Section 18.1 defines size_t is in which is described - // in C Standard as . C Standard Section 4.1.5 defines size_t as an - // unsigned integral type of the result of the sizeof operator - // - // An unsigned type will simply wrap round arithmetically (well defined). - // - if (!found_leading_bytes) { - // If how_far_back == 3, we may have four consecutive continuation bytes!!! - // [....] [continuation] [continuation] [continuation] | [buf is - // continuation] Or we possibly have a stream that does not start with a - // leading byte. - return result(error_code::TOO_LONG, 0 - how_far_back); - } + // no bits set above 7th bit + const __m256i one_byte_bytemask = + _mm256_cmpeq_epi16(_mm256_and_si256(in_16, v_ff80), v_0000); + const uint32_t one_byte_bitmask = + static_cast(_mm256_movemask_epi8(one_byte_bytemask)); - result res = convert_with_errors(buf, len + extra_len, utf32_output); - if (res.error) { - res.count -= extra_len; - } - return res; -} + // no bits set above 11th bit + const __m256i one_or_two_bytes_bytemask = + _mm256_cmpeq_epi16(_mm256_and_si256(in_16, v_f800), v_0000); + const uint32_t one_or_two_bytes_bitmask = + static_cast(_mm256_movemask_epi8(one_or_two_bytes_bytemask)); + if (one_or_two_bytes_bitmask == 0xffffffff) { + // 1. prepare 2-byte values + // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8 + // expected output : [110a|aaaa|10bb|bbbb] x 8 + const __m256i v_1f00 = _mm256_set1_epi16((int16_t)0x1f00); + const __m256i v_003f = _mm256_set1_epi16((int16_t)0x003f); -} // namespace utf8_to_utf32 -} // unnamed namespace -} // namespace scalar -} // namespace simdutf + // t0 = [000a|aaaa|bbbb|bb00] + const __m256i t0 = _mm256_slli_epi16(in_16, 2); + // t1 = [000a|aaaa|0000|0000] + const __m256i t1 = _mm256_and_si256(t0, v_1f00); + // t2 = [0000|0000|00bb|bbbb] + const __m256i t2 = _mm256_and_si256(in_16, v_003f); + // t3 = [000a|aaaa|00bb|bbbb] + const __m256i t3 = _mm256_or_si256(t1, t2); + // t4 = [110a|aaaa|10bb|bbbb] + const __m256i t4 = _mm256_or_si256(t3, v_c080); -#endif -/* end file src/scalar/utf8_to_utf32/utf8_to_utf32.h */ + // 2. merge ASCII and 2-byte codewords + const __m256i utf8_unpacked = + _mm256_blendv_epi8(t4, in_16, one_byte_bytemask); -/* begin file src/scalar/latin1_to_utf16/latin1_to_utf16.h */ -#ifndef SIMDUTF_LATIN1_TO_UTF16_H -#define SIMDUTF_LATIN1_TO_UTF16_H + // 3. prepare bitmask for 8-bit lookup + const uint32_t M0 = one_byte_bitmask & 0x55555555; + const uint32_t M1 = M0 >> 7; + const uint32_t M2 = (M1 | M0) & 0x00ff00ff; + // 4. pack the bytes -namespace simdutf { -namespace scalar { -namespace { -namespace latin1_to_utf16 { + const uint8_t *row = + &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[uint8_t(M2)][0]; + const uint8_t *row_2 = + &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[uint8_t(M2 >> + 16)][0]; -template -inline size_t convert(const char *buf, size_t len, char16_t *utf16_output) { - const uint8_t *data = reinterpret_cast(buf); - size_t pos = 0; - char16_t *start{utf16_output}; + const __m128i shuffle = _mm_loadu_si128((__m128i *)(row + 1)); + const __m128i shuffle_2 = _mm_loadu_si128((__m128i *)(row_2 + 1)); - while (pos < len) { - uint16_t word = - uint16_t(data[pos]); // extend Latin-1 char to 16-bit Unicode code point - *utf16_output++ = - char16_t(match_system(big_endian) ? word : utf16::swap_bytes(word)); - pos++; - } + const __m256i utf8_packed = _mm256_shuffle_epi8( + utf8_unpacked, _mm256_setr_m128i(shuffle, shuffle_2)); + // 5. store bytes + _mm_storeu_si128((__m128i *)utf8_output, + _mm256_castsi256_si128(utf8_packed)); + utf8_output += row[0]; + _mm_storeu_si128((__m128i *)utf8_output, + _mm256_extractf128_si256(utf8_packed, 1)); + utf8_output += row_2[0]; - return utf16_output - start; -} + // 6. adjust pointers + buf += 16; + continue; + } + // Must check for overflow in packing + const __m256i saturation_bytemask = _mm256_cmpeq_epi32( + _mm256_and_si256(_mm256_or_si256(in, nextin), v_ffff0000), v_0000); + const uint32_t saturation_bitmask = + static_cast(_mm256_movemask_epi8(saturation_bytemask)); + if (saturation_bitmask == 0xffffffff) { + // case: code units from register produce either 1, 2 or 3 UTF-8 bytes + const __m256i v_d800 = _mm256_set1_epi16((uint16_t)0xd800); + forbidden_bytemask = _mm256_or_si256( + forbidden_bytemask, + _mm256_cmpeq_epi16(_mm256_and_si256(in_16, v_f800), v_d800)); -template -inline result convert_with_errors(const char *buf, size_t len, - char16_t *utf16_output) { - const uint8_t *data = reinterpret_cast(buf); - size_t pos = 0; - char16_t *start{utf16_output}; + const __m256i dup_even = _mm256_setr_epi16( + 0x0000, 0x0202, 0x0404, 0x0606, 0x0808, 0x0a0a, 0x0c0c, 0x0e0e, + 0x0000, 0x0202, 0x0404, 0x0606, 0x0808, 0x0a0a, 0x0c0c, 0x0e0e); - while (pos < len) { - uint16_t word = - uint16_t(data[pos]); // extend Latin-1 char to 16-bit Unicode code point - *utf16_output++ = - char16_t(match_system(big_endian) ? word : utf16::swap_bytes(word)); - pos++; - } + /* In this branch we handle three cases: + 1. [0000|0000|0ccc|cccc] => [0ccc|cccc] - + single UFT-8 byte + 2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc] - two + UTF-8 bytes + 3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - + three UTF-8 bytes - return result(error_code::SUCCESS, utf16_output - start); -} + We expand the input word (16-bit) into two code units (32-bit), thus + we have room for four bytes. However, we need five distinct bit + layouts. Note that the last byte in cases #2 and #3 is the same. -} // namespace latin1_to_utf16 -} // unnamed namespace -} // namespace scalar -} // namespace simdutf + We precompute byte 1 for case #1 and the common byte for cases #2 & #3 + in register t2. -#endif -/* end file src/scalar/latin1_to_utf16/latin1_to_utf16.h */ -/* begin file src/scalar/latin1_to_utf32/latin1_to_utf32.h */ -#ifndef SIMDUTF_LATIN1_TO_UTF32_H -#define SIMDUTF_LATIN1_TO_UTF32_H + We precompute byte 1 for case #3 and -- **conditionally** -- precompute + either byte 1 for case #2 or byte 2 for case #3. Note that they + differ by exactly one bit. -namespace simdutf { -namespace scalar { -namespace { -namespace latin1_to_utf32 { + Finally from these two code units we build proper UTF-8 sequence, taking + into account the case (i.e, the number of bytes to write). + */ + /** + * Given [aaaa|bbbb|bbcc|cccc] our goal is to produce: + * t2 => [0ccc|cccc] [10cc|cccc] + * s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb]) + */ +#define simdutf_vec(x) _mm256_set1_epi16(static_cast(x)) + // [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc] + const __m256i t0 = _mm256_shuffle_epi8(in_16, dup_even); + // [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc] + const __m256i t1 = _mm256_and_si256(t0, simdutf_vec(0b0011111101111111)); + // [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc] + const __m256i t2 = _mm256_or_si256(t1, simdutf_vec(0b1000000000000000)); -inline size_t convert(const char *buf, size_t len, char32_t *utf32_output) { - const unsigned char *data = reinterpret_cast(buf); - char32_t *start{utf32_output}; - for (size_t i = 0; i < len; i++) { - *utf32_output++ = (char32_t)data[i]; - } - return utf32_output - start; -} + // [aaaa|bbbb|bbcc|cccc] => [0000|aaaa|bbbb|bbcc] + const __m256i s0 = _mm256_srli_epi16(in_16, 4); + // [0000|aaaa|bbbb|bbcc] => [0000|aaaa|bbbb|bb00] + const __m256i s1 = _mm256_and_si256(s0, simdutf_vec(0b0000111111111100)); + // [0000|aaaa|bbbb|bb00] => [00bb|bbbb|0000|aaaa] + const __m256i s2 = _mm256_maddubs_epi16(s1, simdutf_vec(0x0140)); + // [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa] + const __m256i s3 = _mm256_or_si256(s2, simdutf_vec(0b1100000011100000)); + const __m256i m0 = _mm256_andnot_si256(one_or_two_bytes_bytemask, + simdutf_vec(0b0100000000000000)); + const __m256i s4 = _mm256_xor_si256(s3, m0); +#undef simdutf_vec -} // namespace latin1_to_utf32 -} // unnamed namespace -} // namespace scalar -} // namespace simdutf + // 4. expand code units 16-bit => 32-bit + const __m256i out0 = _mm256_unpacklo_epi16(t2, s4); + const __m256i out1 = _mm256_unpackhi_epi16(t2, s4); -#endif -/* end file src/scalar/latin1_to_utf32/latin1_to_utf32.h */ + // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle + const uint32_t mask = (one_byte_bitmask & 0x55555555) | + (one_or_two_bytes_bitmask & 0xaaaaaaaa); + // Due to the wider registers, the following path is less likely to be + // useful. + /*if(mask == 0) { + // We only have three-byte code units. Use fast path. + const __m256i shuffle = + _mm256_setr_epi8(2,3,1,6,7,5,10,11,9,14,15,13,-1,-1,-1,-1, + 2,3,1,6,7,5,10,11,9,14,15,13,-1,-1,-1,-1); const __m256i utf8_0 = + _mm256_shuffle_epi8(out0, shuffle); const __m256i utf8_1 = + _mm256_shuffle_epi8(out1, shuffle); + _mm_storeu_si128((__m128i*)utf8_output, _mm256_castsi256_si128(utf8_0)); + utf8_output += 12; + _mm_storeu_si128((__m128i*)utf8_output, _mm256_castsi256_si128(utf8_1)); + utf8_output += 12; + _mm_storeu_si128((__m128i*)utf8_output, + _mm256_extractf128_si256(utf8_0,1)); utf8_output += 12; + _mm_storeu_si128((__m128i*)utf8_output, + _mm256_extractf128_si256(utf8_1,1)); utf8_output += 12; buf += 16; + continue; + }*/ + const uint8_t mask0 = uint8_t(mask); + const uint8_t *row0 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask0][0]; + const __m128i shuffle0 = _mm_loadu_si128((__m128i *)(row0 + 1)); + const __m128i utf8_0 = + _mm_shuffle_epi8(_mm256_castsi256_si128(out0), shuffle0); -/* begin file src/scalar/utf8_to_latin1/utf8_to_latin1.h */ -#ifndef SIMDUTF_UTF8_TO_LATIN1_H -#define SIMDUTF_UTF8_TO_LATIN1_H + const uint8_t mask1 = static_cast(mask >> 8); + const uint8_t *row1 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask1][0]; + const __m128i shuffle1 = _mm_loadu_si128((__m128i *)(row1 + 1)); + const __m128i utf8_1 = + _mm_shuffle_epi8(_mm256_castsi256_si128(out1), shuffle1); -namespace simdutf { -namespace scalar { -namespace { -namespace utf8_to_latin1 { + const uint8_t mask2 = static_cast(mask >> 16); + const uint8_t *row2 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask2][0]; + const __m128i shuffle2 = _mm_loadu_si128((__m128i *)(row2 + 1)); + const __m128i utf8_2 = + _mm_shuffle_epi8(_mm256_extractf128_si256(out0, 1), shuffle2); -inline size_t convert(const char *buf, size_t len, char *latin_output) { - const uint8_t *data = reinterpret_cast(buf); - size_t pos = 0; - char *start{latin_output}; + const uint8_t mask3 = static_cast(mask >> 24); + const uint8_t *row3 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask3][0]; + const __m128i shuffle3 = _mm_loadu_si128((__m128i *)(row3 + 1)); + const __m128i utf8_3 = + _mm_shuffle_epi8(_mm256_extractf128_si256(out1, 1), shuffle3); - while (pos < len) { - // try to convert the next block of 16 ASCII bytes - if (pos + 16 <= - len) { // if it is safe to read 16 more bytes, check that they are ascii - uint64_t v1; - ::memcpy(&v1, data + pos, sizeof(uint64_t)); - uint64_t v2; - ::memcpy(&v2, data + pos + sizeof(uint64_t), sizeof(uint64_t)); - uint64_t v{v1 | v2}; // We are only interested in these bits: 1000 1000 - // 1000 1000 .... etc - if ((v & 0x8080808080808080) == - 0) { // if NONE of these are set, e.g. all of them are zero, then - // everything is ASCII - size_t final_pos = pos + 16; - while (pos < final_pos) { - *latin_output++ = char(buf[pos]); - pos++; + _mm_storeu_si128((__m128i *)utf8_output, utf8_0); + utf8_output += row0[0]; + _mm_storeu_si128((__m128i *)utf8_output, utf8_1); + utf8_output += row1[0]; + _mm_storeu_si128((__m128i *)utf8_output, utf8_2); + utf8_output += row2[0]; + _mm_storeu_si128((__m128i *)utf8_output, utf8_3); + utf8_output += row3[0]; + buf += 16; + } else { + // case: at least one 32-bit word is larger than 0xFFFF <=> it will + // produce four UTF-8 bytes. Let us do a scalar fallback. It may seem + // wasteful to use scalar code, but being efficient with SIMD may require + // large, non-trivial tables? + size_t forward = 15; + size_t k = 0; + if (size_t(end - buf) < forward + 1) { + forward = size_t(end - buf - 1); + } + for (; k < forward; k++) { + uint32_t word = buf[k]; + if ((word & 0xFFFFFF80) == 0) { // 1-byte (ASCII) + *utf8_output++ = char(word); + } else if ((word & 0xFFFFF800) == 0) { // 2-byte + *utf8_output++ = char((word >> 6) | 0b11000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + } else if ((word & 0xFFFF0000) == 0) { // 3-byte + if (word >= 0xD800 && word <= 0xDFFF) { + return std::make_pair(nullptr, utf8_output); + } + *utf8_output++ = char((word >> 12) | 0b11100000); + *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + } else { // 4-byte + if (word > 0x10FFFF) { + return std::make_pair(nullptr, utf8_output); + } + *utf8_output++ = char((word >> 18) | 0b11110000); + *utf8_output++ = char(((word >> 12) & 0b111111) | 0b10000000); + *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); } - continue; } + buf += k; } + } // while - // suppose it is not an all ASCII byte sequence - uint8_t leading_byte = data[pos]; // leading byte - if (leading_byte < 0b10000000) { - // converting one ASCII byte !!! - *latin_output++ = char(leading_byte); - pos++; - } else if ((leading_byte & 0b11100000) == - 0b11000000) { // the first three bits indicate: - // We have a two-byte UTF-8 - if (pos + 1 >= len) { - return 0; - } // minimal bound checking - if ((data[pos + 1] & 0b11000000) != 0b10000000) { - return 0; - } // checks if the next byte is a valid continuation byte in UTF-8. A - // valid continuation byte starts with 10. - // range check - - uint32_t code_point = - (leading_byte & 0b00011111) << 6 | - (data[pos + 1] & - 0b00111111); // assembles the Unicode code point from the two bytes. - // It does this by discarding the leading 110 and 10 - // bits from the two bytes, shifting the remaining bits - // of the first byte, and then combining the results - // with a bitwise OR operation. - if (code_point < 0x80 || 0xFF < code_point) { - return 0; // We only care about the range 129-255 which is Non-ASCII - // latin1 characters. A code_point beneath 0x80 is invalid as - // it is already covered by bytes whose leading bit is zero. - } - *latin_output++ = char(code_point); - pos += 2; - } else { - return 0; - } + // check for invalid input + const __m256i v_10ffff = _mm256_set1_epi32((uint32_t)0x10ffff); + if (static_cast(_mm256_movemask_epi8(_mm256_cmpeq_epi32( + _mm256_max_epu32(running_max, v_10ffff), v_10ffff))) != 0xffffffff) { + return std::make_pair(nullptr, utf8_output); } - return latin_output - start; + + if (static_cast(_mm256_movemask_epi8(forbidden_bytemask)) != 0) { + return std::make_pair(nullptr, utf8_output); + } + + return std::make_pair(buf, utf8_output); } -inline result convert_with_errors(const char *buf, size_t len, - char *latin_output) { - const uint8_t *data = reinterpret_cast(buf); - size_t pos = 0; - char *start{latin_output}; +// Todo: currently, this is just the haswell code, optimize for icelake kernel. +std::pair +avx512_convert_utf32_to_utf8_with_errors(const char32_t *buf, size_t len, + char *utf8_output) { + const char32_t *end = buf + len; + const char32_t *start = buf; - while (pos < len) { - // try to convert the next block of 16 ASCII bytes - if (pos + 16 <= - len) { // if it is safe to read 16 more bytes, check that they are ascii - uint64_t v1; - ::memcpy(&v1, data + pos, sizeof(uint64_t)); - uint64_t v2; - ::memcpy(&v2, data + pos + sizeof(uint64_t), sizeof(uint64_t)); - uint64_t v{v1 | v2}; // We are only interested in these bits: 1000 1000 - // 1000 1000...etc - if ((v & 0x8080808080808080) == - 0) { // if NONE of these are set, e.g. all of them are zero, then - // everything is ASCII - size_t final_pos = pos + 16; - while (pos < final_pos) { - *latin_output++ = char(buf[pos]); - pos++; - } - continue; - } - } - // suppose it is not an all ASCII byte sequence - uint8_t leading_byte = data[pos]; // leading byte - if (leading_byte < 0b10000000) { - // converting one ASCII byte !!! - *latin_output++ = char(leading_byte); - pos++; - } else if ((leading_byte & 0b11100000) == - 0b11000000) { // the first three bits indicate: - // We have a two-byte UTF-8 - if (pos + 1 >= len) { - return result(error_code::TOO_SHORT, pos); - } // minimal bound checking - if ((data[pos + 1] & 0b11000000) != 0b10000000) { - return result(error_code::TOO_SHORT, pos); - } // checks if the next byte is a valid continuation byte in UTF-8. A - // valid continuation byte starts with 10. - // range check - - uint32_t code_point = - (leading_byte & 0b00011111) << 6 | - (data[pos + 1] & - 0b00111111); // assembles the Unicode code point from the two bytes. - // It does this by discarding the leading 110 and 10 - // bits from the two bytes, shifting the remaining bits - // of the first byte, and then combining the results - // with a bitwise OR operation. - if (code_point < 0x80) { - return result(error_code::OVERLONG, pos); - } - if (0xFF < code_point) { - return result(error_code::TOO_LARGE, pos); - } // We only care about the range 129-255 which is Non-ASCII latin1 - // characters - *latin_output++ = char(code_point); - pos += 2; - } else if ((leading_byte & 0b11110000) == 0b11100000) { - // We have a three-byte UTF-8 - return result(error_code::TOO_LARGE, pos); - } else if ((leading_byte & 0b11111000) == 0b11110000) { // 0b11110000 - // we have a 4-byte UTF-8 word. - return result(error_code::TOO_LARGE, pos); - } else { - // we either have too many continuation bytes or an invalid leading byte - if ((leading_byte & 0b11000000) == 0b10000000) { - return result(error_code::TOO_LONG, pos); - } + const __m256i v_0000 = _mm256_setzero_si256(); + const __m256i v_ffff0000 = _mm256_set1_epi32((uint32_t)0xffff0000); + const __m256i v_ff80 = _mm256_set1_epi16((uint16_t)0xff80); + const __m256i v_f800 = _mm256_set1_epi16((uint16_t)0xf800); + const __m256i v_c080 = _mm256_set1_epi16((uint16_t)0xc080); + const __m256i v_7fffffff = _mm256_set1_epi32((uint32_t)0x7fffffff); + const __m256i v_10ffff = _mm256_set1_epi32((uint32_t)0x10ffff); - return result(error_code::HEADER_BITS, pos); - } - } - return result(error_code::SUCCESS, latin_output - start); -} + const size_t safety_margin = + 12; // to avoid overruns, see issue + // https://github.com/simdutf/simdutf/issues/92 -inline result rewind_and_convert_with_errors(size_t prior_bytes, - const char *buf, size_t len, - char *latin1_output) { - size_t extra_len{0}; - // We potentially need to go back in time and find a leading byte. - // In theory '3' would be sufficient, but sometimes the error can go back - // quite far. - size_t how_far_back = prior_bytes; - // size_t how_far_back = 3; // 3 bytes in the past + current position - // if(how_far_back >= prior_bytes) { how_far_back = prior_bytes; } - bool found_leading_bytes{false}; - // important: it is i <= how_far_back and not 'i < how_far_back'. - for (size_t i = 0; i <= how_far_back; i++) { - unsigned char byte = buf[-static_cast(i)]; - found_leading_bytes = ((byte & 0b11000000) != 0b10000000); - if (found_leading_bytes) { - if (i > 0 && byte < 128) { - // If we had to go back and the leading byte is ascii - // then we can stop right away. - return result(error_code::TOO_LONG, 0 - i + 1); - } - buf -= i; - extra_len = i; - break; + while (end - buf >= std::ptrdiff_t(16 + safety_margin)) { + __m256i in = _mm256_loadu_si256((__m256i *)buf); + __m256i nextin = _mm256_loadu_si256((__m256i *)buf + 1); + // Check for too large input + const __m256i max_input = + _mm256_max_epu32(_mm256_max_epu32(in, nextin), v_10ffff); + if (static_cast(_mm256_movemask_epi8( + _mm256_cmpeq_epi32(max_input, v_10ffff))) != 0xffffffff) { + return std::make_pair(result(error_code::TOO_LARGE, buf - start), + utf8_output); } - } - // - // It is possible for this function to return a negative count in its result. - // C++ Standard Section 18.1 defines size_t is in which is described - // in C Standard as . C Standard Section 4.1.5 defines size_t as an - // unsigned integral type of the result of the sizeof operator - // - // An unsigned type will simply wrap round arithmetically (well defined). - // - if (!found_leading_bytes) { - // If how_far_back == 3, we may have four consecutive continuation bytes!!! - // [....] [continuation] [continuation] [continuation] | [buf is - // continuation] Or we possibly have a stream that does not start with a - // leading byte. - return result(error_code::TOO_LONG, 0 - how_far_back); - } - result res = convert_with_errors(buf, len + extra_len, latin1_output); - if (res.error) { - res.count -= extra_len; - } - return res; -} -} // namespace utf8_to_latin1 -} // unnamed namespace -} // namespace scalar -} // namespace simdutf + // Pack 32-bit UTF-32 code units to 16-bit UTF-16 code units with unsigned + // saturation + __m256i in_16 = _mm256_packus_epi32(_mm256_and_si256(in, v_7fffffff), + _mm256_and_si256(nextin, v_7fffffff)); + in_16 = _mm256_permute4x64_epi64(in_16, 0b11011000); + + // Try to apply UTF-16 => UTF-8 routine on 256 bits + // (haswell/avx2_convert_utf16_to_utf8.cpp) -#endif -/* end file src/scalar/utf8_to_latin1/utf8_to_latin1.h */ -/* begin file src/scalar/utf16_to_latin1/utf16_to_latin1.h */ -#ifndef SIMDUTF_UTF16_TO_LATIN1_H -#define SIMDUTF_UTF16_TO_LATIN1_H + if (_mm256_testz_si256(in_16, v_ff80)) { // ASCII fast path!!!! + // 1. pack the bytes + const __m128i utf8_packed = _mm_packus_epi16( + _mm256_castsi256_si128(in_16), _mm256_extractf128_si256(in_16, 1)); + // 2. store (16 bytes) + _mm_storeu_si128((__m128i *)utf8_output, utf8_packed); + // 3. adjust pointers + buf += 16; + utf8_output += 16; + continue; // we are done for this round! + } + // no bits set above 7th bit + const __m256i one_byte_bytemask = + _mm256_cmpeq_epi16(_mm256_and_si256(in_16, v_ff80), v_0000); + const uint32_t one_byte_bitmask = + static_cast(_mm256_movemask_epi8(one_byte_bytemask)); -namespace simdutf { -namespace scalar { -namespace { -namespace utf16_to_latin1 { + // no bits set above 11th bit + const __m256i one_or_two_bytes_bytemask = + _mm256_cmpeq_epi16(_mm256_and_si256(in_16, v_f800), v_0000); + const uint32_t one_or_two_bytes_bitmask = + static_cast(_mm256_movemask_epi8(one_or_two_bytes_bytemask)); + if (one_or_two_bytes_bitmask == 0xffffffff) { + // 1. prepare 2-byte values + // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8 + // expected output : [110a|aaaa|10bb|bbbb] x 8 + const __m256i v_1f00 = _mm256_set1_epi16((int16_t)0x1f00); + const __m256i v_003f = _mm256_set1_epi16((int16_t)0x003f); -#include // for std::memcpy + // t0 = [000a|aaaa|bbbb|bb00] + const __m256i t0 = _mm256_slli_epi16(in_16, 2); + // t1 = [000a|aaaa|0000|0000] + const __m256i t1 = _mm256_and_si256(t0, v_1f00); + // t2 = [0000|0000|00bb|bbbb] + const __m256i t2 = _mm256_and_si256(in_16, v_003f); + // t3 = [000a|aaaa|00bb|bbbb] + const __m256i t3 = _mm256_or_si256(t1, t2); + // t4 = [110a|aaaa|10bb|bbbb] + const __m256i t4 = _mm256_or_si256(t3, v_c080); -template -inline size_t convert(const char16_t *buf, size_t len, char *latin_output) { - if (len == 0) { - return 0; - } - const uint16_t *data = reinterpret_cast(buf); - size_t pos = 0; - char *current_write = latin_output; - uint16_t word = 0; - uint16_t too_large = 0; + // 2. merge ASCII and 2-byte codewords + const __m256i utf8_unpacked = + _mm256_blendv_epi8(t4, in_16, one_byte_bytemask); - while (pos < len) { - word = !match_system(big_endian) ? utf16::swap_bytes(data[pos]) : data[pos]; - too_large |= word; - *current_write++ = char(word & 0xFF); - pos++; - } - if ((too_large & 0xFF00) != 0) { - return 0; - } + // 3. prepare bitmask for 8-bit lookup + const uint32_t M0 = one_byte_bitmask & 0x55555555; + const uint32_t M1 = M0 >> 7; + const uint32_t M2 = (M1 | M0) & 0x00ff00ff; + // 4. pack the bytes - return current_write - latin_output; -} + const uint8_t *row = + &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[uint8_t(M2)][0]; + const uint8_t *row_2 = + &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[uint8_t(M2 >> + 16)][0]; -template -inline result convert_with_errors(const char16_t *buf, size_t len, - char *latin_output) { - if (len == 0) { - return result(error_code::SUCCESS, 0); - } - const uint16_t *data = reinterpret_cast(buf); - size_t pos = 0; - char *start{latin_output}; - uint16_t word; + const __m128i shuffle = _mm_loadu_si128((__m128i *)(row + 1)); + const __m128i shuffle_2 = _mm_loadu_si128((__m128i *)(row_2 + 1)); - while (pos < len) { - if (pos + 16 <= len) { // if it is safe to read 32 more bytes, check that - // they are Latin1 - uint64_t v1, v2, v3, v4; - ::memcpy(&v1, data + pos, sizeof(uint64_t)); - ::memcpy(&v2, data + pos + 4, sizeof(uint64_t)); - ::memcpy(&v3, data + pos + 8, sizeof(uint64_t)); - ::memcpy(&v4, data + pos + 12, sizeof(uint64_t)); + const __m256i utf8_packed = _mm256_shuffle_epi8( + utf8_unpacked, _mm256_setr_m128i(shuffle, shuffle_2)); + // 5. store bytes + _mm_storeu_si128((__m128i *)utf8_output, + _mm256_castsi256_si128(utf8_packed)); + utf8_output += row[0]; + _mm_storeu_si128((__m128i *)utf8_output, + _mm256_extractf128_si256(utf8_packed, 1)); + utf8_output += row_2[0]; - if (!match_system(big_endian)) { - v1 = (v1 >> 8) | (v1 << (64 - 8)); - } - if (!match_system(big_endian)) { - v2 = (v2 >> 8) | (v2 << (64 - 8)); - } - if (!match_system(big_endian)) { - v3 = (v3 >> 8) | (v3 << (64 - 8)); - } - if (!match_system(big_endian)) { - v4 = (v4 >> 8) | (v4 << (64 - 8)); - } + // 6. adjust pointers + buf += 16; + continue; + } + // Must check for overflow in packing + const __m256i saturation_bytemask = _mm256_cmpeq_epi32( + _mm256_and_si256(_mm256_or_si256(in, nextin), v_ffff0000), v_0000); + const uint32_t saturation_bitmask = + static_cast(_mm256_movemask_epi8(saturation_bytemask)); + if (saturation_bitmask == 0xffffffff) { + // case: code units from register produce either 1, 2 or 3 UTF-8 bytes - if (((v1 | v2 | v3 | v4) & 0xFF00FF00FF00FF00) == 0) { - size_t final_pos = pos + 16; - while (pos < final_pos) { - *latin_output++ = !match_system(big_endian) - ? char(utf16::swap_bytes(data[pos])) - : char(data[pos]); - pos++; - } - continue; + // Check for illegal surrogate code units + const __m256i v_d800 = _mm256_set1_epi16((uint16_t)0xd800); + const __m256i forbidden_bytemask = + _mm256_cmpeq_epi16(_mm256_and_si256(in_16, v_f800), v_d800); + if (static_cast(_mm256_movemask_epi8(forbidden_bytemask)) != + 0x0) { + return std::make_pair(result(error_code::SURROGATE, buf - start), + utf8_output); } - } - word = !match_system(big_endian) ? utf16::swap_bytes(data[pos]) : data[pos]; - if ((word & 0xFF00) == 0) { - *latin_output++ = char(word & 0xFF); - pos++; - } else { - return result(error_code::TOO_LARGE, pos); - } - } - return result(error_code::SUCCESS, latin_output - start); -} -} // namespace utf16_to_latin1 -} // unnamed namespace -} // namespace scalar -} // namespace simdutf + const __m256i dup_even = _mm256_setr_epi16( + 0x0000, 0x0202, 0x0404, 0x0606, 0x0808, 0x0a0a, 0x0c0c, 0x0e0e, + 0x0000, 0x0202, 0x0404, 0x0606, 0x0808, 0x0a0a, 0x0c0c, 0x0e0e); -#endif -/* end file src/scalar/utf16_to_latin1/utf16_to_latin1.h */ -/* begin file src/scalar/utf32_to_latin1/utf32_to_latin1.h */ -#ifndef SIMDUTF_UTF32_TO_LATIN1_H -#define SIMDUTF_UTF32_TO_LATIN1_H + /* In this branch we handle three cases: + 1. [0000|0000|0ccc|cccc] => [0ccc|cccc] - + single UFT-8 byte + 2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc] - two + UTF-8 bytes + 3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - + three UTF-8 bytes -namespace simdutf { -namespace scalar { -namespace { -namespace utf32_to_latin1 { + We expand the input word (16-bit) into two code units (32-bit), thus + we have room for four bytes. However, we need five distinct bit + layouts. Note that the last byte in cases #2 and #3 is the same. -inline size_t convert(const char32_t *buf, size_t len, char *latin1_output) { - const uint32_t *data = reinterpret_cast(buf); - char *start = latin1_output; - uint32_t utf32_char; - size_t pos = 0; - uint32_t too_large = 0; + We precompute byte 1 for case #1 and the common byte for cases #2 & #3 + in register t2. - while (pos < len) { - utf32_char = (uint32_t)data[pos]; - too_large |= utf32_char; - *latin1_output++ = (char)(utf32_char & 0xFF); - pos++; - } - if ((too_large & 0xFFFFFF00) != 0) { - return 0; - } - return latin1_output - start; -} + We precompute byte 1 for case #3 and -- **conditionally** -- precompute + either byte 1 for case #2 or byte 2 for case #3. Note that they + differ by exactly one bit. -inline result convert_with_errors(const char32_t *buf, size_t len, - char *latin1_output) { - const uint32_t *data = reinterpret_cast(buf); - char *start{latin1_output}; - size_t pos = 0; - while (pos < len) { - if (pos + 2 <= - len) { // if it is safe to read 8 more bytes, check that they are Latin1 - uint64_t v; - ::memcpy(&v, data + pos, sizeof(uint64_t)); - if ((v & 0xFFFFFF00FFFFFF00) == 0) { - *latin1_output++ = char(buf[pos]); - *latin1_output++ = char(buf[pos + 1]); - pos += 2; - continue; - } - } - uint32_t utf32_char = data[pos]; - if ((utf32_char & 0xFFFFFF00) == - 0) { // Check if the character can be represented in Latin-1 - *latin1_output++ = (char)(utf32_char & 0xFF); - pos++; - } else { - return result(error_code::TOO_LARGE, pos); - }; - } - return result(error_code::SUCCESS, latin1_output - start); -} + Finally from these two code units we build proper UTF-8 sequence, taking + into account the case (i.e, the number of bytes to write). + */ + /** + * Given [aaaa|bbbb|bbcc|cccc] our goal is to produce: + * t2 => [0ccc|cccc] [10cc|cccc] + * s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb]) + */ +#define simdutf_vec(x) _mm256_set1_epi16(static_cast(x)) + // [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc] + const __m256i t0 = _mm256_shuffle_epi8(in_16, dup_even); + // [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc] + const __m256i t1 = _mm256_and_si256(t0, simdutf_vec(0b0011111101111111)); + // [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc] + const __m256i t2 = _mm256_or_si256(t1, simdutf_vec(0b1000000000000000)); -} // namespace utf32_to_latin1 -} // unnamed namespace -} // namespace scalar -} // namespace simdutf + // [aaaa|bbbb|bbcc|cccc] => [0000|aaaa|bbbb|bbcc] + const __m256i s0 = _mm256_srli_epi16(in_16, 4); + // [0000|aaaa|bbbb|bbcc] => [0000|aaaa|bbbb|bb00] + const __m256i s1 = _mm256_and_si256(s0, simdutf_vec(0b0000111111111100)); + // [0000|aaaa|bbbb|bb00] => [00bb|bbbb|0000|aaaa] + const __m256i s2 = _mm256_maddubs_epi16(s1, simdutf_vec(0x0140)); + // [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa] + const __m256i s3 = _mm256_or_si256(s2, simdutf_vec(0b1100000011100000)); + const __m256i m0 = _mm256_andnot_si256(one_or_two_bytes_bytemask, + simdutf_vec(0b0100000000000000)); + const __m256i s4 = _mm256_xor_si256(s3, m0); +#undef simdutf_vec -#endif -/* end file src/scalar/utf32_to_latin1/utf32_to_latin1.h */ + // 4. expand code units 16-bit => 32-bit + const __m256i out0 = _mm256_unpacklo_epi16(t2, s4); + const __m256i out1 = _mm256_unpackhi_epi16(t2, s4); -/* begin file src/scalar/utf8_to_latin1/valid_utf8_to_latin1.h */ -#ifndef SIMDUTF_VALID_UTF8_TO_LATIN1_H -#define SIMDUTF_VALID_UTF8_TO_LATIN1_H + // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle + const uint32_t mask = (one_byte_bitmask & 0x55555555) | + (one_or_two_bytes_bitmask & 0xaaaaaaaa); + // Due to the wider registers, the following path is less likely to be + // useful. + /*if(mask == 0) { + // We only have three-byte code units. Use fast path. + const __m256i shuffle = + _mm256_setr_epi8(2,3,1,6,7,5,10,11,9,14,15,13,-1,-1,-1,-1, + 2,3,1,6,7,5,10,11,9,14,15,13,-1,-1,-1,-1); const __m256i utf8_0 = + _mm256_shuffle_epi8(out0, shuffle); const __m256i utf8_1 = + _mm256_shuffle_epi8(out1, shuffle); + _mm_storeu_si128((__m128i*)utf8_output, _mm256_castsi256_si128(utf8_0)); + utf8_output += 12; + _mm_storeu_si128((__m128i*)utf8_output, _mm256_castsi256_si128(utf8_1)); + utf8_output += 12; + _mm_storeu_si128((__m128i*)utf8_output, + _mm256_extractf128_si256(utf8_0,1)); utf8_output += 12; + _mm_storeu_si128((__m128i*)utf8_output, + _mm256_extractf128_si256(utf8_1,1)); utf8_output += 12; buf += 16; + continue; + }*/ + const uint8_t mask0 = uint8_t(mask); + const uint8_t *row0 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask0][0]; + const __m128i shuffle0 = _mm_loadu_si128((__m128i *)(row0 + 1)); + const __m128i utf8_0 = + _mm_shuffle_epi8(_mm256_castsi256_si128(out0), shuffle0); -namespace simdutf { -namespace scalar { -namespace { -namespace utf8_to_latin1 { + const uint8_t mask1 = static_cast(mask >> 8); + const uint8_t *row1 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask1][0]; + const __m128i shuffle1 = _mm_loadu_si128((__m128i *)(row1 + 1)); + const __m128i utf8_1 = + _mm_shuffle_epi8(_mm256_castsi256_si128(out1), shuffle1); -inline size_t convert_valid(const char *buf, size_t len, char *latin_output) { - const uint8_t *data = reinterpret_cast(buf); + const uint8_t mask2 = static_cast(mask >> 16); + const uint8_t *row2 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask2][0]; + const __m128i shuffle2 = _mm_loadu_si128((__m128i *)(row2 + 1)); + const __m128i utf8_2 = + _mm_shuffle_epi8(_mm256_extractf128_si256(out0, 1), shuffle2); - size_t pos = 0; - char *start{latin_output}; + const uint8_t mask3 = static_cast(mask >> 24); + const uint8_t *row3 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask3][0]; + const __m128i shuffle3 = _mm_loadu_si128((__m128i *)(row3 + 1)); + const __m128i utf8_3 = + _mm_shuffle_epi8(_mm256_extractf128_si256(out1, 1), shuffle3); - while (pos < len) { - // try to convert the next block of 16 ASCII bytes - if (pos + 16 <= - len) { // if it is safe to read 16 more bytes, check that they are ascii - uint64_t v1; - ::memcpy(&v1, data + pos, sizeof(uint64_t)); - uint64_t v2; - ::memcpy(&v2, data + pos + sizeof(uint64_t), sizeof(uint64_t)); - uint64_t v{v1 | - v2}; // We are only interested in these bits: 1000 1000 1000 - // 1000, so it makes sense to concatenate everything - if ((v & 0x8080808080808080) == - 0) { // if NONE of these are set, e.g. all of them are zero, then - // everything is ASCII - size_t final_pos = pos + 16; - while (pos < final_pos) { - *latin_output++ = char(buf[pos]); - pos++; + _mm_storeu_si128((__m128i *)utf8_output, utf8_0); + utf8_output += row0[0]; + _mm_storeu_si128((__m128i *)utf8_output, utf8_1); + utf8_output += row1[0]; + _mm_storeu_si128((__m128i *)utf8_output, utf8_2); + utf8_output += row2[0]; + _mm_storeu_si128((__m128i *)utf8_output, utf8_3); + utf8_output += row3[0]; + buf += 16; + } else { + // case: at least one 32-bit word is larger than 0xFFFF <=> it will + // produce four UTF-8 bytes. Let us do a scalar fallback. It may seem + // wasteful to use scalar code, but being efficient with SIMD may require + // large, non-trivial tables? + size_t forward = 15; + size_t k = 0; + if (size_t(end - buf) < forward + 1) { + forward = size_t(end - buf - 1); + } + for (; k < forward; k++) { + uint32_t word = buf[k]; + if ((word & 0xFFFFFF80) == 0) { // 1-byte (ASCII) + *utf8_output++ = char(word); + } else if ((word & 0xFFFFF800) == 0) { // 2-byte + *utf8_output++ = char((word >> 6) | 0b11000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + } else if ((word & 0xFFFF0000) == 0) { // 3-byte + if (word >= 0xD800 && word <= 0xDFFF) { + return std::make_pair( + result(error_code::SURROGATE, buf - start + k), utf8_output); + } + *utf8_output++ = char((word >> 12) | 0b11100000); + *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + } else { // 4-byte + if (word > 0x10FFFF) { + return std::make_pair( + result(error_code::TOO_LARGE, buf - start + k), utf8_output); + } + *utf8_output++ = char((word >> 18) | 0b11110000); + *utf8_output++ = char(((word >> 12) & 0b111111) | 0b10000000); + *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); } - continue; } + buf += k; } + } // while - // suppose it is not an all ASCII byte sequence - uint8_t leading_byte = data[pos]; // leading byte - if (leading_byte < 0b10000000) { - // converting one ASCII byte !!! - *latin_output++ = char(leading_byte); - pos++; - } else if ((leading_byte & 0b11100000) == - 0b11000000) { // the first three bits indicate: - // We have a two-byte UTF-8 - if (pos + 1 >= len) { - break; - } // minimal bound checking - if ((data[pos + 1] & 0b11000000) != 0b10000000) { - return 0; - } // checks if the next byte is a valid continuation byte in UTF-8. A - // valid continuation byte starts with 10. - // range check - - uint32_t code_point = - (leading_byte & 0b00011111) << 6 | - (data[pos + 1] & - 0b00111111); // assembles the Unicode code point from the two bytes. - // It does this by discarding the leading 110 and 10 - // bits from the two bytes, shifting the remaining bits - // of the first byte, and then combining the results - // with a bitwise OR operation. - *latin_output++ = char(code_point); - pos += 2; - } else { - // we may have a continuation but we do not do error checking - return 0; - } - } - return latin_output - start; + return std::make_pair(result(error_code::SUCCESS, buf - start), utf8_output); } +/* end file src/icelake/icelake_convert_utf32_to_utf8.inl.cpp */ +/* begin file src/icelake/icelake_convert_utf32_to_utf16.inl.cpp */ +// file included directly -} // namespace utf8_to_latin1 -} // unnamed namespace -} // namespace scalar -} // namespace simdutf +// Todo: currently, this is just the haswell code, optimize for icelake kernel. +template +std::pair +avx512_convert_utf32_to_utf16(const char32_t *buf, size_t len, + char16_t *utf16_output) { + const char32_t *end = buf + len; -#endif -/* end file src/scalar/utf8_to_latin1/valid_utf8_to_latin1.h */ -/* begin file src/scalar/utf16_to_latin1/valid_utf16_to_latin1.h */ -#ifndef SIMDUTF_VALID_UTF16_TO_LATIN1_H -#define SIMDUTF_VALID_UTF16_TO_LATIN1_H + const size_t safety_margin = + 12; // to avoid overruns, see issue + // https://github.com/simdutf/simdutf/issues/92 + __m256i forbidden_bytemask = _mm256_setzero_si256(); -namespace simdutf { -namespace scalar { -namespace { -namespace utf16_to_latin1 { + while (end - buf >= std::ptrdiff_t(8 + safety_margin)) { + __m256i in = _mm256_loadu_si256((__m256i *)buf); -template -inline size_t convert_valid(const char16_t *buf, size_t len, - char *latin_output) { - const uint16_t *data = reinterpret_cast(buf); - size_t pos = 0; - char *start{latin_output}; - uint16_t word = 0; + const __m256i v_00000000 = _mm256_setzero_si256(); + const __m256i v_ffff0000 = _mm256_set1_epi32((int32_t)0xffff0000); + + // no bits set above 16th bit <=> can pack to UTF16 without surrogate pairs + const __m256i saturation_bytemask = + _mm256_cmpeq_epi32(_mm256_and_si256(in, v_ffff0000), v_00000000); + const uint32_t saturation_bitmask = + static_cast(_mm256_movemask_epi8(saturation_bytemask)); + + if (saturation_bitmask == 0xffffffff) { + const __m256i v_f800 = _mm256_set1_epi32((uint32_t)0xf800); + const __m256i v_d800 = _mm256_set1_epi32((uint32_t)0xd800); + forbidden_bytemask = _mm256_or_si256( + forbidden_bytemask, + _mm256_cmpeq_epi32(_mm256_and_si256(in, v_f800), v_d800)); + + __m128i utf16_packed = _mm_packus_epi32(_mm256_castsi256_si128(in), + _mm256_extractf128_si256(in, 1)); + if (big_endian) { + const __m128i swap = + _mm_setr_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14); + utf16_packed = _mm_shuffle_epi8(utf16_packed, swap); + } + _mm_storeu_si128((__m128i *)utf16_output, utf16_packed); + utf16_output += 8; + buf += 8; + } else { + size_t forward = 7; + size_t k = 0; + if (size_t(end - buf) < forward + 1) { + forward = size_t(end - buf - 1); + } + for (; k < forward; k++) { + uint32_t word = buf[k]; + if ((word & 0xFFFF0000) == 0) { + // will not generate a surrogate pair + if (word >= 0xD800 && word <= 0xDFFF) { + return std::make_pair(nullptr, utf16_output); + } + *utf16_output++ = + big_endian + ? char16_t((uint16_t(word) >> 8) | (uint16_t(word) << 8)) + : char16_t(word); + } else { + // will generate a surrogate pair + if (word > 0x10FFFF) { + return std::make_pair(nullptr, utf16_output); + } + word -= 0x10000; + uint16_t high_surrogate = uint16_t(0xD800 + (word >> 10)); + uint16_t low_surrogate = uint16_t(0xDC00 + (word & 0x3FF)); + if (big_endian) { + high_surrogate = + uint16_t((high_surrogate >> 8) | (high_surrogate << 8)); + low_surrogate = + uint16_t((low_surrogate >> 8) | (low_surrogate << 8)); + } + *utf16_output++ = char16_t(high_surrogate); + *utf16_output++ = char16_t(low_surrogate); + } + } + buf += k; + } + } - while (pos < len) { - word = !match_system(big_endian) ? utf16::swap_bytes(data[pos]) : data[pos]; - *latin_output++ = char(word); - pos++; + // check for invalid input + if (static_cast(_mm256_movemask_epi8(forbidden_bytemask)) != 0) { + return std::make_pair(nullptr, utf16_output); } - return latin_output - start; + return std::make_pair(buf, utf16_output); } -} // namespace utf16_to_latin1 -} // unnamed namespace -} // namespace scalar -} // namespace simdutf +// Todo: currently, this is just the haswell code, optimize for icelake kernel. +template +std::pair +avx512_convert_utf32_to_utf16_with_errors(const char32_t *buf, size_t len, + char16_t *utf16_output) { + const char32_t *start = buf; + const char32_t *end = buf + len; -#endif -/* end file src/scalar/utf16_to_latin1/valid_utf16_to_latin1.h */ -/* begin file src/scalar/utf32_to_latin1/valid_utf32_to_latin1.h */ -#ifndef SIMDUTF_VALID_UTF32_TO_LATIN1_H -#define SIMDUTF_VALID_UTF32_TO_LATIN1_H + const size_t safety_margin = + 12; // to avoid overruns, see issue + // https://github.com/simdutf/simdutf/issues/92 -namespace simdutf { -namespace scalar { -namespace { -namespace utf32_to_latin1 { + while (end - buf >= std::ptrdiff_t(8 + safety_margin)) { + __m256i in = _mm256_loadu_si256((__m256i *)buf); -inline size_t convert_valid(const char32_t *buf, size_t len, - char *latin1_output) { - const uint32_t *data = reinterpret_cast(buf); - char *start = latin1_output; - uint32_t utf32_char; - size_t pos = 0; + const __m256i v_00000000 = _mm256_setzero_si256(); + const __m256i v_ffff0000 = _mm256_set1_epi32((int32_t)0xffff0000); - while (pos < len) { - utf32_char = (uint32_t)data[pos]; + // no bits set above 16th bit <=> can pack to UTF16 without surrogate pairs + const __m256i saturation_bytemask = + _mm256_cmpeq_epi32(_mm256_and_si256(in, v_ffff0000), v_00000000); + const uint32_t saturation_bitmask = + static_cast(_mm256_movemask_epi8(saturation_bytemask)); - if (pos + 2 <= - len) { // if it is safe to read 8 more bytes, check that they are Latin1 - uint64_t v; - ::memcpy(&v, data + pos, sizeof(uint64_t)); - if ((v & 0xFFFFFF00FFFFFF00) == 0) { - *latin1_output++ = char(buf[pos]); - *latin1_output++ = char(buf[pos + 1]); - pos += 2; - continue; - } else { - // output can not be represented in latin1 - return 0; + if (saturation_bitmask == 0xffffffff) { + const __m256i v_f800 = _mm256_set1_epi32((uint32_t)0xf800); + const __m256i v_d800 = _mm256_set1_epi32((uint32_t)0xd800); + const __m256i forbidden_bytemask = + _mm256_cmpeq_epi32(_mm256_and_si256(in, v_f800), v_d800); + if (static_cast(_mm256_movemask_epi8(forbidden_bytemask)) != + 0x0) { + return std::make_pair(result(error_code::SURROGATE, buf - start), + utf16_output); } - } - if ((utf32_char & 0xFFFFFF00) == 0) { - *latin1_output++ = char(utf32_char); + + __m128i utf16_packed = _mm_packus_epi32(_mm256_castsi256_si128(in), + _mm256_extractf128_si256(in, 1)); + if (big_endian) { + const __m128i swap = + _mm_setr_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14); + utf16_packed = _mm_shuffle_epi8(utf16_packed, swap); + } + _mm_storeu_si128((__m128i *)utf16_output, utf16_packed); + utf16_output += 8; + buf += 8; } else { - // output can not be represented in latin1 - return 0; + size_t forward = 7; + size_t k = 0; + if (size_t(end - buf) < forward + 1) { + forward = size_t(end - buf - 1); + } + for (; k < forward; k++) { + uint32_t word = buf[k]; + if ((word & 0xFFFF0000) == 0) { + // will not generate a surrogate pair + if (word >= 0xD800 && word <= 0xDFFF) { + return std::make_pair( + result(error_code::SURROGATE, buf - start + k), utf16_output); + } + *utf16_output++ = + big_endian + ? char16_t((uint16_t(word) >> 8) | (uint16_t(word) << 8)) + : char16_t(word); + } else { + // will generate a surrogate pair + if (word > 0x10FFFF) { + return std::make_pair( + result(error_code::TOO_LARGE, buf - start + k), utf16_output); + } + word -= 0x10000; + uint16_t high_surrogate = uint16_t(0xD800 + (word >> 10)); + uint16_t low_surrogate = uint16_t(0xDC00 + (word & 0x3FF)); + if (big_endian) { + high_surrogate = + uint16_t((high_surrogate >> 8) | (high_surrogate << 8)); + low_surrogate = + uint16_t((low_surrogate >> 8) | (low_surrogate << 8)); + } + *utf16_output++ = char16_t(high_surrogate); + *utf16_output++ = char16_t(low_surrogate); + } + } + buf += k; } - pos++; } - return latin1_output - start; + + return std::make_pair(result(error_code::SUCCESS, buf - start), utf16_output); } +/* end file src/icelake/icelake_convert_utf32_to_utf16.inl.cpp */ +/* begin file src/icelake/icelake_ascii_validation.inl.cpp */ +// file included directly -} // namespace utf32_to_latin1 -} // unnamed namespace -} // namespace scalar -} // namespace simdutf +bool validate_ascii(const char *buf, size_t len) { + const char *end = buf + len; + const __m512i ascii = _mm512_set1_epi8((uint8_t)0x80); + __m512i running_or = _mm512_setzero_si512(); + for (; end - buf >= 64; buf += 64) { + const __m512i utf8 = _mm512_loadu_si512((const __m512i *)buf); + running_or = _mm512_ternarylogic_epi32(running_or, utf8, ascii, + 0xf8); // running_or | (utf8 & ascii) + } + if (buf < end) { + const __m512i utf8 = _mm512_maskz_loadu_epi8( + (uint64_t(1) << (end - buf)) - 1, (const __m512i *)buf); + running_or = _mm512_ternarylogic_epi32(running_or, utf8, ascii, + 0xf8); // running_or | (utf8 & ascii) + } + return (_mm512_test_epi8_mask(running_or, running_or) == 0); +} +/* end file src/icelake/icelake_ascii_validation.inl.cpp */ +/* begin file src/icelake/icelake_utf32_validation.inl.cpp */ +// file included directly -#endif -/* end file src/scalar/utf32_to_latin1/valid_utf32_to_latin1.h */ +const char32_t *validate_utf32(const char32_t *buf, size_t len) { + if (len < 16) { + return buf; + } + const char32_t *end = buf + len - 16; -SIMDUTF_PUSH_DISABLE_WARNINGS -SIMDUTF_DISABLE_UNDESIRED_WARNINGS + const __m512i offset = _mm512_set1_epi32((uint32_t)0xffff2000); + __m512i currentmax = _mm512_setzero_si512(); + __m512i currentoffsetmax = _mm512_setzero_si512(); -#if SIMDUTF_IMPLEMENTATION_ARM64 -/* begin file src/arm64/implementation.cpp */ -/* begin file src/simdutf/arm64/begin.h */ -// redefining SIMDUTF_IMPLEMENTATION to "arm64" -// #define SIMDUTF_IMPLEMENTATION arm64 -/* end file src/simdutf/arm64/begin.h */ -namespace simdutf { -namespace arm64 { -namespace { -#ifndef SIMDUTF_ARM64_H - #error "arm64.h must be included" -#endif -using namespace simd; + while (buf <= end) { + __m512i utf32 = _mm512_loadu_si512((const __m512i *)buf); + buf += 16; + currentoffsetmax = + _mm512_max_epu32(_mm512_add_epi32(utf32, offset), currentoffsetmax); + currentmax = _mm512_max_epu32(utf32, currentmax); + } -simdutf_really_inline bool is_ascii(const simd8x64 &input) { - simd8 bits = input.reduce_or(); - return bits.max_val() < 0b10000000u; -} + const __m512i standardmax = _mm512_set1_epi32((uint32_t)0x10ffff); + const __m512i standardoffsetmax = _mm512_set1_epi32((uint32_t)0xfffff7ff); + __m512i is_zero = + _mm512_xor_si512(_mm512_max_epu32(currentmax, standardmax), standardmax); + if (_mm512_test_epi8_mask(is_zero, is_zero) != 0) { + return nullptr; + } + is_zero = _mm512_xor_si512( + _mm512_max_epu32(currentoffsetmax, standardoffsetmax), standardoffsetmax); + if (_mm512_test_epi8_mask(is_zero, is_zero) != 0) { + return nullptr; + } -simdutf_unused simdutf_really_inline simd8 -must_be_continuation(const simd8 prev1, const simd8 prev2, - const simd8 prev3) { - simd8 is_second_byte = prev1 >= uint8_t(0b11000000u); - simd8 is_third_byte = prev2 >= uint8_t(0b11100000u); - simd8 is_fourth_byte = prev3 >= uint8_t(0b11110000u); - // Use ^ instead of | for is_*_byte, because ^ is commutative, and the caller - // is using ^ as well. This will work fine because we only have to report - // errors for cases with 0-1 lead bytes. Multiple lead bytes implies 2 - // overlapping multibyte characters, and if that happens, there is guaranteed - // to be at least *one* lead byte that is part of only 1 other multibyte - // character. The error will be detected there. - return is_second_byte ^ is_third_byte ^ is_fourth_byte; + return buf; } +/* end file src/icelake/icelake_utf32_validation.inl.cpp */ +/* begin file src/icelake/icelake_convert_latin1_to_utf8.inl.cpp */ +// file included directly -simdutf_really_inline simd8 -must_be_2_3_continuation(const simd8 prev2, - const simd8 prev3) { - simd8 is_third_byte = prev2 >= uint8_t(0b11100000u); - simd8 is_fourth_byte = prev3 >= uint8_t(0b11110000u); - return is_third_byte ^ is_fourth_byte; -} +static inline size_t latin1_to_utf8_avx512_vec(__m512i input, size_t input_len, + char *utf8_output, + int mask_output) { + __mmask64 nonascii = _mm512_movepi8_mask(input); + size_t output_size = input_len + (size_t)count_ones(nonascii); -// common functions for utf8 conversions -simdutf_really_inline uint16x4_t convert_utf8_3_byte_to_utf16(uint8x16_t in) { - // Low half contains 10cccccc|1110aaaa - // High half contains 10bbbbbb|10bbbbbb -#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO - const uint8x16_t sh = simdutf_make_uint8x16_t(0, 2, 3, 5, 6, 8, 9, 11, 1, 1, - 4, 4, 7, 7, 10, 10); -#else - const uint8x16_t sh = {0, 2, 3, 5, 6, 8, 9, 11, 1, 1, 4, 4, 7, 7, 10, 10}; -#endif - uint8x16_t perm = vqtbl1q_u8(in, sh); - // Split into half vectors. - // 10cccccc|1110aaaa - uint8x8_t perm_low = vget_low_u8(perm); // no-op - // 10bbbbbb|10bbbbbb - uint8x8_t perm_high = vget_high_u8(perm); - // xxxxxxxx 10bbbbbb - uint16x4_t mid = vreinterpret_u16_u8(perm_high); // no-op - // xxxxxxxx 1110aaaa - uint16x4_t high = vreinterpret_u16_u8(perm_low); // no-op - // Assemble with shift left insert. - // xxxxxxaa aabbbbbb - uint16x4_t mid_high = vsli_n_u16(mid, high, 6); - // (perm_low << 8) | (perm_low >> 8) - // xxxxxxxx 10cccccc - uint16x4_t low = vreinterpret_u16_u8(vrev16_u8(perm_low)); - // Shift left insert into the low bits - // aaaabbbb bbcccccc - uint16x4_t composed = vsli_n_u16(low, mid_high, 6); - return composed; -} + // Mask to denote whether the byte is a leading byte that is not ascii + __mmask64 sixth = _mm512_cmpge_epu8_mask( + input, _mm512_set1_epi8(-64)); // binary representation of -64: 1100 0000 -simdutf_really_inline uint16x8_t convert_utf8_2_byte_to_utf16(uint8x16_t in) { - // Converts 6 2 byte UTF-8 characters to 6 UTF-16 characters. - // Technically this calculates 8, but 6 does better and happens more often - // (The languages which use these codepoints use ASCII spaces so 8 would need - // to be in the middle of a very long word). + const uint64_t alternate_bits = UINT64_C(0x5555555555555555); + uint64_t ascii = ~nonascii; + // the bits in ascii are inverted and zeros are interspersed in between them + uint64_t maskA = ~_pdep_u64(ascii, alternate_bits); + uint64_t maskB = ~_pdep_u64(ascii >> 32, alternate_bits); - // 10bbbbbb 110aaaaa - uint16x8_t upper = vreinterpretq_u16_u8(in); - // (in << 8) | (in >> 8) - // 110aaaaa 10bbbbbb - uint16x8_t lower = vreinterpretq_u16_u8(vrev16q_u8(in)); - // 00000000 000aaaaa - uint16x8_t upper_masked = vandq_u16(upper, vmovq_n_u16(0x1F)); - // Assemble with shift left insert. - // 00000aaa aabbbbbb - uint16x8_t composed = vsliq_n_u16(lower, upper_masked, 6); - return composed; -} + // interleave bytes from top and bottom halves (abcd...ABCD -> aAbBcCdD) + __m512i input_interleaved = _mm512_permutexvar_epi8( + _mm512_set_epi32(0x3f1f3e1e, 0x3d1d3c1c, 0x3b1b3a1a, 0x39193818, + 0x37173616, 0x35153414, 0x33133212, 0x31113010, + 0x2f0f2e0e, 0x2d0d2c0c, 0x2b0b2a0a, 0x29092808, + 0x27072606, 0x25052404, 0x23032202, 0x21012000), + input); -simdutf_really_inline uint16x8_t -convert_utf8_1_to_2_byte_to_utf16(uint8x16_t in, size_t shufutf8_idx) { - // Converts 6 1-2 byte UTF-8 characters to 6 UTF-16 characters. - // This is a relatively easy scenario - // we process SIX (6) input code-code units. The max length in bytes of six - // code code units spanning between 1 and 2 bytes each is 12 bytes. - uint8x16_t sh = vld1q_u8(reinterpret_cast( - simdutf::tables::utf8_to_utf16::shufutf8[shufutf8_idx])); - // Shuffle - // 1 byte: 00000000 0bbbbbbb - // 2 byte: 110aaaaa 10bbbbbb - uint16x8_t perm = vreinterpretq_u16_u8(vqtbl1q_u8(in, sh)); - // Mask - // 1 byte: 00000000 0bbbbbbb - // 2 byte: 00000000 00bbbbbb - uint16x8_t ascii = vandq_u16(perm, vmovq_n_u16(0x7f)); // 6 or 7 bits - // 1 byte: 00000000 00000000 - // 2 byte: 000aaaaa 00000000 - uint16x8_t highbyte = vandq_u16(perm, vmovq_n_u16(0x1f00)); // 5 bits - // Combine with a shift right accumulate - // 1 byte: 00000000 0bbbbbbb - // 2 byte: 00000aaa aabbbbbb - uint16x8_t composed = vsraq_n_u16(ascii, highbyte, 2); - return composed; -} + // double size of each byte, and insert the leading byte 1100 0010 -/* begin file src/arm64/arm_validate_utf16.cpp */ -template -const char16_t *arm_validate_utf16(const char16_t *input, size_t size) { - const char16_t *end = input + size; - const auto v_d8 = simd8::splat(0xd8); - const auto v_f8 = simd8::splat(0xf8); - const auto v_fc = simd8::splat(0xfc); - const auto v_dc = simd8::splat(0xdc); - while (end - input >= 16) { - // 0. Load data: since the validation takes into account only higher - // byte of each word, we compress the two vectors into one which - // consists only the higher bytes. - auto in0 = simd16(input); - auto in1 = - simd16(input + simd16::SIZE / sizeof(char16_t)); - if (!match_system(big_endian)) { - in0 = vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(in0))); - in1 = vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(in1))); - } - const auto t0 = in0.shr<8>(); - const auto t1 = in1.shr<8>(); - const simd8 in = simd16::pack(t0, t1); - // 1. Check whether we have any 0xD800..DFFF word (0b1101'1xxx'yyyy'yyyy). - const uint64_t surrogates_wordmask = ((in & v_f8) == v_d8).to_bitmask64(); - if (surrogates_wordmask == 0) { - input += 16; - } else { - // 2. We have some surrogates that have to be distinguished: - // - low surrogates: 0b1101'10xx'yyyy'yyyy (0xD800..0xDBFF) - // - high surrogates: 0b1101'11xx'yyyy'yyyy (0xDC00..0xDFFF) - // - // Fact: high surrogate has 11th bit set (3rd bit in the higher word) + /* + upscale the bytes to 16-bit value, adding the 0b11000000 leading byte in the + process. We adjust for the bytes that have their two most significant bits. + This takes care of the first 32 bytes, assuming we interleaved the bytes. */ + __m512i outputA = + _mm512_shldi_epi16(input_interleaved, _mm512_set1_epi8(-62), 8); + outputA = _mm512_mask_add_epi16( + outputA, (__mmask32)sixth, outputA, + _mm512_set1_epi16(1 - 0x4000)); // 1- 0x4000 = 1100 0000 0000 0001???? - // V - non-surrogate code units - // V = not surrogates_wordmask - const uint64_t V = ~surrogates_wordmask; + // in the second 32-bit half, set first or second option based on whether + // original input is leading byte (second case) or not (first case) + __m512i leadingB = + _mm512_mask_blend_epi16((__mmask32)(sixth >> 32), + _mm512_set1_epi16(0x00c2), // 0000 0000 1101 0010 + _mm512_set1_epi16(0x40c3)); // 0100 0000 1100 0011 + __m512i outputB = _mm512_ternarylogic_epi32( + input_interleaved, leadingB, _mm512_set1_epi16((short)0xff00), + (240 & 170) ^ 204); // (input_interleaved & 0xff00) ^ leadingB - // H - word-mask for high surrogates: the six highest bits are 0b1101'11 - const auto vH = ((in & v_fc) == v_dc); - const uint64_t H = vH.to_bitmask64(); + // prune redundant bytes + outputA = _mm512_maskz_compress_epi8(maskA, outputA); + outputB = _mm512_maskz_compress_epi8(maskB, outputB); - // L - word mask for low surrogates - // L = not H and surrogates_wordmask - const uint64_t L = ~H & surrogates_wordmask; + size_t output_sizeA = (size_t)count_ones((uint32_t)nonascii) + 32; - const uint64_t a = - L & (H >> 4); // A low surrogate must be followed by high one. - // (A low surrogate placed in the 7th register's word - // is an exception we handle.) - const uint64_t b = - a << 4; // Just mark that the opposite fact is hold, - // thanks to that we have only two masks for valid case. - const uint64_t c = V | a | b; // Combine all the masks into the final one. - if (c == ~0ull) { - // The whole input register contains valid UTF-16, i.e., - // either single code units or proper surrogate pairs. - input += 16; - } else if (c == 0xfffffffffffffffull) { - // The 15 lower code units of the input register contains valid UTF-16. - // The 15th word may be either a low or high surrogate. It the next - // iteration we 1) check if the low surrogate is followed by a high - // one, 2) reject sole high surrogate. - input += 15; - } else { - return nullptr; - } + if (mask_output) { + if (input_len > 32) { // is the second half of the input vector used? + __mmask64 write_mask = _bzhi_u64(~0ULL, (unsigned int)output_sizeA); + _mm512_mask_storeu_epi8(utf8_output, write_mask, outputA); + utf8_output += output_sizeA; + write_mask = _bzhi_u64(~0ULL, (unsigned int)(output_size - output_sizeA)); + _mm512_mask_storeu_epi8(utf8_output, write_mask, outputB); + } else { + __mmask64 write_mask = _bzhi_u64(~0ULL, (unsigned int)output_size); + _mm512_mask_storeu_epi8(utf8_output, write_mask, outputA); } + } else { + _mm512_storeu_si512(utf8_output, outputA); + utf8_output += output_sizeA; + _mm512_storeu_si512(utf8_output, outputB); + } + return output_size; +} + +static inline size_t latin1_to_utf8_avx512_branch(__m512i input, + char *utf8_output) { + __mmask64 nonascii = _mm512_movepi8_mask(input); + if (nonascii) { + return latin1_to_utf8_avx512_vec(input, 64, utf8_output, 0); + } else { + _mm512_storeu_si512(utf8_output, input); + return 64; } - return input; } +size_t latin1_to_utf8_avx512_start(const char *buf, size_t len, + char *utf8_output) { + char *start = utf8_output; + size_t pos = 0; + // if there's at least 128 bytes remaining, we don't need to mask the output + for (; pos + 128 <= len; pos += 64) { + __m512i input = _mm512_loadu_si512((__m512i *)(buf + pos)); + utf8_output += latin1_to_utf8_avx512_branch(input, utf8_output); + } + // in the last 128 bytes, the first 64 may require masking the output + if (pos + 64 <= len) { + __m512i input = _mm512_loadu_si512((__m512i *)(buf + pos)); + utf8_output += latin1_to_utf8_avx512_vec(input, 64, utf8_output, 1); + pos += 64; + } + // with the last 64 bytes, the input also needs to be masked + if (pos < len) { + __mmask64 load_mask = _bzhi_u64(~0ULL, (unsigned int)(len - pos)); + __m512i input = _mm512_maskz_loadu_epi8(load_mask, (__m512i *)(buf + pos)); + utf8_output += latin1_to_utf8_avx512_vec(input, len - pos, utf8_output, 1); + } + return (size_t)(utf8_output - start); +} +/* end file src/icelake/icelake_convert_latin1_to_utf8.inl.cpp */ +/* begin file src/icelake/icelake_convert_latin1_to_utf16.inl.cpp */ +// file included directly template -const result arm_validate_utf16_with_errors(const char16_t *input, - size_t size) { - const char16_t *start = input; - const char16_t *end = input + size; +size_t icelake_convert_latin1_to_utf16(const char *latin1_input, size_t len, + char16_t *utf16_output) { + size_t rounded_len = len & ~0x1F; // Round down to nearest multiple of 32 - const auto v_d8 = simd8::splat(0xd8); - const auto v_f8 = simd8::splat(0xf8); - const auto v_fc = simd8::splat(0xfc); - const auto v_dc = simd8::splat(0xdc); - while (input + 16 < end) { - // 0. Load data: since the validation takes into account only higher - // byte of each word, we compress the two vectors into one which - // consists only the higher bytes. - auto in0 = simd16(input); - auto in1 = - simd16(input + simd16::SIZE / sizeof(char16_t)); + __m512i byteflip = _mm512_setr_epi64(0x0607040502030001, 0x0e0f0c0d0a0b0809, + 0x0607040502030001, 0x0e0f0c0d0a0b0809, + 0x0607040502030001, 0x0e0f0c0d0a0b0809, + 0x0607040502030001, 0x0e0f0c0d0a0b0809); + for (size_t i = 0; i < rounded_len; i += 32) { + // Load 32 Latin1 characters into a 256-bit register + __m256i in = _mm256_loadu_si256((__m256i *)&latin1_input[i]); + // Zero extend each set of 8 Latin1 characters to 32 16-bit integers + __m512i out = _mm512_cvtepu8_epi16(in); + if (big_endian) { + out = _mm512_shuffle_epi8(out, byteflip); + } + // Store the results back to memory + _mm512_storeu_si512((__m512i *)&utf16_output[i], out); + } + if (rounded_len != len) { + uint32_t mask = uint32_t(1 << (len - rounded_len)) - 1; + __m256i in = _mm256_maskz_loadu_epi8(mask, latin1_input + rounded_len); - if (!match_system(big_endian)) { - in0 = vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(in0))); - in1 = vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(in1))); + // Zero extend each set of 8 Latin1 characters to 32 16-bit integers + __m512i out = _mm512_cvtepu8_epi16(in); + if (big_endian) { + out = _mm512_shuffle_epi8(out, byteflip); } - const auto t0 = in0.shr<8>(); - const auto t1 = in1.shr<8>(); - const simd8 in = simd16::pack(t0, t1); - // 1. Check whether we have any 0xD800..DFFF word (0b1101'1xxx'yyyy'yyyy). - const uint64_t surrogates_wordmask = ((in & v_f8) == v_d8).to_bitmask64(); - if (surrogates_wordmask == 0) { - input += 16; - } else { - // 2. We have some surrogates that have to be distinguished: - // - low surrogates: 0b1101'10xx'yyyy'yyyy (0xD800..0xDBFF) - // - high surrogates: 0b1101'11xx'yyyy'yyyy (0xDC00..0xDFFF) - // - // Fact: high surrogate has 11th bit set (3rd bit in the higher word) + // Store the results back to memory + _mm512_mask_storeu_epi16(utf16_output + rounded_len, mask, out); + } - // V - non-surrogate code units - // V = not surrogates_wordmask - const uint64_t V = ~surrogates_wordmask; + return len; +} +/* end file src/icelake/icelake_convert_latin1_to_utf16.inl.cpp */ +/* begin file src/icelake/icelake_convert_latin1_to_utf32.inl.cpp */ +std::pair +avx512_convert_latin1_to_utf32(const char *buf, size_t len, + char32_t *utf32_output) { + size_t rounded_len = len & ~0xF; // Round down to nearest multiple of 16 - // H - word-mask for high surrogates: the six highest bits are 0b1101'11 - const auto vH = ((in & v_fc) == v_dc); - const uint64_t H = vH.to_bitmask64(); + for (size_t i = 0; i < rounded_len; i += 16) { + // Load 16 Latin1 characters into a 128-bit register + __m128i in = _mm_loadu_si128((__m128i *)&buf[i]); - // L - word mask for low surrogates - // L = not H and surrogates_wordmask - const uint64_t L = ~H & surrogates_wordmask; + // Zero extend each set of 8 Latin1 characters to 16 32-bit integers using + // vpmovzxbd + __m512i out = _mm512_cvtepu8_epi32(in); - const uint64_t a = - L & (H >> 4); // A low surrogate must be followed by high one. - // (A low surrogate placed in the 7th register's word - // is an exception we handle.) - const uint64_t b = - a << 4; // Just mark that the opposite fact is hold, - // thanks to that we have only two masks for valid case. - const uint64_t c = V | a | b; // Combine all the masks into the final one. - if (c == ~0ull) { - // The whole input register contains valid UTF-16, i.e., - // either single code units or proper surrogate pairs. - input += 16; - } else if (c == 0xfffffffffffffffull) { - // The 15 lower code units of the input register contains valid UTF-16. - // The 15th word may be either a low or high surrogate. It the next - // iteration we 1) check if the low surrogate is followed by a high - // one, 2) reject sole high surrogate. - input += 15; - } else { - return result(error_code::SURROGATE, input - start); - } - } + // Store the results back to memory + _mm512_storeu_si512((__m512i *)&utf32_output[i], out); } - return result(error_code::SUCCESS, input - start); + + // Return pointers pointing to where we left off + return std::make_pair(buf + rounded_len, utf32_output + rounded_len); } -/* end file src/arm64/arm_validate_utf16.cpp */ -/* begin file src/arm64/arm_validate_utf32le.cpp */ +/* end file src/icelake/icelake_convert_latin1_to_utf32.inl.cpp */ +/* begin file src/icelake/icelake_base64.inl.cpp */ +// file included directly +/** + * References and further reading: + * + * Wojciech Muła, Daniel Lemire, Base64 encoding and decoding at almost the + * speed of a memory copy, Software: Practice and Experience 50 (2), 2020. + * https://arxiv.org/abs/1910.05109 + * + * Wojciech Muła, Daniel Lemire, Faster Base64 Encoding and Decoding using AVX2 + * Instructions, ACM Transactions on the Web 12 (3), 2018. + * https://arxiv.org/abs/1704.00605 + * + * Simon Josefsson. 2006. The Base16, Base32, and Base64 Data Encodings. + * https://tools.ietf.org/html/rfc4648. (2006). Internet Engineering Task Force, + * Request for Comments: 4648. + * + * Alfred Klomp. 2014a. Fast Base64 encoding/decoding with SSE vectorization. + * http://www.alfredklomp.com/programming/sse-base64/. (2014). + * + * Alfred Klomp. 2014b. Fast Base64 stream encoder/decoder in C99, with SIMD + * acceleration. https://github.com/aklomp/base64. (2014). + * + * Hanson Char. 2014. A Fast and Correct Base 64 Codec. (2014). + * https://aws.amazon.com/blogs/developer/a-fast-and-correct-base-64-codec/ + * + * Nick Kopp. 2013. Base64 Encoding on a GPU. + * https://www.codeproject.com/Articles/276993/Base-Encoding-on-a-GPU. (2013). + */ -const char32_t *arm_validate_utf32le(const char32_t *input, size_t size) { - const char32_t *end = input + size; +struct block64 { + __m512i chunks[1]; +}; - const uint32x4_t standardmax = vmovq_n_u32(0x10ffff); - const uint32x4_t offset = vmovq_n_u32(0xffff2000); - const uint32x4_t standardoffsetmax = vmovq_n_u32(0xfffff7ff); - uint32x4_t currentmax = vmovq_n_u32(0x0); - uint32x4_t currentoffsetmax = vmovq_n_u32(0x0); +template +size_t encode_base64(char *dst, const char *src, size_t srclen, + base64_options options) { + // credit: Wojciech Muła + const uint8_t *input = (const uint8_t *)src; - while (end - input >= 4) { - const uint32x4_t in = vld1q_u32(reinterpret_cast(input)); - currentmax = vmaxq_u32(in, currentmax); - currentoffsetmax = vmaxq_u32(vaddq_u32(in, offset), currentoffsetmax); - input += 4; + uint8_t *out = (uint8_t *)dst; + static const char *lookup_tbl = + base64_url + ? "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_" + : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + + const __m512i shuffle_input = _mm512_setr_epi32( + 0x01020001, 0x04050304, 0x07080607, 0x0a0b090a, 0x0d0e0c0d, 0x10110f10, + 0x13141213, 0x16171516, 0x191a1819, 0x1c1d1b1c, 0x1f201e1f, 0x22232122, + 0x25262425, 0x28292728, 0x2b2c2a2b, 0x2e2f2d2e); + const __m512i lookup = + _mm512_loadu_si512(reinterpret_cast(lookup_tbl)); + const __m512i multi_shifts = _mm512_set1_epi64(UINT64_C(0x3036242a1016040a)); + size_t size = srclen; + __mmask64 input_mask = 0xffffffffffff; // (1 << 48) - 1 + while (size >= 48) { + const __m512i v = _mm512_maskz_loadu_epi8( + input_mask, reinterpret_cast(input)); + const __m512i in = _mm512_permutexvar_epi8(shuffle_input, v); + const __m512i indices = _mm512_multishift_epi64_epi8(multi_shifts, in); + const __m512i result = _mm512_permutexvar_epi8(indices, lookup); + _mm512_storeu_si512(reinterpret_cast<__m512i *>(out), result); + out += 64; + input += 48; + size -= 48; + } + input_mask = ((__mmask64)1 << size) - 1; + const __m512i v = _mm512_maskz_loadu_epi8( + input_mask, reinterpret_cast(input)); + const __m512i in = _mm512_permutexvar_epi8(shuffle_input, v); + const __m512i indices = _mm512_multishift_epi64_epi8(multi_shifts, in); + bool padding_needed = + (((options & base64_url) == 0) ^ + ((options & base64_reverse_padding) == base64_reverse_padding)); + size_t padding_amount = ((size % 3) > 0) ? (3 - (size % 3)) : 0; + size_t output_len = ((size + 2) / 3) * 4; + size_t non_padded_output_len = output_len - padding_amount; + if (!padding_needed) { + output_len = non_padded_output_len; } + __mmask64 output_mask = output_len == 64 ? (__mmask64)UINT64_MAX + : ((__mmask64)1 << output_len) - 1; + __m512i result = _mm512_mask_permutexvar_epi8( + _mm512_set1_epi8('='), ((__mmask64)1 << non_padded_output_len) - 1, + indices, lookup); + _mm512_mask_storeu_epi8(reinterpret_cast<__m512i *>(out), output_mask, + result); + return (size_t)(out - (uint8_t *)dst) + output_len; +} - uint32x4_t is_zero = - veorq_u32(vmaxq_u32(currentmax, standardmax), standardmax); - if (vmaxvq_u32(is_zero) != 0) { - return nullptr; +template +static inline uint64_t to_base64_mask(block64 *b, uint64_t *error, + uint64_t input_mask = UINT64_MAX) { + __m512i input = b->chunks[0]; + const __m512i ascii_space_tbl = _mm512_set_epi8( + 0, 0, 13, 12, 0, 10, 9, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 13, 12, 0, 10, + 9, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 13, 12, 0, 10, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 32, 0, 0, 13, 12, 0, 10, 9, 0, 0, 0, 0, 0, 0, 0, 0, 32); + __m512i lookup0; + if (base64_url) { + lookup0 = _mm512_set_epi8( + -128, -128, -128, -128, -128, -128, 61, 60, 59, 58, 57, 56, 55, 54, 53, + 52, -128, -128, 62, -128, -128, -128, -128, -128, -128, -128, -128, + -128, -128, -128, -128, -1, -128, -128, -128, -128, -128, -128, -128, + -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -1, + -128, -128, -1, -1, -128, -128, -128, -128, -128, -128, -128, -128, -1); + } else { + lookup0 = _mm512_set_epi8( + -128, -128, -128, -128, -128, -128, 61, 60, 59, 58, 57, 56, 55, 54, 53, + 52, 63, -128, -128, -128, 62, -128, -128, -128, -128, -128, -128, -128, + -128, -128, -128, -1, -128, -128, -128, -128, -128, -128, -128, -128, + -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -1, -128, + -128, -1, -1, -128, -128, -128, -128, -128, -128, -128, -128, -128); + } + __m512i lookup1; + if (base64_url) { + lookup1 = _mm512_set_epi8( + -128, -128, -128, -128, -128, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, + 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, -128, + 63, -128, -128, -128, -128, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, + 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -128); + } else { + lookup1 = _mm512_set_epi8( + -128, -128, -128, -128, -128, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, + 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, -128, + -128, -128, -128, -128, -128, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, + 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -128); } - is_zero = veorq_u32(vmaxq_u32(currentoffsetmax, standardoffsetmax), - standardoffsetmax); - if (vmaxvq_u32(is_zero) != 0) { - return nullptr; + const __m512i translated = _mm512_permutex2var_epi8(lookup0, input, lookup1); + const __m512i combined = _mm512_or_si512(translated, input); + const __mmask64 mask = _mm512_movepi8_mask(combined) & input_mask; + if (!ignore_garbage && mask) { + const __mmask64 spaces = + _mm512_cmpeq_epi8_mask(_mm512_shuffle_epi8(ascii_space_tbl, input), + input) & + input_mask; + *error = (mask ^ spaces); } + b->chunks[0] = translated; - return input; + return mask | (~input_mask); } -const result arm_validate_utf32le_with_errors(const char32_t *input, - size_t size) { - const char32_t *start = input; - const char32_t *end = input + size; - - const uint32x4_t standardmax = vmovq_n_u32(0x10ffff); - const uint32x4_t offset = vmovq_n_u32(0xffff2000); - const uint32x4_t standardoffsetmax = vmovq_n_u32(0xfffff7ff); - uint32x4_t currentmax = vmovq_n_u32(0x0); - uint32x4_t currentoffsetmax = vmovq_n_u32(0x0); +static inline void copy_block(block64 *b, char *output) { + _mm512_storeu_si512(reinterpret_cast<__m512i *>(output), b->chunks[0]); +} - while (end - input >= 4) { - const uint32x4_t in = vld1q_u32(reinterpret_cast(input)); - currentmax = vmaxq_u32(in, currentmax); - currentoffsetmax = vmaxq_u32(vaddq_u32(in, offset), currentoffsetmax); +static inline uint64_t compress_block(block64 *b, uint64_t mask, char *output) { + uint64_t nmask = ~mask; + __m512i c = _mm512_maskz_compress_epi8(nmask, b->chunks[0]); + _mm512_storeu_si512(reinterpret_cast<__m512i *>(output), c); + return _mm_popcnt_u64(nmask); +} - uint32x4_t is_zero = - veorq_u32(vmaxq_u32(currentmax, standardmax), standardmax); - if (vmaxvq_u32(is_zero) != 0) { - return result(error_code::TOO_LARGE, input - start); - } +// The caller of this function is responsible to ensure that there are 64 bytes +// available from reading at src. The data is read into a block64 structure. +static inline void load_block(block64 *b, const char *src) { + b->chunks[0] = _mm512_loadu_si512(reinterpret_cast(src)); +} - is_zero = veorq_u32(vmaxq_u32(currentoffsetmax, standardoffsetmax), - standardoffsetmax); - if (vmaxvq_u32(is_zero) != 0) { - return result(error_code::SURROGATE, input - start); - } +static inline void load_block_partial(block64 *b, const char *src, + __mmask64 input_mask) { + b->chunks[0] = _mm512_maskz_loadu_epi8( + input_mask, reinterpret_cast(src)); +} - input += 4; - } +// The caller of this function is responsible to ensure that there are 128 bytes +// available from reading at src. The data is read into a block64 structure. +static inline void load_block(block64 *b, const char16_t *src) { + __m512i m1 = _mm512_loadu_si512(reinterpret_cast(src)); + __m512i m2 = _mm512_loadu_si512(reinterpret_cast(src + 32)); + __m512i p = _mm512_packus_epi16(m1, m2); + b->chunks[0] = + _mm512_permutexvar_epi64(_mm512_setr_epi64(0, 2, 4, 6, 1, 3, 5, 7), p); +} - return result(error_code::SUCCESS, input - start); +static inline void load_block_partial(block64 *b, const char16_t *src, + __mmask64 input_mask) { + __m512i m1 = _mm512_maskz_loadu_epi16((__mmask32)input_mask, + reinterpret_cast(src)); + __m512i m2 = + _mm512_maskz_loadu_epi16((__mmask32)(input_mask >> 32), + reinterpret_cast(src + 32)); + __m512i p = _mm512_packus_epi16(m1, m2); + b->chunks[0] = + _mm512_permutexvar_epi64(_mm512_setr_epi64(0, 2, 4, 6, 1, 3, 5, 7), p); } -/* end file src/arm64/arm_validate_utf32le.cpp */ -/* begin file src/arm64/arm_convert_latin1_to_utf16.cpp */ -template -std::pair -arm_convert_latin1_to_utf16(const char *buf, size_t len, - char16_t *utf16_output) { - const char *end = buf + len; +static inline void base64_decode(char *out, __m512i str) { + const __m512i merge_ab_and_bc = + _mm512_maddubs_epi16(str, _mm512_set1_epi32(0x01400140)); + const __m512i merged = + _mm512_madd_epi16(merge_ab_and_bc, _mm512_set1_epi32(0x00011000)); + const __m512i pack = _mm512_set_epi8( + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 61, 62, 56, 57, 58, + 52, 53, 54, 48, 49, 50, 44, 45, 46, 40, 41, 42, 36, 37, 38, 32, 33, 34, + 28, 29, 30, 24, 25, 26, 20, 21, 22, 16, 17, 18, 12, 13, 14, 8, 9, 10, 4, + 5, 6, 0, 1, 2); + const __m512i shuffled = _mm512_permutexvar_epi8(pack, merged); + _mm512_mask_storeu_epi8( + (__m512i *)out, 0xffffffffffff, + shuffled); // mask would be 0xffffffffffff since we write 48 bytes. +} +// decode 64 bytes and output 48 bytes +static inline void base64_decode_block(char *out, const char *src) { + base64_decode(out, + _mm512_loadu_si512(reinterpret_cast(src))); +} +static inline void base64_decode_block(char *out, block64 *b) { + base64_decode(out, b->chunks[0]); +} - while (end - buf >= 16) { - uint8x16_t in8 = vld1q_u8(reinterpret_cast(buf)); - uint16x8_t inlow = vmovl_u8(vget_low_u8(in8)); - if (!match_system(big_endian)) { - inlow = vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(inlow))); +template +full_result +compress_decode_base64(char *dst, const chartype *src, size_t srclen, + base64_options options, + last_chunk_handling_options last_chunk_options) { + (void)options; + const uint8_t *to_base64 = base64_url ? tables::base64::to_base64_url_value + : tables::base64::to_base64_value; + size_t equallocation = + srclen; // location of the first padding character if any + size_t equalsigns = 0; + // skip trailing spaces + while (!ignore_garbage && srclen > 0 && + scalar::base64::is_eight_byte(src[srclen - 1]) && + to_base64[uint8_t(src[srclen - 1])] == 64) { + srclen--; + } + if (!ignore_garbage && srclen > 0 && src[srclen - 1] == '=') { + equallocation = srclen - 1; + srclen--; + equalsigns = 1; + // skip trailing spaces + while (srclen > 0 && scalar::base64::is_eight_byte(src[srclen - 1]) && + to_base64[uint8_t(src[srclen - 1])] == 64) { + srclen--; } - vst1q_u16(reinterpret_cast(utf16_output), inlow); - uint16x8_t inhigh = vmovl_u8(vget_high_u8(in8)); - if (!match_system(big_endian)) { - inhigh = vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(inhigh))); + if (srclen > 0 && src[srclen - 1] == '=') { + equallocation = srclen - 1; + srclen--; + equalsigns = 2; } - vst1q_u16(reinterpret_cast(utf16_output + 8), inhigh); - utf16_output += 16; - buf += 16; } - - return std::make_pair(buf, utf16_output); -} -/* end file src/arm64/arm_convert_latin1_to_utf16.cpp */ -/* begin file src/arm64/arm_convert_latin1_to_utf32.cpp */ -std::pair -arm_convert_latin1_to_utf32(const char *buf, size_t len, - char32_t *utf32_output) { - const char *end = buf + len; - - while (end - buf >= 16) { - uint8x16_t in8 = vld1q_u8(reinterpret_cast(buf)); - uint16x8_t in8low = vmovl_u8(vget_low_u8(in8)); - uint32x4_t in16lowlow = vmovl_u16(vget_low_u16(in8low)); - uint32x4_t in16lowhigh = vmovl_u16(vget_high_u16(in8low)); - uint16x8_t in8high = vmovl_u8(vget_high_u8(in8)); - uint32x4_t in8highlow = vmovl_u16(vget_low_u16(in8high)); - uint32x4_t in8highhigh = vmovl_u16(vget_high_u16(in8high)); - vst1q_u32(reinterpret_cast(utf32_output), in16lowlow); - vst1q_u32(reinterpret_cast(utf32_output + 4), in16lowhigh); - vst1q_u32(reinterpret_cast(utf32_output + 8), in8highlow); - vst1q_u32(reinterpret_cast(utf32_output + 12), in8highhigh); - - utf32_output += 16; - buf += 16; + if (srclen == 0) { + if (!ignore_garbage && equalsigns > 0) { + return {INVALID_BASE64_CHARACTER, equallocation, 0}; + } + return {SUCCESS, 0, 0}; } + const chartype *const srcinit = src; + const char *const dstinit = dst; + const chartype *const srcend = src + srclen; - return std::make_pair(buf, utf32_output); -} -/* end file src/arm64/arm_convert_latin1_to_utf32.cpp */ -/* begin file src/arm64/arm_convert_latin1_to_utf8.cpp */ -/* - Returns a pair: the first unprocessed byte from buf and utf8_output - A scalar routing should carry on the conversion of the tail. -*/ -std::pair -arm_convert_latin1_to_utf8(const char *latin1_input, size_t len, - char *utf8_out) { - uint8_t *utf8_output = reinterpret_cast(utf8_out); - const char *end = latin1_input + len; - const uint16x8_t v_c080 = vmovq_n_u16((uint16_t)0xc080); - // We always write 16 bytes, of which more than the first 8 bytes - // are valid. A safety margin of 8 is more than sufficient. - while (end - latin1_input >= 16 + 8) { - uint8x16_t in8 = vld1q_u8(reinterpret_cast(latin1_input)); - if (vmaxvq_u8(in8) <= 0x7F) { // ASCII fast path!!!! - vst1q_u8(utf8_output, in8); - utf8_output += 16; - latin1_input += 16; - continue; + // figure out why block_size == 2 is sometimes best??? + constexpr size_t block_size = 6; + char buffer[block_size * 64]; + char *bufferptr = buffer; + if (srclen >= 64) { + const chartype *const srcend64 = src + srclen - 64; + while (src <= srcend64) { + block64 b; + load_block(&b, src); + src += 64; + uint64_t error = 0; + uint64_t badcharmask = + to_base64_mask(&b, &error); + if (!ignore_garbage && error) { + src -= 64; + size_t error_offset = _tzcnt_u64(error); + return {error_code::INVALID_BASE64_CHARACTER, + size_t(src - srcinit + error_offset), size_t(dst - dstinit)}; + } + if (badcharmask != 0) { + // optimization opportunity: check for simple masks like those made of + // continuous 1s followed by continuous 0s. And masks containing a + // single bad character. + bufferptr += compress_block(&b, badcharmask, bufferptr); + } else if (bufferptr != buffer) { + copy_block(&b, bufferptr); + bufferptr += 64; + } else { + base64_decode_block(dst, &b); + dst += 48; + } + if (bufferptr >= (block_size - 1) * 64 + buffer) { + for (size_t i = 0; i < (block_size - 1); i++) { + base64_decode_block(dst, buffer + i * 64); + dst += 48; + } + std::memcpy(buffer, buffer + (block_size - 1) * 64, + 64); // 64 might be too much + bufferptr -= (block_size - 1) * 64; + } } + } - // We just fallback on UTF-16 code. This could be optimized/simplified - // further. - uint16x8_t in16 = vmovl_u8(vget_low_u8(in8)); - // 1. prepare 2-byte values - // input 8-bit word : [aabb|bbbb] x 8 - // expected output : [1100|00aa|10bb|bbbb] x 8 - const uint16x8_t v_1f00 = vmovq_n_u16((int16_t)0x1f00); - const uint16x8_t v_003f = vmovq_n_u16((int16_t)0x003f); - - // t0 = [0000|00aa|bbbb|bb00] - const uint16x8_t t0 = vshlq_n_u16(in16, 2); - // t1 = [0000|00aa|0000|0000] - const uint16x8_t t1 = vandq_u16(t0, v_1f00); - // t2 = [0000|0000|00bb|bbbb] - const uint16x8_t t2 = vandq_u16(in16, v_003f); - // t3 = [0000|00aa|00bb|bbbb] - const uint16x8_t t3 = vorrq_u16(t1, t2); - // t4 = [1100|00aa|10bb|bbbb] - const uint16x8_t t4 = vorrq_u16(t3, v_c080); - // 2. merge ASCII and 2-byte codewords - const uint16x8_t v_007f = vmovq_n_u16((uint16_t)0x007F); - const uint16x8_t one_byte_bytemask = vcleq_u16(in16, v_007f); - const uint8x16_t utf8_unpacked = - vreinterpretq_u8_u16(vbslq_u16(one_byte_bytemask, in16, t4)); - // 3. prepare bitmask for 8-bit lookup -#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO - const uint16x8_t mask = simdutf_make_uint16x8_t( - 0x0001, 0x0004, 0x0010, 0x0040, 0x0002, 0x0008, 0x0020, 0x0080); -#else - const uint16x8_t mask = {0x0001, 0x0004, 0x0010, 0x0040, - 0x0002, 0x0008, 0x0020, 0x0080}; -#endif - uint16_t m2 = vaddvq_u16(vandq_u16(one_byte_bytemask, mask)); - // 4. pack the bytes - const uint8_t *row = - &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[m2][0]; - const uint8x16_t shuffle = vld1q_u8(row + 1); - const uint8x16_t utf8_packed = vqtbl1q_u8(utf8_unpacked, shuffle); - - // 5. store bytes - vst1q_u8(utf8_output, utf8_packed); - // 6. adjust pointers - latin1_input += 8; - utf8_output += row[0]; - - } // while + int last_block_len = (int)(srcend - src); + if (last_block_len != 0) { + __mmask64 input_mask = ((__mmask64)1 << last_block_len) - 1; + block64 b; + load_block_partial(&b, src, input_mask); + uint64_t error = 0; + uint64_t badcharmask = + to_base64_mask(&b, &error, input_mask); + if (!ignore_garbage && error) { + size_t error_offset = _tzcnt_u64(error); + return {error_code::INVALID_BASE64_CHARACTER, + size_t(src - srcinit + error_offset), size_t(dst - dstinit)}; + } + src += last_block_len; + bufferptr += compress_block(&b, badcharmask, bufferptr); + } - return std::make_pair(latin1_input, reinterpret_cast(utf8_output)); -} -/* end file src/arm64/arm_convert_latin1_to_utf8.cpp */ + char *buffer_start = buffer; + for (; buffer_start + 64 <= bufferptr; buffer_start += 64) { + base64_decode_block(dst, buffer_start); + dst += 48; + } -/* begin file src/arm64/arm_convert_utf8_to_latin1.cpp */ -// Convert up to 16 bytes from utf8 to utf16 using a mask indicating the -// end of the code points. Only the least significant 12 bits of the mask -// are accessed. -// It returns how many bytes were consumed (up to 16, usually 12). -size_t convert_masked_utf8_to_latin1(const char *input, - uint64_t utf8_end_of_code_point_mask, - char *&latin1_output) { - // we use an approach where we try to process up to 12 input bytes. - // Why 12 input bytes and not 16? Because we are concerned with the size of - // the lookup tables. Also 12 is nicely divisible by two and three. - // - uint8x16_t in = vld1q_u8(reinterpret_cast(input)); - const uint16_t input_utf8_end_of_code_point_mask = - utf8_end_of_code_point_mask & 0xfff; - // - // Optimization note: our main path below is load-latency dependent. Thus it - // is maybe beneficial to have fast paths that depend on branch prediction but - // have less latency. This results in more instructions but, potentially, also - // higher speeds. + if ((bufferptr - buffer_start) != 0) { + size_t rem = (bufferptr - buffer_start); + int idx = rem % 4; + __mmask64 mask = ((__mmask64)1 << rem) - 1; + __m512i input = _mm512_maskz_loadu_epi8(mask, buffer_start); + size_t output_len = (rem / 4) * 3; + __mmask64 output_mask = mask >> (rem - output_len); + const __m512i merge_ab_and_bc = + _mm512_maddubs_epi16(input, _mm512_set1_epi32(0x01400140)); + const __m512i merged = + _mm512_madd_epi16(merge_ab_and_bc, _mm512_set1_epi32(0x00011000)); + const __m512i pack = _mm512_set_epi8( + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 61, 62, 56, 57, 58, + 52, 53, 54, 48, 49, 50, 44, 45, 46, 40, 41, 42, 36, 37, 38, 32, 33, 34, + 28, 29, 30, 24, 25, 26, 20, 21, 22, 16, 17, 18, 12, 13, 14, 8, 9, 10, 4, + 5, 6, 0, 1, 2); + const __m512i shuffled = _mm512_permutexvar_epi8(pack, merged); + + if (!ignore_garbage && + last_chunk_options == last_chunk_handling_options::strict && + (idx != 1) && ((idx + equalsigns) & 3) != 0) { + // The partial chunk was at src - idx + _mm512_mask_storeu_epi8((__m512i *)dst, output_mask, shuffled); + dst += output_len; + return {BASE64_INPUT_REMAINDER, size_t(src - srcinit), + size_t(dst - dstinit)}; + } else if (!ignore_garbage && + last_chunk_options == + last_chunk_handling_options::stop_before_partial && + (idx != 1) && ((idx + equalsigns) & 3) != 0) { + // Rewind src to before partial chunk + _mm512_mask_storeu_epi8((__m512i *)dst, output_mask, shuffled); + dst += output_len; + src -= idx; + } else { + if (idx == 2) { + if (!ignore_garbage && + last_chunk_options == last_chunk_handling_options::strict) { + uint32_t triple = (uint32_t(bufferptr[-2]) << 3 * 6) + + (uint32_t(bufferptr[-1]) << 2 * 6); + if (triple & 0xffff) { + _mm512_mask_storeu_epi8((__m512i *)dst, output_mask, shuffled); + dst += output_len; + return {BASE64_EXTRA_BITS, size_t(src - srcinit), + size_t(dst - dstinit)}; + } + } + output_mask = (output_mask << 1) | 1; + output_len += 1; + _mm512_mask_storeu_epi8((__m512i *)dst, output_mask, shuffled); + dst += output_len; + } else if (idx == 3) { + if (!ignore_garbage && + last_chunk_options == last_chunk_handling_options::strict) { + uint32_t triple = (uint32_t(bufferptr[-3]) << 3 * 6) + + (uint32_t(bufferptr[-2]) << 2 * 6) + + (uint32_t(bufferptr[-1]) << 1 * 6); + if (triple & 0xff) { + _mm512_mask_storeu_epi8((__m512i *)dst, output_mask, shuffled); + dst += output_len; + return {BASE64_EXTRA_BITS, size_t(src - srcinit), + size_t(dst - dstinit)}; + } + } + output_mask = (output_mask << 2) | 3; + output_len += 2; + _mm512_mask_storeu_epi8((__m512i *)dst, output_mask, shuffled); + dst += output_len; + } else if (!ignore_garbage && idx == 1) { + _mm512_mask_storeu_epi8((__m512i *)dst, output_mask, shuffled); + dst += output_len; + return {BASE64_INPUT_REMAINDER, size_t(src - srcinit), + size_t(dst - dstinit)}; + } else { + _mm512_mask_storeu_epi8((__m512i *)dst, output_mask, shuffled); + dst += output_len; + } + } - // We first try a few fast paths. - // The obvious first test is ASCII, which actually consumes the full 16. - if (utf8_end_of_code_point_mask == 0xfff) { - // We process in chunks of 12 bytes - vst1q_u8(reinterpret_cast(latin1_output), in); - latin1_output += 12; // We wrote 12 18-bit characters. - return 12; // We consumed 12 bytes. + if (!ignore_garbage && last_chunk_options != stop_before_partial && + equalsigns > 0) { + size_t output_count = size_t(dst - dstinit); + if ((output_count % 3 == 0) || + ((output_count % 3) + 1 + equalsigns != 4)) { + return {INVALID_BASE64_CHARACTER, equallocation, output_count}; + } + } + + return {SUCCESS, srclen, size_t(dst - dstinit)}; } - /// We do not have a fast path available, or the fast path is unimportant, so - /// we fallback. - const uint8_t idx = simdutf::tables::utf8_to_utf16::utf8bigindex - [input_utf8_end_of_code_point_mask][0]; - const uint8_t consumed = simdutf::tables::utf8_to_utf16::utf8bigindex - [input_utf8_end_of_code_point_mask][1]; - // this indicates an invalid input: - if (idx >= 64) { - return consumed; + if (!ignore_garbage && equalsigns > 0) { + if (last_chunk_options == last_chunk_handling_options::strict) { + return {BASE64_INPUT_REMAINDER, size_t(src - srcinit), + size_t(dst - dstinit)}; + } + if (last_chunk_options == + last_chunk_handling_options::stop_before_partial) { + return {SUCCESS, size_t(src - srcinit), size_t(dst - dstinit)}; + } + if ((size_t(dst - dstinit) % 3 == 0) || + ((size_t(dst - dstinit) % 3) + 1 + equalsigns != 4)) { + return {INVALID_BASE64_CHARACTER, equallocation, size_t(dst - dstinit)}; + } } - // Here we should have (idx < 64), if not, there is a bug in the validation or - // elsewhere. SIX (6) input code-code units this is a relatively easy scenario - // we process SIX (6) input code-code units. The max length in bytes of six - // code code units spanning between 1 and 2 bytes each is 12 bytes. Converts 6 - // 1-2 byte UTF-8 characters to 6 UTF-16 characters. This is a relatively easy - // scenario we process SIX (6) input code-code units. The max length in bytes - // of six code code units spanning between 1 and 2 bytes each is 12 bytes. - uint8x16_t sh = vld1q_u8(reinterpret_cast( - simdutf::tables::utf8_to_utf16::shufutf8[idx])); - // Shuffle - // 1 byte: 00000000 0bbbbbbb - // 2 byte: 110aaaaa 10bbbbbb - uint16x8_t perm = vreinterpretq_u16_u8(vqtbl1q_u8(in, sh)); - // Mask - // 1 byte: 00000000 0bbbbbbb - // 2 byte: 00000000 00bbbbbb - uint16x8_t ascii = vandq_u16(perm, vmovq_n_u16(0x7f)); // 6 or 7 bits - // 1 byte: 00000000 00000000 - // 2 byte: 000aaaaa 00000000 - uint16x8_t highbyte = vandq_u16(perm, vmovq_n_u16(0x1f00)); // 5 bits - // Combine with a shift right accumulate - // 1 byte: 00000000 0bbbbbbb - // 2 byte: 00000aaa aabbbbbb - uint16x8_t composed = vsraq_n_u16(ascii, highbyte, 2); - // writing 8 bytes even though we only care about the first 6 bytes. - uint8x8_t latin1_packed = vmovn_u16(composed); - vst1_u8(reinterpret_cast(latin1_output), latin1_packed); - latin1_output += 6; // We wrote 6 bytes. - return consumed; + return {SUCCESS, srclen, size_t(dst - dstinit)}; } -/* end file src/arm64/arm_convert_utf8_to_latin1.cpp */ -/* begin file src/arm64/arm_convert_utf8_to_utf16.cpp */ -// Convert up to 16 bytes from utf8 to utf16 using a mask indicating the -// end of the code points. Only the least significant 12 bits of the mask -// are accessed. -// It returns how many bytes were consumed (up to 16, usually 12). -template -size_t convert_masked_utf8_to_utf16(const char *input, - uint64_t utf8_end_of_code_point_mask, - char16_t *&utf16_output) { - // we use an approach where we try to process up to 12 input bytes. - // Why 12 input bytes and not 16? Because we are concerned with the size of - // the lookup tables. Also 12 is nicely divisible by two and three. - // - uint8x16_t in = vld1q_u8(reinterpret_cast(input)); - const uint16_t input_utf8_end_of_code_point_mask = - utf8_end_of_code_point_mask & 0xfff; - // - // Optimization note: our main path below is load-latency dependent. Thus it - // is maybe beneficial to have fast paths that depend on branch prediction but - // have less latency. This results in more instructions but, potentially, also - // higher speeds. +/* end file src/icelake/icelake_base64.inl.cpp */ - // We first try a few fast paths. - // The obvious first test is ASCII, which actually consumes the full 16. - if ((utf8_end_of_code_point_mask & 0xFFFF) == 0xffff) { - // We process in chunks of 16 bytes - // The routine in simd.h is reused. - simd8 temp{vreinterpretq_s8_u8(in)}; - temp.store_ascii_as_utf16(utf16_output); - utf16_output += 16; // We wrote 16 16-bit characters. - return 16; // We consumed 16 bytes. - } +#include - // 3 byte sequences are the next most common, as seen in CJK, which has long - // sequences of these. - if (input_utf8_end_of_code_point_mask == 0x924) { - // We want to take 4 3-byte UTF-8 code units and turn them into 4 2-byte - // UTF-16 code units. - uint16x4_t composed = convert_utf8_3_byte_to_utf16(in); - // Byte swap if necessary - if (!match_system(big_endian)) { - composed = vreinterpret_u16_u8(vrev16_u8(vreinterpret_u8_u16(composed))); +} // namespace +} // namespace icelake +} // namespace simdutf + +namespace simdutf { +namespace icelake { + +simdutf_warn_unused int +implementation::detect_encodings(const char *input, + size_t length) const noexcept { + // If there is a BOM, then we trust it. + auto bom_encoding = simdutf::BOM::check_bom(input, length); + // todo: convert to a one-pass algorithm + if (bom_encoding != encoding_type::unspecified) { + return bom_encoding; + } + int out = 0; + if (validate_utf8(input, length)) { + out |= encoding_type::UTF8; + } + if ((length % 2) == 0) { + if (validate_utf16le(reinterpret_cast(input), + length / 2)) { + out |= encoding_type::UTF16_LE; } - vst1_u16(reinterpret_cast(utf16_output), composed); - utf16_output += 4; // We wrote 4 16-bit characters. - return 12; // We consumed 12 bytes. } - - // 2 byte sequences occur in short bursts in languages like Greek and Russian. - if ((utf8_end_of_code_point_mask & 0xFFF) == 0xaaa) { - // We want to take 6 2-byte UTF-8 code units and turn them into 6 2-byte - // UTF-16 code units. - uint16x8_t composed = convert_utf8_2_byte_to_utf16(in); - // Byte swap if necessary - if (!match_system(big_endian)) { - composed = - vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(composed))); + if ((length % 4) == 0) { + if (validate_utf32(reinterpret_cast(input), length / 4)) { + out |= encoding_type::UTF32_LE; } - vst1q_u16(reinterpret_cast(utf16_output), composed); + } + return out; +} - utf16_output += 6; // We wrote 6 16-bit characters. - return 12; // We consumed 12 bytes. +simdutf_warn_unused bool +implementation::validate_utf8(const char *buf, size_t len) const noexcept { + if (simdutf_unlikely(len == 0)) { + return true; + } + avx512_utf8_checker checker{}; + const char *ptr = buf; + const char *end = ptr + len; + for (; end - ptr >= 64; ptr += 64) { + const __m512i utf8 = _mm512_loadu_si512((const __m512i *)ptr); + checker.check_next_input(utf8); + } + if (end != ptr) { + const __m512i utf8 = _mm512_maskz_loadu_epi8( + ~UINT64_C(0) >> (64 - (end - ptr)), (const __m512i *)ptr); + checker.check_next_input(utf8); } + checker.check_eof(); + return !checker.errors(); +} - /// We do not have a fast path available, or the fast path is unimportant, so - /// we fallback. - const uint8_t idx = simdutf::tables::utf8_to_utf16::utf8bigindex - [input_utf8_end_of_code_point_mask][0]; +simdutf_warn_unused result implementation::validate_utf8_with_errors( + const char *buf, size_t len) const noexcept { + if (simdutf_unlikely(len == 0)) { + return result(error_code::SUCCESS, len); + } + avx512_utf8_checker checker{}; + const char *ptr = buf; + const char *end = ptr + len; + size_t count{0}; + for (; end - ptr >= 64; ptr += 64) { + const __m512i utf8 = _mm512_loadu_si512((const __m512i *)ptr); + checker.check_next_input(utf8); + if (checker.errors()) { + if (count != 0) { + count--; + } // Sometimes the error is only detected in the next chunk + result res = scalar::utf8::rewind_and_validate_with_errors( + reinterpret_cast(buf), + reinterpret_cast(buf + count), len - count); + res.count += count; + return res; + } + count += 64; + } + if (end != ptr) { + const __m512i utf8 = _mm512_maskz_loadu_epi8( + ~UINT64_C(0) >> (64 - (end - ptr)), (const __m512i *)ptr); + checker.check_next_input(utf8); + } + checker.check_eof(); + if (checker.errors()) { + if (count != 0) { + count--; + } // Sometimes the error is only detected in the next chunk + result res = scalar::utf8::rewind_and_validate_with_errors( + reinterpret_cast(buf), + reinterpret_cast(buf + count), len - count); + res.count += count; + return res; + } + return result(error_code::SUCCESS, len); +} - const uint8_t consumed = simdutf::tables::utf8_to_utf16::utf8bigindex - [input_utf8_end_of_code_point_mask][1]; +simdutf_warn_unused bool +implementation::validate_ascii(const char *buf, size_t len) const noexcept { + return icelake::validate_ascii(buf, len); +} - if (idx < 64) { - // SIX (6) input code-code units - // Convert to UTF-16 - uint16x8_t composed = convert_utf8_1_to_2_byte_to_utf16(in, idx); - // Byte swap if necessary - if (!match_system(big_endian)) { - composed = - vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(composed))); +simdutf_warn_unused result implementation::validate_ascii_with_errors( + const char *buf, size_t len) const noexcept { + const char *buf_orig = buf; + const char *end = buf + len; + const __m512i ascii = _mm512_set1_epi8((uint8_t)0x80); + for (; end - buf >= 64; buf += 64) { + const __m512i input = _mm512_loadu_si512((const __m512i *)buf); + __mmask64 notascii = _mm512_cmp_epu8_mask(input, ascii, _MM_CMPINT_NLT); + if (notascii) { + return result(error_code::TOO_LARGE, + buf - buf_orig + _tzcnt_u64(notascii)); } - // Store - vst1q_u16(reinterpret_cast(utf16_output), composed); - utf16_output += 6; // We wrote 6 16-bit characters. - return consumed; - } else if (idx < 145) { - // FOUR (4) input code-code units - // UTF-16 and UTF-32 use similar algorithms, but UTF-32 skips the narrowing. - uint8x16_t sh = vld1q_u8(reinterpret_cast( - simdutf::tables::utf8_to_utf16::shufutf8[idx])); - // XXX: depending on the system scalar instructions might be faster. - // 1 byte: 00000000 00000000 0ccccccc - // 2 byte: 00000000 110bbbbb 10cccccc - // 3 byte: 1110aaaa 10bbbbbb 10cccccc - uint32x4_t perm = vreinterpretq_u32_u8(vqtbl1q_u8(in, sh)); - // 1 byte: 00000000 0ccccccc - // 2 byte: xx0bbbbb x0cccccc - // 3 byte: xxbbbbbb x0cccccc - uint16x4_t lowperm = vmovn_u32(perm); - // Partially mask with bic (doesn't require a temporary register unlike and) - // The shift left insert below will clear the top bits. - // 1 byte: 00000000 00000000 - // 2 byte: xx0bbbbb 00000000 - // 3 byte: xxbbbbbb 00000000 - uint16x4_t middlebyte = vbic_u16(lowperm, vmov_n_u16(uint16_t(~0xFF00))); - // ASCII - // 1 byte: 00000000 0ccccccc - // 2+byte: 00000000 00cccccc - uint16x4_t ascii = vand_u16(lowperm, vmov_n_u16(0x7F)); - // Split into narrow vectors. - // 2 byte: 00000000 00000000 - // 3 byte: 00000000 xxxxaaaa - uint16x4_t highperm = vshrn_n_u32(perm, 16); - // Shift right accumulate the middle byte - // 1 byte: 00000000 0ccccccc - // 2 byte: 00xx0bbb bbcccccc - // 3 byte: 00xxbbbb bbcccccc - uint16x4_t middlelow = vsra_n_u16(ascii, middlebyte, 2); - // Shift left and insert the top 4 bits, overwriting the garbage - // 1 byte: 00000000 0ccccccc - // 2 byte: 00000bbb bbcccccc - // 3 byte: aaaabbbb bbcccccc - uint16x4_t composed = vsli_n_u16(middlelow, highperm, 12); - // Byte swap if necessary - if (!match_system(big_endian)) { - composed = vreinterpret_u16_u8(vrev16_u8(vreinterpret_u8_u16(composed))); + } + if (end != buf) { + const __m512i input = _mm512_maskz_loadu_epi8( + ~UINT64_C(0) >> (64 - (end - buf)), (const __m512i *)buf); + __mmask64 notascii = _mm512_cmp_epu8_mask(input, ascii, _MM_CMPINT_NLT); + if (notascii) { + return result(error_code::TOO_LARGE, + buf - buf_orig + _tzcnt_u64(notascii)); } - vst1_u16(reinterpret_cast(utf16_output), composed); + } + return result(error_code::SUCCESS, len); +} - utf16_output += 4; // We wrote 4 16-bit codepoints - return consumed; - } else if (idx < 209) { - // THREE (3) input code-code units - if (input_utf8_end_of_code_point_mask == 0x888) { - // We want to take 3 4-byte UTF-8 code units and turn them into 3 4-byte - // UTF-16 pairs. Generating surrogate pairs is a little tricky though, but - // it is easier when we can assume they are all pairs. This version does - // not use the LUT, but 4 byte sequences are less common and the overhead - // of the extra memory access is less important than the early branch - // overhead in shorter sequences. +simdutf_warn_unused bool +implementation::validate_utf16le(const char16_t *buf, + size_t len) const noexcept { + const char16_t *end = buf + len; - // Swap byte pairs - // 10dddddd 10cccccc|10bbbbbb 11110aaa - // 10cccccc 10dddddd|11110aaa 10bbbbbb - uint8x16_t swap = vrev16q_u8(in); - // Shift left 2 bits - // cccccc00 dddddd00 xxxxxxxx bbbbbb00 - uint32x4_t shift = vreinterpretq_u32_u8(vshlq_n_u8(swap, 2)); - // Create a magic number containing the low 2 bits of the trail surrogate - // and all the corrections needed to create the pair. UTF-8 4b prefix = - // -0x0000|0xF000 surrogate offset = -0x0000|0x0040 (0x10000 << 6) - // surrogate high = +0x0000|0xD800 - // surrogate low = +0xDC00|0x0000 - // ------------------------------- - // = +0xDC00|0xE7C0 - uint32x4_t magic = vmovq_n_u32(0xDC00E7C0); - // Generate unadjusted trail surrogate minus lowest 2 bits - // xxxxxxxx xxxxxxxx|11110aaa bbbbbb00 - uint32x4_t trail = - vbslq_u32(vmovq_n_u32(0x0000FF00), vreinterpretq_u32_u8(swap), shift); - // Insert low 2 bits of trail surrogate to magic number for later - // 11011100 00000000 11100111 110000cc - uint16x8_t magic_with_low_2 = - vreinterpretq_u16_u32(vsraq_n_u32(magic, shift, 30)); - // Generate lead surrogate - // xxxxcccc ccdddddd|xxxxxxxx xxxxxxxx - uint32x4_t lead = vreinterpretq_u32_u16( - vsliq_n_u16(vreinterpretq_u16_u8(swap), vreinterpretq_u16_u8(in), 6)); - // Mask out lead - // 000000cc ccdddddd|xxxxxxxx xxxxxxxx - lead = vbicq_u32(lead, vmovq_n_u32(uint32_t(~0x03FFFFFF))); - // Blend pairs - // 000000cc ccdddddd|11110aaa bbbbbb00 - uint16x8_t blend = vreinterpretq_u16_u32( - vbslq_u32(vmovq_n_u32(0x0000FFFF), trail, lead)); - // Add magic number to finish the result - // 110111CC CCDDDDDD|110110AA BBBBBBCC - uint16x8_t composed = vaddq_u16(blend, magic_with_low_2); - // Byte swap if necessary - if (!match_system(big_endian)) { - composed = - vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(composed))); + for (; end - buf >= 32;) { + __m512i in = _mm512_loadu_si512((__m512i *)buf); + __m512i diff = _mm512_sub_epi16(in, _mm512_set1_epi16(uint16_t(0xD800))); + __mmask32 surrogates = + _mm512_cmplt_epu16_mask(diff, _mm512_set1_epi16(uint16_t(0x0800))); + if (surrogates) { + __mmask32 highsurrogates = + _mm512_cmplt_epu16_mask(diff, _mm512_set1_epi16(uint16_t(0x0400))); + __mmask32 lowsurrogates = surrogates ^ highsurrogates; + // high must be followed by low + if ((highsurrogates << 1) != lowsurrogates) { + return false; } - uint16_t buffer[8]; - vst1q_u16(reinterpret_cast(buffer), composed); - for (int k = 0; k < 6; k++) { - utf16_output[k] = buffer[k]; - } // the loop might compiler to a couple of instructions. - utf16_output += 6; // We wrote 3 32-bit surrogate pairs. - return 12; // We consumed 12 bytes. + bool ends_with_high = ((highsurrogates & 0x80000000) != 0); + if (ends_with_high) { + buf += 31; // advance only by 31 code units so that we start with the + // high surrogate on the next round. + } else { + buf += 32; + } + } else { + buf += 32; } - // 3 1-4 byte sequences - uint8x16_t sh = vld1q_u8(reinterpret_cast( - simdutf::tables::utf8_to_utf16::shufutf8[idx])); - - // 1 byte: 00000000 00000000 00000000 0ddddddd - // 3 byte: 00000000 00000000 110ccccc 10dddddd - // 3 byte: 00000000 1110bbbb 10cccccc 10dddddd - // 4 byte: 11110aaa 10bbbbbb 10cccccc 10dddddd - uint32x4_t perm = vreinterpretq_u32_u8(vqtbl1q_u8(in, sh)); - // added to fix issue https://github.com/simdutf/simdutf/issues/514 - // We only want to write 2 * 16-bit code units when that is actually what we - // have. Unfortunately, we cannot trust the input. So it is possible to get - // 0xff as an input byte and it should not result in a surrogate pair. We - // need to check for that. - uint32_t permbuffer[4]; - vst1q_u32(permbuffer, perm); - // Mask the low and middle bytes - // 00000000 00000000 00000000 0ddddddd - uint32x4_t ascii = vandq_u32(perm, vmovq_n_u32(0x7f)); - // Because the surrogates need more work, the high surrogate is computed - // first. - uint32x4_t middlehigh = vshlq_n_u32(perm, 2); - // 00000000 00000000 00cccccc 00000000 - uint32x4_t middlebyte = vandq_u32(perm, vmovq_n_u32(0x3F00)); - // Start assembling the sequence. Since the 4th byte is in the same position - // as it would be in a surrogate and there is no dependency, shift left - // instead of right. 3 byte: 00000000 10bbbbxx xxxxxxxx xxxxxxxx 4 byte: - // 11110aaa bbbbbbxx xxxxxxxx xxxxxxxx - uint32x4_t ab = vbslq_u32(vmovq_n_u32(0xFF000000), perm, middlehigh); - // Top 16 bits contains the high ten bits of the surrogate pair before - // correction 3 byte: 00000000 10bbbbcc|cccc0000 00000000 4 byte: 11110aaa - // bbbbbbcc|cccc0000 00000000 - high 10 bits correct w/o correction - uint32x4_t abc = - vbslq_u32(vmovq_n_u32(0xFFFC0000), ab, vshlq_n_u32(middlebyte, 4)); - // Combine the low 6 or 7 bits by a shift right accumulate - // 3 byte: 00000000 00000010|bbbbcccc ccdddddd - low 16 bits correct - // 4 byte: 00000011 110aaabb|bbbbcccc ccdddddd - low 10 bits correct w/o - // correction - uint32x4_t composed = vsraq_n_u32(ascii, abc, 6); - // After this is for surrogates - // Blend the low and high surrogates - // 4 byte: 11110aaa bbbbbbcc|bbbbcccc ccdddddd - uint32x4_t mixed = vbslq_u32(vmovq_n_u32(0xFFFF0000), abc, composed); - // Clear the upper 6 bits of the low surrogate. Don't clear the upper bits - // yet as 0x10000 was not subtracted from the codepoint yet. 4 byte: - // 11110aaa bbbbbbcc|000000cc ccdddddd - uint16x8_t masked_pair = vreinterpretq_u16_u32( - vbicq_u32(mixed, vmovq_n_u32(uint32_t(~0xFFFF03FF)))); - // Correct the remaining UTF-8 prefix, surrogate offset, and add the - // surrogate prefixes in one magic 16-bit addition. similar magic number but - // without the continue byte adjust and halfword swapped UTF-8 4b prefix = - // -0xF000|0x0000 surrogate offset = -0x0040|0x0000 (0x10000 << 6) - // surrogate high = +0xD800|0x0000 - // surrogate low = +0x0000|0xDC00 - // ----------------------------------- - // = +0xE7C0|0xDC00 - uint16x8_t magic = vreinterpretq_u16_u32(vmovq_n_u32(0xE7C0DC00)); - // 4 byte: 110110AA BBBBBBCC|110111CC CCDDDDDD - surrogate pair complete - uint32x4_t surrogates = - vreinterpretq_u32_u16(vaddq_u16(masked_pair, magic)); - // If the high bit is 1 (s32 less than zero), this needs a surrogate pair - uint32x4_t is_pair = vcltzq_s32(vreinterpretq_s32_u32(perm)); + } + if (buf < end) { + __m512i in = + _mm512_maskz_loadu_epi16((1U << (end - buf)) - 1, (__m512i *)buf); + __m512i diff = _mm512_sub_epi16(in, _mm512_set1_epi16(uint16_t(0xD800))); + __mmask32 surrogates = + _mm512_cmplt_epu16_mask(diff, _mm512_set1_epi16(uint16_t(0x0800))); + if (surrogates) { + __mmask32 highsurrogates = + _mm512_cmplt_epu16_mask(diff, _mm512_set1_epi16(uint16_t(0x0400))); + __mmask32 lowsurrogates = surrogates ^ highsurrogates; + // high must be followed by low + if ((highsurrogates << 1) != lowsurrogates) { + return false; + } + } + } + return true; +} - // Select either the 4 byte surrogate pair or the 2 byte solo codepoint - // 3 byte: 0xxxxxxx xxxxxxxx|bbbbcccc ccdddddd - // 4 byte: 110110AA BBBBBBCC|110111CC CCDDDDDD - uint32x4_t selected = vbslq_u32(is_pair, surrogates, composed); - // Byte swap if necessary - if (!match_system(big_endian)) { - selected = - vreinterpretq_u32_u8(vrev16q_u8(vreinterpretq_u8_u32(selected))); +simdutf_warn_unused bool +implementation::validate_utf16be(const char16_t *buf, + size_t len) const noexcept { + const char16_t *end = buf + len; + const __m512i byteflip = _mm512_setr_epi64( + 0x0607040502030001, 0x0e0f0c0d0a0b0809, 0x0607040502030001, + 0x0e0f0c0d0a0b0809, 0x0607040502030001, 0x0e0f0c0d0a0b0809, + 0x0607040502030001, 0x0e0f0c0d0a0b0809); + for (; end - buf >= 32;) { + __m512i in = + _mm512_shuffle_epi8(_mm512_loadu_si512((__m512i *)buf), byteflip); + __m512i diff = _mm512_sub_epi16(in, _mm512_set1_epi16(uint16_t(0xD800))); + __mmask32 surrogates = + _mm512_cmplt_epu16_mask(diff, _mm512_set1_epi16(uint16_t(0x0800))); + if (surrogates) { + __mmask32 highsurrogates = + _mm512_cmplt_epu16_mask(diff, _mm512_set1_epi16(uint16_t(0x0400))); + __mmask32 lowsurrogates = surrogates ^ highsurrogates; + // high must be followed by low + if ((highsurrogates << 1) != lowsurrogates) { + return false; + } + bool ends_with_high = ((highsurrogates & 0x80000000) != 0); + if (ends_with_high) { + buf += 31; // advance only by 31 code units so that we start with the + // high surrogate on the next round. + } else { + buf += 32; + } + } else { + buf += 32; + } + } + if (buf < end) { + __m512i in = _mm512_shuffle_epi8( + _mm512_maskz_loadu_epi16((1U << (end - buf)) - 1, (__m512i *)buf), + byteflip); + __m512i diff = _mm512_sub_epi16(in, _mm512_set1_epi16(uint16_t(0xD800))); + __mmask32 surrogates = + _mm512_cmplt_epu16_mask(diff, _mm512_set1_epi16(uint16_t(0x0800))); + if (surrogates) { + __mmask32 highsurrogates = + _mm512_cmplt_epu16_mask(diff, _mm512_set1_epi16(uint16_t(0x0400))); + __mmask32 lowsurrogates = surrogates ^ highsurrogates; + // high must be followed by low + if ((highsurrogates << 1) != lowsurrogates) { + return false; + } } - // Attempting to shuffle and store would be complex, just scalarize. - uint32_t buffer[4]; - vst1q_u32(buffer, selected); - // Test for the top bit of the surrogate mask. Remove due to issue 514 - // const uint32_t SURROGATE_MASK = match_system(big_endian) ? 0x80000000 : - // 0x00800000; - for (size_t i = 0; i < 3; i++) { - // Surrogate - // Used to be if (buffer[i] & SURROGATE_MASK) { - // See discussion above. - // patch for issue https://github.com/simdutf/simdutf/issues/514 - if ((permbuffer[i] & 0xf8000000) == 0xf0000000) { - utf16_output[0] = uint16_t(buffer[i] >> 16); - utf16_output[1] = uint16_t(buffer[i] & 0xFFFF); - utf16_output += 2; + } + return true; +} + +simdutf_warn_unused result implementation::validate_utf16le_with_errors( + const char16_t *buf, size_t len) const noexcept { + const char16_t *start_buf = buf; + const char16_t *end = buf + len; + for (; end - buf >= 32;) { + __m512i in = _mm512_loadu_si512((__m512i *)buf); + __m512i diff = _mm512_sub_epi16(in, _mm512_set1_epi16(uint16_t(0xD800))); + __mmask32 surrogates = + _mm512_cmplt_epu16_mask(diff, _mm512_set1_epi16(uint16_t(0x0800))); + if (surrogates) { + __mmask32 highsurrogates = + _mm512_cmplt_epu16_mask(diff, _mm512_set1_epi16(uint16_t(0x0400))); + __mmask32 lowsurrogates = surrogates ^ highsurrogates; + // high must be followed by low + if ((highsurrogates << 1) != lowsurrogates) { + uint32_t extra_low = _tzcnt_u32(lowsurrogates & ~(highsurrogates << 1)); + uint32_t extra_high = + _tzcnt_u32(highsurrogates & ~(lowsurrogates >> 1)); + return result(error_code::SURROGATE, + (buf - start_buf) + + (extra_low < extra_high ? extra_low : extra_high)); + } + bool ends_with_high = ((highsurrogates & 0x80000000) != 0); + if (ends_with_high) { + buf += 31; // advance only by 31 code units so that we start with the + // high surrogate on the next round. } else { - utf16_output[0] = uint16_t(buffer[i] & 0xFFFF); - utf16_output++; + buf += 32; + } + } else { + buf += 32; + } + } + if (buf < end) { + __m512i in = + _mm512_maskz_loadu_epi16((1U << (end - buf)) - 1, (__m512i *)buf); + __m512i diff = _mm512_sub_epi16(in, _mm512_set1_epi16(uint16_t(0xD800))); + __mmask32 surrogates = + _mm512_cmplt_epu16_mask(diff, _mm512_set1_epi16(uint16_t(0x0800))); + if (surrogates) { + __mmask32 highsurrogates = + _mm512_cmplt_epu16_mask(diff, _mm512_set1_epi16(uint16_t(0x0400))); + __mmask32 lowsurrogates = surrogates ^ highsurrogates; + // high must be followed by low + if ((highsurrogates << 1) != lowsurrogates) { + uint32_t extra_low = _tzcnt_u32(lowsurrogates & ~(highsurrogates << 1)); + uint32_t extra_high = + _tzcnt_u32(highsurrogates & ~(lowsurrogates >> 1)); + return result(error_code::SURROGATE, + (buf - start_buf) + + (extra_low < extra_high ? extra_low : extra_high)); } } - return consumed; - } else { - // here we know that there is an error but we do not handle errors - return 12; } + return result(error_code::SUCCESS, len); } -/* end file src/arm64/arm_convert_utf8_to_utf16.cpp */ -/* begin file src/arm64/arm_convert_utf8_to_utf32.cpp */ -// Convert up to 12 bytes from utf8 to utf32 using a mask indicating the -// end of the code points. Only the least significant 12 bits of the mask -// are accessed. -// It returns how many bytes were consumed (up to 12). -size_t convert_masked_utf8_to_utf32(const char *input, - uint64_t utf8_end_of_code_point_mask, - char32_t *&utf32_out) { - // we use an approach where we try to process up to 12 input bytes. - // Why 12 input bytes and not 16? Because we are concerned with the size of - // the lookup tables. Also 12 is nicely divisible by two and three. - // - uint32_t *&utf32_output = reinterpret_cast(utf32_out); - uint8x16_t in = vld1q_u8(reinterpret_cast(input)); - const uint16_t input_utf8_end_of_code_point_mask = - utf8_end_of_code_point_mask & 0xFFF; - // - // Optimization note: our main path below is load-latency dependent. Thus it - // is maybe beneficial to have fast paths that depend on branch prediction but - // have less latency. This results in more instructions but, potentially, also - // higher speeds. - // - // We first try a few fast paths. - if (utf8_end_of_code_point_mask == 0xfff) { - // We process in chunks of 12 bytes. - // use fast implementation in src/simdutf/arm64/simd.h - // Ideally the compiler can keep the tables in registers. - simd8 temp{vreinterpretq_s8_u8(in)}; - temp.store_ascii_as_utf32_tbl(utf32_out); - utf32_output += 12; // We wrote 12 32-bit characters. - return 12; // We consumed 12 bytes. + +simdutf_warn_unused result implementation::validate_utf16be_with_errors( + const char16_t *buf, size_t len) const noexcept { + const char16_t *start_buf = buf; + const char16_t *end = buf + len; + const __m512i byteflip = _mm512_setr_epi64( + 0x0607040502030001, 0x0e0f0c0d0a0b0809, 0x0607040502030001, + 0x0e0f0c0d0a0b0809, 0x0607040502030001, 0x0e0f0c0d0a0b0809, + 0x0607040502030001, 0x0e0f0c0d0a0b0809); + for (; end - buf >= 32;) { + __m512i in = + _mm512_shuffle_epi8(_mm512_loadu_si512((__m512i *)buf), byteflip); + __m512i diff = _mm512_sub_epi16(in, _mm512_set1_epi16(uint16_t(0xD800))); + __mmask32 surrogates = + _mm512_cmplt_epu16_mask(diff, _mm512_set1_epi16(uint16_t(0x0800))); + if (surrogates) { + __mmask32 highsurrogates = + _mm512_cmplt_epu16_mask(diff, _mm512_set1_epi16(uint16_t(0x0400))); + __mmask32 lowsurrogates = surrogates ^ highsurrogates; + // high must be followed by low + if ((highsurrogates << 1) != lowsurrogates) { + uint32_t extra_low = _tzcnt_u32(lowsurrogates & ~(highsurrogates << 1)); + uint32_t extra_high = + _tzcnt_u32(highsurrogates & ~(lowsurrogates >> 1)); + return result(error_code::SURROGATE, + (buf - start_buf) + + (extra_low < extra_high ? extra_low : extra_high)); + } + bool ends_with_high = ((highsurrogates & 0x80000000) != 0); + if (ends_with_high) { + buf += 31; // advance only by 31 code units so that we start with the + // high surrogate on the next round. + } else { + buf += 32; + } + } else { + buf += 32; + } } - if (input_utf8_end_of_code_point_mask == 0x924) { - // We want to take 4 3-byte UTF-8 code units and turn them into 4 4-byte - // UTF-32 code units. Convert to UTF-16 - uint16x4_t composed_utf16 = convert_utf8_3_byte_to_utf16(in); - // Zero extend and store via ST2 with a zero. - uint16x4x2_t interleaver = {{composed_utf16, vmov_n_u16(0)}}; - vst2_u16(reinterpret_cast(utf32_output), interleaver); - utf32_output += 4; // We wrote 4 32-bit characters. - return 12; // We consumed 12 bytes. + if (buf < end) { + __m512i in = _mm512_shuffle_epi8( + _mm512_maskz_loadu_epi16((1U << (end - buf)) - 1, (__m512i *)buf), + byteflip); + __m512i diff = _mm512_sub_epi16(in, _mm512_set1_epi16(uint16_t(0xD800))); + __mmask32 surrogates = + _mm512_cmplt_epu16_mask(diff, _mm512_set1_epi16(uint16_t(0x0800))); + if (surrogates) { + __mmask32 highsurrogates = + _mm512_cmplt_epu16_mask(diff, _mm512_set1_epi16(uint16_t(0x0400))); + __mmask32 lowsurrogates = surrogates ^ highsurrogates; + // high must be followed by low + if ((highsurrogates << 1) != lowsurrogates) { + uint32_t extra_low = _tzcnt_u32(lowsurrogates & ~(highsurrogates << 1)); + uint32_t extra_high = + _tzcnt_u32(highsurrogates & ~(lowsurrogates >> 1)); + return result(error_code::SURROGATE, + (buf - start_buf) + + (extra_low < extra_high ? extra_low : extra_high)); + } + } } + return result(error_code::SUCCESS, len); +} - // 2 byte sequences occur in short bursts in languages like Greek and Russian. - if (input_utf8_end_of_code_point_mask == 0xaaa) { - // We want to take 6 2-byte UTF-8 code units and turn them into 6 4-byte - // UTF-32 code units. Convert to UTF-16 - uint16x8_t composed_utf16 = convert_utf8_2_byte_to_utf16(in); - // Zero extend and store via ST2 with a zero. - uint16x8x2_t interleaver = {{composed_utf16, vmovq_n_u16(0)}}; - vst2q_u16(reinterpret_cast(utf32_output), interleaver); - utf32_output += 6; // We wrote 6 32-bit characters. - return 12; // We consumed 12 bytes. +simdutf_warn_unused bool +implementation::validate_utf32(const char32_t *buf, size_t len) const noexcept { + const char32_t *tail = icelake::validate_utf32(buf, len); + if (tail) { + return scalar::utf32::validate(tail, len - (tail - buf)); + } else { + // we come here if there was an error, or buf was nullptr which may happen + // for empty input. + return len == 0; } - /// Either no fast path or an unimportant fast path. +} - const uint8_t idx = simdutf::tables::utf8_to_utf16::utf8bigindex - [input_utf8_end_of_code_point_mask][0]; - const uint8_t consumed = simdutf::tables::utf8_to_utf16::utf8bigindex - [input_utf8_end_of_code_point_mask][1]; +simdutf_warn_unused result implementation::validate_utf32_with_errors( + const char32_t *buf, size_t len) const noexcept { + const char32_t *buf_orig = buf; + if (len >= 16) { + const char32_t *end = buf + len - 16; + while (buf <= end) { + __m512i utf32 = _mm512_loadu_si512((const __m512i *)buf); + __mmask16 outside_range = _mm512_cmp_epu32_mask( + utf32, _mm512_set1_epi32(0x10ffff), _MM_CMPINT_GT); - if (idx < 64) { - // SIX (6) input code-code units - // Convert to UTF-16 - uint16x8_t composed_utf16 = convert_utf8_1_to_2_byte_to_utf16(in, idx); - // Zero extend and store with ST2 and zero - uint16x8x2_t interleaver = {{composed_utf16, vmovq_n_u16(0)}}; - vst2q_u16(reinterpret_cast(utf32_output), interleaver); - utf32_output += 6; // We wrote 6 32-bit characters. - return consumed; - } else if (idx < 145) { - // FOUR (4) input code-code units - // UTF-16 and UTF-32 use similar algorithms, but UTF-32 skips the narrowing. - uint8x16_t sh = vld1q_u8(reinterpret_cast( - simdutf::tables::utf8_to_utf16::shufutf8[idx])); - // Shuffle - // 1 byte: 00000000 00000000 0ccccccc - // 2 byte: 00000000 110bbbbb 10cccccc - // 3 byte: 1110aaaa 10bbbbbb 10cccccc - uint32x4_t perm = vreinterpretq_u32_u8(vqtbl1q_u8(in, sh)); - // Split - // 00000000 00000000 0ccccccc - uint32x4_t ascii = vandq_u32(perm, vmovq_n_u32(0x7F)); // 6 or 7 bits - // Note: unmasked - // xxxxxxxx aaaaxxxx xxxxxxxx - uint32x4_t high = vshrq_n_u32(perm, 4); // 4 bits - // Use 16 bit bic instead of and. - // The top bits will be corrected later in the bsl - // 00000000 10bbbbbb 00000000 - uint32x4_t middle = vreinterpretq_u32_u16( - vbicq_u16(vreinterpretq_u16_u32(perm), - vmovq_n_u16(uint16_t(~0xff00)))); // 5 or 6 bits - // Combine low and middle with shift right accumulate - // 00000000 00xxbbbb bbcccccc - uint32x4_t lowmid = vsraq_n_u32(ascii, middle, 2); - // Insert top 4 bits from high byte with bitwise select - // 00000000 aaaabbbb bbcccccc - uint32x4_t composed = vbslq_u32(vmovq_n_u32(0x0000F000), high, lowmid); - vst1q_u32(utf32_output, composed); - utf32_output += 4; // We wrote 4 32-bit characters. - return consumed; - } else if (idx < 209) { - // THREE (3) input code-code units - if (input_utf8_end_of_code_point_mask == 0x888) { - // We want to take 3 4-byte UTF-8 code units and turn them into 3 4-byte - // UTF-32 code units. This uses the same method as the fixed 3 byte - // version, reversing and shift left insert. However, there is no need for - // a shuffle mask now, just rev16 and rev32. - // - // This version does not use the LUT, but 4 byte sequences are less common - // and the overhead of the extra memory access is less important than the - // early branch overhead in shorter sequences, so it comes last. + __m512i utf32_off = + _mm512_add_epi32(utf32, _mm512_set1_epi32(0xffff2000)); - // Swap pairs of bytes - // 10dddddd|10cccccc|10bbbbbb|11110aaa - // 10cccccc 10dddddd|11110aaa 10bbbbbb - uint16x8_t swap1 = vreinterpretq_u16_u8(vrev16q_u8(in)); - // Shift left and insert - // xxxxcccc ccdddddd|xxxxxxxa aabbbbbb - uint16x8_t merge1 = vsliq_n_u16(swap1, vreinterpretq_u16_u8(in), 6); - // Swap 16-bit lanes - // xxxxcccc ccdddddd xxxxxxxa aabbbbbb - // xxxxxxxa aabbbbbb xxxxcccc ccdddddd - uint32x4_t swap2 = vreinterpretq_u32_u16(vrev32q_u16(merge1)); - // Shift insert again - // xxxxxxxx xxxaaabb bbbbcccc ccdddddd - uint32x4_t merge2 = vsliq_n_u32(swap2, vreinterpretq_u32_u16(merge1), 12); - // Clear the garbage - // 00000000 000aaabb bbbbcccc ccdddddd - uint32x4_t composed = vandq_u32(merge2, vmovq_n_u32(0x1FFFFF)); - // Store - vst1q_u32(utf32_output, composed); + __mmask16 surrogate_range = _mm512_cmp_epu32_mask( + utf32_off, _mm512_set1_epi32(0xfffff7ff), _MM_CMPINT_GT); + if ((outside_range | surrogate_range)) { + auto outside_idx = _tzcnt_u32(outside_range); + auto surrogate_idx = _tzcnt_u32(surrogate_range); - utf32_output += 3; // We wrote 3 32-bit characters. - return 12; // We consumed 12 bytes. + if (outside_idx < surrogate_idx) { + return result(error_code::TOO_LARGE, buf - buf_orig + outside_idx); + } + + return result(error_code::SURROGATE, buf - buf_orig + surrogate_idx); + } + + buf += 16; } - // Unlike UTF-16, doing a fast codepath doesn't have nearly as much benefit - // due to surrogates no longer being involved. - uint8x16_t sh = vld1q_u8(reinterpret_cast( - simdutf::tables::utf8_to_utf16::shufutf8[idx])); - // 1 byte: 00000000 00000000 00000000 0ddddddd - // 2 byte: 00000000 00000000 110ccccc 10dddddd - // 3 byte: 00000000 1110bbbb 10cccccc 10dddddd - // 4 byte: 11110aaa 10bbbbbb 10cccccc 10dddddd - uint32x4_t perm = vreinterpretq_u32_u8(vqtbl1q_u8(in, sh)); - // Ascii - uint32x4_t ascii = vandq_u32(perm, vmovq_n_u32(0x7F)); - uint32x4_t middle = vandq_u32(perm, vmovq_n_u32(0x3f00)); - // When converting the way we do, the 3 byte prefix will be interpreted as - // the 18th bit being set, since the code would interpret the lead byte - // (0b1110bbbb) as a continuation byte (0b10bbbbbb). To fix this, we can - // either xor or do an 8 bit add of the 6th bit shifted right by 1. Since - // NEON has shift right accumulate, we use that. - // 4 byte 3 byte - // 10bbbbbb 1110bbbb - // 00000000 01000000 6th bit - // 00000000 00100000 shift right - // 10bbbbbb 0000bbbb add - // 00bbbbbb 0000bbbb mask - uint8x16_t correction = - vreinterpretq_u8_u32(vandq_u32(perm, vmovq_n_u32(0x00400000))); - uint32x4_t corrected = vreinterpretq_u32_u8( - vsraq_n_u8(vreinterpretq_u8_u32(perm), correction, 1)); - // 00000000 00000000 0000cccc ccdddddd - uint32x4_t cd = vsraq_n_u32(ascii, middle, 2); - // Insert twice - // xxxxxxxx xxxaaabb bbbbxxxx xxxxxxxx - uint32x4_t ab = vbslq_u32(vmovq_n_u32(0x01C0000), vshrq_n_u32(corrected, 6), - vshrq_n_u32(corrected, 4)); - // 00000000 000aaabb bbbbcccc ccdddddd - uint32x4_t composed = vbslq_u32(vmovq_n_u32(0xFFE00FFF), cd, ab); - // Store - vst1q_u32(utf32_output, composed); - utf32_output += 3; // We wrote 3 32-bit characters. - return consumed; - } else { - // here we know that there is an error but we do not handle errors - return 12; } -} -/* end file src/arm64/arm_convert_utf8_to_utf32.cpp */ + if (len > 0) { + __m512i utf32 = _mm512_maskz_loadu_epi32( + __mmask16((1U << (buf_orig + len - buf)) - 1), (const __m512i *)buf); + __mmask16 outside_range = _mm512_cmp_epu32_mask( + utf32, _mm512_set1_epi32(0x10ffff), _MM_CMPINT_GT); + __m512i utf32_off = _mm512_add_epi32(utf32, _mm512_set1_epi32(0xffff2000)); -/* begin file src/arm64/arm_convert_utf16_to_latin1.cpp */ + __mmask16 surrogate_range = _mm512_cmp_epu32_mask( + utf32_off, _mm512_set1_epi32(0xfffff7ff), _MM_CMPINT_GT); + if ((outside_range | surrogate_range)) { + auto outside_idx = _tzcnt_u32(outside_range); + auto surrogate_idx = _tzcnt_u32(surrogate_range); -template -std::pair -arm_convert_utf16_to_latin1(const char16_t *buf, size_t len, - char *latin1_output) { - const char16_t *end = buf + len; - while (end - buf >= 8) { - uint16x8_t in = vld1q_u16(reinterpret_cast(buf)); - if (!match_system(big_endian)) { - in = vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(in))); - } - if (vmaxvq_u16(in) <= 0xff) { - // 1. pack the bytes - uint8x8_t latin1_packed = vmovn_u16(in); - // 2. store (8 bytes) - vst1_u8(reinterpret_cast(latin1_output), latin1_packed); - // 3. adjust pointers - buf += 8; - latin1_output += 8; - } else { - return std::make_pair(nullptr, reinterpret_cast(latin1_output)); + if (outside_idx < surrogate_idx) { + return result(error_code::TOO_LARGE, buf - buf_orig + outside_idx); + } + + return result(error_code::SURROGATE, buf - buf_orig + surrogate_idx); } - } // while - return std::make_pair(buf, latin1_output); + } + + return result(error_code::SUCCESS, len); } -template -std::pair -arm_convert_utf16_to_latin1_with_errors(const char16_t *buf, size_t len, - char *latin1_output) { - const char16_t *start = buf; - const char16_t *end = buf + len; - while (end - buf >= 8) { - uint16x8_t in = vld1q_u16(reinterpret_cast(buf)); - if (!match_system(big_endian)) { - in = vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(in))); - } - if (vmaxvq_u16(in) <= 0xff) { - // 1. pack the bytes - uint8x8_t latin1_packed = vmovn_u16(in); - // 2. store (8 bytes) - vst1_u8(reinterpret_cast(latin1_output), latin1_packed); - // 3. adjust pointers - buf += 8; - latin1_output += 8; - } else { - // Let us do a scalar fallback. - for (int k = 0; k < 8; k++) { - uint16_t word = !match_system(big_endian) - ? scalar::utf16::swap_bytes(buf[k]) - : buf[k]; - if (word <= 0xff) { - *latin1_output++ = char(word); - } else { - return std::make_pair(result(error_code::TOO_LARGE, buf - start + k), - latin1_output); - } - } +simdutf_warn_unused size_t implementation::convert_latin1_to_utf8( + const char *buf, size_t len, char *utf8_output) const noexcept { + return icelake::latin1_to_utf8_avx512_start(buf, len, utf8_output); +} + +simdutf_warn_unused size_t implementation::convert_latin1_to_utf16le( + const char *buf, size_t len, char16_t *utf16_output) const noexcept { + return icelake_convert_latin1_to_utf16(buf, len, + utf16_output); +} + +simdutf_warn_unused size_t implementation::convert_latin1_to_utf16be( + const char *buf, size_t len, char16_t *utf16_output) const noexcept { + return icelake_convert_latin1_to_utf16(buf, len, + utf16_output); +} + +simdutf_warn_unused size_t implementation::convert_latin1_to_utf32( + const char *buf, size_t len, char32_t *utf32_output) const noexcept { + std::pair ret = + avx512_convert_latin1_to_utf32(buf, len, utf32_output); + if (ret.first == nullptr) { + return 0; + } + size_t converted_chars = ret.second - utf32_output; + if (ret.first != buf + len) { + const size_t scalar_converted_chars = scalar::latin1_to_utf32::convert( + ret.first, len - (ret.first - buf), ret.second); + if (scalar_converted_chars == 0) { + return 0; } - } // while - return std::make_pair(result(error_code::SUCCESS, buf - start), - latin1_output); + converted_chars += scalar_converted_chars; + } + return converted_chars; } -/* end file src/arm64/arm_convert_utf16_to_latin1.cpp */ -/* begin file src/arm64/arm_convert_utf16_to_utf32.cpp */ -/* - The vectorized algorithm works on single SSE register i.e., it - loads eight 16-bit code units. - We consider three cases: - 1. an input register contains no surrogates and each value - is in range 0x0000 .. 0x07ff. - 2. an input register contains no surrogates and values are - is in range 0x0000 .. 0xffff. - 3. an input register contains surrogates --- i.e. codepoints - can have 16 or 32 bits. +simdutf_warn_unused size_t implementation::convert_utf8_to_latin1( + const char *buf, size_t len, char *latin1_output) const noexcept { + return icelake::utf8_to_latin1_avx512(buf, len, latin1_output); +} - Ad 1. +simdutf_warn_unused result implementation::convert_utf8_to_latin1_with_errors( + const char *buf, size_t len, char *latin1_output) const noexcept { + // First, try to convert as much as possible using the SIMD implementation. + const char *obuf = buf; + char *olatin1_output = latin1_output; + size_t written = icelake::utf8_to_latin1_avx512(obuf, len, olatin1_output); - When values are less than 0x0800, it means that a 16-bit code unit - can be converted into: 1) single UTF8 byte (when it is an ASCII - char) or 2) two UTF8 bytes. + // If we have completely converted the string + if (obuf == buf + len) { + return {simdutf::SUCCESS, written}; + } + size_t pos = obuf - buf; + result res = scalar::utf8_to_latin1::rewind_and_convert_with_errors( + pos, buf + pos, len - pos, latin1_output); + res.count += pos; + return res; +} - For this case we do only some shuffle to obtain these 2-byte - codes and finally compress the whole SSE register with a single - shuffle. +simdutf_warn_unused size_t implementation::convert_valid_utf8_to_latin1( + const char *buf, size_t len, char *latin1_output) const noexcept { + return icelake::valid_utf8_to_latin1_avx512(buf, len, latin1_output); +} - We need 256-entry lookup table to get a compression pattern - and the number of output bytes in the compressed vector register. - Each entry occupies 17 bytes. +simdutf_warn_unused size_t implementation::convert_utf8_to_utf16le( + const char *buf, size_t len, char16_t *utf16_output) const noexcept { + utf8_to_utf16_result ret = + fast_avx512_convert_utf8_to_utf16(buf, len, + utf16_output); + if (ret.second == nullptr) { + return 0; + } + return ret.second - utf16_output; +} - Ad 2. +simdutf_warn_unused size_t implementation::convert_utf8_to_utf16be( + const char *buf, size_t len, char16_t *utf16_output) const noexcept { + utf8_to_utf16_result ret = fast_avx512_convert_utf8_to_utf16( + buf, len, utf16_output); + if (ret.second == nullptr) { + return 0; + } + return ret.second - utf16_output; +} - When values fit in 16-bit code units, but are above 0x07ff, then - a single word may produce one, two or three UTF8 bytes. +simdutf_warn_unused result implementation::convert_utf8_to_utf16le_with_errors( + const char *buf, size_t len, char16_t *utf16_output) const noexcept { + return fast_avx512_convert_utf8_to_utf16_with_errors( + buf, len, utf16_output); +} - We prepare data for all these three cases in two registers. - The first register contains lower two UTF8 bytes (used in all - cases), while the second one contains just the third byte for - the three-UTF8-bytes case. +simdutf_warn_unused result implementation::convert_utf8_to_utf16be_with_errors( + const char *buf, size_t len, char16_t *utf16_output) const noexcept { + return fast_avx512_convert_utf8_to_utf16_with_errors( + buf, len, utf16_output); +} - Finally these two registers are interleaved forming eight-element - array of 32-bit values. The array spans two SSE registers. - The bytes from the registers are compressed using two shuffles. +simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf16le( + const char *buf, size_t len, char16_t *utf16_output) const noexcept { + utf8_to_utf16_result ret = + icelake::valid_utf8_to_fixed_length( + buf, len, utf16_output); + size_t saved_bytes = ret.second - utf16_output; + const char *end = buf + len; + if (ret.first == end) { + return saved_bytes; + } - We need 256-entry lookup table to get a compression pattern - and the number of output bytes in the compressed vector register. - Each entry occupies 17 bytes. + // Note: AVX512 procedure looks up 4 bytes forward, and + // correctly converts multi-byte chars even if their + // continuation bytes lie outsiede 16-byte window. + // It meas, we have to skip continuation bytes from + // the beginning ret.first, as they were already consumed. + while (ret.first != end && ((uint8_t(*ret.first) & 0xc0) == 0x80)) { + ret.first += 1; + } + if (ret.first != end) { + const size_t scalar_saved_bytes = + scalar::utf8_to_utf16::convert_valid( + ret.first, len - (ret.first - buf), ret.second); + if (scalar_saved_bytes == 0) { + return 0; + } + saved_bytes += scalar_saved_bytes; + } - To summarize: - - We need two 256-entry tables that have 8704 bytes in total. -*/ -/* - Returns a pair: the first unprocessed byte from buf and utf8_output - A scalar routing should carry on the conversion of the tail. -*/ -template -std::pair -arm_convert_utf16_to_utf32(const char16_t *buf, size_t len, - char32_t *utf32_out) { - uint32_t *utf32_output = reinterpret_cast(utf32_out); - const char16_t *end = buf + len; + return saved_bytes; +} - const uint16x8_t v_f800 = vmovq_n_u16((uint16_t)0xf800); - const uint16x8_t v_d800 = vmovq_n_u16((uint16_t)0xd800); +simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf16be( + const char *buf, size_t len, char16_t *utf16_output) const noexcept { + utf8_to_utf16_result ret = + icelake::valid_utf8_to_fixed_length( + buf, len, utf16_output); + size_t saved_bytes = ret.second - utf16_output; + const char *end = buf + len; + if (ret.first == end) { + return saved_bytes; + } - while (end - buf >= 8) { - uint16x8_t in = vld1q_u16(reinterpret_cast(buf)); - if (!match_system(big_endian)) { - in = vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(in))); - } + // Note: AVX512 procedure looks up 4 bytes forward, and + // correctly converts multi-byte chars even if their + // continuation bytes lie outsiede 16-byte window. + // It meas, we have to skip continuation bytes from + // the beginning ret.first, as they were already consumed. + while (ret.first != end && ((uint8_t(*ret.first) & 0xc0) == 0x80)) { + ret.first += 1; + } - const uint16x8_t surrogates_bytemask = - vceqq_u16(vandq_u16(in, v_f800), v_d800); - // It might seem like checking for surrogates_bitmask == 0xc000 could help. - // However, it is likely an uncommon occurrence. - if (vmaxvq_u16(surrogates_bytemask) == 0) { - // case: no surrogate pairs, extend all 16-bit code units to 32-bit code - // units - vst1q_u32(utf32_output, vmovl_u16(vget_low_u16(in))); - vst1q_u32(utf32_output + 4, vmovl_high_u16(in)); - utf32_output += 8; - buf += 8; - // surrogate pair(s) in a register - } else { - // Let us do a scalar fallback. - // It may seem wasteful to use scalar code, but being efficient with SIMD - // in the presence of surrogate pairs may require non-trivial tables. - size_t forward = 15; - size_t k = 0; - if (size_t(end - buf) < forward + 1) { - forward = size_t(end - buf - 1); - } - for (; k < forward; k++) { - uint16_t word = !match_system(big_endian) - ? scalar::utf16::swap_bytes(buf[k]) - : buf[k]; - if ((word & 0xF800) != 0xD800) { - *utf32_output++ = char32_t(word); - } else { - // must be a surrogate pair - uint16_t diff = uint16_t(word - 0xD800); - uint16_t next_word = !match_system(big_endian) - ? scalar::utf16::swap_bytes(buf[k + 1]) - : buf[k + 1]; - k++; - uint16_t diff2 = uint16_t(next_word - 0xDC00); - if ((diff | diff2) > 0x3FF) { - return std::make_pair(nullptr, - reinterpret_cast(utf32_output)); - } - uint32_t value = (diff << 10) + diff2 + 0x10000; - *utf32_output++ = char32_t(value); - } - } - buf += k; + if (ret.first != end) { + const size_t scalar_saved_bytes = + scalar::utf8_to_utf16::convert_valid( + ret.first, len - (ret.first - buf), ret.second); + if (scalar_saved_bytes == 0) { + return 0; } - } // while - return std::make_pair(buf, reinterpret_cast(utf32_output)); + saved_bytes += scalar_saved_bytes; + } + + return saved_bytes; } -/* - Returns a pair: a result struct and utf8_output. - If there is an error, the count field of the result is the position of the - error. Otherwise, it is the position of the first unprocessed byte in buf - (even if finished). A scalar routing should carry on the conversion of the - tail if needed. -*/ -template -std::pair -arm_convert_utf16_to_utf32_with_errors(const char16_t *buf, size_t len, - char32_t *utf32_out) { +simdutf_warn_unused size_t implementation::convert_utf8_to_utf32( + const char *buf, size_t len, char32_t *utf32_out) const noexcept { uint32_t *utf32_output = reinterpret_cast(utf32_out); - const char16_t *start = buf; - const char16_t *end = buf + len; + utf8_to_utf32_result ret = + icelake::validating_utf8_to_fixed_length( + buf, len, utf32_output); + if (ret.second == nullptr) + return 0; - const uint16x8_t v_f800 = vmovq_n_u16((uint16_t)0xf800); - const uint16x8_t v_d800 = vmovq_n_u16((uint16_t)0xd800); + size_t saved_bytes = ret.second - utf32_output; + const char *end = buf + len; + if (ret.first == end) { + return saved_bytes; + } - while ((end - buf) >= 8) { - uint16x8_t in = vld1q_u16(reinterpret_cast(buf)); - if (!match_system(big_endian)) { - in = vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(in))); + // Note: the AVX512 procedure looks up 4 bytes forward, and + // correctly converts multi-byte chars even if their + // continuation bytes lie outside 16-byte window. + // It means, we have to skip continuation bytes from + // the beginning ret.first, as they were already consumed. + while (ret.first != end && ((uint8_t(*ret.first) & 0xc0) == 0x80)) { + ret.first += 1; + } + if (ret.first != end) { + const size_t scalar_saved_bytes = scalar::utf8_to_utf32::convert( + ret.first, len - (ret.first - buf), utf32_out + saved_bytes); + if (scalar_saved_bytes == 0) { + return 0; } + saved_bytes += scalar_saved_bytes; + } - const uint16x8_t surrogates_bytemask = - vceqq_u16(vandq_u16(in, v_f800), v_d800); - // It might seem like checking for surrogates_bitmask == 0xc000 could help. - // However, it is likely an uncommon occurrence. - if (vmaxvq_u16(surrogates_bytemask) == 0) { - // case: no surrogate pairs, extend all 16-bit code units to 32-bit code - // units - vst1q_u32(utf32_output, vmovl_u16(vget_low_u16(in))); - vst1q_u32(utf32_output + 4, vmovl_high_u16(in)); - utf32_output += 8; - buf += 8; - // surrogate pair(s) in a register - } else { - // Let us do a scalar fallback. - // It may seem wasteful to use scalar code, but being efficient with SIMD - // in the presence of surrogate pairs may require non-trivial tables. - size_t forward = 15; - size_t k = 0; - if (size_t(end - buf) < forward + 1) { - forward = size_t(end - buf - 1); - } - for (; k < forward; k++) { - uint16_t word = !match_system(big_endian) - ? scalar::utf16::swap_bytes(buf[k]) - : buf[k]; - if ((word & 0xF800) != 0xD800) { - *utf32_output++ = char32_t(word); - } else { - // must be a surrogate pair - uint16_t diff = uint16_t(word - 0xD800); - uint16_t next_word = !match_system(big_endian) - ? scalar::utf16::swap_bytes(buf[k + 1]) - : buf[k + 1]; - k++; - uint16_t diff2 = uint16_t(next_word - 0xDC00); - if ((diff | diff2) > 0x3FF) { - return std::make_pair( - result(error_code::SURROGATE, buf - start + k - 1), - reinterpret_cast(utf32_output)); - } - uint32_t value = (diff << 10) + diff2 + 0x10000; - *utf32_output++ = char32_t(value); - } + return saved_bytes; +} + +simdutf_warn_unused result implementation::convert_utf8_to_utf32_with_errors( + const char *buf, size_t len, char32_t *utf32) const noexcept { + if (simdutf_unlikely(len == 0)) { + return {error_code::SUCCESS, 0}; + } + uint32_t *utf32_output = reinterpret_cast(utf32); + auto ret = icelake::validating_utf8_to_fixed_length_with_constant_checks< + endianness::LITTLE, uint32_t>(buf, len, utf32_output); + + if (!std::get<2>(ret)) { + size_t pos = std::get<0>(ret) - buf; + // We might have an error that occurs right before pos. + // This is only a concern if buf[pos] is not a continuation byte. + if ((buf[pos] & 0xc0) != 0x80 && pos >= 64) { + pos -= 1; + } else if ((buf[pos] & 0xc0) == 0x80 && pos >= 64) { + // We must check whether we are the fourth continuation byte + bool c1 = (buf[pos - 1] & 0xc0) == 0x80; + bool c2 = (buf[pos - 2] & 0xc0) == 0x80; + bool c3 = (buf[pos - 3] & 0xc0) == 0x80; + if (c1 && c2 && c3) { + return {simdutf::TOO_LONG, pos}; } - buf += k; } - } // while - return std::make_pair(result(error_code::SUCCESS, buf - start), - reinterpret_cast(utf32_output)); -} -/* end file src/arm64/arm_convert_utf16_to_utf32.cpp */ -/* begin file src/arm64/arm_convert_utf16_to_utf8.cpp */ -/* - The vectorized algorithm works on single SSE register i.e., it - loads eight 16-bit code units. + // todo: we reset the output to utf32 instead of using std::get<2.(ret) as + // you'd expect. that is because + // validating_utf8_to_fixed_length_with_constant_checks may have processed + // data beyond the error. + result res = scalar::utf8_to_utf32::rewind_and_convert_with_errors( + pos, buf + pos, len - pos, utf32); + res.count += pos; + return res; + } + size_t saved_bytes = std::get<1>(ret) - utf32_output; + const char *end = buf + len; + if (std::get<0>(ret) == end) { + return {simdutf::SUCCESS, saved_bytes}; + } - We consider three cases: - 1. an input register contains no surrogates and each value - is in range 0x0000 .. 0x07ff. - 2. an input register contains no surrogates and values are - is in range 0x0000 .. 0xffff. - 3. an input register contains surrogates --- i.e. codepoints - can have 16 or 32 bits. + // Note: the AVX512 procedure looks up 4 bytes forward, and + // correctly converts multi-byte chars even if their + // continuation bytes lie outside 16-byte window. + // It means, we have to skip continuation bytes from + // the beginning ret.first, as they were already consumed. + while (std::get<0>(ret) != end and + ((uint8_t(*std::get<0>(ret)) & 0xc0) == 0x80)) { + std::get<0>(ret) += 1; + } - Ad 1. + if (std::get<0>(ret) != end) { + auto scalar_result = scalar::utf8_to_utf32::convert_with_errors( + std::get<0>(ret), len - (std::get<0>(ret) - buf), + reinterpret_cast(utf32_output) + saved_bytes); + if (scalar_result.error != simdutf::SUCCESS) { + scalar_result.count += (std::get<0>(ret) - buf); + } else { + scalar_result.count += saved_bytes; + } + return scalar_result; + } - When values are less than 0x0800, it means that a 16-bit code unit - can be converted into: 1) single UTF8 byte (when it is an ASCII - char) or 2) two UTF8 bytes. + return {simdutf::SUCCESS, size_t(std::get<1>(ret) - utf32_output)}; +} - For this case we do only some shuffle to obtain these 2-byte - codes and finally compress the whole SSE register with a single - shuffle. +simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf32( + const char *buf, size_t len, char32_t *utf32_out) const noexcept { + uint32_t *utf32_output = reinterpret_cast(utf32_out); + utf8_to_utf32_result ret = + icelake::valid_utf8_to_fixed_length( + buf, len, utf32_output); + size_t saved_bytes = ret.second - utf32_output; + const char *end = buf + len; + if (ret.first == end) { + return saved_bytes; + } - We need 256-entry lookup table to get a compression pattern - and the number of output bytes in the compressed vector register. - Each entry occupies 17 bytes. + // Note: AVX512 procedure looks up 4 bytes forward, and + // correctly converts multi-byte chars even if their + // continuation bytes lie outsiede 16-byte window. + // It meas, we have to skip continuation bytes from + // the beginning ret.first, as they were already consumed. + while (ret.first != end && ((uint8_t(*ret.first) & 0xc0) == 0x80)) { + ret.first += 1; + } - Ad 2. + if (ret.first != end) { + const size_t scalar_saved_bytes = scalar::utf8_to_utf32::convert_valid( + ret.first, len - (ret.first - buf), utf32_out + saved_bytes); + if (scalar_saved_bytes == 0) { + return 0; + } + saved_bytes += scalar_saved_bytes; + } - When values fit in 16-bit code units, but are above 0x07ff, then - a single word may produce one, two or three UTF8 bytes. + return saved_bytes; +} - We prepare data for all these three cases in two registers. - The first register contains lower two UTF8 bytes (used in all - cases), while the second one contains just the third byte for - the three-UTF8-bytes case. +simdutf_warn_unused size_t implementation::convert_utf16le_to_latin1( + const char16_t *buf, size_t len, char *latin1_output) const noexcept { + return icelake_convert_utf16_to_latin1(buf, len, + latin1_output); +} - Finally these two registers are interleaved forming eight-element - array of 32-bit values. The array spans two SSE registers. - The bytes from the registers are compressed using two shuffles. +simdutf_warn_unused size_t implementation::convert_utf16be_to_latin1( + const char16_t *buf, size_t len, char *latin1_output) const noexcept { + return icelake_convert_utf16_to_latin1(buf, len, + latin1_output); +} - We need 256-entry lookup table to get a compression pattern - and the number of output bytes in the compressed vector register. - Each entry occupies 17 bytes. +simdutf_warn_unused result +implementation::convert_utf16le_to_latin1_with_errors( + const char16_t *buf, size_t len, char *latin1_output) const noexcept { + return icelake_convert_utf16_to_latin1_with_errors( + buf, len, latin1_output) + .first; +} +simdutf_warn_unused result +implementation::convert_utf16be_to_latin1_with_errors( + const char16_t *buf, size_t len, char *latin1_output) const noexcept { + return icelake_convert_utf16_to_latin1_with_errors( + buf, len, latin1_output) + .first; +} - To summarize: - - We need two 256-entry tables that have 8704 bytes in total. -*/ -/* - Returns a pair: the first unprocessed byte from buf and utf8_output - A scalar routing should carry on the conversion of the tail. -*/ -template -std::pair -arm_convert_utf16_to_utf8(const char16_t *buf, size_t len, char *utf8_out) { - uint8_t *utf8_output = reinterpret_cast(utf8_out); - const char16_t *end = buf + len; +simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_latin1( + const char16_t *buf, size_t len, char *latin1_output) const noexcept { + // optimization opportunity: implement custom function + return convert_utf16be_to_latin1(buf, len, latin1_output); +} - const uint16x8_t v_f800 = vmovq_n_u16((uint16_t)0xf800); - const uint16x8_t v_d800 = vmovq_n_u16((uint16_t)0xd800); - const uint16x8_t v_c080 = vmovq_n_u16((uint16_t)0xc080); - const size_t safety_margin = - 12; // to avoid overruns, see issue - // https://github.com/simdutf/simdutf/issues/92 - while (end - buf >= std::ptrdiff_t(16 + safety_margin)) { - uint16x8_t in = vld1q_u16(reinterpret_cast(buf)); - if (!match_system(big_endian)) { - in = vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(in))); - } - if (vmaxvq_u16(in) <= 0x7F) { // ASCII fast path!!!! - // It is common enough that we have sequences of 16 consecutive ASCII - // characters. - uint16x8_t nextin = - vld1q_u16(reinterpret_cast(buf) + 8); - if (!match_system(big_endian)) { - nextin = vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(nextin))); - } - if (vmaxvq_u16(nextin) > 0x7F) { - // 1. pack the bytes - // obviously suboptimal. - uint8x8_t utf8_packed = vmovn_u16(in); - // 2. store (8 bytes) - vst1_u8(utf8_output, utf8_packed); - // 3. adjust pointers - buf += 8; - utf8_output += 8; - in = nextin; - } else { - // 1. pack the bytes - // obviously suboptimal. - uint8x16_t utf8_packed = vmovn_high_u16(vmovn_u16(in), nextin); - // 2. store (16 bytes) - vst1q_u8(utf8_output, utf8_packed); - // 3. adjust pointers - buf += 16; - utf8_output += 16; - continue; // we are done for this round! - } - } +simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_latin1( + const char16_t *buf, size_t len, char *latin1_output) const noexcept { + // optimization opportunity: implement custom function + return convert_utf16le_to_latin1(buf, len, latin1_output); +} - if (vmaxvq_u16(in) <= 0x7FF) { - // 1. prepare 2-byte values - // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8 - // expected output : [110a|aaaa|10bb|bbbb] x 8 - const uint16x8_t v_1f00 = vmovq_n_u16((int16_t)0x1f00); - const uint16x8_t v_003f = vmovq_n_u16((int16_t)0x003f); +simdutf_warn_unused size_t implementation::convert_utf16le_to_utf8( + const char16_t *buf, size_t len, char *utf8_output) const noexcept { + size_t outlen; + size_t inlen = utf16_to_utf8_avx512i( + buf, len, (unsigned char *)utf8_output, &outlen); + if (inlen != len) { + return 0; + } + return outlen; +} - // t0 = [000a|aaaa|bbbb|bb00] - const uint16x8_t t0 = vshlq_n_u16(in, 2); - // t1 = [000a|aaaa|0000|0000] - const uint16x8_t t1 = vandq_u16(t0, v_1f00); - // t2 = [0000|0000|00bb|bbbb] - const uint16x8_t t2 = vandq_u16(in, v_003f); - // t3 = [000a|aaaa|00bb|bbbb] - const uint16x8_t t3 = vorrq_u16(t1, t2); - // t4 = [110a|aaaa|10bb|bbbb] - const uint16x8_t t4 = vorrq_u16(t3, v_c080); - // 2. merge ASCII and 2-byte codewords - const uint16x8_t v_007f = vmovq_n_u16((uint16_t)0x007F); - const uint16x8_t one_byte_bytemask = vcleq_u16(in, v_007f); - const uint8x16_t utf8_unpacked = - vreinterpretq_u8_u16(vbslq_u16(one_byte_bytemask, in, t4)); - // 3. prepare bitmask for 8-bit lookup -#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO - const uint16x8_t mask = simdutf_make_uint16x8_t( - 0x0001, 0x0004, 0x0010, 0x0040, 0x0002, 0x0008, 0x0020, 0x0080); -#else - const uint16x8_t mask = {0x0001, 0x0004, 0x0010, 0x0040, - 0x0002, 0x0008, 0x0020, 0x0080}; -#endif - uint16_t m2 = vaddvq_u16(vandq_u16(one_byte_bytemask, mask)); - // 4. pack the bytes - const uint8_t *row = - &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[m2][0]; - const uint8x16_t shuffle = vld1q_u8(row + 1); - const uint8x16_t utf8_packed = vqtbl1q_u8(utf8_unpacked, shuffle); +simdutf_warn_unused size_t implementation::convert_utf16be_to_utf8( + const char16_t *buf, size_t len, char *utf8_output) const noexcept { + size_t outlen; + size_t inlen = utf16_to_utf8_avx512i( + buf, len, (unsigned char *)utf8_output, &outlen); + if (inlen != len) { + return 0; + } + return outlen; +} - // 5. store bytes - vst1q_u8(utf8_output, utf8_packed); +simdutf_warn_unused result implementation::convert_utf16le_to_utf8_with_errors( + const char16_t *buf, size_t len, char *utf8_output) const noexcept { + size_t outlen; + size_t inlen = utf16_to_utf8_avx512i( + buf, len, (unsigned char *)utf8_output, &outlen); + if (inlen != len) { + result res = scalar::utf16_to_utf8::convert_with_errors( + buf + inlen, len - inlen, utf8_output + outlen); + res.count += inlen; + return res; + } + return {simdutf::SUCCESS, outlen}; +} - // 6. adjust pointers - buf += 8; - utf8_output += row[0]; - continue; - } - const uint16x8_t surrogates_bytemask = - vceqq_u16(vandq_u16(in, v_f800), v_d800); - // It might seem like checking for surrogates_bitmask == 0xc000 could help. - // However, it is likely an uncommon occurrence. - if (vmaxvq_u16(surrogates_bytemask) == 0) { - // case: code units from register produce either 1, 2 or 3 UTF-8 bytes -#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO - const uint16x8_t dup_even = simdutf_make_uint16x8_t( - 0x0000, 0x0202, 0x0404, 0x0606, 0x0808, 0x0a0a, 0x0c0c, 0x0e0e); -#else - const uint16x8_t dup_even = {0x0000, 0x0202, 0x0404, 0x0606, - 0x0808, 0x0a0a, 0x0c0c, 0x0e0e}; -#endif - /* In this branch we handle three cases: - 1. [0000|0000|0ccc|cccc] => [0ccc|cccc] - - single UFT-8 byte - 2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc] - two - UTF-8 bytes - 3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - - three UTF-8 bytes +simdutf_warn_unused result implementation::convert_utf16be_to_utf8_with_errors( + const char16_t *buf, size_t len, char *utf8_output) const noexcept { + size_t outlen; + size_t inlen = utf16_to_utf8_avx512i( + buf, len, (unsigned char *)utf8_output, &outlen); + if (inlen != len) { + result res = scalar::utf16_to_utf8::convert_with_errors( + buf + inlen, len - inlen, utf8_output + outlen); + res.count += inlen; + return res; + } + return {simdutf::SUCCESS, outlen}; +} - We expand the input word (16-bit) into two code units (32-bit), thus - we have room for four bytes. However, we need five distinct bit - layouts. Note that the last byte in cases #2 and #3 is the same. +simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_utf8( + const char16_t *buf, size_t len, char *utf8_output) const noexcept { + return convert_utf16le_to_utf8(buf, len, utf8_output); +} - We precompute byte 1 for case #1 and the common byte for cases #2 & #3 - in register t2. +simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_utf8( + const char16_t *buf, size_t len, char *utf8_output) const noexcept { + return convert_utf16be_to_utf8(buf, len, utf8_output); +} - We precompute byte 1 for case #3 and -- **conditionally** -- precompute - either byte 1 for case #2 or byte 2 for case #3. Note that they - differ by exactly one bit. +simdutf_warn_unused size_t implementation::convert_utf32_to_latin1( + const char32_t *buf, size_t len, char *latin1_output) const noexcept { + return icelake_convert_utf32_to_latin1(buf, len, latin1_output); +} - Finally from these two code units we build proper UTF-8 sequence, taking - into account the case (i.e, the number of bytes to write). - */ - /** - * Given [aaaa|bbbb|bbcc|cccc] our goal is to produce: - * t2 => [0ccc|cccc] [10cc|cccc] - * s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb]) - */ -#define simdutf_vec(x) vmovq_n_u16(static_cast(x)) - // [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc] - const uint16x8_t t0 = vreinterpretq_u16_u8( - vqtbl1q_u8(vreinterpretq_u8_u16(in), vreinterpretq_u8_u16(dup_even))); - // [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc] - const uint16x8_t t1 = vandq_u16(t0, simdutf_vec(0b0011111101111111)); - // [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc] - const uint16x8_t t2 = vorrq_u16(t1, simdutf_vec(0b1000000000000000)); +simdutf_warn_unused result implementation::convert_utf32_to_latin1_with_errors( + const char32_t *buf, size_t len, char *latin1_output) const noexcept { + return icelake_convert_utf32_to_latin1_with_errors(buf, len, latin1_output) + .first; +} - // s0: [aaaa|bbbb|bbcc|cccc] => [0000|0000|0000|aaaa] - const uint16x8_t s0 = vshrq_n_u16(in, 12); - // s1: [aaaa|bbbb|bbcc|cccc] => [0000|bbbb|bb00|0000] - const uint16x8_t s1 = vandq_u16(in, simdutf_vec(0b0000111111000000)); - // [0000|bbbb|bb00|0000] => [00bb|bbbb|0000|0000] - const uint16x8_t s1s = vshlq_n_u16(s1, 2); - // [00bb|bbbb|0000|aaaa] - const uint16x8_t s2 = vorrq_u16(s0, s1s); - // s3: [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa] - const uint16x8_t s3 = vorrq_u16(s2, simdutf_vec(0b1100000011100000)); - const uint16x8_t v_07ff = vmovq_n_u16((uint16_t)0x07FF); - const uint16x8_t one_or_two_bytes_bytemask = vcleq_u16(in, v_07ff); - const uint16x8_t m0 = - vbicq_u16(simdutf_vec(0b0100000000000000), one_or_two_bytes_bytemask); - const uint16x8_t s4 = veorq_u16(s3, m0); -#undef simdutf_vec +simdutf_warn_unused size_t implementation::convert_valid_utf32_to_latin1( + const char32_t *buf, size_t len, char *latin1_output) const noexcept { + return icelake_convert_utf32_to_latin1(buf, len, latin1_output); +} - // 4. expand code units 16-bit => 32-bit - const uint8x16_t out0 = vreinterpretq_u8_u16(vzip1q_u16(t2, s4)); - const uint8x16_t out1 = vreinterpretq_u8_u16(vzip2q_u16(t2, s4)); +simdutf_warn_unused size_t implementation::convert_utf32_to_utf8( + const char32_t *buf, size_t len, char *utf8_output) const noexcept { + std::pair ret = + avx512_convert_utf32_to_utf8(buf, len, utf8_output); + if (ret.first == nullptr) { + return 0; + } + size_t saved_bytes = ret.second - utf8_output; + if (ret.first != buf + len) { + const size_t scalar_saved_bytes = scalar::utf32_to_utf8::convert( + ret.first, len - (ret.first - buf), ret.second); + if (scalar_saved_bytes == 0) { + return 0; + } + saved_bytes += scalar_saved_bytes; + } + return saved_bytes; +} - // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle - const uint16x8_t v_007f = vmovq_n_u16((uint16_t)0x007F); - const uint16x8_t one_byte_bytemask = vcleq_u16(in, v_007f); -#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO - const uint16x8_t onemask = simdutf_make_uint16x8_t( - 0x0001, 0x0004, 0x0010, 0x0040, 0x0100, 0x0400, 0x1000, 0x4000); - const uint16x8_t twomask = simdutf_make_uint16x8_t( - 0x0002, 0x0008, 0x0020, 0x0080, 0x0200, 0x0800, 0x2000, 0x8000); -#else - const uint16x8_t onemask = {0x0001, 0x0004, 0x0010, 0x0040, - 0x0100, 0x0400, 0x1000, 0x4000}; - const uint16x8_t twomask = {0x0002, 0x0008, 0x0020, 0x0080, - 0x0200, 0x0800, 0x2000, 0x8000}; -#endif - const uint16x8_t combined = - vorrq_u16(vandq_u16(one_byte_bytemask, onemask), - vandq_u16(one_or_two_bytes_bytemask, twomask)); - const uint16_t mask = vaddvq_u16(combined); - // The following fast path may or may not be beneficial. - /*if(mask == 0) { - // We only have three-byte code units. Use fast path. - const uint8x16_t shuffle = {2,3,1,6,7,5,10,11,9,14,15,13,0,0,0,0}; - const uint8x16_t utf8_0 = vqtbl1q_u8(out0, shuffle); - const uint8x16_t utf8_1 = vqtbl1q_u8(out1, shuffle); - vst1q_u8(utf8_output, utf8_0); - utf8_output += 12; - vst1q_u8(utf8_output, utf8_1); - utf8_output += 12; - buf += 8; - continue; - }*/ - const uint8_t mask0 = uint8_t(mask); +simdutf_warn_unused result implementation::convert_utf32_to_utf8_with_errors( + const char32_t *buf, size_t len, char *utf8_output) const noexcept { + // ret.first.count is always the position in the buffer, not the number of + // code units written even if finished + std::pair ret = + icelake::avx512_convert_utf32_to_utf8_with_errors(buf, len, utf8_output); + if (ret.first.count != len) { + result scalar_res = scalar::utf32_to_utf8::convert_with_errors( + buf + ret.first.count, len - ret.first.count, ret.second); + if (scalar_res.error) { + scalar_res.count += ret.first.count; + return scalar_res; + } else { + ret.second += scalar_res.count; + } + } + ret.first.count = + ret.second - + utf8_output; // Set count to the number of 8-bit code units written + return ret.first; +} - const uint8_t *row0 = - &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask0][0]; - const uint8x16_t shuffle0 = vld1q_u8(row0 + 1); - const uint8x16_t utf8_0 = vqtbl1q_u8(out0, shuffle0); +simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf8( + const char32_t *buf, size_t len, char *utf8_output) const noexcept { + return convert_utf32_to_utf8(buf, len, utf8_output); +} - const uint8_t mask1 = static_cast(mask >> 8); - const uint8_t *row1 = - &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask1][0]; - const uint8x16_t shuffle1 = vld1q_u8(row1 + 1); - const uint8x16_t utf8_1 = vqtbl1q_u8(out1, shuffle1); +simdutf_warn_unused size_t implementation::convert_utf32_to_utf16le( + const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { + std::pair ret = + avx512_convert_utf32_to_utf16(buf, len, utf16_output); + if (ret.first == nullptr) { + return 0; + } + size_t saved_bytes = ret.second - utf16_output; + if (ret.first != buf + len) { + const size_t scalar_saved_bytes = + scalar::utf32_to_utf16::convert( + ret.first, len - (ret.first - buf), ret.second); + if (scalar_saved_bytes == 0) { + return 0; + } + saved_bytes += scalar_saved_bytes; + } + return saved_bytes; +} - vst1q_u8(utf8_output, utf8_0); - utf8_output += row0[0]; - vst1q_u8(utf8_output, utf8_1); - utf8_output += row1[0]; +simdutf_warn_unused size_t implementation::convert_utf32_to_utf16be( + const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { + std::pair ret = + avx512_convert_utf32_to_utf16(buf, len, utf16_output); + if (ret.first == nullptr) { + return 0; + } + size_t saved_bytes = ret.second - utf16_output; + if (ret.first != buf + len) { + const size_t scalar_saved_bytes = + scalar::utf32_to_utf16::convert( + ret.first, len - (ret.first - buf), ret.second); + if (scalar_saved_bytes == 0) { + return 0; + } + saved_bytes += scalar_saved_bytes; + } + return saved_bytes; +} - buf += 8; - // surrogate pair(s) in a register +simdutf_warn_unused result implementation::convert_utf32_to_utf16le_with_errors( + const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { + // ret.first.count is always the position in the buffer, not the number of + // code units written even if finished + std::pair ret = + avx512_convert_utf32_to_utf16_with_errors( + buf, len, utf16_output); + if (ret.first.count != len) { + result scalar_res = + scalar::utf32_to_utf16::convert_with_errors( + buf + ret.first.count, len - ret.first.count, ret.second); + if (scalar_res.error) { + scalar_res.count += ret.first.count; + return scalar_res; } else { - // Let us do a scalar fallback. - // It may seem wasteful to use scalar code, but being efficient with SIMD - // in the presence of surrogate pairs may require non-trivial tables. - size_t forward = 15; - size_t k = 0; - if (size_t(end - buf) < forward + 1) { - forward = size_t(end - buf - 1); - } - for (; k < forward; k++) { - uint16_t word = !match_system(big_endian) - ? scalar::utf16::swap_bytes(buf[k]) - : buf[k]; - if ((word & 0xFF80) == 0) { - *utf8_output++ = char(word); - } else if ((word & 0xF800) == 0) { - *utf8_output++ = char((word >> 6) | 0b11000000); - *utf8_output++ = char((word & 0b111111) | 0b10000000); - } else if ((word & 0xF800) != 0xD800) { - *utf8_output++ = char((word >> 12) | 0b11100000); - *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); - *utf8_output++ = char((word & 0b111111) | 0b10000000); - } else { - // must be a surrogate pair - uint16_t diff = uint16_t(word - 0xD800); - uint16_t next_word = !match_system(big_endian) - ? scalar::utf16::swap_bytes(buf[k + 1]) - : buf[k + 1]; - k++; - uint16_t diff2 = uint16_t(next_word - 0xDC00); - if ((diff | diff2) > 0x3FF) { - return std::make_pair(nullptr, - reinterpret_cast(utf8_output)); - } - uint32_t value = (diff << 10) + diff2 + 0x10000; - *utf8_output++ = char((value >> 18) | 0b11110000); - *utf8_output++ = char(((value >> 12) & 0b111111) | 0b10000000); - *utf8_output++ = char(((value >> 6) & 0b111111) | 0b10000000); - *utf8_output++ = char((value & 0b111111) | 0b10000000); - } - } - buf += k; + ret.second += scalar_res.count; } - } // while + } + ret.first.count = + ret.second - + utf16_output; // Set count to the number of 8-bit code units written + return ret.first; +} - return std::make_pair(buf, reinterpret_cast(utf8_output)); +simdutf_warn_unused result implementation::convert_utf32_to_utf16be_with_errors( + const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { + // ret.first.count is always the position in the buffer, not the number of + // code units written even if finished + std::pair ret = + avx512_convert_utf32_to_utf16_with_errors(buf, len, + utf16_output); + if (ret.first.count != len) { + result scalar_res = + scalar::utf32_to_utf16::convert_with_errors( + buf + ret.first.count, len - ret.first.count, ret.second); + if (scalar_res.error) { + scalar_res.count += ret.first.count; + return scalar_res; + } else { + ret.second += scalar_res.count; + } + } + ret.first.count = + ret.second - + utf16_output; // Set count to the number of 8-bit code units written + return ret.first; } -/* - Returns a pair: a result struct and utf8_output. - If there is an error, the count field of the result is the position of the - error. Otherwise, it is the position of the first unprocessed byte in buf - (even if finished). A scalar routing should carry on the conversion of the - tail if needed. -*/ -template -std::pair -arm_convert_utf16_to_utf8_with_errors(const char16_t *buf, size_t len, - char *utf8_out) { - uint8_t *utf8_output = reinterpret_cast(utf8_out); - const char16_t *start = buf; - const char16_t *end = buf + len; +simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf16le( + const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { + return convert_utf32_to_utf16le(buf, len, utf16_output); +} - const uint16x8_t v_f800 = vmovq_n_u16((uint16_t)0xf800); - const uint16x8_t v_d800 = vmovq_n_u16((uint16_t)0xd800); - const uint16x8_t v_c080 = vmovq_n_u16((uint16_t)0xc080); - const size_t safety_margin = - 12; // to avoid overruns, see issue - // https://github.com/simdutf/simdutf/issues/92 +simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf16be( + const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { + return convert_utf32_to_utf16be(buf, len, utf16_output); +} - while (end - buf >= std::ptrdiff_t(16 + safety_margin)) { - uint16x8_t in = vld1q_u16(reinterpret_cast(buf)); - if (!match_system(big_endian)) { - in = vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(in))); - } - if (vmaxvq_u16(in) <= 0x7F) { // ASCII fast path!!!! - // It is common enough that we have sequences of 16 consecutive ASCII - // characters. - uint16x8_t nextin = - vld1q_u16(reinterpret_cast(buf) + 8); - if (!match_system(big_endian)) { - nextin = vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(nextin))); - } - if (vmaxvq_u16(nextin) > 0x7F) { - // 1. pack the bytes - // obviously suboptimal. - uint8x8_t utf8_packed = vmovn_u16(in); - // 2. store (8 bytes) - vst1_u8(utf8_output, utf8_packed); - // 3. adjust pointers - buf += 8; - utf8_output += 8; - in = nextin; - } else { - // 1. pack the bytes - // obviously suboptimal. - uint8x16_t utf8_packed = vmovn_high_u16(vmovn_u16(in), nextin); - // 2. store (16 bytes) - vst1q_u8(utf8_output, utf8_packed); - // 3. adjust pointers - buf += 16; - utf8_output += 16; - continue; // we are done for this round! - } +simdutf_warn_unused size_t implementation::convert_utf16le_to_utf32( + const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { + std::tuple ret = + icelake::convert_utf16_to_utf32(buf, len, + utf32_output); + if (!std::get<2>(ret)) { + return 0; + } + size_t saved_bytes = std::get<1>(ret) - utf32_output; + if (std::get<0>(ret) != buf + len) { + const size_t scalar_saved_bytes = + scalar::utf16_to_utf32::convert( + std::get<0>(ret), len - (std::get<0>(ret) - buf), std::get<1>(ret)); + if (scalar_saved_bytes == 0) { + return 0; } + saved_bytes += scalar_saved_bytes; + } + return saved_bytes; +} - if (vmaxvq_u16(in) <= 0x7FF) { - // 1. prepare 2-byte values - // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8 - // expected output : [110a|aaaa|10bb|bbbb] x 8 - const uint16x8_t v_1f00 = vmovq_n_u16((int16_t)0x1f00); - const uint16x8_t v_003f = vmovq_n_u16((int16_t)0x003f); +simdutf_warn_unused size_t implementation::convert_utf16be_to_utf32( + const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { + std::tuple ret = + icelake::convert_utf16_to_utf32(buf, len, utf32_output); + if (!std::get<2>(ret)) { + return 0; + } + size_t saved_bytes = std::get<1>(ret) - utf32_output; + if (std::get<0>(ret) != buf + len) { + const size_t scalar_saved_bytes = + scalar::utf16_to_utf32::convert( + std::get<0>(ret), len - (std::get<0>(ret) - buf), std::get<1>(ret)); + if (scalar_saved_bytes == 0) { + return 0; + } + saved_bytes += scalar_saved_bytes; + } + return saved_bytes; +} - // t0 = [000a|aaaa|bbbb|bb00] - const uint16x8_t t0 = vshlq_n_u16(in, 2); - // t1 = [000a|aaaa|0000|0000] - const uint16x8_t t1 = vandq_u16(t0, v_1f00); - // t2 = [0000|0000|00bb|bbbb] - const uint16x8_t t2 = vandq_u16(in, v_003f); - // t3 = [000a|aaaa|00bb|bbbb] - const uint16x8_t t3 = vorrq_u16(t1, t2); - // t4 = [110a|aaaa|10bb|bbbb] - const uint16x8_t t4 = vorrq_u16(t3, v_c080); - // 2. merge ASCII and 2-byte codewords - const uint16x8_t v_007f = vmovq_n_u16((uint16_t)0x007F); - const uint16x8_t one_byte_bytemask = vcleq_u16(in, v_007f); - const uint8x16_t utf8_unpacked = - vreinterpretq_u8_u16(vbslq_u16(one_byte_bytemask, in, t4)); - // 3. prepare bitmask for 8-bit lookup -#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO - const uint16x8_t mask = simdutf_make_uint16x8_t( - 0x0001, 0x0004, 0x0010, 0x0040, 0x0002, 0x0008, 0x0020, 0x0080); -#else - const uint16x8_t mask = {0x0001, 0x0004, 0x0010, 0x0040, - 0x0002, 0x0008, 0x0020, 0x0080}; -#endif - uint16_t m2 = vaddvq_u16(vandq_u16(one_byte_bytemask, mask)); - // 4. pack the bytes - const uint8_t *row = - &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[m2][0]; - const uint8x16_t shuffle = vld1q_u8(row + 1); - const uint8x16_t utf8_packed = vqtbl1q_u8(utf8_unpacked, shuffle); +simdutf_warn_unused result implementation::convert_utf16le_to_utf32_with_errors( + const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { + std::tuple ret = + icelake::convert_utf16_to_utf32(buf, len, + utf32_output); + if (!std::get<2>(ret)) { + result scalar_res = + scalar::utf16_to_utf32::convert_with_errors( + std::get<0>(ret), len - (std::get<0>(ret) - buf), std::get<1>(ret)); + scalar_res.count += (std::get<0>(ret) - buf); + return scalar_res; + } + size_t saved_bytes = std::get<1>(ret) - utf32_output; + if (std::get<0>(ret) != buf + len) { + result scalar_res = + scalar::utf16_to_utf32::convert_with_errors( + std::get<0>(ret), len - (std::get<0>(ret) - buf), std::get<1>(ret)); + if (scalar_res.error) { + scalar_res.count += (std::get<0>(ret) - buf); + return scalar_res; + } else { + scalar_res.count += saved_bytes; + return scalar_res; + } + } + return simdutf::result(simdutf::SUCCESS, saved_bytes); +} - // 5. store bytes - vst1q_u8(utf8_output, utf8_packed); +simdutf_warn_unused result implementation::convert_utf16be_to_utf32_with_errors( + const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { + std::tuple ret = + icelake::convert_utf16_to_utf32(buf, len, utf32_output); + if (!std::get<2>(ret)) { + result scalar_res = + scalar::utf16_to_utf32::convert_with_errors( + std::get<0>(ret), len - (std::get<0>(ret) - buf), std::get<1>(ret)); + scalar_res.count += (std::get<0>(ret) - buf); + return scalar_res; + } + size_t saved_bytes = std::get<1>(ret) - utf32_output; + if (std::get<0>(ret) != buf + len) { + result scalar_res = + scalar::utf16_to_utf32::convert_with_errors( + std::get<0>(ret), len - (std::get<0>(ret) - buf), std::get<1>(ret)); + if (scalar_res.error) { + scalar_res.count += (std::get<0>(ret) - buf); + return scalar_res; + } else { + scalar_res.count += saved_bytes; + return scalar_res; + } + } + return simdutf::result(simdutf::SUCCESS, saved_bytes); +} - // 6. adjust pointers - buf += 8; - utf8_output += row[0]; - continue; +simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_utf32( + const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { + std::tuple ret = + icelake::convert_utf16_to_utf32(buf, len, + utf32_output); + if (!std::get<2>(ret)) { + return 0; + } + size_t saved_bytes = std::get<1>(ret) - utf32_output; + if (std::get<0>(ret) != buf + len) { + const size_t scalar_saved_bytes = + scalar::utf16_to_utf32::convert( + std::get<0>(ret), len - (std::get<0>(ret) - buf), std::get<1>(ret)); + if (scalar_saved_bytes == 0) { + return 0; } - const uint16x8_t surrogates_bytemask = - vceqq_u16(vandq_u16(in, v_f800), v_d800); - // It might seem like checking for surrogates_bitmask == 0xc000 could help. - // However, it is likely an uncommon occurrence. - if (vmaxvq_u16(surrogates_bytemask) == 0) { - // case: code units from register produce either 1, 2 or 3 UTF-8 bytes -#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO - const uint16x8_t dup_even = simdutf_make_uint16x8_t( - 0x0000, 0x0202, 0x0404, 0x0606, 0x0808, 0x0a0a, 0x0c0c, 0x0e0e); -#else - const uint16x8_t dup_even = {0x0000, 0x0202, 0x0404, 0x0606, - 0x0808, 0x0a0a, 0x0c0c, 0x0e0e}; -#endif - /* In this branch we handle three cases: - 1. [0000|0000|0ccc|cccc] => [0ccc|cccc] - - single UFT-8 byte - 2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc] - two - UTF-8 bytes - 3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - - three UTF-8 bytes + saved_bytes += scalar_saved_bytes; + } + return saved_bytes; +} - We expand the input word (16-bit) into two code units (32-bit), thus - we have room for four bytes. However, we need five distinct bit - layouts. Note that the last byte in cases #2 and #3 is the same. +simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_utf32( + const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { + std::tuple ret = + icelake::convert_utf16_to_utf32(buf, len, utf32_output); + if (!std::get<2>(ret)) { + return 0; + } + size_t saved_bytes = std::get<1>(ret) - utf32_output; + if (std::get<0>(ret) != buf + len) { + const size_t scalar_saved_bytes = + scalar::utf16_to_utf32::convert( + std::get<0>(ret), len - (std::get<0>(ret) - buf), std::get<1>(ret)); + if (scalar_saved_bytes == 0) { + return 0; + } + saved_bytes += scalar_saved_bytes; + } + return saved_bytes; +} - We precompute byte 1 for case #1 and the common byte for cases #2 & #3 - in register t2. +void implementation::change_endianness_utf16(const char16_t *input, + size_t length, + char16_t *output) const noexcept { + size_t pos = 0; + const __m512i byteflip = _mm512_setr_epi64( + 0x0607040502030001, 0x0e0f0c0d0a0b0809, 0x0607040502030001, + 0x0e0f0c0d0a0b0809, 0x0607040502030001, 0x0e0f0c0d0a0b0809, + 0x0607040502030001, 0x0e0f0c0d0a0b0809); + while (pos + 32 <= length) { + __m512i utf16 = _mm512_loadu_si512((const __m512i *)(input + pos)); + utf16 = _mm512_shuffle_epi8(utf16, byteflip); + _mm512_storeu_si512(output + pos, utf16); + pos += 32; + } + if (pos < length) { + __mmask32 m((1U << (length - pos)) - 1); + __m512i utf16 = _mm512_maskz_loadu_epi16(m, (const __m512i *)(input + pos)); + utf16 = _mm512_shuffle_epi8(utf16, byteflip); + _mm512_mask_storeu_epi16(output + pos, m, utf16); + } +} - We precompute byte 1 for case #3 and -- **conditionally** -- precompute - either byte 1 for case #2 or byte 2 for case #3. Note that they - differ by exactly one bit. +simdutf_warn_unused size_t implementation::count_utf16le( + const char16_t *input, size_t length) const noexcept { + const char16_t *ptr = input; + size_t count{0}; - Finally from these two code units we build proper UTF-8 sequence, taking - into account the case (i.e, the number of bytes to write). - */ - /** - * Given [aaaa|bbbb|bbcc|cccc] our goal is to produce: - * t2 => [0ccc|cccc] [10cc|cccc] - * s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb]) - */ -#define simdutf_vec(x) vmovq_n_u16(static_cast(x)) - // [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc] - const uint16x8_t t0 = vreinterpretq_u16_u8( - vqtbl1q_u8(vreinterpretq_u8_u16(in), vreinterpretq_u8_u16(dup_even))); - // [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc] - const uint16x8_t t1 = vandq_u16(t0, simdutf_vec(0b0011111101111111)); - // [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc] - const uint16x8_t t2 = vorrq_u16(t1, simdutf_vec(0b1000000000000000)); + if (length >= 32) { + const char16_t *end = input + length - 32; - // s0: [aaaa|bbbb|bbcc|cccc] => [0000|0000|0000|aaaa] - const uint16x8_t s0 = vshrq_n_u16(in, 12); - // s1: [aaaa|bbbb|bbcc|cccc] => [0000|bbbb|bb00|0000] - const uint16x8_t s1 = vandq_u16(in, simdutf_vec(0b0000111111000000)); - // [0000|bbbb|bb00|0000] => [00bb|bbbb|0000|0000] - const uint16x8_t s1s = vshlq_n_u16(s1, 2); - // [00bb|bbbb|0000|aaaa] - const uint16x8_t s2 = vorrq_u16(s0, s1s); - // s3: [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa] - const uint16x8_t s3 = vorrq_u16(s2, simdutf_vec(0b1100000011100000)); - const uint16x8_t v_07ff = vmovq_n_u16((uint16_t)0x07FF); - const uint16x8_t one_or_two_bytes_bytemask = vcleq_u16(in, v_07ff); - const uint16x8_t m0 = - vbicq_u16(simdutf_vec(0b0100000000000000), one_or_two_bytes_bytemask); - const uint16x8_t s4 = veorq_u16(s3, m0); -#undef simdutf_vec + const __m512i low = _mm512_set1_epi16((uint16_t)0xdc00); + const __m512i high = _mm512_set1_epi16((uint16_t)0xdfff); - // 4. expand code units 16-bit => 32-bit - const uint8x16_t out0 = vreinterpretq_u8_u16(vzip1q_u16(t2, s4)); - const uint8x16_t out1 = vreinterpretq_u8_u16(vzip2q_u16(t2, s4)); + while (ptr <= end) { + __m512i utf16 = _mm512_loadu_si512((const __m512i *)ptr); + ptr += 32; + uint64_t not_high_surrogate = + static_cast(_mm512_cmpgt_epu16_mask(utf16, high) | + _mm512_cmplt_epu16_mask(utf16, low)); + count += count_ones(not_high_surrogate); + } + } - // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle - const uint16x8_t v_007f = vmovq_n_u16((uint16_t)0x007F); - const uint16x8_t one_byte_bytemask = vcleq_u16(in, v_007f); -#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO - const uint16x8_t onemask = simdutf_make_uint16x8_t( - 0x0001, 0x0004, 0x0010, 0x0040, 0x0100, 0x0400, 0x1000, 0x4000); - const uint16x8_t twomask = simdutf_make_uint16x8_t( - 0x0002, 0x0008, 0x0020, 0x0080, 0x0200, 0x0800, 0x2000, 0x8000); -#else - const uint16x8_t onemask = {0x0001, 0x0004, 0x0010, 0x0040, - 0x0100, 0x0400, 0x1000, 0x4000}; - const uint16x8_t twomask = {0x0002, 0x0008, 0x0020, 0x0080, - 0x0200, 0x0800, 0x2000, 0x8000}; -#endif - const uint16x8_t combined = - vorrq_u16(vandq_u16(one_byte_bytemask, onemask), - vandq_u16(one_or_two_bytes_bytemask, twomask)); - const uint16_t mask = vaddvq_u16(combined); - // The following fast path may or may not be beneficial. - /*if(mask == 0) { - // We only have three-byte code units. Use fast path. - const uint8x16_t shuffle = {2,3,1,6,7,5,10,11,9,14,15,13,0,0,0,0}; - const uint8x16_t utf8_0 = vqtbl1q_u8(out0, shuffle); - const uint8x16_t utf8_1 = vqtbl1q_u8(out1, shuffle); - vst1q_u8(utf8_output, utf8_0); - utf8_output += 12; - vst1q_u8(utf8_output, utf8_1); - utf8_output += 12; - buf += 8; - continue; - }*/ - const uint8_t mask0 = uint8_t(mask); + return count + scalar::utf16::count_code_points( + ptr, length - (ptr - input)); +} - const uint8_t *row0 = - &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask0][0]; - const uint8x16_t shuffle0 = vld1q_u8(row0 + 1); - const uint8x16_t utf8_0 = vqtbl1q_u8(out0, shuffle0); +simdutf_warn_unused size_t implementation::count_utf16be( + const char16_t *input, size_t length) const noexcept { + const char16_t *ptr = input; + size_t count{0}; + if (length >= 32) { - const uint8_t mask1 = static_cast(mask >> 8); - const uint8_t *row1 = - &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask1][0]; - const uint8x16_t shuffle1 = vld1q_u8(row1 + 1); - const uint8x16_t utf8_1 = vqtbl1q_u8(out1, shuffle1); + const char16_t *end = input + length - 32; - vst1q_u8(utf8_output, utf8_0); - utf8_output += row0[0]; - vst1q_u8(utf8_output, utf8_1); - utf8_output += row1[0]; + const __m512i low = _mm512_set1_epi16((uint16_t)0xdc00); + const __m512i high = _mm512_set1_epi16((uint16_t)0xdfff); - buf += 8; - // surrogate pair(s) in a register - } else { - // Let us do a scalar fallback. - // It may seem wasteful to use scalar code, but being efficient with SIMD - // in the presence of surrogate pairs may require non-trivial tables. - size_t forward = 15; - size_t k = 0; - if (size_t(end - buf) < forward + 1) { - forward = size_t(end - buf - 1); - } - for (; k < forward; k++) { - uint16_t word = !match_system(big_endian) - ? scalar::utf16::swap_bytes(buf[k]) - : buf[k]; - if ((word & 0xFF80) == 0) { - *utf8_output++ = char(word); - } else if ((word & 0xF800) == 0) { - *utf8_output++ = char((word >> 6) | 0b11000000); - *utf8_output++ = char((word & 0b111111) | 0b10000000); - } else if ((word & 0xF800) != 0xD800) { - *utf8_output++ = char((word >> 12) | 0b11100000); - *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); - *utf8_output++ = char((word & 0b111111) | 0b10000000); - } else { - // must be a surrogate pair - uint16_t diff = uint16_t(word - 0xD800); - uint16_t next_word = !match_system(big_endian) - ? scalar::utf16::swap_bytes(buf[k + 1]) - : buf[k + 1]; - k++; - uint16_t diff2 = uint16_t(next_word - 0xDC00); - if ((diff | diff2) > 0x3FF) { - return std::make_pair( - result(error_code::SURROGATE, buf - start + k - 1), - reinterpret_cast(utf8_output)); - } - uint32_t value = (diff << 10) + diff2 + 0x10000; - *utf8_output++ = char((value >> 18) | 0b11110000); - *utf8_output++ = char(((value >> 12) & 0b111111) | 0b10000000); - *utf8_output++ = char(((value >> 6) & 0b111111) | 0b10000000); - *utf8_output++ = char((value & 0b111111) | 0b10000000); - } - } - buf += k; + const __m512i byteflip = _mm512_setr_epi64( + 0x0607040502030001, 0x0e0f0c0d0a0b0809, 0x0607040502030001, + 0x0e0f0c0d0a0b0809, 0x0607040502030001, 0x0e0f0c0d0a0b0809, + 0x0607040502030001, 0x0e0f0c0d0a0b0809); + while (ptr <= end) { + __m512i utf16 = + _mm512_shuffle_epi8(_mm512_loadu_si512((__m512i *)ptr), byteflip); + ptr += 32; + uint64_t not_high_surrogate = + static_cast(_mm512_cmpgt_epu16_mask(utf16, high) | + _mm512_cmplt_epu16_mask(utf16, low)); + count += count_ones(not_high_surrogate); } - } // while - - return std::make_pair(result(error_code::SUCCESS, buf - start), - reinterpret_cast(utf8_output)); -} -/* end file src/arm64/arm_convert_utf16_to_utf8.cpp */ - -/* begin file src/arm64/arm_base64.cpp */ -/** - * References and further reading: - * - * Wojciech Muła, Daniel Lemire, Base64 encoding and decoding at almost the - * speed of a memory copy, Software: Practice and Experience 50 (2), 2020. - * https://arxiv.org/abs/1910.05109 - * - * Wojciech Muła, Daniel Lemire, Faster Base64 Encoding and Decoding using AVX2 - * Instructions, ACM Transactions on the Web 12 (3), 2018. - * https://arxiv.org/abs/1704.00605 - * - * Simon Josefsson. 2006. The Base16, Base32, and Base64 Data Encodings. - * https://tools.ietf.org/html/rfc4648. (2006). Internet Engineering Task Force, - * Request for Comments: 4648. - * - * Alfred Klomp. 2014a. Fast Base64 encoding/decoding with SSE vectorization. - * http://www.alfredklomp.com/programming/sse-base64/. (2014). - * - * Alfred Klomp. 2014b. Fast Base64 stream encoder/decoder in C99, with SIMD - * acceleration. https://github.com/aklomp/base64. (2014). - * - * Hanson Char. 2014. A Fast and Correct Base 64 Codec. (2014). - * https://aws.amazon.com/blogs/developer/a-fast-and-correct-base-64-codec/ - * - * Nick Kopp. 2013. Base64 Encoding on a GPU. - * https://www.codeproject.com/Articles/276993/Base-Encoding-on-a-GPU. (2013). - */ - -size_t encode_base64(char *dst, const char *src, size_t srclen, - base64_options options) { - // credit: Wojciech Muła - uint8_t *out = (uint8_t *)dst; - constexpr static uint8_t source_table[64] = { - 'A', 'Q', 'g', 'w', 'B', 'R', 'h', 'x', 'C', 'S', 'i', 'y', 'D', - 'T', 'j', 'z', 'E', 'U', 'k', '0', 'F', 'V', 'l', '1', 'G', 'W', - 'm', '2', 'H', 'X', 'n', '3', 'I', 'Y', 'o', '4', 'J', 'Z', 'p', - '5', 'K', 'a', 'q', '6', 'L', 'b', 'r', '7', 'M', 'c', 's', '8', - 'N', 'd', 't', '9', 'O', 'e', 'u', '+', 'P', 'f', 'v', '/', - }; - constexpr static uint8_t source_table_url[64] = { - 'A', 'Q', 'g', 'w', 'B', 'R', 'h', 'x', 'C', 'S', 'i', 'y', 'D', - 'T', 'j', 'z', 'E', 'U', 'k', '0', 'F', 'V', 'l', '1', 'G', 'W', - 'm', '2', 'H', 'X', 'n', '3', 'I', 'Y', 'o', '4', 'J', 'Z', 'p', - '5', 'K', 'a', 'q', '6', 'L', 'b', 'r', '7', 'M', 'c', 's', '8', - 'N', 'd', 't', '9', 'O', 'e', 'u', '-', 'P', 'f', 'v', '_', - }; - const uint8x16_t v3f = vdupq_n_u8(0x3f); -#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO - // When trying to load a uint8_t array, Visual Studio might - // error with: error C2664: '__n128x4 neon_ld4m_q8(const char *)': - // cannot convert argument 1 from 'const uint8_t [64]' to 'const char * - const uint8x16x4_t table = vld4q_u8( - (reinterpret_cast(options & base64_url) ? source_table_url - : source_table)); -#else - const uint8x16x4_t table = - vld4q_u8((options & base64_url) ? source_table_url : source_table); -#endif - size_t i = 0; - for (; i + 16 * 3 <= srclen; i += 16 * 3) { - const uint8x16x3_t in = vld3q_u8((const uint8_t *)src + i); - uint8x16x4_t result; - result.val[0] = vshrq_n_u8(in.val[0], 2); - result.val[1] = - vandq_u8(vsliq_n_u8(vshrq_n_u8(in.val[1], 4), in.val[0], 4), v3f); - result.val[2] = - vandq_u8(vsliq_n_u8(vshrq_n_u8(in.val[2], 6), in.val[1], 2), v3f); - result.val[3] = vandq_u8(in.val[2], v3f); - result.val[0] = vqtbl4q_u8(table, result.val[0]); - result.val[1] = vqtbl4q_u8(table, result.val[1]); - result.val[2] = vqtbl4q_u8(table, result.val[2]); - result.val[3] = vqtbl4q_u8(table, result.val[3]); - vst4q_u8(out, result); - out += 64; } - out += scalar::base64::tail_encode_base64((char *)out, src + i, srclen - i, - options); - return size_t((char *)out - dst); + return count + scalar::utf16::count_code_points( + ptr, length - (ptr - input)); } -static inline void compress(uint8x16_t data, uint16_t mask, char *output) { - if (mask == 0) { - vst1q_u8((uint8_t *)output, data); - return; - } - uint8_t mask1 = uint8_t(mask); // least significant 8 bits - uint8_t mask2 = uint8_t(mask >> 8); // most significant 8 bits - uint64x2_t compactmasku64 = {tables::base64::thintable_epi8[mask1], - tables::base64::thintable_epi8[mask2]}; - uint8x16_t compactmask = vreinterpretq_u8_u64(compactmasku64); -#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO - const uint8x16_t off = - simdutf_make_uint8x16_t(0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8); -#else - const uint8x16_t off = {0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8}; -#endif - - compactmask = vaddq_u8(compactmask, off); - uint8x16_t pruned = vqtbl1q_u8(data, compactmask); +simdutf_warn_unused size_t +implementation::count_utf8(const char *input, size_t length) const noexcept { + const uint8_t *str = reinterpret_cast(input); + size_t answer = + length / sizeof(__m512i) * + sizeof(__m512i); // Number of 512-bit chunks that fits into the length. + size_t i = 0; + __m512i unrolled_popcount{0}; - int pop1 = tables::base64::BitsSetTable256mul2[mask1]; - // then load the corresponding mask, what it does is to write - // only the first pop1 bytes from the first 8 bytes, and then - // it fills in with the bytes from the second 8 bytes + some filling - // at the end. - compactmask = vld1q_u8(tables::base64::pshufb_combine_table + pop1 * 8); - uint8x16_t answer = vqtbl1q_u8(pruned, compactmask); - vst1q_u8((uint8_t *)output, answer); -} + const __m512i continuation = _mm512_set1_epi8(char(0b10111111)); -struct block64 { - uint8x16_t chunks[4]; -}; + while (i + sizeof(__m512i) <= length) { + size_t iterations = (length - i) / sizeof(__m512i); -static_assert(sizeof(block64) == 64, "block64 is not 64 bytes"); -template uint64_t to_base64_mask(block64 *b, bool *error) { - uint8x16_t v0f = vdupq_n_u8(0xf); + size_t max_i = i + iterations * sizeof(__m512i) - sizeof(__m512i); + for (; i + 8 * sizeof(__m512i) <= max_i; i += 8 * sizeof(__m512i)) { + __m512i input1 = _mm512_loadu_si512((const __m512i *)(str + i)); + __m512i input2 = + _mm512_loadu_si512((const __m512i *)(str + i + sizeof(__m512i))); + __m512i input3 = + _mm512_loadu_si512((const __m512i *)(str + i + 2 * sizeof(__m512i))); + __m512i input4 = + _mm512_loadu_si512((const __m512i *)(str + i + 3 * sizeof(__m512i))); + __m512i input5 = + _mm512_loadu_si512((const __m512i *)(str + i + 4 * sizeof(__m512i))); + __m512i input6 = + _mm512_loadu_si512((const __m512i *)(str + i + 5 * sizeof(__m512i))); + __m512i input7 = + _mm512_loadu_si512((const __m512i *)(str + i + 6 * sizeof(__m512i))); + __m512i input8 = + _mm512_loadu_si512((const __m512i *)(str + i + 7 * sizeof(__m512i))); - uint8x16_t underscore0, underscore1, underscore2, underscore3; - if (base64_url) { - underscore0 = vceqq_u8(b->chunks[0], vdupq_n_u8(0x5f)); - underscore1 = vceqq_u8(b->chunks[1], vdupq_n_u8(0x5f)); - underscore2 = vceqq_u8(b->chunks[2], vdupq_n_u8(0x5f)); - underscore3 = vceqq_u8(b->chunks[3], vdupq_n_u8(0x5f)); - } else { - (void)underscore0; - (void)underscore1; - (void)underscore2; - (void)underscore3; - } + __mmask64 mask1 = _mm512_cmple_epi8_mask(input1, continuation); + __mmask64 mask2 = _mm512_cmple_epi8_mask(input2, continuation); + __mmask64 mask3 = _mm512_cmple_epi8_mask(input3, continuation); + __mmask64 mask4 = _mm512_cmple_epi8_mask(input4, continuation); + __mmask64 mask5 = _mm512_cmple_epi8_mask(input5, continuation); + __mmask64 mask6 = _mm512_cmple_epi8_mask(input6, continuation); + __mmask64 mask7 = _mm512_cmple_epi8_mask(input7, continuation); + __mmask64 mask8 = _mm512_cmple_epi8_mask(input8, continuation); - uint8x16_t lo_nibbles0 = vandq_u8(b->chunks[0], v0f); - uint8x16_t lo_nibbles1 = vandq_u8(b->chunks[1], v0f); - uint8x16_t lo_nibbles2 = vandq_u8(b->chunks[2], v0f); - uint8x16_t lo_nibbles3 = vandq_u8(b->chunks[3], v0f); + __m512i mask_register = _mm512_set_epi64(mask8, mask7, mask6, mask5, + mask4, mask3, mask2, mask1); - // Needed by the decoding step. - uint8x16_t hi_nibbles0 = vshrq_n_u8(b->chunks[0], 4); - uint8x16_t hi_nibbles1 = vshrq_n_u8(b->chunks[1], 4); - uint8x16_t hi_nibbles2 = vshrq_n_u8(b->chunks[2], 4); - uint8x16_t hi_nibbles3 = vshrq_n_u8(b->chunks[3], 4); - uint8x16_t lut_lo; -#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO - if (base64_url) { - lut_lo = - simdutf_make_uint8x16_t(0x3a, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x61, 0xe1, 0xf4, 0xe5, 0xa5, 0xf4, 0xf4); - } else { - lut_lo = - simdutf_make_uint8x16_t(0x3a, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x61, 0xe1, 0xb4, 0xe5, 0xe5, 0xf4, 0xb4); - } -#else - if (base64_url) { - lut_lo = uint8x16_t{0x3a, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x61, 0xe1, 0xf4, 0xe5, 0xa5, 0xf4, 0xf4}; - } else { - lut_lo = uint8x16_t{0x3a, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x61, 0xe1, 0xb4, 0xe5, 0xe5, 0xf4, 0xb4}; - } -#endif - uint8x16_t lo0 = vqtbl1q_u8(lut_lo, lo_nibbles0); - uint8x16_t lo1 = vqtbl1q_u8(lut_lo, lo_nibbles1); - uint8x16_t lo2 = vqtbl1q_u8(lut_lo, lo_nibbles2); - uint8x16_t lo3 = vqtbl1q_u8(lut_lo, lo_nibbles3); - uint8x16_t lut_hi; -#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO - if (base64_url) { - lut_hi = - simdutf_make_uint8x16_t(0x11, 0x20, 0x42, 0x80, 0x8, 0x4, 0x8, 0x4, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20); - } else { - lut_hi = - simdutf_make_uint8x16_t(0x11, 0x20, 0x42, 0x80, 0x8, 0x4, 0x8, 0x4, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20); - } -#else - if (base64_url) { - lut_hi = uint8x16_t{0x11, 0x20, 0x42, 0x80, 0x8, 0x4, 0x8, 0x4, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20}; - } else { - lut_hi = uint8x16_t{0x11, 0x20, 0x42, 0x80, 0x8, 0x4, 0x8, 0x4, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20}; - } -#endif - uint8x16_t hi0 = vqtbl1q_u8(lut_hi, hi_nibbles0); - uint8x16_t hi1 = vqtbl1q_u8(lut_hi, hi_nibbles1); - uint8x16_t hi2 = vqtbl1q_u8(lut_hi, hi_nibbles2); - uint8x16_t hi3 = vqtbl1q_u8(lut_hi, hi_nibbles3); + unrolled_popcount = _mm512_add_epi64(unrolled_popcount, + _mm512_popcnt_epi64(mask_register)); + } - if (base64_url) { - hi0 = vbicq_u8(hi0, underscore0); - hi1 = vbicq_u8(hi1, underscore1); - hi2 = vbicq_u8(hi2, underscore2); - hi3 = vbicq_u8(hi3, underscore3); + for (; i <= max_i; i += sizeof(__m512i)) { + __m512i more_input = _mm512_loadu_si512((const __m512i *)(str + i)); + uint64_t continuation_bitmask = static_cast( + _mm512_cmple_epi8_mask(more_input, continuation)); + answer -= count_ones(continuation_bitmask); + } } - uint8_t checks = - vmaxvq_u8(vorrq_u8(vorrq_u8(vandq_u8(lo0, hi0), vandq_u8(lo1, hi1)), - vorrq_u8(vandq_u8(lo2, hi2), vandq_u8(lo3, hi3)))); -#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO - const uint8x16_t bit_mask = - simdutf_make_uint8x16_t(0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, - 0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80); -#else - const uint8x16_t bit_mask = {0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, - 0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80}; -#endif - uint64_t badcharmask = 0; - *error = checks > 0x3; - if (checks) { - // Add each of the elements next to each other, successively, to stuff each - // 8 byte mask into one. - uint8x16_t test0 = vtstq_u8(lo0, hi0); - uint8x16_t test1 = vtstq_u8(lo1, hi1); - uint8x16_t test2 = vtstq_u8(lo2, hi2); - uint8x16_t test3 = vtstq_u8(lo3, hi3); - uint8x16_t sum0 = - vpaddq_u8(vandq_u8(test0, bit_mask), vandq_u8(test1, bit_mask)); - uint8x16_t sum1 = - vpaddq_u8(vandq_u8(test2, bit_mask), vandq_u8(test3, bit_mask)); - sum0 = vpaddq_u8(sum0, sum1); - sum0 = vpaddq_u8(sum0, sum0); - badcharmask = vgetq_lane_u64(vreinterpretq_u64_u8(sum0), 0); - } - // This is the transformation step that can be done while we are waiting for - // sum0 - uint8x16_t roll_lut; -#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO - if (base64_url) { - roll_lut = - simdutf_make_uint8x16_t(0xe0, 0x11, 0x13, 0x4, 0xbf, 0xbf, 0xb9, 0xb9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0); - } else { - roll_lut = - simdutf_make_uint8x16_t(0x0, 0x10, 0x13, 0x4, 0xbf, 0xbf, 0xb9, 0xb9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0); - } -#else - if (base64_url) { - roll_lut = uint8x16_t{0xe0, 0x11, 0x13, 0x4, 0xbf, 0xbf, 0xb9, 0xb9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}; - } else { - roll_lut = uint8x16_t{0x0, 0x10, 0x13, 0x4, 0xbf, 0xbf, 0xb9, 0xb9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}; - } -#endif - uint8x16_t vsecond_last = base64_url ? vdupq_n_u8(0x2d) : vdupq_n_u8(0x2f); - if (base64_url) { - hi_nibbles0 = vbicq_u8(hi_nibbles0, underscore0); - hi_nibbles1 = vbicq_u8(hi_nibbles1, underscore1); - hi_nibbles2 = vbicq_u8(hi_nibbles2, underscore2); - hi_nibbles3 = vbicq_u8(hi_nibbles3, underscore3); - } - uint8x16_t roll0 = vqtbl1q_u8( - roll_lut, vaddq_u8(vceqq_u8(b->chunks[0], vsecond_last), hi_nibbles0)); - uint8x16_t roll1 = vqtbl1q_u8( - roll_lut, vaddq_u8(vceqq_u8(b->chunks[1], vsecond_last), hi_nibbles1)); - uint8x16_t roll2 = vqtbl1q_u8( - roll_lut, vaddq_u8(vceqq_u8(b->chunks[2], vsecond_last), hi_nibbles2)); - uint8x16_t roll3 = vqtbl1q_u8( - roll_lut, vaddq_u8(vceqq_u8(b->chunks[3], vsecond_last), hi_nibbles3)); - b->chunks[0] = vaddq_u8(b->chunks[0], roll0); - b->chunks[1] = vaddq_u8(b->chunks[1], roll1); - b->chunks[2] = vaddq_u8(b->chunks[2], roll2); - b->chunks[3] = vaddq_u8(b->chunks[3], roll3); - return badcharmask; -} + __m256i first_half = _mm512_extracti64x4_epi64(unrolled_popcount, 0); + __m256i second_half = _mm512_extracti64x4_epi64(unrolled_popcount, 1); + answer -= (size_t)_mm256_extract_epi64(first_half, 0) + + (size_t)_mm256_extract_epi64(first_half, 1) + + (size_t)_mm256_extract_epi64(first_half, 2) + + (size_t)_mm256_extract_epi64(first_half, 3) + + (size_t)_mm256_extract_epi64(second_half, 0) + + (size_t)_mm256_extract_epi64(second_half, 1) + + (size_t)_mm256_extract_epi64(second_half, 2) + + (size_t)_mm256_extract_epi64(second_half, 3); -void copy_block(block64 *b, char *output) { - vst1q_u8((uint8_t *)output, b->chunks[0]); - vst1q_u8((uint8_t *)output + 16, b->chunks[1]); - vst1q_u8((uint8_t *)output + 32, b->chunks[2]); - vst1q_u8((uint8_t *)output + 48, b->chunks[3]); + return answer + scalar::utf8::count_code_points( + reinterpret_cast(str + i), length - i); } -uint64_t compress_block(block64 *b, uint64_t mask, char *output) { - uint64_t popcounts = - vget_lane_u64(vreinterpret_u64_u8(vcnt_u8(vcreate_u8(~mask))), 0); - uint64_t offsets = popcounts * 0x0101010101010101; - compress(b->chunks[0], uint16_t(mask), output); - compress(b->chunks[1], uint16_t(mask >> 16), &output[(offsets >> 8) & 0xFF]); - compress(b->chunks[2], uint16_t(mask >> 32), &output[(offsets >> 24) & 0xFF]); - compress(b->chunks[3], uint16_t(mask >> 48), &output[(offsets >> 40) & 0xFF]); - return offsets >> 56; +simdutf_warn_unused size_t implementation::latin1_length_from_utf8( + const char *buf, size_t len) const noexcept { + return count_utf8(buf, len); } -// The caller of this function is responsible to ensure that there are 64 bytes -// available from reading at src. The data is read into a block64 structure. -void load_block(block64 *b, const char *src) { - b->chunks[0] = vld1q_u8(reinterpret_cast(src)); - b->chunks[1] = vld1q_u8(reinterpret_cast(src) + 16); - b->chunks[2] = vld1q_u8(reinterpret_cast(src) + 32); - b->chunks[3] = vld1q_u8(reinterpret_cast(src) + 48); +simdutf_warn_unused size_t +implementation::latin1_length_from_utf16(size_t length) const noexcept { + return scalar::utf16::latin1_length_from_utf16(length); } -// The caller of this function is responsible to ensure that there are 32 bytes -// available from reading at data. It returns a 16-byte value, narrowing with -// saturation the 16-bit words. -inline uint8x16_t load_satured(const uint16_t *data) { - uint16x8_t in1 = vld1q_u16(data); - uint16x8_t in2 = vld1q_u16(data + 8); - return vqmovn_high_u16(vqmovn_u16(in1), in2); +simdutf_warn_unused size_t +implementation::latin1_length_from_utf32(size_t length) const noexcept { + return scalar::utf32::latin1_length_from_utf32(length); } -// The caller of this function is responsible to ensure that there are 128 bytes -// available from reading at src. The data is read into a block64 structure. -void load_block(block64 *b, const char16_t *src) { - b->chunks[0] = load_satured(reinterpret_cast(src)); - b->chunks[1] = load_satured(reinterpret_cast(src) + 16); - b->chunks[2] = load_satured(reinterpret_cast(src) + 32); - b->chunks[3] = load_satured(reinterpret_cast(src) + 48); -} +simdutf_warn_unused size_t implementation::utf8_length_from_utf16le( + const char16_t *input, size_t length) const noexcept { + const char16_t *ptr = input; + size_t count{0}; + if (length >= 32) { + const char16_t *end = input + length - 32; -// decode 64 bytes and output 48 bytes -void base64_decode_block(char *out, const char *src) { - uint8x16x4_t str = vld4q_u8((uint8_t *)src); - uint8x16x3_t outvec; - outvec.val[0] = - vorrq_u8(vshlq_n_u8(str.val[0], 2), vshrq_n_u8(str.val[1], 4)); - outvec.val[1] = - vorrq_u8(vshlq_n_u8(str.val[1], 4), vshrq_n_u8(str.val[2], 2)); - outvec.val[2] = vorrq_u8(vshlq_n_u8(str.val[2], 6), str.val[3]); - vst3q_u8((uint8_t *)out, outvec); -} + const __m512i v_007f = _mm512_set1_epi16((uint16_t)0x007f); + const __m512i v_07ff = _mm512_set1_epi16((uint16_t)0x07ff); + const __m512i v_dfff = _mm512_set1_epi16((uint16_t)0xdfff); + const __m512i v_d800 = _mm512_set1_epi16((uint16_t)0xd800); -template -full_result -compress_decode_base64(char *dst, const char_type *src, size_t srclen, - base64_options options, - last_chunk_handling_options last_chunk_options) { - const uint8_t *to_base64 = base64_url ? tables::base64::to_base64_url_value - : tables::base64::to_base64_value; - size_t equallocation = - srclen; // location of the first padding character if any - // skip trailing spaces - while (srclen > 0 && scalar::base64::is_eight_byte(src[srclen - 1]) && - to_base64[uint8_t(src[srclen - 1])] == 64) { - srclen--; - } - size_t equalsigns = 0; - if (srclen > 0 && src[srclen - 1] == '=') { - equallocation = srclen - 1; - srclen--; - equalsigns = 1; - // skip trailing spaces - while (srclen > 0 && scalar::base64::is_eight_byte(src[srclen - 1]) && - to_base64[uint8_t(src[srclen - 1])] == 64) { - srclen--; - } - if (srclen > 0 && src[srclen - 1] == '=') { - equallocation = srclen - 1; - srclen--; - equalsigns = 2; - } - } - if (srclen == 0) { - if (equalsigns > 0) { - return {INVALID_BASE64_CHARACTER, equallocation, 0}; - } - return {SUCCESS, 0, 0}; - } - const char_type *const srcinit = src; - const char *const dstinit = dst; - const char_type *const srcend = src + srclen; + while (ptr <= end) { + __m512i utf16 = _mm512_loadu_si512((const __m512i *)ptr); + ptr += 32; + __mmask32 ascii_bitmask = _mm512_cmple_epu16_mask(utf16, v_007f); + __mmask32 two_bytes_bitmask = + _mm512_mask_cmple_epu16_mask(~ascii_bitmask, utf16, v_07ff); + __mmask32 not_one_two_bytes = ~(ascii_bitmask | two_bytes_bitmask); + __mmask32 surrogates_bitmask = + _mm512_mask_cmple_epu16_mask(not_one_two_bytes, utf16, v_dfff) & + _mm512_mask_cmpge_epu16_mask(not_one_two_bytes, utf16, v_d800); - constexpr size_t block_size = 10; - char buffer[block_size * 64]; - char *bufferptr = buffer; - if (srclen >= 64) { - const char_type *const srcend64 = src + srclen - 64; - while (src <= srcend64) { - block64 b; - load_block(&b, src); - src += 64; - bool error = false; - uint64_t badcharmask = to_base64_mask(&b, &error); - if (badcharmask) { - if (error) { - src -= 64; - while (src < srcend && scalar::base64::is_eight_byte(*src) && - to_base64[uint8_t(*src)] <= 64) { - src++; - } - if (src < srcend) { - // should never happen - } - return {error_code::INVALID_BASE64_CHARACTER, size_t(src - srcinit), - size_t(dst - dstinit)}; - } - } + size_t ascii_count = count_ones(ascii_bitmask); + size_t two_bytes_count = count_ones(two_bytes_bitmask); + size_t surrogate_bytes_count = count_ones(surrogates_bitmask); + size_t three_bytes_count = + 32 - ascii_count - two_bytes_count - surrogate_bytes_count; - if (badcharmask != 0) { - // optimization opportunity: check for simple masks like those made of - // continuous 1s followed by continuous 0s. And masks containing a - // single bad character. - bufferptr += compress_block(&b, badcharmask, bufferptr); - } else { - // optimization opportunity: if bufferptr == buffer and mask == 0, we - // can avoid the call to compress_block and decode directly. - copy_block(&b, bufferptr); - bufferptr += 64; - } - if (bufferptr >= (block_size - 1) * 64 + buffer) { - for (size_t i = 0; i < (block_size - 1); i++) { - base64_decode_block(dst, buffer + i * 64); - dst += 48; - } - std::memcpy(buffer, buffer + (block_size - 1) * 64, - 64); // 64 might be too much - bufferptr -= (block_size - 1) * 64; - } + count += ascii_count + 2 * two_bytes_count + 3 * three_bytes_count + + 2 * surrogate_bytes_count; } } - char *buffer_start = buffer; - // Optimization note: if this is almost full, then it is worth our - // time, otherwise, we should just decode directly. - int last_block = (int)((bufferptr - buffer_start) % 64); - if (last_block != 0 && srcend - src + last_block >= 64) { - while ((bufferptr - buffer_start) % 64 != 0 && src < srcend) { - uint8_t val = to_base64[uint8_t(*src)]; - *bufferptr = char(val); - if (!scalar::base64::is_eight_byte(*src) || val > 64) { - return {error_code::INVALID_BASE64_CHARACTER, size_t(src - srcinit), - size_t(dst - dstinit)}; - } - bufferptr += (val <= 63); - src++; + + return count + scalar::utf16::utf8_length_from_utf16( + ptr, length - (ptr - input)); +} + +simdutf_warn_unused size_t implementation::utf8_length_from_utf16be( + const char16_t *input, size_t length) const noexcept { + const char16_t *ptr = input; + size_t count{0}; + + if (length >= 32) { + const char16_t *end = input + length - 32; + + const __m512i v_007f = _mm512_set1_epi16((uint16_t)0x007f); + const __m512i v_07ff = _mm512_set1_epi16((uint16_t)0x07ff); + const __m512i v_dfff = _mm512_set1_epi16((uint16_t)0xdfff); + const __m512i v_d800 = _mm512_set1_epi16((uint16_t)0xd800); + + const __m512i byteflip = _mm512_setr_epi64( + 0x0607040502030001, 0x0e0f0c0d0a0b0809, 0x0607040502030001, + 0x0e0f0c0d0a0b0809, 0x0607040502030001, 0x0e0f0c0d0a0b0809, + 0x0607040502030001, 0x0e0f0c0d0a0b0809); + while (ptr <= end) { + __m512i utf16 = _mm512_loadu_si512((const __m512i *)ptr); + utf16 = _mm512_shuffle_epi8(utf16, byteflip); + ptr += 32; + __mmask32 ascii_bitmask = _mm512_cmple_epu16_mask(utf16, v_007f); + __mmask32 two_bytes_bitmask = + _mm512_mask_cmple_epu16_mask(~ascii_bitmask, utf16, v_07ff); + __mmask32 not_one_two_bytes = ~(ascii_bitmask | two_bytes_bitmask); + __mmask32 surrogates_bitmask = + _mm512_mask_cmple_epu16_mask(not_one_two_bytes, utf16, v_dfff) & + _mm512_mask_cmpge_epu16_mask(not_one_two_bytes, utf16, v_d800); + + size_t ascii_count = count_ones(ascii_bitmask); + size_t two_bytes_count = count_ones(two_bytes_bitmask); + size_t surrogate_bytes_count = count_ones(surrogates_bitmask); + size_t three_bytes_count = + 32 - ascii_count - two_bytes_count - surrogate_bytes_count; + count += ascii_count + 2 * two_bytes_count + 3 * three_bytes_count + + 2 * surrogate_bytes_count; } } - for (; buffer_start + 64 <= bufferptr; buffer_start += 64) { - base64_decode_block(dst, buffer_start); - dst += 48; - } - if ((bufferptr - buffer_start) % 64 != 0) { - while (buffer_start + 4 < bufferptr) { - uint32_t triple = ((uint32_t(uint8_t(buffer_start[0])) << 3 * 6) + - (uint32_t(uint8_t(buffer_start[1])) << 2 * 6) + - (uint32_t(uint8_t(buffer_start[2])) << 1 * 6) + - (uint32_t(uint8_t(buffer_start[3])) << 0 * 6)) - << 8; - triple = scalar::utf32::swap_bytes(triple); - std::memcpy(dst, &triple, 4); + return count + scalar::utf16::utf8_length_from_utf16( + ptr, length - (ptr - input)); +} - dst += 3; - buffer_start += 4; - } - if (buffer_start + 4 <= bufferptr) { - uint32_t triple = ((uint32_t(uint8_t(buffer_start[0])) << 3 * 6) + - (uint32_t(uint8_t(buffer_start[1])) << 2 * 6) + - (uint32_t(uint8_t(buffer_start[2])) << 1 * 6) + - (uint32_t(uint8_t(buffer_start[3])) << 0 * 6)) - << 8; - triple = scalar::utf32::swap_bytes(triple); - std::memcpy(dst, &triple, 3); +simdutf_warn_unused size_t implementation::utf32_length_from_utf16le( + const char16_t *input, size_t length) const noexcept { + return implementation::count_utf16le(input, length); +} - dst += 3; - buffer_start += 4; - } - // we may have 1, 2 or 3 bytes left and we need to decode them so let us - // backtrack - int leftover = int(bufferptr - buffer_start); - while (leftover > 0) { - while (to_base64[uint8_t(*(src - 1))] == 64) { - src--; +simdutf_warn_unused size_t implementation::utf32_length_from_utf16be( + const char16_t *input, size_t length) const noexcept { + return implementation::count_utf16be(input, length); +} + +simdutf_warn_unused size_t +implementation::utf16_length_from_latin1(size_t length) const noexcept { + return scalar::latin1::utf16_length_from_latin1(length); +} + +simdutf_warn_unused size_t +implementation::utf32_length_from_latin1(size_t length) const noexcept { + return scalar::latin1::utf32_length_from_latin1(length); +} + +simdutf_warn_unused size_t implementation::utf8_length_from_latin1( + const char *input, size_t length) const noexcept { + const uint8_t *str = reinterpret_cast(input); + size_t answer = length / sizeof(__m512i) * sizeof(__m512i); + size_t i = 0; + if (answer >= 2048) { // long strings optimization + unsigned char v_0xFF = 0xff; + __m512i eight_64bits = _mm512_setzero_si512(); + while (i + sizeof(__m512i) <= length) { + __m512i runner = _mm512_setzero_si512(); + size_t iterations = (length - i) / sizeof(__m512i); + if (iterations > 255) { + iterations = 255; } - src--; - leftover--; - } - } - if (src < srcend + equalsigns) { - full_result r = scalar::base64::base64_tail_decode( - dst, src, srcend - src, equalsigns, options, last_chunk_options); - if (r.error == error_code::INVALID_BASE64_CHARACTER || - r.error == error_code::BASE64_EXTRA_BITS) { - r.input_count += size_t(src - srcinit); - return r; - } else { - r.output_count += size_t(dst - dstinit); - } - if (last_chunk_options != stop_before_partial && - r.error == error_code::SUCCESS && equalsigns > 0) { - // additional checks - if ((r.output_count % 3 == 0) || - ((r.output_count % 3) + 1 + equalsigns != 4)) { - r.error = error_code::INVALID_BASE64_CHARACTER; - r.input_count = equallocation; + size_t max_i = i + iterations * sizeof(__m512i) - sizeof(__m512i); + for (; i + 4 * sizeof(__m512i) <= max_i; i += 4 * sizeof(__m512i)) { + // Load four __m512i vectors + __m512i input1 = _mm512_loadu_si512((const __m512i *)(str + i)); + __m512i input2 = + _mm512_loadu_si512((const __m512i *)(str + i + sizeof(__m512i))); + __m512i input3 = _mm512_loadu_si512( + (const __m512i *)(str + i + 2 * sizeof(__m512i))); + __m512i input4 = _mm512_loadu_si512( + (const __m512i *)(str + i + 3 * sizeof(__m512i))); + + // Generate four masks + __mmask64 mask1 = + _mm512_cmpgt_epi8_mask(_mm512_setzero_si512(), input1); + __mmask64 mask2 = + _mm512_cmpgt_epi8_mask(_mm512_setzero_si512(), input2); + __mmask64 mask3 = + _mm512_cmpgt_epi8_mask(_mm512_setzero_si512(), input3); + __mmask64 mask4 = + _mm512_cmpgt_epi8_mask(_mm512_setzero_si512(), input4); + // Apply the masks and subtract from the runner + __m512i not_ascii1 = + _mm512_mask_set1_epi8(_mm512_setzero_si512(), mask1, v_0xFF); + __m512i not_ascii2 = + _mm512_mask_set1_epi8(_mm512_setzero_si512(), mask2, v_0xFF); + __m512i not_ascii3 = + _mm512_mask_set1_epi8(_mm512_setzero_si512(), mask3, v_0xFF); + __m512i not_ascii4 = + _mm512_mask_set1_epi8(_mm512_setzero_si512(), mask4, v_0xFF); + + runner = _mm512_sub_epi8(runner, not_ascii1); + runner = _mm512_sub_epi8(runner, not_ascii2); + runner = _mm512_sub_epi8(runner, not_ascii3); + runner = _mm512_sub_epi8(runner, not_ascii4); + } + + for (; i <= max_i; i += sizeof(__m512i)) { + __m512i more_input = _mm512_loadu_si512((const __m512i *)(str + i)); + + __mmask64 mask = + _mm512_cmpgt_epi8_mask(_mm512_setzero_si512(), more_input); + __m512i not_ascii = + _mm512_mask_set1_epi8(_mm512_setzero_si512(), mask, v_0xFF); + runner = _mm512_sub_epi8(runner, not_ascii); } + + eight_64bits = _mm512_add_epi64( + eight_64bits, _mm512_sad_epu8(runner, _mm512_setzero_si512())); } - return r; - } - if (equalsigns > 0) { - if ((size_t(dst - dstinit) % 3 == 0) || - ((size_t(dst - dstinit) % 3) + 1 + equalsigns != 4)) { - return {INVALID_BASE64_CHARACTER, equallocation, size_t(dst - dstinit)}; + + __m256i first_half = _mm512_extracti64x4_epi64(eight_64bits, 0); + __m256i second_half = _mm512_extracti64x4_epi64(eight_64bits, 1); + answer += (size_t)_mm256_extract_epi64(first_half, 0) + + (size_t)_mm256_extract_epi64(first_half, 1) + + (size_t)_mm256_extract_epi64(first_half, 2) + + (size_t)_mm256_extract_epi64(first_half, 3) + + (size_t)_mm256_extract_epi64(second_half, 0) + + (size_t)_mm256_extract_epi64(second_half, 1) + + (size_t)_mm256_extract_epi64(second_half, 2) + + (size_t)_mm256_extract_epi64(second_half, 3); + } else if (answer > 0) { + for (; i + sizeof(__m512i) <= length; i += sizeof(__m512i)) { + __m512i latin = _mm512_loadu_si512((const __m512i *)(str + i)); + uint64_t non_ascii = _mm512_movepi8_mask(latin); + answer += count_ones(non_ascii); } } - return {SUCCESS, srclen, size_t(dst - dstinit)}; + return answer + scalar::latin1::utf8_length_from_latin1( + reinterpret_cast(str + i), length - i); } -/* end file src/arm64/arm_base64.cpp */ -/* begin file src/arm64/arm_convert_utf32_to_latin1.cpp */ -std::pair -arm_convert_utf32_to_latin1(const char32_t *buf, size_t len, - char *latin1_output) { - const char32_t *end = buf + len; - while (end - buf >= 8) { - uint32x4_t in1 = vld1q_u32(reinterpret_cast(buf)); - uint32x4_t in2 = vld1q_u32(reinterpret_cast(buf + 4)); - uint16x8_t utf16_packed = vcombine_u16(vqmovn_u32(in1), vqmovn_u32(in2)); - if (vmaxvq_u16(utf16_packed) <= 0xff) { - // 1. pack the bytes - uint8x8_t latin1_packed = vmovn_u16(utf16_packed); - // 2. store (8 bytes) - vst1_u8(reinterpret_cast(latin1_output), latin1_packed); - // 3. adjust pointers - buf += 8; - latin1_output += 8; - } else { - return std::make_pair(nullptr, reinterpret_cast(latin1_output)); - } - } // while - return std::make_pair(buf, latin1_output); +simdutf_warn_unused size_t implementation::utf16_length_from_utf8( + const char *input, size_t length) const noexcept { + size_t pos = 0; + size_t count = 0; + // This algorithm could no doubt be improved! + for (; pos + 64 <= length; pos += 64) { + __m512i utf8 = _mm512_loadu_si512((const __m512i *)(input + pos)); + uint64_t utf8_continuation_mask = + _mm512_cmplt_epi8_mask(utf8, _mm512_set1_epi8(-65 + 1)); + // We count one word for anything that is not a continuation (so + // leading bytes). + count += 64 - count_ones(utf8_continuation_mask); + uint64_t utf8_4byte = + _mm512_cmpge_epu8_mask(utf8, _mm512_set1_epi8(int8_t(240))); + count += count_ones(utf8_4byte); + } + return count + + scalar::utf8::utf16_length_from_utf8(input + pos, length - pos); } -std::pair -arm_convert_utf32_to_latin1_with_errors(const char32_t *buf, size_t len, - char *latin1_output) { - const char32_t *start = buf; - const char32_t *end = buf + len; +simdutf_warn_unused size_t implementation::utf8_length_from_utf32( + const char32_t *input, size_t length) const noexcept { + const char32_t *ptr = input; + size_t count{0}; - while (end - buf >= 8) { - uint32x4_t in1 = vld1q_u32(reinterpret_cast(buf)); - uint32x4_t in2 = vld1q_u32(reinterpret_cast(buf + 4)); + if (length >= 16) { + const char32_t *end = input + length - 16; - uint16x8_t utf16_packed = vcombine_u16(vqmovn_u32(in1), vqmovn_u32(in2)); + const __m512i v_0000_007f = _mm512_set1_epi32((uint32_t)0x7f); + const __m512i v_0000_07ff = _mm512_set1_epi32((uint32_t)0x7ff); + const __m512i v_0000_ffff = _mm512_set1_epi32((uint32_t)0x0000ffff); - if (vmaxvq_u16(utf16_packed) <= 0xff) { - // 1. pack the bytes - uint8x8_t latin1_packed = vmovn_u16(utf16_packed); - // 2. store (8 bytes) - vst1_u8(reinterpret_cast(latin1_output), latin1_packed); - // 3. adjust pointers - buf += 8; - latin1_output += 8; - } else { - // Let us do a scalar fallback. - for (int k = 0; k < 8; k++) { - uint32_t word = buf[k]; - if (word <= 0xff) { - *latin1_output++ = char(word); - } else { - return std::make_pair(result(error_code::TOO_LARGE, buf - start + k), - latin1_output); - } - } + while (ptr <= end) { + __m512i utf32 = _mm512_loadu_si512((const __m512i *)ptr); + ptr += 16; + __mmask16 ascii_bitmask = _mm512_cmple_epu32_mask(utf32, v_0000_007f); + __mmask16 two_bytes_bitmask = _mm512_mask_cmple_epu32_mask( + _knot_mask16(ascii_bitmask), utf32, v_0000_07ff); + __mmask16 three_bytes_bitmask = _mm512_mask_cmple_epu32_mask( + _knot_mask16(_mm512_kor(ascii_bitmask, two_bytes_bitmask)), utf32, + v_0000_ffff); + + size_t ascii_count = count_ones(ascii_bitmask); + size_t two_bytes_count = count_ones(two_bytes_bitmask); + size_t three_bytes_count = count_ones(three_bytes_bitmask); + size_t four_bytes_count = + 16 - ascii_count - two_bytes_count - three_bytes_count; + count += ascii_count + 2 * two_bytes_count + 3 * three_bytes_count + + 4 * four_bytes_count; } - } // while - return std::make_pair(result(error_code::SUCCESS, buf - start), - latin1_output); + } + + return count + + scalar::utf32::utf8_length_from_utf32(ptr, length - (ptr - input)); } -/* end file src/arm64/arm_convert_utf32_to_latin1.cpp */ -/* begin file src/arm64/arm_convert_utf32_to_utf16.cpp */ -template -std::pair -arm_convert_utf32_to_utf16(const char32_t *buf, size_t len, - char16_t *utf16_out) { - uint16_t *utf16_output = reinterpret_cast(utf16_out); - const char32_t *end = buf + len; - uint16x4_t forbidden_bytemask = vmov_n_u16(0x0); +simdutf_warn_unused size_t implementation::utf16_length_from_utf32( + const char32_t *input, size_t length) const noexcept { + const char32_t *ptr = input; + size_t count{0}; - while (end - buf >= 4) { - uint32x4_t in = vld1q_u32(reinterpret_cast(buf)); + if (length >= 16) { + const char32_t *end = input + length - 16; - // Check if no bits set above 16th - if (vmaxvq_u32(in) <= 0xFFFF) { - uint16x4_t utf16_packed = vmovn_u32(in); + const __m512i v_0000_ffff = _mm512_set1_epi32((uint32_t)0x0000ffff); - const uint16x4_t v_d800 = vmov_n_u16((uint16_t)0xd800); - const uint16x4_t v_dfff = vmov_n_u16((uint16_t)0xdfff); - forbidden_bytemask = vorr_u16(vand_u16(vcle_u16(utf16_packed, v_dfff), - vcge_u16(utf16_packed, v_d800)), - forbidden_bytemask); + while (ptr <= end) { + __m512i utf32 = _mm512_loadu_si512((const __m512i *)ptr); + ptr += 16; + __mmask16 surrogates_bitmask = + _mm512_cmpgt_epu32_mask(utf32, v_0000_ffff); - if (!match_system(big_endian)) { - utf16_packed = - vreinterpret_u16_u8(vrev16_u8(vreinterpret_u8_u16(utf16_packed))); - } - vst1_u16(utf16_output, utf16_packed); - utf16_output += 4; - buf += 4; - } else { - size_t forward = 3; - size_t k = 0; - if (size_t(end - buf) < forward + 1) { - forward = size_t(end - buf - 1); - } - for (; k < forward; k++) { - uint32_t word = buf[k]; - if ((word & 0xFFFF0000) == 0) { - // will not generate a surrogate pair - if (word >= 0xD800 && word <= 0xDFFF) { - return std::make_pair(nullptr, - reinterpret_cast(utf16_output)); - } - *utf16_output++ = !match_system(big_endian) - ? char16_t(word >> 8 | word << 8) - : char16_t(word); - } else { - // will generate a surrogate pair - if (word > 0x10FFFF) { - return std::make_pair(nullptr, - reinterpret_cast(utf16_output)); - } - word -= 0x10000; - uint16_t high_surrogate = uint16_t(0xD800 + (word >> 10)); - uint16_t low_surrogate = uint16_t(0xDC00 + (word & 0x3FF)); - if (!match_system(big_endian)) { - high_surrogate = - uint16_t(high_surrogate >> 8 | high_surrogate << 8); - low_surrogate = uint16_t(low_surrogate << 8 | low_surrogate >> 8); - } - *utf16_output++ = char16_t(high_surrogate); - *utf16_output++ = char16_t(low_surrogate); - } - } - buf += k; + count += 16 + count_ones(surrogates_bitmask); } } - // check for invalid input - if (vmaxv_u16(forbidden_bytemask) != 0) { - return std::make_pair(nullptr, reinterpret_cast(utf16_output)); - } - - return std::make_pair(buf, reinterpret_cast(utf16_output)); + return count + + scalar::utf32::utf16_length_from_utf32(ptr, length - (ptr - input)); } -template -std::pair -arm_convert_utf32_to_utf16_with_errors(const char32_t *buf, size_t len, - char16_t *utf16_out) { - uint16_t *utf16_output = reinterpret_cast(utf16_out); - const char32_t *start = buf; - const char32_t *end = buf + len; - - while (end - buf >= 4) { - uint32x4_t in = vld1q_u32(reinterpret_cast(buf)); +simdutf_warn_unused size_t implementation::utf32_length_from_utf8( + const char *input, size_t length) const noexcept { + return implementation::count_utf8(input, length); +} - // Check if no bits set above 16th - if (vmaxvq_u32(in) <= 0xFFFF) { - uint16x4_t utf16_packed = vmovn_u32(in); +simdutf_warn_unused size_t implementation::maximal_binary_length_from_base64( + const char *input, size_t length) const noexcept { + return scalar::base64::maximal_binary_length_from_base64(input, length); +} - const uint16x4_t v_d800 = vmov_n_u16((uint16_t)0xd800); - const uint16x4_t v_dfff = vmov_n_u16((uint16_t)0xdfff); - const uint16x4_t forbidden_bytemask = vand_u16( - vcle_u16(utf16_packed, v_dfff), vcge_u16(utf16_packed, v_d800)); - if (vmaxv_u16(forbidden_bytemask) != 0) { - return std::make_pair(result(error_code::SURROGATE, buf - start), - reinterpret_cast(utf16_output)); - } +simdutf_warn_unused result implementation::base64_to_binary( + const char *input, size_t length, char *output, base64_options options, + last_chunk_handling_options last_chunk_options) const noexcept { + if (options & base64_url) { + if (options == base64_options::base64_url_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } + } else { + if (options == base64_options::base64_default_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, + options, last_chunk_options); + } + } +} - if (!match_system(big_endian)) { - utf16_packed = - vreinterpret_u16_u8(vrev16_u8(vreinterpret_u8_u16(utf16_packed))); - } - vst1_u16(utf16_output, utf16_packed); - utf16_output += 4; - buf += 4; +simdutf_warn_unused full_result implementation::base64_to_binary_details( + const char *input, size_t length, char *output, base64_options options, + last_chunk_handling_options last_chunk_options) const noexcept { + if (options & base64_url) { + if (options == base64_options::base64_url_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); } else { - size_t forward = 3; - size_t k = 0; - if (size_t(end - buf) < forward + 1) { - forward = size_t(end - buf - 1); - } - for (; k < forward; k++) { - uint32_t word = buf[k]; - if ((word & 0xFFFF0000) == 0) { - // will not generate a surrogate pair - if (word >= 0xD800 && word <= 0xDFFF) { - return std::make_pair( - result(error_code::SURROGATE, buf - start + k), - reinterpret_cast(utf16_output)); - } - *utf16_output++ = !match_system(big_endian) - ? char16_t(word >> 8 | word << 8) - : char16_t(word); - } else { - // will generate a surrogate pair - if (word > 0x10FFFF) { - return std::make_pair( - result(error_code::TOO_LARGE, buf - start + k), - reinterpret_cast(utf16_output)); - } - word -= 0x10000; - uint16_t high_surrogate = uint16_t(0xD800 + (word >> 10)); - uint16_t low_surrogate = uint16_t(0xDC00 + (word & 0x3FF)); - if (!match_system(big_endian)) { - high_surrogate = - uint16_t(high_surrogate >> 8 | high_surrogate << 8); - low_surrogate = uint16_t(low_surrogate << 8 | low_surrogate >> 8); - } - *utf16_output++ = char16_t(high_surrogate); - *utf16_output++ = char16_t(low_surrogate); - } - } - buf += k; + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } + } else { + if (options == base64_options::base64_default_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, + options, last_chunk_options); } } +} - return std::make_pair(result(error_code::SUCCESS, buf - start), - reinterpret_cast(utf16_output)); +simdutf_warn_unused size_t implementation::maximal_binary_length_from_base64( + const char16_t *input, size_t length) const noexcept { + return scalar::base64::maximal_binary_length_from_base64(input, length); } -/* end file src/arm64/arm_convert_utf32_to_utf16.cpp */ -/* begin file src/arm64/arm_convert_utf32_to_utf8.cpp */ -std::pair -arm_convert_utf32_to_utf8(const char32_t *buf, size_t len, char *utf8_out) { - uint8_t *utf8_output = reinterpret_cast(utf8_out); - const char32_t *end = buf + len; - const uint16x8_t v_c080 = vmovq_n_u16((uint16_t)0xc080); +simdutf_warn_unused result implementation::base64_to_binary( + const char16_t *input, size_t length, char *output, base64_options options, + last_chunk_handling_options last_chunk_options) const noexcept { + if (options & base64_url) { + if (options == base64_options::base64_url_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } + } else { + if (options == base64_options::base64_default_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, + options, last_chunk_options); + } + } +} - uint16x8_t forbidden_bytemask = vmovq_n_u16(0x0); - const size_t safety_margin = - 12; // to avoid overruns, see issue - // https://github.com/simdutf/simdutf/issues/92 +simdutf_warn_unused full_result implementation::base64_to_binary_details( + const char16_t *input, size_t length, char *output, base64_options options, + last_chunk_handling_options last_chunk_options) const noexcept { + if (options & base64_url) { + if (options == base64_options::base64_url_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } + } else { + if (options == base64_options::base64_default_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, + options, last_chunk_options); + } + } +} - while (buf + 16 + safety_margin < end) { - uint32x4_t in = vld1q_u32(reinterpret_cast(buf)); - uint32x4_t nextin = vld1q_u32(reinterpret_cast(buf + 4)); +simdutf_warn_unused size_t implementation::base64_length_from_binary( + size_t length, base64_options options) const noexcept { + return scalar::base64::base64_length_from_binary(length, options); +} - // Check if no bits set above 16th - if (vmaxvq_u32(vorrq_u32(in, nextin)) <= 0xFFFF) { - // Pack UTF-32 to UTF-16 safely (without surrogate pairs) - // Apply UTF-16 => UTF-8 routine (arm_convert_utf16_to_utf8.cpp) - uint16x8_t utf16_packed = vcombine_u16(vmovn_u32(in), vmovn_u32(nextin)); - if (vmaxvq_u16(utf16_packed) <= 0x7F) { // ASCII fast path!!!! - // 1. pack the bytes - // obviously suboptimal. - uint8x8_t utf8_packed = vmovn_u16(utf16_packed); - // 2. store (8 bytes) - vst1_u8(utf8_output, utf8_packed); - // 3. adjust pointers - buf += 8; - utf8_output += 8; - continue; // we are done for this round! - } +size_t implementation::binary_to_base64(const char *input, size_t length, + char *output, + base64_options options) const noexcept { + if (options & base64_url) { + return encode_base64(output, input, length, options); + } else { + return encode_base64(output, input, length, options); + } +} - if (vmaxvq_u16(utf16_packed) <= 0x7FF) { - // 1. prepare 2-byte values - // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8 - // expected output : [110a|aaaa|10bb|bbbb] x 8 - const uint16x8_t v_1f00 = vmovq_n_u16((int16_t)0x1f00); - const uint16x8_t v_003f = vmovq_n_u16((int16_t)0x003f); +} // namespace icelake +} // namespace simdutf - // t0 = [000a|aaaa|bbbb|bb00] - const uint16x8_t t0 = vshlq_n_u16(utf16_packed, 2); - // t1 = [000a|aaaa|0000|0000] - const uint16x8_t t1 = vandq_u16(t0, v_1f00); - // t2 = [0000|0000|00bb|bbbb] - const uint16x8_t t2 = vandq_u16(utf16_packed, v_003f); - // t3 = [000a|aaaa|00bb|bbbb] - const uint16x8_t t3 = vorrq_u16(t1, t2); - // t4 = [110a|aaaa|10bb|bbbb] - const uint16x8_t t4 = vorrq_u16(t3, v_c080); - // 2. merge ASCII and 2-byte codewords - const uint16x8_t v_007f = vmovq_n_u16((uint16_t)0x007F); - const uint16x8_t one_byte_bytemask = vcleq_u16(utf16_packed, v_007f); - const uint8x16_t utf8_unpacked = vreinterpretq_u8_u16( - vbslq_u16(one_byte_bytemask, utf16_packed, t4)); - // 3. prepare bitmask for 8-bit lookup -#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO - const uint16x8_t mask = simdutf_make_uint16x8_t( - 0x0001, 0x0004, 0x0010, 0x0040, 0x0002, 0x0008, 0x0020, 0x0080); +/* begin file src/simdutf/icelake/end.h */ +#if SIMDUTF_CAN_ALWAYS_RUN_ICELAKE +// nothing needed. #else - const uint16x8_t mask = {0x0001, 0x0004, 0x0010, 0x0040, - 0x0002, 0x0008, 0x0020, 0x0080}; +SIMDUTF_UNTARGET_REGION #endif - uint16_t m2 = vaddvq_u16(vandq_u16(one_byte_bytemask, mask)); - // 4. pack the bytes - const uint8_t *row = - &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[m2][0]; - const uint8x16_t shuffle = vld1q_u8(row + 1); - const uint8x16_t utf8_packed = vqtbl1q_u8(utf8_unpacked, shuffle); - // 5. store bytes - vst1q_u8(utf8_output, utf8_packed); - // 6. adjust pointers - buf += 8; - utf8_output += row[0]; - continue; - } else { - // case: code units from register produce either 1, 2 or 3 UTF-8 bytes - const uint16x8_t v_d800 = vmovq_n_u16((uint16_t)0xd800); - const uint16x8_t v_dfff = vmovq_n_u16((uint16_t)0xdfff); - forbidden_bytemask = - vorrq_u16(vandq_u16(vcleq_u16(utf16_packed, v_dfff), - vcgeq_u16(utf16_packed, v_d800)), - forbidden_bytemask); +#if SIMDUTF_GCC11ORMORE // workaround for + // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105593 +SIMDUTF_POP_DISABLE_WARNINGS +#endif // end of workaround +/* end file src/simdutf/icelake/end.h */ +/* end file src/icelake/implementation.cpp */ +#endif +#if SIMDUTF_IMPLEMENTATION_HASWELL +/* begin file src/haswell/implementation.cpp */ -#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO - const uint16x8_t dup_even = simdutf_make_uint16x8_t( - 0x0000, 0x0202, 0x0404, 0x0606, 0x0808, 0x0a0a, 0x0c0c, 0x0e0e); +/* begin file src/simdutf/haswell/begin.h */ +// redefining SIMDUTF_IMPLEMENTATION to "haswell" +// #define SIMDUTF_IMPLEMENTATION haswell + +#if SIMDUTF_CAN_ALWAYS_RUN_HASWELL +// nothing needed. #else - const uint16x8_t dup_even = {0x0000, 0x0202, 0x0404, 0x0606, - 0x0808, 0x0a0a, 0x0c0c, 0x0e0e}; +SIMDUTF_TARGET_HASWELL #endif - /* In this branch we handle three cases: - 1. [0000|0000|0ccc|cccc] => [0ccc|cccc] - - single UFT-8 byte - 2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc] - - two UTF-8 bytes - 3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - - three UTF-8 bytes - We expand the input word (16-bit) into two code units (32-bit), thus - we have room for four bytes. However, we need five distinct bit - layouts. Note that the last byte in cases #2 and #3 is the same. +#if SIMDUTF_GCC11ORMORE // workaround for + // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105593 +// clang-format off +SIMDUTF_DISABLE_GCC_WARNING(-Wmaybe-uninitialized) +// clang-format on +#endif // end of workaround +/* end file src/simdutf/haswell/begin.h */ +namespace simdutf { +namespace haswell { +namespace { +#ifndef SIMDUTF_HASWELL_H + #error "haswell.h must be included" +#endif +using namespace simd; - We precompute byte 1 for case #1 and the common byte for cases #2 & #3 - in register t2. +simdutf_really_inline bool is_ascii(const simd8x64 &input) { + return input.reduce_or().is_ascii(); +} - We precompute byte 1 for case #3 and -- **conditionally** -- - precompute either byte 1 for case #2 or byte 2 for case #3. Note that - they differ by exactly one bit. +simdutf_unused simdutf_really_inline simd8 +must_be_continuation(const simd8 prev1, const simd8 prev2, + const simd8 prev3) { + simd8 is_second_byte = + prev1.saturating_sub(0b11000000u - 1); // Only 11______ will be > 0 + simd8 is_third_byte = + prev2.saturating_sub(0b11100000u - 1); // Only 111_____ will be > 0 + simd8 is_fourth_byte = + prev3.saturating_sub(0b11110000u - 1); // Only 1111____ will be > 0 + // Caller requires a bool (all 1's). All values resulting from the subtraction + // will be <= 64, so signed comparison is fine. + return simd8(is_second_byte | is_third_byte | is_fourth_byte) > + int8_t(0); +} - Finally from these two code units we build proper UTF-8 sequence, - taking into account the case (i.e, the number of bytes to write). - */ - /** - * Given [aaaa|bbbb|bbcc|cccc] our goal is to produce: - * t2 => [0ccc|cccc] [10cc|cccc] - * s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb]) - */ -#define simdutf_vec(x) vmovq_n_u16(static_cast(x)) - // [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc] - const uint16x8_t t0 = - vreinterpretq_u16_u8(vqtbl1q_u8(vreinterpretq_u8_u16(utf16_packed), - vreinterpretq_u8_u16(dup_even))); - // [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc] - const uint16x8_t t1 = vandq_u16(t0, simdutf_vec(0b0011111101111111)); - // [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc] - const uint16x8_t t2 = vorrq_u16(t1, simdutf_vec(0b1000000000000000)); +simdutf_really_inline simd8 +must_be_2_3_continuation(const simd8 prev2, + const simd8 prev3) { + simd8 is_third_byte = + prev2.saturating_sub(0xe0u - 0x80); // Only 111_____ will be > 0x80 + simd8 is_fourth_byte = + prev3.saturating_sub(0xf0u - 0x80); // Only 1111____ will be > 0x80 + return simd8(is_third_byte | is_fourth_byte); +} - // s0: [aaaa|bbbb|bbcc|cccc] => [0000|0000|0000|aaaa] - const uint16x8_t s0 = vshrq_n_u16(utf16_packed, 12); - // s1: [aaaa|bbbb|bbcc|cccc] => [0000|bbbb|bb00|0000] - const uint16x8_t s1 = - vandq_u16(utf16_packed, simdutf_vec(0b0000111111000000)); - // [0000|bbbb|bb00|0000] => [00bb|bbbb|0000|0000] - const uint16x8_t s1s = vshlq_n_u16(s1, 2); - // [00bb|bbbb|0000|aaaa] - const uint16x8_t s2 = vorrq_u16(s0, s1s); - // s3: [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa] - const uint16x8_t s3 = vorrq_u16(s2, simdutf_vec(0b1100000011100000)); - const uint16x8_t v_07ff = vmovq_n_u16((uint16_t)0x07FF); - const uint16x8_t one_or_two_bytes_bytemask = - vcleq_u16(utf16_packed, v_07ff); - const uint16x8_t m0 = vbicq_u16(simdutf_vec(0b0100000000000000), - one_or_two_bytes_bytemask); - const uint16x8_t s4 = veorq_u16(s3, m0); -#undef simdutf_vec +/* begin file src/haswell/avx2_validate_utf16.cpp */ +/* + In UTF-16 code units in range 0xD800 to 0xDFFF have special meaning. - // 4. expand code units 16-bit => 32-bit - const uint8x16_t out0 = vreinterpretq_u8_u16(vzip1q_u16(t2, s4)); - const uint8x16_t out1 = vreinterpretq_u8_u16(vzip2q_u16(t2, s4)); + In a vectorized algorithm we want to examine the most significant + nibble in order to select a fast path. If none of highest nibbles + are 0xD (13), than we are sure that UTF-16 chunk in a vector + register is valid. - // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle - const uint16x8_t v_007f = vmovq_n_u16((uint16_t)0x007F); - const uint16x8_t one_byte_bytemask = vcleq_u16(utf16_packed, v_007f); -#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO - const uint16x8_t onemask = simdutf_make_uint16x8_t( - 0x0001, 0x0004, 0x0010, 0x0040, 0x0100, 0x0400, 0x1000, 0x4000); - const uint16x8_t twomask = simdutf_make_uint16x8_t( - 0x0002, 0x0008, 0x0020, 0x0080, 0x0200, 0x0800, 0x2000, 0x8000); -#else - const uint16x8_t onemask = {0x0001, 0x0004, 0x0010, 0x0040, - 0x0100, 0x0400, 0x1000, 0x4000}; - const uint16x8_t twomask = {0x0002, 0x0008, 0x0020, 0x0080, - 0x0200, 0x0800, 0x2000, 0x8000}; -#endif - const uint16x8_t combined = - vorrq_u16(vandq_u16(one_byte_bytemask, onemask), - vandq_u16(one_or_two_bytes_bytemask, twomask)); - const uint16_t mask = vaddvq_u16(combined); - // The following fast path may or may not be beneficial. - /*if(mask == 0) { - // We only have three-byte code units. Use fast path. - const uint8x16_t shuffle = {2,3,1,6,7,5,10,11,9,14,15,13,0,0,0,0}; - const uint8x16_t utf8_0 = vqtbl1q_u8(out0, shuffle); - const uint8x16_t utf8_1 = vqtbl1q_u8(out1, shuffle); - vst1q_u8(utf8_output, utf8_0); - utf8_output += 12; - vst1q_u8(utf8_output, utf8_1); - utf8_output += 12; - buf += 8; - continue; - }*/ - const uint8_t mask0 = uint8_t(mask); - const uint8_t *row0 = - &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask0][0]; - const uint8x16_t shuffle0 = vld1q_u8(row0 + 1); - const uint8x16_t utf8_0 = vqtbl1q_u8(out0, shuffle0); + Let us analyze what we need to check if the nibble is 0xD. The + value of the preceding nibble determines what we have: + + 0xd000 .. 0xd7ff - a valid word + 0xd800 .. 0xdbff - low surrogate + 0xdc00 .. 0xdfff - high surrogate + + Other constraints we have to consider: + - there must not be two consecutive low surrogates (0xd800 .. 0xdbff) + - there must not be two consecutive high surrogates (0xdc00 .. 0xdfff) + - there must not be sole low surrogate nor high surrogate - const uint8_t mask1 = static_cast(mask >> 8); - const uint8_t *row1 = - &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask1][0]; - const uint8x16_t shuffle1 = vld1q_u8(row1 + 1); - const uint8x16_t utf8_1 = vqtbl1q_u8(out1, shuffle1); + We're going to build three bitmasks based on the 3rd nibble: + - V = valid word, + - L = low surrogate (0xd800 .. 0xdbff) + - H = high surrogate (0xdc00 .. 0xdfff) - vst1q_u8(utf8_output, utf8_0); - utf8_output += row0[0]; - vst1q_u8(utf8_output, utf8_1); - utf8_output += row1[0]; + 0 1 2 3 4 5 6 7 <--- word index + [ V | L | H | L | H | V | V | L ] + 1 0 0 0 0 1 1 0 - V = valid masks + 0 1 0 1 0 0 0 1 - L = low surrogate + 0 0 1 0 1 0 0 0 - H high surrogate - buf += 8; - } - // At least one 32-bit word will produce a surrogate pair in UTF-16 <=> - // will produce four UTF-8 bytes. - } else { - // Let us do a scalar fallback. - // It may seem wasteful to use scalar code, but being efficient with SIMD - // in the presence of surrogate pairs may require non-trivial tables. - size_t forward = 15; - size_t k = 0; - if (size_t(end - buf) < forward + 1) { - forward = size_t(end - buf - 1); - } - for (; k < forward; k++) { - uint32_t word = buf[k]; - if ((word & 0xFFFFFF80) == 0) { - *utf8_output++ = char(word); - } else if ((word & 0xFFFFF800) == 0) { - *utf8_output++ = char((word >> 6) | 0b11000000); - *utf8_output++ = char((word & 0b111111) | 0b10000000); - } else if ((word & 0xFFFF0000) == 0) { - if (word >= 0xD800 && word <= 0xDFFF) { - return std::make_pair(nullptr, - reinterpret_cast(utf8_output)); - } - *utf8_output++ = char((word >> 12) | 0b11100000); - *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); - *utf8_output++ = char((word & 0b111111) | 0b10000000); - } else { - if (word > 0x10FFFF) { - return std::make_pair(nullptr, - reinterpret_cast(utf8_output)); - } - *utf8_output++ = char((word >> 18) | 0b11110000); - *utf8_output++ = char(((word >> 12) & 0b111111) | 0b10000000); - *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); - *utf8_output++ = char((word & 0b111111) | 0b10000000); - } - } - buf += k; - } - } // while - // check for invalid input - if (vmaxvq_u16(forbidden_bytemask) != 0) { - return std::make_pair(nullptr, reinterpret_cast(utf8_output)); - } - return std::make_pair(buf, reinterpret_cast(utf8_output)); -} + 1 0 0 0 0 1 1 0 V = valid masks + 0 1 0 1 0 0 0 0 a = L & (H >> 1) + 0 0 1 0 1 0 0 0 b = a << 1 + 1 1 1 1 1 1 1 0 c = V | a | b + ^ + the last bit can be zero, we just consume 7 + code units and recheck this word in the next iteration +*/ -std::pair -arm_convert_utf32_to_utf8_with_errors(const char32_t *buf, size_t len, - char *utf8_out) { - uint8_t *utf8_output = reinterpret_cast(utf8_out); - const char32_t *start = buf; - const char32_t *end = buf + len; +/* Returns: + - pointer to the last unprocessed character (a scalar fallback should check + the rest); + - nullptr if an error was detected. +*/ +template +const char16_t *avx2_validate_utf16(const char16_t *input, size_t size) { + const char16_t *end = input + size; - const uint16x8_t v_c080 = vmovq_n_u16((uint16_t)0xc080); - const size_t safety_margin = - 12; // to avoid overruns, see issue - // https://github.com/simdutf/simdutf/issues/92 + const auto v_d8 = simd8::splat(0xd8); + const auto v_f8 = simd8::splat(0xf8); + const auto v_fc = simd8::splat(0xfc); + const auto v_dc = simd8::splat(0xdc); - while (buf + 16 + safety_margin < end) { - uint32x4_t in = vld1q_u32(reinterpret_cast(buf)); - uint32x4_t nextin = vld1q_u32(reinterpret_cast(buf + 4)); + while (input + simd16::ELEMENTS * 2 < end) { + // 0. Load data: since the validation takes into account only higher + // byte of each word, we compress the two vectors into one which + // consists only the higher bytes. + auto in0 = simd16(input); + auto in1 = simd16(input + simd16::ELEMENTS); - // Check if no bits set above 16th - if (vmaxvq_u32(vorrq_u32(in, nextin)) <= 0xFFFF) { - // Pack UTF-32 to UTF-16 safely (without surrogate pairs) - // Apply UTF-16 => UTF-8 routine (arm_convert_utf16_to_utf8.cpp) - uint16x8_t utf16_packed = vcombine_u16(vmovn_u32(in), vmovn_u32(nextin)); - if (vmaxvq_u16(utf16_packed) <= 0x7F) { // ASCII fast path!!!! - // 1. pack the bytes - // obviously suboptimal. - uint8x8_t utf8_packed = vmovn_u16(utf16_packed); - // 2. store (8 bytes) - vst1_u8(utf8_output, utf8_packed); - // 3. adjust pointers - buf += 8; - utf8_output += 8; - continue; // we are done for this round! - } + if (big_endian) { + in0 = in0.swap_bytes(); + in1 = in1.swap_bytes(); + } - if (vmaxvq_u16(utf16_packed) <= 0x7FF) { - // 1. prepare 2-byte values - // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8 - // expected output : [110a|aaaa|10bb|bbbb] x 8 - const uint16x8_t v_1f00 = vmovq_n_u16((int16_t)0x1f00); - const uint16x8_t v_003f = vmovq_n_u16((int16_t)0x003f); + const auto t0 = in0.shr<8>(); + const auto t1 = in1.shr<8>(); - // t0 = [000a|aaaa|bbbb|bb00] - const uint16x8_t t0 = vshlq_n_u16(utf16_packed, 2); - // t1 = [000a|aaaa|0000|0000] - const uint16x8_t t1 = vandq_u16(t0, v_1f00); - // t2 = [0000|0000|00bb|bbbb] - const uint16x8_t t2 = vandq_u16(utf16_packed, v_003f); - // t3 = [000a|aaaa|00bb|bbbb] - const uint16x8_t t3 = vorrq_u16(t1, t2); - // t4 = [110a|aaaa|10bb|bbbb] - const uint16x8_t t4 = vorrq_u16(t3, v_c080); - // 2. merge ASCII and 2-byte codewords - const uint16x8_t v_007f = vmovq_n_u16((uint16_t)0x007F); - const uint16x8_t one_byte_bytemask = vcleq_u16(utf16_packed, v_007f); - const uint8x16_t utf8_unpacked = vreinterpretq_u8_u16( - vbslq_u16(one_byte_bytemask, utf16_packed, t4)); - // 3. prepare bitmask for 8-bit lookup -#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO - const uint16x8_t mask = simdutf_make_uint16x8_t( - 0x0001, 0x0004, 0x0010, 0x0040, 0x0002, 0x0008, 0x0020, 0x0080); -#else - const uint16x8_t mask = {0x0001, 0x0004, 0x0010, 0x0040, - 0x0002, 0x0008, 0x0020, 0x0080}; -#endif - uint16_t m2 = vaddvq_u16(vandq_u16(one_byte_bytemask, mask)); - // 4. pack the bytes - const uint8_t *row = - &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[m2][0]; - const uint8x16_t shuffle = vld1q_u8(row + 1); - const uint8x16_t utf8_packed = vqtbl1q_u8(utf8_unpacked, shuffle); + const auto in = simd16::pack(t0, t1); - // 5. store bytes - vst1q_u8(utf8_output, utf8_packed); + // 1. Check whether we have any 0xD800..DFFF word (0b1101'1xxx'yyyy'yyyy). + const auto surrogates_wordmask = (in & v_f8) == v_d8; + const uint32_t surrogates_bitmask = surrogates_wordmask.to_bitmask(); + if (surrogates_bitmask == 0x0) { + input += simd16::ELEMENTS * 2; + } else { + // 2. We have some surrogates that have to be distinguished: + // - low surrogates: 0b1101'10xx'yyyy'yyyy (0xD800..0xDBFF) + // - high surrogates: 0b1101'11xx'yyyy'yyyy (0xDC00..0xDFFF) + // + // Fact: high surrogate has 11th bit set (3rd bit in the higher word) - // 6. adjust pointers - buf += 8; - utf8_output += row[0]; - continue; + // V - non-surrogate code units + // V = not surrogates_wordmask + const uint32_t V = ~surrogates_bitmask; + + // H - word-mask for high surrogates: the six highest bits are 0b1101'11 + const auto vH = (in & v_fc) == v_dc; + const uint32_t H = vH.to_bitmask(); + + // L - word mask for low surrogates + // L = not H and surrogates_wordmask + const uint32_t L = ~H & surrogates_bitmask; + + const uint32_t a = + L & (H >> 1); // A low surrogate must be followed by high one. + // (A low surrogate placed in the 7th register's word + // is an exception we handle.) + const uint32_t b = + a << 1; // Just mark that the opposite fact is hold, + // thanks to that we have only two masks for valid case. + const uint32_t c = V | a | b; // Combine all the masks into the final one. + + if (c == 0xffffffff) { + // The whole input register contains valid UTF-16, i.e., + // either single code units or proper surrogate pairs. + input += simd16::ELEMENTS * 2; + } else if (c == 0x7fffffff) { + // The 31 lower code units of the input register contains valid UTF-16. + // The 31 word may be either a low or high surrogate. It the next + // iteration we 1) check if the low surrogate is followed by a high + // one, 2) reject sole high surrogate. + input += simd16::ELEMENTS * 2 - 1; } else { - // case: code units from register produce either 1, 2 or 3 UTF-8 bytes + return nullptr; + } + } + } - // check for invalid input - const uint16x8_t v_d800 = vmovq_n_u16((uint16_t)0xd800); - const uint16x8_t v_dfff = vmovq_n_u16((uint16_t)0xdfff); - const uint16x8_t forbidden_bytemask = vandq_u16( - vcleq_u16(utf16_packed, v_dfff), vcgeq_u16(utf16_packed, v_d800)); - if (vmaxvq_u16(forbidden_bytemask) != 0) { - return std::make_pair(result(error_code::SURROGATE, buf - start), - reinterpret_cast(utf8_output)); - } + return input; +} -#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO - const uint16x8_t dup_even = simdutf_make_uint16x8_t( - 0x0000, 0x0202, 0x0404, 0x0606, 0x0808, 0x0a0a, 0x0c0c, 0x0e0e); -#else - const uint16x8_t dup_even = {0x0000, 0x0202, 0x0404, 0x0606, - 0x0808, 0x0a0a, 0x0c0c, 0x0e0e}; -#endif - /* In this branch we handle three cases: - 1. [0000|0000|0ccc|cccc] => [0ccc|cccc] - - single UFT-8 byte - 2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc] - - two UTF-8 bytes - 3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - - three UTF-8 bytes +template +const result avx2_validate_utf16_with_errors(const char16_t *input, + size_t size) { + if (simdutf_unlikely(size == 0)) { + return result(error_code::SUCCESS, 0); + } + const char16_t *start = input; + const char16_t *end = input + size; - We expand the input word (16-bit) into two code units (32-bit), thus - we have room for four bytes. However, we need five distinct bit - layouts. Note that the last byte in cases #2 and #3 is the same. + const auto v_d8 = simd8::splat(0xd8); + const auto v_f8 = simd8::splat(0xf8); + const auto v_fc = simd8::splat(0xfc); + const auto v_dc = simd8::splat(0xdc); - We precompute byte 1 for case #1 and the common byte for cases #2 & #3 - in register t2. + while (input + simd16::ELEMENTS * 2 < end) { + // 0. Load data: since the validation takes into account only higher + // byte of each word, we compress the two vectors into one which + // consists only the higher bytes. + auto in0 = simd16(input); + auto in1 = simd16(input + simd16::ELEMENTS); - We precompute byte 1 for case #3 and -- **conditionally** -- - precompute either byte 1 for case #2 or byte 2 for case #3. Note that - they differ by exactly one bit. + if (big_endian) { + in0 = in0.swap_bytes(); + in1 = in1.swap_bytes(); + } - Finally from these two code units we build proper UTF-8 sequence, - taking into account the case (i.e, the number of bytes to write). - */ - /** - * Given [aaaa|bbbb|bbcc|cccc] our goal is to produce: - * t2 => [0ccc|cccc] [10cc|cccc] - * s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb]) - */ -#define simdutf_vec(x) vmovq_n_u16(static_cast(x)) - // [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc] - const uint16x8_t t0 = - vreinterpretq_u16_u8(vqtbl1q_u8(vreinterpretq_u8_u16(utf16_packed), - vreinterpretq_u8_u16(dup_even))); - // [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc] - const uint16x8_t t1 = vandq_u16(t0, simdutf_vec(0b0011111101111111)); - // [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc] - const uint16x8_t t2 = vorrq_u16(t1, simdutf_vec(0b1000000000000000)); + const auto t0 = in0.shr<8>(); + const auto t1 = in1.shr<8>(); - // s0: [aaaa|bbbb|bbcc|cccc] => [0000|0000|0000|aaaa] - const uint16x8_t s0 = vshrq_n_u16(utf16_packed, 12); - // s1: [aaaa|bbbb|bbcc|cccc] => [0000|bbbb|bb00|0000] - const uint16x8_t s1 = - vandq_u16(utf16_packed, simdutf_vec(0b0000111111000000)); - // [0000|bbbb|bb00|0000] => [00bb|bbbb|0000|0000] - const uint16x8_t s1s = vshlq_n_u16(s1, 2); - // [00bb|bbbb|0000|aaaa] - const uint16x8_t s2 = vorrq_u16(s0, s1s); - // s3: [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa] - const uint16x8_t s3 = vorrq_u16(s2, simdutf_vec(0b1100000011100000)); - const uint16x8_t v_07ff = vmovq_n_u16((uint16_t)0x07FF); - const uint16x8_t one_or_two_bytes_bytemask = - vcleq_u16(utf16_packed, v_07ff); - const uint16x8_t m0 = vbicq_u16(simdutf_vec(0b0100000000000000), - one_or_two_bytes_bytemask); - const uint16x8_t s4 = veorq_u16(s3, m0); -#undef simdutf_vec + const auto in = simd16::pack(t0, t1); - // 4. expand code units 16-bit => 32-bit - const uint8x16_t out0 = vreinterpretq_u8_u16(vzip1q_u16(t2, s4)); - const uint8x16_t out1 = vreinterpretq_u8_u16(vzip2q_u16(t2, s4)); + // 1. Check whether we have any 0xD800..DFFF word (0b1101'1xxx'yyyy'yyyy). + const auto surrogates_wordmask = (in & v_f8) == v_d8; + const uint32_t surrogates_bitmask = surrogates_wordmask.to_bitmask(); + if (surrogates_bitmask == 0x0) { + input += simd16::ELEMENTS * 2; + } else { + // 2. We have some surrogates that have to be distinguished: + // - low surrogates: 0b1101'10xx'yyyy'yyyy (0xD800..0xDBFF) + // - high surrogates: 0b1101'11xx'yyyy'yyyy (0xDC00..0xDFFF) + // + // Fact: high surrogate has 11th bit set (3rd bit in the higher word) - // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle - const uint16x8_t v_007f = vmovq_n_u16((uint16_t)0x007F); - const uint16x8_t one_byte_bytemask = vcleq_u16(utf16_packed, v_007f); -#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO - const uint16x8_t onemask = simdutf_make_uint16x8_t( - 0x0001, 0x0004, 0x0010, 0x0040, 0x0100, 0x0400, 0x1000, 0x4000); - const uint16x8_t twomask = simdutf_make_uint16x8_t( - 0x0002, 0x0008, 0x0020, 0x0080, 0x0200, 0x0800, 0x2000, 0x8000); -#else - const uint16x8_t onemask = {0x0001, 0x0004, 0x0010, 0x0040, - 0x0100, 0x0400, 0x1000, 0x4000}; - const uint16x8_t twomask = {0x0002, 0x0008, 0x0020, 0x0080, - 0x0200, 0x0800, 0x2000, 0x8000}; -#endif - const uint16x8_t combined = - vorrq_u16(vandq_u16(one_byte_bytemask, onemask), - vandq_u16(one_or_two_bytes_bytemask, twomask)); - const uint16_t mask = vaddvq_u16(combined); - // The following fast path may or may not be beneficial. - /*if(mask == 0) { - // We only have three-byte code units. Use fast path. - const uint8x16_t shuffle = {2,3,1,6,7,5,10,11,9,14,15,13,0,0,0,0}; - const uint8x16_t utf8_0 = vqtbl1q_u8(out0, shuffle); - const uint8x16_t utf8_1 = vqtbl1q_u8(out1, shuffle); - vst1q_u8(utf8_output, utf8_0); - utf8_output += 12; - vst1q_u8(utf8_output, utf8_1); - utf8_output += 12; - buf += 8; - continue; - }*/ - const uint8_t mask0 = uint8_t(mask); + // V - non-surrogate code units + // V = not surrogates_wordmask + const uint32_t V = ~surrogates_bitmask; - const uint8_t *row0 = - &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask0][0]; - const uint8x16_t shuffle0 = vld1q_u8(row0 + 1); - const uint8x16_t utf8_0 = vqtbl1q_u8(out0, shuffle0); + // H - word-mask for high surrogates: the six highest bits are 0b1101'11 + const auto vH = (in & v_fc) == v_dc; + const uint32_t H = vH.to_bitmask(); - const uint8_t mask1 = static_cast(mask >> 8); - const uint8_t *row1 = - &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask1][0]; - const uint8x16_t shuffle1 = vld1q_u8(row1 + 1); - const uint8x16_t utf8_1 = vqtbl1q_u8(out1, shuffle1); + // L - word mask for low surrogates + // L = not H and surrogates_wordmask + const uint32_t L = ~H & surrogates_bitmask; - vst1q_u8(utf8_output, utf8_0); - utf8_output += row0[0]; - vst1q_u8(utf8_output, utf8_1); - utf8_output += row1[0]; + const uint32_t a = + L & (H >> 1); // A low surrogate must be followed by high one. + // (A low surrogate placed in the 7th register's word + // is an exception we handle.) + const uint32_t b = + a << 1; // Just mark that the opposite fact is hold, + // thanks to that we have only two masks for valid case. + const uint32_t c = V | a | b; // Combine all the masks into the final one. - buf += 8; - } - // At least one 32-bit word will produce a surrogate pair in UTF-16 <=> - // will produce four UTF-8 bytes. - } else { - // Let us do a scalar fallback. - // It may seem wasteful to use scalar code, but being efficient with SIMD - // in the presence of surrogate pairs may require non-trivial tables. - size_t forward = 15; - size_t k = 0; - if (size_t(end - buf) < forward + 1) { - forward = size_t(end - buf - 1); - } - for (; k < forward; k++) { - uint32_t word = buf[k]; - if ((word & 0xFFFFFF80) == 0) { - *utf8_output++ = char(word); - } else if ((word & 0xFFFFF800) == 0) { - *utf8_output++ = char((word >> 6) | 0b11000000); - *utf8_output++ = char((word & 0b111111) | 0b10000000); - } else if ((word & 0xFFFF0000) == 0) { - if (word >= 0xD800 && word <= 0xDFFF) { - return std::make_pair( - result(error_code::SURROGATE, buf - start + k), - reinterpret_cast(utf8_output)); - } - *utf8_output++ = char((word >> 12) | 0b11100000); - *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); - *utf8_output++ = char((word & 0b111111) | 0b10000000); - } else { - if (word > 0x10FFFF) { - return std::make_pair( - result(error_code::TOO_LARGE, buf - start + k), - reinterpret_cast(utf8_output)); - } - *utf8_output++ = char((word >> 18) | 0b11110000); - *utf8_output++ = char(((word >> 12) & 0b111111) | 0b10000000); - *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); - *utf8_output++ = char((word & 0b111111) | 0b10000000); - } + if (c == 0xffffffff) { + // The whole input register contains valid UTF-16, i.e., + // either single code units or proper surrogate pairs. + input += simd16::ELEMENTS * 2; + } else if (c == 0x7fffffff) { + // The 31 lower code units of the input register contains valid UTF-16. + // The 31 word may be either a low or high surrogate. It the next + // iteration we 1) check if the low surrogate is followed by a high + // one, 2) reject sole high surrogate. + input += simd16::ELEMENTS * 2 - 1; + } else { + return result(error_code::SURROGATE, input - start); } - buf += k; } - } // while + } - return std::make_pair(result(error_code::SUCCESS, buf - start), - reinterpret_cast(utf8_output)); + return result(error_code::SUCCESS, input - start); } -/* end file src/arm64/arm_convert_utf32_to_utf8.cpp */ - -} // unnamed namespace -} // namespace arm64 -} // namespace simdutf -/* begin file src/generic/buf_block_reader.h */ -namespace simdutf { -namespace arm64 { -namespace { +/* end file src/haswell/avx2_validate_utf16.cpp */ +/* begin file src/haswell/avx2_validate_utf32le.cpp */ +/* Returns: + - pointer to the last unprocessed character (a scalar fallback should check + the rest); + - nullptr if an error was detected. +*/ +const char32_t *avx2_validate_utf32le(const char32_t *input, size_t size) { + const char32_t *end = input + size; -// Walks through a buffer in block-sized increments, loading the last part with -// spaces -template struct buf_block_reader { -public: - simdutf_really_inline buf_block_reader(const uint8_t *_buf, size_t _len); - simdutf_really_inline size_t block_index(); - simdutf_really_inline bool has_full_block() const; - simdutf_really_inline const uint8_t *full_block() const; - /** - * Get the last block, padded with spaces. - * - * There will always be a last block, with at least 1 byte, unless len == 0 - * (in which case this function fills the buffer with spaces and returns 0. In - * particular, if len == STEP_SIZE there will be 0 full_blocks and 1 remainder - * block with STEP_SIZE bytes and no spaces for padding. - * - * @return the number of effective characters in the last block. - */ - simdutf_really_inline size_t get_remainder(uint8_t *dst) const; - simdutf_really_inline void advance(); + const __m256i standardmax = _mm256_set1_epi32(0x10ffff); + const __m256i offset = _mm256_set1_epi32(0xffff2000); + const __m256i standardoffsetmax = _mm256_set1_epi32(0xfffff7ff); + __m256i currentmax = _mm256_setzero_si256(); + __m256i currentoffsetmax = _mm256_setzero_si256(); -private: - const uint8_t *buf; - const size_t len; - const size_t lenminusstep; - size_t idx; -}; + while (input + 8 < end) { + const __m256i in = _mm256_loadu_si256((__m256i *)input); + currentmax = _mm256_max_epu32(in, currentmax); + currentoffsetmax = + _mm256_max_epu32(_mm256_add_epi32(in, offset), currentoffsetmax); + input += 8; + } + __m256i is_zero = + _mm256_xor_si256(_mm256_max_epu32(currentmax, standardmax), standardmax); + if (_mm256_testz_si256(is_zero, is_zero) == 0) { + return nullptr; + } -// Routines to print masks and text for debugging bitmask operations -simdutf_unused static char *format_input_text_64(const uint8_t *text) { - static char *buf = - reinterpret_cast(malloc(sizeof(simd8x64) + 1)); - for (size_t i = 0; i < sizeof(simd8x64); i++) { - buf[i] = int8_t(text[i]) < ' ' ? '_' : int8_t(text[i]); + is_zero = _mm256_xor_si256( + _mm256_max_epu32(currentoffsetmax, standardoffsetmax), standardoffsetmax); + if (_mm256_testz_si256(is_zero, is_zero) == 0) { + return nullptr; } - buf[sizeof(simd8x64)] = '\0'; - return buf; + + return input; } -// Routines to print masks and text for debugging bitmask operations -simdutf_unused static char *format_input_text(const simd8x64 &in) { - static char *buf = - reinterpret_cast(malloc(sizeof(simd8x64) + 1)); - in.store(reinterpret_cast(buf)); - for (size_t i = 0; i < sizeof(simd8x64); i++) { - if (buf[i] < ' ') { - buf[i] = '_'; +const result avx2_validate_utf32le_with_errors(const char32_t *input, + size_t size) { + const char32_t *start = input; + const char32_t *end = input + size; + + const __m256i standardmax = _mm256_set1_epi32(0x10ffff); + const __m256i offset = _mm256_set1_epi32(0xffff2000); + const __m256i standardoffsetmax = _mm256_set1_epi32(0xfffff7ff); + __m256i currentmax = _mm256_setzero_si256(); + __m256i currentoffsetmax = _mm256_setzero_si256(); + + while (input + 8 < end) { + const __m256i in = _mm256_loadu_si256((__m256i *)input); + currentmax = _mm256_max_epu32(in, currentmax); + currentoffsetmax = + _mm256_max_epu32(_mm256_add_epi32(in, offset), currentoffsetmax); + + __m256i is_zero = _mm256_xor_si256( + _mm256_max_epu32(currentmax, standardmax), standardmax); + if (_mm256_testz_si256(is_zero, is_zero) == 0) { + return result(error_code::TOO_LARGE, input - start); } - } - buf[sizeof(simd8x64)] = '\0'; - return buf; -} -simdutf_unused static char *format_mask(uint64_t mask) { - static char *buf = reinterpret_cast(malloc(64 + 1)); - for (size_t i = 0; i < 64; i++) { - buf[i] = (mask & (size_t(1) << i)) ? 'X' : ' '; + is_zero = + _mm256_xor_si256(_mm256_max_epu32(currentoffsetmax, standardoffsetmax), + standardoffsetmax); + if (_mm256_testz_si256(is_zero, is_zero) == 0) { + return result(error_code::SURROGATE, input - start); + } + input += 8; } - buf[64] = '\0'; - return buf; + + return result(error_code::SUCCESS, input - start); } +/* end file src/haswell/avx2_validate_utf32le.cpp */ -template -simdutf_really_inline -buf_block_reader::buf_block_reader(const uint8_t *_buf, size_t _len) - : buf{_buf}, len{_len}, lenminusstep{len < STEP_SIZE ? 0 : len - STEP_SIZE}, - idx{0} {} +/* begin file src/haswell/avx2_convert_latin1_to_utf8.cpp */ +std::pair +avx2_convert_latin1_to_utf8(const char *latin1_input, size_t len, + char *utf8_output) { + const char *end = latin1_input + len; + const __m256i v_0000 = _mm256_setzero_si256(); + const __m256i v_c080 = _mm256_set1_epi16((int16_t)0xc080); + const __m256i v_ff80 = _mm256_set1_epi16((int16_t)0xff80); + const size_t safety_margin = 12; -template -simdutf_really_inline size_t buf_block_reader::block_index() { - return idx; -} + while (end - latin1_input >= std::ptrdiff_t(16 + safety_margin)) { + __m128i in8 = _mm_loadu_si128((__m128i *)latin1_input); + // a single 16-bit UTF-16 word can yield 1, 2 or 3 UTF-8 bytes + const __m128i v_80 = _mm_set1_epi8((char)0x80); + if (_mm_testz_si128(in8, v_80)) { // ASCII fast path!!!! + // 1. store (16 bytes) + _mm_storeu_si128((__m128i *)utf8_output, in8); + // 2. adjust pointers + latin1_input += 16; + utf8_output += 16; + continue; // we are done for this round! + } + // We proceed only with the first 16 bytes. + const __m256i in = _mm256_cvtepu8_epi16((in8)); -template -simdutf_really_inline bool buf_block_reader::has_full_block() const { - return idx < lenminusstep; -} + // 1. prepare 2-byte values + // input 16-bit word : [0000|0000|aabb|bbbb] x 8 + // expected output : [1100|00aa|10bb|bbbb] x 8 + const __m256i v_1f00 = _mm256_set1_epi16((int16_t)0x1f00); + const __m256i v_003f = _mm256_set1_epi16((int16_t)0x003f); -template -simdutf_really_inline const uint8_t * -buf_block_reader::full_block() const { - return &buf[idx]; -} + // t0 = [0000|00aa|bbbb|bb00] + const __m256i t0 = _mm256_slli_epi16(in, 2); + // t1 = [0000|00aa|0000|0000] + const __m256i t1 = _mm256_and_si256(t0, v_1f00); + // t2 = [0000|0000|00bb|bbbb] + const __m256i t2 = _mm256_and_si256(in, v_003f); + // t3 = [000a|aaaa|00bb|bbbb] + const __m256i t3 = _mm256_or_si256(t1, t2); + // t4 = [1100|00aa|10bb|bbbb] + const __m256i t4 = _mm256_or_si256(t3, v_c080); -template -simdutf_really_inline size_t -buf_block_reader::get_remainder(uint8_t *dst) const { - if (len == idx) { - return 0; - } // memcpy(dst, null, 0) will trigger an error with some sanitizers - std::memset(dst, 0x20, - STEP_SIZE); // std::memset STEP_SIZE because it is more efficient - // to write out 8 or 16 bytes at once. - std::memcpy(dst, buf + idx, len - idx); - return len - idx; -} + // 2. merge ASCII and 2-byte codewords -template -simdutf_really_inline void buf_block_reader::advance() { - idx += STEP_SIZE; + // no bits set above 7th bit + const __m256i one_byte_bytemask = + _mm256_cmpeq_epi16(_mm256_and_si256(in, v_ff80), v_0000); + const uint32_t one_byte_bitmask = + static_cast(_mm256_movemask_epi8(one_byte_bytemask)); + + const __m256i utf8_unpacked = _mm256_blendv_epi8(t4, in, one_byte_bytemask); + + // 3. prepare bitmask for 8-bit lookup + const uint32_t M0 = one_byte_bitmask & 0x55555555; + const uint32_t M1 = M0 >> 7; + const uint32_t M2 = (M1 | M0) & 0x00ff00ff; + // 4. pack the bytes + + const uint8_t *row = + &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[uint8_t(M2)][0]; + const uint8_t *row_2 = + &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[uint8_t(M2 >> 16)] + [0]; + + const __m128i shuffle = _mm_loadu_si128((__m128i *)(row + 1)); + const __m128i shuffle_2 = _mm_loadu_si128((__m128i *)(row_2 + 1)); + + const __m256i utf8_packed = _mm256_shuffle_epi8( + utf8_unpacked, _mm256_setr_m128i(shuffle, shuffle_2)); + // 5. store bytes + _mm_storeu_si128((__m128i *)utf8_output, + _mm256_castsi256_si128(utf8_packed)); + utf8_output += row[0]; + _mm_storeu_si128((__m128i *)utf8_output, + _mm256_extractf128_si256(utf8_packed, 1)); + utf8_output += row_2[0]; + + // 6. adjust pointers + latin1_input += 16; + continue; + + } // while + return std::make_pair(latin1_input, utf8_output); } +/* end file src/haswell/avx2_convert_latin1_to_utf8.cpp */ +/* begin file src/haswell/avx2_convert_latin1_to_utf16.cpp */ +template +std::pair +avx2_convert_latin1_to_utf16(const char *latin1_input, size_t len, + char16_t *utf16_output) { + size_t rounded_len = len & ~0xF; // Round down to nearest multiple of 32 -} // unnamed namespace -} // namespace arm64 -} // namespace simdutf -/* end file src/generic/buf_block_reader.h */ -/* begin file src/generic/utf8_validation/utf8_lookup4_algorithm.h */ -namespace simdutf { -namespace arm64 { -namespace { -namespace utf8_validation { + size_t i = 0; + for (; i < rounded_len; i += 16) { + // Load 16 bytes from the address (input + i) into a xmm register + __m128i xmm0 = + _mm_loadu_si128(reinterpret_cast(latin1_input + i)); -using namespace simd; + // Zero extend each byte in xmm0 to word and put it in another xmm register + __m128i xmm1 = _mm_cvtepu8_epi16(xmm0); -simdutf_really_inline simd8 -check_special_cases(const simd8 input, const simd8 prev1) { - // Bit 0 = Too Short (lead byte/ASCII followed by lead byte/ASCII) - // Bit 1 = Too Long (ASCII followed by continuation) - // Bit 2 = Overlong 3-byte - // Bit 4 = Surrogate - // Bit 5 = Overlong 2-byte - // Bit 7 = Two Continuations - constexpr const uint8_t TOO_SHORT = 1 << 0; // 11______ 0_______ - // 11______ 11______ - constexpr const uint8_t TOO_LONG = 1 << 1; // 0_______ 10______ - constexpr const uint8_t OVERLONG_3 = 1 << 2; // 11100000 100_____ - constexpr const uint8_t SURROGATE = 1 << 4; // 11101101 101_____ - constexpr const uint8_t OVERLONG_2 = 1 << 5; // 1100000_ 10______ - constexpr const uint8_t TWO_CONTS = 1 << 7; // 10______ 10______ - constexpr const uint8_t TOO_LARGE = 1 << 3; // 11110100 1001____ - // 11110100 101_____ - // 11110101 1001____ - // 11110101 101_____ - // 1111011_ 1001____ - // 1111011_ 101_____ - // 11111___ 1001____ - // 11111___ 101_____ - constexpr const uint8_t TOO_LARGE_1000 = 1 << 6; - // 11110101 1000____ - // 1111011_ 1000____ - // 11111___ 1000____ - constexpr const uint8_t OVERLONG_4 = 1 << 6; // 11110000 1000____ + // Shift xmm0 to the right by 8 bytes + xmm0 = _mm_srli_si128(xmm0, 8); - const simd8 byte_1_high = prev1.shr<4>().lookup_16( - // 0_______ ________ - TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, - TOO_LONG, - // 10______ ________ - TWO_CONTS, TWO_CONTS, TWO_CONTS, TWO_CONTS, - // 1100____ ________ - TOO_SHORT | OVERLONG_2, - // 1101____ ________ - TOO_SHORT, - // 1110____ ________ - TOO_SHORT | OVERLONG_3 | SURROGATE, - // 1111____ ________ - TOO_SHORT | TOO_LARGE | TOO_LARGE_1000 | OVERLONG_4); - constexpr const uint8_t CARRY = - TOO_SHORT | TOO_LONG | TWO_CONTS; // These all have ____ in byte 1 . - const simd8 byte_1_low = - (prev1 & 0x0F) - .lookup_16( - // ____0000 ________ - CARRY | OVERLONG_3 | OVERLONG_2 | OVERLONG_4, - // ____0001 ________ - CARRY | OVERLONG_2, - // ____001_ ________ - CARRY, CARRY, + // Zero extend each byte in the shifted xmm0 to word in xmm0 + xmm0 = _mm_cvtepu8_epi16(xmm0); - // ____0100 ________ - CARRY | TOO_LARGE, - // ____0101 ________ - CARRY | TOO_LARGE | TOO_LARGE_1000, - // ____011_ ________ - CARRY | TOO_LARGE | TOO_LARGE_1000, - CARRY | TOO_LARGE | TOO_LARGE_1000, + if (big_endian) { + const __m128i swap = + _mm_setr_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14); + xmm0 = _mm_shuffle_epi8(xmm0, swap); + xmm1 = _mm_shuffle_epi8(xmm1, swap); + } - // ____1___ ________ - CARRY | TOO_LARGE | TOO_LARGE_1000, - CARRY | TOO_LARGE | TOO_LARGE_1000, - CARRY | TOO_LARGE | TOO_LARGE_1000, - CARRY | TOO_LARGE | TOO_LARGE_1000, - CARRY | TOO_LARGE | TOO_LARGE_1000, - // ____1101 ________ - CARRY | TOO_LARGE | TOO_LARGE_1000 | SURROGATE, - CARRY | TOO_LARGE | TOO_LARGE_1000, - CARRY | TOO_LARGE | TOO_LARGE_1000); - const simd8 byte_2_high = input.shr<4>().lookup_16( - // ________ 0_______ - TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, - TOO_SHORT, TOO_SHORT, + // Store the contents of xmm1 into the address pointed by (output + i) + _mm_storeu_si128(reinterpret_cast<__m128i *>(utf16_output + i), xmm1); - // ________ 1000____ - TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE_1000 | - OVERLONG_4, - // ________ 1001____ - TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE, - // ________ 101_____ - TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, - TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, + // Store the contents of xmm0 into the address pointed by (output + i + 8) + _mm_storeu_si128(reinterpret_cast<__m128i *>(utf16_output + i + 8), xmm0); + } - // ________ 11______ - TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT); - return (byte_1_high & byte_1_low & byte_2_high); + return std::make_pair(latin1_input + rounded_len, utf16_output + rounded_len); } -simdutf_really_inline simd8 -check_multibyte_lengths(const simd8 input, - const simd8 prev_input, - const simd8 sc) { - simd8 prev2 = input.prev<2>(prev_input); - simd8 prev3 = input.prev<3>(prev_input); - simd8 must23 = - simd8(must_be_2_3_continuation(prev2, prev3)); - simd8 must23_80 = must23 & uint8_t(0x80); - return must23_80 ^ sc; +/* end file src/haswell/avx2_convert_latin1_to_utf16.cpp */ +/* begin file src/haswell/avx2_convert_latin1_to_utf32.cpp */ +std::pair +avx2_convert_latin1_to_utf32(const char *buf, size_t len, + char32_t *utf32_output) { + size_t rounded_len = ((len | 7) ^ 7); // Round down to nearest multiple of 8 + + for (size_t i = 0; i < rounded_len; i += 8) { + // Load 8 Latin1 characters into a 64-bit register + __m128i in = _mm_loadl_epi64((__m128i *)&buf[i]); + + // Zero extend each set of 8 Latin1 characters to 8 32-bit integers using + // vpmovzxbd + __m256i out = _mm256_cvtepu8_epi32(in); + + // Store the results back to memory + _mm256_storeu_si256((__m256i *)&utf32_output[i], out); + } + + // return pointers pointing to where we left off + return std::make_pair(buf + rounded_len, utf32_output + rounded_len); } +/* end file src/haswell/avx2_convert_latin1_to_utf32.cpp */ -// -// Return nonzero if there are incomplete multibyte characters at the end of the -// block: e.g. if there is a 4-byte character, but it is 3 bytes from the end. -// -simdutf_really_inline simd8 is_incomplete(const simd8 input) { - // If the previous input's last 3 bytes match this, they're too short (they - // ended at EOF): - // ... 1111____ 111_____ 11______ - static const uint8_t max_array[32] = {255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 0b11110000u - 1, - 0b11100000u - 1, - 0b11000000u - 1}; - const simd8 max_value( - &max_array[sizeof(max_array) - sizeof(simd8)]); - return input.gt_bits(max_value); +/* begin file src/haswell/avx2_convert_utf8_to_utf16.cpp */ +// depends on "tables/utf8_to_utf16_tables.h" + +// Convert up to 12 bytes from utf8 to utf16 using a mask indicating the +// end of the code points. Only the least significant 12 bits of the mask +// are accessed. +// It returns how many bytes were consumed (up to 12). +template +size_t convert_masked_utf8_to_utf16(const char *input, + uint64_t utf8_end_of_code_point_mask, + char16_t *&utf16_output) { + // we use an approach where we try to process up to 12 input bytes. + // Why 12 input bytes and not 16? Because we are concerned with the size of + // the lookup tables. Also 12 is nicely divisible by two and three. + // + // + // Optimization note: our main path below is load-latency dependent. Thus it + // is maybe beneficial to have fast paths that depend on branch prediction but + // have less latency. This results in more instructions but, potentially, also + // higher speeds. + // + // We first try a few fast paths. + const __m128i swap = + _mm_setr_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14); + const __m128i in = _mm_loadu_si128((__m128i *)input); + const uint16_t input_utf8_end_of_code_point_mask = + utf8_end_of_code_point_mask & 0xfff; + if (utf8_end_of_code_point_mask == 0xfff) { + // We process the data in chunks of 12 bytes. + __m256i ascii = _mm256_cvtepu8_epi16(in); + if (big_endian) { + const __m256i swap256 = _mm256_setr_epi8( + 1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14, 17, 16, 19, 18, + 21, 20, 23, 22, 25, 24, 27, 26, 29, 28, 31, 30); + ascii = _mm256_shuffle_epi8(ascii, swap256); + } + _mm256_storeu_si256(reinterpret_cast<__m256i *>(utf16_output), ascii); + utf16_output += 12; // We wrote 12 16-bit characters. + return 12; // We consumed 12 bytes. + } + if (((utf8_end_of_code_point_mask & 0xffff) == 0xaaaa)) { + // We want to take 8 2-byte UTF-8 code units and turn them into 8 2-byte + // UTF-16 code units. There is probably a more efficient sequence, but the + // following might do. + const __m128i sh = + _mm_setr_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14); + const __m128i perm = _mm_shuffle_epi8(in, sh); + const __m128i ascii = _mm_and_si128(perm, _mm_set1_epi16(0x7f)); + const __m128i highbyte = _mm_and_si128(perm, _mm_set1_epi16(0x1f00)); + __m128i composed = _mm_or_si128(ascii, _mm_srli_epi16(highbyte, 2)); + if (big_endian) + composed = _mm_shuffle_epi8(composed, swap); + _mm_storeu_si128((__m128i *)utf16_output, composed); + utf16_output += 8; // We wrote 16 bytes, 8 code points. + return 16; + } + if (input_utf8_end_of_code_point_mask == 0x924) { + // We want to take 4 3-byte UTF-8 code units and turn them into 4 2-byte + // UTF-16 code units. There is probably a more efficient sequence, but the + // following might do. + const __m128i sh = + _mm_setr_epi8(2, 1, 0, -1, 5, 4, 3, -1, 8, 7, 6, -1, 11, 10, 9, -1); + const __m128i perm = _mm_shuffle_epi8(in, sh); + const __m128i ascii = + _mm_and_si128(perm, _mm_set1_epi32(0x7f)); // 7 or 6 bits + const __m128i middlebyte = + _mm_and_si128(perm, _mm_set1_epi32(0x3f00)); // 5 or 6 bits + const __m128i middlebyte_shifted = _mm_srli_epi32(middlebyte, 2); + const __m128i highbyte = + _mm_and_si128(perm, _mm_set1_epi32(0x0f0000)); // 4 bits + const __m128i highbyte_shifted = _mm_srli_epi32(highbyte, 4); + const __m128i composed = + _mm_or_si128(_mm_or_si128(ascii, middlebyte_shifted), highbyte_shifted); + __m128i composed_repacked = _mm_packus_epi32(composed, composed); + if (big_endian) + composed_repacked = _mm_shuffle_epi8(composed_repacked, swap); + _mm_storeu_si128((__m128i *)utf16_output, composed_repacked); + utf16_output += 4; + return 12; + } + + const uint8_t idx = simdutf::tables::utf8_to_utf16::utf8bigindex + [input_utf8_end_of_code_point_mask][0]; + const uint8_t consumed = simdutf::tables::utf8_to_utf16::utf8bigindex + [input_utf8_end_of_code_point_mask][1]; + if (idx < 64) { + // SIX (6) input code-code units + // this is a relatively easy scenario + // we process SIX (6) input code-code units. The max length in bytes of six + // code code units spanning between 1 and 2 bytes each is 12 bytes. On + // processors where pdep/pext is fast, we might be able to use a small + // lookup table. + const __m128i sh = _mm_loadu_si128( + (const __m128i *)simdutf::tables::utf8_to_utf16::shufutf8[idx]); + const __m128i perm = _mm_shuffle_epi8(in, sh); + const __m128i ascii = _mm_and_si128(perm, _mm_set1_epi16(0x7f)); + const __m128i highbyte = _mm_and_si128(perm, _mm_set1_epi16(0x1f00)); + __m128i composed = _mm_or_si128(ascii, _mm_srli_epi16(highbyte, 2)); + if (big_endian) + composed = _mm_shuffle_epi8(composed, swap); + _mm_storeu_si128((__m128i *)utf16_output, composed); + utf16_output += 6; // We wrote 12 bytes, 6 code points. There is a potential + // overflow of 4 bytes. + } else if (idx < 145) { + // FOUR (4) input code-code units + const __m128i sh = _mm_loadu_si128( + (const __m128i *)simdutf::tables::utf8_to_utf16::shufutf8[idx]); + const __m128i perm = _mm_shuffle_epi8(in, sh); + const __m128i ascii = + _mm_and_si128(perm, _mm_set1_epi32(0x7f)); // 7 or 6 bits + const __m128i middlebyte = + _mm_and_si128(perm, _mm_set1_epi32(0x3f00)); // 5 or 6 bits + const __m128i middlebyte_shifted = _mm_srli_epi32(middlebyte, 2); + const __m128i highbyte = + _mm_and_si128(perm, _mm_set1_epi32(0x0f0000)); // 4 bits + const __m128i highbyte_shifted = _mm_srli_epi32(highbyte, 4); + const __m128i composed = + _mm_or_si128(_mm_or_si128(ascii, middlebyte_shifted), highbyte_shifted); + __m128i composed_repacked = _mm_packus_epi32(composed, composed); + if (big_endian) + composed_repacked = _mm_shuffle_epi8(composed_repacked, swap); + _mm_storeu_si128((__m128i *)utf16_output, composed_repacked); + utf16_output += 4; // Here we overflow by 8 bytes. + } else if (idx < 209) { + // TWO (2) input code-code units + ////////////// + // There might be garbage inputs where a leading byte mascarades as a + // four-byte leading byte (by being followed by 3 continuation byte), but is + // not greater than 0xf0. This could trigger a buffer overflow if we only + // counted leading bytes of the form 0xf0 as generating surrogate pairs, + // without further UTF-8 validation. Thus we must be careful to ensure that + // only leading bytes at least as large as 0xf0 generate surrogate pairs. We + // do as at the cost of an extra mask. + ///////////// + const __m128i sh = _mm_loadu_si128( + (const __m128i *)simdutf::tables::utf8_to_utf16::shufutf8[idx]); + const __m128i perm = _mm_shuffle_epi8(in, sh); + const __m128i ascii = _mm_and_si128(perm, _mm_set1_epi32(0x7f)); + const __m128i middlebyte = _mm_and_si128(perm, _mm_set1_epi32(0x3f00)); + const __m128i middlebyte_shifted = _mm_srli_epi32(middlebyte, 2); + __m128i middlehighbyte = _mm_and_si128(perm, _mm_set1_epi32(0x3f0000)); + // correct for spurious high bit + const __m128i correct = + _mm_srli_epi32(_mm_and_si128(perm, _mm_set1_epi32(0x400000)), 1); + middlehighbyte = _mm_xor_si128(correct, middlehighbyte); + const __m128i middlehighbyte_shifted = _mm_srli_epi32(middlehighbyte, 4); + // We deliberately carry the leading four bits in highbyte if they are + // present, we remove them later when computing hightenbits. + const __m128i highbyte = _mm_and_si128(perm, _mm_set1_epi32(0xff000000)); + const __m128i highbyte_shifted = _mm_srli_epi32(highbyte, 6); + // When we need to generate a surrogate pair (leading byte > 0xF0), then + // the corresponding 32-bit value in 'composed' will be greater than + // > (0xff00000>>6) or > 0x3c00000. This can be used later to identify the + // location of the surrogate pairs. + const __m128i composed = + _mm_or_si128(_mm_or_si128(ascii, middlebyte_shifted), + _mm_or_si128(highbyte_shifted, middlehighbyte_shifted)); + const __m128i composedminus = + _mm_sub_epi32(composed, _mm_set1_epi32(0x10000)); + const __m128i lowtenbits = + _mm_and_si128(composedminus, _mm_set1_epi32(0x3ff)); + // Notice the 0x3ff mask: + const __m128i hightenbits = + _mm_and_si128(_mm_srli_epi32(composedminus, 10), _mm_set1_epi32(0x3ff)); + const __m128i lowtenbitsadd = + _mm_add_epi32(lowtenbits, _mm_set1_epi32(0xDC00)); + const __m128i hightenbitsadd = + _mm_add_epi32(hightenbits, _mm_set1_epi32(0xD800)); + const __m128i lowtenbitsaddshifted = _mm_slli_epi32(lowtenbitsadd, 16); + __m128i surrogates = _mm_or_si128(hightenbitsadd, lowtenbitsaddshifted); + uint32_t basic_buffer[4]; + uint32_t basic_buffer_swap[4]; + if (big_endian) { + _mm_storeu_si128((__m128i *)basic_buffer_swap, + _mm_shuffle_epi8(composed, swap)); + surrogates = _mm_shuffle_epi8(surrogates, swap); + } + _mm_storeu_si128((__m128i *)basic_buffer, composed); + uint32_t surrogate_buffer[4]; + _mm_storeu_si128((__m128i *)surrogate_buffer, surrogates); + for (size_t i = 0; i < 3; i++) { + if (basic_buffer[i] > 0x3c00000) { + utf16_output[0] = uint16_t(surrogate_buffer[i] & 0xffff); + utf16_output[1] = uint16_t(surrogate_buffer[i] >> 16); + utf16_output += 2; + } else { + utf16_output[0] = big_endian ? uint16_t(basic_buffer_swap[i]) + : uint16_t(basic_buffer[i]); + utf16_output++; + } + } + } else { + // here we know that there is an error but we do not handle errors + } + return consumed; } +/* end file src/haswell/avx2_convert_utf8_to_utf16.cpp */ +/* begin file src/haswell/avx2_convert_utf8_to_utf32.cpp */ +// depends on "tables/utf8_to_utf16_tables.h" -struct utf8_checker { - // If this is nonzero, there has been a UTF-8 error. - simd8 error; - // The last input we received - simd8 prev_input_block; - // Whether the last input we received was incomplete (used for ASCII fast - // path) - simd8 prev_incomplete; - +// Convert up to 12 bytes from utf8 to utf32 using a mask indicating the +// end of the code points. Only the least significant 12 bits of the mask +// are accessed. +// It returns how many bytes were consumed (up to 12). +size_t convert_masked_utf8_to_utf32(const char *input, + uint64_t utf8_end_of_code_point_mask, + char32_t *&utf32_output) { + // we use an approach where we try to process up to 12 input bytes. + // Why 12 input bytes and not 16? Because we are concerned with the size of + // the lookup tables. Also 12 is nicely divisible by two and three. // - // Check whether the current bytes are valid UTF-8. // - simdutf_really_inline void check_utf8_bytes(const simd8 input, - const simd8 prev_input) { - // Flip prev1...prev3 so we can easily determine if they are 2+, 3+ or 4+ - // lead bytes (2, 3, 4-byte leads become large positive numbers instead of - // small negative numbers) - simd8 prev1 = input.prev<1>(prev_input); - simd8 sc = check_special_cases(input, prev1); - this->error |= check_multibyte_lengths(input, prev_input, sc); - } - - // The only problem that can happen at EOF is that a multibyte character is - // too short or a byte value too large in the last bytes: check_special_cases - // only checks for bytes too large in the first of two bytes. - simdutf_really_inline void check_eof() { - // If the previous block had incomplete UTF-8 characters at the end, an - // ASCII block can't possibly finish them. - this->error |= this->prev_incomplete; + // Optimization note: our main path below is load-latency dependent. Thus it + // is maybe beneficial to have fast paths that depend on branch prediction but + // have less latency. This results in more instructions but, potentially, also + // higher speeds. + // + // We first try a few fast paths. + const __m128i in = _mm_loadu_si128((__m128i *)input); + const uint16_t input_utf8_end_of_code_point_mask = + utf8_end_of_code_point_mask & 0xfff; + if (utf8_end_of_code_point_mask == 0xfff) { + // We process the data in chunks of 12 bytes. + _mm256_storeu_si256(reinterpret_cast<__m256i *>(utf32_output), + _mm256_cvtepu8_epi32(in)); + _mm256_storeu_si256(reinterpret_cast<__m256i *>(utf32_output + 8), + _mm256_cvtepu8_epi32(_mm_srli_si128(in, 8))); + utf32_output += 12; // We wrote 12 32-bit characters. + return 12; // We consumed 12 bytes. } - - simdutf_really_inline void check_next_input(const simd8x64 &input) { - if (simdutf_likely(is_ascii(input))) { - this->error |= this->prev_incomplete; - } else { - // you might think that a for-loop would work, but under Visual Studio, it - // is not good enough. - static_assert((simd8x64::NUM_CHUNKS == 2) || - (simd8x64::NUM_CHUNKS == 4), - "We support either two or four chunks per 64-byte block."); - if (simd8x64::NUM_CHUNKS == 2) { - this->check_utf8_bytes(input.chunks[0], this->prev_input_block); - this->check_utf8_bytes(input.chunks[1], input.chunks[0]); - } else if (simd8x64::NUM_CHUNKS == 4) { - this->check_utf8_bytes(input.chunks[0], this->prev_input_block); - this->check_utf8_bytes(input.chunks[1], input.chunks[0]); - this->check_utf8_bytes(input.chunks[2], input.chunks[1]); - this->check_utf8_bytes(input.chunks[3], input.chunks[2]); - } - this->prev_incomplete = - is_incomplete(input.chunks[simd8x64::NUM_CHUNKS - 1]); - this->prev_input_block = input.chunks[simd8x64::NUM_CHUNKS - 1]; - } + if (((utf8_end_of_code_point_mask & 0xffff) == 0xaaaa)) { + // We want to take 8 2-byte UTF-8 code units and turn them into 8 4-byte + // UTF-32 code units. There is probably a more efficient sequence, but the + // following might do. + const __m128i sh = + _mm_setr_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14); + const __m128i perm = _mm_shuffle_epi8(in, sh); + const __m128i ascii = _mm_and_si128(perm, _mm_set1_epi16(0x7f)); + const __m128i highbyte = _mm_and_si128(perm, _mm_set1_epi16(0x1f00)); + const __m128i composed = _mm_or_si128(ascii, _mm_srli_epi16(highbyte, 2)); + _mm256_storeu_si256((__m256i *)utf32_output, + _mm256_cvtepu16_epi32(composed)); + utf32_output += 8; // We wrote 16 bytes, 8 code points. + return 16; } - - // do not forget to call check_eof! - simdutf_really_inline bool errors() const { - return this->error.any_bits_set_anywhere(); + if (input_utf8_end_of_code_point_mask == 0x924) { + // We want to take 4 3-byte UTF-8 code units and turn them into 4 4-byte + // UTF-32 code units. There is probably a more efficient sequence, but the + // following might do. + const __m128i sh = + _mm_setr_epi8(2, 1, 0, -1, 5, 4, 3, -1, 8, 7, 6, -1, 11, 10, 9, -1); + const __m128i perm = _mm_shuffle_epi8(in, sh); + const __m128i ascii = + _mm_and_si128(perm, _mm_set1_epi32(0x7f)); // 7 or 6 bits + const __m128i middlebyte = + _mm_and_si128(perm, _mm_set1_epi32(0x3f00)); // 5 or 6 bits + const __m128i middlebyte_shifted = _mm_srli_epi32(middlebyte, 2); + const __m128i highbyte = + _mm_and_si128(perm, _mm_set1_epi32(0x0f0000)); // 4 bits + const __m128i highbyte_shifted = _mm_srli_epi32(highbyte, 4); + const __m128i composed = + _mm_or_si128(_mm_or_si128(ascii, middlebyte_shifted), highbyte_shifted); + _mm_storeu_si128((__m128i *)utf32_output, composed); + utf32_output += 4; + return 12; } + /// We do not have a fast path available, so we fallback. -}; // struct utf8_checker -} // namespace utf8_validation - -using utf8_validation::utf8_checker; - -} // unnamed namespace -} // namespace arm64 -} // namespace simdutf -/* end file src/generic/utf8_validation/utf8_lookup4_algorithm.h */ -/* begin file src/generic/utf8_validation/utf8_validator.h */ -namespace simdutf { -namespace arm64 { -namespace { -namespace utf8_validation { - -/** - * Validates that the string is actual UTF-8. - */ -template -bool generic_validate_utf8(const uint8_t *input, size_t length) { - checker c{}; - buf_block_reader<64> reader(input, length); - while (reader.has_full_block()) { - simd::simd8x64 in(reader.full_block()); - c.check_next_input(in); - reader.advance(); + const uint8_t idx = + tables::utf8_to_utf16::utf8bigindex[input_utf8_end_of_code_point_mask][0]; + const uint8_t consumed = + tables::utf8_to_utf16::utf8bigindex[input_utf8_end_of_code_point_mask][1]; + if (idx < 64) { + // SIX (6) input code-code units + // this is a relatively easy scenario + // we process SIX (6) input code-code units. The max length in bytes of six + // code code units spanning between 1 and 2 bytes each is 12 bytes. On + // processors where pdep/pext is fast, we might be able to use a small + // lookup table. + const __m128i sh = + _mm_loadu_si128((const __m128i *)tables::utf8_to_utf16::shufutf8[idx]); + const __m128i perm = _mm_shuffle_epi8(in, sh); + const __m128i ascii = _mm_and_si128(perm, _mm_set1_epi16(0x7f)); + const __m128i highbyte = _mm_and_si128(perm, _mm_set1_epi16(0x1f00)); + const __m128i composed = _mm_or_si128(ascii, _mm_srli_epi16(highbyte, 2)); + _mm256_storeu_si256((__m256i *)utf32_output, + _mm256_cvtepu16_epi32(composed)); + utf32_output += 6; // We wrote 24 bytes, 6 code points. There is a potential + // overflow of 32 - 24 = 8 bytes. + } else if (idx < 145) { + // FOUR (4) input code-code units + const __m128i sh = + _mm_loadu_si128((const __m128i *)tables::utf8_to_utf16::shufutf8[idx]); + const __m128i perm = _mm_shuffle_epi8(in, sh); + const __m128i ascii = + _mm_and_si128(perm, _mm_set1_epi32(0x7f)); // 7 or 6 bits + const __m128i middlebyte = + _mm_and_si128(perm, _mm_set1_epi32(0x3f00)); // 5 or 6 bits + const __m128i middlebyte_shifted = _mm_srli_epi32(middlebyte, 2); + const __m128i highbyte = + _mm_and_si128(perm, _mm_set1_epi32(0x0f0000)); // 4 bits + const __m128i highbyte_shifted = _mm_srli_epi32(highbyte, 4); + const __m128i composed = + _mm_or_si128(_mm_or_si128(ascii, middlebyte_shifted), highbyte_shifted); + _mm_storeu_si128((__m128i *)utf32_output, composed); + utf32_output += 4; + } else if (idx < 209) { + // TWO (2) input code-code units + const __m128i sh = + _mm_loadu_si128((const __m128i *)tables::utf8_to_utf16::shufutf8[idx]); + const __m128i perm = _mm_shuffle_epi8(in, sh); + const __m128i ascii = _mm_and_si128(perm, _mm_set1_epi32(0x7f)); + const __m128i middlebyte = _mm_and_si128(perm, _mm_set1_epi32(0x3f00)); + const __m128i middlebyte_shifted = _mm_srli_epi32(middlebyte, 2); + __m128i middlehighbyte = _mm_and_si128(perm, _mm_set1_epi32(0x3f0000)); + // correct for spurious high bit + const __m128i correct = + _mm_srli_epi32(_mm_and_si128(perm, _mm_set1_epi32(0x400000)), 1); + middlehighbyte = _mm_xor_si128(correct, middlehighbyte); + const __m128i middlehighbyte_shifted = _mm_srli_epi32(middlehighbyte, 4); + const __m128i highbyte = _mm_and_si128(perm, _mm_set1_epi32(0x07000000)); + const __m128i highbyte_shifted = _mm_srli_epi32(highbyte, 6); + const __m128i composed = + _mm_or_si128(_mm_or_si128(ascii, middlebyte_shifted), + _mm_or_si128(highbyte_shifted, middlehighbyte_shifted)); + _mm_storeu_si128((__m128i *)utf32_output, composed); + utf32_output += + 3; // We wrote 3 * 4 bytes, there is a potential overflow of 4 bytes. + } else { + // here we know that there is an error but we do not handle errors } - uint8_t block[64]{}; - reader.get_remainder(block); - simd::simd8x64 in(block); - c.check_next_input(in); - reader.advance(); - c.check_eof(); - return !c.errors(); + return consumed; } +/* end file src/haswell/avx2_convert_utf8_to_utf32.cpp */ -bool generic_validate_utf8(const char *input, size_t length) { - return generic_validate_utf8( - reinterpret_cast(input), length); -} +/* begin file src/haswell/avx2_convert_utf16_to_latin1.cpp */ +template +std::pair +avx2_convert_utf16_to_latin1(const char16_t *buf, size_t len, + char *latin1_output) { + const char16_t *end = buf + len; + while (end - buf >= 16) { + // Load 16 UTF-16 characters into 256-bit AVX2 register + __m256i in = _mm256_loadu_si256(reinterpret_cast(buf)); -/** - * Validates that the string is actual UTF-8 and stops on errors. - */ -template -result generic_validate_utf8_with_errors(const uint8_t *input, size_t length) { - checker c{}; - buf_block_reader<64> reader(input, length); - size_t count{0}; - while (reader.has_full_block()) { - simd::simd8x64 in(reader.full_block()); - c.check_next_input(in); - if (c.errors()) { - if (count != 0) { - count--; - } // Sometimes the error is only detected in the next chunk - result res = scalar::utf8::rewind_and_validate_with_errors( - reinterpret_cast(input), - reinterpret_cast(input + count), length - count); - res.count += count; - return res; + if (!match_system(big_endian)) { + const __m256i swap = _mm256_setr_epi8( + 1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14, 17, 16, 19, 18, + 21, 20, 23, 22, 25, 24, 27, 26, 29, 28, 31, 30); + in = _mm256_shuffle_epi8(in, swap); } - reader.advance(); - count += 64; - } - uint8_t block[64]{}; - reader.get_remainder(block); - simd::simd8x64 in(block); - c.check_next_input(in); - reader.advance(); - c.check_eof(); - if (c.errors()) { - if (count != 0) { - count--; - } // Sometimes the error is only detected in the next chunk - result res = scalar::utf8::rewind_and_validate_with_errors( - reinterpret_cast(input), - reinterpret_cast(input) + count, length - count); - res.count += count; - return res; - } else { - return result(error_code::SUCCESS, length); - } -} - -result generic_validate_utf8_with_errors(const char *input, size_t length) { - return generic_validate_utf8_with_errors( - reinterpret_cast(input), length); -} -template -bool generic_validate_ascii(const uint8_t *input, size_t length) { - buf_block_reader<64> reader(input, length); - uint8_t blocks[64]{}; - simd::simd8x64 running_or(blocks); - while (reader.has_full_block()) { - simd::simd8x64 in(reader.full_block()); - running_or |= in; - reader.advance(); - } - uint8_t block[64]{}; - reader.get_remainder(block); - simd::simd8x64 in(block); - running_or |= in; - return running_or.is_ascii(); + __m256i high_byte_mask = _mm256_set1_epi16((int16_t)0xFF00); + if (_mm256_testz_si256(in, high_byte_mask)) { + // Pack 16-bit characters into 8-bit and store in latin1_output + __m128i lo = _mm256_extractf128_si256(in, 0); + __m128i hi = _mm256_extractf128_si256(in, 1); + __m128i latin1_packed_lo = _mm_packus_epi16(lo, lo); + __m128i latin1_packed_hi = _mm_packus_epi16(hi, hi); + _mm_storel_epi64(reinterpret_cast<__m128i *>(latin1_output), + latin1_packed_lo); + _mm_storel_epi64(reinterpret_cast<__m128i *>(latin1_output + 8), + latin1_packed_hi); + // Adjust pointers for next iteration + buf += 16; + latin1_output += 16; + } else { + return std::make_pair(nullptr, reinterpret_cast(latin1_output)); + } + } // while + return std::make_pair(buf, latin1_output); } -bool generic_validate_ascii(const char *input, size_t length) { - return generic_validate_ascii( - reinterpret_cast(input), length); -} +template +std::pair +avx2_convert_utf16_to_latin1_with_errors(const char16_t *buf, size_t len, + char *latin1_output) { + const char16_t *start = buf; + const char16_t *end = buf + len; + while (end - buf >= 16) { + __m256i in = _mm256_loadu_si256(reinterpret_cast(buf)); -template -result generic_validate_ascii_with_errors(const uint8_t *input, size_t length) { - buf_block_reader<64> reader(input, length); - size_t count{0}; - while (reader.has_full_block()) { - simd::simd8x64 in(reader.full_block()); - if (!in.is_ascii()) { - result res = scalar::ascii::validate_with_errors( - reinterpret_cast(input + count), length - count); - return result(res.error, count + res.count); + if (!match_system(big_endian)) { + const __m256i swap = _mm256_setr_epi8( + 1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14, 17, 16, 19, 18, + 21, 20, 23, 22, 25, 24, 27, 26, 29, 28, 31, 30); + in = _mm256_shuffle_epi8(in, swap); } - reader.advance(); - - count += 64; - } - uint8_t block[64]{}; - reader.get_remainder(block); - simd::simd8x64 in(block); - if (!in.is_ascii()) { - result res = scalar::ascii::validate_with_errors( - reinterpret_cast(input + count), length - count); - return result(res.error, count + res.count); - } else { - return result(error_code::SUCCESS, length); - } -} -result generic_validate_ascii_with_errors(const char *input, size_t length) { - return generic_validate_ascii_with_errors( - reinterpret_cast(input), length); + __m256i high_byte_mask = _mm256_set1_epi16((int16_t)0xFF00); + if (_mm256_testz_si256(in, high_byte_mask)) { + __m128i lo = _mm256_extractf128_si256(in, 0); + __m128i hi = _mm256_extractf128_si256(in, 1); + __m128i latin1_packed_lo = _mm_packus_epi16(lo, lo); + __m128i latin1_packed_hi = _mm_packus_epi16(hi, hi); + _mm_storel_epi64(reinterpret_cast<__m128i *>(latin1_output), + latin1_packed_lo); + _mm_storel_epi64(reinterpret_cast<__m128i *>(latin1_output + 8), + latin1_packed_hi); + buf += 16; + latin1_output += 16; + } else { + // Fallback to scalar code for handling errors + for (int k = 0; k < 16; k++) { + uint16_t word = !match_system(big_endian) + ? scalar::utf16::swap_bytes(buf[k]) + : buf[k]; + if (word <= 0xff) { + *latin1_output++ = char(word); + } else { + return std::make_pair( + result{error_code::TOO_LARGE, (size_t)(buf - start + k)}, + latin1_output); + } + } + buf += 16; + } + } // while + return std::make_pair(result{error_code::SUCCESS, (size_t)(buf - start)}, + latin1_output); } +/* end file src/haswell/avx2_convert_utf16_to_latin1.cpp */ +/* begin file src/haswell/avx2_convert_utf16_to_utf8.cpp */ +/* + The vectorized algorithm works on single SSE register i.e., it + loads eight 16-bit code units. -} // namespace utf8_validation -} // unnamed namespace -} // namespace arm64 -} // namespace simdutf -/* end file src/generic/utf8_validation/utf8_validator.h */ -// transcoding from UTF-8 to UTF-16 -/* begin file src/generic/utf8_to_utf16/utf8_to_utf16.h */ - -namespace simdutf { -namespace arm64 { -namespace { -namespace utf8_to_utf16 { -using namespace simd; - -simdutf_really_inline simd8 -check_special_cases(const simd8 input, const simd8 prev1) { - // Bit 0 = Too Short (lead byte/ASCII followed by lead byte/ASCII) - // Bit 1 = Too Long (ASCII followed by continuation) - // Bit 2 = Overlong 3-byte - // Bit 4 = Surrogate - // Bit 5 = Overlong 2-byte - // Bit 7 = Two Continuations - constexpr const uint8_t TOO_SHORT = 1 << 0; // 11______ 0_______ - // 11______ 11______ - constexpr const uint8_t TOO_LONG = 1 << 1; // 0_______ 10______ - constexpr const uint8_t OVERLONG_3 = 1 << 2; // 11100000 100_____ - constexpr const uint8_t SURROGATE = 1 << 4; // 11101101 101_____ - constexpr const uint8_t OVERLONG_2 = 1 << 5; // 1100000_ 10______ - constexpr const uint8_t TWO_CONTS = 1 << 7; // 10______ 10______ - constexpr const uint8_t TOO_LARGE = 1 << 3; // 11110100 1001____ - // 11110100 101_____ - // 11110101 1001____ - // 11110101 101_____ - // 1111011_ 1001____ - // 1111011_ 101_____ - // 11111___ 1001____ - // 11111___ 101_____ - constexpr const uint8_t TOO_LARGE_1000 = 1 << 6; - // 11110101 1000____ - // 1111011_ 1000____ - // 11111___ 1000____ - constexpr const uint8_t OVERLONG_4 = 1 << 6; // 11110000 1000____ - - const simd8 byte_1_high = prev1.shr<4>().lookup_16( - // 0_______ ________ - TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, - TOO_LONG, - // 10______ ________ - TWO_CONTS, TWO_CONTS, TWO_CONTS, TWO_CONTS, - // 1100____ ________ - TOO_SHORT | OVERLONG_2, - // 1101____ ________ - TOO_SHORT, - // 1110____ ________ - TOO_SHORT | OVERLONG_3 | SURROGATE, - // 1111____ ________ - TOO_SHORT | TOO_LARGE | TOO_LARGE_1000 | OVERLONG_4); - constexpr const uint8_t CARRY = - TOO_SHORT | TOO_LONG | TWO_CONTS; // These all have ____ in byte 1 . - const simd8 byte_1_low = - (prev1 & 0x0F) - .lookup_16( - // ____0000 ________ - CARRY | OVERLONG_3 | OVERLONG_2 | OVERLONG_4, - // ____0001 ________ - CARRY | OVERLONG_2, - // ____001_ ________ - CARRY, CARRY, - - // ____0100 ________ - CARRY | TOO_LARGE, - // ____0101 ________ - CARRY | TOO_LARGE | TOO_LARGE_1000, - // ____011_ ________ - CARRY | TOO_LARGE | TOO_LARGE_1000, - CARRY | TOO_LARGE | TOO_LARGE_1000, + We consider three cases: + 1. an input register contains no surrogates and each value + is in range 0x0000 .. 0x07ff. + 2. an input register contains no surrogates and values are + is in range 0x0000 .. 0xffff. + 3. an input register contains surrogates --- i.e. codepoints + can have 16 or 32 bits. - // ____1___ ________ - CARRY | TOO_LARGE | TOO_LARGE_1000, - CARRY | TOO_LARGE | TOO_LARGE_1000, - CARRY | TOO_LARGE | TOO_LARGE_1000, - CARRY | TOO_LARGE | TOO_LARGE_1000, - CARRY | TOO_LARGE | TOO_LARGE_1000, - // ____1101 ________ - CARRY | TOO_LARGE | TOO_LARGE_1000 | SURROGATE, - CARRY | TOO_LARGE | TOO_LARGE_1000, - CARRY | TOO_LARGE | TOO_LARGE_1000); - const simd8 byte_2_high = input.shr<4>().lookup_16( - // ________ 0_______ - TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, - TOO_SHORT, TOO_SHORT, + Ad 1. - // ________ 1000____ - TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE_1000 | - OVERLONG_4, - // ________ 1001____ - TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE, - // ________ 101_____ - TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, - TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, + When values are less than 0x0800, it means that a 16-bit code unit + can be converted into: 1) single UTF8 byte (when it is an ASCII + char) or 2) two UTF8 bytes. - // ________ 11______ - TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT); - return (byte_1_high & byte_1_low & byte_2_high); -} -simdutf_really_inline simd8 -check_multibyte_lengths(const simd8 input, - const simd8 prev_input, - const simd8 sc) { - simd8 prev2 = input.prev<2>(prev_input); - simd8 prev3 = input.prev<3>(prev_input); - simd8 must23 = - simd8(must_be_2_3_continuation(prev2, prev3)); - simd8 must23_80 = must23 & uint8_t(0x80); - return must23_80 ^ sc; -} + For this case we do only some shuffle to obtain these 2-byte + codes and finally compress the whole SSE register with a single + shuffle. -struct validating_transcoder { - // If this is nonzero, there has been a UTF-8 error. - simd8 error; + We need 256-entry lookup table to get a compression pattern + and the number of output bytes in the compressed vector register. + Each entry occupies 17 bytes. - validating_transcoder() : error(uint8_t(0)) {} - // - // Check whether the current bytes are valid UTF-8. - // - simdutf_really_inline void check_utf8_bytes(const simd8 input, - const simd8 prev_input) { - // Flip prev1...prev3 so we can easily determine if they are 2+, 3+ or 4+ - // lead bytes (2, 3, 4-byte leads become large positive numbers instead of - // small negative numbers) - simd8 prev1 = input.prev<1>(prev_input); - simd8 sc = check_special_cases(input, prev1); - this->error |= check_multibyte_lengths(input, prev_input, sc); - } + Ad 2. - template - simdutf_really_inline size_t convert(const char *in, size_t size, - char16_t *utf16_output) { - size_t pos = 0; - char16_t *start{utf16_output}; - // In the worst case, we have the haswell kernel which can cause an overflow - // of 8 bytes when calling convert_masked_utf8_to_utf16. If you skip the - // last 16 bytes, and if the data is valid, then it is entirely safe because - // 16 UTF-8 bytes generate much more than 8 bytes. However, you cannot - // generally assume that you have valid UTF-8 input, so we are going to go - // back from the end counting 8 leading bytes, to give us a good margin. - size_t leading_byte = 0; - size_t margin = size; - for (; margin > 0 && leading_byte < 8; margin--) { - leading_byte += (int8_t(in[margin - 1]) > -65); - } - // If the input is long enough, then we have that margin-1 is the eight last - // leading byte. - const size_t safety_margin = size - margin + 1; // to avoid overruns! - while (pos + 64 + safety_margin <= size) { - simd8x64 input(reinterpret_cast(in + pos)); - if (input.is_ascii()) { - input.store_ascii_as_utf16(utf16_output); - utf16_output += 64; - pos += 64; - } else { - // you might think that a for-loop would work, but under Visual Studio, - // it is not good enough. - static_assert( - (simd8x64::NUM_CHUNKS == 2) || - (simd8x64::NUM_CHUNKS == 4), - "We support either two or four chunks per 64-byte block."); - auto zero = simd8{uint8_t(0)}; - if (simd8x64::NUM_CHUNKS == 2) { - this->check_utf8_bytes(input.chunks[0], zero); - this->check_utf8_bytes(input.chunks[1], input.chunks[0]); - } else if (simd8x64::NUM_CHUNKS == 4) { - this->check_utf8_bytes(input.chunks[0], zero); - this->check_utf8_bytes(input.chunks[1], input.chunks[0]); - this->check_utf8_bytes(input.chunks[2], input.chunks[1]); - this->check_utf8_bytes(input.chunks[3], input.chunks[2]); - } - uint64_t utf8_continuation_mask = input.lt(-65 + 1); - if (utf8_continuation_mask & 1) { - return 0; // error - } - uint64_t utf8_leading_mask = ~utf8_continuation_mask; - uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; - // We process in blocks of up to 12 bytes except possibly - // for fast paths which may process up to 16 bytes. For the - // slow path to work, we should have at least 12 input bytes left. - size_t max_starting_point = (pos + 64) - 12; - // Next loop is going to run at least five times. - while (pos < max_starting_point) { - // Performance note: our ability to compute 'consumed' and - // then shift and recompute is critical. If there is a - // latency of, say, 4 cycles on getting 'consumed', then - // the inner loop might have a total latency of about 6 cycles. - // Yet we process between 6 to 12 inputs bytes, thus we get - // a speed limit between 1 cycle/byte and 0.5 cycle/byte - // for this section of the code. Hence, there is a limit - // to how much we can further increase this latency before - // it seriously harms performance. - size_t consumed = convert_masked_utf8_to_utf16( - in + pos, utf8_end_of_code_point_mask, utf16_output); - pos += consumed; - utf8_end_of_code_point_mask >>= consumed; - } - // At this point there may remain between 0 and 12 bytes in the - // 64-byte block. These bytes will be processed again. So we have an - // 80% efficiency (in the worst case). In practice we expect an - // 85% to 90% efficiency. - } - } - if (errors()) { - return 0; - } - if (pos < size) { - size_t howmany = scalar::utf8_to_utf16::convert( - in + pos, size - pos, utf16_output); - if (howmany == 0) { - return 0; - } - utf16_output += howmany; - } - return utf16_output - start; - } + When values fit in 16-bit code units, but are above 0x07ff, then + a single word may produce one, two or three UTF8 bytes. - template - simdutf_really_inline result convert_with_errors(const char *in, size_t size, - char16_t *utf16_output) { - size_t pos = 0; - char16_t *start{utf16_output}; - // In the worst case, we have the haswell kernel which can cause an overflow - // of 8 bytes when calling convert_masked_utf8_to_utf16. If you skip the - // last 16 bytes, and if the data is valid, then it is entirely safe because - // 16 UTF-8 bytes generate much more than 8 bytes. However, you cannot - // generally assume that you have valid UTF-8 input, so we are going to go - // back from the end counting 8 leading bytes, to give us a good margin. - size_t leading_byte = 0; - size_t margin = size; - for (; margin > 0 && leading_byte < 8; margin--) { - leading_byte += (int8_t(in[margin - 1]) > -65); - } - // If the input is long enough, then we have that margin-1 is the eight last - // leading byte. - const size_t safety_margin = size - margin + 1; // to avoid overruns! - while (pos + 64 + safety_margin <= size) { - simd8x64 input(reinterpret_cast(in + pos)); - if (input.is_ascii()) { - input.store_ascii_as_utf16(utf16_output); - utf16_output += 64; - pos += 64; - } else { - // you might think that a for-loop would work, but under Visual Studio, - // it is not good enough. - static_assert( - (simd8x64::NUM_CHUNKS == 2) || - (simd8x64::NUM_CHUNKS == 4), - "We support either two or four chunks per 64-byte block."); - auto zero = simd8{uint8_t(0)}; - if (simd8x64::NUM_CHUNKS == 2) { - this->check_utf8_bytes(input.chunks[0], zero); - this->check_utf8_bytes(input.chunks[1], input.chunks[0]); - } else if (simd8x64::NUM_CHUNKS == 4) { - this->check_utf8_bytes(input.chunks[0], zero); - this->check_utf8_bytes(input.chunks[1], input.chunks[0]); - this->check_utf8_bytes(input.chunks[2], input.chunks[1]); - this->check_utf8_bytes(input.chunks[3], input.chunks[2]); - } - uint64_t utf8_continuation_mask = input.lt(-65 + 1); - if (errors() || (utf8_continuation_mask & 1)) { - // rewind_and_convert_with_errors will seek a potential error from - // in+pos onward, with the ability to go back up to pos bytes, and - // read size-pos bytes forward. - result res = - scalar::utf8_to_utf16::rewind_and_convert_with_errors( - pos, in + pos, size - pos, utf16_output); - res.count += pos; - return res; - } - uint64_t utf8_leading_mask = ~utf8_continuation_mask; - uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; - // We process in blocks of up to 12 bytes except possibly - // for fast paths which may process up to 16 bytes. For the - // slow path to work, we should have at least 12 input bytes left. - size_t max_starting_point = (pos + 64) - 12; - // Next loop is going to run at least five times. - while (pos < max_starting_point) { - // Performance note: our ability to compute 'consumed' and - // then shift and recompute is critical. If there is a - // latency of, say, 4 cycles on getting 'consumed', then - // the inner loop might have a total latency of about 6 cycles. - // Yet we process between 6 to 12 inputs bytes, thus we get - // a speed limit between 1 cycle/byte and 0.5 cycle/byte - // for this section of the code. Hence, there is a limit - // to how much we can further increase this latency before - // it seriously harms performance. - size_t consumed = convert_masked_utf8_to_utf16( - in + pos, utf8_end_of_code_point_mask, utf16_output); - pos += consumed; - utf8_end_of_code_point_mask >>= consumed; - } - // At this point there may remain between 0 and 12 bytes in the - // 64-byte block. These bytes will be processed again. So we have an - // 80% efficiency (in the worst case). In practice we expect an - // 85% to 90% efficiency. - } - } - if (errors()) { - // rewind_and_convert_with_errors will seek a potential error from in+pos - // onward, with the ability to go back up to pos bytes, and read size-pos - // bytes forward. - result res = - scalar::utf8_to_utf16::rewind_and_convert_with_errors( - pos, in + pos, size - pos, utf16_output); - res.count += pos; - return res; - } - if (pos < size) { - // rewind_and_convert_with_errors will seek a potential error from in+pos - // onward, with the ability to go back up to pos bytes, and read size-pos - // bytes forward. - result res = - scalar::utf8_to_utf16::rewind_and_convert_with_errors( - pos, in + pos, size - pos, utf16_output); - if (res.error) { // In case of error, we want the error position - res.count += pos; - return res; - } else { // In case of success, we want the number of word written - utf16_output += res.count; - } - } - return result(error_code::SUCCESS, utf16_output - start); - } + We prepare data for all these three cases in two registers. + The first register contains lower two UTF8 bytes (used in all + cases), while the second one contains just the third byte for + the three-UTF8-bytes case. - simdutf_really_inline bool errors() const { - return this->error.any_bits_set_anywhere(); - } + Finally these two registers are interleaved forming eight-element + array of 32-bit values. The array spans two SSE registers. + The bytes from the registers are compressed using two shuffles. -}; // struct utf8_checker -} // namespace utf8_to_utf16 -} // unnamed namespace -} // namespace arm64 -} // namespace simdutf -/* end file src/generic/utf8_to_utf16/utf8_to_utf16.h */ -/* begin file src/generic/utf8_to_utf16/valid_utf8_to_utf16.h */ + We need 256-entry lookup table to get a compression pattern + and the number of output bytes in the compressed vector register. + Each entry occupies 17 bytes. -namespace simdutf { -namespace arm64 { -namespace { -namespace utf8_to_utf16 { -using namespace simd; + To summarize: + - We need two 256-entry tables that have 8704 bytes in total. +*/ -template -simdutf_warn_unused size_t convert_valid(const char *input, size_t size, - char16_t *utf16_output) noexcept { - // The implementation is not specific to haswell and should be moved to the - // generic directory. - size_t pos = 0; - char16_t *start{utf16_output}; - const size_t safety_margin = 16; // to avoid overruns! - while (pos + 64 + safety_margin <= size) { - // this loop could be unrolled further. For example, we could process the - // mask far more than 64 bytes. - simd8x64 in(reinterpret_cast(input + pos)); - if (in.is_ascii()) { - in.store_ascii_as_utf16(utf16_output); - utf16_output += 64; - pos += 64; - } else { - // Slow path. We hope that the compiler will recognize that this is a slow - // path. Anything that is not a continuation mask is a 'leading byte', - // that is, the start of a new code point. - uint64_t utf8_continuation_mask = in.lt(-65 + 1); - // -65 is 0b10111111 in two-complement's, so largest possible continuation - // byte - uint64_t utf8_leading_mask = ~utf8_continuation_mask; - // The *start* of code points is not so useful, rather, we want the *end* - // of code points. - uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; - // We process in blocks of up to 12 bytes except possibly - // for fast paths which may process up to 16 bytes. For the - // slow path to work, we should have at least 12 input bytes left. - size_t max_starting_point = (pos + 64) - 12; - // Next loop is going to run at least five times when using solely - // the slow/regular path, and at least four times if there are fast paths. - while (pos < max_starting_point) { - // Performance note: our ability to compute 'consumed' and - // then shift and recompute is critical. If there is a - // latency of, say, 4 cycles on getting 'consumed', then - // the inner loop might have a total latency of about 6 cycles. - // Yet we process between 6 to 12 inputs bytes, thus we get - // a speed limit between 1 cycle/byte and 0.5 cycle/byte - // for this section of the code. Hence, there is a limit - // to how much we can further increase this latency before - // it seriously harms performance. - // - // Thus we may allow convert_masked_utf8_to_utf16 to process - // more bytes at a time under a fast-path mode where 16 bytes - // are consumed at once (e.g., when encountering ASCII). - size_t consumed = convert_masked_utf8_to_utf16( - input + pos, utf8_end_of_code_point_mask, utf16_output); - pos += consumed; - utf8_end_of_code_point_mask >>= consumed; - } - // At this point there may remain between 0 and 12 bytes in the - // 64-byte block. These bytes will be processed again. So we have an - // 80% efficiency (in the worst case). In practice we expect an - // 85% to 90% efficiency. +/* + Returns a pair: the first unprocessed byte from buf and utf8_output + A scalar routing should carry on the conversion of the tail. +*/ +template +std::pair +avx2_convert_utf16_to_utf8(const char16_t *buf, size_t len, char *utf8_output) { + const char16_t *end = buf + len; + const __m256i v_0000 = _mm256_setzero_si256(); + const __m256i v_f800 = _mm256_set1_epi16((int16_t)0xf800); + const __m256i v_d800 = _mm256_set1_epi16((int16_t)0xd800); + const __m256i v_c080 = _mm256_set1_epi16((int16_t)0xc080); + const size_t safety_margin = + 12; // to avoid overruns, see issue + // https://github.com/simdutf/simdutf/issues/92 + + while (end - buf >= std::ptrdiff_t(16 + safety_margin)) { + __m256i in = _mm256_loadu_si256((__m256i *)buf); + if (big_endian) { + const __m256i swap = _mm256_setr_epi8( + 1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14, 17, 16, 19, 18, + 21, 20, 23, 22, 25, 24, 27, 26, 29, 28, 31, 30); + in = _mm256_shuffle_epi8(in, swap); } - } - utf16_output += scalar::utf8_to_utf16::convert_valid( - input + pos, size - pos, utf16_output); - return utf16_output - start; -} + // a single 16-bit UTF-16 word can yield 1, 2 or 3 UTF-8 bytes + const __m256i v_ff80 = _mm256_set1_epi16((int16_t)0xff80); + if (_mm256_testz_si256(in, v_ff80)) { // ASCII fast path!!!! + // 1. pack the bytes + const __m128i utf8_packed = _mm_packus_epi16( + _mm256_castsi256_si128(in), _mm256_extractf128_si256(in, 1)); + // 2. store (16 bytes) + _mm_storeu_si128((__m128i *)utf8_output, utf8_packed); + // 3. adjust pointers + buf += 16; + utf8_output += 16; + continue; // we are done for this round! + } + // no bits set above 7th bit + const __m256i one_byte_bytemask = + _mm256_cmpeq_epi16(_mm256_and_si256(in, v_ff80), v_0000); + const uint32_t one_byte_bitmask = + static_cast(_mm256_movemask_epi8(one_byte_bytemask)); -} // namespace utf8_to_utf16 -} // unnamed namespace -} // namespace arm64 -} // namespace simdutf -/* end file src/generic/utf8_to_utf16/valid_utf8_to_utf16.h */ -// transcoding from UTF-8 to UTF-32 -/* begin file src/generic/utf8_to_utf32/utf8_to_utf32.h */ + // no bits set above 11th bit + const __m256i one_or_two_bytes_bytemask = + _mm256_cmpeq_epi16(_mm256_and_si256(in, v_f800), v_0000); + const uint32_t one_or_two_bytes_bitmask = + static_cast(_mm256_movemask_epi8(one_or_two_bytes_bytemask)); + if (one_or_two_bytes_bitmask == 0xffffffff) { -namespace simdutf { -namespace arm64 { -namespace { -namespace utf8_to_utf32 { -using namespace simd; + // 1. prepare 2-byte values + // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8 + // expected output : [110a|aaaa|10bb|bbbb] x 8 + const __m256i v_1f00 = _mm256_set1_epi16((int16_t)0x1f00); + const __m256i v_003f = _mm256_set1_epi16((int16_t)0x003f); -simdutf_really_inline simd8 -check_special_cases(const simd8 input, const simd8 prev1) { - // Bit 0 = Too Short (lead byte/ASCII followed by lead byte/ASCII) - // Bit 1 = Too Long (ASCII followed by continuation) - // Bit 2 = Overlong 3-byte - // Bit 4 = Surrogate - // Bit 5 = Overlong 2-byte - // Bit 7 = Two Continuations - constexpr const uint8_t TOO_SHORT = 1 << 0; // 11______ 0_______ - // 11______ 11______ - constexpr const uint8_t TOO_LONG = 1 << 1; // 0_______ 10______ - constexpr const uint8_t OVERLONG_3 = 1 << 2; // 11100000 100_____ - constexpr const uint8_t SURROGATE = 1 << 4; // 11101101 101_____ - constexpr const uint8_t OVERLONG_2 = 1 << 5; // 1100000_ 10______ - constexpr const uint8_t TWO_CONTS = 1 << 7; // 10______ 10______ - constexpr const uint8_t TOO_LARGE = 1 << 3; // 11110100 1001____ - // 11110100 101_____ - // 11110101 1001____ - // 11110101 101_____ - // 1111011_ 1001____ - // 1111011_ 101_____ - // 11111___ 1001____ - // 11111___ 101_____ - constexpr const uint8_t TOO_LARGE_1000 = 1 << 6; - // 11110101 1000____ - // 1111011_ 1000____ - // 11111___ 1000____ - constexpr const uint8_t OVERLONG_4 = 1 << 6; // 11110000 1000____ + // t0 = [000a|aaaa|bbbb|bb00] + const __m256i t0 = _mm256_slli_epi16(in, 2); + // t1 = [000a|aaaa|0000|0000] + const __m256i t1 = _mm256_and_si256(t0, v_1f00); + // t2 = [0000|0000|00bb|bbbb] + const __m256i t2 = _mm256_and_si256(in, v_003f); + // t3 = [000a|aaaa|00bb|bbbb] + const __m256i t3 = _mm256_or_si256(t1, t2); + // t4 = [110a|aaaa|10bb|bbbb] + const __m256i t4 = _mm256_or_si256(t3, v_c080); - const simd8 byte_1_high = prev1.shr<4>().lookup_16( - // 0_______ ________ - TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, - TOO_LONG, - // 10______ ________ - TWO_CONTS, TWO_CONTS, TWO_CONTS, TWO_CONTS, - // 1100____ ________ - TOO_SHORT | OVERLONG_2, - // 1101____ ________ - TOO_SHORT, - // 1110____ ________ - TOO_SHORT | OVERLONG_3 | SURROGATE, - // 1111____ ________ - TOO_SHORT | TOO_LARGE | TOO_LARGE_1000 | OVERLONG_4); - constexpr const uint8_t CARRY = - TOO_SHORT | TOO_LONG | TWO_CONTS; // These all have ____ in byte 1 . - const simd8 byte_1_low = - (prev1 & 0x0F) - .lookup_16( - // ____0000 ________ - CARRY | OVERLONG_3 | OVERLONG_2 | OVERLONG_4, - // ____0001 ________ - CARRY | OVERLONG_2, - // ____001_ ________ - CARRY, CARRY, + // 2. merge ASCII and 2-byte codewords + const __m256i utf8_unpacked = + _mm256_blendv_epi8(t4, in, one_byte_bytemask); + + // 3. prepare bitmask for 8-bit lookup + const uint32_t M0 = one_byte_bitmask & 0x55555555; + const uint32_t M1 = M0 >> 7; + const uint32_t M2 = (M1 | M0) & 0x00ff00ff; + // 4. pack the bytes + + const uint8_t *row = + &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[uint8_t(M2)][0]; + const uint8_t *row_2 = + &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[uint8_t(M2 >> + 16)][0]; + + const __m128i shuffle = _mm_loadu_si128((__m128i *)(row + 1)); + const __m128i shuffle_2 = _mm_loadu_si128((__m128i *)(row_2 + 1)); - // ____0100 ________ - CARRY | TOO_LARGE, - // ____0101 ________ - CARRY | TOO_LARGE | TOO_LARGE_1000, - // ____011_ ________ - CARRY | TOO_LARGE | TOO_LARGE_1000, - CARRY | TOO_LARGE | TOO_LARGE_1000, + const __m256i utf8_packed = _mm256_shuffle_epi8( + utf8_unpacked, _mm256_setr_m128i(shuffle, shuffle_2)); + // 5. store bytes + _mm_storeu_si128((__m128i *)utf8_output, + _mm256_castsi256_si128(utf8_packed)); + utf8_output += row[0]; + _mm_storeu_si128((__m128i *)utf8_output, + _mm256_extractf128_si256(utf8_packed, 1)); + utf8_output += row_2[0]; - // ____1___ ________ - CARRY | TOO_LARGE | TOO_LARGE_1000, - CARRY | TOO_LARGE | TOO_LARGE_1000, - CARRY | TOO_LARGE | TOO_LARGE_1000, - CARRY | TOO_LARGE | TOO_LARGE_1000, - CARRY | TOO_LARGE | TOO_LARGE_1000, - // ____1101 ________ - CARRY | TOO_LARGE | TOO_LARGE_1000 | SURROGATE, - CARRY | TOO_LARGE | TOO_LARGE_1000, - CARRY | TOO_LARGE | TOO_LARGE_1000); - const simd8 byte_2_high = input.shr<4>().lookup_16( - // ________ 0_______ - TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, - TOO_SHORT, TOO_SHORT, + // 6. adjust pointers + buf += 16; + continue; + } + // 1. Check if there are any surrogate word in the input chunk. + // We have also deal with situation when there is a surrogate word + // at the end of a chunk. + const __m256i surrogates_bytemask = + _mm256_cmpeq_epi16(_mm256_and_si256(in, v_f800), v_d800); - // ________ 1000____ - TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE_1000 | - OVERLONG_4, - // ________ 1001____ - TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE, - // ________ 101_____ - TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, - TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, + // bitmask = 0x0000 if there are no surrogates + // = 0xc000 if the last word is a surrogate + const uint32_t surrogates_bitmask = + static_cast(_mm256_movemask_epi8(surrogates_bytemask)); + // It might seem like checking for surrogates_bitmask == 0xc000 could help. + // However, it is likely an uncommon occurrence. + if (surrogates_bitmask == 0x00000000) { + // case: code units from register produce either 1, 2 or 3 UTF-8 bytes + const __m256i dup_even = _mm256_setr_epi16( + 0x0000, 0x0202, 0x0404, 0x0606, 0x0808, 0x0a0a, 0x0c0c, 0x0e0e, + 0x0000, 0x0202, 0x0404, 0x0606, 0x0808, 0x0a0a, 0x0c0c, 0x0e0e); - // ________ 11______ - TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT); - return (byte_1_high & byte_1_low & byte_2_high); -} -simdutf_really_inline simd8 -check_multibyte_lengths(const simd8 input, - const simd8 prev_input, - const simd8 sc) { - simd8 prev2 = input.prev<2>(prev_input); - simd8 prev3 = input.prev<3>(prev_input); - simd8 must23 = - simd8(must_be_2_3_continuation(prev2, prev3)); - simd8 must23_80 = must23 & uint8_t(0x80); - return must23_80 ^ sc; -} + /* In this branch we handle three cases: + 1. [0000|0000|0ccc|cccc] => [0ccc|cccc] - + single UFT-8 byte + 2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc] - two + UTF-8 bytes + 3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - + three UTF-8 bytes -struct validating_transcoder { - // If this is nonzero, there has been a UTF-8 error. - simd8 error; + We expand the input word (16-bit) into two code units (32-bit), thus + we have room for four bytes. However, we need five distinct bit + layouts. Note that the last byte in cases #2 and #3 is the same. - validating_transcoder() : error(uint8_t(0)) {} - // - // Check whether the current bytes are valid UTF-8. - // - simdutf_really_inline void check_utf8_bytes(const simd8 input, - const simd8 prev_input) { - // Flip prev1...prev3 so we can easily determine if they are 2+, 3+ or 4+ - // lead bytes (2, 3, 4-byte leads become large positive numbers instead of - // small negative numbers) - simd8 prev1 = input.prev<1>(prev_input); - simd8 sc = check_special_cases(input, prev1); - this->error |= check_multibyte_lengths(input, prev_input, sc); - } + We precompute byte 1 for case #1 and the common byte for cases #2 & #3 + in register t2. - simdutf_really_inline size_t convert(const char *in, size_t size, - char32_t *utf32_output) { - size_t pos = 0; - char32_t *start{utf32_output}; - // In the worst case, we have the haswell kernel which can cause an overflow - // of 8 words when calling convert_masked_utf8_to_utf32. If you skip the - // last 16 bytes, and if the data is valid, then it is entirely safe because - // 16 UTF-8 bytes generate much more than 8 bytes. However, you cannot - // generally assume that you have valid UTF-8 input, so we are going to go - // back from the end counting 16 leading bytes, to give us a good margin. - size_t leading_byte = 0; - size_t margin = size; - for (; margin > 0 && leading_byte < 8; margin--) { - leading_byte += (int8_t(in[margin - 1]) > -65); - } - // If the input is long enough, then we have that margin-1 is the fourth - // last leading byte. - const size_t safety_margin = size - margin + 1; // to avoid overruns! - while (pos + 64 + safety_margin <= size) { - simd8x64 input(reinterpret_cast(in + pos)); - if (input.is_ascii()) { - input.store_ascii_as_utf32(utf32_output); - utf32_output += 64; - pos += 64; - } else { - // you might think that a for-loop would work, but under Visual Studio, - // it is not good enough. - static_assert( - (simd8x64::NUM_CHUNKS == 2) || - (simd8x64::NUM_CHUNKS == 4), - "We support either two or four chunks per 64-byte block."); - auto zero = simd8{uint8_t(0)}; - if (simd8x64::NUM_CHUNKS == 2) { - this->check_utf8_bytes(input.chunks[0], zero); - this->check_utf8_bytes(input.chunks[1], input.chunks[0]); - } else if (simd8x64::NUM_CHUNKS == 4) { - this->check_utf8_bytes(input.chunks[0], zero); - this->check_utf8_bytes(input.chunks[1], input.chunks[0]); - this->check_utf8_bytes(input.chunks[2], input.chunks[1]); - this->check_utf8_bytes(input.chunks[3], input.chunks[2]); - } - uint64_t utf8_continuation_mask = input.lt(-65 + 1); - if (utf8_continuation_mask & 1) { - return 0; // we have an error - } - uint64_t utf8_leading_mask = ~utf8_continuation_mask; - uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; - // We process in blocks of up to 12 bytes except possibly - // for fast paths which may process up to 16 bytes. For the - // slow path to work, we should have at least 12 input bytes left. - size_t max_starting_point = (pos + 64) - 12; - // Next loop is going to run at least five times. - while (pos < max_starting_point) { - // Performance note: our ability to compute 'consumed' and - // then shift and recompute is critical. If there is a - // latency of, say, 4 cycles on getting 'consumed', then - // the inner loop might have a total latency of about 6 cycles. - // Yet we process between 6 to 12 inputs bytes, thus we get - // a speed limit between 1 cycle/byte and 0.5 cycle/byte - // for this section of the code. Hence, there is a limit - // to how much we can further increase this latency before - // it seriously harms performance. - size_t consumed = convert_masked_utf8_to_utf32( - in + pos, utf8_end_of_code_point_mask, utf32_output); - pos += consumed; - utf8_end_of_code_point_mask >>= consumed; - } - // At this point there may remain between 0 and 12 bytes in the - // 64-byte block. These bytes will be processed again. So we have an - // 80% efficiency (in the worst case). In practice we expect an - // 85% to 90% efficiency. - } - } - if (errors()) { - return 0; - } - if (pos < size) { - size_t howmany = - scalar::utf8_to_utf32::convert(in + pos, size - pos, utf32_output); - if (howmany == 0) { - return 0; - } - utf32_output += howmany; - } - return utf32_output - start; - } + We precompute byte 1 for case #3 and -- **conditionally** -- precompute + either byte 1 for case #2 or byte 2 for case #3. Note that they + differ by exactly one bit. - simdutf_really_inline result convert_with_errors(const char *in, size_t size, - char32_t *utf32_output) { - size_t pos = 0; - char32_t *start{utf32_output}; - // In the worst case, we have the haswell kernel which can cause an overflow - // of 8 bytes when calling convert_masked_utf8_to_utf32. If you skip the - // last 16 bytes, and if the data is valid, then it is entirely safe because - // 16 UTF-8 bytes generate much more than 8 bytes. However, you cannot - // generally assume that you have valid UTF-8 input, so we are going to go - // back from the end counting 8 leading bytes, to give us a good margin. - size_t leading_byte = 0; - size_t margin = size; - for (; margin > 0 && leading_byte < 8; margin--) { - leading_byte += (int8_t(in[margin - 1]) > -65); - } - // If the input is long enough, then we have that margin-1 is the fourth - // last leading byte. - const size_t safety_margin = size - margin + 1; // to avoid overruns! - while (pos + 64 + safety_margin <= size) { - simd8x64 input(reinterpret_cast(in + pos)); - if (input.is_ascii()) { - input.store_ascii_as_utf32(utf32_output); - utf32_output += 64; - pos += 64; - } else { - // you might think that a for-loop would work, but under Visual Studio, - // it is not good enough. - static_assert( - (simd8x64::NUM_CHUNKS == 2) || - (simd8x64::NUM_CHUNKS == 4), - "We support either two or four chunks per 64-byte block."); - auto zero = simd8{uint8_t(0)}; - if (simd8x64::NUM_CHUNKS == 2) { - this->check_utf8_bytes(input.chunks[0], zero); - this->check_utf8_bytes(input.chunks[1], input.chunks[0]); - } else if (simd8x64::NUM_CHUNKS == 4) { - this->check_utf8_bytes(input.chunks[0], zero); - this->check_utf8_bytes(input.chunks[1], input.chunks[0]); - this->check_utf8_bytes(input.chunks[2], input.chunks[1]); - this->check_utf8_bytes(input.chunks[3], input.chunks[2]); - } - uint64_t utf8_continuation_mask = input.lt(-65 + 1); - if (errors() || (utf8_continuation_mask & 1)) { - result res = scalar::utf8_to_utf32::rewind_and_convert_with_errors( - pos, in + pos, size - pos, utf32_output); - res.count += pos; - return res; - } - uint64_t utf8_leading_mask = ~utf8_continuation_mask; - uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; - // We process in blocks of up to 12 bytes except possibly - // for fast paths which may process up to 16 bytes. For the - // slow path to work, we should have at least 12 input bytes left. - size_t max_starting_point = (pos + 64) - 12; - // Next loop is going to run at least five times. - while (pos < max_starting_point) { - // Performance note: our ability to compute 'consumed' and - // then shift and recompute is critical. If there is a - // latency of, say, 4 cycles on getting 'consumed', then - // the inner loop might have a total latency of about 6 cycles. - // Yet we process between 6 to 12 inputs bytes, thus we get - // a speed limit between 1 cycle/byte and 0.5 cycle/byte - // for this section of the code. Hence, there is a limit - // to how much we can further increase this latency before - // it seriously harms performance. - size_t consumed = convert_masked_utf8_to_utf32( - in + pos, utf8_end_of_code_point_mask, utf32_output); - pos += consumed; - utf8_end_of_code_point_mask >>= consumed; - } - // At this point there may remain between 0 and 12 bytes in the - // 64-byte block. These bytes will be processed again. So we have an - // 80% efficiency (in the worst case). In practice we expect an - // 85% to 90% efficiency. - } - } - if (errors()) { - result res = scalar::utf8_to_utf32::rewind_and_convert_with_errors( - pos, in + pos, size - pos, utf32_output); - res.count += pos; - return res; - } - if (pos < size) { - result res = scalar::utf8_to_utf32::rewind_and_convert_with_errors( - pos, in + pos, size - pos, utf32_output); - if (res.error) { // In case of error, we want the error position - res.count += pos; - return res; - } else { // In case of success, we want the number of word written - utf32_output += res.count; - } - } - return result(error_code::SUCCESS, utf32_output - start); - } + Finally from these two code units we build proper UTF-8 sequence, taking + into account the case (i.e, the number of bytes to write). + */ + /** + * Given [aaaa|bbbb|bbcc|cccc] our goal is to produce: + * t2 => [0ccc|cccc] [10cc|cccc] + * s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb]) + */ +#define simdutf_vec(x) _mm256_set1_epi16(static_cast(x)) + // [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc] + const __m256i t0 = _mm256_shuffle_epi8(in, dup_even); + // [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc] + const __m256i t1 = _mm256_and_si256(t0, simdutf_vec(0b0011111101111111)); + // [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc] + const __m256i t2 = _mm256_or_si256(t1, simdutf_vec(0b1000000000000000)); - simdutf_really_inline bool errors() const { - return this->error.any_bits_set_anywhere(); - } + // [aaaa|bbbb|bbcc|cccc] => [0000|aaaa|bbbb|bbcc] + const __m256i s0 = _mm256_srli_epi16(in, 4); + // [0000|aaaa|bbbb|bbcc] => [0000|aaaa|bbbb|bb00] + const __m256i s1 = _mm256_and_si256(s0, simdutf_vec(0b0000111111111100)); + // [0000|aaaa|bbbb|bb00] => [00bb|bbbb|0000|aaaa] + const __m256i s2 = _mm256_maddubs_epi16(s1, simdutf_vec(0x0140)); + // [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa] + const __m256i s3 = _mm256_or_si256(s2, simdutf_vec(0b1100000011100000)); + const __m256i m0 = _mm256_andnot_si256(one_or_two_bytes_bytemask, + simdutf_vec(0b0100000000000000)); + const __m256i s4 = _mm256_xor_si256(s3, m0); +#undef simdutf_vec -}; // struct utf8_checker -} // namespace utf8_to_utf32 -} // unnamed namespace -} // namespace arm64 -} // namespace simdutf -/* end file src/generic/utf8_to_utf32/utf8_to_utf32.h */ -/* begin file src/generic/utf8_to_utf32/valid_utf8_to_utf32.h */ + // 4. expand code units 16-bit => 32-bit + const __m256i out0 = _mm256_unpacklo_epi16(t2, s4); + const __m256i out1 = _mm256_unpackhi_epi16(t2, s4); -namespace simdutf { -namespace arm64 { -namespace { -namespace utf8_to_utf32 { + // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle + const uint32_t mask = (one_byte_bitmask & 0x55555555) | + (one_or_two_bytes_bitmask & 0xaaaaaaaa); + // Due to the wider registers, the following path is less likely to be + // useful. + /*if(mask == 0) { + // We only have three-byte code units. Use fast path. + const __m256i shuffle = + _mm256_setr_epi8(2,3,1,6,7,5,10,11,9,14,15,13,-1,-1,-1,-1, + 2,3,1,6,7,5,10,11,9,14,15,13,-1,-1,-1,-1); const __m256i utf8_0 = + _mm256_shuffle_epi8(out0, shuffle); const __m256i utf8_1 = + _mm256_shuffle_epi8(out1, shuffle); + _mm_storeu_si128((__m128i*)utf8_output, _mm256_castsi256_si128(utf8_0)); + utf8_output += 12; + _mm_storeu_si128((__m128i*)utf8_output, _mm256_castsi256_si128(utf8_1)); + utf8_output += 12; + _mm_storeu_si128((__m128i*)utf8_output, + _mm256_extractf128_si256(utf8_0,1)); utf8_output += 12; + _mm_storeu_si128((__m128i*)utf8_output, + _mm256_extractf128_si256(utf8_1,1)); utf8_output += 12; buf += 16; + continue; + }*/ + const uint8_t mask0 = uint8_t(mask); + const uint8_t *row0 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask0][0]; + const __m128i shuffle0 = _mm_loadu_si128((__m128i *)(row0 + 1)); + const __m128i utf8_0 = + _mm_shuffle_epi8(_mm256_castsi256_si128(out0), shuffle0); -using namespace simd; + const uint8_t mask1 = static_cast(mask >> 8); + const uint8_t *row1 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask1][0]; + const __m128i shuffle1 = _mm_loadu_si128((__m128i *)(row1 + 1)); + const __m128i utf8_1 = + _mm_shuffle_epi8(_mm256_castsi256_si128(out1), shuffle1); -simdutf_warn_unused size_t convert_valid(const char *input, size_t size, - char32_t *utf32_output) noexcept { - size_t pos = 0; - char32_t *start{utf32_output}; - const size_t safety_margin = 16; // to avoid overruns! - while (pos + 64 + safety_margin <= size) { - simd8x64 in(reinterpret_cast(input + pos)); - if (in.is_ascii()) { - in.store_ascii_as_utf32(utf32_output); - utf32_output += 64; - pos += 64; - } else { - // -65 is 0b10111111 in two-complement's, so largest possible continuation - // byte - uint64_t utf8_continuation_mask = in.lt(-65 + 1); - uint64_t utf8_leading_mask = ~utf8_continuation_mask; - uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; - size_t max_starting_point = (pos + 64) - 12; - while (pos < max_starting_point) { - size_t consumed = convert_masked_utf8_to_utf32( - input + pos, utf8_end_of_code_point_mask, utf32_output); - pos += consumed; - utf8_end_of_code_point_mask >>= consumed; - } - } - } - utf32_output += scalar::utf8_to_utf32::convert_valid(input + pos, size - pos, - utf32_output); - return utf32_output - start; -} + const uint8_t mask2 = static_cast(mask >> 16); + const uint8_t *row2 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask2][0]; + const __m128i shuffle2 = _mm_loadu_si128((__m128i *)(row2 + 1)); + const __m128i utf8_2 = + _mm_shuffle_epi8(_mm256_extractf128_si256(out0, 1), shuffle2); -} // namespace utf8_to_utf32 -} // unnamed namespace -} // namespace arm64 -} // namespace simdutf -/* end file src/generic/utf8_to_utf32/valid_utf8_to_utf32.h */ -// other functions -/* begin file src/generic/utf16.h */ -namespace simdutf { -namespace arm64 { -namespace { -namespace utf16 { + const uint8_t mask3 = static_cast(mask >> 24); + const uint8_t *row3 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask3][0]; + const __m128i shuffle3 = _mm_loadu_si128((__m128i *)(row3 + 1)); + const __m128i utf8_3 = + _mm_shuffle_epi8(_mm256_extractf128_si256(out1, 1), shuffle3); -template -simdutf_really_inline size_t count_code_points(const char16_t *in, - size_t size) { - size_t pos = 0; - size_t count = 0; - for (; pos < size / 32 * 32; pos += 32) { - simd16x32 input(reinterpret_cast(in + pos)); - if (!match_system(big_endian)) { - input.swap_bytes(); + _mm_storeu_si128((__m128i *)utf8_output, utf8_0); + utf8_output += row0[0]; + _mm_storeu_si128((__m128i *)utf8_output, utf8_1); + utf8_output += row1[0]; + _mm_storeu_si128((__m128i *)utf8_output, utf8_2); + utf8_output += row2[0]; + _mm_storeu_si128((__m128i *)utf8_output, utf8_3); + utf8_output += row3[0]; + buf += 16; + // surrogate pair(s) in a register + } else { + // Let us do a scalar fallback. + // It may seem wasteful to use scalar code, but being efficient with SIMD + // in the presence of surrogate pairs may require non-trivial tables. + size_t forward = 15; + size_t k = 0; + if (size_t(end - buf) < forward + 1) { + forward = size_t(end - buf - 1); + } + for (; k < forward; k++) { + uint16_t word = big_endian ? scalar::utf16::swap_bytes(buf[k]) : buf[k]; + if ((word & 0xFF80) == 0) { + *utf8_output++ = char(word); + } else if ((word & 0xF800) == 0) { + *utf8_output++ = char((word >> 6) | 0b11000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + } else if ((word & 0xF800) != 0xD800) { + *utf8_output++ = char((word >> 12) | 0b11100000); + *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + } else { + // must be a surrogate pair + uint16_t diff = uint16_t(word - 0xD800); + uint16_t next_word = + big_endian ? scalar::utf16::swap_bytes(buf[k + 1]) : buf[k + 1]; + k++; + uint16_t diff2 = uint16_t(next_word - 0xDC00); + if ((diff | diff2) > 0x3FF) { + return std::make_pair(nullptr, utf8_output); + } + uint32_t value = (diff << 10) + diff2 + 0x10000; + *utf8_output++ = char((value >> 18) | 0b11110000); + *utf8_output++ = char(((value >> 12) & 0b111111) | 0b10000000); + *utf8_output++ = char(((value >> 6) & 0b111111) | 0b10000000); + *utf8_output++ = char((value & 0b111111) | 0b10000000); + } + } + buf += k; } - uint64_t not_pair = input.not_in_range(0xDC00, 0xDFFF); - count += count_ones(not_pair) / 2; - } - return count + - scalar::utf16::count_code_points(in + pos, size - pos); + } // while + return std::make_pair(buf, utf8_output); } +/* + Returns a pair: a result struct and utf8_output. + If there is an error, the count field of the result is the position of the + error. Otherwise, it is the position of the first unprocessed byte in buf + (even if finished). A scalar routing should carry on the conversion of the + tail if needed. +*/ template -simdutf_really_inline size_t utf8_length_from_utf16(const char16_t *in, - size_t size) { - size_t pos = 0; - size_t count = 0; - // This algorithm could no doubt be improved! - for (; pos < size / 32 * 32; pos += 32) { - simd16x32 input(reinterpret_cast(in + pos)); - if (!match_system(big_endian)) { - input.swap_bytes(); - } - uint64_t ascii_mask = input.lteq(0x7F); - uint64_t twobyte_mask = input.lteq(0x7FF); - uint64_t not_pair_mask = input.not_in_range(0xD800, 0xDFFF); - - size_t ascii_count = count_ones(ascii_mask) / 2; - size_t twobyte_count = count_ones(twobyte_mask & ~ascii_mask) / 2; - size_t threebyte_count = count_ones(not_pair_mask & ~twobyte_mask) / 2; - size_t fourbyte_count = 32 - count_ones(not_pair_mask) / 2; - count += 2 * fourbyte_count + 3 * threebyte_count + 2 * twobyte_count + - ascii_count; - } - return count + scalar::utf16::utf8_length_from_utf16(in + pos, - size - pos); -} +std::pair +avx2_convert_utf16_to_utf8_with_errors(const char16_t *buf, size_t len, + char *utf8_output) { + const char16_t *start = buf; + const char16_t *end = buf + len; -template -simdutf_really_inline size_t utf32_length_from_utf16(const char16_t *in, - size_t size) { - return count_code_points(in, size); -} + const __m256i v_0000 = _mm256_setzero_si256(); + const __m256i v_f800 = _mm256_set1_epi16((int16_t)0xf800); + const __m256i v_d800 = _mm256_set1_epi16((int16_t)0xd800); + const __m256i v_c080 = _mm256_set1_epi16((int16_t)0xc080); + const size_t safety_margin = + 12; // to avoid overruns, see issue + // https://github.com/simdutf/simdutf/issues/92 -simdutf_really_inline void -change_endianness_utf16(const char16_t *in, size_t size, char16_t *output) { - size_t pos = 0; + while (end - buf >= std::ptrdiff_t(16 + safety_margin)) { + __m256i in = _mm256_loadu_si256((__m256i *)buf); + if (big_endian) { + const __m256i swap = _mm256_setr_epi8( + 1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14, 17, 16, 19, 18, + 21, 20, 23, 22, 25, 24, 27, 26, 29, 28, 31, 30); + in = _mm256_shuffle_epi8(in, swap); + } + // a single 16-bit UTF-16 word can yield 1, 2 or 3 UTF-8 bytes + const __m256i v_ff80 = _mm256_set1_epi16((int16_t)0xff80); + if (_mm256_testz_si256(in, v_ff80)) { // ASCII fast path!!!! + // 1. pack the bytes + const __m128i utf8_packed = _mm_packus_epi16( + _mm256_castsi256_si128(in), _mm256_extractf128_si256(in, 1)); + // 2. store (16 bytes) + _mm_storeu_si128((__m128i *)utf8_output, utf8_packed); + // 3. adjust pointers + buf += 16; + utf8_output += 16; + continue; // we are done for this round! + } + // no bits set above 7th bit + const __m256i one_byte_bytemask = + _mm256_cmpeq_epi16(_mm256_and_si256(in, v_ff80), v_0000); + const uint32_t one_byte_bitmask = + static_cast(_mm256_movemask_epi8(one_byte_bytemask)); - while (pos < size / 32 * 32) { - simd16x32 input(reinterpret_cast(in + pos)); - input.swap_bytes(); - input.store(reinterpret_cast(output)); - pos += 32; - output += 32; - } + // no bits set above 11th bit + const __m256i one_or_two_bytes_bytemask = + _mm256_cmpeq_epi16(_mm256_and_si256(in, v_f800), v_0000); + const uint32_t one_or_two_bytes_bitmask = + static_cast(_mm256_movemask_epi8(one_or_two_bytes_bytemask)); + if (one_or_two_bytes_bitmask == 0xffffffff) { - scalar::utf16::change_endianness_utf16(in + pos, size - pos, output); -} + // 1. prepare 2-byte values + // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8 + // expected output : [110a|aaaa|10bb|bbbb] x 8 + const __m256i v_1f00 = _mm256_set1_epi16((int16_t)0x1f00); + const __m256i v_003f = _mm256_set1_epi16((int16_t)0x003f); -} // namespace utf16 -} // unnamed namespace -} // namespace arm64 -} // namespace simdutf -/* end file src/generic/utf16.h */ -/* begin file src/generic/utf8.h */ + // t0 = [000a|aaaa|bbbb|bb00] + const __m256i t0 = _mm256_slli_epi16(in, 2); + // t1 = [000a|aaaa|0000|0000] + const __m256i t1 = _mm256_and_si256(t0, v_1f00); + // t2 = [0000|0000|00bb|bbbb] + const __m256i t2 = _mm256_and_si256(in, v_003f); + // t3 = [000a|aaaa|00bb|bbbb] + const __m256i t3 = _mm256_or_si256(t1, t2); + // t4 = [110a|aaaa|10bb|bbbb] + const __m256i t4 = _mm256_or_si256(t3, v_c080); -namespace simdutf { -namespace arm64 { -namespace { -namespace utf8 { + // 2. merge ASCII and 2-byte codewords + const __m256i utf8_unpacked = + _mm256_blendv_epi8(t4, in, one_byte_bytemask); -using namespace simd; + // 3. prepare bitmask for 8-bit lookup + const uint32_t M0 = one_byte_bitmask & 0x55555555; + const uint32_t M1 = M0 >> 7; + const uint32_t M2 = (M1 | M0) & 0x00ff00ff; + // 4. pack the bytes -simdutf_really_inline size_t count_code_points(const char *in, size_t size) { - size_t pos = 0; - size_t count = 0; - for (; pos + 64 <= size; pos += 64) { - simd8x64 input(reinterpret_cast(in + pos)); - uint64_t utf8_continuation_mask = input.gt(-65); - count += count_ones(utf8_continuation_mask); - } - return count + scalar::utf8::count_code_points(in + pos, size - pos); -} + const uint8_t *row = + &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[uint8_t(M2)][0]; + const uint8_t *row_2 = + &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[uint8_t(M2 >> + 16)][0]; -simdutf_really_inline size_t utf16_length_from_utf8(const char *in, - size_t size) { - size_t pos = 0; - size_t count = 0; - // This algorithm could no doubt be improved! - for (; pos + 64 <= size; pos += 64) { - simd8x64 input(reinterpret_cast(in + pos)); - uint64_t utf8_continuation_mask = input.lt(-65 + 1); - // We count one word for anything that is not a continuation (so - // leading bytes). - count += 64 - count_ones(utf8_continuation_mask); - int64_t utf8_4byte = input.gteq_unsigned(240); - count += count_ones(utf8_4byte); - } - return count + scalar::utf8::utf16_length_from_utf8(in + pos, size - pos); -} -} // namespace utf8 -} // unnamed namespace -} // namespace arm64 -} // namespace simdutf -/* end file src/generic/utf8.h */ -// transcoding from UTF-8 to Latin 1 -/* begin file src/generic/utf8_to_latin1/utf8_to_latin1.h */ + const __m128i shuffle = _mm_loadu_si128((__m128i *)(row + 1)); + const __m128i shuffle_2 = _mm_loadu_si128((__m128i *)(row_2 + 1)); -namespace simdutf { -namespace arm64 { -namespace { -namespace utf8_to_latin1 { -using namespace simd; + const __m256i utf8_packed = _mm256_shuffle_epi8( + utf8_unpacked, _mm256_setr_m128i(shuffle, shuffle_2)); + // 5. store bytes + _mm_storeu_si128((__m128i *)utf8_output, + _mm256_castsi256_si128(utf8_packed)); + utf8_output += row[0]; + _mm_storeu_si128((__m128i *)utf8_output, + _mm256_extractf128_si256(utf8_packed, 1)); + utf8_output += row_2[0]; -simdutf_really_inline simd8 -check_special_cases(const simd8 input, const simd8 prev1) { - // For UTF-8 to Latin 1, we can allow any ASCII character, and any - // continuation byte, but the non-ASCII leading bytes must be 0b11000011 or - // 0b11000010 and nothing else. - // - // Bit 0 = Too Short (lead byte/ASCII followed by lead byte/ASCII) - // Bit 1 = Too Long (ASCII followed by continuation) - // Bit 2 = Overlong 3-byte - // Bit 4 = Surrogate - // Bit 5 = Overlong 2-byte - // Bit 7 = Two Continuations - constexpr const uint8_t TOO_SHORT = 1 << 0; // 11______ 0_______ - // 11______ 11______ - constexpr const uint8_t TOO_LONG = 1 << 1; // 0_______ 10______ - constexpr const uint8_t OVERLONG_3 = 1 << 2; // 11100000 100_____ - constexpr const uint8_t SURROGATE = 1 << 4; // 11101101 101_____ - constexpr const uint8_t OVERLONG_2 = 1 << 5; // 1100000_ 10______ - constexpr const uint8_t TWO_CONTS = 1 << 7; // 10______ 10______ - constexpr const uint8_t TOO_LARGE = 1 << 3; // 11110100 1001____ - // 11110100 101_____ - // 11110101 1001____ - // 11110101 101_____ - // 1111011_ 1001____ - // 1111011_ 101_____ - // 11111___ 1001____ - // 11111___ 101_____ - constexpr const uint8_t TOO_LARGE_1000 = 1 << 6; - // 11110101 1000____ - // 1111011_ 1000____ - // 11111___ 1000____ - constexpr const uint8_t OVERLONG_4 = 1 << 6; // 11110000 1000____ - constexpr const uint8_t FORBIDDEN = 0xff; + // 6. adjust pointers + buf += 16; + continue; + } + // 1. Check if there are any surrogate word in the input chunk. + // We have also deal with situation when there is a surrogate word + // at the end of a chunk. + const __m256i surrogates_bytemask = + _mm256_cmpeq_epi16(_mm256_and_si256(in, v_f800), v_d800); - const simd8 byte_1_high = prev1.shr<4>().lookup_16( - // 0_______ ________ - TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, - TOO_LONG, - // 10______ ________ - TWO_CONTS, TWO_CONTS, TWO_CONTS, TWO_CONTS, - // 1100____ ________ - TOO_SHORT | OVERLONG_2, - // 1101____ ________ - FORBIDDEN, - // 1110____ ________ - FORBIDDEN, - // 1111____ ________ - FORBIDDEN); - constexpr const uint8_t CARRY = - TOO_SHORT | TOO_LONG | TWO_CONTS; // These all have ____ in byte 1 . - const simd8 byte_1_low = - (prev1 & 0x0F) - .lookup_16( - // ____0000 ________ - CARRY | OVERLONG_3 | OVERLONG_2 | OVERLONG_4, - // ____0001 ________ - CARRY | OVERLONG_2, - // ____001_ ________ - CARRY, CARRY, + // bitmask = 0x0000 if there are no surrogates + // = 0xc000 if the last word is a surrogate + const uint32_t surrogates_bitmask = + static_cast(_mm256_movemask_epi8(surrogates_bytemask)); + // It might seem like checking for surrogates_bitmask == 0xc000 could help. + // However, it is likely an uncommon occurrence. + if (surrogates_bitmask == 0x00000000) { + // case: code units from register produce either 1, 2 or 3 UTF-8 bytes + const __m256i dup_even = _mm256_setr_epi16( + 0x0000, 0x0202, 0x0404, 0x0606, 0x0808, 0x0a0a, 0x0c0c, 0x0e0e, + 0x0000, 0x0202, 0x0404, 0x0606, 0x0808, 0x0a0a, 0x0c0c, 0x0e0e); - // ____0100 ________ - FORBIDDEN, - // ____0101 ________ - FORBIDDEN, - // ____011_ ________ - FORBIDDEN, FORBIDDEN, + /* In this branch we handle three cases: + 1. [0000|0000|0ccc|cccc] => [0ccc|cccc] - + single UFT-8 byte + 2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc] - two + UTF-8 bytes + 3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - + three UTF-8 bytes - // ____1___ ________ - FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN, - // ____1101 ________ - FORBIDDEN, FORBIDDEN, FORBIDDEN); - const simd8 byte_2_high = input.shr<4>().lookup_16( - // ________ 0_______ - TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, - TOO_SHORT, TOO_SHORT, + We expand the input word (16-bit) into two code units (32-bit), thus + we have room for four bytes. However, we need five distinct bit + layouts. Note that the last byte in cases #2 and #3 is the same. - // ________ 1000____ - TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE_1000 | - OVERLONG_4, - // ________ 1001____ - TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE, - // ________ 101_____ - TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, - TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, + We precompute byte 1 for case #1 and the common byte for cases #2 & #3 + in register t2. - // ________ 11______ - TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT); - return (byte_1_high & byte_1_low & byte_2_high); -} + We precompute byte 1 for case #3 and -- **conditionally** -- precompute + either byte 1 for case #2 or byte 2 for case #3. Note that they + differ by exactly one bit. -struct validating_transcoder { - // If this is nonzero, there has been a UTF-8 error. - simd8 error; + Finally from these two code units we build proper UTF-8 sequence, taking + into account the case (i.e, the number of bytes to write). + */ + /** + * Given [aaaa|bbbb|bbcc|cccc] our goal is to produce: + * t2 => [0ccc|cccc] [10cc|cccc] + * s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb]) + */ +#define simdutf_vec(x) _mm256_set1_epi16(static_cast(x)) + // [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc] + const __m256i t0 = _mm256_shuffle_epi8(in, dup_even); + // [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc] + const __m256i t1 = _mm256_and_si256(t0, simdutf_vec(0b0011111101111111)); + // [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc] + const __m256i t2 = _mm256_or_si256(t1, simdutf_vec(0b1000000000000000)); - validating_transcoder() : error(uint8_t(0)) {} - // - // Check whether the current bytes are valid UTF-8. - // - simdutf_really_inline void check_utf8_bytes(const simd8 input, - const simd8 prev_input) { - // Flip prev1...prev3 so we can easily determine if they are 2+, 3+ or 4+ - // lead bytes (2, 3, 4-byte leads become large positive numbers instead of - // small negative numbers) - simd8 prev1 = input.prev<1>(prev_input); - this->error |= check_special_cases(input, prev1); - } + // [aaaa|bbbb|bbcc|cccc] => [0000|aaaa|bbbb|bbcc] + const __m256i s0 = _mm256_srli_epi16(in, 4); + // [0000|aaaa|bbbb|bbcc] => [0000|aaaa|bbbb|bb00] + const __m256i s1 = _mm256_and_si256(s0, simdutf_vec(0b0000111111111100)); + // [0000|aaaa|bbbb|bb00] => [00bb|bbbb|0000|aaaa] + const __m256i s2 = _mm256_maddubs_epi16(s1, simdutf_vec(0x0140)); + // [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa] + const __m256i s3 = _mm256_or_si256(s2, simdutf_vec(0b1100000011100000)); + const __m256i m0 = _mm256_andnot_si256(one_or_two_bytes_bytemask, + simdutf_vec(0b0100000000000000)); + const __m256i s4 = _mm256_xor_si256(s3, m0); +#undef simdutf_vec - simdutf_really_inline size_t convert(const char *in, size_t size, - char *latin1_output) { - size_t pos = 0; - char *start{latin1_output}; - // In the worst case, we have the haswell kernel which can cause an overflow - // of 8 bytes when calling convert_masked_utf8_to_latin1. If you skip the - // last 16 bytes, and if the data is valid, then it is entirely safe because - // 16 UTF-8 bytes generate much more than 8 bytes. However, you cannot - // generally assume that you have valid UTF-8 input, so we are going to go - // back from the end counting 16 leading bytes, to give us a good margin. - size_t leading_byte = 0; - size_t margin = size; - for (; margin > 0 && leading_byte < 16; margin--) { - leading_byte += (int8_t(in[margin - 1]) > - -65); // twos complement of -65 is 1011 1111 ... - } - // If the input is long enough, then we have that margin-1 is the eight last - // leading byte. - const size_t safety_margin = size - margin + 1; // to avoid overruns! - while (pos + 64 + safety_margin <= size) { - simd8x64 input(reinterpret_cast(in + pos)); - if (input.is_ascii()) { - input.store((int8_t *)latin1_output); - latin1_output += 64; - pos += 64; - } else { - // you might think that a for-loop would work, but under Visual Studio, - // it is not good enough. - static_assert( - (simd8x64::NUM_CHUNKS == 2) || - (simd8x64::NUM_CHUNKS == 4), - "We support either two or four chunks per 64-byte block."); - auto zero = simd8{uint8_t(0)}; - if (simd8x64::NUM_CHUNKS == 2) { - this->check_utf8_bytes(input.chunks[0], zero); - this->check_utf8_bytes(input.chunks[1], input.chunks[0]); - } else if (simd8x64::NUM_CHUNKS == 4) { - this->check_utf8_bytes(input.chunks[0], zero); - this->check_utf8_bytes(input.chunks[1], input.chunks[0]); - this->check_utf8_bytes(input.chunks[2], input.chunks[1]); - this->check_utf8_bytes(input.chunks[3], input.chunks[2]); - } - uint64_t utf8_continuation_mask = - input.lt(-65 + 1); // -64 is 1100 0000 in twos complement. Note: in - // this case, we also have ASCII to account for. - uint64_t utf8_leading_mask = ~utf8_continuation_mask; - uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; - // We process in blocks of up to 12 bytes except possibly - // for fast paths which may process up to 16 bytes. For the - // slow path to work, we should have at least 12 input bytes left. - size_t max_starting_point = (pos + 64) - 12; - // Next loop is going to run at least five times. - while (pos < max_starting_point) { - // Performance note: our ability to compute 'consumed' and - // then shift and recompute is critical. If there is a - // latency of, say, 4 cycles on getting 'consumed', then - // the inner loop might have a total latency of about 6 cycles. - // Yet we process between 6 to 12 inputs bytes, thus we get - // a speed limit between 1 cycle/byte and 0.5 cycle/byte - // for this section of the code. Hence, there is a limit - // to how much we can further increase this latency before - // it seriously harms performance. - size_t consumed = convert_masked_utf8_to_latin1( - in + pos, utf8_end_of_code_point_mask, latin1_output); - pos += consumed; - utf8_end_of_code_point_mask >>= consumed; - } - // At this point there may remain between 0 and 12 bytes in the - // 64-byte block. These bytes will be processed again. So we have an - // 80% efficiency (in the worst case). In practice we expect an - // 85% to 90% efficiency. - } - } - if (errors()) { - return 0; - } - if (pos < size) { - size_t howmany = - scalar::utf8_to_latin1::convert(in + pos, size - pos, latin1_output); - if (howmany == 0) { - return 0; - } - latin1_output += howmany; - } - return latin1_output - start; - } + // 4. expand code units 16-bit => 32-bit + const __m256i out0 = _mm256_unpacklo_epi16(t2, s4); + const __m256i out1 = _mm256_unpackhi_epi16(t2, s4); - simdutf_really_inline result convert_with_errors(const char *in, size_t size, - char *latin1_output) { - size_t pos = 0; - char *start{latin1_output}; - // In the worst case, we have the haswell kernel which can cause an overflow - // of 8 bytes when calling convert_masked_utf8_to_latin1. If you skip the - // last 16 bytes, and if the data is valid, then it is entirely safe because - // 16 UTF-8 bytes generate much more than 8 bytes. However, you cannot - // generally assume that you have valid UTF-8 input, so we are going to go - // back from the end counting 8 leading bytes, to give us a good margin. - size_t leading_byte = 0; - size_t margin = size; - for (; margin > 0 && leading_byte < 8; margin--) { - leading_byte += (int8_t(in[margin - 1]) > -65); - } - // If the input is long enough, then we have that margin-1 is the eight last - // leading byte. - const size_t safety_margin = size - margin + 1; // to avoid overruns! - while (pos + 64 + safety_margin <= size) { - simd8x64 input(reinterpret_cast(in + pos)); - if (input.is_ascii()) { - input.store((int8_t *)latin1_output); - latin1_output += 64; - pos += 64; - } else { - // you might think that a for-loop would work, but under Visual Studio, - // it is not good enough. - static_assert( - (simd8x64::NUM_CHUNKS == 2) || - (simd8x64::NUM_CHUNKS == 4), - "We support either two or four chunks per 64-byte block."); - auto zero = simd8{uint8_t(0)}; - if (simd8x64::NUM_CHUNKS == 2) { - this->check_utf8_bytes(input.chunks[0], zero); - this->check_utf8_bytes(input.chunks[1], input.chunks[0]); - } else if (simd8x64::NUM_CHUNKS == 4) { - this->check_utf8_bytes(input.chunks[0], zero); - this->check_utf8_bytes(input.chunks[1], input.chunks[0]); - this->check_utf8_bytes(input.chunks[2], input.chunks[1]); - this->check_utf8_bytes(input.chunks[3], input.chunks[2]); - } - if (errors()) { - // rewind_and_convert_with_errors will seek a potential error from - // in+pos onward, with the ability to go back up to pos bytes, and - // read size-pos bytes forward. - result res = scalar::utf8_to_latin1::rewind_and_convert_with_errors( - pos, in + pos, size - pos, latin1_output); - res.count += pos; - return res; - } - uint64_t utf8_continuation_mask = input.lt(-65 + 1); - uint64_t utf8_leading_mask = ~utf8_continuation_mask; - uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; - // We process in blocks of up to 12 bytes except possibly - // for fast paths which may process up to 16 bytes. For the - // slow path to work, we should have at least 12 input bytes left. - size_t max_starting_point = (pos + 64) - 12; - // Next loop is going to run at least five times. - while (pos < max_starting_point) { - // Performance note: our ability to compute 'consumed' and - // then shift and recompute is critical. If there is a - // latency of, say, 4 cycles on getting 'consumed', then - // the inner loop might have a total latency of about 6 cycles. - // Yet we process between 6 to 12 inputs bytes, thus we get - // a speed limit between 1 cycle/byte and 0.5 cycle/byte - // for this section of the code. Hence, there is a limit - // to how much we can further increase this latency before - // it seriously harms performance. - size_t consumed = convert_masked_utf8_to_latin1( - in + pos, utf8_end_of_code_point_mask, latin1_output); - pos += consumed; - utf8_end_of_code_point_mask >>= consumed; - } - // At this point there may remain between 0 and 12 bytes in the - // 64-byte block. These bytes will be processed again. So we have an - // 80% efficiency (in the worst case). In practice we expect an - // 85% to 90% efficiency. - } - } - if (errors()) { - // rewind_and_convert_with_errors will seek a potential error from in+pos - // onward, with the ability to go back up to pos bytes, and read size-pos - // bytes forward. - result res = scalar::utf8_to_latin1::rewind_and_convert_with_errors( - pos, in + pos, size - pos, latin1_output); - res.count += pos; - return res; - } - if (pos < size) { - // rewind_and_convert_with_errors will seek a potential error from in+pos - // onward, with the ability to go back up to pos bytes, and read size-pos - // bytes forward. - result res = scalar::utf8_to_latin1::rewind_and_convert_with_errors( - pos, in + pos, size - pos, latin1_output); - if (res.error) { // In case of error, we want the error position - res.count += pos; - return res; - } else { // In case of success, we want the number of word written - latin1_output += res.count; - } - } - return result(error_code::SUCCESS, latin1_output - start); - } + // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle + const uint32_t mask = (one_byte_bitmask & 0x55555555) | + (one_or_two_bytes_bitmask & 0xaaaaaaaa); + // Due to the wider registers, the following path is less likely to be + // useful. + /*if(mask == 0) { + // We only have three-byte code units. Use fast path. + const __m256i shuffle = + _mm256_setr_epi8(2,3,1,6,7,5,10,11,9,14,15,13,-1,-1,-1,-1, + 2,3,1,6,7,5,10,11,9,14,15,13,-1,-1,-1,-1); const __m256i utf8_0 = + _mm256_shuffle_epi8(out0, shuffle); const __m256i utf8_1 = + _mm256_shuffle_epi8(out1, shuffle); + _mm_storeu_si128((__m128i*)utf8_output, _mm256_castsi256_si128(utf8_0)); + utf8_output += 12; + _mm_storeu_si128((__m128i*)utf8_output, _mm256_castsi256_si128(utf8_1)); + utf8_output += 12; + _mm_storeu_si128((__m128i*)utf8_output, + _mm256_extractf128_si256(utf8_0,1)); utf8_output += 12; + _mm_storeu_si128((__m128i*)utf8_output, + _mm256_extractf128_si256(utf8_1,1)); utf8_output += 12; buf += 16; + continue; + }*/ + const uint8_t mask0 = uint8_t(mask); + const uint8_t *row0 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask0][0]; + const __m128i shuffle0 = _mm_loadu_si128((__m128i *)(row0 + 1)); + const __m128i utf8_0 = + _mm_shuffle_epi8(_mm256_castsi256_si128(out0), shuffle0); - simdutf_really_inline bool errors() const { - return this->error.any_bits_set_anywhere(); - } + const uint8_t mask1 = static_cast(mask >> 8); + const uint8_t *row1 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask1][0]; + const __m128i shuffle1 = _mm_loadu_si128((__m128i *)(row1 + 1)); + const __m128i utf8_1 = + _mm_shuffle_epi8(_mm256_castsi256_si128(out1), shuffle1); -}; // struct utf8_checker -} // namespace utf8_to_latin1 -} // unnamed namespace -} // namespace arm64 -} // namespace simdutf -/* end file src/generic/utf8_to_latin1/utf8_to_latin1.h */ -/* begin file src/generic/utf8_to_latin1/valid_utf8_to_latin1.h */ + const uint8_t mask2 = static_cast(mask >> 16); + const uint8_t *row2 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask2][0]; + const __m128i shuffle2 = _mm_loadu_si128((__m128i *)(row2 + 1)); + const __m128i utf8_2 = + _mm_shuffle_epi8(_mm256_extractf128_si256(out0, 1), shuffle2); -namespace simdutf { -namespace arm64 { -namespace { -namespace utf8_to_latin1 { -using namespace simd; + const uint8_t mask3 = static_cast(mask >> 24); + const uint8_t *row3 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask3][0]; + const __m128i shuffle3 = _mm_loadu_si128((__m128i *)(row3 + 1)); + const __m128i utf8_3 = + _mm_shuffle_epi8(_mm256_extractf128_si256(out1, 1), shuffle3); -simdutf_really_inline size_t convert_valid(const char *in, size_t size, - char *latin1_output) { - size_t pos = 0; - char *start{latin1_output}; - // In the worst case, we have the haswell kernel which can cause an overflow - // of 8 bytes when calling convert_masked_utf8_to_latin1. If you skip the last - // 16 bytes, and if the data is valid, then it is entirely safe because 16 - // UTF-8 bytes generate much more than 8 bytes. However, you cannot generally - // assume that you have valid UTF-8 input, so we are going to go back from the - // end counting 8 leading bytes, to give us a good margin. - size_t leading_byte = 0; - size_t margin = size; - for (; margin > 0 && leading_byte < 8; margin--) { - leading_byte += (int8_t(in[margin - 1]) > - -65); // twos complement of -65 is 1011 1111 ... - } - // If the input is long enough, then we have that margin-1 is the eight last - // leading byte. - const size_t safety_margin = size - margin + 1; // to avoid overruns! - while (pos + 64 + safety_margin <= size) { - simd8x64 input(reinterpret_cast(in + pos)); - if (input.is_ascii()) { - input.store((int8_t *)latin1_output); - latin1_output += 64; - pos += 64; + _mm_storeu_si128((__m128i *)utf8_output, utf8_0); + utf8_output += row0[0]; + _mm_storeu_si128((__m128i *)utf8_output, utf8_1); + utf8_output += row1[0]; + _mm_storeu_si128((__m128i *)utf8_output, utf8_2); + utf8_output += row2[0]; + _mm_storeu_si128((__m128i *)utf8_output, utf8_3); + utf8_output += row3[0]; + buf += 16; + // surrogate pair(s) in a register } else { - // you might think that a for-loop would work, but under Visual Studio, it - // is not good enough. - uint64_t utf8_continuation_mask = - input.lt(-65 + 1); // -64 is 1100 0000 in twos complement. Note: in - // this case, we also have ASCII to account for. - uint64_t utf8_leading_mask = ~utf8_continuation_mask; - uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; - // We process in blocks of up to 12 bytes except possibly - // for fast paths which may process up to 16 bytes. For the - // slow path to work, we should have at least 12 input bytes left. - size_t max_starting_point = (pos + 64) - 12; - // Next loop is going to run at least five times. - while (pos < max_starting_point) { - // Performance note: our ability to compute 'consumed' and - // then shift and recompute is critical. If there is a - // latency of, say, 4 cycles on getting 'consumed', then - // the inner loop might have a total latency of about 6 cycles. - // Yet we process between 6 to 12 inputs bytes, thus we get - // a speed limit between 1 cycle/byte and 0.5 cycle/byte - // for this section of the code. Hence, there is a limit - // to how much we can further increase this latency before - // it seriously harms performance. - size_t consumed = convert_masked_utf8_to_latin1( - in + pos, utf8_end_of_code_point_mask, latin1_output); - pos += consumed; - utf8_end_of_code_point_mask >>= consumed; + // Let us do a scalar fallback. + // It may seem wasteful to use scalar code, but being efficient with SIMD + // in the presence of surrogate pairs may require non-trivial tables. + size_t forward = 15; + size_t k = 0; + if (size_t(end - buf) < forward + 1) { + forward = size_t(end - buf - 1); } - // At this point there may remain between 0 and 12 bytes in the - // 64-byte block. These bytes will be processed again. So we have an - // 80% efficiency (in the worst case). In practice we expect an - // 85% to 90% efficiency. + for (; k < forward; k++) { + uint16_t word = big_endian ? scalar::utf16::swap_bytes(buf[k]) : buf[k]; + if ((word & 0xFF80) == 0) { + *utf8_output++ = char(word); + } else if ((word & 0xF800) == 0) { + *utf8_output++ = char((word >> 6) | 0b11000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + } else if ((word & 0xF800) != 0xD800) { + *utf8_output++ = char((word >> 12) | 0b11100000); + *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + } else { + // must be a surrogate pair + uint16_t diff = uint16_t(word - 0xD800); + uint16_t next_word = + big_endian ? scalar::utf16::swap_bytes(buf[k + 1]) : buf[k + 1]; + k++; + uint16_t diff2 = uint16_t(next_word - 0xDC00); + if ((diff | diff2) > 0x3FF) { + return std::make_pair( + result(error_code::SURROGATE, buf - start + k - 1), + utf8_output); + } + uint32_t value = (diff << 10) + diff2 + 0x10000; + *utf8_output++ = char((value >> 18) | 0b11110000); + *utf8_output++ = char(((value >> 12) & 0b111111) | 0b10000000); + *utf8_output++ = char(((value >> 6) & 0b111111) | 0b10000000); + *utf8_output++ = char((value & 0b111111) | 0b10000000); + } + } + buf += k; } - } - if (pos < size) { - size_t howmany = scalar::utf8_to_latin1::convert_valid(in + pos, size - pos, - latin1_output); - latin1_output += howmany; - } - return latin1_output - start; + } // while + return std::make_pair(result(error_code::SUCCESS, buf - start), utf8_output); } +/* end file src/haswell/avx2_convert_utf16_to_utf8.cpp */ +/* begin file src/haswell/avx2_convert_utf16_to_utf32.cpp */ +/* + The vectorized algorithm works on single SSE register i.e., it + loads eight 16-bit code units. -} // namespace utf8_to_latin1 -} // namespace -} // namespace arm64 -} // namespace simdutf - // namespace simdutf -/* end file src/generic/utf8_to_latin1/valid_utf8_to_latin1.h */ + We consider three cases: + 1. an input register contains no surrogates and each value + is in range 0x0000 .. 0x07ff. + 2. an input register contains no surrogates and values are + in range 0x0000 .. 0xffff. + 3. an input register contains surrogates --- i.e. codepoints + can have 16 or 32 bits. -// placeholder scalars + Ad 1. -// -// Implementation-specific overrides -// -namespace simdutf { -namespace arm64 { + When values are less than 0x0800, it means that a 16-bit code unit + can be converted into: 1) single UTF8 byte (when it is an ASCII + char) or 2) two UTF8 bytes. -simdutf_warn_unused int -implementation::detect_encodings(const char *input, - size_t length) const noexcept { - // If there is a BOM, then we trust it. - auto bom_encoding = simdutf::BOM::check_bom(input, length); - if (bom_encoding != encoding_type::unspecified) { - return bom_encoding; - } - // todo: reimplement as a one-pass algorithm. - int out = 0; - if (validate_utf8(input, length)) { - out |= encoding_type::UTF8; - } - if ((length % 2) == 0) { - if (validate_utf16le(reinterpret_cast(input), - length / 2)) { - out |= encoding_type::UTF16_LE; - } - } - if ((length % 4) == 0) { - if (validate_utf32(reinterpret_cast(input), length / 4)) { - out |= encoding_type::UTF32_LE; + For this case we do only some shuffle to obtain these 2-byte + codes and finally compress the whole SSE register with a single + shuffle. + + We need 256-entry lookup table to get a compression pattern + and the number of output bytes in the compressed vector register. + Each entry occupies 17 bytes. + + Ad 2. + + When values fit in 16-bit code units, but are above 0x07ff, then + a single word may produce one, two or three UTF8 bytes. + + We prepare data for all these three cases in two registers. + The first register contains lower two UTF8 bytes (used in all + cases), while the second one contains just the third byte for + the three-UTF8-bytes case. + + Finally these two registers are interleaved forming eight-element + array of 32-bit values. The array spans two SSE registers. + The bytes from the registers are compressed using two shuffles. + + We need 256-entry lookup table to get a compression pattern + and the number of output bytes in the compressed vector register. + Each entry occupies 17 bytes. + + + To summarize: + - We need two 256-entry tables that have 8704 bytes in total. +*/ + +/* + Returns a pair: the first unprocessed byte from buf and utf32_output + A scalar routing should carry on the conversion of the tail. +*/ +template +std::pair +avx2_convert_utf16_to_utf32(const char16_t *buf, size_t len, + char32_t *utf32_output) { + const char16_t *end = buf + len; + const __m256i v_f800 = _mm256_set1_epi16((int16_t)0xf800); + const __m256i v_d800 = _mm256_set1_epi16((int16_t)0xd800); + + while (end - buf >= 16) { + __m256i in = _mm256_loadu_si256((__m256i *)buf); + if (big_endian) { + const __m256i swap = _mm256_setr_epi8( + 1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14, 17, 16, 19, 18, + 21, 20, 23, 22, 25, 24, 27, 26, 29, 28, 31, 30); + in = _mm256_shuffle_epi8(in, swap); } - } - return out; -} -simdutf_warn_unused bool -implementation::validate_utf8(const char *buf, size_t len) const noexcept { - return arm64::utf8_validation::generic_validate_utf8(buf, len); -} + // 1. Check if there are any surrogate word in the input chunk. + // We have also deal with situation when there is a surrogate word + // at the end of a chunk. + const __m256i surrogates_bytemask = + _mm256_cmpeq_epi16(_mm256_and_si256(in, v_f800), v_d800); -simdutf_warn_unused result implementation::validate_utf8_with_errors( - const char *buf, size_t len) const noexcept { - return arm64::utf8_validation::generic_validate_utf8_with_errors(buf, len); + // bitmask = 0x0000 if there are no surrogates + // = 0xc000 if the last word is a surrogate + const uint32_t surrogates_bitmask = + static_cast(_mm256_movemask_epi8(surrogates_bytemask)); + // It might seem like checking for surrogates_bitmask == 0xc000 could help. + // However, it is likely an uncommon occurrence. + if (surrogates_bitmask == 0x00000000) { + // case: we extend all sixteen 16-bit code units to sixteen 32-bit code + // units + _mm256_storeu_si256(reinterpret_cast<__m256i *>(utf32_output), + _mm256_cvtepu16_epi32(_mm256_castsi256_si128(in))); + _mm256_storeu_si256( + reinterpret_cast<__m256i *>(utf32_output + 8), + _mm256_cvtepu16_epi32(_mm256_extractf128_si256(in, 1))); + utf32_output += 16; + buf += 16; + // surrogate pair(s) in a register + } else { + // Let us do a scalar fallback. + // It may seem wasteful to use scalar code, but being efficient with SIMD + // in the presence of surrogate pairs may require non-trivial tables. + size_t forward = 15; + size_t k = 0; + if (size_t(end - buf) < forward + 1) { + forward = size_t(end - buf - 1); + } + for (; k < forward; k++) { + uint16_t word = big_endian ? scalar::utf16::swap_bytes(buf[k]) : buf[k]; + if ((word & 0xF800) != 0xD800) { + // No surrogate pair + *utf32_output++ = char32_t(word); + } else { + // must be a surrogate pair + uint16_t diff = uint16_t(word - 0xD800); + uint16_t next_word = + big_endian ? scalar::utf16::swap_bytes(buf[k + 1]) : buf[k + 1]; + k++; + uint16_t diff2 = uint16_t(next_word - 0xDC00); + if ((diff | diff2) > 0x3FF) { + return std::make_pair(nullptr, utf32_output); + } + uint32_t value = (diff << 10) + diff2 + 0x10000; + *utf32_output++ = char32_t(value); + } + } + buf += k; + } + } // while + return std::make_pair(buf, utf32_output); } -simdutf_warn_unused bool -implementation::validate_ascii(const char *buf, size_t len) const noexcept { - return arm64::utf8_validation::generic_validate_ascii(buf, len); -} +/* + Returns a pair: a result struct and utf8_output. + If there is an error, the count field of the result is the position of the + error. Otherwise, it is the position of the first unprocessed byte in buf + (even if finished). A scalar routing should carry on the conversion of the + tail if needed. +*/ +template +std::pair +avx2_convert_utf16_to_utf32_with_errors(const char16_t *buf, size_t len, + char32_t *utf32_output) { + const char16_t *start = buf; + const char16_t *end = buf + len; + const __m256i v_f800 = _mm256_set1_epi16((int16_t)0xf800); + const __m256i v_d800 = _mm256_set1_epi16((int16_t)0xd800); -simdutf_warn_unused result implementation::validate_ascii_with_errors( - const char *buf, size_t len) const noexcept { - return arm64::utf8_validation::generic_validate_ascii_with_errors(buf, len); -} + while (end - buf >= 16) { + __m256i in = _mm256_loadu_si256((__m256i *)buf); + if (big_endian) { + const __m256i swap = _mm256_setr_epi8( + 1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14, 17, 16, 19, 18, + 21, 20, 23, 22, 25, 24, 27, 26, 29, 28, 31, 30); + in = _mm256_shuffle_epi8(in, swap); + } -simdutf_warn_unused bool -implementation::validate_utf16le(const char16_t *buf, - size_t len) const noexcept { - if (simdutf_unlikely(len == 0)) { - // empty input is valid. protected the implementation from nullptr. - return true; - } - const char16_t *tail = arm_validate_utf16(buf, len); - if (tail) { - return scalar::utf16::validate(tail, - len - (tail - buf)); - } else { - return false; - } -} + // 1. Check if there are any surrogate word in the input chunk. + // We have also deal with situation when there is a surrogate word + // at the end of a chunk. + const __m256i surrogates_bytemask = + _mm256_cmpeq_epi16(_mm256_and_si256(in, v_f800), v_d800); -simdutf_warn_unused bool -implementation::validate_utf16be(const char16_t *buf, - size_t len) const noexcept { - if (simdutf_unlikely(len == 0)) { - // empty input is valid. protected the implementation from nullptr. - return true; - } - const char16_t *tail = arm_validate_utf16(buf, len); - if (tail) { - return scalar::utf16::validate(tail, len - (tail - buf)); - } else { - return false; - } + // bitmask = 0x0000 if there are no surrogates + // = 0xc000 if the last word is a surrogate + const uint32_t surrogates_bitmask = + static_cast(_mm256_movemask_epi8(surrogates_bytemask)); + // It might seem like checking for surrogates_bitmask == 0xc000 could help. + // However, it is likely an uncommon occurrence. + if (surrogates_bitmask == 0x00000000) { + // case: we extend all sixteen 16-bit code units to sixteen 32-bit code + // units + _mm256_storeu_si256(reinterpret_cast<__m256i *>(utf32_output), + _mm256_cvtepu16_epi32(_mm256_castsi256_si128(in))); + _mm256_storeu_si256( + reinterpret_cast<__m256i *>(utf32_output + 8), + _mm256_cvtepu16_epi32(_mm256_extractf128_si256(in, 1))); + utf32_output += 16; + buf += 16; + // surrogate pair(s) in a register + } else { + // Let us do a scalar fallback. + // It may seem wasteful to use scalar code, but being efficient with SIMD + // in the presence of surrogate pairs may require non-trivial tables. + size_t forward = 15; + size_t k = 0; + if (size_t(end - buf) < forward + 1) { + forward = size_t(end - buf - 1); + } + for (; k < forward; k++) { + uint16_t word = big_endian ? scalar::utf16::swap_bytes(buf[k]) : buf[k]; + if ((word & 0xF800) != 0xD800) { + // No surrogate pair + *utf32_output++ = char32_t(word); + } else { + // must be a surrogate pair + uint16_t diff = uint16_t(word - 0xD800); + uint16_t next_word = + big_endian ? scalar::utf16::swap_bytes(buf[k + 1]) : buf[k + 1]; + k++; + uint16_t diff2 = uint16_t(next_word - 0xDC00); + if ((diff | diff2) > 0x3FF) { + return std::make_pair( + result(error_code::SURROGATE, buf - start + k - 1), + utf32_output); + } + uint32_t value = (diff << 10) + diff2 + 0x10000; + *utf32_output++ = char32_t(value); + } + } + buf += k; + } + } // while + return std::make_pair(result(error_code::SUCCESS, buf - start), utf32_output); } +/* end file src/haswell/avx2_convert_utf16_to_utf32.cpp */ -simdutf_warn_unused result implementation::validate_utf16le_with_errors( - const char16_t *buf, size_t len) const noexcept { - if (simdutf_unlikely(len == 0)) { - return result(error_code::SUCCESS, 0); - } - result res = arm_validate_utf16_with_errors(buf, len); - if (res.count != len) { - result scalar_res = scalar::utf16::validate_with_errors( - buf + res.count, len - res.count); - return result(scalar_res.error, res.count + scalar_res.count); - } else { - return res; - } -} +/* begin file src/haswell/avx2_convert_utf32_to_latin1.cpp */ +std::pair +avx2_convert_utf32_to_latin1(const char32_t *buf, size_t len, + char *latin1_output) { + const size_t rounded_len = + len & ~0x1F; // Round down to nearest multiple of 32 -simdutf_warn_unused result implementation::validate_utf16be_with_errors( - const char16_t *buf, size_t len) const noexcept { - if (simdutf_unlikely(len == 0)) { - return result(error_code::SUCCESS, 0); - } - result res = arm_validate_utf16_with_errors(buf, len); - if (res.count != len) { - result scalar_res = scalar::utf16::validate_with_errors( - buf + res.count, len - res.count); - return result(scalar_res.error, res.count + scalar_res.count); - } else { - return res; - } -} + __m256i high_bytes_mask = _mm256_set1_epi32(0xFFFFFF00); -simdutf_warn_unused bool -implementation::validate_utf32(const char32_t *buf, size_t len) const noexcept { - if (simdutf_unlikely(len == 0)) { - // empty input is valid. protected the implementation from nullptr. - return true; - } - const char32_t *tail = arm_validate_utf32le(buf, len); - if (tail) { - return scalar::utf32::validate(tail, len - (tail - buf)); - } else { - return false; - } -} + __m256i shufmask = _mm256_set_epi8(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 12, 8, 4, 0, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 12, 8, 4, 0); -simdutf_warn_unused result implementation::validate_utf32_with_errors( - const char32_t *buf, size_t len) const noexcept { - if (simdutf_unlikely(len == 0)) { - return result(error_code::SUCCESS, 0); - } - result res = arm_validate_utf32le_with_errors(buf, len); - if (res.count != len) { - result scalar_res = - scalar::utf32::validate_with_errors(buf + res.count, len - res.count); - return result(scalar_res.error, res.count + scalar_res.count); - } else { - return res; - } -} + for (size_t i = 0; i < rounded_len; i += 16) { + __m256i in1 = _mm256_loadu_si256((__m256i *)buf); + __m256i in2 = _mm256_loadu_si256((__m256i *)(buf + 8)); + + __m256i check_combined = _mm256_or_si256(in1, in2); -simdutf_warn_unused size_t implementation::convert_latin1_to_utf8( - const char *buf, size_t len, char *utf8_output) const noexcept { - std::pair ret = - arm_convert_latin1_to_utf8(buf, len, utf8_output); - size_t converted_chars = ret.second - utf8_output; + if (!_mm256_testz_si256(check_combined, high_bytes_mask)) { + return std::make_pair(nullptr, latin1_output); + } - if (ret.first != buf + len) { - const size_t scalar_converted_chars = scalar::latin1_to_utf8::convert( - ret.first, len - (ret.first - buf), ret.second); - converted_chars += scalar_converted_chars; - } - return converted_chars; -} + // Turn UTF32 bytes into latin 1 bytes + __m256i shuffled1 = _mm256_shuffle_epi8(in1, shufmask); + __m256i shuffled2 = _mm256_shuffle_epi8(in2, shufmask); -simdutf_warn_unused size_t implementation::convert_latin1_to_utf16le( - const char *buf, size_t len, char16_t *utf16_output) const noexcept { - std::pair ret = - arm_convert_latin1_to_utf16(buf, len, utf16_output); - size_t converted_chars = ret.second - utf16_output; - if (ret.first != buf + len) { - const size_t scalar_converted_chars = - scalar::latin1_to_utf16::convert( - ret.first, len - (ret.first - buf), ret.second); - converted_chars += scalar_converted_chars; - } - return converted_chars; -} + // move Latin1 bytes to their correct spot + __m256i idx1 = _mm256_set_epi32(-1, -1, -1, -1, -1, -1, 4, 0); + __m256i idx2 = _mm256_set_epi32(-1, -1, -1, -1, 4, 0, -1, -1); + __m256i reshuffled1 = _mm256_permutevar8x32_epi32(shuffled1, idx1); + __m256i reshuffled2 = _mm256_permutevar8x32_epi32(shuffled2, idx2); -simdutf_warn_unused size_t implementation::convert_latin1_to_utf16be( - const char *buf, size_t len, char16_t *utf16_output) const noexcept { - std::pair ret = - arm_convert_latin1_to_utf16(buf, len, utf16_output); - size_t converted_chars = ret.second - utf16_output; - if (ret.first != buf + len) { - const size_t scalar_converted_chars = - scalar::latin1_to_utf16::convert( - ret.first, len - (ret.first - buf), ret.second); - converted_chars += scalar_converted_chars; - } - return converted_chars; -} + __m256i result = _mm256_or_si256(reshuffled1, reshuffled2); + _mm_storeu_si128((__m128i *)latin1_output, _mm256_castsi256_si128(result)); -simdutf_warn_unused size_t implementation::convert_latin1_to_utf32( - const char *buf, size_t len, char32_t *utf32_output) const noexcept { - std::pair ret = - arm_convert_latin1_to_utf32(buf, len, utf32_output); - size_t converted_chars = ret.second - utf32_output; - if (ret.first != buf + len) { - const size_t scalar_converted_chars = scalar::latin1_to_utf32::convert( - ret.first, len - (ret.first - buf), ret.second); - converted_chars += scalar_converted_chars; + latin1_output += 16; + buf += 16; } - return converted_chars; -} -simdutf_warn_unused size_t implementation::convert_utf8_to_latin1( - const char *buf, size_t len, char *latin1_output) const noexcept { - utf8_to_latin1::validating_transcoder converter; - return converter.convert(buf, len, latin1_output); + return std::make_pair(buf, latin1_output); } +std::pair +avx2_convert_utf32_to_latin1_with_errors(const char32_t *buf, size_t len, + char *latin1_output) { + const size_t rounded_len = + len & ~0x1F; // Round down to nearest multiple of 32 -simdutf_warn_unused result implementation::convert_utf8_to_latin1_with_errors( - const char *buf, size_t len, char *latin1_output) const noexcept { - utf8_to_latin1::validating_transcoder converter; - return converter.convert_with_errors(buf, len, latin1_output); -} + __m256i high_bytes_mask = _mm256_set1_epi32(0xFFFFFF00); + __m256i shufmask = _mm256_set_epi8(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 12, 8, 4, 0, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 12, 8, 4, 0); -simdutf_warn_unused size_t implementation::convert_valid_utf8_to_latin1( - const char *buf, size_t len, char *latin1_output) const noexcept { - return arm64::utf8_to_latin1::convert_valid(buf, len, latin1_output); -} + const char32_t *start = buf; -simdutf_warn_unused size_t implementation::convert_utf8_to_utf16le( - const char *buf, size_t len, char16_t *utf16_output) const noexcept { - utf8_to_utf16::validating_transcoder converter; - return converter.convert(buf, len, utf16_output); -} + for (size_t i = 0; i < rounded_len; i += 16) { + __m256i in1 = _mm256_loadu_si256((__m256i *)buf); + __m256i in2 = _mm256_loadu_si256((__m256i *)(buf + 8)); -simdutf_warn_unused size_t implementation::convert_utf8_to_utf16be( - const char *buf, size_t len, char16_t *utf16_output) const noexcept { - utf8_to_utf16::validating_transcoder converter; - return converter.convert(buf, len, utf16_output); -} + __m256i check_combined = _mm256_or_si256(in1, in2); -simdutf_warn_unused result implementation::convert_utf8_to_utf16le_with_errors( - const char *buf, size_t len, char16_t *utf16_output) const noexcept { - utf8_to_utf16::validating_transcoder converter; - return converter.convert_with_errors(buf, len, - utf16_output); -} + if (!_mm256_testz_si256(check_combined, high_bytes_mask)) { + // Fallback to scalar code for handling errors + for (int k = 0; k < 8; k++) { + char32_t codepoint = buf[k]; + if (codepoint <= 0xFF) { + *latin1_output++ = static_cast(codepoint); + } else { + return std::make_pair(result(error_code::TOO_LARGE, buf - start + k), + latin1_output); + } + } + buf += 8; + } else { + __m256i shuffled1 = _mm256_shuffle_epi8(in1, shufmask); + __m256i shuffled2 = _mm256_shuffle_epi8(in2, shufmask); -simdutf_warn_unused result implementation::convert_utf8_to_utf16be_with_errors( - const char *buf, size_t len, char16_t *utf16_output) const noexcept { - utf8_to_utf16::validating_transcoder converter; - return converter.convert_with_errors(buf, len, utf16_output); -} + __m256i idx1 = _mm256_set_epi32(-1, -1, -1, -1, -1, -1, 4, 0); + __m256i idx2 = _mm256_set_epi32(-1, -1, -1, -1, 4, 0, -1, -1); + __m256i reshuffled1 = _mm256_permutevar8x32_epi32(shuffled1, idx1); + __m256i reshuffled2 = _mm256_permutevar8x32_epi32(shuffled2, idx2); -simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf16le( - const char *input, size_t size, char16_t *utf16_output) const noexcept { - return utf8_to_utf16::convert_valid(input, size, - utf16_output); -} + __m256i result = _mm256_or_si256(reshuffled1, reshuffled2); + _mm_storeu_si128((__m128i *)latin1_output, + _mm256_castsi256_si128(result)); -simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf16be( - const char *input, size_t size, char16_t *utf16_output) const noexcept { - return utf8_to_utf16::convert_valid(input, size, - utf16_output); -} + latin1_output += 16; + buf += 16; + } + } -simdutf_warn_unused size_t implementation::convert_utf8_to_utf32( - const char *buf, size_t len, char32_t *utf32_output) const noexcept { - utf8_to_utf32::validating_transcoder converter; - return converter.convert(buf, len, utf32_output); + return std::make_pair(result(error_code::SUCCESS, buf - start), + latin1_output); } +/* end file src/haswell/avx2_convert_utf32_to_latin1.cpp */ +/* begin file src/haswell/avx2_convert_utf32_to_utf8.cpp */ +std::pair +avx2_convert_utf32_to_utf8(const char32_t *buf, size_t len, char *utf8_output) { + const char32_t *end = buf + len; + const __m256i v_0000 = _mm256_setzero_si256(); + const __m256i v_ffff0000 = _mm256_set1_epi32((uint32_t)0xffff0000); + const __m256i v_ff80 = _mm256_set1_epi16((uint16_t)0xff80); + const __m256i v_f800 = _mm256_set1_epi16((uint16_t)0xf800); + const __m256i v_c080 = _mm256_set1_epi16((uint16_t)0xc080); + const __m256i v_7fffffff = _mm256_set1_epi32((uint32_t)0x7fffffff); + __m256i running_max = _mm256_setzero_si256(); + __m256i forbidden_bytemask = _mm256_setzero_si256(); -simdutf_warn_unused result implementation::convert_utf8_to_utf32_with_errors( - const char *buf, size_t len, char32_t *utf32_output) const noexcept { - utf8_to_utf32::validating_transcoder converter; - return converter.convert_with_errors(buf, len, utf32_output); -} + const size_t safety_margin = + 12; // to avoid overruns, see issue + // https://github.com/simdutf/simdutf/issues/92 -simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf32( - const char *input, size_t size, char32_t *utf32_output) const noexcept { - return utf8_to_utf32::convert_valid(input, size, utf32_output); -} + while (end - buf >= std::ptrdiff_t(16 + safety_margin)) { + __m256i in = _mm256_loadu_si256((__m256i *)buf); + __m256i nextin = _mm256_loadu_si256((__m256i *)buf + 1); + running_max = _mm256_max_epu32(_mm256_max_epu32(in, running_max), nextin); -simdutf_warn_unused size_t implementation::convert_utf16le_to_latin1( - const char16_t *buf, size_t len, char *latin1_output) const noexcept { - std::pair ret = - arm_convert_utf16_to_latin1(buf, len, latin1_output); - if (ret.first == nullptr) { - return 0; - } - size_t saved_bytes = ret.second - latin1_output; + // Pack 32-bit UTF-32 code units to 16-bit UTF-16 code units with unsigned + // saturation + __m256i in_16 = _mm256_packus_epi32(_mm256_and_si256(in, v_7fffffff), + _mm256_and_si256(nextin, v_7fffffff)); + in_16 = _mm256_permute4x64_epi64(in_16, 0b11011000); - if (ret.first != buf + len) { - const size_t scalar_saved_bytes = - scalar::utf16_to_latin1::convert( - ret.first, len - (ret.first - buf), ret.second); - if (scalar_saved_bytes == 0) { - return 0; + // Try to apply UTF-16 => UTF-8 routine on 256 bits + // (haswell/avx2_convert_utf16_to_utf8.cpp) + + if (_mm256_testz_si256(in_16, v_ff80)) { // ASCII fast path!!!! + // 1. pack the bytes + const __m128i utf8_packed = _mm_packus_epi16( + _mm256_castsi256_si128(in_16), _mm256_extractf128_si256(in_16, 1)); + // 2. store (16 bytes) + _mm_storeu_si128((__m128i *)utf8_output, utf8_packed); + // 3. adjust pointers + buf += 16; + utf8_output += 16; + continue; // we are done for this round! } - saved_bytes += scalar_saved_bytes; - } - return saved_bytes; -} + // no bits set above 7th bit + const __m256i one_byte_bytemask = + _mm256_cmpeq_epi16(_mm256_and_si256(in_16, v_ff80), v_0000); + const uint32_t one_byte_bitmask = + static_cast(_mm256_movemask_epi8(one_byte_bytemask)); -simdutf_warn_unused size_t implementation::convert_utf16be_to_latin1( - const char16_t *buf, size_t len, char *latin1_output) const noexcept { - std::pair ret = - arm_convert_utf16_to_latin1(buf, len, latin1_output); - if (ret.first == nullptr) { - return 0; - } - size_t saved_bytes = ret.second - latin1_output; + // no bits set above 11th bit + const __m256i one_or_two_bytes_bytemask = + _mm256_cmpeq_epi16(_mm256_and_si256(in_16, v_f800), v_0000); + const uint32_t one_or_two_bytes_bitmask = + static_cast(_mm256_movemask_epi8(one_or_two_bytes_bytemask)); + if (one_or_two_bytes_bitmask == 0xffffffff) { + // 1. prepare 2-byte values + // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8 + // expected output : [110a|aaaa|10bb|bbbb] x 8 + const __m256i v_1f00 = _mm256_set1_epi16((int16_t)0x1f00); + const __m256i v_003f = _mm256_set1_epi16((int16_t)0x003f); - if (ret.first != buf + len) { - const size_t scalar_saved_bytes = - scalar::utf16_to_latin1::convert( - ret.first, len - (ret.first - buf), ret.second); - if (scalar_saved_bytes == 0) { - return 0; - } - saved_bytes += scalar_saved_bytes; - } - return saved_bytes; -} + // t0 = [000a|aaaa|bbbb|bb00] + const __m256i t0 = _mm256_slli_epi16(in_16, 2); + // t1 = [000a|aaaa|0000|0000] + const __m256i t1 = _mm256_and_si256(t0, v_1f00); + // t2 = [0000|0000|00bb|bbbb] + const __m256i t2 = _mm256_and_si256(in_16, v_003f); + // t3 = [000a|aaaa|00bb|bbbb] + const __m256i t3 = _mm256_or_si256(t1, t2); + // t4 = [110a|aaaa|10bb|bbbb] + const __m256i t4 = _mm256_or_si256(t3, v_c080); -simdutf_warn_unused result -implementation::convert_utf16le_to_latin1_with_errors( - const char16_t *buf, size_t len, char *latin1_output) const noexcept { - std::pair ret = - arm_convert_utf16_to_latin1_with_errors( - buf, len, latin1_output); - if (ret.first.error) { - return ret.first; - } // Can return directly since scalar fallback already found correct - // ret.first.count - if (ret.first.count != len) { // All good so far, but not finished - result scalar_res = - scalar::utf16_to_latin1::convert_with_errors( - buf + ret.first.count, len - ret.first.count, ret.second); - if (scalar_res.error) { - scalar_res.count += ret.first.count; - return scalar_res; - } else { - ret.second += scalar_res.count; - } - } - ret.first.count = - ret.second - - latin1_output; // Set count to the number of 8-bit code units written - return ret.first; -} + // 2. merge ASCII and 2-byte codewords + const __m256i utf8_unpacked = + _mm256_blendv_epi8(t4, in_16, one_byte_bytemask); -simdutf_warn_unused result -implementation::convert_utf16be_to_latin1_with_errors( - const char16_t *buf, size_t len, char *latin1_output) const noexcept { - std::pair ret = - arm_convert_utf16_to_latin1_with_errors(buf, len, - latin1_output); - if (ret.first.error) { - return ret.first; - } // Can return directly since scalar fallback already found correct - // ret.first.count - if (ret.first.count != len) { // All good so far, but not finished - result scalar_res = - scalar::utf16_to_latin1::convert_with_errors( - buf + ret.first.count, len - ret.first.count, ret.second); - if (scalar_res.error) { - scalar_res.count += ret.first.count; - return scalar_res; - } else { - ret.second += scalar_res.count; - } - } - ret.first.count = - ret.second - - latin1_output; // Set count to the number of 8-bit code units written - return ret.first; -} + // 3. prepare bitmask for 8-bit lookup + const uint32_t M0 = one_byte_bitmask & 0x55555555; + const uint32_t M1 = M0 >> 7; + const uint32_t M2 = (M1 | M0) & 0x00ff00ff; + // 4. pack the bytes -simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_latin1( - const char16_t *buf, size_t len, char *latin1_output) const noexcept { - // optimization opportunity: implement a custom function. - return convert_utf16be_to_latin1(buf, len, latin1_output); -} + const uint8_t *row = + &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[uint8_t(M2)][0]; + const uint8_t *row_2 = + &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[uint8_t(M2 >> + 16)][0]; -simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_latin1( - const char16_t *buf, size_t len, char *latin1_output) const noexcept { - // optimization opportunity: implement a custom function. - return convert_utf16le_to_latin1(buf, len, latin1_output); -} + const __m128i shuffle = _mm_loadu_si128((__m128i *)(row + 1)); + const __m128i shuffle_2 = _mm_loadu_si128((__m128i *)(row_2 + 1)); -simdutf_warn_unused size_t implementation::convert_utf16le_to_utf8( - const char16_t *buf, size_t len, char *utf8_output) const noexcept { - std::pair ret = - arm_convert_utf16_to_utf8(buf, len, utf8_output); - if (ret.first == nullptr) { - return 0; - } - size_t saved_bytes = ret.second - utf8_output; - if (ret.first != buf + len) { - const size_t scalar_saved_bytes = - scalar::utf16_to_utf8::convert( - ret.first, len - (ret.first - buf), ret.second); - if (scalar_saved_bytes == 0) { - return 0; - } - saved_bytes += scalar_saved_bytes; - } - return saved_bytes; -} + const __m256i utf8_packed = _mm256_shuffle_epi8( + utf8_unpacked, _mm256_setr_m128i(shuffle, shuffle_2)); + // 5. store bytes + _mm_storeu_si128((__m128i *)utf8_output, + _mm256_castsi256_si128(utf8_packed)); + utf8_output += row[0]; + _mm_storeu_si128((__m128i *)utf8_output, + _mm256_extractf128_si256(utf8_packed, 1)); + utf8_output += row_2[0]; -simdutf_warn_unused size_t implementation::convert_utf16be_to_utf8( - const char16_t *buf, size_t len, char *utf8_output) const noexcept { - std::pair ret = - arm_convert_utf16_to_utf8(buf, len, utf8_output); - if (ret.first == nullptr) { - return 0; - } - size_t saved_bytes = ret.second - utf8_output; - if (ret.first != buf + len) { - const size_t scalar_saved_bytes = - scalar::utf16_to_utf8::convert( - ret.first, len - (ret.first - buf), ret.second); - if (scalar_saved_bytes == 0) { - return 0; + // 6. adjust pointers + buf += 16; + continue; } - saved_bytes += scalar_saved_bytes; - } - return saved_bytes; -} + // Must check for overflow in packing + const __m256i saturation_bytemask = _mm256_cmpeq_epi32( + _mm256_and_si256(_mm256_or_si256(in, nextin), v_ffff0000), v_0000); + const uint32_t saturation_bitmask = + static_cast(_mm256_movemask_epi8(saturation_bytemask)); + if (saturation_bitmask == 0xffffffff) { + // case: code units from register produce either 1, 2 or 3 UTF-8 bytes + const __m256i v_d800 = _mm256_set1_epi16((uint16_t)0xd800); + forbidden_bytemask = _mm256_or_si256( + forbidden_bytemask, + _mm256_cmpeq_epi16(_mm256_and_si256(in_16, v_f800), v_d800)); -simdutf_warn_unused result implementation::convert_utf16le_to_utf8_with_errors( - const char16_t *buf, size_t len, char *utf8_output) const noexcept { - // ret.first.count is always the position in the buffer, not the number of - // code units written even if finished - std::pair ret = - arm_convert_utf16_to_utf8_with_errors(buf, len, - utf8_output); - if (ret.first.error) { - return ret.first; - } // Can return directly since scalar fallback already found correct - // ret.first.count - if (ret.first.count != len) { // All good so far, but not finished - result scalar_res = - scalar::utf16_to_utf8::convert_with_errors( - buf + ret.first.count, len - ret.first.count, ret.second); - if (scalar_res.error) { - scalar_res.count += ret.first.count; - return scalar_res; - } else { - ret.second += scalar_res.count; - } - } - ret.first.count = - ret.second - - utf8_output; // Set count to the number of 8-bit code units written - return ret.first; -} + const __m256i dup_even = _mm256_setr_epi16( + 0x0000, 0x0202, 0x0404, 0x0606, 0x0808, 0x0a0a, 0x0c0c, 0x0e0e, + 0x0000, 0x0202, 0x0404, 0x0606, 0x0808, 0x0a0a, 0x0c0c, 0x0e0e); -simdutf_warn_unused result implementation::convert_utf16be_to_utf8_with_errors( - const char16_t *buf, size_t len, char *utf8_output) const noexcept { - // ret.first.count is always the position in the buffer, not the number of - // code units written even if finished - std::pair ret = - arm_convert_utf16_to_utf8_with_errors(buf, len, - utf8_output); - if (ret.first.error) { - return ret.first; - } // Can return directly since scalar fallback already found correct - // ret.first.count - if (ret.first.count != len) { // All good so far, but not finished - result scalar_res = - scalar::utf16_to_utf8::convert_with_errors( - buf + ret.first.count, len - ret.first.count, ret.second); - if (scalar_res.error) { - scalar_res.count += ret.first.count; - return scalar_res; - } else { - ret.second += scalar_res.count; - } - } - ret.first.count = - ret.second - - utf8_output; // Set count to the number of 8-bit code units written - return ret.first; -} + /* In this branch we handle three cases: + 1. [0000|0000|0ccc|cccc] => [0ccc|cccc] - + single UFT-8 byte + 2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc] - two + UTF-8 bytes + 3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - + three UTF-8 bytes + + We expand the input word (16-bit) into two code units (32-bit), thus + we have room for four bytes. However, we need five distinct bit + layouts. Note that the last byte in cases #2 and #3 is the same. + + We precompute byte 1 for case #1 and the common byte for cases #2 & #3 + in register t2. + + We precompute byte 1 for case #3 and -- **conditionally** -- precompute + either byte 1 for case #2 or byte 2 for case #3. Note that they + differ by exactly one bit. + + Finally from these two code units we build proper UTF-8 sequence, taking + into account the case (i.e, the number of bytes to write). + */ + /** + * Given [aaaa|bbbb|bbcc|cccc] our goal is to produce: + * t2 => [0ccc|cccc] [10cc|cccc] + * s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb]) + */ +#define simdutf_vec(x) _mm256_set1_epi16(static_cast(x)) + // [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc] + const __m256i t0 = _mm256_shuffle_epi8(in_16, dup_even); + // [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc] + const __m256i t1 = _mm256_and_si256(t0, simdutf_vec(0b0011111101111111)); + // [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc] + const __m256i t2 = _mm256_or_si256(t1, simdutf_vec(0b1000000000000000)); + + // [aaaa|bbbb|bbcc|cccc] => [0000|aaaa|bbbb|bbcc] + const __m256i s0 = _mm256_srli_epi16(in_16, 4); + // [0000|aaaa|bbbb|bbcc] => [0000|aaaa|bbbb|bb00] + const __m256i s1 = _mm256_and_si256(s0, simdutf_vec(0b0000111111111100)); + // [0000|aaaa|bbbb|bb00] => [00bb|bbbb|0000|aaaa] + const __m256i s2 = _mm256_maddubs_epi16(s1, simdutf_vec(0x0140)); + // [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa] + const __m256i s3 = _mm256_or_si256(s2, simdutf_vec(0b1100000011100000)); + const __m256i m0 = _mm256_andnot_si256(one_or_two_bytes_bytemask, + simdutf_vec(0b0100000000000000)); + const __m256i s4 = _mm256_xor_si256(s3, m0); +#undef simdutf_vec + + // 4. expand code units 16-bit => 32-bit + const __m256i out0 = _mm256_unpacklo_epi16(t2, s4); + const __m256i out1 = _mm256_unpackhi_epi16(t2, s4); + + // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle + const uint32_t mask = (one_byte_bitmask & 0x55555555) | + (one_or_two_bytes_bitmask & 0xaaaaaaaa); + // Due to the wider registers, the following path is less likely to be + // useful. + /*if(mask == 0) { + // We only have three-byte code units. Use fast path. + const __m256i shuffle = + _mm256_setr_epi8(2,3,1,6,7,5,10,11,9,14,15,13,-1,-1,-1,-1, + 2,3,1,6,7,5,10,11,9,14,15,13,-1,-1,-1,-1); const __m256i utf8_0 = + _mm256_shuffle_epi8(out0, shuffle); const __m256i utf8_1 = + _mm256_shuffle_epi8(out1, shuffle); + _mm_storeu_si128((__m128i*)utf8_output, _mm256_castsi256_si128(utf8_0)); + utf8_output += 12; + _mm_storeu_si128((__m128i*)utf8_output, _mm256_castsi256_si128(utf8_1)); + utf8_output += 12; + _mm_storeu_si128((__m128i*)utf8_output, + _mm256_extractf128_si256(utf8_0,1)); utf8_output += 12; + _mm_storeu_si128((__m128i*)utf8_output, + _mm256_extractf128_si256(utf8_1,1)); utf8_output += 12; buf += 16; + continue; + }*/ + const uint8_t mask0 = uint8_t(mask); + const uint8_t *row0 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask0][0]; + const __m128i shuffle0 = _mm_loadu_si128((__m128i *)(row0 + 1)); + const __m128i utf8_0 = + _mm_shuffle_epi8(_mm256_castsi256_si128(out0), shuffle0); -simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_utf8( - const char16_t *buf, size_t len, char *utf8_output) const noexcept { - return convert_utf16le_to_utf8(buf, len, utf8_output); -} + const uint8_t mask1 = static_cast(mask >> 8); + const uint8_t *row1 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask1][0]; + const __m128i shuffle1 = _mm_loadu_si128((__m128i *)(row1 + 1)); + const __m128i utf8_1 = + _mm_shuffle_epi8(_mm256_castsi256_si128(out1), shuffle1); -simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_utf8( - const char16_t *buf, size_t len, char *utf8_output) const noexcept { - return convert_utf16be_to_utf8(buf, len, utf8_output); -} + const uint8_t mask2 = static_cast(mask >> 16); + const uint8_t *row2 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask2][0]; + const __m128i shuffle2 = _mm_loadu_si128((__m128i *)(row2 + 1)); + const __m128i utf8_2 = + _mm_shuffle_epi8(_mm256_extractf128_si256(out0, 1), shuffle2); -simdutf_warn_unused size_t implementation::convert_utf32_to_utf8( - const char32_t *buf, size_t len, char *utf8_output) const noexcept { - if (simdutf_unlikely(len == 0)) { - return 0; - } - std::pair ret = - arm_convert_utf32_to_utf8(buf, len, utf8_output); - if (ret.first == nullptr) { - return 0; - } - size_t saved_bytes = ret.second - utf8_output; - if (ret.first != buf + len) { - const size_t scalar_saved_bytes = scalar::utf32_to_utf8::convert( - ret.first, len - (ret.first - buf), ret.second); - if (scalar_saved_bytes == 0) { - return 0; - } - saved_bytes += scalar_saved_bytes; - } - return saved_bytes; -} + const uint8_t mask3 = static_cast(mask >> 24); + const uint8_t *row3 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask3][0]; + const __m128i shuffle3 = _mm_loadu_si128((__m128i *)(row3 + 1)); + const __m128i utf8_3 = + _mm_shuffle_epi8(_mm256_extractf128_si256(out1, 1), shuffle3); -simdutf_warn_unused result implementation::convert_utf32_to_utf8_with_errors( - const char32_t *buf, size_t len, char *utf8_output) const noexcept { - if (simdutf_unlikely(len == 0)) { - return result(error_code::SUCCESS, 0); - } - // ret.first.count is always the position in the buffer, not the number of - // code units written even if finished - std::pair ret = - arm_convert_utf32_to_utf8_with_errors(buf, len, utf8_output); - if (ret.first.count != len) { - result scalar_res = scalar::utf32_to_utf8::convert_with_errors( - buf + ret.first.count, len - ret.first.count, ret.second); - if (scalar_res.error) { - scalar_res.count += ret.first.count; - return scalar_res; + _mm_storeu_si128((__m128i *)utf8_output, utf8_0); + utf8_output += row0[0]; + _mm_storeu_si128((__m128i *)utf8_output, utf8_1); + utf8_output += row1[0]; + _mm_storeu_si128((__m128i *)utf8_output, utf8_2); + utf8_output += row2[0]; + _mm_storeu_si128((__m128i *)utf8_output, utf8_3); + utf8_output += row3[0]; + buf += 16; } else { - ret.second += scalar_res.count; + // case: at least one 32-bit word is larger than 0xFFFF <=> it will + // produce four UTF-8 bytes. Let us do a scalar fallback. It may seem + // wasteful to use scalar code, but being efficient with SIMD may require + // large, non-trivial tables? + size_t forward = 15; + size_t k = 0; + if (size_t(end - buf) < forward + 1) { + forward = size_t(end - buf - 1); + } + for (; k < forward; k++) { + uint32_t word = buf[k]; + if ((word & 0xFFFFFF80) == 0) { // 1-byte (ASCII) + *utf8_output++ = char(word); + } else if ((word & 0xFFFFF800) == 0) { // 2-byte + *utf8_output++ = char((word >> 6) | 0b11000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + } else if ((word & 0xFFFF0000) == 0) { // 3-byte + if (word >= 0xD800 && word <= 0xDFFF) { + return std::make_pair(nullptr, utf8_output); + } + *utf8_output++ = char((word >> 12) | 0b11100000); + *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + } else { // 4-byte + if (word > 0x10FFFF) { + return std::make_pair(nullptr, utf8_output); + } + *utf8_output++ = char((word >> 18) | 0b11110000); + *utf8_output++ = char(((word >> 12) & 0b111111) | 0b10000000); + *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + } + } + buf += k; } - } - ret.first.count = - ret.second - - utf8_output; // Set count to the number of 8-bit code units written - return ret.first; -} + } // while -simdutf_warn_unused size_t implementation::convert_utf16le_to_utf32( - const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { - std::pair ret = - arm_convert_utf16_to_utf32(buf, len, utf32_output); - if (ret.first == nullptr) { - return 0; - } - size_t saved_bytes = ret.second - utf32_output; - if (ret.first != buf + len) { - const size_t scalar_saved_bytes = - scalar::utf16_to_utf32::convert( - ret.first, len - (ret.first - buf), ret.second); - if (scalar_saved_bytes == 0) { - return 0; - } - saved_bytes += scalar_saved_bytes; + // check for invalid input + const __m256i v_10ffff = _mm256_set1_epi32((uint32_t)0x10ffff); + if (static_cast(_mm256_movemask_epi8(_mm256_cmpeq_epi32( + _mm256_max_epu32(running_max, v_10ffff), v_10ffff))) != 0xffffffff) { + return std::make_pair(nullptr, utf8_output); } - return saved_bytes; -} -simdutf_warn_unused size_t implementation::convert_utf16be_to_utf32( - const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { - std::pair ret = - arm_convert_utf16_to_utf32(buf, len, utf32_output); - if (ret.first == nullptr) { - return 0; - } - size_t saved_bytes = ret.second - utf32_output; - if (ret.first != buf + len) { - const size_t scalar_saved_bytes = - scalar::utf16_to_utf32::convert( - ret.first, len - (ret.first - buf), ret.second); - if (scalar_saved_bytes == 0) { - return 0; - } - saved_bytes += scalar_saved_bytes; + if (static_cast(_mm256_movemask_epi8(forbidden_bytemask)) != 0) { + return std::make_pair(nullptr, utf8_output); } - return saved_bytes; -} -simdutf_warn_unused result implementation::convert_utf16le_to_utf32_with_errors( - const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { - // ret.first.count is always the position in the buffer, not the number of - // code units written even if finished - std::pair ret = - arm_convert_utf16_to_utf32_with_errors(buf, len, - utf32_output); - if (ret.first.error) { - return ret.first; - } // Can return directly since scalar fallback already found correct - // ret.first.count - if (ret.first.count != len) { // All good so far, but not finished - result scalar_res = - scalar::utf16_to_utf32::convert_with_errors( - buf + ret.first.count, len - ret.first.count, ret.second); - if (scalar_res.error) { - scalar_res.count += ret.first.count; - return scalar_res; - } else { - ret.second += scalar_res.count; - } - } - ret.first.count = - ret.second - - utf32_output; // Set count to the number of 8-bit code units written - return ret.first; + return std::make_pair(buf, utf8_output); } -simdutf_warn_unused result implementation::convert_utf16be_to_utf32_with_errors( - const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { - // ret.first.count is always the position in the buffer, not the number of - // code units written even if finished - std::pair ret = - arm_convert_utf16_to_utf32_with_errors(buf, len, - utf32_output); - if (ret.first.error) { - return ret.first; - } // Can return directly since scalar fallback already found correct - // ret.first.count - if (ret.first.count != len) { // All good so far, but not finished - result scalar_res = - scalar::utf16_to_utf32::convert_with_errors( - buf + ret.first.count, len - ret.first.count, ret.second); - if (scalar_res.error) { - scalar_res.count += ret.first.count; - return scalar_res; - } else { - ret.second += scalar_res.count; - } - } - ret.first.count = - ret.second - - utf32_output; // Set count to the number of 8-bit code units written - return ret.first; -} +std::pair +avx2_convert_utf32_to_utf8_with_errors(const char32_t *buf, size_t len, + char *utf8_output) { + const char32_t *end = buf + len; + const char32_t *start = buf; -simdutf_warn_unused size_t implementation::convert_utf32_to_latin1( - const char32_t *buf, size_t len, char *latin1_output) const noexcept { - std::pair ret = - arm_convert_utf32_to_latin1(buf, len, latin1_output); - if (ret.first == nullptr) { - return 0; - } - size_t saved_bytes = ret.second - latin1_output; + const __m256i v_0000 = _mm256_setzero_si256(); + const __m256i v_ffff0000 = _mm256_set1_epi32((uint32_t)0xffff0000); + const __m256i v_ff80 = _mm256_set1_epi16((uint16_t)0xff80); + const __m256i v_f800 = _mm256_set1_epi16((uint16_t)0xf800); + const __m256i v_c080 = _mm256_set1_epi16((uint16_t)0xc080); + const __m256i v_7fffffff = _mm256_set1_epi32((uint32_t)0x7fffffff); + const __m256i v_10ffff = _mm256_set1_epi32((uint32_t)0x10ffff); - if (ret.first != buf + len) { - const size_t scalar_saved_bytes = scalar::utf32_to_latin1::convert( - ret.first, len - (ret.first - buf), ret.second); - if (scalar_saved_bytes == 0) { - return 0; - } - saved_bytes += scalar_saved_bytes; - } - return saved_bytes; -} + const size_t safety_margin = + 12; // to avoid overruns, see issue + // https://github.com/simdutf/simdutf/issues/92 -simdutf_warn_unused result implementation::convert_utf32_to_latin1_with_errors( - const char32_t *buf, size_t len, char *latin1_output) const noexcept { - std::pair ret = - arm_convert_utf32_to_latin1_with_errors(buf, len, latin1_output); - if (ret.first.error) { - return ret.first; - } // Can return directly since scalar fallback already found correct - // ret.first.count - if (ret.first.count != len) { // All good so far, but not finished - result scalar_res = scalar::utf32_to_latin1::convert_with_errors( - buf + ret.first.count, len - ret.first.count, ret.second); - if (scalar_res.error) { - scalar_res.count += ret.first.count; - return scalar_res; - } else { - ret.second += scalar_res.count; + while (end - buf >= std::ptrdiff_t(16 + safety_margin)) { + __m256i in = _mm256_loadu_si256((__m256i *)buf); + __m256i nextin = _mm256_loadu_si256((__m256i *)buf + 1); + // Check for too large input + const __m256i max_input = + _mm256_max_epu32(_mm256_max_epu32(in, nextin), v_10ffff); + if (static_cast(_mm256_movemask_epi8( + _mm256_cmpeq_epi32(max_input, v_10ffff))) != 0xffffffff) { + return std::make_pair(result(error_code::TOO_LARGE, buf - start), + utf8_output); } - } - ret.first.count = - ret.second - - latin1_output; // Set count to the number of 8-bit code units written - return ret.first; -} - -simdutf_warn_unused size_t implementation::convert_valid_utf32_to_latin1( - const char32_t *buf, size_t len, char *latin1_output) const noexcept { - std::pair ret = - arm_convert_utf32_to_latin1(buf, len, latin1_output); - if (ret.first == nullptr) { - return 0; - } - size_t saved_bytes = ret.second - latin1_output; - if (ret.first != buf + len) { - const size_t scalar_saved_bytes = scalar::utf32_to_latin1::convert_valid( - ret.first, len - (ret.first - buf), ret.second); - saved_bytes += scalar_saved_bytes; - } - return saved_bytes; -} + // Pack 32-bit UTF-32 code units to 16-bit UTF-16 code units with unsigned + // saturation + __m256i in_16 = _mm256_packus_epi32(_mm256_and_si256(in, v_7fffffff), + _mm256_and_si256(nextin, v_7fffffff)); + in_16 = _mm256_permute4x64_epi64(in_16, 0b11011000); -simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf8( - const char32_t *buf, size_t len, char *utf8_output) const noexcept { - // optimization opportunity: implement a custom function. - return convert_utf32_to_utf8(buf, len, utf8_output); -} + // Try to apply UTF-16 => UTF-8 routine on 256 bits + // (haswell/avx2_convert_utf16_to_utf8.cpp) -simdutf_warn_unused size_t implementation::convert_utf32_to_utf16le( - const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { - std::pair ret = - arm_convert_utf32_to_utf16(buf, len, utf16_output); - if (ret.first == nullptr) { - return 0; - } - size_t saved_bytes = ret.second - utf16_output; - if (ret.first != buf + len) { - const size_t scalar_saved_bytes = - scalar::utf32_to_utf16::convert( - ret.first, len - (ret.first - buf), ret.second); - if (scalar_saved_bytes == 0) { - return 0; + if (_mm256_testz_si256(in_16, v_ff80)) { // ASCII fast path!!!! + // 1. pack the bytes + const __m128i utf8_packed = _mm_packus_epi16( + _mm256_castsi256_si128(in_16), _mm256_extractf128_si256(in_16, 1)); + // 2. store (16 bytes) + _mm_storeu_si128((__m128i *)utf8_output, utf8_packed); + // 3. adjust pointers + buf += 16; + utf8_output += 16; + continue; // we are done for this round! } - saved_bytes += scalar_saved_bytes; - } - return saved_bytes; -} + // no bits set above 7th bit + const __m256i one_byte_bytemask = + _mm256_cmpeq_epi16(_mm256_and_si256(in_16, v_ff80), v_0000); + const uint32_t one_byte_bitmask = + static_cast(_mm256_movemask_epi8(one_byte_bytemask)); -simdutf_warn_unused size_t implementation::convert_utf32_to_utf16be( - const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { - std::pair ret = - arm_convert_utf32_to_utf16(buf, len, utf16_output); - if (ret.first == nullptr) { - return 0; - } - size_t saved_bytes = ret.second - utf16_output; - if (ret.first != buf + len) { - const size_t scalar_saved_bytes = - scalar::utf32_to_utf16::convert( - ret.first, len - (ret.first - buf), ret.second); - if (scalar_saved_bytes == 0) { - return 0; - } - saved_bytes += scalar_saved_bytes; - } - return saved_bytes; -} + // no bits set above 11th bit + const __m256i one_or_two_bytes_bytemask = + _mm256_cmpeq_epi16(_mm256_and_si256(in_16, v_f800), v_0000); + const uint32_t one_or_two_bytes_bitmask = + static_cast(_mm256_movemask_epi8(one_or_two_bytes_bytemask)); + if (one_or_two_bytes_bitmask == 0xffffffff) { + // 1. prepare 2-byte values + // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8 + // expected output : [110a|aaaa|10bb|bbbb] x 8 + const __m256i v_1f00 = _mm256_set1_epi16((int16_t)0x1f00); + const __m256i v_003f = _mm256_set1_epi16((int16_t)0x003f); -simdutf_warn_unused result implementation::convert_utf32_to_utf16le_with_errors( - const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { - // ret.first.count is always the position in the buffer, not the number of - // code units written even if finished - std::pair ret = - arm_convert_utf32_to_utf16_with_errors(buf, len, - utf16_output); - if (ret.first.count != len) { - result scalar_res = - scalar::utf32_to_utf16::convert_with_errors( - buf + ret.first.count, len - ret.first.count, ret.second); - if (scalar_res.error) { - scalar_res.count += ret.first.count; - return scalar_res; - } else { - ret.second += scalar_res.count; - } - } - ret.first.count = - ret.second - - utf16_output; // Set count to the number of 8-bit code units written - return ret.first; -} + // t0 = [000a|aaaa|bbbb|bb00] + const __m256i t0 = _mm256_slli_epi16(in_16, 2); + // t1 = [000a|aaaa|0000|0000] + const __m256i t1 = _mm256_and_si256(t0, v_1f00); + // t2 = [0000|0000|00bb|bbbb] + const __m256i t2 = _mm256_and_si256(in_16, v_003f); + // t3 = [000a|aaaa|00bb|bbbb] + const __m256i t3 = _mm256_or_si256(t1, t2); + // t4 = [110a|aaaa|10bb|bbbb] + const __m256i t4 = _mm256_or_si256(t3, v_c080); -simdutf_warn_unused result implementation::convert_utf32_to_utf16be_with_errors( - const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { - // ret.first.count is always the position in the buffer, not the number of - // code units written even if finished - std::pair ret = - arm_convert_utf32_to_utf16_with_errors(buf, len, - utf16_output); - if (ret.first.count != len) { - result scalar_res = - scalar::utf32_to_utf16::convert_with_errors( - buf + ret.first.count, len - ret.first.count, ret.second); - if (scalar_res.error) { - scalar_res.count += ret.first.count; - return scalar_res; - } else { - ret.second += scalar_res.count; - } - } - ret.first.count = - ret.second - - utf16_output; // Set count to the number of 8-bit code units written - return ret.first; -} + // 2. merge ASCII and 2-byte codewords + const __m256i utf8_unpacked = + _mm256_blendv_epi8(t4, in_16, one_byte_bytemask); -simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf16le( - const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { - return convert_utf32_to_utf16le(buf, len, utf16_output); -} + // 3. prepare bitmask for 8-bit lookup + const uint32_t M0 = one_byte_bitmask & 0x55555555; + const uint32_t M1 = M0 >> 7; + const uint32_t M2 = (M1 | M0) & 0x00ff00ff; + // 4. pack the bytes -simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf16be( - const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { - return convert_utf32_to_utf16be(buf, len, utf16_output); -} + const uint8_t *row = + &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[uint8_t(M2)][0]; + const uint8_t *row_2 = + &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[uint8_t(M2 >> + 16)][0]; -simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_utf32( - const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { - return convert_utf16le_to_utf32(buf, len, utf32_output); -} + const __m128i shuffle = _mm_loadu_si128((__m128i *)(row + 1)); + const __m128i shuffle_2 = _mm_loadu_si128((__m128i *)(row_2 + 1)); -simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_utf32( - const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { - return convert_utf16be_to_utf32(buf, len, utf32_output); -} + const __m256i utf8_packed = _mm256_shuffle_epi8( + utf8_unpacked, _mm256_setr_m128i(shuffle, shuffle_2)); + // 5. store bytes + _mm_storeu_si128((__m128i *)utf8_output, + _mm256_castsi256_si128(utf8_packed)); + utf8_output += row[0]; + _mm_storeu_si128((__m128i *)utf8_output, + _mm256_extractf128_si256(utf8_packed, 1)); + utf8_output += row_2[0]; -void implementation::change_endianness_utf16(const char16_t *input, - size_t length, - char16_t *output) const noexcept { - utf16::change_endianness_utf16(input, length, output); -} + // 6. adjust pointers + buf += 16; + continue; + } + // Must check for overflow in packing + const __m256i saturation_bytemask = _mm256_cmpeq_epi32( + _mm256_and_si256(_mm256_or_si256(in, nextin), v_ffff0000), v_0000); + const uint32_t saturation_bitmask = + static_cast(_mm256_movemask_epi8(saturation_bytemask)); + if (saturation_bitmask == 0xffffffff) { + // case: code units from register produce either 1, 2 or 3 UTF-8 bytes + + // Check for illegal surrogate code units + const __m256i v_d800 = _mm256_set1_epi16((uint16_t)0xd800); + const __m256i forbidden_bytemask = + _mm256_cmpeq_epi16(_mm256_and_si256(in_16, v_f800), v_d800); + if (static_cast(_mm256_movemask_epi8(forbidden_bytemask)) != + 0x0) { + return std::make_pair(result(error_code::SURROGATE, buf - start), + utf8_output); + } -simdutf_warn_unused size_t implementation::count_utf16le( - const char16_t *input, size_t length) const noexcept { - return utf16::count_code_points(input, length); -} + const __m256i dup_even = _mm256_setr_epi16( + 0x0000, 0x0202, 0x0404, 0x0606, 0x0808, 0x0a0a, 0x0c0c, 0x0e0e, + 0x0000, 0x0202, 0x0404, 0x0606, 0x0808, 0x0a0a, 0x0c0c, 0x0e0e); -simdutf_warn_unused size_t implementation::count_utf16be( - const char16_t *input, size_t length) const noexcept { - return utf16::count_code_points(input, length); -} + /* In this branch we handle three cases: + 1. [0000|0000|0ccc|cccc] => [0ccc|cccc] - + single UFT-8 byte + 2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc] - two + UTF-8 bytes + 3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - + three UTF-8 bytes -simdutf_warn_unused size_t -implementation::count_utf8(const char *input, size_t length) const noexcept { - return utf8::count_code_points(input, length); -} + We expand the input word (16-bit) into two code units (32-bit), thus + we have room for four bytes. However, we need five distinct bit + layouts. Note that the last byte in cases #2 and #3 is the same. -simdutf_warn_unused size_t implementation::latin1_length_from_utf8( - const char *buf, size_t len) const noexcept { - return count_utf8(buf, len); -} + We precompute byte 1 for case #1 and the common byte for cases #2 & #3 + in register t2. -simdutf_warn_unused size_t -implementation::latin1_length_from_utf16(size_t length) const noexcept { - return scalar::utf16::latin1_length_from_utf16(length); -} + We precompute byte 1 for case #3 and -- **conditionally** -- precompute + either byte 1 for case #2 or byte 2 for case #3. Note that they + differ by exactly one bit. -simdutf_warn_unused size_t -implementation::latin1_length_from_utf32(size_t length) const noexcept { - return scalar::utf32::latin1_length_from_utf32(length); -} + Finally from these two code units we build proper UTF-8 sequence, taking + into account the case (i.e, the number of bytes to write). + */ + /** + * Given [aaaa|bbbb|bbcc|cccc] our goal is to produce: + * t2 => [0ccc|cccc] [10cc|cccc] + * s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb]) + */ +#define simdutf_vec(x) _mm256_set1_epi16(static_cast(x)) + // [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc] + const __m256i t0 = _mm256_shuffle_epi8(in_16, dup_even); + // [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc] + const __m256i t1 = _mm256_and_si256(t0, simdutf_vec(0b0011111101111111)); + // [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc] + const __m256i t2 = _mm256_or_si256(t1, simdutf_vec(0b1000000000000000)); -simdutf_warn_unused size_t implementation::utf8_length_from_latin1( - const char *input, size_t length) const noexcept { - // See - // https://lemire.me/blog/2023/05/15/computing-the-utf-8-size-of-a-latin-1-string-quickly-arm-neon-edition/ - // credit to Pete Cawley - const uint8_t *data = reinterpret_cast(input); - uint64_t result = 0; - const int lanes = sizeof(uint8x16_t); - uint8_t rem = length % lanes; - const uint8_t *simd_end = data + (length / lanes) * lanes; - const uint8x16_t threshold = vdupq_n_u8(0x80); - for (; data < simd_end; data += lanes) { - // load 16 bytes - uint8x16_t input_vec = vld1q_u8(data); - // compare to threshold (0x80) - uint8x16_t withhighbit = vcgeq_u8(input_vec, threshold); - // vertical addition - result -= vaddvq_s8(vreinterpretq_s8_u8(withhighbit)); - } - return result + (length / lanes) * lanes + - scalar::latin1::utf8_length_from_latin1((const char *)simd_end, rem); -} + // [aaaa|bbbb|bbcc|cccc] => [0000|aaaa|bbbb|bbcc] + const __m256i s0 = _mm256_srli_epi16(in_16, 4); + // [0000|aaaa|bbbb|bbcc] => [0000|aaaa|bbbb|bb00] + const __m256i s1 = _mm256_and_si256(s0, simdutf_vec(0b0000111111111100)); + // [0000|aaaa|bbbb|bb00] => [00bb|bbbb|0000|aaaa] + const __m256i s2 = _mm256_maddubs_epi16(s1, simdutf_vec(0x0140)); + // [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa] + const __m256i s3 = _mm256_or_si256(s2, simdutf_vec(0b1100000011100000)); + const __m256i m0 = _mm256_andnot_si256(one_or_two_bytes_bytemask, + simdutf_vec(0b0100000000000000)); + const __m256i s4 = _mm256_xor_si256(s3, m0); +#undef simdutf_vec -simdutf_warn_unused size_t implementation::utf8_length_from_utf16le( - const char16_t *input, size_t length) const noexcept { - return utf16::utf8_length_from_utf16(input, length); -} + // 4. expand code units 16-bit => 32-bit + const __m256i out0 = _mm256_unpacklo_epi16(t2, s4); + const __m256i out1 = _mm256_unpackhi_epi16(t2, s4); -simdutf_warn_unused size_t implementation::utf8_length_from_utf16be( - const char16_t *input, size_t length) const noexcept { - return utf16::utf8_length_from_utf16(input, length); -} + // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle + const uint32_t mask = (one_byte_bitmask & 0x55555555) | + (one_or_two_bytes_bitmask & 0xaaaaaaaa); + // Due to the wider registers, the following path is less likely to be + // useful. + /*if(mask == 0) { + // We only have three-byte code units. Use fast path. + const __m256i shuffle = + _mm256_setr_epi8(2,3,1,6,7,5,10,11,9,14,15,13,-1,-1,-1,-1, + 2,3,1,6,7,5,10,11,9,14,15,13,-1,-1,-1,-1); const __m256i utf8_0 = + _mm256_shuffle_epi8(out0, shuffle); const __m256i utf8_1 = + _mm256_shuffle_epi8(out1, shuffle); + _mm_storeu_si128((__m128i*)utf8_output, _mm256_castsi256_si128(utf8_0)); + utf8_output += 12; + _mm_storeu_si128((__m128i*)utf8_output, _mm256_castsi256_si128(utf8_1)); + utf8_output += 12; + _mm_storeu_si128((__m128i*)utf8_output, + _mm256_extractf128_si256(utf8_0,1)); utf8_output += 12; + _mm_storeu_si128((__m128i*)utf8_output, + _mm256_extractf128_si256(utf8_1,1)); utf8_output += 12; buf += 16; + continue; + }*/ + const uint8_t mask0 = uint8_t(mask); + const uint8_t *row0 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask0][0]; + const __m128i shuffle0 = _mm_loadu_si128((__m128i *)(row0 + 1)); + const __m128i utf8_0 = + _mm_shuffle_epi8(_mm256_castsi256_si128(out0), shuffle0); -simdutf_warn_unused size_t -implementation::utf16_length_from_latin1(size_t length) const noexcept { - return scalar::latin1::utf16_length_from_latin1(length); -} + const uint8_t mask1 = static_cast(mask >> 8); + const uint8_t *row1 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask1][0]; + const __m128i shuffle1 = _mm_loadu_si128((__m128i *)(row1 + 1)); + const __m128i utf8_1 = + _mm_shuffle_epi8(_mm256_castsi256_si128(out1), shuffle1); -simdutf_warn_unused size_t -implementation::utf32_length_from_latin1(size_t length) const noexcept { - return scalar::latin1::utf32_length_from_latin1(length); -} + const uint8_t mask2 = static_cast(mask >> 16); + const uint8_t *row2 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask2][0]; + const __m128i shuffle2 = _mm_loadu_si128((__m128i *)(row2 + 1)); + const __m128i utf8_2 = + _mm_shuffle_epi8(_mm256_extractf128_si256(out0, 1), shuffle2); -simdutf_warn_unused size_t implementation::utf32_length_from_utf16le( - const char16_t *input, size_t length) const noexcept { - return utf16::utf32_length_from_utf16(input, length); -} + const uint8_t mask3 = static_cast(mask >> 24); + const uint8_t *row3 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask3][0]; + const __m128i shuffle3 = _mm_loadu_si128((__m128i *)(row3 + 1)); + const __m128i utf8_3 = + _mm_shuffle_epi8(_mm256_extractf128_si256(out1, 1), shuffle3); -simdutf_warn_unused size_t implementation::utf32_length_from_utf16be( - const char16_t *input, size_t length) const noexcept { - return utf16::utf32_length_from_utf16(input, length); -} + _mm_storeu_si128((__m128i *)utf8_output, utf8_0); + utf8_output += row0[0]; + _mm_storeu_si128((__m128i *)utf8_output, utf8_1); + utf8_output += row1[0]; + _mm_storeu_si128((__m128i *)utf8_output, utf8_2); + utf8_output += row2[0]; + _mm_storeu_si128((__m128i *)utf8_output, utf8_3); + utf8_output += row3[0]; + buf += 16; + } else { + // case: at least one 32-bit word is larger than 0xFFFF <=> it will + // produce four UTF-8 bytes. Let us do a scalar fallback. It may seem + // wasteful to use scalar code, but being efficient with SIMD may require + // large, non-trivial tables? + size_t forward = 15; + size_t k = 0; + if (size_t(end - buf) < forward + 1) { + forward = size_t(end - buf - 1); + } + for (; k < forward; k++) { + uint32_t word = buf[k]; + if ((word & 0xFFFFFF80) == 0) { // 1-byte (ASCII) + *utf8_output++ = char(word); + } else if ((word & 0xFFFFF800) == 0) { // 2-byte + *utf8_output++ = char((word >> 6) | 0b11000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + } else if ((word & 0xFFFF0000) == 0) { // 3-byte + if (word >= 0xD800 && word <= 0xDFFF) { + return std::make_pair( + result(error_code::SURROGATE, buf - start + k), utf8_output); + } + *utf8_output++ = char((word >> 12) | 0b11100000); + *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + } else { // 4-byte + if (word > 0x10FFFF) { + return std::make_pair( + result(error_code::TOO_LARGE, buf - start + k), utf8_output); + } + *utf8_output++ = char((word >> 18) | 0b11110000); + *utf8_output++ = char(((word >> 12) & 0b111111) | 0b10000000); + *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + } + } + buf += k; + } + } // while -simdutf_warn_unused size_t implementation::utf16_length_from_utf8( - const char *input, size_t length) const noexcept { - return utf8::utf16_length_from_utf8(input, length); + return std::make_pair(result(error_code::SUCCESS, buf - start), utf8_output); } +/* end file src/haswell/avx2_convert_utf32_to_utf8.cpp */ +/* begin file src/haswell/avx2_convert_utf32_to_utf16.cpp */ +template +std::pair +avx2_convert_utf32_to_utf16(const char32_t *buf, size_t len, + char16_t *utf16_output) { + const char32_t *end = buf + len; -simdutf_warn_unused size_t implementation::utf8_length_from_utf32( - const char32_t *input, size_t length) const noexcept { - const uint32x4_t v_7f = vmovq_n_u32((uint32_t)0x7f); - const uint32x4_t v_7ff = vmovq_n_u32((uint32_t)0x7ff); - const uint32x4_t v_ffff = vmovq_n_u32((uint32_t)0xffff); - const uint32x4_t v_1 = vmovq_n_u32((uint32_t)0x1); - size_t pos = 0; - size_t count = 0; - for (; pos + 4 <= length; pos += 4) { - uint32x4_t in = vld1q_u32(reinterpret_cast(input + pos)); - const uint32x4_t ascii_bytes_bytemask = vcleq_u32(in, v_7f); - const uint32x4_t one_two_bytes_bytemask = vcleq_u32(in, v_7ff); - const uint32x4_t two_bytes_bytemask = - veorq_u32(one_two_bytes_bytemask, ascii_bytes_bytemask); - const uint32x4_t three_bytes_bytemask = - veorq_u32(vcleq_u32(in, v_ffff), one_two_bytes_bytemask); + const size_t safety_margin = + 12; // to avoid overruns, see issue + // https://github.com/simdutf/simdutf/issues/92 + __m256i forbidden_bytemask = _mm256_setzero_si256(); - const uint16x8_t reduced_ascii_bytes_bytemask = - vreinterpretq_u16_u32(vandq_u32(ascii_bytes_bytemask, v_1)); - const uint16x8_t reduced_two_bytes_bytemask = - vreinterpretq_u16_u32(vandq_u32(two_bytes_bytemask, v_1)); - const uint16x8_t reduced_three_bytes_bytemask = - vreinterpretq_u16_u32(vandq_u32(three_bytes_bytemask, v_1)); + while (end - buf >= std::ptrdiff_t(8 + safety_margin)) { + __m256i in = _mm256_loadu_si256((__m256i *)buf); - const uint16x8_t compressed_bytemask0 = - vpaddq_u16(reduced_ascii_bytes_bytemask, reduced_two_bytes_bytemask); - const uint16x8_t compressed_bytemask1 = - vpaddq_u16(reduced_three_bytes_bytemask, reduced_three_bytes_bytemask); + const __m256i v_00000000 = _mm256_setzero_si256(); + const __m256i v_ffff0000 = _mm256_set1_epi32((int32_t)0xffff0000); - size_t ascii_count = count_ones( - vgetq_lane_u64(vreinterpretq_u64_u16(compressed_bytemask0), 0)); - size_t two_bytes_count = count_ones( - vgetq_lane_u64(vreinterpretq_u64_u16(compressed_bytemask0), 1)); - size_t three_bytes_count = count_ones( - vgetq_lane_u64(vreinterpretq_u64_u16(compressed_bytemask1), 0)); + // no bits set above 16th bit <=> can pack to UTF16 without surrogate pairs + const __m256i saturation_bytemask = + _mm256_cmpeq_epi32(_mm256_and_si256(in, v_ffff0000), v_00000000); + const uint32_t saturation_bitmask = + static_cast(_mm256_movemask_epi8(saturation_bytemask)); - count += 16 - 3 * ascii_count - 2 * two_bytes_count - three_bytes_count; + if (saturation_bitmask == 0xffffffff) { + const __m256i v_f800 = _mm256_set1_epi32((uint32_t)0xf800); + const __m256i v_d800 = _mm256_set1_epi32((uint32_t)0xd800); + forbidden_bytemask = _mm256_or_si256( + forbidden_bytemask, + _mm256_cmpeq_epi32(_mm256_and_si256(in, v_f800), v_d800)); + + __m128i utf16_packed = _mm_packus_epi32(_mm256_castsi256_si128(in), + _mm256_extractf128_si256(in, 1)); + if (big_endian) { + const __m128i swap = + _mm_setr_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14); + utf16_packed = _mm_shuffle_epi8(utf16_packed, swap); + } + _mm_storeu_si128((__m128i *)utf16_output, utf16_packed); + utf16_output += 8; + buf += 8; + } else { + size_t forward = 7; + size_t k = 0; + if (size_t(end - buf) < forward + 1) { + forward = size_t(end - buf - 1); + } + for (; k < forward; k++) { + uint32_t word = buf[k]; + if ((word & 0xFFFF0000) == 0) { + // will not generate a surrogate pair + if (word >= 0xD800 && word <= 0xDFFF) { + return std::make_pair(nullptr, utf16_output); + } + *utf16_output++ = + big_endian + ? char16_t((uint16_t(word) >> 8) | (uint16_t(word) << 8)) + : char16_t(word); + } else { + // will generate a surrogate pair + if (word > 0x10FFFF) { + return std::make_pair(nullptr, utf16_output); + } + word -= 0x10000; + uint16_t high_surrogate = uint16_t(0xD800 + (word >> 10)); + uint16_t low_surrogate = uint16_t(0xDC00 + (word & 0x3FF)); + if (big_endian) { + high_surrogate = + uint16_t((high_surrogate >> 8) | (high_surrogate << 8)); + low_surrogate = + uint16_t((low_surrogate >> 8) | (low_surrogate << 8)); + } + *utf16_output++ = char16_t(high_surrogate); + *utf16_output++ = char16_t(low_surrogate); + } + } + buf += k; + } } - return count + - scalar::utf32::utf8_length_from_utf32(input + pos, length - pos); -} -simdutf_warn_unused size_t implementation::utf16_length_from_utf32( - const char32_t *input, size_t length) const noexcept { - const uint32x4_t v_ffff = vmovq_n_u32((uint32_t)0xffff); - const uint32x4_t v_1 = vmovq_n_u32((uint32_t)0x1); - size_t pos = 0; - size_t count = 0; - for (; pos + 4 <= length; pos += 4) { - uint32x4_t in = vld1q_u32(reinterpret_cast(input + pos)); - const uint32x4_t surrogate_bytemask = vcgtq_u32(in, v_ffff); - const uint16x8_t reduced_bytemask = - vreinterpretq_u16_u32(vandq_u32(surrogate_bytemask, v_1)); - const uint16x8_t compressed_bytemask = - vpaddq_u16(reduced_bytemask, reduced_bytemask); - size_t surrogate_count = count_ones( - vgetq_lane_u64(vreinterpretq_u64_u16(compressed_bytemask), 0)); - count += 4 + surrogate_count; + // check for invalid input + if (static_cast(_mm256_movemask_epi8(forbidden_bytemask)) != 0) { + return std::make_pair(nullptr, utf16_output); } - return count + - scalar::utf32::utf16_length_from_utf32(input + pos, length - pos); -} -simdutf_warn_unused size_t implementation::utf32_length_from_utf8( - const char *input, size_t length) const noexcept { - return utf8::count_code_points(input, length); + return std::make_pair(buf, utf16_output); } -simdutf_warn_unused size_t implementation::maximal_binary_length_from_base64( - const char *input, size_t length) const noexcept { - return scalar::base64::maximal_binary_length_from_base64(input, length); -} +template +std::pair +avx2_convert_utf32_to_utf16_with_errors(const char32_t *buf, size_t len, + char16_t *utf16_output) { + const char32_t *start = buf; + const char32_t *end = buf + len; -simdutf_warn_unused result implementation::base64_to_binary( - const char *input, size_t length, char *output, base64_options options, - last_chunk_handling_options last_chunk_options) const noexcept { - return (options & base64_url) - ? compress_decode_base64(output, input, length, options, - last_chunk_options) - : compress_decode_base64(output, input, length, options, - last_chunk_options); -} + const size_t safety_margin = + 12; // to avoid overruns, see issue + // https://github.com/simdutf/simdutf/issues/92 -simdutf_warn_unused full_result implementation::base64_to_binary_details( - const char *input, size_t length, char *output, base64_options options, - last_chunk_handling_options last_chunk_options) const noexcept { - return (options & base64_url) - ? compress_decode_base64(output, input, length, options, - last_chunk_options) - : compress_decode_base64(output, input, length, options, - last_chunk_options); -} + while (end - buf >= std::ptrdiff_t(8 + safety_margin)) { + __m256i in = _mm256_loadu_si256((__m256i *)buf); -simdutf_warn_unused size_t implementation::maximal_binary_length_from_base64( - const char16_t *input, size_t length) const noexcept { - return scalar::base64::maximal_binary_length_from_base64(input, length); -} + const __m256i v_00000000 = _mm256_setzero_si256(); + const __m256i v_ffff0000 = _mm256_set1_epi32((int32_t)0xffff0000); -simdutf_warn_unused result implementation::base64_to_binary( - const char16_t *input, size_t length, char *output, base64_options options, - last_chunk_handling_options last_chunk_options) const noexcept { - return (options & base64_url) - ? compress_decode_base64(output, input, length, options, - last_chunk_options) - : compress_decode_base64(output, input, length, options, - last_chunk_options); -} + // no bits set above 16th bit <=> can pack to UTF16 without surrogate pairs + const __m256i saturation_bytemask = + _mm256_cmpeq_epi32(_mm256_and_si256(in, v_ffff0000), v_00000000); + const uint32_t saturation_bitmask = + static_cast(_mm256_movemask_epi8(saturation_bytemask)); -simdutf_warn_unused full_result implementation::base64_to_binary_details( - const char16_t *input, size_t length, char *output, base64_options options, - last_chunk_handling_options last_chunk_options) const noexcept { - return (options & base64_url) - ? compress_decode_base64(output, input, length, options, - last_chunk_options) - : compress_decode_base64(output, input, length, options, - last_chunk_options); -} + if (saturation_bitmask == 0xffffffff) { + const __m256i v_f800 = _mm256_set1_epi32((uint32_t)0xf800); + const __m256i v_d800 = _mm256_set1_epi32((uint32_t)0xd800); + const __m256i forbidden_bytemask = + _mm256_cmpeq_epi32(_mm256_and_si256(in, v_f800), v_d800); + if (static_cast(_mm256_movemask_epi8(forbidden_bytemask)) != + 0x0) { + return std::make_pair(result(error_code::SURROGATE, buf - start), + utf16_output); + } -simdutf_warn_unused size_t implementation::base64_length_from_binary( - size_t length, base64_options options) const noexcept { - return scalar::base64::base64_length_from_binary(length, options); + __m128i utf16_packed = _mm_packus_epi32(_mm256_castsi256_si128(in), + _mm256_extractf128_si256(in, 1)); + if (big_endian) { + const __m128i swap = + _mm_setr_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14); + utf16_packed = _mm_shuffle_epi8(utf16_packed, swap); + } + _mm_storeu_si128((__m128i *)utf16_output, utf16_packed); + utf16_output += 8; + buf += 8; + } else { + size_t forward = 7; + size_t k = 0; + if (size_t(end - buf) < forward + 1) { + forward = size_t(end - buf - 1); + } + for (; k < forward; k++) { + uint32_t word = buf[k]; + if ((word & 0xFFFF0000) == 0) { + // will not generate a surrogate pair + if (word >= 0xD800 && word <= 0xDFFF) { + return std::make_pair( + result(error_code::SURROGATE, buf - start + k), utf16_output); + } + *utf16_output++ = + big_endian + ? char16_t((uint16_t(word) >> 8) | (uint16_t(word) << 8)) + : char16_t(word); + } else { + // will generate a surrogate pair + if (word > 0x10FFFF) { + return std::make_pair( + result(error_code::TOO_LARGE, buf - start + k), utf16_output); + } + word -= 0x10000; + uint16_t high_surrogate = uint16_t(0xD800 + (word >> 10)); + uint16_t low_surrogate = uint16_t(0xDC00 + (word & 0x3FF)); + if (big_endian) { + high_surrogate = + uint16_t((high_surrogate >> 8) | (high_surrogate << 8)); + low_surrogate = + uint16_t((low_surrogate >> 8) | (low_surrogate << 8)); + } + *utf16_output++ = char16_t(high_surrogate); + *utf16_output++ = char16_t(low_surrogate); + } + } + buf += k; + } + } + + return std::make_pair(result(error_code::SUCCESS, buf - start), utf16_output); } +/* end file src/haswell/avx2_convert_utf32_to_utf16.cpp */ -size_t implementation::binary_to_base64(const char *input, size_t length, - char *output, - base64_options options) const noexcept { - return encode_base64(output, input, length, options); +/* begin file src/haswell/avx2_convert_utf8_to_latin1.cpp */ +// depends on "tables/utf8_to_utf16_tables.h" + +// Convert up to 12 bytes from utf8 to latin1 using a mask indicating the +// end of the code points. Only the least significant 12 bits of the mask +// are accessed. +// It returns how many bytes were consumed (up to 12). +size_t convert_masked_utf8_to_latin1(const char *input, + uint64_t utf8_end_of_code_point_mask, + char *&latin1_output) { + // we use an approach where we try to process up to 12 input bytes. + // Why 12 input bytes and not 16? Because we are concerned with the size of + // the lookup tables. Also 12 is nicely divisible by two and three. + // + // + // Optimization note: our main path below is load-latency dependent. Thus it + // is maybe beneficial to have fast paths that depend on branch prediction but + // have less latency. This results in more instructions but, potentially, also + // higher speeds. + // + const __m128i in = _mm_loadu_si128((__m128i *)input); + + const uint16_t input_utf8_end_of_code_point_mask = + utf8_end_of_code_point_mask & + 0xfff; // we are only processing 12 bytes in case it is not all ASCII + + if (utf8_end_of_code_point_mask == 0xfff) { + // We process the data in chunks of 12 bytes. + _mm_storeu_si128(reinterpret_cast<__m128i *>(latin1_output), in); + latin1_output += 12; // We wrote 12 characters. + return 12; // We consumed 1 bytes. + } + /// We do not have a fast path available, so we fallback. + const uint8_t idx = + tables::utf8_to_utf16::utf8bigindex[input_utf8_end_of_code_point_mask][0]; + const uint8_t consumed = + tables::utf8_to_utf16::utf8bigindex[input_utf8_end_of_code_point_mask][1]; + // this indicates an invalid input: + if (idx >= 64) { + return consumed; + } + // Here we should have (idx < 64), if not, there is a bug in the validation or + // elsewhere. SIX (6) input code-code units this is a relatively easy scenario + // we process SIX (6) input code-code units. The max length in bytes of six + // code code units spanning between 1 and 2 bytes each is 12 bytes. On + // processors where pdep/pext is fast, we might be able to use a small lookup + // table. + const __m128i sh = + _mm_loadu_si128((const __m128i *)tables::utf8_to_utf16::shufutf8[idx]); + const __m128i perm = _mm_shuffle_epi8(in, sh); + const __m128i ascii = _mm_and_si128(perm, _mm_set1_epi16(0x7f)); + const __m128i highbyte = _mm_and_si128(perm, _mm_set1_epi16(0x1f00)); + __m128i composed = _mm_or_si128(ascii, _mm_srli_epi16(highbyte, 2)); + const __m128i latin1_packed = _mm_packus_epi16(composed, composed); + // writing 8 bytes even though we only care about the first 6 bytes. + // performance note: it would be faster to use _mm_storeu_si128, we should + // investigate. + _mm_storel_epi64((__m128i *)latin1_output, latin1_packed); + latin1_output += 6; // We wrote 6 bytes. + return consumed; } +/* end file src/haswell/avx2_convert_utf8_to_latin1.cpp */ -} // namespace arm64 -} // namespace simdutf - -/* begin file src/simdutf/arm64/end.h */ -/* end file src/simdutf/arm64/end.h */ -/* end file src/arm64/implementation.cpp */ -#endif -#if SIMDUTF_IMPLEMENTATION_FALLBACK -/* begin file src/fallback/implementation.cpp */ -/* begin file src/simdutf/fallback/begin.h */ -// redefining SIMDUTF_IMPLEMENTATION to "fallback" -// #define SIMDUTF_IMPLEMENTATION fallback -/* end file src/simdutf/fallback/begin.h */ - +/* begin file src/haswell/avx2_base64.cpp */ +/** + * References and further reading: + * + * Wojciech Muła, Daniel Lemire, Base64 encoding and decoding at almost the + * speed of a memory copy, Software: Practice and Experience 50 (2), 2020. + * https://arxiv.org/abs/1910.05109 + * + * Wojciech Muła, Daniel Lemire, Faster Base64 Encoding and Decoding using AVX2 + * Instructions, ACM Transactions on the Web 12 (3), 2018. + * https://arxiv.org/abs/1704.00605 + * + * Simon Josefsson. 2006. The Base16, Base32, and Base64 Data Encodings. + * https://tools.ietf.org/html/rfc4648. (2006). Internet Engineering Task Force, + * Request for Comments: 4648. + * + * Alfred Klomp. 2014a. Fast Base64 encoding/decoding with SSE vectorization. + * http://www.alfredklomp.com/programming/sse-base64/. (2014). + * + * Alfred Klomp. 2014b. Fast Base64 stream encoder/decoder in C99, with SIMD + * acceleration. https://github.com/aklomp/base64. (2014). + * + * Hanson Char. 2014. A Fast and Correct Base 64 Codec. (2014). + * https://aws.amazon.com/blogs/developer/a-fast-and-correct-base-64-codec/ + * + * Nick Kopp. 2013. Base64 Encoding on a GPU. + * https://www.codeproject.com/Articles/276993/Base-Encoding-on-a-GPU. (2013). + */ +template +simdutf_really_inline __m256i lookup_pshufb_improved(const __m256i input) { + // credit: Wojciech Muła + __m256i result = _mm256_subs_epu8(input, _mm256_set1_epi8(51)); + const __m256i less = _mm256_cmpgt_epi8(_mm256_set1_epi8(26), input); + result = + _mm256_or_si256(result, _mm256_and_si256(less, _mm256_set1_epi8(13))); + __m256i shift_LUT; + if (base64_url) { + shift_LUT = _mm256_setr_epi8( + 'a' - 26, '0' - 52, '0' - 52, '0' - 52, '0' - 52, '0' - 52, '0' - 52, + '0' - 52, '0' - 52, '0' - 52, '0' - 52, '-' - 62, '_' - 63, 'A', 0, 0, + 'a' - 26, '0' - 52, '0' - 52, '0' - 52, '0' - 52, '0' - 52, '0' - 52, + '0' - 52, '0' - 52, '0' - 52, '0' - 52, '-' - 62, '_' - 63, 'A', 0, 0); + } else { + shift_LUT = _mm256_setr_epi8( + 'a' - 26, '0' - 52, '0' - 52, '0' - 52, '0' - 52, '0' - 52, '0' - 52, + '0' - 52, '0' - 52, '0' - 52, '0' - 52, '+' - 62, '/' - 63, 'A', 0, 0, + 'a' - 26, '0' - 52, '0' - 52, '0' - 52, '0' - 52, '0' - 52, '0' - 52, + '0' - 52, '0' - 52, '0' - 52, '0' - 52, '+' - 62, '/' - 63, 'A', 0, 0); + } + result = _mm256_shuffle_epi8(shift_LUT, result); + return _mm256_add_epi8(result, input); +} +template +size_t encode_base64(char *dst, const char *src, size_t srclen, + base64_options options) { + // credit: Wojciech Muła + const uint8_t *input = (const uint8_t *)src; + uint8_t *out = (uint8_t *)dst; + const __m256i shuf = + _mm256_set_epi8(10, 11, 9, 10, 7, 8, 6, 7, 4, 5, 3, 4, 1, 2, 0, 1, -#include -#include + 10, 11, 9, 10, 7, 8, 6, 7, 4, 5, 3, 4, 1, 2, 0, 1); + size_t i = 0; + for (; i + 100 <= srclen; i += 96) { + const __m128i lo0 = _mm_loadu_si128( + reinterpret_cast(input + i + 4 * 3 * 0)); + const __m128i hi0 = _mm_loadu_si128( + reinterpret_cast(input + i + 4 * 3 * 1)); + const __m128i lo1 = _mm_loadu_si128( + reinterpret_cast(input + i + 4 * 3 * 2)); + const __m128i hi1 = _mm_loadu_si128( + reinterpret_cast(input + i + 4 * 3 * 3)); + const __m128i lo2 = _mm_loadu_si128( + reinterpret_cast(input + i + 4 * 3 * 4)); + const __m128i hi2 = _mm_loadu_si128( + reinterpret_cast(input + i + 4 * 3 * 5)); + const __m128i lo3 = _mm_loadu_si128( + reinterpret_cast(input + i + 4 * 3 * 6)); + const __m128i hi3 = _mm_loadu_si128( + reinterpret_cast(input + i + 4 * 3 * 7)); -namespace simdutf { -namespace fallback { + __m256i in0 = _mm256_shuffle_epi8(_mm256_set_m128i(hi0, lo0), shuf); + __m256i in1 = _mm256_shuffle_epi8(_mm256_set_m128i(hi1, lo1), shuf); + __m256i in2 = _mm256_shuffle_epi8(_mm256_set_m128i(hi2, lo2), shuf); + __m256i in3 = _mm256_shuffle_epi8(_mm256_set_m128i(hi3, lo3), shuf); -simdutf_warn_unused int -implementation::detect_encodings(const char *input, - size_t length) const noexcept { - // If there is a BOM, then we trust it. - auto bom_encoding = simdutf::BOM::check_bom(input, length); - if (bom_encoding != encoding_type::unspecified) { - return bom_encoding; - } - // todo: reimplement as a one-pass algorithm. - int out = 0; - if (validate_utf8(input, length)) { - out |= encoding_type::UTF8; - } - if ((length % 2) == 0) { - if (validate_utf16le(reinterpret_cast(input), - length / 2)) { - out |= encoding_type::UTF16_LE; - } - } - if ((length % 4) == 0) { - if (validate_utf32(reinterpret_cast(input), length / 4)) { - out |= encoding_type::UTF32_LE; - } - } - return out; -} + const __m256i t0_0 = _mm256_and_si256(in0, _mm256_set1_epi32(0x0fc0fc00)); + const __m256i t0_1 = _mm256_and_si256(in1, _mm256_set1_epi32(0x0fc0fc00)); + const __m256i t0_2 = _mm256_and_si256(in2, _mm256_set1_epi32(0x0fc0fc00)); + const __m256i t0_3 = _mm256_and_si256(in3, _mm256_set1_epi32(0x0fc0fc00)); -simdutf_warn_unused bool -implementation::validate_utf8(const char *buf, size_t len) const noexcept { - return scalar::utf8::validate(buf, len); -} + const __m256i t1_0 = + _mm256_mulhi_epu16(t0_0, _mm256_set1_epi32(0x04000040)); + const __m256i t1_1 = + _mm256_mulhi_epu16(t0_1, _mm256_set1_epi32(0x04000040)); + const __m256i t1_2 = + _mm256_mulhi_epu16(t0_2, _mm256_set1_epi32(0x04000040)); + const __m256i t1_3 = + _mm256_mulhi_epu16(t0_3, _mm256_set1_epi32(0x04000040)); -simdutf_warn_unused result implementation::validate_utf8_with_errors( - const char *buf, size_t len) const noexcept { - return scalar::utf8::validate_with_errors(buf, len); -} + const __m256i t2_0 = _mm256_and_si256(in0, _mm256_set1_epi32(0x003f03f0)); + const __m256i t2_1 = _mm256_and_si256(in1, _mm256_set1_epi32(0x003f03f0)); + const __m256i t2_2 = _mm256_and_si256(in2, _mm256_set1_epi32(0x003f03f0)); + const __m256i t2_3 = _mm256_and_si256(in3, _mm256_set1_epi32(0x003f03f0)); -simdutf_warn_unused bool -implementation::validate_ascii(const char *buf, size_t len) const noexcept { - return scalar::ascii::validate(buf, len); -} + const __m256i t3_0 = + _mm256_mullo_epi16(t2_0, _mm256_set1_epi32(0x01000010)); + const __m256i t3_1 = + _mm256_mullo_epi16(t2_1, _mm256_set1_epi32(0x01000010)); + const __m256i t3_2 = + _mm256_mullo_epi16(t2_2, _mm256_set1_epi32(0x01000010)); + const __m256i t3_3 = + _mm256_mullo_epi16(t2_3, _mm256_set1_epi32(0x01000010)); -simdutf_warn_unused result implementation::validate_ascii_with_errors( - const char *buf, size_t len) const noexcept { - return scalar::ascii::validate_with_errors(buf, len); -} + const __m256i input0 = _mm256_or_si256(t1_0, t3_0); + const __m256i input1 = _mm256_or_si256(t1_1, t3_1); + const __m256i input2 = _mm256_or_si256(t1_2, t3_2); + const __m256i input3 = _mm256_or_si256(t1_3, t3_3); -simdutf_warn_unused bool -implementation::validate_utf16le(const char16_t *buf, - size_t len) const noexcept { - return scalar::utf16::validate(buf, len); -} + _mm256_storeu_si256(reinterpret_cast<__m256i *>(out), + lookup_pshufb_improved(input0)); + out += 32; -simdutf_warn_unused bool -implementation::validate_utf16be(const char16_t *buf, - size_t len) const noexcept { - return scalar::utf16::validate(buf, len); -} + _mm256_storeu_si256(reinterpret_cast<__m256i *>(out), + lookup_pshufb_improved(input1)); + out += 32; -simdutf_warn_unused result implementation::validate_utf16le_with_errors( - const char16_t *buf, size_t len) const noexcept { - return scalar::utf16::validate_with_errors(buf, len); -} + _mm256_storeu_si256(reinterpret_cast<__m256i *>(out), + lookup_pshufb_improved(input2)); + out += 32; + _mm256_storeu_si256(reinterpret_cast<__m256i *>(out), + lookup_pshufb_improved(input3)); + out += 32; + } + for (; i + 28 <= srclen; i += 24) { + // lo = [xxxx|DDDC|CCBB|BAAA] + // hi = [xxxx|HHHG|GGFF|FEEE] + const __m128i lo = + _mm_loadu_si128(reinterpret_cast(input + i)); + const __m128i hi = + _mm_loadu_si128(reinterpret_cast(input + i + 4 * 3)); -simdutf_warn_unused result implementation::validate_utf16be_with_errors( - const char16_t *buf, size_t len) const noexcept { - return scalar::utf16::validate_with_errors(buf, len); -} + // bytes from groups A, B and C are needed in separate 32-bit lanes + // in = [0HHH|0GGG|0FFF|0EEE[0DDD|0CCC|0BBB|0AAA] + __m256i in = _mm256_shuffle_epi8(_mm256_set_m128i(hi, lo), shuf); -simdutf_warn_unused bool -implementation::validate_utf32(const char32_t *buf, size_t len) const noexcept { - return scalar::utf32::validate(buf, len); -} + // this part is well commented in encode.sse.cpp -simdutf_warn_unused result implementation::validate_utf32_with_errors( - const char32_t *buf, size_t len) const noexcept { - return scalar::utf32::validate_with_errors(buf, len); -} + const __m256i t0 = _mm256_and_si256(in, _mm256_set1_epi32(0x0fc0fc00)); + const __m256i t1 = _mm256_mulhi_epu16(t0, _mm256_set1_epi32(0x04000040)); + const __m256i t2 = _mm256_and_si256(in, _mm256_set1_epi32(0x003f03f0)); + const __m256i t3 = _mm256_mullo_epi16(t2, _mm256_set1_epi32(0x01000010)); + const __m256i indices = _mm256_or_si256(t1, t3); -simdutf_warn_unused size_t implementation::convert_latin1_to_utf8( - const char *buf, size_t len, char *utf8_output) const noexcept { - return scalar::latin1_to_utf8::convert(buf, len, utf8_output); + _mm256_storeu_si256(reinterpret_cast<__m256i *>(out), + lookup_pshufb_improved(indices)); + out += 32; + } + return i / 3 * 4 + scalar::base64::tail_encode_base64((char *)out, src + i, + srclen - i, options); } -simdutf_warn_unused size_t implementation::convert_latin1_to_utf16le( - const char *buf, size_t len, char16_t *utf16_output) const noexcept { - return scalar::latin1_to_utf16::convert(buf, len, - utf16_output); -} +static inline void compress(__m128i data, uint16_t mask, char *output) { + if (mask == 0) { + _mm_storeu_si128(reinterpret_cast<__m128i *>(output), data); + return; + } + // this particular implementation was inspired by work done by @animetosho + // we do it in two steps, first 8 bytes and then second 8 bytes + uint8_t mask1 = uint8_t(mask); // least significant 8 bits + uint8_t mask2 = uint8_t(mask >> 8); // most significant 8 bits + // next line just loads the 64-bit values thintable_epi8[mask1] and + // thintable_epi8[mask2] into a 128-bit register, using only + // two instructions on most compilers. -simdutf_warn_unused size_t implementation::convert_latin1_to_utf16be( - const char *buf, size_t len, char16_t *utf16_output) const noexcept { - return scalar::latin1_to_utf16::convert(buf, len, - utf16_output); -} + __m128i shufmask = _mm_set_epi64x(tables::base64::thintable_epi8[mask2], + tables::base64::thintable_epi8[mask1]); + // we increment by 0x08 the second half of the mask + shufmask = + _mm_add_epi8(shufmask, _mm_set_epi32(0x08080808, 0x08080808, 0, 0)); + // this is the version "nearly pruned" + __m128i pruned = _mm_shuffle_epi8(data, shufmask); + // we still need to put the two halves together. + // we compute the popcount of the first half: + int pop1 = tables::base64::BitsSetTable256mul2[mask1]; + // then load the corresponding mask, what it does is to write + // only the first pop1 bytes from the first 8 bytes, and then + // it fills in with the bytes from the second 8 bytes + some filling + // at the end. + __m128i compactmask = _mm_loadu_si128(reinterpret_cast( + tables::base64::pshufb_combine_table + pop1 * 8)); + __m128i answer = _mm_shuffle_epi8(pruned, compactmask); -simdutf_warn_unused size_t implementation::convert_latin1_to_utf32( - const char *buf, size_t len, char32_t *utf32_output) const noexcept { - return scalar::latin1_to_utf32::convert(buf, len, utf32_output); + _mm_storeu_si128(reinterpret_cast<__m128i *>(output), answer); } -simdutf_warn_unused size_t implementation::convert_utf8_to_latin1( - const char *buf, size_t len, char *latin1_output) const noexcept { - return scalar::utf8_to_latin1::convert(buf, len, latin1_output); +static inline void compress(__m256i data, uint32_t mask, char *output) { + if (mask == 0) { + _mm256_storeu_si256(reinterpret_cast<__m256i *>(output), data); + return; + } + compress(_mm256_castsi256_si128(data), uint16_t(mask), output); + compress(_mm256_extracti128_si256(data, 1), uint16_t(mask >> 16), + output + _mm_popcnt_u32(~mask & 0xFFFF)); } -simdutf_warn_unused result implementation::convert_utf8_to_latin1_with_errors( - const char *buf, size_t len, char *latin1_output) const noexcept { - return scalar::utf8_to_latin1::convert_with_errors(buf, len, latin1_output); -} +struct block64 { + __m256i chunks[2]; +}; -simdutf_warn_unused size_t implementation::convert_valid_utf8_to_latin1( - const char *buf, size_t len, char *latin1_output) const noexcept { - return scalar::utf8_to_latin1::convert_valid(buf, len, latin1_output); -} +template +static inline uint32_t to_base64_mask(__m256i *src, uint32_t *error) { + const __m256i ascii_space_tbl = + _mm256_setr_epi8(0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xa, + 0x0, 0xc, 0xd, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xa, 0x0, 0xc, 0xd, 0x0, 0x0); + // credit: aqrit + __m256i delta_asso; + if (base64_url) { + delta_asso = + _mm256_setr_epi8(0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xF, 0x0, 0xF, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xF, 0x0, 0xF); + } else { + delta_asso = _mm256_setr_epi8( + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0F, 0x00, 0x0F, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x0F); + } -simdutf_warn_unused size_t implementation::convert_utf8_to_utf16le( - const char *buf, size_t len, char16_t *utf16_output) const noexcept { - return scalar::utf8_to_utf16::convert(buf, len, - utf16_output); -} + __m256i delta_values; + if (base64_url) { + delta_values = _mm256_setr_epi8( + 0x0, 0x0, 0x0, 0x13, 0x4, uint8_t(0xBF), uint8_t(0xBF), uint8_t(0xB9), + uint8_t(0xB9), 0x0, 0x11, uint8_t(0xC3), uint8_t(0xBF), uint8_t(0xE0), + uint8_t(0xB9), uint8_t(0xB9), 0x0, 0x0, 0x0, 0x13, 0x4, uint8_t(0xBF), + uint8_t(0xBF), uint8_t(0xB9), uint8_t(0xB9), 0x0, 0x11, uint8_t(0xC3), + uint8_t(0xBF), uint8_t(0xE0), uint8_t(0xB9), uint8_t(0xB9)); + } else { + delta_values = _mm256_setr_epi8( + int8_t(0x00), int8_t(0x00), int8_t(0x00), int8_t(0x13), int8_t(0x04), + int8_t(0xBF), int8_t(0xBF), int8_t(0xB9), int8_t(0xB9), int8_t(0x00), + int8_t(0x10), int8_t(0xC3), int8_t(0xBF), int8_t(0xBF), int8_t(0xB9), + int8_t(0xB9), int8_t(0x00), int8_t(0x00), int8_t(0x00), int8_t(0x13), + int8_t(0x04), int8_t(0xBF), int8_t(0xBF), int8_t(0xB9), int8_t(0xB9), + int8_t(0x00), int8_t(0x10), int8_t(0xC3), int8_t(0xBF), int8_t(0xBF), + int8_t(0xB9), int8_t(0xB9)); + } + __m256i check_asso; -simdutf_warn_unused size_t implementation::convert_utf8_to_utf16be( - const char *buf, size_t len, char16_t *utf16_output) const noexcept { - return scalar::utf8_to_utf16::convert(buf, len, - utf16_output); -} + if (base64_url) { + check_asso = + _mm256_setr_epi8(0xD, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x3, + 0x7, 0xB, 0xE, 0xB, 0x6, 0xD, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x3, 0x7, 0xB, 0xE, 0xB, 0x6); + } else { -simdutf_warn_unused result implementation::convert_utf8_to_utf16le_with_errors( - const char *buf, size_t len, char16_t *utf16_output) const noexcept { - return scalar::utf8_to_utf16::convert_with_errors( - buf, len, utf16_output); + check_asso = _mm256_setr_epi8( + 0x0D, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x07, + 0x0B, 0x0B, 0x0B, 0x0F, 0x0D, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x03, 0x07, 0x0B, 0x0B, 0x0B, 0x0F); + } + __m256i check_values; + if (base64_url) { + check_values = _mm256_setr_epi8( + uint8_t(0x80), uint8_t(0x80), uint8_t(0x80), uint8_t(0x80), + uint8_t(0xCF), uint8_t(0xBF), uint8_t(0xB6), uint8_t(0xA6), + uint8_t(0xB5), uint8_t(0xA1), 0x0, uint8_t(0x80), 0x0, uint8_t(0x80), + 0x0, uint8_t(0x80), uint8_t(0x80), uint8_t(0x80), uint8_t(0x80), + uint8_t(0x80), uint8_t(0xCF), uint8_t(0xBF), uint8_t(0xB6), + uint8_t(0xA6), uint8_t(0xB5), uint8_t(0xA1), 0x0, uint8_t(0x80), 0x0, + uint8_t(0x80), 0x0, uint8_t(0x80)); + } else { + check_values = _mm256_setr_epi8( + int8_t(0x80), int8_t(0x80), int8_t(0x80), int8_t(0x80), int8_t(0xCF), + int8_t(0xBF), int8_t(0xD5), int8_t(0xA6), int8_t(0xB5), int8_t(0x86), + int8_t(0xD1), int8_t(0x80), int8_t(0xB1), int8_t(0x80), int8_t(0x91), + int8_t(0x80), int8_t(0x80), int8_t(0x80), int8_t(0x80), int8_t(0x80), + int8_t(0xCF), int8_t(0xBF), int8_t(0xD5), int8_t(0xA6), int8_t(0xB5), + int8_t(0x86), int8_t(0xD1), int8_t(0x80), int8_t(0xB1), int8_t(0x80), + int8_t(0x91), int8_t(0x80)); + } + const __m256i shifted = _mm256_srli_epi32(*src, 3); + const __m256i delta_hash = + _mm256_avg_epu8(_mm256_shuffle_epi8(delta_asso, *src), shifted); + const __m256i check_hash = + _mm256_avg_epu8(_mm256_shuffle_epi8(check_asso, *src), shifted); + const __m256i out = + _mm256_adds_epi8(_mm256_shuffle_epi8(delta_values, delta_hash), *src); + const __m256i chk = + _mm256_adds_epi8(_mm256_shuffle_epi8(check_values, check_hash), *src); + const int mask = _mm256_movemask_epi8(chk); + if (!ignore_garbage && mask) { + __m256i ascii_space = + _mm256_cmpeq_epi8(_mm256_shuffle_epi8(ascii_space_tbl, *src), *src); + *error = (mask ^ _mm256_movemask_epi8(ascii_space)); + } + *src = out; + return (uint32_t)mask; } -simdutf_warn_unused result implementation::convert_utf8_to_utf16be_with_errors( - const char *buf, size_t len, char16_t *utf16_output) const noexcept { - return scalar::utf8_to_utf16::convert_with_errors( - buf, len, utf16_output); +template +static inline uint64_t to_base64_mask(block64 *b, uint64_t *error) { + uint32_t err0 = 0; + uint32_t err1 = 0; + uint64_t m0 = + to_base64_mask(&b->chunks[0], &err0); + uint64_t m1 = + to_base64_mask(&b->chunks[1], &err1); + if (!ignore_garbage) { + *error = err0 | ((uint64_t)err1 << 32); + } + return m0 | (m1 << 32); } -simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf16le( - const char *buf, size_t len, char16_t *utf16_output) const noexcept { - return scalar::utf8_to_utf16::convert_valid(buf, len, - utf16_output); +static inline void copy_block(block64 *b, char *output) { + _mm256_storeu_si256(reinterpret_cast<__m256i *>(output), b->chunks[0]); + _mm256_storeu_si256(reinterpret_cast<__m256i *>(output + 32), b->chunks[1]); } -simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf16be( - const char *buf, size_t len, char16_t *utf16_output) const noexcept { - return scalar::utf8_to_utf16::convert_valid(buf, len, - utf16_output); +static inline uint64_t compress_block(block64 *b, uint64_t mask, char *output) { + uint64_t nmask = ~mask; + compress(b->chunks[0], uint32_t(mask), output); + compress(b->chunks[1], uint32_t(mask >> 32), + output + _mm_popcnt_u64(nmask & 0xFFFFFFFF)); + return _mm_popcnt_u64(nmask); } -simdutf_warn_unused size_t implementation::convert_utf8_to_utf32( - const char *buf, size_t len, char32_t *utf32_output) const noexcept { - return scalar::utf8_to_utf32::convert(buf, len, utf32_output); +// The caller of this function is responsible to ensure that there are 64 bytes +// available from reading at src. The data is read into a block64 structure. +static inline void load_block(block64 *b, const char *src) { + b->chunks[0] = _mm256_loadu_si256(reinterpret_cast(src)); + b->chunks[1] = + _mm256_loadu_si256(reinterpret_cast(src + 32)); } -simdutf_warn_unused result implementation::convert_utf8_to_utf32_with_errors( - const char *buf, size_t len, char32_t *utf32_output) const noexcept { - return scalar::utf8_to_utf32::convert_with_errors(buf, len, utf32_output); +// The caller of this function is responsible to ensure that there are 128 bytes +// available from reading at src. The data is read into a block64 structure. +static inline void load_block(block64 *b, const char16_t *src) { + __m256i m1 = _mm256_loadu_si256(reinterpret_cast(src)); + __m256i m2 = _mm256_loadu_si256(reinterpret_cast(src + 16)); + __m256i m3 = _mm256_loadu_si256(reinterpret_cast(src + 32)); + __m256i m4 = _mm256_loadu_si256(reinterpret_cast(src + 48)); + __m256i m1p = _mm256_permute2x128_si256(m1, m2, 0x20); + __m256i m2p = _mm256_permute2x128_si256(m1, m2, 0x31); + __m256i m3p = _mm256_permute2x128_si256(m3, m4, 0x20); + __m256i m4p = _mm256_permute2x128_si256(m3, m4, 0x31); + b->chunks[0] = _mm256_packus_epi16(m1p, m2p); + b->chunks[1] = _mm256_packus_epi16(m3p, m4p); } -simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf32( - const char *input, size_t size, char32_t *utf32_output) const noexcept { - return scalar::utf8_to_utf32::convert_valid(input, size, utf32_output); -} +static inline void base64_decode(char *out, __m256i str) { + // credit: aqrit + const __m256i pack_shuffle = + _mm256_setr_epi8(2, 1, 0, 6, 5, 4, 10, 9, 8, 14, 13, 12, -1, -1, -1, -1, + 2, 1, 0, 6, 5, 4, 10, 9, 8, 14, 13, 12, -1, -1, -1, -1); + const __m256i t0 = _mm256_maddubs_epi16(str, _mm256_set1_epi32(0x01400140)); + const __m256i t1 = _mm256_madd_epi16(t0, _mm256_set1_epi32(0x00011000)); + const __m256i t2 = _mm256_shuffle_epi8(t1, pack_shuffle); -simdutf_warn_unused size_t implementation::convert_utf16le_to_latin1( - const char16_t *buf, size_t len, char *latin1_output) const noexcept { - return scalar::utf16_to_latin1::convert(buf, len, - latin1_output); + // Store the output: + _mm_storeu_si128((__m128i *)out, _mm256_castsi256_si128(t2)); + _mm_storeu_si128((__m128i *)(out + 12), _mm256_extracti128_si256(t2, 1)); } - -simdutf_warn_unused size_t implementation::convert_utf16be_to_latin1( - const char16_t *buf, size_t len, char *latin1_output) const noexcept { - return scalar::utf16_to_latin1::convert(buf, len, - latin1_output); +// decode 64 bytes and output 48 bytes +static inline void base64_decode_block(char *out, const char *src) { + base64_decode(out, + _mm256_loadu_si256(reinterpret_cast(src))); + base64_decode(out + 24, _mm256_loadu_si256( + reinterpret_cast(src + 32))); } - -simdutf_warn_unused result -implementation::convert_utf16le_to_latin1_with_errors( - const char16_t *buf, size_t len, char *latin1_output) const noexcept { - return scalar::utf16_to_latin1::convert_with_errors( - buf, len, latin1_output); +static inline void base64_decode_block_safe(char *out, const char *src) { + base64_decode(out, + _mm256_loadu_si256(reinterpret_cast(src))); + char buffer[32]; // We enforce safety with a buffer. + base64_decode( + buffer, _mm256_loadu_si256(reinterpret_cast(src + 32))); + std::memcpy(out + 24, buffer, 24); } - -simdutf_warn_unused result -implementation::convert_utf16be_to_latin1_with_errors( - const char16_t *buf, size_t len, char *latin1_output) const noexcept { - return scalar::utf16_to_latin1::convert_with_errors( - buf, len, latin1_output); +static inline void base64_decode_block(char *out, block64 *b) { + base64_decode(out, b->chunks[0]); + base64_decode(out + 24, b->chunks[1]); } - -simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_latin1( - const char16_t *buf, size_t len, char *latin1_output) const noexcept { - return scalar::utf16_to_latin1::convert_valid( - buf, len, latin1_output); +static inline void base64_decode_block_safe(char *out, block64 *b) { + base64_decode(out, b->chunks[0]); + char buffer[32]; // We enforce safety with a buffer. + base64_decode(buffer, b->chunks[1]); + std::memcpy(out + 24, buffer, 24); } -simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_latin1( - const char16_t *buf, size_t len, char *latin1_output) const noexcept { - return scalar::utf16_to_latin1::convert_valid(buf, len, - latin1_output); -} +template +full_result +compress_decode_base64(char *dst, const chartype *src, size_t srclen, + base64_options options, + last_chunk_handling_options last_chunk_options) { + const uint8_t *to_base64 = base64_url ? tables::base64::to_base64_url_value + : tables::base64::to_base64_value; + size_t equallocation = + srclen; // location of the first padding character if any + // skip trailing spaces + while (!ignore_garbage && srclen > 0 && + scalar::base64::is_eight_byte(src[srclen - 1]) && + to_base64[uint8_t(src[srclen - 1])] == 64) { + srclen--; + } + size_t equalsigns = 0; + if (!ignore_garbage && srclen > 0 && src[srclen - 1] == '=') { + equallocation = srclen - 1; + srclen--; + equalsigns = 1; + // skip trailing spaces + while (srclen > 0 && scalar::base64::is_eight_byte(src[srclen - 1]) && + to_base64[uint8_t(src[srclen - 1])] == 64) { + srclen--; + } + if (srclen > 0 && src[srclen - 1] == '=') { + equallocation = srclen - 1; + srclen--; + equalsigns = 2; + } + } + if (srclen == 0) { + if (!ignore_garbage && equalsigns > 0) { + return {INVALID_BASE64_CHARACTER, equallocation, 0}; + } + return {SUCCESS, 0, 0}; + } + char *end_of_safe_64byte_zone = + (srclen + 3) / 4 * 3 >= 63 ? dst + (srclen + 3) / 4 * 3 - 63 : dst; -simdutf_warn_unused size_t implementation::convert_utf16le_to_utf8( - const char16_t *buf, size_t len, char *utf8_output) const noexcept { - return scalar::utf16_to_utf8::convert(buf, len, - utf8_output); -} + const chartype *const srcinit = src; + const char *const dstinit = dst; + const chartype *const srcend = src + srclen; -simdutf_warn_unused size_t implementation::convert_utf16be_to_utf8( - const char16_t *buf, size_t len, char *utf8_output) const noexcept { - return scalar::utf16_to_utf8::convert(buf, len, utf8_output); -} + constexpr size_t block_size = 6; + static_assert(block_size >= 2, "block_size must be at least two"); + char buffer[block_size * 64]; + char *bufferptr = buffer; + if (srclen >= 64) { + const chartype *const srcend64 = src + srclen - 64; + while (src <= srcend64) { + block64 b; + load_block(&b, src); + src += 64; + uint64_t error = 0; + uint64_t badcharmask = + to_base64_mask(&b, &error); + if (!ignore_garbage && error) { + src -= 64; + size_t error_offset = _tzcnt_u64(error); + return {error_code::INVALID_BASE64_CHARACTER, + size_t(src - srcinit + error_offset), size_t(dst - dstinit)}; + } + if (badcharmask != 0) { + // optimization opportunity: check for simple masks like those made of + // continuous 1s followed by continuous 0s. And masks containing a + // single bad character. + bufferptr += compress_block(&b, badcharmask, bufferptr); + } else if (bufferptr != buffer) { + copy_block(&b, bufferptr); + bufferptr += 64; + } else { + if (dst >= end_of_safe_64byte_zone) { + base64_decode_block_safe(dst, &b); + } else { + base64_decode_block(dst, &b); + } + dst += 48; + } + if (bufferptr >= (block_size - 1) * 64 + buffer) { + for (size_t i = 0; i < (block_size - 2); i++) { + base64_decode_block(dst, buffer + i * 64); + dst += 48; + } + if (dst >= end_of_safe_64byte_zone) { + base64_decode_block_safe(dst, buffer + (block_size - 2) * 64); + } else { + base64_decode_block(dst, buffer + (block_size - 2) * 64); + } + dst += 48; + std::memcpy(buffer, buffer + (block_size - 1) * 64, + 64); // 64 might be too much + bufferptr -= (block_size - 1) * 64; + } + } + } -simdutf_warn_unused result implementation::convert_utf16le_to_utf8_with_errors( - const char16_t *buf, size_t len, char *utf8_output) const noexcept { - return scalar::utf16_to_utf8::convert_with_errors( - buf, len, utf8_output); -} + char *buffer_start = buffer; + // Optimization note: if this is almost full, then it is worth our + // time, otherwise, we should just decode directly. + int last_block = (int)((bufferptr - buffer_start) % 64); + if (last_block != 0 && srcend - src + last_block >= 64) { -simdutf_warn_unused result implementation::convert_utf16be_to_utf8_with_errors( - const char16_t *buf, size_t len, char *utf8_output) const noexcept { - return scalar::utf16_to_utf8::convert_with_errors( - buf, len, utf8_output); -} + while ((bufferptr - buffer_start) % 64 != 0 && src < srcend) { + uint8_t val = to_base64[uint8_t(*src)]; + *bufferptr = char(val); + if (!ignore_garbage && + (!scalar::base64::is_eight_byte(*src) || val > 64)) { + return {error_code::INVALID_BASE64_CHARACTER, size_t(src - srcinit), + size_t(dst - dstinit)}; + } + bufferptr += (val <= 63); + src++; + } + } -simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_utf8( - const char16_t *buf, size_t len, char *utf8_output) const noexcept { - return scalar::utf16_to_utf8::convert_valid(buf, len, - utf8_output); -} + for (; buffer_start + 64 <= bufferptr; buffer_start += 64) { + if (dst >= end_of_safe_64byte_zone) { + base64_decode_block_safe(dst, buffer_start); + } else { + base64_decode_block(dst, buffer_start); + } + dst += 48; + } + if ((bufferptr - buffer_start) % 64 != 0) { + while (buffer_start + 4 < bufferptr) { + uint32_t triple = ((uint32_t(uint8_t(buffer_start[0])) << 3 * 6) + + (uint32_t(uint8_t(buffer_start[1])) << 2 * 6) + + (uint32_t(uint8_t(buffer_start[2])) << 1 * 6) + + (uint32_t(uint8_t(buffer_start[3])) << 0 * 6)) + << 8; + triple = scalar::utf32::swap_bytes(triple); + std::memcpy(dst, &triple, 4); -simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_utf8( - const char16_t *buf, size_t len, char *utf8_output) const noexcept { - return scalar::utf16_to_utf8::convert_valid(buf, len, - utf8_output); -} + dst += 3; + buffer_start += 4; + } + if (buffer_start + 4 <= bufferptr) { + uint32_t triple = ((uint32_t(uint8_t(buffer_start[0])) << 3 * 6) + + (uint32_t(uint8_t(buffer_start[1])) << 2 * 6) + + (uint32_t(uint8_t(buffer_start[2])) << 1 * 6) + + (uint32_t(uint8_t(buffer_start[3])) << 0 * 6)) + << 8; + triple = scalar::utf32::swap_bytes(triple); + std::memcpy(dst, &triple, 3); -simdutf_warn_unused size_t implementation::convert_utf32_to_latin1( - const char32_t *buf, size_t len, char *latin1_output) const noexcept { - return scalar::utf32_to_latin1::convert(buf, len, latin1_output); + dst += 3; + buffer_start += 4; + } + // we may have 1, 2 or 3 bytes left and we need to decode them so let us + // backtrack + int leftover = int(bufferptr - buffer_start); + while (leftover > 0) { + if (!ignore_garbage) { + while (to_base64[uint8_t(*(src - 1))] == 64) { + src--; + } + } else { + while (to_base64[uint8_t(*(src - 1))] >= 64) { + src--; + } + } + src--; + leftover--; + } + } + if (src < srcend + equalsigns) { + full_result r = scalar::base64::base64_tail_decode( + dst, src, srcend - src, equalsigns, options, last_chunk_options); + r.input_count += size_t(src - srcinit); + if (r.error == error_code::INVALID_BASE64_CHARACTER || + r.error == error_code::BASE64_EXTRA_BITS) { + return r; + } else { + r.output_count += size_t(dst - dstinit); + } + if (!ignore_garbage && last_chunk_options != stop_before_partial && + r.error == error_code::SUCCESS && equalsigns > 0) { + // additional checks + if ((r.output_count % 3 == 0) || + ((r.output_count % 3) + 1 + equalsigns != 4)) { + r.error = error_code::INVALID_BASE64_CHARACTER; + r.input_count = equallocation; + } + } + return r; + } + if (!ignore_garbage && equalsigns > 0) { + if ((size_t(dst - dstinit) % 3 == 0) || + ((size_t(dst - dstinit) % 3) + 1 + equalsigns != 4)) { + return {INVALID_BASE64_CHARACTER, equallocation, size_t(dst - dstinit)}; + } + } + return {SUCCESS, srclen, size_t(dst - dstinit)}; } +/* end file src/haswell/avx2_base64.cpp */ -simdutf_warn_unused result implementation::convert_utf32_to_latin1_with_errors( - const char32_t *buf, size_t len, char *latin1_output) const noexcept { - return scalar::utf32_to_latin1::convert_with_errors(buf, len, latin1_output); -} +} // unnamed namespace +} // namespace haswell +} // namespace simdutf -simdutf_warn_unused size_t implementation::convert_valid_utf32_to_latin1( - const char32_t *buf, size_t len, char *latin1_output) const noexcept { - return scalar::utf32_to_latin1::convert_valid(buf, len, latin1_output); -} +/* begin file src/generic/buf_block_reader.h */ +namespace simdutf { +namespace haswell { +namespace { -simdutf_warn_unused size_t implementation::convert_utf32_to_utf8( - const char32_t *buf, size_t len, char *utf8_output) const noexcept { - return scalar::utf32_to_utf8::convert(buf, len, utf8_output); -} +// Walks through a buffer in block-sized increments, loading the last part with +// spaces +template struct buf_block_reader { +public: + simdutf_really_inline buf_block_reader(const uint8_t *_buf, size_t _len); + simdutf_really_inline size_t block_index(); + simdutf_really_inline bool has_full_block() const; + simdutf_really_inline const uint8_t *full_block() const; + /** + * Get the last block, padded with spaces. + * + * There will always be a last block, with at least 1 byte, unless len == 0 + * (in which case this function fills the buffer with spaces and returns 0. In + * particular, if len == STEP_SIZE there will be 0 full_blocks and 1 remainder + * block with STEP_SIZE bytes and no spaces for padding. + * + * @return the number of effective characters in the last block. + */ + simdutf_really_inline size_t get_remainder(uint8_t *dst) const; + simdutf_really_inline void advance(); -simdutf_warn_unused result implementation::convert_utf32_to_utf8_with_errors( - const char32_t *buf, size_t len, char *utf8_output) const noexcept { - return scalar::utf32_to_utf8::convert_with_errors(buf, len, utf8_output); -} +private: + const uint8_t *buf; + const size_t len; + const size_t lenminusstep; + size_t idx; +}; -simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf8( - const char32_t *buf, size_t len, char *utf8_output) const noexcept { - return scalar::utf32_to_utf8::convert_valid(buf, len, utf8_output); +// Routines to print masks and text for debugging bitmask operations +simdutf_unused static char *format_input_text_64(const uint8_t *text) { + static char *buf = + reinterpret_cast(malloc(sizeof(simd8x64) + 1)); + for (size_t i = 0; i < sizeof(simd8x64); i++) { + buf[i] = int8_t(text[i]) < ' ' ? '_' : int8_t(text[i]); + } + buf[sizeof(simd8x64)] = '\0'; + return buf; } -simdutf_warn_unused size_t implementation::convert_utf32_to_utf16le( - const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { - return scalar::utf32_to_utf16::convert(buf, len, - utf16_output); +// Routines to print masks and text for debugging bitmask operations +simdutf_unused static char *format_input_text(const simd8x64 &in) { + static char *buf = + reinterpret_cast(malloc(sizeof(simd8x64) + 1)); + in.store(reinterpret_cast(buf)); + for (size_t i = 0; i < sizeof(simd8x64); i++) { + if (buf[i] < ' ') { + buf[i] = '_'; + } + } + buf[sizeof(simd8x64)] = '\0'; + return buf; } -simdutf_warn_unused size_t implementation::convert_utf32_to_utf16be( - const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { - return scalar::utf32_to_utf16::convert(buf, len, - utf16_output); +simdutf_unused static char *format_mask(uint64_t mask) { + static char *buf = reinterpret_cast(malloc(64 + 1)); + for (size_t i = 0; i < 64; i++) { + buf[i] = (mask & (size_t(1) << i)) ? 'X' : ' '; + } + buf[64] = '\0'; + return buf; } -simdutf_warn_unused result implementation::convert_utf32_to_utf16le_with_errors( - const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { - return scalar::utf32_to_utf16::convert_with_errors( - buf, len, utf16_output); -} +template +simdutf_really_inline +buf_block_reader::buf_block_reader(const uint8_t *_buf, size_t _len) + : buf{_buf}, len{_len}, lenminusstep{len < STEP_SIZE ? 0 : len - STEP_SIZE}, + idx{0} {} -simdutf_warn_unused result implementation::convert_utf32_to_utf16be_with_errors( - const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { - return scalar::utf32_to_utf16::convert_with_errors( - buf, len, utf16_output); +template +simdutf_really_inline size_t buf_block_reader::block_index() { + return idx; } -simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf16le( - const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { - return scalar::utf32_to_utf16::convert_valid( - buf, len, utf16_output); +template +simdutf_really_inline bool buf_block_reader::has_full_block() const { + return idx < lenminusstep; } -simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf16be( - const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { - return scalar::utf32_to_utf16::convert_valid(buf, len, - utf16_output); +template +simdutf_really_inline const uint8_t * +buf_block_reader::full_block() const { + return &buf[idx]; } -simdutf_warn_unused size_t implementation::convert_utf16le_to_utf32( - const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { - return scalar::utf16_to_utf32::convert(buf, len, - utf32_output); +template +simdutf_really_inline size_t +buf_block_reader::get_remainder(uint8_t *dst) const { + if (len == idx) { + return 0; + } // memcpy(dst, null, 0) will trigger an error with some sanitizers + std::memset(dst, 0x20, + STEP_SIZE); // std::memset STEP_SIZE because it is more efficient + // to write out 8 or 16 bytes at once. + std::memcpy(dst, buf + idx, len - idx); + return len - idx; } -simdutf_warn_unused size_t implementation::convert_utf16be_to_utf32( - const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { - return scalar::utf16_to_utf32::convert(buf, len, - utf32_output); +template +simdutf_really_inline void buf_block_reader::advance() { + idx += STEP_SIZE; } -simdutf_warn_unused result implementation::convert_utf16le_to_utf32_with_errors( - const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { - return scalar::utf16_to_utf32::convert_with_errors( - buf, len, utf32_output); -} +} // unnamed namespace +} // namespace haswell +} // namespace simdutf +/* end file src/generic/buf_block_reader.h */ +/* begin file src/generic/utf8_validation/utf8_lookup4_algorithm.h */ +namespace simdutf { +namespace haswell { +namespace { +namespace utf8_validation { -simdutf_warn_unused result implementation::convert_utf16be_to_utf32_with_errors( - const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { - return scalar::utf16_to_utf32::convert_with_errors( - buf, len, utf32_output); -} +using namespace simd; -simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_utf32( - const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { - return scalar::utf16_to_utf32::convert_valid( - buf, len, utf32_output); -} +simdutf_really_inline simd8 +check_special_cases(const simd8 input, const simd8 prev1) { + // Bit 0 = Too Short (lead byte/ASCII followed by lead byte/ASCII) + // Bit 1 = Too Long (ASCII followed by continuation) + // Bit 2 = Overlong 3-byte + // Bit 4 = Surrogate + // Bit 5 = Overlong 2-byte + // Bit 7 = Two Continuations + constexpr const uint8_t TOO_SHORT = 1 << 0; // 11______ 0_______ + // 11______ 11______ + constexpr const uint8_t TOO_LONG = 1 << 1; // 0_______ 10______ + constexpr const uint8_t OVERLONG_3 = 1 << 2; // 11100000 100_____ + constexpr const uint8_t SURROGATE = 1 << 4; // 11101101 101_____ + constexpr const uint8_t OVERLONG_2 = 1 << 5; // 1100000_ 10______ + constexpr const uint8_t TWO_CONTS = 1 << 7; // 10______ 10______ + constexpr const uint8_t TOO_LARGE = 1 << 3; // 11110100 1001____ + // 11110100 101_____ + // 11110101 1001____ + // 11110101 101_____ + // 1111011_ 1001____ + // 1111011_ 101_____ + // 11111___ 1001____ + // 11111___ 101_____ + constexpr const uint8_t TOO_LARGE_1000 = 1 << 6; + // 11110101 1000____ + // 1111011_ 1000____ + // 11111___ 1000____ + constexpr const uint8_t OVERLONG_4 = 1 << 6; // 11110000 1000____ -simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_utf32( - const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { - return scalar::utf16_to_utf32::convert_valid(buf, len, - utf32_output); -} + const simd8 byte_1_high = prev1.shr<4>().lookup_16( + // 0_______ ________ + TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, + TOO_LONG, + // 10______ ________ + TWO_CONTS, TWO_CONTS, TWO_CONTS, TWO_CONTS, + // 1100____ ________ + TOO_SHORT | OVERLONG_2, + // 1101____ ________ + TOO_SHORT, + // 1110____ ________ + TOO_SHORT | OVERLONG_3 | SURROGATE, + // 1111____ ________ + TOO_SHORT | TOO_LARGE | TOO_LARGE_1000 | OVERLONG_4); + constexpr const uint8_t CARRY = + TOO_SHORT | TOO_LONG | TWO_CONTS; // These all have ____ in byte 1 . + const simd8 byte_1_low = + (prev1 & 0x0F) + .lookup_16( + // ____0000 ________ + CARRY | OVERLONG_3 | OVERLONG_2 | OVERLONG_4, + // ____0001 ________ + CARRY | OVERLONG_2, + // ____001_ ________ + CARRY, CARRY, -void implementation::change_endianness_utf16(const char16_t *input, - size_t length, - char16_t *output) const noexcept { - scalar::utf16::change_endianness_utf16(input, length, output); -} + // ____0100 ________ + CARRY | TOO_LARGE, + // ____0101 ________ + CARRY | TOO_LARGE | TOO_LARGE_1000, + // ____011_ ________ + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, -simdutf_warn_unused size_t implementation::count_utf16le( - const char16_t *input, size_t length) const noexcept { - return scalar::utf16::count_code_points(input, length); -} + // ____1___ ________ + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + // ____1101 ________ + CARRY | TOO_LARGE | TOO_LARGE_1000 | SURROGATE, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000); + const simd8 byte_2_high = input.shr<4>().lookup_16( + // ________ 0_______ + TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, + TOO_SHORT, TOO_SHORT, -simdutf_warn_unused size_t implementation::count_utf16be( - const char16_t *input, size_t length) const noexcept { - return scalar::utf16::count_code_points(input, length); -} + // ________ 1000____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE_1000 | + OVERLONG_4, + // ________ 1001____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE, + // ________ 101_____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, + TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, -simdutf_warn_unused size_t -implementation::count_utf8(const char *input, size_t length) const noexcept { - return scalar::utf8::count_code_points(input, length); + // ________ 11______ + TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT); + return (byte_1_high & byte_1_low & byte_2_high); } - -simdutf_warn_unused size_t implementation::latin1_length_from_utf8( - const char *buf, size_t len) const noexcept { - return scalar::utf8::count_code_points(buf, len); +simdutf_really_inline simd8 +check_multibyte_lengths(const simd8 input, + const simd8 prev_input, + const simd8 sc) { + simd8 prev2 = input.prev<2>(prev_input); + simd8 prev3 = input.prev<3>(prev_input); + simd8 must23 = + simd8(must_be_2_3_continuation(prev2, prev3)); + simd8 must23_80 = must23 & uint8_t(0x80); + return must23_80 ^ sc; } -simdutf_warn_unused size_t -implementation::latin1_length_from_utf16(size_t length) const noexcept { - return scalar::utf16::latin1_length_from_utf16(length); +// +// Return nonzero if there are incomplete multibyte characters at the end of the +// block: e.g. if there is a 4-byte character, but it is 3 bytes from the end. +// +simdutf_really_inline simd8 is_incomplete(const simd8 input) { + // If the previous input's last 3 bytes match this, they're too short (they + // ended at EOF): + // ... 1111____ 111_____ 11______ + static const uint8_t max_array[32] = {255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 0b11110000u - 1, + 0b11100000u - 1, + 0b11000000u - 1}; + const simd8 max_value( + &max_array[sizeof(max_array) - sizeof(simd8)]); + return input.gt_bits(max_value); } -simdutf_warn_unused size_t -implementation::latin1_length_from_utf32(size_t length) const noexcept { - return length; -} +struct utf8_checker { + // If this is nonzero, there has been a UTF-8 error. + simd8 error; + // The last input we received + simd8 prev_input_block; + // Whether the last input we received was incomplete (used for ASCII fast + // path) + simd8 prev_incomplete; -simdutf_warn_unused size_t implementation::utf8_length_from_latin1( - const char *input, size_t length) const noexcept { - size_t answer = length; - size_t i = 0; - auto pop = [](uint64_t v) { - return (size_t)(((v >> 7) & UINT64_C(0x0101010101010101)) * - UINT64_C(0x0101010101010101) >> - 56); - }; - for (; i + 32 <= length; i += 32) { - uint64_t v; - memcpy(&v, input + i, 8); - answer += pop(v); - memcpy(&v, input + i + 8, sizeof(v)); - answer += pop(v); - memcpy(&v, input + i + 16, sizeof(v)); - answer += pop(v); - memcpy(&v, input + i + 24, sizeof(v)); - answer += pop(v); - } - for (; i + 8 <= length; i += 8) { - uint64_t v; - memcpy(&v, input + i, sizeof(v)); - answer += pop(v); + // + // Check whether the current bytes are valid UTF-8. + // + simdutf_really_inline void check_utf8_bytes(const simd8 input, + const simd8 prev_input) { + // Flip prev1...prev3 so we can easily determine if they are 2+, 3+ or 4+ + // lead bytes (2, 3, 4-byte leads become large positive numbers instead of + // small negative numbers) + simd8 prev1 = input.prev<1>(prev_input); + simd8 sc = check_special_cases(input, prev1); + this->error |= check_multibyte_lengths(input, prev_input, sc); } - for (; i + 1 <= length; i += 1) { - answer += static_cast(input[i]) >> 7; + + // The only problem that can happen at EOF is that a multibyte character is + // too short or a byte value too large in the last bytes: check_special_cases + // only checks for bytes too large in the first of two bytes. + simdutf_really_inline void check_eof() { + // If the previous block had incomplete UTF-8 characters at the end, an + // ASCII block can't possibly finish them. + this->error |= this->prev_incomplete; } - return answer; -} -simdutf_warn_unused size_t implementation::utf8_length_from_utf16le( - const char16_t *input, size_t length) const noexcept { - return scalar::utf16::utf8_length_from_utf16(input, - length); -} + simdutf_really_inline void check_next_input(const simd8x64 &input) { + if (simdutf_likely(is_ascii(input))) { + this->error |= this->prev_incomplete; + } else { + // you might think that a for-loop would work, but under Visual Studio, it + // is not good enough. + static_assert((simd8x64::NUM_CHUNKS == 2) || + (simd8x64::NUM_CHUNKS == 4), + "We support either two or four chunks per 64-byte block."); + if (simd8x64::NUM_CHUNKS == 2) { + this->check_utf8_bytes(input.chunks[0], this->prev_input_block); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + } else if (simd8x64::NUM_CHUNKS == 4) { + this->check_utf8_bytes(input.chunks[0], this->prev_input_block); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + this->check_utf8_bytes(input.chunks[2], input.chunks[1]); + this->check_utf8_bytes(input.chunks[3], input.chunks[2]); + } + this->prev_incomplete = + is_incomplete(input.chunks[simd8x64::NUM_CHUNKS - 1]); + this->prev_input_block = input.chunks[simd8x64::NUM_CHUNKS - 1]; + } + } -simdutf_warn_unused size_t implementation::utf8_length_from_utf16be( - const char16_t *input, size_t length) const noexcept { - return scalar::utf16::utf8_length_from_utf16(input, length); -} + // do not forget to call check_eof! + simdutf_really_inline bool errors() const { + return this->error.any_bits_set_anywhere(); + } -simdutf_warn_unused size_t implementation::utf32_length_from_utf16le( - const char16_t *input, size_t length) const noexcept { - return scalar::utf16::utf32_length_from_utf16(input, - length); -} +}; // struct utf8_checker +} // namespace utf8_validation -simdutf_warn_unused size_t implementation::utf32_length_from_utf16be( - const char16_t *input, size_t length) const noexcept { - return scalar::utf16::utf32_length_from_utf16(input, length); -} +using utf8_validation::utf8_checker; -simdutf_warn_unused size_t -implementation::utf16_length_from_latin1(size_t length) const noexcept { - return scalar::latin1::utf16_length_from_latin1(length); -} +} // unnamed namespace +} // namespace haswell +} // namespace simdutf +/* end file src/generic/utf8_validation/utf8_lookup4_algorithm.h */ +/* begin file src/generic/utf8_validation/utf8_validator.h */ +namespace simdutf { +namespace haswell { +namespace { +namespace utf8_validation { -simdutf_warn_unused size_t implementation::utf16_length_from_utf8( - const char *input, size_t length) const noexcept { - return scalar::utf8::utf16_length_from_utf8(input, length); +/** + * Validates that the string is actual UTF-8. + */ +template +bool generic_validate_utf8(const uint8_t *input, size_t length) { + checker c{}; + buf_block_reader<64> reader(input, length); + while (reader.has_full_block()) { + simd::simd8x64 in(reader.full_block()); + c.check_next_input(in); + reader.advance(); + } + uint8_t block[64]{}; + reader.get_remainder(block); + simd::simd8x64 in(block); + c.check_next_input(in); + reader.advance(); + c.check_eof(); + return !c.errors(); } -simdutf_warn_unused size_t implementation::utf8_length_from_utf32( - const char32_t *input, size_t length) const noexcept { - return scalar::utf32::utf8_length_from_utf32(input, length); +bool generic_validate_utf8(const char *input, size_t length) { + return generic_validate_utf8( + reinterpret_cast(input), length); } -simdutf_warn_unused size_t implementation::utf16_length_from_utf32( - const char32_t *input, size_t length) const noexcept { - return scalar::utf32::utf16_length_from_utf32(input, length); +/** + * Validates that the string is actual UTF-8 and stops on errors. + */ +template +result generic_validate_utf8_with_errors(const uint8_t *input, size_t length) { + checker c{}; + buf_block_reader<64> reader(input, length); + size_t count{0}; + while (reader.has_full_block()) { + simd::simd8x64 in(reader.full_block()); + c.check_next_input(in); + if (c.errors()) { + if (count != 0) { + count--; + } // Sometimes the error is only detected in the next chunk + result res = scalar::utf8::rewind_and_validate_with_errors( + reinterpret_cast(input), + reinterpret_cast(input + count), length - count); + res.count += count; + return res; + } + reader.advance(); + count += 64; + } + uint8_t block[64]{}; + reader.get_remainder(block); + simd::simd8x64 in(block); + c.check_next_input(in); + reader.advance(); + c.check_eof(); + if (c.errors()) { + if (count != 0) { + count--; + } // Sometimes the error is only detected in the next chunk + result res = scalar::utf8::rewind_and_validate_with_errors( + reinterpret_cast(input), + reinterpret_cast(input) + count, length - count); + res.count += count; + return res; + } else { + return result(error_code::SUCCESS, length); + } } -simdutf_warn_unused size_t -implementation::utf32_length_from_latin1(size_t length) const noexcept { - return scalar::latin1::utf32_length_from_latin1(length); +result generic_validate_utf8_with_errors(const char *input, size_t length) { + return generic_validate_utf8_with_errors( + reinterpret_cast(input), length); } -simdutf_warn_unused size_t implementation::utf32_length_from_utf8( - const char *input, size_t length) const noexcept { - return scalar::utf8::count_code_points(input, length); +template +bool generic_validate_ascii(const uint8_t *input, size_t length) { + buf_block_reader<64> reader(input, length); + uint8_t blocks[64]{}; + simd::simd8x64 running_or(blocks); + while (reader.has_full_block()) { + simd::simd8x64 in(reader.full_block()); + running_or |= in; + reader.advance(); + } + uint8_t block[64]{}; + reader.get_remainder(block); + simd::simd8x64 in(block); + running_or |= in; + return running_or.is_ascii(); } -simdutf_warn_unused size_t implementation::maximal_binary_length_from_base64( - const char *input, size_t length) const noexcept { - return scalar::base64::maximal_binary_length_from_base64(input, length); +bool generic_validate_ascii(const char *input, size_t length) { + return generic_validate_ascii( + reinterpret_cast(input), length); } -simdutf_warn_unused result implementation::base64_to_binary( - const char *input, size_t length, char *output, base64_options options, - last_chunk_handling_options last_chunk_options) const noexcept { - while (length > 0 && - scalar::base64::is_ascii_white_space(input[length - 1])) { - length--; - } - size_t equallocation = - length; // location of the first padding character if any - size_t equalsigns = 0; - if (length > 0 && input[length - 1] == '=') { - equallocation = length - 1; - length -= 1; - equalsigns++; - while (length > 0 && - scalar::base64::is_ascii_white_space(input[length - 1])) { - length--; - } - if (length > 0 && input[length - 1] == '=') { - equallocation = length - 1; - equalsigns++; - length -= 1; - } - } - if (length == 0) { - if (equalsigns > 0) { - return {INVALID_BASE64_CHARACTER, equallocation}; - } - return {SUCCESS, 0}; - } - result r = scalar::base64::base64_tail_decode( - output, input, length, equalsigns, options, last_chunk_options); - if (last_chunk_options != stop_before_partial && - r.error == error_code::SUCCESS && equalsigns > 0) { - // additional checks - if ((r.count % 3 == 0) || ((r.count % 3) + 1 + equalsigns != 4)) { - return {INVALID_BASE64_CHARACTER, equallocation}; +template +result generic_validate_ascii_with_errors(const uint8_t *input, size_t length) { + buf_block_reader<64> reader(input, length); + size_t count{0}; + while (reader.has_full_block()) { + simd::simd8x64 in(reader.full_block()); + if (!in.is_ascii()) { + result res = scalar::ascii::validate_with_errors( + reinterpret_cast(input + count), length - count); + return result(res.error, count + res.count); } - } - return r; -} + reader.advance(); -simdutf_warn_unused full_result implementation::base64_to_binary_details( - const char *input, size_t length, char *output, base64_options options, - last_chunk_handling_options last_chunk_options) const noexcept { - while (length > 0 && - scalar::base64::is_ascii_white_space(input[length - 1])) { - length--; - } - size_t equallocation = - length; // location of the first padding character if any - size_t equalsigns = 0; - if (length > 0 && input[length - 1] == '=') { - equallocation = length - 1; - length -= 1; - equalsigns++; - while (length > 0 && - scalar::base64::is_ascii_white_space(input[length - 1])) { - length--; - } - if (length > 0 && input[length - 1] == '=') { - equallocation = length - 1; - equalsigns++; - length -= 1; - } - } - if (length == 0) { - if (equalsigns > 0) { - return {INVALID_BASE64_CHARACTER, equallocation, 0}; - } - return {SUCCESS, 0, 0}; + count += 64; } - full_result r = scalar::base64::base64_tail_decode( - output, input, length, equalsigns, options, last_chunk_options); - if (last_chunk_options != stop_before_partial && - r.error == error_code::SUCCESS && equalsigns > 0) { - // additional checks - if ((r.output_count % 3 == 0) || - ((r.output_count % 3) + 1 + equalsigns != 4)) { - return {INVALID_BASE64_CHARACTER, equallocation, r.output_count}; - } + uint8_t block[64]{}; + reader.get_remainder(block); + simd::simd8x64 in(block); + if (!in.is_ascii()) { + result res = scalar::ascii::validate_with_errors( + reinterpret_cast(input + count), length - count); + return result(res.error, count + res.count); + } else { + return result(error_code::SUCCESS, length); } - return r; } -simdutf_warn_unused size_t implementation::maximal_binary_length_from_base64( - const char16_t *input, size_t length) const noexcept { - return scalar::base64::maximal_binary_length_from_base64(input, length); +result generic_validate_ascii_with_errors(const char *input, size_t length) { + return generic_validate_ascii_with_errors( + reinterpret_cast(input), length); } -simdutf_warn_unused result implementation::base64_to_binary( - const char16_t *input, size_t length, char *output, base64_options options, - last_chunk_handling_options last_chunk_options) const noexcept { - while (length > 0 && - scalar::base64::is_ascii_white_space(input[length - 1])) { - length--; - } - size_t equallocation = - length; // location of the first padding character if any - size_t equalsigns = 0; - if (length > 0 && input[length - 1] == '=') { - equallocation = length - 1; - length -= 1; - equalsigns++; - while (length > 0 && - scalar::base64::is_ascii_white_space(input[length - 1])) { - length--; - } - if (length > 0 && input[length - 1] == '=') { - equallocation = length - 1; - equalsigns++; - length -= 1; - } - } - if (length == 0) { - if (equalsigns > 0) { - return {INVALID_BASE64_CHARACTER, equallocation}; - } - return {SUCCESS, 0}; - } - result r = scalar::base64::base64_tail_decode( - output, input, length, equalsigns, options, last_chunk_options); - if (last_chunk_options != stop_before_partial && - r.error == error_code::SUCCESS && equalsigns > 0) { - // additional checks - if ((r.count % 3 == 0) || ((r.count % 3) + 1 + equalsigns != 4)) { - return {INVALID_BASE64_CHARACTER, equallocation}; - } - } - return r; -} +} // namespace utf8_validation +} // unnamed namespace +} // namespace haswell +} // namespace simdutf +/* end file src/generic/utf8_validation/utf8_validator.h */ +// transcoding from UTF-8 to UTF-16 +/* begin file src/generic/utf8_to_utf16/valid_utf8_to_utf16.h */ -simdutf_warn_unused full_result implementation::base64_to_binary_details( - const char16_t *input, size_t length, char *output, base64_options options, - last_chunk_handling_options last_chunk_options) const noexcept { - while (length > 0 && - scalar::base64::is_ascii_white_space(input[length - 1])) { - length--; - } - size_t equallocation = - length; // location of the first padding character if any - size_t equalsigns = 0; - if (length > 0 && input[length - 1] == '=') { - equallocation = length - 1; - length -= 1; - equalsigns++; - while (length > 0 && - scalar::base64::is_ascii_white_space(input[length - 1])) { - length--; - } - if (length > 0 && input[length - 1] == '=') { - equallocation = length - 1; - equalsigns++; - length -= 1; - } - } - if (length == 0) { - if (equalsigns > 0) { - return {INVALID_BASE64_CHARACTER, equallocation, 0}; - } - return {SUCCESS, 0, 0}; - } - full_result r = scalar::base64::base64_tail_decode( - output, input, length, equalsigns, options, last_chunk_options); - if (last_chunk_options != stop_before_partial && - r.error == error_code::SUCCESS && equalsigns > 0) { - // additional checks - if ((r.output_count % 3 == 0) || - ((r.output_count % 3) + 1 + equalsigns != 4)) { - return {INVALID_BASE64_CHARACTER, equallocation, r.output_count}; +namespace simdutf { +namespace haswell { +namespace { +namespace utf8_to_utf16 { + +using namespace simd; + +template +simdutf_warn_unused size_t convert_valid(const char *input, size_t size, + char16_t *utf16_output) noexcept { + // The implementation is not specific to haswell and should be moved to the + // generic directory. + size_t pos = 0; + char16_t *start{utf16_output}; + const size_t safety_margin = 16; // to avoid overruns! + while (pos + 64 + safety_margin <= size) { + // this loop could be unrolled further. For example, we could process the + // mask far more than 64 bytes. + simd8x64 in(reinterpret_cast(input + pos)); + if (in.is_ascii()) { + in.store_ascii_as_utf16(utf16_output); + utf16_output += 64; + pos += 64; + } else { + // Slow path. We hope that the compiler will recognize that this is a slow + // path. Anything that is not a continuation mask is a 'leading byte', + // that is, the start of a new code point. + uint64_t utf8_continuation_mask = in.lt(-65 + 1); + // -65 is 0b10111111 in two-complement's, so largest possible continuation + // byte + uint64_t utf8_leading_mask = ~utf8_continuation_mask; + // The *start* of code points is not so useful, rather, we want the *end* + // of code points. + uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; + // We process in blocks of up to 12 bytes except possibly + // for fast paths which may process up to 16 bytes. For the + // slow path to work, we should have at least 12 input bytes left. + size_t max_starting_point = (pos + 64) - 12; + // Next loop is going to run at least five times when using solely + // the slow/regular path, and at least four times if there are fast paths. + while (pos < max_starting_point) { + // Performance note: our ability to compute 'consumed' and + // then shift and recompute is critical. If there is a + // latency of, say, 4 cycles on getting 'consumed', then + // the inner loop might have a total latency of about 6 cycles. + // Yet we process between 6 to 12 inputs bytes, thus we get + // a speed limit between 1 cycle/byte and 0.5 cycle/byte + // for this section of the code. Hence, there is a limit + // to how much we can further increase this latency before + // it seriously harms performance. + // + // Thus we may allow convert_masked_utf8_to_utf16 to process + // more bytes at a time under a fast-path mode where 16 bytes + // are consumed at once (e.g., when encountering ASCII). + size_t consumed = convert_masked_utf8_to_utf16( + input + pos, utf8_end_of_code_point_mask, utf16_output); + pos += consumed; + utf8_end_of_code_point_mask >>= consumed; + } + // At this point there may remain between 0 and 12 bytes in the + // 64-byte block. These bytes will be processed again. So we have an + // 80% efficiency (in the worst case). In practice we expect an + // 85% to 90% efficiency. } } - return r; -} - -simdutf_warn_unused size_t implementation::base64_length_from_binary( - size_t length, base64_options options) const noexcept { - return scalar::base64::base64_length_from_binary(length, options); + utf16_output += scalar::utf8_to_utf16::convert_valid( + input + pos, size - pos, utf16_output); + return utf16_output - start; } -size_t implementation::binary_to_base64(const char *input, size_t length, - char *output, - base64_options options) const noexcept { - return scalar::base64::tail_encode_base64(output, input, length, options); -} -} // namespace fallback +} // namespace utf8_to_utf16 +} // unnamed namespace +} // namespace haswell } // namespace simdutf +/* end file src/generic/utf8_to_utf16/valid_utf8_to_utf16.h */ +/* begin file src/generic/utf8_to_utf16/utf8_to_utf16.h */ -/* begin file src/simdutf/fallback/end.h */ -/* end file src/simdutf/fallback/end.h */ -/* end file src/fallback/implementation.cpp */ -#endif -#if SIMDUTF_IMPLEMENTATION_ICELAKE -/* begin file src/icelake/implementation.cpp */ +namespace simdutf { +namespace haswell { +namespace { +namespace utf8_to_utf16 { +using namespace simd; +simdutf_really_inline simd8 +check_special_cases(const simd8 input, const simd8 prev1) { + // Bit 0 = Too Short (lead byte/ASCII followed by lead byte/ASCII) + // Bit 1 = Too Long (ASCII followed by continuation) + // Bit 2 = Overlong 3-byte + // Bit 4 = Surrogate + // Bit 5 = Overlong 2-byte + // Bit 7 = Two Continuations + constexpr const uint8_t TOO_SHORT = 1 << 0; // 11______ 0_______ + // 11______ 11______ + constexpr const uint8_t TOO_LONG = 1 << 1; // 0_______ 10______ + constexpr const uint8_t OVERLONG_3 = 1 << 2; // 11100000 100_____ + constexpr const uint8_t SURROGATE = 1 << 4; // 11101101 101_____ + constexpr const uint8_t OVERLONG_2 = 1 << 5; // 1100000_ 10______ + constexpr const uint8_t TWO_CONTS = 1 << 7; // 10______ 10______ + constexpr const uint8_t TOO_LARGE = 1 << 3; // 11110100 1001____ + // 11110100 101_____ + // 11110101 1001____ + // 11110101 101_____ + // 1111011_ 1001____ + // 1111011_ 101_____ + // 11111___ 1001____ + // 11111___ 101_____ + constexpr const uint8_t TOO_LARGE_1000 = 1 << 6; + // 11110101 1000____ + // 1111011_ 1000____ + // 11111___ 1000____ + constexpr const uint8_t OVERLONG_4 = 1 << 6; // 11110000 1000____ -/* begin file src/simdutf/icelake/begin.h */ -// redefining SIMDUTF_IMPLEMENTATION to "icelake" -// #define SIMDUTF_IMPLEMENTATION icelake + const simd8 byte_1_high = prev1.shr<4>().lookup_16( + // 0_______ ________ + TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, + TOO_LONG, + // 10______ ________ + TWO_CONTS, TWO_CONTS, TWO_CONTS, TWO_CONTS, + // 1100____ ________ + TOO_SHORT | OVERLONG_2, + // 1101____ ________ + TOO_SHORT, + // 1110____ ________ + TOO_SHORT | OVERLONG_3 | SURROGATE, + // 1111____ ________ + TOO_SHORT | TOO_LARGE | TOO_LARGE_1000 | OVERLONG_4); + constexpr const uint8_t CARRY = + TOO_SHORT | TOO_LONG | TWO_CONTS; // These all have ____ in byte 1 . + const simd8 byte_1_low = + (prev1 & 0x0F) + .lookup_16( + // ____0000 ________ + CARRY | OVERLONG_3 | OVERLONG_2 | OVERLONG_4, + // ____0001 ________ + CARRY | OVERLONG_2, + // ____001_ ________ + CARRY, CARRY, -#if SIMDUTF_CAN_ALWAYS_RUN_ICELAKE -// nothing needed. -#else -SIMDUTF_TARGET_ICELAKE -#endif + // ____0100 ________ + CARRY | TOO_LARGE, + // ____0101 ________ + CARRY | TOO_LARGE | TOO_LARGE_1000, + // ____011_ ________ + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, -#if SIMDUTF_GCC11ORMORE // workaround for - // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105593 -// clang-format off -SIMDUTF_DISABLE_GCC_WARNING(-Wmaybe-uninitialized) -// clang-format on -#endif // end of workaround -/* end file src/simdutf/icelake/begin.h */ -namespace simdutf { -namespace icelake { -namespace { -#ifndef SIMDUTF_ICELAKE_H - #error "icelake.h must be included" -#endif -/* begin file src/icelake/icelake_utf8_common.inl.cpp */ -// Common procedures for both validating and non-validating conversions from -// UTF-8. -enum block_processing_mode { SIMDUTF_FULL, SIMDUTF_TAIL }; + // ____1___ ________ + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + // ____1101 ________ + CARRY | TOO_LARGE | TOO_LARGE_1000 | SURROGATE, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000); + const simd8 byte_2_high = input.shr<4>().lookup_16( + // ________ 0_______ + TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, + TOO_SHORT, TOO_SHORT, -using utf8_to_utf16_result = std::pair; -using utf8_to_utf32_result = std::pair; + // ________ 1000____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE_1000 | + OVERLONG_4, + // ________ 1001____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE, + // ________ 101_____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, + TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, -/* - process_block_utf8_to_utf16 converts up to 64 bytes from 'in' from UTF-8 - to UTF-16. When tail = SIMDUTF_FULL, then the full input buffer (64 bytes) - might be used. When tail = SIMDUTF_TAIL, we take into account 'gap' which - indicates how many input bytes are relevant. + // ________ 11______ + TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT); + return (byte_1_high & byte_1_low & byte_2_high); +} +simdutf_really_inline simd8 +check_multibyte_lengths(const simd8 input, + const simd8 prev_input, + const simd8 sc) { + simd8 prev2 = input.prev<2>(prev_input); + simd8 prev3 = input.prev<3>(prev_input); + simd8 must23 = + simd8(must_be_2_3_continuation(prev2, prev3)); + simd8 must23_80 = must23 & uint8_t(0x80); + return must23_80 ^ sc; +} - Returns true when the result is correct, otherwise it returns false. +struct validating_transcoder { + // If this is nonzero, there has been a UTF-8 error. + simd8 error; - The provided in and out pointers are advanced according to how many input - bytes have been processed, upon success. -*/ -template -simdutf_really_inline bool -process_block_utf8_to_utf16(const char *&in, char16_t *&out, size_t gap) { - // constants - __m512i mask_identity = _mm512_set_epi8( - 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, - 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, - 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, - 8, 7, 6, 5, 4, 3, 2, 1, 0); - __m512i mask_c0c0c0c0 = _mm512_set1_epi32(0xc0c0c0c0); - __m512i mask_80808080 = _mm512_set1_epi32(0x80808080); - __m512i mask_f0f0f0f0 = _mm512_set1_epi32(0xf0f0f0f0); - __m512i mask_dfdfdfdf_tail = _mm512_set_epi64( - 0xffffdfdfdfdfdfdf, 0xdfdfdfdfdfdfdfdf, 0xdfdfdfdfdfdfdfdf, - 0xdfdfdfdfdfdfdfdf, 0xdfdfdfdfdfdfdfdf, 0xdfdfdfdfdfdfdfdf, - 0xdfdfdfdfdfdfdfdf, 0xdfdfdfdfdfdfdfdf); - __m512i mask_c2c2c2c2 = _mm512_set1_epi32(0xc2c2c2c2); - __m512i mask_ffffffff = _mm512_set1_epi32(0xffffffff); - __m512i mask_d7c0d7c0 = _mm512_set1_epi32(0xd7c0d7c0); - __m512i mask_dc00dc00 = _mm512_set1_epi32(0xdc00dc00); - __m512i byteflip = _mm512_setr_epi64(0x0607040502030001, 0x0e0f0c0d0a0b0809, - 0x0607040502030001, 0x0e0f0c0d0a0b0809, - 0x0607040502030001, 0x0e0f0c0d0a0b0809, - 0x0607040502030001, 0x0e0f0c0d0a0b0809); - // Note that 'tail' is a compile-time constant ! - __mmask64 b = - (tail == SIMDUTF_FULL) ? 0xFFFFFFFFFFFFFFFF : (uint64_t(1) << gap) - 1; - __m512i input = (tail == SIMDUTF_FULL) ? _mm512_loadu_si512(in) - : _mm512_maskz_loadu_epi8(b, in); - __mmask64 m1 = (tail == SIMDUTF_FULL) - ? _mm512_cmplt_epu8_mask(input, mask_80808080) - : _mm512_mask_cmplt_epu8_mask(b, input, mask_80808080); - if (_ktestc_mask64_u8(m1, - b)) { // NOT(m1) AND b -- if all zeroes, then all ASCII - // alternatively, we could do 'if (m1 == b) { ' - if (tail == SIMDUTF_FULL) { - in += 64; // consumed 64 bytes - // we convert a full 64-byte block, writing 128 bytes. - __m512i input1 = _mm512_cvtepu8_epi16(_mm512_castsi512_si256(input)); - if (big_endian) { - input1 = _mm512_shuffle_epi8(input1, byteflip); + validating_transcoder() : error(uint8_t(0)) {} + // + // Check whether the current bytes are valid UTF-8. + // + simdutf_really_inline void check_utf8_bytes(const simd8 input, + const simd8 prev_input) { + // Flip prev1...prev3 so we can easily determine if they are 2+, 3+ or 4+ + // lead bytes (2, 3, 4-byte leads become large positive numbers instead of + // small negative numbers) + simd8 prev1 = input.prev<1>(prev_input); + simd8 sc = check_special_cases(input, prev1); + this->error |= check_multibyte_lengths(input, prev_input, sc); + } + + template + simdutf_really_inline size_t convert(const char *in, size_t size, + char16_t *utf16_output) { + size_t pos = 0; + char16_t *start{utf16_output}; + // In the worst case, we have the haswell kernel which can cause an overflow + // of 8 bytes when calling convert_masked_utf8_to_utf16. If you skip the + // last 16 bytes, and if the data is valid, then it is entirely safe because + // 16 UTF-8 bytes generate much more than 8 bytes. However, you cannot + // generally assume that you have valid UTF-8 input, so we are going to go + // back from the end counting 8 leading bytes, to give us a good margin. + size_t leading_byte = 0; + size_t margin = size; + for (; margin > 0 && leading_byte < 8; margin--) { + leading_byte += (int8_t(in[margin - 1]) > -65); + } + // If the input is long enough, then we have that margin-1 is the eight last + // leading byte. + const size_t safety_margin = size - margin + 1; // to avoid overruns! + while (pos + 64 + safety_margin <= size) { + simd8x64 input(reinterpret_cast(in + pos)); + if (input.is_ascii()) { + input.store_ascii_as_utf16(utf16_output); + utf16_output += 64; + pos += 64; + } else { + // you might think that a for-loop would work, but under Visual Studio, + // it is not good enough. + static_assert( + (simd8x64::NUM_CHUNKS == 2) || + (simd8x64::NUM_CHUNKS == 4), + "We support either two or four chunks per 64-byte block."); + auto zero = simd8{uint8_t(0)}; + if (simd8x64::NUM_CHUNKS == 2) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + } else if (simd8x64::NUM_CHUNKS == 4) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + this->check_utf8_bytes(input.chunks[2], input.chunks[1]); + this->check_utf8_bytes(input.chunks[3], input.chunks[2]); + } + uint64_t utf8_continuation_mask = input.lt(-65 + 1); + if (utf8_continuation_mask & 1) { + return 0; // error + } + uint64_t utf8_leading_mask = ~utf8_continuation_mask; + uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; + // We process in blocks of up to 12 bytes except possibly + // for fast paths which may process up to 16 bytes. For the + // slow path to work, we should have at least 12 input bytes left. + size_t max_starting_point = (pos + 64) - 12; + // Next loop is going to run at least five times. + while (pos < max_starting_point) { + // Performance note: our ability to compute 'consumed' and + // then shift and recompute is critical. If there is a + // latency of, say, 4 cycles on getting 'consumed', then + // the inner loop might have a total latency of about 6 cycles. + // Yet we process between 6 to 12 inputs bytes, thus we get + // a speed limit between 1 cycle/byte and 0.5 cycle/byte + // for this section of the code. Hence, there is a limit + // to how much we can further increase this latency before + // it seriously harms performance. + size_t consumed = convert_masked_utf8_to_utf16( + in + pos, utf8_end_of_code_point_mask, utf16_output); + pos += consumed; + utf8_end_of_code_point_mask >>= consumed; + } + // At this point there may remain between 0 and 12 bytes in the + // 64-byte block. These bytes will be processed again. So we have an + // 80% efficiency (in the worst case). In practice we expect an + // 85% to 90% efficiency. } - _mm512_storeu_si512(out, input1); - out += 32; - __m512i input2 = - _mm512_cvtepu8_epi16(_mm512_extracti64x4_epi64(input, 1)); - if (big_endian) { - input2 = _mm512_shuffle_epi8(input2, byteflip); + } + if (errors()) { + return 0; + } + if (pos < size) { + size_t howmany = scalar::utf8_to_utf16::convert( + in + pos, size - pos, utf16_output); + if (howmany == 0) { + return 0; } - _mm512_storeu_si512(out, input2); - out += 32; - return true; // we are done - } else { - in += gap; - if (gap <= 32) { - __m512i input1 = _mm512_cvtepu8_epi16(_mm512_castsi512_si256(input)); - if (big_endian) { - input1 = _mm512_shuffle_epi8(input1, byteflip); - } - _mm512_mask_storeu_epi16(out, __mmask32((uint64_t(1) << (gap)) - 1), - input1); - out += gap; + utf16_output += howmany; + } + return utf16_output - start; + } + + template + simdutf_really_inline result convert_with_errors(const char *in, size_t size, + char16_t *utf16_output) { + size_t pos = 0; + char16_t *start{utf16_output}; + // In the worst case, we have the haswell kernel which can cause an overflow + // of 8 bytes when calling convert_masked_utf8_to_utf16. If you skip the + // last 16 bytes, and if the data is valid, then it is entirely safe because + // 16 UTF-8 bytes generate much more than 8 bytes. However, you cannot + // generally assume that you have valid UTF-8 input, so we are going to go + // back from the end counting 8 leading bytes, to give us a good margin. + size_t leading_byte = 0; + size_t margin = size; + for (; margin > 0 && leading_byte < 8; margin--) { + leading_byte += (int8_t(in[margin - 1]) > -65); + } + // If the input is long enough, then we have that margin-1 is the eight last + // leading byte. + const size_t safety_margin = size - margin + 1; // to avoid overruns! + while (pos + 64 + safety_margin <= size) { + simd8x64 input(reinterpret_cast(in + pos)); + if (input.is_ascii()) { + input.store_ascii_as_utf16(utf16_output); + utf16_output += 64; + pos += 64; } else { - __m512i input1 = _mm512_cvtepu8_epi16(_mm512_castsi512_si256(input)); - if (big_endian) { - input1 = _mm512_shuffle_epi8(input1, byteflip); + // you might think that a for-loop would work, but under Visual Studio, + // it is not good enough. + static_assert( + (simd8x64::NUM_CHUNKS == 2) || + (simd8x64::NUM_CHUNKS == 4), + "We support either two or four chunks per 64-byte block."); + auto zero = simd8{uint8_t(0)}; + if (simd8x64::NUM_CHUNKS == 2) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + } else if (simd8x64::NUM_CHUNKS == 4) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + this->check_utf8_bytes(input.chunks[2], input.chunks[1]); + this->check_utf8_bytes(input.chunks[3], input.chunks[2]); } - _mm512_storeu_si512(out, input1); - out += 32; - __m512i input2 = - _mm512_cvtepu8_epi16(_mm512_extracti64x4_epi64(input, 1)); - if (big_endian) { - input2 = _mm512_shuffle_epi8(input2, byteflip); + uint64_t utf8_continuation_mask = input.lt(-65 + 1); + if (errors() || (utf8_continuation_mask & 1)) { + // rewind_and_convert_with_errors will seek a potential error from + // in+pos onward, with the ability to go back up to pos bytes, and + // read size-pos bytes forward. + result res = + scalar::utf8_to_utf16::rewind_and_convert_with_errors( + pos, in + pos, size - pos, utf16_output); + res.count += pos; + return res; } - _mm512_mask_storeu_epi16( - out, __mmask32((uint32_t(1) << (gap - 32)) - 1), input2); - out += gap - 32; + uint64_t utf8_leading_mask = ~utf8_continuation_mask; + uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; + // We process in blocks of up to 12 bytes except possibly + // for fast paths which may process up to 16 bytes. For the + // slow path to work, we should have at least 12 input bytes left. + size_t max_starting_point = (pos + 64) - 12; + // Next loop is going to run at least five times. + while (pos < max_starting_point) { + // Performance note: our ability to compute 'consumed' and + // then shift and recompute is critical. If there is a + // latency of, say, 4 cycles on getting 'consumed', then + // the inner loop might have a total latency of about 6 cycles. + // Yet we process between 6 to 12 inputs bytes, thus we get + // a speed limit between 1 cycle/byte and 0.5 cycle/byte + // for this section of the code. Hence, there is a limit + // to how much we can further increase this latency before + // it seriously harms performance. + size_t consumed = convert_masked_utf8_to_utf16( + in + pos, utf8_end_of_code_point_mask, utf16_output); + pos += consumed; + utf8_end_of_code_point_mask >>= consumed; + } + // At this point there may remain between 0 and 12 bytes in the + // 64-byte block. These bytes will be processed again. So we have an + // 80% efficiency (in the worst case). In practice we expect an + // 85% to 90% efficiency. + } + } + if (errors()) { + // rewind_and_convert_with_errors will seek a potential error from in+pos + // onward, with the ability to go back up to pos bytes, and read size-pos + // bytes forward. + result res = + scalar::utf8_to_utf16::rewind_and_convert_with_errors( + pos, in + pos, size - pos, utf16_output); + res.count += pos; + return res; + } + if (pos < size) { + // rewind_and_convert_with_errors will seek a potential error from in+pos + // onward, with the ability to go back up to pos bytes, and read size-pos + // bytes forward. + result res = + scalar::utf8_to_utf16::rewind_and_convert_with_errors( + pos, in + pos, size - pos, utf16_output); + if (res.error) { // In case of error, we want the error position + res.count += pos; + return res; + } else { // In case of success, we want the number of word written + utf16_output += res.count; } - return true; // we are done } + return result(error_code::SUCCESS, utf16_output - start); } - // classify characters further - __mmask64 m234 = _mm512_cmp_epu8_mask( - mask_c0c0c0c0, input, - _MM_CMPINT_LE); // 0xc0 <= input, 2, 3, or 4 leading byte - __mmask64 m34 = - _mm512_cmp_epu8_mask(mask_dfdfdfdf_tail, input, - _MM_CMPINT_LT); // 0xdf < input, 3 or 4 leading byte - __mmask64 milltwobytes = _mm512_mask_cmp_epu8_mask( - m234, input, mask_c2c2c2c2, - _MM_CMPINT_LT); // 0xc0 <= input < 0xc2 (illegal two byte sequence) - // Overlong 2-byte sequence - if (_ktestz_mask64_u8(milltwobytes, milltwobytes) == 0) { - // Overlong 2-byte sequence - return false; + simdutf_really_inline bool errors() const { + return this->error.any_bits_set_anywhere(); } - if (_ktestz_mask64_u8(m34, m34) == 0) { - // We have a 3-byte sequence and/or a 2-byte sequence, or possibly even a - // 4-byte sequence! - __mmask64 m4 = _mm512_cmp_epu8_mask( - input, mask_f0f0f0f0, - _MM_CMPINT_NLT); // 0xf0 <= zmm0 (4 byte start bytes) - __mmask64 mask_not_ascii = (tail == SIMDUTF_FULL) - ? _knot_mask64(m1) - : _kand_mask64(_knot_mask64(m1), b); +}; // struct utf8_checker +} // namespace utf8_to_utf16 +} // unnamed namespace +} // namespace haswell +} // namespace simdutf +/* end file src/generic/utf8_to_utf16/utf8_to_utf16.h */ +// transcoding from UTF-8 to UTF-32 +/* begin file src/generic/utf8_to_utf32/valid_utf8_to_utf32.h */ - __mmask64 mp1 = _kshiftli_mask64(m234, 1); - __mmask64 mp2 = _kshiftli_mask64(m34, 2); - // We could do it as follows... - // if (_kortestz_mask64_u8(m4,m4)) { // compute the bitwise OR of the 64-bit - // masks a and b and return 1 if all zeroes but GCC generates better code - // when we do: - if (m4 == 0) { // compute the bitwise OR of the 64-bit masks a and b and - // return 1 if all zeroes - // Fast path with 1,2,3 bytes - __mmask64 mc = _kor_mask64(mp1, mp2); // expected continuation bytes - __mmask64 m1234 = _kor_mask64(m1, m234); - // mismatched continuation bytes: - if (tail == SIMDUTF_FULL) { - __mmask64 xnormcm1234 = _kxnor_mask64( - mc, - m1234); // XNOR of mc and m1234 should be all zero if they differ - // the presence of a 1 bit indicates that they overlap. - // _kortestz_mask64_u8: compute the bitwise OR of 64-bit masksand return - // 1 if all zeroes. - if (!_kortestz_mask64_u8(xnormcm1234, xnormcm1234)) { - return false; - } - } else { - __mmask64 bxorm1234 = _kxor_mask64(b, m1234); - if (mc != bxorm1234) { - return false; - } - } - // mend: identifying the last bytes of each sequence to be decoded - __mmask64 mend = _kshiftri_mask64(m1234, 1); - if (tail != SIMDUTF_FULL) { - mend = _kor_mask64(mend, (uint64_t(1) << (gap - 1))); +namespace simdutf { +namespace haswell { +namespace { +namespace utf8_to_utf32 { + +using namespace simd; + +simdutf_warn_unused size_t convert_valid(const char *input, size_t size, + char32_t *utf32_output) noexcept { + size_t pos = 0; + char32_t *start{utf32_output}; + const size_t safety_margin = 16; // to avoid overruns! + while (pos + 64 + safety_margin <= size) { + simd8x64 in(reinterpret_cast(input + pos)); + if (in.is_ascii()) { + in.store_ascii_as_utf32(utf32_output); + utf32_output += 64; + pos += 64; + } else { + // -65 is 0b10111111 in two-complement's, so largest possible continuation + // byte + uint64_t utf8_continuation_mask = in.lt(-65 + 1); + uint64_t utf8_leading_mask = ~utf8_continuation_mask; + uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; + size_t max_starting_point = (pos + 64) - 12; + while (pos < max_starting_point) { + size_t consumed = convert_masked_utf8_to_utf32( + input + pos, utf8_end_of_code_point_mask, utf32_output); + pos += consumed; + utf8_end_of_code_point_mask >>= consumed; } + } + } + utf32_output += scalar::utf8_to_utf32::convert_valid(input + pos, size - pos, + utf32_output); + return utf32_output - start; +} - __m512i last_and_third = _mm512_maskz_compress_epi8(mend, mask_identity); - __m512i last_and_thirdu16 = - _mm512_cvtepu8_epi16(_mm512_castsi512_si256(last_and_third)); +} // namespace utf8_to_utf32 +} // unnamed namespace +} // namespace haswell +} // namespace simdutf +/* end file src/generic/utf8_to_utf32/valid_utf8_to_utf32.h */ +/* begin file src/generic/utf8_to_utf32/utf8_to_utf32.h */ - __m512i nonasciitags = _mm512_maskz_mov_epi8( - mask_not_ascii, mask_c0c0c0c0); // ASCII: 00000000 other: 11000000 - __m512i clearedbytes = _mm512_andnot_si512( - nonasciitags, input); // high two bits cleared where not ASCII - __m512i lastbytes = _mm512_maskz_permutexvar_epi8( - 0x5555555555555555, last_and_thirdu16, - clearedbytes); // the last byte of each character +namespace simdutf { +namespace haswell { +namespace { +namespace utf8_to_utf32 { +using namespace simd; - __mmask64 mask_before_non_ascii = _kshiftri_mask64( - mask_not_ascii, 1); // bytes that precede non-ASCII bytes - __m512i indexofsecondlastbytes = _mm512_add_epi16( - mask_ffffffff, last_and_thirdu16); // indices of the second last bytes - __m512i beforeasciibytes = - _mm512_maskz_mov_epi8(mask_before_non_ascii, clearedbytes); - __m512i secondlastbytes = _mm512_maskz_permutexvar_epi8( - 0x5555555555555555, indexofsecondlastbytes, - beforeasciibytes); // the second last bytes (of two, three byte seq, - // surrogates) - secondlastbytes = - _mm512_slli_epi16(secondlastbytes, 6); // shifted into position +simdutf_really_inline simd8 +check_special_cases(const simd8 input, const simd8 prev1) { + // Bit 0 = Too Short (lead byte/ASCII followed by lead byte/ASCII) + // Bit 1 = Too Long (ASCII followed by continuation) + // Bit 2 = Overlong 3-byte + // Bit 4 = Surrogate + // Bit 5 = Overlong 2-byte + // Bit 7 = Two Continuations + constexpr const uint8_t TOO_SHORT = 1 << 0; // 11______ 0_______ + // 11______ 11______ + constexpr const uint8_t TOO_LONG = 1 << 1; // 0_______ 10______ + constexpr const uint8_t OVERLONG_3 = 1 << 2; // 11100000 100_____ + constexpr const uint8_t SURROGATE = 1 << 4; // 11101101 101_____ + constexpr const uint8_t OVERLONG_2 = 1 << 5; // 1100000_ 10______ + constexpr const uint8_t TWO_CONTS = 1 << 7; // 10______ 10______ + constexpr const uint8_t TOO_LARGE = 1 << 3; // 11110100 1001____ + // 11110100 101_____ + // 11110101 1001____ + // 11110101 101_____ + // 1111011_ 1001____ + // 1111011_ 101_____ + // 11111___ 1001____ + // 11111___ 101_____ + constexpr const uint8_t TOO_LARGE_1000 = 1 << 6; + // 11110101 1000____ + // 1111011_ 1000____ + // 11111___ 1000____ + constexpr const uint8_t OVERLONG_4 = 1 << 6; // 11110000 1000____ - __m512i indexofthirdlastbytes = _mm512_add_epi16( - mask_ffffffff, - indexofsecondlastbytes); // indices of the second last bytes - __m512i thirdlastbyte = - _mm512_maskz_mov_epi8(m34, - clearedbytes); // only those that are the third - // last byte of a sequence - __m512i thirdlastbytes = _mm512_maskz_permutexvar_epi8( - 0x5555555555555555, indexofthirdlastbytes, - thirdlastbyte); // the third last bytes (of three byte sequences, hi - // surrogate) - thirdlastbytes = - _mm512_slli_epi16(thirdlastbytes, 12); // shifted into position - __m512i Wout = _mm512_ternarylogic_epi32(lastbytes, secondlastbytes, - thirdlastbytes, 254); - // the elements of Wout excluding the last element if it happens to be a - // high surrogate: + const simd8 byte_1_high = prev1.shr<4>().lookup_16( + // 0_______ ________ + TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, + TOO_LONG, + // 10______ ________ + TWO_CONTS, TWO_CONTS, TWO_CONTS, TWO_CONTS, + // 1100____ ________ + TOO_SHORT | OVERLONG_2, + // 1101____ ________ + TOO_SHORT, + // 1110____ ________ + TOO_SHORT | OVERLONG_3 | SURROGATE, + // 1111____ ________ + TOO_SHORT | TOO_LARGE | TOO_LARGE_1000 | OVERLONG_4); + constexpr const uint8_t CARRY = + TOO_SHORT | TOO_LONG | TWO_CONTS; // These all have ____ in byte 1 . + const simd8 byte_1_low = + (prev1 & 0x0F) + .lookup_16( + // ____0000 ________ + CARRY | OVERLONG_3 | OVERLONG_2 | OVERLONG_4, + // ____0001 ________ + CARRY | OVERLONG_2, + // ____001_ ________ + CARRY, CARRY, - __mmask64 mprocessed = - (tail == SIMDUTF_FULL) - ? _pdep_u64(0xFFFFFFFF, mend) - : _pdep_u64( - 0xFFFFFFFF, - _kand_mask64( - mend, b)); // we adjust mend at the end of the output. + // ____0100 ________ + CARRY | TOO_LARGE, + // ____0101 ________ + CARRY | TOO_LARGE | TOO_LARGE_1000, + // ____011_ ________ + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, - // Encodings out of range... - { - // the location of 3-byte sequence start bytes in the input - __mmask64 m3 = m34 & (b ^ m4); - // code units in Wout corresponding to 3-byte sequences. - __mmask32 M3 = __mmask32(_pext_u64(m3 << 2, mend)); - __m512i mask_08000800 = _mm512_set1_epi32(0x08000800); - __mmask32 Msmall800 = - _mm512_mask_cmplt_epu16_mask(M3, Wout, mask_08000800); - __m512i mask_d800d800 = _mm512_set1_epi32(0xd800d800); - __m512i Moutminusd800 = _mm512_sub_epi16(Wout, mask_d800d800); - __mmask32 M3s = - _mm512_mask_cmplt_epu16_mask(M3, Moutminusd800, mask_08000800); - if (_kor_mask32(Msmall800, M3s)) { - return false; - } - } - int64_t nout = _mm_popcnt_u64(mprocessed); - in += 64 - _lzcnt_u64(mprocessed); - if (big_endian) { - Wout = _mm512_shuffle_epi8(Wout, byteflip); - } - _mm512_mask_storeu_epi16(out, __mmask32((uint64_t(1) << nout) - 1), Wout); - out += nout; - return true; // ok - } - // - // We have a 4-byte sequence, this is the general case. - // Slow! - __mmask64 mp3 = _kshiftli_mask64(m4, 3); - __mmask64 mc = - _kor_mask64(_kor_mask64(mp1, mp2), mp3); // expected continuation bytes - __mmask64 m1234 = _kor_mask64(m1, m234); + // ____1___ ________ + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + // ____1101 ________ + CARRY | TOO_LARGE | TOO_LARGE_1000 | SURROGATE, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000); + const simd8 byte_2_high = input.shr<4>().lookup_16( + // ________ 0_______ + TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, + TOO_SHORT, TOO_SHORT, - // mend: identifying the last bytes of each sequence to be decoded - __mmask64 mend = - _kor_mask64(_kshiftri_mask64(_kor_mask64(mp3, m1234), 1), mp3); - if (tail != SIMDUTF_FULL) { - mend = _kor_mask64(mend, __mmask64(uint64_t(1) << (gap - 1))); - } - __m512i last_and_third = _mm512_maskz_compress_epi8(mend, mask_identity); - __m512i last_and_thirdu16 = - _mm512_cvtepu8_epi16(_mm512_castsi512_si256(last_and_third)); + // ________ 1000____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE_1000 | + OVERLONG_4, + // ________ 1001____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE, + // ________ 101_____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, + TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, - __m512i nonasciitags = _mm512_maskz_mov_epi8( - mask_not_ascii, mask_c0c0c0c0); // ASCII: 00000000 other: 11000000 - __m512i clearedbytes = _mm512_andnot_si512( - nonasciitags, input); // high two bits cleared where not ASCII - __m512i lastbytes = _mm512_maskz_permutexvar_epi8( - 0x5555555555555555, last_and_thirdu16, - clearedbytes); // the last byte of each character + // ________ 11______ + TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT); + return (byte_1_high & byte_1_low & byte_2_high); +} +simdutf_really_inline simd8 +check_multibyte_lengths(const simd8 input, + const simd8 prev_input, + const simd8 sc) { + simd8 prev2 = input.prev<2>(prev_input); + simd8 prev3 = input.prev<3>(prev_input); + simd8 must23 = + simd8(must_be_2_3_continuation(prev2, prev3)); + simd8 must23_80 = must23 & uint8_t(0x80); + return must23_80 ^ sc; +} - __mmask64 mask_before_non_ascii = _kshiftri_mask64( - mask_not_ascii, 1); // bytes that precede non-ASCII bytes - __m512i indexofsecondlastbytes = _mm512_add_epi16( - mask_ffffffff, last_and_thirdu16); // indices of the second last bytes - __m512i beforeasciibytes = - _mm512_maskz_mov_epi8(mask_before_non_ascii, clearedbytes); - __m512i secondlastbytes = _mm512_maskz_permutexvar_epi8( - 0x5555555555555555, indexofsecondlastbytes, - beforeasciibytes); // the second last bytes (of two, three byte seq, - // surrogates) - secondlastbytes = - _mm512_slli_epi16(secondlastbytes, 6); // shifted into position +struct validating_transcoder { + // If this is nonzero, there has been a UTF-8 error. + simd8 error; - __m512i indexofthirdlastbytes = _mm512_add_epi16( - mask_ffffffff, - indexofsecondlastbytes); // indices of the second last bytes - __m512i thirdlastbyte = _mm512_maskz_mov_epi8( - m34, - clearedbytes); // only those that are the third last byte of a sequence - __m512i thirdlastbytes = _mm512_maskz_permutexvar_epi8( - 0x5555555555555555, indexofthirdlastbytes, - thirdlastbyte); // the third last bytes (of three byte sequences, hi - // surrogate) - thirdlastbytes = - _mm512_slli_epi16(thirdlastbytes, 12); // shifted into position - __m512i thirdsecondandlastbytes = _mm512_ternarylogic_epi32( - lastbytes, secondlastbytes, thirdlastbytes, 254); - uint64_t Mlo_uint64 = _pext_u64(mp3, mend); - __mmask32 Mlo = __mmask32(Mlo_uint64); - __mmask32 Mhi = __mmask32(Mlo_uint64 >> 1); - __m512i lo_surr_mask = _mm512_maskz_mov_epi16( - Mlo, - mask_dc00dc00); // lo surr: 1101110000000000, other: 0000000000000000 - __m512i shifted4_thirdsecondandlastbytes = - _mm512_srli_epi16(thirdsecondandlastbytes, - 4); // hi surr: 00000WVUTSRQPNML vuts = WVUTS - 1 - __m512i tagged_lo_surrogates = _mm512_or_si512( - thirdsecondandlastbytes, - lo_surr_mask); // lo surr: 110111KJHGFEDCBA, other: unchanged - __m512i Wout = _mm512_mask_add_epi16( - tagged_lo_surrogates, Mhi, shifted4_thirdsecondandlastbytes, - mask_d7c0d7c0); // hi sur: 110110vutsRQPNML, other: unchanged - // the elements of Wout excluding the last element if it happens to be a - // high surrogate: - __mmask32 Mout = ~(Mhi & 0x80000000); - __mmask64 mprocessed = - (tail == SIMDUTF_FULL) - ? _pdep_u64(Mout, mend) - : _pdep_u64( - Mout, - _kand_mask64(mend, - b)); // we adjust mend at the end of the output. + validating_transcoder() : error(uint8_t(0)) {} + // + // Check whether the current bytes are valid UTF-8. + // + simdutf_really_inline void check_utf8_bytes(const simd8 input, + const simd8 prev_input) { + // Flip prev1...prev3 so we can easily determine if they are 2+, 3+ or 4+ + // lead bytes (2, 3, 4-byte leads become large positive numbers instead of + // small negative numbers) + simd8 prev1 = input.prev<1>(prev_input); + simd8 sc = check_special_cases(input, prev1); + this->error |= check_multibyte_lengths(input, prev_input, sc); + } - // mismatched continuation bytes: - if (tail == SIMDUTF_FULL) { - __mmask64 xnormcm1234 = _kxnor_mask64( - mc, m1234); // XNOR of mc and m1234 should be all zero if they differ - // the presence of a 1 bit indicates that they overlap. - // _kortestz_mask64_u8: compute the bitwise OR of 64-bit masksand return 1 - // if all zeroes. - if (!_kortestz_mask64_u8(xnormcm1234, xnormcm1234)) { - return false; - } - } else { - __mmask64 bxorm1234 = _kxor_mask64(b, m1234); - if (mc != bxorm1234) { - return false; - } + simdutf_really_inline size_t convert(const char *in, size_t size, + char32_t *utf32_output) { + size_t pos = 0; + char32_t *start{utf32_output}; + // In the worst case, we have the haswell kernel which can cause an overflow + // of 8 words when calling convert_masked_utf8_to_utf32. If you skip the + // last 16 bytes, and if the data is valid, then it is entirely safe because + // 16 UTF-8 bytes generate much more than 8 bytes. However, you cannot + // generally assume that you have valid UTF-8 input, so we are going to go + // back from the end counting 16 leading bytes, to give us a good margin. + size_t leading_byte = 0; + size_t margin = size; + for (; margin > 0 && leading_byte < 8; margin--) { + leading_byte += (int8_t(in[margin - 1]) > -65); } - // Encodings out of range... - { - // the location of 3-byte sequence start bytes in the input - __mmask64 m3 = m34 & (b ^ m4); - // code units in Wout corresponding to 3-byte sequences. - __mmask32 M3 = __mmask32(_pext_u64(m3 << 2, mend)); - __m512i mask_08000800 = _mm512_set1_epi32(0x08000800); - __mmask32 Msmall800 = - _mm512_mask_cmplt_epu16_mask(M3, Wout, mask_08000800); - __m512i mask_d800d800 = _mm512_set1_epi32(0xd800d800); - __m512i Moutminusd800 = _mm512_sub_epi16(Wout, mask_d800d800); - __mmask32 M3s = - _mm512_mask_cmplt_epu16_mask(M3, Moutminusd800, mask_08000800); - __m512i mask_04000400 = _mm512_set1_epi32(0x04000400); - __mmask32 M4s = - _mm512_mask_cmpge_epu16_mask(Mhi, Moutminusd800, mask_04000400); - if (!_kortestz_mask32_u8(M4s, _kor_mask32(Msmall800, M3s))) { - return false; + // If the input is long enough, then we have that margin-1 is the fourth + // last leading byte. + const size_t safety_margin = size - margin + 1; // to avoid overruns! + while (pos + 64 + safety_margin <= size) { + simd8x64 input(reinterpret_cast(in + pos)); + if (input.is_ascii()) { + input.store_ascii_as_utf32(utf32_output); + utf32_output += 64; + pos += 64; + } else { + // you might think that a for-loop would work, but under Visual Studio, + // it is not good enough. + static_assert( + (simd8x64::NUM_CHUNKS == 2) || + (simd8x64::NUM_CHUNKS == 4), + "We support either two or four chunks per 64-byte block."); + auto zero = simd8{uint8_t(0)}; + if (simd8x64::NUM_CHUNKS == 2) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + } else if (simd8x64::NUM_CHUNKS == 4) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + this->check_utf8_bytes(input.chunks[2], input.chunks[1]); + this->check_utf8_bytes(input.chunks[3], input.chunks[2]); + } + uint64_t utf8_continuation_mask = input.lt(-65 + 1); + if (utf8_continuation_mask & 1) { + return 0; // we have an error + } + uint64_t utf8_leading_mask = ~utf8_continuation_mask; + uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; + // We process in blocks of up to 12 bytes except possibly + // for fast paths which may process up to 16 bytes. For the + // slow path to work, we should have at least 12 input bytes left. + size_t max_starting_point = (pos + 64) - 12; + // Next loop is going to run at least five times. + while (pos < max_starting_point) { + // Performance note: our ability to compute 'consumed' and + // then shift and recompute is critical. If there is a + // latency of, say, 4 cycles on getting 'consumed', then + // the inner loop might have a total latency of about 6 cycles. + // Yet we process between 6 to 12 inputs bytes, thus we get + // a speed limit between 1 cycle/byte and 0.5 cycle/byte + // for this section of the code. Hence, there is a limit + // to how much we can further increase this latency before + // it seriously harms performance. + size_t consumed = convert_masked_utf8_to_utf32( + in + pos, utf8_end_of_code_point_mask, utf32_output); + pos += consumed; + utf8_end_of_code_point_mask >>= consumed; + } + // At this point there may remain between 0 and 12 bytes in the + // 64-byte block. These bytes will be processed again. So we have an + // 80% efficiency (in the worst case). In practice we expect an + // 85% to 90% efficiency. } } - in += 64 - _lzcnt_u64(mprocessed); - int64_t nout = _mm_popcnt_u64(mprocessed); - if (big_endian) { - Wout = _mm512_shuffle_epi8(Wout, byteflip); + if (errors()) { + return 0; } - _mm512_mask_storeu_epi16(out, __mmask32((uint64_t(1) << nout) - 1), Wout); - out += nout; - return true; // ok + if (pos < size) { + size_t howmany = + scalar::utf8_to_utf32::convert(in + pos, size - pos, utf32_output); + if (howmany == 0) { + return 0; + } + utf32_output += howmany; + } + return utf32_output - start; } - // Fast path 2: all ASCII or 2 byte - __mmask64 continuation_or_ascii = (tail == SIMDUTF_FULL) - ? _knot_mask64(m234) - : _kand_mask64(_knot_mask64(m234), b); - // on top of -0xc0 we subtract -2 which we get back later of the - // continuation byte tags - __m512i leading2byte = _mm512_maskz_sub_epi8(m234, input, mask_c2c2c2c2); - __mmask64 leading = tail == (tail == SIMDUTF_FULL) - ? _kor_mask64(m1, m234) - : _kand_mask64(_kor_mask64(m1, m234), - b); // first bytes of each sequence - if (tail == SIMDUTF_FULL) { - __mmask64 xnor234leading = - _kxnor_mask64(_kshiftli_mask64(m234, 1), leading); - if (!_kortestz_mask64_u8(xnor234leading, xnor234leading)) { - return false; + + simdutf_really_inline result convert_with_errors(const char *in, size_t size, + char32_t *utf32_output) { + size_t pos = 0; + char32_t *start{utf32_output}; + // In the worst case, we have the haswell kernel which can cause an overflow + // of 8 bytes when calling convert_masked_utf8_to_utf32. If you skip the + // last 16 bytes, and if the data is valid, then it is entirely safe because + // 16 UTF-8 bytes generate much more than 8 bytes. However, you cannot + // generally assume that you have valid UTF-8 input, so we are going to go + // back from the end counting 8 leading bytes, to give us a good margin. + size_t leading_byte = 0; + size_t margin = size; + for (; margin > 0 && leading_byte < 8; margin--) { + leading_byte += (int8_t(in[margin - 1]) > -65); } - } else { - __mmask64 bxorleading = _kxor_mask64(b, leading); - if (_kshiftli_mask64(m234, 1) != bxorleading) { - return false; + // If the input is long enough, then we have that margin-1 is the fourth + // last leading byte. + const size_t safety_margin = size - margin + 1; // to avoid overruns! + while (pos + 64 + safety_margin <= size) { + simd8x64 input(reinterpret_cast(in + pos)); + if (input.is_ascii()) { + input.store_ascii_as_utf32(utf32_output); + utf32_output += 64; + pos += 64; + } else { + // you might think that a for-loop would work, but under Visual Studio, + // it is not good enough. + static_assert( + (simd8x64::NUM_CHUNKS == 2) || + (simd8x64::NUM_CHUNKS == 4), + "We support either two or four chunks per 64-byte block."); + auto zero = simd8{uint8_t(0)}; + if (simd8x64::NUM_CHUNKS == 2) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + } else if (simd8x64::NUM_CHUNKS == 4) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + this->check_utf8_bytes(input.chunks[2], input.chunks[1]); + this->check_utf8_bytes(input.chunks[3], input.chunks[2]); + } + uint64_t utf8_continuation_mask = input.lt(-65 + 1); + if (errors() || (utf8_continuation_mask & 1)) { + result res = scalar::utf8_to_utf32::rewind_and_convert_with_errors( + pos, in + pos, size - pos, utf32_output); + res.count += pos; + return res; + } + uint64_t utf8_leading_mask = ~utf8_continuation_mask; + uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; + // We process in blocks of up to 12 bytes except possibly + // for fast paths which may process up to 16 bytes. For the + // slow path to work, we should have at least 12 input bytes left. + size_t max_starting_point = (pos + 64) - 12; + // Next loop is going to run at least five times. + while (pos < max_starting_point) { + // Performance note: our ability to compute 'consumed' and + // then shift and recompute is critical. If there is a + // latency of, say, 4 cycles on getting 'consumed', then + // the inner loop might have a total latency of about 6 cycles. + // Yet we process between 6 to 12 inputs bytes, thus we get + // a speed limit between 1 cycle/byte and 0.5 cycle/byte + // for this section of the code. Hence, there is a limit + // to how much we can further increase this latency before + // it seriously harms performance. + size_t consumed = convert_masked_utf8_to_utf32( + in + pos, utf8_end_of_code_point_mask, utf32_output); + pos += consumed; + utf8_end_of_code_point_mask >>= consumed; + } + // At this point there may remain between 0 and 12 bytes in the + // 64-byte block. These bytes will be processed again. So we have an + // 80% efficiency (in the worst case). In practice we expect an + // 85% to 90% efficiency. + } + } + if (errors()) { + result res = scalar::utf8_to_utf32::rewind_and_convert_with_errors( + pos, in + pos, size - pos, utf32_output); + res.count += pos; + return res; + } + if (pos < size) { + result res = scalar::utf8_to_utf32::rewind_and_convert_with_errors( + pos, in + pos, size - pos, utf32_output); + if (res.error) { // In case of error, we want the error position + res.count += pos; + return res; + } else { // In case of success, we want the number of word written + utf32_output += res.count; + } } + return result(error_code::SUCCESS, utf32_output - start); } - // - if (tail == SIMDUTF_FULL) { - // In the two-byte/ASCII scenario, we are easily latency bound, so we want - // to increment the input buffer as quickly as possible. - // We process 32 bytes unless the byte at index 32 is a continuation byte, - // in which case we include it as well for a total of 33 bytes. - // Note that if x is an ASCII byte, then the following is false: - // int8_t(x) <= int8_t(0xc0) under two's complement. - in += 32; - if (int8_t(*in) <= int8_t(0xc0)) - in++; - // The alternative is to do - // in += 64 - _lzcnt_u64(_pdep_u64(0xFFFFFFFF, continuation_or_ascii)); - // but it requires loading the input, doing the mask computation, and - // converting back the mask to a general register. It just takes too long, - // leaving the processor likely to be idle. - } else { - in += 64 - _lzcnt_u64(_pdep_u64(0xFFFFFFFF, continuation_or_ascii)); + + simdutf_really_inline bool errors() const { + return this->error.any_bits_set_anywhere(); } - __m512i lead = _mm512_maskz_compress_epi8( - leading, leading2byte); // will contain zero for ascii, and the data - lead = _mm512_cvtepu8_epi16( - _mm512_castsi512_si256(lead)); // ... zero extended into code units - __m512i follow = _mm512_maskz_compress_epi8( - continuation_or_ascii, input); // the last bytes of each sequence - follow = _mm512_cvtepu8_epi16( - _mm512_castsi512_si256(follow)); // ... zero extended into code units - lead = _mm512_slli_epi16(lead, 6); // shifted into position - __m512i final = _mm512_add_epi16(follow, lead); // combining lead and follow - if (big_endian) { - final = _mm512_shuffle_epi8(final, byteflip); +}; // struct utf8_checker +} // namespace utf8_to_utf32 +} // unnamed namespace +} // namespace haswell +} // namespace simdutf +/* end file src/generic/utf8_to_utf32/utf8_to_utf32.h */ +// other functions +/* begin file src/generic/utf8.h */ + +namespace simdutf { +namespace haswell { +namespace { +namespace utf8 { + +using namespace simd; + +simdutf_really_inline size_t count_code_points(const char *in, size_t size) { + size_t pos = 0; + size_t count = 0; + for (; pos + 64 <= size; pos += 64) { + simd8x64 input(reinterpret_cast(in + pos)); + uint64_t utf8_continuation_mask = input.gt(-65); + count += count_ones(utf8_continuation_mask); } - if (tail == SIMDUTF_FULL) { - // Next part is UTF-16 specific and can be generalized to UTF-32. - int nout = _mm_popcnt_u32(uint32_t(leading)); - _mm512_mask_storeu_epi16(out, __mmask32((uint64_t(1) << nout) - 1), final); - out += nout; // UTF-8 to UTF-16 is only expansionary in this case. - } else { - int nout = int(_mm_popcnt_u64(_pdep_u64(0xFFFFFFFF, leading))); - _mm512_mask_storeu_epi16(out, __mmask32((uint64_t(1) << nout) - 1), final); - out += nout; // UTF-8 to UTF-16 is only expansionary in this case. + return count + scalar::utf8::count_code_points(in + pos, size - pos); +} + +simdutf_really_inline size_t utf16_length_from_utf8(const char *in, + size_t size) { + size_t pos = 0; + size_t count = 0; + // This algorithm could no doubt be improved! + for (; pos + 64 <= size; pos += 64) { + simd8x64 input(reinterpret_cast(in + pos)); + uint64_t utf8_continuation_mask = input.lt(-65 + 1); + // We count one word for anything that is not a continuation (so + // leading bytes). + count += 64 - count_ones(utf8_continuation_mask); + int64_t utf8_4byte = input.gteq_unsigned(240); + count += count_ones(utf8_4byte); } + return count + scalar::utf8::utf16_length_from_utf8(in + pos, size - pos); +} +} // namespace utf8 +} // unnamed namespace +} // namespace haswell +} // namespace simdutf +/* end file src/generic/utf8.h */ +/* begin file src/generic/utf16.h */ +namespace simdutf { +namespace haswell { +namespace { +namespace utf16 { - return true; // we are fine. +template +simdutf_really_inline size_t count_code_points(const char16_t *in, + size_t size) { + size_t pos = 0; + size_t count = 0; + for (; pos < size / 32 * 32; pos += 32) { + simd16x32 input(reinterpret_cast(in + pos)); + if (!match_system(big_endian)) { + input.swap_bytes(); + } + uint64_t not_pair = input.not_in_range(0xDC00, 0xDFFF); + count += count_ones(not_pair) / 2; + } + return count + + scalar::utf16::count_code_points(in + pos, size - pos); } -/* - utf32_to_utf16_masked converts `count` lower UTF-32 code units - from input `utf32` into UTF-16. It differs from utf32_to_utf16 - in that it 'masks' the writes. +template +simdutf_really_inline size_t utf8_length_from_utf16(const char16_t *in, + size_t size) { + size_t pos = 0; + size_t count = 0; + // This algorithm could no doubt be improved! + for (; pos < size / 32 * 32; pos += 32) { + simd16x32 input(reinterpret_cast(in + pos)); + if (!match_system(big_endian)) { + input.swap_bytes(); + } + uint64_t ascii_mask = input.lteq(0x7F); + uint64_t twobyte_mask = input.lteq(0x7FF); + uint64_t not_pair_mask = input.not_in_range(0xD800, 0xDFFF); - Returns how many 16-bit code units were stored. + size_t ascii_count = count_ones(ascii_mask) / 2; + size_t twobyte_count = count_ones(twobyte_mask & ~ascii_mask) / 2; + size_t threebyte_count = count_ones(not_pair_mask & ~twobyte_mask) / 2; + size_t fourbyte_count = 32 - count_ones(not_pair_mask) / 2; + count += 2 * fourbyte_count + 3 * threebyte_count + 2 * twobyte_count + + ascii_count; + } + return count + scalar::utf16::utf8_length_from_utf16(in + pos, + size - pos); +} - byteflip is used for flipping 16-bit code units, and it should be - __m512i byteflip = _mm512_setr_epi64( - 0x0607040502030001, - 0x0e0f0c0d0a0b0809, - 0x0607040502030001, - 0x0e0f0c0d0a0b0809, - 0x0607040502030001, - 0x0e0f0c0d0a0b0809, - 0x0607040502030001, - 0x0e0f0c0d0a0b0809 - ); - We pass it to the (always inlined) function to encourage the compiler to - keep the value in a (constant) register. -*/ template -simdutf_really_inline size_t utf32_to_utf16_masked(const __m512i byteflip, - __m512i utf32, - unsigned int count, - char16_t *output) { - - const __mmask16 valid = uint16_t((1 << count) - 1); - // 1. check if we have any surrogate pairs - const __m512i v_0000_ffff = _mm512_set1_epi32(0x0000ffff); - const __mmask16 sp_mask = - _mm512_mask_cmpgt_epu32_mask(valid, utf32, v_0000_ffff); +simdutf_really_inline size_t utf32_length_from_utf16(const char16_t *in, + size_t size) { + return count_code_points(in, size); +} - if (sp_mask == 0) { - if (big_endian) { - _mm256_mask_storeu_epi16( - (__m256i *)output, valid, - _mm256_shuffle_epi8(_mm512_cvtepi32_epi16(utf32), - _mm512_castsi512_si256(byteflip))); +simdutf_really_inline void +change_endianness_utf16(const char16_t *in, size_t size, char16_t *output) { + size_t pos = 0; - } else { - _mm256_mask_storeu_epi16((__m256i *)output, valid, - _mm512_cvtepi32_epi16(utf32)); - } - return count; + while (pos < size / 32 * 32) { + simd16x32 input(reinterpret_cast(in + pos)); + input.swap_bytes(); + input.store(reinterpret_cast(output)); + pos += 32; + output += 32; } - { - // build surrogate pair code units in 32-bit lanes + scalar::utf16::change_endianness_utf16(in + pos, size - pos, output); +} - // t0 = 8 x [000000000000aaaa|aaaaaabbbbbbbbbb] - const __m512i v_0001_0000 = _mm512_set1_epi32(0x00010000); - const __m512i t0 = _mm512_sub_epi32(utf32, v_0001_0000); +} // namespace utf16 +} // unnamed namespace +} // namespace haswell +} // namespace simdutf +/* end file src/generic/utf16.h */ - // t1 = 8 x [000000aaaaaaaaaa|bbbbbbbbbb000000] - const __m512i t1 = _mm512_slli_epi32(t0, 6); +// transcoding from UTF-8 to Latin 1 +/* begin file src/generic/utf8_to_latin1/utf8_to_latin1.h */ - // t2 = 8 x [000000aaaaaaaaaa|aaaaaabbbbbbbbbb] -- copy hi word from t1 - // to t0 - // 0xe4 = (t1 and v_ffff_0000) or (t0 and not v_ffff_0000) - const __m512i v_ffff_0000 = _mm512_set1_epi32(0xffff0000); - const __m512i t2 = _mm512_ternarylogic_epi32(t1, t0, v_ffff_0000, 0xe4); +namespace simdutf { +namespace haswell { +namespace { +namespace utf8_to_latin1 { +using namespace simd; - // t2 = 8 x [110110aaaaaaaaaa|110111bbbbbbbbbb] -- copy hi word from t1 - // to t0 - // 0xba = (t2 and not v_fc00_fc000) or v_d800_dc00 - const __m512i v_fc00_fc00 = _mm512_set1_epi32(0xfc00fc00); - const __m512i v_d800_dc00 = _mm512_set1_epi32(0xd800dc00); - const __m512i t3 = - _mm512_ternarylogic_epi32(t2, v_fc00_fc00, v_d800_dc00, 0xba); - const __m512i t4 = _mm512_mask_blend_epi32(sp_mask, utf32, t3); - __m512i t5 = _mm512_ror_epi32(t4, 16); - // Here we want to trim all of the upper 16-bit code units from the 2-byte - // characters represented as 4-byte values. We can compute it from - // sp_mask or the following... It can be more optimized! - const __mmask32 nonzero = _kor_mask32( - 0xaaaaaaaa, _mm512_cmpneq_epi16_mask(t5, _mm512_setzero_si512())); - const __mmask32 nonzero_masked = - _kand_mask32(nonzero, __mmask32((uint64_t(1) << (2 * count)) - 1)); - if (big_endian) { - t5 = _mm512_shuffle_epi8(t5, byteflip); +simdutf_really_inline simd8 +check_special_cases(const simd8 input, const simd8 prev1) { + // For UTF-8 to Latin 1, we can allow any ASCII character, and any + // continuation byte, but the non-ASCII leading bytes must be 0b11000011 or + // 0b11000010 and nothing else. + // + // Bit 0 = Too Short (lead byte/ASCII followed by lead byte/ASCII) + // Bit 1 = Too Long (ASCII followed by continuation) + // Bit 2 = Overlong 3-byte + // Bit 4 = Surrogate + // Bit 5 = Overlong 2-byte + // Bit 7 = Two Continuations + constexpr const uint8_t TOO_SHORT = 1 << 0; // 11______ 0_______ + // 11______ 11______ + constexpr const uint8_t TOO_LONG = 1 << 1; // 0_______ 10______ + constexpr const uint8_t OVERLONG_3 = 1 << 2; // 11100000 100_____ + constexpr const uint8_t SURROGATE = 1 << 4; // 11101101 101_____ + constexpr const uint8_t OVERLONG_2 = 1 << 5; // 1100000_ 10______ + constexpr const uint8_t TWO_CONTS = 1 << 7; // 10______ 10______ + constexpr const uint8_t TOO_LARGE = 1 << 3; // 11110100 1001____ + // 11110100 101_____ + // 11110101 1001____ + // 11110101 101_____ + // 1111011_ 1001____ + // 1111011_ 101_____ + // 11111___ 1001____ + // 11111___ 101_____ + constexpr const uint8_t TOO_LARGE_1000 = 1 << 6; + // 11110101 1000____ + // 1111011_ 1000____ + // 11111___ 1000____ + constexpr const uint8_t OVERLONG_4 = 1 << 6; // 11110000 1000____ + constexpr const uint8_t FORBIDDEN = 0xff; + + const simd8 byte_1_high = prev1.shr<4>().lookup_16( + // 0_______ ________ + TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, + TOO_LONG, + // 10______ ________ + TWO_CONTS, TWO_CONTS, TWO_CONTS, TWO_CONTS, + // 1100____ ________ + TOO_SHORT | OVERLONG_2, + // 1101____ ________ + FORBIDDEN, + // 1110____ ________ + FORBIDDEN, + // 1111____ ________ + FORBIDDEN); + constexpr const uint8_t CARRY = + TOO_SHORT | TOO_LONG | TWO_CONTS; // These all have ____ in byte 1 . + const simd8 byte_1_low = + (prev1 & 0x0F) + .lookup_16( + // ____0000 ________ + CARRY | OVERLONG_3 | OVERLONG_2 | OVERLONG_4, + // ____0001 ________ + CARRY | OVERLONG_2, + // ____001_ ________ + CARRY, CARRY, + + // ____0100 ________ + FORBIDDEN, + // ____0101 ________ + FORBIDDEN, + // ____011_ ________ + FORBIDDEN, FORBIDDEN, + + // ____1___ ________ + FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN, + // ____1101 ________ + FORBIDDEN, FORBIDDEN, FORBIDDEN); + const simd8 byte_2_high = input.shr<4>().lookup_16( + // ________ 0_______ + TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, + TOO_SHORT, TOO_SHORT, + + // ________ 1000____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE_1000 | + OVERLONG_4, + // ________ 1001____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE, + // ________ 101_____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, + TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, + + // ________ 11______ + TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT); + return (byte_1_high & byte_1_low & byte_2_high); +} + +struct validating_transcoder { + // If this is nonzero, there has been a UTF-8 error. + simd8 error; + + validating_transcoder() : error(uint8_t(0)) {} + // + // Check whether the current bytes are valid UTF-8. + // + simdutf_really_inline void check_utf8_bytes(const simd8 input, + const simd8 prev_input) { + // Flip prev1...prev3 so we can easily determine if they are 2+, 3+ or 4+ + // lead bytes (2, 3, 4-byte leads become large positive numbers instead of + // small negative numbers) + simd8 prev1 = input.prev<1>(prev_input); + this->error |= check_special_cases(input, prev1); + } + + simdutf_really_inline size_t convert(const char *in, size_t size, + char *latin1_output) { + size_t pos = 0; + char *start{latin1_output}; + // In the worst case, we have the haswell kernel which can cause an overflow + // of 8 bytes when calling convert_masked_utf8_to_latin1. If you skip the + // last 16 bytes, and if the data is valid, then it is entirely safe because + // 16 UTF-8 bytes generate much more than 8 bytes. However, you cannot + // generally assume that you have valid UTF-8 input, so we are going to go + // back from the end counting 16 leading bytes, to give us a good margin. + size_t leading_byte = 0; + size_t margin = size; + for (; margin > 0 && leading_byte < 16; margin--) { + leading_byte += (int8_t(in[margin - 1]) > + -65); // twos complement of -65 is 1011 1111 ... + } + // If the input is long enough, then we have that margin-1 is the eight last + // leading byte. + const size_t safety_margin = size - margin + 1; // to avoid overruns! + while (pos + 64 + safety_margin <= size) { + simd8x64 input(reinterpret_cast(in + pos)); + if (input.is_ascii()) { + input.store((int8_t *)latin1_output); + latin1_output += 64; + pos += 64; + } else { + // you might think that a for-loop would work, but under Visual Studio, + // it is not good enough. + static_assert( + (simd8x64::NUM_CHUNKS == 2) || + (simd8x64::NUM_CHUNKS == 4), + "We support either two or four chunks per 64-byte block."); + auto zero = simd8{uint8_t(0)}; + if (simd8x64::NUM_CHUNKS == 2) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + } else if (simd8x64::NUM_CHUNKS == 4) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + this->check_utf8_bytes(input.chunks[2], input.chunks[1]); + this->check_utf8_bytes(input.chunks[3], input.chunks[2]); + } + uint64_t utf8_continuation_mask = + input.lt(-65 + 1); // -64 is 1100 0000 in twos complement. Note: in + // this case, we also have ASCII to account for. + if (utf8_continuation_mask & 1) { + return 0; // error + } + uint64_t utf8_leading_mask = ~utf8_continuation_mask; + uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; + // We process in blocks of up to 12 bytes except possibly + // for fast paths which may process up to 16 bytes. For the + // slow path to work, we should have at least 12 input bytes left. + size_t max_starting_point = (pos + 64) - 12; + // Next loop is going to run at least five times. + while (pos < max_starting_point) { + // Performance note: our ability to compute 'consumed' and + // then shift and recompute is critical. If there is a + // latency of, say, 4 cycles on getting 'consumed', then + // the inner loop might have a total latency of about 6 cycles. + // Yet we process between 6 to 12 inputs bytes, thus we get + // a speed limit between 1 cycle/byte and 0.5 cycle/byte + // for this section of the code. Hence, there is a limit + // to how much we can further increase this latency before + // it seriously harms performance. + size_t consumed = convert_masked_utf8_to_latin1( + in + pos, utf8_end_of_code_point_mask, latin1_output); + pos += consumed; + utf8_end_of_code_point_mask >>= consumed; + } + // At this point there may remain between 0 and 12 bytes in the + // 64-byte block. These bytes will be processed again. So we have an + // 80% efficiency (in the worst case). In practice we expect an + // 85% to 90% efficiency. + } + } + if (errors()) { + return 0; + } + if (pos < size) { + size_t howmany = + scalar::utf8_to_latin1::convert(in + pos, size - pos, latin1_output); + if (howmany == 0) { + return 0; + } + latin1_output += howmany; + } + return latin1_output - start; + } + + simdutf_really_inline result convert_with_errors(const char *in, size_t size, + char *latin1_output) { + size_t pos = 0; + char *start{latin1_output}; + // In the worst case, we have the haswell kernel which can cause an overflow + // of 8 bytes when calling convert_masked_utf8_to_latin1. If you skip the + // last 16 bytes, and if the data is valid, then it is entirely safe because + // 16 UTF-8 bytes generate much more than 8 bytes. However, you cannot + // generally assume that you have valid UTF-8 input, so we are going to go + // back from the end counting 8 leading bytes, to give us a good margin. + size_t leading_byte = 0; + size_t margin = size; + for (; margin > 0 && leading_byte < 8; margin--) { + leading_byte += (int8_t(in[margin - 1]) > -65); + } + // If the input is long enough, then we have that margin-1 is the eight last + // leading byte. + const size_t safety_margin = size - margin + 1; // to avoid overruns! + while (pos + 64 + safety_margin <= size) { + simd8x64 input(reinterpret_cast(in + pos)); + if (input.is_ascii()) { + input.store((int8_t *)latin1_output); + latin1_output += 64; + pos += 64; + } else { + // you might think that a for-loop would work, but under Visual Studio, + // it is not good enough. + static_assert( + (simd8x64::NUM_CHUNKS == 2) || + (simd8x64::NUM_CHUNKS == 4), + "We support either two or four chunks per 64-byte block."); + auto zero = simd8{uint8_t(0)}; + if (simd8x64::NUM_CHUNKS == 2) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + } else if (simd8x64::NUM_CHUNKS == 4) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + this->check_utf8_bytes(input.chunks[2], input.chunks[1]); + this->check_utf8_bytes(input.chunks[3], input.chunks[2]); + } + if (errors()) { + // rewind_and_convert_with_errors will seek a potential error from + // in+pos onward, with the ability to go back up to pos bytes, and + // read size-pos bytes forward. + result res = scalar::utf8_to_latin1::rewind_and_convert_with_errors( + pos, in + pos, size - pos, latin1_output); + res.count += pos; + return res; + } + uint64_t utf8_continuation_mask = input.lt(-65 + 1); + uint64_t utf8_leading_mask = ~utf8_continuation_mask; + uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; + // We process in blocks of up to 12 bytes except possibly + // for fast paths which may process up to 16 bytes. For the + // slow path to work, we should have at least 12 input bytes left. + size_t max_starting_point = (pos + 64) - 12; + // Next loop is going to run at least five times. + while (pos < max_starting_point) { + // Performance note: our ability to compute 'consumed' and + // then shift and recompute is critical. If there is a + // latency of, say, 4 cycles on getting 'consumed', then + // the inner loop might have a total latency of about 6 cycles. + // Yet we process between 6 to 12 inputs bytes, thus we get + // a speed limit between 1 cycle/byte and 0.5 cycle/byte + // for this section of the code. Hence, there is a limit + // to how much we can further increase this latency before + // it seriously harms performance. + size_t consumed = convert_masked_utf8_to_latin1( + in + pos, utf8_end_of_code_point_mask, latin1_output); + pos += consumed; + utf8_end_of_code_point_mask >>= consumed; + } + // At this point there may remain between 0 and 12 bytes in the + // 64-byte block. These bytes will be processed again. So we have an + // 80% efficiency (in the worst case). In practice we expect an + // 85% to 90% efficiency. + } } - // we deliberately avoid _mm512_mask_compressstoreu_epi16 for portability - // (zen4) - __m512i compressed = _mm512_maskz_compress_epi16(nonzero_masked, t5); - _mm512_mask_storeu_epi16( - output, - (1 << (count + static_cast(count_ones(sp_mask)))) - 1, - compressed); - //_mm512_mask_compressstoreu_epi16(output, nonzero_masked, t5); + if (errors()) { + // rewind_and_convert_with_errors will seek a potential error from in+pos + // onward, with the ability to go back up to pos bytes, and read size-pos + // bytes forward. + result res = scalar::utf8_to_latin1::rewind_and_convert_with_errors( + pos, in + pos, size - pos, latin1_output); + res.count += pos; + return res; + } + if (pos < size) { + // rewind_and_convert_with_errors will seek a potential error from in+pos + // onward, with the ability to go back up to pos bytes, and read size-pos + // bytes forward. + result res = scalar::utf8_to_latin1::rewind_and_convert_with_errors( + pos, in + pos, size - pos, latin1_output); + if (res.error) { // In case of error, we want the error position + res.count += pos; + return res; + } else { // In case of success, we want the number of word written + latin1_output += res.count; + } + } + return result(error_code::SUCCESS, latin1_output - start); } - return count + static_cast(count_ones(sp_mask)); -} - -/* - utf32_to_utf16 converts `count` lower UTF-32 code units - from input `utf32` into UTF-16. It may overflow. + simdutf_really_inline bool errors() const { + return this->error.any_bits_set_anywhere(); + } - Returns how many 16-bit code units were stored. +}; // struct utf8_checker +} // namespace utf8_to_latin1 +} // unnamed namespace +} // namespace haswell +} // namespace simdutf +/* end file src/generic/utf8_to_latin1/utf8_to_latin1.h */ +/* begin file src/generic/utf8_to_latin1/valid_utf8_to_latin1.h */ - byteflip is used for flipping 16-bit code units, and it should be - __m512i byteflip = _mm512_setr_epi64( - 0x0607040502030001, - 0x0e0f0c0d0a0b0809, - 0x0607040502030001, - 0x0e0f0c0d0a0b0809, - 0x0607040502030001, - 0x0e0f0c0d0a0b0809, - 0x0607040502030001, - 0x0e0f0c0d0a0b0809 - ); - We pass it to the (always inlined) function to encourage the compiler to - keep the value in a (constant) register. -*/ -template -simdutf_really_inline size_t utf32_to_utf16(const __m512i byteflip, - __m512i utf32, unsigned int count, - char16_t *output) { - // check if we have any surrogate pairs - const __m512i v_0000_ffff = _mm512_set1_epi32(0x0000ffff); - const __mmask16 sp_mask = _mm512_cmpgt_epu32_mask(utf32, v_0000_ffff); +namespace simdutf { +namespace haswell { +namespace { +namespace utf8_to_latin1 { +using namespace simd; - if (sp_mask == 0) { - // technically, it should be _mm256_storeu_epi16 - if (big_endian) { - _mm256_storeu_si256( - (__m256i *)output, - _mm256_shuffle_epi8(_mm512_cvtepi32_epi16(utf32), - _mm512_castsi512_si256(byteflip))); +simdutf_really_inline size_t convert_valid(const char *in, size_t size, + char *latin1_output) { + size_t pos = 0; + char *start{latin1_output}; + // In the worst case, we have the haswell kernel which can cause an overflow + // of 8 bytes when calling convert_masked_utf8_to_latin1. If you skip the last + // 16 bytes, and if the data is valid, then it is entirely safe because 16 + // UTF-8 bytes generate much more than 8 bytes. However, you cannot generally + // assume that you have valid UTF-8 input, so we are going to go back from the + // end counting 8 leading bytes, to give us a good margin. + size_t leading_byte = 0; + size_t margin = size; + for (; margin > 0 && leading_byte < 8; margin--) { + leading_byte += (int8_t(in[margin - 1]) > + -65); // twos complement of -65 is 1011 1111 ... + } + // If the input is long enough, then we have that margin-1 is the eight last + // leading byte. + const size_t safety_margin = size - margin + 1; // to avoid overruns! + while (pos + 64 + safety_margin <= size) { + simd8x64 input(reinterpret_cast(in + pos)); + if (input.is_ascii()) { + input.store((int8_t *)latin1_output); + latin1_output += 64; + pos += 64; } else { - _mm256_storeu_si256((__m256i *)output, _mm512_cvtepi32_epi16(utf32)); + // you might think that a for-loop would work, but under Visual Studio, it + // is not good enough. + uint64_t utf8_continuation_mask = + input.lt(-65 + 1); // -64 is 1100 0000 in twos complement. Note: in + // this case, we also have ASCII to account for. + uint64_t utf8_leading_mask = ~utf8_continuation_mask; + uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; + // We process in blocks of up to 12 bytes except possibly + // for fast paths which may process up to 16 bytes. For the + // slow path to work, we should have at least 12 input bytes left. + size_t max_starting_point = (pos + 64) - 12; + // Next loop is going to run at least five times. + while (pos < max_starting_point) { + // Performance note: our ability to compute 'consumed' and + // then shift and recompute is critical. If there is a + // latency of, say, 4 cycles on getting 'consumed', then + // the inner loop might have a total latency of about 6 cycles. + // Yet we process between 6 to 12 inputs bytes, thus we get + // a speed limit between 1 cycle/byte and 0.5 cycle/byte + // for this section of the code. Hence, there is a limit + // to how much we can further increase this latency before + // it seriously harms performance. + size_t consumed = convert_masked_utf8_to_latin1( + in + pos, utf8_end_of_code_point_mask, latin1_output); + pos += consumed; + utf8_end_of_code_point_mask >>= consumed; + } + // At this point there may remain between 0 and 12 bytes in the + // 64-byte block. These bytes will be processed again. So we have an + // 80% efficiency (in the worst case). In practice we expect an + // 85% to 90% efficiency. } - return count; } + if (pos < size) { + size_t howmany = scalar::utf8_to_latin1::convert_valid(in + pos, size - pos, + latin1_output); + latin1_output += howmany; + } + return latin1_output - start; +} - { - // build surrogate pair code units in 32-bit lanes - - // t0 = 8 x [000000000000aaaa|aaaaaabbbbbbbbbb] - const __m512i v_0001_0000 = _mm512_set1_epi32(0x00010000); - const __m512i t0 = _mm512_sub_epi32(utf32, v_0001_0000); - - // t1 = 8 x [000000aaaaaaaaaa|bbbbbbbbbb000000] - const __m512i t1 = _mm512_slli_epi32(t0, 6); +} // namespace utf8_to_latin1 +} // namespace +} // namespace haswell +} // namespace simdutf + // namespace simdutf +/* end file src/generic/utf8_to_latin1/valid_utf8_to_latin1.h */ - // t2 = 8 x [000000aaaaaaaaaa|aaaaaabbbbbbbbbb] -- copy hi word from t1 - // to t0 - // 0xe4 = (t1 and v_ffff_0000) or (t0 and not v_ffff_0000) - const __m512i v_ffff_0000 = _mm512_set1_epi32(0xffff0000); - const __m512i t2 = _mm512_ternarylogic_epi32(t1, t0, v_ffff_0000, 0xe4); +namespace simdutf { +namespace haswell { - // t2 = 8 x [110110aaaaaaaaaa|110111bbbbbbbbbb] -- copy hi word from t1 - // to t0 - // 0xba = (t2 and not v_fc00_fc000) or v_d800_dc00 - const __m512i v_fc00_fc00 = _mm512_set1_epi32(0xfc00fc00); - const __m512i v_d800_dc00 = _mm512_set1_epi32(0xd800dc00); - const __m512i t3 = - _mm512_ternarylogic_epi32(t2, v_fc00_fc00, v_d800_dc00, 0xba); - const __m512i t4 = _mm512_mask_blend_epi32(sp_mask, utf32, t3); - __m512i t5 = _mm512_ror_epi32(t4, 16); - const __mmask32 nonzero = _kor_mask32( - 0xaaaaaaaa, _mm512_cmpneq_epi16_mask(t5, _mm512_setzero_si512())); - if (big_endian) { - t5 = _mm512_shuffle_epi8(t5, byteflip); +simdutf_warn_unused int +implementation::detect_encodings(const char *input, + size_t length) const noexcept { + // If there is a BOM, then we trust it. + auto bom_encoding = simdutf::BOM::check_bom(input, length); + if (bom_encoding != encoding_type::unspecified) { + return bom_encoding; + } + int out = 0; + if (validate_utf8(input, length)) { + out |= encoding_type::UTF8; + } + if ((length % 2) == 0) { + if (validate_utf16le(reinterpret_cast(input), + length / 2)) { + out |= encoding_type::UTF16_LE; } - // we deliberately avoid _mm512_mask_compressstoreu_epi16 for portability - // (zen4) - __m512i compressed = _mm512_maskz_compress_epi16(nonzero, t5); - _mm512_mask_storeu_epi16( - output, - (1 << (count + static_cast(count_ones(sp_mask)))) - 1, - compressed); - //_mm512_mask_compressstoreu_epi16(output, nonzero, t5); } - - return count + static_cast(count_ones(sp_mask)); + if ((length % 4) == 0) { + if (validate_utf32(reinterpret_cast(input), length / 4)) { + out |= encoding_type::UTF32_LE; + } + } + return out; } -/** - * Store the last N bytes of previous followed by 512-N bytes from input. - */ -template __m512i prev(__m512i input, __m512i previous) { - static_assert(N <= 32, "N must be no larger than 32"); - const __m512i movemask = - _mm512_setr_epi32(28, 29, 30, 31, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11); - const __m512i rotated = _mm512_permutex2var_epi32(input, movemask, previous); -#if SIMDUTF_GCC8 || SIMDUTF_GCC9 - constexpr int shift = 16 - N; // workaround for GCC8,9 - return _mm512_alignr_epi8(input, rotated, shift); -#else - return _mm512_alignr_epi8(input, rotated, 16 - N); -#endif // SIMDUTF_GCC8 || SIMDUTF_GCC9 +simdutf_warn_unused bool +implementation::validate_utf8(const char *buf, size_t len) const noexcept { + return haswell::utf8_validation::generic_validate_utf8(buf, len); } -template -__m512i shuffle_epi128(__m512i v) { - static_assert((idx0 >= 0 && idx0 <= 3), "idx0 must be in range 0..3"); - static_assert((idx1 >= 0 && idx1 <= 3), "idx1 must be in range 0..3"); - static_assert((idx2 >= 0 && idx2 <= 3), "idx2 must be in range 0..3"); - static_assert((idx3 >= 0 && idx3 <= 3), "idx3 must be in range 0..3"); - - constexpr unsigned shuffle = idx0 | (idx1 << 2) | (idx2 << 4) | (idx3 << 6); - return _mm512_shuffle_i32x4(v, v, shuffle); +simdutf_warn_unused result implementation::validate_utf8_with_errors( + const char *buf, size_t len) const noexcept { + return haswell::utf8_validation::generic_validate_utf8_with_errors(buf, len); } -template constexpr __m512i broadcast_epi128(__m512i v) { - return shuffle_epi128(v); +simdutf_warn_unused bool +implementation::validate_ascii(const char *buf, size_t len) const noexcept { + return haswell::utf8_validation::generic_validate_ascii(buf, len); } -/** - * Current unused. - */ -template __m512i rotate_by_N_epi8(const __m512i input) { - - // lanes order: 1, 2, 3, 0 => 0b00_11_10_01 - const __m512i permuted = _mm512_shuffle_i32x4(input, input, 0x39); - - return _mm512_alignr_epi8(permuted, input, N); +simdutf_warn_unused result implementation::validate_ascii_with_errors( + const char *buf, size_t len) const noexcept { + return haswell::utf8_validation::generic_validate_ascii_with_errors(buf, len); } -/* - expanded_utf8_to_utf32 converts expanded UTF-8 characters (`utf8`) - stored at separate 32-bit lanes. - - For each lane we have also a character class (`char_class), given in form - 0x8080800N, where N is 4 highest bits from the leading byte; 0x80 resets - corresponding bytes during pshufb. -*/ -simdutf_really_inline __m512i expanded_utf8_to_utf32(__m512i char_class, - __m512i utf8) { - /* - Input: - - utf8: bytes stored at separate 32-bit code units - - valid: which code units have valid UTF-8 characters - - Bit layout of single word. We show 4 cases for each possible - UTF-8 character encoding. The `?` denotes bits we must not - assume their value. - - |10dd.dddd|10cc.cccc|10bb.bbbb|1111.0aaa| 4-byte char - |????.????|10cc.cccc|10bb.bbbb|1110.aaaa| 3-byte char - |????.????|????.????|10bb.bbbb|110a.aaaa| 2-byte char - |????.????|????.????|????.????|0aaa.aaaa| ASCII char - byte 3 byte 2 byte 1 byte 0 - */ - - /* 1. Reset control bits of continuation bytes and the MSB - of the leading byte; this makes all bytes unsigned (and - does not alter ASCII char). - - |00dd.dddd|00cc.cccc|00bb.bbbb|0111.0aaa| 4-byte char - |00??.????|00cc.cccc|00bb.bbbb|0110.aaaa| 3-byte char - |00??.????|00??.????|00bb.bbbb|010a.aaaa| 2-byte char - |00??.????|00??.????|00??.????|0aaa.aaaa| ASCII char - ^^ ^^ ^^ ^ - */ - __m512i values; - const __m512i v_3f3f_3f7f = _mm512_set1_epi32(0x3f3f3f7f); - values = _mm512_and_si512(utf8, v_3f3f_3f7f); - - /* 2. Swap and join fields A-B and C-D - - |0000.cccc|ccdd.dddd|0001.110a|aabb.bbbb| 4-byte char - |0000.cccc|cc??.????|0001.10aa|aabb.bbbb| 3-byte char - |0000.????|????.????|0001.0aaa|aabb.bbbb| 2-byte char - |0000.????|????.????|000a.aaaa|aa??.????| ASCII char */ - const __m512i v_0140_0140 = _mm512_set1_epi32(0x01400140); - values = _mm512_maddubs_epi16(values, v_0140_0140); - - /* 3. Swap and join fields AB & CD - - |0000.0001|110a.aabb|bbbb.cccc|ccdd.dddd| 4-byte char - |0000.0001|10aa.aabb|bbbb.cccc|cc??.????| 3-byte char - |0000.0001|0aaa.aabb|bbbb.????|????.????| 2-byte char - |0000.000a|aaaa.aa??|????.????|????.????| ASCII char */ - const __m512i v_0001_1000 = _mm512_set1_epi32(0x00011000); - values = _mm512_madd_epi16(values, v_0001_1000); - - /* 4. Shift left the values by variable amounts to reset highest UTF-8 bits - |aaab.bbbb|bccc.cccd|dddd.d000|0000.0000| 4-byte char -- by 11 - |aaaa.bbbb|bbcc.cccc|????.??00|0000.0000| 3-byte char -- by 10 - |aaaa.abbb|bbb?.????|????.???0|0000.0000| 2-byte char -- by 9 - |aaaa.aaa?|????.????|????.????|?000.0000| ASCII char -- by 7 */ - { - /** pshufb - - continuation = 0 - ascii = 7 - _2_bytes = 9 - _3_bytes = 10 - _4_bytes = 11 - - shift_left_v3 = 4 * [ - ascii, # 0000 - ascii, # 0001 - ascii, # 0010 - ascii, # 0011 - ascii, # 0100 - ascii, # 0101 - ascii, # 0110 - ascii, # 0111 - continuation, # 1000 - continuation, # 1001 - continuation, # 1010 - continuation, # 1011 - _2_bytes, # 1100 - _2_bytes, # 1101 - _3_bytes, # 1110 - _4_bytes, # 1111 - ] */ - const __m512i shift_left_v3 = _mm512_setr_epi64( - 0x0707070707070707, 0x0b0a090900000000, 0x0707070707070707, - 0x0b0a090900000000, 0x0707070707070707, 0x0b0a090900000000, - 0x0707070707070707, 0x0b0a090900000000); - - const __m512i shift = _mm512_shuffle_epi8(shift_left_v3, char_class); - values = _mm512_sllv_epi32(values, shift); +simdutf_warn_unused bool +implementation::validate_utf16le(const char16_t *buf, + size_t len) const noexcept { + if (simdutf_unlikely(len == 0)) { + // empty input is valid UTF-16. protect the implementation from + // handling nullptr + return true; } - - /* 5. Shift right the values by variable amounts to reset lowest bits - |0000.0000|000a.aabb|bbbb.cccc|ccdd.dddd| 4-byte char -- by 11 - |0000.0000|0000.0000|aaaa.bbbb|bbcc.cccc| 3-byte char -- by 16 - |0000.0000|0000.0000|0000.0aaa|aabb.bbbb| 2-byte char -- by 21 - |0000.0000|0000.0000|0000.0000|0aaa.aaaa| ASCII char -- by 25 */ - { - // 4 * [25, 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 0, 21, 21, 16, 11] - const __m512i shift_right = _mm512_setr_epi64( - 0x1919191919191919, 0x0b10151500000000, 0x1919191919191919, - 0x0b10151500000000, 0x1919191919191919, 0x0b10151500000000, - 0x1919191919191919, 0x0b10151500000000); - - const __m512i shift = _mm512_shuffle_epi8(shift_right, char_class); - values = _mm512_srlv_epi32(values, shift); + const char16_t *tail = avx2_validate_utf16(buf, len); + if (tail) { + return scalar::utf16::validate(tail, + len - (tail - buf)); + } else { + return false; } - - return values; -} - -simdutf_really_inline __m512i expand_and_identify(__m512i lane0, __m512i lane1, - int &count) { - const __m512i merged = _mm512_mask_mov_epi32(lane0, 0x1000, lane1); - const __m512i expand_ver2 = _mm512_setr_epi64( - 0x0403020103020100, 0x0605040305040302, 0x0807060507060504, - 0x0a09080709080706, 0x0c0b0a090b0a0908, 0x0e0d0c0b0d0c0b0a, - 0x000f0e0d0f0e0d0c, 0x0201000f01000f0e); - const __m512i input = _mm512_shuffle_epi8(merged, expand_ver2); - const __m512i v_0000_00c0 = _mm512_set1_epi32(0xc0); - const __m512i t0 = _mm512_and_si512(input, v_0000_00c0); - const __m512i v_0000_0080 = _mm512_set1_epi32(0x80); - const __mmask16 leading_bytes = _mm512_cmpneq_epu32_mask(t0, v_0000_0080); - count = static_cast(count_ones(leading_bytes)); - return _mm512_mask_compress_epi32(_mm512_setzero_si512(), leading_bytes, - input); -} - -simdutf_really_inline __m512i expand_utf8_to_utf32(__m512i input) { - __m512i char_class = _mm512_srli_epi32(input, 4); - /* char_class = ((input >> 4) & 0x0f) | 0x80808000 */ - const __m512i v_0000_000f = _mm512_set1_epi32(0x0f); - const __m512i v_8080_8000 = _mm512_set1_epi32(0x80808000); - char_class = - _mm512_ternarylogic_epi32(char_class, v_0000_000f, v_8080_8000, 0xea); - return expanded_utf8_to_utf32(char_class, input); } -/* end file src/icelake/icelake_utf8_common.inl.cpp */ -/* begin file src/icelake/icelake_macros.inl.cpp */ - -/* - This upcoming macro (SIMDUTF_ICELAKE_TRANSCODE16) takes 16 + 4 bytes (of a - UTF-8 string) and loads all possible 4-byte substring into an AVX512 - register. - - For example if we have bytes abcdefgh... we create following 32-bit lanes - - [abcd|bcde|cdef|defg|efgh|...] - ^ ^ - byte 0 of reg byte 63 of reg -*/ -/** pshufb - # lane{0,1,2} have got bytes: [ 0, 1, 2, 3, 4, 5, 6, 8, 9, 10, - 11, 12, 13, 14, 15] # lane3 has got bytes: [ 16, 17, 18, 19, 4, 5, - 6, 8, 9, 10, 11, 12, 13, 14, 15] - - expand_ver2 = [ - # lane 0: - 0, 1, 2, 3, - 1, 2, 3, 4, - 2, 3, 4, 5, - 3, 4, 5, 6, - - # lane 1: - 4, 5, 6, 7, - 5, 6, 7, 8, - 6, 7, 8, 9, - 7, 8, 9, 10, - - # lane 2: - 8, 9, 10, 11, - 9, 10, 11, 12, - 10, 11, 12, 13, - 11, 12, 13, 14, - # lane 3 order: 13, 14, 15, 16 14, 15, 16, 17, 15, 16, 17, 18, 16, - 17, 18, 19 12, 13, 14, 15, 13, 14, 15, 0, 14, 15, 0, 1, 15, 0, 1, 2, - ] -*/ - -#define SIMDUTF_ICELAKE_TRANSCODE16(LANE0, LANE1, MASKED) \ - { \ - const __m512i merged = _mm512_mask_mov_epi32(LANE0, 0x1000, LANE1); \ - const __m512i expand_ver2 = _mm512_setr_epi64( \ - 0x0403020103020100, 0x0605040305040302, 0x0807060507060504, \ - 0x0a09080709080706, 0x0c0b0a090b0a0908, 0x0e0d0c0b0d0c0b0a, \ - 0x000f0e0d0f0e0d0c, 0x0201000f01000f0e); \ - const __m512i input = _mm512_shuffle_epi8(merged, expand_ver2); \ - \ - __mmask16 leading_bytes; \ - const __m512i v_0000_00c0 = _mm512_set1_epi32(0xc0); \ - const __m512i t0 = _mm512_and_si512(input, v_0000_00c0); \ - const __m512i v_0000_0080 = _mm512_set1_epi32(0x80); \ - leading_bytes = _mm512_cmpneq_epu32_mask(t0, v_0000_0080); \ - \ - __m512i char_class; \ - char_class = _mm512_srli_epi32(input, 4); \ - /* char_class = ((input >> 4) & 0x0f) | 0x80808000 */ \ - const __m512i v_0000_000f = _mm512_set1_epi32(0x0f); \ - const __m512i v_8080_8000 = _mm512_set1_epi32(0x80808000); \ - char_class = \ - _mm512_ternarylogic_epi32(char_class, v_0000_000f, v_8080_8000, 0xea); \ - \ - const int valid_count = static_cast(count_ones(leading_bytes)); \ - const __m512i utf32 = expanded_utf8_to_utf32(char_class, input); \ - \ - const __m512i out = _mm512_mask_compress_epi32(_mm512_setzero_si512(), \ - leading_bytes, utf32); \ - \ - if (UTF32) { \ - if (MASKED) { \ - const __mmask16 valid = uint16_t((1 << valid_count) - 1); \ - _mm512_mask_storeu_epi32((__m512i *)output, valid, out); \ - } else { \ - _mm512_storeu_si512((__m512i *)output, out); \ - } \ - output += valid_count; \ - } else { \ - if (MASKED) { \ - output += utf32_to_utf16_masked( \ - byteflip, out, valid_count, reinterpret_cast(output)); \ - } else { \ - output += utf32_to_utf16( \ - byteflip, out, valid_count, reinterpret_cast(output)); \ - } \ - } \ +simdutf_warn_unused bool +implementation::validate_utf16be(const char16_t *buf, + size_t len) const noexcept { + if (simdutf_unlikely(len == 0)) { + // empty input is valid UTF-16. protect the implementation from + // handling nullptr + return true; } - -#define SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(INPUT, VALID_COUNT, MASKED) \ - { \ - if (UTF32) { \ - if (MASKED) { \ - const __mmask16 valid_mask = uint16_t((1 << VALID_COUNT) - 1); \ - _mm512_mask_storeu_epi32((__m512i *)output, valid_mask, INPUT); \ - } else { \ - _mm512_storeu_si512((__m512i *)output, INPUT); \ - } \ - output += VALID_COUNT; \ - } else { \ - if (MASKED) { \ - output += utf32_to_utf16_masked( \ - byteflip, INPUT, VALID_COUNT, \ - reinterpret_cast(output)); \ - } else { \ - output += \ - utf32_to_utf16(byteflip, INPUT, VALID_COUNT, \ - reinterpret_cast(output)); \ - } \ - } \ + const char16_t *tail = avx2_validate_utf16(buf, len); + if (tail) { + return scalar::utf16::validate(tail, len - (tail - buf)); + } else { + return false; } +} -#define SIMDUTF_ICELAKE_STORE_ASCII(UTF32, utf8, output) \ - if (UTF32) { \ - const __m128i t0 = _mm512_castsi512_si128(utf8); \ - const __m128i t1 = _mm512_extracti32x4_epi32(utf8, 1); \ - const __m128i t2 = _mm512_extracti32x4_epi32(utf8, 2); \ - const __m128i t3 = _mm512_extracti32x4_epi32(utf8, 3); \ - _mm512_storeu_si512((__m512i *)(output + 0 * 16), \ - _mm512_cvtepu8_epi32(t0)); \ - _mm512_storeu_si512((__m512i *)(output + 1 * 16), \ - _mm512_cvtepu8_epi32(t1)); \ - _mm512_storeu_si512((__m512i *)(output + 2 * 16), \ - _mm512_cvtepu8_epi32(t2)); \ - _mm512_storeu_si512((__m512i *)(output + 3 * 16), \ - _mm512_cvtepu8_epi32(t3)); \ - } else { \ - const __m256i h0 = _mm512_castsi512_si256(utf8); \ - const __m256i h1 = _mm512_extracti64x4_epi64(utf8, 1); \ - if (big_endian) { \ - _mm512_storeu_si512( \ - (__m512i *)(output + 0 * 16), \ - _mm512_shuffle_epi8(_mm512_cvtepu8_epi16(h0), byteflip)); \ - _mm512_storeu_si512( \ - (__m512i *)(output + 2 * 16), \ - _mm512_shuffle_epi8(_mm512_cvtepu8_epi16(h1), byteflip)); \ - } else { \ - _mm512_storeu_si512((__m512i *)(output + 0 * 16), \ - _mm512_cvtepu8_epi16(h0)); \ - _mm512_storeu_si512((__m512i *)(output + 2 * 16), \ - _mm512_cvtepu8_epi16(h1)); \ - } \ +simdutf_warn_unused result implementation::validate_utf16le_with_errors( + const char16_t *buf, size_t len) const noexcept { + result res = avx2_validate_utf16_with_errors(buf, len); + if (res.count != len) { + result scalar_res = scalar::utf16::validate_with_errors( + buf + res.count, len - res.count); + return result(scalar_res.error, res.count + scalar_res.count); + } else { + return res; } -/* end file src/icelake/icelake_macros.inl.cpp */ -/* begin file src/icelake/icelake_from_valid_utf8.inl.cpp */ -// file included directly +} -// File contains conversion procedure from VALID UTF-8 strings. +simdutf_warn_unused result implementation::validate_utf16be_with_errors( + const char16_t *buf, size_t len) const noexcept { + result res = avx2_validate_utf16_with_errors(buf, len); + if (res.count != len) { + result scalar_res = scalar::utf16::validate_with_errors( + buf + res.count, len - res.count); + return result(scalar_res.error, res.count + scalar_res.count); + } else { + return res; + } +} -/* - valid_utf8_to_fixed_length converts a valid UTF-8 string into UTF-32. +simdutf_warn_unused bool +implementation::validate_utf32(const char32_t *buf, size_t len) const noexcept { + if (simdutf_unlikely(len == 0)) { + // empty input is valid UTF-32. protect the implementation from + // handling nullptr + return true; + } + const char32_t *tail = avx2_validate_utf32le(buf, len); + if (tail) { + return scalar::utf32::validate(tail, len - (tail - buf)); + } else { + return false; + } +} - The `OUTPUT` template type decides what to do with UTF-32: store - it directly or convert into UTF-16 (with AVX512). +simdutf_warn_unused result implementation::validate_utf32_with_errors( + const char32_t *buf, size_t len) const noexcept { + if (simdutf_unlikely(len == 0)) { + // empty input is valid UTF-32. protect the implementation from + // handling nullptr + return result(error_code::SUCCESS, 0); + } + result res = avx2_validate_utf32le_with_errors(buf, len); + if (res.count != len) { + result scalar_res = + scalar::utf32::validate_with_errors(buf + res.count, len - res.count); + return result(scalar_res.error, res.count + scalar_res.count); + } else { + return res; + } +} - Input: - - str - valid UTF-8 string - - len - string length - - out_buffer - output buffer +simdutf_warn_unused size_t implementation::convert_latin1_to_utf8( + const char *buf, size_t len, char *utf8_output) const noexcept { + std::pair ret = + avx2_convert_latin1_to_utf8(buf, len, utf8_output); + size_t converted_chars = ret.second - utf8_output; - Result: - - pair.first - the first unprocessed input byte - - pair.second - the first unprocessed output word -*/ -template -std::pair -valid_utf8_to_fixed_length(const char *str, size_t len, OUTPUT *dwords) { - constexpr bool UTF32 = std::is_same::value; - constexpr bool UTF16 = std::is_same::value; - static_assert( - UTF32 or UTF16, - "output type has to be uint32_t (for UTF-32) or char16_t (for UTF-16)"); - static_assert(!(UTF32 and big_endian), - "we do not currently support big-endian UTF-32"); + if (ret.first != buf + len) { + const size_t scalar_converted_chars = scalar::latin1_to_utf8::convert( + ret.first, len - (ret.first - buf), ret.second); + converted_chars += scalar_converted_chars; + } - __m512i byteflip = _mm512_setr_epi64(0x0607040502030001, 0x0e0f0c0d0a0b0809, - 0x0607040502030001, 0x0e0f0c0d0a0b0809, - 0x0607040502030001, 0x0e0f0c0d0a0b0809, - 0x0607040502030001, 0x0e0f0c0d0a0b0809); - const char *ptr = str; - const char *end = ptr + len; + return converted_chars; +} - OUTPUT *output = dwords; - /** - * In the main loop, we consume 64 bytes per iteration, - * but we access 64 + 4 bytes. - * We check for ptr + 64 + 64 <= end because - * we want to be do maskless writes without overruns. - */ - while (end - ptr >= 64 + 4) { - const __m512i utf8 = _mm512_loadu_si512((const __m512i *)ptr); - const __m512i v_80 = _mm512_set1_epi8(char(0x80)); - const __mmask64 ascii = _mm512_test_epi8_mask(utf8, v_80); - if (ascii == 0) { - SIMDUTF_ICELAKE_STORE_ASCII(UTF32, utf8, output) - output += 64; - ptr += 64; - continue; +simdutf_warn_unused size_t implementation::convert_latin1_to_utf16le( + const char *buf, size_t len, char16_t *utf16_output) const noexcept { + std::pair ret = + avx2_convert_latin1_to_utf16(buf, len, utf16_output); + if (ret.first == nullptr) { + return 0; + } + size_t converted_chars = ret.second - utf16_output; + if (ret.first != buf + len) { + const size_t scalar_converted_chars = + scalar::latin1_to_utf16::convert( + ret.first, len - (ret.first - buf), ret.second); + if (scalar_converted_chars == 0) { + return 0; } + converted_chars += scalar_converted_chars; + } + return converted_chars; +} - const __m512i lane0 = broadcast_epi128<0>(utf8); - const __m512i lane1 = broadcast_epi128<1>(utf8); - int valid_count0; - __m512i vec0 = expand_and_identify(lane0, lane1, valid_count0); - const __m512i lane2 = broadcast_epi128<2>(utf8); - int valid_count1; - __m512i vec1 = expand_and_identify(lane1, lane2, valid_count1); - if (valid_count0 + valid_count1 <= 16) { - vec0 = _mm512_mask_expand_epi32( - vec0, __mmask16(((1 << valid_count1) - 1) << valid_count0), vec1); - valid_count0 += valid_count1; - vec0 = expand_utf8_to_utf32(vec0); - SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec0, valid_count0, true) - } else { - vec0 = expand_utf8_to_utf32(vec0); - vec1 = expand_utf8_to_utf32(vec1); - SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec0, valid_count0, true) - SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec1, valid_count1, true) +simdutf_warn_unused size_t implementation::convert_latin1_to_utf16be( + const char *buf, size_t len, char16_t *utf16_output) const noexcept { + std::pair ret = + avx2_convert_latin1_to_utf16(buf, len, utf16_output); + if (ret.first == nullptr) { + return 0; + } + size_t converted_chars = ret.second - utf16_output; + if (ret.first != buf + len) { + const size_t scalar_converted_chars = + scalar::latin1_to_utf16::convert( + ret.first, len - (ret.first - buf), ret.second); + if (scalar_converted_chars == 0) { + return 0; } - const __m512i lane3 = broadcast_epi128<3>(utf8); - int valid_count2; - __m512i vec2 = expand_and_identify(lane2, lane3, valid_count2); - uint32_t tmp1; - ::memcpy(&tmp1, ptr + 64, sizeof(tmp1)); - const __m512i lane4 = _mm512_set1_epi32(tmp1); - int valid_count3; - __m512i vec3 = expand_and_identify(lane3, lane4, valid_count3); - if (valid_count2 + valid_count3 <= 16) { - vec2 = _mm512_mask_expand_epi32( - vec2, __mmask16(((1 << valid_count3) - 1) << valid_count2), vec3); - valid_count2 += valid_count3; - vec2 = expand_utf8_to_utf32(vec2); - SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec2, valid_count2, true) - } else { - vec2 = expand_utf8_to_utf32(vec2); - vec3 = expand_utf8_to_utf32(vec3); - SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec2, valid_count2, true) - SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec3, valid_count3, true) + converted_chars += scalar_converted_chars; + } + return converted_chars; +} + +simdutf_warn_unused size_t implementation::convert_latin1_to_utf32( + const char *buf, size_t len, char32_t *utf32_output) const noexcept { + std::pair ret = + avx2_convert_latin1_to_utf32(buf, len, utf32_output); + if (ret.first == nullptr) { + return 0; + } + size_t converted_chars = ret.second - utf32_output; + if (ret.first != buf + len) { + const size_t scalar_converted_chars = scalar::latin1_to_utf32::convert( + ret.first, len - (ret.first - buf), ret.second); + if (scalar_converted_chars == 0) { + return 0; } - ptr += 4 * 16; + converted_chars += scalar_converted_chars; } + return converted_chars; +} - if (end - ptr >= 64) { - const __m512i utf8 = _mm512_loadu_si512((const __m512i *)ptr); - const __m512i v_80 = _mm512_set1_epi8(char(0x80)); - const __mmask64 ascii = _mm512_test_epi8_mask(utf8, v_80); - if (ascii == 0) { - SIMDUTF_ICELAKE_STORE_ASCII(UTF32, utf8, output) - output += 64; - ptr += 64; - } else { - const __m512i lane0 = broadcast_epi128<0>(utf8); - const __m512i lane1 = broadcast_epi128<1>(utf8); - int valid_count0; - __m512i vec0 = expand_and_identify(lane0, lane1, valid_count0); - const __m512i lane2 = broadcast_epi128<2>(utf8); - int valid_count1; - __m512i vec1 = expand_and_identify(lane1, lane2, valid_count1); - if (valid_count0 + valid_count1 <= 16) { - vec0 = _mm512_mask_expand_epi32( - vec0, __mmask16(((1 << valid_count1) - 1) << valid_count0), vec1); - valid_count0 += valid_count1; - vec0 = expand_utf8_to_utf32(vec0); - SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec0, valid_count0, true) - } else { - vec0 = expand_utf8_to_utf32(vec0); - vec1 = expand_utf8_to_utf32(vec1); - SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec0, valid_count0, true) - SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec1, valid_count1, true) - } +simdutf_warn_unused size_t implementation::convert_utf8_to_latin1( + const char *buf, size_t len, char *latin1_output) const noexcept { + utf8_to_latin1::validating_transcoder converter; + return converter.convert(buf, len, latin1_output); +} - const __m512i lane3 = broadcast_epi128<3>(utf8); - SIMDUTF_ICELAKE_TRANSCODE16(lane2, lane3, true) +simdutf_warn_unused result implementation::convert_utf8_to_latin1_with_errors( + const char *buf, size_t len, char *latin1_output) const noexcept { + utf8_to_latin1::validating_transcoder converter; + return converter.convert_with_errors(buf, len, latin1_output); +} - ptr += 3 * 16; - } - } - return {ptr, output}; +simdutf_warn_unused size_t implementation::convert_valid_utf8_to_latin1( + const char *input, size_t size, char *latin1_output) const noexcept { + return utf8_to_latin1::convert_valid(input, size, latin1_output); } -using utf8_to_utf16_result = std::pair; -/* end file src/icelake/icelake_from_valid_utf8.inl.cpp */ -/* begin file src/icelake/icelake_utf8_validation.inl.cpp */ -// file included directly +simdutf_warn_unused size_t implementation::convert_utf8_to_utf16le( + const char *buf, size_t len, char16_t *utf16_output) const noexcept { + utf8_to_utf16::validating_transcoder converter; + return converter.convert(buf, len, utf16_output); +} -simdutf_really_inline __m512i check_special_cases(__m512i input, - const __m512i prev1) { - __m512i mask1 = _mm512_setr_epi64(0x0202020202020202, 0x4915012180808080, - 0x0202020202020202, 0x4915012180808080, - 0x0202020202020202, 0x4915012180808080, - 0x0202020202020202, 0x4915012180808080); - const __m512i v_0f = _mm512_set1_epi8(0x0f); - __m512i index1 = _mm512_and_si512(_mm512_srli_epi16(prev1, 4), v_0f); +simdutf_warn_unused size_t implementation::convert_utf8_to_utf16be( + const char *buf, size_t len, char16_t *utf16_output) const noexcept { + utf8_to_utf16::validating_transcoder converter; + return converter.convert(buf, len, utf16_output); +} - __m512i byte_1_high = _mm512_shuffle_epi8(mask1, index1); - __m512i mask2 = _mm512_setr_epi64(0xcbcbcb8b8383a3e7, 0xcbcbdbcbcbcbcbcb, - 0xcbcbcb8b8383a3e7, 0xcbcbdbcbcbcbcbcb, - 0xcbcbcb8b8383a3e7, 0xcbcbdbcbcbcbcbcb, - 0xcbcbcb8b8383a3e7, 0xcbcbdbcbcbcbcbcb); - __m512i index2 = _mm512_and_si512(prev1, v_0f); +simdutf_warn_unused result implementation::convert_utf8_to_utf16le_with_errors( + const char *buf, size_t len, char16_t *utf16_output) const noexcept { + utf8_to_utf16::validating_transcoder converter; + return converter.convert_with_errors(buf, len, + utf16_output); +} - __m512i byte_1_low = _mm512_shuffle_epi8(mask2, index2); - __m512i mask3 = - _mm512_setr_epi64(0x101010101010101, 0x1010101babaaee6, 0x101010101010101, - 0x1010101babaaee6, 0x101010101010101, 0x1010101babaaee6, - 0x101010101010101, 0x1010101babaaee6); - __m512i index3 = _mm512_and_si512(_mm512_srli_epi16(input, 4), v_0f); - __m512i byte_2_high = _mm512_shuffle_epi8(mask3, index3); - return _mm512_ternarylogic_epi64(byte_1_high, byte_1_low, byte_2_high, 128); +simdutf_warn_unused result implementation::convert_utf8_to_utf16be_with_errors( + const char *buf, size_t len, char16_t *utf16_output) const noexcept { + utf8_to_utf16::validating_transcoder converter; + return converter.convert_with_errors(buf, len, utf16_output); } -simdutf_really_inline __m512i check_multibyte_lengths(const __m512i input, - const __m512i prev_input, - const __m512i sc) { - __m512i prev2 = prev<2>(input, prev_input); - __m512i prev3 = prev<3>(input, prev_input); - __m512i is_third_byte = _mm512_subs_epu8( - prev2, _mm512_set1_epi8(0b11100000u - 1)); // Only 111_____ will be > 0 - __m512i is_fourth_byte = _mm512_subs_epu8( - prev3, _mm512_set1_epi8(0b11110000u - 1)); // Only 1111____ will be > 0 - __m512i is_third_or_fourth_byte = - _mm512_or_si512(is_third_byte, is_fourth_byte); - const __m512i v_7f = _mm512_set1_epi8(char(0x7f)); - is_third_or_fourth_byte = _mm512_adds_epu8(v_7f, is_third_or_fourth_byte); - // We want to compute (is_third_or_fourth_byte AND v80) XOR sc. - const __m512i v_80 = _mm512_set1_epi8(char(0x80)); - return _mm512_ternarylogic_epi32(is_third_or_fourth_byte, v_80, sc, - 0b1101010); - //__m512i is_third_or_fourth_byte_mask = - //_mm512_and_si512(is_third_or_fourth_byte, v_80); return - // _mm512_xor_si512(is_third_or_fourth_byte_mask, sc); +simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf16le( + const char *input, size_t size, char16_t *utf16_output) const noexcept { + return utf8_to_utf16::convert_valid(input, size, + utf16_output); } -// -// Return nonzero if there are incomplete multibyte characters at the end of the -// block: e.g. if there is a 4-byte character, but it is 3 bytes from the end. -// -simdutf_really_inline __m512i is_incomplete(const __m512i input) { - // If the previous input's last 3 bytes match this, they're too short (they - // ended at EOF): - // ... 1111____ 111_____ 11______ - __m512i max_value = _mm512_setr_epi64(0xffffffffffffffff, 0xffffffffffffffff, - 0xffffffffffffffff, 0xffffffffffffffff, - 0xffffffffffffffff, 0xffffffffffffffff, - 0xffffffffffffffff, 0xbfdfefffffffffff); - return _mm512_subs_epu8(input, max_value); + +simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf16be( + const char *input, size_t size, char16_t *utf16_output) const noexcept { + return utf8_to_utf16::convert_valid(input, size, + utf16_output); } -struct avx512_utf8_checker { - // If this is nonzero, there has been a UTF-8 error. - __m512i error{}; +simdutf_warn_unused size_t implementation::convert_utf8_to_utf32( + const char *buf, size_t len, char32_t *utf32_output) const noexcept { + utf8_to_utf32::validating_transcoder converter; + return converter.convert(buf, len, utf32_output); +} - // The last input we received - __m512i prev_input_block{}; - // Whether the last input we received was incomplete (used for ASCII fast - // path) - __m512i prev_incomplete{}; +simdutf_warn_unused result implementation::convert_utf8_to_utf32_with_errors( + const char *buf, size_t len, char32_t *utf32_output) const noexcept { + utf8_to_utf32::validating_transcoder converter; + return converter.convert_with_errors(buf, len, utf32_output); +} - // - // Check whether the current bytes are valid UTF-8. - // - simdutf_really_inline void check_utf8_bytes(const __m512i input, - const __m512i prev_input) { - // Flip prev1...prev3 so we can easily determine if they are 2+, 3+ or 4+ - // lead bytes (2, 3, 4-byte leads become large positive numbers instead of - // small negative numbers) - __m512i prev1 = prev<1>(input, prev_input); - __m512i sc = check_special_cases(input, prev1); - this->error = _mm512_or_si512( - check_multibyte_lengths(input, prev_input, sc), this->error); +simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf32( + const char *input, size_t size, char32_t *utf32_output) const noexcept { + return utf8_to_utf32::convert_valid(input, size, utf32_output); +} + +simdutf_warn_unused size_t implementation::convert_utf16le_to_latin1( + const char16_t *buf, size_t len, char *latin1_output) const noexcept { + std::pair ret = + haswell::avx2_convert_utf16_to_latin1(buf, len, + latin1_output); + if (ret.first == nullptr) { + return 0; + } + size_t saved_bytes = ret.second - latin1_output; + if (ret.first != buf + len) { + const size_t scalar_saved_bytes = + scalar::utf16_to_latin1::convert( + ret.first, len - (ret.first - buf), ret.second); + if (scalar_saved_bytes == 0) { + return 0; + } + saved_bytes += scalar_saved_bytes; } + return saved_bytes; +} - // The only problem that can happen at EOF is that a multibyte character is - // too short or a byte value too large in the last bytes: check_special_cases - // only checks for bytes too large in the first of two bytes. - simdutf_really_inline void check_eof() { - // If the previous block had incomplete UTF-8 characters at the end, an - // ASCII block can't possibly finish them. - this->error = _mm512_or_si512(this->error, this->prev_incomplete); +simdutf_warn_unused size_t implementation::convert_utf16be_to_latin1( + const char16_t *buf, size_t len, char *latin1_output) const noexcept { + std::pair ret = + haswell::avx2_convert_utf16_to_latin1(buf, len, + latin1_output); + if (ret.first == nullptr) { + return 0; + } + size_t saved_bytes = ret.second - latin1_output; + if (ret.first != buf + len) { + const size_t scalar_saved_bytes = + scalar::utf16_to_latin1::convert( + ret.first, len - (ret.first - buf), ret.second); + if (scalar_saved_bytes == 0) { + return 0; + } + saved_bytes += scalar_saved_bytes; } + return saved_bytes; +} - // returns true if ASCII. - simdutf_really_inline bool check_next_input(const __m512i input) { - const __m512i v_80 = _mm512_set1_epi8(char(0x80)); - const __mmask64 ascii = _mm512_test_epi8_mask(input, v_80); - if (ascii == 0) { - this->error = _mm512_or_si512(this->error, this->prev_incomplete); - return true; +simdutf_warn_unused result +implementation::convert_utf16le_to_latin1_with_errors( + const char16_t *buf, size_t len, char *latin1_output) const noexcept { + std::pair ret = + avx2_convert_utf16_to_latin1_with_errors( + buf, len, latin1_output); + if (ret.first.error) { + return ret.first; + } // Can return directly since scalar fallback already found correct + // ret.first.count + if (ret.first.count != len) { // All good so far, but not finished + result scalar_res = + scalar::utf16_to_latin1::convert_with_errors( + buf + ret.first.count, len - ret.first.count, ret.second); + if (scalar_res.error) { + scalar_res.count += ret.first.count; + return scalar_res; + } else { + ret.second += scalar_res.count; + } + } + ret.first.count = + ret.second - + latin1_output; // Set count to the number of 8-bit code units written + return ret.first; +} + +simdutf_warn_unused result +implementation::convert_utf16be_to_latin1_with_errors( + const char16_t *buf, size_t len, char *latin1_output) const noexcept { + std::pair ret = + avx2_convert_utf16_to_latin1_with_errors(buf, len, + latin1_output); + if (ret.first.error) { + return ret.first; + } // Can return directly since scalar fallback already found correct + // ret.first.count + if (ret.first.count != len) { // All good so far, but not finished + result scalar_res = + scalar::utf16_to_latin1::convert_with_errors( + buf + ret.first.count, len - ret.first.count, ret.second); + if (scalar_res.error) { + scalar_res.count += ret.first.count; + return scalar_res; } else { - this->check_utf8_bytes(input, this->prev_input_block); - this->prev_incomplete = is_incomplete(input); - this->prev_input_block = input; - return false; + ret.second += scalar_res.count; } } - // do not forget to call check_eof! - simdutf_really_inline bool errors() const { - return _mm512_test_epi8_mask(this->error, this->error) != 0; - } -}; // struct avx512_utf8_checker -/* end file src/icelake/icelake_utf8_validation.inl.cpp */ -/* begin file src/icelake/icelake_from_utf8.inl.cpp */ -// file included directly + ret.first.count = + ret.second - + latin1_output; // Set count to the number of 8-bit code units written + return ret.first; +} -// File contains conversion procedure from possibly invalid UTF-8 strings. +simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_latin1( + const char16_t *buf, size_t len, char *latin1_output) const noexcept { + // optimization opportunity: implement a custom function + return convert_utf16be_to_latin1(buf, len, latin1_output); +} -/** - * Attempts to convert up to len 1-byte code units from in (in UTF-8 format) to - * out. - * Returns the position of the input and output after the processing is - * completed. Upon error, the output is set to null. - */ +simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_latin1( + const char16_t *buf, size_t len, char *latin1_output) const noexcept { + // optimization opportunity: implement a custom function + return convert_utf16le_to_latin1(buf, len, latin1_output); +} -template -utf8_to_utf16_result -fast_avx512_convert_utf8_to_utf16(const char *in, size_t len, char16_t *out) { - const char *const final_in = in + len; - bool result = true; - while (result) { - if (final_in - in >= 64) { - result = process_block_utf8_to_utf16( - in, out, final_in - in); - } else if (in < final_in) { - result = process_block_utf8_to_utf16( - in, out, final_in - in); - } else { - break; - } +simdutf_warn_unused size_t implementation::convert_utf16le_to_utf8( + const char16_t *buf, size_t len, char *utf8_output) const noexcept { + std::pair ret = + haswell::avx2_convert_utf16_to_utf8(buf, len, + utf8_output); + if (ret.first == nullptr) { + return 0; } - if (!result) { - out = nullptr; + size_t saved_bytes = ret.second - utf8_output; + if (ret.first != buf + len) { + const size_t scalar_saved_bytes = + scalar::utf16_to_utf8::convert( + ret.first, len - (ret.first - buf), ret.second); + if (scalar_saved_bytes == 0) { + return 0; + } + saved_bytes += scalar_saved_bytes; } - return std::make_pair(in, out); + return saved_bytes; } -template -simdutf::result fast_avx512_convert_utf8_to_utf16_with_errors(const char *in, - size_t len, - char16_t *out) { - const char *const init_in = in; - const char16_t *const init_out = out; - const char *const final_in = in + len; - bool result = true; - while (result) { - if (final_in - in >= 64) { - result = process_block_utf8_to_utf16( - in, out, final_in - in); - } else if (in < final_in) { - result = process_block_utf8_to_utf16( - in, out, final_in - in); - } else { - break; - } +simdutf_warn_unused size_t implementation::convert_utf16be_to_utf8( + const char16_t *buf, size_t len, char *utf8_output) const noexcept { + std::pair ret = + haswell::avx2_convert_utf16_to_utf8(buf, len, + utf8_output); + if (ret.first == nullptr) { + return 0; } - if (!result) { - size_t pos = size_t(in - init_in); - if (pos < len && (init_in[pos] & 0xc0) == 0x80 && pos >= 64) { - // We must check whether we are the fourth continuation byte - bool c1 = (init_in[pos - 1] & 0xc0) == 0x80; - bool c2 = (init_in[pos - 2] & 0xc0) == 0x80; - bool c3 = (init_in[pos - 3] & 0xc0) == 0x80; - if (c1 && c2 && c3) { - return {simdutf::TOO_LONG, pos}; - } + size_t saved_bytes = ret.second - utf8_output; + if (ret.first != buf + len) { + const size_t scalar_saved_bytes = + scalar::utf16_to_utf8::convert( + ret.first, len - (ret.first - buf), ret.second); + if (scalar_saved_bytes == 0) { + return 0; } - // rewind_and_convert_with_errors will seek a potential error from in - // onward, with the ability to go back up to in - init_in bytes, and read - // final_in - in bytes forward. - simdutf::result res = - scalar::utf8_to_utf16::rewind_and_convert_with_errors( - in - init_in, in, final_in - in, out); - res.count += (in - init_in); - return res; - } else { - return simdutf::result(error_code::SUCCESS, out - init_out); + saved_bytes += scalar_saved_bytes; } + return saved_bytes; } -template -// todo: replace with the utf-8 to utf-16 routine adapted to utf-32. This code -// is legacy. -std::pair -validating_utf8_to_fixed_length(const char *str, size_t len, OUTPUT *dwords) { - constexpr bool UTF32 = std::is_same::value; - constexpr bool UTF16 = std::is_same::value; - static_assert( - UTF32 or UTF16, - "output type has to be uint32_t (for UTF-32) or char16_t (for UTF-16)"); - static_assert(!(UTF32 and big_endian), - "we do not currently support big-endian UTF-32"); - - const char *ptr = str; - const char *end = ptr + len; - __m512i byteflip = _mm512_setr_epi64(0x0607040502030001, 0x0e0f0c0d0a0b0809, - 0x0607040502030001, 0x0e0f0c0d0a0b0809, - 0x0607040502030001, 0x0e0f0c0d0a0b0809, - 0x0607040502030001, 0x0e0f0c0d0a0b0809); - OUTPUT *output = dwords; - avx512_utf8_checker checker{}; - /** - * In the main loop, we consume 64 bytes per iteration, - * but we access 64 + 4 bytes. - * We use masked writes to avoid overruns, see - * https://github.com/simdutf/simdutf/issues/471 - */ - while (end - ptr >= 64 + 4) { - const __m512i utf8 = _mm512_loadu_si512((const __m512i *)ptr); - if (checker.check_next_input(utf8)) { - SIMDUTF_ICELAKE_STORE_ASCII(UTF32, utf8, output) - output += 64; - ptr += 64; - continue; - } - const __m512i lane0 = broadcast_epi128<0>(utf8); - const __m512i lane1 = broadcast_epi128<1>(utf8); - int valid_count0; - __m512i vec0 = expand_and_identify(lane0, lane1, valid_count0); - const __m512i lane2 = broadcast_epi128<2>(utf8); - int valid_count1; - __m512i vec1 = expand_and_identify(lane1, lane2, valid_count1); - if (valid_count0 + valid_count1 <= 16) { - vec0 = _mm512_mask_expand_epi32( - vec0, __mmask16(((1 << valid_count1) - 1) << valid_count0), vec1); - valid_count0 += valid_count1; - vec0 = expand_utf8_to_utf32(vec0); - SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec0, valid_count0, true) +simdutf_warn_unused result implementation::convert_utf16le_to_utf8_with_errors( + const char16_t *buf, size_t len, char *utf8_output) const noexcept { + // ret.first.count is always the position in the buffer, not the number of + // code units written even if finished + std::pair ret = + haswell::avx2_convert_utf16_to_utf8_with_errors( + buf, len, utf8_output); + if (ret.first.error) { + return ret.first; + } // Can return directly since scalar fallback already found correct + // ret.first.count + if (ret.first.count != len) { // All good so far, but not finished + result scalar_res = + scalar::utf16_to_utf8::convert_with_errors( + buf + ret.first.count, len - ret.first.count, ret.second); + if (scalar_res.error) { + scalar_res.count += ret.first.count; + return scalar_res; } else { - vec0 = expand_utf8_to_utf32(vec0); - vec1 = expand_utf8_to_utf32(vec1); - SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec0, valid_count0, true) - SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec1, valid_count1, true) + ret.second += scalar_res.count; } - const __m512i lane3 = broadcast_epi128<3>(utf8); - int valid_count2; - __m512i vec2 = expand_and_identify(lane2, lane3, valid_count2); - uint32_t tmp1; - ::memcpy(&tmp1, ptr + 64, sizeof(tmp1)); - const __m512i lane4 = _mm512_set1_epi32(tmp1); - int valid_count3; - __m512i vec3 = expand_and_identify(lane3, lane4, valid_count3); - if (valid_count2 + valid_count3 <= 16) { - vec2 = _mm512_mask_expand_epi32( - vec2, __mmask16(((1 << valid_count3) - 1) << valid_count2), vec3); - valid_count2 += valid_count3; - vec2 = expand_utf8_to_utf32(vec2); - SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec2, valid_count2, true) + } + ret.first.count = + ret.second - + utf8_output; // Set count to the number of 8-bit code units written + return ret.first; +} + +simdutf_warn_unused result implementation::convert_utf16be_to_utf8_with_errors( + const char16_t *buf, size_t len, char *utf8_output) const noexcept { + // ret.first.count is always the position in the buffer, not the number of + // code units written even if finished + std::pair ret = + haswell::avx2_convert_utf16_to_utf8_with_errors( + buf, len, utf8_output); + if (ret.first.error) { + return ret.first; + } // Can return directly since scalar fallback already found correct + // ret.first.count + if (ret.first.count != len) { // All good so far, but not finished + result scalar_res = + scalar::utf16_to_utf8::convert_with_errors( + buf + ret.first.count, len - ret.first.count, ret.second); + if (scalar_res.error) { + scalar_res.count += ret.first.count; + return scalar_res; } else { - vec2 = expand_utf8_to_utf32(vec2); - vec3 = expand_utf8_to_utf32(vec3); - SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec2, valid_count2, true) - SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec3, valid_count3, true) + ret.second += scalar_res.count; } - ptr += 4 * 16; } - const char *validatedptr = ptr; // validated up to ptr + ret.first.count = + ret.second - + utf8_output; // Set count to the number of 8-bit code units written + return ret.first; +} - // For the final pass, we validate 64 bytes, but we only transcode - // 3*16 bytes, so we may end up double-validating 16 bytes. - if (end - ptr >= 64) { - const __m512i utf8 = _mm512_loadu_si512((const __m512i *)ptr); - if (checker.check_next_input(utf8)) { - SIMDUTF_ICELAKE_STORE_ASCII(UTF32, utf8, output) - output += 64; - ptr += 64; - } else { - const __m512i lane0 = broadcast_epi128<0>(utf8); - const __m512i lane1 = broadcast_epi128<1>(utf8); - int valid_count0; - __m512i vec0 = expand_and_identify(lane0, lane1, valid_count0); - const __m512i lane2 = broadcast_epi128<2>(utf8); - int valid_count1; - __m512i vec1 = expand_and_identify(lane1, lane2, valid_count1); - if (valid_count0 + valid_count1 <= 16) { - vec0 = _mm512_mask_expand_epi32( - vec0, __mmask16(((1 << valid_count1) - 1) << valid_count0), vec1); - valid_count0 += valid_count1; - vec0 = expand_utf8_to_utf32(vec0); - SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec0, valid_count0, true) - } else { - vec0 = expand_utf8_to_utf32(vec0); - vec1 = expand_utf8_to_utf32(vec1); - SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec0, valid_count0, true) - SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec1, valid_count1, true) - } +simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_utf8( + const char16_t *buf, size_t len, char *utf8_output) const noexcept { + return convert_utf16le_to_utf8(buf, len, utf8_output); +} - const __m512i lane3 = broadcast_epi128<3>(utf8); - SIMDUTF_ICELAKE_TRANSCODE16(lane2, lane3, true) +simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_utf8( + const char16_t *buf, size_t len, char *utf8_output) const noexcept { + return convert_utf16be_to_utf8(buf, len, utf8_output); +} - ptr += 3 * 16; +simdutf_warn_unused size_t implementation::convert_utf32_to_utf8( + const char32_t *buf, size_t len, char *utf8_output) const noexcept { + std::pair ret = + avx2_convert_utf32_to_utf8(buf, len, utf8_output); + if (ret.first == nullptr) { + return 0; + } + size_t saved_bytes = ret.second - utf8_output; + if (ret.first != buf + len) { + const size_t scalar_saved_bytes = scalar::utf32_to_utf8::convert( + ret.first, len - (ret.first - buf), ret.second); + if (scalar_saved_bytes == 0) { + return 0; } - validatedptr += 4 * 16; + saved_bytes += scalar_saved_bytes; } - if (end != validatedptr) { - const __m512i utf8 = - _mm512_maskz_loadu_epi8(~UINT64_C(0) >> (64 - (end - validatedptr)), - (const __m512i *)validatedptr); - checker.check_next_input(utf8); + return saved_bytes; +} + +simdutf_warn_unused size_t implementation::convert_utf32_to_latin1( + const char32_t *buf, size_t len, char *latin1_output) const noexcept { + std::pair ret = + avx2_convert_utf32_to_latin1(buf, len, latin1_output); + if (ret.first == nullptr) { + return 0; } - checker.check_eof(); - if (checker.errors()) { - return {ptr, nullptr}; // We found an error. + size_t saved_bytes = ret.second - latin1_output; + if (ret.first != buf + len) { + const size_t scalar_saved_bytes = scalar::utf32_to_latin1::convert( + ret.first, len - (ret.first - buf), ret.second); + if (scalar_saved_bytes == 0) { + return 0; + } + saved_bytes += scalar_saved_bytes; } - return {ptr, output}; + return saved_bytes; } -// Like validating_utf8_to_fixed_length but returns as soon as an error is -// identified todo: replace with the utf-8 to utf-16 routine adapted to utf-32. -// This code is legacy. -template -std::tuple -validating_utf8_to_fixed_length_with_constant_checks(const char *str, - size_t len, - OUTPUT *dwords) { - constexpr bool UTF32 = std::is_same::value; - constexpr bool UTF16 = std::is_same::value; - static_assert( - UTF32 or UTF16, - "output type has to be uint32_t (for UTF-32) or char16_t (for UTF-16)"); - static_assert(!(UTF32 and big_endian), - "we do not currently support big-endian UTF-32"); +simdutf_warn_unused result implementation::convert_utf32_to_latin1_with_errors( + const char32_t *buf, size_t len, char *latin1_output) const noexcept { + // ret.first.count is always the position in the buffer, not the number of + // code units written even if finished + std::pair ret = + avx2_convert_utf32_to_latin1_with_errors(buf, len, latin1_output); + if (ret.first.count != len) { + result scalar_res = scalar::utf32_to_latin1::convert_with_errors( + buf + ret.first.count, len - ret.first.count, ret.second); + if (scalar_res.error) { + scalar_res.count += ret.first.count; + return scalar_res; + } else { + ret.second += scalar_res.count; + } + } + ret.first.count = + ret.second - + latin1_output; // Set count to the number of 8-bit code units written + return ret.first; +} - const char *ptr = str; - const char *end = ptr + len; - __m512i byteflip = _mm512_setr_epi64(0x0607040502030001, 0x0e0f0c0d0a0b0809, - 0x0607040502030001, 0x0e0f0c0d0a0b0809, - 0x0607040502030001, 0x0e0f0c0d0a0b0809, - 0x0607040502030001, 0x0e0f0c0d0a0b0809); - OUTPUT *output = dwords; - avx512_utf8_checker checker{}; - /** - * In the main loop, we consume 64 bytes per iteration, - * but we access 64 + 4 bytes. - */ - while (end - ptr >= 4 + 64) { - const __m512i utf8 = _mm512_loadu_si512((const __m512i *)ptr); - bool ascii = checker.check_next_input(utf8); - if (checker.errors()) { - return {ptr, output, false}; // We found an error. +simdutf_warn_unused size_t implementation::convert_valid_utf32_to_latin1( + const char32_t *buf, size_t len, char *latin1_output) const noexcept { + return convert_utf32_to_latin1(buf, len, latin1_output); +} + +simdutf_warn_unused result implementation::convert_utf32_to_utf8_with_errors( + const char32_t *buf, size_t len, char *utf8_output) const noexcept { + // ret.first.count is always the position in the buffer, not the number of + // code units written even if finished + std::pair ret = + haswell::avx2_convert_utf32_to_utf8_with_errors(buf, len, utf8_output); + if (ret.first.count != len) { + result scalar_res = scalar::utf32_to_utf8::convert_with_errors( + buf + ret.first.count, len - ret.first.count, ret.second); + if (scalar_res.error) { + scalar_res.count += ret.first.count; + return scalar_res; + } else { + ret.second += scalar_res.count; } - if (ascii) { - SIMDUTF_ICELAKE_STORE_ASCII(UTF32, utf8, output) - output += 64; - ptr += 64; - continue; + } + ret.first.count = + ret.second - + utf8_output; // Set count to the number of 8-bit code units written + return ret.first; +} + +simdutf_warn_unused size_t implementation::convert_utf16le_to_utf32( + const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { + std::pair ret = + haswell::avx2_convert_utf16_to_utf32(buf, len, + utf32_output); + if (ret.first == nullptr) { + return 0; + } + size_t saved_bytes = ret.second - utf32_output; + if (ret.first != buf + len) { + const size_t scalar_saved_bytes = + scalar::utf16_to_utf32::convert( + ret.first, len - (ret.first - buf), ret.second); + if (scalar_saved_bytes == 0) { + return 0; } - const __m512i lane0 = broadcast_epi128<0>(utf8); - const __m512i lane1 = broadcast_epi128<1>(utf8); - int valid_count0; - __m512i vec0 = expand_and_identify(lane0, lane1, valid_count0); - const __m512i lane2 = broadcast_epi128<2>(utf8); - int valid_count1; - __m512i vec1 = expand_and_identify(lane1, lane2, valid_count1); - if (valid_count0 + valid_count1 <= 16) { - vec0 = _mm512_mask_expand_epi32( - vec0, __mmask16(((1 << valid_count1) - 1) << valid_count0), vec1); - valid_count0 += valid_count1; - vec0 = expand_utf8_to_utf32(vec0); - SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec0, valid_count0, true) - } else { - vec0 = expand_utf8_to_utf32(vec0); - vec1 = expand_utf8_to_utf32(vec1); - SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec0, valid_count0, true) - SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec1, valid_count1, true) + saved_bytes += scalar_saved_bytes; + } + return saved_bytes; +} + +simdutf_warn_unused size_t implementation::convert_utf16be_to_utf32( + const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { + std::pair ret = + haswell::avx2_convert_utf16_to_utf32(buf, len, + utf32_output); + if (ret.first == nullptr) { + return 0; + } + size_t saved_bytes = ret.second - utf32_output; + if (ret.first != buf + len) { + const size_t scalar_saved_bytes = + scalar::utf16_to_utf32::convert( + ret.first, len - (ret.first - buf), ret.second); + if (scalar_saved_bytes == 0) { + return 0; } - const __m512i lane3 = broadcast_epi128<3>(utf8); - int valid_count2; - __m512i vec2 = expand_and_identify(lane2, lane3, valid_count2); - uint32_t tmp1; - ::memcpy(&tmp1, ptr + 64, sizeof(tmp1)); - const __m512i lane4 = _mm512_set1_epi32(tmp1); - int valid_count3; - __m512i vec3 = expand_and_identify(lane3, lane4, valid_count3); - if (valid_count2 + valid_count3 <= 16) { - vec2 = _mm512_mask_expand_epi32( - vec2, __mmask16(((1 << valid_count3) - 1) << valid_count2), vec3); - valid_count2 += valid_count3; - vec2 = expand_utf8_to_utf32(vec2); - SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec2, valid_count2, true) + saved_bytes += scalar_saved_bytes; + } + return saved_bytes; +} + +simdutf_warn_unused result implementation::convert_utf16le_to_utf32_with_errors( + const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { + // ret.first.count is always the position in the buffer, not the number of + // code units written even if finished + std::pair ret = + haswell::avx2_convert_utf16_to_utf32_with_errors( + buf, len, utf32_output); + if (ret.first.error) { + return ret.first; + } // Can return directly since scalar fallback already found correct + // ret.first.count + if (ret.first.count != len) { // All good so far, but not finished + result scalar_res = + scalar::utf16_to_utf32::convert_with_errors( + buf + ret.first.count, len - ret.first.count, ret.second); + if (scalar_res.error) { + scalar_res.count += ret.first.count; + return scalar_res; } else { - vec2 = expand_utf8_to_utf32(vec2); - vec3 = expand_utf8_to_utf32(vec3); - SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec2, valid_count2, true) - SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec3, valid_count3, true) + ret.second += scalar_res.count; } - ptr += 4 * 16; } - const char *validatedptr = ptr; // validated up to ptr + ret.first.count = + ret.second - + utf32_output; // Set count to the number of 8-bit code units written + return ret.first; +} - // For the final pass, we validate 64 bytes, but we only transcode - // 3*16 bytes, so we may end up double-validating 16 bytes. - if (end - ptr >= 64) { - const __m512i utf8 = _mm512_loadu_si512((const __m512i *)ptr); - bool ascii = checker.check_next_input(utf8); - if (checker.errors()) { - return {ptr, output, false}; // We found an error. - } - if (ascii) { - SIMDUTF_ICELAKE_STORE_ASCII(UTF32, utf8, output) - output += 64; - ptr += 64; +simdutf_warn_unused result implementation::convert_utf16be_to_utf32_with_errors( + const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { + // ret.first.count is always the position in the buffer, not the number of + // code units written even if finished + std::pair ret = + haswell::avx2_convert_utf16_to_utf32_with_errors( + buf, len, utf32_output); + if (ret.first.error) { + return ret.first; + } // Can return directly since scalar fallback already found correct + // ret.first.count + if (ret.first.count != len) { // All good so far, but not finished + result scalar_res = + scalar::utf16_to_utf32::convert_with_errors( + buf + ret.first.count, len - ret.first.count, ret.second); + if (scalar_res.error) { + scalar_res.count += ret.first.count; + return scalar_res; } else { - const __m512i lane0 = broadcast_epi128<0>(utf8); - const __m512i lane1 = broadcast_epi128<1>(utf8); - int valid_count0; - __m512i vec0 = expand_and_identify(lane0, lane1, valid_count0); - const __m512i lane2 = broadcast_epi128<2>(utf8); - int valid_count1; - __m512i vec1 = expand_and_identify(lane1, lane2, valid_count1); - if (valid_count0 + valid_count1 <= 16) { - vec0 = _mm512_mask_expand_epi32( - vec0, __mmask16(((1 << valid_count1) - 1) << valid_count0), vec1); - valid_count0 += valid_count1; - vec0 = expand_utf8_to_utf32(vec0); - SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec0, valid_count0, true) - } else { - vec0 = expand_utf8_to_utf32(vec0); - vec1 = expand_utf8_to_utf32(vec1); - SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec0, valid_count0, true) - SIMDUTF_ICELAKE_WRITE_UTF16_OR_UTF32(vec1, valid_count1, true) - } + ret.second += scalar_res.count; + } + } + ret.first.count = + ret.second - + utf32_output; // Set count to the number of 8-bit code units written + return ret.first; +} - const __m512i lane3 = broadcast_epi128<3>(utf8); - SIMDUTF_ICELAKE_TRANSCODE16(lane2, lane3, true) +simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf8( + const char32_t *buf, size_t len, char *utf8_output) const noexcept { + return convert_utf32_to_utf8(buf, len, utf8_output); +} - ptr += 3 * 16; +simdutf_warn_unused size_t implementation::convert_utf32_to_utf16le( + const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { + std::pair ret = + avx2_convert_utf32_to_utf16(buf, len, utf16_output); + if (ret.first == nullptr) { + return 0; + } + size_t saved_bytes = ret.second - utf16_output; + if (ret.first != buf + len) { + const size_t scalar_saved_bytes = + scalar::utf32_to_utf16::convert( + ret.first, len - (ret.first - buf), ret.second); + if (scalar_saved_bytes == 0) { + return 0; } - validatedptr += 4 * 16; + saved_bytes += scalar_saved_bytes; } - if (end != validatedptr) { - const __m512i utf8 = - _mm512_maskz_loadu_epi8(~UINT64_C(0) >> (64 - (end - validatedptr)), - (const __m512i *)validatedptr); - checker.check_next_input(utf8); + return saved_bytes; +} + +simdutf_warn_unused size_t implementation::convert_utf32_to_utf16be( + const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { + std::pair ret = + avx2_convert_utf32_to_utf16(buf, len, utf16_output); + if (ret.first == nullptr) { + return 0; } - checker.check_eof(); - if (checker.errors()) { - return {ptr, output, false}; // We found an error. + size_t saved_bytes = ret.second - utf16_output; + if (ret.first != buf + len) { + const size_t scalar_saved_bytes = + scalar::utf32_to_utf16::convert( + ret.first, len - (ret.first - buf), ret.second); + if (scalar_saved_bytes == 0) { + return 0; + } + saved_bytes += scalar_saved_bytes; } - return {ptr, output, true}; + return saved_bytes; } -/* end file src/icelake/icelake_from_utf8.inl.cpp */ -/* begin file src/icelake/icelake_convert_utf8_to_latin1.inl.cpp */ -// file included directly -// File contains conversion procedure from possibly invalid UTF-8 strings. - -template -simdutf_really_inline size_t process_block_from_utf8_to_latin1( - const char *buf, size_t len, char *latin_output, __m512i minus64, - __m512i one, __mmask64 *next_leading_ptr, __mmask64 *next_bit6_ptr) { - __mmask64 load_mask = - is_remaining ? _bzhi_u64(~0ULL, (unsigned int)len) : ~0ULL; - __m512i input = _mm512_maskz_loadu_epi8(load_mask, (__m512i *)buf); - __mmask64 nonascii = _mm512_movepi8_mask(input); - if (nonascii == 0) { - if (*next_leading_ptr) { // If we ended with a leading byte, it is an error. - return 0; // Indicates error +simdutf_warn_unused result implementation::convert_utf32_to_utf16le_with_errors( + const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { + // ret.first.count is always the position in the buffer, not the number of + // code units written even if finished + std::pair ret = + haswell::avx2_convert_utf32_to_utf16_with_errors( + buf, len, utf16_output); + if (ret.first.count != len) { + result scalar_res = + scalar::utf32_to_utf16::convert_with_errors( + buf + ret.first.count, len - ret.first.count, ret.second); + if (scalar_res.error) { + scalar_res.count += ret.first.count; + return scalar_res; + } else { + ret.second += scalar_res.count; } - is_remaining - ? _mm512_mask_storeu_epi8((__m512i *)latin_output, load_mask, input) - : _mm512_storeu_si512((__m512i *)latin_output, input); - return len; } + ret.first.count = + ret.second - + utf16_output; // Set count to the number of 8-bit code units written + return ret.first; +} - const __mmask64 leading = _mm512_cmpge_epu8_mask(input, minus64); - - __m512i highbits = _mm512_xor_si512(input, _mm512_set1_epi8(-62)); - __mmask64 invalid_leading_bytes = - _mm512_mask_cmpgt_epu8_mask(leading, highbits, one); - - if (invalid_leading_bytes) { - return 0; // Indicates error +simdutf_warn_unused result implementation::convert_utf32_to_utf16be_with_errors( + const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { + // ret.first.count is always the position in the buffer, not the number of + // code units written even if finished + std::pair ret = + haswell::avx2_convert_utf32_to_utf16_with_errors( + buf, len, utf16_output); + if (ret.first.count != len) { + result scalar_res = + scalar::utf32_to_utf16::convert_with_errors( + buf + ret.first.count, len - ret.first.count, ret.second); + if (scalar_res.error) { + scalar_res.count += ret.first.count; + return scalar_res; + } else { + ret.second += scalar_res.count; + } } + ret.first.count = + ret.second - + utf16_output; // Set count to the number of 8-bit code units written + return ret.first; +} - __mmask64 leading_shift = (leading << 1) | *next_leading_ptr; +simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf16le( + const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { + return convert_utf32_to_utf16le(buf, len, utf16_output); +} - if ((nonascii ^ leading) != leading_shift) { - return 0; // Indicates error - } +simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf16be( + const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { + return convert_utf32_to_utf16be(buf, len, utf16_output); +} - const __mmask64 bit6 = _mm512_cmpeq_epi8_mask(highbits, one); - input = - _mm512_mask_sub_epi8(input, (bit6 << 1) | *next_bit6_ptr, input, minus64); +simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_utf32( + const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { + return convert_utf16le_to_utf32(buf, len, utf32_output); +} - __mmask64 retain = ~leading & load_mask; - __m512i output = _mm512_maskz_compress_epi8(retain, input); - int64_t written_out = count_ones(retain); - if (written_out == 0) { - return 0; // Indicates error - } - *next_bit6_ptr = bit6 >> 63; - *next_leading_ptr = leading >> 63; +simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_utf32( + const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { + return convert_utf16be_to_utf32(buf, len, utf32_output); +} - __mmask64 store_mask = ~UINT64_C(0) >> (64 - written_out); +void implementation::change_endianness_utf16(const char16_t *input, + size_t length, + char16_t *output) const noexcept { + utf16::change_endianness_utf16(input, length, output); +} - _mm512_mask_storeu_epi8((__m512i *)latin_output, store_mask, output); +simdutf_warn_unused size_t implementation::count_utf16le( + const char16_t *input, size_t length) const noexcept { + return utf16::count_code_points(input, length); +} - return written_out; +simdutf_warn_unused size_t implementation::count_utf16be( + const char16_t *input, size_t length) const noexcept { + return utf16::count_code_points(input, length); } -size_t utf8_to_latin1_avx512(const char *&inbuf, size_t len, - char *&inlatin_output) { - const char *buf = inbuf; - char *latin_output = inlatin_output; - char *start = latin_output; - size_t pos = 0; - __m512i minus64 = _mm512_set1_epi8(-64); // 11111111111 ... 1100 0000 - __m512i one = _mm512_set1_epi8(1); - __mmask64 next_leading = 0; - __mmask64 next_bit6 = 0; +simdutf_warn_unused size_t +implementation::count_utf8(const char *input, size_t length) const noexcept { + return utf8::count_code_points(input, length); +} - while (pos + 64 <= len) { - size_t written = process_block_from_utf8_to_latin1( - buf + pos, 64, latin_output, minus64, one, &next_leading, &next_bit6); - if (written == 0) { - inlatin_output = latin_output; - inbuf = buf + pos - next_leading; - return 0; // Indicates error at pos or after, or just before pos (too - // short error) - } - latin_output += written; - pos += 64; - } +simdutf_warn_unused size_t implementation::latin1_length_from_utf8( + const char *buf, size_t len) const noexcept { + return count_utf8(buf, len); +} - if (pos < len) { - size_t remaining = len - pos; - size_t written = process_block_from_utf8_to_latin1( - buf + pos, remaining, latin_output, minus64, one, &next_leading, - &next_bit6); - if (written == 0) { - inbuf = buf + pos - next_leading; - inlatin_output = latin_output; - return 0; // Indicates error at pos or after, or just before pos (too - // short error) - } - latin_output += written; - } - if (next_leading) { - inbuf = buf + len - next_leading; - inlatin_output = latin_output; - return 0; // Indicates error at end of buffer - } - inlatin_output = latin_output; - inbuf += len; - return size_t(latin_output - start); +simdutf_warn_unused size_t +implementation::latin1_length_from_utf16(size_t length) const noexcept { + return scalar::utf16::latin1_length_from_utf16(length); } -/* end file src/icelake/icelake_convert_utf8_to_latin1.inl.cpp */ -/* begin file src/icelake/icelake_convert_valid_utf8_to_latin1.inl.cpp */ -// file included directly -// File contains conversion procedure from valid UTF-8 strings. +simdutf_warn_unused size_t +implementation::latin1_length_from_utf32(size_t length) const noexcept { + return scalar::utf32::latin1_length_from_utf32(length); +} -template -simdutf_really_inline size_t process_valid_block_from_utf8_to_latin1( - const char *buf, size_t len, char *latin_output, __m512i minus64, - __m512i one, __mmask64 *next_leading_ptr, __mmask64 *next_bit6_ptr) { - __mmask64 load_mask = - is_remaining ? _bzhi_u64(~0ULL, (unsigned int)len) : ~0ULL; - __m512i input = _mm512_maskz_loadu_epi8(load_mask, (__m512i *)buf); - __mmask64 nonascii = _mm512_movepi8_mask(input); +simdutf_warn_unused size_t implementation::utf8_length_from_utf16le( + const char16_t *input, size_t length) const noexcept { + return utf16::utf8_length_from_utf16(input, length); +} - if (nonascii == 0) { - is_remaining - ? _mm512_mask_storeu_epi8((__m512i *)latin_output, load_mask, input) - : _mm512_storeu_si512((__m512i *)latin_output, input); - return len; - } +simdutf_warn_unused size_t implementation::utf8_length_from_utf16be( + const char16_t *input, size_t length) const noexcept { + return utf16::utf8_length_from_utf16(input, length); +} - __mmask64 leading = _mm512_cmpge_epu8_mask(input, minus64); +simdutf_warn_unused size_t implementation::utf32_length_from_utf16le( + const char16_t *input, size_t length) const noexcept { + return utf16::utf32_length_from_utf16(input, length); +} - __m512i highbits = _mm512_xor_si512(input, _mm512_set1_epi8(-62)); +simdutf_warn_unused size_t implementation::utf32_length_from_utf16be( + const char16_t *input, size_t length) const noexcept { + return utf16::utf32_length_from_utf16(input, length); +} - *next_leading_ptr = leading >> 63; +simdutf_warn_unused size_t +implementation::utf16_length_from_latin1(size_t length) const noexcept { + return scalar::latin1::utf16_length_from_latin1(length); +} - __mmask64 bit6 = _mm512_cmpeq_epi8_mask(highbits, one); - input = - _mm512_mask_sub_epi8(input, (bit6 << 1) | *next_bit6_ptr, input, minus64); - *next_bit6_ptr = bit6 >> 63; +simdutf_warn_unused size_t implementation::utf16_length_from_utf8( + const char *input, size_t length) const noexcept { + return utf8::utf16_length_from_utf8(input, length); +} - __mmask64 retain = ~leading & load_mask; - __m512i output = _mm512_maskz_compress_epi8(retain, input); - int64_t written_out = count_ones(retain); - if (written_out == 0) { - return 0; // Indicates error +simdutf_warn_unused size_t +implementation::utf32_length_from_latin1(size_t length) const noexcept { + return scalar::latin1::utf32_length_from_latin1(length); +} + +simdutf_warn_unused size_t implementation::utf8_length_from_latin1( + const char *input, size_t len) const noexcept { + const uint8_t *data = reinterpret_cast(input); + size_t answer = len / sizeof(__m256i) * sizeof(__m256i); + size_t i = 0; + if (answer >= 2048) { // long strings optimization + __m256i four_64bits = _mm256_setzero_si256(); + while (i + sizeof(__m256i) <= len) { + __m256i runner = _mm256_setzero_si256(); + // We can do up to 255 loops without overflow. + size_t iterations = (len - i) / sizeof(__m256i); + if (iterations > 255) { + iterations = 255; + } + size_t max_i = i + iterations * sizeof(__m256i) - sizeof(__m256i); + for (; i + 4 * sizeof(__m256i) <= max_i; i += 4 * sizeof(__m256i)) { + __m256i input1 = _mm256_loadu_si256((const __m256i *)(data + i)); + __m256i input2 = + _mm256_loadu_si256((const __m256i *)(data + i + sizeof(__m256i))); + __m256i input3 = _mm256_loadu_si256( + (const __m256i *)(data + i + 2 * sizeof(__m256i))); + __m256i input4 = _mm256_loadu_si256( + (const __m256i *)(data + i + 3 * sizeof(__m256i))); + __m256i input12 = + _mm256_add_epi8(_mm256_cmpgt_epi8(_mm256_setzero_si256(), input1), + _mm256_cmpgt_epi8(_mm256_setzero_si256(), input2)); + __m256i input23 = + _mm256_add_epi8(_mm256_cmpgt_epi8(_mm256_setzero_si256(), input3), + _mm256_cmpgt_epi8(_mm256_setzero_si256(), input4)); + __m256i input1234 = _mm256_add_epi8(input12, input23); + runner = _mm256_sub_epi8(runner, input1234); + } + for (; i <= max_i; i += sizeof(__m256i)) { + __m256i input_256_chunk = + _mm256_loadu_si256((const __m256i *)(data + i)); + runner = _mm256_sub_epi8( + runner, _mm256_cmpgt_epi8(_mm256_setzero_si256(), input_256_chunk)); + } + four_64bits = _mm256_add_epi64( + four_64bits, _mm256_sad_epu8(runner, _mm256_setzero_si256())); + } + answer += _mm256_extract_epi64(four_64bits, 0) + + _mm256_extract_epi64(four_64bits, 1) + + _mm256_extract_epi64(four_64bits, 2) + + _mm256_extract_epi64(four_64bits, 3); + } else if (answer > 0) { + for (; i + sizeof(__m256i) <= len; i += sizeof(__m256i)) { + __m256i latin = _mm256_loadu_si256((const __m256i *)(data + i)); + uint32_t non_ascii = _mm256_movemask_epi8(latin); + answer += count_ones(non_ascii); + } } - __mmask64 store_mask = ~UINT64_C(0) >> (64 - written_out); - // Optimization opportunity: sometimes, masked writes are not needed. - _mm512_mask_storeu_epi8((__m512i *)latin_output, store_mask, output); - return written_out; + return answer + scalar::latin1::utf8_length_from_latin1( + reinterpret_cast(data + i), len - i); } -size_t valid_utf8_to_latin1_avx512(const char *buf, size_t len, - char *latin_output) { - char *start = latin_output; +simdutf_warn_unused size_t implementation::utf8_length_from_utf32( + const char32_t *input, size_t length) const noexcept { + const __m256i v_00000000 = _mm256_setzero_si256(); + const __m256i v_ffffff80 = _mm256_set1_epi32((uint32_t)0xffffff80); + const __m256i v_fffff800 = _mm256_set1_epi32((uint32_t)0xfffff800); + const __m256i v_ffff0000 = _mm256_set1_epi32((uint32_t)0xffff0000); size_t pos = 0; - __m512i minus64 = _mm512_set1_epi8(-64); // 11111111111 ... 1100 0000 - __m512i one = _mm512_set1_epi8(1); - __mmask64 next_leading = 0; - __mmask64 next_bit6 = 0; - - while (pos + 64 <= len) { - size_t written = process_valid_block_from_utf8_to_latin1( - buf + pos, 64, latin_output, minus64, one, &next_leading, &next_bit6); - latin_output += written; - pos += 64; - } + size_t count = 0; + for (; pos + 8 <= length; pos += 8) { + __m256i in = _mm256_loadu_si256((__m256i *)(input + pos)); + const __m256i ascii_bytes_bytemask = + _mm256_cmpeq_epi32(_mm256_and_si256(in, v_ffffff80), v_00000000); + const __m256i one_two_bytes_bytemask = + _mm256_cmpeq_epi32(_mm256_and_si256(in, v_fffff800), v_00000000); + const __m256i two_bytes_bytemask = + _mm256_xor_si256(one_two_bytes_bytemask, ascii_bytes_bytemask); + const __m256i one_two_three_bytes_bytemask = + _mm256_cmpeq_epi32(_mm256_and_si256(in, v_ffff0000), v_00000000); + const __m256i three_bytes_bytemask = + _mm256_xor_si256(one_two_three_bytes_bytemask, one_two_bytes_bytemask); + const uint32_t ascii_bytes_bitmask = + static_cast(_mm256_movemask_epi8(ascii_bytes_bytemask)); + const uint32_t two_bytes_bitmask = + static_cast(_mm256_movemask_epi8(two_bytes_bytemask)); + const uint32_t three_bytes_bitmask = + static_cast(_mm256_movemask_epi8(three_bytes_bytemask)); - if (pos < len) { - size_t remaining = len - pos; - size_t written = process_valid_block_from_utf8_to_latin1( - buf + pos, remaining, latin_output, minus64, one, &next_leading, - &next_bit6); - latin_output += written; + size_t ascii_count = count_ones(ascii_bytes_bitmask) / 4; + size_t two_bytes_count = count_ones(two_bytes_bitmask) / 4; + size_t three_bytes_count = count_ones(three_bytes_bitmask) / 4; + count += 32 - 3 * ascii_count - 2 * two_bytes_count - three_bytes_count; } - - return (size_t)(latin_output - start); + return count + + scalar::utf32::utf8_length_from_utf32(input + pos, length - pos); } -/* end file src/icelake/icelake_convert_valid_utf8_to_latin1.inl.cpp */ -/* begin file src/icelake/icelake_convert_utf16_to_latin1.inl.cpp */ -// file included directly -template -size_t icelake_convert_utf16_to_latin1(const char16_t *buf, size_t len, - char *latin1_output) { - const char16_t *end = buf + len; - __m512i v_0xFF = _mm512_set1_epi16(0xff); - __m512i byteflip = _mm512_setr_epi64(0x0607040502030001, 0x0e0f0c0d0a0b0809, - 0x0607040502030001, 0x0e0f0c0d0a0b0809, - 0x0607040502030001, 0x0e0f0c0d0a0b0809, - 0x0607040502030001, 0x0e0f0c0d0a0b0809); - __m512i shufmask = _mm512_set_epi8( - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 62, 60, 58, 56, 54, 52, 50, 48, 46, 44, 42, 40, 38, - 36, 34, 32, 30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 0); - while (end - buf >= 32) { - __m512i in = _mm512_loadu_si512((__m512i *)buf); - if (big_endian) { - in = _mm512_shuffle_epi8(in, byteflip); - } - if (_mm512_cmpgt_epu16_mask(in, v_0xFF)) { - return 0; - } - _mm256_storeu_si256( - (__m256i *)latin1_output, - _mm512_castsi512_si256(_mm512_permutexvar_epi8(shufmask, in))); - latin1_output += 32; - buf += 32; + +simdutf_warn_unused size_t implementation::utf16_length_from_utf32( + const char32_t *input, size_t length) const noexcept { + const __m256i v_00000000 = _mm256_setzero_si256(); + const __m256i v_ffff0000 = _mm256_set1_epi32((uint32_t)0xffff0000); + size_t pos = 0; + size_t count = 0; + for (; pos + 8 <= length; pos += 8) { + __m256i in = _mm256_loadu_si256((__m256i *)(input + pos)); + const __m256i surrogate_bytemask = + _mm256_cmpeq_epi32(_mm256_and_si256(in, v_ffff0000), v_00000000); + const uint32_t surrogate_bitmask = + static_cast(_mm256_movemask_epi8(surrogate_bytemask)); + size_t surrogate_count = (32 - count_ones(surrogate_bitmask)) / 4; + count += 8 + surrogate_count; } - if (buf < end) { - uint32_t mask(uint32_t(1 << (end - buf)) - 1); - __m512i in = _mm512_maskz_loadu_epi16(mask, buf); - if (big_endian) { - in = _mm512_shuffle_epi8(in, byteflip); + return count + + scalar::utf32::utf16_length_from_utf32(input + pos, length - pos); +} + +simdutf_warn_unused size_t implementation::utf32_length_from_utf8( + const char *input, size_t length) const noexcept { + return utf8::count_code_points(input, length); +} + +simdutf_warn_unused size_t implementation::maximal_binary_length_from_base64( + const char *input, size_t length) const noexcept { + return scalar::base64::maximal_binary_length_from_base64(input, length); +} + +simdutf_warn_unused result implementation::base64_to_binary( + const char *input, size_t length, char *output, base64_options options, + last_chunk_handling_options last_chunk_options) const noexcept { + if (options & base64_url) { + if (options == base64_options::base64_url_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, options, + last_chunk_options); } - if (_mm512_cmpgt_epu16_mask(in, v_0xFF)) { - return 0; + } else { + if (options == base64_options::base64_default_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, + options, last_chunk_options); } - _mm256_mask_storeu_epi8( - latin1_output, mask, - _mm512_castsi512_si256(_mm512_permutexvar_epi8(shufmask, in))); } - return len; } -template -std::pair -icelake_convert_utf16_to_latin1_with_errors(const char16_t *buf, size_t len, - char *latin1_output) { - const char16_t *end = buf + len; - const char16_t *start = buf; - __m512i byteflip = _mm512_setr_epi64(0x0607040502030001, 0x0e0f0c0d0a0b0809, - 0x0607040502030001, 0x0e0f0c0d0a0b0809, - 0x0607040502030001, 0x0e0f0c0d0a0b0809, - 0x0607040502030001, 0x0e0f0c0d0a0b0809); - __m512i v_0xFF = _mm512_set1_epi16(0xff); - __m512i shufmask = _mm512_set_epi8( - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 62, 60, 58, 56, 54, 52, 50, 48, 46, 44, 42, 40, 38, - 36, 34, 32, 30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 0); - while (end - buf >= 32) { - __m512i in = _mm512_loadu_si512((__m512i *)buf); - if (big_endian) { - in = _mm512_shuffle_epi8(in, byteflip); +simdutf_warn_unused full_result implementation::base64_to_binary_details( + const char *input, size_t length, char *output, base64_options options, + last_chunk_handling_options last_chunk_options) const noexcept { + if (options & base64_url) { + if (options == base64_options::base64_url_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, options, + last_chunk_options); } - if (_mm512_cmpgt_epu16_mask(in, v_0xFF)) { - uint16_t word; - while ((word = (big_endian ? scalar::utf16::swap_bytes(uint16_t(*buf)) - : uint16_t(*buf))) <= 0xff) { - *latin1_output++ = uint8_t(word); - buf++; - } - return std::make_pair(result(error_code::TOO_LARGE, buf - start), - latin1_output); + } else { + if (options == base64_options::base64_default_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, + options, last_chunk_options); } - _mm256_storeu_si256( - (__m256i *)latin1_output, - _mm512_castsi512_si256(_mm512_permutexvar_epi8(shufmask, in))); - latin1_output += 32; - buf += 32; } - if (buf < end) { - uint32_t mask(uint32_t(1 << (end - buf)) - 1); - __m512i in = _mm512_maskz_loadu_epi16(mask, buf); - if (big_endian) { - in = _mm512_shuffle_epi8(in, byteflip); - } - if (_mm512_cmpgt_epu16_mask(in, v_0xFF)) { +} - uint16_t word; - while ((word = (big_endian ? scalar::utf16::swap_bytes(uint16_t(*buf)) - : uint16_t(*buf))) <= 0xff) { - *latin1_output++ = uint8_t(word); - buf++; - } - return std::make_pair(result(error_code::TOO_LARGE, buf - start), - latin1_output); +simdutf_warn_unused size_t implementation::maximal_binary_length_from_base64( + const char16_t *input, size_t length) const noexcept { + return scalar::base64::maximal_binary_length_from_base64(input, length); +} + +simdutf_warn_unused result implementation::base64_to_binary( + const char16_t *input, size_t length, char *output, base64_options options, + last_chunk_handling_options last_chunk_options) const noexcept { + if (options & base64_url) { + if (options == base64_options::base64_url_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } + } else { + if (options == base64_options::base64_default_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, + options, last_chunk_options); } - _mm256_mask_storeu_epi8( - latin1_output, mask, - _mm512_castsi512_si256(_mm512_permutexvar_epi8(shufmask, in))); } - return std::make_pair(result(error_code::SUCCESS, len), latin1_output); } -/* end file src/icelake/icelake_convert_utf16_to_latin1.inl.cpp */ -/* begin file src/icelake/icelake_convert_utf16_to_utf8.inl.cpp */ -// file included directly - -/** - * This function converts the input (inbuf, inlen), assumed to be valid - * UTF16 (little endian) into UTF-8 (to outbuf). The number of code units - * written is written to 'outlen' and the function reports the number of input - * word consumed. - */ -template -size_t utf16_to_utf8_avx512i(const char16_t *inbuf, size_t inlen, - unsigned char *outbuf, size_t *outlen) { - __m512i in; - __mmask32 inmask = _cvtu32_mask32(0x7fffffff); - __m512i byteflip = _mm512_setr_epi64(0x0607040502030001, 0x0e0f0c0d0a0b0809, - 0x0607040502030001, 0x0e0f0c0d0a0b0809, - 0x0607040502030001, 0x0e0f0c0d0a0b0809, - 0x0607040502030001, 0x0e0f0c0d0a0b0809); - const char16_t *const inbuf_orig = inbuf; - const unsigned char *const outbuf_orig = outbuf; - int adjust = 0; - int carry = 0; - while (inlen >= 32) { - in = _mm512_loadu_si512(inbuf); - if (big_endian) { - in = _mm512_shuffle_epi8(in, byteflip); +simdutf_warn_unused full_result implementation::base64_to_binary_details( + const char16_t *input, size_t length, char *output, base64_options options, + last_chunk_handling_options last_chunk_options) const noexcept { + if (options & base64_url) { + if (options == base64_options::base64_url_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, options, + last_chunk_options); } - inlen -= 31; - lastiteration: - inbuf += 31; + } else { + if (options == base64_options::base64_default_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, + options, last_chunk_options); + } + } +} - failiteration: - const __mmask32 is234byte = _mm512_mask_cmp_epu16_mask( - inmask, in, _mm512_set1_epi16(0x0080), _MM_CMPINT_NLT); +simdutf_warn_unused size_t implementation::base64_length_from_binary( + size_t length, base64_options options) const noexcept { + return scalar::base64::base64_length_from_binary(length, options); +} - if (_ktestz_mask32_u8(inmask, is234byte)) { - // fast path for ASCII only - _mm512_mask_cvtepi16_storeu_epi8(outbuf, inmask, in); - outbuf += 31; - carry = 0; +size_t implementation::binary_to_base64(const char *input, size_t length, + char *output, + base64_options options) const noexcept { + if (options & base64_url) { + return encode_base64(output, input, length, options); + } else { + return encode_base64(output, input, length, options); + } +} +} // namespace haswell +} // namespace simdutf - if (inlen < 32) { - goto tail; - } else { - continue; - } - } +/* begin file src/simdutf/haswell/end.h */ +#if SIMDUTF_CAN_ALWAYS_RUN_HASWELL +// nothing needed. +#else +SIMDUTF_UNTARGET_REGION +#endif - const __mmask32 is12byte = - _mm512_cmp_epu16_mask(in, _mm512_set1_epi16(0x0800), _MM_CMPINT_LT); - if (_ktestc_mask32_u8(is12byte, inmask)) { - // fast path for 1 and 2 byte only +#if SIMDUTF_GCC11ORMORE // workaround for + // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105593 +SIMDUTF_POP_DISABLE_WARNINGS +#endif // end of workaround +/* end file src/simdutf/haswell/end.h */ +/* end file src/haswell/implementation.cpp */ +#endif +#if SIMDUTF_IMPLEMENTATION_PPC64 +/* begin file src/ppc64/implementation.cpp */ - const __m512i twobytes = _mm512_ternarylogic_epi32( - _mm512_slli_epi16(in, 8), _mm512_srli_epi16(in, 6), - _mm512_set1_epi16(0x3f3f), 0xa8); // (A|B)&C - in = _mm512_mask_add_epi16(in, is234byte, twobytes, - _mm512_set1_epi16(int16_t(0x80c0))); - const __m512i cmpmask = - _mm512_mask_blend_epi16(inmask, _mm512_set1_epi16(int16_t(0xffff)), - _mm512_set1_epi16(0x0800)); - const __mmask64 smoosh = - _mm512_cmp_epu8_mask(in, cmpmask, _MM_CMPINT_NLT); - const __m512i out = _mm512_maskz_compress_epi8(smoosh, in); - _mm512_mask_storeu_epi8(outbuf, - _cvtu64_mask64(_pext_u64(_cvtmask64_u64(smoosh), - _cvtmask64_u64(smoosh))), - out); - outbuf += 31 + _mm_popcnt_u32(_cvtmask32_u32(is234byte)); - carry = 0; - if (inlen < 32) { - goto tail; - } else { - continue; - } - } - __m512i lo = _mm512_cvtepu16_epi32(_mm512_castsi512_si256(in)); - __m512i hi = _mm512_cvtepu16_epi32(_mm512_extracti32x8_epi32(in, 1)); - __m512i taglo = _mm512_set1_epi32(0x8080e000); - __m512i taghi = taglo; - const __m512i fc00masked = - _mm512_and_epi32(in, _mm512_set1_epi16(int16_t(0xfc00))); - const __mmask32 hisurr = _mm512_mask_cmp_epu16_mask( - inmask, fc00masked, _mm512_set1_epi16(int16_t(0xd800)), _MM_CMPINT_EQ); - const __mmask32 losurr = _mm512_cmp_epu16_mask( - fc00masked, _mm512_set1_epi16(int16_t(0xdc00)), _MM_CMPINT_EQ); - int carryout = 0; - if (!_kortestz_mask32_u8(hisurr, losurr)) { - // handle surrogates +/* begin file src/simdutf/ppc64/begin.h */ +// redefining SIMDUTF_IMPLEMENTATION to "ppc64" +// #define SIMDUTF_IMPLEMENTATION ppc64 +/* end file src/simdutf/ppc64/begin.h */ +namespace simdutf { +namespace ppc64 { +namespace { +#ifndef SIMDUTF_PPC64_H + #error "ppc64.h must be included" +#endif +using namespace simd; - __m512i los = _mm512_alignr_epi32(hi, lo, 1); - __m512i his = _mm512_alignr_epi32(lo, hi, 1); +simdutf_really_inline bool is_ascii(const simd8x64 &input) { + // careful: 0x80 is not ascii. + return input.reduce_or().saturating_sub(0b01111111u).bits_not_set_anywhere(); +} - const __mmask32 hisurrhi = _kshiftri_mask32(hisurr, 16); - taglo = _mm512_mask_mov_epi32(taglo, __mmask16(hisurr), - _mm512_set1_epi32(0x808080f0)); - taghi = _mm512_mask_mov_epi32(taghi, __mmask16(hisurrhi), - _mm512_set1_epi32(0x808080f0)); +simdutf_unused simdutf_really_inline simd8 +must_be_continuation(const simd8 prev1, const simd8 prev2, + const simd8 prev3) { + simd8 is_second_byte = + prev1.saturating_sub(0b11000000u - 1); // Only 11______ will be > 0 + simd8 is_third_byte = + prev2.saturating_sub(0b11100000u - 1); // Only 111_____ will be > 0 + simd8 is_fourth_byte = + prev3.saturating_sub(0b11110000u - 1); // Only 1111____ will be > 0 + // Caller requires a bool (all 1's). All values resulting from the subtraction + // will be <= 64, so signed comparison is fine. + return simd8(is_second_byte | is_third_byte | is_fourth_byte) > + int8_t(0); +} - lo = _mm512_mask_slli_epi32(lo, __mmask16(hisurr), lo, 10); - hi = _mm512_mask_slli_epi32(hi, __mmask16(hisurrhi), hi, 10); - los = _mm512_add_epi32(los, _mm512_set1_epi32(0xfca02400)); - his = _mm512_add_epi32(his, _mm512_set1_epi32(0xfca02400)); - lo = _mm512_mask_add_epi32(lo, __mmask16(hisurr), lo, los); - hi = _mm512_mask_add_epi32(hi, __mmask16(hisurrhi), hi, his); +simdutf_really_inline simd8 +must_be_2_3_continuation(const simd8 prev2, + const simd8 prev3) { + simd8 is_third_byte = + prev2.saturating_sub(0xe0u - 0x80); // Only 111_____ will be >= 0x80 + simd8 is_fourth_byte = + prev3.saturating_sub(0xf0u - 0x80); // Only 1111____ will be >= 0x80 + // Caller requires a bool (all 1's). All values resulting from the subtraction + // will be <= 64, so signed comparison is fine. + return simd8(is_third_byte | is_fourth_byte); +} - carryout = _cvtu32_mask32(_kshiftri_mask32(hisurr, 30)); +} // unnamed namespace +} // namespace ppc64 +} // namespace simdutf - const uint32_t h = _cvtmask32_u32(hisurr); - const uint32_t l = _cvtmask32_u32(losurr); - // check for mismatched surrogates - if ((h + h + carry) ^ l) { - const uint32_t lonohi = l & ~(h + h + carry); - const uint32_t hinolo = h & ~(l >> 1); - inlen = _tzcnt_u32(hinolo | lonohi); - inmask = __mmask32(0x7fffffff & ((1U << inlen) - 1)); - in = _mm512_maskz_mov_epi16(inmask, in); - adjust = (int)inlen - 31; - inlen = 0; - goto failiteration; - } - } +/* begin file src/generic/buf_block_reader.h */ +namespace simdutf { +namespace ppc64 { +namespace { - hi = _mm512_maskz_mov_epi32(_cvtu32_mask16(0x7fff), hi); - carry = carryout; +// Walks through a buffer in block-sized increments, loading the last part with +// spaces +template struct buf_block_reader { +public: + simdutf_really_inline buf_block_reader(const uint8_t *_buf, size_t _len); + simdutf_really_inline size_t block_index(); + simdutf_really_inline bool has_full_block() const; + simdutf_really_inline const uint8_t *full_block() const; + /** + * Get the last block, padded with spaces. + * + * There will always be a last block, with at least 1 byte, unless len == 0 + * (in which case this function fills the buffer with spaces and returns 0. In + * particular, if len == STEP_SIZE there will be 0 full_blocks and 1 remainder + * block with STEP_SIZE bytes and no spaces for padding. + * + * @return the number of effective characters in the last block. + */ + simdutf_really_inline size_t get_remainder(uint8_t *dst) const; + simdutf_really_inline void advance(); - __m512i mslo = - _mm512_multishift_epi64_epi8(_mm512_set1_epi64(0x20262c3200060c12), lo); +private: + const uint8_t *buf; + const size_t len; + const size_t lenminusstep; + size_t idx; +}; - __m512i mshi = - _mm512_multishift_epi64_epi8(_mm512_set1_epi64(0x20262c3200060c12), hi); +// Routines to print masks and text for debugging bitmask operations +simdutf_unused static char *format_input_text_64(const uint8_t *text) { + static char *buf = + reinterpret_cast(malloc(sizeof(simd8x64) + 1)); + for (size_t i = 0; i < sizeof(simd8x64); i++) { + buf[i] = int8_t(text[i]) < ' ' ? '_' : int8_t(text[i]); + } + buf[sizeof(simd8x64)] = '\0'; + return buf; +} - const __mmask32 outmask = __mmask32(_kandn_mask64(losurr, inmask)); - const __mmask64 outmhi = _kshiftri_mask64(outmask, 16); +// Routines to print masks and text for debugging bitmask operations +simdutf_unused static char *format_input_text(const simd8x64 &in) { + static char *buf = + reinterpret_cast(malloc(sizeof(simd8x64) + 1)); + in.store(reinterpret_cast(buf)); + for (size_t i = 0; i < sizeof(simd8x64); i++) { + if (buf[i] < ' ') { + buf[i] = '_'; + } + } + buf[sizeof(simd8x64)] = '\0'; + return buf; +} - const __mmask32 is1byte = __mmask32(_knot_mask64(is234byte)); - const __mmask64 is1bhi = _kshiftri_mask64(is1byte, 16); - const __mmask64 is12bhi = _kshiftri_mask64(is12byte, 16); +simdutf_unused static char *format_mask(uint64_t mask) { + static char *buf = reinterpret_cast(malloc(64 + 1)); + for (size_t i = 0; i < 64; i++) { + buf[i] = (mask & (size_t(1) << i)) ? 'X' : ' '; + } + buf[64] = '\0'; + return buf; +} - taglo = _mm512_mask_mov_epi32(taglo, __mmask16(is12byte), - _mm512_set1_epi32(0x80c00000)); - taghi = _mm512_mask_mov_epi32(taghi, __mmask16(is12bhi), - _mm512_set1_epi32(0x80c00000)); - __m512i magiclo = _mm512_mask_blend_epi32(__mmask16(outmask), - _mm512_set1_epi32(0xffffffff), - _mm512_set1_epi32(0x00010101)); - __m512i magichi = _mm512_mask_blend_epi32(__mmask16(outmhi), - _mm512_set1_epi32(0xffffffff), - _mm512_set1_epi32(0x00010101)); +template +simdutf_really_inline +buf_block_reader::buf_block_reader(const uint8_t *_buf, size_t _len) + : buf{_buf}, len{_len}, lenminusstep{len < STEP_SIZE ? 0 : len - STEP_SIZE}, + idx{0} {} - magiclo = _mm512_mask_blend_epi32(__mmask16(outmask), - _mm512_set1_epi32(0xffffffff), - _mm512_set1_epi32(0x00010101)); - magichi = _mm512_mask_blend_epi32(__mmask16(outmhi), - _mm512_set1_epi32(0xffffffff), - _mm512_set1_epi32(0x00010101)); +template +simdutf_really_inline size_t buf_block_reader::block_index() { + return idx; +} - mslo = _mm512_ternarylogic_epi32(mslo, _mm512_set1_epi32(0x3f3f3f3f), taglo, - 0xea); // A&B|C - mshi = _mm512_ternarylogic_epi32(mshi, _mm512_set1_epi32(0x3f3f3f3f), taghi, - 0xea); - mslo = _mm512_mask_slli_epi32(mslo, __mmask16(is1byte), lo, 24); +template +simdutf_really_inline bool buf_block_reader::has_full_block() const { + return idx < lenminusstep; +} - mshi = _mm512_mask_slli_epi32(mshi, __mmask16(is1bhi), hi, 24); +template +simdutf_really_inline const uint8_t * +buf_block_reader::full_block() const { + return &buf[idx]; +} - const __mmask64 wantlo = - _mm512_cmp_epu8_mask(mslo, magiclo, _MM_CMPINT_NLT); - const __mmask64 wanthi = - _mm512_cmp_epu8_mask(mshi, magichi, _MM_CMPINT_NLT); - const __m512i outlo = _mm512_maskz_compress_epi8(wantlo, mslo); - const __m512i outhi = _mm512_maskz_compress_epi8(wanthi, mshi); - const uint64_t wantlo_uint64 = _cvtmask64_u64(wantlo); - const uint64_t wanthi_uint64 = _cvtmask64_u64(wanthi); +template +simdutf_really_inline size_t +buf_block_reader::get_remainder(uint8_t *dst) const { + if (len == idx) { + return 0; + } // memcpy(dst, null, 0) will trigger an error with some sanitizers + std::memset(dst, 0x20, + STEP_SIZE); // std::memset STEP_SIZE because it is more efficient + // to write out 8 or 16 bytes at once. + std::memcpy(dst, buf + idx, len - idx); + return len - idx; +} - uint64_t advlo = _mm_popcnt_u64(wantlo_uint64); - uint64_t advhi = _mm_popcnt_u64(wanthi_uint64); +template +simdutf_really_inline void buf_block_reader::advance() { + idx += STEP_SIZE; +} - _mm512_mask_storeu_epi8( - outbuf, _cvtu64_mask64(_pext_u64(wantlo_uint64, wantlo_uint64)), outlo); - _mm512_mask_storeu_epi8( - outbuf + advlo, _cvtu64_mask64(_pext_u64(wanthi_uint64, wanthi_uint64)), - outhi); - outbuf += advlo + advhi; - } - outbuf += -adjust; +} // unnamed namespace +} // namespace ppc64 +} // namespace simdutf +/* end file src/generic/buf_block_reader.h */ +/* begin file src/generic/utf8_validation/utf8_lookup4_algorithm.h */ +namespace simdutf { +namespace ppc64 { +namespace { +namespace utf8_validation { -tail: - if (inlen != 0) { - // We must have inlen < 31. - inmask = _cvtu32_mask32((1U << inlen) - 1); - in = _mm512_maskz_loadu_epi16(inmask, inbuf); - if (big_endian) { - in = _mm512_shuffle_epi8(in, byteflip); - } - adjust = (int)inlen - 31; - inlen = 0; - goto lastiteration; - } - *outlen = (outbuf - outbuf_orig) + adjust; - return ((inbuf - inbuf_orig) + adjust); -} -/* end file src/icelake/icelake_convert_utf16_to_utf8.inl.cpp */ -/* begin file src/icelake/icelake_convert_utf16_to_utf32.inl.cpp */ -// file included directly +using namespace simd; -/* - Returns a pair: the first unprocessed byte from buf and utf32_output - A scalar routing should carry on the conversion of the tail. -*/ -template -std::tuple -convert_utf16_to_utf32(const char16_t *buf, size_t len, - char32_t *utf32_output) { - const char16_t *end = buf + len; - const __m512i v_fc00 = _mm512_set1_epi16((uint16_t)0xfc00); - const __m512i v_d800 = _mm512_set1_epi16((uint16_t)0xd800); - const __m512i v_dc00 = _mm512_set1_epi16((uint16_t)0xdc00); - __mmask32 carry{0}; - const __m512i byteflip = _mm512_setr_epi64( - 0x0607040502030001, 0x0e0f0c0d0a0b0809, 0x0607040502030001, - 0x0e0f0c0d0a0b0809, 0x0607040502030001, 0x0e0f0c0d0a0b0809, - 0x0607040502030001, 0x0e0f0c0d0a0b0809); - while (std::distance(buf, end) >= 32) { - // Always safe because buf + 32 <= end so that end - buf >= 32 bytes: - __m512i in = _mm512_loadu_si512((__m512i *)buf); - if (big_endian) { - in = _mm512_shuffle_epi8(in, byteflip); - } +simdutf_really_inline simd8 +check_special_cases(const simd8 input, const simd8 prev1) { + // Bit 0 = Too Short (lead byte/ASCII followed by lead byte/ASCII) + // Bit 1 = Too Long (ASCII followed by continuation) + // Bit 2 = Overlong 3-byte + // Bit 4 = Surrogate + // Bit 5 = Overlong 2-byte + // Bit 7 = Two Continuations + constexpr const uint8_t TOO_SHORT = 1 << 0; // 11______ 0_______ + // 11______ 11______ + constexpr const uint8_t TOO_LONG = 1 << 1; // 0_______ 10______ + constexpr const uint8_t OVERLONG_3 = 1 << 2; // 11100000 100_____ + constexpr const uint8_t SURROGATE = 1 << 4; // 11101101 101_____ + constexpr const uint8_t OVERLONG_2 = 1 << 5; // 1100000_ 10______ + constexpr const uint8_t TWO_CONTS = 1 << 7; // 10______ 10______ + constexpr const uint8_t TOO_LARGE = 1 << 3; // 11110100 1001____ + // 11110100 101_____ + // 11110101 1001____ + // 11110101 101_____ + // 1111011_ 1001____ + // 1111011_ 101_____ + // 11111___ 1001____ + // 11111___ 101_____ + constexpr const uint8_t TOO_LARGE_1000 = 1 << 6; + // 11110101 1000____ + // 1111011_ 1000____ + // 11111___ 1000____ + constexpr const uint8_t OVERLONG_4 = 1 << 6; // 11110000 1000____ - // H - bitmask for high surrogates - const __mmask32 H = - _mm512_cmpeq_epi16_mask(_mm512_and_si512(in, v_fc00), v_d800); - // H - bitmask for low surrogates - const __mmask32 L = - _mm512_cmpeq_epi16_mask(_mm512_and_si512(in, v_fc00), v_dc00); + const simd8 byte_1_high = prev1.shr<4>().lookup_16( + // 0_______ ________ + TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, + TOO_LONG, + // 10______ ________ + TWO_CONTS, TWO_CONTS, TWO_CONTS, TWO_CONTS, + // 1100____ ________ + TOO_SHORT | OVERLONG_2, + // 1101____ ________ + TOO_SHORT, + // 1110____ ________ + TOO_SHORT | OVERLONG_3 | SURROGATE, + // 1111____ ________ + TOO_SHORT | TOO_LARGE | TOO_LARGE_1000 | OVERLONG_4); + constexpr const uint8_t CARRY = + TOO_SHORT | TOO_LONG | TWO_CONTS; // These all have ____ in byte 1 . + const simd8 byte_1_low = + (prev1 & 0x0F) + .lookup_16( + // ____0000 ________ + CARRY | OVERLONG_3 | OVERLONG_2 | OVERLONG_4, + // ____0001 ________ + CARRY | OVERLONG_2, + // ____001_ ________ + CARRY, CARRY, - if ((H | L)) { - // surrogate pair(s) in a register - const __mmask32 V = - (L ^ - (carry | (H << 1))); // A high surrogate must be followed by low one - // and a low one must be preceded by a high one. - // If valid, V should be equal to 0 + // ____0100 ________ + CARRY | TOO_LARGE, + // ____0101 ________ + CARRY | TOO_LARGE | TOO_LARGE_1000, + // ____011_ ________ + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, - if (V == 0) { - // valid case - /* - Input surrogate pair: - |1101.11aa.aaaa.aaaa|1101.10bb.bbbb.bbbb| - low surrogate high surrogate - */ - /* 1. Expand all code units to 32-bit code units - in - |0000.0000.0000.0000.1101.11aa.aaaa.aaaa|0000.0000.0000.0000.1101.10bb.bbbb.bbbb| - */ - const __m512i first = _mm512_cvtepu16_epi32(_mm512_castsi512_si256(in)); - const __m512i second = - _mm512_cvtepu16_epi32(_mm512_extracti32x8_epi32(in, 1)); + // ____1___ ________ + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + // ____1101 ________ + CARRY | TOO_LARGE | TOO_LARGE_1000 | SURROGATE, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000); + const simd8 byte_2_high = input.shr<4>().lookup_16( + // ________ 0_______ + TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, + TOO_SHORT, TOO_SHORT, - /* 2. Shift by one 16-bit word to align low surrogates with high - surrogates in - |0000.0000.0000.0000.1101.11aa.aaaa.aaaa|0000.0000.0000.0000.1101.10bb.bbbb.bbbb| - shifted - |????.????.????.????.????.????.????.????|0000.0000.0000.0000.1101.11aa.aaaa.aaaa| - */ - const __m512i shifted_first = _mm512_alignr_epi32(second, first, 1); - const __m512i shifted_second = - _mm512_alignr_epi32(_mm512_setzero_si512(), second, 1); + // ________ 1000____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE_1000 | + OVERLONG_4, + // ________ 1001____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE, + // ________ 101_____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, + TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, - /* 3. Align all high surrogates in first and second by shifting to the - left by 10 bits - |0000.0000.0000.0000.1101.11aa.aaaa.aaaa|0000.0011.0110.bbbb.bbbb.bb00.0000.0000| - */ - const __m512i aligned_first = - _mm512_mask_slli_epi32(first, (__mmask16)H, first, 10); - const __m512i aligned_second = - _mm512_mask_slli_epi32(second, (__mmask16)(H >> 16), second, 10); + // ________ 11______ + TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT); + return (byte_1_high & byte_1_low & byte_2_high); +} +simdutf_really_inline simd8 +check_multibyte_lengths(const simd8 input, + const simd8 prev_input, + const simd8 sc) { + simd8 prev2 = input.prev<2>(prev_input); + simd8 prev3 = input.prev<3>(prev_input); + simd8 must23 = + simd8(must_be_2_3_continuation(prev2, prev3)); + simd8 must23_80 = must23 & uint8_t(0x80); + return must23_80 ^ sc; +} - /* 4. Remove surrogate prefixes and add offset 0x10000 by adding in, - shifted and constant in - |0000.0000.0000.0000.1101.11aa.aaaa.aaaa|0000.0011.0110.bbbb.bbbb.bb00.0000.0000| - shifted - |????.????.????.????.????.????.????.????|0000.0000.0000.0000.1101.11aa.aaaa.aaaa| - constant|1111.1100.1010.0000.0010.0100.0000.0000|1111.1100.1010.0000.0010.0100.0000.0000| - */ - const __m512i constant = _mm512_set1_epi32((uint32_t)0xfca02400); - const __m512i added_first = _mm512_mask_add_epi32( - aligned_first, (__mmask16)H, aligned_first, shifted_first); - const __m512i utf32_first = _mm512_mask_add_epi32( - added_first, (__mmask16)H, added_first, constant); +// +// Return nonzero if there are incomplete multibyte characters at the end of the +// block: e.g. if there is a 4-byte character, but it is 3 bytes from the end. +// +simdutf_really_inline simd8 is_incomplete(const simd8 input) { + // If the previous input's last 3 bytes match this, they're too short (they + // ended at EOF): + // ... 1111____ 111_____ 11______ + static const uint8_t max_array[32] = {255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 0b11110000u - 1, + 0b11100000u - 1, + 0b11000000u - 1}; + const simd8 max_value( + &max_array[sizeof(max_array) - sizeof(simd8)]); + return input.gt_bits(max_value); +} - const __m512i added_second = - _mm512_mask_add_epi32(aligned_second, (__mmask16)(H >> 16), - aligned_second, shifted_second); - const __m512i utf32_second = _mm512_mask_add_epi32( - added_second, (__mmask16)(H >> 16), added_second, constant); +struct utf8_checker { + // If this is nonzero, there has been a UTF-8 error. + simd8 error; + // The last input we received + simd8 prev_input_block; + // Whether the last input we received was incomplete (used for ASCII fast + // path) + simd8 prev_incomplete; - // 5. Store all valid UTF-32 code units (low surrogate positions and - // 32nd word are invalid) - const __mmask32 valid = ~L & 0x7fffffff; - // We deliberately do a _mm512_maskz_compress_epi32 followed by - // storeu_epi32 to ease performance portability to Zen 4. - const __m512i compressed_first = - _mm512_maskz_compress_epi32((__mmask16)(valid), utf32_first); - const size_t howmany1 = count_ones((uint16_t)(valid)); - _mm512_storeu_si512((__m512i *)utf32_output, compressed_first); - utf32_output += howmany1; - const __m512i compressed_second = - _mm512_maskz_compress_epi32((__mmask16)(valid >> 16), utf32_second); - const size_t howmany2 = count_ones((uint16_t)(valid >> 16)); - // The following could be unsafe in some cases? - //_mm512_storeu_epi32((__m512i *) utf32_output, compressed_second); - _mm512_mask_storeu_epi32((__m512i *)utf32_output, - __mmask16((1 << howmany2) - 1), - compressed_second); - utf32_output += howmany2; - // Only process 31 code units, but keep track if the 31st word is a high - // surrogate as a carry - buf += 31; - carry = (H >> 30) & 0x1; - } else { - // invalid case - return std::make_tuple(buf + carry, utf32_output, false); - } - } else { - // no surrogates - // extend all thirty-two 16-bit code units to thirty-two 32-bit code units - _mm512_storeu_si512((__m512i *)(utf32_output), - _mm512_cvtepu16_epi32(_mm512_castsi512_si256(in))); - _mm512_storeu_si512( - (__m512i *)(utf32_output) + 1, - _mm512_cvtepu16_epi32(_mm512_extracti32x8_epi32(in, 1))); - utf32_output += 32; - buf += 32; - carry = 0; - } - } // while - return std::make_tuple(buf + carry, utf32_output, true); -} -/* end file src/icelake/icelake_convert_utf16_to_utf32.inl.cpp */ -/* begin file src/icelake/icelake_convert_utf32_to_latin1.inl.cpp */ -// file included directly -size_t icelake_convert_utf32_to_latin1(const char32_t *buf, size_t len, - char *latin1_output) { - const char32_t *end = buf + len; - __m512i v_0xFF = _mm512_set1_epi32(0xff); - __m512i shufmask = _mm512_set_epi8( - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, - 56, 52, 48, 44, 40, 36, 32, 28, 24, 20, 16, 12, 8, 4, 0); - while (end - buf >= 16) { - __m512i in = _mm512_loadu_si512((__m512i *)buf); - if (_mm512_cmpgt_epu32_mask(in, v_0xFF)) { - return 0; - } - _mm_storeu_si128( - (__m128i *)latin1_output, - _mm512_castsi512_si128(_mm512_permutexvar_epi8(shufmask, in))); - latin1_output += 16; - buf += 16; + // + // Check whether the current bytes are valid UTF-8. + // + simdutf_really_inline void check_utf8_bytes(const simd8 input, + const simd8 prev_input) { + // Flip prev1...prev3 so we can easily determine if they are 2+, 3+ or 4+ + // lead bytes (2, 3, 4-byte leads become large positive numbers instead of + // small negative numbers) + simd8 prev1 = input.prev<1>(prev_input); + simd8 sc = check_special_cases(input, prev1); + this->error |= check_multibyte_lengths(input, prev_input, sc); } - if (buf < end) { - uint16_t mask = uint16_t((1 << (end - buf)) - 1); - __m512i in = _mm512_maskz_loadu_epi32(mask, buf); - if (_mm512_cmpgt_epu32_mask(in, v_0xFF)) { - return 0; - } - _mm_mask_storeu_epi8( - latin1_output, mask, - _mm512_castsi512_si128(_mm512_permutexvar_epi8(shufmask, in))); + + // The only problem that can happen at EOF is that a multibyte character is + // too short or a byte value too large in the last bytes: check_special_cases + // only checks for bytes too large in the first of two bytes. + simdutf_really_inline void check_eof() { + // If the previous block had incomplete UTF-8 characters at the end, an + // ASCII block can't possibly finish them. + this->error |= this->prev_incomplete; } - return len; -} -std::pair -icelake_convert_utf32_to_latin1_with_errors(const char32_t *buf, size_t len, - char *latin1_output) { - const char32_t *end = buf + len; - const char32_t *start = buf; - __m512i v_0xFF = _mm512_set1_epi32(0xff); - __m512i shufmask = _mm512_set_epi8( - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, - 56, 52, 48, 44, 40, 36, 32, 28, 24, 20, 16, 12, 8, 4, 0); - while (end - buf >= 16) { - __m512i in = _mm512_loadu_si512((__m512i *)buf); - if (_mm512_cmpgt_epu32_mask(in, v_0xFF)) { - while (uint32_t(*buf) <= 0xff) { - *latin1_output++ = uint8_t(*buf++); + simdutf_really_inline void check_next_input(const simd8x64 &input) { + if (simdutf_likely(is_ascii(input))) { + this->error |= this->prev_incomplete; + } else { + // you might think that a for-loop would work, but under Visual Studio, it + // is not good enough. + static_assert((simd8x64::NUM_CHUNKS == 2) || + (simd8x64::NUM_CHUNKS == 4), + "We support either two or four chunks per 64-byte block."); + if (simd8x64::NUM_CHUNKS == 2) { + this->check_utf8_bytes(input.chunks[0], this->prev_input_block); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + } else if (simd8x64::NUM_CHUNKS == 4) { + this->check_utf8_bytes(input.chunks[0], this->prev_input_block); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + this->check_utf8_bytes(input.chunks[2], input.chunks[1]); + this->check_utf8_bytes(input.chunks[3], input.chunks[2]); } - return std::make_pair(result(error_code::TOO_LARGE, buf - start), - latin1_output); + this->prev_incomplete = + is_incomplete(input.chunks[simd8x64::NUM_CHUNKS - 1]); + this->prev_input_block = input.chunks[simd8x64::NUM_CHUNKS - 1]; } - _mm_storeu_si128( - (__m128i *)latin1_output, - _mm512_castsi512_si128(_mm512_permutexvar_epi8(shufmask, in))); - latin1_output += 16; - buf += 16; } - if (buf < end) { - uint16_t mask = uint16_t((1 << (end - buf)) - 1); - __m512i in = _mm512_maskz_loadu_epi32(mask, buf); - if (_mm512_cmpgt_epu32_mask(in, v_0xFF)) { - while (uint32_t(*buf) <= 0xff) { - *latin1_output++ = uint8_t(*buf++); - } - return std::make_pair(result(error_code::TOO_LARGE, buf - start), - latin1_output); - } - _mm_mask_storeu_epi8( - latin1_output, mask, - _mm512_castsi512_si128(_mm512_permutexvar_epi8(shufmask, in))); + + // do not forget to call check_eof! + simdutf_really_inline bool errors() const { + return this->error.any_bits_set_anywhere(); } - return std::make_pair(result(error_code::SUCCESS, len), latin1_output); -} -/* end file src/icelake/icelake_convert_utf32_to_latin1.inl.cpp */ -/* begin file src/icelake/icelake_convert_utf32_to_utf8.inl.cpp */ -// file included directly -// Todo: currently, this is just the haswell code, optimize for icelake kernel. -std::pair -avx512_convert_utf32_to_utf8(const char32_t *buf, size_t len, - char *utf8_output) { - const char32_t *end = buf + len; - const __m256i v_0000 = _mm256_setzero_si256(); - const __m256i v_ffff0000 = _mm256_set1_epi32((uint32_t)0xffff0000); - const __m256i v_ff80 = _mm256_set1_epi16((uint16_t)0xff80); - const __m256i v_f800 = _mm256_set1_epi16((uint16_t)0xf800); - const __m256i v_c080 = _mm256_set1_epi16((uint16_t)0xc080); - const __m256i v_7fffffff = _mm256_set1_epi32((uint32_t)0x7fffffff); - __m256i running_max = _mm256_setzero_si256(); - __m256i forbidden_bytemask = _mm256_setzero_si256(); +}; // struct utf8_checker +} // namespace utf8_validation - const size_t safety_margin = - 12; // to avoid overruns, see issue - // https://github.com/simdutf/simdutf/issues/92 +using utf8_validation::utf8_checker; - while (end - buf >= std::ptrdiff_t(16 + safety_margin)) { - __m256i in = _mm256_loadu_si256((__m256i *)buf); - __m256i nextin = _mm256_loadu_si256((__m256i *)buf + 1); - running_max = _mm256_max_epu32(_mm256_max_epu32(in, running_max), nextin); +} // unnamed namespace +} // namespace ppc64 +} // namespace simdutf +/* end file src/generic/utf8_validation/utf8_lookup4_algorithm.h */ +/* begin file src/generic/utf8_validation/utf8_validator.h */ +namespace simdutf { +namespace ppc64 { +namespace { +namespace utf8_validation { - // Pack 32-bit UTF-32 code units to 16-bit UTF-16 code units with unsigned - // saturation - __m256i in_16 = _mm256_packus_epi32(_mm256_and_si256(in, v_7fffffff), - _mm256_and_si256(nextin, v_7fffffff)); - in_16 = _mm256_permute4x64_epi64(in_16, 0b11011000); +/** + * Validates that the string is actual UTF-8. + */ +template +bool generic_validate_utf8(const uint8_t *input, size_t length) { + checker c{}; + buf_block_reader<64> reader(input, length); + while (reader.has_full_block()) { + simd::simd8x64 in(reader.full_block()); + c.check_next_input(in); + reader.advance(); + } + uint8_t block[64]{}; + reader.get_remainder(block); + simd::simd8x64 in(block); + c.check_next_input(in); + reader.advance(); + c.check_eof(); + return !c.errors(); +} - // Try to apply UTF-16 => UTF-8 routine on 256 bits - // (haswell/avx2_convert_utf16_to_utf8.cpp) +bool generic_validate_utf8(const char *input, size_t length) { + return generic_validate_utf8( + reinterpret_cast(input), length); +} - if (_mm256_testz_si256(in_16, v_ff80)) { // ASCII fast path!!!! - // 1. pack the bytes - const __m128i utf8_packed = _mm_packus_epi16( - _mm256_castsi256_si128(in_16), _mm256_extractf128_si256(in_16, 1)); - // 2. store (16 bytes) - _mm_storeu_si128((__m128i *)utf8_output, utf8_packed); - // 3. adjust pointers - buf += 16; - utf8_output += 16; - continue; // we are done for this round! +/** + * Validates that the string is actual UTF-8 and stops on errors. + */ +template +result generic_validate_utf8_with_errors(const uint8_t *input, size_t length) { + checker c{}; + buf_block_reader<64> reader(input, length); + size_t count{0}; + while (reader.has_full_block()) { + simd::simd8x64 in(reader.full_block()); + c.check_next_input(in); + if (c.errors()) { + if (count != 0) { + count--; + } // Sometimes the error is only detected in the next chunk + result res = scalar::utf8::rewind_and_validate_with_errors( + reinterpret_cast(input), + reinterpret_cast(input + count), length - count); + res.count += count; + return res; } - // no bits set above 7th bit - const __m256i one_byte_bytemask = - _mm256_cmpeq_epi16(_mm256_and_si256(in_16, v_ff80), v_0000); - const uint32_t one_byte_bitmask = - static_cast(_mm256_movemask_epi8(one_byte_bytemask)); - - // no bits set above 11th bit - const __m256i one_or_two_bytes_bytemask = - _mm256_cmpeq_epi16(_mm256_and_si256(in_16, v_f800), v_0000); - const uint32_t one_or_two_bytes_bitmask = - static_cast(_mm256_movemask_epi8(one_or_two_bytes_bytemask)); - if (one_or_two_bytes_bitmask == 0xffffffff) { - // 1. prepare 2-byte values - // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8 - // expected output : [110a|aaaa|10bb|bbbb] x 8 - const __m256i v_1f00 = _mm256_set1_epi16((int16_t)0x1f00); - const __m256i v_003f = _mm256_set1_epi16((int16_t)0x003f); - - // t0 = [000a|aaaa|bbbb|bb00] - const __m256i t0 = _mm256_slli_epi16(in_16, 2); - // t1 = [000a|aaaa|0000|0000] - const __m256i t1 = _mm256_and_si256(t0, v_1f00); - // t2 = [0000|0000|00bb|bbbb] - const __m256i t2 = _mm256_and_si256(in_16, v_003f); - // t3 = [000a|aaaa|00bb|bbbb] - const __m256i t3 = _mm256_or_si256(t1, t2); - // t4 = [110a|aaaa|10bb|bbbb] - const __m256i t4 = _mm256_or_si256(t3, v_c080); - - // 2. merge ASCII and 2-byte codewords - const __m256i utf8_unpacked = - _mm256_blendv_epi8(t4, in_16, one_byte_bytemask); - - // 3. prepare bitmask for 8-bit lookup - const uint32_t M0 = one_byte_bitmask & 0x55555555; - const uint32_t M1 = M0 >> 7; - const uint32_t M2 = (M1 | M0) & 0x00ff00ff; - // 4. pack the bytes + reader.advance(); + count += 64; + } + uint8_t block[64]{}; + reader.get_remainder(block); + simd::simd8x64 in(block); + c.check_next_input(in); + reader.advance(); + c.check_eof(); + if (c.errors()) { + if (count != 0) { + count--; + } // Sometimes the error is only detected in the next chunk + result res = scalar::utf8::rewind_and_validate_with_errors( + reinterpret_cast(input), + reinterpret_cast(input) + count, length - count); + res.count += count; + return res; + } else { + return result(error_code::SUCCESS, length); + } +} - const uint8_t *row = - &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[uint8_t(M2)][0]; - const uint8_t *row_2 = - &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[uint8_t(M2 >> - 16)][0]; +result generic_validate_utf8_with_errors(const char *input, size_t length) { + return generic_validate_utf8_with_errors( + reinterpret_cast(input), length); +} - const __m128i shuffle = _mm_loadu_si128((__m128i *)(row + 1)); - const __m128i shuffle_2 = _mm_loadu_si128((__m128i *)(row_2 + 1)); +template +bool generic_validate_ascii(const uint8_t *input, size_t length) { + buf_block_reader<64> reader(input, length); + uint8_t blocks[64]{}; + simd::simd8x64 running_or(blocks); + while (reader.has_full_block()) { + simd::simd8x64 in(reader.full_block()); + running_or |= in; + reader.advance(); + } + uint8_t block[64]{}; + reader.get_remainder(block); + simd::simd8x64 in(block); + running_or |= in; + return running_or.is_ascii(); +} - const __m256i utf8_packed = _mm256_shuffle_epi8( - utf8_unpacked, _mm256_setr_m128i(shuffle, shuffle_2)); - // 5. store bytes - _mm_storeu_si128((__m128i *)utf8_output, - _mm256_castsi256_si128(utf8_packed)); - utf8_output += row[0]; - _mm_storeu_si128((__m128i *)utf8_output, - _mm256_extractf128_si256(utf8_packed, 1)); - utf8_output += row_2[0]; +bool generic_validate_ascii(const char *input, size_t length) { + return generic_validate_ascii( + reinterpret_cast(input), length); +} - // 6. adjust pointers - buf += 16; - continue; +template +result generic_validate_ascii_with_errors(const uint8_t *input, size_t length) { + buf_block_reader<64> reader(input, length); + size_t count{0}; + while (reader.has_full_block()) { + simd::simd8x64 in(reader.full_block()); + if (!in.is_ascii()) { + result res = scalar::ascii::validate_with_errors( + reinterpret_cast(input + count), length - count); + return result(res.error, count + res.count); } - // Must check for overflow in packing - const __m256i saturation_bytemask = _mm256_cmpeq_epi32( - _mm256_and_si256(_mm256_or_si256(in, nextin), v_ffff0000), v_0000); - const uint32_t saturation_bitmask = - static_cast(_mm256_movemask_epi8(saturation_bytemask)); - if (saturation_bitmask == 0xffffffff) { - // case: code units from register produce either 1, 2 or 3 UTF-8 bytes - const __m256i v_d800 = _mm256_set1_epi16((uint16_t)0xd800); - forbidden_bytemask = _mm256_or_si256( - forbidden_bytemask, - _mm256_cmpeq_epi16(_mm256_and_si256(in_16, v_f800), v_d800)); + reader.advance(); - const __m256i dup_even = _mm256_setr_epi16( - 0x0000, 0x0202, 0x0404, 0x0606, 0x0808, 0x0a0a, 0x0c0c, 0x0e0e, - 0x0000, 0x0202, 0x0404, 0x0606, 0x0808, 0x0a0a, 0x0c0c, 0x0e0e); + count += 64; + } + uint8_t block[64]{}; + reader.get_remainder(block); + simd::simd8x64 in(block); + if (!in.is_ascii()) { + result res = scalar::ascii::validate_with_errors( + reinterpret_cast(input + count), length - count); + return result(res.error, count + res.count); + } else { + return result(error_code::SUCCESS, length); + } +} - /* In this branch we handle three cases: - 1. [0000|0000|0ccc|cccc] => [0ccc|cccc] - - single UFT-8 byte - 2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc] - two - UTF-8 bytes - 3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - - three UTF-8 bytes +result generic_validate_ascii_with_errors(const char *input, size_t length) { + return generic_validate_ascii_with_errors( + reinterpret_cast(input), length); +} - We expand the input word (16-bit) into two code units (32-bit), thus - we have room for four bytes. However, we need five distinct bit - layouts. Note that the last byte in cases #2 and #3 is the same. +} // namespace utf8_validation +} // unnamed namespace +} // namespace ppc64 +} // namespace simdutf +/* end file src/generic/utf8_validation/utf8_validator.h */ +// transcoding from UTF-8 to UTF-16 +/* begin file src/generic/utf8_to_utf16/utf8_to_utf16.h */ - We precompute byte 1 for case #1 and the common byte for cases #2 & #3 - in register t2. +namespace simdutf { +namespace ppc64 { +namespace { +namespace utf8_to_utf16 { +using namespace simd; - We precompute byte 1 for case #3 and -- **conditionally** -- precompute - either byte 1 for case #2 or byte 2 for case #3. Note that they - differ by exactly one bit. +simdutf_really_inline simd8 +check_special_cases(const simd8 input, const simd8 prev1) { + // Bit 0 = Too Short (lead byte/ASCII followed by lead byte/ASCII) + // Bit 1 = Too Long (ASCII followed by continuation) + // Bit 2 = Overlong 3-byte + // Bit 4 = Surrogate + // Bit 5 = Overlong 2-byte + // Bit 7 = Two Continuations + constexpr const uint8_t TOO_SHORT = 1 << 0; // 11______ 0_______ + // 11______ 11______ + constexpr const uint8_t TOO_LONG = 1 << 1; // 0_______ 10______ + constexpr const uint8_t OVERLONG_3 = 1 << 2; // 11100000 100_____ + constexpr const uint8_t SURROGATE = 1 << 4; // 11101101 101_____ + constexpr const uint8_t OVERLONG_2 = 1 << 5; // 1100000_ 10______ + constexpr const uint8_t TWO_CONTS = 1 << 7; // 10______ 10______ + constexpr const uint8_t TOO_LARGE = 1 << 3; // 11110100 1001____ + // 11110100 101_____ + // 11110101 1001____ + // 11110101 101_____ + // 1111011_ 1001____ + // 1111011_ 101_____ + // 11111___ 1001____ + // 11111___ 101_____ + constexpr const uint8_t TOO_LARGE_1000 = 1 << 6; + // 11110101 1000____ + // 1111011_ 1000____ + // 11111___ 1000____ + constexpr const uint8_t OVERLONG_4 = 1 << 6; // 11110000 1000____ - Finally from these two code units we build proper UTF-8 sequence, taking - into account the case (i.e, the number of bytes to write). - */ - /** - * Given [aaaa|bbbb|bbcc|cccc] our goal is to produce: - * t2 => [0ccc|cccc] [10cc|cccc] - * s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb]) - */ -#define simdutf_vec(x) _mm256_set1_epi16(static_cast(x)) - // [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc] - const __m256i t0 = _mm256_shuffle_epi8(in_16, dup_even); - // [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc] - const __m256i t1 = _mm256_and_si256(t0, simdutf_vec(0b0011111101111111)); - // [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc] - const __m256i t2 = _mm256_or_si256(t1, simdutf_vec(0b1000000000000000)); + const simd8 byte_1_high = prev1.shr<4>().lookup_16( + // 0_______ ________ + TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, + TOO_LONG, + // 10______ ________ + TWO_CONTS, TWO_CONTS, TWO_CONTS, TWO_CONTS, + // 1100____ ________ + TOO_SHORT | OVERLONG_2, + // 1101____ ________ + TOO_SHORT, + // 1110____ ________ + TOO_SHORT | OVERLONG_3 | SURROGATE, + // 1111____ ________ + TOO_SHORT | TOO_LARGE | TOO_LARGE_1000 | OVERLONG_4); + constexpr const uint8_t CARRY = + TOO_SHORT | TOO_LONG | TWO_CONTS; // These all have ____ in byte 1 . + const simd8 byte_1_low = + (prev1 & 0x0F) + .lookup_16( + // ____0000 ________ + CARRY | OVERLONG_3 | OVERLONG_2 | OVERLONG_4, + // ____0001 ________ + CARRY | OVERLONG_2, + // ____001_ ________ + CARRY, CARRY, - // [aaaa|bbbb|bbcc|cccc] => [0000|aaaa|bbbb|bbcc] - const __m256i s0 = _mm256_srli_epi16(in_16, 4); - // [0000|aaaa|bbbb|bbcc] => [0000|aaaa|bbbb|bb00] - const __m256i s1 = _mm256_and_si256(s0, simdutf_vec(0b0000111111111100)); - // [0000|aaaa|bbbb|bb00] => [00bb|bbbb|0000|aaaa] - const __m256i s2 = _mm256_maddubs_epi16(s1, simdutf_vec(0x0140)); - // [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa] - const __m256i s3 = _mm256_or_si256(s2, simdutf_vec(0b1100000011100000)); - const __m256i m0 = _mm256_andnot_si256(one_or_two_bytes_bytemask, - simdutf_vec(0b0100000000000000)); - const __m256i s4 = _mm256_xor_si256(s3, m0); -#undef simdutf_vec + // ____0100 ________ + CARRY | TOO_LARGE, + // ____0101 ________ + CARRY | TOO_LARGE | TOO_LARGE_1000, + // ____011_ ________ + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, - // 4. expand code units 16-bit => 32-bit - const __m256i out0 = _mm256_unpacklo_epi16(t2, s4); - const __m256i out1 = _mm256_unpackhi_epi16(t2, s4); + // ____1___ ________ + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + // ____1101 ________ + CARRY | TOO_LARGE | TOO_LARGE_1000 | SURROGATE, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000); + const simd8 byte_2_high = input.shr<4>().lookup_16( + // ________ 0_______ + TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, + TOO_SHORT, TOO_SHORT, - // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle - const uint32_t mask = (one_byte_bitmask & 0x55555555) | - (one_or_two_bytes_bitmask & 0xaaaaaaaa); - // Due to the wider registers, the following path is less likely to be - // useful. - /*if(mask == 0) { - // We only have three-byte code units. Use fast path. - const __m256i shuffle = - _mm256_setr_epi8(2,3,1,6,7,5,10,11,9,14,15,13,-1,-1,-1,-1, - 2,3,1,6,7,5,10,11,9,14,15,13,-1,-1,-1,-1); const __m256i utf8_0 = - _mm256_shuffle_epi8(out0, shuffle); const __m256i utf8_1 = - _mm256_shuffle_epi8(out1, shuffle); - _mm_storeu_si128((__m128i*)utf8_output, _mm256_castsi256_si128(utf8_0)); - utf8_output += 12; - _mm_storeu_si128((__m128i*)utf8_output, _mm256_castsi256_si128(utf8_1)); - utf8_output += 12; - _mm_storeu_si128((__m128i*)utf8_output, - _mm256_extractf128_si256(utf8_0,1)); utf8_output += 12; - _mm_storeu_si128((__m128i*)utf8_output, - _mm256_extractf128_si256(utf8_1,1)); utf8_output += 12; buf += 16; - continue; - }*/ - const uint8_t mask0 = uint8_t(mask); - const uint8_t *row0 = - &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask0][0]; - const __m128i shuffle0 = _mm_loadu_si128((__m128i *)(row0 + 1)); - const __m128i utf8_0 = - _mm_shuffle_epi8(_mm256_castsi256_si128(out0), shuffle0); + // ________ 1000____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE_1000 | + OVERLONG_4, + // ________ 1001____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE, + // ________ 101_____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, + TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, - const uint8_t mask1 = static_cast(mask >> 8); - const uint8_t *row1 = - &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask1][0]; - const __m128i shuffle1 = _mm_loadu_si128((__m128i *)(row1 + 1)); - const __m128i utf8_1 = - _mm_shuffle_epi8(_mm256_castsi256_si128(out1), shuffle1); + // ________ 11______ + TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT); + return (byte_1_high & byte_1_low & byte_2_high); +} +simdutf_really_inline simd8 +check_multibyte_lengths(const simd8 input, + const simd8 prev_input, + const simd8 sc) { + simd8 prev2 = input.prev<2>(prev_input); + simd8 prev3 = input.prev<3>(prev_input); + simd8 must23 = + simd8(must_be_2_3_continuation(prev2, prev3)); + simd8 must23_80 = must23 & uint8_t(0x80); + return must23_80 ^ sc; +} - const uint8_t mask2 = static_cast(mask >> 16); - const uint8_t *row2 = - &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask2][0]; - const __m128i shuffle2 = _mm_loadu_si128((__m128i *)(row2 + 1)); - const __m128i utf8_2 = - _mm_shuffle_epi8(_mm256_extractf128_si256(out0, 1), shuffle2); +struct validating_transcoder { + // If this is nonzero, there has been a UTF-8 error. + simd8 error; - const uint8_t mask3 = static_cast(mask >> 24); - const uint8_t *row3 = - &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask3][0]; - const __m128i shuffle3 = _mm_loadu_si128((__m128i *)(row3 + 1)); - const __m128i utf8_3 = - _mm_shuffle_epi8(_mm256_extractf128_si256(out1, 1), shuffle3); + validating_transcoder() : error(uint8_t(0)) {} + // + // Check whether the current bytes are valid UTF-8. + // + simdutf_really_inline void check_utf8_bytes(const simd8 input, + const simd8 prev_input) { + // Flip prev1...prev3 so we can easily determine if they are 2+, 3+ or 4+ + // lead bytes (2, 3, 4-byte leads become large positive numbers instead of + // small negative numbers) + simd8 prev1 = input.prev<1>(prev_input); + simd8 sc = check_special_cases(input, prev1); + this->error |= check_multibyte_lengths(input, prev_input, sc); + } - _mm_storeu_si128((__m128i *)utf8_output, utf8_0); - utf8_output += row0[0]; - _mm_storeu_si128((__m128i *)utf8_output, utf8_1); - utf8_output += row1[0]; - _mm_storeu_si128((__m128i *)utf8_output, utf8_2); - utf8_output += row2[0]; - _mm_storeu_si128((__m128i *)utf8_output, utf8_3); - utf8_output += row3[0]; - buf += 16; - } else { - // case: at least one 32-bit word is larger than 0xFFFF <=> it will - // produce four UTF-8 bytes. Let us do a scalar fallback. It may seem - // wasteful to use scalar code, but being efficient with SIMD may require - // large, non-trivial tables? - size_t forward = 15; - size_t k = 0; - if (size_t(end - buf) < forward + 1) { - forward = size_t(end - buf - 1); + template + simdutf_really_inline size_t convert(const char *in, size_t size, + char16_t *utf16_output) { + size_t pos = 0; + char16_t *start{utf16_output}; + // In the worst case, we have the haswell kernel which can cause an overflow + // of 8 bytes when calling convert_masked_utf8_to_utf16. If you skip the + // last 16 bytes, and if the data is valid, then it is entirely safe because + // 16 UTF-8 bytes generate much more than 8 bytes. However, you cannot + // generally assume that you have valid UTF-8 input, so we are going to go + // back from the end counting 8 leading bytes, to give us a good margin. + size_t leading_byte = 0; + size_t margin = size; + for (; margin > 0 && leading_byte < 8; margin--) { + leading_byte += (int8_t(in[margin - 1]) > -65); + } + // If the input is long enough, then we have that margin-1 is the eight last + // leading byte. + const size_t safety_margin = size - margin + 1; // to avoid overruns! + while (pos + 64 + safety_margin <= size) { + simd8x64 input(reinterpret_cast(in + pos)); + if (input.is_ascii()) { + input.store_ascii_as_utf16(utf16_output); + utf16_output += 64; + pos += 64; + } else { + // you might think that a for-loop would work, but under Visual Studio, + // it is not good enough. + static_assert( + (simd8x64::NUM_CHUNKS == 2) || + (simd8x64::NUM_CHUNKS == 4), + "We support either two or four chunks per 64-byte block."); + auto zero = simd8{uint8_t(0)}; + if (simd8x64::NUM_CHUNKS == 2) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + } else if (simd8x64::NUM_CHUNKS == 4) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + this->check_utf8_bytes(input.chunks[2], input.chunks[1]); + this->check_utf8_bytes(input.chunks[3], input.chunks[2]); + } + uint64_t utf8_continuation_mask = input.lt(-65 + 1); + if (utf8_continuation_mask & 1) { + return 0; // error + } + uint64_t utf8_leading_mask = ~utf8_continuation_mask; + uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; + // We process in blocks of up to 12 bytes except possibly + // for fast paths which may process up to 16 bytes. For the + // slow path to work, we should have at least 12 input bytes left. + size_t max_starting_point = (pos + 64) - 12; + // Next loop is going to run at least five times. + while (pos < max_starting_point) { + // Performance note: our ability to compute 'consumed' and + // then shift and recompute is critical. If there is a + // latency of, say, 4 cycles on getting 'consumed', then + // the inner loop might have a total latency of about 6 cycles. + // Yet we process between 6 to 12 inputs bytes, thus we get + // a speed limit between 1 cycle/byte and 0.5 cycle/byte + // for this section of the code. Hence, there is a limit + // to how much we can further increase this latency before + // it seriously harms performance. + size_t consumed = convert_masked_utf8_to_utf16( + in + pos, utf8_end_of_code_point_mask, utf16_output); + pos += consumed; + utf8_end_of_code_point_mask >>= consumed; + } + // At this point there may remain between 0 and 12 bytes in the + // 64-byte block. These bytes will be processed again. So we have an + // 80% efficiency (in the worst case). In practice we expect an + // 85% to 90% efficiency. } - for (; k < forward; k++) { - uint32_t word = buf[k]; - if ((word & 0xFFFFFF80) == 0) { // 1-byte (ASCII) - *utf8_output++ = char(word); - } else if ((word & 0xFFFFF800) == 0) { // 2-byte - *utf8_output++ = char((word >> 6) | 0b11000000); - *utf8_output++ = char((word & 0b111111) | 0b10000000); - } else if ((word & 0xFFFF0000) == 0) { // 3-byte - if (word >= 0xD800 && word <= 0xDFFF) { - return std::make_pair(nullptr, utf8_output); - } - *utf8_output++ = char((word >> 12) | 0b11100000); - *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); - *utf8_output++ = char((word & 0b111111) | 0b10000000); - } else { // 4-byte - if (word > 0x10FFFF) { - return std::make_pair(nullptr, utf8_output); - } - *utf8_output++ = char((word >> 18) | 0b11110000); - *utf8_output++ = char(((word >> 12) & 0b111111) | 0b10000000); - *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); - *utf8_output++ = char((word & 0b111111) | 0b10000000); + } + if (errors()) { + return 0; + } + if (pos < size) { + size_t howmany = scalar::utf8_to_utf16::convert( + in + pos, size - pos, utf16_output); + if (howmany == 0) { + return 0; + } + utf16_output += howmany; + } + return utf16_output - start; + } + + template + simdutf_really_inline result convert_with_errors(const char *in, size_t size, + char16_t *utf16_output) { + size_t pos = 0; + char16_t *start{utf16_output}; + // In the worst case, we have the haswell kernel which can cause an overflow + // of 8 bytes when calling convert_masked_utf8_to_utf16. If you skip the + // last 16 bytes, and if the data is valid, then it is entirely safe because + // 16 UTF-8 bytes generate much more than 8 bytes. However, you cannot + // generally assume that you have valid UTF-8 input, so we are going to go + // back from the end counting 8 leading bytes, to give us a good margin. + size_t leading_byte = 0; + size_t margin = size; + for (; margin > 0 && leading_byte < 8; margin--) { + leading_byte += (int8_t(in[margin - 1]) > -65); + } + // If the input is long enough, then we have that margin-1 is the eight last + // leading byte. + const size_t safety_margin = size - margin + 1; // to avoid overruns! + while (pos + 64 + safety_margin <= size) { + simd8x64 input(reinterpret_cast(in + pos)); + if (input.is_ascii()) { + input.store_ascii_as_utf16(utf16_output); + utf16_output += 64; + pos += 64; + } else { + // you might think that a for-loop would work, but under Visual Studio, + // it is not good enough. + static_assert( + (simd8x64::NUM_CHUNKS == 2) || + (simd8x64::NUM_CHUNKS == 4), + "We support either two or four chunks per 64-byte block."); + auto zero = simd8{uint8_t(0)}; + if (simd8x64::NUM_CHUNKS == 2) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + } else if (simd8x64::NUM_CHUNKS == 4) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + this->check_utf8_bytes(input.chunks[2], input.chunks[1]); + this->check_utf8_bytes(input.chunks[3], input.chunks[2]); + } + uint64_t utf8_continuation_mask = input.lt(-65 + 1); + if (errors() || (utf8_continuation_mask & 1)) { + // rewind_and_convert_with_errors will seek a potential error from + // in+pos onward, with the ability to go back up to pos bytes, and + // read size-pos bytes forward. + result res = + scalar::utf8_to_utf16::rewind_and_convert_with_errors( + pos, in + pos, size - pos, utf16_output); + res.count += pos; + return res; + } + uint64_t utf8_leading_mask = ~utf8_continuation_mask; + uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; + // We process in blocks of up to 12 bytes except possibly + // for fast paths which may process up to 16 bytes. For the + // slow path to work, we should have at least 12 input bytes left. + size_t max_starting_point = (pos + 64) - 12; + // Next loop is going to run at least five times. + while (pos < max_starting_point) { + // Performance note: our ability to compute 'consumed' and + // then shift and recompute is critical. If there is a + // latency of, say, 4 cycles on getting 'consumed', then + // the inner loop might have a total latency of about 6 cycles. + // Yet we process between 6 to 12 inputs bytes, thus we get + // a speed limit between 1 cycle/byte and 0.5 cycle/byte + // for this section of the code. Hence, there is a limit + // to how much we can further increase this latency before + // it seriously harms performance. + size_t consumed = convert_masked_utf8_to_utf16( + in + pos, utf8_end_of_code_point_mask, utf16_output); + pos += consumed; + utf8_end_of_code_point_mask >>= consumed; } + // At this point there may remain between 0 and 12 bytes in the + // 64-byte block. These bytes will be processed again. So we have an + // 80% efficiency (in the worst case). In practice we expect an + // 85% to 90% efficiency. + } + } + if (errors()) { + // rewind_and_convert_with_errors will seek a potential error from in+pos + // onward, with the ability to go back up to pos bytes, and read size-pos + // bytes forward. + result res = + scalar::utf8_to_utf16::rewind_and_convert_with_errors( + pos, in + pos, size - pos, utf16_output); + res.count += pos; + return res; + } + if (pos < size) { + // rewind_and_convert_with_errors will seek a potential error from in+pos + // onward, with the ability to go back up to pos bytes, and read size-pos + // bytes forward. + result res = + scalar::utf8_to_utf16::rewind_and_convert_with_errors( + pos, in + pos, size - pos, utf16_output); + if (res.error) { // In case of error, we want the error position + res.count += pos; + return res; + } else { // In case of success, we want the number of word written + utf16_output += res.count; } - buf += k; } - } // while - - // check for invalid input - const __m256i v_10ffff = _mm256_set1_epi32((uint32_t)0x10ffff); - if (static_cast(_mm256_movemask_epi8(_mm256_cmpeq_epi32( - _mm256_max_epu32(running_max, v_10ffff), v_10ffff))) != 0xffffffff) { - return std::make_pair(nullptr, utf8_output); + return result(error_code::SUCCESS, utf16_output - start); } - if (static_cast(_mm256_movemask_epi8(forbidden_bytemask)) != 0) { - return std::make_pair(nullptr, utf8_output); + simdutf_really_inline bool errors() const { + return this->error.any_bits_set_anywhere(); } - return std::make_pair(buf, utf8_output); -} - -// Todo: currently, this is just the haswell code, optimize for icelake kernel. -std::pair -avx512_convert_utf32_to_utf8_with_errors(const char32_t *buf, size_t len, - char *utf8_output) { - const char32_t *end = buf + len; - const char32_t *start = buf; +}; // struct utf8_checker +} // namespace utf8_to_utf16 +} // unnamed namespace +} // namespace ppc64 +} // namespace simdutf +/* end file src/generic/utf8_to_utf16/utf8_to_utf16.h */ +/* begin file src/generic/utf8_to_utf16/valid_utf8_to_utf16.h */ - const __m256i v_0000 = _mm256_setzero_si256(); - const __m256i v_ffff0000 = _mm256_set1_epi32((uint32_t)0xffff0000); - const __m256i v_ff80 = _mm256_set1_epi16((uint16_t)0xff80); - const __m256i v_f800 = _mm256_set1_epi16((uint16_t)0xf800); - const __m256i v_c080 = _mm256_set1_epi16((uint16_t)0xc080); - const __m256i v_7fffffff = _mm256_set1_epi32((uint32_t)0x7fffffff); - const __m256i v_10ffff = _mm256_set1_epi32((uint32_t)0x10ffff); +namespace simdutf { +namespace ppc64 { +namespace { +namespace utf8_to_utf16 { - const size_t safety_margin = - 12; // to avoid overruns, see issue - // https://github.com/simdutf/simdutf/issues/92 +using namespace simd; - while (end - buf >= std::ptrdiff_t(16 + safety_margin)) { - __m256i in = _mm256_loadu_si256((__m256i *)buf); - __m256i nextin = _mm256_loadu_si256((__m256i *)buf + 1); - // Check for too large input - const __m256i max_input = - _mm256_max_epu32(_mm256_max_epu32(in, nextin), v_10ffff); - if (static_cast(_mm256_movemask_epi8( - _mm256_cmpeq_epi32(max_input, v_10ffff))) != 0xffffffff) { - return std::make_pair(result(error_code::TOO_LARGE, buf - start), - utf8_output); +template +simdutf_warn_unused size_t convert_valid(const char *input, size_t size, + char16_t *utf16_output) noexcept { + // The implementation is not specific to haswell and should be moved to the + // generic directory. + size_t pos = 0; + char16_t *start{utf16_output}; + const size_t safety_margin = 16; // to avoid overruns! + while (pos + 64 + safety_margin <= size) { + // this loop could be unrolled further. For example, we could process the + // mask far more than 64 bytes. + simd8x64 in(reinterpret_cast(input + pos)); + if (in.is_ascii()) { + in.store_ascii_as_utf16(utf16_output); + utf16_output += 64; + pos += 64; + } else { + // Slow path. We hope that the compiler will recognize that this is a slow + // path. Anything that is not a continuation mask is a 'leading byte', + // that is, the start of a new code point. + uint64_t utf8_continuation_mask = in.lt(-65 + 1); + // -65 is 0b10111111 in two-complement's, so largest possible continuation + // byte + uint64_t utf8_leading_mask = ~utf8_continuation_mask; + // The *start* of code points is not so useful, rather, we want the *end* + // of code points. + uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; + // We process in blocks of up to 12 bytes except possibly + // for fast paths which may process up to 16 bytes. For the + // slow path to work, we should have at least 12 input bytes left. + size_t max_starting_point = (pos + 64) - 12; + // Next loop is going to run at least five times when using solely + // the slow/regular path, and at least four times if there are fast paths. + while (pos < max_starting_point) { + // Performance note: our ability to compute 'consumed' and + // then shift and recompute is critical. If there is a + // latency of, say, 4 cycles on getting 'consumed', then + // the inner loop might have a total latency of about 6 cycles. + // Yet we process between 6 to 12 inputs bytes, thus we get + // a speed limit between 1 cycle/byte and 0.5 cycle/byte + // for this section of the code. Hence, there is a limit + // to how much we can further increase this latency before + // it seriously harms performance. + // + // Thus we may allow convert_masked_utf8_to_utf16 to process + // more bytes at a time under a fast-path mode where 16 bytes + // are consumed at once (e.g., when encountering ASCII). + size_t consumed = convert_masked_utf8_to_utf16( + input + pos, utf8_end_of_code_point_mask, utf16_output); + pos += consumed; + utf8_end_of_code_point_mask >>= consumed; + } + // At this point there may remain between 0 and 12 bytes in the + // 64-byte block. These bytes will be processed again. So we have an + // 80% efficiency (in the worst case). In practice we expect an + // 85% to 90% efficiency. } + } + utf16_output += scalar::utf8_to_utf16::convert_valid( + input + pos, size - pos, utf16_output); + return utf16_output - start; +} - // Pack 32-bit UTF-32 code units to 16-bit UTF-16 code units with unsigned - // saturation - __m256i in_16 = _mm256_packus_epi32(_mm256_and_si256(in, v_7fffffff), - _mm256_and_si256(nextin, v_7fffffff)); - in_16 = _mm256_permute4x64_epi64(in_16, 0b11011000); +} // namespace utf8_to_utf16 +} // unnamed namespace +} // namespace ppc64 +} // namespace simdutf +/* end file src/generic/utf8_to_utf16/valid_utf8_to_utf16.h */ +// transcoding from UTF-8 to UTF-32 +/* begin file src/generic/utf8_to_utf32/utf8_to_utf32.h */ - // Try to apply UTF-16 => UTF-8 routine on 256 bits - // (haswell/avx2_convert_utf16_to_utf8.cpp) +namespace simdutf { +namespace ppc64 { +namespace { +namespace utf8_to_utf32 { +using namespace simd; - if (_mm256_testz_si256(in_16, v_ff80)) { // ASCII fast path!!!! - // 1. pack the bytes - const __m128i utf8_packed = _mm_packus_epi16( - _mm256_castsi256_si128(in_16), _mm256_extractf128_si256(in_16, 1)); - // 2. store (16 bytes) - _mm_storeu_si128((__m128i *)utf8_output, utf8_packed); - // 3. adjust pointers - buf += 16; - utf8_output += 16; - continue; // we are done for this round! - } - // no bits set above 7th bit - const __m256i one_byte_bytemask = - _mm256_cmpeq_epi16(_mm256_and_si256(in_16, v_ff80), v_0000); - const uint32_t one_byte_bitmask = - static_cast(_mm256_movemask_epi8(one_byte_bytemask)); +simdutf_really_inline simd8 +check_special_cases(const simd8 input, const simd8 prev1) { + // Bit 0 = Too Short (lead byte/ASCII followed by lead byte/ASCII) + // Bit 1 = Too Long (ASCII followed by continuation) + // Bit 2 = Overlong 3-byte + // Bit 4 = Surrogate + // Bit 5 = Overlong 2-byte + // Bit 7 = Two Continuations + constexpr const uint8_t TOO_SHORT = 1 << 0; // 11______ 0_______ + // 11______ 11______ + constexpr const uint8_t TOO_LONG = 1 << 1; // 0_______ 10______ + constexpr const uint8_t OVERLONG_3 = 1 << 2; // 11100000 100_____ + constexpr const uint8_t SURROGATE = 1 << 4; // 11101101 101_____ + constexpr const uint8_t OVERLONG_2 = 1 << 5; // 1100000_ 10______ + constexpr const uint8_t TWO_CONTS = 1 << 7; // 10______ 10______ + constexpr const uint8_t TOO_LARGE = 1 << 3; // 11110100 1001____ + // 11110100 101_____ + // 11110101 1001____ + // 11110101 101_____ + // 1111011_ 1001____ + // 1111011_ 101_____ + // 11111___ 1001____ + // 11111___ 101_____ + constexpr const uint8_t TOO_LARGE_1000 = 1 << 6; + // 11110101 1000____ + // 1111011_ 1000____ + // 11111___ 1000____ + constexpr const uint8_t OVERLONG_4 = 1 << 6; // 11110000 1000____ - // no bits set above 11th bit - const __m256i one_or_two_bytes_bytemask = - _mm256_cmpeq_epi16(_mm256_and_si256(in_16, v_f800), v_0000); - const uint32_t one_or_two_bytes_bitmask = - static_cast(_mm256_movemask_epi8(one_or_two_bytes_bytemask)); - if (one_or_two_bytes_bitmask == 0xffffffff) { - // 1. prepare 2-byte values - // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8 - // expected output : [110a|aaaa|10bb|bbbb] x 8 - const __m256i v_1f00 = _mm256_set1_epi16((int16_t)0x1f00); - const __m256i v_003f = _mm256_set1_epi16((int16_t)0x003f); + const simd8 byte_1_high = prev1.shr<4>().lookup_16( + // 0_______ ________ + TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, + TOO_LONG, + // 10______ ________ + TWO_CONTS, TWO_CONTS, TWO_CONTS, TWO_CONTS, + // 1100____ ________ + TOO_SHORT | OVERLONG_2, + // 1101____ ________ + TOO_SHORT, + // 1110____ ________ + TOO_SHORT | OVERLONG_3 | SURROGATE, + // 1111____ ________ + TOO_SHORT | TOO_LARGE | TOO_LARGE_1000 | OVERLONG_4); + constexpr const uint8_t CARRY = + TOO_SHORT | TOO_LONG | TWO_CONTS; // These all have ____ in byte 1 . + const simd8 byte_1_low = + (prev1 & 0x0F) + .lookup_16( + // ____0000 ________ + CARRY | OVERLONG_3 | OVERLONG_2 | OVERLONG_4, + // ____0001 ________ + CARRY | OVERLONG_2, + // ____001_ ________ + CARRY, CARRY, - // t0 = [000a|aaaa|bbbb|bb00] - const __m256i t0 = _mm256_slli_epi16(in_16, 2); - // t1 = [000a|aaaa|0000|0000] - const __m256i t1 = _mm256_and_si256(t0, v_1f00); - // t2 = [0000|0000|00bb|bbbb] - const __m256i t2 = _mm256_and_si256(in_16, v_003f); - // t3 = [000a|aaaa|00bb|bbbb] - const __m256i t3 = _mm256_or_si256(t1, t2); - // t4 = [110a|aaaa|10bb|bbbb] - const __m256i t4 = _mm256_or_si256(t3, v_c080); + // ____0100 ________ + CARRY | TOO_LARGE, + // ____0101 ________ + CARRY | TOO_LARGE | TOO_LARGE_1000, + // ____011_ ________ + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, - // 2. merge ASCII and 2-byte codewords - const __m256i utf8_unpacked = - _mm256_blendv_epi8(t4, in_16, one_byte_bytemask); + // ____1___ ________ + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + // ____1101 ________ + CARRY | TOO_LARGE | TOO_LARGE_1000 | SURROGATE, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000); + const simd8 byte_2_high = input.shr<4>().lookup_16( + // ________ 0_______ + TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, + TOO_SHORT, TOO_SHORT, - // 3. prepare bitmask for 8-bit lookup - const uint32_t M0 = one_byte_bitmask & 0x55555555; - const uint32_t M1 = M0 >> 7; - const uint32_t M2 = (M1 | M0) & 0x00ff00ff; - // 4. pack the bytes + // ________ 1000____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE_1000 | + OVERLONG_4, + // ________ 1001____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE, + // ________ 101_____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, + TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, - const uint8_t *row = - &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[uint8_t(M2)][0]; - const uint8_t *row_2 = - &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[uint8_t(M2 >> - 16)][0]; + // ________ 11______ + TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT); + return (byte_1_high & byte_1_low & byte_2_high); +} +simdutf_really_inline simd8 +check_multibyte_lengths(const simd8 input, + const simd8 prev_input, + const simd8 sc) { + simd8 prev2 = input.prev<2>(prev_input); + simd8 prev3 = input.prev<3>(prev_input); + simd8 must23 = + simd8(must_be_2_3_continuation(prev2, prev3)); + simd8 must23_80 = must23 & uint8_t(0x80); + return must23_80 ^ sc; +} - const __m128i shuffle = _mm_loadu_si128((__m128i *)(row + 1)); - const __m128i shuffle_2 = _mm_loadu_si128((__m128i *)(row_2 + 1)); +struct validating_transcoder { + // If this is nonzero, there has been a UTF-8 error. + simd8 error; - const __m256i utf8_packed = _mm256_shuffle_epi8( - utf8_unpacked, _mm256_setr_m128i(shuffle, shuffle_2)); - // 5. store bytes - _mm_storeu_si128((__m128i *)utf8_output, - _mm256_castsi256_si128(utf8_packed)); - utf8_output += row[0]; - _mm_storeu_si128((__m128i *)utf8_output, - _mm256_extractf128_si256(utf8_packed, 1)); - utf8_output += row_2[0]; + validating_transcoder() : error(uint8_t(0)) {} + // + // Check whether the current bytes are valid UTF-8. + // + simdutf_really_inline void check_utf8_bytes(const simd8 input, + const simd8 prev_input) { + // Flip prev1...prev3 so we can easily determine if they are 2+, 3+ or 4+ + // lead bytes (2, 3, 4-byte leads become large positive numbers instead of + // small negative numbers) + simd8 prev1 = input.prev<1>(prev_input); + simd8 sc = check_special_cases(input, prev1); + this->error |= check_multibyte_lengths(input, prev_input, sc); + } - // 6. adjust pointers - buf += 16; - continue; + simdutf_really_inline size_t convert(const char *in, size_t size, + char32_t *utf32_output) { + size_t pos = 0; + char32_t *start{utf32_output}; + // In the worst case, we have the haswell kernel which can cause an overflow + // of 8 words when calling convert_masked_utf8_to_utf32. If you skip the + // last 16 bytes, and if the data is valid, then it is entirely safe because + // 16 UTF-8 bytes generate much more than 8 bytes. However, you cannot + // generally assume that you have valid UTF-8 input, so we are going to go + // back from the end counting 16 leading bytes, to give us a good margin. + size_t leading_byte = 0; + size_t margin = size; + for (; margin > 0 && leading_byte < 8; margin--) { + leading_byte += (int8_t(in[margin - 1]) > -65); } - // Must check for overflow in packing - const __m256i saturation_bytemask = _mm256_cmpeq_epi32( - _mm256_and_si256(_mm256_or_si256(in, nextin), v_ffff0000), v_0000); - const uint32_t saturation_bitmask = - static_cast(_mm256_movemask_epi8(saturation_bytemask)); - if (saturation_bitmask == 0xffffffff) { - // case: code units from register produce either 1, 2 or 3 UTF-8 bytes + // If the input is long enough, then we have that margin-1 is the fourth + // last leading byte. + const size_t safety_margin = size - margin + 1; // to avoid overruns! + while (pos + 64 + safety_margin <= size) { + simd8x64 input(reinterpret_cast(in + pos)); + if (input.is_ascii()) { + input.store_ascii_as_utf32(utf32_output); + utf32_output += 64; + pos += 64; + } else { + // you might think that a for-loop would work, but under Visual Studio, + // it is not good enough. + static_assert( + (simd8x64::NUM_CHUNKS == 2) || + (simd8x64::NUM_CHUNKS == 4), + "We support either two or four chunks per 64-byte block."); + auto zero = simd8{uint8_t(0)}; + if (simd8x64::NUM_CHUNKS == 2) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + } else if (simd8x64::NUM_CHUNKS == 4) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + this->check_utf8_bytes(input.chunks[2], input.chunks[1]); + this->check_utf8_bytes(input.chunks[3], input.chunks[2]); + } + uint64_t utf8_continuation_mask = input.lt(-65 + 1); + if (utf8_continuation_mask & 1) { + return 0; // we have an error + } + uint64_t utf8_leading_mask = ~utf8_continuation_mask; + uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; + // We process in blocks of up to 12 bytes except possibly + // for fast paths which may process up to 16 bytes. For the + // slow path to work, we should have at least 12 input bytes left. + size_t max_starting_point = (pos + 64) - 12; + // Next loop is going to run at least five times. + while (pos < max_starting_point) { + // Performance note: our ability to compute 'consumed' and + // then shift and recompute is critical. If there is a + // latency of, say, 4 cycles on getting 'consumed', then + // the inner loop might have a total latency of about 6 cycles. + // Yet we process between 6 to 12 inputs bytes, thus we get + // a speed limit between 1 cycle/byte and 0.5 cycle/byte + // for this section of the code. Hence, there is a limit + // to how much we can further increase this latency before + // it seriously harms performance. + size_t consumed = convert_masked_utf8_to_utf32( + in + pos, utf8_end_of_code_point_mask, utf32_output); + pos += consumed; + utf8_end_of_code_point_mask >>= consumed; + } + // At this point there may remain between 0 and 12 bytes in the + // 64-byte block. These bytes will be processed again. So we have an + // 80% efficiency (in the worst case). In practice we expect an + // 85% to 90% efficiency. + } + } + if (errors()) { + return 0; + } + if (pos < size) { + size_t howmany = + scalar::utf8_to_utf32::convert(in + pos, size - pos, utf32_output); + if (howmany == 0) { + return 0; + } + utf32_output += howmany; + } + return utf32_output - start; + } - // Check for illegal surrogate code units - const __m256i v_d800 = _mm256_set1_epi16((uint16_t)0xd800); - const __m256i forbidden_bytemask = - _mm256_cmpeq_epi16(_mm256_and_si256(in_16, v_f800), v_d800); - if (static_cast(_mm256_movemask_epi8(forbidden_bytemask)) != - 0x0) { - return std::make_pair(result(error_code::SURROGATE, buf - start), - utf8_output); + simdutf_really_inline result convert_with_errors(const char *in, size_t size, + char32_t *utf32_output) { + size_t pos = 0; + char32_t *start{utf32_output}; + // In the worst case, we have the haswell kernel which can cause an overflow + // of 8 bytes when calling convert_masked_utf8_to_utf32. If you skip the + // last 16 bytes, and if the data is valid, then it is entirely safe because + // 16 UTF-8 bytes generate much more than 8 bytes. However, you cannot + // generally assume that you have valid UTF-8 input, so we are going to go + // back from the end counting 8 leading bytes, to give us a good margin. + size_t leading_byte = 0; + size_t margin = size; + for (; margin > 0 && leading_byte < 8; margin--) { + leading_byte += (int8_t(in[margin - 1]) > -65); + } + // If the input is long enough, then we have that margin-1 is the fourth + // last leading byte. + const size_t safety_margin = size - margin + 1; // to avoid overruns! + while (pos + 64 + safety_margin <= size) { + simd8x64 input(reinterpret_cast(in + pos)); + if (input.is_ascii()) { + input.store_ascii_as_utf32(utf32_output); + utf32_output += 64; + pos += 64; + } else { + // you might think that a for-loop would work, but under Visual Studio, + // it is not good enough. + static_assert( + (simd8x64::NUM_CHUNKS == 2) || + (simd8x64::NUM_CHUNKS == 4), + "We support either two or four chunks per 64-byte block."); + auto zero = simd8{uint8_t(0)}; + if (simd8x64::NUM_CHUNKS == 2) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + } else if (simd8x64::NUM_CHUNKS == 4) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + this->check_utf8_bytes(input.chunks[2], input.chunks[1]); + this->check_utf8_bytes(input.chunks[3], input.chunks[2]); + } + uint64_t utf8_continuation_mask = input.lt(-65 + 1); + if (errors() || (utf8_continuation_mask & 1)) { + result res = scalar::utf8_to_utf32::rewind_and_convert_with_errors( + pos, in + pos, size - pos, utf32_output); + res.count += pos; + return res; + } + uint64_t utf8_leading_mask = ~utf8_continuation_mask; + uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; + // We process in blocks of up to 12 bytes except possibly + // for fast paths which may process up to 16 bytes. For the + // slow path to work, we should have at least 12 input bytes left. + size_t max_starting_point = (pos + 64) - 12; + // Next loop is going to run at least five times. + while (pos < max_starting_point) { + // Performance note: our ability to compute 'consumed' and + // then shift and recompute is critical. If there is a + // latency of, say, 4 cycles on getting 'consumed', then + // the inner loop might have a total latency of about 6 cycles. + // Yet we process between 6 to 12 inputs bytes, thus we get + // a speed limit between 1 cycle/byte and 0.5 cycle/byte + // for this section of the code. Hence, there is a limit + // to how much we can further increase this latency before + // it seriously harms performance. + size_t consumed = convert_masked_utf8_to_utf32( + in + pos, utf8_end_of_code_point_mask, utf32_output); + pos += consumed; + utf8_end_of_code_point_mask >>= consumed; + } + // At this point there may remain between 0 and 12 bytes in the + // 64-byte block. These bytes will be processed again. So we have an + // 80% efficiency (in the worst case). In practice we expect an + // 85% to 90% efficiency. + } + } + if (errors()) { + result res = scalar::utf8_to_utf32::rewind_and_convert_with_errors( + pos, in + pos, size - pos, utf32_output); + res.count += pos; + return res; + } + if (pos < size) { + result res = scalar::utf8_to_utf32::rewind_and_convert_with_errors( + pos, in + pos, size - pos, utf32_output); + if (res.error) { // In case of error, we want the error position + res.count += pos; + return res; + } else { // In case of success, we want the number of word written + utf32_output += res.count; } + } + return result(error_code::SUCCESS, utf32_output - start); + } - const __m256i dup_even = _mm256_setr_epi16( - 0x0000, 0x0202, 0x0404, 0x0606, 0x0808, 0x0a0a, 0x0c0c, 0x0e0e, - 0x0000, 0x0202, 0x0404, 0x0606, 0x0808, 0x0a0a, 0x0c0c, 0x0e0e); - - /* In this branch we handle three cases: - 1. [0000|0000|0ccc|cccc] => [0ccc|cccc] - - single UFT-8 byte - 2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc] - two - UTF-8 bytes - 3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - - three UTF-8 bytes + simdutf_really_inline bool errors() const { + return this->error.any_bits_set_anywhere(); + } - We expand the input word (16-bit) into two code units (32-bit), thus - we have room for four bytes. However, we need five distinct bit - layouts. Note that the last byte in cases #2 and #3 is the same. +}; // struct utf8_checker +} // namespace utf8_to_utf32 +} // unnamed namespace +} // namespace ppc64 +} // namespace simdutf +/* end file src/generic/utf8_to_utf32/utf8_to_utf32.h */ +/* begin file src/generic/utf8_to_utf32/valid_utf8_to_utf32.h */ - We precompute byte 1 for case #1 and the common byte for cases #2 & #3 - in register t2. +namespace simdutf { +namespace ppc64 { +namespace { +namespace utf8_to_utf32 { - We precompute byte 1 for case #3 and -- **conditionally** -- precompute - either byte 1 for case #2 or byte 2 for case #3. Note that they - differ by exactly one bit. +using namespace simd; - Finally from these two code units we build proper UTF-8 sequence, taking - into account the case (i.e, the number of bytes to write). - */ - /** - * Given [aaaa|bbbb|bbcc|cccc] our goal is to produce: - * t2 => [0ccc|cccc] [10cc|cccc] - * s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb]) - */ -#define simdutf_vec(x) _mm256_set1_epi16(static_cast(x)) - // [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc] - const __m256i t0 = _mm256_shuffle_epi8(in_16, dup_even); - // [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc] - const __m256i t1 = _mm256_and_si256(t0, simdutf_vec(0b0011111101111111)); - // [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc] - const __m256i t2 = _mm256_or_si256(t1, simdutf_vec(0b1000000000000000)); +simdutf_warn_unused size_t convert_valid(const char *input, size_t size, + char32_t *utf32_output) noexcept { + size_t pos = 0; + char32_t *start{utf32_output}; + const size_t safety_margin = 16; // to avoid overruns! + while (pos + 64 + safety_margin <= size) { + simd8x64 in(reinterpret_cast(input + pos)); + if (in.is_ascii()) { + in.store_ascii_as_utf32(utf32_output); + utf32_output += 64; + pos += 64; + } else { + // -65 is 0b10111111 in two-complement's, so largest possible continuation + // byte + uint64_t utf8_continuation_mask = in.lt(-65 + 1); + uint64_t utf8_leading_mask = ~utf8_continuation_mask; + uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; + size_t max_starting_point = (pos + 64) - 12; + while (pos < max_starting_point) { + size_t consumed = convert_masked_utf8_to_utf32( + input + pos, utf8_end_of_code_point_mask, utf32_output); + pos += consumed; + utf8_end_of_code_point_mask >>= consumed; + } + } + } + utf32_output += scalar::utf8_to_utf32::convert_valid(input + pos, size - pos, + utf32_output); + return utf32_output - start; +} - // [aaaa|bbbb|bbcc|cccc] => [0000|aaaa|bbbb|bbcc] - const __m256i s0 = _mm256_srli_epi16(in_16, 4); - // [0000|aaaa|bbbb|bbcc] => [0000|aaaa|bbbb|bb00] - const __m256i s1 = _mm256_and_si256(s0, simdutf_vec(0b0000111111111100)); - // [0000|aaaa|bbbb|bb00] => [00bb|bbbb|0000|aaaa] - const __m256i s2 = _mm256_maddubs_epi16(s1, simdutf_vec(0x0140)); - // [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa] - const __m256i s3 = _mm256_or_si256(s2, simdutf_vec(0b1100000011100000)); - const __m256i m0 = _mm256_andnot_si256(one_or_two_bytes_bytemask, - simdutf_vec(0b0100000000000000)); - const __m256i s4 = _mm256_xor_si256(s3, m0); -#undef simdutf_vec +} // namespace utf8_to_utf32 +} // unnamed namespace +} // namespace ppc64 +} // namespace simdutf +/* end file src/generic/utf8_to_utf32/valid_utf8_to_utf32.h */ +// other functions +/* begin file src/generic/utf16.h */ +namespace simdutf { +namespace ppc64 { +namespace { +namespace utf16 { - // 4. expand code units 16-bit => 32-bit - const __m256i out0 = _mm256_unpacklo_epi16(t2, s4); - const __m256i out1 = _mm256_unpackhi_epi16(t2, s4); +template +simdutf_really_inline size_t count_code_points(const char16_t *in, + size_t size) { + size_t pos = 0; + size_t count = 0; + for (; pos < size / 32 * 32; pos += 32) { + simd16x32 input(reinterpret_cast(in + pos)); + if (!match_system(big_endian)) { + input.swap_bytes(); + } + uint64_t not_pair = input.not_in_range(0xDC00, 0xDFFF); + count += count_ones(not_pair) / 2; + } + return count + + scalar::utf16::count_code_points(in + pos, size - pos); +} - // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle - const uint32_t mask = (one_byte_bitmask & 0x55555555) | - (one_or_two_bytes_bitmask & 0xaaaaaaaa); - // Due to the wider registers, the following path is less likely to be - // useful. - /*if(mask == 0) { - // We only have three-byte code units. Use fast path. - const __m256i shuffle = - _mm256_setr_epi8(2,3,1,6,7,5,10,11,9,14,15,13,-1,-1,-1,-1, - 2,3,1,6,7,5,10,11,9,14,15,13,-1,-1,-1,-1); const __m256i utf8_0 = - _mm256_shuffle_epi8(out0, shuffle); const __m256i utf8_1 = - _mm256_shuffle_epi8(out1, shuffle); - _mm_storeu_si128((__m128i*)utf8_output, _mm256_castsi256_si128(utf8_0)); - utf8_output += 12; - _mm_storeu_si128((__m128i*)utf8_output, _mm256_castsi256_si128(utf8_1)); - utf8_output += 12; - _mm_storeu_si128((__m128i*)utf8_output, - _mm256_extractf128_si256(utf8_0,1)); utf8_output += 12; - _mm_storeu_si128((__m128i*)utf8_output, - _mm256_extractf128_si256(utf8_1,1)); utf8_output += 12; buf += 16; - continue; - }*/ - const uint8_t mask0 = uint8_t(mask); - const uint8_t *row0 = - &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask0][0]; - const __m128i shuffle0 = _mm_loadu_si128((__m128i *)(row0 + 1)); - const __m128i utf8_0 = - _mm_shuffle_epi8(_mm256_castsi256_si128(out0), shuffle0); +template +simdutf_really_inline size_t utf8_length_from_utf16(const char16_t *in, + size_t size) { + size_t pos = 0; + size_t count = 0; + // This algorithm could no doubt be improved! + for (; pos < size / 32 * 32; pos += 32) { + simd16x32 input(reinterpret_cast(in + pos)); + if (!match_system(big_endian)) { + input.swap_bytes(); + } + uint64_t ascii_mask = input.lteq(0x7F); + uint64_t twobyte_mask = input.lteq(0x7FF); + uint64_t not_pair_mask = input.not_in_range(0xD800, 0xDFFF); - const uint8_t mask1 = static_cast(mask >> 8); - const uint8_t *row1 = - &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask1][0]; - const __m128i shuffle1 = _mm_loadu_si128((__m128i *)(row1 + 1)); - const __m128i utf8_1 = - _mm_shuffle_epi8(_mm256_castsi256_si128(out1), shuffle1); + size_t ascii_count = count_ones(ascii_mask) / 2; + size_t twobyte_count = count_ones(twobyte_mask & ~ascii_mask) / 2; + size_t threebyte_count = count_ones(not_pair_mask & ~twobyte_mask) / 2; + size_t fourbyte_count = 32 - count_ones(not_pair_mask) / 2; + count += 2 * fourbyte_count + 3 * threebyte_count + 2 * twobyte_count + + ascii_count; + } + return count + scalar::utf16::utf8_length_from_utf16(in + pos, + size - pos); +} - const uint8_t mask2 = static_cast(mask >> 16); - const uint8_t *row2 = - &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask2][0]; - const __m128i shuffle2 = _mm_loadu_si128((__m128i *)(row2 + 1)); - const __m128i utf8_2 = - _mm_shuffle_epi8(_mm256_extractf128_si256(out0, 1), shuffle2); +template +simdutf_really_inline size_t utf32_length_from_utf16(const char16_t *in, + size_t size) { + return count_code_points(in, size); +} - const uint8_t mask3 = static_cast(mask >> 24); - const uint8_t *row3 = - &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask3][0]; - const __m128i shuffle3 = _mm_loadu_si128((__m128i *)(row3 + 1)); - const __m128i utf8_3 = - _mm_shuffle_epi8(_mm256_extractf128_si256(out1, 1), shuffle3); +simdutf_really_inline void +change_endianness_utf16(const char16_t *in, size_t size, char16_t *output) { + size_t pos = 0; - _mm_storeu_si128((__m128i *)utf8_output, utf8_0); - utf8_output += row0[0]; - _mm_storeu_si128((__m128i *)utf8_output, utf8_1); - utf8_output += row1[0]; - _mm_storeu_si128((__m128i *)utf8_output, utf8_2); - utf8_output += row2[0]; - _mm_storeu_si128((__m128i *)utf8_output, utf8_3); - utf8_output += row3[0]; - buf += 16; - } else { - // case: at least one 32-bit word is larger than 0xFFFF <=> it will - // produce four UTF-8 bytes. Let us do a scalar fallback. It may seem - // wasteful to use scalar code, but being efficient with SIMD may require - // large, non-trivial tables? - size_t forward = 15; - size_t k = 0; - if (size_t(end - buf) < forward + 1) { - forward = size_t(end - buf - 1); - } - for (; k < forward; k++) { - uint32_t word = buf[k]; - if ((word & 0xFFFFFF80) == 0) { // 1-byte (ASCII) - *utf8_output++ = char(word); - } else if ((word & 0xFFFFF800) == 0) { // 2-byte - *utf8_output++ = char((word >> 6) | 0b11000000); - *utf8_output++ = char((word & 0b111111) | 0b10000000); - } else if ((word & 0xFFFF0000) == 0) { // 3-byte - if (word >= 0xD800 && word <= 0xDFFF) { - return std::make_pair( - result(error_code::SURROGATE, buf - start + k), utf8_output); - } - *utf8_output++ = char((word >> 12) | 0b11100000); - *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); - *utf8_output++ = char((word & 0b111111) | 0b10000000); - } else { // 4-byte - if (word > 0x10FFFF) { - return std::make_pair( - result(error_code::TOO_LARGE, buf - start + k), utf8_output); - } - *utf8_output++ = char((word >> 18) | 0b11110000); - *utf8_output++ = char(((word >> 12) & 0b111111) | 0b10000000); - *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); - *utf8_output++ = char((word & 0b111111) | 0b10000000); - } - } - buf += k; - } - } // while + while (pos < size / 32 * 32) { + simd16x32 input(reinterpret_cast(in + pos)); + input.swap_bytes(); + input.store(reinterpret_cast(output)); + pos += 32; + output += 32; + } - return std::make_pair(result(error_code::SUCCESS, buf - start), utf8_output); + scalar::utf16::change_endianness_utf16(in + pos, size - pos, output); } -/* end file src/icelake/icelake_convert_utf32_to_utf8.inl.cpp */ -/* begin file src/icelake/icelake_convert_utf32_to_utf16.inl.cpp */ -// file included directly -// Todo: currently, this is just the haswell code, optimize for icelake kernel. -template -std::pair -avx512_convert_utf32_to_utf16(const char32_t *buf, size_t len, - char16_t *utf16_output) { - const char32_t *end = buf + len; +} // namespace utf16 +} // unnamed namespace +} // namespace ppc64 +} // namespace simdutf +/* end file src/generic/utf16.h */ +/* begin file src/generic/utf8.h */ - const size_t safety_margin = - 12; // to avoid overruns, see issue - // https://github.com/simdutf/simdutf/issues/92 - __m256i forbidden_bytemask = _mm256_setzero_si256(); +namespace simdutf { +namespace ppc64 { +namespace { +namespace utf8 { - while (end - buf >= std::ptrdiff_t(8 + safety_margin)) { - __m256i in = _mm256_loadu_si256((__m256i *)buf); +using namespace simd; - const __m256i v_00000000 = _mm256_setzero_si256(); - const __m256i v_ffff0000 = _mm256_set1_epi32((int32_t)0xffff0000); +simdutf_really_inline size_t count_code_points(const char *in, size_t size) { + size_t pos = 0; + size_t count = 0; + for (; pos + 64 <= size; pos += 64) { + simd8x64 input(reinterpret_cast(in + pos)); + uint64_t utf8_continuation_mask = input.gt(-65); + count += count_ones(utf8_continuation_mask); + } + return count + scalar::utf8::count_code_points(in + pos, size - pos); +} - // no bits set above 16th bit <=> can pack to UTF16 without surrogate pairs - const __m256i saturation_bytemask = - _mm256_cmpeq_epi32(_mm256_and_si256(in, v_ffff0000), v_00000000); - const uint32_t saturation_bitmask = - static_cast(_mm256_movemask_epi8(saturation_bytemask)); +simdutf_really_inline size_t utf16_length_from_utf8(const char *in, + size_t size) { + size_t pos = 0; + size_t count = 0; + // This algorithm could no doubt be improved! + for (; pos + 64 <= size; pos += 64) { + simd8x64 input(reinterpret_cast(in + pos)); + uint64_t utf8_continuation_mask = input.lt(-65 + 1); + // We count one word for anything that is not a continuation (so + // leading bytes). + count += 64 - count_ones(utf8_continuation_mask); + int64_t utf8_4byte = input.gteq_unsigned(240); + count += count_ones(utf8_4byte); + } + return count + scalar::utf8::utf16_length_from_utf8(in + pos, size - pos); +} +} // namespace utf8 +} // unnamed namespace +} // namespace ppc64 +} // namespace simdutf +/* end file src/generic/utf8.h */ - if (saturation_bitmask == 0xffffffff) { - const __m256i v_f800 = _mm256_set1_epi32((uint32_t)0xf800); - const __m256i v_d800 = _mm256_set1_epi32((uint32_t)0xd800); - forbidden_bytemask = _mm256_or_si256( - forbidden_bytemask, - _mm256_cmpeq_epi32(_mm256_and_si256(in, v_f800), v_d800)); +// +// Implementation-specific overrides +// +namespace simdutf { +namespace ppc64 { - __m128i utf16_packed = _mm_packus_epi32(_mm256_castsi256_si128(in), - _mm256_extractf128_si256(in, 1)); - if (big_endian) { - const __m128i swap = - _mm_setr_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14); - utf16_packed = _mm_shuffle_epi8(utf16_packed, swap); - } - _mm_storeu_si128((__m128i *)utf16_output, utf16_packed); - utf16_output += 8; - buf += 8; - } else { - size_t forward = 7; - size_t k = 0; - if (size_t(end - buf) < forward + 1) { - forward = size_t(end - buf - 1); - } - for (; k < forward; k++) { - uint32_t word = buf[k]; - if ((word & 0xFFFF0000) == 0) { - // will not generate a surrogate pair - if (word >= 0xD800 && word <= 0xDFFF) { - return std::make_pair(nullptr, utf16_output); - } - *utf16_output++ = - big_endian - ? char16_t((uint16_t(word) >> 8) | (uint16_t(word) << 8)) - : char16_t(word); - } else { - // will generate a surrogate pair - if (word > 0x10FFFF) { - return std::make_pair(nullptr, utf16_output); - } - word -= 0x10000; - uint16_t high_surrogate = uint16_t(0xD800 + (word >> 10)); - uint16_t low_surrogate = uint16_t(0xDC00 + (word & 0x3FF)); - if (big_endian) { - high_surrogate = - uint16_t((high_surrogate >> 8) | (high_surrogate << 8)); - low_surrogate = - uint16_t((low_surrogate >> 8) | (low_surrogate << 8)); - } - *utf16_output++ = char16_t(high_surrogate); - *utf16_output++ = char16_t(low_surrogate); - } - } - buf += k; +simdutf_warn_unused int +implementation::detect_encodings(const char *input, + size_t length) const noexcept { + // If there is a BOM, then we trust it. + auto bom_encoding = simdutf::BOM::check_bom(input, length); + if (bom_encoding != encoding_type::unspecified) { + return bom_encoding; + } + // todo: reimplement as a one-pass algorithm. + int out = 0; + if (validate_utf8(input, length)) { + out |= encoding_type::UTF8; + } + if ((length % 2) == 0) { + if (validate_utf16(reinterpret_cast(input), length / 2)) { + out |= encoding_type::UTF16_LE; } } - - // check for invalid input - if (static_cast(_mm256_movemask_epi8(forbidden_bytemask)) != 0) { - return std::make_pair(nullptr, utf16_output); + if ((length % 4) == 0) { + if (validate_utf32(reinterpret_cast(input), length / 4)) { + out |= encoding_type::UTF32_LE; + } } - return std::make_pair(buf, utf16_output); + return out; } -// Todo: currently, this is just the haswell code, optimize for icelake kernel. -template -std::pair -avx512_convert_utf32_to_utf16_with_errors(const char32_t *buf, size_t len, - char16_t *utf16_output) { - const char32_t *start = buf; - const char32_t *end = buf + len; +simdutf_warn_unused bool +implementation::validate_utf8(const char *buf, size_t len) const noexcept { + return ppc64::utf8_validation::generic_validate_utf8(buf, len); +} - const size_t safety_margin = - 12; // to avoid overruns, see issue - // https://github.com/simdutf/simdutf/issues/92 +simdutf_warn_unused result implementation::validate_utf8_with_errors( + const char *buf, size_t len) const noexcept { + return ppc64::utf8_validation::generic_validate_utf8_with_errors(buf, len); +} - while (end - buf >= std::ptrdiff_t(8 + safety_margin)) { - __m256i in = _mm256_loadu_si256((__m256i *)buf); +simdutf_warn_unused bool +implementation::validate_ascii(const char *buf, size_t len) const noexcept { + return ppc64::utf8_validation::generic_validate_ascii(buf, len); +} - const __m256i v_00000000 = _mm256_setzero_si256(); - const __m256i v_ffff0000 = _mm256_set1_epi32((int32_t)0xffff0000); +simdutf_warn_unused result implementation::validate_ascii_with_errors( + const char *buf, size_t len) const noexcept { + return ppc64::utf8_validation::generic_validate_ascii_with_errors(buf, len); +} - // no bits set above 16th bit <=> can pack to UTF16 without surrogate pairs - const __m256i saturation_bytemask = - _mm256_cmpeq_epi32(_mm256_and_si256(in, v_ffff0000), v_00000000); - const uint32_t saturation_bitmask = - static_cast(_mm256_movemask_epi8(saturation_bytemask)); +simdutf_warn_unused bool +implementation::validate_utf16le(const char16_t *buf, + size_t len) const noexcept { + return scalar::utf16::validate(buf, len); +} - if (saturation_bitmask == 0xffffffff) { - const __m256i v_f800 = _mm256_set1_epi32((uint32_t)0xf800); - const __m256i v_d800 = _mm256_set1_epi32((uint32_t)0xd800); - const __m256i forbidden_bytemask = - _mm256_cmpeq_epi32(_mm256_and_si256(in, v_f800), v_d800); - if (static_cast(_mm256_movemask_epi8(forbidden_bytemask)) != - 0x0) { - return std::make_pair(result(error_code::SURROGATE, buf - start), - utf16_output); - } +simdutf_warn_unused bool +implementation::validate_utf16be(const char16_t *buf, + size_t len) const noexcept { + return scalar::utf16::validate(buf, len); +} - __m128i utf16_packed = _mm_packus_epi32(_mm256_castsi256_si128(in), - _mm256_extractf128_si256(in, 1)); - if (big_endian) { - const __m128i swap = - _mm_setr_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14); - utf16_packed = _mm_shuffle_epi8(utf16_packed, swap); - } - _mm_storeu_si128((__m128i *)utf16_output, utf16_packed); - utf16_output += 8; - buf += 8; - } else { - size_t forward = 7; - size_t k = 0; - if (size_t(end - buf) < forward + 1) { - forward = size_t(end - buf - 1); - } - for (; k < forward; k++) { - uint32_t word = buf[k]; - if ((word & 0xFFFF0000) == 0) { - // will not generate a surrogate pair - if (word >= 0xD800 && word <= 0xDFFF) { - return std::make_pair( - result(error_code::SURROGATE, buf - start + k), utf16_output); - } - *utf16_output++ = - big_endian - ? char16_t((uint16_t(word) >> 8) | (uint16_t(word) << 8)) - : char16_t(word); - } else { - // will generate a surrogate pair - if (word > 0x10FFFF) { - return std::make_pair( - result(error_code::TOO_LARGE, buf - start + k), utf16_output); - } - word -= 0x10000; - uint16_t high_surrogate = uint16_t(0xD800 + (word >> 10)); - uint16_t low_surrogate = uint16_t(0xDC00 + (word & 0x3FF)); - if (big_endian) { - high_surrogate = - uint16_t((high_surrogate >> 8) | (high_surrogate << 8)); - low_surrogate = - uint16_t((low_surrogate >> 8) | (low_surrogate << 8)); - } - *utf16_output++ = char16_t(high_surrogate); - *utf16_output++ = char16_t(low_surrogate); - } - } - buf += k; - } - } +simdutf_warn_unused result implementation::validate_utf16le_with_errors( + const char16_t *buf, size_t len) const noexcept { + return scalar::utf16::validate_with_errors(buf, len); +} - return std::make_pair(result(error_code::SUCCESS, buf - start), utf16_output); +simdutf_warn_unused result implementation::validate_utf16be_with_errors( + const char16_t *buf, size_t len) const noexcept { + return scalar::utf16::validate_with_errors(buf, len); } -/* end file src/icelake/icelake_convert_utf32_to_utf16.inl.cpp */ -/* begin file src/icelake/icelake_ascii_validation.inl.cpp */ -// file included directly -bool validate_ascii(const char *buf, size_t len) { - const char *end = buf + len; - const __m512i ascii = _mm512_set1_epi8((uint8_t)0x80); - __m512i running_or = _mm512_setzero_si512(); - for (; end - buf >= 64; buf += 64) { - const __m512i utf8 = _mm512_loadu_si512((const __m512i *)buf); - running_or = _mm512_ternarylogic_epi32(running_or, utf8, ascii, - 0xf8); // running_or | (utf8 & ascii) - } - if (buf < end) { - const __m512i utf8 = _mm512_maskz_loadu_epi8( - (uint64_t(1) << (end - buf)) - 1, (const __m512i *)buf); - running_or = _mm512_ternarylogic_epi32(running_or, utf8, ascii, - 0xf8); // running_or | (utf8 & ascii) - } - return (_mm512_test_epi8_mask(running_or, running_or) == 0); +simdutf_warn_unused result implementation::validate_utf32_with_errors( + const char32_t *buf, size_t len) const noexcept { + return scalar::utf32::validate_with_errors(buf, len); } -/* end file src/icelake/icelake_ascii_validation.inl.cpp */ -/* begin file src/icelake/icelake_utf32_validation.inl.cpp */ -// file included directly -const char32_t *validate_utf32(const char32_t *buf, size_t len) { - if (len < 16) { - return buf; - } - const char32_t *end = buf + len - 16; +simdutf_warn_unused bool +implementation::validate_utf32(const char16_t *buf, size_t len) const noexcept { + return scalar::utf32::validate(buf, len); +} - const __m512i offset = _mm512_set1_epi32((uint32_t)0xffff2000); - __m512i currentmax = _mm512_setzero_si512(); - __m512i currentoffsetmax = _mm512_setzero_si512(); +simdutf_warn_unused size_t implementation::convert_utf8_to_utf16le( + const char * /*buf*/, size_t /*len*/, + char16_t * /*utf16_output*/) const noexcept { + return 0; // stub +} - while (buf <= end) { - __m512i utf32 = _mm512_loadu_si512((const __m512i *)buf); - buf += 16; - currentoffsetmax = - _mm512_max_epu32(_mm512_add_epi32(utf32, offset), currentoffsetmax); - currentmax = _mm512_max_epu32(utf32, currentmax); - } +simdutf_warn_unused size_t implementation::convert_utf8_to_utf16be( + const char * /*buf*/, size_t /*len*/, + char16_t * /*utf16_output*/) const noexcept { + return 0; // stub +} - const __m512i standardmax = _mm512_set1_epi32((uint32_t)0x10ffff); - const __m512i standardoffsetmax = _mm512_set1_epi32((uint32_t)0xfffff7ff); - __m512i is_zero = - _mm512_xor_si512(_mm512_max_epu32(currentmax, standardmax), standardmax); - if (_mm512_test_epi8_mask(is_zero, is_zero) != 0) { - return nullptr; - } - is_zero = _mm512_xor_si512( - _mm512_max_epu32(currentoffsetmax, standardoffsetmax), standardoffsetmax); - if (_mm512_test_epi8_mask(is_zero, is_zero) != 0) { - return nullptr; - } +simdutf_warn_unused result implementation::convert_utf8_to_utf16le_with_errors( + const char * /*buf*/, size_t /*len*/, + char16_t * /*utf16_output*/) const noexcept { + return result(error_code::OTHER, 0); // stub +} - return buf; +simdutf_warn_unused result implementation::convert_utf8_to_utf16be_with_errors( + const char * /*buf*/, size_t /*len*/, + char16_t * /*utf16_output*/) const noexcept { + return result(error_code::OTHER, 0); // stub } -/* end file src/icelake/icelake_utf32_validation.inl.cpp */ -/* begin file src/icelake/icelake_convert_latin1_to_utf8.inl.cpp */ -// file included directly -static inline size_t latin1_to_utf8_avx512_vec(__m512i input, size_t input_len, - char *utf8_output, - int mask_output) { - __mmask64 nonascii = _mm512_movepi8_mask(input); - size_t output_size = input_len + (size_t)count_ones(nonascii); +simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf16le( + const char * /*buf*/, size_t /*len*/, + char16_t * /*utf16_output*/) const noexcept { + return 0; // stub +} - // Mask to denote whether the byte is a leading byte that is not ascii - __mmask64 sixth = _mm512_cmpge_epu8_mask( - input, _mm512_set1_epi8(-64)); // binary representation of -64: 1100 0000 +simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf16be( + const char * /*buf*/, size_t /*len*/, + char16_t * /*utf16_output*/) const noexcept { + return 0; // stub +} - const uint64_t alternate_bits = UINT64_C(0x5555555555555555); - uint64_t ascii = ~nonascii; - // the bits in ascii are inverted and zeros are interspersed in between them - uint64_t maskA = ~_pdep_u64(ascii, alternate_bits); - uint64_t maskB = ~_pdep_u64(ascii >> 32, alternate_bits); +simdutf_warn_unused size_t implementation::convert_utf8_to_utf32( + const char * /*buf*/, size_t /*len*/, + char32_t * /*utf16_output*/) const noexcept { + return 0; // stub +} - // interleave bytes from top and bottom halves (abcd...ABCD -> aAbBcCdD) - __m512i input_interleaved = _mm512_permutexvar_epi8( - _mm512_set_epi32(0x3f1f3e1e, 0x3d1d3c1c, 0x3b1b3a1a, 0x39193818, - 0x37173616, 0x35153414, 0x33133212, 0x31113010, - 0x2f0f2e0e, 0x2d0d2c0c, 0x2b0b2a0a, 0x29092808, - 0x27072606, 0x25052404, 0x23032202, 0x21012000), - input); +simdutf_warn_unused result implementation::convert_utf8_to_utf32_with_errors( + const char * /*buf*/, size_t /*len*/, + char32_t * /*utf16_output*/) const noexcept { + return result(error_code::OTHER, 0); // stub +} - // double size of each byte, and insert the leading byte 1100 0010 +simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf32( + const char * /*buf*/, size_t /*len*/, + char32_t * /*utf16_output*/) const noexcept { + return 0; // stub +} - /* - upscale the bytes to 16-bit value, adding the 0b11000000 leading byte in the - process. We adjust for the bytes that have their two most significant bits. - This takes care of the first 32 bytes, assuming we interleaved the bytes. */ - __m512i outputA = - _mm512_shldi_epi16(input_interleaved, _mm512_set1_epi8(-62), 8); - outputA = _mm512_mask_add_epi16( - outputA, (__mmask32)sixth, outputA, - _mm512_set1_epi16(1 - 0x4000)); // 1- 0x4000 = 1100 0000 0000 0001???? +simdutf_warn_unused size_t implementation::convert_utf16le_to_utf8( + const char16_t *buf, size_t len, char *utf8_output) const noexcept { + return scalar::utf16_to_utf8::convert(buf, len, + utf8_output); +} - // in the second 32-bit half, set first or second option based on whether - // original input is leading byte (second case) or not (first case) - __m512i leadingB = - _mm512_mask_blend_epi16((__mmask32)(sixth >> 32), - _mm512_set1_epi16(0x00c2), // 0000 0000 1101 0010 - _mm512_set1_epi16(0x40c3)); // 0100 0000 1100 0011 - __m512i outputB = _mm512_ternarylogic_epi32( - input_interleaved, leadingB, _mm512_set1_epi16((short)0xff00), - (240 & 170) ^ 204); // (input_interleaved & 0xff00) ^ leadingB +simdutf_warn_unused size_t implementation::convert_utf16be_to_utf8( + const char16_t *buf, size_t len, char *utf8_output) const noexcept { + return scalar::utf16_to_utf8::convert(buf, len, utf8_output); +} - // prune redundant bytes - outputA = _mm512_maskz_compress_epi8(maskA, outputA); - outputB = _mm512_maskz_compress_epi8(maskB, outputB); +simdutf_warn_unused result implementation::convert_utf16le_to_utf8_with_errors( + const char16_t *buf, size_t len, char *utf8_output) const noexcept { + return scalar::utf16_to_utf8::convert_with_errors( + buf, len, utf8_output); +} - size_t output_sizeA = (size_t)count_ones((uint32_t)nonascii) + 32; +simdutf_warn_unused result implementation::convert_utf16be_to_utf8_with_errors( + const char16_t *buf, size_t len, char *utf8_output) const noexcept { + return scalar::utf16_to_utf8::convert_with_errors( + buf, len, utf8_output); +} - if (mask_output) { - if (input_len > 32) { // is the second half of the input vector used? - __mmask64 write_mask = _bzhi_u64(~0ULL, (unsigned int)output_sizeA); - _mm512_mask_storeu_epi8(utf8_output, write_mask, outputA); - utf8_output += output_sizeA; - write_mask = _bzhi_u64(~0ULL, (unsigned int)(output_size - output_sizeA)); - _mm512_mask_storeu_epi8(utf8_output, write_mask, outputB); - } else { - __mmask64 write_mask = _bzhi_u64(~0ULL, (unsigned int)output_size); - _mm512_mask_storeu_epi8(utf8_output, write_mask, outputA); - } - } else { - _mm512_storeu_si512(utf8_output, outputA); - utf8_output += output_sizeA; - _mm512_storeu_si512(utf8_output, outputB); - } - return output_size; +simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_utf8( + const char16_t *buf, size_t len, char *utf8_output) const noexcept { + return scalar::utf16_to_utf8::convert_valid(buf, len, + utf8_output); } -static inline size_t latin1_to_utf8_avx512_branch(__m512i input, - char *utf8_output) { - __mmask64 nonascii = _mm512_movepi8_mask(input); - if (nonascii) { - return latin1_to_utf8_avx512_vec(input, 64, utf8_output, 0); - } else { - _mm512_storeu_si512(utf8_output, input); - return 64; - } +simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_utf8( + const char16_t *buf, size_t len, char *utf8_output) const noexcept { + return scalar::utf16_to_utf8::convert_valid(buf, len, + utf8_output); } -size_t latin1_to_utf8_avx512_start(const char *buf, size_t len, - char *utf8_output) { - char *start = utf8_output; - size_t pos = 0; - // if there's at least 128 bytes remaining, we don't need to mask the output - for (; pos + 128 <= len; pos += 64) { - __m512i input = _mm512_loadu_si512((__m512i *)(buf + pos)); - utf8_output += latin1_to_utf8_avx512_branch(input, utf8_output); - } - // in the last 128 bytes, the first 64 may require masking the output - if (pos + 64 <= len) { - __m512i input = _mm512_loadu_si512((__m512i *)(buf + pos)); - utf8_output += latin1_to_utf8_avx512_vec(input, 64, utf8_output, 1); - pos += 64; - } - // with the last 64 bytes, the input also needs to be masked - if (pos < len) { - __mmask64 load_mask = _bzhi_u64(~0ULL, (unsigned int)(len - pos)); - __m512i input = _mm512_maskz_loadu_epi8(load_mask, (__m512i *)(buf + pos)); - utf8_output += latin1_to_utf8_avx512_vec(input, len - pos, utf8_output, 1); - } - return (size_t)(utf8_output - start); +simdutf_warn_unused size_t implementation::convert_utf32_to_utf8( + const char32_t *buf, size_t len, char *utf8_output) const noexcept { + return scalar::utf32_to_utf8::convert(buf, len, utf8_output); } -/* end file src/icelake/icelake_convert_latin1_to_utf8.inl.cpp */ -/* begin file src/icelake/icelake_convert_latin1_to_utf16.inl.cpp */ -// file included directly -template -size_t icelake_convert_latin1_to_utf16(const char *latin1_input, size_t len, - char16_t *utf16_output) { - size_t rounded_len = len & ~0x1F; // Round down to nearest multiple of 32 - __m512i byteflip = _mm512_setr_epi64(0x0607040502030001, 0x0e0f0c0d0a0b0809, - 0x0607040502030001, 0x0e0f0c0d0a0b0809, - 0x0607040502030001, 0x0e0f0c0d0a0b0809, - 0x0607040502030001, 0x0e0f0c0d0a0b0809); - for (size_t i = 0; i < rounded_len; i += 32) { - // Load 32 Latin1 characters into a 256-bit register - __m256i in = _mm256_loadu_si256((__m256i *)&latin1_input[i]); - // Zero extend each set of 8 Latin1 characters to 32 16-bit integers - __m512i out = _mm512_cvtepu8_epi16(in); - if (big_endian) { - out = _mm512_shuffle_epi8(out, byteflip); - } - // Store the results back to memory - _mm512_storeu_si512((__m512i *)&utf16_output[i], out); - } - if (rounded_len != len) { - uint32_t mask = uint32_t(1 << (len - rounded_len)) - 1; - __m256i in = _mm256_maskz_loadu_epi8(mask, latin1_input + rounded_len); +simdutf_warn_unused result implementation::convert_utf32_to_utf8_with_errors( + const char32_t *buf, size_t len, char *utf8_output) const noexcept { + return scalar::utf32_to_utf8::convert_with_errors(buf, len, utf8_output); +} - // Zero extend each set of 8 Latin1 characters to 32 16-bit integers - __m512i out = _mm512_cvtepu8_epi16(in); - if (big_endian) { - out = _mm512_shuffle_epi8(out, byteflip); - } - // Store the results back to memory - _mm512_mask_storeu_epi16(utf16_output + rounded_len, mask, out); - } +simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf8( + const char32_t *buf, size_t len, char *utf8_output) const noexcept { + return scalar::utf32_to_utf8::convert_valid(buf, len, utf8_output); +} - return len; +simdutf_warn_unused size_t implementation::convert_utf32_to_utf16le( + const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { + return scalar::utf32_to_utf16::convert(buf, len, + utf16_output); } -/* end file src/icelake/icelake_convert_latin1_to_utf16.inl.cpp */ -/* begin file src/icelake/icelake_convert_latin1_to_utf32.inl.cpp */ -std::pair -avx512_convert_latin1_to_utf32(const char *buf, size_t len, - char32_t *utf32_output) { - size_t rounded_len = len & ~0xF; // Round down to nearest multiple of 16 - for (size_t i = 0; i < rounded_len; i += 16) { - // Load 16 Latin1 characters into a 128-bit register - __m128i in = _mm_loadu_si128((__m128i *)&buf[i]); +simdutf_warn_unused size_t implementation::convert_utf32_to_utf16be( + const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { + return scalar::utf32_to_utf16::convert(buf, len, + utf16_output); +} - // Zero extend each set of 8 Latin1 characters to 16 32-bit integers using - // vpmovzxbd - __m512i out = _mm512_cvtepu8_epi32(in); +simdutf_warn_unused result implementation::convert_utf32_to_utf16le_with_errors( + const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { + return scalar::utf32_to_utf16::convert_with_errors( + buf, len, utf16_output); +} - // Store the results back to memory - _mm512_storeu_si512((__m512i *)&utf32_output[i], out); - } +simdutf_warn_unused result implementation::convert_utf32_to_utf16be_with_errors( + const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { + return scalar::utf32_to_utf16::convert_with_errors( + buf, len, utf16_output); +} - // Return pointers pointing to where we left off - return std::make_pair(buf + rounded_len, utf32_output + rounded_len); +simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf16le( + const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { + return scalar::utf32_to_utf16::convert_valid( + buf, len, utf16_output); } -/* end file src/icelake/icelake_convert_latin1_to_utf32.inl.cpp */ -/* begin file src/icelake/icelake_base64.inl.cpp */ -// file included directly -/** - * References and further reading: - * - * Wojciech Muła, Daniel Lemire, Base64 encoding and decoding at almost the - * speed of a memory copy, Software: Practice and Experience 50 (2), 2020. - * https://arxiv.org/abs/1910.05109 - * - * Wojciech Muła, Daniel Lemire, Faster Base64 Encoding and Decoding using AVX2 - * Instructions, ACM Transactions on the Web 12 (3), 2018. - * https://arxiv.org/abs/1704.00605 - * - * Simon Josefsson. 2006. The Base16, Base32, and Base64 Data Encodings. - * https://tools.ietf.org/html/rfc4648. (2006). Internet Engineering Task Force, - * Request for Comments: 4648. - * - * Alfred Klomp. 2014a. Fast Base64 encoding/decoding with SSE vectorization. - * http://www.alfredklomp.com/programming/sse-base64/. (2014). - * - * Alfred Klomp. 2014b. Fast Base64 stream encoder/decoder in C99, with SIMD - * acceleration. https://github.com/aklomp/base64. (2014). - * - * Hanson Char. 2014. A Fast and Correct Base 64 Codec. (2014). - * https://aws.amazon.com/blogs/developer/a-fast-and-correct-base-64-codec/ - * - * Nick Kopp. 2013. Base64 Encoding on a GPU. - * https://www.codeproject.com/Articles/276993/Base-Encoding-on-a-GPU. (2013). - */ -struct block64 { - __m512i chunks[1]; -}; +simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf16be( + const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { + return scalar::utf32_to_utf16::convert_valid(buf, len, + utf16_output); +} -template -size_t encode_base64(char *dst, const char *src, size_t srclen, - base64_options options) { - // credit: Wojciech Muła - const uint8_t *input = (const uint8_t *)src; +simdutf_warn_unused size_t implementation::convert_utf16le_to_utf32( + const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { + return scalar::utf16_to_utf32::convert(buf, len, + utf32_output); +} - uint8_t *out = (uint8_t *)dst; - static const char *lookup_tbl = - base64_url - ? "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_" - : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +simdutf_warn_unused size_t implementation::convert_utf16be_to_utf32( + const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { + return scalar::utf16_to_utf32::convert(buf, len, + utf32_output); +} - const __m512i shuffle_input = _mm512_setr_epi32( - 0x01020001, 0x04050304, 0x07080607, 0x0a0b090a, 0x0d0e0c0d, 0x10110f10, - 0x13141213, 0x16171516, 0x191a1819, 0x1c1d1b1c, 0x1f201e1f, 0x22232122, - 0x25262425, 0x28292728, 0x2b2c2a2b, 0x2e2f2d2e); - const __m512i lookup = - _mm512_loadu_si512(reinterpret_cast(lookup_tbl)); - const __m512i multi_shifts = _mm512_set1_epi64(UINT64_C(0x3036242a1016040a)); - size_t size = srclen; - __mmask64 input_mask = 0xffffffffffff; // (1 << 48) - 1 - while (size >= 48) { - const __m512i v = _mm512_maskz_loadu_epi8( - input_mask, reinterpret_cast(input)); - const __m512i in = _mm512_permutexvar_epi8(shuffle_input, v); - const __m512i indices = _mm512_multishift_epi64_epi8(multi_shifts, in); - const __m512i result = _mm512_permutexvar_epi8(indices, lookup); - _mm512_storeu_si512(reinterpret_cast<__m512i *>(out), result); - out += 64; - input += 48; - size -= 48; - } - input_mask = ((__mmask64)1 << size) - 1; - const __m512i v = _mm512_maskz_loadu_epi8( - input_mask, reinterpret_cast(input)); - const __m512i in = _mm512_permutexvar_epi8(shuffle_input, v); - const __m512i indices = _mm512_multishift_epi64_epi8(multi_shifts, in); - bool padding_needed = - (((options & base64_url) == 0) ^ - ((options & base64_reverse_padding) == base64_reverse_padding)); - size_t padding_amount = ((size % 3) > 0) ? (3 - (size % 3)) : 0; - size_t output_len = ((size + 2) / 3) * 4; - size_t non_padded_output_len = output_len - padding_amount; - if (!padding_needed) { - output_len = non_padded_output_len; - } - __mmask64 output_mask = output_len == 64 ? (__mmask64)UINT64_MAX - : ((__mmask64)1 << output_len) - 1; - __m512i result = _mm512_mask_permutexvar_epi8( - _mm512_set1_epi8('='), ((__mmask64)1 << non_padded_output_len) - 1, - indices, lookup); - _mm512_mask_storeu_epi8(reinterpret_cast<__m512i *>(out), output_mask, - result); - return (size_t)(out - (uint8_t *)dst) + output_len; +simdutf_warn_unused result implementation::convert_utf16le_to_utf32_with_errors( + const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { + return scalar::utf16_to_utf32::convert_with_errors( + buf, len, utf32_output); } -template -static inline uint64_t to_base64_mask(block64 *b, bool *error) { - __m512i input = b->chunks[0]; - const __m512i ascii_space_tbl = _mm512_set_epi8( - 0, 0, 13, 12, 0, 10, 9, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 13, 12, 0, 10, - 9, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 13, 12, 0, 10, 9, 0, 0, 0, 0, 0, 0, - 0, 0, 32, 0, 0, 13, 12, 0, 10, 9, 0, 0, 0, 0, 0, 0, 0, 0, 32); - __m512i lookup0; - if (base64_url) { - lookup0 = _mm512_set_epi8( - -128, -128, -128, -128, -128, -128, 61, 60, 59, 58, 57, 56, 55, 54, 53, - 52, -128, -128, 62, -128, -128, -128, -128, -128, -128, -128, -128, - -128, -128, -128, -128, -1, -128, -128, -128, -128, -128, -128, -128, - -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -1, - -128, -128, -1, -1, -128, -128, -128, -128, -128, -128, -128, -128, -1); - } else { - lookup0 = _mm512_set_epi8( - -128, -128, -128, -128, -128, -128, 61, 60, 59, 58, 57, 56, 55, 54, 53, - 52, 63, -128, -128, -128, 62, -128, -128, -128, -128, -128, -128, -128, - -128, -128, -128, -1, -128, -128, -128, -128, -128, -128, -128, -128, - -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -1, -128, - -128, -1, -1, -128, -128, -128, -128, -128, -128, -128, -128, -128); - } - __m512i lookup1; - if (base64_url) { - lookup1 = _mm512_set_epi8( - -128, -128, -128, -128, -128, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, - 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, -128, - 63, -128, -128, -128, -128, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, - 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -128); - } else { - lookup1 = _mm512_set_epi8( - -128, -128, -128, -128, -128, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, - 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, -128, - -128, -128, -128, -128, -128, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, - 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -128); - } +simdutf_warn_unused result implementation::convert_utf16be_to_utf32_with_errors( + const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { + return scalar::utf16_to_utf32::convert_with_errors( + buf, len, utf32_output); +} - const __m512i translated = _mm512_permutex2var_epi8(lookup0, input, lookup1); - const __m512i combined = _mm512_or_si512(translated, input); - const __mmask64 mask = _mm512_movepi8_mask(combined); - if (mask) { - const __mmask64 spaces = _mm512_cmpeq_epi8_mask( - _mm512_shuffle_epi8(ascii_space_tbl, input), input); - *error |= (mask != spaces); - } - b->chunks[0] = translated; +simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_utf32( + const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { + return scalar::utf16_to_utf32::convert_valid( + buf, len, utf32_output); +} - return mask; +simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_utf32( + const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { + return scalar::utf16_to_utf32::convert_valid(buf, len, + utf32_output); } -static inline void copy_block(block64 *b, char *output) { - _mm512_storeu_si512(reinterpret_cast<__m512i *>(output), b->chunks[0]); +void implementation::change_endianness_utf16(const char16_t *input, + size_t length, + char16_t *output) const noexcept { + scalar::utf16::change_endianness_utf16(input, length, output); +} + +simdutf_warn_unused size_t implementation::count_utf16le( + const char16_t *input, size_t length) const noexcept { + return scalar::utf16::count_code_points(input, length); +} + +simdutf_warn_unused size_t implementation::count_utf16be( + const char16_t *input, size_t length) const noexcept { + return scalar::utf16::count_code_points(input, length); +} + +simdutf_warn_unused size_t +implementation::count_utf8(const char *input, size_t length) const noexcept { + return utf8::count_code_points(input, length); +} + +simdutf_warn_unused size_t implementation::utf8_length_from_utf16le( + const char16_t *input, size_t length) const noexcept { + return scalar::utf16::utf8_length_from_utf16(input, + length); +} + +simdutf_warn_unused size_t implementation::utf8_length_from_utf16be( + const char16_t *input, size_t length) const noexcept { + return scalar::utf16::utf8_length_from_utf16(input, length); +} + +simdutf_warn_unused size_t implementation::utf32_length_from_utf16le( + const char16_t *input, size_t length) const noexcept { + return scalar::utf16::utf32_length_from_utf16(input, + length); } -static inline uint64_t compress_block(block64 *b, uint64_t mask, char *output) { - uint64_t nmask = ~mask; - __m512i c = _mm512_maskz_compress_epi8(nmask, b->chunks[0]); - _mm512_storeu_si512(reinterpret_cast<__m512i *>(output), c); - return _mm_popcnt_u64(nmask); +simdutf_warn_unused size_t implementation::utf32_length_from_utf16be( + const char16_t *input, size_t length) const noexcept { + return scalar::utf16::utf32_length_from_utf16(input, length); } -// The caller of this function is responsible to ensure that there are 64 bytes -// available from reading at src. The data is read into a block64 structure. -static inline void load_block(block64 *b, const char *src) { - b->chunks[0] = _mm512_loadu_si512(reinterpret_cast(src)); +simdutf_warn_unused size_t implementation::utf16_length_from_utf8( + const char *input, size_t length) const noexcept { + return scalar::utf8::utf16_length_from_utf8(input, length); } -// The caller of this function is responsible to ensure that there are 128 bytes -// available from reading at src. The data is read into a block64 structure. -static inline void load_block(block64 *b, const char16_t *src) { - __m512i m1 = _mm512_loadu_si512(reinterpret_cast(src)); - __m512i m2 = _mm512_loadu_si512(reinterpret_cast(src + 32)); - __m512i p = _mm512_packus_epi16(m1, m2); - b->chunks[0] = - _mm512_permutexvar_epi64(_mm512_setr_epi64(0, 2, 4, 6, 1, 3, 5, 7), p); +simdutf_warn_unused size_t implementation::utf8_length_from_utf32( + const char32_t *input, size_t length) const noexcept { + return scalar::utf32::utf8_length_from_utf32(input, length); } -static inline void base64_decode(char *out, __m512i str) { - const __m512i merge_ab_and_bc = - _mm512_maddubs_epi16(str, _mm512_set1_epi32(0x01400140)); - const __m512i merged = - _mm512_madd_epi16(merge_ab_and_bc, _mm512_set1_epi32(0x00011000)); - const __m512i pack = _mm512_set_epi8( - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 61, 62, 56, 57, 58, - 52, 53, 54, 48, 49, 50, 44, 45, 46, 40, 41, 42, 36, 37, 38, 32, 33, 34, - 28, 29, 30, 24, 25, 26, 20, 21, 22, 16, 17, 18, 12, 13, 14, 8, 9, 10, 4, - 5, 6, 0, 1, 2); - const __m512i shuffled = _mm512_permutexvar_epi8(pack, merged); - _mm512_mask_storeu_epi8( - (__m512i *)out, 0xffffffffffff, - shuffled); // mask would be 0xffffffffffff since we write 48 bytes. +simdutf_warn_unused size_t implementation::utf16_length_from_utf32( + const char32_t *input, size_t length) const noexcept { + return scalar::utf32::utf16_length_from_utf32(input, length); } -// decode 64 bytes and output 48 bytes -static inline void base64_decode_block(char *out, const char *src) { - base64_decode(out, - _mm512_loadu_si512(reinterpret_cast(src))); + +simdutf_warn_unused size_t implementation::utf32_length_from_utf8( + const char *input, size_t length) const noexcept { + return scalar::utf8::count_code_points(input, length); } -static inline void base64_decode_block(char *out, block64 *b) { - base64_decode(out, b->chunks[0]); + +simdutf_warn_unused size_t implementation::maximal_binary_length_from_base64( + const char *input, size_t length) const noexcept { + return scalar::base64::maximal_binary_length_from_base64(input, length); } -template -full_result -compress_decode_base64(char *dst, const chartype *src, size_t srclen, - base64_options options, - last_chunk_handling_options last_chunk_options) { - const uint8_t *to_base64 = base64_url ? tables::base64::to_base64_url_value - : tables::base64::to_base64_value; - size_t equallocation = - srclen; // location of the first padding character if any - size_t equalsigns = 0; +simdutf_warn_unused result implementation::base64_to_binary( + const char *input, size_t length, char *output, base64_options options, + last_chunk_handling_options last_chunk_options) const noexcept { + const bool ignore_garbage = + (options == base64_options::base64_url_accept_garbage) || + (options == base64_options::base64_default_accept_garbage); // skip trailing spaces - while (srclen > 0 && scalar::base64::is_eight_byte(src[srclen - 1]) && - to_base64[uint8_t(src[srclen - 1])] == 64) { - srclen--; + while (length > 0 && + scalar::base64::is_ascii_white_space(input[length - 1])) { + length--; } - if (srclen > 0 && src[srclen - 1] == '=') { - equallocation = srclen - 1; - srclen--; - equalsigns = 1; - // skip trailing spaces - while (srclen > 0 && scalar::base64::is_eight_byte(src[srclen - 1]) && - to_base64[uint8_t(src[srclen - 1])] == 64) { - srclen--; + size_t equallocation = + length; // location of the first padding character if any + size_t equalsigns = 0; + if (length > 0 && input[length - 1] == '=') { + equallocation = length - 1; + length -= 1; + equalsigns++; + while (length > 0 && + scalar::base64::is_ascii_white_space(input[length - 1])) { + length--; } - if (srclen > 0 && src[srclen - 1] == '=') { - equallocation = srclen - 1; - srclen--; - equalsigns = 2; + if (length > 0 && input[length - 1] == '=') { + equallocation = length - 1; + equalsigns++; + length -= 1; } } - if (srclen == 0) { - if (equalsigns > 0) { - return {INVALID_BASE64_CHARACTER, equallocation, 0}; + if (length == 0) { + if (!ignore_garbage && equalsigns > 0) { + return {INVALID_BASE64_CHARACTER, equallocation}; } - return {SUCCESS, 0, 0}; + return {SUCCESS, 0}; } - const chartype *const srcinit = src; - const char *const dstinit = dst; - const chartype *const srcend = src + srclen; - - // figure out why block_size == 2 is sometimes best??? - constexpr size_t block_size = 6; - char buffer[block_size * 64]; - char *bufferptr = buffer; - if (srclen >= 64) { - const chartype *const srcend64 = src + srclen - 64; - while (src <= srcend64) { - block64 b; - load_block(&b, src); - src += 64; - bool error = false; - uint64_t badcharmask = to_base64_mask(&b, &error); - if (error) { - src -= 64; - while (src < srcend && scalar::base64::is_eight_byte(*src) && - to_base64[uint8_t(*src)] <= 64) { - src++; - } - return {error_code::INVALID_BASE64_CHARACTER, size_t(src - srcinit), - size_t(dst - dstinit)}; - } - if (badcharmask != 0) { - // optimization opportunity: check for simple masks like those made of - // continuous 1s followed by continuous 0s. And masks containing a - // single bad character. - bufferptr += compress_block(&b, badcharmask, bufferptr); - } else if (bufferptr != buffer) { - copy_block(&b, bufferptr); - bufferptr += 64; - } else { - base64_decode_block(dst, &b); - dst += 48; - } - if (bufferptr >= (block_size - 1) * 64 + buffer) { - for (size_t i = 0; i < (block_size - 1); i++) { - base64_decode_block(dst, buffer + i * 64); - dst += 48; - } - std::memcpy(buffer, buffer + (block_size - 1) * 64, - 64); // 64 might be too much - bufferptr -= (block_size - 1) * 64; - } + result r = scalar::base64::base64_tail_decode( + output, input, length, equalsigns, options, last_chunk_options); + if (last_chunk_options != stop_before_partial && + r.error == error_code::SUCCESS && equalsigns > 0 && !ignore_garbage) { + // additional checks + if ((r.count % 3 == 0) || ((r.count % 3) + 1 + equalsigns != 4)) { + return {INVALID_BASE64_CHARACTER, equallocation}; } } + return r; +} - char *buffer_start = buffer; - // Optimization note: if this is almost full, then it is worth our - // time, otherwise, we should just decode directly. - int last_block = (int)((bufferptr - buffer_start) % 64); - if (last_block != 0 && srcend - src + last_block >= 64) { - - while ((bufferptr - buffer_start) % 64 != 0 && src < srcend) { - uint8_t val = to_base64[uint8_t(*src)]; - *bufferptr = char(val); - if (!scalar::base64::is_eight_byte(*src) || val > 64) { - return {error_code::INVALID_BASE64_CHARACTER, size_t(src - srcinit), - size_t(dst - dstinit)}; - } - bufferptr += (val <= 63); - src++; - } - } +simdutf_warn_unused size_t implementation::maximal_binary_length_from_base64( + const char16_t *input, size_t length) const noexcept { + return scalar::base64::maximal_binary_length_from_base64(input, length); +} - for (; buffer_start + 64 <= bufferptr; buffer_start += 64) { - base64_decode_block(dst, buffer_start); - dst += 48; +simdutf_warn_unused result implementation::base64_to_binary( + const char16_t *input, size_t length, char *output, base64_options options, + last_chunk_handling_options last_chunk_options) const noexcept { + const bool ignore_garbage = + (options == base64_options::base64_url_accept_garbage) || + (options == base64_options::base64_default_accept_garbage); + // skip trailing spaces + while (length > 0 && + scalar::base64::is_ascii_white_space(input[length - 1])) { + length--; } - if ((bufferptr - buffer_start) % 64 != 0) { - while (buffer_start + 4 < bufferptr) { - uint32_t triple = ((uint32_t(uint8_t(buffer_start[0])) << 3 * 6) + - (uint32_t(uint8_t(buffer_start[1])) << 2 * 6) + - (uint32_t(uint8_t(buffer_start[2])) << 1 * 6) + - (uint32_t(uint8_t(buffer_start[3])) << 0 * 6)) - << 8; - triple = scalar::utf32::swap_bytes(triple); - std::memcpy(dst, &triple, 4); - dst += 3; - buffer_start += 4; - } - if (buffer_start + 4 <= bufferptr) { - uint32_t triple = ((uint32_t(uint8_t(buffer_start[0])) << 3 * 6) + - (uint32_t(uint8_t(buffer_start[1])) << 2 * 6) + - (uint32_t(uint8_t(buffer_start[2])) << 1 * 6) + - (uint32_t(uint8_t(buffer_start[3])) << 0 * 6)) - << 8; - triple = scalar::utf32::swap_bytes(triple); - std::memcpy(dst, &triple, 3); - dst += 3; - buffer_start += 4; + size_t equallocation = + length; // location of the first padding character if any + size_t equalsigns = 0; + if (length > 0 && input[length - 1] == '=') { + equallocation = length - 1; + length -= 1; + equalsigns++; + while (length > 0 && + scalar::base64::is_ascii_white_space(input[length - 1])) { + length--; } - // we may have 1, 2 or 3 bytes left and we need to decode them so let us - // backtrack - int leftover = int(bufferptr - buffer_start); - while (leftover > 0) { - while (to_base64[uint8_t(*(src - 1))] == 64) { - src--; - } - src--; - leftover--; + if (length > 0 && input[length - 1] == '=') { + equallocation = length - 1; + equalsigns++; + length -= 1; } } - if (src < srcend + equalsigns) { - full_result r = scalar::base64::base64_tail_decode( - dst, src, srcend - src, equalsigns, options, last_chunk_options); - if (r.error == error_code::INVALID_BASE64_CHARACTER || - r.error == error_code::BASE64_EXTRA_BITS) { - r.input_count += size_t(src - srcinit); - return r; - } else { - r.output_count += size_t(dst - dstinit); - } - if (last_chunk_options != stop_before_partial && - r.error == error_code::SUCCESS && equalsigns > 0) { - // additional checks - if ((r.output_count % 3 == 0) || - ((r.output_count % 3) + 1 + equalsigns != 4)) { - r.error = error_code::INVALID_BASE64_CHARACTER; - r.input_count = equallocation; - } + if (length == 0) { + if (!ignore_garbage && equalsigns > 0) { + return {INVALID_BASE64_CHARACTER, equallocation}; } - return r; + return {SUCCESS, 0}; } - if (equalsigns > 0) { - if ((size_t(dst - dstinit) % 3 == 0) || - ((size_t(dst - dstinit) % 3) + 1 + equalsigns != 4)) { - return {INVALID_BASE64_CHARACTER, equallocation, size_t(dst - dstinit)}; + result r = scalar::base64::base64_tail_decode( + output, input, length, equalsigns, options, last_chunk_options); + if (last_chunk_options != stop_before_partial && + r.error == error_code::SUCCESS && equalsigns > 0 && !ignore_garbage) { + // additional checks + if ((r.count % 3 == 0) || ((r.count % 3) + 1 + equalsigns != 4)) { + return {INVALID_BASE64_CHARACTER, equallocation}; } } - return {SUCCESS, srclen, size_t(dst - dstinit)}; + return r; } -/* end file src/icelake/icelake_base64.inl.cpp */ -#include +simdutf_warn_unused size_t implementation::base64_length_from_binary( + size_t length, base64_options options) const noexcept { + return scalar::base64::base64_length_from_binary(length, options); +} -} // namespace -} // namespace icelake +size_t implementation::binary_to_base64(const char *input, size_t length, + char *output, + base64_options options) const noexcept { + return scalar::base64::binary_to_base64(input, length, output, options); +} +} // namespace ppc64 } // namespace simdutf +/* begin file src/simdutf/ppc64/end.h */ +/* end file src/simdutf/ppc64/end.h */ +/* end file src/ppc64/implementation.cpp */ +#endif +#if SIMDUTF_IMPLEMENTATION_RVV +/* begin file src/rvv/implementation.cpp */ + + + + + +/* begin file src/simdutf/rvv/begin.h */ +// redefining SIMDUTF_IMPLEMENTATION to "rvv" +// #define SIMDUTF_IMPLEMENTATION rvv + +#if SIMDUTF_CAN_ALWAYS_RUN_RVV +// nothing needed. +#else +SIMDUTF_TARGET_RVV +#endif +/* end file src/simdutf/rvv/begin.h */ namespace simdutf { -namespace icelake { +namespace rvv { +namespace { +#ifndef SIMDUTF_RVV_H + #error "rvv.h must be included" +#endif -simdutf_warn_unused int -implementation::detect_encodings(const char *input, - size_t length) const noexcept { - // If there is a BOM, then we trust it. - auto bom_encoding = simdutf::BOM::check_bom(input, length); - // todo: convert to a one-pass algorithm - if (bom_encoding != encoding_type::unspecified) { - return bom_encoding; +} // unnamed namespace +} // namespace rvv +} // namespace simdutf + +// +// Implementation-specific overrides +// +namespace simdutf { +namespace rvv { +/* begin file src/rvv/rvv_helpers.inl.cpp */ +template +simdutf_really_inline static size_t +rvv_utf32_store_utf16_m4(uint16_t *dst, vuint32m4_t utf32, size_t vl, + vbool4_t m4even) { + /* convert [000000000000aaaa|aaaaaabbbbbbbbbb] + * to [110111bbbbbbbbbb|110110aaaaaaaaaa] */ + vuint32m4_t sur = __riscv_vsub_vx_u32m4(utf32, 0x10000, vl); + sur = __riscv_vor_vv_u32m4(__riscv_vsll_vx_u32m4(sur, 16, vl), + __riscv_vsrl_vx_u32m4(sur, 10, vl), vl); + sur = __riscv_vand_vx_u32m4(sur, 0x3FF03FF, vl); + sur = __riscv_vor_vx_u32m4(sur, 0xDC00D800, vl); + /* merge 1 byte utf32 and 2 byte sur */ + vbool8_t m4 = __riscv_vmsgtu_vx_u32m4_b8(utf32, 0xFFFF, vl); + vuint16m4_t utf32_16 = __riscv_vreinterpret_v_u32m4_u16m4( + __riscv_vmerge_vvm_u32m4(utf32, sur, m4, vl)); + /* compress and store */ + vbool4_t mOut = __riscv_vmor_mm_b4( + __riscv_vmsne_vx_u16m4_b4(utf32_16, 0, vl * 2), m4even, vl * 2); + vuint16m4_t vout = __riscv_vcompress_vm_u16m4(utf32_16, mOut, vl * 2); + vl = __riscv_vcpop_m_b4(mOut, vl * 2); + __riscv_vse16_v_u16m4(dst, simdutf_byteflip(vout, vl), vl); + return vl; +}; +/* end file src/rvv/rvv_helpers.inl.cpp */ + +/* begin file src/rvv/rvv_length_from.inl.cpp */ + +simdutf_warn_unused size_t +implementation::count_utf16le(const char16_t *src, size_t len) const noexcept { + return utf32_length_from_utf16le(src, len); +} + +simdutf_warn_unused size_t +implementation::count_utf16be(const char16_t *src, size_t len) const noexcept { + return utf32_length_from_utf16be(src, len); +} + +simdutf_warn_unused size_t +implementation::count_utf8(const char *src, size_t len) const noexcept { + return utf32_length_from_utf8(src, len); +} + +simdutf_warn_unused size_t implementation::latin1_length_from_utf8( + const char *src, size_t len) const noexcept { + return utf32_length_from_utf8(src, len); +} + +simdutf_warn_unused size_t +implementation::latin1_length_from_utf16(size_t len) const noexcept { + return len; +} + +simdutf_warn_unused size_t +implementation::latin1_length_from_utf32(size_t len) const noexcept { + return len; +} + +simdutf_warn_unused size_t +implementation::utf16_length_from_latin1(size_t len) const noexcept { + return len; +} + +simdutf_warn_unused size_t +implementation::utf32_length_from_latin1(size_t len) const noexcept { + return len; +} + +simdutf_warn_unused size_t implementation::utf32_length_from_utf8( + const char *src, size_t len) const noexcept { + size_t count = 0; + for (size_t vl; len > 0; len -= vl, src += vl) { + vl = __riscv_vsetvl_e8m8(len); + vint8m8_t v = __riscv_vle8_v_i8m8((int8_t *)src, vl); + vbool1_t mask = __riscv_vmsgt_vx_i8m8_b1(v, -65, vl); + count += __riscv_vcpop_m_b1(mask, vl); } - int out = 0; - if (validate_utf8(input, length)) { - out |= encoding_type::UTF8; + return count; +} + +template +simdutf_really_inline static size_t +rvv_utf32_length_from_utf16(const char16_t *src, size_t len) { + size_t count = 0; + for (size_t vl; len > 0; len -= vl, src += vl) { + vl = __riscv_vsetvl_e16m8(len); + vuint16m8_t v = __riscv_vle16_v_u16m8((uint16_t *)src, vl); + v = simdutf_byteflip(v, vl); + vbool2_t notHigh = + __riscv_vmor_mm_b2(__riscv_vmsgtu_vx_u16m8_b2(v, 0xDFFF, vl), + __riscv_vmsltu_vx_u16m8_b2(v, 0xDC00, vl), vl); + count += __riscv_vcpop_m_b2(notHigh, vl); } - if ((length % 2) == 0) { - if (validate_utf16le(reinterpret_cast(input), - length / 2)) { - out |= encoding_type::UTF16_LE; - } + return count; +} + +simdutf_warn_unused size_t implementation::utf32_length_from_utf16le( + const char16_t *src, size_t len) const noexcept { + return rvv_utf32_length_from_utf16(src, len); +} + +simdutf_warn_unused size_t implementation::utf32_length_from_utf16be( + const char16_t *src, size_t len) const noexcept { + if (supports_zvbb()) + return rvv_utf32_length_from_utf16(src, len); + else + return rvv_utf32_length_from_utf16(src, len); +} + +simdutf_warn_unused size_t implementation::utf8_length_from_latin1( + const char *src, size_t len) const noexcept { + size_t count = len; + for (size_t vl; len > 0; len -= vl, src += vl) { + vl = __riscv_vsetvl_e8m8(len); + vint8m8_t v = __riscv_vle8_v_i8m8((int8_t *)src, vl); + count += __riscv_vcpop_m_b1(__riscv_vmslt_vx_i8m8_b1(v, 0, vl), vl); } - if ((length % 4) == 0) { - if (validate_utf32(reinterpret_cast(input), length / 4)) { - out |= encoding_type::UTF32_LE; - } + return count; +} + +template +simdutf_really_inline static size_t +rvv_utf8_length_from_utf16(const char16_t *src, size_t len) { + size_t count = 0; + for (size_t vl; len > 0; len -= vl, src += vl) { + vl = __riscv_vsetvl_e16m8(len); + vuint16m8_t v = __riscv_vle16_v_u16m8((uint16_t *)src, vl); + v = simdutf_byteflip(v, vl); + vbool2_t m234 = __riscv_vmsgtu_vx_u16m8_b2(v, 0x7F, vl); + vbool2_t m34 = __riscv_vmsgtu_vx_u16m8_b2(v, 0x7FF, vl); + vbool2_t notSur = + __riscv_vmor_mm_b2(__riscv_vmsltu_vx_u16m8_b2(v, 0xD800, vl), + __riscv_vmsgtu_vx_u16m8_b2(v, 0xDFFF, vl), vl); + vbool2_t m3 = __riscv_vmand_mm_b2(m34, notSur, vl); + count += vl + __riscv_vcpop_m_b2(m234, vl) + __riscv_vcpop_m_b2(m3, vl); + } + return count; +} + +simdutf_warn_unused size_t implementation::utf8_length_from_utf16le( + const char16_t *src, size_t len) const noexcept { + return rvv_utf8_length_from_utf16(src, len); +} + +simdutf_warn_unused size_t implementation::utf8_length_from_utf16be( + const char16_t *src, size_t len) const noexcept { + if (supports_zvbb()) + return rvv_utf8_length_from_utf16(src, len); + else + return rvv_utf8_length_from_utf16(src, len); +} + +simdutf_warn_unused size_t implementation::utf8_length_from_utf32( + const char32_t *src, size_t len) const noexcept { + size_t count = 0; + for (size_t vl; len > 0; len -= vl, src += vl) { + vl = __riscv_vsetvl_e32m8(len); + vuint32m8_t v = __riscv_vle32_v_u32m8((uint32_t *)src, vl); + vbool4_t m234 = __riscv_vmsgtu_vx_u32m8_b4(v, 0x7F, vl); + vbool4_t m34 = __riscv_vmsgtu_vx_u32m8_b4(v, 0x7FF, vl); + vbool4_t m4 = __riscv_vmsgtu_vx_u32m8_b4(v, 0xFFFF, vl); + count += vl + __riscv_vcpop_m_b4(m234, vl) + __riscv_vcpop_m_b4(m34, vl) + + __riscv_vcpop_m_b4(m4, vl); + } + return count; +} + +simdutf_warn_unused size_t implementation::utf16_length_from_utf8( + const char *src, size_t len) const noexcept { + size_t count = 0; + for (size_t vl; len > 0; len -= vl, src += vl) { + vl = __riscv_vsetvl_e8m8(len); + vint8m8_t v = __riscv_vle8_v_i8m8((int8_t *)src, vl); + vbool1_t m1234 = __riscv_vmsgt_vx_i8m8_b1(v, -65, vl); + vbool1_t m4 = __riscv_vmsgtu_vx_u8m8_b1(__riscv_vreinterpret_u8m8(v), + (uint8_t)0b11101111, vl); + count += __riscv_vcpop_m_b1(m1234, vl) + __riscv_vcpop_m_b1(m4, vl); + } + return count; +} + +simdutf_warn_unused size_t implementation::utf16_length_from_utf32( + const char32_t *src, size_t len) const noexcept { + size_t count = 0; + for (size_t vl; len > 0; len -= vl, src += vl) { + vl = __riscv_vsetvl_e32m8(len); + vuint32m8_t v = __riscv_vle32_v_u32m8((uint32_t *)src, vl); + vbool4_t m4 = __riscv_vmsgtu_vx_u32m8_b4(v, 0xFFFF, vl); + count += vl + __riscv_vcpop_m_b4(m4, vl); } - return out; + return count; } +/* end file src/rvv/rvv_length_from.inl.cpp */ +/* begin file src/rvv/rvv_validate.inl.cpp */ + simdutf_warn_unused bool -implementation::validate_utf8(const char *buf, size_t len) const noexcept { - if (simdutf_unlikely(len == 0)) { - return true; - } - avx512_utf8_checker checker{}; - const char *ptr = buf; - const char *end = ptr + len; - for (; end - ptr >= 64; ptr += 64) { - const __m512i utf8 = _mm512_loadu_si512((const __m512i *)ptr); - checker.check_next_input(utf8); - } - if (end != ptr) { - const __m512i utf8 = _mm512_maskz_loadu_epi8( - ~UINT64_C(0) >> (64 - (end - ptr)), (const __m512i *)ptr); - checker.check_next_input(utf8); +implementation::validate_ascii(const char *src, size_t len) const noexcept { + size_t vlmax = __riscv_vsetvlmax_e8m8(); + vint8m8_t mask = __riscv_vmv_v_x_i8m8(0, vlmax); + for (size_t vl; len > 0; len -= vl, src += vl) { + vl = __riscv_vsetvl_e8m8(len); + vint8m8_t v = __riscv_vle8_v_i8m8((int8_t *)src, vl); + mask = __riscv_vor_vv_i8m8_tu(mask, mask, v, vl); } - checker.check_eof(); - return !checker.errors(); + return __riscv_vfirst_m_b1(__riscv_vmslt_vx_i8m8_b1(mask, 0, vlmax), vlmax) < + 0; } -simdutf_warn_unused result implementation::validate_utf8_with_errors( - const char *buf, size_t len) const noexcept { - if (simdutf_unlikely(len == 0)) { - return result(error_code::SUCCESS, len); - } - avx512_utf8_checker checker{}; - const char *ptr = buf; - const char *end = ptr + len; - size_t count{0}; - for (; end - ptr >= 64; ptr += 64) { - const __m512i utf8 = _mm512_loadu_si512((const __m512i *)ptr); - checker.check_next_input(utf8); - if (checker.errors()) { - if (count != 0) { - count--; - } // Sometimes the error is only detected in the next chunk - result res = scalar::utf8::rewind_and_validate_with_errors( - reinterpret_cast(buf), - reinterpret_cast(buf + count), len - count); - res.count += count; - return res; - } - count += 64; +simdutf_warn_unused result implementation::validate_ascii_with_errors( + const char *src, size_t len) const noexcept { + const char *beg = src; + for (size_t vl; len > 0; len -= vl, src += vl) { + vl = __riscv_vsetvl_e8m8(len); + vint8m8_t v = __riscv_vle8_v_i8m8((int8_t *)src, vl); + long idx = __riscv_vfirst_m_b1(__riscv_vmslt_vx_i8m8_b1(v, 0, vl), vl); + if (idx >= 0) + return result(error_code::TOO_LARGE, src - beg + idx); } - if (end != ptr) { - const __m512i utf8 = _mm512_maskz_loadu_epi8( - ~UINT64_C(0) >> (64 - (end - ptr)), (const __m512i *)ptr); - checker.check_next_input(utf8); + return result(error_code::SUCCESS, src - beg); +} + +/* Returns a close estimation of the number of valid UTF-8 bytes up to the + * first invalid one, but never overestimating. */ +simdutf_really_inline static size_t rvv_count_valid_utf8(const char *src, + size_t len) { + const char *beg = src; + if (len < 32) + return 0; + + /* validate first three bytes */ + { + size_t idx = 3; + while (idx < len && (src[idx] >> 6) == 0b10) + ++idx; + if (idx > 3 + 3 || !scalar::utf8::validate(src, idx)) + return 0; } - checker.check_eof(); - if (checker.errors()) { - if (count != 0) { - count--; - } // Sometimes the error is only detected in the next chunk - result res = scalar::utf8::rewind_and_validate_with_errors( - reinterpret_cast(buf), - reinterpret_cast(buf + count), len - count); - res.count += count; - return res; + + static const uint64_t err1m[] = {0x0202020202020202, 0x4915012180808080}; + static const uint64_t err2m[] = {0xCBCBCB8B8383A3E7, 0xCBCBDBCBCBCBCBCB}; + static const uint64_t err3m[] = {0x0101010101010101, 0X01010101BABAAEE6}; + + const vuint8m1_t err1tbl = + __riscv_vreinterpret_v_u64m1_u8m1(__riscv_vle64_v_u64m1(err1m, 2)); + const vuint8m1_t err2tbl = + __riscv_vreinterpret_v_u64m1_u8m1(__riscv_vle64_v_u64m1(err2m, 2)); + const vuint8m1_t err3tbl = + __riscv_vreinterpret_v_u64m1_u8m1(__riscv_vle64_v_u64m1(err3m, 2)); + + size_t tail = 3; + size_t n = len - tail; + + for (size_t vl; n > 0; n -= vl, src += vl) { + vl = __riscv_vsetvl_e8m4(n); + vuint8m4_t v0 = __riscv_vle8_v_u8m4((uint8_t const *)src, vl); + + uint8_t next0 = src[vl + 0]; + uint8_t next1 = src[vl + 1]; + uint8_t next2 = src[vl + 2]; + + /* fast path: ASCII */ + if (__riscv_vfirst_m_b2(__riscv_vmsgtu_vx_u8m4_b2(v0, 0b01111111, vl), vl) < + 0 && + (next0 | next1 | next2) < 0b10000000) + continue; + + /* see "Validating UTF-8 In Less Than One Instruction Per Byte" + * https://arxiv.org/abs/2010.03090 */ + vuint8m4_t v1 = __riscv_vslide1down_vx_u8m4(v0, next0, vl); + vuint8m4_t v2 = __riscv_vslide1down_vx_u8m4(v1, next1, vl); + vuint8m4_t v3 = __riscv_vslide1down_vx_u8m4(v2, next2, vl); + + vuint8m4_t s1 = __riscv_vreinterpret_v_u16m4_u8m4(__riscv_vsrl_vx_u16m4( + __riscv_vreinterpret_v_u8m4_u16m4(v2), 4, __riscv_vsetvlmax_e16m4())); + vuint8m4_t s3 = __riscv_vreinterpret_v_u16m4_u8m4(__riscv_vsrl_vx_u16m4( + __riscv_vreinterpret_v_u8m4_u16m4(v3), 4, __riscv_vsetvlmax_e16m4())); + + vuint8m4_t idx2 = __riscv_vand_vx_u8m4(v2, 0xF, vl); + vuint8m4_t idx1 = __riscv_vand_vx_u8m4(s1, 0xF, vl); + vuint8m4_t idx3 = __riscv_vand_vx_u8m4(s3, 0xF, vl); + + vuint8m4_t err1 = simdutf_vrgather_u8m1x4(err1tbl, idx1); + vuint8m4_t err2 = simdutf_vrgather_u8m1x4(err2tbl, idx2); + vuint8m4_t err3 = simdutf_vrgather_u8m1x4(err3tbl, idx3); + vint8m4_t errs = __riscv_vreinterpret_v_u8m4_i8m4( + __riscv_vand_vv_u8m4(__riscv_vand_vv_u8m4(err1, err2, vl), err3, vl)); + + vbool2_t is_3 = __riscv_vmsgtu_vx_u8m4_b2(v1, 0b11100000 - 1, vl); + vbool2_t is_4 = __riscv_vmsgtu_vx_u8m4_b2(v0, 0b11110000 - 1, vl); + vbool2_t is_34 = __riscv_vmor_mm_b2(is_3, is_4, vl); + vbool2_t err34 = + __riscv_vmxor_mm_b2(is_34, __riscv_vmslt_vx_i8m4_b2(errs, 0, vl), vl); + vbool2_t errm = + __riscv_vmor_mm_b2(__riscv_vmsgt_vx_i8m4_b2(errs, 0, vl), err34, vl); + if (__riscv_vfirst_m_b2(errm, vl) >= 0) + break; } - return result(error_code::SUCCESS, len); + + /* we need to validate the last character */ + while (tail < len && (src[0] >> 6) == 0b10) + --src, ++tail; + return src - beg; } simdutf_warn_unused bool -implementation::validate_ascii(const char *buf, size_t len) const noexcept { - return icelake::validate_ascii(buf, len); +implementation::validate_utf8(const char *src, size_t len) const noexcept { + size_t count = rvv_count_valid_utf8(src, len); + return scalar::utf8::validate(src + count, len - count); } -simdutf_warn_unused result implementation::validate_ascii_with_errors( - const char *buf, size_t len) const noexcept { - const char *buf_orig = buf; - const char *end = buf + len; - const __m512i ascii = _mm512_set1_epi8((uint8_t)0x80); - for (; end - buf >= 64; buf += 64) { - const __m512i input = _mm512_loadu_si512((const __m512i *)buf); - __mmask64 notascii = _mm512_cmp_epu8_mask(input, ascii, _MM_CMPINT_NLT); - if (notascii) { - return result(error_code::TOO_LARGE, - buf - buf_orig + _tzcnt_u64(notascii)); - } - } - if (end != buf) { - const __m512i input = _mm512_maskz_loadu_epi8( - ~UINT64_C(0) >> (64 - (end - buf)), (const __m512i *)buf); - __mmask64 notascii = _mm512_cmp_epu8_mask(input, ascii, _MM_CMPINT_NLT); - if (notascii) { - return result(error_code::TOO_LARGE, - buf - buf_orig + _tzcnt_u64(notascii)); - } - } - return result(error_code::SUCCESS, len); +simdutf_warn_unused result implementation::validate_utf8_with_errors( + const char *src, size_t len) const noexcept { + size_t count = rvv_count_valid_utf8(src, len); + result res = scalar::utf8::validate_with_errors(src + count, len - count); + return result(res.error, count + res.count); } simdutf_warn_unused bool -implementation::validate_utf16le(const char16_t *buf, +implementation::validate_utf16le(const char16_t *src, size_t len) const noexcept { - const char16_t *end = buf + len; - - for (; end - buf >= 32;) { - __m512i in = _mm512_loadu_si512((__m512i *)buf); - __m512i diff = _mm512_sub_epi16(in, _mm512_set1_epi16(uint16_t(0xD800))); - __mmask32 surrogates = - _mm512_cmplt_epu16_mask(diff, _mm512_set1_epi16(uint16_t(0x0800))); - if (surrogates) { - __mmask32 highsurrogates = - _mm512_cmplt_epu16_mask(diff, _mm512_set1_epi16(uint16_t(0x0400))); - __mmask32 lowsurrogates = surrogates ^ highsurrogates; - // high must be followed by low - if ((highsurrogates << 1) != lowsurrogates) { - return false; - } - bool ends_with_high = ((highsurrogates & 0x80000000) != 0); - if (ends_with_high) { - buf += 31; // advance only by 31 code units so that we start with the - // high surrogate on the next round. - } else { - buf += 32; - } - } else { - buf += 32; - } - } - if (buf < end) { - __m512i in = - _mm512_maskz_loadu_epi16((1U << (end - buf)) - 1, (__m512i *)buf); - __m512i diff = _mm512_sub_epi16(in, _mm512_set1_epi16(uint16_t(0xD800))); - __mmask32 surrogates = - _mm512_cmplt_epu16_mask(diff, _mm512_set1_epi16(uint16_t(0x0800))); - if (surrogates) { - __mmask32 highsurrogates = - _mm512_cmplt_epu16_mask(diff, _mm512_set1_epi16(uint16_t(0x0400))); - __mmask32 lowsurrogates = surrogates ^ highsurrogates; - // high must be followed by low - if ((highsurrogates << 1) != lowsurrogates) { - return false; - } - } - } - return true; + return validate_utf16le_with_errors(src, len).error == error_code::SUCCESS; } simdutf_warn_unused bool -implementation::validate_utf16be(const char16_t *buf, +implementation::validate_utf16be(const char16_t *src, size_t len) const noexcept { - const char16_t *end = buf + len; - const __m512i byteflip = _mm512_setr_epi64( - 0x0607040502030001, 0x0e0f0c0d0a0b0809, 0x0607040502030001, - 0x0e0f0c0d0a0b0809, 0x0607040502030001, 0x0e0f0c0d0a0b0809, - 0x0607040502030001, 0x0e0f0c0d0a0b0809); - for (; end - buf >= 32;) { - __m512i in = - _mm512_shuffle_epi8(_mm512_loadu_si512((__m512i *)buf), byteflip); - __m512i diff = _mm512_sub_epi16(in, _mm512_set1_epi16(uint16_t(0xD800))); - __mmask32 surrogates = - _mm512_cmplt_epu16_mask(diff, _mm512_set1_epi16(uint16_t(0x0800))); - if (surrogates) { - __mmask32 highsurrogates = - _mm512_cmplt_epu16_mask(diff, _mm512_set1_epi16(uint16_t(0x0400))); - __mmask32 lowsurrogates = surrogates ^ highsurrogates; - // high must be followed by low - if ((highsurrogates << 1) != lowsurrogates) { - return false; - } - bool ends_with_high = ((highsurrogates & 0x80000000) != 0); - if (ends_with_high) { - buf += 31; // advance only by 31 code units so that we start with the - // high surrogate on the next round. - } else { - buf += 32; - } - } else { - buf += 32; + return validate_utf16be_with_errors(src, len).error == error_code::SUCCESS; +} + +template +simdutf_really_inline static result +rvv_validate_utf16_with_errors(const char16_t *src, size_t len) { + const char16_t *beg = src; + uint16_t last = 0; + for (size_t vl; len > 0; + len -= vl, src += vl, last = simdutf_byteflip(src[-1])) { + vl = __riscv_vsetvl_e16m8(len); + vuint16m8_t v1 = __riscv_vle16_v_u16m8((const uint16_t *)src, vl); + v1 = simdutf_byteflip(v1, vl); + vuint16m8_t v0 = __riscv_vslide1up_vx_u16m8(v1, last, vl); + + vbool2_t surhi = __riscv_vmseq_vx_u16m8_b2( + __riscv_vand_vx_u16m8(v0, 0xFC00, vl), 0xD800, vl); + vbool2_t surlo = __riscv_vmseq_vx_u16m8_b2( + __riscv_vand_vx_u16m8(v1, 0xFC00, vl), 0xDC00, vl); + + long idx = __riscv_vfirst_m_b2(__riscv_vmxor_mm_b2(surhi, surlo, vl), vl); + if (idx >= 0) { + last = idx > 0 ? simdutf_byteflip(src[idx - 1]) : last; + return result(error_code::SURROGATE, + src - beg + idx - (last - 0xD800u < 0x400u)); + break; } } - if (buf < end) { - __m512i in = _mm512_shuffle_epi8( - _mm512_maskz_loadu_epi16((1U << (end - buf)) - 1, (__m512i *)buf), - byteflip); - __m512i diff = _mm512_sub_epi16(in, _mm512_set1_epi16(uint16_t(0xD800))); - __mmask32 surrogates = - _mm512_cmplt_epu16_mask(diff, _mm512_set1_epi16(uint16_t(0x0800))); - if (surrogates) { - __mmask32 highsurrogates = - _mm512_cmplt_epu16_mask(diff, _mm512_set1_epi16(uint16_t(0x0400))); - __mmask32 lowsurrogates = surrogates ^ highsurrogates; - // high must be followed by low - if ((highsurrogates << 1) != lowsurrogates) { - return false; - } - } + if (last - 0xD800u < 0x400u) { + return result(error_code::SURROGATE, + src - beg - 1); /* end on high surrogate */ + } else { + return result(error_code::SUCCESS, src - beg); } - return true; } simdutf_warn_unused result implementation::validate_utf16le_with_errors( - const char16_t *buf, size_t len) const noexcept { - const char16_t *start_buf = buf; - const char16_t *end = buf + len; - for (; end - buf >= 32;) { - __m512i in = _mm512_loadu_si512((__m512i *)buf); - __m512i diff = _mm512_sub_epi16(in, _mm512_set1_epi16(uint16_t(0xD800))); - __mmask32 surrogates = - _mm512_cmplt_epu16_mask(diff, _mm512_set1_epi16(uint16_t(0x0800))); - if (surrogates) { - __mmask32 highsurrogates = - _mm512_cmplt_epu16_mask(diff, _mm512_set1_epi16(uint16_t(0x0400))); - __mmask32 lowsurrogates = surrogates ^ highsurrogates; - // high must be followed by low - if ((highsurrogates << 1) != lowsurrogates) { - uint32_t extra_low = _tzcnt_u32(lowsurrogates & ~(highsurrogates << 1)); - uint32_t extra_high = - _tzcnt_u32(highsurrogates & ~(lowsurrogates >> 1)); - return result(error_code::SURROGATE, - (buf - start_buf) + - (extra_low < extra_high ? extra_low : extra_high)); - } - bool ends_with_high = ((highsurrogates & 0x80000000) != 0); - if (ends_with_high) { - buf += 31; // advance only by 31 code units so that we start with the - // high surrogate on the next round. - } else { - buf += 32; - } - } else { - buf += 32; - } - } - if (buf < end) { - __m512i in = - _mm512_maskz_loadu_epi16((1U << (end - buf)) - 1, (__m512i *)buf); - __m512i diff = _mm512_sub_epi16(in, _mm512_set1_epi16(uint16_t(0xD800))); - __mmask32 surrogates = - _mm512_cmplt_epu16_mask(diff, _mm512_set1_epi16(uint16_t(0x0800))); - if (surrogates) { - __mmask32 highsurrogates = - _mm512_cmplt_epu16_mask(diff, _mm512_set1_epi16(uint16_t(0x0400))); - __mmask32 lowsurrogates = surrogates ^ highsurrogates; - // high must be followed by low - if ((highsurrogates << 1) != lowsurrogates) { - uint32_t extra_low = _tzcnt_u32(lowsurrogates & ~(highsurrogates << 1)); - uint32_t extra_high = - _tzcnt_u32(highsurrogates & ~(lowsurrogates >> 1)); - return result(error_code::SURROGATE, - (buf - start_buf) + - (extra_low < extra_high ? extra_low : extra_high)); - } - } - } - return result(error_code::SUCCESS, len); + const char16_t *src, size_t len) const noexcept { + return rvv_validate_utf16_with_errors(src, len); } simdutf_warn_unused result implementation::validate_utf16be_with_errors( - const char16_t *buf, size_t len) const noexcept { - const char16_t *start_buf = buf; - const char16_t *end = buf + len; - const __m512i byteflip = _mm512_setr_epi64( - 0x0607040502030001, 0x0e0f0c0d0a0b0809, 0x0607040502030001, - 0x0e0f0c0d0a0b0809, 0x0607040502030001, 0x0e0f0c0d0a0b0809, - 0x0607040502030001, 0x0e0f0c0d0a0b0809); - for (; end - buf >= 32;) { - __m512i in = - _mm512_shuffle_epi8(_mm512_loadu_si512((__m512i *)buf), byteflip); - __m512i diff = _mm512_sub_epi16(in, _mm512_set1_epi16(uint16_t(0xD800))); - __mmask32 surrogates = - _mm512_cmplt_epu16_mask(diff, _mm512_set1_epi16(uint16_t(0x0800))); - if (surrogates) { - __mmask32 highsurrogates = - _mm512_cmplt_epu16_mask(diff, _mm512_set1_epi16(uint16_t(0x0400))); - __mmask32 lowsurrogates = surrogates ^ highsurrogates; - // high must be followed by low - if ((highsurrogates << 1) != lowsurrogates) { - uint32_t extra_low = _tzcnt_u32(lowsurrogates & ~(highsurrogates << 1)); - uint32_t extra_high = - _tzcnt_u32(highsurrogates & ~(lowsurrogates >> 1)); - return result(error_code::SURROGATE, - (buf - start_buf) + - (extra_low < extra_high ? extra_low : extra_high)); - } - bool ends_with_high = ((highsurrogates & 0x80000000) != 0); - if (ends_with_high) { - buf += 31; // advance only by 31 code units so that we start with the - // high surrogate on the next round. - } else { - buf += 32; - } - } else { - buf += 32; - } - } - if (buf < end) { - __m512i in = _mm512_shuffle_epi8( - _mm512_maskz_loadu_epi16((1U << (end - buf)) - 1, (__m512i *)buf), - byteflip); - __m512i diff = _mm512_sub_epi16(in, _mm512_set1_epi16(uint16_t(0xD800))); - __mmask32 surrogates = - _mm512_cmplt_epu16_mask(diff, _mm512_set1_epi16(uint16_t(0x0800))); - if (surrogates) { - __mmask32 highsurrogates = - _mm512_cmplt_epu16_mask(diff, _mm512_set1_epi16(uint16_t(0x0400))); - __mmask32 lowsurrogates = surrogates ^ highsurrogates; - // high must be followed by low - if ((highsurrogates << 1) != lowsurrogates) { - uint32_t extra_low = _tzcnt_u32(lowsurrogates & ~(highsurrogates << 1)); - uint32_t extra_high = - _tzcnt_u32(highsurrogates & ~(lowsurrogates >> 1)); - return result(error_code::SURROGATE, - (buf - start_buf) + - (extra_low < extra_high ? extra_low : extra_high)); - } - } - } - return result(error_code::SUCCESS, len); + const char16_t *src, size_t len) const noexcept { + if (supports_zvbb()) + return rvv_validate_utf16_with_errors(src, len); + else + return rvv_validate_utf16_with_errors(src, len); } simdutf_warn_unused bool -implementation::validate_utf32(const char32_t *buf, size_t len) const noexcept { - const char32_t *tail = icelake::validate_utf32(buf, len); - if (tail) { - return scalar::utf32::validate(tail, len - (tail - buf)); - } else { - // we come here if there was an error, or buf was nullptr which may happen - // for empty input. - return len == 0; +implementation::validate_utf32(const char32_t *src, size_t len) const noexcept { + size_t vlmax = __riscv_vsetvlmax_e32m8(); + vuint32m8_t max = __riscv_vmv_v_x_u32m8(0x10FFFF, vlmax); + vuint32m8_t maxOff = __riscv_vmv_v_x_u32m8(0xFFFFF7FF, vlmax); + for (size_t vl; len > 0; len -= vl, src += vl) { + vl = __riscv_vsetvl_e32m8(len); + vuint32m8_t v = __riscv_vle32_v_u32m8((uint32_t *)src, vl); + vuint32m8_t off = __riscv_vadd_vx_u32m8(v, 0xFFFF2000, vl); + max = __riscv_vmaxu_vv_u32m8_tu(max, max, v, vl); + maxOff = __riscv_vmaxu_vv_u32m8_tu(maxOff, maxOff, off, vl); } + return __riscv_vfirst_m_b4( + __riscv_vmor_mm_b4( + __riscv_vmsne_vx_u32m8_b4(max, 0x10FFFF, vlmax), + __riscv_vmsne_vx_u32m8_b4(maxOff, 0xFFFFF7FF, vlmax), vlmax), + vlmax) < 0; } simdutf_warn_unused result implementation::validate_utf32_with_errors( - const char32_t *buf, size_t len) const noexcept { - const char32_t *buf_orig = buf; - if (len >= 16) { - const char32_t *end = buf + len - 16; - while (buf <= end) { - __m512i utf32 = _mm512_loadu_si512((const __m512i *)buf); - __mmask16 outside_range = _mm512_cmp_epu32_mask( - utf32, _mm512_set1_epi32(0x10ffff), _MM_CMPINT_GT); - - __m512i utf32_off = - _mm512_add_epi32(utf32, _mm512_set1_epi32(0xffff2000)); - - __mmask16 surrogate_range = _mm512_cmp_epu32_mask( - utf32_off, _mm512_set1_epi32(0xfffff7ff), _MM_CMPINT_GT); - if ((outside_range | surrogate_range)) { - auto outside_idx = _tzcnt_u32(outside_range); - auto surrogate_idx = _tzcnt_u32(surrogate_range); - - if (outside_idx < surrogate_idx) { - return result(error_code::TOO_LARGE, buf - buf_orig + outside_idx); - } - - return result(error_code::SURROGATE, buf - buf_orig + surrogate_idx); + const char32_t *src, size_t len) const noexcept { + const char32_t *beg = src; + for (size_t vl; len > 0; len -= vl, src += vl) { + vl = __riscv_vsetvl_e32m8(len); + vuint32m8_t v = __riscv_vle32_v_u32m8((uint32_t *)src, vl); + vuint32m8_t off = __riscv_vadd_vx_u32m8(v, 0xFFFF2000, vl); + long idx1 = + __riscv_vfirst_m_b4(__riscv_vmsgtu_vx_u32m8_b4(v, 0x10FFFF, vl), vl); + long idx2 = __riscv_vfirst_m_b4( + __riscv_vmsgtu_vx_u32m8_b4(off, 0xFFFFF7FF, vl), vl); + if (idx1 >= 0 && idx2 >= 0) { + if (idx1 <= idx2) { + return result(error_code::TOO_LARGE, src - beg + idx1); + } else { + return result(error_code::SURROGATE, src - beg + idx2); } - - buf += 16; + } + if (idx1 >= 0) { + return result(error_code::TOO_LARGE, src - beg + idx1); + } + if (idx2 >= 0) { + return result(error_code::SURROGATE, src - beg + idx2); } } - if (len > 0) { - __m512i utf32 = _mm512_maskz_loadu_epi32( - __mmask16((1U << (buf_orig + len - buf)) - 1), (const __m512i *)buf); - __mmask16 outside_range = _mm512_cmp_epu32_mask( - utf32, _mm512_set1_epi32(0x10ffff), _MM_CMPINT_GT); - __m512i utf32_off = _mm512_add_epi32(utf32, _mm512_set1_epi32(0xffff2000)); - - __mmask16 surrogate_range = _mm512_cmp_epu32_mask( - utf32_off, _mm512_set1_epi32(0xfffff7ff), _MM_CMPINT_GT); - if ((outside_range | surrogate_range)) { - auto outside_idx = _tzcnt_u32(outside_range); - auto surrogate_idx = _tzcnt_u32(surrogate_range); + return result(error_code::SUCCESS, src - beg); +} +/* end file src/rvv/rvv_validate.inl.cpp */ - if (outside_idx < surrogate_idx) { - return result(error_code::TOO_LARGE, buf - buf_orig + outside_idx); - } +/* begin file src/rvv/rvv_latin1_to.inl.cpp */ - return result(error_code::SURROGATE, buf - buf_orig + surrogate_idx); +simdutf_warn_unused size_t implementation::convert_latin1_to_utf8( + const char *src, size_t len, char *dst) const noexcept { + char *beg = dst; + for (size_t vl, vlOut; len > 0; len -= vl, src += vl, dst += vlOut) { + vl = __riscv_vsetvl_e8m2(len); + vuint8m2_t v1 = __riscv_vle8_v_u8m2((uint8_t *)src, vl); + vbool4_t nascii = + __riscv_vmslt_vx_i8m2_b4(__riscv_vreinterpret_v_u8m2_i8m2(v1), 0, vl); + size_t cnt = __riscv_vcpop_m_b4(nascii, vl); + vlOut = vl + cnt; + if (cnt == 0) { + __riscv_vse8_v_u8m2((uint8_t *)dst, v1, vlOut); + continue; } - } - return result(error_code::SUCCESS, len); -} + vuint8m2_t v0 = + __riscv_vor_vx_u8m2(__riscv_vsrl_vx_u8m2(v1, 6, vl), 0b11000000, vl); + v1 = __riscv_vand_vx_u8m2_mu(nascii, v1, v1, 0b10111111, vl); -simdutf_warn_unused size_t implementation::convert_latin1_to_utf8( - const char *buf, size_t len, char *utf8_output) const noexcept { - return icelake::latin1_to_utf8_avx512_start(buf, len, utf8_output); + vuint8m4_t wide = + __riscv_vreinterpret_v_u16m4_u8m4(__riscv_vwmaccu_vx_u16m4( + __riscv_vwaddu_vv_u16m4(v0, v1, vl), 0xFF, v1, vl)); + vbool2_t mask = __riscv_vmsgtu_vx_u8m4_b2( + __riscv_vsub_vx_u8m4(wide, 0b11000000, vl * 2), 1, vl * 2); + vuint8m4_t comp = __riscv_vcompress_vm_u8m4(wide, mask, vl * 2); + + __riscv_vse8_v_u8m4((uint8_t *)dst, comp, vlOut); + } + return dst - beg; } simdutf_warn_unused size_t implementation::convert_latin1_to_utf16le( - const char *buf, size_t len, char16_t *utf16_output) const noexcept { - return icelake_convert_latin1_to_utf16(buf, len, - utf16_output); + const char *src, size_t len, char16_t *dst) const noexcept { + char16_t *beg = dst; + for (size_t vl; len > 0; len -= vl, src += vl, dst += vl) { + vl = __riscv_vsetvl_e8m4(len); + vuint8m4_t v = __riscv_vle8_v_u8m4((uint8_t *)src, vl); + __riscv_vse16_v_u16m8((uint16_t *)dst, __riscv_vzext_vf2_u16m8(v, vl), vl); + } + return dst - beg; } simdutf_warn_unused size_t implementation::convert_latin1_to_utf16be( - const char *buf, size_t len, char16_t *utf16_output) const noexcept { - return icelake_convert_latin1_to_utf16(buf, len, - utf16_output); + const char *src, size_t len, char16_t *dst) const noexcept { + char16_t *beg = dst; + for (size_t vl; len > 0; len -= vl, src += vl, dst += vl) { + vl = __riscv_vsetvl_e8m4(len); + vuint8m4_t v = __riscv_vle8_v_u8m4((uint8_t *)src, vl); + __riscv_vse16_v_u16m8( + (uint16_t *)dst, + __riscv_vsll_vx_u16m8(__riscv_vzext_vf2_u16m8(v, vl), 8, vl), vl); + } + return dst - beg; } simdutf_warn_unused size_t implementation::convert_latin1_to_utf32( - const char *buf, size_t len, char32_t *utf32_output) const noexcept { - std::pair ret = - avx512_convert_latin1_to_utf32(buf, len, utf32_output); - if (ret.first == nullptr) { - return 0; + const char *src, size_t len, char32_t *dst) const noexcept { + char32_t *beg = dst; + for (size_t vl; len > 0; len -= vl, src += vl, dst += vl) { + vl = __riscv_vsetvl_e8m2(len); + vuint8m2_t v = __riscv_vle8_v_u8m2((uint8_t *)src, vl); + __riscv_vse32_v_u32m8((uint32_t *)dst, __riscv_vzext_vf4_u32m8(v, vl), vl); } - size_t converted_chars = ret.second - utf32_output; - if (ret.first != buf + len) { - const size_t scalar_converted_chars = scalar::latin1_to_utf32::convert( - ret.first, len - (ret.first - buf), ret.second); - if (scalar_converted_chars == 0) { - return 0; - } - converted_chars += scalar_converted_chars; + return dst - beg; +} +/* end file src/rvv/rvv_latin1_to.inl.cpp */ +/* begin file src/rvv/rvv_utf16_to.inl.cpp */ +#include + +template +simdutf_really_inline static result +rvv_utf16_to_latin1_with_errors(const char16_t *src, size_t len, char *dst) { + const char16_t *const beg = src; + for (size_t vl; len > 0; len -= vl, src += vl, dst += vl) { + vl = __riscv_vsetvl_e16m8(len); + vuint16m8_t v = __riscv_vle16_v_u16m8((uint16_t *)src, vl); + v = simdutf_byteflip(v, vl); + long idx = __riscv_vfirst_m_b2(__riscv_vmsgtu_vx_u16m8_b2(v, 255, vl), vl); + if (idx >= 0) + return result(error_code::TOO_LARGE, src - beg + idx); + __riscv_vse8_v_u8m4((uint8_t *)dst, __riscv_vncvt_x_x_w_u8m4(v, vl), vl); } - return converted_chars; + return result(error_code::SUCCESS, src - beg); } -simdutf_warn_unused size_t implementation::convert_utf8_to_latin1( - const char *buf, size_t len, char *latin1_output) const noexcept { - return icelake::utf8_to_latin1_avx512(buf, len, latin1_output); +simdutf_warn_unused size_t implementation::convert_utf16le_to_latin1( + const char16_t *src, size_t len, char *dst) const noexcept { + result res = convert_utf16le_to_latin1_with_errors(src, len, dst); + return res.error == error_code::SUCCESS ? res.count : 0; } -simdutf_warn_unused result implementation::convert_utf8_to_latin1_with_errors( - const char *buf, size_t len, char *latin1_output) const noexcept { - // First, try to convert as much as possible using the SIMD implementation. - const char *obuf = buf; - char *olatin1_output = latin1_output; - size_t written = icelake::utf8_to_latin1_avx512(obuf, len, olatin1_output); +simdutf_warn_unused size_t implementation::convert_utf16be_to_latin1( + const char16_t *src, size_t len, char *dst) const noexcept { + result res = convert_utf16be_to_latin1_with_errors(src, len, dst); + return res.error == error_code::SUCCESS ? res.count : 0; +} - // If we have completely converted the string - if (obuf == buf + len) { - return {simdutf::SUCCESS, written}; - } - size_t pos = obuf - buf; - result res = scalar::utf8_to_latin1::rewind_and_convert_with_errors( - pos, buf + pos, len - pos, latin1_output); - res.count += pos; - return res; +simdutf_warn_unused result +implementation::convert_utf16le_to_latin1_with_errors( + const char16_t *src, size_t len, char *dst) const noexcept { + return rvv_utf16_to_latin1_with_errors(src, len, dst); } -simdutf_warn_unused size_t implementation::convert_valid_utf8_to_latin1( - const char *buf, size_t len, char *latin1_output) const noexcept { - return icelake::valid_utf8_to_latin1_avx512(buf, len, latin1_output); +simdutf_warn_unused result +implementation::convert_utf16be_to_latin1_with_errors( + const char16_t *src, size_t len, char *dst) const noexcept { + if (supports_zvbb()) + return rvv_utf16_to_latin1_with_errors(src, len, + dst); + else + return rvv_utf16_to_latin1_with_errors(src, len, dst); } -simdutf_warn_unused size_t implementation::convert_utf8_to_utf16le( - const char *buf, size_t len, char16_t *utf16_output) const noexcept { - utf8_to_utf16_result ret = - fast_avx512_convert_utf8_to_utf16(buf, len, - utf16_output); - if (ret.second == nullptr) { - return 0; +simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_latin1( + const char16_t *src, size_t len, char *dst) const noexcept { + const char16_t *const beg = src; + for (size_t vl; len > 0; len -= vl, src += vl, dst += vl) { + vl = __riscv_vsetvl_e16m8(len); + vuint16m8_t v = __riscv_vle16_v_u16m8((uint16_t *)src, vl); + __riscv_vse8_v_u8m4((uint8_t *)dst, __riscv_vncvt_x_x_w_u8m4(v, vl), vl); } - return ret.second - utf16_output; + return src - beg; } -simdutf_warn_unused size_t implementation::convert_utf8_to_utf16be( - const char *buf, size_t len, char16_t *utf16_output) const noexcept { - utf8_to_utf16_result ret = fast_avx512_convert_utf8_to_utf16( - buf, len, utf16_output); - if (ret.second == nullptr) { - return 0; +simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_latin1( + const char16_t *src, size_t len, char *dst) const noexcept { + const char16_t *const beg = src; + for (size_t vl; len > 0; len -= vl, src += vl, dst += vl) { + vl = __riscv_vsetvl_e16m8(len); + vuint16m8_t v = __riscv_vle16_v_u16m8((uint16_t *)src, vl); + __riscv_vse8_v_u8m4((uint8_t *)dst, __riscv_vnsrl_wx_u8m4(v, 8, vl), vl); } - return ret.second - utf16_output; + return src - beg; } -simdutf_warn_unused result implementation::convert_utf8_to_utf16le_with_errors( - const char *buf, size_t len, char16_t *utf16_output) const noexcept { - return fast_avx512_convert_utf8_to_utf16_with_errors( - buf, len, utf16_output); -} +template +simdutf_really_inline static result +rvv_utf16_to_utf8_with_errors(const char16_t *src, size_t len, char *dst) { + size_t n = len; + const char16_t *srcBeg = src; + const char *dstBeg = dst; + size_t vl8m4 = __riscv_vsetvlmax_e8m4(); + vbool2_t m4mulp2 = __riscv_vmseq_vx_u8m4_b2( + __riscv_vand_vx_u8m4(__riscv_vid_v_u8m4(vl8m4), 3, vl8m4), 2, vl8m4); -simdutf_warn_unused result implementation::convert_utf8_to_utf16be_with_errors( - const char *buf, size_t len, char16_t *utf16_output) const noexcept { - return fast_avx512_convert_utf8_to_utf16_with_errors( - buf, len, utf16_output); -} + for (size_t vl, vlOut; n > 0;) { + vl = __riscv_vsetvl_e16m2(n); -simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf16le( - const char *buf, size_t len, char16_t *utf16_output) const noexcept { - utf8_to_utf16_result ret = - icelake::valid_utf8_to_fixed_length( - buf, len, utf16_output); - size_t saved_bytes = ret.second - utf16_output; - const char *end = buf + len; - if (ret.first == end) { - return saved_bytes; - } + vuint16m2_t v = __riscv_vle16_v_u16m2((uint16_t const *)src, vl); + v = simdutf_byteflip(v, vl); + vbool8_t m234 = __riscv_vmsgtu_vx_u16m2_b8(v, 0x80 - 1, vl); - // Note: AVX512 procedure looks up 4 bytes forward, and - // correctly converts multi-byte chars even if their - // continuation bytes lie outsiede 16-byte window. - // It meas, we have to skip continuation bytes from - // the beginning ret.first, as they were already consumed. - while (ret.first != end && ((uint8_t(*ret.first) & 0xc0) == 0x80)) { - ret.first += 1; - } + if (__riscv_vfirst_m_b8(m234, vl) < 0) { /* 1 byte utf8 */ + vlOut = vl; + __riscv_vse8_v_u8m1((uint8_t *)dst, __riscv_vncvt_x_x_w_u8m1(v, vlOut), + vlOut); + n -= vl, src += vl, dst += vlOut; + continue; + } - if (ret.first != end) { - const size_t scalar_saved_bytes = - scalar::utf8_to_utf16::convert_valid( - ret.first, len - (ret.first - buf), ret.second); - if (scalar_saved_bytes == 0) { - return 0; + vbool8_t m34 = __riscv_vmsgtu_vx_u16m2_b8(v, 0x800 - 1, vl); + + if (__riscv_vfirst_m_b8(m34, vl) < 0) { /* 1/2 byte utf8 */ + /* 0: [ aaa|aabbbbbb] + * 1: [aabbbbbb| ] vsll 8 + * 2: [ | aaaaa] vsrl 6 + * 3: [00111111|00011111] + * 4: [ bbbbbb|000aaaaa] (1|2)&3 + * 5: [11000000|11000000] + * 6: [10bbbbbb|110aaaaa] 4|5 */ + vuint16m2_t twoByte = __riscv_vand_vx_u16m2( + __riscv_vor_vv_u16m2(__riscv_vsll_vx_u16m2(v, 8, vl), + __riscv_vsrl_vx_u16m2(v, 6, vl), vl), + 0b0011111100011111, vl); + vuint16m2_t vout16 = + __riscv_vor_vx_u16m2_mu(m234, v, twoByte, 0b1000000011000000, vl); + vuint8m2_t vout = __riscv_vreinterpret_v_u16m2_u8m2(vout16); + + /* Every high byte that is zero should be compressed + * low bytes should never be compressed, so we set them + * to all ones, and then create a non-zero bytes mask */ + vbool4_t mcomp = + __riscv_vmsne_vx_u8m2_b4(__riscv_vreinterpret_v_u16m2_u8m2( + __riscv_vor_vx_u16m2(vout16, 0xFF, vl)), + 0, vl * 2); + vlOut = __riscv_vcpop_m_b4(mcomp, vl * 2); + + vout = __riscv_vcompress_vm_u8m2(vout, mcomp, vl * 2); + __riscv_vse8_v_u8m2((uint8_t *)dst, vout, vlOut); + + n -= vl, src += vl, dst += vlOut; + continue; } - saved_bytes += scalar_saved_bytes; - } - return saved_bytes; -} + vbool8_t sur = __riscv_vmseq_vx_u16m2_b8( + __riscv_vand_vx_u16m2(v, 0xF800, vl), 0xD800, vl); + long first = __riscv_vfirst_m_b8(sur, vl); + size_t tail = vl - first; + vl = first < 0 ? vl : first; -simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf16be( - const char *buf, size_t len, char16_t *utf16_output) const noexcept { - utf8_to_utf16_result ret = - icelake::valid_utf8_to_fixed_length( - buf, len, utf16_output); - size_t saved_bytes = ret.second - utf16_output; - const char *end = buf + len; - if (ret.first == end) { - return saved_bytes; - } + if (vl > 0) { /* 1/2/3 byte utf8 */ + /* in: [aaaabbbb|bbcccccc] + * v1: [0bcccccc| ] vsll 8 + * v1: [10cccccc| ] vsll 8 & 0b00111111 | 0b10000000 + * v2: [ |110bbbbb] vsrl 6 & 0b00111111 | 0b11000000 + * v2: [ |10bbbbbb] vsrl 6 & 0b00111111 | 0b10000000 + * v3: [ |1110aaaa] vsrl 12 | 0b11100000 + * 1: [00000000|0bcccccc|00000000|00000000] => [0bcccccc] + * 2: [00000000|10cccccc|110bbbbb|00000000] => [110bbbbb] [10cccccc] + * 3: [00000000|10cccccc|10bbbbbb|1110aaaa] => [1110aaaa] [10bbbbbb] + * [10cccccc] + */ + vuint16m2_t v1, v2, v3, v12; + v1 = __riscv_vor_vx_u16m2_mu( + m234, v, __riscv_vand_vx_u16m2(v, 0b00111111, vl), 0b10000000, vl); + v1 = __riscv_vsll_vx_u16m2(v1, 8, vl); - // Note: AVX512 procedure looks up 4 bytes forward, and - // correctly converts multi-byte chars even if their - // continuation bytes lie outsiede 16-byte window. - // It meas, we have to skip continuation bytes from - // the beginning ret.first, as they were already consumed. - while (ret.first != end && ((uint8_t(*ret.first) & 0xc0) == 0x80)) { - ret.first += 1; - } + v2 = __riscv_vor_vx_u16m2( + __riscv_vand_vx_u16m2(__riscv_vsrl_vx_u16m2(v, 6, vl), 0b00111111, + vl), + 0b10000000, vl); + v2 = __riscv_vor_vx_u16m2_mu(__riscv_vmnot_m_b8(m34, vl), v2, v2, + 0b01000000, vl); + v3 = __riscv_vor_vx_u16m2(__riscv_vsrl_vx_u16m2(v, 12, vl), 0b11100000, + vl); + v12 = __riscv_vor_vv_u16m2_mu(m234, v1, v1, v2, vl); - if (ret.first != end) { - const size_t scalar_saved_bytes = - scalar::utf8_to_utf16::convert_valid( - ret.first, len - (ret.first - buf), ret.second); - if (scalar_saved_bytes == 0) { - return 0; + vuint32m4_t w12 = __riscv_vwmulu_vx_u32m4(v12, 1 << 8, vl); + vuint32m4_t w123 = __riscv_vwaddu_wv_u32m4_mu(m34, w12, w12, v3, vl); + vuint8m4_t vout = __riscv_vreinterpret_v_u32m4_u8m4(w123); + + vbool2_t mcomp = __riscv_vmor_mm_b2( + m4mulp2, __riscv_vmsne_vx_u8m4_b2(vout, 0, vl * 4), vl * 4); + vlOut = __riscv_vcpop_m_b2(mcomp, vl * 4); + + vout = __riscv_vcompress_vm_u8m4(vout, mcomp, vl * 4); + __riscv_vse8_v_u8m4((uint8_t *)dst, vout, vlOut); + + n -= vl, src += vl, dst += vlOut; } - saved_bytes += scalar_saved_bytes; + + if (tail) + while (n) { + uint16_t word = simdutf_byteflip(src[0]); + if ((word & 0xFF80) == 0) { + break; + } else if ((word & 0xF800) == 0) { + break; + } else if ((word & 0xF800) != 0xD800) { + break; + } else { + // must be a surrogate pair + if (n <= 1) + return result(error_code::SURROGATE, src - srcBeg); + uint16_t diff = word - 0xD800; + if (diff > 0x3FF) + return result(error_code::SURROGATE, src - srcBeg); + uint16_t diff2 = simdutf_byteflip(src[1]) - 0xDC00; + if (diff2 > 0x3FF) + return result(error_code::SURROGATE, src - srcBeg); + + uint32_t value = ((diff + 0x40) << 10) + diff2; + + // will generate four UTF-8 bytes + // we have 0b11110XXX 0b10XXXXXX 0b10XXXXXX 0b10XXXXXX + *dst++ = (char)((value >> 18) | 0b11110000); + *dst++ = (char)(((value >> 12) & 0b111111) | 0b10000000); + *dst++ = (char)(((value >> 6) & 0b111111) | 0b10000000); + *dst++ = (char)((value & 0b111111) | 0b10000000); + src += 2; + n -= 2; + } + } } - return saved_bytes; + return result(error_code::SUCCESS, dst - dstBeg); } -simdutf_warn_unused size_t implementation::convert_utf8_to_utf32( - const char *buf, size_t len, char32_t *utf32_out) const noexcept { - uint32_t *utf32_output = reinterpret_cast(utf32_out); - utf8_to_utf32_result ret = - icelake::validating_utf8_to_fixed_length( - buf, len, utf32_output); - if (ret.second == nullptr) - return 0; +simdutf_warn_unused size_t implementation::convert_utf16le_to_utf8( + const char16_t *src, size_t len, char *dst) const noexcept { + result res = convert_utf16le_to_utf8_with_errors(src, len, dst); + return res.error == error_code::SUCCESS ? res.count : 0; +} - size_t saved_bytes = ret.second - utf32_output; - const char *end = buf + len; - if (ret.first == end) { - return saved_bytes; - } +simdutf_warn_unused size_t implementation::convert_utf16be_to_utf8( + const char16_t *src, size_t len, char *dst) const noexcept { + result res = convert_utf16be_to_utf8_with_errors(src, len, dst); + return res.error == error_code::SUCCESS ? res.count : 0; +} - // Note: the AVX512 procedure looks up 4 bytes forward, and - // correctly converts multi-byte chars even if their - // continuation bytes lie outside 16-byte window. - // It means, we have to skip continuation bytes from - // the beginning ret.first, as they were already consumed. - while (ret.first != end && ((uint8_t(*ret.first) & 0xc0) == 0x80)) { - ret.first += 1; - } - if (ret.first != end) { - const size_t scalar_saved_bytes = scalar::utf8_to_utf32::convert( - ret.first, len - (ret.first - buf), utf32_out + saved_bytes); - if (scalar_saved_bytes == 0) { - return 0; +simdutf_warn_unused result implementation::convert_utf16le_to_utf8_with_errors( + const char16_t *src, size_t len, char *dst) const noexcept { + return rvv_utf16_to_utf8_with_errors(src, len, dst); +} + +simdutf_warn_unused result implementation::convert_utf16be_to_utf8_with_errors( + const char16_t *src, size_t len, char *dst) const noexcept { + if (supports_zvbb()) + return rvv_utf16_to_utf8_with_errors(src, len, dst); + else + return rvv_utf16_to_utf8_with_errors(src, len, dst); +} + +simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_utf8( + const char16_t *src, size_t len, char *dst) const noexcept { + return convert_utf16le_to_utf8(src, len, dst); +} + +simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_utf8( + const char16_t *src, size_t len, char *dst) const noexcept { + return convert_utf16be_to_utf8(src, len, dst); +} + +template +simdutf_really_inline static result +rvv_utf16_to_utf32_with_errors(const char16_t *src, size_t len, char32_t *dst) { + const char16_t *const srcBeg = src; + char32_t *const dstBeg = dst; + + constexpr const uint16_t ANY_SURROGATE_MASK = 0xf800; + constexpr const uint16_t ANY_SURROGATE_VALUE = 0xd800; + constexpr const uint16_t LO_SURROGATE_MASK = 0xfc00; + constexpr const uint16_t LO_SURROGATE_VALUE = 0xdc00; + constexpr const uint16_t HI_SURROGATE_MASK = 0xfc00; + constexpr const uint16_t HI_SURROGATE_VALUE = 0xd800; + + uint16_t last = 0; + while (len > 0) { + size_t vl = __riscv_vsetvl_e16m2(len); + vuint16m2_t v0 = __riscv_vle16_v_u16m2((uint16_t const *)src, vl); + v0 = simdutf_byteflip(v0, vl); + + { // check fast-path + const vuint16m2_t v = __riscv_vand_vx_u16m2(v0, ANY_SURROGATE_MASK, vl); + const vbool8_t any_surrogate = + __riscv_vmseq_vx_u16m2_b8(v, ANY_SURROGATE_VALUE, vl); + if (__riscv_vfirst_m_b8(any_surrogate, vl) < 0) { + /* no surrogates */ + __riscv_vse32_v_u32m4((uint32_t *)dst, __riscv_vzext_vf2_u32m4(v0, vl), + vl); + len -= vl; + src += vl; + dst += vl; + continue; + } + } + + if ((simdutf_byteflip(src[0]) & LO_SURROGATE_MASK) == + LO_SURROGATE_VALUE) { + return result(error_code::SURROGATE, src - srcBeg); + } + + // decode surrogates + vuint16m2_t v1 = __riscv_vslide1down_vx_u16m2(v0, 0, vl); + vl = __riscv_vsetvl_e16m2(vl - 1); + if (vl == 0) { + return result(error_code::SURROGATE, src - srcBeg); + } + + const vbool8_t surhi = __riscv_vmseq_vx_u16m2_b8( + __riscv_vand_vx_u16m2(v0, HI_SURROGATE_MASK, vl), HI_SURROGATE_VALUE, + vl); + const vbool8_t surlo = __riscv_vmseq_vx_u16m2_b8( + __riscv_vand_vx_u16m2(v1, LO_SURROGATE_MASK, vl), LO_SURROGATE_VALUE, + vl); + + // compress everything but lo surrogates + const vbool8_t compress = __riscv_vmsne_vx_u16m2_b8( + __riscv_vand_vx_u16m2(v0, LO_SURROGATE_MASK, vl), LO_SURROGATE_VALUE, + vl); + + { + const vbool8_t diff = __riscv_vmxor_mm_b8(surhi, surlo, vl); + const long idx = __riscv_vfirst_m_b8(diff, vl); + if (idx >= 0) { + uint16_t word = simdutf_byteflip(src[idx]); + if (word < 0xD800 || word > 0xDBFF) { + return result(error_code::SURROGATE, src - srcBeg + idx + 1); + } + return result(error_code::SURROGATE, src - srcBeg + idx); + } } - saved_bytes += scalar_saved_bytes; - } - return saved_bytes; -} + last = simdutf_byteflip(src[vl]); + vuint32m4_t utf32 = __riscv_vzext_vf2_u32m4(v0, vl); -simdutf_warn_unused result implementation::convert_utf8_to_utf32_with_errors( - const char *buf, size_t len, char32_t *utf32) const noexcept { - if (simdutf_unlikely(len == 0)) { - return {error_code::SUCCESS, 0}; - } - uint32_t *utf32_output = reinterpret_cast(utf32); - auto ret = icelake::validating_utf8_to_fixed_length_with_constant_checks< - endianness::LITTLE, uint32_t>(buf, len, utf32_output); + // v0 = 110110yyyyyyyyyy (0xd800 + yyyyyyyyyy) --- hi surrogate + // v1 = 110111xxxxxxxxxx (0xdc00 + xxxxxxxxxx) --- lo surrogate - if (!std::get<2>(ret)) { - size_t pos = std::get<0>(ret) - buf; - // We might have an error that occurs right before pos. - // This is only a concern if buf[pos] is not a continuation byte. - if ((buf[pos] & 0xc0) != 0x80 && pos >= 64) { - pos -= 1; - } else if ((buf[pos] & 0xc0) == 0x80 && pos >= 64) { - // We must check whether we are the fourth continuation byte - bool c1 = (buf[pos - 1] & 0xc0) == 0x80; - bool c2 = (buf[pos - 2] & 0xc0) == 0x80; - bool c3 = (buf[pos - 3] & 0xc0) == 0x80; - if (c1 && c2 && c3) { - return {simdutf::TOO_LONG, pos}; - } - } - // todo: we reset the output to utf32 instead of using std::get<2.(ret) as - // you'd expect. that is because - // validating_utf8_to_fixed_length_with_constant_checks may have processed - // data beyond the error. - result res = scalar::utf8_to_utf32::rewind_and_convert_with_errors( - pos, buf + pos, len - pos, utf32); - res.count += pos; - return res; - } - size_t saved_bytes = std::get<1>(ret) - utf32_output; - const char *end = buf + len; - if (std::get<0>(ret) == end) { - return {simdutf::SUCCESS, saved_bytes}; - } + // t0 = u16( 0000_00yy_yyyy_yyyy) + const vuint32m4_t t0 = + __riscv_vzext_vf2_u32m4(__riscv_vand_vx_u16m2(v0, 0x03ff, vl), vl); + // t1 = u32(0000_0000_0000_yyyy_yyyy_yy00_0000_0000) + const vuint32m4_t t1 = __riscv_vsll_vx_u32m4(t0, 10, vl); - // Note: the AVX512 procedure looks up 4 bytes forward, and - // correctly converts multi-byte chars even if their - // continuation bytes lie outside 16-byte window. - // It means, we have to skip continuation bytes from - // the beginning ret.first, as they were already consumed. - while (std::get<0>(ret) != end and - ((uint8_t(*std::get<0>(ret)) & 0xc0) == 0x80)) { - std::get<0>(ret) += 1; - } + // t2 = u32(0000_0000_0000_0000_0000_00xx_xxxx_xxxx) + const vuint32m4_t t2 = + __riscv_vzext_vf2_u32m4(__riscv_vand_vx_u16m2(v1, 0x03ff, vl), vl); - if (std::get<0>(ret) != end) { - auto scalar_result = scalar::utf8_to_utf32::convert_with_errors( - std::get<0>(ret), len - (std::get<0>(ret) - buf), - reinterpret_cast(utf32_output) + saved_bytes); - if (scalar_result.error != simdutf::SUCCESS) { - scalar_result.count += (std::get<0>(ret) - buf); - } else { - scalar_result.count += saved_bytes; - } - return scalar_result; - } + // t3 = u32(0000_0000_0000_yyyy_yyyy_yyxx_xxxx_xxxx) + const vuint32m4_t t3 = __riscv_vor_vv_u32m4(t1, t2, vl); - return {simdutf::SUCCESS, size_t(std::get<1>(ret) - utf32_output)}; -} + // t4 = utf32 from surrogate pairs + const vuint32m4_t t4 = __riscv_vadd_vx_u32m4(t3, 0x10000, vl); -simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf32( - const char *buf, size_t len, char32_t *utf32_out) const noexcept { - uint32_t *utf32_output = reinterpret_cast(utf32_out); - utf8_to_utf32_result ret = - icelake::valid_utf8_to_fixed_length( - buf, len, utf32_output); - size_t saved_bytes = ret.second - utf32_output; - const char *end = buf + len; - if (ret.first == end) { - return saved_bytes; - } + const vuint32m4_t result = __riscv_vmerge_vvm_u32m4(utf32, t4, surhi, vl); - // Note: AVX512 procedure looks up 4 bytes forward, and - // correctly converts multi-byte chars even if their - // continuation bytes lie outsiede 16-byte window. - // It meas, we have to skip continuation bytes from - // the beginning ret.first, as they were already consumed. - while (ret.first != end && ((uint8_t(*ret.first) & 0xc0) == 0x80)) { - ret.first += 1; - } + const vuint32m4_t comp = __riscv_vcompress_vm_u32m4(result, compress, vl); + const size_t vlOut = __riscv_vcpop_m_b8(compress, vl); + __riscv_vse32_v_u32m4((uint32_t *)dst, comp, vlOut); - if (ret.first != end) { - const size_t scalar_saved_bytes = scalar::utf8_to_utf32::convert_valid( - ret.first, len - (ret.first - buf), utf32_out + saved_bytes); - if (scalar_saved_bytes == 0) { - return 0; + len -= vl; + src += vl; + dst += vlOut; + + if ((last & LO_SURROGATE_MASK) == LO_SURROGATE_VALUE) { + // last item is lo surrogate and got already consumed + len -= 1; + src += 1; } - saved_bytes += scalar_saved_bytes; } - return saved_bytes; + return result(error_code::SUCCESS, dst - dstBeg); } -simdutf_warn_unused size_t implementation::convert_utf16le_to_latin1( - const char16_t *buf, size_t len, char *latin1_output) const noexcept { - return icelake_convert_utf16_to_latin1(buf, len, - latin1_output); +simdutf_warn_unused size_t implementation::convert_utf16le_to_utf32( + const char16_t *src, size_t len, char32_t *dst) const noexcept { + result res = convert_utf16le_to_utf32_with_errors(src, len, dst); + return res.error == error_code::SUCCESS ? res.count : 0; } -simdutf_warn_unused size_t implementation::convert_utf16be_to_latin1( - const char16_t *buf, size_t len, char *latin1_output) const noexcept { - return icelake_convert_utf16_to_latin1(buf, len, - latin1_output); +simdutf_warn_unused size_t implementation::convert_utf16be_to_utf32( + const char16_t *src, size_t len, char32_t *dst) const noexcept { + result res = convert_utf16be_to_utf32_with_errors(src, len, dst); + return res.error == error_code::SUCCESS ? res.count : 0; } -simdutf_warn_unused result -implementation::convert_utf16le_to_latin1_with_errors( - const char16_t *buf, size_t len, char *latin1_output) const noexcept { - return icelake_convert_utf16_to_latin1_with_errors( - buf, len, latin1_output) - .first; +simdutf_warn_unused result implementation::convert_utf16le_to_utf32_with_errors( + const char16_t *src, size_t len, char32_t *dst) const noexcept { + return rvv_utf16_to_utf32_with_errors(src, len, dst); } -simdutf_warn_unused result -implementation::convert_utf16be_to_latin1_with_errors( - const char16_t *buf, size_t len, char *latin1_output) const noexcept { - return icelake_convert_utf16_to_latin1_with_errors( - buf, len, latin1_output) - .first; +simdutf_warn_unused result implementation::convert_utf16be_to_utf32_with_errors( + const char16_t *src, size_t len, char32_t *dst) const noexcept { + if (supports_zvbb()) + return rvv_utf16_to_utf32_with_errors(src, len, + dst); + else + return rvv_utf16_to_utf32_with_errors(src, len, dst); } -simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_latin1( - const char16_t *buf, size_t len, char *latin1_output) const noexcept { - // optimization opportunity: implement custom function - return convert_utf16be_to_latin1(buf, len, latin1_output); +simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_utf32( + const char16_t *src, size_t len, char32_t *dst) const noexcept { + return convert_utf16le_to_utf32(src, len, dst); } -simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_latin1( - const char16_t *buf, size_t len, char *latin1_output) const noexcept { - // optimization opportunity: implement custom function - return convert_utf16le_to_latin1(buf, len, latin1_output); +simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_utf32( + const char16_t *src, size_t len, char32_t *dst) const noexcept { + return convert_utf16be_to_utf32(src, len, dst); } +/* end file src/rvv/rvv_utf16_to.inl.cpp */ +/* begin file src/rvv/rvv_utf32_to.inl.cpp */ -simdutf_warn_unused size_t implementation::convert_utf16le_to_utf8( - const char16_t *buf, size_t len, char *utf8_output) const noexcept { - size_t outlen; - size_t inlen = utf16_to_utf8_avx512i( - buf, len, (unsigned char *)utf8_output, &outlen); - if (inlen != len) { - return 0; - } - return outlen; +simdutf_warn_unused size_t implementation::convert_utf32_to_latin1( + const char32_t *src, size_t len, char *dst) const noexcept { + result res = convert_utf32_to_latin1_with_errors(src, len, dst); + return res.error == error_code::SUCCESS ? res.count : 0; } -simdutf_warn_unused size_t implementation::convert_utf16be_to_utf8( - const char16_t *buf, size_t len, char *utf8_output) const noexcept { - size_t outlen; - size_t inlen = utf16_to_utf8_avx512i( - buf, len, (unsigned char *)utf8_output, &outlen); - if (inlen != len) { - return 0; +simdutf_warn_unused result implementation::convert_utf32_to_latin1_with_errors( + const char32_t *src, size_t len, char *dst) const noexcept { + const char32_t *const beg = src; + for (size_t vl; len > 0; len -= vl, src += vl, dst += vl) { + vl = __riscv_vsetvl_e32m8(len); + vuint32m8_t v = __riscv_vle32_v_u32m8((uint32_t *)src, vl); + long idx = __riscv_vfirst_m_b4(__riscv_vmsgtu_vx_u32m8_b4(v, 255, vl), vl); + if (idx >= 0) + return result(error_code::TOO_LARGE, src - beg + idx); + /* We don't use vcompress here, because its performance varies widely on + * current platforms. This might be worth reconsidering once there is more + * hardware available. */ + __riscv_vse8_v_u8m2( + (uint8_t *)dst, + __riscv_vncvt_x_x_w_u8m2(__riscv_vncvt_x_x_w_u16m4(v, vl), vl), vl); } - return outlen; + return result(error_code::SUCCESS, src - beg); } -simdutf_warn_unused result implementation::convert_utf16le_to_utf8_with_errors( - const char16_t *buf, size_t len, char *utf8_output) const noexcept { - size_t outlen; - size_t inlen = utf16_to_utf8_avx512i( - buf, len, (unsigned char *)utf8_output, &outlen); - if (inlen != len) { - result res = scalar::utf16_to_utf8::convert_with_errors( - buf + inlen, len - inlen, utf8_output + outlen); - res.count += inlen; - return res; - } - return {simdutf::SUCCESS, outlen}; +simdutf_warn_unused size_t implementation::convert_valid_utf32_to_latin1( + const char32_t *src, size_t len, char *dst) const noexcept { + return convert_utf32_to_latin1(src, len, dst); } -simdutf_warn_unused result implementation::convert_utf16be_to_utf8_with_errors( - const char16_t *buf, size_t len, char *utf8_output) const noexcept { - size_t outlen; - size_t inlen = utf16_to_utf8_avx512i( - buf, len, (unsigned char *)utf8_output, &outlen); - if (inlen != len) { - result res = scalar::utf16_to_utf8::convert_with_errors( - buf + inlen, len - inlen, utf8_output + outlen); - res.count += inlen; - return res; - } - return {simdutf::SUCCESS, outlen}; -} +simdutf_warn_unused result implementation::convert_utf32_to_utf8_with_errors( + const char32_t *src, size_t len, char *dst) const noexcept { + size_t n = len; + const char32_t *srcBeg = src; + const char *dstBeg = dst; + size_t vl8m4 = __riscv_vsetvlmax_e8m4(); + vbool2_t m4mulp2 = __riscv_vmseq_vx_u8m4_b2( + __riscv_vand_vx_u8m4(__riscv_vid_v_u8m4(vl8m4), 3, vl8m4), 2, vl8m4); -simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_utf8( - const char16_t *buf, size_t len, char *utf8_output) const noexcept { - return convert_utf16le_to_utf8(buf, len, utf8_output); -} + for (size_t vl, vlOut; n > 0;) { + vl = __riscv_vsetvl_e32m4(n); -simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_utf8( - const char16_t *buf, size_t len, char *utf8_output) const noexcept { - return convert_utf16be_to_utf8(buf, len, utf8_output); -} + vuint32m4_t v = __riscv_vle32_v_u32m4((uint32_t const *)src, vl); + vbool8_t m234 = __riscv_vmsgtu_vx_u32m4_b8(v, 0x80 - 1, vl); + vuint16m2_t vn = __riscv_vncvt_x_x_w_u16m2(v, vl); -simdutf_warn_unused size_t implementation::convert_utf32_to_latin1( - const char32_t *buf, size_t len, char *latin1_output) const noexcept { - return icelake_convert_utf32_to_latin1(buf, len, latin1_output); -} + if (__riscv_vfirst_m_b8(m234, vl) < 0) { /* 1 byte utf8 */ + vlOut = vl; + __riscv_vse8_v_u8m1((uint8_t *)dst, __riscv_vncvt_x_x_w_u8m1(vn, vlOut), + vlOut); + n -= vl, src += vl, dst += vlOut; + continue; + } -simdutf_warn_unused result implementation::convert_utf32_to_latin1_with_errors( - const char32_t *buf, size_t len, char *latin1_output) const noexcept { - return icelake_convert_utf32_to_latin1_with_errors(buf, len, latin1_output) - .first; -} + vbool8_t m34 = __riscv_vmsgtu_vx_u32m4_b8(v, 0x800 - 1, vl); -simdutf_warn_unused size_t implementation::convert_valid_utf32_to_latin1( - const char32_t *buf, size_t len, char *latin1_output) const noexcept { - return icelake_convert_utf32_to_latin1(buf, len, latin1_output); -} + if (__riscv_vfirst_m_b8(m34, vl) < 0) { /* 1/2 byte utf8 */ + /* 0: [ aaa|aabbbbbb] + * 1: [aabbbbbb| ] vsll 8 + * 2: [ | aaaaa] vsrl 6 + * 3: [00111111|00111111] + * 4: [ bbbbbb|000aaaaa] (1|2)&3 + * 5: [10000000|11000000] + * 6: [10bbbbbb|110aaaaa] 4|5 */ + vuint16m2_t twoByte = __riscv_vand_vx_u16m2( + __riscv_vor_vv_u16m2(__riscv_vsll_vx_u16m2(vn, 8, vl), + __riscv_vsrl_vx_u16m2(vn, 6, vl), vl), + 0b0011111100111111, vl); + vuint16m2_t vout16 = + __riscv_vor_vx_u16m2_mu(m234, vn, twoByte, 0b1000000011000000, vl); + vuint8m2_t vout = __riscv_vreinterpret_v_u16m2_u8m2(vout16); -simdutf_warn_unused size_t implementation::convert_utf32_to_utf8( - const char32_t *buf, size_t len, char *utf8_output) const noexcept { - std::pair ret = - avx512_convert_utf32_to_utf8(buf, len, utf8_output); - if (ret.first == nullptr) { - return 0; - } - size_t saved_bytes = ret.second - utf8_output; - if (ret.first != buf + len) { - const size_t scalar_saved_bytes = scalar::utf32_to_utf8::convert( - ret.first, len - (ret.first - buf), ret.second); - if (scalar_saved_bytes == 0) { - return 0; + /* Every high byte that is zero should be compressed + * low bytes should never be compressed, so we set them + * to all ones, and then create a non-zero bytes mask */ + vbool4_t mcomp = + __riscv_vmsne_vx_u8m2_b4(__riscv_vreinterpret_v_u16m2_u8m2( + __riscv_vor_vx_u16m2(vout16, 0xFF, vl)), + 0, vl * 2); + vlOut = __riscv_vcpop_m_b4(mcomp, vl * 2); + + vout = __riscv_vcompress_vm_u8m2(vout, mcomp, vl * 2); + __riscv_vse8_v_u8m2((uint8_t *)dst, vout, vlOut); + + n -= vl, src += vl, dst += vlOut; + continue; + } + long idx1 = + __riscv_vfirst_m_b8(__riscv_vmsgtu_vx_u32m4_b8(v, 0x10FFFF, vl), vl); + vbool8_t sur = __riscv_vmseq_vx_u32m4_b8( + __riscv_vand_vx_u32m4(v, 0xFFFFF800, vl), 0xD800, vl); + long idx2 = __riscv_vfirst_m_b8(sur, vl); + if (idx1 >= 0 && idx2 >= 0) { + if (idx1 <= idx2) { + return result(error_code::TOO_LARGE, src - srcBeg + idx1); + } else { + return result(error_code::SURROGATE, src - srcBeg + idx2); + } + } + if (idx1 >= 0) { + return result(error_code::TOO_LARGE, src - srcBeg + idx1); + } + if (idx2 >= 0) { + return result(error_code::SURROGATE, src - srcBeg + idx2); } - saved_bytes += scalar_saved_bytes; - } - return saved_bytes; -} -simdutf_warn_unused result implementation::convert_utf32_to_utf8_with_errors( - const char32_t *buf, size_t len, char *utf8_output) const noexcept { - // ret.first.count is always the position in the buffer, not the number of - // code units written even if finished - std::pair ret = - icelake::avx512_convert_utf32_to_utf8_with_errors(buf, len, utf8_output); - if (ret.first.count != len) { - result scalar_res = scalar::utf32_to_utf8::convert_with_errors( - buf + ret.first.count, len - ret.first.count, ret.second); - if (scalar_res.error) { - scalar_res.count += ret.first.count; - return scalar_res; - } else { - ret.second += scalar_res.count; + vbool8_t m4 = __riscv_vmsgtu_vx_u32m4_b8(v, 0x10000 - 1, vl); + long first = __riscv_vfirst_m_b8(m4, vl); + size_t tail = vl - first; + vl = first < 0 ? vl : first; + + if (vl > 0) { /* 1/2/3 byte utf8 */ + /* vn: [aaaabbbb|bbcccccc] + * v1: [0bcccccc| ] vsll 8 + * v1: [10cccccc| ] vsll 8 & 0b00111111 | 0b10000000 + * v2: [ |110bbbbb] vsrl 6 & 0b00111111 | 0b11000000 + * v2: [ |10bbbbbb] vsrl 6 & 0b00111111 | 0b10000000 + * v3: [ |1110aaaa] vsrl 12 | 0b11100000 + * 1: [00000000|0bcccccc|00000000|00000000] => [0bcccccc] + * 2: [00000000|10cccccc|110bbbbb|00000000] => [110bbbbb] [10cccccc] + * 3: [00000000|10cccccc|10bbbbbb|1110aaaa] => [1110aaaa] [10bbbbbb] + * [10cccccc] + */ + vuint16m2_t v1, v2, v3, v12; + v1 = __riscv_vor_vx_u16m2_mu( + m234, vn, __riscv_vand_vx_u16m2(vn, 0b00111111, vl), 0b10000000, vl); + v1 = __riscv_vsll_vx_u16m2(v1, 8, vl); + + v2 = __riscv_vor_vx_u16m2( + __riscv_vand_vx_u16m2(__riscv_vsrl_vx_u16m2(vn, 6, vl), 0b00111111, + vl), + 0b10000000, vl); + v2 = __riscv_vor_vx_u16m2_mu(__riscv_vmnot_m_b8(m34, vl), v2, v2, + 0b01000000, vl); + v3 = __riscv_vor_vx_u16m2(__riscv_vsrl_vx_u16m2(vn, 12, vl), 0b11100000, + vl); + v12 = __riscv_vor_vv_u16m2_mu(m234, v1, v1, v2, vl); + + vuint32m4_t w12 = __riscv_vwmulu_vx_u32m4(v12, 1 << 8, vl); + vuint32m4_t w123 = __riscv_vwaddu_wv_u32m4_mu(m34, w12, w12, v3, vl); + vuint8m4_t vout = __riscv_vreinterpret_v_u32m4_u8m4(w123); + + vbool2_t mcomp = __riscv_vmor_mm_b2( + m4mulp2, __riscv_vmsne_vx_u8m4_b2(vout, 0, vl * 4), vl * 4); + vlOut = __riscv_vcpop_m_b2(mcomp, vl * 4); + + vout = __riscv_vcompress_vm_u8m4(vout, mcomp, vl * 4); + __riscv_vse8_v_u8m4((uint8_t *)dst, vout, vlOut); + + n -= vl, src += vl, dst += vlOut; } + + if (tail) + while (n) { + uint32_t word = src[0]; + if (word < 0x10000) + break; + if (word > 0x10FFFF) + return result(error_code::TOO_LARGE, src - srcBeg); + *dst++ = (uint8_t)((word >> 18) | 0b11110000); + *dst++ = (uint8_t)(((word >> 12) & 0b111111) | 0b10000000); + *dst++ = (uint8_t)(((word >> 6) & 0b111111) | 0b10000000); + *dst++ = (uint8_t)((word & 0b111111) | 0b10000000); + ++src; + --n; + } } - ret.first.count = - ret.second - - utf8_output; // Set count to the number of 8-bit code units written - return ret.first; -} -simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf8( - const char32_t *buf, size_t len, char *utf8_output) const noexcept { - return convert_utf32_to_utf8(buf, len, utf8_output); + return result(error_code::SUCCESS, dst - dstBeg); } -simdutf_warn_unused size_t implementation::convert_utf32_to_utf16le( - const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { - std::pair ret = - avx512_convert_utf32_to_utf16(buf, len, utf16_output); - if (ret.first == nullptr) { - return 0; - } - size_t saved_bytes = ret.second - utf16_output; - if (ret.first != buf + len) { - const size_t scalar_saved_bytes = - scalar::utf32_to_utf16::convert( - ret.first, len - (ret.first - buf), ret.second); - if (scalar_saved_bytes == 0) { - return 0; - } - saved_bytes += scalar_saved_bytes; - } - return saved_bytes; +simdutf_warn_unused size_t implementation::convert_utf32_to_utf8( + const char32_t *src, size_t len, char *dst) const noexcept { + result res = convert_utf32_to_utf8_with_errors(src, len, dst); + return res.error == error_code::SUCCESS ? res.count : 0; } -simdutf_warn_unused size_t implementation::convert_utf32_to_utf16be( - const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { - std::pair ret = - avx512_convert_utf32_to_utf16(buf, len, utf16_output); - if (ret.first == nullptr) { - return 0; - } - size_t saved_bytes = ret.second - utf16_output; - if (ret.first != buf + len) { - const size_t scalar_saved_bytes = - scalar::utf32_to_utf16::convert( - ret.first, len - (ret.first - buf), ret.second); - if (scalar_saved_bytes == 0) { - return 0; - } - saved_bytes += scalar_saved_bytes; - } - return saved_bytes; +simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf8( + const char32_t *src, size_t len, char *dst) const noexcept { + return convert_utf32_to_utf8(src, len, dst); } -simdutf_warn_unused result implementation::convert_utf32_to_utf16le_with_errors( - const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { - // ret.first.count is always the position in the buffer, not the number of - // code units written even if finished - std::pair ret = - avx512_convert_utf32_to_utf16_with_errors( - buf, len, utf16_output); - if (ret.first.count != len) { - result scalar_res = - scalar::utf32_to_utf16::convert_with_errors( - buf + ret.first.count, len - ret.first.count, ret.second); - if (scalar_res.error) { - scalar_res.count += ret.first.count; - return scalar_res; - } else { - ret.second += scalar_res.count; +template +simdutf_really_inline static result +rvv_convert_utf32_to_utf16_with_errors(const char32_t *src, size_t len, + char16_t *dst) { + size_t vl8m2 = __riscv_vsetvlmax_e8m2(); + vbool4_t m4even = __riscv_vmseq_vx_u8m2_b4( + __riscv_vand_vx_u8m2(__riscv_vid_v_u8m2(vl8m2), 1, vl8m2), 0, vl8m2); + const char16_t *dstBeg = dst; + const char32_t *srcBeg = src; + for (size_t vl, vlOut; len > 0; len -= vl, src += vl, dst += vlOut) { + vl = __riscv_vsetvl_e32m4(len); + vuint32m4_t v = __riscv_vle32_v_u32m4((uint32_t *)src, vl); + vuint32m4_t off = __riscv_vadd_vx_u32m4(v, 0xFFFF2000, vl); + long idx1 = + __riscv_vfirst_m_b8(__riscv_vmsgtu_vx_u32m4_b8(v, 0x10FFFF, vl), vl); + long idx2 = __riscv_vfirst_m_b8( + __riscv_vmsgtu_vx_u32m4_b8(off, 0xFFFFF7FF, vl), vl); + if (idx1 >= 0 && idx2 >= 0) { + if (idx1 <= idx2) + return result(error_code::TOO_LARGE, src - srcBeg + idx1); + return result(error_code::SURROGATE, src - srcBeg + idx2); + } + if (idx1 >= 0) + return result(error_code::TOO_LARGE, src - srcBeg + idx1); + if (idx2 >= 0) + return result(error_code::SURROGATE, src - srcBeg + idx2); + long idx = + __riscv_vfirst_m_b8(__riscv_vmsgtu_vx_u32m4_b8(v, 0xFFFF, vl), vl); + if (idx < 0) { + vlOut = vl; + vuint16m2_t n = + simdutf_byteflip(__riscv_vncvt_x_x_w_u16m2(v, vlOut), vlOut); + __riscv_vse16_v_u16m2((uint16_t *)dst, n, vlOut); + continue; } + vlOut = rvv_utf32_store_utf16_m4((uint16_t *)dst, v, vl, m4even); } - ret.first.count = - ret.second - - utf16_output; // Set count to the number of 8-bit code units written - return ret.first; + return result(error_code::SUCCESS, dst - dstBeg); } -simdutf_warn_unused result implementation::convert_utf32_to_utf16be_with_errors( - const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { - // ret.first.count is always the position in the buffer, not the number of - // code units written even if finished - std::pair ret = - avx512_convert_utf32_to_utf16_with_errors(buf, len, - utf16_output); - if (ret.first.count != len) { - result scalar_res = - scalar::utf32_to_utf16::convert_with_errors( - buf + ret.first.count, len - ret.first.count, ret.second); - if (scalar_res.error) { - scalar_res.count += ret.first.count; - return scalar_res; - } else { - ret.second += scalar_res.count; - } - } - ret.first.count = - ret.second - - utf16_output; // Set count to the number of 8-bit code units written - return ret.first; +simdutf_warn_unused size_t implementation::convert_utf32_to_utf16le( + const char32_t *src, size_t len, char16_t *dst) const noexcept { + result res = convert_utf32_to_utf16le_with_errors(src, len, dst); + return res.error == error_code::SUCCESS ? res.count : 0; } -simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf16le( - const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { - return convert_utf32_to_utf16le(buf, len, utf16_output); +simdutf_warn_unused size_t implementation::convert_utf32_to_utf16be( + const char32_t *src, size_t len, char16_t *dst) const noexcept { + result res = convert_utf32_to_utf16be_with_errors(src, len, dst); + return res.error == error_code::SUCCESS ? res.count : 0; } -simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf16be( - const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { - return convert_utf32_to_utf16be(buf, len, utf16_output); +simdutf_warn_unused result implementation::convert_utf32_to_utf16le_with_errors( + const char32_t *src, size_t len, char16_t *dst) const noexcept { + return rvv_convert_utf32_to_utf16_with_errors( + src, len, dst); } -simdutf_warn_unused size_t implementation::convert_utf16le_to_utf32( - const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { - std::tuple ret = - icelake::convert_utf16_to_utf32(buf, len, - utf32_output); - if (!std::get<2>(ret)) { - return 0; - } - size_t saved_bytes = std::get<1>(ret) - utf32_output; - if (std::get<0>(ret) != buf + len) { - const size_t scalar_saved_bytes = - scalar::utf16_to_utf32::convert( - std::get<0>(ret), len - (std::get<0>(ret) - buf), std::get<1>(ret)); - if (scalar_saved_bytes == 0) { - return 0; - } - saved_bytes += scalar_saved_bytes; - } - return saved_bytes; +simdutf_warn_unused result implementation::convert_utf32_to_utf16be_with_errors( + const char32_t *src, size_t len, char16_t *dst) const noexcept { + if (supports_zvbb()) + return rvv_convert_utf32_to_utf16_with_errors( + src, len, dst); + else + return rvv_convert_utf32_to_utf16_with_errors(src, len, + dst); } -simdutf_warn_unused size_t implementation::convert_utf16be_to_utf32( - const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { - std::tuple ret = - icelake::convert_utf16_to_utf32(buf, len, utf32_output); - if (!std::get<2>(ret)) { - return 0; - } - size_t saved_bytes = std::get<1>(ret) - utf32_output; - if (std::get<0>(ret) != buf + len) { - const size_t scalar_saved_bytes = - scalar::utf16_to_utf32::convert( - std::get<0>(ret), len - (std::get<0>(ret) - buf), std::get<1>(ret)); - if (scalar_saved_bytes == 0) { - return 0; +template +simdutf_really_inline static size_t +rvv_convert_valid_utf32_to_utf16(const char32_t *src, size_t len, + char16_t *dst) { + size_t vl8m2 = __riscv_vsetvlmax_e8m2(); + vbool4_t m4even = __riscv_vmseq_vx_u8m2_b4( + __riscv_vand_vx_u8m2(__riscv_vid_v_u8m2(vl8m2), 1, vl8m2), 0, vl8m2); + char16_t *dstBeg = dst; + for (size_t vl, vlOut; len > 0; len -= vl, src += vl, dst += vlOut) { + vl = __riscv_vsetvl_e32m4(len); + vuint32m4_t v = __riscv_vle32_v_u32m4((uint32_t *)src, vl); + if (__riscv_vfirst_m_b8(__riscv_vmsgtu_vx_u32m4_b8(v, 0xFFFF, vl), vl) < + 0) { + vlOut = vl; + vuint16m2_t n = + simdutf_byteflip(__riscv_vncvt_x_x_w_u16m2(v, vlOut), vlOut); + __riscv_vse16_v_u16m2((uint16_t *)dst, n, vlOut); + continue; } - saved_bytes += scalar_saved_bytes; + vlOut = rvv_utf32_store_utf16_m4((uint16_t *)dst, v, vl, m4even); } - return saved_bytes; + return dst - dstBeg; } -simdutf_warn_unused result implementation::convert_utf16le_to_utf32_with_errors( - const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { - std::tuple ret = - icelake::convert_utf16_to_utf32(buf, len, - utf32_output); - if (!std::get<2>(ret)) { - result scalar_res = - scalar::utf16_to_utf32::convert_with_errors( - std::get<0>(ret), len - (std::get<0>(ret) - buf), std::get<1>(ret)); - scalar_res.count += (std::get<0>(ret) - buf); - return scalar_res; - } - size_t saved_bytes = std::get<1>(ret) - utf32_output; - if (std::get<0>(ret) != buf + len) { - result scalar_res = - scalar::utf16_to_utf32::convert_with_errors( - std::get<0>(ret), len - (std::get<0>(ret) - buf), std::get<1>(ret)); - if (scalar_res.error) { - scalar_res.count += (std::get<0>(ret) - buf); - return scalar_res; - } else { - scalar_res.count += saved_bytes; - return scalar_res; - } - } - return simdutf::result(simdutf::SUCCESS, saved_bytes); +simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf16le( + const char32_t *src, size_t len, char16_t *dst) const noexcept { + return rvv_convert_valid_utf32_to_utf16(src, len, + dst); } -simdutf_warn_unused result implementation::convert_utf16be_to_utf32_with_errors( - const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { - std::tuple ret = - icelake::convert_utf16_to_utf32(buf, len, utf32_output); - if (!std::get<2>(ret)) { - result scalar_res = - scalar::utf16_to_utf32::convert_with_errors( - std::get<0>(ret), len - (std::get<0>(ret) - buf), std::get<1>(ret)); - scalar_res.count += (std::get<0>(ret) - buf); - return scalar_res; - } - size_t saved_bytes = std::get<1>(ret) - utf32_output; - if (std::get<0>(ret) != buf + len) { - result scalar_res = - scalar::utf16_to_utf32::convert_with_errors( - std::get<0>(ret), len - (std::get<0>(ret) - buf), std::get<1>(ret)); - if (scalar_res.error) { - scalar_res.count += (std::get<0>(ret) - buf); - return scalar_res; - } else { - scalar_res.count += saved_bytes; - return scalar_res; - } - } - return simdutf::result(simdutf::SUCCESS, saved_bytes); +simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf16be( + const char32_t *src, size_t len, char16_t *dst) const noexcept { + if (supports_zvbb()) + return rvv_convert_valid_utf32_to_utf16(src, len, + dst); + else + return rvv_convert_valid_utf32_to_utf16(src, len, dst); } +/* end file src/rvv/rvv_utf32_to.inl.cpp */ +/* begin file src/rvv/rvv_utf8_to.inl.cpp */ +template +simdutf_really_inline static size_t rvv_utf8_to_common(char const *src, + size_t len, Tdst *dst) { + static_assert(std::is_same() || + std::is_same(), + "invalid type"); + constexpr bool is16 = std::is_same(); + constexpr endianness endian = + bflip == simdutf_ByteFlip::NONE ? endianness::LITTLE : endianness::BIG; + const auto scalar = [](char const *in, size_t count, Tdst *out) { + return is16 ? scalar::utf8_to_utf16::convert(in, count, + (char16_t *)out) + : scalar::utf8_to_utf32::convert(in, count, (char32_t *)out); + }; -simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_utf32( - const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { - std::tuple ret = - icelake::convert_utf16_to_utf32(buf, len, - utf32_output); - if (!std::get<2>(ret)) { - return 0; - } - size_t saved_bytes = std::get<1>(ret) - utf32_output; - if (std::get<0>(ret) != buf + len) { - const size_t scalar_saved_bytes = - scalar::utf16_to_utf32::convert( - std::get<0>(ret), len - (std::get<0>(ret) - buf), std::get<1>(ret)); - if (scalar_saved_bytes == 0) { + if (len < 32) + return scalar(src, len, dst); + + /* validate first three bytes */ + if (validate) { + size_t idx = 3; + while (idx < len && (src[idx] >> 6) == 0b10) + ++idx; + if (idx > 3 + 3 || !scalar::utf8::validate(src, idx)) return 0; - } - saved_bytes += scalar_saved_bytes; } - return saved_bytes; -} -simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_utf32( - const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { - std::tuple ret = - icelake::convert_utf16_to_utf32(buf, len, utf32_output); - if (!std::get<2>(ret)) { - return 0; - } - size_t saved_bytes = std::get<1>(ret) - utf32_output; - if (std::get<0>(ret) != buf + len) { - const size_t scalar_saved_bytes = - scalar::utf16_to_utf32::convert( - std::get<0>(ret), len - (std::get<0>(ret) - buf), std::get<1>(ret)); - if (scalar_saved_bytes == 0) { - return 0; + size_t tail = 3; + size_t n = len - tail; + Tdst *beg = dst; + + static const uint64_t err1m[] = {0x0202020202020202, 0x4915012180808080}; + static const uint64_t err2m[] = {0xCBCBCB8B8383A3E7, 0xCBCBDBCBCBCBCBCB}; + static const uint64_t err3m[] = {0x0101010101010101, 0X01010101BABAAEE6}; + + const vuint8m1_t err1tbl = + __riscv_vreinterpret_v_u64m1_u8m1(__riscv_vle64_v_u64m1(err1m, 2)); + const vuint8m1_t err2tbl = + __riscv_vreinterpret_v_u64m1_u8m1(__riscv_vle64_v_u64m1(err2m, 2)); + const vuint8m1_t err3tbl = + __riscv_vreinterpret_v_u64m1_u8m1(__riscv_vle64_v_u64m1(err3m, 2)); + + size_t vl8m2 = __riscv_vsetvlmax_e8m2(); + vbool4_t m4even = __riscv_vmseq_vx_u8m2_b4( + __riscv_vand_vx_u8m2(__riscv_vid_v_u8m2(vl8m2), 1, vl8m2), 0, vl8m2); + + for (size_t vl, vlOut; n > 0; n -= vl, src += vl, dst += vlOut) { + vl = __riscv_vsetvl_e8m2(n); + + vuint8m2_t v0 = __riscv_vle8_v_u8m2((uint8_t const *)src, vl); + uint64_t max = __riscv_vmv_x_s_u8m1_u8( + __riscv_vredmaxu_vs_u8m2_u8m1(v0, __riscv_vmv_s_x_u8m1(0, vl), vl)); + + uint8_t next0 = src[vl + 0]; + uint8_t next1 = src[vl + 1]; + uint8_t next2 = src[vl + 2]; + + /* fast path: ASCII */ + if ((max | next0 | next1 | next2) < 0b10000000) { + vlOut = vl; + if (is16) + __riscv_vse16_v_u16m4( + (uint16_t *)dst, + simdutf_byteflip(__riscv_vzext_vf2_u16m4(v0, vlOut), vlOut), + vlOut); + else + __riscv_vse32_v_u32m8((uint32_t *)dst, + __riscv_vzext_vf4_u32m8(v0, vlOut), vlOut); + continue; } - saved_bytes += scalar_saved_bytes; - } - return saved_bytes; -} -void implementation::change_endianness_utf16(const char16_t *input, - size_t length, - char16_t *output) const noexcept { - size_t pos = 0; - const __m512i byteflip = _mm512_setr_epi64( - 0x0607040502030001, 0x0e0f0c0d0a0b0809, 0x0607040502030001, - 0x0e0f0c0d0a0b0809, 0x0607040502030001, 0x0e0f0c0d0a0b0809, - 0x0607040502030001, 0x0e0f0c0d0a0b0809); - while (pos + 32 <= length) { - __m512i utf16 = _mm512_loadu_si512((const __m512i *)(input + pos)); - utf16 = _mm512_shuffle_epi8(utf16, byteflip); - _mm512_storeu_si512(output + pos, utf16); - pos += 32; - } - if (pos < length) { - __mmask32 m((1U << (length - pos)) - 1); - __m512i utf16 = _mm512_maskz_loadu_epi16(m, (const __m512i *)(input + pos)); - utf16 = _mm512_shuffle_epi8(utf16, byteflip); - _mm512_mask_storeu_epi16(output + pos, m, utf16); - } -} + /* see "Validating UTF-8 In Less Than One Instruction Per Byte" + * https://arxiv.org/abs/2010.03090 */ + vuint8m2_t v1 = __riscv_vslide1down_vx_u8m2(v0, next0, vl); + vuint8m2_t v2 = __riscv_vslide1down_vx_u8m2(v1, next1, vl); + vuint8m2_t v3 = __riscv_vslide1down_vx_u8m2(v2, next2, vl); -simdutf_warn_unused size_t implementation::count_utf16le( - const char16_t *input, size_t length) const noexcept { - const char16_t *ptr = input; - size_t count{0}; + if (validate) { + vuint8m2_t s1 = __riscv_vreinterpret_v_u16m2_u8m2(__riscv_vsrl_vx_u16m2( + __riscv_vreinterpret_v_u8m2_u16m2(v2), 4, __riscv_vsetvlmax_e16m2())); + vuint8m2_t s3 = __riscv_vreinterpret_v_u16m2_u8m2(__riscv_vsrl_vx_u16m2( + __riscv_vreinterpret_v_u8m2_u16m2(v3), 4, __riscv_vsetvlmax_e16m2())); - if (length >= 32) { - const char16_t *end = input + length - 32; + vuint8m2_t idx2 = __riscv_vand_vx_u8m2(v2, 0xF, vl); + vuint8m2_t idx1 = __riscv_vand_vx_u8m2(s1, 0xF, vl); + vuint8m2_t idx3 = __riscv_vand_vx_u8m2(s3, 0xF, vl); - const __m512i low = _mm512_set1_epi16((uint16_t)0xdc00); - const __m512i high = _mm512_set1_epi16((uint16_t)0xdfff); + vuint8m2_t err1 = simdutf_vrgather_u8m1x2(err1tbl, idx1); + vuint8m2_t err2 = simdutf_vrgather_u8m1x2(err2tbl, idx2); + vuint8m2_t err3 = simdutf_vrgather_u8m1x2(err3tbl, idx3); + vint8m2_t errs = __riscv_vreinterpret_v_u8m2_i8m2( + __riscv_vand_vv_u8m2(__riscv_vand_vv_u8m2(err1, err2, vl), err3, vl)); - while (ptr <= end) { - __m512i utf16 = _mm512_loadu_si512((const __m512i *)ptr); - ptr += 32; - uint64_t not_high_surrogate = - static_cast(_mm512_cmpgt_epu16_mask(utf16, high) | - _mm512_cmplt_epu16_mask(utf16, low)); - count += count_ones(not_high_surrogate); + vbool4_t is_3 = __riscv_vmsgtu_vx_u8m2_b4(v1, 0b11100000 - 1, vl); + vbool4_t is_4 = __riscv_vmsgtu_vx_u8m2_b4(v0, 0b11110000 - 1, vl); + vbool4_t is_34 = __riscv_vmor_mm_b4(is_3, is_4, vl); + vbool4_t err34 = + __riscv_vmxor_mm_b4(is_34, __riscv_vmslt_vx_i8m2_b4(errs, 0, vl), vl); + vbool4_t errm = + __riscv_vmor_mm_b4(__riscv_vmsgt_vx_i8m2_b4(errs, 0, vl), err34, vl); + if (__riscv_vfirst_m_b4(errm, vl) >= 0) + return 0; } - } - return count + scalar::utf16::count_code_points( - ptr, length - (ptr - input)); -} + /* decoding */ -simdutf_warn_unused size_t implementation::count_utf16be( - const char16_t *input, size_t length) const noexcept { - const char16_t *ptr = input; - size_t count{0}; - if (length >= 32) { + /* mask of non continuation bytes */ + vbool4_t m = + __riscv_vmsgt_vx_i8m2_b4(__riscv_vreinterpret_v_u8m2_i8m2(v0), -65, vl); + vlOut = __riscv_vcpop_m_b4(m, vl); - const char16_t *end = input + length - 32; + /* extract first and second bytes */ + vuint8m2_t b1 = __riscv_vcompress_vm_u8m2(v0, m, vl); + vuint8m2_t b2 = __riscv_vcompress_vm_u8m2(v1, m, vl); - const __m512i low = _mm512_set1_epi16((uint16_t)0xdc00); - const __m512i high = _mm512_set1_epi16((uint16_t)0xdfff); + /* fast path: one and two byte */ + if (max < 0b11100000) { + b2 = __riscv_vand_vx_u8m2(b2, 0b00111111, vlOut); - const __m512i byteflip = _mm512_setr_epi64( - 0x0607040502030001, 0x0e0f0c0d0a0b0809, 0x0607040502030001, - 0x0e0f0c0d0a0b0809, 0x0607040502030001, 0x0e0f0c0d0a0b0809, - 0x0607040502030001, 0x0e0f0c0d0a0b0809); - while (ptr <= end) { - __m512i utf16 = - _mm512_shuffle_epi8(_mm512_loadu_si512((__m512i *)ptr), byteflip); - ptr += 32; - uint64_t not_high_surrogate = - static_cast(_mm512_cmpgt_epu16_mask(utf16, high) | - _mm512_cmplt_epu16_mask(utf16, low)); - count += count_ones(not_high_surrogate); + vbool4_t m1 = __riscv_vmsgtu_vx_u8m2_b4(b1, 0b10111111, vlOut); + b1 = __riscv_vand_vx_u8m2_mu(m1, b1, b1, 63, vlOut); + + vuint16m4_t b12 = __riscv_vwmulu_vv_u16m4( + b1, + __riscv_vmerge_vxm_u8m2(__riscv_vmv_v_x_u8m2(1, vlOut), 1 << 6, m1, + vlOut), + vlOut); + b12 = __riscv_vwaddu_wv_u16m4_mu(m1, b12, b12, b2, vlOut); + if (is16) + __riscv_vse16_v_u16m4((uint16_t *)dst, + simdutf_byteflip(b12, vlOut), vlOut); + else + __riscv_vse32_v_u32m8((uint32_t *)dst, + __riscv_vzext_vf2_u32m8(b12, vlOut), vlOut); + continue; } - } - return count + scalar::utf16::count_code_points( - ptr, length - (ptr - input)); -} + /* fast path: one, two and three byte */ + if (max < 0b11110000) { + vuint8m2_t b3 = __riscv_vcompress_vm_u8m2(v2, m, vl); -simdutf_warn_unused size_t -implementation::count_utf8(const char *input, size_t length) const noexcept { - const uint8_t *str = reinterpret_cast(input); - size_t answer = - length / sizeof(__m512i) * - sizeof(__m512i); // Number of 512-bit chunks that fits into the length. - size_t i = 0; - __m512i unrolled_popcount{0}; + b2 = __riscv_vand_vx_u8m2(b2, 0b00111111, vlOut); + b3 = __riscv_vand_vx_u8m2(b3, 0b00111111, vlOut); - const __m512i continuation = _mm512_set1_epi8(char(0b10111111)); + vbool4_t m1 = __riscv_vmsgtu_vx_u8m2_b4(b1, 0b10111111, vlOut); + vbool4_t m3 = __riscv_vmsgtu_vx_u8m2_b4(b1, 0b11011111, vlOut); - while (i + sizeof(__m512i) <= length) { - size_t iterations = (length - i) / sizeof(__m512i); + vuint8m2_t t1 = __riscv_vand_vx_u8m2_mu(m1, b1, b1, 63, vlOut); + b1 = __riscv_vand_vx_u8m2_mu(m3, t1, b1, 15, vlOut); - size_t max_i = i + iterations * sizeof(__m512i) - sizeof(__m512i); - for (; i + 8 * sizeof(__m512i) <= max_i; i += 8 * sizeof(__m512i)) { - __m512i input1 = _mm512_loadu_si512((const __m512i *)(str + i)); - __m512i input2 = - _mm512_loadu_si512((const __m512i *)(str + i + sizeof(__m512i))); - __m512i input3 = - _mm512_loadu_si512((const __m512i *)(str + i + 2 * sizeof(__m512i))); - __m512i input4 = - _mm512_loadu_si512((const __m512i *)(str + i + 3 * sizeof(__m512i))); - __m512i input5 = - _mm512_loadu_si512((const __m512i *)(str + i + 4 * sizeof(__m512i))); - __m512i input6 = - _mm512_loadu_si512((const __m512i *)(str + i + 5 * sizeof(__m512i))); - __m512i input7 = - _mm512_loadu_si512((const __m512i *)(str + i + 6 * sizeof(__m512i))); - __m512i input8 = - _mm512_loadu_si512((const __m512i *)(str + i + 7 * sizeof(__m512i))); + vuint16m4_t b12 = __riscv_vwmulu_vv_u16m4( + b1, + __riscv_vmerge_vxm_u8m2(__riscv_vmv_v_x_u8m2(1, vlOut), 1 << 6, m1, + vlOut), + vlOut); + b12 = __riscv_vwaddu_wv_u16m4_mu(m1, b12, b12, b2, vlOut); + vuint16m4_t b123 = __riscv_vwaddu_wv_u16m4_mu( + m3, b12, __riscv_vsll_vx_u16m4_mu(m3, b12, b12, 6, vlOut), b3, vlOut); + if (is16) + __riscv_vse16_v_u16m4((uint16_t *)dst, + simdutf_byteflip(b123, vlOut), vlOut); + else + __riscv_vse32_v_u32m8((uint32_t *)dst, + __riscv_vzext_vf2_u32m8(b123, vlOut), vlOut); + continue; + } - __mmask64 mask1 = _mm512_cmple_epi8_mask(input1, continuation); - __mmask64 mask2 = _mm512_cmple_epi8_mask(input2, continuation); - __mmask64 mask3 = _mm512_cmple_epi8_mask(input3, continuation); - __mmask64 mask4 = _mm512_cmple_epi8_mask(input4, continuation); - __mmask64 mask5 = _mm512_cmple_epi8_mask(input5, continuation); - __mmask64 mask6 = _mm512_cmple_epi8_mask(input6, continuation); - __mmask64 mask7 = _mm512_cmple_epi8_mask(input7, continuation); - __mmask64 mask8 = _mm512_cmple_epi8_mask(input8, continuation); + /* extract third and fourth bytes */ + vuint8m2_t b3 = __riscv_vcompress_vm_u8m2(v2, m, vl); + vuint8m2_t b4 = __riscv_vcompress_vm_u8m2(v3, m, vl); + + /* remove prefix from leading bytes + * + * We could also use vrgather here, but it increases register pressure, + * and its performance varies widely on current platforms. It might be + * worth reconsidering, though, once there is more hardware available. + * Same goes for the __riscv_vsrl_vv_u32m4 correction step. + * + * We shift left and then right by the number of bytes in the prefix, + * which can be calculated as follows: + * x max(x-10, 0) + * 0xxx -> 0000-0111 -> sift by 0 or 1 -> 0 + * 10xx -> 1000-1011 -> don't care + * 110x -> 1100,1101 -> sift by 3 -> 2,3 + * 1110 -> 1110 -> sift by 4 -> 4 + * 1111 -> 1111 -> sift by 5 -> 5 + * + * vssubu.vx v, 10, (max(x-10, 0)) almost gives us what we want, we + * just need to manually detect and handle the one special case: + */ +#define SIMDUTF_RVV_UTF8_TO_COMMON_M1(idx) \ + vuint8m1_t c1 = __riscv_vget_v_u8m2_u8m1(b1, idx); \ + vuint8m1_t c2 = __riscv_vget_v_u8m2_u8m1(b2, idx); \ + vuint8m1_t c3 = __riscv_vget_v_u8m2_u8m1(b3, idx); \ + vuint8m1_t c4 = __riscv_vget_v_u8m2_u8m1(b4, idx); \ + /* remove prefix from trailing bytes */ \ + c2 = __riscv_vand_vx_u8m1(c2, 0b00111111, vlOut); \ + c3 = __riscv_vand_vx_u8m1(c3, 0b00111111, vlOut); \ + c4 = __riscv_vand_vx_u8m1(c4, 0b00111111, vlOut); \ + vuint8m1_t shift = __riscv_vsrl_vx_u8m1(c1, 4, vlOut); \ + shift = __riscv_vmerge_vxm_u8m1(__riscv_vssubu_vx_u8m1(shift, 10, vlOut), 3, \ + __riscv_vmseq_vx_u8m1_b8(shift, 12, vlOut), \ + vlOut); \ + c1 = __riscv_vsll_vv_u8m1(c1, shift, vlOut); \ + c1 = __riscv_vsrl_vv_u8m1(c1, shift, vlOut); \ + /* unconditionally widen and combine to c1234 */ \ + vuint16m2_t c34 = __riscv_vwaddu_wv_u16m2( \ + __riscv_vwmulu_vx_u16m2(c3, 1 << 6, vlOut), c4, vlOut); \ + vuint16m2_t c12 = __riscv_vwaddu_wv_u16m2( \ + __riscv_vwmulu_vx_u16m2(c1, 1 << 6, vlOut), c2, vlOut); \ + vuint32m4_t c1234 = __riscv_vwaddu_wv_u32m4( \ + __riscv_vwmulu_vx_u32m4(c12, 1 << 12, vlOut), c34, vlOut); \ + /* derive required right-shift amount from `shift` to reduce \ + * c1234 to the required number of bytes */ \ + c1234 = __riscv_vsrl_vv_u32m4( \ + c1234, \ + __riscv_vzext_vf4_u32m4( \ + __riscv_vmul_vx_u8m1( \ + __riscv_vrsub_vx_u8m1(__riscv_vssubu_vx_u8m1(shift, 2, vlOut), \ + 3, vlOut), \ + 6, vlOut), \ + vlOut), \ + vlOut); \ + /* store result in desired format */ \ + if (is16) \ + vlDst = rvv_utf32_store_utf16_m4((uint16_t *)dst, c1234, vlOut, \ + m4even); \ + else \ + vlDst = vlOut, __riscv_vse32_v_u32m4((uint32_t *)dst, c1234, vlOut); - __m512i mask_register = _mm512_set_epi64(mask8, mask7, mask6, mask5, - mask4, mask3, mask2, mask1); + /* Unrolling this manually reduces register pressure and allows + * us to terminate early. */ + { + size_t vlOutm2 = vlOut, vlDst; + vlOut = __riscv_vsetvl_e8m1(vlOut); + SIMDUTF_RVV_UTF8_TO_COMMON_M1(0) + if (vlOutm2 == vlOut) { + vlOut = vlDst; + continue; + } - unrolled_popcount = _mm512_add_epi64(unrolled_popcount, - _mm512_popcnt_epi64(mask_register)); + dst += vlDst; + vlOut = vlOutm2 - vlOut; } - - for (; i <= max_i; i += sizeof(__m512i)) { - __m512i more_input = _mm512_loadu_si512((const __m512i *)(str + i)); - uint64_t continuation_bitmask = static_cast( - _mm512_cmple_epi8_mask(more_input, continuation)); - answer -= count_ones(continuation_bitmask); + { + size_t vlDst; + SIMDUTF_RVV_UTF8_TO_COMMON_M1(1) + vlOut = vlDst; } - } - - __m256i first_half = _mm512_extracti64x4_epi64(unrolled_popcount, 0); - __m256i second_half = _mm512_extracti64x4_epi64(unrolled_popcount, 1); - answer -= (size_t)_mm256_extract_epi64(first_half, 0) + - (size_t)_mm256_extract_epi64(first_half, 1) + - (size_t)_mm256_extract_epi64(first_half, 2) + - (size_t)_mm256_extract_epi64(first_half, 3) + - (size_t)_mm256_extract_epi64(second_half, 0) + - (size_t)_mm256_extract_epi64(second_half, 1) + - (size_t)_mm256_extract_epi64(second_half, 2) + - (size_t)_mm256_extract_epi64(second_half, 3); - return answer + scalar::utf8::count_code_points( - reinterpret_cast(str + i), length - i); -} - -simdutf_warn_unused size_t implementation::latin1_length_from_utf8( - const char *buf, size_t len) const noexcept { - return count_utf8(buf, len); -} - -simdutf_warn_unused size_t -implementation::latin1_length_from_utf16(size_t length) const noexcept { - return scalar::utf16::latin1_length_from_utf16(length); -} +#undef SIMDUTF_RVV_UTF8_TO_COMMON_M1 + } -simdutf_warn_unused size_t -implementation::latin1_length_from_utf32(size_t length) const noexcept { - return scalar::utf32::latin1_length_from_utf32(length); + /* validate the last character and reparse it + tail */ + if (len > tail) { + if ((src[0] >> 6) == 0b10) + --dst; + while ((src[0] >> 6) == 0b10 && tail < len) + --src, ++tail; + if (is16) { + /* go back one more, when on high surrogate */ + if (simdutf_byteflip((uint16_t)dst[-1]) >= 0xD800 && + simdutf_byteflip((uint16_t)dst[-1]) <= 0xDBFF) + --dst; + } + } + size_t ret = scalar(src, tail, dst); + if (ret == 0) + return 0; + return (size_t)(dst - beg) + ret; } -simdutf_warn_unused size_t implementation::utf8_length_from_utf16le( - const char16_t *input, size_t length) const noexcept { - const char16_t *ptr = input; - size_t count{0}; - if (length >= 32) { - const char16_t *end = input + length - 32; - - const __m512i v_007f = _mm512_set1_epi16((uint16_t)0x007f); - const __m512i v_07ff = _mm512_set1_epi16((uint16_t)0x07ff); - const __m512i v_dfff = _mm512_set1_epi16((uint16_t)0xdfff); - const __m512i v_d800 = _mm512_set1_epi16((uint16_t)0xd800); +simdutf_warn_unused size_t implementation::convert_utf8_to_latin1( + const char *src, size_t len, char *dst) const noexcept { + const char *beg = dst; + uint8_t last = 0; + for (size_t vl, vlOut; len > 0; + len -= vl, src += vl, dst += vlOut, last = src[-1]) { + vl = __riscv_vsetvl_e8m2(len); + vuint8m2_t v1 = __riscv_vle8_v_u8m2((uint8_t *)src, vl); + // check which bytes are ASCII + vbool4_t ascii = __riscv_vmsltu_vx_u8m2_b4(v1, 0b10000000, vl); + // count ASCII bytes + vlOut = __riscv_vcpop_m_b4(ascii, vl); + // The original code would only enter the next block after this check: + // vbool4_t m = __riscv_vmsltu_vx_u8m2_b4(v1, 0b11000000, vl); + // vlOut = __riscv_vcpop_m_b4(m, vl); + // if (vlOut != vl || last > 0b01111111) {...}q + // So that everything is ASCII or continuation bytes, we just proceeded + // without any processing, going straight to __riscv_vse8_v_u8m2. + // But you need the __riscv_vslide1up_vx_u8m2 whenever there is a non-ASCII + // byte. + if (vlOut != vl) { // If not pure ASCII + // Non-ASCII characters + // We now want to mark the ascii and continuation bytes + vbool4_t m = __riscv_vmsltu_vx_u8m2_b4(v1, 0b11000000, vl); + // We count them, that's our new vlOut (output vector length) + vlOut = __riscv_vcpop_m_b4(m, vl); - while (ptr <= end) { - __m512i utf16 = _mm512_loadu_si512((const __m512i *)ptr); - ptr += 32; - __mmask32 ascii_bitmask = _mm512_cmple_epu16_mask(utf16, v_007f); - __mmask32 two_bytes_bitmask = - _mm512_mask_cmple_epu16_mask(~ascii_bitmask, utf16, v_07ff); - __mmask32 not_one_two_bytes = ~(ascii_bitmask | two_bytes_bitmask); - __mmask32 surrogates_bitmask = - _mm512_mask_cmple_epu16_mask(not_one_two_bytes, utf16, v_dfff) & - _mm512_mask_cmpge_epu16_mask(not_one_two_bytes, utf16, v_d800); + vuint8m2_t v0 = __riscv_vslide1up_vx_u8m2(v1, last, vl); - size_t ascii_count = count_ones(ascii_bitmask); - size_t two_bytes_count = count_ones(two_bytes_bitmask); - size_t surrogate_bytes_count = count_ones(surrogates_bitmask); - size_t three_bytes_count = - 32 - ascii_count - two_bytes_count - surrogate_bytes_count; + vbool4_t leading0 = __riscv_vmsgtu_vx_u8m2_b4(v0, 0b10111111, vl); + vbool4_t trailing1 = __riscv_vmslt_vx_i8m2_b4( + __riscv_vreinterpret_v_u8m2_i8m2(v1), (uint8_t)0b11000000, vl); + // -62 i 0b11000010, so we check whether any of v0 is too big + vbool4_t tobig = __riscv_vmand_mm_b4( + leading0, + __riscv_vmsgtu_vx_u8m2_b4(__riscv_vxor_vx_u8m2(v0, (uint8_t)-62, vl), + 1, vl), + vl); + if (__riscv_vfirst_m_b4( + __riscv_vmor_mm_b4( + tobig, __riscv_vmxor_mm_b4(leading0, trailing1, vl), vl), + vl) >= 0) + return 0; - count += ascii_count + 2 * two_bytes_count + 3 * three_bytes_count + - 2 * surrogate_bytes_count; + v1 = __riscv_vor_vx_u8m2_mu(__riscv_vmseq_vx_u8m2_b4(v0, 0b11000011, vl), + v1, v1, 0b01000000, vl); + v1 = __riscv_vcompress_vm_u8m2(v1, m, vl); + } else if (last >= 0b11000000) { // If last byte is a leading byte and we + // got only ASCII, error! + return 0; } + __riscv_vse8_v_u8m2((uint8_t *)dst, v1, vlOut); } - - return count + scalar::utf16::utf8_length_from_utf16( - ptr, length - (ptr - input)); + if (last > 0b10111111) + return 0; + return dst - beg; } -simdutf_warn_unused size_t implementation::utf8_length_from_utf16be( - const char16_t *input, size_t length) const noexcept { - const char16_t *ptr = input; - size_t count{0}; - - if (length >= 32) { - const char16_t *end = input + length - 32; - - const __m512i v_007f = _mm512_set1_epi16((uint16_t)0x007f); - const __m512i v_07ff = _mm512_set1_epi16((uint16_t)0x07ff); - const __m512i v_dfff = _mm512_set1_epi16((uint16_t)0xdfff); - const __m512i v_d800 = _mm512_set1_epi16((uint16_t)0xd800); - - const __m512i byteflip = _mm512_setr_epi64( - 0x0607040502030001, 0x0e0f0c0d0a0b0809, 0x0607040502030001, - 0x0e0f0c0d0a0b0809, 0x0607040502030001, 0x0e0f0c0d0a0b0809, - 0x0607040502030001, 0x0e0f0c0d0a0b0809); - while (ptr <= end) { - __m512i utf16 = _mm512_loadu_si512((const __m512i *)ptr); - utf16 = _mm512_shuffle_epi8(utf16, byteflip); - ptr += 32; - __mmask32 ascii_bitmask = _mm512_cmple_epu16_mask(utf16, v_007f); - __mmask32 two_bytes_bitmask = - _mm512_mask_cmple_epu16_mask(~ascii_bitmask, utf16, v_07ff); - __mmask32 not_one_two_bytes = ~(ascii_bitmask | two_bytes_bitmask); - __mmask32 surrogates_bitmask = - _mm512_mask_cmple_epu16_mask(not_one_two_bytes, utf16, v_dfff) & - _mm512_mask_cmpge_epu16_mask(not_one_two_bytes, utf16, v_d800); +simdutf_warn_unused result implementation::convert_utf8_to_latin1_with_errors( + const char *src, size_t len, char *dst) const noexcept { + size_t res = convert_utf8_to_latin1(src, len, dst); + if (res) + return result(error_code::SUCCESS, res); + return scalar::utf8_to_latin1::convert_with_errors(src, len, dst); +} - size_t ascii_count = count_ones(ascii_bitmask); - size_t two_bytes_count = count_ones(two_bytes_bitmask); - size_t surrogate_bytes_count = count_ones(surrogates_bitmask); - size_t three_bytes_count = - 32 - ascii_count - two_bytes_count - surrogate_bytes_count; - count += ascii_count + 2 * two_bytes_count + 3 * three_bytes_count + - 2 * surrogate_bytes_count; +simdutf_warn_unused size_t implementation::convert_valid_utf8_to_latin1( + const char *src, size_t len, char *dst) const noexcept { + const char *beg = dst; + uint8_t last = 0; + for (size_t vl, vlOut; len > 0; + len -= vl, src += vl, dst += vlOut, last = src[-1]) { + vl = __riscv_vsetvl_e8m2(len); + vuint8m2_t v1 = __riscv_vle8_v_u8m2((uint8_t *)src, vl); + vbool4_t ascii = __riscv_vmsltu_vx_u8m2_b4(v1, 0b10000000, vl); + vlOut = __riscv_vcpop_m_b4(ascii, vl); + if (vlOut != vl) { // If not pure ASCII + vbool4_t m = __riscv_vmsltu_vx_u8m2_b4(v1, 0b11000000, vl); + vlOut = __riscv_vcpop_m_b4(m, vl); + vuint8m2_t v0 = __riscv_vslide1up_vx_u8m2(v1, last, vl); + v1 = __riscv_vor_vx_u8m2_mu(__riscv_vmseq_vx_u8m2_b4(v0, 0b11000011, vl), + v1, v1, 0b01000000, vl); + v1 = __riscv_vcompress_vm_u8m2(v1, m, vl); } + __riscv_vse8_v_u8m2((uint8_t *)dst, v1, vlOut); } - - return count + scalar::utf16::utf8_length_from_utf16( - ptr, length - (ptr - input)); + return dst - beg; } -simdutf_warn_unused size_t implementation::utf32_length_from_utf16le( - const char16_t *input, size_t length) const noexcept { - return implementation::count_utf16le(input, length); +simdutf_warn_unused size_t implementation::convert_utf8_to_utf16le( + const char *src, size_t len, char16_t *dst) const noexcept { + return rvv_utf8_to_common(src, len, + (uint16_t *)dst); } -simdutf_warn_unused size_t implementation::utf32_length_from_utf16be( - const char16_t *input, size_t length) const noexcept { - return implementation::count_utf16be(input, length); +simdutf_warn_unused size_t implementation::convert_utf8_to_utf16be( + const char *src, size_t len, char16_t *dst) const noexcept { + if (supports_zvbb()) + return rvv_utf8_to_common( + src, len, (uint16_t *)dst); + else + return rvv_utf8_to_common(src, len, + (uint16_t *)dst); } -simdutf_warn_unused size_t -implementation::utf16_length_from_latin1(size_t length) const noexcept { - return scalar::latin1::utf16_length_from_latin1(length); +simdutf_warn_unused result implementation::convert_utf8_to_utf16le_with_errors( + const char *src, size_t len, char16_t *dst) const noexcept { + size_t res = convert_utf8_to_utf16le(src, len, dst); + if (res) + return result(error_code::SUCCESS, res); + return scalar::utf8_to_utf16::convert_with_errors( + src, len, dst); } -simdutf_warn_unused size_t -implementation::utf32_length_from_latin1(size_t length) const noexcept { - return scalar::latin1::utf32_length_from_latin1(length); +simdutf_warn_unused result implementation::convert_utf8_to_utf16be_with_errors( + const char *src, size_t len, char16_t *dst) const noexcept { + size_t res = convert_utf8_to_utf16be(src, len, dst); + if (res) + return result(error_code::SUCCESS, res); + return scalar::utf8_to_utf16::convert_with_errors(src, len, + dst); } -simdutf_warn_unused size_t implementation::utf8_length_from_latin1( - const char *input, size_t length) const noexcept { - const uint8_t *str = reinterpret_cast(input); - size_t answer = length / sizeof(__m512i) * sizeof(__m512i); - size_t i = 0; - if (answer >= 2048) { // long strings optimization - unsigned char v_0xFF = 0xff; - __m512i eight_64bits = _mm512_setzero_si512(); - while (i + sizeof(__m512i) <= length) { - __m512i runner = _mm512_setzero_si512(); - size_t iterations = (length - i) / sizeof(__m512i); - if (iterations > 255) { - iterations = 255; - } - size_t max_i = i + iterations * sizeof(__m512i) - sizeof(__m512i); - for (; i + 4 * sizeof(__m512i) <= max_i; i += 4 * sizeof(__m512i)) { - // Load four __m512i vectors - __m512i input1 = _mm512_loadu_si512((const __m512i *)(str + i)); - __m512i input2 = - _mm512_loadu_si512((const __m512i *)(str + i + sizeof(__m512i))); - __m512i input3 = _mm512_loadu_si512( - (const __m512i *)(str + i + 2 * sizeof(__m512i))); - __m512i input4 = _mm512_loadu_si512( - (const __m512i *)(str + i + 3 * sizeof(__m512i))); - - // Generate four masks - __mmask64 mask1 = - _mm512_cmpgt_epi8_mask(_mm512_setzero_si512(), input1); - __mmask64 mask2 = - _mm512_cmpgt_epi8_mask(_mm512_setzero_si512(), input2); - __mmask64 mask3 = - _mm512_cmpgt_epi8_mask(_mm512_setzero_si512(), input3); - __mmask64 mask4 = - _mm512_cmpgt_epi8_mask(_mm512_setzero_si512(), input4); - // Apply the masks and subtract from the runner - __m512i not_ascii1 = - _mm512_mask_set1_epi8(_mm512_setzero_si512(), mask1, v_0xFF); - __m512i not_ascii2 = - _mm512_mask_set1_epi8(_mm512_setzero_si512(), mask2, v_0xFF); - __m512i not_ascii3 = - _mm512_mask_set1_epi8(_mm512_setzero_si512(), mask3, v_0xFF); - __m512i not_ascii4 = - _mm512_mask_set1_epi8(_mm512_setzero_si512(), mask4, v_0xFF); - - runner = _mm512_sub_epi8(runner, not_ascii1); - runner = _mm512_sub_epi8(runner, not_ascii2); - runner = _mm512_sub_epi8(runner, not_ascii3); - runner = _mm512_sub_epi8(runner, not_ascii4); - } - - for (; i <= max_i; i += sizeof(__m512i)) { - __m512i more_input = _mm512_loadu_si512((const __m512i *)(str + i)); - - __mmask64 mask = - _mm512_cmpgt_epi8_mask(_mm512_setzero_si512(), more_input); - __m512i not_ascii = - _mm512_mask_set1_epi8(_mm512_setzero_si512(), mask, v_0xFF); - runner = _mm512_sub_epi8(runner, not_ascii); - } - - eight_64bits = _mm512_add_epi64( - eight_64bits, _mm512_sad_epu8(runner, _mm512_setzero_si512())); - } - - __m256i first_half = _mm512_extracti64x4_epi64(eight_64bits, 0); - __m256i second_half = _mm512_extracti64x4_epi64(eight_64bits, 1); - answer += (size_t)_mm256_extract_epi64(first_half, 0) + - (size_t)_mm256_extract_epi64(first_half, 1) + - (size_t)_mm256_extract_epi64(first_half, 2) + - (size_t)_mm256_extract_epi64(first_half, 3) + - (size_t)_mm256_extract_epi64(second_half, 0) + - (size_t)_mm256_extract_epi64(second_half, 1) + - (size_t)_mm256_extract_epi64(second_half, 2) + - (size_t)_mm256_extract_epi64(second_half, 3); - } else if (answer > 0) { - for (; i + sizeof(__m512i) <= length; i += sizeof(__m512i)) { - __m512i latin = _mm512_loadu_si512((const __m512i *)(str + i)); - uint64_t non_ascii = _mm512_movepi8_mask(latin); - answer += count_ones(non_ascii); - } - } - return answer + scalar::latin1::utf8_length_from_latin1( - reinterpret_cast(str + i), length - i); +simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf16le( + const char *src, size_t len, char16_t *dst) const noexcept { + return rvv_utf8_to_common( + src, len, (uint16_t *)dst); } -simdutf_warn_unused size_t implementation::utf16_length_from_utf8( - const char *input, size_t length) const noexcept { - size_t pos = 0; - size_t count = 0; - // This algorithm could no doubt be improved! - for (; pos + 64 <= length; pos += 64) { - __m512i utf8 = _mm512_loadu_si512((const __m512i *)(input + pos)); - uint64_t utf8_continuation_mask = - _mm512_cmplt_epi8_mask(utf8, _mm512_set1_epi8(-65 + 1)); - // We count one word for anything that is not a continuation (so - // leading bytes). - count += 64 - count_ones(utf8_continuation_mask); - uint64_t utf8_4byte = - _mm512_cmpge_epu8_mask(utf8, _mm512_set1_epi8(int8_t(240))); - count += count_ones(utf8_4byte); - } - return count + - scalar::utf8::utf16_length_from_utf8(input + pos, length - pos); +simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf16be( + const char *src, size_t len, char16_t *dst) const noexcept { + if (supports_zvbb()) + return rvv_utf8_to_common( + src, len, (uint16_t *)dst); + else + return rvv_utf8_to_common( + src, len, (uint16_t *)dst); } -simdutf_warn_unused size_t implementation::utf8_length_from_utf32( - const char32_t *input, size_t length) const noexcept { - const char32_t *ptr = input; - size_t count{0}; - - if (length >= 16) { - const char32_t *end = input + length - 16; +simdutf_warn_unused size_t implementation::convert_utf8_to_utf32( + const char *src, size_t len, char32_t *dst) const noexcept { + return rvv_utf8_to_common(src, len, + (uint32_t *)dst); +} - const __m512i v_0000_007f = _mm512_set1_epi32((uint32_t)0x7f); - const __m512i v_0000_07ff = _mm512_set1_epi32((uint32_t)0x7ff); - const __m512i v_0000_ffff = _mm512_set1_epi32((uint32_t)0x0000ffff); +simdutf_warn_unused result implementation::convert_utf8_to_utf32_with_errors( + const char *src, size_t len, char32_t *dst) const noexcept { + size_t res = convert_utf8_to_utf32(src, len, dst); + if (res) + return result(error_code::SUCCESS, res); + return scalar::utf8_to_utf32::convert_with_errors(src, len, dst); +} - while (ptr <= end) { - __m512i utf32 = _mm512_loadu_si512((const __m512i *)ptr); - ptr += 16; - __mmask16 ascii_bitmask = _mm512_cmple_epu32_mask(utf32, v_0000_007f); - __mmask16 two_bytes_bitmask = _mm512_mask_cmple_epu32_mask( - _knot_mask16(ascii_bitmask), utf32, v_0000_07ff); - __mmask16 three_bytes_bitmask = _mm512_mask_cmple_epu32_mask( - _knot_mask16(_mm512_kor(ascii_bitmask, two_bytes_bitmask)), utf32, - v_0000_ffff); +simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf32( + const char *src, size_t len, char32_t *dst) const noexcept { + return rvv_utf8_to_common( + src, len, (uint32_t *)dst); +} +/* end file src/rvv/rvv_utf8_to.inl.cpp */ - size_t ascii_count = count_ones(ascii_bitmask); - size_t two_bytes_count = count_ones(two_bytes_bitmask); - size_t three_bytes_count = count_ones(three_bytes_bitmask); - size_t four_bytes_count = - 16 - ascii_count - two_bytes_count - three_bytes_count; - count += ascii_count + 2 * two_bytes_count + 3 * three_bytes_count + - 4 * four_bytes_count; - } +simdutf_warn_unused int +implementation::detect_encodings(const char *input, + size_t length) const noexcept { + // If there is a BOM, then we trust it. + auto bom_encoding = simdutf::BOM::check_bom(input, length); + if (bom_encoding != encoding_type::unspecified) + return bom_encoding; + // todo: reimplement as a one-pass algorithm. + int out = 0; + if (validate_utf8(input, length)) + out |= encoding_type::UTF8; + if (length % 2 == 0) { + if (validate_utf16(reinterpret_cast(input), length / 2)) + out |= encoding_type::UTF16_LE; + } + if (length % 4 == 0) { + if (validate_utf32(reinterpret_cast(input), length / 4)) + out |= encoding_type::UTF32_LE; } - return count + - scalar::utf32::utf8_length_from_utf32(ptr, length - (ptr - input)); + return out; } -simdutf_warn_unused size_t implementation::utf16_length_from_utf32( - const char32_t *input, size_t length) const noexcept { - const char32_t *ptr = input; - size_t count{0}; - - if (length >= 16) { - const char32_t *end = input + length - 16; - - const __m512i v_0000_ffff = _mm512_set1_epi32((uint32_t)0x0000ffff); - - while (ptr <= end) { - __m512i utf32 = _mm512_loadu_si512((const __m512i *)ptr); - ptr += 16; - __mmask16 surrogates_bitmask = - _mm512_cmpgt_epu32_mask(utf32, v_0000_ffff); - - count += 16 + count_ones(surrogates_bitmask); - } +template +simdutf_really_inline static void +rvv_change_endianness_utf16(const char16_t *src, size_t len, char16_t *dst) { + for (size_t vl; len > 0; len -= vl, src += vl, dst += vl) { + vl = __riscv_vsetvl_e16m8(len); + vuint16m8_t v = __riscv_vle16_v_u16m8((uint16_t *)src, vl); + __riscv_vse16_v_u16m8((uint16_t *)dst, simdutf_byteflip(v, vl), vl); } - - return count + - scalar::utf32::utf16_length_from_utf32(ptr, length - (ptr - input)); } -simdutf_warn_unused size_t implementation::utf32_length_from_utf8( - const char *input, size_t length) const noexcept { - return implementation::count_utf8(input, length); +void implementation::change_endianness_utf16(const char16_t *src, size_t len, + char16_t *dst) const noexcept { + if (supports_zvbb()) + return rvv_change_endianness_utf16(src, len, dst); + else + return rvv_change_endianness_utf16(src, len, dst); } simdutf_warn_unused size_t implementation::maximal_binary_length_from_base64( @@ -25294,21 +38094,92 @@ simdutf_warn_unused size_t implementation::maximal_binary_length_from_base64( simdutf_warn_unused result implementation::base64_to_binary( const char *input, size_t length, char *output, base64_options options, last_chunk_handling_options last_chunk_options) const noexcept { - return (options & base64_url) - ? compress_decode_base64(output, input, length, options, - last_chunk_options) - : compress_decode_base64(output, input, length, options, - last_chunk_options); + const bool ignore_garbage = + (options == base64_options::base64_url_accept_garbage) || + (options == base64_options::base64_default_accept_garbage); + while (length > 0 && + scalar::base64::is_ascii_white_space(input[length - 1])) { + length--; + } + size_t equallocation = + length; // location of the first padding character if any + size_t equalsigns = 0; + if (length > 0 && input[length - 1] == '=') { + equallocation = length - 1; + length -= 1; + equalsigns++; + while (length > 0 && + scalar::base64::is_ascii_white_space(input[length - 1])) { + length--; + } + if (length > 0 && input[length - 1] == '=') { + equallocation = length - 1; + equalsigns++; + length -= 1; + } + } + if (length == 0) { + if (!ignore_garbage && equalsigns > 0) { + return {INVALID_BASE64_CHARACTER, equallocation}; + } + return {SUCCESS, 0}; + } + result r = scalar::base64::base64_tail_decode( + output, input, length, equalsigns, options, last_chunk_options); + if (last_chunk_options != stop_before_partial && + r.error == error_code::SUCCESS && equalsigns > 0 && !ignore_garbage) { + // additional checks + if ((r.count % 3 == 0) || ((r.count % 3) + 1 + equalsigns != 4)) { + return {INVALID_BASE64_CHARACTER, equallocation}; + } + } + return r; } simdutf_warn_unused full_result implementation::base64_to_binary_details( const char *input, size_t length, char *output, base64_options options, last_chunk_handling_options last_chunk_options) const noexcept { - return (options & base64_url) - ? compress_decode_base64(output, input, length, options, - last_chunk_options) - : compress_decode_base64(output, input, length, options, - last_chunk_options); + const bool ignore_garbage = + (options == base64_options::base64_url_accept_garbage) || + (options == base64_options::base64_default_accept_garbage); + while (length > 0 && + scalar::base64::is_ascii_white_space(input[length - 1])) { + length--; + } + size_t equallocation = + length; // location of the first padding character if any + size_t equalsigns = 0; + if (length > 0 && input[length - 1] == '=') { + equallocation = length - 1; + length -= 1; + equalsigns++; + while (length > 0 && + scalar::base64::is_ascii_white_space(input[length - 1])) { + length--; + } + if (length > 0 && input[length - 1] == '=') { + equallocation = length - 1; + equalsigns++; + length -= 1; + } + } + if (length == 0) { + if (!ignore_garbage && equalsigns > 0) { + return {INVALID_BASE64_CHARACTER, equallocation, 0}; + } + return {SUCCESS, 0, 0}; + } + full_result r = scalar::base64::base64_tail_decode( + output, input, length, equalsigns, options, last_chunk_options); + if (last_chunk_options != stop_before_partial && + r.error == error_code::SUCCESS && equalsigns > 0 && !ignore_garbage) { + // additional checks + if ((r.output_count % 3 == 0) || + ((r.output_count % 3) + 1 + equalsigns != 4)) { + return {INVALID_BASE64_CHARACTER, equallocation, r.output_count}; + } + } + return r; } simdutf_warn_unused size_t implementation::maximal_binary_length_from_base64( @@ -25319,21 +38190,92 @@ simdutf_warn_unused size_t implementation::maximal_binary_length_from_base64( simdutf_warn_unused result implementation::base64_to_binary( const char16_t *input, size_t length, char *output, base64_options options, last_chunk_handling_options last_chunk_options) const noexcept { - return (options & base64_url) - ? compress_decode_base64(output, input, length, options, - last_chunk_options) - : compress_decode_base64(output, input, length, options, - last_chunk_options); + const bool ignore_garbage = + (options == base64_options::base64_url_accept_garbage) || + (options == base64_options::base64_default_accept_garbage); + while (length > 0 && + scalar::base64::is_ascii_white_space(input[length - 1])) { + length--; + } + size_t equallocation = + length; // location of the first padding character if any + auto equalsigns = 0; + if (length > 0 && input[length - 1] == '=') { + equallocation = length - 1; + length -= 1; + equalsigns++; + while (length > 0 && + scalar::base64::is_ascii_white_space(input[length - 1])) { + length--; + } + if (length > 0 && input[length - 1] == '=') { + equallocation = length - 1; + equalsigns++; + length -= 1; + } + } + if (length == 0) { + if (!ignore_garbage && equalsigns > 0) { + return {INVALID_BASE64_CHARACTER, equallocation}; + } + return {SUCCESS, 0}; + } + result r = scalar::base64::base64_tail_decode( + output, input, length, equalsigns, options, last_chunk_options); + if (last_chunk_options != stop_before_partial && + r.error == error_code::SUCCESS && equalsigns > 0 && !ignore_garbage) { + // additional checks + if ((r.count % 3 == 0) || ((r.count % 3) + 1 + equalsigns != 4)) { + return {INVALID_BASE64_CHARACTER, equallocation}; + } + } + return r; } simdutf_warn_unused full_result implementation::base64_to_binary_details( const char16_t *input, size_t length, char *output, base64_options options, last_chunk_handling_options last_chunk_options) const noexcept { - return (options & base64_url) - ? compress_decode_base64(output, input, length, options, - last_chunk_options) - : compress_decode_base64(output, input, length, options, - last_chunk_options); + const bool ignore_garbage = + (options == base64_options::base64_url_accept_garbage) || + (options == base64_options::base64_default_accept_garbage); + while (length > 0 && + scalar::base64::is_ascii_white_space(input[length - 1])) { + length--; + } + size_t equallocation = + length; // location of the first padding character if any + size_t equalsigns = 0; + if (length > 0 && input[length - 1] == '=') { + equallocation = length - 1; + length -= 1; + equalsigns++; + while (length > 0 && + scalar::base64::is_ascii_white_space(input[length - 1])) { + length--; + } + if (length > 0 && input[length - 1] == '=') { + equallocation = length - 1; + equalsigns++; + length -= 1; + } + } + if (length == 0) { + if (!ignore_garbage && equalsigns > 0) { + return {INVALID_BASE64_CHARACTER, equallocation, 0}; + } + return {SUCCESS, 0, 0}; + } + full_result r = scalar::base64::base64_tail_decode( + output, input, length, equalsigns, options, last_chunk_options); + if (last_chunk_options != stop_before_partial && + r.error == error_code::SUCCESS && equalsigns > 0 && !ignore_garbage) { + // additional checks + if ((r.output_count % 3 == 0) || + ((r.output_count % 3) + 1 + equalsigns != 4)) { + return {INVALID_BASE64_CHARACTER, equallocation, r.output_count}; + } + } + return r; } simdutf_warn_unused size_t implementation::base64_length_from_binary( @@ -25344,56 +38286,38 @@ simdutf_warn_unused size_t implementation::base64_length_from_binary( size_t implementation::binary_to_base64(const char *input, size_t length, char *output, base64_options options) const noexcept { - if (options & base64_url) { - return encode_base64(output, input, length, options); - } else { - return encode_base64(output, input, length, options); - } + return scalar::base64::tail_encode_base64(output, input, length, options); } - -} // namespace icelake +} // namespace rvv } // namespace simdutf -/* begin file src/simdutf/icelake/end.h */ -#if SIMDUTF_CAN_ALWAYS_RUN_ICELAKE +/* begin file src/simdutf/rvv/end.h */ +#if SIMDUTF_CAN_ALWAYS_RUN_RVV // nothing needed. #else SIMDUTF_UNTARGET_REGION #endif - -#if SIMDUTF_GCC11ORMORE // workaround for - // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105593 -SIMDUTF_POP_DISABLE_WARNINGS -#endif // end of workaround -/* end file src/simdutf/icelake/end.h */ -/* end file src/icelake/implementation.cpp */ +/* end file src/simdutf/rvv/end.h */ +/* end file src/rvv/implementation.cpp */ #endif -#if SIMDUTF_IMPLEMENTATION_HASWELL -/* begin file src/haswell/implementation.cpp */ - -/* begin file src/simdutf/haswell/begin.h */ -// redefining SIMDUTF_IMPLEMENTATION to "haswell" -// #define SIMDUTF_IMPLEMENTATION haswell +#if SIMDUTF_IMPLEMENTATION_WESTMERE +/* begin file src/westmere/implementation.cpp */ +/* begin file src/simdutf/westmere/begin.h */ +// redefining SIMDUTF_IMPLEMENTATION to "westmere" +// #define SIMDUTF_IMPLEMENTATION westmere -#if SIMDUTF_CAN_ALWAYS_RUN_HASWELL +#if SIMDUTF_CAN_ALWAYS_RUN_WESTMERE // nothing needed. #else -SIMDUTF_TARGET_HASWELL +SIMDUTF_TARGET_WESTMERE #endif - -#if SIMDUTF_GCC11ORMORE // workaround for - // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105593 -// clang-format off -SIMDUTF_DISABLE_GCC_WARNING(-Wmaybe-uninitialized) -// clang-format on -#endif // end of workaround -/* end file src/simdutf/haswell/begin.h */ +/* end file src/simdutf/westmere/begin.h */ namespace simdutf { -namespace haswell { +namespace westmere { namespace { -#ifndef SIMDUTF_HASWELL_H - #error "haswell.h must be included" +#ifndef SIMDUTF_WESTMERE_H + #error "westmere.h must be included" #endif using namespace simd; @@ -25420,13 +38344,90 @@ simdutf_really_inline simd8 must_be_2_3_continuation(const simd8 prev2, const simd8 prev3) { simd8 is_third_byte = - prev2.saturating_sub(0xe0u - 0x80); // Only 111_____ will be > 0x80 + prev2.saturating_sub(0xe0u - 0x80); // Only 111_____ will be >= 0x80 simd8 is_fourth_byte = - prev3.saturating_sub(0xf0u - 0x80); // Only 1111____ will be > 0x80 + prev3.saturating_sub(0xf0u - 0x80); // Only 1111____ will be >= 0x80 return simd8(is_third_byte | is_fourth_byte); } -/* begin file src/haswell/avx2_validate_utf16.cpp */ +/* begin file src/westmere/internal/loader.cpp */ +namespace internal { +namespace westmere { + +/* begin file src/westmere/internal/write_v_u16_11bits_to_utf8.cpp */ +/* + * reads a vector of uint16 values + * bits after 11th are ignored + * first 11 bits are encoded into utf8 + * !important! utf8_output must have at least 16 writable bytes + */ + +inline void write_v_u16_11bits_to_utf8(const __m128i v_u16, char *&utf8_output, + const __m128i one_byte_bytemask, + const uint16_t one_byte_bitmask) { + // 0b1100_0000_1000_0000 + const __m128i v_c080 = _mm_set1_epi16((int16_t)0xc080); + // 0b0001_1111_0000_0000 + const __m128i v_1f00 = _mm_set1_epi16((int16_t)0x1f00); + // 0b0000_0000_0011_1111 + const __m128i v_003f = _mm_set1_epi16((int16_t)0x003f); + + // 1. prepare 2-byte values + // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8 + // expected output : [110a|aaaa|10bb|bbbb] x 8 + + // t0 = [000a|aaaa|bbbb|bb00] + const __m128i t0 = _mm_slli_epi16(v_u16, 2); + // t1 = [000a|aaaa|0000|0000] + const __m128i t1 = _mm_and_si128(t0, v_1f00); + // t2 = [0000|0000|00bb|bbbb] + const __m128i t2 = _mm_and_si128(v_u16, v_003f); + // t3 = [000a|aaaa|00bb|bbbb] + const __m128i t3 = _mm_or_si128(t1, t2); + // t4 = [110a|aaaa|10bb|bbbb] + const __m128i t4 = _mm_or_si128(t3, v_c080); + + // 2. merge ASCII and 2-byte codewords + const __m128i utf8_unpacked = _mm_blendv_epi8(t4, v_u16, one_byte_bytemask); + + // 3. prepare bitmask for 8-bit lookup + // one_byte_bitmask = hhggffeeddccbbaa -- the bits are doubled (h - MSB, a + // - LSB) + const uint16_t m0 = one_byte_bitmask & 0x5555; // m0 = 0h0g0f0e0d0c0b0a + const uint16_t m1 = static_cast(m0 >> 7); // m1 = 00000000h0g0f0e0 + const uint8_t m2 = static_cast((m0 | m1) & 0xff); // m2 = hdgcfbea + // 4. pack the bytes + const uint8_t *row = + &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[m2][0]; + const __m128i shuffle = _mm_loadu_si128((__m128i *)(row + 1)); + const __m128i utf8_packed = _mm_shuffle_epi8(utf8_unpacked, shuffle); + + // 5. store bytes + _mm_storeu_si128((__m128i *)utf8_output, utf8_packed); + + // 6. adjust pointers + utf8_output += row[0]; +} + +inline void write_v_u16_11bits_to_utf8(const __m128i v_u16, char *&utf8_output, + const __m128i v_0000, + const __m128i v_ff80) { + // no bits set above 7th bit + const __m128i one_byte_bytemask = + _mm_cmpeq_epi16(_mm_and_si128(v_u16, v_ff80), v_0000); + const uint16_t one_byte_bitmask = + static_cast(_mm_movemask_epi8(one_byte_bytemask)); + + write_v_u16_11bits_to_utf8(v_u16, utf8_output, one_byte_bytemask, + one_byte_bitmask); +} +/* end file src/westmere/internal/write_v_u16_11bits_to_utf8.cpp */ + +} // namespace westmere +} // namespace internal +/* end file src/westmere/internal/loader.cpp */ + +/* begin file src/westmere/sse_validate_utf16.cpp */ /* In UTF-16 code units in range 0xD800 to 0xDFFF have special meaning. @@ -25447,7 +38448,7 @@ must_be_2_3_continuation(const simd8 prev2, - there must not be two consecutive high surrogates (0xdc00 .. 0xdfff) - there must not be sole low surrogate nor high surrogate - We're going to build three bitmasks based on the 3rd nibble: + We are going to build three bitmasks based on the 3rd nibble: - V = valid word, - L = low surrogate (0xd800 .. 0xdbff) - H = high surrogate (0xdc00 .. 0xdfff) @@ -25474,7 +38475,7 @@ must_be_2_3_continuation(const simd8 prev2, - nullptr if an error was detected. */ template -const char16_t *avx2_validate_utf16(const char16_t *input, size_t size) { +const char16_t *sse_validate_utf16(const char16_t *input, size_t size) { const char16_t *end = input + size; const auto v_d8 = simd8::splat(0xd8); @@ -25482,13 +38483,13 @@ const char16_t *avx2_validate_utf16(const char16_t *input, size_t size) { const auto v_fc = simd8::splat(0xfc); const auto v_dc = simd8::splat(0xdc); - while (input + simd16::ELEMENTS * 2 < end) { + while (input + simd16::SIZE * 2 < end) { // 0. Load data: since the validation takes into account only higher // byte of each word, we compress the two vectors into one which // consists only the higher bytes. auto in0 = simd16(input); - auto in1 = simd16(input + simd16::ELEMENTS); - + auto in1 = + simd16(input + simd16::SIZE / sizeof(char16_t)); if (big_endian) { in0 = in0.swap_bytes(); in1 = in1.swap_bytes(); @@ -25501,9 +38502,10 @@ const char16_t *avx2_validate_utf16(const char16_t *input, size_t size) { // 1. Check whether we have any 0xD800..DFFF word (0b1101'1xxx'yyyy'yyyy). const auto surrogates_wordmask = (in & v_f8) == v_d8; - const uint32_t surrogates_bitmask = surrogates_wordmask.to_bitmask(); - if (surrogates_bitmask == 0x0) { - input += simd16::ELEMENTS * 2; + const uint16_t surrogates_bitmask = + static_cast(surrogates_wordmask.to_bitmask()); + if (surrogates_bitmask == 0x0000) { + input += 16; } else { // 2. We have some surrogates that have to be distinguished: // - low surrogates: 0b1101'10xx'yyyy'yyyy (0xD800..0xDBFF) @@ -25513,35 +38515,36 @@ const char16_t *avx2_validate_utf16(const char16_t *input, size_t size) { // V - non-surrogate code units // V = not surrogates_wordmask - const uint32_t V = ~surrogates_bitmask; + const uint16_t V = static_cast(~surrogates_bitmask); // H - word-mask for high surrogates: the six highest bits are 0b1101'11 const auto vH = (in & v_fc) == v_dc; - const uint32_t H = vH.to_bitmask(); + const uint16_t H = static_cast(vH.to_bitmask()); // L - word mask for low surrogates // L = not H and surrogates_wordmask - const uint32_t L = ~H & surrogates_bitmask; + const uint16_t L = static_cast(~H & surrogates_bitmask); - const uint32_t a = - L & (H >> 1); // A low surrogate must be followed by high one. - // (A low surrogate placed in the 7th register's word - // is an exception we handle.) - const uint32_t b = - a << 1; // Just mark that the opposite fact is hold, - // thanks to that we have only two masks for valid case. - const uint32_t c = V | a | b; // Combine all the masks into the final one. + const uint16_t a = static_cast( + L & (H >> 1)); // A low surrogate must be followed by high one. + // (A low surrogate placed in the 7th register's word + // is an exception we handle.) + const uint16_t b = static_cast( + a << 1); // Just mark that the opinput - startite fact is hold, + // thanks to that we have only two masks for valid case. + const uint16_t c = static_cast( + V | a | b); // Combine all the masks into the final one. - if (c == 0xffffffff) { + if (c == 0xffff) { // The whole input register contains valid UTF-16, i.e., // either single code units or proper surrogate pairs. - input += simd16::ELEMENTS * 2; - } else if (c == 0x7fffffff) { - // The 31 lower code units of the input register contains valid UTF-16. - // The 31 word may be either a low or high surrogate. It the next + input += 16; + } else if (c == 0x7fff) { + // The 15 lower code units of the input register contains valid UTF-16. + // The 15th word may be either a low or high surrogate. It the next // iteration we 1) check if the low surrogate is followed by a high // one, 2) reject sole high surrogate. - input += simd16::ELEMENTS * 2 - 1; + input += 15; } else { return nullptr; } @@ -25552,8 +38555,8 @@ const char16_t *avx2_validate_utf16(const char16_t *input, size_t size) { } template -const result avx2_validate_utf16_with_errors(const char16_t *input, - size_t size) { +const result sse_validate_utf16_with_errors(const char16_t *input, + size_t size) { if (simdutf_unlikely(size == 0)) { return result(error_code::SUCCESS, 0); } @@ -25565,12 +38568,13 @@ const result avx2_validate_utf16_with_errors(const char16_t *input, const auto v_fc = simd8::splat(0xfc); const auto v_dc = simd8::splat(0xdc); - while (input + simd16::ELEMENTS * 2 < end) { + while (input + simd16::SIZE * 2 < end) { // 0. Load data: since the validation takes into account only higher // byte of each word, we compress the two vectors into one which // consists only the higher bytes. auto in0 = simd16(input); - auto in1 = simd16(input + simd16::ELEMENTS); + auto in1 = + simd16(input + simd16::SIZE / sizeof(char16_t)); if (big_endian) { in0 = in0.swap_bytes(); @@ -25584,9 +38588,10 @@ const result avx2_validate_utf16_with_errors(const char16_t *input, // 1. Check whether we have any 0xD800..DFFF word (0b1101'1xxx'yyyy'yyyy). const auto surrogates_wordmask = (in & v_f8) == v_d8; - const uint32_t surrogates_bitmask = surrogates_wordmask.to_bitmask(); - if (surrogates_bitmask == 0x0) { - input += simd16::ELEMENTS * 2; + const uint16_t surrogates_bitmask = + static_cast(surrogates_wordmask.to_bitmask()); + if (surrogates_bitmask == 0x0000) { + input += 16; } else { // 2. We have some surrogates that have to be distinguished: // - low surrogates: 0b1101'10xx'yyyy'yyyy (0xD800..0xDBFF) @@ -25596,35 +38601,36 @@ const result avx2_validate_utf16_with_errors(const char16_t *input, // V - non-surrogate code units // V = not surrogates_wordmask - const uint32_t V = ~surrogates_bitmask; + const uint16_t V = static_cast(~surrogates_bitmask); // H - word-mask for high surrogates: the six highest bits are 0b1101'11 const auto vH = (in & v_fc) == v_dc; - const uint32_t H = vH.to_bitmask(); + const uint16_t H = static_cast(vH.to_bitmask()); // L - word mask for low surrogates // L = not H and surrogates_wordmask - const uint32_t L = ~H & surrogates_bitmask; + const uint16_t L = static_cast(~H & surrogates_bitmask); - const uint32_t a = - L & (H >> 1); // A low surrogate must be followed by high one. - // (A low surrogate placed in the 7th register's word - // is an exception we handle.) - const uint32_t b = - a << 1; // Just mark that the opposite fact is hold, - // thanks to that we have only two masks for valid case. - const uint32_t c = V | a | b; // Combine all the masks into the final one. + const uint16_t a = static_cast( + L & (H >> 1)); // A low surrogate must be followed by high one. + // (A low surrogate placed in the 7th register's word + // is an exception we handle.) + const uint16_t b = static_cast( + a << 1); // Just mark that the opinput - startite fact is hold, + // thanks to that we have only two masks for valid case. + const uint16_t c = static_cast( + V | a | b); // Combine all the masks into the final one. - if (c == 0xffffffff) { + if (c == 0xffff) { // The whole input register contains valid UTF-16, i.e., // either single code units or proper surrogate pairs. - input += simd16::ELEMENTS * 2; - } else if (c == 0x7fffffff) { - // The 31 lower code units of the input register contains valid UTF-16. - // The 31 word may be either a low or high surrogate. It the next + input += 16; + } else if (c == 0x7fff) { + // The 15 lower code units of the input register contains valid UTF-16. + // The 15th word may be either a low or high surrogate. It the next // iteration we 1) check if the low surrogate is followed by a high // one, 2) reject sole high surrogate. - input += simd16::ELEMENTS * 2 - 1; + input += 15; } else { return result(error_code::SURROGATE, input - start); } @@ -25633,228 +38639,210 @@ const result avx2_validate_utf16_with_errors(const char16_t *input, return result(error_code::SUCCESS, input - start); } -/* end file src/haswell/avx2_validate_utf16.cpp */ -/* begin file src/haswell/avx2_validate_utf32le.cpp */ +/* end file src/westmere/sse_validate_utf16.cpp */ +/* begin file src/westmere/sse_validate_utf32le.cpp */ /* Returns: - pointer to the last unprocessed character (a scalar fallback should check the rest); - nullptr if an error was detected. */ -const char32_t *avx2_validate_utf32le(const char32_t *input, size_t size) { +const char32_t *sse_validate_utf32le(const char32_t *input, size_t size) { const char32_t *end = input + size; - const __m256i standardmax = _mm256_set1_epi32(0x10ffff); - const __m256i offset = _mm256_set1_epi32(0xffff2000); - const __m256i standardoffsetmax = _mm256_set1_epi32(0xfffff7ff); - __m256i currentmax = _mm256_setzero_si256(); - __m256i currentoffsetmax = _mm256_setzero_si256(); + const __m128i standardmax = _mm_set1_epi32(0x10ffff); + const __m128i offset = _mm_set1_epi32(0xffff2000); + const __m128i standardoffsetmax = _mm_set1_epi32(0xfffff7ff); + __m128i currentmax = _mm_setzero_si128(); + __m128i currentoffsetmax = _mm_setzero_si128(); - while (input + 8 < end) { - const __m256i in = _mm256_loadu_si256((__m256i *)input); - currentmax = _mm256_max_epu32(in, currentmax); + while (input + 4 < end) { + const __m128i in = _mm_loadu_si128((__m128i *)input); + currentmax = _mm_max_epu32(in, currentmax); currentoffsetmax = - _mm256_max_epu32(_mm256_add_epi32(in, offset), currentoffsetmax); - input += 8; + _mm_max_epu32(_mm_add_epi32(in, offset), currentoffsetmax); + input += 4; } - __m256i is_zero = - _mm256_xor_si256(_mm256_max_epu32(currentmax, standardmax), standardmax); - if (_mm256_testz_si256(is_zero, is_zero) == 0) { + __m128i is_zero = + _mm_xor_si128(_mm_max_epu32(currentmax, standardmax), standardmax); + if (_mm_test_all_zeros(is_zero, is_zero) == 0) { return nullptr; } - is_zero = _mm256_xor_si256( - _mm256_max_epu32(currentoffsetmax, standardoffsetmax), standardoffsetmax); - if (_mm256_testz_si256(is_zero, is_zero) == 0) { + is_zero = _mm_xor_si128(_mm_max_epu32(currentoffsetmax, standardoffsetmax), + standardoffsetmax); + if (_mm_test_all_zeros(is_zero, is_zero) == 0) { return nullptr; } return input; } -const result avx2_validate_utf32le_with_errors(const char32_t *input, - size_t size) { +const result sse_validate_utf32le_with_errors(const char32_t *input, + size_t size) { const char32_t *start = input; const char32_t *end = input + size; - const __m256i standardmax = _mm256_set1_epi32(0x10ffff); - const __m256i offset = _mm256_set1_epi32(0xffff2000); - const __m256i standardoffsetmax = _mm256_set1_epi32(0xfffff7ff); - __m256i currentmax = _mm256_setzero_si256(); - __m256i currentoffsetmax = _mm256_setzero_si256(); + const __m128i standardmax = _mm_set1_epi32(0x10ffff); + const __m128i offset = _mm_set1_epi32(0xffff2000); + const __m128i standardoffsetmax = _mm_set1_epi32(0xfffff7ff); + __m128i currentmax = _mm_setzero_si128(); + __m128i currentoffsetmax = _mm_setzero_si128(); - while (input + 8 < end) { - const __m256i in = _mm256_loadu_si256((__m256i *)input); - currentmax = _mm256_max_epu32(in, currentmax); + while (input + 4 < end) { + const __m128i in = _mm_loadu_si128((__m128i *)input); + currentmax = _mm_max_epu32(in, currentmax); currentoffsetmax = - _mm256_max_epu32(_mm256_add_epi32(in, offset), currentoffsetmax); + _mm_max_epu32(_mm_add_epi32(in, offset), currentoffsetmax); - __m256i is_zero = _mm256_xor_si256( - _mm256_max_epu32(currentmax, standardmax), standardmax); - if (_mm256_testz_si256(is_zero, is_zero) == 0) { + __m128i is_zero = + _mm_xor_si128(_mm_max_epu32(currentmax, standardmax), standardmax); + if (_mm_test_all_zeros(is_zero, is_zero) == 0) { return result(error_code::TOO_LARGE, input - start); - } - - is_zero = - _mm256_xor_si256(_mm256_max_epu32(currentoffsetmax, standardoffsetmax), - standardoffsetmax); - if (_mm256_testz_si256(is_zero, is_zero) == 0) { - return result(error_code::SURROGATE, input - start); - } - input += 8; - } - - return result(error_code::SUCCESS, input - start); -} -/* end file src/haswell/avx2_validate_utf32le.cpp */ - -/* begin file src/haswell/avx2_convert_latin1_to_utf8.cpp */ -std::pair -avx2_convert_latin1_to_utf8(const char *latin1_input, size_t len, - char *utf8_output) { - const char *end = latin1_input + len; - const __m256i v_0000 = _mm256_setzero_si256(); - const __m256i v_c080 = _mm256_set1_epi16((int16_t)0xc080); - const __m256i v_ff80 = _mm256_set1_epi16((int16_t)0xff80); - const size_t safety_margin = 12; - - while (end - latin1_input >= std::ptrdiff_t(16 + safety_margin)) { - __m128i in8 = _mm_loadu_si128((__m128i *)latin1_input); - // a single 16-bit UTF-16 word can yield 1, 2 or 3 UTF-8 bytes - const __m128i v_80 = _mm_set1_epi8((char)0x80); - if (_mm_testz_si128(in8, v_80)) { // ASCII fast path!!!! - // 1. store (16 bytes) - _mm_storeu_si128((__m128i *)utf8_output, in8); - // 2. adjust pointers - latin1_input += 16; - utf8_output += 16; - continue; // we are done for this round! - } - // We proceed only with the first 16 bytes. - const __m256i in = _mm256_cvtepu8_epi16((in8)); - - // 1. prepare 2-byte values - // input 16-bit word : [0000|0000|aabb|bbbb] x 8 - // expected output : [1100|00aa|10bb|bbbb] x 8 - const __m256i v_1f00 = _mm256_set1_epi16((int16_t)0x1f00); - const __m256i v_003f = _mm256_set1_epi16((int16_t)0x003f); - - // t0 = [0000|00aa|bbbb|bb00] - const __m256i t0 = _mm256_slli_epi16(in, 2); - // t1 = [0000|00aa|0000|0000] - const __m256i t1 = _mm256_and_si256(t0, v_1f00); - // t2 = [0000|0000|00bb|bbbb] - const __m256i t2 = _mm256_and_si256(in, v_003f); - // t3 = [000a|aaaa|00bb|bbbb] - const __m256i t3 = _mm256_or_si256(t1, t2); - // t4 = [1100|00aa|10bb|bbbb] - const __m256i t4 = _mm256_or_si256(t3, v_c080); - - // 2. merge ASCII and 2-byte codewords - - // no bits set above 7th bit - const __m256i one_byte_bytemask = - _mm256_cmpeq_epi16(_mm256_and_si256(in, v_ff80), v_0000); - const uint32_t one_byte_bitmask = - static_cast(_mm256_movemask_epi8(one_byte_bytemask)); - - const __m256i utf8_unpacked = _mm256_blendv_epi8(t4, in, one_byte_bytemask); - - // 3. prepare bitmask for 8-bit lookup - const uint32_t M0 = one_byte_bitmask & 0x55555555; - const uint32_t M1 = M0 >> 7; - const uint32_t M2 = (M1 | M0) & 0x00ff00ff; - // 4. pack the bytes - - const uint8_t *row = - &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[uint8_t(M2)][0]; - const uint8_t *row_2 = - &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[uint8_t(M2 >> 16)] - [0]; - - const __m128i shuffle = _mm_loadu_si128((__m128i *)(row + 1)); - const __m128i shuffle_2 = _mm_loadu_si128((__m128i *)(row_2 + 1)); - - const __m256i utf8_packed = _mm256_shuffle_epi8( - utf8_unpacked, _mm256_setr_m128i(shuffle, shuffle_2)); - // 5. store bytes - _mm_storeu_si128((__m128i *)utf8_output, - _mm256_castsi256_si128(utf8_packed)); - utf8_output += row[0]; - _mm_storeu_si128((__m128i *)utf8_output, - _mm256_extractf128_si256(utf8_packed, 1)); - utf8_output += row_2[0]; - - // 6. adjust pointers - latin1_input += 16; - continue; + } - } // while - return std::make_pair(latin1_input, utf8_output); + is_zero = _mm_xor_si128(_mm_max_epu32(currentoffsetmax, standardoffsetmax), + standardoffsetmax); + if (_mm_test_all_zeros(is_zero, is_zero) == 0) { + return result(error_code::SURROGATE, input - start); + } + input += 4; + } + + return result(error_code::SUCCESS, input - start); } -/* end file src/haswell/avx2_convert_latin1_to_utf8.cpp */ -/* begin file src/haswell/avx2_convert_latin1_to_utf16.cpp */ -template -std::pair -avx2_convert_latin1_to_utf16(const char *latin1_input, size_t len, - char16_t *utf16_output) { - size_t rounded_len = len & ~0xF; // Round down to nearest multiple of 32 +/* end file src/westmere/sse_validate_utf32le.cpp */ - size_t i = 0; - for (; i < rounded_len; i += 16) { - // Load 16 bytes from the address (input + i) into a xmm register - __m128i xmm0 = - _mm_loadu_si128(reinterpret_cast(latin1_input + i)); +/* begin file src/westmere/sse_convert_latin1_to_utf8.cpp */ +std::pair +sse_convert_latin1_to_utf8(const char *latin_input, + const size_t latin_input_length, char *utf8_output) { + const char *end = latin_input + latin_input_length; - // Zero extend each byte in xmm0 to word and put it in another xmm register - __m128i xmm1 = _mm_cvtepu8_epi16(xmm0); + const __m128i v_0000 = _mm_setzero_si128(); + // 0b1000_0000 + const __m128i v_80 = _mm_set1_epi8((uint8_t)0x80); + // 0b1111_1111_1000_0000 + const __m128i v_ff80 = _mm_set1_epi16((uint16_t)0xff80); - // Shift xmm0 to the right by 8 bytes - xmm0 = _mm_srli_si128(xmm0, 8); + const __m128i latin_1_half_into_u16_byte_mask = + _mm_setr_epi8(0, '\x80', 1, '\x80', 2, '\x80', 3, '\x80', 4, '\x80', 5, + '\x80', 6, '\x80', 7, '\x80'); - // Zero extend each byte in the shifted xmm0 to word in xmm0 - xmm0 = _mm_cvtepu8_epi16(xmm0); + const __m128i latin_2_half_into_u16_byte_mask = + _mm_setr_epi8(8, '\x80', 9, '\x80', 10, '\x80', 11, '\x80', 12, '\x80', + 13, '\x80', 14, '\x80', 15, '\x80'); - if (big_endian) { - const __m128i swap = - _mm_setr_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14); - xmm0 = _mm_shuffle_epi8(xmm0, swap); - xmm1 = _mm_shuffle_epi8(xmm1, swap); + // each latin1 takes 1-2 utf8 bytes + // slow path writes useful 8-15 bytes twice (eagerly writes 16 bytes and then + // adjust the pointer) so the last write can exceed the utf8_output size by + // 8-1 bytes by reserving 8 extra input bytes, we expect the output to have + // 8-16 bytes free + while (end - latin_input >= 16 + 8) { + // Load 16 Latin1 characters (16 bytes) into a 128-bit register + __m128i v_latin = _mm_loadu_si128((__m128i *)latin_input); + + if (_mm_testz_si128(v_latin, v_80)) { // ASCII fast path!!!! + _mm_storeu_si128((__m128i *)utf8_output, v_latin); + latin_input += 16; + utf8_output += 16; + continue; } - // Store the contents of xmm1 into the address pointed by (output + i) - _mm_storeu_si128(reinterpret_cast<__m128i *>(utf16_output + i), xmm1); + // assuming a/b are bytes and A/B are uint16 of the same value + // aaaa_aaaa_bbbb_bbbb -> AAAA_AAAA + __m128i v_u16_latin_1_half = + _mm_shuffle_epi8(v_latin, latin_1_half_into_u16_byte_mask); + // aaaa_aaaa_bbbb_bbbb -> BBBB_BBBB + __m128i v_u16_latin_2_half = + _mm_shuffle_epi8(v_latin, latin_2_half_into_u16_byte_mask); - // Store the contents of xmm0 into the address pointed by (output + i + 8) - _mm_storeu_si128(reinterpret_cast<__m128i *>(utf16_output + i + 8), xmm0); + internal::westmere::write_v_u16_11bits_to_utf8(v_u16_latin_1_half, + utf8_output, v_0000, v_ff80); + internal::westmere::write_v_u16_11bits_to_utf8(v_u16_latin_2_half, + utf8_output, v_0000, v_ff80); + latin_input += 16; + } + + if (end - latin_input >= 16) { + // Load 16 Latin1 characters (16 bytes) into a 128-bit register + __m128i v_latin = _mm_loadu_si128((__m128i *)latin_input); + + if (_mm_testz_si128(v_latin, v_80)) { // ASCII fast path!!!! + _mm_storeu_si128((__m128i *)utf8_output, v_latin); + latin_input += 16; + utf8_output += 16; + } else { + // assuming a/b are bytes and A/B are uint16 of the same value + // aaaa_aaaa_bbbb_bbbb -> AAAA_AAAA + __m128i v_u16_latin_1_half = + _mm_shuffle_epi8(v_latin, latin_1_half_into_u16_byte_mask); + internal::westmere::write_v_u16_11bits_to_utf8( + v_u16_latin_1_half, utf8_output, v_0000, v_ff80); + latin_input += 8; + } } + return std::make_pair(latin_input, utf8_output); +} +/* end file src/westmere/sse_convert_latin1_to_utf8.cpp */ +/* begin file src/westmere/sse_convert_latin1_to_utf16.cpp */ +template +std::pair +sse_convert_latin1_to_utf16(const char *latin1_input, size_t len, + char16_t *utf16_output) { + size_t rounded_len = len & ~0xF; // Round down to nearest multiple of 16 + for (size_t i = 0; i < rounded_len; i += 16) { + // Load 16 Latin1 characters into a 128-bit register + __m128i in = + _mm_loadu_si128(reinterpret_cast(&latin1_input[i])); + __m128i out1 = big_endian ? _mm_unpacklo_epi8(_mm_setzero_si128(), in) + : _mm_unpacklo_epi8(in, _mm_setzero_si128()); + __m128i out2 = big_endian ? _mm_unpackhi_epi8(_mm_setzero_si128(), in) + : _mm_unpackhi_epi8(in, _mm_setzero_si128()); + // Zero extend each Latin1 character to 16-bit integers and store the + // results back to memory + _mm_storeu_si128(reinterpret_cast<__m128i *>(&utf16_output[i]), out1); + _mm_storeu_si128(reinterpret_cast<__m128i *>(&utf16_output[i + 8]), out2); + } + // return pointers pointing to where we left off return std::make_pair(latin1_input + rounded_len, utf16_output + rounded_len); } -/* end file src/haswell/avx2_convert_latin1_to_utf16.cpp */ -/* begin file src/haswell/avx2_convert_latin1_to_utf32.cpp */ +/* end file src/westmere/sse_convert_latin1_to_utf16.cpp */ +/* begin file src/westmere/sse_convert_latin1_to_utf32.cpp */ std::pair -avx2_convert_latin1_to_utf32(const char *buf, size_t len, - char32_t *utf32_output) { - size_t rounded_len = ((len | 7) ^ 7); // Round down to nearest multiple of 8 +sse_convert_latin1_to_utf32(const char *buf, size_t len, + char32_t *utf32_output) { + const char *end = buf + len; - for (size_t i = 0; i < rounded_len; i += 8) { - // Load 8 Latin1 characters into a 64-bit register - __m128i in = _mm_loadl_epi64((__m128i *)&buf[i]); + while (end - buf >= 16) { + // Load 16 Latin1 characters (16 bytes) into a 128-bit register + __m128i in = _mm_loadu_si128((__m128i *)buf); - // Zero extend each set of 8 Latin1 characters to 8 32-bit integers using - // vpmovzxbd - __m256i out = _mm256_cvtepu8_epi32(in); + // Shift input to process next 4 bytes + __m128i in_shifted1 = _mm_srli_si128(in, 4); + __m128i in_shifted2 = _mm_srli_si128(in, 8); + __m128i in_shifted3 = _mm_srli_si128(in, 12); - // Store the results back to memory - _mm256_storeu_si256((__m256i *)&utf32_output[i], out); + // expand 8-bit to 32-bit unit + __m128i out1 = _mm_cvtepu8_epi32(in); + __m128i out2 = _mm_cvtepu8_epi32(in_shifted1); + __m128i out3 = _mm_cvtepu8_epi32(in_shifted2); + __m128i out4 = _mm_cvtepu8_epi32(in_shifted3); + + _mm_storeu_si128((__m128i *)utf32_output, out1); + _mm_storeu_si128((__m128i *)(utf32_output + 4), out2); + _mm_storeu_si128((__m128i *)(utf32_output + 8), out3); + _mm_storeu_si128((__m128i *)(utf32_output + 12), out4); + + utf32_output += 16; + buf += 16; } - // return pointers pointing to where we left off - return std::make_pair(buf + rounded_len, utf32_output + rounded_len); + return std::make_pair(buf, utf32_output); } -/* end file src/haswell/avx2_convert_latin1_to_utf32.cpp */ +/* end file src/westmere/sse_convert_latin1_to_utf32.cpp */ -/* begin file src/haswell/avx2_convert_utf8_to_utf16.cpp */ +/* begin file src/westmere/sse_convert_utf8_to_utf16.cpp */ // depends on "tables/utf8_to_utf16_tables.h" // Convert up to 12 bytes from utf8 to utf16 using a mask indicating the @@ -25883,18 +38871,20 @@ size_t convert_masked_utf8_to_utf16(const char *input, utf8_end_of_code_point_mask & 0xfff; if (utf8_end_of_code_point_mask == 0xfff) { // We process the data in chunks of 12 bytes. - __m256i ascii = _mm256_cvtepu8_epi16(in); + // Note: using 16 bytes is unsafe, see issue_ossfuzz_71218 + __m128i ascii_first = _mm_cvtepu8_epi16(in); + __m128i ascii_second = _mm_cvtepu8_epi16(_mm_srli_si128(in, 8)); if (big_endian) { - const __m256i swap256 = _mm256_setr_epi8( - 1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14, 17, 16, 19, 18, - 21, 20, 23, 22, 25, 24, 27, 26, 29, 28, 31, 30); - ascii = _mm256_shuffle_epi8(ascii, swap256); + ascii_first = _mm_shuffle_epi8(ascii_first, swap); + ascii_second = _mm_shuffle_epi8(ascii_second, swap); } - _mm256_storeu_si256(reinterpret_cast<__m256i *>(utf16_output), ascii); + _mm_storeu_si128(reinterpret_cast<__m128i *>(utf16_output), ascii_first); + _mm_storeu_si128(reinterpret_cast<__m128i *>(utf16_output + 8), + ascii_second); utf16_output += 12; // We wrote 12 16-bit characters. return 12; // We consumed 12 bytes. } - if (((utf8_end_of_code_point_mask & 0xffff) == 0xaaaa)) { + if (((utf8_end_of_code_point_mask & 0xFFFF) == 0xaaaa)) { // We want to take 8 2-byte UTF-8 code units and turn them into 8 2-byte // UTF-16 code units. There is probably a more efficient sequence, but the // following might do. @@ -25934,11 +38924,12 @@ size_t convert_masked_utf8_to_utf16(const char *input, utf16_output += 4; return 12; } + /// We do not have a fast path available, so we fallback. - const uint8_t idx = simdutf::tables::utf8_to_utf16::utf8bigindex - [input_utf8_end_of_code_point_mask][0]; - const uint8_t consumed = simdutf::tables::utf8_to_utf16::utf8bigindex - [input_utf8_end_of_code_point_mask][1]; + const uint8_t idx = + tables::utf8_to_utf16::utf8bigindex[input_utf8_end_of_code_point_mask][0]; + const uint8_t consumed = + tables::utf8_to_utf16::utf8bigindex[input_utf8_end_of_code_point_mask][1]; if (idx < 64) { // SIX (6) input code-code units // this is a relatively easy scenario @@ -25946,8 +38937,8 @@ size_t convert_masked_utf8_to_utf16(const char *input, // code code units spanning between 1 and 2 bytes each is 12 bytes. On // processors where pdep/pext is fast, we might be able to use a small // lookup table. - const __m128i sh = _mm_loadu_si128( - (const __m128i *)simdutf::tables::utf8_to_utf16::shufutf8[idx]); + const __m128i sh = + _mm_loadu_si128((const __m128i *)tables::utf8_to_utf16::shufutf8[idx]); const __m128i perm = _mm_shuffle_epi8(in, sh); const __m128i ascii = _mm_and_si128(perm, _mm_set1_epi16(0x7f)); const __m128i highbyte = _mm_and_si128(perm, _mm_set1_epi16(0x1f00)); @@ -25955,12 +38946,11 @@ size_t convert_masked_utf8_to_utf16(const char *input, if (big_endian) composed = _mm_shuffle_epi8(composed, swap); _mm_storeu_si128((__m128i *)utf16_output, composed); - utf16_output += 6; // We wrote 12 bytes, 6 code points. There is a potential - // overflow of 4 bytes. + utf16_output += 6; // We wrote 12 bytes, 6 code points. } else if (idx < 145) { // FOUR (4) input code-code units - const __m128i sh = _mm_loadu_si128( - (const __m128i *)simdutf::tables::utf8_to_utf16::shufutf8[idx]); + const __m128i sh = + _mm_loadu_si128((const __m128i *)tables::utf8_to_utf16::shufutf8[idx]); const __m128i perm = _mm_shuffle_epi8(in, sh); const __m128i ascii = _mm_and_si128(perm, _mm_set1_epi32(0x7f)); // 7 or 6 bits @@ -25976,7 +38966,7 @@ size_t convert_masked_utf8_to_utf16(const char *input, if (big_endian) composed_repacked = _mm_shuffle_epi8(composed_repacked, swap); _mm_storeu_si128((__m128i *)utf16_output, composed_repacked); - utf16_output += 4; // Here we overflow by 8 bytes. + utf16_output += 4; } else if (idx < 209) { // TWO (2) input code-code units ////////////// @@ -25988,8 +38978,8 @@ size_t convert_masked_utf8_to_utf16(const char *input, // only leading bytes at least as large as 0xf0 generate surrogate pairs. We // do as at the cost of an extra mask. ///////////// - const __m128i sh = _mm_loadu_si128( - (const __m128i *)simdutf::tables::utf8_to_utf16::shufutf8[idx]); + const __m128i sh = + _mm_loadu_si128((const __m128i *)tables::utf8_to_utf16::shufutf8[idx]); const __m128i perm = _mm_shuffle_epi8(in, sh); const __m128i ascii = _mm_and_si128(perm, _mm_set1_epi32(0x7f)); const __m128i middlebyte = _mm_and_si128(perm, _mm_set1_epi32(0x3f00)); @@ -26050,8 +39040,8 @@ size_t convert_masked_utf8_to_utf16(const char *input, } return consumed; } -/* end file src/haswell/avx2_convert_utf8_to_utf16.cpp */ -/* begin file src/haswell/avx2_convert_utf8_to_utf32.cpp */ +/* end file src/westmere/sse_convert_utf8_to_utf16.cpp */ +/* begin file src/westmere/sse_convert_utf8_to_utf32.cpp */ // depends on "tables/utf8_to_utf16_tables.h" // Convert up to 12 bytes from utf8 to utf32 using a mask indicating the @@ -26077,10 +39067,14 @@ size_t convert_masked_utf8_to_utf32(const char *input, utf8_end_of_code_point_mask & 0xfff; if (utf8_end_of_code_point_mask == 0xfff) { // We process the data in chunks of 12 bytes. - _mm256_storeu_si256(reinterpret_cast<__m256i *>(utf32_output), - _mm256_cvtepu8_epi32(in)); - _mm256_storeu_si256(reinterpret_cast<__m256i *>(utf32_output + 8), - _mm256_cvtepu8_epi32(_mm_srli_si128(in, 8))); + _mm_storeu_si128(reinterpret_cast<__m128i *>(utf32_output), + _mm_cvtepu8_epi32(in)); + _mm_storeu_si128(reinterpret_cast<__m128i *>(utf32_output + 4), + _mm_cvtepu8_epi32(_mm_srli_si128(in, 4))); + _mm_storeu_si128(reinterpret_cast<__m128i *>(utf32_output + 8), + _mm_cvtepu8_epi32(_mm_srli_si128(in, 8))); + _mm_storeu_si128(reinterpret_cast<__m128i *>(utf32_output + 12), + _mm_cvtepu8_epi32(_mm_srli_si128(in, 12))); utf32_output += 12; // We wrote 12 32-bit characters. return 12; // We consumed 12 bytes. } @@ -26094,9 +39088,11 @@ size_t convert_masked_utf8_to_utf32(const char *input, const __m128i ascii = _mm_and_si128(perm, _mm_set1_epi16(0x7f)); const __m128i highbyte = _mm_and_si128(perm, _mm_set1_epi16(0x1f00)); const __m128i composed = _mm_or_si128(ascii, _mm_srli_epi16(highbyte, 2)); - _mm256_storeu_si256((__m256i *)utf32_output, - _mm256_cvtepu16_epi32(composed)); - utf32_output += 8; // We wrote 16 bytes, 8 code points. + _mm_storeu_si128(reinterpret_cast<__m128i *>(utf32_output), + _mm_cvtepu16_epi32(composed)); + _mm_storeu_si128(reinterpret_cast<__m128i *>(utf32_output + 4), + _mm_cvtepu16_epi32(_mm_srli_si128(composed, 8))); + utf32_output += 8; // We wrote 32 bytes, 8 code points. return 16; } if (input_utf8_end_of_code_point_mask == 0x924) { @@ -26139,10 +39135,11 @@ size_t convert_masked_utf8_to_utf32(const char *input, const __m128i ascii = _mm_and_si128(perm, _mm_set1_epi16(0x7f)); const __m128i highbyte = _mm_and_si128(perm, _mm_set1_epi16(0x1f00)); const __m128i composed = _mm_or_si128(ascii, _mm_srli_epi16(highbyte, 2)); - _mm256_storeu_si256((__m256i *)utf32_output, - _mm256_cvtepu16_epi32(composed)); - utf32_output += 6; // We wrote 24 bytes, 6 code points. There is a potential - // overflow of 32 - 24 = 8 bytes. + _mm_storeu_si128(reinterpret_cast<__m128i *>(utf32_output), + _mm_cvtepu16_epi32(composed)); + _mm_storeu_si128(reinterpret_cast<__m128i *>(utf32_output + 4), + _mm_cvtepu16_epi32(_mm_srli_si128(composed, 8))); + utf32_output += 6; // We wrote 12 bytes, 6 code points. } else if (idx < 145) { // FOUR (4) input code-code units const __m128i sh = @@ -26180,46 +39177,99 @@ size_t convert_masked_utf8_to_utf32(const char *input, _mm_or_si128(_mm_or_si128(ascii, middlebyte_shifted), _mm_or_si128(highbyte_shifted, middlehighbyte_shifted)); _mm_storeu_si128((__m128i *)utf32_output, composed); - utf32_output += - 3; // We wrote 3 * 4 bytes, there is a potential overflow of 4 bytes. + utf32_output += 3; } else { // here we know that there is an error but we do not handle errors } return consumed; } -/* end file src/haswell/avx2_convert_utf8_to_utf32.cpp */ +/* end file src/westmere/sse_convert_utf8_to_utf32.cpp */ +/* begin file src/westmere/sse_convert_utf8_to_latin1.cpp */ +// depends on "tables/utf8_to_utf16_tables.h" -/* begin file src/haswell/avx2_convert_utf16_to_latin1.cpp */ +// Convert up to 12 bytes from utf8 to latin1 using a mask indicating the +// end of the code points. Only the least significant 12 bits of the mask +// are accessed. +// It returns how many bytes were consumed (up to 12). +size_t convert_masked_utf8_to_latin1(const char *input, + uint64_t utf8_end_of_code_point_mask, + char *&latin1_output) { + // we use an approach where we try to process up to 12 input bytes. + // Why 12 input bytes and not 16? Because we are concerned with the size of + // the lookup tables. Also 12 is nicely divisible by two and three. + // + // + // Optimization note: our main path below is load-latency dependent. Thus it + // is maybe beneficial to have fast paths that depend on branch prediction but + // have less latency. This results in more instructions but, potentially, also + // higher speeds. + // + const __m128i in = _mm_loadu_si128((__m128i *)input); + const uint16_t input_utf8_end_of_code_point_mask = + utf8_end_of_code_point_mask & + 0xfff; // we are only processing 12 bytes in case it is not all ASCII + if (utf8_end_of_code_point_mask == 0xfff) { + // We process the data in chunks of 12 bytes. + _mm_storeu_si128(reinterpret_cast<__m128i *>(latin1_output), in); + latin1_output += 12; // We wrote 12 characters. + return 12; // We consumed 12 bytes. + } + /// We do not have a fast path available, so we fallback. + const uint8_t idx = + tables::utf8_to_utf16::utf8bigindex[input_utf8_end_of_code_point_mask][0]; + const uint8_t consumed = + tables::utf8_to_utf16::utf8bigindex[input_utf8_end_of_code_point_mask][1]; + // this indicates an invalid input: + if (idx >= 64) { + return consumed; + } + // Here we should have (idx < 64), if not, there is a bug in the validation or + // elsewhere. SIX (6) input code-code units this is a relatively easy scenario + // we process SIX (6) input code-code units. The max length in bytes of six + // code code units spanning between 1 and 2 bytes each is 12 bytes. On + // processors where pdep/pext is fast, we might be able to use a small lookup + // table. + const __m128i sh = + _mm_loadu_si128((const __m128i *)tables::utf8_to_utf16::shufutf8[idx]); + const __m128i perm = _mm_shuffle_epi8(in, sh); + const __m128i ascii = _mm_and_si128(perm, _mm_set1_epi16(0x7f)); + const __m128i highbyte = _mm_and_si128(perm, _mm_set1_epi16(0x1f00)); + __m128i composed = _mm_or_si128(ascii, _mm_srli_epi16(highbyte, 2)); + const __m128i latin1_packed = _mm_packus_epi16(composed, composed); + // writing 8 bytes even though we only care about the first 6 bytes. + // performance note: it would be faster to use _mm_storeu_si128, we should + // investigate. + _mm_storel_epi64((__m128i *)latin1_output, latin1_packed); + latin1_output += 6; // We wrote 6 bytes. + return consumed; +} +/* end file src/westmere/sse_convert_utf8_to_latin1.cpp */ + +/* begin file src/westmere/sse_convert_utf16_to_latin1.cpp */ template std::pair -avx2_convert_utf16_to_latin1(const char16_t *buf, size_t len, - char *latin1_output) { +sse_convert_utf16_to_latin1(const char16_t *buf, size_t len, + char *latin1_output) { const char16_t *end = buf + len; - while (end - buf >= 16) { - // Load 16 UTF-16 characters into 256-bit AVX2 register - __m256i in = _mm256_loadu_si256(reinterpret_cast(buf)); + while (end - buf >= 8) { + // Load 8 UTF-16 characters into 128-bit SSE register + __m128i in = _mm_loadu_si128(reinterpret_cast(buf)); if (!match_system(big_endian)) { - const __m256i swap = _mm256_setr_epi8( - 1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14, 17, 16, 19, 18, - 21, 20, 23, 22, 25, 24, 27, 26, 29, 28, 31, 30); - in = _mm256_shuffle_epi8(in, swap); + const __m128i swap = + _mm_setr_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14); + in = _mm_shuffle_epi8(in, swap); } - __m256i high_byte_mask = _mm256_set1_epi16((int16_t)0xFF00); - if (_mm256_testz_si256(in, high_byte_mask)) { + __m128i high_byte_mask = _mm_set1_epi16((int16_t)0xFF00); + if (_mm_testz_si128(in, high_byte_mask)) { // Pack 16-bit characters into 8-bit and store in latin1_output - __m128i lo = _mm256_extractf128_si256(in, 0); - __m128i hi = _mm256_extractf128_si256(in, 1); - __m128i latin1_packed_lo = _mm_packus_epi16(lo, lo); - __m128i latin1_packed_hi = _mm_packus_epi16(hi, hi); + __m128i latin1_packed = _mm_packus_epi16(in, in); _mm_storel_epi64(reinterpret_cast<__m128i *>(latin1_output), - latin1_packed_lo); - _mm_storel_epi64(reinterpret_cast<__m128i *>(latin1_output + 8), - latin1_packed_hi); + latin1_packed); // Adjust pointers for next iteration - buf += 16; - latin1_output += 16; + buf += 8; + latin1_output += 8; } else { return std::make_pair(nullptr, reinterpret_cast(latin1_output)); } @@ -26229,54 +39279,47 @@ avx2_convert_utf16_to_latin1(const char16_t *buf, size_t len, template std::pair -avx2_convert_utf16_to_latin1_with_errors(const char16_t *buf, size_t len, - char *latin1_output) { +sse_convert_utf16_to_latin1_with_errors(const char16_t *buf, size_t len, + char *latin1_output) { const char16_t *start = buf; const char16_t *end = buf + len; - while (end - buf >= 16) { - __m256i in = _mm256_loadu_si256(reinterpret_cast(buf)); + while (end - buf >= 8) { + __m128i in = _mm_loadu_si128(reinterpret_cast(buf)); if (!match_system(big_endian)) { - const __m256i swap = _mm256_setr_epi8( - 1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14, 17, 16, 19, 18, - 21, 20, 23, 22, 25, 24, 27, 26, 29, 28, 31, 30); - in = _mm256_shuffle_epi8(in, swap); + const __m128i swap = + _mm_setr_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14); + in = _mm_shuffle_epi8(in, swap); } - __m256i high_byte_mask = _mm256_set1_epi16((int16_t)0xFF00); - if (_mm256_testz_si256(in, high_byte_mask)) { - __m128i lo = _mm256_extractf128_si256(in, 0); - __m128i hi = _mm256_extractf128_si256(in, 1); - __m128i latin1_packed_lo = _mm_packus_epi16(lo, lo); - __m128i latin1_packed_hi = _mm_packus_epi16(hi, hi); + __m128i high_byte_mask = _mm_set1_epi16((int16_t)0xFF00); + if (_mm_testz_si128(in, high_byte_mask)) { + __m128i latin1_packed = _mm_packus_epi16(in, in); _mm_storel_epi64(reinterpret_cast<__m128i *>(latin1_output), - latin1_packed_lo); - _mm_storel_epi64(reinterpret_cast<__m128i *>(latin1_output + 8), - latin1_packed_hi); - buf += 16; - latin1_output += 16; + latin1_packed); + buf += 8; + latin1_output += 8; } else { // Fallback to scalar code for handling errors - for (int k = 0; k < 16; k++) { + for (int k = 0; k < 8; k++) { uint16_t word = !match_system(big_endian) ? scalar::utf16::swap_bytes(buf[k]) : buf[k]; if (word <= 0xff) { *latin1_output++ = char(word); } else { - return std::make_pair( - result{error_code::TOO_LARGE, (size_t)(buf - start + k)}, - latin1_output); + return std::make_pair(result(error_code::TOO_LARGE, buf - start + k), + latin1_output); } } - buf += 16; + buf += 8; } } // while - return std::make_pair(result{error_code::SUCCESS, (size_t)(buf - start)}, + return std::make_pair(result(error_code::SUCCESS, buf - start), latin1_output); } -/* end file src/haswell/avx2_convert_utf16_to_latin1.cpp */ -/* begin file src/haswell/avx2_convert_utf16_to_utf8.cpp */ +/* end file src/westmere/sse_convert_utf16_to_latin1.cpp */ +/* begin file src/westmere/sse_convert_utf16_to_utf8.cpp */ /* The vectorized algorithm works on single SSE register i.e., it loads eight 16-bit code units. @@ -26332,117 +39375,91 @@ avx2_convert_utf16_to_latin1_with_errors(const char16_t *buf, size_t len, */ template std::pair -avx2_convert_utf16_to_utf8(const char16_t *buf, size_t len, char *utf8_output) { +sse_convert_utf16_to_utf8(const char16_t *buf, size_t len, char *utf8_output) { + const char16_t *end = buf + len; - const __m256i v_0000 = _mm256_setzero_si256(); - const __m256i v_f800 = _mm256_set1_epi16((int16_t)0xf800); - const __m256i v_d800 = _mm256_set1_epi16((int16_t)0xd800); - const __m256i v_c080 = _mm256_set1_epi16((int16_t)0xc080); + + const __m128i v_0000 = _mm_setzero_si128(); + const __m128i v_f800 = _mm_set1_epi16((int16_t)0xf800); + const __m128i v_d800 = _mm_set1_epi16((int16_t)0xd800); const size_t safety_margin = 12; // to avoid overruns, see issue // https://github.com/simdutf/simdutf/issues/92 while (end - buf >= std::ptrdiff_t(16 + safety_margin)) { - __m256i in = _mm256_loadu_si256((__m256i *)buf); + __m128i in = _mm_loadu_si128((__m128i *)buf); if (big_endian) { - const __m256i swap = _mm256_setr_epi8( - 1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14, 17, 16, 19, 18, - 21, 20, 23, 22, 25, 24, 27, 26, 29, 28, 31, 30); - in = _mm256_shuffle_epi8(in, swap); + const __m128i swap = + _mm_setr_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14); + in = _mm_shuffle_epi8(in, swap); } // a single 16-bit UTF-16 word can yield 1, 2 or 3 UTF-8 bytes - const __m256i v_ff80 = _mm256_set1_epi16((int16_t)0xff80); - if (_mm256_testz_si256(in, v_ff80)) { // ASCII fast path!!!! - // 1. pack the bytes - const __m128i utf8_packed = _mm_packus_epi16( - _mm256_castsi256_si128(in), _mm256_extractf128_si256(in, 1)); - // 2. store (16 bytes) - _mm_storeu_si128((__m128i *)utf8_output, utf8_packed); - // 3. adjust pointers - buf += 16; - utf8_output += 16; - continue; // we are done for this round! + const __m128i v_ff80 = _mm_set1_epi16((int16_t)0xff80); + if (_mm_testz_si128(in, v_ff80)) { // ASCII fast path!!!! + __m128i nextin = _mm_loadu_si128((__m128i *)buf + 1); + if (big_endian) { + const __m128i swap = + _mm_setr_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14); + nextin = _mm_shuffle_epi8(nextin, swap); + } + if (!_mm_testz_si128(nextin, v_ff80)) { + // 1. pack the bytes + // obviously suboptimal. + const __m128i utf8_packed = _mm_packus_epi16(in, in); + // 2. store (16 bytes) + _mm_storeu_si128((__m128i *)utf8_output, utf8_packed); + // 3. adjust pointers + buf += 8; + utf8_output += 8; + in = nextin; + } else { + // 1. pack the bytes + // obviously suboptimal. + const __m128i utf8_packed = _mm_packus_epi16(in, nextin); + // 2. store (16 bytes) + _mm_storeu_si128((__m128i *)utf8_output, utf8_packed); + // 3. adjust pointers + buf += 16; + utf8_output += 16; + continue; // we are done for this round! + } } + // no bits set above 7th bit - const __m256i one_byte_bytemask = - _mm256_cmpeq_epi16(_mm256_and_si256(in, v_ff80), v_0000); - const uint32_t one_byte_bitmask = - static_cast(_mm256_movemask_epi8(one_byte_bytemask)); + const __m128i one_byte_bytemask = + _mm_cmpeq_epi16(_mm_and_si128(in, v_ff80), v_0000); + const uint16_t one_byte_bitmask = + static_cast(_mm_movemask_epi8(one_byte_bytemask)); // no bits set above 11th bit - const __m256i one_or_two_bytes_bytemask = - _mm256_cmpeq_epi16(_mm256_and_si256(in, v_f800), v_0000); - const uint32_t one_or_two_bytes_bitmask = - static_cast(_mm256_movemask_epi8(one_or_two_bytes_bytemask)); - if (one_or_two_bytes_bitmask == 0xffffffff) { - - // 1. prepare 2-byte values - // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8 - // expected output : [110a|aaaa|10bb|bbbb] x 8 - const __m256i v_1f00 = _mm256_set1_epi16((int16_t)0x1f00); - const __m256i v_003f = _mm256_set1_epi16((int16_t)0x003f); - - // t0 = [000a|aaaa|bbbb|bb00] - const __m256i t0 = _mm256_slli_epi16(in, 2); - // t1 = [000a|aaaa|0000|0000] - const __m256i t1 = _mm256_and_si256(t0, v_1f00); - // t2 = [0000|0000|00bb|bbbb] - const __m256i t2 = _mm256_and_si256(in, v_003f); - // t3 = [000a|aaaa|00bb|bbbb] - const __m256i t3 = _mm256_or_si256(t1, t2); - // t4 = [110a|aaaa|10bb|bbbb] - const __m256i t4 = _mm256_or_si256(t3, v_c080); - - // 2. merge ASCII and 2-byte codewords - const __m256i utf8_unpacked = - _mm256_blendv_epi8(t4, in, one_byte_bytemask); - - // 3. prepare bitmask for 8-bit lookup - const uint32_t M0 = one_byte_bitmask & 0x55555555; - const uint32_t M1 = M0 >> 7; - const uint32_t M2 = (M1 | M0) & 0x00ff00ff; - // 4. pack the bytes - - const uint8_t *row = - &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[uint8_t(M2)][0]; - const uint8_t *row_2 = - &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[uint8_t(M2 >> - 16)][0]; - - const __m128i shuffle = _mm_loadu_si128((__m128i *)(row + 1)); - const __m128i shuffle_2 = _mm_loadu_si128((__m128i *)(row_2 + 1)); - - const __m256i utf8_packed = _mm256_shuffle_epi8( - utf8_unpacked, _mm256_setr_m128i(shuffle, shuffle_2)); - // 5. store bytes - _mm_storeu_si128((__m128i *)utf8_output, - _mm256_castsi256_si128(utf8_packed)); - utf8_output += row[0]; - _mm_storeu_si128((__m128i *)utf8_output, - _mm256_extractf128_si256(utf8_packed, 1)); - utf8_output += row_2[0]; + const __m128i one_or_two_bytes_bytemask = + _mm_cmpeq_epi16(_mm_and_si128(in, v_f800), v_0000); + const uint16_t one_or_two_bytes_bitmask = + static_cast(_mm_movemask_epi8(one_or_two_bytes_bytemask)); - // 6. adjust pointers - buf += 16; + if (one_or_two_bytes_bitmask == 0xffff) { + internal::westmere::write_v_u16_11bits_to_utf8( + in, utf8_output, one_byte_bytemask, one_byte_bitmask); + buf += 8; continue; } + // 1. Check if there are any surrogate word in the input chunk. // We have also deal with situation when there is a surrogate word // at the end of a chunk. - const __m256i surrogates_bytemask = - _mm256_cmpeq_epi16(_mm256_and_si256(in, v_f800), v_d800); + const __m128i surrogates_bytemask = + _mm_cmpeq_epi16(_mm_and_si128(in, v_f800), v_d800); // bitmask = 0x0000 if there are no surrogates // = 0xc000 if the last word is a surrogate - const uint32_t surrogates_bitmask = - static_cast(_mm256_movemask_epi8(surrogates_bytemask)); + const uint16_t surrogates_bitmask = + static_cast(_mm_movemask_epi8(surrogates_bytemask)); // It might seem like checking for surrogates_bitmask == 0xc000 could help. // However, it is likely an uncommon occurrence. - if (surrogates_bitmask == 0x00000000) { + if (surrogates_bitmask == 0x0000) { // case: code units from register produce either 1, 2 or 3 UTF-8 bytes - const __m256i dup_even = _mm256_setr_epi16( - 0x0000, 0x0202, 0x0404, 0x0606, 0x0808, 0x0a0a, 0x0c0c, 0x0e0e, - 0x0000, 0x0202, 0x0404, 0x0606, 0x0808, 0x0a0a, 0x0c0c, 0x0e0e); + const __m128i dup_even = _mm_setr_epi16(0x0000, 0x0202, 0x0404, 0x0606, + 0x0808, 0x0a0a, 0x0c0c, 0x0e0e); /* In this branch we handle three cases: 1. [0000|0000|0ccc|cccc] => [0ccc|cccc] - @@ -26471,90 +39488,67 @@ avx2_convert_utf16_to_utf8(const char16_t *buf, size_t len, char *utf8_output) { * t2 => [0ccc|cccc] [10cc|cccc] * s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb]) */ -#define simdutf_vec(x) _mm256_set1_epi16(static_cast(x)) +#define simdutf_vec(x) _mm_set1_epi16(static_cast(x)) // [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc] - const __m256i t0 = _mm256_shuffle_epi8(in, dup_even); + const __m128i t0 = _mm_shuffle_epi8(in, dup_even); // [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc] - const __m256i t1 = _mm256_and_si256(t0, simdutf_vec(0b0011111101111111)); + const __m128i t1 = _mm_and_si128(t0, simdutf_vec(0b0011111101111111)); // [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc] - const __m256i t2 = _mm256_or_si256(t1, simdutf_vec(0b1000000000000000)); + const __m128i t2 = _mm_or_si128(t1, simdutf_vec(0b1000000000000000)); // [aaaa|bbbb|bbcc|cccc] => [0000|aaaa|bbbb|bbcc] - const __m256i s0 = _mm256_srli_epi16(in, 4); + const __m128i s0 = _mm_srli_epi16(in, 4); // [0000|aaaa|bbbb|bbcc] => [0000|aaaa|bbbb|bb00] - const __m256i s1 = _mm256_and_si256(s0, simdutf_vec(0b0000111111111100)); + const __m128i s1 = _mm_and_si128(s0, simdutf_vec(0b0000111111111100)); // [0000|aaaa|bbbb|bb00] => [00bb|bbbb|0000|aaaa] - const __m256i s2 = _mm256_maddubs_epi16(s1, simdutf_vec(0x0140)); + const __m128i s2 = _mm_maddubs_epi16(s1, simdutf_vec(0x0140)); // [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa] - const __m256i s3 = _mm256_or_si256(s2, simdutf_vec(0b1100000011100000)); - const __m256i m0 = _mm256_andnot_si256(one_or_two_bytes_bytemask, - simdutf_vec(0b0100000000000000)); - const __m256i s4 = _mm256_xor_si256(s3, m0); + const __m128i s3 = _mm_or_si128(s2, simdutf_vec(0b1100000011100000)); + const __m128i m0 = _mm_andnot_si128(one_or_two_bytes_bytemask, + simdutf_vec(0b0100000000000000)); + const __m128i s4 = _mm_xor_si128(s3, m0); #undef simdutf_vec // 4. expand code units 16-bit => 32-bit - const __m256i out0 = _mm256_unpacklo_epi16(t2, s4); - const __m256i out1 = _mm256_unpackhi_epi16(t2, s4); + const __m128i out0 = _mm_unpacklo_epi16(t2, s4); + const __m128i out1 = _mm_unpackhi_epi16(t2, s4); // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle - const uint32_t mask = (one_byte_bitmask & 0x55555555) | - (one_or_two_bytes_bitmask & 0xaaaaaaaa); - // Due to the wider registers, the following path is less likely to be - // useful. - /*if(mask == 0) { + const uint16_t mask = + (one_byte_bitmask & 0x5555) | (one_or_two_bytes_bitmask & 0xaaaa); + if (mask == 0) { // We only have three-byte code units. Use fast path. - const __m256i shuffle = - _mm256_setr_epi8(2,3,1,6,7,5,10,11,9,14,15,13,-1,-1,-1,-1, - 2,3,1,6,7,5,10,11,9,14,15,13,-1,-1,-1,-1); const __m256i utf8_0 = - _mm256_shuffle_epi8(out0, shuffle); const __m256i utf8_1 = - _mm256_shuffle_epi8(out1, shuffle); - _mm_storeu_si128((__m128i*)utf8_output, _mm256_castsi256_si128(utf8_0)); + const __m128i shuffle = _mm_setr_epi8(2, 3, 1, 6, 7, 5, 10, 11, 9, 14, + 15, 13, -1, -1, -1, -1); + const __m128i utf8_0 = _mm_shuffle_epi8(out0, shuffle); + const __m128i utf8_1 = _mm_shuffle_epi8(out1, shuffle); + _mm_storeu_si128((__m128i *)utf8_output, utf8_0); utf8_output += 12; - _mm_storeu_si128((__m128i*)utf8_output, _mm256_castsi256_si128(utf8_1)); + _mm_storeu_si128((__m128i *)utf8_output, utf8_1); utf8_output += 12; - _mm_storeu_si128((__m128i*)utf8_output, - _mm256_extractf128_si256(utf8_0,1)); utf8_output += 12; - _mm_storeu_si128((__m128i*)utf8_output, - _mm256_extractf128_si256(utf8_1,1)); utf8_output += 12; buf += 16; + buf += 8; continue; - }*/ + } const uint8_t mask0 = uint8_t(mask); + const uint8_t *row0 = &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask0][0]; const __m128i shuffle0 = _mm_loadu_si128((__m128i *)(row0 + 1)); - const __m128i utf8_0 = - _mm_shuffle_epi8(_mm256_castsi256_si128(out0), shuffle0); + const __m128i utf8_0 = _mm_shuffle_epi8(out0, shuffle0); const uint8_t mask1 = static_cast(mask >> 8); + const uint8_t *row1 = &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask1][0]; const __m128i shuffle1 = _mm_loadu_si128((__m128i *)(row1 + 1)); - const __m128i utf8_1 = - _mm_shuffle_epi8(_mm256_castsi256_si128(out1), shuffle1); - - const uint8_t mask2 = static_cast(mask >> 16); - const uint8_t *row2 = - &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask2][0]; - const __m128i shuffle2 = _mm_loadu_si128((__m128i *)(row2 + 1)); - const __m128i utf8_2 = - _mm_shuffle_epi8(_mm256_extractf128_si256(out0, 1), shuffle2); - - const uint8_t mask3 = static_cast(mask >> 24); - const uint8_t *row3 = - &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask3][0]; - const __m128i shuffle3 = _mm_loadu_si128((__m128i *)(row3 + 1)); - const __m128i utf8_3 = - _mm_shuffle_epi8(_mm256_extractf128_si256(out1, 1), shuffle3); + const __m128i utf8_1 = _mm_shuffle_epi8(out1, shuffle1); _mm_storeu_si128((__m128i *)utf8_output, utf8_0); utf8_output += row0[0]; _mm_storeu_si128((__m128i *)utf8_output, utf8_1); utf8_output += row1[0]; - _mm_storeu_si128((__m128i *)utf8_output, utf8_2); - utf8_output += row2[0]; - _mm_storeu_si128((__m128i *)utf8_output, utf8_3); - utf8_output += row3[0]; - buf += 16; + + buf += 8; // surrogate pair(s) in a register } else { // Let us do a scalar fallback. @@ -26596,6 +39590,7 @@ avx2_convert_utf16_to_utf8(const char16_t *buf, size_t len, char *utf8_output) { buf += k; } } // while + return std::make_pair(buf, utf8_output); } @@ -26608,120 +39603,92 @@ avx2_convert_utf16_to_utf8(const char16_t *buf, size_t len, char *utf8_output) { */ template std::pair -avx2_convert_utf16_to_utf8_with_errors(const char16_t *buf, size_t len, - char *utf8_output) { +sse_convert_utf16_to_utf8_with_errors(const char16_t *buf, size_t len, + char *utf8_output) { const char16_t *start = buf; const char16_t *end = buf + len; - const __m256i v_0000 = _mm256_setzero_si256(); - const __m256i v_f800 = _mm256_set1_epi16((int16_t)0xf800); - const __m256i v_d800 = _mm256_set1_epi16((int16_t)0xd800); - const __m256i v_c080 = _mm256_set1_epi16((int16_t)0xc080); + const __m128i v_0000 = _mm_setzero_si128(); + const __m128i v_f800 = _mm_set1_epi16((int16_t)0xf800); + const __m128i v_d800 = _mm_set1_epi16((int16_t)0xd800); const size_t safety_margin = 12; // to avoid overruns, see issue // https://github.com/simdutf/simdutf/issues/92 while (end - buf >= std::ptrdiff_t(16 + safety_margin)) { - __m256i in = _mm256_loadu_si256((__m256i *)buf); + __m128i in = _mm_loadu_si128((__m128i *)buf); if (big_endian) { - const __m256i swap = _mm256_setr_epi8( - 1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14, 17, 16, 19, 18, - 21, 20, 23, 22, 25, 24, 27, 26, 29, 28, 31, 30); - in = _mm256_shuffle_epi8(in, swap); + const __m128i swap = + _mm_setr_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14); + in = _mm_shuffle_epi8(in, swap); } // a single 16-bit UTF-16 word can yield 1, 2 or 3 UTF-8 bytes - const __m256i v_ff80 = _mm256_set1_epi16((int16_t)0xff80); - if (_mm256_testz_si256(in, v_ff80)) { // ASCII fast path!!!! - // 1. pack the bytes - const __m128i utf8_packed = _mm_packus_epi16( - _mm256_castsi256_si128(in), _mm256_extractf128_si256(in, 1)); - // 2. store (16 bytes) - _mm_storeu_si128((__m128i *)utf8_output, utf8_packed); - // 3. adjust pointers - buf += 16; - utf8_output += 16; - continue; // we are done for this round! + const __m128i v_ff80 = _mm_set1_epi16((int16_t)0xff80); + if (_mm_testz_si128(in, v_ff80)) { // ASCII fast path!!!! + __m128i nextin = _mm_loadu_si128((__m128i *)buf + 1); + if (big_endian) { + const __m128i swap = + _mm_setr_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14); + nextin = _mm_shuffle_epi8(nextin, swap); + } + if (!_mm_testz_si128(nextin, v_ff80)) { + // 1. pack the bytes + // obviously suboptimal. + const __m128i utf8_packed = _mm_packus_epi16(in, in); + // 2. store (16 bytes) + _mm_storeu_si128((__m128i *)utf8_output, utf8_packed); + // 3. adjust pointers + buf += 8; + utf8_output += 8; + in = nextin; + } else { + // 1. pack the bytes + // obviously suboptimal. + const __m128i utf8_packed = _mm_packus_epi16(in, nextin); + // 2. store (16 bytes) + _mm_storeu_si128((__m128i *)utf8_output, utf8_packed); + // 3. adjust pointers + buf += 16; + utf8_output += 16; + continue; // we are done for this round! + } } + // no bits set above 7th bit - const __m256i one_byte_bytemask = - _mm256_cmpeq_epi16(_mm256_and_si256(in, v_ff80), v_0000); - const uint32_t one_byte_bitmask = - static_cast(_mm256_movemask_epi8(one_byte_bytemask)); + const __m128i one_byte_bytemask = + _mm_cmpeq_epi16(_mm_and_si128(in, v_ff80), v_0000); + const uint16_t one_byte_bitmask = + static_cast(_mm_movemask_epi8(one_byte_bytemask)); // no bits set above 11th bit - const __m256i one_or_two_bytes_bytemask = - _mm256_cmpeq_epi16(_mm256_and_si256(in, v_f800), v_0000); - const uint32_t one_or_two_bytes_bitmask = - static_cast(_mm256_movemask_epi8(one_or_two_bytes_bytemask)); - if (one_or_two_bytes_bitmask == 0xffffffff) { - - // 1. prepare 2-byte values - // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8 - // expected output : [110a|aaaa|10bb|bbbb] x 8 - const __m256i v_1f00 = _mm256_set1_epi16((int16_t)0x1f00); - const __m256i v_003f = _mm256_set1_epi16((int16_t)0x003f); - - // t0 = [000a|aaaa|bbbb|bb00] - const __m256i t0 = _mm256_slli_epi16(in, 2); - // t1 = [000a|aaaa|0000|0000] - const __m256i t1 = _mm256_and_si256(t0, v_1f00); - // t2 = [0000|0000|00bb|bbbb] - const __m256i t2 = _mm256_and_si256(in, v_003f); - // t3 = [000a|aaaa|00bb|bbbb] - const __m256i t3 = _mm256_or_si256(t1, t2); - // t4 = [110a|aaaa|10bb|bbbb] - const __m256i t4 = _mm256_or_si256(t3, v_c080); - - // 2. merge ASCII and 2-byte codewords - const __m256i utf8_unpacked = - _mm256_blendv_epi8(t4, in, one_byte_bytemask); - - // 3. prepare bitmask for 8-bit lookup - const uint32_t M0 = one_byte_bitmask & 0x55555555; - const uint32_t M1 = M0 >> 7; - const uint32_t M2 = (M1 | M0) & 0x00ff00ff; - // 4. pack the bytes - - const uint8_t *row = - &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[uint8_t(M2)][0]; - const uint8_t *row_2 = - &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[uint8_t(M2 >> - 16)][0]; - - const __m128i shuffle = _mm_loadu_si128((__m128i *)(row + 1)); - const __m128i shuffle_2 = _mm_loadu_si128((__m128i *)(row_2 + 1)); - - const __m256i utf8_packed = _mm256_shuffle_epi8( - utf8_unpacked, _mm256_setr_m128i(shuffle, shuffle_2)); - // 5. store bytes - _mm_storeu_si128((__m128i *)utf8_output, - _mm256_castsi256_si128(utf8_packed)); - utf8_output += row[0]; - _mm_storeu_si128((__m128i *)utf8_output, - _mm256_extractf128_si256(utf8_packed, 1)); - utf8_output += row_2[0]; + const __m128i one_or_two_bytes_bytemask = + _mm_cmpeq_epi16(_mm_and_si128(in, v_f800), v_0000); + const uint16_t one_or_two_bytes_bitmask = + static_cast(_mm_movemask_epi8(one_or_two_bytes_bytemask)); - // 6. adjust pointers - buf += 16; + if (one_or_two_bytes_bitmask == 0xffff) { + internal::westmere::write_v_u16_11bits_to_utf8( + in, utf8_output, one_byte_bytemask, one_byte_bitmask); + buf += 8; continue; } + // 1. Check if there are any surrogate word in the input chunk. // We have also deal with situation when there is a surrogate word // at the end of a chunk. - const __m256i surrogates_bytemask = - _mm256_cmpeq_epi16(_mm256_and_si256(in, v_f800), v_d800); + const __m128i surrogates_bytemask = + _mm_cmpeq_epi16(_mm_and_si128(in, v_f800), v_d800); // bitmask = 0x0000 if there are no surrogates // = 0xc000 if the last word is a surrogate - const uint32_t surrogates_bitmask = - static_cast(_mm256_movemask_epi8(surrogates_bytemask)); + const uint16_t surrogates_bitmask = + static_cast(_mm_movemask_epi8(surrogates_bytemask)); // It might seem like checking for surrogates_bitmask == 0xc000 could help. // However, it is likely an uncommon occurrence. - if (surrogates_bitmask == 0x00000000) { + if (surrogates_bitmask == 0x0000) { // case: code units from register produce either 1, 2 or 3 UTF-8 bytes - const __m256i dup_even = _mm256_setr_epi16( - 0x0000, 0x0202, 0x0404, 0x0606, 0x0808, 0x0a0a, 0x0c0c, 0x0e0e, - 0x0000, 0x0202, 0x0404, 0x0606, 0x0808, 0x0a0a, 0x0c0c, 0x0e0e); + const __m128i dup_even = _mm_setr_epi16(0x0000, 0x0202, 0x0404, 0x0606, + 0x0808, 0x0a0a, 0x0c0c, 0x0e0e); /* In this branch we handle three cases: 1. [0000|0000|0ccc|cccc] => [0ccc|cccc] - @@ -26750,90 +39717,67 @@ avx2_convert_utf16_to_utf8_with_errors(const char16_t *buf, size_t len, * t2 => [0ccc|cccc] [10cc|cccc] * s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb]) */ -#define simdutf_vec(x) _mm256_set1_epi16(static_cast(x)) +#define simdutf_vec(x) _mm_set1_epi16(static_cast(x)) // [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc] - const __m256i t0 = _mm256_shuffle_epi8(in, dup_even); + const __m128i t0 = _mm_shuffle_epi8(in, dup_even); // [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc] - const __m256i t1 = _mm256_and_si256(t0, simdutf_vec(0b0011111101111111)); + const __m128i t1 = _mm_and_si128(t0, simdutf_vec(0b0011111101111111)); // [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc] - const __m256i t2 = _mm256_or_si256(t1, simdutf_vec(0b1000000000000000)); + const __m128i t2 = _mm_or_si128(t1, simdutf_vec(0b1000000000000000)); // [aaaa|bbbb|bbcc|cccc] => [0000|aaaa|bbbb|bbcc] - const __m256i s0 = _mm256_srli_epi16(in, 4); + const __m128i s0 = _mm_srli_epi16(in, 4); // [0000|aaaa|bbbb|bbcc] => [0000|aaaa|bbbb|bb00] - const __m256i s1 = _mm256_and_si256(s0, simdutf_vec(0b0000111111111100)); + const __m128i s1 = _mm_and_si128(s0, simdutf_vec(0b0000111111111100)); // [0000|aaaa|bbbb|bb00] => [00bb|bbbb|0000|aaaa] - const __m256i s2 = _mm256_maddubs_epi16(s1, simdutf_vec(0x0140)); + const __m128i s2 = _mm_maddubs_epi16(s1, simdutf_vec(0x0140)); // [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa] - const __m256i s3 = _mm256_or_si256(s2, simdutf_vec(0b1100000011100000)); - const __m256i m0 = _mm256_andnot_si256(one_or_two_bytes_bytemask, - simdutf_vec(0b0100000000000000)); - const __m256i s4 = _mm256_xor_si256(s3, m0); + const __m128i s3 = _mm_or_si128(s2, simdutf_vec(0b1100000011100000)); + const __m128i m0 = _mm_andnot_si128(one_or_two_bytes_bytemask, + simdutf_vec(0b0100000000000000)); + const __m128i s4 = _mm_xor_si128(s3, m0); #undef simdutf_vec // 4. expand code units 16-bit => 32-bit - const __m256i out0 = _mm256_unpacklo_epi16(t2, s4); - const __m256i out1 = _mm256_unpackhi_epi16(t2, s4); + const __m128i out0 = _mm_unpacklo_epi16(t2, s4); + const __m128i out1 = _mm_unpackhi_epi16(t2, s4); // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle - const uint32_t mask = (one_byte_bitmask & 0x55555555) | - (one_or_two_bytes_bitmask & 0xaaaaaaaa); - // Due to the wider registers, the following path is less likely to be - // useful. - /*if(mask == 0) { + const uint16_t mask = + (one_byte_bitmask & 0x5555) | (one_or_two_bytes_bitmask & 0xaaaa); + if (mask == 0) { // We only have three-byte code units. Use fast path. - const __m256i shuffle = - _mm256_setr_epi8(2,3,1,6,7,5,10,11,9,14,15,13,-1,-1,-1,-1, - 2,3,1,6,7,5,10,11,9,14,15,13,-1,-1,-1,-1); const __m256i utf8_0 = - _mm256_shuffle_epi8(out0, shuffle); const __m256i utf8_1 = - _mm256_shuffle_epi8(out1, shuffle); - _mm_storeu_si128((__m128i*)utf8_output, _mm256_castsi256_si128(utf8_0)); + const __m128i shuffle = _mm_setr_epi8(2, 3, 1, 6, 7, 5, 10, 11, 9, 14, + 15, 13, -1, -1, -1, -1); + const __m128i utf8_0 = _mm_shuffle_epi8(out0, shuffle); + const __m128i utf8_1 = _mm_shuffle_epi8(out1, shuffle); + _mm_storeu_si128((__m128i *)utf8_output, utf8_0); utf8_output += 12; - _mm_storeu_si128((__m128i*)utf8_output, _mm256_castsi256_si128(utf8_1)); + _mm_storeu_si128((__m128i *)utf8_output, utf8_1); utf8_output += 12; - _mm_storeu_si128((__m128i*)utf8_output, - _mm256_extractf128_si256(utf8_0,1)); utf8_output += 12; - _mm_storeu_si128((__m128i*)utf8_output, - _mm256_extractf128_si256(utf8_1,1)); utf8_output += 12; buf += 16; + buf += 8; continue; - }*/ + } const uint8_t mask0 = uint8_t(mask); + const uint8_t *row0 = &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask0][0]; const __m128i shuffle0 = _mm_loadu_si128((__m128i *)(row0 + 1)); - const __m128i utf8_0 = - _mm_shuffle_epi8(_mm256_castsi256_si128(out0), shuffle0); + const __m128i utf8_0 = _mm_shuffle_epi8(out0, shuffle0); const uint8_t mask1 = static_cast(mask >> 8); + const uint8_t *row1 = &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask1][0]; const __m128i shuffle1 = _mm_loadu_si128((__m128i *)(row1 + 1)); - const __m128i utf8_1 = - _mm_shuffle_epi8(_mm256_castsi256_si128(out1), shuffle1); - - const uint8_t mask2 = static_cast(mask >> 16); - const uint8_t *row2 = - &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask2][0]; - const __m128i shuffle2 = _mm_loadu_si128((__m128i *)(row2 + 1)); - const __m128i utf8_2 = - _mm_shuffle_epi8(_mm256_extractf128_si256(out0, 1), shuffle2); - - const uint8_t mask3 = static_cast(mask >> 24); - const uint8_t *row3 = - &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask3][0]; - const __m128i shuffle3 = _mm_loadu_si128((__m128i *)(row3 + 1)); - const __m128i utf8_3 = - _mm_shuffle_epi8(_mm256_extractf128_si256(out1, 1), shuffle3); + const __m128i utf8_1 = _mm_shuffle_epi8(out1, shuffle1); _mm_storeu_si128((__m128i *)utf8_output, utf8_0); utf8_output += row0[0]; _mm_storeu_si128((__m128i *)utf8_output, utf8_1); utf8_output += row1[0]; - _mm_storeu_si128((__m128i *)utf8_output, utf8_2); - utf8_output += row2[0]; - _mm_storeu_si128((__m128i *)utf8_output, utf8_3); - utf8_output += row3[0]; - buf += 16; + + buf += 8; // surrogate pair(s) in a register } else { // Let us do a scalar fallback. @@ -26877,10 +39821,11 @@ avx2_convert_utf16_to_utf8_with_errors(const char16_t *buf, size_t len, buf += k; } } // while + return std::make_pair(result(error_code::SUCCESS, buf - start), utf8_output); } -/* end file src/haswell/avx2_convert_utf16_to_utf8.cpp */ -/* begin file src/haswell/avx2_convert_utf16_to_utf32.cpp */ +/* end file src/westmere/sse_convert_utf16_to_utf8.cpp */ +/* begin file src/westmere/sse_convert_utf16_to_utf32.cpp */ /* The vectorized algorithm works on single SSE register i.e., it loads eight 16-bit code units. @@ -26889,14 +39834,14 @@ avx2_convert_utf16_to_utf8_with_errors(const char16_t *buf, size_t len, 1. an input register contains no surrogates and each value is in range 0x0000 .. 0x07ff. 2. an input register contains no surrogates and values are - in range 0x0000 .. 0xffff. + is in range 0x0000 .. 0xffff. 3. an input register contains surrogates --- i.e. codepoints can have 16 or 32 bits. Ad 1. When values are less than 0x0800, it means that a 16-bit code unit - can be converted into: 1) single UTF8 byte (when it is an ASCII + can be converted into: 1) single UTF8 byte (when it's an ASCII char) or 2) two UTF8 bytes. For this case we do only some shuffle to obtain these 2-byte @@ -26931,48 +39876,47 @@ avx2_convert_utf16_to_utf8_with_errors(const char16_t *buf, size_t len, */ /* - Returns a pair: the first unprocessed byte from buf and utf32_output + Returns a pair: the first unprocessed byte from buf and utf8_output A scalar routing should carry on the conversion of the tail. */ template std::pair -avx2_convert_utf16_to_utf32(const char16_t *buf, size_t len, - char32_t *utf32_output) { +sse_convert_utf16_to_utf32(const char16_t *buf, size_t len, + char32_t *utf32_output) { const char16_t *end = buf + len; - const __m256i v_f800 = _mm256_set1_epi16((int16_t)0xf800); - const __m256i v_d800 = _mm256_set1_epi16((int16_t)0xd800); - while (end - buf >= 16) { - __m256i in = _mm256_loadu_si256((__m256i *)buf); + const __m128i v_f800 = _mm_set1_epi16((int16_t)0xf800); + const __m128i v_d800 = _mm_set1_epi16((int16_t)0xd800); + + while (end - buf >= 8) { + __m128i in = _mm_loadu_si128((__m128i *)buf); + if (big_endian) { - const __m256i swap = _mm256_setr_epi8( - 1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14, 17, 16, 19, 18, - 21, 20, 23, 22, 25, 24, 27, 26, 29, 28, 31, 30); - in = _mm256_shuffle_epi8(in, swap); + const __m128i swap = + _mm_setr_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14); + in = _mm_shuffle_epi8(in, swap); } // 1. Check if there are any surrogate word in the input chunk. // We have also deal with situation when there is a surrogate word // at the end of a chunk. - const __m256i surrogates_bytemask = - _mm256_cmpeq_epi16(_mm256_and_si256(in, v_f800), v_d800); + const __m128i surrogates_bytemask = + _mm_cmpeq_epi16(_mm_and_si128(in, v_f800), v_d800); // bitmask = 0x0000 if there are no surrogates // = 0xc000 if the last word is a surrogate - const uint32_t surrogates_bitmask = - static_cast(_mm256_movemask_epi8(surrogates_bytemask)); + const uint16_t surrogates_bitmask = + static_cast(_mm_movemask_epi8(surrogates_bytemask)); // It might seem like checking for surrogates_bitmask == 0xc000 could help. // However, it is likely an uncommon occurrence. - if (surrogates_bitmask == 0x00000000) { - // case: we extend all sixteen 16-bit code units to sixteen 32-bit code - // units - _mm256_storeu_si256(reinterpret_cast<__m256i *>(utf32_output), - _mm256_cvtepu16_epi32(_mm256_castsi256_si128(in))); - _mm256_storeu_si256( - reinterpret_cast<__m256i *>(utf32_output + 8), - _mm256_cvtepu16_epi32(_mm256_extractf128_si256(in, 1))); - utf32_output += 16; - buf += 16; + if (surrogates_bitmask == 0x0000) { + // case: no surrogate pair, extend 16-bit code units to 32-bit code units + _mm_storeu_si128(reinterpret_cast<__m128i *>(utf32_output), + _mm_cvtepu16_epi32(in)); + _mm_storeu_si128(reinterpret_cast<__m128i *>(utf32_output + 4), + _mm_cvtepu16_epi32(_mm_srli_si128(in, 8))); + utf32_output += 8; + buf += 8; // surrogate pair(s) in a register } else { // Let us do a scalar fallback. @@ -26986,7 +39930,6 @@ avx2_convert_utf16_to_utf32(const char16_t *buf, size_t len, for (; k < forward; k++) { uint16_t word = big_endian ? scalar::utf16::swap_bytes(buf[k]) : buf[k]; if ((word & 0xF800) != 0xD800) { - // No surrogate pair *utf32_output++ = char32_t(word); } else { // must be a surrogate pair @@ -27017,44 +39960,43 @@ avx2_convert_utf16_to_utf32(const char16_t *buf, size_t len, */ template std::pair -avx2_convert_utf16_to_utf32_with_errors(const char16_t *buf, size_t len, - char32_t *utf32_output) { +sse_convert_utf16_to_utf32_with_errors(const char16_t *buf, size_t len, + char32_t *utf32_output) { const char16_t *start = buf; const char16_t *end = buf + len; - const __m256i v_f800 = _mm256_set1_epi16((int16_t)0xf800); - const __m256i v_d800 = _mm256_set1_epi16((int16_t)0xd800); - while (end - buf >= 16) { - __m256i in = _mm256_loadu_si256((__m256i *)buf); + const __m128i v_f800 = _mm_set1_epi16((int16_t)0xf800); + const __m128i v_d800 = _mm_set1_epi16((int16_t)0xd800); + + while (end - buf >= 8) { + __m128i in = _mm_loadu_si128((__m128i *)buf); + if (big_endian) { - const __m256i swap = _mm256_setr_epi8( - 1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14, 17, 16, 19, 18, - 21, 20, 23, 22, 25, 24, 27, 26, 29, 28, 31, 30); - in = _mm256_shuffle_epi8(in, swap); + const __m128i swap = + _mm_setr_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14); + in = _mm_shuffle_epi8(in, swap); } // 1. Check if there are any surrogate word in the input chunk. // We have also deal with situation when there is a surrogate word // at the end of a chunk. - const __m256i surrogates_bytemask = - _mm256_cmpeq_epi16(_mm256_and_si256(in, v_f800), v_d800); + const __m128i surrogates_bytemask = + _mm_cmpeq_epi16(_mm_and_si128(in, v_f800), v_d800); // bitmask = 0x0000 if there are no surrogates // = 0xc000 if the last word is a surrogate - const uint32_t surrogates_bitmask = - static_cast(_mm256_movemask_epi8(surrogates_bytemask)); + const uint16_t surrogates_bitmask = + static_cast(_mm_movemask_epi8(surrogates_bytemask)); // It might seem like checking for surrogates_bitmask == 0xc000 could help. // However, it is likely an uncommon occurrence. - if (surrogates_bitmask == 0x00000000) { - // case: we extend all sixteen 16-bit code units to sixteen 32-bit code - // units - _mm256_storeu_si256(reinterpret_cast<__m256i *>(utf32_output), - _mm256_cvtepu16_epi32(_mm256_castsi256_si128(in))); - _mm256_storeu_si256( - reinterpret_cast<__m256i *>(utf32_output + 8), - _mm256_cvtepu16_epi32(_mm256_extractf128_si256(in, 1))); - utf32_output += 16; - buf += 16; + if (surrogates_bitmask == 0x0000) { + // case: no surrogate pair, extend 16-bit code units to 32-bit code units + _mm_storeu_si128(reinterpret_cast<__m128i *>(utf32_output), + _mm_cvtepu16_epi32(in)); + _mm_storeu_si128(reinterpret_cast<__m128i *>(utf32_output + 4), + _mm_cvtepu16_epi32(_mm_srli_si128(in, 8))); + utf32_output += 8; + buf += 8; // surrogate pair(s) in a register } else { // Let us do a scalar fallback. @@ -27068,7 +40010,6 @@ avx2_convert_utf16_to_utf32_with_errors(const char16_t *buf, size_t len, for (; k < forward; k++) { uint16_t word = big_endian ? scalar::utf16::swap_bytes(buf[k]) : buf[k]; if ((word & 0xF800) != 0xD800) { - // No surrogate pair *utf32_output++ = char32_t(word); } else { // must be a surrogate pair @@ -27091,229 +40032,290 @@ avx2_convert_utf16_to_utf32_with_errors(const char16_t *buf, size_t len, } // while return std::make_pair(result(error_code::SUCCESS, buf - start), utf32_output); } -/* end file src/haswell/avx2_convert_utf16_to_utf32.cpp */ +/* end file src/westmere/sse_convert_utf16_to_utf32.cpp */ -/* begin file src/haswell/avx2_convert_utf32_to_latin1.cpp */ +/* begin file src/westmere/sse_convert_utf32_to_latin1.cpp */ std::pair -avx2_convert_utf32_to_latin1(const char32_t *buf, size_t len, - char *latin1_output) { - const size_t rounded_len = - len & ~0x1F; // Round down to nearest multiple of 32 - - __m256i high_bytes_mask = _mm256_set1_epi32(0xFFFFFF00); +sse_convert_utf32_to_latin1(const char32_t *buf, size_t len, + char *latin1_output) { + const size_t rounded_len = len & ~0xF; // Round down to nearest multiple of 16 - __m256i shufmask = _mm256_set_epi8(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 12, 8, 4, 0, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 12, 8, 4, 0); + __m128i high_bytes_mask = _mm_set1_epi32(0xFFFFFF00); + __m128i shufmask = + _mm_set_epi8(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12, 8, 4, 0); for (size_t i = 0; i < rounded_len; i += 16) { - __m256i in1 = _mm256_loadu_si256((__m256i *)buf); - __m256i in2 = _mm256_loadu_si256((__m256i *)(buf + 8)); + __m128i in1 = _mm_loadu_si128((__m128i *)buf); + __m128i in2 = _mm_loadu_si128((__m128i *)(buf + 4)); + __m128i in3 = _mm_loadu_si128((__m128i *)(buf + 8)); + __m128i in4 = _mm_loadu_si128((__m128i *)(buf + 12)); - __m256i check_combined = _mm256_or_si256(in1, in2); + __m128i check_combined = _mm_or_si128(in1, in2); + check_combined = _mm_or_si128(check_combined, in3); + check_combined = _mm_or_si128(check_combined, in4); - if (!_mm256_testz_si256(check_combined, high_bytes_mask)) { + if (!_mm_testz_si128(check_combined, high_bytes_mask)) { return std::make_pair(nullptr, latin1_output); } - - // Turn UTF32 bytes into latin 1 bytes - __m256i shuffled1 = _mm256_shuffle_epi8(in1, shufmask); - __m256i shuffled2 = _mm256_shuffle_epi8(in2, shufmask); - - // move Latin1 bytes to their correct spot - __m256i idx1 = _mm256_set_epi32(-1, -1, -1, -1, -1, -1, 4, 0); - __m256i idx2 = _mm256_set_epi32(-1, -1, -1, -1, 4, 0, -1, -1); - __m256i reshuffled1 = _mm256_permutevar8x32_epi32(shuffled1, idx1); - __m256i reshuffled2 = _mm256_permutevar8x32_epi32(shuffled2, idx2); - - __m256i result = _mm256_or_si256(reshuffled1, reshuffled2); - _mm_storeu_si128((__m128i *)latin1_output, _mm256_castsi256_si128(result)); - + __m128i pack1 = _mm_unpacklo_epi32(_mm_shuffle_epi8(in1, shufmask), + _mm_shuffle_epi8(in2, shufmask)); + __m128i pack2 = _mm_unpacklo_epi32(_mm_shuffle_epi8(in3, shufmask), + _mm_shuffle_epi8(in4, shufmask)); + __m128i pack = _mm_unpacklo_epi64(pack1, pack2); + _mm_storeu_si128((__m128i *)latin1_output, pack); latin1_output += 16; buf += 16; } return std::make_pair(buf, latin1_output); } -std::pair -avx2_convert_utf32_to_latin1_with_errors(const char32_t *buf, size_t len, - char *latin1_output) { - const size_t rounded_len = - len & ~0x1F; // Round down to nearest multiple of 32 - - __m256i high_bytes_mask = _mm256_set1_epi32(0xFFFFFF00); - __m256i shufmask = _mm256_set_epi8(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 12, 8, 4, 0, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 12, 8, 4, 0); +std::pair +sse_convert_utf32_to_latin1_with_errors(const char32_t *buf, size_t len, + char *latin1_output) { const char32_t *start = buf; + const size_t rounded_len = len & ~0xF; // Round down to nearest multiple of 16 + + __m128i high_bytes_mask = _mm_set1_epi32(0xFFFFFF00); + __m128i shufmask = + _mm_set_epi8(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12, 8, 4, 0); for (size_t i = 0; i < rounded_len; i += 16) { - __m256i in1 = _mm256_loadu_si256((__m256i *)buf); - __m256i in2 = _mm256_loadu_si256((__m256i *)(buf + 8)); + __m128i in1 = _mm_loadu_si128((__m128i *)buf); + __m128i in2 = _mm_loadu_si128((__m128i *)(buf + 4)); + __m128i in3 = _mm_loadu_si128((__m128i *)(buf + 8)); + __m128i in4 = _mm_loadu_si128((__m128i *)(buf + 12)); - __m256i check_combined = _mm256_or_si256(in1, in2); + __m128i check_combined = _mm_or_si128(in1, in2); + check_combined = _mm_or_si128(check_combined, in3); + check_combined = _mm_or_si128(check_combined, in4); - if (!_mm256_testz_si256(check_combined, high_bytes_mask)) { + if (!_mm_testz_si128(check_combined, high_bytes_mask)) { // Fallback to scalar code for handling errors - for (int k = 0; k < 8; k++) { + for (int k = 0; k < 16; k++) { char32_t codepoint = buf[k]; - if (codepoint <= 0xFF) { - *latin1_output++ = static_cast(codepoint); + if (codepoint <= 0xff) { + *latin1_output++ = char(codepoint); } else { return std::make_pair(result(error_code::TOO_LARGE, buf - start + k), latin1_output); } } - buf += 8; - } else { - __m256i shuffled1 = _mm256_shuffle_epi8(in1, shufmask); - __m256i shuffled2 = _mm256_shuffle_epi8(in2, shufmask); - - __m256i idx1 = _mm256_set_epi32(-1, -1, -1, -1, -1, -1, 4, 0); - __m256i idx2 = _mm256_set_epi32(-1, -1, -1, -1, 4, 0, -1, -1); - __m256i reshuffled1 = _mm256_permutevar8x32_epi32(shuffled1, idx1); - __m256i reshuffled2 = _mm256_permutevar8x32_epi32(shuffled2, idx2); - - __m256i result = _mm256_or_si256(reshuffled1, reshuffled2); - _mm_storeu_si128((__m128i *)latin1_output, - _mm256_castsi256_si128(result)); - - latin1_output += 16; buf += 16; + continue; } + __m128i pack1 = _mm_unpacklo_epi32(_mm_shuffle_epi8(in1, shufmask), + _mm_shuffle_epi8(in2, shufmask)); + __m128i pack2 = _mm_unpacklo_epi32(_mm_shuffle_epi8(in3, shufmask), + _mm_shuffle_epi8(in4, shufmask)); + __m128i pack = _mm_unpacklo_epi64(pack1, pack2); + _mm_storeu_si128((__m128i *)latin1_output, pack); + latin1_output += 16; + buf += 16; } return std::make_pair(result(error_code::SUCCESS, buf - start), latin1_output); } -/* end file src/haswell/avx2_convert_utf32_to_latin1.cpp */ -/* begin file src/haswell/avx2_convert_utf32_to_utf8.cpp */ +/* end file src/westmere/sse_convert_utf32_to_latin1.cpp */ +/* begin file src/westmere/sse_convert_utf32_to_utf8.cpp */ std::pair -avx2_convert_utf32_to_utf8(const char32_t *buf, size_t len, char *utf8_output) { +sse_convert_utf32_to_utf8(const char32_t *buf, size_t len, char *utf8_output) { const char32_t *end = buf + len; - const __m256i v_0000 = _mm256_setzero_si256(); - const __m256i v_ffff0000 = _mm256_set1_epi32((uint32_t)0xffff0000); - const __m256i v_ff80 = _mm256_set1_epi16((uint16_t)0xff80); - const __m256i v_f800 = _mm256_set1_epi16((uint16_t)0xf800); - const __m256i v_c080 = _mm256_set1_epi16((uint16_t)0xc080); - const __m256i v_7fffffff = _mm256_set1_epi32((uint32_t)0x7fffffff); - __m256i running_max = _mm256_setzero_si256(); - __m256i forbidden_bytemask = _mm256_setzero_si256(); + const __m128i v_0000 = _mm_setzero_si128(); //__m128 = 128 bits + const __m128i v_f800 = _mm_set1_epi16((uint16_t)0xf800); // 1111 1000 0000 + // 0000 + const __m128i v_c080 = _mm_set1_epi16((uint16_t)0xc080); // 1100 0000 1000 + // 0000 + const __m128i v_ff80 = _mm_set1_epi16((uint16_t)0xff80); // 1111 1111 1000 + // 0000 + const __m128i v_ffff0000 = _mm_set1_epi32( + (uint32_t)0xffff0000); // 1111 1111 1111 1111 0000 0000 0000 0000 + const __m128i v_7fffffff = _mm_set1_epi32( + (uint32_t)0x7fffffff); // 0111 1111 1111 1111 1111 1111 1111 1111 + __m128i running_max = _mm_setzero_si128(); + __m128i forbidden_bytemask = _mm_setzero_si128(); const size_t safety_margin = 12; // to avoid overruns, see issue // https://github.com/simdutf/simdutf/issues/92 - while (end - buf >= std::ptrdiff_t(16 + safety_margin)) { - __m256i in = _mm256_loadu_si256((__m256i *)buf); - __m256i nextin = _mm256_loadu_si256((__m256i *)buf + 1); - running_max = _mm256_max_epu32(_mm256_max_epu32(in, running_max), nextin); + while (end - buf >= + std::ptrdiff_t( + 16 + safety_margin)) { // buf is a char32_t pointer, each char32_t + // has 4 bytes or 32 bits, thus buf + 16 * + // char_32t = 512 bits = 64 bytes + // We load two 16 bytes registers for a total of 32 bytes or 16 characters. + __m128i in = _mm_loadu_si128((__m128i *)buf); + __m128i nextin = _mm_loadu_si128( + (__m128i *)buf + 1); // These two values can hold only 8 UTF32 chars + running_max = _mm_max_epu32( + _mm_max_epu32(in, running_max), // take element-wise max char32_t from + // in and running_max vector + nextin); // and take element-wise max element from nextin and + // running_max vector // Pack 32-bit UTF-32 code units to 16-bit UTF-16 code units with unsigned // saturation - __m256i in_16 = _mm256_packus_epi32(_mm256_and_si256(in, v_7fffffff), - _mm256_and_si256(nextin, v_7fffffff)); - in_16 = _mm256_permute4x64_epi64(in_16, 0b11011000); + __m128i in_16 = _mm_packus_epi32( + _mm_and_si128(in, v_7fffffff), + _mm_and_si128( + nextin, + v_7fffffff)); // in this context pack the two __m128 into a single + // By ensuring the highest bit is set to 0(&v_7fffffff), we are making sure + // all values are interpreted as non-negative, or specifically, the values + // are within the range of valid Unicode code points. remember : having + // leading byte 0 means a positive number by the two complements system. + // Unicode is well beneath the range where you'll start getting issues so + // that's OK. - // Try to apply UTF-16 => UTF-8 routine on 256 bits - // (haswell/avx2_convert_utf16_to_utf8.cpp) + // Try to apply UTF-16 => UTF-8 from ./sse_convert_utf16_to_utf8.cpp - if (_mm256_testz_si256(in_16, v_ff80)) { // ASCII fast path!!!! - // 1. pack the bytes - const __m128i utf8_packed = _mm_packus_epi16( - _mm256_castsi256_si128(in_16), _mm256_extractf128_si256(in_16, 1)); - // 2. store (16 bytes) - _mm_storeu_si128((__m128i *)utf8_output, utf8_packed); - // 3. adjust pointers - buf += 16; - utf8_output += 16; - continue; // we are done for this round! + // Check for ASCII fast path + + // ASCII fast path!!!! + // We eagerly load another 32 bytes, hoping that they will be ASCII too. + // The intuition is that we try to collect 16 ASCII characters which + // requires a total of 64 bytes of input. If we fail, we just pass thirdin + // and fourthin as our new inputs. + if (_mm_testz_si128(in_16, v_ff80)) { // if the first two blocks are ASCII + __m128i thirdin = _mm_loadu_si128((__m128i *)buf + 2); + __m128i fourthin = _mm_loadu_si128((__m128i *)buf + 3); + running_max = _mm_max_epu32( + _mm_max_epu32(thirdin, running_max), + fourthin); // take the running max of all 4 vectors thus far + __m128i nextin_16 = _mm_packus_epi32( + _mm_and_si128(thirdin, v_7fffffff), + _mm_and_si128(fourthin, + v_7fffffff)); // pack into 1 vector, now you have two + if (!_mm_testz_si128( + nextin_16, + v_ff80)) { // checks if the second packed vector is ASCII, if not: + // 1. pack the bytes + // obviously suboptimal. + const __m128i utf8_packed = _mm_packus_epi16( + in_16, in_16); // creates two copy of in_16 in 1 vector + // 2. store (16 bytes) + _mm_storeu_si128((__m128i *)utf8_output, + utf8_packed); // put them into the output + // 3. adjust pointers + buf += 8; // the char32_t buffer pointer goes up 8 char32_t chars* 32 + // bits = 256 bits + utf8_output += + 8; // same with output, e.g. lift the first two blocks alone. + // Proceed with next input + in_16 = nextin_16; + // We need to update in and nextin because they are used later. + in = thirdin; + nextin = fourthin; + } else { + // 1. pack the bytes + const __m128i utf8_packed = _mm_packus_epi16(in_16, nextin_16); + // 2. store (16 bytes) + _mm_storeu_si128((__m128i *)utf8_output, utf8_packed); + // 3. adjust pointers + buf += 16; + utf8_output += 16; + continue; // we are done for this round! + } } - // no bits set above 7th bit - const __m256i one_byte_bytemask = - _mm256_cmpeq_epi16(_mm256_and_si256(in_16, v_ff80), v_0000); - const uint32_t one_byte_bitmask = - static_cast(_mm256_movemask_epi8(one_byte_bytemask)); + + // no bits set above 7th bit -- find out all the ASCII characters + const __m128i one_byte_bytemask = + _mm_cmpeq_epi16( // this takes four bytes at a time and compares: + _mm_and_si128(in_16, v_ff80), // the vector that get only the first + // 9 bits of each 16-bit/2-byte units + v_0000 // + ); // they should be all zero if they are ASCII. E.g. ASCII in UTF32 is + // of format 0000 0000 0000 0XXX XXXX + // _mm_cmpeq_epi16 should now return a 1111 1111 1111 1111 for equals, and + // 0000 0000 0000 0000 if not for each 16-bit/2-byte units + const uint16_t one_byte_bitmask = static_cast(_mm_movemask_epi8( + one_byte_bytemask)); // collect the MSB from previous vector and put + // them into uint16_t mas // no bits set above 11th bit - const __m256i one_or_two_bytes_bytemask = - _mm256_cmpeq_epi16(_mm256_and_si256(in_16, v_f800), v_0000); - const uint32_t one_or_two_bytes_bitmask = - static_cast(_mm256_movemask_epi8(one_or_two_bytes_bytemask)); - if (one_or_two_bytes_bitmask == 0xffffffff) { + const __m128i one_or_two_bytes_bytemask = + _mm_cmpeq_epi16(_mm_and_si128(in_16, v_f800), v_0000); + const uint16_t one_or_two_bytes_bitmask = + static_cast(_mm_movemask_epi8(one_or_two_bytes_bytemask)); + + if (one_or_two_bytes_bitmask == 0xffff) { + // case: all code units either produce 1 or 2 UTF-8 bytes (at least one + // produces 2 bytes) // 1. prepare 2-byte values // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8 // expected output : [110a|aaaa|10bb|bbbb] x 8 - const __m256i v_1f00 = _mm256_set1_epi16((int16_t)0x1f00); - const __m256i v_003f = _mm256_set1_epi16((int16_t)0x003f); + const __m128i v_1f00 = + _mm_set1_epi16((int16_t)0x1f00); // 0001 1111 0000 0000 + const __m128i v_003f = + _mm_set1_epi16((int16_t)0x003f); // 0000 0000 0011 1111 // t0 = [000a|aaaa|bbbb|bb00] - const __m256i t0 = _mm256_slli_epi16(in_16, 2); + const __m128i t0 = _mm_slli_epi16(in_16, 2); // shift packed vector by two // t1 = [000a|aaaa|0000|0000] - const __m256i t1 = _mm256_and_si256(t0, v_1f00); + const __m128i t1 = + _mm_and_si128(t0, v_1f00); // potentital first utf8 byte // t2 = [0000|0000|00bb|bbbb] - const __m256i t2 = _mm256_and_si256(in_16, v_003f); + const __m128i t2 = + _mm_and_si128(in_16, v_003f); // potential second utf8 byte // t3 = [000a|aaaa|00bb|bbbb] - const __m256i t3 = _mm256_or_si256(t1, t2); + const __m128i t3 = + _mm_or_si128(t1, t2); // first and second potential utf8 byte together // t4 = [110a|aaaa|10bb|bbbb] - const __m256i t4 = _mm256_or_si256(t3, v_c080); + const __m128i t4 = _mm_or_si128( + t3, + v_c080); // t3 | 1100 0000 1000 0000 = full potential 2-byte utf8 unit // 2. merge ASCII and 2-byte codewords - const __m256i utf8_unpacked = - _mm256_blendv_epi8(t4, in_16, one_byte_bytemask); + const __m128i utf8_unpacked = + _mm_blendv_epi8(t4, in_16, one_byte_bytemask); // 3. prepare bitmask for 8-bit lookup - const uint32_t M0 = one_byte_bitmask & 0x55555555; - const uint32_t M1 = M0 >> 7; - const uint32_t M2 = (M1 | M0) & 0x00ff00ff; + // one_byte_bitmask = hhggffeeddccbbaa -- the bits are doubled (h - + // MSB, a - LSB) + const uint16_t m0 = one_byte_bitmask & 0x5555; // m0 = 0h0g0f0e0d0c0b0a + const uint16_t m1 = + static_cast(m0 >> 7); // m1 = 00000000h0g0f0e0 + const uint8_t m2 = + static_cast((m0 | m1) & 0xff); // m2 = hdgcfbea // 4. pack the bytes - const uint8_t *row = - &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[uint8_t(M2)][0]; - const uint8_t *row_2 = - &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[uint8_t(M2 >> - 16)][0]; - + &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[m2][0]; const __m128i shuffle = _mm_loadu_si128((__m128i *)(row + 1)); - const __m128i shuffle_2 = _mm_loadu_si128((__m128i *)(row_2 + 1)); + const __m128i utf8_packed = _mm_shuffle_epi8(utf8_unpacked, shuffle); - const __m256i utf8_packed = _mm256_shuffle_epi8( - utf8_unpacked, _mm256_setr_m128i(shuffle, shuffle_2)); // 5. store bytes - _mm_storeu_si128((__m128i *)utf8_output, - _mm256_castsi256_si128(utf8_packed)); - utf8_output += row[0]; - _mm_storeu_si128((__m128i *)utf8_output, - _mm256_extractf128_si256(utf8_packed, 1)); - utf8_output += row_2[0]; + _mm_storeu_si128((__m128i *)utf8_output, utf8_packed); // 6. adjust pointers - buf += 16; + buf += 8; + utf8_output += row[0]; continue; } - // Must check for overflow in packing - const __m256i saturation_bytemask = _mm256_cmpeq_epi32( - _mm256_and_si256(_mm256_or_si256(in, nextin), v_ffff0000), v_0000); + + // Check for overflow in packing + + const __m128i saturation_bytemask = _mm_cmpeq_epi32( + _mm_and_si128(_mm_or_si128(in, nextin), v_ffff0000), v_0000); const uint32_t saturation_bitmask = - static_cast(_mm256_movemask_epi8(saturation_bytemask)); - if (saturation_bitmask == 0xffffffff) { + static_cast(_mm_movemask_epi8(saturation_bytemask)); + if (saturation_bitmask == 0xffff) { // case: code units from register produce either 1, 2 or 3 UTF-8 bytes - const __m256i v_d800 = _mm256_set1_epi16((uint16_t)0xd800); - forbidden_bytemask = _mm256_or_si256( - forbidden_bytemask, - _mm256_cmpeq_epi16(_mm256_and_si256(in_16, v_f800), v_d800)); + const __m128i v_d800 = _mm_set1_epi16((uint16_t)0xd800); + forbidden_bytemask = + _mm_or_si128(forbidden_bytemask, + _mm_cmpeq_epi16(_mm_and_si128(in_16, v_f800), v_d800)); - const __m256i dup_even = _mm256_setr_epi16( - 0x0000, 0x0202, 0x0404, 0x0606, 0x0808, 0x0a0a, 0x0c0c, 0x0e0e, - 0x0000, 0x0202, 0x0404, 0x0606, 0x0808, 0x0a0a, 0x0c0c, 0x0e0e); + const __m128i dup_even = _mm_setr_epi16(0x0000, 0x0202, 0x0404, 0x0606, + 0x0808, 0x0a0a, 0x0c0c, 0x0e0e); /* In this branch we handle three cases: - 1. [0000|0000|0ccc|cccc] => [0ccc|cccc] - + 1. [0000|0000|0ccc|cccc] => [0ccc|cccc] - single UFT-8 byte - 2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc] - two - UTF-8 bytes - 3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - + 2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc] - + two UTF-8 bytes + 3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - three UTF-8 bytes We expand the input word (16-bit) into two code units (32-bit), thus @@ -27335,95 +40337,72 @@ avx2_convert_utf32_to_utf8(const char32_t *buf, size_t len, char *utf8_output) { * t2 => [0ccc|cccc] [10cc|cccc] * s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb]) */ -#define simdutf_vec(x) _mm256_set1_epi16(static_cast(x)) +#define simdutf_vec(x) _mm_set1_epi16(static_cast(x)) // [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc] - const __m256i t0 = _mm256_shuffle_epi8(in_16, dup_even); + const __m128i t0 = _mm_shuffle_epi8(in_16, dup_even); // [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc] - const __m256i t1 = _mm256_and_si256(t0, simdutf_vec(0b0011111101111111)); + const __m128i t1 = _mm_and_si128(t0, simdutf_vec(0b0011111101111111)); // [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc] - const __m256i t2 = _mm256_or_si256(t1, simdutf_vec(0b1000000000000000)); + const __m128i t2 = _mm_or_si128(t1, simdutf_vec(0b1000000000000000)); // [aaaa|bbbb|bbcc|cccc] => [0000|aaaa|bbbb|bbcc] - const __m256i s0 = _mm256_srli_epi16(in_16, 4); + const __m128i s0 = _mm_srli_epi16(in_16, 4); // [0000|aaaa|bbbb|bbcc] => [0000|aaaa|bbbb|bb00] - const __m256i s1 = _mm256_and_si256(s0, simdutf_vec(0b0000111111111100)); + const __m128i s1 = _mm_and_si128(s0, simdutf_vec(0b0000111111111100)); // [0000|aaaa|bbbb|bb00] => [00bb|bbbb|0000|aaaa] - const __m256i s2 = _mm256_maddubs_epi16(s1, simdutf_vec(0x0140)); + const __m128i s2 = _mm_maddubs_epi16(s1, simdutf_vec(0x0140)); // [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa] - const __m256i s3 = _mm256_or_si256(s2, simdutf_vec(0b1100000011100000)); - const __m256i m0 = _mm256_andnot_si256(one_or_two_bytes_bytemask, - simdutf_vec(0b0100000000000000)); - const __m256i s4 = _mm256_xor_si256(s3, m0); + const __m128i s3 = _mm_or_si128(s2, simdutf_vec(0b1100000011100000)); + const __m128i m0 = _mm_andnot_si128(one_or_two_bytes_bytemask, + simdutf_vec(0b0100000000000000)); + const __m128i s4 = _mm_xor_si128(s3, m0); #undef simdutf_vec // 4. expand code units 16-bit => 32-bit - const __m256i out0 = _mm256_unpacklo_epi16(t2, s4); - const __m256i out1 = _mm256_unpackhi_epi16(t2, s4); + const __m128i out0 = _mm_unpacklo_epi16(t2, s4); + const __m128i out1 = _mm_unpackhi_epi16(t2, s4); // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle - const uint32_t mask = (one_byte_bitmask & 0x55555555) | - (one_or_two_bytes_bitmask & 0xaaaaaaaa); - // Due to the wider registers, the following path is less likely to be - // useful. - /*if(mask == 0) { + const uint16_t mask = + (one_byte_bitmask & 0x5555) | (one_or_two_bytes_bitmask & 0xaaaa); + if (mask == 0) { // We only have three-byte code units. Use fast path. - const __m256i shuffle = - _mm256_setr_epi8(2,3,1,6,7,5,10,11,9,14,15,13,-1,-1,-1,-1, - 2,3,1,6,7,5,10,11,9,14,15,13,-1,-1,-1,-1); const __m256i utf8_0 = - _mm256_shuffle_epi8(out0, shuffle); const __m256i utf8_1 = - _mm256_shuffle_epi8(out1, shuffle); - _mm_storeu_si128((__m128i*)utf8_output, _mm256_castsi256_si128(utf8_0)); + const __m128i shuffle = _mm_setr_epi8(2, 3, 1, 6, 7, 5, 10, 11, 9, 14, + 15, 13, -1, -1, -1, -1); + const __m128i utf8_0 = _mm_shuffle_epi8(out0, shuffle); + const __m128i utf8_1 = _mm_shuffle_epi8(out1, shuffle); + _mm_storeu_si128((__m128i *)utf8_output, utf8_0); utf8_output += 12; - _mm_storeu_si128((__m128i*)utf8_output, _mm256_castsi256_si128(utf8_1)); + _mm_storeu_si128((__m128i *)utf8_output, utf8_1); utf8_output += 12; - _mm_storeu_si128((__m128i*)utf8_output, - _mm256_extractf128_si256(utf8_0,1)); utf8_output += 12; - _mm_storeu_si128((__m128i*)utf8_output, - _mm256_extractf128_si256(utf8_1,1)); utf8_output += 12; buf += 16; + buf += 8; continue; - }*/ + } const uint8_t mask0 = uint8_t(mask); + const uint8_t *row0 = &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask0][0]; const __m128i shuffle0 = _mm_loadu_si128((__m128i *)(row0 + 1)); - const __m128i utf8_0 = - _mm_shuffle_epi8(_mm256_castsi256_si128(out0), shuffle0); + const __m128i utf8_0 = _mm_shuffle_epi8(out0, shuffle0); const uint8_t mask1 = static_cast(mask >> 8); + const uint8_t *row1 = &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask1][0]; const __m128i shuffle1 = _mm_loadu_si128((__m128i *)(row1 + 1)); - const __m128i utf8_1 = - _mm_shuffle_epi8(_mm256_castsi256_si128(out1), shuffle1); - - const uint8_t mask2 = static_cast(mask >> 16); - const uint8_t *row2 = - &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask2][0]; - const __m128i shuffle2 = _mm_loadu_si128((__m128i *)(row2 + 1)); - const __m128i utf8_2 = - _mm_shuffle_epi8(_mm256_extractf128_si256(out0, 1), shuffle2); - - const uint8_t mask3 = static_cast(mask >> 24); - const uint8_t *row3 = - &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask3][0]; - const __m128i shuffle3 = _mm_loadu_si128((__m128i *)(row3 + 1)); - const __m128i utf8_3 = - _mm_shuffle_epi8(_mm256_extractf128_si256(out1, 1), shuffle3); + const __m128i utf8_1 = _mm_shuffle_epi8(out1, shuffle1); _mm_storeu_si128((__m128i *)utf8_output, utf8_0); utf8_output += row0[0]; _mm_storeu_si128((__m128i *)utf8_output, utf8_1); utf8_output += row1[0]; - _mm_storeu_si128((__m128i *)utf8_output, utf8_2); - utf8_output += row2[0]; - _mm_storeu_si128((__m128i *)utf8_output, utf8_3); - utf8_output += row3[0]; - buf += 16; + + buf += 8; } else { - // case: at least one 32-bit word is larger than 0xFFFF <=> it will - // produce four UTF-8 bytes. Let us do a scalar fallback. It may seem - // wasteful to use scalar code, but being efficient with SIMD may require - // large, non-trivial tables? + // case: at least one 32-bit word produce a surrogate pair in UTF-16 <=> + // will produce four UTF-8 bytes Let us do a scalar fallback. It may seem + // wasteful to use scalar code, but being efficient with SIMD in the + // presence of surrogate pairs may require non-trivial tables. size_t forward = 15; size_t k = 0; if (size_t(end - buf) < forward + 1) { @@ -27431,19 +40410,19 @@ avx2_convert_utf32_to_utf8(const char32_t *buf, size_t len, char *utf8_output) { } for (; k < forward; k++) { uint32_t word = buf[k]; - if ((word & 0xFFFFFF80) == 0) { // 1-byte (ASCII) + if ((word & 0xFFFFFF80) == 0) { *utf8_output++ = char(word); - } else if ((word & 0xFFFFF800) == 0) { // 2-byte + } else if ((word & 0xFFFFF800) == 0) { *utf8_output++ = char((word >> 6) | 0b11000000); *utf8_output++ = char((word & 0b111111) | 0b10000000); - } else if ((word & 0xFFFF0000) == 0) { // 3-byte + } else if ((word & 0xFFFF0000) == 0) { if (word >= 0xD800 && word <= 0xDFFF) { return std::make_pair(nullptr, utf8_output); } *utf8_output++ = char((word >> 12) | 0b11100000); *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); *utf8_output++ = char((word & 0b111111) | 0b10000000); - } else { // 4-byte + } else { if (word > 0x10FFFF) { return std::make_pair(nullptr, utf8_output); } @@ -27458,13 +40437,13 @@ avx2_convert_utf32_to_utf8(const char32_t *buf, size_t len, char *utf8_output) { } // while // check for invalid input - const __m256i v_10ffff = _mm256_set1_epi32((uint32_t)0x10ffff); - if (static_cast(_mm256_movemask_epi8(_mm256_cmpeq_epi32( - _mm256_max_epu32(running_max, v_10ffff), v_10ffff))) != 0xffffffff) { + const __m128i v_10ffff = _mm_set1_epi32((uint32_t)0x10ffff); + if (static_cast(_mm_movemask_epi8(_mm_cmpeq_epi32( + _mm_max_epu32(running_max, v_10ffff), v_10ffff))) != 0xffff) { return std::make_pair(nullptr, utf8_output); } - if (static_cast(_mm256_movemask_epi8(forbidden_bytemask)) != 0) { + if (static_cast(_mm_movemask_epi8(forbidden_bytemask)) != 0) { return std::make_pair(nullptr, utf8_output); } @@ -27472,145 +40451,141 @@ avx2_convert_utf32_to_utf8(const char32_t *buf, size_t len, char *utf8_output) { } std::pair -avx2_convert_utf32_to_utf8_with_errors(const char32_t *buf, size_t len, - char *utf8_output) { +sse_convert_utf32_to_utf8_with_errors(const char32_t *buf, size_t len, + char *utf8_output) { const char32_t *end = buf + len; const char32_t *start = buf; - const __m256i v_0000 = _mm256_setzero_si256(); - const __m256i v_ffff0000 = _mm256_set1_epi32((uint32_t)0xffff0000); - const __m256i v_ff80 = _mm256_set1_epi16((uint16_t)0xff80); - const __m256i v_f800 = _mm256_set1_epi16((uint16_t)0xf800); - const __m256i v_c080 = _mm256_set1_epi16((uint16_t)0xc080); - const __m256i v_7fffffff = _mm256_set1_epi32((uint32_t)0x7fffffff); - const __m256i v_10ffff = _mm256_set1_epi32((uint32_t)0x10ffff); + const __m128i v_0000 = _mm_setzero_si128(); + const __m128i v_f800 = _mm_set1_epi16((uint16_t)0xf800); + const __m128i v_c080 = _mm_set1_epi16((uint16_t)0xc080); + const __m128i v_ff80 = _mm_set1_epi16((uint16_t)0xff80); + const __m128i v_ffff0000 = _mm_set1_epi32((uint32_t)0xffff0000); + const __m128i v_7fffffff = _mm_set1_epi32((uint32_t)0x7fffffff); + const __m128i v_10ffff = _mm_set1_epi32((uint32_t)0x10ffff); const size_t safety_margin = 12; // to avoid overruns, see issue // https://github.com/simdutf/simdutf/issues/92 while (end - buf >= std::ptrdiff_t(16 + safety_margin)) { - __m256i in = _mm256_loadu_si256((__m256i *)buf); - __m256i nextin = _mm256_loadu_si256((__m256i *)buf + 1); + // We load two 16 bytes registers for a total of 32 bytes or 8 characters. + __m128i in = _mm_loadu_si128((__m128i *)buf); + __m128i nextin = _mm_loadu_si128((__m128i *)buf + 1); // Check for too large input - const __m256i max_input = - _mm256_max_epu32(_mm256_max_epu32(in, nextin), v_10ffff); - if (static_cast(_mm256_movemask_epi8( - _mm256_cmpeq_epi32(max_input, v_10ffff))) != 0xffffffff) { + __m128i max_input = _mm_max_epu32(_mm_max_epu32(in, nextin), v_10ffff); + if (static_cast(_mm_movemask_epi8( + _mm_cmpeq_epi32(max_input, v_10ffff))) != 0xffff) { return std::make_pair(result(error_code::TOO_LARGE, buf - start), utf8_output); } // Pack 32-bit UTF-32 code units to 16-bit UTF-16 code units with unsigned // saturation - __m256i in_16 = _mm256_packus_epi32(_mm256_and_si256(in, v_7fffffff), - _mm256_and_si256(nextin, v_7fffffff)); - in_16 = _mm256_permute4x64_epi64(in_16, 0b11011000); + __m128i in_16 = _mm_packus_epi32(_mm_and_si128(in, v_7fffffff), + _mm_and_si128(nextin, v_7fffffff)); - // Try to apply UTF-16 => UTF-8 routine on 256 bits - // (haswell/avx2_convert_utf16_to_utf8.cpp) + // Try to apply UTF-16 => UTF-8 from ./sse_convert_utf16_to_utf8.cpp - if (_mm256_testz_si256(in_16, v_ff80)) { // ASCII fast path!!!! + // Check for ASCII fast path + if (_mm_testz_si128(in_16, v_ff80)) { // ASCII fast path!!!! // 1. pack the bytes - const __m128i utf8_packed = _mm_packus_epi16( - _mm256_castsi256_si128(in_16), _mm256_extractf128_si256(in_16, 1)); + // obviously suboptimal. + const __m128i utf8_packed = _mm_packus_epi16(in_16, in_16); // 2. store (16 bytes) _mm_storeu_si128((__m128i *)utf8_output, utf8_packed); // 3. adjust pointers - buf += 16; - utf8_output += 16; - continue; // we are done for this round! + buf += 8; + utf8_output += 8; + continue; } + // no bits set above 7th bit - const __m256i one_byte_bytemask = - _mm256_cmpeq_epi16(_mm256_and_si256(in_16, v_ff80), v_0000); - const uint32_t one_byte_bitmask = - static_cast(_mm256_movemask_epi8(one_byte_bytemask)); + const __m128i one_byte_bytemask = + _mm_cmpeq_epi16(_mm_and_si128(in_16, v_ff80), v_0000); + const uint16_t one_byte_bitmask = + static_cast(_mm_movemask_epi8(one_byte_bytemask)); // no bits set above 11th bit - const __m256i one_or_two_bytes_bytemask = - _mm256_cmpeq_epi16(_mm256_and_si256(in_16, v_f800), v_0000); - const uint32_t one_or_two_bytes_bitmask = - static_cast(_mm256_movemask_epi8(one_or_two_bytes_bytemask)); - if (one_or_two_bytes_bitmask == 0xffffffff) { + const __m128i one_or_two_bytes_bytemask = + _mm_cmpeq_epi16(_mm_and_si128(in_16, v_f800), v_0000); + const uint16_t one_or_two_bytes_bitmask = + static_cast(_mm_movemask_epi8(one_or_two_bytes_bytemask)); + + if (one_or_two_bytes_bitmask == 0xffff) { + // case: all code units either produce 1 or 2 UTF-8 bytes (at least one + // produces 2 bytes) // 1. prepare 2-byte values // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8 // expected output : [110a|aaaa|10bb|bbbb] x 8 - const __m256i v_1f00 = _mm256_set1_epi16((int16_t)0x1f00); - const __m256i v_003f = _mm256_set1_epi16((int16_t)0x003f); + const __m128i v_1f00 = _mm_set1_epi16((int16_t)0x1f00); + const __m128i v_003f = _mm_set1_epi16((int16_t)0x003f); // t0 = [000a|aaaa|bbbb|bb00] - const __m256i t0 = _mm256_slli_epi16(in_16, 2); + const __m128i t0 = _mm_slli_epi16(in_16, 2); // t1 = [000a|aaaa|0000|0000] - const __m256i t1 = _mm256_and_si256(t0, v_1f00); + const __m128i t1 = _mm_and_si128(t0, v_1f00); // t2 = [0000|0000|00bb|bbbb] - const __m256i t2 = _mm256_and_si256(in_16, v_003f); + const __m128i t2 = _mm_and_si128(in_16, v_003f); // t3 = [000a|aaaa|00bb|bbbb] - const __m256i t3 = _mm256_or_si256(t1, t2); + const __m128i t3 = _mm_or_si128(t1, t2); // t4 = [110a|aaaa|10bb|bbbb] - const __m256i t4 = _mm256_or_si256(t3, v_c080); + const __m128i t4 = _mm_or_si128(t3, v_c080); // 2. merge ASCII and 2-byte codewords - const __m256i utf8_unpacked = - _mm256_blendv_epi8(t4, in_16, one_byte_bytemask); + const __m128i utf8_unpacked = + _mm_blendv_epi8(t4, in_16, one_byte_bytemask); // 3. prepare bitmask for 8-bit lookup - const uint32_t M0 = one_byte_bitmask & 0x55555555; - const uint32_t M1 = M0 >> 7; - const uint32_t M2 = (M1 | M0) & 0x00ff00ff; + // one_byte_bitmask = hhggffeeddccbbaa -- the bits are doubled (h - + // MSB, a - LSB) + const uint16_t m0 = one_byte_bitmask & 0x5555; // m0 = 0h0g0f0e0d0c0b0a + const uint16_t m1 = + static_cast(m0 >> 7); // m1 = 00000000h0g0f0e0 + const uint8_t m2 = + static_cast((m0 | m1) & 0xff); // m2 = hdgcfbea // 4. pack the bytes - const uint8_t *row = - &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[uint8_t(M2)][0]; - const uint8_t *row_2 = - &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[uint8_t(M2 >> - 16)][0]; - - const __m128i shuffle = _mm_loadu_si128((__m128i *)(row + 1)); - const __m128i shuffle_2 = _mm_loadu_si128((__m128i *)(row_2 + 1)); - - const __m256i utf8_packed = _mm256_shuffle_epi8( - utf8_unpacked, _mm256_setr_m128i(shuffle, shuffle_2)); - // 5. store bytes - _mm_storeu_si128((__m128i *)utf8_output, - _mm256_castsi256_si128(utf8_packed)); - utf8_output += row[0]; - _mm_storeu_si128((__m128i *)utf8_output, - _mm256_extractf128_si256(utf8_packed, 1)); - utf8_output += row_2[0]; + &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[m2][0]; + const __m128i shuffle = _mm_loadu_si128((__m128i *)(row + 1)); + const __m128i utf8_packed = _mm_shuffle_epi8(utf8_unpacked, shuffle); + + // 5. store bytes + _mm_storeu_si128((__m128i *)utf8_output, utf8_packed); // 6. adjust pointers - buf += 16; + buf += 8; + utf8_output += row[0]; continue; } - // Must check for overflow in packing - const __m256i saturation_bytemask = _mm256_cmpeq_epi32( - _mm256_and_si256(_mm256_or_si256(in, nextin), v_ffff0000), v_0000); + + // Check for overflow in packing + const __m128i saturation_bytemask = _mm_cmpeq_epi32( + _mm_and_si128(_mm_or_si128(in, nextin), v_ffff0000), v_0000); const uint32_t saturation_bitmask = - static_cast(_mm256_movemask_epi8(saturation_bytemask)); - if (saturation_bitmask == 0xffffffff) { + static_cast(_mm_movemask_epi8(saturation_bytemask)); + + if (saturation_bitmask == 0xffff) { // case: code units from register produce either 1, 2 or 3 UTF-8 bytes // Check for illegal surrogate code units - const __m256i v_d800 = _mm256_set1_epi16((uint16_t)0xd800); - const __m256i forbidden_bytemask = - _mm256_cmpeq_epi16(_mm256_and_si256(in_16, v_f800), v_d800); - if (static_cast(_mm256_movemask_epi8(forbidden_bytemask)) != - 0x0) { + const __m128i v_d800 = _mm_set1_epi16((uint16_t)0xd800); + const __m128i forbidden_bytemask = + _mm_cmpeq_epi16(_mm_and_si128(in_16, v_f800), v_d800); + if (static_cast(_mm_movemask_epi8(forbidden_bytemask)) != 0) { return std::make_pair(result(error_code::SURROGATE, buf - start), utf8_output); } - const __m256i dup_even = _mm256_setr_epi16( - 0x0000, 0x0202, 0x0404, 0x0606, 0x0808, 0x0a0a, 0x0c0c, 0x0e0e, - 0x0000, 0x0202, 0x0404, 0x0606, 0x0808, 0x0a0a, 0x0c0c, 0x0e0e); + const __m128i dup_even = _mm_setr_epi16(0x0000, 0x0202, 0x0404, 0x0606, + 0x0808, 0x0a0a, 0x0c0c, 0x0e0e); /* In this branch we handle three cases: - 1. [0000|0000|0ccc|cccc] => [0ccc|cccc] - + 1. [0000|0000|0ccc|cccc] => [0ccc|cccc] - single UFT-8 byte - 2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc] - two - UTF-8 bytes - 3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - + 2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc] - + two UTF-8 bytes + 3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - three UTF-8 bytes We expand the input word (16-bit) into two code units (32-bit), thus @@ -27632,95 +40607,72 @@ avx2_convert_utf32_to_utf8_with_errors(const char32_t *buf, size_t len, * t2 => [0ccc|cccc] [10cc|cccc] * s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb]) */ -#define simdutf_vec(x) _mm256_set1_epi16(static_cast(x)) +#define simdutf_vec(x) _mm_set1_epi16(static_cast(x)) // [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc] - const __m256i t0 = _mm256_shuffle_epi8(in_16, dup_even); + const __m128i t0 = _mm_shuffle_epi8(in_16, dup_even); // [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc] - const __m256i t1 = _mm256_and_si256(t0, simdutf_vec(0b0011111101111111)); + const __m128i t1 = _mm_and_si128(t0, simdutf_vec(0b0011111101111111)); // [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc] - const __m256i t2 = _mm256_or_si256(t1, simdutf_vec(0b1000000000000000)); + const __m128i t2 = _mm_or_si128(t1, simdutf_vec(0b1000000000000000)); // [aaaa|bbbb|bbcc|cccc] => [0000|aaaa|bbbb|bbcc] - const __m256i s0 = _mm256_srli_epi16(in_16, 4); + const __m128i s0 = _mm_srli_epi16(in_16, 4); // [0000|aaaa|bbbb|bbcc] => [0000|aaaa|bbbb|bb00] - const __m256i s1 = _mm256_and_si256(s0, simdutf_vec(0b0000111111111100)); + const __m128i s1 = _mm_and_si128(s0, simdutf_vec(0b0000111111111100)); // [0000|aaaa|bbbb|bb00] => [00bb|bbbb|0000|aaaa] - const __m256i s2 = _mm256_maddubs_epi16(s1, simdutf_vec(0x0140)); + const __m128i s2 = _mm_maddubs_epi16(s1, simdutf_vec(0x0140)); // [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa] - const __m256i s3 = _mm256_or_si256(s2, simdutf_vec(0b1100000011100000)); - const __m256i m0 = _mm256_andnot_si256(one_or_two_bytes_bytemask, - simdutf_vec(0b0100000000000000)); - const __m256i s4 = _mm256_xor_si256(s3, m0); + const __m128i s3 = _mm_or_si128(s2, simdutf_vec(0b1100000011100000)); + const __m128i m0 = _mm_andnot_si128(one_or_two_bytes_bytemask, + simdutf_vec(0b0100000000000000)); + const __m128i s4 = _mm_xor_si128(s3, m0); #undef simdutf_vec // 4. expand code units 16-bit => 32-bit - const __m256i out0 = _mm256_unpacklo_epi16(t2, s4); - const __m256i out1 = _mm256_unpackhi_epi16(t2, s4); + const __m128i out0 = _mm_unpacklo_epi16(t2, s4); + const __m128i out1 = _mm_unpackhi_epi16(t2, s4); // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle - const uint32_t mask = (one_byte_bitmask & 0x55555555) | - (one_or_two_bytes_bitmask & 0xaaaaaaaa); - // Due to the wider registers, the following path is less likely to be - // useful. - /*if(mask == 0) { + const uint16_t mask = + (one_byte_bitmask & 0x5555) | (one_or_two_bytes_bitmask & 0xaaaa); + if (mask == 0) { // We only have three-byte code units. Use fast path. - const __m256i shuffle = - _mm256_setr_epi8(2,3,1,6,7,5,10,11,9,14,15,13,-1,-1,-1,-1, - 2,3,1,6,7,5,10,11,9,14,15,13,-1,-1,-1,-1); const __m256i utf8_0 = - _mm256_shuffle_epi8(out0, shuffle); const __m256i utf8_1 = - _mm256_shuffle_epi8(out1, shuffle); - _mm_storeu_si128((__m128i*)utf8_output, _mm256_castsi256_si128(utf8_0)); + const __m128i shuffle = _mm_setr_epi8(2, 3, 1, 6, 7, 5, 10, 11, 9, 14, + 15, 13, -1, -1, -1, -1); + const __m128i utf8_0 = _mm_shuffle_epi8(out0, shuffle); + const __m128i utf8_1 = _mm_shuffle_epi8(out1, shuffle); + _mm_storeu_si128((__m128i *)utf8_output, utf8_0); utf8_output += 12; - _mm_storeu_si128((__m128i*)utf8_output, _mm256_castsi256_si128(utf8_1)); + _mm_storeu_si128((__m128i *)utf8_output, utf8_1); utf8_output += 12; - _mm_storeu_si128((__m128i*)utf8_output, - _mm256_extractf128_si256(utf8_0,1)); utf8_output += 12; - _mm_storeu_si128((__m128i*)utf8_output, - _mm256_extractf128_si256(utf8_1,1)); utf8_output += 12; buf += 16; + buf += 8; continue; - }*/ + } const uint8_t mask0 = uint8_t(mask); + const uint8_t *row0 = &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask0][0]; const __m128i shuffle0 = _mm_loadu_si128((__m128i *)(row0 + 1)); - const __m128i utf8_0 = - _mm_shuffle_epi8(_mm256_castsi256_si128(out0), shuffle0); + const __m128i utf8_0 = _mm_shuffle_epi8(out0, shuffle0); const uint8_t mask1 = static_cast(mask >> 8); + const uint8_t *row1 = &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask1][0]; const __m128i shuffle1 = _mm_loadu_si128((__m128i *)(row1 + 1)); - const __m128i utf8_1 = - _mm_shuffle_epi8(_mm256_castsi256_si128(out1), shuffle1); - - const uint8_t mask2 = static_cast(mask >> 16); - const uint8_t *row2 = - &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask2][0]; - const __m128i shuffle2 = _mm_loadu_si128((__m128i *)(row2 + 1)); - const __m128i utf8_2 = - _mm_shuffle_epi8(_mm256_extractf128_si256(out0, 1), shuffle2); - - const uint8_t mask3 = static_cast(mask >> 24); - const uint8_t *row3 = - &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask3][0]; - const __m128i shuffle3 = _mm_loadu_si128((__m128i *)(row3 + 1)); - const __m128i utf8_3 = - _mm_shuffle_epi8(_mm256_extractf128_si256(out1, 1), shuffle3); + const __m128i utf8_1 = _mm_shuffle_epi8(out1, shuffle1); _mm_storeu_si128((__m128i *)utf8_output, utf8_0); utf8_output += row0[0]; _mm_storeu_si128((__m128i *)utf8_output, utf8_1); utf8_output += row1[0]; - _mm_storeu_si128((__m128i *)utf8_output, utf8_2); - utf8_output += row2[0]; - _mm_storeu_si128((__m128i *)utf8_output, utf8_3); - utf8_output += row3[0]; - buf += 16; + + buf += 8; } else { - // case: at least one 32-bit word is larger than 0xFFFF <=> it will - // produce four UTF-8 bytes. Let us do a scalar fallback. It may seem - // wasteful to use scalar code, but being efficient with SIMD may require - // large, non-trivial tables? + // case: at least one 32-bit word produce a surrogate pair in UTF-16 <=> + // will produce four UTF-8 bytes Let us do a scalar fallback. It may seem + // wasteful to use scalar code, but being efficient with SIMD in the + // presence of surrogate pairs may require non-trivial tables. size_t forward = 15; size_t k = 0; if (size_t(end - buf) < forward + 1) { @@ -27728,12 +40680,12 @@ avx2_convert_utf32_to_utf8_with_errors(const char32_t *buf, size_t len, } for (; k < forward; k++) { uint32_t word = buf[k]; - if ((word & 0xFFFFFF80) == 0) { // 1-byte (ASCII) + if ((word & 0xFFFFFF80) == 0) { *utf8_output++ = char(word); - } else if ((word & 0xFFFFF800) == 0) { // 2-byte + } else if ((word & 0xFFFFF800) == 0) { *utf8_output++ = char((word >> 6) | 0b11000000); *utf8_output++ = char((word & 0b111111) | 0b10000000); - } else if ((word & 0xFFFF0000) == 0) { // 3-byte + } else if ((word & 0xFFFF0000) == 0) { if (word >= 0xD800 && word <= 0xDFFF) { return std::make_pair( result(error_code::SURROGATE, buf - start + k), utf8_output); @@ -27741,7 +40693,7 @@ avx2_convert_utf32_to_utf8_with_errors(const char32_t *buf, size_t len, *utf8_output++ = char((word >> 12) | 0b11100000); *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); *utf8_output++ = char((word & 0b111111) | 0b10000000); - } else { // 4-byte + } else { if (word > 0x10FFFF) { return std::make_pair( result(error_code::TOO_LARGE, buf - start + k), utf8_output); @@ -27755,48 +40707,46 @@ avx2_convert_utf32_to_utf8_with_errors(const char32_t *buf, size_t len, buf += k; } } // while - return std::make_pair(result(error_code::SUCCESS, buf - start), utf8_output); } -/* end file src/haswell/avx2_convert_utf32_to_utf8.cpp */ -/* begin file src/haswell/avx2_convert_utf32_to_utf16.cpp */ +/* end file src/westmere/sse_convert_utf32_to_utf8.cpp */ +/* begin file src/westmere/sse_convert_utf32_to_utf16.cpp */ template std::pair -avx2_convert_utf32_to_utf16(const char32_t *buf, size_t len, - char16_t *utf16_output) { - const char32_t *end = buf + len; - - const size_t safety_margin = - 12; // to avoid overruns, see issue - // https://github.com/simdutf/simdutf/issues/92 - __m256i forbidden_bytemask = _mm256_setzero_si256(); +sse_convert_utf32_to_utf16(const char32_t *buf, size_t len, + char16_t *utf16_output) { - while (end - buf >= std::ptrdiff_t(8 + safety_margin)) { - __m256i in = _mm256_loadu_si256((__m256i *)buf); + const char32_t *end = buf + len; - const __m256i v_00000000 = _mm256_setzero_si256(); - const __m256i v_ffff0000 = _mm256_set1_epi32((int32_t)0xffff0000); + const __m128i v_0000 = _mm_setzero_si128(); + const __m128i v_ffff0000 = _mm_set1_epi32((int32_t)0xffff0000); + __m128i forbidden_bytemask = _mm_setzero_si128(); - // no bits set above 16th bit <=> can pack to UTF16 without surrogate pairs - const __m256i saturation_bytemask = - _mm256_cmpeq_epi32(_mm256_and_si256(in, v_ffff0000), v_00000000); + while (end - buf >= 8) { + __m128i in = _mm_loadu_si128((__m128i *)buf); + __m128i nextin = _mm_loadu_si128((__m128i *)buf + 1); + const __m128i saturation_bytemask = _mm_cmpeq_epi32( + _mm_and_si128(_mm_or_si128(in, nextin), v_ffff0000), v_0000); const uint32_t saturation_bitmask = - static_cast(_mm256_movemask_epi8(saturation_bytemask)); + static_cast(_mm_movemask_epi8(saturation_bytemask)); - if (saturation_bitmask == 0xffffffff) { - const __m256i v_f800 = _mm256_set1_epi32((uint32_t)0xf800); - const __m256i v_d800 = _mm256_set1_epi32((uint32_t)0xd800); - forbidden_bytemask = _mm256_or_si256( + // Check if no bits set above 16th + if (saturation_bitmask == 0xffff) { + // Pack UTF-32 to UTF-16 + __m128i utf16_packed = _mm_packus_epi32(in, nextin); + + const __m128i v_f800 = _mm_set1_epi16((uint16_t)0xf800); + const __m128i v_d800 = _mm_set1_epi16((uint16_t)0xd800); + forbidden_bytemask = _mm_or_si128( forbidden_bytemask, - _mm256_cmpeq_epi32(_mm256_and_si256(in, v_f800), v_d800)); + _mm_cmpeq_epi16(_mm_and_si128(utf16_packed, v_f800), v_d800)); - __m128i utf16_packed = _mm_packus_epi32(_mm256_castsi256_si128(in), - _mm256_extractf128_si256(in, 1)); if (big_endian) { const __m128i swap = _mm_setr_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14); utf16_packed = _mm_shuffle_epi8(utf16_packed, swap); } + _mm_storeu_si128((__m128i *)utf16_output, utf16_packed); utf16_output += 8; buf += 8; @@ -27840,7 +40790,7 @@ avx2_convert_utf32_to_utf16(const char32_t *buf, size_t len, } // check for invalid input - if (static_cast(_mm256_movemask_epi8(forbidden_bytemask)) != 0) { + if (static_cast(_mm_movemask_epi8(forbidden_bytemask)) != 0) { return std::make_pair(nullptr, utf16_output); } @@ -27849,45 +40799,42 @@ avx2_convert_utf32_to_utf16(const char32_t *buf, size_t len, template std::pair -avx2_convert_utf32_to_utf16_with_errors(const char32_t *buf, size_t len, - char16_t *utf16_output) { +sse_convert_utf32_to_utf16_with_errors(const char32_t *buf, size_t len, + char16_t *utf16_output) { const char32_t *start = buf; const char32_t *end = buf + len; - const size_t safety_margin = - 12; // to avoid overruns, see issue - // https://github.com/simdutf/simdutf/issues/92 - - while (end - buf >= std::ptrdiff_t(8 + safety_margin)) { - __m256i in = _mm256_loadu_si256((__m256i *)buf); - - const __m256i v_00000000 = _mm256_setzero_si256(); - const __m256i v_ffff0000 = _mm256_set1_epi32((int32_t)0xffff0000); + const __m128i v_0000 = _mm_setzero_si128(); + const __m128i v_ffff0000 = _mm_set1_epi32((int32_t)0xffff0000); - // no bits set above 16th bit <=> can pack to UTF16 without surrogate pairs - const __m256i saturation_bytemask = - _mm256_cmpeq_epi32(_mm256_and_si256(in, v_ffff0000), v_00000000); + while (end - buf >= 8) { + __m128i in = _mm_loadu_si128((__m128i *)buf); + __m128i nextin = _mm_loadu_si128((__m128i *)buf + 1); + const __m128i saturation_bytemask = _mm_cmpeq_epi32( + _mm_and_si128(_mm_or_si128(in, nextin), v_ffff0000), v_0000); const uint32_t saturation_bitmask = - static_cast(_mm256_movemask_epi8(saturation_bytemask)); + static_cast(_mm_movemask_epi8(saturation_bytemask)); - if (saturation_bitmask == 0xffffffff) { - const __m256i v_f800 = _mm256_set1_epi32((uint32_t)0xf800); - const __m256i v_d800 = _mm256_set1_epi32((uint32_t)0xd800); - const __m256i forbidden_bytemask = - _mm256_cmpeq_epi32(_mm256_and_si256(in, v_f800), v_d800); - if (static_cast(_mm256_movemask_epi8(forbidden_bytemask)) != - 0x0) { + // Check if no bits set above 16th + if (saturation_bitmask == 0xffff) { + // Pack UTF-32 to UTF-16 + __m128i utf16_packed = _mm_packus_epi32(in, nextin); + + const __m128i v_f800 = _mm_set1_epi16((uint16_t)0xf800); + const __m128i v_d800 = _mm_set1_epi16((uint16_t)0xd800); + const __m128i forbidden_bytemask = + _mm_cmpeq_epi16(_mm_and_si128(utf16_packed, v_f800), v_d800); + if (static_cast(_mm_movemask_epi8(forbidden_bytemask)) != 0) { return std::make_pair(result(error_code::SURROGATE, buf - start), utf16_output); } - __m128i utf16_packed = _mm_packus_epi32(_mm256_castsi256_si128(in), - _mm256_extractf128_si256(in, 1)); if (big_endian) { const __m128i swap = _mm_setr_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14); utf16_packed = _mm_shuffle_epi8(utf16_packed, swap); } + _mm_storeu_si128((__m128i *)utf16_output, utf16_packed); utf16_output += 8; buf += 8; @@ -27934,72 +40881,8 @@ avx2_convert_utf32_to_utf16_with_errors(const char32_t *buf, size_t len, return std::make_pair(result(error_code::SUCCESS, buf - start), utf16_output); } -/* end file src/haswell/avx2_convert_utf32_to_utf16.cpp */ - -/* begin file src/haswell/avx2_convert_utf8_to_latin1.cpp */ -// depends on "tables/utf8_to_utf16_tables.h" - -// Convert up to 12 bytes from utf8 to latin1 using a mask indicating the -// end of the code points. Only the least significant 12 bits of the mask -// are accessed. -// It returns how many bytes were consumed (up to 12). -size_t convert_masked_utf8_to_latin1(const char *input, - uint64_t utf8_end_of_code_point_mask, - char *&latin1_output) { - // we use an approach where we try to process up to 12 input bytes. - // Why 12 input bytes and not 16? Because we are concerned with the size of - // the lookup tables. Also 12 is nicely divisible by two and three. - // - // - // Optimization note: our main path below is load-latency dependent. Thus it - // is maybe beneficial to have fast paths that depend on branch prediction but - // have less latency. This results in more instructions but, potentially, also - // higher speeds. - // - const __m128i in = _mm_loadu_si128((__m128i *)input); - - const uint16_t input_utf8_end_of_code_point_mask = - utf8_end_of_code_point_mask & - 0xfff; // we are only processing 12 bytes in case it is not all ASCII - - if (utf8_end_of_code_point_mask == 0xfff) { - // We process the data in chunks of 12 bytes. - _mm_storeu_si128(reinterpret_cast<__m128i *>(latin1_output), in); - latin1_output += 12; // We wrote 12 characters. - return 12; // We consumed 1 bytes. - } - /// We do not have a fast path available, so we fallback. - const uint8_t idx = - tables::utf8_to_utf16::utf8bigindex[input_utf8_end_of_code_point_mask][0]; - const uint8_t consumed = - tables::utf8_to_utf16::utf8bigindex[input_utf8_end_of_code_point_mask][1]; - // this indicates an invalid input: - if (idx >= 64) { - return consumed; - } - // Here we should have (idx < 64), if not, there is a bug in the validation or - // elsewhere. SIX (6) input code-code units this is a relatively easy scenario - // we process SIX (6) input code-code units. The max length in bytes of six - // code code units spanning between 1 and 2 bytes each is 12 bytes. On - // processors where pdep/pext is fast, we might be able to use a small lookup - // table. - const __m128i sh = - _mm_loadu_si128((const __m128i *)tables::utf8_to_utf16::shufutf8[idx]); - const __m128i perm = _mm_shuffle_epi8(in, sh); - const __m128i ascii = _mm_and_si128(perm, _mm_set1_epi16(0x7f)); - const __m128i highbyte = _mm_and_si128(perm, _mm_set1_epi16(0x1f00)); - __m128i composed = _mm_or_si128(ascii, _mm_srli_epi16(highbyte, 2)); - const __m128i latin1_packed = _mm_packus_epi16(composed, composed); - // writing 8 bytes even though we only care about the first 6 bytes. - // performance note: it would be faster to use _mm_storeu_si128, we should - // investigate. - _mm_storel_epi64((__m128i *)latin1_output, latin1_packed); - latin1_output += 6; // We wrote 6 bytes. - return consumed; -} -/* end file src/haswell/avx2_convert_utf8_to_latin1.cpp */ - -/* begin file src/haswell/avx2_base64.cpp */ +/* end file src/westmere/sse_convert_utf32_to_utf16.cpp */ +/* begin file src/westmere/sse_base64.cpp */ /** * References and further reading: * @@ -28027,151 +40910,155 @@ size_t convert_masked_utf8_to_latin1(const char *input, * Nick Kopp. 2013. Base64 Encoding on a GPU. * https://www.codeproject.com/Articles/276993/Base-Encoding-on-a-GPU. (2013). */ - -template -simdutf_really_inline __m256i lookup_pshufb_improved(const __m256i input) { +template __m128i lookup_pshufb_improved(const __m128i input) { // credit: Wojciech Muła - __m256i result = _mm256_subs_epu8(input, _mm256_set1_epi8(51)); - const __m256i less = _mm256_cmpgt_epi8(_mm256_set1_epi8(26), input); - result = - _mm256_or_si256(result, _mm256_and_si256(less, _mm256_set1_epi8(13))); - __m256i shift_LUT; - if (base64_url) { - shift_LUT = _mm256_setr_epi8( - 'a' - 26, '0' - 52, '0' - 52, '0' - 52, '0' - 52, '0' - 52, '0' - 52, - '0' - 52, '0' - 52, '0' - 52, '0' - 52, '-' - 62, '_' - 63, 'A', 0, 0, + // reduce 0..51 -> 0 + // 52..61 -> 1 .. 10 + // 62 -> 11 + // 63 -> 12 + __m128i result = _mm_subs_epu8(input, _mm_set1_epi8(51)); - 'a' - 26, '0' - 52, '0' - 52, '0' - 52, '0' - 52, '0' - 52, '0' - 52, - '0' - 52, '0' - 52, '0' - 52, '0' - 52, '-' - 62, '_' - 63, 'A', 0, 0); - } else { - shift_LUT = _mm256_setr_epi8( - 'a' - 26, '0' - 52, '0' - 52, '0' - 52, '0' - 52, '0' - 52, '0' - 52, - '0' - 52, '0' - 52, '0' - 52, '0' - 52, '+' - 62, '/' - 63, 'A', 0, 0, + // distinguish between ranges 0..25 and 26..51: + // 0 .. 25 -> remains 0 + // 26 .. 51 -> becomes 13 + const __m128i less = _mm_cmpgt_epi8(_mm_set1_epi8(26), input); + result = _mm_or_si128(result, _mm_and_si128(less, _mm_set1_epi8(13))); - 'a' - 26, '0' - 52, '0' - 52, '0' - 52, '0' - 52, '0' - 52, '0' - 52, - '0' - 52, '0' - 52, '0' - 52, '0' - 52, '+' - 62, '/' - 63, 'A', 0, 0); + __m128i shift_LUT; + if (base64_url) { + shift_LUT = _mm_setr_epi8('a' - 26, '0' - 52, '0' - 52, '0' - 52, '0' - 52, + '0' - 52, '0' - 52, '0' - 52, '0' - 52, '0' - 52, + '0' - 52, '-' - 62, '_' - 63, 'A', 0, 0); + } else { + shift_LUT = _mm_setr_epi8('a' - 26, '0' - 52, '0' - 52, '0' - 52, '0' - 52, + '0' - 52, '0' - 52, '0' - 52, '0' - 52, '0' - 52, + '0' - 52, '+' - 62, '/' - 63, 'A', 0, 0); } - result = _mm256_shuffle_epi8(shift_LUT, result); - return _mm256_add_epi8(result, input); + // read shift + result = _mm_shuffle_epi8(shift_LUT, result); + + return _mm_add_epi8(result, input); } template size_t encode_base64(char *dst, const char *src, size_t srclen, base64_options options) { // credit: Wojciech Muła + // SSE (lookup: pshufb improved unrolled) const uint8_t *input = (const uint8_t *)src; uint8_t *out = (uint8_t *)dst; - const __m256i shuf = - _mm256_set_epi8(10, 11, 9, 10, 7, 8, 6, 7, 4, 5, 3, 4, 1, 2, 0, 1, + const __m128i shuf = + _mm_set_epi8(10, 11, 9, 10, 7, 8, 6, 7, 4, 5, 3, 4, 1, 2, 0, 1); - 10, 11, 9, 10, 7, 8, 6, 7, 4, 5, 3, 4, 1, 2, 0, 1); size_t i = 0; - for (; i + 100 <= srclen; i += 96) { - const __m128i lo0 = _mm_loadu_si128( + for (; i + 52 <= srclen; i += 48) { + __m128i in0 = _mm_loadu_si128( reinterpret_cast(input + i + 4 * 3 * 0)); - const __m128i hi0 = _mm_loadu_si128( + __m128i in1 = _mm_loadu_si128( reinterpret_cast(input + i + 4 * 3 * 1)); - const __m128i lo1 = _mm_loadu_si128( + __m128i in2 = _mm_loadu_si128( reinterpret_cast(input + i + 4 * 3 * 2)); - const __m128i hi1 = _mm_loadu_si128( + __m128i in3 = _mm_loadu_si128( reinterpret_cast(input + i + 4 * 3 * 3)); - const __m128i lo2 = _mm_loadu_si128( - reinterpret_cast(input + i + 4 * 3 * 4)); - const __m128i hi2 = _mm_loadu_si128( - reinterpret_cast(input + i + 4 * 3 * 5)); - const __m128i lo3 = _mm_loadu_si128( - reinterpret_cast(input + i + 4 * 3 * 6)); - const __m128i hi3 = _mm_loadu_si128( - reinterpret_cast(input + i + 4 * 3 * 7)); - __m256i in0 = _mm256_shuffle_epi8(_mm256_set_m128i(hi0, lo0), shuf); - __m256i in1 = _mm256_shuffle_epi8(_mm256_set_m128i(hi1, lo1), shuf); - __m256i in2 = _mm256_shuffle_epi8(_mm256_set_m128i(hi2, lo2), shuf); - __m256i in3 = _mm256_shuffle_epi8(_mm256_set_m128i(hi3, lo3), shuf); + in0 = _mm_shuffle_epi8(in0, shuf); + in1 = _mm_shuffle_epi8(in1, shuf); + in2 = _mm_shuffle_epi8(in2, shuf); + in3 = _mm_shuffle_epi8(in3, shuf); - const __m256i t0_0 = _mm256_and_si256(in0, _mm256_set1_epi32(0x0fc0fc00)); - const __m256i t0_1 = _mm256_and_si256(in1, _mm256_set1_epi32(0x0fc0fc00)); - const __m256i t0_2 = _mm256_and_si256(in2, _mm256_set1_epi32(0x0fc0fc00)); - const __m256i t0_3 = _mm256_and_si256(in3, _mm256_set1_epi32(0x0fc0fc00)); + const __m128i t0_0 = _mm_and_si128(in0, _mm_set1_epi32(0x0fc0fc00)); + const __m128i t0_1 = _mm_and_si128(in1, _mm_set1_epi32(0x0fc0fc00)); + const __m128i t0_2 = _mm_and_si128(in2, _mm_set1_epi32(0x0fc0fc00)); + const __m128i t0_3 = _mm_and_si128(in3, _mm_set1_epi32(0x0fc0fc00)); - const __m256i t1_0 = - _mm256_mulhi_epu16(t0_0, _mm256_set1_epi32(0x04000040)); - const __m256i t1_1 = - _mm256_mulhi_epu16(t0_1, _mm256_set1_epi32(0x04000040)); - const __m256i t1_2 = - _mm256_mulhi_epu16(t0_2, _mm256_set1_epi32(0x04000040)); - const __m256i t1_3 = - _mm256_mulhi_epu16(t0_3, _mm256_set1_epi32(0x04000040)); + const __m128i t1_0 = _mm_mulhi_epu16(t0_0, _mm_set1_epi32(0x04000040)); + const __m128i t1_1 = _mm_mulhi_epu16(t0_1, _mm_set1_epi32(0x04000040)); + const __m128i t1_2 = _mm_mulhi_epu16(t0_2, _mm_set1_epi32(0x04000040)); + const __m128i t1_3 = _mm_mulhi_epu16(t0_3, _mm_set1_epi32(0x04000040)); - const __m256i t2_0 = _mm256_and_si256(in0, _mm256_set1_epi32(0x003f03f0)); - const __m256i t2_1 = _mm256_and_si256(in1, _mm256_set1_epi32(0x003f03f0)); - const __m256i t2_2 = _mm256_and_si256(in2, _mm256_set1_epi32(0x003f03f0)); - const __m256i t2_3 = _mm256_and_si256(in3, _mm256_set1_epi32(0x003f03f0)); + const __m128i t2_0 = _mm_and_si128(in0, _mm_set1_epi32(0x003f03f0)); + const __m128i t2_1 = _mm_and_si128(in1, _mm_set1_epi32(0x003f03f0)); + const __m128i t2_2 = _mm_and_si128(in2, _mm_set1_epi32(0x003f03f0)); + const __m128i t2_3 = _mm_and_si128(in3, _mm_set1_epi32(0x003f03f0)); - const __m256i t3_0 = - _mm256_mullo_epi16(t2_0, _mm256_set1_epi32(0x01000010)); - const __m256i t3_1 = - _mm256_mullo_epi16(t2_1, _mm256_set1_epi32(0x01000010)); - const __m256i t3_2 = - _mm256_mullo_epi16(t2_2, _mm256_set1_epi32(0x01000010)); - const __m256i t3_3 = - _mm256_mullo_epi16(t2_3, _mm256_set1_epi32(0x01000010)); + const __m128i t3_0 = _mm_mullo_epi16(t2_0, _mm_set1_epi32(0x01000010)); + const __m128i t3_1 = _mm_mullo_epi16(t2_1, _mm_set1_epi32(0x01000010)); + const __m128i t3_2 = _mm_mullo_epi16(t2_2, _mm_set1_epi32(0x01000010)); + const __m128i t3_3 = _mm_mullo_epi16(t2_3, _mm_set1_epi32(0x01000010)); - const __m256i input0 = _mm256_or_si256(t1_0, t3_0); - const __m256i input1 = _mm256_or_si256(t1_1, t3_1); - const __m256i input2 = _mm256_or_si256(t1_2, t3_2); - const __m256i input3 = _mm256_or_si256(t1_3, t3_3); + const __m128i input0 = _mm_or_si128(t1_0, t3_0); + const __m128i input1 = _mm_or_si128(t1_1, t3_1); + const __m128i input2 = _mm_or_si128(t1_2, t3_2); + const __m128i input3 = _mm_or_si128(t1_3, t3_3); - _mm256_storeu_si256(reinterpret_cast<__m256i *>(out), - lookup_pshufb_improved(input0)); - out += 32; + _mm_storeu_si128(reinterpret_cast<__m128i *>(out), + lookup_pshufb_improved(input0)); + out += 16; - _mm256_storeu_si256(reinterpret_cast<__m256i *>(out), - lookup_pshufb_improved(input1)); - out += 32; + _mm_storeu_si128(reinterpret_cast<__m128i *>(out), + lookup_pshufb_improved(input1)); + out += 16; - _mm256_storeu_si256(reinterpret_cast<__m256i *>(out), - lookup_pshufb_improved(input2)); - out += 32; - _mm256_storeu_si256(reinterpret_cast<__m256i *>(out), - lookup_pshufb_improved(input3)); - out += 32; + _mm_storeu_si128(reinterpret_cast<__m128i *>(out), + lookup_pshufb_improved(input2)); + out += 16; + + _mm_storeu_si128(reinterpret_cast<__m128i *>(out), + lookup_pshufb_improved(input3)); + out += 16; } - for (; i + 28 <= srclen; i += 24) { - // lo = [xxxx|DDDC|CCBB|BAAA] - // hi = [xxxx|HHHG|GGFF|FEEE] - const __m128i lo = - _mm_loadu_si128(reinterpret_cast(input + i)); - const __m128i hi = - _mm_loadu_si128(reinterpret_cast(input + i + 4 * 3)); + for (; i + 16 <= srclen; i += 12) { + + __m128i in = _mm_loadu_si128(reinterpret_cast(input + i)); // bytes from groups A, B and C are needed in separate 32-bit lanes - // in = [0HHH|0GGG|0FFF|0EEE[0DDD|0CCC|0BBB|0AAA] - __m256i in = _mm256_shuffle_epi8(_mm256_set_m128i(hi, lo), shuf); + // in = [DDDD|CCCC|BBBB|AAAA] + // + // an input triplet has layout + // [????????|ccdddddd|bbbbcccc|aaaaaabb] + // byte 3 byte 2 byte 1 byte 0 -- byte 3 comes from the next + // triplet + // + // shuffling changes the order of bytes: 1, 0, 2, 1 + // [bbbbcccc|ccdddddd|aaaaaabb|bbbbcccc] + // ^^^^ ^^^^^^^^ ^^^^^^^^ ^^^^ + // processed bits + in = _mm_shuffle_epi8(in, shuf); - // this part is well commented in encode.sse.cpp + // unpacking - const __m256i t0 = _mm256_and_si256(in, _mm256_set1_epi32(0x0fc0fc00)); - const __m256i t1 = _mm256_mulhi_epu16(t0, _mm256_set1_epi32(0x04000040)); - const __m256i t2 = _mm256_and_si256(in, _mm256_set1_epi32(0x003f03f0)); - const __m256i t3 = _mm256_mullo_epi16(t2, _mm256_set1_epi32(0x01000010)); - const __m256i indices = _mm256_or_si256(t1, t3); + // t0 = [0000cccc|cc000000|aaaaaa00|00000000] + const __m128i t0 = _mm_and_si128(in, _mm_set1_epi32(0x0fc0fc00)); + // t1 = [00000000|00cccccc|00000000|00aaaaaa] + // (c * (1 << 10), a * (1 << 6)) >> 16 (note: an unsigned + // multiplication) + const __m128i t1 = _mm_mulhi_epu16(t0, _mm_set1_epi32(0x04000040)); - _mm256_storeu_si256(reinterpret_cast<__m256i *>(out), - lookup_pshufb_improved(indices)); - out += 32; + // t2 = [00000000|00dddddd|000000bb|bbbb0000] + const __m128i t2 = _mm_and_si128(in, _mm_set1_epi32(0x003f03f0)); + // t3 = [00dddddd|00000000|00bbbbbb|00000000]( + // (d * (1 << 8), b * (1 << 4)) + const __m128i t3 = _mm_mullo_epi16(t2, _mm_set1_epi32(0x01000010)); + + // res = [00dddddd|00cccccc|00bbbbbb|00aaaaaa] = t1 | t3 + const __m128i indices = _mm_or_si128(t1, t3); + + _mm_storeu_si128(reinterpret_cast<__m128i *>(out), + lookup_pshufb_improved(indices)); + out += 16; } + return i / 3 * 4 + scalar::base64::tail_encode_base64((char *)out, src + i, srclen - i, options); } - static inline void compress(__m128i data, uint16_t mask, char *output) { if (mask == 0) { _mm_storeu_si128(reinterpret_cast<__m128i *>(output), data); return; } + // this particular implementation was inspired by work done by @animetosho // we do it in two steps, first 8 bytes and then second 8 bytes uint8_t mask1 = uint8_t(mask); // least significant 8 bits @@ -28197,199 +41084,218 @@ static inline void compress(__m128i data, uint16_t mask, char *output) { __m128i compactmask = _mm_loadu_si128(reinterpret_cast( tables::base64::pshufb_combine_table + pop1 * 8)); __m128i answer = _mm_shuffle_epi8(pruned, compactmask); - _mm_storeu_si128(reinterpret_cast<__m128i *>(output), answer); } -static inline void compress(__m256i data, uint32_t mask, char *output) { - if (mask == 0) { - _mm256_storeu_si256(reinterpret_cast<__m256i *>(output), data); - return; - } - compress(_mm256_castsi256_si128(data), uint16_t(mask), output); - compress(_mm256_extracti128_si256(data, 1), uint16_t(mask >> 16), - output + _mm_popcnt_u32(~mask & 0xFFFF)); -} - struct block64 { - __m256i chunks[2]; + __m128i chunks[4]; }; -template -static inline uint32_t to_base64_mask(__m256i *src, bool *error) { - const __m256i ascii_space_tbl = - _mm256_setr_epi8(0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xa, - 0x0, 0xc, 0xd, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xa, 0x0, 0xc, 0xd, 0x0, 0x0); +template +static inline uint16_t to_base64_mask(__m128i *src, uint32_t *error) { + const __m128i ascii_space_tbl = + _mm_setr_epi8(0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xa, 0x0, + 0xc, 0xd, 0x0, 0x0); // credit: aqrit - __m256i delta_asso; + __m128i delta_asso; if (base64_url) { - delta_asso = - _mm256_setr_epi8(0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xF, 0x0, 0xF, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, - 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xF, 0x0, 0xF); + delta_asso = _mm_setr_epi8(0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xF, 0x0, 0xF); } else { - delta_asso = _mm256_setr_epi8( - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x0F, 0x00, 0x0F, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x0F); - } - __m256i delta_values; + delta_asso = _mm_setr_epi8(0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x0F); + } + __m128i delta_values; if (base64_url) { - delta_values = _mm256_setr_epi8( - 0x0, 0x0, 0x0, 0x13, 0x4, uint8_t(0xBF), uint8_t(0xBF), uint8_t(0xB9), - uint8_t(0xB9), 0x0, 0x11, uint8_t(0xC3), uint8_t(0xBF), uint8_t(0xE0), - uint8_t(0xB9), uint8_t(0xB9), 0x0, 0x0, 0x0, 0x13, 0x4, uint8_t(0xBF), - uint8_t(0xBF), uint8_t(0xB9), uint8_t(0xB9), 0x0, 0x11, uint8_t(0xC3), - uint8_t(0xBF), uint8_t(0xE0), uint8_t(0xB9), uint8_t(0xB9)); + delta_values = _mm_setr_epi8(0x0, 0x0, 0x0, 0x13, 0x4, uint8_t(0xBF), + uint8_t(0xBF), uint8_t(0xB9), uint8_t(0xB9), + 0x0, 0x11, uint8_t(0xC3), uint8_t(0xBF), + uint8_t(0xE0), uint8_t(0xB9), uint8_t(0xB9)); } else { - delta_values = _mm256_setr_epi8( - int8_t(0x00), int8_t(0x00), int8_t(0x00), int8_t(0x13), int8_t(0x04), - int8_t(0xBF), int8_t(0xBF), int8_t(0xB9), int8_t(0xB9), int8_t(0x00), - int8_t(0x10), int8_t(0xC3), int8_t(0xBF), int8_t(0xBF), int8_t(0xB9), - int8_t(0xB9), int8_t(0x00), int8_t(0x00), int8_t(0x00), int8_t(0x13), - int8_t(0x04), int8_t(0xBF), int8_t(0xBF), int8_t(0xB9), int8_t(0xB9), - int8_t(0x00), int8_t(0x10), int8_t(0xC3), int8_t(0xBF), int8_t(0xBF), - int8_t(0xB9), int8_t(0xB9)); - } - __m256i check_asso; + delta_values = + _mm_setr_epi8(int8_t(0x00), int8_t(0x00), int8_t(0x00), int8_t(0x13), + int8_t(0x04), int8_t(0xBF), int8_t(0xBF), int8_t(0xB9), + int8_t(0xB9), int8_t(0x00), int8_t(0x10), int8_t(0xC3), + int8_t(0xBF), int8_t(0xBF), int8_t(0xB9), int8_t(0xB9)); + } + __m128i check_asso; if (base64_url) { - check_asso = - _mm256_setr_epi8(0xD, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x3, - 0x7, 0xB, 0xE, 0xB, 0x6, 0xD, 0x1, 0x1, 0x1, 0x1, 0x1, - 0x1, 0x1, 0x1, 0x1, 0x3, 0x7, 0xB, 0xE, 0xB, 0x6); + check_asso = _mm_setr_epi8(0xD, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x3, 0x7, 0xB, 0xE, 0xB, 0x6); } else { - check_asso = _mm256_setr_epi8( - 0x0D, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x07, - 0x0B, 0x0B, 0x0B, 0x0F, 0x0D, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x03, 0x07, 0x0B, 0x0B, 0x0B, 0x0F); + check_asso = _mm_setr_epi8(0x0D, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x03, 0x07, 0x0B, 0x0B, 0x0B, 0x0F); } - __m256i check_values; + __m128i check_values; if (base64_url) { - check_values = _mm256_setr_epi8( - uint8_t(0x80), uint8_t(0x80), uint8_t(0x80), uint8_t(0x80), - uint8_t(0xCF), uint8_t(0xBF), uint8_t(0xB6), uint8_t(0xA6), - uint8_t(0xB5), uint8_t(0xA1), 0x0, uint8_t(0x80), 0x0, uint8_t(0x80), - 0x0, uint8_t(0x80), uint8_t(0x80), uint8_t(0x80), uint8_t(0x80), - uint8_t(0x80), uint8_t(0xCF), uint8_t(0xBF), uint8_t(0xB6), - uint8_t(0xA6), uint8_t(0xB5), uint8_t(0xA1), 0x0, uint8_t(0x80), 0x0, - uint8_t(0x80), 0x0, uint8_t(0x80)); + check_values = _mm_setr_epi8(uint8_t(0x80), uint8_t(0x80), uint8_t(0x80), + uint8_t(0x80), uint8_t(0xCF), uint8_t(0xBF), + uint8_t(0xB6), uint8_t(0xA6), uint8_t(0xB5), + uint8_t(0xA1), 0x0, uint8_t(0x80), 0x0, + uint8_t(0x80), 0x0, uint8_t(0x80)); } else { - check_values = _mm256_setr_epi8( - int8_t(0x80), int8_t(0x80), int8_t(0x80), int8_t(0x80), int8_t(0xCF), - int8_t(0xBF), int8_t(0xD5), int8_t(0xA6), int8_t(0xB5), int8_t(0x86), - int8_t(0xD1), int8_t(0x80), int8_t(0xB1), int8_t(0x80), int8_t(0x91), - int8_t(0x80), int8_t(0x80), int8_t(0x80), int8_t(0x80), int8_t(0x80), - int8_t(0xCF), int8_t(0xBF), int8_t(0xD5), int8_t(0xA6), int8_t(0xB5), - int8_t(0x86), int8_t(0xD1), int8_t(0x80), int8_t(0xB1), int8_t(0x80), - int8_t(0x91), int8_t(0x80)); + + check_values = + _mm_setr_epi8(int8_t(0x80), int8_t(0x80), int8_t(0x80), int8_t(0x80), + int8_t(0xCF), int8_t(0xBF), int8_t(0xD5), int8_t(0xA6), + int8_t(0xB5), int8_t(0x86), int8_t(0xD1), int8_t(0x80), + int8_t(0xB1), int8_t(0x80), int8_t(0x91), int8_t(0x80)); } - const __m256i shifted = _mm256_srli_epi32(*src, 3); - const __m256i delta_hash = - _mm256_avg_epu8(_mm256_shuffle_epi8(delta_asso, *src), shifted); - const __m256i check_hash = - _mm256_avg_epu8(_mm256_shuffle_epi8(check_asso, *src), shifted); - const __m256i out = - _mm256_adds_epi8(_mm256_shuffle_epi8(delta_values, delta_hash), *src); - const __m256i chk = - _mm256_adds_epi8(_mm256_shuffle_epi8(check_values, check_hash), *src); - const int mask = _mm256_movemask_epi8(chk); - if (mask) { - __m256i ascii_space = - _mm256_cmpeq_epi8(_mm256_shuffle_epi8(ascii_space_tbl, *src), *src); - *error |= (mask != _mm256_movemask_epi8(ascii_space)); + const __m128i shifted = _mm_srli_epi32(*src, 3); + + const __m128i delta_hash = + _mm_avg_epu8(_mm_shuffle_epi8(delta_asso, *src), shifted); + const __m128i check_hash = + _mm_avg_epu8(_mm_shuffle_epi8(check_asso, *src), shifted); + + const __m128i out = + _mm_adds_epi8(_mm_shuffle_epi8(delta_values, delta_hash), *src); + const __m128i chk = + _mm_adds_epi8(_mm_shuffle_epi8(check_values, check_hash), *src); + const int mask = _mm_movemask_epi8(chk); + if (!ignore_garbage && mask) { + __m128i ascii_space = + _mm_cmpeq_epi8(_mm_shuffle_epi8(ascii_space_tbl, *src), *src); + *error = (mask ^ _mm_movemask_epi8(ascii_space)); } *src = out; - return (uint32_t)mask; + return (uint16_t)mask; } -template -static inline uint64_t to_base64_mask(block64 *b, bool *error) { - *error = 0; - uint64_t m0 = to_base64_mask(&b->chunks[0], error); - uint64_t m1 = to_base64_mask(&b->chunks[1], error); - return m0 | (m1 << 32); +template +static inline uint64_t to_base64_mask(block64 *b, uint64_t *error) { + uint32_t err0 = 0; + uint32_t err1 = 0; + uint32_t err2 = 0; + uint32_t err3 = 0; + uint64_t m0 = + to_base64_mask(&b->chunks[0], &err0); + uint64_t m1 = + to_base64_mask(&b->chunks[1], &err1); + uint64_t m2 = + to_base64_mask(&b->chunks[2], &err2); + uint64_t m3 = + to_base64_mask(&b->chunks[3], &err3); + if (!ignore_garbage) { + *error = (err0) | ((uint64_t)err1 << 16) | ((uint64_t)err2 << 32) | + ((uint64_t)err3 << 48); + } + return m0 | (m1 << 16) | (m2 << 32) | (m3 << 48); } +#if defined(_MSC_VER) && !defined(__clang__) +static inline size_t simdutf_tzcnt_u64(uint64_t num) { + unsigned long ret; + if (num == 0) { + return 64; + } + _BitScanForward64(&ret, num); + return ret; +} +#else // GCC or Clang +static inline size_t simdutf_tzcnt_u64(uint64_t num) { + return num ? __builtin_ctzll(num) : 64; +} +#endif + static inline void copy_block(block64 *b, char *output) { - _mm256_storeu_si256(reinterpret_cast<__m256i *>(output), b->chunks[0]); - _mm256_storeu_si256(reinterpret_cast<__m256i *>(output + 32), b->chunks[1]); + _mm_storeu_si128(reinterpret_cast<__m128i *>(output), b->chunks[0]); + _mm_storeu_si128(reinterpret_cast<__m128i *>(output + 16), b->chunks[1]); + _mm_storeu_si128(reinterpret_cast<__m128i *>(output + 32), b->chunks[2]); + _mm_storeu_si128(reinterpret_cast<__m128i *>(output + 48), b->chunks[3]); } static inline uint64_t compress_block(block64 *b, uint64_t mask, char *output) { uint64_t nmask = ~mask; - compress(b->chunks[0], uint32_t(mask), output); - compress(b->chunks[1], uint32_t(mask >> 32), + compress(b->chunks[0], uint16_t(mask), output); + compress(b->chunks[1], uint16_t(mask >> 16), + output + _mm_popcnt_u64(nmask & 0xFFFF)); + compress(b->chunks[2], uint16_t(mask >> 32), output + _mm_popcnt_u64(nmask & 0xFFFFFFFF)); + compress(b->chunks[3], uint16_t(mask >> 48), + output + _mm_popcnt_u64(nmask & 0xFFFFFFFFFFFFULL)); return _mm_popcnt_u64(nmask); } // The caller of this function is responsible to ensure that there are 64 bytes // available from reading at src. The data is read into a block64 structure. static inline void load_block(block64 *b, const char *src) { - b->chunks[0] = _mm256_loadu_si256(reinterpret_cast(src)); - b->chunks[1] = - _mm256_loadu_si256(reinterpret_cast(src + 32)); + b->chunks[0] = _mm_loadu_si128(reinterpret_cast(src)); + b->chunks[1] = _mm_loadu_si128(reinterpret_cast(src + 16)); + b->chunks[2] = _mm_loadu_si128(reinterpret_cast(src + 32)); + b->chunks[3] = _mm_loadu_si128(reinterpret_cast(src + 48)); } // The caller of this function is responsible to ensure that there are 128 bytes // available from reading at src. The data is read into a block64 structure. static inline void load_block(block64 *b, const char16_t *src) { - __m256i m1 = _mm256_loadu_si256(reinterpret_cast(src)); - __m256i m2 = _mm256_loadu_si256(reinterpret_cast(src + 16)); - __m256i m3 = _mm256_loadu_si256(reinterpret_cast(src + 32)); - __m256i m4 = _mm256_loadu_si256(reinterpret_cast(src + 48)); - __m256i m1p = _mm256_permute2x128_si256(m1, m2, 0x20); - __m256i m2p = _mm256_permute2x128_si256(m1, m2, 0x31); - __m256i m3p = _mm256_permute2x128_si256(m3, m4, 0x20); - __m256i m4p = _mm256_permute2x128_si256(m3, m4, 0x31); - b->chunks[0] = _mm256_packus_epi16(m1p, m2p); - b->chunks[1] = _mm256_packus_epi16(m3p, m4p); + __m128i m1 = _mm_loadu_si128(reinterpret_cast(src)); + __m128i m2 = _mm_loadu_si128(reinterpret_cast(src + 8)); + __m128i m3 = _mm_loadu_si128(reinterpret_cast(src + 16)); + __m128i m4 = _mm_loadu_si128(reinterpret_cast(src + 24)); + __m128i m5 = _mm_loadu_si128(reinterpret_cast(src + 32)); + __m128i m6 = _mm_loadu_si128(reinterpret_cast(src + 40)); + __m128i m7 = _mm_loadu_si128(reinterpret_cast(src + 48)); + __m128i m8 = _mm_loadu_si128(reinterpret_cast(src + 56)); + b->chunks[0] = _mm_packus_epi16(m1, m2); + b->chunks[1] = _mm_packus_epi16(m3, m4); + b->chunks[2] = _mm_packus_epi16(m5, m6); + b->chunks[3] = _mm_packus_epi16(m7, m8); } -static inline void base64_decode(char *out, __m256i str) { +static inline void base64_decode(char *out, __m128i str) { // credit: aqrit - const __m256i pack_shuffle = - _mm256_setr_epi8(2, 1, 0, 6, 5, 4, 10, 9, 8, 14, 13, 12, -1, -1, -1, -1, - 2, 1, 0, 6, 5, 4, 10, 9, 8, 14, 13, 12, -1, -1, -1, -1); - const __m256i t0 = _mm256_maddubs_epi16(str, _mm256_set1_epi32(0x01400140)); - const __m256i t1 = _mm256_madd_epi16(t0, _mm256_set1_epi32(0x00011000)); - const __m256i t2 = _mm256_shuffle_epi8(t1, pack_shuffle); + const __m128i pack_shuffle = + _mm_setr_epi8(2, 1, 0, 6, 5, 4, 10, 9, 8, 14, 13, 12, -1, -1, -1, -1); + + const __m128i t0 = _mm_maddubs_epi16(str, _mm_set1_epi32(0x01400140)); + const __m128i t1 = _mm_madd_epi16(t0, _mm_set1_epi32(0x00011000)); + const __m128i t2 = _mm_shuffle_epi8(t1, pack_shuffle); // Store the output: - _mm_storeu_si128((__m128i *)out, _mm256_castsi256_si128(t2)); - _mm_storeu_si128((__m128i *)(out + 12), _mm256_extracti128_si256(t2, 1)); + // this writes 16 bytes, but we only need 12. + _mm_storeu_si128((__m128i *)out, t2); } // decode 64 bytes and output 48 bytes static inline void base64_decode_block(char *out, const char *src) { - base64_decode(out, - _mm256_loadu_si256(reinterpret_cast(src))); - base64_decode(out + 24, _mm256_loadu_si256( - reinterpret_cast(src + 32))); + base64_decode(out, _mm_loadu_si128(reinterpret_cast(src))); + base64_decode(out + 12, + _mm_loadu_si128(reinterpret_cast(src + 16))); + base64_decode(out + 24, + _mm_loadu_si128(reinterpret_cast(src + 32))); + base64_decode(out + 36, + _mm_loadu_si128(reinterpret_cast(src + 48))); } static inline void base64_decode_block_safe(char *out, const char *src) { - base64_decode(out, - _mm256_loadu_si256(reinterpret_cast(src))); - char buffer[32]; // We enforce safety with a buffer. - base64_decode( - buffer, _mm256_loadu_si256(reinterpret_cast(src + 32))); - std::memcpy(out + 24, buffer, 24); + base64_decode(out, _mm_loadu_si128(reinterpret_cast(src))); + base64_decode(out + 12, + _mm_loadu_si128(reinterpret_cast(src + 16))); + base64_decode(out + 24, + _mm_loadu_si128(reinterpret_cast(src + 32))); + char buffer[16]; + base64_decode(buffer, + _mm_loadu_si128(reinterpret_cast(src + 48))); + std::memcpy(out + 36, buffer, 12); } static inline void base64_decode_block(char *out, block64 *b) { base64_decode(out, b->chunks[0]); - base64_decode(out + 24, b->chunks[1]); + base64_decode(out + 12, b->chunks[1]); + base64_decode(out + 24, b->chunks[2]); + base64_decode(out + 36, b->chunks[3]); } static inline void base64_decode_block_safe(char *out, block64 *b) { base64_decode(out, b->chunks[0]); - char buffer[32]; // We enforce safety with a buffer. - base64_decode(buffer, b->chunks[1]); - std::memcpy(out + 24, buffer, 24); + base64_decode(out + 12, b->chunks[1]); + base64_decode(out + 24, b->chunks[2]); + char buffer[16]; + base64_decode(buffer, b->chunks[3]); + std::memcpy(out + 36, buffer, 12); } -template +template full_result compress_decode_base64(char *dst, const chartype *src, size_t srclen, base64_options options, @@ -28399,12 +41305,13 @@ compress_decode_base64(char *dst, const chartype *src, size_t srclen, size_t equallocation = srclen; // location of the first padding character if any // skip trailing spaces - while (srclen > 0 && scalar::base64::is_eight_byte(src[srclen - 1]) && + while (!ignore_garbage && srclen > 0 && + scalar::base64::is_eight_byte(src[srclen - 1]) && to_base64[uint8_t(src[srclen - 1])] == 64) { srclen--; } size_t equalsigns = 0; - if (srclen > 0 && src[srclen - 1] == '=') { + if (!ignore_garbage && srclen > 0 && src[srclen - 1] == '=') { equallocation = srclen - 1; srclen--; equalsigns = 1; @@ -28420,7 +41327,7 @@ compress_decode_base64(char *dst, const chartype *src, size_t srclen, } } if (srclen == 0) { - if (equalsigns > 0) { + if (!ignore_garbage && equalsigns > 0) { return {INVALID_BASE64_CHARACTER, equallocation, 0}; } return {SUCCESS, 0, 0}; @@ -28433,7 +41340,7 @@ compress_decode_base64(char *dst, const chartype *src, size_t srclen, const chartype *const srcend = src + srclen; constexpr size_t block_size = 6; - static_assert(block_size >= 2, "block_size must be at least two"); + static_assert(block_size >= 2, "block should of size 2 or more"); char buffer[block_size * 64]; char *bufferptr = buffer; if (srclen >= 64) { @@ -28442,16 +41349,14 @@ compress_decode_base64(char *dst, const chartype *src, size_t srclen, block64 b; load_block(&b, src); src += 64; - bool error = false; - uint64_t badcharmask = to_base64_mask(&b, &error); - if (error) { + uint64_t error = 0; + uint64_t badcharmask = + to_base64_mask(&b, &error); + if (error && !ignore_garbage) { src -= 64; - while (src < srcend && scalar::base64::is_eight_byte(*src) && - to_base64[uint8_t(*src)] <= 64) { - src++; - } - return {error_code::INVALID_BASE64_CHARACTER, size_t(src - srcinit), - size_t(dst - dstinit)}; + size_t error_offset = simdutf_tzcnt_u64(error); + return {error_code::INVALID_BASE64_CHARACTER, + size_t(src - srcinit + error_offset), size_t(dst - dstinit)}; } if (badcharmask != 0) { // optimization opportunity: check for simple masks like those made of @@ -28492,11 +41397,11 @@ compress_decode_base64(char *dst, const chartype *src, size_t srclen, // time, otherwise, we should just decode directly. int last_block = (int)((bufferptr - buffer_start) % 64); if (last_block != 0 && srcend - src + last_block >= 64) { - while ((bufferptr - buffer_start) % 64 != 0 && src < srcend) { uint8_t val = to_base64[uint8_t(*src)]; *bufferptr = char(val); - if (!scalar::base64::is_eight_byte(*src) || val > 64) { + if ((!scalar::base64::is_eight_byte(*src) || val > 64) && + !ignore_garbage) { return {error_code::INVALID_BASE64_CHARACTER, size_t(src - srcinit), size_t(dst - dstinit)}; } @@ -28542,8 +41447,14 @@ compress_decode_base64(char *dst, const chartype *src, size_t srclen, // backtrack int leftover = int(bufferptr - buffer_start); while (leftover > 0) { - while (to_base64[uint8_t(*(src - 1))] == 64) { - src--; + if (!ignore_garbage) { + while (to_base64[uint8_t(*(src - 1))] == 64) { + src--; + } + } else { + while (to_base64[uint8_t(*(src - 1))] >= 64) { + src--; + } } src--; leftover--; @@ -28552,15 +41463,15 @@ compress_decode_base64(char *dst, const chartype *src, size_t srclen, if (src < srcend + equalsigns) { full_result r = scalar::base64::base64_tail_decode( dst, src, srcend - src, equalsigns, options, last_chunk_options); + r.input_count += size_t(src - srcinit); if (r.error == error_code::INVALID_BASE64_CHARACTER || r.error == error_code::BASE64_EXTRA_BITS) { - r.input_count += size_t(src - srcinit); return r; } else { r.output_count += size_t(dst - dstinit); } if (last_chunk_options != stop_before_partial && - r.error == error_code::SUCCESS && equalsigns > 0) { + r.error == error_code::SUCCESS && equalsigns > 0 && !ignore_garbage) { // additional checks if ((r.output_count % 3 == 0) || ((r.output_count % 3) + 1 + equalsigns != 4)) { @@ -28570,7 +41481,7 @@ compress_decode_base64(char *dst, const chartype *src, size_t srclen, } return r; } - if (equalsigns > 0) { + if (equalsigns > 0 && !ignore_garbage) { if ((size_t(dst - dstinit) % 3 == 0) || ((size_t(dst - dstinit) % 3) + 1 + equalsigns != 4)) { return {INVALID_BASE64_CHARACTER, equallocation, size_t(dst - dstinit)}; @@ -28578,15 +41489,15 @@ compress_decode_base64(char *dst, const chartype *src, size_t srclen, } return {SUCCESS, srclen, size_t(dst - dstinit)}; } -/* end file src/haswell/avx2_base64.cpp */ +/* end file src/westmere/sse_base64.cpp */ } // unnamed namespace -} // namespace haswell +} // namespace westmere } // namespace simdutf /* begin file src/generic/buf_block_reader.h */ namespace simdutf { -namespace haswell { +namespace westmere { namespace { // Walks through a buffer in block-sized increments, loading the last part with @@ -28692,12 +41603,12 @@ simdutf_really_inline void buf_block_reader::advance() { } } // unnamed namespace -} // namespace haswell +} // namespace westmere } // namespace simdutf /* end file src/generic/buf_block_reader.h */ /* begin file src/generic/utf8_validation/utf8_lookup4_algorithm.h */ namespace simdutf { -namespace haswell { +namespace westmere { namespace { namespace utf8_validation { @@ -28917,12 +41828,12 @@ struct utf8_checker { using utf8_validation::utf8_checker; } // unnamed namespace -} // namespace haswell +} // namespace westmere } // namespace simdutf /* end file src/generic/utf8_validation/utf8_lookup4_algorithm.h */ /* begin file src/generic/utf8_validation/utf8_validator.h */ namespace simdutf { -namespace haswell { +namespace westmere { namespace { namespace utf8_validation { @@ -29057,14 +41968,14 @@ result generic_validate_ascii_with_errors(const char *input, size_t length) { } // namespace utf8_validation } // unnamed namespace -} // namespace haswell +} // namespace westmere } // namespace simdutf /* end file src/generic/utf8_validation/utf8_validator.h */ // transcoding from UTF-8 to UTF-16 /* begin file src/generic/utf8_to_utf16/valid_utf8_to_utf16.h */ namespace simdutf { -namespace haswell { +namespace westmere { namespace { namespace utf8_to_utf16 { @@ -29135,13 +42046,13 @@ simdutf_warn_unused size_t convert_valid(const char *input, size_t size, } // namespace utf8_to_utf16 } // unnamed namespace -} // namespace haswell +} // namespace westmere } // namespace simdutf /* end file src/generic/utf8_to_utf16/valid_utf8_to_utf16.h */ /* begin file src/generic/utf8_to_utf16/utf8_to_utf16.h */ namespace simdutf { -namespace haswell { +namespace westmere { namespace { namespace utf8_to_utf16 { using namespace simd; @@ -29470,14 +42381,14 @@ struct validating_transcoder { }; // struct utf8_checker } // namespace utf8_to_utf16 } // unnamed namespace -} // namespace haswell +} // namespace westmere } // namespace simdutf /* end file src/generic/utf8_to_utf16/utf8_to_utf16.h */ // transcoding from UTF-8 to UTF-32 /* begin file src/generic/utf8_to_utf32/valid_utf8_to_utf32.h */ namespace simdutf { -namespace haswell { +namespace westmere { namespace { namespace utf8_to_utf32 { @@ -29516,13 +42427,13 @@ simdutf_warn_unused size_t convert_valid(const char *input, size_t size, } // namespace utf8_to_utf32 } // unnamed namespace -} // namespace haswell +} // namespace westmere } // namespace simdutf /* end file src/generic/utf8_to_utf32/valid_utf8_to_utf32.h */ /* begin file src/generic/utf8_to_utf32/utf8_to_utf32.h */ namespace simdutf { -namespace haswell { +namespace westmere { namespace { namespace utf8_to_utf32 { using namespace simd; @@ -29837,14 +42748,14 @@ struct validating_transcoder { }; // struct utf8_checker } // namespace utf8_to_utf32 } // unnamed namespace -} // namespace haswell +} // namespace westmere } // namespace simdutf /* end file src/generic/utf8_to_utf32/utf8_to_utf32.h */ // other functions /* begin file src/generic/utf8.h */ namespace simdutf { -namespace haswell { +namespace westmere { namespace { namespace utf8 { @@ -29879,12 +42790,12 @@ simdutf_really_inline size_t utf16_length_from_utf8(const char *in, } } // namespace utf8 } // unnamed namespace -} // namespace haswell +} // namespace westmere } // namespace simdutf /* end file src/generic/utf8.h */ /* begin file src/generic/utf16.h */ namespace simdutf { -namespace haswell { +namespace westmere { namespace { namespace utf16 { @@ -29954,15 +42865,14 @@ change_endianness_utf16(const char16_t *in, size_t size, char16_t *output) { } // namespace utf16 } // unnamed namespace -} // namespace haswell +} // namespace westmere } // namespace simdutf /* end file src/generic/utf16.h */ - // transcoding from UTF-8 to Latin 1 /* begin file src/generic/utf8_to_latin1/utf8_to_latin1.h */ namespace simdutf { -namespace haswell { +namespace westmere { namespace { namespace utf8_to_latin1 { using namespace simd; @@ -30119,6 +43029,9 @@ struct validating_transcoder { uint64_t utf8_continuation_mask = input.lt(-65 + 1); // -64 is 1100 0000 in twos complement. Note: in // this case, we also have ASCII to account for. + if (utf8_continuation_mask & 1) { + return 0; // error + } uint64_t utf8_leading_mask = ~utf8_continuation_mask; uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; // We process in blocks of up to 12 bytes except possibly @@ -30272,13 +43185,13 @@ struct validating_transcoder { }; // struct utf8_checker } // namespace utf8_to_latin1 } // unnamed namespace -} // namespace haswell +} // namespace westmere } // namespace simdutf /* end file src/generic/utf8_to_latin1/utf8_to_latin1.h */ /* begin file src/generic/utf8_to_latin1/valid_utf8_to_latin1.h */ namespace simdutf { -namespace haswell { +namespace westmere { namespace { namespace utf8_to_latin1 { using namespace simd; @@ -30352,19 +43265,24 @@ simdutf_really_inline size_t convert_valid(const char *in, size_t size, } // namespace utf8_to_latin1 } // namespace -} // namespace haswell +} // namespace westmere } // namespace simdutf // namespace simdutf /* end file src/generic/utf8_to_latin1/valid_utf8_to_latin1.h */ +// +// Implementation-specific overrides +// + namespace simdutf { -namespace haswell { +namespace westmere { simdutf_warn_unused int implementation::detect_encodings(const char *input, size_t length) const noexcept { // If there is a BOM, then we trust it. auto bom_encoding = simdutf::BOM::check_bom(input, length); + // todo: reimplement as a one-pass algorithm. if (bom_encoding != encoding_type::unspecified) { return bom_encoding; } @@ -30388,22 +43306,23 @@ implementation::detect_encodings(const char *input, simdutf_warn_unused bool implementation::validate_utf8(const char *buf, size_t len) const noexcept { - return haswell::utf8_validation::generic_validate_utf8(buf, len); + return westmere::utf8_validation::generic_validate_utf8(buf, len); } simdutf_warn_unused result implementation::validate_utf8_with_errors( const char *buf, size_t len) const noexcept { - return haswell::utf8_validation::generic_validate_utf8_with_errors(buf, len); + return westmere::utf8_validation::generic_validate_utf8_with_errors(buf, len); } simdutf_warn_unused bool implementation::validate_ascii(const char *buf, size_t len) const noexcept { - return haswell::utf8_validation::generic_validate_ascii(buf, len); + return westmere::utf8_validation::generic_validate_ascii(buf, len); } simdutf_warn_unused result implementation::validate_ascii_with_errors( const char *buf, size_t len) const noexcept { - return haswell::utf8_validation::generic_validate_ascii_with_errors(buf, len); + return westmere::utf8_validation::generic_validate_ascii_with_errors(buf, + len); } simdutf_warn_unused bool @@ -30414,7 +43333,7 @@ implementation::validate_utf16le(const char16_t *buf, // handling nullptr return true; } - const char16_t *tail = avx2_validate_utf16(buf, len); + const char16_t *tail = sse_validate_utf16(buf, len); if (tail) { return scalar::utf16::validate(tail, len - (tail - buf)); @@ -30431,7 +43350,7 @@ implementation::validate_utf16be(const char16_t *buf, // handling nullptr return true; } - const char16_t *tail = avx2_validate_utf16(buf, len); + const char16_t *tail = sse_validate_utf16(buf, len); if (tail) { return scalar::utf16::validate(tail, len - (tail - buf)); } else { @@ -30441,7 +43360,7 @@ implementation::validate_utf16be(const char16_t *buf, simdutf_warn_unused result implementation::validate_utf16le_with_errors( const char16_t *buf, size_t len) const noexcept { - result res = avx2_validate_utf16_with_errors(buf, len); + result res = sse_validate_utf16_with_errors(buf, len); if (res.count != len) { result scalar_res = scalar::utf16::validate_with_errors( buf + res.count, len - res.count); @@ -30453,7 +43372,7 @@ simdutf_warn_unused result implementation::validate_utf16le_with_errors( simdutf_warn_unused result implementation::validate_utf16be_with_errors( const char16_t *buf, size_t len) const noexcept { - result res = avx2_validate_utf16_with_errors(buf, len); + result res = sse_validate_utf16_with_errors(buf, len); if (res.count != len) { result scalar_res = scalar::utf16::validate_with_errors( buf + res.count, len - res.count); @@ -30470,7 +43389,7 @@ implementation::validate_utf32(const char32_t *buf, size_t len) const noexcept { // handling nullptr return true; } - const char32_t *tail = avx2_validate_utf32le(buf, len); + const char32_t *tail = sse_validate_utf32le(buf, len); if (tail) { return scalar::utf32::validate(tail, len - (tail - buf)); } else { @@ -30480,12 +43399,12 @@ implementation::validate_utf32(const char32_t *buf, size_t len) const noexcept { simdutf_warn_unused result implementation::validate_utf32_with_errors( const char32_t *buf, size_t len) const noexcept { - if (simdutf_unlikely(len == 0)) { + if (len == 0) { // empty input is valid UTF-32. protect the implementation from // handling nullptr return result(error_code::SUCCESS, 0); } - result res = avx2_validate_utf32le_with_errors(buf, len); + result res = sse_validate_utf32le_with_errors(buf, len); if (res.count != len) { result scalar_res = scalar::utf32::validate_with_errors(buf + res.count, len - res.count); @@ -30497,8 +43416,9 @@ simdutf_warn_unused result implementation::validate_utf32_with_errors( simdutf_warn_unused size_t implementation::convert_latin1_to_utf8( const char *buf, size_t len, char *utf8_output) const noexcept { + std::pair ret = - avx2_convert_latin1_to_utf8(buf, len, utf8_output); + sse_convert_latin1_to_utf8(buf, len, utf8_output); size_t converted_chars = ret.second - utf8_output; if (ret.first != buf + len) { @@ -30513,7 +43433,7 @@ simdutf_warn_unused size_t implementation::convert_latin1_to_utf8( simdutf_warn_unused size_t implementation::convert_latin1_to_utf16le( const char *buf, size_t len, char16_t *utf16_output) const noexcept { std::pair ret = - avx2_convert_latin1_to_utf16(buf, len, utf16_output); + sse_convert_latin1_to_utf16(buf, len, utf16_output); if (ret.first == nullptr) { return 0; } @@ -30533,7 +43453,7 @@ simdutf_warn_unused size_t implementation::convert_latin1_to_utf16le( simdutf_warn_unused size_t implementation::convert_latin1_to_utf16be( const char *buf, size_t len, char16_t *utf16_output) const noexcept { std::pair ret = - avx2_convert_latin1_to_utf16(buf, len, utf16_output); + sse_convert_latin1_to_utf16(buf, len, utf16_output); if (ret.first == nullptr) { return 0; } @@ -30553,7 +43473,7 @@ simdutf_warn_unused size_t implementation::convert_latin1_to_utf16be( simdutf_warn_unused size_t implementation::convert_latin1_to_utf32( const char *buf, size_t len, char32_t *utf32_output) const noexcept { std::pair ret = - avx2_convert_latin1_to_utf32(buf, len, utf32_output); + sse_convert_latin1_to_utf32(buf, len, utf32_output); if (ret.first == nullptr) { return 0; } @@ -30582,8 +43502,8 @@ simdutf_warn_unused result implementation::convert_utf8_to_latin1_with_errors( } simdutf_warn_unused size_t implementation::convert_valid_utf8_to_latin1( - const char *input, size_t size, char *latin1_output) const noexcept { - return utf8_to_latin1::convert_valid(input, size, latin1_output); + const char *buf, size_t len, char *latin1_output) const noexcept { + return westmere::utf8_to_latin1::convert_valid(buf, len, latin1_output); } simdutf_warn_unused size_t implementation::convert_utf8_to_utf16le( @@ -30643,12 +43563,12 @@ simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf32( simdutf_warn_unused size_t implementation::convert_utf16le_to_latin1( const char16_t *buf, size_t len, char *latin1_output) const noexcept { std::pair ret = - haswell::avx2_convert_utf16_to_latin1(buf, len, - latin1_output); + sse_convert_utf16_to_latin1(buf, len, latin1_output); if (ret.first == nullptr) { return 0; } size_t saved_bytes = ret.second - latin1_output; + if (ret.first != buf + len) { const size_t scalar_saved_bytes = scalar::utf16_to_latin1::convert( @@ -30664,12 +43584,12 @@ simdutf_warn_unused size_t implementation::convert_utf16le_to_latin1( simdutf_warn_unused size_t implementation::convert_utf16be_to_latin1( const char16_t *buf, size_t len, char *latin1_output) const noexcept { std::pair ret = - haswell::avx2_convert_utf16_to_latin1(buf, len, - latin1_output); + sse_convert_utf16_to_latin1(buf, len, latin1_output); if (ret.first == nullptr) { return 0; } size_t saved_bytes = ret.second - latin1_output; + if (ret.first != buf + len) { const size_t scalar_saved_bytes = scalar::utf16_to_latin1::convert( @@ -30686,7 +43606,7 @@ simdutf_warn_unused result implementation::convert_utf16le_to_latin1_with_errors( const char16_t *buf, size_t len, char *latin1_output) const noexcept { std::pair ret = - avx2_convert_utf16_to_latin1_with_errors( + sse_convert_utf16_to_latin1_with_errors( buf, len, latin1_output); if (ret.first.error) { return ret.first; @@ -30713,8 +43633,8 @@ simdutf_warn_unused result implementation::convert_utf16be_to_latin1_with_errors( const char16_t *buf, size_t len, char *latin1_output) const noexcept { std::pair ret = - avx2_convert_utf16_to_latin1_with_errors(buf, len, - latin1_output); + sse_convert_utf16_to_latin1_with_errors(buf, len, + latin1_output); if (ret.first.error) { return ret.first; } // Can return directly since scalar fallback already found correct @@ -30738,21 +43658,20 @@ implementation::convert_utf16be_to_latin1_with_errors( simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_latin1( const char16_t *buf, size_t len, char *latin1_output) const noexcept { - // optimization opportunity: implement a custom function + // optimization opportunity: we could provide an optimized function. return convert_utf16be_to_latin1(buf, len, latin1_output); } simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_latin1( const char16_t *buf, size_t len, char *latin1_output) const noexcept { - // optimization opportunity: implement a custom function + // optimization opportunity: we could provide an optimized function. return convert_utf16le_to_latin1(buf, len, latin1_output); } simdutf_warn_unused size_t implementation::convert_utf16le_to_utf8( const char16_t *buf, size_t len, char *utf8_output) const noexcept { std::pair ret = - haswell::avx2_convert_utf16_to_utf8(buf, len, - utf8_output); + sse_convert_utf16_to_utf8(buf, len, utf8_output); if (ret.first == nullptr) { return 0; } @@ -30772,8 +43691,7 @@ simdutf_warn_unused size_t implementation::convert_utf16le_to_utf8( simdutf_warn_unused size_t implementation::convert_utf16be_to_utf8( const char16_t *buf, size_t len, char *utf8_output) const noexcept { std::pair ret = - haswell::avx2_convert_utf16_to_utf8(buf, len, - utf8_output); + sse_convert_utf16_to_utf8(buf, len, utf8_output); if (ret.first == nullptr) { return 0; } @@ -30795,7 +43713,7 @@ simdutf_warn_unused result implementation::convert_utf16le_to_utf8_with_errors( // ret.first.count is always the position in the buffer, not the number of // code units written even if finished std::pair ret = - haswell::avx2_convert_utf16_to_utf8_with_errors( + westmere::sse_convert_utf16_to_utf8_with_errors( buf, len, utf8_output); if (ret.first.error) { return ret.first; @@ -30823,7 +43741,7 @@ simdutf_warn_unused result implementation::convert_utf16be_to_utf8_with_errors( // ret.first.count is always the position in the buffer, not the number of // code units written even if finished std::pair ret = - haswell::avx2_convert_utf16_to_utf8_with_errors( + westmere::sse_convert_utf16_to_utf8_with_errors( buf, len, utf8_output); if (ret.first.error) { return ret.first; @@ -30856,34 +43774,16 @@ simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_utf8( return convert_utf16be_to_utf8(buf, len, utf8_output); } -simdutf_warn_unused size_t implementation::convert_utf32_to_utf8( - const char32_t *buf, size_t len, char *utf8_output) const noexcept { - std::pair ret = - avx2_convert_utf32_to_utf8(buf, len, utf8_output); - if (ret.first == nullptr) { - return 0; - } - size_t saved_bytes = ret.second - utf8_output; - if (ret.first != buf + len) { - const size_t scalar_saved_bytes = scalar::utf32_to_utf8::convert( - ret.first, len - (ret.first - buf), ret.second); - if (scalar_saved_bytes == 0) { - return 0; - } - saved_bytes += scalar_saved_bytes; - } - return saved_bytes; -} - simdutf_warn_unused size_t implementation::convert_utf32_to_latin1( const char32_t *buf, size_t len, char *latin1_output) const noexcept { std::pair ret = - avx2_convert_utf32_to_latin1(buf, len, latin1_output); + sse_convert_utf32_to_latin1(buf, len, latin1_output); if (ret.first == nullptr) { return 0; } size_t saved_bytes = ret.second - latin1_output; - if (ret.first != buf + len) { + // if (ret.first != buf + len) { + if (ret.first < buf + len) { const size_t scalar_saved_bytes = scalar::utf32_to_latin1::convert( ret.first, len - (ret.first - buf), ret.second); if (scalar_saved_bytes == 0) { @@ -30899,7 +43799,8 @@ simdutf_warn_unused result implementation::convert_utf32_to_latin1_with_errors( // ret.first.count is always the position in the buffer, not the number of // code units written even if finished std::pair ret = - avx2_convert_utf32_to_latin1_with_errors(buf, len, latin1_output); + westmere::sse_convert_utf32_to_latin1_with_errors(buf, len, + latin1_output); if (ret.first.count != len) { result scalar_res = scalar::utf32_to_latin1::convert_with_errors( buf + ret.first.count, len - ret.first.count, ret.second); @@ -30918,15 +43819,35 @@ simdutf_warn_unused result implementation::convert_utf32_to_latin1_with_errors( simdutf_warn_unused size_t implementation::convert_valid_utf32_to_latin1( const char32_t *buf, size_t len, char *latin1_output) const noexcept { + // optimization opportunity: we could provide an optimized function. return convert_utf32_to_latin1(buf, len, latin1_output); } +simdutf_warn_unused size_t implementation::convert_utf32_to_utf8( + const char32_t *buf, size_t len, char *utf8_output) const noexcept { + std::pair ret = + sse_convert_utf32_to_utf8(buf, len, utf8_output); + if (ret.first == nullptr) { + return 0; + } + size_t saved_bytes = ret.second - utf8_output; + if (ret.first != buf + len) { + const size_t scalar_saved_bytes = scalar::utf32_to_utf8::convert( + ret.first, len - (ret.first - buf), ret.second); + if (scalar_saved_bytes == 0) { + return 0; + } + saved_bytes += scalar_saved_bytes; + } + return saved_bytes; +} + simdutf_warn_unused result implementation::convert_utf32_to_utf8_with_errors( const char32_t *buf, size_t len, char *utf8_output) const noexcept { // ret.first.count is always the position in the buffer, not the number of // code units written even if finished std::pair ret = - haswell::avx2_convert_utf32_to_utf8_with_errors(buf, len, utf8_output); + westmere::sse_convert_utf32_to_utf8_with_errors(buf, len, utf8_output); if (ret.first.count != len) { result scalar_res = scalar::utf32_to_utf8::convert_with_errors( buf + ret.first.count, len - ret.first.count, ret.second); @@ -30946,8 +43867,7 @@ simdutf_warn_unused result implementation::convert_utf32_to_utf8_with_errors( simdutf_warn_unused size_t implementation::convert_utf16le_to_utf32( const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { std::pair ret = - haswell::avx2_convert_utf16_to_utf32(buf, len, - utf32_output); + sse_convert_utf16_to_utf32(buf, len, utf32_output); if (ret.first == nullptr) { return 0; } @@ -30967,8 +43887,7 @@ simdutf_warn_unused size_t implementation::convert_utf16le_to_utf32( simdutf_warn_unused size_t implementation::convert_utf16be_to_utf32( const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { std::pair ret = - haswell::avx2_convert_utf16_to_utf32(buf, len, - utf32_output); + sse_convert_utf16_to_utf32(buf, len, utf32_output); if (ret.first == nullptr) { return 0; } @@ -30990,7 +43909,7 @@ simdutf_warn_unused result implementation::convert_utf16le_to_utf32_with_errors( // ret.first.count is always the position in the buffer, not the number of // code units written even if finished std::pair ret = - haswell::avx2_convert_utf16_to_utf32_with_errors( + westmere::sse_convert_utf16_to_utf32_with_errors( buf, len, utf32_output); if (ret.first.error) { return ret.first; @@ -31018,7 +43937,7 @@ simdutf_warn_unused result implementation::convert_utf16be_to_utf32_with_errors( // ret.first.count is always the position in the buffer, not the number of // code units written even if finished std::pair ret = - haswell::avx2_convert_utf16_to_utf32_with_errors( + westmere::sse_convert_utf16_to_utf32_with_errors( buf, len, utf32_output); if (ret.first.error) { return ret.first; @@ -31049,7 +43968,7 @@ simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf8( simdutf_warn_unused size_t implementation::convert_utf32_to_utf16le( const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { std::pair ret = - avx2_convert_utf32_to_utf16(buf, len, utf16_output); + sse_convert_utf32_to_utf16(buf, len, utf16_output); if (ret.first == nullptr) { return 0; } @@ -31069,7 +43988,7 @@ simdutf_warn_unused size_t implementation::convert_utf32_to_utf16le( simdutf_warn_unused size_t implementation::convert_utf32_to_utf16be( const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { std::pair ret = - avx2_convert_utf32_to_utf16(buf, len, utf16_output); + sse_convert_utf32_to_utf16(buf, len, utf16_output); if (ret.first == nullptr) { return 0; } @@ -31091,7 +44010,7 @@ simdutf_warn_unused result implementation::convert_utf32_to_utf16le_with_errors( // ret.first.count is always the position in the buffer, not the number of // code units written even if finished std::pair ret = - haswell::avx2_convert_utf32_to_utf16_with_errors( + westmere::sse_convert_utf32_to_utf16_with_errors( buf, len, utf16_output); if (ret.first.count != len) { result scalar_res = @@ -31115,7 +44034,7 @@ simdutf_warn_unused result implementation::convert_utf32_to_utf16be_with_errors( // ret.first.count is always the position in the buffer, not the number of // code units written even if finished std::pair ret = - haswell::avx2_convert_utf32_to_utf16_with_errors( + westmere::sse_convert_utf32_to_utf16_with_errors( buf, len, utf16_output); if (ret.first.count != len) { result scalar_res = @@ -31200,26 +44119,11 @@ simdutf_warn_unused size_t implementation::utf8_length_from_utf16be( return utf16::utf8_length_from_utf16(input, length); } -simdutf_warn_unused size_t implementation::utf32_length_from_utf16le( - const char16_t *input, size_t length) const noexcept { - return utf16::utf32_length_from_utf16(input, length); -} - -simdutf_warn_unused size_t implementation::utf32_length_from_utf16be( - const char16_t *input, size_t length) const noexcept { - return utf16::utf32_length_from_utf16(input, length); -} - simdutf_warn_unused size_t implementation::utf16_length_from_latin1(size_t length) const noexcept { return scalar::latin1::utf16_length_from_latin1(length); } -simdutf_warn_unused size_t implementation::utf16_length_from_utf8( - const char *input, size_t length) const noexcept { - return utf8::utf16_length_from_utf8(input, length); -} - simdutf_warn_unused size_t implementation::utf32_length_from_latin1(size_t length) const noexcept { return scalar::latin1::utf32_length_from_latin1(length); @@ -31227,91 +44131,110 @@ implementation::utf32_length_from_latin1(size_t length) const noexcept { simdutf_warn_unused size_t implementation::utf8_length_from_latin1( const char *input, size_t len) const noexcept { - const uint8_t *data = reinterpret_cast(input); - size_t answer = len / sizeof(__m256i) * sizeof(__m256i); + const uint8_t *str = reinterpret_cast(input); + size_t answer = len / sizeof(__m128i) * sizeof(__m128i); size_t i = 0; if (answer >= 2048) { // long strings optimization - __m256i four_64bits = _mm256_setzero_si256(); - while (i + sizeof(__m256i) <= len) { - __m256i runner = _mm256_setzero_si256(); - // We can do up to 255 loops without overflow. - size_t iterations = (len - i) / sizeof(__m256i); + __m128i two_64bits = _mm_setzero_si128(); + while (i + sizeof(__m128i) <= len) { + __m128i runner = _mm_setzero_si128(); + size_t iterations = (len - i) / sizeof(__m128i); if (iterations > 255) { iterations = 255; } - size_t max_i = i + iterations * sizeof(__m256i) - sizeof(__m256i); - for (; i + 4 * sizeof(__m256i) <= max_i; i += 4 * sizeof(__m256i)) { - __m256i input1 = _mm256_loadu_si256((const __m256i *)(data + i)); - __m256i input2 = - _mm256_loadu_si256((const __m256i *)(data + i + sizeof(__m256i))); - __m256i input3 = _mm256_loadu_si256( - (const __m256i *)(data + i + 2 * sizeof(__m256i))); - __m256i input4 = _mm256_loadu_si256( - (const __m256i *)(data + i + 3 * sizeof(__m256i))); - __m256i input12 = - _mm256_add_epi8(_mm256_cmpgt_epi8(_mm256_setzero_si256(), input1), - _mm256_cmpgt_epi8(_mm256_setzero_si256(), input2)); - __m256i input23 = - _mm256_add_epi8(_mm256_cmpgt_epi8(_mm256_setzero_si256(), input3), - _mm256_cmpgt_epi8(_mm256_setzero_si256(), input4)); - __m256i input1234 = _mm256_add_epi8(input12, input23); - runner = _mm256_sub_epi8(runner, input1234); + size_t max_i = i + iterations * sizeof(__m128i) - sizeof(__m128i); + for (; i + 4 * sizeof(__m128i) <= max_i; i += 4 * sizeof(__m128i)) { + __m128i input1 = _mm_loadu_si128((const __m128i *)(str + i)); + __m128i input2 = + _mm_loadu_si128((const __m128i *)(str + i + sizeof(__m128i))); + __m128i input3 = + _mm_loadu_si128((const __m128i *)(str + i + 2 * sizeof(__m128i))); + __m128i input4 = + _mm_loadu_si128((const __m128i *)(str + i + 3 * sizeof(__m128i))); + __m128i input12 = + _mm_add_epi8(_mm_cmpgt_epi8(_mm_setzero_si128(), input1), + _mm_cmpgt_epi8(_mm_setzero_si128(), input2)); + __m128i input34 = + _mm_add_epi8(_mm_cmpgt_epi8(_mm_setzero_si128(), input3), + _mm_cmpgt_epi8(_mm_setzero_si128(), input4)); + __m128i input1234 = _mm_add_epi8(input12, input34); + runner = _mm_sub_epi8(runner, input1234); } - for (; i <= max_i; i += sizeof(__m256i)) { - __m256i input_256_chunk = - _mm256_loadu_si256((const __m256i *)(data + i)); - runner = _mm256_sub_epi8( - runner, _mm256_cmpgt_epi8(_mm256_setzero_si256(), input_256_chunk)); + for (; i <= max_i; i += sizeof(__m128i)) { + __m128i more_input = _mm_loadu_si128((const __m128i *)(str + i)); + runner = _mm_sub_epi8(runner, + _mm_cmpgt_epi8(_mm_setzero_si128(), more_input)); } - four_64bits = _mm256_add_epi64( - four_64bits, _mm256_sad_epu8(runner, _mm256_setzero_si256())); + two_64bits = + _mm_add_epi64(two_64bits, _mm_sad_epu8(runner, _mm_setzero_si128())); } - answer += _mm256_extract_epi64(four_64bits, 0) + - _mm256_extract_epi64(four_64bits, 1) + - _mm256_extract_epi64(four_64bits, 2) + - _mm256_extract_epi64(four_64bits, 3); - } else if (answer > 0) { - for (; i + sizeof(__m256i) <= len; i += sizeof(__m256i)) { - __m256i latin = _mm256_loadu_si256((const __m256i *)(data + i)); - uint32_t non_ascii = _mm256_movemask_epi8(latin); + answer += + _mm_extract_epi64(two_64bits, 0) + _mm_extract_epi64(two_64bits, 1); + } else if (answer > 0) { // short string optimization + for (; i + 2 * sizeof(__m128i) <= len; i += 2 * sizeof(__m128i)) { + __m128i latin = _mm_loadu_si128((const __m128i *)(input + i)); + uint16_t non_ascii = (uint16_t)_mm_movemask_epi8(latin); + answer += count_ones(non_ascii); + latin = _mm_loadu_si128((const __m128i *)(input + i) + 1); + non_ascii = (uint16_t)_mm_movemask_epi8(latin); + answer += count_ones(non_ascii); + } + for (; i + sizeof(__m128i) <= len; i += sizeof(__m128i)) { + __m128i latin = _mm_loadu_si128((const __m128i *)(input + i)); + uint16_t non_ascii = (uint16_t)_mm_movemask_epi8(latin); answer += count_ones(non_ascii); } } return answer + scalar::latin1::utf8_length_from_latin1( - reinterpret_cast(data + i), len - i); + reinterpret_cast(str + i), len - i); +} + +simdutf_warn_unused size_t implementation::utf32_length_from_utf16le( + const char16_t *input, size_t length) const noexcept { + return utf16::utf32_length_from_utf16(input, length); +} + +simdutf_warn_unused size_t implementation::utf32_length_from_utf16be( + const char16_t *input, size_t length) const noexcept { + return utf16::utf32_length_from_utf16(input, length); +} + +simdutf_warn_unused size_t implementation::utf16_length_from_utf8( + const char *input, size_t length) const noexcept { + return utf8::utf16_length_from_utf8(input, length); } simdutf_warn_unused size_t implementation::utf8_length_from_utf32( const char32_t *input, size_t length) const noexcept { - const __m256i v_00000000 = _mm256_setzero_si256(); - const __m256i v_ffffff80 = _mm256_set1_epi32((uint32_t)0xffffff80); - const __m256i v_fffff800 = _mm256_set1_epi32((uint32_t)0xfffff800); - const __m256i v_ffff0000 = _mm256_set1_epi32((uint32_t)0xffff0000); + const __m128i v_00000000 = _mm_setzero_si128(); + const __m128i v_ffffff80 = _mm_set1_epi32((uint32_t)0xffffff80); + const __m128i v_fffff800 = _mm_set1_epi32((uint32_t)0xfffff800); + const __m128i v_ffff0000 = _mm_set1_epi32((uint32_t)0xffff0000); size_t pos = 0; size_t count = 0; - for (; pos + 8 <= length; pos += 8) { - __m256i in = _mm256_loadu_si256((__m256i *)(input + pos)); - const __m256i ascii_bytes_bytemask = - _mm256_cmpeq_epi32(_mm256_and_si256(in, v_ffffff80), v_00000000); - const __m256i one_two_bytes_bytemask = - _mm256_cmpeq_epi32(_mm256_and_si256(in, v_fffff800), v_00000000); - const __m256i two_bytes_bytemask = - _mm256_xor_si256(one_two_bytes_bytemask, ascii_bytes_bytemask); - const __m256i one_two_three_bytes_bytemask = - _mm256_cmpeq_epi32(_mm256_and_si256(in, v_ffff0000), v_00000000); - const __m256i three_bytes_bytemask = - _mm256_xor_si256(one_two_three_bytes_bytemask, one_two_bytes_bytemask); - const uint32_t ascii_bytes_bitmask = - static_cast(_mm256_movemask_epi8(ascii_bytes_bytemask)); - const uint32_t two_bytes_bitmask = - static_cast(_mm256_movemask_epi8(two_bytes_bytemask)); - const uint32_t three_bytes_bitmask = - static_cast(_mm256_movemask_epi8(three_bytes_bytemask)); + for (; pos + 4 <= length; pos += 4) { + __m128i in = _mm_loadu_si128((__m128i *)(input + pos)); + const __m128i ascii_bytes_bytemask = + _mm_cmpeq_epi32(_mm_and_si128(in, v_ffffff80), v_00000000); + const __m128i one_two_bytes_bytemask = + _mm_cmpeq_epi32(_mm_and_si128(in, v_fffff800), v_00000000); + const __m128i two_bytes_bytemask = + _mm_xor_si128(one_two_bytes_bytemask, ascii_bytes_bytemask); + const __m128i one_two_three_bytes_bytemask = + _mm_cmpeq_epi32(_mm_and_si128(in, v_ffff0000), v_00000000); + const __m128i three_bytes_bytemask = + _mm_xor_si128(one_two_three_bytes_bytemask, one_two_bytes_bytemask); + const uint16_t ascii_bytes_bitmask = + static_cast(_mm_movemask_epi8(ascii_bytes_bytemask)); + const uint16_t two_bytes_bitmask = + static_cast(_mm_movemask_epi8(two_bytes_bytemask)); + const uint16_t three_bytes_bitmask = + static_cast(_mm_movemask_epi8(three_bytes_bytemask)); size_t ascii_count = count_ones(ascii_bytes_bitmask) / 4; size_t two_bytes_count = count_ones(two_bytes_bitmask) / 4; size_t three_bytes_count = count_ones(three_bytes_bitmask) / 4; - count += 32 - 3 * ascii_count - 2 * two_bytes_count - three_bytes_count; + count += 16 - 3 * ascii_count - 2 * two_bytes_count - three_bytes_count; } return count + scalar::utf32::utf8_length_from_utf32(input + pos, length - pos); @@ -31319,18 +44242,18 @@ simdutf_warn_unused size_t implementation::utf8_length_from_utf32( simdutf_warn_unused size_t implementation::utf16_length_from_utf32( const char32_t *input, size_t length) const noexcept { - const __m256i v_00000000 = _mm256_setzero_si256(); - const __m256i v_ffff0000 = _mm256_set1_epi32((uint32_t)0xffff0000); + const __m128i v_00000000 = _mm_setzero_si128(); + const __m128i v_ffff0000 = _mm_set1_epi32((uint32_t)0xffff0000); size_t pos = 0; size_t count = 0; - for (; pos + 8 <= length; pos += 8) { - __m256i in = _mm256_loadu_si256((__m256i *)(input + pos)); - const __m256i surrogate_bytemask = - _mm256_cmpeq_epi32(_mm256_and_si256(in, v_ffff0000), v_00000000); - const uint32_t surrogate_bitmask = - static_cast(_mm256_movemask_epi8(surrogate_bytemask)); - size_t surrogate_count = (32 - count_ones(surrogate_bitmask)) / 4; - count += 8 + surrogate_count; + for (; pos + 4 <= length; pos += 4) { + __m128i in = _mm_loadu_si128((__m128i *)(input + pos)); + const __m128i surrogate_bytemask = + _mm_cmpeq_epi32(_mm_and_si128(in, v_ffff0000), v_00000000); + const uint16_t surrogate_bitmask = + static_cast(_mm_movemask_epi8(surrogate_bytemask)); + size_t surrogate_count = (16 - count_ones(surrogate_bitmask)) / 4; + count += 4 + surrogate_count; } return count + scalar::utf32::utf16_length_from_utf32(input + pos, length - pos); @@ -31349,21 +44272,45 @@ simdutf_warn_unused size_t implementation::maximal_binary_length_from_base64( simdutf_warn_unused result implementation::base64_to_binary( const char *input, size_t length, char *output, base64_options options, last_chunk_handling_options last_chunk_options) const noexcept { - return (options & base64_url) - ? compress_decode_base64(output, input, length, options, - last_chunk_options) - : compress_decode_base64(output, input, length, options, - last_chunk_options); + if (options & base64_url) { + if (options == base64_options::base64_url_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } + } else { + if (options == base64_options::base64_default_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, + options, last_chunk_options); + } + } } simdutf_warn_unused full_result implementation::base64_to_binary_details( const char *input, size_t length, char *output, base64_options options, last_chunk_handling_options last_chunk_options) const noexcept { - return (options & base64_url) - ? compress_decode_base64(output, input, length, options, - last_chunk_options) - : compress_decode_base64(output, input, length, options, - last_chunk_options); + if (options & base64_url) { + if (options == base64_options::base64_url_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } + } else { + if (options == base64_options::base64_default_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, + options, last_chunk_options); + } + } } simdutf_warn_unused size_t implementation::maximal_binary_length_from_base64( @@ -31374,21 +44321,45 @@ simdutf_warn_unused size_t implementation::maximal_binary_length_from_base64( simdutf_warn_unused result implementation::base64_to_binary( const char16_t *input, size_t length, char *output, base64_options options, last_chunk_handling_options last_chunk_options) const noexcept { - return (options & base64_url) - ? compress_decode_base64(output, input, length, options, - last_chunk_options) - : compress_decode_base64(output, input, length, options, - last_chunk_options); + if (options & base64_url) { + if (options == base64_options::base64_url_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } + } else { + if (options == base64_options::base64_default_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, + options, last_chunk_options); + } + } } simdutf_warn_unused full_result implementation::base64_to_binary_details( const char16_t *input, size_t length, char *output, base64_options options, last_chunk_handling_options last_chunk_options) const noexcept { - return (options & base64_url) - ? compress_decode_base64(output, input, length, options, - last_chunk_options) - : compress_decode_base64(output, input, length, options, - last_chunk_options); + if (options & base64_url) { + if (options == base64_options::base64_url_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } + } else { + if (options == base64_options::base64_default_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, + options, last_chunk_options); + } + } } simdutf_warn_unused size_t implementation::base64_length_from_binary( @@ -31405,3573 +44376,5838 @@ size_t implementation::binary_to_base64(const char *input, size_t length, return encode_base64(output, input, length, options); } } -} // namespace haswell +} // namespace westmere } // namespace simdutf -/* begin file src/simdutf/haswell/end.h */ -#if SIMDUTF_CAN_ALWAYS_RUN_HASWELL +/* begin file src/simdutf/westmere/end.h */ +#if SIMDUTF_CAN_ALWAYS_RUN_WESTMERE // nothing needed. #else SIMDUTF_UNTARGET_REGION #endif - -#if SIMDUTF_GCC11ORMORE // workaround for - // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105593 -SIMDUTF_POP_DISABLE_WARNINGS -#endif // end of workaround -/* end file src/simdutf/haswell/end.h */ -/* end file src/haswell/implementation.cpp */ +/* end file src/simdutf/westmere/end.h */ +/* end file src/westmere/implementation.cpp */ #endif -#if SIMDUTF_IMPLEMENTATION_PPC64 -/* begin file src/ppc64/implementation.cpp */ - - - - - -/* begin file src/simdutf/ppc64/begin.h */ -// redefining SIMDUTF_IMPLEMENTATION to "ppc64" -// #define SIMDUTF_IMPLEMENTATION ppc64 -/* end file src/simdutf/ppc64/begin.h */ +#if SIMDUTF_IMPLEMENTATION_LSX +/* begin file src/lsx/implementation.cpp */ +/* begin file src/simdutf/lsx/begin.h */ +// redefining SIMDUTF_IMPLEMENTATION to "lsx" +// #define SIMDUTF_IMPLEMENTATION lsx +/* end file src/simdutf/lsx/begin.h */ namespace simdutf { -namespace ppc64 { +namespace lsx { namespace { -#ifndef SIMDUTF_PPC64_H - #error "ppc64.h must be included" +#ifndef SIMDUTF_LSX_H + #error "lsx.h must be included" #endif using namespace simd; +// convert vmskltz/vmskgez/vmsknz to +// simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes index +const uint8_t lsx_1_2_utf8_bytes_mask[] = { + 0, 1, 4, 5, 16, 17, 20, 21, 64, 65, 68, 69, 80, 81, 84, + 85, 2, 3, 6, 7, 18, 19, 22, 23, 66, 67, 70, 71, 82, 83, + 86, 87, 8, 9, 12, 13, 24, 25, 28, 29, 72, 73, 76, 77, 88, + 89, 92, 93, 10, 11, 14, 15, 26, 27, 30, 31, 74, 75, 78, 79, + 90, 91, 94, 95, 32, 33, 36, 37, 48, 49, 52, 53, 96, 97, 100, + 101, 112, 113, 116, 117, 34, 35, 38, 39, 50, 51, 54, 55, 98, 99, + 102, 103, 114, 115, 118, 119, 40, 41, 44, 45, 56, 57, 60, 61, 104, + 105, 108, 109, 120, 121, 124, 125, 42, 43, 46, 47, 58, 59, 62, 63, + 106, 107, 110, 111, 122, 123, 126, 127, 128, 129, 132, 133, 144, 145, 148, + 149, 192, 193, 196, 197, 208, 209, 212, 213, 130, 131, 134, 135, 146, 147, + 150, 151, 194, 195, 198, 199, 210, 211, 214, 215, 136, 137, 140, 141, 152, + 153, 156, 157, 200, 201, 204, 205, 216, 217, 220, 221, 138, 139, 142, 143, + 154, 155, 158, 159, 202, 203, 206, 207, 218, 219, 222, 223, 160, 161, 164, + 165, 176, 177, 180, 181, 224, 225, 228, 229, 240, 241, 244, 245, 162, 163, + 166, 167, 178, 179, 182, 183, 226, 227, 230, 231, 242, 243, 246, 247, 168, + 169, 172, 173, 184, 185, 188, 189, 232, 233, 236, 237, 248, 249, 252, 253, + 170, 171, 174, 175, 186, 187, 190, 191, 234, 235, 238, 239, 250, 251, 254, + 255}; + +simdutf_really_inline __m128i lsx_swap_bytes(__m128i vec) { + // const v16u8 shuf = {1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14}; + // return __lsx_vshuf_b(__lsx_vldi(0), vec, shuf); + return __lsx_vshuf4i_b(vec, 0b10110001); + // return __lsx_vor_v(__lsx_vslli_h(vec, 8), __lsx_vsrli_h(vec, 8)); +} + simdutf_really_inline bool is_ascii(const simd8x64 &input) { - // careful: 0x80 is not ascii. - return input.reduce_or().saturating_sub(0b01111111u).bits_not_set_anywhere(); + return input.is_ascii(); } simdutf_unused simdutf_really_inline simd8 must_be_continuation(const simd8 prev1, const simd8 prev2, const simd8 prev3) { - simd8 is_second_byte = - prev1.saturating_sub(0b11000000u - 1); // Only 11______ will be > 0 - simd8 is_third_byte = - prev2.saturating_sub(0b11100000u - 1); // Only 111_____ will be > 0 - simd8 is_fourth_byte = - prev3.saturating_sub(0b11110000u - 1); // Only 1111____ will be > 0 - // Caller requires a bool (all 1's). All values resulting from the subtraction - // will be <= 64, so signed comparison is fine. - return simd8(is_second_byte | is_third_byte | is_fourth_byte) > - int8_t(0); + simd8 is_second_byte = prev1 >= uint8_t(0b11000000u); + simd8 is_third_byte = prev2 >= uint8_t(0b11100000u); + simd8 is_fourth_byte = prev3 >= uint8_t(0b11110000u); + // Use ^ instead of | for is_*_byte, because ^ is commutative, and the caller + // is using ^ as well. This will work fine because we only have to report + // errors for cases with 0-1 lead bytes. Multiple lead bytes implies 2 + // overlapping multibyte characters, and if that happens, there is guaranteed + // to be at least *one* lead byte that is part of only 1 other multibyte + // character. The error will be detected there. + return is_second_byte ^ is_third_byte ^ is_fourth_byte; } simdutf_really_inline simd8 must_be_2_3_continuation(const simd8 prev2, const simd8 prev3) { - simd8 is_third_byte = - prev2.saturating_sub(0xe0u - 0x80); // Only 111_____ will be >= 0x80 - simd8 is_fourth_byte = - prev3.saturating_sub(0xf0u - 0x80); // Only 1111____ will be >= 0x80 - // Caller requires a bool (all 1's). All values resulting from the subtraction - // will be <= 64, so signed comparison is fine. - return simd8(is_third_byte | is_fourth_byte); + simd8 is_third_byte = prev2 >= uint8_t(0b11100000u); + simd8 is_fourth_byte = prev3 >= uint8_t(0b11110000u); + return is_third_byte ^ is_fourth_byte; } -} // unnamed namespace -} // namespace ppc64 -} // namespace simdutf +// common functions for utf8 conversions +simdutf_really_inline __m128i convert_utf8_3_byte_to_utf16(__m128i in) { + // Low half contains 10bbbbbb|10cccccc + // High half contains 1110aaaa|1110aaaa + const v16u8 sh = {2, 1, 5, 4, 8, 7, 11, 10, 0, 0, 3, 3, 6, 6, 9, 9}; + const v8u16 v0fff = {0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff}; + + __m128i perm = __lsx_vshuf_b(__lsx_vldi(0), in, (__m128i)sh); + // 1110aaaa => aaaa0000 + __m128i perm_high = __lsx_vslli_b(__lsx_vbsrl_v(perm, 8), 4); + // 10bbbbbb 10cccccc => 0010bbbb bbcccccc + __m128i composed = __lsx_vbitsel_v(__lsx_vsrli_h(perm, 2), /* perm >> 2*/ + perm, __lsx_vrepli_h(0x3f) /* 0x003f */); + // 0010bbbb bbcccccc => aaaabbbb bbcccccc + composed = __lsx_vbitsel_v(perm_high, composed, (__m128i)v0fff); -/* begin file src/generic/buf_block_reader.h */ -namespace simdutf { -namespace ppc64 { -namespace { + return composed; +} -// Walks through a buffer in block-sized increments, loading the last part with -// spaces -template struct buf_block_reader { -public: - simdutf_really_inline buf_block_reader(const uint8_t *_buf, size_t _len); - simdutf_really_inline size_t block_index(); - simdutf_really_inline bool has_full_block() const; - simdutf_really_inline const uint8_t *full_block() const; - /** - * Get the last block, padded with spaces. - * - * There will always be a last block, with at least 1 byte, unless len == 0 - * (in which case this function fills the buffer with spaces and returns 0. In - * particular, if len == STEP_SIZE there will be 0 full_blocks and 1 remainder - * block with STEP_SIZE bytes and no spaces for padding. - * - * @return the number of effective characters in the last block. - */ - simdutf_really_inline size_t get_remainder(uint8_t *dst) const; - simdutf_really_inline void advance(); +simdutf_really_inline __m128i convert_utf8_2_byte_to_utf16(__m128i in) { + // 10bbbbb 110aaaaa => 00bbbbb 000aaaaa + __m128i composed = __lsx_vand_v(in, __lsx_vldi(0x3f)); + // 00bbbbbb 000aaaaa => 00000aaa aabbbbbb + composed = __lsx_vbitsel_v( + __lsx_vsrli_h(__lsx_vslli_h(composed, 8), 2), /* (aaaaa << 8) >> 2 */ + __lsx_vsrli_h(composed, 8), /* bbbbbb >> 8 */ + __lsx_vrepli_h(0x3f)); /* 0x003f */ + return composed; +} -private: - const uint8_t *buf; - const size_t len; - const size_t lenminusstep; - size_t idx; -}; +simdutf_really_inline __m128i +convert_utf8_1_to_2_byte_to_utf16(__m128i in, size_t shufutf8_idx) { + // Converts 6 1-2 byte UTF-8 characters to 6 UTF-16 characters. + // This is a relatively easy scenario + // we process SIX (6) input code-code units. The max length in bytes of six + // code code units spanning between 1 and 2 bytes each is 12 bytes. + __m128i sh = + __lsx_vld(reinterpret_cast( + simdutf::tables::utf8_to_utf16::shufutf8[shufutf8_idx]), + 0); + // Shuffle + // 1 byte: 00000000 0bbbbbbb + // 2 byte: 110aaaaa 10bbbbbb + __m128i perm = __lsx_vshuf_b(__lsx_vldi(0), in, sh); + // 1 byte: 00000000 0bbbbbbb + // 2 byte: 00000000 00bbbbbb + __m128i ascii = __lsx_vand_v(perm, __lsx_vrepli_h(0x7f)); // 6 or 7 bits + // 1 byte: 00000000 00000000 + // 2 byte: 00000aaa aa000000 + const __m128i v1f00 = __lsx_vldi(-2785); // -2785(13bit) => 151f + __m128i composed = __lsx_vsrli_h(__lsx_vand_v(perm, v1f00), 2); // 5 bits + // Combine with a shift right accumulate + // 1 byte: 00000000 0bbbbbbb + // 2 byte: 00000aaa aabbbbbb + composed = __lsx_vadd_h(ascii, composed); + return composed; +} -// Routines to print masks and text for debugging bitmask operations -simdutf_unused static char *format_input_text_64(const uint8_t *text) { - static char *buf = - reinterpret_cast(malloc(sizeof(simd8x64) + 1)); - for (size_t i = 0; i < sizeof(simd8x64); i++) { - buf[i] = int8_t(text[i]) < ' ' ? '_' : int8_t(text[i]); +/* begin file src/lsx/lsx_validate_utf16.cpp */ +/* + In UTF-16 code units in range 0xD800 to 0xDFFF have special meaning. + + In a vectorized algorithm we want to examine the most significant + nibble in order to select a fast path. If none of highest nibbles + are 0xD (13), than we are sure that UTF-16 chunk in a vector + register is valid. + + Let us analyze what we need to check if the nibble is 0xD. The + value of the preceding nibble determines what we have: + + 0xd000 .. 0xd7ff - a valid word + 0xd800 .. 0xdbff - low surrogate + 0xdc00 .. 0xdfff - high surrogate + + Other constraints we have to consider: + - there must not be two consecutive low surrogates (0xd800 .. 0xdbff) + - there must not be two consecutive high surrogates (0xdc00 .. 0xdfff) + - there must not be sole low surrogate nor high surrogate + + We're going to build three bitmasks based on the 3rd nibble: + - V = valid word, + - L = low surrogate (0xd800 .. 0xdbff) + - H = high surrogate (0xdc00 .. 0xdfff) + + 0 1 2 3 4 5 6 7 <--- word index + [ V | L | H | L | H | V | V | L ] + 1 0 0 0 0 1 1 0 - V = valid masks + 0 1 0 1 0 0 0 1 - L = low surrogate + 0 0 1 0 1 0 0 0 - H high surrogate + + + 1 0 0 0 0 1 1 0 V = valid masks + 0 1 0 1 0 0 0 0 a = L & (H >> 1) + 0 0 1 0 1 0 0 0 b = a << 1 + 1 1 1 1 1 1 1 0 c = V | a | b + ^ + the last bit can be zero, we just consume 7 + code units and recheck this word in the next iteration +*/ + +/* Returns: + - pointer to the last unprocessed character (a scalar fallback should check + the rest); + - nullptr if an error was detected. +*/ +template +const char16_t *lsx_validate_utf16(const char16_t *input, size_t size) { + const char16_t *end = input + size; + + const auto v_d8 = simd8::splat(0xd8); + const auto v_f8 = simd8::splat(0xf8); + const auto v_fc = simd8::splat(0xfc); + const auto v_dc = simd8::splat(0xdc); + + while (input + simd16::SIZE * 2 < end) { + // 0. Load data: since the validation takes into account only higher + // byte of each word, we compress the two vectors into one which + // consists only the higher bytes. + auto in0 = simd16(input); + auto in1 = + simd16(input + simd16::SIZE / sizeof(char16_t)); + if (big_endian) { + in0 = in0.swap_bytes(); + in1 = in1.swap_bytes(); + } + const auto in = simd8(__lsx_vssrlni_bu_h(in1.value, in0.value, 8)); + + // 1. Check whether we have any 0xD800..DFFF word (0b1101'1xxx'yyyy'yyyy). + const auto surrogates_wordmask = (in & v_f8) == v_d8; + const uint16_t surrogates_bitmask = + static_cast(surrogates_wordmask.to_bitmask()); + if (surrogates_bitmask == 0x0000) { + input += 16; + } else { + // 2. We have some surrogates that have to be distinguished: + // - low surrogates: 0b1101'10xx'yyyy'yyyy (0xD800..0xDBFF) + // - high surrogates: 0b1101'11xx'yyyy'yyyy (0xDC00..0xDFFF) + // + // Fact: high surrogate has 11th bit set (3rd bit in the higher word) + + // V - non-surrogate code units + // V = not surrogates_wordmask + const uint16_t V = static_cast(~surrogates_bitmask); + + // H - word-mask for high surrogates: the six highest bits are 0b1101'11 + const auto vH = (in & v_fc) == v_dc; + const uint16_t H = static_cast(vH.to_bitmask()); + + // L - word mask for low surrogates + // L = not H and surrogates_wordmask + const uint16_t L = static_cast(~H & surrogates_bitmask); + + const uint16_t a = static_cast( + L & (H >> 1)); // A low surrogate must be followed by high one. + // (A low surrogate placed in the 7th register's word + // is an exception we handle.) + const uint16_t b = static_cast( + a << 1); // Just mark that the opinput - startite fact is hold, + // thanks to that we have only two masks for valid case. + const uint16_t c = static_cast( + V | a | b); // Combine all the masks into the final one. + + if (c == 0xffff) { + // The whole input register contains valid UTF-16, i.e., + // either single code units or proper surrogate pairs. + input += 16; + } else if (c == 0x7fff) { + // The 15 lower code units of the input register contains valid UTF-16. + // The 15th word may be either a low or high surrogate. It the next + // iteration we 1) check if the low surrogate is followed by a high + // one, 2) reject sole high surrogate. + input += 15; + } else { + return nullptr; + } + } } - buf[sizeof(simd8x64)] = '\0'; - return buf; + + return input; } -// Routines to print masks and text for debugging bitmask operations -simdutf_unused static char *format_input_text(const simd8x64 &in) { - static char *buf = - reinterpret_cast(malloc(sizeof(simd8x64) + 1)); - in.store(reinterpret_cast(buf)); - for (size_t i = 0; i < sizeof(simd8x64); i++) { - if (buf[i] < ' ') { - buf[i] = '_'; +template +const result lsx_validate_utf16_with_errors(const char16_t *input, + size_t size) { + const char16_t *start = input; + const char16_t *end = input + size; + + const auto v_d8 = simd8::splat(0xd8); + const auto v_f8 = simd8::splat(0xf8); + const auto v_fc = simd8::splat(0xfc); + const auto v_dc = simd8::splat(0xdc); + + while (input + simd16::SIZE * 2 < end) { + // 0. Load data: since the validation takes into account only higher + // byte of each word, we compress the two vectors into one which + // consists only the higher bytes. + auto in0 = simd16(input); + auto in1 = + simd16(input + simd16::SIZE / sizeof(char16_t)); + + if (big_endian) { + in0 = in0.swap_bytes(); + in1 = in1.swap_bytes(); + } + + const auto in = simd8(__lsx_vssrlni_bu_h(in1.value, in0.value, 8)); + + // 1. Check whether we have any 0xD800..DFFF word (0b1101'1xxx'yyyy'yyyy). + const auto surrogates_wordmask = (in & v_f8) == v_d8; + const uint16_t surrogates_bitmask = + static_cast(surrogates_wordmask.to_bitmask()); + if (surrogates_bitmask == 0x0000) { + input += 16; + } else { + // 2. We have some surrogates that have to be distinguished: + // - low surrogates: 0b1101'10xx'yyyy'yyyy (0xD800..0xDBFF) + // - high surrogates: 0b1101'11xx'yyyy'yyyy (0xDC00..0xDFFF) + // + // Fact: high surrogate has 11th bit set (3rd bit in the higher word) + + // V - non-surrogate code units + // V = not surrogates_wordmask + const uint16_t V = static_cast(~surrogates_bitmask); + + // H - word-mask for high surrogates: the six highest bits are 0b1101'11 + const auto vH = (in & v_fc) == v_dc; + const uint16_t H = static_cast(vH.to_bitmask()); + + // L - word mask for low surrogates + // L = not H and surrogates_wordmask + const uint16_t L = static_cast(~H & surrogates_bitmask); + + const uint16_t a = static_cast( + L & (H >> 1)); // A low surrogate must be followed by high one. + // (A low surrogate placed in the 7th register's word + // is an exception we handle.) + const uint16_t b = static_cast( + a << 1); // Just mark that the opinput - startite fact is hold, + // thanks to that we have only two masks for valid case. + const uint16_t c = static_cast( + V | a | b); // Combine all the masks into the final one. + + if (c == 0xffff) { + // The whole input register contains valid UTF-16, i.e., + // either single code units or proper surrogate pairs. + input += 16; + } else if (c == 0x7fff) { + // The 15 lower code units of the input register contains valid UTF-16. + // The 15th word may be either a low or high surrogate. It the next + // iteration we 1) check if the low surrogate is followed by a high + // one, 2) reject sole high surrogate. + input += 15; + } else { + return result(error_code::SURROGATE, input - start); + } } } - buf[sizeof(simd8x64)] = '\0'; - return buf; + + return result(error_code::SUCCESS, input - start); +} +/* end file src/lsx/lsx_validate_utf16.cpp */ +/* begin file src/lsx/lsx_validate_utf32le.cpp */ + +const char32_t *lsx_validate_utf32le(const char32_t *input, size_t size) { + const char32_t *end = input + size; + + __m128i offset = __lsx_vreplgr2vr_w(uint32_t(0xffff2000)); + __m128i standardoffsetmax = __lsx_vreplgr2vr_w(uint32_t(0xfffff7ff)); + __m128i standardmax = __lsx_vldi(-2288); /*0x10ffff*/ + __m128i currentmax = __lsx_vldi(0x0); + __m128i currentoffsetmax = __lsx_vldi(0x0); + + while (input + 4 < end) { + __m128i in = __lsx_vld(reinterpret_cast(input), 0); + currentmax = __lsx_vmax_wu(in, currentmax); + // 0xD8__ + 0x2000 = 0xF8__ => 0xF8__ > 0xF7FF + currentoffsetmax = + __lsx_vmax_wu(__lsx_vadd_w(in, offset), currentoffsetmax); + + input += 4; + } + + __m128i is_zero = + __lsx_vxor_v(__lsx_vmax_wu(currentmax, standardmax), standardmax); + if (__lsx_bnz_v(is_zero)) { + return nullptr; + } + + is_zero = __lsx_vxor_v(__lsx_vmax_wu(currentoffsetmax, standardoffsetmax), + standardoffsetmax); + if (__lsx_bnz_v(is_zero)) { + return nullptr; + } + + return input; +} + +const result lsx_validate_utf32le_with_errors(const char32_t *input, + size_t size) { + const char32_t *start = input; + const char32_t *end = input + size; + + __m128i offset = __lsx_vreplgr2vr_w(uint32_t(0xffff2000)); + __m128i standardoffsetmax = __lsx_vreplgr2vr_w(uint32_t(0xfffff7ff)); + __m128i standardmax = __lsx_vldi(-2288); /*0x10ffff*/ + __m128i currentmax = __lsx_vldi(0x0); + __m128i currentoffsetmax = __lsx_vldi(0x0); + + while (input + 4 < end) { + __m128i in = __lsx_vld(reinterpret_cast(input), 0); + currentmax = __lsx_vmax_wu(in, currentmax); + currentoffsetmax = + __lsx_vmax_wu(__lsx_vadd_w(in, offset), currentoffsetmax); + + __m128i is_zero = + __lsx_vxor_v(__lsx_vmax_wu(currentmax, standardmax), standardmax); + if (__lsx_bnz_v(is_zero)) { + return result(error_code::TOO_LARGE, input - start); + } + + is_zero = __lsx_vxor_v(__lsx_vmax_wu(currentoffsetmax, standardoffsetmax), + standardoffsetmax); + if (__lsx_bnz_v(is_zero)) { + return result(error_code::SURROGATE, input - start); + } + + input += 4; + } + + return result(error_code::SUCCESS, input - start); +} +/* end file src/lsx/lsx_validate_utf32le.cpp */ + +/* begin file src/lsx/lsx_convert_latin1_to_utf8.cpp */ +/* + Returns a pair: the first unprocessed byte from buf and utf8_output + A scalar routing should carry on the conversion of the tail. +*/ + +std::pair +lsx_convert_latin1_to_utf8(const char *latin1_input, size_t len, + char *utf8_out) { + uint8_t *utf8_output = reinterpret_cast(utf8_out); + const char *end = latin1_input + len; + + __m128i zero = __lsx_vldi(0); + // We always write 16 bytes, of which more than the first 8 bytes + // are valid. A safety margin of 8 is more than sufficient. + while (latin1_input + 16 <= end) { + __m128i in8 = __lsx_vld(reinterpret_cast(latin1_input), 0); + uint32_t ascii = __lsx_vpickve2gr_hu(__lsx_vmskgez_b(in8), 0); + if (ascii == 0xffff) { // ASCII fast path!!!! + __lsx_vst(in8, utf8_output, 0); + utf8_output += 16; + latin1_input += 16; + continue; + } + // We just fallback on UTF-16 code. This could be optimized/simplified + // further. + __m128i in16 = __lsx_vilvl_b(zero, in8); + // 1. prepare 2-byte values + // input 8-bit word : [aabb|bbbb] x 8 + // expected output : [1100|00aa|10bb|bbbb] x 8 + // t0 = [0000|00aa|bbbb|bb00] + __m128i t0 = __lsx_vslli_h(in16, 2); + // t1 = [0000|00aa|0000|0000] + __m128i t1 = __lsx_vand_v(t0, __lsx_vldi(-2785)); + // t3 = [0000|00aa|00bb|bbbb] + __m128i t2 = __lsx_vbitsel_v(t1, in16, __lsx_vrepli_h(0x3f)); + // t4 = [1100|00aa|10bb|bbbb] + __m128i t3 = __lsx_vor_v(t2, __lsx_vreplgr2vr_h(uint16_t(0xc080))); + // merge ASCII and 2-byte codewords + __m128i one_byte_bytemask = __lsx_vsle_hu(in16, __lsx_vrepli_h(0x7F)); + __m128i utf8_unpacked = __lsx_vbitsel_v(t3, in16, one_byte_bytemask); + + const uint8_t *row = &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes + [lsx_1_2_utf8_bytes_mask[(ascii & 0xff)]][0]; + __m128i shuffle = __lsx_vld(row + 1, 0); + __m128i utf8_packed = __lsx_vshuf_b(zero, utf8_unpacked, shuffle); + + // store bytes + __lsx_vst(utf8_packed, utf8_output, 0); + // adjust pointers + latin1_input += 8; + utf8_output += row[0]; + + } // while + + return std::make_pair(latin1_input, reinterpret_cast(utf8_output)); +} +/* end file src/lsx/lsx_convert_latin1_to_utf8.cpp */ +/* begin file src/lsx/lsx_convert_latin1_to_utf16.cpp */ +std::pair +lsx_convert_latin1_to_utf16le(const char *buf, size_t len, + char16_t *utf16_output) { + const char *end = buf + len; + + __m128i zero = __lsx_vldi(0); + while (buf + 16 <= end) { + __m128i in8 = __lsx_vld(reinterpret_cast(buf), 0); + + __m128i inlow = __lsx_vilvl_b(zero, in8); + __m128i inhigh = __lsx_vilvh_b(zero, in8); + __lsx_vst(inlow, reinterpret_cast(utf16_output), 0); + __lsx_vst(inhigh, reinterpret_cast(utf16_output), 16); + + utf16_output += 16; + buf += 16; + } + + return std::make_pair(buf, utf16_output); } -simdutf_unused static char *format_mask(uint64_t mask) { - static char *buf = reinterpret_cast(malloc(64 + 1)); - for (size_t i = 0; i < 64; i++) { - buf[i] = (mask & (size_t(1) << i)) ? 'X' : ' '; +std::pair +lsx_convert_latin1_to_utf16be(const char *buf, size_t len, + char16_t *utf16_output) { + const char *end = buf + len; + __m128i zero = __lsx_vldi(0); + while (buf + 16 <= end) { + __m128i in8 = __lsx_vld(reinterpret_cast(buf), 0); + + __m128i inlow = __lsx_vilvl_b(in8, zero); + __m128i inhigh = __lsx_vilvh_b(in8, zero); + __lsx_vst(inlow, reinterpret_cast(utf16_output), 0); + __lsx_vst(inhigh, reinterpret_cast(utf16_output), 16); + utf16_output += 16; + buf += 16; } - buf[64] = '\0'; - return buf; + + return std::make_pair(buf, utf16_output); } +/* end file src/lsx/lsx_convert_latin1_to_utf16.cpp */ +/* begin file src/lsx/lsx_convert_latin1_to_utf32.cpp */ +std::pair +lsx_convert_latin1_to_utf32(const char *buf, size_t len, + char32_t *utf32_output) { + const char *end = buf + len; -template -simdutf_really_inline -buf_block_reader::buf_block_reader(const uint8_t *_buf, size_t _len) - : buf{_buf}, len{_len}, lenminusstep{len < STEP_SIZE ? 0 : len - STEP_SIZE}, - idx{0} {} + while (buf + 16 <= end) { + __m128i in8 = __lsx_vld(reinterpret_cast(buf), 0); -template -simdutf_really_inline size_t buf_block_reader::block_index() { - return idx; -} + __m128i zero = __lsx_vldi(0); + __m128i in16low = __lsx_vilvl_b(zero, in8); + __m128i in16high = __lsx_vilvh_b(zero, in8); + __m128i in32_0 = __lsx_vilvl_h(zero, in16low); + __m128i in32_1 = __lsx_vilvh_h(zero, in16low); + __m128i in32_2 = __lsx_vilvl_h(zero, in16high); + __m128i in32_3 = __lsx_vilvh_h(zero, in16high); -template -simdutf_really_inline bool buf_block_reader::has_full_block() const { - return idx < lenminusstep; -} + __lsx_vst(in32_0, reinterpret_cast(utf32_output), 0); + __lsx_vst(in32_1, reinterpret_cast(utf32_output + 4), 0); + __lsx_vst(in32_2, reinterpret_cast(utf32_output + 8), 0); + __lsx_vst(in32_3, reinterpret_cast(utf32_output + 12), 0); -template -simdutf_really_inline const uint8_t * -buf_block_reader::full_block() const { - return &buf[idx]; -} + utf32_output += 16; + buf += 16; + } -template -simdutf_really_inline size_t -buf_block_reader::get_remainder(uint8_t *dst) const { - if (len == idx) { - return 0; - } // memcpy(dst, null, 0) will trigger an error with some sanitizers - std::memset(dst, 0x20, - STEP_SIZE); // std::memset STEP_SIZE because it is more efficient - // to write out 8 or 16 bytes at once. - std::memcpy(dst, buf + idx, len - idx); - return len - idx; + return std::make_pair(buf, utf32_output); } +/* end file src/lsx/lsx_convert_latin1_to_utf32.cpp */ -template -simdutf_really_inline void buf_block_reader::advance() { - idx += STEP_SIZE; -} +/* begin file src/lsx/lsx_convert_utf8_to_utf16.cpp */ +// Convert up to 16 bytes from utf8 to utf16 using a mask indicating the +// end of the code points. Only the least significant 12 bits of the mask +// are accessed. +// It returns how many bytes were consumed (up to 16, usually 12). +template +size_t convert_masked_utf8_to_utf16(const char *input, + uint64_t utf8_end_of_code_point_mask, + char16_t *&utf16_output) { + // we use an approach where we try to process up to 12 input bytes. + // Why 12 input bytes and not 16? Because we are concerned with the size of + // the lookup tables. Also 12 is nicely divisible by two and three. + // + __m128i in = __lsx_vld(reinterpret_cast(input), 0); + const uint16_t input_utf8_end_of_code_point_mask = + utf8_end_of_code_point_mask & 0xfff; + // + // Optimization note: our main path below is load-latency dependent. Thus it + // is maybe beneficial to have fast paths that depend on branch prediction but + // have less latency. This results in more instructions but, potentially, also + // higher speeds. -} // unnamed namespace -} // namespace ppc64 -} // namespace simdutf -/* end file src/generic/buf_block_reader.h */ -/* begin file src/generic/utf8_validation/utf8_lookup4_algorithm.h */ -namespace simdutf { -namespace ppc64 { -namespace { -namespace utf8_validation { + // We first try a few fast paths. + // The obvious first test is ASCII, which actually consumes the full 16. + if ((utf8_end_of_code_point_mask & 0xFFFF) == 0xFFFF) { + // We process in chunks of 16 bytes + // The routine in simd.h is reused. + simd8 temp{in}; + temp.store_ascii_as_utf16(utf16_output); + utf16_output += 16; // We wrote 16 16-bit characters. + return 16; // We consumed 16 bytes. + } -using namespace simd; + uint64_t buffer[2]; + // 3 byte sequences are the next most common, as seen in CJK, which has long + // sequences of these. + if (input_utf8_end_of_code_point_mask == 0x924) { + // We want to take 4 3-byte UTF-8 code units and turn them into 4 2-byte + // UTF-16 code units. + __m128i composed = convert_utf8_3_byte_to_utf16(in); + // Byte swap if necessary + if (!match_system(big_endian)) { + composed = lsx_swap_bytes(composed); + } -simdutf_really_inline simd8 -check_special_cases(const simd8 input, const simd8 prev1) { - // Bit 0 = Too Short (lead byte/ASCII followed by lead byte/ASCII) - // Bit 1 = Too Long (ASCII followed by continuation) - // Bit 2 = Overlong 3-byte - // Bit 4 = Surrogate - // Bit 5 = Overlong 2-byte - // Bit 7 = Two Continuations - constexpr const uint8_t TOO_SHORT = 1 << 0; // 11______ 0_______ - // 11______ 11______ - constexpr const uint8_t TOO_LONG = 1 << 1; // 0_______ 10______ - constexpr const uint8_t OVERLONG_3 = 1 << 2; // 11100000 100_____ - constexpr const uint8_t SURROGATE = 1 << 4; // 11101101 101_____ - constexpr const uint8_t OVERLONG_2 = 1 << 5; // 1100000_ 10______ - constexpr const uint8_t TWO_CONTS = 1 << 7; // 10______ 10______ - constexpr const uint8_t TOO_LARGE = 1 << 3; // 11110100 1001____ - // 11110100 101_____ - // 11110101 1001____ - // 11110101 101_____ - // 1111011_ 1001____ - // 1111011_ 101_____ - // 11111___ 1001____ - // 11111___ 101_____ - constexpr const uint8_t TOO_LARGE_1000 = 1 << 6; - // 11110101 1000____ - // 1111011_ 1000____ - // 11111___ 1000____ - constexpr const uint8_t OVERLONG_4 = 1 << 6; // 11110000 1000____ + __lsx_vst(composed, reinterpret_cast(utf16_output), 0); + utf16_output += 4; // We wrote 4 16-bit characters. + return 12; // We consumed 12 bytes. + } - const simd8 byte_1_high = prev1.shr<4>().lookup_16( - // 0_______ ________ - TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, - TOO_LONG, - // 10______ ________ - TWO_CONTS, TWO_CONTS, TWO_CONTS, TWO_CONTS, - // 1100____ ________ - TOO_SHORT | OVERLONG_2, - // 1101____ ________ - TOO_SHORT, - // 1110____ ________ - TOO_SHORT | OVERLONG_3 | SURROGATE, - // 1111____ ________ - TOO_SHORT | TOO_LARGE | TOO_LARGE_1000 | OVERLONG_4); - constexpr const uint8_t CARRY = - TOO_SHORT | TOO_LONG | TWO_CONTS; // These all have ____ in byte 1 . - const simd8 byte_1_low = - (prev1 & 0x0F) - .lookup_16( - // ____0000 ________ - CARRY | OVERLONG_3 | OVERLONG_2 | OVERLONG_4, - // ____0001 ________ - CARRY | OVERLONG_2, - // ____001_ ________ - CARRY, CARRY, + // 2 byte sequences occur in short bursts in languages like Greek and Russian. + if ((utf8_end_of_code_point_mask & 0xFFFF) == 0xAAAA) { + // We want to take 6 2-byte UTF-8 code units and turn them into 6 2-byte + // UTF-16 code units. + __m128i composed = convert_utf8_2_byte_to_utf16(in); + // Byte swap if necessary + if (!match_system(big_endian)) { + composed = lsx_swap_bytes(composed); + } - // ____0100 ________ - CARRY | TOO_LARGE, - // ____0101 ________ - CARRY | TOO_LARGE | TOO_LARGE_1000, - // ____011_ ________ - CARRY | TOO_LARGE | TOO_LARGE_1000, - CARRY | TOO_LARGE | TOO_LARGE_1000, + __lsx_vst(composed, reinterpret_cast(utf16_output), 0); + utf16_output += 6; // We wrote 6 16-bit characters. + return 12; // We consumed 12 bytes. + } - // ____1___ ________ - CARRY | TOO_LARGE | TOO_LARGE_1000, - CARRY | TOO_LARGE | TOO_LARGE_1000, - CARRY | TOO_LARGE | TOO_LARGE_1000, - CARRY | TOO_LARGE | TOO_LARGE_1000, - CARRY | TOO_LARGE | TOO_LARGE_1000, - // ____1101 ________ - CARRY | TOO_LARGE | TOO_LARGE_1000 | SURROGATE, - CARRY | TOO_LARGE | TOO_LARGE_1000, - CARRY | TOO_LARGE | TOO_LARGE_1000); - const simd8 byte_2_high = input.shr<4>().lookup_16( - // ________ 0_______ - TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, - TOO_SHORT, TOO_SHORT, + /// We do not have a fast path available, or the fast path is unimportant, so + /// we fallback. + const uint8_t idx = simdutf::tables::utf8_to_utf16::utf8bigindex + [input_utf8_end_of_code_point_mask][0]; - // ________ 1000____ - TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE_1000 | - OVERLONG_4, - // ________ 1001____ - TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE, - // ________ 101_____ - TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, - TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, + const uint8_t consumed = simdutf::tables::utf8_to_utf16::utf8bigindex + [input_utf8_end_of_code_point_mask][1]; + const __m128i zero = __lsx_vldi(0); + if (idx < 64) { + // SIX (6) input code-code units + // Convert to UTF-16 + __m128i composed = convert_utf8_1_to_2_byte_to_utf16(in, idx); + // Byte swap if necessary + if (!match_system(big_endian)) { + composed = lsx_swap_bytes(composed); + } + // Store + __lsx_vst(composed, reinterpret_cast(utf16_output), 0); + utf16_output += 6; // We wrote 6 16-bit characters. + return consumed; + } else if (idx < 145) { + // FOUR (4) input code-code units + // UTF-16 and UTF-32 use similar algorithms, but UTF-32 skips the narrowing. + __m128i sh = __lsx_vld(reinterpret_cast( + simdutf::tables::utf8_to_utf16::shufutf8[idx]), + 0); + // XXX: depending on the system scalar instructions might be faster. + // 1 byte: 00000000 00000000 0ccccccc + // 2 byte: 00000000 110bbbbb 10cccccc + // 3 byte: 1110aaaa 10bbbbbb 10cccccc + sh = __lsx_vand_v(sh, __lsx_vldi(0x1f)); + __m128i perm = __lsx_vshuf_b(zero, in, sh); + // 1 byte: 00000000 0ccccccc + // 2 byte: xx0bbbbb x0cccccc + // 3 byte: xxbbbbbb x0cccccc + __m128i lowperm = __lsx_vpickev_h(perm, perm); + // 1 byte: 00000000 00000000 + // 2 byte: 00000000 00000000 + // 3 byte: 00000000 1110aaaa + __m128i highperm = __lsx_vpickod_h(perm, perm); + // 3 byte: aaaa0000 00000000 + highperm = __lsx_vslli_h(highperm, 12); + // ASCII + // 1 byte: 00000000 0ccccccc + // 2+byte: 00000000 00cccccc + __m128i ascii = __lsx_vand_v(lowperm, __lsx_vrepli_h(0x7f)); + // 1 byte: 00000000 00000000 + // 2 byte: xx0bbbbb 00000000 + // 3 byte: xxbbbbbb 00000000 + __m128i middlebyte = __lsx_vand_v(lowperm, __lsx_vldi(-2561) /*0xFF00*/); + // 1 byte: 00000000 0ccccccc + // 2 byte: 0010bbbb bbcccccc + // 3 byte: 0010bbbb bbcccccc + __m128i composed = __lsx_vor_v(__lsx_vsrli_h(middlebyte, 2), ascii); - // ________ 11______ - TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT); - return (byte_1_high & byte_1_low & byte_2_high); -} -simdutf_really_inline simd8 -check_multibyte_lengths(const simd8 input, - const simd8 prev_input, - const simd8 sc) { - simd8 prev2 = input.prev<2>(prev_input); - simd8 prev3 = input.prev<3>(prev_input); - simd8 must23 = - simd8(must_be_2_3_continuation(prev2, prev3)); - simd8 must23_80 = must23 & uint8_t(0x80); - return must23_80 ^ sc; -} + __m128i v0fff = __lsx_vreplgr2vr_h(uint16_t(0xfff)); + // aaaabbbb bbcccccc + composed = __lsx_vbitsel_v(highperm, composed, v0fff); -// -// Return nonzero if there are incomplete multibyte characters at the end of the -// block: e.g. if there is a 4-byte character, but it is 3 bytes from the end. -// -simdutf_really_inline simd8 is_incomplete(const simd8 input) { - // If the previous input's last 3 bytes match this, they're too short (they - // ended at EOF): - // ... 1111____ 111_____ 11______ - static const uint8_t max_array[32] = {255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 0b11110000u - 1, - 0b11100000u - 1, - 0b11000000u - 1}; - const simd8 max_value( - &max_array[sizeof(max_array) - sizeof(simd8)]); - return input.gt_bits(max_value); -} + if (!match_system(big_endian)) { + composed = lsx_swap_bytes(composed); + } -struct utf8_checker { - // If this is nonzero, there has been a UTF-8 error. - simd8 error; - // The last input we received - simd8 prev_input_block; - // Whether the last input we received was incomplete (used for ASCII fast - // path) - simd8 prev_incomplete; + __lsx_vst(composed, reinterpret_cast(utf16_output), 0); + utf16_output += 4; // We wrote 4 16-bit codepoints + return consumed; + } else if (idx < 209) { + // THREE (3) input code-code units + if (input_utf8_end_of_code_point_mask == 0x888) { + // We want to take 3 4-byte UTF-8 code units and turn them into 3 4-byte + // UTF-16 pairs. Generating surrogate pairs is a little tricky though, but + // it is easier when we can assume they are all pairs. This version does + // not use the LUT, but 4 byte sequences are less common and the overhead + // of the extra memory access is less important than the early branch + // overhead in shorter sequences. + + // Swap byte pairs + // 10dddddd 10cccccc|10bbbbbb 11110aaa + // 10cccccc 10dddddd|11110aaa 10bbbbbb + __m128i swap = lsx_swap_bytes(in); + // Shift left 2 bits + // cccccc00 dddddd00 xxxxxxxx bbbbbb00 + __m128i shift = __lsx_vslli_b(swap, 2); + // Create a magic number containing the low 2 bits of the trail surrogate + // and all the corrections needed to create the pair. UTF-8 4b prefix = + // -0x0000|0xF000 surrogate offset = -0x0000|0x0040 (0x10000 << 6) + // surrogate high = +0x0000|0xD800 + // surrogate low = +0xDC00|0x0000 + // ------------------------------- + // = +0xDC00|0xE7C0 + __m128i magic = __lsx_vreplgr2vr_w(uint32_t(0xDC00E7C0)); + // Generate unadjusted trail surrogate minus lowest 2 bits + // vec(0000FF00) = __lsx_vldi(-1758) + // xxxxxxxx xxxxxxxx|11110aaa bbbbbb00 + __m128i trail = + __lsx_vbitsel_v(shift, swap, __lsx_vldi(-1758 /*0000FF00*/)); + // Insert low 2 bits of trail surrogate to magic number for later + // 11011100 00000000 11100111 110000cc + __m128i magic_with_low_2 = __lsx_vor_v(__lsx_vsrli_w(shift, 30), magic); + + // Generate lead surrogate + // xxxxcccc ccdddddd|xxxxxxxx xxxxxxxx + // 000000cc ccdddddd|xxxxxxxx xxxxxxxx + __m128i lead = __lsx_vbitsel_v( + __lsx_vsrli_h(__lsx_vand_v(shift, __lsx_vldi(0x3F)), 4), swap, + __lsx_vrepli_h(0x3f /* 0x003f*/)); + + // Blend pairs + // __lsx_vldi(-1741) => vec(0x0000FFFF) + // 000000cc ccdddddd|11110aaa bbbbbb00 + __m128i blend = + __lsx_vbitsel_v(lead, trail, __lsx_vldi(-1741) /* (0x0000FFFF)*4 */); + // Add magic number to finish the result + // 110111CC CCDDDDDD|110110AA BBBBBBCC + __m128i composed = __lsx_vadd_h(blend, magic_with_low_2); + // Byte swap if necessary + if (!match_system(big_endian)) { + composed = lsx_swap_bytes(composed); + } + // __lsx_vst(composed, reinterpret_cast(utf16_output), 0); + __lsx_vst(composed, reinterpret_cast(buffer), 0); + std::memcpy(utf16_output, buffer, 12); + utf16_output += 6; // We 3 32-bit surrogate pairs. + return 12; // We consumed 12 bytes. + } + // 3 1-4 byte sequences + __m128i sh = __lsx_vld(reinterpret_cast( + simdutf::tables::utf8_to_utf16::shufutf8[idx]), + 0); + // 1 byte: 00000000 00000000 00000000 0ddddddd + // 3 byte: 00000000 00000000 110ccccc 10dddddd + // 3 byte: 00000000 1110bbbb 10cccccc 10dddddd + // 4 byte: 11110aaa 10bbbbbb 10cccccc 10dddddd + sh = __lsx_vand_v(sh, __lsx_vldi(0x1f)); + __m128i perm = __lsx_vshuf_b(zero, in, sh); + // added to fix issue https://github.com/simdutf/simdutf/issues/514 + // We only want to write 2 * 16-bit code units when that is actually what we + // have. Unfortunately, we cannot trust the input. So it is possible to get + // 0xff as an input byte and it should not result in a surrogate pair. We + // need to check for that. + uint32_t permbuffer[4]; + __lsx_vst(perm, permbuffer, 0); + // Mask the low and middle bytes + // 00000000 00000000 00000000 0ddddddd + __m128i ascii = __lsx_vand_v(perm, __lsx_vrepli_w(0x7f)); + // Because the surrogates need more work, the high surrogate is computed + // first. + __m128i middlehigh = __lsx_vslli_w(perm, 2); + // 00000000 00000000 00cccccc 00000000 + __m128i middlebyte = __lsx_vand_v(perm, __lsx_vldi(-3777) /* 0x00003F00 */); + // Start assembling the sequence. Since the 4th byte is in the same position + // as it would be in a surrogate and there is no dependency, shift left + // instead of right. 3 byte: 00000000 10bbbbxx xxxxxxxx xxxxxxxx 4 byte: + // 11110aaa bbbbbbxx xxxxxxxx xxxxxxxx + __m128i ab = + __lsx_vbitsel_v(middlehigh, perm, __lsx_vldi(-1656) /*0xFF000000*/); + // Top 16 bits contains the high ten bits of the surrogate pair before + // correction 3 byte: 00000000 10bbbbcc|cccc0000 00000000 4 byte: 11110aaa + // bbbbbbcc|cccc0000 00000000 - high 10 bits correct w/o correction + __m128i v_fffc0000 = __lsx_vreplgr2vr_w(uint32_t(0xFFFC0000)); + __m128i abc = __lsx_vbitsel_v(__lsx_vslli_w(middlebyte, 4), ab, v_fffc0000); + // Combine the low 6 or 7 bits by a shift right accumulate + // 3 byte: 00000000 00000010|bbbbcccc ccdddddd - low 16 bits correct + // 4 byte: 00000011 110aaabb|bbbbcccc ccdddddd - low 10 bits correct w/o + // correction + __m128i composed = __lsx_vor_v(ascii, __lsx_vsrli_w(abc, 6)); + // After this is for surrogates + // Blend the low and high surrogates + // 4 byte: 11110aaa bbbbbbcc|bbbbcccc ccdddddd + __m128i mixed = + __lsx_vbitsel_v(abc, composed, __lsx_vldi(-1741) /*0x0000FFFF*/); + // Clear the upper 6 bits of the low surrogate. Don't clear the upper bits + // yet as 0x10000 was not subtracted from the codepoint yet. 4 byte: + // 11110aaa bbbbbbcc|000000cc ccdddddd + __m128i v_ffff03ff = __lsx_vreplgr2vr_w(uint32_t(0xFFFF03FF)); + __m128i masked_pair = __lsx_vand_v(mixed, v_ffff03ff); + // Correct the remaining UTF-8 prefix, surrogate offset, and add the + // surrogate prefixes in one magic 16-bit addition. similar magic number but + // without the continue byte adjust and halfword swapped UTF-8 4b prefix = + // -0xF000|0x0000 surrogate offset = -0x0040|0x0000 (0x10000 << 6) + // surrogate high = +0xD800|0x0000 + // surrogate low = +0x0000|0xDC00 + // ----------------------------------- + // = +0xE7C0|0xDC00 + __m128i magic = __lsx_vreplgr2vr_w(uint32_t(0xE7C0DC00)); + // 4 byte: 110110AA BBBBBBCC|110111CC CCDDDDDD - surrogate pair complete + __m128i surrogates = __lsx_vadd_w(masked_pair, magic); + // If the high bit is 1 (s32 less than zero), this needs a surrogate pair + __m128i is_pair = __lsx_vslt_w(perm, zero); + // Select either the 4 byte surrogate pair or the 2 byte solo codepoint + // 3 byte: 0xxxxxxx xxxxxxxx|bbbbcccc ccdddddd + // 4 byte: 110110AA BBBBBBCC|110111CC CCDDDDDD + __m128i selected = __lsx_vbitsel_v(composed, surrogates, is_pair); + // Byte swap if necessary + if (!match_system(big_endian)) { + selected = lsx_swap_bytes(selected); + } + // Attempting to shuffle and store would be complex, just scalarize. + uint32_t buffer_tmp[4]; + __lsx_vst(selected, buffer_tmp, 0); + // Test for the top bit of the surrogate mask. Remove due to issue 514 + // const uint32_t SURROGATE_MASK = match_system(big_endian) ? 0x80000000 : + // 0x00800000; + for (size_t i = 0; i < 3; i++) { + // Surrogate + // Used to be if (buffer[i] & SURROGATE_MASK) { + // See discussion above. + // patch for issue https://github.com/simdutf/simdutf/issues/514 + if ((permbuffer[i] & 0xf8000000) == 0xf0000000) { + utf16_output[0] = uint16_t(buffer_tmp[i] >> 16); + utf16_output[1] = uint16_t(buffer_tmp[i] & 0xFFFF); + utf16_output += 2; + } else { + utf16_output[0] = uint16_t(buffer_tmp[i] & 0xFFFF); + utf16_output++; + } + } + return consumed; + } else { + // here we know that there is an error but we do not handle errors + return 12; + } +} +/* end file src/lsx/lsx_convert_utf8_to_utf16.cpp */ +/* begin file src/lsx/lsx_convert_utf8_to_utf32.cpp */ +// Convert up to 12 bytes from utf8 to utf32 using a mask indicating the +// end of the code points. Only the least significant 12 bits of the mask +// are accessed. +// It returns how many bytes were consumed (up to 12). +size_t convert_masked_utf8_to_utf32(const char *input, + uint64_t utf8_end_of_code_point_mask, + char32_t *&utf32_out) { + // we use an approach where we try to process up to 12 input bytes. + // Why 12 input bytes and not 16? Because we are concerned with the size of + // the lookup tables. Also 12 is nicely divisible by two and three. // - // Check whether the current bytes are valid UTF-8. + uint32_t *&utf32_output = reinterpret_cast(utf32_out); + __m128i in = __lsx_vld(reinterpret_cast(input), 0); + const uint16_t input_utf8_end_of_code_point_mask = + utf8_end_of_code_point_mask & 0xFFF; // - simdutf_really_inline void check_utf8_bytes(const simd8 input, - const simd8 prev_input) { - // Flip prev1...prev3 so we can easily determine if they are 2+, 3+ or 4+ - // lead bytes (2, 3, 4-byte leads become large positive numbers instead of - // small negative numbers) - simd8 prev1 = input.prev<1>(prev_input); - simd8 sc = check_special_cases(input, prev1); - this->error |= check_multibyte_lengths(input, prev_input, sc); + // Optimization note: our main path below is load-latency dependent. Thus it + // is maybe beneficial to have fast paths that depend on branch prediction but + // have less latency. This results in more instructions but, potentially, also + // higher speeds. + // + // We first try a few fast paths. + if ((utf8_end_of_code_point_mask & 0xffff) == 0xffff) { + // We process in chunks of 16 bytes. + // use fast implementation in src/simdutf/arm64/simd.h + // Ideally the compiler can keep the tables in registers. + simd8 temp{in}; + temp.store_ascii_as_utf32_tbl(utf32_out); + utf32_output += 16; // We wrote 16 32-bit characters. + return 16; // We consumed 16 bytes. } + __m128i zero = __lsx_vldi(0); + if (input_utf8_end_of_code_point_mask == 0x924) { + // We want to take 4 3-byte UTF-8 code units and turn them into 4 4-byte + // UTF-32 code units. Convert to UTF-16 + __m128i composed_utf16 = convert_utf8_3_byte_to_utf16(in); + __m128i utf32_low = __lsx_vilvl_h(zero, composed_utf16); - // The only problem that can happen at EOF is that a multibyte character is - // too short or a byte value too large in the last bytes: check_special_cases - // only checks for bytes too large in the first of two bytes. - simdutf_really_inline void check_eof() { - // If the previous block had incomplete UTF-8 characters at the end, an - // ASCII block can't possibly finish them. - this->error |= this->prev_incomplete; + __lsx_vst(utf32_low, reinterpret_cast(utf32_output), 0); + utf32_output += 4; // We wrote 4 32-bit characters. + return 12; // We consumed 12 bytes. } + // 2 byte sequences occur in short bursts in languages like Greek and Russian. + if (input_utf8_end_of_code_point_mask == 0xaaa) { + // We want to take 6 2-byte UTF-8 code units and turn them into 6 4-byte + // UTF-32 code units. Convert to UTF-16 + __m128i composed_utf16 = convert_utf8_2_byte_to_utf16(in); - simdutf_really_inline void check_next_input(const simd8x64 &input) { - if (simdutf_likely(is_ascii(input))) { - this->error |= this->prev_incomplete; - } else { - // you might think that a for-loop would work, but under Visual Studio, it - // is not good enough. - static_assert((simd8x64::NUM_CHUNKS == 2) || - (simd8x64::NUM_CHUNKS == 4), - "We support either two or four chunks per 64-byte block."); - if (simd8x64::NUM_CHUNKS == 2) { - this->check_utf8_bytes(input.chunks[0], this->prev_input_block); - this->check_utf8_bytes(input.chunks[1], input.chunks[0]); - } else if (simd8x64::NUM_CHUNKS == 4) { - this->check_utf8_bytes(input.chunks[0], this->prev_input_block); - this->check_utf8_bytes(input.chunks[1], input.chunks[0]); - this->check_utf8_bytes(input.chunks[2], input.chunks[1]); - this->check_utf8_bytes(input.chunks[3], input.chunks[2]); - } - this->prev_incomplete = - is_incomplete(input.chunks[simd8x64::NUM_CHUNKS - 1]); - this->prev_input_block = input.chunks[simd8x64::NUM_CHUNKS - 1]; - } - } + __m128i utf32_low = __lsx_vilvl_h(zero, composed_utf16); + __m128i utf32_high = __lsx_vilvh_h(zero, composed_utf16); - // do not forget to call check_eof! - simdutf_really_inline bool errors() const { - return this->error.any_bits_set_anywhere(); + __lsx_vst(utf32_low, reinterpret_cast(utf32_output), 0); + __lsx_vst(utf32_high, reinterpret_cast(utf32_output), 16); + utf32_output += 6; + return 12; // We consumed 12 bytes. } + /// Either no fast path or an unimportant fast path. -}; // struct utf8_checker -} // namespace utf8_validation + const uint8_t idx = simdutf::tables::utf8_to_utf16::utf8bigindex + [input_utf8_end_of_code_point_mask][0]; + const uint8_t consumed = simdutf::tables::utf8_to_utf16::utf8bigindex + [input_utf8_end_of_code_point_mask][1]; + + if (idx < 64) { + // SIX (6) input code-code units + // Convert to UTF-16 + __m128i composed_utf16 = convert_utf8_1_to_2_byte_to_utf16(in, idx); + __m128i utf32_low = __lsx_vilvl_h(zero, composed_utf16); + __m128i utf32_high = __lsx_vilvh_h(zero, composed_utf16); + + __lsx_vst(utf32_low, reinterpret_cast(utf32_output), 0); + __lsx_vst(utf32_high, reinterpret_cast(utf32_output), 16); + utf32_output += 6; + return consumed; + } else if (idx < 145) { + // FOUR (4) input code-code units + // UTF-16 and UTF-32 use similar algorithms, but UTF-32 skips the narrowing. + __m128i sh = __lsx_vld(reinterpret_cast( + simdutf::tables::utf8_to_utf16::shufutf8[idx]), + 0); + // Shuffle + // 1 byte: 00000000 00000000 0ccccccc + // 2 byte: 00000000 110bbbbb 10cccccc + // 3 byte: 1110aaaa 10bbbbbb 10cccccc + sh = __lsx_vand_v(sh, __lsx_vldi(0x1f)); + __m128i perm = __lsx_vshuf_b(zero, in, sh); + // Split + // 00000000 00000000 0ccccccc + __m128i ascii = __lsx_vand_v(perm, __lsx_vrepli_w(0x7F)); // 6 or 7 bits + // Note: unmasked + // xxxxxxxx aaaaxxxx xxxxxxxx + __m128i high = + __lsx_vsrli_w(__lsx_vand_v(perm, __lsx_vldi(0xf)), 4); // 4 bits + // Use 16 bit bic instead of and. + // The top bits will be corrected later in the bsl + // 00000000 10bbbbbb 00000000 + __m128i middle = + __lsx_vand_v(perm, __lsx_vldi(-1758 /*0x0000FF00*/)); // 5 or 6 bits + // Combine low and middle with shift right accumulate + // 00000000 00xxbbbb bbcccccc + __m128i lowmid = __lsx_vor_v(ascii, __lsx_vsrli_w(middle, 2)); + // Insert top 4 bits from high byte with bitwise select + // 00000000 aaaabbbb bbcccccc + __m128i composed = + __lsx_vbitsel_v(lowmid, high, __lsx_vldi(-3600 /*0x0000F000*/)); + __lsx_vst(composed, utf32_output, 0); + utf32_output += 4; // We wrote 4 32-bit characters. + return consumed; + } else if (idx < 209) { + // THREE (3) input code-code units + if (input_utf8_end_of_code_point_mask == 0x888) { + // We want to take 3 4-byte UTF-8 code units and turn them into 3 4-byte + // UTF-32 code units. This uses the same method as the fixed 3 byte + // version, reversing and shift left insert. However, there is no need for + // a shuffle mask now, just rev16 and rev32. + // + // This version does not use the LUT, but 4 byte sequences are less common + // and the overhead of the extra memory access is less important than the + // early branch overhead in shorter sequences, so it comes last. -using utf8_validation::utf8_checker; + // Swap pairs of bytes + // 10dddddd|10cccccc|10bbbbbb|11110aaa + // 10cccccc 10dddddd|11110aaa 10bbbbbb + __m128i swap = lsx_swap_bytes(in); + // Shift left and insert + // xxxxcccc ccdddddd|xxxxxxxa aabbbbbb + __m128i merge1 = __lsx_vbitsel_v(__lsx_vsrli_h(swap, 2), swap, + __lsx_vrepli_h(0x3f /*0x003F*/)); + // Shift insert again + // xxxxxxxx xxxaaabb bbbbcccc ccdddddd + __m128i merge2 = + __lsx_vbitsel_v(__lsx_vslli_w(merge1, 12), /* merge1 << 12 */ + __lsx_vsrli_w(merge1, 16), /* merge1 >> 16 */ + __lsx_vldi(-2545)); /*0x00000FFF*/ + // Clear the garbage + // 00000000 000aaabb bbbbcccc ccdddddd + __m128i composed = __lsx_vand_v(merge2, __lsx_vldi(-2273 /*0x1FFFFF*/)); + // Store + __lsx_vst(composed, utf32_output, 0); + utf32_output += 3; // We wrote 3 32-bit characters. + return 12; // We consumed 12 bytes. + } + // Unlike UTF-16, doing a fast codepath doesn't have nearly as much benefit + // due to surrogates no longer being involved. + __m128i sh = __lsx_vld(reinterpret_cast( + simdutf::tables::utf8_to_utf16::shufutf8[idx]), + 0); + // 1 byte: 00000000 00000000 00000000 0ddddddd + // 2 byte: 00000000 00000000 110ccccc 10dddddd + // 3 byte: 00000000 1110bbbb 10cccccc 10dddddd + // 4 byte: 11110aaa 10bbbbbb 10cccccc 10dddddd + sh = __lsx_vand_v(sh, __lsx_vldi(0x1f)); + __m128i perm = __lsx_vshuf_b(zero, in, sh); -} // unnamed namespace -} // namespace ppc64 -} // namespace simdutf -/* end file src/generic/utf8_validation/utf8_lookup4_algorithm.h */ -/* begin file src/generic/utf8_validation/utf8_validator.h */ -namespace simdutf { -namespace ppc64 { -namespace { -namespace utf8_validation { + // Ascii + __m128i ascii = __lsx_vand_v(perm, __lsx_vrepli_w(0x7F)); + __m128i middle = __lsx_vand_v(perm, __lsx_vldi(-3777 /*0x00003f00*/)); + // 00000000 00000000 0000cccc ccdddddd + __m128i cd = + __lsx_vbitsel_v(__lsx_vsrli_w(middle, 2), ascii, __lsx_vrepli_w(0x3f)); -/** - * Validates that the string is actual UTF-8. - */ -template -bool generic_validate_utf8(const uint8_t *input, size_t length) { - checker c{}; - buf_block_reader<64> reader(input, length); - while (reader.has_full_block()) { - simd::simd8x64 in(reader.full_block()); - c.check_next_input(in); - reader.advance(); + __m128i correction = __lsx_vand_v(perm, __lsx_vldi(-3520 /*0x00400000*/)); + __m128i corrected = __lsx_vadd_b(perm, __lsx_vsrli_w(correction, 1)); + // Insert twice + // 00000000 000aaabb bbbbxxxx xxxxxxxx + __m128i corrected_srli2 = + __lsx_vsrli_w(__lsx_vand_v(corrected, __lsx_vrepli_b(0x7)), 2); + __m128i ab = + __lsx_vbitsel_v(corrected_srli2, corrected, __lsx_vrepli_h(0x3f)); + ab = __lsx_vsrli_w(ab, 4); + // 00000000 000aaabb bbbbcccc ccdddddd + __m128i composed = + __lsx_vbitsel_v(ab, cd, __lsx_vldi(-2545 /*0x00000FFF*/)); + // Store + __lsx_vst(composed, utf32_output, 0); + utf32_output += 3; // We wrote 3 32-bit characters. + return consumed; + } else { + // here we know that there is an error but we do not handle errors + return 12; } - uint8_t block[64]{}; - reader.get_remainder(block); - simd::simd8x64 in(block); - c.check_next_input(in); - reader.advance(); - c.check_eof(); - return !c.errors(); } +/* end file src/lsx/lsx_convert_utf8_to_utf32.cpp */ +/* begin file src/lsx/lsx_convert_utf8_to_latin1.cpp */ +size_t convert_masked_utf8_to_latin1(const char *input, + uint64_t utf8_end_of_code_point_mask, + char *&latin1_output) { + // we use an approach where we try to process up to 12 input bytes. + // Why 12 input bytes and not 16? Because we are concerned with the size of + // the lookup tables. Also 12 is nicely divisible by two and three. + // + __m128i in = __lsx_vld(reinterpret_cast(input), 0); -bool generic_validate_utf8(const char *input, size_t length) { - return generic_validate_utf8( - reinterpret_cast(input), length); -} + const uint16_t input_utf8_end_of_code_point_mask = + utf8_end_of_code_point_mask & 0xfff; + // Optimization note: our main path below is load-latency dependent. Thus it + // is maybe beneficial to have fast paths that depend on branch prediction but + // have less latency. This results in more instructions but, potentially, also + // higher speeds. -/** - * Validates that the string is actual UTF-8 and stops on errors. - */ -template -result generic_validate_utf8_with_errors(const uint8_t *input, size_t length) { - checker c{}; - buf_block_reader<64> reader(input, length); - size_t count{0}; - while (reader.has_full_block()) { - simd::simd8x64 in(reader.full_block()); - c.check_next_input(in); - if (c.errors()) { - if (count != 0) { - count--; - } // Sometimes the error is only detected in the next chunk - result res = scalar::utf8::rewind_and_validate_with_errors( - reinterpret_cast(input), - reinterpret_cast(input + count), length - count); - res.count += count; - return res; - } - reader.advance(); - count += 64; + // We first try a few fast paths. + // The obvious first test is ASCII, which actually consumes the full 16. + if ((utf8_end_of_code_point_mask & 0xFFFF) == 0xFFFF) { + // We process in chunks of 16 bytes + __lsx_vst(in, reinterpret_cast(latin1_output), 0); + latin1_output += 16; // We wrote 16 18-bit characters. + return 16; // We consumed 16 bytes. } - uint8_t block[64]{}; - reader.get_remainder(block); - simd::simd8x64 in(block); - c.check_next_input(in); - reader.advance(); - c.check_eof(); - if (c.errors()) { - if (count != 0) { - count--; - } // Sometimes the error is only detected in the next chunk - result res = scalar::utf8::rewind_and_validate_with_errors( - reinterpret_cast(input), - reinterpret_cast(input) + count, length - count); - res.count += count; - return res; - } else { - return result(error_code::SUCCESS, length); + /// We do not have a fast path available, or the fast path is unimportant, so + /// we fallback. + const uint8_t idx = simdutf::tables::utf8_to_utf16::utf8bigindex + [input_utf8_end_of_code_point_mask][0]; + + const uint8_t consumed = simdutf::tables::utf8_to_utf16::utf8bigindex + [input_utf8_end_of_code_point_mask][1]; + // this indicates an invalid input: + if (idx >= 64) { + return consumed; } -} + // Here we should have (idx < 64), if not, there is a bug in the validation or + // elsewhere. SIX (6) input code-code units this is a relatively easy scenario + // we process SIX (6) input code-code units. The max length in bytes of six + // code code units spanning between 1 and 2 bytes each is 12 bytes. Converts 6 + // 1-2 byte UTF-8 characters to 6 UTF-16 characters. This is a relatively easy + // scenario we process SIX (6) input code-code units. The max length in bytes + // of six code code units spanning between 1 and 2 bytes each is 12 bytes. + __m128i sh = __lsx_vld(reinterpret_cast( + simdutf::tables::utf8_to_utf16::shufutf8[idx]), + 0); + // Shuffle + // 1 byte: 00000000 0bbbbbbb + // 2 byte: 110aaaaa 10bbbbbb + sh = __lsx_vand_v(sh, __lsx_vldi(0x1f)); + __m128i perm = __lsx_vshuf_b(__lsx_vldi(0), in, sh); + // ascii mask + // 1 byte: 11111111 11111111 + // 2 byte: 00000000 00000000 + __m128i ascii_mask = __lsx_vslt_bu(perm, __lsx_vldi(0x80)); + // utf8 mask + // 1 byte: 00000000 00000000 + // 2 byte: 00111111 00111111 + __m128i utf8_mask = __lsx_vand_v(__lsx_vsle_bu(__lsx_vldi(0x80), perm), + __lsx_vldi(0b00111111)); + // mask + // 1 byte: 11111111 11111111 + // 2 byte: 00111111 00111111 + __m128i mask = __lsx_vor_v(utf8_mask, ascii_mask); + + __m128i composed = __lsx_vbitsel_v(__lsx_vsrli_h(perm, 2), perm, mask); + // writing 8 bytes even though we only care about the first 6 bytes. + __m128i latin1_packed = __lsx_vpickev_b(__lsx_vldi(0), composed); -result generic_validate_utf8_with_errors(const char *input, size_t length) { - return generic_validate_utf8_with_errors( - reinterpret_cast(input), length); + uint64_t buffer[2]; + // __lsx_vst(latin1_packed, reinterpret_cast(latin1_output), 0); + __lsx_vst(latin1_packed, reinterpret_cast(buffer), 0); + std::memcpy(latin1_output, buffer, 6); + latin1_output += 6; // We wrote 6 bytes. + return consumed; } +/* end file src/lsx/lsx_convert_utf8_to_latin1.cpp */ -template -bool generic_validate_ascii(const uint8_t *input, size_t length) { - buf_block_reader<64> reader(input, length); - uint8_t blocks[64]{}; - simd::simd8x64 running_or(blocks); - while (reader.has_full_block()) { - simd::simd8x64 in(reader.full_block()); - running_or |= in; - reader.advance(); - } - uint8_t block[64]{}; - reader.get_remainder(block); - simd::simd8x64 in(block); - running_or |= in; - return running_or.is_ascii(); +/* begin file src/lsx/lsx_convert_utf16_to_latin1.cpp */ +template +std::pair +lsx_convert_utf16_to_latin1(const char16_t *buf, size_t len, + char *latin1_output) { + const char16_t *end = buf + len; + while (buf + 16 <= end) { + __m128i in = __lsx_vld(reinterpret_cast(buf), 0); + __m128i in1 = __lsx_vld(reinterpret_cast(buf), 16); + if (!match_system(big_endian)) { + in = lsx_swap_bytes(in); + in1 = lsx_swap_bytes(in1); + } + if (__lsx_bz_v(__lsx_vpickod_b(in1, in))) { + // 1. pack the bytes + __m128i latin1_packed = __lsx_vpickev_b(in1, in); + // 2. store (8 bytes) + __lsx_vst(latin1_packed, reinterpret_cast(latin1_output), 0); + // 3. adjust pointers + buf += 16; + latin1_output += 16; + } else { + return std::make_pair(nullptr, reinterpret_cast(latin1_output)); + } + } // while + return std::make_pair(buf, latin1_output); } -bool generic_validate_ascii(const char *input, size_t length) { - return generic_validate_ascii( - reinterpret_cast(input), length); +template +std::pair +lsx_convert_utf16_to_latin1_with_errors(const char16_t *buf, size_t len, + char *latin1_output) { + const char16_t *start = buf; + const char16_t *end = buf + len; + while (buf + 16 <= end) { + __m128i in = __lsx_vld(reinterpret_cast(buf), 0); + __m128i in1 = __lsx_vld(reinterpret_cast(buf), 16); + if (!match_system(big_endian)) { + in = lsx_swap_bytes(in); + in1 = lsx_swap_bytes(in1); + } + if (__lsx_bz_v(__lsx_vpickod_b(in1, in))) { + // 1. pack the bytes + __m128i latin1_packed = __lsx_vpickev_b(in1, in); + // 2. store (8 bytes) + __lsx_vst(latin1_packed, reinterpret_cast(latin1_output), 0); + // 3. adjust pointers + buf += 16; + latin1_output += 16; + } else { + // Let us do a scalar fallback. + for (int k = 0; k < 16; k++) { + uint16_t word = !match_system(big_endian) + ? scalar::utf16::swap_bytes(buf[k]) + : buf[k]; + if (word <= 0xff) { + *latin1_output++ = char(word); + } else { + return std::make_pair(result(error_code::TOO_LARGE, buf - start + k), + latin1_output); + } + } + } + } // while + return std::make_pair(result(error_code::SUCCESS, buf - start), + latin1_output); } +/* end file src/lsx/lsx_convert_utf16_to_latin1.cpp */ +/* begin file src/lsx/lsx_convert_utf16_to_utf8.cpp */ +/* + The vectorized algorithm works on single SSE register i.e., it + loads eight 16-bit code units. -template -result generic_validate_ascii_with_errors(const uint8_t *input, size_t length) { - buf_block_reader<64> reader(input, length); - size_t count{0}; - while (reader.has_full_block()) { - simd::simd8x64 in(reader.full_block()); - if (!in.is_ascii()) { - result res = scalar::ascii::validate_with_errors( - reinterpret_cast(input + count), length - count); - return result(res.error, count + res.count); - } - reader.advance(); + We consider three cases: + 1. an input register contains no surrogates and each value + is in range 0x0000 .. 0x07ff. + 2. an input register contains no surrogates and values are + is in range 0x0000 .. 0xffff. + 3. an input register contains surrogates --- i.e. codepoints + can have 16 or 32 bits. - count += 64; - } - uint8_t block[64]{}; - reader.get_remainder(block); - simd::simd8x64 in(block); - if (!in.is_ascii()) { - result res = scalar::ascii::validate_with_errors( - reinterpret_cast(input + count), length - count); - return result(res.error, count + res.count); - } else { - return result(error_code::SUCCESS, length); - } -} + Ad 1. -result generic_validate_ascii_with_errors(const char *input, size_t length) { - return generic_validate_ascii_with_errors( - reinterpret_cast(input), length); -} + When values are less than 0x0800, it means that a 16-bit code unit + can be converted into: 1) single UTF8 byte (when it's an ASCII + char) or 2) two UTF8 bytes. -} // namespace utf8_validation -} // unnamed namespace -} // namespace ppc64 -} // namespace simdutf -/* end file src/generic/utf8_validation/utf8_validator.h */ -// transcoding from UTF-8 to UTF-16 -/* begin file src/generic/utf8_to_utf16/utf8_to_utf16.h */ + For this case we do only some shuffle to obtain these 2-byte + codes and finally compress the whole SSE register with a single + shuffle. -namespace simdutf { -namespace ppc64 { -namespace { -namespace utf8_to_utf16 { -using namespace simd; + We need 256-entry lookup table to get a compression pattern + and the number of output bytes in the compressed vector register. + Each entry occupies 17 bytes. -simdutf_really_inline simd8 -check_special_cases(const simd8 input, const simd8 prev1) { - // Bit 0 = Too Short (lead byte/ASCII followed by lead byte/ASCII) - // Bit 1 = Too Long (ASCII followed by continuation) - // Bit 2 = Overlong 3-byte - // Bit 4 = Surrogate - // Bit 5 = Overlong 2-byte - // Bit 7 = Two Continuations - constexpr const uint8_t TOO_SHORT = 1 << 0; // 11______ 0_______ - // 11______ 11______ - constexpr const uint8_t TOO_LONG = 1 << 1; // 0_______ 10______ - constexpr const uint8_t OVERLONG_3 = 1 << 2; // 11100000 100_____ - constexpr const uint8_t SURROGATE = 1 << 4; // 11101101 101_____ - constexpr const uint8_t OVERLONG_2 = 1 << 5; // 1100000_ 10______ - constexpr const uint8_t TWO_CONTS = 1 << 7; // 10______ 10______ - constexpr const uint8_t TOO_LARGE = 1 << 3; // 11110100 1001____ - // 11110100 101_____ - // 11110101 1001____ - // 11110101 101_____ - // 1111011_ 1001____ - // 1111011_ 101_____ - // 11111___ 1001____ - // 11111___ 101_____ - constexpr const uint8_t TOO_LARGE_1000 = 1 << 6; - // 11110101 1000____ - // 1111011_ 1000____ - // 11111___ 1000____ - constexpr const uint8_t OVERLONG_4 = 1 << 6; // 11110000 1000____ + Ad 2. - const simd8 byte_1_high = prev1.shr<4>().lookup_16( - // 0_______ ________ - TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, - TOO_LONG, - // 10______ ________ - TWO_CONTS, TWO_CONTS, TWO_CONTS, TWO_CONTS, - // 1100____ ________ - TOO_SHORT | OVERLONG_2, - // 1101____ ________ - TOO_SHORT, - // 1110____ ________ - TOO_SHORT | OVERLONG_3 | SURROGATE, - // 1111____ ________ - TOO_SHORT | TOO_LARGE | TOO_LARGE_1000 | OVERLONG_4); - constexpr const uint8_t CARRY = - TOO_SHORT | TOO_LONG | TWO_CONTS; // These all have ____ in byte 1 . - const simd8 byte_1_low = - (prev1 & 0x0F) - .lookup_16( - // ____0000 ________ - CARRY | OVERLONG_3 | OVERLONG_2 | OVERLONG_4, - // ____0001 ________ - CARRY | OVERLONG_2, - // ____001_ ________ - CARRY, CARRY, + When values fit in 16-bit code units, but are above 0x07ff, then + a single word may produce one, two or three UTF8 bytes. - // ____0100 ________ - CARRY | TOO_LARGE, - // ____0101 ________ - CARRY | TOO_LARGE | TOO_LARGE_1000, - // ____011_ ________ - CARRY | TOO_LARGE | TOO_LARGE_1000, - CARRY | TOO_LARGE | TOO_LARGE_1000, + We prepare data for all these three cases in two registers. + The first register contains lower two UTF8 bytes (used in all + cases), while the second one contains just the third byte for + the three-UTF8-bytes case. - // ____1___ ________ - CARRY | TOO_LARGE | TOO_LARGE_1000, - CARRY | TOO_LARGE | TOO_LARGE_1000, - CARRY | TOO_LARGE | TOO_LARGE_1000, - CARRY | TOO_LARGE | TOO_LARGE_1000, - CARRY | TOO_LARGE | TOO_LARGE_1000, - // ____1101 ________ - CARRY | TOO_LARGE | TOO_LARGE_1000 | SURROGATE, - CARRY | TOO_LARGE | TOO_LARGE_1000, - CARRY | TOO_LARGE | TOO_LARGE_1000); - const simd8 byte_2_high = input.shr<4>().lookup_16( - // ________ 0_______ - TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, - TOO_SHORT, TOO_SHORT, + Finally these two registers are interleaved forming eight-element + array of 32-bit values. The array spans two SSE registers. + The bytes from the registers are compressed using two shuffles. - // ________ 1000____ - TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE_1000 | - OVERLONG_4, - // ________ 1001____ - TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE, - // ________ 101_____ - TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, - TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, + We need 256-entry lookup table to get a compression pattern + and the number of output bytes in the compressed vector register. + Each entry occupies 17 bytes. - // ________ 11______ - TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT); - return (byte_1_high & byte_1_low & byte_2_high); -} -simdutf_really_inline simd8 -check_multibyte_lengths(const simd8 input, - const simd8 prev_input, - const simd8 sc) { - simd8 prev2 = input.prev<2>(prev_input); - simd8 prev3 = input.prev<3>(prev_input); - simd8 must23 = - simd8(must_be_2_3_continuation(prev2, prev3)); - simd8 must23_80 = must23 & uint8_t(0x80); - return must23_80 ^ sc; -} -struct validating_transcoder { - // If this is nonzero, there has been a UTF-8 error. - simd8 error; + To summarize: + - We need two 256-entry tables that have 8704 bytes in total. +*/ +/* + Returns a pair: the first unprocessed byte from buf and utf8_output + A scalar routing should carry on the conversion of the tail. +*/ +template +std::pair +lsx_convert_utf16_to_utf8(const char16_t *buf, size_t len, char *utf8_out) { + uint8_t *utf8_output = reinterpret_cast(utf8_out); + const char16_t *end = buf + len; - validating_transcoder() : error(uint8_t(0)) {} - // - // Check whether the current bytes are valid UTF-8. - // - simdutf_really_inline void check_utf8_bytes(const simd8 input, - const simd8 prev_input) { - // Flip prev1...prev3 so we can easily determine if they are 2+, 3+ or 4+ - // lead bytes (2, 3, 4-byte leads become large positive numbers instead of - // small negative numbers) - simd8 prev1 = input.prev<1>(prev_input); - simd8 sc = check_special_cases(input, prev1); - this->error |= check_multibyte_lengths(input, prev_input, sc); - } + const size_t safety_margin = + 12; // to avoid overruns, see issue + // https://github.com/simdutf/simdutf/issues/92 - template - simdutf_really_inline size_t convert(const char *in, size_t size, - char16_t *utf16_output) { - size_t pos = 0; - char16_t *start{utf16_output}; - // In the worst case, we have the haswell kernel which can cause an overflow - // of 8 bytes when calling convert_masked_utf8_to_utf16. If you skip the - // last 16 bytes, and if the data is valid, then it is entirely safe because - // 16 UTF-8 bytes generate much more than 8 bytes. However, you cannot - // generally assume that you have valid UTF-8 input, so we are going to go - // back from the end counting 8 leading bytes, to give us a good margin. - size_t leading_byte = 0; - size_t margin = size; - for (; margin > 0 && leading_byte < 8; margin--) { - leading_byte += (int8_t(in[margin - 1]) > -65); + __m128i v_07ff = __lsx_vreplgr2vr_h(uint16_t(0x7ff)); + while (buf + 16 + safety_margin <= end) { + __m128i in = __lsx_vld(reinterpret_cast(buf), 0); + if (!match_system(big_endian)) { + in = lsx_swap_bytes(in); } - // If the input is long enough, then we have that margin-1 is the eight last - // leading byte. - const size_t safety_margin = size - margin + 1; // to avoid overruns! - while (pos + 64 + safety_margin <= size) { - simd8x64 input(reinterpret_cast(in + pos)); - if (input.is_ascii()) { - input.store_ascii_as_utf16(utf16_output); - utf16_output += 64; - pos += 64; + if (__lsx_bz_v( + __lsx_vslt_hu(__lsx_vrepli_h(0x7F), in))) { // ASCII fast path!!!! + // It is common enough that we have sequences of 16 consecutive ASCII + // characters. + __m128i nextin = __lsx_vld(reinterpret_cast(buf), 16); + if (!match_system(big_endian)) { + nextin = lsx_swap_bytes(nextin); + } + if (__lsx_bz_v(__lsx_vslt_hu(__lsx_vrepli_h(0x7F), nextin))) { + // 1. pack the bytes + // obviously suboptimal. + __m128i utf8_packed = __lsx_vpickev_b(nextin, in); + // 2. store (16 bytes) + __lsx_vst(utf8_packed, utf8_output, 0); + // 3. adjust pointers + buf += 16; + utf8_output += 16; + continue; // we are done for this round! } else { - // you might think that a for-loop would work, but under Visual Studio, - // it is not good enough. - static_assert( - (simd8x64::NUM_CHUNKS == 2) || - (simd8x64::NUM_CHUNKS == 4), - "We support either two or four chunks per 64-byte block."); - auto zero = simd8{uint8_t(0)}; - if (simd8x64::NUM_CHUNKS == 2) { - this->check_utf8_bytes(input.chunks[0], zero); - this->check_utf8_bytes(input.chunks[1], input.chunks[0]); - } else if (simd8x64::NUM_CHUNKS == 4) { - this->check_utf8_bytes(input.chunks[0], zero); - this->check_utf8_bytes(input.chunks[1], input.chunks[0]); - this->check_utf8_bytes(input.chunks[2], input.chunks[1]); - this->check_utf8_bytes(input.chunks[3], input.chunks[2]); - } - uint64_t utf8_continuation_mask = input.lt(-65 + 1); - if (utf8_continuation_mask & 1) { - return 0; // error - } - uint64_t utf8_leading_mask = ~utf8_continuation_mask; - uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; - // We process in blocks of up to 12 bytes except possibly - // for fast paths which may process up to 16 bytes. For the - // slow path to work, we should have at least 12 input bytes left. - size_t max_starting_point = (pos + 64) - 12; - // Next loop is going to run at least five times. - while (pos < max_starting_point) { - // Performance note: our ability to compute 'consumed' and - // then shift and recompute is critical. If there is a - // latency of, say, 4 cycles on getting 'consumed', then - // the inner loop might have a total latency of about 6 cycles. - // Yet we process between 6 to 12 inputs bytes, thus we get - // a speed limit between 1 cycle/byte and 0.5 cycle/byte - // for this section of the code. Hence, there is a limit - // to how much we can further increase this latency before - // it seriously harms performance. - size_t consumed = convert_masked_utf8_to_utf16( - in + pos, utf8_end_of_code_point_mask, utf16_output); - pos += consumed; - utf8_end_of_code_point_mask >>= consumed; - } - // At this point there may remain between 0 and 12 bytes in the - // 64-byte block. These bytes will be processed again. So we have an - // 80% efficiency (in the worst case). In practice we expect an - // 85% to 90% efficiency. + // 1. pack the bytes + // obviously suboptimal. + __m128i utf8_packed = __lsx_vpickev_b(in, in); + // 2. store (8 bytes) + __lsx_vst(utf8_packed, utf8_output, 0); + // 3. adjust pointers + buf += 8; + utf8_output += 8; + in = nextin; } } - if (errors()) { - return 0; + + __m128i zero = __lsx_vldi(0); + if (__lsx_bz_v(__lsx_vslt_hu(v_07ff, in))) { + // 1. prepare 2-byte values + // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8 + // expected output : [110a|aaaa|10bb|bbbb] x 8 + // t0 = [000a|aaaa|bbbb|bb00] + __m128i t0 = __lsx_vslli_h(in, 2); + // t1 = [000a|aaaa|0000|0000] + __m128i t1 = __lsx_vand_v(t0, __lsx_vldi(-2785 /*0x1f00*/)); + // t2 = [0000|0000|00bb|bbbb] + __m128i t2 = __lsx_vand_v(in, __lsx_vrepli_h(0x3f)); + // t3 = [000a|aaaa|00bb|bbbb] + __m128i t3 = __lsx_vor_v(t1, t2); + // t4 = [110a|aaaa|10bb|bbbb] + __m128i v_c080 = __lsx_vreplgr2vr_h(uint16_t(0xc080)); + __m128i t4 = __lsx_vor_v(t3, v_c080); + // 2. merge ASCII and 2-byte codewords + __m128i one_byte_bytemask = + __lsx_vsle_hu(in, __lsx_vrepli_h(0x7F /*0x007F*/)); + __m128i utf8_unpacked = __lsx_vbitsel_v(t4, in, one_byte_bytemask); + // 3. prepare bitmask for 8-bit lookup + uint32_t m2 = __lsx_vpickve2gr_bu(__lsx_vmskltz_h(one_byte_bytemask), 0); + // 4. pack the bytes + const uint8_t *row = &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes + [lsx_1_2_utf8_bytes_mask[m2]][0]; + __m128i shuffle = __lsx_vld(row, 1); + __m128i utf8_packed = __lsx_vshuf_b(zero, utf8_unpacked, shuffle); + // 5. store bytes + __lsx_vst(utf8_packed, utf8_output, 0); + // 6. adjust pointers + buf += 8; + utf8_output += row[0]; + continue; } - if (pos < size) { - size_t howmany = scalar::utf8_to_utf16::convert( - in + pos, size - pos, utf16_output); - if (howmany == 0) { - return 0; + __m128i surrogates_bytemask = + __lsx_vseq_h(__lsx_vand_v(in, __lsx_vldi(-2568 /*0xF800*/)), + __lsx_vldi(-2600 /*0xD800*/)); + // It might seem like checking for surrogates_bitmask == 0xc000 could help. + // However, it is likely an uncommon occurrence. + if (__lsx_bz_v(surrogates_bytemask)) { + // case: code units from register produce either 1, 2 or 3 UTF-8 bytes + /* In this branch we handle three cases: + 1. [0000|0000|0ccc|cccc] => [0ccc|cccc] - + single UFT-8 byte + 2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc] - + two UTF-8 bytes + 3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - + three UTF-8 bytes + + We expand the input word (16-bit) into two code units (32-bit), thus + we have room for four bytes. However, we need five distinct bit + layouts. Note that the last byte in cases #2 and #3 is the same. + + We precompute byte 1 for case #1 and the common byte for cases #2 & #3 + in register t2. + + We precompute byte 1 for case #3 and -- **conditionally** -- + precompute either byte 1 for case #2 or byte 2 for case #3. Note that + they differ by exactly one bit. + + Finally from these two code units we build proper UTF-8 sequence, + taking into account the case (i.e, the number of bytes to write). + */ + /** + * Given [aaaa|bbbb|bbcc|cccc] our goal is to produce: + * t2 => [0ccc|cccc] [10cc|cccc] + * s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb]) + */ + // [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc] + __m128i t0 = __lsx_vpickev_b(in, in); + t0 = __lsx_vilvl_b(t0, t0); + + // [bbcc|cccc|bbcc|cccc] => [00cc|cccc|00cc|cccc] + __m128i v_3f7f = __lsx_vreplgr2vr_h(uint16_t(0x3F7F)); + __m128i t1 = __lsx_vand_v(t0, v_3f7f); + // [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc] + __m128i t2 = __lsx_vor_v(t1, __lsx_vldi(-2688 /*0x8000*/)); + + // s0: [aaaa|bbbb|bbcc|cccc] => [0000|0000|0000|aaaa] + __m128i s0 = __lsx_vsrli_h(in, 12); + // s1: [aaaa|bbbb|bbcc|cccc] => [0000|bbbb|bb00|0000] + __m128i s1 = __lsx_vslli_h(in, 2); + // s1: [aabb|bbbb|cccc|cc00] => [00bb|bbbb|0000|0000] + s1 = __lsx_vand_v(s1, __lsx_vldi(-2753 /*0x3F00*/)); + + // [00bb|bbbb|0000|aaaa] + __m128i s2 = __lsx_vor_v(s0, s1); + // s3: [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa] + __m128i v_c0e0 = __lsx_vreplgr2vr_h(uint16_t(0xC0E0)); + __m128i s3 = __lsx_vor_v(s2, v_c0e0); + __m128i one_or_two_bytes_bytemask = __lsx_vsle_hu(in, v_07ff); + __m128i m0 = __lsx_vandn_v(one_or_two_bytes_bytemask, + __lsx_vldi(-2752 /*0x4000*/)); + __m128i s4 = __lsx_vxor_v(s3, m0); + + // 4. expand code units 16-bit => 32-bit + __m128i out0 = __lsx_vilvl_h(s4, t2); + __m128i out1 = __lsx_vilvh_h(s4, t2); + + // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle + __m128i one_byte_bytemask = __lsx_vsle_hu(in, __lsx_vrepli_h(0x7F)); + + __m128i one_or_two_bytes_bytemask_low = + __lsx_vilvl_h(one_or_two_bytes_bytemask, zero); + __m128i one_or_two_bytes_bytemask_high = + __lsx_vilvh_h(one_or_two_bytes_bytemask, zero); + + __m128i one_byte_bytemask_low = + __lsx_vilvl_h(one_byte_bytemask, one_byte_bytemask); + __m128i one_byte_bytemask_high = + __lsx_vilvh_h(one_byte_bytemask, one_byte_bytemask); + + const uint32_t mask0 = __lsx_vpickve2gr_bu( + __lsx_vmskltz_h(__lsx_vor_v(one_or_two_bytes_bytemask_low, + one_byte_bytemask_low)), + 0); + const uint32_t mask1 = __lsx_vpickve2gr_bu( + __lsx_vmskltz_h(__lsx_vor_v(one_or_two_bytes_bytemask_high, + one_byte_bytemask_high)), + 0); + + const uint8_t *row0 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask0][0]; + __m128i shuffle0 = __lsx_vld(row0, 1); + __m128i utf8_0 = __lsx_vshuf_b(zero, out0, shuffle0); + + const uint8_t *row1 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask1][0]; + __m128i shuffle1 = __lsx_vld(row1, 1); + __m128i utf8_1 = __lsx_vshuf_b(zero, out1, shuffle1); + + __lsx_vst(utf8_0, utf8_output, 0); + utf8_output += row0[0]; + __lsx_vst(utf8_1, utf8_output, 0); + utf8_output += row1[0]; + + buf += 8; + // surrogate pair(s) in a register + } else { + // Let us do a scalar fallback. + // It may seem wasteful to use scalar code, but being efficient with SIMD + // in the presence of surrogate pairs may require non-trivial tables. + size_t forward = 15; + size_t k = 0; + if (size_t(end - buf) < forward + 1) { + forward = size_t(end - buf - 1); } - utf16_output += howmany; + for (; k < forward; k++) { + uint16_t word = !match_system(big_endian) + ? scalar::utf16::swap_bytes(buf[k]) + : buf[k]; + if ((word & 0xFF80) == 0) { + *utf8_output++ = char(word); + } else if ((word & 0xF800) == 0) { + *utf8_output++ = char((word >> 6) | 0b11000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + } else if ((word & 0xF800) != 0xD800) { + *utf8_output++ = char((word >> 12) | 0b11100000); + *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + } else { + // must be a surrogate pair + uint16_t diff = uint16_t(word - 0xD800); + uint16_t next_word = !match_system(big_endian) + ? scalar::utf16::swap_bytes(buf[k + 1]) + : buf[k + 1]; + k++; + uint16_t diff2 = uint16_t(next_word - 0xDC00); + if ((diff | diff2) > 0x3FF) { + return std::make_pair(nullptr, + reinterpret_cast(utf8_output)); + } + uint32_t value = (diff << 10) + diff2 + 0x10000; + *utf8_output++ = char((value >> 18) | 0b11110000); + *utf8_output++ = char(((value >> 12) & 0b111111) | 0b10000000); + *utf8_output++ = char(((value >> 6) & 0b111111) | 0b10000000); + *utf8_output++ = char((value & 0b111111) | 0b10000000); + } + } + buf += k; } - return utf16_output - start; - } + } // while + return std::make_pair(buf, reinterpret_cast(utf8_output)); +} - template - simdutf_really_inline result convert_with_errors(const char *in, size_t size, - char16_t *utf16_output) { - size_t pos = 0; - char16_t *start{utf16_output}; - // In the worst case, we have the haswell kernel which can cause an overflow - // of 8 bytes when calling convert_masked_utf8_to_utf16. If you skip the - // last 16 bytes, and if the data is valid, then it is entirely safe because - // 16 UTF-8 bytes generate much more than 8 bytes. However, you cannot - // generally assume that you have valid UTF-8 input, so we are going to go - // back from the end counting 8 leading bytes, to give us a good margin. - size_t leading_byte = 0; - size_t margin = size; - for (; margin > 0 && leading_byte < 8; margin--) { - leading_byte += (int8_t(in[margin - 1]) > -65); +/* + Returns a pair: a result struct and utf8_output. + If there is an error, the count field of the result is the position of the + error. Otherwise, it is the position of the first unprocessed byte in buf + (even if finished). A scalar routing should carry on the conversion of the + tail if needed. +*/ +template +std::pair +lsx_convert_utf16_to_utf8_with_errors(const char16_t *buf, size_t len, + char *utf8_out) { + uint8_t *utf8_output = reinterpret_cast(utf8_out); + const char16_t *start = buf; + const char16_t *end = buf + len; + + const size_t safety_margin = + 12; // to avoid overruns, see issue + // https://github.com/simdutf/simdutf/issues/92 + while (buf + 16 + safety_margin <= end) { + __m128i in = __lsx_vld(reinterpret_cast(buf), 0); + if (!match_system(big_endian)) { + in = lsx_swap_bytes(in); } - // If the input is long enough, then we have that margin-1 is the eight last - // leading byte. - const size_t safety_margin = size - margin + 1; // to avoid overruns! - while (pos + 64 + safety_margin <= size) { - simd8x64 input(reinterpret_cast(in + pos)); - if (input.is_ascii()) { - input.store_ascii_as_utf16(utf16_output); - utf16_output += 64; - pos += 64; + if (__lsx_bz_v( + __lsx_vslt_hu(__lsx_vrepli_h(0x7F), in))) { // ASCII fast path!!!! + // It is common enough that we have sequences of 16 consecutive ASCII + // characters. + __m128i nextin = __lsx_vld(reinterpret_cast(buf), 16); + if (!match_system(big_endian)) { + nextin = lsx_swap_bytes(nextin); + } + if (__lsx_bz_v(__lsx_vslt_hu(__lsx_vrepli_h(0x7F), nextin))) { + // 1. pack the bytes + // obviously suboptimal. + __m128i utf8_packed = __lsx_vpickev_b(nextin, in); + // 2. store (16 bytes) + __lsx_vst(utf8_packed, utf8_output, 0); + // 3. adjust pointers + buf += 16; + utf8_output += 16; + continue; // we are done for this round! } else { - // you might think that a for-loop would work, but under Visual Studio, - // it is not good enough. - static_assert( - (simd8x64::NUM_CHUNKS == 2) || - (simd8x64::NUM_CHUNKS == 4), - "We support either two or four chunks per 64-byte block."); - auto zero = simd8{uint8_t(0)}; - if (simd8x64::NUM_CHUNKS == 2) { - this->check_utf8_bytes(input.chunks[0], zero); - this->check_utf8_bytes(input.chunks[1], input.chunks[0]); - } else if (simd8x64::NUM_CHUNKS == 4) { - this->check_utf8_bytes(input.chunks[0], zero); - this->check_utf8_bytes(input.chunks[1], input.chunks[0]); - this->check_utf8_bytes(input.chunks[2], input.chunks[1]); - this->check_utf8_bytes(input.chunks[3], input.chunks[2]); - } - uint64_t utf8_continuation_mask = input.lt(-65 + 1); - if (errors() || (utf8_continuation_mask & 1)) { - // rewind_and_convert_with_errors will seek a potential error from - // in+pos onward, with the ability to go back up to pos bytes, and - // read size-pos bytes forward. - result res = - scalar::utf8_to_utf16::rewind_and_convert_with_errors( - pos, in + pos, size - pos, utf16_output); - res.count += pos; - return res; - } - uint64_t utf8_leading_mask = ~utf8_continuation_mask; - uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; - // We process in blocks of up to 12 bytes except possibly - // for fast paths which may process up to 16 bytes. For the - // slow path to work, we should have at least 12 input bytes left. - size_t max_starting_point = (pos + 64) - 12; - // Next loop is going to run at least five times. - while (pos < max_starting_point) { - // Performance note: our ability to compute 'consumed' and - // then shift and recompute is critical. If there is a - // latency of, say, 4 cycles on getting 'consumed', then - // the inner loop might have a total latency of about 6 cycles. - // Yet we process between 6 to 12 inputs bytes, thus we get - // a speed limit between 1 cycle/byte and 0.5 cycle/byte - // for this section of the code. Hence, there is a limit - // to how much we can further increase this latency before - // it seriously harms performance. - size_t consumed = convert_masked_utf8_to_utf16( - in + pos, utf8_end_of_code_point_mask, utf16_output); - pos += consumed; - utf8_end_of_code_point_mask >>= consumed; - } - // At this point there may remain between 0 and 12 bytes in the - // 64-byte block. These bytes will be processed again. So we have an - // 80% efficiency (in the worst case). In practice we expect an - // 85% to 90% efficiency. + // 1. pack the bytes + // obviously suboptimal. + __m128i utf8_packed = __lsx_vpickev_b(in, in); + // 2. store (8 bytes) + __lsx_vst(utf8_packed, utf8_output, 0); + // 3. adjust pointers + buf += 8; + utf8_output += 8; + in = nextin; } } - if (errors()) { - // rewind_and_convert_with_errors will seek a potential error from in+pos - // onward, with the ability to go back up to pos bytes, and read size-pos - // bytes forward. - result res = - scalar::utf8_to_utf16::rewind_and_convert_with_errors( - pos, in + pos, size - pos, utf16_output); - res.count += pos; - return res; - } - if (pos < size) { - // rewind_and_convert_with_errors will seek a potential error from in+pos - // onward, with the ability to go back up to pos bytes, and read size-pos - // bytes forward. - result res = - scalar::utf8_to_utf16::rewind_and_convert_with_errors( - pos, in + pos, size - pos, utf16_output); - if (res.error) { // In case of error, we want the error position - res.count += pos; - return res; - } else { // In case of success, we want the number of word written - utf16_output += res.count; - } + + __m128i v_07ff = __lsx_vreplgr2vr_h(uint16_t(0x7ff)); + __m128i zero = __lsx_vldi(0); + if (__lsx_bz_v(__lsx_vslt_hu(v_07ff, in))) { + // 1. prepare 2-byte values + // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8 + // expected output : [110a|aaaa|10bb|bbbb] x 8 + // t0 = [000a|aaaa|bbbb|bb00] + __m128i t0 = __lsx_vslli_h(in, 2); + // t1 = [000a|aaaa|0000|0000] + __m128i t1 = __lsx_vand_v(t0, __lsx_vldi(-2785 /*0x1f00*/)); + // t2 = [0000|0000|00bb|bbbb] + __m128i t2 = __lsx_vand_v(in, __lsx_vrepli_h(0x3f)); + // t3 = [000a|aaaa|00bb|bbbb] + __m128i t3 = __lsx_vor_v(t1, t2); + // t4 = [110a|aaaa|10bb|bbbb] + __m128i v_c080 = __lsx_vreplgr2vr_h(uint16_t(0xc080)); + __m128i t4 = __lsx_vor_v(t3, v_c080); + // 2. merge ASCII and 2-byte codewords + __m128i one_byte_bytemask = + __lsx_vsle_hu(in, __lsx_vrepli_h(0x7F /*0x007F*/)); + __m128i utf8_unpacked = __lsx_vbitsel_v(t4, in, one_byte_bytemask); + // 3. prepare bitmask for 8-bit lookup + uint32_t m2 = __lsx_vpickve2gr_bu(__lsx_vmskltz_h(one_byte_bytemask), 0); + // 4. pack the bytes + const uint8_t *row = &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes + [lsx_1_2_utf8_bytes_mask[m2]][0]; + __m128i shuffle = __lsx_vld(row, 1); + __m128i utf8_packed = __lsx_vshuf_b(zero, utf8_unpacked, shuffle); + // 5. store bytes + __lsx_vst(utf8_packed, utf8_output, 0); + // 6. adjust pointers + buf += 8; + utf8_output += row[0]; + continue; } - return result(error_code::SUCCESS, utf16_output - start); - } + __m128i surrogates_bytemask = + __lsx_vseq_h(__lsx_vand_v(in, __lsx_vldi(-2568 /*0xF800*/)), + __lsx_vldi(-2600 /*0xD800*/)); + // It might seem like checking for surrogates_bitmask == 0xc000 could help. + // However, it is likely an uncommon occurrence. + if (__lsx_bz_v(surrogates_bytemask)) { + // case: code units from register produce either 1, 2 or 3 UTF-8 bytes + /* In this branch we handle three cases: + 1. [0000|0000|0ccc|cccc] => [0ccc|cccc] - + single UFT-8 byte + 2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc] - + two UTF-8 bytes + 3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - + three UTF-8 bytes - simdutf_really_inline bool errors() const { - return this->error.any_bits_set_anywhere(); - } + We expand the input word (16-bit) into two code units (32-bit), thus + we have room for four bytes. However, we need five distinct bit + layouts. Note that the last byte in cases #2 and #3 is the same. -}; // struct utf8_checker -} // namespace utf8_to_utf16 -} // unnamed namespace -} // namespace ppc64 -} // namespace simdutf -/* end file src/generic/utf8_to_utf16/utf8_to_utf16.h */ -/* begin file src/generic/utf8_to_utf16/valid_utf8_to_utf16.h */ + We precompute byte 1 for case #1 and the common byte for cases #2 & #3 + in register t2. -namespace simdutf { -namespace ppc64 { -namespace { -namespace utf8_to_utf16 { + We precompute byte 1 for case #3 and -- **conditionally** -- + precompute either byte 1 for case #2 or byte 2 for case #3. Note that + they differ by exactly one bit. -using namespace simd; + Finally from these two code units we build proper UTF-8 sequence, + taking into account the case (i.e, the number of bytes to write). + */ + /** + * Given [aaaa|bbbb|bbcc|cccc] our goal is to produce: + * t2 => [0ccc|cccc] [10cc|cccc] + * s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb]) + */ + // [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc] + __m128i t0 = __lsx_vpickev_b(in, in); + t0 = __lsx_vilvl_b(t0, t0); -template -simdutf_warn_unused size_t convert_valid(const char *input, size_t size, - char16_t *utf16_output) noexcept { - // The implementation is not specific to haswell and should be moved to the - // generic directory. - size_t pos = 0; - char16_t *start{utf16_output}; - const size_t safety_margin = 16; // to avoid overruns! - while (pos + 64 + safety_margin <= size) { - // this loop could be unrolled further. For example, we could process the - // mask far more than 64 bytes. - simd8x64 in(reinterpret_cast(input + pos)); - if (in.is_ascii()) { - in.store_ascii_as_utf16(utf16_output); - utf16_output += 64; - pos += 64; - } else { - // Slow path. We hope that the compiler will recognize that this is a slow - // path. Anything that is not a continuation mask is a 'leading byte', - // that is, the start of a new code point. - uint64_t utf8_continuation_mask = in.lt(-65 + 1); - // -65 is 0b10111111 in two-complement's, so largest possible continuation - // byte - uint64_t utf8_leading_mask = ~utf8_continuation_mask; - // The *start* of code points is not so useful, rather, we want the *end* - // of code points. - uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; - // We process in blocks of up to 12 bytes except possibly - // for fast paths which may process up to 16 bytes. For the - // slow path to work, we should have at least 12 input bytes left. - size_t max_starting_point = (pos + 64) - 12; - // Next loop is going to run at least five times when using solely - // the slow/regular path, and at least four times if there are fast paths. - while (pos < max_starting_point) { - // Performance note: our ability to compute 'consumed' and - // then shift and recompute is critical. If there is a - // latency of, say, 4 cycles on getting 'consumed', then - // the inner loop might have a total latency of about 6 cycles. - // Yet we process between 6 to 12 inputs bytes, thus we get - // a speed limit between 1 cycle/byte and 0.5 cycle/byte - // for this section of the code. Hence, there is a limit - // to how much we can further increase this latency before - // it seriously harms performance. - // - // Thus we may allow convert_masked_utf8_to_utf16 to process - // more bytes at a time under a fast-path mode where 16 bytes - // are consumed at once (e.g., when encountering ASCII). - size_t consumed = convert_masked_utf8_to_utf16( - input + pos, utf8_end_of_code_point_mask, utf16_output); - pos += consumed; - utf8_end_of_code_point_mask >>= consumed; - } - // At this point there may remain between 0 and 12 bytes in the - // 64-byte block. These bytes will be processed again. So we have an - // 80% efficiency (in the worst case). In practice we expect an - // 85% to 90% efficiency. - } - } - utf16_output += scalar::utf8_to_utf16::convert_valid( - input + pos, size - pos, utf16_output); - return utf16_output - start; -} + // [bbcc|cccc|bbcc|cccc] => [00cc|cccc|00cc|cccc] + __m128i v_3f7f = __lsx_vreplgr2vr_h(uint16_t(0x3F7F)); + __m128i t1 = __lsx_vand_v(t0, v_3f7f); + // [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc] + __m128i t2 = __lsx_vor_v(t1, __lsx_vldi(-2688)); -} // namespace utf8_to_utf16 -} // unnamed namespace -} // namespace ppc64 -} // namespace simdutf -/* end file src/generic/utf8_to_utf16/valid_utf8_to_utf16.h */ -// transcoding from UTF-8 to UTF-32 -/* begin file src/generic/utf8_to_utf32/utf8_to_utf32.h */ + // s0: [aaaa|bbbb|bbcc|cccc] => [0000|0000|0000|aaaa] + __m128i s0 = __lsx_vsrli_h(in, 12); + // s1: [aaaa|bbbb|bbcc|cccc] => [0000|bbbb|bb00|0000] + __m128i s1 = __lsx_vslli_h(in, 2); + // s1: [aabb|bbbb|cccc|cc00] => [00bb|bbbb|0000|0000] + s1 = __lsx_vand_v(s1, __lsx_vldi(-2753 /*0x3F00*/)); -namespace simdutf { -namespace ppc64 { -namespace { -namespace utf8_to_utf32 { -using namespace simd; + // [00bb|bbbb|0000|aaaa] + __m128i s2 = __lsx_vor_v(s0, s1); + // s3: [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa] + __m128i v_c0e0 = __lsx_vreplgr2vr_h(uint16_t(0xC0E0)); + __m128i s3 = __lsx_vor_v(s2, v_c0e0); + __m128i one_or_two_bytes_bytemask = __lsx_vsle_hu(in, v_07ff); + __m128i m0 = __lsx_vandn_v(one_or_two_bytes_bytemask, + __lsx_vldi(-2752 /*0x4000*/)); + __m128i s4 = __lsx_vxor_v(s3, m0); -simdutf_really_inline simd8 -check_special_cases(const simd8 input, const simd8 prev1) { - // Bit 0 = Too Short (lead byte/ASCII followed by lead byte/ASCII) - // Bit 1 = Too Long (ASCII followed by continuation) - // Bit 2 = Overlong 3-byte - // Bit 4 = Surrogate - // Bit 5 = Overlong 2-byte - // Bit 7 = Two Continuations - constexpr const uint8_t TOO_SHORT = 1 << 0; // 11______ 0_______ - // 11______ 11______ - constexpr const uint8_t TOO_LONG = 1 << 1; // 0_______ 10______ - constexpr const uint8_t OVERLONG_3 = 1 << 2; // 11100000 100_____ - constexpr const uint8_t SURROGATE = 1 << 4; // 11101101 101_____ - constexpr const uint8_t OVERLONG_2 = 1 << 5; // 1100000_ 10______ - constexpr const uint8_t TWO_CONTS = 1 << 7; // 10______ 10______ - constexpr const uint8_t TOO_LARGE = 1 << 3; // 11110100 1001____ - // 11110100 101_____ - // 11110101 1001____ - // 11110101 101_____ - // 1111011_ 1001____ - // 1111011_ 101_____ - // 11111___ 1001____ - // 11111___ 101_____ - constexpr const uint8_t TOO_LARGE_1000 = 1 << 6; - // 11110101 1000____ - // 1111011_ 1000____ - // 11111___ 1000____ - constexpr const uint8_t OVERLONG_4 = 1 << 6; // 11110000 1000____ + // 4. expand code units 16-bit => 32-bit + __m128i out0 = __lsx_vilvl_h(s4, t2); + __m128i out1 = __lsx_vilvh_h(s4, t2); - const simd8 byte_1_high = prev1.shr<4>().lookup_16( - // 0_______ ________ - TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, - TOO_LONG, - // 10______ ________ - TWO_CONTS, TWO_CONTS, TWO_CONTS, TWO_CONTS, - // 1100____ ________ - TOO_SHORT | OVERLONG_2, - // 1101____ ________ - TOO_SHORT, - // 1110____ ________ - TOO_SHORT | OVERLONG_3 | SURROGATE, - // 1111____ ________ - TOO_SHORT | TOO_LARGE | TOO_LARGE_1000 | OVERLONG_4); - constexpr const uint8_t CARRY = - TOO_SHORT | TOO_LONG | TWO_CONTS; // These all have ____ in byte 1 . - const simd8 byte_1_low = - (prev1 & 0x0F) - .lookup_16( - // ____0000 ________ - CARRY | OVERLONG_3 | OVERLONG_2 | OVERLONG_4, - // ____0001 ________ - CARRY | OVERLONG_2, - // ____001_ ________ - CARRY, CARRY, + // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle + __m128i one_byte_bytemask = __lsx_vsle_hu(in, __lsx_vrepli_h(0x7F)); + + __m128i one_or_two_bytes_bytemask_low = + __lsx_vilvl_h(one_or_two_bytes_bytemask, zero); + __m128i one_or_two_bytes_bytemask_high = + __lsx_vilvh_h(one_or_two_bytes_bytemask, zero); + + __m128i one_byte_bytemask_low = + __lsx_vilvl_h(one_byte_bytemask, one_byte_bytemask); + __m128i one_byte_bytemask_high = + __lsx_vilvh_h(one_byte_bytemask, one_byte_bytemask); + + const uint32_t mask0 = __lsx_vpickve2gr_bu( + __lsx_vmskltz_h(__lsx_vor_v(one_or_two_bytes_bytemask_low, + one_byte_bytemask_low)), + 0); + const uint32_t mask1 = __lsx_vpickve2gr_bu( + __lsx_vmskltz_h(__lsx_vor_v(one_or_two_bytes_bytemask_high, + one_byte_bytemask_high)), + 0); - // ____0100 ________ - CARRY | TOO_LARGE, - // ____0101 ________ - CARRY | TOO_LARGE | TOO_LARGE_1000, - // ____011_ ________ - CARRY | TOO_LARGE | TOO_LARGE_1000, - CARRY | TOO_LARGE | TOO_LARGE_1000, + const uint8_t *row0 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask0][0]; + __m128i shuffle0 = __lsx_vld(row0, 1); + __m128i utf8_0 = __lsx_vshuf_b(zero, out0, shuffle0); - // ____1___ ________ - CARRY | TOO_LARGE | TOO_LARGE_1000, - CARRY | TOO_LARGE | TOO_LARGE_1000, - CARRY | TOO_LARGE | TOO_LARGE_1000, - CARRY | TOO_LARGE | TOO_LARGE_1000, - CARRY | TOO_LARGE | TOO_LARGE_1000, - // ____1101 ________ - CARRY | TOO_LARGE | TOO_LARGE_1000 | SURROGATE, - CARRY | TOO_LARGE | TOO_LARGE_1000, - CARRY | TOO_LARGE | TOO_LARGE_1000); - const simd8 byte_2_high = input.shr<4>().lookup_16( - // ________ 0_______ - TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, - TOO_SHORT, TOO_SHORT, + const uint8_t *row1 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask1][0]; + __m128i shuffle1 = __lsx_vld(row1, 1); + __m128i utf8_1 = __lsx_vshuf_b(zero, out1, shuffle1); - // ________ 1000____ - TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE_1000 | - OVERLONG_4, - // ________ 1001____ - TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE, - // ________ 101_____ - TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, - TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, + __lsx_vst(utf8_0, utf8_output, 0); + utf8_output += row0[0]; + __lsx_vst(utf8_1, utf8_output, 0); + utf8_output += row1[0]; + + buf += 8; + // surrogate pair(s) in a register + } else { + // Let us do a scalar fallback. + // It may seem wasteful to use scalar code, but being efficient with SIMD + // in the presence of surrogate pairs may require non-trivial tables. + size_t forward = 15; + size_t k = 0; + if (size_t(end - buf) < forward + 1) { + forward = size_t(end - buf - 1); + } + for (; k < forward; k++) { + uint16_t word = !match_system(big_endian) + ? scalar::utf16::swap_bytes(buf[k]) + : buf[k]; + if ((word & 0xFF80) == 0) { + *utf8_output++ = char(word); + } else if ((word & 0xF800) == 0) { + *utf8_output++ = char((word >> 6) | 0b11000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + } else if ((word & 0xF800) != 0xD800) { + *utf8_output++ = char((word >> 12) | 0b11100000); + *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + } else { + // must be a surrogate pair + uint16_t diff = uint16_t(word - 0xD800); + uint16_t next_word = !match_system(big_endian) + ? scalar::utf16::swap_bytes(buf[k + 1]) + : buf[k + 1]; + k++; + uint16_t diff2 = uint16_t(next_word - 0xDC00); + if ((diff | diff2) > 0x3FF) { + return std::make_pair( + result(error_code::SURROGATE, buf - start + k - 1), + reinterpret_cast(utf8_output)); + } + uint32_t value = (diff << 10) + diff2 + 0x10000; + *utf8_output++ = char((value >> 18) | 0b11110000); + *utf8_output++ = char(((value >> 12) & 0b111111) | 0b10000000); + *utf8_output++ = char(((value >> 6) & 0b111111) | 0b10000000); + *utf8_output++ = char((value & 0b111111) | 0b10000000); + } + } + buf += k; + } + } // while - // ________ 11______ - TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT); - return (byte_1_high & byte_1_low & byte_2_high); -} -simdutf_really_inline simd8 -check_multibyte_lengths(const simd8 input, - const simd8 prev_input, - const simd8 sc) { - simd8 prev2 = input.prev<2>(prev_input); - simd8 prev3 = input.prev<3>(prev_input); - simd8 must23 = - simd8(must_be_2_3_continuation(prev2, prev3)); - simd8 must23_80 = must23 & uint8_t(0x80); - return must23_80 ^ sc; + return std::make_pair(result(error_code::SUCCESS, buf - start), + reinterpret_cast(utf8_output)); } +/* end file src/lsx/lsx_convert_utf16_to_utf8.cpp */ +/* begin file src/lsx/lsx_convert_utf16_to_utf32.cpp */ +template +std::pair +lsx_convert_utf16_to_utf32(const char16_t *buf, size_t len, + char32_t *utf32_out) { + uint32_t *utf32_output = reinterpret_cast(utf32_out); + const char16_t *end = buf + len; -struct validating_transcoder { - // If this is nonzero, there has been a UTF-8 error. - simd8 error; - - validating_transcoder() : error(uint8_t(0)) {} - // - // Check whether the current bytes are valid UTF-8. - // - simdutf_really_inline void check_utf8_bytes(const simd8 input, - const simd8 prev_input) { - // Flip prev1...prev3 so we can easily determine if they are 2+, 3+ or 4+ - // lead bytes (2, 3, 4-byte leads become large positive numbers instead of - // small negative numbers) - simd8 prev1 = input.prev<1>(prev_input); - simd8 sc = check_special_cases(input, prev1); - this->error |= check_multibyte_lengths(input, prev_input, sc); - } + __m128i zero = __lsx_vldi(0); + __m128i v_f800 = __lsx_vldi(-2568); /*0xF800*/ + __m128i v_d800 = __lsx_vldi(-2600); /*0xD800*/ - simdutf_really_inline size_t convert(const char *in, size_t size, - char32_t *utf32_output) { - size_t pos = 0; - char32_t *start{utf32_output}; - // In the worst case, we have the haswell kernel which can cause an overflow - // of 8 words when calling convert_masked_utf8_to_utf32. If you skip the - // last 16 bytes, and if the data is valid, then it is entirely safe because - // 16 UTF-8 bytes generate much more than 8 bytes. However, you cannot - // generally assume that you have valid UTF-8 input, so we are going to go - // back from the end counting 16 leading bytes, to give us a good margin. - size_t leading_byte = 0; - size_t margin = size; - for (; margin > 0 && leading_byte < 8; margin--) { - leading_byte += (int8_t(in[margin - 1]) > -65); + while (buf + 8 <= end) { + __m128i in = __lsx_vld(reinterpret_cast(buf), 0); + if (!match_system(big_endian)) { + in = lsx_swap_bytes(in); } - // If the input is long enough, then we have that margin-1 is the fourth - // last leading byte. - const size_t safety_margin = size - margin + 1; // to avoid overruns! - while (pos + 64 + safety_margin <= size) { - simd8x64 input(reinterpret_cast(in + pos)); - if (input.is_ascii()) { - input.store_ascii_as_utf32(utf32_output); - utf32_output += 64; - pos += 64; - } else { - // you might think that a for-loop would work, but under Visual Studio, - // it is not good enough. - static_assert( - (simd8x64::NUM_CHUNKS == 2) || - (simd8x64::NUM_CHUNKS == 4), - "We support either two or four chunks per 64-byte block."); - auto zero = simd8{uint8_t(0)}; - if (simd8x64::NUM_CHUNKS == 2) { - this->check_utf8_bytes(input.chunks[0], zero); - this->check_utf8_bytes(input.chunks[1], input.chunks[0]); - } else if (simd8x64::NUM_CHUNKS == 4) { - this->check_utf8_bytes(input.chunks[0], zero); - this->check_utf8_bytes(input.chunks[1], input.chunks[0]); - this->check_utf8_bytes(input.chunks[2], input.chunks[1]); - this->check_utf8_bytes(input.chunks[3], input.chunks[2]); - } - uint64_t utf8_continuation_mask = input.lt(-65 + 1); - if (utf8_continuation_mask & 1) { - return 0; // we have an error - } - uint64_t utf8_leading_mask = ~utf8_continuation_mask; - uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; - // We process in blocks of up to 12 bytes except possibly - // for fast paths which may process up to 16 bytes. For the - // slow path to work, we should have at least 12 input bytes left. - size_t max_starting_point = (pos + 64) - 12; - // Next loop is going to run at least five times. - while (pos < max_starting_point) { - // Performance note: our ability to compute 'consumed' and - // then shift and recompute is critical. If there is a - // latency of, say, 4 cycles on getting 'consumed', then - // the inner loop might have a total latency of about 6 cycles. - // Yet we process between 6 to 12 inputs bytes, thus we get - // a speed limit between 1 cycle/byte and 0.5 cycle/byte - // for this section of the code. Hence, there is a limit - // to how much we can further increase this latency before - // it seriously harms performance. - size_t consumed = convert_masked_utf8_to_utf32( - in + pos, utf8_end_of_code_point_mask, utf32_output); - pos += consumed; - utf8_end_of_code_point_mask >>= consumed; - } - // At this point there may remain between 0 and 12 bytes in the - // 64-byte block. These bytes will be processed again. So we have an - // 80% efficiency (in the worst case). In practice we expect an - // 85% to 90% efficiency. + + __m128i surrogates_bytemask = + __lsx_vseq_h(__lsx_vand_v(in, v_f800), v_d800); + // It might seem like checking for surrogates_bitmask == 0xc000 could help. + // However, it is likely an uncommon occurrence. + if (__lsx_bz_v(surrogates_bytemask)) { + // case: no surrogate pairs, extend all 16-bit code units to 32-bit code + // units + __lsx_vst(__lsx_vilvl_h(zero, in), utf32_output, 0); + __lsx_vst(__lsx_vilvh_h(zero, in), utf32_output, 16); + utf32_output += 8; + buf += 8; + // surrogate pair(s) in a register + } else { + // Let us do a scalar fallback. + // It may seem wasteful to use scalar code, but being efficient with SIMD + // in the presence of surrogate pairs may require non-trivial tables. + size_t forward = 15; + size_t k = 0; + if (size_t(end - buf) < forward + 1) { + forward = size_t(end - buf - 1); } - } - if (errors()) { - return 0; - } - if (pos < size) { - size_t howmany = - scalar::utf8_to_utf32::convert(in + pos, size - pos, utf32_output); - if (howmany == 0) { - return 0; + for (; k < forward; k++) { + uint16_t word = !match_system(big_endian) + ? scalar::utf16::swap_bytes(buf[k]) + : buf[k]; + if ((word & 0xF800) != 0xD800) { + *utf32_output++ = char32_t(word); + } else { + // must be a surrogate pair + uint16_t diff = uint16_t(word - 0xD800); + uint16_t next_word = !match_system(big_endian) + ? scalar::utf16::swap_bytes(buf[k + 1]) + : buf[k + 1]; + k++; + uint16_t diff2 = uint16_t(next_word - 0xDC00); + if ((diff | diff2) > 0x3FF) { + return std::make_pair(nullptr, + reinterpret_cast(utf32_output)); + } + uint32_t value = (diff << 10) + diff2 + 0x10000; + *utf32_output++ = char32_t(value); + } } - utf32_output += howmany; + buf += k; } - return utf32_output - start; - } + } // while + return std::make_pair(buf, reinterpret_cast(utf32_output)); +} - simdutf_really_inline result convert_with_errors(const char *in, size_t size, - char32_t *utf32_output) { - size_t pos = 0; - char32_t *start{utf32_output}; - // In the worst case, we have the haswell kernel which can cause an overflow - // of 8 bytes when calling convert_masked_utf8_to_utf32. If you skip the - // last 16 bytes, and if the data is valid, then it is entirely safe because - // 16 UTF-8 bytes generate much more than 8 bytes. However, you cannot - // generally assume that you have valid UTF-8 input, so we are going to go - // back from the end counting 8 leading bytes, to give us a good margin. - size_t leading_byte = 0; - size_t margin = size; - for (; margin > 0 && leading_byte < 8; margin--) { - leading_byte += (int8_t(in[margin - 1]) > -65); +/* + Returns a pair: a result struct and utf8_output. + If there is an error, the count field of the result is the position of the + error. Otherwise, it is the position of the first unprocessed byte in buf + (even if finished). A scalar routing should carry on the conversion of the + tail if needed. +*/ +template +std::pair +lsx_convert_utf16_to_utf32_with_errors(const char16_t *buf, size_t len, + char32_t *utf32_out) { + uint32_t *utf32_output = reinterpret_cast(utf32_out); + const char16_t *start = buf; + const char16_t *end = buf + len; + + __m128i zero = __lsx_vldi(0); + __m128i v_f800 = __lsx_vldi(-2568); /*0xF800*/ + __m128i v_d800 = __lsx_vldi(-2600); /*0xD800*/ + + while (buf + 8 <= end) { + __m128i in = __lsx_vld(reinterpret_cast(buf), 0); + if (!match_system(big_endian)) { + in = lsx_swap_bytes(in); } - // If the input is long enough, then we have that margin-1 is the fourth - // last leading byte. - const size_t safety_margin = size - margin + 1; // to avoid overruns! - while (pos + 64 + safety_margin <= size) { - simd8x64 input(reinterpret_cast(in + pos)); - if (input.is_ascii()) { - input.store_ascii_as_utf32(utf32_output); - utf32_output += 64; - pos += 64; - } else { - // you might think that a for-loop would work, but under Visual Studio, - // it is not good enough. - static_assert( - (simd8x64::NUM_CHUNKS == 2) || - (simd8x64::NUM_CHUNKS == 4), - "We support either two or four chunks per 64-byte block."); - auto zero = simd8{uint8_t(0)}; - if (simd8x64::NUM_CHUNKS == 2) { - this->check_utf8_bytes(input.chunks[0], zero); - this->check_utf8_bytes(input.chunks[1], input.chunks[0]); - } else if (simd8x64::NUM_CHUNKS == 4) { - this->check_utf8_bytes(input.chunks[0], zero); - this->check_utf8_bytes(input.chunks[1], input.chunks[0]); - this->check_utf8_bytes(input.chunks[2], input.chunks[1]); - this->check_utf8_bytes(input.chunks[3], input.chunks[2]); - } - uint64_t utf8_continuation_mask = input.lt(-65 + 1); - if (errors() || (utf8_continuation_mask & 1)) { - result res = scalar::utf8_to_utf32::rewind_and_convert_with_errors( - pos, in + pos, size - pos, utf32_output); - res.count += pos; - return res; - } - uint64_t utf8_leading_mask = ~utf8_continuation_mask; - uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; - // We process in blocks of up to 12 bytes except possibly - // for fast paths which may process up to 16 bytes. For the - // slow path to work, we should have at least 12 input bytes left. - size_t max_starting_point = (pos + 64) - 12; - // Next loop is going to run at least five times. - while (pos < max_starting_point) { - // Performance note: our ability to compute 'consumed' and - // then shift and recompute is critical. If there is a - // latency of, say, 4 cycles on getting 'consumed', then - // the inner loop might have a total latency of about 6 cycles. - // Yet we process between 6 to 12 inputs bytes, thus we get - // a speed limit between 1 cycle/byte and 0.5 cycle/byte - // for this section of the code. Hence, there is a limit - // to how much we can further increase this latency before - // it seriously harms performance. - size_t consumed = convert_masked_utf8_to_utf32( - in + pos, utf8_end_of_code_point_mask, utf32_output); - pos += consumed; - utf8_end_of_code_point_mask >>= consumed; + + __m128i surrogates_bytemask = + __lsx_vseq_h(__lsx_vand_v(in, v_f800), v_d800); + if (__lsx_bz_v(surrogates_bytemask)) { + // case: no surrogate pairs, extend all 16-bit code units to 32-bit code + // units + __lsx_vst(__lsx_vilvl_h(zero, in), utf32_output, 0); + __lsx_vst(__lsx_vilvh_h(zero, in), utf32_output, 16); + utf32_output += 8; + buf += 8; + // surrogate pair(s) in a register + } else { + // Let us do a scalar fallback. + // It may seem wasteful to use scalar code, but being efficient with SIMD + // in the presence of surrogate pairs may require non-trivial tables. + size_t forward = 15; + size_t k = 0; + if (size_t(end - buf) < forward + 1) { + forward = size_t(end - buf - 1); + } + for (; k < forward; k++) { + uint16_t word = !match_system(big_endian) + ? scalar::utf16::swap_bytes(buf[k]) + : buf[k]; + if ((word & 0xF800) != 0xD800) { + *utf32_output++ = char32_t(word); + } else { + // must be a surrogate pair + uint16_t diff = uint16_t(word - 0xD800); + uint16_t next_word = !match_system(big_endian) + ? scalar::utf16::swap_bytes(buf[k + 1]) + : buf[k + 1]; + k++; + uint16_t diff2 = uint16_t(next_word - 0xDC00); + if ((diff | diff2) > 0x3FF) { + return std::make_pair( + result(error_code::SURROGATE, buf - start + k - 1), + reinterpret_cast(utf32_output)); + } + uint32_t value = (diff << 10) + diff2 + 0x10000; + *utf32_output++ = char32_t(value); } - // At this point there may remain between 0 and 12 bytes in the - // 64-byte block. These bytes will be processed again. So we have an - // 80% efficiency (in the worst case). In practice we expect an - // 85% to 90% efficiency. } + buf += k; } - if (errors()) { - result res = scalar::utf8_to_utf32::rewind_and_convert_with_errors( - pos, in + pos, size - pos, utf32_output); - res.count += pos; - return res; - } - if (pos < size) { - result res = scalar::utf8_to_utf32::rewind_and_convert_with_errors( - pos, in + pos, size - pos, utf32_output); - if (res.error) { // In case of error, we want the error position - res.count += pos; - return res; - } else { // In case of success, we want the number of word written - utf32_output += res.count; - } + } // while + return std::make_pair(result(error_code::SUCCESS, buf - start), + reinterpret_cast(utf32_output)); +} +/* end file src/lsx/lsx_convert_utf16_to_utf32.cpp */ + +/* begin file src/lsx/lsx_convert_utf32_to_latin1.cpp */ +std::pair +lsx_convert_utf32_to_latin1(const char32_t *buf, size_t len, + char *latin1_output) { + const char32_t *end = buf + len; + const v16u8 shuf_mask = {0, 4, 8, 12, 16, 20, 24, 28, 0, 0, 0, 0, 0, 0, 0, 0}; + __m128i v_ff = __lsx_vrepli_w(0xFF); + + while (buf + 16 <= end) { + __m128i in1 = __lsx_vld(reinterpret_cast(buf), 0); + __m128i in2 = __lsx_vld(reinterpret_cast(buf), 16); + + __m128i in12 = __lsx_vor_v(in1, in2); + if (__lsx_bz_v(__lsx_vslt_wu(v_ff, in12))) { + // 1. pack the bytes + __m128i latin1_packed = __lsx_vshuf_b(in2, in1, (__m128i)shuf_mask); + // 2. store (8 bytes) + __lsx_vst(latin1_packed, reinterpret_cast(latin1_output), 0); + // 3. adjust pointers + buf += 8; + latin1_output += 8; + } else { + return std::make_pair(nullptr, reinterpret_cast(latin1_output)); } - return result(error_code::SUCCESS, utf32_output - start); - } + } // while + return std::make_pair(buf, latin1_output); +} - simdutf_really_inline bool errors() const { - return this->error.any_bits_set_anywhere(); - } +std::pair +lsx_convert_utf32_to_latin1_with_errors(const char32_t *buf, size_t len, + char *latin1_output) { + const char32_t *start = buf; + const char32_t *end = buf + len; -}; // struct utf8_checker -} // namespace utf8_to_utf32 -} // unnamed namespace -} // namespace ppc64 -} // namespace simdutf -/* end file src/generic/utf8_to_utf32/utf8_to_utf32.h */ -/* begin file src/generic/utf8_to_utf32/valid_utf8_to_utf32.h */ + const v16u8 shuf_mask = {0, 4, 8, 12, 16, 20, 24, 28, 0, 0, 0, 0, 0, 0, 0, 0}; + __m128i v_ff = __lsx_vrepli_w(0xFF); -namespace simdutf { -namespace ppc64 { -namespace { -namespace utf8_to_utf32 { + while (buf + 16 <= end) { + __m128i in1 = __lsx_vld(reinterpret_cast(buf), 0); + __m128i in2 = __lsx_vld(reinterpret_cast(buf), 16); -using namespace simd; + __m128i in12 = __lsx_vor_v(in1, in2); -simdutf_warn_unused size_t convert_valid(const char *input, size_t size, - char32_t *utf32_output) noexcept { - size_t pos = 0; - char32_t *start{utf32_output}; - const size_t safety_margin = 16; // to avoid overruns! - while (pos + 64 + safety_margin <= size) { - simd8x64 in(reinterpret_cast(input + pos)); - if (in.is_ascii()) { - in.store_ascii_as_utf32(utf32_output); - utf32_output += 64; - pos += 64; + if (__lsx_bz_v(__lsx_vslt_wu(v_ff, in12))) { + // 1. pack the bytes + __m128i latin1_packed = __lsx_vshuf_b(in2, in1, (__m128i)shuf_mask); + // 2. store (8 bytes) + __lsx_vst(latin1_packed, reinterpret_cast(latin1_output), 0); + // 3. adjust pointers + buf += 8; + latin1_output += 8; } else { - // -65 is 0b10111111 in two-complement's, so largest possible continuation - // byte - uint64_t utf8_continuation_mask = in.lt(-65 + 1); - uint64_t utf8_leading_mask = ~utf8_continuation_mask; - uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; - size_t max_starting_point = (pos + 64) - 12; - while (pos < max_starting_point) { - size_t consumed = convert_masked_utf8_to_utf32( - input + pos, utf8_end_of_code_point_mask, utf32_output); - pos += consumed; - utf8_end_of_code_point_mask >>= consumed; + // Let us do a scalar fallback. + for (int k = 0; k < 8; k++) { + uint32_t word = buf[k]; + if (word <= 0xff) { + *latin1_output++ = char(word); + } else { + return std::make_pair(result(error_code::TOO_LARGE, buf - start + k), + latin1_output); + } } } - } - utf32_output += scalar::utf8_to_utf32::convert_valid(input + pos, size - pos, - utf32_output); - return utf32_output - start; + } // while + return std::make_pair(result(error_code::SUCCESS, buf - start), + latin1_output); } +/* end file src/lsx/lsx_convert_utf32_to_latin1.cpp */ +/* begin file src/lsx/lsx_convert_utf32_to_utf8.cpp */ +std::pair +lsx_convert_utf32_to_utf8(const char32_t *buf, size_t len, char *utf8_out) { + uint8_t *utf8_output = reinterpret_cast(utf8_out); + const char32_t *end = buf + len; -} // namespace utf8_to_utf32 -} // unnamed namespace -} // namespace ppc64 -} // namespace simdutf -/* end file src/generic/utf8_to_utf32/valid_utf8_to_utf32.h */ -// other functions -/* begin file src/generic/utf16.h */ -namespace simdutf { -namespace ppc64 { -namespace { -namespace utf16 { + __m128i v_c080 = __lsx_vreplgr2vr_h(uint16_t(0xC080)); + __m128i v_07ff = __lsx_vreplgr2vr_h(uint16_t(0x7FF)); + __m128i v_dfff = __lsx_vreplgr2vr_h(uint16_t(0xDFFF)); + __m128i v_d800 = __lsx_vldi(-2600); /*0xD800*/ + __m128i forbidden_bytemask = __lsx_vldi(0x0); -template -simdutf_really_inline size_t count_code_points(const char16_t *in, - size_t size) { - size_t pos = 0; - size_t count = 0; - for (; pos < size / 32 * 32; pos += 32) { - simd16x32 input(reinterpret_cast(in + pos)); - if (!match_system(big_endian)) { - input.swap_bytes(); - } - uint64_t not_pair = input.not_in_range(0xDC00, 0xDFFF); - count += count_ones(not_pair) / 2; - } - return count + - scalar::utf16::count_code_points(in + pos, size - pos); -} + const size_t safety_margin = + 12; // to avoid overruns, see issue + // https://github.com/simdutf/simdutf/issues/92 -template -simdutf_really_inline size_t utf8_length_from_utf16(const char16_t *in, - size_t size) { - size_t pos = 0; - size_t count = 0; - // This algorithm could no doubt be improved! - for (; pos < size / 32 * 32; pos += 32) { - simd16x32 input(reinterpret_cast(in + pos)); - if (!match_system(big_endian)) { - input.swap_bytes(); - } - uint64_t ascii_mask = input.lteq(0x7F); - uint64_t twobyte_mask = input.lteq(0x7FF); - uint64_t not_pair_mask = input.not_in_range(0xD800, 0xDFFF); + while (buf + 16 + safety_margin < end) { + __m128i in = __lsx_vld(reinterpret_cast(buf), 0); + __m128i nextin = __lsx_vld(reinterpret_cast(buf), 16); - size_t ascii_count = count_ones(ascii_mask) / 2; - size_t twobyte_count = count_ones(twobyte_mask & ~ascii_mask) / 2; - size_t threebyte_count = count_ones(not_pair_mask & ~twobyte_mask) / 2; - size_t fourbyte_count = 32 - count_ones(not_pair_mask) / 2; - count += 2 * fourbyte_count + 3 * threebyte_count + 2 * twobyte_count + - ascii_count; - } - return count + scalar::utf16::utf8_length_from_utf16(in + pos, - size - pos); -} + // Check if no bits set above 16th + if (__lsx_bz_v(__lsx_vpickod_h(in, nextin))) { + // Pack UTF-32 to UTF-16 safely (without surrogate pairs) + // Apply UTF-16 => UTF-8 routine (lsx_convert_utf16_to_utf8.cpp) + __m128i utf16_packed = __lsx_vpickev_h(nextin, in); + + if (__lsx_bz_v(__lsx_vslt_hu(__lsx_vrepli_h(0x7F), + utf16_packed))) { // ASCII fast path!!!! + // 1. pack the bytes + // obviously suboptimal. + __m128i utf8_packed = __lsx_vpickev_b(utf16_packed, utf16_packed); + // 2. store (8 bytes) + __lsx_vst(utf8_packed, utf8_output, 0); + // 3. adjust pointers + buf += 8; + utf8_output += 8; + continue; // we are done for this round! + } + __m128i zero = __lsx_vldi(0); + if (__lsx_bz_v(__lsx_vslt_hu(v_07ff, utf16_packed))) { + // 1. prepare 2-byte values + // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8 + // expected output : [110a|aaaa|10bb|bbbb] x 8 + + // t0 = [000a|aaaa|bbbb|bb00] + const __m128i t0 = __lsx_vslli_h(utf16_packed, 2); + // t1 = [000a|aaaa|0000|0000] + const __m128i t1 = __lsx_vand_v(t0, __lsx_vldi(-2785 /*0x1f00*/)); + // t2 = [0000|0000|00bb|bbbb] + const __m128i t2 = __lsx_vand_v(utf16_packed, __lsx_vrepli_h(0x3f)); + // t3 = [000a|aaaa|00bb|bbbb] + const __m128i t3 = __lsx_vor_v(t1, t2); + // t4 = [110a|aaaa|10bb|bbbb] + const __m128i t4 = __lsx_vor_v(t3, v_c080); + // 2. merge ASCII and 2-byte codewords + __m128i one_byte_bytemask = + __lsx_vsle_hu(utf16_packed, __lsx_vrepli_h(0x7F /*0x007F*/)); + __m128i utf8_unpacked = + __lsx_vbitsel_v(t4, utf16_packed, one_byte_bytemask); + // 3. prepare bitmask for 8-bit lookup + uint32_t m2 = + __lsx_vpickve2gr_bu(__lsx_vmskltz_h(one_byte_bytemask), 0); + // 4. pack the bytes + const uint8_t *row = + &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes + [lsx_1_2_utf8_bytes_mask[m2]][0]; + __m128i shuffle = __lsx_vld(row, 1); + __m128i utf8_packed = __lsx_vshuf_b(zero, utf8_unpacked, shuffle); + // 5. store bytes + __lsx_vst(utf8_packed, utf8_output, 0); + + // 6. adjust pointers + buf += 8; + utf8_output += row[0]; + continue; + } else { + // case: code units from register produce either 1, 2 or 3 UTF-8 bytes + forbidden_bytemask = __lsx_vor_v( + __lsx_vand_v( + __lsx_vsle_h(utf16_packed, v_dfff), // utf16_packed <= 0xdfff + __lsx_vsle_h(v_d800, utf16_packed)), // utf16_packed >= 0xd800 + forbidden_bytemask); + /* In this branch we handle three cases: + 1. [0000|0000|0ccc|cccc] => [0ccc|cccc] - single + UFT-8 byte + 2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc] - two + UTF-8 bytes + 3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - three + UTF-8 bytes + + We expand the input word (16-bit) into two code units (32-bit), thus + we have room for four bytes. However, we need five distinct bit + layouts. Note that the last byte in cases #2 and #3 is the same. + + We precompute byte 1 for case #1 and the common byte for cases #2 & #3 + in register t2. + + We precompute byte 1 for case #3 and -- **conditionally** -- precompute + either byte 1 for case #2 or byte 2 for case #3. Note that they + differ by exactly one bit. + + Finally from these two code units we build proper UTF-8 sequence, taking + into account the case (i.e, the number of bytes to write). + */ + /** + * Given [aaaa|bbbb|bbcc|cccc] our goal is to produce: + * t2 => [0ccc|cccc] [10cc|cccc] + * s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb]) + */ + // [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc] + __m128i t0 = __lsx_vpickev_b(utf16_packed, utf16_packed); + t0 = __lsx_vilvl_b(t0, t0); + // [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc] + __m128i v_3f7f = __lsx_vreplgr2vr_h(uint16_t(0x3F7F)); + __m128i t1 = __lsx_vand_v(t0, v_3f7f); + // [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc] + __m128i t2 = __lsx_vor_v(t1, __lsx_vldi(-2688 /*0x8000*/)); + + // s0: [aaaa|bbbb|bbcc|cccc] => [0000|0000|0000|aaaa] + __m128i s0 = __lsx_vsrli_h(utf16_packed, 12); + // s1: [aaaa|bbbb|bbcc|cccc] => [0000|bbbb|bb00|0000] + __m128i s1 = __lsx_vslli_h(utf16_packed, 2); + // [0000|bbbb|bb00|0000] => [00bb|bbbb|0000|0000] + s1 = __lsx_vand_v(s1, __lsx_vldi(-2753 /*0x3F00*/)); + // [00bb|bbbb|0000|aaaa] + __m128i s2 = __lsx_vor_v(s0, s1); + // s3: [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa] + __m128i v_c0e0 = __lsx_vreplgr2vr_h(uint16_t(0xC0E0)); + __m128i s3 = __lsx_vor_v(s2, v_c0e0); + // __m128i v_07ff = vmovq_n_u16((uint16_t)0x07FF); + __m128i one_or_two_bytes_bytemask = __lsx_vsle_hu(utf16_packed, v_07ff); + __m128i m0 = __lsx_vandn_v(one_or_two_bytes_bytemask, + __lsx_vldi(-2752 /*0x4000*/)); + __m128i s4 = __lsx_vxor_v(s3, m0); + + // 4. expand code units 16-bit => 32-bit + __m128i out0 = __lsx_vilvl_h(s4, t2); + __m128i out1 = __lsx_vilvh_h(s4, t2); + + // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle + __m128i one_byte_bytemask = + __lsx_vsle_hu(utf16_packed, __lsx_vrepli_h(0x7F)); + + __m128i one_or_two_bytes_bytemask_u16_to_u32_low = + __lsx_vilvl_h(one_or_two_bytes_bytemask, zero); + __m128i one_or_two_bytes_bytemask_u16_to_u32_high = + __lsx_vilvh_h(one_or_two_bytes_bytemask, zero); + + __m128i one_byte_bytemask_u16_to_u32_low = + __lsx_vilvl_h(one_byte_bytemask, one_byte_bytemask); + __m128i one_byte_bytemask_u16_to_u32_high = + __lsx_vilvh_h(one_byte_bytemask, one_byte_bytemask); + + const uint32_t mask0 = + __lsx_vpickve2gr_bu(__lsx_vmskltz_h(__lsx_vor_v( + one_or_two_bytes_bytemask_u16_to_u32_low, + one_byte_bytemask_u16_to_u32_low)), + 0); + const uint32_t mask1 = + __lsx_vpickve2gr_bu(__lsx_vmskltz_h(__lsx_vor_v( + one_or_two_bytes_bytemask_u16_to_u32_high, + one_byte_bytemask_u16_to_u32_high)), + 0); + + const uint8_t *row0 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask0][0]; + __m128i shuffle0 = __lsx_vld(row0, 1); + __m128i utf8_0 = __lsx_vshuf_b(zero, out0, shuffle0); + + const uint8_t *row1 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask1][0]; + __m128i shuffle1 = __lsx_vld(row1, 1); + __m128i utf8_1 = __lsx_vshuf_b(zero, out1, shuffle1); -template -simdutf_really_inline size_t utf32_length_from_utf16(const char16_t *in, - size_t size) { - return count_code_points(in, size); -} + __lsx_vst(utf8_0, utf8_output, 0); + utf8_output += row0[0]; + __lsx_vst(utf8_1, utf8_output, 0); + utf8_output += row1[0]; -simdutf_really_inline void -change_endianness_utf16(const char16_t *in, size_t size, char16_t *output) { - size_t pos = 0; + buf += 8; + } + // At least one 32-bit word will produce a surrogate pair in UTF-16 <=> + // will produce four UTF-8 bytes. + } else { + // Let us do a scalar fallback. + // It may seem wasteful to use scalar code, but being efficient with SIMD + // in the presence of surrogate pairs may require non-trivial tables. + size_t forward = 15; + size_t k = 0; + if (size_t(end - buf) < forward + 1) { + forward = size_t(end - buf - 1); + } + for (; k < forward; k++) { + uint32_t word = buf[k]; + if ((word & 0xFFFFFF80) == 0) { + *utf8_output++ = char(word); + } else if ((word & 0xFFFFF800) == 0) { + *utf8_output++ = char((word >> 6) | 0b11000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + } else if ((word & 0xFFFF0000) == 0) { + if (word >= 0xD800 && word <= 0xDFFF) { + return std::make_pair(nullptr, + reinterpret_cast(utf8_output)); + } + *utf8_output++ = char((word >> 12) | 0b11100000); + *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + } else { + if (word > 0x10FFFF) { + return std::make_pair(nullptr, + reinterpret_cast(utf8_output)); + } + *utf8_output++ = char((word >> 18) | 0b11110000); + *utf8_output++ = char(((word >> 12) & 0b111111) | 0b10000000); + *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + } + } + buf += k; + } + } // while - while (pos < size / 32 * 32) { - simd16x32 input(reinterpret_cast(in + pos)); - input.swap_bytes(); - input.store(reinterpret_cast(output)); - pos += 32; - output += 32; + // check for invalid input + if (__lsx_bnz_v(forbidden_bytemask)) { + return std::make_pair(nullptr, reinterpret_cast(utf8_output)); } - - scalar::utf16::change_endianness_utf16(in + pos, size - pos, output); + return std::make_pair(buf, reinterpret_cast(utf8_output)); } -} // namespace utf16 -} // unnamed namespace -} // namespace ppc64 -} // namespace simdutf -/* end file src/generic/utf16.h */ -/* begin file src/generic/utf8.h */ +std::pair +lsx_convert_utf32_to_utf8_with_errors(const char32_t *buf, size_t len, + char *utf8_out) { + uint8_t *utf8_output = reinterpret_cast(utf8_out); + const char32_t *start = buf; + const char32_t *end = buf + len; -namespace simdutf { -namespace ppc64 { -namespace { -namespace utf8 { + __m128i v_c080 = __lsx_vreplgr2vr_h(uint16_t(0xC080)); + __m128i v_07ff = __lsx_vreplgr2vr_h(uint16_t(0x7FF)); + __m128i v_dfff = __lsx_vreplgr2vr_h(uint16_t(0xDFFF)); + __m128i v_d800 = __lsx_vldi(-2600); /*0xD800*/ + __m128i forbidden_bytemask = __lsx_vldi(0x0); + const size_t safety_margin = + 12; // to avoid overruns, see issue + // https://github.com/simdutf/simdutf/issues/92 -using namespace simd; + while (buf + 16 + safety_margin < end) { + __m128i in = __lsx_vld(reinterpret_cast(buf), 0); + __m128i nextin = __lsx_vld(reinterpret_cast(buf), 16); -simdutf_really_inline size_t count_code_points(const char *in, size_t size) { - size_t pos = 0; - size_t count = 0; - for (; pos + 64 <= size; pos += 64) { - simd8x64 input(reinterpret_cast(in + pos)); - uint64_t utf8_continuation_mask = input.gt(-65); - count += count_ones(utf8_continuation_mask); - } - return count + scalar::utf8::count_code_points(in + pos, size - pos); -} + // Check if no bits set above 16th + if (__lsx_bz_v(__lsx_vpickod_h(in, nextin))) { + // Pack UTF-32 to UTF-16 safely (without surrogate pairs) + // Apply UTF-16 => UTF-8 routine (lsx_convert_utf16_to_utf8.cpp) + __m128i utf16_packed = __lsx_vpickev_h(nextin, in); -simdutf_really_inline size_t utf16_length_from_utf8(const char *in, - size_t size) { - size_t pos = 0; - size_t count = 0; - // This algorithm could no doubt be improved! - for (; pos + 64 <= size; pos += 64) { - simd8x64 input(reinterpret_cast(in + pos)); - uint64_t utf8_continuation_mask = input.lt(-65 + 1); - // We count one word for anything that is not a continuation (so - // leading bytes). - count += 64 - count_ones(utf8_continuation_mask); - int64_t utf8_4byte = input.gteq_unsigned(240); - count += count_ones(utf8_4byte); - } - return count + scalar::utf8::utf16_length_from_utf8(in + pos, size - pos); -} -} // namespace utf8 -} // unnamed namespace -} // namespace ppc64 -} // namespace simdutf -/* end file src/generic/utf8.h */ + if (__lsx_bz_v(__lsx_vslt_hu(__lsx_vrepli_h(0x7F), + utf16_packed))) { // ASCII fast path!!!! + // 1. pack the bytes + // obviously suboptimal. + __m128i utf8_packed = __lsx_vpickev_b(utf16_packed, utf16_packed); + // 2. store (8 bytes) + __lsx_vst(utf8_packed, utf8_output, 0); + // 3. adjust pointers + buf += 8; + utf8_output += 8; + continue; // we are done for this round! + } + __m128i zero = __lsx_vldi(0); + if (__lsx_bz_v(__lsx_vslt_hu(v_07ff, utf16_packed))) { + // 1. prepare 2-byte values + // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8 + // expected output : [110a|aaaa|10bb|bbbb] x 8 -// -// Implementation-specific overrides -// -namespace simdutf { -namespace ppc64 { + // t0 = [000a|aaaa|bbbb|bb00] + const __m128i t0 = __lsx_vslli_h(utf16_packed, 2); + // t1 = [000a|aaaa|0000|0000] + const __m128i t1 = __lsx_vand_v(t0, __lsx_vldi(-2785 /*0x1f00*/)); + // t2 = [0000|0000|00bb|bbbb] + const __m128i t2 = __lsx_vand_v(utf16_packed, __lsx_vrepli_h(0x3f)); + // t3 = [000a|aaaa|00bb|bbbb] + const __m128i t3 = __lsx_vor_v(t1, t2); + // t4 = [110a|aaaa|10bb|bbbb] + const __m128i t4 = __lsx_vor_v(t3, v_c080); + // 2. merge ASCII and 2-byte codewords + __m128i one_byte_bytemask = + __lsx_vsle_hu(utf16_packed, __lsx_vrepli_h(0x7F /*0x007F*/)); + __m128i utf8_unpacked = + __lsx_vbitsel_v(t4, utf16_packed, one_byte_bytemask); + // 3. prepare bitmask for 8-bit lookup + uint32_t m2 = + __lsx_vpickve2gr_bu(__lsx_vmskltz_h(one_byte_bytemask), 0); + // 4. pack the bytes + const uint8_t *row = + &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes + [lsx_1_2_utf8_bytes_mask[m2]][0]; + __m128i shuffle = __lsx_vld(row, 1); + __m128i utf8_packed = __lsx_vshuf_b(zero, utf8_unpacked, shuffle); + // 5. store bytes + __lsx_vst(utf8_packed, utf8_output, 0); -simdutf_warn_unused int -implementation::detect_encodings(const char *input, - size_t length) const noexcept { - // If there is a BOM, then we trust it. - auto bom_encoding = simdutf::BOM::check_bom(input, length); - if (bom_encoding != encoding_type::unspecified) { - return bom_encoding; - } - // todo: reimplement as a one-pass algorithm. - int out = 0; - if (validate_utf8(input, length)) { - out |= encoding_type::UTF8; - } - if ((length % 2) == 0) { - if (validate_utf16(reinterpret_cast(input), length / 2)) { - out |= encoding_type::UTF16_LE; - } - } - if ((length % 4) == 0) { - if (validate_utf32(reinterpret_cast(input), length / 4)) { - out |= encoding_type::UTF32_LE; - } - } + // 6. adjust pointers + buf += 8; + utf8_output += row[0]; + continue; + } else { + // case: code units from register produce either 1, 2 or 3 UTF-8 bytes + forbidden_bytemask = __lsx_vor_v( + __lsx_vand_v( + __lsx_vsle_h(utf16_packed, v_dfff), // utf16_packed <= 0xdfff + __lsx_vsle_h(v_d800, utf16_packed)), // utf16_packed >= 0xd800 + forbidden_bytemask); + if (__lsx_bnz_v(forbidden_bytemask)) { + return std::make_pair(result(error_code::SURROGATE, buf - start), + reinterpret_cast(utf8_output)); + } + /* In this branch we handle three cases: + 1. [0000|0000|0ccc|cccc] => [0ccc|cccc] - single + UFT-8 byte + 2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc] - two + UTF-8 bytes + 3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - three + UTF-8 bytes + + We expand the input word (16-bit) into two code units (32-bit), thus + we have room for four bytes. However, we need five distinct bit + layouts. Note that the last byte in cases #2 and #3 is the same. + + We precompute byte 1 for case #1 and the common byte for cases #2 & #3 + in register t2. + + We precompute byte 1 for case #3 and -- **conditionally** -- precompute + either byte 1 for case #2 or byte 2 for case #3. Note that they + differ by exactly one bit. + + Finally from these two code units we build proper UTF-8 sequence, taking + into account the case (i.e, the number of bytes to write). + */ + /** + * Given [aaaa|bbbb|bbcc|cccc] our goal is to produce: + * t2 => [0ccc|cccc] [10cc|cccc] + * s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb]) + */ + // [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc] + __m128i t0 = __lsx_vpickev_b(utf16_packed, utf16_packed); + t0 = __lsx_vilvl_b(t0, t0); + // [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc] + __m128i v_3f7f = __lsx_vreplgr2vr_h(uint16_t(0x3F7F)); + __m128i t1 = __lsx_vand_v(t0, v_3f7f); + // [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc] + __m128i t2 = __lsx_vor_v(t1, __lsx_vldi(-2688 /*0x8000*/)); - return out; -} + // s0: [aaaa|bbbb|bbcc|cccc] => [0000|0000|0000|aaaa] + __m128i s0 = __lsx_vsrli_h(utf16_packed, 12); + // s1: [aaaa|bbbb|bbcc|cccc] => [0000|bbbb|bb00|0000] + __m128i s1 = __lsx_vslli_h(utf16_packed, 2); + // [0000|bbbb|bb00|0000] => [00bb|bbbb|0000|0000] + s1 = __lsx_vand_v(s1, __lsx_vldi(-2753 /*0x3F00*/)); + // [00bb|bbbb|0000|aaaa] + __m128i s2 = __lsx_vor_v(s0, s1); + // s3: [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa] + __m128i v_c0e0 = __lsx_vreplgr2vr_h(uint16_t(0xC0E0)); + __m128i s3 = __lsx_vor_v(s2, v_c0e0); + // __m128i v_07ff = vmovq_n_u16((uint16_t)0x07FF); + __m128i one_or_two_bytes_bytemask = __lsx_vsle_hu(utf16_packed, v_07ff); + __m128i m0 = __lsx_vandn_v(one_or_two_bytes_bytemask, + __lsx_vldi(-2752 /*0x4000*/)); + __m128i s4 = __lsx_vxor_v(s3, m0); -simdutf_warn_unused bool -implementation::validate_utf8(const char *buf, size_t len) const noexcept { - return ppc64::utf8_validation::generic_validate_utf8(buf, len); -} + // 4. expand code units 16-bit => 32-bit + __m128i out0 = __lsx_vilvl_h(s4, t2); + __m128i out1 = __lsx_vilvh_h(s4, t2); -simdutf_warn_unused result implementation::validate_utf8_with_errors( - const char *buf, size_t len) const noexcept { - return ppc64::utf8_validation::generic_validate_utf8_with_errors(buf, len); -} + // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle + __m128i one_byte_bytemask = + __lsx_vsle_hu(utf16_packed, __lsx_vrepli_h(0x7F)); + + __m128i one_or_two_bytes_bytemask_u16_to_u32_low = + __lsx_vilvl_h(one_or_two_bytes_bytemask, zero); + __m128i one_or_two_bytes_bytemask_u16_to_u32_high = + __lsx_vilvh_h(one_or_two_bytes_bytemask, zero); + + __m128i one_byte_bytemask_u16_to_u32_low = + __lsx_vilvl_h(one_byte_bytemask, one_byte_bytemask); + __m128i one_byte_bytemask_u16_to_u32_high = + __lsx_vilvh_h(one_byte_bytemask, one_byte_bytemask); + + const uint32_t mask0 = + __lsx_vpickve2gr_bu(__lsx_vmskltz_h(__lsx_vor_v( + one_or_two_bytes_bytemask_u16_to_u32_low, + one_byte_bytemask_u16_to_u32_low)), + 0); + const uint32_t mask1 = + __lsx_vpickve2gr_bu(__lsx_vmskltz_h(__lsx_vor_v( + one_or_two_bytes_bytemask_u16_to_u32_high, + one_byte_bytemask_u16_to_u32_high)), + 0); -simdutf_warn_unused bool -implementation::validate_ascii(const char *buf, size_t len) const noexcept { - return ppc64::utf8_validation::generic_validate_ascii(buf, len); -} + const uint8_t *row0 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask0][0]; + __m128i shuffle0 = __lsx_vld(row0, 1); + __m128i utf8_0 = __lsx_vshuf_b(zero, out0, shuffle0); -simdutf_warn_unused result implementation::validate_ascii_with_errors( - const char *buf, size_t len) const noexcept { - return ppc64::utf8_validation::generic_validate_ascii_with_errors(buf, len); -} + const uint8_t *row1 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask1][0]; + __m128i shuffle1 = __lsx_vld(row1, 1); + __m128i utf8_1 = __lsx_vshuf_b(zero, out1, shuffle1); -simdutf_warn_unused bool -implementation::validate_utf16le(const char16_t *buf, - size_t len) const noexcept { - return scalar::utf16::validate(buf, len); -} + __lsx_vst(utf8_0, utf8_output, 0); + utf8_output += row0[0]; + __lsx_vst(utf8_1, utf8_output, 0); + utf8_output += row1[0]; -simdutf_warn_unused bool -implementation::validate_utf16be(const char16_t *buf, - size_t len) const noexcept { - return scalar::utf16::validate(buf, len); -} + buf += 8; + } + // At least one 32-bit word will produce a surrogate pair in UTF-16 <=> + // will produce four UTF-8 bytes. + } else { + // Let us do a scalar fallback. + // It may seem wasteful to use scalar code, but being efficient with SIMD + // in the presence of surrogate pairs may require non-trivial tables. + size_t forward = 15; + size_t k = 0; + if (size_t(end - buf) < forward + 1) { + forward = size_t(end - buf - 1); + } + for (; k < forward; k++) { + uint32_t word = buf[k]; + if ((word & 0xFFFFFF80) == 0) { + *utf8_output++ = char(word); + } else if ((word & 0xFFFFF800) == 0) { + *utf8_output++ = char((word >> 6) | 0b11000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + } else if ((word & 0xFFFF0000) == 0) { + if (word >= 0xD800 && word <= 0xDFFF) { + return std::make_pair( + result(error_code::SURROGATE, buf - start + k), + reinterpret_cast(utf8_output)); + } + *utf8_output++ = char((word >> 12) | 0b11100000); + *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + } else { + if (word > 0x10FFFF) { + return std::make_pair( + result(error_code::TOO_LARGE, buf - start + k), + reinterpret_cast(utf8_output)); + } + *utf8_output++ = char((word >> 18) | 0b11110000); + *utf8_output++ = char(((word >> 12) & 0b111111) | 0b10000000); + *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + } + } + buf += k; + } + } // while -simdutf_warn_unused result implementation::validate_utf16le_with_errors( - const char16_t *buf, size_t len) const noexcept { - return scalar::utf16::validate_with_errors(buf, len); + return std::make_pair(result(error_code::SUCCESS, buf - start), + reinterpret_cast(utf8_output)); } +/* end file src/lsx/lsx_convert_utf32_to_utf8.cpp */ +/* begin file src/lsx/lsx_convert_utf32_to_utf16.cpp */ +template +std::pair +lsx_convert_utf32_to_utf16(const char32_t *buf, size_t len, + char16_t *utf16_out) { + uint16_t *utf16_output = reinterpret_cast(utf16_out); + const char32_t *end = buf + len; -simdutf_warn_unused result implementation::validate_utf16be_with_errors( - const char16_t *buf, size_t len) const noexcept { - return scalar::utf16::validate_with_errors(buf, len); -} + __m128i forbidden_bytemask = __lsx_vrepli_h(0); + __m128i v_d800 = __lsx_vldi(-2600); /*0xD800*/ + __m128i v_dfff = __lsx_vreplgr2vr_h(uint16_t(0xdfff)); + while (buf + 8 <= end) { + __m128i in0 = __lsx_vld(reinterpret_cast(buf), 0); + __m128i in1 = __lsx_vld(reinterpret_cast(buf), 16); -simdutf_warn_unused result implementation::validate_utf32_with_errors( - const char32_t *buf, size_t len) const noexcept { - return scalar::utf32::validate_with_errors(buf, len); -} + // Check if no bits set above 16th + if (__lsx_bz_v(__lsx_vpickod_h(in1, in0))) { + __m128i utf16_packed = __lsx_vpickev_h(in1, in0); + forbidden_bytemask = __lsx_vor_v( + __lsx_vand_v( + __lsx_vsle_h(utf16_packed, v_dfff), // utf16_packed <= 0xdfff + __lsx_vsle_h(v_d800, utf16_packed)), // utf16_packed >= 0xd800 + forbidden_bytemask); -simdutf_warn_unused bool -implementation::validate_utf32(const char16_t *buf, size_t len) const noexcept { - return scalar::utf32::validate(buf, len); -} + if (!match_system(big_endian)) { + utf16_packed = lsx_swap_bytes(utf16_packed); + } + __lsx_vst(utf16_packed, utf16_output, 0); + utf16_output += 8; + buf += 8; + } else { + size_t forward = 3; + size_t k = 0; + if (size_t(end - buf) < forward + 1) { + forward = size_t(end - buf - 1); + } + for (; k < forward; k++) { + uint32_t word = buf[k]; + if ((word & 0xFFFF0000) == 0) { + // will not generate a surrogate pair + if (word >= 0xD800 && word <= 0xDFFF) { + return std::make_pair(nullptr, + reinterpret_cast(utf16_output)); + } + *utf16_output++ = !match_system(big_endian) + ? char16_t(word >> 8 | word << 8) + : char16_t(word); + } else { + // will generate a surrogate pair + if (word > 0x10FFFF) { + return std::make_pair(nullptr, + reinterpret_cast(utf16_output)); + } + word -= 0x10000; + uint16_t high_surrogate = uint16_t(0xD800 + (word >> 10)); + uint16_t low_surrogate = uint16_t(0xDC00 + (word & 0x3FF)); + if (!match_system(big_endian)) { + high_surrogate = + uint16_t(high_surrogate >> 8 | high_surrogate << 8); + low_surrogate = uint16_t(low_surrogate << 8 | low_surrogate >> 8); + } + *utf16_output++ = char16_t(high_surrogate); + *utf16_output++ = char16_t(low_surrogate); + } + } + buf += k; + } + } -simdutf_warn_unused size_t implementation::convert_utf8_to_utf16le( - const char * /*buf*/, size_t /*len*/, - char16_t * /*utf16_output*/) const noexcept { - return 0; // stub + // check for invalid input + if (__lsx_bnz_v(forbidden_bytemask)) { + return std::make_pair(nullptr, reinterpret_cast(utf16_output)); + } + return std::make_pair(buf, reinterpret_cast(utf16_output)); } -simdutf_warn_unused size_t implementation::convert_utf8_to_utf16be( - const char * /*buf*/, size_t /*len*/, - char16_t * /*utf16_output*/) const noexcept { - return 0; // stub -} +template +std::pair +lsx_convert_utf32_to_utf16_with_errors(const char32_t *buf, size_t len, + char16_t *utf16_out) { + uint16_t *utf16_output = reinterpret_cast(utf16_out); + const char32_t *start = buf; + const char32_t *end = buf + len; -simdutf_warn_unused result implementation::convert_utf8_to_utf16le_with_errors( - const char * /*buf*/, size_t /*len*/, - char16_t * /*utf16_output*/) const noexcept { - return result(error_code::OTHER, 0); // stub -} + __m128i forbidden_bytemask = __lsx_vrepli_h(0); + __m128i v_d800 = __lsx_vldi(-2600); /*0xD800*/ + __m128i v_dfff = __lsx_vreplgr2vr_h(uint16_t(0xdfff)); -simdutf_warn_unused result implementation::convert_utf8_to_utf16be_with_errors( - const char * /*buf*/, size_t /*len*/, - char16_t * /*utf16_output*/) const noexcept { - return result(error_code::OTHER, 0); // stub -} + while (buf + 8 <= end) { + __m128i in0 = __lsx_vld(reinterpret_cast(buf), 0); + __m128i in1 = __lsx_vld(reinterpret_cast(buf), 16); + // Check if no bits set above 16th + if (__lsx_bz_v(__lsx_vpickod_h(in1, in0))) { + __m128i utf16_packed = __lsx_vpickev_h(in1, in0); + + forbidden_bytemask = __lsx_vor_v( + __lsx_vand_v( + __lsx_vsle_h(utf16_packed, v_dfff), // utf16_packed <= 0xdfff + __lsx_vsle_h(v_d800, utf16_packed)), // utf16_packed >= 0xd800 + forbidden_bytemask); + if (__lsx_bnz_v(forbidden_bytemask)) { + return std::make_pair(result(error_code::SURROGATE, buf - start), + reinterpret_cast(utf16_output)); + } -simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf16le( - const char * /*buf*/, size_t /*len*/, - char16_t * /*utf16_output*/) const noexcept { - return 0; // stub -} + if (!match_system(big_endian)) { + utf16_packed = lsx_swap_bytes(utf16_packed); + } -simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf16be( - const char * /*buf*/, size_t /*len*/, - char16_t * /*utf16_output*/) const noexcept { - return 0; // stub -} + __lsx_vst(utf16_packed, utf16_output, 0); + utf16_output += 8; + buf += 8; + } else { + size_t forward = 3; + size_t k = 0; + if (size_t(end - buf) < forward + 1) { + forward = size_t(end - buf - 1); + } + for (; k < forward; k++) { + uint32_t word = buf[k]; + if ((word & 0xFFFF0000) == 0) { + // will not generate a surrogate pair + if (word >= 0xD800 && word <= 0xDFFF) { + return std::make_pair( + result(error_code::SURROGATE, buf - start + k), + reinterpret_cast(utf16_output)); + } + *utf16_output++ = !match_system(big_endian) + ? char16_t(word >> 8 | word << 8) + : char16_t(word); + } else { + // will generate a surrogate pair + if (word > 0x10FFFF) { + return std::make_pair( + result(error_code::TOO_LARGE, buf - start + k), + reinterpret_cast(utf16_output)); + } + word -= 0x10000; + uint16_t high_surrogate = uint16_t(0xD800 + (word >> 10)); + uint16_t low_surrogate = uint16_t(0xDC00 + (word & 0x3FF)); + if (!match_system(big_endian)) { + high_surrogate = + uint16_t(high_surrogate >> 8 | high_surrogate << 8); + low_surrogate = uint16_t(low_surrogate << 8 | low_surrogate >> 8); + } + *utf16_output++ = char16_t(high_surrogate); + *utf16_output++ = char16_t(low_surrogate); + } + } + buf += k; + } + } -simdutf_warn_unused size_t implementation::convert_utf8_to_utf32( - const char * /*buf*/, size_t /*len*/, - char32_t * /*utf16_output*/) const noexcept { - return 0; // stub + return std::make_pair(result(error_code::SUCCESS, buf - start), + reinterpret_cast(utf16_output)); } +/* end file src/lsx/lsx_convert_utf32_to_utf16.cpp */ +/* begin file src/lsx/lsx_base64.cpp */ +/** + * References and further reading: + * + * Wojciech Muła, Daniel Lemire, Base64 encoding and decoding at almost the + * speed of a memory copy, Software: Practice and Experience 50 (2), 2020. + * https://arxiv.org/abs/1910.05109 + * + * Wojciech Muła, Daniel Lemire, Faster Base64 Encoding and Decoding using AVX2 + * Instructions, ACM Transactions on the Web 12 (3), 2018. + * https://arxiv.org/abs/1704.00605 + * + * Simon Josefsson. 2006. The Base16, Base32, and Base64 Data Encodings. + * https://tools.ietf.org/html/rfc4648. (2006). Internet Engineering Task Force, + * Request for Comments: 4648. + * + * Alfred Klomp. 2014a. Fast Base64 encoding/decoding with SSE vectorization. + * http://www.alfredklomp.com/programming/sse-base64/. (2014). + * + * Alfred Klomp. 2014b. Fast Base64 stream encoder/decoder in C99, with SIMD + * acceleration. https://github.com/aklomp/base64. (2014). + * + * Hanson Char. 2014. A Fast and Correct Base 64 Codec. (2014). + * https://aws.amazon.com/blogs/developer/a-fast-and-correct-base-64-codec/ + * + * Nick Kopp. 2013. Base64 Encoding on a GPU. + * https://www.codeproject.com/Articles/276993/Base-Encoding-on-a-GPU. (2013). + */ -simdutf_warn_unused result implementation::convert_utf8_to_utf32_with_errors( - const char * /*buf*/, size_t /*len*/, - char32_t * /*utf16_output*/) const noexcept { - return result(error_code::OTHER, 0); // stub -} +template +size_t encode_base64(char *dst, const char *src, size_t srclen, + base64_options options) { + // credit: Wojciech Muła + // SSE (lookup: pshufb improved unrolled) + const uint8_t *input = (const uint8_t *)src; + static const char *lookup_tbl = + isbase64url + ? "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_" + : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + uint8_t *out = (uint8_t *)dst; -simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf32( - const char * /*buf*/, size_t /*len*/, - char32_t * /*utf16_output*/) const noexcept { - return 0; // stub -} + v16u8 shuf; + __m128i v_fc0fc00, v_3f03f0, shift_r, shift_l, base64_tbl0, base64_tbl1, + base64_tbl2, base64_tbl3; + if (srclen >= 16) { + shuf = v16u8{1, 0, 2, 1, 4, 3, 5, 4, 7, 6, 8, 7, 10, 9, 11, 10}; + v_fc0fc00 = __lsx_vreplgr2vr_w(uint32_t(0x0fc0fc00)); + v_3f03f0 = __lsx_vreplgr2vr_w(uint32_t(0x003f03f0)); + shift_r = __lsx_vreplgr2vr_w(uint32_t(0x0006000a)); + shift_l = __lsx_vreplgr2vr_w(uint32_t(0x00080004)); + base64_tbl0 = __lsx_vld(lookup_tbl, 0); + base64_tbl1 = __lsx_vld(lookup_tbl, 16); + base64_tbl2 = __lsx_vld(lookup_tbl, 32); + base64_tbl3 = __lsx_vld(lookup_tbl, 48); + } -simdutf_warn_unused size_t implementation::convert_utf16le_to_utf8( - const char16_t *buf, size_t len, char *utf8_output) const noexcept { - return scalar::utf16_to_utf8::convert(buf, len, - utf8_output); -} + size_t i = 0; + for (; i + 52 <= srclen; i += 48) { + __m128i in0 = + __lsx_vld(reinterpret_cast(input + i), 4 * 3 * 0); + __m128i in1 = + __lsx_vld(reinterpret_cast(input + i), 4 * 3 * 1); + __m128i in2 = + __lsx_vld(reinterpret_cast(input + i), 4 * 3 * 2); + __m128i in3 = + __lsx_vld(reinterpret_cast(input + i), 4 * 3 * 3); + + in0 = __lsx_vshuf_b(in0, in0, (__m128i)shuf); + in1 = __lsx_vshuf_b(in1, in1, (__m128i)shuf); + in2 = __lsx_vshuf_b(in2, in2, (__m128i)shuf); + in3 = __lsx_vshuf_b(in3, in3, (__m128i)shuf); + + __m128i t0_0 = __lsx_vand_v(in0, v_fc0fc00); + __m128i t0_1 = __lsx_vand_v(in1, v_fc0fc00); + __m128i t0_2 = __lsx_vand_v(in2, v_fc0fc00); + __m128i t0_3 = __lsx_vand_v(in3, v_fc0fc00); + + __m128i t1_0 = __lsx_vsrl_h(t0_0, shift_r); + __m128i t1_1 = __lsx_vsrl_h(t0_1, shift_r); + __m128i t1_2 = __lsx_vsrl_h(t0_2, shift_r); + __m128i t1_3 = __lsx_vsrl_h(t0_3, shift_r); + + __m128i t2_0 = __lsx_vand_v(in0, v_3f03f0); + __m128i t2_1 = __lsx_vand_v(in1, v_3f03f0); + __m128i t2_2 = __lsx_vand_v(in2, v_3f03f0); + __m128i t2_3 = __lsx_vand_v(in3, v_3f03f0); + + __m128i t3_0 = __lsx_vsll_h(t2_0, shift_l); + __m128i t3_1 = __lsx_vsll_h(t2_1, shift_l); + __m128i t3_2 = __lsx_vsll_h(t2_2, shift_l); + __m128i t3_3 = __lsx_vsll_h(t2_3, shift_l); + + __m128i input0 = __lsx_vor_v(t1_0, t3_0); + __m128i input0_shuf0 = __lsx_vshuf_b(base64_tbl1, base64_tbl0, input0); + __m128i input0_shuf1 = __lsx_vshuf_b(base64_tbl3, base64_tbl2, + __lsx_vsub_b(input0, __lsx_vldi(32))); + __m128i input0_mask = __lsx_vslei_bu(input0, 31); + __m128i input0_result = + __lsx_vbitsel_v(input0_shuf1, input0_shuf0, input0_mask); + __lsx_vst(input0_result, reinterpret_cast<__m128i *>(out), 0); + out += 16; -simdutf_warn_unused size_t implementation::convert_utf16be_to_utf8( - const char16_t *buf, size_t len, char *utf8_output) const noexcept { - return scalar::utf16_to_utf8::convert(buf, len, utf8_output); -} + __m128i input1 = __lsx_vor_v(t1_1, t3_1); + __m128i input1_shuf0 = __lsx_vshuf_b(base64_tbl1, base64_tbl0, input1); + __m128i input1_shuf1 = __lsx_vshuf_b(base64_tbl3, base64_tbl2, + __lsx_vsub_b(input1, __lsx_vldi(32))); + __m128i input1_mask = __lsx_vslei_bu(input1, 31); + __m128i input1_result = + __lsx_vbitsel_v(input1_shuf1, input1_shuf0, input1_mask); + __lsx_vst(input1_result, reinterpret_cast<__m128i *>(out), 0); + out += 16; -simdutf_warn_unused result implementation::convert_utf16le_to_utf8_with_errors( - const char16_t *buf, size_t len, char *utf8_output) const noexcept { - return scalar::utf16_to_utf8::convert_with_errors( - buf, len, utf8_output); -} + __m128i input2 = __lsx_vor_v(t1_2, t3_2); + __m128i input2_shuf0 = __lsx_vshuf_b(base64_tbl1, base64_tbl0, input2); + __m128i input2_shuf1 = __lsx_vshuf_b(base64_tbl3, base64_tbl2, + __lsx_vsub_b(input2, __lsx_vldi(32))); + __m128i input2_mask = __lsx_vslei_bu(input2, 31); + __m128i input2_result = + __lsx_vbitsel_v(input2_shuf1, input2_shuf0, input2_mask); + __lsx_vst(input2_result, reinterpret_cast<__m128i *>(out), 0); + out += 16; -simdutf_warn_unused result implementation::convert_utf16be_to_utf8_with_errors( - const char16_t *buf, size_t len, char *utf8_output) const noexcept { - return scalar::utf16_to_utf8::convert_with_errors( - buf, len, utf8_output); -} + __m128i input3 = __lsx_vor_v(t1_3, t3_3); + __m128i input3_shuf0 = __lsx_vshuf_b(base64_tbl1, base64_tbl0, input3); + __m128i input3_shuf1 = __lsx_vshuf_b(base64_tbl3, base64_tbl2, + __lsx_vsub_b(input3, __lsx_vldi(32))); + __m128i input3_mask = __lsx_vslei_bu(input3, 31); + __m128i input3_result = + __lsx_vbitsel_v(input3_shuf1, input3_shuf0, input3_mask); + __lsx_vst(input3_result, reinterpret_cast<__m128i *>(out), 0); + out += 16; + } + for (; i + 16 <= srclen; i += 12) { -simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_utf8( - const char16_t *buf, size_t len, char *utf8_output) const noexcept { - return scalar::utf16_to_utf8::convert_valid(buf, len, - utf8_output); -} + __m128i in = __lsx_vld(reinterpret_cast(input + i), 0); + + // bytes from groups A, B and C are needed in separate 32-bit lanes + // in = [DDDD|CCCC|BBBB|AAAA] + // + // an input triplet has layout + // [????????|ccdddddd|bbbbcccc|aaaaaabb] + // byte 3 byte 2 byte 1 byte 0 -- byte 3 comes from the next + // triplet + // + // shuffling changes the order of bytes: 1, 0, 2, 1 + // [bbbbcccc|ccdddddd|aaaaaabb|bbbbcccc] + // ^^^^ ^^^^^^^^ ^^^^^^^^ ^^^^ + // processed bits + in = __lsx_vshuf_b(in, in, (__m128i)shuf); -simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_utf8( - const char16_t *buf, size_t len, char *utf8_output) const noexcept { - return scalar::utf16_to_utf8::convert_valid(buf, len, - utf8_output); -} + // unpacking + // t0 = [0000cccc|cc000000|aaaaaa00|00000000] + __m128i t0 = __lsx_vand_v(in, v_fc0fc00); + // t1 = [00000000|00cccccc|00000000|00aaaaaa] + // ((c >> 6), (a >> 10)) + __m128i t1 = __lsx_vsrl_h(t0, shift_r); -simdutf_warn_unused size_t implementation::convert_utf32_to_utf8( - const char32_t *buf, size_t len, char *utf8_output) const noexcept { - return scalar::utf32_to_utf8::convert(buf, len, utf8_output); -} + // t2 = [00000000|00dddddd|000000bb|bbbb0000] + __m128i t2 = __lsx_vand_v(in, v_3f03f0); + // t3 = [00dddddd|00000000|00bbbbbb|00000000] + // ((d << 8), (b << 4)) + __m128i t3 = __lsx_vsll_h(t2, shift_l); -simdutf_warn_unused result implementation::convert_utf32_to_utf8_with_errors( - const char32_t *buf, size_t len, char *utf8_output) const noexcept { - return scalar::utf32_to_utf8::convert_with_errors(buf, len, utf8_output); -} + // res = [00dddddd|00cccccc|00bbbbbb|00aaaaaa] = t1 | t3 + __m128i indices = __lsx_vor_v(t1, t3); -simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf8( - const char32_t *buf, size_t len, char *utf8_output) const noexcept { - return scalar::utf32_to_utf8::convert_valid(buf, len, utf8_output); -} + __m128i indices_shuf0 = __lsx_vshuf_b(base64_tbl1, base64_tbl0, indices); + __m128i indices_shuf1 = __lsx_vshuf_b( + base64_tbl3, base64_tbl2, __lsx_vsub_b(indices, __lsx_vldi(32))); + __m128i indices_mask = __lsx_vslei_bu(indices, 31); + __m128i indices_result = + __lsx_vbitsel_v(indices_shuf1, indices_shuf0, indices_mask); -simdutf_warn_unused size_t implementation::convert_utf32_to_utf16le( - const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { - return scalar::utf32_to_utf16::convert(buf, len, - utf16_output); -} + __lsx_vst(indices_result, reinterpret_cast<__m128i *>(out), 0); + out += 16; + } -simdutf_warn_unused size_t implementation::convert_utf32_to_utf16be( - const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { - return scalar::utf32_to_utf16::convert(buf, len, - utf16_output); + return i / 3 * 4 + scalar::base64::tail_encode_base64((char *)out, src + i, + srclen - i, options); } -simdutf_warn_unused result implementation::convert_utf32_to_utf16le_with_errors( - const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { - return scalar::utf32_to_utf16::convert_with_errors( - buf, len, utf16_output); -} +static inline void compress(__m128i data, uint16_t mask, char *output) { + if (mask == 0) { + __lsx_vst(data, reinterpret_cast<__m128i *>(output), 0); + return; + } + // this particular implementation was inspired by work done by @animetosho + // we do it in two steps, first 8 bytes and then second 8 bytes + uint8_t mask1 = uint8_t(mask); // least significant 8 bits + uint8_t mask2 = uint8_t(mask >> 8); // most significant 8 bits + // next line just loads the 64-bit values thintable_epi8[mask1] and + // thintable_epi8[mask2] into a 128-bit register, using only + // two instructions on most compilers. -simdutf_warn_unused result implementation::convert_utf32_to_utf16be_with_errors( - const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { - return scalar::utf32_to_utf16::convert_with_errors( - buf, len, utf16_output); -} + v2u64 shufmask = {tables::base64::thintable_epi8[mask1], + tables::base64::thintable_epi8[mask2]}; -simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf16le( - const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { - return scalar::utf32_to_utf16::convert_valid( - buf, len, utf16_output); -} + // we increment by 0x08 the second half of the mask + v4u32 hi = {0, 0, 0x08080808, 0x08080808}; + __m128i shufmask1 = __lsx_vadd_b((__m128i)shufmask, (__m128i)hi); -simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf16be( - const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { - return scalar::utf32_to_utf16::convert_valid(buf, len, - utf16_output); -} + // this is the version "nearly pruned" + __m128i pruned = __lsx_vshuf_b(data, data, shufmask1); + // we still need to put the two halves together. + // we compute the popcount of the first half: + int pop1 = tables::base64::BitsSetTable256mul2[mask1]; + // then load the corresponding mask, what it does is to write + // only the first pop1 bytes from the first 8 bytes, and then + // it fills in with the bytes from the second 8 bytes + some filling + // at the end. + __m128i compactmask = + __lsx_vld(reinterpret_cast( + tables::base64::pshufb_combine_table + pop1 * 8), + 0); + __m128i answer = __lsx_vshuf_b(pruned, pruned, compactmask); -simdutf_warn_unused size_t implementation::convert_utf16le_to_utf32( - const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { - return scalar::utf16_to_utf32::convert(buf, len, - utf32_output); + __lsx_vst(answer, reinterpret_cast<__m128i *>(output), 0); } -simdutf_warn_unused size_t implementation::convert_utf16be_to_utf32( - const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { - return scalar::utf16_to_utf32::convert(buf, len, - utf32_output); -} +struct block64 { + __m128i chunks[4]; +}; -simdutf_warn_unused result implementation::convert_utf16le_to_utf32_with_errors( - const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { - return scalar::utf16_to_utf32::convert_with_errors( - buf, len, utf32_output); -} +template +static inline uint16_t to_base64_mask(__m128i *src, bool *error) { + const v16u8 ascii_space_tbl = {0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xa, 0x0, 0xc, 0xd, 0x0, 0x0}; + // credit: aqrit + /* + '0'(0x30)-'9'(0x39) => delta_values_index = 4 + 'A'(0x41)-'Z'(0x5a) => delta_values_index = 4/5/12(4+8) + 'a'(0x61)-'z'(0x7a) => delta_values_index = 6/7/14(6+8) + '+'(0x2b) => delta_values_index = 3 + '/'(0x2f) => delta_values_index = 2+8 = 10 + '-'(0x2d) => delta_values_index = 2+8 = 10 + '_'(0x5f) => delta_values_index = 5+8 = 13 + */ + v16u8 delta_asso = {0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xF, 0x0, 0xF}; + v16i8 delta_values; + if (base64_url) { + delta_values = + v16i8{int8_t(0x00), int8_t(0x00), int8_t(0x00), int8_t(0x13), + int8_t(0x04), int8_t(0xBF), int8_t(0xBF), int8_t(0xB9), + int8_t(0xB9), int8_t(0x00), int8_t(0x11), int8_t(0xC3), + int8_t(0xBF), int8_t(0xE0), int8_t(0xB9), int8_t(0xB9)}; + } else { + delta_values = + v16i8{int8_t(0x00), int8_t(0x00), int8_t(0x00), int8_t(0x13), + int8_t(0x04), int8_t(0xBF), int8_t(0xBF), int8_t(0xB9), + int8_t(0xB9), int8_t(0x00), int8_t(0x10), int8_t(0xC3), + int8_t(0xBF), int8_t(0xBF), int8_t(0xB9), int8_t(0xB9)}; + } -simdutf_warn_unused result implementation::convert_utf16be_to_utf32_with_errors( - const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { - return scalar::utf16_to_utf32::convert_with_errors( - buf, len, utf32_output); -} + v16u8 check_asso; + if (base64_url) { + check_asso = v16u8{0x0D, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x03, 0x07, 0x0B, 0x06, 0x0B, 0x12}; + } else { + check_asso = v16u8{0x0D, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x03, 0x07, 0x0B, 0x0B, 0x0B, 0x0F}; + } -simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_utf32( - const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { - return scalar::utf16_to_utf32::convert_valid( - buf, len, utf32_output); -} + v16i8 check_values; + if (base64_url) { + check_values = v16i8{int8_t(0x0), int8_t(0x80), int8_t(0x80), int8_t(0x80), + int8_t(0xCF), int8_t(0xBF), int8_t(0xD3), int8_t(0xA6), + int8_t(0xB5), int8_t(0x86), int8_t(0xD0), int8_t(0x80), + int8_t(0xB0), int8_t(0x80), int8_t(0x0), int8_t(0x0)}; + } else { + check_values = + v16i8{int8_t(0x80), int8_t(0x80), int8_t(0x80), int8_t(0x80), + int8_t(0xCF), int8_t(0xBF), int8_t(0xD5), int8_t(0xA6), + int8_t(0xB5), int8_t(0x86), int8_t(0xD1), int8_t(0x80), + int8_t(0xB1), int8_t(0x80), int8_t(0x91), int8_t(0x80)}; + } -simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_utf32( - const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { - return scalar::utf16_to_utf32::convert_valid(buf, len, - utf32_output); -} + const __m128i shifted = __lsx_vsrli_b(*src, 3); + __m128i asso_index = __lsx_vand_v(*src, __lsx_vldi(0xF)); + const __m128i delta_hash = + __lsx_vavgr_bu(__lsx_vshuf_b((__m128i)delta_asso, (__m128i)delta_asso, + (__m128i)asso_index), + shifted); + const __m128i check_hash = + __lsx_vavgr_bu(__lsx_vshuf_b((__m128i)check_asso, (__m128i)check_asso, + (__m128i)asso_index), + shifted); -void implementation::change_endianness_utf16(const char16_t *input, - size_t length, - char16_t *output) const noexcept { - scalar::utf16::change_endianness_utf16(input, length, output); -} + const __m128i out = + __lsx_vsadd_b(__lsx_vshuf_b((__m128i)delta_values, (__m128i)delta_values, + (__m128i)delta_hash), + *src); + const __m128i chk = + __lsx_vsadd_b(__lsx_vshuf_b((__m128i)check_values, (__m128i)check_values, + (__m128i)check_hash), + *src); + unsigned int mask = __lsx_vpickve2gr_hu(__lsx_vmskltz_b(chk), 0); + if (mask) { + __m128i ascii_space = __lsx_vseq_b(__lsx_vshuf_b((__m128i)ascii_space_tbl, + (__m128i)ascii_space_tbl, + (__m128i)asso_index), + *src); + *error |= + (mask != __lsx_vpickve2gr_hu(__lsx_vmskltz_b((__m128i)ascii_space), 0)); + } -simdutf_warn_unused size_t implementation::count_utf16le( - const char16_t *input, size_t length) const noexcept { - return scalar::utf16::count_code_points(input, length); + *src = out; + return (uint16_t)mask; } -simdutf_warn_unused size_t implementation::count_utf16be( - const char16_t *input, size_t length) const noexcept { - return scalar::utf16::count_code_points(input, length); +template +static inline uint64_t to_base64_mask(block64 *b, bool *error) { + *error = 0; + uint64_t m0 = to_base64_mask(&b->chunks[0], error); + uint64_t m1 = to_base64_mask(&b->chunks[1], error); + uint64_t m2 = to_base64_mask(&b->chunks[2], error); + uint64_t m3 = to_base64_mask(&b->chunks[3], error); + return m0 | (m1 << 16) | (m2 << 32) | (m3 << 48); } -simdutf_warn_unused size_t -implementation::count_utf8(const char *input, size_t length) const noexcept { - return utf8::count_code_points(input, length); +static inline void copy_block(block64 *b, char *output) { + __lsx_vst(b->chunks[0], reinterpret_cast<__m128i *>(output), 0); + __lsx_vst(b->chunks[1], reinterpret_cast<__m128i *>(output), 16); + __lsx_vst(b->chunks[2], reinterpret_cast<__m128i *>(output), 32); + __lsx_vst(b->chunks[3], reinterpret_cast<__m128i *>(output), 48); } -simdutf_warn_unused size_t implementation::utf8_length_from_utf16le( - const char16_t *input, size_t length) const noexcept { - return scalar::utf16::utf8_length_from_utf16(input, - length); +static inline uint64_t compress_block(block64 *b, uint64_t mask, char *output) { + uint64_t nmask = ~mask; + uint64_t count = + __lsx_vpickve2gr_d(__lsx_vpcnt_h(__lsx_vreplgr2vr_d(nmask)), 0); + uint16_t *count_ptr = (uint16_t *)&count; + compress(b->chunks[0], uint16_t(mask), output); + compress(b->chunks[1], uint16_t(mask >> 16), output + count_ptr[0]); + compress(b->chunks[2], uint16_t(mask >> 32), + output + count_ptr[0] + count_ptr[1]); + compress(b->chunks[3], uint16_t(mask >> 48), + output + count_ptr[0] + count_ptr[1] + count_ptr[2]); + return count_ones(nmask); } -simdutf_warn_unused size_t implementation::utf8_length_from_utf16be( - const char16_t *input, size_t length) const noexcept { - return scalar::utf16::utf8_length_from_utf16(input, length); +// The caller of this function is responsible to ensure that there are 64 bytes +// available from reading at src. The data is read into a block64 structure. +static inline void load_block(block64 *b, const char *src) { + b->chunks[0] = __lsx_vld(reinterpret_cast(src), 0); + b->chunks[1] = __lsx_vld(reinterpret_cast(src), 16); + b->chunks[2] = __lsx_vld(reinterpret_cast(src), 32); + b->chunks[3] = __lsx_vld(reinterpret_cast(src), 48); } -simdutf_warn_unused size_t implementation::utf32_length_from_utf16le( - const char16_t *input, size_t length) const noexcept { - return scalar::utf16::utf32_length_from_utf16(input, - length); +// The caller of this function is responsible to ensure that there are 128 bytes +// available from reading at src. The data is read into a block64 structure. +static inline void load_block(block64 *b, const char16_t *src) { + __m128i m1 = __lsx_vld(reinterpret_cast(src), 0); + __m128i m2 = __lsx_vld(reinterpret_cast(src), 16); + __m128i m3 = __lsx_vld(reinterpret_cast(src), 32); + __m128i m4 = __lsx_vld(reinterpret_cast(src), 48); + __m128i m5 = __lsx_vld(reinterpret_cast(src), 64); + __m128i m6 = __lsx_vld(reinterpret_cast(src), 80); + __m128i m7 = __lsx_vld(reinterpret_cast(src), 96); + __m128i m8 = __lsx_vld(reinterpret_cast(src), 112); + b->chunks[0] = __lsx_vssrlni_bu_h(m2, m1, 0); + b->chunks[1] = __lsx_vssrlni_bu_h(m4, m3, 0); + b->chunks[2] = __lsx_vssrlni_bu_h(m6, m5, 0); + b->chunks[3] = __lsx_vssrlni_bu_h(m8, m7, 0); } -simdutf_warn_unused size_t implementation::utf32_length_from_utf16be( - const char16_t *input, size_t length) const noexcept { - return scalar::utf16::utf32_length_from_utf16(input, length); -} +static inline void base64_decode(char *out, __m128i str) { + __m128i t0 = __lsx_vor_v( + __lsx_vslli_w(str, 26), + __lsx_vslli_w(__lsx_vand_v(str, __lsx_vldi(-1758 /*0x0000FF00*/)), 12)); + __m128i t1 = + __lsx_vsrli_w(__lsx_vand_v(str, __lsx_vldi(-3521 /*0x003F0000*/)), 2); + __m128i t2 = __lsx_vor_v(t0, t1); + __m128i t3 = __lsx_vor_v(t2, __lsx_vsrli_w(str, 16)); + const v16u8 pack_shuffle = {3, 2, 1, 7, 6, 5, 11, 10, + 9, 15, 14, 13, 0, 0, 0, 0}; + t3 = __lsx_vshuf_b(t3, t3, (__m128i)pack_shuffle); -simdutf_warn_unused size_t implementation::utf16_length_from_utf8( - const char *input, size_t length) const noexcept { - return scalar::utf8::utf16_length_from_utf8(input, length); + // Store the output: + // we only need 12. + __lsx_vstelm_d(t3, out, 0, 0); + __lsx_vstelm_w(t3, out + 8, 0, 2); } - -simdutf_warn_unused size_t implementation::utf8_length_from_utf32( - const char32_t *input, size_t length) const noexcept { - return scalar::utf32::utf8_length_from_utf32(input, length); +// decode 64 bytes and output 48 bytes +static inline void base64_decode_block(char *out, const char *src) { + base64_decode(out, __lsx_vld(reinterpret_cast(src), 0)); + base64_decode(out + 12, + __lsx_vld(reinterpret_cast(src), 16)); + base64_decode(out + 24, + __lsx_vld(reinterpret_cast(src), 32)); + base64_decode(out + 36, + __lsx_vld(reinterpret_cast(src), 48)); } - -simdutf_warn_unused size_t implementation::utf16_length_from_utf32( - const char32_t *input, size_t length) const noexcept { - return scalar::utf32::utf16_length_from_utf32(input, length); +static inline void base64_decode_block_safe(char *out, const char *src) { + base64_decode_block(out, src); } - -simdutf_warn_unused size_t implementation::utf32_length_from_utf8( - const char *input, size_t length) const noexcept { - return scalar::utf8::count_code_points(input, length); +static inline void base64_decode_block(char *out, block64 *b) { + base64_decode(out, b->chunks[0]); + base64_decode(out + 12, b->chunks[1]); + base64_decode(out + 24, b->chunks[2]); + base64_decode(out + 36, b->chunks[3]); } - -simdutf_warn_unused size_t implementation::maximal_binary_length_from_base64( - const char *input, size_t length) const noexcept { - return scalar::base64::maximal_binary_length_from_base64(input, length); +static inline void base64_decode_block_safe(char *out, block64 *b) { + base64_decode_block(out, b); } -simdutf_warn_unused result implementation::base64_to_binary( - const char *input, size_t length, char *output, base64_options options, - last_chunk_handling_options last_chunk_options) const noexcept { +template +full_result +compress_decode_base64(char *dst, const char_type *src, size_t srclen, + base64_options options, + last_chunk_handling_options last_chunk_options) { + const uint8_t *to_base64 = base64_url ? tables::base64::to_base64_url_value + : tables::base64::to_base64_value; + size_t equallocation = + srclen; // location of the first padding character if any // skip trailing spaces - while (length > 0 && - scalar::base64::is_ascii_white_space(input[length - 1])) { - length--; + while (srclen > 0 && scalar::base64::is_eight_byte(src[srclen - 1]) && + to_base64[uint8_t(src[srclen - 1])] == 64) { + srclen--; } - size_t equallocation = - length; // location of the first padding character if any size_t equalsigns = 0; - if (length > 0 && input[length - 1] == '=') { - equallocation = length - 1; - length -= 1; - equalsigns++; - while (length > 0 && - scalar::base64::is_ascii_white_space(input[length - 1])) { - length--; + if (srclen > 0 && src[srclen - 1] == '=') { + equallocation = srclen - 1; + srclen--; + equalsigns = 1; + // skip trailing spaces + while (srclen > 0 && scalar::base64::is_eight_byte(src[srclen - 1]) && + to_base64[uint8_t(src[srclen - 1])] == 64) { + srclen--; } - if (length > 0 && input[length - 1] == '=') { - equallocation = length - 1; - equalsigns++; - length -= 1; + if (srclen > 0 && src[srclen - 1] == '=') { + equallocation = srclen - 1; + srclen--; + equalsigns = 2; } } - if (length == 0) { - if (equalsigns > 0) { - return {INVALID_BASE64_CHARACTER, equallocation}; + if (srclen == 0) { + if (!ignore_garbage && equalsigns > 0) { + return {INVALID_BASE64_CHARACTER, equallocation, 0}; } - return {SUCCESS, 0}; + return {SUCCESS, 0, 0}; } - result r = scalar::base64::base64_tail_decode( - output, input, length, equalsigns, options, last_chunk_options); - if (last_chunk_options != stop_before_partial && - r.error == error_code::SUCCESS && equalsigns > 0) { - // additional checks - if ((r.count % 3 == 0) || ((r.count % 3) + 1 + equalsigns != 4)) { - return {INVALID_BASE64_CHARACTER, equallocation}; + const char_type *const srcinit = src; + const char *const dstinit = dst; + const char_type *const srcend = src + srclen; + + constexpr size_t block_size = 10; + char buffer[block_size * 64]; + char *bufferptr = buffer; + if (srclen >= 64) { + const char_type *const srcend64 = src + srclen - 64; + while (src <= srcend64) { + block64 b; + load_block(&b, src); + src += 64; + bool error = false; + uint64_t badcharmask = to_base64_mask(&b, &error); + if (badcharmask) { + if (error && !ignore_garbage) { + src -= 64; + while (src < srcend && scalar::base64::is_eight_byte(*src) && + to_base64[uint8_t(*src)] <= 64) { + src++; + } + if (src < srcend) { + // should never happen + } + return {error_code::INVALID_BASE64_CHARACTER, size_t(src - srcinit), + size_t(dst - dstinit)}; + } + } + + if (badcharmask != 0) { + // optimization opportunity: check for simple masks like those made of + // continuous 1s followed by continuous 0s. And masks containing a + // single bad character. + bufferptr += compress_block(&b, badcharmask, bufferptr); + } else { + // optimization opportunity: if bufferptr == buffer and mask == 0, we + // can avoid the call to compress_block and decode directly. + copy_block(&b, bufferptr); + bufferptr += 64; + } + if (bufferptr >= (block_size - 1) * 64 + buffer) { + for (size_t i = 0; i < (block_size - 1); i++) { + base64_decode_block(dst, buffer + i * 64); + dst += 48; + } + std::memcpy(buffer, buffer + (block_size - 1) * 64, + 64); // 64 might be too much + bufferptr -= (block_size - 1) * 64; + } + } + } + char *buffer_start = buffer; + // Optimization note: if this is almost full, then it is worth our + // time, otherwise, we should just decode directly. + int last_block = (int)((bufferptr - buffer_start) % 64); + if (last_block != 0 && srcend - src + last_block >= 64) { + while ((bufferptr - buffer_start) % 64 != 0 && src < srcend) { + uint8_t val = to_base64[uint8_t(*src)]; + *bufferptr = char(val); + if ((!scalar::base64::is_eight_byte(*src) || val > 64) && + !ignore_garbage) { + return {error_code::INVALID_BASE64_CHARACTER, size_t(src - srcinit), + size_t(dst - dstinit)}; + } + bufferptr += (val <= 63); + src++; } } - return r; -} - -simdutf_warn_unused size_t implementation::maximal_binary_length_from_base64( - const char16_t *input, size_t length) const noexcept { - return scalar::base64::maximal_binary_length_from_base64(input, length); -} -simdutf_warn_unused result implementation::base64_to_binary( - const char16_t *input, size_t length, char *output, base64_options options, - last_chunk_handling_options last_chunk_options) const noexcept { - // skip trailing spaces - while (length > 0 && - scalar::base64::is_ascii_white_space(input[length - 1])) { - length--; + for (; buffer_start + 64 <= bufferptr; buffer_start += 64) { + base64_decode_block(dst, buffer_start); + dst += 48; } - size_t equallocation = - length; // location of the first padding character if any - size_t equalsigns = 0; - if (length > 0 && input[length - 1] == '=') { - equallocation = length - 1; - length -= 1; - equalsigns++; - while (length > 0 && - scalar::base64::is_ascii_white_space(input[length - 1])) { - length--; + if ((bufferptr - buffer_start) % 64 != 0) { + while (buffer_start + 4 < bufferptr) { + uint32_t triple = ((uint32_t(uint8_t(buffer_start[0])) << 3 * 6) + + (uint32_t(uint8_t(buffer_start[1])) << 2 * 6) + + (uint32_t(uint8_t(buffer_start[2])) << 1 * 6) + + (uint32_t(uint8_t(buffer_start[3])) << 0 * 6)) + << 8; + triple = scalar::utf32::swap_bytes(triple); + std::memcpy(dst, &triple, 4); + + dst += 3; + buffer_start += 4; } - if (length > 0 && input[length - 1] == '=') { - equallocation = length - 1; - equalsigns++; - length -= 1; + if (buffer_start + 4 <= bufferptr) { + uint32_t triple = ((uint32_t(uint8_t(buffer_start[0])) << 3 * 6) + + (uint32_t(uint8_t(buffer_start[1])) << 2 * 6) + + (uint32_t(uint8_t(buffer_start[2])) << 1 * 6) + + (uint32_t(uint8_t(buffer_start[3])) << 0 * 6)) + << 8; + triple = scalar::utf32::swap_bytes(triple); + std::memcpy(dst, &triple, 3); + + dst += 3; + buffer_start += 4; + } + // we may have 1, 2 or 3 bytes left and we need to decode them so let us + // backtrack + int leftover = int(bufferptr - buffer_start); + while (leftover > 0) { + if (!ignore_garbage) { + while (to_base64[uint8_t(*(src - 1))] == 64) { + src--; + } + } else { + while (to_base64[uint8_t(*(src - 1))] >= 64) { + src--; + } + } + src--; + leftover--; } } - if (length == 0) { - if (equalsigns > 0) { - return {INVALID_BASE64_CHARACTER, equallocation}; + if (src < srcend + equalsigns) { + full_result r = scalar::base64::base64_tail_decode( + dst, src, srcend - src, equalsigns, options, last_chunk_options); + r.input_count += size_t(src - srcinit); + if (r.error == error_code::INVALID_BASE64_CHARACTER || + r.error == error_code::BASE64_EXTRA_BITS) { + return r; + } else { + r.output_count += size_t(dst - dstinit); } - return {SUCCESS, 0}; + if (last_chunk_options != stop_before_partial && + r.error == error_code::SUCCESS && equalsigns > 0 && !ignore_garbage) { + // additional checks + if ((r.output_count % 3 == 0) || + ((r.output_count % 3) + 1 + equalsigns != 4)) { + r.error = error_code::INVALID_BASE64_CHARACTER; + r.input_count = equallocation; + } + } + return r; } - result r = scalar::base64::base64_tail_decode( - output, input, length, equalsigns, options, last_chunk_options); - if (last_chunk_options != stop_before_partial && - r.error == error_code::SUCCESS && equalsigns > 0) { - // additional checks - if ((r.count % 3 == 0) || ((r.count % 3) + 1 + equalsigns != 4)) { - return {INVALID_BASE64_CHARACTER, equallocation}; + if (equalsigns > 0 && !ignore_garbage) { + if ((size_t(dst - dstinit) % 3 == 0) || + ((size_t(dst - dstinit) % 3) + 1 + equalsigns != 4)) { + return {INVALID_BASE64_CHARACTER, equallocation, size_t(dst - dstinit)}; } } - return r; + return {SUCCESS, srclen, size_t(dst - dstinit)}; } +/* end file src/lsx/lsx_base64.cpp */ -simdutf_warn_unused size_t implementation::base64_length_from_binary( - size_t length, base64_options options) const noexcept { - return scalar::base64::base64_length_from_binary(length, options); +} // namespace +} // namespace lsx +} // namespace simdutf + +/* begin file src/generic/buf_block_reader.h */ +namespace simdutf { +namespace lsx { +namespace { + +// Walks through a buffer in block-sized increments, loading the last part with +// spaces +template struct buf_block_reader { +public: + simdutf_really_inline buf_block_reader(const uint8_t *_buf, size_t _len); + simdutf_really_inline size_t block_index(); + simdutf_really_inline bool has_full_block() const; + simdutf_really_inline const uint8_t *full_block() const; + /** + * Get the last block, padded with spaces. + * + * There will always be a last block, with at least 1 byte, unless len == 0 + * (in which case this function fills the buffer with spaces and returns 0. In + * particular, if len == STEP_SIZE there will be 0 full_blocks and 1 remainder + * block with STEP_SIZE bytes and no spaces for padding. + * + * @return the number of effective characters in the last block. + */ + simdutf_really_inline size_t get_remainder(uint8_t *dst) const; + simdutf_really_inline void advance(); + +private: + const uint8_t *buf; + const size_t len; + const size_t lenminusstep; + size_t idx; +}; + +// Routines to print masks and text for debugging bitmask operations +simdutf_unused static char *format_input_text_64(const uint8_t *text) { + static char *buf = + reinterpret_cast(malloc(sizeof(simd8x64) + 1)); + for (size_t i = 0; i < sizeof(simd8x64); i++) { + buf[i] = int8_t(text[i]) < ' ' ? '_' : int8_t(text[i]); + } + buf[sizeof(simd8x64)] = '\0'; + return buf; } -size_t implementation::binary_to_base64(const char *input, size_t length, - char *output, - base64_options options) const noexcept { - return scalar::base64::binary_to_base64(input, length, output, options); +// Routines to print masks and text for debugging bitmask operations +simdutf_unused static char *format_input_text(const simd8x64 &in) { + static char *buf = + reinterpret_cast(malloc(sizeof(simd8x64) + 1)); + in.store(reinterpret_cast(buf)); + for (size_t i = 0; i < sizeof(simd8x64); i++) { + if (buf[i] < ' ') { + buf[i] = '_'; + } + } + buf[sizeof(simd8x64)] = '\0'; + return buf; } -} // namespace ppc64 -} // namespace simdutf -/* begin file src/simdutf/ppc64/end.h */ -/* end file src/simdutf/ppc64/end.h */ -/* end file src/ppc64/implementation.cpp */ -#endif -#if SIMDUTF_IMPLEMENTATION_RVV -/* begin file src/rvv/implementation.cpp */ +simdutf_unused static char *format_mask(uint64_t mask) { + static char *buf = reinterpret_cast(malloc(64 + 1)); + for (size_t i = 0; i < 64; i++) { + buf[i] = (mask & (size_t(1) << i)) ? 'X' : ' '; + } + buf[64] = '\0'; + return buf; +} +template +simdutf_really_inline +buf_block_reader::buf_block_reader(const uint8_t *_buf, size_t _len) + : buf{_buf}, len{_len}, lenminusstep{len < STEP_SIZE ? 0 : len - STEP_SIZE}, + idx{0} {} +template +simdutf_really_inline size_t buf_block_reader::block_index() { + return idx; +} +template +simdutf_really_inline bool buf_block_reader::has_full_block() const { + return idx < lenminusstep; +} +template +simdutf_really_inline const uint8_t * +buf_block_reader::full_block() const { + return &buf[idx]; +} -/* begin file src/simdutf/rvv/begin.h */ -// redefining SIMDUTF_IMPLEMENTATION to "rvv" -// #define SIMDUTF_IMPLEMENTATION rvv +template +simdutf_really_inline size_t +buf_block_reader::get_remainder(uint8_t *dst) const { + if (len == idx) { + return 0; + } // memcpy(dst, null, 0) will trigger an error with some sanitizers + std::memset(dst, 0x20, + STEP_SIZE); // std::memset STEP_SIZE because it is more efficient + // to write out 8 or 16 bytes at once. + std::memcpy(dst, buf + idx, len - idx); + return len - idx; +} -#if SIMDUTF_CAN_ALWAYS_RUN_RVV -// nothing needed. -#else -SIMDUTF_TARGET_RVV -#endif -/* end file src/simdutf/rvv/begin.h */ -namespace simdutf { -namespace rvv { -namespace { -#ifndef SIMDUTF_RVV_H - #error "rvv.h must be included" -#endif +template +simdutf_really_inline void buf_block_reader::advance() { + idx += STEP_SIZE; +} } // unnamed namespace -} // namespace rvv +} // namespace lsx } // namespace simdutf - -// -// Implementation-specific overrides -// +/* end file src/generic/buf_block_reader.h */ +/* begin file src/generic/utf8_validation/utf8_lookup4_algorithm.h */ namespace simdutf { -namespace rvv { -/* begin file src/rvv/rvv_helpers.inl.cpp */ -template -simdutf_really_inline static size_t -rvv_utf32_store_utf16_m4(uint16_t *dst, vuint32m4_t utf32, size_t vl, - vbool4_t m4even) { - /* convert [000000000000aaaa|aaaaaabbbbbbbbbb] - * to [110111bbbbbbbbbb|110110aaaaaaaaaa] */ - vuint32m4_t sur = __riscv_vsub_vx_u32m4(utf32, 0x10000, vl); - sur = __riscv_vor_vv_u32m4(__riscv_vsll_vx_u32m4(sur, 16, vl), - __riscv_vsrl_vx_u32m4(sur, 10, vl), vl); - sur = __riscv_vand_vx_u32m4(sur, 0x3FF03FF, vl); - sur = __riscv_vor_vx_u32m4(sur, 0xDC00D800, vl); - /* merge 1 byte utf32 and 2 byte sur */ - vbool8_t m4 = __riscv_vmsgtu_vx_u32m4_b8(utf32, 0xFFFF, vl); - vuint16m4_t utf32_16 = __riscv_vreinterpret_v_u32m4_u16m4( - __riscv_vmerge_vvm_u32m4(utf32, sur, m4, vl)); - /* compress and store */ - vbool4_t mOut = __riscv_vmor_mm_b4( - __riscv_vmsne_vx_u16m4_b4(utf32_16, 0, vl * 2), m4even, vl * 2); - vuint16m4_t vout = __riscv_vcompress_vm_u16m4(utf32_16, mOut, vl * 2); - vl = __riscv_vcpop_m_b4(mOut, vl * 2); - __riscv_vse16_v_u16m4(dst, simdutf_byteflip(vout, vl), vl); - return vl; -}; -/* end file src/rvv/rvv_helpers.inl.cpp */ +namespace lsx { +namespace { +namespace utf8_validation { -/* begin file src/rvv/rvv_length_from.inl.cpp */ +using namespace simd; -simdutf_warn_unused size_t -implementation::count_utf16le(const char16_t *src, size_t len) const noexcept { - return utf32_length_from_utf16le(src, len); -} +simdutf_really_inline simd8 +check_special_cases(const simd8 input, const simd8 prev1) { + // Bit 0 = Too Short (lead byte/ASCII followed by lead byte/ASCII) + // Bit 1 = Too Long (ASCII followed by continuation) + // Bit 2 = Overlong 3-byte + // Bit 4 = Surrogate + // Bit 5 = Overlong 2-byte + // Bit 7 = Two Continuations + constexpr const uint8_t TOO_SHORT = 1 << 0; // 11______ 0_______ + // 11______ 11______ + constexpr const uint8_t TOO_LONG = 1 << 1; // 0_______ 10______ + constexpr const uint8_t OVERLONG_3 = 1 << 2; // 11100000 100_____ + constexpr const uint8_t SURROGATE = 1 << 4; // 11101101 101_____ + constexpr const uint8_t OVERLONG_2 = 1 << 5; // 1100000_ 10______ + constexpr const uint8_t TWO_CONTS = 1 << 7; // 10______ 10______ + constexpr const uint8_t TOO_LARGE = 1 << 3; // 11110100 1001____ + // 11110100 101_____ + // 11110101 1001____ + // 11110101 101_____ + // 1111011_ 1001____ + // 1111011_ 101_____ + // 11111___ 1001____ + // 11111___ 101_____ + constexpr const uint8_t TOO_LARGE_1000 = 1 << 6; + // 11110101 1000____ + // 1111011_ 1000____ + // 11111___ 1000____ + constexpr const uint8_t OVERLONG_4 = 1 << 6; // 11110000 1000____ -simdutf_warn_unused size_t -implementation::count_utf16be(const char16_t *src, size_t len) const noexcept { - return utf32_length_from_utf16be(src, len); -} + const simd8 byte_1_high = prev1.shr<4>().lookup_16( + // 0_______ ________ + TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, + TOO_LONG, + // 10______ ________ + TWO_CONTS, TWO_CONTS, TWO_CONTS, TWO_CONTS, + // 1100____ ________ + TOO_SHORT | OVERLONG_2, + // 1101____ ________ + TOO_SHORT, + // 1110____ ________ + TOO_SHORT | OVERLONG_3 | SURROGATE, + // 1111____ ________ + TOO_SHORT | TOO_LARGE | TOO_LARGE_1000 | OVERLONG_4); + constexpr const uint8_t CARRY = + TOO_SHORT | TOO_LONG | TWO_CONTS; // These all have ____ in byte 1 . + const simd8 byte_1_low = + (prev1 & 0x0F) + .lookup_16( + // ____0000 ________ + CARRY | OVERLONG_3 | OVERLONG_2 | OVERLONG_4, + // ____0001 ________ + CARRY | OVERLONG_2, + // ____001_ ________ + CARRY, CARRY, -simdutf_warn_unused size_t -implementation::count_utf8(const char *src, size_t len) const noexcept { - return utf32_length_from_utf8(src, len); -} + // ____0100 ________ + CARRY | TOO_LARGE, + // ____0101 ________ + CARRY | TOO_LARGE | TOO_LARGE_1000, + // ____011_ ________ + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, -simdutf_warn_unused size_t implementation::latin1_length_from_utf8( - const char *src, size_t len) const noexcept { - return utf32_length_from_utf8(src, len); -} + // ____1___ ________ + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + // ____1101 ________ + CARRY | TOO_LARGE | TOO_LARGE_1000 | SURROGATE, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000); + const simd8 byte_2_high = input.shr<4>().lookup_16( + // ________ 0_______ + TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, + TOO_SHORT, TOO_SHORT, -simdutf_warn_unused size_t -implementation::latin1_length_from_utf16(size_t len) const noexcept { - return len; -} + // ________ 1000____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE_1000 | + OVERLONG_4, + // ________ 1001____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE, + // ________ 101_____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, + TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, -simdutf_warn_unused size_t -implementation::latin1_length_from_utf32(size_t len) const noexcept { - return len; + // ________ 11______ + TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT); + return (byte_1_high & byte_1_low & byte_2_high); } - -simdutf_warn_unused size_t -implementation::utf16_length_from_latin1(size_t len) const noexcept { - return len; +simdutf_really_inline simd8 +check_multibyte_lengths(const simd8 input, + const simd8 prev_input, + const simd8 sc) { + simd8 prev2 = input.prev<2>(prev_input); + simd8 prev3 = input.prev<3>(prev_input); + simd8 must23 = + simd8(must_be_2_3_continuation(prev2, prev3)); + simd8 must23_80 = must23 & uint8_t(0x80); + return must23_80 ^ sc; } -simdutf_warn_unused size_t -implementation::utf32_length_from_latin1(size_t len) const noexcept { - return len; +// +// Return nonzero if there are incomplete multibyte characters at the end of the +// block: e.g. if there is a 4-byte character, but it is 3 bytes from the end. +// +simdutf_really_inline simd8 is_incomplete(const simd8 input) { + // If the previous input's last 3 bytes match this, they're too short (they + // ended at EOF): + // ... 1111____ 111_____ 11______ + static const uint8_t max_array[32] = {255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 0b11110000u - 1, + 0b11100000u - 1, + 0b11000000u - 1}; + const simd8 max_value( + &max_array[sizeof(max_array) - sizeof(simd8)]); + return input.gt_bits(max_value); } -simdutf_warn_unused size_t implementation::utf32_length_from_utf8( - const char *src, size_t len) const noexcept { - size_t count = 0; - for (size_t vl; len > 0; len -= vl, src += vl) { - vl = __riscv_vsetvl_e8m8(len); - vint8m8_t v = __riscv_vle8_v_i8m8((int8_t *)src, vl); - vbool1_t mask = __riscv_vmsgt_vx_i8m8_b1(v, -65, vl); - count += __riscv_vcpop_m_b1(mask, vl); - } - return count; -} +struct utf8_checker { + // If this is nonzero, there has been a UTF-8 error. + simd8 error; + // The last input we received + simd8 prev_input_block; + // Whether the last input we received was incomplete (used for ASCII fast + // path) + simd8 prev_incomplete; -template -simdutf_really_inline static size_t -rvv_utf32_length_from_utf16(const char16_t *src, size_t len) { - size_t count = 0; - for (size_t vl; len > 0; len -= vl, src += vl) { - vl = __riscv_vsetvl_e16m8(len); - vuint16m8_t v = __riscv_vle16_v_u16m8((uint16_t *)src, vl); - v = simdutf_byteflip(v, vl); - vbool2_t notHigh = - __riscv_vmor_mm_b2(__riscv_vmsgtu_vx_u16m8_b2(v, 0xDFFF, vl), - __riscv_vmsltu_vx_u16m8_b2(v, 0xDC00, vl), vl); - count += __riscv_vcpop_m_b2(notHigh, vl); + // + // Check whether the current bytes are valid UTF-8. + // + simdutf_really_inline void check_utf8_bytes(const simd8 input, + const simd8 prev_input) { + // Flip prev1...prev3 so we can easily determine if they are 2+, 3+ or 4+ + // lead bytes (2, 3, 4-byte leads become large positive numbers instead of + // small negative numbers) + simd8 prev1 = input.prev<1>(prev_input); + simd8 sc = check_special_cases(input, prev1); + this->error |= check_multibyte_lengths(input, prev_input, sc); } - return count; -} - -simdutf_warn_unused size_t implementation::utf32_length_from_utf16le( - const char16_t *src, size_t len) const noexcept { - return rvv_utf32_length_from_utf16(src, len); -} -simdutf_warn_unused size_t implementation::utf32_length_from_utf16be( - const char16_t *src, size_t len) const noexcept { - if (supports_zvbb()) - return rvv_utf32_length_from_utf16(src, len); - else - return rvv_utf32_length_from_utf16(src, len); -} + // The only problem that can happen at EOF is that a multibyte character is + // too short or a byte value too large in the last bytes: check_special_cases + // only checks for bytes too large in the first of two bytes. + simdutf_really_inline void check_eof() { + // If the previous block had incomplete UTF-8 characters at the end, an + // ASCII block can't possibly finish them. + this->error |= this->prev_incomplete; + } -simdutf_warn_unused size_t implementation::utf8_length_from_latin1( - const char *src, size_t len) const noexcept { - size_t count = len; - for (size_t vl; len > 0; len -= vl, src += vl) { - vl = __riscv_vsetvl_e8m8(len); - vint8m8_t v = __riscv_vle8_v_i8m8((int8_t *)src, vl); - count += __riscv_vcpop_m_b1(__riscv_vmslt_vx_i8m8_b1(v, 0, vl), vl); + simdutf_really_inline void check_next_input(const simd8x64 &input) { + if (simdutf_likely(is_ascii(input))) { + this->error |= this->prev_incomplete; + } else { + // you might think that a for-loop would work, but under Visual Studio, it + // is not good enough. + static_assert((simd8x64::NUM_CHUNKS == 2) || + (simd8x64::NUM_CHUNKS == 4), + "We support either two or four chunks per 64-byte block."); + if (simd8x64::NUM_CHUNKS == 2) { + this->check_utf8_bytes(input.chunks[0], this->prev_input_block); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + } else if (simd8x64::NUM_CHUNKS == 4) { + this->check_utf8_bytes(input.chunks[0], this->prev_input_block); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + this->check_utf8_bytes(input.chunks[2], input.chunks[1]); + this->check_utf8_bytes(input.chunks[3], input.chunks[2]); + } + this->prev_incomplete = + is_incomplete(input.chunks[simd8x64::NUM_CHUNKS - 1]); + this->prev_input_block = input.chunks[simd8x64::NUM_CHUNKS - 1]; + } } - return count; -} -template -simdutf_really_inline static size_t -rvv_utf8_length_from_utf16(const char16_t *src, size_t len) { - size_t count = 0; - for (size_t vl; len > 0; len -= vl, src += vl) { - vl = __riscv_vsetvl_e16m8(len); - vuint16m8_t v = __riscv_vle16_v_u16m8((uint16_t *)src, vl); - v = simdutf_byteflip(v, vl); - vbool2_t m234 = __riscv_vmsgtu_vx_u16m8_b2(v, 0x7F, vl); - vbool2_t m34 = __riscv_vmsgtu_vx_u16m8_b2(v, 0x7FF, vl); - vbool2_t notSur = - __riscv_vmor_mm_b2(__riscv_vmsltu_vx_u16m8_b2(v, 0xD800, vl), - __riscv_vmsgtu_vx_u16m8_b2(v, 0xDFFF, vl), vl); - vbool2_t m3 = __riscv_vmand_mm_b2(m34, notSur, vl); - count += vl + __riscv_vcpop_m_b2(m234, vl) + __riscv_vcpop_m_b2(m3, vl); + // do not forget to call check_eof! + simdutf_really_inline bool errors() const { + return this->error.any_bits_set_anywhere(); } - return count; -} -simdutf_warn_unused size_t implementation::utf8_length_from_utf16le( - const char16_t *src, size_t len) const noexcept { - return rvv_utf8_length_from_utf16(src, len); -} +}; // struct utf8_checker +} // namespace utf8_validation -simdutf_warn_unused size_t implementation::utf8_length_from_utf16be( - const char16_t *src, size_t len) const noexcept { - if (supports_zvbb()) - return rvv_utf8_length_from_utf16(src, len); - else - return rvv_utf8_length_from_utf16(src, len); -} +using utf8_validation::utf8_checker; -simdutf_warn_unused size_t implementation::utf8_length_from_utf32( - const char32_t *src, size_t len) const noexcept { - size_t count = 0; - for (size_t vl; len > 0; len -= vl, src += vl) { - vl = __riscv_vsetvl_e32m8(len); - vuint32m8_t v = __riscv_vle32_v_u32m8((uint32_t *)src, vl); - vbool4_t m234 = __riscv_vmsgtu_vx_u32m8_b4(v, 0x7F, vl); - vbool4_t m34 = __riscv_vmsgtu_vx_u32m8_b4(v, 0x7FF, vl); - vbool4_t m4 = __riscv_vmsgtu_vx_u32m8_b4(v, 0xFFFF, vl); - count += vl + __riscv_vcpop_m_b4(m234, vl) + __riscv_vcpop_m_b4(m34, vl) + - __riscv_vcpop_m_b4(m4, vl); - } - return count; -} +} // unnamed namespace +} // namespace lsx +} // namespace simdutf +/* end file src/generic/utf8_validation/utf8_lookup4_algorithm.h */ +/* begin file src/generic/utf8_validation/utf8_validator.h */ +namespace simdutf { +namespace lsx { +namespace { +namespace utf8_validation { -simdutf_warn_unused size_t implementation::utf16_length_from_utf8( - const char *src, size_t len) const noexcept { - size_t count = 0; - for (size_t vl; len > 0; len -= vl, src += vl) { - vl = __riscv_vsetvl_e8m8(len); - vint8m8_t v = __riscv_vle8_v_i8m8((int8_t *)src, vl); - vbool1_t m1234 = __riscv_vmsgt_vx_i8m8_b1(v, -65, vl); - vbool1_t m4 = __riscv_vmsgtu_vx_u8m8_b1(__riscv_vreinterpret_u8m8(v), - (uint8_t)0b11101111, vl); - count += __riscv_vcpop_m_b1(m1234, vl) + __riscv_vcpop_m_b1(m4, vl); +/** + * Validates that the string is actual UTF-8. + */ +template +bool generic_validate_utf8(const uint8_t *input, size_t length) { + checker c{}; + buf_block_reader<64> reader(input, length); + while (reader.has_full_block()) { + simd::simd8x64 in(reader.full_block()); + c.check_next_input(in); + reader.advance(); } - return count; + uint8_t block[64]{}; + reader.get_remainder(block); + simd::simd8x64 in(block); + c.check_next_input(in); + reader.advance(); + c.check_eof(); + return !c.errors(); } -simdutf_warn_unused size_t implementation::utf16_length_from_utf32( - const char32_t *src, size_t len) const noexcept { - size_t count = 0; - for (size_t vl; len > 0; len -= vl, src += vl) { - vl = __riscv_vsetvl_e32m8(len); - vuint32m8_t v = __riscv_vle32_v_u32m8((uint32_t *)src, vl); - vbool4_t m4 = __riscv_vmsgtu_vx_u32m8_b4(v, 0xFFFF, vl); - count += vl + __riscv_vcpop_m_b4(m4, vl); - } - return count; +bool generic_validate_utf8(const char *input, size_t length) { + return generic_validate_utf8( + reinterpret_cast(input), length); } -/* end file src/rvv/rvv_length_from.inl.cpp */ -/* begin file src/rvv/rvv_validate.inl.cpp */ - -simdutf_warn_unused bool -implementation::validate_ascii(const char *src, size_t len) const noexcept { - size_t vlmax = __riscv_vsetvlmax_e8m8(); - vint8m8_t mask = __riscv_vmv_v_x_i8m8(0, vlmax); - for (size_t vl; len > 0; len -= vl, src += vl) { - vl = __riscv_vsetvl_e8m8(len); - vint8m8_t v = __riscv_vle8_v_i8m8((int8_t *)src, vl); - mask = __riscv_vor_vv_i8m8_tu(mask, mask, v, vl); +/** + * Validates that the string is actual UTF-8 and stops on errors. + */ +template +result generic_validate_utf8_with_errors(const uint8_t *input, size_t length) { + checker c{}; + buf_block_reader<64> reader(input, length); + size_t count{0}; + while (reader.has_full_block()) { + simd::simd8x64 in(reader.full_block()); + c.check_next_input(in); + if (c.errors()) { + if (count != 0) { + count--; + } // Sometimes the error is only detected in the next chunk + result res = scalar::utf8::rewind_and_validate_with_errors( + reinterpret_cast(input), + reinterpret_cast(input + count), length - count); + res.count += count; + return res; + } + reader.advance(); + count += 64; } - return __riscv_vfirst_m_b1(__riscv_vmslt_vx_i8m8_b1(mask, 0, vlmax), vlmax) < - 0; -} - -simdutf_warn_unused result implementation::validate_ascii_with_errors( - const char *src, size_t len) const noexcept { - const char *beg = src; - for (size_t vl; len > 0; len -= vl, src += vl) { - vl = __riscv_vsetvl_e8m8(len); - vint8m8_t v = __riscv_vle8_v_i8m8((int8_t *)src, vl); - long idx = __riscv_vfirst_m_b1(__riscv_vmslt_vx_i8m8_b1(v, 0, vl), vl); - if (idx >= 0) - return result(error_code::TOO_LARGE, src - beg + idx); + uint8_t block[64]{}; + reader.get_remainder(block); + simd::simd8x64 in(block); + c.check_next_input(in); + reader.advance(); + c.check_eof(); + if (c.errors()) { + if (count != 0) { + count--; + } // Sometimes the error is only detected in the next chunk + result res = scalar::utf8::rewind_and_validate_with_errors( + reinterpret_cast(input), + reinterpret_cast(input) + count, length - count); + res.count += count; + return res; + } else { + return result(error_code::SUCCESS, length); } - return result(error_code::SUCCESS, src - beg); } -/* Returns a close estimation of the number of valid UTF-8 bytes up to the - * first invalid one, but never overestimating. */ -simdutf_really_inline static size_t rvv_count_valid_utf8(const char *src, - size_t len) { - const char *beg = src; - if (len < 32) - return 0; +result generic_validate_utf8_with_errors(const char *input, size_t length) { + return generic_validate_utf8_with_errors( + reinterpret_cast(input), length); +} - /* validate first three bytes */ - { - size_t idx = 3; - while (idx < len && (src[idx] >> 6) == 0b10) - ++idx; - if (idx > 3 + 3 || !scalar::utf8::validate(src, idx)) - return 0; +template +bool generic_validate_ascii(const uint8_t *input, size_t length) { + buf_block_reader<64> reader(input, length); + uint8_t blocks[64]{}; + simd::simd8x64 running_or(blocks); + while (reader.has_full_block()) { + simd::simd8x64 in(reader.full_block()); + running_or |= in; + reader.advance(); } + uint8_t block[64]{}; + reader.get_remainder(block); + simd::simd8x64 in(block); + running_or |= in; + return running_or.is_ascii(); +} - static const uint64_t err1m[] = {0x0202020202020202, 0x4915012180808080}; - static const uint64_t err2m[] = {0xCBCBCB8B8383A3E7, 0xCBCBDBCBCBCBCBCB}; - static const uint64_t err3m[] = {0x0101010101010101, 0X01010101BABAAEE6}; +bool generic_validate_ascii(const char *input, size_t length) { + return generic_validate_ascii( + reinterpret_cast(input), length); +} - const vuint8m1_t err1tbl = - __riscv_vreinterpret_v_u64m1_u8m1(__riscv_vle64_v_u64m1(err1m, 2)); - const vuint8m1_t err2tbl = - __riscv_vreinterpret_v_u64m1_u8m1(__riscv_vle64_v_u64m1(err2m, 2)); - const vuint8m1_t err3tbl = - __riscv_vreinterpret_v_u64m1_u8m1(__riscv_vle64_v_u64m1(err3m, 2)); +template +result generic_validate_ascii_with_errors(const uint8_t *input, size_t length) { + buf_block_reader<64> reader(input, length); + size_t count{0}; + while (reader.has_full_block()) { + simd::simd8x64 in(reader.full_block()); + if (!in.is_ascii()) { + result res = scalar::ascii::validate_with_errors( + reinterpret_cast(input + count), length - count); + return result(res.error, count + res.count); + } + reader.advance(); - size_t tail = 3; - size_t n = len - tail; + count += 64; + } + uint8_t block[64]{}; + reader.get_remainder(block); + simd::simd8x64 in(block); + if (!in.is_ascii()) { + result res = scalar::ascii::validate_with_errors( + reinterpret_cast(input + count), length - count); + return result(res.error, count + res.count); + } else { + return result(error_code::SUCCESS, length); + } +} - for (size_t vl; n > 0; n -= vl, src += vl) { - vl = __riscv_vsetvl_e8m4(n); - vuint8m4_t v0 = __riscv_vle8_v_u8m4((uint8_t const *)src, vl); +result generic_validate_ascii_with_errors(const char *input, size_t length) { + return generic_validate_ascii_with_errors( + reinterpret_cast(input), length); +} - uint8_t next0 = src[vl + 0]; - uint8_t next1 = src[vl + 1]; - uint8_t next2 = src[vl + 2]; +} // namespace utf8_validation +} // unnamed namespace +} // namespace lsx +} // namespace simdutf +/* end file src/generic/utf8_validation/utf8_validator.h */ - /* fast path: ASCII */ - if (__riscv_vfirst_m_b2(__riscv_vmsgtu_vx_u8m4_b2(v0, 0b01111111, vl), vl) < - 0 && - (next0 | next1 | next2) < 0b10000000) - continue; +// transcoding from UTF-8 to Latin 1 +/* begin file src/generic/utf8_to_latin1/utf8_to_latin1.h */ - /* see "Validating UTF-8 In Less Than One Instruction Per Byte" - * https://arxiv.org/abs/2010.03090 */ - vuint8m4_t v1 = __riscv_vslide1down_vx_u8m4(v0, next0, vl); - vuint8m4_t v2 = __riscv_vslide1down_vx_u8m4(v1, next1, vl); - vuint8m4_t v3 = __riscv_vslide1down_vx_u8m4(v2, next2, vl); +namespace simdutf { +namespace lsx { +namespace { +namespace utf8_to_latin1 { +using namespace simd; - vuint8m4_t s1 = __riscv_vreinterpret_v_u16m4_u8m4(__riscv_vsrl_vx_u16m4( - __riscv_vreinterpret_v_u8m4_u16m4(v2), 4, __riscv_vsetvlmax_e16m4())); - vuint8m4_t s3 = __riscv_vreinterpret_v_u16m4_u8m4(__riscv_vsrl_vx_u16m4( - __riscv_vreinterpret_v_u8m4_u16m4(v3), 4, __riscv_vsetvlmax_e16m4())); +simdutf_really_inline simd8 +check_special_cases(const simd8 input, const simd8 prev1) { + // For UTF-8 to Latin 1, we can allow any ASCII character, and any + // continuation byte, but the non-ASCII leading bytes must be 0b11000011 or + // 0b11000010 and nothing else. + // + // Bit 0 = Too Short (lead byte/ASCII followed by lead byte/ASCII) + // Bit 1 = Too Long (ASCII followed by continuation) + // Bit 2 = Overlong 3-byte + // Bit 4 = Surrogate + // Bit 5 = Overlong 2-byte + // Bit 7 = Two Continuations + constexpr const uint8_t TOO_SHORT = 1 << 0; // 11______ 0_______ + // 11______ 11______ + constexpr const uint8_t TOO_LONG = 1 << 1; // 0_______ 10______ + constexpr const uint8_t OVERLONG_3 = 1 << 2; // 11100000 100_____ + constexpr const uint8_t SURROGATE = 1 << 4; // 11101101 101_____ + constexpr const uint8_t OVERLONG_2 = 1 << 5; // 1100000_ 10______ + constexpr const uint8_t TWO_CONTS = 1 << 7; // 10______ 10______ + constexpr const uint8_t TOO_LARGE = 1 << 3; // 11110100 1001____ + // 11110100 101_____ + // 11110101 1001____ + // 11110101 101_____ + // 1111011_ 1001____ + // 1111011_ 101_____ + // 11111___ 1001____ + // 11111___ 101_____ + constexpr const uint8_t TOO_LARGE_1000 = 1 << 6; + // 11110101 1000____ + // 1111011_ 1000____ + // 11111___ 1000____ + constexpr const uint8_t OVERLONG_4 = 1 << 6; // 11110000 1000____ + constexpr const uint8_t FORBIDDEN = 0xff; - vuint8m4_t idx2 = __riscv_vand_vx_u8m4(v2, 0xF, vl); - vuint8m4_t idx1 = __riscv_vand_vx_u8m4(s1, 0xF, vl); - vuint8m4_t idx3 = __riscv_vand_vx_u8m4(s3, 0xF, vl); + const simd8 byte_1_high = prev1.shr<4>().lookup_16( + // 0_______ ________ + TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, + TOO_LONG, + // 10______ ________ + TWO_CONTS, TWO_CONTS, TWO_CONTS, TWO_CONTS, + // 1100____ ________ + TOO_SHORT | OVERLONG_2, + // 1101____ ________ + FORBIDDEN, + // 1110____ ________ + FORBIDDEN, + // 1111____ ________ + FORBIDDEN); + constexpr const uint8_t CARRY = + TOO_SHORT | TOO_LONG | TWO_CONTS; // These all have ____ in byte 1 . + const simd8 byte_1_low = + (prev1 & 0x0F) + .lookup_16( + // ____0000 ________ + CARRY | OVERLONG_3 | OVERLONG_2 | OVERLONG_4, + // ____0001 ________ + CARRY | OVERLONG_2, + // ____001_ ________ + CARRY, CARRY, - vuint8m4_t err1 = simdutf_vrgather_u8m1x4(err1tbl, idx1); - vuint8m4_t err2 = simdutf_vrgather_u8m1x4(err2tbl, idx2); - vuint8m4_t err3 = simdutf_vrgather_u8m1x4(err3tbl, idx3); - vint8m4_t errs = __riscv_vreinterpret_v_u8m4_i8m4( - __riscv_vand_vv_u8m4(__riscv_vand_vv_u8m4(err1, err2, vl), err3, vl)); + // ____0100 ________ + FORBIDDEN, + // ____0101 ________ + FORBIDDEN, + // ____011_ ________ + FORBIDDEN, FORBIDDEN, - vbool2_t is_3 = __riscv_vmsgtu_vx_u8m4_b2(v1, 0b11100000 - 1, vl); - vbool2_t is_4 = __riscv_vmsgtu_vx_u8m4_b2(v0, 0b11110000 - 1, vl); - vbool2_t is_34 = __riscv_vmor_mm_b2(is_3, is_4, vl); - vbool2_t err34 = - __riscv_vmxor_mm_b2(is_34, __riscv_vmslt_vx_i8m4_b2(errs, 0, vl), vl); - vbool2_t errm = - __riscv_vmor_mm_b2(__riscv_vmsgt_vx_i8m4_b2(errs, 0, vl), err34, vl); - if (__riscv_vfirst_m_b2(errm, vl) >= 0) - break; - } + // ____1___ ________ + FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN, + // ____1101 ________ + FORBIDDEN, FORBIDDEN, FORBIDDEN); + const simd8 byte_2_high = input.shr<4>().lookup_16( + // ________ 0_______ + TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, + TOO_SHORT, TOO_SHORT, - /* we need to validate the last character */ - while (tail < len && (src[0] >> 6) == 0b10) - --src, ++tail; - return src - beg; -} + // ________ 1000____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE_1000 | + OVERLONG_4, + // ________ 1001____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE, + // ________ 101_____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, + TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, -simdutf_warn_unused bool -implementation::validate_utf8(const char *src, size_t len) const noexcept { - size_t count = rvv_count_valid_utf8(src, len); - return scalar::utf8::validate(src + count, len - count); + // ________ 11______ + TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT); + return (byte_1_high & byte_1_low & byte_2_high); } -simdutf_warn_unused result implementation::validate_utf8_with_errors( - const char *src, size_t len) const noexcept { - size_t count = rvv_count_valid_utf8(src, len); - result res = scalar::utf8::validate_with_errors(src + count, len - count); - return result(res.error, count + res.count); -} +struct validating_transcoder { + // If this is nonzero, there has been a UTF-8 error. + simd8 error; -simdutf_warn_unused bool -implementation::validate_utf16le(const char16_t *src, - size_t len) const noexcept { - return validate_utf16le_with_errors(src, len).error == error_code::SUCCESS; -} + validating_transcoder() : error(uint8_t(0)) {} + // + // Check whether the current bytes are valid UTF-8. + // + simdutf_really_inline void check_utf8_bytes(const simd8 input, + const simd8 prev_input) { + // Flip prev1...prev3 so we can easily determine if they are 2+, 3+ or 4+ + // lead bytes (2, 3, 4-byte leads become large positive numbers instead of + // small negative numbers) + simd8 prev1 = input.prev<1>(prev_input); + this->error |= check_special_cases(input, prev1); + } -simdutf_warn_unused bool -implementation::validate_utf16be(const char16_t *src, - size_t len) const noexcept { - return validate_utf16be_with_errors(src, len).error == error_code::SUCCESS; -} + simdutf_really_inline size_t convert(const char *in, size_t size, + char *latin1_output) { + size_t pos = 0; + char *start{latin1_output}; + // In the worst case, we have the haswell kernel which can cause an overflow + // of 8 bytes when calling convert_masked_utf8_to_latin1. If you skip the + // last 16 bytes, and if the data is valid, then it is entirely safe because + // 16 UTF-8 bytes generate much more than 8 bytes. However, you cannot + // generally assume that you have valid UTF-8 input, so we are going to go + // back from the end counting 16 leading bytes, to give us a good margin. + size_t leading_byte = 0; + size_t margin = size; + for (; margin > 0 && leading_byte < 16; margin--) { + leading_byte += (int8_t(in[margin - 1]) > + -65); // twos complement of -65 is 1011 1111 ... + } + // If the input is long enough, then we have that margin-1 is the eight last + // leading byte. + const size_t safety_margin = size - margin + 1; // to avoid overruns! + while (pos + 64 + safety_margin <= size) { + simd8x64 input(reinterpret_cast(in + pos)); + if (input.is_ascii()) { + input.store((int8_t *)latin1_output); + latin1_output += 64; + pos += 64; + } else { + // you might think that a for-loop would work, but under Visual Studio, + // it is not good enough. + static_assert( + (simd8x64::NUM_CHUNKS == 2) || + (simd8x64::NUM_CHUNKS == 4), + "We support either two or four chunks per 64-byte block."); + auto zero = simd8{uint8_t(0)}; + if (simd8x64::NUM_CHUNKS == 2) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + } else if (simd8x64::NUM_CHUNKS == 4) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + this->check_utf8_bytes(input.chunks[2], input.chunks[1]); + this->check_utf8_bytes(input.chunks[3], input.chunks[2]); + } + uint64_t utf8_continuation_mask = + input.lt(-65 + 1); // -64 is 1100 0000 in twos complement. Note: in + // this case, we also have ASCII to account for. + if (utf8_continuation_mask & 1) { + return 0; // error + } + uint64_t utf8_leading_mask = ~utf8_continuation_mask; + uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; + // We process in blocks of up to 12 bytes except possibly + // for fast paths which may process up to 16 bytes. For the + // slow path to work, we should have at least 12 input bytes left. + size_t max_starting_point = (pos + 64) - 12; + // Next loop is going to run at least five times. + while (pos < max_starting_point) { + // Performance note: our ability to compute 'consumed' and + // then shift and recompute is critical. If there is a + // latency of, say, 4 cycles on getting 'consumed', then + // the inner loop might have a total latency of about 6 cycles. + // Yet we process between 6 to 12 inputs bytes, thus we get + // a speed limit between 1 cycle/byte and 0.5 cycle/byte + // for this section of the code. Hence, there is a limit + // to how much we can further increase this latency before + // it seriously harms performance. + size_t consumed = convert_masked_utf8_to_latin1( + in + pos, utf8_end_of_code_point_mask, latin1_output); + pos += consumed; + utf8_end_of_code_point_mask >>= consumed; + } + // At this point there may remain between 0 and 12 bytes in the + // 64-byte block. These bytes will be processed again. So we have an + // 80% efficiency (in the worst case). In practice we expect an + // 85% to 90% efficiency. + } + } + if (errors()) { + return 0; + } + if (pos < size) { + size_t howmany = + scalar::utf8_to_latin1::convert(in + pos, size - pos, latin1_output); + if (howmany == 0) { + return 0; + } + latin1_output += howmany; + } + return latin1_output - start; + } -template -simdutf_really_inline static result -rvv_validate_utf16_with_errors(const char16_t *src, size_t len) { - const char16_t *beg = src; - uint16_t last = 0; - for (size_t vl; len > 0; - len -= vl, src += vl, last = simdutf_byteflip(src[-1])) { - vl = __riscv_vsetvl_e16m8(len); - vuint16m8_t v1 = __riscv_vle16_v_u16m8((const uint16_t *)src, vl); - v1 = simdutf_byteflip(v1, vl); - vuint16m8_t v0 = __riscv_vslide1up_vx_u16m8(v1, last, vl); + simdutf_really_inline result convert_with_errors(const char *in, size_t size, + char *latin1_output) { + size_t pos = 0; + char *start{latin1_output}; + // In the worst case, we have the haswell kernel which can cause an overflow + // of 8 bytes when calling convert_masked_utf8_to_latin1. If you skip the + // last 16 bytes, and if the data is valid, then it is entirely safe because + // 16 UTF-8 bytes generate much more than 8 bytes. However, you cannot + // generally assume that you have valid UTF-8 input, so we are going to go + // back from the end counting 8 leading bytes, to give us a good margin. + size_t leading_byte = 0; + size_t margin = size; + for (; margin > 0 && leading_byte < 8; margin--) { + leading_byte += (int8_t(in[margin - 1]) > -65); + } + // If the input is long enough, then we have that margin-1 is the eight last + // leading byte. + const size_t safety_margin = size - margin + 1; // to avoid overruns! + while (pos + 64 + safety_margin <= size) { + simd8x64 input(reinterpret_cast(in + pos)); + if (input.is_ascii()) { + input.store((int8_t *)latin1_output); + latin1_output += 64; + pos += 64; + } else { + // you might think that a for-loop would work, but under Visual Studio, + // it is not good enough. + static_assert( + (simd8x64::NUM_CHUNKS == 2) || + (simd8x64::NUM_CHUNKS == 4), + "We support either two or four chunks per 64-byte block."); + auto zero = simd8{uint8_t(0)}; + if (simd8x64::NUM_CHUNKS == 2) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + } else if (simd8x64::NUM_CHUNKS == 4) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + this->check_utf8_bytes(input.chunks[2], input.chunks[1]); + this->check_utf8_bytes(input.chunks[3], input.chunks[2]); + } + if (errors()) { + // rewind_and_convert_with_errors will seek a potential error from + // in+pos onward, with the ability to go back up to pos bytes, and + // read size-pos bytes forward. + result res = scalar::utf8_to_latin1::rewind_and_convert_with_errors( + pos, in + pos, size - pos, latin1_output); + res.count += pos; + return res; + } + uint64_t utf8_continuation_mask = input.lt(-65 + 1); + uint64_t utf8_leading_mask = ~utf8_continuation_mask; + uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; + // We process in blocks of up to 12 bytes except possibly + // for fast paths which may process up to 16 bytes. For the + // slow path to work, we should have at least 12 input bytes left. + size_t max_starting_point = (pos + 64) - 12; + // Next loop is going to run at least five times. + while (pos < max_starting_point) { + // Performance note: our ability to compute 'consumed' and + // then shift and recompute is critical. If there is a + // latency of, say, 4 cycles on getting 'consumed', then + // the inner loop might have a total latency of about 6 cycles. + // Yet we process between 6 to 12 inputs bytes, thus we get + // a speed limit between 1 cycle/byte and 0.5 cycle/byte + // for this section of the code. Hence, there is a limit + // to how much we can further increase this latency before + // it seriously harms performance. + size_t consumed = convert_masked_utf8_to_latin1( + in + pos, utf8_end_of_code_point_mask, latin1_output); + pos += consumed; + utf8_end_of_code_point_mask >>= consumed; + } + // At this point there may remain between 0 and 12 bytes in the + // 64-byte block. These bytes will be processed again. So we have an + // 80% efficiency (in the worst case). In practice we expect an + // 85% to 90% efficiency. + } + } + if (errors()) { + // rewind_and_convert_with_errors will seek a potential error from in+pos + // onward, with the ability to go back up to pos bytes, and read size-pos + // bytes forward. + result res = scalar::utf8_to_latin1::rewind_and_convert_with_errors( + pos, in + pos, size - pos, latin1_output); + res.count += pos; + return res; + } + if (pos < size) { + // rewind_and_convert_with_errors will seek a potential error from in+pos + // onward, with the ability to go back up to pos bytes, and read size-pos + // bytes forward. + result res = scalar::utf8_to_latin1::rewind_and_convert_with_errors( + pos, in + pos, size - pos, latin1_output); + if (res.error) { // In case of error, we want the error position + res.count += pos; + return res; + } else { // In case of success, we want the number of word written + latin1_output += res.count; + } + } + return result(error_code::SUCCESS, latin1_output - start); + } - vbool2_t surhi = __riscv_vmseq_vx_u16m8_b2( - __riscv_vand_vx_u16m8(v0, 0xFC00, vl), 0xD800, vl); - vbool2_t surlo = __riscv_vmseq_vx_u16m8_b2( - __riscv_vand_vx_u16m8(v1, 0xFC00, vl), 0xDC00, vl); + simdutf_really_inline bool errors() const { + return this->error.any_bits_set_anywhere(); + } - long idx = __riscv_vfirst_m_b2(__riscv_vmxor_mm_b2(surhi, surlo, vl), vl); - if (idx >= 0) { - last = idx > 0 ? simdutf_byteflip(src[idx - 1]) : last; - return result(error_code::SURROGATE, - src - beg + idx - (last - 0xD800u < 0x400u)); - break; +}; // struct utf8_checker +} // namespace utf8_to_latin1 +} // unnamed namespace +} // namespace lsx +} // namespace simdutf +/* end file src/generic/utf8_to_latin1/utf8_to_latin1.h */ +/* begin file src/generic/utf8_to_latin1/valid_utf8_to_latin1.h */ + +namespace simdutf { +namespace lsx { +namespace { +namespace utf8_to_latin1 { +using namespace simd; + +simdutf_really_inline size_t convert_valid(const char *in, size_t size, + char *latin1_output) { + size_t pos = 0; + char *start{latin1_output}; + // In the worst case, we have the haswell kernel which can cause an overflow + // of 8 bytes when calling convert_masked_utf8_to_latin1. If you skip the last + // 16 bytes, and if the data is valid, then it is entirely safe because 16 + // UTF-8 bytes generate much more than 8 bytes. However, you cannot generally + // assume that you have valid UTF-8 input, so we are going to go back from the + // end counting 8 leading bytes, to give us a good margin. + size_t leading_byte = 0; + size_t margin = size; + for (; margin > 0 && leading_byte < 8; margin--) { + leading_byte += (int8_t(in[margin - 1]) > + -65); // twos complement of -65 is 1011 1111 ... + } + // If the input is long enough, then we have that margin-1 is the eight last + // leading byte. + const size_t safety_margin = size - margin + 1; // to avoid overruns! + while (pos + 64 + safety_margin <= size) { + simd8x64 input(reinterpret_cast(in + pos)); + if (input.is_ascii()) { + input.store((int8_t *)latin1_output); + latin1_output += 64; + pos += 64; + } else { + // you might think that a for-loop would work, but under Visual Studio, it + // is not good enough. + uint64_t utf8_continuation_mask = + input.lt(-65 + 1); // -64 is 1100 0000 in twos complement. Note: in + // this case, we also have ASCII to account for. + uint64_t utf8_leading_mask = ~utf8_continuation_mask; + uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; + // We process in blocks of up to 12 bytes except possibly + // for fast paths which may process up to 16 bytes. For the + // slow path to work, we should have at least 12 input bytes left. + size_t max_starting_point = (pos + 64) - 12; + // Next loop is going to run at least five times. + while (pos < max_starting_point) { + // Performance note: our ability to compute 'consumed' and + // then shift and recompute is critical. If there is a + // latency of, say, 4 cycles on getting 'consumed', then + // the inner loop might have a total latency of about 6 cycles. + // Yet we process between 6 to 12 inputs bytes, thus we get + // a speed limit between 1 cycle/byte and 0.5 cycle/byte + // for this section of the code. Hence, there is a limit + // to how much we can further increase this latency before + // it seriously harms performance. + size_t consumed = convert_masked_utf8_to_latin1( + in + pos, utf8_end_of_code_point_mask, latin1_output); + pos += consumed; + utf8_end_of_code_point_mask >>= consumed; + } + // At this point there may remain between 0 and 12 bytes in the + // 64-byte block. These bytes will be processed again. So we have an + // 80% efficiency (in the worst case). In practice we expect an + // 85% to 90% efficiency. } } - if (last - 0xD800u < 0x400u) { - return result(error_code::SURROGATE, - src - beg - 1); /* end on high surrogate */ - } else { - return result(error_code::SUCCESS, src - beg); + if (pos < size) { + size_t howmany = scalar::utf8_to_latin1::convert_valid(in + pos, size - pos, + latin1_output); + latin1_output += howmany; } + return latin1_output - start; } -simdutf_warn_unused result implementation::validate_utf16le_with_errors( - const char16_t *src, size_t len) const noexcept { - return rvv_validate_utf16_with_errors(src, len); -} +} // namespace utf8_to_latin1 +} // namespace +} // namespace lsx +} // namespace simdutf + // namespace simdutf +/* end file src/generic/utf8_to_latin1/valid_utf8_to_latin1.h */ +// transcoding from UTF-8 to UTF-16 +/* begin file src/generic/utf8_to_utf16/valid_utf8_to_utf16.h */ -simdutf_warn_unused result implementation::validate_utf16be_with_errors( - const char16_t *src, size_t len) const noexcept { - if (supports_zvbb()) - return rvv_validate_utf16_with_errors(src, len); - else - return rvv_validate_utf16_with_errors(src, len); -} +namespace simdutf { +namespace lsx { +namespace { +namespace utf8_to_utf16 { -simdutf_warn_unused bool -implementation::validate_utf32(const char32_t *src, size_t len) const noexcept { - size_t vlmax = __riscv_vsetvlmax_e32m8(); - vuint32m8_t max = __riscv_vmv_v_x_u32m8(0x10FFFF, vlmax); - vuint32m8_t maxOff = __riscv_vmv_v_x_u32m8(0xFFFFF7FF, vlmax); - for (size_t vl; len > 0; len -= vl, src += vl) { - vl = __riscv_vsetvl_e32m8(len); - vuint32m8_t v = __riscv_vle32_v_u32m8((uint32_t *)src, vl); - vuint32m8_t off = __riscv_vadd_vx_u32m8(v, 0xFFFF2000, vl); - max = __riscv_vmaxu_vv_u32m8_tu(max, max, v, vl); - maxOff = __riscv_vmaxu_vv_u32m8_tu(maxOff, maxOff, off, vl); - } - return __riscv_vfirst_m_b4( - __riscv_vmor_mm_b4( - __riscv_vmsne_vx_u32m8_b4(max, 0x10FFFF, vlmax), - __riscv_vmsne_vx_u32m8_b4(maxOff, 0xFFFFF7FF, vlmax), vlmax), - vlmax) < 0; -} +using namespace simd; -simdutf_warn_unused result implementation::validate_utf32_with_errors( - const char32_t *src, size_t len) const noexcept { - const char32_t *beg = src; - for (size_t vl; len > 0; len -= vl, src += vl) { - vl = __riscv_vsetvl_e32m8(len); - vuint32m8_t v = __riscv_vle32_v_u32m8((uint32_t *)src, vl); - vuint32m8_t off = __riscv_vadd_vx_u32m8(v, 0xFFFF2000, vl); - long idx1 = - __riscv_vfirst_m_b4(__riscv_vmsgtu_vx_u32m8_b4(v, 0x10FFFF, vl), vl); - long idx2 = __riscv_vfirst_m_b4( - __riscv_vmsgtu_vx_u32m8_b4(off, 0xFFFFF7FF, vl), vl); - if (idx1 >= 0 && idx2 >= 0) { - if (idx1 <= idx2) { - return result(error_code::TOO_LARGE, src - beg + idx1); - } else { - return result(error_code::SURROGATE, src - beg + idx2); +template +simdutf_warn_unused size_t convert_valid(const char *input, size_t size, + char16_t *utf16_output) noexcept { + // The implementation is not specific to haswell and should be moved to the + // generic directory. + size_t pos = 0; + char16_t *start{utf16_output}; + const size_t safety_margin = 16; // to avoid overruns! + while (pos + 64 + safety_margin <= size) { + // this loop could be unrolled further. For example, we could process the + // mask far more than 64 bytes. + simd8x64 in(reinterpret_cast(input + pos)); + if (in.is_ascii()) { + in.store_ascii_as_utf16(utf16_output); + utf16_output += 64; + pos += 64; + } else { + // Slow path. We hope that the compiler will recognize that this is a slow + // path. Anything that is not a continuation mask is a 'leading byte', + // that is, the start of a new code point. + uint64_t utf8_continuation_mask = in.lt(-65 + 1); + // -65 is 0b10111111 in two-complement's, so largest possible continuation + // byte + uint64_t utf8_leading_mask = ~utf8_continuation_mask; + // The *start* of code points is not so useful, rather, we want the *end* + // of code points. + uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; + // We process in blocks of up to 12 bytes except possibly + // for fast paths which may process up to 16 bytes. For the + // slow path to work, we should have at least 12 input bytes left. + size_t max_starting_point = (pos + 64) - 12; + // Next loop is going to run at least five times when using solely + // the slow/regular path, and at least four times if there are fast paths. + while (pos < max_starting_point) { + // Performance note: our ability to compute 'consumed' and + // then shift and recompute is critical. If there is a + // latency of, say, 4 cycles on getting 'consumed', then + // the inner loop might have a total latency of about 6 cycles. + // Yet we process between 6 to 12 inputs bytes, thus we get + // a speed limit between 1 cycle/byte and 0.5 cycle/byte + // for this section of the code. Hence, there is a limit + // to how much we can further increase this latency before + // it seriously harms performance. + // + // Thus we may allow convert_masked_utf8_to_utf16 to process + // more bytes at a time under a fast-path mode where 16 bytes + // are consumed at once (e.g., when encountering ASCII). + size_t consumed = convert_masked_utf8_to_utf16( + input + pos, utf8_end_of_code_point_mask, utf16_output); + pos += consumed; + utf8_end_of_code_point_mask >>= consumed; } - } - if (idx1 >= 0) { - return result(error_code::TOO_LARGE, src - beg + idx1); - } - if (idx2 >= 0) { - return result(error_code::SURROGATE, src - beg + idx2); + // At this point there may remain between 0 and 12 bytes in the + // 64-byte block. These bytes will be processed again. So we have an + // 80% efficiency (in the worst case). In practice we expect an + // 85% to 90% efficiency. } } - return result(error_code::SUCCESS, src - beg); + utf16_output += scalar::utf8_to_utf16::convert_valid( + input + pos, size - pos, utf16_output); + return utf16_output - start; } -/* end file src/rvv/rvv_validate.inl.cpp */ -/* begin file src/rvv/rvv_latin1_to.inl.cpp */ +} // namespace utf8_to_utf16 +} // unnamed namespace +} // namespace lsx +} // namespace simdutf +/* end file src/generic/utf8_to_utf16/valid_utf8_to_utf16.h */ +/* begin file src/generic/utf8_to_utf16/utf8_to_utf16.h */ -simdutf_warn_unused size_t implementation::convert_latin1_to_utf8( - const char *src, size_t len, char *dst) const noexcept { - char *beg = dst; - for (size_t vl, vlOut; len > 0; len -= vl, src += vl, dst += vlOut) { - vl = __riscv_vsetvl_e8m2(len); - vuint8m2_t v1 = __riscv_vle8_v_u8m2((uint8_t *)src, vl); - vbool4_t nascii = - __riscv_vmslt_vx_i8m2_b4(__riscv_vreinterpret_v_u8m2_i8m2(v1), 0, vl); - size_t cnt = __riscv_vcpop_m_b4(nascii, vl); - vlOut = vl + cnt; - if (cnt == 0) { - __riscv_vse8_v_u8m2((uint8_t *)dst, v1, vlOut); - continue; - } +namespace simdutf { +namespace lsx { +namespace { +namespace utf8_to_utf16 { +using namespace simd; - vuint8m2_t v0 = - __riscv_vor_vx_u8m2(__riscv_vsrl_vx_u8m2(v1, 6, vl), 0b11000000, vl); - v1 = __riscv_vand_vx_u8m2_mu(nascii, v1, v1, 0b10111111, vl); +simdutf_really_inline simd8 +check_special_cases(const simd8 input, const simd8 prev1) { + // Bit 0 = Too Short (lead byte/ASCII followed by lead byte/ASCII) + // Bit 1 = Too Long (ASCII followed by continuation) + // Bit 2 = Overlong 3-byte + // Bit 4 = Surrogate + // Bit 5 = Overlong 2-byte + // Bit 7 = Two Continuations + constexpr const uint8_t TOO_SHORT = 1 << 0; // 11______ 0_______ + // 11______ 11______ + constexpr const uint8_t TOO_LONG = 1 << 1; // 0_______ 10______ + constexpr const uint8_t OVERLONG_3 = 1 << 2; // 11100000 100_____ + constexpr const uint8_t SURROGATE = 1 << 4; // 11101101 101_____ + constexpr const uint8_t OVERLONG_2 = 1 << 5; // 1100000_ 10______ + constexpr const uint8_t TWO_CONTS = 1 << 7; // 10______ 10______ + constexpr const uint8_t TOO_LARGE = 1 << 3; // 11110100 1001____ + // 11110100 101_____ + // 11110101 1001____ + // 11110101 101_____ + // 1111011_ 1001____ + // 1111011_ 101_____ + // 11111___ 1001____ + // 11111___ 101_____ + constexpr const uint8_t TOO_LARGE_1000 = 1 << 6; + // 11110101 1000____ + // 1111011_ 1000____ + // 11111___ 1000____ + constexpr const uint8_t OVERLONG_4 = 1 << 6; // 11110000 1000____ - vuint8m4_t wide = - __riscv_vreinterpret_v_u16m4_u8m4(__riscv_vwmaccu_vx_u16m4( - __riscv_vwaddu_vv_u16m4(v0, v1, vl), 0xFF, v1, vl)); - vbool2_t mask = __riscv_vmsgtu_vx_u8m4_b2( - __riscv_vsub_vx_u8m4(wide, 0b11000000, vl * 2), 1, vl * 2); - vuint8m4_t comp = __riscv_vcompress_vm_u8m4(wide, mask, vl * 2); + const simd8 byte_1_high = prev1.shr<4>().lookup_16( + // 0_______ ________ + TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, + TOO_LONG, + // 10______ ________ + TWO_CONTS, TWO_CONTS, TWO_CONTS, TWO_CONTS, + // 1100____ ________ + TOO_SHORT | OVERLONG_2, + // 1101____ ________ + TOO_SHORT, + // 1110____ ________ + TOO_SHORT | OVERLONG_3 | SURROGATE, + // 1111____ ________ + TOO_SHORT | TOO_LARGE | TOO_LARGE_1000 | OVERLONG_4); + constexpr const uint8_t CARRY = + TOO_SHORT | TOO_LONG | TWO_CONTS; // These all have ____ in byte 1 . + const simd8 byte_1_low = + (prev1 & 0x0F) + .lookup_16( + // ____0000 ________ + CARRY | OVERLONG_3 | OVERLONG_2 | OVERLONG_4, + // ____0001 ________ + CARRY | OVERLONG_2, + // ____001_ ________ + CARRY, CARRY, - __riscv_vse8_v_u8m4((uint8_t *)dst, comp, vlOut); - } - return dst - beg; + // ____0100 ________ + CARRY | TOO_LARGE, + // ____0101 ________ + CARRY | TOO_LARGE | TOO_LARGE_1000, + // ____011_ ________ + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + + // ____1___ ________ + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + // ____1101 ________ + CARRY | TOO_LARGE | TOO_LARGE_1000 | SURROGATE, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000); + const simd8 byte_2_high = input.shr<4>().lookup_16( + // ________ 0_______ + TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, + TOO_SHORT, TOO_SHORT, + + // ________ 1000____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE_1000 | + OVERLONG_4, + // ________ 1001____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE, + // ________ 101_____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, + TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, + + // ________ 11______ + TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT); + return (byte_1_high & byte_1_low & byte_2_high); +} +simdutf_really_inline simd8 +check_multibyte_lengths(const simd8 input, + const simd8 prev_input, + const simd8 sc) { + simd8 prev2 = input.prev<2>(prev_input); + simd8 prev3 = input.prev<3>(prev_input); + simd8 must23 = + simd8(must_be_2_3_continuation(prev2, prev3)); + simd8 must23_80 = must23 & uint8_t(0x80); + return must23_80 ^ sc; } -simdutf_warn_unused size_t implementation::convert_latin1_to_utf16le( - const char *src, size_t len, char16_t *dst) const noexcept { - char16_t *beg = dst; - for (size_t vl; len > 0; len -= vl, src += vl, dst += vl) { - vl = __riscv_vsetvl_e8m4(len); - vuint8m4_t v = __riscv_vle8_v_u8m4((uint8_t *)src, vl); - __riscv_vse16_v_u16m8((uint16_t *)dst, __riscv_vzext_vf2_u16m8(v, vl), vl); +struct validating_transcoder { + // If this is nonzero, there has been a UTF-8 error. + simd8 error; + + validating_transcoder() : error(uint8_t(0)) {} + // + // Check whether the current bytes are valid UTF-8. + // + simdutf_really_inline void check_utf8_bytes(const simd8 input, + const simd8 prev_input) { + // Flip prev1...prev3 so we can easily determine if they are 2+, 3+ or 4+ + // lead bytes (2, 3, 4-byte leads become large positive numbers instead of + // small negative numbers) + simd8 prev1 = input.prev<1>(prev_input); + simd8 sc = check_special_cases(input, prev1); + this->error |= check_multibyte_lengths(input, prev_input, sc); } - return dst - beg; -} -simdutf_warn_unused size_t implementation::convert_latin1_to_utf16be( - const char *src, size_t len, char16_t *dst) const noexcept { - char16_t *beg = dst; - for (size_t vl; len > 0; len -= vl, src += vl, dst += vl) { - vl = __riscv_vsetvl_e8m4(len); - vuint8m4_t v = __riscv_vle8_v_u8m4((uint8_t *)src, vl); - __riscv_vse16_v_u16m8( - (uint16_t *)dst, - __riscv_vsll_vx_u16m8(__riscv_vzext_vf2_u16m8(v, vl), 8, vl), vl); + template + simdutf_really_inline size_t convert(const char *in, size_t size, + char16_t *utf16_output) { + size_t pos = 0; + char16_t *start{utf16_output}; + // In the worst case, we have the haswell kernel which can cause an overflow + // of 8 bytes when calling convert_masked_utf8_to_utf16. If you skip the + // last 16 bytes, and if the data is valid, then it is entirely safe because + // 16 UTF-8 bytes generate much more than 8 bytes. However, you cannot + // generally assume that you have valid UTF-8 input, so we are going to go + // back from the end counting 8 leading bytes, to give us a good margin. + size_t leading_byte = 0; + size_t margin = size; + for (; margin > 0 && leading_byte < 8; margin--) { + leading_byte += (int8_t(in[margin - 1]) > -65); + } + // If the input is long enough, then we have that margin-1 is the eight last + // leading byte. + const size_t safety_margin = size - margin + 1; // to avoid overruns! + while (pos + 64 + safety_margin <= size) { + simd8x64 input(reinterpret_cast(in + pos)); + if (input.is_ascii()) { + input.store_ascii_as_utf16(utf16_output); + utf16_output += 64; + pos += 64; + } else { + // you might think that a for-loop would work, but under Visual Studio, + // it is not good enough. + static_assert( + (simd8x64::NUM_CHUNKS == 2) || + (simd8x64::NUM_CHUNKS == 4), + "We support either two or four chunks per 64-byte block."); + auto zero = simd8{uint8_t(0)}; + if (simd8x64::NUM_CHUNKS == 2) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + } else if (simd8x64::NUM_CHUNKS == 4) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + this->check_utf8_bytes(input.chunks[2], input.chunks[1]); + this->check_utf8_bytes(input.chunks[3], input.chunks[2]); + } + uint64_t utf8_continuation_mask = input.lt(-65 + 1); + if (utf8_continuation_mask & 1) { + return 0; // error + } + uint64_t utf8_leading_mask = ~utf8_continuation_mask; + uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; + // We process in blocks of up to 12 bytes except possibly + // for fast paths which may process up to 16 bytes. For the + // slow path to work, we should have at least 12 input bytes left. + size_t max_starting_point = (pos + 64) - 12; + // Next loop is going to run at least five times. + while (pos < max_starting_point) { + // Performance note: our ability to compute 'consumed' and + // then shift and recompute is critical. If there is a + // latency of, say, 4 cycles on getting 'consumed', then + // the inner loop might have a total latency of about 6 cycles. + // Yet we process between 6 to 12 inputs bytes, thus we get + // a speed limit between 1 cycle/byte and 0.5 cycle/byte + // for this section of the code. Hence, there is a limit + // to how much we can further increase this latency before + // it seriously harms performance. + size_t consumed = convert_masked_utf8_to_utf16( + in + pos, utf8_end_of_code_point_mask, utf16_output); + pos += consumed; + utf8_end_of_code_point_mask >>= consumed; + } + // At this point there may remain between 0 and 12 bytes in the + // 64-byte block. These bytes will be processed again. So we have an + // 80% efficiency (in the worst case). In practice we expect an + // 85% to 90% efficiency. + } + } + if (errors()) { + return 0; + } + if (pos < size) { + size_t howmany = scalar::utf8_to_utf16::convert( + in + pos, size - pos, utf16_output); + if (howmany == 0) { + return 0; + } + utf16_output += howmany; + } + return utf16_output - start; } - return dst - beg; -} -simdutf_warn_unused size_t implementation::convert_latin1_to_utf32( - const char *src, size_t len, char32_t *dst) const noexcept { - char32_t *beg = dst; - for (size_t vl; len > 0; len -= vl, src += vl, dst += vl) { - vl = __riscv_vsetvl_e8m2(len); - vuint8m2_t v = __riscv_vle8_v_u8m2((uint8_t *)src, vl); - __riscv_vse32_v_u32m8((uint32_t *)dst, __riscv_vzext_vf4_u32m8(v, vl), vl); + template + simdutf_really_inline result convert_with_errors(const char *in, size_t size, + char16_t *utf16_output) { + size_t pos = 0; + char16_t *start{utf16_output}; + // In the worst case, we have the haswell kernel which can cause an overflow + // of 8 bytes when calling convert_masked_utf8_to_utf16. If you skip the + // last 16 bytes, and if the data is valid, then it is entirely safe because + // 16 UTF-8 bytes generate much more than 8 bytes. However, you cannot + // generally assume that you have valid UTF-8 input, so we are going to go + // back from the end counting 8 leading bytes, to give us a good margin. + size_t leading_byte = 0; + size_t margin = size; + for (; margin > 0 && leading_byte < 8; margin--) { + leading_byte += (int8_t(in[margin - 1]) > -65); + } + // If the input is long enough, then we have that margin-1 is the eight last + // leading byte. + const size_t safety_margin = size - margin + 1; // to avoid overruns! + while (pos + 64 + safety_margin <= size) { + simd8x64 input(reinterpret_cast(in + pos)); + if (input.is_ascii()) { + input.store_ascii_as_utf16(utf16_output); + utf16_output += 64; + pos += 64; + } else { + // you might think that a for-loop would work, but under Visual Studio, + // it is not good enough. + static_assert( + (simd8x64::NUM_CHUNKS == 2) || + (simd8x64::NUM_CHUNKS == 4), + "We support either two or four chunks per 64-byte block."); + auto zero = simd8{uint8_t(0)}; + if (simd8x64::NUM_CHUNKS == 2) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + } else if (simd8x64::NUM_CHUNKS == 4) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + this->check_utf8_bytes(input.chunks[2], input.chunks[1]); + this->check_utf8_bytes(input.chunks[3], input.chunks[2]); + } + uint64_t utf8_continuation_mask = input.lt(-65 + 1); + if (errors() || (utf8_continuation_mask & 1)) { + // rewind_and_convert_with_errors will seek a potential error from + // in+pos onward, with the ability to go back up to pos bytes, and + // read size-pos bytes forward. + result res = + scalar::utf8_to_utf16::rewind_and_convert_with_errors( + pos, in + pos, size - pos, utf16_output); + res.count += pos; + return res; + } + uint64_t utf8_leading_mask = ~utf8_continuation_mask; + uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; + // We process in blocks of up to 12 bytes except possibly + // for fast paths which may process up to 16 bytes. For the + // slow path to work, we should have at least 12 input bytes left. + size_t max_starting_point = (pos + 64) - 12; + // Next loop is going to run at least five times. + while (pos < max_starting_point) { + // Performance note: our ability to compute 'consumed' and + // then shift and recompute is critical. If there is a + // latency of, say, 4 cycles on getting 'consumed', then + // the inner loop might have a total latency of about 6 cycles. + // Yet we process between 6 to 12 inputs bytes, thus we get + // a speed limit between 1 cycle/byte and 0.5 cycle/byte + // for this section of the code. Hence, there is a limit + // to how much we can further increase this latency before + // it seriously harms performance. + size_t consumed = convert_masked_utf8_to_utf16( + in + pos, utf8_end_of_code_point_mask, utf16_output); + pos += consumed; + utf8_end_of_code_point_mask >>= consumed; + } + // At this point there may remain between 0 and 12 bytes in the + // 64-byte block. These bytes will be processed again. So we have an + // 80% efficiency (in the worst case). In practice we expect an + // 85% to 90% efficiency. + } + } + if (errors()) { + // rewind_and_convert_with_errors will seek a potential error from in+pos + // onward, with the ability to go back up to pos bytes, and read size-pos + // bytes forward. + result res = + scalar::utf8_to_utf16::rewind_and_convert_with_errors( + pos, in + pos, size - pos, utf16_output); + res.count += pos; + return res; + } + if (pos < size) { + // rewind_and_convert_with_errors will seek a potential error from in+pos + // onward, with the ability to go back up to pos bytes, and read size-pos + // bytes forward. + result res = + scalar::utf8_to_utf16::rewind_and_convert_with_errors( + pos, in + pos, size - pos, utf16_output); + if (res.error) { // In case of error, we want the error position + res.count += pos; + return res; + } else { // In case of success, we want the number of word written + utf16_output += res.count; + } + } + return result(error_code::SUCCESS, utf16_output - start); } - return dst - beg; -} -/* end file src/rvv/rvv_latin1_to.inl.cpp */ -/* begin file src/rvv/rvv_utf16_to.inl.cpp */ -#include -template -simdutf_really_inline static result -rvv_utf16_to_latin1_with_errors(const char16_t *src, size_t len, char *dst) { - const char16_t *const beg = src; - for (size_t vl; len > 0; len -= vl, src += vl, dst += vl) { - vl = __riscv_vsetvl_e16m8(len); - vuint16m8_t v = __riscv_vle16_v_u16m8((uint16_t *)src, vl); - v = simdutf_byteflip(v, vl); - long idx = __riscv_vfirst_m_b2(__riscv_vmsgtu_vx_u16m8_b2(v, 255, vl), vl); - if (idx >= 0) - return result(error_code::TOO_LARGE, src - beg + idx); - __riscv_vse8_v_u8m4((uint8_t *)dst, __riscv_vncvt_x_x_w_u8m4(v, vl), vl); + simdutf_really_inline bool errors() const { + return this->error.any_bits_set_anywhere(); } - return result(error_code::SUCCESS, src - beg); -} - -simdutf_warn_unused size_t implementation::convert_utf16le_to_latin1( - const char16_t *src, size_t len, char *dst) const noexcept { - result res = convert_utf16le_to_latin1_with_errors(src, len, dst); - return res.error == error_code::SUCCESS ? res.count : 0; -} - -simdutf_warn_unused size_t implementation::convert_utf16be_to_latin1( - const char16_t *src, size_t len, char *dst) const noexcept { - result res = convert_utf16be_to_latin1_with_errors(src, len, dst); - return res.error == error_code::SUCCESS ? res.count : 0; -} -simdutf_warn_unused result -implementation::convert_utf16le_to_latin1_with_errors( - const char16_t *src, size_t len, char *dst) const noexcept { - return rvv_utf16_to_latin1_with_errors(src, len, dst); -} +}; // struct utf8_checker +} // namespace utf8_to_utf16 +} // unnamed namespace +} // namespace lsx +} // namespace simdutf +/* end file src/generic/utf8_to_utf16/utf8_to_utf16.h */ +// transcoding from UTF-8 to UTF-32 +/* begin file src/generic/utf8_to_utf32/valid_utf8_to_utf32.h */ -simdutf_warn_unused result -implementation::convert_utf16be_to_latin1_with_errors( - const char16_t *src, size_t len, char *dst) const noexcept { - if (supports_zvbb()) - return rvv_utf16_to_latin1_with_errors(src, len, - dst); - else - return rvv_utf16_to_latin1_with_errors(src, len, dst); -} +namespace simdutf { +namespace lsx { +namespace { +namespace utf8_to_utf32 { -simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_latin1( - const char16_t *src, size_t len, char *dst) const noexcept { - const char16_t *const beg = src; - for (size_t vl; len > 0; len -= vl, src += vl, dst += vl) { - vl = __riscv_vsetvl_e16m8(len); - vuint16m8_t v = __riscv_vle16_v_u16m8((uint16_t *)src, vl); - __riscv_vse8_v_u8m4((uint8_t *)dst, __riscv_vncvt_x_x_w_u8m4(v, vl), vl); - } - return src - beg; -} +using namespace simd; -simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_latin1( - const char16_t *src, size_t len, char *dst) const noexcept { - const char16_t *const beg = src; - for (size_t vl; len > 0; len -= vl, src += vl, dst += vl) { - vl = __riscv_vsetvl_e16m8(len); - vuint16m8_t v = __riscv_vle16_v_u16m8((uint16_t *)src, vl); - __riscv_vse8_v_u8m4((uint8_t *)dst, __riscv_vnsrl_wx_u8m4(v, 8, vl), vl); +simdutf_warn_unused size_t convert_valid(const char *input, size_t size, + char32_t *utf32_output) noexcept { + size_t pos = 0; + char32_t *start{utf32_output}; + const size_t safety_margin = 16; // to avoid overruns! + while (pos + 64 + safety_margin <= size) { + simd8x64 in(reinterpret_cast(input + pos)); + if (in.is_ascii()) { + in.store_ascii_as_utf32(utf32_output); + utf32_output += 64; + pos += 64; + } else { + // -65 is 0b10111111 in two-complement's, so largest possible continuation + // byte + uint64_t utf8_continuation_mask = in.lt(-65 + 1); + uint64_t utf8_leading_mask = ~utf8_continuation_mask; + uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; + size_t max_starting_point = (pos + 64) - 12; + while (pos < max_starting_point) { + size_t consumed = convert_masked_utf8_to_utf32( + input + pos, utf8_end_of_code_point_mask, utf32_output); + pos += consumed; + utf8_end_of_code_point_mask >>= consumed; + } + } } - return src - beg; + utf32_output += scalar::utf8_to_utf32::convert_valid(input + pos, size - pos, + utf32_output); + return utf32_output - start; } -template -simdutf_really_inline static result -rvv_utf16_to_utf8_with_errors(const char16_t *src, size_t len, char *dst) { - size_t n = len; - const char16_t *srcBeg = src; - const char *dstBeg = dst; - size_t vl8m4 = __riscv_vsetvlmax_e8m4(); - vbool2_t m4mulp2 = __riscv_vmseq_vx_u8m4_b2( - __riscv_vand_vx_u8m4(__riscv_vid_v_u8m4(vl8m4), 3, vl8m4), 2, vl8m4); - - for (size_t vl, vlOut; n > 0;) { - vl = __riscv_vsetvl_e16m2(n); - - vuint16m2_t v = __riscv_vle16_v_u16m2((uint16_t const *)src, vl); - v = simdutf_byteflip(v, vl); - vbool8_t m234 = __riscv_vmsgtu_vx_u16m2_b8(v, 0x80 - 1, vl); - - if (__riscv_vfirst_m_b8(m234, vl) < 0) { /* 1 byte utf8 */ - vlOut = vl; - __riscv_vse8_v_u8m1((uint8_t *)dst, __riscv_vncvt_x_x_w_u8m1(v, vlOut), - vlOut); - n -= vl, src += vl, dst += vlOut; - continue; - } - - vbool8_t m34 = __riscv_vmsgtu_vx_u16m2_b8(v, 0x800 - 1, vl); - - if (__riscv_vfirst_m_b8(m34, vl) < 0) { /* 1/2 byte utf8 */ - /* 0: [ aaa|aabbbbbb] - * 1: [aabbbbbb| ] vsll 8 - * 2: [ | aaaaa] vsrl 6 - * 3: [00111111|00011111] - * 4: [ bbbbbb|000aaaaa] (1|2)&3 - * 5: [11000000|11000000] - * 6: [10bbbbbb|110aaaaa] 4|5 */ - vuint16m2_t twoByte = __riscv_vand_vx_u16m2( - __riscv_vor_vv_u16m2(__riscv_vsll_vx_u16m2(v, 8, vl), - __riscv_vsrl_vx_u16m2(v, 6, vl), vl), - 0b0011111100011111, vl); - vuint16m2_t vout16 = - __riscv_vor_vx_u16m2_mu(m234, v, twoByte, 0b1000000011000000, vl); - vuint8m2_t vout = __riscv_vreinterpret_v_u16m2_u8m2(vout16); +} // namespace utf8_to_utf32 +} // unnamed namespace +} // namespace lsx +} // namespace simdutf +/* end file src/generic/utf8_to_utf32/valid_utf8_to_utf32.h */ +/* begin file src/generic/utf8_to_utf32/utf8_to_utf32.h */ - /* Every high byte that is zero should be compressed - * low bytes should never be compressed, so we set them - * to all ones, and then create a non-zero bytes mask */ - vbool4_t mcomp = - __riscv_vmsne_vx_u8m2_b4(__riscv_vreinterpret_v_u16m2_u8m2( - __riscv_vor_vx_u16m2(vout16, 0xFF, vl)), - 0, vl * 2); - vlOut = __riscv_vcpop_m_b4(mcomp, vl * 2); +namespace simdutf { +namespace lsx { +namespace { +namespace utf8_to_utf32 { +using namespace simd; - vout = __riscv_vcompress_vm_u8m2(vout, mcomp, vl * 2); - __riscv_vse8_v_u8m2((uint8_t *)dst, vout, vlOut); +simdutf_really_inline simd8 +check_special_cases(const simd8 input, const simd8 prev1) { + // Bit 0 = Too Short (lead byte/ASCII followed by lead byte/ASCII) + // Bit 1 = Too Long (ASCII followed by continuation) + // Bit 2 = Overlong 3-byte + // Bit 4 = Surrogate + // Bit 5 = Overlong 2-byte + // Bit 7 = Two Continuations + constexpr const uint8_t TOO_SHORT = 1 << 0; // 11______ 0_______ + // 11______ 11______ + constexpr const uint8_t TOO_LONG = 1 << 1; // 0_______ 10______ + constexpr const uint8_t OVERLONG_3 = 1 << 2; // 11100000 100_____ + constexpr const uint8_t SURROGATE = 1 << 4; // 11101101 101_____ + constexpr const uint8_t OVERLONG_2 = 1 << 5; // 1100000_ 10______ + constexpr const uint8_t TWO_CONTS = 1 << 7; // 10______ 10______ + constexpr const uint8_t TOO_LARGE = 1 << 3; // 11110100 1001____ + // 11110100 101_____ + // 11110101 1001____ + // 11110101 101_____ + // 1111011_ 1001____ + // 1111011_ 101_____ + // 11111___ 1001____ + // 11111___ 101_____ + constexpr const uint8_t TOO_LARGE_1000 = 1 << 6; + // 11110101 1000____ + // 1111011_ 1000____ + // 11111___ 1000____ + constexpr const uint8_t OVERLONG_4 = 1 << 6; // 11110000 1000____ - n -= vl, src += vl, dst += vlOut; - continue; - } + const simd8 byte_1_high = prev1.shr<4>().lookup_16( + // 0_______ ________ + TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, + TOO_LONG, + // 10______ ________ + TWO_CONTS, TWO_CONTS, TWO_CONTS, TWO_CONTS, + // 1100____ ________ + TOO_SHORT | OVERLONG_2, + // 1101____ ________ + TOO_SHORT, + // 1110____ ________ + TOO_SHORT | OVERLONG_3 | SURROGATE, + // 1111____ ________ + TOO_SHORT | TOO_LARGE | TOO_LARGE_1000 | OVERLONG_4); + constexpr const uint8_t CARRY = + TOO_SHORT | TOO_LONG | TWO_CONTS; // These all have ____ in byte 1 . + const simd8 byte_1_low = + (prev1 & 0x0F) + .lookup_16( + // ____0000 ________ + CARRY | OVERLONG_3 | OVERLONG_2 | OVERLONG_4, + // ____0001 ________ + CARRY | OVERLONG_2, + // ____001_ ________ + CARRY, CARRY, - vbool8_t sur = __riscv_vmseq_vx_u16m2_b8( - __riscv_vand_vx_u16m2(v, 0xF800, vl), 0xD800, vl); - long first = __riscv_vfirst_m_b8(sur, vl); - size_t tail = vl - first; - vl = first < 0 ? vl : first; + // ____0100 ________ + CARRY | TOO_LARGE, + // ____0101 ________ + CARRY | TOO_LARGE | TOO_LARGE_1000, + // ____011_ ________ + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, - if (vl > 0) { /* 1/2/3 byte utf8 */ - /* in: [aaaabbbb|bbcccccc] - * v1: [0bcccccc| ] vsll 8 - * v1: [10cccccc| ] vsll 8 & 0b00111111 | 0b10000000 - * v2: [ |110bbbbb] vsrl 6 & 0b00111111 | 0b11000000 - * v2: [ |10bbbbbb] vsrl 6 & 0b00111111 | 0b10000000 - * v3: [ |1110aaaa] vsrl 12 | 0b11100000 - * 1: [00000000|0bcccccc|00000000|00000000] => [0bcccccc] - * 2: [00000000|10cccccc|110bbbbb|00000000] => [110bbbbb] [10cccccc] - * 3: [00000000|10cccccc|10bbbbbb|1110aaaa] => [1110aaaa] [10bbbbbb] - * [10cccccc] - */ - vuint16m2_t v1, v2, v3, v12; - v1 = __riscv_vor_vx_u16m2_mu( - m234, v, __riscv_vand_vx_u16m2(v, 0b00111111, vl), 0b10000000, vl); - v1 = __riscv_vsll_vx_u16m2(v1, 8, vl); + // ____1___ ________ + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000, + // ____1101 ________ + CARRY | TOO_LARGE | TOO_LARGE_1000 | SURROGATE, + CARRY | TOO_LARGE | TOO_LARGE_1000, + CARRY | TOO_LARGE | TOO_LARGE_1000); + const simd8 byte_2_high = input.shr<4>().lookup_16( + // ________ 0_______ + TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, + TOO_SHORT, TOO_SHORT, - v2 = __riscv_vor_vx_u16m2( - __riscv_vand_vx_u16m2(__riscv_vsrl_vx_u16m2(v, 6, vl), 0b00111111, - vl), - 0b10000000, vl); - v2 = __riscv_vor_vx_u16m2_mu(__riscv_vmnot_m_b8(m34, vl), v2, v2, - 0b01000000, vl); - v3 = __riscv_vor_vx_u16m2(__riscv_vsrl_vx_u16m2(v, 12, vl), 0b11100000, - vl); - v12 = __riscv_vor_vv_u16m2_mu(m234, v1, v1, v2, vl); + // ________ 1000____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE_1000 | + OVERLONG_4, + // ________ 1001____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE, + // ________ 101_____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, + TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, - vuint32m4_t w12 = __riscv_vwmulu_vx_u32m4(v12, 1 << 8, vl); - vuint32m4_t w123 = __riscv_vwaddu_wv_u32m4_mu(m34, w12, w12, v3, vl); - vuint8m4_t vout = __riscv_vreinterpret_v_u32m4_u8m4(w123); + // ________ 11______ + TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT); + return (byte_1_high & byte_1_low & byte_2_high); +} +simdutf_really_inline simd8 +check_multibyte_lengths(const simd8 input, + const simd8 prev_input, + const simd8 sc) { + simd8 prev2 = input.prev<2>(prev_input); + simd8 prev3 = input.prev<3>(prev_input); + simd8 must23 = + simd8(must_be_2_3_continuation(prev2, prev3)); + simd8 must23_80 = must23 & uint8_t(0x80); + return must23_80 ^ sc; +} - vbool2_t mcomp = __riscv_vmor_mm_b2( - m4mulp2, __riscv_vmsne_vx_u8m4_b2(vout, 0, vl * 4), vl * 4); - vlOut = __riscv_vcpop_m_b2(mcomp, vl * 4); +struct validating_transcoder { + // If this is nonzero, there has been a UTF-8 error. + simd8 error; - vout = __riscv_vcompress_vm_u8m4(vout, mcomp, vl * 4); - __riscv_vse8_v_u8m4((uint8_t *)dst, vout, vlOut); + validating_transcoder() : error(uint8_t(0)) {} + // + // Check whether the current bytes are valid UTF-8. + // + simdutf_really_inline void check_utf8_bytes(const simd8 input, + const simd8 prev_input) { + // Flip prev1...prev3 so we can easily determine if they are 2+, 3+ or 4+ + // lead bytes (2, 3, 4-byte leads become large positive numbers instead of + // small negative numbers) + simd8 prev1 = input.prev<1>(prev_input); + simd8 sc = check_special_cases(input, prev1); + this->error |= check_multibyte_lengths(input, prev_input, sc); + } - n -= vl, src += vl, dst += vlOut; + simdutf_really_inline size_t convert(const char *in, size_t size, + char32_t *utf32_output) { + size_t pos = 0; + char32_t *start{utf32_output}; + // In the worst case, we have the haswell kernel which can cause an overflow + // of 8 words when calling convert_masked_utf8_to_utf32. If you skip the + // last 16 bytes, and if the data is valid, then it is entirely safe because + // 16 UTF-8 bytes generate much more than 8 bytes. However, you cannot + // generally assume that you have valid UTF-8 input, so we are going to go + // back from the end counting 16 leading bytes, to give us a good margin. + size_t leading_byte = 0; + size_t margin = size; + for (; margin > 0 && leading_byte < 8; margin--) { + leading_byte += (int8_t(in[margin - 1]) > -65); } + // If the input is long enough, then we have that margin-1 is the fourth + // last leading byte. + const size_t safety_margin = size - margin + 1; // to avoid overruns! + while (pos + 64 + safety_margin <= size) { + simd8x64 input(reinterpret_cast(in + pos)); + if (input.is_ascii()) { + input.store_ascii_as_utf32(utf32_output); + utf32_output += 64; + pos += 64; + } else { + // you might think that a for-loop would work, but under Visual Studio, + // it is not good enough. + static_assert( + (simd8x64::NUM_CHUNKS == 2) || + (simd8x64::NUM_CHUNKS == 4), + "We support either two or four chunks per 64-byte block."); + auto zero = simd8{uint8_t(0)}; + if (simd8x64::NUM_CHUNKS == 2) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + } else if (simd8x64::NUM_CHUNKS == 4) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + this->check_utf8_bytes(input.chunks[2], input.chunks[1]); + this->check_utf8_bytes(input.chunks[3], input.chunks[2]); + } + uint64_t utf8_continuation_mask = input.lt(-65 + 1); + if (utf8_continuation_mask & 1) { + return 0; // we have an error + } + uint64_t utf8_leading_mask = ~utf8_continuation_mask; + uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; + // We process in blocks of up to 12 bytes except possibly + // for fast paths which may process up to 16 bytes. For the + // slow path to work, we should have at least 12 input bytes left. + size_t max_starting_point = (pos + 64) - 12; + // Next loop is going to run at least five times. + while (pos < max_starting_point) { + // Performance note: our ability to compute 'consumed' and + // then shift and recompute is critical. If there is a + // latency of, say, 4 cycles on getting 'consumed', then + // the inner loop might have a total latency of about 6 cycles. + // Yet we process between 6 to 12 inputs bytes, thus we get + // a speed limit between 1 cycle/byte and 0.5 cycle/byte + // for this section of the code. Hence, there is a limit + // to how much we can further increase this latency before + // it seriously harms performance. + size_t consumed = convert_masked_utf8_to_utf32( + in + pos, utf8_end_of_code_point_mask, utf32_output); + pos += consumed; + utf8_end_of_code_point_mask >>= consumed; + } + // At this point there may remain between 0 and 12 bytes in the + // 64-byte block. These bytes will be processed again. So we have an + // 80% efficiency (in the worst case). In practice we expect an + // 85% to 90% efficiency. + } + } + if (errors()) { + return 0; + } + if (pos < size) { + size_t howmany = + scalar::utf8_to_utf32::convert(in + pos, size - pos, utf32_output); + if (howmany == 0) { + return 0; + } + utf32_output += howmany; + } + return utf32_output - start; + } - if (tail) - while (n) { - uint16_t word = simdutf_byteflip(src[0]); - if ((word & 0xFF80) == 0) { - break; - } else if ((word & 0xF800) == 0) { - break; - } else if ((word & 0xF800) != 0xD800) { - break; - } else { - // must be a surrogate pair - if (n <= 1) - return result(error_code::SURROGATE, src - srcBeg); - uint16_t diff = word - 0xD800; - if (diff > 0x3FF) - return result(error_code::SURROGATE, src - srcBeg); - uint16_t diff2 = simdutf_byteflip(src[1]) - 0xDC00; - if (diff2 > 0x3FF) - return result(error_code::SURROGATE, src - srcBeg); - - uint32_t value = ((diff + 0x40) << 10) + diff2; - - // will generate four UTF-8 bytes - // we have 0b11110XXX 0b10XXXXXX 0b10XXXXXX 0b10XXXXXX - *dst++ = (char)((value >> 18) | 0b11110000); - *dst++ = (char)(((value >> 12) & 0b111111) | 0b10000000); - *dst++ = (char)(((value >> 6) & 0b111111) | 0b10000000); - *dst++ = (char)((value & 0b111111) | 0b10000000); - src += 2; - n -= 2; + simdutf_really_inline result convert_with_errors(const char *in, size_t size, + char32_t *utf32_output) { + size_t pos = 0; + char32_t *start{utf32_output}; + // In the worst case, we have the haswell kernel which can cause an overflow + // of 8 bytes when calling convert_masked_utf8_to_utf32. If you skip the + // last 16 bytes, and if the data is valid, then it is entirely safe because + // 16 UTF-8 bytes generate much more than 8 bytes. However, you cannot + // generally assume that you have valid UTF-8 input, so we are going to go + // back from the end counting 8 leading bytes, to give us a good margin. + size_t leading_byte = 0; + size_t margin = size; + for (; margin > 0 && leading_byte < 8; margin--) { + leading_byte += (int8_t(in[margin - 1]) > -65); + } + // If the input is long enough, then we have that margin-1 is the fourth + // last leading byte. + const size_t safety_margin = size - margin + 1; // to avoid overruns! + while (pos + 64 + safety_margin <= size) { + simd8x64 input(reinterpret_cast(in + pos)); + if (input.is_ascii()) { + input.store_ascii_as_utf32(utf32_output); + utf32_output += 64; + pos += 64; + } else { + // you might think that a for-loop would work, but under Visual Studio, + // it is not good enough. + static_assert( + (simd8x64::NUM_CHUNKS == 2) || + (simd8x64::NUM_CHUNKS == 4), + "We support either two or four chunks per 64-byte block."); + auto zero = simd8{uint8_t(0)}; + if (simd8x64::NUM_CHUNKS == 2) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + } else if (simd8x64::NUM_CHUNKS == 4) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + this->check_utf8_bytes(input.chunks[2], input.chunks[1]); + this->check_utf8_bytes(input.chunks[3], input.chunks[2]); + } + uint64_t utf8_continuation_mask = input.lt(-65 + 1); + if (errors() || (utf8_continuation_mask & 1)) { + result res = scalar::utf8_to_utf32::rewind_and_convert_with_errors( + pos, in + pos, size - pos, utf32_output); + res.count += pos; + return res; + } + uint64_t utf8_leading_mask = ~utf8_continuation_mask; + uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; + // We process in blocks of up to 12 bytes except possibly + // for fast paths which may process up to 16 bytes. For the + // slow path to work, we should have at least 12 input bytes left. + size_t max_starting_point = (pos + 64) - 12; + // Next loop is going to run at least five times. + while (pos < max_starting_point) { + // Performance note: our ability to compute 'consumed' and + // then shift and recompute is critical. If there is a + // latency of, say, 4 cycles on getting 'consumed', then + // the inner loop might have a total latency of about 6 cycles. + // Yet we process between 6 to 12 inputs bytes, thus we get + // a speed limit between 1 cycle/byte and 0.5 cycle/byte + // for this section of the code. Hence, there is a limit + // to how much we can further increase this latency before + // it seriously harms performance. + size_t consumed = convert_masked_utf8_to_utf32( + in + pos, utf8_end_of_code_point_mask, utf32_output); + pos += consumed; + utf8_end_of_code_point_mask >>= consumed; } + // At this point there may remain between 0 and 12 bytes in the + // 64-byte block. These bytes will be processed again. So we have an + // 80% efficiency (in the worst case). In practice we expect an + // 85% to 90% efficiency. + } + } + if (errors()) { + result res = scalar::utf8_to_utf32::rewind_and_convert_with_errors( + pos, in + pos, size - pos, utf32_output); + res.count += pos; + return res; + } + if (pos < size) { + result res = scalar::utf8_to_utf32::rewind_and_convert_with_errors( + pos, in + pos, size - pos, utf32_output); + if (res.error) { // In case of error, we want the error position + res.count += pos; + return res; + } else { // In case of success, we want the number of word written + utf32_output += res.count; } + } + return result(error_code::SUCCESS, utf32_output - start); } - return result(error_code::SUCCESS, dst - dstBeg); -} + simdutf_really_inline bool errors() const { + return this->error.any_bits_set_anywhere(); + } -simdutf_warn_unused size_t implementation::convert_utf16le_to_utf8( - const char16_t *src, size_t len, char *dst) const noexcept { - result res = convert_utf16le_to_utf8_with_errors(src, len, dst); - return res.error == error_code::SUCCESS ? res.count : 0; -} +}; // struct utf8_checker +} // namespace utf8_to_utf32 +} // unnamed namespace +} // namespace lsx +} // namespace simdutf +/* end file src/generic/utf8_to_utf32/utf8_to_utf32.h */ -simdutf_warn_unused size_t implementation::convert_utf16be_to_utf8( - const char16_t *src, size_t len, char *dst) const noexcept { - result res = convert_utf16be_to_utf8_with_errors(src, len, dst); - return res.error == error_code::SUCCESS ? res.count : 0; -} -simdutf_warn_unused result implementation::convert_utf16le_to_utf8_with_errors( - const char16_t *src, size_t len, char *dst) const noexcept { - return rvv_utf16_to_utf8_with_errors(src, len, dst); -} +// other functions +/* begin file src/generic/utf8.h */ -simdutf_warn_unused result implementation::convert_utf16be_to_utf8_with_errors( - const char16_t *src, size_t len, char *dst) const noexcept { - if (supports_zvbb()) - return rvv_utf16_to_utf8_with_errors(src, len, dst); - else - return rvv_utf16_to_utf8_with_errors(src, len, dst); -} +namespace simdutf { +namespace lsx { +namespace { +namespace utf8 { -simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_utf8( - const char16_t *src, size_t len, char *dst) const noexcept { - return convert_utf16le_to_utf8(src, len, dst); -} +using namespace simd; -simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_utf8( - const char16_t *src, size_t len, char *dst) const noexcept { - return convert_utf16be_to_utf8(src, len, dst); +simdutf_really_inline size_t count_code_points(const char *in, size_t size) { + size_t pos = 0; + size_t count = 0; + for (; pos + 64 <= size; pos += 64) { + simd8x64 input(reinterpret_cast(in + pos)); + uint64_t utf8_continuation_mask = input.gt(-65); + count += count_ones(utf8_continuation_mask); + } + return count + scalar::utf8::count_code_points(in + pos, size - pos); } -template -simdutf_really_inline static result -rvv_utf16_to_utf32_with_errors(const char16_t *src, size_t len, char32_t *dst) { - const char16_t *const srcBeg = src; - char32_t *const dstBeg = dst; - - constexpr const uint16_t ANY_SURROGATE_MASK = 0xf800; - constexpr const uint16_t ANY_SURROGATE_VALUE = 0xd800; - constexpr const uint16_t LO_SURROGATE_MASK = 0xfc00; - constexpr const uint16_t LO_SURROGATE_VALUE = 0xdc00; - constexpr const uint16_t HI_SURROGATE_MASK = 0xfc00; - constexpr const uint16_t HI_SURROGATE_VALUE = 0xd800; - - uint16_t last = 0; - while (len > 0) { - size_t vl = __riscv_vsetvl_e16m2(len); - vuint16m2_t v0 = __riscv_vle16_v_u16m2((uint16_t const *)src, vl); - v0 = simdutf_byteflip(v0, vl); - - { // check fast-path - const vuint16m2_t v = __riscv_vand_vx_u16m2(v0, ANY_SURROGATE_MASK, vl); - const vbool8_t any_surrogate = - __riscv_vmseq_vx_u16m2_b8(v, ANY_SURROGATE_VALUE, vl); - if (__riscv_vfirst_m_b8(any_surrogate, vl) < 0) { - /* no surrogates */ - __riscv_vse32_v_u32m4((uint32_t *)dst, __riscv_vzext_vf2_u32m4(v0, vl), - vl); - len -= vl; - src += vl; - dst += vl; - continue; - } - } - - if ((simdutf_byteflip(src[0]) & LO_SURROGATE_MASK) == - LO_SURROGATE_VALUE) { - return result(error_code::SURROGATE, src - srcBeg); - } +simdutf_really_inline size_t utf16_length_from_utf8(const char *in, + size_t size) { + size_t pos = 0; + size_t count = 0; + // This algorithm could no doubt be improved! + for (; pos + 64 <= size; pos += 64) { + simd8x64 input(reinterpret_cast(in + pos)); + uint64_t utf8_continuation_mask = input.lt(-65 + 1); + // We count one word for anything that is not a continuation (so + // leading bytes). + count += 64 - count_ones(utf8_continuation_mask); + int64_t utf8_4byte = input.gteq_unsigned(240); + count += count_ones(utf8_4byte); + } + return count + scalar::utf8::utf16_length_from_utf8(in + pos, size - pos); +} +} // namespace utf8 +} // unnamed namespace +} // namespace lsx +} // namespace simdutf +/* end file src/generic/utf8.h */ +/* begin file src/generic/utf16.h */ +namespace simdutf { +namespace lsx { +namespace { +namespace utf16 { - // decode surrogates - vuint16m2_t v1 = __riscv_vslide1down_vx_u16m2(v0, 0, vl); - vl = __riscv_vsetvl_e16m2(vl - 1); - if (vl == 0) { - return result(error_code::SURROGATE, src - srcBeg); +template +simdutf_really_inline size_t count_code_points(const char16_t *in, + size_t size) { + size_t pos = 0; + size_t count = 0; + for (; pos < size / 32 * 32; pos += 32) { + simd16x32 input(reinterpret_cast(in + pos)); + if (!match_system(big_endian)) { + input.swap_bytes(); } + uint64_t not_pair = input.not_in_range(0xDC00, 0xDFFF); + count += count_ones(not_pair) / 2; + } + return count + + scalar::utf16::count_code_points(in + pos, size - pos); +} - const vbool8_t surhi = __riscv_vmseq_vx_u16m2_b8( - __riscv_vand_vx_u16m2(v0, HI_SURROGATE_MASK, vl), HI_SURROGATE_VALUE, - vl); - const vbool8_t surlo = __riscv_vmseq_vx_u16m2_b8( - __riscv_vand_vx_u16m2(v1, LO_SURROGATE_MASK, vl), LO_SURROGATE_VALUE, - vl); - - // compress everything but lo surrogates - const vbool8_t compress = __riscv_vmsne_vx_u16m2_b8( - __riscv_vand_vx_u16m2(v0, LO_SURROGATE_MASK, vl), LO_SURROGATE_VALUE, - vl); - - { - const vbool8_t diff = __riscv_vmxor_mm_b8(surhi, surlo, vl); - const long idx = __riscv_vfirst_m_b8(diff, vl); - if (idx >= 0) { - uint16_t word = simdutf_byteflip(src[idx]); - if (word < 0xD800 || word > 0xDBFF) { - return result(error_code::SURROGATE, src - srcBeg + idx + 1); - } - return result(error_code::SURROGATE, src - srcBeg + idx); - } +template +simdutf_really_inline size_t utf8_length_from_utf16(const char16_t *in, + size_t size) { + size_t pos = 0; + size_t count = 0; + // This algorithm could no doubt be improved! + for (; pos < size / 32 * 32; pos += 32) { + simd16x32 input(reinterpret_cast(in + pos)); + if (!match_system(big_endian)) { + input.swap_bytes(); } + uint64_t ascii_mask = input.lteq(0x7F); + uint64_t twobyte_mask = input.lteq(0x7FF); + uint64_t not_pair_mask = input.not_in_range(0xD800, 0xDFFF); - last = simdutf_byteflip(src[vl]); - vuint32m4_t utf32 = __riscv_vzext_vf2_u32m4(v0, vl); - - // v0 = 110110yyyyyyyyyy (0xd800 + yyyyyyyyyy) --- hi surrogate - // v1 = 110111xxxxxxxxxx (0xdc00 + xxxxxxxxxx) --- lo surrogate - - // t0 = u16( 0000_00yy_yyyy_yyyy) - const vuint32m4_t t0 = - __riscv_vzext_vf2_u32m4(__riscv_vand_vx_u16m2(v0, 0x03ff, vl), vl); - // t1 = u32(0000_0000_0000_yyyy_yyyy_yy00_0000_0000) - const vuint32m4_t t1 = __riscv_vsll_vx_u32m4(t0, 10, vl); + size_t ascii_count = count_ones(ascii_mask) / 2; + size_t twobyte_count = count_ones(twobyte_mask & ~ascii_mask) / 2; + size_t threebyte_count = count_ones(not_pair_mask & ~twobyte_mask) / 2; + size_t fourbyte_count = 32 - count_ones(not_pair_mask) / 2; + count += 2 * fourbyte_count + 3 * threebyte_count + 2 * twobyte_count + + ascii_count; + } + return count + scalar::utf16::utf8_length_from_utf16(in + pos, + size - pos); +} - // t2 = u32(0000_0000_0000_0000_0000_00xx_xxxx_xxxx) - const vuint32m4_t t2 = - __riscv_vzext_vf2_u32m4(__riscv_vand_vx_u16m2(v1, 0x03ff, vl), vl); +template +simdutf_really_inline size_t utf32_length_from_utf16(const char16_t *in, + size_t size) { + return count_code_points(in, size); +} - // t3 = u32(0000_0000_0000_yyyy_yyyy_yyxx_xxxx_xxxx) - const vuint32m4_t t3 = __riscv_vor_vv_u32m4(t1, t2, vl); +simdutf_really_inline void +change_endianness_utf16(const char16_t *in, size_t size, char16_t *output) { + size_t pos = 0; - // t4 = utf32 from surrogate pairs - const vuint32m4_t t4 = __riscv_vadd_vx_u32m4(t3, 0x10000, vl); + while (pos < size / 32 * 32) { + simd16x32 input(reinterpret_cast(in + pos)); + input.swap_bytes(); + input.store(reinterpret_cast(output)); + pos += 32; + output += 32; + } - const vuint32m4_t result = __riscv_vmerge_vvm_u32m4(utf32, t4, surhi, vl); + scalar::utf16::change_endianness_utf16(in + pos, size - pos, output); +} - const vuint32m4_t comp = __riscv_vcompress_vm_u32m4(result, compress, vl); - const size_t vlOut = __riscv_vcpop_m_b8(compress, vl); - __riscv_vse32_v_u32m4((uint32_t *)dst, comp, vlOut); +} // namespace utf16 +} // unnamed namespace +} // namespace lsx +} // namespace simdutf +/* end file src/generic/utf16.h */ - len -= vl; - src += vl; - dst += vlOut; +// +// Implementation-specific overrides +// +namespace simdutf { +namespace lsx { - if ((last & LO_SURROGATE_MASK) == LO_SURROGATE_VALUE) { - // last item is lo surrogate and got already consumed - len -= 1; - src += 1; +simdutf_warn_unused int +implementation::detect_encodings(const char *input, + size_t length) const noexcept { + // If there is a BOM, then we trust it. + auto bom_encoding = simdutf::BOM::check_bom(input, length); + // todo: reimplement as a one-pass algorithm. + if (bom_encoding != encoding_type::unspecified) { + return bom_encoding; + } + int out = 0; + if (validate_utf8(input, length)) { + out |= encoding_type::UTF8; + } + if ((length % 2) == 0) { + if (validate_utf16le(reinterpret_cast(input), + length / 2)) { + out |= encoding_type::UTF16_LE; } } - - return result(error_code::SUCCESS, dst - dstBeg); + if ((length % 4) == 0) { + if (validate_utf32(reinterpret_cast(input), length / 4)) { + out |= encoding_type::UTF32_LE; + } + } + return out; } -simdutf_warn_unused size_t implementation::convert_utf16le_to_utf32( - const char16_t *src, size_t len, char32_t *dst) const noexcept { - result res = convert_utf16le_to_utf32_with_errors(src, len, dst); - return res.error == error_code::SUCCESS ? res.count : 0; +simdutf_warn_unused bool +implementation::validate_utf8(const char *buf, size_t len) const noexcept { + return lsx::utf8_validation::generic_validate_utf8(buf, len); } -simdutf_warn_unused size_t implementation::convert_utf16be_to_utf32( - const char16_t *src, size_t len, char32_t *dst) const noexcept { - result res = convert_utf16be_to_utf32_with_errors(src, len, dst); - return res.error == error_code::SUCCESS ? res.count : 0; +simdutf_warn_unused result implementation::validate_utf8_with_errors( + const char *buf, size_t len) const noexcept { + return lsx::utf8_validation::generic_validate_utf8_with_errors(buf, len); } -simdutf_warn_unused result implementation::convert_utf16le_to_utf32_with_errors( - const char16_t *src, size_t len, char32_t *dst) const noexcept { - return rvv_utf16_to_utf32_with_errors(src, len, dst); +simdutf_warn_unused bool +implementation::validate_ascii(const char *buf, size_t len) const noexcept { + return lsx::utf8_validation::generic_validate_ascii(buf, len); } -simdutf_warn_unused result implementation::convert_utf16be_to_utf32_with_errors( - const char16_t *src, size_t len, char32_t *dst) const noexcept { - if (supports_zvbb()) - return rvv_utf16_to_utf32_with_errors(src, len, - dst); - else - return rvv_utf16_to_utf32_with_errors(src, len, dst); +simdutf_warn_unused result implementation::validate_ascii_with_errors( + const char *buf, size_t len) const noexcept { + return lsx::utf8_validation::generic_validate_ascii_with_errors(buf, len); } -simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_utf32( - const char16_t *src, size_t len, char32_t *dst) const noexcept { - return convert_utf16le_to_utf32(src, len, dst); +simdutf_warn_unused bool +implementation::validate_utf16le(const char16_t *buf, + size_t len) const noexcept { + if (simdutf_unlikely(len == 0)) { + // empty input is valid. protected the implementation from nullptr. + return true; + } + const char16_t *tail = lsx_validate_utf16(buf, len); + if (tail) { + return scalar::utf16::validate(tail, + len - (tail - buf)); + } else { + return false; + } } -simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_utf32( - const char16_t *src, size_t len, char32_t *dst) const noexcept { - return convert_utf16be_to_utf32(src, len, dst); +simdutf_warn_unused bool +implementation::validate_utf16be(const char16_t *buf, + size_t len) const noexcept { + if (simdutf_unlikely(len == 0)) { + // empty input is valid. protected the implementation from nullptr. + return true; + } + const char16_t *tail = lsx_validate_utf16(buf, len); + if (tail) { + return scalar::utf16::validate(tail, len - (tail - buf)); + } else { + return false; + } } -/* end file src/rvv/rvv_utf16_to.inl.cpp */ -/* begin file src/rvv/rvv_utf32_to.inl.cpp */ -simdutf_warn_unused size_t implementation::convert_utf32_to_latin1( - const char32_t *src, size_t len, char *dst) const noexcept { - result res = convert_utf32_to_latin1_with_errors(src, len, dst); - return res.error == error_code::SUCCESS ? res.count : 0; +simdutf_warn_unused result implementation::validate_utf16le_with_errors( + const char16_t *buf, size_t len) const noexcept { + if (simdutf_unlikely(len == 0)) { + return result(error_code::SUCCESS, 0); + } + result res = lsx_validate_utf16_with_errors(buf, len); + if (res.count != len) { + result scalar_res = scalar::utf16::validate_with_errors( + buf + res.count, len - res.count); + return result(scalar_res.error, res.count + scalar_res.count); + } else { + return res; + } } -simdutf_warn_unused result implementation::convert_utf32_to_latin1_with_errors( - const char32_t *src, size_t len, char *dst) const noexcept { - const char32_t *const beg = src; - for (size_t vl; len > 0; len -= vl, src += vl, dst += vl) { - vl = __riscv_vsetvl_e32m8(len); - vuint32m8_t v = __riscv_vle32_v_u32m8((uint32_t *)src, vl); - long idx = __riscv_vfirst_m_b4(__riscv_vmsgtu_vx_u32m8_b4(v, 255, vl), vl); - if (idx >= 0) - return result(error_code::TOO_LARGE, src - beg + idx); - /* We don't use vcompress here, because its performance varies widely on - * current platforms. This might be worth reconsidering once there is more - * hardware available. */ - __riscv_vse8_v_u8m2( - (uint8_t *)dst, - __riscv_vncvt_x_x_w_u8m2(__riscv_vncvt_x_x_w_u16m4(v, vl), vl), vl); +simdutf_warn_unused result implementation::validate_utf16be_with_errors( + const char16_t *buf, size_t len) const noexcept { + if (simdutf_unlikely(len == 0)) { + return result(error_code::SUCCESS, 0); + } + result res = lsx_validate_utf16_with_errors(buf, len); + if (res.count != len) { + result scalar_res = scalar::utf16::validate_with_errors( + buf + res.count, len - res.count); + return result(scalar_res.error, res.count + scalar_res.count); + } else { + return res; } - return result(error_code::SUCCESS, src - beg); } -simdutf_warn_unused size_t implementation::convert_valid_utf32_to_latin1( - const char32_t *src, size_t len, char *dst) const noexcept { - return convert_utf32_to_latin1(src, len, dst); +simdutf_warn_unused bool +implementation::validate_utf32(const char32_t *buf, size_t len) const noexcept { + if (simdutf_unlikely(len == 0)) { + // empty input is valid. protected the implementation from nullptr. + return true; + } + const char32_t *tail = lsx_validate_utf32le(buf, len); + if (tail) { + return scalar::utf32::validate(tail, len - (tail - buf)); + } else { + return false; + } } -simdutf_warn_unused result implementation::convert_utf32_to_utf8_with_errors( - const char32_t *src, size_t len, char *dst) const noexcept { - size_t n = len; - const char32_t *srcBeg = src; - const char *dstBeg = dst; - size_t vl8m4 = __riscv_vsetvlmax_e8m4(); - vbool2_t m4mulp2 = __riscv_vmseq_vx_u8m4_b2( - __riscv_vand_vx_u8m4(__riscv_vid_v_u8m4(vl8m4), 3, vl8m4), 2, vl8m4); - - for (size_t vl, vlOut; n > 0;) { - vl = __riscv_vsetvl_e32m4(n); - - vuint32m4_t v = __riscv_vle32_v_u32m4((uint32_t const *)src, vl); - vbool8_t m234 = __riscv_vmsgtu_vx_u32m4_b8(v, 0x80 - 1, vl); - vuint16m2_t vn = __riscv_vncvt_x_x_w_u16m2(v, vl); - - if (__riscv_vfirst_m_b8(m234, vl) < 0) { /* 1 byte utf8 */ - vlOut = vl; - __riscv_vse8_v_u8m1((uint8_t *)dst, __riscv_vncvt_x_x_w_u8m1(vn, vlOut), - vlOut); - n -= vl, src += vl, dst += vlOut; - continue; - } - - vbool8_t m34 = __riscv_vmsgtu_vx_u32m4_b8(v, 0x800 - 1, vl); - - if (__riscv_vfirst_m_b8(m34, vl) < 0) { /* 1/2 byte utf8 */ - /* 0: [ aaa|aabbbbbb] - * 1: [aabbbbbb| ] vsll 8 - * 2: [ | aaaaa] vsrl 6 - * 3: [00111111|00111111] - * 4: [ bbbbbb|000aaaaa] (1|2)&3 - * 5: [10000000|11000000] - * 6: [10bbbbbb|110aaaaa] 4|5 */ - vuint16m2_t twoByte = __riscv_vand_vx_u16m2( - __riscv_vor_vv_u16m2(__riscv_vsll_vx_u16m2(vn, 8, vl), - __riscv_vsrl_vx_u16m2(vn, 6, vl), vl), - 0b0011111100111111, vl); - vuint16m2_t vout16 = - __riscv_vor_vx_u16m2_mu(m234, vn, twoByte, 0b1000000011000000, vl); - vuint8m2_t vout = __riscv_vreinterpret_v_u16m2_u8m2(vout16); - - /* Every high byte that is zero should be compressed - * low bytes should never be compressed, so we set them - * to all ones, and then create a non-zero bytes mask */ - vbool4_t mcomp = - __riscv_vmsne_vx_u8m2_b4(__riscv_vreinterpret_v_u16m2_u8m2( - __riscv_vor_vx_u16m2(vout16, 0xFF, vl)), - 0, vl * 2); - vlOut = __riscv_vcpop_m_b4(mcomp, vl * 2); - - vout = __riscv_vcompress_vm_u8m2(vout, mcomp, vl * 2); - __riscv_vse8_v_u8m2((uint8_t *)dst, vout, vlOut); - - n -= vl, src += vl, dst += vlOut; - continue; - } - long idx1 = - __riscv_vfirst_m_b8(__riscv_vmsgtu_vx_u32m4_b8(v, 0x10FFFF, vl), vl); - vbool8_t sur = __riscv_vmseq_vx_u32m4_b8( - __riscv_vand_vx_u32m4(v, 0xFFFFF800, vl), 0xD800, vl); - long idx2 = __riscv_vfirst_m_b8(sur, vl); - if (idx1 >= 0 && idx2 >= 0) { - if (idx1 <= idx2) { - return result(error_code::TOO_LARGE, src - srcBeg + idx1); - } else { - return result(error_code::SURROGATE, src - srcBeg + idx2); - } - } - if (idx1 >= 0) { - return result(error_code::TOO_LARGE, src - srcBeg + idx1); - } - if (idx2 >= 0) { - return result(error_code::SURROGATE, src - srcBeg + idx2); - } - - vbool8_t m4 = __riscv_vmsgtu_vx_u32m4_b8(v, 0x10000 - 1, vl); - long first = __riscv_vfirst_m_b8(m4, vl); - size_t tail = vl - first; - vl = first < 0 ? vl : first; - - if (vl > 0) { /* 1/2/3 byte utf8 */ - /* vn: [aaaabbbb|bbcccccc] - * v1: [0bcccccc| ] vsll 8 - * v1: [10cccccc| ] vsll 8 & 0b00111111 | 0b10000000 - * v2: [ |110bbbbb] vsrl 6 & 0b00111111 | 0b11000000 - * v2: [ |10bbbbbb] vsrl 6 & 0b00111111 | 0b10000000 - * v3: [ |1110aaaa] vsrl 12 | 0b11100000 - * 1: [00000000|0bcccccc|00000000|00000000] => [0bcccccc] - * 2: [00000000|10cccccc|110bbbbb|00000000] => [110bbbbb] [10cccccc] - * 3: [00000000|10cccccc|10bbbbbb|1110aaaa] => [1110aaaa] [10bbbbbb] - * [10cccccc] - */ - vuint16m2_t v1, v2, v3, v12; - v1 = __riscv_vor_vx_u16m2_mu( - m234, vn, __riscv_vand_vx_u16m2(vn, 0b00111111, vl), 0b10000000, vl); - v1 = __riscv_vsll_vx_u16m2(v1, 8, vl); - - v2 = __riscv_vor_vx_u16m2( - __riscv_vand_vx_u16m2(__riscv_vsrl_vx_u16m2(vn, 6, vl), 0b00111111, - vl), - 0b10000000, vl); - v2 = __riscv_vor_vx_u16m2_mu(__riscv_vmnot_m_b8(m34, vl), v2, v2, - 0b01000000, vl); - v3 = __riscv_vor_vx_u16m2(__riscv_vsrl_vx_u16m2(vn, 12, vl), 0b11100000, - vl); - v12 = __riscv_vor_vv_u16m2_mu(m234, v1, v1, v2, vl); - - vuint32m4_t w12 = __riscv_vwmulu_vx_u32m4(v12, 1 << 8, vl); - vuint32m4_t w123 = __riscv_vwaddu_wv_u32m4_mu(m34, w12, w12, v3, vl); - vuint8m4_t vout = __riscv_vreinterpret_v_u32m4_u8m4(w123); +simdutf_warn_unused result implementation::validate_utf32_with_errors( + const char32_t *buf, size_t len) const noexcept { + if (simdutf_unlikely(len == 0)) { + return result(error_code::SUCCESS, 0); + } + result res = lsx_validate_utf32le_with_errors(buf, len); + if (res.count != len) { + result scalar_res = + scalar::utf32::validate_with_errors(buf + res.count, len - res.count); + return result(scalar_res.error, res.count + scalar_res.count); + } else { + return res; + } +} - vbool2_t mcomp = __riscv_vmor_mm_b2( - m4mulp2, __riscv_vmsne_vx_u8m4_b2(vout, 0, vl * 4), vl * 4); - vlOut = __riscv_vcpop_m_b2(mcomp, vl * 4); +simdutf_warn_unused size_t implementation::convert_latin1_to_utf8( + const char *buf, size_t len, char *utf8_output) const noexcept { + std::pair ret = + lsx_convert_latin1_to_utf8(buf, len, utf8_output); + size_t converted_chars = ret.second - utf8_output; - vout = __riscv_vcompress_vm_u8m4(vout, mcomp, vl * 4); - __riscv_vse8_v_u8m4((uint8_t *)dst, vout, vlOut); + if (ret.first != buf + len) { + const size_t scalar_converted_chars = scalar::latin1_to_utf8::convert( + ret.first, len - (ret.first - buf), ret.second); + converted_chars += scalar_converted_chars; + } + return converted_chars; +} - n -= vl, src += vl, dst += vlOut; - } +simdutf_warn_unused size_t implementation::convert_latin1_to_utf16le( + const char *buf, size_t len, char16_t *utf16_output) const noexcept { + std::pair ret = + lsx_convert_latin1_to_utf16le(buf, len, utf16_output); + size_t converted_chars = ret.second - utf16_output; + if (ret.first != buf + len) { + const size_t scalar_converted_chars = + scalar::latin1_to_utf16::convert( + ret.first, len - (ret.first - buf), ret.second); + converted_chars += scalar_converted_chars; + } + return converted_chars; +} - if (tail) - while (n) { - uint32_t word = src[0]; - if (word < 0x10000) - break; - if (word > 0x10FFFF) - return result(error_code::TOO_LARGE, src - srcBeg); - *dst++ = (uint8_t)((word >> 18) | 0b11110000); - *dst++ = (uint8_t)(((word >> 12) & 0b111111) | 0b10000000); - *dst++ = (uint8_t)(((word >> 6) & 0b111111) | 0b10000000); - *dst++ = (uint8_t)((word & 0b111111) | 0b10000000); - ++src; - --n; - } +simdutf_warn_unused size_t implementation::convert_latin1_to_utf16be( + const char *buf, size_t len, char16_t *utf16_output) const noexcept { + std::pair ret = + lsx_convert_latin1_to_utf16be(buf, len, utf16_output); + size_t converted_chars = ret.second - utf16_output; + if (ret.first != buf + len) { + const size_t scalar_converted_chars = + scalar::latin1_to_utf16::convert( + ret.first, len - (ret.first - buf), ret.second); + converted_chars += scalar_converted_chars; } + return converted_chars; +} - return result(error_code::SUCCESS, dst - dstBeg); +simdutf_warn_unused size_t implementation::convert_latin1_to_utf32( + const char *buf, size_t len, char32_t *utf32_output) const noexcept { + std::pair ret = + lsx_convert_latin1_to_utf32(buf, len, utf32_output); + size_t converted_chars = ret.second - utf32_output; + if (ret.first != buf + len) { + const size_t scalar_converted_chars = scalar::latin1_to_utf32::convert( + ret.first, len - (ret.first - buf), ret.second); + converted_chars += scalar_converted_chars; + } + return converted_chars; } -simdutf_warn_unused size_t implementation::convert_utf32_to_utf8( - const char32_t *src, size_t len, char *dst) const noexcept { - result res = convert_utf32_to_utf8_with_errors(src, len, dst); - return res.error == error_code::SUCCESS ? res.count : 0; +simdutf_warn_unused size_t implementation::convert_utf8_to_latin1( + const char *buf, size_t len, char *latin1_output) const noexcept { + utf8_to_latin1::validating_transcoder converter; + return converter.convert(buf, len, latin1_output); } -simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf8( - const char32_t *src, size_t len, char *dst) const noexcept { - return convert_utf32_to_utf8(src, len, dst); +simdutf_warn_unused result implementation::convert_utf8_to_latin1_with_errors( + const char *buf, size_t len, char *latin1_output) const noexcept { + utf8_to_latin1::validating_transcoder converter; + return converter.convert_with_errors(buf, len, latin1_output); } -template -simdutf_really_inline static result -rvv_convert_utf32_to_utf16_with_errors(const char32_t *src, size_t len, - char16_t *dst) { - size_t vl8m2 = __riscv_vsetvlmax_e8m2(); - vbool4_t m4even = __riscv_vmseq_vx_u8m2_b4( - __riscv_vand_vx_u8m2(__riscv_vid_v_u8m2(vl8m2), 1, vl8m2), 0, vl8m2); - const char16_t *dstBeg = dst; - const char32_t *srcBeg = src; - for (size_t vl, vlOut; len > 0; len -= vl, src += vl, dst += vlOut) { - vl = __riscv_vsetvl_e32m4(len); - vuint32m4_t v = __riscv_vle32_v_u32m4((uint32_t *)src, vl); - vuint32m4_t off = __riscv_vadd_vx_u32m4(v, 0xFFFF2000, vl); - long idx1 = - __riscv_vfirst_m_b8(__riscv_vmsgtu_vx_u32m4_b8(v, 0x10FFFF, vl), vl); - long idx2 = __riscv_vfirst_m_b8( - __riscv_vmsgtu_vx_u32m4_b8(off, 0xFFFFF7FF, vl), vl); - if (idx1 >= 0 && idx2 >= 0) { - if (idx1 <= idx2) - return result(error_code::TOO_LARGE, src - srcBeg + idx1); - return result(error_code::SURROGATE, src - srcBeg + idx2); - } - if (idx1 >= 0) - return result(error_code::TOO_LARGE, src - srcBeg + idx1); - if (idx2 >= 0) - return result(error_code::SURROGATE, src - srcBeg + idx2); - long idx = - __riscv_vfirst_m_b8(__riscv_vmsgtu_vx_u32m4_b8(v, 0xFFFF, vl), vl); - if (idx < 0) { - vlOut = vl; - vuint16m2_t n = - simdutf_byteflip(__riscv_vncvt_x_x_w_u16m2(v, vlOut), vlOut); - __riscv_vse16_v_u16m2((uint16_t *)dst, n, vlOut); - continue; - } - vlOut = rvv_utf32_store_utf16_m4((uint16_t *)dst, v, vl, m4even); - } - return result(error_code::SUCCESS, dst - dstBeg); +simdutf_warn_unused size_t implementation::convert_valid_utf8_to_latin1( + const char *buf, size_t len, char *latin1_output) const noexcept { + return lsx::utf8_to_latin1::convert_valid(buf, len, latin1_output); } -simdutf_warn_unused size_t implementation::convert_utf32_to_utf16le( - const char32_t *src, size_t len, char16_t *dst) const noexcept { - result res = convert_utf32_to_utf16le_with_errors(src, len, dst); - return res.error == error_code::SUCCESS ? res.count : 0; +simdutf_warn_unused size_t implementation::convert_utf8_to_utf16le( + const char *buf, size_t len, char16_t *utf16_output) const noexcept { + utf8_to_utf16::validating_transcoder converter; + return converter.convert(buf, len, utf16_output); } -simdutf_warn_unused size_t implementation::convert_utf32_to_utf16be( - const char32_t *src, size_t len, char16_t *dst) const noexcept { - result res = convert_utf32_to_utf16be_with_errors(src, len, dst); - return res.error == error_code::SUCCESS ? res.count : 0; +simdutf_warn_unused size_t implementation::convert_utf8_to_utf16be( + const char *buf, size_t len, char16_t *utf16_output) const noexcept { + utf8_to_utf16::validating_transcoder converter; + return converter.convert(buf, len, utf16_output); } -simdutf_warn_unused result implementation::convert_utf32_to_utf16le_with_errors( - const char32_t *src, size_t len, char16_t *dst) const noexcept { - return rvv_convert_utf32_to_utf16_with_errors( - src, len, dst); +simdutf_warn_unused result implementation::convert_utf8_to_utf16le_with_errors( + const char *buf, size_t len, char16_t *utf16_output) const noexcept { + utf8_to_utf16::validating_transcoder converter; + return converter.convert_with_errors(buf, len, + utf16_output); } -simdutf_warn_unused result implementation::convert_utf32_to_utf16be_with_errors( - const char32_t *src, size_t len, char16_t *dst) const noexcept { - if (supports_zvbb()) - return rvv_convert_utf32_to_utf16_with_errors( - src, len, dst); - else - return rvv_convert_utf32_to_utf16_with_errors(src, len, - dst); +simdutf_warn_unused result implementation::convert_utf8_to_utf16be_with_errors( + const char *buf, size_t len, char16_t *utf16_output) const noexcept { + utf8_to_utf16::validating_transcoder converter; + return converter.convert_with_errors(buf, len, utf16_output); } -template -simdutf_really_inline static size_t -rvv_convert_valid_utf32_to_utf16(const char32_t *src, size_t len, - char16_t *dst) { - size_t vl8m2 = __riscv_vsetvlmax_e8m2(); - vbool4_t m4even = __riscv_vmseq_vx_u8m2_b4( - __riscv_vand_vx_u8m2(__riscv_vid_v_u8m2(vl8m2), 1, vl8m2), 0, vl8m2); - char16_t *dstBeg = dst; - for (size_t vl, vlOut; len > 0; len -= vl, src += vl, dst += vlOut) { - vl = __riscv_vsetvl_e32m4(len); - vuint32m4_t v = __riscv_vle32_v_u32m4((uint32_t *)src, vl); - if (__riscv_vfirst_m_b8(__riscv_vmsgtu_vx_u32m4_b8(v, 0xFFFF, vl), vl) < - 0) { - vlOut = vl; - vuint16m2_t n = - simdutf_byteflip(__riscv_vncvt_x_x_w_u16m2(v, vlOut), vlOut); - __riscv_vse16_v_u16m2((uint16_t *)dst, n, vlOut); - continue; - } - vlOut = rvv_utf32_store_utf16_m4((uint16_t *)dst, v, vl, m4even); - } - return dst - dstBeg; +simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf16le( + const char *input, size_t size, char16_t *utf16_output) const noexcept { + return utf8_to_utf16::convert_valid(input, size, + utf16_output); } -simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf16le( - const char32_t *src, size_t len, char16_t *dst) const noexcept { - return rvv_convert_valid_utf32_to_utf16(src, len, - dst); +simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf16be( + const char *input, size_t size, char16_t *utf16_output) const noexcept { + return utf8_to_utf16::convert_valid(input, size, + utf16_output); } -simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf16be( - const char32_t *src, size_t len, char16_t *dst) const noexcept { - if (supports_zvbb()) - return rvv_convert_valid_utf32_to_utf16(src, len, - dst); - else - return rvv_convert_valid_utf32_to_utf16(src, len, dst); +simdutf_warn_unused size_t implementation::convert_utf8_to_utf32( + const char *buf, size_t len, char32_t *utf32_output) const noexcept { + utf8_to_utf32::validating_transcoder converter; + return converter.convert(buf, len, utf32_output); } -/* end file src/rvv/rvv_utf32_to.inl.cpp */ -/* begin file src/rvv/rvv_utf8_to.inl.cpp */ -template -simdutf_really_inline static size_t rvv_utf8_to_common(char const *src, - size_t len, Tdst *dst) { - static_assert(std::is_same() || - std::is_same(), - "invalid type"); - constexpr bool is16 = std::is_same(); - constexpr endianness endian = - bflip == simdutf_ByteFlip::NONE ? endianness::LITTLE : endianness::BIG; - const auto scalar = [](char const *in, size_t count, Tdst *out) { - return is16 ? scalar::utf8_to_utf16::convert(in, count, - (char16_t *)out) - : scalar::utf8_to_utf32::convert(in, count, (char32_t *)out); - }; - if (len < 32) - return scalar(src, len, dst); +simdutf_warn_unused result implementation::convert_utf8_to_utf32_with_errors( + const char *buf, size_t len, char32_t *utf32_output) const noexcept { + utf8_to_utf32::validating_transcoder converter; + return converter.convert_with_errors(buf, len, utf32_output); +} - /* validate first three bytes */ - if (validate) { - size_t idx = 3; - while (idx < len && (src[idx] >> 6) == 0b10) - ++idx; - if (idx > 3 + 3 || !scalar::utf8::validate(src, idx)) +simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf32( + const char *input, size_t size, char32_t *utf32_output) const noexcept { + return utf8_to_utf32::convert_valid(input, size, utf32_output); +} + +simdutf_warn_unused size_t implementation::convert_utf16le_to_latin1( + const char16_t *buf, size_t len, char *latin1_output) const noexcept { + std::pair ret = + lsx_convert_utf16_to_latin1(buf, len, latin1_output); + if (ret.first == nullptr) { + return 0; + } + size_t saved_bytes = ret.second - latin1_output; + + if (ret.first != buf + len) { + const size_t scalar_saved_bytes = + scalar::utf16_to_latin1::convert( + ret.first, len - (ret.first - buf), ret.second); + if (scalar_saved_bytes == 0) { return 0; + } + saved_bytes += scalar_saved_bytes; } + return saved_bytes; +} - size_t tail = 3; - size_t n = len - tail; - Tdst *beg = dst; +simdutf_warn_unused size_t implementation::convert_utf16be_to_latin1( + const char16_t *buf, size_t len, char *latin1_output) const noexcept { + std::pair ret = + lsx_convert_utf16_to_latin1(buf, len, latin1_output); + if (ret.first == nullptr) { + return 0; + } + size_t saved_bytes = ret.second - latin1_output; - static const uint64_t err1m[] = {0x0202020202020202, 0x4915012180808080}; - static const uint64_t err2m[] = {0xCBCBCB8B8383A3E7, 0xCBCBDBCBCBCBCBCB}; - static const uint64_t err3m[] = {0x0101010101010101, 0X01010101BABAAEE6}; + if (ret.first != buf + len) { + const size_t scalar_saved_bytes = + scalar::utf16_to_latin1::convert( + ret.first, len - (ret.first - buf), ret.second); + if (scalar_saved_bytes == 0) { + return 0; + } + saved_bytes += scalar_saved_bytes; + } + return saved_bytes; +} - const vuint8m1_t err1tbl = - __riscv_vreinterpret_v_u64m1_u8m1(__riscv_vle64_v_u64m1(err1m, 2)); - const vuint8m1_t err2tbl = - __riscv_vreinterpret_v_u64m1_u8m1(__riscv_vle64_v_u64m1(err2m, 2)); - const vuint8m1_t err3tbl = - __riscv_vreinterpret_v_u64m1_u8m1(__riscv_vle64_v_u64m1(err3m, 2)); +simdutf_warn_unused result +implementation::convert_utf16le_to_latin1_with_errors( + const char16_t *buf, size_t len, char *latin1_output) const noexcept { + std::pair ret = + lsx_convert_utf16_to_latin1_with_errors( + buf, len, latin1_output); + if (ret.first.error) { + return ret.first; + } // Can return directly since scalar fallback already found correct + // ret.first.count + if (ret.first.count != len) { // All good so far, but not finished + result scalar_res = + scalar::utf16_to_latin1::convert_with_errors( + buf + ret.first.count, len - ret.first.count, ret.second); + if (scalar_res.error) { + scalar_res.count += ret.first.count; + return scalar_res; + } else { + ret.second += scalar_res.count; + } + } + ret.first.count = + ret.second - + latin1_output; // Set count to the number of 8-bit code units written + return ret.first; +} - size_t vl8m2 = __riscv_vsetvlmax_e8m2(); - vbool4_t m4even = __riscv_vmseq_vx_u8m2_b4( - __riscv_vand_vx_u8m2(__riscv_vid_v_u8m2(vl8m2), 1, vl8m2), 0, vl8m2); +simdutf_warn_unused result +implementation::convert_utf16be_to_latin1_with_errors( + const char16_t *buf, size_t len, char *latin1_output) const noexcept { + std::pair ret = + lsx_convert_utf16_to_latin1_with_errors(buf, len, + latin1_output); + if (ret.first.error) { + return ret.first; + } // Can return directly since scalar fallback already found correct + // ret.first.count + if (ret.first.count != len) { // All good so far, but not finished + result scalar_res = + scalar::utf16_to_latin1::convert_with_errors( + buf + ret.first.count, len - ret.first.count, ret.second); + if (scalar_res.error) { + scalar_res.count += ret.first.count; + return scalar_res; + } else { + ret.second += scalar_res.count; + } + } + ret.first.count = + ret.second - + latin1_output; // Set count to the number of 8-bit code units written + return ret.first; +} - for (size_t vl, vlOut; n > 0; n -= vl, src += vl, dst += vlOut) { - vl = __riscv_vsetvl_e8m2(n); +simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_latin1( + const char16_t *buf, size_t len, char *latin1_output) const noexcept { + // optimization opportunity: implement a custom function. + return convert_utf16be_to_latin1(buf, len, latin1_output); +} - vuint8m2_t v0 = __riscv_vle8_v_u8m2((uint8_t const *)src, vl); - uint64_t max = __riscv_vmv_x_s_u8m1_u8( - __riscv_vredmaxu_vs_u8m2_u8m1(v0, __riscv_vmv_s_x_u8m1(0, vl), vl)); +simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_latin1( + const char16_t *buf, size_t len, char *latin1_output) const noexcept { + // optimization opportunity: implement a custom function. + return convert_utf16le_to_latin1(buf, len, latin1_output); +} - uint8_t next0 = src[vl + 0]; - uint8_t next1 = src[vl + 1]; - uint8_t next2 = src[vl + 2]; +simdutf_warn_unused size_t implementation::convert_utf16le_to_utf8( + const char16_t *buf, size_t len, char *utf8_output) const noexcept { + std::pair ret = + lsx_convert_utf16_to_utf8(buf, len, utf8_output); + if (ret.first == nullptr) { + return 0; + } + size_t saved_bytes = ret.second - utf8_output; + if (ret.first != buf + len) { + const size_t scalar_saved_bytes = + scalar::utf16_to_utf8::convert( + ret.first, len - (ret.first - buf), ret.second); + if (scalar_saved_bytes == 0) { + return 0; + } + saved_bytes += scalar_saved_bytes; + } + return saved_bytes; +} - /* fast path: ASCII */ - if ((max | next0 | next1 | next2) < 0b10000000) { - vlOut = vl; - if (is16) - __riscv_vse16_v_u16m4( - (uint16_t *)dst, - simdutf_byteflip(__riscv_vzext_vf2_u16m4(v0, vlOut), vlOut), - vlOut); - else - __riscv_vse32_v_u32m8((uint32_t *)dst, - __riscv_vzext_vf4_u32m8(v0, vlOut), vlOut); - continue; +simdutf_warn_unused size_t implementation::convert_utf16be_to_utf8( + const char16_t *buf, size_t len, char *utf8_output) const noexcept { + std::pair ret = + lsx_convert_utf16_to_utf8(buf, len, utf8_output); + if (ret.first == nullptr) { + return 0; + } + size_t saved_bytes = ret.second - utf8_output; + if (ret.first != buf + len) { + const size_t scalar_saved_bytes = + scalar::utf16_to_utf8::convert( + ret.first, len - (ret.first - buf), ret.second); + if (scalar_saved_bytes == 0) { + return 0; } + saved_bytes += scalar_saved_bytes; + } + return saved_bytes; +} - /* see "Validating UTF-8 In Less Than One Instruction Per Byte" - * https://arxiv.org/abs/2010.03090 */ - vuint8m2_t v1 = __riscv_vslide1down_vx_u8m2(v0, next0, vl); - vuint8m2_t v2 = __riscv_vslide1down_vx_u8m2(v1, next1, vl); - vuint8m2_t v3 = __riscv_vslide1down_vx_u8m2(v2, next2, vl); +simdutf_warn_unused result implementation::convert_utf16le_to_utf8_with_errors( + const char16_t *buf, size_t len, char *utf8_output) const noexcept { + // ret.first.count is always the position in the buffer, not the number of + // code units written even if finished + std::pair ret = + lsx_convert_utf16_to_utf8_with_errors(buf, len, + utf8_output); + if (ret.first.error) { + return ret.first; + } // Can return directly since scalar fallback already found correct + // ret.first.count + if (ret.first.count != len) { // All good so far, but not finished + result scalar_res = + scalar::utf16_to_utf8::convert_with_errors( + buf + ret.first.count, len - ret.first.count, ret.second); + if (scalar_res.error) { + scalar_res.count += ret.first.count; + return scalar_res; + } else { + ret.second += scalar_res.count; + } + } + ret.first.count = + ret.second - + utf8_output; // Set count to the number of 8-bit code units written + return ret.first; +} - if (validate) { - vuint8m2_t s1 = __riscv_vreinterpret_v_u16m2_u8m2(__riscv_vsrl_vx_u16m2( - __riscv_vreinterpret_v_u8m2_u16m2(v2), 4, __riscv_vsetvlmax_e16m2())); - vuint8m2_t s3 = __riscv_vreinterpret_v_u16m2_u8m2(__riscv_vsrl_vx_u16m2( - __riscv_vreinterpret_v_u8m2_u16m2(v3), 4, __riscv_vsetvlmax_e16m2())); +simdutf_warn_unused result implementation::convert_utf16be_to_utf8_with_errors( + const char16_t *buf, size_t len, char *utf8_output) const noexcept { + // ret.first.count is always the position in the buffer, not the number of + // code units written even if finished + std::pair ret = + lsx_convert_utf16_to_utf8_with_errors(buf, len, + utf8_output); + if (ret.first.error) { + return ret.first; + } // Can return directly since scalar fallback already found correct + // ret.first.count + if (ret.first.count != len) { // All good so far, but not finished + result scalar_res = + scalar::utf16_to_utf8::convert_with_errors( + buf + ret.first.count, len - ret.first.count, ret.second); + if (scalar_res.error) { + scalar_res.count += ret.first.count; + return scalar_res; + } else { + ret.second += scalar_res.count; + } + } + ret.first.count = + ret.second - + utf8_output; // Set count to the number of 8-bit code units written + return ret.first; +} - vuint8m2_t idx2 = __riscv_vand_vx_u8m2(v2, 0xF, vl); - vuint8m2_t idx1 = __riscv_vand_vx_u8m2(s1, 0xF, vl); - vuint8m2_t idx3 = __riscv_vand_vx_u8m2(s3, 0xF, vl); +simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_utf8( + const char16_t *buf, size_t len, char *utf8_output) const noexcept { + return convert_utf16le_to_utf8(buf, len, utf8_output); +} - vuint8m2_t err1 = simdutf_vrgather_u8m1x2(err1tbl, idx1); - vuint8m2_t err2 = simdutf_vrgather_u8m1x2(err2tbl, idx2); - vuint8m2_t err3 = simdutf_vrgather_u8m1x2(err3tbl, idx3); - vint8m2_t errs = __riscv_vreinterpret_v_u8m2_i8m2( - __riscv_vand_vv_u8m2(__riscv_vand_vv_u8m2(err1, err2, vl), err3, vl)); +simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_utf8( + const char16_t *buf, size_t len, char *utf8_output) const noexcept { + return convert_utf16be_to_utf8(buf, len, utf8_output); +} + +simdutf_warn_unused size_t implementation::convert_utf32_to_utf8( + const char32_t *buf, size_t len, char *utf8_output) const noexcept { + if (simdutf_unlikely(len == 0)) { + return 0; + } + std::pair ret = + lsx_convert_utf32_to_utf8(buf, len, utf8_output); + if (ret.first == nullptr) { + return 0; + } + size_t saved_bytes = ret.second - utf8_output; + if (ret.first != buf + len) { + const size_t scalar_saved_bytes = scalar::utf32_to_utf8::convert( + ret.first, len - (ret.first - buf), ret.second); + if (scalar_saved_bytes == 0) { + return 0; + } + saved_bytes += scalar_saved_bytes; + } + return saved_bytes; +} - vbool4_t is_3 = __riscv_vmsgtu_vx_u8m2_b4(v1, 0b11100000 - 1, vl); - vbool4_t is_4 = __riscv_vmsgtu_vx_u8m2_b4(v0, 0b11110000 - 1, vl); - vbool4_t is_34 = __riscv_vmor_mm_b4(is_3, is_4, vl); - vbool4_t err34 = - __riscv_vmxor_mm_b4(is_34, __riscv_vmslt_vx_i8m2_b4(errs, 0, vl), vl); - vbool4_t errm = - __riscv_vmor_mm_b4(__riscv_vmsgt_vx_i8m2_b4(errs, 0, vl), err34, vl); - if (__riscv_vfirst_m_b4(errm, vl) >= 0) - return 0; +simdutf_warn_unused result implementation::convert_utf32_to_utf8_with_errors( + const char32_t *buf, size_t len, char *utf8_output) const noexcept { + if (simdutf_unlikely(len == 0)) { + return result(error_code::SUCCESS, 0); + } + // ret.first.count is always the position in the buffer, not the number of + // code units written even if finished + std::pair ret = + lsx_convert_utf32_to_utf8_with_errors(buf, len, utf8_output); + if (ret.first.count != len) { + result scalar_res = scalar::utf32_to_utf8::convert_with_errors( + buf + ret.first.count, len - ret.first.count, ret.second); + if (scalar_res.error) { + scalar_res.count += ret.first.count; + return scalar_res; + } else { + ret.second += scalar_res.count; } + } + ret.first.count = + ret.second - + utf8_output; // Set count to the number of 8-bit code units written + return ret.first; +} - /* decoding */ +simdutf_warn_unused size_t implementation::convert_utf16le_to_utf32( + const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { + std::pair ret = + lsx_convert_utf16_to_utf32(buf, len, utf32_output); + if (ret.first == nullptr) { + return 0; + } + size_t saved_bytes = ret.second - utf32_output; + if (ret.first != buf + len) { + const size_t scalar_saved_bytes = + scalar::utf16_to_utf32::convert( + ret.first, len - (ret.first - buf), ret.second); + if (scalar_saved_bytes == 0) { + return 0; + } + saved_bytes += scalar_saved_bytes; + } + return saved_bytes; +} - /* mask of non continuation bytes */ - vbool4_t m = - __riscv_vmsgt_vx_i8m2_b4(__riscv_vreinterpret_v_u8m2_i8m2(v0), -65, vl); - vlOut = __riscv_vcpop_m_b4(m, vl); +simdutf_warn_unused size_t implementation::convert_utf16be_to_utf32( + const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { + std::pair ret = + lsx_convert_utf16_to_utf32(buf, len, utf32_output); + if (ret.first == nullptr) { + return 0; + } + size_t saved_bytes = ret.second - utf32_output; + if (ret.first != buf + len) { + const size_t scalar_saved_bytes = + scalar::utf16_to_utf32::convert( + ret.first, len - (ret.first - buf), ret.second); + if (scalar_saved_bytes == 0) { + return 0; + } + saved_bytes += scalar_saved_bytes; + } + return saved_bytes; +} - /* extract first and second bytes */ - vuint8m2_t b1 = __riscv_vcompress_vm_u8m2(v0, m, vl); - vuint8m2_t b2 = __riscv_vcompress_vm_u8m2(v1, m, vl); +simdutf_warn_unused result implementation::convert_utf16le_to_utf32_with_errors( + const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { + // ret.first.count is always the position in the buffer, not the number of + // code units written even if finished + std::pair ret = + lsx_convert_utf16_to_utf32_with_errors(buf, len, + utf32_output); + if (ret.first.error) { + return ret.first; + } // Can return directly since scalar fallback already found correct + // ret.first.count + if (ret.first.count != len) { // All good so far, but not finished + result scalar_res = + scalar::utf16_to_utf32::convert_with_errors( + buf + ret.first.count, len - ret.first.count, ret.second); + if (scalar_res.error) { + scalar_res.count += ret.first.count; + return scalar_res; + } else { + ret.second += scalar_res.count; + } + } + ret.first.count = + ret.second - + utf32_output; // Set count to the number of 8-bit code units written + return ret.first; +} - /* fast path: one and two byte */ - if (max < 0b11100000) { - b2 = __riscv_vand_vx_u8m2(b2, 0b00111111, vlOut); +simdutf_warn_unused result implementation::convert_utf16be_to_utf32_with_errors( + const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { + // ret.first.count is always the position in the buffer, not the number of + // code units written even if finished + std::pair ret = + lsx_convert_utf16_to_utf32_with_errors(buf, len, + utf32_output); + if (ret.first.error) { + return ret.first; + } // Can return directly since scalar fallback already found correct + // ret.first.count + if (ret.first.count != len) { // All good so far, but not finished + result scalar_res = + scalar::utf16_to_utf32::convert_with_errors( + buf + ret.first.count, len - ret.first.count, ret.second); + if (scalar_res.error) { + scalar_res.count += ret.first.count; + return scalar_res; + } else { + ret.second += scalar_res.count; + } + } + ret.first.count = + ret.second - + utf32_output; // Set count to the number of 8-bit code units written + return ret.first; +} - vbool4_t m1 = __riscv_vmsgtu_vx_u8m2_b4(b1, 0b10111111, vlOut); - b1 = __riscv_vand_vx_u8m2_mu(m1, b1, b1, 63, vlOut); +simdutf_warn_unused size_t implementation::convert_utf32_to_latin1( + const char32_t *buf, size_t len, char *latin1_output) const noexcept { + std::pair ret = + lsx_convert_utf32_to_latin1(buf, len, latin1_output); + if (ret.first == nullptr) { + return 0; + } + size_t saved_bytes = ret.second - latin1_output; - vuint16m4_t b12 = __riscv_vwmulu_vv_u16m4( - b1, - __riscv_vmerge_vxm_u8m2(__riscv_vmv_v_x_u8m2(1, vlOut), 1 << 6, m1, - vlOut), - vlOut); - b12 = __riscv_vwaddu_wv_u16m4_mu(m1, b12, b12, b2, vlOut); - if (is16) - __riscv_vse16_v_u16m4((uint16_t *)dst, - simdutf_byteflip(b12, vlOut), vlOut); - else - __riscv_vse32_v_u32m8((uint32_t *)dst, - __riscv_vzext_vf2_u32m8(b12, vlOut), vlOut); - continue; + if (ret.first != buf + len) { + const size_t scalar_saved_bytes = scalar::utf32_to_latin1::convert( + ret.first, len - (ret.first - buf), ret.second); + if (scalar_saved_bytes == 0) { + return 0; } + saved_bytes += scalar_saved_bytes; + } + return saved_bytes; +} - /* fast path: one, two and three byte */ - if (max < 0b11110000) { - vuint8m2_t b3 = __riscv_vcompress_vm_u8m2(v2, m, vl); +simdutf_warn_unused result implementation::convert_utf32_to_latin1_with_errors( + const char32_t *buf, size_t len, char *latin1_output) const noexcept { + std::pair ret = + lsx_convert_utf32_to_latin1_with_errors(buf, len, latin1_output); + if (ret.first.error) { + return ret.first; + } // Can return directly since scalar fallback already found correct + // ret.first.count + if (ret.first.count != len) { // All good so far, but not finished + result scalar_res = scalar::utf32_to_latin1::convert_with_errors( + buf + ret.first.count, len - ret.first.count, ret.second); + if (scalar_res.error) { + scalar_res.count += ret.first.count; + return scalar_res; + } else { + ret.second += scalar_res.count; + } + } + ret.first.count = + ret.second - + latin1_output; // Set count to the number of 8-bit code units written + return ret.first; +} - b2 = __riscv_vand_vx_u8m2(b2, 0b00111111, vlOut); - b3 = __riscv_vand_vx_u8m2(b3, 0b00111111, vlOut); +simdutf_warn_unused size_t implementation::convert_valid_utf32_to_latin1( + const char32_t *buf, size_t len, char *latin1_output) const noexcept { + std::pair ret = + lsx_convert_utf32_to_latin1(buf, len, latin1_output); + if (ret.first == nullptr) { + return 0; + } + size_t saved_bytes = ret.second - latin1_output; - vbool4_t m1 = __riscv_vmsgtu_vx_u8m2_b4(b1, 0b10111111, vlOut); - vbool4_t m3 = __riscv_vmsgtu_vx_u8m2_b4(b1, 0b11011111, vlOut); + if (ret.first != buf + len) { + const size_t scalar_saved_bytes = scalar::utf32_to_latin1::convert_valid( + ret.first, len - (ret.first - buf), ret.second); + saved_bytes += scalar_saved_bytes; + } + return saved_bytes; +} - vuint8m2_t t1 = __riscv_vand_vx_u8m2_mu(m1, b1, b1, 63, vlOut); - b1 = __riscv_vand_vx_u8m2_mu(m3, t1, b1, 15, vlOut); +simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf8( + const char32_t *buf, size_t len, char *utf8_output) const noexcept { + // optimization opportunity: implement a custom function. + return convert_utf32_to_utf8(buf, len, utf8_output); +} - vuint16m4_t b12 = __riscv_vwmulu_vv_u16m4( - b1, - __riscv_vmerge_vxm_u8m2(__riscv_vmv_v_x_u8m2(1, vlOut), 1 << 6, m1, - vlOut), - vlOut); - b12 = __riscv_vwaddu_wv_u16m4_mu(m1, b12, b12, b2, vlOut); - vuint16m4_t b123 = __riscv_vwaddu_wv_u16m4_mu( - m3, b12, __riscv_vsll_vx_u16m4_mu(m3, b12, b12, 6, vlOut), b3, vlOut); - if (is16) - __riscv_vse16_v_u16m4((uint16_t *)dst, - simdutf_byteflip(b123, vlOut), vlOut); - else - __riscv_vse32_v_u32m8((uint32_t *)dst, - __riscv_vzext_vf2_u32m8(b123, vlOut), vlOut); - continue; +simdutf_warn_unused size_t implementation::convert_utf32_to_utf16le( + const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { + std::pair ret = + lsx_convert_utf32_to_utf16(buf, len, utf16_output); + if (ret.first == nullptr) { + return 0; + } + size_t saved_bytes = ret.second - utf16_output; + if (ret.first != buf + len) { + const size_t scalar_saved_bytes = + scalar::utf32_to_utf16::convert( + ret.first, len - (ret.first - buf), ret.second); + if (scalar_saved_bytes == 0) { + return 0; } + saved_bytes += scalar_saved_bytes; + } - /* extract third and fourth bytes */ - vuint8m2_t b3 = __riscv_vcompress_vm_u8m2(v2, m, vl); - vuint8m2_t b4 = __riscv_vcompress_vm_u8m2(v3, m, vl); - - /* remove prefix from leading bytes - * - * We could also use vrgather here, but it increases register pressure, - * and its performance varies widely on current platforms. It might be - * worth reconsidering, though, once there is more hardware available. - * Same goes for the __riscv_vsrl_vv_u32m4 correction step. - * - * We shift left and then right by the number of bytes in the prefix, - * which can be calculated as follows: - * x max(x-10, 0) - * 0xxx -> 0000-0111 -> sift by 0 or 1 -> 0 - * 10xx -> 1000-1011 -> don't care - * 110x -> 1100,1101 -> sift by 3 -> 2,3 - * 1110 -> 1110 -> sift by 4 -> 4 - * 1111 -> 1111 -> sift by 5 -> 5 - * - * vssubu.vx v, 10, (max(x-10, 0)) almost gives us what we want, we - * just need to manually detect and handle the one special case: - */ -#define SIMDUTF_RVV_UTF8_TO_COMMON_M1(idx) \ - vuint8m1_t c1 = __riscv_vget_v_u8m2_u8m1(b1, idx); \ - vuint8m1_t c2 = __riscv_vget_v_u8m2_u8m1(b2, idx); \ - vuint8m1_t c3 = __riscv_vget_v_u8m2_u8m1(b3, idx); \ - vuint8m1_t c4 = __riscv_vget_v_u8m2_u8m1(b4, idx); \ - /* remove prefix from trailing bytes */ \ - c2 = __riscv_vand_vx_u8m1(c2, 0b00111111, vlOut); \ - c3 = __riscv_vand_vx_u8m1(c3, 0b00111111, vlOut); \ - c4 = __riscv_vand_vx_u8m1(c4, 0b00111111, vlOut); \ - vuint8m1_t shift = __riscv_vsrl_vx_u8m1(c1, 4, vlOut); \ - shift = __riscv_vmerge_vxm_u8m1(__riscv_vssubu_vx_u8m1(shift, 10, vlOut), 3, \ - __riscv_vmseq_vx_u8m1_b8(shift, 12, vlOut), \ - vlOut); \ - c1 = __riscv_vsll_vv_u8m1(c1, shift, vlOut); \ - c1 = __riscv_vsrl_vv_u8m1(c1, shift, vlOut); \ - /* unconditionally widen and combine to c1234 */ \ - vuint16m2_t c34 = __riscv_vwaddu_wv_u16m2( \ - __riscv_vwmulu_vx_u16m2(c3, 1 << 6, vlOut), c4, vlOut); \ - vuint16m2_t c12 = __riscv_vwaddu_wv_u16m2( \ - __riscv_vwmulu_vx_u16m2(c1, 1 << 6, vlOut), c2, vlOut); \ - vuint32m4_t c1234 = __riscv_vwaddu_wv_u32m4( \ - __riscv_vwmulu_vx_u32m4(c12, 1 << 12, vlOut), c34, vlOut); \ - /* derive required right-shift amount from `shift` to reduce \ - * c1234 to the required number of bytes */ \ - c1234 = __riscv_vsrl_vv_u32m4( \ - c1234, \ - __riscv_vzext_vf4_u32m4( \ - __riscv_vmul_vx_u8m1( \ - __riscv_vrsub_vx_u8m1(__riscv_vssubu_vx_u8m1(shift, 2, vlOut), \ - 3, vlOut), \ - 6, vlOut), \ - vlOut), \ - vlOut); \ - /* store result in desired format */ \ - if (is16) \ - vlDst = rvv_utf32_store_utf16_m4((uint16_t *)dst, c1234, vlOut, \ - m4even); \ - else \ - vlDst = vlOut, __riscv_vse32_v_u32m4((uint32_t *)dst, c1234, vlOut); - - /* Unrolling this manually reduces register pressure and allows - * us to terminate early. */ - { - size_t vlOutm2 = vlOut, vlDst; - vlOut = __riscv_vsetvl_e8m1(vlOut); - SIMDUTF_RVV_UTF8_TO_COMMON_M1(0) - if (vlOutm2 == vlOut) { - vlOut = vlDst; - continue; - } + return saved_bytes; +} - dst += vlDst; - vlOut = vlOutm2 - vlOut; - } - { - size_t vlDst; - SIMDUTF_RVV_UTF8_TO_COMMON_M1(1) - vlOut = vlDst; +simdutf_warn_unused size_t implementation::convert_utf32_to_utf16be( + const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { + std::pair ret = + lsx_convert_utf32_to_utf16(buf, len, utf16_output); + if (ret.first == nullptr) { + return 0; + } + size_t saved_bytes = ret.second - utf16_output; + if (ret.first != buf + len) { + const size_t scalar_saved_bytes = + scalar::utf32_to_utf16::convert( + ret.first, len - (ret.first - buf), ret.second); + if (scalar_saved_bytes == 0) { + return 0; } + saved_bytes += scalar_saved_bytes; + } + return saved_bytes; +} -#undef SIMDUTF_RVV_UTF8_TO_COMMON_M1 +simdutf_warn_unused result implementation::convert_utf32_to_utf16le_with_errors( + const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { + // ret.first.count is always the position in the buffer, not the number of + // code units written even if finished + std::pair ret = + lsx_convert_utf32_to_utf16_with_errors(buf, len, + utf16_output); + if (ret.first.count != len) { + result scalar_res = + scalar::utf32_to_utf16::convert_with_errors( + buf + ret.first.count, len - ret.first.count, ret.second); + if (scalar_res.error) { + scalar_res.count += ret.first.count; + return scalar_res; + } else { + ret.second += scalar_res.count; + } } + ret.first.count = + ret.second - + utf16_output; // Set count to the number of 8-bit code units written + return ret.first; +} - /* validate the last character and reparse it + tail */ - if (len > tail) { - if ((src[0] >> 6) == 0b10) - --dst; - while ((src[0] >> 6) == 0b10 && tail < len) - --src, ++tail; - if (is16) { - /* go back one more, when on high surrogate */ - if (simdutf_byteflip((uint16_t)dst[-1]) >= 0xD800 && - simdutf_byteflip((uint16_t)dst[-1]) <= 0xDBFF) - --dst; +simdutf_warn_unused result implementation::convert_utf32_to_utf16be_with_errors( + const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { + // ret.first.count is always the position in the buffer, not the number of + // code units written even if finished + std::pair ret = + lsx_convert_utf32_to_utf16_with_errors(buf, len, + utf16_output); + if (ret.first.count != len) { + result scalar_res = + scalar::utf32_to_utf16::convert_with_errors( + buf + ret.first.count, len - ret.first.count, ret.second); + if (scalar_res.error) { + scalar_res.count += ret.first.count; + return scalar_res; + } else { + ret.second += scalar_res.count; } } - size_t ret = scalar(src, tail, dst); - if (ret == 0) - return 0; - return (size_t)(dst - beg) + ret; + ret.first.count = + ret.second - + utf16_output; // Set count to the number of 8-bit code units written + return ret.first; } -simdutf_warn_unused size_t implementation::convert_utf8_to_latin1( - const char *src, size_t len, char *dst) const noexcept { - const char *beg = dst; - uint8_t last = 0; - for (size_t vl, vlOut; len > 0; - len -= vl, src += vl, dst += vlOut, last = src[-1]) { - vl = __riscv_vsetvl_e8m2(len); - vuint8m2_t v1 = __riscv_vle8_v_u8m2((uint8_t *)src, vl); - // check which bytes are ASCII - vbool4_t ascii = __riscv_vmsltu_vx_u8m2_b4(v1, 0b10000000, vl); - // count ASCII bytes - vlOut = __riscv_vcpop_m_b4(ascii, vl); - // The original code would only enter the next block after this check: - // vbool4_t m = __riscv_vmsltu_vx_u8m2_b4(v1, 0b11000000, vl); - // vlOut = __riscv_vcpop_m_b4(m, vl); - // if (vlOut != vl || last > 0b01111111) {...}q - // So that everything is ASCII or continuation bytes, we just proceeded - // without any processing, going straight to __riscv_vse8_v_u8m2. - // But you need the __riscv_vslide1up_vx_u8m2 whenever there is a non-ASCII - // byte. - if (vlOut != vl) { // If not pure ASCII - // Non-ASCII characters - // We now want to mark the ascii and continuation bytes - vbool4_t m = __riscv_vmsltu_vx_u8m2_b4(v1, 0b11000000, vl); - // We count them, that's our new vlOut (output vector length) - vlOut = __riscv_vcpop_m_b4(m, vl); +simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf16le( + const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { + return convert_utf32_to_utf16le(buf, len, utf16_output); +} - vuint8m2_t v0 = __riscv_vslide1up_vx_u8m2(v1, last, vl); +simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf16be( + const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { + return convert_utf32_to_utf16be(buf, len, utf16_output); +} - vbool4_t leading0 = __riscv_vmsgtu_vx_u8m2_b4(v0, 0b10111111, vl); - vbool4_t trailing1 = __riscv_vmslt_vx_i8m2_b4( - __riscv_vreinterpret_v_u8m2_i8m2(v1), (uint8_t)0b11000000, vl); - // -62 i 0b11000010, so we check whether any of v0 is too big - vbool4_t tobig = __riscv_vmand_mm_b4( - leading0, - __riscv_vmsgtu_vx_u8m2_b4(__riscv_vxor_vx_u8m2(v0, (uint8_t)-62, vl), - 1, vl), - vl); - if (__riscv_vfirst_m_b4( - __riscv_vmor_mm_b4( - tobig, __riscv_vmxor_mm_b4(leading0, trailing1, vl), vl), - vl) >= 0) - return 0; +simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_utf32( + const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { + return convert_utf16le_to_utf32(buf, len, utf32_output); +} - v1 = __riscv_vor_vx_u8m2_mu(__riscv_vmseq_vx_u8m2_b4(v0, 0b11000011, vl), - v1, v1, 0b01000000, vl); - v1 = __riscv_vcompress_vm_u8m2(v1, m, vl); - } else if (last >= 0b11000000) { // If last byte is a leading byte and we - // got only ASCII, error! - return 0; - } - __riscv_vse8_v_u8m2((uint8_t *)dst, v1, vlOut); - } - if (last > 0b10111111) - return 0; - return dst - beg; +simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_utf32( + const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { + return convert_utf16be_to_utf32(buf, len, utf32_output); } -simdutf_warn_unused result implementation::convert_utf8_to_latin1_with_errors( - const char *src, size_t len, char *dst) const noexcept { - size_t res = convert_utf8_to_latin1(src, len, dst); - if (res) - return result(error_code::SUCCESS, res); - return scalar::utf8_to_latin1::convert_with_errors(src, len, dst); +void implementation::change_endianness_utf16(const char16_t *input, + size_t length, + char16_t *output) const noexcept { + utf16::change_endianness_utf16(input, length, output); } -simdutf_warn_unused size_t implementation::convert_valid_utf8_to_latin1( - const char *src, size_t len, char *dst) const noexcept { - const char *beg = dst; - uint8_t last = 0; - for (size_t vl, vlOut; len > 0; - len -= vl, src += vl, dst += vlOut, last = src[-1]) { - vl = __riscv_vsetvl_e8m2(len); - vuint8m2_t v1 = __riscv_vle8_v_u8m2((uint8_t *)src, vl); - vbool4_t ascii = __riscv_vmsltu_vx_u8m2_b4(v1, 0b10000000, vl); - vlOut = __riscv_vcpop_m_b4(ascii, vl); - if (vlOut != vl) { // If not pure ASCII - vbool4_t m = __riscv_vmsltu_vx_u8m2_b4(v1, 0b11000000, vl); - vlOut = __riscv_vcpop_m_b4(m, vl); - vuint8m2_t v0 = __riscv_vslide1up_vx_u8m2(v1, last, vl); - v1 = __riscv_vor_vx_u8m2_mu(__riscv_vmseq_vx_u8m2_b4(v0, 0b11000011, vl), - v1, v1, 0b01000000, vl); - v1 = __riscv_vcompress_vm_u8m2(v1, m, vl); - } - __riscv_vse8_v_u8m2((uint8_t *)dst, v1, vlOut); - } - return dst - beg; +simdutf_warn_unused size_t implementation::count_utf16le( + const char16_t *input, size_t length) const noexcept { + return utf16::count_code_points(input, length); +} + +simdutf_warn_unused size_t implementation::count_utf16be( + const char16_t *input, size_t length) const noexcept { + return utf16::count_code_points(input, length); +} + +simdutf_warn_unused size_t +implementation::count_utf8(const char *input, size_t length) const noexcept { + return utf8::count_code_points(input, length); } -simdutf_warn_unused size_t implementation::convert_utf8_to_utf16le( - const char *src, size_t len, char16_t *dst) const noexcept { - return rvv_utf8_to_common(src, len, - (uint16_t *)dst); +simdutf_warn_unused size_t implementation::latin1_length_from_utf8( + const char *buf, size_t len) const noexcept { + return count_utf8(buf, len); } -simdutf_warn_unused size_t implementation::convert_utf8_to_utf16be( - const char *src, size_t len, char16_t *dst) const noexcept { - if (supports_zvbb()) - return rvv_utf8_to_common( - src, len, (uint16_t *)dst); - else - return rvv_utf8_to_common(src, len, - (uint16_t *)dst); +simdutf_warn_unused size_t +implementation::latin1_length_from_utf16(size_t length) const noexcept { + return length; } -simdutf_warn_unused result implementation::convert_utf8_to_utf16le_with_errors( - const char *src, size_t len, char16_t *dst) const noexcept { - size_t res = convert_utf8_to_utf16le(src, len, dst); - if (res) - return result(error_code::SUCCESS, res); - return scalar::utf8_to_utf16::convert_with_errors( - src, len, dst); +simdutf_warn_unused size_t +implementation::latin1_length_from_utf32(size_t length) const noexcept { + return length; } -simdutf_warn_unused result implementation::convert_utf8_to_utf16be_with_errors( - const char *src, size_t len, char16_t *dst) const noexcept { - size_t res = convert_utf8_to_utf16be(src, len, dst); - if (res) - return result(error_code::SUCCESS, res); - return scalar::utf8_to_utf16::convert_with_errors(src, len, - dst); +simdutf_warn_unused size_t implementation::utf8_length_from_latin1( + const char *input, size_t length) const noexcept { + const uint8_t *data = reinterpret_cast(input); + const uint8_t *data_end = data + length; + uint64_t result = 0; + while (data + 16 < data_end) { + uint64_t two_bytes = 0; + __m128i input_vec = __lsx_vld(data, 0); + two_bytes = + __lsx_vpickve2gr_hu(__lsx_vpcnt_h(__lsx_vmskltz_b(input_vec)), 0); + result += 16 + two_bytes; + data += 16; + } + return result + scalar::latin1::utf8_length_from_latin1((const char *)data, + data_end - data); } -simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf16le( - const char *src, size_t len, char16_t *dst) const noexcept { - return rvv_utf8_to_common( - src, len, (uint16_t *)dst); +simdutf_warn_unused size_t implementation::utf8_length_from_utf16le( + const char16_t *input, size_t length) const noexcept { + return utf16::utf8_length_from_utf16(input, length); } -simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf16be( - const char *src, size_t len, char16_t *dst) const noexcept { - if (supports_zvbb()) - return rvv_utf8_to_common( - src, len, (uint16_t *)dst); - else - return rvv_utf8_to_common( - src, len, (uint16_t *)dst); +simdutf_warn_unused size_t implementation::utf8_length_from_utf16be( + const char16_t *input, size_t length) const noexcept { + return utf16::utf8_length_from_utf16(input, length); } -simdutf_warn_unused size_t implementation::convert_utf8_to_utf32( - const char *src, size_t len, char32_t *dst) const noexcept { - return rvv_utf8_to_common(src, len, - (uint32_t *)dst); +simdutf_warn_unused size_t +implementation::utf16_length_from_latin1(size_t length) const noexcept { + return length; } -simdutf_warn_unused result implementation::convert_utf8_to_utf32_with_errors( - const char *src, size_t len, char32_t *dst) const noexcept { - size_t res = convert_utf8_to_utf32(src, len, dst); - if (res) - return result(error_code::SUCCESS, res); - return scalar::utf8_to_utf32::convert_with_errors(src, len, dst); +simdutf_warn_unused size_t +implementation::utf32_length_from_latin1(size_t length) const noexcept { + return length; } -simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf32( - const char *src, size_t len, char32_t *dst) const noexcept { - return rvv_utf8_to_common( - src, len, (uint32_t *)dst); +simdutf_warn_unused size_t implementation::utf32_length_from_utf16le( + const char16_t *input, size_t length) const noexcept { + return utf16::utf32_length_from_utf16(input, length); } -/* end file src/rvv/rvv_utf8_to.inl.cpp */ -simdutf_warn_unused int -implementation::detect_encodings(const char *input, - size_t length) const noexcept { - // If there is a BOM, then we trust it. - auto bom_encoding = simdutf::BOM::check_bom(input, length); - if (bom_encoding != encoding_type::unspecified) - return bom_encoding; - // todo: reimplement as a one-pass algorithm. - int out = 0; - if (validate_utf8(input, length)) - out |= encoding_type::UTF8; - if (length % 2 == 0) { - if (validate_utf16(reinterpret_cast(input), length / 2)) - out |= encoding_type::UTF16_LE; - } - if (length % 4 == 0) { - if (validate_utf32(reinterpret_cast(input), length / 4)) - out |= encoding_type::UTF32_LE; - } +simdutf_warn_unused size_t implementation::utf32_length_from_utf16be( + const char16_t *input, size_t length) const noexcept { + return utf16::utf32_length_from_utf16(input, length); +} - return out; +simdutf_warn_unused size_t implementation::utf16_length_from_utf8( + const char *input, size_t length) const noexcept { + return utf8::utf16_length_from_utf8(input, length); } -template -simdutf_really_inline static void -rvv_change_endianness_utf16(const char16_t *src, size_t len, char16_t *dst) { - for (size_t vl; len > 0; len -= vl, src += vl, dst += vl) { - vl = __riscv_vsetvl_e16m8(len); - vuint16m8_t v = __riscv_vle16_v_u16m8((uint16_t *)src, vl); - __riscv_vse16_v_u16m8((uint16_t *)dst, simdutf_byteflip(v, vl), vl); +simdutf_warn_unused size_t implementation::utf8_length_from_utf32( + const char32_t *input, size_t length) const noexcept { + const __m128i v_80 = __lsx_vrepli_w(0x80); /*0x00000080*/ + const __m128i v_800 = __lsx_vldi(-3832); /*0x00000800*/ + const __m128i v_10000 = __lsx_vldi(-3583); /*0x00010000*/ + size_t pos = 0; + size_t count = 0; + for (; pos + 4 <= length; pos += 4) { + __m128i in = __lsx_vld(reinterpret_cast(input + pos), 0); + const __m128i ascii_bytes_bytemask = __lsx_vslt_w(in, v_80); + const __m128i one_two_bytes_bytemask = __lsx_vslt_w(in, v_800); + const __m128i two_bytes_bytemask = + __lsx_vxor_v(one_two_bytes_bytemask, ascii_bytes_bytemask); + const __m128i three_bytes_bytemask = + __lsx_vxor_v(__lsx_vslt_w(in, v_10000), one_two_bytes_bytemask); + + const uint32_t ascii_bytes_count = __lsx_vpickve2gr_bu( + __lsx_vpcnt_b(__lsx_vmskltz_w(ascii_bytes_bytemask)), 0); + const uint32_t two_bytes_count = __lsx_vpickve2gr_bu( + __lsx_vpcnt_b(__lsx_vmskltz_w(two_bytes_bytemask)), 0); + const uint32_t three_bytes_count = __lsx_vpickve2gr_bu( + __lsx_vpcnt_b(__lsx_vmskltz_w(three_bytes_bytemask)), 0); + + count += + 16 - 3 * ascii_bytes_count - 2 * two_bytes_count - three_bytes_count; + } + return count + + scalar::utf32::utf8_length_from_utf32(input + pos, length - pos); +} + +simdutf_warn_unused size_t implementation::utf16_length_from_utf32( + const char32_t *input, size_t length) const noexcept { + const __m128i v_ffff = __lsx_vldi(-2304); /*0x0000ffff*/ + size_t pos = 0; + size_t count = 0; + for (; pos + 4 <= length; pos += 4) { + __m128i in = __lsx_vld(reinterpret_cast(input + pos), 0); + const __m128i surrogate_bytemask = __lsx_vslt_wu(v_ffff, in); + size_t surrogate_count = __lsx_vpickve2gr_bu( + __lsx_vpcnt_b(__lsx_vmskltz_w(surrogate_bytemask)), 0); + count += 4 + surrogate_count; } + return count + + scalar::utf32::utf16_length_from_utf32(input + pos, length - pos); } -void implementation::change_endianness_utf16(const char16_t *src, size_t len, - char16_t *dst) const noexcept { - if (supports_zvbb()) - return rvv_change_endianness_utf16(src, len, dst); - else - return rvv_change_endianness_utf16(src, len, dst); +simdutf_warn_unused size_t implementation::utf32_length_from_utf8( + const char *input, size_t length) const noexcept { + return utf8::count_code_points(input, length); } simdutf_warn_unused size_t implementation::maximal_binary_length_from_base64( @@ -34982,86 +50218,45 @@ simdutf_warn_unused size_t implementation::maximal_binary_length_from_base64( simdutf_warn_unused result implementation::base64_to_binary( const char *input, size_t length, char *output, base64_options options, last_chunk_handling_options last_chunk_options) const noexcept { - while (length > 0 && - scalar::base64::is_ascii_white_space(input[length - 1])) { - length--; - } - size_t equallocation = - length; // location of the first padding character if any - size_t equalsigns = 0; - if (length > 0 && input[length - 1] == '=') { - equallocation = length - 1; - length -= 1; - equalsigns++; - while (length > 0 && - scalar::base64::is_ascii_white_space(input[length - 1])) { - length--; - } - if (length > 0 && input[length - 1] == '=') { - equallocation = length - 1; - equalsigns++; - length -= 1; - } - } - if (length == 0) { - if (equalsigns > 0) { - return {INVALID_BASE64_CHARACTER, equallocation}; + if (options & base64_url) { + if (options == base64_options::base64_url_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, options, + last_chunk_options); } - return {SUCCESS, 0}; - } - result r = scalar::base64::base64_tail_decode( - output, input, length, equalsigns, options, last_chunk_options); - if (last_chunk_options != stop_before_partial && - r.error == error_code::SUCCESS && equalsigns > 0) { - // additional checks - if ((r.count % 3 == 0) || ((r.count % 3) + 1 + equalsigns != 4)) { - return {INVALID_BASE64_CHARACTER, equallocation}; + } else { + if (options == base64_options::base64_default_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, + options, last_chunk_options); } } - return r; } simdutf_warn_unused full_result implementation::base64_to_binary_details( const char *input, size_t length, char *output, base64_options options, last_chunk_handling_options last_chunk_options) const noexcept { - while (length > 0 && - scalar::base64::is_ascii_white_space(input[length - 1])) { - length--; - } - size_t equallocation = - length; // location of the first padding character if any - size_t equalsigns = 0; - if (length > 0 && input[length - 1] == '=') { - equallocation = length - 1; - length -= 1; - equalsigns++; - while (length > 0 && - scalar::base64::is_ascii_white_space(input[length - 1])) { - length--; - } - if (length > 0 && input[length - 1] == '=') { - equallocation = length - 1; - equalsigns++; - length -= 1; - } - } - if (length == 0) { - if (equalsigns > 0) { - return {INVALID_BASE64_CHARACTER, equallocation, 0}; + if (options & base64_url) { + if (options == base64_options::base64_url_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, options, + last_chunk_options); } - return {SUCCESS, 0, 0}; - } - full_result r = scalar::base64::base64_tail_decode( - output, input, length, equalsigns, options, last_chunk_options); - if (last_chunk_options != stop_before_partial && - r.error == error_code::SUCCESS && equalsigns > 0) { - // additional checks - if ((r.output_count % 3 == 0) || - ((r.output_count % 3) + 1 + equalsigns != 4)) { - return {INVALID_BASE64_CHARACTER, equallocation, r.output_count}; + } else { + if (options == base64_options::base64_default_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, + options, last_chunk_options); } } - return r; } simdutf_warn_unused size_t implementation::maximal_binary_length_from_base64( @@ -35072,86 +50267,45 @@ simdutf_warn_unused size_t implementation::maximal_binary_length_from_base64( simdutf_warn_unused result implementation::base64_to_binary( const char16_t *input, size_t length, char *output, base64_options options, last_chunk_handling_options last_chunk_options) const noexcept { - while (length > 0 && - scalar::base64::is_ascii_white_space(input[length - 1])) { - length--; - } - size_t equallocation = - length; // location of the first padding character if any - auto equalsigns = 0; - if (length > 0 && input[length - 1] == '=') { - equallocation = length - 1; - length -= 1; - equalsigns++; - while (length > 0 && - scalar::base64::is_ascii_white_space(input[length - 1])) { - length--; - } - if (length > 0 && input[length - 1] == '=') { - equallocation = length - 1; - equalsigns++; - length -= 1; - } - } - if (length == 0) { - if (equalsigns > 0) { - return {INVALID_BASE64_CHARACTER, equallocation}; + if (options & base64_url) { + if (options == base64_options::base64_url_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, options, + last_chunk_options); } - return {SUCCESS, 0}; - } - result r = scalar::base64::base64_tail_decode( - output, input, length, equalsigns, options, last_chunk_options); - if (last_chunk_options != stop_before_partial && - r.error == error_code::SUCCESS && equalsigns > 0) { - // additional checks - if ((r.count % 3 == 0) || ((r.count % 3) + 1 + equalsigns != 4)) { - return {INVALID_BASE64_CHARACTER, equallocation}; + } else { + if (options == base64_options::base64_default_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, + options, last_chunk_options); } } - return r; } simdutf_warn_unused full_result implementation::base64_to_binary_details( const char16_t *input, size_t length, char *output, base64_options options, last_chunk_handling_options last_chunk_options) const noexcept { - while (length > 0 && - scalar::base64::is_ascii_white_space(input[length - 1])) { - length--; - } - size_t equallocation = - length; // location of the first padding character if any - size_t equalsigns = 0; - if (length > 0 && input[length - 1] == '=') { - equallocation = length - 1; - length -= 1; - equalsigns++; - while (length > 0 && - scalar::base64::is_ascii_white_space(input[length - 1])) { - length--; - } - if (length > 0 && input[length - 1] == '=') { - equallocation = length - 1; - equalsigns++; - length -= 1; - } - } - if (length == 0) { - if (equalsigns > 0) { - return {INVALID_BASE64_CHARACTER, equallocation, 0}; + if (options & base64_url) { + if (options == base64_options::base64_url_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, options, + last_chunk_options); } - return {SUCCESS, 0, 0}; - } - full_result r = scalar::base64::base64_tail_decode( - output, input, length, equalsigns, options, last_chunk_options); - if (last_chunk_options != stop_before_partial && - r.error == error_code::SUCCESS && equalsigns > 0) { - // additional checks - if ((r.output_count % 3 == 0) || - ((r.output_count % 3) + 1 + equalsigns != 4)) { - return {INVALID_BASE64_CHARACTER, equallocation, r.output_count}; + } else { + if (options == base64_options::base64_default_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, + options, last_chunk_options); } } - return r; } simdutf_warn_unused size_t implementation::base64_length_from_binary( @@ -35162,148 +50316,148 @@ simdutf_warn_unused size_t implementation::base64_length_from_binary( size_t implementation::binary_to_base64(const char *input, size_t length, char *output, base64_options options) const noexcept { - return scalar::base64::tail_encode_base64(output, input, length, options); + if (options & base64_url) { + return encode_base64(output, input, length, options); + } else { + return encode_base64(output, input, length, options); + } } -} // namespace rvv +} // namespace lsx } // namespace simdutf -/* begin file src/simdutf/rvv/end.h */ -#if SIMDUTF_CAN_ALWAYS_RUN_RVV -// nothing needed. -#else -SIMDUTF_UNTARGET_REGION -#endif - -/* end file src/simdutf/rvv/end.h */ -/* end file src/rvv/implementation.cpp */ -#endif -#if SIMDUTF_IMPLEMENTATION_WESTMERE -/* begin file src/westmere/implementation.cpp */ -/* begin file src/simdutf/westmere/begin.h */ -// redefining SIMDUTF_IMPLEMENTATION to "westmere" -// #define SIMDUTF_IMPLEMENTATION westmere - -#if SIMDUTF_CAN_ALWAYS_RUN_WESTMERE -// nothing needed. -#else -SIMDUTF_TARGET_WESTMERE +/* begin file src/simdutf/lsx/end.h */ +/* end file src/simdutf/lsx/end.h */ +/* end file src/lsx/implementation.cpp */ #endif -/* end file src/simdutf/westmere/begin.h */ +#if SIMDUTF_IMPLEMENTATION_LASX +/* begin file src/lasx/implementation.cpp */ +/* begin file src/simdutf/lasx/begin.h */ +// redefining SIMDUTF_IMPLEMENTATION to "lasx" +// #define SIMDUTF_IMPLEMENTATION lasx +/* end file src/simdutf/lasx/begin.h */ namespace simdutf { -namespace westmere { +namespace lasx { namespace { -#ifndef SIMDUTF_WESTMERE_H - #error "westmere.h must be included" +#ifndef SIMDUTF_LASX_H + #error "lasx.h must be included" #endif using namespace simd; +// convert vmskltz/vmskgez/vmsknz to +// simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes index +const uint8_t lasx_1_2_utf8_bytes_mask[] = { + 0, 1, 4, 5, 16, 17, 20, 21, 64, 65, 68, 69, 80, 81, 84, + 85, 2, 3, 6, 7, 18, 19, 22, 23, 66, 67, 70, 71, 82, 83, + 86, 87, 8, 9, 12, 13, 24, 25, 28, 29, 72, 73, 76, 77, 88, + 89, 92, 93, 10, 11, 14, 15, 26, 27, 30, 31, 74, 75, 78, 79, + 90, 91, 94, 95, 32, 33, 36, 37, 48, 49, 52, 53, 96, 97, 100, + 101, 112, 113, 116, 117, 34, 35, 38, 39, 50, 51, 54, 55, 98, 99, + 102, 103, 114, 115, 118, 119, 40, 41, 44, 45, 56, 57, 60, 61, 104, + 105, 108, 109, 120, 121, 124, 125, 42, 43, 46, 47, 58, 59, 62, 63, + 106, 107, 110, 111, 122, 123, 126, 127, 128, 129, 132, 133, 144, 145, 148, + 149, 192, 193, 196, 197, 208, 209, 212, 213, 130, 131, 134, 135, 146, 147, + 150, 151, 194, 195, 198, 199, 210, 211, 214, 215, 136, 137, 140, 141, 152, + 153, 156, 157, 200, 201, 204, 205, 216, 217, 220, 221, 138, 139, 142, 143, + 154, 155, 158, 159, 202, 203, 206, 207, 218, 219, 222, 223, 160, 161, 164, + 165, 176, 177, 180, 181, 224, 225, 228, 229, 240, 241, 244, 245, 162, 163, + 166, 167, 178, 179, 182, 183, 226, 227, 230, 231, 242, 243, 246, 247, 168, + 169, 172, 173, 184, 185, 188, 189, 232, 233, 236, 237, 248, 249, 252, 253, + 170, 171, 174, 175, 186, 187, 190, 191, 234, 235, 238, 239, 250, 251, 254, + 255}; + +simdutf_really_inline __m128i lsx_swap_bytes(__m128i vec) { + return __lsx_vshuf4i_b(vec, 0b10110001); +} +simdutf_really_inline __m256i lasx_swap_bytes(__m256i vec) { + return __lasx_xvshuf4i_b(vec, 0b10110001); +} + simdutf_really_inline bool is_ascii(const simd8x64 &input) { - return input.reduce_or().is_ascii(); + return input.is_ascii(); } simdutf_unused simdutf_really_inline simd8 must_be_continuation(const simd8 prev1, const simd8 prev2, const simd8 prev3) { - simd8 is_second_byte = - prev1.saturating_sub(0b11000000u - 1); // Only 11______ will be > 0 - simd8 is_third_byte = - prev2.saturating_sub(0b11100000u - 1); // Only 111_____ will be > 0 - simd8 is_fourth_byte = - prev3.saturating_sub(0b11110000u - 1); // Only 1111____ will be > 0 - // Caller requires a bool (all 1's). All values resulting from the subtraction - // will be <= 64, so signed comparison is fine. - return simd8(is_second_byte | is_third_byte | is_fourth_byte) > - int8_t(0); + simd8 is_second_byte = prev1 >= uint8_t(0b11000000u); + simd8 is_third_byte = prev2 >= uint8_t(0b11100000u); + simd8 is_fourth_byte = prev3 >= uint8_t(0b11110000u); + // Use ^ instead of | for is_*_byte, because ^ is commutative, and the caller + // is using ^ as well. This will work fine because we only have to report + // errors for cases with 0-1 lead bytes. Multiple lead bytes implies 2 + // overlapping multibyte characters, and if that happens, there is guaranteed + // to be at least *one* lead byte that is part of only 1 other multibyte + // character. The error will be detected there. + return is_second_byte ^ is_third_byte ^ is_fourth_byte; } simdutf_really_inline simd8 must_be_2_3_continuation(const simd8 prev2, const simd8 prev3) { - simd8 is_third_byte = - prev2.saturating_sub(0xe0u - 0x80); // Only 111_____ will be >= 0x80 - simd8 is_fourth_byte = - prev3.saturating_sub(0xf0u - 0x80); // Only 1111____ will be >= 0x80 - return simd8(is_third_byte | is_fourth_byte); + simd8 is_third_byte = prev2 >= uint8_t(0b11100000u); + simd8 is_fourth_byte = prev3 >= uint8_t(0b11110000u); + return is_third_byte ^ is_fourth_byte; } -/* begin file src/westmere/internal/loader.cpp */ -namespace internal { -namespace westmere { - -/* begin file src/westmere/internal/write_v_u16_11bits_to_utf8.cpp */ -/* - * reads a vector of uint16 values - * bits after 11th are ignored - * first 11 bits are encoded into utf8 - * !important! utf8_output must have at least 16 writable bytes - */ - -inline void write_v_u16_11bits_to_utf8(const __m128i v_u16, char *&utf8_output, - const __m128i one_byte_bytemask, - const uint16_t one_byte_bitmask) { - // 0b1100_0000_1000_0000 - const __m128i v_c080 = _mm_set1_epi16((int16_t)0xc080); - // 0b0001_1111_0000_0000 - const __m128i v_1f00 = _mm_set1_epi16((int16_t)0x1f00); - // 0b0000_0000_0011_1111 - const __m128i v_003f = _mm_set1_epi16((int16_t)0x003f); - - // 1. prepare 2-byte values - // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8 - // expected output : [110a|aaaa|10bb|bbbb] x 8 - - // t0 = [000a|aaaa|bbbb|bb00] - const __m128i t0 = _mm_slli_epi16(v_u16, 2); - // t1 = [000a|aaaa|0000|0000] - const __m128i t1 = _mm_and_si128(t0, v_1f00); - // t2 = [0000|0000|00bb|bbbb] - const __m128i t2 = _mm_and_si128(v_u16, v_003f); - // t3 = [000a|aaaa|00bb|bbbb] - const __m128i t3 = _mm_or_si128(t1, t2); - // t4 = [110a|aaaa|10bb|bbbb] - const __m128i t4 = _mm_or_si128(t3, v_c080); - - // 2. merge ASCII and 2-byte codewords - const __m128i utf8_unpacked = _mm_blendv_epi8(t4, v_u16, one_byte_bytemask); - - // 3. prepare bitmask for 8-bit lookup - // one_byte_bitmask = hhggffeeddccbbaa -- the bits are doubled (h - MSB, a - // - LSB) - const uint16_t m0 = one_byte_bitmask & 0x5555; // m0 = 0h0g0f0e0d0c0b0a - const uint16_t m1 = static_cast(m0 >> 7); // m1 = 00000000h0g0f0e0 - const uint8_t m2 = static_cast((m0 | m1) & 0xff); // m2 = hdgcfbea - // 4. pack the bytes - const uint8_t *row = - &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[m2][0]; - const __m128i shuffle = _mm_loadu_si128((__m128i *)(row + 1)); - const __m128i utf8_packed = _mm_shuffle_epi8(utf8_unpacked, shuffle); - - // 5. store bytes - _mm_storeu_si128((__m128i *)utf8_output, utf8_packed); +// common functions for utf8 conversions +simdutf_really_inline __m128i convert_utf8_3_byte_to_utf16(__m128i in) { + // Low half contains 10bbbbbb|10cccccc + // High half contains 1110aaaa|1110aaaa + const v16u8 sh = {2, 1, 5, 4, 8, 7, 11, 10, 0, 0, 3, 3, 6, 6, 9, 9}; + const v8u16 v0fff = {0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff, 0xfff}; + + __m128i perm = __lsx_vshuf_b(__lsx_vldi(0), in, (__m128i)sh); + // 1110aaaa => aaaa0000 + __m128i perm_high = __lsx_vslli_b(__lsx_vbsrl_v(perm, 8), 4); + // 10bbbbbb 10cccccc => 0010bbbb bbcccccc + __m128i composed = __lsx_vbitsel_v(__lsx_vsrli_h(perm, 2), /* perm >> 2*/ + perm, __lsx_vrepli_h(0x3f) /* 0x003f */); + // 0010bbbb bbcccccc => aaaabbbb bbcccccc + composed = __lsx_vbitsel_v(perm_high, composed, (__m128i)v0fff); - // 6. adjust pointers - utf8_output += row[0]; + return composed; } -inline void write_v_u16_11bits_to_utf8(const __m128i v_u16, char *&utf8_output, - const __m128i v_0000, - const __m128i v_ff80) { - // no bits set above 7th bit - const __m128i one_byte_bytemask = - _mm_cmpeq_epi16(_mm_and_si128(v_u16, v_ff80), v_0000); - const uint16_t one_byte_bitmask = - static_cast(_mm_movemask_epi8(one_byte_bytemask)); - - write_v_u16_11bits_to_utf8(v_u16, utf8_output, one_byte_bytemask, - one_byte_bitmask); +simdutf_really_inline __m128i convert_utf8_2_byte_to_utf16(__m128i in) { + // 10bbbbb 110aaaaa => 00bbbbb 000aaaaa + __m128i composed = __lsx_vand_v(in, __lsx_vldi(0x3f)); + // 00bbbbbb 000aaaaa => 00000aaa aabbbbbb + composed = __lsx_vbitsel_v( + __lsx_vsrli_h(__lsx_vslli_h(composed, 8), 2), /* (aaaaa << 8) >> 2 */ + __lsx_vsrli_h(composed, 8), /* bbbbbb >> 8 */ + __lsx_vrepli_h(0x3f)); /* 0x003f */ + return composed; } -/* end file src/westmere/internal/write_v_u16_11bits_to_utf8.cpp */ -} // namespace westmere -} // namespace internal -/* end file src/westmere/internal/loader.cpp */ +simdutf_really_inline __m128i +convert_utf8_1_to_2_byte_to_utf16(__m128i in, size_t shufutf8_idx) { + // Converts 6 1-2 byte UTF-8 characters to 6 UTF-16 characters. + // This is a relatively easy scenario + // we process SIX (6) input code-code units. The max length in bytes of six + // code code units spanning between 1 and 2 bytes each is 12 bytes. + __m128i sh = + __lsx_vld(reinterpret_cast( + simdutf::tables::utf8_to_utf16::shufutf8[shufutf8_idx]), + 0); + // Shuffle + // 1 byte: 00000000 0bbbbbbb + // 2 byte: 110aaaaa 10bbbbbb + __m128i perm = __lsx_vshuf_b(__lsx_vldi(0), in, sh); + // 1 byte: 00000000 0bbbbbbb + // 2 byte: 00000000 00bbbbbb + __m128i ascii = __lsx_vand_v(perm, __lsx_vrepli_h(0x7f)); // 6 or 7 bits + // 1 byte: 00000000 00000000 + // 2 byte: 00000aaa aa000000 + __m128i v1f00 = __lsx_vldi(-2785); // -2785(13bit) => 151f + __m128i composed = __lsx_vsrli_h(__lsx_vand_v(perm, v1f00), 2); // 5 bits + // Combine with a shift right accumulate + // 1 byte: 00000000 0bbbbbbb + // 2 byte: 00000aaa aabbbbbb + composed = __lsx_vadd_h(ascii, composed); + return composed; +} -/* begin file src/westmere/sse_validate_utf16.cpp */ +/* begin file src/lasx/lasx_validate_utf16.cpp */ /* In UTF-16 code units in range 0xD800 to 0xDFFF have special meaning. @@ -35324,7 +50478,7 @@ inline void write_v_u16_11bits_to_utf8(const __m128i v_u16, char *&utf8_output, - there must not be two consecutive high surrogates (0xdc00 .. 0xdfff) - there must not be sole low surrogate nor high surrogate - We are going to build three bitmasks based on the 3rd nibble: + We're going to build three bitmasks based on the 3rd nibble: - V = valid word, - L = low surrogate (0xd800 .. 0xdbff) - H = high surrogate (0xdc00 .. 0xdfff) @@ -35351,7 +50505,7 @@ inline void write_v_u16_11bits_to_utf8(const __m128i v_u16, char *&utf8_output, - nullptr if an error was detected. */ template -const char16_t *sse_validate_utf16(const char16_t *input, size_t size) { +const char16_t *lasx_validate_utf16(const char16_t *input, size_t size) { const char16_t *end = input + size; const auto v_d8 = simd8::splat(0xd8); @@ -35359,29 +50513,26 @@ const char16_t *sse_validate_utf16(const char16_t *input, size_t size) { const auto v_fc = simd8::splat(0xfc); const auto v_dc = simd8::splat(0xdc); - while (input + simd16::SIZE * 2 < end) { + while (input + simd16::ELEMENTS * 2 < end) { // 0. Load data: since the validation takes into account only higher // byte of each word, we compress the two vectors into one which // consists only the higher bytes. auto in0 = simd16(input); - auto in1 = - simd16(input + simd16::SIZE / sizeof(char16_t)); + auto in1 = simd16(input + simd16::ELEMENTS); + if (big_endian) { in0 = in0.swap_bytes(); in1 = in1.swap_bytes(); } - const auto t0 = in0.shr<8>(); - const auto t1 = in1.shr<8>(); - - const auto in = simd16::pack(t0, t1); + const auto in = simd8(__lasx_xvpermi_d( + __lasx_xvssrlni_bu_h(in1.value, in0.value, 8), 0b11011000)); // 1. Check whether we have any 0xD800..DFFF word (0b1101'1xxx'yyyy'yyyy). const auto surrogates_wordmask = (in & v_f8) == v_d8; - const uint16_t surrogates_bitmask = - static_cast(surrogates_wordmask.to_bitmask()); - if (surrogates_bitmask == 0x0000) { - input += 16; + const uint32_t surrogates_bitmask = surrogates_wordmask.to_bitmask(); + if (surrogates_bitmask == 0x0) { + input += simd16::ELEMENTS * 2; } else { // 2. We have some surrogates that have to be distinguished: // - low surrogates: 0b1101'10xx'yyyy'yyyy (0xD800..0xDBFF) @@ -35391,36 +50542,35 @@ const char16_t *sse_validate_utf16(const char16_t *input, size_t size) { // V - non-surrogate code units // V = not surrogates_wordmask - const uint16_t V = static_cast(~surrogates_bitmask); + const uint32_t V = ~surrogates_bitmask; // H - word-mask for high surrogates: the six highest bits are 0b1101'11 const auto vH = (in & v_fc) == v_dc; - const uint16_t H = static_cast(vH.to_bitmask()); + const uint32_t H = vH.to_bitmask(); // L - word mask for low surrogates // L = not H and surrogates_wordmask - const uint16_t L = static_cast(~H & surrogates_bitmask); + const uint32_t L = ~H & surrogates_bitmask; - const uint16_t a = static_cast( - L & (H >> 1)); // A low surrogate must be followed by high one. - // (A low surrogate placed in the 7th register's word - // is an exception we handle.) - const uint16_t b = static_cast( - a << 1); // Just mark that the opinput - startite fact is hold, - // thanks to that we have only two masks for valid case. - const uint16_t c = static_cast( - V | a | b); // Combine all the masks into the final one. + const uint32_t a = + L & (H >> 1); // A low surrogate must be followed by high one. + // (A low surrogate placed in the 7th register's word + // is an exception we handle.) + const uint32_t b = + a << 1; // Just mark that the opposite fact is hold, + // thanks to that we have only two masks for valid case. + const uint32_t c = V | a | b; // Combine all the masks into the final one. - if (c == 0xffff) { + if (c == 0xffffffff) { // The whole input register contains valid UTF-16, i.e., // either single code units or proper surrogate pairs. - input += 16; - } else if (c == 0x7fff) { - // The 15 lower code units of the input register contains valid UTF-16. - // The 15th word may be either a low or high surrogate. It the next + input += simd16::ELEMENTS * 2; + } else if (c == 0x7fffffff) { + // The 31 lower code units of the input register contains valid UTF-16. + // The 31 word may be either a low or high surrogate. It the next // iteration we 1) check if the low surrogate is followed by a high // one, 2) reject sole high surrogate. - input += 15; + input += simd16::ELEMENTS * 2 - 1; } else { return nullptr; } @@ -35431,8 +50581,8 @@ const char16_t *sse_validate_utf16(const char16_t *input, size_t size) { } template -const result sse_validate_utf16_with_errors(const char16_t *input, - size_t size) { +const result lasx_validate_utf16_with_errors(const char16_t *input, + size_t size) { if (simdutf_unlikely(size == 0)) { return result(error_code::SUCCESS, 0); } @@ -35444,30 +50594,25 @@ const result sse_validate_utf16_with_errors(const char16_t *input, const auto v_fc = simd8::splat(0xfc); const auto v_dc = simd8::splat(0xdc); - while (input + simd16::SIZE * 2 < end) { + while (input + simd16::ELEMENTS * 2 < end) { // 0. Load data: since the validation takes into account only higher // byte of each word, we compress the two vectors into one which // consists only the higher bytes. auto in0 = simd16(input); - auto in1 = - simd16(input + simd16::SIZE / sizeof(char16_t)); + auto in1 = simd16(input + simd16::ELEMENTS); if (big_endian) { in0 = in0.swap_bytes(); in1 = in1.swap_bytes(); } - - const auto t0 = in0.shr<8>(); - const auto t1 = in1.shr<8>(); - - const auto in = simd16::pack(t0, t1); + const auto in = simd8(__lasx_xvpermi_d( + __lasx_xvssrlni_bu_h(in1.value, in0.value, 8), 0b11011000)); // 1. Check whether we have any 0xD800..DFFF word (0b1101'1xxx'yyyy'yyyy). const auto surrogates_wordmask = (in & v_f8) == v_d8; - const uint16_t surrogates_bitmask = - static_cast(surrogates_wordmask.to_bitmask()); - if (surrogates_bitmask == 0x0000) { - input += 16; + const uint32_t surrogates_bitmask = surrogates_wordmask.to_bitmask(); + if (surrogates_bitmask == 0x0) { + input += simd16::ELEMENTS * 2; } else { // 2. We have some surrogates that have to be distinguished: // - low surrogates: 0b1101'10xx'yyyy'yyyy (0xD800..0xDBFF) @@ -35477,36 +50622,35 @@ const result sse_validate_utf16_with_errors(const char16_t *input, // V - non-surrogate code units // V = not surrogates_wordmask - const uint16_t V = static_cast(~surrogates_bitmask); + const uint32_t V = ~surrogates_bitmask; // H - word-mask for high surrogates: the six highest bits are 0b1101'11 const auto vH = (in & v_fc) == v_dc; - const uint16_t H = static_cast(vH.to_bitmask()); + const uint32_t H = vH.to_bitmask(); // L - word mask for low surrogates // L = not H and surrogates_wordmask - const uint16_t L = static_cast(~H & surrogates_bitmask); + const uint32_t L = ~H & surrogates_bitmask; - const uint16_t a = static_cast( - L & (H >> 1)); // A low surrogate must be followed by high one. - // (A low surrogate placed in the 7th register's word - // is an exception we handle.) - const uint16_t b = static_cast( - a << 1); // Just mark that the opinput - startite fact is hold, - // thanks to that we have only two masks for valid case. - const uint16_t c = static_cast( - V | a | b); // Combine all the masks into the final one. + const uint32_t a = + L & (H >> 1); // A low surrogate must be followed by high one. + // (A low surrogate placed in the 7th register's word + // is an exception we handle.) + const uint32_t b = + a << 1; // Just mark that the opposite fact is hold, + // thanks to that we have only two masks for valid case. + const uint32_t c = V | a | b; // Combine all the masks into the final one. - if (c == 0xffff) { + if (c == 0xffffffff) { // The whole input register contains valid UTF-16, i.e., // either single code units or proper surrogate pairs. - input += 16; - } else if (c == 0x7fff) { - // The 15 lower code units of the input register contains valid UTF-16. - // The 15th word may be either a low or high surrogate. It the next + input += simd16::ELEMENTS * 2; + } else if (c == 0x7fffffff) { + // The 31 lower code units of the input register contains valid UTF-16. + // The 31 word may be either a low or high surrogate. It the next // iteration we 1) check if the low surrogate is followed by a high // one, 2) reject sole high surrogate. - input += 15; + input += simd16::ELEMENTS * 2 - 1; } else { return result(error_code::SURROGATE, input - start); } @@ -35515,200 +50659,289 @@ const result sse_validate_utf16_with_errors(const char16_t *input, return result(error_code::SUCCESS, input - start); } -/* end file src/westmere/sse_validate_utf16.cpp */ -/* begin file src/westmere/sse_validate_utf32le.cpp */ -/* Returns: - - pointer to the last unprocessed character (a scalar fallback should check - the rest); - - nullptr if an error was detected. -*/ -const char32_t *sse_validate_utf32le(const char32_t *input, size_t size) { +/* end file src/lasx/lasx_validate_utf16.cpp */ +/* begin file src/lasx/lasx_validate_utf32le.cpp */ + +const char32_t *lasx_validate_utf32le(const char32_t *input, size_t size) { const char32_t *end = input + size; - const __m128i standardmax = _mm_set1_epi32(0x10ffff); - const __m128i offset = _mm_set1_epi32(0xffff2000); - const __m128i standardoffsetmax = _mm_set1_epi32(0xfffff7ff); - __m128i currentmax = _mm_setzero_si128(); - __m128i currentoffsetmax = _mm_setzero_si128(); + // Performance degradation when memory address is not 32-byte aligned + while (((uint64_t)input & 0x1F) && input < end) { + uint32_t word = *input++; + if (word > 0x10FFFF || (word >= 0xD800 && word <= 0xDFFF)) { + return nullptr; + } + } - while (input + 4 < end) { - const __m128i in = _mm_loadu_si128((__m128i *)input); - currentmax = _mm_max_epu32(in, currentmax); + __m256i offset = __lasx_xvreplgr2vr_w(uint32_t(0xffff2000)); + __m256i standardoffsetmax = __lasx_xvreplgr2vr_w(uint32_t(0xfffff7ff)); + __m256i standardmax = __lasx_xvldi(-2288); /*0x10ffff*/ + __m256i currentmax = __lasx_xvldi(0x0); + __m256i currentoffsetmax = __lasx_xvldi(0x0); + + while (input + 8 < end) { + __m256i in = __lasx_xvld(reinterpret_cast(input), 0); + currentmax = __lasx_xvmax_wu(in, currentmax); + // 0xD8__ + 0x2000 = 0xF8__ => 0xF8__ > 0xF7FF currentoffsetmax = - _mm_max_epu32(_mm_add_epi32(in, offset), currentoffsetmax); - input += 4; + __lasx_xvmax_wu(__lasx_xvadd_w(in, offset), currentoffsetmax); + input += 8; } - __m128i is_zero = - _mm_xor_si128(_mm_max_epu32(currentmax, standardmax), standardmax); - if (_mm_test_all_zeros(is_zero, is_zero) == 0) { + __m256i is_zero = + __lasx_xvxor_v(__lasx_xvmax_wu(currentmax, standardmax), standardmax); + if (__lasx_xbnz_v(is_zero)) { return nullptr; } - is_zero = _mm_xor_si128(_mm_max_epu32(currentoffsetmax, standardoffsetmax), - standardoffsetmax); - if (_mm_test_all_zeros(is_zero, is_zero) == 0) { + is_zero = __lasx_xvxor_v(__lasx_xvmax_wu(currentoffsetmax, standardoffsetmax), + standardoffsetmax); + if (__lasx_xbnz_v(is_zero)) { return nullptr; } - return input; } -const result sse_validate_utf32le_with_errors(const char32_t *input, - size_t size) { +const result lasx_validate_utf32le_with_errors(const char32_t *input, + size_t size) { const char32_t *start = input; const char32_t *end = input + size; - const __m128i standardmax = _mm_set1_epi32(0x10ffff); - const __m128i offset = _mm_set1_epi32(0xffff2000); - const __m128i standardoffsetmax = _mm_set1_epi32(0xfffff7ff); - __m128i currentmax = _mm_setzero_si128(); - __m128i currentoffsetmax = _mm_setzero_si128(); + // Performance degradation when memory address is not 32-byte aligned + while (((uint64_t)input & 0x1F) && input < end) { + uint32_t word = *input; + if (word > 0x10FFFF) { + return result(error_code::TOO_LARGE, input - start); + } + if (word >= 0xD800 && word <= 0xDFFF) { + return result(error_code::SURROGATE, input - start); + } + input++; + } - while (input + 4 < end) { - const __m128i in = _mm_loadu_si128((__m128i *)input); - currentmax = _mm_max_epu32(in, currentmax); + __m256i offset = __lasx_xvreplgr2vr_w(uint32_t(0xffff2000)); + __m256i standardoffsetmax = __lasx_xvreplgr2vr_w(uint32_t(0xfffff7ff)); + __m256i standardmax = __lasx_xvldi(-2288); /*0x10ffff*/ + __m256i currentmax = __lasx_xvldi(0x0); + __m256i currentoffsetmax = __lasx_xvldi(0x0); + + while (input + 8 < end) { + __m256i in = __lasx_xvld(reinterpret_cast(input), 0); + currentmax = __lasx_xvmax_wu(in, currentmax); currentoffsetmax = - _mm_max_epu32(_mm_add_epi32(in, offset), currentoffsetmax); + __lasx_xvmax_wu(__lasx_xvadd_w(in, offset), currentoffsetmax); - __m128i is_zero = - _mm_xor_si128(_mm_max_epu32(currentmax, standardmax), standardmax); - if (_mm_test_all_zeros(is_zero, is_zero) == 0) { + __m256i is_zero = + __lasx_xvxor_v(__lasx_xvmax_wu(currentmax, standardmax), standardmax); + if (__lasx_xbnz_v(is_zero)) { return result(error_code::TOO_LARGE, input - start); } - - is_zero = _mm_xor_si128(_mm_max_epu32(currentoffsetmax, standardoffsetmax), - standardoffsetmax); - if (_mm_test_all_zeros(is_zero, is_zero) == 0) { + is_zero = + __lasx_xvxor_v(__lasx_xvmax_wu(currentoffsetmax, standardoffsetmax), + standardoffsetmax); + if (__lasx_xbnz_v(is_zero)) { return result(error_code::SURROGATE, input - start); } - input += 4; + input += 8; } return result(error_code::SUCCESS, input - start); } -/* end file src/westmere/sse_validate_utf32le.cpp */ - -/* begin file src/westmere/sse_convert_latin1_to_utf8.cpp */ -std::pair -sse_convert_latin1_to_utf8(const char *latin_input, - const size_t latin_input_length, char *utf8_output) { - const char *end = latin_input + latin_input_length; - - const __m128i v_0000 = _mm_setzero_si128(); - // 0b1000_0000 - const __m128i v_80 = _mm_set1_epi8((uint8_t)0x80); - // 0b1111_1111_1000_0000 - const __m128i v_ff80 = _mm_set1_epi16((uint16_t)0xff80); - - const __m128i latin_1_half_into_u16_byte_mask = - _mm_setr_epi8(0, '\x80', 1, '\x80', 2, '\x80', 3, '\x80', 4, '\x80', 5, - '\x80', 6, '\x80', 7, '\x80'); +/* end file src/lasx/lasx_validate_utf32le.cpp */ - const __m128i latin_2_half_into_u16_byte_mask = - _mm_setr_epi8(8, '\x80', 9, '\x80', 10, '\x80', 11, '\x80', 12, '\x80', - 13, '\x80', 14, '\x80', 15, '\x80'); +/* begin file src/lasx/lasx_convert_latin1_to_utf8.cpp */ +/* + Returns a pair: the first unprocessed byte from buf and utf8_output + A scalar routing should carry on the conversion of the tail. +*/ - // each latin1 takes 1-2 utf8 bytes - // slow path writes useful 8-15 bytes twice (eagerly writes 16 bytes and then - // adjust the pointer) so the last write can exceed the utf8_output size by - // 8-1 bytes by reserving 8 extra input bytes, we expect the output to have - // 8-16 bytes free - while (end - latin_input >= 16 + 8) { - // Load 16 Latin1 characters (16 bytes) into a 128-bit register - __m128i v_latin = _mm_loadu_si128((__m128i *)latin_input); +std::pair +lasx_convert_latin1_to_utf8(const char *latin1_input, size_t len, + char *utf8_out) { + uint8_t *utf8_output = reinterpret_cast(utf8_out); + const size_t safety_margin = 12; + const char *end = latin1_input + len - safety_margin; - if (_mm_testz_si128(v_latin, v_80)) { // ASCII fast path!!!! - _mm_storeu_si128((__m128i *)utf8_output, v_latin); - latin_input += 16; + // We always write 16 bytes, of which more than the first 8 bytes + // are valid. A safety margin of 8 is more than sufficient. + while (latin1_input + 16 <= end) { + __m128i in8 = __lsx_vld(reinterpret_cast(latin1_input), 0); + uint32_t ascii_mask = __lsx_vpickve2gr_wu(__lsx_vmskgez_b(in8), 0); + if (ascii_mask == 0xFFFF) { + __lsx_vst(in8, utf8_output, 0); utf8_output += 16; + latin1_input += 16; continue; } + // We just fallback on UTF-16 code. This could be optimized/simplified + // further. + __m256i in16 = __lasx_vext2xv_hu_bu(____m256i(in8)); + // 1. prepare 2-byte values + // input 8-bit word : [aabb|bbbb] x 16 + // expected output : [1100|00aa|10bb|bbbb] x 16 + // t0 = [0000|00aa|bbbb|bb00] + __m256i t0 = __lasx_xvslli_h(in16, 2); + // t1 = [0000|00aa|0000|0000] + __m256i t1 = __lasx_xvand_v(t0, __lasx_xvldi(-2785)); + // t3 = [0000|00aa|00bb|bbbb] + __m256i t2 = __lasx_xvbitsel_v(t1, in16, __lasx_xvrepli_h(0x3f)); + // t4 = [1100|00aa|10bb|bbbb] + __m256i t3 = __lasx_xvor_v(t2, __lasx_xvreplgr2vr_h(uint16_t(0xc080))); + // merge ASCII and 2-byte codewords + __m256i one_byte_bytemask = __lasx_xvsle_hu(in16, __lasx_xvrepli_h(0x7F)); + __m256i utf8_unpacked = __lasx_xvbitsel_v(t3, in16, one_byte_bytemask); + + const uint8_t *row0 = + &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes + [lasx_1_2_utf8_bytes_mask[(ascii_mask & 0xFF)]][0]; + __m128i shuffle0 = __lsx_vld(row0 + 1, 0); + __m128i utf8_unpacked_lo = lasx_extracti128_lo(utf8_unpacked); + __m128i utf8_packed0 = + __lsx_vshuf_b(utf8_unpacked_lo, utf8_unpacked_lo, shuffle0); + __lsx_vst(utf8_packed0, utf8_output, 0); + utf8_output += row0[0]; + + const uint8_t *row1 = &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes + [lasx_1_2_utf8_bytes_mask[(ascii_mask >> 8)]][0]; + __m128i shuffle1 = __lsx_vld(row1 + 1, 0); + __m128i utf8_unpacked_hi = lasx_extracti128_hi(utf8_unpacked); + __m128i utf8_packed1 = + __lsx_vshuf_b(utf8_unpacked_hi, utf8_unpacked_hi, shuffle1); + __lsx_vst(utf8_packed1, utf8_output, 0); + utf8_output += row1[0]; - // assuming a/b are bytes and A/B are uint16 of the same value - // aaaa_aaaa_bbbb_bbbb -> AAAA_AAAA - __m128i v_u16_latin_1_half = - _mm_shuffle_epi8(v_latin, latin_1_half_into_u16_byte_mask); - // aaaa_aaaa_bbbb_bbbb -> BBBB_BBBB - __m128i v_u16_latin_2_half = - _mm_shuffle_epi8(v_latin, latin_2_half_into_u16_byte_mask); + latin1_input += 16; + } // while - internal::westmere::write_v_u16_11bits_to_utf8(v_u16_latin_1_half, - utf8_output, v_0000, v_ff80); - internal::westmere::write_v_u16_11bits_to_utf8(v_u16_latin_2_half, - utf8_output, v_0000, v_ff80); - latin_input += 16; + return std::make_pair(latin1_input, reinterpret_cast(utf8_output)); +} +/* end file src/lasx/lasx_convert_latin1_to_utf8.cpp */ +/* begin file src/lasx/lasx_convert_latin1_to_utf16.cpp */ +std::pair +lasx_convert_latin1_to_utf16le(const char *buf, size_t len, + char16_t *utf16_output) { + const char *end = buf + len; + + // Performance degradation when memory address is not 32-byte aligned + while (((uint64_t)utf16_output & 0x1F) && buf < end) { + *utf16_output++ = uint8_t(*buf) & 0xFF; + buf++; } - if (end - latin_input >= 16) { - // Load 16 Latin1 characters (16 bytes) into a 128-bit register - __m128i v_latin = _mm_loadu_si128((__m128i *)latin_input); + while (buf + 32 <= end) { + __m256i in8 = __lasx_xvld(reinterpret_cast(buf), 0); - if (_mm_testz_si128(v_latin, v_80)) { // ASCII fast path!!!! - _mm_storeu_si128((__m128i *)utf8_output, v_latin); - latin_input += 16; - utf8_output += 16; - } else { - // assuming a/b are bytes and A/B are uint16 of the same value - // aaaa_aaaa_bbbb_bbbb -> AAAA_AAAA - __m128i v_u16_latin_1_half = - _mm_shuffle_epi8(v_latin, latin_1_half_into_u16_byte_mask); - internal::westmere::write_v_u16_11bits_to_utf8( - v_u16_latin_1_half, utf8_output, v_0000, v_ff80); - latin_input += 8; - } + __m256i inlow = __lasx_vext2xv_hu_bu(in8); + __m256i in8_high = __lasx_xvpermi_q(in8, in8, 0b00000001); + __m256i inhigh = __lasx_vext2xv_hu_bu(in8_high); + __lasx_xvst(inlow, reinterpret_cast(utf16_output), 0); + __lasx_xvst(inhigh, reinterpret_cast(utf16_output), 32); + + utf16_output += 32; + buf += 32; } - return std::make_pair(latin_input, utf8_output); + if (buf + 16 <= end) { + __m128i zero = __lsx_vldi(0); + __m128i in8 = __lsx_vld(reinterpret_cast(buf), 0); + + __m128i inlow = __lsx_vilvl_b(zero, in8); + __m128i inhigh = __lsx_vilvh_b(zero, in8); + __lsx_vst(inlow, reinterpret_cast(utf16_output), 0); + __lsx_vst(inhigh, reinterpret_cast(utf16_output), 16); + + utf16_output += 16; + buf += 16; + } + return std::make_pair(buf, utf16_output); } -/* end file src/westmere/sse_convert_latin1_to_utf8.cpp */ -/* begin file src/westmere/sse_convert_latin1_to_utf16.cpp */ -template + std::pair -sse_convert_latin1_to_utf16(const char *latin1_input, size_t len, - char16_t *utf16_output) { - size_t rounded_len = len & ~0xF; // Round down to nearest multiple of 16 - for (size_t i = 0; i < rounded_len; i += 16) { - // Load 16 Latin1 characters into a 128-bit register - __m128i in = - _mm_loadu_si128(reinterpret_cast(&latin1_input[i])); - __m128i out1 = big_endian ? _mm_unpacklo_epi8(_mm_setzero_si128(), in) - : _mm_unpacklo_epi8(in, _mm_setzero_si128()); - __m128i out2 = big_endian ? _mm_unpackhi_epi8(_mm_setzero_si128(), in) - : _mm_unpackhi_epi8(in, _mm_setzero_si128()); - // Zero extend each Latin1 character to 16-bit integers and store the - // results back to memory - _mm_storeu_si128(reinterpret_cast<__m128i *>(&utf16_output[i]), out1); - _mm_storeu_si128(reinterpret_cast<__m128i *>(&utf16_output[i + 8]), out2); +lasx_convert_latin1_to_utf16be(const char *buf, size_t len, + char16_t *utf16_output) { + const char *end = buf + len; + + while (((uint64_t)utf16_output & 0x1F) && buf < end) { + *utf16_output++ = (uint16_t(*buf++) << 8); } - // return pointers pointing to where we left off - return std::make_pair(latin1_input + rounded_len, utf16_output + rounded_len); + + __m256i zero = __lasx_xvldi(0); + while (buf + 32 <= end) { + __m256i in8 = __lasx_xvld(reinterpret_cast(buf), 0); + + __m256i in8_shuf = __lasx_xvpermi_d(in8, 0b11011000); + + __m256i inlow = __lasx_xvilvl_b(in8_shuf, zero); + __m256i inhigh = __lasx_xvilvh_b(in8_shuf, zero); + __lasx_xvst(inlow, reinterpret_cast(utf16_output), 0); + __lasx_xvst(inhigh, reinterpret_cast(utf16_output), 32); + utf16_output += 32; + buf += 32; + } + + if (buf + 16 <= end) { + __m128i zero_128 = __lsx_vldi(0); + __m128i in8 = __lsx_vld(reinterpret_cast(buf), 0); + + __m128i inlow = __lsx_vilvl_b(in8, zero_128); + __m128i inhigh = __lsx_vilvh_b(in8, zero_128); + __lsx_vst(inlow, reinterpret_cast(utf16_output), 0); + __lsx_vst(inhigh, reinterpret_cast(utf16_output), 16); + utf16_output += 16; + buf += 16; + } + + return std::make_pair(buf, utf16_output); } -/* end file src/westmere/sse_convert_latin1_to_utf16.cpp */ -/* begin file src/westmere/sse_convert_latin1_to_utf32.cpp */ +/* end file src/lasx/lasx_convert_latin1_to_utf16.cpp */ +/* begin file src/lasx/lasx_convert_latin1_to_utf32.cpp */ std::pair -sse_convert_latin1_to_utf32(const char *buf, size_t len, - char32_t *utf32_output) { +lasx_convert_latin1_to_utf32(const char *buf, size_t len, + char32_t *utf32_output) { const char *end = buf + len; - while (end - buf >= 16) { - // Load 16 Latin1 characters (16 bytes) into a 128-bit register - __m128i in = _mm_loadu_si128((__m128i *)buf); + // LASX requires 32-byte alignment, otherwise performance will be degraded + while (((uint64_t)utf32_output & 0x1F) && buf < end) { + *utf32_output++ = ((uint32_t)*buf) & 0xFF; + buf++; + } - // Shift input to process next 4 bytes - __m128i in_shifted1 = _mm_srli_si128(in, 4); - __m128i in_shifted2 = _mm_srli_si128(in, 8); - __m128i in_shifted3 = _mm_srli_si128(in, 12); + while (buf + 32 <= end) { + __m256i in8 = __lasx_xvld(reinterpret_cast(buf), 0); - // expand 8-bit to 32-bit unit - __m128i out1 = _mm_cvtepu8_epi32(in); - __m128i out2 = _mm_cvtepu8_epi32(in_shifted1); - __m128i out3 = _mm_cvtepu8_epi32(in_shifted2); - __m128i out4 = _mm_cvtepu8_epi32(in_shifted3); + __m256i in32_0 = __lasx_vext2xv_wu_bu(in8); + __lasx_xvst(in32_0, reinterpret_cast(utf32_output), 0); - _mm_storeu_si128((__m128i *)utf32_output, out1); - _mm_storeu_si128((__m128i *)(utf32_output + 4), out2); - _mm_storeu_si128((__m128i *)(utf32_output + 8), out3); - _mm_storeu_si128((__m128i *)(utf32_output + 12), out4); + __m256i in8_1 = __lasx_xvpermi_d(in8, 0b00000001); + __m256i in32_1 = __lasx_vext2xv_wu_bu(in8_1); + __lasx_xvst(in32_1, reinterpret_cast(utf32_output), 32); + + __m256i in8_2 = __lasx_xvpermi_d(in8, 0b00000010); + __m256i in32_2 = __lasx_vext2xv_wu_bu(in8_2); + __lasx_xvst(in32_2, reinterpret_cast(utf32_output), 64); + + __m256i in8_3 = __lasx_xvpermi_d(in8, 0b00000011); + __m256i in32_3 = __lasx_vext2xv_wu_bu(in8_3); + __lasx_xvst(in32_3, reinterpret_cast(utf32_output), 96); + + utf32_output += 32; + buf += 32; + } + + if (buf + 16 <= end) { + __m128i in8 = __lsx_vld(reinterpret_cast(buf), 0); + + __m128i zero = __lsx_vldi(0); + __m128i in16low = __lsx_vilvl_b(zero, in8); + __m128i in16high = __lsx_vilvh_b(zero, in8); + __m128i in32_0 = __lsx_vilvl_h(zero, in16low); + __m128i in32_1 = __lsx_vilvh_h(zero, in16low); + __m128i in32_2 = __lsx_vilvl_h(zero, in16high); + __m128i in32_3 = __lsx_vilvh_h(zero, in16high); + + __lsx_vst(in32_0, reinterpret_cast(utf32_output), 0); + __lsx_vst(in32_1, reinterpret_cast(utf32_output), 16); + __lsx_vst(in32_2, reinterpret_cast(utf32_output), 32); + __lsx_vst(in32_3, reinterpret_cast(utf32_output), 48); utf32_output += 16; buf += 16; @@ -35716,15 +50949,13 @@ sse_convert_latin1_to_utf32(const char *buf, size_t len, return std::make_pair(buf, utf32_output); } -/* end file src/westmere/sse_convert_latin1_to_utf32.cpp */ - -/* begin file src/westmere/sse_convert_utf8_to_utf16.cpp */ -// depends on "tables/utf8_to_utf16_tables.h" +/* end file src/lasx/lasx_convert_latin1_to_utf32.cpp */ -// Convert up to 12 bytes from utf8 to utf16 using a mask indicating the +/* begin file src/lasx/lasx_convert_utf8_to_utf16.cpp */ +// Convert up to 16 bytes from utf8 to utf16 using a mask indicating the // end of the code points. Only the least significant 12 bits of the mask // are accessed. -// It returns how many bytes were consumed (up to 12). +// It returns how many bytes were consumed (up to 16, usually 12). template size_t convert_masked_utf8_to_utf16(const char *input, uint64_t utf8_end_of_code_point_mask, @@ -35733,204 +50964,304 @@ size_t convert_masked_utf8_to_utf16(const char *input, // Why 12 input bytes and not 16? Because we are concerned with the size of // the lookup tables. Also 12 is nicely divisible by two and three. // + __m128i in = __lsx_vld(reinterpret_cast(input), 0); + const uint16_t input_utf8_end_of_code_point_mask = + utf8_end_of_code_point_mask & 0xfff; // // Optimization note: our main path below is load-latency dependent. Thus it // is maybe beneficial to have fast paths that depend on branch prediction but // have less latency. This results in more instructions but, potentially, also // higher speeds. - // + // We first try a few fast paths. - const __m128i swap = - _mm_setr_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14); - const __m128i in = _mm_loadu_si128((__m128i *)input); - const uint16_t input_utf8_end_of_code_point_mask = - utf8_end_of_code_point_mask & 0xfff; - if (utf8_end_of_code_point_mask == 0xfff) { - // We process the data in chunks of 12 bytes. - // Note: using 16 bytes is unsafe, see issue_ossfuzz_71218 - __m128i ascii_first = _mm_cvtepu8_epi16(in); - __m128i ascii_second = _mm_cvtepu8_epi16(_mm_srli_si128(in, 8)); - if (big_endian) { - ascii_first = _mm_shuffle_epi8(ascii_first, swap); - ascii_second = _mm_shuffle_epi8(ascii_second, swap); + // The obvious first test is ASCII, which actually consumes the full 16. + if ((utf8_end_of_code_point_mask & 0xFFFF) == 0xFFFF) { + __m128i zero = __lsx_vldi(0); + if (match_system(big_endian)) { + __lsx_vst(__lsx_vilvl_b(zero, in), + reinterpret_cast(utf16_output), 0); + __lsx_vst(__lsx_vilvh_b(zero, in), + reinterpret_cast(utf16_output), 16); + } else { + __lsx_vst(__lsx_vilvl_b(in, zero), + reinterpret_cast(utf16_output), 0); + __lsx_vst(__lsx_vilvh_b(in, zero), + reinterpret_cast(utf16_output), 16); } - _mm_storeu_si128(reinterpret_cast<__m128i *>(utf16_output), ascii_first); - _mm_storeu_si128(reinterpret_cast<__m128i *>(utf16_output + 8), - ascii_second); - utf16_output += 12; // We wrote 12 16-bit characters. - return 12; // We consumed 12 bytes. - } - if (((utf8_end_of_code_point_mask & 0xFFFF) == 0xaaaa)) { - // We want to take 8 2-byte UTF-8 code units and turn them into 8 2-byte - // UTF-16 code units. There is probably a more efficient sequence, but the - // following might do. - const __m128i sh = - _mm_setr_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14); - const __m128i perm = _mm_shuffle_epi8(in, sh); - const __m128i ascii = _mm_and_si128(perm, _mm_set1_epi16(0x7f)); - const __m128i highbyte = _mm_and_si128(perm, _mm_set1_epi16(0x1f00)); - __m128i composed = _mm_or_si128(ascii, _mm_srli_epi16(highbyte, 2)); - if (big_endian) - composed = _mm_shuffle_epi8(composed, swap); - _mm_storeu_si128((__m128i *)utf16_output, composed); - utf16_output += 8; // We wrote 16 bytes, 8 code points. - return 16; + utf16_output += 16; // We wrote 16 16-bit characters. + return 16; // We consumed 16 bytes. } + + // 3 byte sequences are the next most common, as seen in CJK, which has long + // sequences of these. if (input_utf8_end_of_code_point_mask == 0x924) { // We want to take 4 3-byte UTF-8 code units and turn them into 4 2-byte - // UTF-16 code units. There is probably a more efficient sequence, but the - // following might do. - const __m128i sh = - _mm_setr_epi8(2, 1, 0, -1, 5, 4, 3, -1, 8, 7, 6, -1, 11, 10, 9, -1); - const __m128i perm = _mm_shuffle_epi8(in, sh); - const __m128i ascii = - _mm_and_si128(perm, _mm_set1_epi32(0x7f)); // 7 or 6 bits - const __m128i middlebyte = - _mm_and_si128(perm, _mm_set1_epi32(0x3f00)); // 5 or 6 bits - const __m128i middlebyte_shifted = _mm_srli_epi32(middlebyte, 2); - const __m128i highbyte = - _mm_and_si128(perm, _mm_set1_epi32(0x0f0000)); // 4 bits - const __m128i highbyte_shifted = _mm_srli_epi32(highbyte, 4); - const __m128i composed = - _mm_or_si128(_mm_or_si128(ascii, middlebyte_shifted), highbyte_shifted); - __m128i composed_repacked = _mm_packus_epi32(composed, composed); - if (big_endian) - composed_repacked = _mm_shuffle_epi8(composed_repacked, swap); - _mm_storeu_si128((__m128i *)utf16_output, composed_repacked); - utf16_output += 4; - return 12; + // UTF-16 code units. + __m128i composed = convert_utf8_3_byte_to_utf16(in); + // Byte swap if necessary + if (!match_system(big_endian)) { + composed = lsx_swap_bytes(composed); + } + + __lsx_vst(composed, reinterpret_cast(utf16_output), 0); + utf16_output += 4; // We wrote 4 16-bit characters. + return 12; // We consumed 12 bytes. } - /// We do not have a fast path available, so we fallback. - const uint8_t idx = - tables::utf8_to_utf16::utf8bigindex[input_utf8_end_of_code_point_mask][0]; - const uint8_t consumed = - tables::utf8_to_utf16::utf8bigindex[input_utf8_end_of_code_point_mask][1]; + // 2 byte sequences occur in short bursts in languages like Greek and Russian. + if ((utf8_end_of_code_point_mask & 0xFFFF) == 0xAAAA) { + // We want to take 6 2-byte UTF-8 code units and turn them into 6 2-byte + // UTF-16 code units. + __m128i composed = convert_utf8_2_byte_to_utf16(in); + // Byte swap if necessary + if (!match_system(big_endian)) { + composed = lsx_swap_bytes(composed); + } + + __lsx_vst(composed, reinterpret_cast(utf16_output), 0); + utf16_output += 8; // We wrote 6 16-bit characters. + return 16; // We consumed 12 bytes. + } + + /// We do not have a fast path available, or the fast path is unimportant, so + /// we fallback. + const uint8_t idx = simdutf::tables::utf8_to_utf16::utf8bigindex + [input_utf8_end_of_code_point_mask][0]; + + const uint8_t consumed = simdutf::tables::utf8_to_utf16::utf8bigindex + [input_utf8_end_of_code_point_mask][1]; + const __m128i zero = __lsx_vldi(0); if (idx < 64) { // SIX (6) input code-code units - // this is a relatively easy scenario - // we process SIX (6) input code-code units. The max length in bytes of six - // code code units spanning between 1 and 2 bytes each is 12 bytes. On - // processors where pdep/pext is fast, we might be able to use a small - // lookup table. - const __m128i sh = - _mm_loadu_si128((const __m128i *)tables::utf8_to_utf16::shufutf8[idx]); - const __m128i perm = _mm_shuffle_epi8(in, sh); - const __m128i ascii = _mm_and_si128(perm, _mm_set1_epi16(0x7f)); - const __m128i highbyte = _mm_and_si128(perm, _mm_set1_epi16(0x1f00)); - __m128i composed = _mm_or_si128(ascii, _mm_srli_epi16(highbyte, 2)); - if (big_endian) - composed = _mm_shuffle_epi8(composed, swap); - _mm_storeu_si128((__m128i *)utf16_output, composed); - utf16_output += 6; // We wrote 12 bytes, 6 code points. + // Convert to UTF-16 + __m128i composed = convert_utf8_1_to_2_byte_to_utf16(in, idx); + // Byte swap if necessary + if (!match_system(big_endian)) { + composed = lsx_swap_bytes(composed); + } + // Store + __lsx_vst(composed, reinterpret_cast(utf16_output), 0); + utf16_output += 6; // We wrote 6 16-bit characters. + return consumed; } else if (idx < 145) { // FOUR (4) input code-code units - const __m128i sh = - _mm_loadu_si128((const __m128i *)tables::utf8_to_utf16::shufutf8[idx]); - const __m128i perm = _mm_shuffle_epi8(in, sh); - const __m128i ascii = - _mm_and_si128(perm, _mm_set1_epi32(0x7f)); // 7 or 6 bits - const __m128i middlebyte = - _mm_and_si128(perm, _mm_set1_epi32(0x3f00)); // 5 or 6 bits - const __m128i middlebyte_shifted = _mm_srli_epi32(middlebyte, 2); - const __m128i highbyte = - _mm_and_si128(perm, _mm_set1_epi32(0x0f0000)); // 4 bits - const __m128i highbyte_shifted = _mm_srli_epi32(highbyte, 4); - const __m128i composed = - _mm_or_si128(_mm_or_si128(ascii, middlebyte_shifted), highbyte_shifted); - __m128i composed_repacked = _mm_packus_epi32(composed, composed); - if (big_endian) - composed_repacked = _mm_shuffle_epi8(composed_repacked, swap); - _mm_storeu_si128((__m128i *)utf16_output, composed_repacked); - utf16_output += 4; + // UTF-16 and UTF-32 use similar algorithms, but UTF-32 skips the narrowing. + __m128i sh = __lsx_vld(reinterpret_cast( + simdutf::tables::utf8_to_utf16::shufutf8[idx]), + 0); + // XXX: depending on the system scalar instructions might be faster. + // 1 byte: 00000000 00000000 0ccccccc + // 2 byte: 00000000 110bbbbb 10cccccc + // 3 byte: 1110aaaa 10bbbbbb 10cccccc + sh = __lsx_vand_v(sh, __lsx_vldi(0x1f)); + __m128i perm = __lsx_vshuf_b(zero, in, sh); + // 1 byte: 00000000 0ccccccc + // 2 byte: xx0bbbbb x0cccccc + // 3 byte: xxbbbbbb x0cccccc + __m128i lowperm = __lsx_vpickev_h(perm, perm); + // 1 byte: 00000000 00000000 + // 2 byte: 00000000 00000000 + // 3 byte: 00000000 1110aaaa + __m128i highperm = __lsx_vpickod_h(perm, perm); + // 3 byte: aaaa0000 00000000 + highperm = __lsx_vslli_h(highperm, 12); + // ASCII + // 1 byte: 00000000 0ccccccc + // 2+byte: 00000000 00cccccc + __m128i ascii = __lsx_vand_v(lowperm, __lsx_vrepli_h(0x7f)); + // 1 byte: 00000000 00000000 + // 2 byte: xx0bbbbb 00000000 + // 3 byte: xxbbbbbb 00000000 + __m128i middlebyte = __lsx_vand_v(lowperm, __lsx_vldi(-2561) /*0xFF00*/); + // 1 byte: 00000000 0ccccccc + // 2 byte: 0010bbbb bbcccccc + // 3 byte: 0010bbbb bbcccccc + __m128i composed = __lsx_vor_v(__lsx_vsrli_h(middlebyte, 2), ascii); + + __m128i v0fff = __lsx_vreplgr2vr_h(uint16_t(0xfff)); + // aaaabbbb bbcccccc + composed = __lsx_vbitsel_v(highperm, composed, v0fff); + + if (!match_system(big_endian)) { + composed = lsx_swap_bytes(composed); + } + + __lsx_vst(composed, reinterpret_cast(utf16_output), 0); + utf16_output += 4; // We wrote 4 16-bit codepoints + return consumed; } else if (idx < 209) { - // TWO (2) input code-code units - ////////////// - // There might be garbage inputs where a leading byte mascarades as a - // four-byte leading byte (by being followed by 3 continuation byte), but is - // not greater than 0xf0. This could trigger a buffer overflow if we only - // counted leading bytes of the form 0xf0 as generating surrogate pairs, - // without further UTF-8 validation. Thus we must be careful to ensure that - // only leading bytes at least as large as 0xf0 generate surrogate pairs. We - // do as at the cost of an extra mask. - ///////////// - const __m128i sh = - _mm_loadu_si128((const __m128i *)tables::utf8_to_utf16::shufutf8[idx]); - const __m128i perm = _mm_shuffle_epi8(in, sh); - const __m128i ascii = _mm_and_si128(perm, _mm_set1_epi32(0x7f)); - const __m128i middlebyte = _mm_and_si128(perm, _mm_set1_epi32(0x3f00)); - const __m128i middlebyte_shifted = _mm_srli_epi32(middlebyte, 2); - __m128i middlehighbyte = _mm_and_si128(perm, _mm_set1_epi32(0x3f0000)); - // correct for spurious high bit - const __m128i correct = - _mm_srli_epi32(_mm_and_si128(perm, _mm_set1_epi32(0x400000)), 1); - middlehighbyte = _mm_xor_si128(correct, middlehighbyte); - const __m128i middlehighbyte_shifted = _mm_srli_epi32(middlehighbyte, 4); - // We deliberately carry the leading four bits in highbyte if they are - // present, we remove them later when computing hightenbits. - const __m128i highbyte = _mm_and_si128(perm, _mm_set1_epi32(0xff000000)); - const __m128i highbyte_shifted = _mm_srli_epi32(highbyte, 6); - // When we need to generate a surrogate pair (leading byte > 0xF0), then - // the corresponding 32-bit value in 'composed' will be greater than - // > (0xff00000>>6) or > 0x3c00000. This can be used later to identify the - // location of the surrogate pairs. - const __m128i composed = - _mm_or_si128(_mm_or_si128(ascii, middlebyte_shifted), - _mm_or_si128(highbyte_shifted, middlehighbyte_shifted)); - const __m128i composedminus = - _mm_sub_epi32(composed, _mm_set1_epi32(0x10000)); - const __m128i lowtenbits = - _mm_and_si128(composedminus, _mm_set1_epi32(0x3ff)); - // Notice the 0x3ff mask: - const __m128i hightenbits = - _mm_and_si128(_mm_srli_epi32(composedminus, 10), _mm_set1_epi32(0x3ff)); - const __m128i lowtenbitsadd = - _mm_add_epi32(lowtenbits, _mm_set1_epi32(0xDC00)); - const __m128i hightenbitsadd = - _mm_add_epi32(hightenbits, _mm_set1_epi32(0xD800)); - const __m128i lowtenbitsaddshifted = _mm_slli_epi32(lowtenbitsadd, 16); - __m128i surrogates = _mm_or_si128(hightenbitsadd, lowtenbitsaddshifted); - uint32_t basic_buffer[4]; - uint32_t basic_buffer_swap[4]; - if (big_endian) { - _mm_storeu_si128((__m128i *)basic_buffer_swap, - _mm_shuffle_epi8(composed, swap)); - surrogates = _mm_shuffle_epi8(surrogates, swap); + // THREE (3) input code-code units + if (input_utf8_end_of_code_point_mask == 0x888) { + // We want to take 3 4-byte UTF-8 code units and turn them into 3 4-byte + // UTF-16 pairs. Generating surrogate pairs is a little tricky though, but + // it is easier when we can assume they are all pairs. This version does + // not use the LUT, but 4 byte sequences are less common and the overhead + // of the extra memory access is less important than the early branch + // overhead in shorter sequences. + + // Swap byte pairs + // 10dddddd 10cccccc|10bbbbbb 11110aaa + // 10cccccc 10dddddd|11110aaa 10bbbbbb + __m128i swap = lsx_swap_bytes(in); + // Shift left 2 bits + // cccccc00 dddddd00 xxxxxxxx bbbbbb00 + __m128i shift = __lsx_vslli_b(swap, 2); + // Create a magic number containing the low 2 bits of the trail surrogate + // and all the corrections needed to create the pair. UTF-8 4b prefix = + // -0x0000|0xF000 surrogate offset = -0x0000|0x0040 (0x10000 << 6) + // surrogate high = +0x0000|0xD800 + // surrogate low = +0xDC00|0x0000 + // ------------------------------- + // = +0xDC00|0xE7C0 + __m128i magic = __lsx_vreplgr2vr_w(uint32_t(0xDC00E7C0)); + // Generate unadjusted trail surrogate minus lowest 2 bits + // vec(0000FF00) = __lsx_vldi(-1758) + // xxxxxxxx xxxxxxxx|11110aaa bbbbbb00 + __m128i trail = + __lsx_vbitsel_v(shift, swap, __lsx_vldi(-1758 /*0000FF00*/)); + // Insert low 2 bits of trail surrogate to magic number for later + // 11011100 00000000 11100111 110000cc + __m128i magic_with_low_2 = __lsx_vor_v(__lsx_vsrli_w(shift, 30), magic); + + // Generate lead surrogate + // xxxxcccc ccdddddd|xxxxxxxx xxxxxxxx + // 000000cc ccdddddd|xxxxxxxx xxxxxxxx + __m128i lead = __lsx_vbitsel_v( + __lsx_vsrli_h(__lsx_vand_v(shift, __lsx_vldi(0x3F)), 4), swap, + __lsx_vrepli_h(0x3f /* 0x003f*/)); + + // Blend pairs + // __lsx_vldi(-1741) => vec(0x0000FFFF) + // 000000cc ccdddddd|11110aaa bbbbbb00 + __m128i blend = + __lsx_vbitsel_v(lead, trail, __lsx_vldi(-1741) /* (0x0000FFFF)*4 */); + + // Add magic number to finish the result + // 110111CC CCDDDDDD|110110AA BBBBBBCC + __m128i composed = __lsx_vadd_h(blend, magic_with_low_2); + // Byte swap if necessary + if (!match_system(big_endian)) { + composed = lsx_swap_bytes(composed); + } + __lsx_vst(composed, reinterpret_cast(utf16_output), 0); + utf16_output += 6; // We 3 32-bit surrogate pairs. + return 12; // We consumed 12 bytes. } - _mm_storeu_si128((__m128i *)basic_buffer, composed); - uint32_t surrogate_buffer[4]; - _mm_storeu_si128((__m128i *)surrogate_buffer, surrogates); + // 3 1-4 byte sequences + __m128i sh = __lsx_vld(reinterpret_cast( + simdutf::tables::utf8_to_utf16::shufutf8[idx]), + 0); + // 1 byte: 00000000 00000000 00000000 0ddddddd + // 3 byte: 00000000 00000000 110ccccc 10dddddd + // 3 byte: 00000000 1110bbbb 10cccccc 10dddddd + // 4 byte: 11110aaa 10bbbbbb 10cccccc 10dddddd + sh = __lsx_vand_v(sh, __lsx_vldi(0x1f)); + __m128i perm = __lsx_vshuf_b(zero, in, sh); + // added to fix issue https://github.com/simdutf/simdutf/issues/514 + // We only want to write 2 * 16-bit code units when that is actually what we + // have. Unfortunately, we cannot trust the input. So it is possible to get + // 0xff as an input byte and it should not result in a surrogate pair. We + // need to check for that. + uint32_t permbuffer[4]; + __lsx_vst(perm, permbuffer, 0); + // Mask the low and middle bytes + // 00000000 00000000 00000000 0ddddddd + __m128i ascii = __lsx_vand_v(perm, __lsx_vrepli_w(0x7f)); + // Because the surrogates need more work, the high surrogate is computed + // first. + __m128i middlehigh = __lsx_vslli_w(perm, 2); + // 00000000 00000000 00cccccc 00000000 + __m128i middlebyte = __lsx_vand_v(perm, __lsx_vldi(-3777) /* 0x00003F00 */); + // Start assembling the sequence. Since the 4th byte is in the same position + // as it would be in a surrogate and there is no dependency, shift left + // instead of right. 3 byte: 00000000 10bbbbxx xxxxxxxx xxxxxxxx 4 byte: + // 11110aaa bbbbbbxx xxxxxxxx xxxxxxxx + __m128i ab = + __lsx_vbitsel_v(middlehigh, perm, __lsx_vldi(-1656) /*0xFF000000*/); + // Top 16 bits contains the high ten bits of the surrogate pair before + // correction 3 byte: 00000000 10bbbbcc|cccc0000 00000000 4 byte: 11110aaa + // bbbbbbcc|cccc0000 00000000 - high 10 bits correct w/o correction + __m128i v_fffc0000 = __lsx_vreplgr2vr_w(uint32_t(0xFFFC0000)); + __m128i abc = __lsx_vbitsel_v(__lsx_vslli_w(middlebyte, 4), ab, v_fffc0000); + // Combine the low 6 or 7 bits by a shift right accumulate + // 3 byte: 00000000 00000010|bbbbcccc ccdddddd - low 16 bits correct + // 4 byte: 00000011 110aaabb|bbbbcccc ccdddddd - low 10 bits correct w/o + // correction + __m128i composed = __lsx_vor_v(ascii, __lsx_vsrli_w(abc, 6)); + // After this is for surrogates + // Blend the low and high surrogates + // 4 byte: 11110aaa bbbbbbcc|bbbbcccc ccdddddd + __m128i mixed = + __lsx_vbitsel_v(abc, composed, __lsx_vldi(-1741) /*0x0000FFFF*/); + // Clear the upper 6 bits of the low surrogate. Don't clear the upper bits + // yet as 0x10000 was not subtracted from the codepoint yet. 4 byte: + // 11110aaa bbbbbbcc|000000cc ccdddddd + __m128i v_ffff03ff = __lsx_vreplgr2vr_w(uint32_t(0xFFFF03FF)); + __m128i masked_pair = __lsx_vand_v(mixed, v_ffff03ff); + // Correct the remaining UTF-8 prefix, surrogate offset, and add the + // surrogate prefixes in one magic 16-bit addition. similar magic number but + // without the continue byte adjust and halfword swapped UTF-8 4b prefix = + // -0xF000|0x0000 surrogate offset = -0x0040|0x0000 (0x10000 << 6) + // surrogate high = +0xD800|0x0000 + // surrogate low = +0x0000|0xDC00 + // ----------------------------------- + // = +0xE7C0|0xDC00 + __m128i magic = __lsx_vreplgr2vr_w(uint32_t(0xE7C0DC00)); + // 4 byte: 110110AA BBBBBBCC|110111CC CCDDDDDD - surrogate pair complete + __m128i surrogates = __lsx_vadd_w(masked_pair, magic); + // If the high bit is 1 (s32 less than zero), this needs a surrogate pair + __m128i is_pair = __lsx_vslt_w(perm, zero); + // Select either the 4 byte surrogate pair or the 2 byte solo codepoint + // 3 byte: 0xxxxxxx xxxxxxxx|bbbbcccc ccdddddd + // 4 byte: 110110AA BBBBBBCC|110111CC CCDDDDDD + __m128i selected = __lsx_vbitsel_v(composed, surrogates, is_pair); + // Byte swap if necessary + if (!match_system(big_endian)) { + selected = lsx_swap_bytes(selected); + } + // Attempting to shuffle and store would be complex, just scalarize. + uint32_t buffer_tmp[4]; + __lsx_vst(selected, buffer_tmp, 0); + // Test for the top bit of the surrogate mask. Remove due to issue 514 + // const uint32_t SURROGATE_MASK = match_system(big_endian) ? 0x80000000 : + // 0x00800000; for (size_t i = 0; i < 3; i++) { - if (basic_buffer[i] > 0x3c00000) { - utf16_output[0] = uint16_t(surrogate_buffer[i] & 0xffff); - utf16_output[1] = uint16_t(surrogate_buffer[i] >> 16); + // Surrogate + // Used to be if (buffer[i] & SURROGATE_MASK) { + // See discussion above. + // patch for issue https://github.com/simdutf/simdutf/issues/514 + if ((permbuffer[i] & 0xf8000000) == 0xf0000000) { + utf16_output[0] = uint16_t(buffer_tmp[i] >> 16); + utf16_output[1] = uint16_t(buffer_tmp[i] & 0xFFFF); utf16_output += 2; } else { - utf16_output[0] = big_endian ? uint16_t(basic_buffer_swap[i]) - : uint16_t(basic_buffer[i]); + utf16_output[0] = uint16_t(buffer_tmp[i] & 0xFFFF); utf16_output++; } } + return consumed; } else { // here we know that there is an error but we do not handle errors + return 12; } - return consumed; } -/* end file src/westmere/sse_convert_utf8_to_utf16.cpp */ -/* begin file src/westmere/sse_convert_utf8_to_utf32.cpp */ -// depends on "tables/utf8_to_utf16_tables.h" - +/* end file src/lasx/lasx_convert_utf8_to_utf16.cpp */ +/* begin file src/lasx/lasx_convert_utf8_to_utf32.cpp */ // Convert up to 12 bytes from utf8 to utf32 using a mask indicating the // end of the code points. Only the least significant 12 bits of the mask // are accessed. // It returns how many bytes were consumed (up to 12). size_t convert_masked_utf8_to_utf32(const char *input, uint64_t utf8_end_of_code_point_mask, - char32_t *&utf32_output) { + char32_t *&utf32_out) { // we use an approach where we try to process up to 12 input bytes. // Why 12 input bytes and not 16? Because we are concerned with the size of // the lookup tables. Also 12 is nicely divisible by two and three. // + uint32_t *&utf32_output = reinterpret_cast(utf32_out); + __m128i in = __lsx_vld(reinterpret_cast(input), 0); + const uint16_t input_utf8_end_of_code_point_mask = + utf8_end_of_code_point_mask & 0xFFF; // // Optimization note: our main path below is load-latency dependent. Thus it // is maybe beneficial to have fast paths that depend on branch prediction but @@ -35938,135 +51269,179 @@ size_t convert_masked_utf8_to_utf32(const char *input, // higher speeds. // // We first try a few fast paths. - const __m128i in = _mm_loadu_si128((__m128i *)input); - const uint16_t input_utf8_end_of_code_point_mask = - utf8_end_of_code_point_mask & 0xfff; - if (utf8_end_of_code_point_mask == 0xfff) { - // We process the data in chunks of 12 bytes. - _mm_storeu_si128(reinterpret_cast<__m128i *>(utf32_output), - _mm_cvtepu8_epi32(in)); - _mm_storeu_si128(reinterpret_cast<__m128i *>(utf32_output + 4), - _mm_cvtepu8_epi32(_mm_srli_si128(in, 4))); - _mm_storeu_si128(reinterpret_cast<__m128i *>(utf32_output + 8), - _mm_cvtepu8_epi32(_mm_srli_si128(in, 8))); - _mm_storeu_si128(reinterpret_cast<__m128i *>(utf32_output + 12), - _mm_cvtepu8_epi32(_mm_srli_si128(in, 12))); - utf32_output += 12; // We wrote 12 32-bit characters. - return 12; // We consumed 12 bytes. - } - if (((utf8_end_of_code_point_mask & 0xffff) == 0xaaaa)) { - // We want to take 8 2-byte UTF-8 code units and turn them into 8 4-byte - // UTF-32 code units. There is probably a more efficient sequence, but the - // following might do. - const __m128i sh = - _mm_setr_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14); - const __m128i perm = _mm_shuffle_epi8(in, sh); - const __m128i ascii = _mm_and_si128(perm, _mm_set1_epi16(0x7f)); - const __m128i highbyte = _mm_and_si128(perm, _mm_set1_epi16(0x1f00)); - const __m128i composed = _mm_or_si128(ascii, _mm_srli_epi16(highbyte, 2)); - _mm_storeu_si128(reinterpret_cast<__m128i *>(utf32_output), - _mm_cvtepu16_epi32(composed)); - _mm_storeu_si128(reinterpret_cast<__m128i *>(utf32_output + 4), - _mm_cvtepu16_epi32(_mm_srli_si128(composed, 8))); - utf32_output += 8; // We wrote 32 bytes, 8 code points. - return 16; + if ((utf8_end_of_code_point_mask & 0xffff) == 0xffff) { + // We process in chunks of 16 bytes. + // use fast implementation in src/simdutf/arm64/simd.h + // Ideally the compiler can keep the tables in registers. + __m128i zero = __lsx_vldi(0); + __m128i in16low = __lsx_vilvl_b(zero, in); + __m128i in16high = __lsx_vilvh_b(zero, in); + __m128i in32_0 = __lsx_vilvl_h(zero, in16low); + __m128i in32_1 = __lsx_vilvh_h(zero, in16low); + __m128i in32_2 = __lsx_vilvl_h(zero, in16high); + __m128i in32_3 = __lsx_vilvh_h(zero, in16high); + + __lsx_vst(in32_0, reinterpret_cast(utf32_output), 0); + __lsx_vst(in32_1, reinterpret_cast(utf32_output), 16); + __lsx_vst(in32_2, reinterpret_cast(utf32_output), 32); + __lsx_vst(in32_3, reinterpret_cast(utf32_output), 48); + + utf32_output += 16; // We wrote 16 32-bit characters. + return 16; // We consumed 16 bytes. } + __m128i zero = __lsx_vldi(0); if (input_utf8_end_of_code_point_mask == 0x924) { // We want to take 4 3-byte UTF-8 code units and turn them into 4 4-byte - // UTF-32 code units. There is probably a more efficient sequence, but the - // following might do. - const __m128i sh = - _mm_setr_epi8(2, 1, 0, -1, 5, 4, 3, -1, 8, 7, 6, -1, 11, 10, 9, -1); - const __m128i perm = _mm_shuffle_epi8(in, sh); - const __m128i ascii = - _mm_and_si128(perm, _mm_set1_epi32(0x7f)); // 7 or 6 bits - const __m128i middlebyte = - _mm_and_si128(perm, _mm_set1_epi32(0x3f00)); // 5 or 6 bits - const __m128i middlebyte_shifted = _mm_srli_epi32(middlebyte, 2); - const __m128i highbyte = - _mm_and_si128(perm, _mm_set1_epi32(0x0f0000)); // 4 bits - const __m128i highbyte_shifted = _mm_srli_epi32(highbyte, 4); - const __m128i composed = - _mm_or_si128(_mm_or_si128(ascii, middlebyte_shifted), highbyte_shifted); - _mm_storeu_si128((__m128i *)utf32_output, composed); - utf32_output += 4; - return 12; + // UTF-32 code units. Convert to UTF-16 + __m128i composed_utf16 = convert_utf8_3_byte_to_utf16(in); + __m128i utf32_low = __lsx_vilvl_h(zero, composed_utf16); + + __lsx_vst(utf32_low, reinterpret_cast(utf32_output), 0); + utf32_output += 4; // We wrote 4 32-bit characters. + return 12; // We consumed 12 bytes. } - /// We do not have a fast path available, so we fallback. + // 2 byte sequences occur in short bursts in languages like Greek and Russian. + if (input_utf8_end_of_code_point_mask == 0xaaa) { + // We want to take 6 2-byte UTF-8 code units and turn them into 6 4-byte + // UTF-32 code units. Convert to UTF-16 + __m128i composed_utf16 = convert_utf8_2_byte_to_utf16(in); + + __m128i utf32_low = __lsx_vilvl_h(zero, composed_utf16); + __m128i utf32_high = __lsx_vilvh_h(zero, composed_utf16); + + __lsx_vst(utf32_low, reinterpret_cast(utf32_output), 0); + __lsx_vst(utf32_high, reinterpret_cast(utf32_output), 16); + utf32_output += 6; + return 12; // We consumed 12 bytes. + } + // Either no fast path or an unimportant fast path. + + const uint8_t idx = simdutf::tables::utf8_to_utf16::utf8bigindex + [input_utf8_end_of_code_point_mask][0]; + const uint8_t consumed = simdutf::tables::utf8_to_utf16::utf8bigindex + [input_utf8_end_of_code_point_mask][1]; - const uint8_t idx = - tables::utf8_to_utf16::utf8bigindex[input_utf8_end_of_code_point_mask][0]; - const uint8_t consumed = - tables::utf8_to_utf16::utf8bigindex[input_utf8_end_of_code_point_mask][1]; if (idx < 64) { // SIX (6) input code-code units - // this is a relatively easy scenario - // we process SIX (6) input code-code units. The max length in bytes of six - // code code units spanning between 1 and 2 bytes each is 12 bytes. On - // processors where pdep/pext is fast, we might be able to use a small - // lookup table. - const __m128i sh = - _mm_loadu_si128((const __m128i *)tables::utf8_to_utf16::shufutf8[idx]); - const __m128i perm = _mm_shuffle_epi8(in, sh); - const __m128i ascii = _mm_and_si128(perm, _mm_set1_epi16(0x7f)); - const __m128i highbyte = _mm_and_si128(perm, _mm_set1_epi16(0x1f00)); - const __m128i composed = _mm_or_si128(ascii, _mm_srli_epi16(highbyte, 2)); - _mm_storeu_si128(reinterpret_cast<__m128i *>(utf32_output), - _mm_cvtepu16_epi32(composed)); - _mm_storeu_si128(reinterpret_cast<__m128i *>(utf32_output + 4), - _mm_cvtepu16_epi32(_mm_srli_si128(composed, 8))); - utf32_output += 6; // We wrote 12 bytes, 6 code points. + // Convert to UTF-16 + __m128i composed_utf16 = convert_utf8_1_to_2_byte_to_utf16(in, idx); + __m128i utf32_low = __lsx_vilvl_h(zero, composed_utf16); + __m128i utf32_high = __lsx_vilvh_h(zero, composed_utf16); + + __lsx_vst(utf32_low, reinterpret_cast(utf32_output), 0); + __lsx_vst(utf32_high, reinterpret_cast(utf32_output), 16); + utf32_output += 6; + return consumed; } else if (idx < 145) { // FOUR (4) input code-code units - const __m128i sh = - _mm_loadu_si128((const __m128i *)tables::utf8_to_utf16::shufutf8[idx]); - const __m128i perm = _mm_shuffle_epi8(in, sh); - const __m128i ascii = - _mm_and_si128(perm, _mm_set1_epi32(0x7f)); // 7 or 6 bits - const __m128i middlebyte = - _mm_and_si128(perm, _mm_set1_epi32(0x3f00)); // 5 or 6 bits - const __m128i middlebyte_shifted = _mm_srli_epi32(middlebyte, 2); - const __m128i highbyte = - _mm_and_si128(perm, _mm_set1_epi32(0x0f0000)); // 4 bits - const __m128i highbyte_shifted = _mm_srli_epi32(highbyte, 4); - const __m128i composed = - _mm_or_si128(_mm_or_si128(ascii, middlebyte_shifted), highbyte_shifted); - _mm_storeu_si128((__m128i *)utf32_output, composed); - utf32_output += 4; + // UTF-16 and UTF-32 use similar algorithms, but UTF-32 skips the narrowing. + __m128i sh = __lsx_vld(reinterpret_cast( + simdutf::tables::utf8_to_utf16::shufutf8[idx]), + 0); + // Shuffle + // 1 byte: 00000000 00000000 0ccccccc + // 2 byte: 00000000 110bbbbb 10cccccc + // 3 byte: 1110aaaa 10bbbbbb 10cccccc + sh = __lsx_vand_v(sh, __lsx_vldi(0x1f)); + __m128i perm = __lsx_vshuf_b(zero, in, sh); + // Split + // 00000000 00000000 0ccccccc + __m128i ascii = __lsx_vand_v(perm, __lsx_vrepli_w(0x7F)); // 6 or 7 bits + // Note: unmasked + // xxxxxxxx aaaaxxxx xxxxxxxx + __m128i high = + __lsx_vsrli_w(__lsx_vand_v(perm, __lsx_vldi(0xf)), 4); // 4 bits + // Use 16 bit bic instead of and. + // The top bits will be corrected later in the bsl + // 00000000 10bbbbbb 00000000 + __m128i middle = + __lsx_vand_v(perm, __lsx_vldi(-1758 /*0x0000FF00*/)); // 5 or 6 bits + // Combine low and middle with shift right accumulate + // 00000000 00xxbbbb bbcccccc + __m128i lowmid = __lsx_vor_v(ascii, __lsx_vsrli_w(middle, 2)); + // Insert top 4 bits from high byte with bitwise select + // 00000000 aaaabbbb bbcccccc + __m128i composed = + __lsx_vbitsel_v(lowmid, high, __lsx_vldi(-3600 /*0x0000F000*/)); + __lsx_vst(composed, utf32_output, 0); + utf32_output += 4; // We wrote 4 32-bit characters. + return consumed; } else if (idx < 209) { - // TWO (2) input code-code units - const __m128i sh = - _mm_loadu_si128((const __m128i *)tables::utf8_to_utf16::shufutf8[idx]); - const __m128i perm = _mm_shuffle_epi8(in, sh); - const __m128i ascii = _mm_and_si128(perm, _mm_set1_epi32(0x7f)); - const __m128i middlebyte = _mm_and_si128(perm, _mm_set1_epi32(0x3f00)); - const __m128i middlebyte_shifted = _mm_srli_epi32(middlebyte, 2); - __m128i middlehighbyte = _mm_and_si128(perm, _mm_set1_epi32(0x3f0000)); - // correct for spurious high bit - const __m128i correct = - _mm_srli_epi32(_mm_and_si128(perm, _mm_set1_epi32(0x400000)), 1); - middlehighbyte = _mm_xor_si128(correct, middlehighbyte); - const __m128i middlehighbyte_shifted = _mm_srli_epi32(middlehighbyte, 4); - const __m128i highbyte = _mm_and_si128(perm, _mm_set1_epi32(0x07000000)); - const __m128i highbyte_shifted = _mm_srli_epi32(highbyte, 6); - const __m128i composed = - _mm_or_si128(_mm_or_si128(ascii, middlebyte_shifted), - _mm_or_si128(highbyte_shifted, middlehighbyte_shifted)); - _mm_storeu_si128((__m128i *)utf32_output, composed); - utf32_output += 3; + // THREE (3) input code-code units + if (input_utf8_end_of_code_point_mask == 0x888) { + // We want to take 3 4-byte UTF-8 code units and turn them into 3 4-byte + // UTF-32 code units. This uses the same method as the fixed 3 byte + // version, reversing and shift left insert. However, there is no need for + // a shuffle mask now, just rev16 and rev32. + // + // This version does not use the LUT, but 4 byte sequences are less common + // and the overhead of the extra memory access is less important than the + // early branch overhead in shorter sequences, so it comes last. + + // Swap pairs of bytes + // 10dddddd|10cccccc|10bbbbbb|11110aaa + // 10cccccc 10dddddd|11110aaa 10bbbbbb + __m128i swap = lsx_swap_bytes(in); + // Shift left and insert + // xxxxcccc ccdddddd|xxxxxxxa aabbbbbb + __m128i merge1 = __lsx_vbitsel_v(__lsx_vsrli_h(swap, 2), swap, + __lsx_vrepli_h(0x3f /*0x003F*/)); + // Shift insert again + // xxxxxxxx xxxaaabb bbbbcccc ccdddddd + __m128i merge2 = + __lsx_vbitsel_v(__lsx_vslli_w(merge1, 12), /* merge1 << 12 */ + __lsx_vsrli_w(merge1, 16), /* merge1 >> 16 */ + __lsx_vldi(-2545)); /*0x00000FFF*/ + // Clear the garbage + // 00000000 000aaabb bbbbcccc ccdddddd + __m128i composed = __lsx_vand_v(merge2, __lsx_vldi(-2273 /*0x1FFFFF*/)); + // Store + __lsx_vst(composed, utf32_output, 0); + utf32_output += 3; // We wrote 3 32-bit characters. + return 12; // We consumed 12 bytes. + } + // Unlike UTF-16, doing a fast codepath doesn't have nearly as much benefit + // due to surrogates no longer being involved. + __m128i sh = __lsx_vld(reinterpret_cast( + simdutf::tables::utf8_to_utf16::shufutf8[idx]), + 0); + // 1 byte: 00000000 00000000 00000000 0ddddddd + // 2 byte: 00000000 00000000 110ccccc 10dddddd + // 3 byte: 00000000 1110bbbb 10cccccc 10dddddd + // 4 byte: 11110aaa 10bbbbbb 10cccccc 10dddddd + sh = __lsx_vand_v(sh, __lsx_vldi(0x1f)); + __m128i perm = __lsx_vshuf_b(zero, in, sh); + + // Ascii + __m128i ascii = __lsx_vand_v(perm, __lsx_vrepli_w(0x7F)); + __m128i middle = __lsx_vand_v(perm, __lsx_vldi(-3777 /*0x00003f00*/)); + // 00000000 00000000 0000cccc ccdddddd + __m128i cd = + __lsx_vbitsel_v(__lsx_vsrli_w(middle, 2), ascii, __lsx_vrepli_w(0x3f)); + + __m128i correction = __lsx_vand_v(perm, __lsx_vldi(-3520 /*0x00400000*/)); + __m128i corrected = __lsx_vadd_b(perm, __lsx_vsrli_w(correction, 1)); + // Insert twice + // 00000000 000aaabb bbbbxxxx xxxxxxxx + __m128i corrected_srli2 = + __lsx_vsrli_w(__lsx_vand_v(corrected, __lsx_vrepli_b(0x7)), 2); + __m128i ab = + __lsx_vbitsel_v(corrected_srli2, corrected, __lsx_vrepli_h(0x3f)); + ab = __lsx_vsrli_w(ab, 4); + // 00000000 000aaabb bbbbcccc ccdddddd + __m128i composed = + __lsx_vbitsel_v(ab, cd, __lsx_vldi(-2545 /*0x00000FFF*/)); + // Store + __lsx_vst(composed, utf32_output, 0); + utf32_output += 3; // We wrote 3 32-bit characters. + return consumed; } else { // here we know that there is an error but we do not handle errors + return 12; } - return consumed; } -/* end file src/westmere/sse_convert_utf8_to_utf32.cpp */ -/* begin file src/westmere/sse_convert_utf8_to_latin1.cpp */ -// depends on "tables/utf8_to_utf16_tables.h" - -// Convert up to 12 bytes from utf8 to latin1 using a mask indicating the -// end of the code points. Only the least significant 12 bits of the mask -// are accessed. -// It returns how many bytes were consumed (up to 12). +/* end file src/lasx/lasx_convert_utf8_to_utf32.cpp */ +/* begin file src/lasx/lasx_convert_utf8_to_latin1.cpp */ size_t convert_masked_utf8_to_latin1(const char *input, uint64_t utf8_end_of_code_point_mask, char *&latin1_output) { @@ -36074,27 +51449,30 @@ size_t convert_masked_utf8_to_latin1(const char *input, // Why 12 input bytes and not 16? Because we are concerned with the size of // the lookup tables. Also 12 is nicely divisible by two and three. // - // + __m128i in = __lsx_vld(reinterpret_cast(input), 0); + + const uint16_t input_utf8_end_of_code_point_mask = + utf8_end_of_code_point_mask & 0xfff; // Optimization note: our main path below is load-latency dependent. Thus it // is maybe beneficial to have fast paths that depend on branch prediction but // have less latency. This results in more instructions but, potentially, also // higher speeds. - // - const __m128i in = _mm_loadu_si128((__m128i *)input); - const uint16_t input_utf8_end_of_code_point_mask = - utf8_end_of_code_point_mask & - 0xfff; // we are only processing 12 bytes in case it is not all ASCII - if (utf8_end_of_code_point_mask == 0xfff) { - // We process the data in chunks of 12 bytes. - _mm_storeu_si128(reinterpret_cast<__m128i *>(latin1_output), in); - latin1_output += 12; // We wrote 12 characters. - return 12; // We consumed 12 bytes. + + // We first try a few fast paths. + // The obvious first test is ASCII, which actually consumes the full 16. + if ((utf8_end_of_code_point_mask & 0xFFFF) == 0xFFFF) { + // We process in chunks of 16 bytes + __lsx_vst(in, reinterpret_cast(latin1_output), 0); + latin1_output += 16; // We wrote 16 18-bit characters. + return 16; // We consumed 16 bytes. } - /// We do not have a fast path available, so we fallback. - const uint8_t idx = - tables::utf8_to_utf16::utf8bigindex[input_utf8_end_of_code_point_mask][0]; - const uint8_t consumed = - tables::utf8_to_utf16::utf8bigindex[input_utf8_end_of_code_point_mask][1]; + /// We do not have a fast path available, or the fast path is unimportant, so + /// we fallback. + const uint8_t idx = simdutf::tables::utf8_to_utf16::utf8bigindex + [input_utf8_end_of_code_point_mask][0]; + + const uint8_t consumed = simdutf::tables::utf8_to_utf16::utf8bigindex + [input_utf8_end_of_code_point_mask][1]; // this indicates an invalid input: if (idx >= 64) { return consumed; @@ -36102,50 +51480,63 @@ size_t convert_masked_utf8_to_latin1(const char *input, // Here we should have (idx < 64), if not, there is a bug in the validation or // elsewhere. SIX (6) input code-code units this is a relatively easy scenario // we process SIX (6) input code-code units. The max length in bytes of six - // code code units spanning between 1 and 2 bytes each is 12 bytes. On - // processors where pdep/pext is fast, we might be able to use a small lookup - // table. - const __m128i sh = - _mm_loadu_si128((const __m128i *)tables::utf8_to_utf16::shufutf8[idx]); - const __m128i perm = _mm_shuffle_epi8(in, sh); - const __m128i ascii = _mm_and_si128(perm, _mm_set1_epi16(0x7f)); - const __m128i highbyte = _mm_and_si128(perm, _mm_set1_epi16(0x1f00)); - __m128i composed = _mm_or_si128(ascii, _mm_srli_epi16(highbyte, 2)); - const __m128i latin1_packed = _mm_packus_epi16(composed, composed); + // code code units spanning between 1 and 2 bytes each is 12 bytes. Converts 6 + // 1-2 byte UTF-8 characters to 6 UTF-16 characters. This is a relatively easy + // scenario we process SIX (6) input code-code units. The max length in bytes + // of six code code units spanning between 1 and 2 bytes each is 12 bytes. + __m128i sh = __lsx_vld(reinterpret_cast( + simdutf::tables::utf8_to_utf16::shufutf8[idx]), + 0); + // Shuffle + // 1 byte: 00000000 0bbbbbbb + // 2 byte: 110aaaaa 10bbbbbb + sh = __lsx_vand_v(sh, __lsx_vldi(0x1f)); + __m128i perm = __lsx_vshuf_b(__lsx_vldi(0), in, sh); + // ascii mask + // 1 byte: 11111111 11111111 + // 2 byte: 00000000 00000000 + __m128i ascii_mask = __lsx_vslt_bu(perm, __lsx_vldi(0x80)); + // utf8 mask + // 1 byte: 00000000 00000000 + // 2 byte: 00111111 00111111 + __m128i utf8_mask = __lsx_vand_v(__lsx_vsle_bu(__lsx_vldi(0x80), perm), + __lsx_vldi(0b00111111)); + // mask + // 1 byte: 11111111 11111111 + // 2 byte: 00111111 00111111 + __m128i mask = __lsx_vor_v(utf8_mask, ascii_mask); + + __m128i composed = __lsx_vbitsel_v(__lsx_vsrli_h(perm, 2), perm, mask); // writing 8 bytes even though we only care about the first 6 bytes. - // performance note: it would be faster to use _mm_storeu_si128, we should - // investigate. - _mm_storel_epi64((__m128i *)latin1_output, latin1_packed); + __m128i latin1_packed = __lsx_vpickev_b(__lsx_vldi(0), composed); + + __lsx_vst(latin1_packed, reinterpret_cast(latin1_output), 0); latin1_output += 6; // We wrote 6 bytes. return consumed; } -/* end file src/westmere/sse_convert_utf8_to_latin1.cpp */ +/* end file src/lasx/lasx_convert_utf8_to_latin1.cpp */ -/* begin file src/westmere/sse_convert_utf16_to_latin1.cpp */ +/* begin file src/lasx/lasx_convert_utf16_to_latin1.cpp */ template std::pair -sse_convert_utf16_to_latin1(const char16_t *buf, size_t len, - char *latin1_output) { +lasx_convert_utf16_to_latin1(const char16_t *buf, size_t len, + char *latin1_output) { const char16_t *end = buf + len; - while (end - buf >= 8) { - // Load 8 UTF-16 characters into 128-bit SSE register - __m128i in = _mm_loadu_si128(reinterpret_cast(buf)); - + while (buf + 16 <= end) { + __m128i in = __lsx_vld(reinterpret_cast(buf), 0); + __m128i in1 = __lsx_vld(reinterpret_cast(buf), 16); if (!match_system(big_endian)) { - const __m128i swap = - _mm_setr_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14); - in = _mm_shuffle_epi8(in, swap); + in = lsx_swap_bytes(in); + in1 = lsx_swap_bytes(in1); } - - __m128i high_byte_mask = _mm_set1_epi16((int16_t)0xFF00); - if (_mm_testz_si128(in, high_byte_mask)) { - // Pack 16-bit characters into 8-bit and store in latin1_output - __m128i latin1_packed = _mm_packus_epi16(in, in); - _mm_storel_epi64(reinterpret_cast<__m128i *>(latin1_output), - latin1_packed); - // Adjust pointers for next iteration - buf += 8; - latin1_output += 8; + if (__lsx_bz_v(__lsx_vpickod_b(in1, in))) { + // 1. pack the bytes + __m128i latin1_packed = __lsx_vpickev_b(in1, in); + // 2. store (8 bytes) + __lsx_vst(latin1_packed, reinterpret_cast(latin1_output), 0); + // 3. adjust pointers + buf += 16; + latin1_output += 16; } else { return std::make_pair(nullptr, reinterpret_cast(latin1_output)); } @@ -36155,29 +51546,28 @@ sse_convert_utf16_to_latin1(const char16_t *buf, size_t len, template std::pair -sse_convert_utf16_to_latin1_with_errors(const char16_t *buf, size_t len, - char *latin1_output) { +lasx_convert_utf16_to_latin1_with_errors(const char16_t *buf, size_t len, + char *latin1_output) { const char16_t *start = buf; const char16_t *end = buf + len; - while (end - buf >= 8) { - __m128i in = _mm_loadu_si128(reinterpret_cast(buf)); - + while (buf + 16 <= end) { + __m128i in = __lsx_vld(reinterpret_cast(buf), 0); + __m128i in1 = __lsx_vld(reinterpret_cast(buf), 16); if (!match_system(big_endian)) { - const __m128i swap = - _mm_setr_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14); - in = _mm_shuffle_epi8(in, swap); + in = lsx_swap_bytes(in); + in1 = lsx_swap_bytes(in1); } - - __m128i high_byte_mask = _mm_set1_epi16((int16_t)0xFF00); - if (_mm_testz_si128(in, high_byte_mask)) { - __m128i latin1_packed = _mm_packus_epi16(in, in); - _mm_storel_epi64(reinterpret_cast<__m128i *>(latin1_output), - latin1_packed); - buf += 8; - latin1_output += 8; + if (__lsx_bz_v(__lsx_vpickod_b(in1, in))) { + // 1. pack the bytes + __m128i latin1_packed = __lsx_vpickev_b(in1, in); + // 2. store (8 bytes) + __lsx_vst(latin1_packed, reinterpret_cast(latin1_output), 0); + // 3. adjust pointers + buf += 16; + latin1_output += 16; } else { - // Fallback to scalar code for handling errors - for (int k = 0; k < 8; k++) { + // Let us do a scalar fallback. + for (int k = 0; k < 16; k++) { uint16_t word = !match_system(big_endian) ? scalar::utf16::swap_bytes(buf[k]) : buf[k]; @@ -36188,16 +51578,15 @@ sse_convert_utf16_to_latin1_with_errors(const char16_t *buf, size_t len, latin1_output); } } - buf += 8; } } // while return std::make_pair(result(error_code::SUCCESS, buf - start), latin1_output); } -/* end file src/westmere/sse_convert_utf16_to_latin1.cpp */ -/* begin file src/westmere/sse_convert_utf16_to_utf8.cpp */ +/* end file src/lasx/lasx_convert_utf16_to_latin1.cpp */ +/* begin file src/lasx/lasx_convert_utf16_to_utf8.cpp */ /* - The vectorized algorithm works on single SSE register i.e., it + The vectorized algorithm works on single LASX register i.e., it loads eight 16-bit code units. We consider three cases: @@ -36211,11 +51600,11 @@ sse_convert_utf16_to_latin1_with_errors(const char16_t *buf, size_t len, Ad 1. When values are less than 0x0800, it means that a 16-bit code unit - can be converted into: 1) single UTF8 byte (when it is an ASCII + can be converted into: 1) single UTF8 byte (when it's an ASCII char) or 2) two UTF8 bytes. For this case we do only some shuffle to obtain these 2-byte - codes and finally compress the whole SSE register with a single + codes and finally compress the whole LASX register with a single shuffle. We need 256-entry lookup table to get a compression pattern @@ -36233,7 +51622,7 @@ sse_convert_utf16_to_latin1_with_errors(const char16_t *buf, size_t len, the three-UTF8-bytes case. Finally these two registers are interleaved forming eight-element - array of 32-bit values. The array spans two SSE registers. + array of 32-bit values. The array spans two LASX registers. The bytes from the registers are compressed using two shuffles. We need 256-entry lookup table to get a compression pattern @@ -36244,187 +51633,210 @@ sse_convert_utf16_to_latin1_with_errors(const char16_t *buf, size_t len, To summarize: - We need two 256-entry tables that have 8704 bytes in total. */ - /* Returns a pair: the first unprocessed byte from buf and utf8_output A scalar routing should carry on the conversion of the tail. */ + template std::pair -sse_convert_utf16_to_utf8(const char16_t *buf, size_t len, char *utf8_output) { - +lasx_convert_utf16_to_utf8(const char16_t *buf, size_t len, char *utf8_out) { + uint8_t *utf8_output = reinterpret_cast(utf8_out); const char16_t *end = buf + len; - const __m128i v_0000 = _mm_setzero_si128(); - const __m128i v_f800 = _mm_set1_epi16((int16_t)0xf800); - const __m128i v_d800 = _mm_set1_epi16((int16_t)0xd800); const size_t safety_margin = 12; // to avoid overruns, see issue // https://github.com/simdutf/simdutf/issues/92 - while (end - buf >= std::ptrdiff_t(16 + safety_margin)) { - __m128i in = _mm_loadu_si128((__m128i *)buf); - if (big_endian) { - const __m128i swap = - _mm_setr_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14); - in = _mm_shuffle_epi8(in, swap); + __m256i v_07ff = __lasx_xvreplgr2vr_h(uint16_t(0x7ff)); + __m256i zero = __lasx_xvldi(0); + __m128i zero_128 = __lsx_vldi(0); + while (buf + 16 + safety_margin <= end) { + __m256i in = __lasx_xvld(reinterpret_cast(buf), 0); + if (!match_system(big_endian)) { + in = lasx_swap_bytes(in); } - // a single 16-bit UTF-16 word can yield 1, 2 or 3 UTF-8 bytes - const __m128i v_ff80 = _mm_set1_epi16((int16_t)0xff80); - if (_mm_testz_si128(in, v_ff80)) { // ASCII fast path!!!! - __m128i nextin = _mm_loadu_si128((__m128i *)buf + 1); - if (big_endian) { - const __m128i swap = - _mm_setr_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14); - nextin = _mm_shuffle_epi8(nextin, swap); - } - if (!_mm_testz_si128(nextin, v_ff80)) { - // 1. pack the bytes - // obviously suboptimal. - const __m128i utf8_packed = _mm_packus_epi16(in, in); - // 2. store (16 bytes) - _mm_storeu_si128((__m128i *)utf8_output, utf8_packed); - // 3. adjust pointers - buf += 8; - utf8_output += 8; - in = nextin; - } else { - // 1. pack the bytes - // obviously suboptimal. - const __m128i utf8_packed = _mm_packus_epi16(in, nextin); - // 2. store (16 bytes) - _mm_storeu_si128((__m128i *)utf8_output, utf8_packed); - // 3. adjust pointers - buf += 16; - utf8_output += 16; - continue; // we are done for this round! - } + if (__lasx_xbnz_h(__lasx_xvslt_hu( + in, __lasx_xvrepli_h(0x7F)))) { // ASCII fast path!!!! + // 1. pack the bytes + __m256i utf8_packed = + __lasx_xvpermi_d(__lasx_xvpickev_b(in, in), 0b00001000); + // 2. store (16 bytes) + __lsx_vst(lasx_extracti128_lo(utf8_packed), utf8_output, 0); + // 3. adjust pointers + buf += 16; + utf8_output += 16; + continue; // we are done for this round! } - // no bits set above 7th bit - const __m128i one_byte_bytemask = - _mm_cmpeq_epi16(_mm_and_si128(in, v_ff80), v_0000); - const uint16_t one_byte_bitmask = - static_cast(_mm_movemask_epi8(one_byte_bytemask)); + if (__lasx_xbz_v(__lasx_xvslt_hu(v_07ff, in))) { + // 1. prepare 2-byte values + // input 16-bit word : [0000|0aaa|aabb|bbbb] x 16 + // expected output : [110a|aaaa|10bb|bbbb] x 16 + // t0 = [000a|aaaa|bbbb|bb00] + __m256i t0 = __lasx_xvslli_h(in, 2); + // t1 = [000a|aaaa|0000|0000] + __m256i t1 = __lasx_xvand_v(t0, __lasx_xvldi(-2785 /*0x1f00*/)); + // t2 = [0000|0000|00bb|bbbb] + __m256i t2 = __lasx_xvand_v(in, __lasx_xvrepli_h(0x3f)); + // t3 = [000a|aaaa|00bb|bbbb] + __m256i t3 = __lasx_xvor_v(t1, t2); + // t4 = [110a|aaaa|10bb|bbbb] + __m256i v_c080 = __lasx_xvreplgr2vr_h(uint16_t(0xc080)); + __m256i t4 = __lasx_xvor_v(t3, v_c080); + // 2. merge ASCII and 2-byte codewords + __m256i one_byte_bytemask = + __lasx_xvsle_hu(in, __lasx_xvrepli_h(0x7F /*0x007F*/)); + __m256i utf8_unpacked = __lasx_xvbitsel_v(t4, in, one_byte_bytemask); + // 3. prepare bitmask for 8-bit lookup + __m256i mask = __lasx_xvmskltz_h(one_byte_bytemask); + uint32_t m1 = __lasx_xvpickve2gr_wu(mask, 0); + uint32_t m2 = __lasx_xvpickve2gr_wu(mask, 4); + // 4. pack the bytes + const uint8_t *row1 = &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes + [lasx_1_2_utf8_bytes_mask[m1]][0]; + __m128i shuffle1 = __lsx_vld(row1, 1); + __m128i utf8_packed1 = + __lsx_vshuf_b(zero_128, lasx_extracti128_lo(utf8_unpacked), shuffle1); + + const uint8_t *row2 = &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes + [lasx_1_2_utf8_bytes_mask[m2]][0]; + __m128i shuffle2 = __lsx_vld(row2, 1); + __m128i utf8_packed2 = + __lsx_vshuf_b(zero_128, lasx_extracti128_hi(utf8_unpacked), shuffle2); + // 5. store bytes + __lsx_vst(utf8_packed1, utf8_output, 0); + utf8_output += row1[0]; - // no bits set above 11th bit - const __m128i one_or_two_bytes_bytemask = - _mm_cmpeq_epi16(_mm_and_si128(in, v_f800), v_0000); - const uint16_t one_or_two_bytes_bitmask = - static_cast(_mm_movemask_epi8(one_or_two_bytes_bytemask)); + __lsx_vst(utf8_packed2, utf8_output, 0); + utf8_output += row2[0]; - if (one_or_two_bytes_bitmask == 0xffff) { - internal::westmere::write_v_u16_11bits_to_utf8( - in, utf8_output, one_byte_bytemask, one_byte_bitmask); - buf += 8; + buf += 16; continue; } - - // 1. Check if there are any surrogate word in the input chunk. - // We have also deal with situation when there is a surrogate word - // at the end of a chunk. - const __m128i surrogates_bytemask = - _mm_cmpeq_epi16(_mm_and_si128(in, v_f800), v_d800); - - // bitmask = 0x0000 if there are no surrogates - // = 0xc000 if the last word is a surrogate - const uint16_t surrogates_bitmask = - static_cast(_mm_movemask_epi8(surrogates_bytemask)); + __m256i surrogates_bytemask = + __lasx_xvseq_h(__lasx_xvand_v(in, __lasx_xvldi(-2568 /*0xF800*/)), + __lasx_xvldi(-2600 /*0xD800*/)); // It might seem like checking for surrogates_bitmask == 0xc000 could help. // However, it is likely an uncommon occurrence. - if (surrogates_bitmask == 0x0000) { + if (__lasx_xbz_v(surrogates_bytemask)) { // case: code units from register produce either 1, 2 or 3 UTF-8 bytes - const __m128i dup_even = _mm_setr_epi16(0x0000, 0x0202, 0x0404, 0x0606, - 0x0808, 0x0a0a, 0x0c0c, 0x0e0e); - /* In this branch we handle three cases: - 1. [0000|0000|0ccc|cccc] => [0ccc|cccc] - - single UFT-8 byte - 2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc] - two - UTF-8 bytes - 3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - - three UTF-8 bytes - - We expand the input word (16-bit) into two code units (32-bit), thus - we have room for four bytes. However, we need five distinct bit - layouts. Note that the last byte in cases #2 and #3 is the same. + 1. [0000|0000|0ccc|cccc] => [0ccc|cccc] - + single UFT-8 byte + 2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc] - + two UTF-8 bytes + 3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - + three UTF-8 bytes - We precompute byte 1 for case #1 and the common byte for cases #2 & #3 - in register t2. + We expand the input word (16-bit) into two code units (32-bit), thus + we have room for four bytes. However, we need five distinct bit + layouts. Note that the last byte in cases #2 and #3 is the same. - We precompute byte 1 for case #3 and -- **conditionally** -- precompute - either byte 1 for case #2 or byte 2 for case #3. Note that they - differ by exactly one bit. + We precompute byte 1 for case #1 and the common byte for cases #2 & #3 + in register t2. - Finally from these two code units we build proper UTF-8 sequence, taking - into account the case (i.e, the number of bytes to write). - */ + We precompute byte 1 for case #3 and -- **conditionally** -- + precompute either byte 1 for case #2 or byte 2 for case #3. Note that + they differ by exactly one bit. + + Finally from these two code units we build proper UTF-8 sequence, + taking into account the case (i.e, the number of bytes to write). + */ /** * Given [aaaa|bbbb|bbcc|cccc] our goal is to produce: * t2 => [0ccc|cccc] [10cc|cccc] * s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb]) */ -#define simdutf_vec(x) _mm_set1_epi16(static_cast(x)) // [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc] - const __m128i t0 = _mm_shuffle_epi8(in, dup_even); - // [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc] - const __m128i t1 = _mm_and_si128(t0, simdutf_vec(0b0011111101111111)); + __m256i t0 = __lasx_xvpickev_b(in, in); + t0 = __lasx_xvilvl_b(t0, t0); + + // [bbcc|cccc|bbcc|cccc] => [00cc|cccc|00cc|cccc] + __m256i v_3f7f = __lasx_xvreplgr2vr_h(uint16_t(0x3F7F)); + __m256i t1 = __lasx_xvand_v(t0, v_3f7f); // [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc] - const __m128i t2 = _mm_or_si128(t1, simdutf_vec(0b1000000000000000)); + __m256i t2 = __lasx_xvor_v(t1, __lasx_xvldi(-2688)); - // [aaaa|bbbb|bbcc|cccc] => [0000|aaaa|bbbb|bbcc] - const __m128i s0 = _mm_srli_epi16(in, 4); - // [0000|aaaa|bbbb|bbcc] => [0000|aaaa|bbbb|bb00] - const __m128i s1 = _mm_and_si128(s0, simdutf_vec(0b0000111111111100)); - // [0000|aaaa|bbbb|bb00] => [00bb|bbbb|0000|aaaa] - const __m128i s2 = _mm_maddubs_epi16(s1, simdutf_vec(0x0140)); - // [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa] - const __m128i s3 = _mm_or_si128(s2, simdutf_vec(0b1100000011100000)); - const __m128i m0 = _mm_andnot_si128(one_or_two_bytes_bytemask, - simdutf_vec(0b0100000000000000)); - const __m128i s4 = _mm_xor_si128(s3, m0); -#undef simdutf_vec + // s0: [aaaa|bbbb|bbcc|cccc] => [0000|0000|0000|aaaa] + __m256i s0 = __lasx_xvsrli_h(in, 12); + // s1: [aaaa|bbbb|bbcc|cccc] => [0000|bbbb|bb00|0000] + __m256i s1 = __lasx_xvslli_h(in, 2); + // s1: [aabb|bbbb|cccc|cc00] => [00bb|bbbb|0000|0000] + s1 = __lasx_xvand_v(s1, __lasx_xvldi(-2753 /*0x3F00*/)); + + // [00bb|bbbb|0000|aaaa] + __m256i s2 = __lasx_xvor_v(s0, s1); + // s3: [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa] + __m256i v_c0e0 = __lasx_xvreplgr2vr_h(uint16_t(0xC0E0)); + __m256i s3 = __lasx_xvor_v(s2, v_c0e0); + __m256i one_or_two_bytes_bytemask = __lasx_xvsle_hu(in, v_07ff); + __m256i m0 = __lasx_xvandn_v(one_or_two_bytes_bytemask, + __lasx_xvldi(-2752 /*0x4000*/)); + __m256i s4 = __lasx_xvxor_v(s3, m0); // 4. expand code units 16-bit => 32-bit - const __m128i out0 = _mm_unpacklo_epi16(t2, s4); - const __m128i out1 = _mm_unpackhi_epi16(t2, s4); + __m256i out0 = __lasx_xvilvl_h(s4, t2); + __m256i out1 = __lasx_xvilvh_h(s4, t2); // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle - const uint16_t mask = - (one_byte_bitmask & 0x5555) | (one_or_two_bytes_bitmask & 0xaaaa); - if (mask == 0) { - // We only have three-byte code units. Use fast path. - const __m128i shuffle = _mm_setr_epi8(2, 3, 1, 6, 7, 5, 10, 11, 9, 14, - 15, 13, -1, -1, -1, -1); - const __m128i utf8_0 = _mm_shuffle_epi8(out0, shuffle); - const __m128i utf8_1 = _mm_shuffle_epi8(out1, shuffle); - _mm_storeu_si128((__m128i *)utf8_output, utf8_0); - utf8_output += 12; - _mm_storeu_si128((__m128i *)utf8_output, utf8_1); - utf8_output += 12; - buf += 8; - continue; - } - const uint8_t mask0 = uint8_t(mask); - + __m256i one_byte_bytemask = __lasx_xvsle_hu(in, __lasx_xvrepli_h(0x7F)); + __m256i one_byte_bytemask_low = + __lasx_xvilvl_h(one_byte_bytemask, one_byte_bytemask); + __m256i one_byte_bytemask_high = + __lasx_xvilvh_h(one_byte_bytemask, one_byte_bytemask); + + __m256i one_or_two_bytes_bytemask_low = + __lasx_xvilvl_h(one_or_two_bytes_bytemask, zero); + __m256i one_or_two_bytes_bytemask_high = + __lasx_xvilvh_h(one_or_two_bytes_bytemask, zero); + + __m256i mask0 = __lasx_xvmskltz_h( + __lasx_xvor_v(one_or_two_bytes_bytemask_low, one_byte_bytemask_low)); + __m256i mask1 = __lasx_xvmskltz_h(__lasx_xvor_v( + one_or_two_bytes_bytemask_high, one_byte_bytemask_high)); + + uint32_t mask = __lasx_xvpickve2gr_wu(mask0, 0); const uint8_t *row0 = - &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask0][0]; - const __m128i shuffle0 = _mm_loadu_si128((__m128i *)(row0 + 1)); - const __m128i utf8_0 = _mm_shuffle_epi8(out0, shuffle0); - - const uint8_t mask1 = static_cast(mask >> 8); + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask & 0xFF] + [0]; + __m128i shuffle0 = __lsx_vld(row0, 1); + __m128i utf8_0 = + __lsx_vshuf_b(zero_128, lasx_extracti128_lo(out0), shuffle0); + __lsx_vst(utf8_0, utf8_output, 0); + utf8_output += row0[0]; + mask = __lasx_xvpickve2gr_wu(mask1, 0); const uint8_t *row1 = - &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask1][0]; - const __m128i shuffle1 = _mm_loadu_si128((__m128i *)(row1 + 1)); - const __m128i utf8_1 = _mm_shuffle_epi8(out1, shuffle1); - - _mm_storeu_si128((__m128i *)utf8_output, utf8_0); - utf8_output += row0[0]; - _mm_storeu_si128((__m128i *)utf8_output, utf8_1); + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask & 0xFF] + [0]; + __m128i shuffle1 = __lsx_vld(row1, 1); + __m128i utf8_1 = + __lsx_vshuf_b(zero_128, lasx_extracti128_lo(out1), shuffle1); + __lsx_vst(utf8_1, utf8_output, 0); utf8_output += row1[0]; - buf += 8; + mask = __lasx_xvpickve2gr_wu(mask0, 4); + const uint8_t *row2 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask & 0xFF] + [0]; + __m128i shuffle2 = __lsx_vld(row2, 1); + __m128i utf8_2 = + __lsx_vshuf_b(zero_128, lasx_extracti128_hi(out0), shuffle2); + __lsx_vst(utf8_2, utf8_output, 0); + utf8_output += row2[0]; + + mask = __lasx_xvpickve2gr_wu(mask1, 4); + const uint8_t *row3 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask & 0xFF] + [0]; + __m128i shuffle3 = __lsx_vld(row3, 1); + __m128i utf8_3 = + __lsx_vshuf_b(zero_128, lasx_extracti128_hi(out1), shuffle3); + __lsx_vst(utf8_3, utf8_output, 0); + utf8_output += row3[0]; + + buf += 16; // surrogate pair(s) in a register } else { // Let us do a scalar fallback. @@ -36436,7 +51848,9 @@ sse_convert_utf16_to_utf8(const char16_t *buf, size_t len, char *utf8_output) { forward = size_t(end - buf - 1); } for (; k < forward; k++) { - uint16_t word = big_endian ? scalar::utf16::swap_bytes(buf[k]) : buf[k]; + uint16_t word = !match_system(big_endian) + ? scalar::utf16::swap_bytes(buf[k]) + : buf[k]; if ((word & 0xFF80) == 0) { *utf8_output++ = char(word); } else if ((word & 0xF800) == 0) { @@ -36449,12 +51863,14 @@ sse_convert_utf16_to_utf8(const char16_t *buf, size_t len, char *utf8_output) { } else { // must be a surrogate pair uint16_t diff = uint16_t(word - 0xD800); - uint16_t next_word = - big_endian ? scalar::utf16::swap_bytes(buf[k + 1]) : buf[k + 1]; + uint16_t next_word = !match_system(big_endian) + ? scalar::utf16::swap_bytes(buf[k + 1]) + : buf[k + 1]; k++; uint16_t diff2 = uint16_t(next_word - 0xDC00); if ((diff | diff2) > 0x3FF) { - return std::make_pair(nullptr, utf8_output); + return std::make_pair(nullptr, + reinterpret_cast(utf8_output)); } uint32_t value = (diff << 10) + diff2 + 0x10000; *utf8_output++ = char((value >> 18) | 0b11110000); @@ -36466,8 +51882,7 @@ sse_convert_utf16_to_utf8(const char16_t *buf, size_t len, char *utf8_output) { buf += k; } } // while - - return std::make_pair(buf, utf8_output); + return std::make_pair(buf, reinterpret_cast(utf8_output)); } /* @@ -36479,181 +51894,205 @@ sse_convert_utf16_to_utf8(const char16_t *buf, size_t len, char *utf8_output) { */ template std::pair -sse_convert_utf16_to_utf8_with_errors(const char16_t *buf, size_t len, - char *utf8_output) { +lasx_convert_utf16_to_utf8_with_errors(const char16_t *buf, size_t len, + char *utf8_out) { + uint8_t *utf8_output = reinterpret_cast(utf8_out); const char16_t *start = buf; const char16_t *end = buf + len; - const __m128i v_0000 = _mm_setzero_si128(); - const __m128i v_f800 = _mm_set1_epi16((int16_t)0xf800); - const __m128i v_d800 = _mm_set1_epi16((int16_t)0xd800); const size_t safety_margin = 12; // to avoid overruns, see issue // https://github.com/simdutf/simdutf/issues/92 - while (end - buf >= std::ptrdiff_t(16 + safety_margin)) { - __m128i in = _mm_loadu_si128((__m128i *)buf); - if (big_endian) { - const __m128i swap = - _mm_setr_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14); - in = _mm_shuffle_epi8(in, swap); + __m256i v_07ff = __lasx_xvreplgr2vr_h(uint16_t(0x7ff)); + __m256i zero = __lasx_xvldi(0); + __m128i zero_128 = __lsx_vldi(0); + while (buf + 16 + safety_margin <= end) { + __m256i in = __lasx_xvld(reinterpret_cast(buf), 0); + if (!match_system(big_endian)) { + in = lasx_swap_bytes(in); } - // a single 16-bit UTF-16 word can yield 1, 2 or 3 UTF-8 bytes - const __m128i v_ff80 = _mm_set1_epi16((int16_t)0xff80); - if (_mm_testz_si128(in, v_ff80)) { // ASCII fast path!!!! - __m128i nextin = _mm_loadu_si128((__m128i *)buf + 1); - if (big_endian) { - const __m128i swap = - _mm_setr_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14); - nextin = _mm_shuffle_epi8(nextin, swap); - } - if (!_mm_testz_si128(nextin, v_ff80)) { - // 1. pack the bytes - // obviously suboptimal. - const __m128i utf8_packed = _mm_packus_epi16(in, in); - // 2. store (16 bytes) - _mm_storeu_si128((__m128i *)utf8_output, utf8_packed); - // 3. adjust pointers - buf += 8; - utf8_output += 8; - in = nextin; - } else { - // 1. pack the bytes - // obviously suboptimal. - const __m128i utf8_packed = _mm_packus_epi16(in, nextin); - // 2. store (16 bytes) - _mm_storeu_si128((__m128i *)utf8_output, utf8_packed); - // 3. adjust pointers - buf += 16; - utf8_output += 16; - continue; // we are done for this round! - } + if (__lasx_xbnz_h(__lasx_xvslt_hu( + in, __lasx_xvrepli_h(0x7F)))) { // ASCII fast path!!!! + // 1. pack the bytes + __m256i utf8_packed = + __lasx_xvpermi_d(__lasx_xvpickev_b(in, in), 0b00001000); + // 2. store (16 bytes) + __lsx_vst(lasx_extracti128_lo(utf8_packed), utf8_output, 0); + // 3. adjust pointers + buf += 16; + utf8_output += 16; + continue; // we are done for this round! } - // no bits set above 7th bit - const __m128i one_byte_bytemask = - _mm_cmpeq_epi16(_mm_and_si128(in, v_ff80), v_0000); - const uint16_t one_byte_bitmask = - static_cast(_mm_movemask_epi8(one_byte_bytemask)); + if (__lasx_xbz_v(__lasx_xvslt_hu(v_07ff, in))) { + // 1. prepare 2-byte values + // input 16-bit word : [0000|0aaa|aabb|bbbb] x 16 + // expected output : [110a|aaaa|10bb|bbbb] x 16 + // t0 = [000a|aaaa|bbbb|bb00] + __m256i t0 = __lasx_xvslli_h(in, 2); + // t1 = [000a|aaaa|0000|0000] + __m256i t1 = __lasx_xvand_v(t0, __lasx_xvldi(-2785 /*0x1f00*/)); + // t2 = [0000|0000|00bb|bbbb] + __m256i t2 = __lasx_xvand_v(in, __lasx_xvrepli_h(0x3f)); + // t3 = [000a|aaaa|00bb|bbbb] + __m256i t3 = __lasx_xvor_v(t1, t2); + // t4 = [110a|aaaa|10bb|bbbb] + __m256i v_c080 = __lasx_xvreplgr2vr_h(uint16_t(0xc080)); + __m256i t4 = __lasx_xvor_v(t3, v_c080); + // 2. merge ASCII and 2-byte codewords + __m256i one_byte_bytemask = + __lasx_xvsle_hu(in, __lasx_xvrepli_h(0x7F /*0x007F*/)); + __m256i utf8_unpacked = __lasx_xvbitsel_v(t4, in, one_byte_bytemask); + // 3. prepare bitmask for 8-bit lookup + __m256i mask = __lasx_xvmskltz_h(one_byte_bytemask); + uint32_t m1 = __lasx_xvpickve2gr_wu(mask, 0); + uint32_t m2 = __lasx_xvpickve2gr_wu(mask, 4); + // 4. pack the bytes + const uint8_t *row1 = &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes + [lasx_1_2_utf8_bytes_mask[m1]][0]; + __m128i shuffle1 = __lsx_vld(row1, 1); + __m128i utf8_packed1 = + __lsx_vshuf_b(zero_128, lasx_extracti128_lo(utf8_unpacked), shuffle1); + + const uint8_t *row2 = &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes + [lasx_1_2_utf8_bytes_mask[m2]][0]; + __m128i shuffle2 = __lsx_vld(row2, 1); + __m128i utf8_packed2 = + __lsx_vshuf_b(zero_128, lasx_extracti128_hi(utf8_unpacked), shuffle2); + // 5. store bytes + __lsx_vst(utf8_packed1, utf8_output, 0); + utf8_output += row1[0]; - // no bits set above 11th bit - const __m128i one_or_two_bytes_bytemask = - _mm_cmpeq_epi16(_mm_and_si128(in, v_f800), v_0000); - const uint16_t one_or_two_bytes_bitmask = - static_cast(_mm_movemask_epi8(one_or_two_bytes_bytemask)); + __lsx_vst(utf8_packed2, utf8_output, 0); + utf8_output += row2[0]; - if (one_or_two_bytes_bitmask == 0xffff) { - internal::westmere::write_v_u16_11bits_to_utf8( - in, utf8_output, one_byte_bytemask, one_byte_bitmask); - buf += 8; + buf += 16; continue; } - - // 1. Check if there are any surrogate word in the input chunk. - // We have also deal with situation when there is a surrogate word - // at the end of a chunk. - const __m128i surrogates_bytemask = - _mm_cmpeq_epi16(_mm_and_si128(in, v_f800), v_d800); - - // bitmask = 0x0000 if there are no surrogates - // = 0xc000 if the last word is a surrogate - const uint16_t surrogates_bitmask = - static_cast(_mm_movemask_epi8(surrogates_bytemask)); + __m256i surrogates_bytemask = + __lasx_xvseq_h(__lasx_xvand_v(in, __lasx_xvldi(-2568 /*0xF800*/)), + __lasx_xvldi(-2600 /*0xD800*/)); // It might seem like checking for surrogates_bitmask == 0xc000 could help. // However, it is likely an uncommon occurrence. - if (surrogates_bitmask == 0x0000) { + if (__lasx_xbz_v(surrogates_bytemask)) { // case: code units from register produce either 1, 2 or 3 UTF-8 bytes - const __m128i dup_even = _mm_setr_epi16(0x0000, 0x0202, 0x0404, 0x0606, - 0x0808, 0x0a0a, 0x0c0c, 0x0e0e); - /* In this branch we handle three cases: - 1. [0000|0000|0ccc|cccc] => [0ccc|cccc] - - single UFT-8 byte - 2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc] - two - UTF-8 bytes - 3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - - three UTF-8 bytes + 1. [0000|0000|0ccc|cccc] => [0ccc|cccc] - + single UFT-8 byte + 2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc] - + two UTF-8 bytes + 3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - + three UTF-8 bytes - We expand the input word (16-bit) into two code units (32-bit), thus - we have room for four bytes. However, we need five distinct bit - layouts. Note that the last byte in cases #2 and #3 is the same. + We expand the input word (16-bit) into two code units (32-bit), thus + we have room for four bytes. However, we need five distinct bit + layouts. Note that the last byte in cases #2 and #3 is the same. - We precompute byte 1 for case #1 and the common byte for cases #2 & #3 - in register t2. + We precompute byte 1 for case #1 and the common byte for cases #2 & #3 + in register t2. - We precompute byte 1 for case #3 and -- **conditionally** -- precompute - either byte 1 for case #2 or byte 2 for case #3. Note that they - differ by exactly one bit. + We precompute byte 1 for case #3 and -- **conditionally** -- + precompute either byte 1 for case #2 or byte 2 for case #3. Note that + they differ by exactly one bit. - Finally from these two code units we build proper UTF-8 sequence, taking - into account the case (i.e, the number of bytes to write). - */ + Finally from these two code units we build proper UTF-8 sequence, + taking into account the case (i.e, the number of bytes to write). + */ /** * Given [aaaa|bbbb|bbcc|cccc] our goal is to produce: * t2 => [0ccc|cccc] [10cc|cccc] * s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb]) */ -#define simdutf_vec(x) _mm_set1_epi16(static_cast(x)) // [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc] - const __m128i t0 = _mm_shuffle_epi8(in, dup_even); - // [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc] - const __m128i t1 = _mm_and_si128(t0, simdutf_vec(0b0011111101111111)); + __m256i t0 = __lasx_xvpickev_b(in, in); + t0 = __lasx_xvilvl_b(t0, t0); + + // [bbcc|cccc|bbcc|cccc] => [00cc|cccc|00cc|cccc] + __m256i v_3f7f = __lasx_xvreplgr2vr_h(uint16_t(0x3F7F)); + __m256i t1 = __lasx_xvand_v(t0, v_3f7f); // [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc] - const __m128i t2 = _mm_or_si128(t1, simdutf_vec(0b1000000000000000)); + __m256i t2 = __lasx_xvor_v(t1, __lasx_xvldi(-2688)); - // [aaaa|bbbb|bbcc|cccc] => [0000|aaaa|bbbb|bbcc] - const __m128i s0 = _mm_srli_epi16(in, 4); - // [0000|aaaa|bbbb|bbcc] => [0000|aaaa|bbbb|bb00] - const __m128i s1 = _mm_and_si128(s0, simdutf_vec(0b0000111111111100)); - // [0000|aaaa|bbbb|bb00] => [00bb|bbbb|0000|aaaa] - const __m128i s2 = _mm_maddubs_epi16(s1, simdutf_vec(0x0140)); - // [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa] - const __m128i s3 = _mm_or_si128(s2, simdutf_vec(0b1100000011100000)); - const __m128i m0 = _mm_andnot_si128(one_or_two_bytes_bytemask, - simdutf_vec(0b0100000000000000)); - const __m128i s4 = _mm_xor_si128(s3, m0); -#undef simdutf_vec + // s0: [aaaa|bbbb|bbcc|cccc] => [0000|0000|0000|aaaa] + __m256i s0 = __lasx_xvsrli_h(in, 12); + // s1: [aaaa|bbbb|bbcc|cccc] => [0000|bbbb|bb00|0000] + __m256i s1 = __lasx_xvslli_h(in, 2); + // s1: [aabb|bbbb|cccc|cc00] => [00bb|bbbb|0000|0000] + s1 = __lasx_xvand_v(s1, __lasx_xvldi(-2753 /*0x3F00*/)); + + // [00bb|bbbb|0000|aaaa] + __m256i s2 = __lasx_xvor_v(s0, s1); + // s3: [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa] + __m256i v_c0e0 = __lasx_xvreplgr2vr_h(uint16_t(0xC0E0)); + __m256i s3 = __lasx_xvor_v(s2, v_c0e0); + __m256i one_or_two_bytes_bytemask = __lasx_xvsle_hu(in, v_07ff); + __m256i m0 = __lasx_xvandn_v(one_or_two_bytes_bytemask, + __lasx_xvldi(-2752 /*0x4000*/)); + __m256i s4 = __lasx_xvxor_v(s3, m0); // 4. expand code units 16-bit => 32-bit - const __m128i out0 = _mm_unpacklo_epi16(t2, s4); - const __m128i out1 = _mm_unpackhi_epi16(t2, s4); + __m256i out0 = __lasx_xvilvl_h(s4, t2); + __m256i out1 = __lasx_xvilvh_h(s4, t2); // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle - const uint16_t mask = - (one_byte_bitmask & 0x5555) | (one_or_two_bytes_bitmask & 0xaaaa); - if (mask == 0) { - // We only have three-byte code units. Use fast path. - const __m128i shuffle = _mm_setr_epi8(2, 3, 1, 6, 7, 5, 10, 11, 9, 14, - 15, 13, -1, -1, -1, -1); - const __m128i utf8_0 = _mm_shuffle_epi8(out0, shuffle); - const __m128i utf8_1 = _mm_shuffle_epi8(out1, shuffle); - _mm_storeu_si128((__m128i *)utf8_output, utf8_0); - utf8_output += 12; - _mm_storeu_si128((__m128i *)utf8_output, utf8_1); - utf8_output += 12; - buf += 8; - continue; - } - const uint8_t mask0 = uint8_t(mask); - + __m256i one_byte_bytemask = __lasx_xvsle_hu(in, __lasx_xvrepli_h(0x7F)); + __m256i one_byte_bytemask_low = + __lasx_xvilvl_h(one_byte_bytemask, one_byte_bytemask); + __m256i one_byte_bytemask_high = + __lasx_xvilvh_h(one_byte_bytemask, one_byte_bytemask); + + __m256i one_or_two_bytes_bytemask_low = + __lasx_xvilvl_h(one_or_two_bytes_bytemask, zero); + __m256i one_or_two_bytes_bytemask_high = + __lasx_xvilvh_h(one_or_two_bytes_bytemask, zero); + + __m256i mask0 = __lasx_xvmskltz_h( + __lasx_xvor_v(one_or_two_bytes_bytemask_low, one_byte_bytemask_low)); + __m256i mask1 = __lasx_xvmskltz_h(__lasx_xvor_v( + one_or_two_bytes_bytemask_high, one_byte_bytemask_high)); + + uint32_t mask = __lasx_xvpickve2gr_wu(mask0, 0); const uint8_t *row0 = - &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask0][0]; - const __m128i shuffle0 = _mm_loadu_si128((__m128i *)(row0 + 1)); - const __m128i utf8_0 = _mm_shuffle_epi8(out0, shuffle0); - - const uint8_t mask1 = static_cast(mask >> 8); + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask & 0xFF] + [0]; + __m128i shuffle0 = __lsx_vld(row0, 1); + __m128i utf8_0 = + __lsx_vshuf_b(zero_128, lasx_extracti128_lo(out0), shuffle0); + __lsx_vst(utf8_0, utf8_output, 0); + utf8_output += row0[0]; + mask = __lasx_xvpickve2gr_wu(mask1, 0); const uint8_t *row1 = - &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask1][0]; - const __m128i shuffle1 = _mm_loadu_si128((__m128i *)(row1 + 1)); - const __m128i utf8_1 = _mm_shuffle_epi8(out1, shuffle1); - - _mm_storeu_si128((__m128i *)utf8_output, utf8_0); - utf8_output += row0[0]; - _mm_storeu_si128((__m128i *)utf8_output, utf8_1); + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask & 0xFF] + [0]; + __m128i shuffle1 = __lsx_vld(row1, 1); + __m128i utf8_1 = + __lsx_vshuf_b(zero_128, lasx_extracti128_lo(out1), shuffle1); + __lsx_vst(utf8_1, utf8_output, 0); utf8_output += row1[0]; - buf += 8; + mask = __lasx_xvpickve2gr_wu(mask0, 4); + const uint8_t *row2 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask & 0xFF] + [0]; + __m128i shuffle2 = __lsx_vld(row2, 1); + __m128i utf8_2 = + __lsx_vshuf_b(zero_128, lasx_extracti128_hi(out0), shuffle2); + __lsx_vst(utf8_2, utf8_output, 0); + utf8_output += row2[0]; + + mask = __lasx_xvpickve2gr_wu(mask1, 4); + const uint8_t *row3 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask & 0xFF] + [0]; + __m128i shuffle3 = __lsx_vld(row3, 1); + __m128i utf8_3 = + __lsx_vshuf_b(zero_128, lasx_extracti128_hi(out1), shuffle3); + __lsx_vst(utf8_3, utf8_output, 0); + utf8_output += row3[0]; + + buf += 16; // surrogate pair(s) in a register } else { // Let us do a scalar fallback. @@ -36665,7 +52104,9 @@ sse_convert_utf16_to_utf8_with_errors(const char16_t *buf, size_t len, forward = size_t(end - buf - 1); } for (; k < forward; k++) { - uint16_t word = big_endian ? scalar::utf16::swap_bytes(buf[k]) : buf[k]; + uint16_t word = !match_system(big_endian) + ? scalar::utf16::swap_bytes(buf[k]) + : buf[k]; if ((word & 0xFF80) == 0) { *utf8_output++ = char(word); } else if ((word & 0xF800) == 0) { @@ -36678,14 +52119,15 @@ sse_convert_utf16_to_utf8_with_errors(const char16_t *buf, size_t len, } else { // must be a surrogate pair uint16_t diff = uint16_t(word - 0xD800); - uint16_t next_word = - big_endian ? scalar::utf16::swap_bytes(buf[k + 1]) : buf[k + 1]; + uint16_t next_word = !match_system(big_endian) + ? scalar::utf16::swap_bytes(buf[k + 1]) + : buf[k + 1]; k++; uint16_t diff2 = uint16_t(next_word - 0xDC00); if ((diff | diff2) > 0x3FF) { return std::make_pair( result(error_code::SURROGATE, buf - start + k - 1), - utf8_output); + reinterpret_cast(utf8_output)); } uint32_t value = (diff << 10) + diff2 + 0x10000; *utf8_output++ = char((value >> 18) | 0b11110000); @@ -36698,101 +52140,67 @@ sse_convert_utf16_to_utf8_with_errors(const char16_t *buf, size_t len, } } // while - return std::make_pair(result(error_code::SUCCESS, buf - start), utf8_output); + return std::make_pair(result(error_code::SUCCESS, buf - start), + reinterpret_cast(utf8_output)); } -/* end file src/westmere/sse_convert_utf16_to_utf8.cpp */ -/* begin file src/westmere/sse_convert_utf16_to_utf32.cpp */ -/* - The vectorized algorithm works on single SSE register i.e., it - loads eight 16-bit code units. - - We consider three cases: - 1. an input register contains no surrogates and each value - is in range 0x0000 .. 0x07ff. - 2. an input register contains no surrogates and values are - is in range 0x0000 .. 0xffff. - 3. an input register contains surrogates --- i.e. codepoints - can have 16 or 32 bits. - - Ad 1. - - When values are less than 0x0800, it means that a 16-bit code unit - can be converted into: 1) single UTF8 byte (when it's an ASCII - char) or 2) two UTF8 bytes. - - For this case we do only some shuffle to obtain these 2-byte - codes and finally compress the whole SSE register with a single - shuffle. - - We need 256-entry lookup table to get a compression pattern - and the number of output bytes in the compressed vector register. - Each entry occupies 17 bytes. - - Ad 2. - - When values fit in 16-bit code units, but are above 0x07ff, then - a single word may produce one, two or three UTF8 bytes. - - We prepare data for all these three cases in two registers. - The first register contains lower two UTF8 bytes (used in all - cases), while the second one contains just the third byte for - the three-UTF8-bytes case. - - Finally these two registers are interleaved forming eight-element - array of 32-bit values. The array spans two SSE registers. - The bytes from the registers are compressed using two shuffles. - - We need 256-entry lookup table to get a compression pattern - and the number of output bytes in the compressed vector register. - Each entry occupies 17 bytes. - - - To summarize: - - We need two 256-entry tables that have 8704 bytes in total. -*/ - -/* - Returns a pair: the first unprocessed byte from buf and utf8_output - A scalar routing should carry on the conversion of the tail. -*/ +/* end file src/lasx/lasx_convert_utf16_to_utf8.cpp */ +/* begin file src/lasx/lasx_convert_utf16_to_utf32.cpp */ template std::pair -sse_convert_utf16_to_utf32(const char16_t *buf, size_t len, - char32_t *utf32_output) { +lasx_convert_utf16_to_utf32(const char16_t *buf, size_t len, + char32_t *utf32_out) { + uint32_t *utf32_output = reinterpret_cast(utf32_out); const char16_t *end = buf + len; - const __m128i v_f800 = _mm_set1_epi16((int16_t)0xf800); - const __m128i v_d800 = _mm_set1_epi16((int16_t)0xd800); + // Performance degradation when memory address is not 32-byte aligned + while (((uint64_t)utf32_output & 0x1f) && buf < end) { + uint16_t word = + !match_system(big_endian) ? scalar::utf16::swap_bytes(buf[0]) : buf[0]; + if ((word & 0xF800) != 0xD800) { + *utf32_output++ = char32_t(word); + buf++; + } else { + if (buf + 1 >= end) { + return std::make_pair(nullptr, + reinterpret_cast(utf32_output)); + } + // must be a surrogate pair + uint16_t diff = uint16_t(word - 0xD800); + uint16_t next_word = !match_system(big_endian) + ? scalar::utf16::swap_bytes(buf[1]) + : buf[1]; + uint16_t diff2 = uint16_t(next_word - 0xDC00); + if ((diff | diff2) > 0x3FF) { + return std::make_pair(nullptr, + reinterpret_cast(utf32_output)); + } + uint32_t value = (diff << 10) + diff2 + 0x10000; + *utf32_output++ = char32_t(value); + buf += 2; + } + } - while (end - buf >= 8) { - __m128i in = _mm_loadu_si128((__m128i *)buf); + __m256i v_f800 = __lasx_xvldi(-2568); /*0xF800*/ + __m256i v_d800 = __lasx_xvldi(-2600); /*0xD800*/ - if (big_endian) { - const __m128i swap = - _mm_setr_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14); - in = _mm_shuffle_epi8(in, swap); + while (buf + 16 <= end) { + __m256i in = __lasx_xvld(reinterpret_cast(buf), 0); + if (!match_system(big_endian)) { + in = lasx_swap_bytes(in); } - // 1. Check if there are any surrogate word in the input chunk. - // We have also deal with situation when there is a surrogate word - // at the end of a chunk. - const __m128i surrogates_bytemask = - _mm_cmpeq_epi16(_mm_and_si128(in, v_f800), v_d800); - - // bitmask = 0x0000 if there are no surrogates - // = 0xc000 if the last word is a surrogate - const uint16_t surrogates_bitmask = - static_cast(_mm_movemask_epi8(surrogates_bytemask)); + __m256i surrogates_bytemask = + __lasx_xvseq_h(__lasx_xvand_v(in, v_f800), v_d800); // It might seem like checking for surrogates_bitmask == 0xc000 could help. // However, it is likely an uncommon occurrence. - if (surrogates_bitmask == 0x0000) { - // case: no surrogate pair, extend 16-bit code units to 32-bit code units - _mm_storeu_si128(reinterpret_cast<__m128i *>(utf32_output), - _mm_cvtepu16_epi32(in)); - _mm_storeu_si128(reinterpret_cast<__m128i *>(utf32_output + 4), - _mm_cvtepu16_epi32(_mm_srli_si128(in, 8))); - utf32_output += 8; - buf += 8; + if (__lasx_xbz_v(surrogates_bytemask)) { + // case: no surrogate pairs, extend all 16-bit code units to 32-bit code + // units + __m256i in_hi = __lasx_xvpermi_q(in, in, 0b00000001); + __lasx_xvst(__lasx_vext2xv_wu_hu(in), utf32_output, 0); + __lasx_xvst(__lasx_vext2xv_wu_hu(in_hi), utf32_output, 32); + utf32_output += 16; + buf += 16; // surrogate pair(s) in a register } else { // Let us do a scalar fallback. @@ -36804,18 +52212,22 @@ sse_convert_utf16_to_utf32(const char16_t *buf, size_t len, forward = size_t(end - buf - 1); } for (; k < forward; k++) { - uint16_t word = big_endian ? scalar::utf16::swap_bytes(buf[k]) : buf[k]; + uint16_t word = !match_system(big_endian) + ? scalar::utf16::swap_bytes(buf[k]) + : buf[k]; if ((word & 0xF800) != 0xD800) { *utf32_output++ = char32_t(word); } else { // must be a surrogate pair uint16_t diff = uint16_t(word - 0xD800); - uint16_t next_word = - big_endian ? scalar::utf16::swap_bytes(buf[k + 1]) : buf[k + 1]; + uint16_t next_word = !match_system(big_endian) + ? scalar::utf16::swap_bytes(buf[k + 1]) + : buf[k + 1]; k++; uint16_t diff2 = uint16_t(next_word - 0xDC00); if ((diff | diff2) > 0x3FF) { - return std::make_pair(nullptr, utf32_output); + return std::make_pair(nullptr, + reinterpret_cast(utf32_output)); } uint32_t value = (diff << 10) + diff2 + 0x10000; *utf32_output++ = char32_t(value); @@ -36824,7 +52236,7 @@ sse_convert_utf16_to_utf32(const char16_t *buf, size_t len, buf += k; } } // while - return std::make_pair(buf, utf32_output); + return std::make_pair(buf, reinterpret_cast(utf32_output)); } /* @@ -36836,43 +52248,59 @@ sse_convert_utf16_to_utf32(const char16_t *buf, size_t len, */ template std::pair -sse_convert_utf16_to_utf32_with_errors(const char16_t *buf, size_t len, - char32_t *utf32_output) { +lasx_convert_utf16_to_utf32_with_errors(const char16_t *buf, size_t len, + char32_t *utf32_out) { + uint32_t *utf32_output = reinterpret_cast(utf32_out); const char16_t *start = buf; const char16_t *end = buf + len; - const __m128i v_f800 = _mm_set1_epi16((int16_t)0xf800); - const __m128i v_d800 = _mm_set1_epi16((int16_t)0xd800); - - while (end - buf >= 8) { - __m128i in = _mm_loadu_si128((__m128i *)buf); - - if (big_endian) { - const __m128i swap = - _mm_setr_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14); - in = _mm_shuffle_epi8(in, swap); + // Performance degradation when memory address is not 32-byte aligned + while (((uint64_t)utf32_output & 0x1f) && buf < end) { + uint16_t word = + !match_system(big_endian) ? scalar::utf16::swap_bytes(buf[0]) : buf[0]; + if ((word & 0xF800) != 0xD800) { + *utf32_output++ = char32_t(word); + buf++; + } else if (buf + 1 < end) { + // must be a surrogate pair + uint16_t diff = uint16_t(word - 0xD800); + uint16_t next_word = !match_system(big_endian) + ? scalar::utf16::swap_bytes(buf[1]) + : buf[1]; + uint16_t diff2 = uint16_t(next_word - 0xDC00); + if ((diff | diff2) > 0x3FF) { + return std::make_pair(result(error_code::SURROGATE, buf - start), + reinterpret_cast(utf32_output)); + } + uint32_t value = (diff << 10) + diff2 + 0x10000; + *utf32_output++ = char32_t(value); + buf += 2; + } else { + return std::make_pair(result(error_code::SURROGATE, buf - start), + reinterpret_cast(utf32_output)); } + } - // 1. Check if there are any surrogate word in the input chunk. - // We have also deal with situation when there is a surrogate word - // at the end of a chunk. - const __m128i surrogates_bytemask = - _mm_cmpeq_epi16(_mm_and_si128(in, v_f800), v_d800); + __m256i v_f800 = __lasx_xvldi(-2568); /*0xF800*/ + __m256i v_d800 = __lasx_xvldi(-2600); /*0xD800*/ + while (buf + 16 <= end) { + __m256i in = __lasx_xvld(reinterpret_cast(buf), 0); + if (!match_system(big_endian)) { + in = lasx_swap_bytes(in); + } - // bitmask = 0x0000 if there are no surrogates - // = 0xc000 if the last word is a surrogate - const uint16_t surrogates_bitmask = - static_cast(_mm_movemask_epi8(surrogates_bytemask)); + __m256i surrogates_bytemask = + __lasx_xvseq_h(__lasx_xvand_v(in, v_f800), v_d800); // It might seem like checking for surrogates_bitmask == 0xc000 could help. // However, it is likely an uncommon occurrence. - if (surrogates_bitmask == 0x0000) { - // case: no surrogate pair, extend 16-bit code units to 32-bit code units - _mm_storeu_si128(reinterpret_cast<__m128i *>(utf32_output), - _mm_cvtepu16_epi32(in)); - _mm_storeu_si128(reinterpret_cast<__m128i *>(utf32_output + 4), - _mm_cvtepu16_epi32(_mm_srli_si128(in, 8))); - utf32_output += 8; - buf += 8; + if (__lasx_xbz_v(surrogates_bytemask)) { + // case: no surrogate pairs, extend all 16-bit code units to 32-bit code + // units + __m256i in_hi = __lasx_xvpermi_q(in, in, 0b00000001); + __lasx_xvst(__lasx_vext2xv_wu_hu(in), utf32_output, 0); + __lasx_xvst(__lasx_vext2xv_wu_hu(in_hi), utf32_output, 32); + utf32_output += 16; + buf += 16; // surrogate pair(s) in a register } else { // Let us do a scalar fallback. @@ -36884,20 +52312,23 @@ sse_convert_utf16_to_utf32_with_errors(const char16_t *buf, size_t len, forward = size_t(end - buf - 1); } for (; k < forward; k++) { - uint16_t word = big_endian ? scalar::utf16::swap_bytes(buf[k]) : buf[k]; + uint16_t word = !match_system(big_endian) + ? scalar::utf16::swap_bytes(buf[k]) + : buf[k]; if ((word & 0xF800) != 0xD800) { *utf32_output++ = char32_t(word); } else { // must be a surrogate pair uint16_t diff = uint16_t(word - 0xD800); - uint16_t next_word = - big_endian ? scalar::utf16::swap_bytes(buf[k + 1]) : buf[k + 1]; + uint16_t next_word = !match_system(big_endian) + ? scalar::utf16::swap_bytes(buf[k + 1]) + : buf[k + 1]; k++; uint16_t diff2 = uint16_t(next_word - 0xDC00); if ((diff | diff2) > 0x3FF) { return std::make_pair( result(error_code::SURROGATE, buf - start + k - 1), - utf32_output); + reinterpret_cast(utf32_output)); } uint32_t value = (diff << 10) + diff2 + 0x10000; *utf32_output++ = char32_t(value); @@ -36906,379 +52337,337 @@ sse_convert_utf16_to_utf32_with_errors(const char16_t *buf, size_t len, buf += k; } } // while - return std::make_pair(result(error_code::SUCCESS, buf - start), utf32_output); + return std::make_pair(result(error_code::SUCCESS, buf - start), + reinterpret_cast(utf32_output)); } -/* end file src/westmere/sse_convert_utf16_to_utf32.cpp */ +/* end file src/lasx/lasx_convert_utf16_to_utf32.cpp */ -/* begin file src/westmere/sse_convert_utf32_to_latin1.cpp */ +/* begin file src/lasx/lasx_convert_utf32_to_latin1.cpp */ std::pair -sse_convert_utf32_to_latin1(const char32_t *buf, size_t len, - char *latin1_output) { - const size_t rounded_len = len & ~0xF; // Round down to nearest multiple of 16 - - __m128i high_bytes_mask = _mm_set1_epi32(0xFFFFFF00); - __m128i shufmask = - _mm_set_epi8(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12, 8, 4, 0); - - for (size_t i = 0; i < rounded_len; i += 16) { - __m128i in1 = _mm_loadu_si128((__m128i *)buf); - __m128i in2 = _mm_loadu_si128((__m128i *)(buf + 4)); - __m128i in3 = _mm_loadu_si128((__m128i *)(buf + 8)); - __m128i in4 = _mm_loadu_si128((__m128i *)(buf + 12)); +lasx_convert_utf32_to_latin1(const char32_t *buf, size_t len, + char *latin1_output) { + const char32_t *end = buf + len; + const __m256i shuf_mask = ____m256i( + (__m128i)v16u8{0, 4, 8, 12, 16, 20, 24, 28, 0, 0, 0, 0, 0, 0, 0, 0}); + __m256i v_ff = __lasx_xvrepli_w(0xFF); - __m128i check_combined = _mm_or_si128(in1, in2); - check_combined = _mm_or_si128(check_combined, in3); - check_combined = _mm_or_si128(check_combined, in4); + while (buf + 16 <= end) { + __m256i in1 = __lasx_xvld(reinterpret_cast(buf), 0); + __m256i in2 = __lasx_xvld(reinterpret_cast(buf), 32); - if (!_mm_testz_si128(check_combined, high_bytes_mask)) { - return std::make_pair(nullptr, latin1_output); + __m256i in12 = __lasx_xvor_v(in1, in2); + if (__lasx_xbz_v(__lasx_xvslt_wu(v_ff, in12))) { + // 1. pack the bytes + __m256i latin1_packed_tmp = __lasx_xvshuf_b(in2, in1, shuf_mask); + latin1_packed_tmp = __lasx_xvpermi_d(latin1_packed_tmp, 0b00001000); + __m128i latin1_packed = lasx_extracti128_lo(latin1_packed_tmp); + latin1_packed = __lsx_vpermi_w(latin1_packed, latin1_packed, 0b11011000); + // 2. store (8 bytes) + __lsx_vst(latin1_packed, reinterpret_cast(latin1_output), 0); + // 3. adjust pointers + buf += 16; + latin1_output += 16; + } else { + return std::make_pair(nullptr, reinterpret_cast(latin1_output)); } - __m128i pack1 = _mm_unpacklo_epi32(_mm_shuffle_epi8(in1, shufmask), - _mm_shuffle_epi8(in2, shufmask)); - __m128i pack2 = _mm_unpacklo_epi32(_mm_shuffle_epi8(in3, shufmask), - _mm_shuffle_epi8(in4, shufmask)); - __m128i pack = _mm_unpacklo_epi64(pack1, pack2); - _mm_storeu_si128((__m128i *)latin1_output, pack); - latin1_output += 16; - buf += 16; - } - + } // while return std::make_pair(buf, latin1_output); } std::pair -sse_convert_utf32_to_latin1_with_errors(const char32_t *buf, size_t len, - char *latin1_output) { +lasx_convert_utf32_to_latin1_with_errors(const char32_t *buf, size_t len, + char *latin1_output) { const char32_t *start = buf; - const size_t rounded_len = len & ~0xF; // Round down to nearest multiple of 16 - - __m128i high_bytes_mask = _mm_set1_epi32(0xFFFFFF00); - __m128i shufmask = - _mm_set_epi8(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12, 8, 4, 0); - - for (size_t i = 0; i < rounded_len; i += 16) { - __m128i in1 = _mm_loadu_si128((__m128i *)buf); - __m128i in2 = _mm_loadu_si128((__m128i *)(buf + 4)); - __m128i in3 = _mm_loadu_si128((__m128i *)(buf + 8)); - __m128i in4 = _mm_loadu_si128((__m128i *)(buf + 12)); + const char32_t *end = buf + len; - __m128i check_combined = _mm_or_si128(in1, in2); - check_combined = _mm_or_si128(check_combined, in3); - check_combined = _mm_or_si128(check_combined, in4); + const __m256i shuf_mask = ____m256i( + (__m128i)v16u8{0, 4, 8, 12, 16, 20, 24, 28, 0, 0, 0, 0, 0, 0, 0, 0}); + __m256i v_ff = __lasx_xvrepli_w(0xFF); - if (!_mm_testz_si128(check_combined, high_bytes_mask)) { - // Fallback to scalar code for handling errors + while (buf + 16 <= end) { + __m256i in1 = __lasx_xvld(reinterpret_cast(buf), 0); + __m256i in2 = __lasx_xvld(reinterpret_cast(buf), 32); + + __m256i in12 = __lasx_xvor_v(in1, in2); + if (__lasx_xbz_v(__lasx_xvslt_wu(v_ff, in12))) { + // 1. pack the bytes + __m256i latin1_packed_tmp = __lasx_xvshuf_b(in2, in1, shuf_mask); + latin1_packed_tmp = __lasx_xvpermi_d(latin1_packed_tmp, 0b00001000); + __m128i latin1_packed = lasx_extracti128_lo(latin1_packed_tmp); + latin1_packed = __lsx_vpermi_w(latin1_packed, latin1_packed, 0b11011000); + // 2. store (8 bytes) + __lsx_vst(latin1_packed, reinterpret_cast(latin1_output), 0); + // 3. adjust pointers + buf += 16; + latin1_output += 16; + } else { + // Let us do a scalar fallback. for (int k = 0; k < 16; k++) { - char32_t codepoint = buf[k]; - if (codepoint <= 0xff) { - *latin1_output++ = char(codepoint); + uint32_t word = buf[k]; + if (word <= 0xff) { + *latin1_output++ = char(word); } else { return std::make_pair(result(error_code::TOO_LARGE, buf - start + k), latin1_output); } } - buf += 16; - continue; } - __m128i pack1 = _mm_unpacklo_epi32(_mm_shuffle_epi8(in1, shufmask), - _mm_shuffle_epi8(in2, shufmask)); - __m128i pack2 = _mm_unpacklo_epi32(_mm_shuffle_epi8(in3, shufmask), - _mm_shuffle_epi8(in4, shufmask)); - __m128i pack = _mm_unpacklo_epi64(pack1, pack2); - _mm_storeu_si128((__m128i *)latin1_output, pack); - latin1_output += 16; - buf += 16; - } - + } // while return std::make_pair(result(error_code::SUCCESS, buf - start), latin1_output); } -/* end file src/westmere/sse_convert_utf32_to_latin1.cpp */ -/* begin file src/westmere/sse_convert_utf32_to_utf8.cpp */ +/* end file src/lasx/lasx_convert_utf32_to_latin1.cpp */ +/* begin file src/lasx/lasx_convert_utf32_to_utf8.cpp */ std::pair -sse_convert_utf32_to_utf8(const char32_t *buf, size_t len, char *utf8_output) { +lasx_convert_utf32_to_utf8(const char32_t *buf, size_t len, char *utf8_out) { + uint8_t *utf8_output = reinterpret_cast(utf8_out); const char32_t *end = buf + len; - const __m128i v_0000 = _mm_setzero_si128(); //__m128 = 128 bits - const __m128i v_f800 = _mm_set1_epi16((uint16_t)0xf800); // 1111 1000 0000 - // 0000 - const __m128i v_c080 = _mm_set1_epi16((uint16_t)0xc080); // 1100 0000 1000 - // 0000 - const __m128i v_ff80 = _mm_set1_epi16((uint16_t)0xff80); // 1111 1111 1000 - // 0000 - const __m128i v_ffff0000 = _mm_set1_epi32( - (uint32_t)0xffff0000); // 1111 1111 1111 1111 0000 0000 0000 0000 - const __m128i v_7fffffff = _mm_set1_epi32( - (uint32_t)0x7fffffff); // 0111 1111 1111 1111 1111 1111 1111 1111 - __m128i running_max = _mm_setzero_si128(); - __m128i forbidden_bytemask = _mm_setzero_si128(); + // load addr align 32 + while (((uint64_t)buf & 0x1F) && buf < end) { + uint32_t word = *buf; + if ((word & 0xFFFFFF80) == 0) { + *utf8_output++ = char(word); + } else if ((word & 0xFFFFF800) == 0) { + *utf8_output++ = char((word >> 6) | 0b11000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + } else if ((word & 0xFFFF0000) == 0) { + if (word >= 0xD800 && word <= 0xDFFF) { + return std::make_pair(nullptr, reinterpret_cast(utf8_output)); + } + *utf8_output++ = char((word >> 12) | 0b11100000); + *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + } else { + if (word > 0x10FFFF) { + return std::make_pair(nullptr, reinterpret_cast(utf8_output)); + } + *utf8_output++ = char((word >> 18) | 0b11110000); + *utf8_output++ = char(((word >> 12) & 0b111111) | 0b10000000); + *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + } + buf++; + } + + __m256i v_c080 = __lasx_xvreplgr2vr_h(uint16_t(0xC080)); + __m256i v_07ff = __lasx_xvreplgr2vr_h(uint16_t(0x7FF)); + __m256i v_dfff = __lasx_xvreplgr2vr_h(uint16_t(0xDFFF)); + __m256i v_d800 = __lasx_xvldi(-2600); /*0xD800*/ + __m256i zero = __lasx_xvldi(0); + __m128i zero_128 = __lsx_vldi(0); + __m256i forbidden_bytemask = __lasx_xvldi(0x0); + const size_t safety_margin = 12; // to avoid overruns, see issue // https://github.com/simdutf/simdutf/issues/92 - while (end - buf >= - std::ptrdiff_t( - 16 + safety_margin)) { // buf is a char32_t pointer, each char32_t - // has 4 bytes or 32 bits, thus buf + 16 * - // char_32t = 512 bits = 64 bytes - // We load two 16 bytes registers for a total of 32 bytes or 16 characters. - __m128i in = _mm_loadu_si128((__m128i *)buf); - __m128i nextin = _mm_loadu_si128( - (__m128i *)buf + 1); // These two values can hold only 8 UTF32 chars - running_max = _mm_max_epu32( - _mm_max_epu32(in, running_max), // take element-wise max char32_t from - // in and running_max vector - nextin); // and take element-wise max element from nextin and - // running_max vector - - // Pack 32-bit UTF-32 code units to 16-bit UTF-16 code units with unsigned - // saturation - __m128i in_16 = _mm_packus_epi32( - _mm_and_si128(in, v_7fffffff), - _mm_and_si128( - nextin, - v_7fffffff)); // in this context pack the two __m128 into a single - // By ensuring the highest bit is set to 0(&v_7fffffff), we are making sure - // all values are interpreted as non-negative, or specifically, the values - // are within the range of valid Unicode code points. remember : having - // leading byte 0 means a positive number by the two complements system. - // Unicode is well beneath the range where you'll start getting issues so - // that's OK. - - // Try to apply UTF-16 => UTF-8 from ./sse_convert_utf16_to_utf8.cpp + while (buf + 16 + safety_margin < end) { + __m256i in = __lasx_xvld(reinterpret_cast(buf), 0); + __m256i nextin = __lasx_xvld(reinterpret_cast(buf), 32); - // Check for ASCII fast path + // Check if no bits set above 16th + if (__lasx_xbz_v(__lasx_xvpickod_h(in, nextin))) { + // Pack UTF-32 to UTF-16 safely (without surrogate pairs) + // Apply UTF-16 => UTF-8 routine (lasx_convert_utf16_to_utf8.cpp) + __m256i utf16_packed = + __lasx_xvpermi_d(__lasx_xvpickev_h(nextin, in), 0b11011000); - // ASCII fast path!!!! - // We eagerly load another 32 bytes, hoping that they will be ASCII too. - // The intuition is that we try to collect 16 ASCII characters which - // requires a total of 64 bytes of input. If we fail, we just pass thirdin - // and fourthin as our new inputs. - if (_mm_testz_si128(in_16, v_ff80)) { // if the first two blocks are ASCII - __m128i thirdin = _mm_loadu_si128((__m128i *)buf + 2); - __m128i fourthin = _mm_loadu_si128((__m128i *)buf + 3); - running_max = _mm_max_epu32( - _mm_max_epu32(thirdin, running_max), - fourthin); // take the running max of all 4 vectors thus far - __m128i nextin_16 = _mm_packus_epi32( - _mm_and_si128(thirdin, v_7fffffff), - _mm_and_si128(fourthin, - v_7fffffff)); // pack into 1 vector, now you have two - if (!_mm_testz_si128( - nextin_16, - v_ff80)) { // checks if the second packed vector is ASCII, if not: + if (__lasx_xbz_v(__lasx_xvslt_hu(__lasx_xvrepli_h(0x7F), + utf16_packed))) { // ASCII fast path!!!! // 1. pack the bytes // obviously suboptimal. - const __m128i utf8_packed = _mm_packus_epi16( - in_16, in_16); // creates two copy of in_16 in 1 vector - // 2. store (16 bytes) - _mm_storeu_si128((__m128i *)utf8_output, - utf8_packed); // put them into the output - // 3. adjust pointers - buf += 8; // the char32_t buffer pointer goes up 8 char32_t chars* 32 - // bits = 256 bits - utf8_output += - 8; // same with output, e.g. lift the first two blocks alone. - // Proceed with next input - in_16 = nextin_16; - // We need to update in and nextin because they are used later. - in = thirdin; - nextin = fourthin; - } else { - // 1. pack the bytes - const __m128i utf8_packed = _mm_packus_epi16(in_16, nextin_16); - // 2. store (16 bytes) - _mm_storeu_si128((__m128i *)utf8_output, utf8_packed); + __m256i utf8_packed = __lasx_xvpermi_d( + __lasx_xvpickev_b(utf16_packed, utf16_packed), 0b00001000); + // 2. store (8 bytes) + __lsx_vst(lasx_extracti128_lo(utf8_packed), utf8_output, 0); // 3. adjust pointers buf += 16; utf8_output += 16; continue; // we are done for this round! } - } - - // no bits set above 7th bit -- find out all the ASCII characters - const __m128i one_byte_bytemask = - _mm_cmpeq_epi16( // this takes four bytes at a time and compares: - _mm_and_si128(in_16, v_ff80), // the vector that get only the first - // 9 bits of each 16-bit/2-byte units - v_0000 // - ); // they should be all zero if they are ASCII. E.g. ASCII in UTF32 is - // of format 0000 0000 0000 0XXX XXXX - // _mm_cmpeq_epi16 should now return a 1111 1111 1111 1111 for equals, and - // 0000 0000 0000 0000 if not for each 16-bit/2-byte units - const uint16_t one_byte_bitmask = static_cast(_mm_movemask_epi8( - one_byte_bytemask)); // collect the MSB from previous vector and put - // them into uint16_t mas - - // no bits set above 11th bit - const __m128i one_or_two_bytes_bytemask = - _mm_cmpeq_epi16(_mm_and_si128(in_16, v_f800), v_0000); - const uint16_t one_or_two_bytes_bitmask = - static_cast(_mm_movemask_epi8(one_or_two_bytes_bytemask)); - - if (one_or_two_bytes_bitmask == 0xffff) { - // case: all code units either produce 1 or 2 UTF-8 bytes (at least one - // produces 2 bytes) - // 1. prepare 2-byte values - // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8 - // expected output : [110a|aaaa|10bb|bbbb] x 8 - const __m128i v_1f00 = - _mm_set1_epi16((int16_t)0x1f00); // 0001 1111 0000 0000 - const __m128i v_003f = - _mm_set1_epi16((int16_t)0x003f); // 0000 0000 0011 1111 - - // t0 = [000a|aaaa|bbbb|bb00] - const __m128i t0 = _mm_slli_epi16(in_16, 2); // shift packed vector by two - // t1 = [000a|aaaa|0000|0000] - const __m128i t1 = - _mm_and_si128(t0, v_1f00); // potentital first utf8 byte - // t2 = [0000|0000|00bb|bbbb] - const __m128i t2 = - _mm_and_si128(in_16, v_003f); // potential second utf8 byte - // t3 = [000a|aaaa|00bb|bbbb] - const __m128i t3 = - _mm_or_si128(t1, t2); // first and second potential utf8 byte together - // t4 = [110a|aaaa|10bb|bbbb] - const __m128i t4 = _mm_or_si128( - t3, - v_c080); // t3 | 1100 0000 1000 0000 = full potential 2-byte utf8 unit - - // 2. merge ASCII and 2-byte codewords - const __m128i utf8_unpacked = - _mm_blendv_epi8(t4, in_16, one_byte_bytemask); - - // 3. prepare bitmask for 8-bit lookup - // one_byte_bitmask = hhggffeeddccbbaa -- the bits are doubled (h - - // MSB, a - LSB) - const uint16_t m0 = one_byte_bitmask & 0x5555; // m0 = 0h0g0f0e0d0c0b0a - const uint16_t m1 = - static_cast(m0 >> 7); // m1 = 00000000h0g0f0e0 - const uint8_t m2 = - static_cast((m0 | m1) & 0xff); // m2 = hdgcfbea - // 4. pack the bytes - const uint8_t *row = - &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[m2][0]; - const __m128i shuffle = _mm_loadu_si128((__m128i *)(row + 1)); - const __m128i utf8_packed = _mm_shuffle_epi8(utf8_unpacked, shuffle); - - // 5. store bytes - _mm_storeu_si128((__m128i *)utf8_output, utf8_packed); - - // 6. adjust pointers - buf += 8; - utf8_output += row[0]; - continue; - } - // Check for overflow in packing - - const __m128i saturation_bytemask = _mm_cmpeq_epi32( - _mm_and_si128(_mm_or_si128(in, nextin), v_ffff0000), v_0000); - const uint32_t saturation_bitmask = - static_cast(_mm_movemask_epi8(saturation_bytemask)); - if (saturation_bitmask == 0xffff) { - // case: code units from register produce either 1, 2 or 3 UTF-8 bytes - const __m128i v_d800 = _mm_set1_epi16((uint16_t)0xd800); - forbidden_bytemask = - _mm_or_si128(forbidden_bytemask, - _mm_cmpeq_epi16(_mm_and_si128(in_16, v_f800), v_d800)); + if (__lasx_xbz_v(__lasx_xvslt_hu(v_07ff, utf16_packed))) { + // 1. prepare 2-byte values + // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8 + // expected output : [110a|aaaa|10bb|bbbb] x 8 - const __m128i dup_even = _mm_setr_epi16(0x0000, 0x0202, 0x0404, 0x0606, - 0x0808, 0x0a0a, 0x0c0c, 0x0e0e); + // t0 = [000a|aaaa|bbbb|bb00] + const __m256i t0 = __lasx_xvslli_h(utf16_packed, 2); + // t1 = [000a|aaaa|0000|0000] + const __m256i t1 = __lasx_xvand_v(t0, __lasx_xvldi(-2785 /*0x1f00*/)); + // t2 = [0000|0000|00bb|bbbb] + const __m256i t2 = __lasx_xvand_v(utf16_packed, __lasx_xvrepli_h(0x3f)); + // t3 = [000a|aaaa|00bb|bbbb] + const __m256i t3 = __lasx_xvor_v(t1, t2); + // t4 = [110a|aaaa|10bb|bbbb] + const __m256i t4 = __lasx_xvor_v(t3, v_c080); + // 2. merge ASCII and 2-byte codewords + __m256i one_byte_bytemask = + __lasx_xvsle_hu(utf16_packed, __lasx_xvrepli_h(0x7F /*0x007F*/)); + __m256i utf8_unpacked = + __lasx_xvbitsel_v(t4, utf16_packed, one_byte_bytemask); + // 3. prepare bitmask for 8-bit lookup + __m256i mask = __lasx_xvmskltz_h(one_byte_bytemask); + uint32_t m1 = __lasx_xvpickve2gr_wu(mask, 0); + uint32_t m2 = __lasx_xvpickve2gr_wu(mask, 4); + // 4. pack the bytes + const uint8_t *row1 = + &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes + [lasx_1_2_utf8_bytes_mask[m1]][0]; + __m128i shuffle1 = __lsx_vld(row1, 1); + __m128i utf8_packed1 = __lsx_vshuf_b( + zero_128, lasx_extracti128_lo(utf8_unpacked), shuffle1); + + const uint8_t *row2 = + &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes + [lasx_1_2_utf8_bytes_mask[m2]][0]; + __m128i shuffle2 = __lsx_vld(row2, 1); + __m128i utf8_packed2 = __lsx_vshuf_b( + zero_128, lasx_extracti128_hi(utf8_unpacked), shuffle2); + // 5. store bytes + __lsx_vst(utf8_packed1, utf8_output, 0); + utf8_output += row1[0]; - /* In this branch we handle three cases: - 1. [0000|0000|0ccc|cccc] => [0ccc|cccc] - - single UFT-8 byte - 2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc] - - two UTF-8 bytes - 3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - - three UTF-8 bytes + __lsx_vst(utf8_packed2, utf8_output, 0); + utf8_output += row2[0]; - We expand the input word (16-bit) into two code units (32-bit), thus - we have room for four bytes. However, we need five distinct bit - layouts. Note that the last byte in cases #2 and #3 is the same. + buf += 16; + continue; + } else { + // case: code units from register produce either 1, 2 or 3 UTF-8 bytes + forbidden_bytemask = __lasx_xvor_v( + __lasx_xvand_v( + __lasx_xvsle_h(utf16_packed, v_dfff), // utf16_packed <= 0xdfff + __lasx_xvsle_h(v_d800, utf16_packed)), // utf16_packed >= 0xd800 + forbidden_bytemask); + /* In this branch we handle three cases: + 1. [0000|0000|0ccc|cccc] => [0ccc|cccc] - + single UFT-8 byte + 2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc] - + two UTF-8 bytes + 3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - + three UTF-8 bytes + + We expand the input word (16-bit) into two code units (32-bit), thus + we have room for four bytes. However, we need five distinct bit + layouts. Note that the last byte in cases #2 and #3 is the same. + + We precompute byte 1 for case #1 and the common byte for cases #2 & + #3 in register t2. + + We precompute byte 1 for case #3 and -- **conditionally** -- + precompute either byte 1 for case #2 or byte 2 for case #3. Note that + they differ by exactly one bit. + + Finally from these two code units we build proper UTF-8 sequence, + taking into account the case (i.e, the number of bytes to write). + */ + /** + * Given [aaaa|bbbb|bbcc|cccc] our goal is to produce: + * t2 => [0ccc|cccc] [10cc|cccc] + * s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb]) + */ + // [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc] + __m256i t0 = __lasx_xvpickev_b(utf16_packed, utf16_packed); + t0 = __lasx_xvilvl_b(t0, t0); + // [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc] + __m256i v_3f7f = __lasx_xvreplgr2vr_h(uint16_t(0x3F7F)); + __m256i t1 = __lasx_xvand_v(t0, v_3f7f); + // [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc] + __m256i t2 = __lasx_xvor_v(t1, __lasx_xvldi(-2688 /*0x8000*/)); - We precompute byte 1 for case #1 and the common byte for cases #2 & #3 - in register t2. + // s0: [aaaa|bbbb|bbcc|cccc] => [0000|0000|0000|aaaa] + __m256i s0 = __lasx_xvsrli_h(utf16_packed, 12); + // s1: [aaaa|bbbb|bbcc|cccc] => [0000|bbbb|bb00|0000] + __m256i s1 = __lasx_xvslli_h(utf16_packed, 2); + // [0000|bbbb|bb00|0000] => [00bb|bbbb|0000|0000] + s1 = __lasx_xvand_v(s1, __lasx_xvldi(-2753 /*0x3F00*/)); + // [00bb|bbbb|0000|aaaa] + __m256i s2 = __lasx_xvor_v(s0, s1); + // s3: [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa] + __m256i v_c0e0 = __lasx_xvreplgr2vr_h(uint16_t(0xC0E0)); + __m256i s3 = __lasx_xvor_v(s2, v_c0e0); + // __m256i v_07ff = vmovq_n_u16((uint16_t)0x07FF); + __m256i one_or_two_bytes_bytemask = + __lasx_xvsle_hu(utf16_packed, v_07ff); + __m256i m0 = __lasx_xvandn_v(one_or_two_bytes_bytemask, + __lasx_xvldi(-2752 /*0x4000*/)); + __m256i s4 = __lasx_xvxor_v(s3, m0); - We precompute byte 1 for case #3 and -- **conditionally** -- precompute - either byte 1 for case #2 or byte 2 for case #3. Note that they - differ by exactly one bit. + // 4. expand code units 16-bit => 32-bit + __m256i out0 = __lasx_xvilvl_h(s4, t2); + __m256i out1 = __lasx_xvilvh_h(s4, t2); - Finally from these two code units we build proper UTF-8 sequence, taking - into account the case (i.e, the number of bytes to write). - */ - /** - * Given [aaaa|bbbb|bbcc|cccc] our goal is to produce: - * t2 => [0ccc|cccc] [10cc|cccc] - * s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb]) - */ -#define simdutf_vec(x) _mm_set1_epi16(static_cast(x)) - // [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc] - const __m128i t0 = _mm_shuffle_epi8(in_16, dup_even); - // [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc] - const __m128i t1 = _mm_and_si128(t0, simdutf_vec(0b0011111101111111)); - // [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc] - const __m128i t2 = _mm_or_si128(t1, simdutf_vec(0b1000000000000000)); + // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle + __m256i one_byte_bytemask = + __lasx_xvsle_hu(utf16_packed, __lasx_xvrepli_h(0x7F)); + + __m256i one_or_two_bytes_bytemask_u16_to_u32_low = + __lasx_xvilvl_h(one_or_two_bytes_bytemask, zero); + __m256i one_or_two_bytes_bytemask_u16_to_u32_high = + __lasx_xvilvh_h(one_or_two_bytes_bytemask, zero); + + __m256i one_byte_bytemask_u16_to_u32_low = + __lasx_xvilvl_h(one_byte_bytemask, one_byte_bytemask); + __m256i one_byte_bytemask_u16_to_u32_high = + __lasx_xvilvh_h(one_byte_bytemask, one_byte_bytemask); + + __m256i mask0 = __lasx_xvmskltz_h( + __lasx_xvor_v(one_or_two_bytes_bytemask_u16_to_u32_low, + one_byte_bytemask_u16_to_u32_low)); + __m256i mask1 = __lasx_xvmskltz_h( + __lasx_xvor_v(one_or_two_bytes_bytemask_u16_to_u32_high, + one_byte_bytemask_u16_to_u32_high)); + + uint32_t mask = __lasx_xvpickve2gr_wu(mask0, 0); + const uint8_t *row0 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask & 0xFF] + [0]; + __m128i shuffle0 = __lsx_vld(row0, 1); + __m128i utf8_0 = + __lsx_vshuf_b(zero_128, lasx_extracti128_lo(out0), shuffle0); + __lsx_vst(utf8_0, utf8_output, 0); + utf8_output += row0[0]; - // [aaaa|bbbb|bbcc|cccc] => [0000|aaaa|bbbb|bbcc] - const __m128i s0 = _mm_srli_epi16(in_16, 4); - // [0000|aaaa|bbbb|bbcc] => [0000|aaaa|bbbb|bb00] - const __m128i s1 = _mm_and_si128(s0, simdutf_vec(0b0000111111111100)); - // [0000|aaaa|bbbb|bb00] => [00bb|bbbb|0000|aaaa] - const __m128i s2 = _mm_maddubs_epi16(s1, simdutf_vec(0x0140)); - // [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa] - const __m128i s3 = _mm_or_si128(s2, simdutf_vec(0b1100000011100000)); - const __m128i m0 = _mm_andnot_si128(one_or_two_bytes_bytemask, - simdutf_vec(0b0100000000000000)); - const __m128i s4 = _mm_xor_si128(s3, m0); -#undef simdutf_vec + mask = __lasx_xvpickve2gr_wu(mask1, 0); + const uint8_t *row1 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask & 0xFF] + [0]; + __m128i shuffle1 = __lsx_vld(row1, 1); + __m128i utf8_1 = + __lsx_vshuf_b(zero_128, lasx_extracti128_lo(out1), shuffle1); + __lsx_vst(utf8_1, utf8_output, 0); + utf8_output += row1[0]; - // 4. expand code units 16-bit => 32-bit - const __m128i out0 = _mm_unpacklo_epi16(t2, s4); - const __m128i out1 = _mm_unpackhi_epi16(t2, s4); + mask = __lasx_xvpickve2gr_wu(mask0, 4); + const uint8_t *row2 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask & 0xFF] + [0]; + __m128i shuffle2 = __lsx_vld(row2, 1); + __m128i utf8_2 = + __lsx_vshuf_b(zero_128, lasx_extracti128_hi(out0), shuffle2); + __lsx_vst(utf8_2, utf8_output, 0); + utf8_output += row2[0]; + + mask = __lasx_xvpickve2gr_wu(mask1, 4); + const uint8_t *row3 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask & 0xFF] + [0]; + __m128i shuffle3 = __lsx_vld(row3, 1); + __m128i utf8_3 = + __lsx_vshuf_b(zero_128, lasx_extracti128_hi(out1), shuffle3); + __lsx_vst(utf8_3, utf8_output, 0); + utf8_output += row3[0]; - // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle - const uint16_t mask = - (one_byte_bitmask & 0x5555) | (one_or_two_bytes_bitmask & 0xaaaa); - if (mask == 0) { - // We only have three-byte code units. Use fast path. - const __m128i shuffle = _mm_setr_epi8(2, 3, 1, 6, 7, 5, 10, 11, 9, 14, - 15, 13, -1, -1, -1, -1); - const __m128i utf8_0 = _mm_shuffle_epi8(out0, shuffle); - const __m128i utf8_1 = _mm_shuffle_epi8(out1, shuffle); - _mm_storeu_si128((__m128i *)utf8_output, utf8_0); - utf8_output += 12; - _mm_storeu_si128((__m128i *)utf8_output, utf8_1); - utf8_output += 12; - buf += 8; - continue; + buf += 16; } - const uint8_t mask0 = uint8_t(mask); - - const uint8_t *row0 = - &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask0][0]; - const __m128i shuffle0 = _mm_loadu_si128((__m128i *)(row0 + 1)); - const __m128i utf8_0 = _mm_shuffle_epi8(out0, shuffle0); - - const uint8_t mask1 = static_cast(mask >> 8); - - const uint8_t *row1 = - &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask1][0]; - const __m128i shuffle1 = _mm_loadu_si128((__m128i *)(row1 + 1)); - const __m128i utf8_1 = _mm_shuffle_epi8(out1, shuffle1); - - _mm_storeu_si128((__m128i *)utf8_output, utf8_0); - utf8_output += row0[0]; - _mm_storeu_si128((__m128i *)utf8_output, utf8_1); - utf8_output += row1[0]; - - buf += 8; + // At least one 32-bit word will produce a surrogate pair in UTF-16 <=> + // will produce four UTF-8 bytes. } else { - // case: at least one 32-bit word produce a surrogate pair in UTF-16 <=> - // will produce four UTF-8 bytes Let us do a scalar fallback. It may seem - // wasteful to use scalar code, but being efficient with SIMD in the - // presence of surrogate pairs may require non-trivial tables. + // Let us do a scalar fallback. + // It may seem wasteful to use scalar code, but being efficient with SIMD + // in the presence of surrogate pairs may require non-trivial tables. size_t forward = 15; size_t k = 0; if (size_t(end - buf) < forward + 1) { @@ -37293,14 +52682,16 @@ sse_convert_utf32_to_utf8(const char32_t *buf, size_t len, char *utf8_output) { *utf8_output++ = char((word & 0b111111) | 0b10000000); } else if ((word & 0xFFFF0000) == 0) { if (word >= 0xD800 && word <= 0xDFFF) { - return std::make_pair(nullptr, utf8_output); + return std::make_pair(nullptr, + reinterpret_cast(utf8_output)); } *utf8_output++ = char((word >> 12) | 0b11100000); *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); *utf8_output++ = char((word & 0b111111) | 0b10000000); } else { if (word > 0x10FFFF) { - return std::make_pair(nullptr, utf8_output); + return std::make_pair(nullptr, + reinterpret_cast(utf8_output)); } *utf8_output++ = char((word >> 18) | 0b11110000); *utf8_output++ = char(((word >> 12) & 0b111111) | 0b10000000); @@ -37313,242 +52704,269 @@ sse_convert_utf32_to_utf8(const char32_t *buf, size_t len, char *utf8_output) { } // while // check for invalid input - const __m128i v_10ffff = _mm_set1_epi32((uint32_t)0x10ffff); - if (static_cast(_mm_movemask_epi8(_mm_cmpeq_epi32( - _mm_max_epu32(running_max, v_10ffff), v_10ffff))) != 0xffff) { - return std::make_pair(nullptr, utf8_output); - } - - if (static_cast(_mm_movemask_epi8(forbidden_bytemask)) != 0) { - return std::make_pair(nullptr, utf8_output); + if (__lasx_xbnz_v(forbidden_bytemask)) { + return std::make_pair(nullptr, reinterpret_cast(utf8_output)); } - - return std::make_pair(buf, utf8_output); + return std::make_pair(buf, reinterpret_cast(utf8_output)); } std::pair -sse_convert_utf32_to_utf8_with_errors(const char32_t *buf, size_t len, - char *utf8_output) { - const char32_t *end = buf + len; +lasx_convert_utf32_to_utf8_with_errors(const char32_t *buf, size_t len, + char *utf8_out) { + uint8_t *utf8_output = reinterpret_cast(utf8_out); const char32_t *start = buf; + const char32_t *end = buf + len; - const __m128i v_0000 = _mm_setzero_si128(); - const __m128i v_f800 = _mm_set1_epi16((uint16_t)0xf800); - const __m128i v_c080 = _mm_set1_epi16((uint16_t)0xc080); - const __m128i v_ff80 = _mm_set1_epi16((uint16_t)0xff80); - const __m128i v_ffff0000 = _mm_set1_epi32((uint32_t)0xffff0000); - const __m128i v_7fffffff = _mm_set1_epi32((uint32_t)0x7fffffff); - const __m128i v_10ffff = _mm_set1_epi32((uint32_t)0x10ffff); - - const size_t safety_margin = - 12; // to avoid overruns, see issue - // https://github.com/simdutf/simdutf/issues/92 - - while (end - buf >= std::ptrdiff_t(16 + safety_margin)) { - // We load two 16 bytes registers for a total of 32 bytes or 8 characters. - __m128i in = _mm_loadu_si128((__m128i *)buf); - __m128i nextin = _mm_loadu_si128((__m128i *)buf + 1); - // Check for too large input - __m128i max_input = _mm_max_epu32(_mm_max_epu32(in, nextin), v_10ffff); - if (static_cast(_mm_movemask_epi8( - _mm_cmpeq_epi32(max_input, v_10ffff))) != 0xffff) { - return std::make_pair(result(error_code::TOO_LARGE, buf - start), - utf8_output); - } - - // Pack 32-bit UTF-32 code units to 16-bit UTF-16 code units with unsigned - // saturation - __m128i in_16 = _mm_packus_epi32(_mm_and_si128(in, v_7fffffff), - _mm_and_si128(nextin, v_7fffffff)); - - // Try to apply UTF-16 => UTF-8 from ./sse_convert_utf16_to_utf8.cpp - - // Check for ASCII fast path - if (_mm_testz_si128(in_16, v_ff80)) { // ASCII fast path!!!! - // 1. pack the bytes - // obviously suboptimal. - const __m128i utf8_packed = _mm_packus_epi16(in_16, in_16); - // 2. store (16 bytes) - _mm_storeu_si128((__m128i *)utf8_output, utf8_packed); - // 3. adjust pointers - buf += 8; - utf8_output += 8; - continue; - } - - // no bits set above 7th bit - const __m128i one_byte_bytemask = - _mm_cmpeq_epi16(_mm_and_si128(in_16, v_ff80), v_0000); - const uint16_t one_byte_bitmask = - static_cast(_mm_movemask_epi8(one_byte_bytemask)); - - // no bits set above 11th bit - const __m128i one_or_two_bytes_bytemask = - _mm_cmpeq_epi16(_mm_and_si128(in_16, v_f800), v_0000); - const uint16_t one_or_two_bytes_bitmask = - static_cast(_mm_movemask_epi8(one_or_two_bytes_bytemask)); - - if (one_or_two_bytes_bitmask == 0xffff) { - // case: all code units either produce 1 or 2 UTF-8 bytes (at least one - // produces 2 bytes) - // 1. prepare 2-byte values - // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8 - // expected output : [110a|aaaa|10bb|bbbb] x 8 - const __m128i v_1f00 = _mm_set1_epi16((int16_t)0x1f00); - const __m128i v_003f = _mm_set1_epi16((int16_t)0x003f); - - // t0 = [000a|aaaa|bbbb|bb00] - const __m128i t0 = _mm_slli_epi16(in_16, 2); - // t1 = [000a|aaaa|0000|0000] - const __m128i t1 = _mm_and_si128(t0, v_1f00); - // t2 = [0000|0000|00bb|bbbb] - const __m128i t2 = _mm_and_si128(in_16, v_003f); - // t3 = [000a|aaaa|00bb|bbbb] - const __m128i t3 = _mm_or_si128(t1, t2); - // t4 = [110a|aaaa|10bb|bbbb] - const __m128i t4 = _mm_or_si128(t3, v_c080); - - // 2. merge ASCII and 2-byte codewords - const __m128i utf8_unpacked = - _mm_blendv_epi8(t4, in_16, one_byte_bytemask); - - // 3. prepare bitmask for 8-bit lookup - // one_byte_bitmask = hhggffeeddccbbaa -- the bits are doubled (h - - // MSB, a - LSB) - const uint16_t m0 = one_byte_bitmask & 0x5555; // m0 = 0h0g0f0e0d0c0b0a - const uint16_t m1 = - static_cast(m0 >> 7); // m1 = 00000000h0g0f0e0 - const uint8_t m2 = - static_cast((m0 | m1) & 0xff); // m2 = hdgcfbea - // 4. pack the bytes - const uint8_t *row = - &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[m2][0]; - const __m128i shuffle = _mm_loadu_si128((__m128i *)(row + 1)); - const __m128i utf8_packed = _mm_shuffle_epi8(utf8_unpacked, shuffle); - - // 5. store bytes - _mm_storeu_si128((__m128i *)utf8_output, utf8_packed); - - // 6. adjust pointers - buf += 8; - utf8_output += row[0]; - continue; - } - - // Check for overflow in packing - const __m128i saturation_bytemask = _mm_cmpeq_epi32( - _mm_and_si128(_mm_or_si128(in, nextin), v_ffff0000), v_0000); - const uint32_t saturation_bitmask = - static_cast(_mm_movemask_epi8(saturation_bytemask)); - - if (saturation_bitmask == 0xffff) { - // case: code units from register produce either 1, 2 or 3 UTF-8 bytes - - // Check for illegal surrogate code units - const __m128i v_d800 = _mm_set1_epi16((uint16_t)0xd800); - const __m128i forbidden_bytemask = - _mm_cmpeq_epi16(_mm_and_si128(in_16, v_f800), v_d800); - if (static_cast(_mm_movemask_epi8(forbidden_bytemask)) != 0) { + // load addr align 32 + while (((uint64_t)buf & 0x1F) && buf < end) { + uint32_t word = *buf; + if ((word & 0xFFFFFF80) == 0) { + *utf8_output++ = char(word); + } else if ((word & 0xFFFFF800) == 0) { + *utf8_output++ = char((word >> 6) | 0b11000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + } else if ((word & 0xFFFF0000) == 0) { + if (word >= 0xD800 && word <= 0xDFFF) { return std::make_pair(result(error_code::SURROGATE, buf - start), - utf8_output); + reinterpret_cast(utf8_output)); + } + *utf8_output++ = char((word >> 12) | 0b11100000); + *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + } else { + if (word > 0x10FFFF) { + return std::make_pair(result(error_code::TOO_LARGE, buf - start), + reinterpret_cast(utf8_output)); } + *utf8_output++ = char((word >> 18) | 0b11110000); + *utf8_output++ = char(((word >> 12) & 0b111111) | 0b10000000); + *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); + *utf8_output++ = char((word & 0b111111) | 0b10000000); + } + buf++; + } - const __m128i dup_even = _mm_setr_epi16(0x0000, 0x0202, 0x0404, 0x0606, - 0x0808, 0x0a0a, 0x0c0c, 0x0e0e); - - /* In this branch we handle three cases: - 1. [0000|0000|0ccc|cccc] => [0ccc|cccc] - - single UFT-8 byte - 2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc] - - two UTF-8 bytes - 3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - - three UTF-8 bytes + __m256i v_c080 = __lasx_xvreplgr2vr_h(uint16_t(0xC080)); + __m256i v_07ff = __lasx_xvreplgr2vr_h(uint16_t(0x7FF)); + __m256i v_dfff = __lasx_xvreplgr2vr_h(uint16_t(0xDFFF)); + __m256i v_d800 = __lasx_xvldi(-2600); /*0xD800*/ + __m256i zero = __lasx_xvldi(0); + __m128i zero_128 = __lsx_vldi(0); + __m256i forbidden_bytemask = __lasx_xvldi(0x0); + const size_t safety_margin = + 12; // to avoid overruns, see issue + // https://github.com/simdutf/simdutf/issues/92 - We expand the input word (16-bit) into two code units (32-bit), thus - we have room for four bytes. However, we need five distinct bit - layouts. Note that the last byte in cases #2 and #3 is the same. + while (buf + 16 + safety_margin < end) { + __m256i in = __lasx_xvld(reinterpret_cast(buf), 0); + __m256i nextin = __lasx_xvld(reinterpret_cast(buf), 32); - We precompute byte 1 for case #1 and the common byte for cases #2 & #3 - in register t2. + // Check if no bits set above 16th + if (__lasx_xbz_v(__lasx_xvpickod_h(in, nextin))) { + // Pack UTF-32 to UTF-16 safely (without surrogate pairs) + // Apply UTF-16 => UTF-8 routine (lasx_convert_utf16_to_utf8.cpp) + __m256i utf16_packed = + __lasx_xvpermi_d(__lasx_xvpickev_h(nextin, in), 0b11011000); - We precompute byte 1 for case #3 and -- **conditionally** -- precompute - either byte 1 for case #2 or byte 2 for case #3. Note that they - differ by exactly one bit. + if (__lasx_xbz_v(__lasx_xvslt_hu(__lasx_xvrepli_h(0x7F), + utf16_packed))) { // ASCII fast path!!!! + // 1. pack the bytes + // obviously suboptimal. + __m256i utf8_packed = __lasx_xvpermi_d( + __lasx_xvpickev_b(utf16_packed, utf16_packed), 0b00001000); + // 2. store (8 bytes) + __lsx_vst(lasx_extracti128_lo(utf8_packed), utf8_output, 0); + // 3. adjust pointers + buf += 16; + utf8_output += 16; + continue; // we are done for this round! + } - Finally from these two code units we build proper UTF-8 sequence, taking - into account the case (i.e, the number of bytes to write). - */ - /** - * Given [aaaa|bbbb|bbcc|cccc] our goal is to produce: - * t2 => [0ccc|cccc] [10cc|cccc] - * s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb]) - */ -#define simdutf_vec(x) _mm_set1_epi16(static_cast(x)) - // [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc] - const __m128i t0 = _mm_shuffle_epi8(in_16, dup_even); - // [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc] - const __m128i t1 = _mm_and_si128(t0, simdutf_vec(0b0011111101111111)); - // [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc] - const __m128i t2 = _mm_or_si128(t1, simdutf_vec(0b1000000000000000)); + if (__lasx_xbz_v(__lasx_xvslt_hu(v_07ff, utf16_packed))) { + // 1. prepare 2-byte values + // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8 + // expected output : [110a|aaaa|10bb|bbbb] x 8 - // [aaaa|bbbb|bbcc|cccc] => [0000|aaaa|bbbb|bbcc] - const __m128i s0 = _mm_srli_epi16(in_16, 4); - // [0000|aaaa|bbbb|bbcc] => [0000|aaaa|bbbb|bb00] - const __m128i s1 = _mm_and_si128(s0, simdutf_vec(0b0000111111111100)); - // [0000|aaaa|bbbb|bb00] => [00bb|bbbb|0000|aaaa] - const __m128i s2 = _mm_maddubs_epi16(s1, simdutf_vec(0x0140)); - // [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa] - const __m128i s3 = _mm_or_si128(s2, simdutf_vec(0b1100000011100000)); - const __m128i m0 = _mm_andnot_si128(one_or_two_bytes_bytemask, - simdutf_vec(0b0100000000000000)); - const __m128i s4 = _mm_xor_si128(s3, m0); -#undef simdutf_vec + // t0 = [000a|aaaa|bbbb|bb00] + const __m256i t0 = __lasx_xvslli_h(utf16_packed, 2); + // t1 = [000a|aaaa|0000|0000] + const __m256i t1 = __lasx_xvand_v(t0, __lasx_xvldi(-2785 /*0x1f00*/)); + // t2 = [0000|0000|00bb|bbbb] + const __m256i t2 = __lasx_xvand_v(utf16_packed, __lasx_xvrepli_h(0x3f)); + // t3 = [000a|aaaa|00bb|bbbb] + const __m256i t3 = __lasx_xvor_v(t1, t2); + // t4 = [110a|aaaa|10bb|bbbb] + const __m256i t4 = __lasx_xvor_v(t3, v_c080); + // 2. merge ASCII and 2-byte codewords + __m256i one_byte_bytemask = + __lasx_xvsle_hu(utf16_packed, __lasx_xvrepli_h(0x7F /*0x007F*/)); + __m256i utf8_unpacked = + __lasx_xvbitsel_v(t4, utf16_packed, one_byte_bytemask); + // 3. prepare bitmask for 8-bit lookup + __m256i mask = __lasx_xvmskltz_h(one_byte_bytemask); + uint32_t m1 = __lasx_xvpickve2gr_wu(mask, 0); + uint32_t m2 = __lasx_xvpickve2gr_wu(mask, 4); + // 4. pack the bytes + const uint8_t *row1 = + &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes + [lasx_1_2_utf8_bytes_mask[m1]][0]; + __m128i shuffle1 = __lsx_vld(row1, 1); + __m128i utf8_packed1 = __lsx_vshuf_b( + zero_128, lasx_extracti128_lo(utf8_unpacked), shuffle1); + + const uint8_t *row2 = + &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes + [lasx_1_2_utf8_bytes_mask[m2]][0]; + __m128i shuffle2 = __lsx_vld(row2, 1); + __m128i utf8_packed2 = __lsx_vshuf_b( + zero_128, lasx_extracti128_hi(utf8_unpacked), shuffle2); + // 5. store bytes + __lsx_vst(utf8_packed1, utf8_output, 0); + utf8_output += row1[0]; - // 4. expand code units 16-bit => 32-bit - const __m128i out0 = _mm_unpacklo_epi16(t2, s4); - const __m128i out1 = _mm_unpackhi_epi16(t2, s4); + __lsx_vst(utf8_packed2, utf8_output, 0); + utf8_output += row2[0]; - // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle - const uint16_t mask = - (one_byte_bitmask & 0x5555) | (one_or_two_bytes_bitmask & 0xaaaa); - if (mask == 0) { - // We only have three-byte code units. Use fast path. - const __m128i shuffle = _mm_setr_epi8(2, 3, 1, 6, 7, 5, 10, 11, 9, 14, - 15, 13, -1, -1, -1, -1); - const __m128i utf8_0 = _mm_shuffle_epi8(out0, shuffle); - const __m128i utf8_1 = _mm_shuffle_epi8(out1, shuffle); - _mm_storeu_si128((__m128i *)utf8_output, utf8_0); - utf8_output += 12; - _mm_storeu_si128((__m128i *)utf8_output, utf8_1); - utf8_output += 12; - buf += 8; + buf += 16; continue; - } - const uint8_t mask0 = uint8_t(mask); + } else { + // case: code units from register produce either 1, 2 or 3 UTF-8 bytes + forbidden_bytemask = __lasx_xvor_v( + __lasx_xvand_v( + __lasx_xvsle_h(utf16_packed, v_dfff), // utf16_packed <= 0xdfff + __lasx_xvsle_h(v_d800, utf16_packed)), // utf16_packed >= 0xd800 + forbidden_bytemask); + if (__lasx_xbnz_v(forbidden_bytemask)) { + return std::make_pair(result(error_code::SURROGATE, buf - start), + reinterpret_cast(utf8_output)); + } + /* In this branch we handle three cases: + 1. [0000|0000|0ccc|cccc] => [0ccc|cccc] - + single UFT-8 byte + 2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc] - + two UTF-8 bytes + 3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - + three UTF-8 bytes + + We expand the input word (16-bit) into two code units (32-bit), thus + we have room for four bytes. However, we need five distinct bit + layouts. Note that the last byte in cases #2 and #3 is the same. + + We precompute byte 1 for case #1 and the common byte for cases #2 & + #3 in register t2. + + We precompute byte 1 for case #3 and -- **conditionally** -- + precompute either byte 1 for case #2 or byte 2 for case #3. Note that + they differ by exactly one bit. + + Finally from these two code units we build proper UTF-8 sequence, + taking into account the case (i.e, the number of bytes to write). + */ + /** + * Given [aaaa|bbbb|bbcc|cccc] our goal is to produce: + * t2 => [0ccc|cccc] [10cc|cccc] + * s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb]) + */ + // [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc] + __m256i t0 = __lasx_xvpickev_b(utf16_packed, utf16_packed); + t0 = __lasx_xvilvl_b(t0, t0); + // [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc] + __m256i v_3f7f = __lasx_xvreplgr2vr_h(uint16_t(0x3F7F)); + __m256i t1 = __lasx_xvand_v(t0, v_3f7f); + // [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc] + __m256i t2 = __lasx_xvor_v(t1, __lasx_xvldi(-2688 /*0x8000*/)); - const uint8_t *row0 = - &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask0][0]; - const __m128i shuffle0 = _mm_loadu_si128((__m128i *)(row0 + 1)); - const __m128i utf8_0 = _mm_shuffle_epi8(out0, shuffle0); + // s0: [aaaa|bbbb|bbcc|cccc] => [0000|0000|0000|aaaa] + __m256i s0 = __lasx_xvsrli_h(utf16_packed, 12); + // s1: [aaaa|bbbb|bbcc|cccc] => [0000|bbbb|bb00|0000] + __m256i s1 = __lasx_xvslli_h(utf16_packed, 2); + // [0000|bbbb|bb00|0000] => [00bb|bbbb|0000|0000] + s1 = __lasx_xvand_v(s1, __lasx_xvldi(-2753 /*0x3F00*/)); + // [00bb|bbbb|0000|aaaa] + __m256i s2 = __lasx_xvor_v(s0, s1); + // s3: [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa] + __m256i v_c0e0 = __lasx_xvreplgr2vr_h(uint16_t(0xC0E0)); + __m256i s3 = __lasx_xvor_v(s2, v_c0e0); + // __m256i v_07ff = vmovq_n_u16((uint16_t)0x07FF); + __m256i one_or_two_bytes_bytemask = + __lasx_xvsle_hu(utf16_packed, v_07ff); + __m256i m0 = __lasx_xvandn_v(one_or_two_bytes_bytemask, + __lasx_xvldi(-2752 /*0x4000*/)); + __m256i s4 = __lasx_xvxor_v(s3, m0); - const uint8_t mask1 = static_cast(mask >> 8); + // 4. expand code units 16-bit => 32-bit + __m256i out0 = __lasx_xvilvl_h(s4, t2); + __m256i out1 = __lasx_xvilvh_h(s4, t2); - const uint8_t *row1 = - &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask1][0]; - const __m128i shuffle1 = _mm_loadu_si128((__m128i *)(row1 + 1)); - const __m128i utf8_1 = _mm_shuffle_epi8(out1, shuffle1); + // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle + __m256i one_byte_bytemask = + __lasx_xvsle_hu(utf16_packed, __lasx_xvrepli_h(0x7F)); + + __m256i one_or_two_bytes_bytemask_u16_to_u32_low = + __lasx_xvilvl_h(one_or_two_bytes_bytemask, zero); + __m256i one_or_two_bytes_bytemask_u16_to_u32_high = + __lasx_xvilvh_h(one_or_two_bytes_bytemask, zero); + + __m256i one_byte_bytemask_u16_to_u32_low = + __lasx_xvilvl_h(one_byte_bytemask, one_byte_bytemask); + __m256i one_byte_bytemask_u16_to_u32_high = + __lasx_xvilvh_h(one_byte_bytemask, one_byte_bytemask); + + __m256i mask0 = __lasx_xvmskltz_h( + __lasx_xvor_v(one_or_two_bytes_bytemask_u16_to_u32_low, + one_byte_bytemask_u16_to_u32_low)); + __m256i mask1 = __lasx_xvmskltz_h( + __lasx_xvor_v(one_or_two_bytes_bytemask_u16_to_u32_high, + one_byte_bytemask_u16_to_u32_high)); + + uint32_t mask = __lasx_xvpickve2gr_wu(mask0, 0); + const uint8_t *row0 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask & 0xFF] + [0]; + __m128i shuffle0 = __lsx_vld(row0, 1); + __m128i utf8_0 = + __lsx_vshuf_b(zero_128, lasx_extracti128_lo(out0), shuffle0); + __lsx_vst(utf8_0, utf8_output, 0); + utf8_output += row0[0]; - _mm_storeu_si128((__m128i *)utf8_output, utf8_0); - utf8_output += row0[0]; - _mm_storeu_si128((__m128i *)utf8_output, utf8_1); - utf8_output += row1[0]; + mask = __lasx_xvpickve2gr_wu(mask1, 0); + const uint8_t *row1 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask & 0xFF] + [0]; + __m128i shuffle1 = __lsx_vld(row1, 1); + __m128i utf8_1 = + __lsx_vshuf_b(zero_128, lasx_extracti128_lo(out1), shuffle1); + __lsx_vst(utf8_1, utf8_output, 0); + utf8_output += row1[0]; - buf += 8; + mask = __lasx_xvpickve2gr_wu(mask0, 4); + const uint8_t *row2 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask & 0xFF] + [0]; + __m128i shuffle2 = __lsx_vld(row2, 1); + __m128i utf8_2 = + __lsx_vshuf_b(zero_128, lasx_extracti128_hi(out0), shuffle2); + __lsx_vst(utf8_2, utf8_output, 0); + utf8_output += row2[0]; + + mask = __lasx_xvpickve2gr_wu(mask1, 4); + const uint8_t *row3 = + &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask & 0xFF] + [0]; + __m128i shuffle3 = __lsx_vld(row3, 1); + __m128i utf8_3 = + __lsx_vshuf_b(zero_128, lasx_extracti128_hi(out1), shuffle3); + __lsx_vst(utf8_3, utf8_output, 0); + utf8_output += row3[0]; + + buf += 16; + } + // At least one 32-bit word will produce a surrogate pair in UTF-16 <=> + // will produce four UTF-8 bytes. } else { - // case: at least one 32-bit word produce a surrogate pair in UTF-16 <=> - // will produce four UTF-8 bytes Let us do a scalar fallback. It may seem - // wasteful to use scalar code, but being efficient with SIMD in the - // presence of surrogate pairs may require non-trivial tables. + // Let us do a scalar fallback. + // It may seem wasteful to use scalar code, but being efficient with SIMD + // in the presence of surrogate pairs may require non-trivial tables. size_t forward = 15; size_t k = 0; if (size_t(end - buf) < forward + 1) { @@ -37564,7 +52982,8 @@ sse_convert_utf32_to_utf8_with_errors(const char32_t *buf, size_t len, } else if ((word & 0xFFFF0000) == 0) { if (word >= 0xD800 && word <= 0xDFFF) { return std::make_pair( - result(error_code::SURROGATE, buf - start + k), utf8_output); + result(error_code::SURROGATE, buf - start + k), + reinterpret_cast(utf8_output)); } *utf8_output++ = char((word >> 12) | 0b11100000); *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000); @@ -37572,7 +52991,8 @@ sse_convert_utf32_to_utf8_with_errors(const char32_t *buf, size_t len, } else { if (word > 0x10FFFF) { return std::make_pair( - result(error_code::TOO_LARGE, buf - start + k), utf8_output); + result(error_code::TOO_LARGE, buf - start + k), + reinterpret_cast(utf8_output)); } *utf8_output++ = char((word >> 18) | 0b11110000); *utf8_output++ = char(((word >> 12) & 0b111111) | 0b10000000); @@ -37583,51 +53003,76 @@ sse_convert_utf32_to_utf8_with_errors(const char32_t *buf, size_t len, buf += k; } } // while - return std::make_pair(result(error_code::SUCCESS, buf - start), utf8_output); + + return std::make_pair(result(error_code::SUCCESS, buf - start), + reinterpret_cast(utf8_output)); } -/* end file src/westmere/sse_convert_utf32_to_utf8.cpp */ -/* begin file src/westmere/sse_convert_utf32_to_utf16.cpp */ +/* end file src/lasx/lasx_convert_utf32_to_utf8.cpp */ +/* begin file src/lasx/lasx_convert_utf32_to_utf16.cpp */ template std::pair -sse_convert_utf32_to_utf16(const char32_t *buf, size_t len, - char16_t *utf16_output) { - +lasx_convert_utf32_to_utf16(const char32_t *buf, size_t len, + char16_t *utf16_out) { + uint16_t *utf16_output = reinterpret_cast(utf16_out); const char32_t *end = buf + len; - const __m128i v_0000 = _mm_setzero_si128(); - const __m128i v_ffff0000 = _mm_set1_epi32((int32_t)0xffff0000); - __m128i forbidden_bytemask = _mm_setzero_si128(); + // Performance degradation when memory address is not 32-byte aligned + while (((uint64_t)utf16_output & 0x1F) && buf < end) { + uint32_t word = *buf++; + if ((word & 0xFFFF0000) == 0) { + // will not generate a surrogate pair + if (word >= 0xD800 && word <= 0xDFFF) { + return std::make_pair(nullptr, + reinterpret_cast(utf16_output)); + } + *utf16_output++ = !match_system(big_endian) + ? char16_t(word >> 8 | word << 8) + : char16_t(word); + // buf++; + } else { + // will generate a surrogate pair + if (word > 0x10FFFF) { + return std::make_pair(nullptr, + reinterpret_cast(utf16_output)); + } + word -= 0x10000; + uint16_t high_surrogate = uint16_t(0xD800 + (word >> 10)); + uint16_t low_surrogate = uint16_t(0xDC00 + (word & 0x3FF)); + if (!match_system(big_endian)) { + high_surrogate = uint16_t(high_surrogate >> 8 | high_surrogate << 8); + low_surrogate = uint16_t(low_surrogate << 8 | low_surrogate >> 8); + } + *utf16_output++ = char16_t(high_surrogate); + *utf16_output++ = char16_t(low_surrogate); + // buf++; + } + } - while (end - buf >= 8) { - __m128i in = _mm_loadu_si128((__m128i *)buf); - __m128i nextin = _mm_loadu_si128((__m128i *)buf + 1); - const __m128i saturation_bytemask = _mm_cmpeq_epi32( - _mm_and_si128(_mm_or_si128(in, nextin), v_ffff0000), v_0000); - const uint32_t saturation_bitmask = - static_cast(_mm_movemask_epi8(saturation_bytemask)); + __m256i forbidden_bytemask = __lasx_xvrepli_h(0); + __m256i v_d800 = __lasx_xvldi(-2600); /*0xD800*/ + __m256i v_dfff = __lasx_xvreplgr2vr_h(uint16_t(0xdfff)); + while (buf + 16 <= end) { + __m256i in0 = __lasx_xvld(reinterpret_cast(buf), 0); + __m256i in1 = __lasx_xvld(reinterpret_cast(buf), 32); // Check if no bits set above 16th - if (saturation_bitmask == 0xffff) { - // Pack UTF-32 to UTF-16 - __m128i utf16_packed = _mm_packus_epi32(in, nextin); - - const __m128i v_f800 = _mm_set1_epi16((uint16_t)0xf800); - const __m128i v_d800 = _mm_set1_epi16((uint16_t)0xd800); - forbidden_bytemask = _mm_or_si128( - forbidden_bytemask, - _mm_cmpeq_epi16(_mm_and_si128(utf16_packed, v_f800), v_d800)); + if (__lasx_xbz_v(__lasx_xvpickod_h(in1, in0))) { + __m256i utf16_packed = + __lasx_xvpermi_d(__lasx_xvpickev_h(in1, in0), 0b11011000); + forbidden_bytemask = __lasx_xvor_v( + __lasx_xvand_v( + __lasx_xvsle_h(utf16_packed, v_dfff), // utf16_packed <= 0xdfff + __lasx_xvsle_h(v_d800, utf16_packed)), // utf16_packed >= 0xd800 + forbidden_bytemask); - if (big_endian) { - const __m128i swap = - _mm_setr_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14); - utf16_packed = _mm_shuffle_epi8(utf16_packed, swap); + if (!match_system(big_endian)) { + utf16_packed = lasx_swap_bytes(utf16_packed); } - - _mm_storeu_si128((__m128i *)utf16_output, utf16_packed); - utf16_output += 8; - buf += 8; + __lasx_xvst(utf16_packed, utf16_output, 0); + utf16_output += 16; + buf += 16; } else { - size_t forward = 7; + size_t forward = 15; size_t k = 0; if (size_t(end - buf) < forward + 1) { forward = size_t(end - buf - 1); @@ -37637,25 +53082,25 @@ sse_convert_utf32_to_utf16(const char32_t *buf, size_t len, if ((word & 0xFFFF0000) == 0) { // will not generate a surrogate pair if (word >= 0xD800 && word <= 0xDFFF) { - return std::make_pair(nullptr, utf16_output); + return std::make_pair(nullptr, + reinterpret_cast(utf16_output)); } - *utf16_output++ = - big_endian - ? char16_t((uint16_t(word) >> 8) | (uint16_t(word) << 8)) - : char16_t(word); + *utf16_output++ = !match_system(big_endian) + ? char16_t(word >> 8 | word << 8) + : char16_t(word); } else { // will generate a surrogate pair if (word > 0x10FFFF) { - return std::make_pair(nullptr, utf16_output); + return std::make_pair(nullptr, + reinterpret_cast(utf16_output)); } word -= 0x10000; uint16_t high_surrogate = uint16_t(0xD800 + (word >> 10)); uint16_t low_surrogate = uint16_t(0xDC00 + (word & 0x3FF)); - if (big_endian) { + if (!match_system(big_endian)) { high_surrogate = - uint16_t((high_surrogate >> 8) | (high_surrogate << 8)); - low_surrogate = - uint16_t((low_surrogate >> 8) | (low_surrogate << 8)); + uint16_t(high_surrogate >> 8 | high_surrogate << 8); + low_surrogate = uint16_t(low_surrogate << 8 | low_surrogate >> 8); } *utf16_output++ = char16_t(high_surrogate); *utf16_output++ = char16_t(low_surrogate); @@ -37666,56 +53111,80 @@ sse_convert_utf32_to_utf16(const char32_t *buf, size_t len, } // check for invalid input - if (static_cast(_mm_movemask_epi8(forbidden_bytemask)) != 0) { - return std::make_pair(nullptr, utf16_output); + if (__lasx_xbnz_v(forbidden_bytemask)) { + return std::make_pair(nullptr, reinterpret_cast(utf16_output)); } - - return std::make_pair(buf, utf16_output); + return std::make_pair(buf, reinterpret_cast(utf16_output)); } template std::pair -sse_convert_utf32_to_utf16_with_errors(const char32_t *buf, size_t len, - char16_t *utf16_output) { +lasx_convert_utf32_to_utf16_with_errors(const char32_t *buf, size_t len, + char16_t *utf16_out) { + uint16_t *utf16_output = reinterpret_cast(utf16_out); const char32_t *start = buf; const char32_t *end = buf + len; - const __m128i v_0000 = _mm_setzero_si128(); - const __m128i v_ffff0000 = _mm_set1_epi32((int32_t)0xffff0000); + // Performance degradation when memory address is not 32-byte aligned + while (((uint64_t)utf16_output & 0x1F) && buf < end) { + uint32_t word = *buf++; + if ((word & 0xFFFF0000) == 0) { + // will not generate a surrogate pair + if (word >= 0xD800 && word <= 0xDFFF) { + return std::make_pair(result(error_code::SURROGATE, buf - start - 1), + reinterpret_cast(utf16_output)); + } + *utf16_output++ = !match_system(big_endian) + ? char16_t(word >> 8 | word << 8) + : char16_t(word); + } else { + // will generate a surrogate pair + if (word > 0x10FFFF) { + return std::make_pair(result(error_code::TOO_LARGE, buf - start - 1), + reinterpret_cast(utf16_output)); + } + word -= 0x10000; + uint16_t high_surrogate = uint16_t(0xD800 + (word >> 10)); + uint16_t low_surrogate = uint16_t(0xDC00 + (word & 0x3FF)); + if (!match_system(big_endian)) { + high_surrogate = uint16_t(high_surrogate >> 8 | high_surrogate << 8); + low_surrogate = uint16_t(low_surrogate << 8 | low_surrogate >> 8); + } + *utf16_output++ = char16_t(high_surrogate); + *utf16_output++ = char16_t(low_surrogate); + } + } - while (end - buf >= 8) { - __m128i in = _mm_loadu_si128((__m128i *)buf); - __m128i nextin = _mm_loadu_si128((__m128i *)buf + 1); - const __m128i saturation_bytemask = _mm_cmpeq_epi32( - _mm_and_si128(_mm_or_si128(in, nextin), v_ffff0000), v_0000); - const uint32_t saturation_bitmask = - static_cast(_mm_movemask_epi8(saturation_bytemask)); + __m256i forbidden_bytemask = __lasx_xvrepli_h(0); + __m256i v_d800 = __lasx_xvldi(-2600); /*0xD800*/ + __m256i v_dfff = __lasx_xvreplgr2vr_h(uint16_t(0xdfff)); + while (buf + 16 <= end) { + __m256i in0 = __lasx_xvld(reinterpret_cast(buf), 0); + __m256i in1 = __lasx_xvld(reinterpret_cast(buf), 32); // Check if no bits set above 16th - if (saturation_bitmask == 0xffff) { - // Pack UTF-32 to UTF-16 - __m128i utf16_packed = _mm_packus_epi32(in, nextin); - - const __m128i v_f800 = _mm_set1_epi16((uint16_t)0xf800); - const __m128i v_d800 = _mm_set1_epi16((uint16_t)0xd800); - const __m128i forbidden_bytemask = - _mm_cmpeq_epi16(_mm_and_si128(utf16_packed, v_f800), v_d800); - if (static_cast(_mm_movemask_epi8(forbidden_bytemask)) != 0) { + if (__lasx_xbz_v(__lasx_xvpickod_h(in1, in0))) { + __m256i utf16_packed = + __lasx_xvpermi_d(__lasx_xvpickev_h(in1, in0), 0b11011000); + forbidden_bytemask = __lasx_xvor_v( + __lasx_xvand_v( + __lasx_xvsle_h(utf16_packed, v_dfff), // utf16_packed <= 0xdfff + __lasx_xvsle_h(v_d800, utf16_packed)), // utf16_packed >= 0xd800 + forbidden_bytemask); + if (__lasx_xbnz_v(forbidden_bytemask)) { return std::make_pair(result(error_code::SURROGATE, buf - start), - utf16_output); + reinterpret_cast(utf16_output)); } - if (big_endian) { - const __m128i swap = - _mm_setr_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14); - utf16_packed = _mm_shuffle_epi8(utf16_packed, swap); + if (!match_system(big_endian)) { + utf16_packed = lasx_swap_bytes(utf16_packed); } - _mm_storeu_si128((__m128i *)utf16_output, utf16_packed); - utf16_output += 8; - buf += 8; + __lasx_xvst(utf16_packed, utf16_output, 0); + utf16_output += 16; + buf += 16; } else { - size_t forward = 7; + size_t forward = 15; size_t k = 0; if (size_t(end - buf) < forward + 1) { forward = size_t(end - buf - 1); @@ -37726,26 +53195,26 @@ sse_convert_utf32_to_utf16_with_errors(const char32_t *buf, size_t len, // will not generate a surrogate pair if (word >= 0xD800 && word <= 0xDFFF) { return std::make_pair( - result(error_code::SURROGATE, buf - start + k), utf16_output); + result(error_code::SURROGATE, buf - start + k), + reinterpret_cast(utf16_output)); } - *utf16_output++ = - big_endian - ? char16_t((uint16_t(word) >> 8) | (uint16_t(word) << 8)) - : char16_t(word); + *utf16_output++ = !match_system(big_endian) + ? char16_t(word >> 8 | word << 8) + : char16_t(word); } else { // will generate a surrogate pair if (word > 0x10FFFF) { return std::make_pair( - result(error_code::TOO_LARGE, buf - start + k), utf16_output); + result(error_code::TOO_LARGE, buf - start + k), + reinterpret_cast(utf16_output)); } word -= 0x10000; uint16_t high_surrogate = uint16_t(0xD800 + (word >> 10)); uint16_t low_surrogate = uint16_t(0xDC00 + (word & 0x3FF)); - if (big_endian) { + if (!match_system(big_endian)) { high_surrogate = - uint16_t((high_surrogate >> 8) | (high_surrogate << 8)); - low_surrogate = - uint16_t((low_surrogate >> 8) | (low_surrogate << 8)); + uint16_t(high_surrogate >> 8 | high_surrogate << 8); + low_surrogate = uint16_t(low_surrogate << 8 | low_surrogate >> 8); } *utf16_output++ = char16_t(high_surrogate); *utf16_output++ = char16_t(low_surrogate); @@ -37755,10 +53224,11 @@ sse_convert_utf32_to_utf16_with_errors(const char32_t *buf, size_t len, } } - return std::make_pair(result(error_code::SUCCESS, buf - start), utf16_output); + return std::make_pair(result(error_code::SUCCESS, buf - start), + reinterpret_cast(utf16_output)); } -/* end file src/westmere/sse_convert_utf32_to_utf16.cpp */ -/* begin file src/westmere/sse_base64.cpp */ +/* end file src/lasx/lasx_convert_utf32_to_utf16.cpp */ +/* begin file src/lasx/lasx_base64.cpp */ /** * References and further reading: * @@ -37786,36 +53256,6 @@ sse_convert_utf32_to_utf16_with_errors(const char32_t *buf, size_t len, * Nick Kopp. 2013. Base64 Encoding on a GPU. * https://www.codeproject.com/Articles/276993/Base-Encoding-on-a-GPU. (2013). */ -template __m128i lookup_pshufb_improved(const __m128i input) { - // credit: Wojciech Muła - // reduce 0..51 -> 0 - // 52..61 -> 1 .. 10 - // 62 -> 11 - // 63 -> 12 - __m128i result = _mm_subs_epu8(input, _mm_set1_epi8(51)); - - // distinguish between ranges 0..25 and 26..51: - // 0 .. 25 -> remains 0 - // 26 .. 51 -> becomes 13 - const __m128i less = _mm_cmpgt_epi8(_mm_set1_epi8(26), input); - result = _mm_or_si128(result, _mm_and_si128(less, _mm_set1_epi8(13))); - - __m128i shift_LUT; - if (base64_url) { - shift_LUT = _mm_setr_epi8('a' - 26, '0' - 52, '0' - 52, '0' - 52, '0' - 52, - '0' - 52, '0' - 52, '0' - 52, '0' - 52, '0' - 52, - '0' - 52, '-' - 62, '_' - 63, 'A', 0, 0); - } else { - shift_LUT = _mm_setr_epi8('a' - 26, '0' - 52, '0' - 52, '0' - 52, '0' - 52, - '0' - 52, '0' - 52, '0' - 52, '0' - 52, '0' - 52, - '0' - 52, '+' - 62, '/' - 63, 'A', 0, 0); - } - - // read shift - result = _mm_shuffle_epi8(shift_LUT, result); - - return _mm_add_epi8(result, input); -} template size_t encode_base64(char *dst, const char *src, size_t srclen, @@ -37823,71 +53263,124 @@ size_t encode_base64(char *dst, const char *src, size_t srclen, // credit: Wojciech Muła // SSE (lookup: pshufb improved unrolled) const uint8_t *input = (const uint8_t *)src; - + static const char *lookup_tbl = + isbase64url + ? "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_" + : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; uint8_t *out = (uint8_t *)dst; - const __m128i shuf = - _mm_set_epi8(10, 11, 9, 10, 7, 8, 6, 7, 4, 5, 3, 4, 1, 2, 0, 1); + v32u8 shuf; + __m256i v_fc0fc00, v_3f03f0, shift_r, shift_l, base64_tbl0, base64_tbl1, + base64_tbl2, base64_tbl3; + if (srclen >= 28) { + shuf = v32u8{1, 0, 2, 1, 4, 3, 5, 4, 7, 6, 8, 7, 10, 9, 11, 10, + 1, 0, 2, 1, 4, 3, 5, 4, 7, 6, 8, 7, 10, 9, 11, 10}; + + v_fc0fc00 = __lasx_xvreplgr2vr_w(uint32_t(0x0fc0fc00)); + v_3f03f0 = __lasx_xvreplgr2vr_w(uint32_t(0x003f03f0)); + shift_r = __lasx_xvreplgr2vr_w(uint32_t(0x0006000a)); + shift_l = __lasx_xvreplgr2vr_w(uint32_t(0x00080004)); + base64_tbl0 = ____m256i(__lsx_vld(lookup_tbl, 0)); + base64_tbl1 = ____m256i(__lsx_vld(lookup_tbl, 16)); + base64_tbl2 = ____m256i(__lsx_vld(lookup_tbl, 32)); + base64_tbl3 = ____m256i(__lsx_vld(lookup_tbl, 48)); + } size_t i = 0; - for (; i + 52 <= srclen; i += 48) { - __m128i in0 = _mm_loadu_si128( - reinterpret_cast(input + i + 4 * 3 * 0)); - __m128i in1 = _mm_loadu_si128( - reinterpret_cast(input + i + 4 * 3 * 1)); - __m128i in2 = _mm_loadu_si128( - reinterpret_cast(input + i + 4 * 3 * 2)); - __m128i in3 = _mm_loadu_si128( - reinterpret_cast(input + i + 4 * 3 * 3)); - - in0 = _mm_shuffle_epi8(in0, shuf); - in1 = _mm_shuffle_epi8(in1, shuf); - in2 = _mm_shuffle_epi8(in2, shuf); - in3 = _mm_shuffle_epi8(in3, shuf); - - const __m128i t0_0 = _mm_and_si128(in0, _mm_set1_epi32(0x0fc0fc00)); - const __m128i t0_1 = _mm_and_si128(in1, _mm_set1_epi32(0x0fc0fc00)); - const __m128i t0_2 = _mm_and_si128(in2, _mm_set1_epi32(0x0fc0fc00)); - const __m128i t0_3 = _mm_and_si128(in3, _mm_set1_epi32(0x0fc0fc00)); - - const __m128i t1_0 = _mm_mulhi_epu16(t0_0, _mm_set1_epi32(0x04000040)); - const __m128i t1_1 = _mm_mulhi_epu16(t0_1, _mm_set1_epi32(0x04000040)); - const __m128i t1_2 = _mm_mulhi_epu16(t0_2, _mm_set1_epi32(0x04000040)); - const __m128i t1_3 = _mm_mulhi_epu16(t0_3, _mm_set1_epi32(0x04000040)); - - const __m128i t2_0 = _mm_and_si128(in0, _mm_set1_epi32(0x003f03f0)); - const __m128i t2_1 = _mm_and_si128(in1, _mm_set1_epi32(0x003f03f0)); - const __m128i t2_2 = _mm_and_si128(in2, _mm_set1_epi32(0x003f03f0)); - const __m128i t2_3 = _mm_and_si128(in3, _mm_set1_epi32(0x003f03f0)); - - const __m128i t3_0 = _mm_mullo_epi16(t2_0, _mm_set1_epi32(0x01000010)); - const __m128i t3_1 = _mm_mullo_epi16(t2_1, _mm_set1_epi32(0x01000010)); - const __m128i t3_2 = _mm_mullo_epi16(t2_2, _mm_set1_epi32(0x01000010)); - const __m128i t3_3 = _mm_mullo_epi16(t2_3, _mm_set1_epi32(0x01000010)); - - const __m128i input0 = _mm_or_si128(t1_0, t3_0); - const __m128i input1 = _mm_or_si128(t1_1, t3_1); - const __m128i input2 = _mm_or_si128(t1_2, t3_2); - const __m128i input3 = _mm_or_si128(t1_3, t3_3); - - _mm_storeu_si128(reinterpret_cast<__m128i *>(out), - lookup_pshufb_improved(input0)); - out += 16; + for (; i + 100 <= srclen; i += 96) { + __m128i in0_lo = + __lsx_vld(reinterpret_cast(input + i), 4 * 3 * 0); + __m128i in0_hi = + __lsx_vld(reinterpret_cast(input + i), 4 * 3 * 1); + __m128i in1_lo = + __lsx_vld(reinterpret_cast(input + i), 4 * 3 * 2); + __m128i in1_hi = + __lsx_vld(reinterpret_cast(input + i), 4 * 3 * 3); + __m128i in2_lo = + __lsx_vld(reinterpret_cast(input + i), 4 * 3 * 4); + __m128i in2_hi = + __lsx_vld(reinterpret_cast(input + i), 4 * 3 * 5); + __m128i in3_lo = + __lsx_vld(reinterpret_cast(input + i), 4 * 3 * 6); + __m128i in3_hi = + __lsx_vld(reinterpret_cast(input + i), 4 * 3 * 7); + + __m256i in0 = lasx_set_q(in0_hi, in0_lo); + __m256i in1 = lasx_set_q(in1_hi, in1_lo); + __m256i in2 = lasx_set_q(in2_hi, in2_lo); + __m256i in3 = lasx_set_q(in3_hi, in3_lo); + + in0 = __lasx_xvshuf_b(in0, in0, (__m256i)shuf); + in1 = __lasx_xvshuf_b(in1, in1, (__m256i)shuf); + in2 = __lasx_xvshuf_b(in2, in2, (__m256i)shuf); + in3 = __lasx_xvshuf_b(in3, in3, (__m256i)shuf); + + __m256i t0_0 = __lasx_xvand_v(in0, v_fc0fc00); + __m256i t0_1 = __lasx_xvand_v(in1, v_fc0fc00); + __m256i t0_2 = __lasx_xvand_v(in2, v_fc0fc00); + __m256i t0_3 = __lasx_xvand_v(in3, v_fc0fc00); + + __m256i t1_0 = __lasx_xvsrl_h(t0_0, shift_r); + __m256i t1_1 = __lasx_xvsrl_h(t0_1, shift_r); + __m256i t1_2 = __lasx_xvsrl_h(t0_2, shift_r); + __m256i t1_3 = __lasx_xvsrl_h(t0_3, shift_r); + + __m256i t2_0 = __lasx_xvand_v(in0, v_3f03f0); + __m256i t2_1 = __lasx_xvand_v(in1, v_3f03f0); + __m256i t2_2 = __lasx_xvand_v(in2, v_3f03f0); + __m256i t2_3 = __lasx_xvand_v(in3, v_3f03f0); + + __m256i t3_0 = __lasx_xvsll_h(t2_0, shift_l); + __m256i t3_1 = __lasx_xvsll_h(t2_1, shift_l); + __m256i t3_2 = __lasx_xvsll_h(t2_2, shift_l); + __m256i t3_3 = __lasx_xvsll_h(t2_3, shift_l); + + __m256i input0 = __lasx_xvor_v(t1_0, t3_0); + __m256i input0_shuf0 = __lasx_xvshuf_b(base64_tbl1, base64_tbl0, input0); + __m256i input0_shuf1 = __lasx_xvshuf_b( + base64_tbl3, base64_tbl2, __lasx_xvsub_b(input0, __lasx_xvldi(32))); + __m256i input0_mask = __lasx_xvslei_bu(input0, 31); + __m256i input0_result = + __lasx_xvbitsel_v(input0_shuf1, input0_shuf0, input0_mask); + __lasx_xvst(input0_result, reinterpret_cast<__m256i *>(out), 0); + out += 32; - _mm_storeu_si128(reinterpret_cast<__m128i *>(out), - lookup_pshufb_improved(input1)); - out += 16; + __m256i input1 = __lasx_xvor_v(t1_1, t3_1); + __m256i input1_shuf0 = __lasx_xvshuf_b(base64_tbl1, base64_tbl0, input1); + __m256i input1_shuf1 = __lasx_xvshuf_b( + base64_tbl3, base64_tbl2, __lasx_xvsub_b(input1, __lasx_xvldi(32))); + __m256i input1_mask = __lasx_xvslei_bu(input1, 31); + __m256i input1_result = + __lasx_xvbitsel_v(input1_shuf1, input1_shuf0, input1_mask); + __lasx_xvst(input1_result, reinterpret_cast<__m256i *>(out), 0); + out += 32; - _mm_storeu_si128(reinterpret_cast<__m128i *>(out), - lookup_pshufb_improved(input2)); - out += 16; + __m256i input2 = __lasx_xvor_v(t1_2, t3_2); + __m256i input2_shuf0 = __lasx_xvshuf_b(base64_tbl1, base64_tbl0, input2); + __m256i input2_shuf1 = __lasx_xvshuf_b( + base64_tbl3, base64_tbl2, __lasx_xvsub_b(input2, __lasx_xvldi(32))); + __m256i input2_mask = __lasx_xvslei_bu(input2, 31); + __m256i input2_result = + __lasx_xvbitsel_v(input2_shuf1, input2_shuf0, input2_mask); + __lasx_xvst(input2_result, reinterpret_cast<__m256i *>(out), 0); + out += 32; - _mm_storeu_si128(reinterpret_cast<__m128i *>(out), - lookup_pshufb_improved(input3)); - out += 16; + __m256i input3 = __lasx_xvor_v(t1_3, t3_3); + __m256i input3_shuf0 = __lasx_xvshuf_b(base64_tbl1, base64_tbl0, input3); + __m256i input3_shuf1 = __lasx_xvshuf_b( + base64_tbl3, base64_tbl2, __lasx_xvsub_b(input3, __lasx_xvldi(32))); + __m256i input3_mask = __lasx_xvslei_bu(input3, 31); + __m256i input3_result = + __lasx_xvbitsel_v(input3_shuf1, input3_shuf0, input3_mask); + __lasx_xvst(input3_result, reinterpret_cast<__m256i *>(out), 0); + out += 32; } - for (; i + 16 <= srclen; i += 12) { + for (; i + 28 <= srclen; i += 24) { - __m128i in = _mm_loadu_si128(reinterpret_cast(input + i)); + __m128i in_lo = __lsx_vld(reinterpret_cast(input + i), 0); + __m128i in_hi = + __lsx_vld(reinterpret_cast(input + i), 4 * 3 * 1); + + __m256i in = lasx_set_q(in_hi, in_lo); // bytes from groups A, B and C are needed in separate 32-bit lanes // in = [DDDD|CCCC|BBBB|AAAA] @@ -37901,40 +53394,43 @@ size_t encode_base64(char *dst, const char *src, size_t srclen, // [bbbbcccc|ccdddddd|aaaaaabb|bbbbcccc] // ^^^^ ^^^^^^^^ ^^^^^^^^ ^^^^ // processed bits - in = _mm_shuffle_epi8(in, shuf); + in = __lasx_xvshuf_b(in, in, (__m256i)shuf); // unpacking - // t0 = [0000cccc|cc000000|aaaaaa00|00000000] - const __m128i t0 = _mm_and_si128(in, _mm_set1_epi32(0x0fc0fc00)); + __m256i t0 = __lasx_xvand_v(in, v_fc0fc00); // t1 = [00000000|00cccccc|00000000|00aaaaaa] - // (c * (1 << 10), a * (1 << 6)) >> 16 (note: an unsigned - // multiplication) - const __m128i t1 = _mm_mulhi_epu16(t0, _mm_set1_epi32(0x04000040)); + // ((c >> 6), (a >> 10)) + __m256i t1 = __lasx_xvsrl_h(t0, shift_r); // t2 = [00000000|00dddddd|000000bb|bbbb0000] - const __m128i t2 = _mm_and_si128(in, _mm_set1_epi32(0x003f03f0)); - // t3 = [00dddddd|00000000|00bbbbbb|00000000]( - // (d * (1 << 8), b * (1 << 4)) - const __m128i t3 = _mm_mullo_epi16(t2, _mm_set1_epi32(0x01000010)); + __m256i t2 = __lasx_xvand_v(in, v_3f03f0); + // t3 = [00dddddd|00000000|00bbbbbb|00000000] + // ((d << 8), (b << 4)) + __m256i t3 = __lasx_xvsll_h(t2, shift_l); // res = [00dddddd|00cccccc|00bbbbbb|00aaaaaa] = t1 | t3 - const __m128i indices = _mm_or_si128(t1, t3); - - _mm_storeu_si128(reinterpret_cast<__m128i *>(out), - lookup_pshufb_improved(indices)); - out += 16; + __m256i indices = __lasx_xvor_v(t1, t3); + + __m256i indices_shuf0 = __lasx_xvshuf_b(base64_tbl1, base64_tbl0, indices); + __m256i indices_shuf1 = __lasx_xvshuf_b( + base64_tbl3, base64_tbl2, __lasx_xvsub_b(indices, __lasx_xvldi(32))); + __m256i indices_mask = __lasx_xvslei_bu(indices, 31); + __m256i indices_result = + __lasx_xvbitsel_v(indices_shuf1, indices_shuf0, indices_mask); + __lasx_xvst(indices_result, reinterpret_cast<__m256i *>(out), 0); + out += 32; } return i / 3 * 4 + scalar::base64::tail_encode_base64((char *)out, src + i, srclen - i, options); } + static inline void compress(__m128i data, uint16_t mask, char *output) { if (mask == 0) { - _mm_storeu_si128(reinterpret_cast<__m128i *>(output), data); + __lsx_vst(data, reinterpret_cast<__m128i *>(output), 0); return; } - // this particular implementation was inspired by work done by @animetosho // we do it in two steps, first 8 bytes and then second 8 bytes uint8_t mask1 = uint8_t(mask); // least significant 8 bits @@ -37943,13 +53439,15 @@ static inline void compress(__m128i data, uint16_t mask, char *output) { // thintable_epi8[mask2] into a 128-bit register, using only // two instructions on most compilers. - __m128i shufmask = _mm_set_epi64x(tables::base64::thintable_epi8[mask2], - tables::base64::thintable_epi8[mask1]); + v2u64 shufmask = {tables::base64::thintable_epi8[mask1], + tables::base64::thintable_epi8[mask2]}; + // we increment by 0x08 the second half of the mask - shufmask = - _mm_add_epi8(shufmask, _mm_set_epi32(0x08080808, 0x08080808, 0, 0)); + const v4u32 hi = {0, 0, 0x08080808, 0x08080808}; + __m128i shufmask1 = __lsx_vadd_b((__m128i)shufmask, (__m128i)hi); + // this is the version "nearly pruned" - __m128i pruned = _mm_shuffle_epi8(data, shufmask); + __m128i pruned = __lsx_vshuf_b(data, data, shufmask1); // we still need to put the two halves together. // we compute the popcount of the first half: int pop1 = tables::base64::BitsSetTable256mul2[mask1]; @@ -37957,88 +53455,96 @@ static inline void compress(__m128i data, uint16_t mask, char *output) { // only the first pop1 bytes from the first 8 bytes, and then // it fills in with the bytes from the second 8 bytes + some filling // at the end. - __m128i compactmask = _mm_loadu_si128(reinterpret_cast( - tables::base64::pshufb_combine_table + pop1 * 8)); - __m128i answer = _mm_shuffle_epi8(pruned, compactmask); - _mm_storeu_si128(reinterpret_cast<__m128i *>(output), answer); + __m128i compactmask = + __lsx_vld(reinterpret_cast( + tables::base64::pshufb_combine_table + pop1 * 8), + 0); + __m128i answer = __lsx_vshuf_b(pruned, pruned, compactmask); + + __lsx_vst(answer, reinterpret_cast<__m128i *>(output), 0); } struct block64 { - __m128i chunks[4]; + __m256i chunks[2]; }; template -static inline uint16_t to_base64_mask(__m128i *src, bool *error) { - const __m128i ascii_space_tbl = - _mm_setr_epi8(0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xa, 0x0, - 0xc, 0xd, 0x0, 0x0); +static inline uint32_t to_base64_mask(__m256i *src, bool *error) { + __m256i ascii_space_tbl = + ____m256i((__m128i)v16u8{0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xa, 0x0, 0xc, 0xd, 0x0, 0x0}); // credit: aqrit - __m128i delta_asso; - if (base64_url) { - delta_asso = _mm_setr_epi8(0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xF, 0x0, 0xF); - } else { - - delta_asso = _mm_setr_epi8(0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x0F); - } - __m128i delta_values; - if (base64_url) { - delta_values = _mm_setr_epi8(0x0, 0x0, 0x0, 0x13, 0x4, uint8_t(0xBF), - uint8_t(0xBF), uint8_t(0xB9), uint8_t(0xB9), - 0x0, 0x11, uint8_t(0xC3), uint8_t(0xBF), - uint8_t(0xE0), uint8_t(0xB9), uint8_t(0xB9)); - } else { - - delta_values = - _mm_setr_epi8(int8_t(0x00), int8_t(0x00), int8_t(0x00), int8_t(0x13), - int8_t(0x04), int8_t(0xBF), int8_t(0xBF), int8_t(0xB9), - int8_t(0xB9), int8_t(0x00), int8_t(0x10), int8_t(0xC3), - int8_t(0xBF), int8_t(0xBF), int8_t(0xB9), int8_t(0xB9)); - } - __m128i check_asso; - if (base64_url) { - check_asso = _mm_setr_epi8(0xD, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, - 0x3, 0x7, 0xB, 0xE, 0xB, 0x6); - } else { - - check_asso = _mm_setr_epi8(0x0D, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x03, 0x07, 0x0B, 0x0B, 0x0B, 0x0F); - } - __m128i check_values; + __m256i delta_asso = + ____m256i((__m128i)v16u8{0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xF, 0x0, 0xF}); + __m256i delta_values; if (base64_url) { - check_values = _mm_setr_epi8(uint8_t(0x80), uint8_t(0x80), uint8_t(0x80), - uint8_t(0x80), uint8_t(0xCF), uint8_t(0xBF), - uint8_t(0xB6), uint8_t(0xA6), uint8_t(0xB5), - uint8_t(0xA1), 0x0, uint8_t(0x80), 0x0, - uint8_t(0x80), 0x0, uint8_t(0x80)); - } else { - - check_values = - _mm_setr_epi8(int8_t(0x80), int8_t(0x80), int8_t(0x80), int8_t(0x80), - int8_t(0xCF), int8_t(0xBF), int8_t(0xD5), int8_t(0xA6), - int8_t(0xB5), int8_t(0x86), int8_t(0xD1), int8_t(0x80), - int8_t(0xB1), int8_t(0x80), int8_t(0x91), int8_t(0x80)); + delta_values = ____m256i( + (__m128i)v16i8{int8_t(0x00), int8_t(0x00), int8_t(0x00), int8_t(0x13), + int8_t(0x04), int8_t(0xBF), int8_t(0xBF), int8_t(0xB9), + int8_t(0xB9), int8_t(0x00), int8_t(0x11), int8_t(0xC3), + int8_t(0xBF), int8_t(0xE0), int8_t(0xB9), int8_t(0xB9)}); + } else { + delta_values = ____m256i( + (__m128i)v16i8{int8_t(0x00), int8_t(0x00), int8_t(0x00), int8_t(0x13), + int8_t(0x04), int8_t(0xBF), int8_t(0xBF), int8_t(0xB9), + int8_t(0xB9), int8_t(0x00), int8_t(0x10), int8_t(0xC3), + int8_t(0xBF), int8_t(0xBF), int8_t(0xB9), int8_t(0xB9)}); } - const __m128i shifted = _mm_srli_epi32(*src, 3); - const __m128i delta_hash = - _mm_avg_epu8(_mm_shuffle_epi8(delta_asso, *src), shifted); - const __m128i check_hash = - _mm_avg_epu8(_mm_shuffle_epi8(check_asso, *src), shifted); + __m256i check_asso; + if (base64_url) { + check_asso = ____m256i((__m128i)v16u8{0x0D, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x03, 0x07, + 0x0B, 0x06, 0x0B, 0x12}); + } else { + check_asso = ____m256i((__m128i)v16u8{0x0D, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x03, 0x07, + 0x0B, 0x0B, 0x0B, 0x0F}); + } - const __m128i out = - _mm_adds_epi8(_mm_shuffle_epi8(delta_values, delta_hash), *src); - const __m128i chk = - _mm_adds_epi8(_mm_shuffle_epi8(check_values, check_hash), *src); - const int mask = _mm_movemask_epi8(chk); + __m256i check_values; + if (base64_url) { + check_values = ____m256i( + (__m128i)v16i8{int8_t(0x0), int8_t(0x80), int8_t(0x80), int8_t(0x80), + int8_t(0xCF), int8_t(0xBF), int8_t(0xD3), int8_t(0xA6), + int8_t(0xB5), int8_t(0x86), int8_t(0xD0), int8_t(0x80), + int8_t(0xB0), int8_t(0x80), int8_t(0x0), int8_t(0x0)}); + } else { + check_values = ____m256i( + (__m128i)v16i8{int8_t(0x80), int8_t(0x80), int8_t(0x80), int8_t(0x80), + int8_t(0xCF), int8_t(0xBF), int8_t(0xD5), int8_t(0xA6), + int8_t(0xB5), int8_t(0x86), int8_t(0xD1), int8_t(0x80), + int8_t(0xB1), int8_t(0x80), int8_t(0x91), int8_t(0x80)}); + } + + __m256i shifted = __lasx_xvsrli_b(*src, 3); + __m256i asso_index = __lasx_xvand_v(*src, __lasx_xvldi(0xF)); + __m256i delta_hash = __lasx_xvavgr_bu( + __lasx_xvshuf_b(delta_asso, delta_asso, asso_index), shifted); + __m256i check_hash = __lasx_xvavgr_bu( + __lasx_xvshuf_b(check_asso, check_asso, asso_index), shifted); + + __m256i out = __lasx_xvsadd_b( + __lasx_xvshuf_b(delta_values, delta_values, delta_hash), *src); + __m256i chk = __lasx_xvsadd_b( + __lasx_xvshuf_b(check_values, check_values, check_hash), *src); + __m256i chk_ltz = __lasx_xvmskltz_b(chk); + unsigned int mask = __lasx_xvpickve2gr_wu(chk_ltz, 0); + mask = mask | (__lsx_vpickve2gr_hu(lasx_extracti128_hi(chk_ltz), 0) << 16); if (mask) { - __m128i ascii_space = - _mm_cmpeq_epi8(_mm_shuffle_epi8(ascii_space_tbl, *src), *src); - *error |= (mask != _mm_movemask_epi8(ascii_space)); + __m256i ascii_space = __lasx_xvseq_b( + __lasx_xvshuf_b(ascii_space_tbl, ascii_space_tbl, asso_index), *src); + __m256i ascii_space_ltz = __lasx_xvmskltz_b(ascii_space); + unsigned int ascii_space_mask = __lasx_xvpickve2gr_wu(ascii_space_ltz, 0); + ascii_space_mask = + ascii_space_mask | + (__lsx_vpickve2gr_hu(lasx_extracti128_hi(ascii_space_ltz), 0) << 16); + *error |= (mask != ascii_space_mask); } + *src = out; - return (uint16_t)mask; + return (uint32_t)mask; } template @@ -38046,106 +53552,91 @@ static inline uint64_t to_base64_mask(block64 *b, bool *error) { *error = 0; uint64_t m0 = to_base64_mask(&b->chunks[0], error); uint64_t m1 = to_base64_mask(&b->chunks[1], error); - uint64_t m2 = to_base64_mask(&b->chunks[2], error); - uint64_t m3 = to_base64_mask(&b->chunks[3], error); - return m0 | (m1 << 16) | (m2 << 32) | (m3 << 48); + return m0 | (m1 << 32); } static inline void copy_block(block64 *b, char *output) { - _mm_storeu_si128(reinterpret_cast<__m128i *>(output), b->chunks[0]); - _mm_storeu_si128(reinterpret_cast<__m128i *>(output + 16), b->chunks[1]); - _mm_storeu_si128(reinterpret_cast<__m128i *>(output + 32), b->chunks[2]); - _mm_storeu_si128(reinterpret_cast<__m128i *>(output + 48), b->chunks[3]); + __lasx_xvst(b->chunks[0], reinterpret_cast<__m256i *>(output), 0); + __lasx_xvst(b->chunks[1], reinterpret_cast<__m256i *>(output), 32); } static inline uint64_t compress_block(block64 *b, uint64_t mask, char *output) { uint64_t nmask = ~mask; - compress(b->chunks[0], uint16_t(mask), output); - compress(b->chunks[1], uint16_t(mask >> 16), - output + _mm_popcnt_u64(nmask & 0xFFFF)); - compress(b->chunks[2], uint16_t(mask >> 32), - output + _mm_popcnt_u64(nmask & 0xFFFFFFFF)); - compress(b->chunks[3], uint16_t(mask >> 48), - output + _mm_popcnt_u64(nmask & 0xFFFFFFFFFFFFULL)); - return _mm_popcnt_u64(nmask); + uint64_t count = + __lsx_vpickve2gr_d(__lsx_vpcnt_h(__lsx_vreplgr2vr_d(nmask)), 0); + uint16_t *count_ptr = (uint16_t *)&count; + compress(lasx_extracti128_lo(b->chunks[0]), uint16_t(mask), output); + compress(lasx_extracti128_hi(b->chunks[0]), uint16_t(mask >> 16), + output + count_ptr[0]); + compress(lasx_extracti128_lo(b->chunks[1]), uint16_t(mask >> 32), + output + count_ptr[0] + count_ptr[1]); + compress(lasx_extracti128_hi(b->chunks[1]), uint16_t(mask >> 48), + output + count_ptr[0] + count_ptr[1] + count_ptr[2]); + return count_ones(nmask); } // The caller of this function is responsible to ensure that there are 64 bytes // available from reading at src. The data is read into a block64 structure. static inline void load_block(block64 *b, const char *src) { - b->chunks[0] = _mm_loadu_si128(reinterpret_cast(src)); - b->chunks[1] = _mm_loadu_si128(reinterpret_cast(src + 16)); - b->chunks[2] = _mm_loadu_si128(reinterpret_cast(src + 32)); - b->chunks[3] = _mm_loadu_si128(reinterpret_cast(src + 48)); + b->chunks[0] = __lasx_xvld(reinterpret_cast(src), 0); + b->chunks[1] = __lasx_xvld(reinterpret_cast(src), 32); } // The caller of this function is responsible to ensure that there are 128 bytes // available from reading at src. The data is read into a block64 structure. static inline void load_block(block64 *b, const char16_t *src) { - __m128i m1 = _mm_loadu_si128(reinterpret_cast(src)); - __m128i m2 = _mm_loadu_si128(reinterpret_cast(src + 8)); - __m128i m3 = _mm_loadu_si128(reinterpret_cast(src + 16)); - __m128i m4 = _mm_loadu_si128(reinterpret_cast(src + 24)); - __m128i m5 = _mm_loadu_si128(reinterpret_cast(src + 32)); - __m128i m6 = _mm_loadu_si128(reinterpret_cast(src + 40)); - __m128i m7 = _mm_loadu_si128(reinterpret_cast(src + 48)); - __m128i m8 = _mm_loadu_si128(reinterpret_cast(src + 56)); - b->chunks[0] = _mm_packus_epi16(m1, m2); - b->chunks[1] = _mm_packus_epi16(m3, m4); - b->chunks[2] = _mm_packus_epi16(m5, m6); - b->chunks[3] = _mm_packus_epi16(m7, m8); + __m256i m1 = __lasx_xvld(reinterpret_cast(src), 0); + __m256i m2 = __lasx_xvld(reinterpret_cast(src), 32); + __m256i m3 = __lasx_xvld(reinterpret_cast(src), 64); + __m256i m4 = __lasx_xvld(reinterpret_cast(src), 96); + b->chunks[0] = __lasx_xvpermi_d(__lasx_xvssrlni_bu_h(m2, m1, 0), 0b11011000); + b->chunks[1] = __lasx_xvpermi_d(__lasx_xvssrlni_bu_h(m4, m3, 0), 0b11011000); } -static inline void base64_decode(char *out, __m128i str) { - // credit: aqrit - - const __m128i pack_shuffle = - _mm_setr_epi8(2, 1, 0, 6, 5, 4, 10, 9, 8, 14, 13, 12, -1, -1, -1, -1); +static inline void base64_decode(char *out, __m256i str) { + __m256i t0 = __lasx_xvor_v( + __lasx_xvslli_w(str, 26), + __lasx_xvslli_w(__lasx_xvand_v(str, __lasx_xvldi(-1758 /*0x0000FF00*/)), + 12)); + __m256i t1 = __lasx_xvsrli_w( + __lasx_xvand_v(str, __lasx_xvldi(-3521 /*0x003F0000*/)), 2); + __m256i t2 = __lasx_xvor_v(t0, t1); + __m256i t3 = __lasx_xvor_v(t2, __lasx_xvsrli_w(str, 16)); + __m256i pack_shuffle = ____m256i( + (__m128i)v16u8{3, 2, 1, 7, 6, 5, 11, 10, 9, 15, 14, 13, 0, 0, 0, 0}); + t3 = __lasx_xvshuf_b(t3, t3, (__m256i)pack_shuffle); - const __m128i t0 = _mm_maddubs_epi16(str, _mm_set1_epi32(0x01400140)); - const __m128i t1 = _mm_madd_epi16(t0, _mm_set1_epi32(0x00011000)); - const __m128i t2 = _mm_shuffle_epi8(t1, pack_shuffle); // Store the output: - // this writes 16 bytes, but we only need 12. - _mm_storeu_si128((__m128i *)out, t2); + __lsx_vst(lasx_extracti128_lo(t3), out, 0); + __lsx_vst(lasx_extracti128_hi(t3), out, 12); } // decode 64 bytes and output 48 bytes static inline void base64_decode_block(char *out, const char *src) { - base64_decode(out, _mm_loadu_si128(reinterpret_cast(src))); - base64_decode(out + 12, - _mm_loadu_si128(reinterpret_cast(src + 16))); + base64_decode(out, __lasx_xvld(reinterpret_cast(src), 0)); base64_decode(out + 24, - _mm_loadu_si128(reinterpret_cast(src + 32))); - base64_decode(out + 36, - _mm_loadu_si128(reinterpret_cast(src + 48))); + __lasx_xvld(reinterpret_cast(src), 32)); } + static inline void base64_decode_block_safe(char *out, const char *src) { - base64_decode(out, _mm_loadu_si128(reinterpret_cast(src))); - base64_decode(out + 12, - _mm_loadu_si128(reinterpret_cast(src + 16))); - base64_decode(out + 24, - _mm_loadu_si128(reinterpret_cast(src + 32))); - char buffer[16]; + base64_decode(out, __lasx_xvld(reinterpret_cast(src), 0)); + char buffer[32]; base64_decode(buffer, - _mm_loadu_si128(reinterpret_cast(src + 48))); - std::memcpy(out + 36, buffer, 12); + __lasx_xvld(reinterpret_cast(src), 32)); + std::memcpy(out + 24, buffer, 24); } + static inline void base64_decode_block(char *out, block64 *b) { base64_decode(out, b->chunks[0]); - base64_decode(out + 12, b->chunks[1]); - base64_decode(out + 24, b->chunks[2]); - base64_decode(out + 36, b->chunks[3]); + base64_decode(out + 24, b->chunks[1]); } static inline void base64_decode_block_safe(char *out, block64 *b) { base64_decode(out, b->chunks[0]); - base64_decode(out + 12, b->chunks[1]); - base64_decode(out + 24, b->chunks[2]); - char buffer[16]; - base64_decode(buffer, b->chunks[3]); - std::memcpy(out + 36, buffer, 12); + char buffer[32]; + base64_decode(buffer, b->chunks[1]); + std::memcpy(out + 24, buffer, 24); } -template +template full_result compress_decode_base64(char *dst, const chartype *src, size_t srclen, base64_options options, @@ -38176,7 +53667,7 @@ compress_decode_base64(char *dst, const chartype *src, size_t srclen, } } if (srclen == 0) { - if (equalsigns > 0) { + if (!ignore_garbage && equalsigns > 0) { return {INVALID_BASE64_CHARACTER, equallocation, 0}; } return {SUCCESS, 0, 0}; @@ -38189,7 +53680,7 @@ compress_decode_base64(char *dst, const chartype *src, size_t srclen, const chartype *const srcend = src + srclen; constexpr size_t block_size = 6; - static_assert(block_size >= 2, "block should of size 2 or more"); + static_assert(block_size >= 2, "block_size must be at least two"); char buffer[block_size * 64]; char *bufferptr = buffer; if (srclen >= 64) { @@ -38200,7 +53691,7 @@ compress_decode_base64(char *dst, const chartype *src, size_t srclen, src += 64; bool error = false; uint64_t badcharmask = to_base64_mask(&b, &error); - if (error) { + if (error && !ignore_garbage) { src -= 64; while (src < srcend && scalar::base64::is_eight_byte(*src) && to_base64[uint8_t(*src)] <= 64) { @@ -38248,10 +53739,12 @@ compress_decode_base64(char *dst, const chartype *src, size_t srclen, // time, otherwise, we should just decode directly. int last_block = (int)((bufferptr - buffer_start) % 64); if (last_block != 0 && srcend - src + last_block >= 64) { + while ((bufferptr - buffer_start) % 64 != 0 && src < srcend) { uint8_t val = to_base64[uint8_t(*src)]; *bufferptr = char(val); - if (!scalar::base64::is_eight_byte(*src) || val > 64) { + if ((!scalar::base64::is_eight_byte(*src) || val > 64) && + !ignore_garbage) { return {error_code::INVALID_BASE64_CHARACTER, size_t(src - srcinit), size_t(dst - dstinit)}; } @@ -38297,8 +53790,14 @@ compress_decode_base64(char *dst, const chartype *src, size_t srclen, // backtrack int leftover = int(bufferptr - buffer_start); while (leftover > 0) { - while (to_base64[uint8_t(*(src - 1))] == 64) { - src--; + if (!ignore_garbage) { + while (to_base64[uint8_t(*(src - 1))] == 64) { + src--; + } + } else { + while (to_base64[uint8_t(*(src - 1))] >= 64) { + src--; + } } src--; leftover--; @@ -38307,15 +53806,15 @@ compress_decode_base64(char *dst, const chartype *src, size_t srclen, if (src < srcend + equalsigns) { full_result r = scalar::base64::base64_tail_decode( dst, src, srcend - src, equalsigns, options, last_chunk_options); + r.input_count += size_t(src - srcinit); if (r.error == error_code::INVALID_BASE64_CHARACTER || r.error == error_code::BASE64_EXTRA_BITS) { - r.input_count += size_t(src - srcinit); return r; } else { r.output_count += size_t(dst - dstinit); } if (last_chunk_options != stop_before_partial && - r.error == error_code::SUCCESS && equalsigns > 0) { + r.error == error_code::SUCCESS && equalsigns > 0 && !ignore_garbage) { // additional checks if ((r.output_count % 3 == 0) || ((r.output_count % 3) + 1 + equalsigns != 4)) { @@ -38325,7 +53824,7 @@ compress_decode_base64(char *dst, const chartype *src, size_t srclen, } return r; } - if (equalsigns > 0) { + if (equalsigns > 0 && !ignore_garbage) { if ((size_t(dst - dstinit) % 3 == 0) || ((size_t(dst - dstinit) % 3) + 1 + equalsigns != 4)) { return {INVALID_BASE64_CHARACTER, equallocation, size_t(dst - dstinit)}; @@ -38333,15 +53832,15 @@ compress_decode_base64(char *dst, const chartype *src, size_t srclen, } return {SUCCESS, srclen, size_t(dst - dstinit)}; } -/* end file src/westmere/sse_base64.cpp */ +/* end file src/lasx/lasx_base64.cpp */ -} // unnamed namespace -} // namespace westmere +} // namespace +} // namespace lasx } // namespace simdutf /* begin file src/generic/buf_block_reader.h */ namespace simdutf { -namespace westmere { +namespace lasx { namespace { // Walks through a buffer in block-sized increments, loading the last part with @@ -38447,12 +53946,12 @@ simdutf_really_inline void buf_block_reader::advance() { } } // unnamed namespace -} // namespace westmere +} // namespace lasx } // namespace simdutf /* end file src/generic/buf_block_reader.h */ /* begin file src/generic/utf8_validation/utf8_lookup4_algorithm.h */ namespace simdutf { -namespace westmere { +namespace lasx { namespace { namespace utf8_validation { @@ -38672,12 +54171,12 @@ struct utf8_checker { using utf8_validation::utf8_checker; } // unnamed namespace -} // namespace westmere +} // namespace lasx } // namespace simdutf /* end file src/generic/utf8_validation/utf8_lookup4_algorithm.h */ /* begin file src/generic/utf8_validation/utf8_validator.h */ namespace simdutf { -namespace westmere { +namespace lasx { namespace { namespace utf8_validation { @@ -38812,14 +54311,416 @@ result generic_validate_ascii_with_errors(const char *input, size_t length) { } // namespace utf8_validation } // unnamed namespace -} // namespace westmere +} // namespace lasx } // namespace simdutf /* end file src/generic/utf8_validation/utf8_validator.h */ + +// transcoding from UTF-8 to Latin 1 +/* begin file src/generic/utf8_to_latin1/utf8_to_latin1.h */ + +namespace simdutf { +namespace lasx { +namespace { +namespace utf8_to_latin1 { +using namespace simd; + +simdutf_really_inline simd8 +check_special_cases(const simd8 input, const simd8 prev1) { + // For UTF-8 to Latin 1, we can allow any ASCII character, and any + // continuation byte, but the non-ASCII leading bytes must be 0b11000011 or + // 0b11000010 and nothing else. + // + // Bit 0 = Too Short (lead byte/ASCII followed by lead byte/ASCII) + // Bit 1 = Too Long (ASCII followed by continuation) + // Bit 2 = Overlong 3-byte + // Bit 4 = Surrogate + // Bit 5 = Overlong 2-byte + // Bit 7 = Two Continuations + constexpr const uint8_t TOO_SHORT = 1 << 0; // 11______ 0_______ + // 11______ 11______ + constexpr const uint8_t TOO_LONG = 1 << 1; // 0_______ 10______ + constexpr const uint8_t OVERLONG_3 = 1 << 2; // 11100000 100_____ + constexpr const uint8_t SURROGATE = 1 << 4; // 11101101 101_____ + constexpr const uint8_t OVERLONG_2 = 1 << 5; // 1100000_ 10______ + constexpr const uint8_t TWO_CONTS = 1 << 7; // 10______ 10______ + constexpr const uint8_t TOO_LARGE = 1 << 3; // 11110100 1001____ + // 11110100 101_____ + // 11110101 1001____ + // 11110101 101_____ + // 1111011_ 1001____ + // 1111011_ 101_____ + // 11111___ 1001____ + // 11111___ 101_____ + constexpr const uint8_t TOO_LARGE_1000 = 1 << 6; + // 11110101 1000____ + // 1111011_ 1000____ + // 11111___ 1000____ + constexpr const uint8_t OVERLONG_4 = 1 << 6; // 11110000 1000____ + constexpr const uint8_t FORBIDDEN = 0xff; + + const simd8 byte_1_high = prev1.shr<4>().lookup_16( + // 0_______ ________ + TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, + TOO_LONG, + // 10______ ________ + TWO_CONTS, TWO_CONTS, TWO_CONTS, TWO_CONTS, + // 1100____ ________ + TOO_SHORT | OVERLONG_2, + // 1101____ ________ + FORBIDDEN, + // 1110____ ________ + FORBIDDEN, + // 1111____ ________ + FORBIDDEN); + constexpr const uint8_t CARRY = + TOO_SHORT | TOO_LONG | TWO_CONTS; // These all have ____ in byte 1 . + const simd8 byte_1_low = + (prev1 & 0x0F) + .lookup_16( + // ____0000 ________ + CARRY | OVERLONG_3 | OVERLONG_2 | OVERLONG_4, + // ____0001 ________ + CARRY | OVERLONG_2, + // ____001_ ________ + CARRY, CARRY, + + // ____0100 ________ + FORBIDDEN, + // ____0101 ________ + FORBIDDEN, + // ____011_ ________ + FORBIDDEN, FORBIDDEN, + + // ____1___ ________ + FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN, + // ____1101 ________ + FORBIDDEN, FORBIDDEN, FORBIDDEN); + const simd8 byte_2_high = input.shr<4>().lookup_16( + // ________ 0_______ + TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, + TOO_SHORT, TOO_SHORT, + + // ________ 1000____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE_1000 | + OVERLONG_4, + // ________ 1001____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE, + // ________ 101_____ + TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, + TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, + + // ________ 11______ + TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT); + return (byte_1_high & byte_1_low & byte_2_high); +} + +struct validating_transcoder { + // If this is nonzero, there has been a UTF-8 error. + simd8 error; + + validating_transcoder() : error(uint8_t(0)) {} + // + // Check whether the current bytes are valid UTF-8. + // + simdutf_really_inline void check_utf8_bytes(const simd8 input, + const simd8 prev_input) { + // Flip prev1...prev3 so we can easily determine if they are 2+, 3+ or 4+ + // lead bytes (2, 3, 4-byte leads become large positive numbers instead of + // small negative numbers) + simd8 prev1 = input.prev<1>(prev_input); + this->error |= check_special_cases(input, prev1); + } + + simdutf_really_inline size_t convert(const char *in, size_t size, + char *latin1_output) { + size_t pos = 0; + char *start{latin1_output}; + // In the worst case, we have the haswell kernel which can cause an overflow + // of 8 bytes when calling convert_masked_utf8_to_latin1. If you skip the + // last 16 bytes, and if the data is valid, then it is entirely safe because + // 16 UTF-8 bytes generate much more than 8 bytes. However, you cannot + // generally assume that you have valid UTF-8 input, so we are going to go + // back from the end counting 16 leading bytes, to give us a good margin. + size_t leading_byte = 0; + size_t margin = size; + for (; margin > 0 && leading_byte < 16; margin--) { + leading_byte += (int8_t(in[margin - 1]) > + -65); // twos complement of -65 is 1011 1111 ... + } + // If the input is long enough, then we have that margin-1 is the eight last + // leading byte. + const size_t safety_margin = size - margin + 1; // to avoid overruns! + while (pos + 64 + safety_margin <= size) { + simd8x64 input(reinterpret_cast(in + pos)); + if (input.is_ascii()) { + input.store((int8_t *)latin1_output); + latin1_output += 64; + pos += 64; + } else { + // you might think that a for-loop would work, but under Visual Studio, + // it is not good enough. + static_assert( + (simd8x64::NUM_CHUNKS == 2) || + (simd8x64::NUM_CHUNKS == 4), + "We support either two or four chunks per 64-byte block."); + auto zero = simd8{uint8_t(0)}; + if (simd8x64::NUM_CHUNKS == 2) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + } else if (simd8x64::NUM_CHUNKS == 4) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + this->check_utf8_bytes(input.chunks[2], input.chunks[1]); + this->check_utf8_bytes(input.chunks[3], input.chunks[2]); + } + uint64_t utf8_continuation_mask = + input.lt(-65 + 1); // -64 is 1100 0000 in twos complement. Note: in + // this case, we also have ASCII to account for. + if (utf8_continuation_mask & 1) { + return 0; // error + } + uint64_t utf8_leading_mask = ~utf8_continuation_mask; + uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; + // We process in blocks of up to 12 bytes except possibly + // for fast paths which may process up to 16 bytes. For the + // slow path to work, we should have at least 12 input bytes left. + size_t max_starting_point = (pos + 64) - 12; + // Next loop is going to run at least five times. + while (pos < max_starting_point) { + // Performance note: our ability to compute 'consumed' and + // then shift and recompute is critical. If there is a + // latency of, say, 4 cycles on getting 'consumed', then + // the inner loop might have a total latency of about 6 cycles. + // Yet we process between 6 to 12 inputs bytes, thus we get + // a speed limit between 1 cycle/byte and 0.5 cycle/byte + // for this section of the code. Hence, there is a limit + // to how much we can further increase this latency before + // it seriously harms performance. + size_t consumed = convert_masked_utf8_to_latin1( + in + pos, utf8_end_of_code_point_mask, latin1_output); + pos += consumed; + utf8_end_of_code_point_mask >>= consumed; + } + // At this point there may remain between 0 and 12 bytes in the + // 64-byte block. These bytes will be processed again. So we have an + // 80% efficiency (in the worst case). In practice we expect an + // 85% to 90% efficiency. + } + } + if (errors()) { + return 0; + } + if (pos < size) { + size_t howmany = + scalar::utf8_to_latin1::convert(in + pos, size - pos, latin1_output); + if (howmany == 0) { + return 0; + } + latin1_output += howmany; + } + return latin1_output - start; + } + + simdutf_really_inline result convert_with_errors(const char *in, size_t size, + char *latin1_output) { + size_t pos = 0; + char *start{latin1_output}; + // In the worst case, we have the haswell kernel which can cause an overflow + // of 8 bytes when calling convert_masked_utf8_to_latin1. If you skip the + // last 16 bytes, and if the data is valid, then it is entirely safe because + // 16 UTF-8 bytes generate much more than 8 bytes. However, you cannot + // generally assume that you have valid UTF-8 input, so we are going to go + // back from the end counting 8 leading bytes, to give us a good margin. + size_t leading_byte = 0; + size_t margin = size; + for (; margin > 0 && leading_byte < 8; margin--) { + leading_byte += (int8_t(in[margin - 1]) > -65); + } + // If the input is long enough, then we have that margin-1 is the eight last + // leading byte. + const size_t safety_margin = size - margin + 1; // to avoid overruns! + while (pos + 64 + safety_margin <= size) { + simd8x64 input(reinterpret_cast(in + pos)); + if (input.is_ascii()) { + input.store((int8_t *)latin1_output); + latin1_output += 64; + pos += 64; + } else { + // you might think that a for-loop would work, but under Visual Studio, + // it is not good enough. + static_assert( + (simd8x64::NUM_CHUNKS == 2) || + (simd8x64::NUM_CHUNKS == 4), + "We support either two or four chunks per 64-byte block."); + auto zero = simd8{uint8_t(0)}; + if (simd8x64::NUM_CHUNKS == 2) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + } else if (simd8x64::NUM_CHUNKS == 4) { + this->check_utf8_bytes(input.chunks[0], zero); + this->check_utf8_bytes(input.chunks[1], input.chunks[0]); + this->check_utf8_bytes(input.chunks[2], input.chunks[1]); + this->check_utf8_bytes(input.chunks[3], input.chunks[2]); + } + if (errors()) { + // rewind_and_convert_with_errors will seek a potential error from + // in+pos onward, with the ability to go back up to pos bytes, and + // read size-pos bytes forward. + result res = scalar::utf8_to_latin1::rewind_and_convert_with_errors( + pos, in + pos, size - pos, latin1_output); + res.count += pos; + return res; + } + uint64_t utf8_continuation_mask = input.lt(-65 + 1); + uint64_t utf8_leading_mask = ~utf8_continuation_mask; + uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; + // We process in blocks of up to 12 bytes except possibly + // for fast paths which may process up to 16 bytes. For the + // slow path to work, we should have at least 12 input bytes left. + size_t max_starting_point = (pos + 64) - 12; + // Next loop is going to run at least five times. + while (pos < max_starting_point) { + // Performance note: our ability to compute 'consumed' and + // then shift and recompute is critical. If there is a + // latency of, say, 4 cycles on getting 'consumed', then + // the inner loop might have a total latency of about 6 cycles. + // Yet we process between 6 to 12 inputs bytes, thus we get + // a speed limit between 1 cycle/byte and 0.5 cycle/byte + // for this section of the code. Hence, there is a limit + // to how much we can further increase this latency before + // it seriously harms performance. + size_t consumed = convert_masked_utf8_to_latin1( + in + pos, utf8_end_of_code_point_mask, latin1_output); + pos += consumed; + utf8_end_of_code_point_mask >>= consumed; + } + // At this point there may remain between 0 and 12 bytes in the + // 64-byte block. These bytes will be processed again. So we have an + // 80% efficiency (in the worst case). In practice we expect an + // 85% to 90% efficiency. + } + } + if (errors()) { + // rewind_and_convert_with_errors will seek a potential error from in+pos + // onward, with the ability to go back up to pos bytes, and read size-pos + // bytes forward. + result res = scalar::utf8_to_latin1::rewind_and_convert_with_errors( + pos, in + pos, size - pos, latin1_output); + res.count += pos; + return res; + } + if (pos < size) { + // rewind_and_convert_with_errors will seek a potential error from in+pos + // onward, with the ability to go back up to pos bytes, and read size-pos + // bytes forward. + result res = scalar::utf8_to_latin1::rewind_and_convert_with_errors( + pos, in + pos, size - pos, latin1_output); + if (res.error) { // In case of error, we want the error position + res.count += pos; + return res; + } else { // In case of success, we want the number of word written + latin1_output += res.count; + } + } + return result(error_code::SUCCESS, latin1_output - start); + } + + simdutf_really_inline bool errors() const { + return this->error.any_bits_set_anywhere(); + } + +}; // struct utf8_checker +} // namespace utf8_to_latin1 +} // unnamed namespace +} // namespace lasx +} // namespace simdutf +/* end file src/generic/utf8_to_latin1/utf8_to_latin1.h */ +/* begin file src/generic/utf8_to_latin1/valid_utf8_to_latin1.h */ + +namespace simdutf { +namespace lasx { +namespace { +namespace utf8_to_latin1 { +using namespace simd; + +simdutf_really_inline size_t convert_valid(const char *in, size_t size, + char *latin1_output) { + size_t pos = 0; + char *start{latin1_output}; + // In the worst case, we have the haswell kernel which can cause an overflow + // of 8 bytes when calling convert_masked_utf8_to_latin1. If you skip the last + // 16 bytes, and if the data is valid, then it is entirely safe because 16 + // UTF-8 bytes generate much more than 8 bytes. However, you cannot generally + // assume that you have valid UTF-8 input, so we are going to go back from the + // end counting 8 leading bytes, to give us a good margin. + size_t leading_byte = 0; + size_t margin = size; + for (; margin > 0 && leading_byte < 8; margin--) { + leading_byte += (int8_t(in[margin - 1]) > + -65); // twos complement of -65 is 1011 1111 ... + } + // If the input is long enough, then we have that margin-1 is the eight last + // leading byte. + const size_t safety_margin = size - margin + 1; // to avoid overruns! + while (pos + 64 + safety_margin <= size) { + simd8x64 input(reinterpret_cast(in + pos)); + if (input.is_ascii()) { + input.store((int8_t *)latin1_output); + latin1_output += 64; + pos += 64; + } else { + // you might think that a for-loop would work, but under Visual Studio, it + // is not good enough. + uint64_t utf8_continuation_mask = + input.lt(-65 + 1); // -64 is 1100 0000 in twos complement. Note: in + // this case, we also have ASCII to account for. + uint64_t utf8_leading_mask = ~utf8_continuation_mask; + uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; + // We process in blocks of up to 12 bytes except possibly + // for fast paths which may process up to 16 bytes. For the + // slow path to work, we should have at least 12 input bytes left. + size_t max_starting_point = (pos + 64) - 12; + // Next loop is going to run at least five times. + while (pos < max_starting_point) { + // Performance note: our ability to compute 'consumed' and + // then shift and recompute is critical. If there is a + // latency of, say, 4 cycles on getting 'consumed', then + // the inner loop might have a total latency of about 6 cycles. + // Yet we process between 6 to 12 inputs bytes, thus we get + // a speed limit between 1 cycle/byte and 0.5 cycle/byte + // for this section of the code. Hence, there is a limit + // to how much we can further increase this latency before + // it seriously harms performance. + size_t consumed = convert_masked_utf8_to_latin1( + in + pos, utf8_end_of_code_point_mask, latin1_output); + pos += consumed; + utf8_end_of_code_point_mask >>= consumed; + } + // At this point there may remain between 0 and 12 bytes in the + // 64-byte block. These bytes will be processed again. So we have an + // 80% efficiency (in the worst case). In practice we expect an + // 85% to 90% efficiency. + } + } + if (pos < size) { + size_t howmany = scalar::utf8_to_latin1::convert_valid(in + pos, size - pos, + latin1_output); + latin1_output += howmany; + } + return latin1_output - start; +} + +} // namespace utf8_to_latin1 +} // namespace +} // namespace lasx +} // namespace simdutf + // namespace simdutf +/* end file src/generic/utf8_to_latin1/valid_utf8_to_latin1.h */ // transcoding from UTF-8 to UTF-16 /* begin file src/generic/utf8_to_utf16/valid_utf8_to_utf16.h */ namespace simdutf { -namespace westmere { +namespace lasx { namespace { namespace utf8_to_utf16 { @@ -38890,13 +54791,13 @@ simdutf_warn_unused size_t convert_valid(const char *input, size_t size, } // namespace utf8_to_utf16 } // unnamed namespace -} // namespace westmere +} // namespace lasx } // namespace simdutf /* end file src/generic/utf8_to_utf16/valid_utf8_to_utf16.h */ /* begin file src/generic/utf8_to_utf16/utf8_to_utf16.h */ namespace simdutf { -namespace westmere { +namespace lasx { namespace { namespace utf8_to_utf16 { using namespace simd; @@ -39225,14 +55126,14 @@ struct validating_transcoder { }; // struct utf8_checker } // namespace utf8_to_utf16 } // unnamed namespace -} // namespace westmere +} // namespace lasx } // namespace simdutf /* end file src/generic/utf8_to_utf16/utf8_to_utf16.h */ // transcoding from UTF-8 to UTF-32 /* begin file src/generic/utf8_to_utf32/valid_utf8_to_utf32.h */ namespace simdutf { -namespace westmere { +namespace lasx { namespace { namespace utf8_to_utf32 { @@ -39271,13 +55172,13 @@ simdutf_warn_unused size_t convert_valid(const char *input, size_t size, } // namespace utf8_to_utf32 } // unnamed namespace -} // namespace westmere +} // namespace lasx } // namespace simdutf /* end file src/generic/utf8_to_utf32/valid_utf8_to_utf32.h */ /* begin file src/generic/utf8_to_utf32/utf8_to_utf32.h */ namespace simdutf { -namespace westmere { +namespace lasx { namespace { namespace utf8_to_utf32 { using namespace simd; @@ -39592,14 +55493,16 @@ struct validating_transcoder { }; // struct utf8_checker } // namespace utf8_to_utf32 } // unnamed namespace -} // namespace westmere +} // namespace lasx } // namespace simdutf /* end file src/generic/utf8_to_utf32/utf8_to_utf32.h */ + + // other functions /* begin file src/generic/utf8.h */ namespace simdutf { -namespace westmere { +namespace lasx { namespace { namespace utf8 { @@ -39634,12 +55537,12 @@ simdutf_really_inline size_t utf16_length_from_utf8(const char *in, } } // namespace utf8 } // unnamed namespace -} // namespace westmere +} // namespace lasx } // namespace simdutf /* end file src/generic/utf8.h */ /* begin file src/generic/utf16.h */ namespace simdutf { -namespace westmere { +namespace lasx { namespace { namespace utf16 { @@ -39709,414 +55612,15 @@ change_endianness_utf16(const char16_t *in, size_t size, char16_t *output) { } // namespace utf16 } // unnamed namespace -} // namespace westmere +} // namespace lasx } // namespace simdutf /* end file src/generic/utf16.h */ -// transcoding from UTF-8 to Latin 1 -/* begin file src/generic/utf8_to_latin1/utf8_to_latin1.h */ - -namespace simdutf { -namespace westmere { -namespace { -namespace utf8_to_latin1 { -using namespace simd; - -simdutf_really_inline simd8 -check_special_cases(const simd8 input, const simd8 prev1) { - // For UTF-8 to Latin 1, we can allow any ASCII character, and any - // continuation byte, but the non-ASCII leading bytes must be 0b11000011 or - // 0b11000010 and nothing else. - // - // Bit 0 = Too Short (lead byte/ASCII followed by lead byte/ASCII) - // Bit 1 = Too Long (ASCII followed by continuation) - // Bit 2 = Overlong 3-byte - // Bit 4 = Surrogate - // Bit 5 = Overlong 2-byte - // Bit 7 = Two Continuations - constexpr const uint8_t TOO_SHORT = 1 << 0; // 11______ 0_______ - // 11______ 11______ - constexpr const uint8_t TOO_LONG = 1 << 1; // 0_______ 10______ - constexpr const uint8_t OVERLONG_3 = 1 << 2; // 11100000 100_____ - constexpr const uint8_t SURROGATE = 1 << 4; // 11101101 101_____ - constexpr const uint8_t OVERLONG_2 = 1 << 5; // 1100000_ 10______ - constexpr const uint8_t TWO_CONTS = 1 << 7; // 10______ 10______ - constexpr const uint8_t TOO_LARGE = 1 << 3; // 11110100 1001____ - // 11110100 101_____ - // 11110101 1001____ - // 11110101 101_____ - // 1111011_ 1001____ - // 1111011_ 101_____ - // 11111___ 1001____ - // 11111___ 101_____ - constexpr const uint8_t TOO_LARGE_1000 = 1 << 6; - // 11110101 1000____ - // 1111011_ 1000____ - // 11111___ 1000____ - constexpr const uint8_t OVERLONG_4 = 1 << 6; // 11110000 1000____ - constexpr const uint8_t FORBIDDEN = 0xff; - - const simd8 byte_1_high = prev1.shr<4>().lookup_16( - // 0_______ ________ - TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, TOO_LONG, - TOO_LONG, - // 10______ ________ - TWO_CONTS, TWO_CONTS, TWO_CONTS, TWO_CONTS, - // 1100____ ________ - TOO_SHORT | OVERLONG_2, - // 1101____ ________ - FORBIDDEN, - // 1110____ ________ - FORBIDDEN, - // 1111____ ________ - FORBIDDEN); - constexpr const uint8_t CARRY = - TOO_SHORT | TOO_LONG | TWO_CONTS; // These all have ____ in byte 1 . - const simd8 byte_1_low = - (prev1 & 0x0F) - .lookup_16( - // ____0000 ________ - CARRY | OVERLONG_3 | OVERLONG_2 | OVERLONG_4, - // ____0001 ________ - CARRY | OVERLONG_2, - // ____001_ ________ - CARRY, CARRY, - - // ____0100 ________ - FORBIDDEN, - // ____0101 ________ - FORBIDDEN, - // ____011_ ________ - FORBIDDEN, FORBIDDEN, - - // ____1___ ________ - FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN, FORBIDDEN, - // ____1101 ________ - FORBIDDEN, FORBIDDEN, FORBIDDEN); - const simd8 byte_2_high = input.shr<4>().lookup_16( - // ________ 0_______ - TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT, - TOO_SHORT, TOO_SHORT, - - // ________ 1000____ - TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE_1000 | - OVERLONG_4, - // ________ 1001____ - TOO_LONG | OVERLONG_2 | TWO_CONTS | OVERLONG_3 | TOO_LARGE, - // ________ 101_____ - TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, - TOO_LONG | OVERLONG_2 | TWO_CONTS | SURROGATE | TOO_LARGE, - - // ________ 11______ - TOO_SHORT, TOO_SHORT, TOO_SHORT, TOO_SHORT); - return (byte_1_high & byte_1_low & byte_2_high); -} - -struct validating_transcoder { - // If this is nonzero, there has been a UTF-8 error. - simd8 error; - - validating_transcoder() : error(uint8_t(0)) {} - // - // Check whether the current bytes are valid UTF-8. - // - simdutf_really_inline void check_utf8_bytes(const simd8 input, - const simd8 prev_input) { - // Flip prev1...prev3 so we can easily determine if they are 2+, 3+ or 4+ - // lead bytes (2, 3, 4-byte leads become large positive numbers instead of - // small negative numbers) - simd8 prev1 = input.prev<1>(prev_input); - this->error |= check_special_cases(input, prev1); - } - - simdutf_really_inline size_t convert(const char *in, size_t size, - char *latin1_output) { - size_t pos = 0; - char *start{latin1_output}; - // In the worst case, we have the haswell kernel which can cause an overflow - // of 8 bytes when calling convert_masked_utf8_to_latin1. If you skip the - // last 16 bytes, and if the data is valid, then it is entirely safe because - // 16 UTF-8 bytes generate much more than 8 bytes. However, you cannot - // generally assume that you have valid UTF-8 input, so we are going to go - // back from the end counting 16 leading bytes, to give us a good margin. - size_t leading_byte = 0; - size_t margin = size; - for (; margin > 0 && leading_byte < 16; margin--) { - leading_byte += (int8_t(in[margin - 1]) > - -65); // twos complement of -65 is 1011 1111 ... - } - // If the input is long enough, then we have that margin-1 is the eight last - // leading byte. - const size_t safety_margin = size - margin + 1; // to avoid overruns! - while (pos + 64 + safety_margin <= size) { - simd8x64 input(reinterpret_cast(in + pos)); - if (input.is_ascii()) { - input.store((int8_t *)latin1_output); - latin1_output += 64; - pos += 64; - } else { - // you might think that a for-loop would work, but under Visual Studio, - // it is not good enough. - static_assert( - (simd8x64::NUM_CHUNKS == 2) || - (simd8x64::NUM_CHUNKS == 4), - "We support either two or four chunks per 64-byte block."); - auto zero = simd8{uint8_t(0)}; - if (simd8x64::NUM_CHUNKS == 2) { - this->check_utf8_bytes(input.chunks[0], zero); - this->check_utf8_bytes(input.chunks[1], input.chunks[0]); - } else if (simd8x64::NUM_CHUNKS == 4) { - this->check_utf8_bytes(input.chunks[0], zero); - this->check_utf8_bytes(input.chunks[1], input.chunks[0]); - this->check_utf8_bytes(input.chunks[2], input.chunks[1]); - this->check_utf8_bytes(input.chunks[3], input.chunks[2]); - } - uint64_t utf8_continuation_mask = - input.lt(-65 + 1); // -64 is 1100 0000 in twos complement. Note: in - // this case, we also have ASCII to account for. - uint64_t utf8_leading_mask = ~utf8_continuation_mask; - uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; - // We process in blocks of up to 12 bytes except possibly - // for fast paths which may process up to 16 bytes. For the - // slow path to work, we should have at least 12 input bytes left. - size_t max_starting_point = (pos + 64) - 12; - // Next loop is going to run at least five times. - while (pos < max_starting_point) { - // Performance note: our ability to compute 'consumed' and - // then shift and recompute is critical. If there is a - // latency of, say, 4 cycles on getting 'consumed', then - // the inner loop might have a total latency of about 6 cycles. - // Yet we process between 6 to 12 inputs bytes, thus we get - // a speed limit between 1 cycle/byte and 0.5 cycle/byte - // for this section of the code. Hence, there is a limit - // to how much we can further increase this latency before - // it seriously harms performance. - size_t consumed = convert_masked_utf8_to_latin1( - in + pos, utf8_end_of_code_point_mask, latin1_output); - pos += consumed; - utf8_end_of_code_point_mask >>= consumed; - } - // At this point there may remain between 0 and 12 bytes in the - // 64-byte block. These bytes will be processed again. So we have an - // 80% efficiency (in the worst case). In practice we expect an - // 85% to 90% efficiency. - } - } - if (errors()) { - return 0; - } - if (pos < size) { - size_t howmany = - scalar::utf8_to_latin1::convert(in + pos, size - pos, latin1_output); - if (howmany == 0) { - return 0; - } - latin1_output += howmany; - } - return latin1_output - start; - } - - simdutf_really_inline result convert_with_errors(const char *in, size_t size, - char *latin1_output) { - size_t pos = 0; - char *start{latin1_output}; - // In the worst case, we have the haswell kernel which can cause an overflow - // of 8 bytes when calling convert_masked_utf8_to_latin1. If you skip the - // last 16 bytes, and if the data is valid, then it is entirely safe because - // 16 UTF-8 bytes generate much more than 8 bytes. However, you cannot - // generally assume that you have valid UTF-8 input, so we are going to go - // back from the end counting 8 leading bytes, to give us a good margin. - size_t leading_byte = 0; - size_t margin = size; - for (; margin > 0 && leading_byte < 8; margin--) { - leading_byte += (int8_t(in[margin - 1]) > -65); - } - // If the input is long enough, then we have that margin-1 is the eight last - // leading byte. - const size_t safety_margin = size - margin + 1; // to avoid overruns! - while (pos + 64 + safety_margin <= size) { - simd8x64 input(reinterpret_cast(in + pos)); - if (input.is_ascii()) { - input.store((int8_t *)latin1_output); - latin1_output += 64; - pos += 64; - } else { - // you might think that a for-loop would work, but under Visual Studio, - // it is not good enough. - static_assert( - (simd8x64::NUM_CHUNKS == 2) || - (simd8x64::NUM_CHUNKS == 4), - "We support either two or four chunks per 64-byte block."); - auto zero = simd8{uint8_t(0)}; - if (simd8x64::NUM_CHUNKS == 2) { - this->check_utf8_bytes(input.chunks[0], zero); - this->check_utf8_bytes(input.chunks[1], input.chunks[0]); - } else if (simd8x64::NUM_CHUNKS == 4) { - this->check_utf8_bytes(input.chunks[0], zero); - this->check_utf8_bytes(input.chunks[1], input.chunks[0]); - this->check_utf8_bytes(input.chunks[2], input.chunks[1]); - this->check_utf8_bytes(input.chunks[3], input.chunks[2]); - } - if (errors()) { - // rewind_and_convert_with_errors will seek a potential error from - // in+pos onward, with the ability to go back up to pos bytes, and - // read size-pos bytes forward. - result res = scalar::utf8_to_latin1::rewind_and_convert_with_errors( - pos, in + pos, size - pos, latin1_output); - res.count += pos; - return res; - } - uint64_t utf8_continuation_mask = input.lt(-65 + 1); - uint64_t utf8_leading_mask = ~utf8_continuation_mask; - uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; - // We process in blocks of up to 12 bytes except possibly - // for fast paths which may process up to 16 bytes. For the - // slow path to work, we should have at least 12 input bytes left. - size_t max_starting_point = (pos + 64) - 12; - // Next loop is going to run at least five times. - while (pos < max_starting_point) { - // Performance note: our ability to compute 'consumed' and - // then shift and recompute is critical. If there is a - // latency of, say, 4 cycles on getting 'consumed', then - // the inner loop might have a total latency of about 6 cycles. - // Yet we process between 6 to 12 inputs bytes, thus we get - // a speed limit between 1 cycle/byte and 0.5 cycle/byte - // for this section of the code. Hence, there is a limit - // to how much we can further increase this latency before - // it seriously harms performance. - size_t consumed = convert_masked_utf8_to_latin1( - in + pos, utf8_end_of_code_point_mask, latin1_output); - pos += consumed; - utf8_end_of_code_point_mask >>= consumed; - } - // At this point there may remain between 0 and 12 bytes in the - // 64-byte block. These bytes will be processed again. So we have an - // 80% efficiency (in the worst case). In practice we expect an - // 85% to 90% efficiency. - } - } - if (errors()) { - // rewind_and_convert_with_errors will seek a potential error from in+pos - // onward, with the ability to go back up to pos bytes, and read size-pos - // bytes forward. - result res = scalar::utf8_to_latin1::rewind_and_convert_with_errors( - pos, in + pos, size - pos, latin1_output); - res.count += pos; - return res; - } - if (pos < size) { - // rewind_and_convert_with_errors will seek a potential error from in+pos - // onward, with the ability to go back up to pos bytes, and read size-pos - // bytes forward. - result res = scalar::utf8_to_latin1::rewind_and_convert_with_errors( - pos, in + pos, size - pos, latin1_output); - if (res.error) { // In case of error, we want the error position - res.count += pos; - return res; - } else { // In case of success, we want the number of word written - latin1_output += res.count; - } - } - return result(error_code::SUCCESS, latin1_output - start); - } - - simdutf_really_inline bool errors() const { - return this->error.any_bits_set_anywhere(); - } - -}; // struct utf8_checker -} // namespace utf8_to_latin1 -} // unnamed namespace -} // namespace westmere -} // namespace simdutf -/* end file src/generic/utf8_to_latin1/utf8_to_latin1.h */ -/* begin file src/generic/utf8_to_latin1/valid_utf8_to_latin1.h */ - -namespace simdutf { -namespace westmere { -namespace { -namespace utf8_to_latin1 { -using namespace simd; - -simdutf_really_inline size_t convert_valid(const char *in, size_t size, - char *latin1_output) { - size_t pos = 0; - char *start{latin1_output}; - // In the worst case, we have the haswell kernel which can cause an overflow - // of 8 bytes when calling convert_masked_utf8_to_latin1. If you skip the last - // 16 bytes, and if the data is valid, then it is entirely safe because 16 - // UTF-8 bytes generate much more than 8 bytes. However, you cannot generally - // assume that you have valid UTF-8 input, so we are going to go back from the - // end counting 8 leading bytes, to give us a good margin. - size_t leading_byte = 0; - size_t margin = size; - for (; margin > 0 && leading_byte < 8; margin--) { - leading_byte += (int8_t(in[margin - 1]) > - -65); // twos complement of -65 is 1011 1111 ... - } - // If the input is long enough, then we have that margin-1 is the eight last - // leading byte. - const size_t safety_margin = size - margin + 1; // to avoid overruns! - while (pos + 64 + safety_margin <= size) { - simd8x64 input(reinterpret_cast(in + pos)); - if (input.is_ascii()) { - input.store((int8_t *)latin1_output); - latin1_output += 64; - pos += 64; - } else { - // you might think that a for-loop would work, but under Visual Studio, it - // is not good enough. - uint64_t utf8_continuation_mask = - input.lt(-65 + 1); // -64 is 1100 0000 in twos complement. Note: in - // this case, we also have ASCII to account for. - uint64_t utf8_leading_mask = ~utf8_continuation_mask; - uint64_t utf8_end_of_code_point_mask = utf8_leading_mask >> 1; - // We process in blocks of up to 12 bytes except possibly - // for fast paths which may process up to 16 bytes. For the - // slow path to work, we should have at least 12 input bytes left. - size_t max_starting_point = (pos + 64) - 12; - // Next loop is going to run at least five times. - while (pos < max_starting_point) { - // Performance note: our ability to compute 'consumed' and - // then shift and recompute is critical. If there is a - // latency of, say, 4 cycles on getting 'consumed', then - // the inner loop might have a total latency of about 6 cycles. - // Yet we process between 6 to 12 inputs bytes, thus we get - // a speed limit between 1 cycle/byte and 0.5 cycle/byte - // for this section of the code. Hence, there is a limit - // to how much we can further increase this latency before - // it seriously harms performance. - size_t consumed = convert_masked_utf8_to_latin1( - in + pos, utf8_end_of_code_point_mask, latin1_output); - pos += consumed; - utf8_end_of_code_point_mask >>= consumed; - } - // At this point there may remain between 0 and 12 bytes in the - // 64-byte block. These bytes will be processed again. So we have an - // 80% efficiency (in the worst case). In practice we expect an - // 85% to 90% efficiency. - } - } - if (pos < size) { - size_t howmany = scalar::utf8_to_latin1::convert_valid(in + pos, size - pos, - latin1_output); - latin1_output += howmany; - } - return latin1_output - start; -} - -} // namespace utf8_to_latin1 -} // namespace -} // namespace westmere -} // namespace simdutf - // namespace simdutf -/* end file src/generic/utf8_to_latin1/valid_utf8_to_latin1.h */ // // Implementation-specific overrides // - namespace simdutf { -namespace westmere { +namespace lasx { simdutf_warn_unused int implementation::detect_encodings(const char *input, @@ -40147,34 +55651,32 @@ implementation::detect_encodings(const char *input, simdutf_warn_unused bool implementation::validate_utf8(const char *buf, size_t len) const noexcept { - return westmere::utf8_validation::generic_validate_utf8(buf, len); + return lasx::utf8_validation::generic_validate_utf8(buf, len); } simdutf_warn_unused result implementation::validate_utf8_with_errors( const char *buf, size_t len) const noexcept { - return westmere::utf8_validation::generic_validate_utf8_with_errors(buf, len); + return lasx::utf8_validation::generic_validate_utf8_with_errors(buf, len); } simdutf_warn_unused bool implementation::validate_ascii(const char *buf, size_t len) const noexcept { - return westmere::utf8_validation::generic_validate_ascii(buf, len); + return lasx::utf8_validation::generic_validate_ascii(buf, len); } simdutf_warn_unused result implementation::validate_ascii_with_errors( const char *buf, size_t len) const noexcept { - return westmere::utf8_validation::generic_validate_ascii_with_errors(buf, - len); + return lasx::utf8_validation::generic_validate_ascii_with_errors(buf, len); } simdutf_warn_unused bool implementation::validate_utf16le(const char16_t *buf, size_t len) const noexcept { if (simdutf_unlikely(len == 0)) { - // empty input is valid UTF-16. protect the implementation from - // handling nullptr + // empty input is valid. protected the implementation from nullptr. return true; } - const char16_t *tail = sse_validate_utf16(buf, len); + const char16_t *tail = lasx_validate_utf16(buf, len); if (tail) { return scalar::utf16::validate(tail, len - (tail - buf)); @@ -40187,11 +55689,10 @@ simdutf_warn_unused bool implementation::validate_utf16be(const char16_t *buf, size_t len) const noexcept { if (simdutf_unlikely(len == 0)) { - // empty input is valid UTF-16. protect the implementation from - // handling nullptr + // empty input is valid. protected the implementation from nullptr. return true; } - const char16_t *tail = sse_validate_utf16(buf, len); + const char16_t *tail = lasx_validate_utf16(buf, len); if (tail) { return scalar::utf16::validate(tail, len - (tail - buf)); } else { @@ -40201,7 +55702,10 @@ implementation::validate_utf16be(const char16_t *buf, simdutf_warn_unused result implementation::validate_utf16le_with_errors( const char16_t *buf, size_t len) const noexcept { - result res = sse_validate_utf16_with_errors(buf, len); + if (simdutf_unlikely(len == 0)) { + return result(error_code::SUCCESS, 0); + } + result res = lasx_validate_utf16_with_errors(buf, len); if (res.count != len) { result scalar_res = scalar::utf16::validate_with_errors( buf + res.count, len - res.count); @@ -40213,7 +55717,10 @@ simdutf_warn_unused result implementation::validate_utf16le_with_errors( simdutf_warn_unused result implementation::validate_utf16be_with_errors( const char16_t *buf, size_t len) const noexcept { - result res = sse_validate_utf16_with_errors(buf, len); + if (simdutf_unlikely(len == 0)) { + return result(error_code::SUCCESS, 0); + } + result res = lasx_validate_utf16_with_errors(buf, len); if (res.count != len) { result scalar_res = scalar::utf16::validate_with_errors( buf + res.count, len - res.count); @@ -40226,11 +55733,10 @@ simdutf_warn_unused result implementation::validate_utf16be_with_errors( simdutf_warn_unused bool implementation::validate_utf32(const char32_t *buf, size_t len) const noexcept { if (simdutf_unlikely(len == 0)) { - // empty input is valid UTF-32. protect the implementation from - // handling nullptr + // empty input is valid. protected the implementation from nullptr. return true; } - const char32_t *tail = sse_validate_utf32le(buf, len); + const char32_t *tail = lasx_validate_utf32le(buf, len); if (tail) { return scalar::utf32::validate(tail, len - (tail - buf)); } else { @@ -40240,12 +55746,10 @@ implementation::validate_utf32(const char32_t *buf, size_t len) const noexcept { simdutf_warn_unused result implementation::validate_utf32_with_errors( const char32_t *buf, size_t len) const noexcept { - if (len == 0) { - // empty input is valid UTF-32. protect the implementation from - // handling nullptr + if (simdutf_unlikely(len == 0)) { return result(error_code::SUCCESS, 0); } - result res = sse_validate_utf32le_with_errors(buf, len); + result res = lasx_validate_utf32le_with_errors(buf, len); if (res.count != len) { result scalar_res = scalar::utf32::validate_with_errors(buf + res.count, len - res.count); @@ -40257,9 +55761,8 @@ simdutf_warn_unused result implementation::validate_utf32_with_errors( simdutf_warn_unused size_t implementation::convert_latin1_to_utf8( const char *buf, size_t len, char *utf8_output) const noexcept { - std::pair ret = - sse_convert_latin1_to_utf8(buf, len, utf8_output); + lasx_convert_latin1_to_utf8(buf, len, utf8_output); size_t converted_chars = ret.second - utf8_output; if (ret.first != buf + len) { @@ -40267,25 +55770,18 @@ simdutf_warn_unused size_t implementation::convert_latin1_to_utf8( ret.first, len - (ret.first - buf), ret.second); converted_chars += scalar_converted_chars; } - return converted_chars; } simdutf_warn_unused size_t implementation::convert_latin1_to_utf16le( const char *buf, size_t len, char16_t *utf16_output) const noexcept { std::pair ret = - sse_convert_latin1_to_utf16(buf, len, utf16_output); - if (ret.first == nullptr) { - return 0; - } + lasx_convert_latin1_to_utf16le(buf, len, utf16_output); size_t converted_chars = ret.second - utf16_output; if (ret.first != buf + len) { const size_t scalar_converted_chars = scalar::latin1_to_utf16::convert( ret.first, len - (ret.first - buf), ret.second); - if (scalar_converted_chars == 0) { - return 0; - } converted_chars += scalar_converted_chars; } return converted_chars; @@ -40294,18 +55790,12 @@ simdutf_warn_unused size_t implementation::convert_latin1_to_utf16le( simdutf_warn_unused size_t implementation::convert_latin1_to_utf16be( const char *buf, size_t len, char16_t *utf16_output) const noexcept { std::pair ret = - sse_convert_latin1_to_utf16(buf, len, utf16_output); - if (ret.first == nullptr) { - return 0; - } + lasx_convert_latin1_to_utf16be(buf, len, utf16_output); size_t converted_chars = ret.second - utf16_output; if (ret.first != buf + len) { const size_t scalar_converted_chars = scalar::latin1_to_utf16::convert( ret.first, len - (ret.first - buf), ret.second); - if (scalar_converted_chars == 0) { - return 0; - } converted_chars += scalar_converted_chars; } return converted_chars; @@ -40314,17 +55804,11 @@ simdutf_warn_unused size_t implementation::convert_latin1_to_utf16be( simdutf_warn_unused size_t implementation::convert_latin1_to_utf32( const char *buf, size_t len, char32_t *utf32_output) const noexcept { std::pair ret = - sse_convert_latin1_to_utf32(buf, len, utf32_output); - if (ret.first == nullptr) { - return 0; - } + lasx_convert_latin1_to_utf32(buf, len, utf32_output); size_t converted_chars = ret.second - utf32_output; if (ret.first != buf + len) { const size_t scalar_converted_chars = scalar::latin1_to_utf32::convert( ret.first, len - (ret.first - buf), ret.second); - if (scalar_converted_chars == 0) { - return 0; - } converted_chars += scalar_converted_chars; } return converted_chars; @@ -40332,19 +55816,117 @@ simdutf_warn_unused size_t implementation::convert_latin1_to_utf32( simdutf_warn_unused size_t implementation::convert_utf8_to_latin1( const char *buf, size_t len, char *latin1_output) const noexcept { + size_t pos = 0; + char *output_start{latin1_output}; + // Performance degradation when memory address is not 32-byte aligned + while (((uint64_t)latin1_output & 0x1F) && pos < len) { + if (buf[pos] & 0x80) { + if (pos + 1 >= len) + return 0; + if ((buf[pos] & 0b11100000) == 0b11000000) { + if ((buf[pos + 1] & 0b11000000) != 0b10000000) + return 0; + uint32_t code_point = + (buf[pos] & 0b00011111) << 6 | (buf[pos + 1] & 0b00111111); + if (code_point < 0x80 || 0xFF < code_point) { + return 0; + } + *latin1_output++ = char(code_point); + pos += 2; + } else { + return 0; + } + } else { + *latin1_output++ = char(buf[pos]); + pos++; + } + } + size_t convert_size = latin1_output - output_start; + if (pos == len) + return convert_size; utf8_to_latin1::validating_transcoder converter; - return converter.convert(buf, len, latin1_output); + size_t convert_result = + converter.convert(buf + pos, len - pos, latin1_output); + return convert_result ? convert_size + convert_result : 0; } simdutf_warn_unused result implementation::convert_utf8_to_latin1_with_errors( const char *buf, size_t len, char *latin1_output) const noexcept { + size_t pos = 0; + char *output_start{latin1_output}; + // Performance degradation when memory address is not 32-byte aligned + while (((uint64_t)latin1_output & 0x1F) && pos < len) { + if (buf[pos] & 0x80) { + if ((buf[pos] & 0b11100000) == 0b11000000) { + if (pos + 1 >= len) + return result(error_code::TOO_SHORT, pos); + if ((buf[pos + 1] & 0b11000000) != 0b10000000) + return result(error_code::TOO_SHORT, pos); + uint32_t code_point = + (buf[pos] & 0b00011111) << 6 | (buf[pos + 1] & 0b00111111); + if (code_point < 0x80) + return result(error_code::OVERLONG, pos); + if (0xFF < code_point) + return result(error_code::TOO_LARGE, pos); + *latin1_output++ = char(code_point); + pos += 2; + } else if ((buf[pos] & 0b11110000) == 0b11100000) { + return result(error_code::TOO_LARGE, pos); + } else if ((buf[pos] & 0b11111000) == 0b11110000) { + return result(error_code::TOO_LARGE, pos); + } else { + if ((buf[pos] & 0b11000000) == 0b10000000) { + return result(error_code::TOO_LONG, pos); + } + return result(error_code::HEADER_BITS, pos); + } + } else { + *latin1_output++ = char(buf[pos]); + pos++; + } + } + size_t convert_size = latin1_output - output_start; + if (pos == len) + return result(error_code::SUCCESS, convert_size); + utf8_to_latin1::validating_transcoder converter; - return converter.convert_with_errors(buf, len, latin1_output); + result res = + converter.convert_with_errors(buf + pos, len - pos, latin1_output); + return res.error ? result(res.error, res.count + pos) + : result(res.error, res.count + convert_size); } simdutf_warn_unused size_t implementation::convert_valid_utf8_to_latin1( const char *buf, size_t len, char *latin1_output) const noexcept { - return westmere::utf8_to_latin1::convert_valid(buf, len, latin1_output); + size_t pos = 0; + char *output_start{latin1_output}; + // Performance degradation when memory address is not 32-byte aligned + while (((uint64_t)latin1_output & 0x1F) && pos < len) { + if (buf[pos] & 0x80) { + if (pos + 1 >= len) + break; + if ((buf[pos] & 0b11100000) == 0b11000000) { + if ((buf[pos + 1] & 0b11000000) != 0b10000000) + return 0; + uint32_t code_point = + (buf[pos] & 0b00011111) << 6 | (buf[pos + 1] & 0b00111111); + *latin1_output++ = char(code_point); + pos += 2; + } else { + return 0; + } + } else { + *latin1_output++ = char(buf[pos]); + pos++; + } + } + size_t convert_size = latin1_output - output_start; + if (pos == len) + return convert_size; + + size_t convert_result = + lasx::utf8_to_latin1::convert_valid(buf + pos, len - pos, latin1_output); + return convert_result ? convert_size + convert_result : 0; } simdutf_warn_unused size_t implementation::convert_utf8_to_utf16le( @@ -40404,7 +55986,7 @@ simdutf_warn_unused size_t implementation::convert_valid_utf8_to_utf32( simdutf_warn_unused size_t implementation::convert_utf16le_to_latin1( const char16_t *buf, size_t len, char *latin1_output) const noexcept { std::pair ret = - sse_convert_utf16_to_latin1(buf, len, latin1_output); + lasx_convert_utf16_to_latin1(buf, len, latin1_output); if (ret.first == nullptr) { return 0; } @@ -40425,7 +56007,7 @@ simdutf_warn_unused size_t implementation::convert_utf16le_to_latin1( simdutf_warn_unused size_t implementation::convert_utf16be_to_latin1( const char16_t *buf, size_t len, char *latin1_output) const noexcept { std::pair ret = - sse_convert_utf16_to_latin1(buf, len, latin1_output); + lasx_convert_utf16_to_latin1(buf, len, latin1_output); if (ret.first == nullptr) { return 0; } @@ -40447,7 +56029,7 @@ simdutf_warn_unused result implementation::convert_utf16le_to_latin1_with_errors( const char16_t *buf, size_t len, char *latin1_output) const noexcept { std::pair ret = - sse_convert_utf16_to_latin1_with_errors( + lasx_convert_utf16_to_latin1_with_errors( buf, len, latin1_output); if (ret.first.error) { return ret.first; @@ -40474,8 +56056,8 @@ simdutf_warn_unused result implementation::convert_utf16be_to_latin1_with_errors( const char16_t *buf, size_t len, char *latin1_output) const noexcept { std::pair ret = - sse_convert_utf16_to_latin1_with_errors(buf, len, - latin1_output); + lasx_convert_utf16_to_latin1_with_errors(buf, len, + latin1_output); if (ret.first.error) { return ret.first; } // Can return directly since scalar fallback already found correct @@ -40499,20 +56081,20 @@ implementation::convert_utf16be_to_latin1_with_errors( simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_latin1( const char16_t *buf, size_t len, char *latin1_output) const noexcept { - // optimization opportunity: we could provide an optimized function. + // optimization opportunity: implement a custom function. return convert_utf16be_to_latin1(buf, len, latin1_output); } simdutf_warn_unused size_t implementation::convert_valid_utf16le_to_latin1( const char16_t *buf, size_t len, char *latin1_output) const noexcept { - // optimization opportunity: we could provide an optimized function. + // optimization opportunity: implement a custom function. return convert_utf16le_to_latin1(buf, len, latin1_output); } simdutf_warn_unused size_t implementation::convert_utf16le_to_utf8( const char16_t *buf, size_t len, char *utf8_output) const noexcept { std::pair ret = - sse_convert_utf16_to_utf8(buf, len, utf8_output); + lasx_convert_utf16_to_utf8(buf, len, utf8_output); if (ret.first == nullptr) { return 0; } @@ -40532,7 +56114,7 @@ simdutf_warn_unused size_t implementation::convert_utf16le_to_utf8( simdutf_warn_unused size_t implementation::convert_utf16be_to_utf8( const char16_t *buf, size_t len, char *utf8_output) const noexcept { std::pair ret = - sse_convert_utf16_to_utf8(buf, len, utf8_output); + lasx_convert_utf16_to_utf8(buf, len, utf8_output); if (ret.first == nullptr) { return 0; } @@ -40554,8 +56136,8 @@ simdutf_warn_unused result implementation::convert_utf16le_to_utf8_with_errors( // ret.first.count is always the position in the buffer, not the number of // code units written even if finished std::pair ret = - westmere::sse_convert_utf16_to_utf8_with_errors( - buf, len, utf8_output); + lasx_convert_utf16_to_utf8_with_errors(buf, len, + utf8_output); if (ret.first.error) { return ret.first; } // Can return directly since scalar fallback already found correct @@ -40582,8 +56164,8 @@ simdutf_warn_unused result implementation::convert_utf16be_to_utf8_with_errors( // ret.first.count is always the position in the buffer, not the number of // code units written even if finished std::pair ret = - westmere::sse_convert_utf16_to_utf8_with_errors( - buf, len, utf8_output); + lasx_convert_utf16_to_utf8_with_errors(buf, len, + utf8_output); if (ret.first.error) { return ret.first; } // Can return directly since scalar fallback already found correct @@ -40615,59 +56197,13 @@ simdutf_warn_unused size_t implementation::convert_valid_utf16be_to_utf8( return convert_utf16be_to_utf8(buf, len, utf8_output); } -simdutf_warn_unused size_t implementation::convert_utf32_to_latin1( - const char32_t *buf, size_t len, char *latin1_output) const noexcept { - std::pair ret = - sse_convert_utf32_to_latin1(buf, len, latin1_output); - if (ret.first == nullptr) { - return 0; - } - size_t saved_bytes = ret.second - latin1_output; - // if (ret.first != buf + len) { - if (ret.first < buf + len) { - const size_t scalar_saved_bytes = scalar::utf32_to_latin1::convert( - ret.first, len - (ret.first - buf), ret.second); - if (scalar_saved_bytes == 0) { - return 0; - } - saved_bytes += scalar_saved_bytes; - } - return saved_bytes; -} - -simdutf_warn_unused result implementation::convert_utf32_to_latin1_with_errors( - const char32_t *buf, size_t len, char *latin1_output) const noexcept { - // ret.first.count is always the position in the buffer, not the number of - // code units written even if finished - std::pair ret = - westmere::sse_convert_utf32_to_latin1_with_errors(buf, len, - latin1_output); - if (ret.first.count != len) { - result scalar_res = scalar::utf32_to_latin1::convert_with_errors( - buf + ret.first.count, len - ret.first.count, ret.second); - if (scalar_res.error) { - scalar_res.count += ret.first.count; - return scalar_res; - } else { - ret.second += scalar_res.count; - } - } - ret.first.count = - ret.second - - latin1_output; // Set count to the number of 8-bit code units written - return ret.first; -} - -simdutf_warn_unused size_t implementation::convert_valid_utf32_to_latin1( - const char32_t *buf, size_t len, char *latin1_output) const noexcept { - // optimization opportunity: we could provide an optimized function. - return convert_utf32_to_latin1(buf, len, latin1_output); -} - simdutf_warn_unused size_t implementation::convert_utf32_to_utf8( const char32_t *buf, size_t len, char *utf8_output) const noexcept { + if (simdutf_unlikely(len == 0)) { + return 0; + } std::pair ret = - sse_convert_utf32_to_utf8(buf, len, utf8_output); + lasx_convert_utf32_to_utf8(buf, len, utf8_output); if (ret.first == nullptr) { return 0; } @@ -40685,10 +56221,13 @@ simdutf_warn_unused size_t implementation::convert_utf32_to_utf8( simdutf_warn_unused result implementation::convert_utf32_to_utf8_with_errors( const char32_t *buf, size_t len, char *utf8_output) const noexcept { + if (simdutf_unlikely(len == 0)) { + return result(error_code::SUCCESS, 0); + } // ret.first.count is always the position in the buffer, not the number of // code units written even if finished std::pair ret = - westmere::sse_convert_utf32_to_utf8_with_errors(buf, len, utf8_output); + lasx_convert_utf32_to_utf8_with_errors(buf, len, utf8_output); if (ret.first.count != len) { result scalar_res = scalar::utf32_to_utf8::convert_with_errors( buf + ret.first.count, len - ret.first.count, ret.second); @@ -40708,7 +56247,7 @@ simdutf_warn_unused result implementation::convert_utf32_to_utf8_with_errors( simdutf_warn_unused size_t implementation::convert_utf16le_to_utf32( const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { std::pair ret = - sse_convert_utf16_to_utf32(buf, len, utf32_output); + lasx_convert_utf16_to_utf32(buf, len, utf32_output); if (ret.first == nullptr) { return 0; } @@ -40728,7 +56267,7 @@ simdutf_warn_unused size_t implementation::convert_utf16le_to_utf32( simdutf_warn_unused size_t implementation::convert_utf16be_to_utf32( const char16_t *buf, size_t len, char32_t *utf32_output) const noexcept { std::pair ret = - sse_convert_utf16_to_utf32(buf, len, utf32_output); + lasx_convert_utf16_to_utf32(buf, len, utf32_output); if (ret.first == nullptr) { return 0; } @@ -40750,8 +56289,8 @@ simdutf_warn_unused result implementation::convert_utf16le_to_utf32_with_errors( // ret.first.count is always the position in the buffer, not the number of // code units written even if finished std::pair ret = - westmere::sse_convert_utf16_to_utf32_with_errors( - buf, len, utf32_output); + lasx_convert_utf16_to_utf32_with_errors(buf, len, + utf32_output); if (ret.first.error) { return ret.first; } // Can return directly since scalar fallback already found correct @@ -40778,8 +56317,8 @@ simdutf_warn_unused result implementation::convert_utf16be_to_utf32_with_errors( // ret.first.count is always the position in the buffer, not the number of // code units written even if finished std::pair ret = - westmere::sse_convert_utf16_to_utf32_with_errors( - buf, len, utf32_output); + lasx_convert_utf16_to_utf32_with_errors(buf, len, + utf32_output); if (ret.first.error) { return ret.first; } // Can return directly since scalar fallback already found correct @@ -40801,15 +56340,77 @@ simdutf_warn_unused result implementation::convert_utf16be_to_utf32_with_errors( return ret.first; } +simdutf_warn_unused size_t implementation::convert_utf32_to_latin1( + const char32_t *buf, size_t len, char *latin1_output) const noexcept { + std::pair ret = + lasx_convert_utf32_to_latin1(buf, len, latin1_output); + if (ret.first == nullptr) { + return 0; + } + size_t saved_bytes = ret.second - latin1_output; + + if (ret.first != buf + len) { + const size_t scalar_saved_bytes = scalar::utf32_to_latin1::convert( + ret.first, len - (ret.first - buf), ret.second); + if (scalar_saved_bytes == 0) { + return 0; + } + saved_bytes += scalar_saved_bytes; + } + return saved_bytes; +} + +simdutf_warn_unused result implementation::convert_utf32_to_latin1_with_errors( + const char32_t *buf, size_t len, char *latin1_output) const noexcept { + std::pair ret = + lasx_convert_utf32_to_latin1_with_errors(buf, len, latin1_output); + if (ret.first.error) { + return ret.first; + } // Can return directly since scalar fallback already found correct + // ret.first.count + if (ret.first.count != len) { // All good so far, but not finished + result scalar_res = scalar::utf32_to_latin1::convert_with_errors( + buf + ret.first.count, len - ret.first.count, ret.second); + if (scalar_res.error) { + scalar_res.count += ret.first.count; + return scalar_res; + } else { + ret.second += scalar_res.count; + } + } + ret.first.count = + ret.second - + latin1_output; // Set count to the number of 8-bit code units written + return ret.first; +} + +simdutf_warn_unused size_t implementation::convert_valid_utf32_to_latin1( + const char32_t *buf, size_t len, char *latin1_output) const noexcept { + std::pair ret = + lasx_convert_utf32_to_latin1(buf, len, latin1_output); + if (ret.first == nullptr) { + return 0; + } + size_t saved_bytes = ret.second - latin1_output; + + if (ret.first != buf + len) { + const size_t scalar_saved_bytes = scalar::utf32_to_latin1::convert_valid( + ret.first, len - (ret.first - buf), ret.second); + saved_bytes += scalar_saved_bytes; + } + return saved_bytes; +} + simdutf_warn_unused size_t implementation::convert_valid_utf32_to_utf8( const char32_t *buf, size_t len, char *utf8_output) const noexcept { + // optimization opportunity: implement a custom function. return convert_utf32_to_utf8(buf, len, utf8_output); } simdutf_warn_unused size_t implementation::convert_utf32_to_utf16le( const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { std::pair ret = - sse_convert_utf32_to_utf16(buf, len, utf16_output); + lasx_convert_utf32_to_utf16(buf, len, utf16_output); if (ret.first == nullptr) { return 0; } @@ -40823,13 +56424,14 @@ simdutf_warn_unused size_t implementation::convert_utf32_to_utf16le( } saved_bytes += scalar_saved_bytes; } + return saved_bytes; } simdutf_warn_unused size_t implementation::convert_utf32_to_utf16be( const char32_t *buf, size_t len, char16_t *utf16_output) const noexcept { std::pair ret = - sse_convert_utf32_to_utf16(buf, len, utf16_output); + lasx_convert_utf32_to_utf16(buf, len, utf16_output); if (ret.first == nullptr) { return 0; } @@ -40851,8 +56453,8 @@ simdutf_warn_unused result implementation::convert_utf32_to_utf16le_with_errors( // ret.first.count is always the position in the buffer, not the number of // code units written even if finished std::pair ret = - westmere::sse_convert_utf32_to_utf16_with_errors( - buf, len, utf16_output); + lasx_convert_utf32_to_utf16_with_errors(buf, len, + utf16_output); if (ret.first.count != len) { result scalar_res = scalar::utf32_to_utf16::convert_with_errors( @@ -40875,8 +56477,8 @@ simdutf_warn_unused result implementation::convert_utf32_to_utf16be_with_errors( // ret.first.count is always the position in the buffer, not the number of // code units written even if finished std::pair ret = - westmere::sse_convert_utf32_to_utf16_with_errors( - buf, len, utf16_output); + lasx_convert_utf32_to_utf16_with_errors(buf, len, + utf16_output); if (ret.first.count != len) { result scalar_res = scalar::utf32_to_utf16::convert_with_errors( @@ -40932,7 +56534,23 @@ simdutf_warn_unused size_t implementation::count_utf16be( simdutf_warn_unused size_t implementation::count_utf8(const char *input, size_t length) const noexcept { - return utf8::count_code_points(input, length); + size_t pos = 0; + size_t count = 0; + // Performance degradation when memory address is not 32-byte aligned + while ((((uint64_t)input + pos) & 0x1F && pos < length)) { + if (input[pos++] > -65) { + count++; + } + } + __m256i v_bf = __lasx_xvldi(0xBF); // 0b10111111 + for (; pos + 32 <= length; pos += 32) { + __m256i in = __lasx_xvld(reinterpret_cast(input + pos), 0); + __m256i utf8_count = + __lasx_xvpcnt_h(__lasx_xvmskltz_b(__lasx_xvslt_b(v_bf, in))); + count = count + __lasx_xvpickve2gr_wu(utf8_count, 0) + + __lasx_xvpickve2gr_wu(utf8_count, 4); + } + return count + scalar::utf8::count_code_points(input + pos, length - pos); } simdutf_warn_unused size_t implementation::latin1_length_from_utf8( @@ -40942,12 +56560,29 @@ simdutf_warn_unused size_t implementation::latin1_length_from_utf8( simdutf_warn_unused size_t implementation::latin1_length_from_utf16(size_t length) const noexcept { - return scalar::utf16::latin1_length_from_utf16(length); + return length; } simdutf_warn_unused size_t implementation::latin1_length_from_utf32(size_t length) const noexcept { - return scalar::utf32::latin1_length_from_utf32(length); + return length; +} + +simdutf_warn_unused size_t implementation::utf8_length_from_latin1( + const char *input, size_t length) const noexcept { + const uint8_t *data = reinterpret_cast(input); + const uint8_t *data_end = data + length; + uint64_t result = 0; + while (data + 16 < data_end) { + uint64_t two_bytes = 0; + __m128i input_vec = __lsx_vld(data, 0); + two_bytes = + __lsx_vpickve2gr_hu(__lsx_vpcnt_h(__lsx_vmskltz_b(input_vec)), 0); + result += 16 + two_bytes; + data += 16; + } + return result + scalar::latin1::utf8_length_from_latin1((const char *)data, + data_end - data); } simdutf_warn_unused size_t implementation::utf8_length_from_utf16le( @@ -40962,72 +56597,12 @@ simdutf_warn_unused size_t implementation::utf8_length_from_utf16be( simdutf_warn_unused size_t implementation::utf16_length_from_latin1(size_t length) const noexcept { - return scalar::latin1::utf16_length_from_latin1(length); + return length; } simdutf_warn_unused size_t implementation::utf32_length_from_latin1(size_t length) const noexcept { - return scalar::latin1::utf32_length_from_latin1(length); -} - -simdutf_warn_unused size_t implementation::utf8_length_from_latin1( - const char *input, size_t len) const noexcept { - const uint8_t *str = reinterpret_cast(input); - size_t answer = len / sizeof(__m128i) * sizeof(__m128i); - size_t i = 0; - if (answer >= 2048) { // long strings optimization - __m128i two_64bits = _mm_setzero_si128(); - while (i + sizeof(__m128i) <= len) { - __m128i runner = _mm_setzero_si128(); - size_t iterations = (len - i) / sizeof(__m128i); - if (iterations > 255) { - iterations = 255; - } - size_t max_i = i + iterations * sizeof(__m128i) - sizeof(__m128i); - for (; i + 4 * sizeof(__m128i) <= max_i; i += 4 * sizeof(__m128i)) { - __m128i input1 = _mm_loadu_si128((const __m128i *)(str + i)); - __m128i input2 = - _mm_loadu_si128((const __m128i *)(str + i + sizeof(__m128i))); - __m128i input3 = - _mm_loadu_si128((const __m128i *)(str + i + 2 * sizeof(__m128i))); - __m128i input4 = - _mm_loadu_si128((const __m128i *)(str + i + 3 * sizeof(__m128i))); - __m128i input12 = - _mm_add_epi8(_mm_cmpgt_epi8(_mm_setzero_si128(), input1), - _mm_cmpgt_epi8(_mm_setzero_si128(), input2)); - __m128i input34 = - _mm_add_epi8(_mm_cmpgt_epi8(_mm_setzero_si128(), input3), - _mm_cmpgt_epi8(_mm_setzero_si128(), input4)); - __m128i input1234 = _mm_add_epi8(input12, input34); - runner = _mm_sub_epi8(runner, input1234); - } - for (; i <= max_i; i += sizeof(__m128i)) { - __m128i more_input = _mm_loadu_si128((const __m128i *)(str + i)); - runner = _mm_sub_epi8(runner, - _mm_cmpgt_epi8(_mm_setzero_si128(), more_input)); - } - two_64bits = - _mm_add_epi64(two_64bits, _mm_sad_epu8(runner, _mm_setzero_si128())); - } - answer += - _mm_extract_epi64(two_64bits, 0) + _mm_extract_epi64(two_64bits, 1); - } else if (answer > 0) { // short string optimization - for (; i + 2 * sizeof(__m128i) <= len; i += 2 * sizeof(__m128i)) { - __m128i latin = _mm_loadu_si128((const __m128i *)(input + i)); - uint16_t non_ascii = (uint16_t)_mm_movemask_epi8(latin); - answer += count_ones(non_ascii); - latin = _mm_loadu_si128((const __m128i *)(input + i) + 1); - non_ascii = (uint16_t)_mm_movemask_epi8(latin); - answer += count_ones(non_ascii); - } - for (; i + sizeof(__m128i) <= len; i += sizeof(__m128i)) { - __m128i latin = _mm_loadu_si128((const __m128i *)(input + i)); - uint16_t non_ascii = (uint16_t)_mm_movemask_epi8(latin); - answer += count_ones(non_ascii); - } - } - return answer + scalar::latin1::utf8_length_from_latin1( - reinterpret_cast(str + i), len - i); + return length; } simdutf_warn_unused size_t implementation::utf32_length_from_utf16le( @@ -41047,35 +56622,35 @@ simdutf_warn_unused size_t implementation::utf16_length_from_utf8( simdutf_warn_unused size_t implementation::utf8_length_from_utf32( const char32_t *input, size_t length) const noexcept { - const __m128i v_00000000 = _mm_setzero_si128(); - const __m128i v_ffffff80 = _mm_set1_epi32((uint32_t)0xffffff80); - const __m128i v_fffff800 = _mm_set1_epi32((uint32_t)0xfffff800); - const __m128i v_ffff0000 = _mm_set1_epi32((uint32_t)0xffff0000); + __m256i v_80 = __lasx_xvrepli_w(0x80); /*0x00000080*/ + __m256i v_800 = __lasx_xvldi(-3832); /*0x00000800*/ + __m256i v_10000 = __lasx_xvldi(-3583); /*0x00010000*/ size_t pos = 0; size_t count = 0; - for (; pos + 4 <= length; pos += 4) { - __m128i in = _mm_loadu_si128((__m128i *)(input + pos)); - const __m128i ascii_bytes_bytemask = - _mm_cmpeq_epi32(_mm_and_si128(in, v_ffffff80), v_00000000); - const __m128i one_two_bytes_bytemask = - _mm_cmpeq_epi32(_mm_and_si128(in, v_fffff800), v_00000000); - const __m128i two_bytes_bytemask = - _mm_xor_si128(one_two_bytes_bytemask, ascii_bytes_bytemask); - const __m128i one_two_three_bytes_bytemask = - _mm_cmpeq_epi32(_mm_and_si128(in, v_ffff0000), v_00000000); - const __m128i three_bytes_bytemask = - _mm_xor_si128(one_two_three_bytes_bytemask, one_two_bytes_bytemask); - const uint16_t ascii_bytes_bitmask = - static_cast(_mm_movemask_epi8(ascii_bytes_bytemask)); - const uint16_t two_bytes_bitmask = - static_cast(_mm_movemask_epi8(two_bytes_bytemask)); - const uint16_t three_bytes_bitmask = - static_cast(_mm_movemask_epi8(three_bytes_bytemask)); - - size_t ascii_count = count_ones(ascii_bytes_bitmask) / 4; - size_t two_bytes_count = count_ones(two_bytes_bitmask) / 4; - size_t three_bytes_count = count_ones(three_bytes_bitmask) / 4; - count += 16 - 3 * ascii_count - 2 * two_bytes_count - three_bytes_count; + for (; pos + 8 <= length; pos += 8) { + __m256i in = + __lasx_xvld(reinterpret_cast(input + pos), 0); + __m256i ascii_bytes_bytemask = __lasx_xvslt_w(in, v_80); + __m256i one_two_bytes_bytemask = __lasx_xvslt_w(in, v_800); + __m256i two_bytes_bytemask = + __lasx_xvxor_v(one_two_bytes_bytemask, ascii_bytes_bytemask); + __m256i three_bytes_bytemask = + __lasx_xvxor_v(__lasx_xvslt_w(in, v_10000), one_two_bytes_bytemask); + + __m256i ascii_bytes = + __lasx_xvpcnt_w(__lasx_xvmskltz_w(ascii_bytes_bytemask)); + const uint32_t ascii_bytes_count = __lasx_xvpickve2gr_wu(ascii_bytes, 0) + + __lasx_xvpickve2gr_wu(ascii_bytes, 4); + __m256i two_bytes = __lasx_xvpcnt_w(__lasx_xvmskltz_w(two_bytes_bytemask)); + const uint32_t two_bytes_count = __lasx_xvpickve2gr_wu(two_bytes, 0) + + __lasx_xvpickve2gr_wu(two_bytes, 4); + __m256i three_bytes = + __lasx_xvpcnt_w(__lasx_xvmskltz_w(three_bytes_bytemask)); + const uint32_t three_bytes_count = __lasx_xvpickve2gr_wu(three_bytes, 0) + + __lasx_xvpickve2gr_wu(three_bytes, 4); + + count += + 32 - 3 * ascii_bytes_count - 2 * two_bytes_count - three_bytes_count; } return count + scalar::utf32::utf8_length_from_utf32(input + pos, length - pos); @@ -41083,17 +56658,14 @@ simdutf_warn_unused size_t implementation::utf8_length_from_utf32( simdutf_warn_unused size_t implementation::utf16_length_from_utf32( const char32_t *input, size_t length) const noexcept { - const __m128i v_00000000 = _mm_setzero_si128(); - const __m128i v_ffff0000 = _mm_set1_epi32((uint32_t)0xffff0000); + __m128i v_ffff = __lsx_vldi(-2304); /*0x0000ffff*/ size_t pos = 0; size_t count = 0; for (; pos + 4 <= length; pos += 4) { - __m128i in = _mm_loadu_si128((__m128i *)(input + pos)); - const __m128i surrogate_bytemask = - _mm_cmpeq_epi32(_mm_and_si128(in, v_ffff0000), v_00000000); - const uint16_t surrogate_bitmask = - static_cast(_mm_movemask_epi8(surrogate_bytemask)); - size_t surrogate_count = (16 - count_ones(surrogate_bitmask)) / 4; + __m128i in = __lsx_vld(reinterpret_cast(input + pos), 0); + __m128i surrogate_bytemask = __lsx_vslt_wu(v_ffff, in); + size_t surrogate_count = __lsx_vpickve2gr_bu( + __lsx_vpcnt_b(__lsx_vmskltz_w(surrogate_bytemask)), 0); count += 4 + surrogate_count; } return count + @@ -41113,21 +56685,45 @@ simdutf_warn_unused size_t implementation::maximal_binary_length_from_base64( simdutf_warn_unused result implementation::base64_to_binary( const char *input, size_t length, char *output, base64_options options, last_chunk_handling_options last_chunk_options) const noexcept { - return (options & base64_url) - ? compress_decode_base64(output, input, length, options, - last_chunk_options) - : compress_decode_base64(output, input, length, options, - last_chunk_options); + if (options & base64_url) { + if (options == base64_options::base64_url_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } + } else { + if (options == base64_options::base64_default_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, + options, last_chunk_options); + } + } } simdutf_warn_unused full_result implementation::base64_to_binary_details( const char *input, size_t length, char *output, base64_options options, last_chunk_handling_options last_chunk_options) const noexcept { - return (options & base64_url) - ? compress_decode_base64(output, input, length, options, - last_chunk_options) - : compress_decode_base64(output, input, length, options, - last_chunk_options); + if (options & base64_url) { + if (options == base64_options::base64_url_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } + } else { + if (options == base64_options::base64_default_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, + options, last_chunk_options); + } + } } simdutf_warn_unused size_t implementation::maximal_binary_length_from_base64( @@ -41138,21 +56734,45 @@ simdutf_warn_unused size_t implementation::maximal_binary_length_from_base64( simdutf_warn_unused result implementation::base64_to_binary( const char16_t *input, size_t length, char *output, base64_options options, last_chunk_handling_options last_chunk_options) const noexcept { - return (options & base64_url) - ? compress_decode_base64(output, input, length, options, - last_chunk_options) - : compress_decode_base64(output, input, length, options, - last_chunk_options); + if (options & base64_url) { + if (options == base64_options::base64_url_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } + } else { + if (options == base64_options::base64_default_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, + options, last_chunk_options); + } + } } simdutf_warn_unused full_result implementation::base64_to_binary_details( const char16_t *input, size_t length, char *output, base64_options options, last_chunk_handling_options last_chunk_options) const noexcept { - return (options & base64_url) - ? compress_decode_base64(output, input, length, options, - last_chunk_options) - : compress_decode_base64(output, input, length, options, - last_chunk_options); + if (options & base64_url) { + if (options == base64_options::base64_url_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } + } else { + if (options == base64_options::base64_default_accept_garbage) { + return compress_decode_base64(output, input, length, options, + last_chunk_options); + } else { + return compress_decode_base64(output, input, length, + options, last_chunk_options); + } + } } simdutf_warn_unused size_t implementation::base64_length_from_binary( @@ -41169,18 +56789,12 @@ size_t implementation::binary_to_base64(const char *input, size_t length, return encode_base64(output, input, length, options); } } -} // namespace westmere +} // namespace lasx } // namespace simdutf -/* begin file src/simdutf/westmere/end.h */ -#if SIMDUTF_CAN_ALWAYS_RUN_WESTMERE -// nothing needed. -#else -SIMDUTF_UNTARGET_REGION -#endif - -/* end file src/simdutf/westmere/end.h */ -/* end file src/westmere/implementation.cpp */ +/* begin file src/simdutf/lasx/end.h */ +/* end file src/simdutf/lasx/end.h */ +/* end file src/lasx/implementation.cpp */ #endif SIMDUTF_POP_DISABLE_WARNINGS diff --git a/deps/simdutf/simdutf.h b/deps/simdutf/simdutf.h index a219e96ad9cd9f..9a4b4580da91a1 100644 --- a/deps/simdutf/simdutf.h +++ b/deps/simdutf/simdutf.h @@ -1,4 +1,4 @@ -/* auto-generated on 2024-11-12 20:00:19 -0500. Do not edit! */ +/* auto-generated on 2024-12-26 12:42:33 -0500. Do not edit! */ /* begin file include/simdutf.h */ #ifndef SIMDUTF_H #define SIMDUTF_H @@ -155,11 +155,11 @@ // RISC-V 64-bit #define SIMDUTF_IS_RISCV64 1 - #if __clang_major__ >= 19 - // Does the compiler support target regions for RISC-V - #define SIMDUTF_HAS_RVV_TARGET_REGION 1 - #endif - + // #if __riscv_v_intrinsic >= 1000000 + // #define SIMDUTF_HAS_RVV_INTRINSICS 1 + // #define SIMDUTF_HAS_RVV_TARGET_REGION 1 + // #elif ... + // Check for special compiler versions that implement pre v1.0 intrinsics #if __riscv_v_intrinsic >= 11000 #define SIMDUTF_HAS_RVV_INTRINSICS 1 #endif @@ -178,7 +178,12 @@ #endif #elif defined(__loongarch_lp64) -// LoongArch 64-bit + #if defined(__loongarch_sx) && defined(__loongarch_asx) + #define SIMDUTF_IS_LSX 1 + #define SIMDUTF_IS_LASX 1 + #elif defined(__loongarch_sx) + #define SIMDUTF_IS_LSX 1 + #endif #else // The simdutf library is designed // for 64-bit processors and it seems that you are not @@ -670,7 +675,7 @@ SIMDUTF_DISABLE_UNDESIRED_WARNINGS #define SIMDUTF_SIMDUTF_VERSION_H /** The version of simdutf being used (major.minor.revision) */ -#define SIMDUTF_VERSION "5.6.1" +#define SIMDUTF_VERSION "5.7.2" namespace simdutf { enum { @@ -681,11 +686,11 @@ enum { /** * The minor version (major.MINOR.revision) of simdutf being used. */ - SIMDUTF_VERSION_MINOR = 6, + SIMDUTF_VERSION_MINOR = 7, /** * The revision (major.minor.REVISION) of simdutf being used. */ - SIMDUTF_VERSION_REVISION = 1 + SIMDUTF_VERSION_REVISION = 2 }; } // namespace simdutf @@ -796,6 +801,8 @@ enum instruction_set { AVX512VPOPCNTDQ = 0x2000, RVV = 0x4000, ZVBB = 0x8000, + LSX = 0x40000, + LASX = 0x80000, }; #if defined(__PPC64__) @@ -987,6 +994,28 @@ static inline uint32_t detect_supported_architectures() { } return host_isa; } +#elif defined(__loongarch__) + #if defined(__linux__) + #include + // bits/hwcap.h + // #define HWCAP_LOONGARCH_LSX (1 << 4) + // #define HWCAP_LOONGARCH_LASX (1 << 5) + #endif + +static inline uint32_t detect_supported_architectures() { + uint32_t host_isa = instruction_set::DEFAULT; + #if defined(__linux__) + uint64_t hwcap = 0; + hwcap = getauxval(AT_HWCAP); + if (hwcap & HWCAP_LOONGARCH_LSX) { + host_isa |= instruction_set::LSX; + } + if (hwcap & HWCAP_LOONGARCH_LASX) { + host_isa |= instruction_set::LASX; + } + #endif + return host_isa; +} #else // fallback // includes 32-bit ARM. @@ -2673,6 +2702,9 @@ simdutf_warn_unused size_t trim_partial_utf16(const char16_t *input, size_t length); // base64_options are used to specify the base64 encoding options. +// ASCII spaces are ' ', '\t', '\n', '\r', '\f' +// garbage characters are characters that are not part of the base64 alphabet +// nor ASCII spaces. enum base64_options : uint64_t { base64_default = 0, /* standard base64 format (with padding) */ base64_url = 1, /* base64url format (no padding) */ @@ -2682,6 +2714,10 @@ enum base64_options : uint64_t { base64_reverse_padding, /* standard base64 format without padding */ base64_url_with_padding = base64_url | base64_reverse_padding, /* base64url with padding */ + base64_default_accept_garbage = + 4, /* standard base64 format accepting garbage characters */ + base64_url_accept_garbage = + 5, /* base64url format accepting garbage characters */ }; // last_chunk_handling_options are used to specify the handling of the last diff --git a/deps/sqlite/sqlite.gyp b/deps/sqlite/sqlite.gyp index c3ecef214ad004..7a556018ca0f77 100644 --- a/deps/sqlite/sqlite.gyp +++ b/deps/sqlite/sqlite.gyp @@ -13,6 +13,7 @@ 'GCC_SYMBOLS_PRIVATE_EXTERN': 'YES', # -fvisibility=hidden }, 'defines': [ + 'SQLITE_ENABLE_MATH_FUNCTIONS', 'SQLITE_ENABLE_SESSION', 'SQLITE_ENABLE_PREUPDATE_HOOK' ], diff --git a/deps/sqlite/sqlite3.c b/deps/sqlite/sqlite3.c index 2886d04ae5263b..c748d033461fae 100644 --- a/deps/sqlite/sqlite3.c +++ b/deps/sqlite/sqlite3.c @@ -1,6 +1,6 @@ /****************************************************************************** ** This file is an amalgamation of many separate C source files from SQLite -** version 3.47.0. By combining all the individual C code files into this +** version 3.47.2. By combining all the individual C code files into this ** single large file, the entire code can be compiled as a single translation ** unit. This allows many compilers to do optimizations that would not be ** possible if the files were compiled separately. Performance improvements @@ -18,7 +18,7 @@ ** separate file. This file contains only code for the core SQLite library. ** ** The content in this amalgamation comes from Fossil check-in -** 03a9703e27c44437c39363d0baf82db4ebc9. +** 2aabe05e2e8cae4847a802ee2daddc1d7413. */ #define SQLITE_CORE 1 #define SQLITE_AMALGAMATION 1 @@ -462,9 +462,9 @@ extern "C" { ** [sqlite3_libversion_number()], [sqlite3_sourceid()], ** [sqlite_version()] and [sqlite_source_id()]. */ -#define SQLITE_VERSION "3.47.0" -#define SQLITE_VERSION_NUMBER 3047000 -#define SQLITE_SOURCE_ID "2024-10-21 16:30:22 03a9703e27c44437c39363d0baf82db4ebc94538a0f28411c85dda156f82636e" +#define SQLITE_VERSION "3.47.2" +#define SQLITE_VERSION_NUMBER 3047002 +#define SQLITE_SOURCE_ID "2024-12-07 20:39:59 2aabe05e2e8cae4847a802ee2daddc1d7413d8fc560254d93ee3e72c14685b6c" /* ** CAPI3REF: Run-Time Library Version Numbers @@ -968,6 +968,13 @@ SQLITE_API int sqlite3_exec( ** filesystem supports doing multiple write operations atomically when those ** write operations are bracketed by [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE] and ** [SQLITE_FCNTL_COMMIT_ATOMIC_WRITE]. +** +** The SQLITE_IOCAP_SUBPAGE_READ property means that it is ok to read +** from the database file in amounts that are not a multiple of the +** page size and that do not begin at a page boundary. Without this +** property, SQLite is careful to only do full-page reads and write +** on aligned pages, with the one exception that it will do a sub-page +** read of the first page to access the database header. */ #define SQLITE_IOCAP_ATOMIC 0x00000001 #define SQLITE_IOCAP_ATOMIC512 0x00000002 @@ -984,6 +991,7 @@ SQLITE_API int sqlite3_exec( #define SQLITE_IOCAP_POWERSAFE_OVERWRITE 0x00001000 #define SQLITE_IOCAP_IMMUTABLE 0x00002000 #define SQLITE_IOCAP_BATCH_ATOMIC 0x00004000 +#define SQLITE_IOCAP_SUBPAGE_READ 0x00008000 /* ** CAPI3REF: File Locking Levels @@ -1130,6 +1138,7 @@ struct sqlite3_file { **
  • [SQLITE_IOCAP_POWERSAFE_OVERWRITE] **
  • [SQLITE_IOCAP_IMMUTABLE] **
  • [SQLITE_IOCAP_BATCH_ATOMIC] +**
  • [SQLITE_IOCAP_SUBPAGE_READ] ** ** ** The SQLITE_IOCAP_ATOMIC property means that all writes of @@ -32298,6 +32307,7 @@ SQLITE_PRIVATE void sqlite3RecordErrorOffsetOfExpr(sqlite3 *db, const Expr *pExp pExpr = pExpr->pLeft; } if( pExpr==0 ) return; + if( ExprHasProperty(pExpr, EP_FromDDL) ) return; db->errByteOffset = pExpr->w.iOfst; } @@ -35687,8 +35697,8 @@ SQLITE_PRIVATE int sqlite3AtoF(const char *z, double *pResult, int length, u8 en int eValid = 1; /* True exponent is either not used or is well-formed */ int nDigit = 0; /* Number of digits processed */ int eType = 1; /* 1: pure integer, 2+: fractional -1 or less: bad UTF16 */ + u64 s2; /* round-tripped significand */ double rr[2]; - u64 s2; assert( enc==SQLITE_UTF8 || enc==SQLITE_UTF16LE || enc==SQLITE_UTF16BE ); *pResult = 0.0; /* Default return value, in case of an error */ @@ -35791,7 +35801,7 @@ SQLITE_PRIVATE int sqlite3AtoF(const char *z, double *pResult, int length, u8 en e = (e*esign) + d; /* Try to adjust the exponent to make it smaller */ - while( e>0 && s<(LARGEST_UINT64/10) ){ + while( e>0 && s<((LARGEST_UINT64-0x7ff)/10) ){ s *= 10; e--; } @@ -35801,11 +35811,16 @@ SQLITE_PRIVATE int sqlite3AtoF(const char *z, double *pResult, int length, u8 en } rr[0] = (double)s; - s2 = (u64)rr[0]; -#if defined(_MSC_VER) && _MSC_VER<1700 - if( s2==0x8000000000000000LL ){ s2 = 2*(u64)(0.5*rr[0]); } -#endif - rr[1] = s>=s2 ? (double)(s - s2) : -(double)(s2 - s); + assert( sizeof(s2)==sizeof(rr[0]) ); + memcpy(&s2, &rr[0], sizeof(s2)); + if( s2<=0x43efffffffffffffLL ){ + s2 = (u64)rr[0]; + rr[1] = s>=s2 ? (double)(s - s2) : -(double)(s2 - s); + }else{ + rr[1] = 0.0; + } + assert( rr[1]<=1.0e-10*rr[0] ); /* Equal only when rr[0]==0.0 */ + if( e>0 ){ while( e>=100 ){ e -= 100; @@ -42591,6 +42606,7 @@ static void setDeviceCharacteristics(unixFile *pFd){ if( pFd->ctrlFlags & UNIXFILE_PSOW ){ pFd->deviceCharacteristics |= SQLITE_IOCAP_POWERSAFE_OVERWRITE; } + pFd->deviceCharacteristics |= SQLITE_IOCAP_SUBPAGE_READ; pFd->sectorSize = SQLITE_DEFAULT_SECTOR_SIZE; } @@ -50391,7 +50407,7 @@ static int winSectorSize(sqlite3_file *id){ */ static int winDeviceCharacteristics(sqlite3_file *id){ winFile *p = (winFile*)id; - return SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN | + return SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN | SQLITE_IOCAP_SUBPAGE_READ | ((p->ctrlFlags & WINFILE_PSOW)?SQLITE_IOCAP_POWERSAFE_OVERWRITE:0); } @@ -51779,7 +51795,7 @@ static int winOpen( int rc = SQLITE_OK; /* Function Return Code */ #if !defined(NDEBUG) || SQLITE_OS_WINCE - int eType = flags&0xFFFFFF00; /* Type of file to open */ + int eType = flags&0x0FFF00; /* Type of file to open */ #endif int isExclusive = (flags & SQLITE_OPEN_EXCLUSIVE); @@ -57999,18 +58015,26 @@ static const unsigned char aJournalMagic[] = { ** Return true if page pgno can be read directly from the database file ** by the b-tree layer. This is the case if: ** -** * the database file is open, -** * there are no dirty pages in the cache, and -** * the desired page is not currently in the wal file. +** (1) the database file is open +** (2) the VFS for the database is able to do unaligned sub-page reads +** (3) there are no dirty pages in the cache, and +** (4) the desired page is not currently in the wal file. */ SQLITE_PRIVATE int sqlite3PagerDirectReadOk(Pager *pPager, Pgno pgno){ - if( pPager->fd->pMethods==0 ) return 0; - if( sqlite3PCacheIsDirty(pPager->pPCache) ) return 0; + assert( pPager!=0 ); + assert( pPager->fd!=0 ); + if( pPager->fd->pMethods==0 ) return 0; /* Case (1) */ + assert( pPager->fd->pMethods->xDeviceCharacteristics!=0 ); + if( (pPager->fd->pMethods->xDeviceCharacteristics(pPager->fd) + & SQLITE_IOCAP_SUBPAGE_READ)==0 ){ + return 0; /* Case (2) */ + } + if( sqlite3PCacheIsDirty(pPager->pPCache) ) return 0; /* Failed (3) */ #ifndef SQLITE_OMIT_WAL if( pPager->pWal ){ u32 iRead = 0; (void)sqlite3WalFindFrame(pPager->pWal, pgno, &iRead); - return iRead==0; + return iRead==0; /* Condition (4) */ } #endif return 1; @@ -147586,32 +147610,32 @@ static Expr *substExpr( if( pSubst->isOuterJoin ){ ExprSetProperty(pNew, EP_CanBeNull); } - if( ExprHasProperty(pExpr,EP_OuterON|EP_InnerON) ){ - sqlite3SetJoinExpr(pNew, pExpr->w.iJoin, - pExpr->flags & (EP_OuterON|EP_InnerON)); - } - sqlite3ExprDelete(db, pExpr); - pExpr = pNew; - if( pExpr->op==TK_TRUEFALSE ){ - pExpr->u.iValue = sqlite3ExprTruthValue(pExpr); - pExpr->op = TK_INTEGER; - ExprSetProperty(pExpr, EP_IntValue); + if( pNew->op==TK_TRUEFALSE ){ + pNew->u.iValue = sqlite3ExprTruthValue(pNew); + pNew->op = TK_INTEGER; + ExprSetProperty(pNew, EP_IntValue); } /* Ensure that the expression now has an implicit collation sequence, ** just as it did when it was a column of a view or sub-query. */ { - CollSeq *pNat = sqlite3ExprCollSeq(pSubst->pParse, pExpr); + CollSeq *pNat = sqlite3ExprCollSeq(pSubst->pParse, pNew); CollSeq *pColl = sqlite3ExprCollSeq(pSubst->pParse, pSubst->pCList->a[iColumn].pExpr ); - if( pNat!=pColl || (pExpr->op!=TK_COLUMN && pExpr->op!=TK_COLLATE) ){ - pExpr = sqlite3ExprAddCollateString(pSubst->pParse, pExpr, + if( pNat!=pColl || (pNew->op!=TK_COLUMN && pNew->op!=TK_COLLATE) ){ + pNew = sqlite3ExprAddCollateString(pSubst->pParse, pNew, (pColl ? pColl->zName : "BINARY") ); } } - ExprClearProperty(pExpr, EP_Collate); + ExprClearProperty(pNew, EP_Collate); + if( ExprHasProperty(pExpr,EP_OuterON|EP_InnerON) ){ + sqlite3SetJoinExpr(pNew, pExpr->w.iJoin, + pExpr->flags & (EP_OuterON|EP_InnerON)); + } + sqlite3ExprDelete(db, pExpr); + pExpr = pNew; } } }else{ @@ -158939,6 +158963,7 @@ static Expr *removeUnindexableInClauseTerms( pNew->pLeft->x.pList = pLhs; } pSelect->pEList = pRhs; + pSelect->selId = ++pParse->nSelect; /* Req'd for SubrtnSig validity */ if( pLhs && pLhs->nExpr==1 ){ /* Take care here not to generate a TK_VECTOR containing only a ** single value. Since the parser never creates such a vector, some @@ -189798,10 +189823,15 @@ static int fts3PoslistPhraseMerge( if( *p1==POS_COLUMN ){ p1++; p1 += fts3GetVarint32(p1, &iCol1); + /* iCol1==0 indicates corruption. Column 0 does not have a POS_COLUMN + ** entry, so this is actually end-of-doclist. */ + if( iCol1==0 ) return 0; } if( *p2==POS_COLUMN ){ p2++; p2 += fts3GetVarint32(p2, &iCol2); + /* As above, iCol2==0 indicates corruption. */ + if( iCol2==0 ) return 0; } while( 1 ){ @@ -192972,7 +193002,7 @@ static int fts3EvalNearTest(Fts3Expr *pExpr, int *pRc){ nTmp += p->pRight->pPhrase->doclist.nList; } nTmp += p->pPhrase->doclist.nList; - aTmp = sqlite3_malloc64(nTmp*2); + aTmp = sqlite3_malloc64(nTmp*2 + FTS3_VARINT_MAX); if( !aTmp ){ *pRc = SQLITE_NOMEM; res = 0; @@ -194525,10 +194555,11 @@ static int getNextString( Fts3PhraseToken *pToken; p = fts3ReallocOrFree(p, nSpace + ii*sizeof(Fts3PhraseToken)); - if( !p ) goto no_mem; - zTemp = fts3ReallocOrFree(zTemp, nTemp + nByte); - if( !zTemp ) goto no_mem; + if( !zTemp || !p ){ + rc = SQLITE_NOMEM; + goto getnextstring_out; + } assert( nToken==ii ); pToken = &((Fts3Phrase *)(&p[1]))->aToken[ii]; @@ -194543,9 +194574,6 @@ static int getNextString( nToken = ii+1; } } - - pModule->xClose(pCursor); - pCursor = 0; } if( rc==SQLITE_DONE ){ @@ -194553,7 +194581,10 @@ static int getNextString( char *zBuf = 0; p = fts3ReallocOrFree(p, nSpace + nToken*sizeof(Fts3PhraseToken) + nTemp); - if( !p ) goto no_mem; + if( !p ){ + rc = SQLITE_NOMEM; + goto getnextstring_out; + } memset(p, 0, (char *)&(((Fts3Phrase *)&p[1])->aToken[0])-(char *)p); p->eType = FTSQUERY_PHRASE; p->pPhrase = (Fts3Phrase *)&p[1]; @@ -194561,11 +194592,9 @@ static int getNextString( p->pPhrase->nToken = nToken; zBuf = (char *)&p->pPhrase->aToken[nToken]; + assert( nTemp==0 || zTemp ); if( zTemp ){ memcpy(zBuf, zTemp, nTemp); - sqlite3_free(zTemp); - }else{ - assert( nTemp==0 ); } for(jj=0; jjpPhrase->nToken; jj++){ @@ -194575,17 +194604,17 @@ static int getNextString( rc = SQLITE_OK; } - *ppExpr = p; - return rc; -no_mem: - + getnextstring_out: if( pCursor ){ pModule->xClose(pCursor); } sqlite3_free(zTemp); - sqlite3_free(p); - *ppExpr = 0; - return SQLITE_NOMEM; + if( rc!=SQLITE_OK ){ + sqlite3_free(p); + p = 0; + } + *ppExpr = p; + return rc; } /* @@ -232806,7 +232835,27 @@ SQLITE_API int sqlite3session_config(int op, void *pArg){ /************** End of sqlite3session.c **************************************/ /************** Begin file fts5.c ********************************************/ - +/* +** This, the "fts5.c" source file, is a composite file that is itself +** assembled from the following files: +** +** fts5.h +** fts5Int.h +** fts5parse.h <--- Generated from fts5parse.y by Lemon +** fts5parse.c <--- Generated from fts5parse.y by Lemon +** fts5_aux.c +** fts5_buffer.c +** fts5_config.c +** fts5_expr.c +** fts5_hash.c +** fts5_index.c +** fts5_main.c +** fts5_storage.c +** fts5_tokenize.c +** fts5_unicode2.c +** fts5_varint.c +** fts5_vocab.c +*/ #if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS5) #if !defined(NDEBUG) && !defined(SQLITE_DEBUG) @@ -232816,6 +232865,12 @@ SQLITE_API int sqlite3session_config(int op, void *pArg){ # undef NDEBUG #endif +#ifdef HAVE_STDINT_H +/* #include */ +#endif +#ifdef HAVE_INTTYPES_H +/* #include */ +#endif /* ** 2014 May 31 ** @@ -254888,7 +254943,7 @@ static void fts5SourceIdFunc( ){ assert( nArg==0 ); UNUSED_PARAM2(nArg, apUnused); - sqlite3_result_text(pCtx, "fts5: 2024-10-21 16:30:22 03a9703e27c44437c39363d0baf82db4ebc94538a0f28411c85dda156f82636e", -1, SQLITE_TRANSIENT); + sqlite3_result_text(pCtx, "fts5: 2024-12-07 20:39:59 2aabe05e2e8cae4847a802ee2daddc1d7413d8fc560254d93ee3e72c14685b6c", -1, SQLITE_TRANSIENT); } /* @@ -260079,7 +260134,7 @@ static int sqlite3Fts5VocabInit(Fts5Global *pGlobal, sqlite3 *db){ } - +/* Here ends the fts5.c composite file. */ #endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS5) */ /************** End of fts5.c ************************************************/ diff --git a/deps/sqlite/sqlite3.h b/deps/sqlite/sqlite3.h index eaffd1ec167ad4..d8ce1482a352af 100644 --- a/deps/sqlite/sqlite3.h +++ b/deps/sqlite/sqlite3.h @@ -146,9 +146,9 @@ extern "C" { ** [sqlite3_libversion_number()], [sqlite3_sourceid()], ** [sqlite_version()] and [sqlite_source_id()]. */ -#define SQLITE_VERSION "3.47.0" -#define SQLITE_VERSION_NUMBER 3047000 -#define SQLITE_SOURCE_ID "2024-10-21 16:30:22 03a9703e27c44437c39363d0baf82db4ebc94538a0f28411c85dda156f82636e" +#define SQLITE_VERSION "3.47.2" +#define SQLITE_VERSION_NUMBER 3047002 +#define SQLITE_SOURCE_ID "2024-12-07 20:39:59 2aabe05e2e8cae4847a802ee2daddc1d7413d8fc560254d93ee3e72c14685b6c" /* ** CAPI3REF: Run-Time Library Version Numbers @@ -652,6 +652,13 @@ SQLITE_API int sqlite3_exec( ** filesystem supports doing multiple write operations atomically when those ** write operations are bracketed by [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE] and ** [SQLITE_FCNTL_COMMIT_ATOMIC_WRITE]. +** +** The SQLITE_IOCAP_SUBPAGE_READ property means that it is ok to read +** from the database file in amounts that are not a multiple of the +** page size and that do not begin at a page boundary. Without this +** property, SQLite is careful to only do full-page reads and write +** on aligned pages, with the one exception that it will do a sub-page +** read of the first page to access the database header. */ #define SQLITE_IOCAP_ATOMIC 0x00000001 #define SQLITE_IOCAP_ATOMIC512 0x00000002 @@ -668,6 +675,7 @@ SQLITE_API int sqlite3_exec( #define SQLITE_IOCAP_POWERSAFE_OVERWRITE 0x00001000 #define SQLITE_IOCAP_IMMUTABLE 0x00002000 #define SQLITE_IOCAP_BATCH_ATOMIC 0x00004000 +#define SQLITE_IOCAP_SUBPAGE_READ 0x00008000 /* ** CAPI3REF: File Locking Levels @@ -814,6 +822,7 @@ struct sqlite3_file { **
  • [SQLITE_IOCAP_POWERSAFE_OVERWRITE] **
  • [SQLITE_IOCAP_IMMUTABLE] **
  • [SQLITE_IOCAP_BATCH_ATOMIC] +**
  • [SQLITE_IOCAP_SUBPAGE_READ] ** ** ** The SQLITE_IOCAP_ATOMIC property means that all writes of diff --git a/deps/sqlite/sqlite3ext.h b/deps/sqlite/sqlite3ext.h new file mode 100644 index 00000000000000..ae0949baf75ae8 --- /dev/null +++ b/deps/sqlite/sqlite3ext.h @@ -0,0 +1,719 @@ +/* +** 2006 June 7 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This header file defines the SQLite interface for use by +** shared libraries that want to be imported as extensions into +** an SQLite instance. Shared libraries that intend to be loaded +** as extensions by SQLite should #include this file instead of +** sqlite3.h. +*/ +#ifndef SQLITE3EXT_H +#define SQLITE3EXT_H +#include "sqlite3.h" + +/* +** The following structure holds pointers to all of the SQLite API +** routines. +** +** WARNING: In order to maintain backwards compatibility, add new +** interfaces to the end of this structure only. If you insert new +** interfaces in the middle of this structure, then older different +** versions of SQLite will not be able to load each other's shared +** libraries! +*/ +struct sqlite3_api_routines { + void * (*aggregate_context)(sqlite3_context*,int nBytes); + int (*aggregate_count)(sqlite3_context*); + int (*bind_blob)(sqlite3_stmt*,int,const void*,int n,void(*)(void*)); + int (*bind_double)(sqlite3_stmt*,int,double); + int (*bind_int)(sqlite3_stmt*,int,int); + int (*bind_int64)(sqlite3_stmt*,int,sqlite_int64); + int (*bind_null)(sqlite3_stmt*,int); + int (*bind_parameter_count)(sqlite3_stmt*); + int (*bind_parameter_index)(sqlite3_stmt*,const char*zName); + const char * (*bind_parameter_name)(sqlite3_stmt*,int); + int (*bind_text)(sqlite3_stmt*,int,const char*,int n,void(*)(void*)); + int (*bind_text16)(sqlite3_stmt*,int,const void*,int,void(*)(void*)); + int (*bind_value)(sqlite3_stmt*,int,const sqlite3_value*); + int (*busy_handler)(sqlite3*,int(*)(void*,int),void*); + int (*busy_timeout)(sqlite3*,int ms); + int (*changes)(sqlite3*); + int (*close)(sqlite3*); + int (*collation_needed)(sqlite3*,void*,void(*)(void*,sqlite3*, + int eTextRep,const char*)); + int (*collation_needed16)(sqlite3*,void*,void(*)(void*,sqlite3*, + int eTextRep,const void*)); + const void * (*column_blob)(sqlite3_stmt*,int iCol); + int (*column_bytes)(sqlite3_stmt*,int iCol); + int (*column_bytes16)(sqlite3_stmt*,int iCol); + int (*column_count)(sqlite3_stmt*pStmt); + const char * (*column_database_name)(sqlite3_stmt*,int); + const void * (*column_database_name16)(sqlite3_stmt*,int); + const char * (*column_decltype)(sqlite3_stmt*,int i); + const void * (*column_decltype16)(sqlite3_stmt*,int); + double (*column_double)(sqlite3_stmt*,int iCol); + int (*column_int)(sqlite3_stmt*,int iCol); + sqlite_int64 (*column_int64)(sqlite3_stmt*,int iCol); + const char * (*column_name)(sqlite3_stmt*,int); + const void * (*column_name16)(sqlite3_stmt*,int); + const char * (*column_origin_name)(sqlite3_stmt*,int); + const void * (*column_origin_name16)(sqlite3_stmt*,int); + const char * (*column_table_name)(sqlite3_stmt*,int); + const void * (*column_table_name16)(sqlite3_stmt*,int); + const unsigned char * (*column_text)(sqlite3_stmt*,int iCol); + const void * (*column_text16)(sqlite3_stmt*,int iCol); + int (*column_type)(sqlite3_stmt*,int iCol); + sqlite3_value* (*column_value)(sqlite3_stmt*,int iCol); + void * (*commit_hook)(sqlite3*,int(*)(void*),void*); + int (*complete)(const char*sql); + int (*complete16)(const void*sql); + int (*create_collation)(sqlite3*,const char*,int,void*, + int(*)(void*,int,const void*,int,const void*)); + int (*create_collation16)(sqlite3*,const void*,int,void*, + int(*)(void*,int,const void*,int,const void*)); + int (*create_function)(sqlite3*,const char*,int,int,void*, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*)); + int (*create_function16)(sqlite3*,const void*,int,int,void*, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*)); + int (*create_module)(sqlite3*,const char*,const sqlite3_module*,void*); + int (*data_count)(sqlite3_stmt*pStmt); + sqlite3 * (*db_handle)(sqlite3_stmt*); + int (*declare_vtab)(sqlite3*,const char*); + int (*enable_shared_cache)(int); + int (*errcode)(sqlite3*db); + const char * (*errmsg)(sqlite3*); + const void * (*errmsg16)(sqlite3*); + int (*exec)(sqlite3*,const char*,sqlite3_callback,void*,char**); + int (*expired)(sqlite3_stmt*); + int (*finalize)(sqlite3_stmt*pStmt); + void (*free)(void*); + void (*free_table)(char**result); + int (*get_autocommit)(sqlite3*); + void * (*get_auxdata)(sqlite3_context*,int); + int (*get_table)(sqlite3*,const char*,char***,int*,int*,char**); + int (*global_recover)(void); + void (*interruptx)(sqlite3*); + sqlite_int64 (*last_insert_rowid)(sqlite3*); + const char * (*libversion)(void); + int (*libversion_number)(void); + void *(*malloc)(int); + char * (*mprintf)(const char*,...); + int (*open)(const char*,sqlite3**); + int (*open16)(const void*,sqlite3**); + int (*prepare)(sqlite3*,const char*,int,sqlite3_stmt**,const char**); + int (*prepare16)(sqlite3*,const void*,int,sqlite3_stmt**,const void**); + void * (*profile)(sqlite3*,void(*)(void*,const char*,sqlite_uint64),void*); + void (*progress_handler)(sqlite3*,int,int(*)(void*),void*); + void *(*realloc)(void*,int); + int (*reset)(sqlite3_stmt*pStmt); + void (*result_blob)(sqlite3_context*,const void*,int,void(*)(void*)); + void (*result_double)(sqlite3_context*,double); + void (*result_error)(sqlite3_context*,const char*,int); + void (*result_error16)(sqlite3_context*,const void*,int); + void (*result_int)(sqlite3_context*,int); + void (*result_int64)(sqlite3_context*,sqlite_int64); + void (*result_null)(sqlite3_context*); + void (*result_text)(sqlite3_context*,const char*,int,void(*)(void*)); + void (*result_text16)(sqlite3_context*,const void*,int,void(*)(void*)); + void (*result_text16be)(sqlite3_context*,const void*,int,void(*)(void*)); + void (*result_text16le)(sqlite3_context*,const void*,int,void(*)(void*)); + void (*result_value)(sqlite3_context*,sqlite3_value*); + void * (*rollback_hook)(sqlite3*,void(*)(void*),void*); + int (*set_authorizer)(sqlite3*,int(*)(void*,int,const char*,const char*, + const char*,const char*),void*); + void (*set_auxdata)(sqlite3_context*,int,void*,void (*)(void*)); + char * (*xsnprintf)(int,char*,const char*,...); + int (*step)(sqlite3_stmt*); + int (*table_column_metadata)(sqlite3*,const char*,const char*,const char*, + char const**,char const**,int*,int*,int*); + void (*thread_cleanup)(void); + int (*total_changes)(sqlite3*); + void * (*trace)(sqlite3*,void(*xTrace)(void*,const char*),void*); + int (*transfer_bindings)(sqlite3_stmt*,sqlite3_stmt*); + void * (*update_hook)(sqlite3*,void(*)(void*,int ,char const*,char const*, + sqlite_int64),void*); + void * (*user_data)(sqlite3_context*); + const void * (*value_blob)(sqlite3_value*); + int (*value_bytes)(sqlite3_value*); + int (*value_bytes16)(sqlite3_value*); + double (*value_double)(sqlite3_value*); + int (*value_int)(sqlite3_value*); + sqlite_int64 (*value_int64)(sqlite3_value*); + int (*value_numeric_type)(sqlite3_value*); + const unsigned char * (*value_text)(sqlite3_value*); + const void * (*value_text16)(sqlite3_value*); + const void * (*value_text16be)(sqlite3_value*); + const void * (*value_text16le)(sqlite3_value*); + int (*value_type)(sqlite3_value*); + char *(*vmprintf)(const char*,va_list); + /* Added ??? */ + int (*overload_function)(sqlite3*, const char *zFuncName, int nArg); + /* Added by 3.3.13 */ + int (*prepare_v2)(sqlite3*,const char*,int,sqlite3_stmt**,const char**); + int (*prepare16_v2)(sqlite3*,const void*,int,sqlite3_stmt**,const void**); + int (*clear_bindings)(sqlite3_stmt*); + /* Added by 3.4.1 */ + int (*create_module_v2)(sqlite3*,const char*,const sqlite3_module*,void*, + void (*xDestroy)(void *)); + /* Added by 3.5.0 */ + int (*bind_zeroblob)(sqlite3_stmt*,int,int); + int (*blob_bytes)(sqlite3_blob*); + int (*blob_close)(sqlite3_blob*); + int (*blob_open)(sqlite3*,const char*,const char*,const char*,sqlite3_int64, + int,sqlite3_blob**); + int (*blob_read)(sqlite3_blob*,void*,int,int); + int (*blob_write)(sqlite3_blob*,const void*,int,int); + int (*create_collation_v2)(sqlite3*,const char*,int,void*, + int(*)(void*,int,const void*,int,const void*), + void(*)(void*)); + int (*file_control)(sqlite3*,const char*,int,void*); + sqlite3_int64 (*memory_highwater)(int); + sqlite3_int64 (*memory_used)(void); + sqlite3_mutex *(*mutex_alloc)(int); + void (*mutex_enter)(sqlite3_mutex*); + void (*mutex_free)(sqlite3_mutex*); + void (*mutex_leave)(sqlite3_mutex*); + int (*mutex_try)(sqlite3_mutex*); + int (*open_v2)(const char*,sqlite3**,int,const char*); + int (*release_memory)(int); + void (*result_error_nomem)(sqlite3_context*); + void (*result_error_toobig)(sqlite3_context*); + int (*sleep)(int); + void (*soft_heap_limit)(int); + sqlite3_vfs *(*vfs_find)(const char*); + int (*vfs_register)(sqlite3_vfs*,int); + int (*vfs_unregister)(sqlite3_vfs*); + int (*xthreadsafe)(void); + void (*result_zeroblob)(sqlite3_context*,int); + void (*result_error_code)(sqlite3_context*,int); + int (*test_control)(int, ...); + void (*randomness)(int,void*); + sqlite3 *(*context_db_handle)(sqlite3_context*); + int (*extended_result_codes)(sqlite3*,int); + int (*limit)(sqlite3*,int,int); + sqlite3_stmt *(*next_stmt)(sqlite3*,sqlite3_stmt*); + const char *(*sql)(sqlite3_stmt*); + int (*status)(int,int*,int*,int); + int (*backup_finish)(sqlite3_backup*); + sqlite3_backup *(*backup_init)(sqlite3*,const char*,sqlite3*,const char*); + int (*backup_pagecount)(sqlite3_backup*); + int (*backup_remaining)(sqlite3_backup*); + int (*backup_step)(sqlite3_backup*,int); + const char *(*compileoption_get)(int); + int (*compileoption_used)(const char*); + int (*create_function_v2)(sqlite3*,const char*,int,int,void*, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*), + void(*xDestroy)(void*)); + int (*db_config)(sqlite3*,int,...); + sqlite3_mutex *(*db_mutex)(sqlite3*); + int (*db_status)(sqlite3*,int,int*,int*,int); + int (*extended_errcode)(sqlite3*); + void (*log)(int,const char*,...); + sqlite3_int64 (*soft_heap_limit64)(sqlite3_int64); + const char *(*sourceid)(void); + int (*stmt_status)(sqlite3_stmt*,int,int); + int (*strnicmp)(const char*,const char*,int); + int (*unlock_notify)(sqlite3*,void(*)(void**,int),void*); + int (*wal_autocheckpoint)(sqlite3*,int); + int (*wal_checkpoint)(sqlite3*,const char*); + void *(*wal_hook)(sqlite3*,int(*)(void*,sqlite3*,const char*,int),void*); + int (*blob_reopen)(sqlite3_blob*,sqlite3_int64); + int (*vtab_config)(sqlite3*,int op,...); + int (*vtab_on_conflict)(sqlite3*); + /* Version 3.7.16 and later */ + int (*close_v2)(sqlite3*); + const char *(*db_filename)(sqlite3*,const char*); + int (*db_readonly)(sqlite3*,const char*); + int (*db_release_memory)(sqlite3*); + const char *(*errstr)(int); + int (*stmt_busy)(sqlite3_stmt*); + int (*stmt_readonly)(sqlite3_stmt*); + int (*stricmp)(const char*,const char*); + int (*uri_boolean)(const char*,const char*,int); + sqlite3_int64 (*uri_int64)(const char*,const char*,sqlite3_int64); + const char *(*uri_parameter)(const char*,const char*); + char *(*xvsnprintf)(int,char*,const char*,va_list); + int (*wal_checkpoint_v2)(sqlite3*,const char*,int,int*,int*); + /* Version 3.8.7 and later */ + int (*auto_extension)(void(*)(void)); + int (*bind_blob64)(sqlite3_stmt*,int,const void*,sqlite3_uint64, + void(*)(void*)); + int (*bind_text64)(sqlite3_stmt*,int,const char*,sqlite3_uint64, + void(*)(void*),unsigned char); + int (*cancel_auto_extension)(void(*)(void)); + int (*load_extension)(sqlite3*,const char*,const char*,char**); + void *(*malloc64)(sqlite3_uint64); + sqlite3_uint64 (*msize)(void*); + void *(*realloc64)(void*,sqlite3_uint64); + void (*reset_auto_extension)(void); + void (*result_blob64)(sqlite3_context*,const void*,sqlite3_uint64, + void(*)(void*)); + void (*result_text64)(sqlite3_context*,const char*,sqlite3_uint64, + void(*)(void*), unsigned char); + int (*strglob)(const char*,const char*); + /* Version 3.8.11 and later */ + sqlite3_value *(*value_dup)(const sqlite3_value*); + void (*value_free)(sqlite3_value*); + int (*result_zeroblob64)(sqlite3_context*,sqlite3_uint64); + int (*bind_zeroblob64)(sqlite3_stmt*, int, sqlite3_uint64); + /* Version 3.9.0 and later */ + unsigned int (*value_subtype)(sqlite3_value*); + void (*result_subtype)(sqlite3_context*,unsigned int); + /* Version 3.10.0 and later */ + int (*status64)(int,sqlite3_int64*,sqlite3_int64*,int); + int (*strlike)(const char*,const char*,unsigned int); + int (*db_cacheflush)(sqlite3*); + /* Version 3.12.0 and later */ + int (*system_errno)(sqlite3*); + /* Version 3.14.0 and later */ + int (*trace_v2)(sqlite3*,unsigned,int(*)(unsigned,void*,void*,void*),void*); + char *(*expanded_sql)(sqlite3_stmt*); + /* Version 3.18.0 and later */ + void (*set_last_insert_rowid)(sqlite3*,sqlite3_int64); + /* Version 3.20.0 and later */ + int (*prepare_v3)(sqlite3*,const char*,int,unsigned int, + sqlite3_stmt**,const char**); + int (*prepare16_v3)(sqlite3*,const void*,int,unsigned int, + sqlite3_stmt**,const void**); + int (*bind_pointer)(sqlite3_stmt*,int,void*,const char*,void(*)(void*)); + void (*result_pointer)(sqlite3_context*,void*,const char*,void(*)(void*)); + void *(*value_pointer)(sqlite3_value*,const char*); + int (*vtab_nochange)(sqlite3_context*); + int (*value_nochange)(sqlite3_value*); + const char *(*vtab_collation)(sqlite3_index_info*,int); + /* Version 3.24.0 and later */ + int (*keyword_count)(void); + int (*keyword_name)(int,const char**,int*); + int (*keyword_check)(const char*,int); + sqlite3_str *(*str_new)(sqlite3*); + char *(*str_finish)(sqlite3_str*); + void (*str_appendf)(sqlite3_str*, const char *zFormat, ...); + void (*str_vappendf)(sqlite3_str*, const char *zFormat, va_list); + void (*str_append)(sqlite3_str*, const char *zIn, int N); + void (*str_appendall)(sqlite3_str*, const char *zIn); + void (*str_appendchar)(sqlite3_str*, int N, char C); + void (*str_reset)(sqlite3_str*); + int (*str_errcode)(sqlite3_str*); + int (*str_length)(sqlite3_str*); + char *(*str_value)(sqlite3_str*); + /* Version 3.25.0 and later */ + int (*create_window_function)(sqlite3*,const char*,int,int,void*, + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*), + void (*xValue)(sqlite3_context*), + void (*xInv)(sqlite3_context*,int,sqlite3_value**), + void(*xDestroy)(void*)); + /* Version 3.26.0 and later */ + const char *(*normalized_sql)(sqlite3_stmt*); + /* Version 3.28.0 and later */ + int (*stmt_isexplain)(sqlite3_stmt*); + int (*value_frombind)(sqlite3_value*); + /* Version 3.30.0 and later */ + int (*drop_modules)(sqlite3*,const char**); + /* Version 3.31.0 and later */ + sqlite3_int64 (*hard_heap_limit64)(sqlite3_int64); + const char *(*uri_key)(const char*,int); + const char *(*filename_database)(const char*); + const char *(*filename_journal)(const char*); + const char *(*filename_wal)(const char*); + /* Version 3.32.0 and later */ + const char *(*create_filename)(const char*,const char*,const char*, + int,const char**); + void (*free_filename)(const char*); + sqlite3_file *(*database_file_object)(const char*); + /* Version 3.34.0 and later */ + int (*txn_state)(sqlite3*,const char*); + /* Version 3.36.1 and later */ + sqlite3_int64 (*changes64)(sqlite3*); + sqlite3_int64 (*total_changes64)(sqlite3*); + /* Version 3.37.0 and later */ + int (*autovacuum_pages)(sqlite3*, + unsigned int(*)(void*,const char*,unsigned int,unsigned int,unsigned int), + void*, void(*)(void*)); + /* Version 3.38.0 and later */ + int (*error_offset)(sqlite3*); + int (*vtab_rhs_value)(sqlite3_index_info*,int,sqlite3_value**); + int (*vtab_distinct)(sqlite3_index_info*); + int (*vtab_in)(sqlite3_index_info*,int,int); + int (*vtab_in_first)(sqlite3_value*,sqlite3_value**); + int (*vtab_in_next)(sqlite3_value*,sqlite3_value**); + /* Version 3.39.0 and later */ + int (*deserialize)(sqlite3*,const char*,unsigned char*, + sqlite3_int64,sqlite3_int64,unsigned); + unsigned char *(*serialize)(sqlite3*,const char *,sqlite3_int64*, + unsigned int); + const char *(*db_name)(sqlite3*,int); + /* Version 3.40.0 and later */ + int (*value_encoding)(sqlite3_value*); + /* Version 3.41.0 and later */ + int (*is_interrupted)(sqlite3*); + /* Version 3.43.0 and later */ + int (*stmt_explain)(sqlite3_stmt*,int); + /* Version 3.44.0 and later */ + void *(*get_clientdata)(sqlite3*,const char*); + int (*set_clientdata)(sqlite3*, const char*, void*, void(*)(void*)); +}; + +/* +** This is the function signature used for all extension entry points. It +** is also defined in the file "loadext.c". +*/ +typedef int (*sqlite3_loadext_entry)( + sqlite3 *db, /* Handle to the database. */ + char **pzErrMsg, /* Used to set error string on failure. */ + const sqlite3_api_routines *pThunk /* Extension API function pointers. */ +); + +/* +** The following macros redefine the API routines so that they are +** redirected through the global sqlite3_api structure. +** +** This header file is also used by the loadext.c source file +** (part of the main SQLite library - not an extension) so that +** it can get access to the sqlite3_api_routines structure +** definition. But the main library does not want to redefine +** the API. So the redefinition macros are only valid if the +** SQLITE_CORE macros is undefined. +*/ +#if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) +#define sqlite3_aggregate_context sqlite3_api->aggregate_context +#ifndef SQLITE_OMIT_DEPRECATED +#define sqlite3_aggregate_count sqlite3_api->aggregate_count +#endif +#define sqlite3_bind_blob sqlite3_api->bind_blob +#define sqlite3_bind_double sqlite3_api->bind_double +#define sqlite3_bind_int sqlite3_api->bind_int +#define sqlite3_bind_int64 sqlite3_api->bind_int64 +#define sqlite3_bind_null sqlite3_api->bind_null +#define sqlite3_bind_parameter_count sqlite3_api->bind_parameter_count +#define sqlite3_bind_parameter_index sqlite3_api->bind_parameter_index +#define sqlite3_bind_parameter_name sqlite3_api->bind_parameter_name +#define sqlite3_bind_text sqlite3_api->bind_text +#define sqlite3_bind_text16 sqlite3_api->bind_text16 +#define sqlite3_bind_value sqlite3_api->bind_value +#define sqlite3_busy_handler sqlite3_api->busy_handler +#define sqlite3_busy_timeout sqlite3_api->busy_timeout +#define sqlite3_changes sqlite3_api->changes +#define sqlite3_close sqlite3_api->close +#define sqlite3_collation_needed sqlite3_api->collation_needed +#define sqlite3_collation_needed16 sqlite3_api->collation_needed16 +#define sqlite3_column_blob sqlite3_api->column_blob +#define sqlite3_column_bytes sqlite3_api->column_bytes +#define sqlite3_column_bytes16 sqlite3_api->column_bytes16 +#define sqlite3_column_count sqlite3_api->column_count +#define sqlite3_column_database_name sqlite3_api->column_database_name +#define sqlite3_column_database_name16 sqlite3_api->column_database_name16 +#define sqlite3_column_decltype sqlite3_api->column_decltype +#define sqlite3_column_decltype16 sqlite3_api->column_decltype16 +#define sqlite3_column_double sqlite3_api->column_double +#define sqlite3_column_int sqlite3_api->column_int +#define sqlite3_column_int64 sqlite3_api->column_int64 +#define sqlite3_column_name sqlite3_api->column_name +#define sqlite3_column_name16 sqlite3_api->column_name16 +#define sqlite3_column_origin_name sqlite3_api->column_origin_name +#define sqlite3_column_origin_name16 sqlite3_api->column_origin_name16 +#define sqlite3_column_table_name sqlite3_api->column_table_name +#define sqlite3_column_table_name16 sqlite3_api->column_table_name16 +#define sqlite3_column_text sqlite3_api->column_text +#define sqlite3_column_text16 sqlite3_api->column_text16 +#define sqlite3_column_type sqlite3_api->column_type +#define sqlite3_column_value sqlite3_api->column_value +#define sqlite3_commit_hook sqlite3_api->commit_hook +#define sqlite3_complete sqlite3_api->complete +#define sqlite3_complete16 sqlite3_api->complete16 +#define sqlite3_create_collation sqlite3_api->create_collation +#define sqlite3_create_collation16 sqlite3_api->create_collation16 +#define sqlite3_create_function sqlite3_api->create_function +#define sqlite3_create_function16 sqlite3_api->create_function16 +#define sqlite3_create_module sqlite3_api->create_module +#define sqlite3_create_module_v2 sqlite3_api->create_module_v2 +#define sqlite3_data_count sqlite3_api->data_count +#define sqlite3_db_handle sqlite3_api->db_handle +#define sqlite3_declare_vtab sqlite3_api->declare_vtab +#define sqlite3_enable_shared_cache sqlite3_api->enable_shared_cache +#define sqlite3_errcode sqlite3_api->errcode +#define sqlite3_errmsg sqlite3_api->errmsg +#define sqlite3_errmsg16 sqlite3_api->errmsg16 +#define sqlite3_exec sqlite3_api->exec +#ifndef SQLITE_OMIT_DEPRECATED +#define sqlite3_expired sqlite3_api->expired +#endif +#define sqlite3_finalize sqlite3_api->finalize +#define sqlite3_free sqlite3_api->free +#define sqlite3_free_table sqlite3_api->free_table +#define sqlite3_get_autocommit sqlite3_api->get_autocommit +#define sqlite3_get_auxdata sqlite3_api->get_auxdata +#define sqlite3_get_table sqlite3_api->get_table +#ifndef SQLITE_OMIT_DEPRECATED +#define sqlite3_global_recover sqlite3_api->global_recover +#endif +#define sqlite3_interrupt sqlite3_api->interruptx +#define sqlite3_last_insert_rowid sqlite3_api->last_insert_rowid +#define sqlite3_libversion sqlite3_api->libversion +#define sqlite3_libversion_number sqlite3_api->libversion_number +#define sqlite3_malloc sqlite3_api->malloc +#define sqlite3_mprintf sqlite3_api->mprintf +#define sqlite3_open sqlite3_api->open +#define sqlite3_open16 sqlite3_api->open16 +#define sqlite3_prepare sqlite3_api->prepare +#define sqlite3_prepare16 sqlite3_api->prepare16 +#define sqlite3_prepare_v2 sqlite3_api->prepare_v2 +#define sqlite3_prepare16_v2 sqlite3_api->prepare16_v2 +#define sqlite3_profile sqlite3_api->profile +#define sqlite3_progress_handler sqlite3_api->progress_handler +#define sqlite3_realloc sqlite3_api->realloc +#define sqlite3_reset sqlite3_api->reset +#define sqlite3_result_blob sqlite3_api->result_blob +#define sqlite3_result_double sqlite3_api->result_double +#define sqlite3_result_error sqlite3_api->result_error +#define sqlite3_result_error16 sqlite3_api->result_error16 +#define sqlite3_result_int sqlite3_api->result_int +#define sqlite3_result_int64 sqlite3_api->result_int64 +#define sqlite3_result_null sqlite3_api->result_null +#define sqlite3_result_text sqlite3_api->result_text +#define sqlite3_result_text16 sqlite3_api->result_text16 +#define sqlite3_result_text16be sqlite3_api->result_text16be +#define sqlite3_result_text16le sqlite3_api->result_text16le +#define sqlite3_result_value sqlite3_api->result_value +#define sqlite3_rollback_hook sqlite3_api->rollback_hook +#define sqlite3_set_authorizer sqlite3_api->set_authorizer +#define sqlite3_set_auxdata sqlite3_api->set_auxdata +#define sqlite3_snprintf sqlite3_api->xsnprintf +#define sqlite3_step sqlite3_api->step +#define sqlite3_table_column_metadata sqlite3_api->table_column_metadata +#define sqlite3_thread_cleanup sqlite3_api->thread_cleanup +#define sqlite3_total_changes sqlite3_api->total_changes +#define sqlite3_trace sqlite3_api->trace +#ifndef SQLITE_OMIT_DEPRECATED +#define sqlite3_transfer_bindings sqlite3_api->transfer_bindings +#endif +#define sqlite3_update_hook sqlite3_api->update_hook +#define sqlite3_user_data sqlite3_api->user_data +#define sqlite3_value_blob sqlite3_api->value_blob +#define sqlite3_value_bytes sqlite3_api->value_bytes +#define sqlite3_value_bytes16 sqlite3_api->value_bytes16 +#define sqlite3_value_double sqlite3_api->value_double +#define sqlite3_value_int sqlite3_api->value_int +#define sqlite3_value_int64 sqlite3_api->value_int64 +#define sqlite3_value_numeric_type sqlite3_api->value_numeric_type +#define sqlite3_value_text sqlite3_api->value_text +#define sqlite3_value_text16 sqlite3_api->value_text16 +#define sqlite3_value_text16be sqlite3_api->value_text16be +#define sqlite3_value_text16le sqlite3_api->value_text16le +#define sqlite3_value_type sqlite3_api->value_type +#define sqlite3_vmprintf sqlite3_api->vmprintf +#define sqlite3_vsnprintf sqlite3_api->xvsnprintf +#define sqlite3_overload_function sqlite3_api->overload_function +#define sqlite3_prepare_v2 sqlite3_api->prepare_v2 +#define sqlite3_prepare16_v2 sqlite3_api->prepare16_v2 +#define sqlite3_clear_bindings sqlite3_api->clear_bindings +#define sqlite3_bind_zeroblob sqlite3_api->bind_zeroblob +#define sqlite3_blob_bytes sqlite3_api->blob_bytes +#define sqlite3_blob_close sqlite3_api->blob_close +#define sqlite3_blob_open sqlite3_api->blob_open +#define sqlite3_blob_read sqlite3_api->blob_read +#define sqlite3_blob_write sqlite3_api->blob_write +#define sqlite3_create_collation_v2 sqlite3_api->create_collation_v2 +#define sqlite3_file_control sqlite3_api->file_control +#define sqlite3_memory_highwater sqlite3_api->memory_highwater +#define sqlite3_memory_used sqlite3_api->memory_used +#define sqlite3_mutex_alloc sqlite3_api->mutex_alloc +#define sqlite3_mutex_enter sqlite3_api->mutex_enter +#define sqlite3_mutex_free sqlite3_api->mutex_free +#define sqlite3_mutex_leave sqlite3_api->mutex_leave +#define sqlite3_mutex_try sqlite3_api->mutex_try +#define sqlite3_open_v2 sqlite3_api->open_v2 +#define sqlite3_release_memory sqlite3_api->release_memory +#define sqlite3_result_error_nomem sqlite3_api->result_error_nomem +#define sqlite3_result_error_toobig sqlite3_api->result_error_toobig +#define sqlite3_sleep sqlite3_api->sleep +#define sqlite3_soft_heap_limit sqlite3_api->soft_heap_limit +#define sqlite3_vfs_find sqlite3_api->vfs_find +#define sqlite3_vfs_register sqlite3_api->vfs_register +#define sqlite3_vfs_unregister sqlite3_api->vfs_unregister +#define sqlite3_threadsafe sqlite3_api->xthreadsafe +#define sqlite3_result_zeroblob sqlite3_api->result_zeroblob +#define sqlite3_result_error_code sqlite3_api->result_error_code +#define sqlite3_test_control sqlite3_api->test_control +#define sqlite3_randomness sqlite3_api->randomness +#define sqlite3_context_db_handle sqlite3_api->context_db_handle +#define sqlite3_extended_result_codes sqlite3_api->extended_result_codes +#define sqlite3_limit sqlite3_api->limit +#define sqlite3_next_stmt sqlite3_api->next_stmt +#define sqlite3_sql sqlite3_api->sql +#define sqlite3_status sqlite3_api->status +#define sqlite3_backup_finish sqlite3_api->backup_finish +#define sqlite3_backup_init sqlite3_api->backup_init +#define sqlite3_backup_pagecount sqlite3_api->backup_pagecount +#define sqlite3_backup_remaining sqlite3_api->backup_remaining +#define sqlite3_backup_step sqlite3_api->backup_step +#define sqlite3_compileoption_get sqlite3_api->compileoption_get +#define sqlite3_compileoption_used sqlite3_api->compileoption_used +#define sqlite3_create_function_v2 sqlite3_api->create_function_v2 +#define sqlite3_db_config sqlite3_api->db_config +#define sqlite3_db_mutex sqlite3_api->db_mutex +#define sqlite3_db_status sqlite3_api->db_status +#define sqlite3_extended_errcode sqlite3_api->extended_errcode +#define sqlite3_log sqlite3_api->log +#define sqlite3_soft_heap_limit64 sqlite3_api->soft_heap_limit64 +#define sqlite3_sourceid sqlite3_api->sourceid +#define sqlite3_stmt_status sqlite3_api->stmt_status +#define sqlite3_strnicmp sqlite3_api->strnicmp +#define sqlite3_unlock_notify sqlite3_api->unlock_notify +#define sqlite3_wal_autocheckpoint sqlite3_api->wal_autocheckpoint +#define sqlite3_wal_checkpoint sqlite3_api->wal_checkpoint +#define sqlite3_wal_hook sqlite3_api->wal_hook +#define sqlite3_blob_reopen sqlite3_api->blob_reopen +#define sqlite3_vtab_config sqlite3_api->vtab_config +#define sqlite3_vtab_on_conflict sqlite3_api->vtab_on_conflict +/* Version 3.7.16 and later */ +#define sqlite3_close_v2 sqlite3_api->close_v2 +#define sqlite3_db_filename sqlite3_api->db_filename +#define sqlite3_db_readonly sqlite3_api->db_readonly +#define sqlite3_db_release_memory sqlite3_api->db_release_memory +#define sqlite3_errstr sqlite3_api->errstr +#define sqlite3_stmt_busy sqlite3_api->stmt_busy +#define sqlite3_stmt_readonly sqlite3_api->stmt_readonly +#define sqlite3_stricmp sqlite3_api->stricmp +#define sqlite3_uri_boolean sqlite3_api->uri_boolean +#define sqlite3_uri_int64 sqlite3_api->uri_int64 +#define sqlite3_uri_parameter sqlite3_api->uri_parameter +#define sqlite3_uri_vsnprintf sqlite3_api->xvsnprintf +#define sqlite3_wal_checkpoint_v2 sqlite3_api->wal_checkpoint_v2 +/* Version 3.8.7 and later */ +#define sqlite3_auto_extension sqlite3_api->auto_extension +#define sqlite3_bind_blob64 sqlite3_api->bind_blob64 +#define sqlite3_bind_text64 sqlite3_api->bind_text64 +#define sqlite3_cancel_auto_extension sqlite3_api->cancel_auto_extension +#define sqlite3_load_extension sqlite3_api->load_extension +#define sqlite3_malloc64 sqlite3_api->malloc64 +#define sqlite3_msize sqlite3_api->msize +#define sqlite3_realloc64 sqlite3_api->realloc64 +#define sqlite3_reset_auto_extension sqlite3_api->reset_auto_extension +#define sqlite3_result_blob64 sqlite3_api->result_blob64 +#define sqlite3_result_text64 sqlite3_api->result_text64 +#define sqlite3_strglob sqlite3_api->strglob +/* Version 3.8.11 and later */ +#define sqlite3_value_dup sqlite3_api->value_dup +#define sqlite3_value_free sqlite3_api->value_free +#define sqlite3_result_zeroblob64 sqlite3_api->result_zeroblob64 +#define sqlite3_bind_zeroblob64 sqlite3_api->bind_zeroblob64 +/* Version 3.9.0 and later */ +#define sqlite3_value_subtype sqlite3_api->value_subtype +#define sqlite3_result_subtype sqlite3_api->result_subtype +/* Version 3.10.0 and later */ +#define sqlite3_status64 sqlite3_api->status64 +#define sqlite3_strlike sqlite3_api->strlike +#define sqlite3_db_cacheflush sqlite3_api->db_cacheflush +/* Version 3.12.0 and later */ +#define sqlite3_system_errno sqlite3_api->system_errno +/* Version 3.14.0 and later */ +#define sqlite3_trace_v2 sqlite3_api->trace_v2 +#define sqlite3_expanded_sql sqlite3_api->expanded_sql +/* Version 3.18.0 and later */ +#define sqlite3_set_last_insert_rowid sqlite3_api->set_last_insert_rowid +/* Version 3.20.0 and later */ +#define sqlite3_prepare_v3 sqlite3_api->prepare_v3 +#define sqlite3_prepare16_v3 sqlite3_api->prepare16_v3 +#define sqlite3_bind_pointer sqlite3_api->bind_pointer +#define sqlite3_result_pointer sqlite3_api->result_pointer +#define sqlite3_value_pointer sqlite3_api->value_pointer +/* Version 3.22.0 and later */ +#define sqlite3_vtab_nochange sqlite3_api->vtab_nochange +#define sqlite3_value_nochange sqlite3_api->value_nochange +#define sqlite3_vtab_collation sqlite3_api->vtab_collation +/* Version 3.24.0 and later */ +#define sqlite3_keyword_count sqlite3_api->keyword_count +#define sqlite3_keyword_name sqlite3_api->keyword_name +#define sqlite3_keyword_check sqlite3_api->keyword_check +#define sqlite3_str_new sqlite3_api->str_new +#define sqlite3_str_finish sqlite3_api->str_finish +#define sqlite3_str_appendf sqlite3_api->str_appendf +#define sqlite3_str_vappendf sqlite3_api->str_vappendf +#define sqlite3_str_append sqlite3_api->str_append +#define sqlite3_str_appendall sqlite3_api->str_appendall +#define sqlite3_str_appendchar sqlite3_api->str_appendchar +#define sqlite3_str_reset sqlite3_api->str_reset +#define sqlite3_str_errcode sqlite3_api->str_errcode +#define sqlite3_str_length sqlite3_api->str_length +#define sqlite3_str_value sqlite3_api->str_value +/* Version 3.25.0 and later */ +#define sqlite3_create_window_function sqlite3_api->create_window_function +/* Version 3.26.0 and later */ +#define sqlite3_normalized_sql sqlite3_api->normalized_sql +/* Version 3.28.0 and later */ +#define sqlite3_stmt_isexplain sqlite3_api->stmt_isexplain +#define sqlite3_value_frombind sqlite3_api->value_frombind +/* Version 3.30.0 and later */ +#define sqlite3_drop_modules sqlite3_api->drop_modules +/* Version 3.31.0 and later */ +#define sqlite3_hard_heap_limit64 sqlite3_api->hard_heap_limit64 +#define sqlite3_uri_key sqlite3_api->uri_key +#define sqlite3_filename_database sqlite3_api->filename_database +#define sqlite3_filename_journal sqlite3_api->filename_journal +#define sqlite3_filename_wal sqlite3_api->filename_wal +/* Version 3.32.0 and later */ +#define sqlite3_create_filename sqlite3_api->create_filename +#define sqlite3_free_filename sqlite3_api->free_filename +#define sqlite3_database_file_object sqlite3_api->database_file_object +/* Version 3.34.0 and later */ +#define sqlite3_txn_state sqlite3_api->txn_state +/* Version 3.36.1 and later */ +#define sqlite3_changes64 sqlite3_api->changes64 +#define sqlite3_total_changes64 sqlite3_api->total_changes64 +/* Version 3.37.0 and later */ +#define sqlite3_autovacuum_pages sqlite3_api->autovacuum_pages +/* Version 3.38.0 and later */ +#define sqlite3_error_offset sqlite3_api->error_offset +#define sqlite3_vtab_rhs_value sqlite3_api->vtab_rhs_value +#define sqlite3_vtab_distinct sqlite3_api->vtab_distinct +#define sqlite3_vtab_in sqlite3_api->vtab_in +#define sqlite3_vtab_in_first sqlite3_api->vtab_in_first +#define sqlite3_vtab_in_next sqlite3_api->vtab_in_next +/* Version 3.39.0 and later */ +#ifndef SQLITE_OMIT_DESERIALIZE +#define sqlite3_deserialize sqlite3_api->deserialize +#define sqlite3_serialize sqlite3_api->serialize +#endif +#define sqlite3_db_name sqlite3_api->db_name +/* Version 3.40.0 and later */ +#define sqlite3_value_encoding sqlite3_api->value_encoding +/* Version 3.41.0 and later */ +#define sqlite3_is_interrupted sqlite3_api->is_interrupted +/* Version 3.43.0 and later */ +#define sqlite3_stmt_explain sqlite3_api->stmt_explain +/* Version 3.44.0 and later */ +#define sqlite3_get_clientdata sqlite3_api->get_clientdata +#define sqlite3_set_clientdata sqlite3_api->set_clientdata +#endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */ + +#if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) + /* This case when the file really is being compiled as a loadable + ** extension */ +# define SQLITE_EXTENSION_INIT1 const sqlite3_api_routines *sqlite3_api=0; +# define SQLITE_EXTENSION_INIT2(v) sqlite3_api=v; +# define SQLITE_EXTENSION_INIT3 \ + extern const sqlite3_api_routines *sqlite3_api; +#else + /* This case when the file is being statically linked into the + ** application */ +# define SQLITE_EXTENSION_INIT1 /*no-op*/ +# define SQLITE_EXTENSION_INIT2(v) (void)v; /* unused parameter */ +# define SQLITE_EXTENSION_INIT3 /*no-op*/ +#endif + +#endif /* SQLITE3EXT_H */ diff --git a/deps/sqlite/unofficial.gni b/deps/sqlite/unofficial.gni index 6eda916ad23e07..a4fb26e70560f3 100644 --- a/deps/sqlite/unofficial.gni +++ b/deps/sqlite/unofficial.gni @@ -7,6 +7,11 @@ template("sqlite_gn_build") { config("sqlite_config") { include_dirs = [ "." ] + defines = [ + "SQLITE_ENABLE_MATH_FUNCTIONS", + "SQLITE_ENABLE_SESSION", + "SQLITE_ENABLE_PREUPDATE_HOOK", + ] } gypi_values = exec_script("../../tools/gypi_to_gn.py", diff --git a/deps/undici/src/CONTRIBUTING.md b/deps/undici/src/CONTRIBUTING.md index 68c9b977f1a862..ce0b68da4e6d57 100644 --- a/deps/undici/src/CONTRIBUTING.md +++ b/deps/undici/src/CONTRIBUTING.md @@ -8,7 +8,7 @@ * [Releases](#releases) * [Update `WPTs`](#update-wpts) * [Building for externally shared node builtins](#external-builds) - * [Benchmarks](#benchmarks + * [Benchmarks](#benchmarks) * [Documentation](#documentation) * [Developer's Certificate of Origin 1.1](#developers-certificate-of-origin) * [Moderation Policy](#moderation-policy) @@ -104,7 +104,6 @@ git node wpt resources git node wpt interfaces git node wpt common git node wpt fetch -git node wpt FileAPI git node wpt xhr git node wpt websockets git node wpt mimesniff diff --git a/deps/undici/src/GOVERNANCE.md b/deps/undici/src/GOVERNANCE.md index 3e88d4bb139ff0..dc1223cb07f641 100644 --- a/deps/undici/src/GOVERNANCE.md +++ b/deps/undici/src/GOVERNANCE.md @@ -50,7 +50,7 @@ request or issue. The WG should serve as the final arbiter where required. For the current list of Collaborators, see the project -[README.md](./README.md#collaborators). The list shall be in an +[README.md](./README.md#collaborators). The list should be in alphabetical order. ### WG Membership diff --git a/deps/undici/src/README.md b/deps/undici/src/README.md index 2ac58b6695e6b3..b47a5fe367c801 100644 --- a/deps/undici/src/README.md +++ b/deps/undici/src/README.md @@ -1,6 +1,6 @@ # undici -[![Node CI](https://github.com/nodejs/undici/actions/workflows/nodejs.yml/badge.svg)](https://github.com/nodejs/undici/actions/workflows/nodejs.yml) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](http://standardjs.com/) [![npm version](https://badge.fury.io/js/undici.svg)](https://badge.fury.io/js/undici) [![codecov](https://codecov.io/gh/nodejs/undici/branch/main/graph/badge.svg?token=yZL6LtXkOA)](https://codecov.io/gh/nodejs/undici) +[![Node CI](https://github.com/nodejs/undici/actions/workflows/nodejs.yml/badge.svg)](https://github.com/nodejs/undici/actions/workflows/nodejs.yml) [![neostandard javascript style](https://img.shields.io/badge/neo-standard-7fffff?style=flat\&labelColor=ff80ff)](https://github.com/neostandard/neostandard) [![npm version](https://badge.fury.io/js/undici.svg)](https://badge.fury.io/js/undici) [![codecov](https://codecov.io/gh/nodejs/undici/branch/main/graph/badge.svg?token=yZL6LtXkOA)](https://codecov.io/gh/nodejs/undici) An HTTP/1.1 client, written from scratch for Node.js. @@ -22,41 +22,26 @@ npm i undici ## Benchmarks The benchmark is a simple getting data [example](https://github.com/nodejs/undici/blob/main/benchmarks/benchmark.js) using a -50 TCP connections with a pipelining depth of 10 running on Node 20.10.0. - -| _Tests_ | _Samples_ | _Result_ | _Tolerance_ | _Difference with slowest_ | -| :-----------------: | :-------: | :--------------: | :---------: | :-----------------------: | -| undici - fetch | 30 | 3704.43 req/sec | ± 2.95 % | - | -| http - no keepalive | 20 | 4275.30 req/sec | ± 2.60 % | + 15.41 % | -| node-fetch | 10 | 4759.42 req/sec | ± 0.87 % | + 28.48 % | -| request | 40 | 4803.37 req/sec | ± 2.77 % | + 29.67 % | -| axios | 45 | 4951.97 req/sec | ± 2.88 % | + 33.68 % | -| got | 10 | 5969.67 req/sec | ± 2.64 % | + 61.15 % | -| superagent | 10 | 9471.48 req/sec | ± 1.50 % | + 155.68 % | -| http - keepalive | 25 | 10327.49 req/sec | ± 2.95 % | + 178.79 % | -| undici - pipeline | 10 | 15053.41 req/sec | ± 1.63 % | + 306.36 % | -| undici - request | 10 | 19264.24 req/sec | ± 1.74 % | + 420.03 % | -| undici - stream | 15 | 20317.29 req/sec | ± 2.13 % | + 448.46 % | -| undici - dispatch | 10 | 24883.28 req/sec | ± 1.54 % | + 571.72 % | - -The benchmark is a simple sending data [example](https://github.com/nodejs/undici/blob/main/benchmarks/post-benchmark.js) using a -50 TCP connections with a pipelining depth of 10 running on Node 20.10.0. - -| _Tests_ | _Samples_ | _Result_ | _Tolerance_ | _Difference with slowest_ | -| :-----------------: | :-------: | :-------------: | :---------: | :-----------------------: | -| undici - fetch | 20 | 1968.42 req/sec | ± 2.63 % | - | -| http - no keepalive | 25 | 2330.30 req/sec | ± 2.99 % | + 18.38 % | -| node-fetch | 20 | 2485.36 req/sec | ± 2.70 % | + 26.26 % | -| got | 15 | 2787.68 req/sec | ± 2.56 % | + 41.62 % | -| request | 30 | 2805.10 req/sec | ± 2.59 % | + 42.50 % | -| axios | 10 | 3040.45 req/sec | ± 1.72 % | + 54.46 % | -| superagent | 20 | 3358.29 req/sec | ± 2.51 % | + 70.61 % | -| http - keepalive | 20 | 3477.94 req/sec | ± 2.51 % | + 76.69 % | -| undici - pipeline | 25 | 3812.61 req/sec | ± 2.80 % | + 93.69 % | -| undici - request | 10 | 6067.00 req/sec | ± 0.94 % | + 208.22 % | -| undici - stream | 10 | 6391.61 req/sec | ± 1.98 % | + 224.71 % | -| undici - dispatch | 10 | 6397.00 req/sec | ± 1.48 % | + 224.98 % | +50 TCP connections with a pipelining depth of 10 running on Node 22.11.0. +``` +┌────────────────────────┬─────────┬────────────────────┬────────────┬─────────────────────────┐ +│ Tests │ Samples │ Result │ Tolerance │ Difference with slowest │ +├────────────────────────┼─────────┼────────────────────┼────────────┼─────────────────────────┤ +│ 'axios' │ 15 │ '5708.26 req/sec' │ '± 2.91 %' │ '-' │ +│ 'http - no keepalive' │ 10 │ '5809.80 req/sec' │ '± 2.30 %' │ '+ 1.78 %' │ +│ 'request' │ 30 │ '5828.80 req/sec' │ '± 2.91 %' │ '+ 2.11 %' │ +│ 'undici - fetch' │ 40 │ '5903.78 req/sec' │ '± 2.87 %' │ '+ 3.43 %' │ +│ 'node-fetch' │ 10 │ '5945.40 req/sec' │ '± 2.13 %' │ '+ 4.15 %' │ +│ 'got' │ 35 │ '6511.45 req/sec' │ '± 2.84 %' │ '+ 14.07 %' │ +│ 'http - keepalive' │ 65 │ '9193.24 req/sec' │ '± 2.92 %' │ '+ 61.05 %' │ +│ 'superagent' │ 35 │ '9339.43 req/sec' │ '± 2.95 %' │ '+ 63.61 %' │ +│ 'undici - pipeline' │ 50 │ '13364.62 req/sec' │ '± 2.93 %' │ '+ 134.13 %' │ +│ 'undici - stream' │ 95 │ '18245.36 req/sec' │ '± 2.99 %' │ '+ 219.63 %' │ +│ 'undici - request' │ 50 │ '18340.17 req/sec' │ '± 2.84 %' │ '+ 221.29 %' │ +│ 'undici - dispatch' │ 40 │ '22234.42 req/sec' │ '± 2.94 %' │ '+ 289.51 %' │ +└────────────────────────┴─────────┴────────────────────┴────────────┴─────────────────────────┘ +``` ## Quick Start @@ -127,13 +112,12 @@ Arguments: * **options** [`RequestOptions`](./docs/docs/api/Dispatcher.md#parameter-requestoptions) * **dispatcher** `Dispatcher` - Default: [getGlobalDispatcher](#undicigetglobaldispatcher) * **method** `String` - Default: `PUT` if `options.body`, otherwise `GET` - * **maxRedirections** `Integer` - Default: `0` Returns a promise with the result of the `Dispatcher.request` method. Calls `options.dispatcher.request(options)`. -See [Dispatcher.request](./docs/docs/api/Dispatcher.md#dispatcherrequestoptions-callback) for more details, and [request examples](./examples/README.md) for examples. +See [Dispatcher.request](./docs/docs/api/Dispatcher.md#dispatcherrequestoptions-callback) for more details, and [request examples](./docs/examples/README.md) for examples. ### `undici.stream([url, options, ]factory): Promise` @@ -143,7 +127,6 @@ Arguments: * **options** [`StreamOptions`](./docs/docs/api/Dispatcher.md#parameter-streamoptions) * **dispatcher** `Dispatcher` - Default: [getGlobalDispatcher](#undicigetglobaldispatcher) * **method** `String` - Default: `PUT` if `options.body`, otherwise `GET` - * **maxRedirections** `Integer` - Default: `0` * **factory** `Dispatcher.stream.factory` Returns a promise with the result of the `Dispatcher.stream` method. @@ -160,7 +143,6 @@ Arguments: * **options** [`PipelineOptions`](./docs/docs/api/Dispatcher.md#parameter-pipelineoptions) * **dispatcher** `Dispatcher` - Default: [getGlobalDispatcher](#undicigetglobaldispatcher) * **method** `String` - Default: `PUT` if `options.body`, otherwise `GET` - * **maxRedirections** `Integer` - Default: `0` * **handler** `Dispatcher.pipeline.handler` Returns: `stream.Duplex` @@ -178,7 +160,6 @@ Arguments: * **url** `string | URL | UrlObject` * **options** [`ConnectOptions`](./docs/docs/api/Dispatcher.md#parameter-connectoptions) * **dispatcher** `Dispatcher` - Default: [getGlobalDispatcher](#undicigetglobaldispatcher) - * **maxRedirections** `Integer` - Default: `0` * **callback** `(err: Error | null, data: ConnectData | null) => void` (optional) Returns a promise with the result of the `Dispatcher.connect` method. @@ -234,7 +215,7 @@ A body can be of the following types: - URLSearchParams - FormData -In this implementation of fetch, ```request.body``` now accepts ```Async Iterables```. It is not present in the [Fetch Standard.](https://fetch.spec.whatwg.org) +In this implementation of fetch, ```request.body``` now accepts ```Async Iterables```. It is not present in the [Fetch Standard](https://fetch.spec.whatwg.org). ```js import { fetch } from 'undici' @@ -263,13 +244,13 @@ await fetch('http://example.com', { method: 'POST', body }) #### `request.duplex` -- half +- `'half'` -In this implementation of fetch, `request.duplex` must be set if `request.body` is `ReadableStream` or `Async Iterables`, however, fetch requests are currently always full duplex. For more detail refer to the [Fetch Standard.](https://fetch.spec.whatwg.org/#dom-requestinit-duplex). +In this implementation of fetch, `request.duplex` must be set if `request.body` is `ReadableStream` or `Async Iterables`, however, even though the value must be set to `'half'`, it is actually a _full_ duplex. For more detail refer to the [Fetch Standard](https://fetch.spec.whatwg.org/#dom-requestinit-duplex). #### `response.body` -Nodejs has two kinds of streams: [web streams](https://nodejs.org/dist/latest-v16.x/docs/api/webstreams.html), which follow the API of the WHATWG web standard found in browsers, and an older Node-specific [streams API](https://nodejs.org/api/stream.html). `response.body` returns a readable web stream. If you would prefer to work with a Node stream you can convert a web stream using `.fromWeb()`. +Nodejs has two kinds of streams: [web streams](https://nodejs.org/api/webstreams.html), which follow the API of the WHATWG web standard found in browsers, and an older Node-specific [streams API](https://nodejs.org/api/stream.html). `response.body` returns a readable web stream. If you would prefer to work with a Node stream you can convert a web stream using `.fromWeb()`. ```js import { fetch } from 'undici' @@ -300,17 +281,23 @@ stalls or deadlocks when running out of connections. ```js // Do -const headers = await fetch(url) - .then(async res => { - for await (const chunk of res.body) { - // force consumption of body - } - return res.headers - }) +const { body, headers } = await fetch(url); +for await (const chunk of body) { + // force consumption of body +} // Do not -const headers = await fetch(url) - .then(res => res.headers) +const { headers } = await fetch(url); +``` + +The same applies for `request` too: +```js +// Do +const { body, headers } = await request(url); +await res.body.dump(); // force consumption of body + +// Do not +const { headers } = await request(url); ``` However, if you want to get only headers, it might be better to use `HEAD` request method. Usage of this method will obviate the need for consumption or cancelling of the response body. See [MDN - HTTP - HTTP request methods - HEAD](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/HEAD) for more details. @@ -338,7 +325,6 @@ Arguments: * **url** `string | URL | UrlObject` * **options** [`UpgradeOptions`](./docs/docs/api/Dispatcher.md#parameter-upgradeoptions) * **dispatcher** `Dispatcher` - Default: [getGlobalDispatcher](#undicigetglobaldispatcher) - * **maxRedirections** `Integer` - Default: `0` * **callback** `(error: Error | null, data: UpgradeData) => void` (optional) Returns a promise with the result of the `Dispatcher.upgrade` method. @@ -407,7 +393,8 @@ Refs: https://tools.ietf.org/html/rfc7231#section-5.1.1 ### Pipelining Undici will only use pipelining if configured with a `pipelining` factor -greater than `1`. +greater than `1`. Also it is important to pass `blocking: false` to the +request options to properly pipeline requests. Undici always assumes that connections are persistent and will immediately pipeline requests, without checking whether the connection is persistent. @@ -453,6 +440,8 @@ and `undici.Agent`) which will enable the family autoselection algorithm when es * [__Matthew Aitken__](https://github.com/KhafraDev), * [__Robert Nagy__](https://github.com/ronag), * [__Szymon Marczak__](https://github.com/szmarczak), + +## Past Collaborators * [__Tomas Della Vedova__](https://github.com/delvedor), ### Releasers @@ -462,6 +451,16 @@ and `undici.Agent`) which will enable the family autoselection algorithm when es * [__Robert Nagy__](https://github.com/ronag), * [__Matthew Aitken__](https://github.com/KhafraDev), +## Long Term Support + +Undici aligns with the Node.js LTS schedule. The following table shows the supported versions: + +| Version | Node.js | End of Life | +|---------|-------------|-------------| +| 5.x | v18.x | 2024-04-30 | +| 6.x | v20.x v22.x | 2026-04-30 | +| 7.x | v24.x | 2027-04-30 | + ## License MIT diff --git a/deps/undici/src/build/Dockerfile b/deps/undici/src/build/Dockerfile deleted file mode 100644 index 8bcab469b6050b..00000000000000 --- a/deps/undici/src/build/Dockerfile +++ /dev/null @@ -1,25 +0,0 @@ -FROM node:22-alpine3.19@sha256:075a5cc188c3c9a49acacd481a9e8a3c9abf4223f02c658e37fdb8e9fe2c4664 - -ARG UID=1000 -ARG GID=1000 -ARG BINARYEN_VERSION=116 - -RUN apk add -U clang lld wasi-sdk -RUN mkdir /home/node/undici - -WORKDIR /home/node/undici - -RUN wget https://github.com/WebAssembly/binaryen/releases/download/version_$BINARYEN_VERSION/binaryen-version_$BINARYEN_VERSION-x86_64-linux.tar.gz && \ - tar -zxvf binaryen-version_$BINARYEN_VERSION-x86_64-linux.tar.gz binaryen-version_$BINARYEN_VERSION/bin/wasm-opt && \ - mv binaryen-version_$BINARYEN_VERSION/bin/wasm-opt ./ && \ - rm binaryen-version_$BINARYEN_VERSION-x86_64-linux.tar.gz && \ - rm -rf binaryen-version_$BINARYEN_VERSION && \ - chmod +x ./wasm-opt - -COPY package.json . - -COPY build build -COPY deps deps -COPY lib lib - -USER node diff --git a/deps/undici/src/build/wasm.js b/deps/undici/src/build/wasm.js index 1880ce3dfe4a4c..46cd273a3a274f 100644 --- a/deps/undici/src/build/wasm.js +++ b/deps/undici/src/build/wasm.js @@ -1,5 +1,7 @@ 'use strict' +const WASM_BUILDER_CONTAINER = 'ghcr.io/nodejs/wasm-builder@sha256:975f391d907e42a75b8c72eb77c782181e941608687d4d8694c3e9df415a0970' // v0.0.9 + const { execSync } = require('node:child_process') const { writeFileSync, readFileSync } = require('node:fs') const { join, resolve } = require('node:path') @@ -7,7 +9,6 @@ const { join, resolve } = require('node:path') const ROOT = resolve(__dirname, '../') const WASM_SRC = resolve(__dirname, '../deps/llhttp') const WASM_OUT = resolve(__dirname, '../lib/llhttp') -const DOCKERFILE = resolve(__dirname, './Dockerfile') // These are defined by build environment const WASM_CC = process.env.WASM_CC || 'clang' @@ -33,7 +34,17 @@ const writeWasmChunk = (path, dest) => { const { Buffer } = require('node:buffer') -module.exports = Buffer.from('${base64}', 'base64') +const wasmBase64 = '${base64}' + +let wasmBuffer + +Object.defineProperty(module, 'exports', { + get: () => { + return wasmBuffer + ? wasmBuffer + : (wasmBuffer = Buffer.from(wasmBase64, 'base64')) + } +}) `) } @@ -42,33 +53,16 @@ if (!platform && process.argv[2]) { platform = execSync('docker info -f "{{.OSType}}/{{.Architecture}}"').toString().trim() } -if (process.argv[2] === '--rm') { - const cmd = 'docker image rm llhttp_wasm_builder' - - console.log(`> ${cmd}\n\n`) - try { - execSync(cmd, { stdio: 'inherit' }) - } catch (e) {} - - process.exit(0) -} - -if (process.argv[2] === '--prebuild') { - const cmd = `docker build --platform=${platform.toString().trim()} -t llhttp_wasm_builder -f ${DOCKERFILE} ${ROOT}` - - console.log(`> ${cmd}\n\n`) - execSync(cmd, { stdio: 'inherit' }) - - process.exit(0) -} - if (process.argv[2] === '--docker') { - let cmd = `docker run --rm -t --platform=${platform.toString().trim()}` + let cmd = `docker run --rm --platform=${platform.toString().trim()} ` if (process.platform === 'linux') { cmd += ` --user ${process.getuid()}:${process.getegid()}` } - cmd += ` --mount type=bind,source=${ROOT}/lib/llhttp,target=/home/node/undici/lib/llhttp llhttp_wasm_builder node build/wasm.js` + cmd += ` --mount type=bind,source=${ROOT}/lib/llhttp,target=/home/node/build/lib/llhttp \ + --mount type=bind,source=${ROOT}/build,target=/home/node/build/build \ + --mount type=bind,source=${ROOT}/deps,target=/home/node/build/deps \ + -t ${WASM_BUILDER_CONTAINER} node build/wasm.js` console.log(`> ${cmd}\n\n`) execSync(cmd, { stdio: 'inherit' }) process.exit(0) diff --git a/deps/undici/src/deps/llhttp/include/api.h b/deps/undici/src/deps/llhttp/include/api.h new file mode 100644 index 00000000000000..f1b8e506bd785f --- /dev/null +++ b/deps/undici/src/deps/llhttp/include/api.h @@ -0,0 +1,357 @@ +#ifndef INCLUDE_LLHTTP_API_H_ +#define INCLUDE_LLHTTP_API_H_ +#ifdef __cplusplus +extern "C" { +#endif +#include + +#if defined(__wasm__) +#define LLHTTP_EXPORT __attribute__((visibility("default"))) +#elif defined(_WIN32) +#define LLHTTP_EXPORT __declspec(dllexport) +#else +#define LLHTTP_EXPORT +#endif + +typedef llhttp__internal_t llhttp_t; +typedef struct llhttp_settings_s llhttp_settings_t; + +typedef int (*llhttp_data_cb)(llhttp_t*, const char *at, size_t length); +typedef int (*llhttp_cb)(llhttp_t*); + +struct llhttp_settings_s { + /* Possible return values 0, -1, `HPE_PAUSED` */ + llhttp_cb on_message_begin; + + /* Possible return values 0, -1, HPE_USER */ + llhttp_data_cb on_url; + llhttp_data_cb on_status; + llhttp_data_cb on_method; + llhttp_data_cb on_version; + llhttp_data_cb on_header_field; + llhttp_data_cb on_header_value; + llhttp_data_cb on_chunk_extension_name; + llhttp_data_cb on_chunk_extension_value; + + /* Possible return values: + * 0 - Proceed normally + * 1 - Assume that request/response has no body, and proceed to parsing the + * next message + * 2 - Assume absence of body (as above) and make `llhttp_execute()` return + * `HPE_PAUSED_UPGRADE` + * -1 - Error + * `HPE_PAUSED` + */ + llhttp_cb on_headers_complete; + + /* Possible return values 0, -1, HPE_USER */ + llhttp_data_cb on_body; + + /* Possible return values 0, -1, `HPE_PAUSED` */ + llhttp_cb on_message_complete; + llhttp_cb on_url_complete; + llhttp_cb on_status_complete; + llhttp_cb on_method_complete; + llhttp_cb on_version_complete; + llhttp_cb on_header_field_complete; + llhttp_cb on_header_value_complete; + llhttp_cb on_chunk_extension_name_complete; + llhttp_cb on_chunk_extension_value_complete; + + /* When on_chunk_header is called, the current chunk length is stored + * in parser->content_length. + * Possible return values 0, -1, `HPE_PAUSED` + */ + llhttp_cb on_chunk_header; + llhttp_cb on_chunk_complete; + llhttp_cb on_reset; +}; + +/* Initialize the parser with specific type and user settings. + * + * NOTE: lifetime of `settings` has to be at least the same as the lifetime of + * the `parser` here. In practice, `settings` has to be either a static + * variable or be allocated with `malloc`, `new`, etc. + */ +LLHTTP_EXPORT +void llhttp_init(llhttp_t* parser, llhttp_type_t type, + const llhttp_settings_t* settings); + +LLHTTP_EXPORT +llhttp_t* llhttp_alloc(llhttp_type_t type); + +LLHTTP_EXPORT +void llhttp_free(llhttp_t* parser); + +LLHTTP_EXPORT +uint8_t llhttp_get_type(llhttp_t* parser); + +LLHTTP_EXPORT +uint8_t llhttp_get_http_major(llhttp_t* parser); + +LLHTTP_EXPORT +uint8_t llhttp_get_http_minor(llhttp_t* parser); + +LLHTTP_EXPORT +uint8_t llhttp_get_method(llhttp_t* parser); + +LLHTTP_EXPORT +int llhttp_get_status_code(llhttp_t* parser); + +LLHTTP_EXPORT +uint8_t llhttp_get_upgrade(llhttp_t* parser); + +/* Reset an already initialized parser back to the start state, preserving the + * existing parser type, callback settings, user data, and lenient flags. + */ +LLHTTP_EXPORT +void llhttp_reset(llhttp_t* parser); + +/* Initialize the settings object */ +LLHTTP_EXPORT +void llhttp_settings_init(llhttp_settings_t* settings); + +/* Parse full or partial request/response, invoking user callbacks along the + * way. + * + * If any of `llhttp_data_cb` returns errno not equal to `HPE_OK` - the parsing + * interrupts, and such errno is returned from `llhttp_execute()`. If + * `HPE_PAUSED` was used as a errno, the execution can be resumed with + * `llhttp_resume()` call. + * + * In a special case of CONNECT/Upgrade request/response `HPE_PAUSED_UPGRADE` + * is returned after fully parsing the request/response. If the user wishes to + * continue parsing, they need to invoke `llhttp_resume_after_upgrade()`. + * + * NOTE: if this function ever returns a non-pause type error, it will continue + * to return the same error upon each successive call up until `llhttp_init()` + * is called. + */ +LLHTTP_EXPORT +llhttp_errno_t llhttp_execute(llhttp_t* parser, const char* data, size_t len); + +/* This method should be called when the other side has no further bytes to + * send (e.g. shutdown of readable side of the TCP connection.) + * + * Requests without `Content-Length` and other messages might require treating + * all incoming bytes as the part of the body, up to the last byte of the + * connection. This method will invoke `on_message_complete()` callback if the + * request was terminated safely. Otherwise a error code would be returned. + */ +LLHTTP_EXPORT +llhttp_errno_t llhttp_finish(llhttp_t* parser); + +/* Returns `1` if the incoming message is parsed until the last byte, and has + * to be completed by calling `llhttp_finish()` on EOF + */ +LLHTTP_EXPORT +int llhttp_message_needs_eof(const llhttp_t* parser); + +/* Returns `1` if there might be any other messages following the last that was + * successfully parsed. + */ +LLHTTP_EXPORT +int llhttp_should_keep_alive(const llhttp_t* parser); + +/* Make further calls of `llhttp_execute()` return `HPE_PAUSED` and set + * appropriate error reason. + * + * Important: do not call this from user callbacks! User callbacks must return + * `HPE_PAUSED` if pausing is required. + */ +LLHTTP_EXPORT +void llhttp_pause(llhttp_t* parser); + +/* Might be called to resume the execution after the pause in user's callback. + * See `llhttp_execute()` above for details. + * + * Call this only if `llhttp_execute()` returns `HPE_PAUSED`. + */ +LLHTTP_EXPORT +void llhttp_resume(llhttp_t* parser); + +/* Might be called to resume the execution after the pause in user's callback. + * See `llhttp_execute()` above for details. + * + * Call this only if `llhttp_execute()` returns `HPE_PAUSED_UPGRADE` + */ +LLHTTP_EXPORT +void llhttp_resume_after_upgrade(llhttp_t* parser); + +/* Returns the latest return error */ +LLHTTP_EXPORT +llhttp_errno_t llhttp_get_errno(const llhttp_t* parser); + +/* Returns the verbal explanation of the latest returned error. + * + * Note: User callback should set error reason when returning the error. See + * `llhttp_set_error_reason()` for details. + */ +LLHTTP_EXPORT +const char* llhttp_get_error_reason(const llhttp_t* parser); + +/* Assign verbal description to the returned error. Must be called in user + * callbacks right before returning the errno. + * + * Note: `HPE_USER` error code might be useful in user callbacks. + */ +LLHTTP_EXPORT +void llhttp_set_error_reason(llhttp_t* parser, const char* reason); + +/* Returns the pointer to the last parsed byte before the returned error. The + * pointer is relative to the `data` argument of `llhttp_execute()`. + * + * Note: this method might be useful for counting the number of parsed bytes. + */ +LLHTTP_EXPORT +const char* llhttp_get_error_pos(const llhttp_t* parser); + +/* Returns textual name of error code */ +LLHTTP_EXPORT +const char* llhttp_errno_name(llhttp_errno_t err); + +/* Returns textual name of HTTP method */ +LLHTTP_EXPORT +const char* llhttp_method_name(llhttp_method_t method); + +/* Returns textual name of HTTP status */ +LLHTTP_EXPORT +const char* llhttp_status_name(llhttp_status_t status); + +/* Enables/disables lenient header value parsing (disabled by default). + * + * Lenient parsing disables header value token checks, extending llhttp's + * protocol support to highly non-compliant clients/server. No + * `HPE_INVALID_HEADER_TOKEN` will be raised for incorrect header values when + * lenient parsing is "on". + * + * **Enabling this flag can pose a security issue since you will be exposed to + * request smuggling attacks. USE WITH CAUTION!** + */ +LLHTTP_EXPORT +void llhttp_set_lenient_headers(llhttp_t* parser, int enabled); + + +/* Enables/disables lenient handling of conflicting `Transfer-Encoding` and + * `Content-Length` headers (disabled by default). + * + * Normally `llhttp` would error when `Transfer-Encoding` is present in + * conjunction with `Content-Length`. This error is important to prevent HTTP + * request smuggling, but may be less desirable for small number of cases + * involving legacy servers. + * + * **Enabling this flag can pose a security issue since you will be exposed to + * request smuggling attacks. USE WITH CAUTION!** + */ +LLHTTP_EXPORT +void llhttp_set_lenient_chunked_length(llhttp_t* parser, int enabled); + + +/* Enables/disables lenient handling of `Connection: close` and HTTP/1.0 + * requests responses. + * + * Normally `llhttp` would error on (in strict mode) or discard (in loose mode) + * the HTTP request/response after the request/response with `Connection: close` + * and `Content-Length`. This is important to prevent cache poisoning attacks, + * but might interact badly with outdated and insecure clients. With this flag + * the extra request/response will be parsed normally. + * + * **Enabling this flag can pose a security issue since you will be exposed to + * poisoning attacks. USE WITH CAUTION!** + */ +LLHTTP_EXPORT +void llhttp_set_lenient_keep_alive(llhttp_t* parser, int enabled); + +/* Enables/disables lenient handling of `Transfer-Encoding` header. + * + * Normally `llhttp` would error when a `Transfer-Encoding` has `chunked` value + * and another value after it (either in a single header or in multiple + * headers whose value are internally joined using `, `). + * This is mandated by the spec to reliably determine request body size and thus + * avoid request smuggling. + * With this flag the extra value will be parsed normally. + * + * **Enabling this flag can pose a security issue since you will be exposed to + * request smuggling attacks. USE WITH CAUTION!** + */ +LLHTTP_EXPORT +void llhttp_set_lenient_transfer_encoding(llhttp_t* parser, int enabled); + +/* Enables/disables lenient handling of HTTP version. + * + * Normally `llhttp` would error when the HTTP version in the request or status line + * is not `0.9`, `1.0`, `1.1` or `2.0`. + * With this flag the invalid value will be parsed normally. + * + * **Enabling this flag can pose a security issue since you will allow unsupported + * HTTP versions. USE WITH CAUTION!** + */ +LLHTTP_EXPORT +void llhttp_set_lenient_version(llhttp_t* parser, int enabled); + +/* Enables/disables lenient handling of additional data received after a message ends + * and keep-alive is disabled. + * + * Normally `llhttp` would error when additional unexpected data is received if the message + * contains the `Connection` header with `close` value. + * With this flag the extra data will discarded without throwing an error. + * + * **Enabling this flag can pose a security issue since you will be exposed to + * poisoning attacks. USE WITH CAUTION!** + */ +LLHTTP_EXPORT +void llhttp_set_lenient_data_after_close(llhttp_t* parser, int enabled); + +/* Enables/disables lenient handling of incomplete CRLF sequences. + * + * Normally `llhttp` would error when a CR is not followed by LF when terminating the + * request line, the status line, the headers or a chunk header. + * With this flag only a CR is required to terminate such sections. + * + * **Enabling this flag can pose a security issue since you will be exposed to + * request smuggling attacks. USE WITH CAUTION!** + */ +LLHTTP_EXPORT +void llhttp_set_lenient_optional_lf_after_cr(llhttp_t* parser, int enabled); + +/* + * Enables/disables lenient handling of line separators. + * + * Normally `llhttp` would error when a LF is not preceded by CR when terminating the + * request line, the status line, the headers, a chunk header or a chunk data. + * With this flag only a LF is required to terminate such sections. + * + * **Enabling this flag can pose a security issue since you will be exposed to + * request smuggling attacks. USE WITH CAUTION!** + */ +LLHTTP_EXPORT +void llhttp_set_lenient_optional_cr_before_lf(llhttp_t* parser, int enabled); + +/* Enables/disables lenient handling of chunks not separated via CRLF. + * + * Normally `llhttp` would error when after a chunk data a CRLF is missing before + * starting a new chunk. + * With this flag the new chunk can start immediately after the previous one. + * + * **Enabling this flag can pose a security issue since you will be exposed to + * request smuggling attacks. USE WITH CAUTION!** + */ +LLHTTP_EXPORT +void llhttp_set_lenient_optional_crlf_after_chunk(llhttp_t* parser, int enabled); + +/* Enables/disables lenient handling of spaces after chunk size. + * + * Normally `llhttp` would error when after a chunk size is followed by one or more + * spaces are present instead of a CRLF or `;`. + * With this flag this check is disabled. + * + * **Enabling this flag can pose a security issue since you will be exposed to + * request smuggling attacks. USE WITH CAUTION!** + */ +LLHTTP_EXPORT +void llhttp_set_lenient_spaces_after_chunk_size(llhttp_t* parser, int enabled); + +#ifdef __cplusplus +} /* extern "C" */ +#endif +#endif /* INCLUDE_LLHTTP_API_H_ */ diff --git a/deps/undici/src/deps/llhttp/include/llhttp.h b/deps/undici/src/deps/llhttp/include/llhttp.h index 88ef85df0d70ec..691969367aeace 100644 --- a/deps/undici/src/deps/llhttp/include/llhttp.h +++ b/deps/undici/src/deps/llhttp/include/llhttp.h @@ -1,14 +1,11 @@ + #ifndef INCLUDE_LLHTTP_H_ #define INCLUDE_LLHTTP_H_ -#define LLHTTP_VERSION_MAJOR 8 -#define LLHTTP_VERSION_MINOR 1 +#define LLHTTP_VERSION_MAJOR 9 +#define LLHTTP_VERSION_MINOR 2 #define LLHTTP_VERSION_PATCH 0 -#ifndef LLHTTP_STRICT_MODE -# define LLHTTP_STRICT_MODE 0 -#endif - #ifndef INCLUDE_LLHTTP_ITSELF_H_ #define INCLUDE_LLHTTP_ITSELF_H_ #ifdef __cplusplus @@ -33,7 +30,7 @@ struct llhttp__internal_s { uint8_t http_major; uint8_t http_minor; uint8_t header_state; - uint8_t lenient_flags; + uint16_t lenient_flags; uint8_t upgrade; uint8_t finish; uint16_t flags; @@ -50,6 +47,7 @@ int llhttp__internal_execute(llhttp__internal_t* s, const char* p, const char* e #endif #endif /* INCLUDE_LLHTTP_ITSELF_H_ */ + #ifndef LLLLHTTP_C_HEADERS_ #define LLLLHTTP_C_HEADERS_ #ifdef __cplusplus @@ -114,7 +112,12 @@ enum llhttp_lenient_flags { LENIENT_CHUNKED_LENGTH = 0x2, LENIENT_KEEP_ALIVE = 0x4, LENIENT_TRANSFER_ENCODING = 0x8, - LENIENT_VERSION = 0x10 + LENIENT_VERSION = 0x10, + LENIENT_DATA_AFTER_CLOSE = 0x20, + LENIENT_OPTIONAL_LF_AFTER_CR = 0x40, + LENIENT_OPTIONAL_CRLF_AFTER_CHUNK = 0x80, + LENIENT_OPTIONAL_CR_BEFORE_LF = 0x100, + LENIENT_SPACES_AFTER_CHUNK_SIZE = 0x200 }; typedef enum llhttp_lenient_flags llhttp_lenient_flags_t; @@ -178,7 +181,8 @@ enum llhttp_method { HTTP_SET_PARAMETER = 42, HTTP_REDIRECT = 43, HTTP_RECORD = 44, - HTTP_FLUSH = 45 + HTTP_FLUSH = 45, + HTTP_QUERY = 46 }; typedef enum llhttp_method llhttp_method_t; @@ -359,6 +363,7 @@ typedef enum llhttp_status llhttp_status_t; XX(31, LINK, LINK) \ XX(32, UNLINK, UNLINK) \ XX(33, SOURCE, SOURCE) \ + XX(46, QUERY, QUERY) \ #define RTSP_METHOD_MAP(XX) \ @@ -425,6 +430,7 @@ typedef enum llhttp_status llhttp_status_t; XX(43, REDIRECT, REDIRECT) \ XX(44, RECORD, RECORD) \ XX(45, FLUSH, FLUSH) \ + XX(46, QUERY, QUERY) \ #define HTTP_STATUS_MAP(XX) \ @@ -534,6 +540,7 @@ typedef enum llhttp_status llhttp_status_t; #endif #endif /* LLLLHTTP_C_HEADERS_ */ + #ifndef INCLUDE_LLHTTP_API_H_ #define INCLUDE_LLHTTP_API_H_ #ifdef __cplusplus @@ -543,6 +550,8 @@ extern "C" { #if defined(__wasm__) #define LLHTTP_EXPORT __attribute__((visibility("default"))) +#elif defined(_WIN32) +#define LLHTTP_EXPORT __declspec(dllexport) #else #define LLHTTP_EXPORT #endif @@ -759,7 +768,8 @@ const char* llhttp_status_name(llhttp_status_t status); * `HPE_INVALID_HEADER_TOKEN` will be raised for incorrect header values when * lenient parsing is "on". * - * **(USE AT YOUR OWN RISK)** + * **Enabling this flag can pose a security issue since you will be exposed to + * request smuggling attacks. USE WITH CAUTION!** */ LLHTTP_EXPORT void llhttp_set_lenient_headers(llhttp_t* parser, int enabled); @@ -773,7 +783,8 @@ void llhttp_set_lenient_headers(llhttp_t* parser, int enabled); * request smuggling, but may be less desirable for small number of cases * involving legacy servers. * - * **(USE AT YOUR OWN RISK)** + * **Enabling this flag can pose a security issue since you will be exposed to + * request smuggling attacks. USE WITH CAUTION!** */ LLHTTP_EXPORT void llhttp_set_lenient_chunked_length(llhttp_t* parser, int enabled); @@ -788,7 +799,8 @@ void llhttp_set_lenient_chunked_length(llhttp_t* parser, int enabled); * but might interact badly with outdated and insecure clients. With this flag * the extra request/response will be parsed normally. * - * **(USE AT YOUR OWN RISK)** + * **Enabling this flag can pose a security issue since you will be exposed to + * poisoning attacks. USE WITH CAUTION!** */ LLHTTP_EXPORT void llhttp_set_lenient_keep_alive(llhttp_t* parser, int enabled); @@ -802,14 +814,90 @@ void llhttp_set_lenient_keep_alive(llhttp_t* parser, int enabled); * avoid request smuggling. * With this flag the extra value will be parsed normally. * - * **(USE AT YOUR OWN RISK)** + * **Enabling this flag can pose a security issue since you will be exposed to + * request smuggling attacks. USE WITH CAUTION!** */ LLHTTP_EXPORT void llhttp_set_lenient_transfer_encoding(llhttp_t* parser, int enabled); +/* Enables/disables lenient handling of HTTP version. + * + * Normally `llhttp` would error when the HTTP version in the request or status line + * is not `0.9`, `1.0`, `1.1` or `2.0`. + * With this flag the invalid value will be parsed normally. + * + * **Enabling this flag can pose a security issue since you will allow unsupported + * HTTP versions. USE WITH CAUTION!** + */ +LLHTTP_EXPORT +void llhttp_set_lenient_version(llhttp_t* parser, int enabled); + +/* Enables/disables lenient handling of additional data received after a message ends + * and keep-alive is disabled. + * + * Normally `llhttp` would error when additional unexpected data is received if the message + * contains the `Connection` header with `close` value. + * With this flag the extra data will discarded without throwing an error. + * + * **Enabling this flag can pose a security issue since you will be exposed to + * poisoning attacks. USE WITH CAUTION!** + */ +LLHTTP_EXPORT +void llhttp_set_lenient_data_after_close(llhttp_t* parser, int enabled); + +/* Enables/disables lenient handling of incomplete CRLF sequences. + * + * Normally `llhttp` would error when a CR is not followed by LF when terminating the + * request line, the status line, the headers or a chunk header. + * With this flag only a CR is required to terminate such sections. + * + * **Enabling this flag can pose a security issue since you will be exposed to + * request smuggling attacks. USE WITH CAUTION!** + */ +LLHTTP_EXPORT +void llhttp_set_lenient_optional_lf_after_cr(llhttp_t* parser, int enabled); + +/* + * Enables/disables lenient handling of line separators. + * + * Normally `llhttp` would error when a LF is not preceded by CR when terminating the + * request line, the status line, the headers, a chunk header or a chunk data. + * With this flag only a LF is required to terminate such sections. + * + * **Enabling this flag can pose a security issue since you will be exposed to + * request smuggling attacks. USE WITH CAUTION!** + */ +LLHTTP_EXPORT +void llhttp_set_lenient_optional_cr_before_lf(llhttp_t* parser, int enabled); + +/* Enables/disables lenient handling of chunks not separated via CRLF. + * + * Normally `llhttp` would error when after a chunk data a CRLF is missing before + * starting a new chunk. + * With this flag the new chunk can start immediately after the previous one. + * + * **Enabling this flag can pose a security issue since you will be exposed to + * request smuggling attacks. USE WITH CAUTION!** + */ +LLHTTP_EXPORT +void llhttp_set_lenient_optional_crlf_after_chunk(llhttp_t* parser, int enabled); + +/* Enables/disables lenient handling of spaces after chunk size. + * + * Normally `llhttp` would error when after a chunk size is followed by one or more + * spaces are present instead of a CRLF or `;`. + * With this flag this check is disabled. + * + * **Enabling this flag can pose a security issue since you will be exposed to + * request smuggling attacks. USE WITH CAUTION!** + */ +LLHTTP_EXPORT +void llhttp_set_lenient_spaces_after_chunk_size(llhttp_t* parser, int enabled); + #ifdef __cplusplus } /* extern "C" */ #endif #endif /* INCLUDE_LLHTTP_API_H_ */ + #endif /* INCLUDE_LLHTTP_H_ */ diff --git a/deps/undici/src/deps/llhttp/src/api.c b/deps/undici/src/deps/llhttp/src/api.c index 4b687a5d990d0d..8c2ce3dc5c455b 100644 --- a/deps/undici/src/deps/llhttp/src/api.c +++ b/deps/undici/src/deps/llhttp/src/api.c @@ -126,7 +126,7 @@ void llhttp_reset(llhttp_t* parser) { llhttp_type_t type = parser->type; const llhttp_settings_t* settings = parser->settings; void* data = parser->data; - uint8_t lenient_flags = parser->lenient_flags; + uint16_t lenient_flags = parser->lenient_flags; llhttp__internal_init(parser); @@ -283,6 +283,54 @@ void llhttp_set_lenient_transfer_encoding(llhttp_t* parser, int enabled) { } } +void llhttp_set_lenient_version(llhttp_t* parser, int enabled) { + if (enabled) { + parser->lenient_flags |= LENIENT_VERSION; + } else { + parser->lenient_flags &= ~LENIENT_VERSION; + } +} + +void llhttp_set_lenient_data_after_close(llhttp_t* parser, int enabled) { + if (enabled) { + parser->lenient_flags |= LENIENT_DATA_AFTER_CLOSE; + } else { + parser->lenient_flags &= ~LENIENT_DATA_AFTER_CLOSE; + } +} + +void llhttp_set_lenient_optional_lf_after_cr(llhttp_t* parser, int enabled) { + if (enabled) { + parser->lenient_flags |= LENIENT_OPTIONAL_LF_AFTER_CR; + } else { + parser->lenient_flags &= ~LENIENT_OPTIONAL_LF_AFTER_CR; + } +} + +void llhttp_set_lenient_optional_crlf_after_chunk(llhttp_t* parser, int enabled) { + if (enabled) { + parser->lenient_flags |= LENIENT_OPTIONAL_CRLF_AFTER_CHUNK; + } else { + parser->lenient_flags &= ~LENIENT_OPTIONAL_CRLF_AFTER_CHUNK; + } +} + +void llhttp_set_lenient_optional_cr_before_lf(llhttp_t* parser, int enabled) { + if (enabled) { + parser->lenient_flags |= LENIENT_OPTIONAL_CR_BEFORE_LF; + } else { + parser->lenient_flags &= ~LENIENT_OPTIONAL_CR_BEFORE_LF; + } +} + +void llhttp_set_lenient_spaces_after_chunk_size(llhttp_t* parser, int enabled) { + if (enabled) { + parser->lenient_flags |= LENIENT_SPACES_AFTER_CHUNK_SIZE; + } else { + parser->lenient_flags &= ~LENIENT_SPACES_AFTER_CHUNK_SIZE; + } +} + /* Callbacks */ diff --git a/deps/undici/src/deps/llhttp/src/http.c b/deps/undici/src/deps/llhttp/src/http.c index 3a66044f5fb716..1ab91a55796e01 100644 --- a/deps/undici/src/deps/llhttp/src/http.c +++ b/deps/undici/src/deps/llhttp/src/http.c @@ -39,13 +39,33 @@ int llhttp__after_headers_complete(llhttp_t* parser, const char* p, int hasBody; hasBody = parser->flags & F_CHUNKED || parser->content_length > 0; - if (parser->upgrade && (parser->method == HTTP_CONNECT || - (parser->flags & F_SKIPBODY) || !hasBody)) { + if ( + (parser->upgrade && (parser->method == HTTP_CONNECT || + (parser->flags & F_SKIPBODY) || !hasBody)) || + /* See RFC 2616 section 4.4 - 1xx e.g. Continue */ + (parser->type == HTTP_RESPONSE && parser->status_code == 101) + ) { /* Exit, the rest of the message is in a different protocol. */ return 1; } - if (parser->flags & F_SKIPBODY) { + if (parser->type == HTTP_RESPONSE && parser->status_code == 100) { + /* No body, restart as the message is complete */ + return 0; + } + + /* See RFC 2616 section 4.4 */ + if ( + parser->flags & F_SKIPBODY || /* response to a HEAD request */ + ( + parser->type == HTTP_RESPONSE && ( + parser->status_code == 102 || /* Processing */ + parser->status_code == 103 || /* Early Hints */ + parser->status_code == 204 || /* No Content */ + parser->status_code == 304 /* Not Modified */ + ) + ) + ) { return 0; } else if (parser->flags & F_CHUNKED) { /* chunked encoding - ignore Content-Length header, prepare for a chunk */ diff --git a/deps/undici/src/deps/llhttp/src/llhttp.c b/deps/undici/src/deps/llhttp/src/llhttp.c index b92bf839ef0ac4..c08de6494f79b0 100644 --- a/deps/undici/src/deps/llhttp/src/llhttp.c +++ b/deps/undici/src/deps/llhttp/src/llhttp.c @@ -1,5 +1,3 @@ -#if LLHTTP_STRICT_MODE - #include #include #include @@ -24,148 +22,148 @@ typedef int (*llhttp__internal__span_cb)( llhttp__internal_t*, const char*, const char*); static const unsigned char llparse_blob0[] = { - 0xd, 0xa -}; -static const unsigned char llparse_blob1[] = { 'o', 'n' }; -static const unsigned char llparse_blob2[] = { +static const unsigned char llparse_blob1[] = { 'e', 'c', 't', 'i', 'o', 'n' }; -static const unsigned char llparse_blob3[] = { +static const unsigned char llparse_blob2[] = { 'l', 'o', 's', 'e' }; -static const unsigned char llparse_blob4[] = { +static const unsigned char llparse_blob3[] = { 'e', 'e', 'p', '-', 'a', 'l', 'i', 'v', 'e' }; -static const unsigned char llparse_blob5[] = { +static const unsigned char llparse_blob4[] = { 'p', 'g', 'r', 'a', 'd', 'e' }; -static const unsigned char llparse_blob6[] = { +static const unsigned char llparse_blob5[] = { 'c', 'h', 'u', 'n', 'k', 'e', 'd' }; #ifdef __SSE4_2__ -static const unsigned char ALIGN(16) llparse_blob7[] = { +static const unsigned char ALIGN(16) llparse_blob6[] = { 0x9, 0x9, ' ', '~', 0x80, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }; #endif /* __SSE4_2__ */ #ifdef __SSE4_2__ -static const unsigned char ALIGN(16) llparse_blob8[] = { +static const unsigned char ALIGN(16) llparse_blob7[] = { '!', '!', '#', '\'', '*', '+', '-', '.', '0', '9', 'A', 'Z', '^', 'z', '|', '|' }; #endif /* __SSE4_2__ */ #ifdef __SSE4_2__ -static const unsigned char ALIGN(16) llparse_blob9[] = { +static const unsigned char ALIGN(16) llparse_blob8[] = { '~', '~', 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }; #endif /* __SSE4_2__ */ -static const unsigned char llparse_blob10[] = { +static const unsigned char llparse_blob9[] = { 'e', 'n', 't', '-', 'l', 'e', 'n', 'g', 't', 'h' }; -static const unsigned char llparse_blob11[] = { +static const unsigned char llparse_blob10[] = { 'r', 'o', 'x', 'y', '-', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n' }; -static const unsigned char llparse_blob12[] = { +static const unsigned char llparse_blob11[] = { 'r', 'a', 'n', 's', 'f', 'e', 'r', '-', 'e', 'n', 'c', 'o', 'd', 'i', 'n', 'g' }; -static const unsigned char llparse_blob13[] = { +static const unsigned char llparse_blob12[] = { 'p', 'g', 'r', 'a', 'd', 'e' }; -static const unsigned char llparse_blob14[] = { +static const unsigned char llparse_blob13[] = { 'T', 'T', 'P', '/' }; -static const unsigned char llparse_blob15[] = { +static const unsigned char llparse_blob14[] = { 0xd, 0xa, 0xd, 0xa, 'S', 'M', 0xd, 0xa, 0xd, 0xa }; -static const unsigned char llparse_blob16[] = { +static const unsigned char llparse_blob15[] = { 'C', 'E', '/' }; -static const unsigned char llparse_blob17[] = { +static const unsigned char llparse_blob16[] = { 'T', 'S', 'P', '/' }; -static const unsigned char llparse_blob18[] = { +static const unsigned char llparse_blob17[] = { 'N', 'O', 'U', 'N', 'C', 'E' }; -static const unsigned char llparse_blob19[] = { +static const unsigned char llparse_blob18[] = { 'I', 'N', 'D' }; -static const unsigned char llparse_blob20[] = { +static const unsigned char llparse_blob19[] = { 'E', 'C', 'K', 'O', 'U', 'T' }; -static const unsigned char llparse_blob21[] = { +static const unsigned char llparse_blob20[] = { 'N', 'E', 'C', 'T' }; -static const unsigned char llparse_blob22[] = { +static const unsigned char llparse_blob21[] = { 'E', 'T', 'E' }; -static const unsigned char llparse_blob23[] = { +static const unsigned char llparse_blob22[] = { 'C', 'R', 'I', 'B', 'E' }; -static const unsigned char llparse_blob24[] = { +static const unsigned char llparse_blob23[] = { 'L', 'U', 'S', 'H' }; -static const unsigned char llparse_blob25[] = { +static const unsigned char llparse_blob24[] = { 'E', 'T' }; -static const unsigned char llparse_blob26[] = { +static const unsigned char llparse_blob25[] = { 'P', 'A', 'R', 'A', 'M', 'E', 'T', 'E', 'R' }; -static const unsigned char llparse_blob27[] = { +static const unsigned char llparse_blob26[] = { 'E', 'A', 'D' }; -static const unsigned char llparse_blob28[] = { +static const unsigned char llparse_blob27[] = { 'N', 'K' }; -static const unsigned char llparse_blob29[] = { +static const unsigned char llparse_blob28[] = { 'C', 'K' }; -static const unsigned char llparse_blob30[] = { +static const unsigned char llparse_blob29[] = { 'S', 'E', 'A', 'R', 'C', 'H' }; -static const unsigned char llparse_blob31[] = { +static const unsigned char llparse_blob30[] = { 'R', 'G', 'E' }; -static const unsigned char llparse_blob32[] = { +static const unsigned char llparse_blob31[] = { 'C', 'T', 'I', 'V', 'I', 'T', 'Y' }; -static const unsigned char llparse_blob33[] = { +static const unsigned char llparse_blob32[] = { 'L', 'E', 'N', 'D', 'A', 'R' }; -static const unsigned char llparse_blob34[] = { +static const unsigned char llparse_blob33[] = { 'V', 'E' }; -static const unsigned char llparse_blob35[] = { +static const unsigned char llparse_blob34[] = { 'O', 'T', 'I', 'F', 'Y' }; -static const unsigned char llparse_blob36[] = { +static const unsigned char llparse_blob35[] = { 'P', 'T', 'I', 'O', 'N', 'S' }; -static const unsigned char llparse_blob37[] = { +static const unsigned char llparse_blob36[] = { 'C', 'H' }; -static const unsigned char llparse_blob38[] = { +static const unsigned char llparse_blob37[] = { 'S', 'E' }; -static const unsigned char llparse_blob39[] = { +static const unsigned char llparse_blob38[] = { 'A', 'Y' }; -static const unsigned char llparse_blob40[] = { +static const unsigned char llparse_blob39[] = { 'S', 'T' }; -static const unsigned char llparse_blob41[] = { +static const unsigned char llparse_blob40[] = { 'I', 'N', 'D' }; -static const unsigned char llparse_blob42[] = { +static const unsigned char llparse_blob41[] = { 'A', 'T', 'C', 'H' }; -static const unsigned char llparse_blob43[] = { +static const unsigned char llparse_blob42[] = { 'G', 'E' }; +static const unsigned char llparse_blob43[] = { + 'U', 'E', 'R', 'Y' +}; static const unsigned char llparse_blob44[] = { 'I', 'N', 'D' }; @@ -231,7 +229,7 @@ struct llparse_match_s { }; typedef struct llparse_match_s llparse_match_t; -static llparse_match_t llparse__match_sequence_id( +static llparse_match_t llparse__match_sequence_to_lower( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp, const unsigned char* seq, uint32_t seq_len) { @@ -242,7 +240,7 @@ static llparse_match_t llparse__match_sequence_id( for (; p != endp; p++) { unsigned char current; - current = *p; + current = ((*p) >= 'A' && (*p) <= 'Z' ? (*p | 0x20) : (*p)); if (current == seq[index]) { if (++index == seq_len) { res.status = kMatchComplete; @@ -263,7 +261,7 @@ static llparse_match_t llparse__match_sequence_id( return res; } -static llparse_match_t llparse__match_sequence_to_lower( +static llparse_match_t llparse__match_sequence_to_lower_unsafe( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp, const unsigned char* seq, uint32_t seq_len) { @@ -274,7 +272,7 @@ static llparse_match_t llparse__match_sequence_to_lower( for (; p != endp; p++) { unsigned char current; - current = ((*p) >= 'A' && (*p) <= 'Z' ? (*p | 0x20) : (*p)); + current = ((*p) | 0x20); if (current == seq[index]) { if (++index == seq_len) { res.status = kMatchComplete; @@ -295,7 +293,7 @@ static llparse_match_t llparse__match_sequence_to_lower( return res; } -static llparse_match_t llparse__match_sequence_to_lower_unsafe( +static llparse_match_t llparse__match_sequence_id( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp, const unsigned char* seq, uint32_t seq_len) { @@ -306,7 +304,7 @@ static llparse_match_t llparse__match_sequence_to_lower_unsafe( for (; p != endp; p++) { unsigned char current; - current = ((*p) | 0x20); + current = *p; if (current == seq[index]) { if (++index == seq_len) { res.status = kMatchComplete; @@ -334,23 +332,30 @@ enum llparse_state_e { s_n_llhttp__internal__n_pause_1, s_n_llhttp__internal__n_invoke_is_equal_upgrade, s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_2, + s_n_llhttp__internal__n_chunk_data_almost_done_1, s_n_llhttp__internal__n_chunk_data_almost_done, s_n_llhttp__internal__n_consume_content_length, s_n_llhttp__internal__n_span_start_llhttp__on_body, s_n_llhttp__internal__n_invoke_is_equal_content_length, s_n_llhttp__internal__n_chunk_size_almost_done, + s_n_llhttp__internal__n_invoke_test_lenient_flags_9, s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete, s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete_1, + s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete_2, + s_n_llhttp__internal__n_invoke_test_lenient_flags_10, s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete, - s_n_llhttp__internal__n_chunk_extension_quoted_value_done, s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_1, - s_n_llhttp__internal__n_error_21, - s_n_llhttp__internal__n_chunk_extension_quoted_value, + s_n_llhttp__internal__n_chunk_extension_quoted_value_done, s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_2, - s_n_llhttp__internal__n_error_23, + s_n_llhttp__internal__n_error_30, + s_n_llhttp__internal__n_chunk_extension_quoted_value_quoted_pair, + s_n_llhttp__internal__n_error_31, + s_n_llhttp__internal__n_chunk_extension_quoted_value, + s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_3, + s_n_llhttp__internal__n_error_33, s_n_llhttp__internal__n_chunk_extension_value, s_n_llhttp__internal__n_span_start_llhttp__on_chunk_extension_value, - s_n_llhttp__internal__n_error_24, + s_n_llhttp__internal__n_error_34, s_n_llhttp__internal__n_chunk_extension_name, s_n_llhttp__internal__n_span_start_llhttp__on_chunk_extension_name, s_n_llhttp__internal__n_chunk_extensions, @@ -363,17 +368,18 @@ enum llparse_state_e { s_n_llhttp__internal__n_eof, s_n_llhttp__internal__n_span_start_llhttp__on_body_2, s_n_llhttp__internal__n_invoke_llhttp__after_headers_complete, + s_n_llhttp__internal__n_error_5, s_n_llhttp__internal__n_headers_almost_done, s_n_llhttp__internal__n_header_field_colon_discard_ws, - s_n_llhttp__internal__n_error_33, s_n_llhttp__internal__n_invoke_llhttp__on_header_value_complete, s_n_llhttp__internal__n_span_start_llhttp__on_header_value, s_n_llhttp__internal__n_header_value_discard_lws, s_n_llhttp__internal__n_header_value_discard_ws_almost_done, s_n_llhttp__internal__n_header_value_lws, s_n_llhttp__internal__n_header_value_almost_done, + s_n_llhttp__internal__n_invoke_test_lenient_flags_17, s_n_llhttp__internal__n_header_value_lenient, - s_n_llhttp__internal__n_error_40, + s_n_llhttp__internal__n_error_53, s_n_llhttp__internal__n_header_value_otherwise, s_n_llhttp__internal__n_header_value_connection_token, s_n_llhttp__internal__n_header_value_connection_ws, @@ -381,12 +387,12 @@ enum llparse_state_e { s_n_llhttp__internal__n_header_value_connection_2, s_n_llhttp__internal__n_header_value_connection_3, s_n_llhttp__internal__n_header_value_connection, - s_n_llhttp__internal__n_error_42, - s_n_llhttp__internal__n_error_43, + s_n_llhttp__internal__n_error_55, + s_n_llhttp__internal__n_error_56, s_n_llhttp__internal__n_header_value_content_length_ws, s_n_llhttp__internal__n_header_value_content_length, - s_n_llhttp__internal__n_error_45, - s_n_llhttp__internal__n_error_44, + s_n_llhttp__internal__n_error_58, + s_n_llhttp__internal__n_error_57, s_n_llhttp__internal__n_header_value_te_token_ows, s_n_llhttp__internal__n_header_value, s_n_llhttp__internal__n_header_value_te_token, @@ -394,6 +400,7 @@ enum llparse_state_e { s_n_llhttp__internal__n_header_value_te_chunked, s_n_llhttp__internal__n_span_start_llhttp__on_header_value_1, s_n_llhttp__internal__n_header_value_discard_ws, + s_n_llhttp__internal__n_invoke_load_header_state, s_n_llhttp__internal__n_invoke_llhttp__on_header_field_complete, s_n_llhttp__internal__n_header_field_general_otherwise, s_n_llhttp__internal__n_header_field_general, @@ -414,16 +421,16 @@ enum llparse_state_e { s_n_llhttp__internal__n_url_skip_lf_to_http09_1, s_n_llhttp__internal__n_url_skip_lf_to_http09, s_n_llhttp__internal__n_req_pri_upgrade, - s_n_llhttp__internal__n_req_http_complete_1, + s_n_llhttp__internal__n_req_http_complete_crlf, s_n_llhttp__internal__n_req_http_complete, s_n_llhttp__internal__n_invoke_load_method_1, s_n_llhttp__internal__n_invoke_llhttp__on_version_complete, - s_n_llhttp__internal__n_error_50, - s_n_llhttp__internal__n_error_55, + s_n_llhttp__internal__n_error_65, + s_n_llhttp__internal__n_error_72, s_n_llhttp__internal__n_req_http_minor, - s_n_llhttp__internal__n_error_56, + s_n_llhttp__internal__n_error_73, s_n_llhttp__internal__n_req_http_dot, - s_n_llhttp__internal__n_error_57, + s_n_llhttp__internal__n_error_74, s_n_llhttp__internal__n_req_http_major, s_n_llhttp__internal__n_span_start_llhttp__on_version, s_n_llhttp__internal__n_req_http_start_1, @@ -499,47 +506,49 @@ enum llparse_state_e { s_n_llhttp__internal__n_after_start_req_45, s_n_llhttp__internal__n_after_start_req_44, s_n_llhttp__internal__n_after_start_req_33, - s_n_llhttp__internal__n_after_start_req_48, + s_n_llhttp__internal__n_after_start_req_46, s_n_llhttp__internal__n_after_start_req_49, s_n_llhttp__internal__n_after_start_req_50, s_n_llhttp__internal__n_after_start_req_51, + s_n_llhttp__internal__n_after_start_req_52, + s_n_llhttp__internal__n_after_start_req_48, s_n_llhttp__internal__n_after_start_req_47, - s_n_llhttp__internal__n_after_start_req_46, - s_n_llhttp__internal__n_after_start_req_54, - s_n_llhttp__internal__n_after_start_req_56, - s_n_llhttp__internal__n_after_start_req_57, s_n_llhttp__internal__n_after_start_req_55, - s_n_llhttp__internal__n_after_start_req_53, + s_n_llhttp__internal__n_after_start_req_57, s_n_llhttp__internal__n_after_start_req_58, + s_n_llhttp__internal__n_after_start_req_56, + s_n_llhttp__internal__n_after_start_req_54, s_n_llhttp__internal__n_after_start_req_59, - s_n_llhttp__internal__n_after_start_req_52, - s_n_llhttp__internal__n_after_start_req_61, - s_n_llhttp__internal__n_after_start_req_62, s_n_llhttp__internal__n_after_start_req_60, - s_n_llhttp__internal__n_after_start_req_65, - s_n_llhttp__internal__n_after_start_req_67, - s_n_llhttp__internal__n_after_start_req_68, + s_n_llhttp__internal__n_after_start_req_53, + s_n_llhttp__internal__n_after_start_req_62, + s_n_llhttp__internal__n_after_start_req_63, + s_n_llhttp__internal__n_after_start_req_61, s_n_llhttp__internal__n_after_start_req_66, + s_n_llhttp__internal__n_after_start_req_68, s_n_llhttp__internal__n_after_start_req_69, + s_n_llhttp__internal__n_after_start_req_67, + s_n_llhttp__internal__n_after_start_req_70, + s_n_llhttp__internal__n_after_start_req_65, s_n_llhttp__internal__n_after_start_req_64, - s_n_llhttp__internal__n_after_start_req_63, s_n_llhttp__internal__n_after_start_req, s_n_llhttp__internal__n_span_start_llhttp__on_method_1, - s_n_llhttp__internal__n_invoke_llhttp__on_status_complete, s_n_llhttp__internal__n_res_line_almost_done, + s_n_llhttp__internal__n_invoke_test_lenient_flags_29, s_n_llhttp__internal__n_res_status, s_n_llhttp__internal__n_span_start_llhttp__on_status, - s_n_llhttp__internal__n_res_status_start, s_n_llhttp__internal__n_res_status_code_otherwise, - s_n_llhttp__internal__n_res_status_code, + s_n_llhttp__internal__n_res_status_code_digit_3, + s_n_llhttp__internal__n_res_status_code_digit_2, + s_n_llhttp__internal__n_res_status_code_digit_1, s_n_llhttp__internal__n_res_after_version, s_n_llhttp__internal__n_invoke_llhttp__on_version_complete_1, - s_n_llhttp__internal__n_error_72, - s_n_llhttp__internal__n_error_79, + s_n_llhttp__internal__n_error_88, + s_n_llhttp__internal__n_error_102, s_n_llhttp__internal__n_res_http_minor, - s_n_llhttp__internal__n_error_80, + s_n_llhttp__internal__n_error_103, s_n_llhttp__internal__n_res_http_dot, - s_n_llhttp__internal__n_error_81, + s_n_llhttp__internal__n_error_104, s_n_llhttp__internal__n_res_http_major, s_n_llhttp__internal__n_span_start_llhttp__on_version_1, s_n_llhttp__internal__n_start_res, @@ -670,6 +679,13 @@ int llhttp__internal__c_test_lenient_flags( return (state->lenient_flags & 1) == 1; } +int llhttp__internal__c_test_lenient_flags_1( + llhttp__internal_t* state, + const unsigned char* p, + const unsigned char* endp) { + return (state->lenient_flags & 256) == 256; +} + int llhttp__internal__c_test_flags( llhttp__internal_t* state, const unsigned char* p, @@ -720,25 +736,18 @@ int llhttp__internal__c_update_finish_1( return 0; } -int llhttp__internal__c_test_lenient_flags_1( +int llhttp__internal__c_test_lenient_flags_2( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return (state->lenient_flags & 4) == 4; } -int llhttp__internal__c_test_flags_1( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - return (state->flags & 544) == 544; -} - -int llhttp__internal__c_test_lenient_flags_2( +int llhttp__internal__c_test_lenient_flags_3( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { - return (state->lenient_flags & 2) == 2; + return (state->lenient_flags & 32) == 32; } int llhttp__before_headers_complete( @@ -779,6 +788,13 @@ int llhttp__internal__c_mul_add_content_length( return 0; } +int llhttp__internal__c_test_lenient_flags_4( + llhttp__internal_t* state, + const unsigned char* p, + const unsigned char* endp) { + return (state->lenient_flags & 512) == 512; +} + int llhttp__on_chunk_header( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); @@ -790,6 +806,13 @@ int llhttp__internal__c_is_equal_content_length( return state->content_length == 0; } +int llhttp__internal__c_test_lenient_flags_7( + llhttp__internal_t* state, + const unsigned char* p, + const unsigned char* endp) { + return (state->lenient_flags & 128) == 128; +} + int llhttp__internal__c_or_flags( llhttp__internal_t* state, const unsigned char* p, @@ -798,6 +821,13 @@ int llhttp__internal__c_or_flags( return 0; } +int llhttp__internal__c_test_lenient_flags_8( + llhttp__internal_t* state, + const unsigned char* p, + const unsigned char* endp) { + return (state->lenient_flags & 64) == 64; +} + int llhttp__on_chunk_extension_name_complete( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); @@ -850,7 +880,21 @@ int llhttp__internal__c_load_header_state( return state->header_state; } -int llhttp__internal__c_or_flags_3( +int llhttp__internal__c_test_flags_4( + llhttp__internal_t* state, + const unsigned char* p, + const unsigned char* endp) { + return (state->flags & 512) == 512; +} + +int llhttp__internal__c_test_lenient_flags_21( + llhttp__internal_t* state, + const unsigned char* p, + const unsigned char* endp) { + return (state->lenient_flags & 2) == 2; +} + +int llhttp__internal__c_or_flags_5( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { @@ -870,7 +914,7 @@ int llhttp__on_header_value_complete( llhttp__internal_t* s, const unsigned char* p, const unsigned char* endp); -int llhttp__internal__c_or_flags_4( +int llhttp__internal__c_or_flags_6( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { @@ -878,7 +922,7 @@ int llhttp__internal__c_or_flags_4( return 0; } -int llhttp__internal__c_or_flags_5( +int llhttp__internal__c_or_flags_7( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { @@ -886,7 +930,7 @@ int llhttp__internal__c_or_flags_5( return 0; } -int llhttp__internal__c_or_flags_6( +int llhttp__internal__c_or_flags_8( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { @@ -959,7 +1003,7 @@ int llhttp__internal__c_mul_add_content_length_1( return 0; } -int llhttp__internal__c_or_flags_15( +int llhttp__internal__c_or_flags_17( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { @@ -974,14 +1018,14 @@ int llhttp__internal__c_test_flags_3( return (state->flags & 8) == 8; } -int llhttp__internal__c_test_lenient_flags_6( +int llhttp__internal__c_test_lenient_flags_19( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { return (state->lenient_flags & 8) == 8; } -int llhttp__internal__c_or_flags_16( +int llhttp__internal__c_or_flags_18( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { @@ -1005,7 +1049,7 @@ int llhttp__internal__c_update_header_state_8( return 0; } -int llhttp__internal__c_or_flags_18( +int llhttp__internal__c_or_flags_20( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { @@ -1038,7 +1082,7 @@ int llhttp__internal__c_store_http_minor( return 0; } -int llhttp__internal__c_test_lenient_flags_8( +int llhttp__internal__c_test_lenient_flags_23( llhttp__internal_t* state, const unsigned char* p, const unsigned char* endp) { @@ -1094,11 +1138,6 @@ int llhttp__internal__c_mul_add_status_code( } } state->status_code += match; - - /* Enforce maximum */ - if (state->status_code > 999) { - return 1; - } return 0; } @@ -1150,7 +1189,7 @@ static llparse_state_t llhttp__internal__run( } default: { p++; - goto s_n_llhttp__internal__n_error_7; + goto s_n_llhttp__internal__n_invoke_test_lenient_flags_3; } } /* UNREACHABLE */; @@ -1194,32 +1233,46 @@ static llparse_state_t llhttp__internal__run( case 0: goto s_n_llhttp__internal__n_invoke_is_equal_upgrade; case 21: - goto s_n_llhttp__internal__n_pause_11; + goto s_n_llhttp__internal__n_pause_13; default: - goto s_n_llhttp__internal__n_error_28; + goto s_n_llhttp__internal__n_error_38; + } + /* UNREACHABLE */; + abort(); + } + case s_n_llhttp__internal__n_chunk_data_almost_done_1: + s_n_llhttp__internal__n_chunk_data_almost_done_1: { + if (p == endp) { + return s_n_llhttp__internal__n_chunk_data_almost_done_1; + } + switch (*p) { + case 10: { + p++; + goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_complete; + } + default: { + goto s_n_llhttp__internal__n_invoke_test_lenient_flags_7; + } } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_chunk_data_almost_done: s_n_llhttp__internal__n_chunk_data_almost_done: { - llparse_match_t match_seq; - if (p == endp) { return s_n_llhttp__internal__n_chunk_data_almost_done; } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob0, 2); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { + switch (*p) { + case 10: { p++; - goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_complete; + goto s_n_llhttp__internal__n_invoke_test_lenient_flags_6; } - case kMatchPause: { - return s_n_llhttp__internal__n_chunk_data_almost_done; + case 13: { + p++; + goto s_n_llhttp__internal__n_chunk_data_almost_done_1; } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_11; + default: { + goto s_n_llhttp__internal__n_invoke_test_lenient_flags_7; } } /* UNREACHABLE */; @@ -1276,21 +1329,32 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_header; } default: { - goto s_n_llhttp__internal__n_error_12; + goto s_n_llhttp__internal__n_invoke_test_lenient_flags_8; } } /* UNREACHABLE */; abort(); } + case s_n_llhttp__internal__n_invoke_test_lenient_flags_9: + s_n_llhttp__internal__n_invoke_test_lenient_flags_9: { + switch (llhttp__internal__c_test_lenient_flags_1(state, p, endp)) { + case 1: + goto s_n_llhttp__internal__n_chunk_size_almost_done; + default: + goto s_n_llhttp__internal__n_error_20; + } + /* UNREACHABLE */; + abort(); + } case s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete: s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete: { switch (llhttp__on_chunk_extension_name_complete(state, p, endp)) { case 0: - goto s_n_llhttp__internal__n_chunk_size_almost_done; + goto s_n_llhttp__internal__n_invoke_test_lenient_flags_9; case 21: goto s_n_llhttp__internal__n_pause_5; default: - goto s_n_llhttp__internal__n_error_15; + goto s_n_llhttp__internal__n_error_19; } /* UNREACHABLE */; abort(); @@ -1299,64 +1363,149 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete_1: { switch (llhttp__on_chunk_extension_name_complete(state, p, endp)) { case 0: - goto s_n_llhttp__internal__n_chunk_extensions; + goto s_n_llhttp__internal__n_chunk_size_almost_done; case 21: goto s_n_llhttp__internal__n_pause_6; default: - goto s_n_llhttp__internal__n_error_16; + goto s_n_llhttp__internal__n_error_21; } /* UNREACHABLE */; abort(); } - case s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete: - s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete: { - switch (llhttp__on_chunk_extension_value_complete(state, p, endp)) { + case s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete_2: + s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete_2: { + switch (llhttp__on_chunk_extension_name_complete(state, p, endp)) { case 0: - goto s_n_llhttp__internal__n_chunk_size_almost_done; + goto s_n_llhttp__internal__n_chunk_extensions; case 21: goto s_n_llhttp__internal__n_pause_7; default: - goto s_n_llhttp__internal__n_error_18; + goto s_n_llhttp__internal__n_error_22; } /* UNREACHABLE */; abort(); } - case s_n_llhttp__internal__n_chunk_extension_quoted_value_done: - s_n_llhttp__internal__n_chunk_extension_quoted_value_done: { - if (p == endp) { - return s_n_llhttp__internal__n_chunk_extension_quoted_value_done; - } - switch (*p) { - case 13: { - p++; + case s_n_llhttp__internal__n_invoke_test_lenient_flags_10: + s_n_llhttp__internal__n_invoke_test_lenient_flags_10: { + switch (llhttp__internal__c_test_lenient_flags_1(state, p, endp)) { + case 1: goto s_n_llhttp__internal__n_chunk_size_almost_done; - } - case ';': { - p++; - goto s_n_llhttp__internal__n_chunk_extensions; - } - default: { - goto s_n_llhttp__internal__n_error_20; - } + default: + goto s_n_llhttp__internal__n_error_25; + } + /* UNREACHABLE */; + abort(); + } + case s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete: + s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete: { + switch (llhttp__on_chunk_extension_value_complete(state, p, endp)) { + case 0: + goto s_n_llhttp__internal__n_invoke_test_lenient_flags_10; + case 21: + goto s_n_llhttp__internal__n_pause_8; + default: + goto s_n_llhttp__internal__n_error_24; } /* UNREACHABLE */; abort(); } case s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_1: s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_1: { + switch (llhttp__on_chunk_extension_value_complete(state, p, endp)) { + case 0: + goto s_n_llhttp__internal__n_chunk_size_almost_done; + case 21: + goto s_n_llhttp__internal__n_pause_9; + default: + goto s_n_llhttp__internal__n_error_26; + } + /* UNREACHABLE */; + abort(); + } + case s_n_llhttp__internal__n_chunk_extension_quoted_value_done: + s_n_llhttp__internal__n_chunk_extension_quoted_value_done: { + if (p == endp) { + return s_n_llhttp__internal__n_chunk_extension_quoted_value_done; + } + switch (*p) { + case 10: { + goto s_n_llhttp__internal__n_invoke_test_lenient_flags_11; + } + case 13: { + p++; + goto s_n_llhttp__internal__n_chunk_size_almost_done; + } + case ';': { + p++; + goto s_n_llhttp__internal__n_chunk_extensions; + } + default: { + goto s_n_llhttp__internal__n_error_29; + } + } + /* UNREACHABLE */; + abort(); + } + case s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_2: + s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_2: { switch (llhttp__on_chunk_extension_value_complete(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_chunk_extension_quoted_value_done; case 21: - goto s_n_llhttp__internal__n_pause_8; + goto s_n_llhttp__internal__n_pause_10; default: - goto s_n_llhttp__internal__n_error_19; + goto s_n_llhttp__internal__n_error_27; + } + /* UNREACHABLE */; + abort(); + } + case s_n_llhttp__internal__n_error_30: + s_n_llhttp__internal__n_error_30: { + state->error = 0x2; + state->reason = "Invalid quoted-pair in chunk extensions quoted value"; + state->error_pos = (const char*) p; + state->_current = (void*) (intptr_t) s_error; + return s_error; + /* UNREACHABLE */; + abort(); + } + case s_n_llhttp__internal__n_chunk_extension_quoted_value_quoted_pair: + s_n_llhttp__internal__n_chunk_extension_quoted_value_quoted_pair: { + static uint8_t lookup_table[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + }; + if (p == endp) { + return s_n_llhttp__internal__n_chunk_extension_quoted_value_quoted_pair; + } + switch (lookup_table[(uint8_t) *p]) { + case 1: { + p++; + goto s_n_llhttp__internal__n_chunk_extension_quoted_value; + } + default: { + goto s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_3; + } } /* UNREACHABLE */; abort(); } - case s_n_llhttp__internal__n_error_21: - s_n_llhttp__internal__n_error_21: { + case s_n_llhttp__internal__n_error_31: + s_n_llhttp__internal__n_error_31: { state->error = 0x2; state->reason = "Invalid character in chunk extensions quoted value"; state->error_pos = (const char*) p; @@ -1373,7 +1522,7 @@ static llparse_state_t llhttp__internal__run( 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -1395,30 +1544,34 @@ static llparse_state_t llhttp__internal__run( } case 2: { p++; - goto s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_1; + goto s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_2; + } + case 3: { + p++; + goto s_n_llhttp__internal__n_chunk_extension_quoted_value_quoted_pair; } default: { - goto s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_2; + goto s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_4; } } /* UNREACHABLE */; abort(); } - case s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_2: - s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_2: { + case s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_3: + s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_3: { switch (llhttp__on_chunk_extension_value_complete(state, p, endp)) { case 0: - goto s_n_llhttp__internal__n_chunk_size_otherwise; + goto s_n_llhttp__internal__n_chunk_extensions; case 21: - goto s_n_llhttp__internal__n_pause_9; + goto s_n_llhttp__internal__n_pause_11; default: - goto s_n_llhttp__internal__n_error_22; + goto s_n_llhttp__internal__n_error_32; } /* UNREACHABLE */; abort(); } - case s_n_llhttp__internal__n_error_23: - s_n_llhttp__internal__n_error_23: { + case s_n_llhttp__internal__n_error_33: + s_n_llhttp__internal__n_error_33: { state->error = 0x2; state->reason = "Invalid character in chunk extensions value"; state->error_pos = (const char*) p; @@ -1430,14 +1583,14 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_chunk_extension_value: s_n_llhttp__internal__n_chunk_extension_value: { static uint8_t lookup_table[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2, 3, 2, 2, 2, 2, 2, 0, 0, 2, 2, 0, 2, 2, 0, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 4, 0, 0, 0, 0, - 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 2, 0, + 0, 3, 4, 3, 3, 3, 3, 3, 0, 0, 3, 3, 0, 3, 3, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 5, 0, 0, 0, 0, + 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1455,18 +1608,21 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value; } case 2: { + goto s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_1; + } + case 3: { p++; goto s_n_llhttp__internal__n_chunk_extension_value; } - case 3: { + case 4: { p++; goto s_n_llhttp__internal__n_chunk_extension_quoted_value; } - case 4: { - goto s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_3; + case 5: { + goto s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_5; } default: { - goto s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_4; + goto s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_6; } } /* UNREACHABLE */; @@ -1479,12 +1635,12 @@ static llparse_state_t llhttp__internal__run( } state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_chunk_extension_value; - goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete_2; + goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete_3; /* UNREACHABLE */; abort(); } - case s_n_llhttp__internal__n_error_24: - s_n_llhttp__internal__n_error_24: { + case s_n_llhttp__internal__n_error_34: + s_n_llhttp__internal__n_error_34: { state->error = 0x2; state->reason = "Invalid character in chunk extensions name"; state->error_pos = (const char*) p; @@ -1496,14 +1652,14 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_chunk_extension_name: s_n_llhttp__internal__n_chunk_extension_name: { static uint8_t lookup_table[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2, 0, 2, 2, 2, 2, 2, 0, 0, 2, 2, 0, 2, 2, 0, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 3, 0, 4, 0, 0, - 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 2, 0, + 0, 3, 0, 3, 3, 3, 3, 3, 0, 0, 3, 3, 0, 3, 3, 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 4, 0, 5, 0, 0, + 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1521,18 +1677,21 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_name; } case 2: { - p++; - goto s_n_llhttp__internal__n_chunk_extension_name; + goto s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_name_1; } case 3: { - goto s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_name_1; + p++; + goto s_n_llhttp__internal__n_chunk_extension_name; } case 4: { goto s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_name_2; } - default: { + case 5: { goto s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_name_3; } + default: { + goto s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_name_4; + } } /* UNREACHABLE */; abort(); @@ -1556,11 +1715,11 @@ static llparse_state_t llhttp__internal__run( switch (*p) { case 13: { p++; - goto s_n_llhttp__internal__n_error_13; + goto s_n_llhttp__internal__n_error_17; } case ' ': { p++; - goto s_n_llhttp__internal__n_error_14; + goto s_n_llhttp__internal__n_error_18; } default: { goto s_n_llhttp__internal__n_span_start_llhttp__on_chunk_extension_name; @@ -1575,16 +1734,28 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_chunk_size_otherwise; } switch (*p) { + case 9: { + p++; + goto s_n_llhttp__internal__n_invoke_test_lenient_flags_4; + } + case 10: { + p++; + goto s_n_llhttp__internal__n_invoke_test_lenient_flags_5; + } case 13: { p++; goto s_n_llhttp__internal__n_chunk_size_almost_done; } + case ' ': { + p++; + goto s_n_llhttp__internal__n_invoke_test_lenient_flags_4; + } case ';': { p++; goto s_n_llhttp__internal__n_chunk_extensions; } default: { - goto s_n_llhttp__internal__n_error_25; + goto s_n_llhttp__internal__n_error_35; } } /* UNREACHABLE */; @@ -1830,7 +2001,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_mul_add_content_length; } default: { - goto s_n_llhttp__internal__n_error_27; + goto s_n_llhttp__internal__n_error_37; } } /* UNREACHABLE */; @@ -1907,13 +2078,23 @@ static llparse_state_t llhttp__internal__run( case 4: goto s_n_llhttp__internal__n_invoke_update_finish_3; case 5: - goto s_n_llhttp__internal__n_error_29; + goto s_n_llhttp__internal__n_error_39; default: goto s_n_llhttp__internal__n_invoke_llhttp__on_message_complete; } /* UNREACHABLE */; abort(); } + case s_n_llhttp__internal__n_error_5: + s_n_llhttp__internal__n_error_5: { + state->error = 0xa; + state->reason = "Invalid header field char"; + state->error_pos = (const char*) p; + state->_current = (void*) (intptr_t) s_error; + return s_error; + /* UNREACHABLE */; + abort(); + } case s_n_llhttp__internal__n_headers_almost_done: s_n_llhttp__internal__n_headers_almost_done: { if (p == endp) { @@ -1922,10 +2103,10 @@ static llparse_state_t llhttp__internal__run( switch (*p) { case 10: { p++; - goto s_n_llhttp__internal__n_invoke_test_flags; + goto s_n_llhttp__internal__n_invoke_test_flags_1; } default: { - goto s_n_llhttp__internal__n_error_32; + goto s_n_llhttp__internal__n_invoke_test_lenient_flags_12; } } /* UNREACHABLE */; @@ -1948,25 +2129,15 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - case s_n_llhttp__internal__n_error_33: - s_n_llhttp__internal__n_error_33: { - state->error = 0xa; - state->reason = "Invalid header field char"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } case s_n_llhttp__internal__n_invoke_llhttp__on_header_value_complete: s_n_llhttp__internal__n_invoke_llhttp__on_header_value_complete: { switch (llhttp__on_header_value_complete(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_header_field_start; case 21: - goto s_n_llhttp__internal__n_pause_14; + goto s_n_llhttp__internal__n_pause_18; default: - goto s_n_llhttp__internal__n_error_36; + goto s_n_llhttp__internal__n_error_48; } /* UNREACHABLE */; abort(); @@ -1990,14 +2161,14 @@ static llparse_state_t llhttp__internal__run( switch (*p) { case 9: { p++; - goto s_n_llhttp__internal__n_header_value_discard_ws; + goto s_n_llhttp__internal__n_invoke_test_lenient_flags_15; } case ' ': { p++; - goto s_n_llhttp__internal__n_header_value_discard_ws; + goto s_n_llhttp__internal__n_invoke_test_lenient_flags_15; } default: { - goto s_n_llhttp__internal__n_invoke_load_header_state; + goto s_n_llhttp__internal__n_invoke_load_header_state_1; } } /* UNREACHABLE */; @@ -2014,7 +2185,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_header_value_discard_lws; } default: { - goto s_n_llhttp__internal__n_error_38; + goto s_n_llhttp__internal__n_invoke_test_lenient_flags_16; } } /* UNREACHABLE */; @@ -2027,13 +2198,13 @@ static llparse_state_t llhttp__internal__run( } switch (*p) { case 9: { - goto s_n_llhttp__internal__n_invoke_load_header_state_3; + goto s_n_llhttp__internal__n_invoke_load_header_state_4; } case ' ': { - goto s_n_llhttp__internal__n_invoke_load_header_state_3; + goto s_n_llhttp__internal__n_invoke_load_header_state_4; } default: { - goto s_n_llhttp__internal__n_invoke_load_header_state_4; + goto s_n_llhttp__internal__n_invoke_load_header_state_5; } } /* UNREACHABLE */; @@ -2050,12 +2221,23 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_header_value_lws; } default: { - goto s_n_llhttp__internal__n_error_39; + goto s_n_llhttp__internal__n_error_52; } } /* UNREACHABLE */; abort(); } + case s_n_llhttp__internal__n_invoke_test_lenient_flags_17: + s_n_llhttp__internal__n_invoke_test_lenient_flags_17: { + switch (llhttp__internal__c_test_lenient_flags_1(state, p, endp)) { + case 1: + goto s_n_llhttp__internal__n_header_value_almost_done; + default: + goto s_n_llhttp__internal__n_error_51; + } + /* UNREACHABLE */; + abort(); + } case s_n_llhttp__internal__n_header_value_lenient: s_n_llhttp__internal__n_header_value_lenient: { if (p == endp) { @@ -2063,10 +2245,10 @@ static llparse_state_t llhttp__internal__run( } switch (*p) { case 10: { - goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_3; + goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_4; } case 13: { - goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_4; + goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_5; } default: { p++; @@ -2076,8 +2258,8 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - case s_n_llhttp__internal__n_error_40: - s_n_llhttp__internal__n_error_40: { + case s_n_llhttp__internal__n_error_53: + s_n_llhttp__internal__n_error_53: { state->error = 0xa; state->reason = "Invalid header value char"; state->error_pos = (const char*) p; @@ -2092,11 +2274,14 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_header_value_otherwise; } switch (*p) { - case 13: { + case 10: { goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_1; } + case 13: { + goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_2; + } default: { - goto s_n_llhttp__internal__n_invoke_test_lenient_flags_5; + goto s_n_llhttp__internal__n_invoke_test_lenient_flags_18; } } /* UNREACHABLE */; @@ -2159,7 +2344,7 @@ static llparse_state_t llhttp__internal__run( } case ',': { p++; - goto s_n_llhttp__internal__n_invoke_load_header_state_5; + goto s_n_llhttp__internal__n_invoke_load_header_state_6; } default: { goto s_n_llhttp__internal__n_invoke_update_header_state_5; @@ -2175,7 +2360,7 @@ static llparse_state_t llhttp__internal__run( if (p == endp) { return s_n_llhttp__internal__n_header_value_connection_1; } - match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob3, 4); + match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob2, 4); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { @@ -2199,7 +2384,7 @@ static llparse_state_t llhttp__internal__run( if (p == endp) { return s_n_llhttp__internal__n_header_value_connection_2; } - match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob4, 9); + match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob3, 9); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { @@ -2223,7 +2408,7 @@ static llparse_state_t llhttp__internal__run( if (p == endp) { return s_n_llhttp__internal__n_header_value_connection_3; } - match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob5, 6); + match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob4, 6); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { @@ -2273,8 +2458,8 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - case s_n_llhttp__internal__n_error_42: - s_n_llhttp__internal__n_error_42: { + case s_n_llhttp__internal__n_error_55: + s_n_llhttp__internal__n_error_55: { state->error = 0xb; state->reason = "Content-Length overflow"; state->error_pos = (const char*) p; @@ -2283,8 +2468,8 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - case s_n_llhttp__internal__n_error_43: - s_n_llhttp__internal__n_error_43: { + case s_n_llhttp__internal__n_error_56: + s_n_llhttp__internal__n_error_56: { state->error = 0xb; state->reason = "Invalid character in Content-Length"; state->error_pos = (const char*) p; @@ -2300,17 +2485,17 @@ static llparse_state_t llhttp__internal__run( } switch (*p) { case 10: { - goto s_n_llhttp__internal__n_invoke_or_flags_15; + goto s_n_llhttp__internal__n_invoke_or_flags_17; } case 13: { - goto s_n_llhttp__internal__n_invoke_or_flags_15; + goto s_n_llhttp__internal__n_invoke_or_flags_17; } case ' ': { p++; goto s_n_llhttp__internal__n_header_value_content_length_ws; } default: { - goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_6; + goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_7; } } /* UNREACHABLE */; @@ -2379,8 +2564,8 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - case s_n_llhttp__internal__n_error_45: - s_n_llhttp__internal__n_error_45: { + case s_n_llhttp__internal__n_error_58: + s_n_llhttp__internal__n_error_58: { state->error = 0xf; state->reason = "Invalid `Transfer-Encoding` header value"; state->error_pos = (const char*) p; @@ -2389,8 +2574,8 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - case s_n_llhttp__internal__n_error_44: - s_n_llhttp__internal__n_error_44: { + case s_n_llhttp__internal__n_error_57: + s_n_llhttp__internal__n_error_57: { state->error = 0xf; state->reason = "Invalid `Transfer-Encoding` header value"; state->error_pos = (const char*) p; @@ -2452,7 +2637,7 @@ static llparse_state_t llhttp__internal__run( /* Load input */ input = _mm_loadu_si128((__m128i const*) p); - ranges = _mm_loadu_si128((__m128i const*) llparse_blob7); + ranges = _mm_loadu_si128((__m128i const*) llparse_blob6); /* Find first character that does not match `ranges` */ match_len = _mm_cmpestri(ranges, 6, @@ -2551,7 +2736,7 @@ static llparse_state_t llhttp__internal__run( if (p == endp) { return s_n_llhttp__internal__n_header_value_te_chunked; } - match_seq = llparse__match_sequence_to_lower_unsafe(state, p, endp, llparse_blob6, 7); + match_seq = llparse__match_sequence_to_lower_unsafe(state, p, endp, llparse_blob5, 7); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { @@ -2575,7 +2760,7 @@ static llparse_state_t llhttp__internal__run( } state->_span_pos0 = (void*) p; state->_span_cb0 = llhttp__on_header_value; - goto s_n_llhttp__internal__n_invoke_load_header_state_2; + goto s_n_llhttp__internal__n_invoke_load_header_state_3; /* UNREACHABLE */; abort(); } @@ -2591,7 +2776,7 @@ static llparse_state_t llhttp__internal__run( } case 10: { p++; - goto s_n_llhttp__internal__n_invoke_test_lenient_flags_4; + goto s_n_llhttp__internal__n_invoke_test_lenient_flags_14; } case 13: { p++; @@ -2608,15 +2793,28 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } + case s_n_llhttp__internal__n_invoke_load_header_state: + s_n_llhttp__internal__n_invoke_load_header_state: { + switch (llhttp__internal__c_load_header_state(state, p, endp)) { + case 2: + goto s_n_llhttp__internal__n_invoke_test_flags_4; + case 3: + goto s_n_llhttp__internal__n_invoke_test_flags_5; + default: + goto s_n_llhttp__internal__n_header_value_discard_ws; + } + /* UNREACHABLE */; + abort(); + } case s_n_llhttp__internal__n_invoke_llhttp__on_header_field_complete: s_n_llhttp__internal__n_invoke_llhttp__on_header_field_complete: { switch (llhttp__on_header_field_complete(state, p, endp)) { case 0: - goto s_n_llhttp__internal__n_header_value_discard_ws; + goto s_n_llhttp__internal__n_invoke_load_header_state; case 21: - goto s_n_llhttp__internal__n_pause_15; + goto s_n_llhttp__internal__n_pause_19; default: - goto s_n_llhttp__internal__n_error_34; + goto s_n_llhttp__internal__n_error_45; } /* UNREACHABLE */; abort(); @@ -2631,7 +2829,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_span_end_llhttp__on_header_field_2; } default: { - goto s_n_llhttp__internal__n_error_46; + goto s_n_llhttp__internal__n_error_61; } } /* UNREACHABLE */; @@ -2669,7 +2867,7 @@ static llparse_state_t llhttp__internal__run( /* Load input */ input = _mm_loadu_si128((__m128i const*) p); - ranges = _mm_loadu_si128((__m128i const*) llparse_blob8); + ranges = _mm_loadu_si128((__m128i const*) llparse_blob7); /* Find first character that does not match `ranges` */ match_len = _mm_cmpestri(ranges, 16, @@ -2681,7 +2879,7 @@ static llparse_state_t llhttp__internal__run( p += match_len; goto s_n_llhttp__internal__n_header_field_general; } - ranges = _mm_loadu_si128((__m128i const*) llparse_blob9); + ranges = _mm_loadu_si128((__m128i const*) llparse_blob8); /* Find first character that does not match `ranges` */ match_len = _mm_cmpestri(ranges, 2, @@ -2715,7 +2913,7 @@ static llparse_state_t llhttp__internal__run( } switch (*p) { case ' ': { - goto s_n_llhttp__internal__n_invoke_test_lenient_flags_3; + goto s_n_llhttp__internal__n_invoke_test_lenient_flags_13; } case ':': { goto s_n_llhttp__internal__n_span_end_llhttp__on_header_field_1; @@ -2734,7 +2932,7 @@ static llparse_state_t llhttp__internal__run( if (p == endp) { return s_n_llhttp__internal__n_header_field_3; } - match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob2, 6); + match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob1, 6); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { @@ -2759,7 +2957,7 @@ static llparse_state_t llhttp__internal__run( if (p == endp) { return s_n_llhttp__internal__n_header_field_4; } - match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob10, 10); + match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob9, 10); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { @@ -2805,7 +3003,7 @@ static llparse_state_t llhttp__internal__run( if (p == endp) { return s_n_llhttp__internal__n_header_field_1; } - match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob1, 2); + match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob0, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { @@ -2829,7 +3027,7 @@ static llparse_state_t llhttp__internal__run( if (p == endp) { return s_n_llhttp__internal__n_header_field_5; } - match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob11, 15); + match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob10, 15); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { @@ -2854,7 +3052,7 @@ static llparse_state_t llhttp__internal__run( if (p == endp) { return s_n_llhttp__internal__n_header_field_6; } - match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob12, 16); + match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob11, 16); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { @@ -2879,7 +3077,7 @@ static llparse_state_t llhttp__internal__run( if (p == endp) { return s_n_llhttp__internal__n_header_field_7; } - match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob13, 6); + match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob12, 6); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { @@ -2944,12 +3142,16 @@ static llparse_state_t llhttp__internal__run( } switch (*p) { case 10: { - goto s_n_llhttp__internal__n_headers_almost_done; + p++; + goto s_n_llhttp__internal__n_invoke_test_lenient_flags_1; } case 13: { p++; goto s_n_llhttp__internal__n_headers_almost_done; } + case ':': { + goto s_n_llhttp__internal__n_error_44; + } default: { goto s_n_llhttp__internal__n_span_start_llhttp__on_header_field; } @@ -3028,7 +3230,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_url_to_http_09; } default: { - goto s_n_llhttp__internal__n_error_47; + goto s_n_llhttp__internal__n_error_62; } } /* UNREACHABLE */; @@ -3053,7 +3255,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_url_skip_lf_to_http09_1; } default: { - goto s_n_llhttp__internal__n_error_47; + goto s_n_llhttp__internal__n_error_62; } } /* UNREACHABLE */; @@ -3066,27 +3268,27 @@ static llparse_state_t llhttp__internal__run( if (p == endp) { return s_n_llhttp__internal__n_req_pri_upgrade; } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob15, 10); + match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob14, 10); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; - goto s_n_llhttp__internal__n_error_53; + goto s_n_llhttp__internal__n_error_70; } case kMatchPause: { return s_n_llhttp__internal__n_req_pri_upgrade; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_54; + goto s_n_llhttp__internal__n_error_71; } } /* UNREACHABLE */; abort(); } - case s_n_llhttp__internal__n_req_http_complete_1: - s_n_llhttp__internal__n_req_http_complete_1: { + case s_n_llhttp__internal__n_req_http_complete_crlf: + s_n_llhttp__internal__n_req_http_complete_crlf: { if (p == endp) { - return s_n_llhttp__internal__n_req_http_complete_1; + return s_n_llhttp__internal__n_req_http_complete_crlf; } switch (*p) { case 10: { @@ -3094,7 +3296,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_headers_start; } default: { - goto s_n_llhttp__internal__n_error_52; + goto s_n_llhttp__internal__n_invoke_test_lenient_flags_25; } } /* UNREACHABLE */; @@ -3108,14 +3310,14 @@ static llparse_state_t llhttp__internal__run( switch (*p) { case 10: { p++; - goto s_n_llhttp__internal__n_headers_start; + goto s_n_llhttp__internal__n_invoke_test_lenient_flags_24; } case 13: { p++; - goto s_n_llhttp__internal__n_req_http_complete_1; + goto s_n_llhttp__internal__n_req_http_complete_crlf; } default: { - goto s_n_llhttp__internal__n_error_52; + goto s_n_llhttp__internal__n_error_69; } } /* UNREACHABLE */; @@ -3138,15 +3340,15 @@ static llparse_state_t llhttp__internal__run( case 0: goto s_n_llhttp__internal__n_invoke_load_method_1; case 21: - goto s_n_llhttp__internal__n_pause_17; + goto s_n_llhttp__internal__n_pause_21; default: - goto s_n_llhttp__internal__n_error_51; + goto s_n_llhttp__internal__n_error_66; } /* UNREACHABLE */; abort(); } - case s_n_llhttp__internal__n_error_50: - s_n_llhttp__internal__n_error_50: { + case s_n_llhttp__internal__n_error_65: + s_n_llhttp__internal__n_error_65: { state->error = 0x9; state->reason = "Invalid HTTP version"; state->error_pos = (const char*) p; @@ -3155,8 +3357,8 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - case s_n_llhttp__internal__n_error_55: - s_n_llhttp__internal__n_error_55: { + case s_n_llhttp__internal__n_error_72: + s_n_llhttp__internal__n_error_72: { state->error = 0x9; state->reason = "Invalid minor version"; state->error_pos = (const char*) p; @@ -3228,8 +3430,8 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - case s_n_llhttp__internal__n_error_56: - s_n_llhttp__internal__n_error_56: { + case s_n_llhttp__internal__n_error_73: + s_n_llhttp__internal__n_error_73: { state->error = 0x9; state->reason = "Expected dot"; state->error_pos = (const char*) p; @@ -3255,8 +3457,8 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - case s_n_llhttp__internal__n_error_57: - s_n_llhttp__internal__n_error_57: { + case s_n_llhttp__internal__n_error_74: + s_n_llhttp__internal__n_error_74: { state->error = 0x9; state->reason = "Invalid major version"; state->error_pos = (const char*) p; @@ -3346,7 +3548,7 @@ static llparse_state_t llhttp__internal__run( if (p == endp) { return s_n_llhttp__internal__n_req_http_start_1; } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob14, 4); + match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob13, 4); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { @@ -3357,7 +3559,7 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_req_http_start_1; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_60; + goto s_n_llhttp__internal__n_error_77; } } /* UNREACHABLE */; @@ -3370,7 +3572,7 @@ static llparse_state_t llhttp__internal__run( if (p == endp) { return s_n_llhttp__internal__n_req_http_start_2; } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob16, 3); + match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob15, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { @@ -3381,7 +3583,7 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_req_http_start_2; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_60; + goto s_n_llhttp__internal__n_error_77; } } /* UNREACHABLE */; @@ -3394,7 +3596,7 @@ static llparse_state_t llhttp__internal__run( if (p == endp) { return s_n_llhttp__internal__n_req_http_start_3; } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob17, 4); + match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob16, 4); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { @@ -3405,7 +3607,7 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_req_http_start_3; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_60; + goto s_n_llhttp__internal__n_error_77; } } /* UNREACHABLE */; @@ -3434,7 +3636,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_req_http_start_3; } default: { - goto s_n_llhttp__internal__n_error_60; + goto s_n_llhttp__internal__n_error_77; } } /* UNREACHABLE */; @@ -3525,7 +3727,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_url_fragment; } default: { - goto s_n_llhttp__internal__n_error_61; + goto s_n_llhttp__internal__n_error_78; } } /* UNREACHABLE */; @@ -3586,7 +3788,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_span_end_stub_query_3; } default: { - goto s_n_llhttp__internal__n_error_62; + goto s_n_llhttp__internal__n_error_79; } } /* UNREACHABLE */; @@ -3624,7 +3826,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_url_query; } default: { - goto s_n_llhttp__internal__n_error_63; + goto s_n_llhttp__internal__n_error_80; } } /* UNREACHABLE */; @@ -3749,10 +3951,10 @@ static llparse_state_t llhttp__internal__run( } case 8: { p++; - goto s_n_llhttp__internal__n_error_64; + goto s_n_llhttp__internal__n_error_81; } default: { - goto s_n_llhttp__internal__n_error_65; + goto s_n_llhttp__internal__n_error_82; } } /* UNREACHABLE */; @@ -3811,7 +4013,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_url_server_with_at; } default: { - goto s_n_llhttp__internal__n_error_66; + goto s_n_llhttp__internal__n_error_83; } } /* UNREACHABLE */; @@ -3828,7 +4030,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_url_server; } default: { - goto s_n_llhttp__internal__n_error_68; + goto s_n_llhttp__internal__n_error_84; } } /* UNREACHABLE */; @@ -3846,7 +4048,7 @@ static llparse_state_t llhttp__internal__run( } case 10: { p++; - goto s_n_llhttp__internal__n_error_67; + goto s_n_llhttp__internal__n_error_2; } case 12: { p++; @@ -3854,18 +4056,18 @@ static llparse_state_t llhttp__internal__run( } case 13: { p++; - goto s_n_llhttp__internal__n_error_67; + goto s_n_llhttp__internal__n_error_2; } case ' ': { p++; - goto s_n_llhttp__internal__n_error_67; + goto s_n_llhttp__internal__n_error_2; } case '/': { p++; goto s_n_llhttp__internal__n_url_schema_delim_1; } default: { - goto s_n_llhttp__internal__n_error_68; + goto s_n_llhttp__internal__n_error_84; } } /* UNREACHABLE */; @@ -3884,14 +4086,14 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_url_schema: s_n_llhttp__internal__n_url_schema: { static uint8_t lookup_table[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 1, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, - 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, - 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, + 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, + 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -3910,18 +4112,14 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_error_2; } case 2: { - p++; - goto s_n_llhttp__internal__n_error_67; - } - case 3: { goto s_n_llhttp__internal__n_span_end_stub_schema; } - case 4: { + case 3: { p++; goto s_n_llhttp__internal__n_url_schema; } default: { - goto s_n_llhttp__internal__n_error_69; + goto s_n_llhttp__internal__n_error_85; } } /* UNREACHABLE */; @@ -3930,14 +4128,14 @@ static llparse_state_t llhttp__internal__run( case s_n_llhttp__internal__n_url_start: s_n_llhttp__internal__n_url_start: { static uint8_t lookup_table[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 1, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, - 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, + 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, + 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -3956,17 +4154,13 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_error_2; } case 2: { - p++; - goto s_n_llhttp__internal__n_error_67; - } - case 3: { goto s_n_llhttp__internal__n_span_start_stub_path_2; } - case 4: { + case 3: { goto s_n_llhttp__internal__n_url_schema; } default: { - goto s_n_llhttp__internal__n_error_70; + goto s_n_llhttp__internal__n_error_86; } } /* UNREACHABLE */; @@ -4064,7 +4258,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_req_spaces_before_url; } default: { - goto s_n_llhttp__internal__n_error_71; + goto s_n_llhttp__internal__n_error_87; } } /* UNREACHABLE */; @@ -4076,9 +4270,9 @@ static llparse_state_t llhttp__internal__run( case 0: goto s_n_llhttp__internal__n_req_first_space_before_url; case 21: - goto s_n_llhttp__internal__n_pause_22; + goto s_n_llhttp__internal__n_pause_26; default: - goto s_n_llhttp__internal__n_error_83; + goto s_n_llhttp__internal__n_error_106; } /* UNREACHABLE */; abort(); @@ -4095,7 +4289,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_store_method_1; } default: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -4108,7 +4302,7 @@ static llparse_state_t llhttp__internal__run( if (p == endp) { return s_n_llhttp__internal__n_after_start_req_3; } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob18, 6); + match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob17, 6); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { @@ -4120,7 +4314,7 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_3; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -4141,7 +4335,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_after_start_req_3; } default: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -4154,7 +4348,7 @@ static llparse_state_t llhttp__internal__run( if (p == endp) { return s_n_llhttp__internal__n_after_start_req_4; } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob19, 3); + match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob18, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { @@ -4166,7 +4360,7 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_4; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -4179,7 +4373,7 @@ static llparse_state_t llhttp__internal__run( if (p == endp) { return s_n_llhttp__internal__n_after_start_req_6; } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob20, 6); + match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob19, 6); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { @@ -4191,7 +4385,7 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_6; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -4204,7 +4398,7 @@ static llparse_state_t llhttp__internal__run( if (p == endp) { return s_n_llhttp__internal__n_after_start_req_8; } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob21, 4); + match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob20, 4); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { @@ -4216,7 +4410,7 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_8; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -4234,7 +4428,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_store_method_1; } default: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -4255,7 +4449,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_after_start_req_9; } default: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -4276,7 +4470,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_after_start_req_7; } default: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -4289,7 +4483,7 @@ static llparse_state_t llhttp__internal__run( if (p == endp) { return s_n_llhttp__internal__n_after_start_req_12; } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob22, 3); + match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob21, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { @@ -4301,7 +4495,7 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_12; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -4314,7 +4508,7 @@ static llparse_state_t llhttp__internal__run( if (p == endp) { return s_n_llhttp__internal__n_after_start_req_13; } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob23, 5); + match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob22, 5); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { @@ -4326,7 +4520,7 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_13; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -4347,7 +4541,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_after_start_req_13; } default: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -4364,7 +4558,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_after_start_req_11; } default: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -4377,7 +4571,7 @@ static llparse_state_t llhttp__internal__run( if (p == endp) { return s_n_llhttp__internal__n_after_start_req_14; } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob24, 4); + match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob23, 4); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { @@ -4389,7 +4583,7 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_14; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -4402,7 +4596,7 @@ static llparse_state_t llhttp__internal__run( if (p == endp) { return s_n_llhttp__internal__n_after_start_req_17; } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob26, 9); + match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob25, 9); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { @@ -4414,7 +4608,7 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_17; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -4445,7 +4639,7 @@ static llparse_state_t llhttp__internal__run( if (p == endp) { return s_n_llhttp__internal__n_after_start_req_15; } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob25, 2); + match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob24, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { @@ -4456,7 +4650,7 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_15; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -4469,7 +4663,7 @@ static llparse_state_t llhttp__internal__run( if (p == endp) { return s_n_llhttp__internal__n_after_start_req_18; } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob27, 3); + match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob26, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { @@ -4481,7 +4675,7 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_18; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -4494,7 +4688,7 @@ static llparse_state_t llhttp__internal__run( if (p == endp) { return s_n_llhttp__internal__n_after_start_req_20; } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob28, 2); + match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob27, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { @@ -4506,7 +4700,7 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_20; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -4519,7 +4713,7 @@ static llparse_state_t llhttp__internal__run( if (p == endp) { return s_n_llhttp__internal__n_after_start_req_21; } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob29, 2); + match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob28, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { @@ -4531,7 +4725,7 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_21; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -4552,7 +4746,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_after_start_req_21; } default: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -4565,7 +4759,7 @@ static llparse_state_t llhttp__internal__run( if (p == endp) { return s_n_llhttp__internal__n_after_start_req_23; } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob30, 6); + match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob29, 6); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { @@ -4577,7 +4771,7 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_23; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -4590,7 +4784,7 @@ static llparse_state_t llhttp__internal__run( if (p == endp) { return s_n_llhttp__internal__n_after_start_req_24; } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob31, 3); + match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob30, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { @@ -4602,7 +4796,7 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_24; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -4615,7 +4809,7 @@ static llparse_state_t llhttp__internal__run( if (p == endp) { return s_n_llhttp__internal__n_after_start_req_26; } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob32, 7); + match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob31, 7); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { @@ -4627,7 +4821,7 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_26; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -4640,7 +4834,7 @@ static llparse_state_t llhttp__internal__run( if (p == endp) { return s_n_llhttp__internal__n_after_start_req_28; } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob33, 6); + match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob32, 6); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { @@ -4652,7 +4846,7 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_28; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -4670,7 +4864,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_store_method_1; } default: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -4691,7 +4885,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_after_start_req_29; } default: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -4712,7 +4906,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_after_start_req_27; } default: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -4725,7 +4919,7 @@ static llparse_state_t llhttp__internal__run( if (p == endp) { return s_n_llhttp__internal__n_after_start_req_30; } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob34, 2); + match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob33, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { @@ -4737,7 +4931,7 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_30; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -4766,7 +4960,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_after_start_req_30; } default: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -4779,7 +4973,7 @@ static llparse_state_t llhttp__internal__run( if (p == endp) { return s_n_llhttp__internal__n_after_start_req_31; } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob35, 5); + match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob34, 5); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { @@ -4791,7 +4985,7 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_31; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -4804,7 +4998,7 @@ static llparse_state_t llhttp__internal__run( if (p == endp) { return s_n_llhttp__internal__n_after_start_req_32; } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob36, 6); + match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob35, 6); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { @@ -4816,7 +5010,7 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_32; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -4829,7 +5023,7 @@ static llparse_state_t llhttp__internal__run( if (p == endp) { return s_n_llhttp__internal__n_after_start_req_35; } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob37, 2); + match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob36, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { @@ -4841,7 +5035,7 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_35; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -4854,7 +5048,7 @@ static llparse_state_t llhttp__internal__run( if (p == endp) { return s_n_llhttp__internal__n_after_start_req_36; } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob38, 2); + match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob37, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { @@ -4866,7 +5060,7 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_36; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -4887,7 +5081,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_after_start_req_36; } default: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -4900,7 +5094,7 @@ static llparse_state_t llhttp__internal__run( if (p == endp) { return s_n_llhttp__internal__n_after_start_req_37; } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob39, 2); + match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob38, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { @@ -4912,7 +5106,7 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_37; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -4925,7 +5119,7 @@ static llparse_state_t llhttp__internal__run( if (p == endp) { return s_n_llhttp__internal__n_after_start_req_38; } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob40, 2); + match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob39, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { @@ -4937,7 +5131,7 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_38; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -4950,7 +5144,7 @@ static llparse_state_t llhttp__internal__run( if (p == endp) { return s_n_llhttp__internal__n_after_start_req_42; } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob41, 3); + match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob40, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { @@ -4962,7 +5156,7 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_42; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -4975,7 +5169,7 @@ static llparse_state_t llhttp__internal__run( if (p == endp) { return s_n_llhttp__internal__n_after_start_req_43; } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob42, 4); + match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob41, 4); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { @@ -4987,7 +5181,7 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_43; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -5008,7 +5202,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_after_start_req_43; } default: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -5025,7 +5219,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_after_start_req_41; } default: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -5047,7 +5241,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_after_start_req_40; } default: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -5060,7 +5254,7 @@ static llparse_state_t llhttp__internal__run( if (p == endp) { return s_n_llhttp__internal__n_after_start_req_45; } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob43, 2); + match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob42, 2); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { @@ -5072,7 +5266,7 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_after_start_req_45; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -5094,7 +5288,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_store_method_1; } default: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -5127,32 +5321,32 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_after_start_req_44; } default: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; abort(); } - case s_n_llhttp__internal__n_after_start_req_48: - s_n_llhttp__internal__n_after_start_req_48: { + case s_n_llhttp__internal__n_after_start_req_46: + s_n_llhttp__internal__n_after_start_req_46: { llparse_match_t match_seq; if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_48; + return s_n_llhttp__internal__n_after_start_req_46; } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob44, 3); + match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob43, 4); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; - match = 17; + match = 46; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_48; + return s_n_llhttp__internal__n_after_start_req_46; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -5165,19 +5359,19 @@ static llparse_state_t llhttp__internal__run( if (p == endp) { return s_n_llhttp__internal__n_after_start_req_49; } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob45, 3); + match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob44, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; - match = 44; + match = 17; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_after_start_req_49; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -5190,19 +5384,19 @@ static llparse_state_t llhttp__internal__run( if (p == endp) { return s_n_llhttp__internal__n_after_start_req_50; } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob46, 5); + match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob45, 3); p = match_seq.current; switch (match_seq.status) { case kMatchComplete: { p++; - match = 43; + match = 44; goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { return s_n_llhttp__internal__n_after_start_req_50; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -5215,6 +5409,31 @@ static llparse_state_t llhttp__internal__run( if (p == endp) { return s_n_llhttp__internal__n_after_start_req_51; } + match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob46, 5); + p = match_seq.current; + switch (match_seq.status) { + case kMatchComplete: { + p++; + match = 43; + goto s_n_llhttp__internal__n_invoke_store_method_1; + } + case kMatchPause: { + return s_n_llhttp__internal__n_after_start_req_51; + } + case kMatchMismatch: { + goto s_n_llhttp__internal__n_error_107; + } + } + /* UNREACHABLE */; + abort(); + } + case s_n_llhttp__internal__n_after_start_req_52: + s_n_llhttp__internal__n_after_start_req_52: { + llparse_match_t match_seq; + + if (p == endp) { + return s_n_llhttp__internal__n_after_start_req_52; + } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob47, 3); p = match_seq.current; switch (match_seq.status) { @@ -5224,67 +5443,67 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_51; + return s_n_llhttp__internal__n_after_start_req_52; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; abort(); } - case s_n_llhttp__internal__n_after_start_req_47: - s_n_llhttp__internal__n_after_start_req_47: { + case s_n_llhttp__internal__n_after_start_req_48: + s_n_llhttp__internal__n_after_start_req_48: { if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_47; + return s_n_llhttp__internal__n_after_start_req_48; } switch (*p) { case 'B': { p++; - goto s_n_llhttp__internal__n_after_start_req_48; + goto s_n_llhttp__internal__n_after_start_req_49; } case 'C': { p++; - goto s_n_llhttp__internal__n_after_start_req_49; + goto s_n_llhttp__internal__n_after_start_req_50; } case 'D': { p++; - goto s_n_llhttp__internal__n_after_start_req_50; + goto s_n_llhttp__internal__n_after_start_req_51; } case 'P': { p++; - goto s_n_llhttp__internal__n_after_start_req_51; + goto s_n_llhttp__internal__n_after_start_req_52; } default: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; abort(); } - case s_n_llhttp__internal__n_after_start_req_46: - s_n_llhttp__internal__n_after_start_req_46: { + case s_n_llhttp__internal__n_after_start_req_47: + s_n_llhttp__internal__n_after_start_req_47: { if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_46; + return s_n_llhttp__internal__n_after_start_req_47; } switch (*p) { case 'E': { p++; - goto s_n_llhttp__internal__n_after_start_req_47; + goto s_n_llhttp__internal__n_after_start_req_48; } default: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; abort(); } - case s_n_llhttp__internal__n_after_start_req_54: - s_n_llhttp__internal__n_after_start_req_54: { + case s_n_llhttp__internal__n_after_start_req_55: + s_n_llhttp__internal__n_after_start_req_55: { llparse_match_t match_seq; if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_54; + return s_n_llhttp__internal__n_after_start_req_55; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob48, 3); p = match_seq.current; @@ -5295,19 +5514,19 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_54; + return s_n_llhttp__internal__n_after_start_req_55; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; abort(); } - case s_n_llhttp__internal__n_after_start_req_56: - s_n_llhttp__internal__n_after_start_req_56: { + case s_n_llhttp__internal__n_after_start_req_57: + s_n_llhttp__internal__n_after_start_req_57: { if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_56; + return s_n_llhttp__internal__n_after_start_req_57; } switch (*p) { case 'P': { @@ -5316,18 +5535,18 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_store_method_1; } default: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; abort(); } - case s_n_llhttp__internal__n_after_start_req_57: - s_n_llhttp__internal__n_after_start_req_57: { + case s_n_llhttp__internal__n_after_start_req_58: + s_n_llhttp__internal__n_after_start_req_58: { llparse_match_t match_seq; if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_57; + return s_n_llhttp__internal__n_after_start_req_58; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob49, 9); p = match_seq.current; @@ -5338,63 +5557,63 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_57; + return s_n_llhttp__internal__n_after_start_req_58; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; abort(); } - case s_n_llhttp__internal__n_after_start_req_55: - s_n_llhttp__internal__n_after_start_req_55: { + case s_n_llhttp__internal__n_after_start_req_56: + s_n_llhttp__internal__n_after_start_req_56: { if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_55; + return s_n_llhttp__internal__n_after_start_req_56; } switch (*p) { case 'U': { p++; - goto s_n_llhttp__internal__n_after_start_req_56; + goto s_n_llhttp__internal__n_after_start_req_57; } case '_': { p++; - goto s_n_llhttp__internal__n_after_start_req_57; + goto s_n_llhttp__internal__n_after_start_req_58; } default: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; abort(); } - case s_n_llhttp__internal__n_after_start_req_53: - s_n_llhttp__internal__n_after_start_req_53: { + case s_n_llhttp__internal__n_after_start_req_54: + s_n_llhttp__internal__n_after_start_req_54: { if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_53; + return s_n_llhttp__internal__n_after_start_req_54; } switch (*p) { case 'A': { p++; - goto s_n_llhttp__internal__n_after_start_req_54; + goto s_n_llhttp__internal__n_after_start_req_55; } case 'T': { p++; - goto s_n_llhttp__internal__n_after_start_req_55; + goto s_n_llhttp__internal__n_after_start_req_56; } default: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; abort(); } - case s_n_llhttp__internal__n_after_start_req_58: - s_n_llhttp__internal__n_after_start_req_58: { + case s_n_llhttp__internal__n_after_start_req_59: + s_n_llhttp__internal__n_after_start_req_59: { llparse_match_t match_seq; if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_58; + return s_n_llhttp__internal__n_after_start_req_59; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob50, 4); p = match_seq.current; @@ -5405,21 +5624,21 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_58; + return s_n_llhttp__internal__n_after_start_req_59; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; abort(); } - case s_n_llhttp__internal__n_after_start_req_59: - s_n_llhttp__internal__n_after_start_req_59: { + case s_n_llhttp__internal__n_after_start_req_60: + s_n_llhttp__internal__n_after_start_req_60: { llparse_match_t match_seq; if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_59; + return s_n_llhttp__internal__n_after_start_req_60; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob51, 7); p = match_seq.current; @@ -5430,46 +5649,46 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_59; + return s_n_llhttp__internal__n_after_start_req_60; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; abort(); } - case s_n_llhttp__internal__n_after_start_req_52: - s_n_llhttp__internal__n_after_start_req_52: { + case s_n_llhttp__internal__n_after_start_req_53: + s_n_llhttp__internal__n_after_start_req_53: { if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_52; + return s_n_llhttp__internal__n_after_start_req_53; } switch (*p) { case 'E': { p++; - goto s_n_llhttp__internal__n_after_start_req_53; + goto s_n_llhttp__internal__n_after_start_req_54; } case 'O': { p++; - goto s_n_llhttp__internal__n_after_start_req_58; + goto s_n_llhttp__internal__n_after_start_req_59; } case 'U': { p++; - goto s_n_llhttp__internal__n_after_start_req_59; + goto s_n_llhttp__internal__n_after_start_req_60; } default: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; abort(); } - case s_n_llhttp__internal__n_after_start_req_61: - s_n_llhttp__internal__n_after_start_req_61: { + case s_n_llhttp__internal__n_after_start_req_62: + s_n_llhttp__internal__n_after_start_req_62: { llparse_match_t match_seq; if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_61; + return s_n_llhttp__internal__n_after_start_req_62; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob52, 6); p = match_seq.current; @@ -5480,21 +5699,21 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_61; + return s_n_llhttp__internal__n_after_start_req_62; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; abort(); } - case s_n_llhttp__internal__n_after_start_req_62: - s_n_llhttp__internal__n_after_start_req_62: { + case s_n_llhttp__internal__n_after_start_req_63: + s_n_llhttp__internal__n_after_start_req_63: { llparse_match_t match_seq; if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_62; + return s_n_llhttp__internal__n_after_start_req_63; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob53, 3); p = match_seq.current; @@ -5505,42 +5724,42 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_62; + return s_n_llhttp__internal__n_after_start_req_63; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; abort(); } - case s_n_llhttp__internal__n_after_start_req_60: - s_n_llhttp__internal__n_after_start_req_60: { + case s_n_llhttp__internal__n_after_start_req_61: + s_n_llhttp__internal__n_after_start_req_61: { if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_60; + return s_n_llhttp__internal__n_after_start_req_61; } switch (*p) { case 'E': { p++; - goto s_n_llhttp__internal__n_after_start_req_61; + goto s_n_llhttp__internal__n_after_start_req_62; } case 'R': { p++; - goto s_n_llhttp__internal__n_after_start_req_62; + goto s_n_llhttp__internal__n_after_start_req_63; } default: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; abort(); } - case s_n_llhttp__internal__n_after_start_req_65: - s_n_llhttp__internal__n_after_start_req_65: { + case s_n_llhttp__internal__n_after_start_req_66: + s_n_llhttp__internal__n_after_start_req_66: { llparse_match_t match_seq; if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_65; + return s_n_llhttp__internal__n_after_start_req_66; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob54, 3); p = match_seq.current; @@ -5551,21 +5770,21 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_65; + return s_n_llhttp__internal__n_after_start_req_66; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; abort(); } - case s_n_llhttp__internal__n_after_start_req_67: - s_n_llhttp__internal__n_after_start_req_67: { + case s_n_llhttp__internal__n_after_start_req_68: + s_n_llhttp__internal__n_after_start_req_68: { llparse_match_t match_seq; if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_67; + return s_n_llhttp__internal__n_after_start_req_68; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob55, 2); p = match_seq.current; @@ -5576,21 +5795,21 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_67; + return s_n_llhttp__internal__n_after_start_req_68; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; abort(); } - case s_n_llhttp__internal__n_after_start_req_68: - s_n_llhttp__internal__n_after_start_req_68: { + case s_n_llhttp__internal__n_after_start_req_69: + s_n_llhttp__internal__n_after_start_req_69: { llparse_match_t match_seq; if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_68; + return s_n_llhttp__internal__n_after_start_req_69; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob56, 2); p = match_seq.current; @@ -5601,42 +5820,42 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_68; + return s_n_llhttp__internal__n_after_start_req_69; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; abort(); } - case s_n_llhttp__internal__n_after_start_req_66: - s_n_llhttp__internal__n_after_start_req_66: { + case s_n_llhttp__internal__n_after_start_req_67: + s_n_llhttp__internal__n_after_start_req_67: { if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_66; + return s_n_llhttp__internal__n_after_start_req_67; } switch (*p) { case 'I': { p++; - goto s_n_llhttp__internal__n_after_start_req_67; + goto s_n_llhttp__internal__n_after_start_req_68; } case 'O': { p++; - goto s_n_llhttp__internal__n_after_start_req_68; + goto s_n_llhttp__internal__n_after_start_req_69; } default: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; abort(); } - case s_n_llhttp__internal__n_after_start_req_69: - s_n_llhttp__internal__n_after_start_req_69: { + case s_n_llhttp__internal__n_after_start_req_70: + s_n_llhttp__internal__n_after_start_req_70: { llparse_match_t match_seq; if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_69; + return s_n_llhttp__internal__n_after_start_req_70; } match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob57, 8); p = match_seq.current; @@ -5647,52 +5866,52 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_store_method_1; } case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_69; + return s_n_llhttp__internal__n_after_start_req_70; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; abort(); } - case s_n_llhttp__internal__n_after_start_req_64: - s_n_llhttp__internal__n_after_start_req_64: { + case s_n_llhttp__internal__n_after_start_req_65: + s_n_llhttp__internal__n_after_start_req_65: { if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_64; + return s_n_llhttp__internal__n_after_start_req_65; } switch (*p) { case 'B': { p++; - goto s_n_llhttp__internal__n_after_start_req_65; + goto s_n_llhttp__internal__n_after_start_req_66; } case 'L': { p++; - goto s_n_llhttp__internal__n_after_start_req_66; + goto s_n_llhttp__internal__n_after_start_req_67; } case 'S': { p++; - goto s_n_llhttp__internal__n_after_start_req_69; + goto s_n_llhttp__internal__n_after_start_req_70; } default: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; abort(); } - case s_n_llhttp__internal__n_after_start_req_63: - s_n_llhttp__internal__n_after_start_req_63: { + case s_n_llhttp__internal__n_after_start_req_64: + s_n_llhttp__internal__n_after_start_req_64: { if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_63; + return s_n_llhttp__internal__n_after_start_req_64; } switch (*p) { case 'N': { p++; - goto s_n_llhttp__internal__n_after_start_req_64; + goto s_n_llhttp__internal__n_after_start_req_65; } default: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -5752,24 +5971,28 @@ static llparse_state_t llhttp__internal__run( p++; goto s_n_llhttp__internal__n_after_start_req_33; } - case 'R': { + case 'Q': { p++; goto s_n_llhttp__internal__n_after_start_req_46; } + case 'R': { + p++; + goto s_n_llhttp__internal__n_after_start_req_47; + } case 'S': { p++; - goto s_n_llhttp__internal__n_after_start_req_52; + goto s_n_llhttp__internal__n_after_start_req_53; } case 'T': { p++; - goto s_n_llhttp__internal__n_after_start_req_60; + goto s_n_llhttp__internal__n_after_start_req_61; } case 'U': { p++; - goto s_n_llhttp__internal__n_after_start_req_63; + goto s_n_llhttp__internal__n_after_start_req_64; } default: { - goto s_n_llhttp__internal__n_error_84; + goto s_n_llhttp__internal__n_error_107; } } /* UNREACHABLE */; @@ -5786,19 +6009,6 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - case s_n_llhttp__internal__n_invoke_llhttp__on_status_complete: - s_n_llhttp__internal__n_invoke_llhttp__on_status_complete: { - switch (llhttp__on_status_complete(state, p, endp)) { - case 0: - goto s_n_llhttp__internal__n_headers_start; - case 21: - goto s_n_llhttp__internal__n_pause_20; - default: - goto s_n_llhttp__internal__n_error_75; - } - /* UNREACHABLE */; - abort(); - } case s_n_llhttp__internal__n_res_line_almost_done: s_n_llhttp__internal__n_res_line_almost_done: { if (p == endp) { @@ -5809,13 +6019,28 @@ static llparse_state_t llhttp__internal__run( p++; goto s_n_llhttp__internal__n_invoke_llhttp__on_status_complete; } + case 13: { + p++; + goto s_n_llhttp__internal__n_invoke_llhttp__on_status_complete; + } default: { - goto s_n_llhttp__internal__n_error_76; + goto s_n_llhttp__internal__n_invoke_test_lenient_flags_28; } } /* UNREACHABLE */; abort(); } + case s_n_llhttp__internal__n_invoke_test_lenient_flags_29: + s_n_llhttp__internal__n_invoke_test_lenient_flags_29: { + switch (llhttp__internal__c_test_lenient_flags_1(state, p, endp)) { + case 1: + goto s_n_llhttp__internal__n_invoke_llhttp__on_status_complete; + default: + goto s_n_llhttp__internal__n_error_93; + } + /* UNREACHABLE */; + abort(); + } case s_n_llhttp__internal__n_res_status: s_n_llhttp__internal__n_res_status: { if (p == endp) { @@ -5847,54 +6072,161 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - case s_n_llhttp__internal__n_res_status_start: - s_n_llhttp__internal__n_res_status_start: { + case s_n_llhttp__internal__n_res_status_code_otherwise: + s_n_llhttp__internal__n_res_status_code_otherwise: { if (p == endp) { - return s_n_llhttp__internal__n_res_status_start; + return s_n_llhttp__internal__n_res_status_code_otherwise; } switch (*p) { case 10: { p++; - goto s_n_llhttp__internal__n_invoke_llhttp__on_status_complete; + goto s_n_llhttp__internal__n_invoke_test_lenient_flags_27; } case 13: { p++; goto s_n_llhttp__internal__n_res_line_almost_done; } - default: { + case ' ': { + p++; goto s_n_llhttp__internal__n_span_start_llhttp__on_status; } + default: { + goto s_n_llhttp__internal__n_error_94; + } } /* UNREACHABLE */; abort(); } - case s_n_llhttp__internal__n_res_status_code_otherwise: - s_n_llhttp__internal__n_res_status_code_otherwise: { + case s_n_llhttp__internal__n_res_status_code_digit_3: + s_n_llhttp__internal__n_res_status_code_digit_3: { if (p == endp) { - return s_n_llhttp__internal__n_res_status_code_otherwise; + return s_n_llhttp__internal__n_res_status_code_digit_3; } switch (*p) { - case 10: { - goto s_n_llhttp__internal__n_res_status_start; + case '0': { + p++; + match = 0; + goto s_n_llhttp__internal__n_invoke_mul_add_status_code_2; } - case 13: { - goto s_n_llhttp__internal__n_res_status_start; + case '1': { + p++; + match = 1; + goto s_n_llhttp__internal__n_invoke_mul_add_status_code_2; } - case ' ': { + case '2': { + p++; + match = 2; + goto s_n_llhttp__internal__n_invoke_mul_add_status_code_2; + } + case '3': { + p++; + match = 3; + goto s_n_llhttp__internal__n_invoke_mul_add_status_code_2; + } + case '4': { + p++; + match = 4; + goto s_n_llhttp__internal__n_invoke_mul_add_status_code_2; + } + case '5': { + p++; + match = 5; + goto s_n_llhttp__internal__n_invoke_mul_add_status_code_2; + } + case '6': { + p++; + match = 6; + goto s_n_llhttp__internal__n_invoke_mul_add_status_code_2; + } + case '7': { + p++; + match = 7; + goto s_n_llhttp__internal__n_invoke_mul_add_status_code_2; + } + case '8': { + p++; + match = 8; + goto s_n_llhttp__internal__n_invoke_mul_add_status_code_2; + } + case '9': { p++; - goto s_n_llhttp__internal__n_res_status_start; + match = 9; + goto s_n_llhttp__internal__n_invoke_mul_add_status_code_2; } default: { - goto s_n_llhttp__internal__n_error_77; + goto s_n_llhttp__internal__n_error_96; + } + } + /* UNREACHABLE */; + abort(); + } + case s_n_llhttp__internal__n_res_status_code_digit_2: + s_n_llhttp__internal__n_res_status_code_digit_2: { + if (p == endp) { + return s_n_llhttp__internal__n_res_status_code_digit_2; + } + switch (*p) { + case '0': { + p++; + match = 0; + goto s_n_llhttp__internal__n_invoke_mul_add_status_code_1; + } + case '1': { + p++; + match = 1; + goto s_n_llhttp__internal__n_invoke_mul_add_status_code_1; + } + case '2': { + p++; + match = 2; + goto s_n_llhttp__internal__n_invoke_mul_add_status_code_1; + } + case '3': { + p++; + match = 3; + goto s_n_llhttp__internal__n_invoke_mul_add_status_code_1; + } + case '4': { + p++; + match = 4; + goto s_n_llhttp__internal__n_invoke_mul_add_status_code_1; + } + case '5': { + p++; + match = 5; + goto s_n_llhttp__internal__n_invoke_mul_add_status_code_1; + } + case '6': { + p++; + match = 6; + goto s_n_llhttp__internal__n_invoke_mul_add_status_code_1; + } + case '7': { + p++; + match = 7; + goto s_n_llhttp__internal__n_invoke_mul_add_status_code_1; + } + case '8': { + p++; + match = 8; + goto s_n_llhttp__internal__n_invoke_mul_add_status_code_1; + } + case '9': { + p++; + match = 9; + goto s_n_llhttp__internal__n_invoke_mul_add_status_code_1; + } + default: { + goto s_n_llhttp__internal__n_error_98; } } /* UNREACHABLE */; abort(); } - case s_n_llhttp__internal__n_res_status_code: - s_n_llhttp__internal__n_res_status_code: { + case s_n_llhttp__internal__n_res_status_code_digit_1: + s_n_llhttp__internal__n_res_status_code_digit_1: { if (p == endp) { - return s_n_llhttp__internal__n_res_status_code; + return s_n_llhttp__internal__n_res_status_code_digit_1; } switch (*p) { case '0': { @@ -5948,7 +6280,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_mul_add_status_code; } default: { - goto s_n_llhttp__internal__n_res_status_code_otherwise; + goto s_n_llhttp__internal__n_error_100; } } /* UNREACHABLE */; @@ -5965,7 +6297,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_invoke_update_status_code; } default: { - goto s_n_llhttp__internal__n_error_78; + goto s_n_llhttp__internal__n_error_101; } } /* UNREACHABLE */; @@ -5977,15 +6309,15 @@ static llparse_state_t llhttp__internal__run( case 0: goto s_n_llhttp__internal__n_res_after_version; case 21: - goto s_n_llhttp__internal__n_pause_21; + goto s_n_llhttp__internal__n_pause_25; default: - goto s_n_llhttp__internal__n_error_73; + goto s_n_llhttp__internal__n_error_89; } /* UNREACHABLE */; abort(); } - case s_n_llhttp__internal__n_error_72: - s_n_llhttp__internal__n_error_72: { + case s_n_llhttp__internal__n_error_88: + s_n_llhttp__internal__n_error_88: { state->error = 0x9; state->reason = "Invalid HTTP version"; state->error_pos = (const char*) p; @@ -5994,8 +6326,8 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - case s_n_llhttp__internal__n_error_79: - s_n_llhttp__internal__n_error_79: { + case s_n_llhttp__internal__n_error_102: + s_n_llhttp__internal__n_error_102: { state->error = 0x9; state->reason = "Invalid minor version"; state->error_pos = (const char*) p; @@ -6067,8 +6399,8 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - case s_n_llhttp__internal__n_error_80: - s_n_llhttp__internal__n_error_80: { + case s_n_llhttp__internal__n_error_103: + s_n_llhttp__internal__n_error_103: { state->error = 0x9; state->reason = "Expected dot"; state->error_pos = (const char*) p; @@ -6094,8 +6426,8 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - case s_n_llhttp__internal__n_error_81: - s_n_llhttp__internal__n_error_81: { + case s_n_llhttp__internal__n_error_104: + s_n_llhttp__internal__n_error_104: { state->error = 0x9; state->reason = "Invalid major version"; state->error_pos = (const char*) p; @@ -6196,7 +6528,7 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_start_res; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_85; + goto s_n_llhttp__internal__n_error_108; } } /* UNREACHABLE */; @@ -6208,7 +6540,7 @@ static llparse_state_t llhttp__internal__run( case 0: goto s_n_llhttp__internal__n_req_first_space_before_url; case 21: - goto s_n_llhttp__internal__n_pause_19; + goto s_n_llhttp__internal__n_pause_23; default: goto s_n_llhttp__internal__n_error_1; } @@ -6234,7 +6566,7 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_req_or_res_method_2; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_82; + goto s_n_llhttp__internal__n_error_105; } } /* UNREACHABLE */; @@ -6267,7 +6599,7 @@ static llparse_state_t llhttp__internal__run( return s_n_llhttp__internal__n_req_or_res_method_3; } case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_82; + goto s_n_llhttp__internal__n_error_105; } } /* UNREACHABLE */; @@ -6288,7 +6620,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_req_or_res_method_3; } default: { - goto s_n_llhttp__internal__n_error_82; + goto s_n_llhttp__internal__n_error_105; } } /* UNREACHABLE */; @@ -6305,7 +6637,7 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_req_or_res_method_1; } default: { - goto s_n_llhttp__internal__n_error_82; + goto s_n_llhttp__internal__n_error_105; } } /* UNREACHABLE */; @@ -6386,15 +6718,6 @@ static llparse_state_t llhttp__internal__run( abort(); } s_n_llhttp__internal__n_error_2: { - state->error = 0x7; - state->reason = "Invalid characters in url (strict mode)"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_67: { state->error = 0x7; state->reason = "Invalid characters in url"; state->error_pos = (const char*) p; @@ -6427,7 +6750,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_7: { + s_n_llhttp__internal__n_error_8: { state->error = 0x5; state->reason = "Data after `Connection: close`"; state->error_pos = (const char*) p; @@ -6436,8 +6759,18 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_invoke_test_lenient_flags_1: { - switch (llhttp__internal__c_test_lenient_flags_1(state, p, endp)) { + s_n_llhttp__internal__n_invoke_test_lenient_flags_3: { + switch (llhttp__internal__c_test_lenient_flags_3(state, p, endp)) { + case 1: + goto s_n_llhttp__internal__n_closed; + default: + goto s_n_llhttp__internal__n_error_8; + } + /* UNREACHABLE */; + abort(); + } + s_n_llhttp__internal__n_invoke_test_lenient_flags_2: { + switch (llhttp__internal__c_test_lenient_flags_2(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_invoke_update_initial_message_completed; default: @@ -6449,12 +6782,12 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_invoke_update_finish_1: { switch (llhttp__internal__c_update_finish_1(state, p, endp)) { default: - goto s_n_llhttp__internal__n_invoke_test_lenient_flags_1; + goto s_n_llhttp__internal__n_invoke_test_lenient_flags_2; } /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_pause_11: { + s_n_llhttp__internal__n_pause_13: { state->error = 0x15; state->reason = "on_message_complete pause"; state->error_pos = (const char*) p; @@ -6463,7 +6796,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_28: { + s_n_llhttp__internal__n_error_38: { state->error = 0x12; state->reason = "`on_message_complete` callback error"; state->error_pos = (const char*) p; @@ -6472,7 +6805,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_pause_13: { + s_n_llhttp__internal__n_pause_15: { state->error = 0x15; state->reason = "on_chunk_complete pause"; state->error_pos = (const char*) p; @@ -6481,7 +6814,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_31: { + s_n_llhttp__internal__n_error_40: { state->error = 0x14; state->reason = "`on_chunk_complete` callback error"; state->error_pos = (const char*) p; @@ -6495,22 +6828,13 @@ static llparse_state_t llhttp__internal__run( case 0: goto s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_2; case 21: - goto s_n_llhttp__internal__n_pause_13; + goto s_n_llhttp__internal__n_pause_15; default: - goto s_n_llhttp__internal__n_error_31; + goto s_n_llhttp__internal__n_error_40; } /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_30: { - state->error = 0x4; - state->reason = "Content-Length can't be present with Transfer-Encoding"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } s_n_llhttp__internal__n_pause_2: { state->error = 0x15; state->reason = "on_message_complete pause"; @@ -6520,7 +6844,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_8: { + s_n_llhttp__internal__n_error_9: { state->error = 0x12; state->reason = "`on_message_complete` callback error"; state->error_pos = (const char*) p; @@ -6536,12 +6860,12 @@ static llparse_state_t llhttp__internal__run( case 21: goto s_n_llhttp__internal__n_pause_2; default: - goto s_n_llhttp__internal__n_error_8; + goto s_n_llhttp__internal__n_error_9; } /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_26: { + s_n_llhttp__internal__n_error_36: { state->error = 0xc; state->reason = "Chunk size overflow"; state->error_pos = (const char*) p; @@ -6550,16 +6874,35 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_pause_3: { - state->error = 0x15; - state->reason = "on_chunk_complete pause"; + s_n_llhttp__internal__n_error_10: { + state->error = 0xc; + state->reason = "Invalid character in chunk size"; + state->error_pos = (const char*) p; + state->_current = (void*) (intptr_t) s_error; + return s_error; + /* UNREACHABLE */; + abort(); + } + s_n_llhttp__internal__n_invoke_test_lenient_flags_4: { + switch (llhttp__internal__c_test_lenient_flags_4(state, p, endp)) { + case 1: + goto s_n_llhttp__internal__n_chunk_size_otherwise; + default: + goto s_n_llhttp__internal__n_error_10; + } + /* UNREACHABLE */; + abort(); + } + s_n_llhttp__internal__n_pause_3: { + state->error = 0x15; + state->reason = "on_chunk_complete pause"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_update_content_length_1; return s_error; /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_10: { + s_n_llhttp__internal__n_error_14: { state->error = 0x14; state->reason = "`on_chunk_complete` callback error"; state->error_pos = (const char*) p; @@ -6575,20 +6918,49 @@ static llparse_state_t llhttp__internal__run( case 21: goto s_n_llhttp__internal__n_pause_3; default: - goto s_n_llhttp__internal__n_error_10; + goto s_n_llhttp__internal__n_error_14; } /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_11: { + s_n_llhttp__internal__n_error_13: { + state->error = 0x19; + state->reason = "Missing expected CR after chunk data"; + state->error_pos = (const char*) p; + state->_current = (void*) (intptr_t) s_error; + return s_error; + /* UNREACHABLE */; + abort(); + } + s_n_llhttp__internal__n_invoke_test_lenient_flags_6: { + switch (llhttp__internal__c_test_lenient_flags_1(state, p, endp)) { + case 1: + goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_complete; + default: + goto s_n_llhttp__internal__n_error_13; + } + /* UNREACHABLE */; + abort(); + } + s_n_llhttp__internal__n_error_15: { state->error = 0x2; - state->reason = "Expected CRLF after chunk"; + state->reason = "Expected LF after chunk data"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } + s_n_llhttp__internal__n_invoke_test_lenient_flags_7: { + switch (llhttp__internal__c_test_lenient_flags_7(state, p, endp)) { + case 1: + goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_complete; + default: + goto s_n_llhttp__internal__n_error_15; + } + /* UNREACHABLE */; + abort(); + } s_n_llhttp__internal__n_span_end_llhttp__on_body: { const unsigned char* start; int err; @@ -6623,7 +6995,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_9: { + s_n_llhttp__internal__n_error_12: { state->error = 0x13; state->reason = "`on_chunk_header` callback error"; state->error_pos = (const char*) p; @@ -6639,12 +7011,12 @@ static llparse_state_t llhttp__internal__run( case 21: goto s_n_llhttp__internal__n_pause_4; default: - goto s_n_llhttp__internal__n_error_9; + goto s_n_llhttp__internal__n_error_12; } /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_12: { + s_n_llhttp__internal__n_error_16: { state->error = 0x2; state->reason = "Expected LF after chunk size"; state->error_pos = (const char*) p; @@ -6653,7 +7025,36 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_13: { + s_n_llhttp__internal__n_invoke_test_lenient_flags_8: { + switch (llhttp__internal__c_test_lenient_flags_8(state, p, endp)) { + case 1: + goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_header; + default: + goto s_n_llhttp__internal__n_error_16; + } + /* UNREACHABLE */; + abort(); + } + s_n_llhttp__internal__n_error_11: { + state->error = 0x19; + state->reason = "Missing expected CR after chunk size"; + state->error_pos = (const char*) p; + state->_current = (void*) (intptr_t) s_error; + return s_error; + /* UNREACHABLE */; + abort(); + } + s_n_llhttp__internal__n_invoke_test_lenient_flags_5: { + switch (llhttp__internal__c_test_lenient_flags_1(state, p, endp)) { + case 1: + goto s_n_llhttp__internal__n_chunk_size_almost_done; + default: + goto s_n_llhttp__internal__n_error_11; + } + /* UNREACHABLE */; + abort(); + } + s_n_llhttp__internal__n_error_17: { state->error = 0x2; state->reason = "Invalid character in chunk extensions"; state->error_pos = (const char*) p; @@ -6662,7 +7063,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_14: { + s_n_llhttp__internal__n_error_18: { state->error = 0x2; state->reason = "Invalid character in chunk extensions"; state->error_pos = (const char*) p; @@ -6671,16 +7072,25 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } + s_n_llhttp__internal__n_error_20: { + state->error = 0x19; + state->reason = "Missing expected CR after chunk extension name"; + state->error_pos = (const char*) p; + state->_current = (void*) (intptr_t) s_error; + return s_error; + /* UNREACHABLE */; + abort(); + } s_n_llhttp__internal__n_pause_5: { state->error = 0x15; state->reason = "on_chunk_extension_name pause"; state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_chunk_size_almost_done; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_test_lenient_flags_9; return s_error; /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_15: { + s_n_llhttp__internal__n_error_19: { state->error = 0x22; state->reason = "`on_chunk_extension_name` callback error"; state->error_pos = (const char*) p; @@ -6698,11 +7108,10 @@ static llparse_state_t llhttp__internal__run( err = llhttp__on_chunk_extension_name(state, start, p); if (err != 0) { state->error = err; - state->error_pos = (const char*) (p + 1); + state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete; return s_error; } - p++; goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete; /* UNREACHABLE */; abort(); @@ -6711,12 +7120,12 @@ static llparse_state_t llhttp__internal__run( state->error = 0x15; state->reason = "on_chunk_extension_name pause"; state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_chunk_extensions; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_chunk_size_almost_done; return s_error; /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_16: { + s_n_llhttp__internal__n_error_21: { state->error = 0x22; state->reason = "`on_chunk_extension_name` callback error"; state->error_pos = (const char*) p; @@ -6744,15 +7153,60 @@ static llparse_state_t llhttp__internal__run( abort(); } s_n_llhttp__internal__n_pause_7: { + state->error = 0x15; + state->reason = "on_chunk_extension_name pause"; + state->error_pos = (const char*) p; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_chunk_extensions; + return s_error; + /* UNREACHABLE */; + abort(); + } + s_n_llhttp__internal__n_error_22: { + state->error = 0x22; + state->reason = "`on_chunk_extension_name` callback error"; + state->error_pos = (const char*) p; + state->_current = (void*) (intptr_t) s_error; + return s_error; + /* UNREACHABLE */; + abort(); + } + s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_name_2: { + const unsigned char* start; + int err; + + start = state->_span_pos0; + state->_span_pos0 = NULL; + err = llhttp__on_chunk_extension_name(state, start, p); + if (err != 0) { + state->error = err; + state->error_pos = (const char*) (p + 1); + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete_2; + return s_error; + } + p++; + goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete_2; + /* UNREACHABLE */; + abort(); + } + s_n_llhttp__internal__n_error_25: { + state->error = 0x19; + state->reason = "Missing expected CR after chunk extension value"; + state->error_pos = (const char*) p; + state->_current = (void*) (intptr_t) s_error; + return s_error; + /* UNREACHABLE */; + abort(); + } + s_n_llhttp__internal__n_pause_8: { state->error = 0x15; state->reason = "on_chunk_extension_value pause"; state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_chunk_size_almost_done; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_test_lenient_flags_10; return s_error; /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_18: { + s_n_llhttp__internal__n_error_24: { state->error = 0x23; state->reason = "`on_chunk_extension_value` callback error"; state->error_pos = (const char*) p; @@ -6770,16 +7224,70 @@ static llparse_state_t llhttp__internal__run( err = llhttp__on_chunk_extension_value(state, start, p); if (err != 0) { state->error = err; - state->error_pos = (const char*) (p + 1); + state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete; return s_error; } - p++; goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete; /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_20: { + s_n_llhttp__internal__n_pause_9: { + state->error = 0x15; + state->reason = "on_chunk_extension_value pause"; + state->error_pos = (const char*) p; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_chunk_size_almost_done; + return s_error; + /* UNREACHABLE */; + abort(); + } + s_n_llhttp__internal__n_error_26: { + state->error = 0x23; + state->reason = "`on_chunk_extension_value` callback error"; + state->error_pos = (const char*) p; + state->_current = (void*) (intptr_t) s_error; + return s_error; + /* UNREACHABLE */; + abort(); + } + s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_1: { + const unsigned char* start; + int err; + + start = state->_span_pos0; + state->_span_pos0 = NULL; + err = llhttp__on_chunk_extension_value(state, start, p); + if (err != 0) { + state->error = err; + state->error_pos = (const char*) (p + 1); + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_1; + return s_error; + } + p++; + goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_1; + /* UNREACHABLE */; + abort(); + } + s_n_llhttp__internal__n_error_28: { + state->error = 0x19; + state->reason = "Missing expected CR after chunk extension value"; + state->error_pos = (const char*) p; + state->_current = (void*) (intptr_t) s_error; + return s_error; + /* UNREACHABLE */; + abort(); + } + s_n_llhttp__internal__n_invoke_test_lenient_flags_11: { + switch (llhttp__internal__c_test_lenient_flags_1(state, p, endp)) { + case 1: + goto s_n_llhttp__internal__n_chunk_size_almost_done; + default: + goto s_n_llhttp__internal__n_error_28; + } + /* UNREACHABLE */; + abort(); + } + s_n_llhttp__internal__n_error_29: { state->error = 0x2; state->reason = "Invalid character in chunk extensions quote value"; state->error_pos = (const char*) p; @@ -6788,7 +7296,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_pause_8: { + s_n_llhttp__internal__n_pause_10: { state->error = 0x15; state->reason = "on_chunk_extension_value pause"; state->error_pos = (const char*) p; @@ -6797,7 +7305,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_19: { + s_n_llhttp__internal__n_error_27: { state->error = 0x23; state->reason = "`on_chunk_extension_value` callback error"; state->error_pos = (const char*) p; @@ -6806,7 +7314,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_1: { + s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_2: { const unsigned char* start; int err; @@ -6816,14 +7324,14 @@ static llparse_state_t llhttp__internal__run( if (err != 0) { state->error = err; state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_1; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_2; return s_error; } - goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_1; + goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_2; /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_2: { + s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_3: { const unsigned char* start; int err; @@ -6833,24 +7341,42 @@ static llparse_state_t llhttp__internal__run( if (err != 0) { state->error = err; state->error_pos = (const char*) (p + 1); - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_21; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_30; return s_error; } p++; - goto s_n_llhttp__internal__n_error_21; + goto s_n_llhttp__internal__n_error_30; /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_pause_9: { + s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_4: { + const unsigned char* start; + int err; + + start = state->_span_pos0; + state->_span_pos0 = NULL; + err = llhttp__on_chunk_extension_value(state, start, p); + if (err != 0) { + state->error = err; + state->error_pos = (const char*) (p + 1); + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_31; + return s_error; + } + p++; + goto s_n_llhttp__internal__n_error_31; + /* UNREACHABLE */; + abort(); + } + s_n_llhttp__internal__n_pause_11: { state->error = 0x15; state->reason = "on_chunk_extension_value pause"; state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_chunk_size_otherwise; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_chunk_extensions; return s_error; /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_22: { + s_n_llhttp__internal__n_error_32: { state->error = 0x23; state->reason = "`on_chunk_extension_value` callback error"; state->error_pos = (const char*) p; @@ -6859,7 +7385,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_3: { + s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_5: { const unsigned char* start; int err; @@ -6869,15 +7395,15 @@ static llparse_state_t llhttp__internal__run( if (err != 0) { state->error = err; state->error_pos = (const char*) (p + 1); - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_2; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_3; return s_error; } p++; - goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_2; + goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_3; /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_4: { + s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_6: { const unsigned char* start; int err; @@ -6887,15 +7413,15 @@ static llparse_state_t llhttp__internal__run( if (err != 0) { state->error = err; state->error_pos = (const char*) (p + 1); - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_23; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_33; return s_error; } p++; - goto s_n_llhttp__internal__n_error_23; + goto s_n_llhttp__internal__n_error_33; /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_pause_10: { + s_n_llhttp__internal__n_pause_12: { state->error = 0x15; state->reason = "on_chunk_extension_name pause"; state->error_pos = (const char*) p; @@ -6904,7 +7430,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_17: { + s_n_llhttp__internal__n_error_23: { state->error = 0x22; state->reason = "`on_chunk_extension_name` callback error"; state->error_pos = (const char*) p; @@ -6913,19 +7439,19 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete_2: { + s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete_3: { switch (llhttp__on_chunk_extension_name_complete(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_chunk_extension_value; case 21: - goto s_n_llhttp__internal__n_pause_10; + goto s_n_llhttp__internal__n_pause_12; default: - goto s_n_llhttp__internal__n_error_17; + goto s_n_llhttp__internal__n_error_23; } /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_name_2: { + s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_name_3: { const unsigned char* start; int err; @@ -6943,7 +7469,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_name_3: { + s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_name_4: { const unsigned char* start; int err; @@ -6953,15 +7479,15 @@ static llparse_state_t llhttp__internal__run( if (err != 0) { state->error = err; state->error_pos = (const char*) (p + 1); - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_24; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_34; return s_error; } p++; - goto s_n_llhttp__internal__n_error_24; + goto s_n_llhttp__internal__n_error_34; /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_25: { + s_n_llhttp__internal__n_error_35: { state->error = 0xc; state->reason = "Invalid character in chunk size"; state->error_pos = (const char*) p; @@ -6973,14 +7499,14 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_invoke_mul_add_content_length: { switch (llhttp__internal__c_mul_add_content_length(state, p, endp, match)) { case 1: - goto s_n_llhttp__internal__n_error_26; + goto s_n_llhttp__internal__n_error_36; default: goto s_n_llhttp__internal__n_chunk_size; } /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_27: { + s_n_llhttp__internal__n_error_37: { state->error = 0xc; state->reason = "Invalid character in chunk size"; state->error_pos = (const char*) p; @@ -7014,7 +7540,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_29: { + s_n_llhttp__internal__n_error_39: { state->error = 0xf; state->reason = "Request has invalid `Transfer-Encoding`"; state->error_pos = (const char*) p; @@ -7032,7 +7558,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_6: { + s_n_llhttp__internal__n_error_7: { state->error = 0x12; state->reason = "`on_message_complete` callback error"; state->error_pos = (const char*) p; @@ -7048,7 +7574,7 @@ static llparse_state_t llhttp__internal__run( case 21: goto s_n_llhttp__internal__n_pause; default: - goto s_n_llhttp__internal__n_error_6; + goto s_n_llhttp__internal__n_error_7; } /* UNREACHABLE */; abort(); @@ -7077,7 +7603,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_pause_12: { + s_n_llhttp__internal__n_pause_14: { state->error = 0x15; state->reason = "Paused by on_headers_complete"; state->error_pos = (const char*) p; @@ -7086,7 +7612,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_5: { + s_n_llhttp__internal__n_error_6: { state->error = 0x11; state->reason = "User callback error"; state->error_pos = (const char*) p; @@ -7104,9 +7630,9 @@ static llparse_state_t llhttp__internal__run( case 2: goto s_n_llhttp__internal__n_invoke_update_upgrade; case 21: - goto s_n_llhttp__internal__n_pause_12; + goto s_n_llhttp__internal__n_pause_14; default: - goto s_n_llhttp__internal__n_error_5; + goto s_n_llhttp__internal__n_error_6; } /* UNREACHABLE */; abort(); @@ -7119,8991 +7645,90 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_invoke_test_lenient_flags_2: { - switch (llhttp__internal__c_test_lenient_flags_2(state, p, endp)) { - case 0: - goto s_n_llhttp__internal__n_error_30; - default: - goto s_n_llhttp__internal__n_invoke_llhttp__before_headers_complete; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_test_flags_1: { - switch (llhttp__internal__c_test_flags_1(state, p, endp)) { - case 1: - goto s_n_llhttp__internal__n_invoke_test_lenient_flags_2; - default: - goto s_n_llhttp__internal__n_invoke_llhttp__before_headers_complete; - } - /* UNREACHABLE */; - abort(); - } s_n_llhttp__internal__n_invoke_test_flags: { switch (llhttp__internal__c_test_flags(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_complete_1; default: - goto s_n_llhttp__internal__n_invoke_test_flags_1; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_32: { - state->error = 0x2; - state->reason = "Expected LF after headers"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_header_field: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_header_field(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) (p + 1); - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_33; - return s_error; + goto s_n_llhttp__internal__n_invoke_llhttp__before_headers_complete; } - p++; - goto s_n_llhttp__internal__n_error_33; /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_invoke_test_lenient_flags_3: { - switch (llhttp__internal__c_test_lenient_flags(state, p, endp)) { + s_n_llhttp__internal__n_invoke_test_lenient_flags_1: { + switch (llhttp__internal__c_test_lenient_flags_1(state, p, endp)) { case 1: - goto s_n_llhttp__internal__n_header_field_colon_discard_ws; + goto s_n_llhttp__internal__n_invoke_test_flags; default: - goto s_n_llhttp__internal__n_span_end_llhttp__on_header_field; + goto s_n_llhttp__internal__n_error_5; } /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_37: { - state->error = 0xb; - state->reason = "Empty Content-Length"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_pause_14: { + s_n_llhttp__internal__n_pause_17: { state->error = 0x15; - state->reason = "on_header_value_complete pause"; + state->reason = "on_chunk_complete pause"; state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_header_field_start; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_2; return s_error; /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_36: { - state->error = 0x1d; - state->reason = "`on_header_value_complete` callback error"; + s_n_llhttp__internal__n_error_42: { + state->error = 0x14; + state->reason = "`on_chunk_complete` callback error"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_span_end_llhttp__on_header_value: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_header_value(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_header_value_complete; - return s_error; - } - goto s_n_llhttp__internal__n_invoke_llhttp__on_header_value_complete; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_update_header_state: { - switch (llhttp__internal__c_update_header_state(state, p, endp)) { + s_n_llhttp__internal__n_invoke_llhttp__on_chunk_complete_2: { + switch (llhttp__on_chunk_complete(state, p, endp)) { + case 0: + goto s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_2; + case 21: + goto s_n_llhttp__internal__n_pause_17; default: - goto s_n_llhttp__internal__n_span_start_llhttp__on_header_value; + goto s_n_llhttp__internal__n_error_42; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_3: { - switch (llhttp__internal__c_or_flags_3(state, p, endp)) { + switch (llhttp__internal__c_or_flags_1(state, p, endp)) { default: - goto s_n_llhttp__internal__n_invoke_update_header_state; + goto s_n_llhttp__internal__n_invoke_llhttp__after_headers_complete; } /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_or_flags_4: { - switch (llhttp__internal__c_or_flags_4(state, p, endp)) { - default: - goto s_n_llhttp__internal__n_invoke_update_header_state; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_or_flags_5: { - switch (llhttp__internal__c_or_flags_5(state, p, endp)) { + switch (llhttp__internal__c_or_flags_1(state, p, endp)) { default: - goto s_n_llhttp__internal__n_invoke_update_header_state; + goto s_n_llhttp__internal__n_invoke_llhttp__after_headers_complete; } /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_invoke_or_flags_6: { - switch (llhttp__internal__c_or_flags_6(state, p, endp)) { + s_n_llhttp__internal__n_invoke_update_upgrade_1: { + switch (llhttp__internal__c_update_upgrade(state, p, endp)) { default: - goto s_n_llhttp__internal__n_span_start_llhttp__on_header_value; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_load_header_state_1: { - switch (llhttp__internal__c_load_header_state(state, p, endp)) { - case 5: - goto s_n_llhttp__internal__n_invoke_or_flags_3; - case 6: goto s_n_llhttp__internal__n_invoke_or_flags_4; - case 7: - goto s_n_llhttp__internal__n_invoke_or_flags_5; - case 8: - goto s_n_llhttp__internal__n_invoke_or_flags_6; - default: - goto s_n_llhttp__internal__n_span_start_llhttp__on_header_value; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_load_header_state: { - switch (llhttp__internal__c_load_header_state(state, p, endp)) { - case 2: - goto s_n_llhttp__internal__n_error_37; - default: - goto s_n_llhttp__internal__n_invoke_load_header_state_1; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_35: { - state->error = 0xa; - state->reason = "Invalid header value char"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_test_lenient_flags_4: { - switch (llhttp__internal__c_test_lenient_flags(state, p, endp)) { - case 1: - goto s_n_llhttp__internal__n_header_value_discard_lws; - default: - goto s_n_llhttp__internal__n_error_35; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_38: { - state->error = 0x2; - state->reason = "Expected LF after CR"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_update_header_state_1: { - switch (llhttp__internal__c_update_header_state_1(state, p, endp)) { - default: - goto s_n_llhttp__internal__n_span_start_llhttp__on_header_value_1; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_load_header_state_3: { - switch (llhttp__internal__c_load_header_state(state, p, endp)) { - case 8: - goto s_n_llhttp__internal__n_invoke_update_header_state_1; - default: - goto s_n_llhttp__internal__n_span_start_llhttp__on_header_value_1; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_update_header_state_2: { - switch (llhttp__internal__c_update_header_state(state, p, endp)) { - default: - goto s_n_llhttp__internal__n_invoke_llhttp__on_header_value_complete; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_or_flags_7: { - switch (llhttp__internal__c_or_flags_3(state, p, endp)) { - default: - goto s_n_llhttp__internal__n_invoke_update_header_state_2; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_or_flags_8: { - switch (llhttp__internal__c_or_flags_4(state, p, endp)) { - default: - goto s_n_llhttp__internal__n_invoke_update_header_state_2; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_or_flags_9: { - switch (llhttp__internal__c_or_flags_5(state, p, endp)) { - default: - goto s_n_llhttp__internal__n_invoke_update_header_state_2; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_or_flags_10: { - switch (llhttp__internal__c_or_flags_6(state, p, endp)) { - default: - goto s_n_llhttp__internal__n_invoke_llhttp__on_header_value_complete; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_load_header_state_4: { - switch (llhttp__internal__c_load_header_state(state, p, endp)) { - case 5: - goto s_n_llhttp__internal__n_invoke_or_flags_7; - case 6: - goto s_n_llhttp__internal__n_invoke_or_flags_8; - case 7: - goto s_n_llhttp__internal__n_invoke_or_flags_9; - case 8: - goto s_n_llhttp__internal__n_invoke_or_flags_10; - default: - goto s_n_llhttp__internal__n_invoke_llhttp__on_header_value_complete; } /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_39: { - state->error = 0x3; - state->reason = "Missing expected LF after header value"; + s_n_llhttp__internal__n_pause_16: { + state->error = 0x15; + state->reason = "Paused by on_headers_complete"; state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__after_headers_complete; return s_error; /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_span_end_llhttp__on_header_value_1: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_header_value(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) (p + 1); - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_header_value_almost_done; - return s_error; - } - p++; - goto s_n_llhttp__internal__n_header_value_almost_done; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_header_value_3: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_header_value(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_header_value_almost_done; - return s_error; - } - goto s_n_llhttp__internal__n_header_value_almost_done; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_header_value_4: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_header_value(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) (p + 1); - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_header_value_almost_done; - return s_error; - } - p++; - goto s_n_llhttp__internal__n_header_value_almost_done; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_header_value_2: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_header_value(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_40; - return s_error; - } - goto s_n_llhttp__internal__n_error_40; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_test_lenient_flags_5: { - switch (llhttp__internal__c_test_lenient_flags(state, p, endp)) { - case 1: - goto s_n_llhttp__internal__n_header_value_lenient; - default: - goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_2; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_update_header_state_4: { - switch (llhttp__internal__c_update_header_state(state, p, endp)) { - default: - goto s_n_llhttp__internal__n_header_value_connection; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_or_flags_11: { - switch (llhttp__internal__c_or_flags_3(state, p, endp)) { - default: - goto s_n_llhttp__internal__n_invoke_update_header_state_4; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_or_flags_12: { - switch (llhttp__internal__c_or_flags_4(state, p, endp)) { - default: - goto s_n_llhttp__internal__n_invoke_update_header_state_4; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_or_flags_13: { - switch (llhttp__internal__c_or_flags_5(state, p, endp)) { - default: - goto s_n_llhttp__internal__n_invoke_update_header_state_4; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_or_flags_14: { - switch (llhttp__internal__c_or_flags_6(state, p, endp)) { - default: - goto s_n_llhttp__internal__n_header_value_connection; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_load_header_state_5: { - switch (llhttp__internal__c_load_header_state(state, p, endp)) { - case 5: - goto s_n_llhttp__internal__n_invoke_or_flags_11; - case 6: - goto s_n_llhttp__internal__n_invoke_or_flags_12; - case 7: - goto s_n_llhttp__internal__n_invoke_or_flags_13; - case 8: - goto s_n_llhttp__internal__n_invoke_or_flags_14; - default: - goto s_n_llhttp__internal__n_header_value_connection; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_update_header_state_5: { - switch (llhttp__internal__c_update_header_state_1(state, p, endp)) { - default: - goto s_n_llhttp__internal__n_header_value_connection_token; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_update_header_state_3: { - switch (llhttp__internal__c_update_header_state_3(state, p, endp)) { - default: - goto s_n_llhttp__internal__n_header_value_connection_ws; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_update_header_state_6: { - switch (llhttp__internal__c_update_header_state_6(state, p, endp)) { - default: - goto s_n_llhttp__internal__n_header_value_connection_ws; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_update_header_state_7: { - switch (llhttp__internal__c_update_header_state_7(state, p, endp)) { - default: - goto s_n_llhttp__internal__n_header_value_connection_ws; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_header_value_5: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_header_value(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_42; - return s_error; - } - goto s_n_llhttp__internal__n_error_42; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_mul_add_content_length_1: { - switch (llhttp__internal__c_mul_add_content_length_1(state, p, endp, match)) { - case 1: - goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_5; - default: - goto s_n_llhttp__internal__n_header_value_content_length; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_or_flags_15: { - switch (llhttp__internal__c_or_flags_15(state, p, endp)) { - default: - goto s_n_llhttp__internal__n_header_value_otherwise; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_header_value_6: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_header_value(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_43; - return s_error; - } - goto s_n_llhttp__internal__n_error_43; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_41: { - state->error = 0x4; - state->reason = "Duplicate Content-Length"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_test_flags_2: { - switch (llhttp__internal__c_test_flags_2(state, p, endp)) { - case 0: - goto s_n_llhttp__internal__n_header_value_content_length; - default: - goto s_n_llhttp__internal__n_error_41; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_header_value_8: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_header_value(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) (p + 1); - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_45; - return s_error; - } - p++; - goto s_n_llhttp__internal__n_error_45; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_update_header_state_8: { - switch (llhttp__internal__c_update_header_state_8(state, p, endp)) { - default: - goto s_n_llhttp__internal__n_header_value_otherwise; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_header_value_7: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_header_value(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) (p + 1); - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_44; - return s_error; - } - p++; - goto s_n_llhttp__internal__n_error_44; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_test_lenient_flags_6: { - switch (llhttp__internal__c_test_lenient_flags_6(state, p, endp)) { - case 0: - goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_7; - default: - goto s_n_llhttp__internal__n_header_value_te_chunked; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_load_type_1: { - switch (llhttp__internal__c_load_type(state, p, endp)) { - case 1: - goto s_n_llhttp__internal__n_invoke_test_lenient_flags_6; - default: - goto s_n_llhttp__internal__n_header_value_te_chunked; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_update_header_state_9: { - switch (llhttp__internal__c_update_header_state_1(state, p, endp)) { - default: - goto s_n_llhttp__internal__n_header_value; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_and_flags: { - switch (llhttp__internal__c_and_flags(state, p, endp)) { - default: - goto s_n_llhttp__internal__n_header_value_te_chunked; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_or_flags_17: { - switch (llhttp__internal__c_or_flags_16(state, p, endp)) { - default: - goto s_n_llhttp__internal__n_invoke_and_flags; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_test_lenient_flags_7: { - switch (llhttp__internal__c_test_lenient_flags_6(state, p, endp)) { - case 0: - goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_8; - default: - goto s_n_llhttp__internal__n_invoke_or_flags_17; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_load_type_2: { - switch (llhttp__internal__c_load_type(state, p, endp)) { - case 1: - goto s_n_llhttp__internal__n_invoke_test_lenient_flags_7; - default: - goto s_n_llhttp__internal__n_invoke_or_flags_17; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_or_flags_16: { - switch (llhttp__internal__c_or_flags_16(state, p, endp)) { - default: - goto s_n_llhttp__internal__n_invoke_and_flags; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_test_flags_3: { - switch (llhttp__internal__c_test_flags_3(state, p, endp)) { - case 1: - goto s_n_llhttp__internal__n_invoke_load_type_2; - default: - goto s_n_llhttp__internal__n_invoke_or_flags_16; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_or_flags_18: { - switch (llhttp__internal__c_or_flags_18(state, p, endp)) { - default: - goto s_n_llhttp__internal__n_invoke_update_header_state_9; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_load_header_state_2: { - switch (llhttp__internal__c_load_header_state(state, p, endp)) { - case 1: - goto s_n_llhttp__internal__n_header_value_connection; - case 2: - goto s_n_llhttp__internal__n_invoke_test_flags_2; - case 3: - goto s_n_llhttp__internal__n_invoke_test_flags_3; - case 4: - goto s_n_llhttp__internal__n_invoke_or_flags_18; - default: - goto s_n_llhttp__internal__n_header_value; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_pause_15: { - state->error = 0x15; - state->reason = "on_header_field_complete pause"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_header_value_discard_ws; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_34: { - state->error = 0x1c; - state->reason = "`on_header_field_complete` callback error"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_header_field_1: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_header_field(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) (p + 1); - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_header_field_complete; - return s_error; - } - p++; - goto s_n_llhttp__internal__n_invoke_llhttp__on_header_field_complete; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_header_field_2: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_header_field(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) (p + 1); - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_header_field_complete; - return s_error; - } - p++; - goto s_n_llhttp__internal__n_invoke_llhttp__on_header_field_complete; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_46: { - state->error = 0xa; - state->reason = "Invalid header token"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_update_header_state_10: { - switch (llhttp__internal__c_update_header_state_1(state, p, endp)) { - default: - goto s_n_llhttp__internal__n_header_field_general; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_store_header_state: { - switch (llhttp__internal__c_store_header_state(state, p, endp, match)) { - default: - goto s_n_llhttp__internal__n_header_field_colon; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_update_header_state_11: { - switch (llhttp__internal__c_update_header_state_1(state, p, endp)) { - default: - goto s_n_llhttp__internal__n_header_field_general; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_4: { - state->error = 0x1e; - state->reason = "Unexpected space after start line"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_test_lenient_flags: { - switch (llhttp__internal__c_test_lenient_flags(state, p, endp)) { - case 1: - goto s_n_llhttp__internal__n_header_field_start; - default: - goto s_n_llhttp__internal__n_error_4; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_pause_16: { - state->error = 0x15; - state->reason = "on_url_complete pause"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_headers_start; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_3: { - state->error = 0x1a; - state->reason = "`on_url_complete` callback error"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_llhttp__on_url_complete: { - switch (llhttp__on_url_complete(state, p, endp)) { - case 0: - goto s_n_llhttp__internal__n_headers_start; - case 21: - goto s_n_llhttp__internal__n_pause_16; - default: - goto s_n_llhttp__internal__n_error_3; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_update_http_minor: { - switch (llhttp__internal__c_update_http_minor(state, p, endp)) { - default: - goto s_n_llhttp__internal__n_invoke_llhttp__on_url_complete; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_update_http_major: { - switch (llhttp__internal__c_update_http_major(state, p, endp)) { - default: - goto s_n_llhttp__internal__n_invoke_update_http_minor; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_url_3: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_url(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_to_http09; - return s_error; - } - goto s_n_llhttp__internal__n_url_skip_to_http09; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_47: { - state->error = 0x7; - state->reason = "Expected CRLF"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_url_4: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_url(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_lf_to_http09; - return s_error; - } - goto s_n_llhttp__internal__n_url_skip_lf_to_http09; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_53: { - state->error = 0x17; - state->reason = "Pause on PRI/Upgrade"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_54: { - state->error = 0x9; - state->reason = "Expected HTTP/2 Connection Preface"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_52: { - state->error = 0x9; - state->reason = "Expected CRLF after version"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_pause_17: { - state->error = 0x15; - state->reason = "on_version_complete pause"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_load_method_1; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_51: { - state->error = 0x21; - state->reason = "`on_version_complete` callback error"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_version_1: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_version(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_version_complete; - return s_error; - } - goto s_n_llhttp__internal__n_invoke_llhttp__on_version_complete; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_version: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_version(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_50; - return s_error; - } - goto s_n_llhttp__internal__n_error_50; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_load_http_minor: { - switch (llhttp__internal__c_load_http_minor(state, p, endp)) { - case 9: - goto s_n_llhttp__internal__n_span_end_llhttp__on_version_1; - default: - goto s_n_llhttp__internal__n_span_end_llhttp__on_version; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_load_http_minor_1: { - switch (llhttp__internal__c_load_http_minor(state, p, endp)) { - case 0: - goto s_n_llhttp__internal__n_span_end_llhttp__on_version_1; - case 1: - goto s_n_llhttp__internal__n_span_end_llhttp__on_version_1; - default: - goto s_n_llhttp__internal__n_span_end_llhttp__on_version; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_load_http_minor_2: { - switch (llhttp__internal__c_load_http_minor(state, p, endp)) { - case 0: - goto s_n_llhttp__internal__n_span_end_llhttp__on_version_1; - default: - goto s_n_llhttp__internal__n_span_end_llhttp__on_version; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_load_http_major: { - switch (llhttp__internal__c_load_http_major(state, p, endp)) { - case 0: - goto s_n_llhttp__internal__n_invoke_load_http_minor; - case 1: - goto s_n_llhttp__internal__n_invoke_load_http_minor_1; - case 2: - goto s_n_llhttp__internal__n_invoke_load_http_minor_2; - default: - goto s_n_llhttp__internal__n_span_end_llhttp__on_version; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_test_lenient_flags_8: { - switch (llhttp__internal__c_test_lenient_flags_8(state, p, endp)) { - case 1: - goto s_n_llhttp__internal__n_span_end_llhttp__on_version_1; - default: - goto s_n_llhttp__internal__n_invoke_load_http_major; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_store_http_minor: { - switch (llhttp__internal__c_store_http_minor(state, p, endp, match)) { - default: - goto s_n_llhttp__internal__n_invoke_test_lenient_flags_8; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_version_2: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_version(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_55; - return s_error; - } - goto s_n_llhttp__internal__n_error_55; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_version_3: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_version(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_56; - return s_error; - } - goto s_n_llhttp__internal__n_error_56; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_store_http_major: { - switch (llhttp__internal__c_store_http_major(state, p, endp, match)) { - default: - goto s_n_llhttp__internal__n_req_http_dot; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_version_4: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_version(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_57; - return s_error; - } - goto s_n_llhttp__internal__n_error_57; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_49: { - state->error = 0x8; - state->reason = "Invalid method for HTTP/x.x request"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_load_method: { - switch (llhttp__internal__c_load_method(state, p, endp)) { - case 0: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 1: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 2: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 3: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 4: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 5: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 6: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 7: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 8: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 9: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 10: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 11: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 12: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 13: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 14: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 15: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 16: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 17: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 18: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 19: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 20: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 21: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 22: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 23: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 24: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 25: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 26: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 27: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 28: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 29: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 30: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 31: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 32: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 33: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 34: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - default: - goto s_n_llhttp__internal__n_error_49; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_60: { - state->error = 0x8; - state->reason = "Expected HTTP/"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_58: { - state->error = 0x8; - state->reason = "Expected SOURCE method for ICE/x.x request"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_load_method_2: { - switch (llhttp__internal__c_load_method(state, p, endp)) { - case 33: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - default: - goto s_n_llhttp__internal__n_error_58; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_59: { - state->error = 0x8; - state->reason = "Invalid method for RTSP/x.x request"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_load_method_3: { - switch (llhttp__internal__c_load_method(state, p, endp)) { - case 1: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 3: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 6: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 35: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 36: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 37: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 38: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 39: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 40: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 41: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 42: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 43: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 44: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - case 45: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version; - default: - goto s_n_llhttp__internal__n_error_59; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_pause_18: { - state->error = 0x15; - state->reason = "on_url_complete pause"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_req_http_start; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_48: { - state->error = 0x1a; - state->reason = "`on_url_complete` callback error"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_llhttp__on_url_complete_1: { - switch (llhttp__on_url_complete(state, p, endp)) { - case 0: - goto s_n_llhttp__internal__n_req_http_start; - case 21: - goto s_n_llhttp__internal__n_pause_18; - default: - goto s_n_llhttp__internal__n_error_48; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_url_5: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_url(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_to_http; - return s_error; - } - goto s_n_llhttp__internal__n_url_skip_to_http; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_url_6: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_url(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_to_http09; - return s_error; - } - goto s_n_llhttp__internal__n_url_skip_to_http09; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_url_7: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_url(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_lf_to_http09; - return s_error; - } - goto s_n_llhttp__internal__n_url_skip_lf_to_http09; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_url_8: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_url(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_to_http; - return s_error; - } - goto s_n_llhttp__internal__n_url_skip_to_http; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_61: { - state->error = 0x7; - state->reason = "Invalid char in url fragment start"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_url_9: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_url(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_to_http09; - return s_error; - } - goto s_n_llhttp__internal__n_url_skip_to_http09; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_url_10: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_url(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_lf_to_http09; - return s_error; - } - goto s_n_llhttp__internal__n_url_skip_lf_to_http09; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_url_11: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_url(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_to_http; - return s_error; - } - goto s_n_llhttp__internal__n_url_skip_to_http; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_62: { - state->error = 0x7; - state->reason = "Invalid char in url query"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_63: { - state->error = 0x7; - state->reason = "Invalid char in url path"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_url: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_url(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_to_http09; - return s_error; - } - goto s_n_llhttp__internal__n_url_skip_to_http09; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_url_1: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_url(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_lf_to_http09; - return s_error; - } - goto s_n_llhttp__internal__n_url_skip_lf_to_http09; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_url_2: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_url(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_to_http; - return s_error; - } - goto s_n_llhttp__internal__n_url_skip_to_http; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_url_12: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_url(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_to_http09; - return s_error; - } - goto s_n_llhttp__internal__n_url_skip_to_http09; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_url_13: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_url(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_lf_to_http09; - return s_error; - } - goto s_n_llhttp__internal__n_url_skip_lf_to_http09; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_url_14: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_url(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_url_skip_to_http; - return s_error; - } - goto s_n_llhttp__internal__n_url_skip_to_http; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_64: { - state->error = 0x7; - state->reason = "Double @ in url"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_65: { - state->error = 0x7; - state->reason = "Unexpected char in url server"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_66: { - state->error = 0x7; - state->reason = "Unexpected char in url server"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_68: { - state->error = 0x7; - state->reason = "Unexpected char in url schema"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_69: { - state->error = 0x7; - state->reason = "Unexpected char in url schema"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_70: { - state->error = 0x7; - state->reason = "Unexpected start char in url"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_is_equal_method: { - switch (llhttp__internal__c_is_equal_method(state, p, endp)) { - case 0: - goto s_n_llhttp__internal__n_url_entry_normal; - default: - goto s_n_llhttp__internal__n_url_entry_connect; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_71: { - state->error = 0x6; - state->reason = "Expected space after method"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_pause_22: { - state->error = 0x15; - state->reason = "on_method_complete pause"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_req_first_space_before_url; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_83: { - state->error = 0x20; - state->reason = "`on_method_complete` callback error"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_method_2: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_method(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_method_complete_1; - return s_error; - } - goto s_n_llhttp__internal__n_invoke_llhttp__on_method_complete_1; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_store_method_1: { - switch (llhttp__internal__c_store_method(state, p, endp, match)) { - default: - goto s_n_llhttp__internal__n_span_end_llhttp__on_method_2; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_84: { - state->error = 0x6; - state->reason = "Invalid method encountered"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_74: { - state->error = 0xd; - state->reason = "Response overflow"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_mul_add_status_code: { - switch (llhttp__internal__c_mul_add_status_code(state, p, endp, match)) { - case 1: - goto s_n_llhttp__internal__n_error_74; - default: - goto s_n_llhttp__internal__n_res_status_code; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_pause_20: { - state->error = 0x15; - state->reason = "on_status_complete pause"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_headers_start; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_75: { - state->error = 0x1b; - state->reason = "`on_status_complete` callback error"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_76: { - state->error = 0x2; - state->reason = "Expected LF after CR"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_status: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_status(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) (p + 1); - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_status_complete; - return s_error; - } - p++; - goto s_n_llhttp__internal__n_invoke_llhttp__on_status_complete; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_status_1: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_status(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) (p + 1); - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_res_line_almost_done; - return s_error; - } - p++; - goto s_n_llhttp__internal__n_res_line_almost_done; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_77: { - state->error = 0xd; - state->reason = "Invalid response status"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_update_status_code: { - switch (llhttp__internal__c_update_status_code(state, p, endp)) { - default: - goto s_n_llhttp__internal__n_res_status_code; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_78: { - state->error = 0x9; - state->reason = "Expected space after version"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_pause_21: { - state->error = 0x15; - state->reason = "on_version_complete pause"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_res_after_version; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_73: { - state->error = 0x21; - state->reason = "`on_version_complete` callback error"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_version_6: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_version(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_version_complete_1; - return s_error; - } - goto s_n_llhttp__internal__n_invoke_llhttp__on_version_complete_1; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_version_5: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_version(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_72; - return s_error; - } - goto s_n_llhttp__internal__n_error_72; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_load_http_minor_3: { - switch (llhttp__internal__c_load_http_minor(state, p, endp)) { - case 9: - goto s_n_llhttp__internal__n_span_end_llhttp__on_version_6; - default: - goto s_n_llhttp__internal__n_span_end_llhttp__on_version_5; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_load_http_minor_4: { - switch (llhttp__internal__c_load_http_minor(state, p, endp)) { - case 0: - goto s_n_llhttp__internal__n_span_end_llhttp__on_version_6; - case 1: - goto s_n_llhttp__internal__n_span_end_llhttp__on_version_6; - default: - goto s_n_llhttp__internal__n_span_end_llhttp__on_version_5; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_load_http_minor_5: { - switch (llhttp__internal__c_load_http_minor(state, p, endp)) { - case 0: - goto s_n_llhttp__internal__n_span_end_llhttp__on_version_6; - default: - goto s_n_llhttp__internal__n_span_end_llhttp__on_version_5; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_load_http_major_1: { - switch (llhttp__internal__c_load_http_major(state, p, endp)) { - case 0: - goto s_n_llhttp__internal__n_invoke_load_http_minor_3; - case 1: - goto s_n_llhttp__internal__n_invoke_load_http_minor_4; - case 2: - goto s_n_llhttp__internal__n_invoke_load_http_minor_5; - default: - goto s_n_llhttp__internal__n_span_end_llhttp__on_version_5; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_test_lenient_flags_9: { - switch (llhttp__internal__c_test_lenient_flags_8(state, p, endp)) { - case 1: - goto s_n_llhttp__internal__n_span_end_llhttp__on_version_6; - default: - goto s_n_llhttp__internal__n_invoke_load_http_major_1; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_store_http_minor_1: { - switch (llhttp__internal__c_store_http_minor(state, p, endp, match)) { - default: - goto s_n_llhttp__internal__n_invoke_test_lenient_flags_9; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_version_7: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_version(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_79; - return s_error; - } - goto s_n_llhttp__internal__n_error_79; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_version_8: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_version(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_80; - return s_error; - } - goto s_n_llhttp__internal__n_error_80; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_store_http_major_1: { - switch (llhttp__internal__c_store_http_major(state, p, endp, match)) { - default: - goto s_n_llhttp__internal__n_res_http_dot; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_version_9: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_version(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_81; - return s_error; - } - goto s_n_llhttp__internal__n_error_81; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_85: { - state->error = 0x8; - state->reason = "Expected HTTP/"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_pause_19: { - state->error = 0x15; - state->reason = "on_method_complete pause"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_req_first_space_before_url; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_1: { - state->error = 0x20; - state->reason = "`on_method_complete` callback error"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_method: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_method(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_method_complete; - return s_error; - } - goto s_n_llhttp__internal__n_invoke_llhttp__on_method_complete; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_update_type: { - switch (llhttp__internal__c_update_type(state, p, endp)) { - default: - goto s_n_llhttp__internal__n_span_end_llhttp__on_method; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_store_method: { - switch (llhttp__internal__c_store_method(state, p, endp, match)) { - default: - goto s_n_llhttp__internal__n_invoke_update_type; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_82: { - state->error = 0x8; - state->reason = "Invalid word encountered"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_method_1: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_method(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_update_type_1; - return s_error; - } - goto s_n_llhttp__internal__n_invoke_update_type_1; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_update_type_2: { - switch (llhttp__internal__c_update_type(state, p, endp)) { - default: - goto s_n_llhttp__internal__n_span_start_llhttp__on_method_1; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_pause_23: { - state->error = 0x15; - state->reason = "on_message_begin pause"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_load_type; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error: { - state->error = 0x10; - state->reason = "`on_message_begin` callback error"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_llhttp__on_message_begin: { - switch (llhttp__on_message_begin(state, p, endp)) { - case 0: - goto s_n_llhttp__internal__n_invoke_load_type; - case 21: - goto s_n_llhttp__internal__n_pause_23; - default: - goto s_n_llhttp__internal__n_error; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_pause_24: { - state->error = 0x15; - state->reason = "on_reset pause"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_update_finish; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_86: { - state->error = 0x1f; - state->reason = "`on_reset` callback error"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_llhttp__on_reset: { - switch (llhttp__on_reset(state, p, endp)) { - case 0: - goto s_n_llhttp__internal__n_invoke_update_finish; - case 21: - goto s_n_llhttp__internal__n_pause_24; - default: - goto s_n_llhttp__internal__n_error_86; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_load_initial_message_completed: { - switch (llhttp__internal__c_load_initial_message_completed(state, p, endp)) { - case 1: - goto s_n_llhttp__internal__n_invoke_llhttp__on_reset; - default: - goto s_n_llhttp__internal__n_invoke_update_finish; - } - /* UNREACHABLE */; - abort(); - } -} - -int llhttp__internal_execute(llhttp__internal_t* state, const char* p, const char* endp) { - llparse_state_t next; - - /* check lingering errors */ - if (state->error != 0) { - return state->error; - } - - /* restart spans */ - if (state->_span_pos0 != NULL) { - state->_span_pos0 = (void*) p; - } - - next = llhttp__internal__run(state, (const unsigned char*) p, (const unsigned char*) endp); - if (next == s_error) { - return state->error; - } - state->_current = (void*) (intptr_t) next; - - /* execute spans */ - if (state->_span_pos0 != NULL) { - int error; - - error = ((llhttp__internal__span_cb) state->_span_cb0)(state, state->_span_pos0, (const char*) endp); - if (error != 0) { - state->error = error; - state->error_pos = endp; - return error; - } - } - - return 0; -} - -#else /* !LLHTTP_STRICT_MODE */ - -#include -#include -#include - -#ifdef __SSE4_2__ - #ifdef _MSC_VER - #include - #else /* !_MSC_VER */ - #include - #endif /* _MSC_VER */ -#endif /* __SSE4_2__ */ - -#ifdef _MSC_VER - #define ALIGN(n) _declspec(align(n)) -#else /* !_MSC_VER */ - #define ALIGN(n) __attribute__((aligned(n))) -#endif /* _MSC_VER */ - -#include "llhttp.h" - -typedef int (*llhttp__internal__span_cb)( - llhttp__internal_t*, const char*, const char*); - -#ifdef __SSE4_2__ -static const unsigned char ALIGN(16) llparse_blob0[] = { - 0x9, 0x9, 0xc, 0xc, '!', '"', '$', '>', '@', '~', 0x80, - 0xff, 0x0, 0x0, 0x0, 0x0 -}; -#endif /* __SSE4_2__ */ -static const unsigned char llparse_blob1[] = { - 'o', 'n' -}; -static const unsigned char llparse_blob2[] = { - 'e', 'c', 't', 'i', 'o', 'n' -}; -static const unsigned char llparse_blob3[] = { - 'l', 'o', 's', 'e' -}; -static const unsigned char llparse_blob4[] = { - 'e', 'e', 'p', '-', 'a', 'l', 'i', 'v', 'e' -}; -static const unsigned char llparse_blob5[] = { - 'p', 'g', 'r', 'a', 'd', 'e' -}; -static const unsigned char llparse_blob6[] = { - 'c', 'h', 'u', 'n', 'k', 'e', 'd' -}; -#ifdef __SSE4_2__ -static const unsigned char ALIGN(16) llparse_blob7[] = { - 0x9, 0x9, ' ', '~', 0x80, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0 -}; -#endif /* __SSE4_2__ */ -#ifdef __SSE4_2__ -static const unsigned char ALIGN(16) llparse_blob8[] = { - ' ', '!', '#', '\'', '*', '+', '-', '.', '0', '9', 'A', - 'Z', '^', 'z', '|', '|' -}; -#endif /* __SSE4_2__ */ -#ifdef __SSE4_2__ -static const unsigned char ALIGN(16) llparse_blob9[] = { - '~', '~', 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0 -}; -#endif /* __SSE4_2__ */ -static const unsigned char llparse_blob10[] = { - 'e', 'n', 't', '-', 'l', 'e', 'n', 'g', 't', 'h' -}; -static const unsigned char llparse_blob11[] = { - 'r', 'o', 'x', 'y', '-', 'c', 'o', 'n', 'n', 'e', 'c', - 't', 'i', 'o', 'n' -}; -static const unsigned char llparse_blob12[] = { - 'r', 'a', 'n', 's', 'f', 'e', 'r', '-', 'e', 'n', 'c', - 'o', 'd', 'i', 'n', 'g' -}; -static const unsigned char llparse_blob13[] = { - 'p', 'g', 'r', 'a', 'd', 'e' -}; -static const unsigned char llparse_blob14[] = { - 0xd, 0xa -}; -static const unsigned char llparse_blob15[] = { - 'T', 'T', 'P', '/' -}; -static const unsigned char llparse_blob16[] = { - 0xd, 0xa, 0xd, 0xa, 'S', 'M', 0xd, 0xa, 0xd, 0xa -}; -static const unsigned char llparse_blob17[] = { - 'C', 'E', '/' -}; -static const unsigned char llparse_blob18[] = { - 'T', 'S', 'P', '/' -}; -static const unsigned char llparse_blob19[] = { - 'N', 'O', 'U', 'N', 'C', 'E' -}; -static const unsigned char llparse_blob20[] = { - 'I', 'N', 'D' -}; -static const unsigned char llparse_blob21[] = { - 'E', 'C', 'K', 'O', 'U', 'T' -}; -static const unsigned char llparse_blob22[] = { - 'N', 'E', 'C', 'T' -}; -static const unsigned char llparse_blob23[] = { - 'E', 'T', 'E' -}; -static const unsigned char llparse_blob24[] = { - 'C', 'R', 'I', 'B', 'E' -}; -static const unsigned char llparse_blob25[] = { - 'L', 'U', 'S', 'H' -}; -static const unsigned char llparse_blob26[] = { - 'E', 'T' -}; -static const unsigned char llparse_blob27[] = { - 'P', 'A', 'R', 'A', 'M', 'E', 'T', 'E', 'R' -}; -static const unsigned char llparse_blob28[] = { - 'E', 'A', 'D' -}; -static const unsigned char llparse_blob29[] = { - 'N', 'K' -}; -static const unsigned char llparse_blob30[] = { - 'C', 'K' -}; -static const unsigned char llparse_blob31[] = { - 'S', 'E', 'A', 'R', 'C', 'H' -}; -static const unsigned char llparse_blob32[] = { - 'R', 'G', 'E' -}; -static const unsigned char llparse_blob33[] = { - 'C', 'T', 'I', 'V', 'I', 'T', 'Y' -}; -static const unsigned char llparse_blob34[] = { - 'L', 'E', 'N', 'D', 'A', 'R' -}; -static const unsigned char llparse_blob35[] = { - 'V', 'E' -}; -static const unsigned char llparse_blob36[] = { - 'O', 'T', 'I', 'F', 'Y' -}; -static const unsigned char llparse_blob37[] = { - 'P', 'T', 'I', 'O', 'N', 'S' -}; -static const unsigned char llparse_blob38[] = { - 'C', 'H' -}; -static const unsigned char llparse_blob39[] = { - 'S', 'E' -}; -static const unsigned char llparse_blob40[] = { - 'A', 'Y' -}; -static const unsigned char llparse_blob41[] = { - 'S', 'T' -}; -static const unsigned char llparse_blob42[] = { - 'I', 'N', 'D' -}; -static const unsigned char llparse_blob43[] = { - 'A', 'T', 'C', 'H' -}; -static const unsigned char llparse_blob44[] = { - 'G', 'E' -}; -static const unsigned char llparse_blob45[] = { - 'I', 'N', 'D' -}; -static const unsigned char llparse_blob46[] = { - 'O', 'R', 'D' -}; -static const unsigned char llparse_blob47[] = { - 'I', 'R', 'E', 'C', 'T' -}; -static const unsigned char llparse_blob48[] = { - 'O', 'R', 'T' -}; -static const unsigned char llparse_blob49[] = { - 'R', 'C', 'H' -}; -static const unsigned char llparse_blob50[] = { - 'P', 'A', 'R', 'A', 'M', 'E', 'T', 'E', 'R' -}; -static const unsigned char llparse_blob51[] = { - 'U', 'R', 'C', 'E' -}; -static const unsigned char llparse_blob52[] = { - 'B', 'S', 'C', 'R', 'I', 'B', 'E' -}; -static const unsigned char llparse_blob53[] = { - 'A', 'R', 'D', 'O', 'W', 'N' -}; -static const unsigned char llparse_blob54[] = { - 'A', 'C', 'E' -}; -static const unsigned char llparse_blob55[] = { - 'I', 'N', 'D' -}; -static const unsigned char llparse_blob56[] = { - 'N', 'K' -}; -static const unsigned char llparse_blob57[] = { - 'C', 'K' -}; -static const unsigned char llparse_blob58[] = { - 'U', 'B', 'S', 'C', 'R', 'I', 'B', 'E' -}; -static const unsigned char llparse_blob59[] = { - 'H', 'T', 'T', 'P', '/' -}; -static const unsigned char llparse_blob60[] = { - 'A', 'D' -}; -static const unsigned char llparse_blob61[] = { - 'T', 'P', '/' -}; - -enum llparse_match_status_e { - kMatchComplete, - kMatchPause, - kMatchMismatch -}; -typedef enum llparse_match_status_e llparse_match_status_t; - -struct llparse_match_s { - llparse_match_status_t status; - const unsigned char* current; -}; -typedef struct llparse_match_s llparse_match_t; - -static llparse_match_t llparse__match_sequence_to_lower( - llhttp__internal_t* s, const unsigned char* p, - const unsigned char* endp, - const unsigned char* seq, uint32_t seq_len) { - uint32_t index; - llparse_match_t res; - - index = s->_index; - for (; p != endp; p++) { - unsigned char current; - - current = ((*p) >= 'A' && (*p) <= 'Z' ? (*p | 0x20) : (*p)); - if (current == seq[index]) { - if (++index == seq_len) { - res.status = kMatchComplete; - goto reset; - } - } else { - res.status = kMatchMismatch; - goto reset; - } - } - s->_index = index; - res.status = kMatchPause; - res.current = p; - return res; -reset: - s->_index = 0; - res.current = p; - return res; -} - -static llparse_match_t llparse__match_sequence_to_lower_unsafe( - llhttp__internal_t* s, const unsigned char* p, - const unsigned char* endp, - const unsigned char* seq, uint32_t seq_len) { - uint32_t index; - llparse_match_t res; - - index = s->_index; - for (; p != endp; p++) { - unsigned char current; - - current = ((*p) | 0x20); - if (current == seq[index]) { - if (++index == seq_len) { - res.status = kMatchComplete; - goto reset; - } - } else { - res.status = kMatchMismatch; - goto reset; - } - } - s->_index = index; - res.status = kMatchPause; - res.current = p; - return res; -reset: - s->_index = 0; - res.current = p; - return res; -} - -static llparse_match_t llparse__match_sequence_id( - llhttp__internal_t* s, const unsigned char* p, - const unsigned char* endp, - const unsigned char* seq, uint32_t seq_len) { - uint32_t index; - llparse_match_t res; - - index = s->_index; - for (; p != endp; p++) { - unsigned char current; - - current = *p; - if (current == seq[index]) { - if (++index == seq_len) { - res.status = kMatchComplete; - goto reset; - } - } else { - res.status = kMatchMismatch; - goto reset; - } - } - s->_index = index; - res.status = kMatchPause; - res.current = p; - return res; -reset: - s->_index = 0; - res.current = p; - return res; -} - -enum llparse_state_e { - s_error, - s_n_llhttp__internal__n_closed, - s_n_llhttp__internal__n_invoke_llhttp__after_message_complete, - s_n_llhttp__internal__n_pause_1, - s_n_llhttp__internal__n_invoke_is_equal_upgrade, - s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_2, - s_n_llhttp__internal__n_chunk_data_almost_done_skip, - s_n_llhttp__internal__n_chunk_data_almost_done, - s_n_llhttp__internal__n_consume_content_length, - s_n_llhttp__internal__n_span_start_llhttp__on_body, - s_n_llhttp__internal__n_invoke_is_equal_content_length, - s_n_llhttp__internal__n_chunk_size_almost_done, - s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete, - s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete_1, - s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete, - s_n_llhttp__internal__n_chunk_extension_quoted_value_done, - s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_1, - s_n_llhttp__internal__n_error_17, - s_n_llhttp__internal__n_chunk_extension_quoted_value, - s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_2, - s_n_llhttp__internal__n_error_19, - s_n_llhttp__internal__n_chunk_extension_value, - s_n_llhttp__internal__n_span_start_llhttp__on_chunk_extension_value, - s_n_llhttp__internal__n_error_20, - s_n_llhttp__internal__n_chunk_extension_name, - s_n_llhttp__internal__n_span_start_llhttp__on_chunk_extension_name, - s_n_llhttp__internal__n_chunk_extensions, - s_n_llhttp__internal__n_chunk_size_otherwise, - s_n_llhttp__internal__n_chunk_size, - s_n_llhttp__internal__n_chunk_size_digit, - s_n_llhttp__internal__n_invoke_update_content_length_1, - s_n_llhttp__internal__n_consume_content_length_1, - s_n_llhttp__internal__n_span_start_llhttp__on_body_1, - s_n_llhttp__internal__n_eof, - s_n_llhttp__internal__n_span_start_llhttp__on_body_2, - s_n_llhttp__internal__n_invoke_llhttp__after_headers_complete, - s_n_llhttp__internal__n_headers_almost_done, - s_n_llhttp__internal__n_header_field_colon_discard_ws, - s_n_llhttp__internal__n_error_28, - s_n_llhttp__internal__n_invoke_llhttp__on_header_value_complete, - s_n_llhttp__internal__n_span_start_llhttp__on_header_value, - s_n_llhttp__internal__n_header_value_discard_lws, - s_n_llhttp__internal__n_header_value_discard_ws_almost_done, - s_n_llhttp__internal__n_header_value_lws, - s_n_llhttp__internal__n_header_value_almost_done, - s_n_llhttp__internal__n_header_value_lenient, - s_n_llhttp__internal__n_error_34, - s_n_llhttp__internal__n_header_value_otherwise, - s_n_llhttp__internal__n_header_value_connection_token, - s_n_llhttp__internal__n_header_value_connection_ws, - s_n_llhttp__internal__n_header_value_connection_1, - s_n_llhttp__internal__n_header_value_connection_2, - s_n_llhttp__internal__n_header_value_connection_3, - s_n_llhttp__internal__n_header_value_connection, - s_n_llhttp__internal__n_error_36, - s_n_llhttp__internal__n_error_37, - s_n_llhttp__internal__n_header_value_content_length_ws, - s_n_llhttp__internal__n_header_value_content_length, - s_n_llhttp__internal__n_error_39, - s_n_llhttp__internal__n_error_38, - s_n_llhttp__internal__n_header_value_te_token_ows, - s_n_llhttp__internal__n_header_value, - s_n_llhttp__internal__n_header_value_te_token, - s_n_llhttp__internal__n_header_value_te_chunked_last, - s_n_llhttp__internal__n_header_value_te_chunked, - s_n_llhttp__internal__n_span_start_llhttp__on_header_value_1, - s_n_llhttp__internal__n_header_value_discard_ws, - s_n_llhttp__internal__n_invoke_llhttp__on_header_field_complete, - s_n_llhttp__internal__n_header_field_general_otherwise, - s_n_llhttp__internal__n_header_field_general, - s_n_llhttp__internal__n_header_field_colon, - s_n_llhttp__internal__n_header_field_3, - s_n_llhttp__internal__n_header_field_4, - s_n_llhttp__internal__n_header_field_2, - s_n_llhttp__internal__n_header_field_1, - s_n_llhttp__internal__n_header_field_5, - s_n_llhttp__internal__n_header_field_6, - s_n_llhttp__internal__n_header_field_7, - s_n_llhttp__internal__n_header_field, - s_n_llhttp__internal__n_span_start_llhttp__on_header_field, - s_n_llhttp__internal__n_header_field_start, - s_n_llhttp__internal__n_headers_start, - s_n_llhttp__internal__n_url_skip_to_http09, - s_n_llhttp__internal__n_url_skip_lf_to_http09, - s_n_llhttp__internal__n_req_pri_upgrade, - s_n_llhttp__internal__n_req_http_complete_1, - s_n_llhttp__internal__n_req_http_complete, - s_n_llhttp__internal__n_invoke_load_method_1, - s_n_llhttp__internal__n_invoke_llhttp__on_version_complete, - s_n_llhttp__internal__n_error_44, - s_n_llhttp__internal__n_error_49, - s_n_llhttp__internal__n_req_http_minor, - s_n_llhttp__internal__n_error_50, - s_n_llhttp__internal__n_req_http_dot, - s_n_llhttp__internal__n_error_51, - s_n_llhttp__internal__n_req_http_major, - s_n_llhttp__internal__n_span_start_llhttp__on_version, - s_n_llhttp__internal__n_req_http_start_1, - s_n_llhttp__internal__n_req_http_start_2, - s_n_llhttp__internal__n_req_http_start_3, - s_n_llhttp__internal__n_req_http_start, - s_n_llhttp__internal__n_url_skip_to_http, - s_n_llhttp__internal__n_url_fragment, - s_n_llhttp__internal__n_span_end_stub_query_3, - s_n_llhttp__internal__n_url_query, - s_n_llhttp__internal__n_url_query_or_fragment, - s_n_llhttp__internal__n_url_path, - s_n_llhttp__internal__n_span_start_stub_path_2, - s_n_llhttp__internal__n_span_start_stub_path, - s_n_llhttp__internal__n_span_start_stub_path_1, - s_n_llhttp__internal__n_url_server_with_at, - s_n_llhttp__internal__n_url_server, - s_n_llhttp__internal__n_url_schema_delim_1, - s_n_llhttp__internal__n_url_schema_delim, - s_n_llhttp__internal__n_span_end_stub_schema, - s_n_llhttp__internal__n_url_schema, - s_n_llhttp__internal__n_url_start, - s_n_llhttp__internal__n_span_start_llhttp__on_url_1, - s_n_llhttp__internal__n_span_start_llhttp__on_url, - s_n_llhttp__internal__n_req_spaces_before_url, - s_n_llhttp__internal__n_req_first_space_before_url, - s_n_llhttp__internal__n_invoke_llhttp__on_method_complete_1, - s_n_llhttp__internal__n_after_start_req_2, - s_n_llhttp__internal__n_after_start_req_3, - s_n_llhttp__internal__n_after_start_req_1, - s_n_llhttp__internal__n_after_start_req_4, - s_n_llhttp__internal__n_after_start_req_6, - s_n_llhttp__internal__n_after_start_req_8, - s_n_llhttp__internal__n_after_start_req_9, - s_n_llhttp__internal__n_after_start_req_7, - s_n_llhttp__internal__n_after_start_req_5, - s_n_llhttp__internal__n_after_start_req_12, - s_n_llhttp__internal__n_after_start_req_13, - s_n_llhttp__internal__n_after_start_req_11, - s_n_llhttp__internal__n_after_start_req_10, - s_n_llhttp__internal__n_after_start_req_14, - s_n_llhttp__internal__n_after_start_req_17, - s_n_llhttp__internal__n_after_start_req_16, - s_n_llhttp__internal__n_after_start_req_15, - s_n_llhttp__internal__n_after_start_req_18, - s_n_llhttp__internal__n_after_start_req_20, - s_n_llhttp__internal__n_after_start_req_21, - s_n_llhttp__internal__n_after_start_req_19, - s_n_llhttp__internal__n_after_start_req_23, - s_n_llhttp__internal__n_after_start_req_24, - s_n_llhttp__internal__n_after_start_req_26, - s_n_llhttp__internal__n_after_start_req_28, - s_n_llhttp__internal__n_after_start_req_29, - s_n_llhttp__internal__n_after_start_req_27, - s_n_llhttp__internal__n_after_start_req_25, - s_n_llhttp__internal__n_after_start_req_30, - s_n_llhttp__internal__n_after_start_req_22, - s_n_llhttp__internal__n_after_start_req_31, - s_n_llhttp__internal__n_after_start_req_32, - s_n_llhttp__internal__n_after_start_req_35, - s_n_llhttp__internal__n_after_start_req_36, - s_n_llhttp__internal__n_after_start_req_34, - s_n_llhttp__internal__n_after_start_req_37, - s_n_llhttp__internal__n_after_start_req_38, - s_n_llhttp__internal__n_after_start_req_42, - s_n_llhttp__internal__n_after_start_req_43, - s_n_llhttp__internal__n_after_start_req_41, - s_n_llhttp__internal__n_after_start_req_40, - s_n_llhttp__internal__n_after_start_req_39, - s_n_llhttp__internal__n_after_start_req_45, - s_n_llhttp__internal__n_after_start_req_44, - s_n_llhttp__internal__n_after_start_req_33, - s_n_llhttp__internal__n_after_start_req_48, - s_n_llhttp__internal__n_after_start_req_49, - s_n_llhttp__internal__n_after_start_req_50, - s_n_llhttp__internal__n_after_start_req_51, - s_n_llhttp__internal__n_after_start_req_47, - s_n_llhttp__internal__n_after_start_req_46, - s_n_llhttp__internal__n_after_start_req_54, - s_n_llhttp__internal__n_after_start_req_56, - s_n_llhttp__internal__n_after_start_req_57, - s_n_llhttp__internal__n_after_start_req_55, - s_n_llhttp__internal__n_after_start_req_53, - s_n_llhttp__internal__n_after_start_req_58, - s_n_llhttp__internal__n_after_start_req_59, - s_n_llhttp__internal__n_after_start_req_52, - s_n_llhttp__internal__n_after_start_req_61, - s_n_llhttp__internal__n_after_start_req_62, - s_n_llhttp__internal__n_after_start_req_60, - s_n_llhttp__internal__n_after_start_req_65, - s_n_llhttp__internal__n_after_start_req_67, - s_n_llhttp__internal__n_after_start_req_68, - s_n_llhttp__internal__n_after_start_req_66, - s_n_llhttp__internal__n_after_start_req_69, - s_n_llhttp__internal__n_after_start_req_64, - s_n_llhttp__internal__n_after_start_req_63, - s_n_llhttp__internal__n_after_start_req, - s_n_llhttp__internal__n_span_start_llhttp__on_method_1, - s_n_llhttp__internal__n_invoke_llhttp__on_status_complete, - s_n_llhttp__internal__n_res_line_almost_done, - s_n_llhttp__internal__n_res_status, - s_n_llhttp__internal__n_span_start_llhttp__on_status, - s_n_llhttp__internal__n_res_status_start, - s_n_llhttp__internal__n_res_status_code_otherwise, - s_n_llhttp__internal__n_res_status_code, - s_n_llhttp__internal__n_res_after_version, - s_n_llhttp__internal__n_invoke_llhttp__on_version_complete_1, - s_n_llhttp__internal__n_error_66, - s_n_llhttp__internal__n_error_72, - s_n_llhttp__internal__n_res_http_minor, - s_n_llhttp__internal__n_error_73, - s_n_llhttp__internal__n_res_http_dot, - s_n_llhttp__internal__n_error_74, - s_n_llhttp__internal__n_res_http_major, - s_n_llhttp__internal__n_span_start_llhttp__on_version_1, - s_n_llhttp__internal__n_start_res, - s_n_llhttp__internal__n_invoke_llhttp__on_method_complete, - s_n_llhttp__internal__n_req_or_res_method_2, - s_n_llhttp__internal__n_invoke_update_type_1, - s_n_llhttp__internal__n_req_or_res_method_3, - s_n_llhttp__internal__n_req_or_res_method_1, - s_n_llhttp__internal__n_req_or_res_method, - s_n_llhttp__internal__n_span_start_llhttp__on_method, - s_n_llhttp__internal__n_start_req_or_res, - s_n_llhttp__internal__n_invoke_load_type, - s_n_llhttp__internal__n_invoke_update_finish, - s_n_llhttp__internal__n_start, -}; -typedef enum llparse_state_e llparse_state_t; - -int llhttp__on_method( - llhttp__internal_t* s, const unsigned char* p, - const unsigned char* endp); - -int llhttp__on_url( - llhttp__internal_t* s, const unsigned char* p, - const unsigned char* endp); - -int llhttp__on_version( - llhttp__internal_t* s, const unsigned char* p, - const unsigned char* endp); - -int llhttp__on_header_field( - llhttp__internal_t* s, const unsigned char* p, - const unsigned char* endp); - -int llhttp__on_header_value( - llhttp__internal_t* s, const unsigned char* p, - const unsigned char* endp); - -int llhttp__on_body( - llhttp__internal_t* s, const unsigned char* p, - const unsigned char* endp); - -int llhttp__on_chunk_extension_name( - llhttp__internal_t* s, const unsigned char* p, - const unsigned char* endp); - -int llhttp__on_chunk_extension_value( - llhttp__internal_t* s, const unsigned char* p, - const unsigned char* endp); - -int llhttp__on_status( - llhttp__internal_t* s, const unsigned char* p, - const unsigned char* endp); - -int llhttp__internal__c_load_initial_message_completed( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - return state->initial_message_completed; -} - -int llhttp__on_reset( - llhttp__internal_t* s, const unsigned char* p, - const unsigned char* endp); - -int llhttp__internal__c_update_finish( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - state->finish = 2; - return 0; -} - -int llhttp__on_message_begin( - llhttp__internal_t* s, const unsigned char* p, - const unsigned char* endp); - -int llhttp__internal__c_load_type( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - return state->type; -} - -int llhttp__internal__c_store_method( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp, - int match) { - state->method = match; - return 0; -} - -int llhttp__on_method_complete( - llhttp__internal_t* s, const unsigned char* p, - const unsigned char* endp); - -int llhttp__internal__c_is_equal_method( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - return state->method == 5; -} - -int llhttp__internal__c_update_http_major( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - state->http_major = 0; - return 0; -} - -int llhttp__internal__c_update_http_minor( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - state->http_minor = 9; - return 0; -} - -int llhttp__on_url_complete( - llhttp__internal_t* s, const unsigned char* p, - const unsigned char* endp); - -int llhttp__internal__c_test_lenient_flags( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - return (state->lenient_flags & 1) == 1; -} - -int llhttp__internal__c_test_flags( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - return (state->flags & 128) == 128; -} - -int llhttp__on_chunk_complete( - llhttp__internal_t* s, const unsigned char* p, - const unsigned char* endp); - -int llhttp__on_message_complete( - llhttp__internal_t* s, const unsigned char* p, - const unsigned char* endp); - -int llhttp__internal__c_is_equal_upgrade( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - return state->upgrade == 1; -} - -int llhttp__after_message_complete( - llhttp__internal_t* s, const unsigned char* p, - const unsigned char* endp); - -int llhttp__internal__c_update_content_length( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - state->content_length = 0; - return 0; -} - -int llhttp__internal__c_update_initial_message_completed( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - state->initial_message_completed = 1; - return 0; -} - -int llhttp__internal__c_update_finish_1( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - state->finish = 0; - return 0; -} - -int llhttp__internal__c_test_lenient_flags_1( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - return (state->lenient_flags & 4) == 4; -} - -int llhttp__internal__c_test_flags_1( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - return (state->flags & 544) == 544; -} - -int llhttp__internal__c_test_lenient_flags_2( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - return (state->lenient_flags & 2) == 2; -} - -int llhttp__before_headers_complete( - llhttp__internal_t* s, const unsigned char* p, - const unsigned char* endp); - -int llhttp__on_headers_complete( - llhttp__internal_t* s, const unsigned char* p, - const unsigned char* endp); - -int llhttp__after_headers_complete( - llhttp__internal_t* s, const unsigned char* p, - const unsigned char* endp); - -int llhttp__internal__c_mul_add_content_length( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp, - int match) { - /* Multiplication overflow */ - if (state->content_length > 0xffffffffffffffffULL / 16) { - return 1; - } - - state->content_length *= 16; - - /* Addition overflow */ - if (match >= 0) { - if (state->content_length > 0xffffffffffffffffULL - match) { - return 1; - } - } else { - if (state->content_length < 0ULL - match) { - return 1; - } - } - state->content_length += match; - return 0; -} - -int llhttp__on_chunk_header( - llhttp__internal_t* s, const unsigned char* p, - const unsigned char* endp); - -int llhttp__internal__c_is_equal_content_length( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - return state->content_length == 0; -} - -int llhttp__internal__c_or_flags( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - state->flags |= 128; - return 0; -} - -int llhttp__on_chunk_extension_name_complete( - llhttp__internal_t* s, const unsigned char* p, - const unsigned char* endp); - -int llhttp__on_chunk_extension_value_complete( - llhttp__internal_t* s, const unsigned char* p, - const unsigned char* endp); - -int llhttp__internal__c_update_finish_3( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - state->finish = 1; - return 0; -} - -int llhttp__internal__c_or_flags_1( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - state->flags |= 64; - return 0; -} - -int llhttp__internal__c_update_upgrade( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - state->upgrade = 1; - return 0; -} - -int llhttp__internal__c_store_header_state( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp, - int match) { - state->header_state = match; - return 0; -} - -int llhttp__on_header_field_complete( - llhttp__internal_t* s, const unsigned char* p, - const unsigned char* endp); - -int llhttp__internal__c_load_header_state( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - return state->header_state; -} - -int llhttp__internal__c_or_flags_3( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - state->flags |= 1; - return 0; -} - -int llhttp__internal__c_update_header_state( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - state->header_state = 1; - return 0; -} - -int llhttp__on_header_value_complete( - llhttp__internal_t* s, const unsigned char* p, - const unsigned char* endp); - -int llhttp__internal__c_or_flags_4( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - state->flags |= 2; - return 0; -} - -int llhttp__internal__c_or_flags_5( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - state->flags |= 4; - return 0; -} - -int llhttp__internal__c_or_flags_6( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - state->flags |= 8; - return 0; -} - -int llhttp__internal__c_update_header_state_3( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - state->header_state = 6; - return 0; -} - -int llhttp__internal__c_update_header_state_1( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - state->header_state = 0; - return 0; -} - -int llhttp__internal__c_update_header_state_6( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - state->header_state = 5; - return 0; -} - -int llhttp__internal__c_update_header_state_7( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - state->header_state = 7; - return 0; -} - -int llhttp__internal__c_test_flags_2( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - return (state->flags & 32) == 32; -} - -int llhttp__internal__c_mul_add_content_length_1( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp, - int match) { - /* Multiplication overflow */ - if (state->content_length > 0xffffffffffffffffULL / 10) { - return 1; - } - - state->content_length *= 10; - - /* Addition overflow */ - if (match >= 0) { - if (state->content_length > 0xffffffffffffffffULL - match) { - return 1; - } - } else { - if (state->content_length < 0ULL - match) { - return 1; - } - } - state->content_length += match; - return 0; -} - -int llhttp__internal__c_or_flags_15( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - state->flags |= 32; - return 0; -} - -int llhttp__internal__c_test_flags_3( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - return (state->flags & 8) == 8; -} - -int llhttp__internal__c_test_lenient_flags_6( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - return (state->lenient_flags & 8) == 8; -} - -int llhttp__internal__c_or_flags_16( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - state->flags |= 512; - return 0; -} - -int llhttp__internal__c_and_flags( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - state->flags &= -9; - return 0; -} - -int llhttp__internal__c_update_header_state_8( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - state->header_state = 8; - return 0; -} - -int llhttp__internal__c_or_flags_18( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - state->flags |= 16; - return 0; -} - -int llhttp__internal__c_load_method( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - return state->method; -} - -int llhttp__internal__c_store_http_major( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp, - int match) { - state->http_major = match; - return 0; -} - -int llhttp__internal__c_store_http_minor( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp, - int match) { - state->http_minor = match; - return 0; -} - -int llhttp__internal__c_test_lenient_flags_8( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - return (state->lenient_flags & 16) == 16; -} - -int llhttp__on_version_complete( - llhttp__internal_t* s, const unsigned char* p, - const unsigned char* endp); - -int llhttp__internal__c_load_http_major( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - return state->http_major; -} - -int llhttp__internal__c_load_http_minor( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - return state->http_minor; -} - -int llhttp__internal__c_update_status_code( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - state->status_code = 0; - return 0; -} - -int llhttp__internal__c_mul_add_status_code( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp, - int match) { - /* Multiplication overflow */ - if (state->status_code > 0xffff / 10) { - return 1; - } - - state->status_code *= 10; - - /* Addition overflow */ - if (match >= 0) { - if (state->status_code > 0xffff - match) { - return 1; - } - } else { - if (state->status_code < 0 - match) { - return 1; - } - } - state->status_code += match; - - /* Enforce maximum */ - if (state->status_code > 999) { - return 1; - } - return 0; -} - -int llhttp__on_status_complete( - llhttp__internal_t* s, const unsigned char* p, - const unsigned char* endp); - -int llhttp__internal__c_update_type( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - state->type = 1; - return 0; -} - -int llhttp__internal__c_update_type_1( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - state->type = 2; - return 0; -} - -int llhttp__internal_init(llhttp__internal_t* state) { - memset(state, 0, sizeof(*state)); - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_start; - return 0; -} - -static llparse_state_t llhttp__internal__run( - llhttp__internal_t* state, - const unsigned char* p, - const unsigned char* endp) { - int match; - switch ((llparse_state_t) (intptr_t) state->_current) { - case s_n_llhttp__internal__n_closed: - s_n_llhttp__internal__n_closed: { - if (p == endp) { - return s_n_llhttp__internal__n_closed; - } - p++; - goto s_n_llhttp__internal__n_closed; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_invoke_llhttp__after_message_complete: - s_n_llhttp__internal__n_invoke_llhttp__after_message_complete: { - switch (llhttp__after_message_complete(state, p, endp)) { - case 1: - goto s_n_llhttp__internal__n_invoke_update_content_length; - default: - goto s_n_llhttp__internal__n_invoke_update_finish_1; - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_pause_1: - s_n_llhttp__internal__n_pause_1: { - state->error = 0x16; - state->reason = "Pause on CONNECT/Upgrade"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__after_message_complete; - return s_error; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_invoke_is_equal_upgrade: - s_n_llhttp__internal__n_invoke_is_equal_upgrade: { - switch (llhttp__internal__c_is_equal_upgrade(state, p, endp)) { - case 0: - goto s_n_llhttp__internal__n_invoke_llhttp__after_message_complete; - default: - goto s_n_llhttp__internal__n_pause_1; - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_2: - s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_2: { - switch (llhttp__on_message_complete(state, p, endp)) { - case 0: - goto s_n_llhttp__internal__n_invoke_is_equal_upgrade; - case 21: - goto s_n_llhttp__internal__n_pause_11; - default: - goto s_n_llhttp__internal__n_error_24; - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_chunk_data_almost_done_skip: - s_n_llhttp__internal__n_chunk_data_almost_done_skip: { - if (p == endp) { - return s_n_llhttp__internal__n_chunk_data_almost_done_skip; - } - p++; - goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_complete; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_chunk_data_almost_done: - s_n_llhttp__internal__n_chunk_data_almost_done: { - if (p == endp) { - return s_n_llhttp__internal__n_chunk_data_almost_done; - } - p++; - goto s_n_llhttp__internal__n_chunk_data_almost_done_skip; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_consume_content_length: - s_n_llhttp__internal__n_consume_content_length: { - size_t avail; - uint64_t need; - - avail = endp - p; - need = state->content_length; - if (avail >= need) { - p += need; - state->content_length = 0; - goto s_n_llhttp__internal__n_span_end_llhttp__on_body; - } - - state->content_length -= avail; - return s_n_llhttp__internal__n_consume_content_length; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_span_start_llhttp__on_body: - s_n_llhttp__internal__n_span_start_llhttp__on_body: { - if (p == endp) { - return s_n_llhttp__internal__n_span_start_llhttp__on_body; - } - state->_span_pos0 = (void*) p; - state->_span_cb0 = llhttp__on_body; - goto s_n_llhttp__internal__n_consume_content_length; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_invoke_is_equal_content_length: - s_n_llhttp__internal__n_invoke_is_equal_content_length: { - switch (llhttp__internal__c_is_equal_content_length(state, p, endp)) { - case 0: - goto s_n_llhttp__internal__n_span_start_llhttp__on_body; - default: - goto s_n_llhttp__internal__n_invoke_or_flags; - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_chunk_size_almost_done: - s_n_llhttp__internal__n_chunk_size_almost_done: { - if (p == endp) { - return s_n_llhttp__internal__n_chunk_size_almost_done; - } - p++; - goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_header; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete: - s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete: { - switch (llhttp__on_chunk_extension_name_complete(state, p, endp)) { - case 0: - goto s_n_llhttp__internal__n_chunk_size_almost_done; - case 21: - goto s_n_llhttp__internal__n_pause_5; - default: - goto s_n_llhttp__internal__n_error_11; - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete_1: - s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete_1: { - switch (llhttp__on_chunk_extension_name_complete(state, p, endp)) { - case 0: - goto s_n_llhttp__internal__n_chunk_extensions; - case 21: - goto s_n_llhttp__internal__n_pause_6; - default: - goto s_n_llhttp__internal__n_error_12; - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete: - s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete: { - switch (llhttp__on_chunk_extension_value_complete(state, p, endp)) { - case 0: - goto s_n_llhttp__internal__n_chunk_size_almost_done; - case 21: - goto s_n_llhttp__internal__n_pause_7; - default: - goto s_n_llhttp__internal__n_error_14; - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_chunk_extension_quoted_value_done: - s_n_llhttp__internal__n_chunk_extension_quoted_value_done: { - if (p == endp) { - return s_n_llhttp__internal__n_chunk_extension_quoted_value_done; - } - switch (*p) { - case 13: { - p++; - goto s_n_llhttp__internal__n_chunk_size_almost_done; - } - case ';': { - p++; - goto s_n_llhttp__internal__n_chunk_extensions; - } - default: { - goto s_n_llhttp__internal__n_error_16; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_1: - s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_1: { - switch (llhttp__on_chunk_extension_value_complete(state, p, endp)) { - case 0: - goto s_n_llhttp__internal__n_chunk_extension_quoted_value_done; - case 21: - goto s_n_llhttp__internal__n_pause_8; - default: - goto s_n_llhttp__internal__n_error_15; - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_error_17: - s_n_llhttp__internal__n_error_17: { - state->error = 0x2; - state->reason = "Invalid character in chunk extensions quoted value"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_chunk_extension_quoted_value: - s_n_llhttp__internal__n_chunk_extension_quoted_value: { - static uint8_t lookup_table[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 - }; - if (p == endp) { - return s_n_llhttp__internal__n_chunk_extension_quoted_value; - } - switch (lookup_table[(uint8_t) *p]) { - case 1: { - p++; - goto s_n_llhttp__internal__n_chunk_extension_quoted_value; - } - case 2: { - p++; - goto s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_1; - } - default: { - goto s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_2; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_2: - s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_2: { - switch (llhttp__on_chunk_extension_value_complete(state, p, endp)) { - case 0: - goto s_n_llhttp__internal__n_chunk_size_otherwise; - case 21: - goto s_n_llhttp__internal__n_pause_9; - default: - goto s_n_llhttp__internal__n_error_18; - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_error_19: - s_n_llhttp__internal__n_error_19: { - state->error = 0x2; - state->reason = "Invalid character in chunk extensions value"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_chunk_extension_value: - s_n_llhttp__internal__n_chunk_extension_value: { - static uint8_t lookup_table[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2, 3, 2, 2, 2, 2, 2, 0, 0, 2, 2, 0, 2, 2, 0, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 4, 0, 0, 0, 0, - 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 2, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }; - if (p == endp) { - return s_n_llhttp__internal__n_chunk_extension_value; - } - switch (lookup_table[(uint8_t) *p]) { - case 1: { - goto s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value; - } - case 2: { - p++; - goto s_n_llhttp__internal__n_chunk_extension_value; - } - case 3: { - p++; - goto s_n_llhttp__internal__n_chunk_extension_quoted_value; - } - case 4: { - goto s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_3; - } - default: { - goto s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_4; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_span_start_llhttp__on_chunk_extension_value: - s_n_llhttp__internal__n_span_start_llhttp__on_chunk_extension_value: { - if (p == endp) { - return s_n_llhttp__internal__n_span_start_llhttp__on_chunk_extension_value; - } - state->_span_pos0 = (void*) p; - state->_span_cb0 = llhttp__on_chunk_extension_value; - goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete_2; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_error_20: - s_n_llhttp__internal__n_error_20: { - state->error = 0x2; - state->reason = "Invalid character in chunk extensions name"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_chunk_extension_name: - s_n_llhttp__internal__n_chunk_extension_name: { - static uint8_t lookup_table[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2, 0, 2, 2, 2, 2, 2, 0, 0, 2, 2, 0, 2, 2, 0, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 3, 0, 4, 0, 0, - 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 2, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }; - if (p == endp) { - return s_n_llhttp__internal__n_chunk_extension_name; - } - switch (lookup_table[(uint8_t) *p]) { - case 1: { - goto s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_name; - } - case 2: { - p++; - goto s_n_llhttp__internal__n_chunk_extension_name; - } - case 3: { - goto s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_name_1; - } - case 4: { - goto s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_name_2; - } - default: { - goto s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_name_3; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_span_start_llhttp__on_chunk_extension_name: - s_n_llhttp__internal__n_span_start_llhttp__on_chunk_extension_name: { - if (p == endp) { - return s_n_llhttp__internal__n_span_start_llhttp__on_chunk_extension_name; - } - state->_span_pos0 = (void*) p; - state->_span_cb0 = llhttp__on_chunk_extension_name; - goto s_n_llhttp__internal__n_chunk_extension_name; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_chunk_extensions: - s_n_llhttp__internal__n_chunk_extensions: { - if (p == endp) { - return s_n_llhttp__internal__n_chunk_extensions; - } - switch (*p) { - case 13: { - p++; - goto s_n_llhttp__internal__n_error_9; - } - case ' ': { - p++; - goto s_n_llhttp__internal__n_error_10; - } - default: { - goto s_n_llhttp__internal__n_span_start_llhttp__on_chunk_extension_name; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_chunk_size_otherwise: - s_n_llhttp__internal__n_chunk_size_otherwise: { - if (p == endp) { - return s_n_llhttp__internal__n_chunk_size_otherwise; - } - switch (*p) { - case 13: { - p++; - goto s_n_llhttp__internal__n_chunk_size_almost_done; - } - case ';': { - p++; - goto s_n_llhttp__internal__n_chunk_extensions; - } - default: { - goto s_n_llhttp__internal__n_error_21; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_chunk_size: - s_n_llhttp__internal__n_chunk_size: { - if (p == endp) { - return s_n_llhttp__internal__n_chunk_size; - } - switch (*p) { - case '0': { - p++; - match = 0; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length; - } - case '1': { - p++; - match = 1; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length; - } - case '2': { - p++; - match = 2; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length; - } - case '3': { - p++; - match = 3; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length; - } - case '4': { - p++; - match = 4; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length; - } - case '5': { - p++; - match = 5; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length; - } - case '6': { - p++; - match = 6; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length; - } - case '7': { - p++; - match = 7; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length; - } - case '8': { - p++; - match = 8; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length; - } - case '9': { - p++; - match = 9; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length; - } - case 'A': { - p++; - match = 10; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length; - } - case 'B': { - p++; - match = 11; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length; - } - case 'C': { - p++; - match = 12; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length; - } - case 'D': { - p++; - match = 13; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length; - } - case 'E': { - p++; - match = 14; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length; - } - case 'F': { - p++; - match = 15; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length; - } - case 'a': { - p++; - match = 10; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length; - } - case 'b': { - p++; - match = 11; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length; - } - case 'c': { - p++; - match = 12; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length; - } - case 'd': { - p++; - match = 13; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length; - } - case 'e': { - p++; - match = 14; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length; - } - case 'f': { - p++; - match = 15; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length; - } - default: { - goto s_n_llhttp__internal__n_chunk_size_otherwise; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_chunk_size_digit: - s_n_llhttp__internal__n_chunk_size_digit: { - if (p == endp) { - return s_n_llhttp__internal__n_chunk_size_digit; - } - switch (*p) { - case '0': { - p++; - match = 0; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length; - } - case '1': { - p++; - match = 1; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length; - } - case '2': { - p++; - match = 2; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length; - } - case '3': { - p++; - match = 3; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length; - } - case '4': { - p++; - match = 4; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length; - } - case '5': { - p++; - match = 5; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length; - } - case '6': { - p++; - match = 6; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length; - } - case '7': { - p++; - match = 7; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length; - } - case '8': { - p++; - match = 8; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length; - } - case '9': { - p++; - match = 9; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length; - } - case 'A': { - p++; - match = 10; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length; - } - case 'B': { - p++; - match = 11; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length; - } - case 'C': { - p++; - match = 12; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length; - } - case 'D': { - p++; - match = 13; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length; - } - case 'E': { - p++; - match = 14; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length; - } - case 'F': { - p++; - match = 15; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length; - } - case 'a': { - p++; - match = 10; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length; - } - case 'b': { - p++; - match = 11; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length; - } - case 'c': { - p++; - match = 12; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length; - } - case 'd': { - p++; - match = 13; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length; - } - case 'e': { - p++; - match = 14; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length; - } - case 'f': { - p++; - match = 15; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length; - } - default: { - goto s_n_llhttp__internal__n_error_23; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_invoke_update_content_length_1: - s_n_llhttp__internal__n_invoke_update_content_length_1: { - switch (llhttp__internal__c_update_content_length(state, p, endp)) { - default: - goto s_n_llhttp__internal__n_chunk_size_digit; - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_consume_content_length_1: - s_n_llhttp__internal__n_consume_content_length_1: { - size_t avail; - uint64_t need; - - avail = endp - p; - need = state->content_length; - if (avail >= need) { - p += need; - state->content_length = 0; - goto s_n_llhttp__internal__n_span_end_llhttp__on_body_1; - } - - state->content_length -= avail; - return s_n_llhttp__internal__n_consume_content_length_1; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_span_start_llhttp__on_body_1: - s_n_llhttp__internal__n_span_start_llhttp__on_body_1: { - if (p == endp) { - return s_n_llhttp__internal__n_span_start_llhttp__on_body_1; - } - state->_span_pos0 = (void*) p; - state->_span_cb0 = llhttp__on_body; - goto s_n_llhttp__internal__n_consume_content_length_1; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_eof: - s_n_llhttp__internal__n_eof: { - if (p == endp) { - return s_n_llhttp__internal__n_eof; - } - p++; - goto s_n_llhttp__internal__n_eof; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_span_start_llhttp__on_body_2: - s_n_llhttp__internal__n_span_start_llhttp__on_body_2: { - if (p == endp) { - return s_n_llhttp__internal__n_span_start_llhttp__on_body_2; - } - state->_span_pos0 = (void*) p; - state->_span_cb0 = llhttp__on_body; - goto s_n_llhttp__internal__n_eof; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_invoke_llhttp__after_headers_complete: - s_n_llhttp__internal__n_invoke_llhttp__after_headers_complete: { - switch (llhttp__after_headers_complete(state, p, endp)) { - case 1: - goto s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_1; - case 2: - goto s_n_llhttp__internal__n_invoke_update_content_length_1; - case 3: - goto s_n_llhttp__internal__n_span_start_llhttp__on_body_1; - case 4: - goto s_n_llhttp__internal__n_invoke_update_finish_3; - case 5: - goto s_n_llhttp__internal__n_error_25; - default: - goto s_n_llhttp__internal__n_invoke_llhttp__on_message_complete; - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_headers_almost_done: - s_n_llhttp__internal__n_headers_almost_done: { - if (p == endp) { - return s_n_llhttp__internal__n_headers_almost_done; - } - p++; - goto s_n_llhttp__internal__n_invoke_test_flags; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_header_field_colon_discard_ws: - s_n_llhttp__internal__n_header_field_colon_discard_ws: { - if (p == endp) { - return s_n_llhttp__internal__n_header_field_colon_discard_ws; - } - switch (*p) { - case ' ': { - p++; - goto s_n_llhttp__internal__n_header_field_colon_discard_ws; - } - default: { - goto s_n_llhttp__internal__n_header_field_colon; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_error_28: - s_n_llhttp__internal__n_error_28: { - state->error = 0xa; - state->reason = "Invalid header field char"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_invoke_llhttp__on_header_value_complete: - s_n_llhttp__internal__n_invoke_llhttp__on_header_value_complete: { - switch (llhttp__on_header_value_complete(state, p, endp)) { - case 0: - goto s_n_llhttp__internal__n_header_field_start; - case 21: - goto s_n_llhttp__internal__n_pause_14; - default: - goto s_n_llhttp__internal__n_error_31; - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_span_start_llhttp__on_header_value: - s_n_llhttp__internal__n_span_start_llhttp__on_header_value: { - if (p == endp) { - return s_n_llhttp__internal__n_span_start_llhttp__on_header_value; - } - state->_span_pos0 = (void*) p; - state->_span_cb0 = llhttp__on_header_value; - goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_header_value_discard_lws: - s_n_llhttp__internal__n_header_value_discard_lws: { - if (p == endp) { - return s_n_llhttp__internal__n_header_value_discard_lws; - } - switch (*p) { - case 9: { - p++; - goto s_n_llhttp__internal__n_header_value_discard_ws; - } - case ' ': { - p++; - goto s_n_llhttp__internal__n_header_value_discard_ws; - } - default: { - goto s_n_llhttp__internal__n_invoke_load_header_state; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_header_value_discard_ws_almost_done: - s_n_llhttp__internal__n_header_value_discard_ws_almost_done: { - if (p == endp) { - return s_n_llhttp__internal__n_header_value_discard_ws_almost_done; - } - p++; - goto s_n_llhttp__internal__n_header_value_discard_lws; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_header_value_lws: - s_n_llhttp__internal__n_header_value_lws: { - if (p == endp) { - return s_n_llhttp__internal__n_header_value_lws; - } - switch (*p) { - case 9: { - goto s_n_llhttp__internal__n_invoke_load_header_state_3; - } - case ' ': { - goto s_n_llhttp__internal__n_invoke_load_header_state_3; - } - default: { - goto s_n_llhttp__internal__n_invoke_load_header_state_4; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_header_value_almost_done: - s_n_llhttp__internal__n_header_value_almost_done: { - if (p == endp) { - return s_n_llhttp__internal__n_header_value_almost_done; - } - switch (*p) { - case 10: { - p++; - goto s_n_llhttp__internal__n_header_value_lws; - } - default: { - goto s_n_llhttp__internal__n_error_33; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_header_value_lenient: - s_n_llhttp__internal__n_header_value_lenient: { - if (p == endp) { - return s_n_llhttp__internal__n_header_value_lenient; - } - switch (*p) { - case 10: { - goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_3; - } - case 13: { - goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_4; - } - default: { - p++; - goto s_n_llhttp__internal__n_header_value_lenient; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_error_34: - s_n_llhttp__internal__n_error_34: { - state->error = 0xa; - state->reason = "Invalid header value char"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_header_value_otherwise: - s_n_llhttp__internal__n_header_value_otherwise: { - if (p == endp) { - return s_n_llhttp__internal__n_header_value_otherwise; - } - switch (*p) { - case 13: { - goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_1; - } - default: { - goto s_n_llhttp__internal__n_invoke_test_lenient_flags_5; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_header_value_connection_token: - s_n_llhttp__internal__n_header_value_connection_token: { - static uint8_t lookup_table[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 - }; - if (p == endp) { - return s_n_llhttp__internal__n_header_value_connection_token; - } - switch (lookup_table[(uint8_t) *p]) { - case 1: { - p++; - goto s_n_llhttp__internal__n_header_value_connection_token; - } - case 2: { - p++; - goto s_n_llhttp__internal__n_header_value_connection; - } - default: { - goto s_n_llhttp__internal__n_header_value_otherwise; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_header_value_connection_ws: - s_n_llhttp__internal__n_header_value_connection_ws: { - if (p == endp) { - return s_n_llhttp__internal__n_header_value_connection_ws; - } - switch (*p) { - case 10: { - goto s_n_llhttp__internal__n_header_value_otherwise; - } - case 13: { - goto s_n_llhttp__internal__n_header_value_otherwise; - } - case ' ': { - p++; - goto s_n_llhttp__internal__n_header_value_connection_ws; - } - case ',': { - p++; - goto s_n_llhttp__internal__n_invoke_load_header_state_5; - } - default: { - goto s_n_llhttp__internal__n_invoke_update_header_state_5; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_header_value_connection_1: - s_n_llhttp__internal__n_header_value_connection_1: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_header_value_connection_1; - } - match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob3, 4); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - goto s_n_llhttp__internal__n_invoke_update_header_state_3; - } - case kMatchPause: { - return s_n_llhttp__internal__n_header_value_connection_1; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_header_value_connection_token; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_header_value_connection_2: - s_n_llhttp__internal__n_header_value_connection_2: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_header_value_connection_2; - } - match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob4, 9); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - goto s_n_llhttp__internal__n_invoke_update_header_state_6; - } - case kMatchPause: { - return s_n_llhttp__internal__n_header_value_connection_2; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_header_value_connection_token; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_header_value_connection_3: - s_n_llhttp__internal__n_header_value_connection_3: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_header_value_connection_3; - } - match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob5, 6); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - goto s_n_llhttp__internal__n_invoke_update_header_state_7; - } - case kMatchPause: { - return s_n_llhttp__internal__n_header_value_connection_3; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_header_value_connection_token; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_header_value_connection: - s_n_llhttp__internal__n_header_value_connection: { - if (p == endp) { - return s_n_llhttp__internal__n_header_value_connection; - } - switch (((*p) >= 'A' && (*p) <= 'Z' ? (*p | 0x20) : (*p))) { - case 9: { - p++; - goto s_n_llhttp__internal__n_header_value_connection; - } - case ' ': { - p++; - goto s_n_llhttp__internal__n_header_value_connection; - } - case 'c': { - p++; - goto s_n_llhttp__internal__n_header_value_connection_1; - } - case 'k': { - p++; - goto s_n_llhttp__internal__n_header_value_connection_2; - } - case 'u': { - p++; - goto s_n_llhttp__internal__n_header_value_connection_3; - } - default: { - goto s_n_llhttp__internal__n_header_value_connection_token; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_error_36: - s_n_llhttp__internal__n_error_36: { - state->error = 0xb; - state->reason = "Content-Length overflow"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_error_37: - s_n_llhttp__internal__n_error_37: { - state->error = 0xb; - state->reason = "Invalid character in Content-Length"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_header_value_content_length_ws: - s_n_llhttp__internal__n_header_value_content_length_ws: { - if (p == endp) { - return s_n_llhttp__internal__n_header_value_content_length_ws; - } - switch (*p) { - case 10: { - goto s_n_llhttp__internal__n_invoke_or_flags_15; - } - case 13: { - goto s_n_llhttp__internal__n_invoke_or_flags_15; - } - case ' ': { - p++; - goto s_n_llhttp__internal__n_header_value_content_length_ws; - } - default: { - goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_6; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_header_value_content_length: - s_n_llhttp__internal__n_header_value_content_length: { - if (p == endp) { - return s_n_llhttp__internal__n_header_value_content_length; - } - switch (*p) { - case '0': { - p++; - match = 0; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length_1; - } - case '1': { - p++; - match = 1; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length_1; - } - case '2': { - p++; - match = 2; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length_1; - } - case '3': { - p++; - match = 3; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length_1; - } - case '4': { - p++; - match = 4; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length_1; - } - case '5': { - p++; - match = 5; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length_1; - } - case '6': { - p++; - match = 6; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length_1; - } - case '7': { - p++; - match = 7; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length_1; - } - case '8': { - p++; - match = 8; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length_1; - } - case '9': { - p++; - match = 9; - goto s_n_llhttp__internal__n_invoke_mul_add_content_length_1; - } - default: { - goto s_n_llhttp__internal__n_header_value_content_length_ws; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_error_39: - s_n_llhttp__internal__n_error_39: { - state->error = 0xf; - state->reason = "Invalid `Transfer-Encoding` header value"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_error_38: - s_n_llhttp__internal__n_error_38: { - state->error = 0xf; - state->reason = "Invalid `Transfer-Encoding` header value"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_header_value_te_token_ows: - s_n_llhttp__internal__n_header_value_te_token_ows: { - if (p == endp) { - return s_n_llhttp__internal__n_header_value_te_token_ows; - } - switch (*p) { - case 9: { - p++; - goto s_n_llhttp__internal__n_header_value_te_token_ows; - } - case ' ': { - p++; - goto s_n_llhttp__internal__n_header_value_te_token_ows; - } - default: { - goto s_n_llhttp__internal__n_header_value_te_chunked; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_header_value: - s_n_llhttp__internal__n_header_value: { - static uint8_t lookup_table[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 - }; - if (p == endp) { - return s_n_llhttp__internal__n_header_value; - } - #ifdef __SSE4_2__ - if (endp - p >= 16) { - __m128i ranges; - __m128i input; - int avail; - int match_len; - - /* Load input */ - input = _mm_loadu_si128((__m128i const*) p); - ranges = _mm_loadu_si128((__m128i const*) llparse_blob7); - - /* Find first character that does not match `ranges` */ - match_len = _mm_cmpestri(ranges, 6, - input, 16, - _SIDD_UBYTE_OPS | _SIDD_CMP_RANGES | - _SIDD_NEGATIVE_POLARITY); - - if (match_len != 0) { - p += match_len; - goto s_n_llhttp__internal__n_header_value; - } - goto s_n_llhttp__internal__n_header_value_otherwise; - } - #endif /* __SSE4_2__ */ - switch (lookup_table[(uint8_t) *p]) { - case 1: { - p++; - goto s_n_llhttp__internal__n_header_value; - } - default: { - goto s_n_llhttp__internal__n_header_value_otherwise; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_header_value_te_token: - s_n_llhttp__internal__n_header_value_te_token: { - static uint8_t lookup_table[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 - }; - if (p == endp) { - return s_n_llhttp__internal__n_header_value_te_token; - } - switch (lookup_table[(uint8_t) *p]) { - case 1: { - p++; - goto s_n_llhttp__internal__n_header_value_te_token; - } - case 2: { - p++; - goto s_n_llhttp__internal__n_header_value_te_token_ows; - } - default: { - goto s_n_llhttp__internal__n_invoke_update_header_state_9; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_header_value_te_chunked_last: - s_n_llhttp__internal__n_header_value_te_chunked_last: { - if (p == endp) { - return s_n_llhttp__internal__n_header_value_te_chunked_last; - } - switch (*p) { - case 10: { - goto s_n_llhttp__internal__n_invoke_update_header_state_8; - } - case 13: { - goto s_n_llhttp__internal__n_invoke_update_header_state_8; - } - case ' ': { - p++; - goto s_n_llhttp__internal__n_header_value_te_chunked_last; - } - case ',': { - goto s_n_llhttp__internal__n_invoke_load_type_1; - } - default: { - goto s_n_llhttp__internal__n_header_value_te_token; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_header_value_te_chunked: - s_n_llhttp__internal__n_header_value_te_chunked: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_header_value_te_chunked; - } - match_seq = llparse__match_sequence_to_lower_unsafe(state, p, endp, llparse_blob6, 7); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - goto s_n_llhttp__internal__n_header_value_te_chunked_last; - } - case kMatchPause: { - return s_n_llhttp__internal__n_header_value_te_chunked; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_header_value_te_token; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_span_start_llhttp__on_header_value_1: - s_n_llhttp__internal__n_span_start_llhttp__on_header_value_1: { - if (p == endp) { - return s_n_llhttp__internal__n_span_start_llhttp__on_header_value_1; - } - state->_span_pos0 = (void*) p; - state->_span_cb0 = llhttp__on_header_value; - goto s_n_llhttp__internal__n_invoke_load_header_state_2; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_header_value_discard_ws: - s_n_llhttp__internal__n_header_value_discard_ws: { - if (p == endp) { - return s_n_llhttp__internal__n_header_value_discard_ws; - } - switch (*p) { - case 9: { - p++; - goto s_n_llhttp__internal__n_header_value_discard_ws; - } - case 10: { - p++; - goto s_n_llhttp__internal__n_invoke_test_lenient_flags_4; - } - case 13: { - p++; - goto s_n_llhttp__internal__n_header_value_discard_ws_almost_done; - } - case ' ': { - p++; - goto s_n_llhttp__internal__n_header_value_discard_ws; - } - default: { - goto s_n_llhttp__internal__n_span_start_llhttp__on_header_value_1; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_invoke_llhttp__on_header_field_complete: - s_n_llhttp__internal__n_invoke_llhttp__on_header_field_complete: { - switch (llhttp__on_header_field_complete(state, p, endp)) { - case 0: - goto s_n_llhttp__internal__n_header_value_discard_ws; - case 21: - goto s_n_llhttp__internal__n_pause_15; - default: - goto s_n_llhttp__internal__n_error_29; - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_header_field_general_otherwise: - s_n_llhttp__internal__n_header_field_general_otherwise: { - if (p == endp) { - return s_n_llhttp__internal__n_header_field_general_otherwise; - } - switch (*p) { - case ':': { - goto s_n_llhttp__internal__n_span_end_llhttp__on_header_field_2; - } - default: { - goto s_n_llhttp__internal__n_error_40; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_header_field_general: - s_n_llhttp__internal__n_header_field_general: { - static uint8_t lookup_table[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }; - if (p == endp) { - return s_n_llhttp__internal__n_header_field_general; - } - #ifdef __SSE4_2__ - if (endp - p >= 16) { - __m128i ranges; - __m128i input; - int avail; - int match_len; - - /* Load input */ - input = _mm_loadu_si128((__m128i const*) p); - ranges = _mm_loadu_si128((__m128i const*) llparse_blob8); - - /* Find first character that does not match `ranges` */ - match_len = _mm_cmpestri(ranges, 16, - input, 16, - _SIDD_UBYTE_OPS | _SIDD_CMP_RANGES | - _SIDD_NEGATIVE_POLARITY); - - if (match_len != 0) { - p += match_len; - goto s_n_llhttp__internal__n_header_field_general; - } - ranges = _mm_loadu_si128((__m128i const*) llparse_blob9); - - /* Find first character that does not match `ranges` */ - match_len = _mm_cmpestri(ranges, 2, - input, 16, - _SIDD_UBYTE_OPS | _SIDD_CMP_RANGES | - _SIDD_NEGATIVE_POLARITY); - - if (match_len != 0) { - p += match_len; - goto s_n_llhttp__internal__n_header_field_general; - } - goto s_n_llhttp__internal__n_header_field_general_otherwise; - } - #endif /* __SSE4_2__ */ - switch (lookup_table[(uint8_t) *p]) { - case 1: { - p++; - goto s_n_llhttp__internal__n_header_field_general; - } - default: { - goto s_n_llhttp__internal__n_header_field_general_otherwise; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_header_field_colon: - s_n_llhttp__internal__n_header_field_colon: { - if (p == endp) { - return s_n_llhttp__internal__n_header_field_colon; - } - switch (*p) { - case ' ': { - goto s_n_llhttp__internal__n_invoke_test_lenient_flags_3; - } - case ':': { - goto s_n_llhttp__internal__n_span_end_llhttp__on_header_field_1; - } - default: { - goto s_n_llhttp__internal__n_invoke_update_header_state_10; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_header_field_3: - s_n_llhttp__internal__n_header_field_3: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_header_field_3; - } - match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob2, 6); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - match = 1; - goto s_n_llhttp__internal__n_invoke_store_header_state; - } - case kMatchPause: { - return s_n_llhttp__internal__n_header_field_3; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_invoke_update_header_state_11; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_header_field_4: - s_n_llhttp__internal__n_header_field_4: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_header_field_4; - } - match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob10, 10); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - match = 2; - goto s_n_llhttp__internal__n_invoke_store_header_state; - } - case kMatchPause: { - return s_n_llhttp__internal__n_header_field_4; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_invoke_update_header_state_11; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_header_field_2: - s_n_llhttp__internal__n_header_field_2: { - if (p == endp) { - return s_n_llhttp__internal__n_header_field_2; - } - switch (((*p) >= 'A' && (*p) <= 'Z' ? (*p | 0x20) : (*p))) { - case 'n': { - p++; - goto s_n_llhttp__internal__n_header_field_3; - } - case 't': { - p++; - goto s_n_llhttp__internal__n_header_field_4; - } - default: { - goto s_n_llhttp__internal__n_invoke_update_header_state_11; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_header_field_1: - s_n_llhttp__internal__n_header_field_1: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_header_field_1; - } - match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob1, 2); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - goto s_n_llhttp__internal__n_header_field_2; - } - case kMatchPause: { - return s_n_llhttp__internal__n_header_field_1; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_invoke_update_header_state_11; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_header_field_5: - s_n_llhttp__internal__n_header_field_5: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_header_field_5; - } - match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob11, 15); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - match = 1; - goto s_n_llhttp__internal__n_invoke_store_header_state; - } - case kMatchPause: { - return s_n_llhttp__internal__n_header_field_5; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_invoke_update_header_state_11; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_header_field_6: - s_n_llhttp__internal__n_header_field_6: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_header_field_6; - } - match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob12, 16); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - match = 3; - goto s_n_llhttp__internal__n_invoke_store_header_state; - } - case kMatchPause: { - return s_n_llhttp__internal__n_header_field_6; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_invoke_update_header_state_11; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_header_field_7: - s_n_llhttp__internal__n_header_field_7: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_header_field_7; - } - match_seq = llparse__match_sequence_to_lower(state, p, endp, llparse_blob13, 6); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - match = 4; - goto s_n_llhttp__internal__n_invoke_store_header_state; - } - case kMatchPause: { - return s_n_llhttp__internal__n_header_field_7; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_invoke_update_header_state_11; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_header_field: - s_n_llhttp__internal__n_header_field: { - if (p == endp) { - return s_n_llhttp__internal__n_header_field; - } - switch (((*p) >= 'A' && (*p) <= 'Z' ? (*p | 0x20) : (*p))) { - case 'c': { - p++; - goto s_n_llhttp__internal__n_header_field_1; - } - case 'p': { - p++; - goto s_n_llhttp__internal__n_header_field_5; - } - case 't': { - p++; - goto s_n_llhttp__internal__n_header_field_6; - } - case 'u': { - p++; - goto s_n_llhttp__internal__n_header_field_7; - } - default: { - goto s_n_llhttp__internal__n_invoke_update_header_state_11; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_span_start_llhttp__on_header_field: - s_n_llhttp__internal__n_span_start_llhttp__on_header_field: { - if (p == endp) { - return s_n_llhttp__internal__n_span_start_llhttp__on_header_field; - } - state->_span_pos0 = (void*) p; - state->_span_cb0 = llhttp__on_header_field; - goto s_n_llhttp__internal__n_header_field; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_header_field_start: - s_n_llhttp__internal__n_header_field_start: { - if (p == endp) { - return s_n_llhttp__internal__n_header_field_start; - } - switch (*p) { - case 10: { - goto s_n_llhttp__internal__n_headers_almost_done; - } - case 13: { - p++; - goto s_n_llhttp__internal__n_headers_almost_done; - } - default: { - goto s_n_llhttp__internal__n_span_start_llhttp__on_header_field; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_headers_start: - s_n_llhttp__internal__n_headers_start: { - if (p == endp) { - return s_n_llhttp__internal__n_headers_start; - } - switch (*p) { - case ' ': { - p++; - goto s_n_llhttp__internal__n_invoke_test_lenient_flags; - } - default: { - goto s_n_llhttp__internal__n_header_field_start; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_url_skip_to_http09: - s_n_llhttp__internal__n_url_skip_to_http09: { - if (p == endp) { - return s_n_llhttp__internal__n_url_skip_to_http09; - } - p++; - goto s_n_llhttp__internal__n_invoke_update_http_major; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_url_skip_lf_to_http09: - s_n_llhttp__internal__n_url_skip_lf_to_http09: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_url_skip_lf_to_http09; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob14, 2); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - goto s_n_llhttp__internal__n_invoke_update_http_major; - } - case kMatchPause: { - return s_n_llhttp__internal__n_url_skip_lf_to_http09; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_41; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_req_pri_upgrade: - s_n_llhttp__internal__n_req_pri_upgrade: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_req_pri_upgrade; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob16, 10); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - goto s_n_llhttp__internal__n_error_47; - } - case kMatchPause: { - return s_n_llhttp__internal__n_req_pri_upgrade; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_48; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_req_http_complete_1: - s_n_llhttp__internal__n_req_http_complete_1: { - if (p == endp) { - return s_n_llhttp__internal__n_req_http_complete_1; - } - switch (*p) { - case 10: { - p++; - goto s_n_llhttp__internal__n_headers_start; - } - default: { - goto s_n_llhttp__internal__n_error_46; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_req_http_complete: - s_n_llhttp__internal__n_req_http_complete: { - if (p == endp) { - return s_n_llhttp__internal__n_req_http_complete; - } - switch (*p) { - case 10: { - p++; - goto s_n_llhttp__internal__n_headers_start; - } - case 13: { - p++; - goto s_n_llhttp__internal__n_req_http_complete_1; - } - default: { - goto s_n_llhttp__internal__n_error_46; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_invoke_load_method_1: - s_n_llhttp__internal__n_invoke_load_method_1: { - switch (llhttp__internal__c_load_method(state, p, endp)) { - case 34: - goto s_n_llhttp__internal__n_req_pri_upgrade; - default: - goto s_n_llhttp__internal__n_req_http_complete; - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_invoke_llhttp__on_version_complete: - s_n_llhttp__internal__n_invoke_llhttp__on_version_complete: { - switch (llhttp__on_version_complete(state, p, endp)) { - case 0: - goto s_n_llhttp__internal__n_invoke_load_method_1; - case 21: - goto s_n_llhttp__internal__n_pause_17; - default: - goto s_n_llhttp__internal__n_error_45; - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_error_44: - s_n_llhttp__internal__n_error_44: { - state->error = 0x9; - state->reason = "Invalid HTTP version"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_error_49: - s_n_llhttp__internal__n_error_49: { - state->error = 0x9; - state->reason = "Invalid minor version"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_req_http_minor: - s_n_llhttp__internal__n_req_http_minor: { - if (p == endp) { - return s_n_llhttp__internal__n_req_http_minor; - } - switch (*p) { - case '0': { - p++; - match = 0; - goto s_n_llhttp__internal__n_invoke_store_http_minor; - } - case '1': { - p++; - match = 1; - goto s_n_llhttp__internal__n_invoke_store_http_minor; - } - case '2': { - p++; - match = 2; - goto s_n_llhttp__internal__n_invoke_store_http_minor; - } - case '3': { - p++; - match = 3; - goto s_n_llhttp__internal__n_invoke_store_http_minor; - } - case '4': { - p++; - match = 4; - goto s_n_llhttp__internal__n_invoke_store_http_minor; - } - case '5': { - p++; - match = 5; - goto s_n_llhttp__internal__n_invoke_store_http_minor; - } - case '6': { - p++; - match = 6; - goto s_n_llhttp__internal__n_invoke_store_http_minor; - } - case '7': { - p++; - match = 7; - goto s_n_llhttp__internal__n_invoke_store_http_minor; - } - case '8': { - p++; - match = 8; - goto s_n_llhttp__internal__n_invoke_store_http_minor; - } - case '9': { - p++; - match = 9; - goto s_n_llhttp__internal__n_invoke_store_http_minor; - } - default: { - goto s_n_llhttp__internal__n_span_end_llhttp__on_version_2; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_error_50: - s_n_llhttp__internal__n_error_50: { - state->error = 0x9; - state->reason = "Expected dot"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_req_http_dot: - s_n_llhttp__internal__n_req_http_dot: { - if (p == endp) { - return s_n_llhttp__internal__n_req_http_dot; - } - switch (*p) { - case '.': { - p++; - goto s_n_llhttp__internal__n_req_http_minor; - } - default: { - goto s_n_llhttp__internal__n_span_end_llhttp__on_version_3; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_error_51: - s_n_llhttp__internal__n_error_51: { - state->error = 0x9; - state->reason = "Invalid major version"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_req_http_major: - s_n_llhttp__internal__n_req_http_major: { - if (p == endp) { - return s_n_llhttp__internal__n_req_http_major; - } - switch (*p) { - case '0': { - p++; - match = 0; - goto s_n_llhttp__internal__n_invoke_store_http_major; - } - case '1': { - p++; - match = 1; - goto s_n_llhttp__internal__n_invoke_store_http_major; - } - case '2': { - p++; - match = 2; - goto s_n_llhttp__internal__n_invoke_store_http_major; - } - case '3': { - p++; - match = 3; - goto s_n_llhttp__internal__n_invoke_store_http_major; - } - case '4': { - p++; - match = 4; - goto s_n_llhttp__internal__n_invoke_store_http_major; - } - case '5': { - p++; - match = 5; - goto s_n_llhttp__internal__n_invoke_store_http_major; - } - case '6': { - p++; - match = 6; - goto s_n_llhttp__internal__n_invoke_store_http_major; - } - case '7': { - p++; - match = 7; - goto s_n_llhttp__internal__n_invoke_store_http_major; - } - case '8': { - p++; - match = 8; - goto s_n_llhttp__internal__n_invoke_store_http_major; - } - case '9': { - p++; - match = 9; - goto s_n_llhttp__internal__n_invoke_store_http_major; - } - default: { - goto s_n_llhttp__internal__n_span_end_llhttp__on_version_4; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_span_start_llhttp__on_version: - s_n_llhttp__internal__n_span_start_llhttp__on_version: { - if (p == endp) { - return s_n_llhttp__internal__n_span_start_llhttp__on_version; - } - state->_span_pos0 = (void*) p; - state->_span_cb0 = llhttp__on_version; - goto s_n_llhttp__internal__n_req_http_major; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_req_http_start_1: - s_n_llhttp__internal__n_req_http_start_1: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_req_http_start_1; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob15, 4); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - goto s_n_llhttp__internal__n_invoke_load_method; - } - case kMatchPause: { - return s_n_llhttp__internal__n_req_http_start_1; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_54; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_req_http_start_2: - s_n_llhttp__internal__n_req_http_start_2: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_req_http_start_2; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob17, 3); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - goto s_n_llhttp__internal__n_invoke_load_method_2; - } - case kMatchPause: { - return s_n_llhttp__internal__n_req_http_start_2; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_54; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_req_http_start_3: - s_n_llhttp__internal__n_req_http_start_3: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_req_http_start_3; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob18, 4); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - goto s_n_llhttp__internal__n_invoke_load_method_3; - } - case kMatchPause: { - return s_n_llhttp__internal__n_req_http_start_3; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_54; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_req_http_start: - s_n_llhttp__internal__n_req_http_start: { - if (p == endp) { - return s_n_llhttp__internal__n_req_http_start; - } - switch (*p) { - case ' ': { - p++; - goto s_n_llhttp__internal__n_req_http_start; - } - case 'H': { - p++; - goto s_n_llhttp__internal__n_req_http_start_1; - } - case 'I': { - p++; - goto s_n_llhttp__internal__n_req_http_start_2; - } - case 'R': { - p++; - goto s_n_llhttp__internal__n_req_http_start_3; - } - default: { - goto s_n_llhttp__internal__n_error_54; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_url_skip_to_http: - s_n_llhttp__internal__n_url_skip_to_http: { - if (p == endp) { - return s_n_llhttp__internal__n_url_skip_to_http; - } - p++; - goto s_n_llhttp__internal__n_invoke_llhttp__on_url_complete_1; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_url_fragment: - s_n_llhttp__internal__n_url_fragment: { - static uint8_t lookup_table[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 1, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 - }; - if (p == endp) { - return s_n_llhttp__internal__n_url_fragment; - } - switch (lookup_table[(uint8_t) *p]) { - case 1: { - p++; - goto s_n_llhttp__internal__n_url_fragment; - } - case 2: { - goto s_n_llhttp__internal__n_span_end_llhttp__on_url_6; - } - case 3: { - goto s_n_llhttp__internal__n_span_end_llhttp__on_url_7; - } - case 4: { - goto s_n_llhttp__internal__n_span_end_llhttp__on_url_8; - } - default: { - goto s_n_llhttp__internal__n_error_55; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_span_end_stub_query_3: - s_n_llhttp__internal__n_span_end_stub_query_3: { - if (p == endp) { - return s_n_llhttp__internal__n_span_end_stub_query_3; - } - p++; - goto s_n_llhttp__internal__n_url_fragment; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_url_query: - s_n_llhttp__internal__n_url_query: { - static uint8_t lookup_table[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 1, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 - }; - if (p == endp) { - return s_n_llhttp__internal__n_url_query; - } - switch (lookup_table[(uint8_t) *p]) { - case 1: { - p++; - goto s_n_llhttp__internal__n_url_query; - } - case 2: { - goto s_n_llhttp__internal__n_span_end_llhttp__on_url_9; - } - case 3: { - goto s_n_llhttp__internal__n_span_end_llhttp__on_url_10; - } - case 4: { - goto s_n_llhttp__internal__n_span_end_llhttp__on_url_11; - } - case 5: { - goto s_n_llhttp__internal__n_span_end_stub_query_3; - } - default: { - goto s_n_llhttp__internal__n_error_56; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_url_query_or_fragment: - s_n_llhttp__internal__n_url_query_or_fragment: { - if (p == endp) { - return s_n_llhttp__internal__n_url_query_or_fragment; - } - switch (*p) { - case 10: { - goto s_n_llhttp__internal__n_span_end_llhttp__on_url_3; - } - case 13: { - goto s_n_llhttp__internal__n_span_end_llhttp__on_url_4; - } - case ' ': { - goto s_n_llhttp__internal__n_span_end_llhttp__on_url_5; - } - case '#': { - p++; - goto s_n_llhttp__internal__n_url_fragment; - } - case '?': { - p++; - goto s_n_llhttp__internal__n_url_query; - } - default: { - goto s_n_llhttp__internal__n_error_57; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_url_path: - s_n_llhttp__internal__n_url_path: { - static uint8_t lookup_table[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 - }; - if (p == endp) { - return s_n_llhttp__internal__n_url_path; - } - #ifdef __SSE4_2__ - if (endp - p >= 16) { - __m128i ranges; - __m128i input; - int avail; - int match_len; - - /* Load input */ - input = _mm_loadu_si128((__m128i const*) p); - ranges = _mm_loadu_si128((__m128i const*) llparse_blob0); - - /* Find first character that does not match `ranges` */ - match_len = _mm_cmpestri(ranges, 12, - input, 16, - _SIDD_UBYTE_OPS | _SIDD_CMP_RANGES | - _SIDD_NEGATIVE_POLARITY); - - if (match_len != 0) { - p += match_len; - goto s_n_llhttp__internal__n_url_path; - } - goto s_n_llhttp__internal__n_url_query_or_fragment; - } - #endif /* __SSE4_2__ */ - switch (lookup_table[(uint8_t) *p]) { - case 1: { - p++; - goto s_n_llhttp__internal__n_url_path; - } - default: { - goto s_n_llhttp__internal__n_url_query_or_fragment; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_span_start_stub_path_2: - s_n_llhttp__internal__n_span_start_stub_path_2: { - if (p == endp) { - return s_n_llhttp__internal__n_span_start_stub_path_2; - } - p++; - goto s_n_llhttp__internal__n_url_path; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_span_start_stub_path: - s_n_llhttp__internal__n_span_start_stub_path: { - if (p == endp) { - return s_n_llhttp__internal__n_span_start_stub_path; - } - p++; - goto s_n_llhttp__internal__n_url_path; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_span_start_stub_path_1: - s_n_llhttp__internal__n_span_start_stub_path_1: { - if (p == endp) { - return s_n_llhttp__internal__n_span_start_stub_path_1; - } - p++; - goto s_n_llhttp__internal__n_url_path; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_url_server_with_at: - s_n_llhttp__internal__n_url_server_with_at: { - static uint8_t lookup_table[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3, 4, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 4, 0, 6, - 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 4, 0, 4, - 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 4, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }; - if (p == endp) { - return s_n_llhttp__internal__n_url_server_with_at; - } - switch (lookup_table[(uint8_t) *p]) { - case 1: { - goto s_n_llhttp__internal__n_span_end_llhttp__on_url_12; - } - case 2: { - goto s_n_llhttp__internal__n_span_end_llhttp__on_url_13; - } - case 3: { - goto s_n_llhttp__internal__n_span_end_llhttp__on_url_14; - } - case 4: { - p++; - goto s_n_llhttp__internal__n_url_server; - } - case 5: { - goto s_n_llhttp__internal__n_span_start_stub_path_1; - } - case 6: { - p++; - goto s_n_llhttp__internal__n_url_query; - } - case 7: { - p++; - goto s_n_llhttp__internal__n_error_58; - } - default: { - goto s_n_llhttp__internal__n_error_59; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_url_server: - s_n_llhttp__internal__n_url_server: { - static uint8_t lookup_table[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3, 4, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 4, 0, 6, - 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 4, 0, 4, - 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 4, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }; - if (p == endp) { - return s_n_llhttp__internal__n_url_server; - } - switch (lookup_table[(uint8_t) *p]) { - case 1: { - goto s_n_llhttp__internal__n_span_end_llhttp__on_url; - } - case 2: { - goto s_n_llhttp__internal__n_span_end_llhttp__on_url_1; - } - case 3: { - goto s_n_llhttp__internal__n_span_end_llhttp__on_url_2; - } - case 4: { - p++; - goto s_n_llhttp__internal__n_url_server; - } - case 5: { - goto s_n_llhttp__internal__n_span_start_stub_path; - } - case 6: { - p++; - goto s_n_llhttp__internal__n_url_query; - } - case 7: { - p++; - goto s_n_llhttp__internal__n_url_server_with_at; - } - default: { - goto s_n_llhttp__internal__n_error_60; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_url_schema_delim_1: - s_n_llhttp__internal__n_url_schema_delim_1: { - if (p == endp) { - return s_n_llhttp__internal__n_url_schema_delim_1; - } - switch (*p) { - case '/': { - p++; - goto s_n_llhttp__internal__n_url_server; - } - default: { - goto s_n_llhttp__internal__n_error_62; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_url_schema_delim: - s_n_llhttp__internal__n_url_schema_delim: { - if (p == endp) { - return s_n_llhttp__internal__n_url_schema_delim; - } - switch (*p) { - case 10: { - p++; - goto s_n_llhttp__internal__n_error_61; - } - case 13: { - p++; - goto s_n_llhttp__internal__n_error_61; - } - case ' ': { - p++; - goto s_n_llhttp__internal__n_error_61; - } - case '/': { - p++; - goto s_n_llhttp__internal__n_url_schema_delim_1; - } - default: { - goto s_n_llhttp__internal__n_error_62; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_span_end_stub_schema: - s_n_llhttp__internal__n_span_end_stub_schema: { - if (p == endp) { - return s_n_llhttp__internal__n_span_end_stub_schema; - } - p++; - goto s_n_llhttp__internal__n_url_schema_delim; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_url_schema: - s_n_llhttp__internal__n_url_schema: { - static uint8_t lookup_table[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, - 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, - 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }; - if (p == endp) { - return s_n_llhttp__internal__n_url_schema; - } - switch (lookup_table[(uint8_t) *p]) { - case 1: { - p++; - goto s_n_llhttp__internal__n_error_61; - } - case 2: { - goto s_n_llhttp__internal__n_span_end_stub_schema; - } - case 3: { - p++; - goto s_n_llhttp__internal__n_url_schema; - } - default: { - goto s_n_llhttp__internal__n_error_63; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_url_start: - s_n_llhttp__internal__n_url_start: { - static uint8_t lookup_table[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, - 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }; - if (p == endp) { - return s_n_llhttp__internal__n_url_start; - } - switch (lookup_table[(uint8_t) *p]) { - case 1: { - p++; - goto s_n_llhttp__internal__n_error_61; - } - case 2: { - goto s_n_llhttp__internal__n_span_start_stub_path_2; - } - case 3: { - goto s_n_llhttp__internal__n_url_schema; - } - default: { - goto s_n_llhttp__internal__n_error_64; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_span_start_llhttp__on_url_1: - s_n_llhttp__internal__n_span_start_llhttp__on_url_1: { - if (p == endp) { - return s_n_llhttp__internal__n_span_start_llhttp__on_url_1; - } - state->_span_pos0 = (void*) p; - state->_span_cb0 = llhttp__on_url; - goto s_n_llhttp__internal__n_url_start; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_span_start_llhttp__on_url: - s_n_llhttp__internal__n_span_start_llhttp__on_url: { - if (p == endp) { - return s_n_llhttp__internal__n_span_start_llhttp__on_url; - } - state->_span_pos0 = (void*) p; - state->_span_cb0 = llhttp__on_url; - goto s_n_llhttp__internal__n_url_server; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_req_spaces_before_url: - s_n_llhttp__internal__n_req_spaces_before_url: { - if (p == endp) { - return s_n_llhttp__internal__n_req_spaces_before_url; - } - switch (*p) { - case ' ': { - p++; - goto s_n_llhttp__internal__n_req_spaces_before_url; - } - default: { - goto s_n_llhttp__internal__n_invoke_is_equal_method; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_req_first_space_before_url: - s_n_llhttp__internal__n_req_first_space_before_url: { - if (p == endp) { - return s_n_llhttp__internal__n_req_first_space_before_url; - } - switch (*p) { - case ' ': { - p++; - goto s_n_llhttp__internal__n_req_spaces_before_url; - } - default: { - goto s_n_llhttp__internal__n_error_65; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_invoke_llhttp__on_method_complete_1: - s_n_llhttp__internal__n_invoke_llhttp__on_method_complete_1: { - switch (llhttp__on_method_complete(state, p, endp)) { - case 0: - goto s_n_llhttp__internal__n_req_first_space_before_url; - case 21: - goto s_n_llhttp__internal__n_pause_22; - default: - goto s_n_llhttp__internal__n_error_76; - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_2: - s_n_llhttp__internal__n_after_start_req_2: { - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_2; - } - switch (*p) { - case 'L': { - p++; - match = 19; - goto s_n_llhttp__internal__n_invoke_store_method_1; - } - default: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_3: - s_n_llhttp__internal__n_after_start_req_3: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_3; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob19, 6); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - match = 36; - goto s_n_llhttp__internal__n_invoke_store_method_1; - } - case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_3; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_1: - s_n_llhttp__internal__n_after_start_req_1: { - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_1; - } - switch (*p) { - case 'C': { - p++; - goto s_n_llhttp__internal__n_after_start_req_2; - } - case 'N': { - p++; - goto s_n_llhttp__internal__n_after_start_req_3; - } - default: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_4: - s_n_llhttp__internal__n_after_start_req_4: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_4; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob20, 3); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - match = 16; - goto s_n_llhttp__internal__n_invoke_store_method_1; - } - case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_4; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_6: - s_n_llhttp__internal__n_after_start_req_6: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_6; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob21, 6); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - match = 22; - goto s_n_llhttp__internal__n_invoke_store_method_1; - } - case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_6; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_8: - s_n_llhttp__internal__n_after_start_req_8: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_8; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob22, 4); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - match = 5; - goto s_n_llhttp__internal__n_invoke_store_method_1; - } - case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_8; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_9: - s_n_llhttp__internal__n_after_start_req_9: { - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_9; - } - switch (*p) { - case 'Y': { - p++; - match = 8; - goto s_n_llhttp__internal__n_invoke_store_method_1; - } - default: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_7: - s_n_llhttp__internal__n_after_start_req_7: { - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_7; - } - switch (*p) { - case 'N': { - p++; - goto s_n_llhttp__internal__n_after_start_req_8; - } - case 'P': { - p++; - goto s_n_llhttp__internal__n_after_start_req_9; - } - default: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_5: - s_n_llhttp__internal__n_after_start_req_5: { - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_5; - } - switch (*p) { - case 'H': { - p++; - goto s_n_llhttp__internal__n_after_start_req_6; - } - case 'O': { - p++; - goto s_n_llhttp__internal__n_after_start_req_7; - } - default: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_12: - s_n_llhttp__internal__n_after_start_req_12: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_12; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob23, 3); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - match = 0; - goto s_n_llhttp__internal__n_invoke_store_method_1; - } - case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_12; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_13: - s_n_llhttp__internal__n_after_start_req_13: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_13; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob24, 5); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - match = 35; - goto s_n_llhttp__internal__n_invoke_store_method_1; - } - case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_13; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_11: - s_n_llhttp__internal__n_after_start_req_11: { - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_11; - } - switch (*p) { - case 'L': { - p++; - goto s_n_llhttp__internal__n_after_start_req_12; - } - case 'S': { - p++; - goto s_n_llhttp__internal__n_after_start_req_13; - } - default: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_10: - s_n_llhttp__internal__n_after_start_req_10: { - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_10; - } - switch (*p) { - case 'E': { - p++; - goto s_n_llhttp__internal__n_after_start_req_11; - } - default: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_14: - s_n_llhttp__internal__n_after_start_req_14: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_14; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob25, 4); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - match = 45; - goto s_n_llhttp__internal__n_invoke_store_method_1; - } - case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_14; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_17: - s_n_llhttp__internal__n_after_start_req_17: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_17; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob27, 9); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - match = 41; - goto s_n_llhttp__internal__n_invoke_store_method_1; - } - case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_17; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_16: - s_n_llhttp__internal__n_after_start_req_16: { - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_16; - } - switch (*p) { - case '_': { - p++; - goto s_n_llhttp__internal__n_after_start_req_17; - } - default: { - match = 1; - goto s_n_llhttp__internal__n_invoke_store_method_1; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_15: - s_n_llhttp__internal__n_after_start_req_15: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_15; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob26, 2); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - goto s_n_llhttp__internal__n_after_start_req_16; - } - case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_15; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_18: - s_n_llhttp__internal__n_after_start_req_18: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_18; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob28, 3); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - match = 2; - goto s_n_llhttp__internal__n_invoke_store_method_1; - } - case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_18; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_20: - s_n_llhttp__internal__n_after_start_req_20: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_20; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob29, 2); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - match = 31; - goto s_n_llhttp__internal__n_invoke_store_method_1; - } - case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_20; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_21: - s_n_llhttp__internal__n_after_start_req_21: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_21; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob30, 2); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - match = 9; - goto s_n_llhttp__internal__n_invoke_store_method_1; - } - case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_21; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_19: - s_n_llhttp__internal__n_after_start_req_19: { - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_19; - } - switch (*p) { - case 'I': { - p++; - goto s_n_llhttp__internal__n_after_start_req_20; - } - case 'O': { - p++; - goto s_n_llhttp__internal__n_after_start_req_21; - } - default: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_23: - s_n_llhttp__internal__n_after_start_req_23: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_23; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob31, 6); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - match = 24; - goto s_n_llhttp__internal__n_invoke_store_method_1; - } - case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_23; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_24: - s_n_llhttp__internal__n_after_start_req_24: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_24; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob32, 3); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - match = 23; - goto s_n_llhttp__internal__n_invoke_store_method_1; - } - case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_24; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_26: - s_n_llhttp__internal__n_after_start_req_26: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_26; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob33, 7); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - match = 21; - goto s_n_llhttp__internal__n_invoke_store_method_1; - } - case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_26; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_28: - s_n_llhttp__internal__n_after_start_req_28: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_28; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob34, 6); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - match = 30; - goto s_n_llhttp__internal__n_invoke_store_method_1; - } - case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_28; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_29: - s_n_llhttp__internal__n_after_start_req_29: { - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_29; - } - switch (*p) { - case 'L': { - p++; - match = 10; - goto s_n_llhttp__internal__n_invoke_store_method_1; - } - default: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_27: - s_n_llhttp__internal__n_after_start_req_27: { - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_27; - } - switch (*p) { - case 'A': { - p++; - goto s_n_llhttp__internal__n_after_start_req_28; - } - case 'O': { - p++; - goto s_n_llhttp__internal__n_after_start_req_29; - } - default: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_25: - s_n_llhttp__internal__n_after_start_req_25: { - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_25; - } - switch (*p) { - case 'A': { - p++; - goto s_n_llhttp__internal__n_after_start_req_26; - } - case 'C': { - p++; - goto s_n_llhttp__internal__n_after_start_req_27; - } - default: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_30: - s_n_llhttp__internal__n_after_start_req_30: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_30; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob35, 2); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - match = 11; - goto s_n_llhttp__internal__n_invoke_store_method_1; - } - case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_30; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_22: - s_n_llhttp__internal__n_after_start_req_22: { - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_22; - } - switch (*p) { - case '-': { - p++; - goto s_n_llhttp__internal__n_after_start_req_23; - } - case 'E': { - p++; - goto s_n_llhttp__internal__n_after_start_req_24; - } - case 'K': { - p++; - goto s_n_llhttp__internal__n_after_start_req_25; - } - case 'O': { - p++; - goto s_n_llhttp__internal__n_after_start_req_30; - } - default: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_31: - s_n_llhttp__internal__n_after_start_req_31: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_31; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob36, 5); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - match = 25; - goto s_n_llhttp__internal__n_invoke_store_method_1; - } - case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_31; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_32: - s_n_llhttp__internal__n_after_start_req_32: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_32; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob37, 6); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - match = 6; - goto s_n_llhttp__internal__n_invoke_store_method_1; - } - case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_32; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_35: - s_n_llhttp__internal__n_after_start_req_35: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_35; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob38, 2); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - match = 28; - goto s_n_llhttp__internal__n_invoke_store_method_1; - } - case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_35; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_36: - s_n_llhttp__internal__n_after_start_req_36: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_36; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob39, 2); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - match = 39; - goto s_n_llhttp__internal__n_invoke_store_method_1; - } - case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_36; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_34: - s_n_llhttp__internal__n_after_start_req_34: { - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_34; - } - switch (*p) { - case 'T': { - p++; - goto s_n_llhttp__internal__n_after_start_req_35; - } - case 'U': { - p++; - goto s_n_llhttp__internal__n_after_start_req_36; - } - default: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_37: - s_n_llhttp__internal__n_after_start_req_37: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_37; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob40, 2); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - match = 38; - goto s_n_llhttp__internal__n_invoke_store_method_1; - } - case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_37; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_38: - s_n_llhttp__internal__n_after_start_req_38: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_38; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob41, 2); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - match = 3; - goto s_n_llhttp__internal__n_invoke_store_method_1; - } - case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_38; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_42: - s_n_llhttp__internal__n_after_start_req_42: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_42; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob42, 3); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - match = 12; - goto s_n_llhttp__internal__n_invoke_store_method_1; - } - case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_42; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_43: - s_n_llhttp__internal__n_after_start_req_43: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_43; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob43, 4); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - match = 13; - goto s_n_llhttp__internal__n_invoke_store_method_1; - } - case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_43; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_41: - s_n_llhttp__internal__n_after_start_req_41: { - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_41; - } - switch (*p) { - case 'F': { - p++; - goto s_n_llhttp__internal__n_after_start_req_42; - } - case 'P': { - p++; - goto s_n_llhttp__internal__n_after_start_req_43; - } - default: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_40: - s_n_llhttp__internal__n_after_start_req_40: { - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_40; - } - switch (*p) { - case 'P': { - p++; - goto s_n_llhttp__internal__n_after_start_req_41; - } - default: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_39: - s_n_llhttp__internal__n_after_start_req_39: { - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_39; - } - switch (*p) { - case 'I': { - p++; - match = 34; - goto s_n_llhttp__internal__n_invoke_store_method_1; - } - case 'O': { - p++; - goto s_n_llhttp__internal__n_after_start_req_40; - } - default: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_45: - s_n_llhttp__internal__n_after_start_req_45: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_45; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob44, 2); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - match = 29; - goto s_n_llhttp__internal__n_invoke_store_method_1; - } - case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_45; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_44: - s_n_llhttp__internal__n_after_start_req_44: { - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_44; - } - switch (*p) { - case 'R': { - p++; - goto s_n_llhttp__internal__n_after_start_req_45; - } - case 'T': { - p++; - match = 4; - goto s_n_llhttp__internal__n_invoke_store_method_1; - } - default: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_33: - s_n_llhttp__internal__n_after_start_req_33: { - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_33; - } - switch (*p) { - case 'A': { - p++; - goto s_n_llhttp__internal__n_after_start_req_34; - } - case 'L': { - p++; - goto s_n_llhttp__internal__n_after_start_req_37; - } - case 'O': { - p++; - goto s_n_llhttp__internal__n_after_start_req_38; - } - case 'R': { - p++; - goto s_n_llhttp__internal__n_after_start_req_39; - } - case 'U': { - p++; - goto s_n_llhttp__internal__n_after_start_req_44; - } - default: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_48: - s_n_llhttp__internal__n_after_start_req_48: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_48; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob45, 3); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - match = 17; - goto s_n_llhttp__internal__n_invoke_store_method_1; - } - case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_48; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_49: - s_n_llhttp__internal__n_after_start_req_49: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_49; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob46, 3); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - match = 44; - goto s_n_llhttp__internal__n_invoke_store_method_1; - } - case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_49; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_50: - s_n_llhttp__internal__n_after_start_req_50: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_50; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob47, 5); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - match = 43; - goto s_n_llhttp__internal__n_invoke_store_method_1; - } - case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_50; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_51: - s_n_llhttp__internal__n_after_start_req_51: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_51; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob48, 3); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - match = 20; - goto s_n_llhttp__internal__n_invoke_store_method_1; - } - case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_51; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_47: - s_n_llhttp__internal__n_after_start_req_47: { - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_47; - } - switch (*p) { - case 'B': { - p++; - goto s_n_llhttp__internal__n_after_start_req_48; - } - case 'C': { - p++; - goto s_n_llhttp__internal__n_after_start_req_49; - } - case 'D': { - p++; - goto s_n_llhttp__internal__n_after_start_req_50; - } - case 'P': { - p++; - goto s_n_llhttp__internal__n_after_start_req_51; - } - default: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_46: - s_n_llhttp__internal__n_after_start_req_46: { - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_46; - } - switch (*p) { - case 'E': { - p++; - goto s_n_llhttp__internal__n_after_start_req_47; - } - default: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_54: - s_n_llhttp__internal__n_after_start_req_54: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_54; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob49, 3); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - match = 14; - goto s_n_llhttp__internal__n_invoke_store_method_1; - } - case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_54; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_56: - s_n_llhttp__internal__n_after_start_req_56: { - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_56; - } - switch (*p) { - case 'P': { - p++; - match = 37; - goto s_n_llhttp__internal__n_invoke_store_method_1; - } - default: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_57: - s_n_llhttp__internal__n_after_start_req_57: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_57; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob50, 9); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - match = 42; - goto s_n_llhttp__internal__n_invoke_store_method_1; - } - case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_57; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_55: - s_n_llhttp__internal__n_after_start_req_55: { - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_55; - } - switch (*p) { - case 'U': { - p++; - goto s_n_llhttp__internal__n_after_start_req_56; - } - case '_': { - p++; - goto s_n_llhttp__internal__n_after_start_req_57; - } - default: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_53: - s_n_llhttp__internal__n_after_start_req_53: { - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_53; - } - switch (*p) { - case 'A': { - p++; - goto s_n_llhttp__internal__n_after_start_req_54; - } - case 'T': { - p++; - goto s_n_llhttp__internal__n_after_start_req_55; - } - default: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_58: - s_n_llhttp__internal__n_after_start_req_58: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_58; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob51, 4); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - match = 33; - goto s_n_llhttp__internal__n_invoke_store_method_1; - } - case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_58; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_59: - s_n_llhttp__internal__n_after_start_req_59: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_59; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob52, 7); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - match = 26; - goto s_n_llhttp__internal__n_invoke_store_method_1; - } - case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_59; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_52: - s_n_llhttp__internal__n_after_start_req_52: { - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_52; - } - switch (*p) { - case 'E': { - p++; - goto s_n_llhttp__internal__n_after_start_req_53; - } - case 'O': { - p++; - goto s_n_llhttp__internal__n_after_start_req_58; - } - case 'U': { - p++; - goto s_n_llhttp__internal__n_after_start_req_59; - } - default: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_61: - s_n_llhttp__internal__n_after_start_req_61: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_61; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob53, 6); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - match = 40; - goto s_n_llhttp__internal__n_invoke_store_method_1; - } - case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_61; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_62: - s_n_llhttp__internal__n_after_start_req_62: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_62; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob54, 3); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - match = 7; - goto s_n_llhttp__internal__n_invoke_store_method_1; - } - case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_62; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_60: - s_n_llhttp__internal__n_after_start_req_60: { - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_60; - } - switch (*p) { - case 'E': { - p++; - goto s_n_llhttp__internal__n_after_start_req_61; - } - case 'R': { - p++; - goto s_n_llhttp__internal__n_after_start_req_62; - } - default: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_65: - s_n_llhttp__internal__n_after_start_req_65: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_65; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob55, 3); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - match = 18; - goto s_n_llhttp__internal__n_invoke_store_method_1; - } - case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_65; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_67: - s_n_llhttp__internal__n_after_start_req_67: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_67; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob56, 2); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - match = 32; - goto s_n_llhttp__internal__n_invoke_store_method_1; - } - case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_67; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_68: - s_n_llhttp__internal__n_after_start_req_68: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_68; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob57, 2); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - match = 15; - goto s_n_llhttp__internal__n_invoke_store_method_1; - } - case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_68; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_66: - s_n_llhttp__internal__n_after_start_req_66: { - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_66; - } - switch (*p) { - case 'I': { - p++; - goto s_n_llhttp__internal__n_after_start_req_67; - } - case 'O': { - p++; - goto s_n_llhttp__internal__n_after_start_req_68; - } - default: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_69: - s_n_llhttp__internal__n_after_start_req_69: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_69; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob58, 8); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - match = 27; - goto s_n_llhttp__internal__n_invoke_store_method_1; - } - case kMatchPause: { - return s_n_llhttp__internal__n_after_start_req_69; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_64: - s_n_llhttp__internal__n_after_start_req_64: { - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_64; - } - switch (*p) { - case 'B': { - p++; - goto s_n_llhttp__internal__n_after_start_req_65; - } - case 'L': { - p++; - goto s_n_llhttp__internal__n_after_start_req_66; - } - case 'S': { - p++; - goto s_n_llhttp__internal__n_after_start_req_69; - } - default: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req_63: - s_n_llhttp__internal__n_after_start_req_63: { - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req_63; - } - switch (*p) { - case 'N': { - p++; - goto s_n_llhttp__internal__n_after_start_req_64; - } - default: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_after_start_req: - s_n_llhttp__internal__n_after_start_req: { - if (p == endp) { - return s_n_llhttp__internal__n_after_start_req; - } - switch (*p) { - case 'A': { - p++; - goto s_n_llhttp__internal__n_after_start_req_1; - } - case 'B': { - p++; - goto s_n_llhttp__internal__n_after_start_req_4; - } - case 'C': { - p++; - goto s_n_llhttp__internal__n_after_start_req_5; - } - case 'D': { - p++; - goto s_n_llhttp__internal__n_after_start_req_10; - } - case 'F': { - p++; - goto s_n_llhttp__internal__n_after_start_req_14; - } - case 'G': { - p++; - goto s_n_llhttp__internal__n_after_start_req_15; - } - case 'H': { - p++; - goto s_n_llhttp__internal__n_after_start_req_18; - } - case 'L': { - p++; - goto s_n_llhttp__internal__n_after_start_req_19; - } - case 'M': { - p++; - goto s_n_llhttp__internal__n_after_start_req_22; - } - case 'N': { - p++; - goto s_n_llhttp__internal__n_after_start_req_31; - } - case 'O': { - p++; - goto s_n_llhttp__internal__n_after_start_req_32; - } - case 'P': { - p++; - goto s_n_llhttp__internal__n_after_start_req_33; - } - case 'R': { - p++; - goto s_n_llhttp__internal__n_after_start_req_46; - } - case 'S': { - p++; - goto s_n_llhttp__internal__n_after_start_req_52; - } - case 'T': { - p++; - goto s_n_llhttp__internal__n_after_start_req_60; - } - case 'U': { - p++; - goto s_n_llhttp__internal__n_after_start_req_63; - } - default: { - goto s_n_llhttp__internal__n_error_77; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_span_start_llhttp__on_method_1: - s_n_llhttp__internal__n_span_start_llhttp__on_method_1: { - if (p == endp) { - return s_n_llhttp__internal__n_span_start_llhttp__on_method_1; - } - state->_span_pos0 = (void*) p; - state->_span_cb0 = llhttp__on_method; - goto s_n_llhttp__internal__n_after_start_req; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_invoke_llhttp__on_status_complete: - s_n_llhttp__internal__n_invoke_llhttp__on_status_complete: { - switch (llhttp__on_status_complete(state, p, endp)) { - case 0: - goto s_n_llhttp__internal__n_headers_start; - case 21: - goto s_n_llhttp__internal__n_pause_20; - default: - goto s_n_llhttp__internal__n_error_69; - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_res_line_almost_done: - s_n_llhttp__internal__n_res_line_almost_done: { - if (p == endp) { - return s_n_llhttp__internal__n_res_line_almost_done; - } - p++; - goto s_n_llhttp__internal__n_invoke_llhttp__on_status_complete; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_res_status: - s_n_llhttp__internal__n_res_status: { - if (p == endp) { - return s_n_llhttp__internal__n_res_status; - } - switch (*p) { - case 10: { - goto s_n_llhttp__internal__n_span_end_llhttp__on_status; - } - case 13: { - goto s_n_llhttp__internal__n_span_end_llhttp__on_status_1; - } - default: { - p++; - goto s_n_llhttp__internal__n_res_status; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_span_start_llhttp__on_status: - s_n_llhttp__internal__n_span_start_llhttp__on_status: { - if (p == endp) { - return s_n_llhttp__internal__n_span_start_llhttp__on_status; - } - state->_span_pos0 = (void*) p; - state->_span_cb0 = llhttp__on_status; - goto s_n_llhttp__internal__n_res_status; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_res_status_start: - s_n_llhttp__internal__n_res_status_start: { - if (p == endp) { - return s_n_llhttp__internal__n_res_status_start; - } - switch (*p) { - case 10: { - p++; - goto s_n_llhttp__internal__n_invoke_llhttp__on_status_complete; - } - case 13: { - p++; - goto s_n_llhttp__internal__n_res_line_almost_done; - } - default: { - goto s_n_llhttp__internal__n_span_start_llhttp__on_status; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_res_status_code_otherwise: - s_n_llhttp__internal__n_res_status_code_otherwise: { - if (p == endp) { - return s_n_llhttp__internal__n_res_status_code_otherwise; - } - switch (*p) { - case 10: { - goto s_n_llhttp__internal__n_res_status_start; - } - case 13: { - goto s_n_llhttp__internal__n_res_status_start; - } - case ' ': { - p++; - goto s_n_llhttp__internal__n_res_status_start; - } - default: { - goto s_n_llhttp__internal__n_error_70; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_res_status_code: - s_n_llhttp__internal__n_res_status_code: { - if (p == endp) { - return s_n_llhttp__internal__n_res_status_code; - } - switch (*p) { - case '0': { - p++; - match = 0; - goto s_n_llhttp__internal__n_invoke_mul_add_status_code; - } - case '1': { - p++; - match = 1; - goto s_n_llhttp__internal__n_invoke_mul_add_status_code; - } - case '2': { - p++; - match = 2; - goto s_n_llhttp__internal__n_invoke_mul_add_status_code; - } - case '3': { - p++; - match = 3; - goto s_n_llhttp__internal__n_invoke_mul_add_status_code; - } - case '4': { - p++; - match = 4; - goto s_n_llhttp__internal__n_invoke_mul_add_status_code; - } - case '5': { - p++; - match = 5; - goto s_n_llhttp__internal__n_invoke_mul_add_status_code; - } - case '6': { - p++; - match = 6; - goto s_n_llhttp__internal__n_invoke_mul_add_status_code; - } - case '7': { - p++; - match = 7; - goto s_n_llhttp__internal__n_invoke_mul_add_status_code; - } - case '8': { - p++; - match = 8; - goto s_n_llhttp__internal__n_invoke_mul_add_status_code; - } - case '9': { - p++; - match = 9; - goto s_n_llhttp__internal__n_invoke_mul_add_status_code; - } - default: { - goto s_n_llhttp__internal__n_res_status_code_otherwise; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_res_after_version: - s_n_llhttp__internal__n_res_after_version: { - if (p == endp) { - return s_n_llhttp__internal__n_res_after_version; - } - switch (*p) { - case ' ': { - p++; - goto s_n_llhttp__internal__n_invoke_update_status_code; - } - default: { - goto s_n_llhttp__internal__n_error_71; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_invoke_llhttp__on_version_complete_1: - s_n_llhttp__internal__n_invoke_llhttp__on_version_complete_1: { - switch (llhttp__on_version_complete(state, p, endp)) { - case 0: - goto s_n_llhttp__internal__n_res_after_version; - case 21: - goto s_n_llhttp__internal__n_pause_21; - default: - goto s_n_llhttp__internal__n_error_67; - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_error_66: - s_n_llhttp__internal__n_error_66: { - state->error = 0x9; - state->reason = "Invalid HTTP version"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_error_72: - s_n_llhttp__internal__n_error_72: { - state->error = 0x9; - state->reason = "Invalid minor version"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_res_http_minor: - s_n_llhttp__internal__n_res_http_minor: { - if (p == endp) { - return s_n_llhttp__internal__n_res_http_minor; - } - switch (*p) { - case '0': { - p++; - match = 0; - goto s_n_llhttp__internal__n_invoke_store_http_minor_1; - } - case '1': { - p++; - match = 1; - goto s_n_llhttp__internal__n_invoke_store_http_minor_1; - } - case '2': { - p++; - match = 2; - goto s_n_llhttp__internal__n_invoke_store_http_minor_1; - } - case '3': { - p++; - match = 3; - goto s_n_llhttp__internal__n_invoke_store_http_minor_1; - } - case '4': { - p++; - match = 4; - goto s_n_llhttp__internal__n_invoke_store_http_minor_1; - } - case '5': { - p++; - match = 5; - goto s_n_llhttp__internal__n_invoke_store_http_minor_1; - } - case '6': { - p++; - match = 6; - goto s_n_llhttp__internal__n_invoke_store_http_minor_1; - } - case '7': { - p++; - match = 7; - goto s_n_llhttp__internal__n_invoke_store_http_minor_1; - } - case '8': { - p++; - match = 8; - goto s_n_llhttp__internal__n_invoke_store_http_minor_1; - } - case '9': { - p++; - match = 9; - goto s_n_llhttp__internal__n_invoke_store_http_minor_1; - } - default: { - goto s_n_llhttp__internal__n_span_end_llhttp__on_version_7; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_error_73: - s_n_llhttp__internal__n_error_73: { - state->error = 0x9; - state->reason = "Expected dot"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_res_http_dot: - s_n_llhttp__internal__n_res_http_dot: { - if (p == endp) { - return s_n_llhttp__internal__n_res_http_dot; - } - switch (*p) { - case '.': { - p++; - goto s_n_llhttp__internal__n_res_http_minor; - } - default: { - goto s_n_llhttp__internal__n_span_end_llhttp__on_version_8; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_error_74: - s_n_llhttp__internal__n_error_74: { - state->error = 0x9; - state->reason = "Invalid major version"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_res_http_major: - s_n_llhttp__internal__n_res_http_major: { - if (p == endp) { - return s_n_llhttp__internal__n_res_http_major; - } - switch (*p) { - case '0': { - p++; - match = 0; - goto s_n_llhttp__internal__n_invoke_store_http_major_1; - } - case '1': { - p++; - match = 1; - goto s_n_llhttp__internal__n_invoke_store_http_major_1; - } - case '2': { - p++; - match = 2; - goto s_n_llhttp__internal__n_invoke_store_http_major_1; - } - case '3': { - p++; - match = 3; - goto s_n_llhttp__internal__n_invoke_store_http_major_1; - } - case '4': { - p++; - match = 4; - goto s_n_llhttp__internal__n_invoke_store_http_major_1; - } - case '5': { - p++; - match = 5; - goto s_n_llhttp__internal__n_invoke_store_http_major_1; - } - case '6': { - p++; - match = 6; - goto s_n_llhttp__internal__n_invoke_store_http_major_1; - } - case '7': { - p++; - match = 7; - goto s_n_llhttp__internal__n_invoke_store_http_major_1; - } - case '8': { - p++; - match = 8; - goto s_n_llhttp__internal__n_invoke_store_http_major_1; - } - case '9': { - p++; - match = 9; - goto s_n_llhttp__internal__n_invoke_store_http_major_1; - } - default: { - goto s_n_llhttp__internal__n_span_end_llhttp__on_version_9; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_span_start_llhttp__on_version_1: - s_n_llhttp__internal__n_span_start_llhttp__on_version_1: { - if (p == endp) { - return s_n_llhttp__internal__n_span_start_llhttp__on_version_1; - } - state->_span_pos0 = (void*) p; - state->_span_cb0 = llhttp__on_version; - goto s_n_llhttp__internal__n_res_http_major; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_start_res: - s_n_llhttp__internal__n_start_res: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_start_res; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob59, 5); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - goto s_n_llhttp__internal__n_span_start_llhttp__on_version_1; - } - case kMatchPause: { - return s_n_llhttp__internal__n_start_res; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_78; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_invoke_llhttp__on_method_complete: - s_n_llhttp__internal__n_invoke_llhttp__on_method_complete: { - switch (llhttp__on_method_complete(state, p, endp)) { - case 0: - goto s_n_llhttp__internal__n_req_first_space_before_url; - case 21: - goto s_n_llhttp__internal__n_pause_19; - default: - goto s_n_llhttp__internal__n_error_1; - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_req_or_res_method_2: - s_n_llhttp__internal__n_req_or_res_method_2: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_req_or_res_method_2; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob60, 2); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - match = 2; - goto s_n_llhttp__internal__n_invoke_store_method; - } - case kMatchPause: { - return s_n_llhttp__internal__n_req_or_res_method_2; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_75; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_invoke_update_type_1: - s_n_llhttp__internal__n_invoke_update_type_1: { - switch (llhttp__internal__c_update_type_1(state, p, endp)) { - default: - goto s_n_llhttp__internal__n_span_start_llhttp__on_version_1; - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_req_or_res_method_3: - s_n_llhttp__internal__n_req_or_res_method_3: { - llparse_match_t match_seq; - - if (p == endp) { - return s_n_llhttp__internal__n_req_or_res_method_3; - } - match_seq = llparse__match_sequence_id(state, p, endp, llparse_blob61, 3); - p = match_seq.current; - switch (match_seq.status) { - case kMatchComplete: { - p++; - goto s_n_llhttp__internal__n_span_end_llhttp__on_method_1; - } - case kMatchPause: { - return s_n_llhttp__internal__n_req_or_res_method_3; - } - case kMatchMismatch: { - goto s_n_llhttp__internal__n_error_75; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_req_or_res_method_1: - s_n_llhttp__internal__n_req_or_res_method_1: { - if (p == endp) { - return s_n_llhttp__internal__n_req_or_res_method_1; - } - switch (*p) { - case 'E': { - p++; - goto s_n_llhttp__internal__n_req_or_res_method_2; - } - case 'T': { - p++; - goto s_n_llhttp__internal__n_req_or_res_method_3; - } - default: { - goto s_n_llhttp__internal__n_error_75; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_req_or_res_method: - s_n_llhttp__internal__n_req_or_res_method: { - if (p == endp) { - return s_n_llhttp__internal__n_req_or_res_method; - } - switch (*p) { - case 'H': { - p++; - goto s_n_llhttp__internal__n_req_or_res_method_1; - } - default: { - goto s_n_llhttp__internal__n_error_75; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_span_start_llhttp__on_method: - s_n_llhttp__internal__n_span_start_llhttp__on_method: { - if (p == endp) { - return s_n_llhttp__internal__n_span_start_llhttp__on_method; - } - state->_span_pos0 = (void*) p; - state->_span_cb0 = llhttp__on_method; - goto s_n_llhttp__internal__n_req_or_res_method; - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_start_req_or_res: - s_n_llhttp__internal__n_start_req_or_res: { - if (p == endp) { - return s_n_llhttp__internal__n_start_req_or_res; - } - switch (*p) { - case 'H': { - goto s_n_llhttp__internal__n_span_start_llhttp__on_method; - } - default: { - goto s_n_llhttp__internal__n_invoke_update_type_2; - } - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_invoke_load_type: - s_n_llhttp__internal__n_invoke_load_type: { - switch (llhttp__internal__c_load_type(state, p, endp)) { - case 1: - goto s_n_llhttp__internal__n_span_start_llhttp__on_method_1; - case 2: - goto s_n_llhttp__internal__n_start_res; - default: - goto s_n_llhttp__internal__n_start_req_or_res; - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_invoke_update_finish: - s_n_llhttp__internal__n_invoke_update_finish: { - switch (llhttp__internal__c_update_finish(state, p, endp)) { - default: - goto s_n_llhttp__internal__n_invoke_llhttp__on_message_begin; - } - /* UNREACHABLE */; - abort(); - } - case s_n_llhttp__internal__n_start: - s_n_llhttp__internal__n_start: { - if (p == endp) { - return s_n_llhttp__internal__n_start; - } - switch (*p) { - case 10: { - p++; - goto s_n_llhttp__internal__n_start; - } - case 13: { - p++; - goto s_n_llhttp__internal__n_start; - } - default: { - goto s_n_llhttp__internal__n_invoke_load_initial_message_completed; - } - } - /* UNREACHABLE */; - abort(); - } - default: - /* UNREACHABLE */ - abort(); - } - s_n_llhttp__internal__n_error_61: { - state->error = 0x7; - state->reason = "Invalid characters in url"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_update_finish_2: { - switch (llhttp__internal__c_update_finish_1(state, p, endp)) { - default: - goto s_n_llhttp__internal__n_start; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_update_initial_message_completed: { - switch (llhttp__internal__c_update_initial_message_completed(state, p, endp)) { - default: - goto s_n_llhttp__internal__n_invoke_update_finish_2; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_update_content_length: { - switch (llhttp__internal__c_update_content_length(state, p, endp)) { - default: - goto s_n_llhttp__internal__n_invoke_update_initial_message_completed; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_test_lenient_flags_1: { - switch (llhttp__internal__c_test_lenient_flags_1(state, p, endp)) { - case 1: - goto s_n_llhttp__internal__n_invoke_update_initial_message_completed; - default: - goto s_n_llhttp__internal__n_closed; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_update_finish_1: { - switch (llhttp__internal__c_update_finish_1(state, p, endp)) { - default: - goto s_n_llhttp__internal__n_invoke_test_lenient_flags_1; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_pause_11: { - state->error = 0x15; - state->reason = "on_message_complete pause"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_is_equal_upgrade; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_24: { - state->error = 0x12; - state->reason = "`on_message_complete` callback error"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_pause_13: { - state->error = 0x15; - state->reason = "on_chunk_complete pause"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_2; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_27: { - state->error = 0x14; - state->reason = "`on_chunk_complete` callback error"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_llhttp__on_chunk_complete_1: { - switch (llhttp__on_chunk_complete(state, p, endp)) { - case 0: - goto s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_2; - case 21: - goto s_n_llhttp__internal__n_pause_13; - default: - goto s_n_llhttp__internal__n_error_27; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_26: { - state->error = 0x4; - state->reason = "Content-Length can't be present with Transfer-Encoding"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_pause_2: { - state->error = 0x15; - state->reason = "on_message_complete pause"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_pause_1; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_6: { - state->error = 0x12; - state->reason = "`on_message_complete` callback error"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_1: { - switch (llhttp__on_message_complete(state, p, endp)) { - case 0: - goto s_n_llhttp__internal__n_pause_1; - case 21: - goto s_n_llhttp__internal__n_pause_2; - default: - goto s_n_llhttp__internal__n_error_6; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_22: { - state->error = 0xc; - state->reason = "Chunk size overflow"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_pause_3: { - state->error = 0x15; - state->reason = "on_chunk_complete pause"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_update_content_length_1; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_8: { - state->error = 0x14; - state->reason = "`on_chunk_complete` callback error"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_llhttp__on_chunk_complete: { - switch (llhttp__on_chunk_complete(state, p, endp)) { - case 0: - goto s_n_llhttp__internal__n_invoke_update_content_length_1; - case 21: - goto s_n_llhttp__internal__n_pause_3; - default: - goto s_n_llhttp__internal__n_error_8; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_body: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_body(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_chunk_data_almost_done; - return s_error; - } - goto s_n_llhttp__internal__n_chunk_data_almost_done; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_or_flags: { - switch (llhttp__internal__c_or_flags(state, p, endp)) { - default: - goto s_n_llhttp__internal__n_header_field_start; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_pause_4: { - state->error = 0x15; - state->reason = "on_chunk_header pause"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_is_equal_content_length; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_7: { - state->error = 0x13; - state->reason = "`on_chunk_header` callback error"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_llhttp__on_chunk_header: { - switch (llhttp__on_chunk_header(state, p, endp)) { - case 0: - goto s_n_llhttp__internal__n_invoke_is_equal_content_length; - case 21: - goto s_n_llhttp__internal__n_pause_4; - default: - goto s_n_llhttp__internal__n_error_7; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_9: { - state->error = 0x2; - state->reason = "Invalid character in chunk extensions"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_10: { - state->error = 0x2; - state->reason = "Invalid character in chunk extensions"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_pause_5: { - state->error = 0x15; - state->reason = "on_chunk_extension_name pause"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_chunk_size_almost_done; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_11: { - state->error = 0x22; - state->reason = "`on_chunk_extension_name` callback error"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_name: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_chunk_extension_name(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) (p + 1); - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete; - return s_error; - } - p++; - goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_pause_6: { - state->error = 0x15; - state->reason = "on_chunk_extension_name pause"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_chunk_extensions; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_12: { - state->error = 0x22; - state->reason = "`on_chunk_extension_name` callback error"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_name_1: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_chunk_extension_name(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) (p + 1); - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete_1; - return s_error; - } - p++; - goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete_1; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_pause_7: { - state->error = 0x15; - state->reason = "on_chunk_extension_value pause"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_chunk_size_almost_done; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_14: { - state->error = 0x23; - state->reason = "`on_chunk_extension_value` callback error"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_chunk_extension_value(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) (p + 1); - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete; - return s_error; - } - p++; - goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_16: { - state->error = 0x2; - state->reason = "Invalid character in chunk extensions quote value"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_pause_8: { - state->error = 0x15; - state->reason = "on_chunk_extension_value pause"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_chunk_extension_quoted_value_done; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_15: { - state->error = 0x23; - state->reason = "`on_chunk_extension_value` callback error"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_1: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_chunk_extension_value(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_1; - return s_error; - } - goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_1; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_2: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_chunk_extension_value(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) (p + 1); - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_17; - return s_error; - } - p++; - goto s_n_llhttp__internal__n_error_17; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_pause_9: { - state->error = 0x15; - state->reason = "on_chunk_extension_value pause"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_chunk_size_otherwise; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_18: { - state->error = 0x23; - state->reason = "`on_chunk_extension_value` callback error"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_3: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_chunk_extension_value(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) (p + 1); - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_2; - return s_error; - } - p++; - goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_value_complete_2; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_value_4: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_chunk_extension_value(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) (p + 1); - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_19; - return s_error; - } - p++; - goto s_n_llhttp__internal__n_error_19; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_pause_10: { - state->error = 0x15; - state->reason = "on_chunk_extension_name pause"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_chunk_extension_value; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_13: { - state->error = 0x22; - state->reason = "`on_chunk_extension_name` callback error"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_llhttp__on_chunk_extension_name_complete_2: { - switch (llhttp__on_chunk_extension_name_complete(state, p, endp)) { - case 0: - goto s_n_llhttp__internal__n_chunk_extension_value; - case 21: - goto s_n_llhttp__internal__n_pause_10; - default: - goto s_n_llhttp__internal__n_error_13; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_name_2: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_chunk_extension_name(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) (p + 1); - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_span_start_llhttp__on_chunk_extension_value; - return s_error; - } - p++; - goto s_n_llhttp__internal__n_span_start_llhttp__on_chunk_extension_value; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_chunk_extension_name_3: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_chunk_extension_name(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) (p + 1); - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_20; - return s_error; - } - p++; - goto s_n_llhttp__internal__n_error_20; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_21: { - state->error = 0xc; - state->reason = "Invalid character in chunk size"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_mul_add_content_length: { - switch (llhttp__internal__c_mul_add_content_length(state, p, endp, match)) { - case 1: - goto s_n_llhttp__internal__n_error_22; - default: - goto s_n_llhttp__internal__n_chunk_size; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_23: { - state->error = 0xc; - state->reason = "Invalid character in chunk size"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_span_end_llhttp__on_body_1: { - const unsigned char* start; - int err; - - start = state->_span_pos0; - state->_span_pos0 = NULL; - err = llhttp__on_body(state, start, p); - if (err != 0) { - state->error = err; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_2; - return s_error; - } - goto s_n_llhttp__internal__n_invoke_llhttp__on_message_complete_2; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_update_finish_3: { - switch (llhttp__internal__c_update_finish_3(state, p, endp)) { - default: - goto s_n_llhttp__internal__n_span_start_llhttp__on_body_2; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_25: { - state->error = 0xf; - state->reason = "Request has invalid `Transfer-Encoding`"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_pause: { - state->error = 0x15; - state->reason = "on_message_complete pause"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__after_message_complete; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_5: { - state->error = 0x12; - state->reason = "`on_message_complete` callback error"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_error; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_llhttp__on_message_complete: { - switch (llhttp__on_message_complete(state, p, endp)) { - case 0: - goto s_n_llhttp__internal__n_invoke_llhttp__after_message_complete; - case 21: - goto s_n_llhttp__internal__n_pause; - default: - goto s_n_llhttp__internal__n_error_5; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_or_flags_1: { - switch (llhttp__internal__c_or_flags_1(state, p, endp)) { - default: - goto s_n_llhttp__internal__n_invoke_llhttp__after_headers_complete; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_or_flags_2: { - switch (llhttp__internal__c_or_flags_1(state, p, endp)) { - default: - goto s_n_llhttp__internal__n_invoke_llhttp__after_headers_complete; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_invoke_update_upgrade: { - switch (llhttp__internal__c_update_upgrade(state, p, endp)) { - default: - goto s_n_llhttp__internal__n_invoke_or_flags_2; - } - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_pause_12: { - state->error = 0x15; - state->reason = "Paused by on_headers_complete"; - state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__after_headers_complete; - return s_error; - /* UNREACHABLE */; - abort(); - } - s_n_llhttp__internal__n_error_4: { + s_n_llhttp__internal__n_error_41: { state->error = 0x11; state->reason = "User callback error"; state->error_pos = (const char*) p; @@ -16112,60 +7737,68 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_invoke_llhttp__on_headers_complete: { + s_n_llhttp__internal__n_invoke_llhttp__on_headers_complete_1: { switch (llhttp__on_headers_complete(state, p, endp)) { case 0: goto s_n_llhttp__internal__n_invoke_llhttp__after_headers_complete; case 1: - goto s_n_llhttp__internal__n_invoke_or_flags_1; + goto s_n_llhttp__internal__n_invoke_or_flags_3; case 2: - goto s_n_llhttp__internal__n_invoke_update_upgrade; + goto s_n_llhttp__internal__n_invoke_update_upgrade_1; case 21: - goto s_n_llhttp__internal__n_pause_12; + goto s_n_llhttp__internal__n_pause_16; default: - goto s_n_llhttp__internal__n_error_4; + goto s_n_llhttp__internal__n_error_41; } /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_invoke_llhttp__before_headers_complete: { + s_n_llhttp__internal__n_invoke_llhttp__before_headers_complete_1: { switch (llhttp__before_headers_complete(state, p, endp)) { default: - goto s_n_llhttp__internal__n_invoke_llhttp__on_headers_complete; + goto s_n_llhttp__internal__n_invoke_llhttp__on_headers_complete_1; } /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_invoke_test_lenient_flags_2: { - switch (llhttp__internal__c_test_lenient_flags_2(state, p, endp)) { - case 0: - goto s_n_llhttp__internal__n_error_26; + s_n_llhttp__internal__n_invoke_test_flags_1: { + switch (llhttp__internal__c_test_flags(state, p, endp)) { + case 1: + goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_complete_2; default: - goto s_n_llhttp__internal__n_invoke_llhttp__before_headers_complete; + goto s_n_llhttp__internal__n_invoke_llhttp__before_headers_complete_1; } /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_invoke_test_flags_1: { - switch (llhttp__internal__c_test_flags_1(state, p, endp)) { - case 1: - goto s_n_llhttp__internal__n_invoke_test_lenient_flags_2; - default: - goto s_n_llhttp__internal__n_invoke_llhttp__before_headers_complete; - } + s_n_llhttp__internal__n_error_43: { + state->error = 0x2; + state->reason = "Expected LF after headers"; + state->error_pos = (const char*) p; + state->_current = (void*) (intptr_t) s_error; + return s_error; /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_invoke_test_flags: { - switch (llhttp__internal__c_test_flags(state, p, endp)) { + s_n_llhttp__internal__n_invoke_test_lenient_flags_12: { + switch (llhttp__internal__c_test_lenient_flags_8(state, p, endp)) { case 1: - goto s_n_llhttp__internal__n_invoke_llhttp__on_chunk_complete_1; - default: goto s_n_llhttp__internal__n_invoke_test_flags_1; + default: + goto s_n_llhttp__internal__n_error_43; } /* UNREACHABLE */; abort(); } + s_n_llhttp__internal__n_error_44: { + state->error = 0xa; + state->reason = "Invalid header token"; + state->error_pos = (const char*) p; + state->_current = (void*) (intptr_t) s_error; + return s_error; + /* UNREACHABLE */; + abort(); + } s_n_llhttp__internal__n_span_end_llhttp__on_header_field: { const unsigned char* start; int err; @@ -16176,15 +7809,15 @@ static llparse_state_t llhttp__internal__run( if (err != 0) { state->error = err; state->error_pos = (const char*) (p + 1); - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_28; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_5; return s_error; } p++; - goto s_n_llhttp__internal__n_error_28; + goto s_n_llhttp__internal__n_error_5; /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_invoke_test_lenient_flags_3: { + s_n_llhttp__internal__n_invoke_test_lenient_flags_13: { switch (llhttp__internal__c_test_lenient_flags(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_header_field_colon_discard_ws; @@ -16194,7 +7827,35 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_32: { + s_n_llhttp__internal__n_error_59: { + state->error = 0xb; + state->reason = "Content-Length can't be present with Transfer-Encoding"; + state->error_pos = (const char*) p; + state->_current = (void*) (intptr_t) s_error; + return s_error; + /* UNREACHABLE */; + abort(); + } + s_n_llhttp__internal__n_error_47: { + state->error = 0xa; + state->reason = "Invalid header value char"; + state->error_pos = (const char*) p; + state->_current = (void*) (intptr_t) s_error; + return s_error; + /* UNREACHABLE */; + abort(); + } + s_n_llhttp__internal__n_invoke_test_lenient_flags_15: { + switch (llhttp__internal__c_test_lenient_flags(state, p, endp)) { + case 1: + goto s_n_llhttp__internal__n_header_value_discard_ws; + default: + goto s_n_llhttp__internal__n_error_47; + } + /* UNREACHABLE */; + abort(); + } + s_n_llhttp__internal__n_error_49: { state->error = 0xb; state->reason = "Empty Content-Length"; state->error_pos = (const char*) p; @@ -16203,7 +7864,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_pause_14: { + s_n_llhttp__internal__n_pause_18: { state->error = 0x15; state->reason = "on_header_value_complete pause"; state->error_pos = (const char*) p; @@ -16212,7 +7873,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_31: { + s_n_llhttp__internal__n_error_48: { state->error = 0x1d; state->reason = "`on_header_value_complete` callback error"; state->error_pos = (const char*) p; @@ -16246,65 +7907,65 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_invoke_or_flags_3: { - switch (llhttp__internal__c_or_flags_3(state, p, endp)) { + s_n_llhttp__internal__n_invoke_or_flags_5: { + switch (llhttp__internal__c_or_flags_5(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state; } /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_invoke_or_flags_4: { - switch (llhttp__internal__c_or_flags_4(state, p, endp)) { + s_n_llhttp__internal__n_invoke_or_flags_6: { + switch (llhttp__internal__c_or_flags_6(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state; } /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_invoke_or_flags_5: { - switch (llhttp__internal__c_or_flags_5(state, p, endp)) { + s_n_llhttp__internal__n_invoke_or_flags_7: { + switch (llhttp__internal__c_or_flags_7(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state; } /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_invoke_or_flags_6: { - switch (llhttp__internal__c_or_flags_6(state, p, endp)) { + s_n_llhttp__internal__n_invoke_or_flags_8: { + switch (llhttp__internal__c_or_flags_8(state, p, endp)) { default: goto s_n_llhttp__internal__n_span_start_llhttp__on_header_value; } /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_invoke_load_header_state_1: { + s_n_llhttp__internal__n_invoke_load_header_state_2: { switch (llhttp__internal__c_load_header_state(state, p, endp)) { case 5: - goto s_n_llhttp__internal__n_invoke_or_flags_3; + goto s_n_llhttp__internal__n_invoke_or_flags_5; case 6: - goto s_n_llhttp__internal__n_invoke_or_flags_4; + goto s_n_llhttp__internal__n_invoke_or_flags_6; case 7: - goto s_n_llhttp__internal__n_invoke_or_flags_5; + goto s_n_llhttp__internal__n_invoke_or_flags_7; case 8: - goto s_n_llhttp__internal__n_invoke_or_flags_6; + goto s_n_llhttp__internal__n_invoke_or_flags_8; default: goto s_n_llhttp__internal__n_span_start_llhttp__on_header_value; } /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_invoke_load_header_state: { + s_n_llhttp__internal__n_invoke_load_header_state_1: { switch (llhttp__internal__c_load_header_state(state, p, endp)) { case 2: - goto s_n_llhttp__internal__n_error_32; + goto s_n_llhttp__internal__n_error_49; default: - goto s_n_llhttp__internal__n_invoke_load_header_state_1; + goto s_n_llhttp__internal__n_invoke_load_header_state_2; } /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_30: { + s_n_llhttp__internal__n_error_46: { state->error = 0xa; state->reason = "Invalid header value char"; state->error_pos = (const char*) p; @@ -16313,12 +7974,31 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_invoke_test_lenient_flags_4: { + s_n_llhttp__internal__n_invoke_test_lenient_flags_14: { + switch (llhttp__internal__c_test_lenient_flags_1(state, p, endp)) { + case 1: + goto s_n_llhttp__internal__n_header_value_discard_lws; + default: + goto s_n_llhttp__internal__n_error_46; + } + /* UNREACHABLE */; + abort(); + } + s_n_llhttp__internal__n_error_50: { + state->error = 0x2; + state->reason = "Expected LF after CR"; + state->error_pos = (const char*) p; + state->_current = (void*) (intptr_t) s_error; + return s_error; + /* UNREACHABLE */; + abort(); + } + s_n_llhttp__internal__n_invoke_test_lenient_flags_16: { switch (llhttp__internal__c_test_lenient_flags(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_header_value_discard_lws; default: - goto s_n_llhttp__internal__n_error_30; + goto s_n_llhttp__internal__n_error_50; } /* UNREACHABLE */; abort(); @@ -16331,7 +8011,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_invoke_load_header_state_3: { + s_n_llhttp__internal__n_invoke_load_header_state_4: { switch (llhttp__internal__c_load_header_state(state, p, endp)) { case 8: goto s_n_llhttp__internal__n_invoke_update_header_state_1; @@ -16349,55 +8029,55 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_invoke_or_flags_7: { - switch (llhttp__internal__c_or_flags_3(state, p, endp)) { + s_n_llhttp__internal__n_invoke_or_flags_9: { + switch (llhttp__internal__c_or_flags_5(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state_2; } /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_invoke_or_flags_8: { - switch (llhttp__internal__c_or_flags_4(state, p, endp)) { + s_n_llhttp__internal__n_invoke_or_flags_10: { + switch (llhttp__internal__c_or_flags_6(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state_2; } /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_invoke_or_flags_9: { - switch (llhttp__internal__c_or_flags_5(state, p, endp)) { + s_n_llhttp__internal__n_invoke_or_flags_11: { + switch (llhttp__internal__c_or_flags_7(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state_2; } /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_invoke_or_flags_10: { - switch (llhttp__internal__c_or_flags_6(state, p, endp)) { + s_n_llhttp__internal__n_invoke_or_flags_12: { + switch (llhttp__internal__c_or_flags_8(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_llhttp__on_header_value_complete; } /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_invoke_load_header_state_4: { + s_n_llhttp__internal__n_invoke_load_header_state_5: { switch (llhttp__internal__c_load_header_state(state, p, endp)) { case 5: - goto s_n_llhttp__internal__n_invoke_or_flags_7; + goto s_n_llhttp__internal__n_invoke_or_flags_9; case 6: - goto s_n_llhttp__internal__n_invoke_or_flags_8; + goto s_n_llhttp__internal__n_invoke_or_flags_10; case 7: - goto s_n_llhttp__internal__n_invoke_or_flags_9; + goto s_n_llhttp__internal__n_invoke_or_flags_11; case 8: - goto s_n_llhttp__internal__n_invoke_or_flags_10; + goto s_n_llhttp__internal__n_invoke_or_flags_12; default: goto s_n_llhttp__internal__n_invoke_llhttp__on_header_value_complete; } /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_33: { + s_n_llhttp__internal__n_error_52: { state->error = 0x3; state->reason = "Missing expected LF after header value"; state->error_pos = (const char*) p; @@ -16406,10 +8086,36 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } + s_n_llhttp__internal__n_error_51: { + state->error = 0x19; + state->reason = "Missing expected CR after header value"; + state->error_pos = (const char*) p; + state->_current = (void*) (intptr_t) s_error; + return s_error; + /* UNREACHABLE */; + abort(); + } s_n_llhttp__internal__n_span_end_llhttp__on_header_value_1: { const unsigned char* start; int err; + start = state->_span_pos0; + state->_span_pos0 = NULL; + err = llhttp__on_header_value(state, start, p); + if (err != 0) { + state->error = err; + state->error_pos = (const char*) p; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_test_lenient_flags_17; + return s_error; + } + goto s_n_llhttp__internal__n_invoke_test_lenient_flags_17; + /* UNREACHABLE */; + abort(); + } + s_n_llhttp__internal__n_span_end_llhttp__on_header_value_2: { + const unsigned char* start; + int err; + start = state->_span_pos0; state->_span_pos0 = NULL; err = llhttp__on_header_value(state, start, p); @@ -16424,7 +8130,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_span_end_llhttp__on_header_value_3: { + s_n_llhttp__internal__n_span_end_llhttp__on_header_value_4: { const unsigned char* start; int err; @@ -16441,7 +8147,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_span_end_llhttp__on_header_value_4: { + s_n_llhttp__internal__n_span_end_llhttp__on_header_value_5: { const unsigned char* start; int err; @@ -16459,7 +8165,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_span_end_llhttp__on_header_value_2: { + s_n_llhttp__internal__n_span_end_llhttp__on_header_value_3: { const unsigned char* start; int err; @@ -16469,19 +8175,19 @@ static llparse_state_t llhttp__internal__run( if (err != 0) { state->error = err; state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_34; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_53; return s_error; } - goto s_n_llhttp__internal__n_error_34; + goto s_n_llhttp__internal__n_error_53; /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_invoke_test_lenient_flags_5: { + s_n_llhttp__internal__n_invoke_test_lenient_flags_18: { switch (llhttp__internal__c_test_lenient_flags(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_header_value_lenient; default: - goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_2; + goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_3; } /* UNREACHABLE */; abort(); @@ -16494,48 +8200,48 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_invoke_or_flags_11: { - switch (llhttp__internal__c_or_flags_3(state, p, endp)) { + s_n_llhttp__internal__n_invoke_or_flags_13: { + switch (llhttp__internal__c_or_flags_5(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state_4; } /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_invoke_or_flags_12: { - switch (llhttp__internal__c_or_flags_4(state, p, endp)) { + s_n_llhttp__internal__n_invoke_or_flags_14: { + switch (llhttp__internal__c_or_flags_6(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state_4; } /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_invoke_or_flags_13: { - switch (llhttp__internal__c_or_flags_5(state, p, endp)) { + s_n_llhttp__internal__n_invoke_or_flags_15: { + switch (llhttp__internal__c_or_flags_7(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_update_header_state_4; } /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_invoke_or_flags_14: { - switch (llhttp__internal__c_or_flags_6(state, p, endp)) { + s_n_llhttp__internal__n_invoke_or_flags_16: { + switch (llhttp__internal__c_or_flags_8(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_value_connection; } /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_invoke_load_header_state_5: { + s_n_llhttp__internal__n_invoke_load_header_state_6: { switch (llhttp__internal__c_load_header_state(state, p, endp)) { case 5: - goto s_n_llhttp__internal__n_invoke_or_flags_11; + goto s_n_llhttp__internal__n_invoke_or_flags_13; case 6: - goto s_n_llhttp__internal__n_invoke_or_flags_12; + goto s_n_llhttp__internal__n_invoke_or_flags_14; case 7: - goto s_n_llhttp__internal__n_invoke_or_flags_13; + goto s_n_llhttp__internal__n_invoke_or_flags_15; case 8: - goto s_n_llhttp__internal__n_invoke_or_flags_14; + goto s_n_llhttp__internal__n_invoke_or_flags_16; default: goto s_n_llhttp__internal__n_header_value_connection; } @@ -16574,7 +8280,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_span_end_llhttp__on_header_value_5: { + s_n_llhttp__internal__n_span_end_llhttp__on_header_value_6: { const unsigned char* start; int err; @@ -16584,32 +8290,32 @@ static llparse_state_t llhttp__internal__run( if (err != 0) { state->error = err; state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_36; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_55; return s_error; } - goto s_n_llhttp__internal__n_error_36; + goto s_n_llhttp__internal__n_error_55; /* UNREACHABLE */; abort(); } s_n_llhttp__internal__n_invoke_mul_add_content_length_1: { switch (llhttp__internal__c_mul_add_content_length_1(state, p, endp, match)) { case 1: - goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_5; + goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_6; default: goto s_n_llhttp__internal__n_header_value_content_length; } /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_invoke_or_flags_15: { - switch (llhttp__internal__c_or_flags_15(state, p, endp)) { + s_n_llhttp__internal__n_invoke_or_flags_17: { + switch (llhttp__internal__c_or_flags_17(state, p, endp)) { default: goto s_n_llhttp__internal__n_header_value_otherwise; } /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_span_end_llhttp__on_header_value_6: { + s_n_llhttp__internal__n_span_end_llhttp__on_header_value_7: { const unsigned char* start; int err; @@ -16619,14 +8325,14 @@ static llparse_state_t llhttp__internal__run( if (err != 0) { state->error = err; state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_37; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_56; return s_error; } - goto s_n_llhttp__internal__n_error_37; + goto s_n_llhttp__internal__n_error_56; /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_35: { + s_n_llhttp__internal__n_error_54: { state->error = 0x4; state->reason = "Duplicate Content-Length"; state->error_pos = (const char*) p; @@ -16640,12 +8346,12 @@ static llparse_state_t llhttp__internal__run( case 0: goto s_n_llhttp__internal__n_header_value_content_length; default: - goto s_n_llhttp__internal__n_error_35; + goto s_n_llhttp__internal__n_error_54; } /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_span_end_llhttp__on_header_value_8: { + s_n_llhttp__internal__n_span_end_llhttp__on_header_value_9: { const unsigned char* start; int err; @@ -16655,11 +8361,11 @@ static llparse_state_t llhttp__internal__run( if (err != 0) { state->error = err; state->error_pos = (const char*) (p + 1); - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_39; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_58; return s_error; } p++; - goto s_n_llhttp__internal__n_error_39; + goto s_n_llhttp__internal__n_error_58; /* UNREACHABLE */; abort(); } @@ -16671,7 +8377,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_span_end_llhttp__on_header_value_7: { + s_n_llhttp__internal__n_span_end_llhttp__on_header_value_8: { const unsigned char* start; int err; @@ -16681,18 +8387,18 @@ static llparse_state_t llhttp__internal__run( if (err != 0) { state->error = err; state->error_pos = (const char*) (p + 1); - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_38; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_57; return s_error; } p++; - goto s_n_llhttp__internal__n_error_38; + goto s_n_llhttp__internal__n_error_57; /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_invoke_test_lenient_flags_6: { - switch (llhttp__internal__c_test_lenient_flags_6(state, p, endp)) { + s_n_llhttp__internal__n_invoke_test_lenient_flags_19: { + switch (llhttp__internal__c_test_lenient_flags_19(state, p, endp)) { case 0: - goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_7; + goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_8; default: goto s_n_llhttp__internal__n_header_value_te_chunked; } @@ -16702,7 +8408,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_invoke_load_type_1: { switch (llhttp__internal__c_load_type(state, p, endp)) { case 1: - goto s_n_llhttp__internal__n_invoke_test_lenient_flags_6; + goto s_n_llhttp__internal__n_invoke_test_lenient_flags_19; default: goto s_n_llhttp__internal__n_header_value_te_chunked; } @@ -16725,20 +8431,20 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_invoke_or_flags_17: { - switch (llhttp__internal__c_or_flags_16(state, p, endp)) { + s_n_llhttp__internal__n_invoke_or_flags_19: { + switch (llhttp__internal__c_or_flags_18(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_and_flags; } /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_invoke_test_lenient_flags_7: { - switch (llhttp__internal__c_test_lenient_flags_6(state, p, endp)) { + s_n_llhttp__internal__n_invoke_test_lenient_flags_20: { + switch (llhttp__internal__c_test_lenient_flags_19(state, p, endp)) { case 0: - goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_8; + goto s_n_llhttp__internal__n_span_end_llhttp__on_header_value_9; default: - goto s_n_llhttp__internal__n_invoke_or_flags_17; + goto s_n_llhttp__internal__n_invoke_or_flags_19; } /* UNREACHABLE */; abort(); @@ -16746,15 +8452,15 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_invoke_load_type_2: { switch (llhttp__internal__c_load_type(state, p, endp)) { case 1: - goto s_n_llhttp__internal__n_invoke_test_lenient_flags_7; + goto s_n_llhttp__internal__n_invoke_test_lenient_flags_20; default: - goto s_n_llhttp__internal__n_invoke_or_flags_17; + goto s_n_llhttp__internal__n_invoke_or_flags_19; } /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_invoke_or_flags_16: { - switch (llhttp__internal__c_or_flags_16(state, p, endp)) { + s_n_llhttp__internal__n_invoke_or_flags_18: { + switch (llhttp__internal__c_or_flags_18(state, p, endp)) { default: goto s_n_llhttp__internal__n_invoke_and_flags; } @@ -16764,47 +8470,96 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_invoke_test_flags_3: { switch (llhttp__internal__c_test_flags_3(state, p, endp)) { case 1: - goto s_n_llhttp__internal__n_invoke_load_type_2; + goto s_n_llhttp__internal__n_invoke_load_type_2; + default: + goto s_n_llhttp__internal__n_invoke_or_flags_18; + } + /* UNREACHABLE */; + abort(); + } + s_n_llhttp__internal__n_invoke_or_flags_20: { + switch (llhttp__internal__c_or_flags_20(state, p, endp)) { + default: + goto s_n_llhttp__internal__n_invoke_update_header_state_9; + } + /* UNREACHABLE */; + abort(); + } + s_n_llhttp__internal__n_invoke_load_header_state_3: { + switch (llhttp__internal__c_load_header_state(state, p, endp)) { + case 1: + goto s_n_llhttp__internal__n_header_value_connection; + case 2: + goto s_n_llhttp__internal__n_invoke_test_flags_2; + case 3: + goto s_n_llhttp__internal__n_invoke_test_flags_3; + case 4: + goto s_n_llhttp__internal__n_invoke_or_flags_20; + default: + goto s_n_llhttp__internal__n_header_value; + } + /* UNREACHABLE */; + abort(); + } + s_n_llhttp__internal__n_invoke_test_lenient_flags_21: { + switch (llhttp__internal__c_test_lenient_flags_21(state, p, endp)) { + case 0: + goto s_n_llhttp__internal__n_error_59; + default: + goto s_n_llhttp__internal__n_header_value_discard_ws; + } + /* UNREACHABLE */; + abort(); + } + s_n_llhttp__internal__n_invoke_test_flags_4: { + switch (llhttp__internal__c_test_flags_4(state, p, endp)) { + case 1: + goto s_n_llhttp__internal__n_invoke_test_lenient_flags_21; default: - goto s_n_llhttp__internal__n_invoke_or_flags_16; + goto s_n_llhttp__internal__n_header_value_discard_ws; } /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_invoke_or_flags_18: { - switch (llhttp__internal__c_or_flags_18(state, p, endp)) { + s_n_llhttp__internal__n_error_60: { + state->error = 0xf; + state->reason = "Transfer-Encoding can't be present with Content-Length"; + state->error_pos = (const char*) p; + state->_current = (void*) (intptr_t) s_error; + return s_error; + /* UNREACHABLE */; + abort(); + } + s_n_llhttp__internal__n_invoke_test_lenient_flags_22: { + switch (llhttp__internal__c_test_lenient_flags_21(state, p, endp)) { + case 0: + goto s_n_llhttp__internal__n_error_60; default: - goto s_n_llhttp__internal__n_invoke_update_header_state_9; + goto s_n_llhttp__internal__n_header_value_discard_ws; } /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_invoke_load_header_state_2: { - switch (llhttp__internal__c_load_header_state(state, p, endp)) { + s_n_llhttp__internal__n_invoke_test_flags_5: { + switch (llhttp__internal__c_test_flags_2(state, p, endp)) { case 1: - goto s_n_llhttp__internal__n_header_value_connection; - case 2: - goto s_n_llhttp__internal__n_invoke_test_flags_2; - case 3: - goto s_n_llhttp__internal__n_invoke_test_flags_3; - case 4: - goto s_n_llhttp__internal__n_invoke_or_flags_18; + goto s_n_llhttp__internal__n_invoke_test_lenient_flags_22; default: - goto s_n_llhttp__internal__n_header_value; + goto s_n_llhttp__internal__n_header_value_discard_ws; } /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_pause_15: { + s_n_llhttp__internal__n_pause_19: { state->error = 0x15; state->reason = "on_header_field_complete pause"; state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_header_value_discard_ws; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_load_header_state; return s_error; /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_29: { + s_n_llhttp__internal__n_error_45: { state->error = 0x1c; state->reason = "`on_header_field_complete` callback error"; state->error_pos = (const char*) p; @@ -16849,7 +8604,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_40: { + s_n_llhttp__internal__n_error_61: { state->error = 0xa; state->reason = "Invalid header token"; state->error_pos = (const char*) p; @@ -16882,7 +8637,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_3: { + s_n_llhttp__internal__n_error_4: { state->error = 0x1e; state->reason = "Unexpected space after start line"; state->error_pos = (const char*) p; @@ -16896,12 +8651,12 @@ static llparse_state_t llhttp__internal__run( case 1: goto s_n_llhttp__internal__n_header_field_start; default: - goto s_n_llhttp__internal__n_error_3; + goto s_n_llhttp__internal__n_error_4; } /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_pause_16: { + s_n_llhttp__internal__n_pause_20: { state->error = 0x15; state->reason = "on_url_complete pause"; state->error_pos = (const char*) p; @@ -16910,7 +8665,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_2: { + s_n_llhttp__internal__n_error_3: { state->error = 0x1a; state->reason = "`on_url_complete` callback error"; state->error_pos = (const char*) p; @@ -16924,9 +8679,9 @@ static llparse_state_t llhttp__internal__run( case 0: goto s_n_llhttp__internal__n_headers_start; case 21: - goto s_n_llhttp__internal__n_pause_16; + goto s_n_llhttp__internal__n_pause_20; default: - goto s_n_llhttp__internal__n_error_2; + goto s_n_llhttp__internal__n_error_3; } /* UNREACHABLE */; abort(); @@ -16964,7 +8719,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_41: { + s_n_llhttp__internal__n_error_62: { state->error = 0x7; state->reason = "Expected CRLF"; state->error_pos = (const char*) p; @@ -16990,7 +8745,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_47: { + s_n_llhttp__internal__n_error_70: { state->error = 0x17; state->reason = "Pause on PRI/Upgrade"; state->error_pos = (const char*) p; @@ -16999,7 +8754,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_48: { + s_n_llhttp__internal__n_error_71: { state->error = 0x9; state->reason = "Expected HTTP/2 Connection Preface"; state->error_pos = (const char*) p; @@ -17008,7 +8763,26 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_46: { + s_n_llhttp__internal__n_error_68: { + state->error = 0x2; + state->reason = "Expected CRLF after version"; + state->error_pos = (const char*) p; + state->_current = (void*) (intptr_t) s_error; + return s_error; + /* UNREACHABLE */; + abort(); + } + s_n_llhttp__internal__n_invoke_test_lenient_flags_25: { + switch (llhttp__internal__c_test_lenient_flags_8(state, p, endp)) { + case 1: + goto s_n_llhttp__internal__n_headers_start; + default: + goto s_n_llhttp__internal__n_error_68; + } + /* UNREACHABLE */; + abort(); + } + s_n_llhttp__internal__n_error_67: { state->error = 0x9; state->reason = "Expected CRLF after version"; state->error_pos = (const char*) p; @@ -17017,7 +8791,26 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_pause_17: { + s_n_llhttp__internal__n_invoke_test_lenient_flags_24: { + switch (llhttp__internal__c_test_lenient_flags_1(state, p, endp)) { + case 1: + goto s_n_llhttp__internal__n_req_http_complete_crlf; + default: + goto s_n_llhttp__internal__n_error_67; + } + /* UNREACHABLE */; + abort(); + } + s_n_llhttp__internal__n_error_69: { + state->error = 0x9; + state->reason = "Expected CRLF after version"; + state->error_pos = (const char*) p; + state->_current = (void*) (intptr_t) s_error; + return s_error; + /* UNREACHABLE */; + abort(); + } + s_n_llhttp__internal__n_pause_21: { state->error = 0x15; state->reason = "on_version_complete pause"; state->error_pos = (const char*) p; @@ -17026,7 +8819,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_45: { + s_n_llhttp__internal__n_error_66: { state->error = 0x21; state->reason = "`on_version_complete` callback error"; state->error_pos = (const char*) p; @@ -17062,10 +8855,10 @@ static llparse_state_t llhttp__internal__run( if (err != 0) { state->error = err; state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_44; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_65; return s_error; } - goto s_n_llhttp__internal__n_error_44; + goto s_n_llhttp__internal__n_error_65; /* UNREACHABLE */; abort(); } @@ -17115,8 +8908,8 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_invoke_test_lenient_flags_8: { - switch (llhttp__internal__c_test_lenient_flags_8(state, p, endp)) { + s_n_llhttp__internal__n_invoke_test_lenient_flags_23: { + switch (llhttp__internal__c_test_lenient_flags_23(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_span_end_llhttp__on_version_1; default: @@ -17128,7 +8921,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_invoke_store_http_minor: { switch (llhttp__internal__c_store_http_minor(state, p, endp, match)) { default: - goto s_n_llhttp__internal__n_invoke_test_lenient_flags_8; + goto s_n_llhttp__internal__n_invoke_test_lenient_flags_23; } /* UNREACHABLE */; abort(); @@ -17143,10 +8936,10 @@ static llparse_state_t llhttp__internal__run( if (err != 0) { state->error = err; state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_49; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_72; return s_error; } - goto s_n_llhttp__internal__n_error_49; + goto s_n_llhttp__internal__n_error_72; /* UNREACHABLE */; abort(); } @@ -17160,10 +8953,10 @@ static llparse_state_t llhttp__internal__run( if (err != 0) { state->error = err; state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_50; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_73; return s_error; } - goto s_n_llhttp__internal__n_error_50; + goto s_n_llhttp__internal__n_error_73; /* UNREACHABLE */; abort(); } @@ -17185,14 +8978,14 @@ static llparse_state_t llhttp__internal__run( if (err != 0) { state->error = err; state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_51; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_74; return s_error; } - goto s_n_llhttp__internal__n_error_51; + goto s_n_llhttp__internal__n_error_74; /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_43: { + s_n_llhttp__internal__n_error_64: { state->error = 0x8; state->reason = "Invalid method for HTTP/x.x request"; state->error_pos = (const char*) p; @@ -17273,13 +9066,15 @@ static llparse_state_t llhttp__internal__run( goto s_n_llhttp__internal__n_span_start_llhttp__on_version; case 34: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; + case 46: + goto s_n_llhttp__internal__n_span_start_llhttp__on_version; default: - goto s_n_llhttp__internal__n_error_43; + goto s_n_llhttp__internal__n_error_64; } /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_54: { + s_n_llhttp__internal__n_error_77: { state->error = 0x8; state->reason = "Expected HTTP/"; state->error_pos = (const char*) p; @@ -17288,7 +9083,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_52: { + s_n_llhttp__internal__n_error_75: { state->error = 0x8; state->reason = "Expected SOURCE method for ICE/x.x request"; state->error_pos = (const char*) p; @@ -17302,12 +9097,12 @@ static llparse_state_t llhttp__internal__run( case 33: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; default: - goto s_n_llhttp__internal__n_error_52; + goto s_n_llhttp__internal__n_error_75; } /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_53: { + s_n_llhttp__internal__n_error_76: { state->error = 0x8; state->reason = "Invalid method for RTSP/x.x request"; state->error_pos = (const char*) p; @@ -17347,12 +9142,12 @@ static llparse_state_t llhttp__internal__run( case 45: goto s_n_llhttp__internal__n_span_start_llhttp__on_version; default: - goto s_n_llhttp__internal__n_error_53; + goto s_n_llhttp__internal__n_error_76; } /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_pause_18: { + s_n_llhttp__internal__n_pause_22: { state->error = 0x15; state->reason = "on_url_complete pause"; state->error_pos = (const char*) p; @@ -17361,7 +9156,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_42: { + s_n_llhttp__internal__n_error_63: { state->error = 0x1a; state->reason = "`on_url_complete` callback error"; state->error_pos = (const char*) p; @@ -17375,9 +9170,9 @@ static llparse_state_t llhttp__internal__run( case 0: goto s_n_llhttp__internal__n_req_http_start; case 21: - goto s_n_llhttp__internal__n_pause_18; + goto s_n_llhttp__internal__n_pause_22; default: - goto s_n_llhttp__internal__n_error_42; + goto s_n_llhttp__internal__n_error_63; } /* UNREACHABLE */; abort(); @@ -17450,7 +9245,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_55: { + s_n_llhttp__internal__n_error_78: { state->error = 0x7; state->reason = "Invalid char in url fragment start"; state->error_pos = (const char*) p; @@ -17510,7 +9305,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_56: { + s_n_llhttp__internal__n_error_79: { state->error = 0x7; state->reason = "Invalid char in url query"; state->error_pos = (const char*) p; @@ -17519,7 +9314,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_57: { + s_n_llhttp__internal__n_error_80: { state->error = 0x7; state->reason = "Invalid char in url path"; state->error_pos = (const char*) p; @@ -17630,7 +9425,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_58: { + s_n_llhttp__internal__n_error_81: { state->error = 0x7; state->reason = "Double @ in url"; state->error_pos = (const char*) p; @@ -17639,7 +9434,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_59: { + s_n_llhttp__internal__n_error_82: { state->error = 0x7; state->reason = "Unexpected char in url server"; state->error_pos = (const char*) p; @@ -17648,7 +9443,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_60: { + s_n_llhttp__internal__n_error_83: { state->error = 0x7; state->reason = "Unexpected char in url server"; state->error_pos = (const char*) p; @@ -17657,7 +9452,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_62: { + s_n_llhttp__internal__n_error_84: { state->error = 0x7; state->reason = "Unexpected char in url schema"; state->error_pos = (const char*) p; @@ -17666,7 +9461,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_63: { + s_n_llhttp__internal__n_error_85: { state->error = 0x7; state->reason = "Unexpected char in url schema"; state->error_pos = (const char*) p; @@ -17675,7 +9470,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_64: { + s_n_llhttp__internal__n_error_86: { state->error = 0x7; state->reason = "Unexpected start char in url"; state->error_pos = (const char*) p; @@ -17687,14 +9482,14 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_invoke_is_equal_method: { switch (llhttp__internal__c_is_equal_method(state, p, endp)) { case 0: - goto s_n_llhttp__internal__n_span_start_llhttp__on_url_1; + goto s_n_llhttp__internal__n_url_entry_normal; default: - goto s_n_llhttp__internal__n_span_start_llhttp__on_url; + goto s_n_llhttp__internal__n_url_entry_connect; } /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_65: { + s_n_llhttp__internal__n_error_87: { state->error = 0x6; state->reason = "Expected space after method"; state->error_pos = (const char*) p; @@ -17703,7 +9498,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_pause_22: { + s_n_llhttp__internal__n_pause_26: { state->error = 0x15; state->reason = "on_method_complete pause"; state->error_pos = (const char*) p; @@ -17712,7 +9507,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_76: { + s_n_llhttp__internal__n_error_106: { state->error = 0x20; state->reason = "`on_method_complete` callback error"; state->error_pos = (const char*) p; @@ -17746,7 +9541,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_77: { + s_n_llhttp__internal__n_error_107: { state->error = 0x6; state->reason = "Invalid method encountered"; state->error_pos = (const char*) p; @@ -17755,26 +9550,34 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_68: { + s_n_llhttp__internal__n_error_99: { state->error = 0xd; - state->reason = "Response overflow"; + state->reason = "Invalid status code"; state->error_pos = (const char*) p; state->_current = (void*) (intptr_t) s_error; return s_error; /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_invoke_mul_add_status_code: { - switch (llhttp__internal__c_mul_add_status_code(state, p, endp, match)) { - case 1: - goto s_n_llhttp__internal__n_error_68; - default: - goto s_n_llhttp__internal__n_res_status_code; - } + s_n_llhttp__internal__n_error_97: { + state->error = 0xd; + state->reason = "Invalid status code"; + state->error_pos = (const char*) p; + state->_current = (void*) (intptr_t) s_error; + return s_error; /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_pause_20: { + s_n_llhttp__internal__n_error_95: { + state->error = 0xd; + state->reason = "Invalid status code"; + state->error_pos = (const char*) p; + state->_current = (void*) (intptr_t) s_error; + return s_error; + /* UNREACHABLE */; + abort(); + } + s_n_llhttp__internal__n_pause_24: { state->error = 0x15; state->reason = "on_status_complete pause"; state->error_pos = (const char*) p; @@ -17783,7 +9586,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_69: { + s_n_llhttp__internal__n_error_91: { state->error = 0x1b; state->reason = "`on_status_complete` callback error"; state->error_pos = (const char*) p; @@ -17792,6 +9595,65 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } + s_n_llhttp__internal__n_invoke_llhttp__on_status_complete: { + switch (llhttp__on_status_complete(state, p, endp)) { + case 0: + goto s_n_llhttp__internal__n_headers_start; + case 21: + goto s_n_llhttp__internal__n_pause_24; + default: + goto s_n_llhttp__internal__n_error_91; + } + /* UNREACHABLE */; + abort(); + } + s_n_llhttp__internal__n_error_90: { + state->error = 0xd; + state->reason = "Invalid response status"; + state->error_pos = (const char*) p; + state->_current = (void*) (intptr_t) s_error; + return s_error; + /* UNREACHABLE */; + abort(); + } + s_n_llhttp__internal__n_invoke_test_lenient_flags_27: { + switch (llhttp__internal__c_test_lenient_flags_1(state, p, endp)) { + case 1: + goto s_n_llhttp__internal__n_invoke_llhttp__on_status_complete; + default: + goto s_n_llhttp__internal__n_error_90; + } + /* UNREACHABLE */; + abort(); + } + s_n_llhttp__internal__n_error_92: { + state->error = 0x2; + state->reason = "Expected LF after CR"; + state->error_pos = (const char*) p; + state->_current = (void*) (intptr_t) s_error; + return s_error; + /* UNREACHABLE */; + abort(); + } + s_n_llhttp__internal__n_invoke_test_lenient_flags_28: { + switch (llhttp__internal__c_test_lenient_flags_8(state, p, endp)) { + case 1: + goto s_n_llhttp__internal__n_invoke_llhttp__on_status_complete; + default: + goto s_n_llhttp__internal__n_error_92; + } + /* UNREACHABLE */; + abort(); + } + s_n_llhttp__internal__n_error_93: { + state->error = 0x19; + state->reason = "Missing expected CR after response line"; + state->error_pos = (const char*) p; + state->_current = (void*) (intptr_t) s_error; + return s_error; + /* UNREACHABLE */; + abort(); + } s_n_llhttp__internal__n_span_end_llhttp__on_status: { const unsigned char* start; int err; @@ -17802,11 +9664,11 @@ static llparse_state_t llhttp__internal__run( if (err != 0) { state->error = err; state->error_pos = (const char*) (p + 1); - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_llhttp__on_status_complete; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_invoke_test_lenient_flags_29; return s_error; } p++; - goto s_n_llhttp__internal__n_invoke_llhttp__on_status_complete; + goto s_n_llhttp__internal__n_invoke_test_lenient_flags_29; /* UNREACHABLE */; abort(); } @@ -17828,7 +9690,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_70: { + s_n_llhttp__internal__n_error_94: { state->error = 0xd; state->reason = "Invalid response status"; state->error_pos = (const char*) p; @@ -17837,15 +9699,72 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } + s_n_llhttp__internal__n_invoke_mul_add_status_code_2: { + switch (llhttp__internal__c_mul_add_status_code(state, p, endp, match)) { + case 1: + goto s_n_llhttp__internal__n_error_95; + default: + goto s_n_llhttp__internal__n_res_status_code_otherwise; + } + /* UNREACHABLE */; + abort(); + } + s_n_llhttp__internal__n_error_96: { + state->error = 0xd; + state->reason = "Invalid status code"; + state->error_pos = (const char*) p; + state->_current = (void*) (intptr_t) s_error; + return s_error; + /* UNREACHABLE */; + abort(); + } + s_n_llhttp__internal__n_invoke_mul_add_status_code_1: { + switch (llhttp__internal__c_mul_add_status_code(state, p, endp, match)) { + case 1: + goto s_n_llhttp__internal__n_error_97; + default: + goto s_n_llhttp__internal__n_res_status_code_digit_3; + } + /* UNREACHABLE */; + abort(); + } + s_n_llhttp__internal__n_error_98: { + state->error = 0xd; + state->reason = "Invalid status code"; + state->error_pos = (const char*) p; + state->_current = (void*) (intptr_t) s_error; + return s_error; + /* UNREACHABLE */; + abort(); + } + s_n_llhttp__internal__n_invoke_mul_add_status_code: { + switch (llhttp__internal__c_mul_add_status_code(state, p, endp, match)) { + case 1: + goto s_n_llhttp__internal__n_error_99; + default: + goto s_n_llhttp__internal__n_res_status_code_digit_2; + } + /* UNREACHABLE */; + abort(); + } + s_n_llhttp__internal__n_error_100: { + state->error = 0xd; + state->reason = "Invalid status code"; + state->error_pos = (const char*) p; + state->_current = (void*) (intptr_t) s_error; + return s_error; + /* UNREACHABLE */; + abort(); + } s_n_llhttp__internal__n_invoke_update_status_code: { switch (llhttp__internal__c_update_status_code(state, p, endp)) { default: - goto s_n_llhttp__internal__n_res_status_code; + goto s_n_llhttp__internal__n_res_status_code_digit_1; } /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_71: { + s_n_llhttp__internal__n_error_101: { state->error = 0x9; state->reason = "Expected space after version"; state->error_pos = (const char*) p; @@ -17854,7 +9773,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_pause_21: { + s_n_llhttp__internal__n_pause_25: { state->error = 0x15; state->reason = "on_version_complete pause"; state->error_pos = (const char*) p; @@ -17863,7 +9782,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_67: { + s_n_llhttp__internal__n_error_89: { state->error = 0x21; state->reason = "`on_version_complete` callback error"; state->error_pos = (const char*) p; @@ -17899,10 +9818,10 @@ static llparse_state_t llhttp__internal__run( if (err != 0) { state->error = err; state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_66; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_88; return s_error; } - goto s_n_llhttp__internal__n_error_66; + goto s_n_llhttp__internal__n_error_88; /* UNREACHABLE */; abort(); } @@ -17952,8 +9871,8 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_invoke_test_lenient_flags_9: { - switch (llhttp__internal__c_test_lenient_flags_8(state, p, endp)) { + s_n_llhttp__internal__n_invoke_test_lenient_flags_26: { + switch (llhttp__internal__c_test_lenient_flags_23(state, p, endp)) { case 1: goto s_n_llhttp__internal__n_span_end_llhttp__on_version_6; default: @@ -17965,7 +9884,7 @@ static llparse_state_t llhttp__internal__run( s_n_llhttp__internal__n_invoke_store_http_minor_1: { switch (llhttp__internal__c_store_http_minor(state, p, endp, match)) { default: - goto s_n_llhttp__internal__n_invoke_test_lenient_flags_9; + goto s_n_llhttp__internal__n_invoke_test_lenient_flags_26; } /* UNREACHABLE */; abort(); @@ -17980,10 +9899,10 @@ static llparse_state_t llhttp__internal__run( if (err != 0) { state->error = err; state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_72; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_102; return s_error; } - goto s_n_llhttp__internal__n_error_72; + goto s_n_llhttp__internal__n_error_102; /* UNREACHABLE */; abort(); } @@ -17997,10 +9916,10 @@ static llparse_state_t llhttp__internal__run( if (err != 0) { state->error = err; state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_73; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_103; return s_error; } - goto s_n_llhttp__internal__n_error_73; + goto s_n_llhttp__internal__n_error_103; /* UNREACHABLE */; abort(); } @@ -18022,14 +9941,14 @@ static llparse_state_t llhttp__internal__run( if (err != 0) { state->error = err; state->error_pos = (const char*) p; - state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_74; + state->_current = (void*) (intptr_t) s_n_llhttp__internal__n_error_104; return s_error; } - goto s_n_llhttp__internal__n_error_74; + goto s_n_llhttp__internal__n_error_104; /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_78: { + s_n_llhttp__internal__n_error_108: { state->error = 0x8; state->reason = "Expected HTTP/"; state->error_pos = (const char*) p; @@ -18038,7 +9957,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_pause_19: { + s_n_llhttp__internal__n_pause_23: { state->error = 0x15; state->reason = "on_method_complete pause"; state->error_pos = (const char*) p; @@ -18089,7 +10008,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_75: { + s_n_llhttp__internal__n_error_105: { state->error = 0x8; state->reason = "Invalid word encountered"; state->error_pos = (const char*) p; @@ -18123,7 +10042,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_pause_23: { + s_n_llhttp__internal__n_pause_27: { state->error = 0x15; state->reason = "on_message_begin pause"; state->error_pos = (const char*) p; @@ -18146,14 +10065,14 @@ static llparse_state_t llhttp__internal__run( case 0: goto s_n_llhttp__internal__n_invoke_load_type; case 21: - goto s_n_llhttp__internal__n_pause_23; + goto s_n_llhttp__internal__n_pause_27; default: goto s_n_llhttp__internal__n_error; } /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_pause_24: { + s_n_llhttp__internal__n_pause_28: { state->error = 0x15; state->reason = "on_reset pause"; state->error_pos = (const char*) p; @@ -18162,7 +10081,7 @@ static llparse_state_t llhttp__internal__run( /* UNREACHABLE */; abort(); } - s_n_llhttp__internal__n_error_79: { + s_n_llhttp__internal__n_error_109: { state->error = 0x1f; state->reason = "`on_reset` callback error"; state->error_pos = (const char*) p; @@ -18176,9 +10095,9 @@ static llparse_state_t llhttp__internal__run( case 0: goto s_n_llhttp__internal__n_invoke_update_finish; case 21: - goto s_n_llhttp__internal__n_pause_24; + goto s_n_llhttp__internal__n_pause_28; default: - goto s_n_llhttp__internal__n_error_79; + goto s_n_llhttp__internal__n_error_109; } /* UNREACHABLE */; abort(); @@ -18227,6 +10146,4 @@ int llhttp__internal_execute(llhttp__internal_t* state, const char* p, const cha } return 0; -} - -#endif /* LLHTTP_STRICT_MODE */ +} \ No newline at end of file diff --git a/deps/undici/src/docs/docs/api/Agent.md b/deps/undici/src/docs/docs/api/Agent.md index dd5d99bc1e1287..43b8d30ff5cd9c 100644 --- a/deps/undici/src/docs/docs/api/Agent.md +++ b/deps/undici/src/docs/docs/api/Agent.md @@ -16,65 +16,62 @@ Returns: `Agent` ### Parameter: `AgentOptions` -Extends: [`PoolOptions`](Pool.md#parameter-pooloptions) +Extends: [`PoolOptions`](/docs/docs/api/Pool.md#parameter-pooloptions) * **factory** `(origin: URL, opts: Object) => Dispatcher` - Default: `(origin, opts) => new Pool(origin, opts)` -* **maxRedirections** `Integer` - Default: `0`. The number of HTTP redirection to follow unless otherwise specified in `DispatchOptions`. -* **interceptors** `{ Agent: DispatchInterceptor[] }` - Default: `[RedirectInterceptor]` - A list of interceptors that are applied to the dispatch method. Additional logic can be applied (such as, but not limited to: 302 status code handling, authentication, cookies, compression and caching). Note that the behavior of interceptors is Experimental and might change at any given time. ## Instance Properties ### `Agent.closed` -Implements [Client.closed](Client.md#clientclosed) +Implements [Client.closed](/docs/docs/api/Client.md#clientclosed) ### `Agent.destroyed` -Implements [Client.destroyed](Client.md#clientdestroyed) +Implements [Client.destroyed](/docs/docs/api/Client.md#clientdestroyed) ## Instance Methods ### `Agent.close([callback])` -Implements [`Dispatcher.close([callback])`](Dispatcher.md#dispatcherclosecallback-promise). +Implements [`Dispatcher.close([callback])`](/docs/docs/api/Dispatcher.md#dispatcherclosecallback-promise). ### `Agent.destroy([error, callback])` -Implements [`Dispatcher.destroy([error, callback])`](Dispatcher.md#dispatcherdestroyerror-callback-promise). +Implements [`Dispatcher.destroy([error, callback])`](/docs/docs/api/Dispatcher.md#dispatcherdestroyerror-callback-promise). ### `Agent.dispatch(options, handler: AgentDispatchOptions)` -Implements [`Dispatcher.dispatch(options, handler)`](Dispatcher.md#dispatcherdispatchoptions-handler). +Implements [`Dispatcher.dispatch(options, handler)`](/docs/docs/api/Dispatcher.md#dispatcherdispatchoptions-handler). #### Parameter: `AgentDispatchOptions` -Extends: [`DispatchOptions`](Dispatcher.md#parameter-dispatchoptions) +Extends: [`DispatchOptions`](/docs/docs/api/Dispatcher.md#parameter-dispatchoptions) * **origin** `string | URL` -* **maxRedirections** `Integer`. -Implements [`Dispatcher.destroy([error, callback])`](Dispatcher.md#dispatcherdestroyerror-callback-promise). +Implements [`Dispatcher.destroy([error, callback])`](/docs/docs/api/Dispatcher.md#dispatcherdestroyerror-callback-promise). ### `Agent.connect(options[, callback])` -See [`Dispatcher.connect(options[, callback])`](Dispatcher.md#dispatcherconnectoptions-callback). +See [`Dispatcher.connect(options[, callback])`](/docs/docs/api/Dispatcher.md#dispatcherconnectoptions-callback). ### `Agent.dispatch(options, handler)` -Implements [`Dispatcher.dispatch(options, handler)`](Dispatcher.md#dispatcherdispatchoptions-handler). +Implements [`Dispatcher.dispatch(options, handler)`](/docs/docs/api/Dispatcher.md#dispatcherdispatchoptions-handler). ### `Agent.pipeline(options, handler)` -See [`Dispatcher.pipeline(options, handler)`](Dispatcher.md#dispatcherpipelineoptions-handler). +See [`Dispatcher.pipeline(options, handler)`](/docs/docs/api/Dispatcher.md#dispatcherpipelineoptions-handler). ### `Agent.request(options[, callback])` -See [`Dispatcher.request(options [, callback])`](Dispatcher.md#dispatcherrequestoptions-callback). +See [`Dispatcher.request(options [, callback])`](/docs/docs/api/Dispatcher.md#dispatcherrequestoptions-callback). ### `Agent.stream(options, factory[, callback])` -See [`Dispatcher.stream(options, factory[, callback])`](Dispatcher.md#dispatcherstreamoptions-factory-callback). +See [`Dispatcher.stream(options, factory[, callback])`](/docs/docs/api/Dispatcher.md#dispatcherstreamoptions-factory-callback). ### `Agent.upgrade(options[, callback])` -See [`Dispatcher.upgrade(options[, callback])`](Dispatcher.md#dispatcherupgradeoptions-callback). +See [`Dispatcher.upgrade(options[, callback])`](/docs/docs/api/Dispatcher.md#dispatcherupgradeoptions-callback). diff --git a/deps/undici/src/docs/docs/api/BalancedPool.md b/deps/undici/src/docs/docs/api/BalancedPool.md index 183ef523185a90..df267fe727054a 100644 --- a/deps/undici/src/docs/docs/api/BalancedPool.md +++ b/deps/undici/src/docs/docs/api/BalancedPool.md @@ -2,7 +2,7 @@ Extends: `undici.Dispatcher` -A pool of [Pool](Pool.md) instances connected to multiple upstreams. +A pool of [Pool](/docs/docs/api/Pool.md) instances connected to multiple upstreams. Requests are not guaranteed to be dispatched in order of invocation. @@ -15,7 +15,7 @@ Arguments: ### Parameter: `BalancedPoolOptions` -Extends: [`PoolOptions`](Pool.md#parameter-pooloptions) +Extends: [`PoolOptions`](/docs/docs/api/Pool.md#parameter-pooloptions) * **factory** `(origin: URL, opts: Object) => Dispatcher` - Default: `(origin, opts) => new Pool(origin, opts)` @@ -28,15 +28,15 @@ Returns an array of upstreams that were previously added. ### `BalancedPool.closed` -Implements [Client.closed](Client.md#clientclosed) +Implements [Client.closed](/docs/docs/api/Client.md#clientclosed) ### `BalancedPool.destroyed` -Implements [Client.destroyed](Client.md#clientdestroyed) +Implements [Client.destroyed](/docs/docs/api/Client.md#clientdestroyed) ### `Pool.stats` -Returns [`PoolStats`](PoolStats.md) instance for this pool. +Returns [`PoolStats`](/docs/docs/api/PoolStats.md) instance for this pool. ## Instance Methods @@ -54,46 +54,46 @@ Removes an upstream that was previously added. ### `BalancedPool.close([callback])` -Implements [`Dispatcher.close([callback])`](Dispatcher.md#dispatcherclosecallback-promise). +Implements [`Dispatcher.close([callback])`](/docs/docs/api/Dispatcher.md#dispatcherclosecallback-promise). ### `BalancedPool.destroy([error, callback])` -Implements [`Dispatcher.destroy([error, callback])`](Dispatcher.md#dispatcherdestroyerror-callback-promise). +Implements [`Dispatcher.destroy([error, callback])`](/docs/docs/api/Dispatcher.md#dispatcherdestroyerror-callback-promise). ### `BalancedPool.connect(options[, callback])` -See [`Dispatcher.connect(options[, callback])`](Dispatcher.md#dispatcherconnectoptions-callback). +See [`Dispatcher.connect(options[, callback])`](/docs/docs/api/Dispatcher.md#dispatcherconnectoptions-callback). ### `BalancedPool.dispatch(options, handlers)` -Implements [`Dispatcher.dispatch(options, handlers)`](Dispatcher.md#dispatcherdispatchoptions-handler). +Implements [`Dispatcher.dispatch(options, handlers)`](/docs/docs/api/Dispatcher.md#dispatcherdispatchoptions-handler). ### `BalancedPool.pipeline(options, handler)` -See [`Dispatcher.pipeline(options, handler)`](Dispatcher.md#dispatcherpipelineoptions-handler). +See [`Dispatcher.pipeline(options, handler)`](/docs/docs/api/Dispatcher.md#dispatcherpipelineoptions-handler). ### `BalancedPool.request(options[, callback])` -See [`Dispatcher.request(options [, callback])`](Dispatcher.md#dispatcherrequestoptions-callback). +See [`Dispatcher.request(options [, callback])`](/docs/docs/api/Dispatcher.md#dispatcherrequestoptions-callback). ### `BalancedPool.stream(options, factory[, callback])` -See [`Dispatcher.stream(options, factory[, callback])`](Dispatcher.md#dispatcherstreamoptions-factory-callback). +See [`Dispatcher.stream(options, factory[, callback])`](/docs/docs/api/Dispatcher.md#dispatcherstreamoptions-factory-callback). ### `BalancedPool.upgrade(options[, callback])` -See [`Dispatcher.upgrade(options[, callback])`](Dispatcher.md#dispatcherupgradeoptions-callback). +See [`Dispatcher.upgrade(options[, callback])`](/docs/docs/api/Dispatcher.md#dispatcherupgradeoptions-callback). ## Instance Events ### Event: `'connect'` -See [Dispatcher Event: `'connect'`](Dispatcher.md#event-connect). +See [Dispatcher Event: `'connect'`](/docs/docs/api/Dispatcher.md#event-connect). ### Event: `'disconnect'` -See [Dispatcher Event: `'disconnect'`](Dispatcher.md#event-disconnect). +See [Dispatcher Event: `'disconnect'`](/docs/docs/api/Dispatcher.md#event-disconnect). ### Event: `'drain'` -See [Dispatcher Event: `'drain'`](Dispatcher.md#event-drain). +See [Dispatcher Event: `'drain'`](/docs/docs/api/Dispatcher.md#event-drain). diff --git a/deps/undici/src/docs/docs/api/CacheStore.md b/deps/undici/src/docs/docs/api/CacheStore.md new file mode 100644 index 00000000000000..7cd19e08786730 --- /dev/null +++ b/deps/undici/src/docs/docs/api/CacheStore.md @@ -0,0 +1,131 @@ +# Cache Store + +A Cache Store is responsible for storing and retrieving cached responses. +It is also responsible for deciding which specific response to use based off of +a response's `Vary` header (if present). It is expected to be compliant with +[RFC-9111](https://www.rfc-editor.org/rfc/rfc9111.html). + +## Pre-built Cache Stores + +### `MemoryCacheStore` + +The `MemoryCacheStore` stores the responses in-memory. + +**Options** + +- `maxCount` - The maximum amount of responses to store. Default `Infinity`. +- `maxEntrySize` - The maximum size in bytes that a response's body can be. If a response's body is greater than or equal to this, the response will not be cached. + +### `SqliteCacheStore` + +The `SqliteCacheStore` stores the responses in a SQLite database. +Under the hood, it uses Node.js' [`node:sqlite`](https://nodejs.org/api/sqlite.html) api. +The `SqliteCacheStore` is only exposed if the `node:sqlite` api is present. + +**Options** + +- `location` - The location of the SQLite database to use. Default `:memory:`. +- `maxCount` - The maximum number of entries to store in the database. Default `Infinity`. +- `maxEntrySize` - The maximum size in bytes that a resposne's body can be. If a response's body is greater than or equal to this, the response will not be cached. Default `Infinity`. + +## Defining a Custom Cache Store + +The store must implement the following functions: + +### Getter: `isFull` + +Optional. This tells the cache interceptor if the store is full or not. If this is true, +the cache interceptor will not attempt to cache the response. + +### Function: `get` + +Parameters: + +* **req** `Dispatcher.RequestOptions` - Incoming request + +Returns: `GetResult | Promise | undefined` - If the request is cached, the cached response is returned. If the request's method is anything other than HEAD, the response is also returned. +If the request isn't cached, `undefined` is returned. + +Response properties: + +* **response** `CacheValue` - The cached response data. +* **body** `Readable | undefined` - The response's body. + +### Function: `createWriteStream` + +Parameters: + +* **req** `Dispatcher.RequestOptions` - Incoming request +* **value** `CacheValue` - Response to store + +Returns: `Writable | undefined` - If the store is full, return `undefined`. Otherwise, return a writable so that the cache interceptor can stream the body and trailers to the store. + +## `CacheValue` + +This is an interface containing the majority of a response's data (minus the body). + +### Property `statusCode` + +`number` - The response's HTTP status code. + +### Property `statusMessage` + +`string` - The response's HTTP status message. + +### Property `rawHeaders` + +`Buffer[]` - The response's headers. + +### Property `vary` + +`Record | undefined` - The headers defined by the response's `Vary` header +and their respective values for later comparison + +For example, for a response like +``` +Vary: content-encoding, accepts +content-encoding: utf8 +accepts: application/json +``` + +This would be +```js +{ + 'content-encoding': 'utf8', + accepts: 'application/json' +} +``` + +### Property `cachedAt` + +`number` - Time in millis that this value was cached. + +### Property `staleAt` + +`number` - Time in millis that this value is considered stale. + +### Property `deleteAt` + +`number` - Time in millis that this value is to be deleted from the cache. This +is either the same sa staleAt or the `max-stale` caching directive. + +The store must not return a response after the time defined in this property. + +## `CacheStoreReadable` + +This extends Node's [`Readable`](https://nodejs.org/api/stream.html#class-streamreadable) +and defines extra properties relevant to the cache interceptor. + +### Getter: `value` + +The response's [`CacheStoreValue`](/docs/docs/api/CacheStore.md#cachestorevalue) + +## `CacheStoreWriteable` + +This extends Node's [`Writable`](https://nodejs.org/api/stream.html#class-streamwritable) +and defines extra properties relevant to the cache interceptor. + +### Setter: `rawTrailers` + +If the response has trailers, the cache interceptor will pass them to the cache +interceptor through this method. diff --git a/deps/undici/src/docs/docs/api/Client.md b/deps/undici/src/docs/docs/api/Client.md index 03342f59959db0..eab6ddc45acd3e 100644 --- a/deps/undici/src/docs/docs/api/Client.md +++ b/deps/undici/src/docs/docs/api/Client.md @@ -17,9 +17,7 @@ Returns: `Client` ### Parameter: `ClientOptions` -> ⚠️ Warning: The `H2` support is experimental. - -* **bodyTimeout** `number | null` (optional) - Default: `300e3` - The timeout after which a request will time out, in milliseconds. Monitors time between receiving body data. Use `0` to disable it entirely. Defaults to 300 seconds. Please note the `timeout` will be reset if you keep writing data to the scoket everytime. +* **bodyTimeout** `number | null` (optional) - Default: `300e3` - The timeout after which a request will time out, in milliseconds. Monitors time between receiving body data. Use `0` to disable it entirely. Defaults to 300 seconds. Please note the `timeout` will be reset if you keep writing data to the socket everytime. * **headersTimeout** `number | null` (optional) - Default: `300e3` - The amount of time, in milliseconds, the parser will wait to receive the complete HTTP headers while not sending the request. Defaults to 300 seconds. * **keepAliveMaxTimeout** `number | null` (optional) - Default: `600e3` - The maximum allowed `keepAliveTimeout`, in milliseconds, when overridden by *keep-alive* hints from the server. Defaults to 10 minutes. * **keepAliveTimeout** `number | null` (optional) - Default: `4e3` - The timeout, in milliseconds, after which a socket without active requests will time out. Monitors time between activity on a connected socket. This value may be overridden by *keep-alive* hints from the server. See [MDN: HTTP - Headers - Keep-Alive directives](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Keep-Alive#directives) for more details. Defaults to 4 seconds. @@ -29,13 +27,22 @@ Returns: `Client` * **pipelining** `number | null` (optional) - Default: `1` - The amount of concurrent requests to be sent over the single TCP/TLS connection according to [RFC7230](https://tools.ietf.org/html/rfc7230#section-6.3.2). Carefully consider your workload and environment before enabling concurrent requests as pipelining may reduce performance if used incorrectly. Pipelining is sensitive to network stack settings as well as head of line blocking caused by e.g. long running requests. Set to `0` to disable keep-alive connections. * **connect** `ConnectOptions | Function | null` (optional) - Default: `null`. * **strictContentLength** `Boolean` (optional) - Default: `true` - Whether to treat request content length mismatches as errors. If true, an error is thrown when the request content-length header doesn't match the length of the request body. - -* **interceptors** `{ Client: DispatchInterceptor[] }` - Default: `[RedirectInterceptor]` - A list of interceptors that are applied to the dispatch method. Additional logic can be applied (such as, but not limited to: 302 status code handling, authentication, cookies, compression and caching). Note that the behavior of interceptors is Experimental and might change at any given time. **Note: this is deprecated in favor of [Dispatcher#compose](./Dispatcher.md#dispatcher). Support will be droped in next major.** * **autoSelectFamily**: `boolean` (optional) - Default: depends on local Node version, on Node 18.13.0 and above is `false`. Enables a family autodetection algorithm that loosely implements section 5 of [RFC 8305](https://tools.ietf.org/html/rfc8305#section-5). See [here](https://nodejs.org/api/net.html#socketconnectoptions-connectlistener) for more details. This option is ignored if not supported by the current Node version. * **autoSelectFamilyAttemptTimeout**: `number` - Default: depends on local Node version, on Node 18.13.0 and above is `250`. The amount of time in milliseconds to wait for a connection attempt to finish before trying the next address when using the `autoSelectFamily` option. See [here](https://nodejs.org/api/net.html#socketconnectoptions-connectlistener) for more details. * **allowH2**: `boolean` - Default: `false`. Enables support for H2 if the server has assigned bigger priority to it through ALPN negotiation. * **maxConcurrentStreams**: `number` - Default: `100`. Dictates the maximum number of concurrent streams for a single H2 session. It can be overridden by a SETTINGS remote frame. +> **Notes about HTTP/2** +> - It only works under TLS connections. h2c is not supported. +> - The server must support HTTP/2 and choose it as the protocol during the ALPN negotiation. +> - The server must not have a bigger priority for HTTP/1.1 than HTTP/2. +> - Pseudo headers are automatically attached to the request. If you try to set them, they will be overwritten. +> - The `:path` header is automatically set to the request path. +> - The `:method` header is automatically set to the request method. +> - The `:scheme` header is automatically set to the request scheme. +> - The `:authority` header is automatically set to the request `host[:port]`. +> - `PUSH` frames are yet not supported. + #### Parameter: `ConnectOptions` Every Tls option, see [here](https://nodejs.org/api/tls.html#tls_tls_connect_options_callback). @@ -88,37 +95,37 @@ const client = new Client('https://localhost:3000', { ### `Client.close([callback])` -Implements [`Dispatcher.close([callback])`](Dispatcher.md#dispatcherclosecallback-promise). +Implements [`Dispatcher.close([callback])`](/docs/docs/api/Dispatcher.md#dispatcherclosecallback-promise). ### `Client.destroy([error, callback])` -Implements [`Dispatcher.destroy([error, callback])`](Dispatcher.md#dispatcherdestroyerror-callback-promise). +Implements [`Dispatcher.destroy([error, callback])`](/docs/docs/api/Dispatcher.md#dispatcherdestroyerror-callback-promise). Waits until socket is closed before invoking the callback (or returning a promise if no callback is provided). ### `Client.connect(options[, callback])` -See [`Dispatcher.connect(options[, callback])`](Dispatcher.md#dispatcherconnectoptions-callback). +See [`Dispatcher.connect(options[, callback])`](/docs/docs/api/Dispatcher.md#dispatcherconnectoptions-callback). ### `Client.dispatch(options, handlers)` -Implements [`Dispatcher.dispatch(options, handlers)`](Dispatcher.md#dispatcherdispatchoptions-handler). +Implements [`Dispatcher.dispatch(options, handlers)`](/docs/docs/api/Dispatcher.md#dispatcherdispatchoptions-handler). ### `Client.pipeline(options, handler)` -See [`Dispatcher.pipeline(options, handler)`](Dispatcher.md#dispatcherpipelineoptions-handler). +See [`Dispatcher.pipeline(options, handler)`](/docs/docs/api/Dispatcher.md#dispatcherpipelineoptions-handler). ### `Client.request(options[, callback])` -See [`Dispatcher.request(options [, callback])`](Dispatcher.md#dispatcherrequestoptions-callback). +See [`Dispatcher.request(options [, callback])`](/docs/docs/api/Dispatcher.md#dispatcherrequestoptions-callback). ### `Client.stream(options, factory[, callback])` -See [`Dispatcher.stream(options, factory[, callback])`](Dispatcher.md#dispatcherstreamoptions-factory-callback). +See [`Dispatcher.stream(options, factory[, callback])`](/docs/docs/api/Dispatcher.md#dispatcherstreamoptions-factory-callback). ### `Client.upgrade(options[, callback])` -See [`Dispatcher.upgrade(options[, callback])`](Dispatcher.md#dispatcherupgradeoptions-callback). +See [`Dispatcher.upgrade(options[, callback])`](/docs/docs/api/Dispatcher.md#dispatcherupgradeoptions-callback). ## Instance Properties @@ -144,7 +151,7 @@ Property to get and set the pipelining factor. ### Event: `'connect'` -See [Dispatcher Event: `'connect'`](Dispatcher.md#event-connect). +See [Dispatcher Event: `'connect'`](/docs/docs/api/Dispatcher.md#event-connect). Parameters: @@ -190,7 +197,7 @@ try { ### Event: `'disconnect'` -See [Dispatcher Event: `'disconnect'`](Dispatcher.md#event-disconnect). +See [Dispatcher Event: `'disconnect'`](/docs/docs/api/Dispatcher.md#event-disconnect). Parameters: @@ -235,7 +242,7 @@ try { Emitted when pipeline is no longer busy. -See [Dispatcher Event: `'drain'`](Dispatcher.md#event-drain). +See [Dispatcher Event: `'drain'`](/docs/docs/api/Dispatcher.md#event-drain). #### Example - Client drain event diff --git a/deps/undici/src/docs/docs/api/Debug.md b/deps/undici/src/docs/docs/api/Debug.md index 7efc99e3e31f5f..f7a8864b099aa3 100644 --- a/deps/undici/src/docs/docs/api/Debug.md +++ b/deps/undici/src/docs/docs/api/Debug.md @@ -2,7 +2,7 @@ Undici (and subsenquently `fetch` and `websocket`) exposes a debug statement that can be enabled by setting `NODE_DEBUG` within the environment. -The flags availabile are: +The flags available are: ## `undici` diff --git a/deps/undici/src/docs/docs/api/DispatchInterceptor.md b/deps/undici/src/docs/docs/api/DispatchInterceptor.md deleted file mode 100644 index 7dfc260e32a9c8..00000000000000 --- a/deps/undici/src/docs/docs/api/DispatchInterceptor.md +++ /dev/null @@ -1,60 +0,0 @@ -# Interface: DispatchInterceptor - -Extends: `Function` - -A function that can be applied to the `Dispatcher.Dispatch` function before it is invoked with a dispatch request. - -This allows one to write logic to intercept both the outgoing request, and the incoming response. - -### Parameter: `Dispatcher.Dispatch` - -The base dispatch function you are decorating. - -### ReturnType: `Dispatcher.Dispatch` - -A dispatch function that has been altered to provide additional logic - -### Basic Example - -Here is an example of an interceptor being used to provide a JWT bearer token - -```js -'use strict' - -const insertHeaderInterceptor = dispatch => { - return function InterceptedDispatch(opts, handler){ - opts.headers.push('Authorization', 'Bearer [Some token]') - return dispatch(opts, handler) - } -} - -const client = new Client('https://localhost:3000', { - interceptors: { Client: [insertHeaderInterceptor] } -}) - -``` - -### Basic Example 2 - -Here is a contrived example of an interceptor stripping the headers from a response. - -```js -'use strict' - -const clearHeadersInterceptor = dispatch => { - const { DecoratorHandler } = require('undici') - class ResultInterceptor extends DecoratorHandler { - onHeaders (statusCode, headers, resume) { - return super.onHeaders(statusCode, [], resume) - } - } - return function InterceptedDispatch(opts, handler){ - return dispatch(opts, new ResultInterceptor(handler)) - } -} - -const client = new Client('https://localhost:3000', { - interceptors: { Client: [clearHeadersInterceptor] } -}) - -``` diff --git a/deps/undici/src/docs/docs/api/Dispatcher.md b/deps/undici/src/docs/docs/api/Dispatcher.md index 67819ecd525492..d9f66d17d81ab1 100644 --- a/deps/undici/src/docs/docs/api/Dispatcher.md +++ b/deps/undici/src/docs/docs/api/Dispatcher.md @@ -197,23 +197,20 @@ Returns: `Boolean` - `false` if dispatcher is busy and further dispatch calls wo * **headers** `UndiciHeaders | string[]` (optional) - Default: `null`. * **query** `Record | null` (optional) - Default: `null` - Query string params to be embedded in the request URL. Note that both keys and values of query are encoded using `encodeURIComponent`. If for some reason you need to send them unencoded, embed query params into path directly instead. * **idempotent** `boolean` (optional) - Default: `true` if `method` is `'HEAD'` or `'GET'` - Whether the requests can be safely retried or not. If `false` the request won't be sent until all preceding requests in the pipeline has completed. -* **blocking** `boolean` (optional) - Default: `false` - Whether the response is expected to take a long time and would end up blocking the pipeline. When this is set to `true` further pipelining will be avoided on the same connection until headers have been received. +* **blocking** `boolean` (optional) - Default: `method !== 'HEAD'` - Whether the response is expected to take a long time and would end up blocking the pipeline. When this is set to `true` further pipelining will be avoided on the same connection until headers have been received. * **upgrade** `string | null` (optional) - Default: `null` - Upgrade the request. Should be used to specify the kind of upgrade i.e. `'Websocket'`. * **bodyTimeout** `number | null` (optional) - The timeout after which a request will time out, in milliseconds. Monitors time between receiving body data. Use `0` to disable it entirely. Defaults to 300 seconds. * **headersTimeout** `number | null` (optional) - The amount of time, in milliseconds, the parser will wait to receive the complete HTTP headers while not sending the request. Defaults to 300 seconds. -* **throwOnError** `boolean` (optional) - Default: `false` - Whether Undici should throw an error upon receiving a 4xx or 5xx response from the server. * **expectContinue** `boolean` (optional) - Default: `false` - For H2, it appends the expect: 100-continue header, and halts the request body until a 100-continue is received from the remote server #### Parameter: `DispatchHandler` -* **onConnect** `(abort: () => void, context: object) => void` - Invoked before request is dispatched on socket. May be invoked multiple times when a request is retried when the request at the head of the pipeline fails. -* **onError** `(error: Error) => void` - Invoked when an error has occurred. May not throw. -* **onUpgrade** `(statusCode: number, headers: Buffer[], socket: Duplex) => void` (optional) - Invoked when request is upgraded. Required if `DispatchOptions.upgrade` is defined or `DispatchOptions.method === 'CONNECT'`. -* **onResponseStarted** `() => void` (optional) - Invoked when response is received, before headers have been read. -* **onHeaders** `(statusCode: number, headers: Buffer[], resume: () => void, statusText: string) => boolean` - Invoked when statusCode and headers have been received. May be invoked multiple times due to 1xx informational headers. Not required for `upgrade` requests. -* **onData** `(chunk: Buffer) => boolean` - Invoked when response payload data is received. Not required for `upgrade` requests. -* **onComplete** `(trailers: Buffer[]) => void` - Invoked when response payload and trailers have been received and the request has completed. Not required for `upgrade` requests. -* **onBodySent** `(chunk: string | Buffer | Uint8Array) => void` - Invoked when a body chunk is sent to the server. Not required. For a stream or iterable body this will be invoked for every chunk. For other body types, it will be invoked once after the body is sent. +* **onRequestStart** `(controller: DispatchController, context: object) => void` - Invoked before request is dispatched on socket. May be invoked multiple times when a request is retried when the request at the head of the pipeline fails. +* **onRequestUpgrade** `(controller: DispatchController, statusCode: number, headers: Record, socket: Duplex) => void` (optional) - Invoked when request is upgraded. Required if `DispatchOptions.upgrade` is defined or `DispatchOptions.method === 'CONNECT'`. +* **onResponseStart** `(controller: DispatchController, statusCode: number, headers: Record, statusMessage?: string) => void` - Invoked when statusCode and headers have been received. May be invoked multiple times due to 1xx informational headers. Not required for `upgrade` requests. +* **onResponseData** `(controller: DispatchController, chunk: Buffer) => void` - Invoked when response payload data is received. Not required for `upgrade` requests. +* **onResponseEnd** `(controller: DispatchController, trailers: Record) => void` - Invoked when response payload and trailers have been received and the request has completed. Not required for `upgrade` requests. +* **onResponseError** `(error: Error) => void` - Invoked when an error has occurred. May not throw. #### Example 1 - Dispatch GET request @@ -378,7 +375,7 @@ Returns: `stream.Duplex` #### Parameter: PipelineOptions -Extends: [`RequestOptions`](#parameter-requestoptions) +Extends: [`RequestOptions`](/docs/docs/api/Dispatcher.md#parameter-requestoptions) * **objectMode** `boolean` (optional) - Default: `false` - Set to `true` if the `handler` will return an object stream. @@ -468,7 +465,7 @@ Returns: `void | Promise` - Only returns a `Promise` if no `callba #### Parameter: `RequestOptions` -Extends: [`DispatchOptions`](#parameter-dispatchoptions) +Extends: [`DispatchOptions`](/docs/docs/api/Dispatcher.md#parameter-dispatchoptions) * **opaque** `unknown` (optional) - Default: `null` - Used for passing through context to `ResponseData`. * **signal** `AbortSignal | events.EventEmitter | null` (optional) - Default: `null`. @@ -479,7 +476,7 @@ The `RequestOptions.method` property should not be value `'CONNECT'`. #### Parameter: `ResponseData` * **statusCode** `number` -* **headers** `Record` - Note that all header keys are lower-cased, e. g. `content-type`. +* **headers** `Record` - Note that all header keys are lower-cased, e.g. `content-type`. * **body** `stream.Readable` which also implements [the body mixin from the Fetch Standard](https://fetch.spec.whatwg.org/#body-mixin). * **trailers** `Record` - This object starts out as empty and will be mutated to contain trailers after `body` has emitted `'end'`. @@ -528,6 +525,7 @@ try { console.log('headers', headers) body.setEncoding('utf8') body.on('data', console.log) + body.on('error', console.error) body.on('end', () => { console.log('trailers', trailers) }) @@ -631,11 +629,30 @@ try { } ``` +#### Example 3 - Conditionally reading the body + +Remember to fully consume the body even in the case when it is not read. + +```js +const { body, statusCode } = await client.request({ + path: '/', + method: 'GET' +}) + +if (statusCode === 200) { + return await body.arrayBuffer() +} + +await body.dump() + +return null +``` + ### `Dispatcher.stream(options, factory[, callback])` A faster version of `Dispatcher.request`. This method expects the second argument `factory` to return a [`stream.Writable`](https://nodejs.org/api/stream.html#stream_class_stream_writable) stream which the response will be written to. This improves performance by avoiding creating an intermediate [`stream.Readable`](https://nodejs.org/api/stream.html#stream_readable_streams) stream when the user expects to directly pipe the response body to a [`stream.Writable`](https://nodejs.org/api/stream.html#stream_class_stream_writable) stream. -As demonstrated in [Example 1 - Basic GET stream request](#example-1---basic-get-stream-request), it is recommended to use the `option.opaque` property to avoid creating a closure for the `factory` method. This pattern works well with Node.js Web Frameworks such as [Fastify](https://fastify.io). See [Example 2 - Stream to Fastify Response](#example-2---stream-to-fastify-response) for more details. +As demonstrated in [Example 1 - Basic GET stream request](/docs/docs/api/Dispatcher.md#example-1---basic-get-stream-request), it is recommended to use the `option.opaque` property to avoid creating a closure for the `factory` method. This pattern works well with Node.js Web Frameworks such as [Fastify](https://fastify.io). See [Example 2 - Stream to Fastify Response](/docs/docs/api/Dispatch.md#example-2---stream-to-fastify-response) for more details. Arguments: @@ -917,7 +934,7 @@ await client.request({ path: '/', method: 'GET' }) The `redirect` interceptor allows you to customize the way your dispatcher handles redirects. -It accepts the same arguments as the [`RedirectHandler` constructor](./RedirectHandler.md). +It accepts the same arguments as the [`RedirectHandler` constructor](/docs/docs/api/RedirectHandler.md). **Example - Basic Redirect Interceptor** @@ -935,7 +952,7 @@ client.request({ path: "/" }) The `retry` interceptor allows you to customize the way your dispatcher handles retries. -It accepts the same arguments as the [`RetryHandler` constructor](./RetryHandler.md). +It accepts the same arguments as the [`RetryHandler` constructor](/docs/docs/api/RetryHandler.md). **Example - Basic Redirect Interceptor** @@ -975,7 +992,7 @@ const client = new Client("http://example.com").compose( }) ); -// or +// or client.dispatch( { path: "/", @@ -986,202 +1003,89 @@ client.dispatch( ); ``` -##### `Response Error Interceptor` - -**Introduction** - -The Response Error Interceptor is designed to handle HTTP response errors efficiently. It intercepts responses and throws detailed errors for responses with status codes indicating failure (4xx, 5xx). This interceptor enhances error handling by providing structured error information, including response headers, data, and status codes. +##### `dns` -**ResponseError Class** +The `dns` interceptor enables you to cache DNS lookups for a given duration, per origin. -The `ResponseError` class extends the `UndiciError` class and encapsulates detailed error information. It captures the response status code, headers, and data, providing a structured way to handle errors. +>It is well suited for scenarios where you want to cache DNS lookups to avoid the overhead of resolving the same domain multiple times -**Definition** - -```js -class ResponseError extends UndiciError { - constructor (message, code, { headers, data }) { - super(message); - this.name = 'ResponseError'; - this.message = message || 'Response error'; - this.code = 'UND_ERR_RESPONSE'; - this.statusCode = code; - this.data = data; - this.headers = headers; - } -} -``` - -**Interceptor Handler** - -The interceptor's handler class extends `DecoratorHandler` and overrides methods to capture response details and handle errors based on the response status code. - -**Methods** - -- **onConnect**: Initializes response properties. -- **onHeaders**: Captures headers and status code. Decodes body if content type is `application/json` or `text/plain`. -- **onData**: Appends chunks to the body if status code indicates an error. -- **onComplete**: Finalizes error handling, constructs a `ResponseError`, and invokes the `onError` method. -- **onError**: Propagates errors to the handler. - -**Definition** +**Options** +- `maxTTL` - The maximum time-to-live (in milliseconds) of the DNS cache. It should be a positive integer. Default: `10000`. + - Set `0` to disable TTL. +- `maxItems` - The maximum number of items to cache. It should be a positive integer. Default: `Infinity`. +- `dualStack` - Whether to resolve both IPv4 and IPv6 addresses. Default: `true`. + - It will also attempt a happy-eyeballs-like approach to connect to the available addresses in case of a connection failure. +- `affinity` - Whether to use IPv4 or IPv6 addresses. Default: `4`. + - It can be either `'4` or `6`. + - It will only take effect if `dualStack` is `false`. +- `lookup: (hostname: string, options: LookupOptions, callback: (err: NodeJS.ErrnoException | null, addresses: DNSInterceptorRecord[]) => void) => void` - Custom lookup function. Default: `dns.lookup`. + - For more info see [dns.lookup](https://nodejs.org/api/dns.html#dns_dns_lookup_hostname_options_callback). +- `pick: (origin: URL, records: DNSInterceptorRecords, affinity: 4 | 6) => DNSInterceptorRecord` - Custom pick function. Default: `RoundRobin`. + - The function should return a single record from the records array. + - By default a simplified version of Round Robin is used. + - The `records` property can be mutated to store the state of the balancing algorithm. + +> The `Dispatcher#options` also gets extended with the options `dns.affinity`, `dns.dualStack`, `dns.lookup` and `dns.pick` which can be used to configure the interceptor at a request-per-request basis. + + +**DNSInterceptorRecord** +It represents a DNS record. +- `family` - (`number`) The IP family of the address. It can be either `4` or `6`. +- `address` - (`string`) The IP address. + +**DNSInterceptorOriginRecords** +It represents a map of DNS IP addresses records for a single origin. +- `4.ips` - (`DNSInterceptorRecord[] | null`) The IPv4 addresses. +- `6.ips` - (`DNSInterceptorRecord[] | null`) The IPv6 addresses. + +**Example - Basic DNS Interceptor** ```js -class Handler extends DecoratorHandler { - // Private properties - #handler; - #statusCode; - #contentType; - #decoder; - #headers; - #body; - - constructor (opts, { handler }) { - super(handler); - this.#handler = handler; - } - - onConnect (abort) { - this.#statusCode = 0; - this.#contentType = null; - this.#decoder = null; - this.#headers = null; - this.#body = ''; - return this.#handler.onConnect(abort); - } - - onHeaders (statusCode, rawHeaders, resume, statusMessage, headers = parseHeaders(rawHeaders)) { - this.#statusCode = statusCode; - this.#headers = headers; - this.#contentType = headers['content-type']; - - if (this.#statusCode < 400) { - return this.#handler.onHeaders(statusCode, rawHeaders, resume, statusMessage, headers); - } - - if (this.#contentType === 'application/json' || this.#contentType === 'text/plain') { - this.#decoder = new TextDecoder('utf-8'); - } - } - - onData (chunk) { - if (this.#statusCode < 400) { - return this.#handler.onData(chunk); - } - this.#body += this.#decoder?.decode(chunk, { stream: true }) ?? ''; - } - - onComplete (rawTrailers) { - if (this.#statusCode >= 400) { - this.#body += this.#decoder?.decode(undefined, { stream: false }) ?? ''; - if (this.#contentType === 'application/json') { - try { - this.#body = JSON.parse(this.#body); - } catch { - // Do nothing... - } - } - - let err; - const stackTraceLimit = Error.stackTraceLimit; - Error.stackTraceLimit = 0; - try { - err = new ResponseError('Response Error', this.#statusCode, this.#headers, this.#body); - } finally { - Error.stackTraceLimit = stackTraceLimit; - } - - this.#handler.onError(err); - } else { - this.#handler.onComplete(rawTrailers); - } - } +const { Client, interceptors } = require("undici"); +const { dns } = interceptors; - onError (err) { - this.#handler.onError(err); - } -} +const client = new Agent().compose([ + dns({ ...opts }) +]) -module.exports = (dispatch) => (opts, handler) => opts.throwOnError - ? dispatch(opts, new Handler(opts, { handler })) - : dispatch(opts, handler); +const response = await client.request({ + origin: `http://localhost:3030`, + ...requestOpts +}) ``` -**Tests** - -Unit tests ensure the interceptor functions correctly, handling both error and non-error responses appropriately. +##### `responseError` -**Example Tests** +The `responseError` interceptor throws an error for responses with status code errors (>= 400). -- **No Error if `throwOnError` is False**: +**Example** ```js -test('should not error if request is not meant to throw error', async (t) => { - const opts = { throwOnError: false }; - const handler = { onError: () => {}, onData: () => {}, onComplete: () => {} }; - const interceptor = createResponseErrorInterceptor((opts, handler) => handler.onComplete()); - assert.doesNotThrow(() => interceptor(opts, handler)); -}); -``` - -- **Error if Status Code is in Specified Error Codes**: - -```js -test('should error if request status code is in the specified error codes', async (t) => { - const opts = { throwOnError: true, statusCodes: [500] }; - const response = { statusCode: 500 }; - let capturedError; - const handler = { - onError: (err) => { capturedError = err; }, - onData: () => {}, - onComplete: () => {} - }; - - const interceptor = createResponseErrorInterceptor((opts, handler) => { - if (opts.throwOnError && opts.statusCodes.includes(response.statusCode)) { - handler.onError(new Error('Response Error')); - } else { - handler.onComplete(); - } - }); - - interceptor({ ...opts, response }, handler); +const { Client, interceptors } = require("undici"); +const { responseError } = interceptors; - await new Promise(resolve => setImmediate(resolve)); +const client = new Client("http://example.com").compose( + responseError() +); - assert(capturedError, 'Expected error to be captured but it was not.'); - assert.strictEqual(capturedError.message, 'Response Error'); - assert.strictEqual(response.statusCode, 500); +// Will throw a ResponseError for status codes >= 400 +await client.request({ + method: "GET", + path: "/" }); ``` -- **No Error if Status Code is Not in Specified Error Codes**: - -```js -test('should not error if request status code is not in the specified error codes', async (t) => { - const opts = { throwOnError: true, statusCodes: [500] }; - const response = { statusCode: 404 }; - const handler = { - onError: () => {}, - onData: () => {}, - onComplete: () => {} - }; - - const interceptor = createResponseErrorInterceptor((opts, handler) => { - if (opts.throwOnError && opts.statusCodes.includes(response.statusCode)) { - handler.onError(new Error('Response Error')); - } else { - handler.onComplete(); - } - }); +##### `Cache Interceptor` - assert.doesNotThrow(() => interceptor({ ...opts, response }, handler)); -}); -``` +The `cache` interceptor implements client-side response caching as described in +[RFC9111](https://www.rfc-editor.org/rfc/rfc9111.html). -**Conclusion** +**Options** -The Response Error Interceptor provides a robust mechanism for handling HTTP response errors by capturing detailed error information and propagating it through a structured `ResponseError` class. This enhancement improves error handling and debugging capabilities in applications using the interceptor. +- `store` - The [`CacheStore`](/docs/docs/api/CacheStore.md) to store and retrieve responses from. Default is [`MemoryCacheStore`](/docs/docs/api/CacheStore.md#memorycachestore). +- `methods` - The [**safe** HTTP methods](https://www.rfc-editor.org/rfc/rfc9110#section-9.2.1) to cache the response of. +- `cacheByDefault` - The default expiration time to cache responses by if they don't have an explicit expiration. If this isn't present, responses without explicit expiration will not be cached. Default `undefined`. +- `type` - The type of cache for Undici to act as. Can be `shared` or `private`. Default `shared`. ## Instance Events @@ -1229,13 +1133,13 @@ Emitted when dispatcher is no longer busy. * `Record | string[] | Iterable<[string, string | string[] | undefined]> | null` -Header arguments such as `options.headers` in [`Client.dispatch`](Client.md#clientdispatchoptions-handlers) can be specified in three forms: +Header arguments such as `options.headers` in [`Client.dispatch`](/docs/docs/api/Client.md#clientdispatchoptions-handlers) can be specified in three forms: * As an object specified by the `Record` (`IncomingHttpHeaders`) type. * As an array of strings. An array representation of a header list must have an even length, or an `InvalidArgumentError` will be thrown. * As an iterable that can encompass `Headers`, `Map`, or a custom iterator returning key-value pairs. Keys are lowercase and values are not modified. -Response headers will derive a `host` from the `url` of the [Client](Client.md#class-client) instance if no `host` header was previously specified. +Response headers will derive a `host` from the `url` of the [Client](/docs/docs/api/Client.md#class-client) instance if no `host` header was previously specified. ### Example 1 - Object diff --git a/deps/undici/src/docs/docs/api/EnvHttpProxyAgent.md b/deps/undici/src/docs/docs/api/EnvHttpProxyAgent.md index a4932de8be7908..0bcbf25895ad5f 100644 --- a/deps/undici/src/docs/docs/api/EnvHttpProxyAgent.md +++ b/deps/undici/src/docs/docs/api/EnvHttpProxyAgent.md @@ -20,7 +20,7 @@ Returns: `EnvHttpProxyAgent` ### Parameter: `EnvHttpProxyAgentOptions` -Extends: [`AgentOptions`](Agent.md#parameter-agentoptions) +Extends: [`AgentOptions`](/docs/docs/api/Agent.md#parameter-agentoptions) * **httpProxy** `string` (optional) - When set, it will override the `HTTP_PROXY` environment variable. * **httpsProxy** `string` (optional) - When set, it will override the `HTTPS_PROXY` environment variable. @@ -118,45 +118,44 @@ const data = await json() // data { foo: "bar" } ### `EnvHttpProxyAgent.close([callback])` -Implements [`Dispatcher.close([callback])`](Dispatcher.md#dispatcherclosecallback-promise). +Implements [`Dispatcher.close([callback])`](/docs/docs/api/Dispatcher.md#dispatcherclosecallback-promise). ### `EnvHttpProxyAgent.destroy([error, callback])` -Implements [`Dispatcher.destroy([error, callback])`](Dispatcher.md#dispatcherdestroyerror-callback-promise). +Implements [`Dispatcher.destroy([error, callback])`](/docs/docs/api/Dispatcher.md#dispatcherdestroyerror-callback-promise). ### `EnvHttpProxyAgent.dispatch(options, handler: AgentDispatchOptions)` -Implements [`Dispatcher.dispatch(options, handler)`](Dispatcher.md#dispatcherdispatchoptions-handler). +Implements [`Dispatcher.dispatch(options, handler)`](/docs/docs/api/Dispatcher.md#dispatcherdispatchoptions-handler). #### Parameter: `AgentDispatchOptions` -Extends: [`DispatchOptions`](Dispatcher.md#parameter-dispatchoptions) +Extends: [`DispatchOptions`](/docs/docs/api/Dispatcher.md#parameter-dispatchoptions) * **origin** `string | URL` -* **maxRedirections** `Integer`. -Implements [`Dispatcher.destroy([error, callback])`](Dispatcher.md#dispatcherdestroyerror-callback-promise). +Implements [`Dispatcher.destroy([error, callback])`](/docs/docs/api/Dispatcher.md#dispatcherdestroyerror-callback-promise). ### `EnvHttpProxyAgent.connect(options[, callback])` -See [`Dispatcher.connect(options[, callback])`](Dispatcher.md#dispatcherconnectoptions-callback). +See [`Dispatcher.connect(options[, callback])`](/docs/docs/api/Dispatcher.md#dispatcherconnectoptions-callback). ### `EnvHttpProxyAgent.dispatch(options, handler)` -Implements [`Dispatcher.dispatch(options, handler)`](Dispatcher.md#dispatcherdispatchoptions-handler). +Implements [`Dispatcher.dispatch(options, handler)`](/docs/docs/api/Dispatcher.md#dispatcherdispatchoptions-handler). ### `EnvHttpProxyAgent.pipeline(options, handler)` -See [`Dispatcher.pipeline(options, handler)`](Dispatcher.md#dispatcherpipelineoptions-handler). +See [`Dispatcher.pipeline(options, handler)`](/docs/docs/api/Dispatcher.md#dispatcherpipelineoptions-handler). ### `EnvHttpProxyAgent.request(options[, callback])` -See [`Dispatcher.request(options [, callback])`](Dispatcher.md#dispatcherrequestoptions-callback). +See [`Dispatcher.request(options [, callback])`](/docs/docs/api/Dispatcher.md#dispatcherrequestoptions-callback). ### `EnvHttpProxyAgent.stream(options, factory[, callback])` -See [`Dispatcher.stream(options, factory[, callback])`](Dispatcher.md#dispatcherstreamoptions-factory-callback). +See [`Dispatcher.stream(options, factory[, callback])`](/docs/docs/api/Dispatcher.md#dispatcherstreamoptions-factory-callback). ### `EnvHttpProxyAgent.upgrade(options[, callback])` -See [`Dispatcher.upgrade(options[, callback])`](Dispatcher.md#dispatcherupgradeoptions-callback). +See [`Dispatcher.upgrade(options[, callback])`](/docs/docs/api/Dispatcher.md#dispatcherupgradeoptions-callback). diff --git a/deps/undici/src/docs/docs/api/MockAgent.md b/deps/undici/src/docs/docs/api/MockAgent.md index 85ae69046e73f9..70d479ac618668 100644 --- a/deps/undici/src/docs/docs/api/MockAgent.md +++ b/deps/undici/src/docs/docs/api/MockAgent.md @@ -14,10 +14,12 @@ Returns: `MockAgent` ### Parameter: `MockAgentOptions` -Extends: [`AgentOptions`](Agent.md#parameter-agentoptions) +Extends: [`AgentOptions`](/docs/docs/api/Agent.md#parameter-agentoptions) * **agent** `Agent` (optional) - Default: `new Agent([options])` - a custom agent encapsulated by the MockAgent. +* **ignoreTrailingSlash** `boolean` (optional) - Default: `false` - set the default value for `ignoreTrailingSlash` for interceptors. + ### Example - Basic MockAgent instantiation This will instantiate the MockAgent. It will not do anything until registered as the agent to use with requests and mock interceptions are added. @@ -299,11 +301,11 @@ await mockAgent.close() ### `MockAgent.dispatch(options, handlers)` -Implements [`Agent.dispatch(options, handlers)`](Agent.md#parameter-agentdispatchoptions). +Implements [`Agent.dispatch(options, handlers)`](/docs/docs/api/Agent.md#parameter-agentdispatchoptions). ### `MockAgent.request(options[, callback])` -See [`Dispatcher.request(options [, callback])`](Dispatcher.md#dispatcherrequestoptions-callback). +See [`Dispatcher.request(options [, callback])`](/docs/docs/api/Dispatcher.md#dispatcherrequestoptions-callback). #### Example - MockAgent request diff --git a/deps/undici/src/docs/docs/api/MockClient.md b/deps/undici/src/docs/docs/api/MockClient.md index ac546913d237d5..52ee3e33bdf9b8 100644 --- a/deps/undici/src/docs/docs/api/MockClient.md +++ b/deps/undici/src/docs/docs/api/MockClient.md @@ -2,7 +2,7 @@ Extends: `undici.Client` -A mock client class that implements the same api as [MockPool](MockPool.md). +A mock client class that implements the same api as [MockPool](/docs/docs/api/MockPool.md). ## `new MockClient(origin, [options])` @@ -36,19 +36,19 @@ const mockClient = mockAgent.get('http://localhost:3000') ### `MockClient.intercept(options)` -Implements: [`MockPool.intercept(options)`](MockPool.md#mockpoolinterceptoptions) +Implements: [`MockPool.intercept(options)`](/docs/docs/api/MockPool.md#mockpoolinterceptoptions) ### `MockClient.close()` -Implements: [`MockPool.close()`](MockPool.md#mockpoolclose) +Implements: [`MockPool.close()`](/docs/docs/api/MockPool.md#mockpoolclose) ### `MockClient.dispatch(options, handlers)` -Implements [`Dispatcher.dispatch(options, handlers)`](Dispatcher.md#dispatcherdispatchoptions-handler). +Implements [`Dispatcher.dispatch(options, handlers)`](/docs/docs/api/Dispatcher.md#dispatcherdispatchoptions-handler). ### `MockClient.request(options[, callback])` -See [`Dispatcher.request(options [, callback])`](Dispatcher.md#dispatcherrequestoptions-callback). +See [`Dispatcher.request(options [, callback])`](/docs/docs/api/Dispatcher.md#dispatcherrequestoptions-callback). #### Example - MockClient request diff --git a/deps/undici/src/docs/docs/api/MockPool.md b/deps/undici/src/docs/docs/api/MockPool.md index 96a986f57bb389..ff01b9a35ab945 100644 --- a/deps/undici/src/docs/docs/api/MockPool.md +++ b/deps/undici/src/docs/docs/api/MockPool.md @@ -58,6 +58,7 @@ Returns: `MockInterceptor` corresponding to the input options. * **body** `string | RegExp | (body: string) => boolean` - (optional) - a matcher for the HTTP request body. * **headers** `Record boolean`> - (optional) - a matcher for the HTTP request headers. To be intercepted, a request must match all defined headers. Extra headers not defined here may (or may not) be included in the request and do not affect the interception in any way. * **query** `Record | null` - (optional) - a matcher for the HTTP request query string params. Only applies when a `string` was provided for `MockPoolInterceptOptions.path`. +* **ignoreTrailingSlash** `boolean` - (optional) - set to `true` if the matcher should also match by ignoring potential trailing slashes in `MockPoolInterceptOptions.path`. ### Return: `MockInterceptor` @@ -81,7 +82,7 @@ By default, `reply` and `replyWithError` define the behaviour for the first matc ### Return: `MockScope` -A `MockScope` is associated with a single `MockInterceptor`. With this, we can configure the default behaviour of a intercepted reply. +A `MockScope` is associated with a single `MockInterceptor`. With this, we can configure the default behaviour of an intercepted reply. * **delay** `(waitInMs: number) => MockScope` - delay the associated reply by a set amount in ms. * **persist** `() => MockScope` - any matching request will always reply with the defined response indefinitely. @@ -511,11 +512,11 @@ await mockPool.close() ### `MockPool.dispatch(options, handlers)` -Implements [`Dispatcher.dispatch(options, handlers)`](Dispatcher.md#dispatcherdispatchoptions-handler). +Implements [`Dispatcher.dispatch(options, handlers)`](/docs/docs/api/Dispatcher.md#dispatcherdispatchoptions-handler). ### `MockPool.request(options[, callback])` -See [`Dispatcher.request(options [, callback])`](Dispatcher.md#dispatcherrequestoptions-callback). +See [`Dispatcher.request(options [, callback])`](/docs/docs/api/Dispatcher.md#dispatcherrequestoptions-callback). #### Example - MockPool request diff --git a/deps/undici/src/docs/docs/api/Pool.md b/deps/undici/src/docs/docs/api/Pool.md index 8fcabac31541d9..9c4328240af292 100644 --- a/deps/undici/src/docs/docs/api/Pool.md +++ b/deps/undici/src/docs/docs/api/Pool.md @@ -2,7 +2,7 @@ Extends: `undici.Dispatcher` -A pool of [Client](Client.md) instances connected to the same upstream target. +A pool of [Client](/docs/docs/api/Client.md) instances connected to the same upstream target. Requests are not guaranteed to be dispatched in order of invocation. @@ -15,21 +15,20 @@ Arguments: ### Parameter: `PoolOptions` -Extends: [`ClientOptions`](Client.md#parameter-clientoptions) +Extends: [`ClientOptions`](/docs/docs/api/Client.md#parameter-clientoptions) * **factory** `(origin: URL, opts: Object) => Dispatcher` - Default: `(origin, opts) => new Client(origin, opts)` * **connections** `number | null` (optional) - Default: `null` - The number of `Client` instances to create. When set to `null`, the `Pool` instance will create an unlimited amount of `Client` instances. -* **interceptors** `{ Pool: DispatchInterceptor[] } }` - Default: `{ Pool: [] }` - A list of interceptors that are applied to the dispatch method. Additional logic can be applied (such as, but not limited to: 302 status code handling, authentication, cookies, compression and caching). ## Instance Properties ### `Pool.closed` -Implements [Client.closed](Client.md#clientclosed) +Implements [Client.closed](/docs/docs/api/Client.md#clientclosed) ### `Pool.destroyed` -Implements [Client.destroyed](Client.md#clientdestroyed) +Implements [Client.destroyed](/docs/docs/api/Client.md#clientdestroyed) ### `Pool.stats` @@ -39,46 +38,46 @@ Returns [`PoolStats`](PoolStats.md) instance for this pool. ### `Pool.close([callback])` -Implements [`Dispatcher.close([callback])`](Dispatcher.md#dispatcherclosecallback-promise). +Implements [`Dispatcher.close([callback])`](/docs/docs/api/Dispatcher.md#dispatcherclosecallback-promise). ### `Pool.destroy([error, callback])` -Implements [`Dispatcher.destroy([error, callback])`](Dispatcher.md#dispatcherdestroyerror-callback-promise). +Implements [`Dispatcher.destroy([error, callback])`](/docs/docs/api/Dispatcher.md#dispatcherdestroyerror-callback-promise). ### `Pool.connect(options[, callback])` -See [`Dispatcher.connect(options[, callback])`](Dispatcher.md#dispatcherconnectoptions-callback). +See [`Dispatcher.connect(options[, callback])`](/docs/docs/api/Dispatcher.md#dispatcherconnectoptions-callback). ### `Pool.dispatch(options, handler)` -Implements [`Dispatcher.dispatch(options, handler)`](Dispatcher.md#dispatcherdispatchoptions-handler). +Implements [`Dispatcher.dispatch(options, handler)`](/docs/docs/api/Dispatcher.md#dispatcherdispatchoptions-handler). ### `Pool.pipeline(options, handler)` -See [`Dispatcher.pipeline(options, handler)`](Dispatcher.md#dispatcherpipelineoptions-handler). +See [`Dispatcher.pipeline(options, handler)`](/docs/docs/api/Dispatcher.md#dispatcherpipelineoptions-handler). ### `Pool.request(options[, callback])` -See [`Dispatcher.request(options [, callback])`](Dispatcher.md#dispatcherrequestoptions-callback). +See [`Dispatcher.request(options [, callback])`](/docs/docs/api/Dispatcher.md#dispatcherrequestoptions-callback). ### `Pool.stream(options, factory[, callback])` -See [`Dispatcher.stream(options, factory[, callback])`](Dispatcher.md#dispatcherstreamoptions-factory-callback). +See [`Dispatcher.stream(options, factory[, callback])`](/docs/docs/api/Dispatcher.md#dispatcherstreamoptions-factory-callback). ### `Pool.upgrade(options[, callback])` -See [`Dispatcher.upgrade(options[, callback])`](Dispatcher.md#dispatcherupgradeoptions-callback). +See [`Dispatcher.upgrade(options[, callback])`](/docs/docs/api/Dispatcher.md#dispatcherupgradeoptions-callback). ## Instance Events ### Event: `'connect'` -See [Dispatcher Event: `'connect'`](Dispatcher.md#event-connect). +See [Dispatcher Event: `'connect'`](/docs/docs/api/Dispatcher.md#event-connect). ### Event: `'disconnect'` -See [Dispatcher Event: `'disconnect'`](Dispatcher.md#event-disconnect). +See [Dispatcher Event: `'disconnect'`](/docs/docs/api/Dispatcher.md#event-disconnect). ### Event: `'drain'` -See [Dispatcher Event: `'drain'`](Dispatcher.md#event-drain). +See [Dispatcher Event: `'drain'`](/docs/docs/api/Dispatcher.md#event-drain). diff --git a/deps/undici/src/docs/docs/api/PoolStats.md b/deps/undici/src/docs/docs/api/PoolStats.md index 16b6dc25364a21..3cbe0d82e17a9a 100644 --- a/deps/undici/src/docs/docs/api/PoolStats.md +++ b/deps/undici/src/docs/docs/api/PoolStats.md @@ -1,6 +1,6 @@ # Class: PoolStats -Aggregate stats for a [Pool](Pool.md) or [BalancedPool](BalancedPool.md). +Aggregate stats for a [Pool](/docs/docs/api/Pool.md) or [BalancedPool](/docs/docs/api/BalancedPool.md). ## `new PoolStats(pool)` diff --git a/deps/undici/src/docs/docs/api/ProxyAgent.md b/deps/undici/src/docs/docs/api/ProxyAgent.md index 17f3f4b6798bb7..932716ae7957b9 100644 --- a/deps/undici/src/docs/docs/api/ProxyAgent.md +++ b/deps/undici/src/docs/docs/api/ProxyAgent.md @@ -14,7 +14,8 @@ Returns: `ProxyAgent` ### Parameter: `ProxyAgentOptions` -Extends: [`AgentOptions`](Agent.md#parameter-agentoptions) +Extends: [`AgentOptions`](/docs/docs/api/Agent.md#parameter-agentoptions) +> It ommits `AgentOptions#connect`. * **uri** `string | URL` (required) - The URI of the proxy server. This can be provided as a string, as an instance of the URL class, or as an object with a `uri` property of type string. If the `uri` is provided as a string or `uri` is an object with an `uri` property of type string, then it will be parsed into a `URL` object according to the [WHATWG URL Specification](https://url.spec.whatwg.org). @@ -22,8 +23,8 @@ For detailed information on the parsing process and potential validation errors, * **token** `string` (optional) - It can be passed by a string of token for authentication. * **auth** `string` (**deprecated**) - Use token. * **clientFactory** `(origin: URL, opts: Object) => Dispatcher` (optional) - Default: `(origin, opts) => new Pool(origin, opts)` -* **requestTls** `BuildOptions` (optional) - Options object passed when creating the underlying socket via the connector builder for the request. See [TLS](https://nodejs.org/api/tls.html#tlsconnectoptions-callback). -* **proxyTls** `BuildOptions` (optional) - Options object passed when creating the underlying socket via the connector builder for the proxy server. See [TLS](https://nodejs.org/api/tls.html#tlsconnectoptions-callback). +* **requestTls** `BuildOptions` (optional) - Options object passed when creating the underlying socket via the connector builder for the request. It extends from [`Client#ConnectOptions`](/docs/docs/api/Client.md#parameter-connectoptions). +* **proxyTls** `BuildOptions` (optional) - Options object passed when creating the underlying socket via the connector builder for the proxy server. It extends from [`Client#ConnectOptions`](/docs/docs/api/Client.md#parameter-connectoptions). Examples: @@ -35,6 +36,13 @@ const proxyAgent = new ProxyAgent('my.proxy.server') const proxyAgent = new ProxyAgent(new URL('my.proxy.server')) // or const proxyAgent = new ProxyAgent({ uri: 'my.proxy.server' }) +// or +const proxyAgent = new ProxyAgent({ + uri: new URL('my.proxy.server'), + proxyTls: { + signal: AbortSignal.timeout(1000) + } +}) ``` #### Example - Basic ProxyAgent instantiation @@ -123,8 +131,96 @@ await proxyAgent.close() ### `ProxyAgent.dispatch(options, handlers)` -Implements [`Agent.dispatch(options, handlers)`](Agent.md#parameter-agentdispatchoptions). +Implements [`Agent.dispatch(options, handlers)`](/docs/docs/api/Agent.md#parameter-agentdispatchoptions). ### `ProxyAgent.request(options[, callback])` -See [`Dispatcher.request(options [, callback])`](Dispatcher.md#dispatcherrequestoptions-callback). +See [`Dispatcher.request(options [, callback])`](/docs/docs/api/Dispatcher.md#dispatcherrequestoptions-callback). + + +#### Example - ProxyAgent with Fetch + +This example demonstrates how to use `fetch` with a proxy via `ProxyAgent`. It is particularly useful for scenarios requiring proxy tunneling. + +```javascript +import { ProxyAgent, fetch } from 'undici'; + +// Define the ProxyAgent +const proxyAgent = new ProxyAgent('http://localhost:8000'); + +// Make a GET request through the proxy +const response = await fetch('http://localhost:3000/foo', { + dispatcher: proxyAgent, + method: 'GET', +}); + +console.log('Response status:', response.status); +console.log('Response data:', await response.text()); +``` + +--- + +#### Example - ProxyAgent with a Custom Proxy Server + +This example shows how to create a custom proxy server and use it with `ProxyAgent`. + +```javascript +import * as http from 'node:http'; +import { createProxy } from 'proxy'; +import { ProxyAgent, fetch } from 'undici'; + +// Create a proxy server +const proxyServer = createProxy(http.createServer()); +proxyServer.listen(8000, () => { + console.log('Proxy server running on port 8000'); +}); + +// Define and use the ProxyAgent +const proxyAgent = new ProxyAgent('http://localhost:8000'); + +const response = await fetch('http://example.com', { + dispatcher: proxyAgent, + method: 'GET', +}); + +console.log('Response status:', response.status); +console.log('Response data:', await response.text()); +``` + +--- + +#### Example - ProxyAgent with HTTPS Tunneling + +This example demonstrates how to perform HTTPS tunneling using a proxy. + +```javascript +import { ProxyAgent, fetch } from 'undici'; + +// Define a ProxyAgent for HTTPS proxy +const proxyAgent = new ProxyAgent('https://secure.proxy.server'); + +// Make a request to an HTTPS endpoint via the proxy +const response = await fetch('https://secure.endpoint.com/api/data', { + dispatcher: proxyAgent, + method: 'GET', +}); + +console.log('Response status:', response.status); +console.log('Response data:', await response.json()); +``` + +#### Example - ProxyAgent as a Global Dispatcher + +`ProxyAgent` can be configured as a global dispatcher, making it available for all requests without explicitly passing it. This simplifies code and is useful when a single proxy configuration applies to all requests. + +```javascript +import { ProxyAgent, setGlobalDispatcher, fetch } from 'undici'; + +// Define and configure the ProxyAgent +const proxyAgent = new ProxyAgent('http://localhost:8000'); +setGlobalDispatcher(proxyAgent); + +// Make requests without specifying the dispatcher +const response = await fetch('http://example.com'); +console.log('Response status:', response.status); +console.log('Response data:', await response.text()); diff --git a/deps/undici/src/docs/docs/api/RedirectHandler.md b/deps/undici/src/docs/docs/api/RedirectHandler.md index 90a937e7c13b94..bb16284fff4c8d 100644 --- a/deps/undici/src/docs/docs/api/RedirectHandler.md +++ b/deps/undici/src/docs/docs/api/RedirectHandler.md @@ -16,7 +16,7 @@ Returns: `RedirectHandler` ### Parameters -- **dispatch** `(options: Dispatch.DispatchOptions, handlers: Dispatch.DispatchHandlers) => Promise` (required) - Dispatch function to be called after every redirection. +- **dispatch** `(options: Dispatch.DispatchOptions, handlers: Dispatch.DispatchHandler) => Promise` (required) - Dispatch function to be called after every redirection. - **maxRedirections** `number` (required) - Maximum number of redirections allowed. - **opts** `object` (required) - Options for handling redirection. - **handler** `object` (required) - Handlers for different stages of the request lifecycle. diff --git a/deps/undici/src/docs/docs/api/RetryAgent.md b/deps/undici/src/docs/docs/api/RetryAgent.md index 53ce52313156d3..2d9200fd30f594 100644 --- a/deps/undici/src/docs/docs/api/RetryAgent.md +++ b/deps/undici/src/docs/docs/api/RetryAgent.md @@ -40,6 +40,6 @@ import { Agent, RetryAgent } from 'undici' const agent = new RetryAgent(new Agent()) const res = await agent.request('http://example.com') -console.log(res.statuCode) +console.log(res.statusCode) console.log(await res.body.text()) ``` diff --git a/deps/undici/src/docs/docs/api/RetryHandler.md b/deps/undici/src/docs/docs/api/RetryHandler.md index 0dd9f29533f861..04a621de33c17b 100644 --- a/deps/undici/src/docs/docs/api/RetryHandler.md +++ b/deps/undici/src/docs/docs/api/RetryHandler.md @@ -15,7 +15,7 @@ Returns: `retryHandler` ### Parameter: `Dispatch.DispatchOptions & RetryOptions` -Extends: [`Dispatch.DispatchOptions`](Dispatcher.md#parameter-dispatchoptions). +Extends: [`Dispatch.DispatchOptions`](/docs/docs/api/Dispatcher.md#parameter-dispatchoptions). #### `RetryOptions` @@ -43,10 +43,10 @@ It represents the retry state for a given request. ### Parameter `RetryHandlers` -- **dispatch** `(options: Dispatch.DispatchOptions, handlers: Dispatch.DispatchHandlers) => Promise` (required) - Dispatch function to be called after every retry. -- **handler** Extends [`Dispatch.DispatchHandlers`](Dispatcher.md#dispatcherdispatchoptions-handler) (required) - Handler function to be called after the request is successful or the retries are exhausted. +- **dispatch** `(options: Dispatch.DispatchOptions, handlers: Dispatch.DispatchHandler) => Promise` (required) - Dispatch function to be called after every retry. +- **handler** Extends [`Dispatch.DispatchHandler`](/docs/docs/api/Dispatcher.md#dispatcherdispatchoptions-handler) (required) - Handler function to be called after the request is successful or the retries are exhausted. ->__Note__: The `RetryHandler` does not retry over stateful bodies (e.g. streams, AsyncIterable) as those, once consumed, are left in an state that cannot be reutilized. For these situations the `RetryHandler` will identify +>__Note__: The `RetryHandler` does not retry over stateful bodies (e.g. streams, AsyncIterable) as those, once consumed, are left in a state that cannot be reutilized. For these situations the `RetryHandler` will identify >the body as stateful and will not retry the request rejecting with the error `UND_ERR_REQ_RETRY`. Examples: diff --git a/deps/undici/src/docs/docs/api/WebSocket.md b/deps/undici/src/docs/docs/api/WebSocket.md index 9d374f4046c4ed..6f6836fd6ee25b 100644 --- a/deps/undici/src/docs/docs/api/WebSocket.md +++ b/deps/undici/src/docs/docs/api/WebSocket.md @@ -1,7 +1,5 @@ # Class: WebSocket -> ⚠️ Warning: the WebSocket API is experimental. - Extends: [`EventTarget`](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget) The WebSocket object provides a way to manage a WebSocket connection to a server, allowing bidirectional communication. The API follows the [WebSocket spec](https://developer.mozilla.org/en-US/docs/Web/API/WebSocket) and [RFC 6455](https://datatracker.ietf.org/doc/html/rfc6455). @@ -10,8 +8,8 @@ The WebSocket object provides a way to manage a WebSocket connection to a server Arguments: -* **url** `URL | string` - The url's protocol *must* be `ws` or `wss`. -* **protocol** `string | string[] | WebSocketInit` (optional) - Subprotocol(s) to request the server use, or a [`Dispatcher`](./Dispatcher.md). +* **url** `URL | string` +* **protocol** `string | string[] | WebSocketInit` (optional) - Subprotocol(s) to request the server use, or a [`Dispatcher`](/docs/docs/api/Dispatcher.md). ### Example: @@ -36,6 +34,50 @@ import { WebSocket } from 'undici' const ws = new WebSocket('wss://echo.websocket.events', ['echo', 'chat']) ``` +# Class: WebSocketStream + +> ⚠️ Warning: the WebSocketStream API has not been finalized and is likely to change. + +See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/WebSocketStream) for more information. + +## `new WebSocketStream(url[, protocol])` + +Arguments: + +* **url** `URL | string` +* **options** `WebSocketStreamOptions` (optional) + +### WebSocketStream Example + +```js +const stream = new WebSocketStream('https://echo.websocket.org/') +const { readable, writable } = await stream.opened + +async function read () { + /** @type {ReadableStreamReader} */ + const reader = readable.getReader() + + while (true) { + const { done, value } = await reader.read() + if (done) break + + // do something with value + } +} + +async function write () { + /** @type {WritableStreamDefaultWriter} */ + const writer = writable.getWriter() + writer.write('Hello, world!') + writer.releaseLock() +} + +read() + +setInterval(() => write(), 5000) + +``` + ## Read More - [MDN - WebSocket](https://developer.mozilla.org/en-US/docs/Web/API/WebSocket) diff --git a/deps/undici/src/docs/docs/api/api-lifecycle.md b/deps/undici/src/docs/docs/api/api-lifecycle.md index 2e7db25d132a1e..ee08292cc7d37a 100644 --- a/deps/undici/src/docs/docs/api/api-lifecycle.md +++ b/deps/undici/src/docs/docs/api/api-lifecycle.md @@ -1,6 +1,6 @@ # Client Lifecycle -An Undici [Client](Client.md) can be best described as a state machine. The following list is a summary of the various state transitions the `Client` will go through in its lifecycle. This document also contains detailed breakdowns of each state. +An Undici [Client](/docs/docs/api/Client.md) can be best described as a state machine. The following list is a summary of the various state transitions the `Client` will go through in its lifecycle. This document also contains detailed breakdowns of each state. > This diagram is not a perfect representation of the undici Client. Since the Client class is not actually implemented as a state-machine, actual execution may deviate slightly from what is described below. Consider this as a general resource for understanding the inner workings of the Undici client rather than some kind of formal specification. @@ -28,7 +28,7 @@ stateDiagram-v2 [*] --> idle idle --> pending : connect idle --> destroyed : destroy/close - + pending --> idle : timeout pending --> destroyed : destroy @@ -58,33 +58,33 @@ stateDiagram-v2 ### idle -The **idle** state is the initial state of a `Client` instance. While an `origin` is required for instantiating a `Client` instance, the underlying socket connection will not be established until a request is queued using [`Client.dispatch()`](Client.md#clientdispatchoptions-handlers). By calling `Client.dispatch()` directly or using one of the multiple implementations ([`Client.connect()`](Client.md#clientconnectoptions-callback), [`Client.pipeline()`](Client.md#clientpipelineoptions-handler), [`Client.request()`](Client.md#clientrequestoptions-callback), [`Client.stream()`](Client.md#clientstreamoptions-factory-callback), and [`Client.upgrade()`](Client.md#clientupgradeoptions-callback)), the `Client` instance will transition from **idle** to [**pending**](#pending) and then most likely directly to [**processing**](#processing). +The **idle** state is the initial state of a `Client` instance. While an `origin` is required for instantiating a `Client` instance, the underlying socket connection will not be established until a request is queued using [`Client.dispatch()`](/docs/docs/api/Client.md#clientdispatchoptions-handlers). By calling `Client.dispatch()` directly or using one of the multiple implementations ([`Client.connect()`](Client.md#clientconnectoptions-callback), [`Client.pipeline()`](Client.md#clientpipelineoptions-handler), [`Client.request()`](Client.md#clientrequestoptions-callback), [`Client.stream()`](Client.md#clientstreamoptions-factory-callback), and [`Client.upgrade()`](/docs/docs/api/Client.md#clientupgradeoptions-callback)), the `Client` instance will transition from **idle** to [**pending**](/docs/docs/api/Client.md#pending) and then most likely directly to [**processing**](/docs/docs/api/Client.md#processing). -Calling [`Client.close()`](Client.md#clientclosecallback) or [`Client.destroy()`](Client.md#clientdestroyerror-callback) transitions directly to the [**destroyed**](#destroyed) state since the `Client` instance will have no queued requests in this state. +Calling [`Client.close()`](/docs/docs/api/Client.md#clientclosecallback) or [`Client.destroy()`](Client.md#clientdestroyerror-callback) transitions directly to the [**destroyed**](/docs/docs/api/Client.md#destroyed) state since the `Client` instance will have no queued requests in this state. ### pending -The **pending** state signifies a non-processing `Client`. Upon entering this state, the `Client` establishes a socket connection and emits the [`'connect'`](Client.md#event-connect) event signalling a connection was successfully established with the `origin` provided during `Client` instantiation. The internal queue is initially empty, and requests can start queueing. +The **pending** state signifies a non-processing `Client`. Upon entering this state, the `Client` establishes a socket connection and emits the [`'connect'`](/docs/docs/api/Client.md#event-connect) event signalling a connection was successfully established with the `origin` provided during `Client` instantiation. The internal queue is initially empty, and requests can start queueing. -Calling [`Client.close()`](Client.md#clientclosecallback) with queued requests, transitions the `Client` to the [**processing**](#processing) state. Without queued requests, it transitions to the [**destroyed**](#destroyed) state. +Calling [`Client.close()`](/docs/docs/api/Client.md#clientclosecallback) with queued requests, transitions the `Client` to the [**processing**](/docs/docs/api/Client.md#processing) state. Without queued requests, it transitions to the [**destroyed**](/docs/docs/api/Client.md#destroyed) state. -Calling [`Client.destroy()`](Client.md#clientdestroyerror-callback) transitions directly to the [**destroyed**](#destroyed) state regardless of existing requests. +Calling [`Client.destroy()`](/docs/docs/api/Client.md#clientdestroyerror-callback) transitions directly to the [**destroyed**](/docs/docs/api/Client.md#destroyed) state regardless of existing requests. ### processing -The **processing** state is a state machine within itself. It initializes to the [**processing.running**](#running) state. The [`Client.dispatch()`](Client.md#clientdispatchoptions-handlers), [`Client.close()`](Client.md#clientclosecallback), and [`Client.destroy()`](Client.md#clientdestroyerror-callback) can be called at any time while the `Client` is in this state. `Client.dispatch()` will add more requests to the queue while existing requests continue to be processed. `Client.close()` will transition to the [**processing.closing**](#closing) state. And `Client.destroy()` will transition to [**destroyed**](#destroyed). +The **processing** state is a state machine within itself. It initializes to the [**processing.running**](/docs/docs/api/Client.md#running) state. The [`Client.dispatch()`](/docs/docs/api/Client.md#clientdispatchoptions-handlers), [`Client.close()`](Client.md#clientclosecallback), and [`Client.destroy()`](Client.md#clientdestroyerror-callback) can be called at any time while the `Client` is in this state. `Client.dispatch()` will add more requests to the queue while existing requests continue to be processed. `Client.close()` will transition to the [**processing.closing**](/docs/docs/api/Client.md#closing) state. And `Client.destroy()` will transition to [**destroyed**](/docs/docs/api/Client.md#destroyed). #### running -In the **processing.running** sub-state, queued requests are being processed in a FIFO order. If a request body requires draining, the *needDrain* event transitions to the [**processing.busy**](#busy) sub-state. The *close* event transitions the Client to the [**process.closing**](#closing) sub-state. If all queued requests are processed and neither [`Client.close()`](Client.md#clientclosecallback) nor [`Client.destroy()`](Client.md#clientdestroyerror-callback) are called, then the [**processing**](#processing) machine will trigger a *keepalive* event transitioning the `Client` back to the [**pending**](#pending) state. During this time, the `Client` is waiting for the socket connection to timeout, and once it does, it triggers the *timeout* event and transitions to the [**idle**](#idle) state. +In the **processing.running** sub-state, queued requests are being processed in a FIFO order. If a request body requires draining, the *needDrain* event transitions to the [**processing.busy**](/docs/docs/api/Client.md#busy) sub-state. The *close* event transitions the Client to the [**process.closing**](/docs/docs/api/Client.md#closing) sub-state. If all queued requests are processed and neither [`Client.close()`](/docs/docs/api/Client.md#clientclosecallback) nor [`Client.destroy()`](Client.md#clientdestroyerror-callback) are called, then the [**processing**](/docs/docs/api/Client.md#processing) machine will trigger a *keepalive* event transitioning the `Client` back to the [**pending**](/docs/docs/api/Client.md#pending) state. During this time, the `Client` is waiting for the socket connection to timeout, and once it does, it triggers the *timeout* event and transitions to the [**idle**](/docs/docs/api/Client.md#idle) state. #### busy -This sub-state is only entered when a request body is an instance of [Stream](https://nodejs.org/api/stream.html) and requires draining. The `Client` cannot process additional requests while in this state and must wait until the currently processing request body is completely drained before transitioning back to [**processing.running**](#running). +This sub-state is only entered when a request body is an instance of [Stream](https://nodejs.org/api/stream.html) and requires draining. The `Client` cannot process additional requests while in this state and must wait until the currently processing request body is completely drained before transitioning back to [**processing.running**](/docs/docs/api/Client.md#running). #### closing -This sub-state is only entered when a `Client` instance has queued requests and the [`Client.close()`](Client.md#clientclosecallback) method is called. In this state, the `Client` instance continues to process requests as usual, with the one exception that no additional requests can be queued. Once all of the queued requests are processed, the `Client` will trigger the *done* event gracefully entering the [**destroyed**](#destroyed) state without an error. +This sub-state is only entered when a `Client` instance has queued requests and the [`Client.close()`](/docs/docs/api/Client.md#clientclosecallback) method is called. In this state, the `Client` instance continues to process requests as usual, with the one exception that no additional requests can be queued. Once all of the queued requests are processed, the `Client` will trigger the *done* event gracefully entering the [**destroyed**](/docs/docs/api/Client.md#destroyed) state without an error. ### destroyed diff --git a/deps/undici/src/docs/docs/best-practices/mocking-request.md b/deps/undici/src/docs/docs/best-practices/mocking-request.md index 695439274449a5..68831931ae85a5 100644 --- a/deps/undici/src/docs/docs/best-practices/mocking-request.md +++ b/deps/undici/src/docs/docs/best-practices/mocking-request.md @@ -1,6 +1,6 @@ # Mocking Request -Undici has its own mocking [utility](../api/MockAgent.md). It allow us to intercept undici HTTP requests and return mocked values instead. It can be useful for testing purposes. +Undici has its own mocking [utility](/docs/docs/api/MockAgent.md). It allow us to intercept undici HTTP requests and return mocked values instead. It can be useful for testing purposes. Example: @@ -73,7 +73,7 @@ const badRequest = await bankTransfer('1234567890', '100') assert.deepEqual(badRequest, { message: 'bank account not found' }) ``` -Explore other MockAgent functionality [here](../api/MockAgent.md) +Explore other MockAgent functionality [here](/docs/docs/api/MockAgent.md) ## Debug Mock Value diff --git a/deps/undici/src/docs/docs/best-practices/proxy.md b/deps/undici/src/docs/docs/best-practices/proxy.md index 5764ff38b3c677..8b1a7210e8c8b6 100644 --- a/deps/undici/src/docs/docs/best-practices/proxy.md +++ b/deps/undici/src/docs/docs/best-practices/proxy.md @@ -2,7 +2,7 @@ Connecting through a proxy is possible by: -- Using [ProxyAgent](../api/ProxyAgent.md). +- Using [ProxyAgent](/docs/docs/api/ProxyAgent.md). - Configuring `Client` or `Pool` constructor. The proxy url should be passed to the `Client` or `Pool` constructor, while the upstream server url diff --git a/deps/undici/src/eslint.config.js b/deps/undici/src/eslint.config.js new file mode 100644 index 00000000000000..3c0cbc1c927c18 --- /dev/null +++ b/deps/undici/src/eslint.config.js @@ -0,0 +1,28 @@ +'use strict' + +const neo = require('neostandard') + +module.exports = [ + ...neo({ + ignores: [ + 'lib/llhttp', + 'test/fixtures/wpt', + 'test/fixtures/cache-tests', + 'undici-fetch.js' + ], + noJsx: true, + ts: true + }), + { + rules: { + '@stylistic/comma-dangle': ['error', { + arrays: 'never', + objects: 'never', + imports: 'never', + exports: 'never', + functions: 'never' + }], + '@typescript-eslint/no-redeclare': 'off' + } + } +] diff --git a/deps/undici/src/index.d.ts b/deps/undici/src/index.d.ts index 83a786d6a03131..0883fc7cc37e78 100644 --- a/deps/undici/src/index.d.ts +++ b/deps/undici/src/index.d.ts @@ -1,3 +1,3 @@ -export * from './types/index' import Undici from './types/index' export default Undici +export * from './types/index' diff --git a/deps/undici/src/index.js b/deps/undici/src/index.js index 7a68d04abb358c..f31e10e91149d3 100644 --- a/deps/undici/src/index.js +++ b/deps/undici/src/index.js @@ -21,7 +21,6 @@ const RetryHandler = require('./lib/handler/retry-handler') const { getGlobalDispatcher, setGlobalDispatcher } = require('./lib/global') const DecoratorHandler = require('./lib/handler/decorator-handler') const RedirectHandler = require('./lib/handler/redirect-handler') -const createRedirectInterceptor = require('./lib/interceptor/redirect-interceptor') Object.assign(Dispatcher.prototype, api) @@ -37,13 +36,22 @@ module.exports.RetryHandler = RetryHandler module.exports.DecoratorHandler = DecoratorHandler module.exports.RedirectHandler = RedirectHandler -module.exports.createRedirectInterceptor = createRedirectInterceptor module.exports.interceptors = { redirect: require('./lib/interceptor/redirect'), + responseError: require('./lib/interceptor/response-error'), retry: require('./lib/interceptor/retry'), - dump: require('./lib/interceptor/dump') + dump: require('./lib/interceptor/dump'), + dns: require('./lib/interceptor/dns'), + cache: require('./lib/interceptor/cache') } +module.exports.cacheStores = { + MemoryCacheStore: require('./lib/cache/memory-cache-store') +} + +const SqliteCacheStore = require('./lib/cache/sqlite-cache-store') +module.exports.cacheStores.SqliteCacheStore = SqliteCacheStore + module.exports.buildConnector = buildConnector module.exports.errors = errors module.exports.util = { @@ -119,8 +127,6 @@ module.exports.Headers = require('./lib/web/fetch/headers').Headers module.exports.Response = require('./lib/web/fetch/response').Response module.exports.Request = require('./lib/web/fetch/request').Request module.exports.FormData = require('./lib/web/fetch/formdata').FormData -module.exports.File = globalThis.File ?? require('node:buffer').File -module.exports.FileReader = require('./lib/web/fileapi/filereader').FileReader const { setGlobalOrigin, getGlobalOrigin } = require('./lib/web/fetch/global') @@ -128,18 +134,19 @@ module.exports.setGlobalOrigin = setGlobalOrigin module.exports.getGlobalOrigin = getGlobalOrigin const { CacheStorage } = require('./lib/web/cache/cachestorage') -const { kConstruct } = require('./lib/web/cache/symbols') +const { kConstruct } = require('./lib/core/symbols') // Cache & CacheStorage are tightly coupled with fetch. Even if it may run // in an older version of Node, it doesn't have any use without fetch. module.exports.caches = new CacheStorage(kConstruct) -const { deleteCookie, getCookies, getSetCookies, setCookie } = require('./lib/web/cookies') +const { deleteCookie, getCookies, getSetCookies, setCookie, parseCookie } = require('./lib/web/cookies') module.exports.deleteCookie = deleteCookie module.exports.getCookies = getCookies module.exports.getSetCookies = getSetCookies module.exports.setCookie = setCookie +module.exports.parseCookie = parseCookie const { parseMIMEType, serializeAMimeType } = require('./lib/web/fetch/data-url') @@ -152,6 +159,9 @@ module.exports.CloseEvent = CloseEvent module.exports.ErrorEvent = ErrorEvent module.exports.MessageEvent = MessageEvent +module.exports.WebSocketStream = require('./lib/web/websocket/stream/websocketstream').WebSocketStream +module.exports.WebSocketError = require('./lib/web/websocket/stream/websocketerror').WebSocketError + module.exports.request = makeDispatcher(api.request) module.exports.stream = makeDispatcher(api.stream) module.exports.pipeline = makeDispatcher(api.pipeline) diff --git a/deps/undici/src/lib/api/abort-signal.js b/deps/undici/src/lib/api/abort-signal.js index 2afe747d3a1075..608170b4316560 100644 --- a/deps/undici/src/lib/api/abort-signal.js +++ b/deps/undici/src/lib/api/abort-signal.js @@ -1,3 +1,5 @@ +'use strict' + const { addAbortListener } = require('../core/util') const { RequestAbortedError } = require('../core/errors') diff --git a/deps/undici/src/lib/api/api-connect.js b/deps/undici/src/lib/api/api-connect.js index f9dbbf64fe8074..c8b86dd7d53416 100644 --- a/deps/undici/src/lib/api/api-connect.js +++ b/deps/undici/src/lib/api/api-connect.js @@ -95,7 +95,9 @@ function connect (opts, callback) { try { const connectHandler = new ConnectHandler(opts, callback) - this.dispatch({ ...opts, method: 'CONNECT' }, connectHandler) + const connectOptions = { ...opts, method: 'CONNECT' } + + this.dispatch(connectOptions, connectHandler) } catch (err) { if (typeof callback !== 'function') { throw err diff --git a/deps/undici/src/lib/api/api-pipeline.js b/deps/undici/src/lib/api/api-pipeline.js index e64b329496580a..77f3520a83f04c 100644 --- a/deps/undici/src/lib/api/api-pipeline.js +++ b/deps/undici/src/lib/api/api-pipeline.js @@ -5,15 +5,17 @@ const { Duplex, PassThrough } = require('node:stream') +const assert = require('node:assert') +const { AsyncResource } = require('node:async_hooks') const { InvalidArgumentError, InvalidReturnValueError, RequestAbortedError } = require('../core/errors') const util = require('../core/util') -const { AsyncResource } = require('node:async_hooks') const { addSignal, removeSignal } = require('./abort-signal') -const assert = require('node:assert') + +function noop () {} const kResume = Symbol('resume') @@ -92,7 +94,7 @@ class PipelineHandler extends AsyncResource { this.context = null this.onInfo = onInfo || null - this.req = new PipelineRequest().on('error', util.nop) + this.req = new PipelineRequest().on('error', noop) this.ret = new Duplex({ readableObjectMode: opts.objectMode, @@ -145,7 +147,7 @@ class PipelineHandler extends AsyncResource { } onConnect (abort, context) { - const { ret, res } = this + const { res } = this if (this.reason) { abort(this.reason) @@ -153,7 +155,6 @@ class PipelineHandler extends AsyncResource { } assert(!res, 'pipeline cannot be retried') - assert(!ret.destroyed) this.abort = abort this.context = context @@ -184,7 +185,7 @@ class PipelineHandler extends AsyncResource { context }) } catch (err) { - this.res.on('error', util.nop) + this.res.on('error', noop) throw err } diff --git a/deps/undici/src/lib/api/api-request.js b/deps/undici/src/lib/api/api-request.js index ced5590d21053d..9ae7ed6c740949 100644 --- a/deps/undici/src/lib/api/api-request.js +++ b/deps/undici/src/lib/api/api-request.js @@ -1,11 +1,12 @@ 'use strict' const assert = require('node:assert') +const { AsyncResource } = require('node:async_hooks') const { Readable } = require('./readable') const { InvalidArgumentError, RequestAbortedError } = require('../core/errors') const util = require('../core/util') -const { getResolveErrorBodyCallback } = require('./util') -const { AsyncResource } = require('node:async_hooks') + +function noop () {} class RequestHandler extends AsyncResource { constructor (opts, callback) { @@ -13,7 +14,7 @@ class RequestHandler extends AsyncResource { throw new InvalidArgumentError('invalid opts') } - const { signal, method, opaque, body, onInfo, responseHeaders, throwOnError, highWaterMark } = opts + const { signal, method, opaque, body, onInfo, responseHeaders, highWaterMark } = opts try { if (typeof callback !== 'function') { @@ -39,7 +40,7 @@ class RequestHandler extends AsyncResource { super('UNDICI_REQUEST') } catch (err) { if (util.isStream(body)) { - util.destroy(body.on('error', util.nop), err) + util.destroy(body.on('error', noop), err) } throw err } @@ -54,38 +55,22 @@ class RequestHandler extends AsyncResource { this.trailers = {} this.context = null this.onInfo = onInfo || null - this.throwOnError = throwOnError this.highWaterMark = highWaterMark - this.signal = signal this.reason = null this.removeAbortListener = null - if (util.isStream(body)) { - body.on('error', (err) => { - this.onError(err) + if (signal?.aborted) { + this.reason = signal.reason ?? new RequestAbortedError() + } else if (signal) { + this.removeAbortListener = util.addAbortListener(signal, () => { + this.reason = signal.reason ?? new RequestAbortedError() + if (this.res) { + util.destroy(this.res.on('error', noop), this.reason) + } else if (this.abort) { + this.abort(this.reason) + } }) } - - if (this.signal) { - if (this.signal.aborted) { - this.reason = this.signal.reason ?? new RequestAbortedError() - } else { - this.removeAbortListener = util.addAbortListener(this.signal, () => { - this.reason = this.signal.reason ?? new RequestAbortedError() - if (this.res) { - util.destroy(this.res, this.reason) - } else if (this.abort) { - this.abort(this.reason) - } - - if (this.removeAbortListener) { - this.res?.off('close', this.removeAbortListener) - this.removeAbortListener() - this.removeAbortListener = null - } - }) - } - } } onConnect (abort, context) { @@ -127,25 +112,20 @@ class RequestHandler extends AsyncResource { if (this.removeAbortListener) { res.on('close', this.removeAbortListener) + this.removeAbortListener = null } this.callback = null this.res = res if (callback !== null) { - if (this.throwOnError && statusCode >= 400) { - this.runInAsyncScope(getResolveErrorBodyCallback, null, - { callback, body: res, contentType, statusCode, statusMessage, headers } - ) - } else { - this.runInAsyncScope(callback, null, null, { - statusCode, - headers, - trailers: this.trailers, - opaque, - body: res, - context - }) - } + this.runInAsyncScope(callback, null, null, { + statusCode, + headers, + trailers: this.trailers, + opaque, + body: res, + context + }) } } @@ -173,17 +153,20 @@ class RequestHandler extends AsyncResource { this.res = null // Ensure all queued handlers are invoked before destroying res. queueMicrotask(() => { - util.destroy(res, err) + util.destroy(res.on('error', noop), err) }) } if (body) { this.body = null - util.destroy(body, err) + + if (util.isStream(body)) { + body.on('error', noop) + util.destroy(body, err) + } } if (this.removeAbortListener) { - res?.off('close', this.removeAbortListener) this.removeAbortListener() this.removeAbortListener = null } @@ -200,7 +183,9 @@ function request (opts, callback) { } try { - this.dispatch(opts, new RequestHandler(opts, callback)) + const handler = new RequestHandler(opts, callback) + + this.dispatch(opts, handler) } catch (err) { if (typeof callback !== 'function') { throw err diff --git a/deps/undici/src/lib/api/api-stream.js b/deps/undici/src/lib/api/api-stream.js index fba2266dd7d99b..eb927336a3fb48 100644 --- a/deps/undici/src/lib/api/api-stream.js +++ b/deps/undici/src/lib/api/api-stream.js @@ -1,20 +1,21 @@ 'use strict' const assert = require('node:assert') -const { finished, PassThrough } = require('node:stream') +const { finished } = require('node:stream') +const { AsyncResource } = require('node:async_hooks') const { InvalidArgumentError, InvalidReturnValueError } = require('../core/errors') const util = require('../core/util') -const { getResolveErrorBodyCallback } = require('./util') -const { AsyncResource } = require('node:async_hooks') const { addSignal, removeSignal } = require('./abort-signal') +function noop () {} + class StreamHandler extends AsyncResource { constructor (opts, factory, callback) { if (!opts || typeof opts !== 'object') { throw new InvalidArgumentError('invalid opts') } - const { signal, method, opaque, body, onInfo, responseHeaders, throwOnError } = opts + const { signal, method, opaque, body, onInfo, responseHeaders } = opts try { if (typeof callback !== 'function') { @@ -40,7 +41,7 @@ class StreamHandler extends AsyncResource { super('UNDICI_STREAM') } catch (err) { if (util.isStream(body)) { - util.destroy(body.on('error', util.nop), err) + util.destroy(body.on('error', noop), err) } throw err } @@ -55,7 +56,6 @@ class StreamHandler extends AsyncResource { this.trailers = null this.body = body this.onInfo = onInfo || null - this.throwOnError = throwOnError || false if (util.isStream(body)) { body.on('error', (err) => { @@ -79,7 +79,7 @@ class StreamHandler extends AsyncResource { } onHeaders (statusCode, rawHeaders, resume, statusMessage) { - const { factory, opaque, context, callback, responseHeaders } = this + const { factory, opaque, context, responseHeaders } = this const headers = responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders) @@ -92,55 +92,42 @@ class StreamHandler extends AsyncResource { this.factory = null - let res + if (factory === null) { + return + } - if (this.throwOnError && statusCode >= 400) { - const parsedHeaders = responseHeaders === 'raw' ? util.parseHeaders(rawHeaders) : headers - const contentType = parsedHeaders['content-type'] - res = new PassThrough() + const res = this.runInAsyncScope(factory, null, { + statusCode, + headers, + opaque, + context + }) - this.callback = null - this.runInAsyncScope(getResolveErrorBodyCallback, null, - { callback, body: res, contentType, statusCode, statusMessage, headers } - ) - } else { - if (factory === null) { - return - } + if ( + !res || + typeof res.write !== 'function' || + typeof res.end !== 'function' || + typeof res.on !== 'function' + ) { + throw new InvalidReturnValueError('expected Writable') + } - res = this.runInAsyncScope(factory, null, { - statusCode, - headers, - opaque, - context - }) + // TODO: Avoid finished. It registers an unnecessary amount of listeners. + finished(res, { readable: false }, (err) => { + const { callback, res, opaque, trailers, abort } = this - if ( - !res || - typeof res.write !== 'function' || - typeof res.end !== 'function' || - typeof res.on !== 'function' - ) { - throw new InvalidReturnValueError('expected Writable') + this.res = null + if (err || !res.readable) { + util.destroy(res, err) } - // TODO: Avoid finished. It registers an unnecessary amount of listeners. - finished(res, { readable: false }, (err) => { - const { callback, res, opaque, trailers, abort } = this - - this.res = null - if (err || !res.readable) { - util.destroy(res, err) - } - - this.callback = null - this.runInAsyncScope(callback, null, err || null, { opaque, trailers }) + this.callback = null + this.runInAsyncScope(callback, null, err || null, { opaque, trailers }) - if (err) { - abort() - } - }) - } + if (err) { + abort() + } + }) res.on('drain', resume) @@ -207,7 +194,9 @@ function stream (opts, factory, callback) { } try { - this.dispatch(opts, new StreamHandler(opts, factory, callback)) + const handler = new StreamHandler(opts, factory, callback) + + this.dispatch(opts, handler) } catch (err) { if (typeof callback !== 'function') { throw err diff --git a/deps/undici/src/lib/api/api-upgrade.js b/deps/undici/src/lib/api/api-upgrade.js index 7effcf21049d7c..f6efdc98626515 100644 --- a/deps/undici/src/lib/api/api-upgrade.js +++ b/deps/undici/src/lib/api/api-upgrade.js @@ -2,9 +2,9 @@ const { InvalidArgumentError, SocketError } = require('../core/errors') const { AsyncResource } = require('node:async_hooks') +const assert = require('node:assert') const util = require('../core/util') const { addSignal, removeSignal } = require('./abort-signal') -const assert = require('node:assert') class UpgradeHandler extends AsyncResource { constructor (opts, callback) { @@ -91,11 +91,13 @@ function upgrade (opts, callback) { try { const upgradeHandler = new UpgradeHandler(opts, callback) - this.dispatch({ + const upgradeOpts = { ...opts, method: opts.method || 'GET', upgrade: opts.protocol || 'Websocket' - }, upgradeHandler) + } + + this.dispatch(upgradeOpts, upgradeHandler) } catch (err) { if (typeof callback !== 'function') { throw err diff --git a/deps/undici/src/lib/api/readable.js b/deps/undici/src/lib/api/readable.js index 47fbf3e0ef1b5f..31a31ace925dd9 100644 --- a/deps/undici/src/lib/api/readable.js +++ b/deps/undici/src/lib/api/readable.js @@ -14,10 +14,25 @@ const kBody = Symbol('kBody') const kAbort = Symbol('kAbort') const kContentType = Symbol('kContentType') const kContentLength = Symbol('kContentLength') +const kUsed = Symbol('kUsed') +const kBytesRead = Symbol('kBytesRead') const noop = () => {} +/** + * @class + * @extends {Readable} + * @see https://fetch.spec.whatwg.org/#body + */ class BodyReadable extends Readable { + /** + * @param {object} opts + * @param {(this: Readable, size: number) => void} opts.resume + * @param {() => (void | null)} opts.abort + * @param {string} [opts.contentType = ''] + * @param {number} [opts.contentLength] + * @param {number} [opts.highWaterMark = 64 * 1024] + */ constructor ({ resume, abort, @@ -34,10 +49,19 @@ class BodyReadable extends Readable { this._readableState.dataEmitted = false this[kAbort] = abort + + /** + * @type {Consume | null} + */ this[kConsume] = null + this[kBytesRead] = 0 + /** + * @type {ReadableStream|null} + */ this[kBody] = null + this[kUsed] = false this[kContentType] = contentType - this[kContentLength] = contentLength + this[kContentLength] = Number.isFinite(contentLength) ? contentLength : null // Is stream being consumed through Readable API? // This is an optimization so that we avoid checking @@ -46,7 +70,12 @@ class BodyReadable extends Readable { this[kReading] = false } - destroy (err) { + /** + * @param {Error|null} err + * @param {(error:(Error|null)) => void} callback + * @returns {void} + */ + _destroy (err, callback) { if (!err && !this._readableState.endEmitted) { err = new RequestAbortedError() } @@ -55,15 +84,11 @@ class BodyReadable extends Readable { this[kAbort]() } - return super.destroy(err) - } - - _destroy (err, callback) { // Workaround for Node "bug". If the stream is destroyed in same // tick as it is created, then a user who is waiting for a - // promise (i.e micro tick) for installing a 'error' listener will + // promise (i.e micro tick) for installing an 'error' listener will // never get a chance and will always encounter an unhandled exception. - if (!this[kReading]) { + if (!this[kUsed]) { setImmediate(() => { callback(err) }) @@ -72,20 +97,36 @@ class BodyReadable extends Readable { } } - on (ev, ...args) { - if (ev === 'data' || ev === 'readable') { + /** + * @param {string} event + * @param {(...args: any[]) => void} listener + * @returns {this} + */ + on (event, listener) { + if (event === 'data' || event === 'readable') { this[kReading] = true + this[kUsed] = true } - return super.on(ev, ...args) + return super.on(event, listener) } - addListener (ev, ...args) { - return this.on(ev, ...args) + /** + * @param {string} event + * @param {(...args: any[]) => void} listener + * @returns {this} + */ + addListener (event, listener) { + return this.on(event, listener) } - off (ev, ...args) { - const ret = super.off(ev, ...args) - if (ev === 'data' || ev === 'readable') { + /** + * @param {string|symbol} event + * @param {(...args: any[]) => void} listener + * @returns {this} + */ + off (event, listener) { + const ret = super.off(event, listener) + if (event === 'data' || event === 'readable') { this[kReading] = ( this.listenerCount('data') > 0 || this.listenerCount('readable') > 0 @@ -94,11 +135,22 @@ class BodyReadable extends Readable { return ret } - removeListener (ev, ...args) { - return this.off(ev, ...args) + /** + * @param {string|symbol} event + * @param {(...args: any[]) => void} listener + * @returns {this} + */ + removeListener (event, listener) { + return this.off(event, listener) } + /** + * @param {Buffer|null} chunk + * @returns {boolean} + */ push (chunk) { + this[kBytesRead] += chunk ? chunk.length : 0 + if (this[kConsume] && chunk !== null) { consumePush(this[kConsume], chunk) return this[kReading] ? super.push(chunk) : true @@ -106,43 +158,84 @@ class BodyReadable extends Readable { return super.push(chunk) } - // https://fetch.spec.whatwg.org/#dom-body-text - async text () { + /** + * Consumes and returns the body as a string. + * + * @see https://fetch.spec.whatwg.org/#dom-body-text + * @returns {Promise} + */ + text () { return consume(this, 'text') } - // https://fetch.spec.whatwg.org/#dom-body-json - async json () { + /** + * Consumes and returns the body as a JavaScript Object. + * + * @see https://fetch.spec.whatwg.org/#dom-body-json + * @returns {Promise} + */ + json () { return consume(this, 'json') } - // https://fetch.spec.whatwg.org/#dom-body-blob - async blob () { + /** + * Consumes and returns the body as a Blob + * + * @see https://fetch.spec.whatwg.org/#dom-body-blob + * @returns {Promise} + */ + blob () { return consume(this, 'blob') } - // https://fetch.spec.whatwg.org/#dom-body-bytes - async bytes () { + /** + * Consumes and returns the body as an Uint8Array. + * + * @see https://fetch.spec.whatwg.org/#dom-body-bytes + * @returns {Promise} + */ + bytes () { return consume(this, 'bytes') } - // https://fetch.spec.whatwg.org/#dom-body-arraybuffer - async arrayBuffer () { + /** + * Consumes and returns the body as an ArrayBuffer. + * + * @see https://fetch.spec.whatwg.org/#dom-body-arraybuffer + * @returns {Promise} + */ + arrayBuffer () { return consume(this, 'arrayBuffer') } - // https://fetch.spec.whatwg.org/#dom-body-formdata + /** + * Not implemented + * + * @see https://fetch.spec.whatwg.org/#dom-body-formdata + * @throws {NotSupportedError} + */ async formData () { // TODO: Implement. throw new NotSupportedError() } - // https://fetch.spec.whatwg.org/#dom-body-bodyused + /** + * Returns true if the body is not null and the body has been consumed. + * Otherwise, returns false. + * + * @see https://fetch.spec.whatwg.org/#dom-body-bodyused + * @readonly + * @returns {boolean} + */ get bodyUsed () { return util.isDisturbed(this) } - // https://fetch.spec.whatwg.org/#dom-body-body + /** + * @see https://fetch.spec.whatwg.org/#dom-body-body + * @readonly + * @returns {ReadableStream} + */ get body () { if (!this[kBody]) { this[kBody] = ReadableStreamFrom(this) @@ -155,14 +248,24 @@ class BodyReadable extends Readable { return this[kBody] } + /** + * Dumps the response body by reading `limit` number of bytes. + * @param {object} opts + * @param {number} [opts.limit = 131072] Number of bytes to read. + * @param {AbortSignal} [opts.signal] An AbortSignal to cancel the dump. + * @returns {Promise} + */ async dump (opts) { - let limit = Number.isFinite(opts?.limit) ? opts.limit : 128 * 1024 const signal = opts?.signal if (signal != null && (typeof signal !== 'object' || !('aborted' in signal))) { throw new InvalidArgumentError('signal must be an AbortSignal') } + const limit = opts?.limit && Number.isFinite(opts.limit) + ? opts.limit + : 128 * 1024 + signal?.throwIfAborted() if (this._readableState.closeEmitted) { @@ -170,48 +273,89 @@ class BodyReadable extends Readable { } return await new Promise((resolve, reject) => { - if (this[kContentLength] > limit) { + if ( + (this[kContentLength] && (this[kContentLength] > limit)) || + this[kBytesRead] > limit + ) { this.destroy(new AbortError()) } - const onAbort = () => { - this.destroy(signal.reason ?? new AbortError()) + if (signal) { + const onAbort = () => { + this.destroy(signal.reason ?? new AbortError()) + } + signal.addEventListener('abort', onAbort) + this + .on('close', function () { + signal.removeEventListener('abort', onAbort) + if (signal.aborted) { + reject(signal.reason ?? new AbortError()) + } else { + resolve(null) + } + }) + } else { + this.on('close', resolve) } - signal?.addEventListener('abort', onAbort) this - .on('close', function () { - signal?.removeEventListener('abort', onAbort) - if (signal?.aborted) { - reject(signal.reason ?? new AbortError()) - } else { - resolve(null) - } - }) .on('error', noop) - .on('data', function (chunk) { - limit -= chunk.length - if (limit <= 0) { + .on('data', () => { + if (this[kBytesRead] > limit) { this.destroy() } }) .resume() }) } + + /** + * @param {BufferEncoding} encoding + * @returns {this} + */ + setEncoding (encoding) { + if (Buffer.isEncoding(encoding)) { + this._readableState.encoding = encoding + } + return this + } } -// https://streams.spec.whatwg.org/#readablestream-locked -function isLocked (self) { +/** + * @see https://streams.spec.whatwg.org/#readablestream-locked + * @param {BodyReadable} bodyReadable + * @returns {boolean} + */ +function isLocked (bodyReadable) { // Consume is an implicit lock. - return (self[kBody] && self[kBody].locked === true) || self[kConsume] + return bodyReadable[kBody]?.locked === true || bodyReadable[kConsume] !== null } -// https://fetch.spec.whatwg.org/#body-unusable -function isUnusable (self) { - return util.isDisturbed(self) || isLocked(self) +/** + * @see https://fetch.spec.whatwg.org/#body-unusable + * @param {BodyReadable} bodyReadable + * @returns {boolean} + */ +function isUnusable (bodyReadable) { + return util.isDisturbed(bodyReadable) || isLocked(bodyReadable) } -async function consume (stream, type) { +/** + * @typedef {object} Consume + * @property {string} type + * @property {BodyReadable} stream + * @property {((value?: any) => void)} resolve + * @property {((err: Error) => void)} reject + * @property {number} length + * @property {Buffer[]} body + */ + +/** + * @param {BodyReadable} stream + * @param {string} type + * @returns {Promise} + */ +function consume (stream, type) { assert(!stream[kConsume]) return new Promise((resolve, reject) => { @@ -255,6 +399,10 @@ async function consume (stream, type) { }) } +/** + * @param {Consume} consume + * @returns {void} + */ function consumeStart (consume) { if (consume.body === null) { return @@ -275,10 +423,10 @@ function consumeStart (consume) { } if (state.endEmitted) { - consumeEnd(this[kConsume]) + consumeEnd(this[kConsume], this._readableState.encoding) } else { consume.stream.on('end', function () { - consumeEnd(this[kConsume]) + consumeEnd(this[kConsume], this._readableState.encoding) }) } @@ -292,8 +440,10 @@ function consumeStart (consume) { /** * @param {Buffer[]} chunks * @param {number} length + * @param {BufferEncoding} encoding + * @returns {string} */ -function chunksDecode (chunks, length) { +function chunksDecode (chunks, length, encoding) { if (chunks.length === 0 || length === 0) { return '' } @@ -308,7 +458,11 @@ function chunksDecode (chunks, length) { buffer[2] === 0xbf ? 3 : 0 - return buffer.utf8Slice(start, bufferLength) + if (!encoding || encoding === 'utf8' || encoding === 'utf-8') { + return buffer.utf8Slice(start, bufferLength) + } else { + return buffer.subarray(start, bufferLength).toString(encoding) + } } /** @@ -336,14 +490,19 @@ function chunksConcat (chunks, length) { return buffer } -function consumeEnd (consume) { +/** + * @param {Consume} consume + * @param {BufferEncoding} encoding + * @returns {void} + */ +function consumeEnd (consume, encoding) { const { type, body, resolve, stream, length } = consume try { if (type === 'text') { - resolve(chunksDecode(body, length)) + resolve(chunksDecode(body, length, encoding)) } else if (type === 'json') { - resolve(JSON.parse(chunksDecode(body, length))) + resolve(JSON.parse(chunksDecode(body, length, encoding))) } else if (type === 'arrayBuffer') { resolve(chunksConcat(body, length).buffer) } else if (type === 'blob') { @@ -358,11 +517,21 @@ function consumeEnd (consume) { } } +/** + * @param {Consume} consume + * @param {Buffer} chunk + * @returns {void} + */ function consumePush (consume, chunk) { consume.length += chunk.length consume.body.push(chunk) } +/** + * @param {Consume} consume + * @param {Error} [err] + * @returns {void} + */ function consumeFinish (consume, err) { if (consume.body === null) { return @@ -374,6 +543,7 @@ function consumeFinish (consume, err) { consume.resolve() } + // Reset the consume object to allow for garbage collection. consume.type = null consume.stream = null consume.resolve = null @@ -382,4 +552,7 @@ function consumeFinish (consume, err) { consume.body = null } -module.exports = { Readable: BodyReadable, chunksDecode } +module.exports = { + Readable: BodyReadable, + chunksDecode +} diff --git a/deps/undici/src/lib/api/util.js b/deps/undici/src/lib/api/util.js index 2f983bf424c705..5512636f339929 100644 --- a/deps/undici/src/lib/api/util.js +++ b/deps/undici/src/lib/api/util.js @@ -1,3 +1,5 @@ +'use strict' + const assert = require('node:assert') const { ResponseStatusCodeError diff --git a/deps/undici/src/lib/cache/memory-cache-store.js b/deps/undici/src/lib/cache/memory-cache-store.js new file mode 100644 index 00000000000000..dd5ac00b5a3bbb --- /dev/null +++ b/deps/undici/src/lib/cache/memory-cache-store.js @@ -0,0 +1,177 @@ +'use strict' + +const { Writable } = require('node:stream') +const { assertCacheKey, assertCacheValue } = require('../util/cache.js') + +/** + * @typedef {import('../../types/cache-interceptor.d.ts').default.CacheKey} CacheKey + * @typedef {import('../../types/cache-interceptor.d.ts').default.CacheValue} CacheValue + * @typedef {import('../../types/cache-interceptor.d.ts').default.CacheStore} CacheStore + * @typedef {import('../../types/cache-interceptor.d.ts').default.GetResult} GetResult + */ + +/** + * @implements {CacheStore} + */ +class MemoryCacheStore { + #maxCount = Infinity + #maxSize = Infinity + #maxEntrySize = Infinity + + #size = 0 + #count = 0 + #entries = new Map() + + /** + * @param {import('../../types/cache-interceptor.d.ts').default.MemoryCacheStoreOpts | undefined} [opts] + */ + constructor (opts) { + if (opts) { + if (typeof opts !== 'object') { + throw new TypeError('MemoryCacheStore options must be an object') + } + + if (opts.maxCount !== undefined) { + if ( + typeof opts.maxCount !== 'number' || + !Number.isInteger(opts.maxCount) || + opts.maxCount < 0 + ) { + throw new TypeError('MemoryCacheStore options.maxCount must be a non-negative integer') + } + this.#maxCount = opts.maxCount + } + + if (opts.maxSize !== undefined) { + if ( + typeof opts.maxSize !== 'number' || + !Number.isInteger(opts.maxSize) || + opts.maxSize < 0 + ) { + throw new TypeError('MemoryCacheStore options.maxSize must be a non-negative integer') + } + this.#maxSize = opts.maxSize + } + + if (opts.maxEntrySize !== undefined) { + if ( + typeof opts.maxEntrySize !== 'number' || + !Number.isInteger(opts.maxEntrySize) || + opts.maxEntrySize < 0 + ) { + throw new TypeError('MemoryCacheStore options.maxEntrySize must be a non-negative integer') + } + this.#maxEntrySize = opts.maxEntrySize + } + } + } + + /** + * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} req + * @returns {import('../../types/cache-interceptor.d.ts').default.GetResult | undefined} + */ + get (key) { + assertCacheKey(key) + + const topLevelKey = `${key.origin}:${key.path}` + + const now = Date.now() + const entry = this.#entries.get(topLevelKey)?.find((entry) => ( + entry.deleteAt > now && + entry.method === key.method && + (entry.vary == null || Object.keys(entry.vary).every(headerName => entry.vary[headerName] === key.headers?.[headerName])) + )) + + return entry == null + ? undefined + : { + statusMessage: entry.statusMessage, + statusCode: entry.statusCode, + headers: entry.headers, + body: entry.body, + vary: entry.vary ? entry.vary : undefined, + etag: entry.etag, + cacheControlDirectives: entry.cacheControlDirectives, + cachedAt: entry.cachedAt, + staleAt: entry.staleAt, + deleteAt: entry.deleteAt + } + } + + /** + * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} key + * @param {import('../../types/cache-interceptor.d.ts').default.CacheValue} val + * @returns {Writable | undefined} + */ + createWriteStream (key, val) { + assertCacheKey(key) + assertCacheValue(val) + + const topLevelKey = `${key.origin}:${key.path}` + + const store = this + const entry = { ...key, ...val, body: [], size: 0 } + + return new Writable({ + write (chunk, encoding, callback) { + if (typeof chunk === 'string') { + chunk = Buffer.from(chunk, encoding) + } + + entry.size += chunk.byteLength + + if (entry.size >= store.#maxEntrySize) { + this.destroy() + } else { + entry.body.push(chunk) + } + + callback(null) + }, + final (callback) { + let entries = store.#entries.get(topLevelKey) + if (!entries) { + entries = [] + store.#entries.set(topLevelKey, entries) + } + entries.push(entry) + + store.#size += entry.size + store.#count += 1 + + if (store.#size > store.#maxSize || store.#count > store.#maxCount) { + for (const [key, entries] of store.#entries) { + for (const entry of entries.splice(0, entries.length / 2)) { + store.#size -= entry.size + store.#count -= 1 + } + if (entries.length === 0) { + store.#entries.delete(key) + } + } + } + + callback(null) + } + }) + } + + /** + * @param {CacheKey} key + */ + delete (key) { + if (typeof key !== 'object') { + throw new TypeError(`expected key to be object, got ${typeof key}`) + } + + const topLevelKey = `${key.origin}:${key.path}` + + for (const entry of this.#entries.get(topLevelKey) ?? []) { + this.#size -= entry.size + this.#count -= 1 + } + this.#entries.delete(topLevelKey) + } +} + +module.exports = MemoryCacheStore diff --git a/deps/undici/src/lib/cache/sqlite-cache-store.js b/deps/undici/src/lib/cache/sqlite-cache-store.js new file mode 100644 index 00000000000000..a5afc829413c64 --- /dev/null +++ b/deps/undici/src/lib/cache/sqlite-cache-store.js @@ -0,0 +1,450 @@ +'use strict' + +const { Writable } = require('stream') +const { assertCacheKey, assertCacheValue } = require('../util/cache.js') + +let DatabaseSync + +const VERSION = 3 + +// 2gb +const MAX_ENTRY_SIZE = 2 * 1000 * 1000 * 1000 + +/** + * @typedef {import('../../types/cache-interceptor.d.ts').default.CacheStore} CacheStore + * @implements {CacheStore} + * + * @typedef {{ + * id: Readonly + * headers?: Record + * vary?: string | object + * body: string + * } & import('../../types/cache-interceptor.d.ts').default.CacheValue} SqliteStoreValue + */ +module.exports = class SqliteCacheStore { + #maxEntrySize = MAX_ENTRY_SIZE + #maxCount = Infinity + + /** + * @type {import('node:sqlite').DatabaseSync} + */ + #db + + /** + * @type {import('node:sqlite').StatementSync} + */ + #getValuesQuery + + /** + * @type {import('node:sqlite').StatementSync} + */ + #updateValueQuery + + /** + * @type {import('node:sqlite').StatementSync} + */ + #insertValueQuery + + /** + * @type {import('node:sqlite').StatementSync} + */ + #deleteExpiredValuesQuery + + /** + * @type {import('node:sqlite').StatementSync} + */ + #deleteByUrlQuery + + /** + * @type {import('node:sqlite').StatementSync} + */ + #countEntriesQuery + + /** + * @type {import('node:sqlite').StatementSync} + */ + #deleteOldValuesQuery + + /** + * @param {import('../../types/cache-interceptor.d.ts').default.SqliteCacheStoreOpts | undefined} opts + */ + constructor (opts) { + if (opts) { + if (typeof opts !== 'object') { + throw new TypeError('SqliteCacheStore options must be an object') + } + + if (opts.maxEntrySize !== undefined) { + if ( + typeof opts.maxEntrySize !== 'number' || + !Number.isInteger(opts.maxEntrySize) || + opts.maxEntrySize < 0 + ) { + throw new TypeError('SqliteCacheStore options.maxEntrySize must be a non-negative integer') + } + + if (opts.maxEntrySize > MAX_ENTRY_SIZE) { + throw new TypeError('SqliteCacheStore options.maxEntrySize must be less than 2gb') + } + + this.#maxEntrySize = opts.maxEntrySize + } + + if (opts.maxCount !== undefined) { + if ( + typeof opts.maxCount !== 'number' || + !Number.isInteger(opts.maxCount) || + opts.maxCount < 0 + ) { + throw new TypeError('SqliteCacheStore options.maxCount must be a non-negative integer') + } + this.#maxCount = opts.maxCount + } + } + + if (!DatabaseSync) { + DatabaseSync = require('node:sqlite').DatabaseSync + } + this.#db = new DatabaseSync(opts?.location ?? ':memory:') + + this.#db.exec(` + CREATE TABLE IF NOT EXISTS cacheInterceptorV${VERSION} ( + -- Data specific to us + id INTEGER PRIMARY KEY AUTOINCREMENT, + url TEXT NOT NULL, + method TEXT NOT NULL, + + -- Data returned to the interceptor + body BUF NULL, + deleteAt INTEGER NOT NULL, + statusCode INTEGER NOT NULL, + statusMessage TEXT NOT NULL, + headers TEXT NULL, + cacheControlDirectives TEXT NULL, + etag TEXT NULL, + vary TEXT NULL, + cachedAt INTEGER NOT NULL, + staleAt INTEGER NOT NULL + ); + + CREATE INDEX IF NOT EXISTS idx_cacheInterceptorV${VERSION}_url ON cacheInterceptorV${VERSION}(url); + CREATE INDEX IF NOT EXISTS idx_cacheInterceptorV${VERSION}_method ON cacheInterceptorV${VERSION}(method); + CREATE INDEX IF NOT EXISTS idx_cacheInterceptorV${VERSION}_deleteAt ON cacheInterceptorV${VERSION}(deleteAt); + `) + + this.#getValuesQuery = this.#db.prepare(` + SELECT + id, + body, + deleteAt, + statusCode, + statusMessage, + headers, + etag, + cacheControlDirectives, + vary, + cachedAt, + staleAt + FROM cacheInterceptorV${VERSION} + WHERE + url = ? + AND method = ? + ORDER BY + deleteAt ASC + `) + + this.#updateValueQuery = this.#db.prepare(` + UPDATE cacheInterceptorV${VERSION} SET + body = ?, + deleteAt = ?, + statusCode = ?, + statusMessage = ?, + headers = ?, + etag = ?, + cacheControlDirectives = ?, + cachedAt = ?, + staleAt = ?, + deleteAt = ? + WHERE + id = ? + `) + + this.#insertValueQuery = this.#db.prepare(` + INSERT INTO cacheInterceptorV${VERSION} ( + url, + method, + body, + deleteAt, + statusCode, + statusMessage, + headers, + etag, + cacheControlDirectives, + vary, + cachedAt, + staleAt, + deleteAt + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + `) + + this.#deleteByUrlQuery = this.#db.prepare( + `DELETE FROM cacheInterceptorV${VERSION} WHERE url = ?` + ) + + this.#countEntriesQuery = this.#db.prepare( + `SELECT COUNT(*) AS total FROM cacheInterceptorV${VERSION}` + ) + + this.#deleteExpiredValuesQuery = this.#db.prepare( + `DELETE FROM cacheInterceptorV${VERSION} WHERE deleteAt <= ?` + ) + + this.#deleteOldValuesQuery = this.#maxCount === Infinity + ? null + : this.#db.prepare(` + DELETE FROM cacheInterceptorV${VERSION} + WHERE id IN ( + SELECT + id + FROM cacheInterceptorV${VERSION} + ORDER BY cachedAt DESC + LIMIT ? + ) + `) + } + + close () { + this.#db.close() + } + + /** + * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} key + * @returns {import('../../types/cache-interceptor.d.ts').default.GetResult | undefined} + */ + get (key) { + assertCacheKey(key) + + const value = this.#findValue(key) + + if (!value) { + return undefined + } + + /** + * @type {import('../../types/cache-interceptor.d.ts').default.GetResult} + */ + const result = { + body: Buffer.from(value.body), + statusCode: value.statusCode, + statusMessage: value.statusMessage, + headers: value.headers ? JSON.parse(value.headers) : undefined, + etag: value.etag ? value.etag : undefined, + vary: value.vary ?? undefined, + cacheControlDirectives: value.cacheControlDirectives + ? JSON.parse(value.cacheControlDirectives) + : undefined, + cachedAt: value.cachedAt, + staleAt: value.staleAt, + deleteAt: value.deleteAt + } + + return result + } + + /** + * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} key + * @param {import('../../types/cache-interceptor.d.ts').default.CacheValue} value + * @returns {Writable | undefined} + */ + createWriteStream (key, value) { + assertCacheKey(key) + assertCacheValue(value) + + const url = this.#makeValueUrl(key) + let size = 0 + /** + * @type {Buffer[] | null} + */ + const body = [] + const store = this + + return new Writable({ + write (chunk, encoding, callback) { + if (typeof chunk === 'string') { + chunk = Buffer.from(chunk, encoding) + } + + size += chunk.byteLength + + if (size < store.#maxEntrySize) { + body.push(chunk) + } else { + this.destroy() + } + + callback() + }, + final (callback) { + const existingValue = store.#findValue(key, true) + if (existingValue) { + // Updating an existing response, let's overwrite it + store.#updateValueQuery.run( + Buffer.concat(body), + value.deleteAt, + value.statusCode, + value.statusMessage, + value.headers ? JSON.stringify(value.headers) : null, + value.etag ? value.etag : null, + value.cacheControlDirectives ? JSON.stringify(value.cacheControlDirectives) : null, + value.cachedAt, + value.staleAt, + value.deleteAt, + existingValue.id + ) + } else { + store.#prune() + // New response, let's insert it + store.#insertValueQuery.run( + url, + key.method, + Buffer.concat(body), + value.deleteAt, + value.statusCode, + value.statusMessage, + value.headers ? JSON.stringify(value.headers) : null, + value.etag ? value.etag : null, + value.cacheControlDirectives ? JSON.stringify(value.cacheControlDirectives) : null, + value.vary ? JSON.stringify(value.vary) : null, + value.cachedAt, + value.staleAt, + value.deleteAt + ) + } + + callback() + } + }) + } + + /** + * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} key + */ + delete (key) { + if (typeof key !== 'object') { + throw new TypeError(`expected key to be object, got ${typeof key}`) + } + + this.#deleteByUrlQuery.run(this.#makeValueUrl(key)) + } + + #prune () { + if (this.size <= this.#maxCount) { + return 0 + } + + { + const removed = this.#deleteExpiredValuesQuery.run(Date.now()).changes + if (removed > 0) { + return removed + } + } + + { + const removed = this.#deleteOldValuesQuery.run(Math.max(Math.floor(this.#maxCount * 0.1), 1)).changes + if (removed > 0) { + return removed + } + } + + return 0 + } + + /** + * Counts the number of rows in the cache + * @returns {Number} + */ + get size () { + const { total } = this.#countEntriesQuery.get() + return total + } + + /** + * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} key + * @returns {string} + */ + #makeValueUrl (key) { + return `${key.origin}/${key.path}` + } + + /** + * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} key + * @param {boolean} [canBeExpired=false] + * @returns {(SqliteStoreValue & { vary?: Record }) | undefined} + */ + #findValue (key, canBeExpired = false) { + const url = this.#makeValueUrl(key) + const { headers, method } = key + + /** + * @type {SqliteStoreValue[]} + */ + const values = this.#getValuesQuery.all(url, method) + + if (values.length === 0) { + return undefined + } + + const now = Date.now() + for (const value of values) { + if (now >= value.deleteAt && !canBeExpired) { + return undefined + } + + let matches = true + + if (value.vary) { + if (!headers) { + return undefined + } + + value.vary = JSON.parse(value.vary) + + for (const header in value.vary) { + if (!headerValueEquals(headers[header], value.vary[header])) { + matches = false + break + } + } + } + + if (matches) { + return value + } + } + + return undefined + } +} + +/** + * @param {string|string[]|null|undefined} lhs + * @param {string|string[]|null|undefined} rhs + * @returns {boolean} + */ +function headerValueEquals (lhs, rhs) { + if (Array.isArray(lhs) && Array.isArray(rhs)) { + if (lhs.length !== rhs.length) { + return false + } + + for (let i = 0; i < lhs.length; i++) { + if (rhs.includes(lhs[i])) { + return false + } + } + + return true + } + + return lhs === rhs +} diff --git a/deps/undici/src/lib/core/constants.js b/deps/undici/src/lib/core/constants.js index 6ec770dd533449..088cf47d80f1d7 100644 --- a/deps/undici/src/lib/core/constants.js +++ b/deps/undici/src/lib/core/constants.js @@ -1,10 +1,9 @@ 'use strict' -/** @type {Record} */ -const headerNameLowerCasedRecord = {} - -// https://developer.mozilla.org/docs/Web/HTTP/Headers -const wellknownHeaderNames = [ +/** + * @see https://developer.mozilla.org/docs/Web/HTTP/Headers + */ +const wellknownHeaderNames = /** @type {const} */ ([ 'Accept', 'Accept-Encoding', 'Accept-Language', @@ -100,7 +99,35 @@ const wellknownHeaderNames = [ 'X-Powered-By', 'X-Requested-With', 'X-XSS-Protection' -] +]) + +/** @type {Record, string>} */ +const headerNameLowerCasedRecord = {} + +// Note: object prototypes should not be able to be referenced. e.g. `Object#hasOwnProperty`. +Object.setPrototypeOf(headerNameLowerCasedRecord, null) + +/** + * @type {Record, Buffer>} + */ +const wellknownHeaderNameBuffers = {} + +// Note: object prototypes should not be able to be referenced. e.g. `Object#hasOwnProperty`. +Object.setPrototypeOf(wellknownHeaderNameBuffers, null) + +/** + * @param {string} header Lowercased header + * @returns {Buffer} + */ +function getHeaderNameAsBuffer (header) { + let buffer = wellknownHeaderNameBuffers[header] + + if (buffer === undefined) { + buffer = Buffer.from(header) + } + + return buffer +} for (let i = 0; i < wellknownHeaderNames.length; ++i) { const key = wellknownHeaderNames[i] @@ -109,10 +136,8 @@ for (let i = 0; i < wellknownHeaderNames.length; ++i) { lowerCasedKey } -// Note: object prototypes should not be able to be referenced. e.g. `Object#hasOwnProperty`. -Object.setPrototypeOf(headerNameLowerCasedRecord, null) - module.exports = { wellknownHeaderNames, - headerNameLowerCasedRecord + headerNameLowerCasedRecord, + getHeaderNameAsBuffer } diff --git a/deps/undici/src/lib/core/diagnostics.js b/deps/undici/src/lib/core/diagnostics.js index e1af3db611270e..44c168e6e794e7 100644 --- a/deps/undici/src/lib/core/diagnostics.js +++ b/deps/undici/src/lib/core/diagnostics.js @@ -1,11 +1,12 @@ 'use strict' + const diagnosticsChannel = require('node:diagnostics_channel') const util = require('node:util') const undiciDebugLog = util.debuglog('undici') const fetchDebuglog = util.debuglog('fetch') const websocketDebuglog = util.debuglog('websocket') -let isClientSet = false + const channels = { // Client beforeConnect: diagnosticsChannel.channel('undici:client:beforeConnect'), @@ -26,102 +27,21 @@ const channels = { pong: diagnosticsChannel.channel('undici:websocket:pong') } -if (undiciDebugLog.enabled || fetchDebuglog.enabled) { - const debuglog = fetchDebuglog.enabled ? fetchDebuglog : undiciDebugLog - - // Track all Client events - diagnosticsChannel.channel('undici:client:beforeConnect').subscribe(evt => { - const { - connectParams: { version, protocol, port, host } - } = evt - debuglog( - 'connecting to %s using %s%s', - `${host}${port ? `:${port}` : ''}`, - protocol, - version - ) - }) - - diagnosticsChannel.channel('undici:client:connected').subscribe(evt => { - const { - connectParams: { version, protocol, port, host } - } = evt - debuglog( - 'connected to %s using %s%s', - `${host}${port ? `:${port}` : ''}`, - protocol, - version - ) - }) - - diagnosticsChannel.channel('undici:client:connectError').subscribe(evt => { - const { - connectParams: { version, protocol, port, host }, - error - } = evt - debuglog( - 'connection to %s using %s%s errored - %s', - `${host}${port ? `:${port}` : ''}`, - protocol, - version, - error.message - ) - }) - - diagnosticsChannel.channel('undici:client:sendHeaders').subscribe(evt => { - const { - request: { method, path, origin } - } = evt - debuglog('sending request to %s %s/%s', method, origin, path) - }) - - // Track Request events - diagnosticsChannel.channel('undici:request:headers').subscribe(evt => { - const { - request: { method, path, origin }, - response: { statusCode } - } = evt - debuglog( - 'received response to %s %s/%s - HTTP %d', - method, - origin, - path, - statusCode - ) - }) - - diagnosticsChannel.channel('undici:request:trailers').subscribe(evt => { - const { - request: { method, path, origin } - } = evt - debuglog('trailers received from %s %s/%s', method, origin, path) - }) - - diagnosticsChannel.channel('undici:request:error').subscribe(evt => { - const { - request: { method, path, origin }, - error - } = evt - debuglog( - 'request to %s %s/%s errored - %s', - method, - origin, - path, - error.message - ) - }) - - isClientSet = true -} +let isTrackingClientEvents = false -if (websocketDebuglog.enabled) { - if (!isClientSet) { - const debuglog = undiciDebugLog.enabled ? undiciDebugLog : websocketDebuglog - diagnosticsChannel.channel('undici:client:beforeConnect').subscribe(evt => { +function trackClientEvents (debugLog = undiciDebugLog) { + if (isTrackingClientEvents) { + return + } + + isTrackingClientEvents = true + + diagnosticsChannel.subscribe('undici:client:beforeConnect', + evt => { const { connectParams: { version, protocol, port, host } } = evt - debuglog( + debugLog( 'connecting to %s%s using %s%s', host, port ? `:${port}` : '', @@ -130,11 +50,12 @@ if (websocketDebuglog.enabled) { ) }) - diagnosticsChannel.channel('undici:client:connected').subscribe(evt => { + diagnosticsChannel.subscribe('undici:client:connected', + evt => { const { connectParams: { version, protocol, port, host } } = evt - debuglog( + debugLog( 'connected to %s%s using %s%s', host, port ? `:${port}` : '', @@ -143,12 +64,13 @@ if (websocketDebuglog.enabled) { ) }) - diagnosticsChannel.channel('undici:client:connectError').subscribe(evt => { + diagnosticsChannel.subscribe('undici:client:connectError', + evt => { const { connectParams: { version, protocol, port, host }, error } = evt - debuglog( + debugLog( 'connection to %s%s using %s%s errored - %s', host, port ? `:${port}` : '', @@ -158,43 +80,115 @@ if (websocketDebuglog.enabled) { ) }) - diagnosticsChannel.channel('undici:client:sendHeaders').subscribe(evt => { + diagnosticsChannel.subscribe('undici:client:sendHeaders', + evt => { + const { + request: { method, path, origin } + } = evt + debugLog('sending request to %s %s/%s', method, origin, path) + }) +} + +let isTrackingRequestEvents = false + +function trackRequestEvents (debugLog = undiciDebugLog) { + if (isTrackingRequestEvents) { + return + } + + isTrackingRequestEvents = true + + diagnosticsChannel.subscribe('undici:request:headers', + evt => { + const { + request: { method, path, origin }, + response: { statusCode } + } = evt + debugLog( + 'received response to %s %s/%s - HTTP %d', + method, + origin, + path, + statusCode + ) + }) + + diagnosticsChannel.subscribe('undici:request:trailers', + evt => { const { request: { method, path, origin } } = evt - debuglog('sending request to %s %s/%s', method, origin, path) + debugLog('trailers received from %s %s/%s', method, origin, path) + }) + + diagnosticsChannel.subscribe('undici:request:error', + evt => { + const { + request: { method, path, origin }, + error + } = evt + debugLog( + 'request to %s %s/%s errored - %s', + method, + origin, + path, + error.message + ) }) +} + +let isTrackingWebSocketEvents = false + +function trackWebSocketEvents (debugLog = websocketDebuglog) { + if (isTrackingWebSocketEvents) { + return } - // Track all WebSocket events - diagnosticsChannel.channel('undici:websocket:open').subscribe(evt => { - const { - address: { address, port } - } = evt - websocketDebuglog('connection opened %s%s', address, port ? `:${port}` : '') - }) - - diagnosticsChannel.channel('undici:websocket:close').subscribe(evt => { - const { websocket, code, reason } = evt - websocketDebuglog( - 'closed connection to %s - %s %s', - websocket.url, - code, - reason - ) - }) - - diagnosticsChannel.channel('undici:websocket:socket_error').subscribe(err => { - websocketDebuglog('connection errored - %s', err.message) - }) - - diagnosticsChannel.channel('undici:websocket:ping').subscribe(evt => { - websocketDebuglog('ping received') - }) - - diagnosticsChannel.channel('undici:websocket:pong').subscribe(evt => { - websocketDebuglog('pong received') - }) + isTrackingWebSocketEvents = true + + diagnosticsChannel.subscribe('undici:websocket:open', + evt => { + const { + address: { address, port } + } = evt + debugLog('connection opened %s%s', address, port ? `:${port}` : '') + }) + + diagnosticsChannel.subscribe('undici:websocket:close', + evt => { + const { websocket, code, reason } = evt + debugLog( + 'closed connection to %s - %s %s', + websocket.url, + code, + reason + ) + }) + + diagnosticsChannel.subscribe('undici:websocket:socket_error', + err => { + debugLog('connection errored - %s', err.message) + }) + + diagnosticsChannel.subscribe('undici:websocket:ping', + evt => { + debugLog('ping received') + }) + + diagnosticsChannel.subscribe('undici:websocket:pong', + evt => { + debugLog('pong received') + }) +} + +if (undiciDebugLog.enabled || fetchDebuglog.enabled) { + trackClientEvents(fetchDebuglog.enabled ? fetchDebuglog : undiciDebugLog) + trackRequestEvents(fetchDebuglog.enabled ? fetchDebuglog : undiciDebugLog) +} + +if (websocketDebuglog.enabled) { + trackClientEvents(undiciDebugLog.enabled ? undiciDebugLog : websocketDebuglog) + trackWebSocketEvents(websocketDebuglog) } module.exports = { diff --git a/deps/undici/src/lib/core/errors.js b/deps/undici/src/lib/core/errors.js index 9257875c1c32f4..b2b3f326bc4a36 100644 --- a/deps/undici/src/lib/core/errors.js +++ b/deps/undici/src/lib/core/errors.js @@ -1,8 +1,8 @@ 'use strict' class UndiciError extends Error { - constructor (message) { - super(message) + constructor (message, options) { + super(message, options) this.name = 'UndiciError' this.code = 'UND_ERR' } @@ -196,20 +196,20 @@ class RequestRetryError extends UndiciError { } class ResponseError extends UndiciError { - constructor (message, code, { headers, data }) { + constructor (message, code, { headers, body }) { super(message) this.name = 'ResponseError' this.message = message || 'Response error' this.code = 'UND_ERR_RESPONSE' this.statusCode = code - this.data = data + this.body = body this.headers = headers } } class SecureProxyConnectionError extends UndiciError { - constructor (cause, message, options) { - super(message, { cause, ...(options ?? {}) }) + constructor (cause, message, options = {}) { + super(message, { cause, ...options }) this.name = 'SecureProxyConnectionError' this.message = message || 'Secure Proxy Connection failed' this.code = 'UND_ERR_PRX_TLS' diff --git a/deps/undici/src/lib/core/request.js b/deps/undici/src/lib/core/request.js index 78003038ba97b0..a8680b5057f23c 100644 --- a/deps/undici/src/lib/core/request.js +++ b/deps/undici/src/lib/core/request.js @@ -14,8 +14,8 @@ const { isFormDataLike, isIterable, isBlobLike, - buildURL, - validateHandler, + serializePathWithQuery, + assertRequestHandler, getServerName, normalizedMethodRecords } = require('./util') @@ -40,9 +40,9 @@ class Request { headersTimeout, bodyTimeout, reset, - throwOnError, expectContinue, - servername + servername, + throwOnError }, handler) { if (typeof path !== 'string') { throw new InvalidArgumentError('path must be a string') @@ -82,12 +82,14 @@ class Request { throw new InvalidArgumentError('invalid expectContinue') } + if (throwOnError != null) { + throw new InvalidArgumentError('invalid throwOnError') + } + this.headersTimeout = headersTimeout this.bodyTimeout = bodyTimeout - this.throwOnError = throwOnError === true - this.method = method this.abort = null @@ -128,12 +130,11 @@ class Request { } this.completed = false - this.aborted = false this.upgrade = upgrade || null - this.path = query ? buildURL(path, query) : path + this.path = query ? serializePathWithQuery(path, query) : path this.origin = origin @@ -141,7 +142,7 @@ class Request { ? method === 'HEAD' || method === 'GET' : idempotent - this.blocking = blocking == null ? false : blocking + this.blocking = blocking ?? this.method !== 'HEAD' this.reset = reset == null ? null : reset @@ -181,9 +182,9 @@ class Request { throw new InvalidArgumentError('headers must be an object or an array') } - validateHandler(handler, method, upgrade) + assertRequestHandler(handler, method, upgrade) - this.servername = servername || getServerName(this.host) + this.servername = servername || getServerName(this.host) || null this[kHandler] = handler @@ -270,6 +271,7 @@ class Request { this.onFinally() assert(!this.aborted) + assert(!this.completed) this.completed = true if (channels.trailers.hasSubscribers) { diff --git a/deps/undici/src/lib/core/symbols.js b/deps/undici/src/lib/core/symbols.js index c8ba5dd8ec5964..f3b563a5419b97 100644 --- a/deps/undici/src/lib/core/symbols.js +++ b/deps/undici/src/lib/core/symbols.js @@ -1,3 +1,5 @@ +'use strict' + module.exports = { kClose: Symbol('close'), kDestroy: Symbol('destroy'), @@ -52,7 +54,6 @@ module.exports = { kMaxRequests: Symbol('maxRequestsPerClient'), kProxy: Symbol('proxy agent options'), kCounter: Symbol('socket request counter'), - kInterceptors: Symbol('dispatch interceptors'), kMaxResponseSize: Symbol('max response size'), kHTTP2Session: Symbol('http2Session'), kHTTP2SessionState: Symbol('http2Session state'), diff --git a/deps/undici/src/lib/core/tree.js b/deps/undici/src/lib/core/tree.js index 17dfca4cc4e384..e7b960cb2b3baf 100644 --- a/deps/undici/src/lib/core/tree.js +++ b/deps/undici/src/lib/core/tree.js @@ -40,6 +40,7 @@ class TstNode { /** * @param {string} key * @param {any} value + * @returns {void} */ add (key, value) { const length = key.length @@ -47,6 +48,9 @@ class TstNode { throw new TypeError('Unreachable') } let index = 0 + /** + * @type {TstNode} + */ let node = this while (true) { const code = key.charCodeAt(index) @@ -87,6 +91,9 @@ class TstNode { search (key) { const keylength = key.length let index = 0 + /** + * @type {TstNode|null} + */ let node = this while (node !== null && index < keylength) { let code = key[index] @@ -121,6 +128,7 @@ class TernarySearchTree { /** * @param {string} key * @param {any} value + * @returns {void} * */ insert (key, value) { if (this.node === null) { @@ -132,7 +140,7 @@ class TernarySearchTree { /** * @param {Uint8Array} key - * @return {any} + * @returns {any} */ lookup (key) { return this.node?.search(key)?.value ?? null diff --git a/deps/undici/src/lib/core/util.js b/deps/undici/src/lib/core/util.js index 9ee7ec23c52241..dfefac6d15cfa5 100644 --- a/deps/undici/src/lib/core/util.js +++ b/deps/undici/src/lib/core/util.js @@ -28,6 +28,10 @@ class BodyAsyncIterable { } } +/** + * @param {*} body + * @returns {*} + */ function wrapRequestBody (body) { if (isStream(body)) { // TODO (fix): Provide some way for the user to cache the file to e.g. /tmp @@ -67,13 +71,19 @@ function wrapRequestBody (body) { } } -function nop () {} - +/** + * @param {*} obj + * @returns {obj is import('node:stream').Stream} + */ function isStream (obj) { return obj && typeof obj === 'object' && typeof obj.pipe === 'function' && typeof obj.on === 'function' } -// based on https://github.com/node-fetch/fetch-blob/blob/8ab587d34080de94140b54f07168451e7d0b655e/index.js#L229-L241 (MIT License) +/** + * @param {*} object + * @returns {object is Blob} + * based on https://github.com/node-fetch/fetch-blob/blob/8ab587d34080de94140b54f07168451e7d0b655e/index.js#L229-L241 (MIT License) + */ function isBlobLike (object) { if (object === null) { return false @@ -91,7 +101,12 @@ function isBlobLike (object) { } } -function buildURL (url, queryParams) { +/** + * @param {string} url The URL to add the query params to + * @param {import('node:querystring').ParsedUrlQueryInput} queryParams The object to serialize into a URL query string + * @returns {string} The URL with the query params added + */ +function serializePathWithQuery (url, queryParams) { if (url.includes('?') || url.includes('#')) { throw new Error('Query params cannot be passed when url already contains "?" or "#".') } @@ -105,6 +120,10 @@ function buildURL (url, queryParams) { return url } +/** + * @param {number|string|undefined} port + * @returns {boolean} + */ function isValidPort (port) { const value = parseInt(port, 10) return ( @@ -114,6 +133,12 @@ function isValidPort (port) { ) } +/** + * Check if the value is a valid http or https prefixed string. + * + * @param {string} value + * @returns {boolean} + */ function isHttpOrHttpsPrefixed (value) { return ( value != null && @@ -131,8 +156,15 @@ function isHttpOrHttpsPrefixed (value) { ) } +/** + * @param {string|URL|Record} url + * @returns {URL} + */ function parseURL (url) { if (typeof url === 'string') { + /** + * @type {URL} + */ url = new URL(url) if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) { @@ -202,6 +234,10 @@ function parseURL (url) { return url } +/** + * @param {string|URL|Record} url + * @returns {URL} + */ function parseOrigin (url) { url = parseURL(url) @@ -212,6 +248,10 @@ function parseOrigin (url) { return url } +/** + * @param {string} host + * @returns {string} + */ function getHostname (host) { if (host[0] === '[') { const idx = host.indexOf(']') @@ -226,8 +266,12 @@ function getHostname (host) { return host.substring(0, idx) } -// IP addresses are not valid server names per RFC6066 -// > Currently, the only server names supported are DNS hostnames +/** + * IP addresses are not valid server names per RFC6066 + * Currently, the only server names supported are DNS hostnames + * @param {string|null} host + * @returns {string|null} + */ function getServerName (host) { if (!host) { return null @@ -243,18 +287,36 @@ function getServerName (host) { return servername } +/** + * @function + * @template T + * @param {T} obj + * @returns {T} + */ function deepClone (obj) { return JSON.parse(JSON.stringify(obj)) } +/** + * @param {*} obj + * @returns {obj is AsyncIterable} + */ function isAsyncIterable (obj) { return !!(obj != null && typeof obj[Symbol.asyncIterator] === 'function') } +/** + * @param {*} obj + * @returns {obj is Iterable} + */ function isIterable (obj) { return !!(obj != null && (typeof obj[Symbol.iterator] === 'function' || typeof obj[Symbol.asyncIterator] === 'function')) } +/** + * @param {Blob|Buffer|import ('stream').Stream} body + * @returns {number|null} + */ function bodyLength (body) { if (body == null) { return 0 @@ -272,10 +334,19 @@ function bodyLength (body) { return null } +/** + * @param {import ('stream').Stream} body + * @returns {boolean} + */ function isDestroyed (body) { return body && !!(body.destroyed || body[kDestroyed] || (stream.isDestroyed?.(body))) } +/** + * @param {import ('stream').Stream} stream + * @param {Error} [err] + * @returns {void} + */ function destroy (stream, err) { if (stream == null || !isStream(stream) || isDestroyed(stream)) { return @@ -300,8 +371,12 @@ function destroy (stream, err) { } const KEEPALIVE_TIMEOUT_EXPR = /timeout=(\d+)/ +/** + * @param {string} val + * @returns {number | null} + */ function parseKeepAliveTimeout (val) { - const m = val.toString().match(KEEPALIVE_TIMEOUT_EXPR) + const m = val.match(KEEPALIVE_TIMEOUT_EXPR) return m ? parseInt(m[1], 10) * 1000 : null } @@ -326,12 +401,13 @@ function bufferToLowerCasedHeaderName (value) { } /** - * @param {Record | (Buffer | string | (Buffer | string)[])[]} headers + * @param {(Buffer | string)[]} headers * @param {Record} [obj] * @returns {Record} */ function parseHeaders (headers, obj) { if (obj === undefined) obj = {} + for (let i = 0; i < headers.length; i += 2) { const key = headerNameToString(headers[i]) let val = obj[key] @@ -360,9 +436,16 @@ function parseHeaders (headers, obj) { return obj } +/** + * @param {Buffer[]} headers + * @returns {string[]} + */ function parseRawHeaders (headers) { - const len = headers.length - const ret = new Array(len) + const headersLength = headers.length + /** + * @type {string[]} + */ + const ret = new Array(headersLength) let hasContentLength = false let contentDispositionIdx = -1 @@ -370,7 +453,7 @@ function parseRawHeaders (headers) { let val let kLen = 0 - for (let n = 0; n < headers.length; n += 2) { + for (let n = 0; n < headersLength; n += 2) { key = headers[n] val = headers[n + 1] @@ -395,16 +478,44 @@ function parseRawHeaders (headers) { return ret } +/** + * @param {string[]} headers + * @param {Buffer[]} headers + */ +function encodeRawHeaders (headers) { + if (!Array.isArray(headers)) { + throw new TypeError('expected headers to be an array') + } + return headers.map(x => Buffer.from(x)) +} + +/** + * @param {*} buffer + * @returns {buffer is Buffer} + */ function isBuffer (buffer) { // See, https://github.com/mcollina/undici/pull/319 return buffer instanceof Uint8Array || Buffer.isBuffer(buffer) } -function validateHandler (handler, method, upgrade) { +/** + * Asserts that the handler object is a request handler. + * + * @param {object} handler + * @param {string} method + * @param {string} [upgrade] + * @returns {asserts handler is import('../api/api-request').RequestHandler} + */ +function assertRequestHandler (handler, method, upgrade) { if (!handler || typeof handler !== 'object') { throw new InvalidArgumentError('handler must be an object') } + if (typeof handler.onRequestStart === 'function') { + // TODO (fix): More checks... + return + } + if (typeof handler.onConnect !== 'function') { throw new InvalidArgumentError('invalid onConnect method') } @@ -436,21 +547,33 @@ function validateHandler (handler, method, upgrade) { } } -// A body is disturbed if it has been read from and it cannot -// be re-used without losing state or data. +/** + * A body is disturbed if it has been read from and it cannot be re-used without + * losing state or data. + * @param {import('node:stream').Readable} body + * @returns {boolean} + */ function isDisturbed (body) { // TODO (fix): Why is body[kBodyUsed] needed? return !!(body && (stream.isDisturbed(body) || body[kBodyUsed])) } -function isErrored (body) { - return !!(body && stream.isErrored(body)) -} - -function isReadable (body) { - return !!(body && stream.isReadable(body)) -} +/** + * @typedef {object} SocketInfo + * @property {string} [localAddress] + * @property {number} [localPort] + * @property {string} [remoteAddress] + * @property {number} [remotePort] + * @property {string} [remoteFamily] + * @property {number} [timeout] + * @property {number} bytesWritten + * @property {number} bytesRead + */ +/** + * @param {import('net').Socket} socket + * @returns {SocketInfo} + */ function getSocketInfo (socket) { return { localAddress: socket.localAddress, @@ -464,7 +587,10 @@ function getSocketInfo (socket) { } } -/** @type {globalThis['ReadableStream']} */ +/** + * @param {Iterable} iterable + * @returns {ReadableStream} + */ function ReadableStreamFrom (iterable) { // We cannot use ReadableStream.from here because it does not return a byte stream. @@ -489,7 +615,7 @@ function ReadableStreamFrom (iterable) { } return controller.desiredSize > 0 }, - async cancel (reason) { + async cancel () { await iterator.return() }, type: 'bytes' @@ -497,8 +623,12 @@ function ReadableStreamFrom (iterable) { ) } -// The chunk should be a FormData instance and contains -// all the required methods. +/** + * The object should be a FormData instance and contains all the required + * methods. + * @param {*} object + * @returns {object is FormData} + */ function isFormDataLike (object) { return ( object && @@ -518,31 +648,56 @@ function addAbortListener (signal, listener) { signal.addEventListener('abort', listener, { once: true }) return () => signal.removeEventListener('abort', listener) } - signal.addListener('abort', listener) + signal.once('abort', listener) return () => signal.removeListener('abort', listener) } -const hasToWellFormed = typeof String.prototype.toWellFormed === 'function' -const hasIsWellFormed = typeof String.prototype.isWellFormed === 'function' - /** - * @param {string} val + * @function + * @param {string} value + * @returns {string} */ -function toUSVString (val) { - return hasToWellFormed ? `${val}`.toWellFormed() : nodeUtil.toUSVString(val) -} +const toUSVString = (() => { + if (typeof String.prototype.toWellFormed === 'function') { + /** + * @param {string} value + * @returns {string} + */ + return (value) => `${value}`.toWellFormed() + } else { + /** + * @param {string} value + * @returns {string} + */ + return nodeUtil.toUSVString + } +})() /** - * @param {string} val + * @param {*} value + * @returns {boolean} */ // TODO: move this to webidl -function isUSVString (val) { - return hasIsWellFormed ? `${val}`.isWellFormed() : toUSVString(val) === `${val}` -} +const isUSVString = (() => { + if (typeof String.prototype.isWellFormed === 'function') { + /** + * @param {*} value + * @returns {boolean} + */ + return (value) => `${value}`.isWellFormed() + } else { + /** + * @param {*} value + * @returns {boolean} + */ + return (value) => toUSVString(value) === `${value}` + } +})() /** * @see https://tools.ietf.org/html/rfc7230#section-3.2.6 * @param {number} c + * @returns {boolean} */ function isTokenCharCode (c) { switch (c) { @@ -573,6 +728,7 @@ function isTokenCharCode (c) { /** * @param {string} characters + * @returns {boolean} */ function isValidHTTPToken (characters) { if (characters.length === 0) { @@ -599,17 +755,31 @@ const headerCharRegex = /[^\t\x20-\x7e\x80-\xff]/ /** * @param {string} characters + * @returns {boolean} */ function isValidHeaderValue (characters) { return !headerCharRegex.test(characters) } -// Parsed accordingly to RFC 9110 -// https://www.rfc-editor.org/rfc/rfc9110#field.content-range +const rangeHeaderRegex = /^bytes (\d+)-(\d+)\/(\d+)?$/ + +/** + * @typedef {object} RangeHeader + * @property {number} start + * @property {number | null} end + * @property {number | null} size + */ + +/** + * Parse accordingly to RFC 9110 + * @see https://www.rfc-editor.org/rfc/rfc9110#field.content-range + * @param {string} [range] + * @returns {RangeHeader|null} + */ function parseRangeHeader (range) { if (range == null || range === '') return { start: 0, end: null, size: null } - const m = range ? range.match(/^bytes (\d+)-(\d+)\/(\d+)?$/) : null + const m = range ? range.match(rangeHeaderRegex) : null return m ? { start: parseInt(m[1]), @@ -619,6 +789,13 @@ function parseRangeHeader (range) { : null } +/** + * @template {import("events").EventEmitter} T + * @param {T} obj + * @param {string} name + * @param {(...args: any[]) => void} listener + * @returns {T} + */ function addListener (obj, name, listener) { const listeners = (obj[kListeners] ??= []) listeners.push([name, listener]) @@ -626,13 +803,26 @@ function addListener (obj, name, listener) { return obj } +/** + * @template {import("events").EventEmitter} T + * @param {T} obj + * @returns {T} + */ function removeAllListeners (obj) { - for (const [name, listener] of obj[kListeners] ?? []) { - obj.removeListener(name, listener) + if (obj[kListeners] != null) { + for (const [name, listener] of obj[kListeners]) { + obj.removeListener(name, listener) + } + obj[kListeners] = null } - obj[kListeners] = null + return obj } +/** + * @param {import ('../dispatcher/client')} client + * @param {import ('../core/request')} request + * @param {Error} err + */ function errorRequest (client, request, err) { try { request.onError(err) @@ -672,10 +862,7 @@ Object.setPrototypeOf(normalizedMethodRecords, null) module.exports = { kEnumerableProperty, - nop, isDisturbed, - isErrored, - isReadable, toUSVString, isUSVString, isBlobLike, @@ -692,6 +879,7 @@ module.exports = { removeAllListeners, errorRequest, parseRawHeaders, + encodeRawHeaders, parseHeaders, parseKeepAliveTimeout, destroy, @@ -699,10 +887,10 @@ module.exports = { deepClone, ReadableStreamFrom, isBuffer, - validateHandler, + assertRequestHandler, getSocketInfo, isFormDataLike, - buildURL, + serializePathWithQuery, addAbortListener, isValidHTTPToken, isValidHeaderValue, @@ -714,6 +902,6 @@ module.exports = { isHttpOrHttpsPrefixed, nodeMajor, nodeMinor, - safeHTTPMethods: ['GET', 'HEAD', 'OPTIONS', 'TRACE'], + safeHTTPMethods: Object.freeze(['GET', 'HEAD', 'OPTIONS', 'TRACE']), wrapRequestBody } diff --git a/deps/undici/src/lib/dispatcher/agent.js b/deps/undici/src/lib/dispatcher/agent.js index 98f1486cac096f..46fc15742d1498 100644 --- a/deps/undici/src/lib/dispatcher/agent.js +++ b/deps/undici/src/lib/dispatcher/agent.js @@ -1,17 +1,15 @@ 'use strict' const { InvalidArgumentError } = require('../core/errors') -const { kClients, kRunning, kClose, kDestroy, kDispatch, kInterceptors } = require('../core/symbols') +const { kClients, kRunning, kClose, kDestroy, kDispatch } = require('../core/symbols') const DispatcherBase = require('./dispatcher-base') const Pool = require('./pool') const Client = require('./client') const util = require('../core/util') -const createRedirectInterceptor = require('../interceptor/redirect-interceptor') const kOnConnect = Symbol('onConnect') const kOnDisconnect = Symbol('onDisconnect') const kOnConnectionError = Symbol('onConnectionError') -const kMaxRedirections = Symbol('maxRedirections') const kOnDrain = Symbol('onDrain') const kFactory = Symbol('factory') const kOptions = Symbol('options') @@ -23,9 +21,7 @@ function defaultFactory (origin, opts) { } class Agent extends DispatcherBase { - constructor ({ factory = defaultFactory, maxRedirections = 0, connect, ...options } = {}) { - super() - + constructor ({ factory = defaultFactory, connect, ...options } = {}) { if (typeof factory !== 'function') { throw new InvalidArgumentError('factory must be a function.') } @@ -34,23 +30,13 @@ class Agent extends DispatcherBase { throw new InvalidArgumentError('connect must be a function or an object') } - if (!Number.isInteger(maxRedirections) || maxRedirections < 0) { - throw new InvalidArgumentError('maxRedirections must be a positive number') - } + super() if (connect && typeof connect !== 'function') { connect = { ...connect } } - this[kInterceptors] = options.interceptors?.Agent && Array.isArray(options.interceptors.Agent) - ? options.interceptors.Agent - : [createRedirectInterceptor({ maxRedirections })] - this[kOptions] = { ...util.deepClone(options), connect } - this[kOptions].interceptors = options.interceptors - ? { ...options.interceptors } - : undefined - this[kMaxRedirections] = maxRedirections this[kFactory] = factory this[kClients] = new Map() diff --git a/deps/undici/src/lib/dispatcher/balanced-pool.js b/deps/undici/src/lib/dispatcher/balanced-pool.js index 1e2de289cb73fa..5bbec0e618dbb5 100644 --- a/deps/undici/src/lib/dispatcher/balanced-pool.js +++ b/deps/undici/src/lib/dispatcher/balanced-pool.js @@ -13,7 +13,7 @@ const { kGetDispatcher } = require('./pool-base') const Pool = require('./pool') -const { kUrl, kInterceptors } = require('../core/symbols') +const { kUrl } = require('../core/symbols') const { parseOrigin } = require('../core/util') const kFactory = Symbol('factory') @@ -50,6 +50,10 @@ function defaultFactory (origin, opts) { class BalancedPool extends PoolBase { constructor (upstreams = [], { factory = defaultFactory, ...opts } = {}) { + if (typeof factory !== 'function') { + throw new InvalidArgumentError('factory must be a function.') + } + super() this[kOptions] = opts @@ -63,13 +67,6 @@ class BalancedPool extends PoolBase { upstreams = [upstreams] } - if (typeof factory !== 'function') { - throw new InvalidArgumentError('factory must be a function.') - } - - this[kInterceptors] = opts.interceptors?.BalancedPool && Array.isArray(opts.interceptors.BalancedPool) - ? opts.interceptors.BalancedPool - : [] this[kFactory] = factory for (const upstream of upstreams) { diff --git a/deps/undici/src/lib/dispatcher/client-h1.js b/deps/undici/src/lib/dispatcher/client-h1.js index 2b8fa05da29427..37fe94e2c4fc49 100644 --- a/deps/undici/src/lib/dispatcher/client-h1.js +++ b/deps/undici/src/lib/dispatcher/client-h1.js @@ -49,13 +49,13 @@ const { kMaxResponseSize, kOnError, kResume, - kHTTPContext + kHTTPContext, + kClosed } = require('../core/symbols.js') const constants = require('../llhttp/constants.js') const EMPTY_BUF = Buffer.alloc(0) const FastBuffer = Buffer[Symbol.species] -const addListener = util.addListener const removeAllListeners = util.removeAllListeners let extractBody @@ -78,56 +78,107 @@ async function lazyllhttp () { return await WebAssembly.instantiate(mod, { env: { - /* eslint-disable camelcase */ - + /** + * @param {number} p + * @param {number} at + * @param {number} len + * @returns {number} + */ wasm_on_url: (p, at, len) => { /* istanbul ignore next */ return 0 }, + /** + * @param {number} p + * @param {number} at + * @param {number} len + * @returns {number} + */ wasm_on_status: (p, at, len) => { assert(currentParser.ptr === p) const start = at - currentBufferPtr + currentBufferRef.byteOffset - return currentParser.onStatus(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 + return currentParser.onStatus(new FastBuffer(currentBufferRef.buffer, start, len)) }, + /** + * @param {number} p + * @returns {number} + */ wasm_on_message_begin: (p) => { assert(currentParser.ptr === p) - return currentParser.onMessageBegin() || 0 + return currentParser.onMessageBegin() }, + /** + * @param {number} p + * @param {number} at + * @param {number} len + * @returns {number} + */ wasm_on_header_field: (p, at, len) => { assert(currentParser.ptr === p) const start = at - currentBufferPtr + currentBufferRef.byteOffset - return currentParser.onHeaderField(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 + return currentParser.onHeaderField(new FastBuffer(currentBufferRef.buffer, start, len)) }, + /** + * @param {number} p + * @param {number} at + * @param {number} len + * @returns {number} + */ wasm_on_header_value: (p, at, len) => { assert(currentParser.ptr === p) const start = at - currentBufferPtr + currentBufferRef.byteOffset - return currentParser.onHeaderValue(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 + return currentParser.onHeaderValue(new FastBuffer(currentBufferRef.buffer, start, len)) }, + /** + * @param {number} p + * @param {number} statusCode + * @param {0|1} upgrade + * @param {0|1} shouldKeepAlive + * @returns {number} + */ wasm_on_headers_complete: (p, statusCode, upgrade, shouldKeepAlive) => { assert(currentParser.ptr === p) - return currentParser.onHeadersComplete(statusCode, Boolean(upgrade), Boolean(shouldKeepAlive)) || 0 + return currentParser.onHeadersComplete(statusCode, upgrade === 1, shouldKeepAlive === 1) }, + /** + * @param {number} p + * @param {number} at + * @param {number} len + * @returns {number} + */ wasm_on_body: (p, at, len) => { assert(currentParser.ptr === p) const start = at - currentBufferPtr + currentBufferRef.byteOffset - return currentParser.onBody(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 + return currentParser.onBody(new FastBuffer(currentBufferRef.buffer, start, len)) }, + /** + * @param {number} p + * @returns {number} + */ wasm_on_message_complete: (p) => { assert(currentParser.ptr === p) - return currentParser.onMessageComplete() || 0 + return currentParser.onMessageComplete() } - /* eslint-enable camelcase */ } }) } let llhttpInstance = null +/** + * @type {Promise|null} + */ let llhttpPromise = lazyllhttp() llhttpPromise.catch() +/** + * @type {Parser|null} + */ let currentParser = null let currentBufferRef = null +/** + * @type {number} + */ let currentBufferSize = 0 let currentBufferPtr = null @@ -144,17 +195,23 @@ const TIMEOUT_BODY = 4 | USE_FAST_TIMER const TIMEOUT_KEEP_ALIVE = 8 | USE_NATIVE_TIMER class Parser { + /** + * @param {import('./client.js')} client + * @param {import('net').Socket} socket + * @param {*} llhttp + */ constructor (client, socket, { exports }) { - assert(Number.isFinite(client[kMaxHeadersSize]) && client[kMaxHeadersSize] > 0) - this.llhttp = exports this.ptr = this.llhttp.llhttp_alloc(constants.TYPE.RESPONSE) this.client = client + /** + * @type {import('net').Socket} + */ this.socket = socket this.timeout = null this.timeoutValue = null this.timeoutType = null - this.statusCode = null + this.statusCode = 0 this.statusText = '' this.upgrade = false this.headers = [] @@ -213,7 +270,7 @@ class Parser { } assert(this.ptr != null) - assert(currentParser == null) + assert(currentParser === null) this.llhttp.llhttp_resume(this.ptr) @@ -240,22 +297,27 @@ class Parser { } } - execute (data) { + /** + * @param {Buffer} chunk + */ + execute (chunk) { + assert(currentParser === null) assert(this.ptr != null) - assert(currentParser == null) assert(!this.paused) const { socket, llhttp } = this - if (data.length > currentBufferSize) { + // Allocate a new buffer if the current buffer is too small. + if (chunk.length > currentBufferSize) { if (currentBufferPtr) { llhttp.free(currentBufferPtr) } - currentBufferSize = Math.ceil(data.length / 4096) * 4096 + // Allocate a buffer that is a multiple of 4096 bytes. + currentBufferSize = Math.ceil(chunk.length / 4096) * 4096 currentBufferPtr = llhttp.malloc(currentBufferSize) } - new Uint8Array(llhttp.memory.buffer, currentBufferPtr, currentBufferSize).set(data) + new Uint8Array(llhttp.memory.buffer, currentBufferPtr, currentBufferSize).set(chunk) // Call `execute` on the wasm parser. // We pass the `llhttp_parser` pointer address, the pointer address of buffer view data, @@ -265,9 +327,9 @@ class Parser { let ret try { - currentBufferRef = data + currentBufferRef = chunk currentParser = this - ret = llhttp.llhttp_execute(this.ptr, currentBufferPtr, data.length) + ret = llhttp.llhttp_execute(this.ptr, currentBufferPtr, chunk.length) /* eslint-disable-next-line no-useless-catch */ } catch (err) { /* istanbul ignore next: difficult to make a test case for */ @@ -277,25 +339,27 @@ class Parser { currentBufferRef = null } - const offset = llhttp.llhttp_get_error_pos(this.ptr) - currentBufferPtr - - if (ret === constants.ERROR.PAUSED_UPGRADE) { - this.onUpgrade(data.slice(offset)) - } else if (ret === constants.ERROR.PAUSED) { - this.paused = true - socket.unshift(data.slice(offset)) - } else if (ret !== constants.ERROR.OK) { - const ptr = llhttp.llhttp_get_error_reason(this.ptr) - let message = '' - /* istanbul ignore else: difficult to make a test case for */ - if (ptr) { - const len = new Uint8Array(llhttp.memory.buffer, ptr).indexOf(0) - message = - 'Response does not match the HTTP/1.1 protocol (' + - Buffer.from(llhttp.memory.buffer, ptr, len).toString() + - ')' + if (ret !== constants.ERROR.OK) { + const data = chunk.subarray(llhttp.llhttp_get_error_pos(this.ptr) - currentBufferPtr) + + if (ret === constants.ERROR.PAUSED_UPGRADE) { + this.onUpgrade(data) + } else if (ret === constants.ERROR.PAUSED) { + this.paused = true + socket.unshift(data) + } else { + const ptr = llhttp.llhttp_get_error_reason(this.ptr) + let message = '' + /* istanbul ignore else: difficult to make a test case for */ + if (ptr) { + const len = new Uint8Array(llhttp.memory.buffer, ptr).indexOf(0) + message = + 'Response does not match the HTTP/1.1 protocol (' + + Buffer.from(llhttp.memory.buffer, ptr, len).toString() + + ')' + } + throw new HTTPParserError(message, constants.ERROR[ret], data) } - throw new HTTPParserError(message, constants.ERROR[ret], data.slice(offset)) } } catch (err) { util.destroy(socket, err) @@ -303,8 +367,8 @@ class Parser { } destroy () { + assert(currentParser === null) assert(this.ptr != null) - assert(currentParser == null) this.llhttp.llhttp_free(this.ptr) this.ptr = null @@ -317,10 +381,18 @@ class Parser { this.paused = false } + /** + * @param {Buffer} buf + * @returns {0} + */ onStatus (buf) { this.statusText = buf.toString() + return 0 } + /** + * @returns {0|-1} + */ onMessageBegin () { const { socket, client } = this @@ -334,8 +406,14 @@ class Parser { return -1 } request.onResponseStarted() + + return 0 } + /** + * @param {Buffer} buf + * @returns {number} + */ onHeaderField (buf) { const len = this.headers.length @@ -346,8 +424,14 @@ class Parser { } this.trackHeader(buf.length) + + return 0 } + /** + * @param {Buffer} buf + * @returns {number} + */ onHeaderValue (buf) { let len = this.headers.length @@ -371,8 +455,13 @@ class Parser { } this.trackHeader(buf.length) + + return 0 } + /** + * @param {number} len + */ trackHeader (len) { this.headersSize += len if (this.headersSize >= this.headersMaxSize) { @@ -380,6 +469,9 @@ class Parser { } } + /** + * @param {Buffer} head + */ onUpgrade (head) { const { upgrade, client, socket, headers, statusCode } = this @@ -393,9 +485,9 @@ class Parser { assert(request) assert(request.upgrade || request.method === 'CONNECT') - this.statusCode = null + this.statusCode = 0 this.statusText = '' - this.shouldKeepAlive = null + this.shouldKeepAlive = false this.headers = [] this.headersSize = 0 @@ -424,6 +516,12 @@ class Parser { client[kResume]() } + /** + * @param {number} statusCode + * @param {boolean} upgrade + * @param {boolean} shouldKeepAlive + * @returns {number} + */ onHeadersComplete (statusCode, upgrade, shouldKeepAlive) { const { client, socket, headers, statusText } = this @@ -533,6 +631,10 @@ class Parser { return pause ? constants.ERROR.PAUSED : 0 } + /** + * @param {Buffer} buf + * @returns {number} + */ onBody (buf) { const { client, socket, statusCode, maxResponseSize } = this @@ -563,8 +665,13 @@ class Parser { if (request.onData(buf) === false) { return constants.ERROR.PAUSED } + + return 0 } + /** + * @returns {number} + */ onMessageComplete () { const { client, socket, statusCode, upgrade, headers, contentLength, bytesRead, shouldKeepAlive } = this @@ -573,7 +680,7 @@ class Parser { } if (upgrade) { - return + return 0 } assert(statusCode >= 100) @@ -582,7 +689,7 @@ class Parser { const request = client[kQueue][client[kRunningIdx]] assert(request) - this.statusCode = null + this.statusCode = 0 this.statusText = '' this.bytesRead = 0 this.contentLength = '' @@ -593,7 +700,7 @@ class Parser { this.headersSize = 0 if (statusCode < 200) { - return + return 0 } /* istanbul ignore next: should be handled by llhttp? */ @@ -629,6 +736,8 @@ class Parser { } else { client[kResume]() } + + return 0 } } @@ -651,12 +760,28 @@ function onParserTimeout (parser) { } } +/** + * @param {import ('./client.js')} client + * @param {import('net').Socket} socket + * @returns + */ async function connectH1 (client, socket) { client[kSocket] = socket if (!llhttpInstance) { + const noop = () => {} + socket.on('error', noop) llhttpInstance = await llhttpPromise llhttpPromise = null + socket.off('error', noop) + } + + if (socket.errored) { + throw socket.errored + } + + if (socket.destroyed) { + throw new SocketError('destroyed') } socket[kNoRef] = false @@ -665,110 +790,45 @@ async function connectH1 (client, socket) { socket[kBlocking] = false socket[kParser] = new Parser(client, socket, llhttpInstance) - addListener(socket, 'error', function (err) { - assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID') - - const parser = this[kParser] - - // On Mac OS, we get an ECONNRESET even if there is a full body to be forwarded - // to the user. - if (err.code === 'ECONNRESET' && parser.statusCode && !parser.shouldKeepAlive) { - // We treat all incoming data so for as a valid response. - parser.onMessageComplete() - return - } - - this[kError] = err - - this[kClient][kOnError](err) - }) - addListener(socket, 'readable', function () { - const parser = this[kParser] - - if (parser) { - parser.readMore() - } - }) - addListener(socket, 'end', function () { - const parser = this[kParser] - - if (parser.statusCode && !parser.shouldKeepAlive) { - // We treat all incoming data so far as a valid response. - parser.onMessageComplete() - return - } - - util.destroy(this, new SocketError('other side closed', util.getSocketInfo(this))) - }) - addListener(socket, 'close', function () { - const client = this[kClient] - const parser = this[kParser] - - if (parser) { - if (!this[kError] && parser.statusCode && !parser.shouldKeepAlive) { - // We treat all incoming data so far as a valid response. - parser.onMessageComplete() - } - - this[kParser].destroy() - this[kParser] = null - } - - const err = this[kError] || new SocketError('closed', util.getSocketInfo(this)) - - client[kSocket] = null - client[kHTTPContext] = null // TODO (fix): This is hacky... - - if (client.destroyed) { - assert(client[kPending] === 0) - - // Fail entire queue. - const requests = client[kQueue].splice(client[kRunningIdx]) - for (let i = 0; i < requests.length; i++) { - const request = requests[i] - util.errorRequest(client, request, err) - } - } else if (client[kRunning] > 0 && err.code !== 'UND_ERR_INFO') { - // Fail head of pipeline. - const request = client[kQueue][client[kRunningIdx]] - client[kQueue][client[kRunningIdx]++] = null - - util.errorRequest(client, request, err) - } - - client[kPendingIdx] = client[kRunningIdx] - - assert(client[kRunning] === 0) + util.addListener(socket, 'error', onHttpSocketError) + util.addListener(socket, 'readable', onHttpSocketReadable) + util.addListener(socket, 'end', onHttpSocketEnd) + util.addListener(socket, 'close', onHttpSocketClose) - client.emit('disconnect', client[kUrl], [client], err) - - client[kResume]() - }) - - let closed = false - socket.on('close', () => { - closed = true - }) + socket[kClosed] = false + socket.on('close', onSocketClose) return { version: 'h1', defaultPipelining: 1, - write (...args) { - return writeH1(client, ...args) + write (request) { + return writeH1(client, request) }, resume () { resumeH1(client) }, + /** + * @param {Error|undefined} err + * @param {() => void} callback + */ destroy (err, callback) { - if (closed) { + if (socket[kClosed]) { queueMicrotask(callback) } else { - socket.destroy(err).on('close', callback) + socket.on('close', callback) + socket.destroy(err) } }, + /** + * @returns {boolean} + */ get destroyed () { return socket.destroyed }, + /** + * @param {import('../core/request.js')} request + * @returns {boolean} + */ busy (request) { if (socket[kWriting] || socket[kReset] || socket[kBlocking]) { return true @@ -808,6 +868,93 @@ async function connectH1 (client, socket) { } } +function onHttpSocketError (err) { + assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID') + + const parser = this[kParser] + + // On Mac OS, we get an ECONNRESET even if there is a full body to be forwarded + // to the user. + if (err.code === 'ECONNRESET' && parser.statusCode && !parser.shouldKeepAlive) { + // We treat all incoming data so for as a valid response. + parser.onMessageComplete() + return + } + + this[kError] = err + + this[kClient][kOnError](err) +} + +function onHttpSocketReadable () { + this[kParser]?.readMore() +} + +function onHttpSocketEnd () { + const parser = this[kParser] + + if (parser.statusCode && !parser.shouldKeepAlive) { + // We treat all incoming data so far as a valid response. + parser.onMessageComplete() + return + } + + util.destroy(this, new SocketError('other side closed', util.getSocketInfo(this))) +} + +function onHttpSocketClose () { + const parser = this[kParser] + + if (parser) { + if (!this[kError] && parser.statusCode && !parser.shouldKeepAlive) { + // We treat all incoming data so far as a valid response. + parser.onMessageComplete() + } + + this[kParser].destroy() + this[kParser] = null + } + + const err = this[kError] || new SocketError('closed', util.getSocketInfo(this)) + + const client = this[kClient] + + client[kSocket] = null + client[kHTTPContext] = null // TODO (fix): This is hacky... + + if (client.destroyed) { + assert(client[kPending] === 0) + + // Fail entire queue. + const requests = client[kQueue].splice(client[kRunningIdx]) + for (let i = 0; i < requests.length; i++) { + const request = requests[i] + util.errorRequest(client, request, err) + } + } else if (client[kRunning] > 0 && err.code !== 'UND_ERR_INFO') { + // Fail head of pipeline. + const request = client[kQueue][client[kRunningIdx]] + client[kQueue][client[kRunningIdx]++] = null + + util.errorRequest(client, request, err) + } + + client[kPendingIdx] = client[kRunningIdx] + + assert(client[kRunning] === 0) + + client.emit('disconnect', client[kUrl], [client], err) + + client[kResume]() +} + +function onSocketClose () { + this[kClosed] = true +} + +/** + * @param {import('./client.js')} client + */ function resumeH1 (client) { const socket = client[kSocket] @@ -843,6 +990,11 @@ function shouldSendContentLength (method) { return method !== 'GET' && method !== 'HEAD' && method !== 'OPTIONS' && method !== 'TRACE' && method !== 'CONNECT' } +/** + * @param {import('./client.js')} client + * @param {import('../core/request.js')} request + * @returns + */ function writeH1 (client, request) { const { method, path, host, upgrade, blocking, reset } = request @@ -916,6 +1068,10 @@ function writeH1 (client, request) { const socket = client[kSocket] + /** + * @param {Error} [err] + * @returns {void} + */ const abort = (err) => { if (request.aborted || request.completed) { return @@ -1021,6 +1177,16 @@ function writeH1 (client, request) { return true } +/** + * @param {AbortCallback} abort + * @param {import('stream').Stream} body + * @param {import('./client.js')} client + * @param {import('../core/request.js')} request + * @param {import('net').Socket} socket + * @param {number} contentLength + * @param {string} header + * @param {boolean} expectsPayload + */ function writeStream (abort, body, client, request, socket, contentLength, header, expectsPayload) { assert(contentLength !== 0 || client[kRunning] === 0, 'stream body cannot be pipelined') @@ -1028,6 +1194,10 @@ function writeStream (abort, body, client, request, socket, contentLength, heade const writer = new AsyncWriter({ abort, socket, request, contentLength, client, expectsPayload, header }) + /** + * @param {Buffer} chunk + * @returns {void} + */ const onData = function (chunk) { if (finished) { return @@ -1041,6 +1211,10 @@ function writeStream (abort, body, client, request, socket, contentLength, heade util.destroy(this, err) } } + + /** + * @returns {void} + */ const onDrain = function () { if (finished) { return @@ -1050,6 +1224,10 @@ function writeStream (abort, body, client, request, socket, contentLength, heade body.resume() } } + + /** + * @returns {void} + */ const onClose = function () { // 'close' might be emitted *before* 'error' for // broken streams. Wait a tick to avoid this case. @@ -1064,6 +1242,11 @@ function writeStream (abort, body, client, request, socket, contentLength, heade queueMicrotask(() => onFinished(err)) } } + + /** + * @param {Error} [err] + * @returns + */ const onFinished = function (err) { if (finished) { return @@ -1124,6 +1307,24 @@ function writeStream (abort, body, client, request, socket, contentLength, heade } } +/** + * @typedef AbortCallback + * @type {Function} + * @param {Error} [err] + * @returns {void} + */ + +/** + * @param {AbortCallback} abort + * @param {Uint8Array|null} body + * @param {import('./client.js')} client + * @param {import('../core/request.js')} request + * @param {import('net').Socket} socket + * @param {number} contentLength + * @param {string} header + * @param {boolean} expectsPayload + * @returns {void} + */ function writeBuffer (abort, body, client, request, socket, contentLength, header, expectsPayload) { try { if (!body) { @@ -1154,6 +1355,17 @@ function writeBuffer (abort, body, client, request, socket, contentLength, heade } } +/** + * @param {AbortCallback} abort + * @param {Blob} body + * @param {import('./client.js')} client + * @param {import('../core/request.js')} request + * @param {import('net').Socket} socket + * @param {number} contentLength + * @param {string} header + * @param {boolean} expectsPayload + * @returns {Promise} + */ async function writeBlob (abort, body, client, request, socket, contentLength, header, expectsPayload) { assert(contentLength === body.size, 'blob body must have content length') @@ -1182,6 +1394,17 @@ async function writeBlob (abort, body, client, request, socket, contentLength, h } } +/** + * @param {AbortCallback} abort + * @param {Iterable} body + * @param {import('./client.js')} client + * @param {import('../core/request.js')} request + * @param {import('net').Socket} socket + * @param {number} contentLength + * @param {string} header + * @param {boolean} expectsPayload + * @returns {Promise} + */ async function writeIterable (abort, body, client, request, socket, contentLength, header, expectsPayload) { assert(contentLength !== 0 || client[kRunning] === 0, 'iterator body cannot be pipelined') @@ -1232,6 +1455,17 @@ async function writeIterable (abort, body, client, request, socket, contentLengt } class AsyncWriter { + /** + * + * @param {object} arg + * @param {AbortCallback} arg.abort + * @param {import('net').Socket} arg.socket + * @param {import('../core/request.js')} arg.request + * @param {number} arg.contentLength + * @param {import('./client.js')} arg.client + * @param {boolean} arg.expectsPayload + * @param {string} arg.header + */ constructor ({ abort, socket, request, contentLength, client, expectsPayload, header }) { this.socket = socket this.request = request @@ -1245,6 +1479,10 @@ class AsyncWriter { socket[kWriting] = true } + /** + * @param {Buffer} chunk + * @returns + */ write (chunk) { const { socket, request, contentLength, client, bytesWritten, expectsPayload, header } = this @@ -1308,6 +1546,9 @@ class AsyncWriter { return ret } + /** + * @returns {void} + */ end () { const { socket, contentLength, client, bytesWritten, expectsPayload, header, request } = this request.onRequestSent() @@ -1355,6 +1596,10 @@ class AsyncWriter { client[kResume]() } + /** + * @param {Error} [err] + * @returns {void} + */ destroy (err) { const { socket, client, abort } = this diff --git a/deps/undici/src/lib/dispatcher/client-h2.js b/deps/undici/src/lib/dispatcher/client-h2.js index 0448fa00736a77..d34c7cab989537 100644 --- a/deps/undici/src/lib/dispatcher/client-h2.js +++ b/deps/undici/src/lib/dispatcher/client-h2.js @@ -26,13 +26,15 @@ const { kHTTP2Session, kResume, kSize, - kHTTPContext + kHTTPContext, + kClosed, + kBodyTimeout } = require('../core/symbols.js') +const { channels } = require('../core/diagnostics.js') const kOpenStreams = Symbol('open streams') -// Experimental -let h2ExperimentalWarned = false +let extractBody /** @type {import('http2')} */ let http2 @@ -78,100 +80,51 @@ function parseH2Headers (headers) { async function connectH2 (client, socket) { client[kSocket] = socket - if (!h2ExperimentalWarned) { - h2ExperimentalWarned = true - process.emitWarning('H2 support is experimental, expect them to change at any time.', { - code: 'UNDICI-H2' - }) - } - const session = http2.connect(client[kUrl], { createConnection: () => socket, - peerMaxConcurrentStreams: client[kMaxConcurrentStreams] + peerMaxConcurrentStreams: client[kMaxConcurrentStreams], + settings: { + // TODO(metcoder95): add support for PUSH + enablePush: false + } }) session[kOpenStreams] = 0 session[kClient] = client session[kSocket] = socket + session[kHTTP2Session] = null util.addListener(session, 'error', onHttp2SessionError) util.addListener(session, 'frameError', onHttp2FrameError) util.addListener(session, 'end', onHttp2SessionEnd) - util.addListener(session, 'goaway', onHTTP2GoAway) - util.addListener(session, 'close', function () { - const { [kClient]: client } = this - const { [kSocket]: socket } = client - - const err = this[kSocket][kError] || this[kError] || new SocketError('closed', util.getSocketInfo(socket)) - - client[kHTTP2Session] = null - - if (client.destroyed) { - assert(client[kPending] === 0) - - // Fail entire queue. - const requests = client[kQueue].splice(client[kRunningIdx]) - for (let i = 0; i < requests.length; i++) { - const request = requests[i] - util.errorRequest(client, request, err) - } - } - }) + util.addListener(session, 'goaway', onHttp2SessionGoAway) + util.addListener(session, 'close', onHttp2SessionClose) session.unref() client[kHTTP2Session] = session socket[kHTTP2Session] = session - util.addListener(socket, 'error', function (err) { - assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID') - - this[kError] = err - - this[kClient][kOnError](err) - }) + util.addListener(socket, 'error', onHttp2SocketError) + util.addListener(socket, 'end', onHttp2SocketEnd) + util.addListener(socket, 'close', onHttp2SocketClose) - util.addListener(socket, 'end', function () { - util.destroy(this, new SocketError('other side closed', util.getSocketInfo(this))) - }) - - util.addListener(socket, 'close', function () { - const err = this[kError] || new SocketError('closed', util.getSocketInfo(this)) - - client[kSocket] = null - - if (this[kHTTP2Session] != null) { - this[kHTTP2Session].destroy(err) - } - - client[kPendingIdx] = client[kRunningIdx] - - assert(client[kRunning] === 0) - - client.emit('disconnect', client[kUrl], [client], err) - - client[kResume]() - }) - - let closed = false - socket.on('close', () => { - closed = true - }) + socket[kClosed] = false + socket.on('close', onSocketClose) return { version: 'h2', defaultPipelining: Infinity, - write (...args) { - return writeH2(client, ...args) + write (request) { + return writeH2(client, request) }, resume () { resumeH2(client) }, destroy (err, callback) { - if (closed) { + if (socket[kClosed]) { queueMicrotask(callback) } else { - // Destroying the socket will trigger the session close socket.destroy(err).on('close', callback) } }, @@ -188,7 +141,7 @@ function resumeH2 (client) { const socket = client[kSocket] if (socket?.destroyed === false) { - if (client[kSize] === 0 && client[kMaxConcurrentStreams] === 0) { + if (client[kSize] === 0 || client[kMaxConcurrentStreams] === 0) { socket.unref() client[kHTTP2Session].unref() } else { @@ -223,26 +176,74 @@ function onHttp2SessionEnd () { * This is the root cause of #3011 * We need to handle GOAWAY frames properly, and trigger the session close * along with the socket right away + * + * @this {import('http2').ClientHttp2Session} + * @param {number} errorCode */ -function onHTTP2GoAway (code) { - // We cannot recover, so best to close the session and the socket - const err = this[kError] || new SocketError(`HTTP/2: "GOAWAY" frame received with code ${code}`, util.getSocketInfo(this)) +function onHttp2SessionGoAway (errorCode) { + // TODO(mcollina): Verify if GOAWAY implements the spec correctly: + // https://datatracker.ietf.org/doc/html/rfc7540#section-6.8 + // Specifically, we do not verify the "valid" stream id. + + const err = this[kError] || new SocketError(`HTTP/2: "GOAWAY" frame received with code ${errorCode}`, util.getSocketInfo(this[kSocket])) const client = this[kClient] client[kSocket] = null client[kHTTPContext] = null - if (this[kHTTP2Session] != null) { - this[kHTTP2Session].destroy(err) - this[kHTTP2Session] = null - } + // this is an HTTP2 session + this.close() + this[kHTTP2Session] = null util.destroy(this[kSocket], err) // Fail head of pipeline. - const request = client[kQueue][client[kRunningIdx]] - client[kQueue][client[kRunningIdx]++] = null - util.errorRequest(client, request, err) + if (client[kRunningIdx] < client[kQueue].length) { + const request = client[kQueue][client[kRunningIdx]] + client[kQueue][client[kRunningIdx]++] = null + util.errorRequest(client, request, err) + client[kPendingIdx] = client[kRunningIdx] + } + + assert(client[kRunning] === 0) + + client.emit('disconnect', client[kUrl], [client], err) + + client[kResume]() +} + +function onHttp2SessionClose () { + const { [kClient]: client } = this + const { [kSocket]: socket } = client + + const err = this[kSocket][kError] || this[kError] || new SocketError('closed', util.getSocketInfo(socket)) + + client[kSocket] = null + client[kHTTPContext] = null + + if (client.destroyed) { + assert(client[kPending] === 0) + + // Fail entire queue. + const requests = client[kQueue].splice(client[kRunningIdx]) + for (let i = 0; i < requests.length; i++) { + const request = requests[i] + util.errorRequest(client, request, err) + } + } +} + +function onHttp2SocketClose () { + const err = this[kError] || new SocketError('closed', util.getSocketInfo(this)) + + const client = this[kHTTP2Session][kClient] + + client[kSocket] = null + client[kHTTPContext] = null + + if (this[kHTTP2Session] !== null) { + this[kHTTP2Session].destroy(err) + } client[kPendingIdx] = client[kRunningIdx] @@ -253,14 +254,32 @@ function onHTTP2GoAway (code) { client[kResume]() } +function onHttp2SocketError (err) { + assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID') + + this[kError] = err + + this[kClient][kOnError](err) +} + +function onHttp2SocketEnd () { + util.destroy(this, new SocketError('other side closed', util.getSocketInfo(this))) +} + +function onSocketClose () { + this[kClosed] = true +} + // https://www.rfc-editor.org/rfc/rfc7230#section-3.3.2 function shouldSendContentLength (method) { return method !== 'GET' && method !== 'HEAD' && method !== 'OPTIONS' && method !== 'TRACE' && method !== 'CONNECT' } function writeH2 (client, request) { + const requestTimeout = request.bodyTimeout ?? client[kBodyTimeout] const session = client[kHTTP2Session] - const { body, method, path, host, upgrade, expectContinue, signal, headers: reqHeaders } = request + const { method, path, host, upgrade, expectContinue, signal, headers: reqHeaders } = request + let { body } = request if (upgrade) { util.errorRequest(client, request, new Error('Upgrade not supported for H2')) @@ -286,7 +305,7 @@ function writeH2 (client, request) { } /** @type {import('node:http2').ClientHttp2Stream} */ - let stream + let stream = null const { hostname, port } = client[kUrl] @@ -303,14 +322,21 @@ function writeH2 (client, request) { util.errorRequest(client, request, err) if (stream != null) { - util.destroy(stream, err) + // Some chunks might still come after abort, + // let's ignore them + stream.removeAllListeners('data') + + // On Abort, we close the stream to send RST_STREAM frame + stream.close() + + // We move the running index to the next request + client[kOnError](err) + client[kResume]() } // We do not destroy the socket as we can continue using the session - // the stream get's destroyed and the session remains to create new streams + // the stream gets destroyed and the session remains to create new streams util.destroy(body, err) - client[kQueue][client[kRunningIdx]++] = null - client[kResume]() } try { @@ -333,7 +359,7 @@ function writeH2 (client, request) { // We disabled endStream to allow the user to write to the stream stream = session.request(headers, { endStream: false, signal }) - if (stream.id && !stream.pending) { + if (!stream.pending) { request.onUpgrade(null, null, stream) ++session[kOpenStreams] client[kQueue][client[kRunningIdx]++] = null @@ -349,6 +375,7 @@ function writeH2 (client, request) { session[kOpenStreams] -= 1 if (session[kOpenStreams] === 0) session.unref() }) + stream.setTimeout(requestTimeout) return true } @@ -381,6 +408,16 @@ function writeH2 (client, request) { let contentLength = util.bodyLength(body) + if (util.isFormDataLike(body)) { + extractBody ??= require('../web/fetch/body.js').extractBody + + const [bodyStream, contentType] = extractBody(body) + headers['content-type'] = contentType + + body = bodyStream.stream + contentLength = bodyStream.length + } + if (contentLength == null) { contentLength = request.contentLength } @@ -412,6 +449,15 @@ function writeH2 (client, request) { session.ref() + if (channels.sendHeaders.hasSubscribers) { + let header = '' + for (const key in headers) { + header += `${key}: ${headers[key]}\r\n` + } + channels.sendHeaders.publish({ request, headers: header, socket: session[kSocket] }) + } + + // TODO(metcoder95): add support for sending trailers const shouldEndStream = method === 'GET' || method === 'HEAD' || body === null if (expectContinue) { headers[HTTP2_HEADER_EXPECT] = '100-continue' @@ -423,11 +469,13 @@ function writeH2 (client, request) { endStream: shouldEndStream, signal }) + writeBodyH2() } // Increment counter as we have new streams open ++session[kOpenStreams] + stream.setTimeout(requestTimeout) stream.once('response', headers => { const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers @@ -439,46 +487,53 @@ function writeH2 (client, request) { // for those scenarios, best effort is to destroy the stream immediately // as there's no value to keep it open. if (request.aborted) { - const err = new RequestAbortedError() - util.errorRequest(client, request, err) - util.destroy(stream, err) + stream.removeAllListeners('data') return } if (request.onHeaders(Number(statusCode), parseH2Headers(realHeaders), stream.resume.bind(stream), '') === false) { stream.pause() } + }) - stream.on('data', (chunk) => { - if (request.onData(chunk) === false) { - stream.pause() - } - }) + stream.on('data', (chunk) => { + if (request.onData(chunk) === false) { + stream.pause() + } }) - stream.once('end', () => { + stream.once('end', (err) => { + stream.removeAllListeners('data') // When state is null, it means we haven't consumed body and the stream still do not have // a state. // Present specially when using pipeline or stream if (stream.state?.state == null || stream.state.state < 6) { - request.onComplete([]) - } + // Do not complete the request if it was aborted + // Not prone to happen for as safety net to avoid race conditions with 'trailers' + if (!request.aborted && !request.completed) { + request.onComplete({}) + } - if (session[kOpenStreams] === 0) { + client[kQueue][client[kRunningIdx]++] = null + client[kResume]() + } else { // Stream is closed or half-closed-remote (6), decrement counter and cleanup // It does not have sense to continue working with the stream as we do not // have yet RST_STREAM support on client-side + --session[kOpenStreams] + if (session[kOpenStreams] === 0) { + session.unref() + } - session.unref() + abort(err ?? new InformationalError('HTTP/2: stream half-closed (remote)')) + client[kQueue][client[kRunningIdx]++] = null + client[kPendingIdx] = client[kRunningIdx] + client[kResume]() } - - abort(new InformationalError('HTTP/2: stream half-closed (remote)')) - client[kQueue][client[kRunningIdx]++] = null - client[kPendingIdx] = client[kRunningIdx] - client[kResume]() }) stream.once('close', () => { + stream.removeAllListeners('data') session[kOpenStreams] -= 1 if (session[kOpenStreams] === 0) { session.unref() @@ -486,28 +541,38 @@ function writeH2 (client, request) { }) stream.once('error', function (err) { + stream.removeAllListeners('data') abort(err) }) stream.once('frameError', (type, code) => { + stream.removeAllListeners('data') abort(new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`)) }) - // stream.on('aborted', () => { - // // TODO(HTTP/2): Support aborted - // }) + stream.on('aborted', () => { + stream.removeAllListeners('data') + }) + + stream.on('timeout', () => { + const err = new InformationalError(`HTTP/2: "stream timeout after ${requestTimeout}"`) + stream.removeAllListeners('data') + session[kOpenStreams] -= 1 + + if (session[kOpenStreams] === 0) { + session.unref() + } - // stream.on('timeout', () => { - // // TODO(HTTP/2): Support timeout - // }) + abort(err) + }) - // stream.on('push', headers => { - // // TODO(HTTP/2): Support push - // }) + stream.once('trailers', trailers => { + if (request.aborted || request.completed) { + return + } - // stream.on('trailers', headers => { - // // TODO(HTTP/2): Support trailers - // }) + request.onComplete(trailers) + }) return true diff --git a/deps/undici/src/lib/dispatcher/client.js b/deps/undici/src/lib/dispatcher/client.js index 3dc356618ba99a..3939b89b5b4085 100644 --- a/deps/undici/src/lib/dispatcher/client.js +++ b/deps/undici/src/lib/dispatcher/client.js @@ -1,5 +1,3 @@ -// @ts-check - 'use strict' const assert = require('node:assert') @@ -43,13 +41,11 @@ const { kBodyTimeout, kStrictContentLength, kConnector, - kMaxRedirections, kMaxRequests, kCounter, kClose, kDestroy, kDispatch, - kInterceptors, kLocalAddress, kMaxResponseSize, kOnError, @@ -59,10 +55,16 @@ const { } = require('../core/symbols.js') const connectH1 = require('./client-h1.js') const connectH2 = require('./client-h2.js') -let deprecatedInterceptorWarned = false const kClosedResolve = Symbol('kClosedResolve') +const getDefaultNodeMaxHeaderSize = http && + http.maxHeaderSize && + Number.isInteger(http.maxHeaderSize) && + http.maxHeaderSize > 0 + ? () => http.maxHeaderSize + : () => { throw new InvalidArgumentError('http module not available or http.maxHeaderSize invalid') } + const noop = () => {} function getPipelining (client) { @@ -79,7 +81,6 @@ class Client extends DispatcherBase { * @param {import('../../types/client.js').Client.Options} options */ constructor (url, { - interceptors, maxHeaderSize, headersTimeout, socketTimeout, @@ -97,7 +98,6 @@ class Client extends DispatcherBase { tls, strictContentLength, maxCachedSessions, - maxRedirections, connect, maxRequestsPerClient, localAddress, @@ -108,8 +108,6 @@ class Client extends DispatcherBase { maxConcurrentStreams, allowH2 } = {}) { - super() - if (keepAlive !== undefined) { throw new InvalidArgumentError('unsupported keepAlive, use pipelining=0 instead') } @@ -130,8 +128,14 @@ class Client extends DispatcherBase { throw new InvalidArgumentError('unsupported maxKeepAliveTimeout, use keepAliveMaxTimeout instead') } - if (maxHeaderSize != null && !Number.isFinite(maxHeaderSize)) { - throw new InvalidArgumentError('invalid maxHeaderSize') + if (maxHeaderSize != null) { + if (!Number.isInteger(maxHeaderSize) || maxHeaderSize < 1) { + throw new InvalidArgumentError('invalid maxHeaderSize') + } + } else { + // If maxHeaderSize is not provided, use the default value from the http module + // or if that is not available, throw an error. + maxHeaderSize = getDefaultNodeMaxHeaderSize() } if (socketPath != null && typeof socketPath !== 'string') { @@ -166,10 +170,6 @@ class Client extends DispatcherBase { throw new InvalidArgumentError('connect must be a function or an object') } - if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { - throw new InvalidArgumentError('maxRedirections must be a positive number') - } - if (maxRequestsPerClient != null && (!Number.isInteger(maxRequestsPerClient) || maxRequestsPerClient < 0)) { throw new InvalidArgumentError('maxRequestsPerClient must be a positive number') } @@ -198,6 +198,8 @@ class Client extends DispatcherBase { throw new InvalidArgumentError('maxConcurrentStreams must be a positive integer, greater than 0') } + super() + if (typeof connect !== 'function') { connect = buildConnector({ ...tls, @@ -210,22 +212,10 @@ class Client extends DispatcherBase { }) } - if (interceptors?.Client && Array.isArray(interceptors.Client)) { - this[kInterceptors] = interceptors.Client - if (!deprecatedInterceptorWarned) { - deprecatedInterceptorWarned = true - process.emitWarning('Client.Options#interceptor is deprecated. Use Dispatcher#compose instead.', { - code: 'UNDICI-CLIENT-INTERCEPTOR-DEPRECATED' - }) - } - } else { - this[kInterceptors] = [createRedirectInterceptor({ maxRedirections })] - } - this[kUrl] = util.parseOrigin(url) this[kConnector] = connect this[kPipelining] = pipelining != null ? pipelining : 1 - this[kMaxHeadersSize] = maxHeaderSize || http.maxHeaderSize + this[kMaxHeadersSize] = maxHeaderSize this[kKeepAliveDefaultTimeout] = keepAliveTimeout == null ? 4e3 : keepAliveTimeout this[kKeepAliveMaxTimeout] = keepAliveMaxTimeout == null ? 600e3 : keepAliveMaxTimeout this[kKeepAliveTimeoutThreshold] = keepAliveTimeoutThreshold == null ? 2e3 : keepAliveTimeoutThreshold @@ -238,7 +228,6 @@ class Client extends DispatcherBase { this[kBodyTimeout] = bodyTimeout != null ? bodyTimeout : 300e3 this[kHeadersTimeout] = headersTimeout != null ? headersTimeout : 300e3 this[kStrictContentLength] = strictContentLength == null ? true : strictContentLength - this[kMaxRedirections] = maxRedirections this[kMaxRequests] = maxRequestsPerClient this[kClosedResolve] = null this[kMaxResponseSize] = maxResponseSize > -1 ? maxResponseSize : -1 @@ -364,8 +353,6 @@ class Client extends DispatcherBase { } } -const createRedirectInterceptor = require('../interceptor/redirect-interceptor.js') - function onError (client, err) { if ( client[kRunning] === 0 && @@ -404,7 +391,7 @@ async function connect (client) { assert(idx !== -1) const ip = hostname.substring(1, idx) - assert(net.isIP(ip)) + assert(net.isIPv6(ip)) hostname = ip } diff --git a/deps/undici/src/lib/dispatcher/dispatcher-base.js b/deps/undici/src/lib/dispatcher/dispatcher-base.js index bd860acdcf45f5..615754d0fb54a8 100644 --- a/deps/undici/src/lib/dispatcher/dispatcher-base.js +++ b/deps/undici/src/lib/dispatcher/dispatcher-base.js @@ -1,16 +1,16 @@ 'use strict' const Dispatcher = require('./dispatcher') +const UnwrapHandler = require('../handler/unwrap-handler') const { ClientDestroyedError, ClientClosedError, InvalidArgumentError } = require('../core/errors') -const { kDestroy, kClose, kClosed, kDestroyed, kDispatch, kInterceptors } = require('../core/symbols') +const { kDestroy, kClose, kClosed, kDestroyed, kDispatch } = require('../core/symbols') const kOnDestroyed = Symbol('onDestroyed') const kOnClosed = Symbol('onClosed') -const kInterceptedDispatch = Symbol('Intercepted Dispatch') class DispatcherBase extends Dispatcher { constructor () { @@ -30,23 +30,6 @@ class DispatcherBase extends Dispatcher { return this[kClosed] } - get interceptors () { - return this[kInterceptors] - } - - set interceptors (newInterceptors) { - if (newInterceptors) { - for (let i = newInterceptors.length - 1; i >= 0; i--) { - const interceptor = this[kInterceptors][i] - if (typeof interceptor !== 'function') { - throw new InvalidArgumentError('interceptor must be an function') - } - } - } - - this[kInterceptors] = newInterceptors - } - close (callback) { if (callback === undefined) { return new Promise((resolve, reject) => { @@ -142,25 +125,13 @@ class DispatcherBase extends Dispatcher { }) } - [kInterceptedDispatch] (opts, handler) { - if (!this[kInterceptors] || this[kInterceptors].length === 0) { - this[kInterceptedDispatch] = this[kDispatch] - return this[kDispatch](opts, handler) - } - - let dispatch = this[kDispatch].bind(this) - for (let i = this[kInterceptors].length - 1; i >= 0; i--) { - dispatch = this[kInterceptors][i](dispatch) - } - this[kInterceptedDispatch] = dispatch - return dispatch(opts, handler) - } - dispatch (opts, handler) { if (!handler || typeof handler !== 'object') { throw new InvalidArgumentError('handler must be an object') } + handler = UnwrapHandler.unwrap(handler) + try { if (!opts || typeof opts !== 'object') { throw new InvalidArgumentError('opts must be an object.') @@ -174,10 +145,10 @@ class DispatcherBase extends Dispatcher { throw new ClientClosedError() } - return this[kInterceptedDispatch](opts, handler) + return this[kDispatch](opts, handler) } catch (err) { if (typeof handler.onError !== 'function') { - throw new InvalidArgumentError('invalid onError method') + throw err } handler.onError(err) diff --git a/deps/undici/src/lib/dispatcher/dispatcher.js b/deps/undici/src/lib/dispatcher/dispatcher.js index b1e0098ec4b66f..824dfb6d82204f 100644 --- a/deps/undici/src/lib/dispatcher/dispatcher.js +++ b/deps/undici/src/lib/dispatcher/dispatcher.js @@ -1,5 +1,8 @@ 'use strict' const EventEmitter = require('node:events') +const WrapHandler = require('../handler/wrap-handler') + +const wrapInterceptor = (dispatch) => (opts, handler) => dispatch(opts, WrapHandler.wrap(handler)) class Dispatcher extends EventEmitter { dispatch () { @@ -29,36 +32,16 @@ class Dispatcher extends EventEmitter { } dispatch = interceptor(dispatch) + dispatch = wrapInterceptor(dispatch) if (dispatch == null || typeof dispatch !== 'function' || dispatch.length !== 2) { throw new TypeError('invalid interceptor') } } - return new ComposedDispatcher(this, dispatch) - } -} - -class ComposedDispatcher extends Dispatcher { - #dispatcher = null - #dispatch = null - - constructor (dispatcher, dispatch) { - super() - this.#dispatcher = dispatcher - this.#dispatch = dispatch - } - - dispatch (...args) { - this.#dispatch(...args) - } - - close (...args) { - return this.#dispatcher.close(...args) - } - - destroy (...args) { - return this.#dispatcher.destroy(...args) + return new Proxy(this, { + get: (target, key) => key === 'dispatch' ? dispatch : target[key] + }) } } diff --git a/deps/undici/src/lib/dispatcher/fixed-queue.js b/deps/undici/src/lib/dispatcher/fixed-queue.js index 35726819e925a4..5f7a08bc47ffd9 100644 --- a/deps/undici/src/lib/dispatcher/fixed-queue.js +++ b/deps/undici/src/lib/dispatcher/fixed-queue.js @@ -1,12 +1,10 @@ -/* eslint-disable */ - 'use strict' // Extracted from node/lib/internal/fixed_queue.js // Currently optimal queue size, tested on V8 6.0 - 6.6. Must be power of two. -const kSize = 2048; -const kMask = kSize - 1; +const kSize = 2048 +const kMask = kSize - 1 // The FixedQueue is implemented as a singly-linked list of fixed-size // circular buffers. It looks something like this: @@ -17,18 +15,18 @@ const kMask = kSize - 1; // +-----------+ <-----\ +-----------+ <------\ +-----------+ // | [null] | \----- | next | \------- | next | // +-----------+ +-----------+ +-----------+ -// | item | <-- bottom | item | <-- bottom | [empty] | -// | item | | item | | [empty] | -// | item | | item | | [empty] | -// | item | | item | | [empty] | +// | item | <-- bottom | item | <-- bottom | undefined | +// | item | | item | | undefined | +// | item | | item | | undefined | +// | item | | item | | undefined | // | item | | item | bottom --> | item | // | item | | item | | item | // | ... | | ... | | ... | // | item | | item | | item | // | item | | item | | item | -// | [empty] | <-- top | item | | item | -// | [empty] | | item | | item | -// | [empty] | | [empty] | <-- top top --> | [empty] | +// | undefined | <-- top | item | | item | +// | undefined | | item | | item | +// | undefined | | undefined | <-- top top --> | undefined | // +-----------+ +-----------+ +-----------+ // // Or, if there is only one circular buffer, it looks something @@ -40,12 +38,12 @@ const kMask = kSize - 1; // +-----------+ +-----------+ // | [null] | | [null] | // +-----------+ +-----------+ -// | [empty] | | item | -// | [empty] | | item | -// | item | <-- bottom top --> | [empty] | -// | item | | [empty] | -// | [empty] | <-- top bottom --> | item | -// | [empty] | | item | +// | undefined | | item | +// | undefined | | item | +// | item | <-- bottom top --> | undefined | +// | item | | undefined | +// | undefined | <-- top bottom --> | item | +// | undefined | | item | // +-----------+ +-----------+ // // Adding a value means moving `top` forward by one, removing means @@ -56,62 +54,106 @@ const kMask = kSize - 1; // `top + 1 === bottom` it's full. This wastes a single space of storage // but allows much quicker checks. +/** + * @type {FixedCircularBuffer} + * @template T + */ class FixedCircularBuffer { - constructor() { - this.bottom = 0; - this.top = 0; - this.list = new Array(kSize); - this.next = null; + constructor () { + /** + * @type {number} + */ + this.bottom = 0 + /** + * @type {number} + */ + this.top = 0 + /** + * @type {Array} + */ + this.list = new Array(kSize).fill(undefined) + /** + * @type {T|null} + */ + this.next = null } - isEmpty() { - return this.top === this.bottom; + /** + * @returns {boolean} + */ + isEmpty () { + return this.top === this.bottom } - isFull() { - return ((this.top + 1) & kMask) === this.bottom; + /** + * @returns {boolean} + */ + isFull () { + return ((this.top + 1) & kMask) === this.bottom } - push(data) { - this.list[this.top] = data; - this.top = (this.top + 1) & kMask; + /** + * @param {T} data + * @returns {void} + */ + push (data) { + this.list[this.top] = data + this.top = (this.top + 1) & kMask } - shift() { - const nextItem = this.list[this.bottom]; - if (nextItem === undefined) - return null; - this.list[this.bottom] = undefined; - this.bottom = (this.bottom + 1) & kMask; - return nextItem; + /** + * @returns {T|null} + */ + shift () { + const nextItem = this.list[this.bottom] + if (nextItem === undefined) { return null } + this.list[this.bottom] = undefined + this.bottom = (this.bottom + 1) & kMask + return nextItem } } +/** + * @template T + */ module.exports = class FixedQueue { - constructor() { - this.head = this.tail = new FixedCircularBuffer(); + constructor () { + /** + * @type {FixedCircularBuffer} + */ + this.head = this.tail = new FixedCircularBuffer() } - isEmpty() { - return this.head.isEmpty(); + /** + * @returns {boolean} + */ + isEmpty () { + return this.head.isEmpty() } - push(data) { + /** + * @param {T} data + */ + push (data) { if (this.head.isFull()) { // Head is full: Creates a new queue, sets the old queue's `.next` to it, // and sets it as the new main queue. - this.head = this.head.next = new FixedCircularBuffer(); + this.head = this.head.next = new FixedCircularBuffer() } - this.head.push(data); + this.head.push(data) } - shift() { - const tail = this.tail; - const next = tail.shift(); + /** + * @returns {T|null} + */ + shift () { + const tail = this.tail + const next = tail.shift() if (tail.isEmpty() && tail.next !== null) { // If there is another queue, it forms the new tail. - this.tail = tail.next; + this.tail = tail.next + tail.next = null } - return next; + return next } -}; +} diff --git a/deps/undici/src/lib/dispatcher/pool-stats.js b/deps/undici/src/lib/dispatcher/pool-stats.js index 8c7e8c9572e1f1..c739211f098c6c 100644 --- a/deps/undici/src/lib/dispatcher/pool-stats.js +++ b/deps/undici/src/lib/dispatcher/pool-stats.js @@ -1,3 +1,5 @@ +'use strict' + const { kFree, kConnected, kPending, kQueued, kRunning, kSize } = require('../core/symbols') const kPool = Symbol('pool') diff --git a/deps/undici/src/lib/dispatcher/pool.js b/deps/undici/src/lib/dispatcher/pool.js index 2d84cd96488fd6..08303150addcbf 100644 --- a/deps/undici/src/lib/dispatcher/pool.js +++ b/deps/undici/src/lib/dispatcher/pool.js @@ -12,7 +12,7 @@ const { InvalidArgumentError } = require('../core/errors') const util = require('../core/util') -const { kUrl, kInterceptors } = require('../core/symbols') +const { kUrl } = require('../core/symbols') const buildConnector = require('../core/connect') const kOptions = Symbol('options') @@ -37,8 +37,6 @@ class Pool extends PoolBase { allowH2, ...options } = {}) { - super() - if (connections != null && (!Number.isFinite(connections) || connections < 0)) { throw new InvalidArgumentError('invalid connections') } @@ -51,6 +49,8 @@ class Pool extends PoolBase { throw new InvalidArgumentError('connect must be a function or an object') } + super() + if (typeof connect !== 'function') { connect = buildConnector({ ...tls, @@ -63,9 +63,6 @@ class Pool extends PoolBase { }) } - this[kInterceptors] = options.interceptors?.Pool && Array.isArray(options.interceptors.Pool) - ? options.interceptors.Pool - : [] this[kConnections] = connections || null this[kUrl] = util.parseOrigin(origin) this[kOptions] = { ...util.deepClone(options), connect, allowH2 } diff --git a/deps/undici/src/lib/dispatcher/proxy-agent.js b/deps/undici/src/lib/dispatcher/proxy-agent.js index c439d7cd555167..c5b4d51babb449 100644 --- a/deps/undici/src/lib/dispatcher/proxy-agent.js +++ b/deps/undici/src/lib/dispatcher/proxy-agent.js @@ -1,6 +1,6 @@ 'use strict' -const { kProxy, kClose, kDestroy, kInterceptors } = require('../core/symbols') +const { kProxy, kClose, kDestroy } = require('../core/symbols') const { URL } = require('node:url') const Agent = require('./agent') const Pool = require('./pool') @@ -27,8 +27,6 @@ const noop = () => {} class ProxyAgent extends DispatcherBase { constructor (opts) { - super() - if (!opts || (typeof opts === 'object' && !(opts instanceof URL) && !opts.uri)) { throw new InvalidArgumentError('Proxy uri is mandatory') } @@ -38,13 +36,12 @@ class ProxyAgent extends DispatcherBase { throw new InvalidArgumentError('Proxy opts.clientFactory must be a function.') } + super() + const url = this.#getUrl(opts) const { href, origin, port, protocol, username, password, hostname: proxyHostname } = url this[kProxy] = { uri: href, protocol } - this[kInterceptors] = opts.interceptors?.ProxyAgent && Array.isArray(opts.interceptors.ProxyAgent) - ? opts.interceptors.ProxyAgent - : [] this[kRequestTls] = opts.requestTls this[kProxyTls] = opts.proxyTls this[kProxyHeaders] = opts.headers || {} diff --git a/deps/undici/src/lib/handler/cache-handler.js b/deps/undici/src/lib/handler/cache-handler.js new file mode 100644 index 00000000000000..e02ff9c9d7217d --- /dev/null +++ b/deps/undici/src/lib/handler/cache-handler.js @@ -0,0 +1,448 @@ +'use strict' + +const util = require('../core/util') +const { + parseCacheControlHeader, + parseVaryHeader, + isEtagUsable +} = require('../util/cache') +const { parseHttpDate } = require('../util/date.js') + +function noop () {} + +// Status codes that we can use some heuristics on to cache +const HEURISTICALLY_CACHEABLE_STATUS_CODES = [ + 200, 203, 204, 206, 300, 301, 308, 404, 405, 410, 414, 501 +] + +const MAX_RESPONSE_AGE = 2147483647000 + +/** + * @typedef {import('../../types/dispatcher.d.ts').default.DispatchHandler} DispatchHandler + * + * @implements {DispatchHandler} + */ +class CacheHandler { + /** + * @type {import('../../types/cache-interceptor.d.ts').default.CacheKey} + */ + #cacheKey + + /** + * @type {import('../../types/cache-interceptor.d.ts').default.CacheHandlerOptions['type']} + */ + #cacheType + + /** + * @type {number | undefined} + */ + #cacheByDefault + + /** + * @type {import('../../types/cache-interceptor.d.ts').default.CacheStore} + */ + #store + + /** + * @type {import('../../types/dispatcher.d.ts').default.DispatchHandler} + */ + #handler + + /** + * @type {import('node:stream').Writable | undefined} + */ + #writeStream + + /** + * @param {import('../../types/cache-interceptor.d.ts').default.CacheHandlerOptions} opts + * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} cacheKey + * @param {import('../../types/dispatcher.d.ts').default.DispatchHandler} handler + */ + constructor ({ store, type, cacheByDefault }, cacheKey, handler) { + this.#store = store + this.#cacheType = type + this.#cacheByDefault = cacheByDefault + this.#cacheKey = cacheKey + this.#handler = handler + } + + onRequestStart (controller, context) { + this.#writeStream?.destroy() + this.#writeStream = undefined + this.#handler.onRequestStart?.(controller, context) + } + + onRequestUpgrade (controller, statusCode, headers, socket) { + this.#handler.onRequestUpgrade?.(controller, statusCode, headers, socket) + } + + /** + * @param {import('../../types/dispatcher.d.ts').default.DispatchController} controller + * @param {number} statusCode + * @param {import('../../types/header.d.ts').IncomingHttpHeaders} resHeaders + * @param {string} statusMessage + */ + onResponseStart ( + controller, + statusCode, + resHeaders, + statusMessage + ) { + const downstreamOnHeaders = () => + this.#handler.onResponseStart?.( + controller, + statusCode, + resHeaders, + statusMessage + ) + + if ( + !util.safeHTTPMethods.includes(this.#cacheKey.method) && + statusCode >= 200 && + statusCode <= 399 + ) { + // Successful response to an unsafe method, delete it from cache + // https://www.rfc-editor.org/rfc/rfc9111.html#name-invalidating-stored-response + try { + this.#store.delete(this.#cacheKey)?.catch?.(noop) + } catch { + // Fail silently + } + return downstreamOnHeaders() + } + + const cacheControlHeader = resHeaders['cache-control'] + const heuristicallyCacheable = resHeaders['last-modified'] && HEURISTICALLY_CACHEABLE_STATUS_CODES.includes(statusCode) + if ( + !cacheControlHeader && + !resHeaders['expires'] && + !heuristicallyCacheable && + !this.#cacheByDefault + ) { + // Don't have anything to tell us this response is cachable and we're not + // caching by default + return downstreamOnHeaders() + } + + const cacheControlDirectives = cacheControlHeader ? parseCacheControlHeader(cacheControlHeader) : {} + if (!canCacheResponse(this.#cacheType, statusCode, resHeaders, cacheControlDirectives)) { + return downstreamOnHeaders() + } + + const now = Date.now() + const resAge = resHeaders.age ? getAge(resHeaders.age) : undefined + if (resAge && resAge >= MAX_RESPONSE_AGE) { + // Response considered stale + return downstreamOnHeaders() + } + + const resDate = typeof resHeaders.date === 'string' + ? parseHttpDate(resHeaders.date) + : undefined + + const staleAt = + determineStaleAt(this.#cacheType, now, resAge, resHeaders, resDate, cacheControlDirectives) ?? + this.#cacheByDefault + if (staleAt === undefined || (resAge && resAge > staleAt)) { + return downstreamOnHeaders() + } + + const baseTime = resDate ? resDate.getTime() : now + const absoluteStaleAt = staleAt + baseTime + if (now >= absoluteStaleAt) { + // Response is already stale + return downstreamOnHeaders() + } + + let varyDirectives + if (this.#cacheKey.headers && resHeaders.vary) { + varyDirectives = parseVaryHeader(resHeaders.vary, this.#cacheKey.headers) + if (!varyDirectives) { + // Parse error + return downstreamOnHeaders() + } + } + + const deleteAt = determineDeleteAt(baseTime, cacheControlDirectives, absoluteStaleAt) + const strippedHeaders = stripNecessaryHeaders(resHeaders, cacheControlDirectives) + + /** + * @type {import('../../types/cache-interceptor.d.ts').default.CacheValue} + */ + const value = { + statusCode, + statusMessage, + headers: strippedHeaders, + vary: varyDirectives, + cacheControlDirectives, + cachedAt: resAge ? now - resAge : now, + staleAt: absoluteStaleAt, + deleteAt + } + + if (typeof resHeaders.etag === 'string' && isEtagUsable(resHeaders.etag)) { + value.etag = resHeaders.etag + } + + this.#writeStream = this.#store.createWriteStream(this.#cacheKey, value) + if (!this.#writeStream) { + return downstreamOnHeaders() + } + + const handler = this + this.#writeStream + .on('drain', () => controller.resume()) + .on('error', function () { + // TODO (fix): Make error somehow observable? + handler.#writeStream = undefined + + // Delete the value in case the cache store is holding onto state from + // the call to createWriteStream + handler.#store.delete(handler.#cacheKey) + }) + .on('close', function () { + if (handler.#writeStream === this) { + handler.#writeStream = undefined + } + + // TODO (fix): Should we resume even if was paused downstream? + controller.resume() + }) + + return downstreamOnHeaders() + } + + onResponseData (controller, chunk) { + if (this.#writeStream?.write(chunk) === false) { + controller.pause() + } + + this.#handler.onResponseData?.(controller, chunk) + } + + onResponseEnd (controller, trailers) { + this.#writeStream?.end() + this.#handler.onResponseEnd?.(controller, trailers) + } + + onResponseError (controller, err) { + this.#writeStream?.destroy(err) + this.#writeStream = undefined + this.#handler.onResponseError?.(controller, err) + } +} + +/** + * @see https://www.rfc-editor.org/rfc/rfc9111.html#name-storing-responses-to-authen + * + * @param {import('../../types/cache-interceptor.d.ts').default.CacheOptions['type']} cacheType + * @param {number} statusCode + * @param {import('../../types/header.d.ts').IncomingHttpHeaders} resHeaders + * @param {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives} cacheControlDirectives + */ +function canCacheResponse (cacheType, statusCode, resHeaders, cacheControlDirectives) { + if (statusCode !== 200 && statusCode !== 307) { + return false + } + + if (cacheControlDirectives['no-store']) { + return false + } + + if (cacheType === 'shared' && cacheControlDirectives.private === true) { + return false + } + + // https://www.rfc-editor.org/rfc/rfc9111.html#section-4.1-5 + if (resHeaders.vary?.includes('*')) { + return false + } + + // https://www.rfc-editor.org/rfc/rfc9111.html#name-storing-responses-to-authen + if (resHeaders.authorization) { + if (!cacheControlDirectives.public || typeof resHeaders.authorization !== 'string') { + return false + } + + if ( + Array.isArray(cacheControlDirectives['no-cache']) && + cacheControlDirectives['no-cache'].includes('authorization') + ) { + return false + } + + if ( + Array.isArray(cacheControlDirectives['private']) && + cacheControlDirectives['private'].includes('authorization') + ) { + return false + } + } + + return true +} + +/** + * @param {string | string[]} ageHeader + * @returns {number | undefined} + */ +function getAge (ageHeader) { + const age = parseInt(Array.isArray(ageHeader) ? ageHeader[0] : ageHeader) + + return isNaN(age) ? undefined : age * 1000 +} + +/** + * @param {import('../../types/cache-interceptor.d.ts').default.CacheOptions['type']} cacheType + * @param {number} now + * @param {number | undefined} age + * @param {import('../../types/header.d.ts').IncomingHttpHeaders} resHeaders + * @param {Date | undefined} responseDate + * @param {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives} cacheControlDirectives + * + * @returns {number | undefined} time that the value is stale at in seconds or undefined if it shouldn't be cached + */ +function determineStaleAt (cacheType, now, age, resHeaders, responseDate, cacheControlDirectives) { + if (cacheType === 'shared') { + // Prioritize s-maxage since we're a shared cache + // s-maxage > max-age > Expire + // https://www.rfc-editor.org/rfc/rfc9111.html#section-5.2.2.10-3 + const sMaxAge = cacheControlDirectives['s-maxage'] + if (sMaxAge !== undefined) { + return sMaxAge > 0 ? sMaxAge * 1000 : undefined + } + } + + const maxAge = cacheControlDirectives['max-age'] + if (maxAge !== undefined) { + return maxAge > 0 ? maxAge * 1000 : undefined + } + + if (typeof resHeaders.expires === 'string') { + // https://www.rfc-editor.org/rfc/rfc9111.html#section-5.3 + const expiresDate = parseHttpDate(resHeaders.expires) + if (expiresDate) { + if (now >= expiresDate.getTime()) { + return undefined + } + + if (responseDate) { + if (responseDate >= expiresDate) { + return undefined + } + + if (age !== undefined && age > (expiresDate - responseDate)) { + return undefined + } + } + + return expiresDate.getTime() - now + } + } + + if (typeof resHeaders['last-modified'] === 'string') { + // https://www.rfc-editor.org/rfc/rfc9111.html#name-calculating-heuristic-fresh + const lastModified = new Date(resHeaders['last-modified']) + if (isValidDate(lastModified)) { + if (lastModified.getTime() >= now) { + return undefined + } + + const responseAge = now - lastModified.getTime() + + return responseAge * 0.1 + } + } + + if (cacheControlDirectives.immutable) { + // https://www.rfc-editor.org/rfc/rfc8246.html#section-2.2 + return 31536000 + } + + return undefined +} + +/** + * @param {number} now + * @param {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives} cacheControlDirectives + * @param {number} staleAt + */ +function determineDeleteAt (now, cacheControlDirectives, staleAt) { + let staleWhileRevalidate = -Infinity + let staleIfError = -Infinity + let immutable = -Infinity + + if (cacheControlDirectives['stale-while-revalidate']) { + staleWhileRevalidate = staleAt + (cacheControlDirectives['stale-while-revalidate'] * 1000) + } + + if (cacheControlDirectives['stale-if-error']) { + staleIfError = staleAt + (cacheControlDirectives['stale-if-error'] * 1000) + } + + if (staleWhileRevalidate === -Infinity && staleIfError === -Infinity) { + immutable = now + 31536000000 + } + + return Math.max(staleAt, staleWhileRevalidate, staleIfError, immutable) +} + +/** + * Strips headers required to be removed in cached responses + * @param {import('../../types/header.d.ts').IncomingHttpHeaders} resHeaders + * @param {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives} cacheControlDirectives + * @returns {Record} + */ +function stripNecessaryHeaders (resHeaders, cacheControlDirectives) { + const headersToRemove = [ + 'connection', + 'proxy-authenticate', + 'proxy-authentication-info', + 'proxy-authorization', + 'proxy-connection', + 'te', + 'transfer-encoding', + 'upgrade', + // We'll add age back when serving it + 'age' + ] + + if (resHeaders['connection']) { + if (Array.isArray(resHeaders['connection'])) { + // connection: a + // connection: b + headersToRemove.push(...resHeaders['connection'].map(header => header.trim())) + } else { + // connection: a, b + headersToRemove.push(...resHeaders['connection'].split(',').map(header => header.trim())) + } + } + + if (Array.isArray(cacheControlDirectives['no-cache'])) { + headersToRemove.push(...cacheControlDirectives['no-cache']) + } + + if (Array.isArray(cacheControlDirectives['private'])) { + headersToRemove.push(...cacheControlDirectives['private']) + } + + let strippedHeaders + for (const headerName of headersToRemove) { + if (resHeaders[headerName]) { + strippedHeaders ??= { ...resHeaders } + delete strippedHeaders[headerName] + } + } + + return strippedHeaders ?? resHeaders +} + +/** + * @param {Date} date + * @returns {boolean} + */ +function isValidDate (date) { + return date instanceof Date && Number.isFinite(date.valueOf()) +} + +module.exports = CacheHandler diff --git a/deps/undici/src/lib/handler/cache-revalidation-handler.js b/deps/undici/src/lib/handler/cache-revalidation-handler.js new file mode 100644 index 00000000000000..9672936d9de249 --- /dev/null +++ b/deps/undici/src/lib/handler/cache-revalidation-handler.js @@ -0,0 +1,124 @@ +'use strict' + +const assert = require('node:assert') + +/** + * This takes care of revalidation requests we send to the origin. If we get + * a response indicating that what we have is cached (via a HTTP 304), we can + * continue using the cached value. Otherwise, we'll receive the new response + * here, which we then just pass on to the next handler (most likely a + * CacheHandler). Note that this assumes the proper headers were already + * included in the request to tell the origin that we want to revalidate the + * response (i.e. if-modified-since). + * + * @see https://www.rfc-editor.org/rfc/rfc9111.html#name-validation + * + * @implements {import('../../types/dispatcher.d.ts').default.DispatchHandler} + */ +class CacheRevalidationHandler { + #successful = false + + /** + * @type {((boolean, any) => void) | null} + */ + #callback + + /** + * @type {(import('../../types/dispatcher.d.ts').default.DispatchHandler)} + */ + #handler + + #context + + /** + * @type {boolean} + */ + #allowErrorStatusCodes + + /** + * @param {(boolean) => void} callback Function to call if the cached value is valid + * @param {import('../../types/dispatcher.d.ts').default.DispatchHandlers} handler + * @param {boolean} allowErrorStatusCodes + */ + constructor (callback, handler, allowErrorStatusCodes) { + if (typeof callback !== 'function') { + throw new TypeError('callback must be a function') + } + + this.#callback = callback + this.#handler = handler + this.#allowErrorStatusCodes = allowErrorStatusCodes + } + + onRequestStart (_, context) { + this.#successful = false + this.#context = context + } + + onRequestUpgrade (controller, statusCode, headers, socket) { + this.#handler.onRequestUpgrade?.(controller, statusCode, headers, socket) + } + + onResponseStart ( + controller, + statusCode, + headers, + statusMessage + ) { + assert(this.#callback != null) + + // https://www.rfc-editor.org/rfc/rfc9111.html#name-handling-a-validation-respo + // https://datatracker.ietf.org/doc/html/rfc5861#section-4 + this.#successful = statusCode === 304 || + (this.#allowErrorStatusCodes && statusCode >= 500 && statusCode <= 504) + this.#callback(this.#successful, this.#context) + this.#callback = null + + if (this.#successful) { + return true + } + + this.#handler.onRequestStart?.(controller, this.#context) + this.#handler.onResponseStart?.( + controller, + statusCode, + headers, + statusMessage + ) + } + + onResponseData (controller, chunk) { + if (this.#successful) { + return + } + + return this.#handler.onResponseData?.(controller, chunk) + } + + onResponseEnd (controller, trailers) { + if (this.#successful) { + return + } + + this.#handler.onResponseEnd?.(controller, trailers) + } + + onResponseError (controller, err) { + if (this.#successful) { + return + } + + if (this.#callback) { + this.#callback(false) + this.#callback = null + } + + if (typeof this.#handler.onResponseError === 'function') { + this.#handler.onResponseError(controller, err) + } else { + throw err + } + } +} + +module.exports = CacheRevalidationHandler diff --git a/deps/undici/src/lib/handler/decorator-handler.js b/deps/undici/src/lib/handler/decorator-handler.js index 26f220c64cd1fe..50fbb0cf89280d 100644 --- a/deps/undici/src/lib/handler/decorator-handler.js +++ b/deps/undici/src/lib/handler/decorator-handler.js @@ -1,44 +1,67 @@ 'use strict' +const assert = require('node:assert') +const WrapHandler = require('./wrap-handler') + +/** + * @deprecated + */ module.exports = class DecoratorHandler { #handler + #onCompleteCalled = false + #onErrorCalled = false + #onResponseStartCalled = false constructor (handler) { if (typeof handler !== 'object' || handler === null) { throw new TypeError('handler must be an object') } - this.#handler = handler + this.#handler = WrapHandler.wrap(handler) } - onConnect (...args) { - return this.#handler.onConnect?.(...args) + onRequestStart (...args) { + this.#handler.onRequestStart?.(...args) } - onError (...args) { - return this.#handler.onError?.(...args) - } + onRequestUpgrade (...args) { + assert(!this.#onCompleteCalled) + assert(!this.#onErrorCalled) - onUpgrade (...args) { - return this.#handler.onUpgrade?.(...args) + return this.#handler.onRequestUpgrade?.(...args) } - onResponseStarted (...args) { - return this.#handler.onResponseStarted?.(...args) - } + onResponseStart (...args) { + assert(!this.#onCompleteCalled) + assert(!this.#onErrorCalled) + assert(!this.#onResponseStartCalled) + + this.#onResponseStartCalled = true - onHeaders (...args) { - return this.#handler.onHeaders?.(...args) + return this.#handler.onResponseStart?.(...args) } - onData (...args) { - return this.#handler.onData?.(...args) + onResponseData (...args) { + assert(!this.#onCompleteCalled) + assert(!this.#onErrorCalled) + + return this.#handler.onResponseData?.(...args) } - onComplete (...args) { - return this.#handler.onComplete?.(...args) + onResponseEnd (...args) { + assert(!this.#onCompleteCalled) + assert(!this.#onErrorCalled) + + this.#onCompleteCalled = true + return this.#handler.onResponseEnd?.(...args) } - onBodySent (...args) { - return this.#handler.onBodySent?.(...args) + onResponseError (...args) { + this.#onErrorCalled = true + return this.#handler.onResponseError?.(...args) } + + /** + * @deprecated + */ + onBodySent () {} } diff --git a/deps/undici/src/lib/handler/redirect-handler.js b/deps/undici/src/lib/handler/redirect-handler.js index 16a7b2150a9dee..dd28e1d7426cea 100644 --- a/deps/undici/src/lib/handler/redirect-handler.js +++ b/deps/undici/src/lib/handler/redirect-handler.js @@ -10,6 +10,8 @@ const redirectableStatusCodes = [300, 301, 302, 303, 307, 308] const kBody = Symbol('body') +const noop = () => {} + class BodyAsyncIterable { constructor (body) { this[kBody] = body @@ -24,21 +26,26 @@ class BodyAsyncIterable { } class RedirectHandler { - constructor (dispatch, maxRedirections, opts, handler) { + static buildDispatch (dispatcher, maxRedirections) { if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { throw new InvalidArgumentError('maxRedirections must be a positive number') } - util.validateHandler(handler, opts.method, opts.upgrade) + const dispatch = dispatcher.dispatch.bind(dispatcher) + return (opts, originalHandler) => dispatch(opts, new RedirectHandler(dispatch, maxRedirections, opts, originalHandler)) + } + + constructor (dispatch, maxRedirections, opts, handler) { + if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { + throw new InvalidArgumentError('maxRedirections must be a positive number') + } this.dispatch = dispatch this.location = null - this.abort = null this.opts = { ...opts, maxRedirections: 0 } // opts must be a copy this.maxRedirections = maxRedirections this.handler = handler this.history = [] - this.redirectionLimitReached = false if (util.isStream(this.opts.body)) { // TODO (fix): Provide some way for the user to cache the file to e.g. /tmp @@ -66,7 +73,8 @@ class RedirectHandler { this.opts.body && typeof this.opts.body !== 'string' && !ArrayBuffer.isView(this.opts.body) && - util.isIterable(this.opts.body) + util.isIterable(this.opts.body) && + !util.isFormDataLike(this.opts.body) ) { // TODO: Should we allow re-using iterable if !this.opts.idempotent // or through some other flag? @@ -74,40 +82,51 @@ class RedirectHandler { } } - onConnect (abort) { - this.abort = abort - this.handler.onConnect(abort, { history: this.history }) + onRequestStart (controller, context) { + this.handler.onRequestStart?.(controller, { ...context, history: this.history }) } - onUpgrade (statusCode, headers, socket) { - this.handler.onUpgrade(statusCode, headers, socket) + onRequestUpgrade (controller, statusCode, headers, socket) { + this.handler.onRequestUpgrade?.(controller, statusCode, headers, socket) } - onError (error) { - this.handler.onError(error) - } - - onHeaders (statusCode, headers, resume, statusText) { - this.location = this.history.length >= this.maxRedirections || util.isDisturbed(this.opts.body) - ? null - : parseLocation(statusCode, headers) - + onResponseStart (controller, statusCode, headers, statusMessage) { if (this.opts.throwOnMaxRedirect && this.history.length >= this.maxRedirections) { - if (this.request) { - this.request.abort(new Error('max redirects')) + throw new Error('max redirects') + } + + // https://tools.ietf.org/html/rfc7231#section-6.4.2 + // https://fetch.spec.whatwg.org/#http-redirect-fetch + // In case of HTTP 301 or 302 with POST, change the method to GET + if ((statusCode === 301 || statusCode === 302) && this.opts.method === 'POST') { + this.opts.method = 'GET' + if (util.isStream(this.opts.body)) { + util.destroy(this.opts.body.on('error', noop)) } + this.opts.body = null + } - this.redirectionLimitReached = true - this.abort(new Error('max redirects')) - return + // https://tools.ietf.org/html/rfc7231#section-6.4.4 + // In case of HTTP 303, always replace method to be either HEAD or GET + if (statusCode === 303 && this.opts.method !== 'HEAD') { + this.opts.method = 'GET' + if (util.isStream(this.opts.body)) { + util.destroy(this.opts.body.on('error', noop)) + } + this.opts.body = null } + this.location = this.history.length >= this.maxRedirections || util.isDisturbed(this.opts.body) || redirectableStatusCodes.indexOf(statusCode) === -1 + ? null + : headers.location + if (this.opts.origin) { this.history.push(new URL(this.opts.path, this.opts.origin)) } if (!this.location) { - return this.handler.onHeaders(statusCode, headers, resume, statusText) + this.handler.onResponseStart?.(controller, statusCode, headers, statusMessage) + return } const { origin, pathname, search } = util.parseURL(new URL(this.location, this.opts.origin && new URL(this.opts.path, this.opts.origin))) @@ -121,23 +140,16 @@ class RedirectHandler { this.opts.origin = origin this.opts.maxRedirections = 0 this.opts.query = null - - // https://tools.ietf.org/html/rfc7231#section-6.4.4 - // In case of HTTP 303, always replace method to be either HEAD or GET - if (statusCode === 303 && this.opts.method !== 'HEAD') { - this.opts.method = 'GET' - this.opts.body = null - } } - onData (chunk) { + onResponseData (controller, chunk) { if (this.location) { /* https://tools.ietf.org/html/rfc7231#section-6.4 TLDR: undici always ignores 3xx response bodies. - Redirection is used to serve the requested resource from another URL, so it is assumes that + Redirection is used to serve the requested resource from another URL, so it assumes that no body is generated (and thus can be ignored). Even though generating a body is not prohibited. For status 301, 302, 303, 307 and 308 (the latter from RFC 7238), the specs mention that the body usually @@ -150,11 +162,11 @@ class RedirectHandler { servers and browsers implementors, we ignore the body as there is no specified way to eventually parse it. */ } else { - return this.handler.onData(chunk) + this.handler.onResponseData?.(controller, chunk) } } - onComplete (trailers) { + onResponseEnd (controller, trailers) { if (this.location) { /* https://tools.ietf.org/html/rfc7231#section-6.4 @@ -164,32 +176,14 @@ class RedirectHandler { See comment on onData method above for more detailed information. */ - - this.location = null - this.abort = null - this.dispatch(this.opts, this) } else { - this.handler.onComplete(trailers) - } - } - - onBodySent (chunk) { - if (this.handler.onBodySent) { - this.handler.onBodySent(chunk) + this.handler.onResponseEnd(controller, trailers) } } -} -function parseLocation (statusCode, headers) { - if (redirectableStatusCodes.indexOf(statusCode) === -1) { - return null - } - - for (let i = 0; i < headers.length; i += 2) { - if (headers[i].length === 8 && util.headerNameToString(headers[i]) === 'location') { - return headers[i + 1] - } + onResponseError (controller, error) { + this.handler.onResponseError?.(controller, error) } } @@ -218,9 +212,10 @@ function cleanRequestHeaders (headers, removeContent, unknownOrigin) { } } } else if (headers && typeof headers === 'object') { - for (const key of Object.keys(headers)) { + const entries = typeof headers[Symbol.iterator] === 'function' ? headers : Object.entries(headers) + for (const [key, value] of entries) { if (!shouldRemoveHeader(key, removeContent, unknownOrigin)) { - ret.push(key, headers[key]) + ret.push(key, value) } } } else { diff --git a/deps/undici/src/lib/handler/retry-handler.js b/deps/undici/src/lib/handler/retry-handler.js index 5d1ccf00538766..f469f9df343d53 100644 --- a/deps/undici/src/lib/handler/retry-handler.js +++ b/deps/undici/src/lib/handler/retry-handler.js @@ -3,9 +3,9 @@ const assert = require('node:assert') const { kRetryHandlerDefaultRetry } = require('../core/symbols') const { RequestRetryError } = require('../core/errors') +const WrapHandler = require('./wrap-handler') const { isDisturbed, - parseHeaders, parseRangeHeader, wrapRequestBody } = require('../core/util') @@ -16,7 +16,7 @@ function calculateRetryAfterHeader (retryAfter) { } class RetryHandler { - constructor (opts, handlers) { + constructor (opts, { dispatch, handler }) { const { retryOptions, ...dispatchOpts } = opts const { // Retry scoped @@ -32,11 +32,9 @@ class RetryHandler { statusCodes } = retryOptions ?? {} - this.dispatch = handlers.dispatch - this.handler = handlers.handler + this.dispatch = dispatch + this.handler = WrapHandler.wrap(handler) this.opts = { ...dispatchOpts, body: wrapRequestBody(opts.body) } - this.abort = null - this.aborted = false this.retryOpts = { retry: retryFn ?? RetryHandler[kRetryHandlerDefaultRetry], retryAfter: retryAfter ?? true, @@ -64,44 +62,20 @@ class RetryHandler { this.retryCount = 0 this.retryCountCheckpoint = 0 + this.headersSent = false this.start = 0 this.end = null this.etag = null - this.resume = null - - // Handle possible onConnect duplication - this.handler.onConnect(reason => { - this.aborted = true - if (this.abort) { - this.abort(reason) - } else { - this.reason = reason - } - }) - } - - onRequestSent () { - if (this.handler.onRequestSent) { - this.handler.onRequestSent() - } - } - - onUpgrade (statusCode, headers, socket) { - if (this.handler.onUpgrade) { - this.handler.onUpgrade(statusCode, headers, socket) - } } - onConnect (abort) { - if (this.aborted) { - abort(this.reason) - } else { - this.abort = abort + onRequestStart (controller, context) { + if (!this.headersSent) { + this.handler.onRequestStart?.(controller, context) } } - onBodySent (chunk) { - if (this.handler.onBodySent) return this.handler.onBodySent(chunk) + onRequestUpgrade (controller, statusCode, headers, socket) { + this.handler.onRequestUpgrade?.(controller, statusCode, headers, socket) } static [kRetryHandlerDefaultRetry] (err, { state, opts }, cb) { @@ -159,83 +133,68 @@ class RetryHandler { ? Math.min(retryAfterHeader, maxTimeout) : Math.min(minTimeout * timeoutFactor ** (counter - 1), maxTimeout) - setTimeout(() => cb(null), retryTimeout) + setTimeout(() => cb(null), retryTimeout).unref() } - onHeaders (statusCode, rawHeaders, resume, statusMessage) { - const headers = parseHeaders(rawHeaders) - + onResponseStart (controller, statusCode, headers, statusMessage) { this.retryCount += 1 if (statusCode >= 300) { if (this.retryOpts.statusCodes.includes(statusCode) === false) { - return this.handler.onHeaders( + this.headersSent = true + this.handler.onResponseStart?.( + controller, statusCode, - rawHeaders, - resume, + headers, statusMessage ) + return } else { - this.abort( - new RequestRetryError('Request failed', statusCode, { - headers, - data: { - count: this.retryCount - } - }) - ) - return false + throw new RequestRetryError('Request failed', statusCode, { + headers, + data: { + count: this.retryCount + } + }) } } // Checkpoint for resume from where we left it - if (this.resume != null) { - this.resume = null - + if (this.headersSent) { // Only Partial Content 206 supposed to provide Content-Range, // any other status code that partially consumed the payload - // should not be retry because it would result in downstream - // wrongly concatanete multiple responses. + // should not be retried because it would result in downstream + // wrongly concatenate multiple responses. if (statusCode !== 206 && (this.start > 0 || statusCode !== 200)) { - this.abort( - new RequestRetryError('server does not support the range header and the payload was partially consumed', statusCode, { - headers, - data: { count: this.retryCount } - }) - ) - return false + throw new RequestRetryError('server does not support the range header and the payload was partially consumed', statusCode, { + headers, + data: { count: this.retryCount } + }) } const contentRange = parseRangeHeader(headers['content-range']) // If no content range if (!contentRange) { - this.abort( - new RequestRetryError('Content-Range mismatch', statusCode, { - headers, - data: { count: this.retryCount } - }) - ) - return false + throw new RequestRetryError('Content-Range mismatch', statusCode, { + headers, + data: { count: this.retryCount } + }) } // Let's start with a weak etag check if (this.etag != null && this.etag !== headers.etag) { - this.abort( - new RequestRetryError('ETag mismatch', statusCode, { - headers, - data: { count: this.retryCount } - }) - ) - return false + throw new RequestRetryError('ETag mismatch', statusCode, { + headers, + data: { count: this.retryCount } + }) } - const { start, size, end = size - 1 } = contentRange + const { start, size, end = size ? size - 1 : null } = contentRange assert(this.start === start, 'content-range mismatch') assert(this.end == null || this.end === end, 'content-range mismatch') - this.resume = resume - return true + return } if (this.end == null) { @@ -244,15 +203,17 @@ class RetryHandler { const range = parseRangeHeader(headers['content-range']) if (range == null) { - return this.handler.onHeaders( + this.headersSent = true + this.handler.onResponseStart?.( + controller, statusCode, - rawHeaders, - resume, + headers, statusMessage ) + return } - const { start, size, end = size - 1 } = range + const { start, size, end = size ? size - 1 : null } = range assert( start != null && Number.isFinite(start), 'content-range mismatch' @@ -275,48 +236,50 @@ class RetryHandler { 'invalid content-length' ) - this.resume = resume + this.resume = true this.etag = headers.etag != null ? headers.etag : null // Weak etags are not useful for comparison nor cache // for instance not safe to assume if the response is byte-per-byte // equal - if (this.etag != null && this.etag.startsWith('W/')) { + if ( + this.etag != null && + this.etag[0] === 'W' && + this.etag[1] === '/' + ) { this.etag = null } - return this.handler.onHeaders( + this.headersSent = true + this.handler.onResponseStart?.( + controller, statusCode, - rawHeaders, - resume, + headers, statusMessage ) + } else { + throw new RequestRetryError('Request failed', statusCode, { + headers, + data: { count: this.retryCount } + }) } - - const err = new RequestRetryError('Request failed', statusCode, { - headers, - data: { count: this.retryCount } - }) - - this.abort(err) - - return false } - onData (chunk) { + onResponseData (controller, chunk) { this.start += chunk.length - return this.handler.onData(chunk) + this.handler.onResponseData?.(controller, chunk) } - onComplete (rawTrailers) { + onResponseEnd (controller, trailers) { this.retryCount = 0 - return this.handler.onComplete(rawTrailers) + return this.handler.onResponseEnd?.(controller, trailers) } - onError (err) { - if (this.aborted || isDisturbed(this.opts.body)) { - return this.handler.onError(err) + onResponseError (controller, err) { + if (!controller || controller.aborted || isDisturbed(this.opts.body)) { + this.handler.onResponseError?.(controller, err) + return } // We reconcile in case of a mix between network errors @@ -339,9 +302,14 @@ class RetryHandler { onRetry.bind(this) ) + /** + * @this {RetryHandler} + * @param {Error} [err] + * @returns + */ function onRetry (err) { - if (err != null || this.aborted || isDisturbed(this.opts.body)) { - return this.handler.onError(err) + if (err != null || controller?.aborted || isDisturbed(this.opts.body)) { + return this.handler.onResponseError?.(controller, err) } if (this.start !== 0) { @@ -365,7 +333,7 @@ class RetryHandler { this.retryCountCheckpoint = this.retryCount this.dispatch(this.opts, this) } catch (err) { - this.handler.onError(err) + this.handler.onResponseError?.(controller, err) } } } diff --git a/deps/undici/src/lib/handler/unwrap-handler.js b/deps/undici/src/lib/handler/unwrap-handler.js new file mode 100644 index 00000000000000..865593a327bdb6 --- /dev/null +++ b/deps/undici/src/lib/handler/unwrap-handler.js @@ -0,0 +1,96 @@ +'use strict' + +const { parseHeaders } = require('../core/util') +const { InvalidArgumentError } = require('../core/errors') + +const kResume = Symbol('resume') + +class UnwrapController { + #paused = false + #reason = null + #aborted = false + #abort + + [kResume] = null + + constructor (abort) { + this.#abort = abort + } + + pause () { + this.#paused = true + } + + resume () { + if (this.#paused) { + this.#paused = false + this[kResume]?.() + } + } + + abort (reason) { + if (!this.#aborted) { + this.#aborted = true + this.#reason = reason + this.#abort(reason) + } + } + + get aborted () { + return this.#aborted + } + + get reason () { + return this.#reason + } + + get paused () { + return this.#paused + } +} + +module.exports = class UnwrapHandler { + #handler + #controller + + constructor (handler) { + this.#handler = handler + } + + static unwrap (handler) { + // TODO (fix): More checks... + return !handler.onRequestStart ? handler : new UnwrapHandler(handler) + } + + onConnect (abort, context) { + this.#controller = new UnwrapController(abort) + this.#handler.onRequestStart?.(this.#controller, context) + } + + onUpgrade (statusCode, rawHeaders, socket) { + this.#handler.onRequestUpgrade?.(this.#controller, statusCode, parseHeaders(rawHeaders), socket) + } + + onHeaders (statusCode, rawHeaders, resume, statusMessage) { + this.#controller[kResume] = resume + this.#handler.onResponseStart?.(this.#controller, statusCode, parseHeaders(rawHeaders), statusMessage) + return !this.#controller.paused + } + + onData (data) { + this.#handler.onResponseData?.(this.#controller, data) + return !this.#controller.paused + } + + onComplete (rawTrailers) { + this.#handler.onResponseEnd?.(this.#controller, parseHeaders(rawTrailers)) + } + + onError (err) { + if (!this.#handler.onResponseError) { + throw new InvalidArgumentError('invalid onError method') + } + + this.#handler.onResponseError?.(this.#controller, err) + } +} diff --git a/deps/undici/src/lib/handler/wrap-handler.js b/deps/undici/src/lib/handler/wrap-handler.js new file mode 100644 index 00000000000000..47caa5fa68ba0d --- /dev/null +++ b/deps/undici/src/lib/handler/wrap-handler.js @@ -0,0 +1,95 @@ +'use strict' + +const { InvalidArgumentError } = require('../core/errors') + +module.exports = class WrapHandler { + #handler + + constructor (handler) { + this.#handler = handler + } + + static wrap (handler) { + // TODO (fix): More checks... + return handler.onRequestStart ? handler : new WrapHandler(handler) + } + + // Unwrap Interface + + onConnect (abort, context) { + return this.#handler.onConnect?.(abort, context) + } + + onHeaders (statusCode, rawHeaders, resume, statusMessage) { + return this.#handler.onHeaders?.(statusCode, rawHeaders, resume, statusMessage) + } + + onUpgrade (statusCode, rawHeaders, socket) { + return this.#handler.onUpgrade?.(statusCode, rawHeaders, socket) + } + + onData (data) { + return this.#handler.onData?.(data) + } + + onComplete (trailers) { + return this.#handler.onComplete?.(trailers) + } + + onError (err) { + if (!this.#handler.onError) { + throw err + } + + return this.#handler.onError?.(err) + } + + // Wrap Interface + + onRequestStart (controller, context) { + this.#handler.onConnect?.((reason) => controller.abort(reason), context) + } + + onRequestUpgrade (controller, statusCode, headers, socket) { + const rawHeaders = [] + for (const [key, val] of Object.entries(headers)) { + rawHeaders.push(Buffer.from(key), Array.isArray(val) ? val.map(v => Buffer.from(v)) : Buffer.from(val)) + } + + this.#handler.onUpgrade?.(statusCode, rawHeaders, socket) + } + + onResponseStart (controller, statusCode, headers, statusMessage) { + const rawHeaders = [] + for (const [key, val] of Object.entries(headers)) { + rawHeaders.push(Buffer.from(key), Array.isArray(val) ? val.map(v => Buffer.from(v)) : Buffer.from(val)) + } + + if (this.#handler.onHeaders?.(statusCode, rawHeaders, () => controller.resume(), statusMessage) === false) { + controller.pause() + } + } + + onResponseData (controller, data) { + if (this.#handler.onData?.(data) === false) { + controller.pause() + } + } + + onResponseEnd (controller, trailers) { + const rawTrailers = [] + for (const [key, val] of Object.entries(trailers)) { + rawTrailers.push(Buffer.from(key), Array.isArray(val) ? val.map(v => Buffer.from(v)) : Buffer.from(val)) + } + + this.#handler.onComplete?.(rawTrailers) + } + + onResponseError (controller, err) { + if (!this.#handler.onError) { + throw new InvalidArgumentError('invalid onError method') + } + + this.#handler.onError?.(err) + } +} diff --git a/deps/undici/src/lib/interceptor/cache.js b/deps/undici/src/lib/interceptor/cache.js new file mode 100644 index 00000000000000..6d1225680e745a --- /dev/null +++ b/deps/undici/src/lib/interceptor/cache.js @@ -0,0 +1,362 @@ +'use strict' + +const assert = require('node:assert') +const { Readable } = require('node:stream') +const util = require('../core/util') +const CacheHandler = require('../handler/cache-handler') +const MemoryCacheStore = require('../cache/memory-cache-store') +const CacheRevalidationHandler = require('../handler/cache-revalidation-handler') +const { assertCacheStore, assertCacheMethods, makeCacheKey, parseCacheControlHeader } = require('../util/cache.js') +const { AbortError } = require('../core/errors.js') + +/** + * @typedef {(options: import('../../types/dispatcher.d.ts').default.DispatchOptions, handler: import('../../types/dispatcher.d.ts').default.DispatchHandler) => void} DispatchFn + */ + +/** + * @param {import('../../types/cache-interceptor.d.ts').default.GetResult} result + * @param {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives | undefined} cacheControlDirectives + * @returns {boolean} + */ +function needsRevalidation (result, cacheControlDirectives) { + if (cacheControlDirectives?.['no-cache']) { + // Always revalidate requests with the no-cache directive + return true + } + + const now = Date.now() + if (now > result.staleAt) { + // Response is stale + if (cacheControlDirectives?.['max-stale']) { + // There's a threshold where we can serve stale responses, let's see if + // we're in it + // https://www.rfc-editor.org/rfc/rfc9111.html#name-max-stale + const gracePeriod = result.staleAt + (cacheControlDirectives['max-stale'] * 1000) + return now > gracePeriod + } + + return true + } + + if (cacheControlDirectives?.['min-fresh']) { + // https://www.rfc-editor.org/rfc/rfc9111.html#section-5.2.1.3 + + // At this point, staleAt is always > now + const timeLeftTillStale = result.staleAt - now + const threshold = cacheControlDirectives['min-fresh'] * 1000 + + return timeLeftTillStale <= threshold + } + + return false +} + +/** + * @param {DispatchFn} dispatch + * @param {import('../../types/cache-interceptor.d.ts').default.CacheHandlerOptions} globalOpts + * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} cacheKey + * @param {import('../../types/dispatcher.d.ts').default.DispatchHandler} handler + * @param {import('../../types/dispatcher.d.ts').default.RequestOptions} opts + * @param {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives | undefined} reqCacheControl + */ +function handleUncachedResponse ( + dispatch, + globalOpts, + cacheKey, + handler, + opts, + reqCacheControl +) { + if (reqCacheControl?.['only-if-cached']) { + let aborted = false + try { + if (typeof handler.onConnect === 'function') { + handler.onConnect(() => { + aborted = true + }) + + if (aborted) { + return + } + } + + if (typeof handler.onHeaders === 'function') { + handler.onHeaders(504, [], () => {}, 'Gateway Timeout') + if (aborted) { + return + } + } + + if (typeof handler.onComplete === 'function') { + handler.onComplete([]) + } + } catch (err) { + if (typeof handler.onError === 'function') { + handler.onError(err) + } + } + + return true + } + + return dispatch(opts, new CacheHandler(globalOpts, cacheKey, handler)) +} + +/** + * @param {import('../../types/dispatcher.d.ts').default.DispatchHandler} handler + * @param {import('../../types/dispatcher.d.ts').default.RequestOptions} opts + * @param {import('../../types/cache-interceptor.d.ts').default.GetResult} result + * @param {number} age + * @param {any} context + * @param {boolean} isStale + */ +function sendCachedValue (handler, opts, result, age, context, isStale) { + // TODO (perf): Readable.from path can be optimized... + const stream = util.isStream(result.body) + ? result.body + : Readable.from(result.body ?? []) + + assert(!stream.destroyed, 'stream should not be destroyed') + assert(!stream.readableDidRead, 'stream should not be readableDidRead') + + const controller = { + resume () { + stream.resume() + }, + pause () { + stream.pause() + }, + get paused () { + return stream.isPaused() + }, + get aborted () { + return stream.destroyed + }, + get reason () { + return stream.errored + }, + abort (reason) { + stream.destroy(reason ?? new AbortError()) + } + } + + stream + .on('error', function (err) { + if (!this.readableEnded) { + if (typeof handler.onResponseError === 'function') { + handler.onResponseError(controller, err) + } else { + throw err + } + } + }) + .on('close', function () { + if (!this.errored) { + handler.onResponseEnd?.(controller, {}) + } + }) + + handler.onRequestStart?.(controller, context) + + if (stream.destroyed) { + return + } + + // Add the age header + // https://www.rfc-editor.org/rfc/rfc9111.html#name-age + const headers = { ...result.headers, age: String(age) } + + if (isStale) { + // Add warning header + // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Warning + headers.warning = '110 - "response is stale"' + } + + handler.onResponseStart?.(controller, result.statusCode, headers, result.statusMessage) + + if (opts.method === 'HEAD') { + stream.destroy() + } else { + stream.on('data', function (chunk) { + handler.onResponseData?.(controller, chunk) + }) + } +} + +/** + * @param {DispatchFn} dispatch + * @param {import('../../types/cache-interceptor.d.ts').default.CacheHandlerOptions} globalOpts + * @param {import('../../types/cache-interceptor.d.ts').default.CacheKey} cacheKey + * @param {import('../../types/dispatcher.d.ts').default.DispatchHandler} handler + * @param {import('../../types/dispatcher.d.ts').default.RequestOptions} opts + * @param {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives | undefined} reqCacheControl + * @param {import('../../types/cache-interceptor.d.ts').default.GetResult | undefined} result + */ +function handleResult ( + dispatch, + globalOpts, + cacheKey, + handler, + opts, + reqCacheControl, + result +) { + if (!result) { + return handleUncachedResponse(dispatch, globalOpts, cacheKey, handler, opts, reqCacheControl) + } + + const now = Date.now() + if (now > result.deleteAt) { + // Response is expired, cache store shouldn't have given this to us + return dispatch(opts, new CacheHandler(globalOpts, cacheKey, handler)) + } + + const age = Math.round((now - result.cachedAt) / 1000) + if (reqCacheControl?.['max-age'] && age >= reqCacheControl['max-age']) { + // Response is considered expired for this specific request + // https://www.rfc-editor.org/rfc/rfc9111.html#section-5.2.1.1 + return dispatch(opts, handler) + } + + // Check if the response is stale + if (needsRevalidation(result, reqCacheControl)) { + if (util.isStream(opts.body) && util.bodyLength(opts.body) !== 0) { + // If body is is stream we can't revalidate... + // TODO (fix): This could be less strict... + return dispatch(opts, new CacheHandler(globalOpts, cacheKey, handler)) + } + + let withinStaleIfErrorThreshold = false + const staleIfErrorExpiry = result.cacheControlDirectives['stale-if-error'] ?? reqCacheControl?.['stale-if-error'] + if (staleIfErrorExpiry) { + withinStaleIfErrorThreshold = now < (result.staleAt + (staleIfErrorExpiry * 1000)) + } + + let headers = { + ...opts.headers, + 'if-modified-since': new Date(result.cachedAt).toUTCString() + } + + if (result.etag) { + headers['if-none-match'] = result.etag + } + + if (result.vary) { + headers = { + ...headers, + ...result.vary + } + } + + // We need to revalidate the response + return dispatch( + { + ...opts, + headers + }, + new CacheRevalidationHandler( + (success, context) => { + if (success) { + sendCachedValue(handler, opts, result, age, context, true) + } else if (util.isStream(result.body)) { + result.body.on('error', () => {}).destroy() + } + }, + new CacheHandler(globalOpts, cacheKey, handler), + withinStaleIfErrorThreshold + ) + ) + } + + // Dump request body. + if (util.isStream(opts.body)) { + opts.body.on('error', () => {}).destroy() + } + + sendCachedValue(handler, opts, result, age, null, false) +} + +/** + * @param {import('../../types/cache-interceptor.d.ts').default.CacheOptions} [opts] + * @returns {import('../../types/dispatcher.d.ts').default.DispatcherComposeInterceptor} + */ +module.exports = (opts = {}) => { + const { + store = new MemoryCacheStore(), + methods = ['GET'], + cacheByDefault = undefined, + type = 'shared' + } = opts + + if (typeof opts !== 'object' || opts === null) { + throw new TypeError(`expected type of opts to be an Object, got ${opts === null ? 'null' : typeof opts}`) + } + + assertCacheStore(store, 'opts.store') + assertCacheMethods(methods, 'opts.methods') + + if (typeof cacheByDefault !== 'undefined' && typeof cacheByDefault !== 'number') { + throw new TypeError(`exepcted opts.cacheByDefault to be number or undefined, got ${typeof cacheByDefault}`) + } + + if (typeof type !== 'undefined' && type !== 'shared' && type !== 'private') { + throw new TypeError(`exepcted opts.type to be shared, private, or undefined, got ${typeof type}`) + } + + const globalOpts = { + store, + methods, + cacheByDefault, + type + } + + const safeMethodsToNotCache = util.safeHTTPMethods.filter(method => methods.includes(method) === false) + + return dispatch => { + return (opts, handler) => { + if (!opts.origin || safeMethodsToNotCache.includes(opts.method)) { + // Not a method we want to cache or we don't have the origin, skip + return dispatch(opts, handler) + } + + const reqCacheControl = opts.headers?.['cache-control'] + ? parseCacheControlHeader(opts.headers['cache-control']) + : undefined + + if (reqCacheControl?.['no-store']) { + return dispatch(opts, handler) + } + + /** + * @type {import('../../types/cache-interceptor.d.ts').default.CacheKey} + */ + const cacheKey = makeCacheKey(opts) + const result = store.get(cacheKey) + + if (result && typeof result.then === 'function') { + result.then(result => { + handleResult(dispatch, + globalOpts, + cacheKey, + handler, + opts, + reqCacheControl, + result + ) + }) + } else { + handleResult( + dispatch, + globalOpts, + cacheKey, + handler, + opts, + reqCacheControl, + result + ) + } + + return true + } + } +} diff --git a/deps/undici/src/lib/interceptor/dns.js b/deps/undici/src/lib/interceptor/dns.js new file mode 100644 index 00000000000000..98ef376ecbb22e --- /dev/null +++ b/deps/undici/src/lib/interceptor/dns.js @@ -0,0 +1,379 @@ +'use strict' +const { isIP } = require('node:net') +const { lookup } = require('node:dns') +const DecoratorHandler = require('../handler/decorator-handler') +const { InvalidArgumentError, InformationalError } = require('../core/errors') +const maxInt = Math.pow(2, 31) - 1 + +class DNSInstance { + #maxTTL = 0 + #maxItems = 0 + #records = new Map() + dualStack = true + affinity = null + lookup = null + pick = null + + constructor (opts) { + this.#maxTTL = opts.maxTTL + this.#maxItems = opts.maxItems + this.dualStack = opts.dualStack + this.affinity = opts.affinity + this.lookup = opts.lookup ?? this.#defaultLookup + this.pick = opts.pick ?? this.#defaultPick + } + + get full () { + return this.#records.size === this.#maxItems + } + + runLookup (origin, opts, cb) { + const ips = this.#records.get(origin.hostname) + + // If full, we just return the origin + if (ips == null && this.full) { + cb(null, origin.origin) + return + } + + const newOpts = { + affinity: this.affinity, + dualStack: this.dualStack, + lookup: this.lookup, + pick: this.pick, + ...opts.dns, + maxTTL: this.#maxTTL, + maxItems: this.#maxItems + } + + // If no IPs we lookup + if (ips == null) { + this.lookup(origin, newOpts, (err, addresses) => { + if (err || addresses == null || addresses.length === 0) { + cb(err ?? new InformationalError('No DNS entries found')) + return + } + + this.setRecords(origin, addresses) + const records = this.#records.get(origin.hostname) + + const ip = this.pick( + origin, + records, + newOpts.affinity + ) + + let port + if (typeof ip.port === 'number') { + port = `:${ip.port}` + } else if (origin.port !== '') { + port = `:${origin.port}` + } else { + port = '' + } + + cb( + null, + `${origin.protocol}//${ + ip.family === 6 ? `[${ip.address}]` : ip.address + }${port}` + ) + }) + } else { + // If there's IPs we pick + const ip = this.pick( + origin, + ips, + newOpts.affinity + ) + + // If no IPs we lookup - deleting old records + if (ip == null) { + this.#records.delete(origin.hostname) + this.runLookup(origin, opts, cb) + return + } + + let port + if (typeof ip.port === 'number') { + port = `:${ip.port}` + } else if (origin.port !== '') { + port = `:${origin.port}` + } else { + port = '' + } + + cb( + null, + `${origin.protocol}//${ + ip.family === 6 ? `[${ip.address}]` : ip.address + }${port}` + ) + } + } + + #defaultLookup (origin, opts, cb) { + lookup( + origin.hostname, + { + all: true, + family: this.dualStack === false ? this.affinity : 0, + order: 'ipv4first' + }, + (err, addresses) => { + if (err) { + return cb(err) + } + + const results = new Map() + + for (const addr of addresses) { + // On linux we found duplicates, we attempt to remove them with + // the latest record + results.set(`${addr.address}:${addr.family}`, addr) + } + + cb(null, results.values()) + } + ) + } + + #defaultPick (origin, hostnameRecords, affinity) { + let ip = null + const { records, offset } = hostnameRecords + + let family + if (this.dualStack) { + if (affinity == null) { + // Balance between ip families + if (offset == null || offset === maxInt) { + hostnameRecords.offset = 0 + affinity = 4 + } else { + hostnameRecords.offset++ + affinity = (hostnameRecords.offset & 1) === 1 ? 6 : 4 + } + } + + if (records[affinity] != null && records[affinity].ips.length > 0) { + family = records[affinity] + } else { + family = records[affinity === 4 ? 6 : 4] + } + } else { + family = records[affinity] + } + + // If no IPs we return null + if (family == null || family.ips.length === 0) { + return ip + } + + if (family.offset == null || family.offset === maxInt) { + family.offset = 0 + } else { + family.offset++ + } + + const position = family.offset % family.ips.length + ip = family.ips[position] ?? null + + if (ip == null) { + return ip + } + + if (Date.now() - ip.timestamp > ip.ttl) { // record TTL is already in ms + // We delete expired records + // It is possible that they have different TTL, so we manage them individually + family.ips.splice(position, 1) + return this.pick(origin, hostnameRecords, affinity) + } + + return ip + } + + setRecords (origin, addresses) { + const timestamp = Date.now() + const records = { records: { 4: null, 6: null } } + for (const record of addresses) { + record.timestamp = timestamp + if (typeof record.ttl === 'number') { + // The record TTL is expected to be in ms + record.ttl = Math.min(record.ttl, this.#maxTTL) + } else { + record.ttl = this.#maxTTL + } + + const familyRecords = records.records[record.family] ?? { ips: [] } + + familyRecords.ips.push(record) + records.records[record.family] = familyRecords + } + + this.#records.set(origin.hostname, records) + } + + deleteRecords (origin) { + this.#records.delete(origin.hostname) + } + + getHandler (meta, opts) { + return new DNSDispatchHandler(this, meta, opts) + } +} + +class DNSDispatchHandler extends DecoratorHandler { + #state = null + #opts = null + #dispatch = null + #origin = null + #controller = null + + constructor (state, { origin, handler, dispatch }, opts) { + super(handler) + this.#origin = origin + this.#opts = { ...opts } + this.#state = state + this.#dispatch = dispatch + } + + onResponseError (controller, err) { + switch (err.code) { + case 'ETIMEDOUT': + case 'ECONNREFUSED': { + if (this.#state.dualStack) { + // We delete the record and retry + this.#state.runLookup(this.#origin, this.#opts, (err, newOrigin) => { + if (err) { + super.onResponseError(controller, err) + return + } + + const dispatchOpts = { + ...this.#opts, + origin: newOrigin + } + + this.#dispatch(dispatchOpts, this) + }) + + return + } + + // if dual-stack disabled, we error out + super.onResponseError(controller, err) + break + } + case 'ENOTFOUND': + this.#state.deleteRecords(this.#origin) + // eslint-disable-next-line no-fallthrough + default: + super.onResponseError(controller, err) + break + } + } +} + +module.exports = interceptorOpts => { + if ( + interceptorOpts?.maxTTL != null && + (typeof interceptorOpts?.maxTTL !== 'number' || interceptorOpts?.maxTTL < 0) + ) { + throw new InvalidArgumentError('Invalid maxTTL. Must be a positive number') + } + + if ( + interceptorOpts?.maxItems != null && + (typeof interceptorOpts?.maxItems !== 'number' || + interceptorOpts?.maxItems < 1) + ) { + throw new InvalidArgumentError( + 'Invalid maxItems. Must be a positive number and greater than zero' + ) + } + + if ( + interceptorOpts?.affinity != null && + interceptorOpts?.affinity !== 4 && + interceptorOpts?.affinity !== 6 + ) { + throw new InvalidArgumentError('Invalid affinity. Must be either 4 or 6') + } + + if ( + interceptorOpts?.dualStack != null && + typeof interceptorOpts?.dualStack !== 'boolean' + ) { + throw new InvalidArgumentError('Invalid dualStack. Must be a boolean') + } + + if ( + interceptorOpts?.lookup != null && + typeof interceptorOpts?.lookup !== 'function' + ) { + throw new InvalidArgumentError('Invalid lookup. Must be a function') + } + + if ( + interceptorOpts?.pick != null && + typeof interceptorOpts?.pick !== 'function' + ) { + throw new InvalidArgumentError('Invalid pick. Must be a function') + } + + const dualStack = interceptorOpts?.dualStack ?? true + let affinity + if (dualStack) { + affinity = interceptorOpts?.affinity ?? null + } else { + affinity = interceptorOpts?.affinity ?? 4 + } + + const opts = { + maxTTL: interceptorOpts?.maxTTL ?? 10e3, // Expressed in ms + lookup: interceptorOpts?.lookup ?? null, + pick: interceptorOpts?.pick ?? null, + dualStack, + affinity, + maxItems: interceptorOpts?.maxItems ?? Infinity + } + + const instance = new DNSInstance(opts) + + return dispatch => { + return function dnsInterceptor (origDispatchOpts, handler) { + const origin = + origDispatchOpts.origin.constructor === URL + ? origDispatchOpts.origin + : new URL(origDispatchOpts.origin) + + if (isIP(origin.hostname) !== 0) { + return dispatch(origDispatchOpts, handler) + } + + instance.runLookup(origin, origDispatchOpts, (err, newOrigin) => { + if (err) { + return handler.onError(err) + } + + let dispatchOpts = null + dispatchOpts = { + ...origDispatchOpts, + servername: origin.hostname, // For SNI on TLS + origin: newOrigin, + headers: { + host: origin.host, + ...origDispatchOpts.headers + } + } + + dispatch( + dispatchOpts, + instance.getHandler({ origin, dispatch, handler }, origDispatchOpts) + ) + }) + + return true + } + } +} diff --git a/deps/undici/src/lib/interceptor/dump.js b/deps/undici/src/lib/interceptor/dump.js index fc9cacb198d1e6..61c09d5c9ee182 100644 --- a/deps/undici/src/lib/interceptor/dump.js +++ b/deps/undici/src/lib/interceptor/dump.js @@ -1,43 +1,40 @@ 'use strict' -const util = require('../core/util') const { InvalidArgumentError, RequestAbortedError } = require('../core/errors') const DecoratorHandler = require('../handler/decorator-handler') class DumpHandler extends DecoratorHandler { #maxSize = 1024 * 1024 - #abort = null #dumped = false - #aborted = false #size = 0 - #reason = null - #handler = null - - constructor ({ maxSize }, handler) { - super(handler) + #controller = null + aborted = false + reason = false + constructor ({ maxSize, signal }, handler) { if (maxSize != null && (!Number.isFinite(maxSize) || maxSize < 1)) { throw new InvalidArgumentError('maxSize must be a number greater than 0') } + super(handler) + this.#maxSize = maxSize ?? this.#maxSize - this.#handler = handler + // this.#handler = handler } - onConnect (abort) { - this.#abort = abort - - this.#handler.onConnect(this.#customAbort.bind(this)) + #abort (reason) { + this.aborted = true + this.reason = reason } - #customAbort (reason) { - this.#aborted = true - this.#reason = reason + onRequestStart (controller, context) { + controller.abort = this.#abort.bind(this) + this.#controller = controller + + return super.onRequestStart(controller, context) } - // TODO: will require adjustment after new hooks are out - onHeaders (statusCode, rawHeaders, resume, statusMessage) { - const headers = util.parseHeaders(rawHeaders) + onResponseStart (controller, statusCode, headers, statusMessage) { const contentLength = headers['content-length'] if (contentLength != null && contentLength > this.#maxSize) { @@ -48,55 +45,50 @@ class DumpHandler extends DecoratorHandler { ) } - if (this.#aborted) { + if (this.aborted === true) { return true } - return this.#handler.onHeaders( - statusCode, - rawHeaders, - resume, - statusMessage - ) + return super.onResponseStart(controller, statusCode, headers, statusMessage) } - onError (err) { + onResponseError (controller, err) { if (this.#dumped) { return } - err = this.#reason ?? err + err = this.#controller.reason ?? err - this.#handler.onError(err) + super.onResponseError(controller, err) } - onData (chunk) { + onResponseData (controller, chunk) { this.#size = this.#size + chunk.length if (this.#size >= this.#maxSize) { this.#dumped = true - if (this.#aborted) { - this.#handler.onError(this.#reason) + if (this.aborted === true) { + super.onResponseError(controller, this.reason) } else { - this.#handler.onComplete([]) + super.onResponseEnd(controller, {}) } } return true } - onComplete (trailers) { + onResponseEnd (controller, trailers) { if (this.#dumped) { return } - if (this.#aborted) { - this.#handler.onError(this.reason) + if (this.#controller.aborted === true) { + super.onResponseError(controller, this.reason) return } - this.#handler.onComplete(trailers) + super.onResponseEnd(controller, trailers) } } @@ -107,13 +99,9 @@ function createDumpInterceptor ( ) { return dispatch => { return function Intercept (opts, handler) { - const { dumpMaxSize = defaultMaxSize } = - opts + const { dumpMaxSize = defaultMaxSize } = opts - const dumpHandler = new DumpHandler( - { maxSize: dumpMaxSize }, - handler - ) + const dumpHandler = new DumpHandler({ maxSize: dumpMaxSize, signal: opts.signal }, handler) return dispatch(opts, dumpHandler) } diff --git a/deps/undici/src/lib/interceptor/redirect-interceptor.js b/deps/undici/src/lib/interceptor/redirect-interceptor.js deleted file mode 100644 index 896ee8db93966c..00000000000000 --- a/deps/undici/src/lib/interceptor/redirect-interceptor.js +++ /dev/null @@ -1,21 +0,0 @@ -'use strict' - -const RedirectHandler = require('../handler/redirect-handler') - -function createRedirectInterceptor ({ maxRedirections: defaultMaxRedirections }) { - return (dispatch) => { - return function Intercept (opts, handler) { - const { maxRedirections = defaultMaxRedirections } = opts - - if (!maxRedirections) { - return dispatch(opts, handler) - } - - const redirectHandler = new RedirectHandler(dispatch, maxRedirections, opts, handler) - opts = { ...opts, maxRedirections: 0 } // Stop sub dispatcher from also redirecting. - return dispatch(opts, redirectHandler) - } - } -} - -module.exports = createRedirectInterceptor diff --git a/deps/undici/src/lib/interceptor/redirect.js b/deps/undici/src/lib/interceptor/redirect.js index d2e789d8efb851..55bad59c6ee064 100644 --- a/deps/undici/src/lib/interceptor/redirect.js +++ b/deps/undici/src/lib/interceptor/redirect.js @@ -1,24 +1,21 @@ 'use strict' + const RedirectHandler = require('../handler/redirect-handler') -module.exports = opts => { - const globalMaxRedirections = opts?.maxRedirections - return dispatch => { - return function redirectInterceptor (opts, handler) { - const { maxRedirections = globalMaxRedirections, ...baseOpts } = opts +function createRedirectInterceptor ({ maxRedirections: defaultMaxRedirections } = {}) { + return (dispatch) => { + return function Intercept (opts, handler) { + const { maxRedirections = defaultMaxRedirections, ...rest } = opts - if (!maxRedirections) { + if (maxRedirections == null || maxRedirections === 0) { return dispatch(opts, handler) } - const redirectHandler = new RedirectHandler( - dispatch, - maxRedirections, - opts, - handler - ) - - return dispatch(baseOpts, redirectHandler) + const dispatchOpts = { ...rest, maxRedirections: 0 } // Stop sub dispatcher from also redirecting. + const redirectHandler = new RedirectHandler(dispatch, maxRedirections, dispatchOpts, handler) + return dispatch(dispatchOpts, redirectHandler) } } } + +module.exports = createRedirectInterceptor diff --git a/deps/undici/src/lib/interceptor/response-error.js b/deps/undici/src/lib/interceptor/response-error.js index 3ded9c87fb736b..a8105aa1437fee 100644 --- a/deps/undici/src/lib/interceptor/response-error.js +++ b/deps/undici/src/lib/interceptor/response-error.js @@ -1,59 +1,61 @@ 'use strict' -const { parseHeaders } = require('../core/util') +// const { parseHeaders } = require('../core/util') const DecoratorHandler = require('../handler/decorator-handler') const { ResponseError } = require('../core/errors') -class Handler extends DecoratorHandler { - #handler +class ResponseErrorHandler extends DecoratorHandler { #statusCode #contentType #decoder #headers #body - constructor (opts, { handler }) { + constructor (_opts, { handler }) { super(handler) - this.#handler = handler } - onConnect (abort) { + #checkContentType (contentType) { + return (this.#contentType ?? '').indexOf(contentType) === 0 + } + + onRequestStart (controller, context) { this.#statusCode = 0 this.#contentType = null this.#decoder = null this.#headers = null this.#body = '' - return this.#handler.onConnect(abort) + return super.onRequestStart(controller, context) } - onHeaders (statusCode, rawHeaders, resume, statusMessage, headers = parseHeaders(rawHeaders)) { + onResponseStart (controller, statusCode, headers, statusMessage) { this.#statusCode = statusCode this.#headers = headers this.#contentType = headers['content-type'] if (this.#statusCode < 400) { - return this.#handler.onHeaders(statusCode, rawHeaders, resume, statusMessage, headers) + return super.onResponseStart(controller, statusCode, headers, statusMessage) } - if (this.#contentType === 'application/json' || this.#contentType === 'text/plain') { + if (this.#checkContentType('application/json') || this.#checkContentType('text/plain')) { this.#decoder = new TextDecoder('utf-8') } } - onData (chunk) { + onResponseData (controller, chunk) { if (this.#statusCode < 400) { - return this.#handler.onData(chunk) + return super.onResponseData(controller, chunk) } this.#body += this.#decoder?.decode(chunk, { stream: true }) ?? '' } - onComplete (rawTrailers) { + onResponseEnd (controller, trailers) { if (this.#statusCode >= 400) { this.#body += this.#decoder?.decode(undefined, { stream: false }) ?? '' - if (this.#contentType === 'application/json') { + if (this.#checkContentType('application/json')) { try { this.#body = JSON.parse(this.#body) } catch { @@ -65,22 +67,29 @@ class Handler extends DecoratorHandler { const stackTraceLimit = Error.stackTraceLimit Error.stackTraceLimit = 0 try { - err = new ResponseError('Response Error', this.#statusCode, this.#headers, this.#body) + err = new ResponseError('Response Error', this.#statusCode, { + body: this.#body, + headers: this.#headers + }) } finally { Error.stackTraceLimit = stackTraceLimit } - this.#handler.onError(err) + super.onResponseError(controller, err) } else { - this.#handler.onComplete(rawTrailers) + super.onResponseEnd(controller, trailers) } } - onError (err) { - this.#handler.onError(err) + onResponseError (controller, err) { + super.onResponseError(controller, err) } } -module.exports = (dispatch) => (opts, handler) => opts.throwOnError - ? dispatch(opts, new Handler(opts, { handler })) - : dispatch(opts, handler) +module.exports = () => { + return (dispatch) => { + return function Intercept (opts, handler) { + return dispatch(opts, new ResponseErrorHandler(opts, { handler })) + } + } +} diff --git a/deps/undici/src/lib/llhttp/constants.d.ts b/deps/undici/src/lib/llhttp/constants.d.ts new file mode 100644 index 00000000000000..83fa4eb4622379 --- /dev/null +++ b/deps/undici/src/lib/llhttp/constants.d.ts @@ -0,0 +1,97 @@ +export type IntDict = Record; +export declare const ERROR: IntDict; +export declare const TYPE: IntDict; +export declare const FLAGS: IntDict; +export declare const LENIENT_FLAGS: IntDict; +export declare const METHODS: IntDict; +export declare const STATUSES: IntDict; +export declare const FINISH: IntDict; +export declare const HEADER_STATE: IntDict; +export declare const METHODS_HTTP: number[]; +export declare const METHODS_ICE: number[]; +export declare const METHODS_RTSP: number[]; +export declare const METHOD_MAP: IntDict; +export declare const H_METHOD_MAP: { + [k: string]: number; +}; +export declare const STATUSES_HTTP: number[]; +export type CharList = Array; +export declare const ALPHA: CharList; +export declare const NUM_MAP: { + 0: number; + 1: number; + 2: number; + 3: number; + 4: number; + 5: number; + 6: number; + 7: number; + 8: number; + 9: number; +}; +export declare const HEX_MAP: { + 0: number; + 1: number; + 2: number; + 3: number; + 4: number; + 5: number; + 6: number; + 7: number; + 8: number; + 9: number; + A: number; + B: number; + C: number; + D: number; + E: number; + F: number; + a: number; + b: number; + c: number; + d: number; + e: number; + f: number; +}; +export declare const NUM: CharList; +export declare const ALPHANUM: CharList; +export declare const MARK: CharList; +export declare const USERINFO_CHARS: CharList; +export declare const URL_CHAR: CharList; +export declare const HEX: CharList; +export declare const TOKEN: CharList; +export declare const HEADER_CHARS: CharList; +export declare const CONNECTION_TOKEN_CHARS: CharList; +export declare const QUOTED_STRING: CharList; +export declare const HTAB_SP_VCHAR_OBS_TEXT: CharList; +export declare const MAJOR: { + 0: number; + 1: number; + 2: number; + 3: number; + 4: number; + 5: number; + 6: number; + 7: number; + 8: number; + 9: number; +}; +export declare const MINOR: { + 0: number; + 1: number; + 2: number; + 3: number; + 4: number; + 5: number; + 6: number; + 7: number; + 8: number; + 9: number; +}; +export declare const SPECIAL_HEADERS: { + connection: number; + 'content-length': number; + 'proxy-connection': number; + 'transfer-encoding': number; + upgrade: number; +}; diff --git a/deps/undici/src/lib/llhttp/constants.js b/deps/undici/src/lib/llhttp/constants.js index fb0b5a24c523ef..3e1dc01cdb528f 100644 --- a/deps/undici/src/lib/llhttp/constants.js +++ b/deps/undici/src/lib/llhttp/constants.js @@ -1,192 +1,416 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.SPECIAL_HEADERS = exports.HEADER_STATE = exports.MINOR = exports.MAJOR = exports.CONNECTION_TOKEN_CHARS = exports.HEADER_CHARS = exports.TOKEN = exports.STRICT_TOKEN = exports.HEX = exports.URL_CHAR = exports.STRICT_URL_CHAR = exports.USERINFO_CHARS = exports.MARK = exports.ALPHANUM = exports.NUM = exports.HEX_MAP = exports.NUM_MAP = exports.ALPHA = exports.FINISH = exports.H_METHOD_MAP = exports.METHOD_MAP = exports.METHODS_RTSP = exports.METHODS_ICE = exports.METHODS_HTTP = exports.METHODS = exports.LENIENT_FLAGS = exports.FLAGS = exports.TYPE = exports.ERROR = void 0; +exports.SPECIAL_HEADERS = exports.MINOR = exports.MAJOR = exports.HTAB_SP_VCHAR_OBS_TEXT = exports.QUOTED_STRING = exports.CONNECTION_TOKEN_CHARS = exports.HEADER_CHARS = exports.TOKEN = exports.HEX = exports.URL_CHAR = exports.USERINFO_CHARS = exports.MARK = exports.ALPHANUM = exports.NUM = exports.HEX_MAP = exports.NUM_MAP = exports.ALPHA = exports.STATUSES_HTTP = exports.H_METHOD_MAP = exports.METHOD_MAP = exports.METHODS_RTSP = exports.METHODS_ICE = exports.METHODS_HTTP = exports.HEADER_STATE = exports.FINISH = exports.STATUSES = exports.METHODS = exports.LENIENT_FLAGS = exports.FLAGS = exports.TYPE = exports.ERROR = void 0; const utils_1 = require("./utils"); -// C headers -var ERROR; -(function (ERROR) { - ERROR[ERROR["OK"] = 0] = "OK"; - ERROR[ERROR["INTERNAL"] = 1] = "INTERNAL"; - ERROR[ERROR["STRICT"] = 2] = "STRICT"; - ERROR[ERROR["LF_EXPECTED"] = 3] = "LF_EXPECTED"; - ERROR[ERROR["UNEXPECTED_CONTENT_LENGTH"] = 4] = "UNEXPECTED_CONTENT_LENGTH"; - ERROR[ERROR["CLOSED_CONNECTION"] = 5] = "CLOSED_CONNECTION"; - ERROR[ERROR["INVALID_METHOD"] = 6] = "INVALID_METHOD"; - ERROR[ERROR["INVALID_URL"] = 7] = "INVALID_URL"; - ERROR[ERROR["INVALID_CONSTANT"] = 8] = "INVALID_CONSTANT"; - ERROR[ERROR["INVALID_VERSION"] = 9] = "INVALID_VERSION"; - ERROR[ERROR["INVALID_HEADER_TOKEN"] = 10] = "INVALID_HEADER_TOKEN"; - ERROR[ERROR["INVALID_CONTENT_LENGTH"] = 11] = "INVALID_CONTENT_LENGTH"; - ERROR[ERROR["INVALID_CHUNK_SIZE"] = 12] = "INVALID_CHUNK_SIZE"; - ERROR[ERROR["INVALID_STATUS"] = 13] = "INVALID_STATUS"; - ERROR[ERROR["INVALID_EOF_STATE"] = 14] = "INVALID_EOF_STATE"; - ERROR[ERROR["INVALID_TRANSFER_ENCODING"] = 15] = "INVALID_TRANSFER_ENCODING"; - ERROR[ERROR["CB_MESSAGE_BEGIN"] = 16] = "CB_MESSAGE_BEGIN"; - ERROR[ERROR["CB_HEADERS_COMPLETE"] = 17] = "CB_HEADERS_COMPLETE"; - ERROR[ERROR["CB_MESSAGE_COMPLETE"] = 18] = "CB_MESSAGE_COMPLETE"; - ERROR[ERROR["CB_CHUNK_HEADER"] = 19] = "CB_CHUNK_HEADER"; - ERROR[ERROR["CB_CHUNK_COMPLETE"] = 20] = "CB_CHUNK_COMPLETE"; - ERROR[ERROR["PAUSED"] = 21] = "PAUSED"; - ERROR[ERROR["PAUSED_UPGRADE"] = 22] = "PAUSED_UPGRADE"; - ERROR[ERROR["PAUSED_H2_UPGRADE"] = 23] = "PAUSED_H2_UPGRADE"; - ERROR[ERROR["USER"] = 24] = "USER"; -})(ERROR = exports.ERROR || (exports.ERROR = {})); -var TYPE; -(function (TYPE) { - TYPE[TYPE["BOTH"] = 0] = "BOTH"; - TYPE[TYPE["REQUEST"] = 1] = "REQUEST"; - TYPE[TYPE["RESPONSE"] = 2] = "RESPONSE"; -})(TYPE = exports.TYPE || (exports.TYPE = {})); -var FLAGS; -(function (FLAGS) { - FLAGS[FLAGS["CONNECTION_KEEP_ALIVE"] = 1] = "CONNECTION_KEEP_ALIVE"; - FLAGS[FLAGS["CONNECTION_CLOSE"] = 2] = "CONNECTION_CLOSE"; - FLAGS[FLAGS["CONNECTION_UPGRADE"] = 4] = "CONNECTION_UPGRADE"; - FLAGS[FLAGS["CHUNKED"] = 8] = "CHUNKED"; - FLAGS[FLAGS["UPGRADE"] = 16] = "UPGRADE"; - FLAGS[FLAGS["CONTENT_LENGTH"] = 32] = "CONTENT_LENGTH"; - FLAGS[FLAGS["SKIPBODY"] = 64] = "SKIPBODY"; - FLAGS[FLAGS["TRAILING"] = 128] = "TRAILING"; +// Emums +exports.ERROR = { + OK: 0, + INTERNAL: 1, + STRICT: 2, + CR_EXPECTED: 25, + LF_EXPECTED: 3, + UNEXPECTED_CONTENT_LENGTH: 4, + UNEXPECTED_SPACE: 30, + CLOSED_CONNECTION: 5, + INVALID_METHOD: 6, + INVALID_URL: 7, + INVALID_CONSTANT: 8, + INVALID_VERSION: 9, + INVALID_HEADER_TOKEN: 10, + INVALID_CONTENT_LENGTH: 11, + INVALID_CHUNK_SIZE: 12, + INVALID_STATUS: 13, + INVALID_EOF_STATE: 14, + INVALID_TRANSFER_ENCODING: 15, + CB_MESSAGE_BEGIN: 16, + CB_HEADERS_COMPLETE: 17, + CB_MESSAGE_COMPLETE: 18, + CB_CHUNK_HEADER: 19, + CB_CHUNK_COMPLETE: 20, + PAUSED: 21, + PAUSED_UPGRADE: 22, + PAUSED_H2_UPGRADE: 23, + USER: 24, + CB_URL_COMPLETE: 26, + CB_STATUS_COMPLETE: 27, + CB_METHOD_COMPLETE: 32, + CB_VERSION_COMPLETE: 33, + CB_HEADER_FIELD_COMPLETE: 28, + CB_HEADER_VALUE_COMPLETE: 29, + CB_CHUNK_EXTENSION_NAME_COMPLETE: 34, + CB_CHUNK_EXTENSION_VALUE_COMPLETE: 35, + CB_RESET: 31, +}; +exports.TYPE = { + BOTH: 0, // default + REQUEST: 1, + RESPONSE: 2, +}; +exports.FLAGS = { + CONNECTION_KEEP_ALIVE: 1 << 0, + CONNECTION_CLOSE: 1 << 1, + CONNECTION_UPGRADE: 1 << 2, + CHUNKED: 1 << 3, + UPGRADE: 1 << 4, + CONTENT_LENGTH: 1 << 5, + SKIPBODY: 1 << 6, + TRAILING: 1 << 7, // 1 << 8 is unused - FLAGS[FLAGS["TRANSFER_ENCODING"] = 512] = "TRANSFER_ENCODING"; -})(FLAGS = exports.FLAGS || (exports.FLAGS = {})); -var LENIENT_FLAGS; -(function (LENIENT_FLAGS) { - LENIENT_FLAGS[LENIENT_FLAGS["HEADERS"] = 1] = "HEADERS"; - LENIENT_FLAGS[LENIENT_FLAGS["CHUNKED_LENGTH"] = 2] = "CHUNKED_LENGTH"; - LENIENT_FLAGS[LENIENT_FLAGS["KEEP_ALIVE"] = 4] = "KEEP_ALIVE"; -})(LENIENT_FLAGS = exports.LENIENT_FLAGS || (exports.LENIENT_FLAGS = {})); -var METHODS; -(function (METHODS) { - METHODS[METHODS["DELETE"] = 0] = "DELETE"; - METHODS[METHODS["GET"] = 1] = "GET"; - METHODS[METHODS["HEAD"] = 2] = "HEAD"; - METHODS[METHODS["POST"] = 3] = "POST"; - METHODS[METHODS["PUT"] = 4] = "PUT"; + TRANSFER_ENCODING: 1 << 9, +}; +exports.LENIENT_FLAGS = { + HEADERS: 1 << 0, + CHUNKED_LENGTH: 1 << 1, + KEEP_ALIVE: 1 << 2, + TRANSFER_ENCODING: 1 << 3, + VERSION: 1 << 4, + DATA_AFTER_CLOSE: 1 << 5, + OPTIONAL_LF_AFTER_CR: 1 << 6, + OPTIONAL_CRLF_AFTER_CHUNK: 1 << 7, + OPTIONAL_CR_BEFORE_LF: 1 << 8, + SPACES_AFTER_CHUNK_SIZE: 1 << 9, +}; +exports.METHODS = { + 'DELETE': 0, + 'GET': 1, + 'HEAD': 2, + 'POST': 3, + 'PUT': 4, /* pathological */ - METHODS[METHODS["CONNECT"] = 5] = "CONNECT"; - METHODS[METHODS["OPTIONS"] = 6] = "OPTIONS"; - METHODS[METHODS["TRACE"] = 7] = "TRACE"; + 'CONNECT': 5, + 'OPTIONS': 6, + 'TRACE': 7, /* WebDAV */ - METHODS[METHODS["COPY"] = 8] = "COPY"; - METHODS[METHODS["LOCK"] = 9] = "LOCK"; - METHODS[METHODS["MKCOL"] = 10] = "MKCOL"; - METHODS[METHODS["MOVE"] = 11] = "MOVE"; - METHODS[METHODS["PROPFIND"] = 12] = "PROPFIND"; - METHODS[METHODS["PROPPATCH"] = 13] = "PROPPATCH"; - METHODS[METHODS["SEARCH"] = 14] = "SEARCH"; - METHODS[METHODS["UNLOCK"] = 15] = "UNLOCK"; - METHODS[METHODS["BIND"] = 16] = "BIND"; - METHODS[METHODS["REBIND"] = 17] = "REBIND"; - METHODS[METHODS["UNBIND"] = 18] = "UNBIND"; - METHODS[METHODS["ACL"] = 19] = "ACL"; + 'COPY': 8, + 'LOCK': 9, + 'MKCOL': 10, + 'MOVE': 11, + 'PROPFIND': 12, + 'PROPPATCH': 13, + 'SEARCH': 14, + 'UNLOCK': 15, + 'BIND': 16, + 'REBIND': 17, + 'UNBIND': 18, + 'ACL': 19, /* subversion */ - METHODS[METHODS["REPORT"] = 20] = "REPORT"; - METHODS[METHODS["MKACTIVITY"] = 21] = "MKACTIVITY"; - METHODS[METHODS["CHECKOUT"] = 22] = "CHECKOUT"; - METHODS[METHODS["MERGE"] = 23] = "MERGE"; + 'REPORT': 20, + 'MKACTIVITY': 21, + 'CHECKOUT': 22, + 'MERGE': 23, /* upnp */ - METHODS[METHODS["M-SEARCH"] = 24] = "M-SEARCH"; - METHODS[METHODS["NOTIFY"] = 25] = "NOTIFY"; - METHODS[METHODS["SUBSCRIBE"] = 26] = "SUBSCRIBE"; - METHODS[METHODS["UNSUBSCRIBE"] = 27] = "UNSUBSCRIBE"; + 'M-SEARCH': 24, + 'NOTIFY': 25, + 'SUBSCRIBE': 26, + 'UNSUBSCRIBE': 27, /* RFC-5789 */ - METHODS[METHODS["PATCH"] = 28] = "PATCH"; - METHODS[METHODS["PURGE"] = 29] = "PURGE"; + 'PATCH': 28, + 'PURGE': 29, /* CalDAV */ - METHODS[METHODS["MKCALENDAR"] = 30] = "MKCALENDAR"; + 'MKCALENDAR': 30, /* RFC-2068, section 19.6.1.2 */ - METHODS[METHODS["LINK"] = 31] = "LINK"; - METHODS[METHODS["UNLINK"] = 32] = "UNLINK"; + 'LINK': 31, + 'UNLINK': 32, /* icecast */ - METHODS[METHODS["SOURCE"] = 33] = "SOURCE"; + 'SOURCE': 33, /* RFC-7540, section 11.6 */ - METHODS[METHODS["PRI"] = 34] = "PRI"; + 'PRI': 34, /* RFC-2326 RTSP */ - METHODS[METHODS["DESCRIBE"] = 35] = "DESCRIBE"; - METHODS[METHODS["ANNOUNCE"] = 36] = "ANNOUNCE"; - METHODS[METHODS["SETUP"] = 37] = "SETUP"; - METHODS[METHODS["PLAY"] = 38] = "PLAY"; - METHODS[METHODS["PAUSE"] = 39] = "PAUSE"; - METHODS[METHODS["TEARDOWN"] = 40] = "TEARDOWN"; - METHODS[METHODS["GET_PARAMETER"] = 41] = "GET_PARAMETER"; - METHODS[METHODS["SET_PARAMETER"] = 42] = "SET_PARAMETER"; - METHODS[METHODS["REDIRECT"] = 43] = "REDIRECT"; - METHODS[METHODS["RECORD"] = 44] = "RECORD"; + 'DESCRIBE': 35, + 'ANNOUNCE': 36, + 'SETUP': 37, + 'PLAY': 38, + 'PAUSE': 39, + 'TEARDOWN': 40, + 'GET_PARAMETER': 41, + 'SET_PARAMETER': 42, + 'REDIRECT': 43, + 'RECORD': 44, /* RAOP */ - METHODS[METHODS["FLUSH"] = 45] = "FLUSH"; -})(METHODS = exports.METHODS || (exports.METHODS = {})); + 'FLUSH': 45, + /* DRAFT https://www.ietf.org/archive/id/draft-ietf-httpbis-safe-method-w-body-02.html */ + 'QUERY': 46, +}; +exports.STATUSES = { + CONTINUE: 100, + SWITCHING_PROTOCOLS: 101, + PROCESSING: 102, + EARLY_HINTS: 103, + RESPONSE_IS_STALE: 110, // Unofficial + REVALIDATION_FAILED: 111, // Unofficial + DISCONNECTED_OPERATION: 112, // Unofficial + HEURISTIC_EXPIRATION: 113, // Unofficial + MISCELLANEOUS_WARNING: 199, // Unofficial + OK: 200, + CREATED: 201, + ACCEPTED: 202, + NON_AUTHORITATIVE_INFORMATION: 203, + NO_CONTENT: 204, + RESET_CONTENT: 205, + PARTIAL_CONTENT: 206, + MULTI_STATUS: 207, + ALREADY_REPORTED: 208, + TRANSFORMATION_APPLIED: 214, // Unofficial + IM_USED: 226, + MISCELLANEOUS_PERSISTENT_WARNING: 299, // Unofficial + MULTIPLE_CHOICES: 300, + MOVED_PERMANENTLY: 301, + FOUND: 302, + SEE_OTHER: 303, + NOT_MODIFIED: 304, + USE_PROXY: 305, + SWITCH_PROXY: 306, // No longer used + TEMPORARY_REDIRECT: 307, + PERMANENT_REDIRECT: 308, + BAD_REQUEST: 400, + UNAUTHORIZED: 401, + PAYMENT_REQUIRED: 402, + FORBIDDEN: 403, + NOT_FOUND: 404, + METHOD_NOT_ALLOWED: 405, + NOT_ACCEPTABLE: 406, + PROXY_AUTHENTICATION_REQUIRED: 407, + REQUEST_TIMEOUT: 408, + CONFLICT: 409, + GONE: 410, + LENGTH_REQUIRED: 411, + PRECONDITION_FAILED: 412, + PAYLOAD_TOO_LARGE: 413, + URI_TOO_LONG: 414, + UNSUPPORTED_MEDIA_TYPE: 415, + RANGE_NOT_SATISFIABLE: 416, + EXPECTATION_FAILED: 417, + IM_A_TEAPOT: 418, + PAGE_EXPIRED: 419, // Unofficial + ENHANCE_YOUR_CALM: 420, // Unofficial + MISDIRECTED_REQUEST: 421, + UNPROCESSABLE_ENTITY: 422, + LOCKED: 423, + FAILED_DEPENDENCY: 424, + TOO_EARLY: 425, + UPGRADE_REQUIRED: 426, + PRECONDITION_REQUIRED: 428, + TOO_MANY_REQUESTS: 429, + REQUEST_HEADER_FIELDS_TOO_LARGE_UNOFFICIAL: 430, // Unofficial + REQUEST_HEADER_FIELDS_TOO_LARGE: 431, + LOGIN_TIMEOUT: 440, // Unofficial + NO_RESPONSE: 444, // Unofficial + RETRY_WITH: 449, // Unofficial + BLOCKED_BY_PARENTAL_CONTROL: 450, // Unofficial + UNAVAILABLE_FOR_LEGAL_REASONS: 451, + CLIENT_CLOSED_LOAD_BALANCED_REQUEST: 460, // Unofficial + INVALID_X_FORWARDED_FOR: 463, // Unofficial + REQUEST_HEADER_TOO_LARGE: 494, // Unofficial + SSL_CERTIFICATE_ERROR: 495, // Unofficial + SSL_CERTIFICATE_REQUIRED: 496, // Unofficial + HTTP_REQUEST_SENT_TO_HTTPS_PORT: 497, // Unofficial + INVALID_TOKEN: 498, // Unofficial + CLIENT_CLOSED_REQUEST: 499, // Unofficial + INTERNAL_SERVER_ERROR: 500, + NOT_IMPLEMENTED: 501, + BAD_GATEWAY: 502, + SERVICE_UNAVAILABLE: 503, + GATEWAY_TIMEOUT: 504, + HTTP_VERSION_NOT_SUPPORTED: 505, + VARIANT_ALSO_NEGOTIATES: 506, + INSUFFICIENT_STORAGE: 507, + LOOP_DETECTED: 508, + BANDWIDTH_LIMIT_EXCEEDED: 509, + NOT_EXTENDED: 510, + NETWORK_AUTHENTICATION_REQUIRED: 511, + WEB_SERVER_UNKNOWN_ERROR: 520, // Unofficial + WEB_SERVER_IS_DOWN: 521, // Unofficial + CONNECTION_TIMEOUT: 522, // Unofficial + ORIGIN_IS_UNREACHABLE: 523, // Unofficial + TIMEOUT_OCCURED: 524, // Unofficial + SSL_HANDSHAKE_FAILED: 525, // Unofficial + INVALID_SSL_CERTIFICATE: 526, // Unofficial + RAILGUN_ERROR: 527, // Unofficial + SITE_IS_OVERLOADED: 529, // Unofficial + SITE_IS_FROZEN: 530, // Unofficial + IDENTITY_PROVIDER_AUTHENTICATION_ERROR: 561, // Unofficial + NETWORK_READ_TIMEOUT: 598, // Unofficial + NETWORK_CONNECT_TIMEOUT: 599, // Unofficial +}; +exports.FINISH = { + SAFE: 0, + SAFE_WITH_CB: 1, + UNSAFE: 2, +}; +exports.HEADER_STATE = { + GENERAL: 0, + CONNECTION: 1, + CONTENT_LENGTH: 2, + TRANSFER_ENCODING: 3, + UPGRADE: 4, + CONNECTION_KEEP_ALIVE: 5, + CONNECTION_CLOSE: 6, + CONNECTION_UPGRADE: 7, + TRANSFER_ENCODING_CHUNKED: 8, +}; +// C headers exports.METHODS_HTTP = [ - METHODS.DELETE, - METHODS.GET, - METHODS.HEAD, - METHODS.POST, - METHODS.PUT, - METHODS.CONNECT, - METHODS.OPTIONS, - METHODS.TRACE, - METHODS.COPY, - METHODS.LOCK, - METHODS.MKCOL, - METHODS.MOVE, - METHODS.PROPFIND, - METHODS.PROPPATCH, - METHODS.SEARCH, - METHODS.UNLOCK, - METHODS.BIND, - METHODS.REBIND, - METHODS.UNBIND, - METHODS.ACL, - METHODS.REPORT, - METHODS.MKACTIVITY, - METHODS.CHECKOUT, - METHODS.MERGE, - METHODS['M-SEARCH'], - METHODS.NOTIFY, - METHODS.SUBSCRIBE, - METHODS.UNSUBSCRIBE, - METHODS.PATCH, - METHODS.PURGE, - METHODS.MKCALENDAR, - METHODS.LINK, - METHODS.UNLINK, - METHODS.PRI, + exports.METHODS.DELETE, + exports.METHODS.GET, + exports.METHODS.HEAD, + exports.METHODS.POST, + exports.METHODS.PUT, + exports.METHODS.CONNECT, + exports.METHODS.OPTIONS, + exports.METHODS.TRACE, + exports.METHODS.COPY, + exports.METHODS.LOCK, + exports.METHODS.MKCOL, + exports.METHODS.MOVE, + exports.METHODS.PROPFIND, + exports.METHODS.PROPPATCH, + exports.METHODS.SEARCH, + exports.METHODS.UNLOCK, + exports.METHODS.BIND, + exports.METHODS.REBIND, + exports.METHODS.UNBIND, + exports.METHODS.ACL, + exports.METHODS.REPORT, + exports.METHODS.MKACTIVITY, + exports.METHODS.CHECKOUT, + exports.METHODS.MERGE, + exports.METHODS['M-SEARCH'], + exports.METHODS.NOTIFY, + exports.METHODS.SUBSCRIBE, + exports.METHODS.UNSUBSCRIBE, + exports.METHODS.PATCH, + exports.METHODS.PURGE, + exports.METHODS.MKCALENDAR, + exports.METHODS.LINK, + exports.METHODS.UNLINK, + exports.METHODS.PRI, // TODO(indutny): should we allow it with HTTP? - METHODS.SOURCE, + exports.METHODS.SOURCE, + exports.METHODS.QUERY, ]; exports.METHODS_ICE = [ - METHODS.SOURCE, + exports.METHODS.SOURCE, ]; exports.METHODS_RTSP = [ - METHODS.OPTIONS, - METHODS.DESCRIBE, - METHODS.ANNOUNCE, - METHODS.SETUP, - METHODS.PLAY, - METHODS.PAUSE, - METHODS.TEARDOWN, - METHODS.GET_PARAMETER, - METHODS.SET_PARAMETER, - METHODS.REDIRECT, - METHODS.RECORD, - METHODS.FLUSH, + exports.METHODS.OPTIONS, + exports.METHODS.DESCRIBE, + exports.METHODS.ANNOUNCE, + exports.METHODS.SETUP, + exports.METHODS.PLAY, + exports.METHODS.PAUSE, + exports.METHODS.TEARDOWN, + exports.METHODS.GET_PARAMETER, + exports.METHODS.SET_PARAMETER, + exports.METHODS.REDIRECT, + exports.METHODS.RECORD, + exports.METHODS.FLUSH, // For AirPlay - METHODS.GET, - METHODS.POST, + exports.METHODS.GET, + exports.METHODS.POST, +]; +exports.METHOD_MAP = (0, utils_1.enumToMap)(exports.METHODS); +exports.H_METHOD_MAP = Object.fromEntries(Object.entries(exports.METHODS).filter(([k]) => k.startsWith('H'))); +exports.STATUSES_HTTP = [ + exports.STATUSES.CONTINUE, + exports.STATUSES.SWITCHING_PROTOCOLS, + exports.STATUSES.PROCESSING, + exports.STATUSES.EARLY_HINTS, + exports.STATUSES.RESPONSE_IS_STALE, + exports.STATUSES.REVALIDATION_FAILED, + exports.STATUSES.DISCONNECTED_OPERATION, + exports.STATUSES.HEURISTIC_EXPIRATION, + exports.STATUSES.MISCELLANEOUS_WARNING, + exports.STATUSES.OK, + exports.STATUSES.CREATED, + exports.STATUSES.ACCEPTED, + exports.STATUSES.NON_AUTHORITATIVE_INFORMATION, + exports.STATUSES.NO_CONTENT, + exports.STATUSES.RESET_CONTENT, + exports.STATUSES.PARTIAL_CONTENT, + exports.STATUSES.MULTI_STATUS, + exports.STATUSES.ALREADY_REPORTED, + exports.STATUSES.TRANSFORMATION_APPLIED, + exports.STATUSES.IM_USED, + exports.STATUSES.MISCELLANEOUS_PERSISTENT_WARNING, + exports.STATUSES.MULTIPLE_CHOICES, + exports.STATUSES.MOVED_PERMANENTLY, + exports.STATUSES.FOUND, + exports.STATUSES.SEE_OTHER, + exports.STATUSES.NOT_MODIFIED, + exports.STATUSES.USE_PROXY, + exports.STATUSES.SWITCH_PROXY, + exports.STATUSES.TEMPORARY_REDIRECT, + exports.STATUSES.PERMANENT_REDIRECT, + exports.STATUSES.BAD_REQUEST, + exports.STATUSES.UNAUTHORIZED, + exports.STATUSES.PAYMENT_REQUIRED, + exports.STATUSES.FORBIDDEN, + exports.STATUSES.NOT_FOUND, + exports.STATUSES.METHOD_NOT_ALLOWED, + exports.STATUSES.NOT_ACCEPTABLE, + exports.STATUSES.PROXY_AUTHENTICATION_REQUIRED, + exports.STATUSES.REQUEST_TIMEOUT, + exports.STATUSES.CONFLICT, + exports.STATUSES.GONE, + exports.STATUSES.LENGTH_REQUIRED, + exports.STATUSES.PRECONDITION_FAILED, + exports.STATUSES.PAYLOAD_TOO_LARGE, + exports.STATUSES.URI_TOO_LONG, + exports.STATUSES.UNSUPPORTED_MEDIA_TYPE, + exports.STATUSES.RANGE_NOT_SATISFIABLE, + exports.STATUSES.EXPECTATION_FAILED, + exports.STATUSES.IM_A_TEAPOT, + exports.STATUSES.PAGE_EXPIRED, + exports.STATUSES.ENHANCE_YOUR_CALM, + exports.STATUSES.MISDIRECTED_REQUEST, + exports.STATUSES.UNPROCESSABLE_ENTITY, + exports.STATUSES.LOCKED, + exports.STATUSES.FAILED_DEPENDENCY, + exports.STATUSES.TOO_EARLY, + exports.STATUSES.UPGRADE_REQUIRED, + exports.STATUSES.PRECONDITION_REQUIRED, + exports.STATUSES.TOO_MANY_REQUESTS, + exports.STATUSES.REQUEST_HEADER_FIELDS_TOO_LARGE_UNOFFICIAL, + exports.STATUSES.REQUEST_HEADER_FIELDS_TOO_LARGE, + exports.STATUSES.LOGIN_TIMEOUT, + exports.STATUSES.NO_RESPONSE, + exports.STATUSES.RETRY_WITH, + exports.STATUSES.BLOCKED_BY_PARENTAL_CONTROL, + exports.STATUSES.UNAVAILABLE_FOR_LEGAL_REASONS, + exports.STATUSES.CLIENT_CLOSED_LOAD_BALANCED_REQUEST, + exports.STATUSES.INVALID_X_FORWARDED_FOR, + exports.STATUSES.REQUEST_HEADER_TOO_LARGE, + exports.STATUSES.SSL_CERTIFICATE_ERROR, + exports.STATUSES.SSL_CERTIFICATE_REQUIRED, + exports.STATUSES.HTTP_REQUEST_SENT_TO_HTTPS_PORT, + exports.STATUSES.INVALID_TOKEN, + exports.STATUSES.CLIENT_CLOSED_REQUEST, + exports.STATUSES.INTERNAL_SERVER_ERROR, + exports.STATUSES.NOT_IMPLEMENTED, + exports.STATUSES.BAD_GATEWAY, + exports.STATUSES.SERVICE_UNAVAILABLE, + exports.STATUSES.GATEWAY_TIMEOUT, + exports.STATUSES.HTTP_VERSION_NOT_SUPPORTED, + exports.STATUSES.VARIANT_ALSO_NEGOTIATES, + exports.STATUSES.INSUFFICIENT_STORAGE, + exports.STATUSES.LOOP_DETECTED, + exports.STATUSES.BANDWIDTH_LIMIT_EXCEEDED, + exports.STATUSES.NOT_EXTENDED, + exports.STATUSES.NETWORK_AUTHENTICATION_REQUIRED, + exports.STATUSES.WEB_SERVER_UNKNOWN_ERROR, + exports.STATUSES.WEB_SERVER_IS_DOWN, + exports.STATUSES.CONNECTION_TIMEOUT, + exports.STATUSES.ORIGIN_IS_UNREACHABLE, + exports.STATUSES.TIMEOUT_OCCURED, + exports.STATUSES.SSL_HANDSHAKE_FAILED, + exports.STATUSES.INVALID_SSL_CERTIFICATE, + exports.STATUSES.RAILGUN_ERROR, + exports.STATUSES.SITE_IS_OVERLOADED, + exports.STATUSES.SITE_IS_FROZEN, + exports.STATUSES.IDENTITY_PROVIDER_AUTHENTICATION_ERROR, + exports.STATUSES.NETWORK_READ_TIMEOUT, + exports.STATUSES.NETWORK_CONNECT_TIMEOUT, ]; -exports.METHOD_MAP = utils_1.enumToMap(METHODS); -exports.H_METHOD_MAP = {}; -Object.keys(exports.METHOD_MAP).forEach((key) => { - if (/^H/.test(key)) { - exports.H_METHOD_MAP[key] = exports.METHOD_MAP[key]; - } -}); -var FINISH; -(function (FINISH) { - FINISH[FINISH["SAFE"] = 0] = "SAFE"; - FINISH[FINISH["SAFE_WITH_CB"] = 1] = "SAFE_WITH_CB"; - FINISH[FINISH["UNSAFE"] = 2] = "UNSAFE"; -})(FINISH = exports.FINISH || (exports.FINISH = {})); exports.ALPHA = []; for (let i = 'A'.charCodeAt(0); i <= 'Z'.charCodeAt(0); i++) { // Upper case @@ -213,7 +437,7 @@ exports.USERINFO_CHARS = exports.ALPHANUM .concat(exports.MARK) .concat(['%', ';', ':', '&', '=', '+', '$', ',']); // TODO(indutny): use RFC -exports.STRICT_URL_CHAR = [ +exports.URL_CHAR = [ '!', '"', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/', ':', ';', '<', '=', '>', @@ -221,12 +445,6 @@ exports.STRICT_URL_CHAR = [ '`', '{', '|', '}', '~', ].concat(exports.ALPHANUM); -exports.URL_CHAR = exports.STRICT_URL_CHAR - .concat(['\t', '\f']); -// All characters with 0x80 bit set to 1 -for (let i = 0x80; i <= 0xff; i++) { - exports.URL_CHAR.push(i); -} exports.HEX = exports.NUM.concat(['a', 'b', 'c', 'd', 'e', 'f', 'A', 'B', 'C', 'D', 'E', 'F']); /* Tokens as defined by rfc 2616. Also lowercases them. * token = 1* @@ -235,13 +453,12 @@ exports.HEX = exports.NUM.concat(['a', 'b', 'c', 'd', 'e', 'f', 'A', 'B', 'C', ' * | "/" | "[" | "]" | "?" | "=" * | "{" | "}" | SP | HT */ -exports.STRICT_TOKEN = [ +exports.TOKEN = [ '!', '#', '$', '%', '&', '\'', '*', '+', '-', '.', '^', '_', '`', '|', '~', ].concat(exports.ALPHANUM); -exports.TOKEN = exports.STRICT_TOKEN.concat([' ']); /* * Verify that a char is a valid visible (printable) US-ASCII * character or %x80-FF @@ -254,25 +471,28 @@ for (let i = 32; i <= 255; i++) { } // ',' = \x44 exports.CONNECTION_TOKEN_CHARS = exports.HEADER_CHARS.filter((c) => c !== 44); +exports.QUOTED_STRING = ['\t', ' ']; +for (let i = 0x21; i <= 0xff; i++) { + if (i !== 0x22 && i !== 0x5c) { // All characters in ASCII except \ and " + exports.QUOTED_STRING.push(i); + } +} +exports.HTAB_SP_VCHAR_OBS_TEXT = ['\t', ' ']; +// VCHAR: https://tools.ietf.org/html/rfc5234#appendix-B.1 +for (let i = 0x21; i <= 0x7E; i++) { + exports.HTAB_SP_VCHAR_OBS_TEXT.push(i); +} +// OBS_TEXT: https://datatracker.ietf.org/doc/html/rfc9110#name-collected-abnf +for (let i = 0x80; i <= 0xff; i++) { + exports.HTAB_SP_VCHAR_OBS_TEXT.push(i); +} exports.MAJOR = exports.NUM_MAP; exports.MINOR = exports.MAJOR; -var HEADER_STATE; -(function (HEADER_STATE) { - HEADER_STATE[HEADER_STATE["GENERAL"] = 0] = "GENERAL"; - HEADER_STATE[HEADER_STATE["CONNECTION"] = 1] = "CONNECTION"; - HEADER_STATE[HEADER_STATE["CONTENT_LENGTH"] = 2] = "CONTENT_LENGTH"; - HEADER_STATE[HEADER_STATE["TRANSFER_ENCODING"] = 3] = "TRANSFER_ENCODING"; - HEADER_STATE[HEADER_STATE["UPGRADE"] = 4] = "UPGRADE"; - HEADER_STATE[HEADER_STATE["CONNECTION_KEEP_ALIVE"] = 5] = "CONNECTION_KEEP_ALIVE"; - HEADER_STATE[HEADER_STATE["CONNECTION_CLOSE"] = 6] = "CONNECTION_CLOSE"; - HEADER_STATE[HEADER_STATE["CONNECTION_UPGRADE"] = 7] = "CONNECTION_UPGRADE"; - HEADER_STATE[HEADER_STATE["TRANSFER_ENCODING_CHUNKED"] = 8] = "TRANSFER_ENCODING_CHUNKED"; -})(HEADER_STATE = exports.HEADER_STATE || (exports.HEADER_STATE = {})); exports.SPECIAL_HEADERS = { - 'connection': HEADER_STATE.CONNECTION, - 'content-length': HEADER_STATE.CONTENT_LENGTH, - 'proxy-connection': HEADER_STATE.CONNECTION, - 'transfer-encoding': HEADER_STATE.TRANSFER_ENCODING, - 'upgrade': HEADER_STATE.UPGRADE, + 'connection': exports.HEADER_STATE.CONNECTION, + 'content-length': exports.HEADER_STATE.CONTENT_LENGTH, + 'proxy-connection': exports.HEADER_STATE.CONNECTION, + 'transfer-encoding': exports.HEADER_STATE.TRANSFER_ENCODING, + 'upgrade': exports.HEADER_STATE.UPGRADE, }; //# sourceMappingURL=constants.js.map \ No newline at end of file diff --git a/deps/undici/src/lib/llhttp/constants.js.map b/deps/undici/src/lib/llhttp/constants.js.map new file mode 100644 index 00000000000000..8373fd699eb791 --- /dev/null +++ b/deps/undici/src/lib/llhttp/constants.js.map @@ -0,0 +1 @@ +{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/llhttp/constants.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/deps/undici/src/lib/llhttp/llhttp-wasm.js b/deps/undici/src/lib/llhttp/llhttp-wasm.js index 8ac8481930c2d5..8a7fd760ca19ee 100644 --- a/deps/undici/src/lib/llhttp/llhttp-wasm.js +++ b/deps/undici/src/lib/llhttp/llhttp-wasm.js @@ -2,4 +2,14 @@ const { Buffer } = require('node:buffer') -module.exports = Buffer.from('AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAX8AYAJ/fwBgBH9/f38Bf2AAAGADf39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQAEA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAAy0sBQYAAAIAAAAAAAACAQIAAgICAAADAAAAAAMDAwMBAQEBAQEBAQEAAAIAAAAEBQFwARISBQMBAAIGCAF/AUGA1AQLB9EFIgZtZW1vcnkCAAtfaW5pdGlhbGl6ZQAIGV9faW5kaXJlY3RfZnVuY3Rpb25fdGFibGUBAAtsbGh0dHBfaW5pdAAJGGxsaHR0cF9zaG91bGRfa2VlcF9hbGl2ZQAvDGxsaHR0cF9hbGxvYwALBm1hbGxvYwAxC2xsaHR0cF9mcmVlAAwEZnJlZQAMD2xsaHR0cF9nZXRfdHlwZQANFWxsaHR0cF9nZXRfaHR0cF9tYWpvcgAOFWxsaHR0cF9nZXRfaHR0cF9taW5vcgAPEWxsaHR0cF9nZXRfbWV0aG9kABAWbGxodHRwX2dldF9zdGF0dXNfY29kZQAREmxsaHR0cF9nZXRfdXBncmFkZQASDGxsaHR0cF9yZXNldAATDmxsaHR0cF9leGVjdXRlABQUbGxodHRwX3NldHRpbmdzX2luaXQAFQ1sbGh0dHBfZmluaXNoABYMbGxodHRwX3BhdXNlABcNbGxodHRwX3Jlc3VtZQAYG2xsaHR0cF9yZXN1bWVfYWZ0ZXJfdXBncmFkZQAZEGxsaHR0cF9nZXRfZXJybm8AGhdsbGh0dHBfZ2V0X2Vycm9yX3JlYXNvbgAbF2xsaHR0cF9zZXRfZXJyb3JfcmVhc29uABwUbGxodHRwX2dldF9lcnJvcl9wb3MAHRFsbGh0dHBfZXJybm9fbmFtZQAeEmxsaHR0cF9tZXRob2RfbmFtZQAfEmxsaHR0cF9zdGF0dXNfbmFtZQAgGmxsaHR0cF9zZXRfbGVu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PgtBhwEMPQtBiAEMPAtBiQEMOwtBigEMOgtBiwEMOQtBjAEMOAtBjQEMNwtBjgEMNgtBjwEMNQtBkAEMNAtBkQEMMwtBkgEMMgtBkwEMMQtBlAEMMAtBlQEMLwtBlgEMLgtBlwEMLQtBmAEMLAtBmQEMKwtBmgEMKgtBmwEMKQtBnAEMKAtBnQEMJwtBngEMJgtBnwEMJQtBoAEMJAtBoQEMIwtBogEMIgtBowEMIQtBpAEMIAtBpQEMHwtBpgEMHgtBpwEMHQtBqAEMHAtBqQEMGwtBqgEMGgtBqwEMGQtBrAEMGAtBrQEMFwtBrgEMFgtBAQwVC0GvAQwUC0GwAQwTC0GxAQwSC0GzAQwRC0GyAQwQC0G0AQwPC0G1AQwOC0G2AQwNC0G3AQwMC0G4AQwLC0G5AQwKC0G6AQwJC0G7AQwIC0HGAQwHC0G8AQwGC0G9AQwFC0G+AQwEC0G/AQwDC0HAAQwCC0HCAQwBC0HBAQshAwNAAkACQAJAAkACQAJAAkACQAJAIAICfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAgJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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iQEhAwykAgtBASABLQAAQd8ARw1nGiABQQFqIQEMXgtBigEhAyABIARGDaICIAIoAgAiACAEIAFraiEFIAEgAGtBAWohBgNAIAEtAAAgAEGMzwBqLQAARw1kIABBAUYN+gEgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAMogILQYsBIQMgASAERg2hAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGOzwBqLQAARw1kIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyiAgsgAkEANgIAIAZBAWohAUECDGULQYwBIQMgASAERg2gAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHwzwBqLQAARw1jIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyhAgsgAkEANgIAIAZBAWohAUEfDGQLQY0BIQMgASAERg2fAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHyzwBqLQAARw1iIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAygAgsgAkEANgIAIAZBAWohAUEJDGMLIAEgBEYEQEGOASEDDJ8CCwJAAkAgAS0AAEHJAGsOBwBiYmJiYgFiCyABQQFqIQFB+AAhAwyGAgsgAUEBaiEBQfkAIQMMhQILQY8BIQMgASAERg2dAiACKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEGRzwBqLQAARw1gIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyeAgsgAkEANgIAIAZBAWohAUEYDGELQZABIQMgASAERg2cAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGXzwBqLQAARw1fIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAydAgsgAkEANgIAIAZBAWohAUEXDGALQZEBIQMgASAERg2bAiACKAIAIgAgBCABa2ohBSABIABrQQZqIQYCQANAIAEtAAAgAEGazwBqLQAARw1eIABBBkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAycAgsgAkEANgIAIAZBAWohAUEV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JSIARQ0RIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMtAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0gIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMswELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0iIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMsgELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0OIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMsQELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0dIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMsAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0fIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMrwELIABBP0cNASABQQFqCyEBQQUhAwyUAQtBACEDIAJBADYCHCACIAE2AhQgAkH9EjYCECACQQc2AgwMrAELIAJBADYCHCACIAE2AhQgAkHcCDYCECACQQc2AgxBACEDDKsBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNByACQeUANgIcIAIgATYCFCACIAA2AgxBACEDDKoBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNFiACQdMANgIcIAIgATYCFCACIAA2AgxBACEDDKkBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNGCACQdIANgIcIAIgATYCFCACIAA2AgxBACEDDKgBCyACQQA2AhwgAiABNgIUIAJBxgo2AhAgAkEHNgIMQQAhAwynAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQMgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwymAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRIgAkHTADYCHCACIAE2AhQgAiAANgIMQQAhAwylAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRQgAkHSADYCHCACIAE2AhQgAiAANgIMQQAhAwykAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQAgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwyjAQtB1QAhAwyJAQsgAEEVRwRAIAJBADYCHCACIAE2AhQgAkG5DTYCECACQRo2AgxB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AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABB5ABrDvQDY2IAAWFhYWFhYQIDBAVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhBgcICQoLDA0OD2FhYWFhEGFhYWFhYWFhYWFhEWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYRITFBUWFxgZGhthYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2YTc4OTphYWFhYWFhYTthYWE8YWFhYT0+P2FhYWFhYWFhQGFhQWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYUJDREVGR0hJSktMTU5PUFFSU2FhYWFhYWFhVFVWV1hZWlthXF1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFeYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhX2BhC0HhJw8LQaQhDwtByywPC0H+MQ8LQcAkDwtBqyQPC0GNKA8LQeImDwtBgDAPC0G5Lw8LQdckDwtB7x8PC0HhHw8LQfofDwtB8iAPC0GoLw8LQa4yDwtBiDAPC0HsJw8LQYIiDwtBjh0PC0HQLg8LQcojDwtBxTIPC0HfHA8LQdIcDwtBxCAPC0HXIA8LQaIfDwtB7S4PC0GrMA8LQdQlDwtBzC4PC0H6Lg8LQfwrDwtB0jAPC0HxHQ8LQbsgDwtB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CABB3AgLii1JbnZhbGlkIGNoYXIgaW4gdXJsIHF1ZXJ5AFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fYm9keQBDb250ZW50LUxlbmd0aCBvdmVyZmxvdwBDaHVuayBzaXplIG92ZXJmbG93AFJlc3BvbnNlIG92ZXJmbG93AEludmFsaWQgbWV0aG9kIGZvciBIVFRQL3gueCByZXF1ZXN0AEludmFsaWQgbWV0aG9kIGZvciBSVFNQL3gueCByZXF1ZXN0AEV4cGVjdGVkIFNPVVJDRSBtZXRob2QgZm9yIElDRS94LnggcmVxdWVzdABJbnZhbGlkIGNoYXIgaW4gdXJsIGZyYWdtZW50IHN0YXJ0AEV4cGVjdGVkIGRvdABTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3N0YXR1cwBJbnZhbGlkIHJlc3BvbnNlIHN0YXR1cwBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zAFVzZXIgY2FsbGJhY2sgZXJyb3IAYG9uX3Jlc2V0YCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfaGVhZGVyYCBjYWxsYmFjayBlcnJvcgBgb25fbWVzc2FnZV9iZWdpbmAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3N0YXR1c19jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3ZlcnNpb25fY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl91cmxfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2hlYWRlcl92YWx1ZV9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX21lc3NhZ2VfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXRob2RfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfZmllbGRfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fbmFtZWAgY2FsbGJhY2sgZXJyb3IAVW5leHBlY3RlZCBjaGFyIGluIHVybCBzZXJ2ZXIASW52YWxpZCBoZWFkZXIgdmFsdWUgY2hhcgBJbnZhbGlkIGhlYWRlciBmaWVsZCBjaGFyAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fdmVyc2lvbgBJbnZhbGlkIG1pbm9yIHZlcnNpb24ASW52YWxpZCBtYWpvciB2ZXJzaW9uAEV4cGVjdGVkIHNwYWNlIGFmdGVyIHZlcnNpb24ARXhwZWN0ZWQgQ1JMRiBhZnRlciB2ZXJzaW9uAEludmFsaWQgSFRUUCB2ZXJzaW9uAEludmFsaWQgaGVhZGVyIHRva2VuAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fdXJsAEludmFsaWQgY2hhcmFjdGVycyBpbiB1cmwAVW5leHBlY3RlZCBzdGFydCBjaGFyIGluIHVybABEb3VibGUgQCBpbiB1cmwARW1wdHkgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyYWN0ZXIgaW4gQ29udGVudC1MZW5ndGgARHVwbGljYXRlIENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhciBpbiB1cmwgcGF0aABDb250ZW50LUxlbmd0aCBjYW4ndCBiZSBwcmVzZW50IHdpdGggVHJhbnNmZXItRW5jb2RpbmcASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgc2l6ZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2hlYWRlcl92YWx1ZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgTEYgYWZ0ZXIgaGVhZGVyIHZhbHVlAEludmFsaWQgYFRyYW5zZmVyLUVuY29kaW5nYCBoZWFkZXIgdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZSB2YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHF1b3RlZCB2YWx1ZQBQYXVzZWQgYnkgb25faGVhZGVyc19jb21wbGV0ZQBJbnZhbGlkIEVPRiBzdGF0ZQBvbl9yZXNldCBwYXVzZQBvbl9jaHVua19oZWFkZXIgcGF1c2UAb25fbWVzc2FnZV9iZWdpbiBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fdmFsdWUgcGF1c2UAb25fc3RhdHVzX2NvbXBsZXRlIHBhdXNlAG9uX3ZlcnNpb25fY29tcGxldGUgcGF1c2UAb25fdXJsX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl92YWx1ZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXNzYWdlX2NvbXBsZXRlIHBhdXNlAG9uX21ldGhvZF9jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfZmllbGRfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX25hbWUgcGF1c2UAVW5leHBlY3RlZCBzcGFjZSBhZnRlciBzdGFydCBsaW5lAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX25hbWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBuYW1lAFBhdXNlIG9uIENPTk5FQ1QvVXBncmFkZQBQYXVzZSBvbiBQUkkvVXBncmFkZQBFeHBlY3RlZCBIVFRQLzIgQ29ubmVjdGlvbiBQcmVmYWNlAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fbWV0aG9kAEV4cGVjdGVkIHNwYWNlIGFmdGVyIG1ldGhvZABTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2hlYWRlcl9maWVsZABQYXVzZWQASW52YWxpZCB3b3JkIGVuY291bnRlcmVkAEludmFsaWQgbWV0aG9kIGVuY291bnRlcmVkAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2NoZW1hAFJlcXVlc3QgaGFzIGludmFsaWQgYFRyYW5zZmVyLUVuY29kaW5nYABTV0lUQ0hfUFJPWFkAVVNFX1BST1hZAE1LQUNUSVZJVFkAVU5QUk9DRVNTQUJMRV9FTlRJVFkAQ09QWQBNT1ZFRF9QRVJNQU5FTlRMWQBUT09fRUFSTFkATk9USUZZAEZBSUxFRF9ERVBFTkRFTkNZAEJBRF9HQVRFV0FZAFBMQVkAUFVUAENIRUNLT1VUAEdBVEVXQVlfVElNRU9VVABSRVFVRVNUX1RJTUVPVVQATkVUV09SS19DT05ORUNUX1RJTUVPVVQAQ09OTkVDVElPTl9USU1FT1VUAExPR0lOX1RJTUVPVVQATkVUV09SS19SRUFEX1RJTUVPVVQAUE9TVABNSVNESVJFQ1RFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX0xPQURfQkFMQU5DRURfUkVRVUVTVABCQURfUkVRVUVTVABIVFRQX1JFUVVFU1RfU0VOVF9UT19IVFRQU19QT1JUAFJFUE9SVABJTV9BX1RFQVBPVABSRVNFVF9DT05URU5UAE5PX0NPTlRFTlQAUEFSVElBTF9DT05URU5UAEhQRV9JTlZBTElEX0NPTlNUQU5UAEhQRV9DQl9SRVNFVABHRVQASFBFX1NUUklDVABDT05GTElDVABURU1QT1JBUllfUkVESVJFQ1QAUEVSTUFORU5UX1JFRElSRUNUAENPTk5FQ1QATVVMVElfU1RBVFVTAEhQRV9JTlZBTElEX1NUQVRVUwBUT09fTUFOWV9SRVFVRVNUUwBFQVJMWV9ISU5UUwBVTkFWQUlMQUJMRV9GT1JfTEVHQUxfUkVBU09OUwBPUFRJT05TAFNXSVRDSElOR19QUk9UT0NPTFMAVkFSSUFOVF9BTFNPX05FR09USUFURVMATVVMVElQTEVfQ0hPSUNFUwBJTlRFUk5BTF9TRVJWRVJfRVJST1IAV0VCX1NFUlZFUl9VTktOT1dOX0VSUk9SAFJBSUxHVU5fRVJST1IASURFTlRJVFlfUFJPVklERVJfQVVUSEVOVElDQVRJT05fRVJST1IAU1NMX0NFUlRJRklDQVRFX0VSUk9SAElOVkFMSURfWF9GT1JXQVJERURfRk9SAFNFVF9QQVJBTUVURVIAR0VUX1BBUkFNRVRFUgBIUEVfVVNFUgBTRUVfT1RIRVIASFBFX0NCX0NIVU5LX0hFQURFUgBNS0NBTEVOREFSAFNFVFVQAFdFQl9TRVJWRVJfSVNfRE9XTgBURUFSRE9XTgBIUEVfQ0xPU0VEX0NPTk5FQ1RJT04ASEVVUklTVElDX0VYUElSQVRJT04ARElTQ09OTkVDVEVEX09QRVJBVElPTgBOT05fQVVUSE9SSVRBVElWRV9JTkZPUk1BVElPTgBIUEVfSU5WQUxJRF9WRVJTSU9OAEhQRV9DQl9NRVNTQUdFX0JFR0lOAFNJVEVfSVNfRlJPWkVOAEhQRV9JTlZBTElEX0hFQURFUl9UT0tFTgBJTlZBTElEX1RPS0VOAEZPUkJJRERFTgBFTkhBTkNFX1lPVVJfQ0FMTQBIUEVfSU5WQUxJRF9VUkwAQkxPQ0tFRF9CWV9QQVJFTlRBTF9DT05UUk9MAE1LQ09MAEFDTABIUEVfSU5URVJOQUwAUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRV9VTk9GRklDSUFMAEhQRV9PSwBVTkxJTksAVU5MT0NLAFBSSQBSRVRSWV9XSVRIAEhQRV9JTlZBTElEX0NPTlRFTlRfTEVOR1RIAEhQRV9VTkVYUEVDVEVEX0NPTlRFTlRfTEVOR1RIAEZMVVNIAFBST1BQQVRDSABNLVNFQVJDSABVUklfVE9PX0xPTkcAUFJPQ0VTU0lORwBNSVNDRUxMQU5FT1VTX1BFUlNJU1RFTlRfV0FSTklORwBNSVNDRUxMQU5FT1VTX1dBUk5JTkcASFBFX0lOVkFMSURfVFJBTlNGRVJfRU5DT0RJTkcARXhwZWN0ZWQgQ1JMRgBIUEVfSU5WQUxJRF9DSFVOS19TSVpFAE1PVkUAQ09OVElOVUUASFBFX0NCX1NUQVRVU19DT01QTEVURQBIUEVfQ0JfSEVBREVSU19DT01QTEVURQBIUEVfQ0JfVkVSU0lPTl9DT01QTEVURQBIUEVfQ0JfVVJMX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19DT01QTEVURQBIUEVfQ0JfSEVBREVSX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9OQU1FX0NPTVBMRVRFAEhQRV9DQl9NRVNTQUdFX0NPTVBMRVRFAEhQRV9DQl9NRVRIT0RfQ09NUExFVEUASFBFX0NCX0hFQURFUl9GSUVMRF9DT01QTEVURQBERUxFVEUASFBFX0lOVkFMSURfRU9GX1NUQVRFAElOVkFMSURfU1NMX0NFUlRJRklDQVRFAFBBVVNFAE5PX1JFU1BPTlNFAFVOU1VQUE9SVEVEX01FRElBX1RZUEUAR09ORQBOT1RfQUNDRVBUQUJMRQBTRVJWSUNFX1VOQVZBSUxBQkxFAFJBTkdFX05PVF9TQVRJU0ZJQUJMRQBPUklHSU5fSVNfVU5SRUFDSEFCTEUAUkVTUE9OU0VfSVNfU1RBTEUAUFVSR0UATUVSR0UAUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRQBSRVFVRVNUX0hFQURFUl9UT09fTEFSR0UAUEFZTE9BRF9UT09fTEFSR0UASU5TVUZGSUNJRU5UX1NUT1JBR0UASFBFX1BBVVNFRF9VUEdSQURFAEhQRV9QQVVTRURfSDJfVVBHUkFERQBTT1VSQ0UAQU5OT1VOQ0UAVFJBQ0UASFBFX1VORVhQRUNURURfU1BBQ0UAREVTQ1JJQkUAVU5TVUJTQ1JJQkUAUkVDT1JEAEhQRV9JTlZBTElEX01FVEhPRABOT1RfRk9VTkQAUFJPUEZJTkQAVU5CSU5EAFJFQklORABVTkFVVEhPUklaRUQATUVUSE9EX05PVF9BTExPV0VEAEhUVFBfVkVSU0lPTl9OT1RfU1VQUE9SVEVEAEFMUkVBRFlfUkVQT1JURUQAQUNDRVBURUQATk9UX0lNUExFTUVOVEVEAExPT1BfREVURUNURUQASFBFX0NSX0VYUEVDVEVEAEhQRV9MRl9FWFBFQ1RFRABDUkVBVEVEAElNX1VTRUQASFBFX1BBVVNFRABUSU1FT1VUX09DQ1VSRUQAUEFZTUVOVF9SRVFVSVJFRABQUkVDT05ESVRJT05fUkVRVUlSRUQAUFJPWFlfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATkVUV09SS19BVVRIRU5USUNBVElPTl9SRVFVSVJFRABMRU5HVEhfUkVRVUlSRUQAU1NMX0NFUlRJRklDQVRFX1JFUVVJUkVEAFVQR1JBREVfUkVRVUlSRUQAUEFHRV9FWFBJUkVEAFBSRUNPTkRJVElPTl9GQUlMRUQARVhQRUNUQVRJT05fRkFJTEVEAFJFVkFMSURBVElPTl9GQUlMRUQAU1NMX0hBTkRTSEFLRV9GQUlMRUQATE9DS0VEAFRSQU5TRk9STUFUSU9OX0FQUExJRUQATk9UX01PRElGSUVEAE5PVF9FWFRFTkRFRABCQU5EV0lEVEhfTElNSVRfRVhDRUVERUQAU0lURV9JU19PVkVSTE9BREVEAEhFQUQARXhwZWN0ZWQgSFRUUC8AAF4TAAAmEwAAMBAAAPAXAACdEwAAFRIAADkXAADwEgAAChAAAHUSAACtEgAAghMAAE8UAAB/EAAAoBUAACMUAACJEgAAixQAAE0VAADUEQAAzxQAABAYAADJFgAA3BYAAMERAADgFwAAuxQAAHQUAAB8FQAA5RQAAAgXAAAfEAAAZRUAAKMUAAAoFQAAAhUAAJkVAAAsEAAAixkAAE8PAADUDgAAahAAAM4QAAACFwAAiQ4AAG4TAAAcEwAAZhQAAFYXAADBEwAAzRMAAGwTAABoFwAAZhcAAF8XAAAiEwAAzg8AAGkOAADYDgAAYxYAAMsTAACqDgAAKBcAACYXAADFEwAAXRYAAOgRAABnEwAAZRMAAPIWAABzEwAAHRcAAPkWAADzEQAAzw4AAM4VAAAMEgAAsxEAAKURAABhEAAAMhcAALsTAEH5NQsBAQBBkDYL4AEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB/TcLAQEAQZE4C14CAwICAgICAAACAgACAgACAgICAgICAgICAAQAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgACAEH9OQsBAQBBkToLXgIAAgICAgIAAAICAAICAAICAgICAgICAgIAAwAEAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAQfA7Cw1sb3NlZWVwLWFsaXZlAEGJPAsBAQBBoDwL4AEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBBiT4LAQEAQaA+C+cBAQEBAQEBAQEBAQEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFjaHVua2VkAEGwwAALXwEBAAEBAQEBAAABAQABAQABAQEBAQEBAQEBAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAEGQwgALIWVjdGlvbmVudC1sZW5ndGhvbnJveHktY29ubmVjdGlvbgBBwMIACy1yYW5zZmVyLWVuY29kaW5ncGdyYWRlDQoNCg0KU00NCg0KVFRQL0NFL1RTUC8AQfnCAAsFAQIAAQMAQZDDAAvgAQQBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAEH5xAALBQECAAEDAEGQxQAL4AEEAQEFAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB+cYACwQBAAABAEGRxwAL3wEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAEH6yAALBAEAAAIAQZDJAAtfAwQAAAQEBAQEBAQEBAQEBQQEBAQEBAQEBAQEBAAEAAYHBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQAQfrKAAsEAQAAAQBBkMsACwEBAEGqywALQQIAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAEH6zAALBAEAAAEAQZDNAAsBAQBBms0ACwYCAAAAAAIAQbHNAAs6AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBB8M4AC5YBTk9VTkNFRUNLT1VUTkVDVEVURUNSSUJFTFVTSEVURUFEU0VBUkNIUkdFQ1RJVklUWUxFTkRBUlZFT1RJRllQVElPTlNDSFNFQVlTVEFUQ0hHRU9SRElSRUNUT1JUUkNIUEFSQU1FVEVSVVJDRUJTQ1JJQkVBUkRPV05BQ0VJTkROS0NLVUJTQ1JJQkVIVFRQL0FEVFAv', 'base64') +const wasmBase64 = 'AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAn9/AGABfwBgBH9/f38Bf2AAAGADf39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQAEA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAAzQzBQYAAAMAAAAAAAADAQMAAwMDAAACAAAAAAICAgICAgICAgIBAQEBAQEBAQEDAAADAAAABAUBcAESEgUDAQACBggBfwFBgNgECwfFBygGbWVtb3J5AgALX2luaXRpYWxpemUACBlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALbGxodHRwX2luaXQACRhsbGh0dHBfc2hvdWxkX2tlZXBfYWxpdmUANgxsbGh0dHBfYWxsb2MACwZtYWxsb2MAOAtsbGh0dHBfZnJlZQAMBGZyZWUADA9sbGh0dHBfZ2V0X3R5cGUADRVsbGh0dHBfZ2V0X2h0dHBfbWFqb3IADhVsbGh0dHBfZ2V0X2h0dHBfbWlub3IADxFsbGh0dHBfZ2V0X21ldGhvZAAQFmxsaHR0cF9nZXRfc3RhdHVzX2NvZGUAERJsbGh0dHBfZ2V0X3VwZ3JhZGUAEgxsbGh0dHBfcmVzZXQAEw5sbGh0dHBfZXhlY3V0ZQAUFGxsaHR0cF9zZXR0aW5nc19pbml0ABUNbGxodHRwX2ZpbmlzaAAWDGxsaHR0cF9wYXVzZQAXDWxsaHR0cF9yZXN1bWUAGBtsbGh0dHBfcmVzdW1lX2FmdGVyX3VwZ3JhZGUAGRBsbGh0dHBfZ2V0X2Vycm5vABoXbGxodHRwX2dldF9lcnJvcl9yZWFzb24AGxdsbGh0dHBfc2V0X2Vycm9yX3JlYXNvbgAcFGxsaHR0cF9nZXRfZXJyb3JfcG9zAB0RbGxodHRwX2Vycm5vX25hbWUAHhJsbGh0dHBfbWV0aG9kX25hbWUAHxJsbGh0dHBfc3RhdHVzX25hbWUAIBpsbGh0dHBfc2V0X2xlbmllbnRfaGVhZGVycwAhIWxsaHR0cF9zZXRfbGVuaWVudF9jaHVua2VkX2xlbmd0aAAiHWxsaHR0cF9zZXRfbGVuaWVudF9rZWVwX2FsaXZlACMkbGxodHRwX3NldF9sZW5pZW50X3RyYW5zZmVyX2VuY29kaW5nACQabGxodHRwX3NldF9sZW5pZW50X3ZlcnNpb24AJSNsbGh0dHBfc2V0X2xlbmllbnRfZGF0YV9hZnRlcl9jbG9zZQAmJ2xsaHR0cF9zZXRfbGVuaWVudF9vcHRpb25hbF9sZl9hZnRlcl9jcgAnLGxsaHR0cF9zZXRfbGVuaWVudF9vcHRpb25hbF9jcmxmX2FmdGVyX2NodW5rACgobGxodHRwX3NldF9sZW5pZW50X29wdGlvbmFsX2NyX2JlZm9yZV9sZgApKmxsaHR0cF9zZXRfbGVuaWVudF9zcGFjZXNfYWZ0ZXJfY2h1bmtfc2l6ZQAqGGxsaHR0cF9tZXNzYWdlX25lZWRzX2VvZgA1CRcBAEEBCxEBAgMEBQoGBzEzMi0uLCsvMAq8ywIzFgBB/NMAKAIABEAAC0H80wBBATYCAAsUACAAEDcgACACNgI4IAAgAToAKAsUACAAIAAvATQgAC0AMCAAEDYQAAseAQF/QcAAEDkiARA3IAFBgAg2AjggASAAOgAoIAELjwwBB38CQCAARQ0AIABBCGsiASAAQQRrKAIAIgBBeHEiBGohBQJAIABBAXENACAAQQNxRQ0BIAEgASgCACIAayIBQZDUACgCAEkNASAAIARqIQQCQAJAQZTUACgCACABRwRAIABB/wFNBEAgAEEDdiEDIAEoAggiACABKAIMIgJGBEBBgNQAQYDUACgCAEF+IAN3cTYCAAwFCyACIAA2AgggACACNgIMDAQLIAEoAhghBiABIAEoAgwiAEcEQCAAIAEoAggiAjYCCCACIAA2AgwMAwsgAUEUaiIDKAIAIgJFBEAgASgCECICRQ0CIAFBEGohAwsDQCADIQcgAiIAQRRqIgMoAgAiAg0AIABBEGohAyAAKAIQIgINAAsgB0EANgIADAILIAUoAgQiAEEDcUEDRw0CIAUgAEF+cTYCBEGI1AAgBDYCACAFIAQ2AgAgASAEQQFyNgIEDAMLQQAhAAsgBkUNAAJAIAEoAhwiAkECdEGw1gBqIgMoAgAgAUYEQCADIAA2AgAgAA0BQYTUAEGE1AAoAgBBfiACd3E2AgAMAgsgBkEQQRQgBigCECABRhtqIAA2AgAgAEUNAQsgACAGNgIYIAEoAhAiAgRAIAAgAjYCECACIAA2AhgLIAFBFGooAgAiAkUNACAAQRRqIAI2AgAgAiAANgIYCyABIAVPDQAgBSgCBCIAQQFxRQ0AAkACQAJAAkAgAEECcUUEQEGY1AAoAgAgBUYEQEGY1AAgATYCAEGM1ABBjNQAKAIAIARqIgA2AgAgASAAQQFyNgIEIAFBlNQAKAIARw0GQYjUAEEANgIAQZTUAEEANgIADAYLQZTUACgCACAFRgRAQZTUACABNgIAQYjUAEGI1AAoAgAgBGoiADYCACABIABBAXI2AgQgACABaiAANgIADAYLIABBeHEgBGohBCAAQf8BTQRAIABBA3YhAyAFKAIIIgAgBSgCDCICRgRAQYDUAEGA1AAoAgBBfiADd3E2AgAMBQsgAiAANgIIIAAgAjYCDAwECyAFKAIYIQYgBSAFKAIMIgBHBEBBkNQAKAIAGiAAIAUoAggiAjYCCCACIAA2AgwMAwsgBUEUaiIDKAIAIgJFBEAgBSgCECICRQ0CIAVBEGohAwsDQCADIQcgAiIAQRRqIgMoAgAiAg0AIABBEGohAyAAKAIQIgINAAsgB0EANgIADAILIAUgAEF+cTYCBCABIARqIAQ2AgAgASAEQQFyNgIEDAMLQQAhAAsgBkUNAAJAIAUoAhwiAkECdEGw1gBqIgMoAgAgBUYEQCADIAA2AgAgAA0BQYTUAEGE1AAoAgBBfiACd3E2AgAMAgsgBkEQQRQgBigCECAFRhtqIAA2AgAgAEUNAQsgACAGNgIYIAUoAhAiAgRAIAAgAjYCECACIAA2AhgLIAVBFGooAgAiAkUNACAAQRRqIAI2AgAgAiAANgIYCyABIARqIAQ2AgAgASAEQQFyNgIEIAFBlNQAKAIARw0AQYjUACAENgIADAELIARB/wFNBEAgBEF4cUGo1ABqIQACf0GA1AAoAgAiAkEBIARBA3Z0IgNxRQRAQYDUACACIANyNgIAIAAMAQsgACgCCAsiAiABNgIMIAAgATYCCCABIAA2AgwgASACNgIIDAELQR8hAiAEQf///wdNBEAgBEEmIARBCHZnIgBrdkEBcSAAQQF0a0E+aiECCyABIAI2AhwgAUIANwIQIAJBAnRBsNYAaiEAAkBBhNQAKAIAIgNBASACdCIHcUUEQCAAIAE2AgBBhNQAIAMgB3I2AgAgASAANgIYIAEgATYCCCABIAE2AgwMAQsgBEEZIAJBAXZrQQAgAkEfRxt0IQIgACgCACEAAkADQCAAIgMoAgRBeHEgBEYNASACQR12IQAgAkEBdCECIAMgAEEEcWpBEGoiBygCACIADQALIAcgATYCACABIAM2AhggASABNgIMIAEgATYCCAwBCyADKAIIIgAgATYCDCADIAE2AgggAUEANgIYIAEgAzYCDCABIAA2AggLQaDUAEGg1AAoAgBBAWsiAEF/IAAbNgIACwsHACAALQAoCwcAIAAtACoLBwAgAC0AKwsHACAALQApCwcAIAAvATQLBwAgAC0AMAtAAQR/IAAoAhghASAALwEuIQIgAC0AKCEDIAAoAjghBCAAEDcgACAENgI4IAAgAzoAKCAAIAI7AS4gACABNgIYC8X4AQIHfwN+IAEgAmohBAJAIAAiAygCDCIADQAgAygCBARAIAMgATYCBAsjAEEQayIJJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAygCHCICQQFrDuwB7gEB6AECAwQFBgcICQoLDA0ODxAREucBE+YBFBXlARYX5AEYGRobHB0eHyDvAe0BIeMBIiMkJSYnKCkqK+IBLC0uLzAxMuEB4AEzNN8B3gE1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk/pAVBRUlPdAdwBVNsBVdoBVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gAGBAYIBgwGEAYUBhgGHAYgBiQGKAYsBjAGNAY4BjwGQAZEBkgGTAZQBlQGWAZcBmAGZAZoBmwGcAZ0BngGfAaABoQGiAaMBpAGlAaYBpwGoAakBqgGrAawBrQGuAa8BsAGxAbIBswG0AbUBtgG3AbgBuQG6AbsBvAG9Ab4BvwHAAcEBwgHDAcQBxQHZAdgBxgHXAccB1gHIAckBygHLAcwBzQHOAc8B0AHRAdIB0wHUAQDqAQtBAAzUAQtBDgzTAQtBDQzSAQtBDwzRAQtBEAzQAQtBEQzPAQtBEgzOAQtBEwzNAQtBFAzMAQtBFQzLAQtBFgzKAQtBFwzJAQtBGAzIAQtBGQzHAQtBGgzGAQtBGwzFAQtBHAzEAQtBHQzDAQtBHgzCAQtBHwzBAQtBCAzAAQtBIAy/AQtBIgy+AQtBIQy9AQtBBwy8AQtBIwy7AQtBJAy6AQtBJQy5AQtBJgy4AQtBJwy3AQtBzgEMtgELQSgMtQELQSkMtAELQSoMswELQSsMsgELQc8BDLEBC0EtDLABC0EuDK8BC0EvDK4BC0EwDK0BC0ExDKwBC0EyDKsBC0EzDKoBC0HQAQypAQtBNAyoAQtBOAynAQtBDAymAQtBNQylAQtBNgykAQtBNwyjAQtBPQyiAQtBOQyhAQtB0QEMoAELQQsMnwELQT4MngELQToMnQELQQoMnAELQTsMmwELQTwMmgELQdIBDJkBC0HAAAyYAQtBPwyXAQtBwQAMlgELQQkMlQELQSwMlAELQcIADJMBC0HDAAySAQtBxAAMkQELQcUADJABC0HGAAyPAQtBxwAMjgELQcgADI0BC0HJAAyMAQtBygAMiwELQcsADIoBC0HMAAyJAQtBzQAMiAELQc4ADIcBC0HPAAyGAQtB0AAMhQELQdEADIQBC0HSAAyDAQtB1AAMggELQdMADIEBC0HVAAyAAQtB1gAMfwtB1wAMfgtB2AAMfQtB2QAMfAtB2gAMewtB2wAMegtB0wEMeQtB3AAMeAtB3QAMdwtBBgx2C0HeAAx1C0EFDHQLQd8ADHMLQQQMcgtB4AAMcQtB4QAMcAtB4gAMbwtB4wAMbgtBAwxtC0HkAAxsC0HlAAxrC0HmAAxqC0HoAAxpC0HnAAxoC0HpAAxnC0HqAAxmC0HrAAxlC0HsAAxkC0ECDGMLQe0ADGILQe4ADGELQe8ADGALQfAADF8LQfEADF4LQfIADF0LQfMADFwLQfQADFsLQfUADFoLQfYADFkLQfcADFgLQfgADFcLQfkADFYLQfoADFULQfsADFQLQfwADFMLQf0ADFILQf4ADFELQf8ADFALQYABDE8LQYEBDE4LQYIBDE0LQYMBDEwLQYQBDEsLQYUBDEoLQYYBDEkLQYcBDEgLQYgBDEcLQYkBDEYLQYoBDEULQYsBDEQLQYwBDEMLQY0BDEILQY4BDEELQY8BDEALQZABDD8LQZEBDD4LQZIBDD0LQZMBDDwLQZQBDDsLQZUBDDoLQZYBDDkLQZcBDDgLQZgBDDcLQZkBDDYLQZoBDDULQZsBDDQLQZwBDDMLQZ0BDDILQZ4BDDELQZ8BDDALQaABDC8LQaEBDC4LQaIBDC0LQaMBDCwLQaQBDCsLQaUBDCoLQaYBDCkLQacBDCgLQagBDCcLQakBDCYLQaoBDCULQasBDCQLQawBDCMLQa0BDCILQa4BDCELQa8BDCALQbABDB8LQbEBDB4LQbIBDB0LQbMBDBwLQbQBDBsLQbUBDBoLQbYBDBkLQbcBDBgLQbgBDBcLQQEMFgtBuQEMFQtBugEMFAtBuwEMEwtBvAEMEgtBvQEMEQtBvgEMEAtBvwEMDwtBwAEMDgtBwQEMDQtBwgEMDAtBwwEMCwtBxAEMCgtBxQEMCQtBxgEMCAtB1AEMBwtBxwEMBgtByAEMBQtByQEMBAtBygEMAwtBywEMAgtBzQEMAQtBzAELIQIDQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAMCfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAn8CQAJAAkACQAJAAkACQAJ/AkACQAJAAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAMCfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCACDtQBAAECAwQFBgcICQoLDA0ODxARFBUWFxgZGhscHR4fICEjJCUnKCmIA4cDhQOEA/wC9QLuAusC6ALmAuMC4ALfAt0C2wLWAtUC1ALTAtICygLJAsgCxwLGAsUCxALDAr0CvAK6ArkCuAK3ArYCtQK0ArICsQKsAqoCqAKnAqYCpQKkAqMCogKhAqACnwKbApoCmQKYApcCkAKIAoQCgwKCAvkB9gH1AfQB8wHyAfEB8AHvAe0B6wHoAeMB4QHgAd8B3gHdAdwB2wHaAdkB2AHX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QEBAQEBAQEBAQEBAAEALQQAhAiADQQA2AhwgA0G3CzYCECADQQI2AgwgAyABQQFqNgIUDIEDCyADQS9qIQIDQCABIARGBEBBISECDIIDCwJAAkACQCABLQAAIgBBCWsOGAIAKioBKioqKioqKioqKioqKioqKioqAigLIAFBAWohASADQS9qLQAAQQFxRQ0LDBkLIAFBAWohAQwYCyABQQFqIQEgAi0AAEECcQ0AC0EAIQIgA0EANgIcIAMgATYCFCADQc4UNgIQIANBDDYCDAyAAwsgAUEBaiEBC0EAIQACQCADKAI4IgJFDQAgAigCVCICRQ0AIAMgAhEAACEACyAADQEM0QILIANCADcDIAw8CyAAQRVGBEAgA0EkNgIcIAMgATYCFCADQYYaNgIQIANBFTYCDEEAIQIM/QILQQAhAiADQQA2AhwgAyABNgIUIANB4g02AhAgA0EUNgIMDPwCCyADKAIEIQBBACECIANBADYCBCADIAAgASAMp2oiARAxIgBFDSsgA0EHNgIcIAMgATYCFCADIAA2AgwM+wILIAMtAC5BwABxRQ0BC0EAIQACQCADKAI4IgJFDQAgAigCUCICRQ0AIAMgAhEAACEACyAARQ0rIABBFUYEQCADQQo2AhwgAyABNgIUIANB8Rg2AhAgA0EVNgIMQQAhAgz6AgtBACECIANBADYCHCADIAE2AhQgA0GLDDYCECADQRM2AgwM+QILQQAhAiADQQA2AhwgAyABNgIUIANBsRQ2AhAgA0ECNgIMDPgCC0EAIQIgA0EANgIcIAMgATYCFCADQYwUNgIQIANBGTYCDAz3AgtBACECIANBADYCHCADIAE2AhQgA0HRHDYCECADQRk2AgwM9gILIABBFUYNPUEAIQIgA0EANgIcIAMgATYCFCADQaIPNgIQIANBIjYCDAz1AgsgAygCBCEAQQAhAiADQQA2AgQgAyAAIAEQMiIARQ0oIANBDTYCHCADIAE2AhQgAyAANgIMDPQCCyAAQRVGDTpBACECIANBADYCHCADIAE2AhQgA0GiDzYCECADQSI2AgwM8wILIAMoAgQhAEEAIQIgA0EANgIEIAMgACABEDIiAEUEQCABQQFqIQEMKAsgA0EONgIcIAMgADYCDCADIAFBAWo2AhQM8gILIABBFUYNN0EAIQIgA0EANgIcIAMgATYCFCADQaIPNgIQIANBIjYCDAzxAgsgAygCBCEAQQAhAiADQQA2AgQgAyAAIAEQMiIARQRAIAFBAWohAQwnCyADQQ82AhwgAyAANgIMIAMgAUEBajYCFAzwAgtBACECIANBADYCHCADIAE2AhQgA0HoFjYCECADQRk2AgwM7wILIABBFUYNM0EAIQIgA0EANgIcIAMgATYCFCADQc4MNgIQIANBIzYCDAzuAgsgAygCBCEAQQAhAiADQQA2AgQgAyAAIAEQMyIARQ0lIANBETYCHCADIAE2AhQgAyAANgIMDO0CCyAAQRVGDTBBACECIANBADYCHCADIAE2AhQgA0HODDYCECADQSM2AgwM7AILIAMoAgQhAEEAIQIgA0EANgIEIAMgACABEDMiAEUEQCABQQFqIQEMJQsgA0ESNgIcIAMgADYCDCADIAFBAWo2AhQM6wILIANBL2otAABBAXFFDQELQRUhAgzPAgtBACECIANBADYCHCADIAE2AhQgA0HoFjYCECADQRk2AgwM6AILIABBO0cNACABQQFqIQEMDAtBACECIANBADYCHCADIAE2AhQgA0GYFzYCECADQQI2AgwM5gILIABBFUYNKEEAIQIgA0EANgIcIAMgATYCFCADQc4MNgIQIANBIzYCDAzlAgsgA0EUNgIcIAMgATYCFCADIAA2AgwM5AILIAMoAgQhAEEAIQIgA0EANgIEIAMgACABEDMiAEUEQCABQQFqIQEM3AILIANBFTYCHCADIAA2AgwgAyABQQFqNgIUDOMCCyADKAIEIQBBACECIANBADYCBCADIAAgARAzIgBFBEAgAUEBaiEBDNoCCyADQRc2AhwgAyAANgIMIAMgAUEBajYCFAziAgsgAEEVRg0jQQAhAiADQQA2AhwgAyABNgIUIANBzgw2AhAgA0EjNgIMDOECCyADKAIEIQBBACECIANBADYCBCADIAAgARAzIgBFBEAgAUEBaiEBDB0LIANBGTYCHCADIAA2AgwgAyABQQFqNgIUDOACCyADKAIEIQBBACECIANBADYCBCADIAAgARAzIgBFBEAgAUEBaiEBDNYCCyADQRo2AhwgAyAANgIMIAMgAUEBajYCFAzfAgsgAEEVRg0fQQAhAiADQQA2AhwgAyABNgIUIANBog82AhAgA0EiNgIMDN4CCyADKAIEIQBBACEC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DLMCCyABIARGBEBB6QEhAgyzAgsgAS0AAEHIAEYNASADQQE6ACgLQbYBIQIMlwILQcoBIQIMlgILIAEgBEcEQCADQQw2AgggAyABNgIEQckBIQIMlgILQegBIQIMrwILIAEgBEYEQEHnASECDK8CCyABLQAAQcgARw0EIAFBAWohAUHIASECDJQCCyABIARGBEBB5gEhAgyuAgsCQAJAIAEtAABBxQBrDhAABQUFBQUFBQUFBQUFBQUBBQsgAUEBaiEBQcYBIQIMlAILIAFBAWohAUHHASECDJMCC0HlASECIAEgBEYNrAIgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABB99MAai0AAEcNAyAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMrQILIAMoAgQhACADQgA3AwAgAyAAIAZBAWoiARAtIgBFBEBB1AEhAgyTAgsgA0HkATYCHCADIAE2AhQgAyAANgIMQQAhAgysAgtB4wEhAiABIARGDasCIAMoAgAiACAEIAFraiEFIAEgAGtBAWohBgJAA0AgAS0AACAAQfXTAGotAABHDQIgAEEBRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADKwCCyADQYEEOwEoIAMoAgQhACADQgA3AwAgAyAAIAZBAWoiARAtIgANAwwCCyADQQA2AgALQQAhAiADQQA2AhwgAyABNgIUIANB0B42AhAgA0EINgIMDKkCC0HFASECDI4CCyADQeIBNgIcIAMgATYCFCADIAA2AgxBACECDKcCC0EAIQACQCADKAI4IgJFDQAgAigCOCICRQ0AIAMgAhEAACEACyAARQ1lIABBFUcEQCADQQA2AhwgAyABNgIUIANB1A42AhAgA0EgNgIMQQAhAgynAgsgA0GFATYCHCADIAE2AhQgA0HXGjYCECADQRU2AgxBACECDKYCC0HhASECIAQgASIARg2lAiAEIAFrIAMoAgAiAWohBSAAIAFrQQRqIQYCQANAIAAtAAAgAUHw0wBqLQAARw0BIAFBBEYNAyABQQFqIQEgBCAAQQFqIgBHDQALIAMgBTYCAAymAgsgA0EANgIcIAMgADYCFCADQYQ3NgIQIANBCDYCDCADQQA2AgBBACECDKUCCyABIARHBEAgA0ENNgIIIAMgATYCBEHCASECDIsCC0HgASECDKQCCyADQQA2AgAgBkEBaiEBC0HDASECDIgCCyABIARGBEBB3wEhAgyiAgsgAS0AAEEwayIAQf8BcUEKSQRAIAMgADoAKiABQQFqIQFBwQEhAgyIAgsgAygCBCEAIANBADYCBCADIAAgARAuIgBFDYgCIANB3gE2AhwgAyABNgIUIAMgADYCDEEAIQIMoQILIAEgBEYEQEHdASECDKECCwJAIAEtAABBLkYEQCABQQFqIQEMAQsgAygCBCEAIANBADYCBCADIAAgARAuIgBFDYkCIANB3AE2AhwgAyABNgIUIAMgADYCDEEAIQIMoQILQcABIQIMhgILIAEgBEYEQEHbASECDKACC0EAIQBBASEFQQEhB0EAIQICQAJAAkACQAJAAn8CQAJAAkACQAJAAkACQCABLQAAQTBrDgoKCQABAgMEBQYICwtBAgwGC0EDDAULQQQMBAtBBQwDC0EGDAILQQcMAQtBCAshAkEAIQVBACEHDAILQQkhAkEBIQBBACEFQQAhBwwBC0EAIQVBASECCyADIAI6ACsgAUEBaiEBAkACQCADLQAuQRBxDQACQAJAAkAgAy0AKg4DAQACBAsgB0UNAwwCCyAADQEMAgsgBUUNAQsgAygCBCEAIANBADYCBCADIAAgARAuIgBFDQIgA0HYATYCHCADIAE2AhQgAyAANgIMQQAhAgyiAgsgAygCBCEAIANBADYCBCADIAAgARAuIgBFDYsCIANB2QE2AhwgAyABNgIUIAMgADYCDEEAIQIMoQILIAMoAgQhACADQQA2AgQgAyAAIAEQLiIARQ2JAiADQdoBNgIcIAMgATYCFCADIAA2AgwMoAILQb8BIQIMhQILQQAhAAJAIAMoAjgiAkUNACACKAI8IgJFDQAgAyACEQAAIQALAkAgAARAIABBFUYNASADQQA2AhwgAyABNgIUIANBnA02AhAgA0EhNgIMQQAhAgygAgtBvgEhAgyFAgsgA0HXATYCHCADIAE2AhQgA0HWGTYCECADQRU2AgxBACECDJ4CCyABIARGBEBB1wEhAgyeAgsCQCABLQAAQSBGBEAgA0EAOwE0IAFBAWohAQwBCyADQQA2AhwgAyABNgIUIANB6xA2AhAgA0EJNgIMQQAhAgyeAgtBvQEhAgyDAgsgASAERgRAQdYBIQIM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LgsgAUEBaiEBQZcBIQIM2AELIAFBAWohAUEiDCsLIAEgBEYEQEGvASECDPEBCyABLQAAQdAARw0rIAFBAWohAUGWASECDNYBCyABIARGBEBBrgEhAgzwAQsCQAJAIAEtAABBxgBrDgsALCwsLCwsLCwsASwLIAFBAWohAUGUASECDNYBCyABQQFqIQFBlQEhAgzVAQtBrQEhAiABIARGDe4BIAMoAgAiACAEIAFraiEFIAEgAGtBA2ohBgJAA0AgAS0AACAAQazTAGotAABHDSggAEEDRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADO8BCyADQQA2AgAgBkEBaiEBQQ0MKAtBrAEhAiABIARGDe0BIAMoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQeHTAGotAABHDScgAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADO4BCyADQQA2AgAgBkEBaiEBQQwMJwtBqwEhAiABIARGDewBIAMoAgAiACAEIAFraiEFIAEgAGtBAWohBgJAA0AgAS0AACAAQarTAGotAABHDSYgAEEBRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADO0BCyADQQA2AgAgBkEBaiEBQQMMJgtBqgEhAiABIARGDesBIAMoAgAiACAEIAFraiEFIAEgAGtBAWohBgJAA0AgAS0AACAAQajTAGotAABHDSUgAEEBRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADOwBCyADQQA2AgAgBkEBaiEBQSYMJQsgASAERgRAQakBIQIM6wELAkACQCABLQAAQdQAaw4CAAEnCyABQQFqIQFBjwEhAgzRAQsgAUEBaiEBQZABIQIM0AELQagBIQIgASAERg3pASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEGm0wBqLQAARw0jIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzqAQsgA0EANgIAIAZBAWohAUEnDCMLQacBIQIgASAERg3oASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEGk0wBqLQAARw0iIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzpAQsgA0EANgIAIAZBAWohAUEcDCILQaYBIQIgASAERg3nASADKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEGe0wBqLQAARw0hIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzoAQsgA0EANgIAIAZBAWohAUEGDCELQaUBIQIgASAERg3mASADKAIAIgAgBCABa2ohBSABIABrQQRqIQYCQANAIAEtAAAgAEGZ0wBqLQAARw0gIABBBEYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAznAQsgA0EANgIAIAZBAWohAUEZDCALIAEgBEYEQEGkASECDOYBCwJAAkACQAJAIAEtAABBLWsOIwAkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJAEkJCQkJAIkJCQDJAsgAUEBaiEBQYQBIQIMzgELIAFBAWohAUGFASECDM0BCyABQQFqIQFBigEhAgzMAQsgAUEBaiEBQYsBIQIMywELQaMBIQIgASAERg3kASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEGX0wBqLQAARw0eIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzlAQsgA0EANgIAIAZBAWohAUELDB4LIAEgBEYEQEGiASECDOQBCwJAAkAgAS0AAEHBAGsOAwAgASALIAFBAWohAUGGASECDMoBCyABQQFqIQFBiQEhAgzJAQsgASAERgRAQaEBIQIM4wELAkACQCABLQAAQcEAaw4PAB8fHx8fHx8fHx8fHx8BHwsgAUEBaiEBQYcBIQIMyQELIAFBAWohAUGIASECDMgBCyABIARGBEBBoAEhAgziAQsgAS0AAEHMAEcNHCABQQFqIQFBCgwbC0GfASECIAEgBEYN4AEgAygCACIAIAQgAWtqIQUgASAAa0EFaiEGAkADQCABLQAAIABBkdMAai0AAEcNGiAAQQVGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM4QELIANBADYCACAGQQFqIQFBHgwaC0GeASECIAEgBEYN3wEgAygCACIAIAQgAWtqIQUgASAAa0EGaiEGAkADQCABLQAAIABBitMAai0AAEcNGSAAQQZGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM4AELIANBADYCACAGQQFqIQFBFQwZC0GdASECIAEgBEYN3gEgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABBh9MAai0AAEcNGCAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM3wELIANBADYCACAGQQFqIQFBFwwYC0GcASECIAEgBEYN3QEgAygCACIAIAQgAWtqIQUgASAAa0EFaiEGAkADQCABLQAAIABBgdMAai0AAEcNFyAAQQVGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM3gELIANBADYCACAGQQFqIQFBGAwXCyABIARGBEBBmwEhAgzdAQsCQAJAIAEtAABByQBrDgcAGRkZGRkBGQsgAUEBaiEBQYEBIQIMwwELIAFBAWohAUGCASECDMIBC0GaASECIAEgBEYN2wEgAygCACIAIAQgAWtqIQUgASAAa0EBaiEGAkADQCABLQAAIABB5tMAai0AAEcNFSAAQQFGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM3AELIANBADYCACAGQQFqIQFBCQwVC0GZASECIAEgBEYN2gEgAygCACIAIAQgAWtqIQUgASAAa0EBaiEGAkADQCABLQAAIABB5NMAai0AAEcNFCAAQQFGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM2wELIANBADYCACAGQQFqIQFBHwwUC0GYASECIAEgBEYN2QEgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABB/tIAai0AAEcNEyAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM2gELIANBADYCACAGQQFqIQFBAgwTC0GXASECIAEgBEYN2AEgAygCACIAIAQgAWtqIQUgASAAa0EBaiEGA0AgAS0AACAAQfzSAGotAABHDREgAEEBRg0CIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADNgBCyABIARGBEBBlgEhAgzYAQtBASABLQAAQd8ARw0RGiABQQFqIQFB/QAhAgy9AQsgA0EANgIAIAZBAWohAUH+ACECDLwBC0GVASECIAEgBEYN1QEgAygCACIAIAQgAWtqIQUgASAAa0EIaiEGAkADQCABLQAAIABBxNMAai0AAEcNDyAAQQhGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM1gELIANBADYCACAGQQFqIQFBKQwPC0GUASECIAEgBEYN1AEgAygCACIAIAQgAWtqIQUgASAAa0EDaiEGAkADQCABLQAAIABB+NIAai0AAEcNDiAAQQNGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM1QELIANBADYCACAGQQFqIQFBLQwOCyABIARGBEBBkwEhAgzUAQsgAS0AAEHFAEcNDiABQQFqIQFB+gAhAgy5AQsgASAERgRAQZIBIQIM0wELAkACQCABLQAAQcwAaw4IAA8PDw8PDwEPCyABQQFqIQFB+AAhAgy5AQsgAUEBaiEBQfkAIQIMuAELQZEBIQIgASAERg3RASADKAIAIgAgBCABa2ohBSABIABrQQRqIQYCQANAIAEtAAAgAEHz0gBqLQAARw0LIABBBEYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzSAQsgA0EANgIAIAZBAWohAUEjDAsLQZABIQIgASAERg3QASADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEHw0gBqLQAARw0KIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzRAQsgA0EANgIAIAZBAWohAUEADAoLIAEgBEYEQEGPASECDNABCwJAAkAgAS0AAEHIAGsOCAAMDAwMDAwBDAsgAUEBaiEBQfMAIQIMtgELIAFBAWohAUH2ACECDLUBCyABIARGBEBBjgEhAgzPAQsCQAJAIAEtAABBzgBrDgMACwELCyABQQFqIQFB9AAhAgy1AQsgAUEBaiEBQfUAIQIMtAELIAEgBEYEQEGNASECDM4BCyABLQAAQdkARw0IIAFBAWohAUEIDAcLQYwBIQIgASAERg3MASADKAIAIgAgBCABa2ohBSABIABrQQNqIQYCQANAIAEtAAAgAEHs0gBqLQAARw0GIABBA0YNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzNAQsgA0EANgIAIAZBAWohAUEFDAYLQYsBIQIgASAERg3LASADKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEHm0gBqLQAARw0FIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzMAQsgA0EANgIAIAZBAWohAUEWDAULQYoBIQIgASAERg3KASADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEHh0wBqLQAARw0EIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzLAQsgA0EANgIAIAZBAWohAUEQDAQLIAEgBEYEQEGJASECDMoBCwJAAkAgAS0AAEHDAGsODAAGBgYGBgYGBgYGAQYLIAFBAWohAUHvACECDLABCyABQQFqIQFB8AAhAgyvAQtBiAEhAiABIARGDcgBIAMoAgAiACAEIAFraiEFIAEgAGtBBWohBgJAA0AgAS0AACAAQeDSAGotAABHDQIgAEEFRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADMkBCyADQQA2AgAgBkEBaiEBQSQMAgsgA0EANgIADAILIAEgBEYEQEGHASECDMcBCyABLQAAQcwARw0BIAFBAWohAUETCzoAKSADKAIEIQAgA0EANgIEIAMgACABEC0iAA0CDAELQQAhAiADQQA2AhwgAyABNgIUIANB6R42AhAgA0EGNgIMDMQBC0HuACECDKkBCyADQYYBNgIcIAMgATYCFCADIAA2AgxBACECDMIBC0EAIQACQCADKAI4IgJFDQAgAigCOCICRQ0AIAMgAhEAACEACyAARQ0AIABBFUYNASADQQA2AhwgAyABNgIUIANB1A42AhAgA0EgNgIMQQAhAgzBAQtB7QAhAgymAQsgA0GFATYCHCADIAE2AhQgA0HXGjYCECADQRU2AgxBACECDL8BCyABIARGBEBBhQEhAgy/AQsCQCABLQAAQSBGBEAgAUEBaiEBDAELIANBADYCHCADIAE2AhQgA0GGHjYCECADQQY2AgxBACECDL8BC0ECIQIMpAELA0AgAS0AAEEgRw0CIAQgAUEBaiIBRw0AC0GEASECDL0BCyABIARGBEBBgwEhAgy9AQsCQCABLQAAQQlrDgRAAABAAAtB6wAhAgyiAQsgAy0AKUEFRgRAQewAIQIMogELQeoAIQIMoQELIAEgBEYEQEGCASECDLsBCyADQQ82AgggAyABNgIEDAoLIAEgBEYEQEGBASECDLoBCwJAIAEtAABBCWsOBD0AAD0AC0HpACECDJ8BCyABIARHBEAgA0EPNgIIIAMgATYCBEHnACECDJ8BC0GAASECDLgBCwJAIAEgBEcEQANAIAEtAABB4M4Aai0AACIAQQNHBEACQCAAQQFrDgI/AAQLQeYAIQIMoQELIAQgAUEBaiIBRw0AC0H+ACECDLkBC0H+ACECDLgBCyADQQA2AhwgAyABNgIUIANBxh82AhAgA0EHNgIMQQAhAgy3AQsgASAERgRAQf8AIQIMtwELAkACQAJAIAEtAABB4NAAai0AAEEBaw4DPAIAAQtB6AAhAgyeAQsgA0EANgIcIAMgATYCFCADQYYSNgIQIANBBzYCDEEAIQIMtwELQeAAIQIMnAELIAEgBEcEQCABQQFqIQFB5QAhAgycAQtB/QAhAgy1AQsgBCABIgBGBEBB/AAhAgy1AQsgAC0AACIBQS9GBEAgAEEBaiEBQeQAIQIMmwELIAFBCWsiAkEXSw0BIAAhAUEBIAJ0QZuAgARxDTcMAQsgBCABIgBGBEBB+wAhAgy0AQsgAC0AAEEvRw0AIABBAWohAQwDC0EAIQIgA0EANgIcIAMgADYCFCADQcYfNgIQIANBBzYCDAyyAQsCQAJAAkACQAJAA0AgAS0AAEHgzABqLQAAIgBBBUcEQAJAAkAgAEEBaw4IPQUGBwgABAEIC0HhACECDJ8BCyABQQFqIQFB4wAhAgyeAQsgBCABQQFqIgFHDQALQfoAIQIMtgELIAFBAWoMFAsgAygCBCEAIANBADYCBCADIAAgARArIgBFDR4gA0HbADYCHCADIAE2AhQgAyAANgIMQQAhAgy0AQsgAygCBCEAIANBADYCBCADIAAgARArIgBFDR4gA0HdADYCHCADIAE2AhQgAyAANgIMQQAhAgyzAQsgAygCBCEAIANBADYCBCADIAAgARArIgBFDR4gA0HwADYCHCADIAE2AhQgAyAANgIMQQAhAgyyAQsgA0EANgIcIAMgATYCFCADQcsPNgIQIANBBzYCDEEAIQIMsQELIAEgBEYEQEH5ACECDLEBCwJAIAEtAABB4MwAai0AAEEBaw4INAQFBgAIAgMHCyABQQFqIQELQQMhAgyVAQsgAUEBagwNC0EAIQIgA0EANgIcIANBoxI2AhAgA0EHNgIMIAMgAUEBajYCFAytAQsgAygCBCEAIANBADYCBCADIAAgARArIgBFDRYgA0HbADYCHCADIAE2AhQgAyAANgIMQQAhAgysAQsgAygCBCEAIANBADYCBCADIAAgARArIgBFDRYgA0HdADYCHCADIAE2AhQgAyAANgIMQQAhAgyrAQsgAygCBCEAIANBADYCBCADIAAgARArIgBFDRYgA0HwADYCHCADIAE2AhQgAyAANgIMQQAhAgyqAQsgA0EANgIcIAMgATYCFCADQcsPNgIQIANBBzYCDEEAIQIMqQELQeIAIQIMjgELIAEgBEYEQEH4ACECDKgBCyABQQFqDAILIAEgBEYEQEH3ACECDKcBCyABQQFqDAELIAEgBEYNASABQQFqCyEBQQQhAgyKAQtB9gAhAgyjAQsDQCABLQAAQeDKAGotAAAiAEECRwRAIABBAUcEQEHfACECDIsBCwwnCyAEIAFBAWoiAUcNAAtB9QAhAgyiAQsgASAERgRAQfQAIQIMogELAkAgAS0AAEEJaw43JQMGJQQGBgYGBgYGBgYGBgYGBgYGBgYFBgYCBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAAYLIAFBAWoLIQFBBSECDIYBCyABQQFqDAYLIAMoAgQhACADQQA2AgQgAyAAIAEQKyIARQ0IIANB2wA2AhwgAyABNgIUIAMgADYCDEEAIQIMngELIAMoAgQhACADQQA2AgQgAyAAIAEQKyIARQ0IIANB3QA2AhwgAyABNgIUIAMgADYCDEEAIQIMnQELIAMoAgQhACADQQA2AgQgAyAAIAEQKyIARQ0IIANB8AA2AhwgAyABNgIUIAMgADYCDEEAIQIMnAELIANBADYCHCADIAE2AhQgA0G8EzYCECADQQc2AgxBACECDJsBCwJAAkACQAJAA0AgAS0AAEHgyABqLQAAIgBBBUcEQAJAIABBAWsOBiQDBAUGAAYLQd4AIQIMhgELIAQgAUEBaiIBRw0AC0HzACECDJ4BCyADKAIEIQAgA0EANgIEIAMgACABECsiAEUNByADQdsANgIcIAMgATYCFCADIAA2AgxBACECDJ0BCyADKAIEIQAgA0EANgIEIAMgACABECsiAEUNByADQd0ANgIcIAMgATYCFCADIAA2AgxBACECDJwBCyADKAIEIQAgA0EANgIEIAMgACABECsiAEUNByADQfAANgIcIAMgATYCFCADIAA2AgxBACECDJsBCyADQQA2AhwgAyABNgIUIANB3Ag2AhAgA0EHNgIMQQAhAgyaAQsgASAERg0BIAFBAWoLIQFBBiECDH4LQfIAIQIMlwELAkACQAJAAkADQCABLQAAQeDGAGotAAAiAEEFRwRAIABBAWsOBB8CAwQFCyAEIAFBAWoiAUcNAAtB8QAhAgyaAQsgAygCBCEAIANBADYCBCADIAAgARArIgBFDQMgA0HbADYCHCADIAE2AhQgAyAANgIMQQAhAgyZAQsgAygCBCEAIANBADYCBCADIAAgARArIgBFDQMgA0HdADYCHCADIAE2AhQgAyAANgIMQQAhAgyYAQsgAygCBCEAIANBADYCBCADIAAgARArIgBFDQMgA0HwADYCHCADIAE2AhQgAyAANgIMQQAhAgyXAQsgA0EANgIcIAMgATYCFCADQbQKNgIQIANBBzYCDEEAIQIMlgELQc4AIQIMewtB0AAhAgx6C0HdACECDHkLIAEgBEYEQEHwACECDJMBCwJAIAEtAABBCWsOBBYAABYACyABQQFqIQFB3AAhAgx4CyABIARGBEBB7wAhAgySAQsCQCABLQAAQQlrDgQVAAAVAAtBACEAAkAgAygCOCICRQ0AIAIoAjAiAkUNACADIAIRAAAhAAsgAEUEQEHTASECDHgLIABBFUcEQCADQQA2AhwgAyABNgIUIANBwQ02AhAgA0EaNgIMQQAhAgySAQsgA0HuADYCHCADIAE2AhQgA0HwGTYCECADQRU2AgxBACECDJEBC0HtACECIAEgBEYNkAEgAygCACIAIAQgAWtqIQUgASAAa0EDaiEGAkADQCABLQAAIABB18YAai0AAEcNBCAAQQNGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMkQELIANBADYCACAGQQFqIQEgAy0AKSIAQSNrQQtJDQQCQCAAQQZLDQBBASAAdEHKAHFFDQAMBQtBACECIANBADYCHCADIAE2AhQgA0HlCTYCECADQQg2AgwMkAELQewAIQIgASAERg2PASADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEHUxgBqLQAARw0DIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAyQAQsgA0EANgIAIAZBAWohASADLQApQSFGDQMgA0EANgIcIAMgATYCFCADQYkKNgIQIANBCDYCDEEAIQIMjwELQesAIQIgASAERg2OASADKAIAIgAgBCABa2ohBSABIABrQQNqIQYCQANAIAEtAAAgAEHQxgBqLQAARw0CIABBA0YNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAyPAQsgA0EANgIAIAZBAWohASADLQApIgBBI0kNAiAAQS5GDQIgA0EANgIcIAMgATYCFCADQcEJNgIQIANBCDYCDEEAIQIMjgELIANBADYCAAtBACECIANBADYCHCADIAE2AhQgA0GENzYCECADQQg2AgwMjAELQdgAIQIMcQsgASAERwRAIANBDTYCCCADIAE2AgRB1wAhAgxxC0HqACECDIoBCyABIARGBEBB6QAhAgyKAQsgAS0AAEEwayIAQf8BcUEKSQRAIAMgADoAKiABQQFqIQFB1gAhAgxwCyADKAIEIQAgA0EANgIEIAMgACABEC4iAEUNdCADQegANgIcIAMgATYCFCADIAA2AgxBACECDIkBCyABIARGBEBB5wAhAgyJAQsCQCABLQAAQS5GBEAgAUEBaiEBDAELIAMoAgQhACADQQA2AgQgAyAAIAEQLiIARQ11IANB5gA2AhwgAyABNgIUIAMgADYCDEEAIQIMiQELQdUAIQIMbgsgASAERgRAQeUAIQIMiAELQQAhAEEBIQVBASEHQQAhAgJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAIAEtAABBMGsOCgoJAAECAwQFBggLC0ECDAYLQQMMBQtBBAwEC0EFDAMLQQYMAgtBBwwBC0EICyECQQAhBUEAIQcMAgtBCSECQQEhAEEAIQVBACEHDAELQQAhBUEBIQILIAMgAjoAKyABQQFqIQECQAJAIAMtAC5BEHENAAJAAkACQCADLQAqDgMBAAIECyAHRQ0DDAILIAANAQwCCyAFRQ0BCyADKAIEIQAgA0EANgIEIAMgACABEC4iAEUNAiADQeIANgIcIAMgATYCFCADIAA2AgxBACECDIoBCyADKAIEIQAgA0EANgIEIAMgACABEC4iAEUNdyADQeMANgIcIAMgATYCFCADIAA2AgxBACECDIkBCyADKAIEIQAgA0EANgIEIAMgACABEC4iAEUNdSADQeQANgIcIAMgATYCFCADIAA2AgwMiAELQdMAIQIMbQsgAy0AKUEiRg2AAUHSACECDGwLQQAhAAJAIAMoAjgiAkUNACACKAI8IgJFDQAgAyACEQAAIQALIABFBEBB1AAhAgxsCyAAQRVHBEAgA0EANgIcIAMgATYCFCADQZwNNgIQIANBITYCDEEAIQIMhgELIANB4QA2AhwgAyABNgIUIANB1hk2AhAgA0EVNgIMQQAhAgyFAQsgASAERgRAQeAAIQIMhQELAkACQAJAAkACQCABLQAAQQprDgQBBAQABAsgAUEBaiEBDAELIAFBAWohASADQS9qLQAAQQFxRQ0BC0HRACECDGwLIANBADYCHCADIAE2AhQgA0GIETYCECADQQk2AgxBACECDIUBCyADQQA2AhwgAyABNgIUIANBiBE2AhAgA0EJNgIMQQAhAgyEAQsgASAERgRAQd8AIQIMhAELIAEtAABBCkYEQCABQQFqIQEMCQsgAy0ALkHAAHENCCADQQA2AhwgAyABNgIUIANBiBE2AhAgA0ECNgIMQQAhAgyDAQsgASAERgRAQd0AIQIMgwELIAEtAAAiAkENRgRAIAFBAWohAUHPACECDGkLIAEhACACQQlrDgQFAQEFAQsgBCABIgBGBEBB3AAhAgyCAQsgAC0AAEEKRw0AIABBAWoMAgtBACECIANBADYCHCADIAA2AhQgA0G1LDYCECADQQc2AgwMgAELIAEgBEYEQEHbACECDIABCwJAIAEtAABBCWsOBAMAAAMACyABQQFqCyEBQc0AIQIMZAsgASAERgRAQdoAIQIMfgsgAS0AAEEJaw4EAAEBAAELQQAhAiADQQA2AhwgA0HsETYCECADQQc2AgwgAyABQQFqNgIUDHwLIANBgBI7ASpBACEAAkAgAygCOCICRQ0AIAIoAjAiAkUNACADIAIRAAAhAAsgAEUNACAAQRVHDQEgA0HZADYCHCADIAE2AhQgA0HwGTYCECADQRU2AgxBACECDHsLQcwAIQIMYAsgA0EANgIcIAMgATYCFCADQcENNgIQIANBGjYCDEEAIQIMeQsgASAERgRAQdkAIQIMeQsgAS0AAEEgRw06IAFBAWohASADLQAuQQFxDTogA0EANgIcIAMgATYCFCADQa0bNgIQIANBHjYCDEEAIQIMeAsgASAERgRAQdgAIQIMeAsCQAJAAkACQAJAIAEtAAAiAEEKaw4EAgMD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AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABLQAAQTBrDjcVFAABAgMEBQYHFhYWFhYWFggJCgsMDRYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWDg8QERITFgtCAiEKDBQLQgMhCgwTC0IEIQoMEgtCBSEKDBELQgYhCgwQC0IHIQoMDwtCCCEKDA4LQgkhCgwNC0IKIQoMDAtCCyEKDAsLQgwhCgwKC0INIQoMCQtCDiEKDAgLQg8hCgwHC0IKIQoMBgtCCyEKDAULQgwhCgwEC0INIQoMAwtCDiEKDAILQg8hCgwBC0IBIQoLIAFBAWohASADKQMgIgtC//////////8PWARAIAMgC0IEhiAKhDcDIAwCC0EAIQIgA0EANgIcIAMgATYCFCADQa0JNgIQIANBDDYCDAwfC0ElIQIMBAtBJiECDAMLIAMgAToALCADQQA2AgAgB0EBaiEBQQwhAgwCCyADQQA2AgAgBkEBaiEBQQohAgwBCyABQQFqIQFBCCECDAALAAtBACECIANBADYCHCADIAE2AhQgA0HVEDYCECADQQk2AgwMGAtBACECIANBADYCHCADIAE2AhQgA0HXCjYCECADQQk2AgwMFwtBACECIANBADYCHCADIAE2AhQgA0G/EDYCECADQQk2AgwMFgtBACECIANBADYCHCADIAE2AhQgA0GkETYCECADQQk2AgwMFQtBACECIANBADYCHCADIAE2AhQgA0HVEDYCECADQQk2AgwMFAtBACECIANBADYCHCADIAE2AhQgA0HXCjYCECADQQk2AgwMEwtBACECIANBADYCHCADIAE2AhQgA0G/EDYCECADQQk2AgwMEgtBACECIANBADYCHCADIAE2AhQgA0GkETYCECADQQk2AgwMEQtBACECIANBADYCHCADIAE2AhQgA0G/FjYCECADQQ82AgwMEAtBACECIANBADYCHCADIAE2AhQgA0G/FjYCECADQQ82AgwMDwtBACECIANBADYCHCADIAE2AhQgA0HIEjYCECADQQs2AgwMDgtBACECIANBADYCHCADIAE2AhQgA0GVCTYCECADQQs2AgwMDQtBACECIANBADYCHCADIAE2AhQgA0HpDzYCECADQQo2AgwMDAtBACECIANBADYCHCADIAE2AhQgA0GDEDYCECADQQo2AgwMCwtBACECIANBADYCHCADIAE2AhQgA0GmHDYCECADQQI2AgwMCgtBACECIANBADYCHCADIAE2AhQgA0HFFTYCECADQQI2AgwMCQtBACECIANBADYCHCADIAE2AhQgA0H/FzYCECADQQI2AgwMCAtBACECIANBADYCHCADIAE2AhQgA0HKFzYCECADQQI2AgwMBwsgA0ECNgIcIAMgATYCFCADQZQdNgIQIANBFjYCDEEAIQIMBgtB3gAhAiABIARGDQUgCUEIaiEHIAMoAgAhBQJAAkAgASAERwRAIAVBxsYAaiEIIAQgBWogAWshBiAFQX9zQQpqIgUgAWohAANAIAEtAAAgCC0AAEcEQEECIQgMAwsgBUUEQEEAIQggACEBDAMLIAVBAWshBSAIQQFqIQggBCABQQFqIgFHDQALIAYhBSAEIQELIAdBATYCACADIAU2AgAMAQsgA0EANgIAIAcgCDYCAAsgByABNgIEIAkoAgwhACAJKAIIDgMBBQIACwALIANBADYCHCADQa0dNgIQIANBFzYCDCADIABBAWo2AhRBACECDAMLIANBADYCHCADIAA2AhQgA0HCHTYCECADQQk2AgxBACECDAILIAEgBEYEQEEoIQIMAgsgA0EJNgIIIAMgATYCBEEnIQIMAQsgASAERgRAQQEhAgwBCwNAAkACQAJAIAEtAABBCmsOBAABAQABCyABQQFqIQEMAQsgAUEBaiEBIAMtAC5BIHENAEEAIQIgA0EANgIcIAMgATYCFCADQYwgNgIQIANBBTYCDAwCC0EBIQIgASAERw0ACwsgCUEQaiQAIAJFBEAgAygCDCEADAELIAMgAjYCHEEAIQAgAygCBCIBRQ0AIAMgASAEIAMoAggRAQAiAUUNACADIAQ2AhQgAyABNgIMIAEhAAsgAAu+AgECfyAAQQA6AAAgAEHcAGoiAUEBa0EAOgAAIABBADoAAiAAQQA6AAEgAUEDa0EAOgAAIAFBAmtBADoAACAAQQA6AAMgAUEEa0EAOgAAQQAgAGtBA3EiASAAaiIAQQA2AgBB3AAgAWtBfHEiAiAAaiIBQQRrQQA2AgACQCACQQlJDQAgAEEANgIIIABBADYCBCABQQhrQQA2AgAgAUEMa0EANgIAIAJBGUkNACAAQQA2AhggAEEANgIUIABBADYC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YXR1cwBJbnZhbGlkIHJlc3BvbnNlIHN0YXR1cwBFeHBlY3RlZCBMRiBhZnRlciBoZWFkZXJzAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMAVXNlciBjYWxsYmFjayBlcnJvcgBgb25fcmVzZXRgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19oZWFkZXJgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2JlZ2luYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlYCBjYWxsYmFjayBlcnJvcgBgb25fc3RhdHVzX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdmVyc2lvbl9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3VybF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWVzc2FnZV9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX21ldGhvZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lYCBjYWxsYmFjayBlcnJvcgBVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNlcnZlcgBJbnZhbGlkIGhlYWRlciB2YWx1ZSBjaGFyAEludmFsaWQgaGVhZGVyIGZpZWxkIGNoYXIAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl92ZXJzaW9uAEludmFsaWQgbWlub3IgdmVyc2lvbgBJbnZhbGlkIG1ham9yIHZlcnNpb24ARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgdmVyc2lvbgBFeHBlY3RlZCBDUkxGIGFmdGVyIHZlcnNpb24ASW52YWxpZCBIVFRQIHZlcnNpb24ASW52YWxpZCBoZWFkZXIgdG9rZW4AU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl91cmwASW52YWxpZCBjaGFyYWN0ZXJzIGluIHVybABVbmV4cGVjdGVkIHN0YXJ0IGNoYXIgaW4gdXJsAERvdWJsZSBAIGluIHVybABFbXB0eSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXJhY3RlciBpbiBDb250ZW50LUxlbmd0aABUcmFuc2Zlci1FbmNvZGluZyBjYW4ndCBiZSBwcmVzZW50IHdpdGggQ29udGVudC1MZW5ndGgARHVwbGljYXRlIENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhciBpbiB1cmwgcGF0aABDb250ZW50LUxlbmd0aCBjYW4ndCBiZSBwcmVzZW50IHdpdGggVHJhbnNmZXItRW5jb2RpbmcATWlzc2luZyBleHBlY3RlZCBDUiBhZnRlciBjaHVuayBzaXplAEV4cGVjdGVkIExGIGFmdGVyIGNodW5rIHNpemUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgc2l6ZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2hlYWRlcl92YWx1ZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgaGVhZGVyIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgTEYgYWZ0ZXIgaGVhZGVyIHZhbHVlAEludmFsaWQgYFRyYW5zZmVyLUVuY29kaW5nYCBoZWFkZXIgdmFsdWUATWlzc2luZyBleHBlY3RlZCBDUiBhZnRlciBjaHVuayBleHRlbnNpb24gdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZSB2YWx1ZQBJbnZhbGlkIHF1b3RlZC1wYWlyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAFBhdXNlZCBieSBvbl9oZWFkZXJzX2NvbXBsZXRlAEludmFsaWQgRU9GIHN0YXRlAG9uX3Jlc2V0IHBhdXNlAG9uX2NodW5rX2hlYWRlciBwYXVzZQBvbl9tZXNzYWdlX2JlZ2luIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZSBwYXVzZQBvbl9zdGF0dXNfY29tcGxldGUgcGF1c2UAb25fdmVyc2lvbl9jb21wbGV0ZSBwYXVzZQBvbl91cmxfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlIHBhdXNlAG9uX21lc3NhZ2VfY29tcGxldGUgcGF1c2UAb25fbWV0aG9kX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fbmFtZSBwYXVzZQBVbmV4cGVjdGVkIHNwYWNlIGFmdGVyIHN0YXJ0IGxpbmUATWlzc2luZyBleHBlY3RlZCBDUiBhZnRlciByZXNwb25zZSBsaW5lAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX25hbWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBuYW1lAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgY2h1bmsgZXh0ZW5zaW9uIG5hbWUASW52YWxpZCBzdGF0dXMgY29kZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABNaXNzaW5nIGV4cGVjdGVkIENSIGFmdGVyIGNodW5rIGRhdGEARXhwZWN0ZWQgTEYgYWZ0ZXIgY2h1bmsgZGF0YQBVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AARGF0YSBhZnRlciBgQ29ubmVjdGlvbjogY2xvc2VgAFNXSVRDSF9QUk9YWQBVU0VfUFJPWFkATUtBQ1RJVklUWQBVTlBST0NFU1NBQkxFX0VOVElUWQBRVUVSWQBDT1BZAE1PVkVEX1BFUk1BTkVOVExZAFRPT19FQVJMWQBOT1RJRlkARkFJTEVEX0RFUEVOREVOQ1kAQkFEX0dBVEVXQVkAUExBWQBQVVQAQ0hFQ0tPVVQAR0FURVdBWV9USU1FT1VUAFJFUVVFU1RfVElNRU9VVABORVRXT1JLX0NPTk5FQ1RfVElNRU9VVABDT05ORUNUSU9OX1RJTUVPVVQATE9HSU5fVElNRU9VVABORVRXT1JLX1JFQURfVElNRU9VVABQT1NUAE1JU0RJUkVDVEVEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfTE9BRF9CQUxBTkNFRF9SRVFVRVNUAEJBRF9SRVFVRVNUAEhUVFBfUkVRVUVTVF9TRU5UX1RPX0hUVFBTX1BPUlQAUkVQT1JUAElNX0FfVEVBUE9UAFJFU0VUX0NPTlRFTlQATk9fQ09OVEVOVABQQVJUSUFMX0NPTlRFTlQASFBFX0lOVkFMSURfQ09OU1RBTlQASFBFX0NCX1JFU0VUAEdFVABIUEVfU1RSSUNUAENPTkZMSUNUAFRFTVBPUkFSWV9SRURJUkVDVABQRVJNQU5FTlRfUkVESVJFQ1QAQ09OTkVDVABNVUxUSV9TVEFUVVMASFBFX0lOVkFMSURfU1RBVFVTAFRPT19NQU5ZX1JFUVVFU1RTAEVBUkxZX0hJTlRTAFVOQVZBSUxBQkxFX0ZPUl9MRUdBTF9SRUFTT05TAE9QVElPTlMAU1dJVENISU5HX1BST1RPQ09MUwBWQVJJQU5UX0FMU09fTkVHT1RJQVRFUwBNVUxUSVBMRV9DSE9JQ0VTAElOVEVSTkFMX1NFUlZFUl9FUlJPUgBXRUJfU0VSVkVSX1VOS05PV05fRVJST1IAUkFJTEdVTl9FUlJPUgBJREVOVElUWV9QUk9WSURFUl9BVVRIRU5USUNBVElPTl9FUlJPUgBTU0xfQ0VSVElGSUNBVEVfRVJST1IASU5WQUxJRF9YX0ZPUldBUkRFRF9GT1IAU0VUX1BBUkFNRVRFUgBHRVRfUEFSQU1FVEVSAEhQRV9VU0VSAFNFRV9PVEhFUgBIUEVfQ0JfQ0hVTktfSEVBREVSAEV4cGVjdGVkIExGIGFmdGVyIENSAE1LQ0FMRU5EQVIAU0VUVVAAV0VCX1NFUlZFUl9JU19ET1dOAFRFQVJET1dOAEhQRV9DTE9TRURfQ09OTkVDVElPTgBIRVVSSVNUSUNfRVhQSVJBVElPTgBESVNDT05ORUNURURfT1BFUkFUSU9OAE5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OAEhQRV9JTlZBTElEX1ZFUlNJT04ASFBFX0NCX01FU1NBR0VfQkVHSU4AU0lURV9JU19GUk9aRU4ASFBFX0lOVkFMSURfSEVBREVSX1RPS0VOAElOVkFMSURfVE9LRU4ARk9SQklEREVOAEVOSEFOQ0VfWU9VUl9DQUxNAEhQRV9JTlZBTElEX1VSTABCTE9DS0VEX0JZX1BBUkVOVEFMX0NPTlRST0wATUtDT0wAQUNMAEhQRV9JTlRFUk5BTABSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFX1VOT0ZGSUNJQUwASFBFX09LAFVOTElOSwBVTkxPQ0sAUFJJAFJFVFJZX1dJVEgASFBFX0lOVkFMSURfQ09OVEVOVF9MRU5HVEgASFBFX1VORVhQRUNURURfQ09OVEVOVF9MRU5HVEgARkxVU0gAUFJPUFBBVENIAE0tU0VBUkNIAFVSSV9UT09fTE9ORwBQUk9DRVNTSU5HAE1JU0NFTExBTkVPVVNfUEVSU0lTVEVOVF9XQVJOSU5HAE1JU0NFTExBTkVPVVNfV0FSTklORwBIUEVfSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElORwBFeHBlY3RlZCBDUkxGAEhQRV9JTlZBTElEX0NIVU5LX1NJWkUATU9WRQBDT05USU5VRQBIUEVfQ0JfU1RBVFVTX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJTX0NPTVBMRVRFAEhQRV9DQl9WRVJTSU9OX0NPTVBMRVRFAEhQRV9DQl9VUkxfQ09NUExFVEUASFBFX0NCX0NIVU5LX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX05BTUVfQ09NUExFVEUASFBFX0NCX01FU1NBR0VfQ09NUExFVEUASFBFX0NCX01FVEhPRF9DT01QTEVURQBIUEVfQ0JfSEVBREVSX0ZJRUxEX0NPTVBMRVRFAERFTEVURQBIUEVfSU5WQUxJRF9FT0ZfU1RBVEUASU5WQUxJRF9TU0xfQ0VSVElGSUNBVEUAUEFVU0UATk9fUkVTUE9OU0UAVU5TVVBQT1JURURfTUVESUFfVFlQRQBHT05FAE5PVF9BQ0NFUFRBQkxFAFNFUlZJQ0VfVU5BVkFJTEFCTEUAUkFOR0VfTk9UX1NBVElTRklBQkxFAE9SSUdJTl9JU19VTlJFQUNIQUJMRQBSRVNQT05TRV9JU19TVEFMRQBQVVJHRQBNRVJHRQBSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFAFJFUVVFU1RfSEVBREVSX1RPT19MQVJHRQBQQVlMT0FEX1RPT19MQVJHRQBJTlNVRkZJQ0lFTlRfU1RPUkFHRQBIUEVfUEFVU0VEX1VQR1JBREUASFBFX1BBVVNFRF9IMl9VUEdSQURFAFNPVVJDRQBBTk5PVU5DRQBUUkFDRQBIUEVfVU5FWFBFQ1RFRF9TUEFDRQBERVNDUklCRQBVTlNVQlNDUklCRQBSRUNPUkQASFBFX0lOVkFMSURfTUVUSE9EAE5PVF9GT1VORABQUk9QRklORABVTkJJTkQAUkVCSU5EAFVOQVVUSE9SSVpFRABNRVRIT0RfTk9UX0FMTE9XRUQASFRUUF9WRVJTSU9OX05PVF9TVVBQT1JURUQAQUxSRUFEWV9SRVBPUlRFRABBQ0NFUFRFRABOT1RfSU1QTEVNRU5URUQATE9PUF9ERVRFQ1RFRABIUEVfQ1JfRVhQRUNURUQASFBFX0xGX0VYUEVDVEVEAENSRUFURUQASU1fVVNFRABIUEVfUEFVU0VEAFRJTUVPVVRfT0NDVVJFRABQQVlNRU5UX1JFUVVJUkVEAFBSRUNPTkRJVElPTl9SRVFVSVJFRABQUk9YWV9BVVRIRU5USUNBVElPTl9SRVFVSVJFRABORVRXT1JLX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAExFTkdUSF9SRVFVSVJFRABTU0xfQ0VSVElGSUNBVEVfUkVRVUlSRUQAVVBHUkFERV9SRVFVSVJFRABQQUdFX0VYUElSRUQAUFJFQ09ORElUSU9OX0ZBSUxFRABFWFBFQ1RBVElPTl9GQUlMRUQAUkVWQUxJREFUSU9OX0ZBSUxFRABTU0xfSEFORFNIQUtFX0ZBSUxFRABMT0NLRUQAVFJBTlNGT1JNQVRJT05fQVBQTElFRABOT1RfTU9ESUZJRUQATk9UX0VYVEVOREVEAEJBTkRXSURUSF9MSU1JVF9FWENFRURFRABTSVRFX0lTX09WRVJMT0FERUQASEVBRABFeHBlY3RlZCBIVFRQLwAAUhUAABoVAAAPEgAA5BkAAJEVAAAJFAAALRkAAOQUAADpEQAAaRQAAKEUAAB2FQAAQxYAAF4SAACUFwAAFxYAAH0UAAB/FgAAQRcAALMTAADDFgAABBoAAL0YAADQGAAAoBMAANQZAACvFgAAaBYAAHAXAADZFgAA/BgAAP4RAABZFwAAlxYAABwXAAD2FgAAjRcAAAsSAAB/GwAALhEAALMQAABJEgAArRIAAPYYAABoEAAAYhUAABAVAABaFgAAShkAALUVAADBFQAAYBUAAFwZAABaGQAAUxkAABYVAACtEQAAQhAAALcQAABXGAAAvxUAAIkQAAAcGQAAGhkAALkVAABRGAAA3BMAAFsVAABZFQAA5hgAAGcVAAARGQAA7RgAAOcTAACuEAAAwhcAAAAUAACSEwAAhBMAAEASAAAmGQAArxUAAGIQAEHpOQsBAQBBgDoL4AEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB6jsLBAEAAAIAQYE8C14DBAMDAwMDAAADAwADAwADAwMDAwMDAwMDAAUAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAwADAEHqPQsEAQAAAgBBgT4LXgMAAwMDAwMAAAMDAAMDAAMDAwMDAwMDAwMABAAFAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwADAAMAQeA/Cw1sb3NlZWVwLWFsaXZlAEH5PwsBAQBBkMAAC+ABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAQfnBAAsBAQBBkMIAC+cBAQEBAQEBAQEBAQEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFjaHVua2VkAEGhxAALXgEAAQEBAQEAAAEBAAEBAAEBAQEBAQEBAQEAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAEAQYDGAAshZWN0aW9uZW50LWxlbmd0aG9ucm94eS1jb25uZWN0aW9uAEGwxgALK3JhbnNmZXItZW5jb2RpbmdwZ3JhZGUNCg0KU00NCg0KVFRQL0NFL1RTUC8AQenGAAsFAQIAAQMAQYDHAAtfBAUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAQenIAAsFAQIAAQMAQYDJAAtfBAUFBgUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAQenKAAsEAQAAAQBBgcsAC14CAgACAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAEHpzAALBQECAAEDAEGAzQALXwQFAAAFBQUFBQUFBQUFBQYFBQUFBQUFBQUFBQUABQAHCAUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQAFAAUABQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAAAAFAEHpzgALBQEBAAEBAEGAzwALAQEAQZrPAAtBAgAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQenQAAsFAQEAAQEAQYDRAAsBAQBBitEACwYCAAAAAAIAQaHRAAs6AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBB4NIAC5oBTk9VTkNFRUNLT1VUTkVDVEVURUNSSUJFTFVTSEVURUFEU0VBUkNIUkdFQ1RJVklUWUxFTkRBUlZFT1RJRllQVElPTlNDSFNFQVlTVEFUQ0hHRVVFUllPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFSFRUUC9BRFRQLw==' + +let wasmBuffer + +Object.defineProperty(module, 'exports', { + get: () => { + return wasmBuffer + ? wasmBuffer + : (wasmBuffer = Buffer.from(wasmBase64, 'base64')) + } +}) diff --git a/deps/undici/src/lib/llhttp/llhttp.wasm b/deps/undici/src/lib/llhttp/llhttp.wasm index 582dbad4243f14..3d888a595ba2f0 100755 Binary files a/deps/undici/src/lib/llhttp/llhttp.wasm and b/deps/undici/src/lib/llhttp/llhttp.wasm differ diff --git a/deps/undici/src/lib/llhttp/llhttp_simd-wasm.js b/deps/undici/src/lib/llhttp/llhttp_simd-wasm.js index 3ee81325f5b788..1875d85352b15e 100644 --- a/deps/undici/src/lib/llhttp/llhttp_simd-wasm.js +++ b/deps/undici/src/lib/llhttp/llhttp_simd-wasm.js @@ -2,4 +2,14 @@ const { Buffer } = require('node:buffer') -module.exports = Buffer.from('AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAX8AYAJ/fwBgBH9/f38Bf2AAAGADf39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQAEA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAAy0sBQYAAAIAAAAAAAACAQIAAgICAAADAAAAAAMDAwMBAQEBAQEBAQEAAAIAAAAEBQFwARISBQMBAAIGCAF/AUGA1AQLB9EFIgZtZW1vcnkCAAtfaW5pdGlhbGl6ZQAIGV9faW5kaXJlY3RfZnVuY3Rpb25fdGFibGUBAAtsbGh0dHBfaW5pdAAJGGxsaHR0cF9zaG91bGRfa2VlcF9hbGl2ZQAvDGxsaHR0cF9hbGxvYwALBm1hbGxvYwAxC2xsaHR0cF9mcmVlAAwEZnJlZQAMD2xsaHR0cF9nZXRfdHlwZQANFWxsaHR0cF9nZXRfaHR0cF9tYWpvcgAOFWxsaHR0cF9nZXRfaHR0cF9taW5vcgAPEWxsaHR0cF9nZXRfbWV0aG9kABAWbGxodHRwX2dldF9zdGF0dXNfY29kZQAREmxsaHR0cF9nZXRfdXBncmFkZQASDGxsaHR0cF9yZXNldAATDmxsaHR0cF9leGVjdXRlABQUbGxodHRwX3NldHRpbmdzX2luaXQAFQ1sbGh0dHBfZmluaXNoABYMbGxodHRwX3BhdXNlABcNbGxodHRwX3Jlc3VtZQAYG2xsaHR0cF9yZXN1bWVfYWZ0ZXJfdXBncmFkZQAZEGxsaHR0cF9nZXRfZXJybm8AGhdsbGh0dHBfZ2V0X2Vycm9yX3JlYXNvbgAbF2xsaHR0cF9zZXRfZXJyb3JfcmVhc29uABwUbGxodHRwX2dldF9lcnJvcl9wb3MAHRFsbGh0dHBfZXJybm9fbmFtZQAeEmxsaHR0cF9tZXRob2RfbmFtZQAfEmxsaHR0cF9zdGF0dXNfbmFtZQAgGmxsaHR0cF9zZXRfbGVu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PgtBhwEMPQtBiAEMPAtBiQEMOwtBigEMOgtBiwEMOQtBjAEMOAtBjQEMNwtBjgEMNgtBjwEMNQtBkAEMNAtBkQEMMwtBkgEMMgtBkwEMMQtBlAEMMAtBlQEMLwtBlgEMLgtBlwEMLQtBmAEMLAtBmQEMKwtBmgEMKgtBmwEMKQtBnAEMKAtBnQEMJwtBngEMJgtBnwEMJQtBoAEMJAtBoQEMIwtBogEMIgtBowEMIQtBpAEMIAtBpQEMHwtBpgEMHgtBpwEMHQtBqAEMHAtBqQEMGwtBqgEMGgtBqwEMGQtBrAEMGAtBrQEMFwtBrgEMFgtBAQwVC0GvAQwUC0GwAQwTC0GxAQwSC0GzAQwRC0GyAQwQC0G0AQwPC0G1AQwOC0G2AQwNC0G3AQwMC0G4AQwLC0G5AQwKC0G6AQwJC0G7AQwIC0HGAQwHC0G8AQwGC0G9AQwFC0G+AQwEC0G/AQwDC0HAAQwCC0HCAQwBC0HBAQshAwNAAkACQAJAAkACQAJAAkACQAJAIAICfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAgJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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iQEhAwykAgtBASABLQAAQd8ARw1nGiABQQFqIQEMXgtBigEhAyABIARGDaICIAIoAgAiACAEIAFraiEFIAEgAGtBAWohBgNAIAEtAAAgAEGMzwBqLQAARw1kIABBAUYN+gEgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAMogILQYsBIQMgASAERg2hAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGOzwBqLQAARw1kIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyiAgsgAkEANgIAIAZBAWohAUECDGULQYwBIQMgASAERg2gAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHwzwBqLQAARw1jIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyhAgsgAkEANgIAIAZBAWohAUEfDGQLQY0BIQMgASAERg2fAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHyzwBqLQAARw1iIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAygAgsgAkEANgIAIAZBAWohAUEJDGMLIAEgBEYEQEGOASEDDJ8CCwJAAkAgAS0AAEHJAGsOBwBiYmJiYgFiCyABQQFqIQFB+AAhAwyGAgsgAUEBaiEBQfkAIQMMhQILQY8BIQMgASAERg2dAiACKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEGRzwBqLQAARw1gIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyeAgsgAkEANgIAIAZBAWohAUEYDGELQZABIQMgASAERg2cAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGXzwBqLQAARw1fIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAydAgsgAkEANgIAIAZBAWohAUEXDGALQZEBIQMgASAERg2bAiACKAIAIgAgBCABa2ohBSABIABrQQZqIQYCQANAIAEtAAAgAEGazwBqLQAARw1eIABBBkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAycAgsgAkEANgIAIAZBAWohAUEV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JSIARQ0RIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMtAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0gIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMswELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0iIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMsgELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0OIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMsQELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0dIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMsAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0fIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMrwELIABBP0cNASABQQFqCyEBQQUhAwyUAQtBACEDIAJBADYCHCACIAE2AhQgAkH9EjYCECACQQc2AgwMrAELIAJBADYCHCACIAE2AhQgAkHcCDYCECACQQc2AgxBACEDDKsBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNByACQeUANgIcIAIgATYCFCACIAA2AgxBACEDDKoBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNFiACQdMANgIcIAIgATYCFCACIAA2AgxBACEDDKkBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNGCACQdIANgIcIAIgATYCFCACIAA2AgxBACEDDKgBCyACQQA2AhwgAiABNgIUIAJBxgo2AhAgAkEHNgIMQQAhAwynAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQMgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwymAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRIgAkHTADYCHCACIAE2AhQgAiAANgIMQQAhAwylAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRQgAkHSADYCHCACIAE2AhQgAiAANgIMQQAhAwykAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQAgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwyjAQtB1QAhAwyJAQsgAEEVRwRAIAJBADYCHCACIAE2AhQgAkG5DTYCECACQRo2AgxB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AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABB5ABrDvQDY2IAAWFhYWFhYQIDBAVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhBgcICQoLDA0OD2FhYWFhEGFhYWFhYWFhYWFhEWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYRITFBUWFxgZGhthYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2YTc4OTphYWFhYWFhYTthYWE8YWFhYT0+P2FhYWFhYWFhQGFhQWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYUJDREVGR0hJSktMTU5PUFFSU2FhYWFhYWFhVFVWV1hZWlthXF1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFeYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhX2BhC0HhJw8LQaQhDwtByywPC0H+MQ8LQcAkDwtBqyQPC0GNKA8LQeImDwtBgDAPC0G5Lw8LQdckDwtB7x8PC0HhHw8LQfofDwtB8iAPC0GoLw8LQa4yDwtBiDAPC0HsJw8LQYIiDwtBjh0PC0HQLg8LQcojDwtBxTIPC0HfHA8LQdIcDwtBxCAPC0HXIA8LQaIfDwtB7S4PC0GrMA8LQdQlDwtBzC4PC0H6Lg8LQfwrDwtB0jAPC0HxHQ8LQbsgDwtB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AAADAEGUCAsFBAAAAAUAQaQICwkGAAAABwAAAAgAQdwIC4otSW52YWxpZCBjaGFyIGluIHVybCBxdWVyeQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2JvZHkAQ29udGVudC1MZW5ndGggb3ZlcmZsb3cAQ2h1bmsgc2l6ZSBvdmVyZmxvdwBSZXNwb25zZSBvdmVyZmxvdwBJbnZhbGlkIG1ldGhvZCBmb3IgSFRUUC94LnggcmVxdWVzdABJbnZhbGlkIG1ldGhvZCBmb3IgUlRTUC94LnggcmVxdWVzdABFeHBlY3RlZCBTT1VSQ0UgbWV0aG9kIGZvciBJQ0UveC54IHJlcXVlc3QASW52YWxpZCBjaGFyIGluIHVybCBmcmFnbWVudCBzdGFydABFeHBlY3RlZCBkb3QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9zdGF0dXMASW52YWxpZCByZXNwb25zZSBzdGF0dXMASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucwBVc2VyIGNhbGxiYWNrIGVycm9yAGBvbl9yZXNldGAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2hlYWRlcmAgY2FsbGJhY2sgZXJyb3IAYG9uX21lc3NhZ2VfYmVnaW5gIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fdmFsdWVgIGNhbGxiYWNrIGVycm9yAGBvbl9zdGF0dXNfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl92ZXJzaW9uX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdXJsX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAEVtcHR5IENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhcmFjdGVyIGluIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBNaXNzaW5nIGV4cGVjdGVkIExGIGFmdGVyIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AgaGVhZGVyIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGUgdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZWQgdmFsdWUAUGF1c2VkIGJ5IG9uX2hlYWRlcnNfY29tcGxldGUASW52YWxpZCBFT0Ygc3RhdGUAb25fcmVzZXQgcGF1c2UAb25fY2h1bmtfaGVhZGVyIHBhdXNlAG9uX21lc3NhZ2VfYmVnaW4gcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlIHBhdXNlAG9uX3N0YXR1c19jb21wbGV0ZSBwYXVzZQBvbl92ZXJzaW9uX2NvbXBsZXRlIHBhdXNlAG9uX3VybF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGUgcGF1c2UAb25fbWVzc2FnZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXRob2RfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lIHBhdXNlAFVuZXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgc3RhcnQgbGluZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgbmFtZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AAU1dJVENIX1BST1hZAFVTRV9QUk9YWQBNS0FDVElWSVRZAFVOUFJPQ0VTU0FCTEVfRU5USVRZAENPUFkATU9WRURfUEVSTUFORU5UTFkAVE9PX0VBUkxZAE5PVElGWQBGQUlMRURfREVQRU5ERU5DWQBCQURfR0FURVdBWQBQTEFZAFBVVABDSEVDS09VVABHQVRFV0FZX1RJTUVPVVQAUkVRVUVTVF9USU1FT1VUAE5FVFdPUktfQ09OTkVDVF9USU1FT1VUAENPTk5FQ1RJT05fVElNRU9VVABMT0dJTl9USU1FT1VUAE5FVFdPUktfUkVBRF9USU1FT1VUAFBPU1QATUlTRElSRUNURURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9MT0FEX0JBTEFOQ0VEX1JFUVVFU1QAQkFEX1JFUVVFU1QASFRUUF9SRVFVRVNUX1NFTlRfVE9fSFRUUFNfUE9SVABSRVBPUlQASU1fQV9URUFQT1QAUkVTRVRfQ09OVEVOVABOT19DT05URU5UAFBBUlRJQUxfQ09OVEVOVABIUEVfSU5WQUxJRF9DT05TVEFOVABIUEVfQ0JfUkVTRVQAR0VUAEhQRV9TVFJJQ1QAQ09ORkxJQ1QAVEVNUE9SQVJZX1JFRElSRUNUAFBFUk1BTkVOVF9SRURJUkVDVABDT05ORUNUAE1VTFRJX1NUQVRVUwBIUEVfSU5WQUxJRF9TVEFUVVMAVE9PX01BTllfUkVRVUVTVFMARUFSTFlfSElOVFMAVU5BVkFJTEFCTEVfRk9SX0xFR0FMX1JFQVNPTlMAT1BUSU9OUwBTV0lUQ0hJTkdfUFJPVE9DT0xTAFZBUklBTlRfQUxTT19ORUdPVElBVEVTAE1VTFRJUExFX0NIT0lDRVMASU5URVJOQUxfU0VSVkVSX0VSUk9SAFdFQl9TRVJWRVJfVU5LTk9XTl9FUlJPUgBSQUlMR1VOX0VSUk9SAElERU5USVRZX1BST1ZJREVSX0FVVEhFTlRJQ0FUSU9OX0VSUk9SAFNTTF9DRVJUSUZJQ0FURV9FUlJPUgBJTlZBTElEX1hfRk9SV0FSREVEX0ZPUgBTRVRfUEFSQU1FVEVSAEdFVF9QQVJBTUVURVIASFBFX1VTRVIAU0VFX09USEVSAEhQRV9DQl9DSFVOS19IRUFERVIATUtDQUxFTkRBUgBTRVRVUABXRUJfU0VSVkVSX0lTX0RPV04AVEVBUkRPV04ASFBFX0NMT1NFRF9DT05ORUNUSU9OAEhFVVJJU1RJQ19FWFBJUkFUSU9OAERJU0NPTk5FQ1RFRF9PUEVSQVRJT04ATk9OX0FVVEhPUklUQVRJVkVfSU5GT1JNQVRJT04ASFBFX0lOVkFMSURfVkVSU0lPTgBIUEVfQ0JfTUVTU0FHRV9CRUdJTgBTSVRFX0lTX0ZST1pFTgBIUEVfSU5WQUxJRF9IRUFERVJfVE9LRU4ASU5WQUxJRF9UT0tFTgBGT1JCSURERU4ARU5IQU5DRV9ZT1VSX0NBTE0ASFBFX0lOVkFMSURfVVJMAEJMT0NLRURfQllfUEFSRU5UQUxfQ09OVFJPTABNS0NPTABBQ0wASFBFX0lOVEVSTkFMAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0VfVU5PRkZJQ0lBTABIUEVfT0sAVU5MSU5LAFVOTE9DSwBQUkkAUkVUUllfV0lUSABIUEVfSU5WQUxJRF9DT05URU5UX0xFTkdUSABIUEVfVU5FWFBFQ1RFRF9DT05URU5UX0xFTkdUSABGTFVTSABQUk9QUEFUQ0gATS1TRUFSQ0gAVVJJX1RPT19MT05HAFBST0NFU1NJTkcATUlTQ0VMTEFORU9VU19QRVJTSVNURU5UX1dBUk5JTkcATUlTQ0VMTEFORU9VU19XQVJOSU5HAEhQRV9JTlZBTElEX1RSQU5TRkVSX0VOQ09ESU5HAEV4cGVjdGVkIENSTEYASFBFX0lOVkFMSURfQ0hVTktfU0laRQBNT1ZFAENPTlRJTlVFAEhQRV9DQl9TVEFUVVNfQ09NUExFVEUASFBFX0NCX0hFQURFUlNfQ09NUExFVEUASFBFX0NCX1ZFUlNJT05fQ09NUExFVEUASFBFX0NCX1VSTF9DT01QTEVURQBIUEVfQ0JfQ0hVTktfQ09NUExFVEUASFBFX0NCX0hFQURFUl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fTkFNRV9DT01QTEVURQBIUEVfQ0JfTUVTU0FHRV9DT01QTEVURQBIUEVfQ0JfTUVUSE9EX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfRklFTERfQ09NUExFVEUAREVMRVRFAEhQRV9JTlZBTElEX0VPRl9TVEFURQBJTlZBTElEX1NTTF9DRVJUSUZJQ0FURQBQQVVTRQBOT19SRVNQT05TRQBVTlNVUFBPUlRFRF9NRURJQV9UWVBFAEdPTkUATk9UX0FDQ0VQVEFCTEUAU0VSVklDRV9VTkFWQUlMQUJMRQBSQU5HRV9OT1RfU0FUSVNGSUFCTEUAT1JJR0lOX0lTX1VOUkVBQ0hBQkxFAFJFU1BPTlNFX0lTX1NUQUxFAFBVUkdFAE1FUkdFAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0UAUkVRVUVTVF9IRUFERVJfVE9PX0xBUkdFAFBBWUxPQURfVE9PX0xBUkdFAElOU1VGRklDSUVOVF9TVE9SQUdFAEhQRV9QQVVTRURfVVBHUkFERQBIUEVfUEFVU0VEX0gyX1VQR1JBREUAU09VUkNFAEFOTk9VTkNFAFRSQUNFAEhQRV9VTkVYUEVDVEVEX1NQQUNFAERFU0NSSUJFAFVOU1VCU0NSSUJFAFJFQ09SRABIUEVfSU5WQUxJRF9NRVRIT0QATk9UX0ZPVU5EAFBST1BGSU5EAFVOQklORABSRUJJTkQAVU5BVVRIT1JJWkVEAE1FVEhPRF9OT1RfQUxMT1dFRABIVFRQX1ZFUlNJT05fTk9UX1NVUFBPUlRFRABBTFJFQURZX1JFUE9SVEVEAEFDQ0VQVEVEAE5PVF9JTVBMRU1FTlRFRABMT09QX0RFVEVDVEVEAEhQRV9DUl9FWFBFQ1RFRABIUEVfTEZfRVhQRUNURUQAQ1JFQVRFRABJTV9VU0VEAEhQRV9QQVVTRUQAVElNRU9VVF9PQ0NVUkVEAFBBWU1FTlRfUkVRVUlSRUQAUFJFQ09ORElUSU9OX1JFUVVJUkVEAFBST1hZX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAE5FVFdPUktfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATEVOR1RIX1JFUVVJUkVEAFNTTF9DRVJUSUZJQ0FURV9SRVFVSVJFRABVUEdSQURFX1JFUVVJUkVEAFBBR0VfRVhQSVJFRABQUkVDT05ESVRJT05fRkFJTEVEAEVYUEVDVEFUSU9OX0ZBSUxFRABSRVZBTElEQVRJT05fRkFJTEVEAFNTTF9IQU5EU0hBS0VfRkFJTEVEAExPQ0tFRABUUkFOU0ZPUk1BVElPTl9BUFBMSUVEAE5PVF9NT0RJRklFRABOT1RfRVhURU5ERUQAQkFORFdJRFRIX0xJTUlUX0VYQ0VFREVEAFNJVEVfSVNfT1ZFUkxPQURFRABIRUFEAEV4cGVjdGVkIEhUVFAvAABeEwAAJhMAADAQAADwFwAAnRMAABUSAAA5FwAA8BIAAAoQAAB1EgAArRIAAIITAABPFAAAfxAAAKAVAAAjFAAAiRIAAIsUAABNFQAA1BEAAM8UAAAQGAAAyRYAANwWAADBEQAA4BcAALsUAAB0FAAAfBUAAOUUAAAIFwAAHxAAAGUVAACjFAAAKBUAAAIVAACZFQAALBAAAIsZAABPDwAA1A4AAGoQAADOEAAAAhcAAIkOAABuEwAAHBMAAGYUAABWFwAAwRMAAM0TAABsEwAAaBcAAGYXAABfFwAAIhMAAM4PAABpDgAA2A4AAGMWAADLEwAAqg4AACgXAAAmFwAAxRMAAF0WAADoEQAAZxMAAGUTAADyFgAAcxMAAB0XAAD5FgAA8xEAAM8OAADOFQAADBIAALMRAAClEQAAYRAAADIXAAC7EwBB+TULAQEAQZA2C+ABAQECAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAQf03CwEBAEGROAteAgMCAgICAgAAAgIAAgIAAgICAgICAgICAgAEAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAIAAgBB/TkLAQEAQZE6C14CAAICAgICAAACAgACAgACAgICAgICAgICAAMABAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgACAEHwOwsNbG9zZWVlcC1hbGl2ZQBBiTwLAQEAQaA8C+ABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAQYk+CwEBAEGgPgvnAQEBAQEBAQEBAQEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBY2h1bmtlZABBsMAAC18BAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQBBkMIACyFlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AQcDCAAstcmFuc2Zlci1lbmNvZGluZ3BncmFkZQ0KDQoNClNNDQoNClRUUC9DRS9UU1AvAEH5wgALBQECAAEDAEGQwwAL4AEEAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB+cQACwUBAgABAwBBkMUAC+ABBAEBBQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAQfnGAAsEAQAAAQBBkccAC98BAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB+sgACwQBAAACAEGQyQALXwMEAAAEBAQEBAQEBAQEBAUEBAQEBAQEBAQEBAQABAAGBwQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEAEH6ygALBAEAAAEAQZDLAAsBAQBBqssAC0ECAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBB+swACwQBAAABAEGQzQALAQEAQZrNAAsGAgAAAAACAEGxzQALOgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQfDOAAuWAU5PVU5DRUVDS09VVE5FQ1RFVEVDUklCRUxVU0hFVEVBRFNFQVJDSFJHRUNUSVZJVFlMRU5EQVJWRU9USUZZUFRJT05TQ0hTRUFZU1RBVENIR0VPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFSFRUUC9BRFRQLw==', 'base64') +const wasmBase64 = 'AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAn9/AGABfwBgBH9/f38Bf2AAAGADf39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQAEA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAAzQzBQYAAAMAAAAAAAADAQMAAwMDAAACAAAAAAICAgICAgICAgIBAQEBAQEBAQEDAAADAAAABAUBcAESEgUDAQACBggBfwFBgNgECwfFBygGbWVtb3J5AgALX2luaXRpYWxpemUACBlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALbGxodHRwX2luaXQACRhsbGh0dHBfc2hvdWxkX2tlZXBfYWxpdmUANgxsbGh0dHBfYWxsb2MACwZtYWxsb2MAOAtsbGh0dHBfZnJlZQAMBGZyZWUADA9sbGh0dHBfZ2V0X3R5cGUADRVsbGh0dHBfZ2V0X2h0dHBfbWFqb3IADhVsbGh0dHBfZ2V0X2h0dHBfbWlub3IADxFsbGh0dHBfZ2V0X21ldGhvZAAQFmxsaHR0cF9nZXRfc3RhdHVzX2NvZGUAERJsbGh0dHBfZ2V0X3VwZ3JhZGUAEgxsbGh0dHBfcmVzZXQAEw5sbGh0dHBfZXhlY3V0ZQAUFGxsaHR0cF9zZXR0aW5nc19pbml0ABUNbGxodHRwX2ZpbmlzaAAWDGxsaHR0cF9wYXVzZQAXDWxsaHR0cF9yZXN1bWUAGBtsbGh0dHBfcmVzdW1lX2FmdGVyX3VwZ3JhZGUAGRBsbGh0dHBfZ2V0X2Vycm5vABoXbGxodHRwX2dldF9lcnJvcl9yZWFzb24AGxdsbGh0dHBfc2V0X2Vycm9yX3JlYXNvbgAcFGxsaHR0cF9nZXRfZXJyb3JfcG9zAB0RbGxodHRwX2Vycm5vX25hbWUAHhJsbGh0dHBfbWV0aG9kX25hbWUAHxJsbGh0dHBfc3RhdHVzX25hbWUAIBpsbGh0dHBf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a0E+aiECCyABIAI2AhwgAUIANwIQIAJBAnRBsNYAaiEAAkBBhNQAKAIAIgNBASACdCIHcUUEQCAAIAE2AgBBhNQAIAMgB3I2AgAgASAANgIYIAEgATYCCCABIAE2AgwMAQsgBEEZIAJBAXZrQQAgAkEfRxt0IQIgACgCACEAAkADQCAAIgMoAgRBeHEgBEYNASACQR12IQAgAkEBdCECIAMgAEEEcWpBEGoiBygCACIADQALIAcgATYCACABIAM2AhggASABNgIMIAEgATYCCAwBCyADKAIIIgAgATYCDCADIAE2AgggAUEANgIYIAEgAzYCDCABIAA2AggLQaDUAEGg1AAoAgBBAWsiAEF/IAAbNgIACwsHACAALQAoCwcAIAAtACoLBwAgAC0AKwsHACAALQApCwcAIAAvATQLBwAgAC0AMAtAAQR/IAAoAhghASAALwEuIQIgAC0AKCEDIAAoAjghBCAAEDcgACAENgI4IAAgAzoAKCAAIAI7AS4gACABNgIYC8X4AQIHfwN+IAEgAmohBAJAIAAiAygCDCIADQAgAygCBARAIAMgATYCBAsjAEEQayIJJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAygCHCICQQFrDuwB7gEB6AECAwQFBgcICQoLDA0ODxAREucBE+YBFBXlARYX5AEYGRobHB0eHyDvAe0BIeMBIiMkJSYnKCkqK+IBLC0uLzAxMuEB4AEzNN8B3gE1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk/pAVBRUlPdAdwBVNsBVdoBVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gAGBAYIBgwGEAYUBhgGHAYgBiQGKAYsBjAGNAY4BjwGQAZEBkgGTAZQBlQGWAZcBmAGZAZoBmwGcAZ0BngGfAaABoQGiAaMBpAGlAaYBpwGoAakBqgGrAawBrQGuAa8BsAGxAbIBswG0AbUBtgG3AbgBuQG6AbsBvAG9Ab4BvwHAAcEBwgHDAcQBxQHZAdgBxgHXAccB1gHIAckBygHLAcwBzQHOAc8B0AHRAdIB0wHUAQDqAQtBAAzUAQtBDgzTAQtBDQzSAQtBDwzRAQtBEAzQAQtBEQzPAQtBEgzOAQtBEwzNAQtBFAzMAQtBFQzLAQtBFgzKAQtBFwzJAQtBGAzIAQtBGQzHAQtBGgzGAQtBGwzFAQtBHAzEAQtBHQzDAQtBHgzCAQtBHwzBAQtBCAzAAQtBIAy/AQtBIgy+AQtBIQy9AQtBBwy8AQtBIwy7AQtBJAy6AQtBJQy5AQtBJgy4AQtBJwy3AQtBzgEMtgELQSgMtQELQSkMtAELQSoMswELQSsMsgELQc8BDLEBC0EtDLABC0EuDK8BC0EvDK4BC0EwDK0BC0ExDKwBC0EyDKsBC0EzDKoBC0HQAQypAQtBNAyoAQtBOAynAQtBDAymAQtBNQylAQtBNgykAQtBNwyjAQtBPQyiAQtBOQyhAQtB0QEMoAELQQsMnwELQT4MngELQToMnQELQQoMnAELQTsMmwELQTwMmgELQdIBDJkBC0HAAAyYAQtBPwyXAQtBwQAMlgELQQkMlQELQSwMlAELQcIADJMBC0HDAAySAQtBxAAMkQELQcUADJABC0HGAAyPAQtBxwAMjgELQcgADI0BC0HJAAyMAQtBygAMiwELQcsADIoBC0HMAAyJAQtBzQAMiAELQc4ADIcBC0HPAAyGAQtB0AAMhQELQdEADIQBC0HSAAyDAQtB1AAMggELQdMADIEBC0HVAAyAAQtB1gAMfwtB1wAMfgtB2AAMfQtB2QAMfAtB2gAMewtB2wAMegtB0wEMeQtB3AAMeAtB3QAMdwtBBgx2C0HeAAx1C0EFDHQLQd8ADHMLQQQMcgtB4AAMcQtB4QAMcAtB4gAMbwtB4wAMbgtBAwxtC0HkAAxsC0HlAAxrC0HmAAxqC0HoAAxpC0HnAAxoC0HpAAxnC0HqAAxmC0HrAAxlC0HsAAxkC0ECDGMLQe0ADGILQe4ADGELQe8ADGALQfAADF8LQfEADF4LQfIADF0LQfMADFwLQfQADFsLQfUADFoLQfYADFkLQfcADFgLQfgADFcLQfkADFYLQfoADFULQfsADFQLQfwADFMLQf0ADFILQf4ADFELQf8ADFALQYABDE8LQYEBDE4LQYIBDE0LQYMBDEwLQYQBDEsLQYUBDEoLQYYBDEkLQYcBDEgLQYgBDEcLQYkBDEYLQYoBDEULQYsBDEQLQYwBDEMLQY0BDEILQY4BDEELQY8BDEALQZABDD8LQZEBDD4LQZIBDD0LQZMBDDwLQZQBDDsLQZUBDDoLQZYBDDkLQZcBDDgLQZgBDDcLQZkBDDYLQZoBDDULQZsBDDQLQZwBDDMLQZ0BDDILQZ4BDDELQZ8BDDALQaABDC8LQaEBDC4LQaIBDC0LQaMBDCwLQaQBDCsLQaUBDCoLQaYBDCkLQacBDCgLQagBDCcLQakBDCYLQaoBDCULQasBDCQLQawBDCMLQa0BDCILQa4BDCELQa8BDCALQbABDB8LQbEBDB4LQbIBDB0LQbMBDBwLQbQBDBsLQbUBDBoLQbYBDBkLQbcBDBgLQbgBDBcLQQEMFgtBuQEMFQtBugEMFAtBuwEMEwtBvAEMEgtBvQEMEQtBvgEMEAtBvwEMDwtBwAEMDgtBwQEMDQtBwgEMDAtBwwEMCwtBxAEMCgtBxQEMCQtBxgEMCAtB1AEMBwtBxwEMBgtByAEMBQtByQEMBAtBygEMAwtBywEMAgtBzQEMAQtBzAELIQIDQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAMCfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAn8CQAJAAkACQAJAAkACQAJ/AkACQAJAAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAMCfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCACDtQBAAECAwQFBgcICQoLDA0ODxARFBUWFxgZGhscHR4fICEjJCUnKCmIA4cDhQOEA/wC9QLuAusC6ALmAuMC4ALfAt0C2wLWAtUC1ALTAtICygLJAsgCxwLGAsUCxALDAr0CvAK6ArkCuAK3ArYCtQK0ArICsQKsAqoCqAKnAqYCpQKkAqMCogKhAqACnwKbApoCmQKYApcCkAKIAoQCgwKCAvkB9gH1AfQB8wHyAfEB8AHvAe0B6wHoAeMB4QHgAd8B3gHdAdwB2wHaAdkB2AHX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QEBAQEBAQEBAQEBAAEALQQAhAiADQQA2AhwgA0G3CzYCECADQQI2AgwgAyABQQFqNgIUDIEDCyADQS9qIQIDQCABIARGBEBBISECDIIDCwJAAkACQCABLQAAIgBBCWsOGAIAKioBKioqKioqKioqKioqKioqKioqAigLIAFBAWohASADQS9qLQAAQQFxRQ0LDBkLIAFBAWohAQwYCyABQQFqIQEgAi0AAEECcQ0AC0EAIQIgA0EANgIcIAMgATYCFCADQc4UNgIQIANBDDYCDAyAAwsgAUEBaiEBC0EAIQACQCADKAI4IgJFDQAgAigCVCICRQ0AIAMgAhEAACEACyAADQEM0QILIANCADcDIAw8CyAAQRVGBEAgA0EkNgIcIAMgATYCFCADQYYaNgIQIANBFTYCDEEAIQIM/QILQQAhAiADQQA2AhwgAyABNgIUIANB4g02AhAgA0EUNgIMDPwCCyADKAIEIQBBACECIANBADYCBCADIAAgASAMp2oiARAxIgBFDSsgA0EHNgIcIAMgATYCFCADIAA2AgwM+wILIAMtAC5BwABxRQ0BC0EAIQACQCADKAI4IgJFDQAgAigCUCICRQ0AIAMgAhEAACEACyAARQ0rIABBFUYEQCADQQo2AhwgAyABNgIUIANB8Rg2AhAgA0EVNgIMQQAhAgz6AgtBACECIANBADYCHCADIAE2AhQgA0GLDDYCECADQRM2AgwM+QILQQAhAiADQQA2AhwgAyABNgIUIANBsRQ2AhAgA0ECNgIMDPgCC0EAIQIgA0EANgIcIAMgATYCFCADQYwUNgIQIANBGTYCDAz3AgtBACECIANBADYCHCADIAE2AhQgA0HRHDYCECADQRk2AgwM9gILIABBFUYNPUEAIQIgA0EANgIcIAMgATYCFCADQaIPNgIQIANBIjYCDAz1AgsgAygCBCEAQQAhAiADQQA2AgQgAyAAIAEQMiIARQ0oIANBDTYCHCADIAE2AhQgAyAANgIMDPQCCyAAQRVGDTpBACECIANBADYCHCADIAE2AhQgA0GiDzYCECADQSI2AgwM8wILIAMoAgQhAEEAIQIgA0EANgIEIAMgACABEDIiAEUEQCABQQFqIQEMKAsgA0EONgIcIAMgADYCDCADIAFBAWo2AhQM8gILIABBFUYNN0EAIQIgA0EANgIcIAMgATYCFCADQaIPNgIQIANBIjYCDAzxAgsgAygCBCEAQQAhAiADQQA2AgQgAyAAIAEQMiIARQRAIAFBAWohAQwnCyADQQ82AhwgAyAANgIMIAMgAUEBajYCFAzwAgtBACECIANBADYCHCADIAE2AhQgA0HoFjYCECADQRk2AgwM7wILIABBFUYNM0EAIQIgA0EANgIcIAMgATYCFCADQc4MNgIQIANBIzYCDAzuAgsgAygCBCEAQQAhAiADQQA2AgQgAyAAIAEQMyIARQ0lIANBETYCHCADIAE2AhQgAyAANgIMDO0CCyAAQRVGDTBBACECIANBADYCHCADIAE2AhQgA0HODDYCECADQSM2AgwM7AILIAMoAgQhAEEAIQIgA0EANgIEIAMgACABEDMiAEUEQCABQQFqIQEMJQsgA0ESNgIcIAMgADYCDCADIAFBAWo2AhQM6wILIANBL2otAABBAXFFDQELQRUhAgzPAgtBACECIANBADYCHCADIAE2AhQgA0HoFjYCECADQRk2AgwM6AILIABBO0cNACABQQFqIQEMDAtBACECIANBADYCHCADIAE2AhQgA0GYFzYCECADQQI2AgwM5gILIABBFUYNKEEAIQIgA0EANgIcIAMgATYCFCADQc4MNgIQIANBIzYCDAzlAgsgA0EUNgIcIAMgATYCFCADIAA2AgwM5AILIAMoAgQhAEEAIQIgA0EANgIEIAMgACABEDMiAEUEQCABQQFqIQEM3AILIANBFTYCHCADIAA2AgwgAyABQQFqNgIUDOMCCyADKAIEIQBBACECIANBADYCBCADIAAgARAzIgBFBEAgAUEBaiEBDNoCCyADQRc2AhwgAyAANgIMIAMgAUEBajYCFAziAgsgAEEVRg0jQQAhAiADQQA2AhwgAyABNgIUIANBzgw2AhAgA0EjNgIMDOECCyADKAIEIQBBACECIANBADYCBCADIAAgARAzIgBFBEAgAUEBaiEBDB0LIANBGTYCHCADIAA2AgwgAyABQQFqNgIUDOACCyADKAIEIQBBACECIANBADYCBCADIAAgARAzIgBFBEAgAUEBaiEBDNYCCyADQRo2AhwgAyAANgIMIAMgAUEBajYCFAzfAgsgAEEVRg0fQQAhAiADQQA2AhwgAyABNgIUIANBog82AhAgA0EiNgIMDN4CCyADKAIEIQBBACEC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DLMCCyABIARGBEBB6QEhAgyzAgsgAS0AAEHIAEYNASADQQE6ACgLQbYBIQIMlwILQcoBIQIMlgILIAEgBEcEQCADQQw2AgggAyABNgIEQckBIQIMlgILQegBIQIMrwILIAEgBEYEQEHnASECDK8CCyABLQAAQcgARw0EIAFBAWohAUHIASECDJQCCyABIARGBEBB5gEhAgyuAgsCQAJAIAEtAABBxQBrDhAABQUFBQUFBQUFBQUFBQUBBQsgAUEBaiEBQcYBIQIMlAILIAFBAWohAUHHASECDJMCC0HlASECIAEgBEYNrAIgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABB99MAai0AAEcNAyAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMrQILIAMoAgQhACADQgA3AwAgAyAAIAZBAWoiARAtIgBFBEBB1AEhAgyTAgsgA0HkATYCHCADIAE2AhQgAyAANgIMQQAhAgysAgtB4wEhAiABIARGDasCIAMoAgAiACAEIAFraiEFIAEgAGtBAWohBgJAA0AgAS0AACAAQfXTAGotAABHDQIgAEEBRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADKwCCyADQYEEOwEoIAMoAgQhACADQgA3AwAgAyAAIAZBAWoiARAtIgANAwwCCyADQQA2AgALQQAhAiADQQA2AhwgAyABNgIUIANB0B42AhAgA0EINgIMDKkCC0HFASECDI4CCyADQeIBNgIcIAMgATYCFCADIAA2AgxBACECDKcCC0EAIQACQCADKAI4IgJFDQAgAigCOCICRQ0AIAMgAhEAACEACyAARQ1lIABBFUcEQCADQQA2AhwgAyABNgIUIANB1A42AhAgA0EgNgIMQQAhAgynAgsgA0GFATYCHCADIAE2AhQgA0HXGjYCECADQRU2AgxBACECDKYCC0HhASECIAQgASIARg2lAiAEIAFrIAMoAgAiAWohBSAAIAFrQQRqIQYCQANAIAAtAAAgAUHw0wBqLQAARw0BIAFBBEYNAyABQQFqIQEgBCAAQQFqIgBHDQALIAMgBTYCAAymAgsgA0EANgIcIAMgADYCFCADQYQ3NgIQIANBCDYCDCADQQA2AgBBACECDKUCCyABIARHBEAgA0ENNgIIIAMgATYCBEHCASECDIsCC0HgASECDKQCCyADQQA2AgAgBkEBaiEBC0HDASECDIgCCyABIARGBEBB3wEhAgyiAgsgAS0AAEEwayIAQf8BcUEKSQRAIAMgADoAKiABQQFqIQFBwQEhAgyIAgsgAygCBCEAIANBADYCBCADIAAgARAuIgBFDYgCIANB3gE2AhwgAyABNgIUIAMgADYCDEEAIQIMoQILIAEgBEYEQEHdASECDKECCwJAIAEtAABBLkYEQCABQQFqIQEMAQsgAygCBCEAIANBADYCBCADIAAgARAuIgBFDYkCIANB3AE2AhwgAyABNgIUIAMgADYCDEEAIQIMoQILQcABIQIMhgILIAEgBEYEQEHbASECDKACC0EAIQBBASEFQQEhB0EAIQICQAJAAkACQAJAAn8CQAJAAkACQAJAAkACQCABLQAAQTBrDgoKCQABAgMEBQYICwtBAgwGC0EDDAULQQQMBAtBBQwDC0EGDAILQQcMAQtBCAshAkEAIQVBACEHDAILQQkhAkEBIQBBACEFQQAhBwwBC0EAIQVBASECCyADIAI6ACsgAUEBaiEBAkACQCADLQAuQRBxDQACQAJAAkAgAy0AKg4DAQACBAsgB0UNAwwCCyAADQEMAgsgBUUNAQsgAygCBCEAIANBADYCBCADIAAgARAuIgBFDQIgA0HYATYCHCADIAE2AhQgAyAANgIMQQAhAgyiAgsgAygCBCEAIANBADYCBCADIAAgARAuIgBFDYsCIANB2QE2AhwgAyABNgIUIAMgADYCDEEAIQIMoQILIAMoAgQhACADQQA2AgQgAyAAIAEQLiIARQ2JAiADQdoBNgIcIAMgATYCFCADIAA2AgwMoAILQb8BIQIMhQILQQAhAAJAIAMoAjgiAkUNACACKAI8IgJFDQAgAyACEQAAIQALAkAgAARAIABBFUYNASADQQA2AhwgAyABNgIUIANBnA02AhAgA0EhNgIMQQAhAgygAgtBvgEhAgyFAgsgA0HXATYCHCADIAE2AhQgA0HWGTYCECADQRU2AgxBACECDJ4CCyABIARGBEBB1wEhAgyeAgsCQCABLQAAQSBGBEAgA0EAOwE0IAFBAWohAQwBCyADQQA2AhwgAyABNgIUIANB6xA2AhAgA0EJNgIMQQAhAgyeAgtBvQEhAgyDAgsgASAERgRAQdYBIQIM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LgsgAUEBaiEBQZcBIQIM2AELIAFBAWohAUEiDCsLIAEgBEYEQEGvASECDPEBCyABLQAAQdAARw0rIAFBAWohAUGWASECDNYBCyABIARGBEBBrgEhAgzwAQsCQAJAIAEtAABBxgBrDgsALCwsLCwsLCwsASwLIAFBAWohAUGUASECDNYBCyABQQFqIQFBlQEhAgzVAQtBrQEhAiABIARGDe4BIAMoAgAiACAEIAFraiEFIAEgAGtBA2ohBgJAA0AgAS0AACAAQazTAGotAABHDSggAEEDRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADO8BCyADQQA2AgAgBkEBaiEBQQ0MKAtBrAEhAiABIARGDe0BIAMoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQeHTAGotAABHDScgAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADO4BCyADQQA2AgAgBkEBaiEBQQwMJwtBqwEhAiABIARGDewBIAMoAgAiACAEIAFraiEFIAEgAGtBAWohBgJAA0AgAS0AACAAQarTAGotAABHDSYgAEEBRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADO0BCyADQQA2AgAgBkEBaiEBQQMMJgtBqgEhAiABIARGDesBIAMoAgAiACAEIAFraiEFIAEgAGtBAWohBgJAA0AgAS0AACAAQajTAGotAABHDSUgAEEBRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADOwBCyADQQA2AgAgBkEBaiEBQSYMJQsgASAERgRAQakBIQIM6wELAkACQCABLQAAQdQAaw4CAAEnCyABQQFqIQFBjwEhAgzRAQsgAUEBaiEBQZABIQIM0AELQagBIQIgASAERg3pASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEGm0wBqLQAARw0jIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzqAQsgA0EANgIAIAZBAWohAUEnDCMLQacBIQIgASAERg3oASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEGk0wBqLQAARw0iIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzpAQsgA0EANgIAIAZBAWohAUEcDCILQaYBIQIgASAERg3nASADKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEGe0wBqLQAARw0hIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzoAQsgA0EANgIAIAZBAWohAUEGDCELQaUBIQIgASAERg3mASADKAIAIgAgBCABa2ohBSABIABrQQRqIQYCQANAIAEtAAAgAEGZ0wBqLQAARw0gIABBBEYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAznAQsgA0EANgIAIAZBAWohAUEZDCALIAEgBEYEQEGkASECDOYBCwJAAkACQAJAIAEtAABBLWsOIwAkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJAEkJCQkJAIkJCQDJAsgAUEBaiEBQYQBIQIMzgELIAFBAWohAUGFASECDM0BCyABQQFqIQFBigEhAgzMAQsgAUEBaiEBQYsBIQIMywELQaMBIQIgASAERg3kASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEGX0wBqLQAARw0eIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzlAQsgA0EANgIAIAZBAWohAUELDB4LIAEgBEYEQEGiASECDOQBCwJAAkAgAS0AAEHBAGsOAwAgASALIAFBAWohAUGGASECDMoBCyABQQFqIQFBiQEhAgzJAQsgASAERgRAQaEBIQIM4wELAkACQCABLQAAQcEAaw4PAB8fHx8fHx8fHx8fHx8BHwsgAUEBaiEBQYcBIQIMyQELIAFBAWohAUGIASECDMgBCyABIARGBEBBoAEhAgziAQsgAS0AAEHMAEcNHCABQQFqIQFBCgwbC0GfASECIAEgBEYN4AEgAygCACIAIAQgAWtqIQUgASAAa0EFaiEGAkADQCABLQAAIABBkdMAai0AAEcNGiAAQQVGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM4QELIANBADYCACAGQQFqIQFBHgwaC0GeASECIAEgBEYN3wEgAygCACIAIAQgAWtqIQUgASAAa0EGaiEGAkADQCABLQAAIABBitMAai0AAEcNGSAAQQZGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM4AELIANBADYCACAGQQFqIQFBFQwZC0GdASECIAEgBEYN3gEgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABBh9MAai0AAEcNGCAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM3wELIANBADYCACAGQQFqIQFBFwwYC0GcASECIAEgBEYN3QEgAygCACIAIAQgAWtqIQUgASAAa0EFaiEGAkADQCABLQAAIABBgdMAai0AAEcNFyAAQQVGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM3gELIANBADYCACAGQQFqIQFBGAwXCyABIARGBEBBmwEhAgzdAQsCQAJAIAEtAABByQBrDgcAGRkZGRkBGQsgAUEBaiEBQYEBIQIMwwELIAFBAWohAUGCASECDMIBC0GaASECIAEgBEYN2wEgAygCACIAIAQgAWtqIQUgASAAa0EBaiEGAkADQCABLQAAIABB5tMAai0AAEcNFSAAQQFGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM3AELIANBADYCACAGQQFqIQFBCQwVC0GZASECIAEgBEYN2gEgAygCACIAIAQgAWtqIQUgASAAa0EBaiEGAkADQCABLQAAIABB5NMAai0AAEcNFCAAQQFGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM2wELIANBADYCACAGQQFqIQFBHwwUC0GYASECIAEgBEYN2QEgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABB/tIAai0AAEcNEyAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM2gELIANBADYCACAGQQFqIQFBAgwTC0GXASECIAEgBEYN2AEgAygCACIAIAQgAWtqIQUgASAAa0EBaiEGA0AgAS0AACAAQfzSAGotAABHDREgAEEBRg0CIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADNgBCyABIARGBEBBlgEhAgzYAQtBASABLQAAQd8ARw0RGiABQQFqIQFB/QAhAgy9AQsgA0EANgIAIAZBAWohAUH+ACECDLwBC0GVASECIAEgBEYN1QEgAygCACIAIAQgAWtqIQUgASAAa0EIaiEGAkADQCABLQAAIABBxNMAai0AAEcNDyAAQQhGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM1gELIANBADYCACAGQQFqIQFBKQwPC0GUASECIAEgBEYN1AEgAygCACIAIAQgAWtqIQUgASAAa0EDaiEGAkADQCABLQAAIABB+NIAai0AAEcNDiAAQQNGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM1QELIANBADYCACAGQQFqIQFBLQwOCyABIARGBEBBkwEhAgzUAQsgAS0AAEHFAEcNDiABQQFqIQFB+gAhAgy5AQsgASAERgRAQZIBIQIM0wELAkACQCABLQAAQcwAaw4IAA8PDw8PDwEPCyABQQFqIQFB+AAhAgy5AQsgAUEBaiEBQfkAIQIMuAELQZEBIQIgASAERg3RASADKAIAIgAgBCABa2ohBSABIABrQQRqIQYCQANAIAEtAAAgAEHz0gBqLQAARw0LIABBBEYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzSAQsgA0EANgIAIAZBAWohAUEjDAsLQZABIQIgASAERg3QASADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEHw0gBqLQAARw0KIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzRAQsgA0EANgIAIAZBAWohAUEADAoLIAEgBEYEQEGPASECDNABCwJAAkAgAS0AAEHIAGsOCAAMDAwMDAwBDAsgAUEBaiEBQfMAIQIMtgELIAFBAWohAUH2ACECDLUBCyABIARGBEBBjgEhAgzPAQsCQAJAIAEtAABBzgBrDgMACwELCyABQQFqIQFB9AAhAgy1AQsgAUEBaiEBQfUAIQIMtAELIAEgBEYEQEGNASECDM4BCyABLQAAQdkARw0IIAFBAWohAUEIDAcLQYwBIQIgASAERg3MASADKAIAIgAgBCABa2ohBSABIABrQQNqIQYCQANAIAEtAAAgAEHs0gBqLQAARw0GIABBA0YNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzNAQsgA0EANgIAIAZBAWohAUEFDAYLQYsBIQIgASAERg3LASADKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEHm0gBqLQAARw0FIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzMAQsgA0EANgIAIAZBAWohAUEWDAULQYoBIQIgASAERg3KASADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEHh0wBqLQAARw0EIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzLAQsgA0EANgIAIAZBAWohAUEQDAQLIAEgBEYEQEGJASECDMoBCwJAAkAgAS0AAEHDAGsODAAGBgYGBgYGBgYGAQYLIAFBAWohAUHvACECDLABCyABQQFqIQFB8AAhAgyvAQtBiAEhAiABIARGDcgBIAMoAgAiACAEIAFraiEFIAEgAGtBBWohBgJAA0AgAS0AACAAQeDSAGotAABHDQIgAEEFRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADMkBCyADQQA2AgAgBkEBaiEBQSQMAgsgA0EANgIADAILIAEgBEYEQEGHASECDMcBCyABLQAAQcwARw0BIAFBAWohAUETCzoAKSADKAIEIQAgA0EANgIEIAMgACABEC0iAA0CDAELQQAhAiADQQA2AhwgAyABNgIUIANB6R42AhAgA0EGNgIMDMQBC0HuACECDKkBCyADQYYBNgIcIAMgATYCFCADIAA2AgxBACECDMIBC0EAIQACQCADKAI4IgJFDQAgAigCOCICRQ0AIAMgAhEAACEACyAARQ0AIABBFUYNASADQQA2AhwgAyABNgIUIANB1A42AhAgA0EgNgIMQQAhAgzBAQtB7QAhAgymAQsgA0GFATYCHCADIAE2AhQgA0HXGjYCECADQRU2AgxBACECDL8BCyABIARGBEBBhQEhAgy/AQsCQCABLQAAQSBGBEAgAUEBaiEBDAELIANBADYCHCADIAE2AhQgA0GGHjYCECADQQY2AgxBACECDL8BC0ECIQIMpAELA0AgAS0AAEEgRw0CIAQgAUEBaiIBRw0AC0GEASECDL0BCyABIARGBEBBgwEhAgy9AQsCQCABLQAAQQlrDgRAAABAAAtB6wAhAgyiAQsgAy0AKUEFRgRAQewAIQIMogELQeoAIQIMoQELIAEgBEYEQEGCASECDLsBCyADQQ82AgggAyABNgIEDAoLIAEgBEYEQEGBASECDLoBCwJAIAEtAABBCWsOBD0AAD0AC0HpACECDJ8BCyABIARHBEAgA0EPNgIIIAMgATYCBEHnACECDJ8BC0GAASECDLgBCwJAIAEgBEcEQANAIAEtAABB4M4Aai0AACIAQQNHBEACQCAAQQFrDgI/AAQLQeYAIQIMoQELIAQgAUEBaiIBRw0AC0H+ACECDLkBC0H+ACECDLgBCyADQQA2AhwgAyABNgIUIANBxh82AhAgA0EHNgIMQQAhAgy3AQsgASAERgRAQf8AIQIMtwELAkACQAJAIAEtAABB4NAAai0AAEEBaw4DPAIAAQtB6AAhAgyeAQsgA0EANgIcIAMgATYCFCADQYYSNgIQIANBBzYCDEEAIQIMtwELQeAAIQIMnAELIAEgBEcEQCABQQFqIQFB5QAhAgycAQtB/QAhAgy1AQsgBCABIgBGBEBB/AAhAgy1AQsgAC0AACIBQS9GBEAgAEEBaiEBQeQAIQIMmwELIAFBCWsiAkEXSw0BIAAhAUEBIAJ0QZuAgARxDTcMAQsgBCABIgBGBEBB+wAhAgy0AQsgAC0AAEEvRw0AIABBAWohAQwDC0EAIQIgA0EANgIcIAMgADYCFCADQcYfNgIQIANBBzYCDAyyAQsCQAJAAkACQAJAA0AgAS0AAEHgzABqLQAAIgBBBUcEQAJAAkAgAEEBaw4IPQUGBwgABAEIC0HhACECDJ8BCyABQQFqIQFB4wAhAgyeAQsgBCABQQFqIgFHDQALQfoAIQIMtgELIAFBAWoMFAsgAygCBCEAIANBADYCBCADIAAgARArIgBFDR4gA0HbADYCHCADIAE2AhQgAyAANgIMQQAhAgy0AQsgAygCBCEAIANBADYCBCADIAAgARArIgBFDR4gA0HdADYCHCADIAE2AhQgAyAANgIMQQAhAgyzAQsgAygCBCEAIANBADYCBCADIAAgARArIgBFDR4gA0HwADYCHCADIAE2AhQgAyAANgIMQQAhAgyyAQsgA0EANgIcIAMgATYCFCADQcsPNgIQIANBBzYCDEEAIQIMsQELIAEgBEYEQEH5ACECDLEBCwJAIAEtAABB4MwAai0AAEEBaw4INAQFBgAIAgMHCyABQQFqIQELQQMhAgyVAQsgAUEBagwNC0EAIQIgA0EANgIcIANBoxI2AhAgA0EHNgIMIAMgAUEBajYCFAytAQsgAygCBCEAIANBADYCBCADIAAgARArIgBFDRYgA0HbADYCHCADIAE2AhQgAyAANgIMQQAhAgysAQsgAygCBCEAIANBADYCBCADIAAgARArIgBFDRYgA0HdADYCHCADIAE2AhQgAyAANgIMQQAhAgyrAQsgAygCBCEAIANBADYCBCADIAAgARArIgBFDRYgA0HwADYCHCADIAE2AhQgAyAANgIMQQAhAgyqAQsgA0EANgIcIAMgATYCFCADQcsPNgIQIANBBzYCDEEAIQIMqQELQeIAIQIMjgELIAEgBEYEQEH4ACECDKgBCyABQQFqDAILIAEgBEYEQEH3ACECDKcBCyABQQFqDAELIAEgBEYNASABQQFqCyEBQQQhAgyKAQtB9gAhAgyjAQsDQCABLQAAQeDKAGotAAAiAEECRwRAIABBAUcEQEHfACECDIsBCwwnCyAEIAFBAWoiAUcNAAtB9QAhAgyiAQsgASAERgRAQfQAIQIMogELAkAgAS0AAEEJaw43JQMGJQQGBgYGBgYGBgYGBgYGBgYGBgYFBgYCBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAAYLIAFBAWoLIQFBBSECDIYBCyABQQFqDAYLIAMoAgQhACADQQA2AgQgAyAAIAEQKyIARQ0IIANB2wA2AhwgAyABNgIUIAMgADYCDEEAIQIMngELIAMoAgQhACADQQA2AgQgAyAAIAEQKyIARQ0IIANB3QA2AhwgAyABNgIUIAMgADYCDEEAIQIMnQELIAMoAgQhACADQQA2AgQgAyAAIAEQKyIARQ0IIANB8AA2AhwgAyABNgIUIAMgADYCDEEAIQIMnAELIANBADYCHCADIAE2AhQgA0G8EzYCECADQQc2AgxBACECDJsBCwJAAkACQAJAA0AgAS0AAEHgyABqLQAAIgBBBUcEQAJAIABBAWsOBiQDBAUGAAYLQd4AIQIMhgELIAQgAUEBaiIBRw0AC0HzACECDJ4BCyADKAIEIQAgA0EANgIEIAMgACABECsiAEUNByADQdsANgIcIAMgATYCFCADIAA2AgxBACECDJ0BCyADKAIEIQAgA0EANgIEIAMgACABECsiAEUNByADQd0ANgIcIAMgATYCFCADIAA2AgxBACECDJwBCyADKAIEIQAgA0EANgIEIAMgACABECsiAEUNByADQfAANgIcIAMgATYCFCADIAA2AgxBACECDJsBCyADQQA2AhwgAyABNgIUIANB3Ag2AhAgA0EHNgIMQQAhAgyaAQsgASAERg0BIAFBAWoLIQFBBiECDH4LQfIAIQIMlwELAkACQAJAAkADQCABLQAAQeDGAGotAAAiAEEFRwRAIABBAWsOBB8CAwQFCyAEIAFBAWoiAUcNAAtB8QAhAgyaAQsgAygCBCEAIANBADYCBCADIAAgARArIgBFDQMgA0HbADYCHCADIAE2AhQgAyAANgIMQQAhAgyZAQsgAygCBCEAIANBADYCBCADIAAgARArIgBFDQMgA0HdADYCHCADIAE2AhQgAyAANgIMQQAhAgyYAQsgAygCBCEAIANBADYCBCADIAAgARArIgBFDQMgA0HwADYCHCADIAE2AhQgAyAANgIMQQAhAgyXAQsgA0EANgIcIAMgATYCFCADQbQKNgIQIANBBzYCDEEAIQIMlgELQc4AIQIMewtB0AAhAgx6C0HdACECDHkLIAEgBEYEQEHwACECDJMBCwJAIAEtAABBCWsOBBYAABYACyABQQFqIQFB3AAhAgx4CyABIARGBEBB7wAhAgySAQsCQCABLQAAQQlrDgQVAAAVAAtBACEAAkAgAygCOCICRQ0AIAIoAjAiAkUNACADIAIRAAAhAAsgAEUEQEHTASECDHgLIABBFUcEQCADQQA2AhwgAyABNgIUIANBwQ02AhAgA0EaNgIMQQAhAgySAQsgA0HuADYCHCADIAE2AhQgA0HwGTYCECADQRU2AgxBACECDJEBC0HtACECIAEgBEYNkAEgAygCACIAIAQgAWtqIQUgASAAa0EDaiEGAkADQCABLQAAIABB18YAai0AAEcNBCAAQQNGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMkQELIANBADYCACAGQQFqIQEgAy0AKSIAQSNrQQtJDQQCQCAAQQZLDQBBASAAdEHKAHFFDQAMBQtBACECIANBADYCHCADIAE2AhQgA0HlCTYCECADQQg2AgwMkAELQewAIQIgASAERg2PASADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEHUxgBqLQAARw0DIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAyQAQsgA0EANgIAIAZBAWohASADLQApQSFGDQMgA0EANgIcIAMgATYCFCADQYkKNgIQIANBCDYCDEEAIQIMjwELQesAIQIgASAERg2OASADKAIAIgAgBCABa2ohBSABIABrQQNqIQYCQANAIAEtAAAgAEHQxgBqLQAARw0CIABBA0YNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAyPAQsgA0EANgIAIAZBAWohASADLQApIgBBI0kNAiAAQS5GDQIgA0EANgIcIAMgATYCFCADQcEJNgIQIANBCDYCDEEAIQIMjgELIANBADYCAAtBACECIANBADYCHCADIAE2AhQgA0GENzYCECADQQg2AgwMjAELQdgAIQIMcQsgASAERwRAIANBDTYCCCADIAE2AgRB1wAhAgxxC0HqACECDIoBCyABIARGBEBB6QAhAgyKAQsgAS0AAEEwayIAQf8BcUEKSQRAIAMgADoAKiABQQFqIQFB1gAhAgxwCyADKAIEIQAgA0EANgIEIAMgACABEC4iAEUNdCADQegANgIcIAMgATYCFCADIAA2AgxBACECDIkBCyABIARGBEBB5wAhAgyJAQsCQCABLQAAQS5GBEAgAUEBaiEBDAELIAMoAgQhACADQQA2AgQgAyAAIAEQLiIARQ11IANB5gA2AhwgAyABNgIUIAMgADYCDEEAIQIMiQELQdUAIQIMbgsgASAERgRAQeUAIQIMiAELQQAhAEEBIQVBASEHQQAhAgJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAIAEtAABBMGsOCgoJAAECAwQFBggLC0ECDAYLQQMMBQtBBAwEC0EFDAMLQQYMAgtBBwwBC0EICyECQQAhBUEAIQcMAgtBCSECQQEhAEEAIQVBACEHDAELQQAhBUEBIQILIAMgAjoAKyABQQFqIQECQAJAIAMtAC5BEHENAAJAAkACQCADLQAqDgMBAAIECyAHRQ0DDAILIAANAQwCCyAFRQ0BCyADKAIEIQAgA0EANgIEIAMgACABEC4iAEUNAiADQeIANgIcIAMgATYCFCADIAA2AgxBACECDIoBCyADKAIEIQAgA0EANgIEIAMgACABEC4iAEUNdyADQeMANgIcIAMgATYCFCADIAA2AgxBACECDIkBCyADKAIEIQAgA0EANgIEIAMgACABEC4iAEUNdSADQeQANgIcIAMgATYCFCADIAA2AgwMiAELQdMAIQIMbQsgAy0AKUEiRg2AAUHSACECDGwLQQAhAAJAIAMoAjgiAkUNACACKAI8IgJFDQAgAyACEQAAIQALIABFBEBB1AAhAgxsCyAAQRVHBEAgA0EANgIcIAMgATYCFCADQZwNNgIQIANBITYCDEEAIQIMhgELIANB4QA2AhwgAyABNgIUIANB1hk2AhAgA0EVNgIMQQAhAgyFAQsgASAERgRAQeAAIQIMhQELAkACQAJAAkACQCABLQAAQQprDgQBBAQABAsgAUEBaiEBDAELIAFBAWohASADQS9qLQAAQQFxRQ0BC0HRACECDGwLIANBADYCHCADIAE2AhQgA0GIETYCECADQQk2AgxBACECDIUBCyADQQA2AhwgAyABNgIUIANBiBE2AhAgA0EJNgIMQQAhAgyEAQsgASAERgRAQd8AIQIMhAELIAEtAABBCkYEQCABQQFqIQEMCQsgAy0ALkHAAHENCCADQQA2AhwgAyABNgIUIANBiBE2AhAgA0ECNgIMQQAhAgyDAQsgASAERgRAQd0AIQIMgwELIAEtAAAiAkENRgRAIAFBAWohAUHPACECDGkLIAEhACACQQlrDgQFAQEFAQsgBCABIgBGBEBB3AAhAgyCAQsgAC0AAEEKRw0AIABBAWoMAgtBACECIANBADYCHCADIAA2AhQgA0G1LDYCECADQQc2AgwMgAELIAEgBEYEQEHbACECDIABCwJAIAEtAABBCWsOBAMAAAMACyABQQFqCyEBQc0AIQIMZAsgASAERgRAQdoAIQIMfgsgAS0AAEEJaw4EAAEBAAELQQAhAiADQQA2AhwgA0HsETYCECADQQc2AgwgAyABQQFqNgIUDHwLIANBgBI7ASpBACEAAkAgAygCOCICRQ0AIAIoAjAiAkUNACADIAIRAAAhAAsgAEUNACAAQRVHDQEgA0HZADYCHCADIAE2AhQgA0HwGTYCECADQRU2AgxBACECDHsLQcwAIQIMYAsgA0EANgIcIAMgATYCFCADQcENNgIQIANBGjYCDEEAIQIMeQsgASAERgRAQdkAIQIMeQsgAS0AAEEgRw06IAFBAWohASADLQAuQQFxDTogA0EANgIcIAMgATYCFCADQa0bNgIQIANBHjYCDEEAIQIMeAsgASAERgRAQdgAIQIMeAsCQAJAAkACQAJAIAEtAAAiAEEKaw4EAgMD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AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABLQAAQTBrDjcVFAABAgMEBQYHFhYWFhYWFggJCgsMDRYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWDg8QERITFgtCAiEKDBQLQgMhCgwTC0IEIQoMEgtCBSEKDBELQgYhCgwQC0IHIQoMDwtCCCEKDA4LQgkhCgwNC0IKIQoMDAtCCyEKDAsLQgwhCgwKC0INIQoMCQtCDiEKDAgLQg8hCgwHC0IKIQoMBgtCCyEKDAULQgwhCgwEC0INIQoMAwtCDiEKDAILQg8hCgwBC0IBIQoLIAFBAWohASADKQMgIgtC//////////8PWARAIAMgC0IEhiAKhDcDIAwCC0EAIQIgA0EANgIcIAMgATYCFCADQa0JNgIQIANBDDYCDAwfC0ElIQIMBAtBJiECDAMLIAMgAToALCADQQA2AgAgB0EBaiEBQQwhAgwCCyADQQA2AgAgBkEBaiEBQQohAgwBCyABQQFqIQFBCCECDAALAAtBACECIANBADYCHCADIAE2AhQgA0HVEDYCECADQQk2AgwMGAtBACECIANBADYCHCADIAE2AhQgA0HXCjYCECADQQk2AgwMFwtBACECIANBADYCHCADIAE2AhQgA0G/EDYCECADQQk2AgwMFgtBACECIANBADYCHCADIAE2AhQgA0GkETYCECADQQk2AgwMFQtBACECIANBADYCHCADIAE2AhQgA0HVEDYCECADQQk2AgwMFAtBACECIANBADYCHCADIAE2AhQgA0HXCjYCECADQQk2AgwMEwtBACECIANBADYCHCADIAE2AhQgA0G/EDYCECADQQk2AgwMEgtBACECIANBADYCHCADIAE2AhQgA0GkETYCECADQQk2AgwMEQtBACECIANBADYCHCADIAE2AhQgA0G/FjYCECADQQ82AgwMEAtBACECIANBADYCHCADIAE2AhQgA0G/FjYCECADQQ82AgwMDwtBACECIANBADYCHCADIAE2AhQgA0HIEjYCECADQQs2AgwMDgtBACECIANBADYCHCADIAE2AhQgA0GVCTYCECADQQs2AgwMDQtBACECIANBADYCHCADIAE2AhQgA0HpDzYCECADQQo2AgwMDAtBACECIANBADYCHCADIAE2AhQgA0GDEDYCECADQQo2AgwMCwtBACECIANBADYCHCADIAE2AhQgA0GmHDYCECADQQI2AgwMCgtBACECIANBADYCHCADIAE2AhQgA0HFFTYCECADQQI2AgwMCQtBACECIANBADYCHCADIAE2AhQgA0H/FzYCECADQQI2AgwMCAtBACECIANBADYCHCADIAE2AhQgA0HKFzYCECADQQI2AgwMBwsgA0ECNgIcIAMgATYCFCADQZQdNgIQIANBFjYCDEEAIQIMBgtB3gAhAiABIARGDQUgCUEIaiEHIAMoAgAhBQJAAkAgASAERwRAIAVBxsYAaiEIIAQgBWogAWshBiAFQX9zQQpqIgUgAWohAANAIAEtAAAgCC0AAEcEQEECIQgMAwsgBUUEQEEAIQggACEBDAMLIAVBAWshBSAIQQFqIQggBCABQQFqIgFHDQALIAYhBSAEIQELIAdBATYCACADIAU2AgAMAQsgA0EANgIAIAcgCDYCAAsgByABNgIEIAkoAgwhACAJKAIIDgMBBQIACwALIANBADYCHCADQa0dNgIQIANBFzYCDCADIABBAWo2AhRBACECDAMLIANBADYCHCADIAA2AhQgA0HCHTYCECADQQk2AgxBACECDAILIAEgBEYEQEEoIQIMAgsgA0EJNgIIIAMgATYCBEEnIQIMAQsgASAERgRAQQEhAgwBCwNAAkACQAJAIAEtAABBCmsOBAABAQABCyABQQFqIQEMAQsgAUEBaiEBIAMtAC5BIHENAEEAIQIgA0EANgIcIAMgATYCFCADQYwgNgIQIANBBTYCDAwCC0EBIQIgASAERw0ACwsgCUEQaiQAIAJFBEAgAygCDCEADAELIAMgAjYCHEEAIQAgAygCBCIBRQ0AIAMgASAEIAMoAggRAQAiAUUNACADIAQ2AhQgAyABNgIMIAEhAAsgAAu+AgECfyAAQQA6AAAgAEHcAGoiAUEBa0EAOgAAIABBADoAAiAAQQA6AAEgAUEDa0EAOgAAIAFBAmtBADoAACAAQQA6AAMgAUEEa0EAOgAAQQAgAGtBA3EiASAAaiIAQQA2AgBB3AAgAWtBfHEiAiAAaiIBQQRrQQA2AgACQCACQQlJDQAgAEEANgIIIABBADYCBCABQQhrQQA2AgAgAUEMa0EANgIAIAJBGUkNACAAQQA2AhggAEEANgIUIABBADYC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U3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9zdGF0dXMASW52YWxpZCByZXNwb25zZSBzdGF0dXMARXhwZWN0ZWQgTEYgYWZ0ZXIgaGVhZGVycwBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zAFVzZXIgY2FsbGJhY2sgZXJyb3IAYG9uX3Jlc2V0YCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfaGVhZGVyYCBjYWxsYmFjayBlcnJvcgBgb25fbWVzc2FnZV9iZWdpbmAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3N0YXR1c19jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3ZlcnNpb25fY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl91cmxfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2hlYWRlcl92YWx1ZV9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX21lc3NhZ2VfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXRob2RfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfZmllbGRfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fbmFtZWAgY2FsbGJhY2sgZXJyb3IAVW5leHBlY3RlZCBjaGFyIGluIHVybCBzZXJ2ZXIASW52YWxpZCBoZWFkZXIgdmFsdWUgY2hhcgBJbnZhbGlkIGhlYWRlciBmaWVsZCBjaGFyAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fdmVyc2lvbgBJbnZhbGlkIG1pbm9yIHZlcnNpb24ASW52YWxpZCBtYWpvciB2ZXJzaW9uAEV4cGVjdGVkIHNwYWNlIGFmdGVyIHZlcnNpb24ARXhwZWN0ZWQgQ1JMRiBhZnRlciB2ZXJzaW9uAEludmFsaWQgSFRUUCB2ZXJzaW9uAEludmFsaWQgaGVhZGVyIHRva2VuAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fdXJsAEludmFsaWQgY2hhcmFjdGVycyBpbiB1cmwAVW5leHBlY3RlZCBzdGFydCBjaGFyIGluIHVybABEb3VibGUgQCBpbiB1cmwARW1wdHkgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyYWN0ZXIgaW4gQ29udGVudC1MZW5ndGgAVHJhbnNmZXItRW5jb2RpbmcgY2FuJ3QgYmUgcHJlc2VudCB3aXRoIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgY2h1bmsgc2l6ZQBFeHBlY3RlZCBMRiBhZnRlciBjaHVuayBzaXplAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBNaXNzaW5nIGV4cGVjdGVkIENSIGFmdGVyIGhlYWRlciB2YWx1ZQBNaXNzaW5nIGV4cGVjdGVkIExGIGFmdGVyIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AgaGVhZGVyIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgY2h1bmsgZXh0ZW5zaW9uIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGUgdmFsdWUASW52YWxpZCBxdW90ZWQtcGFpciBpbiBjaHVuayBleHRlbnNpb25zIHF1b3RlZCB2YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHF1b3RlZCB2YWx1ZQBQYXVzZWQgYnkgb25faGVhZGVyc19jb21wbGV0ZQBJbnZhbGlkIEVPRiBzdGF0ZQBvbl9yZXNldCBwYXVzZQBvbl9jaHVua19oZWFkZXIgcGF1c2UAb25fbWVzc2FnZV9iZWdpbiBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fdmFsdWUgcGF1c2UAb25fc3RhdHVzX2NvbXBsZXRlIHBhdXNlAG9uX3ZlcnNpb25fY29tcGxldGUgcGF1c2UAb25fdXJsX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl92YWx1ZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXNzYWdlX2NvbXBsZXRlIHBhdXNlAG9uX21ldGhvZF9jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfZmllbGRfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX25hbWUgcGF1c2UAVW5leHBlY3RlZCBzcGFjZSBhZnRlciBzdGFydCBsaW5lAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgcmVzcG9uc2UgbGluZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgbmFtZQBNaXNzaW5nIGV4cGVjdGVkIENSIGFmdGVyIGNodW5rIGV4dGVuc2lvbiBuYW1lAEludmFsaWQgc3RhdHVzIGNvZGUAUGF1c2Ugb24gQ09OTkVDVC9VcGdyYWRlAFBhdXNlIG9uIFBSSS9VcGdyYWRlAEV4cGVjdGVkIEhUVFAvMiBDb25uZWN0aW9uIFByZWZhY2UAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9tZXRob2QARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgbWV0aG9kAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX2ZpZWxkAFBhdXNlZABJbnZhbGlkIHdvcmQgZW5jb3VudGVyZWQASW52YWxpZCBtZXRob2QgZW5jb3VudGVyZWQATWlzc2luZyBleHBlY3RlZCBDUiBhZnRlciBjaHVuayBkYXRhAEV4cGVjdGVkIExGIGFmdGVyIGNodW5rIGRhdGEAVW5leHBlY3RlZCBjaGFyIGluIHVybCBzY2hlbWEAUmVxdWVzdCBoYXMgaW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgAERhdGEgYWZ0ZXIgYENvbm5lY3Rpb246IGNsb3NlYABTV0lUQ0hfUFJPWFkAVVNFX1BST1hZAE1LQUNUSVZJVFkAVU5QUk9DRVNTQUJMRV9FTlRJVFkAUVVFUlkAQ09QWQBNT1ZFRF9QRVJNQU5FTlRMWQBUT09fRUFSTFkATk9USUZZAEZBSUxFRF9ERVBFTkRFTkNZAEJBRF9HQVRFV0FZAFBMQVkAUFVUAENIRUNLT1VUAEdBVEVXQVlfVElNRU9VVABSRVFVRVNUX1RJTUVPVVQATkVUV09SS19DT05ORUNUX1RJTUVPVVQAQ09OTkVDVElPTl9USU1FT1VUAExPR0lOX1RJTUVPVVQATkVUV09SS19SRUFEX1RJTUVPVVQAUE9TVABNSVNESVJFQ1RFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX0xPQURfQkFMQU5DRURfUkVRVUVTVABCQURfUkVRVUVTVABIVFRQX1JFUVVFU1RfU0VOVF9UT19IVFRQU19QT1JUAFJFUE9SVABJTV9BX1RFQVBPVABSRVNFVF9DT05URU5UAE5PX0NPTlRFTlQAUEFSVElBTF9DT05URU5UAEhQRV9JTlZBTElEX0NPTlNUQU5UAEhQRV9DQl9SRVNFVABHRVQASFBFX1NUUklDVABDT05GTElDVABURU1QT1JBUllfUkVESVJFQ1QAUEVSTUFORU5UX1JFRElSRUNUAENPTk5FQ1QATVVMVElfU1RBVFVTAEhQRV9JTlZBTElEX1NUQVRVUwBUT09fTUFOWV9SRVFVRVNUUwBFQVJMWV9ISU5UUwBVTkFWQUlMQUJMRV9GT1JfTEVHQUxfUkVBU09OUwBPUFRJT05TAFNXSVRDSElOR19QUk9UT0NPTFMAVkFSSUFOVF9BTFNPX05FR09USUFURVMATVVMVElQTEVfQ0hPSUNFUwBJTlRFUk5BTF9TRVJWRVJfRVJST1IAV0VCX1NFUlZFUl9VTktOT1dOX0VSUk9SAFJBSUxHVU5fRVJST1IASURFTlRJVFlfUFJPVklERVJfQVVUSEVOVElDQVRJT05fRVJST1IAU1NMX0NFUlRJRklDQVRFX0VSUk9SAElOVkFMSURfWF9GT1JXQVJERURfRk9SAFNFVF9QQVJBTUVURVIAR0VUX1BBUkFNRVRFUgBIUEVfVVNFUgBTRUVfT1RIRVIASFBFX0NCX0NIVU5LX0hFQURFUgBFeHBlY3RlZCBMRiBhZnRlciBDUgBNS0NBTEVOREFSAFNFVFVQAFdFQl9TRVJWRVJfSVNfRE9XTgBURUFSRE9XTgBIUEVfQ0xPU0VEX0NPTk5FQ1RJT04ASEVVUklTVElDX0VYUElSQVRJT04ARElTQ09OTkVDVEVEX09QRVJBVElPTgBOT05fQVVUSE9SSVRBVElWRV9JTkZPUk1BVElPTgBIUEVfSU5WQUxJRF9WRVJTSU9OAEhQRV9DQl9NRVNTQUdFX0JFR0lOAFNJVEVfSVNfRlJPWkVOAEhQRV9JTlZBTElEX0hFQURFUl9UT0tFTgBJTlZBTElEX1RPS0VOAEZPUkJJRERFTgBFTkhBTkNFX1lPVVJfQ0FMTQBIUEVfSU5WQUxJRF9VUkwAQkxPQ0tFRF9CWV9QQVJFTlRBTF9DT05UUk9MAE1LQ09MAEFDTABIUEVfSU5URVJOQUwAUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRV9VTk9GRklDSUFMAEhQRV9PSwBVTkxJTksAVU5MT0NLAFBSSQBSRVRSWV9XSVRIAEhQRV9JTlZBTElEX0NPTlRFTlRfTEVOR1RIAEhQRV9VTkVYUEVDVEVEX0NPTlRFTlRfTEVOR1RIAEZMVVNIAFBST1BQQVRDSABNLVNFQVJDSABVUklfVE9PX0xPTkcAUFJPQ0VTU0lORwBNSVNDRUxMQU5FT1VTX1BFUlNJU1RFTlRfV0FSTklORwBNSVNDRUxMQU5FT1VTX1dBUk5JTkcASFBFX0lOVkFMSURfVFJBTlNGRVJfRU5DT0RJTkcARXhwZWN0ZWQgQ1JMRgBIUEVfSU5WQUxJRF9DSFVOS19TSVpFAE1PVkUAQ09OVElOVUUASFBFX0NCX1NUQVRVU19DT01QTEVURQBIUEVfQ0JfSEVBREVSU19DT01QTEVURQBIUEVfQ0JfVkVSU0lPTl9DT01QTEVURQBIUEVfQ0JfVVJMX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19DT01QTEVURQBIUEVfQ0JfSEVBREVSX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9OQU1FX0NPTVBMRVRFAEhQRV9DQl9NRVNTQUdFX0NPTVBMRVRFAEhQRV9DQl9NRVRIT0RfQ09NUExFVEUASFBFX0NCX0hFQURFUl9GSUVMRF9DT01QTEVURQBERUxFVEUASFBFX0lOVkFMSURfRU9GX1NUQVRFAElOVkFMSURfU1NMX0NFUlRJRklDQVRFAFBBVVNFAE5PX1JFU1BPTlNFAFVOU1VQUE9SVEVEX01FRElBX1RZUEUAR09ORQBOT1RfQUNDRVBUQUJMRQBTRVJWSUNFX1VOQVZBSUxBQkxFAFJBTkdFX05PVF9TQVRJU0ZJQUJMRQBPUklHSU5fSVNfVU5SRUFDSEFCTEUAUkVTUE9OU0VfSVNfU1RBTEUAUFVSR0UATUVSR0UAUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRQBSRVFVRVNUX0hFQURFUl9UT09fTEFSR0UAUEFZTE9BRF9UT09fTEFSR0UASU5TVUZGSUNJRU5UX1NUT1JBR0UASFBFX1BBVVNFRF9VUEdSQURFAEhQRV9QQVVTRURfSDJfVVBHUkFERQBTT1VSQ0UAQU5OT1VOQ0UAVFJBQ0UASFBFX1VORVhQRUNURURfU1BBQ0UAREVTQ1JJQkUAVU5TVUJTQ1JJQkUAUkVDT1JEAEhQRV9JTlZBTElEX01FVEhPRABOT1RfRk9VTkQAUFJPUEZJTkQAVU5CSU5EAFJFQklORABVTkFVVEhPUklaRUQATUVUSE9EX05PVF9BTExPV0VEAEhUVFBfVkVSU0lPTl9OT1RfU1VQUE9SVEVEAEFMUkVBRFlfUkVQT1JURUQAQUNDRVBURUQATk9UX0lNUExFTUVOVEVEAExPT1BfREVURUNURUQASFBFX0NSX0VYUEVDVEVEAEhQRV9MRl9FWFBFQ1RFRABDUkVBVEVEAElNX1VTRUQASFBFX1BBVVNFRABUSU1FT1VUX09DQ1VSRUQAUEFZTUVOVF9SRVFVSVJFRABQUkVDT05ESVRJT05fUkVRVUlSRUQAUFJPWFlfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATkVUV09SS19BVVRIRU5USUNBVElPTl9SRVFVSVJFRABMRU5HVEhfUkVRVUlSRUQAU1NMX0NFUlRJRklDQVRFX1JFUVVJUkVEAFVQR1JBREVfUkVRVUlSRUQAUEFHRV9FWFBJUkVEAFBSRUNPTkRJVElPTl9GQUlMRUQARVhQRUNUQVRJT05fRkFJTEVEAFJFVkFMSURBVElPTl9GQUlMRUQAU1NMX0hBTkRTSEFLRV9GQUlMRUQATE9DS0VEAFRSQU5TRk9STUFUSU9OX0FQUExJRUQATk9UX01PRElGSUVEAE5PVF9FWFRFTkRFRABCQU5EV0lEVEhfTElNSVRfRVhDRUVERUQAU0lURV9JU19PVkVSTE9BREVEAEhFQUQARXhwZWN0ZWQgSFRUUC8AAFIVAAAaFQAADxIAAOQZAACRFQAACRQAAC0ZAADkFAAA6REAAGkUAAChFAAAdhUAAEMWAABeEgAAlBcAABcWAAB9FAAAfxYAAEEXAACzEwAAwxYAAAQaAAC9GAAA0BgAAKATAADUGQAArxYAAGgWAABwFwAA2RYAAPwYAAD+EQAAWRcAAJcWAAAcFwAA9hYAAI0XAAALEgAAfxsAAC4RAACzEAAASRIAAK0SAAD2GAAAaBAAAGIVAAAQFQAAWhYAAEoZAAC1FQAAwRUAAGAVAABcGQAAWhkAAFMZAAAWFQAArREAAEIQAAC3EAAAVxgAAL8VAACJEAAAHBkAABoZAAC5FQAAURgAANwTAABbFQAAWRUAAOYYAABnFQAAERkAAO0YAADnEwAArhAAAMIXAAAAFAAAkhMAAIQTAABAEgAAJhkAAK8VAABiEABB6TkLAQEAQYA6C+ABAQECAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAwEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAQeo7CwQBAAACAEGBPAteAwQDAwMDAwAAAwMAAwMAAwMDAwMDAwMDAwAFAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAMAAwBB6j0LBAEAAAIAQYE+C14DAAMDAwMDAAADAwADAwADAwMDAwMDAwMDAAQABQAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAwADAEHgPwsNbG9zZWVlcC1hbGl2ZQBB+T8LAQEAQZDAAAvgAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAEH5wQALAQEAQZDCAAvnAQEBAQEBAQEBAQEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBY2h1bmtlZABBocQAC14BAAEBAQEBAAABAQABAQABAQEBAQEBAQEBAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAEGAxgALIWVjdGlvbmVudC1sZW5ndGhvbnJveHktY29ubmVjdGlvbgBBsMYACytyYW5zZmVyLWVuY29kaW5ncGdyYWRlDQoNClNNDQoNClRUUC9DRS9UU1AvAEHpxgALBQECAAEDAEGAxwALXwQFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFAEHpyAALBQECAAEDAEGAyQALXwQFBQYFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFAEHpygALBAEAAAEAQYHLAAteAgIAAgICAgICAgICAgICAgICAgICAgICAgICAgICAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgBB6cwACwUBAgABAwBBgM0AC18EBQAABQUFBQUFBQUFBQUGBQUFBQUFBQUFBQUFAAUABwgFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUABQAFAAUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFAAAABQBB6c4ACwUBAQABAQBBgM8ACwEBAEGazwALQQIAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAEHp0AALBQEBAAEBAEGA0QALAQEAQYrRAAsGAgAAAAACAEGh0QALOgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQeDSAAuaAU5PVU5DRUVDS09VVE5FQ1RFVEVDUklCRUxVU0hFVEVBRFNFQVJDSFJHRUNUSVZJVFlMRU5EQVJWRU9USUZZUFRJT05TQ0hTRUFZU1RBVENIR0VVRVJZT1JESVJFQ1RPUlRSQ0hQQVJBTUVURVJVUkNFQlNDUklCRUFSRE9XTkFDRUlORE5LQ0tVQlNDUklCRUhUVFAvQURUUC8=' + +let wasmBuffer + +Object.defineProperty(module, 'exports', { + get: () => { + return wasmBuffer + ? wasmBuffer + : (wasmBuffer = Buffer.from(wasmBase64, 'base64')) + } +}) diff --git a/deps/undici/src/lib/llhttp/llhttp_simd.wasm b/deps/undici/src/lib/llhttp/llhttp_simd.wasm index b26d8319e39e1c..da92146a39cf91 100755 Binary files a/deps/undici/src/lib/llhttp/llhttp_simd.wasm and b/deps/undici/src/lib/llhttp/llhttp_simd.wasm differ diff --git a/deps/undici/src/lib/llhttp/utils.d.ts b/deps/undici/src/lib/llhttp/utils.d.ts new file mode 100644 index 00000000000000..b1a9a3a4379c5b --- /dev/null +++ b/deps/undici/src/lib/llhttp/utils.d.ts @@ -0,0 +1,2 @@ +import { IntDict } from './constants'; +export declare function enumToMap(obj: IntDict, filter?: ReadonlyArray, exceptions?: ReadonlyArray): IntDict; diff --git a/deps/undici/src/lib/llhttp/utils.js b/deps/undici/src/lib/llhttp/utils.js index 8a32e564e70020..aaaa5d8cf52d17 100644 --- a/deps/undici/src/lib/llhttp/utils.js +++ b/deps/undici/src/lib/llhttp/utils.js @@ -1,15 +1,15 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.enumToMap = void 0; -function enumToMap(obj) { - const res = {}; - Object.keys(obj).forEach((key) => { - const value = obj[key]; - if (typeof value === 'number') { - res[key] = value; - } - }); - return res; +function enumToMap(obj, filter = [], exceptions = []) { + var _a, _b; + const emptyFilter = ((_a = filter === null || filter === void 0 ? void 0 : filter.length) !== null && _a !== void 0 ? _a : 0) === 0; + const emptyExceptions = ((_b = exceptions === null || exceptions === void 0 ? void 0 : exceptions.length) !== null && _b !== void 0 ? _b : 0) === 0; + return Object.fromEntries(Object.entries(obj).filter(([, value]) => { + return (typeof value === 'number' && + (emptyFilter || filter.includes(value)) && + (emptyExceptions || !exceptions.includes(value))); + })); } exports.enumToMap = enumToMap; //# sourceMappingURL=utils.js.map \ No newline at end of file diff --git a/deps/undici/src/lib/llhttp/utils.js.map b/deps/undici/src/lib/llhttp/utils.js.map new file mode 100644 index 00000000000000..5d578522eea3b9 --- /dev/null +++ b/deps/undici/src/lib/llhttp/utils.js.map @@ -0,0 +1 @@ +{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/llhttp/utils.ts"],"names":[],"mappings":";;;AAEA,SAAgB,SAAS,CACvB,GAAY,EACZ,SAAgC,EAAE,EAClC,aAAoC,EAAE;;IAEtC,MAAM,WAAW,GAAG,CAAC,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,mCAAI,CAAC,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,eAAe,GAAG,CAAC,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,MAAM,mCAAI,CAAC,CAAC,KAAK,CAAC,CAAC;IAExD,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAE,AAAD,EAAG,KAAK,CAAE,EAAE,EAAE;QACnE,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;YACzB,CAAC,WAAW,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACvC,CAAC,eAAe,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CACjD,CAAC;IACJ,CAAC,CAAC,CAAC,CAAC;AACN,CAAC;AAfD,8BAeC"} \ No newline at end of file diff --git a/deps/undici/src/lib/llhttp/wasm_build_env.txt b/deps/undici/src/lib/llhttp/wasm_build_env.txt index 7c67045449228c..704f369e94b550 100644 --- a/deps/undici/src/lib/llhttp/wasm_build_env.txt +++ b/deps/undici/src/lib/llhttp/wasm_build_env.txt @@ -1,60 +1,77 @@ -> undici@6.21.0 prebuild:wasm -> node build/wasm.js --prebuild - -> docker build --platform=linux/x86_64 -t llhttp_wasm_builder -f /home/runner/work/node/node/deps/undici/src/build/Dockerfile /home/runner/work/node/node/deps/undici/src - - - -> undici@6.21.0 build:wasm +> undici@7.2.0 build:wasm > node build/wasm.js --docker -> docker run --rm -t --platform=linux/x86_64 --user 1001:127 --mount type=bind,source=/home/runner/work/node/node/deps/undici/src/lib/llhttp,target=/home/node/undici/lib/llhttp llhttp_wasm_builder node build/wasm.js +> docker run --rm --platform=linux/x86_64 --user 1001:128 --mount type=bind,source=/home/runner/work/node/node/deps/undici/src/lib/llhttp,target=/home/node/build/lib/llhttp --mount type=bind,source=/home/runner/work/node/node/deps/undici/src/build,target=/home/node/build/build --mount type=bind,source=/home/runner/work/node/node/deps/undici/src/deps,target=/home/node/build/deps -t ghcr.io/nodejs/wasm-builder@sha256:975f391d907e42a75b8c72eb77c782181e941608687d4d8694c3e9df415a0970 node build/wasm.js -alpine-baselayout-3.4.3-r2 -alpine-baselayout-data-3.4.3-r2 +alpine-baselayout-3.6.5-r0 +alpine-baselayout-data-3.6.5-r0 alpine-keys-2.4-r1 -apk-tools-2.14.0-r5 -binutils-2.41-r0 -busybox-1.36.1-r15 -busybox-binsh-1.36.1-r15 -ca-certificates-bundle-20230506-r0 -clang17-17.0.5-r0 -clang17-headers-17.0.5-r0 -clang17-libs-17.0.5-r0 +apk-tools-2.14.4-r0 +bash-5.2.26-r0 +binutils-2.42-r0 +brotli-libs-1.1.0-r2 +busybox-1.36.1-r29 +busybox-binsh-1.36.1-r29 +c-ares-1.33.1-r0 +ca-certificates-20240705-r0 +ca-certificates-bundle-20240705-r0 +cargo-1.78.0-r0 +clang17-17.0.6-r1 +clang17-headers-17.0.6-r1 +clang17-libs-17.0.6-r1 +cmake-3.29.3-r0 fortify-headers-1.1-r3 -gcc-13.2.1_git20231014-r0 -gmp-6.3.0-r0 +g++-13.2.1_git20240309-r0 +gcc-13.2.1_git20240309-r0 +gmp-6.3.0-r1 isl26-0.26-r1 jansson-2.14-r4 -libatomic-13.2.1_git20231014-r0 -libc-utils-0.7.2-r5 -libcrypto3-3.1.4-r5 -libffi-3.4.4-r3 -libgcc-13.2.1_git20231014-r0 -libgomp-13.2.1_git20231014-r0 -libssl3-3.1.4-r5 -libstdc++-13.2.1_git20231014-r0 -libstdc++-dev-13.2.1_git20231014-r0 -libxml2-2.11.8-r0 -lld-17.0.5-r0 -lld-libs-17.0.5-r0 -llvm17-libs-17.0.5-r0 -llvm17-linker-tools-17.0.5-r0 +libacl-2.3.2-r0 +libarchive-3.7.6-r0 +libatomic-13.2.1_git20240309-r0 +libbz2-1.0.8-r6 +libcrypto3-3.3.2-r0 +libcurl-8.10.1-r0 +libexpat-2.6.3-r0 +libffi-3.4.6-r0 +libgcc-13.2.1_git20240309-r0 +libgomp-13.2.1_git20240309-r0 +libidn2-2.3.7-r0 +libncursesw-6.4_p20240420-r1 +libpsl-0.21.5-r1 +libssl3-3.3.2-r0 +libstdc++-13.2.1_git20240309-r0 +libstdc++-dev-13.2.1_git20240309-r0 +libunistring-1.2-r0 +libuv-1.48.0-r0 +libxml2-2.12.7-r0 +lld-17.0.6-r0 +lld-libs-17.0.6-r0 +llvm17-libs-17.0.6-r1 +llvm17-linker-tools-17.0.6-r1 +lz4-libs-1.9.4-r5 +make-4.4.1-r2 mpc1-1.3.1-r1 mpfr4-4.2.1-r0 -musl-1.2.4_git20230717-r4 -musl-dev-1.2.4_git20230717-r4 -musl-utils-1.2.4_git20230717-r4 +musl-1.2.5-r0 +musl-dev-1.2.5-r0 +musl-utils-1.2.5-r0 +ncurses-terminfo-base-6.4_p20240420-r1 +nghttp2-libs-1.62.1-r0 +readline-8.2.10-r0 +rhash-libs-1.4.4-r0 +rust-1.78.0-r0 +rust-wasm-1.78.0-r0 scanelf-1.3.7-r2 -scudo-malloc-17.0.5-r0 -ssl_client-1.36.1-r15 -wasi-compiler-rt-17.0.5-r1 -wasi-libc-0.20231012-r0 -wasi-libcxx-17.0.5-r0 -wasi-sdk-20-r3 -xz-libs-5.4.5-r0 -zlib-1.3.1-r0 -zstd-libs-1.5.5-r8 +scudo-malloc-17.0.6-r0 +ssl_client-1.36.1-r29 +wasi-compiler-rt-17.0.6-r1 +wasi-libc-0.20231215-r0 +wasi-libcxx-17.0.6-r1 +wasi-sdk-21-r0 +xz-libs-5.6.2-r0 +zlib-1.3.1-r1 +zstd-libs-1.5.6-r0 diff --git a/deps/undici/src/lib/mock/mock-agent.js b/deps/undici/src/lib/mock/mock-agent.js index c02ee375e2551f..6ee68570539196 100644 --- a/deps/undici/src/lib/mock/mock-agent.js +++ b/deps/undici/src/lib/mock/mock-agent.js @@ -18,7 +18,6 @@ const MockPool = require('./mock-pool') const { matchValue, buildMockOptions } = require('./mock-utils') const { InvalidArgumentError, UndiciError } = require('../core/errors') const Dispatcher = require('../dispatcher/dispatcher') -const Pluralizer = require('./pluralizer') const PendingInterceptorsFormatter = require('./pending-interceptors-formatter') class MockAgent extends Dispatcher { @@ -147,13 +146,11 @@ class MockAgent extends Dispatcher { return } - const pluralizer = new Pluralizer('interceptor', 'interceptors').pluralize(pending.length) - - throw new UndiciError(` -${pluralizer.count} ${pluralizer.noun} ${pluralizer.is} pending: - -${pendingInterceptorsFormatter.format(pending)} -`.trim()) + throw new UndiciError( + pending.length === 1 + ? `1 interceptor is pending:\n\n${pendingInterceptorsFormatter.format(pending)}`.trim() + : `${pending.length} interceptors are pending:\n\n${pendingInterceptorsFormatter.format(pending)}`.trim() + ) } } diff --git a/deps/undici/src/lib/mock/mock-client.js b/deps/undici/src/lib/mock/mock-client.js index c375dbd455b262..f8a786ced8bb83 100644 --- a/deps/undici/src/lib/mock/mock-client.js +++ b/deps/undici/src/lib/mock/mock-client.js @@ -10,7 +10,8 @@ const { kOriginalClose, kOrigin, kOriginalDispatch, - kConnected + kConnected, + kIgnoreTrailingSlash } = require('./mock-symbols') const { MockInterceptor } = require('./mock-interceptor') const Symbols = require('../core/symbols') @@ -21,14 +22,15 @@ const { InvalidArgumentError } = require('../core/errors') */ class MockClient extends Client { constructor (origin, opts) { - super(origin, opts) - if (!opts || !opts.agent || typeof opts.agent.dispatch !== 'function') { throw new InvalidArgumentError('Argument opts.agent must implement Agent') } + super(origin, opts) + this[kMockAgent] = opts.agent this[kOrigin] = origin + this[kIgnoreTrailingSlash] = opts.ignoreTrailingSlash ?? false this[kDispatches] = [] this[kConnected] = 1 this[kOriginalDispatch] = this.dispatch @@ -46,7 +48,10 @@ class MockClient extends Client { * Sets up the base interceptor for mocking replies from undici. */ intercept (opts) { - return new MockInterceptor(opts, this[kDispatches]) + return new MockInterceptor( + opts && { ignoreTrailingSlash: this[kIgnoreTrailingSlash], ...opts }, + this[kDispatches] + ) } async [kClose] () { diff --git a/deps/undici/src/lib/mock/mock-errors.js b/deps/undici/src/lib/mock/mock-errors.js index 5442c0e8d2c20c..ebdc786c56e7a0 100644 --- a/deps/undici/src/lib/mock/mock-errors.js +++ b/deps/undici/src/lib/mock/mock-errors.js @@ -2,10 +2,12 @@ const { UndiciError } = require('../core/errors') +/** + * The request does not match any registered mock dispatches. + */ class MockNotMatchedError extends UndiciError { constructor (message) { super(message) - Error.captureStackTrace(this, MockNotMatchedError) this.name = 'MockNotMatchedError' this.message = message || 'The request does not match any registered mock dispatches' this.code = 'UND_MOCK_ERR_MOCK_NOT_MATCHED' diff --git a/deps/undici/src/lib/mock/mock-interceptor.js b/deps/undici/src/lib/mock/mock-interceptor.js index c6b16b35f9c372..1ea7aac486da93 100644 --- a/deps/undici/src/lib/mock/mock-interceptor.js +++ b/deps/undici/src/lib/mock/mock-interceptor.js @@ -7,10 +7,11 @@ const { kDefaultHeaders, kDefaultTrailers, kContentLength, - kMockDispatch + kMockDispatch, + kIgnoreTrailingSlash } = require('./mock-symbols') const { InvalidArgumentError } = require('../core/errors') -const { buildURL } = require('../core/util') +const { serializePathWithQuery } = require('../core/util') /** * Defines the scope API for an interceptor reply @@ -72,7 +73,7 @@ class MockInterceptor { // fragments to servers when they retrieve a document, if (typeof opts.path === 'string') { if (opts.query) { - opts.path = buildURL(opts.path, opts.query) + opts.path = serializePathWithQuery(opts.path, opts.query) } else { // Matches https://github.com/nodejs/undici/blob/main/lib/web/fetch/index.js#L1811 const parsedURL = new URL(opts.path, 'data://') @@ -85,6 +86,7 @@ class MockInterceptor { this[kDispatchKey] = buildKey(opts) this[kDispatches] = mockDispatches + this[kIgnoreTrailingSlash] = opts.ignoreTrailingSlash ?? false this[kDefaultHeaders] = {} this[kDefaultTrailers] = {} this[kContentLength] = false @@ -137,7 +139,7 @@ class MockInterceptor { } // Add usual dispatch data, but this time set the data parameter to function that will eventually provide data. - const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], wrappedDefaultsCallback) + const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], wrappedDefaultsCallback, { ignoreTrailingSlash: this[kIgnoreTrailingSlash] }) return new MockScope(newMockDispatch) } @@ -154,7 +156,7 @@ class MockInterceptor { // Send in-already provided data like usual const dispatchData = this.createMockScopeDispatchData(replyParameters) - const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], dispatchData) + const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], dispatchData, { ignoreTrailingSlash: this[kIgnoreTrailingSlash] }) return new MockScope(newMockDispatch) } @@ -166,7 +168,7 @@ class MockInterceptor { throw new InvalidArgumentError('error must be defined') } - const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], { error }) + const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], { error }, { ignoreTrailingSlash: this[kIgnoreTrailingSlash] }) return new MockScope(newMockDispatch) } diff --git a/deps/undici/src/lib/mock/mock-pool.js b/deps/undici/src/lib/mock/mock-pool.js index 8b005d72ead3f0..a266211ac70489 100644 --- a/deps/undici/src/lib/mock/mock-pool.js +++ b/deps/undici/src/lib/mock/mock-pool.js @@ -10,7 +10,8 @@ const { kOriginalClose, kOrigin, kOriginalDispatch, - kConnected + kConnected, + kIgnoreTrailingSlash } = require('./mock-symbols') const { MockInterceptor } = require('./mock-interceptor') const Symbols = require('../core/symbols') @@ -21,14 +22,15 @@ const { InvalidArgumentError } = require('../core/errors') */ class MockPool extends Pool { constructor (origin, opts) { - super(origin, opts) - if (!opts || !opts.agent || typeof opts.agent.dispatch !== 'function') { throw new InvalidArgumentError('Argument opts.agent must implement Agent') } + super(origin, opts) + this[kMockAgent] = opts.agent this[kOrigin] = origin + this[kIgnoreTrailingSlash] = opts.ignoreTrailingSlash ?? false this[kDispatches] = [] this[kConnected] = 1 this[kOriginalDispatch] = this.dispatch @@ -46,7 +48,10 @@ class MockPool extends Pool { * Sets up the base interceptor for mocking replies from undici. */ intercept (opts) { - return new MockInterceptor(opts, this[kDispatches]) + return new MockInterceptor( + opts && { ignoreTrailingSlash: this[kIgnoreTrailingSlash], ...opts }, + this[kDispatches] + ) } async [kClose] () { diff --git a/deps/undici/src/lib/mock/mock-symbols.js b/deps/undici/src/lib/mock/mock-symbols.js index 8c4cbb60e16c47..492edddabf5c40 100644 --- a/deps/undici/src/lib/mock/mock-symbols.js +++ b/deps/undici/src/lib/mock/mock-symbols.js @@ -15,9 +15,11 @@ module.exports = { kMockDispatch: Symbol('mock dispatch'), kClose: Symbol('close'), kOriginalClose: Symbol('original agent close'), + kOriginalDispatch: Symbol('original dispatch'), kOrigin: Symbol('origin'), kIsMockActive: Symbol('is mock active'), kNetConnect: Symbol('net connect'), kGetNetConnect: Symbol('get net connect'), - kConnected: Symbol('connected') + kConnected: Symbol('connected'), + kIgnoreTrailingSlash: Symbol('ignore trailing slash') } diff --git a/deps/undici/src/lib/mock/mock-utils.js b/deps/undici/src/lib/mock/mock-utils.js index 8f18db31ee210c..b19aaaf8e1128c 100644 --- a/deps/undici/src/lib/mock/mock-utils.js +++ b/deps/undici/src/lib/mock/mock-utils.js @@ -8,7 +8,7 @@ const { kOrigin, kGetNetConnect } = require('./mock-symbols') -const { buildURL } = require('../core/util') +const { serializePathWithQuery } = require('../core/util') const { STATUS_CODES } = require('node:http') const { types: { @@ -130,11 +130,19 @@ function getResponseData (data) { } function getMockDispatch (mockDispatches, key) { - const basePath = key.query ? buildURL(key.path, key.query) : key.path + const basePath = key.query ? serializePathWithQuery(key.path, key.query) : key.path const resolvedPath = typeof basePath === 'string' ? safeUrl(basePath) : basePath + const resolvedPathWithoutTrailingSlash = removeTrailingSlash(resolvedPath) + // Match path - let matchedMockDispatches = mockDispatches.filter(({ consumed }) => !consumed).filter(({ path }) => matchValue(safeUrl(path), resolvedPath)) + let matchedMockDispatches = mockDispatches + .filter(({ consumed }) => !consumed) + .filter(({ path, ignoreTrailingSlash }) => { + return ignoreTrailingSlash + ? matchValue(removeTrailingSlash(safeUrl(path)), resolvedPathWithoutTrailingSlash) + : matchValue(safeUrl(path), resolvedPath) + }) if (matchedMockDispatches.length === 0) { throw new MockNotMatchedError(`Mock dispatch not matched for path '${resolvedPath}'`) } @@ -161,8 +169,8 @@ function getMockDispatch (mockDispatches, key) { return matchedMockDispatches[0] } -function addMockDispatch (mockDispatches, key, data) { - const baseData = { timesInvoked: 0, times: 1, persist: false, consumed: false } +function addMockDispatch (mockDispatches, key, data, opts) { + const baseData = { timesInvoked: 0, times: 1, persist: false, consumed: false, ...opts } const replyData = typeof data === 'function' ? { callback: data } : { ...data } const newMockDispatch = { ...baseData, ...key, pending: true, data: { error: null, ...replyData } } mockDispatches.push(newMockDispatch) @@ -181,8 +189,24 @@ function deleteMockDispatch (mockDispatches, key) { } } +/** + * @param {string} path Path to remove trailing slash from + */ +function removeTrailingSlash (path) { + while (path.endsWith('/')) { + path = path.slice(0, -1) + } + + if (path.length === 0) { + path = '/' + } + + return path +} + function buildKey (opts) { const { path, method, body, headers, query } = opts + return { path, method, diff --git a/deps/undici/src/lib/mock/pluralizer.js b/deps/undici/src/lib/mock/pluralizer.js deleted file mode 100644 index 47f150bc27a80a..00000000000000 --- a/deps/undici/src/lib/mock/pluralizer.js +++ /dev/null @@ -1,29 +0,0 @@ -'use strict' - -const singulars = { - pronoun: 'it', - is: 'is', - was: 'was', - this: 'this' -} - -const plurals = { - pronoun: 'they', - is: 'are', - was: 'were', - this: 'these' -} - -module.exports = class Pluralizer { - constructor (singular, plural) { - this.singular = singular - this.plural = plural - } - - pluralize (count) { - const one = count === 1 - const keys = one ? singulars : plurals - const noun = one ? this.singular : this.plural - return { ...keys, count, noun } - } -} diff --git a/deps/undici/src/lib/util/cache.js b/deps/undici/src/lib/util/cache.js new file mode 100644 index 00000000000000..35c53512b2acea --- /dev/null +++ b/deps/undici/src/lib/util/cache.js @@ -0,0 +1,359 @@ +'use strict' + +const { + safeHTTPMethods +} = require('../core/util') + +/** + * @param {import('../../types/dispatcher.d.ts').default.DispatchOptions} opts + */ +function makeCacheKey (opts) { + if (!opts.origin) { + throw new Error('opts.origin is undefined') + } + + /** @type {Record} */ + let headers + if (opts.headers == null) { + headers = {} + } else if (typeof opts.headers[Symbol.iterator] === 'function') { + headers = {} + for (const x of opts.headers) { + if (!Array.isArray(x)) { + throw new Error('opts.headers is not a valid header map') + } + const [key, val] = x + if (typeof key !== 'string' || typeof val !== 'string') { + throw new Error('opts.headers is not a valid header map') + } + headers[key] = val + } + } else if (typeof opts.headers === 'object') { + headers = opts.headers + } else { + throw new Error('opts.headers is not an object') + } + + return { + origin: opts.origin.toString(), + method: opts.method, + path: opts.path, + headers + } +} + +/** + * @param {any} key + */ +function assertCacheKey (key) { + if (typeof key !== 'object') { + throw new TypeError(`expected key to be object, got ${typeof key}`) + } + + for (const property of ['origin', 'method', 'path']) { + if (typeof key[property] !== 'string') { + throw new TypeError(`expected key.${property} to be string, got ${typeof key[property]}`) + } + } + + if (key.headers !== undefined && typeof key.headers !== 'object') { + throw new TypeError(`expected headers to be object, got ${typeof key}`) + } +} + +/** + * @param {any} value + */ +function assertCacheValue (value) { + if (typeof value !== 'object') { + throw new TypeError(`expected value to be object, got ${typeof value}`) + } + + for (const property of ['statusCode', 'cachedAt', 'staleAt', 'deleteAt']) { + if (typeof value[property] !== 'number') { + throw new TypeError(`expected value.${property} to be number, got ${typeof value[property]}`) + } + } + + if (typeof value.statusMessage !== 'string') { + throw new TypeError(`expected value.statusMessage to be string, got ${typeof value.statusMessage}`) + } + + if (value.headers != null && typeof value.headers !== 'object') { + throw new TypeError(`expected value.rawHeaders to be object, got ${typeof value.headers}`) + } + + if (value.vary !== undefined && typeof value.vary !== 'object') { + throw new TypeError(`expected value.vary to be object, got ${typeof value.vary}`) + } + + if (value.etag !== undefined && typeof value.etag !== 'string') { + throw new TypeError(`expected value.etag to be string, got ${typeof value.etag}`) + } +} + +/** + * @see https://www.rfc-editor.org/rfc/rfc9111.html#name-cache-control + * @see https://www.iana.org/assignments/http-cache-directives/http-cache-directives.xhtml + + * @param {string | string[]} header + * @returns {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives} + */ +function parseCacheControlHeader (header) { + /** + * @type {import('../../types/cache-interceptor.d.ts').default.CacheControlDirectives} + */ + const output = {} + + let directives + if (Array.isArray(header)) { + directives = [] + + for (const directive of header) { + directives.push(...directive.split(',')) + } + } else { + directives = header.split(',') + } + + for (let i = 0; i < directives.length; i++) { + const directive = directives[i].toLowerCase() + const keyValueDelimiter = directive.indexOf('=') + + let key + let value + if (keyValueDelimiter !== -1) { + key = directive.substring(0, keyValueDelimiter).trimStart() + value = directive.substring(keyValueDelimiter + 1) + } else { + key = directive.trim() + } + + switch (key) { + case 'min-fresh': + case 'max-stale': + case 'max-age': + case 's-maxage': + case 'stale-while-revalidate': + case 'stale-if-error': { + if (value === undefined || value[0] === ' ') { + continue + } + + if ( + value.length >= 2 && + value[0] === '"' && + value[value.length - 1] === '"' + ) { + value = value.substring(1, value.length - 1) + } + + const parsedValue = parseInt(value, 10) + // eslint-disable-next-line no-self-compare + if (parsedValue !== parsedValue) { + continue + } + + if (key === 'max-age' && key in output && output[key] >= parsedValue) { + continue + } + + output[key] = parsedValue + + break + } + case 'private': + case 'no-cache': { + if (value) { + // The private and no-cache directives can be unqualified (aka just + // `private` or `no-cache`) or qualified (w/ a value). When they're + // qualified, it's a list of headers like `no-cache=header1`, + // `no-cache="header1"`, or `no-cache="header1, header2"` + // If we're given multiple headers, the comma messes us up since + // we split the full header by commas. So, let's loop through the + // remaining parts in front of us until we find one that ends in a + // quote. We can then just splice all of the parts in between the + // starting quote and the ending quote out of the directives array + // and continue parsing like normal. + // https://www.rfc-editor.org/rfc/rfc9111.html#name-no-cache-2 + if (value[0] === '"') { + // Something like `no-cache="some-header"` OR `no-cache="some-header, another-header"`. + + // Add the first header on and cut off the leading quote + const headers = [value.substring(1)] + + let foundEndingQuote = value[value.length - 1] === '"' + if (!foundEndingQuote) { + // Something like `no-cache="some-header, another-header"` + // This can still be something invalid, e.g. `no-cache="some-header, ...` + for (let j = i + 1; j < directives.length; j++) { + const nextPart = directives[j] + const nextPartLength = nextPart.length + + headers.push(nextPart.trim()) + + if (nextPartLength !== 0 && nextPart[nextPartLength - 1] === '"') { + foundEndingQuote = true + break + } + } + } + + if (foundEndingQuote) { + let lastHeader = headers[headers.length - 1] + if (lastHeader[lastHeader.length - 1] === '"') { + lastHeader = lastHeader.substring(0, lastHeader.length - 1) + headers[headers.length - 1] = lastHeader + } + + if (key in output) { + output[key] = output[key].concat(headers) + } else { + output[key] = headers + } + } + } else { + // Something like `no-cache=some-header` + if (key in output) { + output[key] = output[key].concat(value) + } else { + output[key] = [value] + } + } + + break + } + } + // eslint-disable-next-line no-fallthrough + case 'public': + case 'no-store': + case 'must-revalidate': + case 'proxy-revalidate': + case 'immutable': + case 'no-transform': + case 'must-understand': + case 'only-if-cached': + if (value) { + // These are qualified (something like `public=...`) when they aren't + // allowed to be, skip + continue + } + + output[key] = true + break + default: + // Ignore unknown directives as per https://www.rfc-editor.org/rfc/rfc9111.html#section-5.2.3-1 + continue + } + } + + return output +} + +/** + * @param {string | string[]} varyHeader Vary header from the server + * @param {Record} headers Request headers + * @returns {Record} + */ +function parseVaryHeader (varyHeader, headers) { + if (typeof varyHeader === 'string' && varyHeader.includes('*')) { + return headers + } + + const output = /** @type {Record} */ ({}) + + const varyingHeaders = typeof varyHeader === 'string' + ? varyHeader.split(',') + : varyHeader + for (const header of varyingHeaders) { + const trimmedHeader = header.trim().toLowerCase() + + if (headers[trimmedHeader]) { + output[trimmedHeader] = headers[trimmedHeader] + } else { + return undefined + } + } + + return output +} + +/** + * Note: this deviates from the spec a little. Empty etags ("", W/"") are valid, + * however, including them in cached resposnes serves little to no purpose. + * + * @see https://www.rfc-editor.org/rfc/rfc9110.html#name-etag + * + * @param {string} etag + * @returns {boolean} + */ +function isEtagUsable (etag) { + if (etag.length <= 2) { + // Shortest an etag can be is two chars (just ""). This is where we deviate + // from the spec requiring a min of 3 chars however + return false + } + + if (etag[0] === '"' && etag[etag.length - 1] === '"') { + // ETag: ""asd123"" or ETag: "W/"asd123"", kinda undefined behavior in the + // spec. Some servers will accept these while others don't. + // ETag: "asd123" + return !(etag[1] === '"' || etag.startsWith('"W/')) + } + + if (etag.startsWith('W/"') && etag[etag.length - 1] === '"') { + // ETag: W/"", also where we deviate from the spec & require a min of 3 + // chars + // ETag: for W/"", W/"asd123" + return etag.length !== 4 + } + + // Anything else + return false +} + +/** + * @param {unknown} store + * @returns {asserts store is import('../../types/cache-interceptor.d.ts').default.CacheStore} + */ +function assertCacheStore (store, name = 'CacheStore') { + if (typeof store !== 'object' || store === null) { + throw new TypeError(`expected type of ${name} to be a CacheStore, got ${store === null ? 'null' : typeof store}`) + } + + for (const fn of ['get', 'createWriteStream', 'delete']) { + if (typeof store[fn] !== 'function') { + throw new TypeError(`${name} needs to have a \`${fn}()\` function`) + } + } +} +/** + * @param {unknown} methods + * @returns {asserts methods is import('../../types/cache-interceptor.d.ts').default.CacheMethods[]} + */ +function assertCacheMethods (methods, name = 'CacheMethods') { + if (!Array.isArray(methods)) { + throw new TypeError(`expected type of ${name} needs to be an array, got ${methods === null ? 'null' : typeof methods}`) + } + + if (methods.length === 0) { + throw new TypeError(`${name} needs to have at least one method`) + } + + for (const method of methods) { + if (!safeHTTPMethods.includes(method)) { + throw new TypeError(`element of ${name}-array needs to be one of following values: ${safeHTTPMethods.join(', ')}, got ${method}`) + } + } +} + +module.exports = { + makeCacheKey, + assertCacheKey, + assertCacheValue, + parseCacheControlHeader, + parseVaryHeader, + isEtagUsable, + assertCacheMethods, + assertCacheStore +} diff --git a/deps/undici/src/lib/util/date.js b/deps/undici/src/lib/util/date.js new file mode 100644 index 00000000000000..b871c4497bfa9c --- /dev/null +++ b/deps/undici/src/lib/util/date.js @@ -0,0 +1,259 @@ +'use strict' + +const IMF_DAYS = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'] +const IMF_SPACES = [4, 7, 11, 16, 25] +const IMF_MONTHS = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'] +const IMF_COLONS = [19, 22] + +const ASCTIME_SPACES = [3, 7, 10, 19] + +const RFC850_DAYS = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday'] + +/** + * @see https://www.rfc-editor.org/rfc/rfc9110.html#name-date-time-formats + * + * @param {string} date + * @param {Date} [now] + * @returns {Date | undefined} + */ +function parseHttpDate (date, now) { + // Sun, 06 Nov 1994 08:49:37 GMT ; IMF-fixdate + // Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format + // Sunday, 06-Nov-94 08:49:37 GMT ; obsolete RFC 850 format + + date = date.toLowerCase() + + switch (date[3]) { + case ',': return parseImfDate(date) + case ' ': return parseAscTimeDate(date) + default: return parseRfc850Date(date, now) + } +} + +/** + * @see https://httpwg.org/specs/rfc9110.html#preferred.date.format + * + * @param {string} date + * @returns {Date | undefined} + */ +function parseImfDate (date) { + if (date.length !== 29) { + return undefined + } + + if (!date.endsWith('gmt')) { + // Unsupported timezone + return undefined + } + + for (const spaceInx of IMF_SPACES) { + if (date[spaceInx] !== ' ') { + return undefined + } + } + + for (const colonIdx of IMF_COLONS) { + if (date[colonIdx] !== ':') { + return undefined + } + } + + const dayName = date.substring(0, 3) + if (!IMF_DAYS.includes(dayName)) { + return undefined + } + + const dayString = date.substring(5, 7) + const day = Number.parseInt(dayString) + if (isNaN(day) || (day < 10 && dayString[0] !== '0')) { + // Not a number, 0, or it's less than 10 and didn't start with a 0 + return undefined + } + + const month = date.substring(8, 11) + const monthIdx = IMF_MONTHS.indexOf(month) + if (monthIdx === -1) { + return undefined + } + + const year = Number.parseInt(date.substring(12, 16)) + if (isNaN(year)) { + return undefined + } + + const hourString = date.substring(17, 19) + const hour = Number.parseInt(hourString) + if (isNaN(hour) || (hour < 10 && hourString[0] !== '0')) { + return undefined + } + + const minuteString = date.substring(20, 22) + const minute = Number.parseInt(minuteString) + if (isNaN(minute) || (minute < 10 && minuteString[0] !== '0')) { + return undefined + } + + const secondString = date.substring(23, 25) + const second = Number.parseInt(secondString) + if (isNaN(second) || (second < 10 && secondString[0] !== '0')) { + return undefined + } + + return new Date(Date.UTC(year, monthIdx, day, hour, minute, second)) +} + +/** + * @see https://httpwg.org/specs/rfc9110.html#obsolete.date.formats + * + * @param {string} date + * @returns {Date | undefined} + */ +function parseAscTimeDate (date) { + // This is assumed to be in UTC + + if (date.length !== 24) { + return undefined + } + + for (const spaceIdx of ASCTIME_SPACES) { + if (date[spaceIdx] !== ' ') { + return undefined + } + } + + const dayName = date.substring(0, 3) + if (!IMF_DAYS.includes(dayName)) { + return undefined + } + + const month = date.substring(4, 7) + const monthIdx = IMF_MONTHS.indexOf(month) + if (monthIdx === -1) { + return undefined + } + + const dayString = date.substring(8, 10) + const day = Number.parseInt(dayString) + if (isNaN(day) || (day < 10 && dayString[0] !== ' ')) { + return undefined + } + + const hourString = date.substring(11, 13) + const hour = Number.parseInt(hourString) + if (isNaN(hour) || (hour < 10 && hourString[0] !== '0')) { + return undefined + } + + const minuteString = date.substring(14, 16) + const minute = Number.parseInt(minuteString) + if (isNaN(minute) || (minute < 10 && minuteString[0] !== '0')) { + return undefined + } + + const secondString = date.substring(17, 19) + const second = Number.parseInt(secondString) + if (isNaN(second) || (second < 10 && secondString[0] !== '0')) { + return undefined + } + + const year = Number.parseInt(date.substring(20, 24)) + if (isNaN(year)) { + return undefined + } + + return new Date(Date.UTC(year, monthIdx, day, hour, minute, second)) +} + +/** + * @see https://httpwg.org/specs/rfc9110.html#obsolete.date.formats + * + * @param {string} date + * @param {Date} [now] + * @returns {Date | undefined} + */ +function parseRfc850Date (date, now = new Date()) { + if (!date.endsWith('gmt')) { + // Unsupported timezone + return undefined + } + + const commaIndex = date.indexOf(',') + if (commaIndex === -1) { + return undefined + } + + if ((date.length - commaIndex - 1) !== 23) { + return undefined + } + + const dayName = date.substring(0, commaIndex) + if (!RFC850_DAYS.includes(dayName)) { + return undefined + } + + if ( + date[commaIndex + 1] !== ' ' || + date[commaIndex + 4] !== '-' || + date[commaIndex + 8] !== '-' || + date[commaIndex + 11] !== ' ' || + date[commaIndex + 14] !== ':' || + date[commaIndex + 17] !== ':' || + date[commaIndex + 20] !== ' ' + ) { + return undefined + } + + const dayString = date.substring(commaIndex + 2, commaIndex + 4) + const day = Number.parseInt(dayString) + if (isNaN(day) || (day < 10 && dayString[0] !== '0')) { + // Not a number, or it's less than 10 and didn't start with a 0 + return undefined + } + + const month = date.substring(commaIndex + 5, commaIndex + 8) + const monthIdx = IMF_MONTHS.indexOf(month) + if (monthIdx === -1) { + return undefined + } + + // As of this point year is just the decade (i.e. 94) + let year = Number.parseInt(date.substring(commaIndex + 9, commaIndex + 11)) + if (isNaN(year)) { + return undefined + } + + const currentYear = now.getUTCFullYear() + const currentDecade = currentYear % 100 + const currentCentury = Math.floor(currentYear / 100) + + if (year > currentDecade && year - currentDecade >= 50) { + // Over 50 years in future, go to previous century + year += (currentCentury - 1) * 100 + } else { + year += currentCentury * 100 + } + + const hourString = date.substring(commaIndex + 12, commaIndex + 14) + const hour = Number.parseInt(hourString) + if (isNaN(hour) || (hour < 10 && hourString[0] !== '0')) { + return undefined + } + + const minuteString = date.substring(commaIndex + 15, commaIndex + 17) + const minute = Number.parseInt(minuteString) + if (isNaN(minute) || (minute < 10 && minuteString[0] !== '0')) { + return undefined + } + + const secondString = date.substring(commaIndex + 18, commaIndex + 20) + const second = Number.parseInt(secondString) + if (isNaN(second) || (second < 10 && secondString[0] !== '0')) { + return undefined + } + + return new Date(Date.UTC(year, monthIdx, day, hour, minute, second)) +} + +module.exports = { + parseHttpDate +} diff --git a/deps/undici/src/lib/web/cache/cache.js b/deps/undici/src/lib/web/cache/cache.js index 1c1a5911242771..435891dba8f509 100644 --- a/deps/undici/src/lib/web/cache/cache.js +++ b/deps/undici/src/lib/web/cache/cache.js @@ -1,12 +1,11 @@ 'use strict' -const { kConstruct } = require('./symbols') +const { kConstruct } = require('../../core/symbols') const { urlEquals, getFieldValues } = require('./util') const { kEnumerableProperty, isDisturbed } = require('../../core/util') const { webidl } = require('../fetch/webidl') -const { Response, cloneResponse, fromInnerResponse } = require('../fetch/response') -const { Request, fromInnerRequest } = require('../fetch/request') -const { kState } = require('../fetch/symbols') +const { cloneResponse, fromInnerResponse, getResponseState } = require('../fetch/response') +const { Request, fromInnerRequest, getRequestState } = require('../fetch/request') const { fetching } = require('../fetch/index') const { urlIsHttpHttpsScheme, createDeferredPromise, readAllBytes } = require('../fetch/util') const assert = require('node:assert') @@ -116,7 +115,7 @@ class Cache { } // 3.1 - const r = request[kState] + const r = getRequestState(request) // 3.2 if (!urlIsHttpHttpsScheme(r.url) || r.method !== 'GET') { @@ -134,7 +133,7 @@ class Cache { // 5. for (const request of requests) { // 5.1 - const r = new Request(request)[kState] + const r = getRequestState(new Request(request)) // 5.2 if (!urlIsHttpHttpsScheme(r.url)) { @@ -270,10 +269,10 @@ class Cache { let innerRequest = null // 2. - if (request instanceof Request) { - innerRequest = request[kState] + if (webidl.is.Request(request)) { + innerRequest = getRequestState(request) } else { // 3. - innerRequest = new Request(request)[kState] + innerRequest = getRequestState(new Request(request)) } // 4. @@ -285,7 +284,7 @@ class Cache { } // 5. - const innerResponse = response[kState] + const innerResponse = getResponseState(response) // 6. if (innerResponse.status === 206) { @@ -335,7 +334,7 @@ class Cache { const reader = stream.getReader() // 11.3 - readAllBytes(reader).then(bodyReadPromise.resolve, bodyReadPromise.reject) + readAllBytes(reader, bodyReadPromise.resolve, bodyReadPromise.reject) } else { bodyReadPromise.resolve(undefined) } @@ -402,8 +401,8 @@ class Cache { */ let r = null - if (request instanceof Request) { - r = request[kState] + if (webidl.is.Request(request)) { + r = getRequestState(request) if (r.method !== 'GET' && !options.ignoreMethod) { return false @@ -411,7 +410,7 @@ class Cache { } else { assert(typeof request === 'string') - r = new Request(request)[kState] + r = getRequestState(new Request(request)) } /** @type {CacheBatchOperation[]} */ @@ -468,16 +467,16 @@ class Cache { // 2. if (request !== undefined) { // 2.1 - if (request instanceof Request) { + if (webidl.is.Request(request)) { // 2.1.1 - r = request[kState] + r = getRequestState(request) // 2.1.2 if (r.method !== 'GET' && !options.ignoreMethod) { return [] } } else if (typeof request === 'string') { // 2.2 - r = new Request(request)[kState] + r = getRequestState(new Request(request)) } } @@ -515,6 +514,7 @@ class Cache { for (const request of requests) { const requestObject = fromInnerRequest( request, + undefined, new AbortController().signal, 'immutable' ) @@ -749,9 +749,9 @@ class Cache { // 2. if (request !== undefined) { - if (request instanceof Request) { + if (webidl.is.Request(request)) { // 2.1.1 - r = request[kState] + r = getRequestState(request) // 2.1.2 if (r.method !== 'GET' && !options.ignoreMethod) { @@ -759,7 +759,7 @@ class Cache { } } else if (typeof request === 'string') { // 2.2.1 - r = new Request(request)[kState] + r = getRequestState(new Request(request)) } } @@ -848,7 +848,10 @@ webidl.converters.MultiCacheQueryOptions = webidl.dictionaryConverter([ } ]) -webidl.converters.Response = webidl.interfaceConverter(Response) +webidl.converters.Response = webidl.interfaceConverter( + webidl.is.Response, + 'Response' +) webidl.converters['sequence'] = webidl.sequenceConverter( webidl.converters.RequestInfo diff --git a/deps/undici/src/lib/web/cache/cachestorage.js b/deps/undici/src/lib/web/cache/cachestorage.js index 55dba352e99d86..3b1604c872d521 100644 --- a/deps/undici/src/lib/web/cache/cachestorage.js +++ b/deps/undici/src/lib/web/cache/cachestorage.js @@ -1,9 +1,9 @@ 'use strict' -const { kConstruct } = require('./symbols') const { Cache } = require('./cache') const { webidl } = require('../fetch/webidl') const { kEnumerableProperty } = require('../../core/util') +const { kConstruct } = require('../../core/symbols') class CacheStorage { /** diff --git a/deps/undici/src/lib/web/cache/symbols.js b/deps/undici/src/lib/web/cache/symbols.js deleted file mode 100644 index 9271fb61267021..00000000000000 --- a/deps/undici/src/lib/web/cache/symbols.js +++ /dev/null @@ -1,5 +0,0 @@ -'use strict' - -module.exports = { - kConstruct: require('../../core/symbols').kConstruct -} diff --git a/deps/undici/src/lib/web/cookies/index.js b/deps/undici/src/lib/web/cookies/index.js index 323aa9ee6fbfb9..8bcb4e24a729a9 100644 --- a/deps/undici/src/lib/web/cookies/index.js +++ b/deps/undici/src/lib/web/cookies/index.js @@ -5,18 +5,20 @@ const { stringify } = require('./util') const { webidl } = require('../fetch/webidl') const { Headers } = require('../fetch/headers') +const brandChecks = webidl.brandCheckMultiple([Headers, globalThis.Headers].filter(Boolean)) + /** * @typedef {Object} Cookie * @property {string} name * @property {string} value - * @property {Date|number|undefined} expires - * @property {number|undefined} maxAge - * @property {string|undefined} domain - * @property {string|undefined} path - * @property {boolean|undefined} secure - * @property {boolean|undefined} httpOnly - * @property {'Strict'|'Lax'|'None'} sameSite - * @property {string[]} unparsed + * @property {Date|number} [expires] + * @property {number} [maxAge] + * @property {string} [domain] + * @property {string} [path] + * @property {boolean} [secure] + * @property {boolean} [httpOnly] + * @property {'Strict'|'Lax'|'None'} [sameSite] + * @property {string[]} [unparsed] */ /** @@ -26,9 +28,11 @@ const { Headers } = require('../fetch/headers') function getCookies (headers) { webidl.argumentLengthCheck(arguments, 1, 'getCookies') - webidl.brandCheck(headers, Headers, { strict: false }) + brandChecks(headers) const cookie = headers.get('cookie') + + /** @type {Record} */ const out = {} if (!cookie) { @@ -51,7 +55,7 @@ function getCookies (headers) { * @returns {void} */ function deleteCookie (headers, name, attributes) { - webidl.brandCheck(headers, Headers, { strict: false }) + brandChecks(headers) const prefix = 'deleteCookie' webidl.argumentLengthCheck(arguments, 2, prefix) @@ -76,7 +80,7 @@ function deleteCookie (headers, name, attributes) { function getSetCookies (headers) { webidl.argumentLengthCheck(arguments, 1, 'getSetCookies') - webidl.brandCheck(headers, Headers, { strict: false }) + brandChecks(headers) const cookies = headers.getSetCookie() @@ -87,6 +91,16 @@ function getSetCookies (headers) { return cookies.map((pair) => parseSetCookie(pair)) } +/** + * Parses a cookie string + * @param {string} cookie + */ +function parseCookie (cookie) { + cookie = webidl.converters.DOMString(cookie) + + return parseSetCookie(cookie) +} + /** * @param {Headers} headers * @param {Cookie} cookie @@ -95,14 +109,14 @@ function getSetCookies (headers) { function setCookie (headers, cookie) { webidl.argumentLengthCheck(arguments, 2, 'setCookie') - webidl.brandCheck(headers, Headers, { strict: false }) + brandChecks(headers) cookie = webidl.converters.Cookie(cookie) const str = stringify(cookie) if (str) { - headers.append('Set-Cookie', str) + headers.append('set-cookie', str, true) } } @@ -180,5 +194,6 @@ module.exports = { getCookies, deleteCookie, getSetCookies, - setCookie + setCookie, + parseCookie } diff --git a/deps/undici/src/lib/web/cookies/parse.js b/deps/undici/src/lib/web/cookies/parse.js index 3c48c26b93ffa0..4ac66dc09746a5 100644 --- a/deps/undici/src/lib/web/cookies/parse.js +++ b/deps/undici/src/lib/web/cookies/parse.js @@ -4,12 +4,13 @@ const { maxNameValuePairSize, maxAttributeValueSize } = require('./constants') const { isCTLExcludingHtab } = require('./util') const { collectASequenceOfCodePointsFast } = require('../fetch/data-url') const assert = require('node:assert') +const { unescape } = require('node:querystring') /** * @description Parses the field-value attributes of a set-cookie header string. * @see https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4 * @param {string} header - * @returns if the header is invalid, null will be returned + * @returns {import('./index').Cookie|null} if the header is invalid, null will be returned */ function parseSetCookie (header) { // 1. If the set-cookie-string contains a %x00-08 / %x0A-1F / %x7F @@ -76,8 +77,12 @@ function parseSetCookie (header) { // 6. The cookie-name is the name string, and the cookie-value is the // value string. + // https://datatracker.ietf.org/doc/html/rfc6265 + // To maximize compatibility with user agents, servers that wish to + // store arbitrary data in a cookie-value SHOULD encode that data, for + // example, using Base64 [RFC4648]. return { - name, value, ...parseUnparsedAttributes(unparsedAttributes) + name, value: unescape(value), ...parseUnparsedAttributes(unparsedAttributes) } } @@ -85,7 +90,7 @@ function parseSetCookie (header) { * Parses the remaining attributes of a set-cookie header * @see https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4 * @param {string} unparsedAttributes - * @param {[Object.]={}} cookieAttributeList + * @param {Object.} [cookieAttributeList={}] */ function parseUnparsedAttributes (unparsedAttributes, cookieAttributeList = {}) { // 1. If the unparsed-attributes string is empty, skip the rest of diff --git a/deps/undici/src/lib/web/eventsource/eventsource-stream.js b/deps/undici/src/lib/web/eventsource/eventsource-stream.js index 754934568d0562..59cf7468800bca 100644 --- a/deps/undici/src/lib/web/eventsource/eventsource-stream.js +++ b/deps/undici/src/lib/web/eventsource/eventsource-stream.js @@ -35,16 +35,16 @@ const SPACE = 0x20 /** * @typedef eventSourceSettings * @type {object} - * @property {string} lastEventId The last event ID received from the server. - * @property {string} origin The origin of the event source. - * @property {number} reconnectionTime The reconnection time, in milliseconds. + * @property {string} [lastEventId] The last event ID received from the server. + * @property {string} [origin] The origin of the event source. + * @property {number} [reconnectionTime] The reconnection time, in milliseconds. */ class EventSourceStream extends Transform { /** * @type {eventSourceSettings} */ - state = null + state /** * Leading byte-order-mark check. @@ -63,7 +63,7 @@ class EventSourceStream extends Transform { eventEndCheck = false /** - * @type {Buffer} + * @type {Buffer|null} */ buffer = null @@ -78,8 +78,9 @@ class EventSourceStream extends Transform { /** * @param {object} options - * @param {eventSourceSettings} options.eventSourceSettings - * @param {Function} [options.push] + * @param {boolean} [options.readableObjectMode] + * @param {eventSourceSettings} [options.eventSourceSettings] + * @param {(chunk: any, encoding?: BufferEncoding | undefined) => boolean} [options.push] */ constructor (options = {}) { // Enable object mode as EventSourceStream emits objects of shape @@ -280,7 +281,7 @@ class EventSourceStream extends Transform { /** * @param {Buffer} line - * @param {EventStreamEvent} event + * @param {EventSourceStreamEvent} event */ parseLine (line, event) { // If the line is empty (a blank line) diff --git a/deps/undici/src/lib/web/eventsource/eventsource.js b/deps/undici/src/lib/web/eventsource/eventsource.js index 5a488ffce276a0..02f4d47d006ec5 100644 --- a/deps/undici/src/lib/web/eventsource/eventsource.js +++ b/deps/undici/src/lib/web/eventsource/eventsource.js @@ -28,7 +28,8 @@ const defaultReconnectionTime = 3000 /** * The readyState attribute represents the state of the connection. - * @enum + * @typedef ReadyState + * @type {0|1|2} * @readonly * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#dom-eventsource-readystate-dev */ @@ -80,9 +81,12 @@ class EventSource extends EventTarget { message: null } - #url = null + #url #withCredentials = false + /** + * @type {ReadyState} + */ #readyState = CONNECTING #request = null @@ -98,7 +102,7 @@ class EventSource extends EventTarget { /** * Creates a new EventSource object. * @param {string} url - * @param {EventSourceInit} [eventSourceInitDict] + * @param {EventSourceInit} [eventSourceInitDict={}] * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#the-eventsource-interface */ constructor (url, eventSourceInitDict = {}) { @@ -117,7 +121,7 @@ class EventSource extends EventTarget { }) } - url = webidl.converters.USVString(url, prefix, 'url') + url = webidl.converters.USVString(url) eventSourceInitDict = webidl.converters.EventSourceInitDict(eventSourceInitDict, prefix, 'eventSourceInitDict') this.#dispatcher = eventSourceInitDict.dispatcher @@ -150,7 +154,7 @@ class EventSource extends EventTarget { // 7. If the value of eventSourceInitDict's withCredentials member is true, // then set corsAttributeState to Use Credentials and set ev's // withCredentials attribute to true. - if (eventSourceInitDict.withCredentials) { + if (eventSourceInitDict.withCredentials === true) { corsAttributeState = USE_CREDENTIALS this.#withCredentials = true } @@ -191,7 +195,7 @@ class EventSource extends EventTarget { /** * Returns the state of this EventSource object's connection. It can have the * values described below. - * @returns {0|1|2} + * @returns {ReadyState} * @readonly */ get readyState () { diff --git a/deps/undici/src/lib/web/fetch/body.js b/deps/undici/src/lib/web/fetch/body.js index 464e7b50e5ced7..b092b3c83db8b9 100644 --- a/deps/undici/src/lib/web/fetch/body.js +++ b/deps/undici/src/lib/web/fetch/body.js @@ -3,16 +3,13 @@ const util = require('../../core/util') const { ReadableStreamFrom, - isBlobLike, - isReadableStreamLike, readableStreamClose, createDeferredPromise, fullyReadBody, extractMimeType, utf8DecodeBytes } = require('./util') -const { FormData } = require('./formdata') -const { kState } = require('./symbols') +const { FormData, setFormDataState } = require('./formdata') const { webidl } = require('./webidl') const { Blob } = require('node:buffer') const assert = require('node:assert') @@ -42,9 +39,9 @@ function extractBody (object, keepalive = false) { let stream = null // 2. If object is a ReadableStream object, then set stream to object. - if (object instanceof ReadableStream) { + if (webidl.is.ReadableStream(object)) { stream = object - } else if (isBlobLike(object)) { + } else if (webidl.is.Blob(object)) { // 3. Otherwise, if object is a Blob object, set stream to the // result of running object’s get stream. stream = object.stream() @@ -67,7 +64,7 @@ function extractBody (object, keepalive = false) { } // 5. Assert: stream is a ReadableStream object. - assert(isReadableStreamLike(stream)) + assert(webidl.is.ReadableStream(stream)) // 6. Let action be null. let action = null @@ -89,7 +86,7 @@ function extractBody (object, keepalive = false) { // Set type to `text/plain;charset=UTF-8`. type = 'text/plain;charset=UTF-8' - } else if (object instanceof URLSearchParams) { + } else if (webidl.is.URLSearchParams(object)) { // URLSearchParams // spec says to run application/x-www-form-urlencoded on body.list @@ -112,7 +109,7 @@ function extractBody (object, keepalive = false) { // Set source to a copy of the bytes held by object. source = new Uint8Array(object.buffer.slice(object.byteOffset, object.byteOffset + object.byteLength)) - } else if (util.isFormDataLike(object)) { + } else if (webidl.is.FormData(object)) { const boundary = `----formdata-undici-0${`${Math.floor(Math.random() * 1e11)}`.padStart(11, '0')}` const prefix = `--${boundary}\r\nContent-Disposition: form-data` @@ -154,7 +151,10 @@ function extractBody (object, keepalive = false) { } } - const chunk = textEncoder.encode(`--${boundary}--`) + // CRLF is appended to the body to function with legacy servers and match other implementations. + // https://github.com/curl/curl/blob/3434c6b46e682452973972e8313613dfa58cd690/lib/mime.c#L1029-L1030 + // https://github.com/form-data/form-data/issues/63 + const chunk = textEncoder.encode(`--${boundary}--\r\n`) blobParts.push(chunk) length += chunk.byteLength if (hasUnknownSizeValue) { @@ -178,7 +178,7 @@ function extractBody (object, keepalive = false) { // followed by the multipart/form-data boundary string generated // by the multipart/form-data encoding algorithm. type = `multipart/form-data; boundary=${boundary}` - } else if (isBlobLike(object)) { + } else if (webidl.is.Blob(object)) { // Blob // Set source to object. @@ -206,7 +206,7 @@ function extractBody (object, keepalive = false) { } stream = - object instanceof ReadableStream ? object : ReadableStreamFrom(object) + webidl.is.ReadableStream(object) ? object : ReadableStreamFrom(object) } // 11. If source is a byte sequence, then set action to a @@ -265,7 +265,7 @@ function safelyExtractBody (object, keepalive = false) { // a byte sequence or BodyInit object object, run these steps: // 1. If object is a ReadableStream object, then: - if (object instanceof ReadableStream) { + if (webidl.is.ReadableStream(object)) { // Assert: object is neither disturbed nor locked. // istanbul ignore next assert(!util.isDisturbed(object), 'The body has already been consumed.') @@ -306,7 +306,7 @@ function throwIfAborted (state) { } } -function bodyMixinMethods (instance) { +function bodyMixinMethods (instance, getInternalState) { const methods = { blob () { // The blob() method steps are to return the result of @@ -315,7 +315,7 @@ function bodyMixinMethods (instance) { // contents are bytes and whose type attribute is this’s // MIME type. return consumeBody(this, (bytes) => { - let mimeType = bodyMimeType(this) + let mimeType = bodyMimeType(getInternalState(this)) if (mimeType === null) { mimeType = '' @@ -326,7 +326,7 @@ function bodyMixinMethods (instance) { // Return a Blob whose contents are bytes and type attribute // is mimeType. return new Blob([bytes], { type: mimeType }) - }, instance) + }, instance, getInternalState) }, arrayBuffer () { @@ -336,19 +336,19 @@ function bodyMixinMethods (instance) { // whose contents are bytes. return consumeBody(this, (bytes) => { return new Uint8Array(bytes).buffer - }, instance) + }, instance, getInternalState) }, text () { // The text() method steps are to return the result of running // consume body with this and UTF-8 decode. - return consumeBody(this, utf8DecodeBytes, instance) + return consumeBody(this, utf8DecodeBytes, instance, getInternalState) }, json () { // The json() method steps are to return the result of running // consume body with this and parse JSON from bytes. - return consumeBody(this, parseJSONFromBytes, instance) + return consumeBody(this, parseJSONFromBytes, instance, getInternalState) }, formData () { @@ -356,7 +356,7 @@ function bodyMixinMethods (instance) { // consume body with this and the following step given a byte sequence bytes: return consumeBody(this, (value) => { // 1. Let mimeType be the result of get the MIME type with this. - const mimeType = bodyMimeType(this) + const mimeType = bodyMimeType(getInternalState(this)) // 2. If mimeType is non-null, then switch on mimeType’s essence and run // the corresponding steps: @@ -364,17 +364,13 @@ function bodyMixinMethods (instance) { switch (mimeType.essence) { case 'multipart/form-data': { // 1. ... [long step] - const parsed = multipartFormDataParser(value, mimeType) - // 2. If that fails for some reason, then throw a TypeError. - if (parsed === 'failure') { - throw new TypeError('Failed to parse body as FormData.') - } + const parsed = multipartFormDataParser(value, mimeType) // 3. Return a new FormData object, appending each entry, // resulting from the parsing operation, to its entry list. const fd = new FormData() - fd[kState] = parsed + setFormDataState(fd, parsed) return fd } @@ -400,7 +396,7 @@ function bodyMixinMethods (instance) { throw new TypeError( 'Content-Type was not one of "multipart/form-data" or "application/x-www-form-urlencoded".' ) - }, instance) + }, instance, getInternalState) }, bytes () { @@ -409,33 +405,36 @@ function bodyMixinMethods (instance) { // result of creating a Uint8Array from bytes in this’s relevant realm. return consumeBody(this, (bytes) => { return new Uint8Array(bytes) - }, instance) + }, instance, getInternalState) } } return methods } -function mixinBody (prototype) { - Object.assign(prototype.prototype, bodyMixinMethods(prototype)) +function mixinBody (prototype, getInternalState) { + Object.assign(prototype.prototype, bodyMixinMethods(prototype, getInternalState)) } /** * @see https://fetch.spec.whatwg.org/#concept-body-consume-body - * @param {Response|Request} object + * @param {any} object internal state * @param {(value: unknown) => unknown} convertBytesToJSValue - * @param {Response|Request} instance + * @param {any} instance + * @param {(target: any) => any} getInternalState */ -async function consumeBody (object, convertBytesToJSValue, instance) { +async function consumeBody (object, convertBytesToJSValue, instance, getInternalState) { webidl.brandCheck(object, instance) + const state = getInternalState(object) + // 1. If object is unusable, then return a promise rejected // with a TypeError. - if (bodyUnusable(object)) { + if (bodyUnusable(state)) { throw new TypeError('Body is unusable: Body has already been read') } - throwIfAborted(object[kState]) + throwIfAborted(state) // 2. Let promise be a new promise. const promise = createDeferredPromise() @@ -457,22 +456,25 @@ async function consumeBody (object, convertBytesToJSValue, instance) { // 5. If object’s body is null, then run successSteps with an // empty byte sequence. - if (object[kState].body == null) { + if (state.body == null) { successSteps(Buffer.allocUnsafe(0)) return promise.promise } // 6. Otherwise, fully read object’s body given successSteps, // errorSteps, and object’s relevant global object. - await fullyReadBody(object[kState].body, successSteps, errorSteps) + fullyReadBody(state.body, successSteps, errorSteps) // 7. Return promise. return promise.promise } -// https://fetch.spec.whatwg.org/#body-unusable +/** + * @see https://fetch.spec.whatwg.org/#body-unusable + * @param {any} object internal state + */ function bodyUnusable (object) { - const body = object[kState].body + const body = object.body // An object including the Body interface mixin is // said to be unusable if its body is non-null and @@ -490,14 +492,14 @@ function parseJSONFromBytes (bytes) { /** * @see https://fetch.spec.whatwg.org/#concept-body-mime-type - * @param {import('./response').Response|import('./request').Request} requestOrResponse + * @param {any} requestOrResponse internal state */ function bodyMimeType (requestOrResponse) { // 1. Let headers be null. // 2. If requestOrResponse is a Request object, then set headers to requestOrResponse’s request’s header list. // 3. Otherwise, set headers to requestOrResponse’s response’s header list. /** @type {import('./headers').HeadersList} */ - const headers = requestOrResponse[kState].headersList + const headers = requestOrResponse.headersList // 4. Let mimeType be the result of extracting a MIME type from headers. const mimeType = extractMimeType(headers) diff --git a/deps/undici/src/lib/web/fetch/constants.js b/deps/undici/src/lib/web/fetch/constants.js index 1f285e06283e18..ef63b0c8e106b5 100644 --- a/deps/undici/src/lib/web/fetch/constants.js +++ b/deps/undici/src/lib/web/fetch/constants.js @@ -22,10 +22,9 @@ const badPorts = /** @type {const} */ ([ const badPortsSet = new Set(badPorts) /** - * @see https://w3c.github.io/webappsec-referrer-policy/#referrer-policies + * @see https://w3c.github.io/webappsec-referrer-policy/#referrer-policy-header */ -const referrerPolicy = /** @type {const} */ ([ - '', +const referrerPolicyTokens = /** @type {const} */ ([ 'no-referrer', 'no-referrer-when-downgrade', 'same-origin', @@ -35,7 +34,15 @@ const referrerPolicy = /** @type {const} */ ([ 'strict-origin-when-cross-origin', 'unsafe-url' ]) -const referrerPolicySet = new Set(referrerPolicy) + +/** + * @see https://w3c.github.io/webappsec-referrer-policy/#referrer-policies + */ +const referrerPolicy = /** @type {const} */ ([ + '', + ...referrerPolicyTokens +]) +const referrerPolicyTokensSet = new Set(referrerPolicyTokens) const requestRedirect = /** @type {const} */ (['follow', 'manual', 'error']) @@ -120,5 +127,5 @@ module.exports = { corsSafeListedMethodsSet, safeMethodsSet, forbiddenMethodsSet, - referrerPolicySet + referrerPolicyTokens: referrerPolicyTokensSet } diff --git a/deps/undici/src/lib/web/fetch/data-url.js b/deps/undici/src/lib/web/fetch/data-url.js index 7a74db6bde89c4..bc7a692a05a2b3 100644 --- a/deps/undici/src/lib/web/fetch/data-url.js +++ b/deps/undici/src/lib/web/fetch/data-url.js @@ -283,7 +283,7 @@ function parseMIMEType (input) { // 5. If position is past the end of input, then return // failure - if (position.position > input.length) { + if (position.position >= input.length) { return 'failure' } @@ -364,7 +364,7 @@ function parseMIMEType (input) { } // 6. If position is past the end of input, then break. - if (position.position > input.length) { + if (position.position >= input.length) { break } @@ -431,7 +431,7 @@ function parseMIMEType (input) { /** @param {string} data */ function forgivingBase64 (data) { // 1. Remove all ASCII whitespace from data. - data = data.replace(ASCII_WHITESPACE_REPLACE_REGEX, '') // eslint-disable-line + data = data.replace(ASCII_WHITESPACE_REPLACE_REGEX, '') let dataLength = data.length // 2. If data’s code point length divides by 4 leaving @@ -471,9 +471,9 @@ function forgivingBase64 (data) { /** * @param {string} input * @param {{ position: number }} position - * @param {boolean?} extractValue + * @param {boolean} [extractValue=false] */ -function collectAnHTTPQuotedString (input, position, extractValue) { +function collectAnHTTPQuotedString (input, position, extractValue = false) { // 1. Let positionStart be position. const positionStart = position.position diff --git a/deps/undici/src/lib/web/fetch/file.js b/deps/undici/src/lib/web/fetch/file.js deleted file mode 100644 index 31ba40718ec271..00000000000000 --- a/deps/undici/src/lib/web/fetch/file.js +++ /dev/null @@ -1,126 +0,0 @@ -'use strict' - -const { Blob, File } = require('node:buffer') -const { kState } = require('./symbols') -const { webidl } = require('./webidl') - -// TODO(@KhafraDev): remove -class FileLike { - constructor (blobLike, fileName, options = {}) { - // TODO: argument idl type check - - // The File constructor is invoked with two or three parameters, depending - // on whether the optional dictionary parameter is used. When the File() - // constructor is invoked, user agents must run the following steps: - - // 1. Let bytes be the result of processing blob parts given fileBits and - // options. - - // 2. Let n be the fileName argument to the constructor. - const n = fileName - - // 3. Process FilePropertyBag dictionary argument by running the following - // substeps: - - // 1. If the type member is provided and is not the empty string, let t - // be set to the type dictionary member. If t contains any characters - // outside the range U+0020 to U+007E, then set t to the empty string - // and return from these substeps. - // TODO - const t = options.type - - // 2. Convert every character in t to ASCII lowercase. - // TODO - - // 3. If the lastModified member is provided, let d be set to the - // lastModified dictionary member. If it is not provided, set d to the - // current date and time represented as the number of milliseconds since - // the Unix Epoch (which is the equivalent of Date.now() [ECMA-262]). - const d = options.lastModified ?? Date.now() - - // 4. Return a new File object F such that: - // F refers to the bytes byte sequence. - // F.size is set to the number of total bytes in bytes. - // F.name is set to n. - // F.type is set to t. - // F.lastModified is set to d. - - this[kState] = { - blobLike, - name: n, - type: t, - lastModified: d - } - } - - stream (...args) { - webidl.brandCheck(this, FileLike) - - return this[kState].blobLike.stream(...args) - } - - arrayBuffer (...args) { - webidl.brandCheck(this, FileLike) - - return this[kState].blobLike.arrayBuffer(...args) - } - - slice (...args) { - webidl.brandCheck(this, FileLike) - - return this[kState].blobLike.slice(...args) - } - - text (...args) { - webidl.brandCheck(this, FileLike) - - return this[kState].blobLike.text(...args) - } - - get size () { - webidl.brandCheck(this, FileLike) - - return this[kState].blobLike.size - } - - get type () { - webidl.brandCheck(this, FileLike) - - return this[kState].blobLike.type - } - - get name () { - webidl.brandCheck(this, FileLike) - - return this[kState].name - } - - get lastModified () { - webidl.brandCheck(this, FileLike) - - return this[kState].lastModified - } - - get [Symbol.toStringTag] () { - return 'File' - } -} - -webidl.converters.Blob = webidl.interfaceConverter(Blob) - -// If this function is moved to ./util.js, some tools (such as -// rollup) will warn about circular dependencies. See: -// https://github.com/nodejs/undici/issues/1629 -function isFileLike (object) { - return ( - (object instanceof File) || - ( - object && - (typeof object.stream === 'function' || - typeof object.arrayBuffer === 'function') && - object[Symbol.toStringTag] === 'File' - ) - ) -} - -module.exports = { FileLike, isFileLike } diff --git a/deps/undici/src/lib/web/fetch/formdata-parser.js b/deps/undici/src/lib/web/fetch/formdata-parser.js index 315a4626da5775..f43b5fd98e5b5c 100644 --- a/deps/undici/src/lib/web/fetch/formdata-parser.js +++ b/deps/undici/src/lib/web/fetch/formdata-parser.js @@ -3,15 +3,15 @@ const { isUSVString, bufferToLowerCasedHeaderName } = require('../../core/util') const { utf8DecodeBytes } = require('./util') const { HTTP_TOKEN_CODEPOINTS, isomorphicDecode } = require('./data-url') -const { isFileLike } = require('./file') const { makeEntry } = require('./formdata') +const { webidl } = require('./webidl') const assert = require('node:assert') const { File: NodeFile } = require('node:buffer') const File = globalThis.File ?? NodeFile const formDataNameBuffer = Buffer.from('form-data; name="') -const filenameBuffer = Buffer.from('; filename') +const filenameBuffer = Buffer.from('filename') const dd = Buffer.from('--') const ddcrlf = Buffer.from('--\r\n') @@ -75,7 +75,7 @@ function multipartFormDataParser (input, mimeType) { // Otherwise, let boundary be the result of UTF-8 decoding mimeType’s // parameters["boundary"]. if (boundaryString === undefined) { - return 'failure' + throw parsingError('missing boundary in content-type header') } const boundary = Buffer.from(`--${boundaryString}`, 'utf8') @@ -111,7 +111,7 @@ function multipartFormDataParser (input, mimeType) { if (input.subarray(position.position, position.position + boundary.length).equals(boundary)) { position.position += boundary.length } else { - return 'failure' + throw parsingError('expected a value starting with -- and the boundary') } // 5.2. If position points to the sequence of bytes 0x2D 0x2D 0x0D 0x0A @@ -127,7 +127,7 @@ function multipartFormDataParser (input, mimeType) { // 5.3. If position does not point to a sequence of bytes starting with 0x0D // 0x0A (CR LF), return failure. if (input[position.position] !== 0x0d || input[position.position + 1] !== 0x0a) { - return 'failure' + throw parsingError('expected CRLF') } // 5.4. Advance position by 2. (This skips past the newline.) @@ -138,10 +138,6 @@ function multipartFormDataParser (input, mimeType) { // is not failure. Otherwise, return failure. const result = parseMultipartFormDataHeaders(input, position) - if (result === 'failure') { - return 'failure' - } - let { name, filename, contentType, encoding } = result // 5.6. Advance position by 2. (This skips past the empty line that marks @@ -157,7 +153,7 @@ function multipartFormDataParser (input, mimeType) { const boundaryIndex = input.indexOf(boundary.subarray(2), position.position) if (boundaryIndex === -1) { - return 'failure' + throw parsingError('expected boundary after body') } body = input.subarray(position.position, boundaryIndex - 4) @@ -174,7 +170,7 @@ function multipartFormDataParser (input, mimeType) { // 5.9. If position does not point to a sequence of bytes starting with // 0x0D 0x0A (CR LF), return failure. Otherwise, advance position by 2. if (input[position.position] !== 0x0d || input[position.position + 1] !== 0x0a) { - return 'failure' + throw parsingError('expected CRLF') } else { position.position += 2 } @@ -205,7 +201,7 @@ function multipartFormDataParser (input, mimeType) { // 5.12. Assert: name is a scalar value string and value is either a scalar value string or a File object. assert(isUSVString(name)) - assert((typeof value === 'string' && isUSVString(value)) || isFileLike(value)) + assert((typeof value === 'string' && isUSVString(value)) || webidl.is.File(value)) // 5.13. Create an entry with name and value, and append it to entry list. entryList.push(makeEntry(name, value, filename)) @@ -230,7 +226,7 @@ function parseMultipartFormDataHeaders (input, position) { if (input[position.position] === 0x0d && input[position.position + 1] === 0x0a) { // 2.1.1. If name is null, return failure. if (name === null) { - return 'failure' + throw parsingError('header name is null') } // 2.1.2. Return name, filename and contentType. @@ -250,12 +246,12 @@ function parseMultipartFormDataHeaders (input, position) { // 2.4. If header name does not match the field-name token production, return failure. if (!HTTP_TOKEN_CODEPOINTS.test(headerName.toString())) { - return 'failure' + throw parsingError('header name does not match the field-name token production') } // 2.5. If the byte at position is not 0x3A (:), return failure. if (input[position.position] !== 0x3a) { - return 'failure' + throw parsingError('expected :') } // 2.6. Advance position by 1. @@ -278,7 +274,7 @@ function parseMultipartFormDataHeaders (input, position) { // 2. If position does not point to a sequence of bytes starting with // `form-data; name="`, return failure. if (!bufferStartsWith(input, formDataNameBuffer, position)) { - return 'failure' + throw parsingError('expected form-data; name=" for content-disposition header') } // 3. Advance position so it points at the byte after the next 0x22 (") @@ -290,34 +286,61 @@ function parseMultipartFormDataHeaders (input, position) { // failure. name = parseMultipartFormDataName(input, position) - if (name === null) { - return 'failure' - } - // 5. If position points to a sequence of bytes starting with `; filename="`: - if (bufferStartsWith(input, filenameBuffer, position)) { - // Note: undici also handles filename* - let check = position.position + filenameBuffer.length - - if (input[check] === 0x2a) { - position.position += 1 - check += 1 - } - - if (input[check] !== 0x3d || input[check + 1] !== 0x22) { // =" - return 'failure' - } - - // 1. Advance position so it points at the byte after the next 0x22 (") byte - // (the one in the sequence of bytes matched above). - position.position += 12 - - // 2. Set filename to the result of parsing a multipart/form-data name given - // input and position, if the result is not failure. Otherwise, return failure. - filename = parseMultipartFormDataName(input, position) - - if (filename === null) { - return 'failure' + if (input[position.position] === 0x3b /* ; */ && input[position.position + 1] === 0x20 /* ' ' */) { + const at = { position: position.position + 2 } + + if (bufferStartsWith(input, filenameBuffer, at)) { + if (input[at.position + 8] === 0x2a /* '*' */) { + at.position += 10 // skip past filename*= + + // Remove leading http tab and spaces. See RFC for examples. + // https://datatracker.ietf.org/doc/html/rfc6266#section-5 + collectASequenceOfBytes( + (char) => char === 0x20 || char === 0x09, + input, + at + ) + + const headerValue = collectASequenceOfBytes( + (char) => char !== 0x20 && char !== 0x0d && char !== 0x0a, // ' ' or CRLF + input, + at + ) + + if ( + (headerValue[0] !== 0x75 && headerValue[0] !== 0x55) || // u or U + (headerValue[1] !== 0x74 && headerValue[1] !== 0x54) || // t or T + (headerValue[2] !== 0x66 && headerValue[2] !== 0x46) || // f or F + headerValue[3] !== 0x2d || // - + headerValue[4] !== 0x38 // 8 + ) { + throw parsingError('unknown encoding, expected utf-8\'\'') + } + + // skip utf-8'' + filename = decodeURIComponent(new TextDecoder().decode(headerValue.subarray(7))) + + position.position = at.position + } else { + // 1. Advance position so it points at the byte after the next 0x22 (") byte + // (the one in the sequence of bytes matched above). + position.position += 11 + + // Remove leading http tab and spaces. See RFC for examples. + // https://datatracker.ietf.org/doc/html/rfc6266#section-5 + collectASequenceOfBytes( + (char) => char === 0x20 || char === 0x09, + input, + position + ) + + position.position++ // skip past " after removing whitespace + + // 2. Set filename to the result of parsing a multipart/form-data name given + // input and position, if the result is not failure. Otherwise, return failure. + filename = parseMultipartFormDataName(input, position) + } } } @@ -367,7 +390,7 @@ function parseMultipartFormDataHeaders (input, position) { // 2.9. If position does not point to a sequence of bytes starting with 0x0D 0x0A // (CR LF), return failure. Otherwise, advance position by 2 (past the newline). if (input[position.position] !== 0x0d && input[position.position + 1] !== 0x0a) { - return 'failure' + throw parsingError('expected CRLF') } else { position.position += 2 } @@ -393,7 +416,7 @@ function parseMultipartFormDataName (input, position) { // 3. If the byte at position is not 0x22 ("), return failure. Otherwise, advance position by 1. if (input[position.position] !== 0x22) { - return null // name could be 'failure' + throw parsingError('expected "') } else { position.position++ } @@ -468,6 +491,10 @@ function bufferStartsWith (buffer, start, position) { return true } +function parsingError (cause) { + return new TypeError('Failed to parse body as FormData.', { cause: new TypeError(cause) }) +} + module.exports = { multipartFormDataParser, validateBoundary diff --git a/deps/undici/src/lib/web/fetch/formdata.js b/deps/undici/src/lib/web/fetch/formdata.js index 544e4125519382..8020a26e1163c0 100644 --- a/deps/undici/src/lib/web/fetch/formdata.js +++ b/deps/undici/src/lib/web/fetch/formdata.js @@ -1,9 +1,7 @@ 'use strict' -const { isBlobLike, iteratorMixin } = require('./util') -const { kState } = require('./symbols') +const { iteratorMixin } = require('./util') const { kEnumerableProperty } = require('../../core/util') -const { FileLike, isFileLike } = require('./file') const { webidl } = require('./webidl') const { File: NativeFile } = require('node:buffer') const nodeUtil = require('node:util') @@ -13,6 +11,8 @@ const File = globalThis.File ?? NativeFile // https://xhr.spec.whatwg.org/#formdata class FormData { + #state = [] + constructor (form) { webidl.util.markAsUncloneable(this) @@ -23,8 +23,6 @@ class FormData { types: ['undefined'] }) } - - this[kState] = [] } append (name, value, filename = undefined) { @@ -33,28 +31,26 @@ class FormData { const prefix = 'FormData.append' webidl.argumentLengthCheck(arguments, 2, prefix) - if (arguments.length === 3 && !isBlobLike(value)) { - throw new TypeError( - "Failed to execute 'append' on 'FormData': parameter 2 is not of type 'Blob'" - ) + name = webidl.converters.USVString(name) + + if (arguments.length === 3 || webidl.is.Blob(value)) { + value = webidl.converters.Blob(value, prefix, 'value') + + if (filename !== undefined) { + filename = webidl.converters.USVString(filename) + } + } else { + value = webidl.converters.USVString(value) } // 1. Let value be value if given; otherwise blobValue. - name = webidl.converters.USVString(name, prefix, 'name') - value = isBlobLike(value) - ? webidl.converters.Blob(value, prefix, 'value', { strict: false }) - : webidl.converters.USVString(value, prefix, 'value') - filename = arguments.length === 3 - ? webidl.converters.USVString(filename, prefix, 'filename') - : undefined - // 2. Let entry be the result of creating an entry with // name, value, and filename if given. const entry = makeEntry(name, value, filename) // 3. Append entry to this’s entry list. - this[kState].push(entry) + this.#state.push(entry) } delete (name) { @@ -63,11 +59,11 @@ class FormData { const prefix = 'FormData.delete' webidl.argumentLengthCheck(arguments, 1, prefix) - name = webidl.converters.USVString(name, prefix, 'name') + name = webidl.converters.USVString(name) // The delete(name) method steps are to remove all entries whose name // is name from this’s entry list. - this[kState] = this[kState].filter(entry => entry.name !== name) + this.#state = this.#state.filter(entry => entry.name !== name) } get (name) { @@ -76,18 +72,18 @@ class FormData { const prefix = 'FormData.get' webidl.argumentLengthCheck(arguments, 1, prefix) - name = webidl.converters.USVString(name, prefix, 'name') + name = webidl.converters.USVString(name) // 1. If there is no entry whose name is name in this’s entry list, // then return null. - const idx = this[kState].findIndex((entry) => entry.name === name) + const idx = this.#state.findIndex((entry) => entry.name === name) if (idx === -1) { return null } // 2. Return the value of the first entry whose name is name from // this’s entry list. - return this[kState][idx].value + return this.#state[idx].value } getAll (name) { @@ -96,13 +92,13 @@ class FormData { const prefix = 'FormData.getAll' webidl.argumentLengthCheck(arguments, 1, prefix) - name = webidl.converters.USVString(name, prefix, 'name') + name = webidl.converters.USVString(name) // 1. If there is no entry whose name is name in this’s entry list, // then return the empty list. // 2. Return the values of all entries whose name is name, in order, // from this’s entry list. - return this[kState] + return this.#state .filter((entry) => entry.name === name) .map((entry) => entry.value) } @@ -113,11 +109,11 @@ class FormData { const prefix = 'FormData.has' webidl.argumentLengthCheck(arguments, 1, prefix) - name = webidl.converters.USVString(name, prefix, 'name') + name = webidl.converters.USVString(name) // The has(name) method steps are to return true if there is an entry // whose name is name in this’s entry list; otherwise false. - return this[kState].findIndex((entry) => entry.name === name) !== -1 + return this.#state.findIndex((entry) => entry.name === name) !== -1 } set (name, value, filename = undefined) { @@ -126,10 +122,16 @@ class FormData { const prefix = 'FormData.set' webidl.argumentLengthCheck(arguments, 2, prefix) - if (arguments.length === 3 && !isBlobLike(value)) { - throw new TypeError( - "Failed to execute 'set' on 'FormData': parameter 2 is not of type 'Blob'" - ) + name = webidl.converters.USVString(name) + + if (arguments.length === 3 || webidl.is.Blob(value)) { + value = webidl.converters.Blob(value, prefix, 'value') + + if (filename !== undefined) { + filename = webidl.converters.USVString(filename) + } + } else { + value = webidl.converters.USVString(value) } // The set(name, value) and set(name, blobValue, filename) method steps @@ -137,35 +139,27 @@ class FormData { // 1. Let value be value if given; otherwise blobValue. - name = webidl.converters.USVString(name, prefix, 'name') - value = isBlobLike(value) - ? webidl.converters.Blob(value, prefix, 'name', { strict: false }) - : webidl.converters.USVString(value, prefix, 'name') - filename = arguments.length === 3 - ? webidl.converters.USVString(filename, prefix, 'name') - : undefined - // 2. Let entry be the result of creating an entry with name, value, and // filename if given. const entry = makeEntry(name, value, filename) // 3. If there are entries in this’s entry list whose name is name, then // replace the first such entry with entry and remove the others. - const idx = this[kState].findIndex((entry) => entry.name === name) + const idx = this.#state.findIndex((entry) => entry.name === name) if (idx !== -1) { - this[kState] = [ - ...this[kState].slice(0, idx), + this.#state = [ + ...this.#state.slice(0, idx), entry, - ...this[kState].slice(idx + 1).filter((entry) => entry.name !== name) + ...this.#state.slice(idx + 1).filter((entry) => entry.name !== name) ] } else { // 4. Otherwise, append entry to this’s entry list. - this[kState].push(entry) + this.#state.push(entry) } } [nodeUtil.inspect.custom] (depth, options) { - const state = this[kState].reduce((a, b) => { + const state = this.#state.reduce((a, b) => { if (a[b.name]) { if (Array.isArray(a[b.name])) { a[b.name].push(b.value) @@ -187,9 +181,28 @@ class FormData { // remove [Object null prototype] return `FormData ${output.slice(output.indexOf(']') + 2)}` } + + /** + * @param {FormData} formData + */ + static getFormDataState (formData) { + return formData.#state + } + + /** + * @param {FormData} formData + * @param {any[]} newState + */ + static setFormDataState (formData, newState) { + formData.#state = newState + } } -iteratorMixin('FormData', FormData, kState, 'name', 'value') +const { getFormDataState, setFormDataState } = FormData +Reflect.deleteProperty(FormData, 'getFormDataState') +Reflect.deleteProperty(FormData, 'setFormDataState') + +iteratorMixin('FormData', FormData, getFormDataState, 'name', 'value') Object.defineProperties(FormData.prototype, { append: kEnumerableProperty, @@ -224,10 +237,8 @@ function makeEntry (name, value, filename) { // 1. If value is not a File object, then set value to a new File object, // representing the same bytes, whose name attribute value is "blob" - if (!isFileLike(value)) { - value = value instanceof Blob - ? new File([value], 'blob', { type: value.type }) - : new FileLike(value, 'blob', { type: value.type }) + if (!webidl.is.File(value)) { + value = new File([value], 'blob', { type: value.type }) } // 2. If filename is given, then set value to a new File object, @@ -239,9 +250,7 @@ function makeEntry (name, value, filename) { lastModified: value.lastModified } - value = value instanceof NativeFile - ? new File([value], filename, options) - : new FileLike(value, filename, options) + value = new File([value], filename, options) } } @@ -249,4 +258,6 @@ function makeEntry (name, value, filename) { return { name, value } } -module.exports = { FormData, makeEntry } +webidl.is.FormData = webidl.util.MakeTypeAssertion(FormData) + +module.exports = { FormData, makeEntry, setFormDataState } diff --git a/deps/undici/src/lib/web/fetch/headers.js b/deps/undici/src/lib/web/fetch/headers.js index a68daf4a5d4737..d782d2a2793773 100644 --- a/deps/undici/src/lib/web/fetch/headers.js +++ b/deps/undici/src/lib/web/fetch/headers.js @@ -13,19 +13,18 @@ const { webidl } = require('./webidl') const assert = require('node:assert') const util = require('node:util') -const kHeadersMap = Symbol('headers map') -const kHeadersSortedMap = Symbol('headers map sorted') - /** * @param {number} code + * @returns {code is (0x0a | 0x0d | 0x09 | 0x20)} */ function isHTTPWhiteSpaceCharCode (code) { - return code === 0x00a || code === 0x00d || code === 0x009 || code === 0x020 + return code === 0x0a || code === 0x0d || code === 0x09 || code === 0x20 } /** * @see https://fetch.spec.whatwg.org/#concept-header-value-normalize * @param {string} potentialValue + * @returns {string} */ function headerValueNormalize (potentialValue) { // To normalize a byte sequence potentialValue, remove @@ -39,6 +38,10 @@ function headerValueNormalize (potentialValue) { return i === 0 && j === potentialValue.length ? potentialValue : potentialValue.substring(i, j) } +/** + * @param {Headers} headers + * @param {Array|Object} object + */ function fill (headers, object) { // To fill a Headers object headers with a given object object, run these steps: @@ -78,6 +81,9 @@ function fill (headers, object) { /** * @see https://fetch.spec.whatwg.org/#concept-headers-append + * @param {Headers} headers + * @param {string} name + * @param {string} value */ function appendHeader (headers, name, value) { // 1. Normalize value. @@ -119,6 +125,67 @@ function appendHeader (headers, name, value) { // privileged no-CORS request headers from headers } +// https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine +/** + * @param {Headers} target + */ +function headersListSortAndCombine (target) { + const headersList = getHeadersList(target) + + if (!headersList) { + return [] + } + + if (headersList.sortedMap) { + return headersList.sortedMap + } + + // 1. Let headers be an empty list of headers with the key being the name + // and value the value. + const headers = [] + + // 2. Let names be the result of convert header names to a sorted-lowercase + // set with all the names of the headers in list. + const names = headersList.toSortedArray() + + const cookies = headersList.cookies + + // fast-path + if (cookies === null || cookies.length === 1) { + // Note: The non-null assertion of value has already been done by `HeadersList#toSortedArray` + return (headersList.sortedMap = names) + } + + // 3. For each name of names: + for (let i = 0; i < names.length; ++i) { + const { 0: name, 1: value } = names[i] + // 1. If name is `set-cookie`, then: + if (name === 'set-cookie') { + // 1. Let values be a list of all values of headers in list whose name + // is a byte-case-insensitive match for name, in order. + + // 2. For each value of values: + // 1. Append (name, value) to headers. + for (let j = 0; j < cookies.length; ++j) { + headers.push([name, cookies[j]]) + } + } else { + // 2. Otherwise: + + // 1. Let value be the result of getting name from list. + + // 2. Assert: value is non-null. + // Note: This operation was done by `HeadersList#toSortedArray`. + + // 3. Append (name, value) to headers. + headers.push([name, value]) + } + } + + // 4. Return headers. + return (headersList.sortedMap = headers) +} + function compareHeaderName (a, b) { return a[0] < b[0] ? -1 : 1 } @@ -127,14 +194,17 @@ class HeadersList { /** @type {[string, string][]|null} */ cookies = null + sortedMap + headersMap + constructor (init) { if (init instanceof HeadersList) { - this[kHeadersMap] = new Map(init[kHeadersMap]) - this[kHeadersSortedMap] = init[kHeadersSortedMap] + this.headersMap = new Map(init.headersMap) + this.sortedMap = init.sortedMap this.cookies = init.cookies === null ? null : [...init.cookies] } else { - this[kHeadersMap] = new Map(init) - this[kHeadersSortedMap] = null + this.headersMap = new Map(init) + this.sortedMap = null } } @@ -148,12 +218,12 @@ class HeadersList { // contains a header whose name is a byte-case-insensitive // match for name. - return this[kHeadersMap].has(isLowerCase ? name : name.toLowerCase()) + return this.headersMap.has(isLowerCase ? name : name.toLowerCase()) } clear () { - this[kHeadersMap].clear() - this[kHeadersSortedMap] = null + this.headersMap.clear() + this.sortedMap = null this.cookies = null } @@ -164,22 +234,22 @@ class HeadersList { * @param {boolean} isLowerCase */ append (name, value, isLowerCase) { - this[kHeadersSortedMap] = null + this.sortedMap = null // 1. If list contains name, then set name to the first such // header’s name. const lowercaseName = isLowerCase ? name : name.toLowerCase() - const exists = this[kHeadersMap].get(lowercaseName) + const exists = this.headersMap.get(lowercaseName) // 2. Append (name, value) to list. if (exists) { const delimiter = lowercaseName === 'cookie' ? '; ' : ', ' - this[kHeadersMap].set(lowercaseName, { + this.headersMap.set(lowercaseName, { name: exists.name, value: `${exists.value}${delimiter}${value}` }) } else { - this[kHeadersMap].set(lowercaseName, { name, value }) + this.headersMap.set(lowercaseName, { name, value }) } if (lowercaseName === 'set-cookie') { @@ -194,7 +264,7 @@ class HeadersList { * @param {boolean} isLowerCase */ set (name, value, isLowerCase) { - this[kHeadersSortedMap] = null + this.sortedMap = null const lowercaseName = isLowerCase ? name : name.toLowerCase() if (lowercaseName === 'set-cookie') { @@ -205,7 +275,7 @@ class HeadersList { // the first such header to value and remove the // others. // 2. Otherwise, append header (name, value) to list. - this[kHeadersMap].set(lowercaseName, { name, value }) + this.headersMap.set(lowercaseName, { name, value }) } /** @@ -214,14 +284,14 @@ class HeadersList { * @param {boolean} isLowerCase */ delete (name, isLowerCase) { - this[kHeadersSortedMap] = null + this.sortedMap = null if (!isLowerCase) name = name.toLowerCase() if (name === 'set-cookie') { this.cookies = null } - this[kHeadersMap].delete(name) + this.headersMap.delete(name) } /** @@ -235,12 +305,12 @@ class HeadersList { // 2. Return the values of all headers in list whose name // is a byte-case-insensitive match for name, // separated from each other by 0x2C 0x20, in order. - return this[kHeadersMap].get(isLowerCase ? name : name.toLowerCase())?.value ?? null + return this.headersMap.get(isLowerCase ? name : name.toLowerCase())?.value ?? null } * [Symbol.iterator] () { // use the lowercased name - for (const { 0: name, 1: { value } } of this[kHeadersMap]) { + for (const { 0: name, 1: { value } } of this.headersMap) { yield [name, value] } } @@ -248,8 +318,8 @@ class HeadersList { get entries () { const headers = {} - if (this[kHeadersMap].size !== 0) { - for (const { name, value } of this[kHeadersMap].values()) { + if (this.headersMap.size !== 0) { + for (const { name, value } of this.headersMap.values()) { headers[name] = value } } @@ -258,14 +328,14 @@ class HeadersList { } rawValues () { - return this[kHeadersMap].values() + return this.headersMap.values() } get entriesList () { const headers = [] - if (this[kHeadersMap].size !== 0) { - for (const { 0: lowerName, 1: { name, value } } of this[kHeadersMap]) { + if (this.headersMap.size !== 0) { + for (const { 0: lowerName, 1: { name, value } } of this.headersMap) { if (lowerName === 'set-cookie') { for (const cookie of this.cookies) { headers.push([name, cookie]) @@ -281,7 +351,7 @@ class HeadersList { // https://fetch.spec.whatwg.org/#convert-header-names-to-a-sorted-lowercase-set toSortedArray () { - const size = this[kHeadersMap].size + const size = this.headersMap.size const array = new Array(size) // In most cases, you will use the fast-path. // fast-path: Use binary insertion sort for small arrays. @@ -292,7 +362,7 @@ class HeadersList { } // Improve performance by unrolling loop and avoiding double-loop. // Double-loop-less version of the binary insertion sort. - const iterator = this[kHeadersMap][Symbol.iterator]() + const iterator = this.headersMap[Symbol.iterator]() const firstValue = iterator.next().value // set [name, value] to first index. array[0] = [firstValue[0], firstValue[1].value] @@ -342,7 +412,7 @@ class HeadersList { // This case would be a rare occurrence. // slow-path: fallback let i = 0 - for (const { 0: name, 1: { value } } of this[kHeadersMap]) { + for (const { 0: name, 1: { value } } of this.headersMap) { array[i++] = [name, value] // https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine // 3.2.2. Assert: value is non-null. @@ -356,8 +426,15 @@ class HeadersList { // https://fetch.spec.whatwg.org/#headers-class class Headers { #guard + /** + * @type {HeadersList} + */ #headersList + /** + * @param {HeadersInit|Symbol} [init] + * @returns + */ constructor (init = undefined) { webidl.util.markAsUncloneable(this) @@ -374,7 +451,7 @@ class Headers { // 2. If init is given, then fill this with init. if (init !== undefined) { - init = webidl.converters.HeadersInit(init, 'Headers contructor', 'init') + init = webidl.converters.HeadersInit(init, 'Headers constructor', 'init') fill(this, init) } } @@ -547,58 +624,6 @@ class Headers { return [] } - // https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine - get [kHeadersSortedMap] () { - if (this.#headersList[kHeadersSortedMap]) { - return this.#headersList[kHeadersSortedMap] - } - - // 1. Let headers be an empty list of headers with the key being the name - // and value the value. - const headers = [] - - // 2. Let names be the result of convert header names to a sorted-lowercase - // set with all the names of the headers in list. - const names = this.#headersList.toSortedArray() - - const cookies = this.#headersList.cookies - - // fast-path - if (cookies === null || cookies.length === 1) { - // Note: The non-null assertion of value has already been done by `HeadersList#toSortedArray` - return (this.#headersList[kHeadersSortedMap] = names) - } - - // 3. For each name of names: - for (let i = 0; i < names.length; ++i) { - const { 0: name, 1: value } = names[i] - // 1. If name is `set-cookie`, then: - if (name === 'set-cookie') { - // 1. Let values be a list of all values of headers in list whose name - // is a byte-case-insensitive match for name, in order. - - // 2. For each value of values: - // 1. Append (name, value) to headers. - for (let j = 0; j < cookies.length; ++j) { - headers.push([name, cookies[j]]) - } - } else { - // 2. Otherwise: - - // 1. Let value be the result of getting name from list. - - // 2. Assert: value is non-null. - // Note: This operation was done by `HeadersList#toSortedArray`. - - // 3. Append (name, value) to headers. - headers.push([name, value]) - } - } - - // 4. Return headers. - return (this.#headersList[kHeadersSortedMap] = headers) - } - [util.inspect.custom] (depth, options) { options.depth ??= depth @@ -613,12 +638,19 @@ class Headers { o.#guard = guard } + /** + * @param {Headers} o + */ static getHeadersList (o) { return o.#headersList } - static setHeadersList (o, list) { - o.#headersList = list + /** + * @param {Headers} target + * @param {HeadersList} list + */ + static setHeadersList (target, list) { + target.#headersList = list } } @@ -628,7 +660,7 @@ Reflect.deleteProperty(Headers, 'setHeadersGuard') Reflect.deleteProperty(Headers, 'getHeadersList') Reflect.deleteProperty(Headers, 'setHeadersList') -iteratorMixin('Headers', Headers, kHeadersSortedMap, 0, 1) +iteratorMixin('Headers', Headers, headersListSortAndCombine, 0, 1) Object.defineProperties(Headers.prototype, { append: kEnumerableProperty, @@ -647,7 +679,7 @@ Object.defineProperties(Headers.prototype, { }) webidl.converters.HeadersInit = function (V, prefix, argument) { - if (webidl.util.Type(V) === 'Object') { + if (webidl.util.Type(V) === webidl.util.Types.OBJECT) { const iterator = Reflect.get(V, Symbol.iterator) // A work-around to ensure we send the properly-cased Headers when V is a Headers object. diff --git a/deps/undici/src/lib/web/fetch/index.js b/deps/undici/src/lib/web/fetch/index.js index b74ccf9deb837e..38bcfd3dfc23ef 100644 --- a/deps/undici/src/lib/web/fetch/index.js +++ b/deps/undici/src/lib/web/fetch/index.js @@ -7,10 +7,11 @@ const { makeAppropriateNetworkError, filterResponse, makeResponse, - fromInnerResponse + fromInnerResponse, + getResponseState } = require('./response') const { HeadersList } = require('./headers') -const { Request, cloneRequest } = require('./request') +const { Request, cloneRequest, getRequestDispatcher, getRequestState } = require('./request') const zlib = require('node:zlib') const { bytesMatch, @@ -30,7 +31,6 @@ const { determineRequestsReferrer, coarsenedSharedCurrentTime, createDeferredPromise, - isBlobLike, sameOrigin, isCancelled, isAborted, @@ -47,7 +47,6 @@ const { createInflate, extractMimeType } = require('./util') -const { kState, kDispatcher } = require('./symbols') const assert = require('node:assert') const { safelyExtractBody, extractBody } = require('./body') const { @@ -58,8 +57,8 @@ const { subresourceSet } = require('./constants') const EE = require('node:events') -const { Readable, pipeline, finished } = require('node:stream') -const { addAbortListener, isErrored, isReadable, bufferToLowerCasedHeaderName } = require('../../core/util') +const { Readable, pipeline, finished, isErrored, isReadable } = require('node:stream') +const { addAbortListener, bufferToLowerCasedHeaderName } = require('../../core/util') const { dataURLProcessor, serializeAMimeType, minimizeSupportedMimeType } = require('./data-url') const { getGlobalDispatcher } = require('../../global') const { webidl } = require('./webidl') @@ -144,7 +143,7 @@ function fetch (input, init = undefined) { } // 3. Let request be requestObject’s request. - const request = requestObject[kState] + const request = getRequestState(requestObject) // 4. If requestObject’s signal’s aborted flag is set, then: if (requestObject.signal.aborted) { @@ -244,7 +243,7 @@ function fetch (input, init = undefined) { request, processResponseEndOfBody: handleFetchDone, processResponse, - dispatcher: requestObject[kDispatcher] // undici + dispatcher: getRequestDispatcher(requestObject) // undici }) // 14. Return p. @@ -327,7 +326,7 @@ function abortFetch (p, request, responseObject, error) { // 2. If request’s body is not null and is readable, then cancel request’s // body with error. - if (request.body != null && isReadable(request.body?.stream)) { + if (request.body?.stream != null && isReadable(request.body.stream)) { request.body.stream.cancel(error).catch((err) => { if (err.code === 'ERR_INVALID_STATE') { // Node bug? @@ -343,11 +342,11 @@ function abortFetch (p, request, responseObject, error) { } // 4. Let response be responseObject’s response. - const response = responseObject[kState] + const response = getResponseState(responseObject) // 5. If response’s body is not null and is readable, then error response’s // body with error. - if (response.body != null && isReadable(response.body?.stream)) { + if (response.body?.stream != null && isReadable(response.body.stream)) { response.body.stream.cancel(error).catch((err) => { if (err.code === 'ERR_INVALID_STATE') { // Node bug? @@ -572,53 +571,46 @@ async function mainFetch (fetchParams, recursive = false) { // 11. If response is null, then set response to the result of running // the steps corresponding to the first matching statement: if (response === null) { - response = await (async () => { - const currentURL = requestCurrentURL(request) - - if ( - // - request’s current URL’s origin is same origin with request’s origin, - // and request’s response tainting is "basic" - (sameOrigin(currentURL, request.url) && request.responseTainting === 'basic') || - // request’s current URL’s scheme is "data" - (currentURL.protocol === 'data:') || - // - request’s mode is "navigate" or "websocket" - (request.mode === 'navigate' || request.mode === 'websocket') - ) { - // 1. Set request’s response tainting to "basic". - request.responseTainting = 'basic' - - // 2. Return the result of running scheme fetch given fetchParams. - return await schemeFetch(fetchParams) - } - - // request’s mode is "same-origin" - if (request.mode === 'same-origin') { - // 1. Return a network error. - return makeNetworkError('request mode cannot be "same-origin"') - } - - // request’s mode is "no-cors" - if (request.mode === 'no-cors') { - // 1. If request’s redirect mode is not "follow", then return a network - // error. - if (request.redirect !== 'follow') { - return makeNetworkError( - 'redirect mode cannot be "follow" for "no-cors" request' - ) - } - + const currentURL = requestCurrentURL(request) + if ( + // - request’s current URL’s origin is same origin with request’s origin, + // and request’s response tainting is "basic" + (sameOrigin(currentURL, request.url) && request.responseTainting === 'basic') || + // request’s current URL’s scheme is "data" + (currentURL.protocol === 'data:') || + // - request’s mode is "navigate" or "websocket" + (request.mode === 'navigate' || request.mode === 'websocket') + ) { + // 1. Set request’s response tainting to "basic". + request.responseTainting = 'basic' + + // 2. Return the result of running scheme fetch given fetchParams. + response = await schemeFetch(fetchParams) + + // request’s mode is "same-origin" + } else if (request.mode === 'same-origin') { + // 1. Return a network error. + response = makeNetworkError('request mode cannot be "same-origin"') + + // request’s mode is "no-cors" + } else if (request.mode === 'no-cors') { + // 1. If request’s redirect mode is not "follow", then return a network + // error. + if (request.redirect !== 'follow') { + response = makeNetworkError( + 'redirect mode cannot be "follow" for "no-cors" request' + ) + } else { // 2. Set request’s response tainting to "opaque". request.responseTainting = 'opaque' // 3. Return the result of running scheme fetch given fetchParams. - return await schemeFetch(fetchParams) - } - - // request’s current URL’s scheme is not an HTTP(S) scheme - if (!urlIsHttpHttpsScheme(requestCurrentURL(request))) { - // Return a network error. - return makeNetworkError('URL scheme must be a HTTP(S) scheme') + response = await schemeFetch(fetchParams) } + // request’s current URL’s scheme is not an HTTP(S) scheme + } else if (!urlIsHttpHttpsScheme(requestCurrentURL(request))) { + // Return a network error. + response = makeNetworkError('URL scheme must be a HTTP(S) scheme') // - request’s use-CORS-preflight flag is set // - request’s unsafe-request flag is set and either request’s method is @@ -632,13 +624,14 @@ async function mainFetch (fetchParams, recursive = false) { // 4. Return corsWithPreflightResponse. // TODO - // Otherwise + // Otherwise + } else { // 1. Set request’s response tainting to "cors". request.responseTainting = 'cors' // 2. Return the result of running HTTP fetch given fetchParams. - return await httpFetch(fetchParams) - })() + response = await httpFetch(fetchParams) + } } // 12. If recursive is true, then return response. @@ -810,7 +803,7 @@ function schemeFetch (fetchParams) { // 2. If request’s method is not `GET`, blobURLEntry is null, or blobURLEntry’s // object is not a Blob object, then return a network error. - if (request.method !== 'GET' || !isBlobLike(blob)) { + if (request.method !== 'GET' || !webidl.is.Blob(blob)) { return Promise.resolve(makeNetworkError('invalid method')) } @@ -1446,7 +1439,7 @@ async function httpNetworkOrCacheFetch ( // 11. If httpRequest’s referrer is a URL, then append // `Referer`/httpRequest’s referrer, serialized and isomorphic encoded, // to httpRequest’s header list. - if (httpRequest.referrer instanceof URL) { + if (webidl.is.URL(httpRequest.referrer)) { httpRequest.headersList.append('referer', isomorphicEncode(httpRequest.referrer.href), true) } @@ -1460,7 +1453,7 @@ async function httpNetworkOrCacheFetch ( // user agents should append `User-Agent`/default `User-Agent` value to // httpRequest’s header list. if (!httpRequest.headersList.contains('user-agent', true)) { - httpRequest.headersList.append('user-agent', defaultUserAgent) + httpRequest.headersList.append('user-agent', defaultUserAgent, true) } // 15. If httpRequest’s cache mode is "default" and httpRequest’s header @@ -1888,8 +1881,8 @@ async function httpNetworkFetch ( // 11. Let pullAlgorithm be an action that resumes the ongoing fetch // if it is suspended. - const pullAlgorithm = async () => { - await fetchParams.controller.resume() + const pullAlgorithm = () => { + return fetchParams.controller.resume() } // 12. Let cancelAlgorithm be an algorithm that aborts fetchParams’s @@ -1950,8 +1943,10 @@ async function httpNetworkFetch ( // 19. Run these steps in parallel: // 1. Run these steps, but abort when fetchParams is canceled: - fetchParams.controller.onAborted = onAborted - fetchParams.controller.on('terminated', onAborted) + if (!fetchParams.controller.resume) { + fetchParams.controller.on('terminated', onAborted) + } + fetchParams.controller.resume = async () => { // 1. While true while (true) { @@ -2212,10 +2207,6 @@ async function httpNetworkFetch ( fetchParams.controller.off('terminated', this.abort) } - if (fetchParams.controller.onAborted) { - fetchParams.controller.off('terminated', fetchParams.controller.onAborted) - } - fetchParams.controller.ended = true this.body.push(null) diff --git a/deps/undici/src/lib/web/fetch/request.js b/deps/undici/src/lib/web/fetch/request.js index ee3ce488774c5e..97fea22cdbda8c 100644 --- a/deps/undici/src/lib/web/fetch/request.js +++ b/deps/undici/src/lib/web/fetch/request.js @@ -23,12 +23,11 @@ const { requestDuplex } = require('./constants') const { kEnumerableProperty, normalizedMethodRecordsBase, normalizedMethodRecords } = util -const { kHeaders, kSignal, kState, kDispatcher } = require('./symbols') const { webidl } = require('./webidl') const { URLSerializer } = require('./data-url') const { kConstruct } = require('../../core/symbols') const assert = require('node:assert') -const { getMaxListeners, setMaxListeners, getEventListeners, defaultMaxListeners } = require('node:events') +const { getMaxListeners, setMaxListeners, defaultMaxListeners } = require('node:events') const kAbortController = Symbol('abortController') @@ -80,9 +79,21 @@ let patchMethodWarning = false // https://fetch.spec.whatwg.org/#request-class class Request { + /** @type {AbortSignal} */ + #signal + + /** @type {import('../../dispatcher/dispatcher')} */ + #dispatcher + + /** @type {Headers} */ + #headers + + #state + // https://fetch.spec.whatwg.org/#dom-request - constructor (input, init = {}) { + constructor (input, init = undefined) { webidl.util.markAsUncloneable(this) + if (input === kConstruct) { return } @@ -107,7 +118,7 @@ class Request { // 5. If input is a string, then: if (typeof input === 'string') { - this[kDispatcher] = init.dispatcher + this.#dispatcher = init.dispatcher // 1. Let parsedURL be the result of parsing input with baseURL. // 2. If parsedURL is failure, then throw a TypeError. @@ -132,18 +143,18 @@ class Request { // 5. Set fallbackMode to "cors". fallbackMode = 'cors' } else { - this[kDispatcher] = init.dispatcher || input[kDispatcher] - // 6. Otherwise: // 7. Assert: input is a Request object. - assert(input instanceof Request) + assert(webidl.is.Request(input)) // 8. Set request to input’s request. - request = input[kState] + request = input.#state // 9. Set signal to input’s signal. - signal = input[kSignal] + signal = input.#signal + + this.#dispatcher = init.dispatcher || input.#dispatcher } // 7. Let origin be this’s relevant settings object’s origin. @@ -390,27 +401,17 @@ class Request { } // 27. Set this’s request to request. - this[kState] = request + this.#state = request // 28. Set this’s signal to a new AbortSignal object with this’s relevant // Realm. // TODO: could this be simplified with AbortSignal.any // (https://dom.spec.whatwg.org/#dom-abortsignal-any) const ac = new AbortController() - this[kSignal] = ac.signal + this.#signal = ac.signal // 29. If signal is not null, then make this’s signal follow signal. if (signal != null) { - if ( - !signal || - typeof signal.aborted !== 'boolean' || - typeof signal.addEventListener !== 'function' - ) { - throw new TypeError( - "Failed to construct 'Request': member signal is not of type AbortSignal." - ) - } - if (signal.aborted) { ac.abort(signal.reason) } else { @@ -430,8 +431,6 @@ class Request { // This is only available in node >= v19.9.0 if (typeof getMaxListeners === 'function' && getMaxListeners(signal) === defaultMaxListeners) { setMaxListeners(1500, signal) - } else if (getEventListeners(signal, 'abort').length >= defaultMaxListeners) { - setMaxListeners(1500, signal) } } catch {} @@ -447,9 +446,9 @@ class Request { // 30. Set this’s headers to a new Headers object with this’s relevant // Realm, whose header list is request’s header list and guard is // "request". - this[kHeaders] = new Headers(kConstruct) - setHeadersList(this[kHeaders], request.headersList) - setHeadersGuard(this[kHeaders], 'request') + this.#headers = new Headers(kConstruct) + setHeadersList(this.#headers, request.headersList) + setHeadersGuard(this.#headers, 'request') // 31. If this’s request’s mode is "no-cors", then: if (mode === 'no-cors') { @@ -462,13 +461,13 @@ class Request { } // 2. Set this’s headers’s guard to "request-no-cors". - setHeadersGuard(this[kHeaders], 'request-no-cors') + setHeadersGuard(this.#headers, 'request-no-cors') } // 32. If init is not empty, then: if (initHasKey) { /** @type {HeadersList} */ - const headersList = getHeadersList(this[kHeaders]) + const headersList = getHeadersList(this.#headers) // 1. Let headers be a copy of this’s headers and its associated header // list. // 2. If init["headers"] exists, then set headers to init["headers"]. @@ -487,13 +486,13 @@ class Request { headersList.cookies = headers.cookies } else { // 5. Otherwise, fill this’s headers with headers. - fillHeaders(this[kHeaders], headers) + fillHeaders(this.#headers, headers) } } // 33. Let inputBody be input’s request’s body if input is a Request // object; otherwise null. - const inputBody = input instanceof Request ? input[kState].body : null + const inputBody = webidl.is.Request(input) ? input.#state.body : null // 34. If either init["body"] exists and is non-null or inputBody is // non-null, and request’s method is `GET` or `HEAD`, then throw a @@ -522,8 +521,8 @@ class Request { // 3, If Content-Type is non-null and this’s headers’s header list does // not contain `Content-Type`, then append `Content-Type`/Content-Type to // this’s headers. - if (contentType && !getHeadersList(this[kHeaders]).contains('content-type', true)) { - this[kHeaders].append('content-type', contentType) + if (contentType && !getHeadersList(this.#headers).contains('content-type', true)) { + this.#headers.append('content-type', contentType, true) } } @@ -558,7 +557,7 @@ class Request { // 40. If initBody is null and inputBody is non-null, then: if (initBody == null && inputBody != null) { // 1. If input is unusable, then throw a TypeError. - if (bodyUnusable(input)) { + if (bodyUnusable(input.#state)) { throw new TypeError( 'Cannot construct a Request with a Request object that has already been used.' ) @@ -576,7 +575,7 @@ class Request { } // 41. Set this’s request’s body to finalBody. - this[kState].body = finalBody + this.#state.body = finalBody } // Returns request’s HTTP method, which is "GET" by default. @@ -584,7 +583,7 @@ class Request { webidl.brandCheck(this, Request) // The method getter steps are to return this’s request’s method. - return this[kState].method + return this.#state.method } // Returns the URL of request as a string. @@ -592,7 +591,7 @@ class Request { webidl.brandCheck(this, Request) // The url getter steps are to return this’s request’s URL, serialized. - return URLSerializer(this[kState].url) + return URLSerializer(this.#state.url) } // Returns a Headers object consisting of the headers associated with request. @@ -602,7 +601,7 @@ class Request { webidl.brandCheck(this, Request) // The headers getter steps are to return this’s headers. - return this[kHeaders] + return this.#headers } // Returns the kind of resource requested by request, e.g., "document" @@ -611,7 +610,7 @@ class Request { webidl.brandCheck(this, Request) // The destination getter are to return this’s request’s destination. - return this[kState].destination + return this.#state.destination } // Returns the referrer of request. Its value can be a same-origin URL if @@ -624,18 +623,18 @@ class Request { // 1. If this’s request’s referrer is "no-referrer", then return the // empty string. - if (this[kState].referrer === 'no-referrer') { + if (this.#state.referrer === 'no-referrer') { return '' } // 2. If this’s request’s referrer is "client", then return // "about:client". - if (this[kState].referrer === 'client') { + if (this.#state.referrer === 'client') { return 'about:client' } // Return this’s request’s referrer, serialized. - return this[kState].referrer.toString() + return this.#state.referrer.toString() } // Returns the referrer policy associated with request. @@ -645,7 +644,7 @@ class Request { webidl.brandCheck(this, Request) // The referrerPolicy getter steps are to return this’s request’s referrer policy. - return this[kState].referrerPolicy + return this.#state.referrerPolicy } // Returns the mode associated with request, which is a string indicating @@ -655,15 +654,17 @@ class Request { webidl.brandCheck(this, Request) // The mode getter steps are to return this’s request’s mode. - return this[kState].mode + return this.#state.mode } // Returns the credentials mode associated with request, // which is a string indicating whether credentials will be sent with the // request always, never, or only when sent to a same-origin URL. get credentials () { + webidl.brandCheck(this, Request) + // The credentials getter steps are to return this’s request’s credentials mode. - return this[kState].credentials + return this.#state.credentials } // Returns the cache mode associated with request, @@ -673,7 +674,7 @@ class Request { webidl.brandCheck(this, Request) // The cache getter steps are to return this’s request’s cache mode. - return this[kState].cache + return this.#state.cache } // Returns the redirect mode associated with request, @@ -684,7 +685,7 @@ class Request { webidl.brandCheck(this, Request) // The redirect getter steps are to return this’s request’s redirect mode. - return this[kState].redirect + return this.#state.redirect } // Returns request’s subresource integrity metadata, which is a @@ -695,7 +696,7 @@ class Request { // The integrity getter steps are to return this’s request’s integrity // metadata. - return this[kState].integrity + return this.#state.integrity } // Returns a boolean indicating whether or not request can outlive the @@ -704,7 +705,7 @@ class Request { webidl.brandCheck(this, Request) // The keepalive getter steps are to return this’s request’s keepalive. - return this[kState].keepalive + return this.#state.keepalive } // Returns a boolean indicating whether or not request is for a reload @@ -714,7 +715,7 @@ class Request { // The isReloadNavigation getter steps are to return true if this’s // request’s reload-navigation flag is set; otherwise false. - return this[kState].reloadNavigation + return this.#state.reloadNavigation } // Returns a boolean indicating whether or not request is for a history @@ -724,7 +725,7 @@ class Request { // The isHistoryNavigation getter steps are to return true if this’s request’s // history-navigation flag is set; otherwise false. - return this[kState].historyNavigation + return this.#state.historyNavigation } // Returns the signal associated with request, which is an AbortSignal @@ -734,19 +735,19 @@ class Request { webidl.brandCheck(this, Request) // The signal getter steps are to return this’s signal. - return this[kSignal] + return this.#signal } get body () { webidl.brandCheck(this, Request) - return this[kState].body ? this[kState].body.stream : null + return this.#state.body ? this.#state.body.stream : null } get bodyUsed () { webidl.brandCheck(this, Request) - return !!this[kState].body && util.isDisturbed(this[kState].body.stream) + return !!this.#state.body && util.isDisturbed(this.#state.body.stream) } get duplex () { @@ -760,12 +761,12 @@ class Request { webidl.brandCheck(this, Request) // 1. If this is unusable, then throw a TypeError. - if (bodyUnusable(this)) { + if (bodyUnusable(this.#state)) { throw new TypeError('unusable') } // 2. Let clonedRequest be the result of cloning this’s request. - const clonedRequest = cloneRequest(this[kState]) + const clonedRequest = cloneRequest(this.#state) // 3. Let clonedRequestObject be the result of creating a Request object, // given clonedRequest, this’s headers’s guard, and this’s relevant Realm. @@ -788,7 +789,7 @@ class Request { } // 4. Return clonedRequestObject. - return fromInnerRequest(clonedRequest, ac.signal, getHeadersGuard(this[kHeaders])) + return fromInnerRequest(clonedRequest, this.#dispatcher, ac.signal, getHeadersGuard(this.#headers)) } [nodeUtil.inspect.custom] (depth, options) { @@ -818,9 +819,64 @@ class Request { return `Request ${nodeUtil.formatWithOptions(options, properties)}` } + + /** + * @param {Request} request + * @param {AbortSignal} newSignal + */ + static setRequestSignal (request, newSignal) { + request.#signal = newSignal + return request + } + + /** + * @param {Request} request + */ + static getRequestDispatcher (request) { + return request.#dispatcher + } + + /** + * @param {Request} request + * @param {import('../../dispatcher/dispatcher')} newDispatcher + */ + static setRequestDispatcher (request, newDispatcher) { + request.#dispatcher = newDispatcher + } + + /** + * @param {Request} request + * @param {Headers} newHeaders + */ + static setRequestHeaders (request, newHeaders) { + request.#headers = newHeaders + } + + /** + * @param {Request} request + */ + static getRequestState (request) { + return request.#state + } + + /** + * @param {Request} request + * @param {any} newState + */ + static setRequestState (request, newState) { + request.#state = newState + } } -mixinBody(Request) +const { setRequestSignal, getRequestDispatcher, setRequestDispatcher, setRequestHeaders, getRequestState, setRequestState } = Request +Reflect.deleteProperty(Request, 'setRequestSignal') +Reflect.deleteProperty(Request, 'getRequestDispatcher') +Reflect.deleteProperty(Request, 'setRequestDispatcher') +Reflect.deleteProperty(Request, 'setRequestHeaders') +Reflect.deleteProperty(Request, 'getRequestState') +Reflect.deleteProperty(Request, 'setRequestState') + +mixinBody(Request, getRequestState) // https://fetch.spec.whatwg.org/#requests function makeRequest (init) { @@ -888,17 +944,20 @@ function cloneRequest (request) { /** * @see https://fetch.spec.whatwg.org/#request-create * @param {any} innerRequest + * @param {import('../../dispatcher/agent')} dispatcher * @param {AbortSignal} signal * @param {'request' | 'immutable' | 'request-no-cors' | 'response' | 'none'} guard * @returns {Request} */ -function fromInnerRequest (innerRequest, signal, guard) { +function fromInnerRequest (innerRequest, dispatcher, signal, guard) { const request = new Request(kConstruct) - request[kState] = innerRequest - request[kSignal] = signal - request[kHeaders] = new Headers(kConstruct) - setHeadersList(request[kHeaders], innerRequest.headersList) - setHeadersGuard(request[kHeaders], guard) + setRequestState(request, innerRequest) + setRequestDispatcher(request, dispatcher) + setRequestSignal(request, signal) + const headers = new Headers(kConstruct) + setRequestHeaders(request, headers) + setHeadersList(headers, innerRequest.headersList) + setHeadersGuard(headers, guard) return request } @@ -929,27 +988,21 @@ Object.defineProperties(Request.prototype, { } }) -webidl.converters.Request = webidl.interfaceConverter( - Request -) +webidl.is.Request = webidl.util.MakeTypeAssertion(Request) // https://fetch.spec.whatwg.org/#requestinfo webidl.converters.RequestInfo = function (V, prefix, argument) { if (typeof V === 'string') { - return webidl.converters.USVString(V, prefix, argument) + return webidl.converters.USVString(V) } - if (V instanceof Request) { - return webidl.converters.Request(V, prefix, argument) + if (webidl.is.Request(V)) { + return V } - return webidl.converters.USVString(V, prefix, argument) + return webidl.converters.USVString(V) } -webidl.converters.AbortSignal = webidl.interfaceConverter( - AbortSignal -) - // https://fetch.spec.whatwg.org/#requestinit webidl.converters.RequestInit = webidl.dictionaryConverter([ { @@ -1014,8 +1067,7 @@ webidl.converters.RequestInit = webidl.dictionaryConverter([ (signal) => webidl.converters.AbortSignal( signal, 'RequestInit', - 'signal', - { strict: false } + 'signal' ) ) }, @@ -1034,4 +1086,11 @@ webidl.converters.RequestInit = webidl.dictionaryConverter([ } ]) -module.exports = { Request, makeRequest, fromInnerRequest, cloneRequest } +module.exports = { + Request, + makeRequest, + fromInnerRequest, + cloneRequest, + getRequestDispatcher, + getRequestState +} diff --git a/deps/undici/src/lib/web/fetch/response.js b/deps/undici/src/lib/web/fetch/response.js index 3b6af35fbed0cf..be82c25c4c5a2a 100644 --- a/deps/undici/src/lib/web/fetch/response.js +++ b/deps/undici/src/lib/web/fetch/response.js @@ -9,7 +9,6 @@ const { isValidReasonPhrase, isCancelled, isAborted, - isBlobLike, serializeJavascriptValueToJSONString, isErrorLike, isomorphicEncode, @@ -19,9 +18,7 @@ const { redirectStatusSet, nullBodyStatus } = require('./constants') -const { kState, kHeaders } = require('./symbols') const { webidl } = require('./webidl') -const { FormData } = require('./formdata') const { URLSerializer } = require('./data-url') const { kConstruct } = require('../../core/symbols') const assert = require('node:assert') @@ -31,6 +28,11 @@ const textEncoder = new TextEncoder('utf-8') // https://fetch.spec.whatwg.org/#response-class class Response { + /** @type {Headers} */ + #headers + + #state + // Creates network error Response. static error () { // The static error() method steps are to return the result of creating a @@ -42,7 +44,7 @@ class Response { } // https://fetch.spec.whatwg.org/#dom-response-json - static json (data, init = {}) { + static json (data, init = undefined) { webidl.argumentLengthCheck(arguments, 1, 'Response.json') if (init !== null) { @@ -96,21 +98,22 @@ class Response { const responseObject = fromInnerResponse(makeResponse({}), 'immutable') // 5. Set responseObject’s response’s status to status. - responseObject[kState].status = status + responseObject.#state.status = status // 6. Let value be parsedURL, serialized and isomorphic encoded. const value = isomorphicEncode(URLSerializer(parsedURL)) // 7. Append `Location`/value to responseObject’s response’s header list. - responseObject[kState].headersList.append('location', value, true) + responseObject.#state.headersList.append('location', value, true) // 8. Return responseObject. return responseObject } // https://fetch.spec.whatwg.org/#dom-response - constructor (body = null, init = {}) { + constructor (body = null, init = undefined) { webidl.util.markAsUncloneable(this) + if (body === kConstruct) { return } @@ -122,14 +125,14 @@ class Response { init = webidl.converters.ResponseInit(init) // 1. Set this’s response to a new response. - this[kState] = makeResponse({}) + this.#state = makeResponse({}) // 2. Set this’s headers to a new Headers object with this’s relevant // Realm, whose header list is this’s response’s header list and guard // is "response". - this[kHeaders] = new Headers(kConstruct) - setHeadersGuard(this[kHeaders], 'response') - setHeadersList(this[kHeaders], this[kState].headersList) + this.#headers = new Headers(kConstruct) + setHeadersGuard(this.#headers, 'response') + setHeadersList(this.#headers, this.#state.headersList) // 3. Let bodyWithType be null. let bodyWithType = null @@ -149,14 +152,14 @@ class Response { webidl.brandCheck(this, Response) // The type getter steps are to return this’s response’s type. - return this[kState].type + return this.#state.type } // Returns response’s URL, if it has one; otherwise the empty string. get url () { webidl.brandCheck(this, Response) - const urlList = this[kState].urlList + const urlList = this.#state.urlList // The url getter steps are to return the empty string if this’s // response’s URL is null; otherwise this’s response’s URL, @@ -176,7 +179,7 @@ class Response { // The redirected getter steps are to return true if this’s response’s URL // list has more than one item; otherwise false. - return this[kState].urlList.length > 1 + return this.#state.urlList.length > 1 } // Returns response’s status. @@ -184,7 +187,7 @@ class Response { webidl.brandCheck(this, Response) // The status getter steps are to return this’s response’s status. - return this[kState].status + return this.#state.status } // Returns whether response’s status is an ok status. @@ -193,7 +196,7 @@ class Response { // The ok getter steps are to return true if this’s response’s status is an // ok status; otherwise false. - return this[kState].status >= 200 && this[kState].status <= 299 + return this.#state.status >= 200 && this.#state.status <= 299 } // Returns response’s status message. @@ -202,7 +205,7 @@ class Response { // The statusText getter steps are to return this’s response’s status // message. - return this[kState].statusText + return this.#state.statusText } // Returns response’s headers as Headers. @@ -210,19 +213,19 @@ class Response { webidl.brandCheck(this, Response) // The headers getter steps are to return this’s headers. - return this[kHeaders] + return this.#headers } get body () { webidl.brandCheck(this, Response) - return this[kState].body ? this[kState].body.stream : null + return this.#state.body ? this.#state.body.stream : null } get bodyUsed () { webidl.brandCheck(this, Response) - return !!this[kState].body && util.isDisturbed(this[kState].body.stream) + return !!this.#state.body && util.isDisturbed(this.#state.body.stream) } // Returns a clone of response. @@ -230,7 +233,7 @@ class Response { webidl.brandCheck(this, Response) // 1. If this is unusable, then throw a TypeError. - if (bodyUnusable(this)) { + if (bodyUnusable(this.#state)) { throw webidl.errors.exception({ header: 'Response.clone', message: 'Body has already been consumed.' @@ -238,11 +241,11 @@ class Response { } // 2. Let clonedResponse be the result of cloning this’s response. - const clonedResponse = cloneResponse(this[kState]) + const clonedResponse = cloneResponse(this.#state) // 3. Return the result of creating a Response object, given // clonedResponse, this’s headers’s guard, and this’s relevant Realm. - return fromInnerResponse(clonedResponse, getHeadersGuard(this[kHeaders])) + return fromInnerResponse(clonedResponse, getHeadersGuard(this.#headers)) } [nodeUtil.inspect.custom] (depth, options) { @@ -266,9 +269,45 @@ class Response { return `Response ${nodeUtil.formatWithOptions(options, properties)}` } + + /** + * @param {Response} response + */ + static getResponseHeaders (response) { + return response.#headers + } + + /** + * @param {Response} response + * @param {Headers} newHeaders + */ + static setResponseHeaders (response, newHeaders) { + response.#headers = newHeaders + } + + /** + * @param {Response} response + */ + static getResponseState (response) { + return response.#state + } + + /** + * @param {Response} response + * @param {any} newState + */ + static setResponseState (response, newState) { + response.#state = newState + } } -mixinBody(Response) +const { getResponseHeaders, setResponseHeaders, getResponseState, setResponseState } = Response +Reflect.deleteProperty(Response, 'getResponseHeaders') +Reflect.deleteProperty(Response, 'setResponseHeaders') +Reflect.deleteProperty(Response, 'getResponseState') +Reflect.deleteProperty(Response, 'setResponseState') + +mixinBody(Response, getResponseState) Object.defineProperties(Response.prototype, { type: kEnumerableProperty, @@ -465,17 +504,17 @@ function initializeResponse (response, init, body) { // 3. Set response’s response’s status to init["status"]. if ('status' in init && init.status != null) { - response[kState].status = init.status + getResponseState(response).status = init.status } // 4. Set response’s response’s status message to init["statusText"]. if ('statusText' in init && init.statusText != null) { - response[kState].statusText = init.statusText + getResponseState(response).statusText = init.statusText } // 5. If init["headers"] exists, then fill response’s headers with init["headers"]. if ('headers' in init && init.headers != null) { - fill(response[kHeaders], init.headers) + fill(getResponseHeaders(response), init.headers) } // 6. If body was given, then: @@ -489,12 +528,12 @@ function initializeResponse (response, init, body) { } // 2. Set response's body to body's body. - response[kState].body = body.body + getResponseState(response).body = body.body // 3. If body's type is non-null and response's header list does not contain // `Content-Type`, then append (`Content-Type`, body's type) to response's header list. - if (body.type != null && !response[kState].headersList.contains('content-type', true)) { - response[kState].headersList.append('content-type', body.type, true) + if (body.type != null && !getResponseState(response).headersList.contains('content-type', true)) { + getResponseState(response).headersList.append('content-type', body.type, true) } } } @@ -507,10 +546,11 @@ function initializeResponse (response, init, body) { */ function fromInnerResponse (innerResponse, guard) { const response = new Response(kConstruct) - response[kState] = innerResponse - response[kHeaders] = new Headers(kConstruct) - setHeadersList(response[kHeaders], innerResponse.headersList) - setHeadersGuard(response[kHeaders], guard) + setResponseState(response, innerResponse) + const headers = new Headers(kConstruct) + setResponseHeaders(response, headers) + setHeadersList(headers, innerResponse.headersList) + setHeadersGuard(headers, guard) if (hasFinalizationRegistry && innerResponse.body?.stream) { // If the target (response) is reclaimed, the cleanup callback may be called at some point with @@ -524,38 +564,26 @@ function fromInnerResponse (innerResponse, guard) { return response } -webidl.converters.ReadableStream = webidl.interfaceConverter( - ReadableStream -) - -webidl.converters.FormData = webidl.interfaceConverter( - FormData -) - -webidl.converters.URLSearchParams = webidl.interfaceConverter( - URLSearchParams -) - // https://fetch.spec.whatwg.org/#typedefdef-xmlhttprequestbodyinit webidl.converters.XMLHttpRequestBodyInit = function (V, prefix, name) { if (typeof V === 'string') { return webidl.converters.USVString(V, prefix, name) } - if (isBlobLike(V)) { - return webidl.converters.Blob(V, prefix, name, { strict: false }) + if (webidl.is.Blob(V)) { + return V } if (ArrayBuffer.isView(V) || types.isArrayBuffer(V)) { - return webidl.converters.BufferSource(V, prefix, name) + return V } - if (util.isFormDataLike(V)) { - return webidl.converters.FormData(V, prefix, name, { strict: false }) + if (webidl.is.FormData(V)) { + return V } - if (V instanceof URLSearchParams) { - return webidl.converters.URLSearchParams(V, prefix, name) + if (webidl.is.URLSearchParams(V)) { + return V } return webidl.converters.DOMString(V, prefix, name) @@ -563,8 +591,8 @@ webidl.converters.XMLHttpRequestBodyInit = function (V, prefix, name) { // https://fetch.spec.whatwg.org/#bodyinit webidl.converters.BodyInit = function (V, prefix, argument) { - if (V instanceof ReadableStream) { - return webidl.converters.ReadableStream(V, prefix, argument) + if (webidl.is.ReadableStream(V)) { + return V } // Note: the spec doesn't include async iterables, @@ -593,6 +621,8 @@ webidl.converters.ResponseInit = webidl.dictionaryConverter([ } ]) +webidl.is.Response = webidl.util.MakeTypeAssertion(Response) + module.exports = { isNetworkError, makeNetworkError, @@ -601,5 +631,6 @@ module.exports = { filterResponse, Response, cloneResponse, - fromInnerResponse + fromInnerResponse, + getResponseState } diff --git a/deps/undici/src/lib/web/fetch/symbols.js b/deps/undici/src/lib/web/fetch/symbols.js deleted file mode 100644 index 32e360e490fbaf..00000000000000 --- a/deps/undici/src/lib/web/fetch/symbols.js +++ /dev/null @@ -1,9 +0,0 @@ -'use strict' - -module.exports = { - kUrl: Symbol('url'), - kHeaders: Symbol('headers'), - kSignal: Symbol('signal'), - kState: Symbol('state'), - kDispatcher: Symbol('dispatcher') -} diff --git a/deps/undici/src/lib/web/fetch/util.js b/deps/undici/src/lib/web/fetch/util.js index 5101324a80cf78..be6060058a3f37 100644 --- a/deps/undici/src/lib/web/fetch/util.js +++ b/deps/undici/src/lib/web/fetch/util.js @@ -2,11 +2,11 @@ const { Transform } = require('node:stream') const zlib = require('node:zlib') -const { redirectStatusSet, referrerPolicySet: referrerPolicyTokens, badPortsSet } = require('./constants') +const { redirectStatusSet, referrerPolicyTokens, badPortsSet } = require('./constants') const { getGlobalOrigin } = require('./global') const { collectASequenceOfCodePoints, collectAnHTTPQuotedString, removeChars, parseMIMEType } = require('./data-url') const { performance } = require('node:perf_hooks') -const { isBlobLike, ReadableStreamFrom, isValidHTTPToken, normalizedMethodRecordsBase } = require('../../core/util') +const { ReadableStreamFrom, isValidHTTPToken, normalizedMethodRecordsBase } = require('../../core/util') const assert = require('node:assert') const { isUint8Array } = require('node:util/types') const { webidl } = require('./webidl') @@ -170,29 +170,24 @@ function isValidHeaderValue (potentialValue) { ) === false } -// https://w3c.github.io/webappsec-referrer-policy/#set-requests-referrer-policy-on-redirect -function setRequestReferrerPolicyOnRedirect (request, actualResponse) { - // Given a request request and a response actualResponse, this algorithm - // updates request’s referrer policy according to the Referrer-Policy - // header (if any) in actualResponse. - - // 1. Let policy be the result of executing § 8.1 Parse a referrer policy - // from a Referrer-Policy header on actualResponse. - - // 8.1 Parse a referrer policy from a Referrer-Policy header +/** + * Parse a referrer policy from a Referrer-Policy header + * @see https://w3c.github.io/webappsec-referrer-policy/#parse-referrer-policy-from-header + */ +function parseReferrerPolicy (actualResponse) { // 1. Let policy-tokens be the result of extracting header list values given `Referrer-Policy` and response’s header list. - const { headersList } = actualResponse + const policyHeader = (actualResponse.headersList.get('referrer-policy', true) ?? '').split(',') + // 2. Let policy be the empty string. + let policy = '' + // 3. For each token in policy-tokens, if token is a referrer policy and token is not the empty string, then set policy to token. - // 4. Return policy. - const policyHeader = (headersList.get('referrer-policy', true) ?? '').split(',') // Note: As the referrer-policy can contain multiple policies // separated by comma, we need to loop through all of them // and pick the first valid one. // Ref: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy#specify_a_fallback_policy - let policy = '' - if (policyHeader.length > 0) { + if (policyHeader.length) { // The right-most policy takes precedence. // The left-most policy is the fallback. for (let i = policyHeader.length; i !== 0; i--) { @@ -204,6 +199,23 @@ function setRequestReferrerPolicyOnRedirect (request, actualResponse) { } } + // 4. Return policy. + return policy +} + +/** + * Given a request request and a response actualResponse, this algorithm + * updates request’s referrer policy according to the Referrer-Policy + * header (if any) in actualResponse. + * @see https://w3c.github.io/webappsec-referrer-policy/#set-requests-referrer-policy-on-redirect + * @param {import('./request').Request} request + * @param {import('./response').Response} actualResponse + */ +function setRequestReferrerPolicyOnRedirect (request, actualResponse) { + // 1. Let policy be the result of executing § 8.1 Parse a referrer policy + // from a Referrer-Policy header on actualResponse. + const policy = parseReferrerPolicy(actualResponse) + // 2. If policy is not the empty string, then set request’s referrer policy to policy. if (policy !== '') { request.referrerPolicy = policy @@ -374,8 +386,16 @@ function clonePolicyContainer (policyContainer) { } } -// https://w3c.github.io/webappsec-referrer-policy/#determine-requests-referrer +/** + * Determine request’s Referrer + * + * @see https://w3c.github.io/webappsec-referrer-policy/#determine-requests-referrer + */ function determineRequestsReferrer (request) { + // Given a request request, we can determine the correct referrer information + // to send by examining its referrer policy as detailed in the following + // steps, which return either no referrer or a URL: + // 1. Let policy be request's referrer policy. const policy = request.referrerPolicy @@ -387,6 +407,8 @@ function determineRequestsReferrer (request) { let referrerSource = null // 3. Switch on request’s referrer: + + // "client" if (request.referrer === 'client') { // Note: node isn't a browser and doesn't implement document/iframes, // so we bypass this step and replace it with our own. @@ -397,9 +419,10 @@ function determineRequestsReferrer (request) { return 'no-referrer' } - // note: we need to clone it as it's mutated + // Note: we need to clone it as it's mutated referrerSource = new URL(globalOrigin) - } else if (request.referrer instanceof URL) { + // a URL + } else if (webidl.is.URL(request.referrer)) { // Let referrerSource be request’s referrer. referrerSource = request.referrer } @@ -418,18 +441,37 @@ function determineRequestsReferrer (request) { referrerURL = referrerOrigin } - const areSameOrigin = sameOrigin(request, referrerURL) - const isNonPotentiallyTrustWorthy = isURLPotentiallyTrustworthy(referrerURL) && - !isURLPotentiallyTrustworthy(request.url) + // 7. The user agent MAY alter referrerURL or referrerOrigin at this point + // to enforce arbitrary policy considerations in the interests of minimizing + // data leakage. For example, the user agent could strip the URL down to an + // origin, modify its host, replace it with an empty string, etc. // 8. Execute the switch statements corresponding to the value of policy: switch (policy) { - case 'origin': return referrerOrigin != null ? referrerOrigin : stripURLForReferrer(referrerSource, true) - case 'unsafe-url': return referrerURL - case 'same-origin': - return areSameOrigin ? referrerOrigin : 'no-referrer' - case 'origin-when-cross-origin': - return areSameOrigin ? referrerURL : referrerOrigin + case 'no-referrer': + // Return no referrer + return 'no-referrer' + case 'origin': + // Return referrerOrigin + if (referrerOrigin != null) { + return referrerOrigin + } + return stripURLForReferrer(referrerSource, true) + case 'unsafe-url': + // Return referrerURL. + return referrerURL + case 'strict-origin': { + const currentURL = requestCurrentURL(request) + + // 1. If referrerURL is a potentially trustworthy URL and request’s + // current URL is not a potentially trustworthy URL, then return no + // referrer. + if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) { + return 'no-referrer' + } + // 2. Return referrerOrigin + return referrerOrigin + } case 'strict-origin-when-cross-origin': { const currentURL = requestCurrentURL(request) @@ -449,39 +491,58 @@ function determineRequestsReferrer (request) { // 3. Return referrerOrigin. return referrerOrigin } - case 'strict-origin': // eslint-disable-line - /** - * 1. If referrerURL is a potentially trustworthy URL and - * request’s current URL is not a potentially trustworthy URL, - * then return no referrer. - * 2. Return referrerOrigin - */ - case 'no-referrer-when-downgrade': // eslint-disable-line - /** - * 1. If referrerURL is a potentially trustworthy URL and - * request’s current URL is not a potentially trustworthy URL, - * then return no referrer. - * 2. Return referrerOrigin - */ - - default: // eslint-disable-line - return isNonPotentiallyTrustWorthy ? 'no-referrer' : referrerOrigin + case 'same-origin': + // 1. If the origin of referrerURL and the origin of request’s current + // URL are the same, then return referrerURL. + if (sameOrigin(request, referrerURL)) { + return referrerURL + } + // 2. Return no referrer. + return 'no-referrer' + case 'origin-when-cross-origin': + // 1. If the origin of referrerURL and the origin of request’s current + // URL are the same, then return referrerURL. + if (sameOrigin(request, referrerURL)) { + return referrerURL + } + // 2. Return referrerOrigin. + return referrerOrigin + case 'no-referrer-when-downgrade': { + const currentURL = requestCurrentURL(request) + + // 1. If referrerURL is a potentially trustworthy URL and request’s + // current URL is not a potentially trustworthy URL, then return no + // referrer. + if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) { + return 'no-referrer' + } + // 2. Return referrerOrigin + return referrerOrigin + } } } /** + * Certain portions of URLs must not be included when sending a URL as the + * value of a `Referer` header: a URLs fragment, username, and password + * components must be stripped from the URL before it’s sent out. This + * algorithm accepts a origin-only flag, which defaults to false. If set to + * true, the algorithm will additionally remove the URL’s path and query + * components, leaving only the scheme, host, and port. + * * @see https://w3c.github.io/webappsec-referrer-policy/#strip-url * @param {URL} url - * @param {boolean|undefined} originOnly + * @param {boolean} [originOnly=false] */ -function stripURLForReferrer (url, originOnly) { +function stripURLForReferrer (url, originOnly = false) { // 1. Assert: url is a URL. - assert(url instanceof URL) + assert(webidl.is.URL(url)) + // Note: Create a new URL instance to avoid mutating the original URL. url = new URL(url) // 2. If url’s scheme is a local scheme, then return no referrer. - if (url.protocol === 'file:' || url.protocol === 'about:' || url.protocol === 'blank:') { + if (urlIsLocal(url)) { return 'no-referrer' } @@ -495,7 +556,7 @@ function stripURLForReferrer (url, originOnly) { url.hash = '' // 6. If the origin-only flag is true, then: - if (originOnly) { + if (originOnly === true) { // 1. Set url’s path to « the empty string ». url.pathname = '' @@ -507,45 +568,134 @@ function stripURLForReferrer (url, originOnly) { return url } -function isURLPotentiallyTrustworthy (url) { - if (!(url instanceof URL)) { +const potentialleTrustworthyIPv4RegExp = new RegExp('^(?:' + + '(?:127\\.)' + + '(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){2}' + + '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[1-9])' + +')$') + +const potentialleTrustworthyIPv6RegExp = new RegExp('^(?:' + + '(?:(?:0{1,4}):){7}(?:(?:0{0,3}1))|' + + '(?:(?:0{1,4}):){1,6}(?::(?:0{0,3}1))|' + + '(?:::(?:0{0,3}1))|' + +')$') + +/** + * Check if host matches one of the CIDR notations 127.0.0.0/8 or ::1/128. + * + * @param {string} origin + * @returns {boolean} + */ +function isOriginIPPotentiallyTrustworthy (origin) { + // IPv6 + if (origin.includes(':')) { + // Remove brackets from IPv6 addresses + if (origin[0] === '[' && origin[origin.length - 1] === ']') { + origin = origin.slice(1, -1) + } + return potentialleTrustworthyIPv6RegExp.test(origin) + } + + // IPv4 + return potentialleTrustworthyIPv4RegExp.test(origin) +} + +/** + * A potentially trustworthy origin is one which a user agent can generally + * trust as delivering data securely. + * + * Return value `true` means `Potentially Trustworthy`. + * Return value `false` means `Not Trustworthy`. + * + * @see https://w3c.github.io/webappsec-secure-contexts/#is-origin-trustworthy + * @param {string} origin + * @returns {boolean} + */ +function isOriginPotentiallyTrustworthy (origin) { + // 1. If origin is an opaque origin, return "Not Trustworthy". + if (origin == null || origin === 'null') { return false } - // If child of about, return true - if (url.href === 'about:blank' || url.href === 'about:srcdoc') { + // 2. Assert: origin is a tuple origin. + origin = new URL(origin) + + // 3. If origin’s scheme is either "https" or "wss", + // return "Potentially Trustworthy". + if (origin.protocol === 'https:' || origin.protocol === 'wss:') { return true } - // If scheme is data, return true - if (url.protocol === 'data:') return true + // 4. If origin’s host matches one of the CIDR notations 127.0.0.0/8 or + // ::1/128 [RFC4632], return "Potentially Trustworthy". + if (isOriginIPPotentiallyTrustworthy(origin.hostname)) { + return true + } - // If file, return true - if (url.protocol === 'file:') return true + // 5. If the user agent conforms to the name resolution rules in + // [let-localhost-be-localhost] and one of the following is true: - return isOriginPotentiallyTrustworthy(url.origin) + // origin’s host is "localhost" or "localhost." + if (origin.hostname === 'localhost' || origin.hostname === 'localhost.') { + return true + } - function isOriginPotentiallyTrustworthy (origin) { - // If origin is explicitly null, return false - if (origin == null || origin === 'null') return false + // origin’s host ends with ".localhost" or ".localhost." + if (origin.hostname.endsWith('.localhost') || origin.hostname.endsWith('.localhost.')) { + return true + } + + // 6. If origin’s scheme is "file", return "Potentially Trustworthy". + if (origin.protocol === 'file:') { + return true + } - const originAsURL = new URL(origin) + // 7. If origin’s scheme component is one which the user agent considers to + // be authenticated, return "Potentially Trustworthy". - // If secure, return true - if (originAsURL.protocol === 'https:' || originAsURL.protocol === 'wss:') { - return true - } + // 8. If origin has been configured as a trustworthy origin, return + // "Potentially Trustworthy". - // If localhost or variants, return true - if (/^127(?:\.[0-9]+){0,2}\.[0-9]+$|^\[(?:0*:)*?:?0*1\]$/.test(originAsURL.hostname) || - (originAsURL.hostname === 'localhost' || originAsURL.hostname.includes('localhost.')) || - (originAsURL.hostname.endsWith('.localhost'))) { - return true - } + // 9. Return "Not Trustworthy". + return false +} - // If any other, return false +/** + * A potentially trustworthy URL is one which either inherits context from its + * creator (about:blank, about:srcdoc, data) or one whose origin is a + * potentially trustworthy origin. + * + * Return value `true` means `Potentially Trustworthy`. + * Return value `false` means `Not Trustworthy`. + * + * @see https://www.w3.org/TR/secure-contexts/#is-url-trustworthy + * @param {URL} url + * @returns {boolean} + */ +function isURLPotentiallyTrustworthy (url) { + // Given a URL record (url), the following algorithm returns "Potentially + // Trustworthy" or "Not Trustworthy" as appropriate: + if (!webidl.is.URL(url)) { return false } + + // 1. If url is "about:blank" or "about:srcdoc", + // return "Potentially Trustworthy". + if (url.href === 'about:blank' || url.href === 'about:srcdoc') { + return true + } + + // 2. If url’s scheme is "data", return "Potentially Trustworthy". + if (url.protocol === 'data:') return true + + // Note: The origin of blob: URLs is the origin of the context in which they + // were created. Therefore, blobs created in a trustworthy origin will + // themselves be potentially trustworthy. + if (url.protocol === 'blob:') return true + + // 3. Return the result of executing § 3.1 Is origin potentially trustworthy? + // on url’s origin. + return isOriginPotentiallyTrustworthy(url.origin) } /** @@ -825,7 +975,7 @@ const esIteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbo /** * @see https://webidl.spec.whatwg.org/#dfn-iterator-prototype-object * @param {string} name name of the instance - * @param {symbol} kInternalIterator + * @param {((target: any) => any)} kInternalIterator * @param {string | number} [keyIndex] * @param {string | number} [valueIndex] */ @@ -867,7 +1017,7 @@ function createIterator (name, kInternalIterator, keyIndex = 0, valueIndex = 1) // 7. Let kind be object’s kind. // 8. Let values be object’s target's value pairs to iterate over. const index = this.#index - const values = this.#target[kInternalIterator] + const values = kInternalIterator(this.#target) // 9. Let len be the length of values. const len = values.length @@ -961,7 +1111,7 @@ function createIterator (name, kInternalIterator, keyIndex = 0, valueIndex = 1) * @see https://webidl.spec.whatwg.org/#dfn-iterator-prototype-object * @param {string} name name of the instance * @param {any} object class - * @param {symbol} kInternalIterator + * @param {(target: any) => any} kInternalIterator * @param {string | number} [keyIndex] * @param {string | number} [valueIndex] */ @@ -1029,7 +1179,7 @@ function iteratorMixin (name, object, kInternalIterator, keyIndex = 0, valueInde /** * @see https://fetch.spec.whatwg.org/#body-fully-read */ -async function fullyReadBody (body, processBody, processBodyError) { +function fullyReadBody (body, processBody, processBodyError) { // 1. If taskDestination is null, then set taskDestination to // the result of starting a new parallel queue. @@ -1054,18 +1204,7 @@ async function fullyReadBody (body, processBody, processBodyError) { } // 5. Read all bytes from reader, given successSteps and errorSteps. - try { - successSteps(await readAllBytes(reader)) - } catch (e) { - errorSteps(e) - } -} - -function isReadableStreamLike (stream) { - return stream instanceof ReadableStream || ( - stream[Symbol.toStringTag] === 'ReadableStream' && - typeof stream.tee === 'function' - ) + readAllBytes(reader, successSteps, errorSteps) } /** @@ -1103,42 +1242,54 @@ function isomorphicEncode (input) { * @see https://streams.spec.whatwg.org/#readablestreamdefaultreader-read-all-bytes * @see https://streams.spec.whatwg.org/#read-loop * @param {ReadableStreamDefaultReader} reader + * @param {(bytes: Uint8Array) => void} successSteps + * @param {(error: Error) => void} failureSteps */ -async function readAllBytes (reader) { +async function readAllBytes (reader, successSteps, failureSteps) { const bytes = [] let byteLength = 0 - while (true) { - const { done, value: chunk } = await reader.read() + try { + do { + const { done, value: chunk } = await reader.read() - if (done) { - // 1. Call successSteps with bytes. - return Buffer.concat(bytes, byteLength) - } + if (done) { + // 1. Call successSteps with bytes. + successSteps(Buffer.concat(bytes, byteLength)) + return + } - // 1. If chunk is not a Uint8Array object, call failureSteps - // with a TypeError and abort these steps. - if (!isUint8Array(chunk)) { - throw new TypeError('Received non-Uint8Array chunk') - } + // 1. If chunk is not a Uint8Array object, call failureSteps + // with a TypeError and abort these steps. + if (!isUint8Array(chunk)) { + failureSteps(TypeError('Received non-Uint8Array chunk')) + return + } - // 2. Append the bytes represented by chunk to bytes. - bytes.push(chunk) - byteLength += chunk.length + // 2. Append the bytes represented by chunk to bytes. + bytes.push(chunk) + byteLength += chunk.length // 3. Read-loop given reader, bytes, successSteps, and failureSteps. + } while (true) + } catch (e) { + // 1. Call failureSteps with e. + failureSteps(e) } } /** * @see https://fetch.spec.whatwg.org/#is-local * @param {URL} url + * @returns {boolean} */ function urlIsLocal (url) { assert('protocol' in url) // ensure it's a url object const protocol = url.protocol + // A URL is local if its scheme is a local scheme. + // A local scheme is "about", "blob", or "data". return protocol === 'about:' || protocol === 'blob:' || protocol === 'data:' } @@ -1601,7 +1752,6 @@ module.exports = { requestCurrentURL, responseURL, responseLocationURL, - isBlobLike, isURLPotentiallyTrustworthy, isValidReasonPhrase, sameOrigin, @@ -1614,7 +1764,6 @@ module.exports = { isErrorLike, fullyReadBody, bytesMatch, - isReadableStreamLike, readableStreamClose, isomorphicEncode, urlIsLocal, @@ -1628,5 +1777,6 @@ module.exports = { extractMimeType, getDecodeSplit, utf8DecodeBytes, - environmentSettingsObject + environmentSettingsObject, + isOriginIPPotentiallyTrustworthy } diff --git a/deps/undici/src/lib/web/fetch/webidl.js b/deps/undici/src/lib/web/fetch/webidl.js index cd5cb14454c34f..46850e16f05559 100644 --- a/deps/undici/src/lib/web/fetch/webidl.js +++ b/deps/undici/src/lib/web/fetch/webidl.js @@ -4,11 +4,24 @@ const { types, inspect } = require('node:util') const { markAsUncloneable } = require('node:worker_threads') const { toUSVString } = require('../../core/util') +const UNDEFINED = 1 +const BOOLEAN = 2 +const STRING = 3 +const SYMBOL = 4 +const NUMBER = 5 +const BIGINT = 6 +const NULL = 7 +const OBJECT = 8 // function and object + +const FunctionPrototypeSymbolHasInstance = Function.call.bind(Function.prototype[Symbol.hasInstance]) + /** @type {import('../../../types/webidl').Webidl} */ -const webidl = {} -webidl.converters = {} -webidl.util = {} -webidl.errors = {} +const webidl = { + converters: {}, + util: {}, + errors: {}, + is: {} +} webidl.errors.exception = function (message) { return new TypeError(`${message.header}: ${message.message}`) @@ -34,15 +47,19 @@ webidl.errors.invalidArgument = function (context) { } // https://webidl.spec.whatwg.org/#implements -webidl.brandCheck = function (V, I, opts) { - if (opts?.strict !== false) { - if (!(V instanceof I)) { - const err = new TypeError('Illegal invocation') - err.code = 'ERR_INVALID_THIS' // node compat. - throw err - } - } else { - if (V?.[Symbol.toStringTag] !== I.prototype[Symbol.toStringTag]) { +webidl.brandCheck = function (V, I) { + if (!FunctionPrototypeSymbolHasInstance(I, V)) { + const err = new TypeError('Illegal invocation') + err.code = 'ERR_INVALID_THIS' // node compat. + throw err + } +} + +webidl.brandCheckMultiple = function (List) { + const prototypes = List.map((c) => webidl.util.MakeTypeAssertion(c)) + + return (V) => { + if (prototypes.every(typeCheck => !typeCheck(V))) { const err = new TypeError('Illegal invocation') err.code = 'ERR_INVALID_THIS' // node compat. throw err @@ -67,27 +84,56 @@ webidl.illegalConstructor = function () { }) } +webidl.util.MakeTypeAssertion = function (I) { + return (O) => FunctionPrototypeSymbolHasInstance(I, O) +} + // https://tc39.es/ecma262/#sec-ecmascript-data-types-and-values webidl.util.Type = function (V) { switch (typeof V) { - case 'undefined': return 'Undefined' - case 'boolean': return 'Boolean' - case 'string': return 'String' - case 'symbol': return 'Symbol' - case 'number': return 'Number' - case 'bigint': return 'BigInt' + case 'undefined': return UNDEFINED + case 'boolean': return BOOLEAN + case 'string': return STRING + case 'symbol': return SYMBOL + case 'number': return NUMBER + case 'bigint': return BIGINT case 'function': case 'object': { if (V === null) { - return 'Null' + return NULL } - return 'Object' + return OBJECT } } } +webidl.util.Types = { + UNDEFINED, + BOOLEAN, + STRING, + SYMBOL, + NUMBER, + BIGINT, + NULL, + OBJECT +} + +webidl.util.TypeValueToString = function (o) { + switch (webidl.util.Type(o)) { + case UNDEFINED: return 'Undefined' + case BOOLEAN: return 'Boolean' + case STRING: return 'String' + case SYMBOL: return 'Symbol' + case NUMBER: return 'Number' + case BIGINT: return 'BigInt' + case NULL: return 'Null' + case OBJECT: return 'Object' + } +} + webidl.util.markAsUncloneable = markAsUncloneable || (() => {}) + // https://webidl.spec.whatwg.org/#abstract-opdef-converttoint webidl.util.ConvertToInt = function (V, bitLength, signedness, opts) { let upperBound @@ -226,11 +272,11 @@ webidl.util.Stringify = function (V) { const type = webidl.util.Type(V) switch (type) { - case 'Symbol': + case SYMBOL: return `Symbol(${V.description})` - case 'Object': + case OBJECT: return inspect(V) - case 'String': + case STRING: return `"${V}"` default: return `${V}` @@ -241,7 +287,7 @@ webidl.util.Stringify = function (V) { webidl.sequenceConverter = function (converter) { return (V, prefix, argument, Iterable) => { // 1. If Type(V) is not Object, throw a TypeError. - if (webidl.util.Type(V) !== 'Object') { + if (webidl.util.Type(V) !== OBJECT) { throw webidl.errors.exception({ header: prefix, message: `${argument} (${webidl.util.Stringify(V)}) is not iterable.` @@ -284,10 +330,10 @@ webidl.sequenceConverter = function (converter) { webidl.recordConverter = function (keyConverter, valueConverter) { return (O, prefix, argument) => { // 1. If Type(O) is not Object, throw a TypeError. - if (webidl.util.Type(O) !== 'Object') { + if (webidl.util.Type(O) !== OBJECT) { throw webidl.errors.exception({ header: prefix, - message: `${argument} ("${webidl.util.Type(O)}") is not an Object.` + message: `${argument} ("${webidl.util.TypeValueToString(O)}") is not an Object.` }) } @@ -299,12 +345,14 @@ webidl.recordConverter = function (keyConverter, valueConverter) { const keys = [...Object.getOwnPropertyNames(O), ...Object.getOwnPropertySymbols(O)] for (const key of keys) { + const keyName = webidl.util.Stringify(key) + // 1. Let typedKey be key converted to an IDL value of type K. - const typedKey = keyConverter(key, prefix, argument) + const typedKey = keyConverter(key, prefix, `Key ${keyName} in ${argument}`) // 2. Let value be ? Get(O, key). // 3. Let typedValue be value converted to an IDL value of type V. - const typedValue = valueConverter(O[key], prefix, argument) + const typedValue = valueConverter(O[key], prefix, `${argument}[${keyName}]`) // 4. Set result[typedKey] to typedValue. result[typedKey] = typedValue @@ -341,12 +389,12 @@ webidl.recordConverter = function (keyConverter, valueConverter) { } } -webidl.interfaceConverter = function (i) { - return (V, prefix, argument, opts) => { - if (opts?.strict !== false && !(V instanceof i)) { +webidl.interfaceConverter = function (TypeCheck, name) { + return (V, prefix, argument) => { + if (!TypeCheck(V)) { throw webidl.errors.exception({ header: prefix, - message: `Expected ${argument} ("${webidl.util.Stringify(V)}") to be an instance of ${i.name}.` + message: `Expected ${argument} ("${webidl.util.Stringify(V)}") to be an instance of ${name}.` }) } @@ -356,12 +404,9 @@ webidl.interfaceConverter = function (i) { webidl.dictionaryConverter = function (converters) { return (dictionary, prefix, argument) => { - const type = webidl.util.Type(dictionary) const dict = {} - if (type === 'Null' || type === 'Undefined') { - return dict - } else if (type !== 'Object') { + if (dictionary != null && webidl.util.Type(dictionary) !== OBJECT) { throw webidl.errors.exception({ header: prefix, message: `Expected ${dictionary} to be one of: Null, Undefined, Object.` @@ -372,7 +417,7 @@ webidl.dictionaryConverter = function (converters) { const { key, defaultValue, required, converter } = options if (required === true) { - if (!Object.hasOwn(dictionary, key)) { + if (dictionary == null || !Object.hasOwn(dictionary, key)) { throw webidl.errors.exception({ header: prefix, message: `Missing required key "${key}".` @@ -380,13 +425,13 @@ webidl.dictionaryConverter = function (converters) { } } - let value = dictionary[key] - const hasDefault = Object.hasOwn(options, 'defaultValue') + let value = dictionary?.[key] + const hasDefault = defaultValue !== undefined // Only use defaultValue if value is undefined and // a defaultValue options was provided. - if (hasDefault && value !== null) { - value ??= defaultValue() + if (hasDefault && value === undefined) { + value = defaultValue() } // A key can be optional and have no default value. @@ -423,6 +468,14 @@ webidl.nullableConverter = function (converter) { } } +webidl.is.ReadableStream = webidl.util.MakeTypeAssertion(ReadableStream) +webidl.is.Blob = webidl.util.MakeTypeAssertion(Blob) +webidl.is.URLSearchParams = webidl.util.MakeTypeAssertion(URLSearchParams) +webidl.is.File = webidl.util.MakeTypeAssertion(globalThis.File ?? require('node:buffer').File) +webidl.is.URL = webidl.util.MakeTypeAssertion(URL) +webidl.is.AbortSignal = webidl.util.MakeTypeAssertion(AbortSignal) +webidl.is.MessagePort = webidl.util.MakeTypeAssertion(MessagePort) + // https://webidl.spec.whatwg.org/#es-DOMString webidl.converters.DOMString = function (V, prefix, argument, opts) { // 1. If V is null and the conversion is to an IDL type @@ -450,8 +503,14 @@ webidl.converters.DOMString = function (V, prefix, argument, opts) { // https://webidl.spec.whatwg.org/#es-ByteString webidl.converters.ByteString = function (V, prefix, argument) { // 1. Let x be ? ToString(V). - // Note: DOMString converter perform ? ToString(V) - const x = webidl.converters.DOMString(V, prefix, argument) + if (typeof V === 'symbol') { + throw webidl.errors.exception({ + header: prefix, + message: `${argument} is a symbol, which cannot be converted to a ByteString.` + }) + } + + const x = String(V) // 2. If the value of any element of x is greater than // 255, then throw a TypeError. @@ -537,7 +596,7 @@ webidl.converters.ArrayBuffer = function (V, prefix, argument, opts) { // see: https://tc39.es/ecma262/#sec-properties-of-the-arraybuffer-instances // see: https://tc39.es/ecma262/#sec-properties-of-the-sharedarraybuffer-instances if ( - webidl.util.Type(V) !== 'Object' || + webidl.util.Type(V) !== OBJECT || !types.isAnyArrayBuffer(V) ) { throw webidl.errors.conversionFailed({ @@ -581,7 +640,7 @@ webidl.converters.TypedArray = function (V, T, prefix, name, opts) { // [[TypedArrayName]] internal slot with a value // equal to T’s name, then throw a TypeError. if ( - webidl.util.Type(V) !== 'Object' || + webidl.util.Type(V) !== OBJECT || !types.isTypedArray(V) || V.constructor.name !== T.name ) { @@ -622,7 +681,7 @@ webidl.converters.TypedArray = function (V, T, prefix, name, opts) { webidl.converters.DataView = function (V, prefix, name, opts) { // 1. If Type(V) is not Object, or V does not have a // [[DataView]] internal slot, then throw a TypeError. - if (webidl.util.Type(V) !== 'Object' || !types.isDataView(V)) { + if (webidl.util.Type(V) !== OBJECT || !types.isDataView(V)) { throw webidl.errors.exception({ header: prefix, message: `${name} is not a DataView.` @@ -656,27 +715,6 @@ webidl.converters.DataView = function (V, prefix, name, opts) { return V } -// https://webidl.spec.whatwg.org/#BufferSource -webidl.converters.BufferSource = function (V, prefix, name, opts) { - if (types.isAnyArrayBuffer(V)) { - return webidl.converters.ArrayBuffer(V, prefix, name, { ...opts, allowShared: false }) - } - - if (types.isTypedArray(V)) { - return webidl.converters.TypedArray(V, V.constructor, prefix, name, { ...opts, allowShared: false }) - } - - if (types.isDataView(V)) { - return webidl.converters.DataView(V, prefix, name, { ...opts, allowShared: false }) - } - - throw webidl.errors.conversionFailed({ - prefix, - argument: `${name} ("${webidl.util.Stringify(V)}")`, - types: ['BufferSource'] - }) -} - webidl.converters['sequence'] = webidl.sequenceConverter( webidl.converters.ByteString ) @@ -690,6 +728,13 @@ webidl.converters['record'] = webidl.recordConverter( webidl.converters.ByteString ) +webidl.converters.Blob = webidl.interfaceConverter(webidl.is.Blob, 'Blob') + +webidl.converters.AbortSignal = webidl.interfaceConverter( + webidl.is.AbortSignal, + 'AbortSignal' +) + module.exports = { webidl } diff --git a/deps/undici/src/lib/web/fileapi/encoding.js b/deps/undici/src/lib/web/fileapi/encoding.js deleted file mode 100644 index 1d1d2b6544f9f0..00000000000000 --- a/deps/undici/src/lib/web/fileapi/encoding.js +++ /dev/null @@ -1,290 +0,0 @@ -'use strict' - -/** - * @see https://encoding.spec.whatwg.org/#concept-encoding-get - * @param {string|undefined} label - */ -function getEncoding (label) { - if (!label) { - return 'failure' - } - - // 1. Remove any leading and trailing ASCII whitespace from label. - // 2. If label is an ASCII case-insensitive match for any of the - // labels listed in the table below, then return the - // corresponding encoding; otherwise return failure. - switch (label.trim().toLowerCase()) { - case 'unicode-1-1-utf-8': - case 'unicode11utf8': - case 'unicode20utf8': - case 'utf-8': - case 'utf8': - case 'x-unicode20utf8': - return 'UTF-8' - case '866': - case 'cp866': - case 'csibm866': - case 'ibm866': - return 'IBM866' - case 'csisolatin2': - case 'iso-8859-2': - case 'iso-ir-101': - case 'iso8859-2': - case 'iso88592': - case 'iso_8859-2': - case 'iso_8859-2:1987': - case 'l2': - case 'latin2': - return 'ISO-8859-2' - case 'csisolatin3': - case 'iso-8859-3': - case 'iso-ir-109': - case 'iso8859-3': - case 'iso88593': - case 'iso_8859-3': - case 'iso_8859-3:1988': - case 'l3': - case 'latin3': - return 'ISO-8859-3' - case 'csisolatin4': - case 'iso-8859-4': - case 'iso-ir-110': - case 'iso8859-4': - case 'iso88594': - case 'iso_8859-4': - case 'iso_8859-4:1988': - case 'l4': - case 'latin4': - return 'ISO-8859-4' - case 'csisolatincyrillic': - case 'cyrillic': - case 'iso-8859-5': - case 'iso-ir-144': - case 'iso8859-5': - case 'iso88595': - case 'iso_8859-5': - case 'iso_8859-5:1988': - return 'ISO-8859-5' - case 'arabic': - case 'asmo-708': - case 'csiso88596e': - case 'csiso88596i': - case 'csisolatinarabic': - case 'ecma-114': - case 'iso-8859-6': - case 'iso-8859-6-e': - case 'iso-8859-6-i': - case 'iso-ir-127': - case 'iso8859-6': - case 'iso88596': - case 'iso_8859-6': - case 'iso_8859-6:1987': - return 'ISO-8859-6' - case 'csisolatingreek': - case 'ecma-118': - case 'elot_928': - case 'greek': - case 'greek8': - case 'iso-8859-7': - case 'iso-ir-126': - case 'iso8859-7': - case 'iso88597': - case 'iso_8859-7': - case 'iso_8859-7:1987': - case 'sun_eu_greek': - return 'ISO-8859-7' - case 'csiso88598e': - case 'csisolatinhebrew': - case 'hebrew': - case 'iso-8859-8': - case 'iso-8859-8-e': - case 'iso-ir-138': - case 'iso8859-8': - case 'iso88598': - case 'iso_8859-8': - case 'iso_8859-8:1988': - case 'visual': - return 'ISO-8859-8' - case 'csiso88598i': - case 'iso-8859-8-i': - case 'logical': - return 'ISO-8859-8-I' - case 'csisolatin6': - case 'iso-8859-10': - case 'iso-ir-157': - case 'iso8859-10': - case 'iso885910': - case 'l6': - case 'latin6': - return 'ISO-8859-10' - case 'iso-8859-13': - case 'iso8859-13': - case 'iso885913': - return 'ISO-8859-13' - case 'iso-8859-14': - case 'iso8859-14': - case 'iso885914': - return 'ISO-8859-14' - case 'csisolatin9': - case 'iso-8859-15': - case 'iso8859-15': - case 'iso885915': - case 'iso_8859-15': - case 'l9': - return 'ISO-8859-15' - case 'iso-8859-16': - return 'ISO-8859-16' - case 'cskoi8r': - case 'koi': - case 'koi8': - case 'koi8-r': - case 'koi8_r': - return 'KOI8-R' - case 'koi8-ru': - case 'koi8-u': - return 'KOI8-U' - case 'csmacintosh': - case 'mac': - case 'macintosh': - case 'x-mac-roman': - return 'macintosh' - case 'iso-8859-11': - case 'iso8859-11': - case 'iso885911': - case 'tis-620': - case 'windows-874': - return 'windows-874' - case 'cp1250': - case 'windows-1250': - case 'x-cp1250': - return 'windows-1250' - case 'cp1251': - case 'windows-1251': - case 'x-cp1251': - return 'windows-1251' - case 'ansi_x3.4-1968': - case 'ascii': - case 'cp1252': - case 'cp819': - case 'csisolatin1': - case 'ibm819': - case 'iso-8859-1': - case 'iso-ir-100': - case 'iso8859-1': - case 'iso88591': - case 'iso_8859-1': - case 'iso_8859-1:1987': - case 'l1': - case 'latin1': - case 'us-ascii': - case 'windows-1252': - case 'x-cp1252': - return 'windows-1252' - case 'cp1253': - case 'windows-1253': - case 'x-cp1253': - return 'windows-1253' - case 'cp1254': - case 'csisolatin5': - case 'iso-8859-9': - case 'iso-ir-148': - case 'iso8859-9': - case 'iso88599': - case 'iso_8859-9': - case 'iso_8859-9:1989': - case 'l5': - case 'latin5': - case 'windows-1254': - case 'x-cp1254': - return 'windows-1254' - case 'cp1255': - case 'windows-1255': - case 'x-cp1255': - return 'windows-1255' - case 'cp1256': - case 'windows-1256': - case 'x-cp1256': - return 'windows-1256' - case 'cp1257': - case 'windows-1257': - case 'x-cp1257': - return 'windows-1257' - case 'cp1258': - case 'windows-1258': - case 'x-cp1258': - return 'windows-1258' - case 'x-mac-cyrillic': - case 'x-mac-ukrainian': - return 'x-mac-cyrillic' - case 'chinese': - case 'csgb2312': - case 'csiso58gb231280': - case 'gb2312': - case 'gb_2312': - case 'gb_2312-80': - case 'gbk': - case 'iso-ir-58': - case 'x-gbk': - return 'GBK' - case 'gb18030': - return 'gb18030' - case 'big5': - case 'big5-hkscs': - case 'cn-big5': - case 'csbig5': - case 'x-x-big5': - return 'Big5' - case 'cseucpkdfmtjapanese': - case 'euc-jp': - case 'x-euc-jp': - return 'EUC-JP' - case 'csiso2022jp': - case 'iso-2022-jp': - return 'ISO-2022-JP' - case 'csshiftjis': - case 'ms932': - case 'ms_kanji': - case 'shift-jis': - case 'shift_jis': - case 'sjis': - case 'windows-31j': - case 'x-sjis': - return 'Shift_JIS' - case 'cseuckr': - case 'csksc56011987': - case 'euc-kr': - case 'iso-ir-149': - case 'korean': - case 'ks_c_5601-1987': - case 'ks_c_5601-1989': - case 'ksc5601': - case 'ksc_5601': - case 'windows-949': - return 'EUC-KR' - case 'csiso2022kr': - case 'hz-gb-2312': - case 'iso-2022-cn': - case 'iso-2022-cn-ext': - case 'iso-2022-kr': - case 'replacement': - return 'replacement' - case 'unicodefffe': - case 'utf-16be': - return 'UTF-16BE' - case 'csunicode': - case 'iso-10646-ucs-2': - case 'ucs-2': - case 'unicode': - case 'unicodefeff': - case 'utf-16': - case 'utf-16le': - return 'UTF-16LE' - case 'x-user-defined': - return 'x-user-defined' - default: return 'failure' - } -} - -module.exports = { - getEncoding -} diff --git a/deps/undici/src/lib/web/fileapi/filereader.js b/deps/undici/src/lib/web/fileapi/filereader.js deleted file mode 100644 index ccebe692a6f499..00000000000000 --- a/deps/undici/src/lib/web/fileapi/filereader.js +++ /dev/null @@ -1,344 +0,0 @@ -'use strict' - -const { - staticPropertyDescriptors, - readOperation, - fireAProgressEvent -} = require('./util') -const { - kState, - kError, - kResult, - kEvents, - kAborted -} = require('./symbols') -const { webidl } = require('../fetch/webidl') -const { kEnumerableProperty } = require('../../core/util') - -class FileReader extends EventTarget { - constructor () { - super() - - this[kState] = 'empty' - this[kResult] = null - this[kError] = null - this[kEvents] = { - loadend: null, - error: null, - abort: null, - load: null, - progress: null, - loadstart: null - } - } - - /** - * @see https://w3c.github.io/FileAPI/#dfn-readAsArrayBuffer - * @param {import('buffer').Blob} blob - */ - readAsArrayBuffer (blob) { - webidl.brandCheck(this, FileReader) - - webidl.argumentLengthCheck(arguments, 1, 'FileReader.readAsArrayBuffer') - - blob = webidl.converters.Blob(blob, { strict: false }) - - // The readAsArrayBuffer(blob) method, when invoked, - // must initiate a read operation for blob with ArrayBuffer. - readOperation(this, blob, 'ArrayBuffer') - } - - /** - * @see https://w3c.github.io/FileAPI/#readAsBinaryString - * @param {import('buffer').Blob} blob - */ - readAsBinaryString (blob) { - webidl.brandCheck(this, FileReader) - - webidl.argumentLengthCheck(arguments, 1, 'FileReader.readAsBinaryString') - - blob = webidl.converters.Blob(blob, { strict: false }) - - // The readAsBinaryString(blob) method, when invoked, - // must initiate a read operation for blob with BinaryString. - readOperation(this, blob, 'BinaryString') - } - - /** - * @see https://w3c.github.io/FileAPI/#readAsDataText - * @param {import('buffer').Blob} blob - * @param {string?} encoding - */ - readAsText (blob, encoding = undefined) { - webidl.brandCheck(this, FileReader) - - webidl.argumentLengthCheck(arguments, 1, 'FileReader.readAsText') - - blob = webidl.converters.Blob(blob, { strict: false }) - - if (encoding !== undefined) { - encoding = webidl.converters.DOMString(encoding, 'FileReader.readAsText', 'encoding') - } - - // The readAsText(blob, encoding) method, when invoked, - // must initiate a read operation for blob with Text and encoding. - readOperation(this, blob, 'Text', encoding) - } - - /** - * @see https://w3c.github.io/FileAPI/#dfn-readAsDataURL - * @param {import('buffer').Blob} blob - */ - readAsDataURL (blob) { - webidl.brandCheck(this, FileReader) - - webidl.argumentLengthCheck(arguments, 1, 'FileReader.readAsDataURL') - - blob = webidl.converters.Blob(blob, { strict: false }) - - // The readAsDataURL(blob) method, when invoked, must - // initiate a read operation for blob with DataURL. - readOperation(this, blob, 'DataURL') - } - - /** - * @see https://w3c.github.io/FileAPI/#dfn-abort - */ - abort () { - // 1. If this's state is "empty" or if this's state is - // "done" set this's result to null and terminate - // this algorithm. - if (this[kState] === 'empty' || this[kState] === 'done') { - this[kResult] = null - return - } - - // 2. If this's state is "loading" set this's state to - // "done" and set this's result to null. - if (this[kState] === 'loading') { - this[kState] = 'done' - this[kResult] = null - } - - // 3. If there are any tasks from this on the file reading - // task source in an affiliated task queue, then remove - // those tasks from that task queue. - this[kAborted] = true - - // 4. Terminate the algorithm for the read method being processed. - // TODO - - // 5. Fire a progress event called abort at this. - fireAProgressEvent('abort', this) - - // 6. If this's state is not "loading", fire a progress - // event called loadend at this. - if (this[kState] !== 'loading') { - fireAProgressEvent('loadend', this) - } - } - - /** - * @see https://w3c.github.io/FileAPI/#dom-filereader-readystate - */ - get readyState () { - webidl.brandCheck(this, FileReader) - - switch (this[kState]) { - case 'empty': return this.EMPTY - case 'loading': return this.LOADING - case 'done': return this.DONE - } - } - - /** - * @see https://w3c.github.io/FileAPI/#dom-filereader-result - */ - get result () { - webidl.brandCheck(this, FileReader) - - // The result attribute’s getter, when invoked, must return - // this's result. - return this[kResult] - } - - /** - * @see https://w3c.github.io/FileAPI/#dom-filereader-error - */ - get error () { - webidl.brandCheck(this, FileReader) - - // The error attribute’s getter, when invoked, must return - // this's error. - return this[kError] - } - - get onloadend () { - webidl.brandCheck(this, FileReader) - - return this[kEvents].loadend - } - - set onloadend (fn) { - webidl.brandCheck(this, FileReader) - - if (this[kEvents].loadend) { - this.removeEventListener('loadend', this[kEvents].loadend) - } - - if (typeof fn === 'function') { - this[kEvents].loadend = fn - this.addEventListener('loadend', fn) - } else { - this[kEvents].loadend = null - } - } - - get onerror () { - webidl.brandCheck(this, FileReader) - - return this[kEvents].error - } - - set onerror (fn) { - webidl.brandCheck(this, FileReader) - - if (this[kEvents].error) { - this.removeEventListener('error', this[kEvents].error) - } - - if (typeof fn === 'function') { - this[kEvents].error = fn - this.addEventListener('error', fn) - } else { - this[kEvents].error = null - } - } - - get onloadstart () { - webidl.brandCheck(this, FileReader) - - return this[kEvents].loadstart - } - - set onloadstart (fn) { - webidl.brandCheck(this, FileReader) - - if (this[kEvents].loadstart) { - this.removeEventListener('loadstart', this[kEvents].loadstart) - } - - if (typeof fn === 'function') { - this[kEvents].loadstart = fn - this.addEventListener('loadstart', fn) - } else { - this[kEvents].loadstart = null - } - } - - get onprogress () { - webidl.brandCheck(this, FileReader) - - return this[kEvents].progress - } - - set onprogress (fn) { - webidl.brandCheck(this, FileReader) - - if (this[kEvents].progress) { - this.removeEventListener('progress', this[kEvents].progress) - } - - if (typeof fn === 'function') { - this[kEvents].progress = fn - this.addEventListener('progress', fn) - } else { - this[kEvents].progress = null - } - } - - get onload () { - webidl.brandCheck(this, FileReader) - - return this[kEvents].load - } - - set onload (fn) { - webidl.brandCheck(this, FileReader) - - if (this[kEvents].load) { - this.removeEventListener('load', this[kEvents].load) - } - - if (typeof fn === 'function') { - this[kEvents].load = fn - this.addEventListener('load', fn) - } else { - this[kEvents].load = null - } - } - - get onabort () { - webidl.brandCheck(this, FileReader) - - return this[kEvents].abort - } - - set onabort (fn) { - webidl.brandCheck(this, FileReader) - - if (this[kEvents].abort) { - this.removeEventListener('abort', this[kEvents].abort) - } - - if (typeof fn === 'function') { - this[kEvents].abort = fn - this.addEventListener('abort', fn) - } else { - this[kEvents].abort = null - } - } -} - -// https://w3c.github.io/FileAPI/#dom-filereader-empty -FileReader.EMPTY = FileReader.prototype.EMPTY = 0 -// https://w3c.github.io/FileAPI/#dom-filereader-loading -FileReader.LOADING = FileReader.prototype.LOADING = 1 -// https://w3c.github.io/FileAPI/#dom-filereader-done -FileReader.DONE = FileReader.prototype.DONE = 2 - -Object.defineProperties(FileReader.prototype, { - EMPTY: staticPropertyDescriptors, - LOADING: staticPropertyDescriptors, - DONE: staticPropertyDescriptors, - readAsArrayBuffer: kEnumerableProperty, - readAsBinaryString: kEnumerableProperty, - readAsText: kEnumerableProperty, - readAsDataURL: kEnumerableProperty, - abort: kEnumerableProperty, - readyState: kEnumerableProperty, - result: kEnumerableProperty, - error: kEnumerableProperty, - onloadstart: kEnumerableProperty, - onprogress: kEnumerableProperty, - onload: kEnumerableProperty, - onabort: kEnumerableProperty, - onerror: kEnumerableProperty, - onloadend: kEnumerableProperty, - [Symbol.toStringTag]: { - value: 'FileReader', - writable: false, - enumerable: false, - configurable: true - } -}) - -Object.defineProperties(FileReader, { - EMPTY: staticPropertyDescriptors, - LOADING: staticPropertyDescriptors, - DONE: staticPropertyDescriptors -}) - -module.exports = { - FileReader -} diff --git a/deps/undici/src/lib/web/fileapi/progressevent.js b/deps/undici/src/lib/web/fileapi/progressevent.js deleted file mode 100644 index 2d09d18107de76..00000000000000 --- a/deps/undici/src/lib/web/fileapi/progressevent.js +++ /dev/null @@ -1,78 +0,0 @@ -'use strict' - -const { webidl } = require('../fetch/webidl') - -const kState = Symbol('ProgressEvent state') - -/** - * @see https://xhr.spec.whatwg.org/#progressevent - */ -class ProgressEvent extends Event { - constructor (type, eventInitDict = {}) { - type = webidl.converters.DOMString(type, 'ProgressEvent constructor', 'type') - eventInitDict = webidl.converters.ProgressEventInit(eventInitDict ?? {}) - - super(type, eventInitDict) - - this[kState] = { - lengthComputable: eventInitDict.lengthComputable, - loaded: eventInitDict.loaded, - total: eventInitDict.total - } - } - - get lengthComputable () { - webidl.brandCheck(this, ProgressEvent) - - return this[kState].lengthComputable - } - - get loaded () { - webidl.brandCheck(this, ProgressEvent) - - return this[kState].loaded - } - - get total () { - webidl.brandCheck(this, ProgressEvent) - - return this[kState].total - } -} - -webidl.converters.ProgressEventInit = webidl.dictionaryConverter([ - { - key: 'lengthComputable', - converter: webidl.converters.boolean, - defaultValue: () => false - }, - { - key: 'loaded', - converter: webidl.converters['unsigned long long'], - defaultValue: () => 0 - }, - { - key: 'total', - converter: webidl.converters['unsigned long long'], - defaultValue: () => 0 - }, - { - key: 'bubbles', - converter: webidl.converters.boolean, - defaultValue: () => false - }, - { - key: 'cancelable', - converter: webidl.converters.boolean, - defaultValue: () => false - }, - { - key: 'composed', - converter: webidl.converters.boolean, - defaultValue: () => false - } -]) - -module.exports = { - ProgressEvent -} diff --git a/deps/undici/src/lib/web/fileapi/symbols.js b/deps/undici/src/lib/web/fileapi/symbols.js deleted file mode 100644 index dd11746de389ca..00000000000000 --- a/deps/undici/src/lib/web/fileapi/symbols.js +++ /dev/null @@ -1,10 +0,0 @@ -'use strict' - -module.exports = { - kState: Symbol('FileReader state'), - kResult: Symbol('FileReader result'), - kError: Symbol('FileReader error'), - kLastProgressEventFired: Symbol('FileReader last progress event fired timestamp'), - kEvents: Symbol('FileReader events'), - kAborted: Symbol('FileReader aborted') -} diff --git a/deps/undici/src/lib/web/fileapi/util.js b/deps/undici/src/lib/web/fileapi/util.js deleted file mode 100644 index 9110b872a817d2..00000000000000 --- a/deps/undici/src/lib/web/fileapi/util.js +++ /dev/null @@ -1,391 +0,0 @@ -'use strict' - -const { - kState, - kError, - kResult, - kAborted, - kLastProgressEventFired -} = require('./symbols') -const { ProgressEvent } = require('./progressevent') -const { getEncoding } = require('./encoding') -const { serializeAMimeType, parseMIMEType } = require('../fetch/data-url') -const { types } = require('node:util') -const { StringDecoder } = require('string_decoder') -const { btoa } = require('node:buffer') - -/** @type {PropertyDescriptor} */ -const staticPropertyDescriptors = { - enumerable: true, - writable: false, - configurable: false -} - -/** - * @see https://w3c.github.io/FileAPI/#readOperation - * @param {import('./filereader').FileReader} fr - * @param {import('buffer').Blob} blob - * @param {string} type - * @param {string?} encodingName - */ -function readOperation (fr, blob, type, encodingName) { - // 1. If fr’s state is "loading", throw an InvalidStateError - // DOMException. - if (fr[kState] === 'loading') { - throw new DOMException('Invalid state', 'InvalidStateError') - } - - // 2. Set fr’s state to "loading". - fr[kState] = 'loading' - - // 3. Set fr’s result to null. - fr[kResult] = null - - // 4. Set fr’s error to null. - fr[kError] = null - - // 5. Let stream be the result of calling get stream on blob. - /** @type {import('stream/web').ReadableStream} */ - const stream = blob.stream() - - // 6. Let reader be the result of getting a reader from stream. - const reader = stream.getReader() - - // 7. Let bytes be an empty byte sequence. - /** @type {Uint8Array[]} */ - const bytes = [] - - // 8. Let chunkPromise be the result of reading a chunk from - // stream with reader. - let chunkPromise = reader.read() - - // 9. Let isFirstChunk be true. - let isFirstChunk = true - - // 10. In parallel, while true: - // Note: "In parallel" just means non-blocking - // Note 2: readOperation itself cannot be async as double - // reading the body would then reject the promise, instead - // of throwing an error. - ;(async () => { - while (!fr[kAborted]) { - // 1. Wait for chunkPromise to be fulfilled or rejected. - try { - const { done, value } = await chunkPromise - - // 2. If chunkPromise is fulfilled, and isFirstChunk is - // true, queue a task to fire a progress event called - // loadstart at fr. - if (isFirstChunk && !fr[kAborted]) { - queueMicrotask(() => { - fireAProgressEvent('loadstart', fr) - }) - } - - // 3. Set isFirstChunk to false. - isFirstChunk = false - - // 4. If chunkPromise is fulfilled with an object whose - // done property is false and whose value property is - // a Uint8Array object, run these steps: - if (!done && types.isUint8Array(value)) { - // 1. Let bs be the byte sequence represented by the - // Uint8Array object. - - // 2. Append bs to bytes. - bytes.push(value) - - // 3. If roughly 50ms have passed since these steps - // were last invoked, queue a task to fire a - // progress event called progress at fr. - if ( - ( - fr[kLastProgressEventFired] === undefined || - Date.now() - fr[kLastProgressEventFired] >= 50 - ) && - !fr[kAborted] - ) { - fr[kLastProgressEventFired] = Date.now() - queueMicrotask(() => { - fireAProgressEvent('progress', fr) - }) - } - - // 4. Set chunkPromise to the result of reading a - // chunk from stream with reader. - chunkPromise = reader.read() - } else if (done) { - // 5. Otherwise, if chunkPromise is fulfilled with an - // object whose done property is true, queue a task - // to run the following steps and abort this algorithm: - queueMicrotask(() => { - // 1. Set fr’s state to "done". - fr[kState] = 'done' - - // 2. Let result be the result of package data given - // bytes, type, blob’s type, and encodingName. - try { - const result = packageData(bytes, type, blob.type, encodingName) - - // 4. Else: - - if (fr[kAborted]) { - return - } - - // 1. Set fr’s result to result. - fr[kResult] = result - - // 2. Fire a progress event called load at the fr. - fireAProgressEvent('load', fr) - } catch (error) { - // 3. If package data threw an exception error: - - // 1. Set fr’s error to error. - fr[kError] = error - - // 2. Fire a progress event called error at fr. - fireAProgressEvent('error', fr) - } - - // 5. If fr’s state is not "loading", fire a progress - // event called loadend at the fr. - if (fr[kState] !== 'loading') { - fireAProgressEvent('loadend', fr) - } - }) - - break - } - } catch (error) { - if (fr[kAborted]) { - return - } - - // 6. Otherwise, if chunkPromise is rejected with an - // error error, queue a task to run the following - // steps and abort this algorithm: - queueMicrotask(() => { - // 1. Set fr’s state to "done". - fr[kState] = 'done' - - // 2. Set fr’s error to error. - fr[kError] = error - - // 3. Fire a progress event called error at fr. - fireAProgressEvent('error', fr) - - // 4. If fr’s state is not "loading", fire a progress - // event called loadend at fr. - if (fr[kState] !== 'loading') { - fireAProgressEvent('loadend', fr) - } - }) - - break - } - } - })() -} - -/** - * @see https://w3c.github.io/FileAPI/#fire-a-progress-event - * @see https://dom.spec.whatwg.org/#concept-event-fire - * @param {string} e The name of the event - * @param {import('./filereader').FileReader} reader - */ -function fireAProgressEvent (e, reader) { - // The progress event e does not bubble. e.bubbles must be false - // The progress event e is NOT cancelable. e.cancelable must be false - const event = new ProgressEvent(e, { - bubbles: false, - cancelable: false - }) - - reader.dispatchEvent(event) -} - -/** - * @see https://w3c.github.io/FileAPI/#blob-package-data - * @param {Uint8Array[]} bytes - * @param {string} type - * @param {string?} mimeType - * @param {string?} encodingName - */ -function packageData (bytes, type, mimeType, encodingName) { - // 1. A Blob has an associated package data algorithm, given - // bytes, a type, a optional mimeType, and a optional - // encodingName, which switches on type and runs the - // associated steps: - - switch (type) { - case 'DataURL': { - // 1. Return bytes as a DataURL [RFC2397] subject to - // the considerations below: - // * Use mimeType as part of the Data URL if it is - // available in keeping with the Data URL - // specification [RFC2397]. - // * If mimeType is not available return a Data URL - // without a media-type. [RFC2397]. - - // https://datatracker.ietf.org/doc/html/rfc2397#section-3 - // dataurl := "data:" [ mediatype ] [ ";base64" ] "," data - // mediatype := [ type "/" subtype ] *( ";" parameter ) - // data := *urlchar - // parameter := attribute "=" value - let dataURL = 'data:' - - const parsed = parseMIMEType(mimeType || 'application/octet-stream') - - if (parsed !== 'failure') { - dataURL += serializeAMimeType(parsed) - } - - dataURL += ';base64,' - - const decoder = new StringDecoder('latin1') - - for (const chunk of bytes) { - dataURL += btoa(decoder.write(chunk)) - } - - dataURL += btoa(decoder.end()) - - return dataURL - } - case 'Text': { - // 1. Let encoding be failure - let encoding = 'failure' - - // 2. If the encodingName is present, set encoding to the - // result of getting an encoding from encodingName. - if (encodingName) { - encoding = getEncoding(encodingName) - } - - // 3. If encoding is failure, and mimeType is present: - if (encoding === 'failure' && mimeType) { - // 1. Let type be the result of parse a MIME type - // given mimeType. - const type = parseMIMEType(mimeType) - - // 2. If type is not failure, set encoding to the result - // of getting an encoding from type’s parameters["charset"]. - if (type !== 'failure') { - encoding = getEncoding(type.parameters.get('charset')) - } - } - - // 4. If encoding is failure, then set encoding to UTF-8. - if (encoding === 'failure') { - encoding = 'UTF-8' - } - - // 5. Decode bytes using fallback encoding encoding, and - // return the result. - return decode(bytes, encoding) - } - case 'ArrayBuffer': { - // Return a new ArrayBuffer whose contents are bytes. - const sequence = combineByteSequences(bytes) - - return sequence.buffer - } - case 'BinaryString': { - // Return bytes as a binary string, in which every byte - // is represented by a code unit of equal value [0..255]. - let binaryString = '' - - const decoder = new StringDecoder('latin1') - - for (const chunk of bytes) { - binaryString += decoder.write(chunk) - } - - binaryString += decoder.end() - - return binaryString - } - } -} - -/** - * @see https://encoding.spec.whatwg.org/#decode - * @param {Uint8Array[]} ioQueue - * @param {string} encoding - */ -function decode (ioQueue, encoding) { - const bytes = combineByteSequences(ioQueue) - - // 1. Let BOMEncoding be the result of BOM sniffing ioQueue. - const BOMEncoding = BOMSniffing(bytes) - - let slice = 0 - - // 2. If BOMEncoding is non-null: - if (BOMEncoding !== null) { - // 1. Set encoding to BOMEncoding. - encoding = BOMEncoding - - // 2. Read three bytes from ioQueue, if BOMEncoding is - // UTF-8; otherwise read two bytes. - // (Do nothing with those bytes.) - slice = BOMEncoding === 'UTF-8' ? 3 : 2 - } - - // 3. Process a queue with an instance of encoding’s - // decoder, ioQueue, output, and "replacement". - - // 4. Return output. - - const sliced = bytes.slice(slice) - return new TextDecoder(encoding).decode(sliced) -} - -/** - * @see https://encoding.spec.whatwg.org/#bom-sniff - * @param {Uint8Array} ioQueue - */ -function BOMSniffing (ioQueue) { - // 1. Let BOM be the result of peeking 3 bytes from ioQueue, - // converted to a byte sequence. - const [a, b, c] = ioQueue - - // 2. For each of the rows in the table below, starting with - // the first one and going down, if BOM starts with the - // bytes given in the first column, then return the - // encoding given in the cell in the second column of that - // row. Otherwise, return null. - if (a === 0xEF && b === 0xBB && c === 0xBF) { - return 'UTF-8' - } else if (a === 0xFE && b === 0xFF) { - return 'UTF-16BE' - } else if (a === 0xFF && b === 0xFE) { - return 'UTF-16LE' - } - - return null -} - -/** - * @param {Uint8Array[]} sequences - */ -function combineByteSequences (sequences) { - const size = sequences.reduce((a, b) => { - return a + b.byteLength - }, 0) - - let offset = 0 - - return sequences.reduce((a, b) => { - a.set(b, offset) - offset += b.byteLength - return a - }, new Uint8Array(size)) -} - -module.exports = { - staticPropertyDescriptors, - readOperation, - fireAProgressEvent -} diff --git a/deps/undici/src/lib/web/websocket/connection.js b/deps/undici/src/lib/web/websocket/connection.js index bb87d361e4b743..6ecc53af1795f3 100644 --- a/deps/undici/src/lib/web/websocket/connection.js +++ b/deps/undici/src/lib/web/websocket/connection.js @@ -1,21 +1,14 @@ 'use strict' const { uid, states, sentCloseFrameState, emptyBuffer, opcodes } = require('./constants') -const { - kReadyState, - kSentClose, - kByteParser, - kReceivedClose, - kResponse -} = require('./symbols') -const { fireEvent, failWebsocketConnection, isClosing, isClosed, isEstablished, parseExtensions } = require('./util') +const { failWebsocketConnection, parseExtensions, isClosed, isClosing, isEstablished, validateCloseCodeAndReason } = require('./util') const { channels } = require('../../core/diagnostics') -const { CloseEvent } = require('./events') const { makeRequest } = require('../fetch/request') const { fetching } = require('../fetch/index') const { Headers, getHeadersList } = require('../fetch/headers') const { getDecodeSplit } = require('../fetch/util') const { WebsocketFrameSend } = require('./frame') +const assert = require('node:assert') /** @type {import('crypto')} */ let crypto @@ -30,11 +23,10 @@ try { * @see https://websockets.spec.whatwg.org/#concept-websocket-establish * @param {URL} url * @param {string|string[]} protocols - * @param {import('./websocket').WebSocket} ws - * @param {(response: any, extensions: string[] | undefined) => void} onEstablish - * @param {Partial} options + * @param {import('./websocket').Handler} handler + * @param {Partial} options */ -function establishWebSocketConnection (url, protocols, client, ws, onEstablish, options) { +function establishWebSocketConnection (url, protocols, client, handler, options) { // 1. Let requestURL be a copy of url, with its scheme set to "http", if url’s // scheme is "ws", and to "https" otherwise. const requestURL = url @@ -75,17 +67,17 @@ function establishWebSocketConnection (url, protocols, client, ws, onEstablish, // 6. Append (`Sec-WebSocket-Key`, keyValue) to request’s // header list. - request.headersList.append('sec-websocket-key', keyValue) + request.headersList.append('sec-websocket-key', keyValue, true) // 7. Append (`Sec-WebSocket-Version`, `13`) to request’s // header list. - request.headersList.append('sec-websocket-version', '13') + request.headersList.append('sec-websocket-version', '13', true) // 8. For each protocol in protocols, combine // (`Sec-WebSocket-Protocol`, protocol) in request’s header // list. for (const protocol of protocols) { - request.headersList.append('sec-websocket-protocol', protocol) + request.headersList.append('sec-websocket-protocol', protocol, true) } // 9. Let permessageDeflate be a user-agent defined @@ -95,7 +87,7 @@ function establishWebSocketConnection (url, protocols, client, ws, onEstablish, // 10. Append (`Sec-WebSocket-Extensions`, permessageDeflate) to // request’s header list. - request.headersList.append('sec-websocket-extensions', permessageDeflate) + request.headersList.append('sec-websocket-extensions', permessageDeflate, true) // 11. Fetch request with useParallelQueue set to true, and // processResponse given response being these steps: @@ -104,10 +96,16 @@ function establishWebSocketConnection (url, protocols, client, ws, onEstablish, useParallelQueue: true, dispatcher: options.dispatcher, processResponse (response) { + if (response.type === 'error') { + // If the WebSocket connection could not be established, it is also said + // that _The WebSocket Connection is Closed_, but not _cleanly_. + handler.readyState = states.CLOSED + } + // 1. If response is a network error or its status is not 101, // fail the WebSocket connection. if (response.type === 'error' || response.status !== 101) { - failWebsocketConnection(ws, 'Received network error or non-101 status code.') + failWebsocketConnection(handler, 1002, 'Received network error or non-101 status code.') return } @@ -116,7 +114,7 @@ function establishWebSocketConnection (url, protocols, client, ws, onEstablish, // header list results in null, failure, or the empty byte // sequence, then fail the WebSocket connection. if (protocols.length !== 0 && !response.headersList.get('Sec-WebSocket-Protocol')) { - failWebsocketConnection(ws, 'Server did not respond with sent protocols.') + failWebsocketConnection(handler, 1002, 'Server did not respond with sent protocols.') return } @@ -131,7 +129,7 @@ function establishWebSocketConnection (url, protocols, client, ws, onEstablish, // insensitive match for the value "websocket", the client MUST // _Fail the WebSocket Connection_. if (response.headersList.get('Upgrade')?.toLowerCase() !== 'websocket') { - failWebsocketConnection(ws, 'Server did not set Upgrade header to "websocket".') + failWebsocketConnection(handler, 1002, 'Server did not set Upgrade header to "websocket".') return } @@ -140,7 +138,7 @@ function establishWebSocketConnection (url, protocols, client, ws, onEstablish, // ASCII case-insensitive match for the value "Upgrade", the client // MUST _Fail the WebSocket Connection_. if (response.headersList.get('Connection')?.toLowerCase() !== 'upgrade') { - failWebsocketConnection(ws, 'Server did not set Connection header to "upgrade".') + failWebsocketConnection(handler, 1002, 'Server did not set Connection header to "upgrade".') return } @@ -154,7 +152,7 @@ function establishWebSocketConnection (url, protocols, client, ws, onEstablish, const secWSAccept = response.headersList.get('Sec-WebSocket-Accept') const digest = crypto.createHash('sha1').update(keyValue + uid).digest('base64') if (secWSAccept !== digest) { - failWebsocketConnection(ws, 'Incorrect hash received in Sec-WebSocket-Accept header.') + failWebsocketConnection(handler, 1002, 'Incorrect hash received in Sec-WebSocket-Accept header.') return } @@ -172,7 +170,7 @@ function establishWebSocketConnection (url, protocols, client, ws, onEstablish, extensions = parseExtensions(secExtension) if (!extensions.has('permessage-deflate')) { - failWebsocketConnection(ws, 'Sec-WebSocket-Extensions header does not match.') + failWebsocketConnection(handler, 1002, 'Sec-WebSocket-Extensions header does not match.') return } } @@ -193,14 +191,14 @@ function establishWebSocketConnection (url, protocols, client, ws, onEstablish, // the selected subprotocol values in its response for the connection to // be established. if (!requestProtocols.includes(secProtocol)) { - failWebsocketConnection(ws, 'Protocol was not set in the opening handshake.') + failWebsocketConnection(handler, 1002, 'Protocol was not set in the opening handshake.') return } } - response.socket.on('data', onSocketData) - response.socket.on('close', onSocketClose) - response.socket.on('error', onSocketError) + response.socket.on('data', handler.onSocketData) + response.socket.on('close', handler.onSocketClose) + response.socket.on('error', handler.onSocketError) if (channels.open.hasSubscribers) { channels.open.publish({ @@ -210,35 +208,45 @@ function establishWebSocketConnection (url, protocols, client, ws, onEstablish, }) } - onEstablish(response, extensions) + handler.wasEverConnected = true + handler.onConnectionEstablished(response, extensions) } }) return controller } -function closeWebSocketConnection (ws, code, reason, reasonByteLength) { - if (isClosing(ws) || isClosed(ws)) { - // If this's ready state is CLOSING (2) or CLOSED (3) +/** + * @see https://whatpr.org/websockets/48.html#close-the-websocket + * @param {import('./websocket').Handler} object + * @param {number} [code=null] + * @param {string} [reason=''] + */ +function closeWebSocketConnection (object, code, reason, validate = false) { + // 1. If code was not supplied, let code be null. + code ??= null + + // 2. If reason was not supplied, let reason be the empty string. + reason ??= '' + + // 3. Validate close code and reason with code and reason. + if (validate) validateCloseCodeAndReason(code, reason) + + // 4. Run the first matching steps from the following list: + // - If object’s ready state is CLOSING (2) or CLOSED (3) + // - If the WebSocket connection is not yet established [WSP] + // - If the WebSocket closing handshake has not yet been started [WSP] + // - Otherwise + if (isClosed(object.readyState) || isClosing(object.readyState)) { // Do nothing. - } else if (!isEstablished(ws)) { - // If the WebSocket connection is not yet established - // Fail the WebSocket connection and set this's ready state - // to CLOSING (2). - failWebsocketConnection(ws, 'Connection was closed before it was established.') - ws[kReadyState] = states.CLOSING - } else if (ws[kSentClose] === sentCloseFrameState.NOT_SENT) { - // If the WebSocket closing handshake has not yet been started - // Start the WebSocket closing handshake and set this's ready - // state to CLOSING (2). - // - If neither code nor reason is present, the WebSocket Close - // message must not have a body. - // - If code is present, then the status code to use in the - // WebSocket Close message must be the integer given by code. - // - If reason is also present, then reasonBytes must be - // provided in the Close message after the status code. - - ws[kSentClose] = sentCloseFrameState.PROCESSING + } else if (!isEstablished(object.readyState)) { + // Fail the WebSocket connection and set object’s ready state to CLOSING (2). [WSP] + failWebsocketConnection(object) + object.readyState = states.CLOSING + } else if (!object.closeState.has(sentCloseFrameState.SENT) && !object.closeState.has(sentCloseFrameState.RECEIVED)) { + // Upon either sending or receiving a Close control frame, it is said + // that _The WebSocket Closing Handshake is Started_ and that the + // WebSocket connection is in the CLOSING state. const frame = new WebsocketFrameSend() @@ -247,13 +255,24 @@ function closeWebSocketConnection (ws, code, reason, reasonByteLength) { // If code is present, then the status code to use in the // WebSocket Close message must be the integer given by code. - if (code !== undefined && reason === undefined) { + // If code is null and reason is the empty string, the WebSocket Close frame must not have a body. + // If reason is non-empty but code is null, then set code to 1000 ("Normal Closure"). + if (reason.length !== 0 && code === null) { + code = 1000 + } + + // If code is set, then the status code to use in the WebSocket Close frame must be the integer given by code. + assert(code === null || Number.isInteger(code)) + + if (code === null && reason.length === 0) { + frame.frameData = emptyBuffer + } else if (code !== null && reason === null) { frame.frameData = Buffer.allocUnsafe(2) frame.frameData.writeUInt16BE(code, 0) - } else if (code !== undefined && reason !== undefined) { + } else if (code !== null && reason !== null) { // If reason is also present, then reasonBytes must be // provided in the Close message after the status code. - frame.frameData = Buffer.allocUnsafe(2 + reasonByteLength) + frame.frameData = Buffer.allocUnsafe(2 + Buffer.byteLength(reason)) frame.frameData.writeUInt16BE(code, 0) // the body MAY contain UTF-8-encoded data with value /reason/ frame.frameData.write(reason, 2, 'utf-8') @@ -261,108 +280,18 @@ function closeWebSocketConnection (ws, code, reason, reasonByteLength) { frame.frameData = emptyBuffer } - /** @type {import('stream').Duplex} */ - const socket = ws[kResponse].socket - - socket.write(frame.createFrame(opcodes.CLOSE)) + object.socket.write(frame.createFrame(opcodes.CLOSE)) - ws[kSentClose] = sentCloseFrameState.SENT + object.closeState.add(sentCloseFrameState.SENT) // Upon either sending or receiving a Close control frame, it is said // that _The WebSocket Closing Handshake is Started_ and that the // WebSocket connection is in the CLOSING state. - ws[kReadyState] = states.CLOSING + object.readyState = states.CLOSING } else { - // Otherwise - // Set this's ready state to CLOSING (2). - ws[kReadyState] = states.CLOSING - } -} - -/** - * @param {Buffer} chunk - */ -function onSocketData (chunk) { - if (!this.ws[kByteParser].write(chunk)) { - this.pause() - } -} - -/** - * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol - * @see https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.4 - */ -function onSocketClose () { - const { ws } = this - const { [kResponse]: response } = ws - - response.socket.off('data', onSocketData) - response.socket.off('close', onSocketClose) - response.socket.off('error', onSocketError) - - // If the TCP connection was closed after the - // WebSocket closing handshake was completed, the WebSocket connection - // is said to have been closed _cleanly_. - const wasClean = ws[kSentClose] === sentCloseFrameState.SENT && ws[kReceivedClose] - - let code = 1005 - let reason = '' - - const result = ws[kByteParser].closingInfo - - if (result && !result.error) { - code = result.code ?? 1005 - reason = result.reason - } else if (!ws[kReceivedClose]) { - // If _The WebSocket - // Connection is Closed_ and no Close control frame was received by the - // endpoint (such as could occur if the underlying transport connection - // is lost), _The WebSocket Connection Close Code_ is considered to be - // 1006. - code = 1006 - } - - // 1. Change the ready state to CLOSED (3). - ws[kReadyState] = states.CLOSED - - // 2. If the user agent was required to fail the WebSocket - // connection, or if the WebSocket connection was closed - // after being flagged as full, fire an event named error - // at the WebSocket object. - // TODO - - // 3. Fire an event named close at the WebSocket object, - // using CloseEvent, with the wasClean attribute - // initialized to true if the connection closed cleanly - // and false otherwise, the code attribute initialized to - // the WebSocket connection close code, and the reason - // attribute initialized to the result of applying UTF-8 - // decode without BOM to the WebSocket connection close - // reason. - // TODO: process.nextTick - fireEvent('close', ws, (type, init) => new CloseEvent(type, init), { - wasClean, code, reason - }) - - if (channels.close.hasSubscribers) { - channels.close.publish({ - websocket: ws, - code, - reason - }) - } -} - -function onSocketError (error) { - const { ws } = this - - ws[kReadyState] = states.CLOSING - - if (channels.socketError.hasSubscribers) { - channels.socketError.publish(error) + // Set object’s ready state to CLOSING (2). + object.readyState = states.CLOSING } - - this.destroy() } module.exports = { diff --git a/deps/undici/src/lib/web/websocket/constants.js b/deps/undici/src/lib/web/websocket/constants.js index 2019b5b67a7eff..e4e69901c9629a 100644 --- a/deps/undici/src/lib/web/websocket/constants.js +++ b/deps/undici/src/lib/web/websocket/constants.js @@ -1,18 +1,32 @@ 'use strict' -// This is a Globally Unique Identifier unique used -// to validate that the endpoint accepts websocket -// connections. -// See https://www.rfc-editor.org/rfc/rfc6455.html#section-1.3 +/** + * This is a Globally Unique Identifier unique used to validate that the + * endpoint accepts websocket connections. + * @see https://www.rfc-editor.org/rfc/rfc6455.html#section-1.3 + * @type {'258EAFA5-E914-47DA-95CA-C5AB0DC85B11'} + */ const uid = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11' -/** @type {PropertyDescriptor} */ +/** + * @type {PropertyDescriptor} + */ const staticPropertyDescriptors = { enumerable: true, writable: false, configurable: false } +/** + * The states of the WebSocket connection. + * + * @readonly + * @enum + * @property {0} CONNECTING + * @property {1} OPEN + * @property {2} CLOSING + * @property {3} CLOSED + */ const states = { CONNECTING: 0, OPEN: 1, @@ -20,12 +34,31 @@ const states = { CLOSED: 3 } +/** + * @readonly + * @enum + * @property {0} NOT_SENT + * @property {1} PROCESSING + * @property {2} SENT + */ const sentCloseFrameState = { - NOT_SENT: 0, - PROCESSING: 1, - SENT: 2 + SENT: 1, + RECEIVED: 2 } +/** + * The WebSocket opcodes. + * + * @readonly + * @enum + * @property {0x0} CONTINUATION + * @property {0x1} TEXT + * @property {0x2} BINARY + * @property {0x8} CLOSE + * @property {0x9} PING + * @property {0xA} PONG + * @see https://datatracker.ietf.org/doc/html/rfc6455#section-5.2 + */ const opcodes = { CONTINUATION: 0x0, TEXT: 0x1, @@ -35,8 +68,23 @@ const opcodes = { PONG: 0xA } -const maxUnsigned16Bit = 2 ** 16 - 1 // 65535 +/** + * The maximum value for an unsigned 16-bit integer. + * + * @type {65535} 2 ** 16 - 1 + */ +const maxUnsigned16Bit = 65535 +/** + * The states of the parser. + * + * @readonly + * @enum + * @property {0} INFO + * @property {2} PAYLOADLENGTH_16 + * @property {3} PAYLOADLENGTH_64 + * @property {4} READ_DATA + */ const parserStates = { INFO: 0, PAYLOADLENGTH_16: 2, @@ -44,10 +92,22 @@ const parserStates = { READ_DATA: 4 } +/** + * An empty buffer. + * + * @type {Buffer} + */ const emptyBuffer = Buffer.allocUnsafe(0) +/** + * @readonly + * @property {1} text + * @property {2} typedArray + * @property {3} arrayBuffer + * @property {4} blob + */ const sendHints = { - string: 1, + text: 1, typedArray: 2, arrayBuffer: 3, blob: 4 diff --git a/deps/undici/src/lib/web/websocket/events.js b/deps/undici/src/lib/web/websocket/events.js index f899c21d42bbeb..343227997e8cbf 100644 --- a/deps/undici/src/lib/web/websocket/events.js +++ b/deps/undici/src/lib/web/websocket/events.js @@ -3,7 +3,6 @@ const { webidl } = require('../fetch/webidl') const { kEnumerableProperty } = require('../../core/util') const { kConstruct } = require('../../core/symbols') -const { MessagePort } = require('node:worker_threads') /** * @see https://html.spec.whatwg.org/multipage/comms.html#messageevent @@ -219,7 +218,10 @@ Object.defineProperties(ErrorEvent.prototype, { error: kEnumerableProperty }) -webidl.converters.MessagePort = webidl.interfaceConverter(MessagePort) +webidl.converters.MessagePort = webidl.interfaceConverter( + webidl.is.MessagePort, + 'MessagePort' +) webidl.converters['sequence'] = webidl.sequenceConverter( webidl.converters.MessagePort diff --git a/deps/undici/src/lib/web/websocket/frame.js b/deps/undici/src/lib/web/websocket/frame.js index b062ffde8ecb01..e773b33e1a61c2 100644 --- a/deps/undici/src/lib/web/websocket/frame.js +++ b/deps/undici/src/lib/web/websocket/frame.js @@ -1,8 +1,8 @@ 'use strict' -const { maxUnsigned16Bit } = require('./constants') +const { maxUnsigned16Bit, opcodes } = require('./constants') -const BUFFER_SIZE = 16386 +const BUFFER_SIZE = 8 * 1024 /** @type {import('crypto')} */ let crypto @@ -27,7 +27,7 @@ try { function generateMask () { if (bufIdx === BUFFER_SIZE) { bufIdx = 0 - crypto.randomFillSync((buffer ??= Buffer.allocUnsafe(BUFFER_SIZE)), 0, BUFFER_SIZE) + crypto.randomFillSync((buffer ??= Buffer.allocUnsafeSlow(BUFFER_SIZE)), 0, BUFFER_SIZE) } return [buffer[bufIdx++], buffer[bufIdx++], buffer[bufIdx++], buffer[bufIdx++]] } @@ -89,6 +89,48 @@ class WebsocketFrameSend { return buffer } + + /** + * @param {Uint8Array} buffer + */ + static createFastTextFrame (buffer) { + const maskKey = generateMask() + + const bodyLength = buffer.length + + // mask body + for (let i = 0; i < bodyLength; ++i) { + buffer[i] ^= maskKey[i & 3] + } + + let payloadLength = bodyLength + let offset = 6 + + if (bodyLength > maxUnsigned16Bit) { + offset += 8 // payload length is next 8 bytes + payloadLength = 127 + } else if (bodyLength > 125) { + offset += 2 // payload length is next 2 bytes + payloadLength = 126 + } + const head = Buffer.allocUnsafeSlow(offset) + + head[0] = 0x80 /* FIN */ | opcodes.TEXT /* opcode TEXT */ + head[1] = payloadLength | 0x80 /* MASK */ + head[offset - 4] = maskKey[0] + head[offset - 3] = maskKey[1] + head[offset - 2] = maskKey[2] + head[offset - 1] = maskKey[3] + + if (payloadLength === 126) { + head.writeUInt16BE(bodyLength, 2) + } else if (payloadLength === 127) { + head[2] = head[3] = 0 + head.writeUIntBE(bodyLength, 4, 6) + } + + return [head, buffer] + } } module.exports = { diff --git a/deps/undici/src/lib/web/websocket/receiver.js b/deps/undici/src/lib/web/websocket/receiver.js index 581c251074c740..dac9122a40833b 100644 --- a/deps/undici/src/lib/web/websocket/receiver.js +++ b/deps/undici/src/lib/web/websocket/receiver.js @@ -3,7 +3,6 @@ const { Writable } = require('node:stream') const assert = require('node:assert') const { parserStates, opcodes, states, emptyBuffer, sentCloseFrameState } = require('./constants') -const { kReadyState, kSentClose, kResponse, kReceivedClose } = require('./symbols') const { channels } = require('../../core/diagnostics') const { isValidStatusCode, @@ -16,7 +15,6 @@ const { isContinuationFrame } = require('./util') const { WebsocketFrameSend } = require('./frame') -const { closeWebSocketConnection } = require('./connection') const { PerMessageDeflate } = require('./permessage-deflate') // This code was influenced by ws released under the MIT license. @@ -37,10 +35,13 @@ class ByteParser extends Writable { /** @type {Map} */ #extensions - constructor (ws, extensions) { + /** @type {import('./websocket').Handler} */ + #handler + + constructor (handler, extensions) { super() - this.ws = ws + this.#handler = handler this.#extensions = extensions == null ? new Map() : extensions if (this.#extensions.has('permessage-deflate')) { @@ -86,12 +87,12 @@ class ByteParser extends Writable { const rsv3 = buffer[0] & 0x10 if (!isValidOpcode(opcode)) { - failWebsocketConnection(this.ws, 'Invalid opcode received') + failWebsocketConnection(this.#handler, 1002, 'Invalid opcode received') return callback() } if (masked) { - failWebsocketConnection(this.ws, 'Frame cannot be masked') + failWebsocketConnection(this.#handler, 1002, 'Frame cannot be masked') return callback() } @@ -105,43 +106,43 @@ class ByteParser extends Writable { // WebSocket connection where a PMCE is in use, this bit indicates // whether a message is compressed or not. if (rsv1 !== 0 && !this.#extensions.has('permessage-deflate')) { - failWebsocketConnection(this.ws, 'Expected RSV1 to be clear.') + failWebsocketConnection(this.#handler, 1002, 'Expected RSV1 to be clear.') return } if (rsv2 !== 0 || rsv3 !== 0) { - failWebsocketConnection(this.ws, 'RSV1, RSV2, RSV3 must be clear') + failWebsocketConnection(this.#handler, 1002, 'RSV1, RSV2, RSV3 must be clear') return } if (fragmented && !isTextBinaryFrame(opcode)) { // Only text and binary frames can be fragmented - failWebsocketConnection(this.ws, 'Invalid frame type was fragmented.') + failWebsocketConnection(this.#handler, 1002, 'Invalid frame type was fragmented.') return } // If we are already parsing a text/binary frame and do not receive either // a continuation frame or close frame, fail the connection. if (isTextBinaryFrame(opcode) && this.#fragments.length > 0) { - failWebsocketConnection(this.ws, 'Expected continuation frame') + failWebsocketConnection(this.#handler, 1002, 'Expected continuation frame') return } if (this.#info.fragmented && fragmented) { // A fragmented frame can't be fragmented itself - failWebsocketConnection(this.ws, 'Fragmented frame exceeded 125 bytes.') + failWebsocketConnection(this.#handler, 1002, 'Fragmented frame exceeded 125 bytes.') return } // "All control frames MUST have a payload length of 125 bytes or less // and MUST NOT be fragmented." if ((payloadLength > 125 || fragmented) && isControlFrame(opcode)) { - failWebsocketConnection(this.ws, 'Control frame either too large or fragmented') + failWebsocketConnection(this.#handler, 1002, 'Control frame either too large or fragmented') return } if (isContinuationFrame(opcode) && this.#fragments.length === 0 && !this.#info.compressed) { - failWebsocketConnection(this.ws, 'Unexpected continuation frame') + failWebsocketConnection(this.#handler, 1002, 'Unexpected continuation frame') return } @@ -187,7 +188,7 @@ class ByteParser extends Writable { // https://source.chromium.org/chromium/chromium/src/+/main:v8/src/common/globals.h;drc=1946212ac0100668f14eb9e2843bdd846e510a1e;bpv=1;bpt=1;l=1275 // https://source.chromium.org/chromium/chromium/src/+/main:v8/src/objects/js-array-buffer.h;l=34;drc=1946212ac0100668f14eb9e2843bdd846e510a1e if (upper > 2 ** 31 - 1) { - failWebsocketConnection(this.ws, 'Received payload length > 2^31 bytes.') + failWebsocketConnection(this.#handler, 1009, 'Received payload length > 2^31 bytes.') return } @@ -215,7 +216,7 @@ class ByteParser extends Writable { // parsing continuation frames, not here. if (!this.#info.fragmented && this.#info.fin) { const fullMessage = Buffer.concat(this.#fragments) - websocketMessageReceived(this.ws, this.#info.binaryType, fullMessage) + websocketMessageReceived(this.#handler, this.#info.binaryType, fullMessage) this.#fragments.length = 0 } @@ -223,7 +224,7 @@ class ByteParser extends Writable { } else { this.#extensions.get('permessage-deflate').decompress(body, this.#info.fin, (error, data) => { if (error) { - closeWebSocketConnection(this.ws, 1007, error.message, error.message.length) + failWebsocketConnection(this.#handler, 1007, error.message) return } @@ -236,7 +237,7 @@ class ByteParser extends Writable { return } - websocketMessageReceived(this.ws, this.#info.binaryType, Buffer.concat(this.#fragments)) + websocketMessageReceived(this.#handler, this.#info.binaryType, Buffer.concat(this.#fragments)) this.#loop = true this.#state = parserStates.INFO @@ -339,7 +340,7 @@ class ByteParser extends Writable { if (opcode === opcodes.CLOSE) { if (payloadLength === 1) { - failWebsocketConnection(this.ws, 'Received close frame with a 1-byte body.') + failWebsocketConnection(this.#handler, 1002, 'Received close frame with a 1-byte body.') return false } @@ -348,12 +349,13 @@ class ByteParser extends Writable { if (this.#info.closeInfo.error) { const { code, reason } = this.#info.closeInfo - closeWebSocketConnection(this.ws, code, reason, reason.length) - failWebsocketConnection(this.ws, reason) + failWebsocketConnection(this.#handler, code, reason) return false } - if (this.ws[kSentClose] !== sentCloseFrameState.SENT) { + // Upon receiving such a frame, the other peer sends a + // Close frame in response, if it hasn't already sent one. + if (!this.#handler.closeState.has(sentCloseFrameState.SENT) && !this.#handler.closeState.has(sentCloseFrameState.RECEIVED)) { // If an endpoint receives a Close frame and did not previously send a // Close frame, the endpoint MUST send a Close frame in response. (When // sending a Close frame in response, the endpoint typically echos the @@ -365,21 +367,15 @@ class ByteParser extends Writable { } const closeFrame = new WebsocketFrameSend(body) - this.ws[kResponse].socket.write( - closeFrame.createFrame(opcodes.CLOSE), - (err) => { - if (!err) { - this.ws[kSentClose] = sentCloseFrameState.SENT - } - } - ) + this.#handler.socket.write(closeFrame.createFrame(opcodes.CLOSE)) + this.#handler.closeState.add(sentCloseFrameState.SENT) } // Upon either sending or receiving a Close control frame, it is said // that _The WebSocket Closing Handshake is Started_ and that the // WebSocket connection is in the CLOSING state. - this.ws[kReadyState] = states.CLOSING - this.ws[kReceivedClose] = true + this.#handler.readyState = states.CLOSING + this.#handler.closeState.add(sentCloseFrameState.RECEIVED) return false } else if (opcode === opcodes.PING) { @@ -388,10 +384,10 @@ class ByteParser extends Writable { // A Pong frame sent in response to a Ping frame must have identical // "Application data" - if (!this.ws[kReceivedClose]) { + if (!this.#handler.closeState.has(sentCloseFrameState.RECEIVED)) { const frame = new WebsocketFrameSend(body) - this.ws[kResponse].socket.write(frame.createFrame(opcodes.PONG)) + this.#handler.socket.write(frame.createFrame(opcodes.PONG)) if (channels.ping.hasSubscribers) { channels.ping.publish({ diff --git a/deps/undici/src/lib/web/websocket/sender.js b/deps/undici/src/lib/web/websocket/sender.js index 1b1468d4ab900e..c647bf629d7c1f 100644 --- a/deps/undici/src/lib/web/websocket/sender.js +++ b/deps/undici/src/lib/web/websocket/sender.js @@ -4,9 +4,6 @@ const { WebsocketFrameSend } = require('./frame') const { opcodes, sendHints } = require('./constants') const FixedQueue = require('../../dispatcher/fixed-queue') -/** @type {typeof Uint8Array} */ -const FastBuffer = Buffer[Symbol.species] - /** * @typedef {object} SendQueueNode * @property {Promise | null} promise @@ -34,16 +31,25 @@ class SendQueue { add (item, cb, hint) { if (hint !== sendHints.blob) { - const frame = createFrame(item, hint) if (!this.#running) { - // fast-path - this.#socket.write(frame, cb) + // TODO(@tsctx): support fast-path for string on running + if (hint === sendHints.text) { + // special fast-path for string + const { 0: head, 1: body } = WebsocketFrameSend.createFastTextFrame(item) + this.#socket.cork() + this.#socket.write(head) + this.#socket.write(body, cb) + this.#socket.uncork() + } else { + // direct writing + this.#socket.write(createFrame(item, hint), cb) + } } else { /** @type {SendQueueNode} */ const node = { promise: null, callback: cb, - frame + frame: createFrame(item, hint) } this.#queue.push(node) } @@ -86,18 +92,17 @@ class SendQueue { } function createFrame (data, hint) { - return new WebsocketFrameSend(toBuffer(data, hint)).createFrame(hint === sendHints.string ? opcodes.TEXT : opcodes.BINARY) + return new WebsocketFrameSend(toBuffer(data, hint)).createFrame(hint === sendHints.text ? opcodes.TEXT : opcodes.BINARY) } function toBuffer (data, hint) { switch (hint) { - case sendHints.string: - return Buffer.from(data) + case sendHints.text: + case sendHints.typedArray: + return new Uint8Array(data.buffer, data.byteOffset, data.byteLength) case sendHints.arrayBuffer: case sendHints.blob: - return new FastBuffer(data) - case sendHints.typedArray: - return new FastBuffer(data.buffer, data.byteOffset, data.byteLength) + return new Uint8Array(data) } } diff --git a/deps/undici/src/lib/web/websocket/stream/websocketerror.js b/deps/undici/src/lib/web/websocket/stream/websocketerror.js new file mode 100644 index 00000000000000..888af9871865c3 --- /dev/null +++ b/deps/undici/src/lib/web/websocket/stream/websocketerror.js @@ -0,0 +1,83 @@ +'use strict' + +const { webidl } = require('../../fetch/webidl') +const { validateCloseCodeAndReason } = require('../util') +const { kConstruct } = require('../../../core/symbols') +const { kEnumerableProperty } = require('../../../core/util') + +class WebSocketError extends DOMException { + #closeCode + #reason + + constructor (message = '', init = undefined) { + message = webidl.converters.DOMString(message, 'WebSocketError', 'message') + + // 1. Set this 's name to " WebSocketError ". + // 2. Set this 's message to message . + super(message, 'WebSocketError') + + if (init === kConstruct) { + return + } else if (init !== null) { + init = webidl.converters.WebSocketCloseInfo(init) + } + + // 3. Let code be init [" closeCode "] if it exists , or null otherwise. + let code = init.closeCode ?? null + + // 4. Let reason be init [" reason "] if it exists , or the empty string otherwise. + const reason = init.reason ?? '' + + // 5. Validate close code and reason with code and reason . + validateCloseCodeAndReason(code, reason) + + // 6. If reason is non-empty, but code is not set, then set code to 1000 ("Normal Closure"). + if (reason.length !== 0 && code === null) { + code = 1000 + } + + // 7. Set this 's closeCode to code . + this.#closeCode = code + + // 8. Set this 's reason to reason . + this.#reason = reason + } + + get closeCode () { + return this.#closeCode + } + + get reason () { + return this.#reason + } + + /** + * @param {string} message + * @param {number|null} code + * @param {string} reason + */ + static createUnvalidatedWebSocketError (message, code, reason) { + const error = new WebSocketError(message, kConstruct) + error.#closeCode = code + error.#reason = reason + return error + } +} + +const { createUnvalidatedWebSocketError } = WebSocketError +delete WebSocketError.createUnvalidatedWebSocketError + +Object.defineProperties(WebSocketError.prototype, { + closeCode: kEnumerableProperty, + reason: kEnumerableProperty, + [Symbol.toStringTag]: { + value: 'WebSocketError', + writable: false, + enumerable: false, + configurable: true + } +}) + +webidl.is.WebSocketError = webidl.util.MakeTypeAssertion(WebSocketError) + +module.exports = { WebSocketError, createUnvalidatedWebSocketError } diff --git a/deps/undici/src/lib/web/websocket/stream/websocketstream.js b/deps/undici/src/lib/web/websocket/stream/websocketstream.js new file mode 100644 index 00000000000000..71d63a5767a3e7 --- /dev/null +++ b/deps/undici/src/lib/web/websocket/stream/websocketstream.js @@ -0,0 +1,485 @@ +'use strict' + +const { createDeferredPromise, environmentSettingsObject } = require('../../fetch/util') +const { states, opcodes, sentCloseFrameState } = require('../constants') +const { webidl } = require('../../fetch/webidl') +const { getURLRecord, isValidSubprotocol, isEstablished, failWebsocketConnection, utf8Decode } = require('../util') +const { establishWebSocketConnection, closeWebSocketConnection } = require('../connection') +const { types } = require('node:util') +const { channels } = require('../../../core/diagnostics') +const { WebsocketFrameSend } = require('../frame') +const { ByteParser } = require('../receiver') +const { WebSocketError, createUnvalidatedWebSocketError } = require('./websocketerror') +const { utf8DecodeBytes } = require('../../fetch/util') +const { kEnumerableProperty } = require('../../../core/util') + +let emittedExperimentalWarning = false + +class WebSocketStream { + // Each WebSocketStream object has an associated url , which is a URL record . + /** @type {URL} */ + #url + + // Each WebSocketStream object has an associated opened promise , which is a promise. + /** @type {ReturnType} */ + #openedPromise + + // Each WebSocketStream object has an associated closed promise , which is a promise. + /** @type {ReturnType} */ + #closedPromise + + // Each WebSocketStream object has an associated readable stream , which is a ReadableStream . + /** @type {ReadableStream} */ + #readableStream + /** @type {ReadableStreamDefaultController} */ + #readableStreamController + + // Each WebSocketStream object has an associated writable stream , which is a WritableStream . + /** @type {WritableStream} */ + #writableStream + + // Each WebSocketStream object has an associated boolean handshake aborted , which is initially false. + #handshakeAborted = false + + /** @type {import('../websocket').Handler} */ + #handler = { + // https://whatpr.org/websockets/48/7b748d3...d5570f3.html#feedback-to-websocket-stream-from-the-protocol + onConnectionEstablished: (response, extensions) => this.#onConnectionEstablished(response, extensions), + onFail: (_code, _reason) => {}, + onMessage: (opcode, data) => this.#onMessage(opcode, data), + onParserError: (err) => failWebsocketConnection(this.#handler, null, err.message), + onParserDrain: () => this.#handler.socket.resume(), + onSocketData: (chunk) => { + if (!this.#parser.write(chunk)) { + this.#handler.socket.pause() + } + }, + onSocketError: (err) => { + this.#handler.readyState = states.CLOSING + + if (channels.socketError.hasSubscribers) { + channels.socketError.publish(err) + } + + this.#handler.socket.destroy() + }, + onSocketClose: () => this.#onSocketClose(), + + readyState: states.CONNECTING, + socket: null, + closeState: new Set(), + controller: null, + wasEverConnected: false + } + + /** @type {import('../receiver').ByteParser} */ + #parser + + constructor (url, options = undefined) { + if (!emittedExperimentalWarning) { + process.emitWarning('WebSocketStream is experimental! Expect it to change at any time.', { + code: 'UNDICI-WSS' + }) + emittedExperimentalWarning = true + } + + webidl.argumentLengthCheck(arguments, 1, 'WebSocket') + + url = webidl.converters.USVString(url) + if (options !== null) { + options = webidl.converters.WebSocketStreamOptions(options) + } + + // 1. Let baseURL be this 's relevant settings object 's API base URL . + const baseURL = environmentSettingsObject.settingsObject.baseUrl + + // 2. Let urlRecord be the result of getting a URL record given url and baseURL . + const urlRecord = getURLRecord(url, baseURL) + + // 3. Let protocols be options [" protocols "] if it exists , otherwise an empty sequence. + const protocols = options.protocols + + // 4. If any of the values in protocols occur more than once or otherwise fail to match the requirements for elements that comprise the value of ` Sec-WebSocket-Protocol ` fields as defined by The WebSocket Protocol , then throw a " SyntaxError " DOMException . [WSP] + if (protocols.length !== new Set(protocols.map(p => p.toLowerCase())).size) { + throw new DOMException('Invalid Sec-WebSocket-Protocol value', 'SyntaxError') + } + + if (protocols.length > 0 && !protocols.every(p => isValidSubprotocol(p))) { + throw new DOMException('Invalid Sec-WebSocket-Protocol value', 'SyntaxError') + } + + // 5. Set this 's url to urlRecord . + this.#url = urlRecord.toString() + + // 6. Set this 's opened promise and closed promise to new promises. + this.#openedPromise = createDeferredPromise() + this.#closedPromise = createDeferredPromise() + + // 7. Apply backpressure to the WebSocket. + // TODO + + // 8. If options [" signal "] exists , + if (options.signal != null) { + // 8.1. Let signal be options [" signal "]. + const signal = options.signal + + // 8.2. If signal is aborted , then reject this 's opened promise and closed promise with signal ’s abort reason + // and return. + if (signal.aborted) { + this.#openedPromise.reject(signal.reason) + this.#closedPromise.reject(signal.reason) + return + } + + // 8.3. Add the following abort steps to signal : + signal.addEventListener('abort', () => { + // 8.3.1. If the WebSocket connection is not yet established : [WSP] + if (!isEstablished(this.#handler.readyState)) { + // 8.3.1.1. Fail the WebSocket connection . + failWebsocketConnection(this.#handler) + + // Set this 's ready state to CLOSING . + this.#handler.readyState = states.CLOSING + + // Reject this 's opened promise and closed promise with signal ’s abort reason . + this.#openedPromise.reject(signal.reason) + this.#closedPromise.reject(signal.reason) + + // Set this 's handshake aborted to true. + this.#handshakeAborted = true + } + }, { once: true }) + } + + // 9. Let client be this 's relevant settings object . + const client = environmentSettingsObject.settingsObject + + // 10. Run this step in parallel : + // 10.1. Establish a WebSocket connection given urlRecord , protocols , and client . [FETCH] + this.#handler.controller = establishWebSocketConnection( + urlRecord, + protocols, + client, + this.#handler, + options + ) + } + + // The url getter steps are to return this 's url , serialized . + get url () { + return this.#url.toString() + } + + // The opened getter steps are to return this 's opened promise . + get opened () { + return this.#openedPromise.promise + } + + // The closed getter steps are to return this 's closed promise . + get closed () { + return this.#closedPromise.promise + } + + // The close( closeInfo ) method steps are: + close (closeInfo = undefined) { + if (closeInfo !== null) { + closeInfo = webidl.converters.WebSocketCloseInfo(closeInfo) + } + + // 1. Let code be closeInfo [" closeCode "] if present, or null otherwise. + const code = closeInfo.closeCode ?? null + + // 2. Let reason be closeInfo [" reason "]. + const reason = closeInfo.reason + + // 3. Close the WebSocket with this , code , and reason . + closeWebSocketConnection(this.#handler, code, reason, true) + } + + #write (chunk) { + // 1. Let promise be a new promise created in stream ’s relevant realm . + const promise = createDeferredPromise() + + // 2. Let data be null. + let data = null + + // 3. Let opcode be null. + let opcode = null + + // 4. If chunk is a BufferSource , + if (ArrayBuffer.isView(chunk) || types.isArrayBuffer(chunk)) { + // 4.1. Set data to a copy of the bytes given chunk . + data = new Uint8Array(ArrayBuffer.isView(chunk) ? new Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength) : chunk) + + // 4.2. Set opcode to a binary frame opcode. + opcode = opcodes.BINARY + } else { + // 5. Otherwise, + + // 5.1. Let string be the result of converting chunk to an IDL USVString . + // If this throws an exception, return a promise rejected with the exception. + let string + + try { + string = webidl.converters.DOMString(chunk) + } catch (e) { + promise.reject(e) + return + } + + // 5.2. Set data to the result of UTF-8 encoding string . + data = new TextEncoder().encode(string) + + // 5.3. Set opcode to a text frame opcode. + opcode = opcodes.TEXT + } + + // 6. In parallel, + // 6.1. Wait until there is sufficient buffer space in stream to send the message. + + // 6.2. If the closing handshake has not yet started , Send a WebSocket Message to stream comprised of data using opcode . + if (!this.#handler.closeState.has(sentCloseFrameState.SENT) && !this.#handler.closeState.has(sentCloseFrameState.RECEIVED)) { + const frame = new WebsocketFrameSend(data) + + this.#handler.socket.write(frame.createFrame(opcode), () => { + promise.resolve(undefined) + }) + } + + // 6.3. Queue a global task on the WebSocket task source given stream ’s relevant global object to resolve promise with undefined. + return promise + } + + /** @type {import('../websocket').Handler['onConnectionEstablished']} */ + #onConnectionEstablished (response, parsedExtensions) { + this.#handler.socket = response.socket + + const parser = new ByteParser(this.#handler, parsedExtensions) + parser.on('drain', () => this.#handler.onParserDrain()) + parser.on('error', (err) => this.#handler.onParserError(err)) + + this.#parser = parser + + // 1. Change stream ’s ready state to OPEN (1). + this.#handler.readyState = states.OPEN + + // 2. Set stream ’s was ever connected to true. + // This is done in the opening handshake. + + // 3. Let extensions be the extensions in use . + const extensions = parsedExtensions ?? '' + + // 4. Let protocol be the subprotocol in use . + const protocol = response.headersList.get('sec-websocket-protocol') ?? '' + + // 5. Let pullAlgorithm be an action that pulls bytes from stream . + // 6. Let cancelAlgorithm be an action that cancels stream with reason , given reason . + // 7. Let readable be a new ReadableStream . + // 8. Set up readable with pullAlgorithm and cancelAlgorithm . + const readable = new ReadableStream({ + start: (controller) => { + this.#readableStreamController = controller + }, + pull (controller) { + let chunk + while (controller.desiredSize > 0 && (chunk = response.socket.read()) !== null) { + controller.enqueue(chunk) + } + }, + cancel: (reason) => this.#cancel(reason) + }) + + // 9. Let writeAlgorithm be an action that writes chunk to stream , given chunk . + // 10. Let closeAlgorithm be an action that closes stream . + // 11. Let abortAlgorithm be an action that aborts stream with reason , given reason . + // 12. Let writable be a new WritableStream . + // 13. Set up writable with writeAlgorithm , closeAlgorithm , and abortAlgorithm . + const writable = new WritableStream({ + write: (chunk) => this.#write(chunk), + close: () => closeWebSocketConnection(this.#handler, null, null), + abort: (reason) => this.#closeUsingReason(reason) + }) + + // Set stream ’s readable stream to readable . + this.#readableStream = readable + + // Set stream ’s writable stream to writable . + this.#writableStream = writable + + // Resolve stream ’s opened promise with WebSocketOpenInfo «[ " extensions " → extensions , " protocol " → protocol , " readable " → readable , " writable " → writable ]». + this.#openedPromise.resolve({ + extensions, + protocol, + readable, + writable + }) + } + + /** @type {import('../websocket').Handler['onMessage']} */ + #onMessage (type, data) { + // 1. If stream’s ready state is not OPEN (1), then return. + if (this.#handler.readyState !== states.OPEN) { + return + } + + // 2. Let chunk be determined by switching on type: + // - type indicates that the data is Text + // a new DOMString containing data + // - type indicates that the data is Binary + // a new Uint8Array object, created in the relevant Realm of the + // WebSocketStream object, whose contents are data + let chunk + + if (type === opcodes.TEXT) { + try { + chunk = utf8Decode(data) + } catch { + failWebsocketConnection(this.#handler, 'Received invalid UTF-8 in text frame.') + return + } + } else if (type === opcodes.BINARY) { + chunk = new Uint8Array(data.buffer, data.byteOffset, data.byteLength) + } + + // 3. Enqueue chunk into stream’s readable stream. + this.#readableStreamController.enqueue(chunk) + + // 4. Apply backpressure to the WebSocket. + } + + /** @type {import('../websocket').Handler['onSocketClose']} */ + #onSocketClose () { + const wasClean = + this.#handler.closeState.has(sentCloseFrameState.SENT) && + this.#handler.closeState.has(sentCloseFrameState.RECEIVED) + + // 1. Change the ready state to CLOSED (3). + this.#handler.readyState = states.CLOSED + + // 2. If stream ’s handshake aborted is true, then return. + if (this.#handshakeAborted) { + return + } + + // 3. If stream ’s was ever connected is false, then reject stream ’s opened promise with a new WebSocketError. + if (!this.#handler.wasEverConnected) { + this.#openedPromise.reject(new WebSocketError('Socket never opened')) + } + + const result = this.#parser.closingInfo + + // 4. Let code be the WebSocket connection close code . + // https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.5 + // If this Close control frame contains no status code, _The WebSocket + // Connection Close Code_ is considered to be 1005. If _The WebSocket + // Connection is Closed_ and no Close control frame was received by the + // endpoint (such as could occur if the underlying transport connection + // is lost), _The WebSocket Connection Close Code_ is considered to be + // 1006. + let code = result?.code ?? 1005 + + if (!this.#handler.closeState.has(sentCloseFrameState.SENT) && !this.#handler.closeState.has(sentCloseFrameState.RECEIVED)) { + code = 1006 + } + + // 5. Let reason be the result of applying UTF-8 decode without BOM to the WebSocket connection close reason . + const reason = result?.reason == null ? '' : utf8DecodeBytes(Buffer.from(result.reason)) + + // 6. If the connection was closed cleanly , + if (wasClean) { + // 6.1. Close stream ’s readable stream . + this.#readableStream.cancel().catch(() => {}) + + // 6.2. Error stream ’s writable stream with an " InvalidStateError " DOMException indicating that a closed WebSocketStream cannot be written to. + if (!this.#writableStream.locked) { + this.#writableStream.abort(new DOMException('A closed WebSocketStream cannot be written to', 'InvalidStateError')) + } + + // 6.3. Resolve stream ’s closed promise with WebSocketCloseInfo «[ " closeCode " → code , " reason " → reason ]». + this.#closedPromise.resolve({ + closeCode: code, + reason + }) + } else { + // 7. Otherwise, + + // 7.1. Let error be a new WebSocketError whose closeCode is code and reason is reason . + const error = createUnvalidatedWebSocketError('unclean close', code, reason) + + // 7.2. Error stream ’s readable stream with error . + this.#readableStreamController.error(error) + + // 7.3. Error stream ’s writable stream with error . + this.#writableStream.abort(error) + + // 7.4. Reject stream ’s closed promise with error . + this.#closedPromise.reject(error) + } + } + + #closeUsingReason (reason) { + // 1. Let code be null. + let code = null + + // 2. Let reasonString be the empty string. + let reasonString = '' + + // 3. If reason implements WebSocketError , + if (webidl.is.WebSocketError(reason)) { + // 3.1. Set code to reason ’s closeCode . + code = reason.closeCode + + // 3.2. Set reasonString to reason ’s reason . + reasonString = reason.reason + } + + // 4. Close the WebSocket with stream , code , and reasonString . If this throws an exception, + // discard code and reasonString and close the WebSocket with stream . + closeWebSocketConnection(this.#handler, code, reasonString) + } + + // To cancel a WebSocketStream stream given reason , close using reason giving stream and reason . + #cancel (reason) { + this.#closeUsingReason(reason) + } +} + +Object.defineProperties(WebSocketStream.prototype, { + url: kEnumerableProperty, + opened: kEnumerableProperty, + closed: kEnumerableProperty, + close: kEnumerableProperty, + [Symbol.toStringTag]: { + value: 'WebSocketStream', + writable: false, + enumerable: false, + configurable: true + } +}) + +webidl.converters.WebSocketStreamOptions = webidl.dictionaryConverter([ + { + key: 'protocols', + converter: webidl.sequenceConverter(webidl.converters.USVString), + defaultValue: () => [] + }, + { + key: 'signal', + converter: webidl.nullableConverter(webidl.converters.AbortSignal), + defaultValue: () => null + } +]) + +webidl.converters.WebSocketCloseInfo = webidl.dictionaryConverter([ + { + key: 'closeCode', + converter: (V) => webidl.converters['unsigned short'](V, { enforceRange: true }) + }, + { + key: 'reason', + converter: webidl.converters.USVString, + defaultValue: () => '' + } +]) + +module.exports = { WebSocketStream } diff --git a/deps/undici/src/lib/web/websocket/symbols.js b/deps/undici/src/lib/web/websocket/symbols.js deleted file mode 100644 index 11d03e38a86609..00000000000000 --- a/deps/undici/src/lib/web/websocket/symbols.js +++ /dev/null @@ -1,12 +0,0 @@ -'use strict' - -module.exports = { - kWebSocketURL: Symbol('url'), - kReadyState: Symbol('ready state'), - kController: Symbol('controller'), - kResponse: Symbol('response'), - kBinaryType: Symbol('binary type'), - kSentClose: Symbol('sent close'), - kReceivedClose: Symbol('received close'), - kByteParser: Symbol('byte parser') -} diff --git a/deps/undici/src/lib/web/websocket/util.js b/deps/undici/src/lib/web/websocket/util.js index e5ce7899752511..e544ac7681936c 100644 --- a/deps/undici/src/lib/web/websocket/util.js +++ b/deps/undici/src/lib/web/websocket/util.js @@ -1,51 +1,47 @@ 'use strict' -const { kReadyState, kController, kResponse, kBinaryType, kWebSocketURL } = require('./symbols') const { states, opcodes } = require('./constants') -const { ErrorEvent, createFastMessageEvent } = require('./events') const { isUtf8 } = require('node:buffer') const { collectASequenceOfCodePointsFast, removeHTTPWhitespace } = require('../fetch/data-url') -/* globals Blob */ - /** - * @param {import('./websocket').WebSocket} ws + * @param {number} readyState * @returns {boolean} */ -function isConnecting (ws) { +function isConnecting (readyState) { // If the WebSocket connection is not yet established, and the connection // is not yet closed, then the WebSocket connection is in the CONNECTING state. - return ws[kReadyState] === states.CONNECTING + return readyState === states.CONNECTING } /** - * @param {import('./websocket').WebSocket} ws + * @param {number} readyState * @returns {boolean} */ -function isEstablished (ws) { +function isEstablished (readyState) { // If the server's response is validated as provided for above, it is // said that _The WebSocket Connection is Established_ and that the // WebSocket Connection is in the OPEN state. - return ws[kReadyState] === states.OPEN + return readyState === states.OPEN } /** - * @param {import('./websocket').WebSocket} ws + * @param {number} readyState * @returns {boolean} */ -function isClosing (ws) { +function isClosing (readyState) { // Upon either sending or receiving a Close control frame, it is said // that _The WebSocket Closing Handshake is Started_ and that the // WebSocket connection is in the CLOSING state. - return ws[kReadyState] === states.CLOSING + return readyState === states.CLOSING } /** - * @param {import('./websocket').WebSocket} ws + * @param {number} readyState * @returns {boolean} */ -function isClosed (ws) { - return ws[kReadyState] === states.CLOSED +function isClosed (readyState) { + return readyState === states.CLOSED } /** @@ -54,6 +50,7 @@ function isClosed (ws) { * @param {EventTarget} target * @param {(...args: ConstructorParameters) => Event} eventFactory * @param {EventInit | undefined} eventInitDict + * @returns {void} */ function fireEvent (e, target, eventFactory = (type, init) => new Event(type, init), eventInitDict = {}) { // 1. If eventConstructor is not given, then let eventConstructor be Event. @@ -73,51 +70,19 @@ function fireEvent (e, target, eventFactory = (type, init) => new Event(type, in /** * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol - * @param {import('./websocket').WebSocket} ws + * @param {import('./websocket').Handler} handler * @param {number} type Opcode * @param {Buffer} data application data + * @returns {void} */ -function websocketMessageReceived (ws, type, data) { - // 1. If ready state is not OPEN (1), then return. - if (ws[kReadyState] !== states.OPEN) { - return - } - - // 2. Let dataForEvent be determined by switching on type and binary type: - let dataForEvent - - if (type === opcodes.TEXT) { - // -> type indicates that the data is Text - // a new DOMString containing data - try { - dataForEvent = utf8Decode(data) - } catch { - failWebsocketConnection(ws, 'Received invalid UTF-8 in text frame.') - return - } - } else if (type === opcodes.BINARY) { - if (ws[kBinaryType] === 'blob') { - // -> type indicates that the data is Binary and binary type is "blob" - // a new Blob object, created in the relevant Realm of the WebSocket - // object, that represents data as its raw data - dataForEvent = new Blob([data]) - } else { - // -> type indicates that the data is Binary and binary type is "arraybuffer" - // a new ArrayBuffer object, created in the relevant Realm of the - // WebSocket object, whose contents are data - dataForEvent = toArrayBuffer(data) - } - } - - // 3. Fire an event named message at the WebSocket object, using MessageEvent, - // with the origin attribute initialized to the serialization of the WebSocket - // object’s url's origin, and the data attribute initialized to dataForEvent. - fireEvent('message', ws, createFastMessageEvent, { - origin: ws[kWebSocketURL].origin, - data: dataForEvent - }) +function websocketMessageReceived (handler, type, data) { + handler.onMessage(type, data) } +/** + * @param {Buffer} buffer + * @returns {ArrayBuffer} + */ function toArrayBuffer (buffer) { if (buffer.byteLength === buffer.buffer.byteLength) { return buffer.buffer @@ -130,6 +95,7 @@ function toArrayBuffer (buffer) { * @see https://datatracker.ietf.org/doc/html/rfc2616 * @see https://bugs.chromium.org/p/chromium/issues/detail?id=398407 * @param {string} protocol + * @returns {boolean} */ function isValidSubprotocol (protocol) { // If present, this value indicates one @@ -176,6 +142,7 @@ function isValidSubprotocol (protocol) { /** * @see https://datatracker.ietf.org/doc/html/rfc6455#section-7-4 * @param {number} code + * @returns {boolean} */ function isValidStatusCode (code) { if (code >= 1000 && code < 1015) { @@ -190,30 +157,35 @@ function isValidStatusCode (code) { } /** - * @param {import('./websocket').WebSocket} ws + * @param {import('./websocket').Handler} handler + * @param {number} code * @param {string|undefined} reason + * @returns {void} */ -function failWebsocketConnection (ws, reason) { - const { [kController]: controller, [kResponse]: response } = ws +function failWebsocketConnection (handler, code, reason) { + // If _The WebSocket Connection is Established_ prior to the point where + // the endpoint is required to _Fail the WebSocket Connection_, the + // endpoint SHOULD send a Close frame with an appropriate status code + // (Section 7.4) before proceeding to _Close the WebSocket Connection_. + if (isEstablished(handler.readyState)) { + // avoid circular require - performance is not important here + const { closeWebSocketConnection } = require('./connection') + closeWebSocketConnection(handler, code, reason, false) + } - controller.abort() + handler.controller.abort() - if (response?.socket && !response.socket.destroyed) { - response.socket.destroy() + if (handler.socket?.destroyed === false) { + handler.socket.destroy() } - if (reason) { - // TODO: process.nextTick - fireEvent('error', ws, (type, init) => new ErrorEvent(type, init), { - error: new Error(reason), - message: reason - }) - } + handler.onFail(code, reason) } /** * @see https://datatracker.ietf.org/doc/html/rfc6455#section-5.5 * @param {number} opcode + * @returns {boolean} */ function isControlFrame (opcode) { return ( @@ -223,14 +195,27 @@ function isControlFrame (opcode) { ) } +/** + * @param {number} opcode + * @returns {boolean} + */ function isContinuationFrame (opcode) { return opcode === opcodes.CONTINUATION } +/** + * @param {number} opcode + * @returns {boolean} + */ function isTextBinaryFrame (opcode) { return opcode === opcodes.TEXT || opcode === opcodes.BINARY } +/** + * + * @param {number} opcode + * @returns {boolean} + */ function isValidOpcode (opcode) { return isTextBinaryFrame(opcode) || isContinuationFrame(opcode) || isControlFrame(opcode) } @@ -264,6 +249,7 @@ function parseExtensions (extensions) { * @see https://www.rfc-editor.org/rfc/rfc7692#section-7.1.2.2 * @description "client-max-window-bits = 1*DIGIT" * @param {string} value + * @returns {boolean} */ function isValidClientWindowBits (value) { for (let i = 0; i < value.length; i++) { @@ -277,22 +263,84 @@ function isValidClientWindowBits (value) { return true } -// https://nodejs.org/api/intl.html#detecting-internationalization-support -const hasIntl = typeof process.versions.icu === 'string' -const fatalDecoder = hasIntl ? new TextDecoder('utf-8', { fatal: true }) : undefined +/** + * @see https://whatpr.org/websockets/48/7b748d3...d5570f3.html#get-a-url-record + * @param {string} url + * @param {string} [baseURL] + */ +function getURLRecord (url, baseURL) { + // 1. Let urlRecord be the result of applying the URL parser to url with baseURL . + // 2. If urlRecord is failure, then throw a " SyntaxError " DOMException . + let urlRecord + + try { + urlRecord = new URL(url, baseURL) + } catch (e) { + throw new DOMException(e, 'SyntaxError') + } + + // 3. If urlRecord ’s scheme is " http ", then set urlRecord ’s scheme to " ws ". + // 4. Otherwise, if urlRecord ’s scheme is " https ", set urlRecord ’s scheme to " wss ". + if (urlRecord.protocol === 'http:') { + urlRecord.protocol = 'ws:' + } else if (urlRecord.protocol === 'https:') { + urlRecord.protocol = 'wss:' + } + + // 5. If urlRecord ’s scheme is not " ws " or " wss ", then throw a " SyntaxError " DOMException . + if (urlRecord.protocol !== 'ws:' && urlRecord.protocol !== 'wss:') { + throw new DOMException('expected a ws: or wss: url', 'SyntaxError') + } + + // If urlRecord ’s fragment is non-null, then throw a " SyntaxError " DOMException . + if (urlRecord.hash.length || urlRecord.href.endsWith('#')) { + throw new DOMException('hash', 'SyntaxError') + } + + // Return urlRecord . + return urlRecord +} + +// https://whatpr.org/websockets/48.html#validate-close-code-and-reason +function validateCloseCodeAndReason (code, reason) { + // 1. If code is not null, but is neither an integer equal to + // 1000 nor an integer in the range 3000 to 4999, inclusive, + // throw an "InvalidAccessError" DOMException. + if (code !== null) { + if (code !== 1000 && (code < 3000 || code > 4999)) { + throw new DOMException('invalid code', 'InvalidAccessError') + } + } + + // 2. If reason is not null, then: + if (reason !== null) { + // 2.1. Let reasonBytes be the result of UTF-8 encoding reason. + // 2.2. If reasonBytes is longer than 123 bytes, then throw a + // "SyntaxError" DOMException. + const reasonBytesLength = Buffer.byteLength(reason) + + if (reasonBytesLength > 123) { + throw new DOMException(`Reason must be less than 123 bytes; received ${reasonBytesLength}`, 'SyntaxError') + } + } +} /** * Converts a Buffer to utf-8, even on platforms without icu. - * @param {Buffer} buffer + * @type {(buffer: Buffer) => string} */ -const utf8Decode = hasIntl - ? fatalDecoder.decode.bind(fatalDecoder) - : function (buffer) { +const utf8Decode = (() => { + if (typeof process.versions.icu === 'string') { + const fatalDecoder = new TextDecoder('utf-8', { fatal: true }) + return fatalDecoder.decode.bind(fatalDecoder) + } + return function (buffer) { if (isUtf8(buffer)) { return buffer.toString('utf-8') } throw new TypeError('Invalid utf-8 received.') } +})() module.exports = { isConnecting, @@ -310,5 +358,8 @@ module.exports = { isTextBinaryFrame, isValidOpcode, parseExtensions, - isValidClientWindowBits + isValidClientWindowBits, + toArrayBuffer, + getURLRecord, + validateCloseCodeAndReason } diff --git a/deps/undici/src/lib/web/websocket/websocket.js b/deps/undici/src/lib/web/websocket/websocket.js index e40530247566d8..63bf67c6f8e349 100644 --- a/deps/undici/src/lib/web/websocket/websocket.js +++ b/deps/undici/src/lib/web/websocket/websocket.js @@ -3,30 +3,44 @@ const { webidl } = require('../fetch/webidl') const { URLSerializer } = require('../fetch/data-url') const { environmentSettingsObject } = require('../fetch/util') -const { staticPropertyDescriptors, states, sentCloseFrameState, sendHints } = require('./constants') -const { - kWebSocketURL, - kReadyState, - kController, - kBinaryType, - kResponse, - kSentClose, - kByteParser -} = require('./symbols') +const { staticPropertyDescriptors, states, sentCloseFrameState, sendHints, opcodes } = require('./constants') const { isConnecting, isEstablished, isClosing, isValidSubprotocol, - fireEvent + fireEvent, + failWebsocketConnection, + utf8Decode, + toArrayBuffer, + getURLRecord } = require('./util') const { establishWebSocketConnection, closeWebSocketConnection } = require('./connection') const { ByteParser } = require('./receiver') -const { kEnumerableProperty, isBlobLike } = require('../../core/util') +const { kEnumerableProperty } = require('../../core/util') const { getGlobalDispatcher } = require('../../global') const { types } = require('node:util') -const { ErrorEvent, CloseEvent } = require('./events') +const { ErrorEvent, CloseEvent, createFastMessageEvent } = require('./events') const { SendQueue } = require('./sender') +const { channels } = require('../../core/diagnostics') + +/** + * @typedef {object} Handler + * @property {(response: any, extensions?: string[]) => void} onConnectionEstablished + * @property {(code: number, reason: any) => void} onFail + * @property {(opcode: number, data: Buffer) => void} onMessage + * @property {(error: Error) => void} onParserError + * @property {() => void} onParserDrain + * @property {(chunk: Buffer) => void} onSocketData + * @property {(err: Error) => void} onSocketError + * @property {() => void} onSocketClose + * + * @property {number} readyState + * @property {import('stream').Duplex} socket + * @property {Set} closeState + * @property {import('../fetch/index').Fetch} controller + * @property {boolean} [wasEverConnected=false] + */ // https://websockets.spec.whatwg.org/#interface-definition class WebSocket extends EventTarget { @@ -44,6 +58,41 @@ class WebSocket extends EventTarget { /** @type {SendQueue} */ #sendQueue + /** @type {Handler} */ + #handler = { + onConnectionEstablished: (response, extensions) => this.#onConnectionEstablished(response, extensions), + onFail: (code, reason) => this.#onFail(code, reason), + onMessage: (opcode, data) => this.#onMessage(opcode, data), + onParserError: (err) => failWebsocketConnection(this.#handler, null, err.message), + onParserDrain: () => this.#onParserDrain(), + onSocketData: (chunk) => { + if (!this.#parser.write(chunk)) { + this.#handler.socket.pause() + } + }, + onSocketError: (err) => { + this.#handler.readyState = states.CLOSING + + if (channels.socketError.hasSubscribers) { + channels.socketError.publish(err) + } + + this.#handler.socket.destroy() + }, + onSocketClose: () => this.#onSocketClose(), + + readyState: states.CONNECTING, + socket: null, + closeState: new Set(), + controller: null, + wasEverConnected: false + } + + #url + #binaryType + /** @type {import('./receiver').ByteParser} */ + #parser + /** * @param {string} url * @param {string|string[]} protocols @@ -58,51 +107,22 @@ class WebSocket extends EventTarget { const options = webidl.converters['DOMString or sequence or WebSocketInit'](protocols, prefix, 'options') - url = webidl.converters.USVString(url, prefix, 'url') + url = webidl.converters.USVString(url) protocols = options.protocols // 1. Let baseURL be this's relevant settings object's API base URL. const baseURL = environmentSettingsObject.settingsObject.baseUrl - // 1. Let urlRecord be the result of applying the URL parser to url with baseURL. - let urlRecord - - try { - urlRecord = new URL(url, baseURL) - } catch (e) { - // 3. If urlRecord is failure, then throw a "SyntaxError" DOMException. - throw new DOMException(e, 'SyntaxError') - } - - // 4. If urlRecord’s scheme is "http", then set urlRecord’s scheme to "ws". - if (urlRecord.protocol === 'http:') { - urlRecord.protocol = 'ws:' - } else if (urlRecord.protocol === 'https:') { - // 5. Otherwise, if urlRecord’s scheme is "https", set urlRecord’s scheme to "wss". - urlRecord.protocol = 'wss:' - } - - // 6. If urlRecord’s scheme is not "ws" or "wss", then throw a "SyntaxError" DOMException. - if (urlRecord.protocol !== 'ws:' && urlRecord.protocol !== 'wss:') { - throw new DOMException( - `Expected a ws: or wss: protocol, got ${urlRecord.protocol}`, - 'SyntaxError' - ) - } + // 2. Let urlRecord be the result of getting a URL record given url and baseURL. + const urlRecord = getURLRecord(url, baseURL) - // 7. If urlRecord’s fragment is non-null, then throw a "SyntaxError" - // DOMException. - if (urlRecord.hash || urlRecord.href.endsWith('#')) { - throw new DOMException('Got fragment', 'SyntaxError') - } - - // 8. If protocols is a string, set protocols to a sequence consisting + // 3. If protocols is a string, set protocols to a sequence consisting // of just that string. if (typeof protocols === 'string') { protocols = [protocols] } - // 9. If any of the values in protocols occur more than once or otherwise + // 4. If any of the values in protocols occur more than once or otherwise // fail to match the requirements for elements that comprise the value // of `Sec-WebSocket-Protocol` fields as defined by The WebSocket // protocol, then throw a "SyntaxError" DOMException. @@ -114,31 +134,27 @@ class WebSocket extends EventTarget { throw new DOMException('Invalid Sec-WebSocket-Protocol value', 'SyntaxError') } - // 10. Set this's url to urlRecord. - this[kWebSocketURL] = new URL(urlRecord.href) + // 5. Set this's url to urlRecord. + this.#url = new URL(urlRecord.href) - // 11. Let client be this's relevant settings object. + // 6. Let client be this's relevant settings object. const client = environmentSettingsObject.settingsObject - // 12. Run this step in parallel: - - // 1. Establish a WebSocket connection given urlRecord, protocols, - // and client. - this[kController] = establishWebSocketConnection( + // 7. Run this step in parallel: + // 7.1. Establish a WebSocket connection given urlRecord, protocols, + // and client. + this.#handler.controller = establishWebSocketConnection( urlRecord, protocols, client, - this, - (response, extensions) => this.#onConnectionEstablished(response, extensions), + this.#handler, options ) // Each WebSocket object has an associated ready state, which is a // number representing the state of the connection. Initially it must // be CONNECTING (0). - this[kReadyState] = WebSocket.CONNECTING - - this[kSentClose] = sentCloseFrameState.NOT_SENT + this.#handler.readyState = WebSocket.CONNECTING // The extensions attribute must initially return the empty string. @@ -146,7 +162,7 @@ class WebSocket extends EventTarget { // Each WebSocket object has an associated binary type, which is a // BinaryType. Initially it must be "blob". - this[kBinaryType] = 'blob' + this.#binaryType = 'blob' } /** @@ -164,37 +180,17 @@ class WebSocket extends EventTarget { } if (reason !== undefined) { - reason = webidl.converters.USVString(reason, prefix, 'reason') + reason = webidl.converters.USVString(reason) } - // 1. If code is present, but is neither an integer equal to 1000 nor an - // integer in the range 3000 to 4999, inclusive, throw an - // "InvalidAccessError" DOMException. - if (code !== undefined) { - if (code !== 1000 && (code < 3000 || code > 4999)) { - throw new DOMException('invalid code', 'InvalidAccessError') - } - } + // 1. If code is the special value "missing", then set code to null. + code ??= null - let reasonByteLength = 0 + // 2. If reason is the special value "missing", then set reason to the empty string. + reason ??= '' - // 2. If reason is present, then run these substeps: - if (reason !== undefined) { - // 1. Let reasonBytes be the result of encoding reason. - // 2. If reasonBytes is longer than 123 bytes, then throw a - // "SyntaxError" DOMException. - reasonByteLength = Buffer.byteLength(reason) - - if (reasonByteLength > 123) { - throw new DOMException( - `Reason must be less than 123 bytes; received ${reasonByteLength}`, - 'SyntaxError' - ) - } - } - - // 3. Run the first matching steps from the following list: - closeWebSocketConnection(this, code, reason, reasonByteLength) + // 3. Close the WebSocket with this, code, and reason. + closeWebSocketConnection(this.#handler, code, reason, true) } /** @@ -211,7 +207,7 @@ class WebSocket extends EventTarget { // 1. If this's ready state is CONNECTING, then throw an // "InvalidStateError" DOMException. - if (isConnecting(this)) { + if (isConnecting(this.#handler.readyState)) { throw new DOMException('Sent before connected.', 'InvalidStateError') } @@ -219,7 +215,7 @@ class WebSocket extends EventTarget { // https://datatracker.ietf.org/doc/html/rfc6455#section-6.1 // https://datatracker.ietf.org/doc/html/rfc6455#section-5.2 - if (!isEstablished(this) || isClosing(this)) { + if (!isEstablished(this.#handler.readyState) || isClosing(this.#handler.readyState)) { return } @@ -236,12 +232,12 @@ class WebSocket extends EventTarget { // the bufferedAmount attribute by the number of bytes needed to // express the argument as UTF-8. - const length = Buffer.byteLength(data) + const buffer = Buffer.from(data) - this.#bufferedAmount += length - this.#sendQueue.add(data, () => { - this.#bufferedAmount -= length - }, sendHints.string) + this.#bufferedAmount += buffer.byteLength + this.#sendQueue.add(buffer, () => { + this.#bufferedAmount -= buffer.byteLength + }, sendHints.text) } else if (types.isArrayBuffer(data)) { // If the WebSocket connection is established, and the WebSocket // closing handshake has not yet started, then the user agent must @@ -276,7 +272,7 @@ class WebSocket extends EventTarget { this.#sendQueue.add(data, () => { this.#bufferedAmount -= data.byteLength }, sendHints.typedArray) - } else if (isBlobLike(data)) { + } else if (webidl.is.Blob(data)) { // If the WebSocket connection is established, and the WebSocket // closing handshake has not yet started, then the user agent must // send a WebSocket Message comprised of data using a binary frame @@ -299,7 +295,7 @@ class WebSocket extends EventTarget { webidl.brandCheck(this, WebSocket) // The readyState getter steps are to return this's ready state. - return this[kReadyState] + return this.#handler.readyState } get bufferedAmount () { @@ -312,7 +308,7 @@ class WebSocket extends EventTarget { webidl.brandCheck(this, WebSocket) // The url getter steps are to return this's url, serialized. - return URLSerializer(this[kWebSocketURL]) + return URLSerializer(this.#url) } get extensions () { @@ -414,16 +410,16 @@ class WebSocket extends EventTarget { get binaryType () { webidl.brandCheck(this, WebSocket) - return this[kBinaryType] + return this.#binaryType } set binaryType (type) { webidl.brandCheck(this, WebSocket) if (type !== 'blob' && type !== 'arraybuffer') { - this[kBinaryType] = 'blob' + this.#binaryType = 'blob' } else { - this[kBinaryType] = type + this.#binaryType = type } } @@ -433,19 +429,17 @@ class WebSocket extends EventTarget { #onConnectionEstablished (response, parsedExtensions) { // processResponse is called when the "response’s header list has been received and initialized." // once this happens, the connection is open - this[kResponse] = response - - const parser = new ByteParser(this, parsedExtensions) - parser.on('drain', onParserDrain) - parser.on('error', onParserError.bind(this)) + this.#handler.socket = response.socket - response.socket.ws = this - this[kByteParser] = parser + const parser = new ByteParser(this.#handler, parsedExtensions) + parser.on('drain', () => this.#handler.onParserDrain()) + parser.on('error', (err) => this.#handler.onParserError(err)) + this.#parser = parser this.#sendQueue = new SendQueue(response.socket) // 1. Change the ready state to OPEN (1). - this[kReadyState] = states.OPEN + this.#handler.readyState = states.OPEN // 2. Change the extensions attribute’s value to the extensions in use, if // it is not the null value. @@ -468,6 +462,131 @@ class WebSocket extends EventTarget { // 4. Fire an event named open at the WebSocket object. fireEvent('open', this) } + + #onFail (code, reason) { + if (reason) { + // TODO: process.nextTick + fireEvent('error', this, (type, init) => new ErrorEvent(type, init), { + error: new Error(reason), + message: reason + }) + } + + if (!this.#handler.wasEverConnected) { + this.#handler.readyState = states.CLOSED + + // If the WebSocket connection could not be established, it is also said + // that _The WebSocket Connection is Closed_, but not _cleanly_. + fireEvent('close', this, (type, init) => new CloseEvent(type, init), { + wasClean: false, code, reason + }) + } + } + + #onMessage (type, data) { + // 1. If ready state is not OPEN (1), then return. + if (this.#handler.readyState !== states.OPEN) { + return + } + + // 2. Let dataForEvent be determined by switching on type and binary type: + let dataForEvent + + if (type === opcodes.TEXT) { + // -> type indicates that the data is Text + // a new DOMString containing data + try { + dataForEvent = utf8Decode(data) + } catch { + failWebsocketConnection(this.#handler, 1007, 'Received invalid UTF-8 in text frame.') + return + } + } else if (type === opcodes.BINARY) { + if (this.#binaryType === 'blob') { + // -> type indicates that the data is Binary and binary type is "blob" + // a new Blob object, created in the relevant Realm of the WebSocket + // object, that represents data as its raw data + dataForEvent = new Blob([data]) + } else { + // -> type indicates that the data is Binary and binary type is "arraybuffer" + // a new ArrayBuffer object, created in the relevant Realm of the + // WebSocket object, whose contents are data + dataForEvent = toArrayBuffer(data) + } + } + + // 3. Fire an event named message at the WebSocket object, using MessageEvent, + // with the origin attribute initialized to the serialization of the WebSocket + // object’s url's origin, and the data attribute initialized to dataForEvent. + fireEvent('message', this, createFastMessageEvent, { + origin: this.#url.origin, + data: dataForEvent + }) + } + + #onParserDrain () { + this.#handler.socket.resume() + } + + /** + * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol + * @see https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.4 + */ + #onSocketClose () { + // If the TCP connection was closed after the + // WebSocket closing handshake was completed, the WebSocket connection + // is said to have been closed _cleanly_. + const wasClean = + this.#handler.closeState.has(sentCloseFrameState.SENT) && + this.#handler.closeState.has(sentCloseFrameState.RECEIVED) + + let code = 1005 + let reason = '' + + const result = this.#parser.closingInfo + + if (result && !result.error) { + code = result.code ?? 1005 + reason = result.reason + } else if (!this.#handler.closeState.has(sentCloseFrameState.RECEIVED)) { + // If _The WebSocket + // Connection is Closed_ and no Close control frame was received by the + // endpoint (such as could occur if the underlying transport connection + // is lost), _The WebSocket Connection Close Code_ is considered to be + // 1006. + code = 1006 + } + + // 1. Change the ready state to CLOSED (3). + this.#handler.readyState = states.CLOSED + + // 2. If the user agent was required to fail the WebSocket + // connection, or if the WebSocket connection was closed + // after being flagged as full, fire an event named error + // at the WebSocket object. + // TODO + + // 3. Fire an event named close at the WebSocket object, + // using CloseEvent, with the wasClean attribute + // initialized to true if the connection closed cleanly + // and false otherwise, the code attribute initialized to + // the WebSocket connection close code, and the reason + // attribute initialized to the result of applying UTF-8 + // decode without BOM to the WebSocket connection close + // reason. + // TODO: process.nextTick + fireEvent('close', this, (type, init) => new CloseEvent(type, init), { + wasClean, code, reason + }) + + if (channels.close.hasSubscribers) { + channels.close.publish({ + websocket: this, + code, + reason + }) + } + } } // https://websockets.spec.whatwg.org/#dom-websocket-connecting @@ -516,7 +635,7 @@ webidl.converters['sequence'] = webidl.sequenceConverter( ) webidl.converters['DOMString or sequence'] = function (V, prefix, argument) { - if (webidl.util.Type(V) === 'Object' && Symbol.iterator in V) { + if (webidl.util.Type(V) === webidl.util.Types.OBJECT && Symbol.iterator in V) { return webidl.converters['sequence'](V) } @@ -542,7 +661,7 @@ webidl.converters.WebSocketInit = webidl.dictionaryConverter([ ]) webidl.converters['DOMString or sequence or WebSocketInit'] = function (V) { - if (webidl.util.Type(V) === 'Object' && !(Symbol.iterator in V)) { + if (webidl.util.Type(V) === webidl.util.Types.OBJECT && !(Symbol.iterator in V)) { return webidl.converters.WebSocketInit(V) } @@ -550,39 +669,19 @@ webidl.converters['DOMString or sequence or WebSocketInit'] = functio } webidl.converters.WebSocketSendData = function (V) { - if (webidl.util.Type(V) === 'Object') { - if (isBlobLike(V)) { - return webidl.converters.Blob(V, { strict: false }) + if (webidl.util.Type(V) === webidl.util.Types.OBJECT) { + if (webidl.is.Blob(V)) { + return V } if (ArrayBuffer.isView(V) || types.isArrayBuffer(V)) { - return webidl.converters.BufferSource(V) + return V } } return webidl.converters.USVString(V) } -function onParserDrain () { - this.ws[kResponse].socket.resume() -} - -function onParserError (err) { - let message - let code - - if (err instanceof CloseEvent) { - message = err.reason - code = err.code - } else { - message = err.message - } - - fireEvent('error', this, () => new ErrorEvent('error', { error: err, message })) - - closeWebSocketConnection(this, code) -} - module.exports = { WebSocket } diff --git a/deps/undici/src/package-lock.json b/deps/undici/src/package-lock.json index ea5f5e65ac0e3c..79bbfc1c03ddce 100644 --- a/deps/undici/src/package-lock.json +++ b/deps/undici/src/package-lock.json @@ -1,41 +1,38 @@ { "name": "undici", - "version": "6.21.0", + "version": "7.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "undici", - "version": "6.21.0", + "version": "7.2.0", "license": "MIT", "devDependencies": { - "@fastify/busboy": "2.1.1", + "@fastify/busboy": "3.1.0", "@matteo.collina/tspl": "^0.1.1", - "@sinonjs/fake-timers": "^11.1.0", - "@types/node": "~18.19.50", + "@sinonjs/fake-timers": "^12.0.0", + "@types/node": "^18.19.50", "abort-controller": "^3.0.0", - "borp": "^0.15.0", + "borp": "^0.19.0", "c8": "^10.0.0", "cross-env": "^7.0.3", "dns-packet": "^5.4.0", + "esbuild": "^0.24.0", + "eslint": "^9.9.0", "fast-check": "^3.17.1", - "form-data": "^4.0.0", - "formdata-node": "^6.0.3", "https-pem": "^3.0.0", "husky": "^9.0.7", "jest": "^29.0.2", - "jsdom": "^24.0.0", + "neostandard": "^0.12.0", "node-forge": "^1.3.1", - "pre-commit": "^1.2.2", "proxy": "^2.1.1", - "snazzy": "^9.0.0", - "standard": "^17.0.0", - "tsd": "^0.31.0", - "typescript": "^5.0.2", + "tsd": "^0.31.2", + "typescript": "^5.6.2", "ws": "^8.11.0" }, "engines": { - "node": ">=18.17" + "node": ">=20.18.1" } }, "node_modules/@actions/core": { @@ -107,9 +104,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.2.tgz", - "integrity": "sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", + "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", "dev": true, "license": "MIT", "engines": { @@ -148,14 +145,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz", - "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", + "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.2", - "@babel/types": "^7.26.0", + "@babel/parser": "^7.26.3", + "@babel/types": "^7.26.3", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -268,13 +265,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz", - "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", + "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.26.0" + "@babel/types": "^7.26.3" }, "bin": { "parser": "bin/babel-parser.js" @@ -538,17 +535,17 @@ } }, "node_modules/@babel/traverse": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz", - "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==", + "version": "7.26.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", + "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/generator": "^7.25.9", - "@babel/parser": "^7.25.9", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.3", + "@babel/parser": "^7.26.3", "@babel/template": "^7.25.9", - "@babel/types": "^7.25.9", + "@babel/types": "^7.26.3", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -556,10 +553,20 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/types": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", - "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", + "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", "dev": true, "license": "MIT", "dependencies": { @@ -571,242 +578,673 @@ } }, "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.1.tgz", + "integrity": "sha512-W+a0/JpU28AqH4IKtwUPcEUnUyXMDLALcn5/JLczGGT9fHE2sIby/xP/oQnx3nxkForzgzPy201RAKcB4xPAFQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=18" + } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", - "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "node_modules/@esbuild/aix-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", + "cpu": [ + "ppc64" + ], "dev": true, "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "node": ">=18" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "node_modules/@esbuild/android-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">=18" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "node_modules/@esbuild/android-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=18" } }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "node_modules/@esbuild/android-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", + "cpu": [ + "x64" + ], "dev": true, - "license": "Python-2.0" + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "node_modules/@esbuild/darwin-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", + "cpu": [ + "x64" + ], "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": "*" + "node": ">=18" } }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/@esbuild/linux-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", + "cpu": [ + "arm" + ], "dev": true, - "license": "(MIT OR CC0-1.0)", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "node_modules/@esbuild/linux-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=18" } }, - "node_modules/@fastify/busboy": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", - "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", + "node_modules/@esbuild/linux-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", + "cpu": [ + "ia32" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=14" + "node": ">=18" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", + "node_modules/@esbuild/linux-loong64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", + "cpu": [ + "loong64" + ], "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10.10.0" + "node": ">=18" } }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/@esbuild/linux-mips64el": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", + "cpu": [ + "mips64el" + ], "dev": true, "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/@esbuild/linux-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", + "cpu": [ + "ppc64" + ], "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "*" + "node": ">=18" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "node_modules/@esbuild/linux-riscv64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", + "cpu": [ + "riscv64" + ], "dev": true, - "license": "Apache-2.0", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "node": ">=18" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", + "node_modules/@esbuild/linux-s390x": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", + "cpu": [ + "s390x" + ], "dev": true, - "license": "BSD-3-Clause" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "node_modules/@esbuild/linux-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", + "cpu": [ + "x64" + ], "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.1.tgz", + "integrity": "sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.5", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.1.tgz", + "integrity": "sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", + "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "9.17.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.17.0.tgz", + "integrity": "sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.5.tgz", + "integrity": "sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.4.tgz", + "integrity": "sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@fastify/busboy": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-3.1.0.tgz", + "integrity": "sha512-yHmUtGwEbW6HsKpPqT140/L6GpHtquHogRLgtanJFep3UAfDkE0fQfC49U+F9irCAoJVlv3M7VSp4rrtO4LnfA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/gitignore-to-minimatch": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", + "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", + "dev": true, + "license": "Apache-2.0", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", + "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "license": "ISC", "dependencies": { @@ -820,6 +1258,16 @@ "node": ">=8" } }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -834,6 +1282,20 @@ "node": ">=8" } }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -886,6 +1348,16 @@ "node": ">=8" } }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", @@ -1116,6 +1588,13 @@ } } }, + "node_modules/@jest/reporters/node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, "node_modules/@jest/reporters/node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -1126,17 +1605,6 @@ "node": ">=8" } }, - "node_modules/@jest/reporters/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/@jest/reporters/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -1159,19 +1627,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@jest/reporters/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/@jest/reporters/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -1291,9 +1746,9 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dev": true, "license": "MIT", "dependencies": { @@ -1395,6 +1850,16 @@ "node": ">= 8" } }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.4.0" + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -1407,9 +1872,9 @@ } }, "node_modules/@reporters/github": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@reporters/github/-/github-1.7.1.tgz", - "integrity": "sha512-PzM4jrcNPilW9YjbZ3VTImtAK9AkWaF4XpUSxPJLE3Dmo2tbjABT/vAveKQAkXq1NR5BeCpbQ5vsxthklc8D2g==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@reporters/github/-/github-1.7.2.tgz", + "integrity": "sha512-8mvTyKUxxDXkNIWfzv3FsHVwjr8JCwVtwidQws2neV6YgrsJW6OwTOBBhd01RKrDMXPxgpMQuFEfN9hRuUZGuA==", "dev": true, "license": "MIT", "dependencies": { @@ -1417,10 +1882,10 @@ "stack-utils": "^2.0.6" } }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "node_modules/@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", "dev": true, "license": "MIT" }, @@ -1431,6 +1896,19 @@ "dev": true, "license": "MIT" }, + "node_modules/@sindresorhus/merge-streams": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", + "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@sinonjs/commons": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", @@ -1442,15 +1920,48 @@ } }, "node_modules/@sinonjs/fake-timers": { - "version": "11.3.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.3.1.tgz", - "integrity": "sha512-EVJO7nW5M/F5Tur0Rf2z/QoMo+1Ia963RiMtapiQrEWvY0iBUvADo8Beegwjpnle5BHkyHuoxSTW3jF43H1XRA==", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-12.0.0.tgz", + "integrity": "sha512-bockPohsu/W5uL2w7km2fQcLBm0hi4k2h6Z3/tfzNGQ2BTuFEhJoFrMMpmGAW7zHqop0wtuXDm/WHPNY6JLoHA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^3.0.1" } }, + "node_modules/@stylistic/eslint-plugin": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-2.11.0.tgz", + "integrity": "sha512-PNRHbydNG5EH8NK4c+izdJlxajIR6GxcUhzsYNRsn6Myep4dsZt0qFCz3rCPnkvgO5FYibDcMqgNHUT+zvjYZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^8.13.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "estraverse": "^5.3.0", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": ">=8.40.0" + } + }, + "node_modules/@stylistic/eslint-plugin/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/@tsd/typescript": { "version": "5.4.5", "resolved": "https://registry.npmjs.org/@tsd/typescript/-/typescript-5.4.5.tgz", @@ -1506,6 +2017,13 @@ "@babel/types": "^7.20.7" } }, + "node_modules/@types/doctrine": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.9.tgz", + "integrity": "sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/eslint": { "version": "7.29.0", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz", @@ -1568,13 +2086,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", @@ -1582,63 +2093,275 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/node": { - "version": "18.19.64", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.64.tgz", - "integrity": "sha512-955mDqvO2vFf/oL7V3WiUtiz+BugyX8uVbaT2H8oj3+8dRyH2FLiNdowe7eNqRM7IOIZvzDH76EoAT+gwm6aIQ==", + "node_modules/@types/node": { + "version": "18.19.68", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.68.tgz", + "integrity": "sha512-QGtpFH1vB99ZmTa63K4/FU8twThj4fuVSBkGddTp7uIL/cuoLWIUSL2RcOaigBhfR+hg5pgGkBnkoOxrTVBMKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.18.1.tgz", + "integrity": "sha512-Ncvsq5CT3Gvh+uJG0Lwlho6suwDfUXH0HztslDf5I+F2wAFAZMRwYLEorumpKLzmO2suAXZ/td1tBg4NZIi9CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.18.1", + "@typescript-eslint/type-utils": "8.18.1", + "@typescript-eslint/utils": "8.18.1", + "@typescript-eslint/visitor-keys": "8.18.1", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.18.1.tgz", + "integrity": "sha512-rBnTWHCdbYM2lh7hjyXqxk70wvon3p2FyaniZuey5TrcGBpfhVp0OxOa6gxr9Q9YhZFKyfbEnxc24ZnVbbUkCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.18.1", + "@typescript-eslint/types": "8.18.1", + "@typescript-eslint/typescript-estree": "8.18.1", + "@typescript-eslint/visitor-keys": "8.18.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.18.1.tgz", + "integrity": "sha512-HxfHo2b090M5s2+/9Z3gkBhI6xBH8OJCFjH9MhQ+nnoZqxU3wNxkLT+VWXWSFWc3UF3Z+CfPAyqdCTdoXtDPCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.18.1", + "@typescript-eslint/visitor-keys": "8.18.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.18.1.tgz", + "integrity": "sha512-jAhTdK/Qx2NJPNOTxXpMwlOiSymtR2j283TtPqXkKBdH8OAMmhiUfP0kJjc/qSE51Xrq02Gj9NY7MwK+UxVwHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.18.1", + "@typescript-eslint/utils": "8.18.1", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.18.1.tgz", + "integrity": "sha512-7uoAUsCj66qdNQNpH2G8MyTFlgerum8ubf21s3TSM3XmKXuIn+H2Sifh/ES2nPOPiYSRJWAk0fDkW0APBWcpfw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.18.1.tgz", + "integrity": "sha512-z8U21WI5txzl2XYOW7i9hJhxoKKNG1kcU4RzyNvKrdZDmbjkmLBo8bgeiOJmA06kizLI76/CCBAAGlTlEeUfyg==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "@typescript-eslint/types": "8.18.1", + "@typescript-eslint/visitor-keys": "8.18.1", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.8.0" } }, - "node_modules/@types/node-forge": { - "version": "1.3.11", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", - "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "license": "MIT", "dependencies": { - "@types/node": "*" + "balanced-match": "^1.0.0" } }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, - "license": "MIT" + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "license": "MIT" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } }, - "node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "node_modules/@typescript-eslint/utils": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.18.1.tgz", + "integrity": "sha512-8vikiIj2ebrC4WRdcAdDcmnu9Q/MXXwg+STf40BVfT8exDqBCUPdypvzcUPxEqRGKg9ALagZ0UWcYCtn+4W2iQ==", "dev": true, "license": "MIT", "dependencies": { - "@types/yargs-parser": "*" + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.18.1", + "@typescript-eslint/types": "8.18.1", + "@typescript-eslint/typescript-estree": "8.18.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.18.1.tgz", + "integrity": "sha512-Vj0WLm5/ZsD013YeUKn+K0y8p1M0jPpxOkKdbD1wB0ns53a5piVY02zjf072TblEweAbcYiFiPoSMF3kp+VhhQ==", "dev": true, - "license": "ISC" + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.18.1", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } }, "node_modules/abort-controller": { "version": "3.0.0", @@ -1676,19 +2399,6 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -1766,14 +2476,11 @@ } }, "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } + "license": "Python-2.0" }, "node_modules/args": { "version": "5.0.3", @@ -1890,14 +2597,14 @@ } }, "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" }, "engines": { "node": ">= 0.4" @@ -1958,18 +2665,16 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", - "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", + "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" }, "engines": { @@ -1979,36 +2684,17 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "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" @@ -2035,20 +2721,19 @@ } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", "dev": true, "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" + "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" @@ -2067,13 +2752,6 @@ "node": ">=0.10.0" } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true, - "license": "MIT" - }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", @@ -2129,17 +2807,6 @@ "node": ">=8" } }, - "node_modules/babel-plugin-istanbul/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/babel-plugin-istanbul/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -2179,19 +2846,6 @@ "node": ">=8" } }, - "node_modules/babel-plugin-istanbul/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/babel-plugin-istanbul/node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -2281,30 +2935,32 @@ "dev": true }, "node_modules/borp": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/borp/-/borp-0.15.0.tgz", - "integrity": "sha512-G3tAYzy+meolAqquLa52n4XGsER6lBsL3i+56C3JPZYkcCXUak7tMTJGOxVwwaxZM9GERGKTtqLr5H0yNZ+uXA==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/borp/-/borp-0.19.0.tgz", + "integrity": "sha512-rPO/r9XEXSbihEAZEhsO30SrncSciEB61xrOi8RhbaAKrp7qFuOGn1cUXYW8EwrPXlCvPhSN3+tllrSbIpowyg==", "dev": true, "license": "MIT", "dependencies": { "@reporters/github": "^1.5.4", "c8": "^10.0.0", - "execa": "^8.0.1", + "execa": "^9.3.0", "find-up": "^7.0.0", - "glob": "^10.3.10" + "glob": "^10.3.10", + "yaml": "^2.5.1" }, "bin": { "borp": "borp.js" } }, "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, "node_modules/braces": { @@ -2321,9 +2977,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", - "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", + "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", "dev": true, "funding": [ { @@ -2341,9 +2997,9 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001669", - "electron-to-chromium": "^1.5.41", - "node-releases": "^2.0.18", + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.1" }, "bin": { @@ -2370,37 +3026,14 @@ "dev": true, "license": "MIT" }, - "node_modules/builtins": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz", - "integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.0.0" - } - }, - "node_modules/builtins/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/c8": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/c8/-/c8-10.1.2.tgz", - "integrity": "sha512-Qr6rj76eSshu5CgRYvktW0uM0CFY0yi4Fd5D0duDXO6sYinyopmftUiJVuzBQxQcwQLor7JWDVRP+dUfCmzgJw==", + "version": "10.1.3", + "resolved": "https://registry.npmjs.org/c8/-/c8-10.1.3.tgz", + "integrity": "sha512-LvcyrOAaOnrrlMpW22n690PUvxiq4Uf9WMhQwNJ9vgagkL/ph1+D4uvjvDA5XCbykrc0sx+ay6pVi9YZ1GnhyA==", "dev": true, "license": "ISC", "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", + "@bcoe/v8-coverage": "^1.0.1", "@istanbuljs/schema": "^0.1.3", "find-up": "^5.0.0", "foreground-child": "^3.1.1", @@ -2487,17 +3120,47 @@ } }, "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "dev": true, "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "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.1", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -2545,9 +3208,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001680", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001680.tgz", - "integrity": "sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA==", + "version": "1.0.30001690", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz", + "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==", "dev": true, "funding": [ { @@ -2721,91 +3384,22 @@ "color-name": "~1.1.4" }, "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "engines": [ - "node >= 0.8" - ], - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/concat-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-stream/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "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": ">=7.0.0" } }, - "node_modules/concat-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, - "node_modules/concat-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } + "license": "MIT" }, "node_modules/convert-source-map": { "version": "2.0.0", @@ -2814,13 +3408,6 @@ "dev": true, "license": "MIT" }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true, - "license": "MIT" - }, "node_modules/create-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", @@ -2863,9 +3450,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.5.tgz", - "integrity": "sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==", + "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": { @@ -2877,43 +3464,16 @@ "node": ">= 8" } }, - "node_modules/cssstyle": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.1.0.tgz", - "integrity": "sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA==", - "dev": true, - "license": "MIT", - "dependencies": { - "rrweb-cssom": "^0.7.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/data-urls": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", - "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "is-data-view": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -2923,31 +3483,31 @@ } }, "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "is-data-view": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/inspect-js" } }, "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" }, @@ -2959,9 +3519,9 @@ } }, "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, "license": "MIT", "dependencies": { @@ -3013,13 +3573,6 @@ "node": ">=0.10.0" } }, - "node_modules/decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", - "dev": true, - "license": "MIT" - }, "node_modules/dedent": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", @@ -3088,16 +3641,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -3157,6 +3700,21 @@ "node": ">=6.0.0" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "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/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -3165,9 +3723,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.58", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.58.tgz", - "integrity": "sha512-al2l4r+24ZFL7WzyPTlyD0fC33LLzvxqLCwurtBibVPghRGO9hSTl+tis8t1kD7biPiH/en4U0I7o/nQbYeoVA==", + "version": "1.5.75", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.75.tgz", + "integrity": "sha512-Lf3++DumRE/QmweGjU+ZcKqQ+3bKkU/qjaKYhIJKEOhgIO9Xs6IiAQFkfFoj+RhgDk4LUeNsLo6plExHqSyu6Q==", "dev": true, "license": "ISC" }, @@ -3191,17 +3749,18 @@ "dev": true, "license": "MIT" }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "node_modules/enhanced-resolve": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.0.tgz", + "integrity": "sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==", "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "engines": { + "node": ">=10.13.0" } }, "node_modules/error-ex": { @@ -3215,58 +3774,59 @@ } }, "node_modules/es-abstract": { - "version": "1.23.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.4.tgz", - "integrity": "sha512-HR1gxH5OaiN7XH7uiWH0RLw0RcFySiSoW1ctxmD1ahTw3uGBtkmm/ng0tDU1OtYx5OK6EOL5Y6O21cDflG3Jcg==", + "version": "1.23.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.7.tgz", + "integrity": "sha512-OygGC8kIcDhXX+6yAZRGLqwi2CmEXCbLQixeGUgYeR+Qwlppqmo7DIDr8XibtEBZp+fJcoYpoatp5qwLMEdcqQ==", "dev": true, "license": "MIT", "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "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.0.0", "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.2.6", + "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", - "gopd": "^1.0.1", + "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", + "is-data-view": "^1.0.2", + "is-regex": "^1.2.1", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.0", + "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.3", "object-keys": "^1.1.1", - "object.assign": "^4.1.5", + "object.assign": "^4.1.7", "regexp.prototype.flags": "^1.5.3", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", + "safe-array-concat": "^1.1.3", + "safe-regex-test": "^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.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" + "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.18" }, "engines": { "node": ">= 0.4" @@ -3276,14 +3836,11 @@ } }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "dev": true, "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, "engines": { "node": ">= 0.4" } @@ -3299,27 +3856,28 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.0.tgz", - "integrity": "sha512-tpxqxncxnpw3c93u8n3VOzACmRFoVmWJqbWXvX/JfKbkhBw1oslgPrUfeSt2psuqyEJFD6N/9lg5i7bsKpoq+Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", + "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.0.3", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", + "get-intrinsic": "^1.2.6", "globalthis": "^1.0.4", - "gopd": "^1.0.1", + "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "iterator.prototype": "^1.1.3", - "safe-array-concat": "^1.1.2" + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" }, "engines": { "node": ">= 0.4" @@ -3364,15 +3922,15 @@ } }, "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", "dev": true, "license": "MIT", "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" }, "engines": { "node": ">= 0.4" @@ -3381,6 +3939,47 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/esbuild": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" + } + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -3392,125 +3991,105 @@ } }, "node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "version": "9.17.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.17.0.tgz", + "integrity": "sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.19.0", + "@eslint/core": "^0.9.0", + "@eslint/eslintrc": "^3.2.0", + "@eslint/js": "9.17.0", + "@eslint/plugin-kit": "^0.2.3", + "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", + "@humanwhocodes/retry": "^0.4.1", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", + "cross-spawn": "^7.0.6", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" + "optionator": "^0.9.3" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, - "node_modules/eslint-config-standard": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", - "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", + "node_modules/eslint-compat-utils": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", + "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], "license": "MIT", + "dependencies": { + "semver": "^7.5.4" + }, "engines": { - "node": ">=12.0.0" + "node": ">=12" }, "peerDependencies": { - "eslint": "^8.0.1", - "eslint-plugin-import": "^2.25.2", - "eslint-plugin-n": "^15.0.0 || ^16.0.0 ", - "eslint-plugin-promise": "^6.0.0" + "eslint": ">=6.0.0" } }, - "node_modules/eslint-config-standard-jsx": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-11.0.0.tgz", - "integrity": "sha512-+1EV/R0JxEK1L0NGolAr8Iktm3Rgotx3BKwgaX+eAuSX8D952LULKtjgZD3F+e6SvibONnhLwoTi9DPxN5LvvQ==", + "node_modules/eslint-compat-utils/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "peerDependencies": { - "eslint": "^8.8.0", - "eslint-plugin-react": "^7.28.0" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/eslint-formatter-pretty": { @@ -3603,209 +4182,194 @@ "ms": "^2.1.1" } }, - "node_modules/eslint-module-utils": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", - "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", + "node_modules/eslint-import-resolver-typescript": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.7.0.tgz", + "integrity": "sha512-Vrwyi8HHxY97K5ebydMtffsWAn1SCR9eol49eCd5fJS4O1WV7PaAjbcjmbfJJSMz/t4Mal212Uz/fQZrOB8mow==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "debug": "^3.2.7" + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.3.7", + "enhanced-resolve": "^5.15.0", + "fast-glob": "^3.3.2", + "get-tsconfig": "^4.7.5", + "is-bun-module": "^1.0.2", + "is-glob": "^4.0.3", + "stable-hash": "^0.0.4" }, "engines": { - "node": ">=4" + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" }, "peerDependenciesMeta": { - "eslint": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { "optional": true } } }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-es": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz", - "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==", + "node_modules/eslint-plugin-es-x": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz", + "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==", "dev": true, + "funding": [ + "https://github.com/sponsors/ota-meshi", + "https://opencollective.com/eslint" + ], "license": "MIT", "dependencies": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" + "@eslint-community/eslint-utils": "^4.1.2", + "@eslint-community/regexpp": "^4.11.0", + "eslint-compat-utils": "^0.5.1" }, "engines": { - "node": ">=8.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" + "node": "^14.18.0 || >=16.0.0" }, "peerDependencies": { - "eslint": ">=4.19.1" - } - }, - "node_modules/eslint-plugin-es/node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=4" + "eslint": ">=8" } }, - "node_modules/eslint-plugin-import": { - "version": "2.31.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", - "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", + "node_modules/eslint-plugin-import-x": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import-x/-/eslint-plugin-import-x-4.6.1.tgz", + "integrity": "sha512-wluSUifMIb7UfwWXqx7Yx0lE/SGCcGXECLx/9bCmbY2nneLwvAZ4vkd1IXDjPKFvdcdUgr1BaRnaRpx3k2+Pfw==", "dev": true, "license": "MIT", "dependencies": { - "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.8", - "array.prototype.findlastindex": "^1.2.5", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", + "@types/doctrine": "^0.0.9", + "@typescript-eslint/scope-manager": "^8.1.0", + "@typescript-eslint/utils": "^8.1.0", + "debug": "^4.3.4", + "doctrine": "^3.0.0", + "enhanced-resolve": "^5.17.1", "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.0", - "hasown": "^2.0.2", - "is-core-module": "^2.15.1", + "get-tsconfig": "^4.7.3", "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "object.groupby": "^1.0.3", - "object.values": "^1.2.0", - "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.8", - "tsconfig-paths": "^3.15.0" + "minimatch": "^9.0.3", + "semver": "^7.6.3", + "stable-hash": "^0.0.4", + "tslib": "^2.6.3" }, "engines": { - "node": ">=4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" - } - }, - "node_modules/eslint-plugin-import/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "eslint": "^8.57.0 || ^9.0.0" } }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/eslint-plugin-import-x/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "license": "MIT", "dependencies": { - "ms": "^2.1.1" + "balanced-match": "^1.0.0" } }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "node_modules/eslint-plugin-import-x/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, - "license": "Apache-2.0", + "license": "ISC", "dependencies": { - "esutils": "^2.0.2" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/eslint-plugin-import/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/eslint-plugin-import-x/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": "*" + "node": ">=10" } }, "node_modules/eslint-plugin-n": { - "version": "15.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz", - "integrity": "sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==", + "version": "17.15.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.15.1.tgz", + "integrity": "sha512-KFw7x02hZZkBdbZEFQduRGH4VkIH4MW97ClsbAM4Y4E6KguBJWGfWG1P4HEIpZk2bkoWf0bojpnjNAhYQP8beA==", "dev": true, "license": "MIT", "dependencies": { - "builtins": "^5.0.1", - "eslint-plugin-es": "^4.1.0", - "eslint-utils": "^3.0.0", - "ignore": "^5.1.1", - "is-core-module": "^2.11.0", - "minimatch": "^3.1.2", - "resolve": "^1.22.1", - "semver": "^7.3.8" + "@eslint-community/eslint-utils": "^4.4.1", + "enhanced-resolve": "^5.17.1", + "eslint-plugin-es-x": "^7.8.0", + "get-tsconfig": "^4.8.1", + "globals": "^15.11.0", + "ignore": "^5.3.2", + "minimatch": "^9.0.5", + "semver": "^7.6.3" }, "engines": { - "node": ">=12.22.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" + "url": "https://opencollective.com/eslint" }, "peerDependencies": { - "eslint": ">=7.0.0" + "eslint": ">=8.23.0" } }, "node_modules/eslint-plugin-n/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" + } + }, + "node_modules/eslint-plugin-n/node_modules/globals": { + "version": "15.14.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.14.0.tgz", + "integrity": "sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint-plugin-n/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/eslint-plugin-n/node_modules/semver": { @@ -3822,13 +4386,16 @@ } }, "node_modules/eslint-plugin-promise": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz", - "integrity": "sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-7.2.1.tgz", + "integrity": "sha512-SWKjd+EuvWkYaS+uN2csvj0KoP43YTu7+phKQ5v+xw6+A0gutVX2yqCeCkC3uLCJFiPfR2dD8Es5L7yUsmvEaA==", "dev": true, "license": "ISC", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -3870,17 +4437,6 @@ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, - "node_modules/eslint-plugin-react/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/eslint-plugin-react/node_modules/doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", @@ -3894,19 +4450,6 @@ "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-react/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/eslint-plugin-react/node_modules/resolve": { "version": "2.0.0-next.5", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", @@ -3933,9 +4476,9 @@ "license": "MIT" }, "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", + "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -3943,95 +4486,25 @@ "estraverse": "^5.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10" - } - }, "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint/node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -4049,35 +4522,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/eslint/node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -4094,19 +4538,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/eslint/node_modules/p-locate": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", @@ -4133,45 +4564,19 @@ "node": ">=8" } }, - "node_modules/eslint/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.9.0", + "acorn": "^8.14.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "eslint-visitor-keys": "^4.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -4248,24 +4653,27 @@ } }, "node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.5.2.tgz", + "integrity": "sha512-EHlpxMCpHWSAh1dgS6bVeoLAXGnJNdR93aabr4QCGbzOM73o5XmRfM/e5FUqsw3aagP8S8XEWUWFAxnRBnAF0Q==", "dev": true, "license": "MIT", "dependencies": { + "@sindresorhus/merge-streams": "^4.0.0", "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", + "figures": "^6.1.0", + "get-stream": "^9.0.0", + "human-signals": "^8.0.0", + "is-plain-obj": "^4.1.0", + "is-stream": "^4.0.1", + "npm-run-path": "^6.0.0", + "pretty-ms": "^9.0.0", "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" + "strip-final-newline": "^4.0.0", + "yoctocolors": "^2.0.0" }, "engines": { - "node": ">=16.17" + "node": "^18.19.0 || >=20.5.0" }, "funding": { "url": "https://github.com/sindresorhus/execa?sponsor=1" @@ -4298,9 +4706,9 @@ } }, "node_modules/fast-check": { - "version": "3.23.1", - "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.23.1.tgz", - "integrity": "sha512-u/MudsoQEgBUZgR5N1v87vEgybeVYus9VnDVaIkxkkGP2jt54naghQ3PCQHJiogS8U/GavZCUPFfx3Xkp+NaHw==", + "version": "3.23.2", + "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.23.2.tgz", + "integrity": "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==", "dev": true, "funding": [ { @@ -4391,17 +4799,33 @@ "bser": "2.1.1" } }, + "node_modules/figures": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", + "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-unicode-supported": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "license": "MIT", "dependencies": { - "flat-cache": "^3.0.4" + "flat-cache": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16.0.0" } }, "node_modules/fill-range": { @@ -4436,24 +4860,23 @@ } }, "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "license": "MIT", "dependencies": { "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "keyv": "^4.5.4" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16" } }, "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", "dev": true, "license": "ISC" }, @@ -4484,31 +4907,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/form-data": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", - "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", - "dev": true, - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/formdata-node": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-6.0.3.tgz", - "integrity": "sha512-8e1++BCiTzUno9v5IZ2J6bv4RU+3UKDmqWUQD0MIMVCd9AdhWkO1gw57oo1mNEX1dMq2EGI+FbWz4B92pscSQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 18" - } - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -4542,16 +4940,18 @@ } }, "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" + "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" @@ -4591,17 +4991,22 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.6.tgz", + "integrity": "sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==", "dev": true, "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "dunder-proto": "^1.0.0", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -4620,42 +5025,33 @@ "node": ">=8.0.0" } }, - "node_modules/get-stdin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", - "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", "dev": true, "license": "MIT", + "dependencies": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + }, "engines": { - "node": ">=16" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -4664,6 +5060,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-tsconfig": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", + "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, "node_modules/glob": { "version": "10.4.5", "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", @@ -4698,14 +5107,43 @@ "node": ">=10.13.0" } }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globalthis": { @@ -4747,13 +5185,13 @@ } }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.1.3" + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4784,11 +5222,14 @@ } }, "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "dev": true, "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -4817,11 +5258,14 @@ } }, "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", "dev": true, "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -4830,9 +5274,9 @@ } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, "license": "MIT", "engines": { @@ -4904,19 +5348,6 @@ "dev": true, "license": "ISC" }, - "node_modules/html-encoding-sniffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", - "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-encoding": "^3.1.1" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -4924,20 +5355,6 @@ "dev": true, "license": "MIT" }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/https-pem": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/https-pem/-/https-pem-3.0.0.tgz", @@ -4949,34 +5366,20 @@ "selfsigned": "^2.0.1" } }, - "node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.0.tgz", + "integrity": "sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==", "dev": true, "license": "Apache-2.0", "engines": { - "node": ">=16.17.0" + "node": ">=18.18.0" } }, "node_modules/husky": { - "version": "9.1.6", - "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.6.tgz", - "integrity": "sha512-sqbjZKK7kf44hfdE94EoX8MZNk0n7HeW37O4YrVGCF4wzgQjp+akPAkfUK5LZ6KuR/6sqeAVuXHji+RzQgOn5A==", + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", + "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", "dev": true, "license": "MIT", "bin": { @@ -4989,19 +5392,6 @@ "url": "https://github.com/sponsors/typicode" } }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -5029,16 +5419,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/import-local": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", @@ -5099,15 +5479,15 @@ "license": "ISC" }, "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" + "hasown": "^2.0.2", + "side-channel": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -5124,14 +5504,15 @@ } }, "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -5164,27 +5545,30 @@ } }, "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dev": true, "license": "MIT", "dependencies": { - "has-bigints": "^1.0.1" + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.1.tgz", + "integrity": "sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -5193,6 +5577,29 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-bun-module": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-1.3.0.tgz", + "integrity": "sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.6.3" + } + }, + "node_modules/is-bun-module/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -5207,9 +5614,9 @@ } }, "node_modules/is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, "license": "MIT", "dependencies": { @@ -5223,12 +5630,14 @@ } }, "node_modules/is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "dev": true, "license": "MIT", "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" }, "engines": { @@ -5239,13 +5648,14 @@ } }, "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dev": true, "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -5265,13 +5675,16 @@ } }, "node_modules/is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5339,19 +5752,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -5363,13 +5763,14 @@ } }, "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "dev": true, "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -5378,42 +5779,30 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true, - "license": "MIT" - }, "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -5436,13 +5825,13 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7" + "call-bound": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -5452,26 +5841,27 @@ } }, "node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", "dev": true, "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dev": true, "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -5481,13 +5871,15 @@ } }, "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dev": true, "license": "MIT", "dependencies": { - "has-symbols": "^1.0.2" + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -5497,13 +5889,13 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "dev": true, "license": "MIT", "dependencies": { - "which-typed-array": "^1.1.14" + "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" @@ -5513,13 +5905,13 @@ } }, "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -5539,27 +5931,30 @@ } }, "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.0.tgz", + "integrity": "sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "call-bound": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-weakset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", - "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4" + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -5667,17 +6062,18 @@ } }, "node_modules/iterator.prototype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.3.tgz", - "integrity": "sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.4.tgz", + "integrity": "sha512-x4WH0BWmrMmg4oHHl+duwubhrvczGlyuGAZu3nvrf0UXOfPu8IhZObFEr7DE/iv01YgVZrsOiRcqw2srkKEDIA==", "dev": true, "license": "MIT", "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "reflect.getprototypeof": "^1.0.8", + "set-function-name": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -5801,16 +6197,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-changed-files/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/jest-changed-files/node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -5824,22 +6210,6 @@ "node": ">=8" } }, - "node_modules/jest-changed-files/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/jest-changed-files/node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -5960,24 +6330,13 @@ "@types/node": "*", "ts-node": ">=9.0.0" }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-config/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } } }, "node_modules/jest-config/node_modules/glob": { @@ -6002,19 +6361,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/jest-config/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/jest-diff": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", @@ -6311,17 +6657,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-runtime/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/jest-runtime/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -6344,19 +6679,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/jest-runtime/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/jest-snapshot": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", @@ -6511,64 +6833,22 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "license": "MIT", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsdom": { - "version": "24.1.3", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.1.3.tgz", - "integrity": "sha512-MyL55p3Ut3cXbeBEG7Hcv0mVM8pp8PBNWxRqchZnSfAiES1v1mRnMeFfaHWIPULpwsYfvO+ZmMZz5tGCnjzDUQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssstyle": "^4.0.1", - "data-urls": "^5.0.0", - "decimal.js": "^10.4.3", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^4.0.0", - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.5", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.12", - "parse5": "^7.1.2", - "rrweb-cssom": "^0.7.1", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.4", - "w3c-xmlserializer": "^5.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^3.1.1", - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0", - "ws": "^8.18.0", - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "canvas": "^2.11.2" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, "node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, "license": "MIT", "bin": { @@ -6585,13 +6865,6 @@ "dev": true, "license": "MIT" }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true, - "license": "MIT" - }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -6703,57 +6976,6 @@ "dev": true, "license": "MIT" }, - "node_modules/load-json-file": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", - "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.15", - "parse-json": "^4.0.0", - "pify": "^4.0.1", - "strip-bom": "^3.0.0", - "type-fest": "^0.3.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/load-json-file/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "license": "MIT", - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/type-fest": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", - "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=6" - } - }, "node_modules/locate-path": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", @@ -6794,6 +7016,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -6869,6 +7104,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/meow": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", @@ -6950,40 +7195,14 @@ "node": ">=8.6" } }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, "node_modules/min-indent": { @@ -6997,29 +7216,16 @@ } }, "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "*" } }, "node_modules/minimist-options": { @@ -7037,6 +7243,16 @@ "node": ">= 6" } }, + "node_modules/minimist-options/node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/minipass": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", @@ -7047,30 +7263,131 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/mri": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.4.tgz", - "integrity": "sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==", + "node_modules/mri": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.4.tgz", + "integrity": "sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/neostandard": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/neostandard/-/neostandard-0.12.0.tgz", + "integrity": "sha512-MvtiRhevDzE+oqQUxFvDsEmipzy3erNmnz5q5TG9M8xZ30n86rt4PxGP9jgocGIZr1105OgPZNlK2FQEtb2Vng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "@stylistic/eslint-plugin": "2.11.0", + "eslint-import-resolver-typescript": "^3.7.0", + "eslint-plugin-import-x": "^4.5.0", + "eslint-plugin-n": "^17.14.0", + "eslint-plugin-promise": "^7.2.1", + "eslint-plugin-react": "^7.37.2", + "find-up": "^5.0.0", + "globals": "^15.13.0", + "peowly": "^1.3.2", + "typescript-eslint": "^8.17.0" + }, + "bin": { + "neostandard": "cli.mjs" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": "^9.0.0" + } + }, + "node_modules/neostandard/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/neostandard/node_modules/globals": { + "version": "15.14.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.14.0.tgz", + "integrity": "sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/neostandard/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/neostandard/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/neostandard/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, "node_modules/node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -7089,9 +7406,9 @@ "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", "dev": true, "license": "MIT" }, @@ -7135,16 +7452,17 @@ } }, "node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", "dev": true, "license": "MIT", "dependencies": { - "path-key": "^4.0.0" + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -7163,12 +7481,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/nwsapi": { - "version": "2.2.13", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.13.tgz", - "integrity": "sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ==", + "node_modules/npm-run-path/node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/object-assign": { "version": "4.1.1", @@ -7204,15 +7528,17 @@ } }, "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", "object-keys": "^1.1.1" }, "engines": { @@ -7256,29 +7582,15 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.groupby": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/object.values": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", - "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" }, @@ -7300,16 +7612,16 @@ } }, "node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "license": "MIT", "dependencies": { - "mimic-fn": "^4.0.0" + "mimic-fn": "^2.1.0" }, "engines": { - "node": ">=12" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -7333,15 +7645,6 @@ "node": ">= 0.8.0" } }, - "node_modules/os-shim": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz", - "integrity": "sha512-jd0cvB8qQ5uVt0lvCIexBaROw1KyKm5sbulg2fWOHjETisuCzWyt+eTZKEMs8v6HwzoGs8xik26jg7eCM6pS+A==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -7452,17 +7755,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse5": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", - "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "node_modules/parse-ms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", + "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", "dev": true, "license": "MIT", - "dependencies": { - "entities": "^4.5.0" + "engines": { + "node": ">=18" }, "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/path-exists": { @@ -7536,6 +7839,16 @@ "node": ">=8" } }, + "node_modules/peowly": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/peowly/-/peowly-1.3.2.tgz", + "integrity": "sha512-BYIrwr8JCXY49jUZscgw311w9oGEKo7ux/s+BxrhKTQbiQ0iYNdZNJ5LgagaeercQdFHwnR7Z5IxxFWVQ+BasQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.6.0" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -7556,16 +7869,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/pirates": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", @@ -7576,86 +7879,6 @@ "node": ">= 6" } }, - "node_modules/pkg-conf": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-3.1.0.tgz", - "integrity": "sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^3.0.0", - "load-json-file": "^5.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-conf/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-conf/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-conf/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-conf/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-conf/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -7761,85 +7984,6 @@ "node": ">= 0.4" } }, - "node_modules/pre-commit": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/pre-commit/-/pre-commit-1.2.2.tgz", - "integrity": "sha512-qokTiqxD6GjODy5ETAIgzsRgnBWWQHQH2ghy86PU7mIn/wuWeTwF3otyNQZxWBwVn8XNr8Tdzj/QfUXpH+gRZA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^5.0.1", - "spawn-sync": "^1.0.15", - "which": "1.2.x" - } - }, - "node_modules/pre-commit/node_modules/cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "node_modules/pre-commit/node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "license": "ISC", - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/pre-commit/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pre-commit/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pre-commit/node_modules/which": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", - "integrity": "sha512-16uPglFkRPzgiUXYMi1Jf8Z5EzN1iB4V0ZtMXcHZnwsBtQhhHeCqoWw7tsUY42hJGNDWtUsVLTjakIa5BgAxCw==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/pre-commit/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", - "dev": true, - "license": "ISC" - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -7878,12 +8022,21 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "node_modules/pretty-ms": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.2.0.tgz", + "integrity": "sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "parse-ms": "^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/prompts": { "version": "2.4.2", @@ -7936,23 +8089,6 @@ "node": ">= 14" } }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/psl": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.10.0.tgz", - "integrity": "sha512-KSKHEbjAnpUuAUserOq0FxGXCUrzC3WniuSJhvdbs102rL55266ZcHBqLWOsG30spQMlPdpy7icATiAQehg/iA==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - } - }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -7980,13 +8116,6 @@ ], "license": "MIT" }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true, - "license": "MIT" - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -8175,21 +8304,6 @@ "node": ">=8" } }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/redent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", @@ -8205,19 +8319,20 @@ } }, "node_modules/reflect.getprototypeof": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", - "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.9.tgz", + "integrity": "sha512-r0Ay04Snci87djAsI4U+WNRcSw5S4pOH7qFjd/veA5gC7TbqESR3tcj28ia95L/fYUDw11JKP7uqUKUAfVvV5Q==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", - "es-abstract": "^1.23.1", + "dunder-proto": "^1.0.1", + "es-abstract": "^1.23.6", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "which-builtin-type": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -8245,19 +8360,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -8268,27 +8370,23 @@ "node": ">=0.10.0" } }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true, - "license": "MIT" - }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", + "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" } @@ -8306,7 +8404,7 @@ "node": ">=8" } }, - "node_modules/resolve-from": { + "node_modules/resolve-cwd/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", @@ -8316,10 +8414,30 @@ "node": ">=8" } }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, "node_modules/resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", "dev": true, "license": "MIT", "engines": { @@ -8337,76 +8455,6 @@ "node": ">=0.10.0" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "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/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/rrweb-cssom": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", - "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==", - "dev": true, - "license": "MIT" - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -8432,15 +8480,16 @@ } }, "node_modules/safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", + "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": { @@ -8450,37 +8499,16 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", - "is-regex": "^1.1.4" + "is-regex": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -8489,26 +8517,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "license": "MIT" - }, - "node_modules/saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dev": true, - "license": "ISC", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" - } - }, "node_modules/selfsigned": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", @@ -8591,16 +8599,73 @@ } }, "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "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", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "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" @@ -8639,62 +8704,6 @@ "node": ">=8" } }, - "node_modules/snazzy": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/snazzy/-/snazzy-9.0.0.tgz", - "integrity": "sha512-8QZmJb11OiYaUP90Nnjqcj/LEpO8CLgChnP87Wqjv5tNB4djwHaz27VO2usSRR0NmViapeGW04p0aWAMhxxLXg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "inherits": "^2.0.4", - "minimist": "^1.2.5", - "readable-stream": "^3.6.0", - "standard-json": "^1.1.0", - "strip-ansi": "^6.0.0", - "text-table": "^0.2.0" - }, - "bin": { - "snazzy": "bin/cmd.js" - } - }, - "node_modules/snazzy/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/snazzy/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -8716,18 +8725,6 @@ "source-map": "^0.6.0" } }, - "node_modules/spawn-sync": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz", - "integrity": "sha512-9DWBgrgYZzNghseho0JOuh+5fg9u6QWhAWa51QC7+U5rCheZ/j1DrEZnyE0RBBRqZ9uEXGPgSSM0nky6burpVw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "concat-stream": "^1.4.7", - "os-shim": "^0.1.2" - } - }, "node_modules/spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", @@ -8771,124 +8768,34 @@ "dev": true, "license": "BSD-3-Clause" }, + "node_modules/stable-hash": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.4.tgz", + "integrity": "sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==", + "dev": true, + "license": "MIT" + }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/standard": { - "version": "17.1.2", - "resolved": "https://registry.npmjs.org/standard/-/standard-17.1.2.tgz", - "integrity": "sha512-WLm12WoXveKkvnPnPnaFUUHuOB2cUdAsJ4AiGHL2G0UNMrcRAWY2WriQaV8IQ3oRmYr0AWUbLNr94ekYFAHOrA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "eslint": "^8.41.0", - "eslint-config-standard": "17.1.0", - "eslint-config-standard-jsx": "^11.0.0", - "eslint-plugin-import": "^2.27.5", - "eslint-plugin-n": "^15.7.0", - "eslint-plugin-promise": "^6.1.1", - "eslint-plugin-react": "^7.36.1", - "standard-engine": "^15.1.0", - "version-guard": "^1.1.1" - }, - "bin": { - "standard": "bin/cmd.cjs" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/standard-engine": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-15.1.0.tgz", - "integrity": "sha512-VHysfoyxFu/ukT+9v49d4BRXIokFRZuH3z1VRxzFArZdjSCFpro6rEIU3ji7e4AoAtuSfKBkiOmsrDqKW5ZSRw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "get-stdin": "^8.0.0", - "minimist": "^1.2.6", - "pkg-conf": "^3.1.0", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/standard-json": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/standard-json/-/standard-json-1.1.0.tgz", - "integrity": "sha512-nkonX+n5g3pyVBvJZmvRlFtT/7JyLbNh4CtrYC3Qfxihgs8PKX52f6ONKQXORStuBWJ5PI83EUrNXme7LKfiTQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "concat-stream": "^2.0.0" - }, - "bin": { - "standard-json": "bin.js" - } - }, - "node_modules/standard-json/node_modules/concat-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, - "engines": [ - "node >= 6.0" - ], "license": "MIT", "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" + "engines": { + "node": ">=8" } }, "node_modules/string-length": { @@ -8993,24 +8900,25 @@ } }, "node_modules/string.prototype.matchall": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", - "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", + "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "regexp.prototype.flags": "^1.5.2", + "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.0.6" + "side-channel": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -9031,16 +8939,19 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "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.0", - "es-object-atoms": "^1.0.0" + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -9050,16 +8961,20 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "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" } @@ -9133,13 +9048,13 @@ } }, "node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", + "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", "dev": true, "license": "MIT", "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -9211,12 +9126,15 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=6" + } }, "node_modules/test-exclude": { "version": "7.0.1", @@ -9233,12 +9151,31 @@ "node": ">=18" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/tmpl": { "version": "1.0.5", @@ -9260,35 +9197,6 @@ "node": ">=8.0" } }, - "node_modules/tough-cookie": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tr46": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", - "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/trim-newlines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", @@ -9299,40 +9207,17 @@ "node": ">=8" } }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "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", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "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", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "node_modules/ts-api-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", + "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" } }, "node_modules/tsd": { @@ -9367,6 +9252,13 @@ "node": ">=8" } }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, "node_modules/tunnel": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", @@ -9414,32 +9306,32 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -9449,18 +9341,19 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" }, "engines": { "node": ">= 0.4" @@ -9470,18 +9363,18 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-proto": "^1.0.3", "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" }, "engines": { "node": ">= 0.4" @@ -9490,17 +9383,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "dev": true, - "license": "MIT" - }, "node_modules/typescript": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", - "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", "dev": true, "license": "Apache-2.0", "bin": { @@ -9511,17 +9397,43 @@ "node": ">=14.17" } }, + "node_modules/typescript-eslint": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.18.1.tgz", + "integrity": "sha512-Mlaw6yxuaDEPQvb/2Qwu3/TfgeBHy9iTJ3mTwe7OvpPmF6KPQjVOfGyEJpPv6Ez2C34OODChhXrzYw/9phI0MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.18.1", + "@typescript-eslint/parser": "8.18.1", + "@typescript-eslint/utils": "8.18.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", + "call-bound": "^1.0.3", "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^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" @@ -9547,6 +9459,16 @@ "dev": true, "license": "MIT" }, + "node_modules/undici/node_modules/@fastify/busboy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, "node_modules/unicorn-magic": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", @@ -9560,16 +9482,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/update-browserslist-db": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", @@ -9611,24 +9523,6 @@ "punycode": "^2.1.0" } }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, - "license": "MIT" - }, "node_modules/v8-to-istanbul": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", @@ -9655,29 +9549,6 @@ "spdx-expression-parse": "^3.0.0" } }, - "node_modules/version-guard": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/version-guard/-/version-guard-1.1.3.tgz", - "integrity": "sha512-JwPr6erhX53EWH/HCSzfy1tTFrtPXUe927wdM1jqBBeYp1OM+qPHjWbsvv6pIBduqdgxxS+ScfG7S28pzyr2DQ==", - "dev": true, - "license": "0BSD", - "engines": { - "node": ">=0.10.48" - } - }, - "node_modules/w3c-xmlserializer": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", - "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -9688,53 +9559,6 @@ "makeerror": "1.0.12" } }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-encoding": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", - "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/whatwg-mimetype": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/whatwg-url": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz", - "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tr46": "^5.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -9752,41 +9576,45 @@ } }, "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", "dev": true, "license": "MIT", "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" + "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.1.4", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", - "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", "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.0.5", - "is-finalizationregistry": "^1.0.2", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", + "is-regex": "^1.2.1", "is-weakref": "^1.0.2", "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", + "which-boxed-primitive": "^1.1.0", "which-collection": "^1.0.2", - "which-typed-array": "^1.1.15" + "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" @@ -9815,16 +9643,17 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz", + "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "for-each": "^0.3.3", - "gopd": "^1.0.1", + "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" }, "engines": { @@ -9989,33 +9818,6 @@ } } }, - "node_modules/xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/xml-name-validator": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", - "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true, - "license": "MIT" - }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -10033,6 +9835,19 @@ "dev": true, "license": "ISC" }, + "node_modules/yaml": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz", + "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", @@ -10119,6 +9934,19 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/yoctocolors": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.1.tgz", + "integrity": "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } diff --git a/deps/undici/src/package.json b/deps/undici/src/package.json index 021466738c9f19..5ce5b97f9352f8 100644 --- a/deps/undici/src/package.json +++ b/deps/undici/src/package.json @@ -1,6 +1,6 @@ { "name": "undici", - "version": "6.21.0", + "version": "7.2.0", "description": "An HTTP/1.1 client, written from scratch for Node.js", "homepage": "https://undici.nodejs.org", "bugs": { @@ -62,22 +62,23 @@ "main": "index.js", "types": "index.d.ts", "scripts": { - "build:node": "npx esbuild@0.19.10 index-fetch.js --bundle --platform=node --outfile=undici-fetch.js --define:esbuildDetection=1 --keep-names && node scripts/strip-comments.js", - "prebuild:wasm": "node build/wasm.js --prebuild", + "build:node": "esbuild index-fetch.js --bundle --platform=node --outfile=undici-fetch.js --define:esbuildDetection=1 --keep-names && node scripts/strip-comments.js", "build:wasm": "node build/wasm.js --docker", - "lint": "standard | snazzy", - "lint:fix": "standard --fix | snazzy", + "generate-pem": "node scripts/generate-pem.js", + "lint": "eslint --cache", + "lint:fix": "eslint --fix --cache", "test": "npm run test:javascript && cross-env NODE_V8_COVERAGE= npm run test:typescript", - "test:javascript": "node scripts/generate-pem && npm run test:unit && npm run test:node-fetch && npm run test:cache && npm run test:interceptors && npm run test:fetch && npm run test:cookies && npm run test:eventsource && npm run test:wpt && npm run test:websocket && npm run test:node-test && npm run test:jest", - "test:javascript:withoutintl": "node scripts/generate-pem && npm run test:unit && npm run test:node-fetch && npm run test:fetch:nobuild && npm run test:cache && npm run test:interceptors && npm run test:cookies && npm run test:eventsource:nobuild && npm run test:wpt:withoutintl && npm run test:node-test", + "test:javascript": "npm run test:javascript:no-jest && npm run test:jest", + "test:javascript:no-jest": "npm run generate-pem && npm run test:unit && npm run test:node-fetch && npm run test:cache && npm run test:cache-interceptor && npm run test:interceptors && npm run test:fetch && npm run test:cookies && npm run test:eventsource && npm run test:wpt && npm run test:websocket && npm run test:node-test && npm run test:cache-tests", + "test:javascript:without-intl": "npm run test:javascript:no-jest", "test:busboy": "borp -p \"test/busboy/*.js\"", "test:cache": "borp -p \"test/cache/*.js\"", + "test:sqlite": "NODE_OPTIONS=--experimental-sqlite borp -p \"test/cache-interceptor/*.js\"", + "test:cache-interceptor": "borp -p \"test/cache-interceptor/*.js\"", "test:cookies": "borp -p \"test/cookie/*.js\"", - "test:eventsource": "npm run build:node && npm run test:eventsource:nobuild", - "test:eventsource:nobuild": "borp --expose-gc -p \"test/eventsource/*.js\"", + "test:eventsource": "npm run build:node && borp --expose-gc -p \"test/eventsource/*.js\"", "test:fuzzing": "node test/fuzzing/fuzzing.test.js", - "test:fetch": "npm run build:node && npm run test:fetch:nobuild", - "test:fetch:nobuild": "borp --timeout 180000 --expose-gc --concurrency 1 -p \"test/fetch/*.js\" && npm run test:webidl && npm run test:busboy", + "test:fetch": "npm run build:node && borp --timeout 180000 --expose-gc --concurrency 1 -p \"test/fetch/*.js\" && npm run test:webidl && npm run test:busboy", "test:h2": "npm run test:h2:core && npm run test:h2:fetch", "test:h2:core": "borp -p \"test/http2*.js\"", "test:h2:fetch": "npm run build:node && borp -p \"test/fetch/http2*.js\"", @@ -88,13 +89,14 @@ "test:node-test": "borp -p \"test/node-test/**/*.js\"", "test:tdd": "borp --expose-gc -p \"test/*.js\"", "test:tdd:node-test": "borp -p \"test/node-test/**/*.js\" -w", - "test:typescript": "tsd && tsc test/imports/undici-import.ts --typeRoots ./types && tsc ./types/*.d.ts --noEmit --typeRoots ./types", + "test:typescript": "tsd && tsc test/imports/undici-import.ts --typeRoots ./types --noEmit && tsc ./types/*.d.ts --noEmit --typeRoots ./types", "test:webidl": "borp -p \"test/webidl/*.js\"", "test:websocket": "borp -p \"test/websocket/*.js\"", "test:websocket:autobahn": "node test/autobahn/client.js", "test:websocket:autobahn:report": "node test/autobahn/report.js", - "test:wpt": "node test/wpt/start-fetch.mjs && node test/wpt/start-FileAPI.mjs && node test/wpt/start-mimesniff.mjs && node test/wpt/start-xhr.mjs && node test/wpt/start-websockets.mjs && node test/wpt/start-cacheStorage.mjs && node test/wpt/start-eventsource.mjs", + "test:wpt": "node test/wpt/start-fetch.mjs && node test/wpt/start-mimesniff.mjs && node test/wpt/start-xhr.mjs && node test/wpt/start-websockets.mjs && node test/wpt/start-cacheStorage.mjs && node test/wpt/start-eventsource.mjs", "test:wpt:withoutintl": "node test/wpt/start-fetch.mjs && node test/wpt/start-mimesniff.mjs && node test/wpt/start-xhr.mjs && node test/wpt/start-cacheStorage.mjs && node test/wpt/start-eventsource.mjs", + "test:cache-tests": "node test/cache-interceptor/cache-tests.mjs --ci", "coverage": "npm run coverage:clean && cross-env NODE_V8_COVERAGE=./coverage/tmp npm run test:javascript && npm run coverage:report", "coverage:ci": "npm run coverage:clean && cross-env NODE_V8_COVERAGE=./coverage/tmp npm run test:javascript && npm run coverage:report:ci", "coverage:clean": "node ./scripts/clean-coverage.js", @@ -105,43 +107,30 @@ "prepare": "husky && node ./scripts/platform-shell.js" }, "devDependencies": { - "@fastify/busboy": "2.1.1", + "@fastify/busboy": "3.1.0", "@matteo.collina/tspl": "^0.1.1", - "@sinonjs/fake-timers": "^11.1.0", - "@types/node": "~18.19.50", + "@sinonjs/fake-timers": "^12.0.0", + "@types/node": "^18.19.50", "abort-controller": "^3.0.0", - "borp": "^0.15.0", + "borp": "^0.19.0", "c8": "^10.0.0", "cross-env": "^7.0.3", "dns-packet": "^5.4.0", + "esbuild": "^0.24.0", + "eslint": "^9.9.0", "fast-check": "^3.17.1", - "form-data": "^4.0.0", - "formdata-node": "^6.0.3", "https-pem": "^3.0.0", "husky": "^9.0.7", "jest": "^29.0.2", - "jsdom": "^24.0.0", + "neostandard": "^0.12.0", "node-forge": "^1.3.1", - "pre-commit": "^1.2.2", "proxy": "^2.1.1", - "snazzy": "^9.0.0", - "standard": "^17.0.0", - "tsd": "^0.31.0", - "typescript": "^5.0.2", + "tsd": "^0.31.2", + "typescript": "^5.6.2", "ws": "^8.11.0" }, "engines": { - "node": ">=18.17" - }, - "standard": { - "env": [ - "jest" - ], - "ignore": [ - "lib/llhttp/constants.js", - "lib/llhttp/utils.js", - "test/fixtures/wpt" - ] + "node": ">=20.18.1" }, "tsd": { "directory": "test/types", diff --git a/deps/undici/src/scripts/generate-pem.js b/deps/undici/src/scripts/generate-pem.js index 0d7e628e209fa9..88ac5c8392f610 100644 --- a/deps/undici/src/scripts/generate-pem.js +++ b/deps/undici/src/scripts/generate-pem.js @@ -1,3 +1,4 @@ +'use strict' /* istanbul ignore file */ require('https-pem/install') diff --git a/deps/undici/src/scripts/generate-undici-types-package-json.js b/deps/undici/src/scripts/generate-undici-types-package-json.js index 78095ae6d5e4a0..ea2dd07b5f9a29 100644 --- a/deps/undici/src/scripts/generate-undici-types-package-json.js +++ b/deps/undici/src/scripts/generate-undici-types-package-json.js @@ -1,3 +1,5 @@ +'use strict' + const fs = require('node:fs') const path = require('node:path') diff --git a/deps/undici/src/scripts/strip-comments.js b/deps/undici/src/scripts/strip-comments.js index 9e4396a5dea8e6..d687a268090311 100644 --- a/deps/undici/src/scripts/strip-comments.js +++ b/deps/undici/src/scripts/strip-comments.js @@ -3,6 +3,8 @@ const { readFileSync, writeFileSync } = require('node:fs') const { transcode } = require('node:buffer') -const buffer = transcode(readFileSync('./undici-fetch.js'), 'utf8', 'latin1') +const buffer = transcode + ? transcode(readFileSync('./undici-fetch.js'), 'utf8', 'latin1') + : readFileSync('./undici-fetch.js') writeFileSync('./undici-fetch.js', buffer.toString('latin1')) diff --git a/deps/undici/src/scripts/verifyVersion.js b/deps/undici/src/scripts/verifyVersion.js index 8ad2d192a666d8..dbaafa245d5211 100644 --- a/deps/undici/src/scripts/verifyVersion.js +++ b/deps/undici/src/scripts/verifyVersion.js @@ -1,3 +1,5 @@ +'use strict' + /* istanbul ignore file */ const [major, minor, patch] = process.versions.node.split('.').map(v => Number(v)) diff --git a/deps/undici/src/types/agent.d.ts b/deps/undici/src/types/agent.d.ts index 58081ce9372633..ee313b5209b80c 100644 --- a/deps/undici/src/types/agent.d.ts +++ b/deps/undici/src/types/agent.d.ts @@ -1,17 +1,17 @@ import { URL } from 'url' import Pool from './pool' -import Dispatcher from "./dispatcher"; +import Dispatcher from './dispatcher' export default Agent -declare class Agent extends Dispatcher{ - constructor(opts?: Agent.Options) +declare class Agent extends Dispatcher { + constructor (opts?: Agent.Options) /** `true` after `dispatcher.close()` has been called. */ - closed: boolean; + closed: boolean /** `true` after `dispatcher.destroyed()` has been called or `dispatcher.close()` has been called and the dispatcher shutdown has completed. */ - destroyed: boolean; + destroyed: boolean /** Dispatches a request. */ - dispatch(options: Agent.DispatchOptions, handler: Dispatcher.DispatchHandlers): boolean; + dispatch (options: Agent.DispatchOptions, handler: Dispatcher.DispatchHandler): boolean } declare namespace Agent { @@ -21,7 +21,7 @@ declare namespace Agent { /** Integer. Default: `0` */ maxRedirections?: number; - interceptors?: { Agent?: readonly Dispatcher.DispatchInterceptor[] } & Pool.Options["interceptors"] + interceptors?: { Agent?: readonly Dispatcher.DispatchInterceptor[] } & Pool.Options['interceptors'] } export interface DispatchOptions extends Dispatcher.DispatchOptions { diff --git a/deps/undici/src/types/api.d.ts b/deps/undici/src/types/api.d.ts index 400341dddc06f7..e58d08f61ccd84 100644 --- a/deps/undici/src/types/api.d.ts +++ b/deps/undici/src/types/api.d.ts @@ -2,42 +2,42 @@ import { URL, UrlObject } from 'url' import { Duplex } from 'stream' import Dispatcher from './dispatcher' -export { - request, - stream, - pipeline, - connect, - upgrade, -} - /** Performs an HTTP request. */ -declare function request( +declare function request ( url: string | URL | UrlObject, - options?: { dispatcher?: Dispatcher } & Omit & Partial>, -): Promise; + options?: { dispatcher?: Dispatcher } & Omit, 'origin' | 'path' | 'method'> & Partial>, +): Promise> /** A faster version of `request`. */ -declare function stream( +declare function stream ( url: string | URL | UrlObject, - options: { dispatcher?: Dispatcher } & Omit, - factory: Dispatcher.StreamFactory -): Promise; + options: { dispatcher?: Dispatcher } & Omit, 'origin' | 'path'>, + factory: Dispatcher.StreamFactory +): Promise> /** For easy use with `stream.pipeline`. */ -declare function pipeline( +declare function pipeline ( url: string | URL | UrlObject, - options: { dispatcher?: Dispatcher } & Omit, - handler: Dispatcher.PipelineHandler -): Duplex; + options: { dispatcher?: Dispatcher } & Omit, 'origin' | 'path'>, + handler: Dispatcher.PipelineHandler +): Duplex /** Starts two-way communications with the requested resource. */ -declare function connect( +declare function connect ( url: string | URL | UrlObject, - options?: { dispatcher?: Dispatcher } & Omit -): Promise; + options?: { dispatcher?: Dispatcher } & Omit, 'origin' | 'path'> +): Promise> /** Upgrade to a different protocol. */ -declare function upgrade( +declare function upgrade ( url: string | URL | UrlObject, options?: { dispatcher?: Dispatcher } & Omit -): Promise; +): Promise + +export { + request, + stream, + pipeline, + connect, + upgrade +} diff --git a/deps/undici/src/types/balanced-pool.d.ts b/deps/undici/src/types/balanced-pool.d.ts index 7f930f4108c092..733239c0bf0357 100644 --- a/deps/undici/src/types/balanced-pool.d.ts +++ b/deps/undici/src/types/balanced-pool.d.ts @@ -4,26 +4,26 @@ import { URL } from 'url' export default BalancedPool -type BalancedPoolConnectOptions = Omit; +type BalancedPoolConnectOptions = Omit declare class BalancedPool extends Dispatcher { - constructor(url: string | string[] | URL | URL[], options?: Pool.Options); + constructor (url: string | string[] | URL | URL[], options?: Pool.Options) - addUpstream(upstream: string | URL): BalancedPool; - removeUpstream(upstream: string | URL): BalancedPool; - upstreams: Array; + addUpstream (upstream: string | URL): BalancedPool + removeUpstream (upstream: string | URL): BalancedPool + upstreams: Array /** `true` after `pool.close()` has been called. */ - closed: boolean; + closed: boolean /** `true` after `pool.destroyed()` has been called or `pool.close()` has been called and the pool shutdown has completed. */ - destroyed: boolean; + destroyed: boolean // Override dispatcher APIs. - override connect( + override connect ( options: BalancedPoolConnectOptions - ): Promise; - override connect( + ): Promise + override connect ( options: BalancedPoolConnectOptions, callback: (err: Error | null, data: Dispatcher.ConnectData) => void - ): void; + ): void } diff --git a/deps/undici/src/types/cache-interceptor.d.ts b/deps/undici/src/types/cache-interceptor.d.ts new file mode 100644 index 00000000000000..0ff88261e59c1e --- /dev/null +++ b/deps/undici/src/types/cache-interceptor.d.ts @@ -0,0 +1,172 @@ +import { Readable, Writable } from 'node:stream' + +export default CacheHandler + +declare namespace CacheHandler { + export type CacheMethods = 'GET' | 'HEAD' | 'OPTIONS' | 'TRACE' + + export interface CacheHandlerOptions { + store: CacheStore + + cacheByDefault?: number + + type?: CacheOptions['type'] + } + + export interface CacheOptions { + store?: CacheStore + + /** + * The methods to cache + * Note we can only cache safe methods. Unsafe methods (i.e. PUT, POST) + * invalidate the cache for a origin. + * @see https://www.rfc-editor.org/rfc/rfc9111.html#name-invalidating-stored-respons + * @see https://www.rfc-editor.org/rfc/rfc9110#section-9.2.1 + */ + methods?: CacheMethods[] + + /** + * RFC9111 allows for caching responses that we aren't explicitly told to + * cache or to not cache. + * @see https://www.rfc-editor.org/rfc/rfc9111.html#section-3-5 + * @default undefined + */ + cacheByDefault?: number + + /** + * TODO docs + * @default 'shared' + */ + type?: 'shared' | 'private' + } + + export interface CacheControlDirectives { + 'max-stale'?: number; + 'min-fresh'?: number; + 'max-age'?: number; + 's-maxage'?: number; + 'stale-while-revalidate'?: number; + 'stale-if-error'?: number; + public?: true; + private?: true | string[]; + 'no-store'?: true; + 'no-cache'?: true | string[]; + 'must-revalidate'?: true; + 'proxy-revalidate'?: true; + immutable?: true; + 'no-transform'?: true; + 'must-understand'?: true; + 'only-if-cached'?: true; + } + + export interface CacheKey { + origin: string + method: string + path: string + headers?: Record + } + + export interface CacheValue { + statusCode: number + statusMessage: string + headers: Record + vary?: Record + etag?: string + cacheControlDirectives?: CacheControlDirectives + cachedAt: number + staleAt: number + deleteAt: number + } + + export interface DeleteByUri { + origin: string + method: string + path: string + } + + type GetResult = { + statusCode: number + statusMessage: string + headers: Record + vary?: Record + etag?: string + body: null | Readable | Iterable | AsyncIterable | Buffer | Iterable | AsyncIterable | string + cacheControlDirectives: CacheControlDirectives, + cachedAt: number + staleAt: number + deleteAt: number + } + + /** + * Underlying storage provider for cached responses + */ + export interface CacheStore { + get(key: CacheKey): GetResult | Promise | undefined + + createWriteStream(key: CacheKey, val: CacheValue): Writable | undefined + + delete(key: CacheKey): void | Promise + } + + export interface MemoryCacheStoreOpts { + /** + * @default Infinity + */ + maxCount?: number + + /** + * @default Infinity + */ + maxSize?: number + + /** + * @default Infinity + */ + maxEntrySize?: number + + errorCallback?: (err: Error) => void + } + + export class MemoryCacheStore implements CacheStore { + constructor (opts?: MemoryCacheStoreOpts) + + get (key: CacheKey): GetResult | Promise | undefined + + createWriteStream (key: CacheKey, value: CacheValue): Writable | undefined + + delete (key: CacheKey): void | Promise + } + + export interface SqliteCacheStoreOpts { + /** + * Location of the database + * @default ':memory:' + */ + location?: string + + /** + * @default Infinity + */ + maxCount?: number + + /** + * @default Infinity + */ + maxEntrySize?: number + } + + export class SqliteCacheStore implements CacheStore { + constructor (opts?: SqliteCacheStoreOpts) + + /** + * Closes the connection to the database + */ + close (): void + + get (key: CacheKey): GetResult | Promise | undefined + + createWriteStream (key: CacheKey, value: CacheValue): Writable | undefined + + delete (key: CacheKey): void | Promise + } +} diff --git a/deps/undici/src/types/client.d.ts b/deps/undici/src/types/client.d.ts index d0a5379f33cd70..f14e809209538f 100644 --- a/deps/undici/src/types/client.d.ts +++ b/deps/undici/src/types/client.d.ts @@ -1,30 +1,29 @@ import { URL } from 'url' -import { TlsOptions } from 'tls' import Dispatcher from './dispatcher' -import buildConnector from "./connector"; +import buildConnector from './connector' -type ClientConnectOptions = Omit; +type ClientConnectOptions = Omit /** * A basic HTTP/1.1 client, mapped on top a single TCP/TLS connection. Pipelining is disabled by default. */ export class Client extends Dispatcher { - constructor(url: string | URL, options?: Client.Options); + constructor (url: string | URL, options?: Client.Options) /** Property to get and set the pipelining factor. */ - pipelining: number; + pipelining: number /** `true` after `client.close()` has been called. */ - closed: boolean; + closed: boolean /** `true` after `client.destroyed()` has been called or `client.close()` has been called and the client shutdown has completed. */ - destroyed: boolean; + destroyed: boolean // Override dispatcher APIs. - override connect( + override connect ( options: ClientConnectOptions - ): Promise; - override connect( + ): Promise + override connect ( options: ClientConnectOptions, callback: (err: Error | null, data: Dispatcher.ConnectData) => void - ): void; + ): void } export declare namespace Client { @@ -105,4 +104,4 @@ export declare namespace Client { } } -export default Client; +export default Client diff --git a/deps/undici/src/types/cookies.d.ts b/deps/undici/src/types/cookies.d.ts index aa38cae49d7743..f746d35853fe5a 100644 --- a/deps/undici/src/types/cookies.d.ts +++ b/deps/undici/src/types/cookies.d.ts @@ -26,3 +26,5 @@ export function getCookies (headers: Headers): Record export function getSetCookies (headers: Headers): Cookie[] export function setCookie (headers: Headers, cookie: Cookie): void + +export function parseCookie (cookie: string): Cookie | null diff --git a/deps/undici/src/types/diagnostics-channel.d.ts b/deps/undici/src/types/diagnostics-channel.d.ts index a037d1e0b2cea5..0c8477e16a8cda 100644 --- a/deps/undici/src/types/diagnostics-channel.d.ts +++ b/deps/undici/src/types/diagnostics-channel.d.ts @@ -1,7 +1,7 @@ -import { Socket } from "net"; -import { URL } from "url"; -import Connector from "./connector"; -import Dispatcher from "./dispatcher"; +import { Socket } from 'net' +import { URL } from 'url' +import buildConnector from './connector' +import Dispatcher from './dispatcher' declare namespace DiagnosticsChannel { interface Request { @@ -16,15 +16,15 @@ declare namespace DiagnosticsChannel { statusText: string; headers: Array; } - type Error = unknown; + type Error = unknown interface ConnectParams { - host: URL["host"]; - hostname: URL["hostname"]; - protocol: URL["protocol"]; - port: URL["port"]; + host: URL['host']; + hostname: URL['hostname']; + protocol: URL['protocol']; + port: URL['port']; servername: string | null; } - type Connector = Connector.connector; + type Connector = buildConnector.connector export interface RequestCreateMessage { request: Request; } diff --git a/deps/undici/src/types/dispatcher.d.ts b/deps/undici/src/types/dispatcher.d.ts index 1b4c9c74a5d2ce..17bb44166fa028 100644 --- a/deps/undici/src/types/dispatcher.d.ts +++ b/deps/undici/src/types/dispatcher.d.ts @@ -6,98 +6,96 @@ import { IncomingHttpHeaders } from './header' import BodyReadable from './readable' import { FormData } from './formdata' import Errors from './errors' +import { Autocomplete } from './utility' -type AbortSignal = unknown; +type AbortSignal = unknown export default Dispatcher /** Dispatcher is the core API used to dispatch requests. */ declare class Dispatcher extends EventEmitter { /** Dispatches a request. This API is expected to evolve through semver-major versions and is less stable than the preceding higher level APIs. It is primarily intended for library developers who implement higher level APIs on top of this. */ - dispatch(options: Dispatcher.DispatchOptions, handler: Dispatcher.DispatchHandlers): boolean; + dispatch (options: Dispatcher.DispatchOptions, handler: Dispatcher.DispatchHandler): boolean /** Starts two-way communications with the requested resource. */ - connect(options: Dispatcher.ConnectOptions): Promise; - connect(options: Dispatcher.ConnectOptions, callback: (err: Error | null, data: Dispatcher.ConnectData) => void): void; + connect(options: Dispatcher.ConnectOptions): Promise> + connect(options: Dispatcher.ConnectOptions, callback: (err: Error | null, data: Dispatcher.ConnectData) => void): void /** Compose a chain of dispatchers */ - compose(dispatchers: Dispatcher.DispatcherComposeInterceptor[]): Dispatcher.ComposedDispatcher; - compose(...dispatchers: Dispatcher.DispatcherComposeInterceptor[]): Dispatcher.ComposedDispatcher; + compose (dispatchers: Dispatcher.DispatcherComposeInterceptor[]): Dispatcher.ComposedDispatcher + compose (...dispatchers: Dispatcher.DispatcherComposeInterceptor[]): Dispatcher.ComposedDispatcher /** Performs an HTTP request. */ - request(options: Dispatcher.RequestOptions): Promise; - request(options: Dispatcher.RequestOptions, callback: (err: Error | null, data: Dispatcher.ResponseData) => void): void; + request(options: Dispatcher.RequestOptions): Promise> + request(options: Dispatcher.RequestOptions, callback: (err: Error | null, data: Dispatcher.ResponseData) => void): void /** For easy use with `stream.pipeline`. */ - pipeline(options: Dispatcher.PipelineOptions, handler: Dispatcher.PipelineHandler): Duplex; + pipeline(options: Dispatcher.PipelineOptions, handler: Dispatcher.PipelineHandler): Duplex /** A faster version of `Dispatcher.request`. */ - stream(options: Dispatcher.RequestOptions, factory: Dispatcher.StreamFactory): Promise; - stream(options: Dispatcher.RequestOptions, factory: Dispatcher.StreamFactory, callback: (err: Error | null, data: Dispatcher.StreamData) => void): void; + stream(options: Dispatcher.RequestOptions, factory: Dispatcher.StreamFactory): Promise> + stream(options: Dispatcher.RequestOptions, factory: Dispatcher.StreamFactory, callback: (err: Error | null, data: Dispatcher.StreamData) => void): void /** Upgrade to a different protocol. */ - upgrade(options: Dispatcher.UpgradeOptions): Promise; - upgrade(options: Dispatcher.UpgradeOptions, callback: (err: Error | null, data: Dispatcher.UpgradeData) => void): void; + upgrade (options: Dispatcher.UpgradeOptions): Promise + upgrade (options: Dispatcher.UpgradeOptions, callback: (err: Error | null, data: Dispatcher.UpgradeData) => void): void /** Closes the client and gracefully waits for enqueued requests to complete before invoking the callback (or returning a promise if no callback is provided). */ - close(): Promise; - close(callback: () => void): void; + close (): Promise + close (callback: () => void): void /** Destroy the client abruptly with the given err. All the pending and running requests will be asynchronously aborted and error. Waits until socket is closed before invoking the callback (or returning a promise if no callback is provided). Since this operation is asynchronously dispatched there might still be some progress on dispatched requests. */ - destroy(): Promise; - destroy(err: Error | null): Promise; - destroy(callback: () => void): void; - destroy(err: Error | null, callback: () => void): void; + destroy (): Promise + destroy (err: Error | null): Promise + destroy (callback: () => void): void + destroy (err: Error | null, callback: () => void): void - on(eventName: 'connect', callback: (origin: URL, targets: readonly Dispatcher[]) => void): this; - on(eventName: 'disconnect', callback: (origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void): this; - on(eventName: 'connectionError', callback: (origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void): this; - on(eventName: 'drain', callback: (origin: URL) => void): this; + on (eventName: 'connect', callback: (origin: URL, targets: readonly Dispatcher[]) => void): this + on (eventName: 'disconnect', callback: (origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void): this + on (eventName: 'connectionError', callback: (origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void): this + on (eventName: 'drain', callback: (origin: URL) => void): this + once (eventName: 'connect', callback: (origin: URL, targets: readonly Dispatcher[]) => void): this + once (eventName: 'disconnect', callback: (origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void): this + once (eventName: 'connectionError', callback: (origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void): this + once (eventName: 'drain', callback: (origin: URL) => void): this - once(eventName: 'connect', callback: (origin: URL, targets: readonly Dispatcher[]) => void): this; - once(eventName: 'disconnect', callback: (origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void): this; - once(eventName: 'connectionError', callback: (origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void): this; - once(eventName: 'drain', callback: (origin: URL) => void): this; + off (eventName: 'connect', callback: (origin: URL, targets: readonly Dispatcher[]) => void): this + off (eventName: 'disconnect', callback: (origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void): this + off (eventName: 'connectionError', callback: (origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void): this + off (eventName: 'drain', callback: (origin: URL) => void): this + addListener (eventName: 'connect', callback: (origin: URL, targets: readonly Dispatcher[]) => void): this + addListener (eventName: 'disconnect', callback: (origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void): this + addListener (eventName: 'connectionError', callback: (origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void): this + addListener (eventName: 'drain', callback: (origin: URL) => void): this - off(eventName: 'connect', callback: (origin: URL, targets: readonly Dispatcher[]) => void): this; - off(eventName: 'disconnect', callback: (origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void): this; - off(eventName: 'connectionError', callback: (origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void): this; - off(eventName: 'drain', callback: (origin: URL) => void): this; + removeListener (eventName: 'connect', callback: (origin: URL, targets: readonly Dispatcher[]) => void): this + removeListener (eventName: 'disconnect', callback: (origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void): this + removeListener (eventName: 'connectionError', callback: (origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void): this + removeListener (eventName: 'drain', callback: (origin: URL) => void): this + prependListener (eventName: 'connect', callback: (origin: URL, targets: readonly Dispatcher[]) => void): this + prependListener (eventName: 'disconnect', callback: (origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void): this + prependListener (eventName: 'connectionError', callback: (origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void): this + prependListener (eventName: 'drain', callback: (origin: URL) => void): this - addListener(eventName: 'connect', callback: (origin: URL, targets: readonly Dispatcher[]) => void): this; - addListener(eventName: 'disconnect', callback: (origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void): this; - addListener(eventName: 'connectionError', callback: (origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void): this; - addListener(eventName: 'drain', callback: (origin: URL) => void): this; + prependOnceListener (eventName: 'connect', callback: (origin: URL, targets: readonly Dispatcher[]) => void): this + prependOnceListener (eventName: 'disconnect', callback: (origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void): this + prependOnceListener (eventName: 'connectionError', callback: (origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void): this + prependOnceListener (eventName: 'drain', callback: (origin: URL) => void): this - removeListener(eventName: 'connect', callback: (origin: URL, targets: readonly Dispatcher[]) => void): this; - removeListener(eventName: 'disconnect', callback: (origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void): this; - removeListener(eventName: 'connectionError', callback: (origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void): this; - removeListener(eventName: 'drain', callback: (origin: URL) => void): this; + listeners (eventName: 'connect'): ((origin: URL, targets: readonly Dispatcher[]) => void)[] + listeners (eventName: 'disconnect'): ((origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void)[] + listeners (eventName: 'connectionError'): ((origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void)[] + listeners (eventName: 'drain'): ((origin: URL) => void)[] - prependListener(eventName: 'connect', callback: (origin: URL, targets: readonly Dispatcher[]) => void): this; - prependListener(eventName: 'disconnect', callback: (origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void): this; - prependListener(eventName: 'connectionError', callback: (origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void): this; - prependListener(eventName: 'drain', callback: (origin: URL) => void): this; + rawListeners (eventName: 'connect'): ((origin: URL, targets: readonly Dispatcher[]) => void)[] + rawListeners (eventName: 'disconnect'): ((origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void)[] + rawListeners (eventName: 'connectionError'): ((origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void)[] + rawListeners (eventName: 'drain'): ((origin: URL) => void)[] - prependOnceListener(eventName: 'connect', callback: (origin: URL, targets: readonly Dispatcher[]) => void): this; - prependOnceListener(eventName: 'disconnect', callback: (origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void): this; - prependOnceListener(eventName: 'connectionError', callback: (origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void): this; - prependOnceListener(eventName: 'drain', callback: (origin: URL) => void): this; - - listeners(eventName: 'connect'): ((origin: URL, targets: readonly Dispatcher[]) => void)[] - listeners(eventName: 'disconnect'): ((origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void)[]; - listeners(eventName: 'connectionError'): ((origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void)[]; - listeners(eventName: 'drain'): ((origin: URL) => void)[]; - - rawListeners(eventName: 'connect'): ((origin: URL, targets: readonly Dispatcher[]) => void)[] - rawListeners(eventName: 'disconnect'): ((origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void)[]; - rawListeners(eventName: 'connectionError'): ((origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError) => void)[]; - rawListeners(eventName: 'drain'): ((origin: URL) => void)[]; - - emit(eventName: 'connect', origin: URL, targets: readonly Dispatcher[]): boolean; - emit(eventName: 'disconnect', origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError): boolean; - emit(eventName: 'connectionError', origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError): boolean; - emit(eventName: 'drain', origin: URL): boolean; + emit (eventName: 'connect', origin: URL, targets: readonly Dispatcher[]): boolean + emit (eventName: 'disconnect', origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError): boolean + emit (eventName: 'connectionError', origin: URL, targets: readonly Dispatcher[], error: Errors.UndiciError): boolean + emit (eventName: 'drain', origin: URL): boolean } declare namespace Dispatcher { export interface ComposedDispatcher extends Dispatcher {} - export type DispatcherComposeInterceptor = (dispatch: Dispatcher['dispatch']) => Dispatcher['dispatch']; + export type DispatcherComposeInterceptor = (dispatch: Dispatcher['dispatch']) => Dispatcher['dispatch'] export interface DispatchOptions { origin?: string | URL; path: string; @@ -105,12 +103,12 @@ declare namespace Dispatcher { /** Default: `null` */ body?: string | Buffer | Uint8Array | Readable | null | FormData; /** Default: `null` */ - headers?: IncomingHttpHeaders | string[] | Iterable<[string, string | string[] | undefined]> | null; + headers?: Record | IncomingHttpHeaders | string[] | Iterable<[string, string | string[] | undefined]> | null; /** Query string params to be embedded in the request URL. Default: `null` */ query?: Record; /** Whether the requests can be safely retried or not. If `false` the request won't be sent until all preceding requests in the pipeline have completed. Default: `true` if `method` is `HEAD` or `GET`. */ idempotent?: boolean; - /** Whether the response is expected to take a long time and would end up blocking the pipeline. When this is set to `true` further pipelining will be avoided on the same connection until headers have been received. */ + /** Whether the response is expected to take a long time and would end up blocking the pipeline. When this is set to `true` further pipelining will be avoided on the same connection until headers have been received. Defaults to `method !== 'HEAD'`. */ blocking?: boolean; /** Upgrade the request. Should be used to specify the kind of upgrade i.e. `'Websocket'`. Default: `method === 'CONNECT' || null`. */ upgrade?: boolean | string | null; @@ -122,10 +120,10 @@ declare namespace Dispatcher { reset?: boolean; /** Whether Undici should throw an error upon receiving a 4xx or 5xx response from the server. Defaults to false */ throwOnError?: boolean; - /** For H2, it appends the expect: 100-continue header, and halts the request body until a 100-continue is received from the remote server*/ + /** For H2, it appends the expect: 100-continue header, and halts the request body until a 100-continue is received from the remote server */ expectContinue?: boolean; } - export interface ConnectOptions { + export interface ConnectOptions { origin: string | URL; path: string; /** Default: `null` */ @@ -133,17 +131,17 @@ declare namespace Dispatcher { /** Default: `null` */ signal?: AbortSignal | EventEmitter | null; /** This argument parameter is passed through to `ConnectData` */ - opaque?: unknown; + opaque?: TOpaque; /** Default: 0 */ maxRedirections?: number; /** Default: false */ redirectionLimitReached?: boolean; /** Default: `null` */ - responseHeader?: 'raw' | null; + responseHeaders?: 'raw' | null; } - export interface RequestOptions extends DispatchOptions { + export interface RequestOptions extends DispatchOptions { /** Default: `null` */ - opaque?: unknown; + opaque?: TOpaque; /** Default: `null` */ signal?: AbortSignal | EventEmitter | null; /** Default: 0 */ @@ -153,11 +151,11 @@ declare namespace Dispatcher { /** Default: `null` */ onInfo?: (info: { statusCode: number, headers: Record }) => void; /** Default: `null` */ - responseHeader?: 'raw' | null; + responseHeaders?: 'raw' | null; /** Default: `64 KiB` */ highWaterMark?: number; } - export interface PipelineOptions extends RequestOptions { + export interface PipelineOptions extends RequestOptions { /** `true` if the `handler` will return an object stream. Default: `false` */ objectMode?: boolean; } @@ -176,65 +174,90 @@ declare namespace Dispatcher { /** Default: false */ redirectionLimitReached?: boolean; /** Default: `null` */ - responseHeader?: 'raw' | null; + responseHeaders?: 'raw' | null; } - export interface ConnectData { + export interface ConnectData { statusCode: number; headers: IncomingHttpHeaders; socket: Duplex; - opaque: unknown; + opaque: TOpaque; } - export interface ResponseData { + export interface ResponseData { statusCode: number; headers: IncomingHttpHeaders; body: BodyReadable & BodyMixin; trailers: Record; - opaque: unknown; + opaque: TOpaque; context: object; } - export interface PipelineHandlerData { + export interface PipelineHandlerData { statusCode: number; headers: IncomingHttpHeaders; - opaque: unknown; + opaque: TOpaque; body: BodyReadable; context: object; } - export interface StreamData { - opaque: unknown; + export interface StreamData { + opaque: TOpaque; trailers: Record; } - export interface UpgradeData { + export interface UpgradeData { headers: IncomingHttpHeaders; socket: Duplex; - opaque: unknown; + opaque: TOpaque; } - export interface StreamFactoryData { + export interface StreamFactoryData { statusCode: number; headers: IncomingHttpHeaders; - opaque: unknown; + opaque: TOpaque; context: object; } - export type StreamFactory = (data: StreamFactoryData) => Writable; - export interface DispatchHandlers { + export type StreamFactory = (data: StreamFactoryData) => Writable + + export interface DispatchController { + get aborted () : boolean + get paused () : boolean + get reason () : Error | null + abort (reason: Error): void + pause(): void + resume(): void + } + + export interface DispatchHandler { + onRequestStart?(controller: DispatchController, context: any): void; + onRequestUpgrade?(controller: DispatchController, statusCode: number, headers: IncomingHttpHeaders, socket: Duplex): void; + onResponseStart?(controller: DispatchController, statusCode: number, headers: IncomingHttpHeaders, statusMessage?: string): void; + onResponseData?(controller: DispatchController, chunk: Buffer): void; + onResponseEnd?(controller: DispatchController, trailers: IncomingHttpHeaders): void; + onResponseError?(controller: DispatchController, error: Error): void; + /** Invoked before request is dispatched on socket. May be invoked multiple times when a request is retried when the request at the head of the pipeline fails. */ + /** @deprecated */ onConnect?(abort: (err?: Error) => void): void; /** Invoked when an error has occurred. */ + /** @deprecated */ onError?(err: Error): void; /** Invoked when request is upgraded either due to a `Upgrade` header or `CONNECT` method. */ + /** @deprecated */ onUpgrade?(statusCode: number, headers: Buffer[] | string[] | null, socket: Duplex): void; /** Invoked when response is received, before headers have been read. **/ + /** @deprecated */ onResponseStarted?(): void; /** Invoked when statusCode and headers have been received. May be invoked multiple times due to 1xx informational headers. */ + /** @deprecated */ onHeaders?(statusCode: number, headers: Buffer[], resume: () => void, statusText: string): boolean; /** Invoked when response payload data is received. */ + /** @deprecated */ onData?(chunk: Buffer): boolean; /** Invoked when response payload and trailers have been received and the request has completed. */ + /** @deprecated */ onComplete?(trailers: string[] | null): void; /** Invoked when a body chunk is sent to the server. May be invoked multiple times for chunked requests */ + /** @deprecated */ onBodySent?(chunkSize: number, totalBytesSent: number): void; } - export type PipelineHandler = (data: PipelineHandlerData) => Readable; - export type HttpMethod = 'GET' | 'HEAD' | 'POST' | 'PUT' | 'DELETE' | 'CONNECT' | 'OPTIONS' | 'TRACE' | 'PATCH'; + export type PipelineHandler = (data: PipelineHandlerData) => Readable + export type HttpMethod = Autocomplete<'GET' | 'HEAD' | 'POST' | 'PUT' | 'DELETE' | 'CONNECT' | 'OPTIONS' | 'TRACE' | 'PATCH'> /** * @link https://fetch.spec.whatwg.org/#body-mixin diff --git a/deps/undici/src/types/env-http-proxy-agent.d.ts b/deps/undici/src/types/env-http-proxy-agent.d.ts index d6509dc673b4d8..28fbb846a35f7b 100644 --- a/deps/undici/src/types/env-http-proxy-agent.d.ts +++ b/deps/undici/src/types/env-http-proxy-agent.d.ts @@ -4,9 +4,9 @@ import Dispatcher from './dispatcher' export default EnvHttpProxyAgent declare class EnvHttpProxyAgent extends Dispatcher { - constructor(opts?: EnvHttpProxyAgent.Options) + constructor (opts?: EnvHttpProxyAgent.Options) - dispatch(options: Agent.DispatchOptions, handler: Dispatcher.DispatchHandlers): boolean; + dispatch (options: Agent.DispatchOptions, handler: Dispatcher.DispatchHandler): boolean } declare namespace EnvHttpProxyAgent { diff --git a/deps/undici/src/types/errors.d.ts b/deps/undici/src/types/errors.d.ts index f6fb73b5a90396..fdf806e90a13c9 100644 --- a/deps/undici/src/types/errors.d.ts +++ b/deps/undici/src/types/errors.d.ts @@ -1,24 +1,24 @@ -import { IncomingHttpHeaders } from "./header"; +import { IncomingHttpHeaders } from './header' import Client from './client' export default Errors declare namespace Errors { export class UndiciError extends Error { - name: string; - code: string; + name: string + code: string } /** Connect timeout error. */ export class ConnectTimeoutError extends UndiciError { - name: 'ConnectTimeoutError'; - code: 'UND_ERR_CONNECT_TIMEOUT'; + name: 'ConnectTimeoutError' + code: 'UND_ERR_CONNECT_TIMEOUT' } /** A header exceeds the `headersTimeout` option. */ export class HeadersTimeoutError extends UndiciError { - name: 'HeadersTimeoutError'; - code: 'UND_ERR_HEADERS_TIMEOUT'; + name: 'HeadersTimeoutError' + code: 'UND_ERR_HEADERS_TIMEOUT' } /** Headers overflow error. */ @@ -29,8 +29,8 @@ declare namespace Errors { /** A body exceeds the `bodyTimeout` option. */ export class BodyTimeoutError extends UndiciError { - name: 'BodyTimeoutError'; - code: 'UND_ERR_BODY_TIMEOUT'; + name: 'BodyTimeoutError' + code: 'UND_ERR_BODY_TIMEOUT' } export class ResponseStatusCodeError extends UndiciError { @@ -39,91 +39,91 @@ declare namespace Errors { statusCode?: number, headers?: IncomingHttpHeaders | string[] | null, body?: null | Record | string - ); - name: 'ResponseStatusCodeError'; - code: 'UND_ERR_RESPONSE_STATUS_CODE'; + ) + name: 'ResponseStatusCodeError' + code: 'UND_ERR_RESPONSE_STATUS_CODE' body: null | Record | string status: number statusCode: number - headers: IncomingHttpHeaders | string[] | null; + headers: IncomingHttpHeaders | string[] | null } /** Passed an invalid argument. */ export class InvalidArgumentError extends UndiciError { - name: 'InvalidArgumentError'; - code: 'UND_ERR_INVALID_ARG'; + name: 'InvalidArgumentError' + code: 'UND_ERR_INVALID_ARG' } /** Returned an invalid value. */ export class InvalidReturnValueError extends UndiciError { - name: 'InvalidReturnValueError'; - code: 'UND_ERR_INVALID_RETURN_VALUE'; + name: 'InvalidReturnValueError' + code: 'UND_ERR_INVALID_RETURN_VALUE' } /** The request has been aborted by the user. */ export class RequestAbortedError extends UndiciError { - name: 'AbortError'; - code: 'UND_ERR_ABORTED'; + name: 'AbortError' + code: 'UND_ERR_ABORTED' } /** Expected error with reason. */ export class InformationalError extends UndiciError { - name: 'InformationalError'; - code: 'UND_ERR_INFO'; + name: 'InformationalError' + code: 'UND_ERR_INFO' } /** Request body length does not match content-length header. */ export class RequestContentLengthMismatchError extends UndiciError { - name: 'RequestContentLengthMismatchError'; - code: 'UND_ERR_REQ_CONTENT_LENGTH_MISMATCH'; + name: 'RequestContentLengthMismatchError' + code: 'UND_ERR_REQ_CONTENT_LENGTH_MISMATCH' } /** Response body length does not match content-length header. */ export class ResponseContentLengthMismatchError extends UndiciError { - name: 'ResponseContentLengthMismatchError'; - code: 'UND_ERR_RES_CONTENT_LENGTH_MISMATCH'; + name: 'ResponseContentLengthMismatchError' + code: 'UND_ERR_RES_CONTENT_LENGTH_MISMATCH' } /** Trying to use a destroyed client. */ export class ClientDestroyedError extends UndiciError { - name: 'ClientDestroyedError'; - code: 'UND_ERR_DESTROYED'; + name: 'ClientDestroyedError' + code: 'UND_ERR_DESTROYED' } /** Trying to use a closed client. */ export class ClientClosedError extends UndiciError { - name: 'ClientClosedError'; - code: 'UND_ERR_CLOSED'; + name: 'ClientClosedError' + code: 'UND_ERR_CLOSED' } /** There is an error with the socket. */ export class SocketError extends UndiciError { - name: 'SocketError'; - code: 'UND_ERR_SOCKET'; + name: 'SocketError' + code: 'UND_ERR_SOCKET' socket: Client.SocketInfo | null } /** Encountered unsupported functionality. */ export class NotSupportedError extends UndiciError { - name: 'NotSupportedError'; - code: 'UND_ERR_NOT_SUPPORTED'; + name: 'NotSupportedError' + code: 'UND_ERR_NOT_SUPPORTED' } /** No upstream has been added to the BalancedPool. */ export class BalancedPoolMissingUpstreamError extends UndiciError { - name: 'MissingUpstreamError'; - code: 'UND_ERR_BPL_MISSING_UPSTREAM'; + name: 'MissingUpstreamError' + code: 'UND_ERR_BPL_MISSING_UPSTREAM' } export class HTTPParserError extends UndiciError { - name: 'HTTPParserError'; - code: string; + name: 'HTTPParserError' + code: string } /** The response exceed the length allowed. */ export class ResponseExceededMaxSizeError extends UndiciError { - name: 'ResponseExceededMaxSizeError'; - code: 'UND_ERR_RES_EXCEEDED_MAX_SIZE'; + name: 'ResponseExceededMaxSizeError' + code: 'UND_ERR_RES_EXCEEDED_MAX_SIZE' } export class RequestRetryError extends UndiciError { @@ -132,18 +132,24 @@ declare namespace Errors { statusCode: number, headers?: IncomingHttpHeaders | string[] | null, body?: null | Record | string - ); - name: 'RequestRetryError'; - code: 'UND_ERR_REQ_RETRY'; - statusCode: number; + ) + name: 'RequestRetryError' + code: 'UND_ERR_REQ_RETRY' + statusCode: number data: { count: number; - }; - headers: Record; + } + + headers: Record } export class SecureProxyConnectionError extends UndiciError { - name: 'SecureProxyConnectionError'; - code: 'UND_ERR_PRX_TLS'; + constructor ( + cause?: Error, + message?: string, + options?: Record + ) + name: 'SecureProxyConnectionError' + code: 'UND_ERR_PRX_TLS' } } diff --git a/deps/undici/src/types/fetch.d.ts b/deps/undici/src/types/fetch.d.ts index 7e94375ecdc2a3..4edf41eb055c5f 100644 --- a/deps/undici/src/types/fetch.d.ts +++ b/deps/undici/src/types/fetch.d.ts @@ -6,7 +6,7 @@ import { Blob } from 'buffer' import { URL, URLSearchParams } from 'url' import { ReadableStream } from 'stream/web' import { FormData } from './formdata' - +import { HeaderRecord } from './header' import Dispatcher from './dispatcher' export type RequestInfo = string | URL | Request @@ -36,17 +36,17 @@ export class BodyMixin { /** * @deprecated This method is not recommended for parsing multipart/form-data bodies in server environments. * It is recommended to use a library such as [@fastify/busboy](https://www.npmjs.com/package/@fastify/busboy) as follows: - * + * * @example * ```js * import { Busboy } from '@fastify/busboy' * import { Readable } from 'node:stream' - * + * * const response = await fetch('...') * const busboy = new Busboy({ headers: { 'content-type': response.headers.get('content-type') } }) - * + * * // handle events emitted from `busboy` - * + * * Readable.fromWeb(response.body).pipe(busboy) * ``` */ @@ -67,7 +67,7 @@ export interface SpecIterable { [Symbol.iterator](): SpecIterator; } -export type HeadersInit = string[][] | Record> | Headers +export type HeadersInit = [string, string][] | HeaderRecord | Headers export declare class Headers implements SpecIterable<[string, string]> { constructor (init?: HeadersInit) @@ -119,20 +119,21 @@ type RequestDestination = | 'xslt' export interface RequestInit { - method?: string - keepalive?: boolean - headers?: HeadersInit body?: BodyInit | null - redirect?: RequestRedirect - integrity?: string - signal?: AbortSignal | null + cache?: RequestCache credentials?: RequestCredentials + dispatcher?: Dispatcher + duplex?: RequestDuplex + headers?: HeadersInit + integrity?: string + keepalive?: boolean + method?: string mode?: RequestMode + redirect?: RequestRedirect referrer?: string referrerPolicy?: ReferrerPolicy + signal?: AbortSignal | null window?: null - dispatcher?: Dispatcher - duplex?: RequestDuplex } export type ReferrerPolicy = @@ -144,7 +145,7 @@ export type ReferrerPolicy = | 'same-origin' | 'strict-origin' | 'strict-origin-when-cross-origin' - | 'unsafe-url'; + | 'unsafe-url' export type RequestMode = 'cors' | 'navigate' | 'no-cors' | 'same-origin' @@ -204,6 +205,6 @@ export declare class Response extends BodyMixin { readonly clone: () => Response static error (): Response - static json(data: any, init?: ResponseInit): Response + static json (data: any, init?: ResponseInit): Response static redirect (url: string | URL, status: ResponseRedirectStatus): Response } diff --git a/deps/undici/src/types/file.d.ts b/deps/undici/src/types/file.d.ts deleted file mode 100644 index c695b7ab0baf87..00000000000000 --- a/deps/undici/src/types/file.d.ts +++ /dev/null @@ -1,39 +0,0 @@ -// Based on https://github.com/octet-stream/form-data/blob/2d0f0dc371517444ce1f22cdde13f51995d0953a/lib/File.ts (MIT) -/// - -import { Blob } from 'buffer' - -export interface BlobPropertyBag { - type?: string - endings?: 'native' | 'transparent' -} - -export interface FilePropertyBag extends BlobPropertyBag { - /** - * The last modified date of the file as the number of milliseconds since the Unix epoch (January 1, 1970 at midnight). Files without a known last modified date return the current date. - */ - lastModified?: number -} - -export declare class File extends Blob { - /** - * Creates a new File instance. - * - * @param fileBits An `Array` strings, or [`ArrayBuffer`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer), [`ArrayBufferView`](https://developer.mozilla.org/en-US/docs/Web/API/ArrayBufferView), [`Blob`](https://developer.mozilla.org/en-US/docs/Web/API/Blob) objects, or a mix of any of such objects, that will be put inside the [`File`](https://developer.mozilla.org/en-US/docs/Web/API/File). - * @param fileName The name of the file. - * @param options An options object containing optional attributes for the file. - */ - constructor(fileBits: ReadonlyArray, fileName: string, options?: FilePropertyBag) - - /** - * Name of the file referenced by the File object. - */ - readonly name: string - - /** - * The last modified date of the file as the number of milliseconds since the Unix epoch (January 1, 1970 at midnight). Files without a known last modified date return the current date. - */ - readonly lastModified: number - - readonly [Symbol.toStringTag]: string -} diff --git a/deps/undici/src/types/filereader.d.ts b/deps/undici/src/types/filereader.d.ts deleted file mode 100644 index d1c0f9ef7238ec..00000000000000 --- a/deps/undici/src/types/filereader.d.ts +++ /dev/null @@ -1,54 +0,0 @@ -/// - -import { Blob } from 'buffer' -import { DOMException, EventInit } from './patch' - -export declare class FileReader { - __proto__: EventTarget & FileReader - - constructor () - - readAsArrayBuffer (blob: Blob): void - readAsBinaryString (blob: Blob): void - readAsText (blob: Blob, encoding?: string): void - readAsDataURL (blob: Blob): void - - abort (): void - - static readonly EMPTY = 0 - static readonly LOADING = 1 - static readonly DONE = 2 - - readonly EMPTY = 0 - readonly LOADING = 1 - readonly DONE = 2 - - readonly readyState: number - - readonly result: string | ArrayBuffer | null - - readonly error: DOMException | null - - onloadstart: null | ((this: FileReader, event: ProgressEvent) => void) - onprogress: null | ((this: FileReader, event: ProgressEvent) => void) - onload: null | ((this: FileReader, event: ProgressEvent) => void) - onabort: null | ((this: FileReader, event: ProgressEvent) => void) - onerror: null | ((this: FileReader, event: ProgressEvent) => void) - onloadend: null | ((this: FileReader, event: ProgressEvent) => void) -} - -export interface ProgressEventInit extends EventInit { - lengthComputable?: boolean - loaded?: number - total?: number -} - -export declare class ProgressEvent { - __proto__: Event & ProgressEvent - - constructor (type: string, eventInitDict?: ProgressEventInit) - - readonly lengthComputable: boolean - readonly loaded: number - readonly total: number -} diff --git a/deps/undici/src/types/formdata.d.ts b/deps/undici/src/types/formdata.d.ts index e676b11ec342a3..030f5485950d34 100644 --- a/deps/undici/src/types/formdata.d.ts +++ b/deps/undici/src/types/formdata.d.ts @@ -1,7 +1,7 @@ // Based on https://github.com/octet-stream/form-data/blob/2d0f0dc371517444ce1f22cdde13f51995d0953a/lib/FormData.ts (MIT) /// -import { File } from './file' +import { File } from 'buffer' import { SpecIterableIterator } from './fetch' /** @@ -24,7 +24,7 @@ export declare class FormData { or [`File`](https://developer.mozilla.org/en-US/docs/Web/API/File). If none of these are specified the value is converted to a string. * @param fileName The filename reported to the server, when a Blob or File is passed as the second parameter. The default filename for Blob objects is "blob". The default filename for File objects is the file's filename. */ - append(name: string, value: unknown, fileName?: string): void + append (name: string, value: unknown, fileName?: string): void /** * Set a new value for an existing key inside FormData, @@ -36,7 +36,7 @@ export declare class FormData { * @param fileName The filename reported to the server, when a Blob or File is passed as the second parameter. The default filename for Blob objects is "blob". The default filename for File objects is the file's filename. * */ - set(name: string, value: unknown, fileName?: string): void + set (name: string, value: unknown, fileName?: string): void /** * Returns the first value associated with a given key from within a `FormData` object. @@ -46,7 +46,7 @@ export declare class FormData { * * @returns A `FormDataEntryValue` containing the value. If the key doesn't exist, the method returns null. */ - get(name: string): FormDataEntryValue | null + get (name: string): FormDataEntryValue | null /** * Returns all the values associated with a given key from within a `FormData` object. @@ -55,7 +55,7 @@ export declare class FormData { * * @returns An array of `FormDataEntryValue` whose key matches the value passed in the `name` parameter. If the key doesn't exist, the method returns an empty list. */ - getAll(name: string): FormDataEntryValue[] + getAll (name: string): FormDataEntryValue[] /** * Returns a boolean stating whether a `FormData` object contains a certain key. @@ -64,14 +64,14 @@ export declare class FormData { * * @return A boolean value. */ - has(name: string): boolean + has (name: string): boolean /** * Deletes a key and its value(s) from a `FormData` object. * * @param name The name of the key you want to delete. */ - delete(name: string): void + delete (name: string): void /** * Executes given callback function for each field of the FormData instance diff --git a/deps/undici/src/types/global-dispatcher.d.ts b/deps/undici/src/types/global-dispatcher.d.ts index 728f95ce23ce69..2760e136de4469 100644 --- a/deps/undici/src/types/global-dispatcher.d.ts +++ b/deps/undici/src/types/global-dispatcher.d.ts @@ -1,9 +1,9 @@ -import Dispatcher from "./dispatcher"; +import Dispatcher from './dispatcher' + +declare function setGlobalDispatcher (dispatcher: DispatcherImplementation): void +declare function getGlobalDispatcher (): Dispatcher export { getGlobalDispatcher, setGlobalDispatcher } - -declare function setGlobalDispatcher(dispatcher: DispatcherImplementation): void; -declare function getGlobalDispatcher(): Dispatcher; diff --git a/deps/undici/src/types/global-origin.d.ts b/deps/undici/src/types/global-origin.d.ts index 322542d66756a7..265769b7b4e6bc 100644 --- a/deps/undici/src/types/global-origin.d.ts +++ b/deps/undici/src/types/global-origin.d.ts @@ -1,7 +1,7 @@ +declare function setGlobalOrigin (origin: string | URL | undefined): void +declare function getGlobalOrigin (): URL | undefined + export { - setGlobalOrigin, - getGlobalOrigin + setGlobalOrigin, + getGlobalOrigin } - -declare function setGlobalOrigin(origin: string | URL | undefined): void; -declare function getGlobalOrigin(): URL | undefined; \ No newline at end of file diff --git a/deps/undici/src/types/handlers.d.ts b/deps/undici/src/types/handlers.d.ts index afcda9a3e1db6b..a165f26c7d713c 100644 --- a/deps/undici/src/types/handlers.d.ts +++ b/deps/undici/src/types/handlers.d.ts @@ -1,15 +1,15 @@ -import Dispatcher from "./dispatcher"; +import Dispatcher from './dispatcher' -export declare class RedirectHandler implements Dispatcher.DispatchHandlers { - constructor( +export declare class RedirectHandler implements Dispatcher.DispatchHandler { + constructor ( dispatch: Dispatcher, maxRedirections: number, opts: Dispatcher.DispatchOptions, - handler: Dispatcher.DispatchHandlers, + handler: Dispatcher.DispatchHandler, redirectionLimitReached: boolean - ); + ) } -export declare class DecoratorHandler implements Dispatcher.DispatchHandlers { - constructor(handler: Dispatcher.DispatchHandlers); +export declare class DecoratorHandler implements Dispatcher.DispatchHandler { + constructor (handler: Dispatcher.DispatchHandler) } diff --git a/deps/undici/src/types/header.d.ts b/deps/undici/src/types/header.d.ts index bfdb3296d4d1fc..efd7b1dd0bbae5 100644 --- a/deps/undici/src/types/header.d.ts +++ b/deps/undici/src/types/header.d.ts @@ -1,4 +1,160 @@ +import { Autocomplete } from './utility' + /** * The header type declaration of `undici`. */ -export type IncomingHttpHeaders = Record; +export type IncomingHttpHeaders = Record + +type HeaderNames = Autocomplete< + | 'Accept' + | 'Accept-CH' + | 'Accept-Charset' + | 'Accept-Encoding' + | 'Accept-Language' + | 'Accept-Patch' + | 'Accept-Post' + | 'Accept-Ranges' + | 'Access-Control-Allow-Credentials' + | 'Access-Control-Allow-Headers' + | 'Access-Control-Allow-Methods' + | 'Access-Control-Allow-Origin' + | 'Access-Control-Expose-Headers' + | 'Access-Control-Max-Age' + | 'Access-Control-Request-Headers' + | 'Access-Control-Request-Method' + | 'Age' + | 'Allow' + | 'Alt-Svc' + | 'Alt-Used' + | 'Authorization' + | 'Cache-Control' + | 'Clear-Site-Data' + | 'Connection' + | 'Content-Disposition' + | 'Content-Encoding' + | 'Content-Language' + | 'Content-Length' + | 'Content-Location' + | 'Content-Range' + | 'Content-Security-Policy' + | 'Content-Security-Policy-Report-Only' + | 'Content-Type' + | 'Cookie' + | 'Cross-Origin-Embedder-Policy' + | 'Cross-Origin-Opener-Policy' + | 'Cross-Origin-Resource-Policy' + | 'Date' + | 'Device-Memory' + | 'ETag' + | 'Expect' + | 'Expect-CT' + | 'Expires' + | 'Forwarded' + | 'From' + | 'Host' + | 'If-Match' + | 'If-Modified-Since' + | 'If-None-Match' + | 'If-Range' + | 'If-Unmodified-Since' + | 'Keep-Alive' + | 'Last-Modified' + | 'Link' + | 'Location' + | 'Max-Forwards' + | 'Origin' + | 'Permissions-Policy' + | 'Priority' + | 'Proxy-Authenticate' + | 'Proxy-Authorization' + | 'Range' + | 'Referer' + | 'Referrer-Policy' + | 'Retry-After' + | 'Sec-Fetch-Dest' + | 'Sec-Fetch-Mode' + | 'Sec-Fetch-Site' + | 'Sec-Fetch-User' + | 'Sec-Purpose' + | 'Sec-WebSocket-Accept' + | 'Server' + | 'Server-Timing' + | 'Service-Worker-Navigation-Preload' + | 'Set-Cookie' + | 'SourceMap' + | 'Strict-Transport-Security' + | 'TE' + | 'Timing-Allow-Origin' + | 'Trailer' + | 'Transfer-Encoding' + | 'Upgrade' + | 'Upgrade-Insecure-Requests' + | 'User-Agent' + | 'Vary' + | 'Via' + | 'WWW-Authenticate' + | 'X-Content-Type-Options' + | 'X-Frame-Options' +> + +type IANARegisteredMimeType = Autocomplete< + | 'audio/aac' + | 'video/x-msvideo' + | 'image/avif' + | 'video/av1' + | 'application/octet-stream' + | 'image/bmp' + | 'text/css' + | 'text/csv' + | 'application/vnd.ms-fontobject' + | 'application/epub+zip' + | 'image/gif' + | 'application/gzip' + | 'text/html' + | 'image/x-icon' + | 'text/calendar' + | 'image/jpeg' + | 'text/javascript' + | 'application/json' + | 'application/ld+json' + | 'audio/x-midi' + | 'audio/mpeg' + | 'video/mp4' + | 'video/mpeg' + | 'audio/ogg' + | 'video/ogg' + | 'application/ogg' + | 'audio/opus' + | 'font/otf' + | 'application/pdf' + | 'image/png' + | 'application/rtf' + | 'image/svg+xml' + | 'image/tiff' + | 'video/mp2t' + | 'font/ttf' + | 'text/plain' + | 'application/wasm' + | 'video/webm' + | 'audio/webm' + | 'image/webp' + | 'font/woff' + | 'font/woff2' + | 'application/xhtml+xml' + | 'application/xml' + | 'application/zip' + | 'video/3gpp' + | 'video/3gpp2' + | 'model/gltf+json' + | 'model/gltf-binary' +> + +type KnownHeaderValues = { + 'content-type': IANARegisteredMimeType +} + +export type HeaderRecord = { + [K in HeaderNames | Lowercase]?: Lowercase extends keyof KnownHeaderValues + ? KnownHeaderValues[Lowercase] + : string +} diff --git a/deps/undici/src/types/index.d.ts b/deps/undici/src/types/index.d.ts index f6be35cd9bf40d..3174b324200fb9 100644 --- a/deps/undici/src/types/index.d.ts +++ b/deps/undici/src/types/index.d.ts @@ -1,22 +1,22 @@ -import Dispatcher from'./dispatcher' +import Dispatcher from './dispatcher' import { setGlobalDispatcher, getGlobalDispatcher } from './global-dispatcher' import { setGlobalOrigin, getGlobalOrigin } from './global-origin' -import Pool from'./pool' +import Pool from './pool' import { RedirectHandler, DecoratorHandler } from './handlers' import BalancedPool from './balanced-pool' -import Client from'./client' -import buildConnector from'./connector' -import errors from'./errors' -import Agent from'./agent' -import MockClient from'./mock-client' -import MockPool from'./mock-pool' -import MockAgent from'./mock-agent' -import mockErrors from'./mock-errors' -import ProxyAgent from'./proxy-agent' +import Client from './client' +import buildConnector from './connector' +import errors from './errors' +import Agent from './agent' +import MockClient from './mock-client' +import MockPool from './mock-pool' +import MockAgent from './mock-agent' +import mockErrors from './mock-errors' +import ProxyAgent from './proxy-agent' import EnvHttpProxyAgent from './env-http-proxy-agent' -import RetryHandler from'./retry-handler' -import RetryAgent from'./retry-agent' +import RetryHandler from './retry-handler' +import RetryAgent from './retry-agent' import { request, pipeline, stream, connect, upgrade } from './api' import interceptors from './interceptors' @@ -24,8 +24,6 @@ export * from './util' export * from './cookies' export * from './eventsource' export * from './fetch' -export * from './file' -export * from './filereader' export * from './formdata' export * from './diagnostics-channel' export * from './websocket' @@ -37,35 +35,36 @@ export { Dispatcher, BalancedPool, Pool, Client, buildConnector, errors, Agent, export default Undici declare namespace Undici { - var Dispatcher: typeof import('./dispatcher').default - var Pool: typeof import('./pool').default; - var RedirectHandler: typeof import ('./handlers').RedirectHandler - var DecoratorHandler: typeof import ('./handlers').DecoratorHandler - var RetryHandler: typeof import ('./retry-handler').default - var createRedirectInterceptor: typeof import ('./interceptors').default.createRedirectInterceptor - var BalancedPool: typeof import('./balanced-pool').default; - var Client: typeof import('./client').default; - var buildConnector: typeof import('./connector').default; - var errors: typeof import('./errors').default; - var Agent: typeof import('./agent').default; - var setGlobalDispatcher: typeof import('./global-dispatcher').setGlobalDispatcher; - var getGlobalDispatcher: typeof import('./global-dispatcher').getGlobalDispatcher; - var request: typeof import('./api').request; - var stream: typeof import('./api').stream; - var pipeline: typeof import('./api').pipeline; - var connect: typeof import('./api').connect; - var upgrade: typeof import('./api').upgrade; - var MockClient: typeof import('./mock-client').default; - var MockPool: typeof import('./mock-pool').default; - var MockAgent: typeof import('./mock-agent').default; - var mockErrors: typeof import('./mock-errors').default; - var fetch: typeof import('./fetch').fetch; - var Headers: typeof import('./fetch').Headers; - var Response: typeof import('./fetch').Response; - var Request: typeof import('./fetch').Request; - var FormData: typeof import('./formdata').FormData; - var File: typeof import('./file').File; - var FileReader: typeof import('./filereader').FileReader; - var caches: typeof import('./cache').caches; - var interceptors: typeof import('./interceptors').default; + const Dispatcher: typeof import('./dispatcher').default + const Pool: typeof import('./pool').default + const RedirectHandler: typeof import ('./handlers').RedirectHandler + const DecoratorHandler: typeof import ('./handlers').DecoratorHandler + const RetryHandler: typeof import ('./retry-handler').default + const BalancedPool: typeof import('./balanced-pool').default + const Client: typeof import('./client').default + const buildConnector: typeof import('./connector').default + const errors: typeof import('./errors').default + const Agent: typeof import('./agent').default + const setGlobalDispatcher: typeof import('./global-dispatcher').setGlobalDispatcher + const getGlobalDispatcher: typeof import('./global-dispatcher').getGlobalDispatcher + const request: typeof import('./api').request + const stream: typeof import('./api').stream + const pipeline: typeof import('./api').pipeline + const connect: typeof import('./api').connect + const upgrade: typeof import('./api').upgrade + const MockClient: typeof import('./mock-client').default + const MockPool: typeof import('./mock-pool').default + const MockAgent: typeof import('./mock-agent').default + const mockErrors: typeof import('./mock-errors').default + const fetch: typeof import('./fetch').fetch + const Headers: typeof import('./fetch').Headers + const Response: typeof import('./fetch').Response + const Request: typeof import('./fetch').Request + const FormData: typeof import('./formdata').FormData + const caches: typeof import('./cache').caches + const interceptors: typeof import('./interceptors').default + const cacheStores: { + MemoryCacheStore: typeof import('./cache-interceptor').default.MemoryCacheStore, + SqliteCacheStore: typeof import('./cache-interceptor').default.SqliteCacheStore + } } diff --git a/deps/undici/src/types/interceptors.d.ts b/deps/undici/src/types/interceptors.d.ts index 24166b61f4f86d..5a6fcb28ba7fcf 100644 --- a/deps/undici/src/types/interceptors.d.ts +++ b/deps/undici/src/types/interceptors.d.ts @@ -1,17 +1,34 @@ -import Dispatcher from "./dispatcher"; -import RetryHandler from "./retry-handler"; +import CacheHandler from './cache-interceptor' +import Dispatcher from './dispatcher' +import RetryHandler from './retry-handler' +import { LookupOptions } from 'node:dns' -export default Interceptors; +export default Interceptors declare namespace Interceptors { export type DumpInterceptorOpts = { maxSize?: number } export type RetryInterceptorOpts = RetryHandler.RetryOptions export type RedirectInterceptorOpts = { maxRedirections?: number } + export type ResponseErrorInterceptorOpts = { throwOnError: boolean } + export type CacheInterceptorOpts = CacheHandler.CacheOptions + + // DNS interceptor + export type DNSInterceptorRecord = { address: string, ttl: number, family: 4 | 6 } + export type DNSInterceptorOriginRecords = { 4: { ips: DNSInterceptorRecord[] } | null, 6: { ips: DNSInterceptorRecord[] } | null } + export type DNSInterceptorOpts = { + maxTTL?: number + maxItems?: number + lookup?: (hostname: string, options: LookupOptions, callback: (err: NodeJS.ErrnoException | null, addresses: DNSInterceptorRecord[]) => void) => void + pick?: (origin: URL, records: DNSInterceptorOriginRecords, affinity: 4 | 6) => DNSInterceptorRecord + dualStack?: boolean + affinity?: 4 | 6 + } - export function createRedirectInterceptor(opts: RedirectInterceptorOpts): Dispatcher.DispatcherComposeInterceptor - export function dump(opts?: DumpInterceptorOpts): Dispatcher.DispatcherComposeInterceptor - export function retry(opts?: RetryInterceptorOpts): Dispatcher.DispatcherComposeInterceptor - export function redirect(opts?: RedirectInterceptorOpts): Dispatcher.DispatcherComposeInterceptor - export function responseError(opts?: ResponseErrorInterceptorOpts): Dispatcher.DispatcherComposeInterceptor + export function dump (opts?: DumpInterceptorOpts): Dispatcher.DispatcherComposeInterceptor + export function retry (opts?: RetryInterceptorOpts): Dispatcher.DispatcherComposeInterceptor + export function redirect (opts?: RedirectInterceptorOpts): Dispatcher.DispatcherComposeInterceptor + export function responseError (opts?: ResponseErrorInterceptorOpts): Dispatcher.DispatcherComposeInterceptor + export function dns (opts?: DNSInterceptorOpts): Dispatcher.DispatcherComposeInterceptor + export function cache (opts?: CacheInterceptorOpts): Dispatcher.DispatcherComposeInterceptor } diff --git a/deps/undici/src/types/mock-agent.d.ts b/deps/undici/src/types/mock-agent.d.ts index 98cd645b29bd16..e92c7bea860de7 100644 --- a/deps/undici/src/types/mock-agent.d.ts +++ b/deps/undici/src/types/mock-agent.d.ts @@ -1,7 +1,7 @@ import Agent from './agent' import Dispatcher from './dispatcher' import { Interceptable, MockInterceptor } from './mock-interceptor' -import MockDispatch = MockInterceptor.MockDispatch; +import MockDispatch = MockInterceptor.MockDispatch export default MockAgent @@ -11,30 +11,30 @@ interface PendingInterceptor extends MockDispatch { /** A mocked Agent class that implements the Agent API. It allows one to intercept HTTP requests made through undici and return mocked responses instead. */ declare class MockAgent extends Dispatcher { - constructor(options?: MockAgent.Options) + constructor (options?: TMockAgentOptions) /** Creates and retrieves mock Dispatcher instances which can then be used to intercept HTTP requests. If the number of connections on the mock agent is set to 1, a MockClient instance is returned. Otherwise a MockPool instance is returned. */ - get(origin: string): TInterceptable; - get(origin: RegExp): TInterceptable; - get(origin: ((origin: string) => boolean)): TInterceptable; + get(origin: string): TInterceptable + get(origin: RegExp): TInterceptable + get(origin: ((origin: string) => boolean)): TInterceptable /** Dispatches a mocked request. */ - dispatch(options: Agent.DispatchOptions, handler: Dispatcher.DispatchHandlers): boolean; + dispatch (options: Agent.DispatchOptions, handler: Dispatcher.DispatchHandler): boolean /** Closes the mock agent and waits for registered mock pools and clients to also close before resolving. */ - close(): Promise; + close (): Promise /** Disables mocking in MockAgent. */ - deactivate(): void; + deactivate (): void /** Enables mocking in a MockAgent instance. When instantiated, a MockAgent is automatically activated. Therefore, this method is only effective after `MockAgent.deactivate` has been called. */ - activate(): void; + activate (): void /** Define host matchers so only matching requests that aren't intercepted by the mock dispatchers will be attempted. */ - enableNetConnect(): void; - enableNetConnect(host: string): void; - enableNetConnect(host: RegExp): void; - enableNetConnect(host: ((host: string) => boolean)): void; + enableNetConnect (): void + enableNetConnect (host: string): void + enableNetConnect (host: RegExp): void + enableNetConnect (host: ((host: string) => boolean)): void /** Causes all requests to throw when requests are not matched in a MockAgent intercept. */ - disableNetConnect(): void; - pendingInterceptors(): PendingInterceptor[]; - assertNoPendingInterceptors(options?: { + disableNetConnect (): void + pendingInterceptors (): PendingInterceptor[] + assertNoPendingInterceptors (options?: { pendingInterceptorsFormatter?: PendingInterceptorsFormatter; - }): void; + }): void } interface PendingInterceptorsFormatter { @@ -45,6 +45,9 @@ declare namespace MockAgent { /** MockAgent options. */ export interface Options extends Agent.Options { /** A custom agent to be encapsulated by the MockAgent. */ - agent?: Agent; + agent?: Dispatcher; + + /** Ignore trailing slashes in the path */ + ignoreTrailingSlash?: boolean; } } diff --git a/deps/undici/src/types/mock-client.d.ts b/deps/undici/src/types/mock-client.d.ts index 51d008cc11c5cb..88e16d9fb4fa4d 100644 --- a/deps/undici/src/types/mock-client.d.ts +++ b/deps/undici/src/types/mock-client.d.ts @@ -7,13 +7,13 @@ export default MockClient /** MockClient extends the Client API and allows one to mock requests. */ declare class MockClient extends Client implements Interceptable { - constructor(origin: string, options: MockClient.Options); + constructor (origin: string, options: MockClient.Options) /** Intercepts any matching requests that use the same origin as this mock client. */ - intercept(options: MockInterceptor.Options): MockInterceptor; + intercept (options: MockInterceptor.Options): MockInterceptor /** Dispatches a mocked request. */ - dispatch(options: Dispatcher.DispatchOptions, handlers: Dispatcher.DispatchHandlers): boolean; + dispatch (options: Dispatcher.DispatchOptions, handlers: Dispatcher.DispatchHandler): boolean /** Closes the mock client and gracefully waits for enqueued requests to complete. */ - close(): Promise; + close (): Promise } declare namespace MockClient { diff --git a/deps/undici/src/types/mock-errors.d.ts b/deps/undici/src/types/mock-errors.d.ts index 3d9e727d70a46a..eefeecd62ee909 100644 --- a/deps/undici/src/types/mock-errors.d.ts +++ b/deps/undici/src/types/mock-errors.d.ts @@ -5,8 +5,8 @@ export default MockErrors declare namespace MockErrors { /** The request does not match any registered mock dispatches. */ export class MockNotMatchedError extends Errors.UndiciError { - constructor(message?: string); - name: 'MockNotMatchedError'; - code: 'UND_MOCK_ERR_MOCK_NOT_MATCHED'; + constructor (message?: string) + name: 'MockNotMatchedError' + code: 'UND_MOCK_ERR_MOCK_NOT_MATCHED' } } diff --git a/deps/undici/src/types/mock-interceptor.d.ts b/deps/undici/src/types/mock-interceptor.d.ts index 33f3f14d1bfa3e..418db413e5d5d1 100644 --- a/deps/undici/src/types/mock-interceptor.d.ts +++ b/deps/undici/src/types/mock-interceptor.d.ts @@ -1,42 +1,36 @@ import { IncomingHttpHeaders } from './header' -import Dispatcher from './dispatcher'; +import Dispatcher from './dispatcher' import { BodyInit, Headers } from './fetch' -export { - Interceptable, - MockInterceptor, - MockScope -} - /** The scope associated with a mock dispatch. */ declare class MockScope { - constructor(mockDispatch: MockInterceptor.MockDispatch); + constructor (mockDispatch: MockInterceptor.MockDispatch) /** Delay a reply by a set amount of time in ms. */ - delay(waitInMs: number): MockScope; + delay (waitInMs: number): MockScope /** Persist the defined mock data for the associated reply. It will return the defined mock data indefinitely. */ - persist(): MockScope; + persist (): MockScope /** Define a reply for a set amount of matching requests. */ - times(repeatTimes: number): MockScope; + times (repeatTimes: number): MockScope } /** The interceptor for a Mock. */ declare class MockInterceptor { - constructor(options: MockInterceptor.Options, mockDispatches: MockInterceptor.MockDispatch[]); + constructor (options: MockInterceptor.Options, mockDispatches: MockInterceptor.MockDispatch[]) /** Mock an undici request with the defined reply. */ - reply(replyOptionsCallback: MockInterceptor.MockReplyOptionsCallback): MockScope; + reply(replyOptionsCallback: MockInterceptor.MockReplyOptionsCallback): MockScope reply( statusCode: number, data?: TData | Buffer | string | MockInterceptor.MockResponseDataHandler, responseOptions?: MockInterceptor.MockResponseOptions - ): MockScope; + ): MockScope /** Mock an undici request by throwing the defined reply error. */ - replyWithError(error: TError): MockScope; + replyWithError(error: TError): MockScope /** Set default reply headers on the interceptor for subsequent mocked replies. */ - defaultReplyHeaders(headers: IncomingHttpHeaders): MockInterceptor; + defaultReplyHeaders (headers: IncomingHttpHeaders): MockInterceptor /** Set default reply trailers on the interceptor for subsequent mocked replies. */ - defaultReplyTrailers(trailers: Record): MockInterceptor; + defaultReplyTrailers (trailers: Record): MockInterceptor /** Set automatically calculated content-length header on subsequent mocked replies. */ - replyContentLength(): MockInterceptor; + replyContentLength (): MockInterceptor } declare namespace MockInterceptor { @@ -80,7 +74,7 @@ declare namespace MockInterceptor { export type MockResponseDataHandler = ( opts: MockResponseCallbackOptions - ) => TData | Buffer | string; + ) => TData | Buffer | string export type MockReplyOptionsCallback = ( opts: MockResponseCallbackOptions @@ -91,3 +85,9 @@ interface Interceptable extends Dispatcher { /** Intercepts any matching requests that use the same origin as this mock client. */ intercept(options: MockInterceptor.Options): MockInterceptor; } + +export { + Interceptable, + MockInterceptor, + MockScope +} diff --git a/deps/undici/src/types/mock-pool.d.ts b/deps/undici/src/types/mock-pool.d.ts index 39e709aaf69a2c..5a9d9cb274fd35 100644 --- a/deps/undici/src/types/mock-pool.d.ts +++ b/deps/undici/src/types/mock-pool.d.ts @@ -7,13 +7,13 @@ export default MockPool /** MockPool extends the Pool API and allows one to mock requests. */ declare class MockPool extends Pool implements Interceptable { - constructor(origin: string, options: MockPool.Options); + constructor (origin: string, options: MockPool.Options) /** Intercepts any matching requests that use the same origin as this mock pool. */ - intercept(options: MockInterceptor.Options): MockInterceptor; + intercept (options: MockInterceptor.Options): MockInterceptor /** Dispatches a mocked request. */ - dispatch(options: Dispatcher.DispatchOptions, handlers: Dispatcher.DispatchHandlers): boolean; + dispatch (options: Dispatcher.DispatchOptions, handlers: Dispatcher.DispatchHandler): boolean /** Closes the mock pool and gracefully waits for enqueued requests to complete. */ - close(): Promise; + close (): Promise } declare namespace MockPool { diff --git a/deps/undici/src/types/patch.d.ts b/deps/undici/src/types/patch.d.ts index 4ac38450e67fbd..8f7acbb069eb72 100644 --- a/deps/undici/src/types/patch.d.ts +++ b/deps/undici/src/types/patch.d.ts @@ -2,10 +2,6 @@ // See https://github.com/nodejs/undici/issues/1740 -export type DOMException = typeof globalThis extends { DOMException: infer T } - ? T - : any - export interface EventInit { bubbles?: boolean cancelable?: boolean diff --git a/deps/undici/src/types/pool-stats.d.ts b/deps/undici/src/types/pool-stats.d.ts index 8b6d2bff4ad416..f76a5f61dddf89 100644 --- a/deps/undici/src/types/pool-stats.d.ts +++ b/deps/undici/src/types/pool-stats.d.ts @@ -1,19 +1,19 @@ -import Pool from "./pool" +import Pool from './pool' export default PoolStats declare class PoolStats { - constructor(pool: Pool); + constructor (pool: Pool) /** Number of open socket connections in this pool. */ - connected: number; + connected: number /** Number of open socket connections in this pool that do not have an active request. */ - free: number; + free: number /** Number of pending requests across all clients in this pool. */ - pending: number; + pending: number /** Number of queued requests across all clients in this pool. */ - queued: number; + queued: number /** Number of currently active requests across all clients in this pool. */ - running: number; + running: number /** Number of active, pending, or queued requests across all clients in this pool. */ - size: number; + size: number } diff --git a/deps/undici/src/types/pool.d.ts b/deps/undici/src/types/pool.d.ts index bad5ba0308e978..4814606a7027c5 100644 --- a/deps/undici/src/types/pool.d.ts +++ b/deps/undici/src/types/pool.d.ts @@ -1,39 +1,39 @@ import Client from './client' import TPoolStats from './pool-stats' import { URL } from 'url' -import Dispatcher from "./dispatcher"; +import Dispatcher from './dispatcher' export default Pool -type PoolConnectOptions = Omit; +type PoolConnectOptions = Omit declare class Pool extends Dispatcher { - constructor(url: string | URL, options?: Pool.Options) + constructor (url: string | URL, options?: Pool.Options) /** `true` after `pool.close()` has been called. */ - closed: boolean; + closed: boolean /** `true` after `pool.destroyed()` has been called or `pool.close()` has been called and the pool shutdown has completed. */ - destroyed: boolean; + destroyed: boolean /** Aggregate stats for a Pool. */ - readonly stats: TPoolStats; + readonly stats: TPoolStats // Override dispatcher APIs. - override connect( + override connect ( options: PoolConnectOptions - ): Promise; - override connect( + ): Promise + override connect ( options: PoolConnectOptions, callback: (err: Error | null, data: Dispatcher.ConnectData) => void - ): void; + ): void } declare namespace Pool { - export type PoolStats = TPoolStats; + export type PoolStats = TPoolStats export interface Options extends Client.Options { /** Default: `(origin, opts) => new Client(origin, opts)`. */ factory?(origin: URL, opts: object): Dispatcher; /** The max number of clients to create. `null` if no limit. Default `null`. */ connections?: number | null; - interceptors?: { Pool?: readonly Dispatcher.DispatchInterceptor[] } & Client.Options["interceptors"] + interceptors?: { Pool?: readonly Dispatcher.DispatchInterceptor[] } & Client.Options['interceptors'] } } diff --git a/deps/undici/src/types/proxy-agent.d.ts b/deps/undici/src/types/proxy-agent.d.ts index 32e3acbdaad499..7d39f971c903a6 100644 --- a/deps/undici/src/types/proxy-agent.d.ts +++ b/deps/undici/src/types/proxy-agent.d.ts @@ -1,15 +1,15 @@ import Agent from './agent' -import buildConnector from './connector'; +import buildConnector from './connector' import Dispatcher from './dispatcher' import { IncomingHttpHeaders } from './header' export default ProxyAgent declare class ProxyAgent extends Dispatcher { - constructor(options: ProxyAgent.Options | string) + constructor (options: ProxyAgent.Options | string) - dispatch(options: Agent.DispatchOptions, handler: Dispatcher.DispatchHandlers): boolean; - close(): Promise; + dispatch (options: Agent.DispatchOptions, handler: Dispatcher.DispatchHandler): boolean + close (): Promise } declare namespace ProxyAgent { diff --git a/deps/undici/src/types/readable.d.ts b/deps/undici/src/types/readable.d.ts index c4f052af05ef1d..e4f314b4a0ec33 100644 --- a/deps/undici/src/types/readable.d.ts +++ b/deps/undici/src/types/readable.d.ts @@ -1,45 +1,47 @@ -import { Readable } from "stream"; +import { Readable } from 'stream' import { Blob } from 'buffer' export default BodyReadable declare class BodyReadable extends Readable { - constructor( - resume?: (this: Readable, size: number) => void | null, - abort?: () => void | null, - contentType?: string - ) + constructor (opts: { + resume: (this: Readable, size: number) => void | null; + abort: () => void | null; + contentType?: string; + contentLength?: number; + highWaterMark?: number; + }) /** Consumes and returns the body as a string * https://fetch.spec.whatwg.org/#dom-body-text */ - text(): Promise + text (): Promise /** Consumes and returns the body as a JavaScript Object * https://fetch.spec.whatwg.org/#dom-body-json */ - json(): Promise + json (): Promise /** Consumes and returns the body as a Blob * https://fetch.spec.whatwg.org/#dom-body-blob */ - blob(): Promise + blob (): Promise /** Consumes and returns the body as an Uint8Array * https://fetch.spec.whatwg.org/#dom-body-bytes */ - bytes(): Promise + bytes (): Promise /** Consumes and returns the body as an ArrayBuffer * https://fetch.spec.whatwg.org/#dom-body-arraybuffer */ - arrayBuffer(): Promise + arrayBuffer (): Promise /** Not implemented * * https://fetch.spec.whatwg.org/#dom-body-formdata */ - formData(): Promise + formData (): Promise /** Returns true if the body is not null and the body has been consumed * @@ -49,7 +51,7 @@ declare class BodyReadable extends Readable { */ readonly bodyUsed: boolean - /** + /** * If body is null, it should return null as the body * * If body is not null, should return the body as a ReadableStream @@ -59,7 +61,8 @@ declare class BodyReadable extends Readable { readonly body: never | undefined /** Dumps the response body by reading `limit` number of bytes. - * @param opts.limit Number of bytes to read (optional) - Default: 262144 + * @param opts.limit Number of bytes to read (optional) - Default: 131072 + * @param opts.signal AbortSignal to cancel the operation (optional) */ - dump(opts?: { limit: number }): Promise + dump (opts?: { limit: number; signal?: AbortSignal }): Promise } diff --git a/deps/undici/src/types/retry-agent.d.ts b/deps/undici/src/types/retry-agent.d.ts index 963cea99e42c84..82268c37388833 100644 --- a/deps/undici/src/types/retry-agent.d.ts +++ b/deps/undici/src/types/retry-agent.d.ts @@ -4,5 +4,5 @@ import RetryHandler from './retry-handler' export default RetryAgent declare class RetryAgent extends Dispatcher { - constructor(dispatcher: Dispatcher, options?: RetryHandler.RetryOptions) + constructor (dispatcher: Dispatcher, options?: RetryHandler.RetryOptions) } diff --git a/deps/undici/src/types/retry-handler.d.ts b/deps/undici/src/types/retry-handler.d.ts index e44b207c221d5c..988e74b2b02052 100644 --- a/deps/undici/src/types/retry-handler.d.ts +++ b/deps/undici/src/types/retry-handler.d.ts @@ -1,18 +1,18 @@ -import Dispatcher from "./dispatcher"; +import Dispatcher from './dispatcher' -export default RetryHandler; +export default RetryHandler -declare class RetryHandler implements Dispatcher.DispatchHandlers { - constructor( +declare class RetryHandler implements Dispatcher.DispatchHandler { + constructor ( options: Dispatcher.DispatchOptions & { retryOptions?: RetryHandler.RetryOptions; }, retryHandlers: RetryHandler.RetryHandlers - ); + ) } declare namespace RetryHandler { - export type RetryState = { counter: number; }; + export type RetryState = { counter: number; } export type RetryContext = { state: RetryState; @@ -21,7 +21,7 @@ declare namespace RetryHandler { }; } - export type OnRetryCallback = (result?: Error | null) => void; + export type OnRetryCallback = (result?: Error | null) => void export type RetryCallback = ( err: Error, @@ -32,7 +32,7 @@ declare namespace RetryHandler { }; }, callback: OnRetryCallback - ) => number | null; + ) => void export interface RetryOptions { /** @@ -110,7 +110,7 @@ declare namespace RetryHandler { } export interface RetryHandlers { - dispatch: Dispatcher["dispatch"]; - handler: Dispatcher.DispatchHandlers; + dispatch: Dispatcher['dispatch']; + handler: Dispatcher.DispatchHandler; } } diff --git a/deps/undici/src/types/util.d.ts b/deps/undici/src/types/util.d.ts index 77cf1473a24f1f..8fc50cc4243fcb 100644 --- a/deps/undici/src/types/util.d.ts +++ b/deps/undici/src/types/util.d.ts @@ -3,7 +3,7 @@ export namespace util { * Retrieves a header name and returns its lowercase value. * @param value Header name */ - export function headerNameToString(value: string | Buffer): string; + export function headerNameToString (value: string | Buffer): string /** * Receives a header object and returns the parsed value. @@ -11,8 +11,8 @@ export namespace util { * @param obj Object to specify a proxy object. Used to assign parsed values. * @returns If `obj` is specified, it is equivalent to `obj`. */ - export function parseHeaders( + export function parseHeaders ( headers: (Buffer | string | (Buffer | string)[])[], obj?: Record - ): Record; + ): Record } diff --git a/deps/undici/src/types/utility.d.ts b/deps/undici/src/types/utility.d.ts new file mode 100644 index 00000000000000..bfb3ca7700c4cf --- /dev/null +++ b/deps/undici/src/types/utility.d.ts @@ -0,0 +1,7 @@ +type AutocompletePrimitiveBaseType = + T extends string ? string : + T extends number ? number : + T extends boolean ? boolean : + never + +export type Autocomplete = T | (AutocompletePrimitiveBaseType & Record) diff --git a/deps/undici/src/types/webidl.d.ts b/deps/undici/src/types/webidl.d.ts index fd83b68af90967..33b93439aae7ea 100644 --- a/deps/undici/src/types/webidl.d.ts +++ b/deps/undici/src/types/webidl.d.ts @@ -1,4 +1,5 @@ // These types are not exported, and are only used internally +import * as undici from './index' /** * Take in an unknown value and return one that is of type T @@ -34,11 +35,24 @@ interface WebidlErrors { }): TypeError } +interface WebIDLTypes { + UNDEFINED: 1, + BOOLEAN: 2, + STRING: 3, + SYMBOL: 4, + NUMBER: 5, + BIGINT: 6, + NULL: 7 + OBJECT: 8 +} + interface WebidlUtil { /** * @see https://tc39.es/ecma262/#sec-ecmascript-data-types-and-values */ - Type (object: unknown): + Type (object: unknown): WebIDLTypes[keyof WebIDLTypes] + + TypeValueToString (o: unknown): | 'Undefined' | 'Boolean' | 'String' @@ -48,6 +62,8 @@ interface WebidlUtil { | 'Null' | 'Object' + Types: WebIDLTypes + /** * @see https://webidl.spec.whatwg.org/#abstract-opdef-converttoint */ @@ -68,6 +84,8 @@ interface WebidlUtil { */ Stringify (V: any): string + MakeTypeAssertion (I: I): (arg: any) => arg is I + /** * Mark a value as uncloneable for Node.js. * This is only effective in some newer Node.js versions. @@ -156,7 +174,7 @@ interface WebidlConverters { ): NodeJS.TypedArray | ArrayBufferLike | DataView ['sequence']: SequenceConverter - + ['sequence>']: SequenceConverter ['record']: RecordConverter @@ -164,16 +182,35 @@ interface WebidlConverters { [Key: string]: (...args: any[]) => unknown } +type IsAssertion = (arg: any) => arg is T + +interface WebidlIs { + Request: IsAssertion + Response: IsAssertion + ReadableStream: IsAssertion + Blob: IsAssertion + URLSearchParams: IsAssertion + File: IsAssertion + FormData: IsAssertion + URL: IsAssertion + WebSocketError: IsAssertion + AbortSignal: IsAssertion + MessagePort: IsAssertion +} + export interface Webidl { errors: WebidlErrors util: WebidlUtil converters: WebidlConverters + is: WebidlIs /** * @description Performs a brand-check on {@param V} to ensure it is a * {@param cls} object. */ - brandCheck (V: unknown, cls: Interface, opts?: { strict?: boolean }): asserts V is Interface + brandCheck unknown>(V: unknown, cls: Interface): asserts V is Interface + + brandCheckMultiple unknown)[]> (list: Interfaces): (V: any) => asserts V is Interfaces[number] /** * @see https://webidl.spec.whatwg.org/#es-sequence @@ -196,10 +233,11 @@ export interface Webidl { * Similar to {@link Webidl.brandCheck} but allows skipping the check if third party * interfaces are allowed. */ - interfaceConverter (cls: Interface): ( + interfaceConverter (typeCheck: IsAssertion, name: string): ( V: unknown, - opts?: { strict: boolean } - ) => asserts V is typeof cls + prefix: string, + argument: string + ) => asserts V is Interface // TODO(@KhafraDev): a type could likely be implemented that can infer the return type // from the converters given? diff --git a/deps/undici/src/types/websocket.d.ts b/deps/undici/src/types/websocket.d.ts index dfdd8156cceb14..563866479f1fbb 100644 --- a/deps/undici/src/types/websocket.d.ts +++ b/deps/undici/src/types/websocket.d.ts @@ -22,7 +22,7 @@ interface WebSocketEventMap { interface WebSocket extends EventTarget { binaryType: BinaryType - + readonly bufferedAmount: number readonly extensions: string @@ -148,3 +148,36 @@ interface WebSocketInit { dispatcher?: Dispatcher, headers?: HeadersInit } + +interface WebSocketStreamOptions { + protocols?: string | string[] + signal?: AbortSignal +} + +interface WebSocketCloseInfo { + closeCode: number + reason: string +} + +interface WebSocketStream { + closed: Promise + opened: Promise<{ + extensions: string + protocol: string + readable: ReadableStream + writable: WritableStream + }> + url: string +} + +export declare const WebSocketStream: { + prototype: WebSocketStream + new (url: string | URL, options?: WebSocketStreamOptions): WebSocketStream +} + +interface WebSocketError extends Event, WebSocketCloseInfo {} + +export declare const WebSocketError: { + prototype: WebSocketError + new (type: string, init?: WebSocketCloseInfo): WebSocketError +} diff --git a/deps/undici/undici.js b/deps/undici/undici.js index 1ae9f5a173a2b7..993e0734f28c1c 100644 --- a/deps/undici/undici.js +++ b/deps/undici/undici.js @@ -14,8 +14,8 @@ var require_errors = __commonJS({ static { __name(this, "UndiciError"); } - constructor(message) { - super(message); + constructor(message, options) { + super(message, options); this.name = "UndiciError"; this.code = "UND_ERR"; } @@ -251,13 +251,13 @@ var require_errors = __commonJS({ static { __name(this, "ResponseError"); } - constructor(message, code, { headers, data }) { + constructor(message, code, { headers, body }) { super(message); this.name = "ResponseError"; this.message = message || "Response error"; this.code = "UND_ERR_RESPONSE"; this.statusCode = code; - this.data = data; + this.body = body; this.headers = headers; } }; @@ -265,8 +265,8 @@ var require_errors = __commonJS({ static { __name(this, "SecureProxyConnectionError"); } - constructor(cause, message, options) { - super(message, { cause, ...options ?? {} }); + constructor(cause, message, options = {}) { + super(message, { cause, ...options }); this.name = "SecureProxyConnectionError"; this.message = message || "Secure Proxy Connection failed"; this.code = "UND_ERR_PRX_TLS"; @@ -304,6 +304,7 @@ var require_errors = __commonJS({ // lib/core/symbols.js var require_symbols = __commonJS({ "lib/core/symbols.js"(exports2, module2) { + "use strict"; module2.exports = { kClose: Symbol("close"), kDestroy: Symbol("destroy"), @@ -358,7 +359,6 @@ var require_symbols = __commonJS({ kMaxRequests: Symbol("maxRequestsPerClient"), kProxy: Symbol("proxy agent options"), kCounter: Symbol("socket request counter"), - kInterceptors: Symbol("dispatch interceptors"), kMaxResponseSize: Symbol("max response size"), kHTTP2Session: Symbol("http2Session"), kHTTP2SessionState: Symbol("http2Session state"), @@ -374,11 +374,93 @@ var require_symbols = __commonJS({ } }); +// lib/handler/wrap-handler.js +var require_wrap_handler = __commonJS({ + "lib/handler/wrap-handler.js"(exports2, module2) { + "use strict"; + var { InvalidArgumentError } = require_errors(); + module2.exports = class WrapHandler { + static { + __name(this, "WrapHandler"); + } + #handler; + constructor(handler) { + this.#handler = handler; + } + static wrap(handler) { + return handler.onRequestStart ? handler : new WrapHandler(handler); + } + // Unwrap Interface + onConnect(abort, context) { + return this.#handler.onConnect?.(abort, context); + } + onHeaders(statusCode, rawHeaders, resume, statusMessage) { + return this.#handler.onHeaders?.(statusCode, rawHeaders, resume, statusMessage); + } + onUpgrade(statusCode, rawHeaders, socket) { + return this.#handler.onUpgrade?.(statusCode, rawHeaders, socket); + } + onData(data) { + return this.#handler.onData?.(data); + } + onComplete(trailers) { + return this.#handler.onComplete?.(trailers); + } + onError(err) { + if (!this.#handler.onError) { + throw err; + } + return this.#handler.onError?.(err); + } + // Wrap Interface + onRequestStart(controller, context) { + this.#handler.onConnect?.((reason) => controller.abort(reason), context); + } + onRequestUpgrade(controller, statusCode, headers, socket) { + const rawHeaders = []; + for (const [key, val] of Object.entries(headers)) { + rawHeaders.push(Buffer.from(key), Array.isArray(val) ? val.map((v) => Buffer.from(v)) : Buffer.from(val)); + } + this.#handler.onUpgrade?.(statusCode, rawHeaders, socket); + } + onResponseStart(controller, statusCode, headers, statusMessage) { + const rawHeaders = []; + for (const [key, val] of Object.entries(headers)) { + rawHeaders.push(Buffer.from(key), Array.isArray(val) ? val.map((v) => Buffer.from(v)) : Buffer.from(val)); + } + if (this.#handler.onHeaders?.(statusCode, rawHeaders, () => controller.resume(), statusMessage) === false) { + controller.pause(); + } + } + onResponseData(controller, data) { + if (this.#handler.onData?.(data) === false) { + controller.pause(); + } + } + onResponseEnd(controller, trailers) { + const rawTrailers = []; + for (const [key, val] of Object.entries(trailers)) { + rawTrailers.push(Buffer.from(key), Array.isArray(val) ? val.map((v) => Buffer.from(v)) : Buffer.from(val)); + } + this.#handler.onComplete?.(rawTrailers); + } + onResponseError(controller, err) { + if (!this.#handler.onError) { + throw new InvalidArgumentError("invalid onError method"); + } + this.#handler.onError?.(err); + } + }; + } +}); + // lib/dispatcher/dispatcher.js var require_dispatcher = __commonJS({ "lib/dispatcher/dispatcher.js"(exports2, module2) { "use strict"; var EventEmitter = require("node:events"); + var WrapHandler = require_wrap_handler(); + var wrapInterceptor = /* @__PURE__ */ __name((dispatch) => (opts, handler) => dispatch(opts, WrapHandler.wrap(handler)), "wrapInterceptor"); var Dispatcher = class extends EventEmitter { static { __name(this, "Dispatcher"); @@ -403,1267 +485,1353 @@ var require_dispatcher = __commonJS({ throw new TypeError(`invalid interceptor, expected function received ${typeof interceptor}`); } dispatch = interceptor(dispatch); + dispatch = wrapInterceptor(dispatch); if (dispatch == null || typeof dispatch !== "function" || dispatch.length !== 2) { throw new TypeError("invalid interceptor"); } } - return new ComposedDispatcher(this, dispatch); + return new Proxy(this, { + get: /* @__PURE__ */ __name((target, key) => key === "dispatch" ? dispatch : target[key], "get") + }); } }; - var ComposedDispatcher = class extends Dispatcher { - static { - __name(this, "ComposedDispatcher"); - } - #dispatcher = null; - #dispatch = null; - constructor(dispatcher, dispatch) { - super(); - this.#dispatcher = dispatcher; - this.#dispatch = dispatch; - } - dispatch(...args) { - this.#dispatch(...args); - } - close(...args) { - return this.#dispatcher.close(...args); - } - destroy(...args) { - return this.#dispatcher.destroy(...args); + module2.exports = Dispatcher; + } +}); + +// lib/core/constants.js +var require_constants = __commonJS({ + "lib/core/constants.js"(exports2, module2) { + "use strict"; + var wellknownHeaderNames = ( + /** @type {const} */ + [ + "Accept", + "Accept-Encoding", + "Accept-Language", + "Accept-Ranges", + "Access-Control-Allow-Credentials", + "Access-Control-Allow-Headers", + "Access-Control-Allow-Methods", + "Access-Control-Allow-Origin", + "Access-Control-Expose-Headers", + "Access-Control-Max-Age", + "Access-Control-Request-Headers", + "Access-Control-Request-Method", + "Age", + "Allow", + "Alt-Svc", + "Alt-Used", + "Authorization", + "Cache-Control", + "Clear-Site-Data", + "Connection", + "Content-Disposition", + "Content-Encoding", + "Content-Language", + "Content-Length", + "Content-Location", + "Content-Range", + "Content-Security-Policy", + "Content-Security-Policy-Report-Only", + "Content-Type", + "Cookie", + "Cross-Origin-Embedder-Policy", + "Cross-Origin-Opener-Policy", + "Cross-Origin-Resource-Policy", + "Date", + "Device-Memory", + "Downlink", + "ECT", + "ETag", + "Expect", + "Expect-CT", + "Expires", + "Forwarded", + "From", + "Host", + "If-Match", + "If-Modified-Since", + "If-None-Match", + "If-Range", + "If-Unmodified-Since", + "Keep-Alive", + "Last-Modified", + "Link", + "Location", + "Max-Forwards", + "Origin", + "Permissions-Policy", + "Pragma", + "Proxy-Authenticate", + "Proxy-Authorization", + "RTT", + "Range", + "Referer", + "Referrer-Policy", + "Refresh", + "Retry-After", + "Sec-WebSocket-Accept", + "Sec-WebSocket-Extensions", + "Sec-WebSocket-Key", + "Sec-WebSocket-Protocol", + "Sec-WebSocket-Version", + "Server", + "Server-Timing", + "Service-Worker-Allowed", + "Service-Worker-Navigation-Preload", + "Set-Cookie", + "SourceMap", + "Strict-Transport-Security", + "Supports-Loading-Mode", + "TE", + "Timing-Allow-Origin", + "Trailer", + "Transfer-Encoding", + "Upgrade", + "Upgrade-Insecure-Requests", + "User-Agent", + "Vary", + "Via", + "WWW-Authenticate", + "X-Content-Type-Options", + "X-DNS-Prefetch-Control", + "X-Frame-Options", + "X-Permitted-Cross-Domain-Policies", + "X-Powered-By", + "X-Requested-With", + "X-XSS-Protection" + ] + ); + var headerNameLowerCasedRecord = {}; + Object.setPrototypeOf(headerNameLowerCasedRecord, null); + var wellknownHeaderNameBuffers = {}; + Object.setPrototypeOf(wellknownHeaderNameBuffers, null); + function getHeaderNameAsBuffer(header) { + let buffer = wellknownHeaderNameBuffers[header]; + if (buffer === void 0) { + buffer = Buffer.from(header); } + return buffer; + } + __name(getHeaderNameAsBuffer, "getHeaderNameAsBuffer"); + for (let i = 0; i < wellknownHeaderNames.length; ++i) { + const key = wellknownHeaderNames[i]; + const lowerCasedKey = key.toLowerCase(); + headerNameLowerCasedRecord[key] = headerNameLowerCasedRecord[lowerCasedKey] = lowerCasedKey; + } + module2.exports = { + wellknownHeaderNames, + headerNameLowerCasedRecord, + getHeaderNameAsBuffer }; - module2.exports = Dispatcher; } }); -// lib/dispatcher/dispatcher-base.js -var require_dispatcher_base = __commonJS({ - "lib/dispatcher/dispatcher-base.js"(exports2, module2) { +// lib/core/tree.js +var require_tree = __commonJS({ + "lib/core/tree.js"(exports2, module2) { "use strict"; - var Dispatcher = require_dispatcher(); var { - ClientDestroyedError, - ClientClosedError, - InvalidArgumentError - } = require_errors(); - var { kDestroy, kClose, kClosed, kDestroyed, kDispatch, kInterceptors } = require_symbols(); - var kOnDestroyed = Symbol("onDestroyed"); - var kOnClosed = Symbol("onClosed"); - var kInterceptedDispatch = Symbol("Intercepted Dispatch"); - var DispatcherBase = class extends Dispatcher { + wellknownHeaderNames, + headerNameLowerCasedRecord + } = require_constants(); + var TstNode = class _TstNode { static { - __name(this, "DispatcherBase"); - } - constructor() { - super(); - this[kDestroyed] = false; - this[kOnDestroyed] = null; - this[kClosed] = false; - this[kOnClosed] = []; - } - get destroyed() { - return this[kDestroyed]; - } - get closed() { - return this[kClosed]; - } - get interceptors() { - return this[kInterceptors]; + __name(this, "TstNode"); } - set interceptors(newInterceptors) { - if (newInterceptors) { - for (let i = newInterceptors.length - 1; i >= 0; i--) { - const interceptor = this[kInterceptors][i]; - if (typeof interceptor !== "function") { - throw new InvalidArgumentError("interceptor must be an function"); - } - } + /** @type {any} */ + value = null; + /** @type {null | TstNode} */ + left = null; + /** @type {null | TstNode} */ + middle = null; + /** @type {null | TstNode} */ + right = null; + /** @type {number} */ + code; + /** + * @param {string} key + * @param {any} value + * @param {number} index + */ + constructor(key, value, index) { + if (index === void 0 || index >= key.length) { + throw new TypeError("Unreachable"); } - this[kInterceptors] = newInterceptors; - } - close(callback) { - if (callback === void 0) { - return new Promise((resolve, reject) => { - this.close((err, data) => { - return err ? reject(err) : resolve(data); - }); - }); + const code = this.code = key.charCodeAt(index); + if (code > 127) { + throw new TypeError("key must be ascii string"); } - if (typeof callback !== "function") { - throw new InvalidArgumentError("invalid callback"); + if (key.length !== ++index) { + this.middle = new _TstNode(key, value, index); + } else { + this.value = value; } - if (this[kDestroyed]) { - queueMicrotask(() => callback(new ClientDestroyedError(), null)); - return; + } + /** + * @param {string} key + * @param {any} value + * @returns {void} + */ + add(key, value) { + const length = key.length; + if (length === 0) { + throw new TypeError("Unreachable"); } - if (this[kClosed]) { - if (this[kOnClosed]) { - this[kOnClosed].push(callback); + let index = 0; + let node = this; + while (true) { + const code = key.charCodeAt(index); + if (code > 127) { + throw new TypeError("key must be ascii string"); + } + if (node.code === code) { + if (length === ++index) { + node.value = value; + break; + } else if (node.middle !== null) { + node = node.middle; + } else { + node.middle = new _TstNode(key, value, index); + break; + } + } else if (node.code < code) { + if (node.left !== null) { + node = node.left; + } else { + node.left = new _TstNode(key, value, index); + break; + } + } else if (node.right !== null) { + node = node.right; } else { - queueMicrotask(() => callback(null, null)); + node.right = new _TstNode(key, value, index); + break; } - return; } - this[kClosed] = true; - this[kOnClosed].push(callback); - const onClosed = /* @__PURE__ */ __name(() => { - const callbacks = this[kOnClosed]; - this[kOnClosed] = null; - for (let i = 0; i < callbacks.length; i++) { - callbacks[i](null, null); - } - }, "onClosed"); - this[kClose]().then(() => this.destroy()).then(() => { - queueMicrotask(onClosed); - }); } - destroy(err, callback) { - if (typeof err === "function") { - callback = err; - err = null; - } - if (callback === void 0) { - return new Promise((resolve, reject) => { - this.destroy(err, (err2, data) => { - return err2 ? ( - /* istanbul ignore next: should never error */ - reject(err2) - ) : resolve(data); - }); - }); - } - if (typeof callback !== "function") { - throw new InvalidArgumentError("invalid callback"); - } - if (this[kDestroyed]) { - if (this[kOnDestroyed]) { - this[kOnDestroyed].push(callback); - } else { - queueMicrotask(() => callback(null, null)); + /** + * @param {Uint8Array} key + * @return {TstNode | null} + */ + search(key) { + const keylength = key.length; + let index = 0; + let node = this; + while (node !== null && index < keylength) { + let code = key[index]; + if (code <= 90 && code >= 65) { + code |= 32; } - return; - } - if (!err) { - err = new ClientDestroyedError(); - } - this[kDestroyed] = true; - this[kOnDestroyed] = this[kOnDestroyed] || []; - this[kOnDestroyed].push(callback); - const onDestroyed = /* @__PURE__ */ __name(() => { - const callbacks = this[kOnDestroyed]; - this[kOnDestroyed] = null; - for (let i = 0; i < callbacks.length; i++) { - callbacks[i](null, null); + while (node !== null) { + if (code === node.code) { + if (keylength === ++index) { + return node; + } + node = node.middle; + break; + } + node = node.code < code ? node.left : node.right; } - }, "onDestroyed"); - this[kDestroy](err).then(() => { - queueMicrotask(onDestroyed); - }); - } - [kInterceptedDispatch](opts, handler) { - if (!this[kInterceptors] || this[kInterceptors].length === 0) { - this[kInterceptedDispatch] = this[kDispatch]; - return this[kDispatch](opts, handler); - } - let dispatch = this[kDispatch].bind(this); - for (let i = this[kInterceptors].length - 1; i >= 0; i--) { - dispatch = this[kInterceptors][i](dispatch); } - this[kInterceptedDispatch] = dispatch; - return dispatch(opts, handler); + return null; } - dispatch(opts, handler) { - if (!handler || typeof handler !== "object") { - throw new InvalidArgumentError("handler must be an object"); - } - try { - if (!opts || typeof opts !== "object") { - throw new InvalidArgumentError("opts must be an object."); - } - if (this[kDestroyed] || this[kOnDestroyed]) { - throw new ClientDestroyedError(); - } - if (this[kClosed]) { - throw new ClientClosedError(); - } - return this[kInterceptedDispatch](opts, handler); - } catch (err) { - if (typeof handler.onError !== "function") { - throw new InvalidArgumentError("invalid onError method"); - } - handler.onError(err); - return false; + }; + var TernarySearchTree = class { + static { + __name(this, "TernarySearchTree"); + } + /** @type {TstNode | null} */ + node = null; + /** + * @param {string} key + * @param {any} value + * @returns {void} + * */ + insert(key, value) { + if (this.node === null) { + this.node = new TstNode(key, value, 0); + } else { + this.node.add(key, value); } } + /** + * @param {Uint8Array} key + * @returns {any} + */ + lookup(key) { + return this.node?.search(key)?.value ?? null; + } + }; + var tree = new TernarySearchTree(); + for (let i = 0; i < wellknownHeaderNames.length; ++i) { + const key = headerNameLowerCasedRecord[wellknownHeaderNames[i]]; + tree.insert(key, key); + } + module2.exports = { + TernarySearchTree, + tree }; - module2.exports = DispatcherBase; } }); -// lib/dispatcher/fixed-queue.js -var require_fixed_queue = __commonJS({ - "lib/dispatcher/fixed-queue.js"(exports2, module2) { +// lib/core/util.js +var require_util = __commonJS({ + "lib/core/util.js"(exports2, module2) { "use strict"; - var kSize = 2048; - var kMask = kSize - 1; - var FixedCircularBuffer = class { + var assert = require("node:assert"); + var { kDestroyed, kBodyUsed, kListeners, kBody } = require_symbols(); + var { IncomingMessage } = require("node:http"); + var stream = require("node:stream"); + var net = require("node:net"); + var { Blob: Blob2 } = require("node:buffer"); + var nodeUtil = require("node:util"); + var { stringify } = require("node:querystring"); + var { EventEmitter: EE } = require("node:events"); + var { InvalidArgumentError } = require_errors(); + var { headerNameLowerCasedRecord } = require_constants(); + var { tree } = require_tree(); + var [nodeMajor, nodeMinor] = process.versions.node.split(".").map((v) => Number(v)); + var BodyAsyncIterable = class { static { - __name(this, "FixedCircularBuffer"); - } - constructor() { - this.bottom = 0; - this.top = 0; - this.list = new Array(kSize); - this.next = null; - } - isEmpty() { - return this.top === this.bottom; - } - isFull() { - return (this.top + 1 & kMask) === this.bottom; + __name(this, "BodyAsyncIterable"); } - push(data) { - this.list[this.top] = data; - this.top = this.top + 1 & kMask; + constructor(body) { + this[kBody] = body; + this[kBodyUsed] = false; } - shift() { - const nextItem = this.list[this.bottom]; - if (nextItem === void 0) - return null; - this.list[this.bottom] = void 0; - this.bottom = this.bottom + 1 & kMask; - return nextItem; + async *[Symbol.asyncIterator]() { + assert(!this[kBodyUsed], "disturbed"); + this[kBodyUsed] = true; + yield* this[kBody]; } }; - module2.exports = class FixedQueue { - static { - __name(this, "FixedQueue"); - } - constructor() { - this.head = this.tail = new FixedCircularBuffer(); - } - isEmpty() { - return this.head.isEmpty(); - } - push(data) { - if (this.head.isFull()) { - this.head = this.head.next = new FixedCircularBuffer(); + function wrapRequestBody(body) { + if (isStream(body)) { + if (bodyLength(body) === 0) { + body.on("data", function() { + assert(false); + }); } - this.head.push(data); - } - shift() { - const tail = this.tail; - const next = tail.shift(); - if (tail.isEmpty() && tail.next !== null) { - this.tail = tail.next; + if (typeof body.readableDidRead !== "boolean") { + body[kBodyUsed] = false; + EE.prototype.on.call(body, "data", function() { + this[kBodyUsed] = true; + }); } - return next; + return body; + } else if (body && typeof body.pipeTo === "function") { + return new BodyAsyncIterable(body); + } else if (body && typeof body !== "string" && !ArrayBuffer.isView(body) && isIterable(body)) { + return new BodyAsyncIterable(body); + } else { + return body; } - }; - } -}); - -// lib/dispatcher/pool-stats.js -var require_pool_stats = __commonJS({ - "lib/dispatcher/pool-stats.js"(exports2, module2) { - var { kFree, kConnected, kPending, kQueued, kRunning, kSize } = require_symbols(); - var kPool = Symbol("pool"); - var PoolStats = class { - static { - __name(this, "PoolStats"); + } + __name(wrapRequestBody, "wrapRequestBody"); + function isStream(obj) { + return obj && typeof obj === "object" && typeof obj.pipe === "function" && typeof obj.on === "function"; + } + __name(isStream, "isStream"); + function isBlobLike(object) { + if (object === null) { + return false; + } else if (object instanceof Blob2) { + return true; + } else if (typeof object !== "object") { + return false; + } else { + const sTag = object[Symbol.toStringTag]; + return (sTag === "Blob" || sTag === "File") && ("stream" in object && typeof object.stream === "function" || "arrayBuffer" in object && typeof object.arrayBuffer === "function"); } - constructor(pool) { - this[kPool] = pool; + } + __name(isBlobLike, "isBlobLike"); + function serializePathWithQuery(url, queryParams) { + if (url.includes("?") || url.includes("#")) { + throw new Error('Query params cannot be passed when url already contains "?" or "#".'); } - get connected() { - return this[kPool][kConnected]; + const stringified = stringify(queryParams); + if (stringified) { + url += "?" + stringified; } - get free() { - return this[kPool][kFree]; + return url; + } + __name(serializePathWithQuery, "serializePathWithQuery"); + function isValidPort(port) { + const value = parseInt(port, 10); + return value === Number(port) && value >= 0 && value <= 65535; + } + __name(isValidPort, "isValidPort"); + function isHttpOrHttpsPrefixed(value) { + return value != null && value[0] === "h" && value[1] === "t" && value[2] === "t" && value[3] === "p" && (value[4] === ":" || value[4] === "s" && value[5] === ":"); + } + __name(isHttpOrHttpsPrefixed, "isHttpOrHttpsPrefixed"); + function parseURL(url) { + if (typeof url === "string") { + url = new URL(url); + if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) { + throw new InvalidArgumentError("Invalid URL protocol: the URL must start with `http:` or `https:`."); + } + return url; } - get pending() { - return this[kPool][kPending]; + if (!url || typeof url !== "object") { + throw new InvalidArgumentError("Invalid URL: The URL argument must be a non-null object."); } - get queued() { - return this[kPool][kQueued]; + if (!(url instanceof URL)) { + if (url.port != null && url.port !== "" && isValidPort(url.port) === false) { + throw new InvalidArgumentError("Invalid URL: port must be a valid integer or a string representation of an integer."); + } + if (url.path != null && typeof url.path !== "string") { + throw new InvalidArgumentError("Invalid URL path: the path must be a string or null/undefined."); + } + if (url.pathname != null && typeof url.pathname !== "string") { + throw new InvalidArgumentError("Invalid URL pathname: the pathname must be a string or null/undefined."); + } + if (url.hostname != null && typeof url.hostname !== "string") { + throw new InvalidArgumentError("Invalid URL hostname: the hostname must be a string or null/undefined."); + } + if (url.origin != null && typeof url.origin !== "string") { + throw new InvalidArgumentError("Invalid URL origin: the origin must be a string or null/undefined."); + } + if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) { + throw new InvalidArgumentError("Invalid URL protocol: the URL must start with `http:` or `https:`."); + } + const port = url.port != null ? url.port : url.protocol === "https:" ? 443 : 80; + let origin = url.origin != null ? url.origin : `${url.protocol || ""}//${url.hostname || ""}:${port}`; + let path = url.path != null ? url.path : `${url.pathname || ""}${url.search || ""}`; + if (origin[origin.length - 1] === "/") { + origin = origin.slice(0, origin.length - 1); + } + if (path && path[0] !== "/") { + path = `/${path}`; + } + return new URL(`${origin}${path}`); } - get running() { - return this[kPool][kRunning]; + if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) { + throw new InvalidArgumentError("Invalid URL protocol: the URL must start with `http:` or `https:`."); } - get size() { - return this[kPool][kSize]; + return url; + } + __name(parseURL, "parseURL"); + function parseOrigin(url) { + url = parseURL(url); + if (url.pathname !== "/" || url.search || url.hash) { + throw new InvalidArgumentError("invalid url"); } - }; - module2.exports = PoolStats; - } -}); - -// lib/dispatcher/pool-base.js -var require_pool_base = __commonJS({ - "lib/dispatcher/pool-base.js"(exports2, module2) { - "use strict"; - var DispatcherBase = require_dispatcher_base(); - var FixedQueue = require_fixed_queue(); - var { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = require_symbols(); - var PoolStats = require_pool_stats(); - var kClients = Symbol("clients"); - var kNeedDrain = Symbol("needDrain"); - var kQueue = Symbol("queue"); - var kClosedResolve = Symbol("closed resolve"); - var kOnDrain = Symbol("onDrain"); - var kOnConnect = Symbol("onConnect"); - var kOnDisconnect = Symbol("onDisconnect"); - var kOnConnectionError = Symbol("onConnectionError"); - var kGetDispatcher = Symbol("get dispatcher"); - var kAddClient = Symbol("add client"); - var kRemoveClient = Symbol("remove client"); - var kStats = Symbol("stats"); - var PoolBase = class extends DispatcherBase { - static { - __name(this, "PoolBase"); - } - constructor() { - super(); - this[kQueue] = new FixedQueue(); - this[kClients] = []; - this[kQueued] = 0; - const pool = this; - this[kOnDrain] = /* @__PURE__ */ __name(function onDrain(origin, targets) { - const queue = pool[kQueue]; - let needDrain = false; - while (!needDrain) { - const item = queue.shift(); - if (!item) { - break; - } - pool[kQueued]--; - needDrain = !this.dispatch(item.opts, item.handler); - } - this[kNeedDrain] = needDrain; - if (!this[kNeedDrain] && pool[kNeedDrain]) { - pool[kNeedDrain] = false; - pool.emit("drain", origin, [pool, ...targets]); - } - if (pool[kClosedResolve] && queue.isEmpty()) { - Promise.all(pool[kClients].map((c) => c.close())).then(pool[kClosedResolve]); - } - }, "onDrain"); - this[kOnConnect] = (origin, targets) => { - pool.emit("connect", origin, [pool, ...targets]); - }; - this[kOnDisconnect] = (origin, targets, err) => { - pool.emit("disconnect", origin, [pool, ...targets], err); - }; - this[kOnConnectionError] = (origin, targets, err) => { - pool.emit("connectionError", origin, [pool, ...targets], err); - }; - this[kStats] = new PoolStats(this); - } - get [kBusy]() { - return this[kNeedDrain]; + return url; + } + __name(parseOrigin, "parseOrigin"); + function getHostname(host) { + if (host[0] === "[") { + const idx2 = host.indexOf("]"); + assert(idx2 !== -1); + return host.substring(1, idx2); } - get [kConnected]() { - return this[kClients].filter((client) => client[kConnected]).length; + const idx = host.indexOf(":"); + if (idx === -1) return host; + return host.substring(0, idx); + } + __name(getHostname, "getHostname"); + function getServerName(host) { + if (!host) { + return null; } - get [kFree]() { - return this[kClients].filter((client) => client[kConnected] && !client[kNeedDrain]).length; + assert(typeof host === "string"); + const servername = getHostname(host); + if (net.isIP(servername)) { + return ""; } - get [kPending]() { - let ret = this[kQueued]; - for (const { [kPending]: pending } of this[kClients]) { - ret += pending; - } - return ret; + return servername; + } + __name(getServerName, "getServerName"); + function deepClone(obj) { + return JSON.parse(JSON.stringify(obj)); + } + __name(deepClone, "deepClone"); + function isAsyncIterable(obj) { + return !!(obj != null && typeof obj[Symbol.asyncIterator] === "function"); + } + __name(isAsyncIterable, "isAsyncIterable"); + function isIterable(obj) { + return !!(obj != null && (typeof obj[Symbol.iterator] === "function" || typeof obj[Symbol.asyncIterator] === "function")); + } + __name(isIterable, "isIterable"); + function bodyLength(body) { + if (body == null) { + return 0; + } else if (isStream(body)) { + const state = body._readableState; + return state && state.objectMode === false && state.ended === true && Number.isFinite(state.length) ? state.length : null; + } else if (isBlobLike(body)) { + return body.size != null ? body.size : null; + } else if (isBuffer(body)) { + return body.byteLength; } - get [kRunning]() { - let ret = 0; - for (const { [kRunning]: running } of this[kClients]) { - ret += running; - } - return ret; + return null; + } + __name(bodyLength, "bodyLength"); + function isDestroyed(body) { + return body && !!(body.destroyed || body[kDestroyed] || stream.isDestroyed?.(body)); + } + __name(isDestroyed, "isDestroyed"); + function destroy(stream2, err) { + if (stream2 == null || !isStream(stream2) || isDestroyed(stream2)) { + return; } - get [kSize]() { - let ret = this[kQueued]; - for (const { [kSize]: size } of this[kClients]) { - ret += size; + if (typeof stream2.destroy === "function") { + if (Object.getPrototypeOf(stream2).constructor === IncomingMessage) { + stream2.socket = null; } - return ret; + stream2.destroy(err); + } else if (err) { + queueMicrotask(() => { + stream2.emit("error", err); + }); } - get stats() { - return this[kStats]; + if (stream2.destroyed !== true) { + stream2[kDestroyed] = true; } - async [kClose]() { - if (this[kQueue].isEmpty()) { - await Promise.all(this[kClients].map((c) => c.close())); + } + __name(destroy, "destroy"); + var KEEPALIVE_TIMEOUT_EXPR = /timeout=(\d+)/; + function parseKeepAliveTimeout(val) { + const m = val.match(KEEPALIVE_TIMEOUT_EXPR); + return m ? parseInt(m[1], 10) * 1e3 : null; + } + __name(parseKeepAliveTimeout, "parseKeepAliveTimeout"); + function headerNameToString(value) { + return typeof value === "string" ? headerNameLowerCasedRecord[value] ?? value.toLowerCase() : tree.lookup(value) ?? value.toString("latin1").toLowerCase(); + } + __name(headerNameToString, "headerNameToString"); + function bufferToLowerCasedHeaderName(value) { + return tree.lookup(value) ?? value.toString("latin1").toLowerCase(); + } + __name(bufferToLowerCasedHeaderName, "bufferToLowerCasedHeaderName"); + function parseHeaders(headers, obj) { + if (obj === void 0) obj = {}; + for (let i = 0; i < headers.length; i += 2) { + const key = headerNameToString(headers[i]); + let val = obj[key]; + if (val) { + if (typeof val === "string") { + val = [val]; + obj[key] = val; + } + val.push(headers[i + 1].toString("utf8")); } else { - await new Promise((resolve) => { - this[kClosedResolve] = resolve; - }); - } - } - async [kDestroy](err) { - while (true) { - const item = this[kQueue].shift(); - if (!item) { - break; + const headersValue = headers[i + 1]; + if (typeof headersValue === "string") { + obj[key] = headersValue; + } else { + obj[key] = Array.isArray(headersValue) ? headersValue.map((x) => x.toString("utf8")) : headersValue.toString("utf8"); } - item.handler.onError(err); } - await Promise.all(this[kClients].map((c) => c.destroy(err))); } - [kDispatch](opts, handler) { - const dispatcher = this[kGetDispatcher](); - if (!dispatcher) { - this[kNeedDrain] = true; - this[kQueue].push({ opts, handler }); - this[kQueued]++; - } else if (!dispatcher.dispatch(opts, handler)) { - dispatcher[kNeedDrain] = true; - this[kNeedDrain] = !this[kGetDispatcher](); - } - return !this[kNeedDrain]; + if ("content-length" in obj && "content-disposition" in obj) { + obj["content-disposition"] = Buffer.from(obj["content-disposition"]).toString("latin1"); } - [kAddClient](client) { - client.on("drain", this[kOnDrain]).on("connect", this[kOnConnect]).on("disconnect", this[kOnDisconnect]).on("connectionError", this[kOnConnectionError]); - this[kClients].push(client); - if (this[kNeedDrain]) { - queueMicrotask(() => { - if (this[kNeedDrain]) { - this[kOnDrain](client[kUrl], [this, client]); - } - }); + return obj; + } + __name(parseHeaders, "parseHeaders"); + function parseRawHeaders(headers) { + const headersLength = headers.length; + const ret = new Array(headersLength); + let hasContentLength = false; + let contentDispositionIdx = -1; + let key; + let val; + let kLen = 0; + for (let n = 0; n < headersLength; n += 2) { + key = headers[n]; + val = headers[n + 1]; + typeof key !== "string" && (key = key.toString()); + typeof val !== "string" && (val = val.toString("utf8")); + kLen = key.length; + if (kLen === 14 && key[7] === "-" && (key === "content-length" || key.toLowerCase() === "content-length")) { + hasContentLength = true; + } else if (kLen === 19 && key[7] === "-" && (key === "content-disposition" || key.toLowerCase() === "content-disposition")) { + contentDispositionIdx = n + 1; } - return this; + ret[n] = key; + ret[n + 1] = val; } - [kRemoveClient](client) { - client.close(() => { - const idx = this[kClients].indexOf(client); - if (idx !== -1) { - this[kClients].splice(idx, 1); - } - }); - this[kNeedDrain] = this[kClients].some((dispatcher) => !dispatcher[kNeedDrain] && dispatcher.closed !== true && dispatcher.destroyed !== true); + if (hasContentLength && contentDispositionIdx !== -1) { + ret[contentDispositionIdx] = Buffer.from(ret[contentDispositionIdx]).toString("latin1"); } - }; - module2.exports = { - PoolBase, - kClients, - kNeedDrain, - kAddClient, - kRemoveClient, - kGetDispatcher - }; - } -}); - -// lib/core/constants.js -var require_constants = __commonJS({ - "lib/core/constants.js"(exports2, module2) { - "use strict"; - var headerNameLowerCasedRecord = {}; - var wellknownHeaderNames = [ - "Accept", - "Accept-Encoding", - "Accept-Language", - "Accept-Ranges", - "Access-Control-Allow-Credentials", - "Access-Control-Allow-Headers", - "Access-Control-Allow-Methods", - "Access-Control-Allow-Origin", - "Access-Control-Expose-Headers", - "Access-Control-Max-Age", - "Access-Control-Request-Headers", - "Access-Control-Request-Method", - "Age", - "Allow", - "Alt-Svc", - "Alt-Used", - "Authorization", - "Cache-Control", - "Clear-Site-Data", - "Connection", - "Content-Disposition", - "Content-Encoding", - "Content-Language", - "Content-Length", - "Content-Location", - "Content-Range", - "Content-Security-Policy", - "Content-Security-Policy-Report-Only", - "Content-Type", - "Cookie", - "Cross-Origin-Embedder-Policy", - "Cross-Origin-Opener-Policy", - "Cross-Origin-Resource-Policy", - "Date", - "Device-Memory", - "Downlink", - "ECT", - "ETag", - "Expect", - "Expect-CT", - "Expires", - "Forwarded", - "From", - "Host", - "If-Match", - "If-Modified-Since", - "If-None-Match", - "If-Range", - "If-Unmodified-Since", - "Keep-Alive", - "Last-Modified", - "Link", - "Location", - "Max-Forwards", - "Origin", - "Permissions-Policy", - "Pragma", - "Proxy-Authenticate", - "Proxy-Authorization", - "RTT", - "Range", - "Referer", - "Referrer-Policy", - "Refresh", - "Retry-After", - "Sec-WebSocket-Accept", - "Sec-WebSocket-Extensions", - "Sec-WebSocket-Key", - "Sec-WebSocket-Protocol", - "Sec-WebSocket-Version", - "Server", - "Server-Timing", - "Service-Worker-Allowed", - "Service-Worker-Navigation-Preload", - "Set-Cookie", - "SourceMap", - "Strict-Transport-Security", - "Supports-Loading-Mode", - "TE", - "Timing-Allow-Origin", - "Trailer", - "Transfer-Encoding", - "Upgrade", - "Upgrade-Insecure-Requests", - "User-Agent", - "Vary", - "Via", - "WWW-Authenticate", - "X-Content-Type-Options", - "X-DNS-Prefetch-Control", - "X-Frame-Options", - "X-Permitted-Cross-Domain-Policies", - "X-Powered-By", - "X-Requested-With", - "X-XSS-Protection" - ]; - for (let i = 0; i < wellknownHeaderNames.length; ++i) { - const key = wellknownHeaderNames[i]; - const lowerCasedKey = key.toLowerCase(); - headerNameLowerCasedRecord[key] = headerNameLowerCasedRecord[lowerCasedKey] = lowerCasedKey; + return ret; } - Object.setPrototypeOf(headerNameLowerCasedRecord, null); - module2.exports = { - wellknownHeaderNames, - headerNameLowerCasedRecord - }; - } -}); - -// lib/core/tree.js -var require_tree = __commonJS({ - "lib/core/tree.js"(exports2, module2) { - "use strict"; - var { - wellknownHeaderNames, - headerNameLowerCasedRecord - } = require_constants(); - var TstNode = class _TstNode { - static { - __name(this, "TstNode"); + __name(parseRawHeaders, "parseRawHeaders"); + function encodeRawHeaders(headers) { + if (!Array.isArray(headers)) { + throw new TypeError("expected headers to be an array"); } - /** @type {any} */ - value = null; - /** @type {null | TstNode} */ - left = null; - /** @type {null | TstNode} */ - middle = null; - /** @type {null | TstNode} */ - right = null; - /** @type {number} */ - code; - /** - * @param {string} key - * @param {any} value - * @param {number} index - */ - constructor(key, value, index) { - if (index === void 0 || index >= key.length) { - throw new TypeError("Unreachable"); - } - const code = this.code = key.charCodeAt(index); - if (code > 127) { - throw new TypeError("key must be ascii string"); + return headers.map((x) => Buffer.from(x)); + } + __name(encodeRawHeaders, "encodeRawHeaders"); + function isBuffer(buffer) { + return buffer instanceof Uint8Array || Buffer.isBuffer(buffer); + } + __name(isBuffer, "isBuffer"); + function assertRequestHandler(handler, method, upgrade) { + if (!handler || typeof handler !== "object") { + throw new InvalidArgumentError("handler must be an object"); + } + if (typeof handler.onRequestStart === "function") { + return; + } + if (typeof handler.onConnect !== "function") { + throw new InvalidArgumentError("invalid onConnect method"); + } + if (typeof handler.onError !== "function") { + throw new InvalidArgumentError("invalid onError method"); + } + if (typeof handler.onBodySent !== "function" && handler.onBodySent !== void 0) { + throw new InvalidArgumentError("invalid onBodySent method"); + } + if (upgrade || method === "CONNECT") { + if (typeof handler.onUpgrade !== "function") { + throw new InvalidArgumentError("invalid onUpgrade method"); } - if (key.length !== ++index) { - this.middle = new _TstNode(key, value, index); - } else { - this.value = value; + } else { + if (typeof handler.onHeaders !== "function") { + throw new InvalidArgumentError("invalid onHeaders method"); } - } - /** - * @param {string} key - * @param {any} value - */ - add(key, value) { - const length = key.length; - if (length === 0) { - throw new TypeError("Unreachable"); + if (typeof handler.onData !== "function") { + throw new InvalidArgumentError("invalid onData method"); } - let index = 0; - let node = this; - while (true) { - const code = key.charCodeAt(index); - if (code > 127) { - throw new TypeError("key must be ascii string"); - } - if (node.code === code) { - if (length === ++index) { - node.value = value; - break; - } else if (node.middle !== null) { - node = node.middle; - } else { - node.middle = new _TstNode(key, value, index); - break; - } - } else if (node.code < code) { - if (node.left !== null) { - node = node.left; - } else { - node.left = new _TstNode(key, value, index); - break; - } - } else if (node.right !== null) { - node = node.right; - } else { - node.right = new _TstNode(key, value, index); - break; - } + if (typeof handler.onComplete !== "function") { + throw new InvalidArgumentError("invalid onComplete method"); } } - /** - * @param {Uint8Array} key - * @return {TstNode | null} - */ - search(key) { - const keylength = key.length; - let index = 0; - let node = this; - while (node !== null && index < keylength) { - let code = key[index]; - if (code <= 90 && code >= 65) { - code |= 32; - } - while (node !== null) { - if (code === node.code) { - if (keylength === ++index) { - return node; + } + __name(assertRequestHandler, "assertRequestHandler"); + function isDisturbed(body) { + return !!(body && (stream.isDisturbed(body) || body[kBodyUsed])); + } + __name(isDisturbed, "isDisturbed"); + function getSocketInfo(socket) { + return { + localAddress: socket.localAddress, + localPort: socket.localPort, + remoteAddress: socket.remoteAddress, + remotePort: socket.remotePort, + remoteFamily: socket.remoteFamily, + timeout: socket.timeout, + bytesWritten: socket.bytesWritten, + bytesRead: socket.bytesRead + }; + } + __name(getSocketInfo, "getSocketInfo"); + function ReadableStreamFrom(iterable) { + let iterator; + return new ReadableStream( + { + async start() { + iterator = iterable[Symbol.asyncIterator](); + }, + async pull(controller) { + const { done, value } = await iterator.next(); + if (done) { + queueMicrotask(() => { + controller.close(); + controller.byobRequest?.respond(0); + }); + } else { + const buf = Buffer.isBuffer(value) ? value : Buffer.from(value); + if (buf.byteLength) { + controller.enqueue(new Uint8Array(buf)); } - node = node.middle; - break; } - node = node.code < code ? node.left : node.right; - } + return controller.desiredSize > 0; + }, + async cancel() { + await iterator.return(); + }, + type: "bytes" } - return null; + ); + } + __name(ReadableStreamFrom, "ReadableStreamFrom"); + function isFormDataLike(object) { + return object && typeof object === "object" && typeof object.append === "function" && typeof object.delete === "function" && typeof object.get === "function" && typeof object.getAll === "function" && typeof object.has === "function" && typeof object.set === "function" && object[Symbol.toStringTag] === "FormData"; + } + __name(isFormDataLike, "isFormDataLike"); + function addAbortListener(signal, listener) { + if ("addEventListener" in signal) { + signal.addEventListener("abort", listener, { once: true }); + return () => signal.removeEventListener("abort", listener); } - }; - var TernarySearchTree = class { - static { - __name(this, "TernarySearchTree"); + signal.once("abort", listener); + return () => signal.removeListener("abort", listener); + } + __name(addAbortListener, "addAbortListener"); + var toUSVString = (() => { + if (typeof String.prototype.toWellFormed === "function") { + return (value) => `${value}`.toWellFormed(); + } else { + return nodeUtil.toUSVString; } - /** @type {TstNode | null} */ - node = null; - /** - * @param {string} key - * @param {any} value - * */ - insert(key, value) { - if (this.node === null) { - this.node = new TstNode(key, value, 0); - } else { - this.node.add(key, value); - } + })(); + var isUSVString = (() => { + if (typeof String.prototype.isWellFormed === "function") { + return (value) => `${value}`.isWellFormed(); + } else { + return (value) => toUSVString(value) === `${value}`; } - /** - * @param {Uint8Array} key - * @return {any} - */ - lookup(key) { - return this.node?.search(key)?.value ?? null; + })(); + function isTokenCharCode(c) { + switch (c) { + case 34: + case 40: + case 41: + case 44: + case 47: + case 58: + case 59: + case 60: + case 61: + case 62: + case 63: + case 64: + case 91: + case 92: + case 93: + case 123: + case 125: + return false; + default: + return c >= 33 && c <= 126; + } + } + __name(isTokenCharCode, "isTokenCharCode"); + function isValidHTTPToken(characters) { + if (characters.length === 0) { + return false; + } + for (let i = 0; i < characters.length; ++i) { + if (!isTokenCharCode(characters.charCodeAt(i))) { + return false; + } + } + return true; + } + __name(isValidHTTPToken, "isValidHTTPToken"); + var headerCharRegex = /[^\t\x20-\x7e\x80-\xff]/; + function isValidHeaderValue(characters) { + return !headerCharRegex.test(characters); + } + __name(isValidHeaderValue, "isValidHeaderValue"); + var rangeHeaderRegex = /^bytes (\d+)-(\d+)\/(\d+)?$/; + function parseRangeHeader(range) { + if (range == null || range === "") return { start: 0, end: null, size: null }; + const m = range ? range.match(rangeHeaderRegex) : null; + return m ? { + start: parseInt(m[1]), + end: m[2] ? parseInt(m[2]) : null, + size: m[3] ? parseInt(m[3]) : null + } : null; + } + __name(parseRangeHeader, "parseRangeHeader"); + function addListener(obj, name, listener) { + const listeners = obj[kListeners] ??= []; + listeners.push([name, listener]); + obj.on(name, listener); + return obj; + } + __name(addListener, "addListener"); + function removeAllListeners(obj) { + if (obj[kListeners] != null) { + for (const [name, listener] of obj[kListeners]) { + obj.removeListener(name, listener); + } + obj[kListeners] = null; + } + return obj; + } + __name(removeAllListeners, "removeAllListeners"); + function errorRequest(client, request, err) { + try { + request.onError(err); + assert(request.aborted); + } catch (err2) { + client.emit("error", err2); } - }; - var tree = new TernarySearchTree(); - for (let i = 0; i < wellknownHeaderNames.length; ++i) { - const key = headerNameLowerCasedRecord[wellknownHeaderNames[i]]; - tree.insert(key, key); } + __name(errorRequest, "errorRequest"); + var kEnumerableProperty = /* @__PURE__ */ Object.create(null); + kEnumerableProperty.enumerable = true; + var normalizedMethodRecordsBase = { + delete: "DELETE", + DELETE: "DELETE", + get: "GET", + GET: "GET", + head: "HEAD", + HEAD: "HEAD", + options: "OPTIONS", + OPTIONS: "OPTIONS", + post: "POST", + POST: "POST", + put: "PUT", + PUT: "PUT" + }; + var normalizedMethodRecords = { + ...normalizedMethodRecordsBase, + patch: "patch", + PATCH: "PATCH" + }; + Object.setPrototypeOf(normalizedMethodRecordsBase, null); + Object.setPrototypeOf(normalizedMethodRecords, null); module2.exports = { - TernarySearchTree, - tree + kEnumerableProperty, + isDisturbed, + toUSVString, + isUSVString, + isBlobLike, + parseOrigin, + parseURL, + getServerName, + isStream, + isIterable, + isAsyncIterable, + isDestroyed, + headerNameToString, + bufferToLowerCasedHeaderName, + addListener, + removeAllListeners, + errorRequest, + parseRawHeaders, + encodeRawHeaders, + parseHeaders, + parseKeepAliveTimeout, + destroy, + bodyLength, + deepClone, + ReadableStreamFrom, + isBuffer, + assertRequestHandler, + getSocketInfo, + isFormDataLike, + serializePathWithQuery, + addAbortListener, + isValidHTTPToken, + isValidHeaderValue, + isTokenCharCode, + parseRangeHeader, + normalizedMethodRecordsBase, + normalizedMethodRecords, + isValidPort, + isHttpOrHttpsPrefixed, + nodeMajor, + nodeMinor, + safeHTTPMethods: Object.freeze(["GET", "HEAD", "OPTIONS", "TRACE"]), + wrapRequestBody }; } }); -// lib/core/util.js -var require_util = __commonJS({ - "lib/core/util.js"(exports2, module2) { +// lib/handler/unwrap-handler.js +var require_unwrap_handler = __commonJS({ + "lib/handler/unwrap-handler.js"(exports2, module2) { "use strict"; - var assert = require("node:assert"); - var { kDestroyed, kBodyUsed, kListeners, kBody } = require_symbols(); - var { IncomingMessage } = require("node:http"); - var stream = require("node:stream"); - var net = require("node:net"); - var { Blob: Blob2 } = require("node:buffer"); - var nodeUtil = require("node:util"); - var { stringify } = require("node:querystring"); - var { EventEmitter: EE } = require("node:events"); + var { parseHeaders } = require_util(); var { InvalidArgumentError } = require_errors(); - var { headerNameLowerCasedRecord } = require_constants(); - var { tree } = require_tree(); - var [nodeMajor, nodeMinor] = process.versions.node.split(".").map((v) => Number(v)); - var BodyAsyncIterable = class { + var kResume = Symbol("resume"); + var UnwrapController = class { static { - __name(this, "BodyAsyncIterable"); + __name(this, "UnwrapController"); } - constructor(body) { - this[kBody] = body; - this[kBodyUsed] = false; + #paused = false; + #reason = null; + #aborted = false; + #abort; + [kResume] = null; + constructor(abort) { + this.#abort = abort; } - async *[Symbol.asyncIterator]() { - assert(!this[kBodyUsed], "disturbed"); - this[kBodyUsed] = true; - yield* this[kBody]; + pause() { + this.#paused = true; } - }; - function wrapRequestBody(body) { - if (isStream(body)) { - if (bodyLength(body) === 0) { - body.on("data", function() { - assert(false); - }); + resume() { + if (this.#paused) { + this.#paused = false; + this[kResume]?.(); } - if (typeof body.readableDidRead !== "boolean") { - body[kBodyUsed] = false; - EE.prototype.on.call(body, "data", function() { - this[kBodyUsed] = true; - }); + } + abort(reason) { + if (!this.#aborted) { + this.#aborted = true; + this.#reason = reason; + this.#abort(reason); } - return body; - } else if (body && typeof body.pipeTo === "function") { - return new BodyAsyncIterable(body); - } else if (body && typeof body !== "string" && !ArrayBuffer.isView(body) && isIterable(body)) { - return new BodyAsyncIterable(body); - } else { - return body; } - } - __name(wrapRequestBody, "wrapRequestBody"); - function nop() { - } - __name(nop, "nop"); - function isStream(obj) { - return obj && typeof obj === "object" && typeof obj.pipe === "function" && typeof obj.on === "function"; - } - __name(isStream, "isStream"); - function isBlobLike(object) { - if (object === null) { - return false; - } else if (object instanceof Blob2) { - return true; - } else if (typeof object !== "object") { - return false; - } else { - const sTag = object[Symbol.toStringTag]; - return (sTag === "Blob" || sTag === "File") && ("stream" in object && typeof object.stream === "function" || "arrayBuffer" in object && typeof object.arrayBuffer === "function"); + get aborted() { + return this.#aborted; } - } - __name(isBlobLike, "isBlobLike"); - function buildURL(url, queryParams) { - if (url.includes("?") || url.includes("#")) { - throw new Error('Query params cannot be passed when url already contains "?" or "#".'); + get reason() { + return this.#reason; } - const stringified = stringify(queryParams); - if (stringified) { - url += "?" + stringified; + get paused() { + return this.#paused; } - return url; - } - __name(buildURL, "buildURL"); - function isValidPort(port) { - const value = parseInt(port, 10); - return value === Number(port) && value >= 0 && value <= 65535; - } - __name(isValidPort, "isValidPort"); - function isHttpOrHttpsPrefixed(value) { - return value != null && value[0] === "h" && value[1] === "t" && value[2] === "t" && value[3] === "p" && (value[4] === ":" || value[4] === "s" && value[5] === ":"); - } - __name(isHttpOrHttpsPrefixed, "isHttpOrHttpsPrefixed"); - function parseURL(url) { - if (typeof url === "string") { - url = new URL(url); - if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) { - throw new InvalidArgumentError("Invalid URL protocol: the URL must start with `http:` or `https:`."); - } - return url; + }; + module2.exports = class UnwrapHandler { + static { + __name(this, "UnwrapHandler"); } - if (!url || typeof url !== "object") { - throw new InvalidArgumentError("Invalid URL: The URL argument must be a non-null object."); + #handler; + #controller; + constructor(handler) { + this.#handler = handler; } - if (!(url instanceof URL)) { - if (url.port != null && url.port !== "" && isValidPort(url.port) === false) { - throw new InvalidArgumentError("Invalid URL: port must be a valid integer or a string representation of an integer."); - } - if (url.path != null && typeof url.path !== "string") { - throw new InvalidArgumentError("Invalid URL path: the path must be a string or null/undefined."); - } - if (url.pathname != null && typeof url.pathname !== "string") { - throw new InvalidArgumentError("Invalid URL pathname: the pathname must be a string or null/undefined."); - } - if (url.hostname != null && typeof url.hostname !== "string") { - throw new InvalidArgumentError("Invalid URL hostname: the hostname must be a string or null/undefined."); - } - if (url.origin != null && typeof url.origin !== "string") { - throw new InvalidArgumentError("Invalid URL origin: the origin must be a string or null/undefined."); - } - if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) { - throw new InvalidArgumentError("Invalid URL protocol: the URL must start with `http:` or `https:`."); - } - const port = url.port != null ? url.port : url.protocol === "https:" ? 443 : 80; - let origin = url.origin != null ? url.origin : `${url.protocol || ""}//${url.hostname || ""}:${port}`; - let path = url.path != null ? url.path : `${url.pathname || ""}${url.search || ""}`; - if (origin[origin.length - 1] === "/") { - origin = origin.slice(0, origin.length - 1); - } - if (path && path[0] !== "/") { - path = `/${path}`; - } - return new URL(`${origin}${path}`); + static unwrap(handler) { + return !handler.onRequestStart ? handler : new UnwrapHandler(handler); } - if (!isHttpOrHttpsPrefixed(url.origin || url.protocol)) { - throw new InvalidArgumentError("Invalid URL protocol: the URL must start with `http:` or `https:`."); + onConnect(abort, context) { + this.#controller = new UnwrapController(abort); + this.#handler.onRequestStart?.(this.#controller, context); } - return url; - } - __name(parseURL, "parseURL"); - function parseOrigin(url) { - url = parseURL(url); - if (url.pathname !== "/" || url.search || url.hash) { - throw new InvalidArgumentError("invalid url"); + onUpgrade(statusCode, rawHeaders, socket) { + this.#handler.onRequestUpgrade?.(this.#controller, statusCode, parseHeaders(rawHeaders), socket); } - return url; - } - __name(parseOrigin, "parseOrigin"); - function getHostname(host) { - if (host[0] === "[") { - const idx2 = host.indexOf("]"); - assert(idx2 !== -1); - return host.substring(1, idx2); + onHeaders(statusCode, rawHeaders, resume, statusMessage) { + this.#controller[kResume] = resume; + this.#handler.onResponseStart?.(this.#controller, statusCode, parseHeaders(rawHeaders), statusMessage); + return !this.#controller.paused; } - const idx = host.indexOf(":"); - if (idx === -1) - return host; - return host.substring(0, idx); - } - __name(getHostname, "getHostname"); - function getServerName(host) { - if (!host) { - return null; + onData(data) { + this.#handler.onResponseData?.(this.#controller, data); + return !this.#controller.paused; } - assert(typeof host === "string"); - const servername = getHostname(host); - if (net.isIP(servername)) { - return ""; + onComplete(rawTrailers) { + this.#handler.onResponseEnd?.(this.#controller, parseHeaders(rawTrailers)); } - return servername; - } - __name(getServerName, "getServerName"); - function deepClone(obj) { - return JSON.parse(JSON.stringify(obj)); - } - __name(deepClone, "deepClone"); - function isAsyncIterable(obj) { - return !!(obj != null && typeof obj[Symbol.asyncIterator] === "function"); - } - __name(isAsyncIterable, "isAsyncIterable"); - function isIterable(obj) { - return !!(obj != null && (typeof obj[Symbol.iterator] === "function" || typeof obj[Symbol.asyncIterator] === "function")); - } - __name(isIterable, "isIterable"); - function bodyLength(body) { - if (body == null) { - return 0; - } else if (isStream(body)) { - const state = body._readableState; - return state && state.objectMode === false && state.ended === true && Number.isFinite(state.length) ? state.length : null; - } else if (isBlobLike(body)) { - return body.size != null ? body.size : null; - } else if (isBuffer(body)) { - return body.byteLength; + onError(err) { + if (!this.#handler.onResponseError) { + throw new InvalidArgumentError("invalid onError method"); + } + this.#handler.onResponseError?.(this.#controller, err); } - return null; - } - __name(bodyLength, "bodyLength"); - function isDestroyed(body) { - return body && !!(body.destroyed || body[kDestroyed] || stream.isDestroyed?.(body)); - } - __name(isDestroyed, "isDestroyed"); - function destroy(stream2, err) { - if (stream2 == null || !isStream(stream2) || isDestroyed(stream2)) { - return; + }; + } +}); + +// lib/dispatcher/dispatcher-base.js +var require_dispatcher_base = __commonJS({ + "lib/dispatcher/dispatcher-base.js"(exports2, module2) { + "use strict"; + var Dispatcher = require_dispatcher(); + var UnwrapHandler = require_unwrap_handler(); + var { + ClientDestroyedError, + ClientClosedError, + InvalidArgumentError + } = require_errors(); + var { kDestroy, kClose, kClosed, kDestroyed, kDispatch } = require_symbols(); + var kOnDestroyed = Symbol("onDestroyed"); + var kOnClosed = Symbol("onClosed"); + var DispatcherBase = class extends Dispatcher { + static { + __name(this, "DispatcherBase"); } - if (typeof stream2.destroy === "function") { - if (Object.getPrototypeOf(stream2).constructor === IncomingMessage) { - stream2.socket = null; - } - stream2.destroy(err); - } else if (err) { - queueMicrotask(() => { - stream2.emit("error", err); - }); + constructor() { + super(); + this[kDestroyed] = false; + this[kOnDestroyed] = null; + this[kClosed] = false; + this[kOnClosed] = []; } - if (stream2.destroyed !== true) { - stream2[kDestroyed] = true; + get destroyed() { + return this[kDestroyed]; } - } - __name(destroy, "destroy"); - var KEEPALIVE_TIMEOUT_EXPR = /timeout=(\d+)/; - function parseKeepAliveTimeout(val) { - const m = val.toString().match(KEEPALIVE_TIMEOUT_EXPR); - return m ? parseInt(m[1], 10) * 1e3 : null; - } - __name(parseKeepAliveTimeout, "parseKeepAliveTimeout"); - function headerNameToString(value) { - return typeof value === "string" ? headerNameLowerCasedRecord[value] ?? value.toLowerCase() : tree.lookup(value) ?? value.toString("latin1").toLowerCase(); - } - __name(headerNameToString, "headerNameToString"); - function bufferToLowerCasedHeaderName(value) { - return tree.lookup(value) ?? value.toString("latin1").toLowerCase(); - } - __name(bufferToLowerCasedHeaderName, "bufferToLowerCasedHeaderName"); - function parseHeaders(headers, obj) { - if (obj === void 0) - obj = {}; - for (let i = 0; i < headers.length; i += 2) { - const key = headerNameToString(headers[i]); - let val = obj[key]; - if (val) { - if (typeof val === "string") { - val = [val]; - obj[key] = val; - } - val.push(headers[i + 1].toString("utf8")); - } else { - const headersValue = headers[i + 1]; - if (typeof headersValue === "string") { - obj[key] = headersValue; + get closed() { + return this[kClosed]; + } + close(callback) { + if (callback === void 0) { + return new Promise((resolve, reject) => { + this.close((err, data) => { + return err ? reject(err) : resolve(data); + }); + }); + } + if (typeof callback !== "function") { + throw new InvalidArgumentError("invalid callback"); + } + if (this[kDestroyed]) { + queueMicrotask(() => callback(new ClientDestroyedError(), null)); + return; + } + if (this[kClosed]) { + if (this[kOnClosed]) { + this[kOnClosed].push(callback); } else { - obj[key] = Array.isArray(headersValue) ? headersValue.map((x) => x.toString("utf8")) : headersValue.toString("utf8"); + queueMicrotask(() => callback(null, null)); } + return; } + this[kClosed] = true; + this[kOnClosed].push(callback); + const onClosed = /* @__PURE__ */ __name(() => { + const callbacks = this[kOnClosed]; + this[kOnClosed] = null; + for (let i = 0; i < callbacks.length; i++) { + callbacks[i](null, null); + } + }, "onClosed"); + this[kClose]().then(() => this.destroy()).then(() => { + queueMicrotask(onClosed); + }); } - if ("content-length" in obj && "content-disposition" in obj) { - obj["content-disposition"] = Buffer.from(obj["content-disposition"]).toString("latin1"); - } - return obj; - } - __name(parseHeaders, "parseHeaders"); - function parseRawHeaders(headers) { - const len = headers.length; - const ret = new Array(len); - let hasContentLength = false; - let contentDispositionIdx = -1; - let key; - let val; - let kLen = 0; - for (let n = 0; n < headers.length; n += 2) { - key = headers[n]; - val = headers[n + 1]; - typeof key !== "string" && (key = key.toString()); - typeof val !== "string" && (val = val.toString("utf8")); - kLen = key.length; - if (kLen === 14 && key[7] === "-" && (key === "content-length" || key.toLowerCase() === "content-length")) { - hasContentLength = true; - } else if (kLen === 19 && key[7] === "-" && (key === "content-disposition" || key.toLowerCase() === "content-disposition")) { - contentDispositionIdx = n + 1; + destroy(err, callback) { + if (typeof err === "function") { + callback = err; + err = null; } - ret[n] = key; - ret[n + 1] = val; - } - if (hasContentLength && contentDispositionIdx !== -1) { - ret[contentDispositionIdx] = Buffer.from(ret[contentDispositionIdx]).toString("latin1"); - } - return ret; - } - __name(parseRawHeaders, "parseRawHeaders"); - function isBuffer(buffer) { - return buffer instanceof Uint8Array || Buffer.isBuffer(buffer); - } - __name(isBuffer, "isBuffer"); - function validateHandler(handler, method, upgrade) { - if (!handler || typeof handler !== "object") { - throw new InvalidArgumentError("handler must be an object"); - } - if (typeof handler.onConnect !== "function") { - throw new InvalidArgumentError("invalid onConnect method"); - } - if (typeof handler.onError !== "function") { - throw new InvalidArgumentError("invalid onError method"); - } - if (typeof handler.onBodySent !== "function" && handler.onBodySent !== void 0) { - throw new InvalidArgumentError("invalid onBodySent method"); - } - if (upgrade || method === "CONNECT") { - if (typeof handler.onUpgrade !== "function") { - throw new InvalidArgumentError("invalid onUpgrade method"); + if (callback === void 0) { + return new Promise((resolve, reject) => { + this.destroy(err, (err2, data) => { + return err2 ? ( + /* istanbul ignore next: should never error */ + reject(err2) + ) : resolve(data); + }); + }); } - } else { - if (typeof handler.onHeaders !== "function") { - throw new InvalidArgumentError("invalid onHeaders method"); + if (typeof callback !== "function") { + throw new InvalidArgumentError("invalid callback"); } - if (typeof handler.onData !== "function") { - throw new InvalidArgumentError("invalid onData method"); + if (this[kDestroyed]) { + if (this[kOnDestroyed]) { + this[kOnDestroyed].push(callback); + } else { + queueMicrotask(() => callback(null, null)); + } + return; } - if (typeof handler.onComplete !== "function") { - throw new InvalidArgumentError("invalid onComplete method"); + if (!err) { + err = new ClientDestroyedError(); } + this[kDestroyed] = true; + this[kOnDestroyed] = this[kOnDestroyed] || []; + this[kOnDestroyed].push(callback); + const onDestroyed = /* @__PURE__ */ __name(() => { + const callbacks = this[kOnDestroyed]; + this[kOnDestroyed] = null; + for (let i = 0; i < callbacks.length; i++) { + callbacks[i](null, null); + } + }, "onDestroyed"); + this[kDestroy](err).then(() => { + queueMicrotask(onDestroyed); + }); } - } - __name(validateHandler, "validateHandler"); - function isDisturbed(body) { - return !!(body && (stream.isDisturbed(body) || body[kBodyUsed])); - } - __name(isDisturbed, "isDisturbed"); - function isErrored(body) { - return !!(body && stream.isErrored(body)); - } - __name(isErrored, "isErrored"); - function isReadable(body) { - return !!(body && stream.isReadable(body)); - } - __name(isReadable, "isReadable"); - function getSocketInfo(socket) { - return { - localAddress: socket.localAddress, - localPort: socket.localPort, - remoteAddress: socket.remoteAddress, - remotePort: socket.remotePort, - remoteFamily: socket.remoteFamily, - timeout: socket.timeout, - bytesWritten: socket.bytesWritten, - bytesRead: socket.bytesRead - }; - } - __name(getSocketInfo, "getSocketInfo"); - function ReadableStreamFrom(iterable) { - let iterator; - return new ReadableStream( - { - async start() { - iterator = iterable[Symbol.asyncIterator](); - }, - async pull(controller) { - const { done, value } = await iterator.next(); - if (done) { - queueMicrotask(() => { - controller.close(); - controller.byobRequest?.respond(0); - }); - } else { - const buf = Buffer.isBuffer(value) ? value : Buffer.from(value); - if (buf.byteLength) { - controller.enqueue(new Uint8Array(buf)); - } + dispatch(opts, handler) { + if (!handler || typeof handler !== "object") { + throw new InvalidArgumentError("handler must be an object"); + } + handler = UnwrapHandler.unwrap(handler); + try { + if (!opts || typeof opts !== "object") { + throw new InvalidArgumentError("opts must be an object."); + } + if (this[kDestroyed] || this[kOnDestroyed]) { + throw new ClientDestroyedError(); + } + if (this[kClosed]) { + throw new ClientClosedError(); + } + return this[kDispatch](opts, handler); + } catch (err) { + if (typeof handler.onError !== "function") { + throw err; + } + handler.onError(err); + return false; + } + } + }; + module2.exports = DispatcherBase; + } +}); + +// lib/dispatcher/fixed-queue.js +var require_fixed_queue = __commonJS({ + "lib/dispatcher/fixed-queue.js"(exports2, module2) { + "use strict"; + var kSize = 2048; + var kMask = kSize - 1; + var FixedCircularBuffer = class { + static { + __name(this, "FixedCircularBuffer"); + } + constructor() { + this.bottom = 0; + this.top = 0; + this.list = new Array(kSize).fill(void 0); + this.next = null; + } + /** + * @returns {boolean} + */ + isEmpty() { + return this.top === this.bottom; + } + /** + * @returns {boolean} + */ + isFull() { + return (this.top + 1 & kMask) === this.bottom; + } + /** + * @param {T} data + * @returns {void} + */ + push(data) { + this.list[this.top] = data; + this.top = this.top + 1 & kMask; + } + /** + * @returns {T|null} + */ + shift() { + const nextItem = this.list[this.bottom]; + if (nextItem === void 0) { + return null; + } + this.list[this.bottom] = void 0; + this.bottom = this.bottom + 1 & kMask; + return nextItem; + } + }; + module2.exports = class FixedQueue { + static { + __name(this, "FixedQueue"); + } + constructor() { + this.head = this.tail = new FixedCircularBuffer(); + } + /** + * @returns {boolean} + */ + isEmpty() { + return this.head.isEmpty(); + } + /** + * @param {T} data + */ + push(data) { + if (this.head.isFull()) { + this.head = this.head.next = new FixedCircularBuffer(); + } + this.head.push(data); + } + /** + * @returns {T|null} + */ + shift() { + const tail = this.tail; + const next = tail.shift(); + if (tail.isEmpty() && tail.next !== null) { + this.tail = tail.next; + tail.next = null; + } + return next; + } + }; + } +}); + +// lib/dispatcher/pool-stats.js +var require_pool_stats = __commonJS({ + "lib/dispatcher/pool-stats.js"(exports2, module2) { + "use strict"; + var { kFree, kConnected, kPending, kQueued, kRunning, kSize } = require_symbols(); + var kPool = Symbol("pool"); + var PoolStats = class { + static { + __name(this, "PoolStats"); + } + constructor(pool) { + this[kPool] = pool; + } + get connected() { + return this[kPool][kConnected]; + } + get free() { + return this[kPool][kFree]; + } + get pending() { + return this[kPool][kPending]; + } + get queued() { + return this[kPool][kQueued]; + } + get running() { + return this[kPool][kRunning]; + } + get size() { + return this[kPool][kSize]; + } + }; + module2.exports = PoolStats; + } +}); + +// lib/dispatcher/pool-base.js +var require_pool_base = __commonJS({ + "lib/dispatcher/pool-base.js"(exports2, module2) { + "use strict"; + var DispatcherBase = require_dispatcher_base(); + var FixedQueue = require_fixed_queue(); + var { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = require_symbols(); + var PoolStats = require_pool_stats(); + var kClients = Symbol("clients"); + var kNeedDrain = Symbol("needDrain"); + var kQueue = Symbol("queue"); + var kClosedResolve = Symbol("closed resolve"); + var kOnDrain = Symbol("onDrain"); + var kOnConnect = Symbol("onConnect"); + var kOnDisconnect = Symbol("onDisconnect"); + var kOnConnectionError = Symbol("onConnectionError"); + var kGetDispatcher = Symbol("get dispatcher"); + var kAddClient = Symbol("add client"); + var kRemoveClient = Symbol("remove client"); + var kStats = Symbol("stats"); + var PoolBase = class extends DispatcherBase { + static { + __name(this, "PoolBase"); + } + constructor() { + super(); + this[kQueue] = new FixedQueue(); + this[kClients] = []; + this[kQueued] = 0; + const pool = this; + this[kOnDrain] = /* @__PURE__ */ __name(function onDrain(origin, targets) { + const queue = pool[kQueue]; + let needDrain = false; + while (!needDrain) { + const item = queue.shift(); + if (!item) { + break; } - return controller.desiredSize > 0; - }, - async cancel(reason) { - await iterator.return(); - }, - type: "bytes" + pool[kQueued]--; + needDrain = !this.dispatch(item.opts, item.handler); + } + this[kNeedDrain] = needDrain; + if (!this[kNeedDrain] && pool[kNeedDrain]) { + pool[kNeedDrain] = false; + pool.emit("drain", origin, [pool, ...targets]); + } + if (pool[kClosedResolve] && queue.isEmpty()) { + Promise.all(pool[kClients].map((c) => c.close())).then(pool[kClosedResolve]); + } + }, "onDrain"); + this[kOnConnect] = (origin, targets) => { + pool.emit("connect", origin, [pool, ...targets]); + }; + this[kOnDisconnect] = (origin, targets, err) => { + pool.emit("disconnect", origin, [pool, ...targets], err); + }; + this[kOnConnectionError] = (origin, targets, err) => { + pool.emit("connectionError", origin, [pool, ...targets], err); + }; + this[kStats] = new PoolStats(this); + } + get [kBusy]() { + return this[kNeedDrain]; + } + get [kConnected]() { + return this[kClients].filter((client) => client[kConnected]).length; + } + get [kFree]() { + return this[kClients].filter((client) => client[kConnected] && !client[kNeedDrain]).length; + } + get [kPending]() { + let ret = this[kQueued]; + for (const { [kPending]: pending } of this[kClients]) { + ret += pending; } - ); - } - __name(ReadableStreamFrom, "ReadableStreamFrom"); - function isFormDataLike(object) { - return object && typeof object === "object" && typeof object.append === "function" && typeof object.delete === "function" && typeof object.get === "function" && typeof object.getAll === "function" && typeof object.has === "function" && typeof object.set === "function" && object[Symbol.toStringTag] === "FormData"; - } - __name(isFormDataLike, "isFormDataLike"); - function addAbortListener(signal, listener) { - if ("addEventListener" in signal) { - signal.addEventListener("abort", listener, { once: true }); - return () => signal.removeEventListener("abort", listener); + return ret; } - signal.addListener("abort", listener); - return () => signal.removeListener("abort", listener); - } - __name(addAbortListener, "addAbortListener"); - var hasToWellFormed = typeof String.prototype.toWellFormed === "function"; - var hasIsWellFormed = typeof String.prototype.isWellFormed === "function"; - function toUSVString(val) { - return hasToWellFormed ? `${val}`.toWellFormed() : nodeUtil.toUSVString(val); - } - __name(toUSVString, "toUSVString"); - function isUSVString(val) { - return hasIsWellFormed ? `${val}`.isWellFormed() : toUSVString(val) === `${val}`; - } - __name(isUSVString, "isUSVString"); - function isTokenCharCode(c) { - switch (c) { - case 34: - case 40: - case 41: - case 44: - case 47: - case 58: - case 59: - case 60: - case 61: - case 62: - case 63: - case 64: - case 91: - case 92: - case 93: - case 123: - case 125: - return false; - default: - return c >= 33 && c <= 126; + get [kRunning]() { + let ret = 0; + for (const { [kRunning]: running } of this[kClients]) { + ret += running; + } + return ret; + } + get [kSize]() { + let ret = this[kQueued]; + for (const { [kSize]: size } of this[kClients]) { + ret += size; + } + return ret; + } + get stats() { + return this[kStats]; + } + async [kClose]() { + if (this[kQueue].isEmpty()) { + await Promise.all(this[kClients].map((c) => c.close())); + } else { + await new Promise((resolve) => { + this[kClosedResolve] = resolve; + }); + } } - } - __name(isTokenCharCode, "isTokenCharCode"); - function isValidHTTPToken(characters) { - if (characters.length === 0) { - return false; + async [kDestroy](err) { + while (true) { + const item = this[kQueue].shift(); + if (!item) { + break; + } + item.handler.onError(err); + } + await Promise.all(this[kClients].map((c) => c.destroy(err))); } - for (let i = 0; i < characters.length; ++i) { - if (!isTokenCharCode(characters.charCodeAt(i))) { - return false; + [kDispatch](opts, handler) { + const dispatcher = this[kGetDispatcher](); + if (!dispatcher) { + this[kNeedDrain] = true; + this[kQueue].push({ opts, handler }); + this[kQueued]++; + } else if (!dispatcher.dispatch(opts, handler)) { + dispatcher[kNeedDrain] = true; + this[kNeedDrain] = !this[kGetDispatcher](); } + return !this[kNeedDrain]; } - return true; - } - __name(isValidHTTPToken, "isValidHTTPToken"); - var headerCharRegex = /[^\t\x20-\x7e\x80-\xff]/; - function isValidHeaderValue(characters) { - return !headerCharRegex.test(characters); - } - __name(isValidHeaderValue, "isValidHeaderValue"); - function parseRangeHeader(range) { - if (range == null || range === "") - return { start: 0, end: null, size: null }; - const m = range ? range.match(/^bytes (\d+)-(\d+)\/(\d+)?$/) : null; - return m ? { - start: parseInt(m[1]), - end: m[2] ? parseInt(m[2]) : null, - size: m[3] ? parseInt(m[3]) : null - } : null; - } - __name(parseRangeHeader, "parseRangeHeader"); - function addListener(obj, name, listener) { - const listeners = obj[kListeners] ??= []; - listeners.push([name, listener]); - obj.on(name, listener); - return obj; - } - __name(addListener, "addListener"); - function removeAllListeners(obj) { - for (const [name, listener] of obj[kListeners] ?? []) { - obj.removeListener(name, listener); + [kAddClient](client) { + client.on("drain", this[kOnDrain]).on("connect", this[kOnConnect]).on("disconnect", this[kOnDisconnect]).on("connectionError", this[kOnConnectionError]); + this[kClients].push(client); + if (this[kNeedDrain]) { + queueMicrotask(() => { + if (this[kNeedDrain]) { + this[kOnDrain](client[kUrl], [this, client]); + } + }); + } + return this; } - obj[kListeners] = null; - } - __name(removeAllListeners, "removeAllListeners"); - function errorRequest(client, request, err) { - try { - request.onError(err); - assert(request.aborted); - } catch (err2) { - client.emit("error", err2); + [kRemoveClient](client) { + client.close(() => { + const idx = this[kClients].indexOf(client); + if (idx !== -1) { + this[kClients].splice(idx, 1); + } + }); + this[kNeedDrain] = this[kClients].some((dispatcher) => !dispatcher[kNeedDrain] && dispatcher.closed !== true && dispatcher.destroyed !== true); } - } - __name(errorRequest, "errorRequest"); - var kEnumerableProperty = /* @__PURE__ */ Object.create(null); - kEnumerableProperty.enumerable = true; - var normalizedMethodRecordsBase = { - delete: "DELETE", - DELETE: "DELETE", - get: "GET", - GET: "GET", - head: "HEAD", - HEAD: "HEAD", - options: "OPTIONS", - OPTIONS: "OPTIONS", - post: "POST", - POST: "POST", - put: "PUT", - PUT: "PUT" - }; - var normalizedMethodRecords = { - ...normalizedMethodRecordsBase, - patch: "patch", - PATCH: "PATCH" }; - Object.setPrototypeOf(normalizedMethodRecordsBase, null); - Object.setPrototypeOf(normalizedMethodRecords, null); module2.exports = { - kEnumerableProperty, - nop, - isDisturbed, - isErrored, - isReadable, - toUSVString, - isUSVString, - isBlobLike, - parseOrigin, - parseURL, - getServerName, - isStream, - isIterable, - isAsyncIterable, - isDestroyed, - headerNameToString, - bufferToLowerCasedHeaderName, - addListener, - removeAllListeners, - errorRequest, - parseRawHeaders, - parseHeaders, - parseKeepAliveTimeout, - destroy, - bodyLength, - deepClone, - ReadableStreamFrom, - isBuffer, - validateHandler, - getSocketInfo, - isFormDataLike, - buildURL, - addAbortListener, - isValidHTTPToken, - isValidHeaderValue, - isTokenCharCode, - parseRangeHeader, - normalizedMethodRecordsBase, - normalizedMethodRecords, - isValidPort, - isHttpOrHttpsPrefixed, - nodeMajor, - nodeMinor, - safeHTTPMethods: ["GET", "HEAD", "OPTIONS", "TRACE"], - wrapRequestBody + PoolBase, + kClients, + kNeedDrain, + kAddClient, + kRemoveClient, + kGetDispatcher }; } }); @@ -1677,7 +1845,6 @@ var require_diagnostics = __commonJS({ var undiciDebugLog = util.debuglog("undici"); var fetchDebuglog = util.debuglog("fetch"); var websocketDebuglog = util.debuglog("websocket"); - var isClientSet = false; var channels = { // Client beforeConnect: diagnosticsChannel.channel("undici:client:beforeConnect"), @@ -1697,116 +1864,50 @@ var require_diagnostics = __commonJS({ ping: diagnosticsChannel.channel("undici:websocket:ping"), pong: diagnosticsChannel.channel("undici:websocket:pong") }; - if (undiciDebugLog.enabled || fetchDebuglog.enabled) { - const debuglog = fetchDebuglog.enabled ? fetchDebuglog : undiciDebugLog; - diagnosticsChannel.channel("undici:client:beforeConnect").subscribe((evt) => { - const { - connectParams: { version, protocol, port, host } - } = evt; - debuglog( - "connecting to %s using %s%s", - `${host}${port ? `:${port}` : ""}`, - protocol, - version - ); - }); - diagnosticsChannel.channel("undici:client:connected").subscribe((evt) => { - const { - connectParams: { version, protocol, port, host } - } = evt; - debuglog( - "connected to %s using %s%s", - `${host}${port ? `:${port}` : ""}`, - protocol, - version - ); - }); - diagnosticsChannel.channel("undici:client:connectError").subscribe((evt) => { - const { - connectParams: { version, protocol, port, host }, - error - } = evt; - debuglog( - "connection to %s using %s%s errored - %s", - `${host}${port ? `:${port}` : ""}`, - protocol, - version, - error.message - ); - }); - diagnosticsChannel.channel("undici:client:sendHeaders").subscribe((evt) => { - const { - request: { method, path, origin } - } = evt; - debuglog("sending request to %s %s/%s", method, origin, path); - }); - diagnosticsChannel.channel("undici:request:headers").subscribe((evt) => { - const { - request: { method, path, origin }, - response: { statusCode } - } = evt; - debuglog( - "received response to %s %s/%s - HTTP %d", - method, - origin, - path, - statusCode - ); - }); - diagnosticsChannel.channel("undici:request:trailers").subscribe((evt) => { - const { - request: { method, path, origin } - } = evt; - debuglog("trailers received from %s %s/%s", method, origin, path); - }); - diagnosticsChannel.channel("undici:request:error").subscribe((evt) => { - const { - request: { method, path, origin }, - error - } = evt; - debuglog( - "request to %s %s/%s errored - %s", - method, - origin, - path, - error.message - ); - }); - isClientSet = true; - } - if (websocketDebuglog.enabled) { - if (!isClientSet) { - const debuglog = undiciDebugLog.enabled ? undiciDebugLog : websocketDebuglog; - diagnosticsChannel.channel("undici:client:beforeConnect").subscribe((evt) => { + var isTrackingClientEvents = false; + function trackClientEvents(debugLog = undiciDebugLog) { + if (isTrackingClientEvents) { + return; + } + isTrackingClientEvents = true; + diagnosticsChannel.subscribe( + "undici:client:beforeConnect", + (evt) => { const { connectParams: { version, protocol, port, host } } = evt; - debuglog( + debugLog( "connecting to %s%s using %s%s", host, port ? `:${port}` : "", protocol, version ); - }); - diagnosticsChannel.channel("undici:client:connected").subscribe((evt) => { + } + ); + diagnosticsChannel.subscribe( + "undici:client:connected", + (evt) => { const { connectParams: { version, protocol, port, host } } = evt; - debuglog( + debugLog( "connected to %s%s using %s%s", host, port ? `:${port}` : "", protocol, version ); - }); - diagnosticsChannel.channel("undici:client:connectError").subscribe((evt) => { + } + ); + diagnosticsChannel.subscribe( + "undici:client:connectError", + (evt) => { const { connectParams: { version, protocol, port, host }, error } = evt; - debuglog( + debugLog( "connection to %s%s using %s%s errored - %s", host, port ? `:${port}` : "", @@ -1814,38 +1915,122 @@ var require_diagnostics = __commonJS({ version, error.message ); - }); - diagnosticsChannel.channel("undici:client:sendHeaders").subscribe((evt) => { + } + ); + diagnosticsChannel.subscribe( + "undici:client:sendHeaders", + (evt) => { const { request: { method, path, origin } } = evt; - debuglog("sending request to %s %s/%s", method, origin, path); - }); + debugLog("sending request to %s %s/%s", method, origin, path); + } + ); + } + __name(trackClientEvents, "trackClientEvents"); + var isTrackingRequestEvents = false; + function trackRequestEvents(debugLog = undiciDebugLog) { + if (isTrackingRequestEvents) { + return; } - diagnosticsChannel.channel("undici:websocket:open").subscribe((evt) => { - const { - address: { address, port } - } = evt; - websocketDebuglog("connection opened %s%s", address, port ? `:${port}` : ""); - }); - diagnosticsChannel.channel("undici:websocket:close").subscribe((evt) => { - const { websocket, code, reason } = evt; - websocketDebuglog( - "closed connection to %s - %s %s", - websocket.url, - code, - reason - ); - }); - diagnosticsChannel.channel("undici:websocket:socket_error").subscribe((err) => { - websocketDebuglog("connection errored - %s", err.message); - }); - diagnosticsChannel.channel("undici:websocket:ping").subscribe((evt) => { - websocketDebuglog("ping received"); - }); - diagnosticsChannel.channel("undici:websocket:pong").subscribe((evt) => { - websocketDebuglog("pong received"); - }); + isTrackingRequestEvents = true; + diagnosticsChannel.subscribe( + "undici:request:headers", + (evt) => { + const { + request: { method, path, origin }, + response: { statusCode } + } = evt; + debugLog( + "received response to %s %s/%s - HTTP %d", + method, + origin, + path, + statusCode + ); + } + ); + diagnosticsChannel.subscribe( + "undici:request:trailers", + (evt) => { + const { + request: { method, path, origin } + } = evt; + debugLog("trailers received from %s %s/%s", method, origin, path); + } + ); + diagnosticsChannel.subscribe( + "undici:request:error", + (evt) => { + const { + request: { method, path, origin }, + error + } = evt; + debugLog( + "request to %s %s/%s errored - %s", + method, + origin, + path, + error.message + ); + } + ); + } + __name(trackRequestEvents, "trackRequestEvents"); + var isTrackingWebSocketEvents = false; + function trackWebSocketEvents(debugLog = websocketDebuglog) { + if (isTrackingWebSocketEvents) { + return; + } + isTrackingWebSocketEvents = true; + diagnosticsChannel.subscribe( + "undici:websocket:open", + (evt) => { + const { + address: { address, port } + } = evt; + debugLog("connection opened %s%s", address, port ? `:${port}` : ""); + } + ); + diagnosticsChannel.subscribe( + "undici:websocket:close", + (evt) => { + const { websocket, code, reason } = evt; + debugLog( + "closed connection to %s - %s %s", + websocket.url, + code, + reason + ); + } + ); + diagnosticsChannel.subscribe( + "undici:websocket:socket_error", + (err) => { + debugLog("connection errored - %s", err.message); + } + ); + diagnosticsChannel.subscribe( + "undici:websocket:ping", + (evt) => { + debugLog("ping received"); + } + ); + diagnosticsChannel.subscribe( + "undici:websocket:pong", + (evt) => { + debugLog("pong received"); + } + ); + } + __name(trackWebSocketEvents, "trackWebSocketEvents"); + if (undiciDebugLog.enabled || fetchDebuglog.enabled) { + trackClientEvents(fetchDebuglog.enabled ? fetchDebuglog : undiciDebugLog); + trackRequestEvents(fetchDebuglog.enabled ? fetchDebuglog : undiciDebugLog); + } + if (websocketDebuglog.enabled) { + trackClientEvents(undiciDebugLog.enabled ? undiciDebugLog : websocketDebuglog); + trackWebSocketEvents(websocketDebuglog); } module2.exports = { channels @@ -1871,8 +2056,8 @@ var require_request = __commonJS({ isFormDataLike, isIterable, isBlobLike, - buildURL, - validateHandler, + serializePathWithQuery, + assertRequestHandler, getServerName, normalizedMethodRecords } = require_util(); @@ -1896,9 +2081,9 @@ var require_request = __commonJS({ headersTimeout, bodyTimeout, reset, - throwOnError, expectContinue, - servername + servername, + throwOnError }, handler) { if (typeof path !== "string") { throw new InvalidArgumentError("path must be a string"); @@ -1927,9 +2112,11 @@ var require_request = __commonJS({ if (expectContinue != null && typeof expectContinue !== "boolean") { throw new InvalidArgumentError("invalid expectContinue"); } + if (throwOnError != null) { + throw new InvalidArgumentError("invalid throwOnError"); + } this.headersTimeout = headersTimeout; this.bodyTimeout = bodyTimeout; - this.throwOnError = throwOnError === true; this.method = method; this.abort = null; if (body == null) { @@ -1967,10 +2154,10 @@ var require_request = __commonJS({ this.completed = false; this.aborted = false; this.upgrade = upgrade || null; - this.path = query ? buildURL(path, query) : path; + this.path = query ? serializePathWithQuery(path, query) : path; this.origin = origin; this.idempotent = idempotent == null ? method === "HEAD" || method === "GET" : idempotent; - this.blocking = blocking == null ? false : blocking; + this.blocking = blocking ?? this.method !== "HEAD"; this.reset = reset == null ? null : reset; this.host = null; this.contentLength = null; @@ -2001,8 +2188,8 @@ var require_request = __commonJS({ } else if (headers != null) { throw new InvalidArgumentError("headers must be an object or an array"); } - validateHandler(handler, method, upgrade); - this.servername = servername || getServerName(this.host); + assertRequestHandler(handler, method, upgrade); + this.servername = servername || getServerName(this.host) || null; this[kHandler] = handler; if (channels.create.hasSubscribers) { channels.create.publish({ request: this }); @@ -2072,6 +2259,7 @@ var require_request = __commonJS({ onComplete(trailers) { this.onFinally(); assert(!this.aborted); + assert(!this.completed); this.completed = true; if (channels.trailers.hasSubscribers) { channels.trailers.publish({ request: this, trailers }); @@ -2612,15 +2800,13 @@ var require_utils = __commonJS({ "use strict"; Object.defineProperty(exports2, "__esModule", { value: true }); exports2.enumToMap = void 0; - function enumToMap(obj) { - const res = {}; - Object.keys(obj).forEach((key) => { - const value = obj[key]; - if (typeof value === "number") { - res[key] = value; - } - }); - return res; + function enumToMap(obj, filter = [], exceptions = []) { + var _a, _b; + const emptyFilter = ((_a = filter === null || filter === void 0 ? void 0 : filter.length) !== null && _a !== void 0 ? _a : 0) === 0; + const emptyExceptions = ((_b = exceptions === null || exceptions === void 0 ? void 0 : exceptions.length) !== null && _b !== void 0 ? _b : 0) === 0; + return Object.fromEntries(Object.entries(obj).filter(([, value]) => { + return typeof value === "number" && (emptyFilter || filter.includes(value)) && (emptyExceptions || !exceptions.includes(value)); + })); } __name(enumToMap, "enumToMap"); exports2.enumToMap = enumToMap; @@ -2632,180 +2818,452 @@ var require_constants2 = __commonJS({ "lib/llhttp/constants.js"(exports2) { "use strict"; Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.SPECIAL_HEADERS = exports2.HEADER_STATE = exports2.MINOR = exports2.MAJOR = exports2.CONNECTION_TOKEN_CHARS = exports2.HEADER_CHARS = exports2.TOKEN = exports2.STRICT_TOKEN = exports2.HEX = exports2.URL_CHAR = exports2.STRICT_URL_CHAR = exports2.USERINFO_CHARS = exports2.MARK = exports2.ALPHANUM = exports2.NUM = exports2.HEX_MAP = exports2.NUM_MAP = exports2.ALPHA = exports2.FINISH = exports2.H_METHOD_MAP = exports2.METHOD_MAP = exports2.METHODS_RTSP = exports2.METHODS_ICE = exports2.METHODS_HTTP = exports2.METHODS = exports2.LENIENT_FLAGS = exports2.FLAGS = exports2.TYPE = exports2.ERROR = void 0; + exports2.SPECIAL_HEADERS = exports2.MINOR = exports2.MAJOR = exports2.HTAB_SP_VCHAR_OBS_TEXT = exports2.QUOTED_STRING = exports2.CONNECTION_TOKEN_CHARS = exports2.HEADER_CHARS = exports2.TOKEN = exports2.HEX = exports2.URL_CHAR = exports2.USERINFO_CHARS = exports2.MARK = exports2.ALPHANUM = exports2.NUM = exports2.HEX_MAP = exports2.NUM_MAP = exports2.ALPHA = exports2.STATUSES_HTTP = exports2.H_METHOD_MAP = exports2.METHOD_MAP = exports2.METHODS_RTSP = exports2.METHODS_ICE = exports2.METHODS_HTTP = exports2.HEADER_STATE = exports2.FINISH = exports2.STATUSES = exports2.METHODS = exports2.LENIENT_FLAGS = exports2.FLAGS = exports2.TYPE = exports2.ERROR = void 0; var utils_1 = require_utils(); - var ERROR; - (function(ERROR2) { - ERROR2[ERROR2["OK"] = 0] = "OK"; - ERROR2[ERROR2["INTERNAL"] = 1] = "INTERNAL"; - ERROR2[ERROR2["STRICT"] = 2] = "STRICT"; - ERROR2[ERROR2["LF_EXPECTED"] = 3] = "LF_EXPECTED"; - ERROR2[ERROR2["UNEXPECTED_CONTENT_LENGTH"] = 4] = "UNEXPECTED_CONTENT_LENGTH"; - ERROR2[ERROR2["CLOSED_CONNECTION"] = 5] = "CLOSED_CONNECTION"; - ERROR2[ERROR2["INVALID_METHOD"] = 6] = "INVALID_METHOD"; - ERROR2[ERROR2["INVALID_URL"] = 7] = "INVALID_URL"; - ERROR2[ERROR2["INVALID_CONSTANT"] = 8] = "INVALID_CONSTANT"; - ERROR2[ERROR2["INVALID_VERSION"] = 9] = "INVALID_VERSION"; - ERROR2[ERROR2["INVALID_HEADER_TOKEN"] = 10] = "INVALID_HEADER_TOKEN"; - ERROR2[ERROR2["INVALID_CONTENT_LENGTH"] = 11] = "INVALID_CONTENT_LENGTH"; - ERROR2[ERROR2["INVALID_CHUNK_SIZE"] = 12] = "INVALID_CHUNK_SIZE"; - ERROR2[ERROR2["INVALID_STATUS"] = 13] = "INVALID_STATUS"; - ERROR2[ERROR2["INVALID_EOF_STATE"] = 14] = "INVALID_EOF_STATE"; - ERROR2[ERROR2["INVALID_TRANSFER_ENCODING"] = 15] = "INVALID_TRANSFER_ENCODING"; - ERROR2[ERROR2["CB_MESSAGE_BEGIN"] = 16] = "CB_MESSAGE_BEGIN"; - ERROR2[ERROR2["CB_HEADERS_COMPLETE"] = 17] = "CB_HEADERS_COMPLETE"; - ERROR2[ERROR2["CB_MESSAGE_COMPLETE"] = 18] = "CB_MESSAGE_COMPLETE"; - ERROR2[ERROR2["CB_CHUNK_HEADER"] = 19] = "CB_CHUNK_HEADER"; - ERROR2[ERROR2["CB_CHUNK_COMPLETE"] = 20] = "CB_CHUNK_COMPLETE"; - ERROR2[ERROR2["PAUSED"] = 21] = "PAUSED"; - ERROR2[ERROR2["PAUSED_UPGRADE"] = 22] = "PAUSED_UPGRADE"; - ERROR2[ERROR2["PAUSED_H2_UPGRADE"] = 23] = "PAUSED_H2_UPGRADE"; - ERROR2[ERROR2["USER"] = 24] = "USER"; - })(ERROR = exports2.ERROR || (exports2.ERROR = {})); - var TYPE; - (function(TYPE2) { - TYPE2[TYPE2["BOTH"] = 0] = "BOTH"; - TYPE2[TYPE2["REQUEST"] = 1] = "REQUEST"; - TYPE2[TYPE2["RESPONSE"] = 2] = "RESPONSE"; - })(TYPE = exports2.TYPE || (exports2.TYPE = {})); - var FLAGS; - (function(FLAGS2) { - FLAGS2[FLAGS2["CONNECTION_KEEP_ALIVE"] = 1] = "CONNECTION_KEEP_ALIVE"; - FLAGS2[FLAGS2["CONNECTION_CLOSE"] = 2] = "CONNECTION_CLOSE"; - FLAGS2[FLAGS2["CONNECTION_UPGRADE"] = 4] = "CONNECTION_UPGRADE"; - FLAGS2[FLAGS2["CHUNKED"] = 8] = "CHUNKED"; - FLAGS2[FLAGS2["UPGRADE"] = 16] = "UPGRADE"; - FLAGS2[FLAGS2["CONTENT_LENGTH"] = 32] = "CONTENT_LENGTH"; - FLAGS2[FLAGS2["SKIPBODY"] = 64] = "SKIPBODY"; - FLAGS2[FLAGS2["TRAILING"] = 128] = "TRAILING"; - FLAGS2[FLAGS2["TRANSFER_ENCODING"] = 512] = "TRANSFER_ENCODING"; - })(FLAGS = exports2.FLAGS || (exports2.FLAGS = {})); - var LENIENT_FLAGS; - (function(LENIENT_FLAGS2) { - LENIENT_FLAGS2[LENIENT_FLAGS2["HEADERS"] = 1] = "HEADERS"; - LENIENT_FLAGS2[LENIENT_FLAGS2["CHUNKED_LENGTH"] = 2] = "CHUNKED_LENGTH"; - LENIENT_FLAGS2[LENIENT_FLAGS2["KEEP_ALIVE"] = 4] = "KEEP_ALIVE"; - })(LENIENT_FLAGS = exports2.LENIENT_FLAGS || (exports2.LENIENT_FLAGS = {})); - var METHODS; - (function(METHODS2) { - METHODS2[METHODS2["DELETE"] = 0] = "DELETE"; - METHODS2[METHODS2["GET"] = 1] = "GET"; - METHODS2[METHODS2["HEAD"] = 2] = "HEAD"; - METHODS2[METHODS2["POST"] = 3] = "POST"; - METHODS2[METHODS2["PUT"] = 4] = "PUT"; - METHODS2[METHODS2["CONNECT"] = 5] = "CONNECT"; - METHODS2[METHODS2["OPTIONS"] = 6] = "OPTIONS"; - METHODS2[METHODS2["TRACE"] = 7] = "TRACE"; - METHODS2[METHODS2["COPY"] = 8] = "COPY"; - METHODS2[METHODS2["LOCK"] = 9] = "LOCK"; - METHODS2[METHODS2["MKCOL"] = 10] = "MKCOL"; - METHODS2[METHODS2["MOVE"] = 11] = "MOVE"; - METHODS2[METHODS2["PROPFIND"] = 12] = "PROPFIND"; - METHODS2[METHODS2["PROPPATCH"] = 13] = "PROPPATCH"; - METHODS2[METHODS2["SEARCH"] = 14] = "SEARCH"; - METHODS2[METHODS2["UNLOCK"] = 15] = "UNLOCK"; - METHODS2[METHODS2["BIND"] = 16] = "BIND"; - METHODS2[METHODS2["REBIND"] = 17] = "REBIND"; - METHODS2[METHODS2["UNBIND"] = 18] = "UNBIND"; - METHODS2[METHODS2["ACL"] = 19] = "ACL"; - METHODS2[METHODS2["REPORT"] = 20] = "REPORT"; - METHODS2[METHODS2["MKACTIVITY"] = 21] = "MKACTIVITY"; - METHODS2[METHODS2["CHECKOUT"] = 22] = "CHECKOUT"; - METHODS2[METHODS2["MERGE"] = 23] = "MERGE"; - METHODS2[METHODS2["M-SEARCH"] = 24] = "M-SEARCH"; - METHODS2[METHODS2["NOTIFY"] = 25] = "NOTIFY"; - METHODS2[METHODS2["SUBSCRIBE"] = 26] = "SUBSCRIBE"; - METHODS2[METHODS2["UNSUBSCRIBE"] = 27] = "UNSUBSCRIBE"; - METHODS2[METHODS2["PATCH"] = 28] = "PATCH"; - METHODS2[METHODS2["PURGE"] = 29] = "PURGE"; - METHODS2[METHODS2["MKCALENDAR"] = 30] = "MKCALENDAR"; - METHODS2[METHODS2["LINK"] = 31] = "LINK"; - METHODS2[METHODS2["UNLINK"] = 32] = "UNLINK"; - METHODS2[METHODS2["SOURCE"] = 33] = "SOURCE"; - METHODS2[METHODS2["PRI"] = 34] = "PRI"; - METHODS2[METHODS2["DESCRIBE"] = 35] = "DESCRIBE"; - METHODS2[METHODS2["ANNOUNCE"] = 36] = "ANNOUNCE"; - METHODS2[METHODS2["SETUP"] = 37] = "SETUP"; - METHODS2[METHODS2["PLAY"] = 38] = "PLAY"; - METHODS2[METHODS2["PAUSE"] = 39] = "PAUSE"; - METHODS2[METHODS2["TEARDOWN"] = 40] = "TEARDOWN"; - METHODS2[METHODS2["GET_PARAMETER"] = 41] = "GET_PARAMETER"; - METHODS2[METHODS2["SET_PARAMETER"] = 42] = "SET_PARAMETER"; - METHODS2[METHODS2["REDIRECT"] = 43] = "REDIRECT"; - METHODS2[METHODS2["RECORD"] = 44] = "RECORD"; - METHODS2[METHODS2["FLUSH"] = 45] = "FLUSH"; - })(METHODS = exports2.METHODS || (exports2.METHODS = {})); + exports2.ERROR = { + OK: 0, + INTERNAL: 1, + STRICT: 2, + CR_EXPECTED: 25, + LF_EXPECTED: 3, + UNEXPECTED_CONTENT_LENGTH: 4, + UNEXPECTED_SPACE: 30, + CLOSED_CONNECTION: 5, + INVALID_METHOD: 6, + INVALID_URL: 7, + INVALID_CONSTANT: 8, + INVALID_VERSION: 9, + INVALID_HEADER_TOKEN: 10, + INVALID_CONTENT_LENGTH: 11, + INVALID_CHUNK_SIZE: 12, + INVALID_STATUS: 13, + INVALID_EOF_STATE: 14, + INVALID_TRANSFER_ENCODING: 15, + CB_MESSAGE_BEGIN: 16, + CB_HEADERS_COMPLETE: 17, + CB_MESSAGE_COMPLETE: 18, + CB_CHUNK_HEADER: 19, + CB_CHUNK_COMPLETE: 20, + PAUSED: 21, + PAUSED_UPGRADE: 22, + PAUSED_H2_UPGRADE: 23, + USER: 24, + CB_URL_COMPLETE: 26, + CB_STATUS_COMPLETE: 27, + CB_METHOD_COMPLETE: 32, + CB_VERSION_COMPLETE: 33, + CB_HEADER_FIELD_COMPLETE: 28, + CB_HEADER_VALUE_COMPLETE: 29, + CB_CHUNK_EXTENSION_NAME_COMPLETE: 34, + CB_CHUNK_EXTENSION_VALUE_COMPLETE: 35, + CB_RESET: 31 + }; + exports2.TYPE = { + BOTH: 0, + // default + REQUEST: 1, + RESPONSE: 2 + }; + exports2.FLAGS = { + CONNECTION_KEEP_ALIVE: 1 << 0, + CONNECTION_CLOSE: 1 << 1, + CONNECTION_UPGRADE: 1 << 2, + CHUNKED: 1 << 3, + UPGRADE: 1 << 4, + CONTENT_LENGTH: 1 << 5, + SKIPBODY: 1 << 6, + TRAILING: 1 << 7, + // 1 << 8 is unused + TRANSFER_ENCODING: 1 << 9 + }; + exports2.LENIENT_FLAGS = { + HEADERS: 1 << 0, + CHUNKED_LENGTH: 1 << 1, + KEEP_ALIVE: 1 << 2, + TRANSFER_ENCODING: 1 << 3, + VERSION: 1 << 4, + DATA_AFTER_CLOSE: 1 << 5, + OPTIONAL_LF_AFTER_CR: 1 << 6, + OPTIONAL_CRLF_AFTER_CHUNK: 1 << 7, + OPTIONAL_CR_BEFORE_LF: 1 << 8, + SPACES_AFTER_CHUNK_SIZE: 1 << 9 + }; + exports2.METHODS = { + "DELETE": 0, + "GET": 1, + "HEAD": 2, + "POST": 3, + "PUT": 4, + /* pathological */ + "CONNECT": 5, + "OPTIONS": 6, + "TRACE": 7, + /* WebDAV */ + "COPY": 8, + "LOCK": 9, + "MKCOL": 10, + "MOVE": 11, + "PROPFIND": 12, + "PROPPATCH": 13, + "SEARCH": 14, + "UNLOCK": 15, + "BIND": 16, + "REBIND": 17, + "UNBIND": 18, + "ACL": 19, + /* subversion */ + "REPORT": 20, + "MKACTIVITY": 21, + "CHECKOUT": 22, + "MERGE": 23, + /* upnp */ + "M-SEARCH": 24, + "NOTIFY": 25, + "SUBSCRIBE": 26, + "UNSUBSCRIBE": 27, + /* RFC-5789 */ + "PATCH": 28, + "PURGE": 29, + /* CalDAV */ + "MKCALENDAR": 30, + /* RFC-2068, section 19.6.1.2 */ + "LINK": 31, + "UNLINK": 32, + /* icecast */ + "SOURCE": 33, + /* RFC-7540, section 11.6 */ + "PRI": 34, + /* RFC-2326 RTSP */ + "DESCRIBE": 35, + "ANNOUNCE": 36, + "SETUP": 37, + "PLAY": 38, + "PAUSE": 39, + "TEARDOWN": 40, + "GET_PARAMETER": 41, + "SET_PARAMETER": 42, + "REDIRECT": 43, + "RECORD": 44, + /* RAOP */ + "FLUSH": 45, + /* DRAFT https://www.ietf.org/archive/id/draft-ietf-httpbis-safe-method-w-body-02.html */ + "QUERY": 46 + }; + exports2.STATUSES = { + CONTINUE: 100, + SWITCHING_PROTOCOLS: 101, + PROCESSING: 102, + EARLY_HINTS: 103, + RESPONSE_IS_STALE: 110, + // Unofficial + REVALIDATION_FAILED: 111, + // Unofficial + DISCONNECTED_OPERATION: 112, + // Unofficial + HEURISTIC_EXPIRATION: 113, + // Unofficial + MISCELLANEOUS_WARNING: 199, + // Unofficial + OK: 200, + CREATED: 201, + ACCEPTED: 202, + NON_AUTHORITATIVE_INFORMATION: 203, + NO_CONTENT: 204, + RESET_CONTENT: 205, + PARTIAL_CONTENT: 206, + MULTI_STATUS: 207, + ALREADY_REPORTED: 208, + TRANSFORMATION_APPLIED: 214, + // Unofficial + IM_USED: 226, + MISCELLANEOUS_PERSISTENT_WARNING: 299, + // Unofficial + MULTIPLE_CHOICES: 300, + MOVED_PERMANENTLY: 301, + FOUND: 302, + SEE_OTHER: 303, + NOT_MODIFIED: 304, + USE_PROXY: 305, + SWITCH_PROXY: 306, + // No longer used + TEMPORARY_REDIRECT: 307, + PERMANENT_REDIRECT: 308, + BAD_REQUEST: 400, + UNAUTHORIZED: 401, + PAYMENT_REQUIRED: 402, + FORBIDDEN: 403, + NOT_FOUND: 404, + METHOD_NOT_ALLOWED: 405, + NOT_ACCEPTABLE: 406, + PROXY_AUTHENTICATION_REQUIRED: 407, + REQUEST_TIMEOUT: 408, + CONFLICT: 409, + GONE: 410, + LENGTH_REQUIRED: 411, + PRECONDITION_FAILED: 412, + PAYLOAD_TOO_LARGE: 413, + URI_TOO_LONG: 414, + UNSUPPORTED_MEDIA_TYPE: 415, + RANGE_NOT_SATISFIABLE: 416, + EXPECTATION_FAILED: 417, + IM_A_TEAPOT: 418, + PAGE_EXPIRED: 419, + // Unofficial + ENHANCE_YOUR_CALM: 420, + // Unofficial + MISDIRECTED_REQUEST: 421, + UNPROCESSABLE_ENTITY: 422, + LOCKED: 423, + FAILED_DEPENDENCY: 424, + TOO_EARLY: 425, + UPGRADE_REQUIRED: 426, + PRECONDITION_REQUIRED: 428, + TOO_MANY_REQUESTS: 429, + REQUEST_HEADER_FIELDS_TOO_LARGE_UNOFFICIAL: 430, + // Unofficial + REQUEST_HEADER_FIELDS_TOO_LARGE: 431, + LOGIN_TIMEOUT: 440, + // Unofficial + NO_RESPONSE: 444, + // Unofficial + RETRY_WITH: 449, + // Unofficial + BLOCKED_BY_PARENTAL_CONTROL: 450, + // Unofficial + UNAVAILABLE_FOR_LEGAL_REASONS: 451, + CLIENT_CLOSED_LOAD_BALANCED_REQUEST: 460, + // Unofficial + INVALID_X_FORWARDED_FOR: 463, + // Unofficial + REQUEST_HEADER_TOO_LARGE: 494, + // Unofficial + SSL_CERTIFICATE_ERROR: 495, + // Unofficial + SSL_CERTIFICATE_REQUIRED: 496, + // Unofficial + HTTP_REQUEST_SENT_TO_HTTPS_PORT: 497, + // Unofficial + INVALID_TOKEN: 498, + // Unofficial + CLIENT_CLOSED_REQUEST: 499, + // Unofficial + INTERNAL_SERVER_ERROR: 500, + NOT_IMPLEMENTED: 501, + BAD_GATEWAY: 502, + SERVICE_UNAVAILABLE: 503, + GATEWAY_TIMEOUT: 504, + HTTP_VERSION_NOT_SUPPORTED: 505, + VARIANT_ALSO_NEGOTIATES: 506, + INSUFFICIENT_STORAGE: 507, + LOOP_DETECTED: 508, + BANDWIDTH_LIMIT_EXCEEDED: 509, + NOT_EXTENDED: 510, + NETWORK_AUTHENTICATION_REQUIRED: 511, + WEB_SERVER_UNKNOWN_ERROR: 520, + // Unofficial + WEB_SERVER_IS_DOWN: 521, + // Unofficial + CONNECTION_TIMEOUT: 522, + // Unofficial + ORIGIN_IS_UNREACHABLE: 523, + // Unofficial + TIMEOUT_OCCURED: 524, + // Unofficial + SSL_HANDSHAKE_FAILED: 525, + // Unofficial + INVALID_SSL_CERTIFICATE: 526, + // Unofficial + RAILGUN_ERROR: 527, + // Unofficial + SITE_IS_OVERLOADED: 529, + // Unofficial + SITE_IS_FROZEN: 530, + // Unofficial + IDENTITY_PROVIDER_AUTHENTICATION_ERROR: 561, + // Unofficial + NETWORK_READ_TIMEOUT: 598, + // Unofficial + NETWORK_CONNECT_TIMEOUT: 599 + // Unofficial + }; + exports2.FINISH = { + SAFE: 0, + SAFE_WITH_CB: 1, + UNSAFE: 2 + }; + exports2.HEADER_STATE = { + GENERAL: 0, + CONNECTION: 1, + CONTENT_LENGTH: 2, + TRANSFER_ENCODING: 3, + UPGRADE: 4, + CONNECTION_KEEP_ALIVE: 5, + CONNECTION_CLOSE: 6, + CONNECTION_UPGRADE: 7, + TRANSFER_ENCODING_CHUNKED: 8 + }; exports2.METHODS_HTTP = [ - METHODS.DELETE, - METHODS.GET, - METHODS.HEAD, - METHODS.POST, - METHODS.PUT, - METHODS.CONNECT, - METHODS.OPTIONS, - METHODS.TRACE, - METHODS.COPY, - METHODS.LOCK, - METHODS.MKCOL, - METHODS.MOVE, - METHODS.PROPFIND, - METHODS.PROPPATCH, - METHODS.SEARCH, - METHODS.UNLOCK, - METHODS.BIND, - METHODS.REBIND, - METHODS.UNBIND, - METHODS.ACL, - METHODS.REPORT, - METHODS.MKACTIVITY, - METHODS.CHECKOUT, - METHODS.MERGE, - METHODS["M-SEARCH"], - METHODS.NOTIFY, - METHODS.SUBSCRIBE, - METHODS.UNSUBSCRIBE, - METHODS.PATCH, - METHODS.PURGE, - METHODS.MKCALENDAR, - METHODS.LINK, - METHODS.UNLINK, - METHODS.PRI, + exports2.METHODS.DELETE, + exports2.METHODS.GET, + exports2.METHODS.HEAD, + exports2.METHODS.POST, + exports2.METHODS.PUT, + exports2.METHODS.CONNECT, + exports2.METHODS.OPTIONS, + exports2.METHODS.TRACE, + exports2.METHODS.COPY, + exports2.METHODS.LOCK, + exports2.METHODS.MKCOL, + exports2.METHODS.MOVE, + exports2.METHODS.PROPFIND, + exports2.METHODS.PROPPATCH, + exports2.METHODS.SEARCH, + exports2.METHODS.UNLOCK, + exports2.METHODS.BIND, + exports2.METHODS.REBIND, + exports2.METHODS.UNBIND, + exports2.METHODS.ACL, + exports2.METHODS.REPORT, + exports2.METHODS.MKACTIVITY, + exports2.METHODS.CHECKOUT, + exports2.METHODS.MERGE, + exports2.METHODS["M-SEARCH"], + exports2.METHODS.NOTIFY, + exports2.METHODS.SUBSCRIBE, + exports2.METHODS.UNSUBSCRIBE, + exports2.METHODS.PATCH, + exports2.METHODS.PURGE, + exports2.METHODS.MKCALENDAR, + exports2.METHODS.LINK, + exports2.METHODS.UNLINK, + exports2.METHODS.PRI, // TODO(indutny): should we allow it with HTTP? - METHODS.SOURCE + exports2.METHODS.SOURCE, + exports2.METHODS.QUERY ]; exports2.METHODS_ICE = [ - METHODS.SOURCE + exports2.METHODS.SOURCE ]; exports2.METHODS_RTSP = [ - METHODS.OPTIONS, - METHODS.DESCRIBE, - METHODS.ANNOUNCE, - METHODS.SETUP, - METHODS.PLAY, - METHODS.PAUSE, - METHODS.TEARDOWN, - METHODS.GET_PARAMETER, - METHODS.SET_PARAMETER, - METHODS.REDIRECT, - METHODS.RECORD, - METHODS.FLUSH, + exports2.METHODS.OPTIONS, + exports2.METHODS.DESCRIBE, + exports2.METHODS.ANNOUNCE, + exports2.METHODS.SETUP, + exports2.METHODS.PLAY, + exports2.METHODS.PAUSE, + exports2.METHODS.TEARDOWN, + exports2.METHODS.GET_PARAMETER, + exports2.METHODS.SET_PARAMETER, + exports2.METHODS.REDIRECT, + exports2.METHODS.RECORD, + exports2.METHODS.FLUSH, // For AirPlay - METHODS.GET, - METHODS.POST + exports2.METHODS.GET, + exports2.METHODS.POST + ]; + exports2.METHOD_MAP = (0, utils_1.enumToMap)(exports2.METHODS); + exports2.H_METHOD_MAP = Object.fromEntries(Object.entries(exports2.METHODS).filter(([k]) => k.startsWith("H"))); + exports2.STATUSES_HTTP = [ + exports2.STATUSES.CONTINUE, + exports2.STATUSES.SWITCHING_PROTOCOLS, + exports2.STATUSES.PROCESSING, + exports2.STATUSES.EARLY_HINTS, + exports2.STATUSES.RESPONSE_IS_STALE, + exports2.STATUSES.REVALIDATION_FAILED, + exports2.STATUSES.DISCONNECTED_OPERATION, + exports2.STATUSES.HEURISTIC_EXPIRATION, + exports2.STATUSES.MISCELLANEOUS_WARNING, + exports2.STATUSES.OK, + exports2.STATUSES.CREATED, + exports2.STATUSES.ACCEPTED, + exports2.STATUSES.NON_AUTHORITATIVE_INFORMATION, + exports2.STATUSES.NO_CONTENT, + exports2.STATUSES.RESET_CONTENT, + exports2.STATUSES.PARTIAL_CONTENT, + exports2.STATUSES.MULTI_STATUS, + exports2.STATUSES.ALREADY_REPORTED, + exports2.STATUSES.TRANSFORMATION_APPLIED, + exports2.STATUSES.IM_USED, + exports2.STATUSES.MISCELLANEOUS_PERSISTENT_WARNING, + exports2.STATUSES.MULTIPLE_CHOICES, + exports2.STATUSES.MOVED_PERMANENTLY, + exports2.STATUSES.FOUND, + exports2.STATUSES.SEE_OTHER, + exports2.STATUSES.NOT_MODIFIED, + exports2.STATUSES.USE_PROXY, + exports2.STATUSES.SWITCH_PROXY, + exports2.STATUSES.TEMPORARY_REDIRECT, + exports2.STATUSES.PERMANENT_REDIRECT, + exports2.STATUSES.BAD_REQUEST, + exports2.STATUSES.UNAUTHORIZED, + exports2.STATUSES.PAYMENT_REQUIRED, + exports2.STATUSES.FORBIDDEN, + exports2.STATUSES.NOT_FOUND, + exports2.STATUSES.METHOD_NOT_ALLOWED, + exports2.STATUSES.NOT_ACCEPTABLE, + exports2.STATUSES.PROXY_AUTHENTICATION_REQUIRED, + exports2.STATUSES.REQUEST_TIMEOUT, + exports2.STATUSES.CONFLICT, + exports2.STATUSES.GONE, + exports2.STATUSES.LENGTH_REQUIRED, + exports2.STATUSES.PRECONDITION_FAILED, + exports2.STATUSES.PAYLOAD_TOO_LARGE, + exports2.STATUSES.URI_TOO_LONG, + exports2.STATUSES.UNSUPPORTED_MEDIA_TYPE, + exports2.STATUSES.RANGE_NOT_SATISFIABLE, + exports2.STATUSES.EXPECTATION_FAILED, + exports2.STATUSES.IM_A_TEAPOT, + exports2.STATUSES.PAGE_EXPIRED, + exports2.STATUSES.ENHANCE_YOUR_CALM, + exports2.STATUSES.MISDIRECTED_REQUEST, + exports2.STATUSES.UNPROCESSABLE_ENTITY, + exports2.STATUSES.LOCKED, + exports2.STATUSES.FAILED_DEPENDENCY, + exports2.STATUSES.TOO_EARLY, + exports2.STATUSES.UPGRADE_REQUIRED, + exports2.STATUSES.PRECONDITION_REQUIRED, + exports2.STATUSES.TOO_MANY_REQUESTS, + exports2.STATUSES.REQUEST_HEADER_FIELDS_TOO_LARGE_UNOFFICIAL, + exports2.STATUSES.REQUEST_HEADER_FIELDS_TOO_LARGE, + exports2.STATUSES.LOGIN_TIMEOUT, + exports2.STATUSES.NO_RESPONSE, + exports2.STATUSES.RETRY_WITH, + exports2.STATUSES.BLOCKED_BY_PARENTAL_CONTROL, + exports2.STATUSES.UNAVAILABLE_FOR_LEGAL_REASONS, + exports2.STATUSES.CLIENT_CLOSED_LOAD_BALANCED_REQUEST, + exports2.STATUSES.INVALID_X_FORWARDED_FOR, + exports2.STATUSES.REQUEST_HEADER_TOO_LARGE, + exports2.STATUSES.SSL_CERTIFICATE_ERROR, + exports2.STATUSES.SSL_CERTIFICATE_REQUIRED, + exports2.STATUSES.HTTP_REQUEST_SENT_TO_HTTPS_PORT, + exports2.STATUSES.INVALID_TOKEN, + exports2.STATUSES.CLIENT_CLOSED_REQUEST, + exports2.STATUSES.INTERNAL_SERVER_ERROR, + exports2.STATUSES.NOT_IMPLEMENTED, + exports2.STATUSES.BAD_GATEWAY, + exports2.STATUSES.SERVICE_UNAVAILABLE, + exports2.STATUSES.GATEWAY_TIMEOUT, + exports2.STATUSES.HTTP_VERSION_NOT_SUPPORTED, + exports2.STATUSES.VARIANT_ALSO_NEGOTIATES, + exports2.STATUSES.INSUFFICIENT_STORAGE, + exports2.STATUSES.LOOP_DETECTED, + exports2.STATUSES.BANDWIDTH_LIMIT_EXCEEDED, + exports2.STATUSES.NOT_EXTENDED, + exports2.STATUSES.NETWORK_AUTHENTICATION_REQUIRED, + exports2.STATUSES.WEB_SERVER_UNKNOWN_ERROR, + exports2.STATUSES.WEB_SERVER_IS_DOWN, + exports2.STATUSES.CONNECTION_TIMEOUT, + exports2.STATUSES.ORIGIN_IS_UNREACHABLE, + exports2.STATUSES.TIMEOUT_OCCURED, + exports2.STATUSES.SSL_HANDSHAKE_FAILED, + exports2.STATUSES.INVALID_SSL_CERTIFICATE, + exports2.STATUSES.RAILGUN_ERROR, + exports2.STATUSES.SITE_IS_OVERLOADED, + exports2.STATUSES.SITE_IS_FROZEN, + exports2.STATUSES.IDENTITY_PROVIDER_AUTHENTICATION_ERROR, + exports2.STATUSES.NETWORK_READ_TIMEOUT, + exports2.STATUSES.NETWORK_CONNECT_TIMEOUT ]; - exports2.METHOD_MAP = utils_1.enumToMap(METHODS); - exports2.H_METHOD_MAP = {}; - Object.keys(exports2.METHOD_MAP).forEach((key) => { - if (/^H/.test(key)) { - exports2.H_METHOD_MAP[key] = exports2.METHOD_MAP[key]; - } - }); - var FINISH; - (function(FINISH2) { - FINISH2[FINISH2["SAFE"] = 0] = "SAFE"; - FINISH2[FINISH2["SAFE_WITH_CB"] = 1] = "SAFE_WITH_CB"; - FINISH2[FINISH2["UNSAFE"] = 2] = "UNSAFE"; - })(FINISH = exports2.FINISH || (exports2.FINISH = {})); exports2.ALPHA = []; for (let i = "A".charCodeAt(0); i <= "Z".charCodeAt(0); i++) { exports2.ALPHA.push(String.fromCharCode(i)); @@ -2862,7 +3320,7 @@ var require_constants2 = __commonJS({ exports2.ALPHANUM = exports2.ALPHA.concat(exports2.NUM); exports2.MARK = ["-", "_", ".", "!", "~", "*", "'", "(", ")"]; exports2.USERINFO_CHARS = exports2.ALPHANUM.concat(exports2.MARK).concat(["%", ";", ":", "&", "=", "+", "$", ","]); - exports2.STRICT_URL_CHAR = [ + exports2.URL_CHAR = [ "!", '"', "$", @@ -2894,12 +3352,8 @@ var require_constants2 = __commonJS({ "}", "~" ].concat(exports2.ALPHANUM); - exports2.URL_CHAR = exports2.STRICT_URL_CHAR.concat([" ", "\f"]); - for (let i = 128; i <= 255; i++) { - exports2.URL_CHAR.push(i); - } exports2.HEX = exports2.NUM.concat(["a", "b", "c", "d", "e", "f", "A", "B", "C", "D", "E", "F"]); - exports2.STRICT_TOKEN = [ + exports2.TOKEN = [ "!", "#", "$", @@ -2916,7 +3370,6 @@ var require_constants2 = __commonJS({ "|", "~" ].concat(exports2.ALPHANUM); - exports2.TOKEN = exports2.STRICT_TOKEN.concat([" "]); exports2.HEADER_CHARS = [" "]; for (let i = 32; i <= 255; i++) { if (i !== 127) { @@ -2924,26 +3377,27 @@ var require_constants2 = __commonJS({ } } exports2.CONNECTION_TOKEN_CHARS = exports2.HEADER_CHARS.filter((c) => c !== 44); + exports2.QUOTED_STRING = [" ", " "]; + for (let i = 33; i <= 255; i++) { + if (i !== 34 && i !== 92) { + exports2.QUOTED_STRING.push(i); + } + } + exports2.HTAB_SP_VCHAR_OBS_TEXT = [" ", " "]; + for (let i = 33; i <= 126; i++) { + exports2.HTAB_SP_VCHAR_OBS_TEXT.push(i); + } + for (let i = 128; i <= 255; i++) { + exports2.HTAB_SP_VCHAR_OBS_TEXT.push(i); + } exports2.MAJOR = exports2.NUM_MAP; exports2.MINOR = exports2.MAJOR; - var HEADER_STATE; - (function(HEADER_STATE2) { - HEADER_STATE2[HEADER_STATE2["GENERAL"] = 0] = "GENERAL"; - HEADER_STATE2[HEADER_STATE2["CONNECTION"] = 1] = "CONNECTION"; - HEADER_STATE2[HEADER_STATE2["CONTENT_LENGTH"] = 2] = "CONTENT_LENGTH"; - HEADER_STATE2[HEADER_STATE2["TRANSFER_ENCODING"] = 3] = "TRANSFER_ENCODING"; - HEADER_STATE2[HEADER_STATE2["UPGRADE"] = 4] = "UPGRADE"; - HEADER_STATE2[HEADER_STATE2["CONNECTION_KEEP_ALIVE"] = 5] = "CONNECTION_KEEP_ALIVE"; - HEADER_STATE2[HEADER_STATE2["CONNECTION_CLOSE"] = 6] = "CONNECTION_CLOSE"; - HEADER_STATE2[HEADER_STATE2["CONNECTION_UPGRADE"] = 7] = "CONNECTION_UPGRADE"; - HEADER_STATE2[HEADER_STATE2["TRANSFER_ENCODING_CHUNKED"] = 8] = "TRANSFER_ENCODING_CHUNKED"; - })(HEADER_STATE = exports2.HEADER_STATE || (exports2.HEADER_STATE = {})); exports2.SPECIAL_HEADERS = { - "connection": HEADER_STATE.CONNECTION, - "content-length": HEADER_STATE.CONTENT_LENGTH, - "proxy-connection": HEADER_STATE.CONNECTION, - "transfer-encoding": HEADER_STATE.TRANSFER_ENCODING, - "upgrade": HEADER_STATE.UPGRADE + "connection": exports2.HEADER_STATE.CONNECTION, + "content-length": exports2.HEADER_STATE.CONTENT_LENGTH, + "proxy-connection": exports2.HEADER_STATE.CONNECTION, + "transfer-encoding": exports2.HEADER_STATE.TRANSFER_ENCODING, + "upgrade": exports2.HEADER_STATE.UPGRADE }; } }); @@ -2953,7 +3407,13 @@ var require_llhttp_wasm = __commonJS({ "lib/llhttp/llhttp-wasm.js"(exports2, module2) { "use strict"; var { Buffer: Buffer2 } = require("node:buffer"); - module2.exports = Buffer2.from("AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAX8AYAJ/fwBgBH9/f38Bf2AAAGADf39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQAEA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAAy0sBQYAAAIAAAAAAAACAQIAAgICAAADAAAAAAMDAwMBAQEBAQEBAQEAAAIAAAAEBQFwARISBQMBAAIGCAF/AUGA1AQLB9EFIgZtZW1vcnkCAAtfaW5pdGlhbGl6ZQAIGV9faW5kaXJlY3RfZnVuY3Rpb25fdGFibGUBAAtsbGh0dHBfaW5pdAAJGGxsaHR0cF9zaG91bGRfa2VlcF9hbGl2ZQAvDGxsaHR0cF9hbGxvYwALBm1hbGxvYwAxC2xsaHR0cF9mcmVlAAwEZnJlZQAMD2xsaHR0cF9nZXRfdHlwZQANFWxsaHR0cF9nZXRfaHR0cF9tYWpvcgAOFWxsaHR0cF9nZXRfaHR0cF9taW5vcgAPEWxsaHR0cF9nZXRfbWV0aG9kABAWbGxodHRwX2dldF9zdGF0dXNfY29kZQAREmxsaHR0cF9nZXRfdXBncmFkZQASDGxsaHR0cF9yZXNldAATDmxsaHR0cF9leGVjdXRlABQUbGxodHRwX3NldHRpbmdzX2luaXQAFQ1sbGh0dHBfZmluaXNoABYMbGxodHRwX3BhdXNlABcNbGxodHRwX3Jlc3VtZQAYG2xsaHR0cF9yZXN1bWVfYWZ0ZXJfdXBncmFkZQAZEGxsaHR0cF9nZXRfZXJybm8AGhdsbGh0dHBfZ2V0X2Vycm9yX3JlYXNvbgAbF2xsaHR0cF9zZXRfZXJyb3JfcmVhc29uABwUbGxodHRwX2dldF9lcnJvcl9wb3MAHRFsbGh0dHBfZXJybm9fbmFtZQAeEmxsaHR0cF9tZXRob2RfbmFtZQAfEmxsaHR0cF9zdGF0dXNfbmFtZQAgGmxsaHR0cF9zZXRfbGVu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PgtBhwEMPQtBiAEMPAtBiQEMOwtBigEMOgtBiwEMOQtBjAEMOAtBjQEMNwtBjgEMNgtBjwEMNQtBkAEMNAtBkQEMMwtBkgEMMgtBkwEMMQtBlAEMMAtBlQEMLwtBlgEMLgtBlwEMLQtBmAEMLAtBmQEMKwtBmgEMKgtBmwEMKQtBnAEMKAtBnQEMJwtBngEMJgtBnwEMJQtBoAEMJAtBoQEMIwtBogEMIgtBowEMIQtBpAEMIAtBpQEMHwtBpgEMHgtBpwEMHQtBqAEMHAtBqQEMGwtBqgEMGgtBqwEMGQtBrAEMGAtBrQEMFwtBrgEMFgtBAQwVC0GvAQwUC0GwAQwTC0GxAQwSC0GzAQwRC0GyAQwQC0G0AQwPC0G1AQwOC0G2AQwNC0G3AQwMC0G4AQwLC0G5AQwKC0G6AQwJC0G7AQwIC0HGAQwHC0G8AQwGC0G9AQwFC0G+AQwEC0G/AQwDC0HAAQwCC0HCAQwBC0HBAQshAwNAAkACQAJAAkACQAJAAkACQAJAIAICfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAgJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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iQEhAwykAgtBASABLQAAQd8ARw1nGiABQQFqIQEMXgtBigEhAyABIARGDaICIAIoAgAiACAEIAFraiEFIAEgAGtBAWohBgNAIAEtAAAgAEGMzwBqLQAARw1kIABBAUYN+gEgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAMogILQYsBIQMgASAERg2hAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGOzwBqLQAARw1kIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyiAgsgAkEANgIAIAZBAWohAUECDGULQYwBIQMgASAERg2gAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHwzwBqLQAARw1jIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyhAgsgAkEANgIAIAZBAWohAUEfDGQLQY0BIQMgASAERg2fAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHyzwBqLQAARw1iIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAygAgsgAkEANgIAIAZBAWohAUEJDGMLIAEgBEYEQEGOASEDDJ8CCwJAAkAgAS0AAEHJAGsOBwBiYmJiYgFiCyABQQFqIQFB+AAhAwyGAgsgAUEBaiEBQfkAIQMMhQILQY8BIQMgASAERg2dAiACKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEGRzwBqLQAARw1gIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyeAgsgAkEANgIAIAZBAWohAUEYDGELQZABIQMgASAERg2cAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGXzwBqLQAARw1fIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAydAgsgAkEANgIAIAZBAWohAUEXDGALQZEBIQMgASAERg2bAiACKAIAIgAgBCABa2ohBSABIABrQQZqIQYCQANAIAEtAAAgAEGazwBqLQAARw1eIABBBkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAycAgsgAkEANgIAIAZBAWohAUEV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JSIARQ0RIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMtAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0gIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMswELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0iIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMsgELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0OIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMsQELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0dIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMsAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0fIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMrwELIABBP0cNASABQQFqCyEBQQUhAwyUAQtBACEDIAJBADYCHCACIAE2AhQgAkH9EjYCECACQQc2AgwMrAELIAJBADYCHCACIAE2AhQgAkHcCDYCECACQQc2AgxBACEDDKsBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNByACQeUANgIcIAIgATYCFCACIAA2AgxBACEDDKoBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNFiACQdMANgIcIAIgATYCFCACIAA2AgxBACEDDKkBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNGCACQdIANgIcIAIgATYCFCACIAA2AgxBACEDDKgBCyACQQA2AhwgAiABNgIUIAJBxgo2AhAgAkEHNgIMQQAhAwynAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQMgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwymAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRIgAkHTADYCHCACIAE2AhQgAiAANgIMQQAhAwylAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRQgAkHSADYCHCACIAE2AhQgAiAANgIMQQAhAwykAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQAgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwyjAQtB1QAhAwyJAQsgAEEVRwRAIAJBADYCHCACIAE2AhQgAkG5DTYCECACQRo2AgxBACEDDKIBCyACQeQANgIcIAIgATYCFCACQeMXNgIQIAJBFTYCDEEAIQMMoQELIAJBADYCACAGQQFqIQEgAi0AKSIAQSNrQQtJDQQCQCAAQQZLDQBBASAAdEHKAHFFDQAMBQtBACEDIAJBADYCHCACIAE2AhQgAkH3CTYCECACQQg2AgwMoAELIAJBADYCACAGQQFqIQEgAi0AKUEhRg0DIAJBADYCHCACIAE2AhQgAkGbCjYCECACQQg2AgxBACEDDJ8BCyACQQA2AgALQQAhAyACQQA2AhwgAiABNgIUIAJBkDM2AhAgAkEINgIMDJ0BCyACQQA2AgAgBkEBaiEBIAItAClBI0kNACACQQA2AhwgAiABNgIUIAJB0wk2AhAgAkEINgIMQQAhAwycAQtB0QAhAwyCAQsgAS0AAEEwayIAQf8BcUEKSQRAIAIgADoAKiABQQFqIQFBzwAhAwyCAQsgAigCBCEAIAJBADYCBCACIAAgARAoIgBFDYYBIAJB3gA2AhwgAiABNgIUIAIgADYCDEEAIQMMmgELIAIoAgQhACACQQA2AgQgAiAAIAEQKCIARQ2GASACQdwANgIcIAIgATYCFCACIAA2AgxBACEDDJkBCyACKAIEIQAgAkEANgIEIAIgACAFECgiAEUEQCAFIQEMhwELIAJB2gA2AhwgAiAFNgIUIAIgADYCDAyYAQtBACEBQQEhAwsgAiADOgArIAVBAWohAwJAAkACQCACLQAtQRBxDQACQAJAAkAgAi0AKg4DAQACBAsgBkUNAwwCCyAADQEMAgsgAUUNAQsgAigCBCEAIAJBADYCBCACIAAgAxAoIgBFBEAgAyEBDAILIAJB2AA2AhwgAiADNgIUIAIgADYCDEEAIQMMmAELIAIoAgQhACACQQA2AgQgAiAAIAMQKCIARQRAIAMhAQyHAQsgAkHZADYCHCACIAM2AhQgAiAANgIMQQAhAwyXAQtBzAAhAwx9CyAAQRVHBEAgAkEANgIcIAIgATYCFCACQZQNNgIQIAJBITYCDEEAIQMMlgELIAJB1wA2AhwgAiABNgIUIAJByRc2AhAgAkEVNgIMQQAhAwyVAQtBACEDIAJBADYCHCACIAE2AhQgAkGAETYCECACQQk2AgwMlAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0AIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMkwELQckAIQMMeQsgAkEANgIcIAIgATYCFCACQcEoNgIQIAJBBzYCDCACQQA2AgBBACEDDJEBCyACKAIEIQBBACEDIAJBADYCBCACIAAgARAlIgBFDQAgAkHSADYCHCACIAE2AhQgAiAANgIMDJABC0HIACEDDHYLIAJBADYCACAFIQELIAJBgBI7ASogAUEBaiEBQQAhAAJAIAIoAjgiA0UNACADKAIwIgNFDQAgAiADEQAAIQALIAANAQtBxwAhAwxzCyAAQRVGBEAgAkHRADYCHCACIAE2AhQgAkHjFzYCECACQRU2AgxBACEDDIwBC0EAIQMgAkEANgIcIAIgATYCFCACQbkNNgIQIAJBGjYCDAyLAQtBACEDIAJBADYCHCACIAE2AhQgAkGgGTYCECACQR42AgwMigELIAEtAABBOkYEQCACKAIEIQBBACEDIAJBADYCBCACIAAgARApIgBFDQEgAkHDADYCHCACIAA2AgwgAiABQQFqNgIUDIoBC0EAIQMgAkEANgIcIAIgATYCFCACQbERNgIQIAJBCjYCDAyJAQsgAUEBaiEBQTshAwxvCyACQcMANgIcIAIgADYCDCACIAFBAWo2AhQMhwELQQAhAyACQQA2AhwgAiABNgIUIAJB8A42AhAgAkEcNgIMDIYBCyACIAIvATBBEHI7ATAMZgsCQCACLwEwIgBBCHFFDQAgAi0AKEEBRw0AIAItAC1BCHFFDQMLIAIgAEH3+wNxQYAEcjsBMAwECyABIARHBEACQANAIAEtAABBMGsiAEH/AXFBCk8EQEE1IQMMbgsgAikDICIKQpmz5syZs+bMGVYNASACIApCCn4iCjcDICAKIACtQv8BgyILQn+FVg0BIAIgCiALfDcDICAEIAFBAWoiAUcNAAtBOSEDDIUBCyACKAIEIQBBACEDIAJBADYCBCACIAAgAUEBaiIBECoiAA0MDHcLQTkhAwyDAQsgAi0AMEEgcQ0GQcUBIQMMaQtBACEDIAJBADYCBCACIAEgARAqIgBFDQQgAkE6NgIcIAIgADYCDCACIAFBAWo2AhQMgQELIAItAChBAUcNACACLQAtQQhxRQ0BC0E3IQMMZgsgAigCBCEAQQAhAyACQQA2AgQgAiAAIAEQKiIABEAgAkE7NgIcIAIgADYCDCACIAFBAWo2AhQMfwsgAUEBaiEBDG4LIAJBCDoALAwECyABQQFqIQEMbQtBACEDIAJBADYCHCACIAE2AhQgAkHkEjYCECACQQQ2AgwMewsgAigCBCEAQQAhAyACQQA2AgQgAiAAIAEQKiIARQ1sIAJBNzYCHCACIAE2AhQgAiAANgIMDHoLIAIgAi8BMEEgcjsBMAtBMCEDDF8LIAJBNjYCHCACIAE2AhQgAiAANgIMDHcLIABBLEcNASABQQFqIQBBASEBAkACQAJAAkACQCACLQAsQQVrDgQDAQIEAAsgACEBDAQLQQIhAQwBC0EEIQELIAJBAToALCACIAIvATAgAXI7ATAgACEBDAELIAIgAi8BMEEIcjsBMCAAIQELQTkhAwxcCyACQQA6ACwLQTQhAwxaCyABIARGBEBBLSEDDHMLAkACQANAAkAgAS0AAEEKaw4EAgAAAwALIAQgAUEBaiIBRw0AC0EtIQMMdAsgAigCBCEAQQAhAyACQQA2AgQgAiAAIAEQKiIARQ0CIAJBLDYCHCACIAE2AhQgAiAANgIMDHMLIAIoAgQhAEEAIQMgAkEANgIEIAIgACABECoiAEUEQCABQQFqIQEMAgsgAkEsNgIcIAIgADYCDCACIAFBAWo2AhQMcgsgAS0AAEENRgRAIAIoAgQhAEEAIQMgAkEANgIEIAIgACABECoiAEUEQCABQQFqIQEMAgsgAkEsNgIcIAIgADYCDCACIAFBAWo2AhQMcgsgAi0ALUEBcQRAQcQBIQMMWQsgAigCBCEAQQAhAyACQQA2AgQgAiAAIAEQKiIADQEMZQtBLyEDDFcLIAJBLjYCHCACIAE2AhQgAiAANgIMDG8LQQAhAyACQQA2AhwgAiABNgIUIAJB8BQ2AhAgAkEDNgIMDG4LQQEhAwJAAkACQAJAIAItACxBBWsOBAMBAgAECyACIAIvATBBCHI7ATAMAwtBAiEDDAELQQQhAwsgAkEBOgAsIAIgAi8BMCADcjsBMAtBKiEDDFMLQQAhAyACQQA2AhwgAiABNgIUIAJB4Q82AhAgAkEKNgIMDGsLQQEhAwJAAkACQAJAAkACQCACLQAsQQJrDgcFBAQDAQIABAsgAiACLwEwQQhyOwEwDAMLQQIhAwwBC0EEIQMLIAJBAToALCACIAIvATAgA3I7ATALQSshAwxSC0EAIQMgAkEANgIcIAIgATYCFCACQasSNgIQIAJBCzYCDAxqC0EAIQMgAkEANgIcIAIgATYCFCACQf0NNgIQIAJBHTYCDAxpCyABIARHBEADQCABLQAAQSBHDUggBCABQQFqIgFHDQALQSUhAwxpC0ElIQMMaAsgAi0ALUEBcQRAQcMBIQMMTwsgAigCBCEAQQAhAyACQQA2AgQgAiAAIAEQKSIABEAgAkEmNgIcIAIgADYCDCACIAFBAWo2AhQMaAsgAUEBaiEBDFwLIAFBAWohASACLwEwIgBBgAFxBEBBACEAAkAgAigCOCIDRQ0AIAMoAlQiA0UNACACIAMRAAAhAAsgAEUNBiAAQRVHDR8gAkEFNgIcIAIgATYCFCACQfkXNgIQIAJBFTYCDEEAIQMMZwsCQCAAQaAEcUGgBEcNACACLQAtQQJxDQBBACEDIAJBADYCHCACIAE2AhQgAkGWEzYCECACQQQ2AgwMZwsgAgJ/IAIvATBBFHFBFEYEQEEBIAItAChBAUYNARogAi8BMkHlAEYMAQsgAi0AKUEFRgs6AC5BACEAAkAgAigCOCIDRQ0AIAMoAiQiA0UNACACIAMRAAAhAAsCQAJAAkACQAJAIAAOFgIBAAQEBAQEBAQEBAQEBAQEBAQEBAMECyACQQE6AC4LIAIgAi8BMEHAAHI7ATALQSchAwxPCyACQSM2AhwgAiABNgIUIAJBpRY2AhAgAkEVNgIMQQAhAwxnC0EAIQMgAkEANgIcIAIgATYCFCACQdULNgIQIAJBETYCDAxmC0EAIQACQCACKAI4IgNFDQAgAygCLCIDRQ0AIAIgAxEAACEACyAADQELQQ4hAwxLCyAAQRVGBEAgAkECNgIcIAIgATYCFCACQbAYNgIQIAJBFTYCDEEAIQMMZAtBACEDIAJBADYCHCACIAE2AhQgAkGnDjYCECACQRI2AgwMYwtBACEDIAJBADYCHCACIAE2AhQgAkGqHDYCECACQQ82AgwMYgsgAigCBCEAQQAhAyACQQA2AgQgAiAAIAEgCqdqIgEQKyIARQ0AIAJBBTYCHCACIAE2AhQgAiAANgIMDGELQQ8hAwxHC0EAIQMgAkEANgIcIAIgATYCFCACQc0TNgIQIAJBDDYCDAxfC0IBIQoLIAFBAWohAQJAIAIpAyAiC0L//////////w9YBEAgAiALQgSGIAqENwMgDAELQQAhAyACQQA2AhwgAiABNgIUIAJBrQk2AhAgAkEMNgIMDF4LQSQhAwxEC0EAIQMgAkEANgIcIAIgATYCFCACQc0TNgIQIAJBDDYCDAxcCyACKAIEIQBBACEDIAJBADYCBCACIAAgARAsIgBFBEAgAUEBaiEBDFILIAJBFzYCHCACIAA2AgwgAiABQQFqNgIUDFsLIAIoAgQhAEEAIQMgAkEANgIEAkAgAiAAIAEQLCIARQRAIAFBAWohAQwBCyACQRY2AhwgAiAANgIMIAIgAUEBajYCFAxbC0EfIQMMQQtBACEDIAJBADYCHCACIAE2AhQgAkGaDzYCECACQSI2AgwMWQsgAigCBCEAQQAhAyACQQA2AgQgAiAAIAEQLSIARQRAIAFBAWohAQxQCyACQRQ2AhwgAiAANgIMIAIgAUEBajYCFAxYCyACKAIEIQBBACEDIAJBADYCBAJAIAIgACABEC0iAEUEQCABQQFqIQEMAQsgAkETNgIcIAIgADYCDCACIAFBAWo2AhQMWAtBHiEDDD4LQQAhAyACQQA2AhwgAiABNgIUIAJBxgw2AhAgAkEjNgIMDFYLIAIoAgQhAEEAIQMgAkEANgIEIAIgACABEC0iAEUEQCABQQFqIQEMTgsgAkERNgIcIAIgADYCDCACIAFBAWo2AhQMVQsgAkEQNgIcIAIgATYCFCACIAA2AgwMVAtBACEDIAJBADYCHCACIAE2AhQgAkHGDDYCECACQSM2AgwMUwtBACEDIAJBADYCHCACIAE2AhQgAkHAFTYCECACQQI2AgwMUgsgAigCBCEAQQAhAyACQQA2AgQCQCACIAAgARAtIgBFBEAgAUEBaiEBDAELIAJBDjYCHCACIAA2AgwgAiABQQFqNgIUDFILQRshAww4C0EAIQMgAkEANgIcIAIgATYCFCACQcYMNgIQIAJBIzYCDAxQCyACKAIEIQBBACEDIAJBADYCBAJAIAIgACABECwiAEUEQCABQQFqIQEMAQsgAkENNgIcIAIgADYCDCACIAFBAWo2AhQMUAtBGiEDDDYLQQAhAyACQQA2AhwgAiABNgIUIAJBmg82AhAgAkEiNgIMDE4LIAIoAgQhAEEAIQMgAkEANgIEAkAgAiAAIAEQLCIARQRAIAFBAWohAQwBCyACQQw2AhwgAiAANgIMIAIgAUEBajYCFAxOC0EZIQMMNAtBACEDIAJBADYCHCACIAE2AhQgAkGaDzYCECACQSI2AgwMTAsgAEEVRwRAQQAhAyACQQA2AhwgAiABNgIUIAJBgww2AhAgAkETNgIMDEwLIAJBCjYCHCACIAE2AhQgAkHkFjYCECACQRU2AgxBACEDDEsLIAIoAgQhAEEAIQMgAkEANgIEIAIgACABIAqnaiIBECsiAARAIAJBBzYCHCACIAE2AhQgAiAANgIMDEsLQRMhAwwxCyAAQRVHBEBBACEDIAJBADYCHCACIAE2AhQgAkHaDTYCECACQRQ2AgwMSgsgAkEeNgIcIAIgATYCFCACQfkXNgIQIAJBFTYCDEEAIQMMSQtBACEAAkAgAigCOCIDRQ0AIAMoAiwiA0UNACACIAMRAAAhAAsgAEUNQSAAQRVGBEAgAkEDNgIcIAIgATYCFCACQbAYNgIQIAJBFTYCDEEAIQMMSQtBACEDIAJBADYCHCACIAE2AhQgAkGnDjYCECACQRI2AgwMSAtBACEDIAJBADYCHCACIAE2AhQgAkHaDTYCECACQRQ2AgwMRwtBACEDIAJBADYCHCACIAE2AhQgAkGnDjYCECACQRI2AgwMRgsgAkEAOgAvIAItAC1BBHFFDT8LIAJBADoALyACQQE6ADRBACEDDCsLQQAhAyACQQA2AhwgAkHkETYCECACQQc2AgwgAiABQQFqNgIUDEMLAkADQAJAIAEtAABBCmsOBAACAgACCyAEIAFBAWoiAUcNAAtB3QEhAwxDCwJAAkAgAi0ANEEBRw0AQQAhAAJAIAIoAjgiA0UNACADKAJYIgNFDQAgAiADEQAAIQALIABFDQAgAEEVRw0BIAJB3AE2AhwgAiABNgIUIAJB1RY2AhAgAkEVNgIMQQAhAwxEC0HBASEDDCoLIAJBADYCHCACIAE2AhQgAkHpCzYCECACQR82AgxBACEDDEILAkACQCACLQAoQQFrDgIEAQALQcABIQMMKQtBuQEhAwwoCyACQQI6AC9BACEAAkAgAigCOCIDRQ0AIAMoAgAiA0UNACACIAMRAAAhAAsgAEUEQEHCASEDDCgLIABBFUcEQCACQQA2AhwgAiABNgIUIAJBpAw2AhAgAkEQNgIMQQAhAwxBCyACQdsBNgIcIAIgATYCFCACQfoWNgIQIAJBFTYCDEEAIQMMQAsgASAERgRAQdoBIQMMQAsgAS0AAEHIAEYNASACQQE6ACgLQawBIQMMJQtBvwEhAwwkCyABIARHBEAgAkEQNgIIIAIgATYCBEG+ASEDDCQLQdkBIQMMPAsgASAERgRAQdgBIQMMPAsgAS0AAEHIAEcNBCABQQFqIQFBvQEhAwwiCyABIARGBEBB1wEhAww7CwJAAkAgAS0AAEHFAGsOEAAFBQUFBQUFBQUFBQUFBQEFCyABQQFqIQFBuwEhAwwiCyABQQFqIQFBvAEhAwwhC0HWASEDIAEgBEYNOSACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGD0ABqLQAARw0DIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAw6CyACKAIEIQAgAkIANwMAIAIgACAGQQFqIgEQJyIARQRAQcYBIQMMIQsgAkHVATYCHCACIAE2AhQgAiAANgIMQQAhAww5C0HUASEDIAEgBEYNOCACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEGB0ABqLQAARw0CIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAw5CyACQYEEOwEoIAIoAgQhACACQgA3AwAgAiAAIAZBAWoiARAnIgANAwwCCyACQQA2AgALQQAhAyACQQA2AhwgAiABNgIUIAJB2Bs2AhAgAkEINgIMDDYLQboBIQMMHAsgAkHTATYCHCACIAE2AhQgAiAANgIMQQAhAww0C0EAIQACQCACKAI4IgNFDQAgAygCOCIDRQ0AIAIgAxEAACEACyAARQ0AIABBFUYNASACQQA2AhwgAiABNgIUIAJBzA42AhAgAkEgNgIMQQAhAwwzC0HkACEDDBkLIAJB+AA2AhwgAiABNgIUIAJByhg2AhAgAkEVNgIMQQAhAwwxC0HSASEDIAQgASIARg0wIAQgAWsgAigCACIBaiEFIAAgAWtBBGohBgJAA0AgAC0AACABQfzPAGotAABHDQEgAUEERg0DIAFBAWohASAEIABBAWoiAEcNAAsgAiAFNgIADDELIAJBADYCHCACIAA2AhQgAkGQMzYCECACQQg2AgwgAkEANgIAQQAhAwwwCyABIARHBEAgAkEONgIIIAIgATYCBEG3ASEDDBcLQdEBIQMMLwsgAkEANgIAIAZBAWohAQtBuAEhAwwUCyABIARGBEBB0AEhAwwtCyABLQAAQTBrIgBB/wFxQQpJBEAgAiAAOgAqIAFBAWohAUG2ASEDDBQLIAIoAgQhACACQQA2AgQgAiAAIAEQKCIARQ0UIAJBzwE2AhwgAiABNgIUIAIgADYCDEEAIQMMLAsgASAERgRAQc4BIQMMLAsCQCABLQAAQS5GBEAgAUEBaiEBDAELIAIoAgQhACACQQA2AgQgAiAAIAEQKCIARQ0VIAJBzQE2AhwgAiABNgIUIAIgADYCDEEAIQMMLAtBtQEhAwwSCyAEIAEiBUYEQEHMASEDDCsLQQAhAEEBIQFBASEGQQAhAwJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAIAUtAABBMGsOCgoJAAECAwQFBggLC0ECDAYLQQMMBQtBBAwEC0EFDAMLQQYMAgtBBwwBC0EICyEDQQAhAUEAIQYMAgtBCSEDQQEhAEEAIQFBACEGDAELQQAhAUEBIQMLIAIgAzoAKyAFQQFqIQMCQAJAIAItAC1BEHENAAJAAkACQCACLQAqDgMBAAIECyAGRQ0DDAILIAANAQwCCyABRQ0BCyACKAIEIQAgAkEANgIEIAIgACADECgiAEUEQCADIQEMAwsgAkHJATYCHCACIAM2AhQgAiAANgIMQQAhAwwtCyACKAIEIQAgAkEANgIEIAIgACADECgiAEUEQCADIQEMGAsgAkHKATYCHCACIAM2AhQgAiAANgIMQQAhAwwsCyACKAIEIQAgAkEANgIEIAIgACAFECgiAEUEQCAFIQEMFgsgAkHLATYCHCACIAU2AhQgAiAANgIMDCsLQbQBIQMMEQtBACEAAkAgAigCOCIDRQ0AIAMoAjwiA0UNACACIAMRAAAhAAsCQCAABEAgAEEVRg0BIAJBADYCHCACIAE2AhQgAkGUDTYCECACQSE2AgxBACEDDCsLQbIBIQMMEQsgAkHIATYCHCACIAE2AhQgAkHJFzYCECACQRU2AgxBACEDDCkLIAJBADYCACAGQQFqIQFB9QAhAwwPCyACLQApQQVGBEBB4wAhAwwPC0HiACEDDA4LIAAhASACQQA2AgALIAJBADoALEEJIQMMDAsgAkEANgIAIAdBAWohAUHAACEDDAsLQQELOgAsIAJBADYCACAGQQFqIQELQSkhAwwIC0E4IQMMBwsCQCABIARHBEADQCABLQAAQYA+ai0AACIAQQFHBEAgAEECRw0DIAFBAWohAQwFCyAEIAFBAWoiAUcNAAtBPiEDDCELQT4hAwwgCwsgAkEAOgAsDAELQQshAwwEC0E6IQMMAwsgAUEBaiEBQS0hAwwCCyACIAE6ACwgAkEANgIAIAZBAWohAUEMIQMMAQsgAkEANgIAIAZBAWohAUEKIQMMAAsAC0EAIQMgAkEANgIcIAIgATYCFCACQc0QNgIQIAJBCTYCDAwXC0EAIQMgAkEANgIcIAIgATYCFCACQekKNgIQIAJBCTYCDAwWC0EAIQMgAkEANgIcIAIgATYCFCACQbcQNgIQIAJBCTYCDAwVC0EAIQMgAkEANgIcIAIgATYCFCACQZwRNgIQIAJBCTYCDAwUC0EAIQMgAkEANgIcIAIgATYCFCACQc0QNgIQIAJBCTYCDAwTC0EAIQMgAkEANgIcIAIgATYCFCACQekKNgIQIAJBCTYCDAwSC0EAIQMgAkEANgIcIAIgATYCFCACQbcQNgIQIAJBCTYCDAwRC0EAIQMgAkEANgIcIAIgATYCFCACQZwRNgIQIAJBCTYCDAwQC0EAIQMgAkEANgIcIAIgATYCFCACQZcVNgIQIAJBDzYCDAwPC0EAIQMgAkEANgIcIAIgATYCFCACQZcVNgIQIAJBDzYCDAwOC0EAIQMgAkEANgIcIAIgATYCFCACQcASNgIQIAJBCzYCDAwNC0EAIQMgAkEANgIcIAIgATYCFCACQZUJNgIQIAJBCzYCDAwMC0EAIQMgAkEANgIcIAIgATYCFCACQeEPNgIQIAJBCjYCDAwLC0EAIQMgAkEANgIcIAIgATYCFCACQfsPNgIQIAJBCjYCDAwKC0EAIQMgAkEANgIcIAIgATYCFCACQfEZNgIQIAJBAjYCDAwJC0EAIQMgAkEANgIcIAIgATYCFCACQcQUNgIQIAJBAjYCDAwIC0EAIQMgAkEANgIcIAIgATYCFCACQfIVNgIQIAJBAjYCDAwHCyACQQI2AhwgAiABNgIUIAJBnBo2AhAgAkEWNgIMQQAhAwwGC0EBIQMMBQtB1AAhAyABIARGDQQgCEEIaiEJIAIoAgAhBQJAAkAgASAERwRAIAVB2MIAaiEHIAQgBWogAWshACAFQX9zQQpqIgUgAWohBgNAIAEtAAAgBy0AAEcEQEECIQcMAwsgBUUEQEEAIQcgBiEBDAMLIAVBAWshBSAHQQFqIQcgBCABQQFqIgFHDQALIAAhBSAEIQELIAlBATYCACACIAU2AgAMAQsgAkEANgIAIAkgBzYCAAsgCSABNgIEIAgoAgwhACAIKAIIDgMBBAIACwALIAJBADYCHCACQbUaNgIQIAJBFzYCDCACIABBAWo2AhRBACEDDAILIAJBADYCHCACIAA2AhQgAkHKGjYCECACQQk2AgxBACEDDAELIAEgBEYEQEEiIQMMAQsgAkEJNgIIIAIgATYCBEEhIQMLIAhBEGokACADRQRAIAIoAgwhAAwBCyACIAM2AhxBACEAIAIoAgQiAUUNACACIAEgBCACKAIIEQEAIgFFDQAgAiAENgIUIAIgATYCDCABIQALIAALvgIBAn8gAEEAOgAAIABB3ABqIgFBAWtBADoAACAAQQA6AAIgAEEAOgABIAFBA2tBADoAACABQQJrQQA6AAAgAEEAOgADIAFBBGtBADoAAEEAIABrQQNxIgEgAGoiAEEANgIAQdwAIAFrQXxxIgIgAGoiAUEEa0EANgIAAkAgAkEJSQ0AIABBADYCCCAAQQA2AgQgAUEIa0EANgIAIAFBDGtBADYCACACQRlJDQAgAEEANgIYIABBADYCFCAAQQA2AhAgAEEANgIMIAFBEGtBADYCACABQRRrQQA2AgAgAUEYa0EANgIAIAFBHGtBADYCACACIABBBHFBGHIiAmsiAUEgSQ0AIAAgAmohAANAIABCADcDGCAAQgA3AxAgAEIANwMIIABCADcDACAAQSBqIQAgAUEgayIBQR9LDQALCwtWAQF/AkAgACgCDA0AAkACQAJAAkAgAC0ALw4DAQADAgsgACgCOCIBRQ0AIAEoAiwiAUUNACAAIAERAAAiAQ0DC0EADwsACyAAQcMWNgIQQQ4hAQsgAQsaACAAKAIMRQRAIABB0Rs2AhAgAEEVNgIMCwsUACAAKAIMQRVGBEAgAEEANgIMCwsUACAAKAIMQRZGBEAgAEEANgIMCwsHACAAKAIMCwcAIAAoAhALCQAgACABNgIQCwcAIAAoAhQLFwAgAEEkTwRAAAsgAEECdEGgM2ooAgALFwAgAEEuTwRAAAsgAEECdEGwNGooAgALvwkBAX9B6yghAQJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABB5ABrDvQDY2IAAWFhYWFhYQIDBAVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhBgcICQoLDA0OD2FhYWFhEGFhYWFhYWFhYWFhEWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYRITFBUWFxgZGhthYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2YTc4OTphYWFhYWFhYTthYWE8YWFhYT0+P2FhYWFhYWFhQGFhQWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYUJDREVGR0hJSktMTU5PUFFSU2FhYWFhYWFhVFVWV1hZWlthXF1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFeYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhX2BhC0HhJw8LQaQhDwtByywPC0H+MQ8LQcAkDwtBqyQPC0GNKA8LQeImDwtBgDAPC0G5Lw8LQdckDwtB7x8PC0HhHw8LQfofDwtB8iAPC0GoLw8LQa4yDwtBiDAPC0HsJw8LQYIiDwtBjh0PC0HQLg8LQcojDwtBxTIPC0HfHA8LQdIcDwtBxCAPC0HXIA8LQaIfDwtB7S4PC0GrMA8LQdQlDwtBzC4PC0H6Lg8LQfwrDwtB0jAPC0HxHQ8LQbsgDwtB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CABB3AgLii1JbnZhbGlkIGNoYXIgaW4gdXJsIHF1ZXJ5AFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fYm9keQBDb250ZW50LUxlbmd0aCBvdmVyZmxvdwBDaHVuayBzaXplIG92ZXJmbG93AFJlc3BvbnNlIG92ZXJmbG93AEludmFsaWQgbWV0aG9kIGZvciBIVFRQL3gueCByZXF1ZXN0AEludmFsaWQgbWV0aG9kIGZvciBSVFNQL3gueCByZXF1ZXN0AEV4cGVjdGVkIFNPVVJDRSBtZXRob2QgZm9yIElDRS94LnggcmVxdWVzdABJbnZhbGlkIGNoYXIgaW4gdXJsIGZyYWdtZW50IHN0YXJ0AEV4cGVjdGVkIGRvdABTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3N0YXR1cwBJbnZhbGlkIHJlc3BvbnNlIHN0YXR1cwBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zAFVzZXIgY2FsbGJhY2sgZXJyb3IAYG9uX3Jlc2V0YCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfaGVhZGVyYCBjYWxsYmFjayBlcnJvcgBgb25fbWVzc2FnZV9iZWdpbmAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3N0YXR1c19jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3ZlcnNpb25fY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl91cmxfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2hlYWRlcl92YWx1ZV9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX21lc3NhZ2VfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXRob2RfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfZmllbGRfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fbmFtZWAgY2FsbGJhY2sgZXJyb3IAVW5leHBlY3RlZCBjaGFyIGluIHVybCBzZXJ2ZXIASW52YWxpZCBoZWFkZXIgdmFsdWUgY2hhcgBJbnZhbGlkIGhlYWRlciBmaWVsZCBjaGFyAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fdmVyc2lvbgBJbnZhbGlkIG1pbm9yIHZlcnNpb24ASW52YWxpZCBtYWpvciB2ZXJzaW9uAEV4cGVjdGVkIHNwYWNlIGFmdGVyIHZlcnNpb24ARXhwZWN0ZWQgQ1JMRiBhZnRlciB2ZXJzaW9uAEludmFsaWQgSFRUUCB2ZXJzaW9uAEludmFsaWQgaGVhZGVyIHRva2VuAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fdXJsAEludmFsaWQgY2hhcmFjdGVycyBpbiB1cmwAVW5leHBlY3RlZCBzdGFydCBjaGFyIGluIHVybABEb3VibGUgQCBpbiB1cmwARW1wdHkgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyYWN0ZXIgaW4gQ29udGVudC1MZW5ndGgARHVwbGljYXRlIENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhciBpbiB1cmwgcGF0aABDb250ZW50LUxlbmd0aCBjYW4ndCBiZSBwcmVzZW50IHdpdGggVHJhbnNmZXItRW5jb2RpbmcASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgc2l6ZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2hlYWRlcl92YWx1ZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgTEYgYWZ0ZXIgaGVhZGVyIHZhbHVlAEludmFsaWQgYFRyYW5zZmVyLUVuY29kaW5nYCBoZWFkZXIgdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZSB2YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHF1b3RlZCB2YWx1ZQBQYXVzZWQgYnkgb25faGVhZGVyc19jb21wbGV0ZQBJbnZhbGlkIEVPRiBzdGF0ZQBvbl9yZXNldCBwYXVzZQBvbl9jaHVua19oZWFkZXIgcGF1c2UAb25fbWVzc2FnZV9iZWdpbiBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fdmFsdWUgcGF1c2UAb25fc3RhdHVzX2NvbXBsZXRlIHBhdXNlAG9uX3ZlcnNpb25fY29tcGxldGUgcGF1c2UAb25fdXJsX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl92YWx1ZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXNzYWdlX2NvbXBsZXRlIHBhdXNlAG9uX21ldGhvZF9jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfZmllbGRfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX25hbWUgcGF1c2UAVW5leHBlY3RlZCBzcGFjZSBhZnRlciBzdGFydCBsaW5lAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX25hbWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBuYW1lAFBhdXNlIG9uIENPTk5FQ1QvVXBncmFkZQBQYXVzZSBvbiBQUkkvVXBncmFkZQBFeHBlY3RlZCBIVFRQLzIgQ29ubmVjdGlvbiBQcmVmYWNlAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fbWV0aG9kAEV4cGVjdGVkIHNwYWNlIGFmdGVyIG1ldGhvZABTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2hlYWRlcl9maWVsZABQYXVzZWQASW52YWxpZCB3b3JkIGVuY291bnRlcmVkAEludmFsaWQgbWV0aG9kIGVuY291bnRlcmVkAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2NoZW1hAFJlcXVlc3QgaGFzIGludmFsaWQgYFRyYW5zZmVyLUVuY29kaW5nYABTV0lUQ0hfUFJPWFkAVVNFX1BST1hZAE1LQUNUSVZJVFkAVU5QUk9DRVNTQUJMRV9FTlRJVFkAQ09QWQBNT1ZFRF9QRVJNQU5FTlRMWQBUT09fRUFSTFkATk9USUZZAEZBSUxFRF9ERVBFTkRFTkNZAEJBRF9HQVRFV0FZAFBMQVkAUFVUAENIRUNLT1VUAEdBVEVXQVlfVElNRU9VVABSRVFVRVNUX1RJTUVPVVQATkVUV09SS19DT05ORUNUX1RJTUVPVVQAQ09OTkVDVElPTl9USU1FT1VUAExPR0lOX1RJTUVPVVQATkVUV09SS19SRUFEX1RJTUVPVVQAUE9TVABNSVNESVJFQ1RFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX0xPQURfQkFMQU5DRURfUkVRVUVTVABCQURfUkVRVUVTVABIVFRQX1JFUVVFU1RfU0VOVF9UT19IVFRQU19QT1JUAFJFUE9SVABJTV9BX1RFQVBPVABSRVNFVF9DT05URU5UAE5PX0NPTlRFTlQAUEFSVElBTF9DT05URU5UAEhQRV9JTlZBTElEX0NPTlNUQU5UAEhQRV9DQl9SRVNFVABHRVQASFBFX1NUUklDVABDT05GTElDVABURU1QT1JBUllfUkVESVJFQ1QAUEVSTUFORU5UX1JFRElSRUNUAENPTk5FQ1QATVVMVElfU1RBVFVTAEhQRV9JTlZBTElEX1NUQVRVUwBUT09fTUFOWV9SRVFVRVNUUwBFQVJMWV9ISU5UUwBVTkFWQUlMQUJMRV9GT1JfTEVHQUxfUkVBU09OUwBPUFRJT05TAFNXSVRDSElOR19QUk9UT0NPTFMAVkFSSUFOVF9BTFNPX05FR09USUFURVMATVVMVElQTEVfQ0hPSUNFUwBJTlRFUk5BTF9TRVJWRVJfRVJST1IAV0VCX1NFUlZFUl9VTktOT1dOX0VSUk9SAFJBSUxHVU5fRVJST1IASURFTlRJVFlfUFJPVklERVJfQVVUSEVOVElDQVRJT05fRVJST1IAU1NMX0NFUlRJRklDQVRFX0VSUk9SAElOVkFMSURfWF9GT1JXQVJERURfRk9SAFNFVF9QQVJBTUVURVIAR0VUX1BBUkFNRVRFUgBIUEVfVVNFUgBTRUVfT1RIRVIASFBFX0NCX0NIVU5LX0hFQURFUgBNS0NBTEVOREFSAFNFVFVQAFdFQl9TRVJWRVJfSVNfRE9XTgBURUFSRE9XTgBIUEVfQ0xPU0VEX0NPTk5FQ1RJT04ASEVVUklTVElDX0VYUElSQVRJT04ARElTQ09OTkVDVEVEX09QRVJBVElPTgBOT05fQVVUSE9SSVRBVElWRV9JTkZPUk1BVElPTgBIUEVfSU5WQUxJRF9WRVJTSU9OAEhQRV9DQl9NRVNTQUdFX0JFR0lOAFNJVEVfSVNfRlJPWkVOAEhQRV9JTlZBTElEX0hFQURFUl9UT0tFTgBJTlZBTElEX1RPS0VOAEZPUkJJRERFTgBFTkhBTkNFX1lPVVJfQ0FMTQBIUEVfSU5WQUxJRF9VUkwAQkxPQ0tFRF9CWV9QQVJFTlRBTF9DT05UUk9MAE1LQ09MAEFDTABIUEVfSU5URVJOQUwAUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRV9VTk9GRklDSUFMAEhQRV9PSwBVTkxJTksAVU5MT0NLAFBSSQBSRVRSWV9XSVRIAEhQRV9JTlZBTElEX0NPTlRFTlRfTEVOR1RIAEhQRV9VTkVYUEVDVEVEX0NPTlRFTlRfTEVOR1RIAEZMVVNIAFBST1BQQVRDSABNLVNFQVJDSABVUklfVE9PX0xPTkcAUFJPQ0VTU0lORwBNSVNDRUxMQU5FT1VTX1BFUlNJU1RFTlRfV0FSTklORwBNSVNDRUxMQU5FT1VTX1dBUk5JTkcASFBFX0lOVkFMSURfVFJBTlNGRVJfRU5DT0RJTkcARXhwZWN0ZWQgQ1JMRgBIUEVfSU5WQUxJRF9DSFVOS19TSVpFAE1PVkUAQ09OVElOVUUASFBFX0NCX1NUQVRVU19DT01QTEVURQBIUEVfQ0JfSEVBREVSU19DT01QTEVURQBIUEVfQ0JfVkVSU0lPTl9DT01QTEVURQBIUEVfQ0JfVVJMX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19DT01QTEVURQBIUEVfQ0JfSEVBREVSX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9OQU1FX0NPTVBMRVRFAEhQRV9DQl9NRVNTQUdFX0NPTVBMRVRFAEhQRV9DQl9NRVRIT0RfQ09NUExFVEUASFBFX0NCX0hFQURFUl9GSUVMRF9DT01QTEVURQBERUxFVEUASFBFX0lOVkFMSURfRU9GX1NUQVRFAElOVkFMSURfU1NMX0NFUlRJRklDQVRFAFBBVVNFAE5PX1JFU1BPTlNFAFVOU1VQUE9SVEVEX01FRElBX1RZUEUAR09ORQBOT1RfQUNDRVBUQUJMRQBTRVJWSUNFX1VOQVZBSUxBQkxFAFJBTkdFX05PVF9TQVRJU0ZJQUJMRQBPUklHSU5fSVNfVU5SRUFDSEFCTEUAUkVTUE9OU0VfSVNfU1RBTEUAUFVSR0UATUVSR0UAUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRQBSRVFVRVNUX0hFQURFUl9UT09fTEFSR0UAUEFZTE9BRF9UT09fTEFSR0UASU5TVUZGSUNJRU5UX1NUT1JBR0UASFBFX1BBVVNFRF9VUEdSQURFAEhQRV9QQVVTRURfSDJfVVBHUkFERQBTT1VSQ0UAQU5OT1VOQ0UAVFJBQ0UASFBFX1VORVhQRUNURURfU1BBQ0UAREVTQ1JJQkUAVU5TVUJTQ1JJQkUAUkVDT1JEAEhQRV9JTlZBTElEX01FVEhPRABOT1RfRk9VTkQAUFJPUEZJTkQAVU5CSU5EAFJFQklORABVTkFVVEhPUklaRUQATUVUSE9EX05PVF9BTExPV0VEAEhUVFBfVkVSU0lPTl9OT1RfU1VQUE9SVEVEAEFMUkVBRFlfUkVQT1JURUQAQUNDRVBURUQATk9UX0lNUExFTUVOVEVEAExPT1BfREVURUNURUQASFBFX0NSX0VYUEVDVEVEAEhQRV9MRl9FWFBFQ1RFRABDUkVBVEVEAElNX1VTRUQASFBFX1BBVVNFRABUSU1FT1VUX09DQ1VSRUQAUEFZTUVOVF9SRVFVSVJFRABQUkVDT05ESVRJT05fUkVRVUlSRUQAUFJPWFlfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATkVUV09SS19BVVRIRU5USUNBVElPTl9SRVFVSVJFRABMRU5HVEhfUkVRVUlSRUQAU1NMX0NFUlRJRklDQVRFX1JFUVVJUkVEAFVQR1JBREVfUkVRVUlSRUQAUEFHRV9FWFBJUkVEAFBSRUNPTkRJVElPTl9GQUlMRUQARVhQRUNUQVRJT05fRkFJTEVEAFJFVkFMSURBVElPTl9GQUlMRUQAU1NMX0hBTkRTSEFLRV9GQUlMRUQATE9DS0VEAFRSQU5TRk9STUFUSU9OX0FQUExJRUQATk9UX01PRElGSUVEAE5PVF9FWFRFTkRFRABCQU5EV0lEVEhfTElNSVRfRVhDRUVERUQAU0lURV9JU19PVkVSTE9BREVEAEhFQUQARXhwZWN0ZWQgSFRUUC8AAF4TAAAmEwAAMBAAAPAXAACdEwAAFRIAADkXAADwEgAAChAAAHUSAACtEgAAghMAAE8UAAB/EAAAoBUAACMUAACJEgAAixQAAE0VAADUEQAAzxQAABAYAADJFgAA3BYAAMERAADgFwAAuxQAAHQUAAB8FQAA5RQAAAgXAAAfEAAAZRUAAKMUAAAoFQAAAhUAAJkVAAAsEAAAixkAAE8PAADUDgAAahAAAM4QAAACFwAAiQ4AAG4TAAAcEwAAZhQAAFYXAADBEwAAzRMAAGwTAABoFwAAZhcAAF8XAAAiEwAAzg8AAGkOAADYDgAAYxYAAMsTAACqDgAAKBcAACYXAADFEwAAXRYAAOgRAABnEwAAZRMAAPIWAABzEwAAHRcAAPkWAADzEQAAzw4AAM4VAAAMEgAAsxEAAKURAABhEAAAMhcAALsTAEH5NQsBAQBBkDYL4AEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB/TcLAQEAQZE4C14CAwICAgICAAACAgACAgACAgICAgICAgICAAQAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgACAEH9OQsBAQBBkToLXgIAAgICAgIAAAICAAICAAICAgICAgICAgIAAwAEAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAQfA7Cw1sb3NlZWVwLWFsaXZlAEGJPAsBAQBBoDwL4AEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBBiT4LAQEAQaA+C+cBAQEBAQEBAQEBAQEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFjaHVua2VkAEGwwAALXwEBAAEBAQEBAAABAQABAQABAQEBAQEBAQEBAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAEGQwgALIWVjdGlvbmVudC1sZW5ndGhvbnJveHktY29ubmVjdGlvbgBBwMIACy1yYW5zZmVyLWVuY29kaW5ncGdyYWRlDQoNCg0KU00NCg0KVFRQL0NFL1RTUC8AQfnCAAsFAQIAAQMAQZDDAAvgAQQBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAEH5xAALBQECAAEDAEGQxQAL4AEEAQEFAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB+cYACwQBAAABAEGRxwAL3wEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAEH6yAALBAEAAAIAQZDJAAtfAwQAAAQEBAQEBAQEBAQEBQQEBAQEBAQEBAQEBAAEAAYHBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQAQfrKAAsEAQAAAQBBkMsACwEBAEGqywALQQIAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAEH6zAALBAEAAAEAQZDNAAsBAQBBms0ACwYCAAAAAAIAQbHNAAs6AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBB8M4AC5YBTk9VTkNFRUNLT1VUTkVDVEVURUNSSUJFTFVTSEVURUFEU0VBUkNIUkdFQ1RJVklUWUxFTkRBUlZFT1RJRllQVElPTlNDSFNFQVlTVEFUQ0hHRU9SRElSRUNUT1JUUkNIUEFSQU1FVEVSVVJDRUJTQ1JJQkVBUkRPV05BQ0VJTkROS0NLVUJTQ1JJQkVIVFRQL0FEVFAv", "base64"); + var wasmBase64 = "AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAn9/AGABfwBgBH9/f38Bf2AAAGADf39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQAEA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAAzQzBQYAAAMAAAAAAAADAQMAAwMDAAACAAAAAAICAgICAgICAgIBAQEBAQEBAQEDAAADAAAABAUBcAESEgUDAQACBggBfwFBgNgECwfFBygGbWVtb3J5AgALX2luaXRpYWxpemUACBlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALbGxodHRwX2luaXQACRhsbGh0dHBfc2hvdWxkX2tlZXBfYWxpdmUANgxsbGh0dHBfYWxsb2MACwZtYWxsb2MAOAtsbGh0dHBfZnJlZQAMBGZyZWUADA9sbGh0dHBfZ2V0X3R5cGUADRVsbGh0dHBfZ2V0X2h0dHBfbWFqb3IADhVsbGh0dHBfZ2V0X2h0dHBfbWlub3IADxFsbGh0dHBfZ2V0X21ldGhvZAAQFmxsaHR0cF9nZXRfc3RhdHVzX2NvZGUAERJsbGh0dHBfZ2V0X3VwZ3JhZGUAEgxsbGh0dHBfcmVzZXQAEw5sbGh0dHBfZXhlY3V0ZQAUFGxsaHR0cF9zZXR0aW5nc19pbml0ABUNbGxodHRwX2ZpbmlzaAAWDGxsaHR0cF9wYXVzZQAXDWxsaHR0cF9yZXN1bWUAGBtsbGh0dHBfcmVzdW1lX2FmdGVyX3VwZ3JhZGUAGRBsbGh0dHBfZ2V0X2Vycm5vABoXbGxodHRwX2dldF9lcnJvcl9yZWFzb24AGxdsbGh0dHBfc2V0X2Vycm9yX3JlYXNvbgAcFGxsaHR0cF9nZXRfZXJyb3JfcG9zAB0RbGxodHRwX2Vycm5vX25hbWUAHhJsbGh0dHBfbWV0aG9kX25hbWUAHxJsbGh0dHBfc3RhdHVzX25hbWUAIBpsbGh0dHBf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a0E+aiECCyABIAI2AhwgAUIANwIQIAJBAnRBsNYAaiEAAkBBhNQAKAIAIgNBASACdCIHcUUEQCAAIAE2AgBBhNQAIAMgB3I2AgAgASAANgIYIAEgATYCCCABIAE2AgwMAQsgBEEZIAJBAXZrQQAgAkEfRxt0IQIgACgCACEAAkADQCAAIgMoAgRBeHEgBEYNASACQR12IQAgAkEBdCECIAMgAEEEcWpBEGoiBygCACIADQALIAcgATYCACABIAM2AhggASABNgIMIAEgATYCCAwBCyADKAIIIgAgATYCDCADIAE2AgggAUEANgIYIAEgAzYCDCABIAA2AggLQaDUAEGg1AAoAgBBAWsiAEF/IAAbNgIACwsHACAALQAoCwcAIAAtACoLBwAgAC0AKwsHACAALQApCwcAIAAvATQLBwAgAC0AMAtAAQR/IAAoAhghASAALwEuIQIgAC0AKCEDIAAoAjghBCAAEDcgACAENgI4IAAgAzoAKCAAIAI7AS4gACABNgIYC8X4AQIHfwN+IAEgAmohBAJAIAAiAygCDCIADQAgAygCBARAIAMgATYCBAsjAEEQayIJJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAMCfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAn8CQAJAAkACQAJAAkACQAJ/AkACQAJAAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAMCfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCACDtQBAAECAwQFBgcICQoLDA0ODxARFBUWFxgZGhscHR4fICEjJCUnKCmIA4cDhQOEA/wC9QLuAusC6ALmAuMC4ALfAt0C2wLWAtUC1ALTAtICygLJAsgCxwLGAsUCxALDAr0CvAK6ArkCuAK3ArYCtQK0ArICsQKsAqoCqAKnAqYCpQKkAqMCogKhAqACnwKbApoCmQKYApcCkAKIAoQCgwKCAvkB9gH1AfQB8wHyAfEB8AHvAe0B6wHoAeMB4QHgAd8B3gHdAdwB2wHaAdkB2AHX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QEBAQEBAQEBAQEBAAEALQQAhAiADQQA2AhwgA0G3CzYCECADQQI2AgwgAyABQQFqNgIUDIEDCyADQS9qIQIDQCABIARGBEBBISECDIIDCwJAAkACQCABLQAAIgBBCWsOGAIAKioBKioqKioqKioqKioqKioqKioqAigLIAFBAWohASADQS9qLQAAQQFxRQ0LDBkLIAFBAWohAQwYCyABQQFqIQEgAi0AAEECcQ0AC0EAIQIgA0EANgIcIAMgATYCFCADQc4UNgIQIANBDDYCDAyAAwsgAUEBaiEBC0EAIQACQCADKAI4IgJFDQAgAigCVCICRQ0AIAMgAhEAACEACyAADQEM0QILIANCADcDIAw8CyAAQRVGBEAgA0EkNgIcIAMgATYCFCADQYYaNgIQIANBFTYCDEEAIQIM/QILQQAhAiADQQA2AhwgAyABNgIUIANB4g02AhAgA0EUNgIMDPwCCyADKAIEIQBBACECIANBADYCBCADIAAgASAMp2oiARAxIgBFDSsgA0EHNgIcIAMgATYCFCADIAA2AgwM+wILIAMtAC5BwABxRQ0BC0EAIQACQCADKAI4IgJFDQAgAigCUCICRQ0AIAMgAhEAACEACyAARQ0rIABBFUYEQCADQQo2AhwgAyABNgIUIANB8Rg2AhAgA0EVNgIMQQAhAgz6AgtBACECIANBADYCHCADIAE2AhQgA0GLDDYCECADQRM2AgwM+QILQQAhAiADQQA2AhwgAyABNgIUIANBsRQ2AhAgA0ECNgIMDPgCC0EAIQIgA0EANgIcIAMgATYCFCADQYwUNgIQIANBGTYCDAz3AgtBACECIANBADYCHCADIAE2AhQgA0HRHDYCECADQRk2AgwM9gILIABBFUYNPUEAIQIgA0EANgIcIAMgATYCFCADQaIPNgIQIANBIjYCDAz1AgsgAygCBCEAQQAhAiADQQA2AgQgAyAAIAEQMiIARQ0oIANBDTYCHCADIAE2AhQgAyAANgIMDPQCCyAAQRVGDTpBACECIANBADYCHCADIAE2AhQgA0GiDzYCECADQSI2AgwM8wILIAMoAgQhAEEAIQIgA0EANgIEIAMgACABEDIiAEUEQCABQQFqIQEMKAsgA0EONgIcIAMgADYCDCADIAFBAWo2AhQM8gILIABBFUYNN0EAIQIgA0EANgIcIAMgATYCFCADQaIPNgIQIANBIjYCDAzxAgsgAygCBCEAQQAhAiADQQA2AgQgAyAAIAEQMiIARQRAIAFBAWohAQwnCyADQQ82AhwgAyAANgIMIAMgAUEBajYCFAzwAgtBACECIANBADYCHCADIAE2AhQgA0HoFjYCECADQRk2AgwM7wILIABBFUYNM0EAIQIgA0EANgIcIAMgATYCFCADQc4MNgIQIANBIzYCDAzuAgsgAygCBCEAQQAhAiADQQA2AgQgAyAAIAEQMyIARQ0lIANBETYCHCADIAE2AhQgAyAANgIMDO0CCyAAQRVGDTBBACECIANBADYCHCADIAE2AhQgA0HODDYCECADQSM2AgwM7AILIAMoAgQhAEEAIQIgA0EANgIEIAMgACABEDMiAEUEQCABQQFqIQEMJQsgA0ESNgIcIAMgADYCDCADIAFBAWo2AhQM6wILIANBL2otAABBAXFFDQELQRUhAgzPAgtBACECIANBADYCHCADIAE2AhQgA0HoFjYCECADQRk2AgwM6AILIABBO0cNACABQQFqIQEMDAtBACECIANBADYCHCADIAE2AhQgA0GYFzYCECADQQI2AgwM5gILIABBFUYNKEEAIQIgA0EANgIcIAMgATYCFCADQc4MNgIQIANBIzYCDAzlAgsgA0EUNgIcIAMgATYCFCADIAA2AgwM5AILIAMoAgQhAEEAIQIgA0EANgIEIAMgACABEDMiAEUEQCABQQFqIQEM3AILIANBFTYCHCADIAA2AgwgAyABQQFqNgIUDOMCCyADKAIEIQBBACECIANBADYCBCADIAAgARAzIgBFBEAgAUEBaiEBDNoCCyADQRc2AhwgAyAANgIMIAMgAUEBajYCFAziAgsgAEEVRg0jQQAhAiADQQA2AhwgAyABNgIUIANBzgw2AhAgA0EjNgIMDOECCyADKAIEIQBBACECIANBADYCBCADIAAgARAzIgBFBEAgAUEBaiEBDB0LIANBGTYCHCADIAA2AgwgAyABQQFqNgIUDOACCyADKAIEIQBBACECIANBADYCBCADIAAgARAzIgBFBEAgAUEBaiEBDNYCCyADQRo2AhwgAyAANgIMIAMgAUEBajYCFAzfAgsgAEEVRg0fQQAhAiADQQA2AhwgAyABNgIUIANBog82AhAgA0EiNgIMDN4CCyADKAIEIQBBACEC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DLMCCyABIARGBEBB6QEhAgyzAgsgAS0AAEHIAEYNASADQQE6ACgLQbYBIQIMlwILQcoBIQIMlgILIAEgBEcEQCADQQw2AgggAyABNgIEQckBIQIMlgILQegBIQIMrwILIAEgBEYEQEHnASECDK8CCyABLQAAQcgARw0EIAFBAWohAUHIASECDJQCCyABIARGBEBB5gEhAgyuAgsCQAJAIAEtAABBxQBrDhAABQUFBQUFBQUFBQUFBQUBBQsgAUEBaiEBQcYBIQIMlAILIAFBAWohAUHHASECDJMCC0HlASECIAEgBEYNrAIgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABB99MAai0AAEcNAyAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMrQILIAMoAgQhACADQgA3AwAgAyAAIAZBAWoiARAtIgBFBEBB1AEhAgyTAgsgA0HkATYCHCADIAE2AhQgAyAANgIMQQAhAgysAgtB4wEhAiABIARGDasCIAMoAgAiACAEIAFraiEFIAEgAGtBAWohBgJAA0AgAS0AACAAQfXTAGotAABHDQIgAEEBRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADKwCCyADQYEEOwEoIAMoAgQhACADQgA3AwAgAyAAIAZBAWoiARAtIgANAwwCCyADQQA2AgALQQAhAiADQQA2AhwgAyABNgIUIANB0B42AhAgA0EINgIMDKkCC0HFASECDI4CCyADQeIBNgIcIAMgATYCFCADIAA2AgxBACECDKcCC0EAIQACQCADKAI4IgJFDQAgAigCOCICRQ0AIAMgAhEAACEACyAARQ1lIABBFUcEQCADQQA2AhwgAyABNgIUIANB1A42AhAgA0EgNgIMQQAhAgynAgsgA0GFATYCHCADIAE2AhQgA0HXGjYCECADQRU2AgxBACECDKYCC0HhASECIAQgASIARg2lAiAEIAFrIAMoAgAiAWohBSAAIAFrQQRqIQYCQANAIAAtAAAgAUHw0wBqLQAARw0BIAFBBEYNAyABQQFqIQEgBCAAQQFqIgBHDQALIAMgBTYCAAymAgsgA0EANgIcIAMgADYCFCADQYQ3NgIQIANBCDYCDCADQQA2AgBBACECDKUCCyABIARHBEAgA0ENNgIIIAMgATYCBEHCASECDIsCC0HgASECDKQCCyADQQA2AgAgBkEBaiEBC0HDASECDIgCCyABIARGBEBB3wEhAgyiAgsgAS0AAEEwayIAQf8BcUEKSQRAIAMgADoAKiABQQFqIQFBwQEhAgyIAgsgAygCBCEAIANBADYCBCADIAAgARAuIgBFDYgCIANB3gE2AhwgAyABNgIUIAMgADYCDEEAIQIMoQILIAEgBEYEQEHdASECDKECCwJAIAEtAABBLkYEQCABQQFqIQEMAQsgAygCBCEAIANBADYCBCADIAAgARAuIgBFDYkCIANB3AE2AhwgAyABNgIUIAMgADYCDEEAIQIMoQILQcABIQIMhgILIAEgBEYEQEHbASECDKACC0EAIQBBASEFQQEhB0EAIQICQAJAAkACQAJAAn8CQAJAAkACQAJAAkACQCABLQAAQTBrDgoKCQABAgMEBQYICwtBAgwGC0EDDAULQQQMBAtBBQwDC0EGDAILQQcMAQtBCAshAkEAIQVBACEHDAILQQkhAkEBIQBBACEFQQAhBwwBC0EAIQVBASECCyADIAI6ACsgAUEBaiEBAkACQCADLQAuQRBxDQACQAJAAkAgAy0AKg4DAQACBAsgB0UNAwwCCyAADQEMAgsgBUUNAQsgAygCBCEAIANBADYCBCADIAAgARAuIgBFDQIgA0HYATYCHCADIAE2AhQgAyAANgIMQQAhAgyiAgsgAygCBCEAIANBADYCBCADIAAgARAuIgBFDYsCIANB2QE2AhwgAyABNgIUIAMgADYCDEEAIQIMoQILIAMoAgQhACADQQA2AgQgAyAAIAEQLiIARQ2JAiADQdoBNgIcIAMgATYCFCADIAA2AgwMoAILQb8BIQIMhQILQQAhAAJAIAMoAjgiAkUNACACKAI8IgJFDQAgAyACEQAAIQALAkAgAARAIABBFUYNASADQQA2AhwgAyABNgIUIANBnA02AhAgA0EhNgIMQQAhAgygAgtBvgEhAgyFAgsgA0HXATYCHCADIAE2AhQgA0HWGTYCECADQRU2AgxBACECDJ4CCyABIARGBEBB1wEhAgyeAgsCQCABLQAAQSBGBEAgA0EAOwE0IAFBAWohAQwBCyADQQA2AhwgAyABNgIUIANB6xA2AhAgA0EJNgIMQQAhAgyeAgtBvQEhAgyDAgsgASAERgRAQdYBIQIM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LgsgAUEBaiEBQZcBIQIM2AELIAFBAWohAUEiDCsLIAEgBEYEQEGvASECDPEBCyABLQAAQdAARw0rIAFBAWohAUGWASECDNYBCyABIARGBEBBrgEhAgzwAQsCQAJAIAEtAABBxgBrDgsALCwsLCwsLCwsASwLIAFBAWohAUGUASECDNYBCyABQQFqIQFBlQEhAgzVAQtBrQEhAiABIARGDe4BIAMoAgAiACAEIAFraiEFIAEgAGtBA2ohBgJAA0AgAS0AACAAQazTAGotAABHDSggAEEDRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADO8BCyADQQA2AgAgBkEBaiEBQQ0MKAtBrAEhAiABIARGDe0BIAMoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQeHTAGotAABHDScgAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADO4BCyADQQA2AgAgBkEBaiEBQQwMJwtBqwEhAiABIARGDewBIAMoAgAiACAEIAFraiEFIAEgAGtBAWohBgJAA0AgAS0AACAAQarTAGotAABHDSYgAEEBRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADO0BCyADQQA2AgAgBkEBaiEBQQMMJgtBqgEhAiABIARGDesBIAMoAgAiACAEIAFraiEFIAEgAGtBAWohBgJAA0AgAS0AACAAQajTAGotAABHDSUgAEEBRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADOwBCyADQQA2AgAgBkEBaiEBQSYMJQsgASAERgRAQakBIQIM6wELAkACQCABLQAAQdQAaw4CAAEnCyABQQFqIQFBjwEhAgzRAQsgAUEBaiEBQZABIQIM0AELQagBIQIgASAERg3pASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEGm0wBqLQAARw0jIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzqAQsgA0EANgIAIAZBAWohAUEnDCMLQacBIQIgASAERg3oASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEGk0wBqLQAARw0iIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzpAQsgA0EANgIAIAZBAWohAUEcDCILQaYBIQIgASAERg3nASADKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEGe0wBqLQAARw0hIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzoAQsgA0EANgIAIAZBAWohAUEGDCELQaUBIQIgASAERg3mASADKAIAIgAgBCABa2ohBSABIABrQQRqIQYCQANAIAEtAAAgAEGZ0wBqLQAARw0gIABBBEYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAznAQsgA0EANgIAIAZBAWohAUEZDCALIAEgBEYEQEGkASECDOYBCwJAAkACQAJAIAEtAABBLWsOIwAkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJAEkJCQkJAIkJCQDJAsgAUEBaiEBQYQBIQIMzgELIAFBAWohAUGFASECDM0BCyABQQFqIQFBigEhAgzMAQsgAUEBaiEBQYsBIQIMywELQaMBIQIgASAERg3kASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEGX0wBqLQAARw0eIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzlAQsgA0EANgIAIAZBAWohAUELDB4LIAEgBEYEQEGiASECDOQBCwJAAkAgAS0AAEHBAGsOAwAgASALIAFBAWohAUGGASECDMoBCyABQQFqIQFBiQEhAgzJAQsgASAERgRAQaEBIQIM4wELAkACQCABLQAAQcEAaw4PAB8fHx8fHx8fHx8fHx8BHwsgAUEBaiEBQYcBIQIMyQELIAFBAWohAUGIASECDMgBCyABIARGBEBBoAEhAgziAQsgAS0AAEHMAEcNHCABQQFqIQFBCgwbC0GfASECIAEgBEYN4AEgAygCACIAIAQgAWtqIQUgASAAa0EFaiEGAkADQCABLQAAIABBkdMAai0AAEcNGiAAQQVGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM4QELIANBADYCACAGQQFqIQFBHgwaC0GeASECIAEgBEYN3wEgAygCACIAIAQgAWtqIQUgASAAa0EGaiEGAkADQCABLQAAIABBitMAai0AAEcNGSAAQQZGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM4AELIANBADYCACAGQQFqIQFBFQwZC0GdASECIAEgBEYN3gEgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABBh9MAai0AAEcNGCAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM3wELIANBADYCACAGQQFqIQFBFwwYC0GcASECIAEgBEYN3QEgAygCACIAIAQgAWtqIQUgASAAa0EFaiEGAkADQCABLQAAIABBgdMAai0AAEcNFyAAQQVGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM3gELIANBADYCACAGQQFqIQFBGAwXCyABIARGBEBBmwEhAgzdAQsCQAJAIAEtAABByQBrDgcAGRkZGRkBGQsgAUEBaiEBQYEBIQIMwwELIAFBAWohAUGCASECDMIBC0GaASECIAEgBEYN2wEgAygCACIAIAQgAWtqIQUgASAAa0EBaiEGAkADQCABLQAAIABB5tMAai0AAEcNFSAAQQFGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM3AELIANBADYCACAGQQFqIQFBCQwVC0GZASECIAEgBEYN2gEgAygCACIAIAQgAWtqIQUgASAAa0EBaiEGAkADQCABLQAAIABB5NMAai0AAEcNFCAAQQFGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM2wELIANBADYCACAGQQFqIQFBHwwUC0GYASECIAEgBEYN2QEgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABB/tIAai0AAEcNEyAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM2gELIANBADYCACAGQQFqIQFBAgwTC0GXASECIAEgBEYN2AEgAygCACIAIAQgAWtqIQUgASAAa0EBaiEGA0AgAS0AACAAQfzSAGotAABHDREgAEEBRg0CIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADNgBCyABIARGBEBBlgEhAgzYAQtBASABLQAAQd8ARw0RGiABQQFqIQFB/QAhAgy9AQsgA0EANgIAIAZBAWohAUH+ACECDLwBC0GVASECIAEgBEYN1QEgAygCACIAIAQgAWtqIQUgASAAa0EIaiEGAkADQCABLQAAIABBxNMAai0AAEcNDyAAQQhGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM1gELIANBADYCACAGQQFqIQFBKQwPC0GUASECIAEgBEYN1AEgAygCACIAIAQgAWtqIQUgASAAa0EDaiEGAkADQCABLQAAIABB+NIAai0AAEcNDiAAQQNGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM1QELIANBADYCACAGQQFqIQFBLQwOCyABIARGBEBBkwEhAgzUAQsgAS0AAEHFAEcNDiABQQFqIQFB+gAhAgy5AQsgASAERgRAQZIBIQIM0wELAkACQCABLQAAQcwAaw4IAA8PDw8PDwEPCyABQQFqIQFB+AAhAgy5AQsgAUEBaiEBQfkAIQIMuAELQZEBIQIgASAERg3RASADKAIAIgAgBCABa2ohBSABIABrQQRqIQYCQANAIAEtAAAgAEHz0gBqLQAARw0LIABBBEYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzSAQsgA0EANgIAIAZBAWohAUEjDAsLQZABIQIgASAERg3QASADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEHw0gBqLQAARw0KIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzRAQsgA0EANgIAIAZBAWohAUEADAoLIAEgBEYEQEGPASECDNABCwJAAkAgAS0AAEHIAGsOCAAMDAwMDAwBDAsgAUEBaiEBQfMAIQIMtgELIAFBAWohAUH2ACECDLUBCyABIARGBEBBjgEhAgzPAQsCQAJAIAEtAABBzgBrDgMACwELCyABQQFqIQFB9AAhAgy1AQsgAUEBaiEBQfUAIQIMtAELIAEgBEYEQEGNASECDM4BCyABLQAAQdkARw0IIAFBAWohAUEIDAcLQYwBIQIgASAERg3MASADKAIAIgAgBCABa2ohBSABIABrQQNqIQYCQANAIAEtAAAgAEHs0gBqLQAARw0GIABBA0YNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzNAQsgA0EANgIAIAZBAWohAUEFDAYLQYsBIQIgASAERg3LASADKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEHm0gBqLQAARw0FIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzMAQsgA0EANgIAIAZBAWohAUEWDAULQYoBIQIgASAERg3KASADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEHh0wBqLQAARw0EIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzLAQsgA0EANgIAIAZBAWohAUEQDAQLIAEgBEYEQEGJASECDMoBCwJAAkAgAS0AAEHDAGsODAAGBgYGBgYGBgYGAQYLIAFBAWohAUHvACECDLABCyABQQFqIQFB8AAhAgyvAQtBiAEhAiABIARGDcgBIAMoAgAiACAEIAFraiEFIAEgAGtBBWohBgJAA0AgAS0AACAAQeDSAGotAABHDQIgAEEFRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADMkBCyADQQA2AgAgBkEBaiEBQSQMAgsgA0EANgIADAILIAEgBEYEQEGHASECDMcBCyABLQAAQcwARw0BIAFBAWohAUETCzoAKSADKAIEIQAgA0EANgIEIAMgACABEC0iAA0CDAELQQAhAiADQQA2AhwgAyABNgIUIANB6R42AhAgA0EGNgIMDMQBC0HuACECDKkBCyADQYYBNgIcIAMgATYCFCADIAA2AgxBACECDMIBC0EAIQACQCADKAI4IgJFDQAgAigCOCICRQ0AIAMgAhEAACEACyAARQ0AIABBFUYNASADQQA2AhwgAyABNgIUIANB1A42AhAgA0EgNgIMQQAhAgzBAQtB7QAhAgymAQsgA0GFATYCHCADIAE2AhQgA0HXGjYCECADQRU2AgxBACECDL8BCyABIARGBEBBhQEhAgy/AQsCQCABLQAAQSBGBEAgAUEBaiEBDAELIANBADYCHCADIAE2AhQgA0GGHjYCECADQQY2AgxBACECDL8BC0ECIQIMpAELA0AgAS0AAEEgRw0CIAQgAUEBaiIBRw0AC0GEASECDL0BCyABIARGBEBBgwEhAgy9AQsCQCABLQAAQQlrDgRAAABAAAtB6wAhAgyiAQsgAy0AKUEFRgRAQewAIQIMogELQeoAIQIMoQELIAEgBEYEQEGCASECDLsBCyADQQ82AgggAyABNgIEDAoLIAEgBEYEQEGBASECDLoBCwJAIAEtAABBCWsOBD0AAD0AC0HpACECDJ8BCyABIARHBEAgA0EPNgIIIAMgATYCBEHnACECDJ8BC0GAASECDLgBCwJAIAEgBEcEQANAIAEtAABB4M4Aai0AACIAQQNHBEACQCAAQQFrDgI/AAQLQeYAIQIMoQELIAQgAUEBaiIBRw0AC0H+ACECDLkBC0H+ACECDLgBCyADQQA2AhwgAyABNgIUIANBxh82AhAgA0EHNgIMQQAhAgy3AQsgASAERgRAQf8AIQIMtwELAkACQAJAIAEtAABB4NAAai0AAEEBaw4DPAIAAQtB6AAhAgyeAQsgA0EANgIcIAMgATYCFCADQYYSNgIQIANBBzYCDEEAIQIMtwELQeAAIQIMnAELIAEgBEcEQCABQQFqIQFB5QAhAgycAQtB/QAhAgy1AQsgBCABIgBGBEBB/AAhAgy1AQsgAC0AACIBQS9GBEAgAEEBaiEBQeQAIQIMmwELIAFBCWsiAkEXSw0BIAAhAUEBIAJ0QZuAgARxDTcMAQsgBCABIgBGBEBB+wAhAgy0AQsgAC0AAEEvRw0AIABBAWohAQwDC0EAIQIgA0EANgIcIAMgADYCFCADQcYfNgIQIANBBzYCDAyyAQsCQAJAAkACQAJAA0AgAS0AAEHgzABqLQAAIgBBBUcEQAJAAkAgAEEBaw4IPQUGBwgABAEIC0HhACECDJ8BCyABQQFqIQFB4wAhAgyeAQsgBCABQQFqIgFHDQALQfoAIQIMtgELIAFBAWoMFAsgAygCBCEAIANBADYCBCADIAAgARArIgBFDR4gA0HbADYCHCADIAE2AhQgAyAANgIMQQAhAgy0AQsgAygCBCEAIANBADYCBCADIAAgARArIgBFDR4gA0HdADYCHCADIAE2AhQgAyAANgIMQQAhAgyzAQsgAygCBCEAIANBADYCBCADIAAgARArIgBFDR4gA0HwADYCHCADIAE2AhQgAyAANgIMQQAhAgyyAQsgA0EANgIcIAMgATYCFCADQcsPNgIQIANBBzYCDEEAIQIMsQELIAEgBEYEQEH5ACECDLEBCwJAIAEtAABB4MwAai0AAEEBaw4INAQFBgAIAgMHCyABQQFqIQELQQMhAgyVAQsgAUEBagwNC0EAIQIgA0EANgIcIANBoxI2AhAgA0EHNgIMIAMgAUEBajYCFAytAQsgAygCBCEAIANBADYCBCADIAAgARArIgBFDRYgA0HbADYCHCADIAE2AhQgAyAANgIMQQAhAgysAQsgAygCBCEAIANBADYCBCADIAAgARArIgBFDRYgA0HdADYCHCADIAE2AhQgAyAANgIMQQAhAgyrAQsgAygCBCEAIANBADYCBCADIAAgARArIgBFDRYgA0HwADYCHCADIAE2AhQgAyAANgIMQQAhAgyqAQsgA0EANgIcIAMgATYCFCADQcsPNgIQIANBBzYCDEEAIQIMqQELQeIAIQIMjgELIAEgBEYEQEH4ACECDKgBCyABQQFqDAILIAEgBEYEQEH3ACECDKcBCyABQQFqDAELIAEgBEYNASABQQFqCyEBQQQhAgyKAQtB9gAhAgyjAQsDQCABLQAAQeDKAGotAAAiAEECRwRAIABBAUcEQEHfACECDIsBCwwnCyAEIAFBAWoiAUcNAAtB9QAhAgyiAQsgASAERgRAQfQAIQIMogELAkAgAS0AAEEJaw43JQMGJQQGBgYGBgYGBgYGBgYGBgYGBgYFBgYCBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAAYLIAFBAWoLIQFBBSECDIYBCyABQQFqDAYLIAMoAgQhACADQQA2AgQgAyAAIAEQKyIARQ0IIANB2wA2AhwgAyABNgIUIAMgADYCDEEAIQIMngELIAMoAgQhACADQQA2AgQgAyAAIAEQKyIARQ0IIANB3QA2AhwgAyABNgIUIAMgADYCDEEAIQIMnQELIAMoAgQhACADQQA2AgQgAyAAIAEQKyIARQ0IIANB8AA2AhwgAyABNgIUIAMgADYCDEEAIQIMnAELIANBADYCHCADIAE2AhQgA0G8EzYCECADQQc2AgxBACECDJsBCwJAAkACQAJAA0AgAS0AAEHgyABqLQAAIgBBBUcEQAJAIABBAWsOBiQDBAUGAAYLQd4AIQIMhgELIAQgAUEBaiIBRw0AC0HzACECDJ4BCyADKAIEIQAgA0EANgIEIAMgACABECsiAEUNByADQdsANgIcIAMgATYCFCADIAA2AgxBACECDJ0BCyADKAIEIQAgA0EANgIEIAMgACABECsiAEUNByADQd0ANgIcIAMgATYCFCADIAA2AgxBACECDJwBCyADKAIEIQAgA0EANgIEIAMgACABECsiAEUNByADQfAANgIcIAMgATYCFCADIAA2AgxBACECDJsBCyADQQA2AhwgAyABNgIUIANB3Ag2AhAgA0EHNgIMQQAhAgyaAQsgASAERg0BIAFBAWoLIQFBBiECDH4LQfIAIQIMlwELAkACQAJAAkADQCABLQAAQeDGAGotAAAiAEEFRwRAIABBAWsOBB8CAwQFCyAEIAFBAWoiAUcNAAtB8QAhAgyaAQsgAygCBCEAIANBADYCBCADIAAgARArIgBFDQMgA0HbADYCHCADIAE2AhQgAyAANgIMQQAhAgyZAQsgAygCBCEAIANBADYCBCADIAAgARArIgBFDQMgA0HdADYCHCADIAE2AhQgAyAANgIMQQAhAgyYAQsgAygCBCEAIANBADYCBCADIAAgARArIgBFDQMgA0HwADYCHCADIAE2AhQgAyAANgIMQQAhAgyXAQsgA0EANgIcIAMgATYCFCADQbQKNgIQIANBBzYCDEEAIQIMlgELQc4AIQIMewtB0AAhAgx6C0HdACECDHkLIAEgBEYEQEHwACECDJMBCwJAIAEtAABBCWsOBBYAABYACyABQQFqIQFB3AAhAgx4CyABIARGBEBB7wAhAgySAQsCQCABLQAAQQlrDgQVAAAVAAtBACEAAkAgAygCOCICRQ0AIAIoAjAiAkUNACADIAIRAAAhAAsgAEUEQEHTASECDHgLIABBFUcEQCADQQA2AhwgAyABNgIUIANBwQ02AhAgA0EaNgIMQQAhAgySAQsgA0HuADYCHCADIAE2AhQgA0HwGTYCECADQRU2AgxBACECDJEBC0HtACECIAEgBEYNkAEgAygCACIAIAQgAWtqIQUgASAAa0EDaiEGAkADQCABLQAAIABB18YAai0AAEcNBCAAQQNGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMkQELIANBADYCACAGQQFqIQEgAy0AKSIAQSNrQQtJDQQCQCAAQQZLDQBBASAAdEHKAHFFDQAMBQtBACECIANBADYCHCADIAE2AhQgA0HlCTYCECADQQg2AgwMkAELQewAIQIgASAERg2PASADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEHUxgBqLQAARw0DIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAyQAQsgA0EANgIAIAZBAWohASADLQApQSFGDQMgA0EANgIcIAMgATYCFCADQYkKNgIQIANBCDYCDEEAIQIMjwELQesAIQIgASAERg2OASADKAIAIgAgBCABa2ohBSABIABrQQNqIQYCQANAIAEtAAAgAEHQxgBqLQAARw0CIABBA0YNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAyPAQsgA0EANgIAIAZBAWohASADLQApIgBBI0kNAiAAQS5GDQIgA0EANgIcIAMgATYCFCADQcEJNgIQIANBCDYCDEEAIQIMjgELIANBADYCAAtBACECIANBADYCHCADIAE2AhQgA0GENzYCECADQQg2AgwMjAELQdgAIQIMcQsgASAERwRAIANBDTYCCCADIAE2AgRB1wAhAgxxC0HqACECDIoBCyABIARGBEBB6QAhAgyKAQsgAS0AAEEwayIAQf8BcUEKSQRAIAMgADoAKiABQQFqIQFB1gAhAgxwCyADKAIEIQAgA0EANgIEIAMgACABEC4iAEUNdCADQegANgIcIAMgATYCFCADIAA2AgxBACECDIkBCyABIARGBEBB5wAhAgyJAQsCQCABLQAAQS5GBEAgAUEBaiEBDAELIAMoAgQhACADQQA2AgQgAyAAIAEQLiIARQ11IANB5gA2AhwgAyABNgIUIAMgADYCDEEAIQIMiQELQdUAIQIMbgsgASAERgRAQeUAIQIMiAELQQAhAEEBIQVBASEHQQAhAgJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAIAEtAABBMGsOCgoJAAECAwQFBggLC0ECDAYLQQMMBQtBBAwEC0EFDAMLQQYMAgtBBwwBC0EICyECQQAhBUEAIQcMAgtBCSECQQEhAEEAIQVBACEHDAELQQAhBUEBIQILIAMgAjoAKyABQQFqIQECQAJAIAMtAC5BEHENAAJAAkACQCADLQAqDgMBAAIECyAHRQ0DDAILIAANAQwCCyAFRQ0BCyADKAIEIQAgA0EANgIEIAMgACABEC4iAEUNAiADQeIANgIcIAMgATYCFCADIAA2AgxBACECDIoBCyADKAIEIQAgA0EANgIEIAMgACABEC4iAEUNdyADQeMANgIcIAMgATYCFCADIAA2AgxBACECDIkBCyADKAIEIQAgA0EANgIEIAMgACABEC4iAEUNdSADQeQANgIcIAMgATYCFCADIAA2AgwMiAELQdMAIQIMbQsgAy0AKUEiRg2AAUHSACECDGwLQQAhAAJAIAMoAjgiAkUNACACKAI8IgJFDQAgAyACEQAAIQALIABFBEBB1AAhAgxsCyAAQRVHBEAgA0EANgIcIAMgATYCFCADQZwNNgIQIANBITYCDEEAIQIMhgELIANB4QA2AhwgAyABNgIUIANB1hk2AhAgA0EVNgIMQQAhAgyFAQsgASAERgRAQeAAIQIMhQELAkACQAJAAkACQCABLQAAQQprDgQBBAQABAsgAUEBaiEBDAELIAFBAWohASADQS9qLQAAQQFxRQ0BC0HRACECDGwLIANBADYCHCADIAE2AhQgA0GIETYCECADQQk2AgxBACECDIUBCyADQQA2AhwgAyABNgIUIANBiBE2AhAgA0EJNgIMQQAhAgyEAQsgASAERgRAQd8AIQIMhAELIAEtAABBCkYEQCABQQFqIQEMCQsgAy0ALkHAAHENCCADQQA2AhwgAyABNgIUIANBiBE2AhAgA0ECNgIMQQAhAgyDAQsgASAERgRAQd0AIQIMgwELIAEtAAAiAkENRgRAIAFBAWohAUHPACECDGkLIAEhACACQQlrDgQFAQEFAQsgBCABIgBGBEBB3AAhAgyCAQsgAC0AAEEKRw0AIABBAWoMAgtBACECIANBADYCHCADIAA2AhQgA0G1LDYCECADQQc2AgwMgAELIAEgBEYEQEHbACECDIABCwJAIAEtAABBCWsOBAMAAAMACyABQQFqCyEBQc0AIQIMZAsgASAERgRAQdoAIQIMfgsgAS0AAEEJaw4EAAEBAAELQQAhAiADQQA2AhwgA0HsETYCECADQQc2AgwgAyABQQFqNgIUDHwLIANBgBI7ASpBACEAAkAgAygCOCICRQ0AIAIoAjAiAkUNACADIAIRAAAhAAsgAEUNACAAQRVHDQEgA0HZADYCHCADIAE2AhQgA0HwGTYCECADQRU2AgxBACECDHsLQcwAIQIMYAsgA0EANgIcIAMgATYCFCADQcENNgIQIANBGjYCDEEAIQIMeQsgASAERgRAQdkAIQIMeQsgAS0AAEEgRw06IAFBAWohASADLQAuQQFxDTogA0EANgIcIAMgATYCFCADQa0bNgIQIANBHjYCDEEAIQIMeAsgASAERgRAQdgAIQIMeAsCQAJAAkACQAJAIAEtAAAiAEEKaw4EAgMD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AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABLQAAQTBrDjcVFAABAgMEBQYHFhYWFhYWFggJCgsMDRYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWDg8QERITFgtCAiEKDBQLQgMhCgwTC0IEIQoMEgtCBSEKDBELQgYhCgwQC0IHIQoMDwtCCCEKDA4LQgkhCgwNC0IKIQoMDAtCCyEKDAsLQgwhCgwKC0INIQoMCQtCDiEKDAgLQg8hCgwHC0IKIQoMBgtCCyEKDAULQgwhCgwEC0INIQoMAwtCDiEKDAILQg8hCgwBC0IBIQoLIAFBAWohASADKQMgIgtC//////////8PWARAIAMgC0IEhiAKhDcDIAwCC0EAIQIgA0EANgIcIAMgATYCFCADQa0JNgIQIANBDDYCDAwfC0ElIQIMBAtBJiECDAMLIAMgAToALCADQQA2AgAgB0EBaiEBQQwhAgwCCyADQQA2AgAgBkEBaiEBQQohAgwBCyABQQFqIQFBCCECDAALAAtBACECIANBADYCHCADIAE2AhQgA0HVEDYCECADQQk2AgwMGAtBACECIANBADYCHCADIAE2AhQgA0HXCjYCECADQQk2AgwMFwtBACECIANBADYCHCADIAE2AhQgA0G/EDYCECADQQk2AgwMFgtBACECIANBADYCHCADIAE2AhQgA0GkETYCECADQQk2AgwMFQtBACECIANBADYCHCADIAE2AhQgA0HVEDYCECADQQk2AgwMFAtBACECIANBADYCHCADIAE2AhQgA0HXCjYCECADQQk2AgwMEwtBACECIANBADYCHCADIAE2AhQgA0G/EDYCECADQQk2AgwMEgtBACECIANBADYCHCADIAE2AhQgA0GkETYCECADQQk2AgwMEQtBACECIANBADYCHCADIAE2AhQgA0G/FjYCECADQQ82AgwMEAtBACECIANBADYCHCADIAE2AhQgA0G/FjYCECADQQ82AgwMDwtBACECIANBADYCHCADIAE2AhQgA0HIEjYCECADQQs2AgwMDgtBACECIANBADYCHCADIAE2AhQgA0GVCTYCECADQQs2AgwMDQtBACECIANBADYCHCADIAE2AhQgA0HpDzYCECADQQo2AgwMDAtBACECIANBADYCHCADIAE2AhQgA0GDEDYCECADQQo2AgwMCwtBACECIANBADYCHCADIAE2AhQgA0GmHDYCECADQQI2AgwMCgtBACECIANBADYCHCADIAE2AhQgA0HFFTYCECADQQI2AgwMCQtBACECIANBADYCHCADIAE2AhQgA0H/FzYCECADQQI2AgwMCAtBACECIANBADYCHCADIAE2AhQgA0HKFzYCECADQQI2AgwMBwsgA0ECNgIcIAMgATYCFCADQZQdNgIQIANBFjYCDEEAIQIMBgtB3gAhAiABIARGDQUgCUEIaiEHIAMoAgAhBQJAAkAgASAERwRAIAVBxsYAaiEIIAQgBWogAWshBiAFQX9zQQpqIgUgAWohAANAIAEtAAAgCC0AAEcEQEECIQgMAwsgBUUEQEEAIQggACEBDAMLIAVBAWshBSAIQQFqIQggBCABQQFqIgFHDQALIAYhBSAEIQELIAdBATYCACADIAU2AgAMAQsgA0EANgIAIAcgCDYCAAsgByABNgIEIAkoAgwhACAJKAIIDgMBBQIACwALIANBADYCHCADQa0dNgIQIANBFzYCDCADIABBAWo2AhRBACECDAMLIANBADYCHCADIAA2AhQgA0HCHTYCECADQQk2AgxBACECDAILIAEgBEYEQEEoIQIMAgsgA0EJNgIIIAMgATYCBEEnIQIMAQsgASAERgRAQQEhAgwBCwNAAkACQAJAIAEtAABBCmsOBAABAQABCyABQQFqIQEMAQsgAUEBaiEBIAMtAC5BIHENAEEAIQIgA0EANgIcIAMgATYCFCADQYwgNgIQIANBBTYCDAwCC0EBIQIgASAERw0ACwsgCUEQaiQAIAJFBEAgAygCDCEADAELIAMgAjYCHEEAIQAgAygCBCIBRQ0AIAMgASAEIAMoAggRAQAiAUUNACADIAQ2AhQgAyABNgIMIAEhAAsgAAu+AgECfyAAQQA6AAAgAEHcAGoiAUEBa0EAOgAAIABBADoAAiAAQQA6AAEgAUEDa0EAOgAAIAFBAmtBADoAACAAQQA6AAMgAUEEa0EAOgAAQQAgAGtBA3EiASAAaiIAQQA2AgBB3AAgAWtBfHEiAiAAaiIBQQRrQQA2AgACQCACQQlJDQAgAEEANgIIIABBADYCBCABQQhrQQA2AgAgAUEMa0EANgIAIAJBGUkNACAAQQA2AhggAEEANgIUIABBADYC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YXR1cwBJbnZhbGlkIHJlc3BvbnNlIHN0YXR1cwBFeHBlY3RlZCBMRiBhZnRlciBoZWFkZXJzAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMAVXNlciBjYWxsYmFjayBlcnJvcgBgb25fcmVzZXRgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19oZWFkZXJgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2JlZ2luYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlYCBjYWxsYmFjayBlcnJvcgBgb25fc3RhdHVzX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdmVyc2lvbl9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3VybF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWVzc2FnZV9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX21ldGhvZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lYCBjYWxsYmFjayBlcnJvcgBVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNlcnZlcgBJbnZhbGlkIGhlYWRlciB2YWx1ZSBjaGFyAEludmFsaWQgaGVhZGVyIGZpZWxkIGNoYXIAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl92ZXJzaW9uAEludmFsaWQgbWlub3IgdmVyc2lvbgBJbnZhbGlkIG1ham9yIHZlcnNpb24ARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgdmVyc2lvbgBFeHBlY3RlZCBDUkxGIGFmdGVyIHZlcnNpb24ASW52YWxpZCBIVFRQIHZlcnNpb24ASW52YWxpZCBoZWFkZXIgdG9rZW4AU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl91cmwASW52YWxpZCBjaGFyYWN0ZXJzIGluIHVybABVbmV4cGVjdGVkIHN0YXJ0IGNoYXIgaW4gdXJsAERvdWJsZSBAIGluIHVybABFbXB0eSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXJhY3RlciBpbiBDb250ZW50LUxlbmd0aABUcmFuc2Zlci1FbmNvZGluZyBjYW4ndCBiZSBwcmVzZW50IHdpdGggQ29udGVudC1MZW5ndGgARHVwbGljYXRlIENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhciBpbiB1cmwgcGF0aABDb250ZW50LUxlbmd0aCBjYW4ndCBiZSBwcmVzZW50IHdpdGggVHJhbnNmZXItRW5jb2RpbmcATWlzc2luZyBleHBlY3RlZCBDUiBhZnRlciBjaHVuayBzaXplAEV4cGVjdGVkIExGIGFmdGVyIGNodW5rIHNpemUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgc2l6ZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2hlYWRlcl92YWx1ZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgaGVhZGVyIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgTEYgYWZ0ZXIgaGVhZGVyIHZhbHVlAEludmFsaWQgYFRyYW5zZmVyLUVuY29kaW5nYCBoZWFkZXIgdmFsdWUATWlzc2luZyBleHBlY3RlZCBDUiBhZnRlciBjaHVuayBleHRlbnNpb24gdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZSB2YWx1ZQBJbnZhbGlkIHF1b3RlZC1wYWlyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAFBhdXNlZCBieSBvbl9oZWFkZXJzX2NvbXBsZXRlAEludmFsaWQgRU9GIHN0YXRlAG9uX3Jlc2V0IHBhdXNlAG9uX2NodW5rX2hlYWRlciBwYXVzZQBvbl9tZXNzYWdlX2JlZ2luIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZSBwYXVzZQBvbl9zdGF0dXNfY29tcGxldGUgcGF1c2UAb25fdmVyc2lvbl9jb21wbGV0ZSBwYXVzZQBvbl91cmxfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlIHBhdXNlAG9uX21lc3NhZ2VfY29tcGxldGUgcGF1c2UAb25fbWV0aG9kX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fbmFtZSBwYXVzZQBVbmV4cGVjdGVkIHNwYWNlIGFmdGVyIHN0YXJ0IGxpbmUATWlzc2luZyBleHBlY3RlZCBDUiBhZnRlciByZXNwb25zZSBsaW5lAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX25hbWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBuYW1lAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgY2h1bmsgZXh0ZW5zaW9uIG5hbWUASW52YWxpZCBzdGF0dXMgY29kZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABNaXNzaW5nIGV4cGVjdGVkIENSIGFmdGVyIGNodW5rIGRhdGEARXhwZWN0ZWQgTEYgYWZ0ZXIgY2h1bmsgZGF0YQBVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AARGF0YSBhZnRlciBgQ29ubmVjdGlvbjogY2xvc2VgAFNXSVRDSF9QUk9YWQBVU0VfUFJPWFkATUtBQ1RJVklUWQBVTlBST0NFU1NBQkxFX0VOVElUWQBRVUVSWQBDT1BZAE1PVkVEX1BFUk1BTkVOVExZAFRPT19FQVJMWQBOT1RJRlkARkFJTEVEX0RFUEVOREVOQ1kAQkFEX0dBVEVXQVkAUExBWQBQVVQAQ0hFQ0tPVVQAR0FURVdBWV9USU1FT1VUAFJFUVVFU1RfVElNRU9VVABORVRXT1JLX0NPTk5FQ1RfVElNRU9VVABDT05ORUNUSU9OX1RJTUVPVVQATE9HSU5fVElNRU9VVABORVRXT1JLX1JFQURfVElNRU9VVABQT1NUAE1JU0RJUkVDVEVEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfTE9BRF9CQUxBTkNFRF9SRVFVRVNUAEJBRF9SRVFVRVNUAEhUVFBfUkVRVUVTVF9TRU5UX1RPX0hUVFBTX1BPUlQAUkVQT1JUAElNX0FfVEVBUE9UAFJFU0VUX0NPTlRFTlQATk9fQ09OVEVOVABQQVJUSUFMX0NPTlRFTlQASFBFX0lOVkFMSURfQ09OU1RBTlQASFBFX0NCX1JFU0VUAEdFVABIUEVfU1RSSUNUAENPTkZMSUNUAFRFTVBPUkFSWV9SRURJUkVDVABQRVJNQU5FTlRfUkVESVJFQ1QAQ09OTkVDVABNVUxUSV9TVEFUVVMASFBFX0lOVkFMSURfU1RBVFVTAFRPT19NQU5ZX1JFUVVFU1RTAEVBUkxZX0hJTlRTAFVOQVZBSUxBQkxFX0ZPUl9MRUdBTF9SRUFTT05TAE9QVElPTlMAU1dJVENISU5HX1BST1RPQ09MUwBWQVJJQU5UX0FMU09fTkVHT1RJQVRFUwBNVUxUSVBMRV9DSE9JQ0VTAElOVEVSTkFMX1NFUlZFUl9FUlJPUgBXRUJfU0VSVkVSX1VOS05PV05fRVJST1IAUkFJTEdVTl9FUlJPUgBJREVOVElUWV9QUk9WSURFUl9BVVRIRU5USUNBVElPTl9FUlJPUgBTU0xfQ0VSVElGSUNBVEVfRVJST1IASU5WQUxJRF9YX0ZPUldBUkRFRF9GT1IAU0VUX1BBUkFNRVRFUgBHRVRfUEFSQU1FVEVSAEhQRV9VU0VSAFNFRV9PVEhFUgBIUEVfQ0JfQ0hVTktfSEVBREVSAEV4cGVjdGVkIExGIGFmdGVyIENSAE1LQ0FMRU5EQVIAU0VUVVAAV0VCX1NFUlZFUl9JU19ET1dOAFRFQVJET1dOAEhQRV9DTE9TRURfQ09OTkVDVElPTgBIRVVSSVNUSUNfRVhQSVJBVElPTgBESVNDT05ORUNURURfT1BFUkFUSU9OAE5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OAEhQRV9JTlZBTElEX1ZFUlNJT04ASFBFX0NCX01FU1NBR0VfQkVHSU4AU0lURV9JU19GUk9aRU4ASFBFX0lOVkFMSURfSEVBREVSX1RPS0VOAElOVkFMSURfVE9LRU4ARk9SQklEREVOAEVOSEFOQ0VfWU9VUl9DQUxNAEhQRV9JTlZBTElEX1VSTABCTE9DS0VEX0JZX1BBUkVOVEFMX0NPTlRST0wATUtDT0wAQUNMAEhQRV9JTlRFUk5BTABSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFX1VOT0ZGSUNJQUwASFBFX09LAFVOTElOSwBVTkxPQ0sAUFJJAFJFVFJZX1dJVEgASFBFX0lOVkFMSURfQ09OVEVOVF9MRU5HVEgASFBFX1VORVhQRUNURURfQ09OVEVOVF9MRU5HVEgARkxVU0gAUFJPUFBBVENIAE0tU0VBUkNIAFVSSV9UT09fTE9ORwBQUk9DRVNTSU5HAE1JU0NFTExBTkVPVVNfUEVSU0lTVEVOVF9XQVJOSU5HAE1JU0NFTExBTkVPVVNfV0FSTklORwBIUEVfSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElORwBFeHBlY3RlZCBDUkxGAEhQRV9JTlZBTElEX0NIVU5LX1NJWkUATU9WRQBDT05USU5VRQBIUEVfQ0JfU1RBVFVTX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJTX0NPTVBMRVRFAEhQRV9DQl9WRVJTSU9OX0NPTVBMRVRFAEhQRV9DQl9VUkxfQ09NUExFVEUASFBFX0NCX0NIVU5LX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX05BTUVfQ09NUExFVEUASFBFX0NCX01FU1NBR0VfQ09NUExFVEUASFBFX0NCX01FVEhPRF9DT01QTEVURQBIUEVfQ0JfSEVBREVSX0ZJRUxEX0NPTVBMRVRFAERFTEVURQBIUEVfSU5WQUxJRF9FT0ZfU1RBVEUASU5WQUxJRF9TU0xfQ0VSVElGSUNBVEUAUEFVU0UATk9fUkVTUE9OU0UAVU5TVVBQT1JURURfTUVESUFfVFlQRQBHT05FAE5PVF9BQ0NFUFRBQkxFAFNFUlZJQ0VfVU5BVkFJTEFCTEUAUkFOR0VfTk9UX1NBVElTRklBQkxFAE9SSUdJTl9JU19VTlJFQUNIQUJMRQBSRVNQT05TRV9JU19TVEFMRQBQVVJHRQBNRVJHRQBSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFAFJFUVVFU1RfSEVBREVSX1RPT19MQVJHRQBQQVlMT0FEX1RPT19MQVJHRQBJTlNVRkZJQ0lFTlRfU1RPUkFHRQBIUEVfUEFVU0VEX1VQR1JBREUASFBFX1BBVVNFRF9IMl9VUEdSQURFAFNPVVJDRQBBTk5PVU5DRQBUUkFDRQBIUEVfVU5FWFBFQ1RFRF9TUEFDRQBERVNDUklCRQBVTlNVQlNDUklCRQBSRUNPUkQASFBFX0lOVkFMSURfTUVUSE9EAE5PVF9GT1VORABQUk9QRklORABVTkJJTkQAUkVCSU5EAFVOQVVUSE9SSVpFRABNRVRIT0RfTk9UX0FMTE9XRUQASFRUUF9WRVJTSU9OX05PVF9TVVBQT1JURUQAQUxSRUFEWV9SRVBPUlRFRABBQ0NFUFRFRABOT1RfSU1QTEVNRU5URUQATE9PUF9ERVRFQ1RFRABIUEVfQ1JfRVhQRUNURUQASFBFX0xGX0VYUEVDVEVEAENSRUFURUQASU1fVVNFRABIUEVfUEFVU0VEAFRJTUVPVVRfT0NDVVJFRABQQVlNRU5UX1JFUVVJUkVEAFBSRUNPTkRJVElPTl9SRVFVSVJFRABQUk9YWV9BVVRIRU5USUNBVElPTl9SRVFVSVJFRABORVRXT1JLX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAExFTkdUSF9SRVFVSVJFRABTU0xfQ0VSVElGSUNBVEVfUkVRVUlSRUQAVVBHUkFERV9SRVFVSVJFRABQQUdFX0VYUElSRUQAUFJFQ09ORElUSU9OX0ZBSUxFRABFWFBFQ1RBVElPTl9GQUlMRUQAUkVWQUxJREFUSU9OX0ZBSUxFRABTU0xfSEFORFNIQUtFX0ZBSUxFRABMT0NLRUQAVFJBTlNGT1JNQVRJT05fQVBQTElFRABOT1RfTU9ESUZJRUQATk9UX0VYVEVOREVEAEJBTkRXSURUSF9MSU1JVF9FWENFRURFRABTSVRFX0lTX09WRVJMT0FERUQASEVBRABFeHBlY3RlZCBIVFRQLwAAUhUAABoVAAAPEgAA5BkAAJEVAAAJFAAALRkAAOQUAADpEQAAaRQAAKEUAAB2FQAAQxYAAF4SAACUFwAAFxYAAH0UAAB/FgAAQRcAALMTAADDFgAABBoAAL0YAADQGAAAoBMAANQZAACvFgAAaBYAAHAXAADZFgAA/BgAAP4RAABZFwAAlxYAABwXAAD2FgAAjRcAAAsSAAB/GwAALhEAALMQAABJEgAArRIAAPYYAABoEAAAYhUAABAVAABaFgAAShkAALUVAADBFQAAYBUAAFwZAABaGQAAUxkAABYVAACtEQAAQhAAALcQAABXGAAAvxUAAIkQAAAcGQAAGhkAALkVAABRGAAA3BMAAFsVAABZFQAA5hgAAGcVAAARGQAA7RgAAOcTAACuEAAAwhcAAAAUAACSEwAAhBMAAEASAAAmGQAArxUAAGIQAEHpOQsBAQBBgDoL4AEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB6jsLBAEAAAIAQYE8C14DBAMDAwMDAAADAwADAwADAwMDAwMDAwMDAAUAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAwADAEHqPQsEAQAAAgBBgT4LXgMAAwMDAwMAAAMDAAMDAAMDAwMDAwMDAwMABAAFAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwADAAMAQeA/Cw1sb3NlZWVwLWFsaXZlAEH5PwsBAQBBkMAAC+ABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAQfnBAAsBAQBBkMIAC+cBAQEBAQEBAQEBAQEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFjaHVua2VkAEGhxAALXgEAAQEBAQEAAAEBAAEBAAEBAQEBAQEBAQEAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAEAQYDGAAshZWN0aW9uZW50LWxlbmd0aG9ucm94eS1jb25uZWN0aW9uAEGwxgALK3JhbnNmZXItZW5jb2RpbmdwZ3JhZGUNCg0KU00NCg0KVFRQL0NFL1RTUC8AQenGAAsFAQIAAQMAQYDHAAtfBAUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAQenIAAsFAQIAAQMAQYDJAAtfBAUFBgUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAQenKAAsEAQAAAQBBgcsAC14CAgACAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAEHpzAALBQECAAEDAEGAzQALXwQFAAAFBQUFBQUFBQUFBQYFBQUFBQUFBQUFBQUABQAHCAUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQAFAAUABQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAAAAFAEHpzgALBQEBAAEBAEGAzwALAQEAQZrPAAtBAgAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQenQAAsFAQEAAQEAQYDRAAsBAQBBitEACwYCAAAAAAIAQaHRAAs6AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBB4NIAC5oBTk9VTkNFRUNLT1VUTkVDVEVURUNSSUJFTFVTSEVURUFEU0VBUkNIUkdFQ1RJVklUWUxFTkRBUlZFT1RJRllQVElPTlNDSFNFQVlTVEFUQ0hHRVVFUllPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFSFRUUC9BRFRQLw=="; + var wasmBuffer; + Object.defineProperty(module2, "exports", { + get: /* @__PURE__ */ __name(() => { + return wasmBuffer ? wasmBuffer : wasmBuffer = Buffer2.from(wasmBase64, "base64"); + }, "get") + }); } }); @@ -2962,7 +3422,13 @@ var require_llhttp_simd_wasm = __commonJS({ "lib/llhttp/llhttp_simd-wasm.js"(exports2, module2) { "use strict"; var { Buffer: Buffer2 } = require("node:buffer"); - module2.exports = Buffer2.from("AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAX8AYAJ/fwBgBH9/f38Bf2AAAGADf39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQAEA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAAy0sBQYAAAIAAAAAAAACAQIAAgICAAADAAAAAAMDAwMBAQEBAQEBAQEAAAIAAAAEBQFwARISBQMBAAIGCAF/AUGA1AQLB9EFIgZtZW1vcnkCAAtfaW5pdGlhbGl6ZQAIGV9faW5kaXJlY3RfZnVuY3Rpb25fdGFibGUBAAtsbGh0dHBfaW5pdAAJGGxsaHR0cF9zaG91bGRfa2VlcF9hbGl2ZQAvDGxsaHR0cF9hbGxvYwALBm1hbGxvYwAxC2xsaHR0cF9mcmVlAAwEZnJlZQAMD2xsaHR0cF9nZXRfdHlwZQANFWxsaHR0cF9nZXRfaHR0cF9tYWpvcgAOFWxsaHR0cF9nZXRfaHR0cF9taW5vcgAPEWxsaHR0cF9nZXRfbWV0aG9kABAWbGxodHRwX2dldF9zdGF0dXNfY29kZQAREmxsaHR0cF9nZXRfdXBncmFkZQASDGxsaHR0cF9yZXNldAATDmxsaHR0cF9leGVjdXRlABQUbGxodHRwX3NldHRpbmdzX2luaXQAFQ1sbGh0dHBfZmluaXNoABYMbGxodHRwX3BhdXNlABcNbGxodHRwX3Jlc3VtZQAYG2xsaHR0cF9yZXN1bWVfYWZ0ZXJfdXBncmFkZQAZEGxsaHR0cF9nZXRfZXJybm8AGhdsbGh0dHBfZ2V0X2Vycm9yX3JlYXNvbgAbF2xsaHR0cF9zZXRfZXJyb3JfcmVhc29uABwUbGxodHRwX2dldF9lcnJvcl9wb3MAHRFsbGh0dHBfZXJybm9fbmFtZQAeEmxsaHR0cF9tZXRob2RfbmFtZQAfEmxsaHR0cF9zdGF0dXNfbmFtZQAgGmxsaHR0cF9zZXRfbGVu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PgtBhwEMPQtBiAEMPAtBiQEMOwtBigEMOgtBiwEMOQtBjAEMOAtBjQEMNwtBjgEMNgtBjwEMNQtBkAEMNAtBkQEMMwtBkgEMMgtBkwEMMQtBlAEMMAtBlQEMLwtBlgEMLgtBlwEMLQtBmAEMLAtBmQEMKwtBmgEMKgtBmwEMKQtBnAEMKAtBnQEMJwtBngEMJgtBnwEMJQtBoAEMJAtBoQEMIwtBogEMIgtBowEMIQtBpAEMIAtBpQEMHwtBpgEMHgtBpwEMHQtBqAEMHAtBqQEMGwtBqgEMGgtBqwEMGQtBrAEMGAtBrQEMFwtBrgEMFgtBAQwVC0GvAQwUC0GwAQwTC0GxAQwSC0GzAQwRC0GyAQwQC0G0AQwPC0G1AQwOC0G2AQwNC0G3AQwMC0G4AQwLC0G5AQwKC0G6AQwJC0G7AQwIC0HGAQwHC0G8AQwGC0G9AQwFC0G+AQwEC0G/AQwDC0HAAQwCC0HCAQwBC0HBAQshAwNAAkACQAJAAkACQAJAAkACQAJAIAICfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAgJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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iQEhAwykAgtBASABLQAAQd8ARw1nGiABQQFqIQEMXgtBigEhAyABIARGDaICIAIoAgAiACAEIAFraiEFIAEgAGtBAWohBgNAIAEtAAAgAEGMzwBqLQAARw1kIABBAUYN+gEgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAMogILQYsBIQMgASAERg2hAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGOzwBqLQAARw1kIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyiAgsgAkEANgIAIAZBAWohAUECDGULQYwBIQMgASAERg2gAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHwzwBqLQAARw1jIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyhAgsgAkEANgIAIAZBAWohAUEfDGQLQY0BIQMgASAERg2fAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHyzwBqLQAARw1iIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAygAgsgAkEANgIAIAZBAWohAUEJDGMLIAEgBEYEQEGOASEDDJ8CCwJAAkAgAS0AAEHJAGsOBwBiYmJiYgFiCyABQQFqIQFB+AAhAwyGAgsgAUEBaiEBQfkAIQMMhQILQY8BIQMgASAERg2dAiACKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEGRzwBqLQAARw1gIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyeAgsgAkEANgIAIAZBAWohAUEYDGELQZABIQMgASAERg2cAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEGXzwBqLQAARw1fIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAydAgsgAkEANgIAIAZBAWohAUEXDGALQZEBIQMgASAERg2bAiACKAIAIgAgBCABa2ohBSABIABrQQZqIQYCQANAIAEtAAAgAEGazwBqLQAARw1eIABBBkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAycAgsgAkEANgIAIAZBAWohAUEVDF8LQZIBIQMgASAERg2aAiACKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEGhzwBqLQAARw1dIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAybAgsgAkEANgIAIAZBAWohAUEeDF4LIAEgBEYEQEGTASEDDJoCCyABLQAAQcwARw1bIAFBAWohAUEKDF0LIAEgBEYEQEGUASEDDJkCCwJAAkAgAS0AAEHBAGsODwBcXFxcXFxcXFxcXFxcAVwLIAFBAWohAUH+ACEDDIACCyABQQFqIQFB/wAhAwz/AQsgASAERgRAQZUBIQMMmAILAkACQCABLQAAQcEAaw4DAFsBWwsgAUEBaiEBQf0AIQMM/wELIAFBAWohAUGAASEDDP4BC0GWASEDIAEgBEYNlgIgAigCACIAIAQgAWtqIQUgASAAa0EBaiEGAkADQCABLQAAIABBp88Aai0AAEcNWSAAQQFGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAMlwILIAJBADYCACAGQQFqIQFBCwxaCyABIARGBEBBlwEhAwyWAgsCQAJAAkACQCABLQAAQS1rDiMAW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1sBW1tbW1sCW1tbA1sLIAFBAWohAUH7ACEDDP8BCyABQQFqIQFB/AAhAwz+AQsgAUEBaiEBQYEBIQMM/QELIAFBAWohAUGCASEDDPwBC0GYASEDIAEgBEYNlAIgAigCACIAIAQgAWtqIQUgASAAa0EEaiEGAkADQCABLQAAIABBqc8Aai0AAEcNVyAAQQRGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAMlQILIAJBADYCACAGQQFqIQFBGQxYC0GZASEDIAEgBEYNkwIgAigCACIAIAQgAWtqIQUgASAAa0EFaiEGAkADQCABLQAAIABBrs8Aai0AAEcNViAAQQVGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAMlAILIAJBADYCACAGQQFqIQFBBgxXC0GaASEDIAEgBEYNkgIgAigCACIAIAQgAWtqIQUgASAAa0EBaiEGAkADQCABLQAAIABBtM8Aai0AAEcNVSAAQQFGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAMkwILIAJBADYCACAGQQFqIQFBHAxWC0GbASEDIAEgBEYNkQIgAigCACIAIAQgAWtqIQUgASAAa0EBaiEGAkADQCABLQAAIABBts8Aai0AAEcNVCAAQQFGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAMkgILIAJBADYCACAGQQFqIQFBJwxVCyABIARGBEBBnAEhAwyRAgsCQAJAIAEtAABB1ABrDgIAAVQLIAFBAWohAUGGASEDDPgBCyABQQFqIQFBhwEhAwz3AQtBnQEhAyABIARGDY8CIAIoAgAiACAEIAFraiEFIAEgAGtBAWohBgJAA0AgAS0AACAAQbjPAGotAABHDVIgAEEBRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAiAFNgIADJACCyACQQA2AgAgBkEBaiEBQSYMUwtBngEhAyABIARGDY4CIAIoAgAiACAEIAFraiEFIAEgAGtBAWohBgJAA0AgAS0AACAAQbrPAGotAABHDVEgAEEBRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAiAFNgIADI8CCyACQQA2AgAgBkEBaiEBQQMMUgtBnwEhAyABIARGDY0CIAIoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQe3PAGotAABHDVAgAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAiAFNgIADI4CCyACQQA2AgAgBkEBaiEBQQwMUQtBoAEhAyABIARGDYwCIAIoAgAiACAEIAFraiEFIAEgAGtBA2ohBgJAA0AgAS0AACAAQbzPAGotAABHDU8gAEEDRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAiAFNgIADI0CCyACQQA2AgAgBkEBaiEBQQ0MUAsgASAERgRAQaEBIQMMjAILAkACQCABLQAAQcYAaw4LAE9PT09PT09PTwFPCyABQQFqIQFBiwEhAwzzAQsgAUEBaiEBQYwBIQMM8gELIAEgBEYEQEGiASEDDIsCCyABLQAAQdAARw1MIAFBAWohAQxGCyABIARGBEBBowEhAwyKAgsCQAJAIAEtAABByQBrDgcBTU1NTU0ATQsgAUEBaiEBQY4BIQMM8QELIAFBAWohAUEiDE0LQaQBIQMgASAERg2IAiACKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEHAzwBqLQAARw1LIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyJAgsgAkEANgIAIAZBAWohAUEdDEwLIAEgBEYEQEGlASEDDIgCCwJAAkAgAS0AAEHSAGsOAwBLAUsLIAFBAWohAUGQASEDDO8BCyABQQFqIQFBBAxLCyABIARGBEBBpgEhAwyHAgsCQAJAAkACQAJAIAEtAABBwQBrDhUATU1NTU1NTU1NTQFNTQJNTQNNTQRNCyABQQFqIQFBiAEhAwzxAQsgAUEBaiEBQYkBIQMM8AELIAFBAWohAUGKASEDDO8BCyABQQFqIQFBjwEhAwzuAQsgAUEBaiEBQZEBIQMM7QELQacBIQMgASAERg2FAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEHtzwBqLQAARw1IIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyGAgsgAkEANgIAIAZBAWohAUERDEkLQagBIQMgASAERg2EAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEHCzwBqLQAARw1HIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyFAgsgAkEANgIAIAZBAWohAUEsDEgLQakBIQMgASAERg2DAiACKAIAIgAgBCABa2ohBSABIABrQQRqIQYCQANAIAEtAAAgAEHFzwBqLQAARw1GIABBBEYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyEAgsgAkEANgIAIAZBAWohAUErDEcLQaoBIQMgASAERg2CAiACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEHKzwBqLQAARw1FIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyDAgsgAkEANgIAIAZBAWohAUEUDEYLIAEgBEYEQEGrASEDDIICCwJAAkACQAJAIAEtAABBwgBrDg8AAQJHR0dHR0dHR0dHRwNHCyABQQFqIQFBkwEhAwzrAQsgAUEBaiEBQZQBIQMM6gELIAFBAWohAUGVASEDDOkBCyABQQFqIQFBlgEhAwzoAQsgASAERgRAQawBIQMMgQILIAEtAABBxQBHDUIgAUEBaiEBDD0LQa0BIQMgASAERg3/ASACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEHNzwBqLQAARw1CIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAyAAgsgAkEANgIAIAZBAWohAUEODEMLIAEgBEYEQEGuASEDDP8BCyABLQAAQdAARw1AIAFBAWohAUElDEILQa8BIQMgASAERg39ASACKAIAIgAgBCABa2ohBSABIABrQQhqIQYCQANAIAEtAAAgAEHQzwBqLQAARw1AIABBCEYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAz+AQsgAkEANgIAIAZBAWohAUEqDEELIAEgBEYEQEGwASEDDP0BCwJAAkAgAS0AAEHVAGsOCwBAQEBAQEBAQEABQAsgAUEBaiEBQZoBIQMM5AELIAFBAWohAUGbASEDDOMBCyABIARGBEBBsQEhAwz8AQsCQAJAIAEtAABBwQBrDhQAPz8/Pz8/Pz8/Pz8/Pz8/Pz8/AT8LIAFBAWohAUGZASEDDOMBCyABQQFqIQFBnAEhAwziAQtBsgEhAyABIARGDfoBIAIoAgAiACAEIAFraiEFIAEgAGtBA2ohBgJAA0AgAS0AACAAQdnPAGotAABHDT0gAEEDRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAiAFNgIADPsBCyACQQA2AgAgBkEBaiEBQSEMPgtBswEhAyABIARGDfkBIAIoAgAiACAEIAFraiEFIAEgAGtBBmohBgJAA0AgAS0AACAAQd3PAGotAABHDTwgAEEGRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAiAFNgIADPoBCyACQQA2AgAgBkEBaiEBQRoMPQsgASAERgRAQbQBIQMM+QELAkACQAJAIAEtAABBxQBrDhEAPT09PT09PT09AT09PT09Aj0LIAFBAWohAUGdASEDDOEBCyABQQFqIQFBngEhAwzgAQsgAUEBaiEBQZ8BIQMM3wELQbUBIQMgASAERg33ASACKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEHkzwBqLQAARw06IABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAz4AQsgAkEANgIAIAZBAWohAUEoDDsLQbYBIQMgASAERg32ASACKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEHqzwBqLQAARw05IABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAIgBTYCAAz3AQsgAkEANgIAIAZBAWohAUEHDDoLIAEgBEYEQEG3ASEDDPYBCwJAAkAgAS0AAEHFAGsODgA5OTk5OTk5OTk5OTkBOQsgAUEBaiEBQaEBIQMM3QELIAFBAWohAUGiASEDDNwBC0G4ASEDIAEgBEYN9AEgAigCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABB7c8Aai0AAEcNNyAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAM9QELIAJBADYCACAGQQFqIQFBEgw4C0G5ASEDIAEgBEYN8wEgAigCACIAIAQgAWtqIQUgASAAa0EBaiEGAkADQCABLQAAIABB8M8Aai0AAEcNNiAAQQFGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAM9AELIAJBADYCACAGQQFqIQFBIAw3C0G6ASEDIAEgBEYN8gEgAigCACIAIAQgAWtqIQUgASAAa0EBaiEGAkADQCABLQAAIABB8s8Aai0AAEcNNSAAQQFGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAM8wELIAJBADYCACAGQQFqIQFBDww2CyABIARGBEBBuwEhAwzyAQsCQAJAIAEtAABByQBrDgcANTU1NTUBNQsgAUEBaiEBQaUBIQMM2QELIAFBAWohAUGmASEDDNgBC0G8ASEDIAEgBEYN8AEgAigCACIAIAQgAWtqIQUgASAAa0EHaiEGAkADQCABLQAAIABB9M8Aai0AAEcNMyAAQQdGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyACIAU2AgAM8QELIAJBADYCACAGQQFqIQFBGww0CyABIARGBEBBvQEhAwzwAQsCQAJAAkAgAS0AAEHCAGsOEgA0NDQ0NDQ0NDQBNDQ0NDQ0AjQLIAFBAWohAUGkASEDDNgBCyABQQFqIQFBpwEhAwzXAQsgAUEBaiEBQagBIQMM1gELIAEgBEYEQEG+ASEDDO8BCyABLQAAQc4ARw0wIAFBAWohAQwsCyABIARGBEBBvwEhAwzuAQsCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABLQAAQcEAaw4VAAECAz8EBQY/Pz8HCAkKCz8MDQ4PPwsgAUEBaiEBQegAIQMM4wELIAFBAWohAUHpACEDDOIBCyABQQFqIQFB7gAhAwzhAQsgAUEBaiEBQfIAIQMM4AELIAFBAWohAUHzACEDDN8BCyABQQFqIQFB9gAhAwzeAQsgAUEBaiEBQfcAIQMM3QELIAFBAWohAUH6ACEDDNwBCyABQQFqIQFBgwEhAwzbAQsgAUEBaiEBQYQBIQMM2gELIAFBAWohAUGFASEDDNkBCyABQQFqIQFBkgEhAwzYAQsgAUEBaiEBQZgBIQMM1wELIAFBAWohAUGgASEDDNYBCyABQQFqIQFBowEhAwzVAQsgAUEBaiEBQaoBIQMM1AELIAEgBEcEQCACQRA2AgggAiABNgIEQasBIQMM1AELQcABIQMM7AELQQAhAAJAIAIoAjgiA0UNACADKAI0IgNFDQAgAiADEQAAIQALIABFDV4gAEEVRw0HIAJB0QA2AhwgAiABNgIUIAJBsBc2AhAgAkEVNgIMQQAhAwzrAQsgAUEBaiABIARHDQgaQcIBIQMM6gELA0ACQCABLQAAQQprDgQIAAALAAsgBCABQQFqIgFHDQALQcMBIQMM6QELIAEgBEcEQCACQRE2AgggAiABNgIEQQEhAwzQAQtBxAEhAwzoAQsgASAERgRAQcUBIQMM6AELAkACQCABLQAAQQprDgQBKCgAKAsgAUEBagwJCyABQQFqDAULIAEgBEYEQEHGASEDDOcBCwJAAkAgAS0AAEEKaw4XAQsLAQsLCwsLCwsLCwsLCwsLCwsLCwALCyABQQFqIQELQbABIQMMzQELIAEgBEYEQEHIASEDDOYBCyABLQAAQSBHDQkgAkEAOwEyIAFBAWohAUGzASEDDMwBCwNAIAEhAAJAIAEgBEcEQCABLQAAQTBrQf8BcSIDQQpJDQEMJwtBxwEhAwzmAQsCQCACLwEyIgFBmTNLDQAgAiABQQpsIgU7ATIgBUH+/wNxIANB//8Dc0sNACAAQQFqIQEgAiADIAVqIgM7ATIgA0H//wNxQegHSQ0BCwtBACEDIAJBADYCHCACQcEJNgIQIAJBDTYCDCACIABBAWo2AhQM5AELIAJBADYCHCACIAE2AhQgAkHwDDYCECACQRs2AgxBACEDDOMBCyACKAIEIQAgAkEANgIEIAIgACABECYiAA0BIAFBAWoLIQFBrQEhAwzIAQsgAkHBATYCHCACIAA2AgwgAiABQQFqNgIUQQAhAwzgAQsgAigCBCEAIAJBADYCBCACIAAgARAmIgANASABQQFqCyEBQa4BIQMMxQELIAJBwgE2AhwgAiAANgIMIAIgAUEBajYCFEEAIQMM3QELIAJBADYCHCACIAE2AhQgAkGXCzYCECACQQ02AgxBACEDDNwBCyACQQA2AhwgAiABNgIUIAJB4xA2AhAgAkEJNgIMQQAhAwzbAQsgAkECOgAoDKwBC0EAIQMgAkEANgIcIAJBrws2AhAgAkECNgIMIAIgAUEBajYCFAzZAQtBAiEDDL8BC0ENIQMMvgELQSYhAwy9AQtBFSEDDLwBC0EWIQMMuwELQRghAwy6AQtBHCEDDLkBC0EdIQMMuAELQSAhAwy3AQtBISEDDLYBC0EjIQMMtQELQcYAIQMMtAELQS4hAwyzAQtBPSEDDLIBC0HLACEDDLEBC0HOACEDDLABC0HYACEDDK8BC0HZACEDDK4BC0HbACEDDK0BC0HxACEDDKwBC0H0ACEDDKsBC0GNASEDDKoBC0GXASEDDKkBC0GpASEDDKgBC0GvASEDDKcBC0GxASEDDKYBCyACQQA2AgALQQAhAyACQQA2AhwgAiABNgIUIAJB8Rs2AhAgAkEGNgIMDL0BCyACQQA2AgAgBkEBaiEBQSQLOgApIAIoAgQhACACQQA2AgQgAiAAIAEQJyIARQRAQeUAIQMMowELIAJB+QA2AhwgAiABNgIUIAIgADYCDEEAIQMMuwELIABBFUcEQCACQQA2AhwgAiABNgIUIAJBzA42AhAgAkEgNgIMQQAhAwy7AQsgAkH4ADYCHCACIAE2AhQgAkHKGDYCECACQRU2AgxBACEDDLoBCyACQQA2AhwgAiABNgIUIAJBjhs2AhAgAkEGNgIMQQAhAwy5AQsgAkEANgIcIAIgATYCFCACQf4RNgIQIAJBBzYCDEEAIQMMuAELIAJBADYCHCACIAE2AhQgAkGMHDYCECACQQc2AgxBACEDDLcBCyACQQA2AhwgAiABNgIUIAJBww82AhAgAkEHNgIMQQAhAwy2AQsgAkEANgIcIAIgATYCFCACQcMPNgIQIAJBBzYCDEEAIQMMtQELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0RIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMtAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0gIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMswELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0iIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMsgELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0OIAJB5QA2AhwgAiABNgIUIAIgADYCDEEAIQMMsQELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0dIAJB0wA2AhwgAiABNgIUIAIgADYCDEEAIQMMsAELIAIoAgQhACACQQA2AgQgAiAAIAEQJSIARQ0fIAJB0gA2AhwgAiABNgIUIAIgADYCDEEAIQMMrwELIABBP0cNASABQQFqCyEBQQUhAwyUAQtBACEDIAJBADYCHCACIAE2AhQgAkH9EjYCECACQQc2AgwMrAELIAJBADYCHCACIAE2AhQgAkHcCDYCECACQQc2AgxBACEDDKsBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNByACQeUANgIcIAIgATYCFCACIAA2AgxBACEDDKoBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNFiACQdMANgIcIAIgATYCFCACIAA2AgxBACEDDKkBCyACKAIEIQAgAkEANgIEIAIgACABECUiAEUNGCACQdIANgIcIAIgATYCFCACIAA2AgxBACEDDKgBCyACQQA2AhwgAiABNgIUIAJBxgo2AhAgAkEHNgIMQQAhAwynAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQMgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwymAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRIgAkHTADYCHCACIAE2AhQgAiAANgIMQQAhAwylAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDRQgAkHSADYCHCACIAE2AhQgAiAANgIMQQAhAwykAQsgAigCBCEAIAJBADYCBCACIAAgARAlIgBFDQAgAkHlADYCHCACIAE2AhQgAiAANgIMQQAhAwyjAQtB1QAhAwyJAQsgAEEVRwRAIAJBADYCHCACIAE2AhQgAkG5DTYCECACQRo2AgxB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AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABB5ABrDvQDY2IAAWFhYWFhYQIDBAVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhBgcICQoLDA0OD2FhYWFhEGFhYWFhYWFhYWFhEWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYRITFBUWFxgZGhthYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2YTc4OTphYWFhYWFhYTthYWE8YWFhYT0+P2FhYWFhYWFhQGFhQWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYUJDREVGR0hJSktMTU5PUFFSU2FhYWFhYWFhVFVWV1hZWlthXF1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFeYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhX2BhC0HhJw8LQaQhDwtByywPC0H+MQ8LQcAkDwtBqyQPC0GNKA8LQeImDwtBgDAPC0G5Lw8LQdckDwtB7x8PC0HhHw8LQfofDwtB8iAPC0GoLw8LQa4yDwtBiDAPC0HsJw8LQYIiDwtBjh0PC0HQLg8LQcojDwtBxTIPC0HfHA8LQdIcDwtBxCAPC0HXIA8LQaIfDwtB7S4PC0GrMA8LQdQlDwtBzC4PC0H6Lg8LQfwrDwtB0jAPC0HxHQ8LQbsgDwtB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AAADAEGUCAsFBAAAAAUAQaQICwkGAAAABwAAAAgAQdwIC4otSW52YWxpZCBjaGFyIGluIHVybCBxdWVyeQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2JvZHkAQ29udGVudC1MZW5ndGggb3ZlcmZsb3cAQ2h1bmsgc2l6ZSBvdmVyZmxvdwBSZXNwb25zZSBvdmVyZmxvdwBJbnZhbGlkIG1ldGhvZCBmb3IgSFRUUC94LnggcmVxdWVzdABJbnZhbGlkIG1ldGhvZCBmb3IgUlRTUC94LnggcmVxdWVzdABFeHBlY3RlZCBTT1VSQ0UgbWV0aG9kIGZvciBJQ0UveC54IHJlcXVlc3QASW52YWxpZCBjaGFyIGluIHVybCBmcmFnbWVudCBzdGFydABFeHBlY3RlZCBkb3QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9zdGF0dXMASW52YWxpZCByZXNwb25zZSBzdGF0dXMASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucwBVc2VyIGNhbGxiYWNrIGVycm9yAGBvbl9yZXNldGAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2hlYWRlcmAgY2FsbGJhY2sgZXJyb3IAYG9uX21lc3NhZ2VfYmVnaW5gIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fdmFsdWVgIGNhbGxiYWNrIGVycm9yAGBvbl9zdGF0dXNfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl92ZXJzaW9uX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdXJsX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAEVtcHR5IENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhcmFjdGVyIGluIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBNaXNzaW5nIGV4cGVjdGVkIExGIGFmdGVyIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AgaGVhZGVyIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGUgdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZWQgdmFsdWUAUGF1c2VkIGJ5IG9uX2hlYWRlcnNfY29tcGxldGUASW52YWxpZCBFT0Ygc3RhdGUAb25fcmVzZXQgcGF1c2UAb25fY2h1bmtfaGVhZGVyIHBhdXNlAG9uX21lc3NhZ2VfYmVnaW4gcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlIHBhdXNlAG9uX3N0YXR1c19jb21wbGV0ZSBwYXVzZQBvbl92ZXJzaW9uX2NvbXBsZXRlIHBhdXNlAG9uX3VybF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGUgcGF1c2UAb25fbWVzc2FnZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXRob2RfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lIHBhdXNlAFVuZXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgc3RhcnQgbGluZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgbmFtZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AAU1dJVENIX1BST1hZAFVTRV9QUk9YWQBNS0FDVElWSVRZAFVOUFJPQ0VTU0FCTEVfRU5USVRZAENPUFkATU9WRURfUEVSTUFORU5UTFkAVE9PX0VBUkxZAE5PVElGWQBGQUlMRURfREVQRU5ERU5DWQBCQURfR0FURVdBWQBQTEFZAFBVVABDSEVDS09VVABHQVRFV0FZX1RJTUVPVVQAUkVRVUVTVF9USU1FT1VUAE5FVFdPUktfQ09OTkVDVF9USU1FT1VUAENPTk5FQ1RJT05fVElNRU9VVABMT0dJTl9USU1FT1VUAE5FVFdPUktfUkVBRF9USU1FT1VUAFBPU1QATUlTRElSRUNURURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9MT0FEX0JBTEFOQ0VEX1JFUVVFU1QAQkFEX1JFUVVFU1QASFRUUF9SRVFVRVNUX1NFTlRfVE9fSFRUUFNfUE9SVABSRVBPUlQASU1fQV9URUFQT1QAUkVTRVRfQ09OVEVOVABOT19DT05URU5UAFBBUlRJQUxfQ09OVEVOVABIUEVfSU5WQUxJRF9DT05TVEFOVABIUEVfQ0JfUkVTRVQAR0VUAEhQRV9TVFJJQ1QAQ09ORkxJQ1QAVEVNUE9SQVJZX1JFRElSRUNUAFBFUk1BTkVOVF9SRURJUkVDVABDT05ORUNUAE1VTFRJX1NUQVRVUwBIUEVfSU5WQUxJRF9TVEFUVVMAVE9PX01BTllfUkVRVUVTVFMARUFSTFlfSElOVFMAVU5BVkFJTEFCTEVfRk9SX0xFR0FMX1JFQVNPTlMAT1BUSU9OUwBTV0lUQ0hJTkdfUFJPVE9DT0xTAFZBUklBTlRfQUxTT19ORUdPVElBVEVTAE1VTFRJUExFX0NIT0lDRVMASU5URVJOQUxfU0VSVkVSX0VSUk9SAFdFQl9TRVJWRVJfVU5LTk9XTl9FUlJPUgBSQUlMR1VOX0VSUk9SAElERU5USVRZX1BST1ZJREVSX0FVVEhFTlRJQ0FUSU9OX0VSUk9SAFNTTF9DRVJUSUZJQ0FURV9FUlJPUgBJTlZBTElEX1hfRk9SV0FSREVEX0ZPUgBTRVRfUEFSQU1FVEVSAEdFVF9QQVJBTUVURVIASFBFX1VTRVIAU0VFX09USEVSAEhQRV9DQl9DSFVOS19IRUFERVIATUtDQUxFTkRBUgBTRVRVUABXRUJfU0VSVkVSX0lTX0RPV04AVEVBUkRPV04ASFBFX0NMT1NFRF9DT05ORUNUSU9OAEhFVVJJU1RJQ19FWFBJUkFUSU9OAERJU0NPTk5FQ1RFRF9PUEVSQVRJT04ATk9OX0FVVEhPUklUQVRJVkVfSU5GT1JNQVRJT04ASFBFX0lOVkFMSURfVkVSU0lPTgBIUEVfQ0JfTUVTU0FHRV9CRUdJTgBTSVRFX0lTX0ZST1pFTgBIUEVfSU5WQUxJRF9IRUFERVJfVE9LRU4ASU5WQUxJRF9UT0tFTgBGT1JCSURERU4ARU5IQU5DRV9ZT1VSX0NBTE0ASFBFX0lOVkFMSURfVVJMAEJMT0NLRURfQllfUEFSRU5UQUxfQ09OVFJPTABNS0NPTABBQ0wASFBFX0lOVEVSTkFMAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0VfVU5PRkZJQ0lBTABIUEVfT0sAVU5MSU5LAFVOTE9DSwBQUkkAUkVUUllfV0lUSABIUEVfSU5WQUxJRF9DT05URU5UX0xFTkdUSABIUEVfVU5FWFBFQ1RFRF9DT05URU5UX0xFTkdUSABGTFVTSABQUk9QUEFUQ0gATS1TRUFSQ0gAVVJJX1RPT19MT05HAFBST0NFU1NJTkcATUlTQ0VMTEFORU9VU19QRVJTSVNURU5UX1dBUk5JTkcATUlTQ0VMTEFORU9VU19XQVJOSU5HAEhQRV9JTlZBTElEX1RSQU5TRkVSX0VOQ09ESU5HAEV4cGVjdGVkIENSTEYASFBFX0lOVkFMSURfQ0hVTktfU0laRQBNT1ZFAENPTlRJTlVFAEhQRV9DQl9TVEFUVVNfQ09NUExFVEUASFBFX0NCX0hFQURFUlNfQ09NUExFVEUASFBFX0NCX1ZFUlNJT05fQ09NUExFVEUASFBFX0NCX1VSTF9DT01QTEVURQBIUEVfQ0JfQ0hVTktfQ09NUExFVEUASFBFX0NCX0hFQURFUl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fTkFNRV9DT01QTEVURQBIUEVfQ0JfTUVTU0FHRV9DT01QTEVURQBIUEVfQ0JfTUVUSE9EX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfRklFTERfQ09NUExFVEUAREVMRVRFAEhQRV9JTlZBTElEX0VPRl9TVEFURQBJTlZBTElEX1NTTF9DRVJUSUZJQ0FURQBQQVVTRQBOT19SRVNQT05TRQBVTlNVUFBPUlRFRF9NRURJQV9UWVBFAEdPTkUATk9UX0FDQ0VQVEFCTEUAU0VSVklDRV9VTkFWQUlMQUJMRQBSQU5HRV9OT1RfU0FUSVNGSUFCTEUAT1JJR0lOX0lTX1VOUkVBQ0hBQkxFAFJFU1BPTlNFX0lTX1NUQUxFAFBVUkdFAE1FUkdFAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0UAUkVRVUVTVF9IRUFERVJfVE9PX0xBUkdFAFBBWUxPQURfVE9PX0xBUkdFAElOU1VGRklDSUVOVF9TVE9SQUdFAEhQRV9QQVVTRURfVVBHUkFERQBIUEVfUEFVU0VEX0gyX1VQR1JBREUAU09VUkNFAEFOTk9VTkNFAFRSQUNFAEhQRV9VTkVYUEVDVEVEX1NQQUNFAERFU0NSSUJFAFVOU1VCU0NSSUJFAFJFQ09SRABIUEVfSU5WQUxJRF9NRVRIT0QATk9UX0ZPVU5EAFBST1BGSU5EAFVOQklORABSRUJJTkQAVU5BVVRIT1JJWkVEAE1FVEhPRF9OT1RfQUxMT1dFRABIVFRQX1ZFUlNJT05fTk9UX1NVUFBPUlRFRABBTFJFQURZX1JFUE9SVEVEAEFDQ0VQVEVEAE5PVF9JTVBMRU1FTlRFRABMT09QX0RFVEVDVEVEAEhQRV9DUl9FWFBFQ1RFRABIUEVfTEZfRVhQRUNURUQAQ1JFQVRFRABJTV9VU0VEAEhQRV9QQVVTRUQAVElNRU9VVF9PQ0NVUkVEAFBBWU1FTlRfUkVRVUlSRUQAUFJFQ09ORElUSU9OX1JFUVVJUkVEAFBST1hZX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAE5FVFdPUktfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATEVOR1RIX1JFUVVJUkVEAFNTTF9DRVJUSUZJQ0FURV9SRVFVSVJFRABVUEdSQURFX1JFUVVJUkVEAFBBR0VfRVhQSVJFRABQUkVDT05ESVRJT05fRkFJTEVEAEVYUEVDVEFUSU9OX0ZBSUxFRABSRVZBTElEQVRJT05fRkFJTEVEAFNTTF9IQU5EU0hBS0VfRkFJTEVEAExPQ0tFRABUUkFOU0ZPUk1BVElPTl9BUFBMSUVEAE5PVF9NT0RJRklFRABOT1RfRVhURU5ERUQAQkFORFdJRFRIX0xJTUlUX0VYQ0VFREVEAFNJVEVfSVNfT1ZFUkxPQURFRABIRUFEAEV4cGVjdGVkIEhUVFAvAABeEwAAJhMAADAQAADwFwAAnRMAABUSAAA5FwAA8BIAAAoQAAB1EgAArRIAAIITAABPFAAAfxAAAKAVAAAjFAAAiRIAAIsUAABNFQAA1BEAAM8UAAAQGAAAyRYAANwWAADBEQAA4BcAALsUAAB0FAAAfBUAAOUUAAAIFwAAHxAAAGUVAACjFAAAKBUAAAIVAACZFQAALBAAAIsZAABPDwAA1A4AAGoQAADOEAAAAhcAAIkOAABuEwAAHBMAAGYUAABWFwAAwRMAAM0TAABsEwAAaBcAAGYXAABfFwAAIhMAAM4PAABpDgAA2A4AAGMWAADLEwAAqg4AACgXAAAmFwAAxRMAAF0WAADoEQAAZxMAAGUTAADyFgAAcxMAAB0XAAD5FgAA8xEAAM8OAADOFQAADBIAALMRAAClEQAAYRAAADIXAAC7EwBB+TULAQEAQZA2C+ABAQECAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAQf03CwEBAEGROAteAgMCAgICAgAAAgIAAgIAAgICAgICAgICAgAEAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAIAAgBB/TkLAQEAQZE6C14CAAICAgICAAACAgACAgACAgICAgICAgICAAMABAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgACAEHwOwsNbG9zZWVlcC1hbGl2ZQBBiTwLAQEAQaA8C+ABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAQYk+CwEBAEGgPgvnAQEBAQEBAQEBAQEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBY2h1bmtlZABBsMAAC18BAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQBBkMIACyFlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AQcDCAAstcmFuc2Zlci1lbmNvZGluZ3BncmFkZQ0KDQoNClNNDQoNClRUUC9DRS9UU1AvAEH5wgALBQECAAEDAEGQwwAL4AEEAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB+cQACwUBAgABAwBBkMUAC+ABBAEBBQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAQfnGAAsEAQAAAQBBkccAC98BAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQBB+sgACwQBAAACAEGQyQALXwMEAAAEBAQEBAQEBAQEBAUEBAQEBAQEBAQEBAQABAAGBwQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEAEH6ygALBAEAAAEAQZDLAAsBAQBBqssAC0ECAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBB+swACwQBAAABAEGQzQALAQEAQZrNAAsGAgAAAAACAEGxzQALOgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQfDOAAuWAU5PVU5DRUVDS09VVE5FQ1RFVEVDUklCRUxVU0hFVEVBRFNFQVJDSFJHRUNUSVZJVFlMRU5EQVJWRU9USUZZUFRJT05TQ0hTRUFZU1RBVENIR0VPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFSFRUUC9BRFRQLw==", "base64"); + var wasmBase64 = "AGFzbQEAAAABJwdgAX8Bf2ADf39/AX9gAn9/AGABfwBgBH9/f38Bf2AAAGADf39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQAEA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAAzQzBQYAAAMAAAAAAAADAQMAAwMDAAACAAAAAAICAgICAgICAgIBAQEBAQEBAQEDAAADAAAABAUBcAESEgUDAQACBggBfwFBgNgECwfFBygGbWVtb3J5AgALX2luaXRpYWxpemUACBlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALbGxodHRwX2luaXQACRhsbGh0dHBfc2hvdWxkX2tlZXBfYWxpdmUANgxsbGh0dHBfYWxsb2MACwZtYWxsb2MAOAtsbGh0dHBfZnJlZQAMBGZyZWUADA9sbGh0dHBfZ2V0X3R5cGUADRVsbGh0dHBfZ2V0X2h0dHBfbWFqb3IADhVsbGh0dHBfZ2V0X2h0dHBfbWlub3IADxFsbGh0dHBfZ2V0X21ldGhvZAAQFmxsaHR0cF9nZXRfc3RhdHVzX2NvZGUAERJsbGh0dHBfZ2V0X3VwZ3JhZGUAEgxsbGh0dHBfcmVzZXQAEw5sbGh0dHBfZXhlY3V0ZQAUFGxsaHR0cF9zZXR0aW5nc19pbml0ABUNbGxodHRwX2ZpbmlzaAAWDGxsaHR0cF9wYXVzZQAXDWxsaHR0cF9yZXN1bWUAGBtsbGh0dHBfcmVzdW1lX2FmdGVyX3VwZ3JhZGUAGRBsbGh0dHBfZ2V0X2Vycm5vABoXbGxodHRwX2dldF9lcnJvcl9yZWFzb24AGxdsbGh0dHBfc2V0X2Vycm9yX3JlYXNvbgAcFGxsaHR0cF9nZXRfZXJyb3JfcG9zAB0RbGxodHRwX2Vycm5vX25hbWUAHhJsbGh0dHBfbWV0aG9kX25hbWUAHxJsbGh0dHBfc3RhdHVzX25hbWUAIBpsbGh0dHBf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a0E+aiECCyABIAI2AhwgAUIANwIQIAJBAnRBsNYAaiEAAkBBhNQAKAIAIgNBASACdCIHcUUEQCAAIAE2AgBBhNQAIAMgB3I2AgAgASAANgIYIAEgATYCCCABIAE2AgwMAQsgBEEZIAJBAXZrQQAgAkEfRxt0IQIgACgCACEAAkADQCAAIgMoAgRBeHEgBEYNASACQR12IQAgAkEBdCECIAMgAEEEcWpBEGoiBygCACIADQALIAcgATYCACABIAM2AhggASABNgIMIAEgATYCCAwBCyADKAIIIgAgATYCDCADIAE2AgggAUEANgIYIAEgAzYCDCABIAA2AggLQaDUAEGg1AAoAgBBAWsiAEF/IAAbNgIACwsHACAALQAoCwcAIAAtACoLBwAgAC0AKwsHACAALQApCwcAIAAvATQLBwAgAC0AMAtAAQR/IAAoAhghASAALwEuIQIgAC0AKCEDIAAoAjghBCAAEDcgACAENgI4IAAgAzoAKCAAIAI7AS4gACABNgIYC8X4AQIHfwN+IAEgAmohBAJAIAAiAygCDCIADQAgAygCBARAIAMgATYCBAsjAEEQayIJJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAMCfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAn8CQAJAAkACQAJAAkACQAJ/AkACQAJAAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAMCfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCACDtQBAAECAwQFBgcICQoLDA0ODxARFBUWFxgZGhscHR4fICEjJCUnKCmIA4cDhQOEA/wC9QLuAusC6ALmAuMC4ALfAt0C2wLWAtUC1ALTAtICygLJAsgCxwLGAsUCxALDAr0CvAK6ArkCuAK3ArYCtQK0ArICsQKsAqoCqAKnAqYCpQKkAqMCogKhAqACnwKbApoCmQKYApcCkAKIAoQCgwKCAvkB9gH1AfQB8wHyAfEB8AHvAe0B6wHoAeMB4QHgAd8B3gHdAdwB2wHaAdkB2AHX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QEBAQEBAQEBAQEBAAEALQQAhAiADQQA2AhwgA0G3CzYCECADQQI2AgwgAyABQQFqNgIUDIEDCyADQS9qIQIDQCABIARGBEBBISECDIIDCwJAAkACQCABLQAAIgBBCWsOGAIAKioBKioqKioqKioqKioqKioqKioqAigLIAFBAWohASADQS9qLQAAQQFxRQ0LDBkLIAFBAWohAQwYCyABQQFqIQEgAi0AAEECcQ0AC0EAIQIgA0EANgIcIAMgATYCFCADQc4UNgIQIANBDDYCDAyAAwsgAUEBaiEBC0EAIQACQCADKAI4IgJFDQAgAigCVCICRQ0AIAMgAhEAACEACyAADQEM0QILIANCADcDIAw8CyAAQRVGBEAgA0EkNgIcIAMgATYCFCADQYYaNgIQIANBFTYCDEEAIQIM/QILQQAhAiADQQA2AhwgAyABNgIUIANB4g02AhAgA0EUNgIMDPwCCyADKAIEIQBBACECIANBADYCBCADIAAgASAMp2oiARAxIgBFDSsgA0EHNgIcIAMgATYCFCADIAA2AgwM+wILIAMtAC5BwABxRQ0BC0EAIQACQCADKAI4IgJFDQAgAigCUCICRQ0AIAMgAhEAACEACyAARQ0rIABBFUYEQCADQQo2AhwgAyABNgIUIANB8Rg2AhAgA0EVNgIMQQAhAgz6AgtBACECIANBADYCHCADIAE2AhQgA0GLDDYCECADQRM2AgwM+QILQQAhAiADQQA2AhwgAyABNgIUIANBsRQ2AhAgA0ECNgIMDPgCC0EAIQIgA0EANgIcIAMgATYCFCADQYwUNgIQIANBGTYCDAz3AgtBACECIANBADYCHCADIAE2AhQgA0HRHDYCECADQRk2AgwM9gILIABBFUYNPUEAIQIgA0EANgIcIAMgATYCFCADQaIPNgIQIANBIjYCDAz1AgsgAygCBCEAQQAhAiADQQA2AgQgAyAAIAEQMiIARQ0oIANBDTYCHCADIAE2AhQgAyAANgIMDPQCCyAAQRVGDTpBACECIANBADYCHCADIAE2AhQgA0GiDzYCECADQSI2AgwM8wILIAMoAgQhAEEAIQIgA0EANgIEIAMgACABEDIiAEUEQCABQQFqIQEMKAsgA0EONgIcIAMgADYCDCADIAFBAWo2AhQM8gILIABBFUYNN0EAIQIgA0EANgIcIAMgATYCFCADQaIPNgIQIANBIjYCDAzxAgsgAygCBCEAQQAhAiADQQA2AgQgAyAAIAEQMiIARQRAIAFBAWohAQwnCyADQQ82AhwgAyAANgIMIAMgAUEBajYCFAzwAgtBACECIANBADYCHCADIAE2AhQgA0HoFjYCECADQRk2AgwM7wILIABBFUYNM0EAIQIgA0EANgIcIAMgATYCFCADQc4MNgIQIANBIzYCDAzuAgsgAygCBCEAQQAhAiADQQA2AgQgAyAAIAEQMyIARQ0lIANBETYCHCADIAE2AhQgAyAANgIMDO0CCyAAQRVGDTBBACECIANBADYCHCADIAE2AhQgA0HODDYCECADQSM2AgwM7AILIAMoAgQhAEEAIQIgA0EANgIEIAMgACABEDMiAEUEQCABQQFqIQEMJQsgA0ESNgIcIAMgADYCDCADIAFBAWo2AhQM6wILIANBL2otAABBAXFFDQELQRUhAgzPAgtBACECIANBADYCHCADIAE2AhQgA0HoFjYCECADQRk2AgwM6AILIABBO0cNACABQQFqIQEMDAtBACECIANBADYCHCADIAE2AhQgA0GYFzYCECADQQI2AgwM5gILIABBFUYNKEEAIQIgA0EANgIcIAMgATYCFCADQc4MNgIQIANBIzYCDAzlAgsgA0EUNgIcIAMgATYCFCADIAA2AgwM5AILIAMoAgQhAEEAIQIgA0EANgIEIAMgACABEDMiAEUEQCABQQFqIQEM3AILIANBFTYCHCADIAA2AgwgAyABQQFqNgIUDOMCCyADKAIEIQBBACECIANBADYCBCADIAAgARAzIgBFBEAgAUEBaiEBDNoCCyADQRc2AhwgAyAANgIMIAMgAUEBajYCFAziAgsgAEEVRg0jQQAhAiADQQA2AhwgAyABNgIUIANBzgw2AhAgA0EjNgIMDOECCyADKAIEIQBBACECIANBADYCBCADIAAgARAzIgBFBEAgAUEBaiEBDB0LIANBGTYCHCADIAA2AgwgAyABQQFqNgIUDOACCyADKAIEIQBBACECIANBADYCBCADIAAgARAzIgBFBEAgAUEBaiEBDNYCCyADQRo2AhwgAyAANgIMIAMgAUEBajYCFAzfAgsgAEEVRg0fQQAhAiADQQA2AhwgAyABNgIUIANBog82AhAgA0EiNgIMDN4CCyADKAIEIQBBACEC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DLMCCyABIARGBEBB6QEhAgyzAgsgAS0AAEHIAEYNASADQQE6ACgLQbYBIQIMlwILQcoBIQIMlgILIAEgBEcEQCADQQw2AgggAyABNgIEQckBIQIMlgILQegBIQIMrwILIAEgBEYEQEHnASECDK8CCyABLQAAQcgARw0EIAFBAWohAUHIASECDJQCCyABIARGBEBB5gEhAgyuAgsCQAJAIAEtAABBxQBrDhAABQUFBQUFBQUFBQUFBQUBBQsgAUEBaiEBQcYBIQIMlAILIAFBAWohAUHHASECDJMCC0HlASECIAEgBEYNrAIgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABB99MAai0AAEcNAyAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMrQILIAMoAgQhACADQgA3AwAgAyAAIAZBAWoiARAtIgBFBEBB1AEhAgyTAgsgA0HkATYCHCADIAE2AhQgAyAANgIMQQAhAgysAgtB4wEhAiABIARGDasCIAMoAgAiACAEIAFraiEFIAEgAGtBAWohBgJAA0AgAS0AACAAQfXTAGotAABHDQIgAEEBRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADKwCCyADQYEEOwEoIAMoAgQhACADQgA3AwAgAyAAIAZBAWoiARAtIgANAwwCCyADQQA2AgALQQAhAiADQQA2AhwgAyABNgIUIANB0B42AhAgA0EINgIMDKkCC0HFASECDI4CCyADQeIBNgIcIAMgATYCFCADIAA2AgxBACECDKcCC0EAIQACQCADKAI4IgJFDQAgAigCOCICRQ0AIAMgAhEAACEACyAARQ1lIABBFUcEQCADQQA2AhwgAyABNgIUIANB1A42AhAgA0EgNgIMQQAhAgynAgsgA0GFATYCHCADIAE2AhQgA0HXGjYCECADQRU2AgxBACECDKYCC0HhASECIAQgASIARg2lAiAEIAFrIAMoAgAiAWohBSAAIAFrQQRqIQYCQANAIAAtAAAgAUHw0wBqLQAARw0BIAFBBEYNAyABQQFqIQEgBCAAQQFqIgBHDQALIAMgBTYCAAymAgsgA0EANgIcIAMgADYCFCADQYQ3NgIQIANBCDYCDCADQQA2AgBBACECDKUCCyABIARHBEAgA0ENNgIIIAMgATYCBEHCASECDIsCC0HgASECDKQCCyADQQA2AgAgBkEBaiEBC0HDASECDIgCCyABIARGBEBB3wEhAgyiAgsgAS0AAEEwayIAQf8BcUEKSQRAIAMgADoAKiABQQFqIQFBwQEhAgyIAgsgAygCBCEAIANBADYCBCADIAAgARAuIgBFDYgCIANB3gE2AhwgAyABNgIUIAMgADYCDEEAIQIMoQILIAEgBEYEQEHdASECDKECCwJAIAEtAABBLkYEQCABQQFqIQEMAQsgAygCBCEAIANBADYCBCADIAAgARAuIgBFDYkCIANB3AE2AhwgAyABNgIUIAMgADYCDEEAIQIMoQILQcABIQIMhgILIAEgBEYEQEHbASECDKACC0EAIQBBASEFQQEhB0EAIQICQAJAAkACQAJAAn8CQAJAAkACQAJAAkACQCABLQAAQTBrDgoKCQABAgMEBQYICwtBAgwGC0EDDAULQQQMBAtBBQwDC0EGDAILQQcMAQtBCAshAkEAIQVBACEHDAILQQkhAkEBIQBBACEFQQAhBwwBC0EAIQVBASECCyADIAI6ACsgAUEBaiEBAkACQCADLQAuQRBxDQACQAJAAkAgAy0AKg4DAQACBAsgB0UNAwwCCyAADQEMAgsgBUUNAQsgAygCBCEAIANBADYCBCADIAAgARAuIgBFDQIgA0HYATYCHCADIAE2AhQgAyAANgIMQQAhAgyiAgsgAygCBCEAIANBADYCBCADIAAgARAuIgBFDYsCIANB2QE2AhwgAyABNgIUIAMgADYCDEEAIQIMoQILIAMoAgQhACADQQA2AgQgAyAAIAEQLiIARQ2JAiADQdoBNgIcIAMgATYCFCADIAA2AgwMoAILQb8BIQIMhQILQQAhAAJAIAMoAjgiAkUNACACKAI8IgJFDQAgAyACEQAAIQALAkAgAARAIABBFUYNASADQQA2AhwgAyABNgIUIANBnA02AhAgA0EhNgIMQQAhAgygAgtBvgEhAgyFAgsgA0HXATYCHCADIAE2AhQgA0HWGTYCECADQRU2AgxBACECDJ4CCyABIARGBEBB1wEhAgyeAgsCQCABLQAAQSBGBEAgA0EAOwE0IAFBAWohAQwBCyADQQA2AhwgAyABNgIUIANB6xA2AhAgA0EJNgIMQQAhAgyeAgtBvQEhAgyDAgsgASAERgRAQdYBIQIM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LgsgAUEBaiEBQZcBIQIM2AELIAFBAWohAUEiDCsLIAEgBEYEQEGvASECDPEBCyABLQAAQdAARw0rIAFBAWohAUGWASECDNYBCyABIARGBEBBrgEhAgzwAQsCQAJAIAEtAABBxgBrDgsALCwsLCwsLCwsASwLIAFBAWohAUGUASECDNYBCyABQQFqIQFBlQEhAgzVAQtBrQEhAiABIARGDe4BIAMoAgAiACAEIAFraiEFIAEgAGtBA2ohBgJAA0AgAS0AACAAQazTAGotAABHDSggAEEDRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADO8BCyADQQA2AgAgBkEBaiEBQQ0MKAtBrAEhAiABIARGDe0BIAMoAgAiACAEIAFraiEFIAEgAGtBAmohBgJAA0AgAS0AACAAQeHTAGotAABHDScgAEECRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADO4BCyADQQA2AgAgBkEBaiEBQQwMJwtBqwEhAiABIARGDewBIAMoAgAiACAEIAFraiEFIAEgAGtBAWohBgJAA0AgAS0AACAAQarTAGotAABHDSYgAEEBRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADO0BCyADQQA2AgAgBkEBaiEBQQMMJgtBqgEhAiABIARGDesBIAMoAgAiACAEIAFraiEFIAEgAGtBAWohBgJAA0AgAS0AACAAQajTAGotAABHDSUgAEEBRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADOwBCyADQQA2AgAgBkEBaiEBQSYMJQsgASAERgRAQakBIQIM6wELAkACQCABLQAAQdQAaw4CAAEnCyABQQFqIQFBjwEhAgzRAQsgAUEBaiEBQZABIQIM0AELQagBIQIgASAERg3pASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEGm0wBqLQAARw0jIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzqAQsgA0EANgIAIAZBAWohAUEnDCMLQacBIQIgASAERg3oASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEGk0wBqLQAARw0iIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzpAQsgA0EANgIAIAZBAWohAUEcDCILQaYBIQIgASAERg3nASADKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEGe0wBqLQAARw0hIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzoAQsgA0EANgIAIAZBAWohAUEGDCELQaUBIQIgASAERg3mASADKAIAIgAgBCABa2ohBSABIABrQQRqIQYCQANAIAEtAAAgAEGZ0wBqLQAARw0gIABBBEYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAznAQsgA0EANgIAIAZBAWohAUEZDCALIAEgBEYEQEGkASECDOYBCwJAAkACQAJAIAEtAABBLWsOIwAkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJAEkJCQkJAIkJCQDJAsgAUEBaiEBQYQBIQIMzgELIAFBAWohAUGFASECDM0BCyABQQFqIQFBigEhAgzMAQsgAUEBaiEBQYsBIQIMywELQaMBIQIgASAERg3kASADKAIAIgAgBCABa2ohBSABIABrQQFqIQYCQANAIAEtAAAgAEGX0wBqLQAARw0eIABBAUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzlAQsgA0EANgIAIAZBAWohAUELDB4LIAEgBEYEQEGiASECDOQBCwJAAkAgAS0AAEHBAGsOAwAgASALIAFBAWohAUGGASECDMoBCyABQQFqIQFBiQEhAgzJAQsgASAERgRAQaEBIQIM4wELAkACQCABLQAAQcEAaw4PAB8fHx8fHx8fHx8fHx8BHwsgAUEBaiEBQYcBIQIMyQELIAFBAWohAUGIASECDMgBCyABIARGBEBBoAEhAgziAQsgAS0AAEHMAEcNHCABQQFqIQFBCgwbC0GfASECIAEgBEYN4AEgAygCACIAIAQgAWtqIQUgASAAa0EFaiEGAkADQCABLQAAIABBkdMAai0AAEcNGiAAQQVGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM4QELIANBADYCACAGQQFqIQFBHgwaC0GeASECIAEgBEYN3wEgAygCACIAIAQgAWtqIQUgASAAa0EGaiEGAkADQCABLQAAIABBitMAai0AAEcNGSAAQQZGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM4AELIANBADYCACAGQQFqIQFBFQwZC0GdASECIAEgBEYN3gEgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABBh9MAai0AAEcNGCAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM3wELIANBADYCACAGQQFqIQFBFwwYC0GcASECIAEgBEYN3QEgAygCACIAIAQgAWtqIQUgASAAa0EFaiEGAkADQCABLQAAIABBgdMAai0AAEcNFyAAQQVGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM3gELIANBADYCACAGQQFqIQFBGAwXCyABIARGBEBBmwEhAgzdAQsCQAJAIAEtAABByQBrDgcAGRkZGRkBGQsgAUEBaiEBQYEBIQIMwwELIAFBAWohAUGCASECDMIBC0GaASECIAEgBEYN2wEgAygCACIAIAQgAWtqIQUgASAAa0EBaiEGAkADQCABLQAAIABB5tMAai0AAEcNFSAAQQFGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM3AELIANBADYCACAGQQFqIQFBCQwVC0GZASECIAEgBEYN2gEgAygCACIAIAQgAWtqIQUgASAAa0EBaiEGAkADQCABLQAAIABB5NMAai0AAEcNFCAAQQFGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM2wELIANBADYCACAGQQFqIQFBHwwUC0GYASECIAEgBEYN2QEgAygCACIAIAQgAWtqIQUgASAAa0ECaiEGAkADQCABLQAAIABB/tIAai0AAEcNEyAAQQJGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM2gELIANBADYCACAGQQFqIQFBAgwTC0GXASECIAEgBEYN2AEgAygCACIAIAQgAWtqIQUgASAAa0EBaiEGA0AgAS0AACAAQfzSAGotAABHDREgAEEBRg0CIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADNgBCyABIARGBEBBlgEhAgzYAQtBASABLQAAQd8ARw0RGiABQQFqIQFB/QAhAgy9AQsgA0EANgIAIAZBAWohAUH+ACECDLwBC0GVASECIAEgBEYN1QEgAygCACIAIAQgAWtqIQUgASAAa0EIaiEGAkADQCABLQAAIABBxNMAai0AAEcNDyAAQQhGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM1gELIANBADYCACAGQQFqIQFBKQwPC0GUASECIAEgBEYN1AEgAygCACIAIAQgAWtqIQUgASAAa0EDaiEGAkADQCABLQAAIABB+NIAai0AAEcNDiAAQQNGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAM1QELIANBADYCACAGQQFqIQFBLQwOCyABIARGBEBBkwEhAgzUAQsgAS0AAEHFAEcNDiABQQFqIQFB+gAhAgy5AQsgASAERgRAQZIBIQIM0wELAkACQCABLQAAQcwAaw4IAA8PDw8PDwEPCyABQQFqIQFB+AAhAgy5AQsgAUEBaiEBQfkAIQIMuAELQZEBIQIgASAERg3RASADKAIAIgAgBCABa2ohBSABIABrQQRqIQYCQANAIAEtAAAgAEHz0gBqLQAARw0LIABBBEYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzSAQsgA0EANgIAIAZBAWohAUEjDAsLQZABIQIgASAERg3QASADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEHw0gBqLQAARw0KIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzRAQsgA0EANgIAIAZBAWohAUEADAoLIAEgBEYEQEGPASECDNABCwJAAkAgAS0AAEHIAGsOCAAMDAwMDAwBDAsgAUEBaiEBQfMAIQIMtgELIAFBAWohAUH2ACECDLUBCyABIARGBEBBjgEhAgzPAQsCQAJAIAEtAABBzgBrDgMACwELCyABQQFqIQFB9AAhAgy1AQsgAUEBaiEBQfUAIQIMtAELIAEgBEYEQEGNASECDM4BCyABLQAAQdkARw0IIAFBAWohAUEIDAcLQYwBIQIgASAERg3MASADKAIAIgAgBCABa2ohBSABIABrQQNqIQYCQANAIAEtAAAgAEHs0gBqLQAARw0GIABBA0YNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzNAQsgA0EANgIAIAZBAWohAUEFDAYLQYsBIQIgASAERg3LASADKAIAIgAgBCABa2ohBSABIABrQQVqIQYCQANAIAEtAAAgAEHm0gBqLQAARw0FIABBBUYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzMAQsgA0EANgIAIAZBAWohAUEWDAULQYoBIQIgASAERg3KASADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEHh0wBqLQAARw0EIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAzLAQsgA0EANgIAIAZBAWohAUEQDAQLIAEgBEYEQEGJASECDMoBCwJAAkAgAS0AAEHDAGsODAAGBgYGBgYGBgYGAQYLIAFBAWohAUHvACECDLABCyABQQFqIQFB8AAhAgyvAQtBiAEhAiABIARGDcgBIAMoAgAiACAEIAFraiEFIAEgAGtBBWohBgJAA0AgAS0AACAAQeDSAGotAABHDQIgAEEFRg0BIABBAWohACAEIAFBAWoiAUcNAAsgAyAFNgIADMkBCyADQQA2AgAgBkEBaiEBQSQMAgsgA0EANgIADAILIAEgBEYEQEGHASECDMcBCyABLQAAQcwARw0BIAFBAWohAUETCzoAKSADKAIEIQAgA0EANgIEIAMgACABEC0iAA0CDAELQQAhAiADQQA2AhwgAyABNgIUIANB6R42AhAgA0EGNgIMDMQBC0HuACECDKkBCyADQYYBNgIcIAMgATYCFCADIAA2AgxBACECDMIBC0EAIQACQCADKAI4IgJFDQAgAigCOCICRQ0AIAMgAhEAACEACyAARQ0AIABBFUYNASADQQA2AhwgAyABNgIUIANB1A42AhAgA0EgNgIMQQAhAgzBAQtB7QAhAgymAQsgA0GFATYCHCADIAE2AhQgA0HXGjYCECADQRU2AgxBACECDL8BCyABIARGBEBBhQEhAgy/AQsCQCABLQAAQSBGBEAgAUEBaiEBDAELIANBADYCHCADIAE2AhQgA0GGHjYCECADQQY2AgxBACECDL8BC0ECIQIMpAELA0AgAS0AAEEgRw0CIAQgAUEBaiIBRw0AC0GEASECDL0BCyABIARGBEBBgwEhAgy9AQsCQCABLQAAQQlrDgRAAABAAAtB6wAhAgyiAQsgAy0AKUEFRgRAQewAIQIMogELQeoAIQIMoQELIAEgBEYEQEGCASECDLsBCyADQQ82AgggAyABNgIEDAoLIAEgBEYEQEGBASECDLoBCwJAIAEtAABBCWsOBD0AAD0AC0HpACECDJ8BCyABIARHBEAgA0EPNgIIIAMgATYCBEHnACECDJ8BC0GAASECDLgBCwJAIAEgBEcEQANAIAEtAABB4M4Aai0AACIAQQNHBEACQCAAQQFrDgI/AAQLQeYAIQIMoQELIAQgAUEBaiIBRw0AC0H+ACECDLkBC0H+ACECDLgBCyADQQA2AhwgAyABNgIUIANBxh82AhAgA0EHNgIMQQAhAgy3AQsgASAERgRAQf8AIQIMtwELAkACQAJAIAEtAABB4NAAai0AAEEBaw4DPAIAAQtB6AAhAgyeAQsgA0EANgIcIAMgATYCFCADQYYSNgIQIANBBzYCDEEAIQIMtwELQeAAIQIMnAELIAEgBEcEQCABQQFqIQFB5QAhAgycAQtB/QAhAgy1AQsgBCABIgBGBEBB/AAhAgy1AQsgAC0AACIBQS9GBEAgAEEBaiEBQeQAIQIMmwELIAFBCWsiAkEXSw0BIAAhAUEBIAJ0QZuAgARxDTcMAQsgBCABIgBGBEBB+wAhAgy0AQsgAC0AAEEvRw0AIABBAWohAQwDC0EAIQIgA0EANgIcIAMgADYCFCADQcYfNgIQIANBBzYCDAyyAQsCQAJAAkACQAJAA0AgAS0AAEHgzABqLQAAIgBBBUcEQAJAAkAgAEEBaw4IPQUGBwgABAEIC0HhACECDJ8BCyABQQFqIQFB4wAhAgyeAQsgBCABQQFqIgFHDQALQfoAIQIMtgELIAFBAWoMFAsgAygCBCEAIANBADYCBCADIAAgARArIgBFDR4gA0HbADYCHCADIAE2AhQgAyAANgIMQQAhAgy0AQsgAygCBCEAIANBADYCBCADIAAgARArIgBFDR4gA0HdADYCHCADIAE2AhQgAyAANgIMQQAhAgyzAQsgAygCBCEAIANBADYCBCADIAAgARArIgBFDR4gA0HwADYCHCADIAE2AhQgAyAANgIMQQAhAgyyAQsgA0EANgIcIAMgATYCFCADQcsPNgIQIANBBzYCDEEAIQIMsQELIAEgBEYEQEH5ACECDLEBCwJAIAEtAABB4MwAai0AAEEBaw4INAQFBgAIAgMHCyABQQFqIQELQQMhAgyVAQsgAUEBagwNC0EAIQIgA0EANgIcIANBoxI2AhAgA0EHNgIMIAMgAUEBajYCFAytAQsgAygCBCEAIANBADYCBCADIAAgARArIgBFDRYgA0HbADYCHCADIAE2AhQgAyAANgIMQQAhAgysAQsgAygCBCEAIANBADYCBCADIAAgARArIgBFDRYgA0HdADYCHCADIAE2AhQgAyAANgIMQQAhAgyrAQsgAygCBCEAIANBADYCBCADIAAgARArIgBFDRYgA0HwADYCHCADIAE2AhQgAyAANgIMQQAhAgyqAQsgA0EANgIcIAMgATYCFCADQcsPNgIQIANBBzYCDEEAIQIMqQELQeIAIQIMjgELIAEgBEYEQEH4ACECDKgBCyABQQFqDAILIAEgBEYEQEH3ACECDKcBCyABQQFqDAELIAEgBEYNASABQQFqCyEBQQQhAgyKAQtB9gAhAgyjAQsDQCABLQAAQeDKAGotAAAiAEECRwRAIABBAUcEQEHfACECDIsBCwwnCyAEIAFBAWoiAUcNAAtB9QAhAgyiAQsgASAERgRAQfQAIQIMogELAkAgAS0AAEEJaw43JQMGJQQGBgYGBgYGBgYGBgYGBgYGBgYFBgYCBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAAYLIAFBAWoLIQFBBSECDIYBCyABQQFqDAYLIAMoAgQhACADQQA2AgQgAyAAIAEQKyIARQ0IIANB2wA2AhwgAyABNgIUIAMgADYCDEEAIQIMngELIAMoAgQhACADQQA2AgQgAyAAIAEQKyIARQ0IIANB3QA2AhwgAyABNgIUIAMgADYCDEEAIQIMnQELIAMoAgQhACADQQA2AgQgAyAAIAEQKyIARQ0IIANB8AA2AhwgAyABNgIUIAMgADYCDEEAIQIMnAELIANBADYCHCADIAE2AhQgA0G8EzYCECADQQc2AgxBACECDJsBCwJAAkACQAJAA0AgAS0AAEHgyABqLQAAIgBBBUcEQAJAIABBAWsOBiQDBAUGAAYLQd4AIQIMhgELIAQgAUEBaiIBRw0AC0HzACECDJ4BCyADKAIEIQAgA0EANgIEIAMgACABECsiAEUNByADQdsANgIcIAMgATYCFCADIAA2AgxBACECDJ0BCyADKAIEIQAgA0EANgIEIAMgACABECsiAEUNByADQd0ANgIcIAMgATYCFCADIAA2AgxBACECDJwBCyADKAIEIQAgA0EANgIEIAMgACABECsiAEUNByADQfAANgIcIAMgATYCFCADIAA2AgxBACECDJsBCyADQQA2AhwgAyABNgIUIANB3Ag2AhAgA0EHNgIMQQAhAgyaAQsgASAERg0BIAFBAWoLIQFBBiECDH4LQfIAIQIMlwELAkACQAJAAkADQCABLQAAQeDGAGotAAAiAEEFRwRAIABBAWsOBB8CAwQFCyAEIAFBAWoiAUcNAAtB8QAhAgyaAQsgAygCBCEAIANBADYCBCADIAAgARArIgBFDQMgA0HbADYCHCADIAE2AhQgAyAANgIMQQAhAgyZAQsgAygCBCEAIANBADYCBCADIAAgARArIgBFDQMgA0HdADYCHCADIAE2AhQgAyAANgIMQQAhAgyYAQsgAygCBCEAIANBADYCBCADIAAgARArIgBFDQMgA0HwADYCHCADIAE2AhQgAyAANgIMQQAhAgyXAQsgA0EANgIcIAMgATYCFCADQbQKNgIQIANBBzYCDEEAIQIMlgELQc4AIQIMewtB0AAhAgx6C0HdACECDHkLIAEgBEYEQEHwACECDJMBCwJAIAEtAABBCWsOBBYAABYACyABQQFqIQFB3AAhAgx4CyABIARGBEBB7wAhAgySAQsCQCABLQAAQQlrDgQVAAAVAAtBACEAAkAgAygCOCICRQ0AIAIoAjAiAkUNACADIAIRAAAhAAsgAEUEQEHTASECDHgLIABBFUcEQCADQQA2AhwgAyABNgIUIANBwQ02AhAgA0EaNgIMQQAhAgySAQsgA0HuADYCHCADIAE2AhQgA0HwGTYCECADQRU2AgxBACECDJEBC0HtACECIAEgBEYNkAEgAygCACIAIAQgAWtqIQUgASAAa0EDaiEGAkADQCABLQAAIABB18YAai0AAEcNBCAAQQNGDQEgAEEBaiEAIAQgAUEBaiIBRw0ACyADIAU2AgAMkQELIANBADYCACAGQQFqIQEgAy0AKSIAQSNrQQtJDQQCQCAAQQZLDQBBASAAdEHKAHFFDQAMBQtBACECIANBADYCHCADIAE2AhQgA0HlCTYCECADQQg2AgwMkAELQewAIQIgASAERg2PASADKAIAIgAgBCABa2ohBSABIABrQQJqIQYCQANAIAEtAAAgAEHUxgBqLQAARw0DIABBAkYNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAyQAQsgA0EANgIAIAZBAWohASADLQApQSFGDQMgA0EANgIcIAMgATYCFCADQYkKNgIQIANBCDYCDEEAIQIMjwELQesAIQIgASAERg2OASADKAIAIgAgBCABa2ohBSABIABrQQNqIQYCQANAIAEtAAAgAEHQxgBqLQAARw0CIABBA0YNASAAQQFqIQAgBCABQQFqIgFHDQALIAMgBTYCAAyPAQsgA0EANgIAIAZBAWohASADLQApIgBBI0kNAiAAQS5GDQIgA0EANgIcIAMgATYCFCADQcEJNgIQIANBCDYCDEEAIQIMjgELIANBADYCAAtBACECIANBADYCHCADIAE2AhQgA0GENzYCECADQQg2AgwMjAELQdgAIQIMcQsgASAERwRAIANBDTYCCCADIAE2AgRB1wAhAgxxC0HqACECDIoBCyABIARGBEBB6QAhAgyKAQsgAS0AAEEwayIAQf8BcUEKSQRAIAMgADoAKiABQQFqIQFB1gAhAgxwCyADKAIEIQAgA0EANgIEIAMgACABEC4iAEUNdCADQegANgIcIAMgATYCFCADIAA2AgxBACECDIkBCyABIARGBEBB5wAhAgyJAQsCQCABLQAAQS5GBEAgAUEBaiEBDAELIAMoAgQhACADQQA2AgQgAyAAIAEQLiIARQ11IANB5gA2AhwgAyABNgIUIAMgADYCDEEAIQIMiQELQdUAIQIMbgsgASAERgRAQeUAIQIMiAELQQAhAEEBIQVBASEHQQAhAgJAAkACQAJAAkACfwJAAkACQAJAAkACQAJAIAEtAABBMGsOCgoJAAECAwQFBggLC0ECDAYLQQMMBQtBBAwEC0EFDAMLQQYMAgtBBwwBC0EICyECQQAhBUEAIQcMAgtBCSECQQEhAEEAIQVBACEHDAELQQAhBUEBIQILIAMgAjoAKyABQQFqIQECQAJAIAMtAC5BEHENAAJAAkACQCADLQAqDgMBAAIECyAHRQ0DDAILIAANAQwCCyAFRQ0BCyADKAIEIQAgA0EANgIEIAMgACABEC4iAEUNAiADQeIANgIcIAMgATYCFCADIAA2AgxBACECDIoBCyADKAIEIQAgA0EANgIEIAMgACABEC4iAEUNdyADQeMANgIcIAMgATYCFCADIAA2AgxBACECDIkBCyADKAIEIQAgA0EANgIEIAMgACABEC4iAEUNdSADQeQANgIcIAMgATYCFCADIAA2AgwMiAELQdMAIQIMbQsgAy0AKUEiRg2AAUHSACECDGwLQQAhAAJAIAMoAjgiAkUNACACKAI8IgJFDQAgAyACEQAAIQALIABFBEBB1AAhAgxsCyAAQRVHBEAgA0EANgIcIAMgATYCFCADQZwNNgIQIANBITYCDEEAIQIMhgELIANB4QA2AhwgAyABNgIUIANB1hk2AhAgA0EVNgIMQQAhAgyFAQsgASAERgRAQeAAIQIMhQELAkACQAJAAkACQCABLQAAQQprDgQBBAQABAsgAUEBaiEBDAELIAFBAWohASADQS9qLQAAQQFxRQ0BC0HRACECDGwLIANBADYCHCADIAE2AhQgA0GIETYCECADQQk2AgxBACECDIUBCyADQQA2AhwgAyABNgIUIANBiBE2AhAgA0EJNgIMQQAhAgyEAQsgASAERgRAQd8AIQIMhAELIAEtAABBCkYEQCABQQFqIQEMCQsgAy0ALkHAAHENCCADQQA2AhwgAyABNgIUIANBiBE2AhAgA0ECNgIMQQAhAgyDAQsgASAERgRAQd0AIQIMgwELIAEtAAAiAkENRgRAIAFBAWohAUHPACECDGkLIAEhACACQQlrDgQFAQEFAQsgBCABIgBGBEBB3AAhAgyCAQsgAC0AAEEKRw0AIABBAWoMAgtBACECIANBADYCHCADIAA2AhQgA0G1LDYCECADQQc2AgwMgAELIAEgBEYEQEHbACECDIABCwJAIAEtAABBCWsOBAMAAAMACyABQQFqCyEBQc0AIQIMZAsgASAERgRAQdoAIQIMfgsgAS0AAEEJaw4EAAEBAAELQQAhAiADQQA2AhwgA0HsETYCECADQQc2AgwgAyABQQFqNgIUDHwLIANBgBI7ASpBACEAAkAgAygCOCICRQ0AIAIoAjAiAkUNACADIAIRAAAhAAsgAEUNACAAQRVHDQEgA0HZADYCHCADIAE2AhQgA0HwGTYCECADQRU2AgxBACECDHsLQcwAIQIMYAsgA0EANgIcIAMgATYCFCADQcENNgIQIANBGjYCDEEAIQIMeQsgASAERgRAQdkAIQIMeQsgAS0AAEEgRw06IAFBAWohASADLQAuQQFxDTogA0EANgIcIAMgATYCFCADQa0bNgIQIANBHjYCDEEAIQIMeAsgASAERgRAQdgAIQIMeAsCQAJAAkACQAJAIAEtAAAiAEEKaw4EAgMD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AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABLQAAQTBrDjcVFAABAgMEBQYHFhYWFhYWFggJCgsMDRYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWDg8QERITFgtCAiEKDBQLQgMhCgwTC0IEIQoMEgtCBSEKDBELQgYhCgwQC0IHIQoMDwtCCCEKDA4LQgkhCgwNC0IKIQoMDAtCCyEKDAsLQgwhCgwKC0INIQoMCQtCDiEKDAgLQg8hCgwHC0IKIQoMBgtCCyEKDAULQgwhCgwEC0INIQoMAwtCDiEKDAILQg8hCgwBC0IBIQoLIAFBAWohASADKQMgIgtC//////////8PWARAIAMgC0IEhiAKhDcDIAwCC0EAIQIgA0EANgIcIAMgATYCFCADQa0JNgIQIANBDDYCDAwfC0ElIQIMBAtBJiECDAMLIAMgAToALCADQQA2AgAgB0EBaiEBQQwhAgwCCyADQQA2AgAgBkEBaiEBQQohAgwBCyABQQFqIQFBCCECDAALAAtBACECIANBADYCHCADIAE2AhQgA0HVEDYCECADQQk2AgwMGAtBACECIANBADYCHCADIAE2AhQgA0HXCjYCECADQQk2AgwMFwtBACECIANBADYCHCADIAE2AhQgA0G/EDYCECADQQk2AgwMFgtBACECIANBADYCHCADIAE2AhQgA0GkETYCECADQQk2AgwMFQtBACECIANBADYCHCADIAE2AhQgA0HVEDYCECADQQk2AgwMFAtBACECIANBADYCHCADIAE2AhQgA0HXCjYCECADQQk2AgwMEwtBACECIANBADYCHCADIAE2AhQgA0G/EDYCECADQQk2AgwMEgtBACECIANBADYCHCADIAE2AhQgA0GkETYCECADQQk2AgwMEQtBACECIANBADYCHCADIAE2AhQgA0G/FjYCECADQQ82AgwMEAtBACECIANBADYCHCADIAE2AhQgA0G/FjYCECADQQ82AgwMDwtBACECIANBADYCHCADIAE2AhQgA0HIEjYCECADQQs2AgwMDgtBACECIANBADYCHCADIAE2AhQgA0GVCTYCECADQQs2AgwMDQtBACECIANBADYCHCADIAE2AhQgA0HpDzYCECADQQo2AgwMDAtBACECIANBADYCHCADIAE2AhQgA0GDEDYCECADQQo2AgwMCwtBACECIANBADYCHCADIAE2AhQgA0GmHDYCECADQQI2AgwMCgtBACECIANBADYCHCADIAE2AhQgA0HFFTYCECADQQI2AgwMCQtBACECIANBADYCHCADIAE2AhQgA0H/FzYCECADQQI2AgwMCAtBACECIANBADYCHCADIAE2AhQgA0HKFzYCECADQQI2AgwMBwsgA0ECNgIcIAMgATYCFCADQZQdNgIQIANBFjYCDEEAIQIMBgtB3gAhAiABIARGDQUgCUEIaiEHIAMoAgAhBQJAAkAgASAERwRAIAVBxsYAaiEIIAQgBWogAWshBiAFQX9zQQpqIgUgAWohAANAIAEtAAAgCC0AAEcEQEECIQgMAwsgBUUEQEEAIQggACEBDAMLIAVBAWshBSAIQQFqIQggBCABQQFqIgFHDQALIAYhBSAEIQELIAdBATYCACADIAU2AgAMAQsgA0EANgIAIAcgCDYCAAsgByABNgIEIAkoAgwhACAJKAIIDgMBBQIACwALIANBADYCHCADQa0dNgIQIANBFzYCDCADIABBAWo2AhRBACECDAMLIANBADYCHCADIAA2AhQgA0HCHTYCECADQQk2AgxBACECDAILIAEgBEYEQEEoIQIMAgsgA0EJNgIIIAMgATYCBEEnIQIMAQsgASAERgRAQQEhAgwBCwNAAkACQAJAIAEtAABBCmsOBAABAQABCyABQQFqIQEMAQsgAUEBaiEBIAMtAC5BIHENAEEAIQIgA0EANgIcIAMgATYCFCADQYwgNgIQIANBBTYCDAwCC0EBIQIgASAERw0ACwsgCUEQaiQAIAJFBEAgAygCDCEADAELIAMgAjYCHEEAIQAgAygCBCIBRQ0AIAMgASAEIAMoAggRAQAiAUUNACADIAQ2AhQgAyABNgIMIAEhAAsgAAu+AgECfyAAQQA6AAAgAEHcAGoiAUEBa0EAOgAAIABBADoAAiAAQQA6AAEgAUEDa0EAOgAAIAFBAmtBADoAACAAQQA6AAMgAUEEa0EAOgAAQQAgAGtBA3EiASAAaiIAQQA2AgBB3AAgAWtBfHEiAiAAaiIBQQRrQQA2AgACQCACQQlJDQAgAEEANgIIIABBADYCBCABQQhrQQA2AgAgAUEMa0EANgIAIAJBGUkNACAAQQA2AhggAEEANgIUIABBADYC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U3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9zdGF0dXMASW52YWxpZCByZXNwb25zZSBzdGF0dXMARXhwZWN0ZWQgTEYgYWZ0ZXIgaGVhZGVycwBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zAFVzZXIgY2FsbGJhY2sgZXJyb3IAYG9uX3Jlc2V0YCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfaGVhZGVyYCBjYWxsYmFjayBlcnJvcgBgb25fbWVzc2FnZV9iZWdpbmAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3N0YXR1c19jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3ZlcnNpb25fY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl91cmxfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2hlYWRlcl92YWx1ZV9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX21lc3NhZ2VfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXRob2RfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfZmllbGRfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fbmFtZWAgY2FsbGJhY2sgZXJyb3IAVW5leHBlY3RlZCBjaGFyIGluIHVybCBzZXJ2ZXIASW52YWxpZCBoZWFkZXIgdmFsdWUgY2hhcgBJbnZhbGlkIGhlYWRlciBmaWVsZCBjaGFyAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fdmVyc2lvbgBJbnZhbGlkIG1pbm9yIHZlcnNpb24ASW52YWxpZCBtYWpvciB2ZXJzaW9uAEV4cGVjdGVkIHNwYWNlIGFmdGVyIHZlcnNpb24ARXhwZWN0ZWQgQ1JMRiBhZnRlciB2ZXJzaW9uAEludmFsaWQgSFRUUCB2ZXJzaW9uAEludmFsaWQgaGVhZGVyIHRva2VuAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fdXJsAEludmFsaWQgY2hhcmFjdGVycyBpbiB1cmwAVW5leHBlY3RlZCBzdGFydCBjaGFyIGluIHVybABEb3VibGUgQCBpbiB1cmwARW1wdHkgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyYWN0ZXIgaW4gQ29udGVudC1MZW5ndGgAVHJhbnNmZXItRW5jb2RpbmcgY2FuJ3QgYmUgcHJlc2VudCB3aXRoIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgY2h1bmsgc2l6ZQBFeHBlY3RlZCBMRiBhZnRlciBjaHVuayBzaXplAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBNaXNzaW5nIGV4cGVjdGVkIENSIGFmdGVyIGhlYWRlciB2YWx1ZQBNaXNzaW5nIGV4cGVjdGVkIExGIGFmdGVyIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AgaGVhZGVyIHZhbHVlAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgY2h1bmsgZXh0ZW5zaW9uIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGUgdmFsdWUASW52YWxpZCBxdW90ZWQtcGFpciBpbiBjaHVuayBleHRlbnNpb25zIHF1b3RlZCB2YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHF1b3RlZCB2YWx1ZQBQYXVzZWQgYnkgb25faGVhZGVyc19jb21wbGV0ZQBJbnZhbGlkIEVPRiBzdGF0ZQBvbl9yZXNldCBwYXVzZQBvbl9jaHVua19oZWFkZXIgcGF1c2UAb25fbWVzc2FnZV9iZWdpbiBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fdmFsdWUgcGF1c2UAb25fc3RhdHVzX2NvbXBsZXRlIHBhdXNlAG9uX3ZlcnNpb25fY29tcGxldGUgcGF1c2UAb25fdXJsX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl92YWx1ZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXNzYWdlX2NvbXBsZXRlIHBhdXNlAG9uX21ldGhvZF9jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfZmllbGRfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX25hbWUgcGF1c2UAVW5leHBlY3RlZCBzcGFjZSBhZnRlciBzdGFydCBsaW5lAE1pc3NpbmcgZXhwZWN0ZWQgQ1IgYWZ0ZXIgcmVzcG9uc2UgbGluZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgbmFtZQBNaXNzaW5nIGV4cGVjdGVkIENSIGFmdGVyIGNodW5rIGV4dGVuc2lvbiBuYW1lAEludmFsaWQgc3RhdHVzIGNvZGUAUGF1c2Ugb24gQ09OTkVDVC9VcGdyYWRlAFBhdXNlIG9uIFBSSS9VcGdyYWRlAEV4cGVjdGVkIEhUVFAvMiBDb25uZWN0aW9uIFByZWZhY2UAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9tZXRob2QARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgbWV0aG9kAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX2ZpZWxkAFBhdXNlZABJbnZhbGlkIHdvcmQgZW5jb3VudGVyZWQASW52YWxpZCBtZXRob2QgZW5jb3VudGVyZWQATWlzc2luZyBleHBlY3RlZCBDUiBhZnRlciBjaHVuayBkYXRhAEV4cGVjdGVkIExGIGFmdGVyIGNodW5rIGRhdGEAVW5leHBlY3RlZCBjaGFyIGluIHVybCBzY2hlbWEAUmVxdWVzdCBoYXMgaW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgAERhdGEgYWZ0ZXIgYENvbm5lY3Rpb246IGNsb3NlYABTV0lUQ0hfUFJPWFkAVVNFX1BST1hZAE1LQUNUSVZJVFkAVU5QUk9DRVNTQUJMRV9FTlRJVFkAUVVFUlkAQ09QWQBNT1ZFRF9QRVJNQU5FTlRMWQBUT09fRUFSTFkATk9USUZZAEZBSUxFRF9ERVBFTkRFTkNZAEJBRF9HQVRFV0FZAFBMQVkAUFVUAENIRUNLT1VUAEdBVEVXQVlfVElNRU9VVABSRVFVRVNUX1RJTUVPVVQATkVUV09SS19DT05ORUNUX1RJTUVPVVQAQ09OTkVDVElPTl9USU1FT1VUAExPR0lOX1RJTUVPVVQATkVUV09SS19SRUFEX1RJTUVPVVQAUE9TVABNSVNESVJFQ1RFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX0xPQURfQkFMQU5DRURfUkVRVUVTVABCQURfUkVRVUVTVABIVFRQX1JFUVVFU1RfU0VOVF9UT19IVFRQU19QT1JUAFJFUE9SVABJTV9BX1RFQVBPVABSRVNFVF9DT05URU5UAE5PX0NPTlRFTlQAUEFSVElBTF9DT05URU5UAEhQRV9JTlZBTElEX0NPTlNUQU5UAEhQRV9DQl9SRVNFVABHRVQASFBFX1NUUklDVABDT05GTElDVABURU1QT1JBUllfUkVESVJFQ1QAUEVSTUFORU5UX1JFRElSRUNUAENPTk5FQ1QATVVMVElfU1RBVFVTAEhQRV9JTlZBTElEX1NUQVRVUwBUT09fTUFOWV9SRVFVRVNUUwBFQVJMWV9ISU5UUwBVTkFWQUlMQUJMRV9GT1JfTEVHQUxfUkVBU09OUwBPUFRJT05TAFNXSVRDSElOR19QUk9UT0NPTFMAVkFSSUFOVF9BTFNPX05FR09USUFURVMATVVMVElQTEVfQ0hPSUNFUwBJTlRFUk5BTF9TRVJWRVJfRVJST1IAV0VCX1NFUlZFUl9VTktOT1dOX0VSUk9SAFJBSUxHVU5fRVJST1IASURFTlRJVFlfUFJPVklERVJfQVVUSEVOVElDQVRJT05fRVJST1IAU1NMX0NFUlRJRklDQVRFX0VSUk9SAElOVkFMSURfWF9GT1JXQVJERURfRk9SAFNFVF9QQVJBTUVURVIAR0VUX1BBUkFNRVRFUgBIUEVfVVNFUgBTRUVfT1RIRVIASFBFX0NCX0NIVU5LX0hFQURFUgBFeHBlY3RlZCBMRiBhZnRlciBDUgBNS0NBTEVOREFSAFNFVFVQAFdFQl9TRVJWRVJfSVNfRE9XTgBURUFSRE9XTgBIUEVfQ0xPU0VEX0NPTk5FQ1RJT04ASEVVUklTVElDX0VYUElSQVRJT04ARElTQ09OTkVDVEVEX09QRVJBVElPTgBOT05fQVVUSE9SSVRBVElWRV9JTkZPUk1BVElPTgBIUEVfSU5WQUxJRF9WRVJTSU9OAEhQRV9DQl9NRVNTQUdFX0JFR0lOAFNJVEVfSVNfRlJPWkVOAEhQRV9JTlZBTElEX0hFQURFUl9UT0tFTgBJTlZBTElEX1RPS0VOAEZPUkJJRERFTgBFTkhBTkNFX1lPVVJfQ0FMTQBIUEVfSU5WQUxJRF9VUkwAQkxPQ0tFRF9CWV9QQVJFTlRBTF9DT05UUk9MAE1LQ09MAEFDTABIUEVfSU5URVJOQUwAUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRV9VTk9GRklDSUFMAEhQRV9PSwBVTkxJTksAVU5MT0NLAFBSSQBSRVRSWV9XSVRIAEhQRV9JTlZBTElEX0NPTlRFTlRfTEVOR1RIAEhQRV9VTkVYUEVDVEVEX0NPTlRFTlRfTEVOR1RIAEZMVVNIAFBST1BQQVRDSABNLVNFQVJDSABVUklfVE9PX0xPTkcAUFJPQ0VTU0lORwBNSVNDRUxMQU5FT1VTX1BFUlNJU1RFTlRfV0FSTklORwBNSVNDRUxMQU5FT1VTX1dBUk5JTkcASFBFX0lOVkFMSURfVFJBTlNGRVJfRU5DT0RJTkcARXhwZWN0ZWQgQ1JMRgBIUEVfSU5WQUxJRF9DSFVOS19TSVpFAE1PVkUAQ09OVElOVUUASFBFX0NCX1NUQVRVU19DT01QTEVURQBIUEVfQ0JfSEVBREVSU19DT01QTEVURQBIUEVfQ0JfVkVSU0lPTl9DT01QTEVURQBIUEVfQ0JfVVJMX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19DT01QTEVURQBIUEVfQ0JfSEVBREVSX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9OQU1FX0NPTVBMRVRFAEhQRV9DQl9NRVNTQUdFX0NPTVBMRVRFAEhQRV9DQl9NRVRIT0RfQ09NUExFVEUASFBFX0NCX0hFQURFUl9GSUVMRF9DT01QTEVURQBERUxFVEUASFBFX0lOVkFMSURfRU9GX1NUQVRFAElOVkFMSURfU1NMX0NFUlRJRklDQVRFAFBBVVNFAE5PX1JFU1BPTlNFAFVOU1VQUE9SVEVEX01FRElBX1RZUEUAR09ORQBOT1RfQUNDRVBUQUJMRQBTRVJWSUNFX1VOQVZBSUxBQkxFAFJBTkdFX05PVF9TQVRJU0ZJQUJMRQBPUklHSU5fSVNfVU5SRUFDSEFCTEUAUkVTUE9OU0VfSVNfU1RBTEUAUFVSR0UATUVSR0UAUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRQBSRVFVRVNUX0hFQURFUl9UT09fTEFSR0UAUEFZTE9BRF9UT09fTEFSR0UASU5TVUZGSUNJRU5UX1NUT1JBR0UASFBFX1BBVVNFRF9VUEdSQURFAEhQRV9QQVVTRURfSDJfVVBHUkFERQBTT1VSQ0UAQU5OT1VOQ0UAVFJBQ0UASFBFX1VORVhQRUNURURfU1BBQ0UAREVTQ1JJQkUAVU5TVUJTQ1JJQkUAUkVDT1JEAEhQRV9JTlZBTElEX01FVEhPRABOT1RfRk9VTkQAUFJPUEZJTkQAVU5CSU5EAFJFQklORABVTkFVVEhPUklaRUQATUVUSE9EX05PVF9BTExPV0VEAEhUVFBfVkVSU0lPTl9OT1RfU1VQUE9SVEVEAEFMUkVBRFlfUkVQT1JURUQAQUNDRVBURUQATk9UX0lNUExFTUVOVEVEAExPT1BfREVURUNURUQASFBFX0NSX0VYUEVDVEVEAEhQRV9MRl9FWFBFQ1RFRABDUkVBVEVEAElNX1VTRUQASFBFX1BBVVNFRABUSU1FT1VUX09DQ1VSRUQAUEFZTUVOVF9SRVFVSVJFRABQUkVDT05ESVRJT05fUkVRVUlSRUQAUFJPWFlfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATkVUV09SS19BVVRIRU5USUNBVElPTl9SRVFVSVJFRABMRU5HVEhfUkVRVUlSRUQAU1NMX0NFUlRJRklDQVRFX1JFUVVJUkVEAFVQR1JBREVfUkVRVUlSRUQAUEFHRV9FWFBJUkVEAFBSRUNPTkRJVElPTl9GQUlMRUQARVhQRUNUQVRJT05fRkFJTEVEAFJFVkFMSURBVElPTl9GQUlMRUQAU1NMX0hBTkRTSEFLRV9GQUlMRUQATE9DS0VEAFRSQU5TRk9STUFUSU9OX0FQUExJRUQATk9UX01PRElGSUVEAE5PVF9FWFRFTkRFRABCQU5EV0lEVEhfTElNSVRfRVhDRUVERUQAU0lURV9JU19PVkVSTE9BREVEAEhFQUQARXhwZWN0ZWQgSFRUUC8AAFIVAAAaFQAADxIAAOQZAACRFQAACRQAAC0ZAADkFAAA6REAAGkUAAChFAAAdhUAAEMWAABeEgAAlBcAABcWAAB9FAAAfxYAAEEXAACzEwAAwxYAAAQaAAC9GAAA0BgAAKATAADUGQAArxYAAGgWAABwFwAA2RYAAPwYAAD+EQAAWRcAAJcWAAAcFwAA9hYAAI0XAAALEgAAfxsAAC4RAACzEAAASRIAAK0SAAD2GAAAaBAAAGIVAAAQFQAAWhYAAEoZAAC1FQAAwRUAAGAVAABcGQAAWhkAAFMZAAAWFQAArREAAEIQAAC3EAAAVxgAAL8VAACJEAAAHBkAABoZAAC5FQAAURgAANwTAABbFQAAWRUAAOYYAABnFQAAERkAAO0YAADnEwAArhAAAMIXAAAAFAAAkhMAAIQTAABAEgAAJhkAAK8VAABiEABB6TkLAQEAQYA6C+ABAQECAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAwEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAQeo7CwQBAAACAEGBPAteAwQDAwMDAwAAAwMAAwMAAwMDAwMDAwMDAwAFAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAMAAwBB6j0LBAEAAAIAQYE+C14DAAMDAwMDAAADAwADAwADAwMDAwMDAwMDAAQABQAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAwADAEHgPwsNbG9zZWVlcC1hbGl2ZQBB+T8LAQEAQZDAAAvgAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAEH5wQALAQEAQZDCAAvnAQEBAQEBAQEBAQEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBY2h1bmtlZABBocQAC14BAAEBAQEBAAABAQABAQABAQEBAQEBAQEBAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAEGAxgALIWVjdGlvbmVudC1sZW5ndGhvbnJveHktY29ubmVjdGlvbgBBsMYACytyYW5zZmVyLWVuY29kaW5ncGdyYWRlDQoNClNNDQoNClRUUC9DRS9UU1AvAEHpxgALBQECAAEDAEGAxwALXwQFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFAEHpyAALBQECAAEDAEGAyQALXwQFBQYFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFAEHpygALBAEAAAEAQYHLAAteAgIAAgICAgICAgICAgICAgICAgICAgICAgICAgICAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgBB6cwACwUBAgABAwBBgM0AC18EBQAABQUFBQUFBQUFBQUGBQUFBQUFBQUFBQUFAAUABwgFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUABQAFAAUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFAAAABQBB6c4ACwUBAQABAQBBgM8ACwEBAEGazwALQQIAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAEHp0AALBQEBAAEBAEGA0QALAQEAQYrRAAsGAgAAAAACAEGh0QALOgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQeDSAAuaAU5PVU5DRUVDS09VVE5FQ1RFVEVDUklCRUxVU0hFVEVBRFNFQVJDSFJHRUNUSVZJVFlMRU5EQVJWRU9USUZZUFRJT05TQ0hTRUFZU1RBVENIR0VVRVJZT1JESVJFQ1RPUlRSQ0hQQVJBTUVURVJVUkNFQlNDUklCRUFSRE9XTkFDRUlORE5LQ0tVQlNDUklCRUhUVFAvQURUUC8="; + var wasmBuffer; + Object.defineProperty(module2, "exports", { + get: /* @__PURE__ */ __name(() => { + return wasmBuffer ? wasmBuffer : wasmBuffer = Buffer2.from(wasmBase64, "base64"); + }, "get") + }); } }); @@ -3072,10 +3538,9 @@ var require_constants3 = __commonJS({ ] ); var badPortsSet = new Set(badPorts); - var referrerPolicy = ( + var referrerPolicyTokens = ( /** @type {const} */ [ - "", "no-referrer", "no-referrer-when-downgrade", "same-origin", @@ -3086,7 +3551,14 @@ var require_constants3 = __commonJS({ "unsafe-url" ] ); - var referrerPolicySet = new Set(referrerPolicy); + var referrerPolicy = ( + /** @type {const} */ + [ + "", + ...referrerPolicyTokens + ] + ); + var referrerPolicyTokensSet = new Set(referrerPolicyTokens); var requestRedirect = ( /** @type {const} */ ["follow", "manual", "error"] @@ -3179,7 +3651,7 @@ var require_constants3 = __commonJS({ corsSafeListedMethodsSet, safeMethodsSet, forbiddenMethodsSet, - referrerPolicySet + referrerPolicyTokens: referrerPolicyTokensSet }; } }); @@ -3348,7 +3820,7 @@ var require_data_url = __commonJS({ if (type.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(type)) { return "failure"; } - if (position.position > input.length) { + if (position.position >= input.length) { return "failure"; } position.position++; @@ -3391,7 +3863,7 @@ var require_data_url = __commonJS({ } position.position++; } - if (position.position > input.length) { + if (position.position >= input.length) { break; } let parameterValue = null; @@ -3441,7 +3913,7 @@ var require_data_url = __commonJS({ return new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength); } __name(forgivingBase64, "forgivingBase64"); - function collectAnHTTPQuotedString(input, position, extractValue) { + function collectAnHTTPQuotedString(input, position, extractValue = false) { const positionStart = position.position; let value = ""; assert(input[position.position] === '"'); @@ -3513,12 +3985,10 @@ var require_data_url = __commonJS({ let lead = 0; let trail = str.length - 1; if (leading) { - while (lead < str.length && predicate(str.charCodeAt(lead))) - lead++; + while (lead < str.length && predicate(str.charCodeAt(lead))) lead++; } if (trailing) { - while (trail > 0 && predicate(str.charCodeAt(trail))) - trail--; + while (trail > 0 && predicate(str.charCodeAt(trail))) trail--; } return lead === 0 && trail === str.length - 1 ? str : str.slice(lead, trail + 1); } @@ -3602,10 +4072,21 @@ var require_webidl = __commonJS({ var { types, inspect } = require("node:util"); var { markAsUncloneable } = require("node:worker_threads"); var { toUSVString } = require_util(); - var webidl = {}; - webidl.converters = {}; - webidl.util = {}; - webidl.errors = {}; + var UNDEFINED = 1; + var BOOLEAN = 2; + var STRING = 3; + var SYMBOL = 4; + var NUMBER = 5; + var BIGINT = 6; + var NULL = 7; + var OBJECT = 8; + var FunctionPrototypeSymbolHasInstance = Function.call.bind(Function.prototype[Symbol.hasInstance]); + var webidl = { + converters: {}, + util: {}, + errors: {}, + is: {} + }; webidl.errors.exception = function(message) { return new TypeError(`${message.header}: ${message.message}`); }; @@ -3623,20 +4104,22 @@ var require_webidl = __commonJS({ message: `"${context.value}" is an invalid ${context.type}.` }); }; - webidl.brandCheck = function(V, I, opts) { - if (opts?.strict !== false) { - if (!(V instanceof I)) { - const err = new TypeError("Illegal invocation"); - err.code = "ERR_INVALID_THIS"; - throw err; - } - } else { - if (V?.[Symbol.toStringTag] !== I.prototype[Symbol.toStringTag]) { + webidl.brandCheck = function(V, I) { + if (!FunctionPrototypeSymbolHasInstance(I, V)) { + const err = new TypeError("Illegal invocation"); + err.code = "ERR_INVALID_THIS"; + throw err; + } + }; + webidl.brandCheckMultiple = function(List) { + const prototypes = List.map((c) => webidl.util.MakeTypeAssertion(c)); + return (V) => { + if (prototypes.every((typeCheck) => !typeCheck(V))) { const err = new TypeError("Illegal invocation"); err.code = "ERR_INVALID_THIS"; throw err; } - } + }; }; webidl.argumentLengthCheck = function({ length }, min, ctx) { if (length < min) { @@ -3652,29 +4135,62 @@ var require_webidl = __commonJS({ message: "Illegal constructor" }); }; + webidl.util.MakeTypeAssertion = function(I) { + return (O) => FunctionPrototypeSymbolHasInstance(I, O); + }; webidl.util.Type = function(V) { switch (typeof V) { case "undefined": - return "Undefined"; + return UNDEFINED; case "boolean": - return "Boolean"; + return BOOLEAN; case "string": - return "String"; + return STRING; case "symbol": - return "Symbol"; + return SYMBOL; case "number": - return "Number"; + return NUMBER; case "bigint": - return "BigInt"; + return BIGINT; case "function": case "object": { if (V === null) { - return "Null"; + return NULL; } - return "Object"; + return OBJECT; } } }; + webidl.util.Types = { + UNDEFINED, + BOOLEAN, + STRING, + SYMBOL, + NUMBER, + BIGINT, + NULL, + OBJECT + }; + webidl.util.TypeValueToString = function(o) { + switch (webidl.util.Type(o)) { + case UNDEFINED: + return "Undefined"; + case BOOLEAN: + return "Boolean"; + case STRING: + return "String"; + case SYMBOL: + return "Symbol"; + case NUMBER: + return "Number"; + case BIGINT: + return "BigInt"; + case NULL: + return "Null"; + case OBJECT: + return "Object"; + } + }; webidl.util.markAsUncloneable = markAsUncloneable || (() => { }); webidl.util.ConvertToInt = function(V, bitLength, signedness, opts) { @@ -3743,11 +4259,11 @@ var require_webidl = __commonJS({ webidl.util.Stringify = function(V) { const type = webidl.util.Type(V); switch (type) { - case "Symbol": + case SYMBOL: return `Symbol(${V.description})`; - case "Object": + case OBJECT: return inspect(V); - case "String": + case STRING: return `"${V}"`; default: return `${V}`; @@ -3755,7 +4271,7 @@ var require_webidl = __commonJS({ }; webidl.sequenceConverter = function(converter) { return (V, prefix, argument, Iterable) => { - if (webidl.util.Type(V) !== "Object") { + if (webidl.util.Type(V) !== OBJECT) { throw webidl.errors.exception({ header: prefix, message: `${argument} (${webidl.util.Stringify(V)}) is not iterable.` @@ -3782,18 +4298,19 @@ var require_webidl = __commonJS({ }; webidl.recordConverter = function(keyConverter, valueConverter) { return (O, prefix, argument) => { - if (webidl.util.Type(O) !== "Object") { + if (webidl.util.Type(O) !== OBJECT) { throw webidl.errors.exception({ header: prefix, - message: `${argument} ("${webidl.util.Type(O)}") is not an Object.` + message: `${argument} ("${webidl.util.TypeValueToString(O)}") is not an Object.` }); } const result = {}; if (!types.isProxy(O)) { const keys2 = [...Object.getOwnPropertyNames(O), ...Object.getOwnPropertySymbols(O)]; for (const key of keys2) { - const typedKey = keyConverter(key, prefix, argument); - const typedValue = valueConverter(O[key], prefix, argument); + const keyName = webidl.util.Stringify(key); + const typedKey = keyConverter(key, prefix, `Key ${keyName} in ${argument}`); + const typedValue = valueConverter(O[key], prefix, `${argument}[${keyName}]`); result[typedKey] = typedValue; } return result; @@ -3810,12 +4327,12 @@ var require_webidl = __commonJS({ return result; }; }; - webidl.interfaceConverter = function(i) { - return (V, prefix, argument, opts) => { - if (opts?.strict !== false && !(V instanceof i)) { + webidl.interfaceConverter = function(TypeCheck, name) { + return (V, prefix, argument) => { + if (!TypeCheck(V)) { throw webidl.errors.exception({ header: prefix, - message: `Expected ${argument} ("${webidl.util.Stringify(V)}") to be an instance of ${i.name}.` + message: `Expected ${argument} ("${webidl.util.Stringify(V)}") to be an instance of ${name}.` }); } return V; @@ -3823,11 +4340,8 @@ var require_webidl = __commonJS({ }; webidl.dictionaryConverter = function(converters) { return (dictionary, prefix, argument) => { - const type = webidl.util.Type(dictionary); const dict = {}; - if (type === "Null" || type === "Undefined") { - return dict; - } else if (type !== "Object") { + if (dictionary != null && webidl.util.Type(dictionary) !== OBJECT) { throw webidl.errors.exception({ header: prefix, message: `Expected ${dictionary} to be one of: Null, Undefined, Object.` @@ -3836,17 +4350,17 @@ var require_webidl = __commonJS({ for (const options of converters) { const { key, defaultValue, required, converter } = options; if (required === true) { - if (!Object.hasOwn(dictionary, key)) { + if (dictionary == null || !Object.hasOwn(dictionary, key)) { throw webidl.errors.exception({ header: prefix, message: `Missing required key "${key}".` }); } } - let value = dictionary[key]; - const hasDefault = Object.hasOwn(options, "defaultValue"); - if (hasDefault && value !== null) { - value ??= defaultValue(); + let value = dictionary?.[key]; + const hasDefault = defaultValue !== void 0; + if (hasDefault && value === void 0) { + value = defaultValue(); } if (required || hasDefault || value !== void 0) { value = converter(value, prefix, `${argument}.${key}`); @@ -3870,6 +4384,13 @@ var require_webidl = __commonJS({ return converter(V, prefix, argument); }; }; + webidl.is.ReadableStream = webidl.util.MakeTypeAssertion(ReadableStream); + webidl.is.Blob = webidl.util.MakeTypeAssertion(Blob); + webidl.is.URLSearchParams = webidl.util.MakeTypeAssertion(URLSearchParams); + webidl.is.File = webidl.util.MakeTypeAssertion(globalThis.File ?? require("node:buffer").File); + webidl.is.URL = webidl.util.MakeTypeAssertion(URL); + webidl.is.AbortSignal = webidl.util.MakeTypeAssertion(AbortSignal); + webidl.is.MessagePort = webidl.util.MakeTypeAssertion(MessagePort); webidl.converters.DOMString = function(V, prefix, argument, opts) { if (V === null && opts?.legacyNullToEmptyString) { return ""; @@ -3883,7 +4404,13 @@ var require_webidl = __commonJS({ return String(V); }; webidl.converters.ByteString = function(V, prefix, argument) { - const x = webidl.converters.DOMString(V, prefix, argument); + if (typeof V === "symbol") { + throw webidl.errors.exception({ + header: prefix, + message: `${argument} is a symbol, which cannot be converted to a ByteString.` + }); + } + const x = String(V); for (let index = 0; index < x.length; index++) { if (x.charCodeAt(index) > 255) { throw new TypeError( @@ -3918,7 +4445,7 @@ var require_webidl = __commonJS({ return x; }; webidl.converters.ArrayBuffer = function(V, prefix, argument, opts) { - if (webidl.util.Type(V) !== "Object" || !types.isAnyArrayBuffer(V)) { + if (webidl.util.Type(V) !== OBJECT || !types.isAnyArrayBuffer(V)) { throw webidl.errors.conversionFailed({ prefix, argument: `${argument} ("${webidl.util.Stringify(V)}")`, @@ -3940,7 +4467,7 @@ var require_webidl = __commonJS({ return V; }; webidl.converters.TypedArray = function(V, T, prefix, name, opts) { - if (webidl.util.Type(V) !== "Object" || !types.isTypedArray(V) || V.constructor.name !== T.name) { + if (webidl.util.Type(V) !== OBJECT || !types.isTypedArray(V) || V.constructor.name !== T.name) { throw webidl.errors.conversionFailed({ prefix, argument: `${name} ("${webidl.util.Stringify(V)}")`, @@ -3962,7 +4489,7 @@ var require_webidl = __commonJS({ return V; }; webidl.converters.DataView = function(V, prefix, name, opts) { - if (webidl.util.Type(V) !== "Object" || !types.isDataView(V)) { + if (webidl.util.Type(V) !== OBJECT || !types.isDataView(V)) { throw webidl.errors.exception({ header: prefix, message: `${name} is not a DataView.` @@ -3982,22 +4509,6 @@ var require_webidl = __commonJS({ } return V; }; - webidl.converters.BufferSource = function(V, prefix, name, opts) { - if (types.isAnyArrayBuffer(V)) { - return webidl.converters.ArrayBuffer(V, prefix, name, { ...opts, allowShared: false }); - } - if (types.isTypedArray(V)) { - return webidl.converters.TypedArray(V, V.constructor, prefix, name, { ...opts, allowShared: false }); - } - if (types.isDataView(V)) { - return webidl.converters.DataView(V, prefix, name, { ...opts, allowShared: false }); - } - throw webidl.errors.conversionFailed({ - prefix, - argument: `${name} ("${webidl.util.Stringify(V)}")`, - types: ["BufferSource"] - }); - }; webidl.converters["sequence"] = webidl.sequenceConverter( webidl.converters.ByteString ); @@ -4008,6 +4519,11 @@ var require_webidl = __commonJS({ webidl.converters.ByteString, webidl.converters.ByteString ); + webidl.converters.Blob = webidl.interfaceConverter(webidl.is.Blob, "Blob"); + webidl.converters.AbortSignal = webidl.interfaceConverter( + webidl.is.AbortSignal, + "AbortSignal" + ); module2.exports = { webidl }; @@ -4020,11 +4536,11 @@ var require_util2 = __commonJS({ "use strict"; var { Transform } = require("node:stream"); var zlib = require("node:zlib"); - var { redirectStatusSet, referrerPolicySet: referrerPolicyTokens, badPortsSet } = require_constants3(); + var { redirectStatusSet, referrerPolicyTokens, badPortsSet } = require_constants3(); var { getGlobalOrigin } = require_global(); var { collectASequenceOfCodePoints, collectAnHTTPQuotedString, removeChars, parseMIMEType } = require_data_url(); var { performance: performance2 } = require("node:perf_hooks"); - var { isBlobLike, ReadableStreamFrom, isValidHTTPToken, normalizedMethodRecordsBase } = require_util(); + var { ReadableStreamFrom, isValidHTTPToken, normalizedMethodRecordsBase } = require_util(); var assert = require("node:assert"); var { isUint8Array } = require("node:util/types"); var { webidl } = require_webidl(); @@ -4107,11 +4623,10 @@ var require_util2 = __commonJS({ return (potentialValue[0] === " " || potentialValue[0] === " " || potentialValue[potentialValue.length - 1] === " " || potentialValue[potentialValue.length - 1] === " " || potentialValue.includes("\n") || potentialValue.includes("\r") || potentialValue.includes("\0")) === false; } __name(isValidHeaderValue, "isValidHeaderValue"); - function setRequestReferrerPolicyOnRedirect(request, actualResponse) { - const { headersList } = actualResponse; - const policyHeader = (headersList.get("referrer-policy", true) ?? "").split(","); + function parseReferrerPolicy(actualResponse) { + const policyHeader = (actualResponse.headersList.get("referrer-policy", true) ?? "").split(","); let policy = ""; - if (policyHeader.length > 0) { + if (policyHeader.length) { for (let i = policyHeader.length; i !== 0; i--) { const token = policyHeader[i - 1].trim(); if (referrerPolicyTokens.has(token)) { @@ -4120,6 +4635,11 @@ var require_util2 = __commonJS({ } } } + return policy; + } + __name(parseReferrerPolicy, "parseReferrerPolicy"); + function setRequestReferrerPolicyOnRedirect(request, actualResponse) { + const policy = parseReferrerPolicy(actualResponse); if (policy !== "") { request.referrerPolicy = policy; } @@ -4240,7 +4760,7 @@ var require_util2 = __commonJS({ return "no-referrer"; } referrerSource = new URL(globalOrigin); - } else if (request.referrer instanceof URL) { + } else if (webidl.is.URL(request.referrer)) { referrerSource = request.referrer; } let referrerURL = stripURLForReferrer(referrerSource); @@ -4248,17 +4768,23 @@ var require_util2 = __commonJS({ if (referrerURL.toString().length > 4096) { referrerURL = referrerOrigin; } - const areSameOrigin = sameOrigin(request, referrerURL); - const isNonPotentiallyTrustWorthy = isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(request.url); switch (policy) { + case "no-referrer": + return "no-referrer"; case "origin": - return referrerOrigin != null ? referrerOrigin : stripURLForReferrer(referrerSource, true); + if (referrerOrigin != null) { + return referrerOrigin; + } + return stripURLForReferrer(referrerSource, true); case "unsafe-url": return referrerURL; - case "same-origin": - return areSameOrigin ? referrerOrigin : "no-referrer"; - case "origin-when-cross-origin": - return areSameOrigin ? referrerURL : referrerOrigin; + case "strict-origin": { + const currentURL = requestCurrentURL(request); + if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) { + return "no-referrer"; + } + return referrerOrigin; + } case "strict-origin-when-cross-origin": { const currentURL = requestCurrentURL(request); if (sameOrigin(referrerURL, currentURL)) { @@ -4269,54 +4795,87 @@ var require_util2 = __commonJS({ } return referrerOrigin; } - case "strict-origin": - case "no-referrer-when-downgrade": - default: - return isNonPotentiallyTrustWorthy ? "no-referrer" : referrerOrigin; + case "same-origin": + if (sameOrigin(request, referrerURL)) { + return referrerURL; + } + return "no-referrer"; + case "origin-when-cross-origin": + if (sameOrigin(request, referrerURL)) { + return referrerURL; + } + return referrerOrigin; + case "no-referrer-when-downgrade": { + const currentURL = requestCurrentURL(request); + if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) { + return "no-referrer"; + } + return referrerOrigin; + } } } __name(determineRequestsReferrer, "determineRequestsReferrer"); - function stripURLForReferrer(url, originOnly) { - assert(url instanceof URL); + function stripURLForReferrer(url, originOnly = false) { + assert(webidl.is.URL(url)); url = new URL(url); - if (url.protocol === "file:" || url.protocol === "about:" || url.protocol === "blank:") { + if (urlIsLocal(url)) { return "no-referrer"; } url.username = ""; url.password = ""; url.hash = ""; - if (originOnly) { + if (originOnly === true) { url.pathname = ""; url.search = ""; } return url; } __name(stripURLForReferrer, "stripURLForReferrer"); - function isURLPotentiallyTrustworthy(url) { - if (!(url instanceof URL)) { + var potentialleTrustworthyIPv4RegExp = new RegExp("^(?:(?:127\\.)(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){2}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[1-9]))$"); + var potentialleTrustworthyIPv6RegExp = new RegExp("^(?:(?:(?:0{1,4}):){7}(?:(?:0{0,3}1))|(?:(?:0{1,4}):){1,6}(?::(?:0{0,3}1))|(?:::(?:0{0,3}1))|)$"); + function isOriginIPPotentiallyTrustworthy(origin) { + if (origin.includes(":")) { + if (origin[0] === "[" && origin[origin.length - 1] === "]") { + origin = origin.slice(1, -1); + } + return potentialleTrustworthyIPv6RegExp.test(origin); + } + return potentialleTrustworthyIPv4RegExp.test(origin); + } + __name(isOriginIPPotentiallyTrustworthy, "isOriginIPPotentiallyTrustworthy"); + function isOriginPotentiallyTrustworthy(origin) { + if (origin == null || origin === "null") { return false; } - if (url.href === "about:blank" || url.href === "about:srcdoc") { + origin = new URL(origin); + if (origin.protocol === "https:" || origin.protocol === "wss:") { return true; } - if (url.protocol === "data:") + if (isOriginIPPotentiallyTrustworthy(origin.hostname)) { return true; - if (url.protocol === "file:") + } + if (origin.hostname === "localhost" || origin.hostname === "localhost.") { return true; - return isOriginPotentiallyTrustworthy(url.origin); - function isOriginPotentiallyTrustworthy(origin) { - if (origin == null || origin === "null") - return false; - const originAsURL = new URL(origin); - if (originAsURL.protocol === "https:" || originAsURL.protocol === "wss:") { - return true; - } - if (/^127(?:\.[0-9]+){0,2}\.[0-9]+$|^\[(?:0*:)*?:?0*1\]$/.test(originAsURL.hostname) || (originAsURL.hostname === "localhost" || originAsURL.hostname.includes("localhost.")) || originAsURL.hostname.endsWith(".localhost")) { - return true; - } + } + if (origin.hostname.endsWith(".localhost") || origin.hostname.endsWith(".localhost.")) { + return true; + } + if (origin.protocol === "file:") { + return true; + } + return false; + } + __name(isOriginPotentiallyTrustworthy, "isOriginPotentiallyTrustworthy"); + function isURLPotentiallyTrustworthy(url) { + if (!webidl.is.URL(url)) { return false; } - __name(isOriginPotentiallyTrustworthy, "isOriginPotentiallyTrustworthy"); + if (url.href === "about:blank" || url.href === "about:srcdoc") { + return true; + } + if (url.protocol === "data:") return true; + if (url.protocol === "blob:") return true; + return isOriginPotentiallyTrustworthy(url.origin); } __name(isURLPotentiallyTrustworthy, "isURLPotentiallyTrustworthy"); function bytesMatch(bytes, metadataList) { @@ -4492,7 +5051,7 @@ var require_util2 = __commonJS({ ); } const index = this.#index; - const values = this.#target[kInternalIterator]; + const values = kInternalIterator(this.#target); const len = values.length; if (index >= len) { return { @@ -4595,7 +5154,7 @@ var require_util2 = __commonJS({ }); } __name(iteratorMixin, "iteratorMixin"); - async function fullyReadBody(body, processBody, processBodyError) { + function fullyReadBody(body, processBody, processBodyError) { const successSteps = processBody; const errorSteps = processBodyError; let reader; @@ -4605,17 +5164,9 @@ var require_util2 = __commonJS({ errorSteps(e); return; } - try { - successSteps(await readAllBytes(reader)); - } catch (e) { - errorSteps(e); - } + readAllBytes(reader, successSteps, errorSteps); } __name(fullyReadBody, "fullyReadBody"); - function isReadableStreamLike(stream) { - return stream instanceof ReadableStream || stream[Symbol.toStringTag] === "ReadableStream" && typeof stream.tee === "function"; - } - __name(isReadableStreamLike, "isReadableStreamLike"); function readableStreamClose(controller) { try { controller.close(); @@ -4633,19 +5184,25 @@ var require_util2 = __commonJS({ return input; } __name(isomorphicEncode, "isomorphicEncode"); - async function readAllBytes(reader) { + async function readAllBytes(reader, successSteps, failureSteps) { const bytes = []; let byteLength = 0; - while (true) { - const { done, value: chunk } = await reader.read(); - if (done) { - return Buffer.concat(bytes, byteLength); - } - if (!isUint8Array(chunk)) { - throw new TypeError("Received non-Uint8Array chunk"); - } - bytes.push(chunk); - byteLength += chunk.length; + try { + do { + const { done, value: chunk } = await reader.read(); + if (done) { + successSteps(Buffer.concat(bytes, byteLength)); + return; + } + if (!isUint8Array(chunk)) { + failureSteps(TypeError("Received non-Uint8Array chunk")); + return; + } + bytes.push(chunk); + byteLength += chunk.length; + } while (true); + } catch (e) { + failureSteps(e); } } __name(readAllBytes, "readAllBytes"); @@ -4907,7 +5464,6 @@ var require_util2 = __commonJS({ requestCurrentURL, responseURL, responseLocationURL, - isBlobLike, isURLPotentiallyTrustworthy, isValidReasonPhrase, sameOrigin, @@ -4920,7 +5476,6 @@ var require_util2 = __commonJS({ isErrorLike, fullyReadBody, bytesMatch, - isReadableStreamLike, readableStreamClose, isomorphicEncode, urlIsLocal, @@ -4934,89 +5489,9 @@ var require_util2 = __commonJS({ extractMimeType, getDecodeSplit, utf8DecodeBytes, - environmentSettingsObject - }; - } -}); - -// lib/web/fetch/symbols.js -var require_symbols2 = __commonJS({ - "lib/web/fetch/symbols.js"(exports2, module2) { - "use strict"; - module2.exports = { - kUrl: Symbol("url"), - kHeaders: Symbol("headers"), - kSignal: Symbol("signal"), - kState: Symbol("state"), - kDispatcher: Symbol("dispatcher") - }; - } -}); - -// lib/web/fetch/file.js -var require_file = __commonJS({ - "lib/web/fetch/file.js"(exports2, module2) { - "use strict"; - var { Blob: Blob2, File } = require("node:buffer"); - var { kState } = require_symbols2(); - var { webidl } = require_webidl(); - var FileLike = class _FileLike { - static { - __name(this, "FileLike"); - } - constructor(blobLike, fileName, options = {}) { - const n = fileName; - const t = options.type; - const d = options.lastModified ?? Date.now(); - this[kState] = { - blobLike, - name: n, - type: t, - lastModified: d - }; - } - stream(...args) { - webidl.brandCheck(this, _FileLike); - return this[kState].blobLike.stream(...args); - } - arrayBuffer(...args) { - webidl.brandCheck(this, _FileLike); - return this[kState].blobLike.arrayBuffer(...args); - } - slice(...args) { - webidl.brandCheck(this, _FileLike); - return this[kState].blobLike.slice(...args); - } - text(...args) { - webidl.brandCheck(this, _FileLike); - return this[kState].blobLike.text(...args); - } - get size() { - webidl.brandCheck(this, _FileLike); - return this[kState].blobLike.size; - } - get type() { - webidl.brandCheck(this, _FileLike); - return this[kState].blobLike.type; - } - get name() { - webidl.brandCheck(this, _FileLike); - return this[kState].name; - } - get lastModified() { - webidl.brandCheck(this, _FileLike); - return this[kState].lastModified; - } - get [Symbol.toStringTag]() { - return "File"; - } + environmentSettingsObject, + isOriginIPPotentiallyTrustworthy }; - webidl.converters.Blob = webidl.interfaceConverter(Blob2); - function isFileLike(object) { - return object instanceof File || object && (typeof object.stream === "function" || typeof object.arrayBuffer === "function") && object[Symbol.toStringTag] === "File"; - } - __name(isFileLike, "isFileLike"); - module2.exports = { FileLike, isFileLike }; } }); @@ -5024,10 +5499,8 @@ var require_file = __commonJS({ var require_formdata = __commonJS({ "lib/web/fetch/formdata.js"(exports2, module2) { "use strict"; - var { isBlobLike, iteratorMixin } = require_util2(); - var { kState } = require_symbols2(); + var { iteratorMixin } = require_util2(); var { kEnumerableProperty } = require_util(); - var { FileLike, isFileLike } = require_file(); var { webidl } = require_webidl(); var { File: NativeFile } = require("node:buffer"); var nodeUtil = require("node:util"); @@ -5036,6 +5509,7 @@ var require_formdata = __commonJS({ static { __name(this, "FormData"); } + #state = []; constructor(form) { webidl.util.markAsUncloneable(this); if (form !== void 0) { @@ -5045,81 +5519,82 @@ var require_formdata = __commonJS({ types: ["undefined"] }); } - this[kState] = []; } append(name, value, filename = void 0) { webidl.brandCheck(this, _FormData); const prefix = "FormData.append"; webidl.argumentLengthCheck(arguments, 2, prefix); - if (arguments.length === 3 && !isBlobLike(value)) { - throw new TypeError( - "Failed to execute 'append' on 'FormData': parameter 2 is not of type 'Blob'" - ); + name = webidl.converters.USVString(name); + if (arguments.length === 3 || webidl.is.Blob(value)) { + value = webidl.converters.Blob(value, prefix, "value"); + if (filename !== void 0) { + filename = webidl.converters.USVString(filename); + } + } else { + value = webidl.converters.USVString(value); } - name = webidl.converters.USVString(name, prefix, "name"); - value = isBlobLike(value) ? webidl.converters.Blob(value, prefix, "value", { strict: false }) : webidl.converters.USVString(value, prefix, "value"); - filename = arguments.length === 3 ? webidl.converters.USVString(filename, prefix, "filename") : void 0; const entry = makeEntry(name, value, filename); - this[kState].push(entry); + this.#state.push(entry); } delete(name) { webidl.brandCheck(this, _FormData); const prefix = "FormData.delete"; webidl.argumentLengthCheck(arguments, 1, prefix); - name = webidl.converters.USVString(name, prefix, "name"); - this[kState] = this[kState].filter((entry) => entry.name !== name); + name = webidl.converters.USVString(name); + this.#state = this.#state.filter((entry) => entry.name !== name); } get(name) { webidl.brandCheck(this, _FormData); const prefix = "FormData.get"; webidl.argumentLengthCheck(arguments, 1, prefix); - name = webidl.converters.USVString(name, prefix, "name"); - const idx = this[kState].findIndex((entry) => entry.name === name); + name = webidl.converters.USVString(name); + const idx = this.#state.findIndex((entry) => entry.name === name); if (idx === -1) { return null; } - return this[kState][idx].value; + return this.#state[idx].value; } getAll(name) { webidl.brandCheck(this, _FormData); const prefix = "FormData.getAll"; webidl.argumentLengthCheck(arguments, 1, prefix); - name = webidl.converters.USVString(name, prefix, "name"); - return this[kState].filter((entry) => entry.name === name).map((entry) => entry.value); + name = webidl.converters.USVString(name); + return this.#state.filter((entry) => entry.name === name).map((entry) => entry.value); } has(name) { webidl.brandCheck(this, _FormData); const prefix = "FormData.has"; webidl.argumentLengthCheck(arguments, 1, prefix); - name = webidl.converters.USVString(name, prefix, "name"); - return this[kState].findIndex((entry) => entry.name === name) !== -1; + name = webidl.converters.USVString(name); + return this.#state.findIndex((entry) => entry.name === name) !== -1; } set(name, value, filename = void 0) { webidl.brandCheck(this, _FormData); const prefix = "FormData.set"; webidl.argumentLengthCheck(arguments, 2, prefix); - if (arguments.length === 3 && !isBlobLike(value)) { - throw new TypeError( - "Failed to execute 'set' on 'FormData': parameter 2 is not of type 'Blob'" - ); + name = webidl.converters.USVString(name); + if (arguments.length === 3 || webidl.is.Blob(value)) { + value = webidl.converters.Blob(value, prefix, "value"); + if (filename !== void 0) { + filename = webidl.converters.USVString(filename); + } + } else { + value = webidl.converters.USVString(value); } - name = webidl.converters.USVString(name, prefix, "name"); - value = isBlobLike(value) ? webidl.converters.Blob(value, prefix, "name", { strict: false }) : webidl.converters.USVString(value, prefix, "name"); - filename = arguments.length === 3 ? webidl.converters.USVString(filename, prefix, "name") : void 0; const entry = makeEntry(name, value, filename); - const idx = this[kState].findIndex((entry2) => entry2.name === name); + const idx = this.#state.findIndex((entry2) => entry2.name === name); if (idx !== -1) { - this[kState] = [ - ...this[kState].slice(0, idx), + this.#state = [ + ...this.#state.slice(0, idx), entry, - ...this[kState].slice(idx + 1).filter((entry2) => entry2.name !== name) + ...this.#state.slice(idx + 1).filter((entry2) => entry2.name !== name) ]; } else { - this[kState].push(entry); + this.#state.push(entry); } } [nodeUtil.inspect.custom](depth, options) { - const state = this[kState].reduce((a, b) => { + const state = this.#state.reduce((a, b) => { if (a[b.name]) { if (Array.isArray(a[b.name])) { a[b.name].push(b.value); @@ -5136,8 +5611,24 @@ var require_formdata = __commonJS({ const output = nodeUtil.formatWithOptions(options, state); return `FormData ${output.slice(output.indexOf("]") + 2)}`; } + /** + * @param {FormData} formData + */ + static getFormDataState(formData) { + return formData.#state; + } + /** + * @param {FormData} formData + * @param {any[]} newState + */ + static setFormDataState(formData, newState) { + formData.#state = newState; + } }; - iteratorMixin("FormData", FormData, kState, "name", "value"); + var { getFormDataState, setFormDataState } = FormData; + Reflect.deleteProperty(FormData, "getFormDataState"); + Reflect.deleteProperty(FormData, "setFormDataState"); + iteratorMixin("FormData", FormData, getFormDataState, "name", "value"); Object.defineProperties(FormData.prototype, { append: kEnumerableProperty, delete: kEnumerableProperty, @@ -5153,21 +5644,22 @@ var require_formdata = __commonJS({ function makeEntry(name, value, filename) { if (typeof value === "string") { } else { - if (!isFileLike(value)) { - value = value instanceof Blob ? new File([value], "blob", { type: value.type }) : new FileLike(value, "blob", { type: value.type }); + if (!webidl.is.File(value)) { + value = new File([value], "blob", { type: value.type }); } if (filename !== void 0) { const options = { type: value.type, lastModified: value.lastModified }; - value = value instanceof NativeFile ? new File([value], filename, options) : new FileLike(value, filename, options); + value = new File([value], filename, options); } } return { name, value }; } __name(makeEntry, "makeEntry"); - module2.exports = { FormData, makeEntry }; + webidl.is.FormData = webidl.util.MakeTypeAssertion(FormData); + module2.exports = { FormData, makeEntry, setFormDataState }; } }); @@ -5178,13 +5670,13 @@ var require_formdata_parser = __commonJS({ var { isUSVString, bufferToLowerCasedHeaderName } = require_util(); var { utf8DecodeBytes } = require_util2(); var { HTTP_TOKEN_CODEPOINTS, isomorphicDecode } = require_data_url(); - var { isFileLike } = require_file(); var { makeEntry } = require_formdata(); + var { webidl } = require_webidl(); var assert = require("node:assert"); var { File: NodeFile } = require("node:buffer"); var File = globalThis.File ?? NodeFile; var formDataNameBuffer = Buffer.from('form-data; name="'); - var filenameBuffer = Buffer.from("; filename"); + var filenameBuffer = Buffer.from("filename"); var dd = Buffer.from("--"); var ddcrlf = Buffer.from("--\r\n"); function isAsciiString(chars) { @@ -5214,7 +5706,7 @@ var require_formdata_parser = __commonJS({ assert(mimeType !== "failure" && mimeType.essence === "multipart/form-data"); const boundaryString = mimeType.parameters.get("boundary"); if (boundaryString === void 0) { - return "failure"; + throw parsingError("missing boundary in content-type header"); } const boundary = Buffer.from(`--${boundaryString}`, "utf8"); const entryList = []; @@ -5233,26 +5725,23 @@ var require_formdata_parser = __commonJS({ if (input.subarray(position.position, position.position + boundary.length).equals(boundary)) { position.position += boundary.length; } else { - return "failure"; + throw parsingError("expected a value starting with -- and the boundary"); } if (position.position === input.length - 2 && bufferStartsWith(input, dd, position) || position.position === input.length - 4 && bufferStartsWith(input, ddcrlf, position)) { return entryList; } if (input[position.position] !== 13 || input[position.position + 1] !== 10) { - return "failure"; + throw parsingError("expected CRLF"); } position.position += 2; const result = parseMultipartFormDataHeaders(input, position); - if (result === "failure") { - return "failure"; - } let { name, filename, contentType, encoding } = result; position.position += 2; let body; { const boundaryIndex = input.indexOf(boundary.subarray(2), position.position); if (boundaryIndex === -1) { - return "failure"; + throw parsingError("expected boundary after body"); } body = input.subarray(position.position, boundaryIndex - 4); position.position += body.length; @@ -5261,7 +5750,7 @@ var require_formdata_parser = __commonJS({ } } if (input[position.position] !== 13 || input[position.position + 1] !== 10) { - return "failure"; + throw parsingError("expected CRLF"); } else { position.position += 2; } @@ -5276,7 +5765,7 @@ var require_formdata_parser = __commonJS({ value = utf8DecodeBytes(Buffer.from(body)); } assert(isUSVString(name)); - assert(typeof value === "string" && isUSVString(value) || isFileLike(value)); + assert(typeof value === "string" && isUSVString(value) || webidl.is.File(value)); entryList.push(makeEntry(name, value, filename)); } } @@ -5289,7 +5778,7 @@ var require_formdata_parser = __commonJS({ while (true) { if (input[position.position] === 13 && input[position.position + 1] === 10) { if (name === null) { - return "failure"; + throw parsingError("header name is null"); } return { name, filename, contentType, encoding }; } @@ -5300,10 +5789,10 @@ var require_formdata_parser = __commonJS({ ); headerName = removeChars(headerName, true, true, (char) => char === 9 || char === 32); if (!HTTP_TOKEN_CODEPOINTS.test(headerName.toString())) { - return "failure"; + throw parsingError("header name does not match the field-name token production"); } if (input[position.position] !== 58) { - return "failure"; + throw parsingError("expected :"); } position.position++; collectASequenceOfBytes( @@ -5315,26 +5804,45 @@ var require_formdata_parser = __commonJS({ case "content-disposition": { name = filename = null; if (!bufferStartsWith(input, formDataNameBuffer, position)) { - return "failure"; + throw parsingError('expected form-data; name=" for content-disposition header'); } position.position += 17; name = parseMultipartFormDataName(input, position); - if (name === null) { - return "failure"; - } - if (bufferStartsWith(input, filenameBuffer, position)) { - let check = position.position + filenameBuffer.length; - if (input[check] === 42) { - position.position += 1; - check += 1; - } - if (input[check] !== 61 || input[check + 1] !== 34) { - return "failure"; - } - position.position += 12; - filename = parseMultipartFormDataName(input, position); - if (filename === null) { - return "failure"; + if (input[position.position] === 59 && input[position.position + 1] === 32) { + const at = { position: position.position + 2 }; + if (bufferStartsWith(input, filenameBuffer, at)) { + if (input[at.position + 8] === 42) { + at.position += 10; + collectASequenceOfBytes( + (char) => char === 32 || char === 9, + input, + at + ); + const headerValue = collectASequenceOfBytes( + (char) => char !== 32 && char !== 13 && char !== 10, + // ' ' or CRLF + input, + at + ); + if (headerValue[0] !== 117 && headerValue[0] !== 85 || // u or U + headerValue[1] !== 116 && headerValue[1] !== 84 || // t or T + headerValue[2] !== 102 && headerValue[2] !== 70 || // f or F + headerValue[3] !== 45 || // - + headerValue[4] !== 56) { + throw parsingError("unknown encoding, expected utf-8''"); + } + filename = decodeURIComponent(new TextDecoder().decode(headerValue.subarray(7))); + position.position = at.position; + } else { + position.position += 11; + collectASequenceOfBytes( + (char) => char === 32 || char === 9, + input, + position + ); + position.position++; + filename = parseMultipartFormDataName(input, position); + } } } break; @@ -5368,7 +5876,7 @@ var require_formdata_parser = __commonJS({ } } if (input[position.position] !== 13 && input[position.position + 1] !== 10) { - return "failure"; + throw parsingError("expected CRLF"); } else { position.position += 2; } @@ -5383,7 +5891,7 @@ var require_formdata_parser = __commonJS({ position ); if (input[position.position] !== 34) { - return null; + throw parsingError('expected "'); } else { position.position++; } @@ -5403,12 +5911,10 @@ var require_formdata_parser = __commonJS({ let lead = 0; let trail = buf.length - 1; if (leading) { - while (lead < buf.length && predicate(buf[lead])) - lead++; + while (lead < buf.length && predicate(buf[lead])) lead++; } if (trailing) { - while (trail > 0 && predicate(buf[trail])) - trail--; + while (trail > 0 && predicate(buf[trail])) trail--; } return lead === 0 && trail === buf.length - 1 ? buf : buf.subarray(lead, trail + 1); } @@ -5425,6 +5931,10 @@ var require_formdata_parser = __commonJS({ return true; } __name(bufferStartsWith, "bufferStartsWith"); + function parsingError(cause) { + return new TypeError("Failed to parse body as FormData.", { cause: new TypeError(cause) }); + } + __name(parsingError, "parsingError"); module2.exports = { multipartFormDataParser, validateBoundary @@ -5439,16 +5949,13 @@ var require_body = __commonJS({ var util = require_util(); var { ReadableStreamFrom, - isBlobLike, - isReadableStreamLike, readableStreamClose, createDeferredPromise, fullyReadBody, extractMimeType, utf8DecodeBytes } = require_util2(); - var { FormData } = require_formdata(); - var { kState } = require_symbols2(); + var { FormData, setFormDataState } = require_formdata(); var { webidl } = require_webidl(); var { Blob: Blob2 } = require("node:buffer"); var assert = require("node:assert"); @@ -5472,9 +5979,9 @@ var require_body = __commonJS({ } function extractBody(object, keepalive = false) { let stream = null; - if (object instanceof ReadableStream) { + if (webidl.is.ReadableStream(object)) { stream = object; - } else if (isBlobLike(object)) { + } else if (webidl.is.Blob(object)) { stream = object.stream(); } else { stream = new ReadableStream({ @@ -5490,7 +5997,7 @@ var require_body = __commonJS({ type: "bytes" }); } - assert(isReadableStreamLike(stream)); + assert(webidl.is.ReadableStream(stream)); let action = null; let source = null; let length = null; @@ -5498,14 +6005,14 @@ var require_body = __commonJS({ if (typeof object === "string") { source = object; type = "text/plain;charset=UTF-8"; - } else if (object instanceof URLSearchParams) { + } else if (webidl.is.URLSearchParams(object)) { source = object.toString(); type = "application/x-www-form-urlencoded;charset=UTF-8"; } else if (isArrayBuffer(object)) { source = new Uint8Array(object.slice()); } else if (ArrayBuffer.isView(object)) { source = new Uint8Array(object.buffer.slice(object.byteOffset, object.byteOffset + object.byteLength)); - } else if (util.isFormDataLike(object)) { + } else if (webidl.is.FormData(object)) { const boundary = `----formdata-undici-0${`${Math.floor(Math.random() * 1e11)}`.padStart(11, "0")}`; const prefix = `--${boundary}\r Content-Disposition: form-data`; @@ -5536,7 +6043,8 @@ Content-Type: ${value.type || "application/octet-stream"}\r } } } - const chunk = textEncoder.encode(`--${boundary}--`); + const chunk = textEncoder.encode(`--${boundary}--\r +`); blobParts.push(chunk); length += chunk.byteLength; if (hasUnknownSizeValue) { @@ -5553,7 +6061,7 @@ Content-Type: ${value.type || "application/octet-stream"}\r } }, "action"); type = `multipart/form-data; boundary=${boundary}`; - } else if (isBlobLike(object)) { + } else if (webidl.is.Blob(object)) { source = object; length = object.size; if (object.type) { @@ -5568,7 +6076,7 @@ Content-Type: ${value.type || "application/octet-stream"}\r "Response body object should not be disturbed or locked" ); } - stream = object instanceof ReadableStream ? object : ReadableStreamFrom(object); + stream = webidl.is.ReadableStream(object) ? object : ReadableStreamFrom(object); } if (typeof source === "string" || util.isBuffer(source)) { length = Buffer.byteLength(source); @@ -5607,7 +6115,7 @@ Content-Type: ${value.type || "application/octet-stream"}\r } __name(extractBody, "extractBody"); function safelyExtractBody(object, keepalive = false) { - if (object instanceof ReadableStream) { + if (webidl.is.ReadableStream(object)) { assert(!util.isDisturbed(object), "The body has already been consumed."); assert(!object.locked, "The stream is locked."); } @@ -5633,42 +6141,39 @@ Content-Type: ${value.type || "application/octet-stream"}\r } } __name(throwIfAborted, "throwIfAborted"); - function bodyMixinMethods(instance) { + function bodyMixinMethods(instance, getInternalState) { const methods = { blob() { return consumeBody(this, (bytes) => { - let mimeType = bodyMimeType(this); + let mimeType = bodyMimeType(getInternalState(this)); if (mimeType === null) { mimeType = ""; } else if (mimeType) { mimeType = serializeAMimeType(mimeType); } return new Blob2([bytes], { type: mimeType }); - }, instance); + }, instance, getInternalState); }, arrayBuffer() { return consumeBody(this, (bytes) => { return new Uint8Array(bytes).buffer; - }, instance); + }, instance, getInternalState); }, text() { - return consumeBody(this, utf8DecodeBytes, instance); + return consumeBody(this, utf8DecodeBytes, instance, getInternalState); }, json() { - return consumeBody(this, parseJSONFromBytes, instance); + return consumeBody(this, parseJSONFromBytes, instance, getInternalState); }, formData() { return consumeBody(this, (value) => { - const mimeType = bodyMimeType(this); + const mimeType = bodyMimeType(getInternalState(this)); if (mimeType !== null) { switch (mimeType.essence) { case "multipart/form-data": { const parsed = multipartFormDataParser(value, mimeType); - if (parsed === "failure") { - throw new TypeError("Failed to parse body as FormData."); - } const fd = new FormData(); - fd[kState] = parsed; + setFormDataState(fd, parsed); return fd; } case "application/x-www-form-urlencoded": { @@ -5684,27 +6189,28 @@ Content-Type: ${value.type || "application/octet-stream"}\r throw new TypeError( 'Content-Type was not one of "multipart/form-data" or "application/x-www-form-urlencoded".' ); - }, instance); + }, instance, getInternalState); }, bytes() { return consumeBody(this, (bytes) => { return new Uint8Array(bytes); - }, instance); + }, instance, getInternalState); } }; return methods; } __name(bodyMixinMethods, "bodyMixinMethods"); - function mixinBody(prototype) { - Object.assign(prototype.prototype, bodyMixinMethods(prototype)); + function mixinBody(prototype, getInternalState) { + Object.assign(prototype.prototype, bodyMixinMethods(prototype, getInternalState)); } __name(mixinBody, "mixinBody"); - async function consumeBody(object, convertBytesToJSValue, instance) { + async function consumeBody(object, convertBytesToJSValue, instance, getInternalState) { webidl.brandCheck(object, instance); - if (bodyUnusable(object)) { + const state = getInternalState(object); + if (bodyUnusable(state)) { throw new TypeError("Body is unusable: Body has already been read"); } - throwIfAborted(object[kState]); + throwIfAborted(state); const promise = createDeferredPromise(); const errorSteps = /* @__PURE__ */ __name((error) => promise.reject(error), "errorSteps"); const successSteps = /* @__PURE__ */ __name((data) => { @@ -5714,16 +6220,16 @@ Content-Type: ${value.type || "application/octet-stream"}\r errorSteps(e); } }, "successSteps"); - if (object[kState].body == null) { + if (state.body == null) { successSteps(Buffer.allocUnsafe(0)); return promise.promise; } - await fullyReadBody(object[kState].body, successSteps, errorSteps); + fullyReadBody(state.body, successSteps, errorSteps); return promise.promise; } __name(consumeBody, "consumeBody"); function bodyUnusable(object) { - const body = object[kState].body; + const body = object.body; return body != null && (body.stream.locked || util.isDisturbed(body.stream)); } __name(bodyUnusable, "bodyUnusable"); @@ -5732,7 +6238,7 @@ Content-Type: ${value.type || "application/octet-stream"}\r } __name(parseJSONFromBytes, "parseJSONFromBytes"); function bodyMimeType(requestOrResponse) { - const headers = requestOrResponse[kState].headersList; + const headers = requestOrResponse.headersList; const mimeType = extractMimeType(headers); if (mimeType === "failure") { return null; @@ -5803,12 +6309,12 @@ var require_client_h1 = __commonJS({ kMaxResponseSize, kOnError, kResume, - kHTTPContext + kHTTPContext, + kClosed } = require_symbols(); var constants = require_constants2(); var EMPTY_BUF = Buffer.alloc(0); var FastBuffer = Buffer[Symbol.species]; - var addListener = util.addListener; var removeAllListeners = util.removeAllListeners; var extractBody; async function lazyllhttp() { @@ -5821,43 +6327,86 @@ var require_client_h1 = __commonJS({ } return await WebAssembly.instantiate(mod, { env: { - /* eslint-disable camelcase */ - wasm_on_url: (p, at, len) => { + /** + * @param {number} p + * @param {number} at + * @param {number} len + * @returns {number} + */ + wasm_on_url: /* @__PURE__ */ __name((p, at, len) => { return 0; - }, - wasm_on_status: (p, at, len) => { + }, "wasm_on_url"), + /** + * @param {number} p + * @param {number} at + * @param {number} len + * @returns {number} + */ + wasm_on_status: /* @__PURE__ */ __name((p, at, len) => { assert(currentParser.ptr === p); const start = at - currentBufferPtr + currentBufferRef.byteOffset; - return currentParser.onStatus(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; - }, - wasm_on_message_begin: (p) => { + return currentParser.onStatus(new FastBuffer(currentBufferRef.buffer, start, len)); + }, "wasm_on_status"), + /** + * @param {number} p + * @returns {number} + */ + wasm_on_message_begin: /* @__PURE__ */ __name((p) => { assert(currentParser.ptr === p); - return currentParser.onMessageBegin() || 0; - }, - wasm_on_header_field: (p, at, len) => { + return currentParser.onMessageBegin(); + }, "wasm_on_message_begin"), + /** + * @param {number} p + * @param {number} at + * @param {number} len + * @returns {number} + */ + wasm_on_header_field: /* @__PURE__ */ __name((p, at, len) => { assert(currentParser.ptr === p); const start = at - currentBufferPtr + currentBufferRef.byteOffset; - return currentParser.onHeaderField(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; - }, - wasm_on_header_value: (p, at, len) => { + return currentParser.onHeaderField(new FastBuffer(currentBufferRef.buffer, start, len)); + }, "wasm_on_header_field"), + /** + * @param {number} p + * @param {number} at + * @param {number} len + * @returns {number} + */ + wasm_on_header_value: /* @__PURE__ */ __name((p, at, len) => { assert(currentParser.ptr === p); const start = at - currentBufferPtr + currentBufferRef.byteOffset; - return currentParser.onHeaderValue(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; - }, - wasm_on_headers_complete: (p, statusCode, upgrade, shouldKeepAlive) => { + return currentParser.onHeaderValue(new FastBuffer(currentBufferRef.buffer, start, len)); + }, "wasm_on_header_value"), + /** + * @param {number} p + * @param {number} statusCode + * @param {0|1} upgrade + * @param {0|1} shouldKeepAlive + * @returns {number} + */ + wasm_on_headers_complete: /* @__PURE__ */ __name((p, statusCode, upgrade, shouldKeepAlive) => { assert(currentParser.ptr === p); - return currentParser.onHeadersComplete(statusCode, Boolean(upgrade), Boolean(shouldKeepAlive)) || 0; - }, - wasm_on_body: (p, at, len) => { + return currentParser.onHeadersComplete(statusCode, upgrade === 1, shouldKeepAlive === 1); + }, "wasm_on_headers_complete"), + /** + * @param {number} p + * @param {number} at + * @param {number} len + * @returns {number} + */ + wasm_on_body: /* @__PURE__ */ __name((p, at, len) => { assert(currentParser.ptr === p); const start = at - currentBufferPtr + currentBufferRef.byteOffset; - return currentParser.onBody(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; - }, - wasm_on_message_complete: (p) => { + return currentParser.onBody(new FastBuffer(currentBufferRef.buffer, start, len)); + }, "wasm_on_body"), + /** + * @param {number} p + * @returns {number} + */ + wasm_on_message_complete: /* @__PURE__ */ __name((p) => { assert(currentParser.ptr === p); - return currentParser.onMessageComplete() || 0; - } - /* eslint-enable camelcase */ + return currentParser.onMessageComplete(); + }, "wasm_on_message_complete") } }); } @@ -5878,8 +6427,12 @@ var require_client_h1 = __commonJS({ static { __name(this, "Parser"); } + /** + * @param {import('./client.js')} client + * @param {import('net').Socket} socket + * @param {*} llhttp + */ constructor(client, socket, { exports: exports3 }) { - assert(Number.isFinite(client[kMaxHeadersSize]) && client[kMaxHeadersSize] > 0); this.llhttp = exports3; this.ptr = this.llhttp.llhttp_alloc(constants.TYPE.RESPONSE); this.client = client; @@ -5887,7 +6440,7 @@ var require_client_h1 = __commonJS({ this.timeout = null; this.timeoutValue = null; this.timeoutType = null; - this.statusCode = null; + this.statusCode = 0; this.statusText = ""; this.upgrade = false; this.headers = []; @@ -5929,7 +6482,7 @@ var require_client_h1 = __commonJS({ return; } assert(this.ptr != null); - assert(currentParser == null); + assert(currentParser === null); this.llhttp.llhttp_resume(this.ptr); assert(this.timeoutType === TIMEOUT_BODY); if (this.timeout) { @@ -5950,53 +6503,58 @@ var require_client_h1 = __commonJS({ this.execute(chunk); } } - execute(data) { + /** + * @param {Buffer} chunk + */ + execute(chunk) { + assert(currentParser === null); assert(this.ptr != null); - assert(currentParser == null); assert(!this.paused); const { socket, llhttp } = this; - if (data.length > currentBufferSize) { + if (chunk.length > currentBufferSize) { if (currentBufferPtr) { llhttp.free(currentBufferPtr); } - currentBufferSize = Math.ceil(data.length / 4096) * 4096; + currentBufferSize = Math.ceil(chunk.length / 4096) * 4096; currentBufferPtr = llhttp.malloc(currentBufferSize); } - new Uint8Array(llhttp.memory.buffer, currentBufferPtr, currentBufferSize).set(data); + new Uint8Array(llhttp.memory.buffer, currentBufferPtr, currentBufferSize).set(chunk); try { let ret; try { - currentBufferRef = data; + currentBufferRef = chunk; currentParser = this; - ret = llhttp.llhttp_execute(this.ptr, currentBufferPtr, data.length); + ret = llhttp.llhttp_execute(this.ptr, currentBufferPtr, chunk.length); } catch (err) { throw err; } finally { currentParser = null; currentBufferRef = null; } - const offset = llhttp.llhttp_get_error_pos(this.ptr) - currentBufferPtr; - if (ret === constants.ERROR.PAUSED_UPGRADE) { - this.onUpgrade(data.slice(offset)); - } else if (ret === constants.ERROR.PAUSED) { - this.paused = true; - socket.unshift(data.slice(offset)); - } else if (ret !== constants.ERROR.OK) { - const ptr = llhttp.llhttp_get_error_reason(this.ptr); - let message = ""; - if (ptr) { - const len = new Uint8Array(llhttp.memory.buffer, ptr).indexOf(0); - message = "Response does not match the HTTP/1.1 protocol (" + Buffer.from(llhttp.memory.buffer, ptr, len).toString() + ")"; + if (ret !== constants.ERROR.OK) { + const data = chunk.subarray(llhttp.llhttp_get_error_pos(this.ptr) - currentBufferPtr); + if (ret === constants.ERROR.PAUSED_UPGRADE) { + this.onUpgrade(data); + } else if (ret === constants.ERROR.PAUSED) { + this.paused = true; + socket.unshift(data); + } else { + const ptr = llhttp.llhttp_get_error_reason(this.ptr); + let message = ""; + if (ptr) { + const len = new Uint8Array(llhttp.memory.buffer, ptr).indexOf(0); + message = "Response does not match the HTTP/1.1 protocol (" + Buffer.from(llhttp.memory.buffer, ptr, len).toString() + ")"; + } + throw new HTTPParserError(message, constants.ERROR[ret], data); } - throw new HTTPParserError(message, constants.ERROR[ret], data.slice(offset)); } } catch (err) { util.destroy(socket, err); } } destroy() { + assert(currentParser === null); assert(this.ptr != null); - assert(currentParser == null); this.llhttp.llhttp_free(this.ptr); this.ptr = null; this.timeout && timers.clearTimeout(this.timeout); @@ -6005,9 +6563,17 @@ var require_client_h1 = __commonJS({ this.timeoutType = null; this.paused = false; } + /** + * @param {Buffer} buf + * @returns {0} + */ onStatus(buf) { this.statusText = buf.toString(); + return 0; } + /** + * @returns {0|-1} + */ onMessageBegin() { const { socket, client } = this; if (socket.destroyed) { @@ -6018,7 +6584,12 @@ var require_client_h1 = __commonJS({ return -1; } request.onResponseStarted(); + return 0; } + /** + * @param {Buffer} buf + * @returns {number} + */ onHeaderField(buf) { const len = this.headers.length; if ((len & 1) === 0) { @@ -6027,7 +6598,12 @@ var require_client_h1 = __commonJS({ this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]); } this.trackHeader(buf.length); + return 0; } + /** + * @param {Buffer} buf + * @returns {number} + */ onHeaderValue(buf) { let len = this.headers.length; if ((len & 1) === 1) { @@ -6048,13 +6624,20 @@ var require_client_h1 = __commonJS({ this.contentLength += buf.toString(); } this.trackHeader(buf.length); + return 0; } + /** + * @param {number} len + */ trackHeader(len) { this.headersSize += len; if (this.headersSize >= this.headersMaxSize) { util.destroy(this.socket, new HeadersOverflowError()); } } + /** + * @param {Buffer} head + */ onUpgrade(head) { const { upgrade, client, socket, headers, statusCode } = this; assert(upgrade); @@ -6065,9 +6648,9 @@ var require_client_h1 = __commonJS({ const request = client[kQueue][client[kRunningIdx]]; assert(request); assert(request.upgrade || request.method === "CONNECT"); - this.statusCode = null; + this.statusCode = 0; this.statusText = ""; - this.shouldKeepAlive = null; + this.shouldKeepAlive = false; this.headers = []; this.headersSize = 0; socket.unshift(head); @@ -6087,6 +6670,12 @@ var require_client_h1 = __commonJS({ } client[kResume](); } + /** + * @param {number} statusCode + * @param {boolean} upgrade + * @param {boolean} shouldKeepAlive + * @returns {number} + */ onHeadersComplete(statusCode, upgrade, shouldKeepAlive) { const { client, socket, headers, statusText } = this; if (socket.destroyed) { @@ -6165,6 +6754,10 @@ var require_client_h1 = __commonJS({ } return pause ? constants.ERROR.PAUSED : 0; } + /** + * @param {Buffer} buf + * @returns {number} + */ onBody(buf) { const { client, socket, statusCode, maxResponseSize } = this; if (socket.destroyed) { @@ -6187,20 +6780,24 @@ var require_client_h1 = __commonJS({ if (request.onData(buf) === false) { return constants.ERROR.PAUSED; } + return 0; } + /** + * @returns {number} + */ onMessageComplete() { const { client, socket, statusCode, upgrade, headers, contentLength, bytesRead, shouldKeepAlive } = this; if (socket.destroyed && (!statusCode || shouldKeepAlive)) { return -1; } if (upgrade) { - return; + return 0; } assert(statusCode >= 100); assert((this.headers.length & 1) === 0); const request = client[kQueue][client[kRunningIdx]]; assert(request); - this.statusCode = null; + this.statusCode = 0; this.statusText = ""; this.bytesRead = 0; this.contentLength = ""; @@ -6209,7 +6806,7 @@ var require_client_h1 = __commonJS({ this.headers = []; this.headersSize = 0; if (statusCode < 200) { - return; + return 0; } if (request.method !== "HEAD" && contentLength && bytesRead !== parseInt(contentLength, 10)) { util.destroy(socket, new ResponseContentLengthMismatchError()); @@ -6232,6 +6829,7 @@ var require_client_h1 = __commonJS({ } else { client[kResume](); } + return 0; } }; function onParserTimeout(parser) { @@ -6251,94 +6849,64 @@ var require_client_h1 = __commonJS({ } } __name(onParserTimeout, "onParserTimeout"); - async function connectH1(client, socket) { - client[kSocket] = socket; - if (!llhttpInstance) { - llhttpInstance = await llhttpPromise; - llhttpPromise = null; - } - socket[kNoRef] = false; - socket[kWriting] = false; - socket[kReset] = false; - socket[kBlocking] = false; - socket[kParser] = new Parser(client, socket, llhttpInstance); - addListener(socket, "error", function(err) { - assert(err.code !== "ERR_TLS_CERT_ALTNAME_INVALID"); - const parser = this[kParser]; - if (err.code === "ECONNRESET" && parser.statusCode && !parser.shouldKeepAlive) { - parser.onMessageComplete(); - return; - } - this[kError] = err; - this[kClient][kOnError](err); - }); - addListener(socket, "readable", function() { - const parser = this[kParser]; - if (parser) { - parser.readMore(); - } - }); - addListener(socket, "end", function() { - const parser = this[kParser]; - if (parser.statusCode && !parser.shouldKeepAlive) { - parser.onMessageComplete(); - return; - } - util.destroy(this, new SocketError("other side closed", util.getSocketInfo(this))); - }); - addListener(socket, "close", function() { - const client2 = this[kClient]; - const parser = this[kParser]; - if (parser) { - if (!this[kError] && parser.statusCode && !parser.shouldKeepAlive) { - parser.onMessageComplete(); - } - this[kParser].destroy(); - this[kParser] = null; - } - const err = this[kError] || new SocketError("closed", util.getSocketInfo(this)); - client2[kSocket] = null; - client2[kHTTPContext] = null; - if (client2.destroyed) { - assert(client2[kPending] === 0); - const requests = client2[kQueue].splice(client2[kRunningIdx]); - for (let i = 0; i < requests.length; i++) { - const request = requests[i]; - util.errorRequest(client2, request, err); - } - } else if (client2[kRunning] > 0 && err.code !== "UND_ERR_INFO") { - const request = client2[kQueue][client2[kRunningIdx]]; - client2[kQueue][client2[kRunningIdx]++] = null; - util.errorRequest(client2, request, err); - } - client2[kPendingIdx] = client2[kRunningIdx]; - assert(client2[kRunning] === 0); - client2.emit("disconnect", client2[kUrl], [client2], err); - client2[kResume](); - }); - let closed = false; - socket.on("close", () => { - closed = true; - }); + async function connectH1(client, socket) { + client[kSocket] = socket; + if (!llhttpInstance) { + const noop = /* @__PURE__ */ __name(() => { + }, "noop"); + socket.on("error", noop); + llhttpInstance = await llhttpPromise; + llhttpPromise = null; + socket.off("error", noop); + } + if (socket.errored) { + throw socket.errored; + } + if (socket.destroyed) { + throw new SocketError("destroyed"); + } + socket[kNoRef] = false; + socket[kWriting] = false; + socket[kReset] = false; + socket[kBlocking] = false; + socket[kParser] = new Parser(client, socket, llhttpInstance); + util.addListener(socket, "error", onHttpSocketError); + util.addListener(socket, "readable", onHttpSocketReadable); + util.addListener(socket, "end", onHttpSocketEnd); + util.addListener(socket, "close", onHttpSocketClose); + socket[kClosed] = false; + socket.on("close", onSocketClose); return { version: "h1", defaultPipelining: 1, - write(...args) { - return writeH1(client, ...args); + write(request) { + return writeH1(client, request); }, resume() { resumeH1(client); }, + /** + * @param {Error|undefined} err + * @param {() => void} callback + */ destroy(err, callback) { - if (closed) { + if (socket[kClosed]) { queueMicrotask(callback); } else { - socket.destroy(err).on("close", callback); + socket.on("close", callback); + socket.destroy(err); } }, + /** + * @returns {boolean} + */ get destroyed() { return socket.destroyed; }, + /** + * @param {import('../core/request.js')} request + * @returns {boolean} + */ busy(request) { if (socket[kWriting] || socket[kReset] || socket[kBlocking]) { return true; @@ -6359,6 +6927,65 @@ var require_client_h1 = __commonJS({ }; } __name(connectH1, "connectH1"); + function onHttpSocketError(err) { + assert(err.code !== "ERR_TLS_CERT_ALTNAME_INVALID"); + const parser = this[kParser]; + if (err.code === "ECONNRESET" && parser.statusCode && !parser.shouldKeepAlive) { + parser.onMessageComplete(); + return; + } + this[kError] = err; + this[kClient][kOnError](err); + } + __name(onHttpSocketError, "onHttpSocketError"); + function onHttpSocketReadable() { + this[kParser]?.readMore(); + } + __name(onHttpSocketReadable, "onHttpSocketReadable"); + function onHttpSocketEnd() { + const parser = this[kParser]; + if (parser.statusCode && !parser.shouldKeepAlive) { + parser.onMessageComplete(); + return; + } + util.destroy(this, new SocketError("other side closed", util.getSocketInfo(this))); + } + __name(onHttpSocketEnd, "onHttpSocketEnd"); + function onHttpSocketClose() { + const parser = this[kParser]; + if (parser) { + if (!this[kError] && parser.statusCode && !parser.shouldKeepAlive) { + parser.onMessageComplete(); + } + this[kParser].destroy(); + this[kParser] = null; + } + const err = this[kError] || new SocketError("closed", util.getSocketInfo(this)); + const client = this[kClient]; + client[kSocket] = null; + client[kHTTPContext] = null; + if (client.destroyed) { + assert(client[kPending] === 0); + const requests = client[kQueue].splice(client[kRunningIdx]); + for (let i = 0; i < requests.length; i++) { + const request = requests[i]; + util.errorRequest(client, request, err); + } + } else if (client[kRunning] > 0 && err.code !== "UND_ERR_INFO") { + const request = client[kQueue][client[kRunningIdx]]; + client[kQueue][client[kRunningIdx]++] = null; + util.errorRequest(client, request, err); + } + client[kPendingIdx] = client[kRunningIdx]; + assert(client[kRunning] === 0); + client.emit("disconnect", client[kUrl], [client], err); + client[kResume](); + } + __name(onHttpSocketClose, "onHttpSocketClose"); + function onSocketClose() { + this[kClosed] = true; + } + __name(onSocketClose, "onSocketClose"); function resumeH1(client) { const socket = client[kSocket]; if (socket && !socket.destroyed) { @@ -6679,6 +7306,17 @@ upgrade: ${upgrade}\r static { __name(this, "AsyncWriter"); } + /** + * + * @param {object} arg + * @param {AbortCallback} arg.abort + * @param {import('net').Socket} arg.socket + * @param {import('../core/request.js')} arg.request + * @param {number} arg.contentLength + * @param {import('./client.js')} arg.client + * @param {boolean} arg.expectsPayload + * @param {string} arg.header + */ constructor({ abort, socket, request, contentLength, client, expectsPayload, header }) { this.socket = socket; this.request = request; @@ -6690,6 +7328,10 @@ upgrade: ${upgrade}\r this.abort = abort; socket[kWriting] = true; } + /** + * @param {Buffer} chunk + * @returns + */ write(chunk) { const { socket, request, contentLength, client, bytesWritten, expectsPayload, header } = this; if (socket[kError]) { @@ -6740,6 +7382,9 @@ ${len.toString(16)}\r } return ret; } + /** + * @returns {void} + */ end() { const { socket, contentLength, client, bytesWritten, expectsPayload, header, request } = this; request.onRequestSent(); @@ -6776,6 +7421,10 @@ ${len.toString(16)}\r } client[kResume](); } + /** + * @param {Error} [err] + * @returns {void} + */ destroy(err) { const { socket, client, abort } = this; socket[kWriting] = false; @@ -6819,10 +7468,13 @@ var require_client_h2 = __commonJS({ kHTTP2Session, kResume, kSize, - kHTTPContext + kHTTPContext, + kClosed, + kBodyTimeout } = require_symbols(); + var { channels } = require_diagnostics(); var kOpenStreams = Symbol("open streams"); - var h2ExperimentalWarned = false; + var extractBody; var http2; try { http2 = require("node:http2"); @@ -6856,74 +7508,42 @@ var require_client_h2 = __commonJS({ __name(parseH2Headers, "parseH2Headers"); async function connectH2(client, socket) { client[kSocket] = socket; - if (!h2ExperimentalWarned) { - h2ExperimentalWarned = true; - process.emitWarning("H2 support is experimental, expect them to change at any time.", { - code: "UNDICI-H2" - }); - } const session = http2.connect(client[kUrl], { - createConnection: () => socket, - peerMaxConcurrentStreams: client[kMaxConcurrentStreams] + createConnection: /* @__PURE__ */ __name(() => socket, "createConnection"), + peerMaxConcurrentStreams: client[kMaxConcurrentStreams], + settings: { + // TODO(metcoder95): add support for PUSH + enablePush: false + } }); session[kOpenStreams] = 0; session[kClient] = client; session[kSocket] = socket; + session[kHTTP2Session] = null; util.addListener(session, "error", onHttp2SessionError); util.addListener(session, "frameError", onHttp2FrameError); util.addListener(session, "end", onHttp2SessionEnd); - util.addListener(session, "goaway", onHTTP2GoAway); - util.addListener(session, "close", function() { - const { [kClient]: client2 } = this; - const { [kSocket]: socket2 } = client2; - const err = this[kSocket][kError] || this[kError] || new SocketError("closed", util.getSocketInfo(socket2)); - client2[kHTTP2Session] = null; - if (client2.destroyed) { - assert(client2[kPending] === 0); - const requests = client2[kQueue].splice(client2[kRunningIdx]); - for (let i = 0; i < requests.length; i++) { - const request = requests[i]; - util.errorRequest(client2, request, err); - } - } - }); + util.addListener(session, "goaway", onHttp2SessionGoAway); + util.addListener(session, "close", onHttp2SessionClose); session.unref(); client[kHTTP2Session] = session; socket[kHTTP2Session] = session; - util.addListener(socket, "error", function(err) { - assert(err.code !== "ERR_TLS_CERT_ALTNAME_INVALID"); - this[kError] = err; - this[kClient][kOnError](err); - }); - util.addListener(socket, "end", function() { - util.destroy(this, new SocketError("other side closed", util.getSocketInfo(this))); - }); - util.addListener(socket, "close", function() { - const err = this[kError] || new SocketError("closed", util.getSocketInfo(this)); - client[kSocket] = null; - if (this[kHTTP2Session] != null) { - this[kHTTP2Session].destroy(err); - } - client[kPendingIdx] = client[kRunningIdx]; - assert(client[kRunning] === 0); - client.emit("disconnect", client[kUrl], [client], err); - client[kResume](); - }); - let closed = false; - socket.on("close", () => { - closed = true; - }); + util.addListener(socket, "error", onHttp2SocketError); + util.addListener(socket, "end", onHttp2SocketEnd); + util.addListener(socket, "close", onHttp2SocketClose); + socket[kClosed] = false; + socket.on("close", onSocketClose); return { version: "h2", defaultPipelining: Infinity, - write(...args) { - return writeH2(client, ...args); + write(request) { + return writeH2(client, request); }, resume() { resumeH2(client); }, destroy(err, callback) { - if (closed) { + if (socket[kClosed]) { queueMicrotask(callback); } else { socket.destroy(err).on("close", callback); @@ -6941,7 +7561,7 @@ var require_client_h2 = __commonJS({ function resumeH2(client) { const socket = client[kSocket]; if (socket?.destroyed === false) { - if (client[kSize] === 0 && client[kMaxConcurrentStreams] === 0) { + if (client[kSize] === 0 || client[kMaxConcurrentStreams] === 0) { socket.unref(); client[kHTTP2Session].unref(); } else { @@ -6971,32 +7591,78 @@ var require_client_h2 = __commonJS({ util.destroy(this[kSocket], err); } __name(onHttp2SessionEnd, "onHttp2SessionEnd"); - function onHTTP2GoAway(code) { - const err = this[kError] || new SocketError(`HTTP/2: "GOAWAY" frame received with code ${code}`, util.getSocketInfo(this)); + function onHttp2SessionGoAway(errorCode) { + const err = this[kError] || new SocketError(`HTTP/2: "GOAWAY" frame received with code ${errorCode}`, util.getSocketInfo(this[kSocket])); const client = this[kClient]; client[kSocket] = null; client[kHTTPContext] = null; - if (this[kHTTP2Session] != null) { + this.close(); + this[kHTTP2Session] = null; + util.destroy(this[kSocket], err); + if (client[kRunningIdx] < client[kQueue].length) { + const request = client[kQueue][client[kRunningIdx]]; + client[kQueue][client[kRunningIdx]++] = null; + util.errorRequest(client, request, err); + client[kPendingIdx] = client[kRunningIdx]; + } + assert(client[kRunning] === 0); + client.emit("disconnect", client[kUrl], [client], err); + client[kResume](); + } + __name(onHttp2SessionGoAway, "onHttp2SessionGoAway"); + function onHttp2SessionClose() { + const { [kClient]: client } = this; + const { [kSocket]: socket } = client; + const err = this[kSocket][kError] || this[kError] || new SocketError("closed", util.getSocketInfo(socket)); + client[kSocket] = null; + client[kHTTPContext] = null; + if (client.destroyed) { + assert(client[kPending] === 0); + const requests = client[kQueue].splice(client[kRunningIdx]); + for (let i = 0; i < requests.length; i++) { + const request = requests[i]; + util.errorRequest(client, request, err); + } + } + } + __name(onHttp2SessionClose, "onHttp2SessionClose"); + function onHttp2SocketClose() { + const err = this[kError] || new SocketError("closed", util.getSocketInfo(this)); + const client = this[kHTTP2Session][kClient]; + client[kSocket] = null; + client[kHTTPContext] = null; + if (this[kHTTP2Session] !== null) { this[kHTTP2Session].destroy(err); - this[kHTTP2Session] = null; } - util.destroy(this[kSocket], err); - const request = client[kQueue][client[kRunningIdx]]; - client[kQueue][client[kRunningIdx]++] = null; - util.errorRequest(client, request, err); client[kPendingIdx] = client[kRunningIdx]; assert(client[kRunning] === 0); client.emit("disconnect", client[kUrl], [client], err); client[kResume](); } - __name(onHTTP2GoAway, "onHTTP2GoAway"); + __name(onHttp2SocketClose, "onHttp2SocketClose"); + function onHttp2SocketError(err) { + assert(err.code !== "ERR_TLS_CERT_ALTNAME_INVALID"); + this[kError] = err; + this[kClient][kOnError](err); + } + __name(onHttp2SocketError, "onHttp2SocketError"); + function onHttp2SocketEnd() { + util.destroy(this, new SocketError("other side closed", util.getSocketInfo(this))); + } + __name(onHttp2SocketEnd, "onHttp2SocketEnd"); + function onSocketClose() { + this[kClosed] = true; + } + __name(onSocketClose, "onSocketClose"); function shouldSendContentLength(method) { return method !== "GET" && method !== "HEAD" && method !== "OPTIONS" && method !== "TRACE" && method !== "CONNECT"; } __name(shouldSendContentLength, "shouldSendContentLength"); function writeH2(client, request) { + const requestTimeout = request.bodyTimeout ?? client[kBodyTimeout]; const session = client[kHTTP2Session]; - const { body, method, path, host, upgrade, expectContinue, signal, headers: reqHeaders } = request; + const { method, path, host, upgrade, expectContinue, signal, headers: reqHeaders } = request; + let { body } = request; if (upgrade) { util.errorRequest(client, request, new Error("Upgrade not supported for H2")); return false; @@ -7017,7 +7683,7 @@ var require_client_h2 = __commonJS({ headers[key] = val; } } - let stream; + let stream = null; const { hostname, port } = client[kUrl]; headers[HTTP2_HEADER_AUTHORITY] = host || `${hostname}${port ? `:${port}` : ""}`; headers[HTTP2_HEADER_METHOD] = method; @@ -7028,11 +7694,12 @@ var require_client_h2 = __commonJS({ err = err || new RequestAbortedError(); util.errorRequest(client, request, err); if (stream != null) { - util.destroy(stream, err); + stream.removeAllListeners("data"); + stream.close(); + client[kOnError](err); + client[kResume](); } util.destroy(body, err); - client[kQueue][client[kRunningIdx]++] = null; - client[kResume](); }, "abort"); try { request.onConnect(abort); @@ -7045,7 +7712,7 @@ var require_client_h2 = __commonJS({ if (method === "CONNECT") { session.ref(); stream = session.request(headers, { endStream: false, signal }); - if (stream.id && !stream.pending) { + if (!stream.pending) { request.onUpgrade(null, null, stream); ++session[kOpenStreams]; client[kQueue][client[kRunningIdx]++] = null; @@ -7058,9 +7725,9 @@ var require_client_h2 = __commonJS({ } stream.once("close", () => { session[kOpenStreams] -= 1; - if (session[kOpenStreams] === 0) - session.unref(); + if (session[kOpenStreams] === 0) session.unref(); }); + stream.setTimeout(requestTimeout); return true; } headers[HTTP2_HEADER_PATH] = path; @@ -7070,6 +7737,13 @@ var require_client_h2 = __commonJS({ body.read(0); } let contentLength = util.bodyLength(body); + if (util.isFormDataLike(body)) { + extractBody ??= require_body().extractBody; + const [bodyStream, contentType] = extractBody(body); + headers["content-type"] = contentType; + body = bodyStream.stream; + contentLength = bodyStream.length; + } if (contentLength == null) { contentLength = request.contentLength; } @@ -7088,6 +7762,14 @@ var require_client_h2 = __commonJS({ headers[HTTP2_HEADER_CONTENT_LENGTH] = `${contentLength}`; } session.ref(); + if (channels.sendHeaders.hasSubscribers) { + let header = ""; + for (const key in headers) { + header += `${key}: ${headers[key]}\r +`; + } + channels.sendHeaders.publish({ request, headers: header, socket: session[kSocket] }); + } const shouldEndStream = method === "GET" || method === "HEAD" || body === null; if (expectContinue) { headers[HTTP2_HEADER_EXPECT] = "100-continue"; @@ -7101,48 +7783,75 @@ var require_client_h2 = __commonJS({ writeBodyH2(); } ++session[kOpenStreams]; + stream.setTimeout(requestTimeout); stream.once("response", (headers2) => { const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers2; request.onResponseStarted(); if (request.aborted) { - const err = new RequestAbortedError(); - util.errorRequest(client, request, err); - util.destroy(stream, err); + stream.removeAllListeners("data"); return; } if (request.onHeaders(Number(statusCode), parseH2Headers(realHeaders), stream.resume.bind(stream), "") === false) { stream.pause(); } - stream.on("data", (chunk) => { - if (request.onData(chunk) === false) { - stream.pause(); - } - }); }); - stream.once("end", () => { - if (stream.state?.state == null || stream.state.state < 6) { - request.onComplete([]); + stream.on("data", (chunk) => { + if (request.onData(chunk) === false) { + stream.pause(); } - if (session[kOpenStreams] === 0) { - session.unref(); + }); + stream.once("end", (err) => { + stream.removeAllListeners("data"); + if (stream.state?.state == null || stream.state.state < 6) { + if (!request.aborted && !request.completed) { + request.onComplete({}); + } + client[kQueue][client[kRunningIdx]++] = null; + client[kResume](); + } else { + --session[kOpenStreams]; + if (session[kOpenStreams] === 0) { + session.unref(); + } + abort(err ?? new InformationalError("HTTP/2: stream half-closed (remote)")); + client[kQueue][client[kRunningIdx]++] = null; + client[kPendingIdx] = client[kRunningIdx]; + client[kResume](); } - abort(new InformationalError("HTTP/2: stream half-closed (remote)")); - client[kQueue][client[kRunningIdx]++] = null; - client[kPendingIdx] = client[kRunningIdx]; - client[kResume](); }); stream.once("close", () => { + stream.removeAllListeners("data"); session[kOpenStreams] -= 1; if (session[kOpenStreams] === 0) { session.unref(); } }); stream.once("error", function(err) { + stream.removeAllListeners("data"); abort(err); }); stream.once("frameError", (type, code) => { + stream.removeAllListeners("data"); abort(new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`)); }); + stream.on("aborted", () => { + stream.removeAllListeners("data"); + }); + stream.on("timeout", () => { + const err = new InformationalError(`HTTP/2: "stream timeout after ${requestTimeout}"`); + stream.removeAllListeners("data"); + session[kOpenStreams] -= 1; + if (session[kOpenStreams] === 0) { + session.unref(); + } + abort(err); + }); + stream.once("trailers", (trailers) => { + if (request.aborted || request.completed) { + return; + } + request.onComplete(trailers); + }); return true; function writeBodyH2() { if (!body || contentLength === 0) { @@ -7336,197 +8045,6 @@ var require_client_h2 = __commonJS({ } }); -// lib/handler/redirect-handler.js -var require_redirect_handler = __commonJS({ - "lib/handler/redirect-handler.js"(exports2, module2) { - "use strict"; - var util = require_util(); - var { kBodyUsed } = require_symbols(); - var assert = require("node:assert"); - var { InvalidArgumentError } = require_errors(); - var EE = require("node:events"); - var redirectableStatusCodes = [300, 301, 302, 303, 307, 308]; - var kBody = Symbol("body"); - var BodyAsyncIterable = class { - static { - __name(this, "BodyAsyncIterable"); - } - constructor(body) { - this[kBody] = body; - this[kBodyUsed] = false; - } - async *[Symbol.asyncIterator]() { - assert(!this[kBodyUsed], "disturbed"); - this[kBodyUsed] = true; - yield* this[kBody]; - } - }; - var RedirectHandler = class { - static { - __name(this, "RedirectHandler"); - } - constructor(dispatch, maxRedirections, opts, handler) { - if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { - throw new InvalidArgumentError("maxRedirections must be a positive number"); - } - util.validateHandler(handler, opts.method, opts.upgrade); - this.dispatch = dispatch; - this.location = null; - this.abort = null; - this.opts = { ...opts, maxRedirections: 0 }; - this.maxRedirections = maxRedirections; - this.handler = handler; - this.history = []; - this.redirectionLimitReached = false; - if (util.isStream(this.opts.body)) { - if (util.bodyLength(this.opts.body) === 0) { - this.opts.body.on("data", function() { - assert(false); - }); - } - if (typeof this.opts.body.readableDidRead !== "boolean") { - this.opts.body[kBodyUsed] = false; - EE.prototype.on.call(this.opts.body, "data", function() { - this[kBodyUsed] = true; - }); - } - } else if (this.opts.body && typeof this.opts.body.pipeTo === "function") { - this.opts.body = new BodyAsyncIterable(this.opts.body); - } else if (this.opts.body && typeof this.opts.body !== "string" && !ArrayBuffer.isView(this.opts.body) && util.isIterable(this.opts.body)) { - this.opts.body = new BodyAsyncIterable(this.opts.body); - } - } - onConnect(abort) { - this.abort = abort; - this.handler.onConnect(abort, { history: this.history }); - } - onUpgrade(statusCode, headers, socket) { - this.handler.onUpgrade(statusCode, headers, socket); - } - onError(error) { - this.handler.onError(error); - } - onHeaders(statusCode, headers, resume, statusText) { - this.location = this.history.length >= this.maxRedirections || util.isDisturbed(this.opts.body) ? null : parseLocation(statusCode, headers); - if (this.opts.throwOnMaxRedirect && this.history.length >= this.maxRedirections) { - if (this.request) { - this.request.abort(new Error("max redirects")); - } - this.redirectionLimitReached = true; - this.abort(new Error("max redirects")); - return; - } - if (this.opts.origin) { - this.history.push(new URL(this.opts.path, this.opts.origin)); - } - if (!this.location) { - return this.handler.onHeaders(statusCode, headers, resume, statusText); - } - const { origin, pathname, search } = util.parseURL(new URL(this.location, this.opts.origin && new URL(this.opts.path, this.opts.origin))); - const path = search ? `${pathname}${search}` : pathname; - this.opts.headers = cleanRequestHeaders(this.opts.headers, statusCode === 303, this.opts.origin !== origin); - this.opts.path = path; - this.opts.origin = origin; - this.opts.maxRedirections = 0; - this.opts.query = null; - if (statusCode === 303 && this.opts.method !== "HEAD") { - this.opts.method = "GET"; - this.opts.body = null; - } - } - onData(chunk) { - if (this.location) { - } else { - return this.handler.onData(chunk); - } - } - onComplete(trailers) { - if (this.location) { - this.location = null; - this.abort = null; - this.dispatch(this.opts, this); - } else { - this.handler.onComplete(trailers); - } - } - onBodySent(chunk) { - if (this.handler.onBodySent) { - this.handler.onBodySent(chunk); - } - } - }; - function parseLocation(statusCode, headers) { - if (redirectableStatusCodes.indexOf(statusCode) === -1) { - return null; - } - for (let i = 0; i < headers.length; i += 2) { - if (headers[i].length === 8 && util.headerNameToString(headers[i]) === "location") { - return headers[i + 1]; - } - } - } - __name(parseLocation, "parseLocation"); - function shouldRemoveHeader(header, removeContent, unknownOrigin) { - if (header.length === 4) { - return util.headerNameToString(header) === "host"; - } - if (removeContent && util.headerNameToString(header).startsWith("content-")) { - return true; - } - if (unknownOrigin && (header.length === 13 || header.length === 6 || header.length === 19)) { - const name = util.headerNameToString(header); - return name === "authorization" || name === "cookie" || name === "proxy-authorization"; - } - return false; - } - __name(shouldRemoveHeader, "shouldRemoveHeader"); - function cleanRequestHeaders(headers, removeContent, unknownOrigin) { - const ret = []; - if (Array.isArray(headers)) { - for (let i = 0; i < headers.length; i += 2) { - if (!shouldRemoveHeader(headers[i], removeContent, unknownOrigin)) { - ret.push(headers[i], headers[i + 1]); - } - } - } else if (headers && typeof headers === "object") { - for (const key of Object.keys(headers)) { - if (!shouldRemoveHeader(key, removeContent, unknownOrigin)) { - ret.push(key, headers[key]); - } - } - } else { - assert(headers == null, "headers must be an object or an array"); - } - return ret; - } - __name(cleanRequestHeaders, "cleanRequestHeaders"); - module2.exports = RedirectHandler; - } -}); - -// lib/interceptor/redirect-interceptor.js -var require_redirect_interceptor = __commonJS({ - "lib/interceptor/redirect-interceptor.js"(exports2, module2) { - "use strict"; - var RedirectHandler = require_redirect_handler(); - function createRedirectInterceptor({ maxRedirections: defaultMaxRedirections }) { - return (dispatch) => { - return /* @__PURE__ */ __name(function Intercept(opts, handler) { - const { maxRedirections = defaultMaxRedirections } = opts; - if (!maxRedirections) { - return dispatch(opts, handler); - } - const redirectHandler = new RedirectHandler(dispatch, maxRedirections, opts, handler); - opts = { ...opts, maxRedirections: 0 }; - return dispatch(opts, redirectHandler); - }, "Intercept"); - }; - } - __name(createRedirectInterceptor, "createRedirectInterceptor"); - module2.exports = createRedirectInterceptor; - } -}); - // lib/dispatcher/client.js var require_client = __commonJS({ "lib/dispatcher/client.js"(exports2, module2) { @@ -7572,13 +8090,11 @@ var require_client = __commonJS({ kBodyTimeout, kStrictContentLength, kConnector, - kMaxRedirections, kMaxRequests, kCounter, kClose, kDestroy, kDispatch, - kInterceptors, kLocalAddress, kMaxResponseSize, kOnError, @@ -7588,8 +8104,10 @@ var require_client = __commonJS({ } = require_symbols(); var connectH1 = require_client_h1(); var connectH2 = require_client_h2(); - var deprecatedInterceptorWarned = false; var kClosedResolve = Symbol("kClosedResolve"); + var getDefaultNodeMaxHeaderSize = http && http.maxHeaderSize && Number.isInteger(http.maxHeaderSize) && http.maxHeaderSize > 0 ? () => http.maxHeaderSize : () => { + throw new InvalidArgumentError("http module not available or http.maxHeaderSize invalid"); + }; var noop = /* @__PURE__ */ __name(() => { }, "noop"); function getPipelining(client) { @@ -7606,7 +8124,6 @@ var require_client = __commonJS({ * @param {import('../../types/client.js').Client.Options} options */ constructor(url, { - interceptors, maxHeaderSize, headersTimeout, socketTimeout, @@ -7624,7 +8141,6 @@ var require_client = __commonJS({ tls, strictContentLength, maxCachedSessions, - maxRedirections, connect: connect2, maxRequestsPerClient, localAddress, @@ -7635,7 +8151,6 @@ var require_client = __commonJS({ maxConcurrentStreams, allowH2 } = {}) { - super(); if (keepAlive !== void 0) { throw new InvalidArgumentError("unsupported keepAlive, use pipelining=0 instead"); } @@ -7651,8 +8166,12 @@ var require_client = __commonJS({ if (maxKeepAliveTimeout !== void 0) { throw new InvalidArgumentError("unsupported maxKeepAliveTimeout, use keepAliveMaxTimeout instead"); } - if (maxHeaderSize != null && !Number.isFinite(maxHeaderSize)) { - throw new InvalidArgumentError("invalid maxHeaderSize"); + if (maxHeaderSize != null) { + if (!Number.isInteger(maxHeaderSize) || maxHeaderSize < 1) { + throw new InvalidArgumentError("invalid maxHeaderSize"); + } + } else { + maxHeaderSize = getDefaultNodeMaxHeaderSize(); } if (socketPath != null && typeof socketPath !== "string") { throw new InvalidArgumentError("invalid socketPath"); @@ -7678,9 +8197,6 @@ var require_client = __commonJS({ if (connect2 != null && typeof connect2 !== "function" && typeof connect2 !== "object") { throw new InvalidArgumentError("connect must be a function or an object"); } - if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { - throw new InvalidArgumentError("maxRedirections must be a positive number"); - } if (maxRequestsPerClient != null && (!Number.isInteger(maxRequestsPerClient) || maxRequestsPerClient < 0)) { throw new InvalidArgumentError("maxRequestsPerClient must be a positive number"); } @@ -7699,6 +8215,7 @@ var require_client = __commonJS({ if (maxConcurrentStreams != null && (typeof maxConcurrentStreams !== "number" || maxConcurrentStreams < 1)) { throw new InvalidArgumentError("maxConcurrentStreams must be a positive integer, greater than 0"); } + super(); if (typeof connect2 !== "function") { connect2 = buildConnector({ ...tls, @@ -7710,21 +8227,10 @@ var require_client = __commonJS({ ...connect2 }); } - if (interceptors?.Client && Array.isArray(interceptors.Client)) { - this[kInterceptors] = interceptors.Client; - if (!deprecatedInterceptorWarned) { - deprecatedInterceptorWarned = true; - process.emitWarning("Client.Options#interceptor is deprecated. Use Dispatcher#compose instead.", { - code: "UNDICI-CLIENT-INTERCEPTOR-DEPRECATED" - }); - } - } else { - this[kInterceptors] = [createRedirectInterceptor({ maxRedirections })]; - } this[kUrl] = util.parseOrigin(url); this[kConnector] = connect2; this[kPipelining] = pipelining != null ? pipelining : 1; - this[kMaxHeadersSize] = maxHeaderSize || http.maxHeaderSize; + this[kMaxHeadersSize] = maxHeaderSize; this[kKeepAliveDefaultTimeout] = keepAliveTimeout == null ? 4e3 : keepAliveTimeout; this[kKeepAliveMaxTimeout] = keepAliveMaxTimeout == null ? 6e5 : keepAliveMaxTimeout; this[kKeepAliveTimeoutThreshold] = keepAliveTimeoutThreshold == null ? 2e3 : keepAliveTimeoutThreshold; @@ -7738,7 +8244,6 @@ var require_client = __commonJS({ this[kBodyTimeout] = bodyTimeout != null ? bodyTimeout : 3e5; this[kHeadersTimeout] = headersTimeout != null ? headersTimeout : 3e5; this[kStrictContentLength] = strictContentLength == null ? true : strictContentLength; - this[kMaxRedirections] = maxRedirections; this[kMaxRequests] = maxRequestsPerClient; this[kClosedResolve] = null; this[kMaxResponseSize] = maxResponseSize > -1 ? maxResponseSize : -1; @@ -7828,7 +8333,6 @@ var require_client = __commonJS({ }); } }; - var createRedirectInterceptor = require_redirect_interceptor(); function onError(client, err) { if (client[kRunning] === 0 && err.code !== "UND_ERR_INFO" && err.code !== "UND_ERR_SOCKET") { assert(client[kPendingIdx] === client[kRunningIdx]); @@ -7849,7 +8353,7 @@ var require_client = __commonJS({ const idx = hostname.indexOf("]"); assert(idx !== -1); const ip = hostname.substring(1, idx); - assert(net.isIP(ip)); + assert(net.isIPv6(ip)); hostname = ip; } client[kConnecting] = true; @@ -8052,7 +8556,7 @@ var require_pool = __commonJS({ InvalidArgumentError } = require_errors(); var util = require_util(); - var { kUrl, kInterceptors } = require_symbols(); + var { kUrl } = require_symbols(); var buildConnector = require_connect(); var kOptions = Symbol("options"); var kConnections = Symbol("connections"); @@ -8078,7 +8582,6 @@ var require_pool = __commonJS({ allowH2, ...options } = {}) { - super(); if (connections != null && (!Number.isFinite(connections) || connections < 0)) { throw new InvalidArgumentError("invalid connections"); } @@ -8088,6 +8591,7 @@ var require_pool = __commonJS({ if (connect != null && typeof connect !== "function" && typeof connect !== "object") { throw new InvalidArgumentError("connect must be a function or an object"); } + super(); if (typeof connect !== "function") { connect = buildConnector({ ...tls, @@ -8099,7 +8603,6 @@ var require_pool = __commonJS({ ...connect }); } - this[kInterceptors] = options.interceptors?.Pool && Array.isArray(options.interceptors.Pool) ? options.interceptors.Pool : []; this[kConnections] = connections || null; this[kUrl] = util.parseOrigin(origin); this[kOptions] = { ...util.deepClone(options), connect, allowH2 }; @@ -8128,16 +8631,14 @@ var require_agent = __commonJS({ "lib/dispatcher/agent.js"(exports2, module2) { "use strict"; var { InvalidArgumentError } = require_errors(); - var { kClients, kRunning, kClose, kDestroy, kDispatch, kInterceptors } = require_symbols(); + var { kClients, kRunning, kClose, kDestroy, kDispatch } = require_symbols(); var DispatcherBase = require_dispatcher_base(); var Pool = require_pool(); var Client = require_client(); var util = require_util(); - var createRedirectInterceptor = require_redirect_interceptor(); var kOnConnect = Symbol("onConnect"); var kOnDisconnect = Symbol("onDisconnect"); var kOnConnectionError = Symbol("onConnectionError"); - var kMaxRedirections = Symbol("maxRedirections"); var kOnDrain = Symbol("onDrain"); var kFactory = Symbol("factory"); var kOptions = Symbol("options"); @@ -8149,24 +8650,18 @@ var require_agent = __commonJS({ static { __name(this, "Agent"); } - constructor({ factory = defaultFactory, maxRedirections = 0, connect, ...options } = {}) { - super(); + constructor({ factory = defaultFactory, connect, ...options } = {}) { if (typeof factory !== "function") { throw new InvalidArgumentError("factory must be a function."); } if (connect != null && typeof connect !== "function" && typeof connect !== "object") { throw new InvalidArgumentError("connect must be a function or an object"); } - if (!Number.isInteger(maxRedirections) || maxRedirections < 0) { - throw new InvalidArgumentError("maxRedirections must be a positive number"); - } + super(); if (connect && typeof connect !== "function") { connect = { ...connect }; } - this[kInterceptors] = options.interceptors?.Agent && Array.isArray(options.interceptors.Agent) ? options.interceptors.Agent : [createRedirectInterceptor({ maxRedirections })]; this[kOptions] = { ...util.deepClone(options), connect }; - this[kOptions].interceptors = options.interceptors ? { ...options.interceptors } : void 0; - this[kMaxRedirections] = maxRedirections; this[kFactory] = factory; this[kClients] = /* @__PURE__ */ new Map(); this[kOnDrain] = (origin, targets) => { @@ -8261,7 +8756,7 @@ var require_global2 = __commonJS({ var require_proxy_agent = __commonJS({ "lib/dispatcher/proxy-agent.js"(exports2, module2) { "use strict"; - var { kProxy, kClose, kDestroy, kInterceptors } = require_symbols(); + var { kProxy, kClose, kDestroy } = require_symbols(); var { URL: URL2 } = require("node:url"); var Agent = require_agent(); var Pool = require_pool(); @@ -8289,7 +8784,6 @@ var require_proxy_agent = __commonJS({ __name(this, "ProxyAgent"); } constructor(opts) { - super(); if (!opts || typeof opts === "object" && !(opts instanceof URL2) && !opts.uri) { throw new InvalidArgumentError("Proxy uri is mandatory"); } @@ -8297,10 +8791,10 @@ var require_proxy_agent = __commonJS({ if (typeof clientFactory !== "function") { throw new InvalidArgumentError("Proxy opts.clientFactory must be a function."); } + super(); const url = this.#getUrl(opts); const { href, origin, port, protocol, username, password, hostname: proxyHostname } = url; this[kProxy] = { uri: href, protocol }; - this[kInterceptors] = opts.interceptors?.ProxyAgent && Array.isArray(opts.interceptors.ProxyAgent) ? opts.interceptors.ProxyAgent : []; this[kRequestTls] = opts.requestTls; this[kProxyTls] = opts.proxyTls; this[kProxyHeaders] = opts.headers || {}; @@ -8318,7 +8812,7 @@ var require_proxy_agent = __commonJS({ this[kClient] = clientFactory(url, { connect }); this[kAgent] = new Agent({ ...opts, - connect: async (opts2, callback) => { + connect: /* @__PURE__ */ __name(async (opts2, callback) => { let requestedPath = opts2.host; if (!opts2.port) { requestedPath += `:${defaultProtocolPort(opts2.protocol)}`; @@ -8357,7 +8851,7 @@ var require_proxy_agent = __commonJS({ callback(err); } } - } + }, "connect") }); } dispatch(opts, handler) { @@ -8572,8 +9066,6 @@ var require_headers = __commonJS({ var { webidl } = require_webidl(); var assert = require("node:assert"); var util = require("node:util"); - var kHeadersMap = Symbol("headers map"); - var kHeadersSortedMap = Symbol("headers map sorted"); function isHTTPWhiteSpaceCharCode(code) { return code === 10 || code === 13 || code === 9 || code === 32; } @@ -8581,10 +9073,8 @@ var require_headers = __commonJS({ function headerValueNormalize(potentialValue) { let i = 0; let j = potentialValue.length; - while (j > i && isHTTPWhiteSpaceCharCode(potentialValue.charCodeAt(j - 1))) - --j; - while (j > i && isHTTPWhiteSpaceCharCode(potentialValue.charCodeAt(i))) - ++i; + while (j > i && isHTTPWhiteSpaceCharCode(potentialValue.charCodeAt(j - 1))) --j; + while (j > i && isHTTPWhiteSpaceCharCode(potentialValue.charCodeAt(i))) ++i; return i === 0 && j === potentialValue.length ? potentialValue : potentialValue.substring(i, j); } __name(headerValueNormalize, "headerValueNormalize"); @@ -8635,6 +9125,33 @@ var require_headers = __commonJS({ return getHeadersList(headers).append(name, value, false); } __name(appendHeader, "appendHeader"); + function headersListSortAndCombine(target) { + const headersList = getHeadersList(target); + if (!headersList) { + return []; + } + if (headersList.sortedMap) { + return headersList.sortedMap; + } + const headers = []; + const names = headersList.toSortedArray(); + const cookies = headersList.cookies; + if (cookies === null || cookies.length === 1) { + return headersList.sortedMap = names; + } + for (let i = 0; i < names.length; ++i) { + const { 0: name, 1: value } = names[i]; + if (name === "set-cookie") { + for (let j = 0; j < cookies.length; ++j) { + headers.push([name, cookies[j]]); + } + } else { + headers.push([name, value]); + } + } + return headersList.sortedMap = headers; + } + __name(headersListSortAndCombine, "headersListSortAndCombine"); function compareHeaderName(a, b) { return a[0] < b[0] ? -1 : 1; } @@ -8645,14 +9162,16 @@ var require_headers = __commonJS({ } /** @type {[string, string][]|null} */ cookies = null; + sortedMap; + headersMap; constructor(init) { if (init instanceof _HeadersList) { - this[kHeadersMap] = new Map(init[kHeadersMap]); - this[kHeadersSortedMap] = init[kHeadersSortedMap]; + this.headersMap = new Map(init.headersMap); + this.sortedMap = init.sortedMap; this.cookies = init.cookies === null ? null : [...init.cookies]; } else { - this[kHeadersMap] = new Map(init); - this[kHeadersSortedMap] = null; + this.headersMap = new Map(init); + this.sortedMap = null; } } /** @@ -8661,11 +9180,11 @@ var require_headers = __commonJS({ * @param {boolean} isLowerCase */ contains(name, isLowerCase) { - return this[kHeadersMap].has(isLowerCase ? name : name.toLowerCase()); + return this.headersMap.has(isLowerCase ? name : name.toLowerCase()); } clear() { - this[kHeadersMap].clear(); - this[kHeadersSortedMap] = null; + this.headersMap.clear(); + this.sortedMap = null; this.cookies = null; } /** @@ -8675,17 +9194,17 @@ var require_headers = __commonJS({ * @param {boolean} isLowerCase */ append(name, value, isLowerCase) { - this[kHeadersSortedMap] = null; + this.sortedMap = null; const lowercaseName = isLowerCase ? name : name.toLowerCase(); - const exists = this[kHeadersMap].get(lowercaseName); + const exists = this.headersMap.get(lowercaseName); if (exists) { const delimiter = lowercaseName === "cookie" ? "; " : ", "; - this[kHeadersMap].set(lowercaseName, { + this.headersMap.set(lowercaseName, { name: exists.name, value: `${exists.value}${delimiter}${value}` }); } else { - this[kHeadersMap].set(lowercaseName, { name, value }); + this.headersMap.set(lowercaseName, { name, value }); } if (lowercaseName === "set-cookie") { (this.cookies ??= []).push(value); @@ -8698,12 +9217,12 @@ var require_headers = __commonJS({ * @param {boolean} isLowerCase */ set(name, value, isLowerCase) { - this[kHeadersSortedMap] = null; + this.sortedMap = null; const lowercaseName = isLowerCase ? name : name.toLowerCase(); if (lowercaseName === "set-cookie") { this.cookies = [value]; } - this[kHeadersMap].set(lowercaseName, { name, value }); + this.headersMap.set(lowercaseName, { name, value }); } /** * @see https://fetch.spec.whatwg.org/#concept-header-list-delete @@ -8711,13 +9230,12 @@ var require_headers = __commonJS({ * @param {boolean} isLowerCase */ delete(name, isLowerCase) { - this[kHeadersSortedMap] = null; - if (!isLowerCase) - name = name.toLowerCase(); + this.sortedMap = null; + if (!isLowerCase) name = name.toLowerCase(); if (name === "set-cookie") { this.cookies = null; } - this[kHeadersMap].delete(name); + this.headersMap.delete(name); } /** * @see https://fetch.spec.whatwg.org/#concept-header-list-get @@ -8726,29 +9244,29 @@ var require_headers = __commonJS({ * @returns {string | null} */ get(name, isLowerCase) { - return this[kHeadersMap].get(isLowerCase ? name : name.toLowerCase())?.value ?? null; + return this.headersMap.get(isLowerCase ? name : name.toLowerCase())?.value ?? null; } *[Symbol.iterator]() { - for (const { 0: name, 1: { value } } of this[kHeadersMap]) { + for (const { 0: name, 1: { value } } of this.headersMap) { yield [name, value]; } } get entries() { const headers = {}; - if (this[kHeadersMap].size !== 0) { - for (const { name, value } of this[kHeadersMap].values()) { + if (this.headersMap.size !== 0) { + for (const { name, value } of this.headersMap.values()) { headers[name] = value; } } return headers; } rawValues() { - return this[kHeadersMap].values(); + return this.headersMap.values(); } get entriesList() { const headers = []; - if (this[kHeadersMap].size !== 0) { - for (const { 0: lowerName, 1: { name, value } } of this[kHeadersMap]) { + if (this.headersMap.size !== 0) { + for (const { 0: lowerName, 1: { name, value } } of this.headersMap) { if (lowerName === "set-cookie") { for (const cookie of this.cookies) { headers.push([name, cookie]); @@ -8762,13 +9280,13 @@ var require_headers = __commonJS({ } // https://fetch.spec.whatwg.org/#convert-header-names-to-a-sorted-lowercase-set toSortedArray() { - const size = this[kHeadersMap].size; + const size = this.headersMap.size; const array = new Array(size); if (size <= 32) { if (size === 0) { return array; } - const iterator = this[kHeadersMap][Symbol.iterator](); + const iterator = this.headersMap[Symbol.iterator](); const firstValue = iterator.next().value; array[0] = [firstValue[0], firstValue[1].value]; assert(firstValue[1].value !== null); @@ -8800,7 +9318,7 @@ var require_headers = __commonJS({ return array; } else { let i = 0; - for (const { 0: name, 1: { value } } of this[kHeadersMap]) { + for (const { 0: name, 1: { value } } of this.headersMap) { array[i++] = [name, value]; assert(value !== null); } @@ -8813,7 +9331,14 @@ var require_headers = __commonJS({ __name(this, "Headers"); } #guard; + /** + * @type {HeadersList} + */ #headersList; + /** + * @param {HeadersInit|Symbol} [init] + * @returns + */ constructor(init = void 0) { webidl.util.markAsUncloneable(this); if (init === kConstruct) { @@ -8822,7 +9347,7 @@ var require_headers = __commonJS({ this.#headersList = new HeadersList(); this.#guard = "none"; if (init !== void 0) { - init = webidl.converters.HeadersInit(init, "Headers contructor", "init"); + init = webidl.converters.HeadersInit(init, "Headers constructor", "init"); fill(this, init); } } @@ -8921,29 +9446,6 @@ var require_headers = __commonJS({ } return []; } - // https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine - get [kHeadersSortedMap]() { - if (this.#headersList[kHeadersSortedMap]) { - return this.#headersList[kHeadersSortedMap]; - } - const headers = []; - const names = this.#headersList.toSortedArray(); - const cookies = this.#headersList.cookies; - if (cookies === null || cookies.length === 1) { - return this.#headersList[kHeadersSortedMap] = names; - } - for (let i = 0; i < names.length; ++i) { - const { 0: name, 1: value } = names[i]; - if (name === "set-cookie") { - for (let j = 0; j < cookies.length; ++j) { - headers.push([name, cookies[j]]); - } - } else { - headers.push([name, value]); - } - } - return this.#headersList[kHeadersSortedMap] = headers; - } [util.inspect.custom](depth, options) { options.depth ??= depth; return `Headers ${util.formatWithOptions(options, this.#headersList.entries)}`; @@ -8954,11 +9456,18 @@ var require_headers = __commonJS({ static setHeadersGuard(o, guard) { o.#guard = guard; } + /** + * @param {Headers} o + */ static getHeadersList(o) { return o.#headersList; } - static setHeadersList(o, list) { - o.#headersList = list; + /** + * @param {Headers} target + * @param {HeadersList} list + */ + static setHeadersList(target, list) { + target.#headersList = list; } }; var { getHeadersGuard, setHeadersGuard, getHeadersList, setHeadersList } = Headers; @@ -8966,7 +9475,7 @@ var require_headers = __commonJS({ Reflect.deleteProperty(Headers, "setHeadersGuard"); Reflect.deleteProperty(Headers, "getHeadersList"); Reflect.deleteProperty(Headers, "setHeadersList"); - iteratorMixin("Headers", Headers, kHeadersSortedMap, 0, 1); + iteratorMixin("Headers", Headers, headersListSortAndCombine, 0, 1); Object.defineProperties(Headers.prototype, { append: kEnumerableProperty, delete: kEnumerableProperty, @@ -8983,7 +9492,7 @@ var require_headers = __commonJS({ } }); webidl.converters.HeadersInit = function(V, prefix, argument) { - if (webidl.util.Type(V) === "Object") { + if (webidl.util.Type(V) === webidl.util.Types.OBJECT) { const iterator = Reflect.get(V, Symbol.iterator); if (!util.types.isProxy(V) && iterator === Headers.prototype.entries) { try { @@ -9029,7 +9538,6 @@ var require_response = __commonJS({ isValidReasonPhrase, isCancelled, isAborted, - isBlobLike, serializeJavascriptValueToJSONString, isErrorLike, isomorphicEncode, @@ -9039,9 +9547,7 @@ var require_response = __commonJS({ redirectStatusSet, nullBodyStatus } = require_constants3(); - var { kState, kHeaders } = require_symbols2(); var { webidl } = require_webidl(); - var { FormData } = require_formdata(); var { URLSerializer } = require_data_url(); var { kConstruct } = require_symbols(); var assert = require("node:assert"); @@ -9051,13 +9557,16 @@ var require_response = __commonJS({ static { __name(this, "Response"); } + /** @type {Headers} */ + #headers; + #state; // Creates network error Response. static error() { const responseObject = fromInnerResponse(makeNetworkError(), "immutable"); return responseObject; } // https://fetch.spec.whatwg.org/#dom-response-json - static json(data, init = {}) { + static json(data, init = void 0) { webidl.argumentLengthCheck(arguments, 1, "Response.json"); if (init !== null) { init = webidl.converters.ResponseInit(init); @@ -9085,13 +9594,13 @@ var require_response = __commonJS({ throw new RangeError(`Invalid status code ${status}`); } const responseObject = fromInnerResponse(makeResponse({}), "immutable"); - responseObject[kState].status = status; + responseObject.#state.status = status; const value = isomorphicEncode(URLSerializer(parsedURL)); - responseObject[kState].headersList.append("location", value, true); + responseObject.#state.headersList.append("location", value, true); return responseObject; } // https://fetch.spec.whatwg.org/#dom-response - constructor(body = null, init = {}) { + constructor(body = null, init = void 0) { webidl.util.markAsUncloneable(this); if (body === kConstruct) { return; @@ -9100,10 +9609,10 @@ var require_response = __commonJS({ body = webidl.converters.BodyInit(body); } init = webidl.converters.ResponseInit(init); - this[kState] = makeResponse({}); - this[kHeaders] = new Headers(kConstruct); - setHeadersGuard(this[kHeaders], "response"); - setHeadersList(this[kHeaders], this[kState].headersList); + this.#state = makeResponse({}); + this.#headers = new Headers(kConstruct); + setHeadersGuard(this.#headers, "response"); + setHeadersList(this.#headers, this.#state.headersList); let bodyWithType = null; if (body != null) { const [extractedBody, type] = extractBody(body); @@ -9114,12 +9623,12 @@ var require_response = __commonJS({ // Returns response?s type, e.g., "cors". get type() { webidl.brandCheck(this, _Response); - return this[kState].type; + return this.#state.type; } // Returns response?s URL, if it has one; otherwise the empty string. get url() { webidl.brandCheck(this, _Response); - const urlList = this[kState].urlList; + const urlList = this.#state.urlList; const url = urlList[urlList.length - 1] ?? null; if (url === null) { return ""; @@ -9129,47 +9638,47 @@ var require_response = __commonJS({ // Returns whether response was obtained through a redirect. get redirected() { webidl.brandCheck(this, _Response); - return this[kState].urlList.length > 1; + return this.#state.urlList.length > 1; } // Returns response?s status. get status() { webidl.brandCheck(this, _Response); - return this[kState].status; + return this.#state.status; } // Returns whether response?s status is an ok status. get ok() { webidl.brandCheck(this, _Response); - return this[kState].status >= 200 && this[kState].status <= 299; + return this.#state.status >= 200 && this.#state.status <= 299; } // Returns response?s status message. get statusText() { webidl.brandCheck(this, _Response); - return this[kState].statusText; + return this.#state.statusText; } // Returns response?s headers as Headers. get headers() { webidl.brandCheck(this, _Response); - return this[kHeaders]; + return this.#headers; } get body() { webidl.brandCheck(this, _Response); - return this[kState].body ? this[kState].body.stream : null; + return this.#state.body ? this.#state.body.stream : null; } get bodyUsed() { webidl.brandCheck(this, _Response); - return !!this[kState].body && util.isDisturbed(this[kState].body.stream); + return !!this.#state.body && util.isDisturbed(this.#state.body.stream); } // Returns a clone of response. clone() { webidl.brandCheck(this, _Response); - if (bodyUnusable(this)) { + if (bodyUnusable(this.#state)) { throw webidl.errors.exception({ header: "Response.clone", message: "Body has already been consumed." }); } - const clonedResponse = cloneResponse(this[kState]); - return fromInnerResponse(clonedResponse, getHeadersGuard(this[kHeaders])); + const clonedResponse = cloneResponse(this.#state); + return fromInnerResponse(clonedResponse, getHeadersGuard(this.#headers)); } [nodeUtil.inspect.custom](depth, options) { if (options.depth === null) { @@ -9189,8 +9698,39 @@ var require_response = __commonJS({ }; return `Response ${nodeUtil.formatWithOptions(options, properties)}`; } + /** + * @param {Response} response + */ + static getResponseHeaders(response) { + return response.#headers; + } + /** + * @param {Response} response + * @param {Headers} newHeaders + */ + static setResponseHeaders(response, newHeaders) { + response.#headers = newHeaders; + } + /** + * @param {Response} response + */ + static getResponseState(response) { + return response.#state; + } + /** + * @param {Response} response + * @param {any} newState + */ + static setResponseState(response, newState) { + response.#state = newState; + } }; - mixinBody(Response); + var { getResponseHeaders, setResponseHeaders, getResponseState, setResponseState } = Response; + Reflect.deleteProperty(Response, "getResponseHeaders"); + Reflect.deleteProperty(Response, "setResponseHeaders"); + Reflect.deleteProperty(Response, "getResponseState"); + Reflect.deleteProperty(Response, "setResponseState"); + mixinBody(Response, getResponseState); Object.defineProperties(Response.prototype, { type: kEnumerableProperty, url: kEnumerableProperty, @@ -9325,13 +9865,13 @@ var require_response = __commonJS({ } } if ("status" in init && init.status != null) { - response[kState].status = init.status; + getResponseState(response).status = init.status; } if ("statusText" in init && init.statusText != null) { - response[kState].statusText = init.statusText; + getResponseState(response).statusText = init.statusText; } if ("headers" in init && init.headers != null) { - fill(response[kHeaders], init.headers); + fill(getResponseHeaders(response), init.headers); } if (body) { if (nullBodyStatus.includes(response.status)) { @@ -9340,55 +9880,47 @@ var require_response = __commonJS({ message: `Invalid response status code ${response.status}` }); } - response[kState].body = body.body; - if (body.type != null && !response[kState].headersList.contains("content-type", true)) { - response[kState].headersList.append("content-type", body.type, true); + getResponseState(response).body = body.body; + if (body.type != null && !getResponseState(response).headersList.contains("content-type", true)) { + getResponseState(response).headersList.append("content-type", body.type, true); } } } __name(initializeResponse, "initializeResponse"); function fromInnerResponse(innerResponse, guard) { const response = new Response(kConstruct); - response[kState] = innerResponse; - response[kHeaders] = new Headers(kConstruct); - setHeadersList(response[kHeaders], innerResponse.headersList); - setHeadersGuard(response[kHeaders], guard); + setResponseState(response, innerResponse); + const headers = new Headers(kConstruct); + setResponseHeaders(response, headers); + setHeadersList(headers, innerResponse.headersList); + setHeadersGuard(headers, guard); if (hasFinalizationRegistry && innerResponse.body?.stream) { streamRegistry.register(response, new WeakRef(innerResponse.body.stream)); } return response; } __name(fromInnerResponse, "fromInnerResponse"); - webidl.converters.ReadableStream = webidl.interfaceConverter( - ReadableStream - ); - webidl.converters.FormData = webidl.interfaceConverter( - FormData - ); - webidl.converters.URLSearchParams = webidl.interfaceConverter( - URLSearchParams - ); webidl.converters.XMLHttpRequestBodyInit = function(V, prefix, name) { if (typeof V === "string") { return webidl.converters.USVString(V, prefix, name); } - if (isBlobLike(V)) { - return webidl.converters.Blob(V, prefix, name, { strict: false }); + if (webidl.is.Blob(V)) { + return V; } if (ArrayBuffer.isView(V) || types.isArrayBuffer(V)) { - return webidl.converters.BufferSource(V, prefix, name); + return V; } - if (util.isFormDataLike(V)) { - return webidl.converters.FormData(V, prefix, name, { strict: false }); + if (webidl.is.FormData(V)) { + return V; } - if (V instanceof URLSearchParams) { - return webidl.converters.URLSearchParams(V, prefix, name); + if (webidl.is.URLSearchParams(V)) { + return V; } return webidl.converters.DOMString(V, prefix, name); }; webidl.converters.BodyInit = function(V, prefix, argument) { - if (V instanceof ReadableStream) { - return webidl.converters.ReadableStream(V, prefix, argument); + if (webidl.is.ReadableStream(V)) { + return V; } if (V?.[Symbol.asyncIterator]) { return V; @@ -9399,18 +9931,19 @@ var require_response = __commonJS({ { key: "status", converter: webidl.converters["unsigned short"], - defaultValue: () => 200 + defaultValue: /* @__PURE__ */ __name(() => 200, "defaultValue") }, { key: "statusText", converter: webidl.converters.ByteString, - defaultValue: () => "" + defaultValue: /* @__PURE__ */ __name(() => "", "defaultValue") }, { key: "headers", converter: webidl.converters.HeadersInit } ]); + webidl.is.Response = webidl.util.MakeTypeAssertion(Response); module2.exports = { isNetworkError, makeNetworkError, @@ -9419,7 +9952,8 @@ var require_response = __commonJS({ filterResponse, Response, cloneResponse, - fromInnerResponse + fromInnerResponse, + getResponseState }; } }); @@ -9497,12 +10031,11 @@ var require_request2 = __commonJS({ requestDuplex } = require_constants3(); var { kEnumerableProperty, normalizedMethodRecordsBase, normalizedMethodRecords } = util; - var { kHeaders, kSignal, kState, kDispatcher } = require_symbols2(); var { webidl } = require_webidl(); var { URLSerializer } = require_data_url(); var { kConstruct } = require_symbols(); var assert = require("node:assert"); - var { getMaxListeners, setMaxListeners, getEventListeners, defaultMaxListeners } = require("node:events"); + var { getMaxListeners, setMaxListeners, defaultMaxListeners } = require("node:events"); var kAbortController = Symbol("abortController"); var requestFinalizer = new FinalizationRegistry2(({ signal, abort }) => { signal.removeEventListener("abort", abort); @@ -9539,8 +10072,15 @@ var require_request2 = __commonJS({ static { __name(this, "Request"); } + /** @type {AbortSignal} */ + #signal; + /** @type {import('../../dispatcher/dispatcher')} */ + #dispatcher; + /** @type {Headers} */ + #headers; + #state; // https://fetch.spec.whatwg.org/#dom-request - constructor(input, init = {}) { + constructor(input, init = void 0) { webidl.util.markAsUncloneable(this); if (input === kConstruct) { return; @@ -9554,7 +10094,7 @@ var require_request2 = __commonJS({ const baseUrl = environmentSettingsObject.settingsObject.baseUrl; let signal = null; if (typeof input === "string") { - this[kDispatcher] = init.dispatcher; + this.#dispatcher = init.dispatcher; let parsedURL; try { parsedURL = new URL(input, baseUrl); @@ -9569,10 +10109,10 @@ var require_request2 = __commonJS({ request = makeRequest({ urlList: [parsedURL] }); fallbackMode = "cors"; } else { - this[kDispatcher] = init.dispatcher || input[kDispatcher]; - assert(input instanceof _Request); - request = input[kState]; - signal = input[kSignal]; + assert(webidl.is.Request(input)); + request = input.#state; + signal = input.#signal; + this.#dispatcher = init.dispatcher || input.#dispatcher; } const origin = environmentSettingsObject.settingsObject.origin; let window = "client"; @@ -9723,15 +10263,10 @@ var require_request2 = __commonJS({ if (init.signal !== void 0) { signal = init.signal; } - this[kState] = request; + this.#state = request; const ac = new AbortController(); - this[kSignal] = ac.signal; + this.#signal = ac.signal; if (signal != null) { - if (!signal || typeof signal.aborted !== "boolean" || typeof signal.addEventListener !== "function") { - throw new TypeError( - "Failed to construct 'Request': member signal is not of type AbortSignal." - ); - } if (signal.aborted) { ac.abort(signal.reason); } else { @@ -9741,8 +10276,6 @@ var require_request2 = __commonJS({ try { if (typeof getMaxListeners === "function" && getMaxListeners(signal) === defaultMaxListeners) { setMaxListeners(1500, signal); - } else if (getEventListeners(signal, "abort").length >= defaultMaxListeners) { - setMaxListeners(1500, signal); } } catch { } @@ -9750,19 +10283,19 @@ var require_request2 = __commonJS({ requestFinalizer.register(ac, { signal, abort }, abort); } } - this[kHeaders] = new Headers(kConstruct); - setHeadersList(this[kHeaders], request.headersList); - setHeadersGuard(this[kHeaders], "request"); + this.#headers = new Headers(kConstruct); + setHeadersList(this.#headers, request.headersList); + setHeadersGuard(this.#headers, "request"); if (mode === "no-cors") { if (!corsSafeListedMethodsSet.has(request.method)) { throw new TypeError( `'${request.method} is unsupported in no-cors mode.` ); } - setHeadersGuard(this[kHeaders], "request-no-cors"); + setHeadersGuard(this.#headers, "request-no-cors"); } if (initHasKey) { - const headersList = getHeadersList(this[kHeaders]); + const headersList = getHeadersList(this.#headers); const headers = init.headers !== void 0 ? init.headers : new HeadersList(headersList); headersList.clear(); if (headers instanceof HeadersList) { @@ -9771,10 +10304,10 @@ var require_request2 = __commonJS({ } headersList.cookies = headers.cookies; } else { - fillHeaders(this[kHeaders], headers); + fillHeaders(this.#headers, headers); } } - const inputBody = input instanceof _Request ? input[kState].body : null; + const inputBody = webidl.is.Request(input) ? input.#state.body : null; if ((init.body != null || inputBody != null) && (request.method === "GET" || request.method === "HEAD")) { throw new TypeError("Request with GET/HEAD method cannot have body."); } @@ -9785,8 +10318,8 @@ var require_request2 = __commonJS({ request.keepalive ); initBody = extractedBody; - if (contentType && !getHeadersList(this[kHeaders]).contains("content-type", true)) { - this[kHeaders].append("content-type", contentType); + if (contentType && !getHeadersList(this.#headers).contains("content-type", true)) { + this.#headers.append("content-type", contentType, true); } } const inputOrInitBody = initBody ?? inputBody; @@ -9803,7 +10336,7 @@ var require_request2 = __commonJS({ } let finalBody = inputOrInitBody; if (initBody == null && inputBody != null) { - if (bodyUnusable(input)) { + if (bodyUnusable(input.#state)) { throw new TypeError( "Cannot construct a Request with a Request object that has already been used." ); @@ -9816,30 +10349,30 @@ var require_request2 = __commonJS({ stream: identityTransform.readable }; } - this[kState].body = finalBody; + this.#state.body = finalBody; } // Returns request?s HTTP method, which is "GET" by default. get method() { webidl.brandCheck(this, _Request); - return this[kState].method; + return this.#state.method; } // Returns the URL of request as a string. get url() { webidl.brandCheck(this, _Request); - return URLSerializer(this[kState].url); + return URLSerializer(this.#state.url); } // Returns a Headers object consisting of the headers associated with request. // Note that headers added in the network layer by the user agent will not // be accounted for in this object, e.g., the "Host" header. get headers() { webidl.brandCheck(this, _Request); - return this[kHeaders]; + return this.#headers; } // Returns the kind of resource requested by request, e.g., "document" // or "script". get destination() { webidl.brandCheck(this, _Request); - return this[kState].destination; + return this.#state.destination; } // Returns the referrer of request. Its value can be a same-origin URL if // explicitly set in init, the empty string to indicate no referrer, and @@ -9848,40 +10381,41 @@ var require_request2 = __commonJS({ // request being made. get referrer() { webidl.brandCheck(this, _Request); - if (this[kState].referrer === "no-referrer") { + if (this.#state.referrer === "no-referrer") { return ""; } - if (this[kState].referrer === "client") { + if (this.#state.referrer === "client") { return "about:client"; } - return this[kState].referrer.toString(); + return this.#state.referrer.toString(); } // Returns the referrer policy associated with request. // This is used during fetching to compute the value of the request?s // referrer. get referrerPolicy() { webidl.brandCheck(this, _Request); - return this[kState].referrerPolicy; + return this.#state.referrerPolicy; } // Returns the mode associated with request, which is a string indicating // whether the request will use CORS, or will be restricted to same-origin // URLs. get mode() { webidl.brandCheck(this, _Request); - return this[kState].mode; + return this.#state.mode; } // Returns the credentials mode associated with request, // which is a string indicating whether credentials will be sent with the // request always, never, or only when sent to a same-origin URL. get credentials() { - return this[kState].credentials; + webidl.brandCheck(this, _Request); + return this.#state.credentials; } // Returns the cache mode associated with request, // which is a string indicating how the request will // interact with the browser?s cache when fetching. get cache() { webidl.brandCheck(this, _Request); - return this[kState].cache; + return this.#state.cache; } // Returns the redirect mode associated with request, // which is a string indicating how redirects for the @@ -9889,47 +10423,47 @@ var require_request2 = __commonJS({ // will follow redirects by default. get redirect() { webidl.brandCheck(this, _Request); - return this[kState].redirect; + return this.#state.redirect; } // Returns request?s subresource integrity metadata, which is a // cryptographic hash of the resource being fetched. Its value // consists of multiple hashes separated by whitespace. [SRI] get integrity() { webidl.brandCheck(this, _Request); - return this[kState].integrity; + return this.#state.integrity; } // Returns a boolean indicating whether or not request can outlive the // global in which it was created. get keepalive() { webidl.brandCheck(this, _Request); - return this[kState].keepalive; + return this.#state.keepalive; } // Returns a boolean indicating whether or not request is for a reload // navigation. get isReloadNavigation() { webidl.brandCheck(this, _Request); - return this[kState].reloadNavigation; + return this.#state.reloadNavigation; } // Returns a boolean indicating whether or not request is for a history // navigation (a.k.a. back-forward navigation). get isHistoryNavigation() { webidl.brandCheck(this, _Request); - return this[kState].historyNavigation; + return this.#state.historyNavigation; } // Returns the signal associated with request, which is an AbortSignal // object indicating whether or not request has been aborted, and its // abort event handler. get signal() { webidl.brandCheck(this, _Request); - return this[kSignal]; + return this.#signal; } get body() { webidl.brandCheck(this, _Request); - return this[kState].body ? this[kState].body.stream : null; + return this.#state.body ? this.#state.body.stream : null; } get bodyUsed() { webidl.brandCheck(this, _Request); - return !!this[kState].body && util.isDisturbed(this[kState].body.stream); + return !!this.#state.body && util.isDisturbed(this.#state.body.stream); } get duplex() { webidl.brandCheck(this, _Request); @@ -9938,10 +10472,10 @@ var require_request2 = __commonJS({ // Returns a clone of request. clone() { webidl.brandCheck(this, _Request); - if (bodyUnusable(this)) { + if (bodyUnusable(this.#state)) { throw new TypeError("unusable"); } - const clonedRequest = cloneRequest(this[kState]); + const clonedRequest = cloneRequest(this.#state); const ac = new AbortController(); if (this.signal.aborted) { ac.abort(this.signal.reason); @@ -9958,7 +10492,7 @@ var require_request2 = __commonJS({ buildAbort(acRef) ); } - return fromInnerRequest(clonedRequest, ac.signal, getHeadersGuard(this[kHeaders])); + return fromInnerRequest(clonedRequest, this.#dispatcher, ac.signal, getHeadersGuard(this.#headers)); } [nodeUtil.inspect.custom](depth, options) { if (options.depth === null) { @@ -9984,8 +10518,56 @@ var require_request2 = __commonJS({ }; return `Request ${nodeUtil.formatWithOptions(options, properties)}`; } - }; - mixinBody(Request); + /** + * @param {Request} request + * @param {AbortSignal} newSignal + */ + static setRequestSignal(request, newSignal) { + request.#signal = newSignal; + return request; + } + /** + * @param {Request} request + */ + static getRequestDispatcher(request) { + return request.#dispatcher; + } + /** + * @param {Request} request + * @param {import('../../dispatcher/dispatcher')} newDispatcher + */ + static setRequestDispatcher(request, newDispatcher) { + request.#dispatcher = newDispatcher; + } + /** + * @param {Request} request + * @param {Headers} newHeaders + */ + static setRequestHeaders(request, newHeaders) { + request.#headers = newHeaders; + } + /** + * @param {Request} request + */ + static getRequestState(request) { + return request.#state; + } + /** + * @param {Request} request + * @param {any} newState + */ + static setRequestState(request, newState) { + request.#state = newState; + } + }; + var { setRequestSignal, getRequestDispatcher, setRequestDispatcher, setRequestHeaders, getRequestState, setRequestState } = Request; + Reflect.deleteProperty(Request, "setRequestSignal"); + Reflect.deleteProperty(Request, "getRequestDispatcher"); + Reflect.deleteProperty(Request, "setRequestDispatcher"); + Reflect.deleteProperty(Request, "setRequestHeaders"); + Reflect.deleteProperty(Request, "getRequestState"); + Reflect.deleteProperty(Request, "setRequestState"); + mixinBody(Request, getRequestState); function makeRequest(init) { return { method: init.method ?? "GET", @@ -10037,13 +10619,15 @@ var require_request2 = __commonJS({ return newRequest; } __name(cloneRequest, "cloneRequest"); - function fromInnerRequest(innerRequest, signal, guard) { + function fromInnerRequest(innerRequest, dispatcher, signal, guard) { const request = new Request(kConstruct); - request[kState] = innerRequest; - request[kSignal] = signal; - request[kHeaders] = new Headers(kConstruct); - setHeadersList(request[kHeaders], innerRequest.headersList); - setHeadersGuard(request[kHeaders], guard); + setRequestState(request, innerRequest); + setRequestDispatcher(request, dispatcher); + setRequestSignal(request, signal); + const headers = new Headers(kConstruct); + setRequestHeaders(request, headers); + setHeadersList(headers, innerRequest.headersList); + setHeadersGuard(headers, guard); return request; } __name(fromInnerRequest, "fromInnerRequest"); @@ -10073,21 +10657,16 @@ var require_request2 = __commonJS({ configurable: true } }); - webidl.converters.Request = webidl.interfaceConverter( - Request - ); + webidl.is.Request = webidl.util.MakeTypeAssertion(Request); webidl.converters.RequestInfo = function(V, prefix, argument) { if (typeof V === "string") { - return webidl.converters.USVString(V, prefix, argument); + return webidl.converters.USVString(V); } - if (V instanceof Request) { - return webidl.converters.Request(V, prefix, argument); + if (webidl.is.Request(V)) { + return V; } - return webidl.converters.USVString(V, prefix, argument); + return webidl.converters.USVString(V); }; - webidl.converters.AbortSignal = webidl.interfaceConverter( - AbortSignal - ); webidl.converters.RequestInit = webidl.dictionaryConverter([ { key: "method", @@ -10151,8 +10730,7 @@ var require_request2 = __commonJS({ (signal) => webidl.converters.AbortSignal( signal, "RequestInit", - "signal", - { strict: false } + "signal" ) ) }, @@ -10171,7 +10749,14 @@ var require_request2 = __commonJS({ converter: webidl.converters.any } ]); - module2.exports = { Request, makeRequest, fromInnerRequest, cloneRequest }; + module2.exports = { + Request, + makeRequest, + fromInnerRequest, + cloneRequest, + getRequestDispatcher, + getRequestState + }; } }); @@ -10184,10 +10769,11 @@ var require_fetch = __commonJS({ makeAppropriateNetworkError, filterResponse, makeResponse, - fromInnerResponse + fromInnerResponse, + getResponseState } = require_response(); var { HeadersList } = require_headers(); - var { Request, cloneRequest } = require_request2(); + var { Request, cloneRequest, getRequestDispatcher, getRequestState } = require_request2(); var zlib = require("node:zlib"); var { bytesMatch, @@ -10207,7 +10793,6 @@ var require_fetch = __commonJS({ determineRequestsReferrer, coarsenedSharedCurrentTime, createDeferredPromise, - isBlobLike, sameOrigin, isCancelled, isAborted, @@ -10224,7 +10809,6 @@ var require_fetch = __commonJS({ createInflate, extractMimeType } = require_util2(); - var { kState, kDispatcher } = require_symbols2(); var assert = require("node:assert"); var { safelyExtractBody, extractBody } = require_body(); var { @@ -10235,8 +10819,8 @@ var require_fetch = __commonJS({ subresourceSet } = require_constants3(); var EE = require("node:events"); - var { Readable, pipeline, finished } = require("node:stream"); - var { addAbortListener, isErrored, isReadable, bufferToLowerCasedHeaderName } = require_util(); + var { Readable, pipeline, finished, isErrored, isReadable } = require("node:stream"); + var { addAbortListener, bufferToLowerCasedHeaderName } = require_util(); var { dataURLProcessor, serializeAMimeType, minimizeSupportedMimeType } = require_data_url(); var { getGlobalDispatcher: getGlobalDispatcher2 } = require_global2(); var { webidl } = require_webidl(); @@ -10291,7 +10875,7 @@ var require_fetch = __commonJS({ p.reject(e); return p.promise; } - const request = requestObject[kState]; + const request = getRequestState(requestObject); if (requestObject.signal.aborted) { abortFetch(p, request, null, requestObject.signal.reason); return p.promise; @@ -10333,7 +10917,7 @@ var require_fetch = __commonJS({ request, processResponseEndOfBody: handleFetchDone, processResponse, - dispatcher: requestObject[kDispatcher] + dispatcher: getRequestDispatcher(requestObject) // undici }); return p.promise; @@ -10377,7 +10961,7 @@ var require_fetch = __commonJS({ if (p) { p.reject(error); } - if (request.body != null && isReadable(request.body?.stream)) { + if (request.body?.stream != null && isReadable(request.body.stream)) { request.body.stream.cancel(error).catch((err) => { if (err.code === "ERR_INVALID_STATE") { return; @@ -10388,8 +10972,8 @@ var require_fetch = __commonJS({ if (responseObject == null) { return; } - const response = responseObject[kState]; - if (response.body != null && isReadable(response.body?.stream)) { + const response = getResponseState(responseObject); + if (response.body?.stream != null && isReadable(response.body.stream)) { response.body.stream.cancel(error).catch((err) => { if (err.code === "ERR_INVALID_STATE") { return; @@ -10483,36 +11067,33 @@ var require_fetch = __commonJS({ request.referrer = determineRequestsReferrer(request); } if (response === null) { - response = await (async () => { - const currentURL = requestCurrentURL(request); - if ( - // - request?s current URL?s origin is same origin with request?s origin, - // and request?s response tainting is "basic" - sameOrigin(currentURL, request.url) && request.responseTainting === "basic" || // request?s current URL?s scheme is "data" - currentURL.protocol === "data:" || // - request?s mode is "navigate" or "websocket" - (request.mode === "navigate" || request.mode === "websocket") - ) { - request.responseTainting = "basic"; - return await schemeFetch(fetchParams); - } - if (request.mode === "same-origin") { - return makeNetworkError('request mode cannot be "same-origin"'); - } - if (request.mode === "no-cors") { - if (request.redirect !== "follow") { - return makeNetworkError( - 'redirect mode cannot be "follow" for "no-cors" request' - ); - } + const currentURL = requestCurrentURL(request); + if ( + // - request?s current URL?s origin is same origin with request?s origin, + // and request?s response tainting is "basic" + sameOrigin(currentURL, request.url) && request.responseTainting === "basic" || // request?s current URL?s scheme is "data" + currentURL.protocol === "data:" || // - request?s mode is "navigate" or "websocket" + (request.mode === "navigate" || request.mode === "websocket") + ) { + request.responseTainting = "basic"; + response = await schemeFetch(fetchParams); + } else if (request.mode === "same-origin") { + response = makeNetworkError('request mode cannot be "same-origin"'); + } else if (request.mode === "no-cors") { + if (request.redirect !== "follow") { + response = makeNetworkError( + 'redirect mode cannot be "follow" for "no-cors" request' + ); + } else { request.responseTainting = "opaque"; - return await schemeFetch(fetchParams); - } - if (!urlIsHttpHttpsScheme(requestCurrentURL(request))) { - return makeNetworkError("URL scheme must be a HTTP(S) scheme"); + response = await schemeFetch(fetchParams); } + } else if (!urlIsHttpHttpsScheme(requestCurrentURL(request))) { + response = makeNetworkError("URL scheme must be a HTTP(S) scheme"); + } else { request.responseTainting = "cors"; - return await httpFetch(fetchParams); - })(); + response = await httpFetch(fetchParams); + } } if (recursive) { return response; @@ -10583,7 +11164,7 @@ var require_fetch = __commonJS({ return Promise.resolve(makeNetworkError("NetworkError when attempting to fetch resource.")); } const blob = resolveObjectURL(blobURLEntry.toString()); - if (request.method !== "GET" || !isBlobLike(blob)) { + if (request.method !== "GET" || !webidl.is.Blob(blob)) { return Promise.resolve(makeNetworkError("invalid method")); } const response = makeResponse(); @@ -10854,13 +11435,13 @@ var require_fetch = __commonJS({ } if (contentLength != null && httpRequest.keepalive) { } - if (httpRequest.referrer instanceof URL) { + if (webidl.is.URL(httpRequest.referrer)) { httpRequest.headersList.append("referer", isomorphicEncode(httpRequest.referrer.href), true); } appendRequestOriginHeader(httpRequest); appendFetchMetadata(httpRequest); if (!httpRequest.headersList.contains("user-agent", true)) { - httpRequest.headersList.append("user-agent", defaultUserAgent); + httpRequest.headersList.append("user-agent", defaultUserAgent, true); } if (httpRequest.cache === "default" && (httpRequest.headersList.contains("if-modified-since", true) || httpRequest.headersList.contains("if-none-match", true) || httpRequest.headersList.contains("if-unmodified-since", true) || httpRequest.headersList.contains("if-match", true) || httpRequest.headersList.contains("if-range", true))) { httpRequest.cache = "no-store"; @@ -11027,8 +11608,8 @@ var require_fetch = __commonJS({ } return makeNetworkError(err); } - const pullAlgorithm = /* @__PURE__ */ __name(async () => { - await fetchParams.controller.resume(); + const pullAlgorithm = /* @__PURE__ */ __name(() => { + return fetchParams.controller.resume(); }, "pullAlgorithm"); const cancelAlgorithm = /* @__PURE__ */ __name((reason) => { if (!isCancelled(fetchParams)) { @@ -11050,8 +11631,9 @@ var require_fetch = __commonJS({ } ); response.body = { stream, source: null, length: null }; - fetchParams.controller.onAborted = onAborted; - fetchParams.controller.on("terminated", onAborted); + if (!fetchParams.controller.resume) { + fetchParams.controller.on("terminated", onAborted); + } fetchParams.controller.resume = async () => { while (true) { let bytes; @@ -11213,9 +11795,6 @@ var require_fetch = __commonJS({ if (this.abort) { fetchParams.controller.off("terminated", this.abort); } - if (fetchParams.controller.onAborted) { - fetchParams.controller.off("terminated", fetchParams.controller.onAborted); - } fetchParams.controller.ended = true; this.body.push(null); }, @@ -11265,7 +11844,6 @@ var require_events = __commonJS({ var { webidl } = require_webidl(); var { kEnumerableProperty } = require_util(); var { kConstruct } = require_symbols(); - var { MessagePort } = require("node:worker_threads"); var MessageEvent2 = class _MessageEvent extends Event { static { __name(this, "MessageEvent"); @@ -11428,7 +12006,10 @@ var require_events = __commonJS({ colno: kEnumerableProperty, error: kEnumerableProperty }); - webidl.converters.MessagePort = webidl.interfaceConverter(MessagePort); + webidl.converters.MessagePort = webidl.interfaceConverter( + webidl.is.MessagePort, + "MessagePort" + ); webidl.converters["sequence"] = webidl.sequenceConverter( webidl.converters.MessagePort ); @@ -11436,17 +12017,17 @@ var require_events = __commonJS({ { key: "bubbles", converter: webidl.converters.boolean, - defaultValue: () => false + defaultValue: /* @__PURE__ */ __name(() => false, "defaultValue") }, { key: "cancelable", converter: webidl.converters.boolean, - defaultValue: () => false + defaultValue: /* @__PURE__ */ __name(() => false, "defaultValue") }, { key: "composed", converter: webidl.converters.boolean, - defaultValue: () => false + defaultValue: /* @__PURE__ */ __name(() => false, "defaultValue") } ]; webidl.converters.MessageEventInit = webidl.dictionaryConverter([ @@ -11454,29 +12035,29 @@ var require_events = __commonJS({ { key: "data", converter: webidl.converters.any, - defaultValue: () => null + defaultValue: /* @__PURE__ */ __name(() => null, "defaultValue") }, { key: "origin", converter: webidl.converters.USVString, - defaultValue: () => "" + defaultValue: /* @__PURE__ */ __name(() => "", "defaultValue") }, { key: "lastEventId", converter: webidl.converters.DOMString, - defaultValue: () => "" + defaultValue: /* @__PURE__ */ __name(() => "", "defaultValue") }, { key: "source", // Node doesn't implement WindowProxy or ServiceWorker, so the only // valid value for source is a MessagePort. converter: webidl.nullableConverter(webidl.converters.MessagePort), - defaultValue: () => null + defaultValue: /* @__PURE__ */ __name(() => null, "defaultValue") }, { key: "ports", converter: webidl.converters["sequence"], - defaultValue: () => new Array(0) + defaultValue: /* @__PURE__ */ __name(() => new Array(0), "defaultValue") } ]); webidl.converters.CloseEventInit = webidl.dictionaryConverter([ @@ -11484,17 +12065,17 @@ var require_events = __commonJS({ { key: "wasClean", converter: webidl.converters.boolean, - defaultValue: () => false + defaultValue: /* @__PURE__ */ __name(() => false, "defaultValue") }, { key: "code", converter: webidl.converters["unsigned short"], - defaultValue: () => 0 + defaultValue: /* @__PURE__ */ __name(() => 0, "defaultValue") }, { key: "reason", converter: webidl.converters.USVString, - defaultValue: () => "" + defaultValue: /* @__PURE__ */ __name(() => "", "defaultValue") } ]); webidl.converters.ErrorEventInit = webidl.dictionaryConverter([ @@ -11502,22 +12083,22 @@ var require_events = __commonJS({ { key: "message", converter: webidl.converters.DOMString, - defaultValue: () => "" + defaultValue: /* @__PURE__ */ __name(() => "", "defaultValue") }, { key: "filename", converter: webidl.converters.USVString, - defaultValue: () => "" + defaultValue: /* @__PURE__ */ __name(() => "", "defaultValue") }, { key: "lineno", converter: webidl.converters["unsigned long"], - defaultValue: () => 0 + defaultValue: /* @__PURE__ */ __name(() => 0, "defaultValue") }, { key: "colno", converter: webidl.converters["unsigned long"], - defaultValue: () => 0 + defaultValue: /* @__PURE__ */ __name(() => 0, "defaultValue") }, { key: "error", @@ -11550,9 +12131,8 @@ var require_constants4 = __commonJS({ CLOSED: 3 }; var sentCloseFrameState = { - NOT_SENT: 0, - PROCESSING: 1, - SENT: 2 + SENT: 1, + RECEIVED: 2 }; var opcodes = { CONTINUATION: 0, @@ -11562,7 +12142,7 @@ var require_constants4 = __commonJS({ PING: 9, PONG: 10 }; - var maxUnsigned16Bit = 2 ** 16 - 1; + var maxUnsigned16Bit = 65535; var parserStates = { INFO: 0, PAYLOADLENGTH_16: 2, @@ -11571,7 +12151,7 @@ var require_constants4 = __commonJS({ }; var emptyBuffer = Buffer.allocUnsafe(0); var sendHints = { - string: 1, + text: 1, typedArray: 2, arrayBuffer: 3, blob: 4 @@ -11581,213 +12161,11 @@ var require_constants4 = __commonJS({ sentCloseFrameState, staticPropertyDescriptors, states, - opcodes, - maxUnsigned16Bit, - parserStates, - emptyBuffer, - sendHints - }; - } -}); - -// lib/web/websocket/symbols.js -var require_symbols3 = __commonJS({ - "lib/web/websocket/symbols.js"(exports2, module2) { - "use strict"; - module2.exports = { - kWebSocketURL: Symbol("url"), - kReadyState: Symbol("ready state"), - kController: Symbol("controller"), - kResponse: Symbol("response"), - kBinaryType: Symbol("binary type"), - kSentClose: Symbol("sent close"), - kReceivedClose: Symbol("received close"), - kByteParser: Symbol("byte parser") - }; - } -}); - -// lib/web/websocket/util.js -var require_util3 = __commonJS({ - "lib/web/websocket/util.js"(exports2, module2) { - "use strict"; - var { kReadyState, kController, kResponse, kBinaryType, kWebSocketURL } = require_symbols3(); - var { states, opcodes } = require_constants4(); - var { ErrorEvent: ErrorEvent2, createFastMessageEvent: createFastMessageEvent2 } = require_events(); - var { isUtf8 } = require("node:buffer"); - var { collectASequenceOfCodePointsFast, removeHTTPWhitespace } = require_data_url(); - function isConnecting(ws) { - return ws[kReadyState] === states.CONNECTING; - } - __name(isConnecting, "isConnecting"); - function isEstablished(ws) { - return ws[kReadyState] === states.OPEN; - } - __name(isEstablished, "isEstablished"); - function isClosing(ws) { - return ws[kReadyState] === states.CLOSING; - } - __name(isClosing, "isClosing"); - function isClosed(ws) { - return ws[kReadyState] === states.CLOSED; - } - __name(isClosed, "isClosed"); - function fireEvent(e, target, eventFactory = (type, init) => new Event(type, init), eventInitDict = {}) { - const event = eventFactory(e, eventInitDict); - target.dispatchEvent(event); - } - __name(fireEvent, "fireEvent"); - function websocketMessageReceived(ws, type, data) { - if (ws[kReadyState] !== states.OPEN) { - return; - } - let dataForEvent; - if (type === opcodes.TEXT) { - try { - dataForEvent = utf8Decode(data); - } catch { - failWebsocketConnection(ws, "Received invalid UTF-8 in text frame."); - return; - } - } else if (type === opcodes.BINARY) { - if (ws[kBinaryType] === "blob") { - dataForEvent = new Blob([data]); - } else { - dataForEvent = toArrayBuffer(data); - } - } - fireEvent("message", ws, createFastMessageEvent2, { - origin: ws[kWebSocketURL].origin, - data: dataForEvent - }); - } - __name(websocketMessageReceived, "websocketMessageReceived"); - function toArrayBuffer(buffer) { - if (buffer.byteLength === buffer.buffer.byteLength) { - return buffer.buffer; - } - return buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength); - } - __name(toArrayBuffer, "toArrayBuffer"); - function isValidSubprotocol(protocol) { - if (protocol.length === 0) { - return false; - } - for (let i = 0; i < protocol.length; ++i) { - const code = protocol.charCodeAt(i); - if (code < 33 || // CTL, contains SP (0x20) and HT (0x09) - code > 126 || code === 34 || // " - code === 40 || // ( - code === 41 || // ) - code === 44 || // , - code === 47 || // / - code === 58 || // : - code === 59 || // ; - code === 60 || // < - code === 61 || // = - code === 62 || // > - code === 63 || // ? - code === 64 || // @ - code === 91 || // [ - code === 92 || // \ - code === 93 || // ] - code === 123 || // { - code === 125) { - return false; - } - } - return true; - } - __name(isValidSubprotocol, "isValidSubprotocol"); - function isValidStatusCode(code) { - if (code >= 1e3 && code < 1015) { - return code !== 1004 && // reserved - code !== 1005 && // "MUST NOT be set as a status code" - code !== 1006; - } - return code >= 3e3 && code <= 4999; - } - __name(isValidStatusCode, "isValidStatusCode"); - function failWebsocketConnection(ws, reason) { - const { [kController]: controller, [kResponse]: response } = ws; - controller.abort(); - if (response?.socket && !response.socket.destroyed) { - response.socket.destroy(); - } - if (reason) { - fireEvent("error", ws, (type, init) => new ErrorEvent2(type, init), { - error: new Error(reason), - message: reason - }); - } - } - __name(failWebsocketConnection, "failWebsocketConnection"); - function isControlFrame(opcode) { - return opcode === opcodes.CLOSE || opcode === opcodes.PING || opcode === opcodes.PONG; - } - __name(isControlFrame, "isControlFrame"); - function isContinuationFrame(opcode) { - return opcode === opcodes.CONTINUATION; - } - __name(isContinuationFrame, "isContinuationFrame"); - function isTextBinaryFrame(opcode) { - return opcode === opcodes.TEXT || opcode === opcodes.BINARY; - } - __name(isTextBinaryFrame, "isTextBinaryFrame"); - function isValidOpcode(opcode) { - return isTextBinaryFrame(opcode) || isContinuationFrame(opcode) || isControlFrame(opcode); - } - __name(isValidOpcode, "isValidOpcode"); - function parseExtensions(extensions) { - const position = { position: 0 }; - const extensionList = /* @__PURE__ */ new Map(); - while (position.position < extensions.length) { - const pair = collectASequenceOfCodePointsFast(";", extensions, position); - const [name, value = ""] = pair.split("="); - extensionList.set( - removeHTTPWhitespace(name, true, false), - removeHTTPWhitespace(value, false, true) - ); - position.position++; - } - return extensionList; - } - __name(parseExtensions, "parseExtensions"); - function isValidClientWindowBits(value) { - for (let i = 0; i < value.length; i++) { - const byte = value.charCodeAt(i); - if (byte < 48 || byte > 57) { - return false; - } - } - return true; - } - __name(isValidClientWindowBits, "isValidClientWindowBits"); - var hasIntl = typeof process.versions.icu === "string"; - var fatalDecoder = hasIntl ? new TextDecoder("utf-8", { fatal: true }) : void 0; - var utf8Decode = hasIntl ? fatalDecoder.decode.bind(fatalDecoder) : function(buffer) { - if (isUtf8(buffer)) { - return buffer.toString("utf-8"); - } - throw new TypeError("Invalid utf-8 received."); - }; - module2.exports = { - isConnecting, - isEstablished, - isClosing, - isClosed, - fireEvent, - isValidSubprotocol, - isValidStatusCode, - failWebsocketConnection, - websocketMessageReceived, - utf8Decode, - isControlFrame, - isContinuationFrame, - isTextBinaryFrame, - isValidOpcode, - parseExtensions, - isValidClientWindowBits + opcodes, + maxUnsigned16Bit, + parserStates, + emptyBuffer, + sendHints }; } }); @@ -11796,8 +12174,8 @@ var require_util3 = __commonJS({ var require_frame = __commonJS({ "lib/web/websocket/frame.js"(exports2, module2) { "use strict"; - var { maxUnsigned16Bit } = require_constants4(); - var BUFFER_SIZE = 16386; + var { maxUnsigned16Bit, opcodes } = require_constants4(); + var BUFFER_SIZE = 8 * 1024; var crypto; var buffer = null; var bufIdx = BUFFER_SIZE; @@ -11817,7 +12195,7 @@ var require_frame = __commonJS({ function generateMask() { if (bufIdx === BUFFER_SIZE) { bufIdx = 0; - crypto.randomFillSync(buffer ??= Buffer.allocUnsafe(BUFFER_SIZE), 0, BUFFER_SIZE); + crypto.randomFillSync(buffer ??= Buffer.allocUnsafeSlow(BUFFER_SIZE), 0, BUFFER_SIZE); } return [buffer[bufIdx++], buffer[bufIdx++], buffer[bufIdx++], buffer[bufIdx++]]; } @@ -11866,6 +12244,39 @@ var require_frame = __commonJS({ } return buffer2; } + /** + * @param {Uint8Array} buffer + */ + static createFastTextFrame(buffer2) { + const maskKey = generateMask(); + const bodyLength = buffer2.length; + for (let i = 0; i < bodyLength; ++i) { + buffer2[i] ^= maskKey[i & 3]; + } + let payloadLength = bodyLength; + let offset = 6; + if (bodyLength > maxUnsigned16Bit) { + offset += 8; + payloadLength = 127; + } else if (bodyLength > 125) { + offset += 2; + payloadLength = 126; + } + const head = Buffer.allocUnsafeSlow(offset); + head[0] = 128 | opcodes.TEXT; + head[1] = payloadLength | 128; + head[offset - 4] = maskKey[0]; + head[offset - 3] = maskKey[1]; + head[offset - 2] = maskKey[2]; + head[offset - 1] = maskKey[3]; + if (payloadLength === 126) { + head.writeUInt16BE(bodyLength, 2); + } else if (payloadLength === 127) { + head[2] = head[3] = 0; + head.writeUIntBE(bodyLength, 4, 6); + } + return [head, buffer2]; + } }; module2.exports = { WebsocketFrameSend @@ -11878,27 +12289,20 @@ var require_connection = __commonJS({ "lib/web/websocket/connection.js"(exports2, module2) { "use strict"; var { uid, states, sentCloseFrameState, emptyBuffer, opcodes } = require_constants4(); - var { - kReadyState, - kSentClose, - kByteParser, - kReceivedClose, - kResponse - } = require_symbols3(); - var { fireEvent, failWebsocketConnection, isClosing, isClosed, isEstablished, parseExtensions } = require_util3(); + var { failWebsocketConnection, parseExtensions, isClosed, isClosing, isEstablished, validateCloseCodeAndReason } = require_util3(); var { channels } = require_diagnostics(); - var { CloseEvent: CloseEvent2 } = require_events(); var { makeRequest } = require_request2(); var { fetching } = require_fetch(); var { Headers, getHeadersList } = require_headers(); var { getDecodeSplit } = require_util2(); var { WebsocketFrameSend } = require_frame(); + var assert = require("node:assert"); var crypto; try { crypto = require("node:crypto"); } catch { } - function establishWebSocketConnection(url, protocols, client, ws, onEstablish, options) { + function establishWebSocketConnection(url, protocols, client, handler, options) { const requestURL = url; requestURL.protocol = url.protocol === "ws:" ? "http:" : "https:"; const request = makeRequest({ @@ -11916,38 +12320,41 @@ var require_connection = __commonJS({ request.headersList = headersList; } const keyValue = crypto.randomBytes(16).toString("base64"); - request.headersList.append("sec-websocket-key", keyValue); - request.headersList.append("sec-websocket-version", "13"); + request.headersList.append("sec-websocket-key", keyValue, true); + request.headersList.append("sec-websocket-version", "13", true); for (const protocol of protocols) { - request.headersList.append("sec-websocket-protocol", protocol); + request.headersList.append("sec-websocket-protocol", protocol, true); } const permessageDeflate = "permessage-deflate; client_max_window_bits"; - request.headersList.append("sec-websocket-extensions", permessageDeflate); + request.headersList.append("sec-websocket-extensions", permessageDeflate, true); const controller = fetching({ request, useParallelQueue: true, dispatcher: options.dispatcher, processResponse(response) { + if (response.type === "error") { + handler.readyState = states.CLOSED; + } if (response.type === "error" || response.status !== 101) { - failWebsocketConnection(ws, "Received network error or non-101 status code."); + failWebsocketConnection(handler, 1002, "Received network error or non-101 status code."); return; } if (protocols.length !== 0 && !response.headersList.get("Sec-WebSocket-Protocol")) { - failWebsocketConnection(ws, "Server did not respond with sent protocols."); + failWebsocketConnection(handler, 1002, "Server did not respond with sent protocols."); return; } if (response.headersList.get("Upgrade")?.toLowerCase() !== "websocket") { - failWebsocketConnection(ws, 'Server did not set Upgrade header to "websocket".'); + failWebsocketConnection(handler, 1002, 'Server did not set Upgrade header to "websocket".'); return; } if (response.headersList.get("Connection")?.toLowerCase() !== "upgrade") { - failWebsocketConnection(ws, 'Server did not set Connection header to "upgrade".'); + failWebsocketConnection(handler, 1002, 'Server did not set Connection header to "upgrade".'); return; } const secWSAccept = response.headersList.get("Sec-WebSocket-Accept"); const digest = crypto.createHash("sha1").update(keyValue + uid).digest("base64"); if (secWSAccept !== digest) { - failWebsocketConnection(ws, "Incorrect hash received in Sec-WebSocket-Accept header."); + failWebsocketConnection(handler, 1002, "Incorrect hash received in Sec-WebSocket-Accept header."); return; } const secExtension = response.headersList.get("Sec-WebSocket-Extensions"); @@ -11955,7 +12362,7 @@ var require_connection = __commonJS({ if (secExtension !== null) { extensions = parseExtensions(secExtension); if (!extensions.has("permessage-deflate")) { - failWebsocketConnection(ws, "Sec-WebSocket-Extensions header does not match."); + failWebsocketConnection(handler, 1002, "Sec-WebSocket-Extensions header does not match."); return; } } @@ -11963,13 +12370,13 @@ var require_connection = __commonJS({ if (secProtocol !== null) { const requestProtocols = getDecodeSplit("sec-websocket-protocol", request.headersList); if (!requestProtocols.includes(secProtocol)) { - failWebsocketConnection(ws, "Protocol was not set in the opening handshake."); + failWebsocketConnection(handler, 1002, "Protocol was not set in the opening handshake."); return; } } - response.socket.on("data", onSocketData); - response.socket.on("close", onSocketClose); - response.socket.on("error", onSocketError); + response.socket.on("data", handler.onSocketData); + response.socket.on("close", handler.onSocketClose); + response.socket.on("error", handler.onSocketError); if (channels.open.hasSubscribers) { channels.open.publish({ address: response.socket.address(), @@ -11977,88 +12384,252 @@ var require_connection = __commonJS({ extensions: secExtension }); } - onEstablish(response, extensions); + handler.wasEverConnected = true; + handler.onConnectionEstablished(response, extensions); } }); return controller; } __name(establishWebSocketConnection, "establishWebSocketConnection"); - function closeWebSocketConnection(ws, code, reason, reasonByteLength) { - if (isClosing(ws) || isClosed(ws)) { - } else if (!isEstablished(ws)) { - failWebsocketConnection(ws, "Connection was closed before it was established."); - ws[kReadyState] = states.CLOSING; - } else if (ws[kSentClose] === sentCloseFrameState.NOT_SENT) { - ws[kSentClose] = sentCloseFrameState.PROCESSING; + function closeWebSocketConnection(object, code, reason, validate = false) { + code ??= null; + reason ??= ""; + if (validate) validateCloseCodeAndReason(code, reason); + if (isClosed(object.readyState) || isClosing(object.readyState)) { + } else if (!isEstablished(object.readyState)) { + failWebsocketConnection(object); + object.readyState = states.CLOSING; + } else if (!object.closeState.has(sentCloseFrameState.SENT) && !object.closeState.has(sentCloseFrameState.RECEIVED)) { const frame = new WebsocketFrameSend(); - if (code !== void 0 && reason === void 0) { + if (reason.length !== 0 && code === null) { + code = 1e3; + } + assert(code === null || Number.isInteger(code)); + if (code === null && reason.length === 0) { + frame.frameData = emptyBuffer; + } else if (code !== null && reason === null) { frame.frameData = Buffer.allocUnsafe(2); frame.frameData.writeUInt16BE(code, 0); - } else if (code !== void 0 && reason !== void 0) { - frame.frameData = Buffer.allocUnsafe(2 + reasonByteLength); + } else if (code !== null && reason !== null) { + frame.frameData = Buffer.allocUnsafe(2 + Buffer.byteLength(reason)); frame.frameData.writeUInt16BE(code, 0); frame.frameData.write(reason, 2, "utf-8"); } else { frame.frameData = emptyBuffer; } - const socket = ws[kResponse].socket; - socket.write(frame.createFrame(opcodes.CLOSE)); - ws[kSentClose] = sentCloseFrameState.SENT; - ws[kReadyState] = states.CLOSING; + object.socket.write(frame.createFrame(opcodes.CLOSE)); + object.closeState.add(sentCloseFrameState.SENT); + object.readyState = states.CLOSING; } else { - ws[kReadyState] = states.CLOSING; + object.readyState = states.CLOSING; } } __name(closeWebSocketConnection, "closeWebSocketConnection"); - function onSocketData(chunk) { - if (!this.ws[kByteParser].write(chunk)) { - this.pause(); + module2.exports = { + establishWebSocketConnection, + closeWebSocketConnection + }; + } +}); + +// lib/web/websocket/util.js +var require_util3 = __commonJS({ + "lib/web/websocket/util.js"(exports2, module2) { + "use strict"; + var { states, opcodes } = require_constants4(); + var { isUtf8 } = require("node:buffer"); + var { collectASequenceOfCodePointsFast, removeHTTPWhitespace } = require_data_url(); + function isConnecting(readyState) { + return readyState === states.CONNECTING; + } + __name(isConnecting, "isConnecting"); + function isEstablished(readyState) { + return readyState === states.OPEN; + } + __name(isEstablished, "isEstablished"); + function isClosing(readyState) { + return readyState === states.CLOSING; + } + __name(isClosing, "isClosing"); + function isClosed(readyState) { + return readyState === states.CLOSED; + } + __name(isClosed, "isClosed"); + function fireEvent(e, target, eventFactory = (type, init) => new Event(type, init), eventInitDict = {}) { + const event = eventFactory(e, eventInitDict); + target.dispatchEvent(event); + } + __name(fireEvent, "fireEvent"); + function websocketMessageReceived(handler, type, data) { + handler.onMessage(type, data); + } + __name(websocketMessageReceived, "websocketMessageReceived"); + function toArrayBuffer(buffer) { + if (buffer.byteLength === buffer.buffer.byteLength) { + return buffer.buffer; } + return buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength); } - __name(onSocketData, "onSocketData"); - function onSocketClose() { - const { ws } = this; - const { [kResponse]: response } = ws; - response.socket.off("data", onSocketData); - response.socket.off("close", onSocketClose); - response.socket.off("error", onSocketError); - const wasClean = ws[kSentClose] === sentCloseFrameState.SENT && ws[kReceivedClose]; - let code = 1005; - let reason = ""; - const result = ws[kByteParser].closingInfo; - if (result && !result.error) { - code = result.code ?? 1005; - reason = result.reason; - } else if (!ws[kReceivedClose]) { - code = 1006; - } - ws[kReadyState] = states.CLOSED; - fireEvent("close", ws, (type, init) => new CloseEvent2(type, init), { - wasClean, - code, - reason - }); - if (channels.close.hasSubscribers) { - channels.close.publish({ - websocket: ws, - code, - reason - }); + __name(toArrayBuffer, "toArrayBuffer"); + function isValidSubprotocol(protocol) { + if (protocol.length === 0) { + return false; + } + for (let i = 0; i < protocol.length; ++i) { + const code = protocol.charCodeAt(i); + if (code < 33 || // CTL, contains SP (0x20) and HT (0x09) + code > 126 || code === 34 || // " + code === 40 || // ( + code === 41 || // ) + code === 44 || // , + code === 47 || // / + code === 58 || // : + code === 59 || // ; + code === 60 || // < + code === 61 || // = + code === 62 || // > + code === 63 || // ? + code === 64 || // @ + code === 91 || // [ + code === 92 || // \ + code === 93 || // ] + code === 123 || // { + code === 125) { + return false; + } } + return true; } - __name(onSocketClose, "onSocketClose"); - function onSocketError(error) { - const { ws } = this; - ws[kReadyState] = states.CLOSING; - if (channels.socketError.hasSubscribers) { - channels.socketError.publish(error); + __name(isValidSubprotocol, "isValidSubprotocol"); + function isValidStatusCode(code) { + if (code >= 1e3 && code < 1015) { + return code !== 1004 && // reserved + code !== 1005 && // "MUST NOT be set as a status code" + code !== 1006; + } + return code >= 3e3 && code <= 4999; + } + __name(isValidStatusCode, "isValidStatusCode"); + function failWebsocketConnection(handler, code, reason) { + if (isEstablished(handler.readyState)) { + const { closeWebSocketConnection } = require_connection(); + closeWebSocketConnection(handler, code, reason, false); + } + handler.controller.abort(); + if (handler.socket?.destroyed === false) { + handler.socket.destroy(); + } + handler.onFail(code, reason); + } + __name(failWebsocketConnection, "failWebsocketConnection"); + function isControlFrame(opcode) { + return opcode === opcodes.CLOSE || opcode === opcodes.PING || opcode === opcodes.PONG; + } + __name(isControlFrame, "isControlFrame"); + function isContinuationFrame(opcode) { + return opcode === opcodes.CONTINUATION; + } + __name(isContinuationFrame, "isContinuationFrame"); + function isTextBinaryFrame(opcode) { + return opcode === opcodes.TEXT || opcode === opcodes.BINARY; + } + __name(isTextBinaryFrame, "isTextBinaryFrame"); + function isValidOpcode(opcode) { + return isTextBinaryFrame(opcode) || isContinuationFrame(opcode) || isControlFrame(opcode); + } + __name(isValidOpcode, "isValidOpcode"); + function parseExtensions(extensions) { + const position = { position: 0 }; + const extensionList = /* @__PURE__ */ new Map(); + while (position.position < extensions.length) { + const pair = collectASequenceOfCodePointsFast(";", extensions, position); + const [name, value = ""] = pair.split("="); + extensionList.set( + removeHTTPWhitespace(name, true, false), + removeHTTPWhitespace(value, false, true) + ); + position.position++; + } + return extensionList; + } + __name(parseExtensions, "parseExtensions"); + function isValidClientWindowBits(value) { + for (let i = 0; i < value.length; i++) { + const byte = value.charCodeAt(i); + if (byte < 48 || byte > 57) { + return false; + } + } + return true; + } + __name(isValidClientWindowBits, "isValidClientWindowBits"); + function getURLRecord(url, baseURL) { + let urlRecord; + try { + urlRecord = new URL(url, baseURL); + } catch (e) { + throw new DOMException(e, "SyntaxError"); + } + if (urlRecord.protocol === "http:") { + urlRecord.protocol = "ws:"; + } else if (urlRecord.protocol === "https:") { + urlRecord.protocol = "wss:"; + } + if (urlRecord.protocol !== "ws:" && urlRecord.protocol !== "wss:") { + throw new DOMException("expected a ws: or wss: url", "SyntaxError"); + } + if (urlRecord.hash.length || urlRecord.href.endsWith("#")) { + throw new DOMException("hash", "SyntaxError"); + } + return urlRecord; + } + __name(getURLRecord, "getURLRecord"); + function validateCloseCodeAndReason(code, reason) { + if (code !== null) { + if (code !== 1e3 && (code < 3e3 || code > 4999)) { + throw new DOMException("invalid code", "InvalidAccessError"); + } + } + if (reason !== null) { + const reasonBytesLength = Buffer.byteLength(reason); + if (reasonBytesLength > 123) { + throw new DOMException(`Reason must be less than 123 bytes; received ${reasonBytesLength}`, "SyntaxError"); + } } - this.destroy(); } - __name(onSocketError, "onSocketError"); + __name(validateCloseCodeAndReason, "validateCloseCodeAndReason"); + var utf8Decode = (() => { + if (typeof process.versions.icu === "string") { + const fatalDecoder = new TextDecoder("utf-8", { fatal: true }); + return fatalDecoder.decode.bind(fatalDecoder); + } + return function(buffer) { + if (isUtf8(buffer)) { + return buffer.toString("utf-8"); + } + throw new TypeError("Invalid utf-8 received."); + }; + })(); module2.exports = { - establishWebSocketConnection, - closeWebSocketConnection + isConnecting, + isEstablished, + isClosing, + isClosed, + fireEvent, + isValidSubprotocol, + isValidStatusCode, + failWebsocketConnection, + websocketMessageReceived, + utf8Decode, + isControlFrame, + isContinuationFrame, + isTextBinaryFrame, + isValidOpcode, + parseExtensions, + isValidClientWindowBits, + toArrayBuffer, + getURLRecord, + validateCloseCodeAndReason }; } }); @@ -12128,7 +12699,6 @@ var require_receiver = __commonJS({ var { Writable } = require("node:stream"); var assert = require("node:assert"); var { parserStates, opcodes, states, emptyBuffer, sentCloseFrameState } = require_constants4(); - var { kReadyState, kSentClose, kResponse, kReceivedClose } = require_symbols3(); var { channels } = require_diagnostics(); var { isValidStatusCode, @@ -12141,7 +12711,6 @@ var require_receiver = __commonJS({ isContinuationFrame } = require_util3(); var { WebsocketFrameSend } = require_frame(); - var { closeWebSocketConnection } = require_connection(); var { PerMessageDeflate } = require_permessage_deflate(); var ByteParser = class extends Writable { static { @@ -12155,9 +12724,11 @@ var require_receiver = __commonJS({ #fragments = []; /** @type {Map} */ #extensions; - constructor(ws, extensions) { + /** @type {import('./websocket').Handler} */ + #handler; + constructor(handler, extensions) { super(); - this.ws = ws; + this.#handler = handler; this.#extensions = extensions == null ? /* @__PURE__ */ new Map() : extensions; if (this.#extensions.has("permessage-deflate")) { this.#extensions.set("permessage-deflate", new PerMessageDeflate(extensions)); @@ -12194,39 +12765,39 @@ var require_receiver = __commonJS({ const rsv2 = buffer[0] & 32; const rsv3 = buffer[0] & 16; if (!isValidOpcode(opcode)) { - failWebsocketConnection(this.ws, "Invalid opcode received"); + failWebsocketConnection(this.#handler, 1002, "Invalid opcode received"); return callback(); } if (masked) { - failWebsocketConnection(this.ws, "Frame cannot be masked"); + failWebsocketConnection(this.#handler, 1002, "Frame cannot be masked"); return callback(); } if (rsv1 !== 0 && !this.#extensions.has("permessage-deflate")) { - failWebsocketConnection(this.ws, "Expected RSV1 to be clear."); + failWebsocketConnection(this.#handler, 1002, "Expected RSV1 to be clear."); return; } if (rsv2 !== 0 || rsv3 !== 0) { - failWebsocketConnection(this.ws, "RSV1, RSV2, RSV3 must be clear"); + failWebsocketConnection(this.#handler, 1002, "RSV1, RSV2, RSV3 must be clear"); return; } if (fragmented && !isTextBinaryFrame(opcode)) { - failWebsocketConnection(this.ws, "Invalid frame type was fragmented."); + failWebsocketConnection(this.#handler, 1002, "Invalid frame type was fragmented."); return; } if (isTextBinaryFrame(opcode) && this.#fragments.length > 0) { - failWebsocketConnection(this.ws, "Expected continuation frame"); + failWebsocketConnection(this.#handler, 1002, "Expected continuation frame"); return; } if (this.#info.fragmented && fragmented) { - failWebsocketConnection(this.ws, "Fragmented frame exceeded 125 bytes."); + failWebsocketConnection(this.#handler, 1002, "Fragmented frame exceeded 125 bytes."); return; } if ((payloadLength > 125 || fragmented) && isControlFrame(opcode)) { - failWebsocketConnection(this.ws, "Control frame either too large or fragmented"); + failWebsocketConnection(this.#handler, 1002, "Control frame either too large or fragmented"); return; } if (isContinuationFrame(opcode) && this.#fragments.length === 0 && !this.#info.compressed) { - failWebsocketConnection(this.ws, "Unexpected continuation frame"); + failWebsocketConnection(this.#handler, 1002, "Unexpected continuation frame"); return; } if (payloadLength <= 125) { @@ -12259,7 +12830,7 @@ var require_receiver = __commonJS({ const buffer = this.consume(8); const upper = buffer.readUInt32BE(0); if (upper > 2 ** 31 - 1) { - failWebsocketConnection(this.ws, "Received payload length > 2^31 bytes."); + failWebsocketConnection(this.#handler, 1009, "Received payload length > 2^31 bytes."); return; } const lower = buffer.readUInt32BE(4); @@ -12278,14 +12849,14 @@ var require_receiver = __commonJS({ this.#fragments.push(body); if (!this.#info.fragmented && this.#info.fin) { const fullMessage = Buffer.concat(this.#fragments); - websocketMessageReceived(this.ws, this.#info.binaryType, fullMessage); + websocketMessageReceived(this.#handler, this.#info.binaryType, fullMessage); this.#fragments.length = 0; } this.#state = parserStates.INFO; } else { this.#extensions.get("permessage-deflate").decompress(body, this.#info.fin, (error, data) => { if (error) { - closeWebSocketConnection(this.ws, 1007, error.message, error.message.length); + failWebsocketConnection(this.#handler, 1007, error.message); return; } this.#fragments.push(data); @@ -12295,7 +12866,7 @@ var require_receiver = __commonJS({ this.run(callback); return; } - websocketMessageReceived(this.ws, this.#info.binaryType, Buffer.concat(this.#fragments)); + websocketMessageReceived(this.#handler, this.#info.binaryType, Buffer.concat(this.#fragments)); this.#loop = true; this.#state = parserStates.INFO; this.#fragments.length = 0; @@ -12371,39 +12942,32 @@ var require_receiver = __commonJS({ const { opcode, payloadLength } = this.#info; if (opcode === opcodes.CLOSE) { if (payloadLength === 1) { - failWebsocketConnection(this.ws, "Received close frame with a 1-byte body."); + failWebsocketConnection(this.#handler, 1002, "Received close frame with a 1-byte body."); return false; } this.#info.closeInfo = this.parseCloseBody(body); if (this.#info.closeInfo.error) { const { code, reason } = this.#info.closeInfo; - closeWebSocketConnection(this.ws, code, reason, reason.length); - failWebsocketConnection(this.ws, reason); + failWebsocketConnection(this.#handler, code, reason); return false; } - if (this.ws[kSentClose] !== sentCloseFrameState.SENT) { + if (!this.#handler.closeState.has(sentCloseFrameState.SENT) && !this.#handler.closeState.has(sentCloseFrameState.RECEIVED)) { let body2 = emptyBuffer; if (this.#info.closeInfo.code) { body2 = Buffer.allocUnsafe(2); body2.writeUInt16BE(this.#info.closeInfo.code, 0); } const closeFrame = new WebsocketFrameSend(body2); - this.ws[kResponse].socket.write( - closeFrame.createFrame(opcodes.CLOSE), - (err) => { - if (!err) { - this.ws[kSentClose] = sentCloseFrameState.SENT; - } - } - ); + this.#handler.socket.write(closeFrame.createFrame(opcodes.CLOSE)); + this.#handler.closeState.add(sentCloseFrameState.SENT); } - this.ws[kReadyState] = states.CLOSING; - this.ws[kReceivedClose] = true; + this.#handler.readyState = states.CLOSING; + this.#handler.closeState.add(sentCloseFrameState.RECEIVED); return false; } else if (opcode === opcodes.PING) { - if (!this.ws[kReceivedClose]) { + if (!this.#handler.closeState.has(sentCloseFrameState.RECEIVED)) { const frame = new WebsocketFrameSend(body); - this.ws[kResponse].socket.write(frame.createFrame(opcodes.PONG)); + this.#handler.socket.write(frame.createFrame(opcodes.PONG)); if (channels.ping.hasSubscribers) { channels.ping.publish({ payload: body @@ -12436,7 +13000,6 @@ var require_sender = __commonJS({ var { WebsocketFrameSend } = require_frame(); var { opcodes, sendHints } = require_constants4(); var FixedQueue = require_fixed_queue(); - var FastBuffer = Buffer[Symbol.species]; var SendQueue = class { static { __name(this, "SendQueue"); @@ -12456,14 +13019,21 @@ var require_sender = __commonJS({ } add(item, cb, hint) { if (hint !== sendHints.blob) { - const frame = createFrame(item, hint); if (!this.#running) { - this.#socket.write(frame, cb); + if (hint === sendHints.text) { + const { 0: head, 1: body } = WebsocketFrameSend.createFastTextFrame(item); + this.#socket.cork(); + this.#socket.write(head); + this.#socket.write(body, cb); + this.#socket.uncork(); + } else { + this.#socket.write(createFrame(item, hint), cb); + } } else { const node2 = { promise: null, callback: cb, - frame + frame: createFrame(item, hint) }; this.#queue.push(node2); } @@ -12497,18 +13067,17 @@ var require_sender = __commonJS({ } }; function createFrame(data, hint) { - return new WebsocketFrameSend(toBuffer(data, hint)).createFrame(hint === sendHints.string ? opcodes.TEXT : opcodes.BINARY); + return new WebsocketFrameSend(toBuffer(data, hint)).createFrame(hint === sendHints.text ? opcodes.TEXT : opcodes.BINARY); } __name(createFrame, "createFrame"); function toBuffer(data, hint) { switch (hint) { - case sendHints.string: - return Buffer.from(data); + case sendHints.text: + case sendHints.typedArray: + return new Uint8Array(data.buffer, data.byteOffset, data.byteLength); case sendHints.arrayBuffer: case sendHints.blob: - return new FastBuffer(data); - case sendHints.typedArray: - return new FastBuffer(data.buffer, data.byteOffset, data.byteLength); + return new Uint8Array(data); } } __name(toBuffer, "toBuffer"); @@ -12523,30 +13092,26 @@ var require_websocket = __commonJS({ var { webidl } = require_webidl(); var { URLSerializer } = require_data_url(); var { environmentSettingsObject } = require_util2(); - var { staticPropertyDescriptors, states, sentCloseFrameState, sendHints } = require_constants4(); - var { - kWebSocketURL, - kReadyState, - kController, - kBinaryType, - kResponse, - kSentClose, - kByteParser - } = require_symbols3(); + var { staticPropertyDescriptors, states, sentCloseFrameState, sendHints, opcodes } = require_constants4(); var { isConnecting, isEstablished, isClosing, isValidSubprotocol, - fireEvent + fireEvent, + failWebsocketConnection, + utf8Decode, + toArrayBuffer, + getURLRecord } = require_util3(); var { establishWebSocketConnection, closeWebSocketConnection } = require_connection(); var { ByteParser } = require_receiver(); - var { kEnumerableProperty, isBlobLike } = require_util(); + var { kEnumerableProperty } = require_util(); var { getGlobalDispatcher: getGlobalDispatcher2 } = require_global2(); var { types } = require("node:util"); - var { ErrorEvent: ErrorEvent2, CloseEvent: CloseEvent2 } = require_events(); + var { ErrorEvent: ErrorEvent2, CloseEvent: CloseEvent2, createFastMessageEvent: createFastMessageEvent2 } = require_events(); var { SendQueue } = require_sender(); + var { channels } = require_diagnostics(); var WebSocket = class _WebSocket extends EventTarget { static { __name(this, "WebSocket"); @@ -12562,6 +13127,36 @@ var require_websocket = __commonJS({ #extensions = ""; /** @type {SendQueue} */ #sendQueue; + /** @type {Handler} */ + #handler = { + onConnectionEstablished: /* @__PURE__ */ __name((response, extensions) => this.#onConnectionEstablished(response, extensions), "onConnectionEstablished"), + onFail: /* @__PURE__ */ __name((code, reason) => this.#onFail(code, reason), "onFail"), + onMessage: /* @__PURE__ */ __name((opcode, data) => this.#onMessage(opcode, data), "onMessage"), + onParserError: /* @__PURE__ */ __name((err) => failWebsocketConnection(this.#handler, null, err.message), "onParserError"), + onParserDrain: /* @__PURE__ */ __name(() => this.#onParserDrain(), "onParserDrain"), + onSocketData: /* @__PURE__ */ __name((chunk) => { + if (!this.#parser.write(chunk)) { + this.#handler.socket.pause(); + } + }, "onSocketData"), + onSocketError: /* @__PURE__ */ __name((err) => { + this.#handler.readyState = states.CLOSING; + if (channels.socketError.hasSubscribers) { + channels.socketError.publish(err); + } + this.#handler.socket.destroy(); + }, "onSocketError"), + onSocketClose: /* @__PURE__ */ __name(() => this.#onSocketClose(), "onSocketClose"), + readyState: states.CONNECTING, + socket: null, + closeState: /* @__PURE__ */ new Set(), + controller: null, + wasEverConnected: false + }; + #url; + #binaryType; + /** @type {import('./receiver').ByteParser} */ + #parser; /** * @param {string} url * @param {string|string[]} protocols @@ -12572,29 +13167,10 @@ var require_websocket = __commonJS({ const prefix = "WebSocket constructor"; webidl.argumentLengthCheck(arguments, 1, prefix); const options = webidl.converters["DOMString or sequence or WebSocketInit"](protocols, prefix, "options"); - url = webidl.converters.USVString(url, prefix, "url"); + url = webidl.converters.USVString(url); protocols = options.protocols; const baseURL = environmentSettingsObject.settingsObject.baseUrl; - let urlRecord; - try { - urlRecord = new URL(url, baseURL); - } catch (e) { - throw new DOMException(e, "SyntaxError"); - } - if (urlRecord.protocol === "http:") { - urlRecord.protocol = "ws:"; - } else if (urlRecord.protocol === "https:") { - urlRecord.protocol = "wss:"; - } - if (urlRecord.protocol !== "ws:" && urlRecord.protocol !== "wss:") { - throw new DOMException( - `Expected a ws: or wss: protocol, got ${urlRecord.protocol}`, - "SyntaxError" - ); - } - if (urlRecord.hash || urlRecord.href.endsWith("#")) { - throw new DOMException("Got fragment", "SyntaxError"); - } + const urlRecord = getURLRecord(url, baseURL); if (typeof protocols === "string") { protocols = [protocols]; } @@ -12604,19 +13180,17 @@ var require_websocket = __commonJS({ if (protocols.length > 0 && !protocols.every((p) => isValidSubprotocol(p))) { throw new DOMException("Invalid Sec-WebSocket-Protocol value", "SyntaxError"); } - this[kWebSocketURL] = new URL(urlRecord.href); + this.#url = new URL(urlRecord.href); const client = environmentSettingsObject.settingsObject; - this[kController] = establishWebSocketConnection( + this.#handler.controller = establishWebSocketConnection( urlRecord, protocols, client, - this, - (response, extensions) => this.#onConnectionEstablished(response, extensions), + this.#handler, options ); - this[kReadyState] = _WebSocket.CONNECTING; - this[kSentClose] = sentCloseFrameState.NOT_SENT; - this[kBinaryType] = "blob"; + this.#handler.readyState = _WebSocket.CONNECTING; + this.#binaryType = "blob"; } /** * @see https://websockets.spec.whatwg.org/#dom-websocket-close @@ -12630,24 +13204,11 @@ var require_websocket = __commonJS({ code = webidl.converters["unsigned short"](code, prefix, "code", { clamp: true }); } if (reason !== void 0) { - reason = webidl.converters.USVString(reason, prefix, "reason"); - } - if (code !== void 0) { - if (code !== 1e3 && (code < 3e3 || code > 4999)) { - throw new DOMException("invalid code", "InvalidAccessError"); - } - } - let reasonByteLength = 0; - if (reason !== void 0) { - reasonByteLength = Buffer.byteLength(reason); - if (reasonByteLength > 123) { - throw new DOMException( - `Reason must be less than 123 bytes; received ${reasonByteLength}`, - "SyntaxError" - ); - } + reason = webidl.converters.USVString(reason); } - closeWebSocketConnection(this, code, reason, reasonByteLength); + code ??= null; + reason ??= ""; + closeWebSocketConnection(this.#handler, code, reason, true); } /** * @see https://websockets.spec.whatwg.org/#dom-websocket-send @@ -12658,18 +13219,18 @@ var require_websocket = __commonJS({ const prefix = "WebSocket.send"; webidl.argumentLengthCheck(arguments, 1, prefix); data = webidl.converters.WebSocketSendData(data, prefix, "data"); - if (isConnecting(this)) { + if (isConnecting(this.#handler.readyState)) { throw new DOMException("Sent before connected.", "InvalidStateError"); } - if (!isEstablished(this) || isClosing(this)) { + if (!isEstablished(this.#handler.readyState) || isClosing(this.#handler.readyState)) { return; } if (typeof data === "string") { - const length = Buffer.byteLength(data); - this.#bufferedAmount += length; - this.#sendQueue.add(data, () => { - this.#bufferedAmount -= length; - }, sendHints.string); + const buffer = Buffer.from(data); + this.#bufferedAmount += buffer.byteLength; + this.#sendQueue.add(buffer, () => { + this.#bufferedAmount -= buffer.byteLength; + }, sendHints.text); } else if (types.isArrayBuffer(data)) { this.#bufferedAmount += data.byteLength; this.#sendQueue.add(data, () => { @@ -12680,7 +13241,7 @@ var require_websocket = __commonJS({ this.#sendQueue.add(data, () => { this.#bufferedAmount -= data.byteLength; }, sendHints.typedArray); - } else if (isBlobLike(data)) { + } else if (webidl.is.Blob(data)) { this.#bufferedAmount += data.size; this.#sendQueue.add(data, () => { this.#bufferedAmount -= data.size; @@ -12689,7 +13250,7 @@ var require_websocket = __commonJS({ } get readyState() { webidl.brandCheck(this, _WebSocket); - return this[kReadyState]; + return this.#handler.readyState; } get bufferedAmount() { webidl.brandCheck(this, _WebSocket); @@ -12697,7 +13258,7 @@ var require_websocket = __commonJS({ } get url() { webidl.brandCheck(this, _WebSocket); - return URLSerializer(this[kWebSocketURL]); + return URLSerializer(this.#url); } get extensions() { webidl.brandCheck(this, _WebSocket); @@ -12773,28 +13334,27 @@ var require_websocket = __commonJS({ } get binaryType() { webidl.brandCheck(this, _WebSocket); - return this[kBinaryType]; + return this.#binaryType; } set binaryType(type) { webidl.brandCheck(this, _WebSocket); if (type !== "blob" && type !== "arraybuffer") { - this[kBinaryType] = "blob"; + this.#binaryType = "blob"; } else { - this[kBinaryType] = type; + this.#binaryType = type; } } /** * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol */ #onConnectionEstablished(response, parsedExtensions) { - this[kResponse] = response; - const parser = new ByteParser(this, parsedExtensions); - parser.on("drain", onParserDrain); - parser.on("error", onParserError.bind(this)); - response.socket.ws = this; - this[kByteParser] = parser; + this.#handler.socket = response.socket; + const parser = new ByteParser(this.#handler, parsedExtensions); + parser.on("drain", () => this.#handler.onParserDrain()); + parser.on("error", (err) => this.#handler.onParserError(err)); + this.#parser = parser; this.#sendQueue = new SendQueue(response.socket); - this[kReadyState] = states.OPEN; + this.#handler.readyState = states.OPEN; const extensions = response.headersList.get("sec-websocket-extensions"); if (extensions !== null) { this.#extensions = extensions; @@ -12805,6 +13365,78 @@ var require_websocket = __commonJS({ } fireEvent("open", this); } + #onFail(code, reason) { + if (reason) { + fireEvent("error", this, (type, init) => new ErrorEvent2(type, init), { + error: new Error(reason), + message: reason + }); + } + if (!this.#handler.wasEverConnected) { + this.#handler.readyState = states.CLOSED; + fireEvent("close", this, (type, init) => new CloseEvent2(type, init), { + wasClean: false, + code, + reason + }); + } + } + #onMessage(type, data) { + if (this.#handler.readyState !== states.OPEN) { + return; + } + let dataForEvent; + if (type === opcodes.TEXT) { + try { + dataForEvent = utf8Decode(data); + } catch { + failWebsocketConnection(this.#handler, 1007, "Received invalid UTF-8 in text frame."); + return; + } + } else if (type === opcodes.BINARY) { + if (this.#binaryType === "blob") { + dataForEvent = new Blob([data]); + } else { + dataForEvent = toArrayBuffer(data); + } + } + fireEvent("message", this, createFastMessageEvent2, { + origin: this.#url.origin, + data: dataForEvent + }); + } + #onParserDrain() { + this.#handler.socket.resume(); + } + /** + * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol + * @see https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.4 + */ + #onSocketClose() { + const wasClean = this.#handler.closeState.has(sentCloseFrameState.SENT) && this.#handler.closeState.has(sentCloseFrameState.RECEIVED); + let code = 1005; + let reason = ""; + const result = this.#parser.closingInfo; + if (result && !result.error) { + code = result.code ?? 1005; + reason = result.reason; + } else if (!this.#handler.closeState.has(sentCloseFrameState.RECEIVED)) { + code = 1006; + } + this.#handler.readyState = states.CLOSED; + fireEvent("close", this, (type, init) => new CloseEvent2(type, init), { + wasClean, + code, + reason + }); + if (channels.close.hasSubscribers) { + channels.close.publish({ + websocket: this, + code, + reason + }); + } + } }; WebSocket.CONNECTING = WebSocket.prototype.CONNECTING = states.CONNECTING; WebSocket.OPEN = WebSocket.prototype.OPEN = states.OPEN; @@ -12844,7 +13476,7 @@ var require_websocket = __commonJS({ webidl.converters.DOMString ); webidl.converters["DOMString or sequence"] = function(V, prefix, argument) { - if (webidl.util.Type(V) === "Object" && Symbol.iterator in V) { + if (webidl.util.Type(V) === webidl.util.Types.OBJECT && Symbol.iterator in V) { return webidl.converters["sequence"](V); } return webidl.converters.DOMString(V, prefix, argument); @@ -12853,12 +13485,12 @@ var require_websocket = __commonJS({ { key: "protocols", converter: webidl.converters["DOMString or sequence"], - defaultValue: () => new Array(0) + defaultValue: /* @__PURE__ */ __name(() => new Array(0), "defaultValue") }, { key: "dispatcher", converter: webidl.converters.any, - defaultValue: () => getGlobalDispatcher2() + defaultValue: /* @__PURE__ */ __name(() => getGlobalDispatcher2(), "defaultValue") }, { key: "headers", @@ -12866,39 +13498,22 @@ var require_websocket = __commonJS({ } ]); webidl.converters["DOMString or sequence or WebSocketInit"] = function(V) { - if (webidl.util.Type(V) === "Object" && !(Symbol.iterator in V)) { + if (webidl.util.Type(V) === webidl.util.Types.OBJECT && !(Symbol.iterator in V)) { return webidl.converters.WebSocketInit(V); } return { protocols: webidl.converters["DOMString or sequence"](V) }; }; webidl.converters.WebSocketSendData = function(V) { - if (webidl.util.Type(V) === "Object") { - if (isBlobLike(V)) { - return webidl.converters.Blob(V, { strict: false }); + if (webidl.util.Type(V) === webidl.util.Types.OBJECT) { + if (webidl.is.Blob(V)) { + return V; } if (ArrayBuffer.isView(V) || types.isArrayBuffer(V)) { - return webidl.converters.BufferSource(V); + return V; } } return webidl.converters.USVString(V); }; - function onParserDrain() { - this.ws[kResponse].socket.resume(); - } - __name(onParserDrain, "onParserDrain"); - function onParserError(err) { - let message; - let code; - if (err instanceof CloseEvent2) { - message = err.reason; - code = err.code; - } else { - message = err.message; - } - fireEvent("error", this, () => new ErrorEvent2("error", { error: err, message })); - closeWebSocketConnection(this, code); - } - __name(onParserError, "onParserError"); module2.exports = { WebSocket }; @@ -12914,11 +13529,9 @@ var require_util4 = __commonJS({ } __name(isValidLastEventId, "isValidLastEventId"); function isASCIINumber(value) { - if (value.length === 0) - return false; + if (value.length === 0) return false; for (let i = 0; i < value.length; i++) { - if (value.charCodeAt(i) < 48 || value.charCodeAt(i) > 57) - return false; + if (value.charCodeAt(i) < 48 || value.charCodeAt(i) > 57) return false; } return true; } @@ -12955,7 +13568,7 @@ var require_eventsource_stream = __commonJS({ /** * @type {eventSourceSettings} */ - state = null; + state; /** * Leading byte-order-mark check. * @type {boolean} @@ -12970,7 +13583,7 @@ var require_eventsource_stream = __commonJS({ */ eventEndCheck = false; /** - * @type {Buffer} + * @type {Buffer|null} */ buffer = null; pos = 0; @@ -12982,8 +13595,9 @@ var require_eventsource_stream = __commonJS({ }; /** * @param {object} options - * @param {eventSourceSettings} options.eventSourceSettings - * @param {Function} [options.push] + * @param {boolean} [options.readableObjectMode] + * @param {eventSourceSettings} [options.eventSourceSettings] + * @param {(chunk: any, encoding?: BufferEncoding | undefined) => boolean} [options.push] */ constructor(options = {}) { options.readableObjectMode = true; @@ -13085,7 +13699,7 @@ var require_eventsource_stream = __commonJS({ } /** * @param {Buffer} line - * @param {EventStreamEvent} event + * @param {EventSourceStreamEvent} event */ parseLine(line, event) { if (line.length === 0) { @@ -13201,8 +13815,11 @@ var require_eventsource = __commonJS({ error: null, message: null }; - #url = null; + #url; #withCredentials = false; + /** + * @type {ReadyState} + */ #readyState = CONNECTING; #request = null; #controller = null; @@ -13214,7 +13831,7 @@ var require_eventsource = __commonJS({ /** * Creates a new EventSource object. * @param {string} url - * @param {EventSourceInit} [eventSourceInitDict] + * @param {EventSourceInit} [eventSourceInitDict={}] * @see https://html.spec.whatwg.org/multipage/server-sent-events.html#the-eventsource-interface */ constructor(url, eventSourceInitDict = {}) { @@ -13228,7 +13845,7 @@ var require_eventsource = __commonJS({ code: "UNDICI-ES" }); } - url = webidl.converters.USVString(url, prefix, "url"); + url = webidl.converters.USVString(url); eventSourceInitDict = webidl.converters.EventSourceInitDict(eventSourceInitDict, prefix, "eventSourceInitDict"); this.#dispatcher = eventSourceInitDict.dispatcher; this.#state = { @@ -13245,7 +13862,7 @@ var require_eventsource = __commonJS({ } this.#url = urlRecord.href; let corsAttributeState = ANONYMOUS; - if (eventSourceInitDict.withCredentials) { + if (eventSourceInitDict.withCredentials === true) { corsAttributeState = USE_CREDENTIALS; this.#withCredentials = true; } @@ -13268,7 +13885,7 @@ var require_eventsource = __commonJS({ /** * Returns the state of this EventSource object's connection. It can have the * values described below. - * @returns {0|1|2} + * @returns {ReadyState} * @readonly */ get readyState() { @@ -13290,8 +13907,7 @@ var require_eventsource = __commonJS({ return this.#withCredentials; } #connect() { - if (this.#readyState === CLOSED) - return; + if (this.#readyState === CLOSED) return; this.#readyState = CONNECTING; const fetchParams = { request: this.#request, @@ -13329,12 +13945,12 @@ var require_eventsource = __commonJS({ this.#state.origin = response.urlList[response.urlList.length - 1].origin; const eventSourceStream = new EventSourceStream({ eventSourceSettings: this.#state, - push: (event) => { + push: /* @__PURE__ */ __name((event) => { this.dispatchEvent(createFastMessageEvent2( event.type, event.options )); - } + }, "push") }); pipeline( response.body.stream, @@ -13354,13 +13970,11 @@ var require_eventsource = __commonJS({ * @returns {Promise} */ async #reconnect() { - if (this.#readyState === CLOSED) - return; + if (this.#readyState === CLOSED) return; this.#readyState = CONNECTING; this.dispatchEvent(new Event("error")); await delay(this.#state.reconnectionTime); - if (this.#readyState !== CONNECTING) - return; + if (this.#readyState !== CONNECTING) return; if (this.#state.lastEventId.length) { this.#request.headersList.set("last-event-id", this.#state.lastEventId, true); } @@ -13372,8 +13986,7 @@ var require_eventsource = __commonJS({ */ close() { webidl.brandCheck(this, _EventSource); - if (this.#readyState === CLOSED) - return; + if (this.#readyState === CLOSED) return; this.#readyState = CLOSED; this.#controller.abort(); this.#request = null; @@ -13459,7 +14072,7 @@ var require_eventsource = __commonJS({ { key: "withCredentials", converter: webidl.converters.boolean, - defaultValue: () => false + defaultValue: /* @__PURE__ */ __name(() => false, "defaultValue") }, { key: "dispatcher", diff --git a/deps/uv/AUTHORS b/deps/uv/AUTHORS index 807440b30e8488..041b7aff610f57 100644 --- a/deps/uv/AUTHORS +++ b/deps/uv/AUTHORS @@ -588,3 +588,5 @@ Raihaan Shouhell Rialbat Adam Poul T Lomholt +dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> +Thad House diff --git a/deps/uv/ChangeLog b/deps/uv/ChangeLog index e1d1aa32989124..dc2dd2790c57d3 100644 --- a/deps/uv/ChangeLog +++ b/deps/uv/ChangeLog @@ -1,4 +1,22 @@ -2024.10.11, Version 1.49.1 (Stable) +2024.10.18, Version 1.49.2 (Stable) + +Changes since version 1.49.1: + +* win,fs: remove trailing slash in junctions (Hüseyin Açacak) + +* Revert "linux: eliminate a read on eventfd per wakeup" (Ben Noordhuis) + +* win: Fix linked list logic in getaddrinfo (Thad House) + +* win: fix compilation against Windows 24H2 SDK (Thad House) + +* win: remap ERROR_NOACCESS and ERROR_BUFFER_OVERFLOW (Jameson Nash) + +* win,fs: match trailing slash presence in junctions to user input (Jameson + Nash) + + +2024.10.11, Version 1.49.1 (Stable), 8be336f4ee296d20e1c071a44d6adf279e202236 Changes since version 1.49.0: diff --git a/deps/uv/configure.ac b/deps/uv/configure.ac index e3ee8a840c6872..98c59363026f86 100644 --- a/deps/uv/configure.ac +++ b/deps/uv/configure.ac @@ -13,7 +13,7 @@ # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. AC_PREREQ(2.57) -AC_INIT([libuv], [1.49.1], [https://github.com/libuv/libuv/issues]) +AC_INIT([libuv], [1.49.2], [https://github.com/libuv/libuv/issues]) AC_CONFIG_MACRO_DIR([m4]) m4_include([m4/libuv-extra-automake-flags.m4]) m4_include([m4/as_case.m4]) diff --git a/deps/uv/include/uv/version.h b/deps/uv/include/uv/version.h index 77a8b2541749f9..cfa7871322e690 100644 --- a/deps/uv/include/uv/version.h +++ b/deps/uv/include/uv/version.h @@ -32,7 +32,7 @@ #define UV_VERSION_MAJOR 1 #define UV_VERSION_MINOR 49 -#define UV_VERSION_PATCH 1 +#define UV_VERSION_PATCH 2 #define UV_VERSION_IS_RELEASE 1 #define UV_VERSION_SUFFIX "" diff --git a/deps/uv/src/unix/async.c b/deps/uv/src/unix/async.c index bc97ec54c4fcc6..0ff2669e30a628 100644 --- a/deps/uv/src/unix/async.c +++ b/deps/uv/src/unix/async.c @@ -38,34 +38,6 @@ #include #endif -#if UV__KQUEUE_EVFILT_USER -static uv_once_t kqueue_runtime_detection_guard = UV_ONCE_INIT; -static int kqueue_evfilt_user_support = 1; - - -static void uv__kqueue_runtime_detection(void) { - int kq; - struct kevent ev[2]; - struct timespec timeout = {0, 0}; - - /* Perform the runtime detection to ensure that kqueue with - * EVFILT_USER actually works. */ - kq = kqueue(); - EV_SET(ev, UV__KQUEUE_EVFILT_USER_IDENT, EVFILT_USER, - EV_ADD | EV_CLEAR, 0, 0, 0); - EV_SET(ev + 1, UV__KQUEUE_EVFILT_USER_IDENT, EVFILT_USER, - 0, NOTE_TRIGGER, 0, 0); - if (kevent(kq, ev, 2, ev, 1, &timeout) < 1 || - ev[0].filter != EVFILT_USER || - ev[0].ident != UV__KQUEUE_EVFILT_USER_IDENT || - ev[0].flags & EV_ERROR) - /* If we wind up here, we can assume that EVFILT_USER is defined but - * broken on the current system. */ - kqueue_evfilt_user_support = 0; - uv__close(kq); -} -#endif - static void uv__async_send(uv_loop_t* loop); static int uv__async_start(uv_loop_t* loop); static void uv__cpu_relax(void); @@ -158,10 +130,8 @@ void uv__async_close(uv_async_t* handle) { static void uv__async_io(uv_loop_t* loop, uv__io_t* w, unsigned int events) { -#ifndef __linux__ char buf[1024]; ssize_t r; -#endif struct uv__queue queue; struct uv__queue* q; uv_async_t* h; @@ -169,12 +139,7 @@ static void uv__async_io(uv_loop_t* loop, uv__io_t* w, unsigned int events) { assert(w == &loop->async_io_watcher); -#ifndef __linux__ -#if UV__KQUEUE_EVFILT_USER - for (;!kqueue_evfilt_user_support;) { -#else for (;;) { -#endif r = read(w->fd, buf, sizeof(buf)); if (r == sizeof(buf)) @@ -191,7 +156,6 @@ static void uv__async_io(uv_loop_t* loop, uv__io_t* w, unsigned int events) { abort(); } -#endif /* !__linux__ */ uv__queue_move(&loop->async_handles, &queue); while (!uv__queue_empty(&queue)) { @@ -215,58 +179,34 @@ static void uv__async_io(uv_loop_t* loop, uv__io_t* w, unsigned int events) { static void uv__async_send(uv_loop_t* loop) { + const void* buf; + ssize_t len; int fd; - ssize_t r; -#ifdef __linux__ - uint64_t val; - - fd = loop->async_io_watcher.fd; /* eventfd */ - for (val = 1; /* empty */; val = 1) { - r = write(fd, &val, sizeof(uint64_t)); - if (r < 0) { - /* When EAGAIN occurs, the eventfd counter hits the maximum value of the unsigned 64-bit. - * We need to first drain the eventfd and then write again. - * - * Check out https://man7.org/linux/man-pages/man2/eventfd.2.html for details. - */ - if (errno == EAGAIN) { - /* It's ready to retry. */ - if (read(fd, &val, sizeof(uint64_t)) > 0 || errno == EAGAIN) { - continue; - } - } - /* Unknown error occurs. */ - break; - } - return; - } -#else -#if UV__KQUEUE_EVFILT_USER - struct kevent ev; - - if (kqueue_evfilt_user_support) { - fd = loop->async_io_watcher.fd; /* magic number for EVFILT_USER */ - EV_SET(&ev, fd, EVFILT_USER, 0, NOTE_TRIGGER, 0, 0); - r = kevent(loop->backend_fd, &ev, 1, NULL, 0, NULL); - if (r == 0) - return; - else - abort(); + int r; + + buf = ""; + len = 1; + fd = loop->async_wfd; + +#if defined(__linux__) + if (fd == -1) { + static const uint64_t val = 1; + buf = &val; + len = sizeof(val); + fd = loop->async_io_watcher.fd; /* eventfd */ } #endif - fd = loop->async_wfd; /* write end of the pipe */ do - r = write(fd, "x", 1); + r = write(fd, buf, len); while (r == -1 && errno == EINTR); - if (r == 1) + if (r == len) return; if (r == -1) if (errno == EAGAIN || errno == EWOULDBLOCK) return; -#endif abort(); } @@ -275,9 +215,6 @@ static void uv__async_send(uv_loop_t* loop) { static int uv__async_start(uv_loop_t* loop) { int pipefd[2]; int err; -#if UV__KQUEUE_EVFILT_USER - struct kevent ev; -#endif if (loop->async_io_watcher.fd != -1) return 0; @@ -289,36 +226,6 @@ static int uv__async_start(uv_loop_t* loop) { pipefd[0] = err; pipefd[1] = -1; -#elif UV__KQUEUE_EVFILT_USER - uv_once(&kqueue_runtime_detection_guard, uv__kqueue_runtime_detection); - if (kqueue_evfilt_user_support) { - /* In order not to break the generic pattern of I/O polling, a valid - * file descriptor is required to take up a room in loop->watchers, - * thus we create one for that, but this fd will not be actually used, - * it's just a placeholder and magic number which is going to be closed - * during the cleanup, as other FDs. */ - err = uv__open_cloexec("/dev/null", O_RDONLY); - if (err < 0) - return err; - - pipefd[0] = err; - pipefd[1] = -1; - - /* When using EVFILT_USER event to wake up the kqueue, this event must be - * registered beforehand. Otherwise, calling kevent() to issue an - * unregistered EVFILT_USER event will get an ENOENT. - * Since uv__async_send() may happen before uv__io_poll() with multi-threads, - * we can't defer this registration of EVFILT_USER event as we did for other - * events, but must perform it right away. */ - EV_SET(&ev, err, EVFILT_USER, EV_ADD | EV_CLEAR, 0, 0, 0); - err = kevent(loop->backend_fd, &ev, 1, NULL, 0, NULL); - if (err < 0) - return UV__ERR(errno); - } else { - err = uv__make_pipe(pipefd, UV_NONBLOCK_PIPE); - if (err < 0) - return err; - } #else err = uv__make_pipe(pipefd, UV_NONBLOCK_PIPE); if (err < 0) @@ -329,13 +236,6 @@ static int uv__async_start(uv_loop_t* loop) { uv__io_start(loop, &loop->async_io_watcher, POLLIN); loop->async_wfd = pipefd[1]; -#if UV__KQUEUE_EVFILT_USER - /* Prevent the EVFILT_USER event from being added to kqueue redundantly - * and mistakenly later in uv__io_poll(). */ - if (kqueue_evfilt_user_support) - loop->async_io_watcher.events = loop->async_io_watcher.pevents; -#endif - return 0; } diff --git a/deps/uv/src/unix/internal.h b/deps/uv/src/unix/internal.h index 568a55b55acb35..8d586b0b64a96c 100644 --- a/deps/uv/src/unix/internal.h +++ b/deps/uv/src/unix/internal.h @@ -35,10 +35,6 @@ #include #include #include -#if defined(__APPLE__) || defined(__DragonFly__) || \ - defined(__FreeBSD__) || defined(__NetBSD__) -#include -#endif #define uv__msan_unpoison(p, n) \ do { \ @@ -508,22 +504,4 @@ int uv__get_constrained_cpu(uv__cpu_constraint* constraint); #endif #endif -#if defined(EVFILT_USER) && defined(NOTE_TRIGGER) -/* EVFILT_USER is available since OS X 10.6, DragonFlyBSD 4.0, - * FreeBSD 8.1, and NetBSD 10.0. - * - * Note that even though EVFILT_USER is defined on the current system, - * it may still fail to work at runtime somehow. In that case, we fall - * back to pipe-based signaling. - */ -#define UV__KQUEUE_EVFILT_USER 1 -/* Magic number of identifier used for EVFILT_USER during runtime detection. - * There are no Google hits for this number when I create it. That way, - * people will be directed here if this number gets printed due to some - * kqueue error and they google for help. */ -#define UV__KQUEUE_EVFILT_USER_IDENT 0x1e7e7711 -#else -#define UV__KQUEUE_EVFILT_USER 0 -#endif - #endif /* UV_UNIX_INTERNAL_H_ */ diff --git a/deps/uv/src/unix/kqueue.c b/deps/uv/src/unix/kqueue.c index 876b717086c609..66aa166f053f52 100644 --- a/deps/uv/src/unix/kqueue.c +++ b/deps/uv/src/unix/kqueue.c @@ -367,17 +367,6 @@ void uv__io_poll(uv_loop_t* loop, int timeout) { continue; } -#if UV__KQUEUE_EVFILT_USER - if (ev->filter == EVFILT_USER) { - w = &loop->async_io_watcher; - assert(fd == w->fd); - uv__metrics_update_idle_time(loop); - w->cb(loop, w, w->events); - nevents++; - continue; - } -#endif - if (ev->filter == EVFILT_VNODE) { assert(w->events == POLLIN); assert(w->pevents == POLLIN); diff --git a/deps/uv/src/unix/linux.c b/deps/uv/src/unix/linux.c index 803a9a9d3f04c9..857a4ef8a6686f 100644 --- a/deps/uv/src/unix/linux.c +++ b/deps/uv/src/unix/linux.c @@ -1414,12 +1414,6 @@ void uv__io_poll(uv_loop_t* loop, int timeout) { w->events = w->pevents; e.events = w->pevents; - if (w == &loop->async_io_watcher) - /* Enable edge-triggered mode on async_io_watcher(eventfd), - * so that we're able to eliminate the overhead of reading - * the eventfd via system call on each event loop wakeup. - */ - e.events |= EPOLLET; e.data.fd = w->fd; fd = w->fd; diff --git a/deps/uv/src/win/error.c b/deps/uv/src/win/error.c index 58587c5fb785ea..7abf906bb5c823 100644 --- a/deps/uv/src/win/error.c +++ b/deps/uv/src/win/error.c @@ -69,7 +69,6 @@ int uv_translate_sys_error(int sys_errno) { } switch (sys_errno) { - case ERROR_NOACCESS: return UV_EACCES; case WSAEACCES: return UV_EACCES; case ERROR_ELEVATION_REQUIRED: return UV_EACCES; case ERROR_CANT_ACCESS_FILE: return UV_EACCES; @@ -96,7 +95,7 @@ int uv_translate_sys_error(int sys_errno) { case WSAECONNRESET: return UV_ECONNRESET; case ERROR_ALREADY_EXISTS: return UV_EEXIST; case ERROR_FILE_EXISTS: return UV_EEXIST; - case ERROR_BUFFER_OVERFLOW: return UV_EFAULT; + case ERROR_NOACCESS: return UV_EFAULT; case WSAEFAULT: return UV_EFAULT; case ERROR_HOST_UNREACHABLE: return UV_EHOSTUNREACH; case WSAEHOSTUNREACH: return UV_EHOSTUNREACH; @@ -127,6 +126,7 @@ int uv_translate_sys_error(int sys_errno) { case ERROR_TOO_MANY_OPEN_FILES: return UV_EMFILE; case WSAEMFILE: return UV_EMFILE; case WSAEMSGSIZE: return UV_EMSGSIZE; + case ERROR_BUFFER_OVERFLOW: return UV_ENAMETOOLONG; case ERROR_FILENAME_EXCED_RANGE: return UV_ENAMETOOLONG; case ERROR_NETWORK_UNREACHABLE: return UV_ENETUNREACH; case WSAENETUNREACH: return UV_ENETUNREACH; diff --git a/deps/uv/src/win/fs.c b/deps/uv/src/win/fs.c index 08b42eb14c972a..f2215bb3082178 100644 --- a/deps/uv/src/win/fs.c +++ b/deps/uv/src/win/fs.c @@ -2566,16 +2566,17 @@ static void fs__create_junction(uv_fs_t* req, const WCHAR* path, path_buf[path_buf_len++] = path[i]; } - path_buf[path_buf_len++] = L'\\'; + if (add_slash) + path_buf[path_buf_len++] = L'\\'; len = path_buf_len - start; + /* Insert null terminator */ + path_buf[path_buf_len++] = L'\0'; + /* Set the info about the substitute name */ buffer->MountPointReparseBuffer.SubstituteNameOffset = start * sizeof(WCHAR); buffer->MountPointReparseBuffer.SubstituteNameLength = len * sizeof(WCHAR); - /* Insert null terminator */ - path_buf[path_buf_len++] = L'\0'; - /* Copy the print name of the target path */ start = path_buf_len; add_slash = 0; @@ -2593,18 +2594,18 @@ static void fs__create_junction(uv_fs_t* req, const WCHAR* path, path_buf[path_buf_len++] = path[i]; } len = path_buf_len - start; - if (len == 2) { + if (len == 2 || add_slash) { path_buf[path_buf_len++] = L'\\'; len++; } + /* Insert another null terminator */ + path_buf[path_buf_len++] = L'\0'; + /* Set the info about the print name */ buffer->MountPointReparseBuffer.PrintNameOffset = start * sizeof(WCHAR); buffer->MountPointReparseBuffer.PrintNameLength = len * sizeof(WCHAR); - /* Insert another null terminator */ - path_buf[path_buf_len++] = L'\0'; - /* Calculate how much buffer space was actually used */ used_buf_size = FIELD_OFFSET(REPARSE_DATA_BUFFER, MountPointReparseBuffer.PathBuffer) + path_buf_len * sizeof(WCHAR); diff --git a/deps/uv/src/win/getaddrinfo.c b/deps/uv/src/win/getaddrinfo.c index f20e10d49d974a..4b8ee75a0622f6 100644 --- a/deps/uv/src/win/getaddrinfo.c +++ b/deps/uv/src/win/getaddrinfo.c @@ -191,8 +191,9 @@ static void uv__getaddrinfo_done(struct uv__work* w, int status) { if (addrinfow_ptr == NULL) break; cur_off = align_offset(cur_off, sizeof(void *)); - addrinfo_ptr = (struct addrinfo *)(alloc_ptr + cur_off); - addrinfo_ptr->ai_next = addrinfo_ptr; + struct addrinfo *next_addrinfo_ptr = (struct addrinfo *)(alloc_ptr + cur_off); + addrinfo_ptr->ai_next = next_addrinfo_ptr; + addrinfo_ptr = next_addrinfo_ptr; } req->addrinfo = (struct addrinfo*)alloc_ptr; } else { diff --git a/deps/uv/src/win/winapi.h b/deps/uv/src/win/winapi.h index 548081f23a9276..5800e70dfd7d11 100644 --- a/deps/uv/src/win/winapi.h +++ b/deps/uv/src/win/winapi.h @@ -4125,6 +4125,12 @@ typedef const UNICODE_STRING *PCUNICODE_STRING; # define DEVICE_TYPE DWORD #endif +#ifndef NTDDI_WIN11_ZN +# define NTDDI_WIN11_ZN 0x0A00000E +#endif + +/* API is defined in newer SDKS */ +#if (NTDDI_VERSION < NTDDI_WIN11_ZN) typedef struct _FILE_STAT_BASIC_INFORMATION { LARGE_INTEGER FileId; LARGE_INTEGER CreationTime; @@ -4142,6 +4148,7 @@ typedef struct _FILE_STAT_BASIC_INFORMATION { FILE_ID_128 FileId128; LARGE_INTEGER VolumeSerialNumber; } FILE_STAT_BASIC_INFORMATION; +#endif /* MinGW already has a definition for REPARSE_DATA_BUFFER, but mingw-w64 does * not. @@ -4783,6 +4790,8 @@ typedef struct _TCP_INITIAL_RTO_PARAMETERS { #endif /* from winnt.h */ +/* API is defined in newer SDKS */ +#if (NTDDI_VERSION < NTDDI_WIN11_ZN) typedef enum _FILE_INFO_BY_NAME_CLASS { FileStatByNameInfo, FileStatLxByNameInfo, @@ -4790,6 +4799,7 @@ typedef enum _FILE_INFO_BY_NAME_CLASS { FileStatBasicByNameInfo, MaximumFileInfoByNameClass } FILE_INFO_BY_NAME_CLASS; +#endif typedef BOOL(WINAPI* sGetFileInformationByName)( PCWSTR FileName, diff --git a/deps/uv/test/test-error.c b/deps/uv/test/test-error.c index 2c6d0ca49790e0..b6e18b0f052eae 100644 --- a/deps/uv/test/test-error.c +++ b/deps/uv/test/test-error.c @@ -64,7 +64,7 @@ TEST_IMPL(error_message) { TEST_IMPL(sys_error) { #if defined(_WIN32) - ASSERT_EQ(uv_translate_sys_error(ERROR_NOACCESS), UV_EACCES); + ASSERT_EQ(uv_translate_sys_error(ERROR_NOACCESS), UV_EFAULT); ASSERT_EQ(uv_translate_sys_error(ERROR_ELEVATION_REQUIRED), UV_EACCES); ASSERT_EQ(uv_translate_sys_error(WSAEADDRINUSE), UV_EADDRINUSE); ASSERT_EQ(uv_translate_sys_error(ERROR_BAD_PIPE), UV_EPIPE); diff --git a/deps/uv/test/test-fs.c b/deps/uv/test/test-fs.c index ff0f9fc89a2d1b..33cbd428707c36 100644 --- a/deps/uv/test/test-fs.c +++ b/deps/uv/test/test-fs.c @@ -2379,8 +2379,8 @@ int test_symlink_dir_impl(int type) { strcpy(test_dir_abs_buf, "\\\\?\\"); uv_cwd(test_dir_abs_buf + 4, &test_dir_abs_size); test_dir_abs_size += 4; - strcat(test_dir_abs_buf, "\\test_dir\\"); - test_dir_abs_size += strlen("\\test_dir\\"); + strcat(test_dir_abs_buf, "\\test_dir"); + test_dir_abs_size += strlen("\\test_dir"); test_dir = test_dir_abs_buf; #else uv_cwd(test_dir_abs_buf, &test_dir_abs_size); @@ -2435,8 +2435,8 @@ int test_symlink_dir_impl(int type) { r = uv_fs_realpath(NULL, &req, "test_dir_symlink", NULL); ASSERT_OK(r); #ifdef _WIN32 - ASSERT_EQ(strlen(req.ptr), test_dir_abs_size - 5); - ASSERT_OK(_strnicmp(req.ptr, test_dir + 4, test_dir_abs_size - 5)); + ASSERT_EQ(strlen(req.ptr), test_dir_abs_size - 4); + ASSERT_OK(_strnicmp(req.ptr, test_dir + 4, test_dir_abs_size - 4)); #else ASSERT_OK(strcmp(req.ptr, test_dir_abs_buf)); #endif diff --git a/deps/v8/include/v8config.h b/deps/v8/include/v8config.h index b6d087b958edc1..73a6a91d49bf0e 100644 --- a/deps/v8/include/v8config.h +++ b/deps/v8/include/v8config.h @@ -581,11 +581,15 @@ path. Add it with -I to the command line // functions. // Use like: // V8_NOINLINE V8_PRESERVE_MOST void UnlikelyMethod(); +#if V8_OS_WIN +# define V8_PRESERVE_MOST +#else #if V8_HAS_ATTRIBUTE_PRESERVE_MOST # define V8_PRESERVE_MOST __attribute__((preserve_most)) #else # define V8_PRESERVE_MOST /* NOT SUPPORTED */ #endif +#endif // A macro (V8_DEPRECATED) to mark classes or functions as deprecated. diff --git a/deps/zlib/README.chromium b/deps/zlib/README.chromium index 31b9d55860f9e5..92c5bfd1af200e 100644 --- a/deps/zlib/README.chromium +++ b/deps/zlib/README.chromium @@ -2,6 +2,7 @@ Name: zlib Short Name: zlib URL: http://zlib.net/ Version: 1.3.0.1 +Revision: ac8f12c97d1afd9bafa9c710f827d40a407d3266 CPEPrefix: cpe:/a:zlib:zlib:1.3.0.1 Security Critical: yes Shipped: yes diff --git a/deps/zlib/google/zip_internal.cc b/deps/zlib/google/zip_internal.cc index aa49f4546caa0e..e6b5a4fc3bcb00 100644 --- a/deps/zlib/google/zip_internal.cc +++ b/deps/zlib/google/zip_internal.cc @@ -165,8 +165,7 @@ struct ZipBuffer { // writing compressed data and it returns NULL for this case.) void* OpenZipBuffer(void* opaque, const void* /*filename*/, int mode) { if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER) != ZLIB_FILEFUNC_MODE_READ) { - NOTREACHED_IN_MIGRATION(); - return NULL; + NOTREACHED(); } ZipBuffer* buffer = static_cast(opaque); if (!buffer || !buffer->data || !buffer->length) @@ -196,8 +195,7 @@ uLong WriteZipBuffer(void* /*opaque*/, void* /*stream*/, const void* /*buf*/, uLong /*size*/) { - NOTREACHED_IN_MIGRATION(); - return 0; + NOTREACHED(); } // Returns the offset from the beginning of the data. @@ -228,8 +226,7 @@ long SeekZipBuffer(void* opaque, buffer->offset = std::min(buffer->length, offset); return 0; } - NOTREACHED_IN_MIGRATION(); - return -1; + NOTREACHED(); } // Closes the input offset and deletes all resources used for compressing or diff --git a/deps/zlib/google/zip_reader_unittest.cc b/deps/zlib/google/zip_reader_unittest.cc index 9d1406feff9887..46c0beb1453237 100644 --- a/deps/zlib/google/zip_reader_unittest.cc +++ b/deps/zlib/google/zip_reader_unittest.cc @@ -9,6 +9,7 @@ #include #include +#include #include #include #include @@ -555,10 +556,10 @@ TEST_F(ZipReaderTest, ExtractToFileAsync_RegularFile) { const std::string md5 = base::MD5String(output); EXPECT_EQ(kQuuxExpectedMD5, md5); - int64_t file_size = 0; - ASSERT_TRUE(base::GetFileSize(target_file, &file_size)); + std::optional file_size = base::GetFileSize(target_file); + ASSERT_TRUE(file_size.has_value()); - EXPECT_EQ(file_size, listener.current_progress()); + EXPECT_EQ(file_size.value(), listener.current_progress()); } TEST_F(ZipReaderTest, ExtractToFileAsync_Encrypted_NoPassword) { diff --git a/deps/zlib/google/zip_unittest.cc b/deps/zlib/google/zip_unittest.cc index 58bafb809d6bf9..2bcfa309281fce 100644 --- a/deps/zlib/google/zip_unittest.cc +++ b/deps/zlib/google/zip_unittest.cc @@ -63,8 +63,9 @@ bool CreateFile(const std::string& content, if (!base::CreateTemporaryFile(file_path)) return false; - if (base::WriteFile(*file_path, content.data(), content.size()) == -1) + if (!base::WriteFile(*file_path, content)) { return false; + } *file = base::File( *file_path, base::File::Flags::FLAG_OPEN | base::File::Flags::FLAG_READ); @@ -350,7 +351,7 @@ class ZipTest : public PlatformTest { base::Time now_time; EXPECT_TRUE(base::Time::FromUTCExploded(now_parts, &now_time)); - EXPECT_EQ(1, base::WriteFile(src_file, "1", 1)); + EXPECT_TRUE(base::WriteFile(src_file, "1")); EXPECT_TRUE(base::TouchFile(src_file, base::Time::Now(), test_mtime)); EXPECT_TRUE(zip::Zip(src_dir, zip_file, true)); @@ -748,6 +749,8 @@ TEST_F(ZipTest, UnzipMixedPaths) { "Space→", // #else " ", // + "...", // Disappears on Windows + "....", // Disappears on Windows "AUX", // Disappears on Windows "COM1", // Disappears on Windows "COM2", // Disappears on Windows @@ -1113,9 +1116,9 @@ TEST_F(ZipTest, UnzipFilesWithIncorrectSize) { SCOPED_TRACE(base::StringPrintf("Processing %d.txt", i)); base::FilePath file_path = temp_dir.AppendASCII(base::StringPrintf("%d.txt", i)); - int64_t file_size = -1; - EXPECT_TRUE(base::GetFileSize(file_path, &file_size)); - EXPECT_EQ(static_cast(i), file_size); + std::optional file_size = base::GetFileSize(file_path); + EXPECT_TRUE(file_size.has_value()); + EXPECT_EQ(static_cast(i), file_size.value()); } } @@ -1306,10 +1309,10 @@ TEST_F(ZipTest, Compressed) { // Since the source files compress well, the destination ZIP file should be // smaller than the source files. - int64_t dest_file_size; - ASSERT_TRUE(base::GetFileSize(dest_file, &dest_file_size)); - EXPECT_GT(dest_file_size, 300); - EXPECT_LT(dest_file_size, 1000); + std::optional dest_file_size = base::GetFileSize(dest_file); + ASSERT_TRUE(dest_file_size.has_value()); + EXPECT_GT(dest_file_size.value(), 300); + EXPECT_LT(dest_file_size.value(), 1000); } // Tests that a ZIP put inside a ZIP is simply stored instead of being @@ -1338,10 +1341,10 @@ TEST_F(ZipTest, NestedZip) { // Since the dummy source (inner) ZIP file should simply be stored in the // destination (outer) ZIP file, the destination file should be bigger than // the source file, but not much bigger. - int64_t dest_file_size; - ASSERT_TRUE(base::GetFileSize(dest_file, &dest_file_size)); - EXPECT_GT(dest_file_size, src_size + 100); - EXPECT_LT(dest_file_size, src_size + 300); + std::optional dest_file_size = base::GetFileSize(dest_file); + ASSERT_TRUE(dest_file_size.has_value()); + EXPECT_GT(dest_file_size.value(), src_size + 100); + EXPECT_LT(dest_file_size.value(), src_size + 300); } // Tests that there is no 2GB or 4GB limits. Tests that big files can be zipped @@ -1402,10 +1405,10 @@ TEST_F(ZipTest, BigFile) { // Since the dummy source (inner) ZIP file should simply be stored in the // destination (outer) ZIP file, the destination file should be bigger than // the source file, but not much bigger. - int64_t dest_file_size; - ASSERT_TRUE(base::GetFileSize(dest_file, &dest_file_size)); - EXPECT_GT(dest_file_size, src_size + 100); - EXPECT_LT(dest_file_size, src_size + 300); + std::optional dest_file_size = base::GetFileSize(dest_file); + ASSERT_TRUE(dest_file_size.has_value()); + EXPECT_GT(dest_file_size.value(), src_size + 100); + EXPECT_LT(dest_file_size.value(), src_size + 300); LOG(INFO) << "Reading big ZIP " << dest_file; zip::ZipReader reader; diff --git a/deps/zlib/google/zip_writer.cc b/deps/zlib/google/zip_writer.cc index 31161ae86c3b7a..34ab0ad9ef2887 100644 --- a/deps/zlib/google/zip_writer.cc +++ b/deps/zlib/google/zip_writer.cc @@ -5,6 +5,7 @@ #include "third_party/zlib/google/zip_writer.h" #include +#include #include "base/files/file.h" #include "base/logging.h" @@ -193,8 +194,8 @@ bool ZipWriter::AddMixedEntries(Paths paths) { while (!paths.empty()) { // Work with chunks of 50 paths at most. const size_t n = std::min(paths.size(), 50); - const Paths relative_paths = paths.subspan(0, n); - paths = paths.subspan(n, paths.size() - n); + Paths relative_paths; + std::tie(relative_paths, paths) = paths.split_at(n); files.clear(); if (!file_accessor_->Open(relative_paths, &files) || files.size() != n) @@ -233,8 +234,8 @@ bool ZipWriter::AddFileEntries(Paths paths) { while (!paths.empty()) { // Work with chunks of 50 paths at most. const size_t n = std::min(paths.size(), 50); - const Paths relative_paths = paths.subspan(0, n); - paths = paths.subspan(n, paths.size() - n); + Paths relative_paths; + std::tie(relative_paths, paths) = paths.split_at(n); DCHECK_EQ(relative_paths.size(), n); diff --git a/doc/api/addons.md b/doc/api/addons.md index e0e00dca0b9e8b..8e2864952e0841 100644 --- a/doc/api/addons.md +++ b/doc/api/addons.md @@ -72,6 +72,7 @@ namespace demo { using v8::FunctionCallbackInfo; using v8::Isolate; using v8::Local; +using v8::NewStringType; using v8::Object; using v8::String; using v8::Value; @@ -79,7 +80,7 @@ using v8::Value; void Method(const FunctionCallbackInfo& args) { Isolate* isolate = args.GetIsolate(); args.GetReturnValue().Set(String::NewFromUtf8( - isolate, "world").ToLocalChecked()); + isolate, "world", NewStringType::kNormal).ToLocalChecked()); } void Initialize(Local exports) { diff --git a/doc/api/assert.md b/doc/api/assert.md index 3d070db468ff35..0409b2b3a87765 100644 --- a/doc/api/assert.md +++ b/doc/api/assert.md @@ -2548,6 +2548,96 @@ assert.throws(throwingFirst, /Second$/); Due to the confusing error-prone notation, avoid a string as the second argument. +## `assert.partialDeepStrictEqual(actual, expected[, message])` + + + +> Stability: 1.0 - Early development + +* `actual` {any} +* `expected` {any} +* `message` {string|Error} + +[`assert.partialDeepStrictEqual()`][] Asserts the equivalence between the `actual` and `expected` parameters through a +deep comparison, ensuring that all properties in the `expected` parameter are +present in the `actual` parameter with equivalent values, not allowing type coercion. +The main difference with [`assert.deepStrictEqual()`][] is that [`assert.partialDeepStrictEqual()`][] does not require +all properties in the `actual` parameter to be present in the `expected` parameter. +This method should always pass the same test cases as [`assert.deepStrictEqual()`][], behaving as a super set of it. + +```mjs +import assert from 'node:assert'; + +assert.partialDeepStrictEqual({ a: 1, b: 2 }, { a: 1, b: 2 }); +// OK + +assert.partialDeepStrictEqual({ a: { b: { c: 1 } } }, { a: { b: { c: 1 } } }); +// OK + +assert.partialDeepStrictEqual({ a: 1, b: 2, c: 3 }, { a: 1, b: 2 }); +// OK + +assert.partialDeepStrictEqual(new Set(['value1', 'value2']), new Set(['value1', 'value2'])); +// OK + +assert.partialDeepStrictEqual(new Map([['key1', 'value1']]), new Map([['key1', 'value1']])); +// OK + +assert.partialDeepStrictEqual(new Uint8Array([1, 2, 3]), new Uint8Array([1, 2, 3])); +// OK + +assert.partialDeepStrictEqual(/abc/, /abc/); +// OK + +assert.partialDeepStrictEqual([{ a: 5 }, { b: 5 }], [{ a: 5 }]); +// OK + +assert.partialDeepStrictEqual(new Set([{ a: 1 }, { b: 1 }]), new Set([{ a: 1 }])); +// OK + +assert.partialDeepStrictEqual(new Date(0), new Date(0)); +// OK + +assert.partialDeepStrictEqual({ a: 1 }, { a: 1, b: 2 }); +// AssertionError + +assert.partialDeepStrictEqual({ a: 1, b: '2' }, { a: 1, b: 2 }); +// AssertionError + +assert.partialDeepStrictEqual({ a: { b: 2 } }, { a: { b: '2' } }); +// AssertionError +``` + +```cjs +const assert = require('node:assert'); + +assert.partialDeepStrictEqual({ a: 1, b: 2 }, { a: 1, b: 2 }); +// OK + +assert.partialDeepStrictEqual({ a: { b: { c: 1 } } }, { a: { b: { c: 1 } } }); +// OK + +assert.partialDeepStrictEqual({ a: 1, b: 2, c: 3 }, { a: 1, b: 2 }); +// OK + +assert.partialDeepStrictEqual([{ a: 5 }, { b: 5 }], [{ a: 5 }]); +// OK + +assert.partialDeepStrictEqual(new Set([{ a: 1 }, { b: 1 }]), new Set([{ a: 1 }])); +// OK + +assert.partialDeepStrictEqual({ a: 1 }, { a: 1, b: 2 }); +// AssertionError + +assert.partialDeepStrictEqual({ a: 1, b: '2' }, { a: 1, b: 2 }); +// AssertionError + +assert.partialDeepStrictEqual({ a: { b: 2 } }, { a: { b: '2' } }); +// AssertionError +``` + [Object wrappers]: https://developer.mozilla.org/en-US/docs/Glossary/Primitive#Primitive_wrapper_objects_in_JavaScript [Object.prototype.toString()]: https://tc39.github.io/ecma262/#sec-object.prototype.tostring [`!=` operator]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Inequality @@ -2576,6 +2666,7 @@ argument. [`assert.notEqual()`]: #assertnotequalactual-expected-message [`assert.notStrictEqual()`]: #assertnotstrictequalactual-expected-message [`assert.ok()`]: #assertokvalue-message +[`assert.partialDeepStrictEqual()`]: #assertpartialdeepstrictequalactual-expected-message [`assert.strictEqual()`]: #assertstrictequalactual-expected-message [`assert.throws()`]: #assertthrowsfn-error-message [`getColorDepth()`]: tty.md#writestreamgetcolordepthenv diff --git a/doc/api/async_context.md b/doc/api/async_context.md index d1be2fb3807e17..6b018bc9d4e292 100644 --- a/doc/api/async_context.md +++ b/doc/api/async_context.md @@ -626,7 +626,6 @@ a Worker pool around it could use the following structure: ```mjs import { AsyncResource } from 'node:async_hooks'; import { EventEmitter } from 'node:events'; -import path from 'node:path'; import { Worker } from 'node:worker_threads'; const kTaskInfo = Symbol('kTaskInfo'); diff --git a/doc/api/buffer.md b/doc/api/buffer.md index d72e8720c688fa..c07443601c8b67 100644 --- a/doc/api/buffer.md +++ b/doc/api/buffer.md @@ -1042,7 +1042,8 @@ in `list` by adding their lengths. If `totalLength` is provided, it is coerced to an unsigned integer. If the combined length of the `Buffer`s in `list` exceeds `totalLength`, the result is -truncated to `totalLength`. +truncated to `totalLength`. If the combined length of the `Buffer`s in `list` is +less than `totalLength`, the remaining space is filled with zeros. ```mjs import { Buffer } from 'node:buffer'; diff --git a/doc/api/child_process.md b/doc/api/child_process.md index 0c0c80b35dc40c..7a9345416e0545 100644 --- a/doc/api/child_process.md +++ b/doc/api/child_process.md @@ -1700,8 +1700,8 @@ may not actually terminate the process. See kill(2) for reference. On Windows, where POSIX signals do not exist, the `signal` argument will be -ignored, and the process will be killed forcefully and abruptly (similar to -`'SIGKILL'`). +ignored except for `'SIGKILL'`, `'SIGTERM'`, `'SIGINT'` and `'SIGQUIT'`, and the +process will always be killed forcefully and abruptly (similar to `'SIGKILL'`). See [Signal Events][] for more details. On Linux, child processes of child processes will not be terminated diff --git a/doc/api/cli.md b/doc/api/cli.md index 52df262ec8cce1..eb8ee7020cb894 100644 --- a/doc/api/cli.md +++ b/doc/api/cli.md @@ -25,16 +25,14 @@ For more info about `node inspect`, see the [debugger][] documentation. The program entry point is a specifier-like string. If the string is not an absolute path, it's resolved as a relative path from the current working -directory. That path is then resolved by [CommonJS][] module loader, or by the -[ES module loader][Modules loaders] if [`--experimental-default-type=module`][] -is passed. If no corresponding file is found, an error is thrown. +directory. That path is then resolved by [CommonJS][] module loader. If no +corresponding file is found, an error is thrown. If a file is found, its path will be passed to the [ES module loader][Modules loaders] under any of the following conditions: * The program was started with a command-line flag that forces the entry - point to be loaded with ECMAScript module loader, such as `--import` or - [`--experimental-default-type=module`][]. + point to be loaded with ECMAScript module loader, such as `--import`. * The file has an `.mjs` extension. * The file does not have a `.cjs` extension, and the nearest parent `package.json` file contains a top-level [`"type"`][] field with a value of @@ -47,9 +45,11 @@ Otherwise, the file is loaded using the CommonJS module loader. See When loading, the [ES module loader][Modules loaders] loads the program entry point, the `node` command will accept as input only files with `.js`, -`.mjs`, or `.cjs` extensions; with `.wasm` extensions when -[`--experimental-wasm-modules`][] is enabled; and with no extension when -[`--experimental-default-type=module`][] is passed. +`.mjs`, or `.cjs` extensions. With the following flags, additional file +extensions are enabled: + +* [`--experimental-wasm-modules`][] for files with `.wasm` extension. +* [`--experimental-addon-modules`][] for files with `.node` extension. ## Options @@ -126,7 +126,7 @@ require('nodejs-addon-example'); ``` ```console -$ node --experimental-permission --allow-fs-read=* index.js +$ node --permission --allow-fs-read=* index.js node:internal/modules/cjs/loader:1319 return process.dlopen(module, path.toNamespacedPath(filename)); ^ @@ -168,7 +168,7 @@ childProcess.spawn('node', ['-e', 'require("fs").writeFileSync("/new-file", "exa ``` ```console -$ node --experimental-permission --allow-fs-read=* index.js +$ node --permission --allow-fs-read=* index.js node:internal/child_process:388 const err = this._handle.spawn(options); ^ @@ -192,12 +192,15 @@ Error: Access to this API has been restricted -> Stability: 1.1 - Active development +> Stability: 2 - Stable. This flag configures file system read permissions using the [Permission Model][]. @@ -208,30 +211,25 @@ The valid arguments for the `--allow-fs-read` flag are: * Multiple paths can be allowed using multiple `--allow-fs-read` flags. Example `--allow-fs-read=/folder1/ --allow-fs-read=/folder1/` -Paths delimited by comma (`,`) are no longer allowed. -When passing a single flag with a comma a warning will be displayed. - Examples can be found in the [File System Permissions][] documentation. -Relative paths are NOT yet supported by the CLI flag. - The initializer module also needs to be allowed. Consider the following example: ```console -$ node --experimental-permission t.js +$ node --permission index.js Error: Access to this API has been restricted at node:internal/main/run_main_module:23:47 { code: 'ERR_ACCESS_DENIED', permission: 'FileSystemRead', - resource: '/Users/rafaelgss/repos/os/node/t.js' + resource: '/Users/rafaelgss/repos/os/node/index.js' } ``` The process needs to have access to the `index.js` module: ```bash -node --experimental-permission --allow-fs-read=/path/to/index.js index.js +node --permission --allow-fs-read=/path/to/index.js index.js ``` ### `--allow-fs-write` @@ -239,12 +237,15 @@ node --experimental-permission --allow-fs-read=/path/to/index.js index.js -> Stability: 1.1 - Active development +> Stability: 2 - Stable. This flag configures file system write permissions using the [Permission Model][]. @@ -260,8 +261,6 @@ When passing a single flag with a comma a warning will be displayed. Examples can be found in the [File System Permissions][] documentation. -Relative paths are NOT supported through the CLI flag. - ### `--allow-wasi` + +Disable the `Object.prototype.__proto__` property. If `mode` is `delete`, the +property is removed entirely. If `mode` is `throw`, accesses to the +property throw an exception with the code `ERR_PROTO_ACCESS`. + ### `--disable-warning=code-or-type` > Stability: 1.1 - Active development @@ -657,18 +668,6 @@ users can at least run WebAssembly (with less optimal performance) when the virtual memory address space available to their Node.js process is lower than what the V8 WebAssembly memory cage needs. -### `--disable-proto=mode` - - - -Disable the `Object.prototype.__proto__` property. If `mode` is `delete`, the -property is removed entirely. If `mode` is `throw`, accesses to the -property throw an exception with the code `ERR_PROTO_ACCESS`. - ### `--disallow-code-generation-from-strings` - -> Stability: 1 - Experimental. This flag is inherited from V8 and is subject to -> change upstream. - -This flag will expose the gc extension from V8. - -```js -if (globalThis.gc) { - globalThis.gc(); -} -``` - ### `--dns-result-order=order` + +Behavior is the same as [`--env-file`][], but an error is not thrown if the file +does not exist. + ### `--env-file=config` > Stability: 1.1 - Active development @@ -871,15 +860,6 @@ export USERNAME="nodejs" # will result in `nodejs` as the value. If you want to load environment variables from a file that may not exist, you can use the [`--env-file-if-exists`][] flag instead. -### `--env-file-if-exists=config` - - - -Behavior is the same as [`--env-file`][], but an error is not thrown if the file -does not exist. - ### `-e`, `--eval "script"` > Stability: 1.0 - Early development -Define which module system, `module` or `commonjs`, to use for the following: - -* String input provided via `--eval` or STDIN, if `--input-type` is unspecified. - -* Files ending in `.js` or with no extension, if there is no `package.json` file - present in the same folder or any parent folder. - -* Files ending in `.js` or with no extension, if the nearest parent - `package.json` field lacks a `"type"` field; unless the `package.json` folder - or any parent folder is inside a `node_modules` folder. - -In other words, `--experimental-default-type=module` flips all the places where -Node.js currently defaults to CommonJS to instead default to ECMAScript modules, -with the exception of folders and subfolders below `node_modules`, for backward -compatibility. - -Under `--experimental-default-type=module` and `--experimental-wasm-modules`, -files with no extension will be treated as WebAssembly if they begin with the -WebAssembly magic number (`\0asm`); otherwise they will be treated as ES module -JavaScript. - -### `--experimental-transform-types` - - - -> Stability: 1.1 - Active development - -Enables the transformation of TypeScript-only syntax into JavaScript code. -Implies `--experimental-strip-types` and `--enable-source-maps`. +Enable experimental import support for `.node` addons. ### `--experimental-eventsource` @@ -1007,23 +954,17 @@ added: Enable experimental support for the network inspection with Chrome DevTools. -### `--experimental-permission` +### `--experimental-print-required-tla` -> Stability: 1.1 - Active development - -Enable the Permission Model for current process. When enabled, the -following permissions are restricted: - -* File System - manageable through - [`--allow-fs-read`][], [`--allow-fs-write`][] flags -* Child Process - manageable through [`--allow-child-process`][] flag -* Worker Threads - manageable through [`--allow-worker`][] flag -* WASI - manageable through [`--allow-wasi`][] flag -* Addons - manageable through [`--allow-addons`][] flag +If the ES module being `require()`'d contains top-level `await`, this flag +allows Node.js to evaluate the module, try to locate the +top-level awaits, and print their location to help users find them. ### `--experimental-require-module` @@ -1032,7 +973,9 @@ added: - v22.0.0 - v20.17.0 changes: - - version: v23.0.0 + - version: + - v23.0.0 + - v22.12.0 pr-url: https://github.com/nodejs/node/pull/55085 description: This is now true by default. --> @@ -1065,25 +1008,6 @@ added: Use this flag to enable [ShadowRealm][] support. -### `--experimental-sqlite` - - - -Enable the experimental [`node:sqlite`][] module. - -### `--experimental-strip-types` - - - -> Stability: 1.1 - Active development - -Enable experimental type-stripping for TypeScript files. -For more information, see the [TypeScript type-stripping][] documentation. - ### `--experimental-test-coverage` - -> Stability: 1.0 - Early development - -Configures the type of test isolation used in the test runner. When `mode` is -`'process'`, each test file is run in a separate child process. When `mode` is -`'none'`, all test files run in the same process as the test runner. The default -isolation mode is `'process'`. This flag is ignored if the `--test` flag is not -present. See the [test runner execution model][] section for more information. - ### `--experimental-test-module-mocks` -> Stability: 1.0 - Early development +> Stability: 1.1 - Active development -Enable [snapshot testing][] in the test runner. +Enables the transformation of TypeScript-only syntax into JavaScript code. +Implies `--enable-source-maps`. ### `--experimental-vm-modules` @@ -1184,6 +1095,25 @@ added: v22.4.0 Enable experimental [`Web Storage`][] support. +### `--expose-gc` + + + +> Stability: 1 - Experimental. This flag is inherited from V8 and is subject to +> change upstream. + +This flag will expose the gc extension from V8. + +```js +if (globalThis.gc) { + globalThis.gc(); +} +``` + ### `--force-context-aware` This configures Node.js to interpret `--eval` or `STDIN` input as CommonJS or -as an ES module. Valid values are `"commonjs"` or `"module"`. The default is -`"commonjs"` unless [`--experimental-default-type=module`][] is used. +as an ES module. Valid values are `"commonjs"`, `"module"`, `"module-typescript"` and `"commonjs-typescript"`. +The `"-typescript"` values are not available with the flag `--no-experimental-strip-types`. +The default is `"commonjs"`. + +If `--input-type` is not provided, +Node.js will try to detect the syntax with the following steps: + +1. Run the input as CommonJS. +2. If step 1 fails, run the input as an ES module. +3. If step 2 fails with a SyntaxError, strip the types. +4. If step 3 fails with an error code [`ERR_INVALID_TYPESCRIPT_SYNTAX`][], + throw the error from step 2, including the TypeScript error in the message, + else run as CommonJS. +5. If step 4 fails, run the input as an ES module. + +To avoid the delay of multiple syntax detection passes, the `--input-type=type` flag can be used to specify +how the `--eval` input should be interpreted. The REPL does not support this option. Usage of `--input-type=module` with [`--print`][] will throw an error, as `--print` does not support ES module @@ -1462,20 +1407,6 @@ When enabled, the parser will accept the following: All the above will expose your application to request smuggling or poisoning attack. Avoid using this option. -### `--inspect[=[host:]port]` - - - -Activate inspector on `host:port`. Default is `127.0.0.1:9229`. If port `0` is -specified, a random available port will be used. - -V8 inspector integration allows tools such as Chrome DevTools and IDEs to debug -and profile Node.js instances. The tools attach to Node.js instances via a -tcp port and communicate using the [Chrome DevTools Protocol][]. -See [V8 Inspector integration for Node.js][] for further explanation on Node.js debugger. - @@ -1544,6 +1475,20 @@ a random available port will be used. See [V8 Inspector integration for Node.js][] for further explanation on Node.js debugger. +### `--inspect[=[host:]port]` + + + +Activate inspector on `host:port`. Default is `127.0.0.1:9229`. If port `0` is +specified, a random available port will be used. + +V8 inspector integration allows tools such as Chrome DevTools and IDEs to debug +and profile Node.js instances. The tools attach to Node.js instances via a +tcp port and communicate using the [Chrome DevTools Protocol][]. +See [V8 Inspector integration for Node.js][] for further explanation on Node.js debugger. + ### `-i`, `--interactive` @@ -1693,6 +1640,33 @@ Disable support for loading a synchronous ES module graph in `require()`. See [Loading ECMAScript modules using `require()`][]. +### `--no-experimental-sqlite` + + + +Disable the experimental [`node:sqlite`][] module. + +### `--no-experimental-strip-types` + + + +> Stability: 1.1 - Active development + +Disable experimental type-stripping for TypeScript files. +For more information, see the [TypeScript type-stripping][] documentation. + ### `--no-experimental-websocket` + +> Stability: 2 - Stable. + +Enable the Permission Model for current process. When enabled, the +following permissions are restricted: + +* File System - manageable through + [`--allow-fs-read`][], [`--allow-fs-write`][] flags +* Child Process - manageable through [`--allow-child-process`][] flag +* Worker Threads - manageable through [`--allow-worker`][] flag +* WASI - manageable through [`--allow-wasi`][] flag +* Addons - manageable through [`--allow-addons`][] flag + ### `--preserve-symlinks` - -If the ES module being `require()`'d contains top-level `await`, this flag -allows Node.js to evaluate the module, try to locate the -top-level awaits, and print their location to help users find them. - ### `--prof` When `--report-exclude-env` is passed the diagnostic report generated will not @@ -2179,6 +2163,17 @@ The following environment variables are set when running a script with `--run`: * `NODE_RUN_PACKAGE_JSON_PATH`: The path to the `package.json` that is being processed. +### `--secure-heap-min=n` + + + +When using `--secure-heap`, the `--secure-heap-min` flag specifies the +minimum allocation from the secure heap. The minimum value is `2`. +The maximum value is the lesser of `--secure-heap` or `2147483647`. +The value given must be a power of two. + ### `--secure-heap=n` - -When using `--secure-heap`, the `--secure-heap-min` flag specifies the -minimum allocation from the secure heap. The minimum value is `2`. -The maximum value is the lesser of `--secure-heap` or `2147483647`. -The value given must be a power of two. - ### `--snapshot-blob=path` The maximum number of test files that the test runner CLI will execute -concurrently. If `--experimental-test-isolation` is set to `'none'`, this flag -is ignored and concurrency is one. Otherwise, concurrency defaults to +concurrently. If `--test-isolation` is set to `'none'`, this flag is ignored and +concurrency is one. Otherwise, concurrency defaults to `os.availableParallelism() - 1`. ### `--test-coverage-branches=threshold` @@ -2304,6 +2288,9 @@ This option may be specified multiple times to exclude multiple glob patterns. If both `--test-coverage-exclude` and `--test-coverage-include` are provided, files must meet **both** criteria to be included in the coverage report. +By default all the matching test files are excluded from the coverage report. +Specifying this option will override the default behavior. + ### `--test-coverage-functions=threshold` + +Configures the type of test isolation used in the test runner. When `mode` is +`'process'`, each test file is run in a separate child process. When `mode` is +`'none'`, all test files run in the same process as the test runner. The default +isolation mode is `'process'`. This flag is ignored if the `--test` flag is not +present. See the [test runner execution model][] section for more information. + ### `--test-name-pattern` -> Stability: 1.0 - Early development - Regenerates the snapshot files used by the test runner for [snapshot testing][]. -Node.js must be started with the `--experimental-test-snapshots` flag in order -to use this functionality. ### `--throw-deprecation` @@ -2584,6 +2588,45 @@ added: v0.8.0 Print stack traces for deprecations. +### `--trace-env` + + + +Print information about any access to environment variables done in the current Node.js +instance to stderr, including: + +* The environment variable reads that Node.js does internally. +* Writes in the form of `process.env.KEY = "SOME VALUE"`. +* Reads in the form of `process.env.KEY`. +* Definitions in the form of `Object.defineProperty(process.env, 'KEY', {...})`. +* Queries in the form of `Object.hasOwn(process.env, 'KEY')`, + `process.env.hasOwnProperty('KEY')` or `'KEY' in process.env`. +* Deletions in the form of `delete process.env.KEY`. +* Enumerations inf the form of `...process.env` or `Object.keys(process.env)`. + +Only the names of the environment variables being accessed are printed. The values are not printed. + +To print the stack trace of the access, use `--trace-env-js-stack` and/or +`--trace-env-native-stack`. + +### `--trace-env-js-stack` + + + +In addition to what `--trace-env` does, this prints the JavaScript stack trace of the access. + +### `--trace-env-native-stack` + + + +In addition to what `--trace-env` does, this prints the native stack trace of the access. + ### `--trace-event-categories` + +Prints information about usage of [Loading ECMAScript modules using `require()`][]. + +When `mode` is `all`, all usage is printed. When `mode` is `no-node-modules`, usage +from the `node_modules` folder is excluded. + ### `--trace-sigint` @@ -3542,6 +3593,16 @@ for MiB in 16 32 64 128; do done ``` +### `--perf-basic-prof` + +### `--perf-basic-prof-only-functions` + +### `--perf-prof` + +### `--perf-prof-unwinding-info` + +### `--prof` + ### `--security-revert` ### `--stack-trace-limit=limit` @@ -3591,12 +3652,12 @@ node --stack-trace-limit=12 -p -e "Error.stackTraceLimit" # prints 12 [`--diagnostic-dir`]: #--diagnostic-dirdirectory [`--env-file-if-exists`]: #--env-file-if-existsconfig [`--env-file`]: #--env-fileconfig -[`--experimental-default-type=module`]: #--experimental-default-typetype +[`--experimental-addon-modules`]: #--experimental-addon-modules [`--experimental-sea-config`]: single-executable-applications.md#generating-single-executable-preparation-blobs -[`--experimental-strip-types`]: #--experimental-strip-types [`--experimental-wasm-modules`]: #--experimental-wasm-modules [`--heap-prof-dir`]: #--heap-prof-dir [`--import`]: #--importmodule +[`--no-experimental-strip-types`]: #--no-experimental-strip-types [`--openssl-config`]: #--openssl-configfile [`--preserve-symlinks`]: #--preserve-symlinks [`--print`]: #-p---print-script @@ -3605,6 +3666,7 @@ node --stack-trace-limit=12 -p -e "Error.stackTraceLimit" # prints 12 [`AsyncLocalStorage`]: async_context.md#class-asynclocalstorage [`Buffer`]: buffer.md#class-buffer [`CRYPTO_secure_malloc_init`]: https://www.openssl.org/docs/man3.0/man3/CRYPTO_secure_malloc_init.html +[`ERR_INVALID_TYPESCRIPT_SYNTAX`]: errors.md#err_invalid_typescript_syntax [`NODE_OPTIONS`]: #node_optionsoptions [`NO_COLOR`]: https://no-color.org [`SlowBuffer`]: buffer.md#class-slowbuffer diff --git a/doc/api/crypto.md b/doc/api/crypto.md index 8d8ef309ae73ea..9c073f7c99bb3f 100644 --- a/doc/api/crypto.md +++ b/doc/api/crypto.md @@ -2059,6 +2059,22 @@ types are: This property is `undefined` for unrecognized `KeyObject` types and symmetric keys. +### `keyObject.equals(otherKeyObject)` + + + +* `otherKeyObject`: {KeyObject} A `KeyObject` with which to + compare `keyObject`. +* Returns: {boolean} + +Returns `true` or `false` depending on whether the keys have exactly the same +type, value, and parameters. This method is not +[constant time](https://en.wikipedia.org/wiki/Timing_attack). + ### `keyObject.export([options])` - -* `otherKeyObject`: {KeyObject} A `KeyObject` with which to - compare `keyObject`. -* Returns: {boolean} - -Returns `true` or `false` depending on whether the keys have exactly the same -type, value, and parameters. This method is not -[constant time](https://en.wikipedia.org/wiki/Timing_attack). - ### `keyObject.symmetricKeySize` + +* Type: {string\[]} + +An array detailing the key extended usages for this certificate. + ### `x509.fingerprint` - -* Type: {string\[]} - -An array detailing the key extended usages for this certificate. - ### `x509.publicKey` - -* {Object} - -An object containing commonly used constants for crypto and security related -operations. The specific constants currently defined are described in -[Crypto constants][]. - -### `crypto.fips` - - - -> Stability: 0 - Deprecated - -Property for checking and controlling whether a FIPS compliant crypto provider -is currently in use. Setting to true requires a FIPS build of Node.js. - -This property is deprecated. Please use `crypto.setFips()` and -`crypto.getFips()` instead. - ### `crypto.checkPrime(candidate[, options], callback)` + +* {Object} + +An object containing commonly used constants for crypto and security related +operations. The specific constants currently defined are described in +[Crypto constants][]. + ### `crypto.createCipheriv(algorithm, key, iv[, options])` -> Stability: 1.2 - Release candidate - -* `algorithm` {string|undefined} -* `data` {string|Buffer|TypedArray|DataView} When `data` is a - string, it will be encoded as UTF-8 before being hashed. If a different - input encoding is desired for a string input, user could encode the string - into a `TypedArray` using either `TextEncoder` or `Buffer.from()` and passing - the encoded `TypedArray` into this API instead. -* `outputEncoding` {string|undefined} [Encoding][encoding] used to encode the - returned digest. **Default:** `'hex'`. -* Returns: {string|Buffer} - -A utility for creating one-shot hash digests of data. It can be faster than -the object-based `crypto.createHash()` when hashing a smaller amount of data -(<= 5MB) that's readily available. If the data can be big or if it is streamed, -it's still recommended to use `crypto.createHash()` instead. - -The `algorithm` is dependent on the available algorithms supported by the -version of OpenSSL on the platform. Examples are `'sha256'`, `'sha512'`, etc. -On recent releases of OpenSSL, `openssl list -digest-algorithms` will -display the available digest algorithms. - -Example: - -```cjs -const crypto = require('node:crypto'); -const { Buffer } = require('node:buffer'); - -// Hashing a string and return the result as a hex-encoded string. -const string = 'Node.js'; -// 10b3493287f831e81a438811a1ffba01f8cec4b7 -console.log(crypto.hash('sha1', string)); - -// Encode a base64-encoded string into a Buffer, hash it and return -// the result as a buffer. -const base64 = 'Tm9kZS5qcw=='; -// -console.log(crypto.hash('sha1', Buffer.from(base64, 'base64'), 'buffer')); -``` - -```mjs -import crypto from 'node:crypto'; -import { Buffer } from 'node:buffer'; +> Stability: 0 - Deprecated -// Hashing a string and return the result as a hex-encoded string. -const string = 'Node.js'; -// 10b3493287f831e81a438811a1ffba01f8cec4b7 -console.log(crypto.hash('sha1', string)); +Property for checking and controlling whether a FIPS compliant crypto provider +is currently in use. Setting to true requires a FIPS build of Node.js. -// Encode a base64-encoded string into a Buffer, hash it and return -// the result as a buffer. -const base64 = 'Tm9kZS5qcw=='; -// -console.log(crypto.hash('sha1', Buffer.from(base64, 'base64'), 'buffer')); -``` +This property is deprecated. Please use `crypto.setFips()` and +`crypto.getFips()` instead. ### `crypto.generateKey(type, options, callback)` @@ -4228,6 +4164,70 @@ A convenient alias for [`crypto.webcrypto.getRandomValues()`][]. This implementation is not compliant with the Web Crypto spec, to write web-compatible code use [`crypto.webcrypto.getRandomValues()`][] instead. +### `crypto.hash(algorithm, data[, outputEncoding])` + + + +> Stability: 1.2 - Release candidate + +* `algorithm` {string|undefined} +* `data` {string|Buffer|TypedArray|DataView} When `data` is a + string, it will be encoded as UTF-8 before being hashed. If a different + input encoding is desired for a string input, user could encode the string + into a `TypedArray` using either `TextEncoder` or `Buffer.from()` and passing + the encoded `TypedArray` into this API instead. +* `outputEncoding` {string|undefined} [Encoding][encoding] used to encode the + returned digest. **Default:** `'hex'`. +* Returns: {string|Buffer} + +A utility for creating one-shot hash digests of data. It can be faster than +the object-based `crypto.createHash()` when hashing a smaller amount of data +(<= 5MB) that's readily available. If the data can be big or if it is streamed, +it's still recommended to use `crypto.createHash()` instead. + +The `algorithm` is dependent on the available algorithms supported by the +version of OpenSSL on the platform. Examples are `'sha256'`, `'sha512'`, etc. +On recent releases of OpenSSL, `openssl list -digest-algorithms` will +display the available digest algorithms. + +Example: + +```cjs +const crypto = require('node:crypto'); +const { Buffer } = require('node:buffer'); + +// Hashing a string and return the result as a hex-encoded string. +const string = 'Node.js'; +// 10b3493287f831e81a438811a1ffba01f8cec4b7 +console.log(crypto.hash('sha1', string)); + +// Encode a base64-encoded string into a Buffer, hash it and return +// the result as a buffer. +const base64 = 'Tm9kZS5qcw=='; +// +console.log(crypto.hash('sha1', Buffer.from(base64, 'base64'), 'buffer')); +``` + +```mjs +import crypto from 'node:crypto'; +import { Buffer } from 'node:buffer'; + +// Hashing a string and return the result as a hex-encoded string. +const string = 'Node.js'; +// 10b3493287f831e81a438811a1ffba01f8cec4b7 +console.log(crypto.hash('sha1', string)); + +// Encode a base64-encoded string into a Buffer, hash it and return +// the result as a buffer. +const base64 = 'Tm9kZS5qcw=='; +// +console.log(crypto.hash('sha1', Buffer.from(base64, 'base64'), 'buffer')); +``` + ### `crypto.hkdf(digest, ikm, salt, info, keylen, callback)` - -* `buffer` {ArrayBuffer|Buffer|TypedArray|DataView} Must be supplied. The - size of the provided `buffer` must not be larger than `2**31 - 1`. -* `offset` {number} **Default:** `0` -* `size` {number} **Default:** `buffer.length - offset`. The `size` must - not be larger than `2**31 - 1`. -* Returns: {ArrayBuffer|Buffer|TypedArray|DataView} The object passed as - `buffer` argument. - -Synchronous version of [`crypto.randomFill()`][]. - -```mjs -import { Buffer } from 'node:buffer'; -const { randomFillSync } = await import('node:crypto'); - -const buf = Buffer.alloc(10); -console.log(randomFillSync(buf).toString('hex')); - -randomFillSync(buf, 5); -console.log(buf.toString('hex')); - -// The above is equivalent to the following: -randomFillSync(buf, 5, 5); -console.log(buf.toString('hex')); -``` - -```cjs -const { randomFillSync } = require('node:crypto'); -const { Buffer } = require('node:buffer'); - -const buf = Buffer.alloc(10); -console.log(randomFillSync(buf).toString('hex')); - -randomFillSync(buf, 5); -console.log(buf.toString('hex')); - -// The above is equivalent to the following: -randomFillSync(buf, 5, 5); -console.log(buf.toString('hex')); -``` - -Any `ArrayBuffer`, `TypedArray` or `DataView` instance may be passed as -`buffer`. - -```mjs -import { Buffer } from 'node:buffer'; -const { randomFillSync } = await import('node:crypto'); - -const a = new Uint32Array(10); -console.log(Buffer.from(randomFillSync(a).buffer, - a.byteOffset, a.byteLength).toString('hex')); - -const b = new DataView(new ArrayBuffer(10)); -console.log(Buffer.from(randomFillSync(b).buffer, - b.byteOffset, b.byteLength).toString('hex')); - -const c = new ArrayBuffer(10); -console.log(Buffer.from(randomFillSync(c)).toString('hex')); -``` - -```cjs -const { randomFillSync } = require('node:crypto'); -const { Buffer } = require('node:buffer'); - -const a = new Uint32Array(10); -console.log(Buffer.from(randomFillSync(a).buffer, - a.byteOffset, a.byteLength).toString('hex')); - -const b = new DataView(new ArrayBuffer(10)); -console.log(Buffer.from(randomFillSync(b).buffer, - b.byteOffset, b.byteLength).toString('hex')); - -const c = new ArrayBuffer(10); -console.log(Buffer.from(randomFillSync(c)).toString('hex')); -``` - ### `crypto.randomFill(buffer[, offset][, size], callback)` + +* `buffer` {ArrayBuffer|Buffer|TypedArray|DataView} Must be supplied. The + size of the provided `buffer` must not be larger than `2**31 - 1`. +* `offset` {number} **Default:** `0` +* `size` {number} **Default:** `buffer.length - offset`. The `size` must + not be larger than `2**31 - 1`. +* Returns: {ArrayBuffer|Buffer|TypedArray|DataView} The object passed as + `buffer` argument. + +Synchronous version of [`crypto.randomFill()`][]. + +```mjs +import { Buffer } from 'node:buffer'; +const { randomFillSync } = await import('node:crypto'); + +const buf = Buffer.alloc(10); +console.log(randomFillSync(buf).toString('hex')); + +randomFillSync(buf, 5); +console.log(buf.toString('hex')); + +// The above is equivalent to the following: +randomFillSync(buf, 5, 5); +console.log(buf.toString('hex')); +``` + +```cjs +const { randomFillSync } = require('node:crypto'); +const { Buffer } = require('node:buffer'); + +const buf = Buffer.alloc(10); +console.log(randomFillSync(buf).toString('hex')); + +randomFillSync(buf, 5); +console.log(buf.toString('hex')); + +// The above is equivalent to the following: +randomFillSync(buf, 5, 5); +console.log(buf.toString('hex')); +``` + +Any `ArrayBuffer`, `TypedArray` or `DataView` instance may be passed as +`buffer`. + +```mjs +import { Buffer } from 'node:buffer'; +const { randomFillSync } = await import('node:crypto'); + +const a = new Uint32Array(10); +console.log(Buffer.from(randomFillSync(a).buffer, + a.byteOffset, a.byteLength).toString('hex')); + +const b = new DataView(new ArrayBuffer(10)); +console.log(Buffer.from(randomFillSync(b).buffer, + b.byteOffset, b.byteLength).toString('hex')); + +const c = new ArrayBuffer(10); +console.log(Buffer.from(randomFillSync(c)).toString('hex')); +``` + +```cjs +const { randomFillSync } = require('node:crypto'); +const { Buffer } = require('node:buffer'); + +const a = new Uint32Array(10); +console.log(Buffer.from(randomFillSync(a).buffer, + a.byteOffset, a.byteLength).toString('hex')); + +const b = new DataView(new ArrayBuffer(10)); +console.log(Buffer.from(randomFillSync(b).buffer, + b.byteOffset, b.byteLength).toString('hex')); + +const c = new ArrayBuffer(10); +console.log(Buffer.from(randomFillSync(c)).toString('hex')); +``` + ### `crypto.randomInt([min, ]max[, callback])` -Type: Documentation-only +Type: Runtime Instantiating classes without the `new` qualifier exported by the `node:zlib` module is deprecated. It is recommended to use the `new` qualifier instead. This applies to all Zlib classes, such as `Deflate`, @@ -3772,6 +3775,47 @@ It is recommended to use the `new` qualifier instead. This applies to all REPL c +### DEP0187: Passing invalid argument types to `fs.existsSync` + + + +Type: Documentation-only + +Passing non-supported argument types is deprecated and, instead of returning `false`, +will throw an error in a future version. + +### DEP0188: `process.features.ipv6` and `process.features.uv` + + + +Type: Documentation-only + +These properties are unconditionally `true`. Any checks based on these properties are redundant. + +### DEP0189: `process.features.tls_*` + + + +Type: Documentation-only + +`process.features.tls_alpn`, `process.features.tls_ocsp`, and `process.features.tls_sni` are +deprecated, as their values are guaranteed to be identical to that of `process.features.tls`. + [NIST SP 800-38D]: https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38d.pdf [RFC 6066]: https://tools.ietf.org/html/rfc6066#section-3 [RFC 8247 Section 2.4]: https://www.rfc-editor.org/rfc/rfc8247#section-2.4 diff --git a/doc/api/dgram.md b/doc/api/dgram.md index 2243b6abdea9bc..f3f34dbb9cbb4e 100644 --- a/doc/api/dgram.md +++ b/doc/api/dgram.md @@ -918,7 +918,9 @@ chained. ```js - const fs = require('fs/promises'); + const fs = require('node:fs/promises'); (async () => { let data; @@ -2155,6 +2155,12 @@ An attempt was made to open an IPC communication channel with a synchronously forked Node.js process. See the documentation for the [`child_process`][] module for more information. + + +### `ERR_IP_BLOCKED` + +IP is blocked by `net.BlockList`. + ### `ERR_LOADER_CHAIN_INCOMPLETE` @@ -2168,6 +2174,16 @@ added: An ESM loader hook returned without calling `next()` and without explicitly signaling a short circuit. + + +### `ERR_LOAD_SQLITE_EXTENSION` + + + +An error occurred while loading a SQLite extension. + ### `ERR_MEMORY_ALLOCATION_FAILED` @@ -2337,7 +2353,9 @@ compiled with ICU support. ### `ERR_NO_TYPESCRIPT` An attempt was made to use features that require [Native TypeScript support][], but Node.js was not @@ -2436,6 +2454,18 @@ Accessing `Object.prototype.__proto__` has been forbidden using [`Object.setPrototypeOf`][] should be used to get and set the prototype of an object. + + +### `ERR_QUIC_APPLICATION_ERROR` + + + +> Stability: 1 - Experimental + +A QUIC application error occurred. + ### `ERR_QUIC_CONNECTION_FAILED` @@ -2478,6 +2508,30 @@ added: Opening a QUIC stream failed. + + +### `ERR_QUIC_TRANSPORT_ERROR` + + + +> Stability: 1 - Experimental + +A QUIC transport error occurred. + + + +### `ERR_QUIC_VERSION_NEGOTIATION_ERROR` + + + +> Stability: 1 - Experimental + +A QUIC session failed because version negotiation is required. + ### `ERR_REQUIRE_ASYNC_MODULE` @@ -2512,7 +2566,9 @@ module, and should be done lazily in an inner function. diff --git a/doc/api/esm.md b/doc/api/esm.md index c256f2947b42c6..5288dfea3cde0e 100644 --- a/doc/api/esm.md +++ b/doc/api/esm.md @@ -9,9 +9,13 @@ added: v8.5.0 changes: - version: - v23.1.0 + - v22.12.0 - v18.20.5 pr-url: https://github.com/nodejs/node/pull/55333 description: Import attributes are no longer experimental. + - version: v22.0.0 + pr-url: https://github.com/nodejs/node/pull/52104 + description: Drop support for import assertions. - version: - v21.0.0 - v20.10.0 @@ -121,14 +125,13 @@ Node.js has two module systems: [CommonJS][] modules and ECMAScript modules. Authors can tell Node.js to interpret JavaScript as an ES module via the `.mjs` file extension, the `package.json` [`"type"`][] field with a value `"module"`, -the [`--input-type`][] flag with a value of `"module"`, or the -[`--experimental-default-type`][] flag with a value of `"module"`. These are -explicit markers of code being intended to run as an ES module. +or the [`--input-type`][] flag with a value of `"module"`. These are explicit +markers of code being intended to run as an ES module. -Inversely, authors can tell Node.js to interpret JavaScript as CommonJS via the -`.cjs` file extension, the `package.json` [`"type"`][] field with a value -`"commonjs"`, the [`--input-type`][] flag with a value of `"commonjs"`, or the -[`--experimental-default-type`][] flag with a value of `"commonjs"`. +Inversely, authors can explicitly tell Node.js to interpret JavaScript as +CommonJS via the `.cjs` file extension, the `package.json` [`"type"`][] field +with a value `"commonjs"`, or the [`--input-type`][] flag with a value of +`"commonjs"`. When code lacks explicit markers for either module system, Node.js will inspect the source code of a module to look for ES module syntax. If such syntax is @@ -340,7 +343,7 @@ modules it can be used to load ES modules. * {Object} The `import.meta` meta property is an `Object` that contains the following -properties. +properties. It is only supported in ES modules. ### `import.meta.dirname` @@ -508,7 +511,7 @@ module default import or its corresponding sugar syntax: ```js import { default as cjs } from 'cjs'; -// identical to the above +// Identical to the above import cjsSugar from 'cjs'; console.log(cjs); @@ -637,6 +640,7 @@ separate cache. changes: - version: - v23.1.0 + - v22.12.0 - v18.20.5 pr-url: https://github.com/nodejs/node/pull/55333 description: JSON modules are no longer experimental. @@ -1041,18 +1045,21 @@ _isImports_, _conditions_) > 5. If `--experimental-wasm-modules` is enabled and _url_ ends in > _".wasm"_, then > 1. Return _"wasm"_. -> 6. Let _packageURL_ be the result of **LOOKUP\_PACKAGE\_SCOPE**(_url_). -> 7. Let _pjson_ be the result of **READ\_PACKAGE\_JSON**(_packageURL_). -> 8. Let _packageType_ be **null**. -> 9. If _pjson?.type_ is _"module"_ or _"commonjs"_, then -> 1. Set _packageType_ to _pjson.type_. -> 10. If _url_ ends in _".js"_, then +> 6. If `--experimental-addon-modules` is enabled and _url_ ends in +> _".node"_, then +> 1. Return _"addon"_. +> 7. Let _packageURL_ be the result of **LOOKUP\_PACKAGE\_SCOPE**(_url_). +> 8. Let _pjson_ be the result of **READ\_PACKAGE\_JSON**(_packageURL_). +> 9. Let _packageType_ be **null**. +> 10. If _pjson?.type_ is _"module"_ or _"commonjs"_, then +> 1. Set _packageType_ to _pjson.type_. +> 11. If _url_ ends in _".js"_, then > 1. If _packageType_ is not **null**, then > 1. Return _packageType_. > 2. If the result of **DETECT\_MODULE\_SYNTAX**(_source_) is true, then > 1. Return _"module"_. > 3. Return _"commonjs"_. -> 11. If _url_ does not have any extension, then +> 12. If _url_ does not have any extension, then > 1. If _packageType_ is _"module"_ and `--experimental-wasm-modules` is > enabled and the file at _url_ contains the header for a WebAssembly > module, then @@ -1062,7 +1069,7 @@ _isImports_, _conditions_) > 3. If the result of **DETECT\_MODULE\_SYNTAX**(_source_) is true, then > 1. Return _"module"_. > 4. Return _"commonjs"_. -> 12. Return **undefined** (will throw during load phase). +> 13. Return **undefined** (will throw during load phase). **LOOKUP\_PACKAGE\_SCOPE**(_url_) @@ -1121,7 +1128,6 @@ resolution for ESM specifiers is [commonjs-extension-resolution-loader][]. [URL]: https://url.spec.whatwg.org/ [`"exports"`]: packages.md#exports [`"type"`]: packages.md#type -[`--experimental-default-type`]: cli.md#--experimental-default-typetype [`--input-type`]: cli.md#--input-typetype [`data:` URLs]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs [`export`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/export diff --git a/doc/api/events.md b/doc/api/events.md index a10867aa689a1a..e16054bcc588d8 100644 --- a/doc/api/events.md +++ b/doc/api/events.md @@ -1171,6 +1171,10 @@ that a "possible EventEmitter memory leak" has been detected. For any single `EventEmitter`, the `emitter.getMaxListeners()` and `emitter.setMaxListeners()` methods can be used to temporarily avoid this warning: +`defaultMaxListeners` has no effect on `AbortSignal` instances. While it is +still possible to use [`emitter.setMaxListeners(n)`][] to set a warning limit +for individual `AbortSignal` instances, per default `AbortSignal` instances will not warn. + ```mjs import { EventEmitter } from 'node:events'; const emitter = new EventEmitter(); diff --git a/doc/api/http.md b/doc/api/http.md index 9b9175a003f56c..886bbe26ecc95c 100644 --- a/doc/api/http.md +++ b/doc/api/http.md @@ -3848,8 +3848,13 @@ changes: * `port` {number} Port of remote server. **Default:** `defaultPort` if set, else `80`. * `protocol` {string} Protocol to use. **Default:** `'http:'`. + * `setDefaultHeaders` {boolean}: Specifies whether or not to automatically add + default headers such as `Connection`, `Content-Length`, `Transfer-Encoding`, + and `Host`. If set to `false` then all necessary headers must be added + manually. Defaults to `true`. * `setHost` {boolean}: Specifies whether or not to automatically add the - `Host` header. Defaults to `true`. + `Host` header. If provided, this overrides `setDefaultHeaders`. Defaults to + `true`. * `signal` {AbortSignal}: An AbortSignal that may be used to abort an ongoing request. * `socketPath` {string} Unix domain socket. Cannot be used if one of `host` diff --git a/doc/api/inspector.md b/doc/api/inspector.md index 64db50b8fc1da4..2892779403d256 100644 --- a/doc/api/inspector.md +++ b/doc/api/inspector.md @@ -505,7 +505,7 @@ inspector.Network.requestWillBeSent({ request: { url: 'https://nodejs.org/en', method: 'GET', - } + }, }); ``` diff --git a/doc/api/module.md b/doc/api/module.md index 3d20d83c73a9b3..bf0171fad54b31 100644 --- a/doc/api/module.md +++ b/doc/api/module.md @@ -21,6 +21,10 @@ added: - v9.3.0 - v8.10.0 - v6.13.0 +changes: + - version: v23.5.0 + pr-url: https://github.com/nodejs/node/pull/56185 + description: The list now also contains prefix-only modules. --> * {string\[]} @@ -28,8 +32,6 @@ added: A list of the names of all modules provided by Node.js. Can be used to verify if a module is maintained by a third party or not. -Note: the list doesn't contain [prefix-only modules][] like `node:test`. - `module` in this context isn't the same object that's provided by the [module wrapper][]. To access it, require the `Module` module: @@ -64,159 +66,6 @@ const require = createRequire(import.meta.url); const siblingModule = require('./sibling-module'); ``` -### `module.constants.compileCacheStatus` - - - -> Stability: 1.1 - Active Development - -The following constants are returned as the `status` field in the object returned by -[`module.enableCompileCache()`][] to indicate the result of the attempt to enable the -[module compile cache][]. - - - - - - - - - - - - - - - - - - - - - - -
    ConstantDescription
    ENABLED - Node.js has enabled the compile cache successfully. The directory used to store the - compile cache will be returned in the directory field in the - returned object. -
    ALREADY_ENABLED - The compile cache has already been enabled before, either by a previous call to - module.enableCompileCache(), or by the NODE_COMPILE_CACHE=dir - environment variable. The directory used to store the - compile cache will be returned in the directory field in the - returned object. -
    FAILED - Node.js fails to enable the compile cache. This can be caused by the lack of - permission to use the specified directory, or various kinds of file system errors. - The detail of the failure will be returned in the message field in the - returned object. -
    DISABLED - Node.js cannot enable the compile cache because the environment variable - NODE_DISABLE_COMPILE_CACHE=1 has been set. -
    - -### `module.enableCompileCache([cacheDir])` - - - -> Stability: 1.1 - Active Development - -* `cacheDir` {string|undefined} Optional path to specify the directory where the compile cache - will be stored/retrieved. -* Returns: {Object} - * `status` {integer} One of the [`module.constants.compileCacheStatus`][] - * `message` {string|undefined} If Node.js cannot enable the compile cache, this contains - the error message. Only set if `status` is `module.constants.compileCacheStatus.FAILED`. - * `directory` {string|undefined} If the compile cache is enabled, this contains the directory - where the compile cache is stored. Only set if `status` is - `module.constants.compileCacheStatus.ENABLED` or - `module.constants.compileCacheStatus.ALREADY_ENABLED`. - -Enable [module compile cache][] in the current Node.js instance. - -If `cacheDir` is not specified, Node.js will either use the directory specified by the -[`NODE_COMPILE_CACHE=dir`][] environment variable if it's set, or use -`path.join(os.tmpdir(), 'node-compile-cache')` otherwise. For general use cases, it's -recommended to call `module.enableCompileCache()` without specifying the `cacheDir`, -so that the directory can be overridden by the `NODE_COMPILE_CACHE` environment -variable when necessary. - -Since compile cache is supposed to be a quiet optimization that is not required for the -application to be functional, this method is designed to not throw any exception when the -compile cache cannot be enabled. Instead, it will return an object containing an error -message in the `message` field to aid debugging. -If compile cache is enabled successfully, the `directory` field in the returned object -contains the path to the directory where the compile cache is stored. The `status` -field in the returned object would be one of the `module.constants.compileCacheStatus` -values to indicate the result of the attempt to enable the [module compile cache][]. - -This method only affects the current Node.js instance. To enable it in child worker threads, -either call this method in child worker threads too, or set the -`process.env.NODE_COMPILE_CACHE` value to compile cache directory so the behavior can -be inherited into the child workers. The directory can be obtained either from the -`directory` field returned by this method, or with [`module.getCompileCacheDir()`][]. - -#### Module compile cache - - - -The module compile cache can be enabled either using the [`module.enableCompileCache()`][] -method or the [`NODE_COMPILE_CACHE=dir`][] environment variable. After it is enabled, -whenever Node.js compiles a CommonJS or a ECMAScript Module, it will use on-disk -[V8 code cache][] persisted in the specified directory to speed up the compilation. -This may slow down the first load of a module graph, but subsequent loads of the same module -graph may get a significant speedup if the contents of the modules do not change. - -To clean up the generated compile cache on disk, simply remove the cache directory. The cache -directory will be recreated the next time the same directory is used for for compile cache -storage. To avoid filling up the disk with stale cache, it is recommended to use a directory -under the [`os.tmpdir()`][]. If the compile cache is enabled by a call to -[`module.enableCompileCache()`][] without specifying the directory, Node.js will use -the [`NODE_COMPILE_CACHE=dir`][] environment variable if it's set, or defaults -to `path.join(os.tmpdir(), 'node-compile-cache')` otherwise. To locate the compile cache -directory used by a running Node.js instance, use [`module.getCompileCacheDir()`][]. - -Currently when using the compile cache with [V8 JavaScript code coverage][], the -coverage being collected by V8 may be less precise in functions that are -deserialized from the code cache. It's recommended to turn this off when -running tests to generate precise coverage. - -The enabled module compile cache can be disabled by the [`NODE_DISABLE_COMPILE_CACHE=1`][] -environment variable. This can be useful when the compile cache leads to unexpected or -undesired behaviors (e.g. less precise test coverage). - -Compilation cache generated by one version of Node.js can not be reused by a different -version of Node.js. Cache generated by different versions of Node.js will be stored -separately if the same base directory is used to persist the cache, so they can co-exist. - -At the moment, when the compile cache is enabled and a module is loaded afresh, the -code cache is generated from the compiled code immediately, but will only be written -to disk when the Node.js instance is about to exit. This is subject to change. The -[`module.flushCompileCache()`][] method can be used to ensure the accumulated code cache -is flushed to disk in case the application wants to spawn other Node.js instances -and let them share the cache long before the parent exits. - -### `module.getCompileCacheDir()` - - - -> Stability: 1.1 - Active Development - -* Returns: {string|undefined} Path to the [module compile cache][] directory if it is enabled, - or `undefined` otherwise. - ### `module.findPackageJSON(specifier[, base])` + +> Stability: 1.1 - Active development + +* `options` {Object} + * `load` {Function|undefined} See [load hook][]. **Default:** `undefined`. + * `resolve` {Function|undefined} See [resolve hook][]. **Default:** `undefined`. + +Register [hooks][] that customize Node.js module resolution and loading behavior. +See [Customization hooks][]. + +### `module.stripTypeScriptTypes(code[, options])` + +The module compile cache can be enabled either using the [`module.enableCompileCache()`][] +method or the [`NODE_COMPILE_CACHE=dir`][] environment variable. After it is enabled, +whenever Node.js compiles a CommonJS or a ECMAScript Module, it will use on-disk +[V8 code cache][] persisted in the specified directory to speed up the compilation. +This may slow down the first load of a module graph, but subsequent loads of the same module +graph may get a significant speedup if the contents of the modules do not change. + +To clean up the generated compile cache on disk, simply remove the cache directory. The cache +directory will be recreated the next time the same directory is used for for compile cache +storage. To avoid filling up the disk with stale cache, it is recommended to use a directory +under the [`os.tmpdir()`][]. If the compile cache is enabled by a call to +[`module.enableCompileCache()`][] without specifying the directory, Node.js will use +the [`NODE_COMPILE_CACHE=dir`][] environment variable if it's set, or defaults +to `path.join(os.tmpdir(), 'node-compile-cache')` otherwise. To locate the compile cache +directory used by a running Node.js instance, use [`module.getCompileCacheDir()`][]. + +Currently when using the compile cache with [V8 JavaScript code coverage][], the +coverage being collected by V8 may be less precise in functions that are +deserialized from the code cache. It's recommended to turn this off when +running tests to generate precise coverage. + +The enabled module compile cache can be disabled by the [`NODE_DISABLE_COMPILE_CACHE=1`][] +environment variable. This can be useful when the compile cache leads to unexpected or +undesired behaviors (e.g. less precise test coverage). + +Compilation cache generated by one version of Node.js can not be reused by a different +version of Node.js. Cache generated by different versions of Node.js will be stored +separately if the same base directory is used to persist the cache, so they can co-exist. + +At the moment, when the compile cache is enabled and a module is loaded afresh, the +code cache is generated from the compiled code immediately, but will only be written +to disk when the Node.js instance is about to exit. This is subject to change. The +[`module.flushCompileCache()`][] method can be used to ensure the accumulated code cache +is flushed to disk in case the application wants to spawn other Node.js instances +and let them share the cache long before the parent exits. + +### `module.constants.compileCacheStatus` + + + +> Stability: 1.1 - Active Development + +The following constants are returned as the `status` field in the object returned by +[`module.enableCompileCache()`][] to indicate the result of the attempt to enable the +[module compile cache][]. + + + + + + + + + + + + + + + + + + + + + + +
    ConstantDescription
    ENABLED + Node.js has enabled the compile cache successfully. The directory used to store the + compile cache will be returned in the directory field in the + returned object. +
    ALREADY_ENABLED + The compile cache has already been enabled before, either by a previous call to + module.enableCompileCache(), or by the NODE_COMPILE_CACHE=dir + environment variable. The directory used to store the + compile cache will be returned in the directory field in the + returned object. +
    FAILED + Node.js fails to enable the compile cache. This can be caused by the lack of + permission to use the specified directory, or various kinds of file system errors. + The detail of the failure will be returned in the message field in the + returned object. +
    DISABLED + Node.js cannot enable the compile cache because the environment variable + NODE_DISABLE_COMPILE_CACHE=1 has been set. +
    + +### `module.enableCompileCache([cacheDir])` + + + +> Stability: 1.1 - Active Development + +* `cacheDir` {string|undefined} Optional path to specify the directory where the compile cache + will be stored/retrieved. +* Returns: {Object} + * `status` {integer} One of the [`module.constants.compileCacheStatus`][] + * `message` {string|undefined} If Node.js cannot enable the compile cache, this contains + the error message. Only set if `status` is `module.constants.compileCacheStatus.FAILED`. + * `directory` {string|undefined} If the compile cache is enabled, this contains the directory + where the compile cache is stored. Only set if `status` is + `module.constants.compileCacheStatus.ENABLED` or + `module.constants.compileCacheStatus.ALREADY_ENABLED`. + +Enable [module compile cache][] in the current Node.js instance. + +If `cacheDir` is not specified, Node.js will either use the directory specified by the +[`NODE_COMPILE_CACHE=dir`][] environment variable if it's set, or use +`path.join(os.tmpdir(), 'node-compile-cache')` otherwise. For general use cases, it's +recommended to call `module.enableCompileCache()` without specifying the `cacheDir`, +so that the directory can be overridden by the `NODE_COMPILE_CACHE` environment +variable when necessary. + +Since compile cache is supposed to be a quiet optimization that is not required for the +application to be functional, this method is designed to not throw any exception when the +compile cache cannot be enabled. Instead, it will return an object containing an error +message in the `message` field to aid debugging. +If compile cache is enabled successfully, the `directory` field in the returned object +contains the path to the directory where the compile cache is stored. The `status` +field in the returned object would be one of the `module.constants.compileCacheStatus` +values to indicate the result of the attempt to enable the [module compile cache][]. + +This method only affects the current Node.js instance. To enable it in child worker threads, +either call this method in child worker threads too, or set the +`process.env.NODE_COMPILE_CACHE` value to compile cache directory so the behavior can +be inherited into the child workers. The directory can be obtained either from the +`directory` field returned by this method, or with [`module.getCompileCacheDir()`][]. + +### `module.flushCompileCache()` + + + +> Stability: 1.1 - Active Development + +Flush the [module compile cache][] accumulated from modules already loaded +in the current Node.js instance to disk. This returns after all the flushing +file system operations come to an end, no matter they succeed or not. If there +are any errors, this will fail silently, since compile cache misses should not +interfere with the actual operation of the application. + +### `module.getCompileCacheDir()` + + + +> Stability: 1.1 - Active Development + +* Returns: {string|undefined} Path to the [module compile cache][] directory if it is enabled, + or `undefined` otherwise. + ## Customization Hooks @@ -497,6 +534,9 @@ import('node:fs').then((esmFS) => { -> Stability: 1.2 - Release candidate - +> Stability: 1.2 - Release candidate (asynchronous version) +> Stability: 1.1 - Active development (synchronous version) + +There are two types of module customization hooks that are currently supported: + +1. `module.register(specifier[, parentURL][, options])` which takes a module that + exports asynchronous hook functions. The functions are run on a separate loader + thread. +2. `module.registerHooks(options)` which takes synchronous hook functions that are + run directly on the thread where the module is loaded. + ### Enabling -Module resolution and loading can be customized by registering a file which -exports a set of hooks. This can be done using the [`register`][] method -from `node:module`, which you can run before your application code by -using the `--import` flag: +Module resolution and loading can be customized by: + +1. Registering a file which exports a set of asynchronous hook functions, using the + [`register`][] method from `node:module`, +2. Registering a set of synchronous hook functions using the [`registerHooks`][] method + from `node:module`. + +The hooks can be registered before the application code is run by using the +[`--import`][] or [`--require`][] flag: ```bash node --import ./register-hooks.js ./my-app.js +node --require ./register-hooks.js ./my-app.js ``` ```mjs // register-hooks.js +// This file can only be require()-ed if it doesn't contain top-level await. +// Use module.register() to register asynchronous hooks in a dedicated thread. import { register } from 'node:module'; - register('./hooks.mjs', import.meta.url); ``` @@ -541,24 +597,46 @@ register('./hooks.mjs', import.meta.url); // register-hooks.js const { register } = require('node:module'); const { pathToFileURL } = require('node:url'); - +// Use module.register() to register asynchronous hooks in a dedicated thread. register('./hooks.mjs', pathToFileURL(__filename)); ``` -The file passed to `--import` can also be an export from a dependency: +```mjs +// Use module.registerHooks() to register synchronous hooks in the main thread. +import { registerHooks } from 'node:module'; +registerHooks({ + resolve(specifier, context, nextResolve) { /* implementation */ }, + load(url, context, nextLoad) { /* implementation */ }, +}); +``` + +```cjs +// Use module.registerHooks() to register synchronous hooks in the main thread. +const { registerHooks } = require('node:module'); +registerHooks({ + resolve(specifier, context, nextResolve) { /* implementation */ }, + load(url, context, nextLoad) { /* implementation */ }, +}); +``` + +The file passed to `--import` or `--require` can also be an export from a dependency: ```bash node --import some-package/register ./my-app.js +node --require some-package/register ./my-app.js ``` Where `some-package` has an [`"exports"`][] field defining the `/register` export to map to a file that calls `register()`, like the following `register-hooks.js` example. -Using `--import` ensures that the hooks are registered before any application -files are imported, including the entry point of the application. Alternatively, -`register` can be called from the entry point, but dynamic `import()` must be -used for any code that should be run after the hooks are registered: +Using `--import` or `--require` ensures that the hooks are registered before any +application files are imported, including the entry point of the application and for +any worker threads by default as well. + +Alternatively, `register()` and `registerHooks()` can be called from the entry point, +though dynamic `import()` must be used for any ESM code that should be run after the hooks +are registered. ```mjs import { register } from 'node:module'; @@ -581,18 +659,52 @@ register('http-to-https', pathToFileURL(__filename)); import('./my-app.js'); ``` +Customization hooks will run for any modules loaded later than the registration +and the modules they reference via `import` and the built-in `require`. +`require` function created by users using `module.createRequire()` can only be +customized by the synchronous hooks. + In this example, we are registering the `http-to-https` hooks, but they will -only be available for subsequently imported modules—in this case, `my-app.js` -and anything it references via `import` (and optionally `require`). If the -`import('./my-app.js')` had instead been a static `import './my-app.js'`, the +only be available for subsequently imported modules — in this case, `my-app.js` +and anything it references via `import` or built-in `require` in CommonJS dependencies. + +If the `import('./my-app.js')` had instead been a static `import './my-app.js'`, the app would have _already_ been loaded **before** the `http-to-https` hooks were registered. This due to the ES modules specification, where static imports are evaluated from the leaves of the tree first, then back to the trunk. There can be static imports _within_ `my-app.js`, which will not be evaluated until `my-app.js` is dynamically imported. -`my-app.js` can also be CommonJS. Customization hooks will run for any -modules that it references via `import` (and optionally `require`). +If synchronous hooks are used, both `import`, `require` and user `require` created +using `createRequire()` are supported. + +```mjs +import { registerHooks, createRequire } from 'node:module'; + +registerHooks({ /* implementation of synchronous hooks */ }); + +const require = createRequire(import.meta.url); + +// The synchronous hooks affect import, require() and user require() function +// created through createRequire(). +await import('./my-app.js'); +require('./my-app-2.js'); +``` + +```cjs +const { register, registerHooks } = require('node:module'); +const { pathToFileURL } = require('node:url'); + +registerHooks({ /* implementation of synchronous hooks */ }); + +const userRequire = createRequire(__filename); + +// The synchronous hooks affect import, require() and user require() function +// created through createRequire(). +import('./my-app.js'); +require('./my-app-2.js'); +userRequire('./my-app-3.js'); +``` Finally, if all you want to do is register hooks before your app runs and you don't want to create a separate file for that purpose, you can pass a `data:` @@ -642,9 +754,36 @@ earlier registered hooks transpile into JavaScript. The `register` method cannot be called from within the module that defines the hooks. +Chaining of `registerHooks` work similarly. If synchronous and asynchronous +hooks are mixed, the synchronous hooks are always run first before the asynchronous +hooks start running, that is, in the last synchronous hook being run, its next +hook includes invocation of the asynchronous hooks. + +```mjs +// entrypoint.mjs +import { registerHooks } from 'node:module'; + +const hook1 = { /* implementation of hooks */ }; +const hook2 = { /* implementation of hooks */ }; +// hook2 run before hook1. +registerHooks(hook1); +registerHooks(hook2); +``` + +```cjs +// entrypoint.cjs +const { registerHooks } = require('node:module'); + +const hook1 = { /* implementation of hooks */ }; +const hook2 = { /* implementation of hooks */ }; +// hook2 run before hook1. +registerHooks(hook1); +registerHooks(hook2); +``` + ### Communication with module customization hooks -Module customization hooks run on a dedicated thread, separate from the main +Asynchronous hooks run on a dedicated thread, separate from the main thread that runs application code. This means mutating global variables won't affect the other thread(s), and message channels must be used to communicate between the threads. @@ -693,8 +832,13 @@ register('./my-hooks.mjs', { }); ``` +Synchronous module hooks are run on the same thread where the application code is +run. They can directly mutate the globals of the context accessed by the main thread. + ### Hooks +#### Asynchronous hooks accepted by `module.register()` + The [`register`][] method can be used to register a module that exports a set of hooks. The hooks are functions that are called by Node.js to customize the module resolution and loading process. The exported functions must have specific @@ -714,6 +858,46 @@ export async function load(url, context, nextLoad) { } ``` +Asynchronous hooks are run in a separate thread, isolated from the main thread where +application code runs. That means it is a different [realm][]. The hooks thread +may be terminated by the main thread at any time, so do not depend on +asynchronous operations (like `console.log`) to complete. They are inherited into +child workers by default. + +#### Synchronous hooks accepted by `module.registerHooks()` + + + +> Stability: 1.1 - Active development + +The `module.registerHooks()` method accepts synchronous hook functions. +`initialize()` is not supported nor necessary, as the hook implementer +can simply run the initialization code directly before the call to +`module.registerHooks()`. + +```mjs +function resolve(specifier, context, nextResolve) { + // Take an `import` or `require` specifier and resolve it to a URL. +} + +function load(url, context, nextLoad) { + // Take a resolved URL and return the source code to be evaluated. +} +``` + +Synchronous hooks are run in the same thread and the same [realm][] where the modules +are loaded. Unlike the asynchronous hooks they are not inherited into child worker +threads by default, though if the hooks are registered using a file preloaded by +[`--import`][] or [`--require`][], child worker threads can inherit the preloaded scripts +via `process.execArgv` inheritance. See [the documentation of `Worker`][] for detail. + +In synchronous hooks, users can expect `console.log()` to complete in the same way that +they expect `console.log()` in module code to complete. + +#### Conventions of hooks + Hooks are part of a [chain][], even if that chain consists of only one custom (user-provided) hook and the default hook, which is always present. Hook functions nest: each one must always return a plain object, and chaining happens @@ -726,11 +910,6 @@ hook that returns without calling `next()` _and_ without returning prevent unintentional breaks in the chain. Return `shortCircuit: true` from a hook to signal that the chain is intentionally ending at your hook. -Hooks are run in a separate thread, isolated from the main thread where -application code runs. That means it is a different [realm][]. The hooks thread -may be terminated by the main thread at any time, so do not depend on -asynchronous operations (like `console.log`) to complete. - #### `initialize()` -> Stability: 1.2 - Release candidate +> Stability: 1.2 - Release candidate (asynchronous version) +> Stability: 1.1 - Active development (synchronous version) * `specifier` {string} * `context` {Object} @@ -848,7 +1035,9 @@ changes: Node.js default `resolve` hook after the last user-supplied `resolve` hook * `specifier` {string} * `context` {Object} -* Returns: {Object|Promise} +* Returns: {Object|Promise} The asynchronous version takes either an object containing the + following properties, or a `Promise` that will resolve to such an object. The + synchronous version only accepts an object returned synchronously. * `format` {string|null|undefined} A hint to the load hook (it might be ignored) `'builtin' | 'commonjs' | 'json' | 'module' | 'wasm'` @@ -858,8 +1047,9 @@ changes: terminate the chain of `resolve` hooks. **Default:** `false` * `url` {string} The absolute URL to which this input resolves -> **Warning** Despite support for returning promises and async functions, calls -> to `resolve` may block the main thread which can impact performance. +> **Warning** In the case of the asynchronous version, despite support for returning +> promises and async functions, calls to `resolve` may still block the main thread which +> can impact performance. The `resolve` hook chain is responsible for telling Node.js where to find and how to cache a given `import` statement or expression, or `require` call. It can @@ -874,8 +1064,8 @@ the internal module cache. The `resolve` hook is responsible for returning an `importAttributes` object if the module should be cached with different attributes than were present in the source code. -The `conditions` property in `context` is an array of conditions for -[package exports conditions][Conditional exports] that apply to this resolution +The `conditions` property in `context` is an array of conditions that will be used +to match [package exports conditions][Conditional exports] for this resolution request. They can be used for looking up conditional mappings elsewhere or to modify the list when calling the default resolution logic. @@ -885,7 +1075,11 @@ Node.js module specifier resolution behavior_ when calling `defaultResolve`, the `context.conditions` array passed to it _must_ include _all_ elements of the `context.conditions` array originally passed into the `resolve` hook. + + ```mjs +// Asynchronous version accepted by module.register(). export async function resolve(specifier, context, nextResolve) { const { parentURL = null } = context; @@ -915,10 +1109,21 @@ export async function resolve(specifier, context, nextResolve) { } ``` +```mjs +// Synchronous version accepted by module.registerHooks(). +function resolve(specifier, context, nextResolve) { + // Similar to the asynchronous resolve() above, since that one does not have + // any asynchronous logic. +} +``` + #### `load(url, context, nextLoad)` -> Stability: 1.2 - Release candidate +> Stability: 1.2 - Release candidate (asynchronous version) +> Stability: 1.1 - Active development (synchronous version) * `url` {string} The URL returned by the `resolve` chain * `context` {Object} @@ -943,7 +1149,9 @@ changes: Node.js default `load` hook after the last user-supplied `load` hook * `url` {string} * `context` {Object} -* Returns: {Object} +* Returns: {Object|Promise} The asynchronous version takes either an object containing the + following properties, or a `Promise` that will resolve to such an object. The + synchronous version only accepts an object returned synchronously. * `format` {string} * `shortCircuit` {undefined|boolean} A signal that this hook intends to terminate the chain of `load` hooks. **Default:** `false` @@ -955,18 +1163,22 @@ validating the import attributes. The final value of `format` must be one of the following: -| `format` | Description | Acceptable types for `source` returned by `load` | -| ------------ | ------------------------------ | -------------------------------------------------------------------------- | -| `'builtin'` | Load a Node.js builtin module | Not applicable | -| `'commonjs'` | Load a Node.js CommonJS module | { [`string`][], [`ArrayBuffer`][], [`TypedArray`][], `null`, `undefined` } | -| `'json'` | Load a JSON file | { [`string`][], [`ArrayBuffer`][], [`TypedArray`][] } | -| `'module'` | Load an ES module | { [`string`][], [`ArrayBuffer`][], [`TypedArray`][] } | -| `'wasm'` | Load a WebAssembly module | { [`ArrayBuffer`][], [`TypedArray`][] } | +| `format` | Description | Acceptable types for `source` returned by `load` | +| ------------ | ------------------------------ | -------------------------------------------------- | +| `'addon'` | Load a Node.js addon | {null} | +| `'builtin'` | Load a Node.js builtin module | {null} | +| `'commonjs'` | Load a Node.js CommonJS module | {string\|ArrayBuffer\|TypedArray\|null\|undefined} | +| `'json'` | Load a JSON file | {string\|ArrayBuffer\|TypedArray} | +| `'module'` | Load an ES module | {string\|ArrayBuffer\|TypedArray} | +| `'wasm'` | Load a WebAssembly module | {ArrayBuffer\|TypedArray} | The value of `source` is ignored for type `'builtin'` because currently it is not possible to replace the value of a Node.js builtin (core) module. -Omitting vs providing a `source` for `'commonjs'` has very different effects: +##### Caveat in the asynchronous `load` hook + +When using the asynchronous `load` hook, omitting vs providing a `source` for +`'commonjs'` has very different effects: * When a `source` is provided, all `require` calls from this module will be processed by the ESM loader with registered `resolve` and `load` hooks; all @@ -980,8 +1192,12 @@ Omitting vs providing a `source` for `'commonjs'` has very different effects: registered hooks. This behavior for nullish `source` is temporary — in the future, nullish `source` will not be supported. -When `node` is run with `--experimental-default-type=commonjs`, the Node.js -internal `load` implementation, which is the value of `next` for the +These caveats do not apply to the synchronous `load` hook, in which case +the complete set of CommonJS APIs available to the customized CommonJS +modules, and `require`/`require.resolve` always go through the registered +hooks. + +The Node.js internal asynchronous `load` implementation, which is the value of `next` for the last hook in the `load` chain, returns `null` for `source` when `format` is `'commonjs'` for backward compatibility. Here is an example hook that would opt-in to using the non-default behavior: @@ -989,6 +1205,8 @@ opt-in to using the non-default behavior: ```mjs import { readFile } from 'node:fs/promises'; +// Asynchronous version accepted by module.register(). This fix is not needed +// for the synchronous version accepted by module.registerSync(). export async function load(url, context, nextLoad) { const result = await nextLoad(url, context); if (result.format === 'commonjs') { @@ -998,14 +1216,19 @@ export async function load(url, context, nextLoad) { } ``` -> **Warning**: The ESM `load` hook and namespaced exports from CommonJS modules -> are incompatible. Attempting to use them together will result in an empty -> object from the import. This may be addressed in the future. +This doesn't apply to the synchronous `load` hook either, in which case the +`source` returned contains source code loaded by the next hook, regardless +of module format. + +> **Warning**: The asynchronous `load` hook and namespaced exports from CommonJS +> modules are incompatible. Attempting to use them together will result in an empty +> object from the import. This may be addressed in the future. This does not apply +> to the synchronous `load` hook, in which case exports can be used as usual. > These types all correspond to classes defined in ECMAScript. -* The specific [`ArrayBuffer`][] object is a [`SharedArrayBuffer`][]. -* The specific [`TypedArray`][] object is a [`Uint8Array`][]. +* The specific {ArrayBuffer} object is a {SharedArrayBuffer}. +* The specific {TypedArray} object is a {Uint8Array}. If the source value of a text-based format (i.e., `'json'`, `'module'`) is not a string, it is converted to a string using [`util.TextDecoder`][]. @@ -1016,6 +1239,7 @@ reading files from disk. It could also be used to map an unrecognized format to a supported one, for example `yaml` to `module`. ```mjs +// Asynchronous version accepted by module.register(). export async function load(url, context, nextLoad) { const { format } = context; @@ -1039,6 +1263,14 @@ export async function load(url, context, nextLoad) { } ``` +```mjs +// Synchronous version accepted by module.registerHooks(). +function load(url, context, nextLoad) { + // Similar to the asynchronous load() above, since that one does not have + // any asynchronous logic. +} +``` + In a more advanced scenario, this can also be used to transform an unsupported source to a supported one (see [Examples](#examples) below). @@ -1097,6 +1329,10 @@ With the preceding hooks module, running prints the current version of CoffeeScript per the module at the URL in `main.mjs`. + + #### Transpilation Sources that are in formats Node.js doesn't understand can be converted into @@ -1105,6 +1341,8 @@ JavaScript using the [`load` hook][load hook]. This is less performant than transpiling source files before running Node.js; transpiler hooks should only be used for development and testing purposes. +##### Asynchronous version + ```mjs // coffeescript-hooks.mjs import { readFile } from 'node:fs/promises'; @@ -1170,6 +1408,57 @@ async function getPackageType(url) { } ``` +##### Synchronous version + +```mjs +// coffeescript-sync-hooks.mjs +import { readFileSync } from 'node:fs/promises'; +import { registerHooks } from 'node:module'; +import { dirname, extname, resolve as resolvePath } from 'node:path'; +import { cwd } from 'node:process'; +import { fileURLToPath, pathToFileURL } from 'node:url'; +import coffeescript from 'coffeescript'; + +const extensionsRegex = /\.(coffee|litcoffee|coffee\.md)$/; + +function load(url, context, nextLoad) { + if (extensionsRegex.test(url)) { + const format = getPackageType(url); + + const { source: rawSource } = nextLoad(url, { ...context, format }); + const transformedSource = coffeescript.compile(rawSource.toString(), url); + + return { + format, + shortCircuit: true, + source: transformedSource, + }; + } + + return nextLoad(url); +} + +function getPackageType(url) { + const isFilePath = !!extname(url); + const dir = isFilePath ? dirname(fileURLToPath(url)) : url; + const packagePath = resolvePath(dir, 'package.json'); + + let type; + try { + const filestring = readFileSync(packagePath, { encoding: 'utf8' }); + type = JSON.parse(filestring).type; + } catch (err) { + if (err?.code !== 'ENOENT') console.error(err); + } + if (type) return type; + return dir.length > 1 && getPackageType(resolvePath(dir, '..')); +} + +registerHooks({ load }); +``` + +#### Running hooks + ```coffee # main.coffee import { scream } from './scream.coffee' @@ -1184,8 +1473,9 @@ console.log "Brought to you by Node.js version #{version}" export scream = (str) -> str.toUpperCase() ``` -With the preceding hooks module, running +With the preceding hooks modules, running `node --import 'data:text/javascript,import { register } from "node:module"; import { pathToFileURL } from "node:url"; register(pathToFileURL("./coffeescript-hooks.mjs"));' ./main.coffee` +or `node --import ./coffeescript-sync-hooks.mjs ./main.coffee` causes `main.coffee` to be turned into JavaScript after its source code is loaded from disk but before Node.js executes it; and so on for any `.coffee`, `.litcoffee` or `.coffee.md` files referenced via `import` statements of any @@ -1198,6 +1488,8 @@ The previous two examples defined `load` hooks. This is an example of a which specifiers to override to other URLs (this is a very simplistic implementation of a small subset of the "import maps" specification). +##### Asynchronous version + ```mjs // import-map-hooks.js import fs from 'node:fs/promises'; @@ -1213,6 +1505,28 @@ export async function resolve(specifier, context, nextResolve) { } ``` +##### Synchronous version + +```mjs +// import-map-sync-hooks.js +import fs from 'node:fs/promises'; +import module from 'node:module'; + +const { imports } = JSON.parse(fs.readFileSync('import-map.json', 'utf-8')); + +function resolve(specifier, context, nextResolve) { + if (Object.hasOwn(imports, specifier)) { + return nextResolve(imports[specifier], context); + } + + return nextResolve(specifier, context); +} + +module.registerHooks({ resolve }); +``` + +##### Using the hooks + With these files: ```mjs @@ -1235,6 +1549,7 @@ console.log('some module!'); ``` Running `node --import 'data:text/javascript,import { register } from "node:module"; import { pathToFileURL } from "node:url"; register(pathToFileURL("./import-map-hooks.js"));' main.js` +or `node --import ./import-map-sync-hooks.js main.js` should print `some module!`. ## Source map v3 support @@ -1286,22 +1601,6 @@ added: `path` is the resolved path for the file for which a corresponding source map should be fetched. -### `module.flushCompileCache()` - - - -> Stability: 1.1 - Active Development - -Flush the [module compile cache][] accumulated from modules already loaded -in the current Node.js instance to disk. This returns after all the flushing -file system operations come to an end, no matter they succeed or not. If there -are any errors, this will fail silently, since compile cache misses should not -interfere with the actual operation of the application. - ### Class: `module.SourceMap` @@ -315,9 +324,8 @@ help users fix them. Support for loading ES modules using `require()` is currently experimental and can be disabled using `--no-experimental-require-module`. -When `require()` actually encounters an ES module for the -first time in the process, it will emit an experimental warning. The -warning is expected to be removed when this feature stablizes. +To print where this feature is used, use [`--trace-require-module`][]. + This feature can be detected by checking if [`process.features.require_module`][] is `true`. @@ -509,7 +517,7 @@ Some built-in modules are always preferentially loaded if their identifier is passed to `require()`. For instance, `require('http')` will always return the built-in HTTP module, even if there is a file by that name. The list of built-in modules that can be loaded without using the `node:` prefix is exposed -as [`module.builtinModules`][]. +in [`module.builtinModules`][], listed without the prefix. ### Built-in modules with mandatory `node:` prefix @@ -523,6 +531,8 @@ taken the name. Currently the built-in modules that requires the `node:` prefix * [`node:test`][] * [`node:test/reporters`][] +The list of these modules is exposed in [`module.builtinModules`][], including the prefix. + ## Cycles @@ -890,7 +900,7 @@ built-in modules and if a name matching a built-in module is added to the cache, only `node:`-prefixed require calls are going to receive the built-in module. Use with care! - + ```js const assert = require('node:assert'); @@ -1267,6 +1277,7 @@ This section was moved to [GLOBAL_FOLDERS]: #loading-from-the-global-folders [`"main"`]: packages.md#main [`"type"`]: packages.md#type +[`--trace-require-module`]: cli.md#--trace-require-modulemode [`ERR_REQUIRE_ASYNC_MODULE`]: errors.md#err_require_async_module [`ERR_UNSUPPORTED_DIR_IMPORT`]: errors.md#err_unsupported_dir_import [`MODULE_NOT_FOUND`]: errors.md#module_not_found diff --git a/doc/api/n-api.md b/doc/api/n-api.md index 7d5b2926e51b1f..3ba991dc11789d 100644 --- a/doc/api/n-api.md +++ b/doc/api/n-api.md @@ -1748,7 +1748,7 @@ will not be freed. This can be avoided by calling **Change History:** -* Experimental (`NAPI_EXPERIMENTAL` is defined): +* Version 10 (`NAPI_VERSION` is defined as `10` or higher): References can be created for all value types. The new supported value types do not support weak reference semantic and the values of these types @@ -2699,11 +2699,12 @@ JavaScript `TypedArray` objects are described in #### `node_api_create_buffer_from_arraybuffer` -> Stability: 1 - Experimental - ```c napi_status NAPI_CDECL node_api_create_buffer_from_arraybuffer(napi_env env, napi_value arraybuffer, @@ -2965,10 +2966,9 @@ The JavaScript `string` type is described in added: - v20.4.0 - v18.18.0 +napiVersion: 10 --> -> Stability: 1 - Experimental - ```c napi_status node_api_create_external_string_latin1(napi_env env, @@ -3045,10 +3045,9 @@ The JavaScript `string` type is described in added: - v20.4.0 - v18.18.0 +napiVersion: 10 --> -> Stability: 1 - Experimental - ```c napi_status node_api_create_external_string_utf16(napi_env env, @@ -3140,10 +3139,9 @@ creation methods. added: - v22.9.0 - v20.18.0 +napiVersion: 10 --> -> Stability: 1 - Experimental - ```c napi_status NAPI_CDECL node_api_create_property_key_latin1(napi_env env, const char* str, @@ -3175,10 +3173,9 @@ The JavaScript `string` type is described in added: - v21.7.0 - v20.12.0 +napiVersion: 10 --> -> Stability: 1 - Experimental - ```c napi_status NAPI_CDECL node_api_create_property_key_utf16(napi_env env, const char16_t* str, @@ -3208,10 +3205,9 @@ The JavaScript `string` type is described in added: - v22.9.0 - v20.18.0 +napiVersion: 10 --> -> Stability: 1 - Experimental - ```c napi_status NAPI_CDECL node_api_create_property_key_utf8(napi_env env, const char* str, @@ -6531,7 +6527,7 @@ napi_create_threadsafe_function(napi_env env, **Change History:** -* Experimental (`NAPI_EXPERIMENTAL` is defined): +* Version 10 (`NAPI_VERSION` is defined as `10` or higher): Uncaught exceptions thrown in `call_js_cb` are handled with the [`'uncaughtException'`][] event, instead of being ignored. diff --git a/doc/api/net.md b/doc/api/net.md index 7d8a27bf0b1769..6b3b0670bbc61d 100644 --- a/doc/api/net.md +++ b/doc/api/net.md @@ -170,6 +170,15 @@ added: The list of rules added to the blocklist. +### `BlockList.isBlockList(value)` + + + +* `value` {any} Any JS value +* Returns `true` if the `value` is a `net.BlockList`. + ## Class: `net.SocketAddress` + +* `input` {string} An input string containing an IP address and optional port, + e.g. `123.1.2.3:1234` or `[1::1]:1234`. +* Returns: {net.SocketAddress} Returns a `SocketAddress` if parsing was successful. + Otherwise returns `undefined`. + ## Class: `net.Server` * {boolean} @@ -1069,6 +1093,8 @@ For TCP connections, available `options` are: * `noDelay` {boolean} If set to `true`, it disables the use of Nagle's algorithm immediately after the socket is established. **Default:** `false`. * `port` {number} Required. Port the socket should connect to. +* `blockList` {net.BlockList} `blockList` can be used for disabling outbound + access to specific IP addresses, IP ranges, or IP subnets. For [IPC][] connections, available `options` are: @@ -1713,6 +1739,11 @@ changes: **Default:** `false`. * `pauseOnConnect` {boolean} Indicates whether the socket should be paused on incoming connections. **Default:** `false`. + * `blockList` {net.BlockList} `blockList` can be used for disabling inbound + access to specific IP addresses, IP ranges, or IP subnets. This does not + work if the server is behind a reverse proxy, NAT, etc. because the address + checked against the block list is the address of the proxy, or the one + specified by the NAT. * `connectionListener` {Function} Automatically set as a listener for the [`'connection'`][] event. diff --git a/doc/api/packages.md b/doc/api/packages.md index 72494bf90d4b40..ab18fe4e1fd34b 100644 --- a/doc/api/packages.md +++ b/doc/api/packages.md @@ -73,10 +73,9 @@ expressions: `import` or `export` statements or `import.meta`, with no explicit marker of how it should be interpreted. Explicit markers are `.mjs` or `.cjs` extensions, `package.json` `"type"` fields with either `"module"` or - `"commonjs"` values, or `--input-type` or `--experimental-default-type` flags. - Dynamic `import()` expressions are supported in either CommonJS or ES modules - and would not force a file to be treated as an ES module. See - [Syntax detection][]. + `"commonjs"` values, or the `--input-type` flag. Dynamic `import()` + expressions are supported in either CommonJS or ES modules and would not force + a file to be treated as an ES module. See [Syntax detection][]. Node.js will treat the following as [CommonJS][] when passed to `node` as the initial input, or when referenced by `import` statements or `import()` @@ -90,30 +89,21 @@ expressions: * Strings passed in as an argument to `--eval` or `--print`, or piped to `node` via `STDIN`, with the flag `--input-type=commonjs`. -Aside from these explicit cases, there are other cases where Node.js defaults to -one module system or the other based on the value of the -[`--experimental-default-type`][] flag: - -* Files ending in `.js` or with no extension, if there is no `package.json` file - present in the same folder or any parent folder. - -* Files ending in `.js` or with no extension, if the nearest parent - `package.json` field lacks a `"type"` field; unless the folder is inside a - `node_modules` folder. (Package scopes under `node_modules` are always treated - as CommonJS when the `package.json` file lacks a `"type"` field, regardless - of `--experimental-default-type`, for backward compatibility.) - -* Strings passed in as an argument to `--eval` or piped to `node` via `STDIN`, - when `--input-type` is unspecified. - -This flag currently defaults to `"commonjs"`, but it may change in the future to -default to `"module"`. For this reason it is best to be explicit wherever -possible; in particular, package authors should always include the [`"type"`][] -field in their `package.json` files, even in packages where all sources are -CommonJS. Being explicit about the `type` of the package will future-proof the -package in case the default type of Node.js ever changes, and it will also make -things easier for build tools and loaders to determine how the files in the -package should be interpreted. +* Files with a `.js` extension with no parent `package.json` file or where the + nearest parent `package.json` file lacks a `type` field, and where the code + can evaluate successfully as CommonJS. In other words, Node.js tries to run + such "ambiguous" files as CommonJS first, and will retry evaluating them as ES + modules if the evaluation as CommonJS fails because the parser found ES module + syntax. + +Writing ES module syntax in "ambiguous" files incurs a performance cost, and +therefore it is encouraged that authors be explicit wherever possible. In +particular, package authors should always include the [`"type"`][] field in +their `package.json` files, even in packages where all sources are CommonJS. +Being explicit about the `type` of the package will future-proof the package in +case the default type of Node.js ever changes, and it will also make things +easier for build tools and loaders to determine how the files in the package +should be interpreted. ### Syntax detection @@ -137,10 +127,8 @@ as an ES module. Ambiguous input is defined as: * Files with a `.js` extension or no extension; and either no controlling - `package.json` file or one that lacks a `type` field; and - `--experimental-default-type` is not specified. -* String input (`--eval` or STDIN) when neither `--input-type` nor - `--experimental-default-type` are specified. + `package.json` file or one that lacks a `type` field. +* String input (`--eval` or `STDIN`) when `--input-type`is not specified. ES module syntax is defined as syntax that would throw when evaluated as CommonJS. This includes the following: @@ -1162,7 +1150,6 @@ This field defines [subpath imports][] for the current package. [`"packageManager"`]: #packagemanager [`"type"`]: #type [`--conditions` / `-C` flag]: #resolving-user-conditions -[`--experimental-default-type`]: cli.md#--experimental-default-typetype [`--no-addons` flag]: cli.md#--no-addons [`ERR_PACKAGE_PATH_NOT_EXPORTED`]: errors.md#err_package_path_not_exported [`package.json`]: #nodejs-packagejson-field-definitions diff --git a/doc/api/perf_hooks.md b/doc/api/perf_hooks.md index 7c3144939244b6..58f4114b39a3de 100644 --- a/doc/api/perf_hooks.md +++ b/doc/api/perf_hooks.md @@ -17,7 +17,26 @@ Node.js supports the following [Web Performance APIs][]: * [User Timing][] * [Resource Timing][] -```js +```mjs +import { performance, PerformanceObserver } from 'node:perf_hooks'; + +const obs = new PerformanceObserver((items) => { + console.log(items.getEntries()[0].duration); + performance.clearMarks(); +}); +obs.observe({ type: 'measure' }); +performance.measure('Start to Now'); + +performance.mark('A'); +doSomeLongRunningProcess(() => { + performance.measure('A to Now', 'A'); + + performance.mark('B'); + performance.measure('A to B', 'A', 'B'); +}); +``` + +```cjs const { PerformanceObserver, performance } = require('node:perf_hooks'); const obs = new PerformanceObserver((items) => { @@ -28,7 +47,7 @@ performance.measure('Start to Now'); performance.mark('A'); (async function doSomeLongRunningProcess() { - await new Promise(r => setTimeout(r, 5000)); + await new Promise((r) => setTimeout(r, 5000)); performance.measure('A to Now', 'A'); performance.mark('B'); @@ -138,7 +157,18 @@ loop has spent outside the event loop's event provider (e.g. `epoll_wait`). No other CPU idle time is taken into consideration. The following is an example of how a mostly idle process will have a high ELU. -```js +```mjs +import { eventLoopUtilization } from 'node:perf_hooks'; +import { spawnSync } from 'node:child_process'; + +setImmediate(() => { + const elu = eventLoopUtilization(); + spawnSync('sleep', ['5']); + console.log(eventLoopUtilization(elu).utilization); +}); +``` + +```cjs 'use strict'; const { eventLoopUtilization } = require('node:perf_hooks').performance; const { spawnSync } = require('node:child_process'); @@ -415,7 +445,29 @@ Wraps a function within a new function that measures the running time of the wrapped function. A `PerformanceObserver` must be subscribed to the `'function'` event type in order for the timing details to be accessed. -```js +```mjs +import { performance, PerformanceObserver } from 'node:perf_hooks'; + +function someFunction() { + console.log('hello world'); +} + +const wrapped = performance.timerify(someFunction); + +const obs = new PerformanceObserver((list) => { + console.log(list.getEntries()[0].duration); + + performance.clearMarks(); + performance.clearMeasures(); + obs.disconnect(); +}); +obs.observe({ entryTypes: ['function'] }); + +// A performance timeline entry will be created +wrapped(); +``` + +```cjs const { performance, PerformanceObserver, @@ -1258,7 +1310,22 @@ changes: `PerformanceObserver` objects provide notifications when new `PerformanceEntry` instances have been added to the Performance Timeline. -```js +```mjs +import { performance, PerformanceObserver } from 'node:perf_hooks'; + +const obs = new PerformanceObserver((list, observer) => { + console.log(list.getEntries()); + + performance.clearMarks(); + performance.clearMeasures(); + observer.disconnect(); +}); +obs.observe({ entryTypes: ['mark'], buffered: true }); + +performance.mark('test'); +``` + +```cjs const { performance, PerformanceObserver, @@ -1324,7 +1391,19 @@ Subscribes the {PerformanceObserver} instance to notifications of new {PerformanceEntry} instances identified either by `options.entryTypes` or `options.type`: -```js +```mjs +import { performance, PerformanceObserver } from 'node:perf_hooks'; + +const obs = new PerformanceObserver((list, observer) => { + // Called once asynchronously. `list` contains three items. +}); +obs.observe({ type: 'mark' }); + +for (let n = 0; n < 3; n++) + performance.mark(`test${n}`); +``` + +```cjs const { performance, PerformanceObserver, @@ -1339,6 +1418,14 @@ for (let n = 0; n < 3; n++) performance.mark(`test${n}`); ``` +### `performanceObserver.takeRecords()` + + + +* Returns: {PerformanceEntry\[]} Current list of entries stored in the performance observer, emptying it out. + ## Class: `PerformanceObserverEntryList` -```js +```mjs +import { performance, PerformanceObserver } from 'node:perf_hooks'; + +// Activate the observer +const obs = new PerformanceObserver((list) => { + const entries = list.getEntries(); + entries.forEach((entry) => { + console.log(`import('${entry[0]}')`, entry.duration); + }); + performance.clearMarks(); + performance.clearMeasures(); + obs.disconnect(); +}); +obs.observe({ entryTypes: ['function'], buffered: true }); + +const timedImport = performance.timerify(async (module) => { + return await import(module); +}); + +await timedImport('some-module'); +``` + +```cjs 'use strict'; const { performance, @@ -1898,7 +2167,28 @@ it means the time interval between starting the request and receiving the response, and for HTTP request, it means the time interval between receiving the request and sending the response: -```js +```mjs +import { PerformanceObserver } from 'node:perf_hooks'; +import { createServer, get } from 'node:http'; + +const obs = new PerformanceObserver((items) => { + items.getEntries().forEach((item) => { + console.log(item); + }); +}); + +obs.observe({ entryTypes: ['http'] }); + +const PORT = 8080; + +createServer((req, res) => { + res.end('ok'); +}).listen(PORT, () => { + get(`http://127.0.0.1:${PORT}`); +}); +``` + +```cjs 'use strict'; const { PerformanceObserver } = require('node:perf_hooks'); const http = require('node:http'); @@ -1922,7 +2212,25 @@ http.createServer((req, res) => { ### Measuring how long the `net.connect` (only for TCP) takes when the connection is successful -```js +```mjs +import { PerformanceObserver } from 'node:perf_hooks'; +import { connect, createServer } from 'node:net'; + +const obs = new PerformanceObserver((items) => { + items.getEntries().forEach((item) => { + console.log(item); + }); +}); +obs.observe({ entryTypes: ['net'] }); +const PORT = 8080; +createServer((socket) => { + socket.destroy(); +}).listen(PORT, () => { + connect(PORT); +}); +``` + +```cjs 'use strict'; const { PerformanceObserver } = require('node:perf_hooks'); const net = require('node:net'); @@ -1942,7 +2250,21 @@ net.createServer((socket) => { ### Measuring how long the DNS takes when the request is successful -```js +```mjs +import { PerformanceObserver } from 'node:perf_hooks'; +import { lookup, promises } from 'node:dns'; + +const obs = new PerformanceObserver((items) => { + items.getEntries().forEach((item) => { + console.log(item); + }); +}); +obs.observe({ entryTypes: ['dns'] }); +lookup('localhost', () => {}); +promises.resolve('localhost'); +``` + +```cjs 'use strict'; const { PerformanceObserver } = require('node:perf_hooks'); const dns = require('node:dns'); diff --git a/doc/api/permissions.md b/doc/api/permissions.md index a03285e28641e8..ea3ccc17b306b7 100644 --- a/doc/api/permissions.md +++ b/doc/api/permissions.md @@ -28,25 +28,25 @@ If you find a potential security vulnerability, please refer to our -> Stability: 1.1 - Active development +> Stability: 2 - Stable. The Node.js Permission Model is a mechanism for restricting access to specific resources during execution. -The API exists behind a flag [`--experimental-permission`][] which when enabled, +The API exists behind a flag [`--permission`][] which when enabled, will restrict access to all available permissions. -The available permissions are documented by the [`--experimental-permission`][] +The available permissions are documented by the [`--permission`][] flag. -When starting Node.js with `--experimental-permission`, +When starting Node.js with `--permission`, the ability to access the file system through the `fs` module, spawn processes, use `node:worker_threads`, use native addons, use WASI, and enable the runtime inspector will be restricted. ```console -$ node --experimental-permission index.js +$ node --permission index.js Error: Access to this API has been restricted at node:internal/main/run_main_module:23:47 { @@ -64,7 +64,7 @@ flag. For WASI, use the [`--allow-wasi`][] flag. #### Runtime API -When enabling the Permission Model through the [`--experimental-permission`][] +When enabling the Permission Model through the [`--permission`][] flag a new property `permission` is added to the `process` object. This property contains one function: @@ -90,10 +90,8 @@ To allow access to the file system, use the [`--allow-fs-read`][] and [`--allow-fs-write`][] flags: ```console -$ node --experimental-permission --allow-fs-read=* --allow-fs-write=* index.js +$ node --permission --allow-fs-read=* --allow-fs-write=* index.js Hello world! -(node:19836) ExperimentalWarning: Permission is an experimental feature -(Use `node --trace-warnings ...` to show where the warning was created) ``` The valid arguments for both flags are: @@ -147,6 +145,8 @@ There are constraints you need to know before using this system: flags that can be set via runtime through `v8.setFlagsFromString`. * OpenSSL engines cannot be requested at runtime when the Permission Model is enabled, affecting the built-in crypto, https, and tls modules. +* Run-Time Loadable Extensions cannot be loaded when the Permission Model is + enabled, affecting the sqlite module. * Using existing file descriptors via the `node:fs` module bypasses the Permission Model. @@ -165,5 +165,5 @@ There are constraints you need to know before using this system: [`--allow-fs-write`]: cli.md#--allow-fs-write [`--allow-wasi`]: cli.md#--allow-wasi [`--allow-worker`]: cli.md#--allow-worker -[`--experimental-permission`]: cli.md#--experimental-permission +[`--permission`]: cli.md#--permission [`permission.has()`]: process.md#processpermissionhasscope-reference diff --git a/doc/api/process.md b/doc/api/process.md index 0c18151107f04a..a962ce594f2d36 100644 --- a/doc/api/process.md +++ b/doc/api/process.md @@ -1930,12 +1930,18 @@ A boolean value that is `true` if the current Node.js build includes the inspect +> Stability: 0 - Deprecated. This property is always true, and any checks based on it are +> redundant. + * {boolean} A boolean value that is `true` if the current Node.js build includes support for IPv6. +Since all Node.js builds have IPv6 support, this value is always `true`. + ## `process.features.require_module` +> Stability: 0 - Deprecated. Use `process.features.tls` instead. + * {boolean} A boolean value that is `true` if the current Node.js build includes support for ALPN in TLS. +In Node.js 11.0.0 and later versions, the OpenSSL dependencies feature unconditional ALPN support. +This value is therefore identical to that of `process.features.tls`. + ## `process.features.tls_ocsp` +> Stability: 0 - Deprecated. Use `process.features.tls` instead. + * {boolean} A boolean value that is `true` if the current Node.js build includes support for OCSP in TLS. +In Node.js 11.0.0 and later versions, the OpenSSL dependencies feature unconditional OCSP support. +This value is therefore identical to that of `process.features.tls`. + ## `process.features.tls_sni` +> Stability: 0 - Deprecated. Use `process.features.tls` instead. + * {boolean} A boolean value that is `true` if the current Node.js build includes support for SNI in TLS. +In Node.js 11.0.0 and later versions, the OpenSSL dependencies feature unconditional SNI support. +This value is therefore identical to that of `process.features.tls`. + ## `process.features.typescript` +> Stability: 0 - Deprecated. This property is always true, and any checks based on it are +> redundant. + * {boolean} A boolean value that is `true` if the current Node.js build includes support for libuv. -Since it's currently not possible to build Node.js without libuv, this value is always `true`. + +Since it's not possible to build Node.js without libuv, this value is always `true`. ## `process.finalization.register(ref, callback)` @@ -2111,10 +2141,10 @@ class Test { constructor() { finalization.register(this, (ref) => ref.dispose()); - // even something like this is highly discouraged + // Even something like this is highly discouraged // finalization.register(this, () => this.dispose()); - } - dispose() {} + } + dispose() {} } ``` @@ -3078,7 +3108,7 @@ added: v20.0.0 * {Object} -This API is available through the [`--experimental-permission`][] flag. +This API is available through the [`--permission`][] flag. `process.permission` is an object whose methods are used to manage permissions for the current process. Additional documentation is available in the @@ -3202,6 +3232,23 @@ const { ppid } = require('node:process'); console.log(`The parent process is pid ${ppid}`); ``` +## `process.ref(maybeRefable)` + + + +* `maybeRefable` {any} An object that may be "refable". + +An object is "refable" if it implements the Node.js "Refable protocol". +Specifically, this means that the object implements the `Symbol.for('node:ref')` +and `Symbol.for('node:unref')` methods. "Ref'd" objects will keep the Node.js +event loop alive, while "unref'd" objects will not. Historically, this was +implemented by using `ref()` and `unref()` methods directly on the objects. +This pattern, however, is being deprecated in favor of the "Refable protocol" +in order to better support Web Platform API types whose APIs cannot be modified +to add `ref()` and `unref()` methods but still need to support that behavior. + ## `process.release` * {boolean} @@ -4242,6 +4289,23 @@ console.log( In [`Worker`][] threads, `process.umask(mask)` will throw an exception. +## `process.unref(maybeRefable)` + + + +* `maybeUnfefable` {any} An object that may be "unref'd". + +An object is "unrefable" if it implements the Node.js "Refable protocol". +Specifically, this means that the object implements the `Symbol.for('node:ref')` +and `Symbol.for('node:unref')` methods. "Ref'd" objects will keep the Node.js +event loop alive, while "unref'd" objects will not. Historically, this was +implemented by using `ref()` and `unref()` methods directly on the objects. +This pattern, however, is being deprecated in favor of the "Refable protocol" +in order to better support Web Platform API types whose APIs cannot be modified +to add `ref()` and `unref()` methods but still need to support that behavior. + ## `process.uptime()` + +Replace the keys `data_seg_size_kbytes`, `max_memory_size_kbytes`, and `virtual_memory_kbytes` +with `data_seg_size_bytes`, `max_memory_size_bytes`, and `virtual_memory_bytes` +respectively in the `userLimits` section, as these values are given in bytes. + +```json +{ + "userLimits": { + // Skip some keys ... + "data_seg_size_bytes": { // replacing data_seg_size_kbytes + "soft": "unlimited", + "hard": "unlimited" + }, + // ... + "max_memory_size_bytes": { // replacing max_memory_size_kbytes + "soft": "unlimited", + "hard": "unlimited" + }, + // ... + "virtual_memory_bytes": { // replacing virtual_memory_kbytes + "soft": "unlimited", + "hard": "unlimited" + } + } +} +``` + +#### Version 4 + + + +New fields `ipv4` and `ipv6` are added to `tcp` and `udp` libuv handles endpoints. Examples: + +```json +{ + "libuv": [ + { + "type": "tcp", + "is_active": true, + "is_referenced": true, + "address": "0x000055e70fcb85d8", + "localEndpoint": { + "host": "localhost", + "ip4": "127.0.0.1", // new key + "port": 48986 + }, + "remoteEndpoint": { + "host": "localhost", + "ip4": "127.0.0.1", // new key + "port": 38573 + }, + "sendBufferSize": 2626560, + "recvBufferSize": 131072, + "fd": 24, + "writeQueueSize": 0, + "readable": true, + "writable": true + }, + { + "type": "tcp", + "is_active": true, + "is_referenced": true, + "address": "0x000055e70fcd68c8", + "localEndpoint": { + "host": "ip6-localhost", + "ip6": "::1", // new key + "port": 52266 + }, + "remoteEndpoint": { + "host": "ip6-localhost", + "ip6": "::1", // new key + "port": 38573 + }, + "sendBufferSize": 2626560, + "recvBufferSize": 131072, + "fd": 25, + "writeQueueSize": 0, + "readable": false, + "writable": false + } + ] +} +``` + +#### Version 3 + + + +The following memory usage keys are added to the `resourceUsage` section. + +```json +{ + "resourceUsage": { + "rss": "35766272", + "free_memory": "1598337024", + "total_memory": "17179869184", + "available_memory": "1598337024", + "constrained_memory": "36624662528" + } +} +``` + +#### Version 2 + + + +Added [`Worker`][] support. Refer to [Interaction with workers](#interaction-with-workers) section for more details. + +#### Version 1 + +This is the first version of the diagnostic report. + ## Configuration Additional runtime configuration of report generation is available via diff --git a/doc/api/single-executable-applications.md b/doc/api/single-executable-applications.md index be86536291ba7d..30ebd0fc38aaa6 100644 --- a/doc/api/single-executable-applications.md +++ b/doc/api/single-executable-applications.md @@ -352,7 +352,7 @@ writes to the returned array buffer is likely to result in a crash. * `key` {string} the key for the asset in the dictionary specified by the `assets` field in the single-executable application configuration. -* Returns: {string|ArrayBuffer} +* Returns: {ArrayBuffer} ### `require(id)` in the injected main script is not file based diff --git a/doc/api/sqlite.md b/doc/api/sqlite.md index ac12a5b2582ed7..35d437557e268d 100644 --- a/doc/api/sqlite.md +++ b/doc/api/sqlite.md @@ -6,8 +6,7 @@ added: v22.5.0 --> -> Stability: 1.1 - Active development. Enable this API with the -> [`--experimental-sqlite`][] CLI flag. +> Stability: 1.1 - Active development. @@ -109,6 +108,10 @@ added: v22.5.0 [double-quoted string literals][]. This is not recommended but can be enabled for compatibility with legacy database schemas. **Default:** `false`. + * `allowExtension` {boolean} If `true`, the `loadExtension` SQL function + and the `loadExtension()` method are enabled. + You can call `enableLoadExtension(false)` later to disable this feature. + **Default:** `false`. Constructs a new `DatabaseSync` instance. @@ -121,6 +124,30 @@ added: v22.5.0 Closes the database connection. An exception is thrown if the database is not open. This method is a wrapper around [`sqlite3_close_v2()`][]. +### `database.loadExtension(path)` + + + +* `path` {string} The path to the shared library to load. + +Loads a shared library into the database connection. This method is a wrapper +around [`sqlite3_load_extension()`][]. It is required to enable the +`allowExtension` option when constructing the `DatabaseSync` instance. + +### `database.enableLoadExtension(allow)` + + + +* `allow` {boolean} Whether to allow loading extensions. + +Enables or disables the `loadExtension` SQL function, and the `loadExtension()` +method. When `allowExtension` is `false` when constructing, you cannot enable +loading extensions for security reasons. + ### `database.exec(sql)` + +* `name` {string} The name of the SQLite function to create. +* `options` {Object} Optional configuration settings for the function. The + following properties are supported: + * `deterministic` {boolean} If `true`, the [`SQLITE_DETERMINISTIC`][] flag is + set on the created function. **Default:** `false`. + * `directOnly` {boolean} If `true`, the [`SQLITE_DIRECTONLY`][] flag is set on + the created function. **Default:** `false`. + * `useBigIntArguments` {boolean} If `true`, integer arguments to `function` + are converted to `BigInt`s. If `false`, integer arguments are passed as + JavaScript numbers. **Default:** `false`. + * `varargs` {boolean} If `true`, `function` can accept a variable number of + arguments. If `false`, `function` must be invoked with exactly + `function.length` arguments. **Default:** `false`. +* `function` {Function} The JavaScript function to call when the SQLite + function is invoked. + +This method is used to create SQLite user-defined functions. This method is a +wrapper around [`sqlite3_create_function_v2()`][]. + ### `database.open()` + * `options` {Object} The configuration options for the session. * `table` {string} A specific table to track changes for. By default, changes to all tables are tracked. * `db` {string} Name of the database to track. This is useful when multiple databases have been added using [`ATTACH DATABASE`][]. **Default**: `'main'`. @@ -166,14 +224,37 @@ Creates and attaches a session to the database. This method is a wrapper around ### `database.applyChangeset(changeset[, options])` + + * `changeset` {Uint8Array} A binary changeset or patchset. * `options` {Object} The configuration options for how the changes will be applied. * `filter` {Function} Skip changes that, when targeted table name is supplied to this function, return a truthy value. By default, all changes are attempted. - * `onConflict` {number} Determines how conflicts are handled. **Default**: `SQLITE_CHANGESET_ABORT`. - * `SQLITE_CHANGESET_OMIT`: conflicting changes are omitted. - * `SQLITE_CHANGESET_REPLACE`: conflicting changes replace existing values. - * `SQLITE_CHANGESET_ABORT`: abort on conflict and roll back databsase. + * `onConflict` {Function} A function that determines how to handle conflicts. The function receives one argument, + which can be one of the following values: + + * `SQLITE_CHANGESET_DATA`: A `DELETE` or `UPDATE` change does not contain the expected "before" values. + * `SQLITE_CHANGESET_NOTFOUND`: A row matching the primary key of the `DELETE` or `UPDATE` change does not exist. + * `SQLITE_CHANGESET_CONFLICT`: An `INSERT` change results in a duplicate primary key. + * `SQLITE_CHANGESET_FOREIGN_KEY`: Applying a change would result in a foreign key violation. + * `SQLITE_CHANGESET_CONSTRAINT`: Applying a change results in a `UNIQUE`, `CHECK`, or `NOT NULL` constraint + violation. + + The function should return one of the following values: + + * `SQLITE_CHANGESET_OMIT`: Omit conflicting changes. + * `SQLITE_CHANGESET_REPLACE`: Replace existing values with conflicting changes (only valid with + `SQLITE_CHANGESET_DATA` or `SQLITE_CHANGESET_CONFLICT` conflicts). + * `SQLITE_CHANGESET_ABORT`: Abort on conflict and roll back the database. + + When an error is thrown in the conflict handler or when any other value is returned from the handler, + applying the changeset is aborted and the database is rolled back. + + **Default**: A function that returns `SQLITE_CHANGESET_ABORT`. * Returns: {boolean} Whether the changeset was applied succesfully without being aborted. An exception is thrown if the database is not @@ -199,8 +280,20 @@ targetDb.applyChangeset(changeset); ## Class: `Session` + + ### `session.changeset()` + + * Returns: {Uint8Array} Binary changeset that can be applied to other databases. Retrieves a changeset containing all changes since the changeset was created. Can be called multiple times. @@ -208,6 +301,12 @@ An exception is thrown if the database or the session is not open. This method i ### `session.patchset()` + + * Returns: {Uint8Array} Binary patchset that can be applied to other databases. Similar to the method above, but generates a more compact patchset. See [Changesets and Patchsets][] @@ -240,11 +339,15 @@ over hand-crafted SQL strings when handling user input. * `namedParameters` {Object} An optional object used to bind named parameters. The keys of this object are used to configure the mapping. -* `...anonymousParameters` {null|number|bigint|string|Buffer|Uint8Array} Zero or +* `...anonymousParameters` {null|number|bigint|string|Buffer|TypedArray|DataView} Zero or more values to bind to anonymous parameters. * Returns: {Array} An array of objects. Each object corresponds to a row returned by executing the prepared statement. The keys and values of each @@ -272,11 +375,15 @@ execution of this prepared statement. This property is a wrapper around * `namedParameters` {Object} An optional object used to bind named parameters. The keys of this object are used to configure the mapping. -* `...anonymousParameters` {null|number|bigint|string|Buffer|Uint8Array} Zero or +* `...anonymousParameters` {null|number|bigint|string|Buffer|TypedArray|DataView} Zero or more values to bind to anonymous parameters. * Returns: {Object|undefined} An object corresponding to the first row returned by executing the prepared statement. The keys and values of the object @@ -288,15 +395,42 @@ object. If the prepared statement does not return any results, this method returns `undefined`. The prepared statement [parameters are bound][] using the values in `namedParameters` and `anonymousParameters`. +### `statement.iterate([namedParameters][, ...anonymousParameters])` + + + +* `namedParameters` {Object} An optional object used to bind named parameters. + The keys of this object are used to configure the mapping. +* `...anonymousParameters` {null|number|bigint|string|Buffer|TypedArray|DataView} Zero or + more values to bind to anonymous parameters. +* Returns: {Iterator} An iterable iterator of objects. Each object corresponds to a row + returned by executing the prepared statement. The keys and values of each + object correspond to the column names and values of the row. + +This method executes a prepared statement and returns an iterator of +objects. If the prepared statement does not return any results, this method +returns an empty iterator. The prepared statement [parameters are bound][] using +the values in `namedParameters` and `anonymousParameters`. + ### `statement.run([namedParameters][, ...anonymousParameters])` * `namedParameters` {Object} An optional object used to bind named parameters. The keys of this object are used to configure the mapping. -* `...anonymousParameters` {null|number|bigint|string|Buffer|Uint8Array} Zero or +* `...anonymousParameters` {null|number|bigint|string|Buffer|TypedArray|DataView} Zero or more values to bind to anonymous parameters. * Returns: {Object} * `changes`: {number|bigint} The number of rows modified, inserted, or deleted @@ -381,15 +515,56 @@ exception. | `TEXT` | {string} | | `BLOB` | {Uint8Array} | -## SQLite constants +## `sqlite.constants` + + + +* {Object} + +An object containing commonly used constants for SQLite operations. -The following constants are exported by the `node:sqlite` module. +### SQLite constants -### SQLite Session constants +The following constants are exported by the `sqlite.constants` object. -#### Conflict-resolution constants +#### Conflict resolution constants + +One of the following constants is available as an argument to the `onConflict` +conflict resolution handler passed to [`database.applyChangeset()`][]. See also +[Constants Passed To The Conflict Handler][] in the SQLite documentation. + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ConstantDescription
    SQLITE_CHANGESET_DATAThe conflict handler is invoked with this constant when processing a DELETE or UPDATE change if a row with the required PRIMARY KEY fields is present in the database, but one or more other (non primary-key) fields modified by the update do not contain the expected "before" values.
    SQLITE_CHANGESET_NOTFOUNDThe conflict handler is invoked with this constant when processing a DELETE or UPDATE change if a row with the required PRIMARY KEY fields is not present in the database.
    SQLITE_CHANGESET_CONFLICTThis constant is passed to the conflict handler while processing an INSERT change if the operation would result in duplicate primary key values.
    SQLITE_CHANGESET_CONSTRAINTIf foreign key handling is enabled, and applying a changeset leaves the database in a state containing foreign key violations, the conflict handler is invoked with this constant exactly once before the changeset is committed. If the conflict handler returns SQLITE_CHANGESET_OMIT, the changes, including those that caused the foreign key constraint violation, are committed. Or, if it returns SQLITE_CHANGESET_ABORT, the changeset is rolled back.
    SQLITE_CHANGESET_FOREIGN_KEYIf any other constraint violation occurs while applying a change (i.e. a UNIQUE, CHECK or NOT NULL constraint), the conflict handler is invoked with this constant.
    -The following constants are meant for use with [`database.applyChangeset()`](#databaseapplychangesetchangeset-options). +One of the following constants must be returned from the `onConflict` conflict +resolution handler passed to [`database.applyChangeset()`][]. See also +[Constants Returned From The Conflict Handler][] in the SQLite documentation. @@ -402,24 +577,30 @@ The following constants are meant for use with [`database.applyChangeset()`](#da - + - +
    SQLITE_CHANGESET_REPLACEConflicting changes replace existing values.Conflicting changes replace existing values. Note that this value can only be returned when the type of conflict is either SQLITE_CHANGESET_DATA or SQLITE_CHANGESET_CONFLICT.
    SQLITE_CHANGESET_ABORTAbort when a change encounters a conflict and roll back databsase.Abort when a change encounters a conflict and roll back database.
    [Changesets and Patchsets]: https://www.sqlite.org/sessionintro.html#changesets_and_patchsets +[Constants Passed To The Conflict Handler]: https://www.sqlite.org/session/c_changeset_conflict.html +[Constants Returned From The Conflict Handler]: https://www.sqlite.org/session/c_changeset_abort.html [SQL injection]: https://en.wikipedia.org/wiki/SQL_injection -[`--experimental-sqlite`]: cli.md#--experimental-sqlite [`ATTACH DATABASE`]: https://www.sqlite.org/lang_attach.html [`PRAGMA foreign_keys`]: https://www.sqlite.org/pragma.html#pragma_foreign_keys +[`SQLITE_DETERMINISTIC`]: https://www.sqlite.org/c3ref/c_deterministic.html +[`SQLITE_DIRECTONLY`]: https://www.sqlite.org/c3ref/c_deterministic.html +[`database.applyChangeset()`]: #databaseapplychangesetchangeset-options [`sqlite3_changes64()`]: https://www.sqlite.org/c3ref/changes.html [`sqlite3_close_v2()`]: https://www.sqlite.org/c3ref/close.html +[`sqlite3_create_function_v2()`]: https://www.sqlite.org/c3ref/create_function.html [`sqlite3_exec()`]: https://www.sqlite.org/c3ref/exec.html [`sqlite3_expanded_sql()`]: https://www.sqlite.org/c3ref/expanded_sql.html [`sqlite3_last_insert_rowid()`]: https://www.sqlite.org/c3ref/last_insert_rowid.html +[`sqlite3_load_extension()`]: https://www.sqlite.org/c3ref/load_extension.html [`sqlite3_prepare_v2()`]: https://www.sqlite.org/c3ref/prepare.html [`sqlite3_sql()`]: https://www.sqlite.org/c3ref/expanded_sql.html [`sqlite3changeset_apply()`]: https://www.sqlite.org/session/sqlite3changeset_apply.html diff --git a/doc/api/stream.md b/doc/api/stream.md index 8dc5173500e623..6f5fdd05a15d82 100644 --- a/doc/api/stream.md +++ b/doc/api/stream.md @@ -315,7 +315,7 @@ events (due to incorrect stream implementations) do not cause unexpected crashes. If this is unwanted behavior then `options.cleanup` should be set to `true`: -```js +```mjs await finished(rs, { cleanup: true }); ``` @@ -3846,8 +3846,6 @@ added: v8.0.0 The `_destroy()` method is called by [`writable.destroy()`][writable-destroy]. It can be overridden by child classes but it **must not** be called directly. -Furthermore, the `callback` should not be mixed with async/await -once it is executed when a promise is resolved. #### `writable._final(callback)` @@ -3926,7 +3924,7 @@ const { StringDecoder } = require('node:string_decoder'); class StringWritable extends Writable { constructor(options) { super(options); - this._decoder = new StringDecoder(options && options.defaultEncoding); + this._decoder = new StringDecoder(options?.defaultEncoding); this.data = ''; } _write(chunk, encoding, callback) { diff --git a/doc/api/test.md b/doc/api/test.md index 37977a9b8a56f4..92276017fd63d0 100644 --- a/doc/api/test.md +++ b/doc/api/test.md @@ -420,8 +420,8 @@ By default, Node.js will run all files matching these patterns: * `**/test.{cjs,mjs,js}` * `**/test/**/*.{cjs,mjs,js}` -When [`--experimental-strip-types`][] is supplied, the following -additional patterns are matched: +Unless [`--no-experimental-strip-types`][] is supplied, the following +additional patterns are also matched: * `**/*.test.{cts,mts,ts}` * `**/*-test.{cts,mts,ts}` @@ -476,8 +476,10 @@ all tests have completed. If the [`NODE_V8_COVERAGE`][] environment variable is used to specify a code coverage directory, the generated V8 coverage files are written to that directory. Node.js core modules and files within `node_modules/` directories are, by default, not included in the coverage report. -However, they can be explicitly included via the [`--test-coverage-include`][] flag. If -coverage is enabled, the coverage report is sent to any [test reporters][] via +However, they can be explicitly included via the [`--test-coverage-include`][] flag. +By default all the matching test files are excluded from the coverage report. +Exclusions can be overridden by using the [`--test-coverage-exclude`][] flag. +If coverage is enabled, the coverage report is sent to any [test reporters][] via the `'test:coverage'` event. Coverage can be disabled on a series of lines using the following @@ -930,15 +932,20 @@ test('runs timers as setTime passes ticks', (context) => { ## Snapshot testing -> Stability: 1.0 - Early development + Snapshot tests allow arbitrary values to be serialized into string values and compared against a set of known good values. The known good values are known as snapshots, and are stored in a snapshot file. Snapshot files are managed by the test runner, but are designed to be human readable to aid in debugging. Best practice is for snapshot files to be checked into source control along with your -test files. In order to enable snapshot testing, Node.js must be started with -the [`--experimental-test-snapshots`][] command-line flag. +test files. Snapshot files are generated by starting Node.js with the [`--test-update-snapshots`][] command-line flag. A separate snapshot file is @@ -1743,14 +1750,35 @@ describe('tests', async () => { }); ``` +## `assert` + + + +An object whose methods are used to configure available assertions on the +`TestContext` objects in the current process. The methods from `node:assert` +and snapshot testing functions are available by default. + +It is possible to apply the same configuration to all files by placing common +configuration code in a module +preloaded with `--require` or `--import`. + +### `assert.register(name, fn)` + + + +Defines a new assertion function with the provided name and function. If an +assertion already exists with the same name, it is overwritten. + ## `snapshot` -> Stability: 1.0 - Early development - An object whose methods are used to configure default snapshot settings in the current process. It is possible to apply the same configuration to all files by placing common configuration code in a module preloaded with `--require` or @@ -1762,8 +1790,6 @@ placing common configuration code in a module preloaded with `--require` or added: v22.3.0 --> -> Stability: 1.0 - Early development - * `serializers` {Array} An array of synchronous functions used as the default serializers for snapshot tests. @@ -1779,8 +1805,6 @@ more robust serialization mechanism is required, this function should be used. added: v22.3.0 --> -> Stability: 1.0 - Early development - * `fn` {Function} A function used to compute the location of the snapshot file. The function receives the path of the test file as its only argument. If the test is not associated with a file (for example in the REPL), the input is @@ -2929,6 +2953,7 @@ The corresponding declaration ordered events are `'test:pass'` and `'test:fail'` `undefined` if the test was run through the REPL. * `name` {string} The test name. * `nesting` {number} The nesting level of the test. + * `type` {string} The test type. Either `'suite'` or `'test'`. Emitted when a test is dequeued, right before it is executed. This event is not guaranteed to be emitted in the same order as the tests are @@ -2961,6 +2986,7 @@ defined. `undefined` if the test was run through the REPL. * `name` {string} The test name. * `nesting` {number} The nesting level of the test. + * `type` {string} The test type. Either `'suite'` or `'test'`. Emitted when a test is enqueued for execution. @@ -3260,8 +3286,6 @@ test('test', (t) => { added: v22.3.0 --> -> Stability: 1.0 - Early development - * `value` {any} A value to serialize to a string. If Node.js was started with the [`--test-update-snapshots`][] flag, the serialized value is written to the snapshot file. Otherwise, the serialized value is compared to the @@ -3284,7 +3308,7 @@ test('snapshot test with default serialization', (t) => { test('snapshot test with custom serialization', (t) => { t.assert.snapshot({ value3: 3, value4: 4 }, { - serializers: [(value) => JSON.stringify(value)] + serializers: [(value) => JSON.stringify(value)], }); }); ``` @@ -3345,10 +3369,12 @@ The name of the test. added: - v22.2.0 - v20.15.0 +changes: + - version: v23.4.0 + pr-url: https://github.com/nodejs/node/pull/55895 + description: This function is no longer experimental. --> -> Stability: 1 - Experimental - * `count` {number} The number of assertions and subtests that are expected to run. This function is used to set the number of assertions and subtests that are expected to run @@ -3588,12 +3614,12 @@ added: Can be used to abort test subtasks when the test has been aborted. [TAP]: https://testanything.org/ -[`--experimental-strip-types`]: cli.md#--experimental-strip-types [`--experimental-test-coverage`]: cli.md#--experimental-test-coverage [`--experimental-test-module-mocks`]: cli.md#--experimental-test-module-mocks -[`--experimental-test-snapshots`]: cli.md#--experimental-test-snapshots [`--import`]: cli.md#--importmodule +[`--no-experimental-strip-types`]: cli.md#--no-experimental-strip-types [`--test-concurrency`]: cli.md#--test-concurrency +[`--test-coverage-exclude`]: cli.md#--test-coverage-exclude [`--test-coverage-include`]: cli.md#--test-coverage-include [`--test-name-pattern`]: cli.md#--test-name-pattern [`--test-only`]: cli.md#--test-only diff --git a/doc/api/timers.md b/doc/api/timers.md index 83edc1d73b0e77..9c4ca2ea17d263 100644 --- a/doc/api/timers.md +++ b/doc/api/timers.md @@ -292,7 +292,24 @@ returned Promises will be rejected with an `'AbortError'`. For `setImmediate()`: -```js +```mjs +import { setImmediate as setImmediatePromise } from 'node:timers/promises'; + +const ac = new AbortController(); +const signal = ac.signal; + +// We do not `await` the promise so `ac.abort()` is called concurrently. +setImmediatePromise('foobar', { signal }) + .then(console.log) + .catch((err) => { + if (err.name === 'AbortError') + console.error('The immediate was aborted'); + }); + +ac.abort(); +``` + +```cjs const { setImmediate: setImmediatePromise } = require('node:timers/promises'); const ac = new AbortController(); @@ -310,7 +327,24 @@ ac.abort(); For `setTimeout()`: -```js +```mjs +import { setTimeout as setTimeoutPromise } from 'node:timers/promises'; + +const ac = new AbortController(); +const signal = ac.signal; + +// We do not `await` the promise so `ac.abort()` is called concurrently. +setTimeoutPromise(1000, 'foobar', { signal }) + .then(console.log) + .catch((err) => { + if (err.name === 'AbortError') + console.error('The timeout was aborted'); + }); + +ac.abort(); +``` + +```cjs const { setTimeout: setTimeoutPromise } = require('node:timers/promises'); const ac = new AbortController(); diff --git a/doc/api/tls.md b/doc/api/tls.md index f19a75370b1cf5..8c52daf294bc1f 100644 --- a/doc/api/tls.md +++ b/doc/api/tls.md @@ -10,7 +10,11 @@ The `node:tls` module provides an implementation of the Transport Layer Security (TLS) and Secure Socket Layer (SSL) protocols that is built on top of OpenSSL. The module can be accessed using: -```js +```mjs +import tls from 'node:tls'; +``` + +```cjs const tls = require('node:tls'); ``` @@ -461,17 +465,31 @@ To adjust the security level in your Node.js application, you can include `@SECL within a cipher string, where `X` is the desired security level. For example, to set the security level to 0 while using the default OpenSSL cipher list, you could use: -```js -const tls = require('node:tls'); +```mjs +import { createServer, connect } from 'node:tls'; const port = 443; -tls.createServer({ciphers: 'DEFAULT@SECLEVEL=0', minVersion: 'TLSv1'}, function (socket) { +createServer({ ciphers: 'DEFAULT@SECLEVEL=0', minVersion: 'TLSv1' }, function(socket) { console.log('Client connected with protocol:', socket.getProtocol()); socket.end(); this.close(); -}). -listen(port, () => { - tls.connect(port, {ciphers: 'DEFAULT@SECLEVEL=0', maxVersion: 'TLSv1'}); +}) +.listen(port, () => { + connect(port, { ciphers: 'DEFAULT@SECLEVEL=0', maxVersion: 'TLSv1' }); +}); +``` + +```cjs +const { createServer, connect } = require('node:tls'); +const port = 443; + +createServer({ ciphers: 'DEFAULT@SECLEVEL=0', minVersion: 'TLSv1' }, function(socket) { + console.log('Client connected with protocol:', socket.getProtocol()); + socket.end(); + this.close(); +}) +.listen(port, () => { + connect(port, { ciphers: 'DEFAULT@SECLEVEL=0', maxVersion: 'TLSv1' }); }); ``` @@ -1785,24 +1803,57 @@ to `host`. The following illustrates a client for the echo server example from [`tls.createServer()`][]: -```js +```mjs // Assumes an echo server that is listening on port 8000. -const tls = require('node:tls'); -const fs = require('node:fs'); +import { connect } from 'node:tls'; +import { readFileSync } from 'node:fs'; +import { stdin } from 'node:process'; + +const options = { + // Necessary only if the server requires client certificate authentication. + key: readFileSync('client-key.pem'), + cert: readFileSync('client-cert.pem'), + + // Necessary only if the server uses a self-signed certificate. + ca: [ readFileSync('server-cert.pem') ], + + // Necessary only if the server's cert isn't for "localhost". + checkServerIdentity: () => { return null; }, +}; + +const socket = connect(8000, options, () => { + console.log('client connected', + socket.authorized ? 'authorized' : 'unauthorized'); + stdin.pipe(socket); + stdin.resume(); +}); +socket.setEncoding('utf8'); +socket.on('data', (data) => { + console.log(data); +}); +socket.on('end', () => { + console.log('server ends connection'); +}); +``` + +```cjs +// Assumes an echo server that is listening on port 8000. +const { connect } = require('node:tls'); +const { readFileSync } = require('node:fs'); const options = { // Necessary only if the server requires client certificate authentication. - key: fs.readFileSync('client-key.pem'), - cert: fs.readFileSync('client-cert.pem'), + key: readFileSync('client-key.pem'), + cert: readFileSync('client-cert.pem'), // Necessary only if the server uses a self-signed certificate. - ca: [ fs.readFileSync('server-cert.pem') ], + ca: [ readFileSync('server-cert.pem') ], // Necessary only if the server's cert isn't for "localhost". checkServerIdentity: () => { return null; }, }; -const socket = tls.connect(8000, options, () => { +const socket = connect(8000, options, () => { console.log('client connected', socket.authorized ? 'authorized' : 'unauthorized'); process.stdin.pipe(socket); @@ -1817,6 +1868,20 @@ socket.on('end', () => { }); ``` +To generate the certificate and key for this example, run: + +```bash +openssl req -x509 -newkey rsa:2048 -nodes -sha256 -subj '/CN=localhost' \ + -keyout client-key.pem -out client-cert.pem +``` + +Then, to generate the `server-cert.pem` certificate for this example, run: + +```bash +openssl pkcs12 -certpbe AES-256-CBC -export -out server-cert.pem \ + -inkey client-key.pem -in client-cert.pem +``` + ## `tls.connect(path[, options][, callback])` @@ -500,7 +502,9 @@ fs.access('file/that/does/not/exist', (err) => { ## `util.getSystemErrorMessage(err)` * `err` {number} @@ -513,7 +517,7 @@ The mapping between error codes and string messages is platform-dependent. ```js fs.access('file/that/does/not/exist', (err) => { const name = util.getSystemErrorMessage(err.errno); - console.error(name); // no such file or directory + console.error(name); // No such file or directory }); ``` @@ -1535,9 +1539,10 @@ changes: times. If `true`, all values will be collected in an array. If `false`, values for the option are last-wins. **Default:** `false`. * `short` {string} A single character alias for the option. - * `default` {string | boolean | string\[] | boolean\[]} The default option - value when it is not set by args. It must be of the same type as the - `type` property. When `multiple` is `true`, it must be an array. + * `default` {string | boolean | string\[] | boolean\[]} The default value to + be used if (and only if) the option does not appear in the arguments to be + parsed. It must be of the same type as the `type` property. When `multiple` + is `true`, it must be an array. * `strict` {boolean} Should an error be thrown when unknown arguments are encountered, or when arguments are passed that do not match the `type` configured in `options`. @@ -1915,13 +1920,16 @@ console.log(util.stripVTControlCharacters('\u001B[4mvalue\u001B[0m')); ## `util.styleText(format, text[, options])` -> Stability: 1.1 - Active development +> Stability: 2 - Stable. An implementation of the [WHATWG Encoding Standard][] `TextDecoder` API. @@ -2076,14 +2088,6 @@ is not supported. ### `new TextDecoder([encoding[, options]])` - - * `encoding` {string} Identifies the `encoding` that this `TextDecoder` instance supports. **Default:** `'utf-8'`. * `options` {Object} @@ -2166,6 +2170,10 @@ encoded bytes. ### `textEncoder.encodeInto(src, dest)` + + * `src` {string} The text to encode. * `dest` {Uint8Array} The array to hold the encode result. * Returns: {Object} @@ -2244,39 +2252,55 @@ added: > Stability: 1 - Experimental * `signal` {AbortSignal} -* `resource` {Object} Any non-null entity, reference to which is held weakly. +* `resource` {Object} Any non-null object tied to the abortable operation and held weakly. + If `resource` is garbage collected before the `signal` aborts, the promise remains pending, + allowing Node.js to stop tracking it. + This helps prevent memory leaks in long-running or non-cancelable operations. * Returns: {Promise} -Listens to abort event on the provided `signal` and -returns a promise that is fulfilled when the `signal` is -aborted. If the passed `resource` is garbage collected before the `signal` is -aborted, the returned promise shall remain pending indefinitely. +Listens to abort event on the provided `signal` and returns a promise that resolves when the `signal` is aborted. +If `resource` is provided, it weakly references the operation's associated object, +so if `resource` is garbage collected before the `signal` aborts, +then returned promise shall remain pending. +This prevents memory leaks in long-running or non-cancelable operations. ```cjs const { aborted } = require('node:util'); +// Obtain an object with an abortable signal, like a custom resource or operation. const dependent = obtainSomethingAbortable(); +// Pass `dependent` as the resource, indicating the promise should only resolve +// if `dependent` is still in memory when the signal is aborted. aborted(dependent.signal, dependent).then(() => { - // Do something when dependent is aborted. + + // This code runs when `dependent` is aborted. + console.log('Dependent resource was aborted.'); }); +// Simulate an event that triggers the abort. dependent.on('event', () => { - dependent.abort(); + dependent.abort(); // This will cause the `aborted` promise to resolve. }); ``` ```mjs import { aborted } from 'node:util'; +// Obtain an object with an abortable signal, like a custom resource or operation. const dependent = obtainSomethingAbortable(); +// Pass `dependent` as the resource, indicating the promise should only resolve +// if `dependent` is still in memory when the signal is aborted. aborted(dependent.signal, dependent).then(() => { - // Do something when dependent is aborted. + + // This code runs when `dependent` is aborted. + console.log('Dependent resource was aborted.'); }); +// Simulate an event that triggers the abort. dependent.on('event', () => { - dependent.abort(); + dependent.abort(); // This will cause the `aborted` promise to resolve. }); ``` diff --git a/doc/api/v8.md b/doc/api/v8.md index 4df6e98a48fe78..670283e17f5d80 100644 --- a/doc/api/v8.md +++ b/doc/api/v8.md @@ -1296,7 +1296,7 @@ is as follows. Here's an example. ```js -const { GCProfiler } = require('v8'); +const { GCProfiler } = require('node:v8'); const profiler = new GCProfiler(); profiler.start(); setTimeout(() => { diff --git a/doc/api/vm.md b/doc/api/vm.md index 01317b5843ad34..a5dd038070a498 100644 --- a/doc/api/vm.md +++ b/doc/api/vm.md @@ -1622,12 +1622,12 @@ in the outer context. const vm = require('node:vm'); // An undefined `contextObject` option makes the global object contextified. -let context = vm.createContext(); +const context = vm.createContext(); console.log(vm.runInContext('globalThis', context) === context); // false // A contextified global object cannot be frozen. try { vm.runInContext('Object.freeze(globalThis);', context); -} catch(e) { +} catch (e) { console.log(e); // TypeError: Cannot freeze } console.log(vm.runInContext('globalThis.foo = 1; foo;', context)); // 1 @@ -1652,7 +1652,7 @@ const context = vm.createContext(vm.constants.DONT_CONTEXTIFY); vm.runInContext('Object.freeze(globalThis);', context); try { vm.runInContext('bar = 1; bar;', context); -} catch(e) { +} catch (e) { console.log(e); // Uncaught ReferenceError: bar is not defined } ``` @@ -1681,7 +1681,7 @@ console.log(vm.runInContext('bar;', context)); // 1 Object.freeze(context); try { vm.runInContext('baz = 1; baz;', context); -} catch(e) { +} catch (e) { console.log(e); // Uncaught ReferenceError: baz is not defined } ``` diff --git a/doc/api/webcrypto.md b/doc/api/webcrypto.md index 371073397ad7d6..7d7f735885a063 100644 --- a/doc/api/webcrypto.md +++ b/doc/api/webcrypto.md @@ -2,6 +2,9 @@ + ```js const b = Symbol('b'); diff --git a/doc/api/zlib.md b/doc/api/zlib.md index 36977eae86af6f..a12e9c3fc680f0 100644 --- a/doc/api/zlib.md +++ b/doc/api/zlib.md @@ -11,7 +11,11 @@ Gzip, Deflate/Inflate, and Brotli. To access it: -```js +```mjs +import os from 'node:zlib'; +``` + +```cjs const zlib = require('node:zlib'); ``` @@ -21,13 +25,35 @@ Compressing or decompressing a stream (such as a file) can be accomplished by piping the source stream through a `zlib` `Transform` stream into a destination stream: -```js -const { createGzip } = require('node:zlib'); -const { pipeline } = require('node:stream'); +```mjs +import { + createReadStream, + createWriteStream, +} from 'node:fs'; +import process from 'node:process'; +import { createGzip } from 'node:zlib'; +import { pipeline } from 'node:stream'; + +const gzip = createGzip(); +const source = createReadStream('input.txt'); +const destination = createWriteStream('input.txt.gz'); + +pipeline(source, gzip, destination, (err) => { + if (err) { + console.error('An error occurred:', err); + process.exitCode = 1; + } +}); +``` + +```cjs const { createReadStream, createWriteStream, } = require('node:fs'); +const process = require('node:process'); +const { createGzip } = require('node:zlib'); +const { pipeline } = require('node:stream'); const gzip = createGzip(); const source = createReadStream('input.txt'); @@ -39,17 +65,43 @@ pipeline(source, gzip, destination, (err) => { process.exitCode = 1; } }); +``` -// Or, Promisified +Or, using the promise `pipeline` API: -const { promisify } = require('node:util'); -const pipe = promisify(pipeline); +```mjs +import { + createReadStream, + createWriteStream, +} from 'node:fs'; +import process from 'node:process'; +import { createGzip } from 'node:zlib'; +import { pipeline } from 'node:stream/promises'; async function do_gzip(input, output) { const gzip = createGzip(); const source = createReadStream(input); const destination = createWriteStream(output); - await pipe(source, gzip, destination); + await pipeline(source, gzip, destination); +} + +await do_gzip('input.txt', 'input.txt.gz'); +``` + +```cjs +const { + createReadStream, + createWriteStream, +} = require('node:fs'); +const process = require('node:process'); +const { createGzip } = require('node:zlib'); +const { pipeline } = require('node:stream/promises'); + +async function do_gzip(input, output) { + const gzip = createGzip(); + const source = createReadStream(input); + const destination = createWriteStream(output); + await pipeline(source, gzip, destination); } do_gzip('input.txt', 'input.txt.gz') @@ -61,7 +113,39 @@ do_gzip('input.txt', 'input.txt.gz') It is also possible to compress or decompress data in a single step: -```js +```mjs +import process from 'node:process'; +import { Buffer } from 'node:buffer'; +import { deflate, unzip } from 'node:zlib'; + +const input = '.................................'; +deflate(input, (err, buffer) => { + if (err) { + console.error('An error occurred:', err); + process.exitCode = 1; + } + console.log(buffer.toString('base64')); +}); + +const buffer = Buffer.from('eJzT0yMAAGTvBe8=', 'base64'); +unzip(buffer, (err, buffer) => { + if (err) { + console.error('An error occurred:', err); + process.exitCode = 1; + } + console.log(buffer.toString()); +}); + +// Or, Promisified + +import { promisify } from 'node:util'; +const do_unzip = promisify(unzip); + +const unzippedBuffer = await do_unzip(buffer); +console.log(unzippedBuffer.toString()); +``` + +```cjs const { deflate, unzip } = require('node:zlib'); const input = '.................................'; @@ -104,7 +188,19 @@ limitations in some applications. Creating and using a large number of zlib objects simultaneously can cause significant memory fragmentation. -```js +```mjs +import zlib from 'node:zlib'; +import { Buffer } from 'node:buffer'; + +const payload = Buffer.from('This is some data'); + +// WARNING: DO NOT DO THIS! +for (let i = 0; i < 30000; ++i) { + zlib.deflate(payload, (err, buffer) => {}); +} +``` + +```cjs const zlib = require('node:zlib'); const payload = Buffer.from('This is some data'); @@ -138,7 +234,47 @@ Using `zlib` encoding can be expensive, and the results ought to be cached. See [Memory usage tuning][] for more information on the speed/memory/compression tradeoffs involved in `zlib` usage. -```js +```mjs +// Client request example +import fs from 'node:fs'; +import zlib from 'node:zlib'; +import http from 'node:http'; +import process from 'node:process'; +import { pipeline } from 'node:stream'; + +const request = http.get({ host: 'example.com', + path: '/', + port: 80, + headers: { 'Accept-Encoding': 'br,gzip,deflate' } }); +request.on('response', (response) => { + const output = fs.createWriteStream('example.com_index.html'); + + const onError = (err) => { + if (err) { + console.error('An error occurred:', err); + process.exitCode = 1; + } + }; + + switch (response.headers['content-encoding']) { + case 'br': + pipeline(response, zlib.createBrotliDecompress(), output, onError); + break; + // Or, just use zlib.createUnzip() to handle both of the following cases: + case 'gzip': + pipeline(response, zlib.createGunzip(), output, onError); + break; + case 'deflate': + pipeline(response, zlib.createInflate(), output, onError); + break; + default: + pipeline(response, output, onError); + break; + } +}); +``` + +```cjs // Client request example const zlib = require('node:zlib'); const http = require('node:http'); @@ -177,7 +313,52 @@ request.on('response', (response) => { }); ``` -```js +```mjs +// server example +// Running a gzip operation on every request is quite expensive. +// It would be much more efficient to cache the compressed buffer. +import zlib from 'node:zlib'; +import http from 'node:http'; +import fs from 'node:fs'; +import { pipeline } from 'node:stream'; + +http.createServer((request, response) => { + const raw = fs.createReadStream('index.html'); + // Store both a compressed and an uncompressed version of the resource. + response.setHeader('Vary', 'Accept-Encoding'); + const acceptEncoding = request.headers['accept-encoding'] || ''; + + const onError = (err) => { + if (err) { + // If an error occurs, there's not much we can do because + // the server has already sent the 200 response code and + // some amount of data has already been sent to the client. + // The best we can do is terminate the response immediately + // and log the error. + response.end(); + console.error('An error occurred:', err); + } + }; + + // Note: This is not a conformant accept-encoding parser. + // See https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3 + if (/\bdeflate\b/.test(acceptEncoding)) { + response.writeHead(200, { 'Content-Encoding': 'deflate' }); + pipeline(raw, zlib.createDeflate(), response, onError); + } else if (/\bgzip\b/.test(acceptEncoding)) { + response.writeHead(200, { 'Content-Encoding': 'gzip' }); + pipeline(raw, zlib.createGzip(), response, onError); + } else if (/\bbr\b/.test(acceptEncoding)) { + response.writeHead(200, { 'Content-Encoding': 'br' }); + pipeline(raw, zlib.createBrotliCompress(), response, onError); + } else { + response.writeHead(200, {}); + pipeline(raw, response, onError); + } +}).listen(1337); +``` + +```cjs // server example // Running a gzip operation on every request is quite expensive. // It would be much more efficient to cache the compressed buffer. @@ -190,10 +371,7 @@ http.createServer((request, response) => { const raw = fs.createReadStream('index.html'); // Store both a compressed and an uncompressed version of the resource. response.setHeader('Vary', 'Accept-Encoding'); - let acceptEncoding = request.headers['accept-encoding']; - if (!acceptEncoding) { - acceptEncoding = ''; - } + const acceptEncoding = request.headers['accept-encoding'] || ''; const onError = (err) => { if (err) { @@ -318,7 +496,43 @@ quality, but can be useful when data needs to be available as soon as possible. In the following example, `flush()` is used to write a compressed partial HTTP response to the client: -```js +```mjs +import zlib from 'node:zlib'; +import http from 'node:http'; +import { pipeline } from 'node:stream'; + +http.createServer((request, response) => { + // For the sake of simplicity, the Accept-Encoding checks are omitted. + response.writeHead(200, { 'content-encoding': 'gzip' }); + const output = zlib.createGzip(); + let i; + + pipeline(output, response, (err) => { + if (err) { + // If an error occurs, there's not much we can do because + // the server has already sent the 200 response code and + // some amount of data has already been sent to the client. + // The best we can do is terminate the response immediately + // and log the error. + clearInterval(i); + response.end(); + console.error('An error occurred:', err); + } + }); + + i = setInterval(() => { + output.write(`The current time is ${Date()}\n`, () => { + // The data has been passed to zlib, but the compression algorithm may + // have decided to buffer the data for more efficient compression. + // Calling .flush() will make the data available as soon as the client + // is ready to receive it. + output.flush(); + }); + }, 1000); +}).listen(1337); +``` + +```cjs const zlib = require('node:zlib'); const http = require('node:http'); const { pipeline } = require('node:stream'); @@ -696,7 +910,67 @@ The `zlib.bytesWritten` property specifies the number of bytes written to the engine, before the bytes are processed (compressed or decompressed, as appropriate for the derived class). -### `zlib.crc32(data[, value])` +### `zlib.close([callback])` + + + +* `callback` {Function} + +Close the underlying handle. + +### `zlib.flush([kind, ]callback)` + + + +* `kind` **Default:** `zlib.constants.Z_FULL_FLUSH` for zlib-based streams, + `zlib.constants.BROTLI_OPERATION_FLUSH` for Brotli-based streams. +* `callback` {Function} + +Flush pending data. Don't call this frivolously, premature flushes negatively +impact the effectiveness of the compression algorithm. + +Calling this only flushes data from the internal `zlib` state, and does not +perform flushing of any kind on the streams level. Rather, it behaves like a +normal call to `.write()`, i.e. it will be queued up behind other pending +writes and will only produce output when data is being read from the stream. + +### `zlib.params(level, strategy, callback)` + + + +* `level` {integer} +* `strategy` {integer} +* `callback` {Function} + +This function is only available for zlib-based streams, i.e. not Brotli. + +Dynamically update the compression level and compression strategy. +Only applicable to deflate algorithm. + +### `zlib.reset()` + + + +Reset the compressor/decompressor to factory defaults. Only applicable to +the inflate and deflate algorithms. + +## `zlib.constants` + + + +Provides an object enumerating Zlib-related constants. + +## `zlib.crc32(data[, value])` - -* `callback` {Function} - -Close the underlying handle. - -### `zlib.flush([kind, ]callback)` - - - -* `kind` **Default:** `zlib.constants.Z_FULL_FLUSH` for zlib-based streams, - `zlib.constants.BROTLI_OPERATION_FLUSH` for Brotli-based streams. -* `callback` {Function} - -Flush pending data. Don't call this frivolously, premature flushes negatively -impact the effectiveness of the compression algorithm. - -Calling this only flushes data from the internal `zlib` state, and does not -perform flushing of any kind on the streams level. Rather, it behaves like a -normal call to `.write()`, i.e. it will be queued up behind other pending -writes and will only produce output when data is being read from the stream. - -### `zlib.params(level, strategy, callback)` - - - -* `level` {integer} -* `strategy` {integer} -* `callback` {Function} - -This function is only available for zlib-based streams, i.e. not Brotli. - -Dynamically update the compression level and compression strategy. -Only applicable to deflate algorithm. - -### `zlib.reset()` - - - -Reset the compressor/decompressor to factory defaults. Only applicable to -the inflate and deflate algorithms. - -## `zlib.constants` - - - -Provides an object enumerating Zlib-related constants. - ## `zlib.createBrotliCompress([options])` - > Stability: 1 - Experimental @@ -186,7 +186,7 @@ For all runtime version guards updated in Step 2, check for these definitions with: ```bash -grep NAPI_EXPERIMENTAL doc/api/n-api.md +grep -nH NAPI_EXPERIMENTAL doc/api/n-api.md ``` In `doc/api/n-api.md`, update the `experimental` change history item to be the diff --git a/doc/contributing/releases.md b/doc/contributing/releases.md index 82eec2833998ad..b3b20b8ae5589e 100644 --- a/doc/contributing/releases.md +++ b/doc/contributing/releases.md @@ -282,7 +282,15 @@ You can integrate the PRs into the proposal without running full CI. ### 2. Create a new branch for the release -⚠️ At this point, you can either run `git node release --prepare`: +> \[!TIP] Once the staging branch is up-to-date you can use the +> [`create-release-proposal`][] action to generate the proposal. + +```bash +gh workflow run "Create Release Proposal" -f release-line=N -f release-date=YYYY-MM-DD +``` + +If you prefer to run it locally you can either run +`git node release --prepare`: ```bash git node release -S --prepare x.y.z @@ -707,12 +715,23 @@ the build before moving forward. Use the following list as a baseline: ### 11. Tag and sign the release commit -Once you have produced builds that you're happy with, create a new tag. By -waiting until this stage to create tags, you can discard a proposed release if -something goes wrong or additional commits are required. Once you have created a -tag and pushed it to GitHub, you _**must not**_ delete and re-tag. If you make -a mistake after tagging then you'll have to version-bump and start again and -count that tag/version as lost. +Once you have produced builds that you're happy with you can either run +`git node release --promote` + +```bash +git node release -S --promote https://github.com/nodejs/node/pull/XXXX +``` + +to automate the remaining steps until step 16 or you can perform it manually +following the below steps. + +*** + +Create a new tag: By waiting until this stage to create tags, you can discard +a proposed release if something goes wrong or additional commits are required. +Once you have created a tag and pushed it to GitHub, you _**must not**_ delete +and re-tag. If you make a mistake after tagging then you'll have to version-bump +and start again and count that tag/version as lost. Tag summaries have a predictable format. Look at a recent tag to see: @@ -947,6 +966,13 @@ a `NODEJS_RELEASE_HOST` environment variable: NODEJS_RELEASE_HOST=proxy.xyz ./tools/release.sh ``` +In case `gpg` is unable to autoselect a key, you can retry using the +`-a` option to enable an interactive interface: + +```bash +./tools/release.sh -a +``` + > \[!TIP] > Sometimes, due to machines being overloaded or other external factors, > the files at , @@ -1064,20 +1090,18 @@ This script will use the promoted builds and changelog to generate the post. Run ### 19. Announce The nodejs.org website will automatically rebuild and include the new version. -To announce the build on Twitter through the official @nodejs account, email - with a message such as: +To announce the build on social media, please ping the @nodejs-social-team +on offical slack channel. + +Node.js is also available on Bluesky and a release announcement can be +reposted using [nodejs/bluesky](https://github.com/nodejs/bluesky) repository. + +The post content can be as simple as: > v5.8.0 of @nodejs is out: > … > something here about notable changes -To ensure communication goes out with the timing of the blog post, please allow -24 hour prior notice. If known, please include the date and time the release -will be shared with the community in the email to coordinate these -announcements. - -Ping the IRC ops and the other [Partner Communities][] liaisons. -
    Security release @@ -1372,12 +1396,48 @@ Infrastructure team is able to perform the switch of the default. An issue should be opened on the [Node.js Snap management repository][] requesting this take place once a new LTS line has been released. +## FAQ + +Due to how `tools/release.sh` work, it isn't uncommon to face some errors +during the promotion process as it depends on network communication and machine +availability. This section aims to guide the releaser through potential +failures. + +### Error on dist-indexer while promoting + +```bash +node:events:491 + throw er; // Unhandled 'error' event + ^ + +Error: read ECONNRESET + at TLSWrap.onStreamRead (node:internal/stream_base_commons:217:20) +Emitted 'error' event on DestroyableTransform instance at: + at ClientRequest. (/usr/lib/node_modules/nodejs-dist-indexer/node_modules/hyperquest/index.js:14:19) + at ClientRequest.emit (node:events:513:28) + at TLSSocket.socketErrorListener (node:_http_client:494:9) + at TLSSocket.emit (node:events:513:28) + at emitErrorNT (node:internal/streams/destroy:157:8) + at emitErrorCloseNT (node:internal/streams/destroy:122:3) + at processTicksAndRejections (node:internal/process/task_queues:83:21) { + errno: -104, + code: 'ECONNRESET', + syscall: 'read' +} +``` + +Typical resolution: sign the release again. + +```bash +./tools/release.sh -s vX.Y.Z +``` + [Build issue tracker]: https://github.com/nodejs/build/issues/new [CI lockdown procedure]: https://github.com/nodejs/build/blob/HEAD/doc/jenkins-guide.md#restricting-access-for-security-releases [Node.js Snap management repository]: https://github.com/nodejs/snap -[Partner Communities]: https://github.com/nodejs/community-committee/blob/HEAD/governance/PARTNER_COMMUNITIES.md [Snap]: https://snapcraft.io/node +[`create-release-proposal`]: https://github.com/nodejs/node/actions/workflows/create-release-proposal.yml [build-infra team]: https://github.com/orgs/nodejs/teams/build-infra [expected assets]: https://github.com/nodejs/build/tree/HEAD/ansible/www-standalone/tools/promote/expected_assets -[nodejs.org release-post.js script]: https://github.com/nodejs/nodejs.org/blob/HEAD/scripts/release-post/index.mjs +[nodejs.org release-post.js script]: https://github.com/nodejs/nodejs.org/blob/HEAD/apps/site/scripts/release-post/index.mjs [nodejs.org repository]: https://github.com/nodejs/nodejs.org diff --git a/doc/contributing/technical-priorities.md b/doc/contributing/technical-priorities.md index 9e566f12ae6750..68ac6f8dd0d00a 100644 --- a/doc/contributing/technical-priorities.md +++ b/doc/contributing/technical-priorities.md @@ -21,11 +21,11 @@ on October 1st 2022. _Present in: 2021_ -Base HTTP support is a key component of modern cloud-native applications +Base HTTP support is a key component of modern cloud-native applications, and built-in support was part of what made Node.js a success in the first 10 years. The current implementation is hard to support and a common source of vulnerabilities. We must work towards an -implementation which is easier to support and makes it easier to integrate +implementation that is easier to support and makes it easier to integrate the new HTTP versions (HTTP3, QUIC) and to support efficient implementations of different versions concurrently. @@ -96,7 +96,7 @@ supported tools to implement those processes (logging, metrics and tracing). This includes support within the Node.js runtime itself (for example generating heap dumps, performance metrics, etc.) as well as support for applications on top of the runtime. In addition, it is also important to -clearly document the use cases, problem determination methods and best +clearly document the use cases, problem determination methods, and best practices for those tools. ## Better multithreaded support diff --git a/doc/contributing/writing-and-running-benchmarks.md b/doc/contributing/writing-and-running-benchmarks.md index 3d16c7d14fc033..63fbf75c798833 100644 --- a/doc/contributing/writing-and-running-benchmarks.md +++ b/doc/contributing/writing-and-running-benchmarks.md @@ -538,7 +538,7 @@ The arguments of `createBenchmark` are: source: ['buffer', 'string'], len: [2048], n: [50, 2048], - } + }, }, { byGroups: true }); ``` diff --git a/doc/eslint.config_partial.mjs b/doc/eslint.config_partial.mjs index edcc72930875b0..609c38c26e9336 100644 --- a/doc/eslint.config_partial.mjs +++ b/doc/eslint.config_partial.mjs @@ -3,7 +3,9 @@ import { noRestrictedSyntaxCommonLib, requireEslintTool, } from '../tools/eslint/eslint.config_utils.mjs'; -import { builtinModules as builtin } from 'node:module'; +import { builtinModules } from 'node:module'; + +const builtin = builtinModules.filter((name) => !name.startsWith('node:')); const globals = requireEslintTool('globals'); diff --git a/doc/node.1 b/doc/node.1 index 3d92fcd7858b98..9f6ad04564fe04 100644 --- a/doc/node.1 +++ b/doc/node.1 @@ -163,10 +163,8 @@ Enable Source Map V3 support for stack traces. .It Fl -entry-url Interpret the entry point as a URL. . -.It Fl -experimental-default-type Ns = Ns Ar type -Interpret as either ES modules or CommonJS modules input via --eval or STDIN, when --input-type is unspecified; -.js or extensionless files with no sibling or parent package.json; -.js or extensionless files whose nearest parent package.json lacks a "type" field, unless under node_modules. +.It Fl -experimental-addon-modules +Enable experimental addon module support. . .It Fl -experimental-import-meta-resolve Enable experimental ES modules support for import.meta.resolve(). @@ -176,30 +174,18 @@ Specify the .Ar module to use as a custom module loader. . -.It Fl -experimental-permission -Enable the experimental permission model. +.It Fl -permission +Enable the permission model. . .It Fl -experimental-shadow-realm Use this flag to enable ShadowRealm support. . -.It Fl -experimental-sqlite -Enable the experimental node:sqlite module. -. .It Fl -experimental-test-coverage Enable code coverage in the test runner. . -.It Fl -experimental-test-isolation Ns = Ns Ar mode -Configures the type of test isolation used in the test runner. -. .It Fl -experimental-test-module-mocks Enable module mocking in the test runner. . -.It Fl -experimental-test-snapshots -Enable snapshot testing in the test runner. -. -.It Fl -experimental-strip-types -Enable experimental type-stripping for TypeScript files. -. .It Fl -experimental-transform-types Enable transformation of TypeScript-only syntax into JavaScript code. . @@ -215,6 +201,12 @@ Enable experimental support for the Web Storage API. .It Fl -no-experimental-repl-await Disable top-level await keyword support in REPL. . +.It Fl -no-experimental-sqlite +Disable the experimental node:sqlite module. +. +.It Fl -no-experimental-strip-types +Disable experimental type-stripping for TypeScript files. +. .It Fl -experimental-vm-modules Enable experimental ES module support in VM module. . @@ -463,6 +455,9 @@ Require a minimum threshold for line coverage (0 - 100). Configures the test runner to exit the process once all known tests have finished executing even if the event loop would otherwise remain active. . +.It Fl -test-isolation Ns = Ns Ar mode +Configures the type of test isolation used in the test runner. +. .It Fl -test-name-pattern A regular expression that configures the test runner to only execute tests whose name matches the provided pattern. diff --git a/eslint.config.mjs b/eslint.config.mjs index f37774bace871d..2e8dd65a1b3733 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -43,16 +43,13 @@ export default [ '**/node_modules/**', 'benchmark/fixtures/**', 'benchmark/tmp/**', - 'doc/**/*.js', 'doc/changelogs/CHANGELOG_V1*.md', - '!doc/api_assets/*.js', '!doc/changelogs/CHANGELOG_V18.md', 'lib/punycode.js', 'test/.tmp.*/**', 'test/addons/??_*', 'test/fixtures/**', 'tools/github_reporter/**', - 'tools/icu/**', ], }, // #endregion diff --git a/lib/_http_client.js b/lib/_http_client.js index 91ba264339fa4f..00b59f357fa45d 100644 --- a/lib/_http_client.js +++ b/lib/_http_client.js @@ -199,7 +199,13 @@ function ClientRequest(input, options, cb) { const host = optsWithoutSignal.host = validateHost(options.hostname, 'hostname') || validateHost(options.host, 'host') || 'localhost'; - const setHost = (options.setHost === undefined || Boolean(options.setHost)); + const setHost = options.setHost !== undefined ? + Boolean(options.setHost) : + options.setDefaultHeaders !== false; + + this._removedConnection = options.setDefaultHeaders === false; + this._removedContLen = options.setDefaultHeaders === false; + this._removedTE = options.setDefaultHeaders === false; this.socketPath = options.socketPath; diff --git a/lib/assert.js b/lib/assert.js index 2a65457b39387e..d8d841da4c7e60 100644 --- a/lib/assert.js +++ b/lib/assert.js @@ -21,22 +21,45 @@ 'use strict'; const { + ArrayBufferIsView, + ArrayBufferPrototypeGetByteLength, + ArrayFrom, + ArrayIsArray, ArrayPrototypeIndexOf, ArrayPrototypeJoin, ArrayPrototypePush, ArrayPrototypeSlice, + DataViewPrototypeGetBuffer, + DataViewPrototypeGetByteLength, + DataViewPrototypeGetByteOffset, Error, + FunctionPrototypeCall, + MapPrototypeGet, + MapPrototypeGetSize, + MapPrototypeHas, NumberIsNaN, ObjectAssign, ObjectIs, ObjectKeys, ObjectPrototypeIsPrototypeOf, + ObjectPrototypeToString, ReflectApply, + ReflectHas, + ReflectOwnKeys, RegExpPrototypeExec, + SafeArrayIterator, + SafeMap, + SafeSet, + SafeWeakSet, + SetPrototypeGetSize, String, StringPrototypeIndexOf, StringPrototypeSlice, StringPrototypeSplit, + Symbol, + SymbolIterator, + TypedArrayPrototypeGetLength, + Uint8Array, } = primordials; const { @@ -50,8 +73,22 @@ const { } = require('internal/errors'); const AssertionError = require('internal/assert/assertion_error'); const { inspect } = require('internal/util/inspect'); -const { isPromise, isRegExp } = require('internal/util/types'); -const { isError, deprecate } = require('internal/util'); +const { Buffer } = require('buffer'); +const { + isArrayBuffer, + isDataView, + isKeyObject, + isPromise, + isRegExp, + isMap, + isSet, + isDate, + isWeakSet, + isWeakMap, + isSharedArrayBuffer, + isAnyArrayBuffer, +} = require('internal/util/types'); +const { isError, deprecate, emitExperimentalWarning } = require('internal/util'); const { innerOk } = require('internal/assert/utils'); const CallTracker = require('internal/assert/calltracker'); @@ -341,6 +378,307 @@ assert.notStrictEqual = function notStrictEqual(actual, expected, message) { } }; +function isSpecial(obj) { + return obj == null || typeof obj !== 'object' || isError(obj) || isRegExp(obj) || isDate(obj); +} + +const typesToCallDeepStrictEqualWith = [ + isKeyObject, isWeakSet, isWeakMap, Buffer.isBuffer, isSharedArrayBuffer, +]; + +function partiallyCompareMaps(actual, expected, comparedObjects) { + if (MapPrototypeGetSize(expected) > MapPrototypeGetSize(actual)) { + return false; + } + + comparedObjects ??= new SafeWeakSet(); + const expectedIterator = FunctionPrototypeCall(SafeMap.prototype[SymbolIterator], expected); + + for (const { 0: key, 1: expectedValue } of expectedIterator) { + if (!MapPrototypeHas(actual, key)) { + return false; + } + + const actualValue = MapPrototypeGet(actual, key); + + if (!compareBranch(actualValue, expectedValue, comparedObjects)) { + return false; + } + } + + return true; +} + +function partiallyCompareArrayBuffersOrViews(actual, expected) { + let actualView, expectedView, expectedViewLength; + + if (!ArrayBufferIsView(actual)) { + let actualViewLength; + + if (isArrayBuffer(actual) && isArrayBuffer(expected)) { + actualViewLength = ArrayBufferPrototypeGetByteLength(actual); + expectedViewLength = ArrayBufferPrototypeGetByteLength(expected); + } else if (isSharedArrayBuffer(actual) && isSharedArrayBuffer(expected)) { + actualViewLength = actual.byteLength; + expectedViewLength = expected.byteLength; + } else { + // Cannot compare ArrayBuffers with SharedArrayBuffers + return false; + } + + if (expectedViewLength > actualViewLength) { + return false; + } + actualView = new Uint8Array(actual); + expectedView = new Uint8Array(expected); + + } else if (isDataView(actual)) { + if (!isDataView(expected)) { + return false; + } + const actualByteLength = DataViewPrototypeGetByteLength(actual); + expectedViewLength = DataViewPrototypeGetByteLength(expected); + if (expectedViewLength > actualByteLength) { + return false; + } + + actualView = new Uint8Array( + DataViewPrototypeGetBuffer(actual), + DataViewPrototypeGetByteOffset(actual), + actualByteLength, + ); + expectedView = new Uint8Array( + DataViewPrototypeGetBuffer(expected), + DataViewPrototypeGetByteOffset(expected), + expectedViewLength, + ); + } else { + if (ObjectPrototypeToString(actual) !== ObjectPrototypeToString(expected)) { + return false; + } + actualView = actual; + expectedView = expected; + expectedViewLength = TypedArrayPrototypeGetLength(expected); + + if (expectedViewLength > TypedArrayPrototypeGetLength(actual)) { + return false; + } + } + + for (let i = 0; i < expectedViewLength; i++) { + if (actualView[i] !== expectedView[i]) { + return false; + } + } + + return true; +} + +function partiallyCompareSets(actual, expected, comparedObjects) { + if (SetPrototypeGetSize(expected) > SetPrototypeGetSize(actual)) { + return false; // `expected` can't be a subset if it has more elements + } + + if (isDeepEqual === undefined) lazyLoadComparison(); + + const actualArray = ArrayFrom(FunctionPrototypeCall(SafeSet.prototype[SymbolIterator], actual)); + const expectedIterator = FunctionPrototypeCall(SafeSet.prototype[SymbolIterator], expected); + const usedIndices = new SafeSet(); + + expectedIteration: for (const expectedItem of expectedIterator) { + for (let actualIdx = 0; actualIdx < actualArray.length; actualIdx++) { + if (!usedIndices.has(actualIdx) && isDeepStrictEqual(actualArray[actualIdx], expectedItem)) { + usedIndices.add(actualIdx); + continue expectedIteration; + } + } + return false; + } + + return true; +} + +const minusZeroSymbol = Symbol('-0'); +const zeroSymbol = Symbol('0'); + +// Helper function to get a unique key for 0, -0 to avoid collisions +function getZeroKey(item) { + if (item === 0) { + return ObjectIs(item, -0) ? minusZeroSymbol : zeroSymbol; + } + return item; +} + +function partiallyCompareArrays(actual, expected, comparedObjects) { + if (expected.length > actual.length) { + return false; + } + + if (isDeepEqual === undefined) lazyLoadComparison(); + + // Create a map to count occurrences of each element in the expected array + const expectedCounts = new SafeMap(); + const safeExpected = new SafeArrayIterator(expected); + + for (const expectedItem of safeExpected) { + // Check if the item is a zero or a -0, as these need to be handled separately + if (expectedItem === 0) { + const zeroKey = getZeroKey(expectedItem); + expectedCounts.set(zeroKey, (expectedCounts.get(zeroKey)?.count || 0) + 1); + } else { + let found = false; + for (const { 0: key, 1: count } of expectedCounts) { + if (isDeepStrictEqual(key, expectedItem)) { + expectedCounts.set(key, count + 1); + found = true; + break; + } + } + if (!found) { + expectedCounts.set(expectedItem, 1); + } + } + } + + const safeActual = new SafeArrayIterator(actual); + + for (const actualItem of safeActual) { + // Check if the item is a zero or a -0, as these need to be handled separately + if (actualItem === 0) { + const zeroKey = getZeroKey(actualItem); + + if (expectedCounts.has(zeroKey)) { + const count = expectedCounts.get(zeroKey); + if (count === 1) { + expectedCounts.delete(zeroKey); + } else { + expectedCounts.set(zeroKey, count - 1); + } + } + } else { + for (const { 0: expectedItem, 1: count } of expectedCounts) { + if (isDeepStrictEqual(expectedItem, actualItem)) { + if (count === 1) { + expectedCounts.delete(expectedItem); + } else { + expectedCounts.set(expectedItem, count - 1); + } + break; + } + } + } + } + + return expectedCounts.size === 0; +} + +/** + * Compares two objects or values recursively to check if they are equal. + * @param {any} actual - The actual value to compare. + * @param {any} expected - The expected value to compare. + * @param {Set} [comparedObjects=new Set()] - Set to track compared objects for handling circular references. + * @returns {boolean} - Returns `true` if the actual value matches the expected value, otherwise `false`. + * @example + * compareBranch({a: 1, b: 2, c: 3}, {a: 1, b: 2}); // true + */ +function compareBranch( + actual, + expected, + comparedObjects, +) { + // Check for Map object equality + if (isMap(actual) && isMap(expected)) { + return partiallyCompareMaps(actual, expected, comparedObjects); + } + + if ( + ArrayBufferIsView(actual) || + isAnyArrayBuffer(actual) || + ArrayBufferIsView(expected) || + isAnyArrayBuffer(expected) + ) { + return partiallyCompareArrayBuffersOrViews(actual, expected); + } + + for (const type of typesToCallDeepStrictEqualWith) { + if (type(actual) || type(expected)) { + if (isDeepStrictEqual === undefined) lazyLoadComparison(); + return isDeepStrictEqual(actual, expected); + } + } + + // Check for Set object equality + if (isSet(actual) && isSet(expected)) { + return partiallyCompareSets(actual, expected, comparedObjects); + } + + // Check if expected array is a subset of actual array + if (ArrayIsArray(actual) && ArrayIsArray(expected)) { + return partiallyCompareArrays(actual, expected, comparedObjects); + } + + // Comparison done when at least one of the values is not an object + if (isSpecial(actual) || isSpecial(expected)) { + if (isDeepEqual === undefined) { + lazyLoadComparison(); + } + return isDeepStrictEqual(actual, expected); + } + + // Use Reflect.ownKeys() instead of Object.keys() to include symbol properties + const keysExpected = ReflectOwnKeys(expected); + + comparedObjects ??= new SafeWeakSet(); + + // Handle circular references + if (comparedObjects.has(actual)) { + return true; + } + comparedObjects.add(actual); + + // Check if all expected keys and values match + for (let i = 0; i < keysExpected.length; i++) { + const key = keysExpected[i]; + assert( + ReflectHas(actual, key), + new AssertionError({ message: `Expected key ${String(key)} not found in actual object` }), + ); + if (!compareBranch(actual[key], expected[key], comparedObjects)) { + return false; + } + } + + return true; +} + +/** + * The strict equivalence assertion test between two objects + * @param {any} actual + * @param {any} expected + * @param {string | Error} [message] + * @returns {void} + */ +assert.partialDeepStrictEqual = function partialDeepStrictEqual( + actual, + expected, + message, +) { + emitExperimentalWarning('assert.partialDeepStrictEqual'); + if (arguments.length < 2) { + throw new ERR_MISSING_ARGS('actual', 'expected'); + } + + if (!compareBranch(actual, expected)) { + innerFail({ + actual, + expected, + message, + operator: 'partialDeepStrictEqual', + stackStartFn: partialDeepStrictEqual, + }); + } +}; + class Comparison { constructor(obj, keys, actual) { for (const key of keys) { diff --git a/lib/buffer.js b/lib/buffer.js index 88625299bced5e..22bbb95eaf79e6 100644 --- a/lib/buffer.js +++ b/lib/buffer.js @@ -35,6 +35,7 @@ const { NumberMIN_SAFE_INTEGER, ObjectDefineProperties, ObjectDefineProperty, + ObjectPrototypeHasOwnProperty, ObjectSetPrototypeOf, RegExpPrototypeSymbolReplace, StringPrototypeCharCodeAt, @@ -911,7 +912,14 @@ Buffer.prototype[customInspectSymbol] = function inspect(recurseTimes, ctx) { }), 27, -2); } } - return `<${this.constructor.name} ${str}>`; + let constructorName = 'Buffer'; + try { + const { constructor } = this; + if (typeof constructor === 'function' && ObjectPrototypeHasOwnProperty(constructor, 'name')) { + constructorName = constructor.name; + } + } catch { /* Ignore error and use default name */ } + return `<${constructorName} ${str}>`; }; Buffer.prototype.inspect = Buffer.prototype[customInspectSymbol]; diff --git a/lib/dgram.js b/lib/dgram.js index 74dd83889990ca..b4c5db6439784a 100644 --- a/lib/dgram.js +++ b/lib/dgram.js @@ -41,6 +41,7 @@ const { ERR_BUFFER_OUT_OF_BOUNDS, ERR_INVALID_ARG_TYPE, ERR_INVALID_FD_TYPE, + ERR_IP_BLOCKED, ERR_MISSING_ARGS, ERR_SOCKET_ALREADY_BOUND, ERR_SOCKET_BAD_BUFFER_SIZE, @@ -55,12 +56,14 @@ const { _createSocketHandle, newHandle, } = require('internal/dgram'); +const { isIP } = require('internal/net'); const { isInt32, validateAbortSignal, validateString, validateNumber, validatePort, + validateUint32, } = require('internal/validators'); const { Buffer } = require('buffer'); const { deprecate, guessHandleType, promisify } = require('internal/util'); @@ -98,20 +101,44 @@ let _cluster = null; function lazyLoadCluster() { return _cluster ??= require('cluster'); } +let _blockList = null; +function lazyLoadBlockList() { + return _blockList ??= require('internal/blocklist').BlockList; +} function Socket(type, listener) { FunctionPrototypeCall(EventEmitter, this); let lookup; let recvBufferSize; let sendBufferSize; + let receiveBlockList; + let sendBlockList; let options; if (type !== null && typeof type === 'object') { options = type; type = options.type; lookup = options.lookup; + if (options.recvBufferSize) { + validateUint32(options.recvBufferSize, 'options.recvBufferSize'); + } + if (options.sendBufferSize) { + validateUint32(options.sendBufferSize, 'options.sendBufferSize'); + } recvBufferSize = options.recvBufferSize; sendBufferSize = options.sendBufferSize; + if (options.receiveBlockList) { + if (!lazyLoadBlockList().isBlockList(options.receiveBlockList)) { + throw new ERR_INVALID_ARG_TYPE('options.receiveBlockList', 'net.BlockList', options.receiveBlockList); + } + receiveBlockList = options.receiveBlockList; + } + if (options.sendBlockList) { + if (!lazyLoadBlockList().isBlockList(options.sendBlockList)) { + throw new ERR_INVALID_ARG_TYPE('options.sendBlockList', 'net.BlockList', options.sendBlockList); + } + sendBlockList = options.sendBlockList; + } } const handle = newHandle(type, lookup); @@ -134,6 +161,8 @@ function Socket(type, listener) { ipv6Only: options?.ipv6Only, recvBufferSize, sendBufferSize, + receiveBlockList, + sendBlockList, }; if (options?.signal !== undefined) { @@ -432,7 +461,9 @@ function doConnect(ex, self, ip, address, port, callback) { const state = self[kStateSymbol]; if (!state.handle) return; - + if (!ex && state.sendBlockList?.check(ip, `ipv${isIP(ip)}`)) { + ex = new ERR_IP_BLOCKED(ip); + } if (!ex) { const err = state.handle.connect(ip, port); if (err) { @@ -696,6 +727,13 @@ function doSend(ex, self, ip, list, address, port, callback) { return; } + if (ip && state.sendBlockList?.check(ip, `ipv${isIP(ip)}`)) { + if (callback) { + process.nextTick(callback, new ERR_IP_BLOCKED(ip)); + } + return; + } + const req = new SendWrap(); req.list = list; // Keep reference alive. req.address = address; @@ -944,6 +982,10 @@ function onMessage(nread, handle, buf, rinfo) { if (nread < 0) { return self.emit('error', new ErrnoException(nread, 'recvmsg')); } + if (self[kStateSymbol]?.receiveBlockList?.check(rinfo.address, + rinfo.family?.toLocaleLowerCase())) { + return; + } rinfo.size = buf.length; // compatibility self.emit('message', buf, rinfo); } diff --git a/lib/eslint.config_partial.mjs b/lib/eslint.config_partial.mjs index 78d9f409a37956..c4df9b191d8d05 100644 --- a/lib/eslint.config_partial.mjs +++ b/lib/eslint.config_partial.mjs @@ -13,6 +13,15 @@ const noRestrictedSyntax = [ selector: "CallExpression[callee.object.name='assert']:not([callee.property.name='ok']):not([callee.property.name='fail']):not([callee.property.name='ifError'])", message: 'Only use simple assertions', }, + { + // Forbids usages of `btoa` that are not caught by no-restricted-globals, like: + // ``` + // const { btoa } = internalBinding('buffer'); + // btoa('...'); + // ``` + selector: "CallExpression[callee.property.name='btoa'], CallExpression[callee.name='btoa']", + message: "`btoa` supports only latin-1 charset, use Buffer.from(str).toString('base64') instead", + }, { selector: 'NewExpression[callee.name=/Error$/]:not([callee.name=/^(AssertionError|NghttpError|AbortError|NodeAggregateError)$/])', message: "Use an error exported by 'internal/errors' instead.", @@ -347,6 +356,11 @@ export default [ name: 'SubtleCrypto', message: "Use `const { SubtleCrypto } = require('internal/crypto/webcrypto');` instead of the global.", }, + // Float16Array is not available in primordials because it's only available with --js-float16array CLI flag. + { + name: 'Float16Array', + message: 'Use `const { Float16Array } = globalThis;` instead of the global.', + }, ], 'no-restricted-modules': [ 'error', diff --git a/lib/events.js b/lib/events.js index e8fd3bbb79259e..50cc720b1247ba 100644 --- a/lib/events.js +++ b/lib/events.js @@ -276,12 +276,6 @@ ObjectDefineProperty(EventEmitter, 'defaultMaxListeners', { }, }); -function hasEventListener(self, type) { - if (type === undefined) - return self._events !== undefined; - return self._events !== undefined && self._events[type] !== undefined; -}; - ObjectDefineProperties(EventEmitter, { kMaxEventTargetListeners: { __proto__: null, @@ -675,11 +669,13 @@ EventEmitter.prototype.removeListener = function removeListener(type, listener) { checkListener(listener); - if (!hasEventListener(this, type)) + const events = this._events; + if (events === undefined) return this; - const events = this._events; const list = events[type]; + if (list === undefined) + return this; if (list === listener || list.listener === listener) { this._eventsCount -= 1; @@ -733,9 +729,9 @@ EventEmitter.prototype.off = EventEmitter.prototype.removeListener; */ EventEmitter.prototype.removeAllListeners = function removeAllListeners(type) { - if (!hasEventListener(this)) - return this; const events = this._events; + if (events === undefined) + return this; // Not listening for removeListener, no need to emit if (events.removeListener === undefined) { @@ -780,10 +776,14 @@ EventEmitter.prototype.removeAllListeners = }; function _listeners(target, type, unwrap) { - if (!hasEventListener(target, type)) + const events = target._events; + + if (events === undefined) return []; - const evlistener = target._events[type]; + const evlistener = events[type]; + if (evlistener === undefined) + return []; if (typeof evlistener === 'function') return unwrap ? [evlistener.listener || evlistener] : [evlistener]; diff --git a/lib/fs.js b/lib/fs.js index 13aeb30be6cea9..af72ac36144c55 100644 --- a/lib/fs.js +++ b/lib/fs.js @@ -164,6 +164,7 @@ let ReadStream; let WriteStream; let rimraf; let kResistStopPropagation; +let ReadFileContext; // These have to be separate because of how graceful-fs happens to do it's // monkeypatching. @@ -365,7 +366,7 @@ function readFile(path, options, callback) { callback ||= options; validateFunction(callback, 'cb'); options = getOptions(options, { flag: 'r' }); - const ReadFileContext = require('internal/fs/read/context'); + ReadFileContext ??= require('internal/fs/read/context'); const context = new ReadFileContext(callback, options.encoding); context.isUserFd = isFd(path); // File descriptor ownership @@ -1369,6 +1370,102 @@ function mkdirSync(path, options) { } } +/* + * An recursive algorithm for reading the entire contents of the `basePath` directory. + * This function does not validate `basePath` as a directory. It is passed directly to + * `binding.readdir`. + * @param {string} basePath + * @param {{ encoding: string, withFileTypes: boolean }} options + * @param {( + * err?: Error, + * files?: string[] | Buffer[] | Dirent[] + * ) => any} callback + * @returns {void} +*/ +function readdirRecursive(basePath, options, callback) { + const context = { + withFileTypes: Boolean(options.withFileTypes), + encoding: options.encoding, + basePath, + readdirResults: [], + pathsQueue: [basePath], + }; + + let i = 0; + + function read(path) { + const req = new FSReqCallback(); + req.oncomplete = (err, result) => { + if (err) { + callback(err); + return; + } + + if (result === undefined) { + callback(null, context.readdirResults); + return; + } + + processReaddirResult({ + result, + currentPath: path, + context, + }); + + if (i < context.pathsQueue.length) { + read(context.pathsQueue[i++]); + } else { + callback(null, context.readdirResults); + } + }; + + binding.readdir( + path, + context.encoding, + context.withFileTypes, + req, + ); + } + + read(context.pathsQueue[i++]); +} + +// Calling `readdir` with `withFileTypes=true`, the result is an array of arrays. +// The first array is the names, and the second array is the types. +// They are guaranteed to be the same length; hence, setting `length` to the length +// of the first array within the result. +const processReaddirResult = (args) => (args.context.withFileTypes ? handleDirents(args) : handleFilePaths(args)); + +function handleDirents({ result, currentPath, context }) { + const { 0: names, 1: types } = result; + const { length } = names; + + for (let i = 0; i < length; i++) { + // Avoid excluding symlinks, as they are not directories. + // Refs: https://github.com/nodejs/node/issues/52663 + const fullPath = pathModule.join(currentPath, names[i]); + const dirent = getDirent(currentPath, names[i], types[i]); + ArrayPrototypePush(context.readdirResults, dirent); + + if (dirent.isDirectory() || binding.internalModuleStat(binding, fullPath) === 1) { + ArrayPrototypePush(context.pathsQueue, fullPath); + } + } +} + +function handleFilePaths({ result, currentPath, context }) { + for (let i = 0; i < result.length; i++) { + const resultPath = pathModule.join(currentPath, result[i]); + const relativeResultPath = pathModule.relative(context.basePath, resultPath); + const stat = binding.internalModuleStat(binding, resultPath); + ArrayPrototypePush(context.readdirResults, relativeResultPath); + + if (stat === 1) { + ArrayPrototypePush(context.pathsQueue, resultPath); + } + } +} + /** * An iterative algorithm for reading the entire contents of the `basePath` directory. * This function does not validate `basePath` as a directory. It is passed directly to @@ -1378,55 +1475,37 @@ function mkdirSync(path, options) { * @returns {string[] | Dirent[]} */ function readdirSyncRecursive(basePath, options) { - const withFileTypes = Boolean(options.withFileTypes); - const encoding = options.encoding; - - const readdirResults = []; - const pathsQueue = [basePath]; + const context = { + withFileTypes: Boolean(options.withFileTypes), + encoding: options.encoding, + basePath, + readdirResults: [], + pathsQueue: [basePath], + }; function read(path) { const readdirResult = binding.readdir( path, - encoding, - withFileTypes, + context.encoding, + context.withFileTypes, ); if (readdirResult === undefined) { return; } - if (withFileTypes) { - // Calling `readdir` with `withFileTypes=true`, the result is an array of arrays. - // The first array is the names, and the second array is the types. - // They are guaranteed to be the same length; hence, setting `length` to the length - // of the first array within the result. - const length = readdirResult[0].length; - for (let i = 0; i < length; i++) { - const dirent = getDirent(path, readdirResult[0][i], readdirResult[1][i]); - ArrayPrototypePush(readdirResults, dirent); - if (dirent.isDirectory()) { - ArrayPrototypePush(pathsQueue, pathModule.join(dirent.parentPath, dirent.name)); - } - } - } else { - for (let i = 0; i < readdirResult.length; i++) { - const resultPath = pathModule.join(path, readdirResult[i]); - const relativeResultPath = pathModule.relative(basePath, resultPath); - const stat = binding.internalModuleStat(binding, resultPath); - ArrayPrototypePush(readdirResults, relativeResultPath); - // 1 indicates directory - if (stat === 1) { - ArrayPrototypePush(pathsQueue, resultPath); - } - } - } + processReaddirResult({ + result: readdirResult, + currentPath: path, + context, + }); } - for (let i = 0; i < pathsQueue.length; i++) { - read(pathsQueue[i]); + for (let i = 0; i < context.pathsQueue.length; i++) { + read(context.pathsQueue[i]); } - return readdirResults; + return context.readdirResults; } /** @@ -1452,7 +1531,10 @@ function readdir(path, options, callback) { } if (options.recursive) { - callback(null, readdirSyncRecursive(path, options)); + // Make shallow copy to prevent mutating options from affecting results + options = copyObject(options); + + readdirRecursive(path, options, callback); return; } diff --git a/lib/internal/abort_controller.js b/lib/internal/abort_controller.js index b812f588c23e99..8ec9034a4f9352 100644 --- a/lib/internal/abort_controller.js +++ b/lib/internal/abort_controller.js @@ -28,6 +28,7 @@ const { kResistStopPropagation, kWeakHandler, } = require('internal/event_target'); +const { kMaxEventTargetListeners } = require('events'); const { customInspectSymbol, kEmptyObject, @@ -95,8 +96,21 @@ const dependantSignalsCleanupRegistry = new SafeFinalizationRegistry((signalWeak } }); }); + const gcPersistentSignals = new SafeSet(); +const sourceSignalsCleanupRegistry = new SafeFinalizationRegistry(({ sourceSignalRef, composedSignalRef }) => { + const composedSignal = composedSignalRef.deref(); + if (composedSignal !== undefined) { + composedSignal[kSourceSignals].delete(sourceSignalRef); + + if (composedSignal[kSourceSignals].size === 0) { + // This signal will no longer abort. There's no need to keep it in the gcPersistentSignals set. + gcPersistentSignals.delete(composedSignal); + } + } +}); + const kAborted = Symbol('kAborted'); const kReason = Symbol('kReason'); const kCloneData = Symbol('kCloneData'); @@ -164,6 +178,7 @@ class AbortSignal extends EventTarget { } super(); + this[kMaxEventTargetListeners] = 0; const { aborted = false, reason = undefined, @@ -258,6 +273,10 @@ class AbortSignal extends EventTarget { resultSignal[kSourceSignals].add(signalWeakRef); signal[kDependantSignals].add(resultSignalWeakRef); dependantSignalsCleanupRegistry.register(resultSignal, signalWeakRef); + sourceSignalsCleanupRegistry.register(signal, { + sourceSignalRef: signalWeakRef, + composedSignalRef: resultSignalWeakRef, + }); } else if (!signal[kSourceSignals]) { continue; } else { @@ -275,6 +294,10 @@ class AbortSignal extends EventTarget { resultSignal[kSourceSignals].add(sourceSignalWeakRef); sourceSignal[kDependantSignals].add(resultSignalWeakRef); dependantSignalsCleanupRegistry.register(resultSignal, sourceSignalWeakRef); + sourceSignalsCleanupRegistry.register(signal, { + sourceSignalRef: sourceSignalWeakRef, + composedSignalRef: resultSignalWeakRef, + }); } } } @@ -434,6 +457,7 @@ class AbortController { */ get signal() { this.#signal ??= new AbortSignal(kDontThrowSymbol); + return this.#signal; } diff --git a/lib/internal/blocklist.js b/lib/internal/blocklist.js index d4eb35c9a70cb8..a992a6b8f0703c 100644 --- a/lib/internal/blocklist.js +++ b/lib/internal/blocklist.js @@ -43,6 +43,15 @@ class BlockList { this[kHandle][owner_symbol] = this; } + /** + * Returns true if the value is a BlockList + * @param {any} value + * @returns {boolean} + */ + static isBlockList(value) { + return value?.[kHandle] !== undefined; + } + [kInspect](depth, options) { if (depth < 0) return this; diff --git a/lib/internal/bootstrap/node.js b/lib/internal/bootstrap/node.js index b8c47ee0f54bbd..de2f0e00e14092 100644 --- a/lib/internal/bootstrap/node.js +++ b/lib/internal/bootstrap/node.js @@ -178,6 +178,8 @@ const rawMethods = internalBinding('process_methods'); process.availableMemory = rawMethods.availableMemory; process.kill = wrapped.kill; process.exit = wrapped.exit; + process.ref = perThreadSetup.ref; + process.unref = perThreadSetup.unref; let finalizationMod; ObjectDefineProperty(process, 'finalization', { diff --git a/lib/internal/bootstrap/realm.js b/lib/internal/bootstrap/realm.js index c11f70dd6bf329..7e87f1ad1ab5b6 100644 --- a/lib/internal/bootstrap/realm.js +++ b/lib/internal/bootstrap/realm.js @@ -54,6 +54,7 @@ const { ArrayPrototypeIncludes, ArrayPrototypeMap, ArrayPrototypePush, + ArrayPrototypePushApply, ArrayPrototypeSlice, Error, ObjectDefineProperty, @@ -320,14 +321,16 @@ class BuiltinModule { ); } - static getCanBeRequiredByUsersWithoutSchemeList() { - return ArrayFrom(canBeRequiredByUsersWithoutSchemeList); - } - static getSchemeOnlyModuleNames() { return ArrayFrom(schemelessBlockList); } + static getAllBuiltinModuleIds() { + const allBuiltins = ArrayFrom(canBeRequiredByUsersWithoutSchemeList); + ArrayPrototypePushApply(allBuiltins, ArrayFrom(schemelessBlockList, (x) => `node:${x}`)); + return allBuiltins; + } + // Used by user-land module loaders to compile and load builtins. compileForPublicLoader() { if (!BuiltinModule.canBeRequiredByUsers(this.id)) { diff --git a/lib/internal/crypto/diffiehellman.js b/lib/internal/crypto/diffiehellman.js index 410759414f635d..9ebd9766f6bc8c 100644 --- a/lib/internal/crypto/diffiehellman.js +++ b/lib/internal/crypto/diffiehellman.js @@ -5,6 +5,7 @@ const { MathCeil, ObjectDefineProperty, SafeSet, + Uint8Array, } = primordials; const { Buffer } = require('buffer'); @@ -295,6 +296,8 @@ function diffieHellman(options) { return statelessDH(privateKey[kHandle], publicKey[kHandle]); } +let masks; + // The ecdhDeriveBits function is part of the Web Crypto API and serves both // deriveKeys and deriveBits functions. async function ecdhDeriveBits(algorithm, baseKey, length) { @@ -341,18 +344,25 @@ async function ecdhDeriveBits(algorithm, baseKey, length) { // If the length is not a multiple of 8 the nearest ceiled // multiple of 8 is sliced. - length = MathCeil(length / 8); - const { byteLength } = bits; + const sliceLength = MathCeil(length / 8); + const { byteLength } = bits; // If the length is larger than the derived secret, throw. - // Otherwise, we either return the secret or a truncated - // slice. - if (byteLength < length) + if (byteLength < sliceLength) throw lazyDOMException('derived bit length is too small', 'OperationError'); - return length === byteLength ? - bits : - ArrayBufferPrototypeSlice(bits, 0, length); + const slice = ArrayBufferPrototypeSlice(bits, 0, sliceLength); + + const mod = length % 8; + if (mod === 0) + return slice; + + // eslint-disable-next-line no-sparse-arrays + masks ||= [, 0b10000000, 0b11000000, 0b11100000, 0b11110000, 0b11111000, 0b11111100, 0b11111110]; + + const masked = new Uint8Array(slice); + masked[sliceLength - 1] = masked[sliceLength - 1] & masks[mod]; + return masked.buffer; } module.exports = { diff --git a/lib/internal/crypto/keys.js b/lib/internal/crypto/keys.js index 64f8bedc48281b..96771f09c8c941 100644 --- a/lib/internal/crypto/keys.js +++ b/lib/internal/crypto/keys.js @@ -1,7 +1,6 @@ 'use strict'; const { - ArrayFrom, ArrayPrototypeSlice, ObjectDefineProperties, ObjectDefineProperty, @@ -781,7 +780,7 @@ class CryptoKey { get usages() { if (!(this instanceof CryptoKey)) throw new ERR_INVALID_THIS('CryptoKey'); - return ArrayFrom(this[kKeyUsages]); + return this[kKeyUsages]; } } diff --git a/lib/internal/crypto/util.js b/lib/internal/crypto/util.js index a1d7e84dae36bc..3cf6599a186c3f 100644 --- a/lib/internal/crypto/util.js +++ b/lib/internal/crypto/util.js @@ -189,18 +189,22 @@ const kSupportedAlgorithms = { 'AES-GCM': 'AesKeyGenParams', 'AES-KW': 'AesKeyGenParams', 'HMAC': 'HmacKeyGenParams', + 'Ed25519': null, + 'X25519': null, }, 'sign': { 'RSASSA-PKCS1-v1_5': null, 'RSA-PSS': 'RsaPssParams', 'ECDSA': 'EcdsaParams', 'HMAC': null, + 'Ed25519': null, }, 'verify': { 'RSASSA-PKCS1-v1_5': null, 'RSA-PSS': 'RsaPssParams', 'ECDSA': 'EcdsaParams', 'HMAC': null, + 'Ed25519': null, }, 'importKey': { 'RSASSA-PKCS1-v1_5': 'RsaHashedImportParams', @@ -215,11 +219,14 @@ const kSupportedAlgorithms = { 'AES-CBC': null, 'AES-GCM': null, 'AES-KW': null, + 'Ed25519': null, + 'X25519': null, }, 'deriveBits': { 'HKDF': 'HkdfParams', 'PBKDF2': 'Pbkdf2Params', 'ECDH': 'EcdhKeyDeriveParams', + 'X25519': 'EcdhKeyDeriveParams', }, 'encrypt': { 'RSA-OAEP': 'RsaOaepParams', @@ -251,17 +258,6 @@ const kSupportedAlgorithms = { }; const experimentalAlgorithms = ObjectEntries({ - 'X25519': { - generateKey: null, - importKey: null, - deriveBits: 'EcdhKeyDeriveParams', - }, - 'Ed25519': { - generateKey: null, - sign: null, - verify: null, - importKey: null, - }, 'X448': { generateKey: null, importKey: null, diff --git a/lib/internal/encoding.js b/lib/internal/encoding.js index 252eaa75fac22b..b2ca3c612bf6ef 100644 --- a/lib/internal/encoding.js +++ b/lib/internal/encoding.js @@ -29,6 +29,7 @@ const kDecoder = Symbol('decoder'); const kEncoder = Symbol('encoder'); const kFatal = Symbol('kFatal'); const kUTF8FastPath = Symbol('kUTF8FastPath'); +const kLatin1FastPath = Symbol('kLatin1FastPath'); const kIgnoreBOM = Symbol('kIgnoreBOM'); const { @@ -55,6 +56,7 @@ const { encodeIntoResults, encodeUtf8String, decodeUTF8, + decodeLatin1, } = binding; const { Buffer } = require('buffer'); @@ -419,9 +421,10 @@ function makeTextDecoderICU() { this[kFatal] = Boolean(options?.fatal); // Only support fast path for UTF-8. this[kUTF8FastPath] = enc === 'utf-8'; + this[kLatin1FastPath] = enc === 'windows-1252'; this[kHandle] = undefined; - if (!this[kUTF8FastPath]) { + if (!this[kUTF8FastPath] && !this[kLatin1FastPath]) { this.#prepareConverter(); } } @@ -438,11 +441,16 @@ function makeTextDecoderICU() { validateDecoder(this); this[kUTF8FastPath] &&= !(options?.stream); + this[kLatin1FastPath] &&= !(options?.stream); if (this[kUTF8FastPath]) { return decodeUTF8(input, this[kIgnoreBOM], this[kFatal]); } + if (this[kLatin1FastPath]) { + return decodeLatin1(input, this[kIgnoreBOM], this[kFatal]); + } + this.#prepareConverter(); validateObject(options, 'options', kValidateObjectAllowObjectsAndNull); diff --git a/lib/internal/errors.js b/lib/internal/errors.js index 9045046c100308..d990f8d5a106aa 100644 --- a/lib/internal/errors.js +++ b/lib/internal/errors.js @@ -1551,6 +1551,9 @@ E('ERR_IPC_CHANNEL_CLOSED', 'Channel closed', Error); E('ERR_IPC_DISCONNECTED', 'IPC channel is already disconnected', Error); E('ERR_IPC_ONE_PIPE', 'Child process can have only one IPC pipe', Error); E('ERR_IPC_SYNC_FORK', 'IPC cannot be used with synchronous forks', Error); +E('ERR_IP_BLOCKED', function(ip) { + return `IP(${ip}) is blocked by net.BlockList`; +}, Error); E( 'ERR_LOADER_CHAIN_INCOMPLETE', '"%s" did not call the next hook in its chain and did not' + @@ -1647,9 +1650,12 @@ E('ERR_PARSE_ARGS_UNKNOWN_OPTION', (option, allowPositionals) => { E('ERR_PERFORMANCE_INVALID_TIMESTAMP', '%d is not a valid timestamp', TypeError); E('ERR_PERFORMANCE_MEASURE_INVALID_OPTIONS', '%s', TypeError); +E('ERR_QUIC_APPLICATION_ERROR', 'A QUIC application error occurred. %d [%s]', Error); E('ERR_QUIC_CONNECTION_FAILED', 'QUIC connection failed', Error); E('ERR_QUIC_ENDPOINT_CLOSED', 'QUIC endpoint closed: %s (%d)', Error); E('ERR_QUIC_OPEN_STREAM_FAILED', 'Failed to open QUIC stream', Error); +E('ERR_QUIC_TRANSPORT_ERROR', 'A QUIC transport error occurred. %d [%s]', Error); +E('ERR_QUIC_VERSION_NEGOTIATION_ERROR', 'The QUIC session requires version negotiation', Error); E('ERR_REQUIRE_ASYNC_MODULE', 'require() cannot be used on an ESM ' + 'graph with top-level await. Use import() instead. To see where the' + ' top-level await comes from, use --experimental-print-required-tla.', Error); diff --git a/lib/internal/fs/glob.js b/lib/internal/fs/glob.js index 0f4939f7e1ba0d..6876b3d5721c67 100644 --- a/lib/internal/fs/glob.js +++ b/lib/internal/fs/glob.js @@ -650,7 +650,30 @@ class Glob { } } +/** + * Check if a path matches a glob pattern + * @param {string} path the path to check + * @param {string} pattern the glob pattern to match + * @param {boolean} windows whether the path is on a Windows system, defaults to `isWindows` + * @returns {boolean} + */ +function matchGlobPattern(path, pattern, windows = isWindows) { + validateString(path, 'path'); + validateString(pattern, 'pattern'); + return lazyMinimatch().minimatch(path, pattern, { + kEmptyObject, + nocase: isMacOS || isWindows, + windowsPathsNoEscape: true, + nonegate: true, + nocomment: true, + optimizationLevel: 2, + platform: windows ? 'win32' : 'posix', + nocaseMagicOnly: true, + }); +} + module.exports = { __proto__: null, Glob, + matchGlobPattern, }; diff --git a/lib/internal/fs/promises.js b/lib/internal/fs/promises.js index 41be9a2a213b13..404f1f65edeb6c 100644 --- a/lib/internal/fs/promises.js +++ b/lib/internal/fs/promises.js @@ -944,6 +944,10 @@ async function readdirRecursive(originalPath, options) { async function readdir(path, options) { options = getOptions(options); + + // Make shallow copy to prevent mutating options from affecting results + options = copyObject(options); + path = getValidatedPath(path); if (options.recursive) { return readdirRecursive(path, options); diff --git a/lib/internal/http2/core.js b/lib/internal/http2/core.js index 6ce633092bca4b..b41e1baee24644 100644 --- a/lib/internal/http2/core.js +++ b/lib/internal/http2/core.js @@ -3136,9 +3136,13 @@ function initializeOptions(options) { function initializeTLSOptions(options, servername) { options = initializeOptions(options); - options.ALPNProtocols = ['h2']; - if (options.allowHTTP1 === true) - options.ALPNProtocols.push('http/1.1'); + + if (!options.ALPNCallback) { + options.ALPNProtocols = ['h2']; + if (options.allowHTTP1 === true) + options.ALPNProtocols.push('http/1.1'); + } + if (servername !== undefined && !options.servername) options.servername = servername; return options; diff --git a/lib/internal/inspector/network.js b/lib/internal/inspector/network.js new file mode 100644 index 00000000000000..18424bee569302 --- /dev/null +++ b/lib/internal/inspector/network.js @@ -0,0 +1,31 @@ +'use strict'; + +const { + NumberMAX_SAFE_INTEGER, + Symbol, +} = primordials; + +const { now } = require('internal/perf/utils'); +const kInspectorRequestId = Symbol('kInspectorRequestId'); + +/** + * Return a monotonically increasing time in seconds since an arbitrary point in the past. + * @returns {number} + */ +function getMonotonicTime() { + return now() / 1000; +} + +let requestId = 0; +function getNextRequestId() { + if (requestId === NumberMAX_SAFE_INTEGER) { + requestId = 0; + } + return `node-network-event-${++requestId}`; +}; + +module.exports = { + kInspectorRequestId, + getMonotonicTime, + getNextRequestId, +}; diff --git a/lib/internal/inspector/network_http.js b/lib/internal/inspector/network_http.js new file mode 100644 index 00000000000000..87a33b419b1aed --- /dev/null +++ b/lib/internal/inspector/network_http.js @@ -0,0 +1,132 @@ +'use strict'; + +const { + ArrayIsArray, + DateNow, + ObjectEntries, + String, + Symbol, +} = primordials; + +const { + kInspectorRequestId, + getMonotonicTime, + getNextRequestId, +} = require('internal/inspector/network'); +const dc = require('diagnostics_channel'); +const { Network } = require('inspector'); + +const kResourceType = 'Other'; +const kRequestUrl = Symbol('kRequestUrl'); + +// Convert a Headers object (Map) to a plain object (Map) +const convertHeaderObject = (headers = {}) => { + // The 'host' header that contains the host and port of the URL. + let host; + const dict = {}; + for (const { 0: key, 1: value } of ObjectEntries(headers)) { + if (key.toLowerCase() === 'host') { + host = value; + } + if (typeof value === 'string') { + dict[key] = value; + } else if (ArrayIsArray(value)) { + if (key.toLowerCase() === 'cookie') dict[key] = value.join('; '); + // ChromeDevTools frontend treats 'set-cookie' as a special case + // https://github.com/ChromeDevTools/devtools-frontend/blob/4275917f84266ef40613db3c1784a25f902ea74e/front_end/core/sdk/NetworkRequest.ts#L1368 + else if (key.toLowerCase() === 'set-cookie') dict[key] = value.join('\n'); + else dict[key] = value.join(', '); + } else { + dict[key] = String(value); + } + } + return [host, dict]; +}; + +/** + * When a client request starts, emit Network.requestWillBeSent event. + * https://chromedevtools.github.io/devtools-protocol/1-3/Network/#event-requestWillBeSent + * @param {{ request: import('http').ClientRequest }} event + */ +function onClientRequestStart({ request }) { + request[kInspectorRequestId] = getNextRequestId(); + + const { 0: host, 1: headers } = convertHeaderObject(request.getHeaders()); + const url = `${request.protocol}//${host}${request.path}`; + request[kRequestUrl] = url; + + Network.requestWillBeSent({ + requestId: request[kInspectorRequestId], + timestamp: getMonotonicTime(), + wallTime: DateNow(), + request: { + url, + method: request.method, + headers, + }, + }); +} + +/** + * When a client request errors, emit Network.loadingFailed event. + * https://chromedevtools.github.io/devtools-protocol/1-3/Network/#event-loadingFailed + * @param {{ request: import('http').ClientRequest, error: any }} event + */ +function onClientRequestError({ request, error }) { + if (typeof request[kInspectorRequestId] !== 'string') { + return; + } + Network.loadingFailed({ + requestId: request[kInspectorRequestId], + timestamp: getMonotonicTime(), + type: kResourceType, + errorText: error.message, + }); +} + +/** + * When response headers are received, emit Network.responseReceived event. + * https://chromedevtools.github.io/devtools-protocol/1-3/Network/#event-responseReceived + * @param {{ request: import('http').ClientRequest, error: any }} event + */ +function onClientResponseFinish({ request, response }) { + if (typeof request[kInspectorRequestId] !== 'string') { + return; + } + Network.responseReceived({ + requestId: request[kInspectorRequestId], + timestamp: getMonotonicTime(), + type: kResourceType, + response: { + url: request[kRequestUrl], + status: response.statusCode, + statusText: response.statusMessage ?? '', + headers: convertHeaderObject(response.headers)[1], + }, + }); + + // Wait until the response body is consumed by user code. + response.once('end', () => { + Network.loadingFinished({ + requestId: request[kInspectorRequestId], + timestamp: getMonotonicTime(), + }); + }); +} + +function enable() { + dc.subscribe('http.client.request.start', onClientRequestStart); + dc.subscribe('http.client.request.error', onClientRequestError); + dc.subscribe('http.client.response.finish', onClientResponseFinish); +} + +function disable() { + dc.unsubscribe('http.client.request.start', onClientRequestStart); + dc.unsubscribe('http.client.request.error', onClientRequestError); + dc.unsubscribe('http.client.response.finish', onClientResponseFinish); +} + +module.exports = { + enable, + disable, +}; diff --git a/lib/internal/inspector_network_tracking.js b/lib/internal/inspector_network_tracking.js index de325baf77eb42..9158bb48f745f8 100644 --- a/lib/internal/inspector_network_tracking.js +++ b/lib/internal/inspector_network_tracking.js @@ -1,102 +1,15 @@ 'use strict'; -const { - ArrayIsArray, - DateNow, - ObjectEntries, - String, -} = primordials; - -let dc; -let Network; - -let requestId = 0; -const getNextRequestId = () => `node-network-event-${++requestId}`; - -// Convert a Headers object (Map) to a plain object (Map) -const headerObjectToDictionary = (headers = {}) => { - const dict = {}; - for (const { 0: key, 1: value } of ObjectEntries(headers)) { - if (typeof value === 'string') { - dict[key] = value; - } else if (ArrayIsArray(value)) { - if (key.toLowerCase() === 'cookie') dict[key] = value.join('; '); - // ChromeDevTools frontend treats 'set-cookie' as a special case - // https://github.com/ChromeDevTools/devtools-frontend/blob/4275917f84266ef40613db3c1784a25f902ea74e/front_end/core/sdk/NetworkRequest.ts#L1368 - else if (key.toLowerCase() === 'set-cookie') dict[key] = value.join('\n'); - else dict[key] = value.join(', '); - } else { - dict[key] = String(value); - } - } - return dict; -}; - -function onClientRequestStart({ request }) { - const url = `${request.protocol}//${request.host}${request.path}`; - const wallTime = DateNow(); - const timestamp = wallTime / 1000; - request._inspectorRequestId = getNextRequestId(); - Network.requestWillBeSent({ - requestId: request._inspectorRequestId, - timestamp, - wallTime, - request: { - url, - method: request.method, - headers: headerObjectToDictionary(request.getHeaders()), - }, - }); -} - -function onClientRequestError({ request, error }) { - if (typeof request._inspectorRequestId !== 'string') { - return; - } - const timestamp = DateNow() / 1000; - Network.loadingFailed({ - requestId: request._inspectorRequestId, - timestamp, - type: 'Other', - errorText: error.message, - }); -} - -function onClientResponseFinish({ request, response }) { - if (typeof request._inspectorRequestId !== 'string') { - return; - } - const url = `${request.protocol}//${request.host}${request.path}`; - const timestamp = DateNow() / 1000; - Network.responseReceived({ - requestId: request._inspectorRequestId, - timestamp, - type: 'Other', - response: { - url, - status: response.statusCode, - statusText: response.statusMessage ?? '', - headers: headerObjectToDictionary(response.headers), - }, - }); - Network.loadingFinished({ - requestId: request._inspectorRequestId, - timestamp, - }); -} - function enable() { - dc ??= require('diagnostics_channel'); - Network ??= require('inspector').Network; - dc.subscribe('http.client.request.start', onClientRequestStart); - dc.subscribe('http.client.request.error', onClientRequestError); - dc.subscribe('http.client.response.finish', onClientResponseFinish); + require('internal/inspector/network_http').enable(); + // TODO: add undici request/websocket tracking. + // https://github.com/nodejs/node/issues/53946 } function disable() { - dc.unsubscribe('http.client.request.start', onClientRequestStart); - dc.unsubscribe('http.client.request.error', onClientRequestError); - dc.unsubscribe('http.client.response.finish', onClientResponseFinish); + require('internal/inspector/network_http').disable(); + // TODO: add undici request/websocket tracking. + // https://github.com/nodejs/node/issues/53946 } module.exports = { diff --git a/lib/internal/main/check_syntax.js b/lib/internal/main/check_syntax.js index aa521dea92e314..16e367c4e089f6 100644 --- a/lib/internal/main/check_syntax.js +++ b/lib/internal/main/check_syntax.js @@ -59,9 +59,7 @@ function loadESMIfNeeded(cb) { async function checkSyntax(source, filename) { let format; if (filename === '[stdin]' || filename === '[eval]') { - format = (getOptionValue('--input-type') === 'module' || - (getOptionValue('--experimental-default-type') === 'module' && getOptionValue('--input-type') !== 'commonjs')) ? - 'module' : 'commonjs'; + format = (getOptionValue('--input-type') === 'module') ? 'module' : 'commonjs'; } else { const { defaultResolve } = require('internal/modules/esm/resolve'); const { defaultGetFormat } = require('internal/modules/esm/get_format'); diff --git a/lib/internal/main/eval_stdin.js b/lib/internal/main/eval_stdin.js index 3ee4bcdb1d853b..b06bfa8c2a7640 100644 --- a/lib/internal/main/eval_stdin.js +++ b/lib/internal/main/eval_stdin.js @@ -11,6 +11,9 @@ const { getOptionValue } = require('internal/options'); const { evalModuleEntryPoint, + evalTypeScript, + parseAndEvalCommonjsTypeScript, + parseAndEvalModuleTypeScript, evalScript, readStdin, } = require('internal/process/execution'); @@ -25,14 +28,30 @@ readStdin((code) => { const print = getOptionValue('--print'); const shouldLoadESM = getOptionValue('--import').length > 0; - if (getOptionValue('--input-type') === 'module' || - (getOptionValue('--experimental-default-type') === 'module' && getOptionValue('--input-type') !== 'commonjs')) { + const inputType = getOptionValue('--input-type'); + const tsEnabled = getOptionValue('--experimental-strip-types'); + if (inputType === 'module') { evalModuleEntryPoint(code, print); + } else if (inputType === 'module-typescript' && tsEnabled) { + parseAndEvalModuleTypeScript(code, print); } else { - evalScript('[stdin]', - code, - getOptionValue('--inspect-brk'), - print, - shouldLoadESM); + + let evalFunction; + if (inputType === 'commonjs') { + evalFunction = evalScript; + } else if (inputType === 'commonjs-typescript' && tsEnabled) { + evalFunction = parseAndEvalCommonjsTypeScript; + } else if (tsEnabled) { + evalFunction = evalTypeScript; + } else { + // Default to commonjs. + evalFunction = evalScript; + } + + evalFunction('[stdin]', + code, + getOptionValue('--inspect-brk'), + print, + shouldLoadESM); } }); diff --git a/lib/internal/main/eval_string.js b/lib/internal/main/eval_string.js index 8027bc7e09b269..ee402f50fbdd2b 100644 --- a/lib/internal/main/eval_string.js +++ b/lib/internal/main/eval_string.js @@ -13,9 +13,14 @@ const { prepareMainThreadExecution, markBootstrapComplete, } = require('internal/process/pre_execution'); -const { evalModuleEntryPoint, evalScript } = require('internal/process/execution'); +const { + evalModuleEntryPoint, + evalTypeScript, + parseAndEvalCommonjsTypeScript, + parseAndEvalModuleTypeScript, + evalScript, +} = require('internal/process/execution'); const { addBuiltinLibsToObject } = require('internal/modules/helpers'); -const { stripTypeScriptModuleTypes } = require('internal/modules/typescript'); const { getOptionValue } = require('internal/options'); prepareMainThreadExecution(); @@ -23,19 +28,19 @@ addBuiltinLibsToObject(globalThis, ''); markBootstrapComplete(); const code = getOptionValue('--eval'); -const source = getOptionValue('--experimental-strip-types') ? - stripTypeScriptModuleTypes(code) : - code; const print = getOptionValue('--print'); const shouldLoadESM = getOptionValue('--import').length > 0 || getOptionValue('--experimental-loader').length > 0; -if (getOptionValue('--input-type') === 'module' || - (getOptionValue('--experimental-default-type') === 'module' && getOptionValue('--input-type') !== 'commonjs')) { - evalModuleEntryPoint(source, print); +const inputType = getOptionValue('--input-type'); +const tsEnabled = getOptionValue('--experimental-strip-types'); +if (inputType === 'module') { + evalModuleEntryPoint(code, print); +} else if (inputType === 'module-typescript' && tsEnabled) { + parseAndEvalModuleTypeScript(code, print); } else { // For backward compatibility, we want the identifier crypto to be the // `node:crypto` module rather than WebCrypto. - const isUsingCryptoIdentifier = RegExpPrototypeExec(/\bcrypto\b/, source) !== null; + const isUsingCryptoIdentifier = RegExpPrototypeExec(/\bcrypto\b/, code) !== null; const shouldDefineCrypto = isUsingCryptoIdentifier && internalBinding('config').hasOpenSSL; if (isUsingCryptoIdentifier && !shouldDefineCrypto) { @@ -50,11 +55,24 @@ if (getOptionValue('--input-type') === 'module' || }; ObjectDefineProperty(object, name, { __proto__: null, set: setReal }); } - evalScript('[eval]', - shouldDefineCrypto ? ( - print ? `let crypto=require("node:crypto");{${source}}` : `(crypto=>{{${source}}})(require('node:crypto'))` - ) : source, - getOptionValue('--inspect-brk'), - print, - shouldLoadESM); + + let evalFunction; + if (inputType === 'commonjs') { + evalFunction = evalScript; + } else if (inputType === 'commonjs-typescript' && tsEnabled) { + evalFunction = parseAndEvalCommonjsTypeScript; + } else if (tsEnabled) { + evalFunction = evalTypeScript; + } else { + // Default to commonjs. + evalFunction = evalScript; + } + + evalFunction('[eval]', + shouldDefineCrypto ? ( + print ? `let crypto=require("node:crypto");{${code}}` : `(crypto=>{{${code}}})(require('node:crypto'))` + ) : code, + getOptionValue('--inspect-brk'), + print, + shouldLoadESM); } diff --git a/lib/internal/main/run_main_module.js b/lib/internal/main/run_main_module.js index 9b79410bdad88d..0089a62c61592d 100644 --- a/lib/internal/main/run_main_module.js +++ b/lib/internal/main/run_main_module.js @@ -23,15 +23,11 @@ if (isEntryURL) { emitExperimentalWarning('--entry-url'); } -if (getOptionValue('--experimental-default-type') === 'module') { - require('internal/modules/run_main').executeUserEntryPoint(mainEntry); -} else { - /** - * To support legacy monkey-patching of `Module.runMain`, we call `runMain` here to have the CommonJS loader begin - * the execution of the main entry point, even if the ESM loader immediately takes over because the main entry is an - * ES module or one of the other opt-in conditions (such as the use of `--import`) are met. Users can monkey-patch - * before the main entry point is loaded by doing so via scripts loaded through `--require`. This monkey-patchability - * is undesirable and is removed in `--experimental-default-type=module` mode. - */ - require('internal/modules/cjs/loader').Module.runMain(mainEntry); -} +/** + * To support legacy monkey-patching of `Module.runMain`, we call `runMain` here to have the CommonJS loader begin the + * execution of the main entry point, even if the ESM loader immediately takes over because the main entry is an ES + * module or one of the other opt-in conditions (such as the use of `--import`) are met. Users can monkey-patch before + * the main entry point is loaded by doing so via scripts loaded through `--require`. This monkey-patchability is + * undesirable and should be removed once the module customization hooks provide equivalent functionality. + */ +require('internal/modules/cjs/loader').Module.runMain(mainEntry); diff --git a/lib/internal/main/worker_thread.js b/lib/internal/main/worker_thread.js index f8c410b5b25cb0..caf64728b754cc 100644 --- a/lib/internal/main/worker_thread.js +++ b/lib/internal/main/worker_thread.js @@ -49,7 +49,10 @@ const { setupMainThreadPort } = require('internal/worker/messaging'); const { onGlobalUncaughtException, evalScript, + evalTypeScript, evalModuleEntryPoint, + parseAndEvalCommonjsTypeScript, + parseAndEvalModuleTypeScript, } = require('internal/process/execution'); let debug = require('internal/util/debuglog').debuglog('worker', (fn) => { @@ -166,7 +169,29 @@ port.on('message', (message) => { value: filename, }); ArrayPrototypeSplice(process.argv, 1, 0, name); - evalScript(name, filename); + const tsEnabled = getOptionValue('--experimental-strip-types'); + const inputType = getOptionValue('--input-type'); + + if (inputType === 'module-typescript' && tsEnabled) { + // This is a special case where we want to parse and eval the + // TypeScript code as a module + parseAndEvalModuleTypeScript(filename, false); + break; + } + + let evalFunction; + if (inputType === 'commonjs') { + evalFunction = evalScript; + } else if (inputType === 'commonjs-typescript' && tsEnabled) { + evalFunction = parseAndEvalCommonjsTypeScript; + } else if (tsEnabled) { + evalFunction = evalTypeScript; + } else { + // Default to commonjs. + evalFunction = evalScript; + } + + evalFunction(name, filename); break; } diff --git a/lib/internal/modules/cjs/loader.js b/lib/internal/modules/cjs/loader.js index 95763de0701581..c453f2b403e89d 100644 --- a/lib/internal/modules/cjs/loader.js +++ b/lib/internal/modules/cjs/loader.js @@ -70,6 +70,7 @@ const { module_export_private_symbol, module_parent_private_symbol, }, + isInsideNodeModules, } = internalBinding('util'); const { kEvaluated, createRequiredModuleFacade } = internalBinding('module_wrap'); @@ -101,6 +102,7 @@ const kIsCachedByESMLoader = Symbol('kIsCachedByESMLoader'); const kRequiredModuleSymbol = Symbol('kRequiredModuleSymbol'); const kIsExecuting = Symbol('kIsExecuting'); +const kURL = Symbol('kURL'); const kFormat = Symbol('kFormat'); // Set first due to cycle with ESM loader functions. @@ -111,6 +113,9 @@ module.exports = { kModuleCircularVisited, initializeCJS, Module, + findLongestRegisteredExtension, + resolveForCJSWithHooks, + loadSourceForCJSWithHooks: loadSource, wrapSafe, wrapModuleLoad, kIsMainSymbol, @@ -131,6 +136,7 @@ const { setOwnProperty, getLazy, isWindows, + isUnderNodeModules, } = require('internal/util'); const { makeContextifyScript, @@ -155,6 +161,15 @@ const { stripBOM, toRealPath, } = require('internal/modules/helpers'); +const { + convertCJSFilenameToURL, + convertURLToCJSFilename, + loadHooks, + loadWithHooks, + registerHooks, + resolveHooks, + resolveWithHooks, +} = require('internal/modules/customization_hooks'); const { stripTypeScriptModuleTypes } = require('internal/modules/typescript'); const packageJsonReader = require('internal/modules/package_json_reader'); const { getOptionValue, getEmbedderOptions } = require('internal/options'); @@ -171,6 +186,7 @@ const { ERR_REQUIRE_CYCLE_MODULE, ERR_REQUIRE_ESM, ERR_UNKNOWN_BUILTIN_MODULE, + ERR_UNKNOWN_MODULE_FORMAT, }, setArrowMessage, } = require('internal/errors'); @@ -418,8 +434,8 @@ Module.isBuiltin = BuiltinModule.isBuiltin; */ function initializeCJS() { // This need to be done at runtime in case --expose-internals is set. - const builtinModules = BuiltinModule.getCanBeRequiredByUsersWithoutSchemeList(); - Module.builtinModules = ObjectFreeze(builtinModules); + + Module.builtinModules = ObjectFreeze(BuiltinModule.getAllBuiltinModuleIds()); initializeCjsConditions(); @@ -433,7 +449,6 @@ function initializeCJS() { const tsEnabled = getOptionValue('--experimental-strip-types'); if (tsEnabled) { - emitExperimentalWarning('Type Stripping'); Module._extensions['.cts'] = loadCTS; Module._extensions['.ts'] = loadTS; } @@ -583,7 +598,7 @@ function trySelfParentPath(parent) { * @param {string} parentPath The path of the parent module * @param {string} request The module request to resolve */ -function trySelf(parentPath, request) { +function trySelf(parentPath, request, conditions) { if (!parentPath) { return false; } const pkg = packageJsonReader.getNearestParentPackageJSON(parentPath); @@ -604,7 +619,7 @@ function trySelf(parentPath, request) { const { packageExportsResolve } = require('internal/modules/esm/resolve'); return finalizeEsmResolution(packageExportsResolve( pathToFileURL(pkg.path), expansion, pkg.data, - pathToFileURL(parentPath), getCjsConditions()), parentPath, pkg.path); + pathToFileURL(parentPath), conditions), parentPath, pkg.path); } catch (e) { if (e.code === 'ERR_MODULE_NOT_FOUND') { throw createEsmNotFoundErr(request, pkg.path); @@ -625,7 +640,7 @@ const EXPORTS_PATTERN = /^((?:@[^/\\%]+\/)?[^./\\%][^/\\%]*)(\/.*)?$/; * @param {string} nmPath The path to the module. * @param {string} request The request for the module. */ -function resolveExports(nmPath, request) { +function resolveExports(nmPath, request, conditions) { // The implementation's behavior is meant to mirror resolution in ESM. const { 1: name, 2: expansion = '' } = RegExpPrototypeExec(EXPORTS_PATTERN, request) || kEmptyObject; @@ -637,7 +652,7 @@ function resolveExports(nmPath, request) { const { packageExportsResolve } = require('internal/modules/esm/resolve'); return finalizeEsmResolution(packageExportsResolve( pathToFileURL(pkgPath + '/package.json'), '.' + expansion, pkg, null, - getCjsConditions()), null, pkgPath); + conditions), null, pkgPath); } catch (e) { if (e.code === 'ERR_MODULE_NOT_FOUND') { throw createEsmNotFoundErr(request, pkgPath + '/package.json'); @@ -679,7 +694,7 @@ function getDefaultExtensions() { * @param {boolean} isMain Whether the request is the main app entry point * @returns {string | false} */ -Module._findPath = function(request, paths, isMain) { +Module._findPath = function(request, paths, isMain, conditions = getCjsConditions()) { const absoluteRequest = path.isAbsolute(request); if (absoluteRequest) { paths = ['']; @@ -734,7 +749,7 @@ Module._findPath = function(request, paths, isMain) { } if (!absoluteRequest) { - const exportsResolved = resolveExports(curPath, request); + const exportsResolved = resolveExports(curPath, request, conditions); if (exportsResolved) { return exportsResolved; } @@ -1015,6 +1030,153 @@ function getExportsForCircularRequire(module) { return module.exports; } +/** + * Resolve a module request for CommonJS, invoking hooks from module.registerHooks() + * if necessary. + * @param {string} specifier + * @param {Module|undefined} parent + * @param {boolean} isMain + * @returns {{url?: string, format?: string, parentURL?: string, filename: string}} + */ +function resolveForCJSWithHooks(specifier, parent, isMain) { + let defaultResolvedURL; + let defaultResolvedFilename; + let format; + + function defaultResolveImpl(specifier, parent, isMain, options) { + // For backwards compatibility, when encountering requests starting with node:, + // throw ERR_UNKNOWN_BUILTIN_MODULE on failure or return the normalized ID on success + // without going into Module._resolveFilename. + let normalized; + if (StringPrototypeStartsWith(specifier, 'node:')) { + normalized = BuiltinModule.normalizeRequirableId(specifier); + if (!normalized) { + throw new ERR_UNKNOWN_BUILTIN_MODULE(specifier); + } + defaultResolvedURL = specifier; + format = 'builtin'; + return normalized; + } + return Module._resolveFilename(specifier, parent, isMain, options).toString(); + } + + // Fast path: no hooks, just return simple results. + if (!resolveHooks.length) { + const filename = defaultResolveImpl(specifier, parent, isMain); + return { __proto__: null, url: defaultResolvedURL, filename, format }; + } + + // Slow path: has hooks, do the URL conversions and invoke hooks with contexts. + let parentURL; + if (parent) { + if (!parent[kURL] && parent.filename) { + parent[kURL] = convertCJSFilenameToURL(parent.filename); + } + parentURL = parent[kURL]; + } + + // This is used as the last nextResolve for the resolve hooks. + function defaultResolve(specifier, context) { + // TODO(joyeecheung): parent and isMain should be part of context, then we + // no longer need to use a different defaultResolve for every resolution. + defaultResolvedFilename = defaultResolveImpl(specifier, parent, isMain, { + __proto__: null, + conditions: context.conditions, + }); + + defaultResolvedURL = convertCJSFilenameToURL(defaultResolvedFilename); + return { __proto__: null, url: defaultResolvedURL }; + } + + const resolveResult = resolveWithHooks(specifier, parentURL, /* importAttributes */ undefined, + getCjsConditions(), defaultResolve); + const { url } = resolveResult; + format = resolveResult.format; + + let filename; + if (url === defaultResolvedURL) { // Not overridden, skip the re-conversion. + filename = defaultResolvedFilename; + } else { + filename = convertURLToCJSFilename(url); + } + + return { __proto__: null, url, format, filename, parentURL }; +} + +/** + * @typedef {import('internal/modules/customization_hooks').ModuleLoadContext} ModuleLoadContext; + * @typedef {import('internal/modules/customization_hooks').ModuleLoadResult} ModuleLoadResult; + */ + +/** + * Load the source code of a module based on format. + * @param {string} filename Filename of the module. + * @param {string|undefined|null} format Format of the module. + * @returns {string|null} + */ +function defaultLoadImpl(filename, format) { + switch (format) { + case undefined: + case null: + case 'module': + case 'commonjs': + case 'json': + case 'module-typescript': + case 'commonjs-typescript': + case 'typescript': { + return fs.readFileSync(filename, 'utf8'); + } + case 'builtin': + return null; + default: + // URL is not necessarily necessary/available - convert it on the spot for errors. + throw new ERR_UNKNOWN_MODULE_FORMAT(format, convertCJSFilenameToURL(filename)); + } +} + +/** + * Construct a last nextLoad() for load hooks invoked for the CJS loader. + * @param {string} url URL passed from the hook. + * @param {string} filename Filename inferred from the URL. + * @returns {(url: string, context: ModuleLoadContext) => ModuleLoadResult} + */ +function getDefaultLoad(url, filename) { + return function defaultLoad(urlFromHook, context) { + // If the url is the same as the original one, save the conversion. + const isLoadingOriginalModule = (urlFromHook === url); + const filenameFromHook = isLoadingOriginalModule ? filename : convertURLToCJSFilename(url); + const source = defaultLoadImpl(filenameFromHook, context.format); + // Format from context is directly returned, because format detection should only be + // done after the entire load chain is completed. + return { source, format: context.format }; + }; +} + +/** + * Load a specified builtin module, invoking load hooks if necessary. + * @param {string} id The module ID (without the node: prefix) + * @param {string} url The module URL (with the node: prefix) + * @param {string} format Format from resolution. + * @returns {any} If there are no load hooks or the load hooks do not override the format of the + * builtin, load and return the exports of the builtin. Otherwise, return undefined. + */ +function loadBuiltinWithHooks(id, url, format) { + if (loadHooks.length) { + url ??= `node:${id}`; + // TODO(joyeecheung): do we really want to invoke the load hook for the builtins? + const loadResult = loadWithHooks(url, format || 'builtin', /* importAttributes */ undefined, + getCjsConditions(), getDefaultLoad(url, id)); + if (loadResult.format && loadResult.format !== 'builtin') { + return undefined; // Format has been overridden, return undefined for the caller to continue loading. + } + } + + // No hooks or the hooks have not overridden the format. Load it as a builtin module and return the + // exports. + const mod = loadBuiltinModule(id); + return mod.exports; +} + /** * Load a module from cache if it exists, otherwise create a new module instance. * 1. If a module already exists in the cache: return its exports object. @@ -1049,19 +1211,18 @@ Module._load = function(request, parent, isMain) { } } - if (StringPrototypeStartsWith(request, 'node:')) { - // Slice 'node:' prefix - const id = StringPrototypeSlice(request, 5); + const { url, format, filename } = resolveForCJSWithHooks(request, parent, isMain); - if (!BuiltinModule.canBeRequiredByUsers(id)) { - throw new ERR_UNKNOWN_BUILTIN_MODULE(request); + // For backwards compatibility, if the request itself starts with node:, load it before checking + // Module._cache. Otherwise, load it after the check. + if (StringPrototypeStartsWith(request, 'node:')) { + const result = loadBuiltinWithHooks(filename, url, format); + if (result) { + return result; } - - const module = loadBuiltinModule(id, request); - return module.exports; + // The format of the builtin has been overridden by user hooks. Continue loading. } - const filename = Module._resolveFilename(request, parent, isMain); const cachedModule = Module._cache[filename]; if (cachedModule !== undefined) { updateChildren(parent, cachedModule, true); @@ -1086,8 +1247,11 @@ Module._load = function(request, parent, isMain) { } if (BuiltinModule.canBeRequiredWithoutScheme(filename)) { - const mod = loadBuiltinModule(filename, request); - return mod.exports; + const result = loadBuiltinWithHooks(filename, url, format); + if (result) { + return result; + } + // The format of the builtin has been overridden by user hooks. Continue loading. } // Don't call updateChildren(), Module constructor already does. @@ -1106,6 +1270,10 @@ Module._load = function(request, parent, isMain) { reportModuleToWatchMode(filename); Module._cache[filename] = module; module[kIsCachedByESMLoader] = false; + // If there are resolve hooks, carry the context information into the + // load hooks for the module keyed by the (potentially customized) filename. + module[kURL] = url; + module[kFormat] = format; } if (parent !== undefined) { @@ -1148,11 +1316,13 @@ Module._load = function(request, parent, isMain) { * @param {ResolveFilenameOptions} options Options object * @typedef {object} ResolveFilenameOptions * @property {string[]} paths Paths to search for modules in + * @property {string[]} conditions Conditions used for resolution. */ Module._resolveFilename = function(request, parent, isMain, options) { if (BuiltinModule.normalizeRequirableId(request)) { return request; } + const conditions = (options?.conditions) || getCjsConditions(); let paths; @@ -1198,7 +1368,7 @@ Module._resolveFilename = function(request, parent, isMain, options) { try { const { packageImportsResolve } = require('internal/modules/esm/resolve'); return finalizeEsmResolution( - packageImportsResolve(request, pathToFileURL(parentPath), getCjsConditions()), + packageImportsResolve(request, pathToFileURL(parentPath), conditions), parentPath, pkg.path, ); @@ -1213,7 +1383,7 @@ Module._resolveFilename = function(request, parent, isMain, options) { // Try module self resolution first const parentPath = trySelfParentPath(parent); - const selfResolved = trySelf(parentPath, request); + const selfResolved = trySelf(parentPath, request, conditions); if (selfResolved) { const cacheKey = request + '\x00' + (paths.length === 1 ? paths[0] : ArrayPrototypeJoin(paths, '\x00')); @@ -1222,7 +1392,7 @@ Module._resolveFilename = function(request, parent, isMain, options) { } // Look up the filename first, since that's the cache key. - const filename = Module._findPath(request, paths, isMain); + const filename = Module._findPath(request, paths, isMain, conditions); if (filename) { return filename; } const requireStack = []; for (let cursor = parent; @@ -1289,8 +1459,8 @@ Module.prototype.load = function(filename) { debug('load %j for module %j', filename, this.id); assert(!this.loaded); - this.filename = filename; - this.paths = Module._nodeModulePaths(path.dirname(filename)); + this.filename ??= filename; + this.paths ??= Module._nodeModulePaths(path.dirname(filename)); const extension = findLongestRegisteredExtension(filename); @@ -1328,6 +1498,7 @@ Module.prototype.require = function(id) { } }; +let requireModuleWarningMode; /** * Resolve and evaluate it synchronously as ESM if it's ESM. * @param {Module} mod CJS module instance @@ -1347,29 +1518,51 @@ function loadESMFromCJS(mod, filename, format, source) { setOwnProperty(process, 'mainModule', undefined); } else { const parent = mod[kModuleParent]; - let messagePrefix; - if (parent) { - // In the case of the module calling `require()`, it's more useful to know its absolute path. - let from = parent.filename || parent.id; - // In the case of the module being require()d, it's more useful to know the id passed into require(). - const to = mod.id || mod.filename; - if (from === 'internal/preload') { - from = '--require'; - } else if (from === '') { - from = 'The REPL'; - } else if (from === '.') { - from = 'The entry point'; + + requireModuleWarningMode ??= getOptionValue('--trace-require-module'); + if (requireModuleWarningMode) { + let shouldEmitWarning = false; + if (requireModuleWarningMode === 'no-node-modules') { + // Check if the require() comes from node_modules. + if (parent) { + shouldEmitWarning = !isUnderNodeModules(parent.filename); + } else if (mod[kIsCachedByESMLoader]) { + // It comes from the require() built for `import cjs` and doesn't have a parent recorded + // in the CJS module instance. Inspect the stack trace to see if the require() + // comes from node_modules and reduce the noise. If there are more than 100 frames, + // just give up and assume it is under node_modules. + shouldEmitWarning = !isInsideNodeModules(100, true); + } } else { - from &&= `CommonJS module ${from}`; + shouldEmitWarning = true; } - if (from && to) { - messagePrefix = `${from} is loading ES Module ${to} using require().\n`; + if (shouldEmitWarning) { + let messagePrefix; + if (parent) { + // In the case of the module calling `require()`, it's more useful to know its absolute path. + let from = parent.filename || parent.id; + // In the case of the module being require()d, it's more useful to know the id passed into require(). + const to = mod.id || mod.filename; + if (from === 'internal/preload') { + from = '--require'; + } else if (from === '') { + from = 'The REPL'; + } else if (from === '.') { + from = 'The entry point'; + } else { + from &&= `CommonJS module ${from}`; + } + if (from && to) { + messagePrefix = `${from} is loading ES Module ${to} using require().\n`; + } + } + emitExperimentalWarning('Support for loading ES Module in require()', + messagePrefix, + undefined, + parent?.require); + requireModuleWarningMode = true; } } - emitExperimentalWarning('Support for loading ES Module in require()', - messagePrefix, - undefined, - parent?.require); const { wrap, namespace, @@ -1552,27 +1745,41 @@ Module.prototype._compile = function(content, filename, format) { }; /** - * Get the source code of a module, using cached ones if it's cached. + * Get the source code of a module, using cached ones if it's cached. This is used + * for TypeScript, JavaScript and JSON loading. * After this returns, mod[kFormat], mod[kModuleSource] and mod[kURL] will be set. * @param {Module} mod Module instance whose source is potentially already cached. * @param {string} filename Absolute path to the file of the module. * @returns {{source: string, format?: string}} */ function loadSource(mod, filename, formatFromNode) { - if (formatFromNode !== undefined) { + if (mod[kFormat] === undefined) { mod[kFormat] = formatFromNode; } - const format = mod[kFormat]; + // If the module was loaded before, just return. + if (mod[kModuleSource] !== undefined) { + return { source: mod[kModuleSource], format: mod[kFormat] }; + } - let source = mod[kModuleSource]; - if (source !== undefined) { - mod[kModuleSource] = undefined; - } else { - // TODO(joyeecheung): we can read a buffer instead to speed up - // compilation. - source = fs.readFileSync(filename, 'utf8'); + // Fast path: no hooks, just load it and return. + if (!loadHooks.length) { + const source = defaultLoadImpl(filename, formatFromNode); + return { source, format: formatFromNode }; + } + + if (mod[kURL] === undefined) { + mod[kURL] = convertCJSFilenameToURL(filename); } - return { source, format }; + + const loadResult = loadWithHooks(mod[kURL], mod[kFormat], /* importAttributes */ undefined, getCjsConditions(), + getDefaultLoad(mod[kURL], filename)); + + // Reset the module properties with load hook results. + if (loadResult.format !== undefined) { + mod[kFormat] = loadResult.format; + } + mod[kModuleSource] = loadResult.source; + return { source: mod[kModuleSource], format: mod[kFormat] }; } /** @@ -1590,7 +1797,6 @@ function loadMTS(mod, filename) { * @param {Module} module CJS module instance * @param {string} filename The file path of the module */ - function loadCTS(module, filename) { const loadResult = loadSource(module, filename, 'commonjs-typescript'); module._compile(loadResult.source, filename, loadResult.format); @@ -1704,7 +1910,7 @@ Module._extensions['.js'] = function(module, filename) { * @param {string} filename The file path of the module */ Module._extensions['.json'] = function(module, filename) { - const content = fs.readFileSync(filename, 'utf8'); + const { source: content } = loadSource(module, filename, 'json'); try { setOwnProperty(module, 'exports', JSONParse(stripBOM(content))); @@ -1858,3 +2064,4 @@ ObjectDefineProperty(Module.prototype, 'constructor', { // Backwards compatibility Module.Module = Module; +Module.registerHooks = registerHooks; diff --git a/lib/internal/modules/customization_hooks.js b/lib/internal/modules/customization_hooks.js new file mode 100644 index 00000000000000..c7a7a6d53dffd8 --- /dev/null +++ b/lib/internal/modules/customization_hooks.js @@ -0,0 +1,366 @@ +'use strict'; + +const { + ArrayPrototypeFindIndex, + ArrayPrototypePush, + ArrayPrototypeSplice, + ObjectFreeze, + StringPrototypeStartsWith, + Symbol, +} = primordials; +const { + isAnyArrayBuffer, + isArrayBufferView, +} = require('internal/util/types'); + +const { BuiltinModule } = require('internal/bootstrap/realm'); +const { + ERR_INVALID_RETURN_PROPERTY_VALUE, +} = require('internal/errors').codes; +const { validateFunction } = require('internal/validators'); +const { isAbsolute } = require('path'); +const { pathToFileURL, fileURLToPath } = require('internal/url'); + +let debug = require('internal/util/debuglog').debuglog('module_hooks', (fn) => { + debug = fn; +}); + +/** @typedef {import('internal/modules/cjs/loader.js').Module} Module */ +/** + * @typedef {(specifier: string, context: ModuleResolveContext, nextResolve: ResolveHook) + * => ModuleResolveResult} ResolveHook + * @typedef {(url: string, context: ModuleLoadContext, nextLoad: LoadHook) + * => ModuleLoadResult} LoadHook + */ + +// Use arrays for better insertion and iteration performance, we don't care +// about deletion performance as much. +const resolveHooks = []; +const loadHooks = []; +const hookId = Symbol('kModuleHooksIdKey'); +let nextHookId = 0; + +class ModuleHooks { + /** + * @param {ResolveHook|undefined} resolve User-provided hook. + * @param {LoadHook|undefined} load User-provided hook. + */ + constructor(resolve, load) { + this[hookId] = Symbol(`module-hook-${nextHookId++}`); + // Always initialize all hooks, if it's unspecified it'll be an owned undefined. + this.resolve = resolve; + this.load = load; + + if (resolve) { + ArrayPrototypePush(resolveHooks, this); + } + if (load) { + ArrayPrototypePush(loadHooks, this); + } + + ObjectFreeze(this); + } + // TODO(joyeecheung): we may want methods that allow disabling/enabling temporarily + // which just sets the item in the array to undefined temporarily. + // TODO(joyeecheung): this can be the [Symbol.dispose] implementation to pair with + // `using` when the explicit resource management proposal is shipped by V8. + /** + * Deregister the hook instance. + */ + deregister() { + const id = this[hookId]; + let index = ArrayPrototypeFindIndex(resolveHooks, (hook) => hook[hookId] === id); + if (index !== -1) { + ArrayPrototypeSplice(resolveHooks, index, 1); + } + index = ArrayPrototypeFindIndex(loadHooks, (hook) => hook[hookId] === id); + if (index !== -1) { + ArrayPrototypeSplice(loadHooks, index, 1); + } + } +}; + +/** + * TODO(joyeecheung): taken an optional description? + * @param {{ resolve?: ResolveHook, load?: LoadHook }} hooks User-provided hooks + * @returns {ModuleHooks} + */ +function registerHooks(hooks) { + const { resolve, load } = hooks; + if (resolve) { + validateFunction(resolve, 'hooks.resolve'); + } + if (load) { + validateFunction(load, 'hooks.load'); + } + return new ModuleHooks(resolve, load); +} + +/** + * @param {string} filename + * @returns {string} + */ +function convertCJSFilenameToURL(filename) { + if (!filename) { return filename; } + const builtinId = BuiltinModule.normalizeRequirableId(filename); + if (builtinId) { + return `node:${builtinId}`; + } + // Handle the case where filename is neither a path, nor a built-in id, + // which is possible via monkey-patching. + if (isAbsolute(filename)) { + return pathToFileURL(filename).href; + } + return filename; +} + +/** + * @param {string} url + * @returns {string} + */ +function convertURLToCJSFilename(url) { + if (!url) { return url; } + const builtinId = BuiltinModule.normalizeRequirableId(url); + if (builtinId) { + return builtinId; + } + if (StringPrototypeStartsWith(url, 'file://')) { + return fileURLToPath(url); + } + return url; +} + +/** + * Convert a list of hooks into a function that can be used to do an operation through + * a chain of hooks. If any of the hook returns without calling the next hook, it + * must return shortCircuit: true to stop the chain from continuing to avoid + * forgetting to invoke the next hook by mistake. + * @param {ModuleHooks[]} hooks A list of hooks whose last argument is `nextHook`. + * @param {'load'|'resolve'} name Name of the hook in ModuleHooks. + * @param {Function} defaultStep The default step in the chain. + * @param {Function} validate A function that validates and sanitize the result returned by the chain. + * @returns {Function} + */ +function buildHooks(hooks, name, defaultStep, validate) { + let lastRunIndex = hooks.length; + function wrapHook(index, userHook, next) { + return function wrappedHook(...args) { + lastRunIndex = index; + const hookResult = userHook(...args, next); + if (lastRunIndex > 0 && lastRunIndex === index && !hookResult.shortCircuit) { + throw new ERR_INVALID_RETURN_PROPERTY_VALUE('true', name, 'shortCircuit', + hookResult.shortCircuit); + } + return validate(...args, hookResult); + }; + } + const chain = [wrapHook(0, defaultStep)]; + for (let i = 0; i < hooks.length; ++i) { + const wrappedHook = wrapHook(i + 1, hooks[i][name], chain[i]); + ArrayPrototypePush(chain, wrappedHook); + } + return chain[chain.length - 1]; +} + +/** + * @typedef {object} ModuleResolveResult + * @property {string} url Resolved URL of the module. + * @property {string|undefined} format Format of the module. + * @property {ImportAttributes|undefined} importAttributes Import attributes for the request. + * @property {boolean|undefined} shortCircuit Whether the next hook has been skipped. + */ + +/** + * Validate the result returned by a chain of resolve hook. + * @param {string} specifier Specifier passed into the hooks. + * @param {ModuleResolveContext} context Context passed into the hooks. + * @param {ModuleResolveResult} result Result produced by resolve hooks. + * @returns {ModuleResolveResult} + */ +function validateResolve(specifier, context, result) { + const { url, format, importAttributes } = result; + if (typeof url !== 'string') { + throw new ERR_INVALID_RETURN_PROPERTY_VALUE( + 'a URL string', + 'resolve', + 'url', + url, + ); + } + + if (format && typeof format !== 'string') { + throw new ERR_INVALID_RETURN_PROPERTY_VALUE( + 'a string', + 'resolve', + 'format', + format, + ); + } + + if (importAttributes && typeof importAttributes !== 'object') { + throw new ERR_INVALID_RETURN_PROPERTY_VALUE( + 'an object', + 'resolve', + 'importAttributes', + importAttributes, + ); + } + + return { + __proto__: null, + url, + format, + importAttributes, + }; +} + +/** + * @typedef {object} ModuleLoadResult + * @property {string|undefined} format Format of the loaded module. + * @property {string|ArrayBuffer|TypedArray} source Source code of the module. + * @property {boolean|undefined} shortCircuit Whether the next hook has been skipped. + */ + +/** + * Validate the result returned by a chain of resolve hook. + * @param {string} url URL passed into the hooks. + * @param {ModuleLoadContext} context Context passed into the hooks. + * @param {ModuleLoadResult} result Result produced by load hooks. + * @returns {ModuleLoadResult} + */ +function validateLoad(url, context, result) { + const { source, format } = result; + // To align with module.register(), the load hooks are still invoked for + // the builtins even though the default load step only provides null as source, + // and any source content for builtins provided by the user hooks are ignored. + if (!StringPrototypeStartsWith(url, 'node:') && + typeof result.source !== 'string' && + !isAnyArrayBuffer(source) && + !isArrayBufferView(source)) { + throw new ERR_INVALID_RETURN_PROPERTY_VALUE( + 'a string, an ArrayBuffer, or a TypedArray', + 'load', + 'source', + source, + ); + } + + if (typeof format !== 'string' && format !== undefined) { + throw new ERR_INVALID_RETURN_PROPERTY_VALUE( + 'a string', + 'load', + 'format', + format, + ); + } + + return { + __proto__: null, + format, + source, + }; +} + +class ModuleResolveContext { + /** + * Context for the resolve hook. + * @param {string|undefined} parentURL Parent URL. + * @param {ImportAttributes|undefined} importAttributes Import attributes. + * @param {string[]} conditions Conditions. + */ + constructor(parentURL, importAttributes, conditions) { + this.parentURL = parentURL; + this.importAttributes = importAttributes; + this.conditions = conditions; + // TODO(joyeecheung): a field to differentiate between require and import? + } +}; + +class ModuleLoadContext { + /** + * Context for the load hook. + * @param {string|undefined} format URL. + * @param {ImportAttributes|undefined} importAttributes Import attributes. + * @param {string[]} conditions Conditions. + */ + constructor(format, importAttributes, conditions) { + this.format = format; + this.importAttributes = importAttributes; + this.conditions = conditions; + } +}; + +let decoder; +/** + * Load module source for a url, through a hooks chain if it exists. + * @param {string} url + * @param {string|undefined} originalFormat + * @param {ImportAttributes|undefined} importAttributes + * @param {string[]} conditions + * @param {(url: string, context: ModuleLoadContext) => ModuleLoadResult} defaultLoad + * @returns {ModuleLoadResult} + */ +function loadWithHooks(url, originalFormat, importAttributes, conditions, defaultLoad) { + debug('loadWithHooks', url, originalFormat); + const context = new ModuleLoadContext(originalFormat, importAttributes, conditions); + if (loadHooks.length === 0) { + return defaultLoad(url, context); + } + + const runner = buildHooks(loadHooks, 'load', defaultLoad, validateLoad); + + const result = runner(url, context); + const { source, format } = result; + if (!isAnyArrayBuffer(source) && !isArrayBufferView(source)) { + return result; + } + + switch (format) { + // Text formats: + case undefined: + case 'module': + case 'commonjs': + case 'json': + case 'module-typescript': + case 'commonjs-typescript': + case 'typescript': { + decoder ??= new (require('internal/encoding').TextDecoder)(); + result.source = decoder.decode(source); + break; + } + default: + break; + } + return result; +} + +/** + * Resolve module request to a url, through a hooks chain if it exists. + * @param {string} specifier + * @param {string|undefined} parentURL + * @param {ImportAttributes|undefined} importAttributes + * @param {string[]} conditions + * @param {(specifier: string, context: ModuleResolveContext) => ModuleResolveResult} defaultResolve + * @returns {ModuleResolveResult} + */ +function resolveWithHooks(specifier, parentURL, importAttributes, conditions, defaultResolve) { + debug('resolveWithHooks', specifier, parentURL, importAttributes); + const context = new ModuleResolveContext(parentURL, importAttributes, conditions); + if (resolveHooks.length === 0) { + return defaultResolve(specifier, context); + } + + const runner = buildHooks(resolveHooks, 'resolve', defaultResolve, validateResolve); + + return runner(specifier, context); +} + +module.exports = { + convertCJSFilenameToURL, + convertURLToCJSFilename, + loadHooks, + loadWithHooks, + registerHooks, + resolveHooks, + resolveWithHooks, +}; diff --git a/lib/internal/modules/esm/fetch_module.js b/lib/internal/modules/esm/fetch_module.js deleted file mode 100644 index 097a2713f09c61..00000000000000 --- a/lib/internal/modules/esm/fetch_module.js +++ /dev/null @@ -1,301 +0,0 @@ -'use strict'; -const { - ObjectPrototypeHasOwnProperty, - PromisePrototypeThen, - SafeMap, - StringPrototypeSlice, -} = primordials; -const { - Buffer: { concat: BufferConcat }, -} = require('buffer'); -const { - ERR_NETWORK_IMPORT_DISALLOWED, - ERR_NETWORK_IMPORT_BAD_RESPONSE, - ERR_MODULE_NOT_FOUND, -} = require('internal/errors').codes; -const { URL } = require('internal/url'); -const net = require('net'); -const { once } = require('events'); -const { compose } = require('stream'); -/** - * @typedef CacheEntry - * @property {Promise | string} resolvedHREF Parsed HREF of the request. - * @property {Record} headers HTTP headers of the response. - * @property {Promise | Buffer} body Response body. - */ - -/** - * Only for GET requests, other requests would need new Map - * HTTP cache semantics keep diff caches - * - * It caches either the promise or the cache entry since import.meta.url needs - * the value synchronously for the response location after all redirects. - * - * Maps HREF to pending cache entry - * @type {Map | CacheEntry>} - */ -const cacheForGET = new SafeMap(); - -// [1] The V8 snapshot doesn't like some C++ APIs to be loaded eagerly. Do it -// lazily/at runtime and not top level of an internal module. - -// [2] Creating a new agent instead of using the global agent improves -// performance and precludes the agent becoming tainted. - -/** @type {import('https').Agent} The Cached HTTP Agent for **secure** HTTP requests. */ -let HTTPSAgent; -/** - * Make a HTTPs GET request (handling agent setup if needed, caching the agent to avoid - * redundant instantiations). - * @param {Parameters[0]} input - The URI to fetch. - * @param {Parameters[1]} options - See https.get() options. - */ -function HTTPSGet(input, options) { - const https = require('https'); // [1] - HTTPSAgent ??= new https.Agent({ // [2] - keepAlive: true, - }); - return https.get(input, { - agent: HTTPSAgent, - ...options, - }); -} - -/** @type {import('https').Agent} The Cached HTTP Agent for **insecure** HTTP requests. */ -let HTTPAgent; -/** - * Make a HTTP GET request (handling agent setup if needed, caching the agent to avoid - * redundant instantiations). - * @param {Parameters[0]} input - The URI to fetch. - * @param {Parameters[1]} options - See http.get() options. - */ -function HTTPGet(input, options) { - const http = require('http'); // [1] - HTTPAgent ??= new http.Agent({ // [2] - keepAlive: true, - }); - return http.get(input, { - agent: HTTPAgent, - ...options, - }); -} - -/** @type {import('../../dns/promises.js').lookup} */ -function dnsLookup(hostname, options) { - // eslint-disable-next-line no-func-assign - dnsLookup = require('dns/promises').lookup; - return dnsLookup(hostname, options); -} - -let zlib; -/** - * Create a decompressor for the Brotli format. - * @returns {import('zlib').BrotliDecompress} - */ -function createBrotliDecompress() { - zlib ??= require('zlib'); // [1] - // eslint-disable-next-line no-func-assign - createBrotliDecompress = zlib.createBrotliDecompress; - return createBrotliDecompress(); -} - -/** - * Create an unzip handler. - * @returns {import('zlib').Unzip} - */ -function createUnzip() { - zlib ??= require('zlib'); // [1] - // eslint-disable-next-line no-func-assign - createUnzip = zlib.createUnzip; - return createUnzip(); -} - -/** - * Redirection status code as per section 6.4 of RFC 7231: - * https://datatracker.ietf.org/doc/html/rfc7231#section-6.4 - * and RFC 7238: - * https://datatracker.ietf.org/doc/html/rfc7238 - * @param {number} statusCode - * @returns {boolean} - */ -function isRedirect(statusCode) { - switch (statusCode) { - case 300: // Multiple Choices - case 301: // Moved Permanently - case 302: // Found - case 303: // See Other - case 307: // Temporary Redirect - case 308: // Permanent Redirect - return true; - default: - return false; - } -} - -/** - * @typedef AcceptMimes possible values of Accept header when fetching a module - * @property {Promise | string} default default Accept header value. - * @property {Record} json Accept header value when fetching module with importAttributes json. - * @type {AcceptMimes} - */ -const acceptMimes = { - __proto_: null, - default: '*/*', - json: 'application/json,*/*;charset=utf-8;q=0.5', -}; - -/** - * @param {URL} parsed - * @returns {Promise | CacheEntry} - */ -function fetchWithRedirects(parsed, context) { - const existing = cacheForGET.get(parsed.href); - if (existing) { - return existing; - } - const handler = parsed.protocol === 'http:' ? HTTPGet : HTTPSGet; - const result = (async () => { - const accept = acceptMimes[context.importAttributes?.type] ?? acceptMimes.default; - const req = handler(parsed, { - headers: { Accept: accept }, - }); - // Note that `once` is used here to handle `error` and that it hits the - // `finally` on network error/timeout. - const { 0: res } = await once(req, 'response'); - try { - const hasLocation = ObjectPrototypeHasOwnProperty(res.headers, 'location'); - if (isRedirect(res.statusCode) && hasLocation) { - const location = new URL(res.headers.location, parsed); - if (location.protocol !== 'http:' && location.protocol !== 'https:') { - throw new ERR_NETWORK_IMPORT_DISALLOWED( - res.headers.location, - parsed.href, - 'cannot redirect to non-network location', - ); - } - const entry = await fetchWithRedirects(location, context); - cacheForGET.set(parsed.href, entry); - return entry; - } - if (res.statusCode === 404) { - const err = new ERR_MODULE_NOT_FOUND(parsed.href, null, parsed); - err.message = `Cannot find module '${parsed.href}', HTTP 404`; - throw err; - } - // This condition catches all unsupported status codes, including - // 3xx redirection codes without `Location` HTTP header. - if (res.statusCode < 200 || res.statusCode >= 300) { - throw new ERR_NETWORK_IMPORT_DISALLOWED( - res.headers.location, - parsed.href, - 'cannot redirect to non-network location'); - } - const { headers } = res; - const contentType = headers['content-type']; - if (!contentType) { - throw new ERR_NETWORK_IMPORT_BAD_RESPONSE( - parsed.href, - "the 'Content-Type' header is required", - ); - } - /** - * @type {CacheEntry} - */ - const entry = { - resolvedHREF: parsed.href, - headers: { - 'content-type': res.headers['content-type'], - }, - body: (async () => { - let bodyStream = res; - if (res.headers['content-encoding'] === 'br') { - bodyStream = compose(res, createBrotliDecompress()); - } else if ( - res.headers['content-encoding'] === 'gzip' || - res.headers['content-encoding'] === 'deflate' - ) { - bodyStream = compose(res, createUnzip()); - } - const buffers = await bodyStream.toArray(); - const body = BufferConcat(buffers); - entry.body = body; - return body; - })(), - }; - cacheForGET.set(parsed.href, entry); - await entry.body; - return entry; - } finally { - req.destroy(); - } - })(); - cacheForGET.set(parsed.href, result); - return result; -} - -const allowList = new net.BlockList(); -allowList.addAddress('::1', 'ipv6'); -allowList.addRange('127.0.0.1', '127.255.255.255'); - -/** - * Returns if an address has local status by if it is going to a local - * interface or is an address resolved by DNS to be a local interface - * @param {string} hostname url.hostname to test - * @returns {Promise} - */ -async function isLocalAddress(hostname) { - try { - if ( - hostname.length && - hostname[0] === '[' && - hostname[hostname.length - 1] === ']' - ) { - hostname = StringPrototypeSlice(hostname, 1, -1); - } - const addr = await dnsLookup(hostname, { order: 'verbatim' }); - const ipv = addr.family === 4 ? 'ipv4' : 'ipv6'; - return allowList.check(addr.address, ipv); - } catch { - // If it errored, the answer is no. - } - return false; -} - -/** - * Fetches a location with a shared cache following redirects. - * Does not respect HTTP cache headers. - * - * This splits the header and body Promises so that things only needing - * headers don't need to wait on the body. - * - * In cases where the request & response have already settled, this returns the - * cache value synchronously. - * @param {URL} parsed - * @param {ESModuleContext} context - * @returns {ReturnType} - */ -function fetchModule(parsed, context) { - const { parentURL } = context; - const { href } = parsed; - const existing = cacheForGET.get(href); - if (existing) { - return existing; - } - if (parsed.protocol === 'http:') { - return PromisePrototypeThen(isLocalAddress(parsed.hostname), (is) => { - if (is !== true) { - throw new ERR_NETWORK_IMPORT_DISALLOWED( - href, - parentURL, - 'http can only be used to load local resources (use https instead).', - ); - } - return fetchWithRedirects(parsed, context); - }); - } - return fetchWithRedirects(parsed, context); -} - -module.exports = { - fetchModule, -}; diff --git a/lib/internal/modules/esm/formats.js b/lib/internal/modules/esm/formats.js index 608b69caf3fe49..ff0bed228d4e74 100644 --- a/lib/internal/modules/esm/formats.js +++ b/lib/internal/modules/esm/formats.js @@ -10,6 +10,7 @@ const fsBindings = internalBinding('fs'); const { fs: fsConstants } = internalBinding('constants'); const experimentalWasmModules = getOptionValue('--experimental-wasm-modules'); +const experimentalAddonModules = getOptionValue('--experimental-addon-modules'); const extensionFormatMap = { '__proto__': null, @@ -23,6 +24,10 @@ if (experimentalWasmModules) { extensionFormatMap['.wasm'] = 'wasm'; } +if (experimentalAddonModules) { + extensionFormatMap['.node'] = 'addon'; +} + if (getOptionValue('--experimental-strip-types')) { extensionFormatMap['.ts'] = 'module-typescript'; extensionFormatMap['.mts'] = 'module-typescript'; @@ -46,8 +51,8 @@ function mimeToFormat(mime) { } /** - * For extensionless files in a `module` package scope, or a default `module` scope enabled by the - * `--experimental-default-type` flag, we check the file contents to disambiguate between ES module JavaScript and Wasm. + * For extensionless files in a `module` package scope, we check the file contents to disambiguate between ES module + * JavaScript and Wasm. * We do this by taking advantage of the fact that all Wasm files start with the header `0x00 0x61 0x73 0x6d` (`_asm`). * @param {URL} url */ diff --git a/lib/internal/modules/esm/get_format.js b/lib/internal/modules/esm/get_format.js index 9519f947b8dfdc..9fc5e67969abcf 100644 --- a/lib/internal/modules/esm/get_format.js +++ b/lib/internal/modules/esm/get_format.js @@ -119,29 +119,16 @@ function getFileProtocolModuleFormat(url, context = { __proto__: null }, ignoreE } // The controlling `package.json` file has no `type` field. - switch (getOptionValue('--experimental-default-type')) { - case 'module': { // The user explicitly passed `--experimental-default-type=module`. - // An exception to the type flag making ESM the default everywhere is that package scopes under `node_modules` - // should retain the assumption that a lack of a `type` field means CommonJS. - return underNodeModules(url) ? 'commonjs' : 'module'; - } - case 'commonjs': { // The user explicitly passed `--experimental-default-type=commonjs`. - return 'commonjs'; - } - default: { // The user did not pass `--experimental-default-type`. - // `source` is undefined when this is called from `defaultResolve`; - // but this gets called again from `defaultLoad`/`defaultLoadSync`. - // For ambiguous files (no type field, .js extension) we return - // undefined from `resolve` and re-run the check in `load`. - const format = detectModuleFormat(source, url); - if (format === 'module' && foundPackageJson) { - // This module has a .js extension, a package.json with no `type` field, and ESM syntax. - // Warn about the missing `type` field so that the user can avoid the performance penalty of detection. - warnTypelessPackageJsonFile(pjsonPath, url); - } - return format; - } + // `source` is undefined when this is called from `defaultResolve`; + // but this gets called again from `defaultLoad`/`defaultLoadSync`. + // For ambiguous files (.js, no type field) we return undefined from `resolve` and re-run the check in `load`. + const format = detectModuleFormat(source, url); + if (format === 'module' && foundPackageJson) { + // This module has a .js extension, a package.json with no `type` field, and ESM syntax. + // Warn about the missing `type` field so that the user can avoid the performance penalty of detection. + warnTypelessPackageJsonFile(pjsonPath, url); } + return format; } if (ext === '.ts' && getOptionValue('--experimental-strip-types')) { const { type: packageType, pjsonPath, exists: foundPackageJson } = getPackageScopeConfig(url); @@ -149,35 +136,22 @@ function getFileProtocolModuleFormat(url, context = { __proto__: null }, ignoreE return `${packageType}-typescript`; } // The controlling `package.json` file has no `type` field. - switch (getOptionValue('--experimental-default-type')) { - case 'module': { // The user explicitly passed `--experimental-default-type=module`. - // An exception to the type flag making ESM the default everywhere is that package scopes under `node_modules` - // should retain the assumption that a lack of a `type` field means CommonJS. - return underNodeModules(url) ? 'commonjs-typescript' : 'module-typescript'; - } - case 'commonjs': { // The user explicitly passed `--experimental-default-type=commonjs`. - return 'commonjs-typescript'; - } - default: { // The user did not pass `--experimental-default-type`. - // `source` is undefined when this is called from `defaultResolve`; - // but this gets called again from `defaultLoad`/`defaultLoadSync`. - // Since experimental-strip-types depends on detect-module, we always return null - // if source is undefined. - if (!source) { return null; } - const { stringify } = require('internal/modules/helpers'); - const { stripTypeScriptModuleTypes } = require('internal/modules/typescript'); - const stringifiedSource = stringify(source); - const parsedSource = stripTypeScriptModuleTypes(stringifiedSource, fileURLToPath(url)); - const detectedFormat = detectModuleFormat(parsedSource, url); - const format = `${detectedFormat}-typescript`; - if (format === 'module-typescript' && foundPackageJson) { - // This module has a .js extension, a package.json with no `type` field, and ESM syntax. - // Warn about the missing `type` field so that the user can avoid the performance penalty of detection. - warnTypelessPackageJsonFile(pjsonPath, url); - } - return format; - } + // `source` is undefined when this is called from `defaultResolve`; + // but this gets called again from `defaultLoad`/`defaultLoadSync`. + // Since experimental-strip-types depends on detect-module, we always return null if source is undefined. + if (!source) { return null; } + const { stringify } = require('internal/modules/helpers'); + const { stripTypeScriptModuleTypes } = require('internal/modules/typescript'); + const stringifiedSource = stringify(source); + const parsedSource = stripTypeScriptModuleTypes(stringifiedSource, fileURLToPath(url)); + const detectedFormat = detectModuleFormat(parsedSource, url); + const format = `${detectedFormat}-typescript`; + if (format === 'module-typescript' && foundPackageJson) { + // This module has a .js extension, a package.json with no `type` field, and ESM syntax. + // Warn about the missing `type` field so that the user can avoid the performance penalty of detection. + warnTypelessPackageJsonFile(pjsonPath, url); } + return format; } if (ext === '') { @@ -190,24 +164,14 @@ function getFileProtocolModuleFormat(url, context = { __proto__: null }, ignoreE } // The controlling `package.json` file has no `type` field. - switch (getOptionValue('--experimental-default-type')) { - case 'module': { // The user explicitly passed `--experimental-default-type=module`. - return underNodeModules(url) ? 'commonjs' : getFormatOfExtensionlessFile(url); - } - case 'commonjs': { // The user explicitly passed `--experimental-default-type=commonjs`. - return 'commonjs'; - } - default: { // The user did not pass `--experimental-default-type`. - if (!source) { - return null; - } - const format = getFormatOfExtensionlessFile(url); - if (format === 'wasm') { - return format; - } - return detectModuleFormat(source, url); - } + if (!source) { + return null; } + const format = getFormatOfExtensionlessFile(url); + if (format === 'wasm') { + return format; + } + return detectModuleFormat(source, url); } const format = extensionFormatMap[ext]; diff --git a/lib/internal/modules/esm/load.js b/lib/internal/modules/esm/load.js index 5ba13096b98047..9661bc716bfa76 100644 --- a/lib/internal/modules/esm/load.js +++ b/lib/internal/modules/esm/load.js @@ -9,12 +9,8 @@ const { const { defaultGetFormat } = require('internal/modules/esm/get_format'); const { validateAttributes, emitImportAssertionWarning } = require('internal/modules/esm/assert'); -const { getOptionValue } = require('internal/options'); const { readFileSync } = require('fs'); -const defaultType = - getOptionValue('--experimental-default-type'); - const { Buffer: { from: BufferFrom } } = require('buffer'); const { URL } = require('internal/url'); @@ -109,7 +105,10 @@ async function defaultLoad(url, context = kEmptyObject) { if (urlInstance.protocol === 'node:') { source = null; format ??= 'builtin'; - } else if (format !== 'commonjs' || defaultType === 'module') { + } else if (format === 'addon') { + // Skip loading addon file content. It must be loaded with dlopen from file system. + source = null; + } else if (format !== 'commonjs') { if (source == null) { ({ responseURL, source } = await getSource(urlInstance, context)); context = { __proto__: context, source }; diff --git a/lib/internal/modules/esm/loader.js b/lib/internal/modules/esm/loader.js index c5594e07d667c3..19eac728623939 100644 --- a/lib/internal/modules/esm/loader.js +++ b/lib/internal/modules/esm/loader.js @@ -42,6 +42,12 @@ const { ModuleWrap, kEvaluating, kEvaluated } = internalBinding('module_wrap'); const { urlToFilename, } = require('internal/modules/helpers'); +const { + resolveHooks, + resolveWithHooks, + loadHooks, + loadWithHooks, +} = require('internal/modules/customization_hooks'); let defaultResolve, defaultLoad, defaultLoadSync, importMetaInitializer; const { tracingChannel } = require('diagnostics_channel'); @@ -137,7 +143,7 @@ class ModuleLoader { /** * Customizations to pass requests to. - * + * @type {import('./hooks.js').Hooks} * Note that this value _MUST_ be set with `setCustomizations` * because it needs to copy `customizations.allowImportMetaResolve` * to this property and failure to do so will cause undefined @@ -207,9 +213,25 @@ class ModuleLoader { } } - async eval(source, url, isEntryPoint = false) { + /** + * + * @param {string} source Source code of the module. + * @param {string} url URL of the module. + * @returns {object} The module wrap object. + */ + createModuleWrap(source, url) { + return compileSourceTextModule(url, source, this); + } + + /** + * + * @param {string} url URL of the module. + * @param {object} wrap Module wrap object. + * @param {boolean} isEntryPoint Whether the module is the entry point. + * @returns {Promise} The module object. + */ + async executeModuleJob(url, wrap, isEntryPoint = false) { const { ModuleJob } = require('internal/modules/esm/module_job'); - const wrap = compileSourceTextModule(url, source, this); const module = await onImport.tracePromise(async () => { const job = new ModuleJob( this, url, undefined, wrap, false, false); @@ -229,6 +251,18 @@ class ModuleLoader { }; } + /** + * + * @param {string} source Source code of the module. + * @param {string} url URL of the module. + * @param {boolean} isEntryPoint Whether the module is the entry point. + * @returns {Promise} The module object. + */ + eval(source, url, isEntryPoint = false) { + const wrap = this.createModuleWrap(source, url); + return this.executeModuleJob(url, wrap, isEntryPoint); + } + /** * Get a (possibly not yet fully linked) module job from the cache, or create one and return its Promise. * @param {string} specifier The module request of the module to be resolved. Typically, what's @@ -350,7 +384,7 @@ class ModuleLoader { // TODO(joyeecheung): consolidate cache behavior and use resolveSync() and // loadSync() here. - const resolveResult = this.#cachedDefaultResolve(specifier, parentURL, importAttributes); + const resolveResult = this.#cachedResolveSync(specifier, parentURL, importAttributes); const { url, format } = resolveResult; if (!getOptionValue('--experimental-require-module')) { throw new ERR_REQUIRE_ESM(url, true); @@ -375,8 +409,7 @@ class ModuleLoader { return job; } - defaultLoadSync ??= require('internal/modules/esm/load').defaultLoadSync; - const loadResult = defaultLoadSync(url, { format, importAttributes }); + const loadResult = this.#loadSync(url, { format, importAttributes }); // Use the synchronous commonjs translator which can deal with cycles. const finalFormat = loadResult.format === 'commonjs' ? 'commonjs-sync' : loadResult.format; @@ -580,6 +613,10 @@ class ModuleLoader { */ resolve(specifier, parentURL, importAttributes) { specifier = `${specifier}`; + if (resolveHooks.length) { + // Has module.registerHooks() hooks, use the synchronous variant that can handle both hooks. + return this.resolveSync(specifier, parentURL, importAttributes); + } if (this.#customizations) { // Only has module.register hooks. return this.#customizations.resolve(specifier, parentURL, importAttributes); } @@ -606,7 +643,26 @@ class ModuleLoader { } /** - * This is the default resolve step for future synchronous hooks, which incorporates asynchronous hooks + * Either return a cached resolution, or perform the synchronous resolution, and + * cache the result. + * @param {string} specifier See {@link resolve}. + * @param {string} [parentURL] See {@link resolve}. + * @param {ImportAttributes} importAttributes See {@link resolve}. + * @returns {{ format: string, url: string }} + */ + #cachedResolveSync(specifier, parentURL, importAttributes) { + const requestKey = this.#resolveCache.serializeKey(specifier, importAttributes); + const cachedResult = this.#resolveCache.get(requestKey, parentURL); + if (cachedResult != null) { + return cachedResult; + } + const result = this.resolveSync(specifier, parentURL, importAttributes); + this.#resolveCache.set(requestKey, parentURL, result); + return result; + } + + /** + * This is the default resolve step for module.registerHooks(), which incorporates asynchronous hooks * from module.register() which are run in a blocking fashion for it to be synchronous. * @param {string|URL} specifier See {@link resolveSync}. * @param {{ parentURL?: string, importAttributes: ImportAttributes}} context See {@link resolveSync}. @@ -624,7 +680,7 @@ class ModuleLoader { * asynchronous resolve hooks from module.register(), it will block until the results are returned * from the loader thread for this to be synchornous. * This is here to support `import.meta.resolve()`, `require()` in imported CJS, and - * future synchronous hooks. + * `module.registerHooks()` hooks. * * TODO(joyeecheung): consolidate the cache behavior and use this in require(esm). * @param {string|URL} specifier See {@link resolve}. @@ -633,7 +689,13 @@ class ModuleLoader { * @returns {{ format: string, url: string }} */ resolveSync(specifier, parentURL, importAttributes = { __proto__: null }) { - return this.#resolveAndMaybeBlockOnLoaderThread(`${specifier}`, { parentURL, importAttributes }); + specifier = `${specifier}`; + if (resolveHooks.length) { + // Has module.registerHooks() hooks, chain the asynchronous hooks in the default step. + return resolveWithHooks(specifier, parentURL, importAttributes, this.#defaultConditions, + this.#resolveAndMaybeBlockOnLoaderThread.bind(this)); + } + return this.#resolveAndMaybeBlockOnLoaderThread(specifier, { parentURL, importAttributes }); } /** @@ -662,6 +724,10 @@ class ModuleLoader { * @returns {Promise<{ format: ModuleFormat, source: ModuleSource }>} */ async load(url, context) { + if (loadHooks.length) { + // Has module.registerHooks() hooks, use the synchronous variant that can handle both hooks. + return this.#loadSync(url, context); + } if (this.#customizations) { return this.#customizations.load(url, context); } @@ -671,7 +737,7 @@ class ModuleLoader { } /** - * This is the default load step for future synchronous hooks, which incorporates asynchronous hooks + * This is the default load step for module.registerHooks(), which incorporates asynchronous hooks * from module.register() which are run in a blocking fashion for it to be synchronous. * @param {string} url See {@link load} * @param {object} context See {@link load} @@ -689,7 +755,7 @@ class ModuleLoader { * Similar to {@link load} but this is always run synchronously. If there are asynchronous hooks * from module.register(), this blocks on the loader thread for it to return synchronously. * - * This is here to support `require()` in imported CJS and future synchronous hooks. + * This is here to support `require()` in imported CJS and `module.registerHooks()` hooks. * * TODO(joyeecheung): consolidate the cache behavior and use this in require(esm). * @param {string} url See {@link load} @@ -697,6 +763,13 @@ class ModuleLoader { * @returns {{ format: ModuleFormat, source: ModuleSource }} */ #loadSync(url, context) { + if (loadHooks.length) { + // Has module.registerHooks() hooks, chain the asynchronous hooks in the default step. + // TODO(joyeecheung): construct the ModuleLoadContext in the loaders directly instead + // of converting them from plain objects in the hooks. + return loadWithHooks(url, context.format, context.importAttributes, this.#defaultConditions, + this.#loadAndMaybeBlockOnLoaderThread.bind(this)); + } return this.#loadAndMaybeBlockOnLoaderThread(url, context); } diff --git a/lib/internal/modules/esm/module_job.js b/lib/internal/modules/esm/module_job.js index 8fba05e7b8f699..8039e2f57a500f 100644 --- a/lib/internal/modules/esm/module_job.js +++ b/lib/internal/modules/esm/module_job.js @@ -131,7 +131,8 @@ class ModuleJob extends ModuleJobBase { // Iterate with index to avoid calling into userspace with `Symbol.iterator`. for (let idx = 0; idx < moduleRequests.length; idx++) { const { specifier, attributes } = moduleRequests[idx]; - + // TODO(joyeecheung): resolve all requests first, then load them in another + // loop so that hooks can pre-fetch sources off-thread. const dependencyJobPromise = this.#loader.getModuleJobForImport( specifier, this.url, attributes, ); diff --git a/lib/internal/modules/esm/translators.js b/lib/internal/modules/esm/translators.js index a9a3234befe10f..678659aacaad3e 100644 --- a/lib/internal/modules/esm/translators.js +++ b/lib/internal/modules/esm/translators.js @@ -3,7 +3,6 @@ const { ArrayPrototypeMap, ArrayPrototypePush, - Boolean, FunctionPrototypeCall, JSONParse, ObjectKeys, @@ -26,7 +25,7 @@ const { const { BuiltinModule } = require('internal/bootstrap/realm'); const assert = require('internal/assert'); const { readFileSync } = require('fs'); -const { dirname, extname, isAbsolute } = require('path'); +const { dirname, extname } = require('path'); const { assertBufferSource, loadBuiltinModule, @@ -42,6 +41,9 @@ const { kModuleSource, kModuleExport, kModuleExportNames, + findLongestRegisteredExtension, + resolveForCJSWithHooks, + loadSourceForCJSWithHooks, } = require('internal/modules/cjs/loader'); const { fileURLToPath, pathToFileURL, URL } = require('internal/url'); let debug = require('internal/util/debuglog').debuglog('esm', (fn) => { @@ -49,6 +51,7 @@ let debug = require('internal/util/debuglog').debuglog('esm', (fn) => { }); const { emitExperimentalWarning, kEmptyObject, setOwnProperty, isWindows } = require('internal/util'); const { + ERR_INVALID_RETURN_PROPERTY_VALUE, ERR_UNKNOWN_BUILTIN_MODULE, } = require('internal/errors').codes; const { maybeCacheSourceMap } = require('internal/source_map/source_map_cache'); @@ -171,17 +174,18 @@ const cjsCache = new SafeMap(); * @param {string} url - The URL of the module. * @param {string} source - The source code of the module. * @param {boolean} isMain - Whether the module is the main module. + * @param {string} format - Format of the module. * @param {typeof loadCJSModule} [loadCJS=loadCJSModule] - The function to load the CommonJS module. * @returns {ModuleWrap} The ModuleWrap object for the CommonJS module. */ -function createCJSModuleWrap(url, source, isMain, loadCJS = loadCJSModule) { +function createCJSModuleWrap(url, source, isMain, format, loadCJS = loadCJSModule) { debug(`Translating CJSModule ${url}`); const filename = urlToFilename(url); // In case the source was not provided by the `load` step, we need fetch it now. source = stringify(source ?? getSource(new URL(url)).source); - const { exportNames, module } = cjsPreparseModuleExports(filename, source); + const { exportNames, module } = cjsPreparseModuleExports(filename, source, format); cjsCache.set(url, module); const wrapperNames = [...exportNames, 'module.exports']; @@ -225,10 +229,51 @@ function createCJSModuleWrap(url, source, isMain, loadCJS = loadCJSModule) { }, module); } +/** + * Creates a ModuleWrap object for a CommonJS module without source texts. + * @param {string} url - The URL of the module. + * @param {boolean} isMain - Whether the module is the main module. + * @returns {ModuleWrap} The ModuleWrap object for the CommonJS module. + */ +function createCJSNoSourceModuleWrap(url, isMain) { + debug(`Translating CJSModule without source ${url}`); + + const filename = urlToFilename(url); + + const module = cjsEmplaceModuleCacheEntry(filename); + cjsCache.set(url, module); + + if (isMain) { + setOwnProperty(process, 'mainModule', module); + } + + // Addon export names are not known until the addon is loaded. + const exportNames = ['default', 'module.exports']; + return new ModuleWrap(url, undefined, exportNames, function evaluationCallback() { + debug(`Loading CJSModule ${url}`); + + if (!module.loaded) { + wrapModuleLoad(filename, null, isMain); + } + + /** @type {import('./loader').ModuleExports} */ + let exports; + if (module[kModuleExport] !== undefined) { + exports = module[kModuleExport]; + module[kModuleExport] = undefined; + } else { + ({ exports } = module); + } + + this.setExport('default', exports); + this.setExport('module.exports', exports); + }, module); +} + translators.set('commonjs-sync', function requireCommonJS(url, source, isMain) { initCJSParseSync(); - return createCJSModuleWrap(url, source, isMain, (module, source, url, filename, isMain) => { + return createCJSModuleWrap(url, source, isMain, 'commonjs', (module, source, url, filename, isMain) => { assert(module === CJSModule._cache[filename]); wrapModuleLoad(filename, null, isMain); }); @@ -240,16 +285,15 @@ translators.set('require-commonjs', (url, source, isMain) => { initCJSParseSync(); assert(cjsParse); - return createCJSModuleWrap(url, source); + return createCJSModuleWrap(url, source, isMain, 'commonjs'); }); // Handle CommonJS modules referenced by `require` calls. // This translator function must be sync, as `require` is sync. translators.set('require-commonjs-typescript', (url, source, isMain) => { - emitExperimentalWarning('Type Stripping'); assert(cjsParse); const code = stripTypeScriptModuleTypes(stringify(source), url); - return createCJSModuleWrap(url, code); + return createCJSModuleWrap(url, code, isMain, 'commonjs-typescript'); }); // Handle CommonJS modules referenced by `import` statements or expressions, @@ -273,30 +317,48 @@ translators.set('commonjs', function commonjsStrategy(url, source, isMain) { } catch { // Continue regardless of error. } - return createCJSModuleWrap(url, source, isMain, cjsLoader); + return createCJSModuleWrap(url, source, isMain, 'commonjs', cjsLoader); }); +/** + * Get or create an entry in the CJS module cache for the given filename. + * @param {string} filename CJS module filename + * @returns {CJSModule} the cached CJS module entry + */ +function cjsEmplaceModuleCacheEntry(filename, exportNames) { + // TODO: Do we want to keep hitting the user mutable CJS loader here? + let cjsMod = CJSModule._cache[filename]; + if (cjsMod) { + return cjsMod; + } + + cjsMod = new CJSModule(filename); + cjsMod.filename = filename; + cjsMod.paths = CJSModule._nodeModulePaths(cjsMod.path); + cjsMod[kIsCachedByESMLoader] = true; + CJSModule._cache[filename] = cjsMod; + + return cjsMod; +} + /** * Pre-parses a CommonJS module's exports and re-exports. * @param {string} filename - The filename of the module. * @param {string} [source] - The source code of the module. + * @param {string} [format] */ -function cjsPreparseModuleExports(filename, source) { - // TODO: Do we want to keep hitting the user mutable CJS loader here? - let module = CJSModule._cache[filename]; - if (module && module[kModuleExportNames] !== undefined) { +function cjsPreparseModuleExports(filename, source, format) { + const module = cjsEmplaceModuleCacheEntry(filename); + if (module[kModuleExportNames] !== undefined) { return { module, exportNames: module[kModuleExportNames] }; } - const loaded = Boolean(module); - if (!loaded) { - module = new CJSModule(filename); - module.filename = filename; - module.paths = CJSModule._nodeModulePaths(module.path); - module[kIsCachedByESMLoader] = true; - module[kModuleSource] = source; - CJSModule._cache[filename] = module; + + if (source === undefined) { + ({ source } = loadSourceForCJSWithHooks(module, filename, format)); } + module[kModuleSource] = source; + debug(`Preparsing exports of ${filename}`); let exports, reexports; try { ({ exports, reexports } = cjsParse(source || '')); @@ -310,34 +372,27 @@ function cjsPreparseModuleExports(filename, source) { // Set first for cycles. module[kModuleExportNames] = exportNames; + // If there are any re-exports e.g. `module.exports = { ...require(...) }`, + // pre-parse the dependencies to find transitively exported names. if (reexports.length) { - module.filename = filename; - module.paths = CJSModule._nodeModulePaths(module.path); + module.filename ??= filename; + module.paths ??= CJSModule._nodeModulePaths(dirname(filename)); + for (let i = 0; i < reexports.length; i++) { + debug(`Preparsing re-exports of '${filename}'`); const reexport = reexports[i]; let resolved; + let format; try { - // TODO: this should be calling the `resolve` hook chain instead. - // Doing so would mean dropping support for CJS in the loader thread, as - // this call needs to be sync from the perspective of the main thread, - // which we can do via HooksProxy and Atomics, but we can't do within - // the loaders thread. Until this is done, the lexer will use the - // monkey-patchable CJS loader to get the path to the module file to - // load (which may or may not be aligned with the URL that the `resolve` - // hook have returned). - resolved = CJSModule._resolveFilename(reexport, module); - } catch { + ({ format, filename: resolved } = resolveForCJSWithHooks(reexport, module, false)); + } catch (e) { + debug(`Failed to resolve '${reexport}', skipping`, e); continue; } - // TODO: this should be calling the `load` hook chain and check if it returns - // `format: 'commonjs'` instead of relying on file extensions. - const ext = extname(resolved); - if ((ext === '.js' || ext === '.cjs' || !CJSModule._extensions[ext]) && - isAbsolute(resolved)) { - // TODO: this should be calling the `load` hook chain to get the source - // (and fallback to reading the FS only if the source is nullish). - const source = readFileSync(resolved, 'utf-8'); - const { exportNames: reexportNames } = cjsPreparseModuleExports(resolved, source); + + if (format === 'commonjs' || + (!BuiltinModule.normalizeRequirableId(resolved) && findLongestRegisteredExtension(resolved) === '.js')) { + const { exportNames: reexportNames } = cjsPreparseModuleExports(resolved, undefined, format); for (const name of reexportNames) { exportNames.add(name); } @@ -459,9 +514,27 @@ translators.set('wasm', async function(url, source) { }).module; }); +// Strategy for loading a addon +translators.set('addon', function translateAddon(url, source, isMain) { + emitExperimentalWarning('Importing addons'); + + // The addon must be loaded from file system with dlopen. Assert + // the source is null. + if (source !== null) { + throw new ERR_INVALID_RETURN_PROPERTY_VALUE( + 'null', + 'load', + 'source', + source); + } + + debug(`Translating addon ${url}`); + + return createCJSNoSourceModuleWrap(url, isMain); +}); + // Strategy for loading a commonjs TypeScript module translators.set('commonjs-typescript', function(url, source) { - emitExperimentalWarning('Type Stripping'); assertBufferSource(source, true, 'load'); const code = stripTypeScriptModuleTypes(stringify(source), url); debug(`Translating TypeScript ${url}`); @@ -470,7 +543,6 @@ translators.set('commonjs-typescript', function(url, source) { // Strategy for loading an esm TypeScript module translators.set('module-typescript', function(url, source) { - emitExperimentalWarning('Type Stripping'); assertBufferSource(source, true, 'load'); const code = stripTypeScriptModuleTypes(stringify(source), url); debug(`Translating TypeScript ${url}`); diff --git a/lib/internal/modules/esm/worker.js b/lib/internal/modules/esm/worker.js index 311d77fb099384..0213df7a92a0eb 100644 --- a/lib/internal/modules/esm/worker.js +++ b/lib/internal/modules/esm/worker.js @@ -215,8 +215,6 @@ async function customizedModuleWorker(lock, syncCommPort, errorHandler) { (port ?? syncCommPort).postMessage(wrapMessage('error', exception)); } - AtomicsAdd(lock, WORKER_TO_MAIN_THREAD_NOTIFICATION, 1); - AtomicsNotify(lock, WORKER_TO_MAIN_THREAD_NOTIFICATION); if (shouldRemoveGlobalErrorHandler) { process.off('uncaughtException', errorHandler); } @@ -225,6 +223,10 @@ async function customizedModuleWorker(lock, syncCommPort, errorHandler) { // We keep checking for new messages to not miss any. clearImmediate(immediate); immediate = setImmediate(checkForMessages).unref(); + // To prevent the main thread from terminating before this function completes after unlocking, + // the following process is executed at the end of the function. + AtomicsAdd(lock, WORKER_TO_MAIN_THREAD_NOTIFICATION, 1); + AtomicsNotify(lock, WORKER_TO_MAIN_THREAD_NOTIFICATION); } } diff --git a/lib/internal/modules/helpers.js b/lib/internal/modules/helpers.js index 1e4b623af77877..c3122118cab75d 100644 --- a/lib/internal/modules/helpers.js +++ b/lib/internal/modules/helpers.js @@ -97,15 +97,14 @@ function getCjsConditions() { /** * Provide one of Node.js' public modules to user code. * @param {string} id - The identifier/specifier of the builtin module to load - * @param {string} request - The module requiring or importing the builtin module */ -function loadBuiltinModule(id, request) { +function loadBuiltinModule(id) { if (!BuiltinModule.canBeRequiredByUsers(id)) { return; } /** @type {import('internal/bootstrap/realm.js').BuiltinModule} */ const mod = BuiltinModule.map.get(id); - debug('load built-in module %s', request); + debug('load built-in module %s', id); // compileForPublicLoader() throws if canBeRequiredByUsers is false: mod.compileForPublicLoader(); return mod; diff --git a/lib/internal/modules/package_json_reader.js b/lib/internal/modules/package_json_reader.js index ab9842ee53a7c8..6e1da13fdc479f 100644 --- a/lib/internal/modules/package_json_reader.js +++ b/lib/internal/modules/package_json_reader.js @@ -267,8 +267,8 @@ function getPackageJSONURL(specifier, base) { throw new ERR_MODULE_NOT_FOUND(packageName, fileURLToPath(base), null); } -const pjsonImportAttributes = { __proto__: null, type: 'json' }; -let cascadedLoader; +/** @type {import('./esm/resolve.js').defaultResolve} */ +let defaultResolve; /** * @param {URL['href'] | string | URL} specifier The location for which to get the "root" package.json * @param {URL['href'] | string | URL} [base] The location of the current module (ex file://tmp/foo.js). @@ -296,10 +296,15 @@ function findPackageJSON(specifier, base = 'data:') { } let resolvedTarget; - cascadedLoader ??= require('internal/modules/esm/loader').getOrInitializeCascadedLoader(); + defaultResolve ??= require('internal/modules/esm/resolve').defaultResolve; try { - resolvedTarget = cascadedLoader.resolve(specifier, `${parentURL}`, pjsonImportAttributes).url; + // TODO(@JakobJingleheimer): Detect whether findPackageJSON is being used within a loader + // (possibly piggyback on `allowImportMetaResolve`) + // - When inside, use the default resolve + // - (I think it's impossible to use the chain because of re-entry & a deadlock from atomics). + // - When outside, use cascadedLoader.resolveSync (not implemented yet, but the pieces exist). + resolvedTarget = defaultResolve(specifier, { parentURL: `${parentURL}` }).url; } catch (err) { if (err.code === 'ERR_UNSUPPORTED_DIR_IMPORT') { resolvedTarget = err.url; diff --git a/lib/internal/modules/run_main.js b/lib/internal/modules/run_main.js index ab4783a7982b9f..9c90f0f6d3e33b 100644 --- a/lib/internal/modules/run_main.js +++ b/lib/internal/modules/run_main.js @@ -26,32 +26,18 @@ const { * @param {string} main - Entry point path */ function resolveMainPath(main) { - const defaultType = getOptionValue('--experimental-default-type'); /** @type {string} */ let mainPath; - if (defaultType === 'module') { - if (getOptionValue('--preserve-symlinks-main')) { return; } - mainPath = path.resolve(main); - } else { - // Extension searching for the main entry point is supported only in legacy mode. - // Module._findPath is monkey-patchable here. - const { Module } = require('internal/modules/cjs/loader'); - mainPath = Module._findPath(path.resolve(main), null, true); - } + // Extension searching for the main entry point is supported for backward compatibility. + // Module._findPath is monkey-patchable here. + const { Module } = require('internal/modules/cjs/loader'); + mainPath = Module._findPath(path.resolve(main), null, true); if (!mainPath) { return; } const preserveSymlinksMain = getOptionValue('--preserve-symlinks-main'); if (!preserveSymlinksMain) { const { toRealPath } = require('internal/modules/helpers'); - try { - mainPath = toRealPath(mainPath); - } catch (err) { - if (defaultType === 'module' && err?.code === 'ENOENT') { - const { decorateErrorWithCommonJSHints } = require('internal/modules/esm/resolve'); - decorateErrorWithCommonJSHints(err, mainPath, getCWDURL()); - } - throw err; - } + mainPath = toRealPath(mainPath); } return mainPath; @@ -62,8 +48,6 @@ function resolveMainPath(main) { * @param {string} mainPath - Absolute path to the main entry point */ function shouldUseESMLoader(mainPath) { - if (getOptionValue('--experimental-default-type') === 'module') { return true; } - /** * @type {string[]} userLoaders A list of custom loaders registered by the user * (or an empty list when none have been registered). @@ -81,8 +65,6 @@ function shouldUseESMLoader(mainPath) { if (!mainPath || StringPrototypeEndsWith(mainPath, '.cjs')) { return false; } if (getOptionValue('--experimental-strip-types')) { - // This ensures that --experimental-default-type=commonjs and .mts files are treated as commonjs - if (getOptionValue('--experimental-default-type') === 'commonjs') { return false; } if (!mainPath || StringPrototypeEndsWith(mainPath, '.cts')) { return false; } // This will likely change in the future to start with commonjs loader by default if (mainPath && StringPrototypeEndsWith(mainPath, '.mts')) { return true; } @@ -147,7 +129,6 @@ function runEntryPointWithESMLoader(callback) { * Parse the CLI main entry point string and run it. * For backwards compatibility, we have to run a bunch of monkey-patchable code that belongs to the CJS loader (exposed * by `require('module')`) even when the entry point is ESM. - * This monkey-patchable code is bypassed under `--experimental-default-type=module`. * Because of backwards compatibility, this function is exposed publicly via `import { runMain } from 'node:module'`. * Because of module detection, this function will attempt to run ambiguous (no explicit extension, no * `package.json` type field) entry points as CommonJS first; under certain conditions, it will retry running as ESM. diff --git a/lib/internal/modules/typescript.js b/lib/internal/modules/typescript.js index d1b58e86c72ee7..5a240a6a5403b7 100644 --- a/lib/internal/modules/typescript.js +++ b/lib/internal/modules/typescript.js @@ -17,6 +17,7 @@ const { } = require('internal/errors').codes; const { getOptionValue } = require('internal/options'); const assert = require('internal/assert'); +const { Buffer } = require('buffer'); /** * The TypeScript parsing mode, either 'strip-only' or 'transform'. @@ -112,9 +113,13 @@ function processTypeScriptCode(code, options) { * It is used by internal loaders. * @param {string} source TypeScript code to parse. * @param {string} filename The filename of the source code. + * @param {boolean} emitWarning Whether to emit a warning. * @returns {TransformOutput} The stripped TypeScript code. */ -function stripTypeScriptModuleTypes(source, filename) { +function stripTypeScriptModuleTypes(source, filename, emitWarning = true) { + if (emitWarning) { + emitExperimentalWarning('Type Stripping'); + } assert(typeof source === 'string'); if (isUnderNodeModules(filename)) { throw new ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING(filename); @@ -134,9 +139,10 @@ function stripTypeScriptModuleTypes(source, filename) { * @returns {string} The code with the source map attached. */ function addSourceMap(code, sourceMap) { - // TODO(@marco-ippolito) When Buffer.transcode supports utf8 to - // base64 transformation, we should change this line. - const base64SourceMap = internalBinding('buffer').btoa(sourceMap); + // The base64 encoding should be https://datatracker.ietf.org/doc/html/rfc4648#section-4, + // not base64url https://datatracker.ietf.org/doc/html/rfc4648#section-5. See data url + // spec https://tools.ietf.org/html/rfc2397#section-2. + const base64SourceMap = Buffer.from(sourceMap).toString('base64'); return `${code}\n\n//# sourceMappingURL=data:application/json;base64,${base64SourceMap}`; } diff --git a/lib/internal/process/execution.js b/lib/internal/process/execution.js index 68b267b61c39b1..f5b19d5a7e8c9c 100644 --- a/lib/internal/process/execution.js +++ b/lib/internal/process/execution.js @@ -2,6 +2,8 @@ const { RegExpPrototypeExec, + StringPrototypeIndexOf, + StringPrototypeSlice, Symbol, globalThis, } = primordials; @@ -17,6 +19,7 @@ const { } = require('internal/errors'); const { pathToFileURL } = require('internal/url'); const { exitCodes: { kGenericUserError } } = internalBinding('errors'); +const { stripTypeScriptModuleTypes } = require('internal/modules/typescript'); const { executionAsyncId, @@ -32,6 +35,7 @@ const { getOptionValue } = require('internal/options'); const { makeContextifyScript, runScriptInThisContext, } = require('internal/vm'); +const { emitExperimentalWarning, isError } = require('internal/util'); // shouldAbortOnUncaughtToggle is a typed array for faster // communication with JS. const { shouldAbortOnUncaughtToggle } = internalBinding('util'); @@ -70,70 +74,29 @@ function evalModuleEntryPoint(source, print) { } function evalScript(name, body, breakFirstLine, print, shouldLoadESM = false) { - const CJSModule = require('internal/modules/cjs/loader').Module; - - const cwd = tryGetCwd(); const origModule = globalThis.module; // Set e.g. when called from the REPL. - - const module = new CJSModule(name); - module.filename = path.join(cwd, name); - module.paths = CJSModule._nodeModulePaths(cwd); - + const module = createModule(name); const baseUrl = pathToFileURL(module.filename).href; - if (getOptionValue('--experimental-detect-module') && - getOptionValue('--input-type') === '' && getOptionValue('--experimental-default-type') === '' && - containsModuleSyntax(body, name, null, 'no CJS variables')) { - return evalModuleEntryPoint(body, print); + if (shouldUseModuleEntryPoint(name, body)) { + return getOptionValue('--experimental-strip-types') ? + evalTypeScriptModuleEntryPoint(body, print) : + evalModuleEntryPoint(body, print); } - const runScript = () => { - // Create wrapper for cache entry - const script = ` - globalThis.module = module; - globalThis.exports = exports; - globalThis.__dirname = __dirname; - globalThis.require = require; - return (main) => main(); - `; - globalThis.__filename = name; - RegExpPrototypeExec(/^/, ''); // Necessary to reset RegExp statics before user code runs. - const result = module._compile(script, `${name}-wrapper`)(() => { - const hostDefinedOptionId = Symbol(name); - async function importModuleDynamically(specifier, _, importAttributes) { - const cascadedLoader = require('internal/modules/esm/loader').getOrInitializeCascadedLoader(); - return cascadedLoader.import(specifier, baseUrl, importAttributes); - } - const script = makeContextifyScript( - body, // code - name, // filename, - 0, // lineOffset - 0, // columnOffset, - undefined, // cachedData - false, // produceCachedData - undefined, // parsingContext - hostDefinedOptionId, // hostDefinedOptionId - importModuleDynamically, // importModuleDynamically - ); - return runScriptInThisContext(script, true, !!breakFirstLine); - }); - if (print) { - const { log } = require('internal/console/global'); - - process.on('exit', () => { - log(result); - }); - } - - if (origModule !== undefined) - globalThis.module = origModule; - }; + const evalFunction = () => runScriptInContext(name, + body, + breakFirstLine, + print, + module, + baseUrl, + undefined, + origModule); if (shouldLoadESM) { - require('internal/modules/run_main').runEntryPointWithESMLoader(runScript); - return; + return require('internal/modules/run_main').runEntryPointWithESMLoader(evalFunction); } - runScript(); + evalFunction(); } const exceptionHandlerState = { @@ -238,10 +201,283 @@ function readStdin(callback) { }); } +/** + * Adds the TS message to the error stack. + * + * At the 3rd line of the stack, the message is added. + * @param {string} originalStack The stack to decorate + * @param {string} newMessage the message to add to the error stack + * @returns {void} + */ +function decorateCJSErrorWithTSMessage(originalStack, newMessage) { + let index; + for (let i = 0; i < 3; i++) { + index = StringPrototypeIndexOf(originalStack, '\n', index + 1); + } + return StringPrototypeSlice(originalStack, 0, index) + + '\n' + newMessage + + StringPrototypeSlice(originalStack, index); +} + +/** + * + * Wrapper of evalScript + * + * This function wraps the evaluation of the source code in a try-catch block. + * If the source code fails to be evaluated, it will retry evaluating the source code + * with the TypeScript parser. + * + * If the source code fails to be evaluated with the TypeScript parser, + * it will rethrow the original error, adding the TypeScript error message to the stack. + * + * This way we don't change the behavior of the code, but we provide a better error message + * in case of a typescript error. + * @param {string} name The name of the file + * @param {string} source The source code to evaluate + * @param {boolean} breakFirstLine Whether to break on the first line + * @param {boolean} print If the result should be printed + * @param {boolean} shouldLoadESM If the code should be loaded as an ESM module + * @returns {void} + */ +function evalTypeScript(name, source, breakFirstLine, print, shouldLoadESM = false) { + const origModule = globalThis.module; // Set e.g. when called from the REPL. + const module = createModule(name); + const baseUrl = pathToFileURL(module.filename).href; + + if (shouldUseModuleEntryPoint(name, source)) { + return evalTypeScriptModuleEntryPoint(source, print); + } + + let compiledScript; + // This variable can be modified if the source code is stripped. + let sourceToRun = source; + try { + compiledScript = compileScript(name, source, baseUrl); + } catch (originalError) { + // If it's not a SyntaxError, rethrow it. + if (!isError(originalError) || originalError.name !== 'SyntaxError') { + throw originalError; + } + try { + sourceToRun = stripTypeScriptModuleTypes(source, name, false); + // Retry the CJS/ESM syntax detection after stripping the types. + if (shouldUseModuleEntryPoint(name, sourceToRun)) { + return evalTypeScriptModuleEntryPoint(source, print); + } + // If the ContextifiedScript was successfully created, execute it. + // outside the try-catch block to avoid catching runtime errors. + compiledScript = compileScript(name, sourceToRun, baseUrl); + // Emit the experimental warning after the code was successfully evaluated. + emitExperimentalWarning('Type Stripping'); + } catch (tsError) { + // If its not an error, or it's not an invalid typescript syntax error, rethrow it. + if (!isError(tsError) || tsError?.code !== 'ERR_INVALID_TYPESCRIPT_SYNTAX') { + throw tsError; + } + + try { + originalError.stack = decorateCJSErrorWithTSMessage(originalError.stack, tsError.message); + } catch { /* Ignore potential errors coming from `stack` getter/setter */ } + throw originalError; + } + } + + const evalFunction = () => runScriptInContext(name, + sourceToRun, + breakFirstLine, + print, + module, + baseUrl, + compiledScript, + origModule); + + if (shouldLoadESM) { + return require('internal/modules/run_main').runEntryPointWithESMLoader(evalFunction); + } + evalFunction(); +} + +/** + * Wrapper of evalModuleEntryPoint + * + * This function wraps the compilation of the source code in a try-catch block. + * If the source code fails to be compiled, it will retry transpiling the source code + * with the TypeScript parser. + * @param {string} source The source code to evaluate + * @param {boolean} print If the result should be printed + * @returns {Promise} The module evaluation promise + */ +function evalTypeScriptModuleEntryPoint(source, print) { + if (print) { + throw new ERR_EVAL_ESM_CANNOT_PRINT(); + } + + RegExpPrototypeExec(/^/, ''); // Necessary to reset RegExp statics before user code runs. + + return require('internal/modules/run_main').runEntryPointWithESMLoader( + async (loader) => { + const url = getEvalModuleUrl(); + let moduleWrap; + try { + // Compile the module to check for syntax errors. + moduleWrap = loader.createModuleWrap(source, url); + } catch (originalError) { + // If it's not a SyntaxError, rethrow it. + if (!isError(originalError) || originalError.name !== 'SyntaxError') { + throw originalError; + } + let strippedSource; + try { + strippedSource = stripTypeScriptModuleTypes(source, url, false); + // If the moduleWrap was successfully created, execute the module job. + // outside the try-catch block to avoid catching runtime errors. + moduleWrap = loader.createModuleWrap(strippedSource, url); + // Emit the experimental warning after the code was successfully compiled. + emitExperimentalWarning('Type Stripping'); + } catch (tsError) { + // If its not an error, or it's not an invalid typescript syntax error, rethrow it. + if (!isError(tsError) || tsError?.code !== 'ERR_INVALID_TYPESCRIPT_SYNTAX') { + throw tsError; + } + try { + originalError.stack = `${tsError.message}\n\n${originalError.stack}`; + } catch { /* Ignore potential errors coming from `stack` getter/setter */ } + + throw originalError; + } + } + // If the moduleWrap was successfully created either with by just compiling + // or after transpilation, execute the module job. + return loader.executeModuleJob(url, moduleWrap, true); + }, + ); +}; + +/** + * + * Function used to shortcut when `--input-type=module-typescript` is set. + * @param {string} source + * @param {boolean} print + */ +function parseAndEvalModuleTypeScript(source, print) { + // We know its a TypeScript module, we can safely emit the experimental warning. + const strippedSource = stripTypeScriptModuleTypes(source, getEvalModuleUrl()); + evalModuleEntryPoint(strippedSource, print); +} + +/** + * Function used to shortcut when `--input-type=commonjs-typescript` is set + * @param {string} name The name of the file + * @param {string} source The source code to evaluate + * @param {boolean} breakFirstLine Whether to break on the first line + * @param {boolean} print If the result should be printed + * @param {boolean} shouldLoadESM If the code should be loaded as an ESM module + * @returns {void} + */ +function parseAndEvalCommonjsTypeScript(name, source, breakFirstLine, print, shouldLoadESM = false) { + // We know its a TypeScript module, we can safely emit the experimental warning. + const strippedSource = stripTypeScriptModuleTypes(source, getEvalModuleUrl()); + evalScript(name, strippedSource, breakFirstLine, print, shouldLoadESM); +} + +/** + * + * @param {string} name - The filename of the script. + * @param {string} body - The code of the script. + * @param {string} baseUrl Path of the parent importing the module. + * @returns {ContextifyScript} The created contextify script. + */ +function compileScript(name, body, baseUrl) { + const hostDefinedOptionId = Symbol(name); + async function importModuleDynamically(specifier, _, importAttributes) { + const cascadedLoader = require('internal/modules/esm/loader').getOrInitializeCascadedLoader(); + return cascadedLoader.import(specifier, baseUrl, importAttributes); + } + return makeContextifyScript( + body, // code + name, // filename, + 0, // lineOffset + 0, // columnOffset, + undefined, // cachedData + false, // produceCachedData + undefined, // parsingContext + hostDefinedOptionId, // hostDefinedOptionId + importModuleDynamically, // importModuleDynamically + ); +} + +/** + * @param {string} name - The filename of the script. + * @param {string} body - The code of the script. + * @returns {boolean} Whether the module entry point should be evaluated as a module. + */ +function shouldUseModuleEntryPoint(name, body) { + return getOptionValue('--experimental-detect-module') && + getOptionValue('--input-type') === '' && + containsModuleSyntax(body, name, null, 'no CJS variables'); +} + +/** + * + * @param {string} name - The filename of the script. + * @returns {import('internal/modules/esm/loader').CJSModule} The created module. + */ +function createModule(name) { + const CJSModule = require('internal/modules/cjs/loader').Module; + const cwd = tryGetCwd(); + const module = new CJSModule(name); + module.filename = path.join(cwd, name); + module.paths = CJSModule._nodeModulePaths(cwd); + return module; +} + +/** + * + * @param {string} name - The filename of the script. + * @param {string} body - The code of the script. + * @param {boolean} breakFirstLine Whether to break on the first line + * @param {boolean} print If the result should be printed + * @param {import('internal/modules/esm/loader').CJSModule} module The module + * @param {string} baseUrl Path of the parent importing the module. + * @param {object} compiledScript The compiled script. + * @param {any} origModule The original module. + * @returns {void} + */ +function runScriptInContext(name, body, breakFirstLine, print, module, baseUrl, compiledScript, origModule) { + // Create wrapper for cache entry + const script = ` + globalThis.module = module; + globalThis.exports = exports; + globalThis.__dirname = __dirname; + globalThis.require = require; + return (main) => main(); + `; + globalThis.__filename = name; + RegExpPrototypeExec(/^/, ''); // Necessary to reset RegExp statics before user code runs. + const result = module._compile(script, `${name}-wrapper`)(() => { + // If the script was already compiled, use it. + return runScriptInThisContext( + compiledScript ?? compileScript(name, body, baseUrl), + true, !!breakFirstLine); + }); + if (print) { + const { log } = require('internal/console/global'); + + process.on('exit', () => { + log(result); + }); + } + if (origModule !== undefined) + globalThis.module = origModule; +} + module.exports = { + parseAndEvalCommonjsTypeScript, + parseAndEvalModuleTypeScript, readStdin, tryGetCwd, evalModuleEntryPoint, + evalTypeScript, evalScript, onGlobalUncaughtException: createOnGlobalUncaughtException(), setUncaughtExceptionCaptureCallback, diff --git a/lib/internal/process/per_thread.js b/lib/internal/process/per_thread.js index 54fde20e220ce4..0921f583183d71 100644 --- a/lib/internal/process/per_thread.js +++ b/lib/internal/process/per_thread.js @@ -13,6 +13,7 @@ const { ArrayPrototypeSplice, BigUint64Array, Float64Array, + FunctionPrototypeCall, NumberMAX_SAFE_INTEGER, ObjectDefineProperty, ObjectFreeze, @@ -26,6 +27,7 @@ const { StringPrototypeReplace, StringPrototypeSlice, Symbol, + SymbolFor, SymbolIterator, } = primordials; @@ -418,6 +420,16 @@ function toggleTraceCategoryState(asyncHooksEnabled) { const { arch, platform, version } = process; +function ref(maybeRefable) { + const fn = maybeRefable?.[SymbolFor('node:ref')] || maybeRefable?.ref; + if (typeof fn === 'function') FunctionPrototypeCall(fn, maybeRefable); +} + +function unref(maybeRefable) { + const fn = maybeRefable?.[SymbolFor('node:unref')] || maybeRefable?.unref; + if (typeof fn === 'function') FunctionPrototypeCall(fn, maybeRefable); +} + module.exports = { toggleTraceCategoryState, buildAllowedFlags, @@ -427,4 +439,6 @@ module.exports = { arch, platform, version, + ref, + unref, }; diff --git a/lib/internal/process/permission.js b/lib/internal/process/permission.js index 7a6dd80d1d01f3..bfdfe29fe4739f 100644 --- a/lib/internal/process/permission.js +++ b/lib/internal/process/permission.js @@ -9,16 +9,16 @@ const { validateString, validateBuffer } = require('internal/validators'); const { Buffer } = require('buffer'); const { isBuffer } = Buffer; -let experimentalPermission; +let _permission; module.exports = ObjectFreeze({ __proto__: null, isEnabled() { - if (experimentalPermission === undefined) { + if (_permission === undefined) { const { getOptionValue } = require('internal/options'); - experimentalPermission = getOptionValue('--experimental-permission'); + _permission = getOptionValue('--permission'); } - return experimentalPermission; + return _permission; }, has(scope, reference) { validateString(scope, 'scope'); diff --git a/lib/internal/process/pre_execution.js b/lib/internal/process/pre_execution.js index 08945a62d4277b..b3aba59674b82b 100644 --- a/lib/internal/process/pre_execution.js +++ b/lib/internal/process/pre_execution.js @@ -303,7 +303,7 @@ function setupNavigator() { } function setupSQLite() { - if (!getOptionValue('--experimental-sqlite')) { + if (getOptionValue('--no-experimental-sqlite')) { return; } @@ -520,14 +520,13 @@ function initializeClusterIPC() { } function initializePermission() { - const experimentalPermission = getOptionValue('--experimental-permission'); - if (experimentalPermission) { + const permission = getOptionValue('--permission'); + if (permission) { process.binding = function binding(_module) { throw new ERR_ACCESS_DENIED('process.binding'); }; // Guarantee path module isn't monkey-patched to bypass permission model ObjectFreeze(require('path')); - emitExperimentalWarning('Permission'); const { has } = require('internal/process/permission'); const warnFlags = [ '--allow-addons', @@ -579,7 +578,7 @@ function initializePermission() { ArrayPrototypeForEach(availablePermissionFlags, (flag) => { const value = getOptionValue(flag); if (value.length) { - throw new ERR_MISSING_OPTION('--experimental-permission'); + throw new ERR_MISSING_OPTION('--permission'); } }); } diff --git a/lib/internal/quic/quic.js b/lib/internal/quic/quic.js index 4d0077195d0629..a76708a37ec1d2 100644 --- a/lib/internal/quic/quic.js +++ b/lib/internal/quic/quic.js @@ -5,28 +5,24 @@ /* c8 ignore start */ const { - ArrayBuffer, + ArrayBufferPrototypeTransfer, ArrayIsArray, ArrayPrototypePush, - BigUint64Array, - DataView, - DataViewPrototypeGetBigInt64, - DataViewPrototypeGetBigUint64, - DataViewPrototypeGetUint8, - DataViewPrototypeSetUint8, ObjectDefineProperties, - Symbol, + SafeSet, SymbolAsyncDispose, + SymbolIterator, Uint8Array, } = primordials; +// QUIC requires that Node.js be compiled with crypto support. const { assertCrypto, - customInspectSymbol: kInspect, } = require('internal/util'); -const { inspect } = require('internal/util/inspect'); assertCrypto(); +const { inspect } = require('internal/util/inspect'); + const { Endpoint: Endpoint_, setCallbacks, @@ -54,99 +50,6 @@ const { CLOSECONTEXT_RECEIVE_FAILURE: kCloseContextReceiveFailure, CLOSECONTEXT_SEND_FAILURE: kCloseContextSendFailure, CLOSECONTEXT_START_FAILURE: kCloseContextStartFailure, - - // All of the IDX_STATS_* constants are the index positions of the stats - // fields in the relevant BigUint64Array's that underlie the *Stats objects. - // These are not exposed to end users. - IDX_STATS_ENDPOINT_CREATED_AT, - IDX_STATS_ENDPOINT_DESTROYED_AT, - IDX_STATS_ENDPOINT_BYTES_RECEIVED, - IDX_STATS_ENDPOINT_BYTES_SENT, - IDX_STATS_ENDPOINT_PACKETS_RECEIVED, - IDX_STATS_ENDPOINT_PACKETS_SENT, - IDX_STATS_ENDPOINT_SERVER_SESSIONS, - IDX_STATS_ENDPOINT_CLIENT_SESSIONS, - IDX_STATS_ENDPOINT_SERVER_BUSY_COUNT, - IDX_STATS_ENDPOINT_RETRY_COUNT, - IDX_STATS_ENDPOINT_VERSION_NEGOTIATION_COUNT, - IDX_STATS_ENDPOINT_STATELESS_RESET_COUNT, - IDX_STATS_ENDPOINT_IMMEDIATE_CLOSE_COUNT, - - IDX_STATS_SESSION_CREATED_AT, - IDX_STATS_SESSION_CLOSING_AT, - IDX_STATS_SESSION_DESTROYED_AT, - IDX_STATS_SESSION_HANDSHAKE_COMPLETED_AT, - IDX_STATS_SESSION_HANDSHAKE_CONFIRMED_AT, - IDX_STATS_SESSION_GRACEFUL_CLOSING_AT, - IDX_STATS_SESSION_BYTES_RECEIVED, - IDX_STATS_SESSION_BYTES_SENT, - IDX_STATS_SESSION_BIDI_IN_STREAM_COUNT, - IDX_STATS_SESSION_BIDI_OUT_STREAM_COUNT, - IDX_STATS_SESSION_UNI_IN_STREAM_COUNT, - IDX_STATS_SESSION_UNI_OUT_STREAM_COUNT, - IDX_STATS_SESSION_LOSS_RETRANSMIT_COUNT, - IDX_STATS_SESSION_MAX_BYTES_IN_FLIGHT, - IDX_STATS_SESSION_BYTES_IN_FLIGHT, - IDX_STATS_SESSION_BLOCK_COUNT, - IDX_STATS_SESSION_CWND, - IDX_STATS_SESSION_LATEST_RTT, - IDX_STATS_SESSION_MIN_RTT, - IDX_STATS_SESSION_RTTVAR, - IDX_STATS_SESSION_SMOOTHED_RTT, - IDX_STATS_SESSION_SSTHRESH, - IDX_STATS_SESSION_DATAGRAMS_RECEIVED, - IDX_STATS_SESSION_DATAGRAMS_SENT, - IDX_STATS_SESSION_DATAGRAMS_ACKNOWLEDGED, - IDX_STATS_SESSION_DATAGRAMS_LOST, - - IDX_STATS_STREAM_CREATED_AT, - IDX_STATS_STREAM_RECEIVED_AT, - IDX_STATS_STREAM_ACKED_AT, - IDX_STATS_STREAM_CLOSING_AT, - IDX_STATS_STREAM_DESTROYED_AT, - IDX_STATS_STREAM_BYTES_RECEIVED, - IDX_STATS_STREAM_BYTES_SENT, - IDX_STATS_STREAM_MAX_OFFSET, - IDX_STATS_STREAM_MAX_OFFSET_ACK, - IDX_STATS_STREAM_MAX_OFFSET_RECV, - IDX_STATS_STREAM_FINAL_SIZE, - - IDX_STATE_SESSION_PATH_VALIDATION, - IDX_STATE_SESSION_VERSION_NEGOTIATION, - IDX_STATE_SESSION_DATAGRAM, - IDX_STATE_SESSION_SESSION_TICKET, - IDX_STATE_SESSION_CLOSING, - IDX_STATE_SESSION_GRACEFUL_CLOSE, - IDX_STATE_SESSION_SILENT_CLOSE, - IDX_STATE_SESSION_STATELESS_RESET, - IDX_STATE_SESSION_DESTROYED, - IDX_STATE_SESSION_HANDSHAKE_COMPLETED, - IDX_STATE_SESSION_HANDSHAKE_CONFIRMED, - IDX_STATE_SESSION_STREAM_OPEN_ALLOWED, - IDX_STATE_SESSION_PRIORITY_SUPPORTED, - IDX_STATE_SESSION_WRAPPED, - IDX_STATE_SESSION_LAST_DATAGRAM_ID, - - IDX_STATE_ENDPOINT_BOUND, - IDX_STATE_ENDPOINT_RECEIVING, - IDX_STATE_ENDPOINT_LISTENING, - IDX_STATE_ENDPOINT_CLOSING, - IDX_STATE_ENDPOINT_BUSY, - IDX_STATE_ENDPOINT_PENDING_CALLBACKS, - - IDX_STATE_STREAM_ID, - IDX_STATE_STREAM_FIN_SENT, - IDX_STATE_STREAM_FIN_RECEIVED, - IDX_STATE_STREAM_READ_ENDED, - IDX_STATE_STREAM_WRITE_ENDED, - IDX_STATE_STREAM_DESTROYED, - IDX_STATE_STREAM_PAUSED, - IDX_STATE_STREAM_RESET, - IDX_STATE_STREAM_HAS_READER, - IDX_STATE_STREAM_WANTS_BLOCK, - IDX_STATE_STREAM_WANTS_HEADERS, - IDX_STATE_STREAM_WANTS_RESET, - IDX_STATE_STREAM_WANTS_TRAILERS, } = internalBinding('quic'); const { @@ -160,12 +63,16 @@ const { const { codes: { + ERR_ILLEGAL_CONSTRUCTOR, ERR_INVALID_ARG_TYPE, ERR_INVALID_ARG_VALUE, ERR_INVALID_STATE, + ERR_QUIC_APPLICATION_ERROR, ERR_QUIC_CONNECTION_FAILED, ERR_QUIC_ENDPOINT_CLOSED, ERR_QUIC_OPEN_STREAM_FAILED, + ERR_QUIC_TRANSPORT_ERROR, + ERR_QUIC_VERSION_NEGOTIATION_ERROR, }, } = require('internal/errors'); @@ -180,34 +87,74 @@ const { isCryptoKey, } = require('internal/crypto/keys'); -const { - kHandle: kKeyObjectHandle, - kKeyObject: kKeyObjectInner, -} = require('internal/crypto/util'); - const { validateFunction, validateObject, + validateString, + validateBoolean, } = require('internal/validators'); const kEmptyObject = { __proto__: null }; -const kEnumerable = { __proto__: null, enumerable: true }; - -const kBlocked = Symbol('kBlocked'); -const kDatagram = Symbol('kDatagram'); -const kDatagramStatus = Symbol('kDatagramStatus'); -const kError = Symbol('kError'); -const kFinishClose = Symbol('kFinishClose'); -const kHandshake = Symbol('kHandshake'); -const kHeaders = Symbol('kHeaders'); -const kOwner = Symbol('kOwner'); -const kNewSession = Symbol('kNewSession'); -const kNewStream = Symbol('kNewStream'); -const kPathValidation = Symbol('kPathValidation'); -const kReset = Symbol('kReset'); -const kSessionTicket = Symbol('kSessionTicket'); -const kTrailers = Symbol('kTrailers'); -const kVersionNegotiation = Symbol('kVersionNegotiation'); + +const { + kBlocked, + kDatagram, + kDatagramStatus, + kError, + kFinishClose, + kHandshake, + kHeaders, + kOwner, + kRemoveSession, + kNewSession, + kRemoveStream, + kNewStream, + kPathValidation, + kReset, + kSessionTicket, + kTrailers, + kVersionNegotiation, + kInspect, + kKeyObjectHandle, + kKeyObjectInner, + kPrivateConstructor, +} = require('internal/quic/symbols'); + +const { + QuicEndpointStats, + QuicStreamStats, + QuicSessionStats, +} = require('internal/quic/stats'); + +const { + QuicEndpointState, + QuicSessionState, + QuicStreamState, +} = require('internal/quic/state'); + +const { assert } = require('internal/assert'); + +const dc = require('diagnostics_channel'); +const onEndpointCreatedChannel = dc.channel('quic.endpoint.created'); +const onEndpointListeningChannel = dc.channel('quic.endpoint.listen'); +const onEndpointClosingChannel = dc.channel('quic.endpoint.closing'); +const onEndpointClosedChannel = dc.channel('quic.endpoint.closed'); +const onEndpointErrorChannel = dc.channel('quic.endpoint.error'); +const onEndpointBusyChangeChannel = dc.channel('quic.endpoint.busy.change'); +const onEndpointClientSessionChannel = dc.channel('quic.session.created.client'); +const onEndpointServerSessionChannel = dc.channel('quic.session.created.server'); +const onSessionOpenStreamChannel = dc.channel('quic.session.open.stream'); +const onSessionReceivedStreamChannel = dc.channel('quic.session.received.stream'); +const onSessionSendDatagramChannel = dc.channel('quic.session.send.datagram'); +const onSessionUpdateKeyChannel = dc.channel('quic.session.update.key'); +const onSessionClosingChannel = dc.channel('quic.session.closing'); +const onSessionClosedChannel = dc.channel('quic.session.closed'); +const onSessionReceiveDatagramChannel = dc.channel('quic.session.receive.datagram'); +const onSessionReceiveDatagramStatusChannel = dc.channel('quic.session.receive.datagram.status'); +const onSessionPathValidationChannel = dc.channel('quic.session.path.validation'); +const onSessionTicketChannel = dc.channel('quic.session.ticket'); +const onSessionVersionNegotiationChannel = dc.channel('quic.session.version.negotiation'); +const onSessionHandshakeChannel = dc.channel('quic.session.handshake'); /** * @typedef {import('../socketaddress.js').SocketAddress} SocketAddress @@ -230,8 +177,8 @@ const kVersionNegotiation = Symbol('kVersionNegotiation'); * @property {bigint|number} [handshakeTimeout] The handshake timeout * @property {bigint|number} [maxStreamWindow] The maximum stream window * @property {bigint|number} [maxWindow] The maximum window - * @property {number} [rxDiagnosticLoss] The receive diagnostic loss (range 0.0-1.0) - * @property {number} [txDiagnosticLoss] The transmit diagnostic loss (range 0.0-1.0) + * @property {number} [rxDiagnosticLoss] The receive diagnostic loss probability (range 0.0-1.0) + * @property {number} [txDiagnosticLoss] The transmit diagnostic loss probability (range 0.0-1.0) * @property {number} [udpReceiveBufferSize] The UDP receive buffer size * @property {number} [udpSendBufferSize] The UDP send buffer size * @property {number} [udpTTL] The UDP TTL @@ -317,64 +264,65 @@ const kVersionNegotiation = Symbol('kVersionNegotiation'); /** * Called when the Endpoint receives a new server-side Session. * @callback OnSessionCallback - * @param {Session} session - * @param {Endpoint} endpoint + * @this {QuicEndpoint} + * @param {QuicSession} session * @returns {void} */ /** * @callback OnStreamCallback + * @this {QuicSession} * @param {QuicStream} stream - * @param {Session} session * @returns {void} */ /** * @callback OnDatagramCallback + * @this {QuicSession} * @param {Uint8Array} datagram - * @param {Session} session - * @param {boolean} early + * @param {boolean} early A datagram is early if it was received before the TLS handshake completed * @returns {void} */ /** * @callback OnDatagramStatusCallback + * @this {QuicSession} * @param {bigint} id * @param {'lost'|'acknowledged'} status - * @param {Session} session * @returns {void} */ /** * @callback OnPathValidationCallback + * @this {QuicSession} * @param {'aborted'|'failure'|'success'} result * @param {SocketAddress} newLocalAddress * @param {SocketAddress} newRemoteAddress * @param {SocketAddress} oldLocalAddress * @param {SocketAddress} oldRemoteAddress * @param {boolean} preferredAddress - * @param {Session} session * @returns {void} */ /** * @callback OnSessionTicketCallback + * @this {QuicSession} * @param {object} ticket - * @param {Session} session * @returns {void} */ /** * @callback OnVersionNegotiationCallback + * @this {QuicSession} * @param {number} version * @param {number[]} requestedVersions * @param {number[]} supportedVersions - * @param {Session} session * @returns {void} */ /** * @callback OnHandshakeCallback + * @this {QuicSession} * @param {string} sni * @param {string} alpn * @param {string} cipher @@ -382,7 +330,6 @@ const kVersionNegotiation = Symbol('kVersionNegotiation'); * @param {string} validationErrorReason * @param {number} validationErrorCode * @param {boolean} earlyDataAccepted - * @param {Session} session * @returns {void} */ @@ -413,6 +360,14 @@ const kVersionNegotiation = Symbol('kVersionNegotiation'); * @returns {void} */ +/** + * @typedef {object} StreamCallbackConfiguration + * @property {OnBlockedCallback} [onblocked] The blocked callback + * @property {OnStreamErrorCallback} [onreset] The reset callback + * @property {OnHeadersCallback} [onheaders] The headers callback + * @property {OnTrailersCallback} [ontrailers] The trailers callback + */ + /** * Provdes the callback configuration for Sessions. * @typedef {object} SessionCallbackConfiguration @@ -426,38 +381,126 @@ const kVersionNegotiation = Symbol('kVersionNegotiation'); */ /** - * @typedef {object} StreamCallbackConfiguration - * @property {OnStreamErrorCallback} onerror The error callback + * @typedef {object} ProcessedSessionCallbackConfiguration + * @property {OnStreamCallback} onstream The stream callback + * @property {OnDatagramCallback} [ondatagram] The datagram callback + * @property {OnDatagramStatusCallback} [ondatagramstatus] The datagram status callback + * @property {OnPathValidationCallback} [onpathvalidation] The path validation callback + * @property {OnSessionTicketCallback} [onsessionticket] The session ticket callback + * @property {OnVersionNegotiationCallback} [onversionnegotiation] The version negotation callback + * @property {OnHandshakeCallback} [onhandshake] The handshake callback + * @property {StreamCallbackConfiguration} stream The processed stream callbacks + */ + +/** + * Provides the callback configuration for the Endpoint. + * @typedef {object} EndpointCallbackConfiguration + * @property {OnSessionCallback} onsession The session callback + * @property {OnStreamCallback} onstream The stream callback + * @property {OnDatagramCallback} [ondatagram] The datagram callback + * @property {OnDatagramStatusCallback} [ondatagramstatus] The datagram status callback + * @property {OnPathValidationCallback} [onpathvalidation] The path validation callback + * @property {OnSessionTicketCallback} [onsessionticket] The session ticket callback + * @property {OnVersionNegotiationCallback} [onversionnegotiation] The version negotiation callback + * @property {OnHandshakeCallback} [onhandshake] The handshake callback * @property {OnBlockedCallback} [onblocked] The blocked callback * @property {OnStreamErrorCallback} [onreset] The reset callback * @property {OnHeadersCallback} [onheaders] The headers callback * @property {OnTrailersCallback} [ontrailers] The trailers callback + * @property {SocketAddress} [address] The local address to bind to + * @property {bigint|number} [retryTokenExpiration] The retry token expiration + * @property {bigint|number} [tokenExpiration] The token expiration + * @property {bigint|number} [maxConnectionsPerHost] The maximum number of connections per host + * @property {bigint|number} [maxConnectionsTotal] The maximum number of total connections + * @property {bigint|number} [maxStatelessResetsPerHost] The maximum number of stateless resets per host + * @property {bigint|number} [addressLRUSize] The size of the address LRU cache + * @property {bigint|number} [maxRetries] The maximum number of retries + * @property {bigint|number} [maxPayloadSize] The maximum payload size + * @property {bigint|number} [unacknowledgedPacketThreshold] The unacknowledged packet threshold + * @property {bigint|number} [handshakeTimeout] The handshake timeout + * @property {bigint|number} [maxStreamWindow] The maximum stream window + * @property {bigint|number} [maxWindow] The maximum window + * @property {number} [rxDiagnosticLoss] The receive diagnostic loss probability (range 0.0-1.0) + * @property {number} [txDiagnosticLoss] The transmit diagnostic loss probability (range 0.0-1.0) + * @property {number} [udpReceiveBufferSize] The UDP receive buffer size + * @property {number} [udpSendBufferSize] The UDP send buffer size + * @property {number} [udpTTL] The UDP TTL + * @property {boolean} [noUdpPayloadSizeShaping] Disable UDP payload size shaping + * @property {boolean} [validateAddress] Validate the address + * @property {boolean} [disableActiveMigration] Disable active migration + * @property {boolean} [ipv6Only] Use IPv6 only + * @property {'reno'|'cubic'|'bbr'|number} [cc] The congestion control algorithm + * @property {ArrayBufferView} [resetTokenSecret] The reset token secret + * @property {ArrayBufferView} [tokenSecret] The token secret */ /** - * Provides the callback configuration for the Endpoint. - * @typedef {object} EndpointCallbackConfiguration + * @typedef {object} ProcessedEndpointCallbackConfiguration * @property {OnSessionCallback} onsession The session callback - * @property {SessionCallbackConfiguration} session The session callback configuration - * @property {StreamCallbackConfiguration} stream The stream callback configuration + * @property {SessionCallbackConfiguration} session The processesd session callbacks */ setCallbacks({ + // QuicEndpoint callbacks + + /** + * Called when the QuicEndpoint C++ handle has closed and we need to finish + * cleaning up the JS side. + * @param {number} context Identifies the reason the endpoint was closed. + * @param {number} status If context indicates an error, provides the error code. + */ onEndpointClose(context, status) { this[kOwner][kFinishClose](context, status); }, + /** + * Called when the QuicEndpoint C++ handle receives a new server-side session + * @param {*} session The QuicSession C++ handle + */ onSessionNew(session) { this[kOwner][kNewSession](session); }, + + // QuicSession callbacks + + /** + * Called when the underlying session C++ handle is closed either normally + * or with an error. + * @param {number} errorType + * @param {number} code + * @param {string} [reason] + */ onSessionClose(errorType, code, reason) { this[kOwner][kFinishClose](errorType, code, reason); }, + + /** + * Called when a datagram is received on this session. + * @param {Uint8Array} uint8Array + * @param {boolean} early + */ onSessionDatagram(uint8Array, early) { this[kOwner][kDatagram](uint8Array, early); }, + + /** + * Called when the status of a datagram is received. + * @param {bigint} id + * @param {'lost' | 'acknowledged'} status + */ onSessionDatagramStatus(id, status) { this[kOwner][kDatagramStatus](id, status); }, + + /** + * Called when the session handshake completes. + * @param {string} sni + * @param {string} alpn + * @param {string} cipher + * @param {string} cipherVersion + * @param {string} validationErrorReason + * @param {number} validationErrorCode + * @param {boolean} earlyDataAccepted + */ onSessionHandshake(sni, alpn, cipher, cipherVersion, validationErrorReason, validationErrorCode, @@ -466,12 +509,37 @@ setCallbacks({ validationErrorReason, validationErrorCode, earlyDataAccepted); }, - onSessionPathValidation(...args) { - this[kOwner][kPathValidation](...args); + + /** + * Called when the session path validation completes. + * @param {'aborted'|'failure'|'success'} result + * @param {SocketAddress} newLocalAddress + * @param {SocketAddress} newRemoteAddress + * @param {SocketAddress} oldLocalAddress + * @param {SocketAddress} oldRemoteAddress + * @param {boolean} preferredAddress + */ + onSessionPathValidation(result, newLocalAddress, newRemoteAddress, + oldLocalAddress, oldRemoteAddress, preferredAddress) { + this[kOwner][kPathValidation](result, newLocalAddress, newRemoteAddress, + oldLocalAddress, oldRemoteAddress, + preferredAddress); }, + + /** + * Called when the session generates a new TLS session ticket + * @param {object} ticket An opaque session ticket + */ onSessionTicket(ticket) { this[kOwner][kSessionTicket](ticket); }, + + /** + * Called when the session receives a session version negotiation request + * @param {*} version + * @param {*} requestedVersions + * @param {*} supportedVersions + */ onSessionVersionNegotiation(version, requestedVersions, supportedVersions) { @@ -479,185 +547,177 @@ setCallbacks({ // Note that immediately following a version negotiation event, the // session will be destroyed. }, + + /** + * Called when a new stream has been received for the session + * @param {object} stream The QuicStream C++ handle + * @param {number} direction The stream direction (0 == bidi, 1 == uni) + */ onStreamCreated(stream, direction) { const session = this[kOwner]; - // The event is ignored if the session has been destroyed. + // The event is ignored and the stream destroyed if the session has been destroyed. if (session.destroyed) { stream.destroy(); return; }; session[kNewStream](stream, direction); }, + + // QuicStream callbacks onStreamBlocked() { + // Called when the stream C++ handle has been blocked by flow control. this[kOwner][kBlocked](); }, onStreamClose(error) { + // Called when the stream C++ handle has been closed. this[kOwner][kError](error); }, onStreamReset(error) { + // Called when the stream C++ handle has received a stream reset. this[kOwner][kReset](error); }, onStreamHeaders(headers, kind) { + // Called when the stream C++ handle has received a full block of headers. this[kOwner][kHeaders](headers, kind); }, onStreamTrailers() { + // Called when the stream C++ handle is ready to receive trailing headers. this[kOwner][kTrailers](); }, }); -/** - * @param {'use'|'ignore'|'default'} policy - * @returns {number} - */ -function getPreferredAddressPolicy(policy = 'default') { - switch (policy) { - case 'use': return PREFERRED_ADDRESS_USE; - case 'ignore': return PREFERRED_ADDRESS_IGNORE; - case 'default': return DEFAULT_PREFERRED_ADDRESS_POLICY; - } - throw new ERR_INVALID_ARG_VALUE('options.preferredAddressPolicy', policy); -} - -/** - * @param {TlsOptions} tls - */ -function processTlsOptions(tls) { - validateObject(tls, 'options.tls'); - const { - sni, - alpn, - ciphers, - groups, - keylog, - verifyClient, - tlsTrace, - verifyPrivateKey, - keys, - certs, - ca, - crl, - } = tls; - - const keyHandles = []; - if (keys !== undefined) { - const keyInputs = ArrayIsArray(keys) ? keys : [keys]; - for (const key of keyInputs) { - if (isKeyObject(key)) { - if (key.type !== 'private') { - throw new ERR_INVALID_ARG_VALUE('options.tls.keys', key, 'must be a private key'); - } - ArrayPrototypePush(keyHandles, key[kKeyObjectHandle]); - } else if (isCryptoKey(key)) { - if (key.type !== 'private') { - throw new ERR_INVALID_ARG_VALUE('options.tls.keys', key, 'must be a private key'); - } - ArrayPrototypePush(keyHandles, key[kKeyObjectInner][kKeyObjectHandle]); - } else { - throw new ERR_INVALID_ARG_TYPE('options.tls.keys', ['KeyObject', 'CryptoKey'], key); - } - } - } - - return { - sni, - alpn, - ciphers, - groups, - keylog, - verifyClient, - tlsTrace, - verifyPrivateKey, - keys: keyHandles, - certs, - ca, - crl, - }; -} - -class QuicStreamStats { - /** @type {BigUint64Array} */ +class QuicStream { + /** @type {object} */ #handle; + /** @type {QuicSession} */ + #session; + /** @type {QuicStreamStats} */ + #stats; + /** @type {QuicStreamState} */ + #state; + /** @type {number} */ + #direction; + /** @type {OnBlockedCallback|undefined} */ + #onblocked; + /** @type {OnStreamErrorCallback|undefined} */ + #onreset; + /** @type {OnHeadersCallback|undefined} */ + #onheaders; + /** @type {OnTrailersCallback|undefined} */ + #ontrailers; /** - * @param {ArrayBuffer} buffer + * @param {symbol} privateSymbol + * @param {StreamCallbackConfiguration} config + * @param {object} handle + * @param {QuicSession} session */ - constructor(buffer) { - if (!isArrayBuffer(buffer)) { - throw new ERR_INVALID_ARG_TYPE('buffer', ['ArrayBuffer'], buffer); + constructor(privateSymbol, config, handle, session, direction) { + if (privateSymbol !== kPrivateConstructor) { + throw new ERR_ILLEGAL_CONSTRUCTOR(); } - this.#handle = new BigUint64Array(buffer); - } - /** @type {bigint} */ - get createdAt() { - return this.#handle[IDX_STATS_STREAM_CREATED_AT]; - } + const { + onblocked, + onreset, + onheaders, + ontrailers, + } = config; - /** @type {bigint} */ - get receivedAt() { - return this.#handle[IDX_STATS_STREAM_RECEIVED_AT]; - } + if (onblocked !== undefined) { + this.#onblocked = onblocked.bind(this); + } + if (onreset !== undefined) { + this.#onreset = onreset.bind(this); + } + if (onheaders !== undefined) { + this.#onheaders = onheaders.bind(this); + } + if (ontrailers !== undefined) { + this.#ontrailers = ontrailers.bind(this); + } + this.#handle = handle; + this.#handle[kOwner] = true; - /** @type {bigint} */ - get ackedAt() { - return this.#handle[IDX_STATS_STREAM_ACKED_AT]; - } + this.#session = session; + this.#direction = direction; - /** @type {bigint} */ - get closingAt() { - return this.#handle[IDX_STATS_STREAM_CLOSING_AT]; + this.#stats = new QuicStreamStats(kPrivateConstructor, this.#handle.stats); + + this.#state = new QuicStreamState(kPrivateConstructor, this.#handle.stats); + this.#state.wantsBlock = !!this.#onblocked; + this.#state.wantsReset = !!this.#onreset; + this.#state.wantsHeaders = !!this.#onheaders; + this.#state.wantsTrailers = !!this.#ontrailers; } + /** @type {QuicStreamStats} */ + get stats() { return this.#stats; } + + /** @type {QuicStreamState} */ + get state() { return this.#state; } + + /** @type {QuicSession} */ + get session() { return this.#session; } + /** @type {bigint} */ - get destroyedAt() { - return this.#handle[IDX_STATS_STREAM_DESTROYED_AT]; + get id() { return this.#state.id; } + + /** @type {'bidi'|'uni'} */ + get direction() { + return this.#direction === 0 ? 'bidi' : 'uni'; } - /** @type {bigint} */ - get bytesReceived() { - return this.#handle[IDX_STATS_STREAM_BYTES_RECEIVED]; + /** @returns {boolean} */ + get destroyed() { + return this.#handle === undefined; } - /** @type {bigint} */ - get bytesSent() { - return this.#handle[IDX_STATS_STREAM_BYTES_SENT]; + destroy(error) { + if (this.destroyed) return; + // TODO(@jasnell): pass an error code + this.#stats[kFinishClose](); + this.#state[kFinishClose](); + this.#onblocked = undefined; + this.#onreset = undefined; + this.#onheaders = undefined; + this.#ontrailers = undefined; + this.#session[kRemoveStream](this); + this.#session = undefined; + this.#handle.destroy(); + this.#handle = undefined; } - /** @type {bigint} */ - get maxOffset() { - return this.#handle[IDX_STATS_STREAM_MAX_OFFSET]; + [kBlocked]() { + // The blocked event should only be called if the stream was created with + // an onblocked callback. The callback should always exist here. + assert(this.#onblocked, 'Unexpected stream blocked event'); + this.#onblocked(this); } - /** @type {bigint} */ - get maxOffsetAcknowledged() { - return this.#handle[IDX_STATS_STREAM_MAX_OFFSET_ACK]; + [kError](error) { + this.destroy(error); } - /** @type {bigint} */ - get maxOffsetReceived() { - return this.#handle[IDX_STATS_STREAM_MAX_OFFSET_RECV]; + [kReset](error) { + // The reset event should only be called if the stream was created with + // an onreset callback. The callback should always exist here. + assert(this.#onreset, 'Unexpected stream reset event'); + this.#onreset(error, this); } - /** @type {bigint} */ - get finalSize() { - return this.#handle[IDX_STATS_STREAM_FINAL_SIZE]; + [kHeaders](headers, kind) { + // The headers event should only be called if the stream was created with + // an onheaders callback. The callback should always exist here. + assert(this.#onheaders, 'Unexpected stream headers event'); + this.#onheaders(headers, kind, this); } - toJSON() { - return { - __proto__: null, - createdAt: `${this.createdAt}`, - receivedAt: `${this.receivedAt}`, - ackedAt: `${this.ackedAt}`, - closingAt: `${this.closingAt}`, - destroyedAt: `${this.destroyedAt}`, - bytesReceived: `${this.bytesReceived}`, - bytesSent: `${this.bytesSent}`, - maxOffset: `${this.maxOffset}`, - maxOffsetAcknowledged: `${this.maxOffsetAcknowledged}`, - maxOffsetReceived: `${this.maxOffsetReceived}`, - finalSize: `${this.finalSize}`, - }; + [kTrailers]() { + // The trailers event should only be called if the stream was created with + // an ontrailers callback. The callback should always exist here. + assert(this.#ontrailers, 'Unexpected stream trailers event'); + this.#ontrailers(this); } [kInspect](depth, options) { @@ -669,731 +729,62 @@ class QuicStreamStats { depth: options.depth == null ? null : options.depth - 1, }; - return `StreamStats ${inspect({ - createdAt: this.createdAt, - receivedAt: this.receivedAt, - ackedAt: this.ackedAt, - closingAt: this.closingAt, - destroyedAt: this.destroyedAt, - bytesReceived: this.bytesReceived, - bytesSent: this.bytesSent, - maxOffset: this.maxOffset, - maxOffsetAcknowledged: this.maxOffsetAcknowledged, - maxOffsetReceived: this.maxOffsetReceived, - finalSize: this.finalSize, + return `Stream ${inspect({ + id: this.id, + direction: this.direction, + stats: this.stats, + state: this.state, + session: this.session, }, opts)}`; } - - [kFinishClose]() { - // Snapshot the stats into a new BigUint64Array since the underlying - // buffer will be destroyed. - this.#handle = new BigUint64Array(this.#handle); - } } -class QuicStreamState { - /** @type {DataView} */ +class QuicSession { + /** @type {QuicEndpoint} */ + #endpoint = undefined; + /** @type {boolean} */ + #isPendingClose = false; + /** @type {object|undefined} */ #handle; + /** @type {PromiseWithResolvers} */ + #pendingClose = Promise.withResolvers(); // eslint-disable-line node-core/prefer-primordials + /** @type {SocketAddress|undefined} */ + #remoteAddress = undefined; + /** @type {QuicSessionState} */ + #state; + /** @type {QuicSessionStats} */ + #stats; + /** @type {Set} */ + #streams = new SafeSet(); + /** @type {OnStreamCallback} */ + #onstream; + /** @type {OnDatagramCallback|undefined} */ + #ondatagram; + /** @type {OnDatagramStatusCallback|undefined} */ + #ondatagramstatus; + /** @type {OnPathValidationCallback|undefined} */ + #onpathvalidation; + /** @type {OnSessionTicketCallback|undefined} */ + #onsessionticket; + /** @type {OnVersionNegotiationCallback|undefined} */ + #onversionnegotiation; + /** @type {OnHandshakeCallback} */ + #onhandshake; + /** @type {StreamCallbackConfiguration} */ + #streamConfig; /** - * @param {ArrayBuffer} buffer + * @param {symbol} privateSymbol + * @param {ProcessedSessionCallbackConfiguration} config + * @param {object} handle + * @param {QuicEndpoint} endpoint */ - constructor(buffer) { - if (!isArrayBuffer(buffer)) { - throw new ERR_INVALID_ARG_TYPE('buffer', ['ArrayBuffer'], buffer); + constructor(privateSymbol, config, handle, endpoint) { + // Instances of QuicSession can only be created internally. + if (privateSymbol !== kPrivateConstructor) { + throw new ERR_ILLEGAL_CONSTRUCTOR(); } - this.#handle = new DataView(buffer); - } - - /** @type {bigint} */ - get id() { - return DataViewPrototypeGetBigInt64(this.#handle, IDX_STATE_STREAM_ID); - } - - /** @type {boolean} */ - get finSent() { - return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_STREAM_FIN_SENT); - } - - /** @type {boolean} */ - get finReceived() { - return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_STREAM_FIN_RECEIVED); - } - - /** @type {boolean} */ - get readEnded() { - return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_STREAM_READ_ENDED); - } - - /** @type {boolean} */ - get writeEnded() { - return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_STREAM_WRITE_ENDED); - } - - /** @type {boolean} */ - get destroyed() { - return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_STREAM_DESTROYED); - } - - /** @type {boolean} */ - get paused() { - return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_STREAM_PAUSED); - } - - /** @type {boolean} */ - get reset() { - return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_STREAM_RESET); - } - - /** @type {boolean} */ - get hasReader() { - return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_STREAM_HAS_READER); - } - - /** @type {boolean} */ - get wantsBlock() { - return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_STREAM_WANTS_BLOCK); - } - - /** @type {boolean} */ - set wantsBlock(val) { - DataViewPrototypeSetUint8(this.#handle, IDX_STATE_STREAM_WANTS_BLOCK, val ? 1 : 0); - } - - /** @type {boolean} */ - get wantsHeaders() { - return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_STREAM_WANTS_HEADERS); - } - - /** @type {boolean} */ - set wantsHeaders(val) { - DataViewPrototypeSetUint8(this.#handle, IDX_STATE_STREAM_WANTS_HEADERS, val ? 1 : 0); - } - - /** @type {boolean} */ - get wantsReset() { - return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_STREAM_WANTS_RESET); - } - - /** @type {boolean} */ - set wantsReset(val) { - DataViewPrototypeSetUint8(this.#handle, IDX_STATE_STREAM_WANTS_RESET, val ? 1 : 0); - } - - /** @type {boolean} */ - get wantsTrailers() { - return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_STREAM_WANTS_TRAILERS); - } - - /** @type {boolean} */ - set wantsTrailers(val) { - DataViewPrototypeSetUint8(this.#handle, IDX_STATE_STREAM_WANTS_TRAILERS, val ? 1 : 0); - } - - toJSON() { - return { - __proto__: null, - id: `${this.id}`, - finSent: this.finSent, - finReceived: this.finReceived, - readEnded: this.readEnded, - writeEnded: this.writeEnded, - destroyed: this.destroyed, - paused: this.paused, - reset: this.reset, - hasReader: this.hasReader, - wantsBlock: this.wantsBlock, - wantsHeaders: this.wantsHeaders, - wantsReset: this.wantsReset, - wantsTrailers: this.wantsTrailers, - }; - } - - [kInspect](depth, options) { - if (depth < 0) - return this; - - const opts = { - ...options, - depth: options.depth == null ? null : options.depth - 1, - }; - - return `StreamState ${inspect({ - id: this.id, - finSent: this.finSent, - finReceived: this.finReceived, - readEnded: this.readEnded, - writeEnded: this.writeEnded, - destroyed: this.destroyed, - paused: this.paused, - reset: this.reset, - hasReader: this.hasReader, - wantsBlock: this.wantsBlock, - wantsHeaders: this.wantsHeaders, - wantsReset: this.wantsReset, - wantsTrailers: this.wantsTrailers, - }, opts)}`; - } - - [kFinishClose]() { - // When the stream is destroyed, the state is no longer available. - this.#handle = new DataView(new ArrayBuffer(0)); - } -} - -class QuicStream { - /** @type {object} */ - #handle; - /** @type {Session} */ - #session; - /** @type {QuicStreamStats} */ - #stats; - /** @type {QuicStreamState} */ - #state; - /** @type {number} */ - #direction; - /** @type {OnStreamErrorCallback} */ - #onerror; - /** @type {OnBlockedCallback|undefined} */ - #onblocked; - /** @type {OnStreamErrorCallback|undefined} */ - #onreset; - /** @type {OnHeadersCallback|undefined} */ - #onheaders; - /** @type {OnTrailersCallback|undefined} */ - #ontrailers; - - /** - * @param {StreamCallbackConfiguration} config - * @param {object} handle - * @param {Session} session - */ - constructor(config, handle, session, direction) { - validateObject(config, 'config'); - this.#stats = new QuicStreamStats(handle.stats); - this.#state = new QuicStreamState(handle.stats); - const { - onblocked, - onerror, - onreset, - onheaders, - ontrailers, - } = config; - if (onblocked !== undefined) { - validateFunction(onblocked, 'config.onblocked'); - this.#state.wantsBlock = true; - this.#onblocked = onblocked; - } - if (onreset !== undefined) { - validateFunction(onreset, 'config.onreset'); - this.#state.wantsReset = true; - this.#onreset = onreset; - } - if (onheaders !== undefined) { - validateFunction(onheaders, 'config.onheaders'); - this.#state.wantsHeaders = true; - this.#onheaders = onheaders; - } - if (ontrailers !== undefined) { - validateFunction(ontrailers, 'config.ontrailers'); - this.#state.wantsTrailers = true; - this.#ontrailers = ontrailers; - } - validateFunction(onerror, 'config.onerror'); - this.#onerror = onerror; - this.#handle = handle; - this.#session = session; - this.#direction = direction; - this.#handle[kOwner] = true; - } - - /** @type {QuicStreamStats} */ - get stats() { return this.#stats; } - - /** @type {QuicStreamState} */ - get state() { return this.#state; } - - /** @type {Session} */ - get session() { return this.#session; } - - /** @type {bigint} */ - get id() { return this.#state.id; } - - /** @type {'bidi'|'uni'} */ - get direction() { - return this.#direction === 0 ? 'bidi' : 'uni'; - } - - [kBlocked]() { - this.#onblocked(this); - } - - [kError](error) { - this.#onerror(error, this); - } - - [kReset](error) { - this.#onreset(error, this); - } - - [kHeaders](headers, kind) { - this.#onheaders(headers, kind, this); - } - - [kTrailers]() { - this.#ontrailers(this); - } - - [kInspect](depth, options) { - if (depth < 0) - return this; - - const opts = { - ...options, - depth: options.depth == null ? null : options.depth - 1, - }; - - return `Stream ${inspect({ - id: this.id, - direction: this.direction, - stats: this.stats, - state: this.state, - session: this.session, - }, opts)}`; - } -} - -class SessionStats { - /** @type {BigUint64Array} */ - #handle; - - /** - * @param {BigUint64Array} buffer - */ - constructor(buffer) { - if (!isArrayBuffer(buffer)) { - throw new ERR_INVALID_ARG_TYPE('buffer', ['ArrayBuffer'], buffer); - } - this.#handle = new BigUint64Array(buffer); - } - - /** @type {bigint} */ - get createdAt() { - return this.#handle[IDX_STATS_SESSION_CREATED_AT]; - } - - /** @type {bigint} */ - get closingAt() { - return this.#handle[IDX_STATS_SESSION_CLOSING_AT]; - } - - /** @type {bigint} */ - get destroyedAt() { - return this.#handle[IDX_STATS_SESSION_DESTROYED_AT]; - } - - /** @type {bigint} */ - get handshakeCompletedAt() { - return this.#handle[IDX_STATS_SESSION_HANDSHAKE_COMPLETED_AT]; - } - - /** @type {bigint} */ - get handshakeConfirmedAt() { - return this.#handle[IDX_STATS_SESSION_HANDSHAKE_CONFIRMED_AT]; - } - - /** @type {bigint} */ - get gracefulClosingAt() { - return this.#handle[IDX_STATS_SESSION_GRACEFUL_CLOSING_AT]; - } - - /** @type {bigint} */ - get bytesReceived() { - return this.#handle[IDX_STATS_SESSION_BYTES_RECEIVED]; - } - - /** @type {bigint} */ - get bytesSent() { - return this.#handle[IDX_STATS_SESSION_BYTES_SENT]; - } - - /** @type {bigint} */ - get bidiInStreamCount() { - return this.#handle[IDX_STATS_SESSION_BIDI_IN_STREAM_COUNT]; - } - - /** @type {bigint} */ - get bidiOutStreamCount() { - return this.#handle[IDX_STATS_SESSION_BIDI_OUT_STREAM_COUNT]; - } - - /** @type {bigint} */ - get uniInStreamCount() { - return this.#handle[IDX_STATS_SESSION_UNI_IN_STREAM_COUNT]; - } - - /** @type {bigint} */ - get uniOutStreamCount() { - return this.#handle[IDX_STATS_SESSION_UNI_OUT_STREAM_COUNT]; - } - - /** @type {bigint} */ - get lossRetransmitCount() { - return this.#handle[IDX_STATS_SESSION_LOSS_RETRANSMIT_COUNT]; - } - - /** @type {bigint} */ - get maxBytesInFlights() { - return this.#handle[IDX_STATS_SESSION_MAX_BYTES_IN_FLIGHT]; - } - - /** @type {bigint} */ - get bytesInFlight() { - return this.#handle[IDX_STATS_SESSION_BYTES_IN_FLIGHT]; - } - - /** @type {bigint} */ - get blockCount() { - return this.#handle[IDX_STATS_SESSION_BLOCK_COUNT]; - } - - /** @type {bigint} */ - get cwnd() { - return this.#handle[IDX_STATS_SESSION_CWND]; - } - - /** @type {bigint} */ - get latestRtt() { - return this.#handle[IDX_STATS_SESSION_LATEST_RTT]; - } - - /** @type {bigint} */ - get minRtt() { - return this.#handle[IDX_STATS_SESSION_MIN_RTT]; - } - - /** @type {bigint} */ - get rttVar() { - return this.#handle[IDX_STATS_SESSION_RTTVAR]; - } - - /** @type {bigint} */ - get smoothedRtt() { - return this.#handle[IDX_STATS_SESSION_SMOOTHED_RTT]; - } - - /** @type {bigint} */ - get ssthresh() { - return this.#handle[IDX_STATS_SESSION_SSTHRESH]; - } - - /** @type {bigint} */ - get datagramsReceived() { - return this.#handle[IDX_STATS_SESSION_DATAGRAMS_RECEIVED]; - } - - /** @type {bigint} */ - get datagramsSent() { - return this.#handle[IDX_STATS_SESSION_DATAGRAMS_SENT]; - } - - /** @type {bigint} */ - get datagramsAcknowledged() { - return this.#handle[IDX_STATS_SESSION_DATAGRAMS_ACKNOWLEDGED]; - } - - /** @type {bigint} */ - get datagramsLost() { - return this.#handle[IDX_STATS_SESSION_DATAGRAMS_LOST]; - } - - toJSON() { - return { - __proto__: null, - createdAt: `${this.createdAt}`, - closingAt: `${this.closingAt}`, - destroyedAt: `${this.destroyedAt}`, - handshakeCompletedAt: `${this.handshakeCompletedAt}`, - handshakeConfirmedAt: `${this.handshakeConfirmedAt}`, - gracefulClosingAt: `${this.gracefulClosingAt}`, - bytesReceived: `${this.bytesReceived}`, - bytesSent: `${this.bytesSent}`, - bidiInStreamCount: `${this.bidiInStreamCount}`, - bidiOutStreamCount: `${this.bidiOutStreamCount}`, - uniInStreamCount: `${this.uniInStreamCount}`, - uniOutStreamCount: `${this.uniOutStreamCount}`, - lossRetransmitCount: `${this.lossRetransmitCount}`, - maxBytesInFlights: `${this.maxBytesInFlights}`, - bytesInFlight: `${this.bytesInFlight}`, - blockCount: `${this.blockCount}`, - cwnd: `${this.cwnd}`, - latestRtt: `${this.latestRtt}`, - minRtt: `${this.minRtt}`, - rttVar: `${this.rttVar}`, - smoothedRtt: `${this.smoothedRtt}`, - ssthresh: `${this.ssthresh}`, - datagramsReceived: `${this.datagramsReceived}`, - datagramsSent: `${this.datagramsSent}`, - datagramsAcknowledged: `${this.datagramsAcknowledged}`, - datagramsLost: `${this.datagramsLost}`, - }; - } - - [kInspect](depth, options) { - if (depth < 0) - return this; - - const opts = { - ...options, - depth: options.depth == null ? null : options.depth - 1, - }; - - return `SessionStats ${inspect({ - createdAt: this.createdAt, - closingAt: this.closingAt, - destroyedAt: this.destroyedAt, - handshakeCompletedAt: this.handshakeCompletedAt, - handshakeConfirmedAt: this.handshakeConfirmedAt, - gracefulClosingAt: this.gracefulClosingAt, - bytesReceived: this.bytesReceived, - bytesSent: this.bytesSent, - bidiInStreamCount: this.bidiInStreamCount, - bidiOutStreamCount: this.bidiOutStreamCount, - uniInStreamCount: this.uniInStreamCount, - uniOutStreamCount: this.uniOutStreamCount, - lossRetransmitCount: this.lossRetransmitCount, - maxBytesInFlights: this.maxBytesInFlights, - bytesInFlight: this.bytesInFlight, - blockCount: this.blockCount, - cwnd: this.cwnd, - latestRtt: this.latestRtt, - minRtt: this.minRtt, - rttVar: this.rttVar, - smoothedRtt: this.smoothedRtt, - ssthresh: this.ssthresh, - datagramsReceived: this.datagramsReceived, - datagramsSent: this.datagramsSent, - datagramsAcknowledged: this.datagramsAcknowledged, - datagramsLost: this.datagramsLost, - }, opts)}`; - } - - [kFinishClose]() { - // Snapshot the stats into a new BigUint64Array since the underlying - // buffer will be destroyed. - this.#handle = new BigUint64Array(this.#handle); - } -} - -class SessionState { - /** @type {DataView} */ - #handle; - - /** - * @param {ArrayBuffer} buffer - */ - constructor(buffer) { - if (!isArrayBuffer(buffer)) { - throw new ERR_INVALID_ARG_TYPE('buffer', ['ArrayBuffer'], buffer); - } - this.#handle = new DataView(buffer); - } - - /** @type {boolean} */ - get hasPathValidationListener() { - return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_SESSION_PATH_VALIDATION); - } - - /** @type {boolean} */ - set hasPathValidationListener(val) { - DataViewPrototypeSetUint8(this.#handle, IDX_STATE_SESSION_PATH_VALIDATION, val ? 1 : 0); - } - - /** @type {boolean} */ - get hasVersionNegotiationListener() { - return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_SESSION_VERSION_NEGOTIATION); - } - - /** @type {boolean} */ - set hasVersionNegotiationListener(val) { - DataViewPrototypeSetUint8(this.#handle, IDX_STATE_SESSION_VERSION_NEGOTIATION, val ? 1 : 0); - } - - /** @type {boolean} */ - get hasDatagramListener() { - return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_SESSION_DATAGRAM); - } - - /** @type {boolean} */ - set hasDatagramListener(val) { - DataViewPrototypeSetUint8(this.#handle, IDX_STATE_SESSION_DATAGRAM, val ? 1 : 0); - } - - /** @type {boolean} */ - get hasSessionTicketListener() { - return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_SESSION_SESSION_TICKET); - } - - /** @type {boolean} */ - set hasSessionTicketListener(val) { - DataViewPrototypeSetUint8(this.#handle, IDX_STATE_SESSION_SESSION_TICKET, val ? 1 : 0); - } - - /** @type {boolean} */ - get isClosing() { - return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_SESSION_CLOSING); - } - - /** @type {boolean} */ - get isGracefulClose() { - return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_SESSION_GRACEFUL_CLOSE); - } - - /** @type {boolean} */ - get isSilentClose() { - return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_SESSION_SILENT_CLOSE); - } - - /** @type {boolean} */ - get isStatelessReset() { - return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_SESSION_STATELESS_RESET); - } - - /** @type {boolean} */ - get isDestroyed() { - return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_SESSION_DESTROYED); - } - - /** @type {boolean} */ - get isHandshakeCompleted() { - return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_SESSION_HANDSHAKE_COMPLETED); - } - - /** @type {boolean} */ - get isHandshakeConfirmed() { - return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_SESSION_HANDSHAKE_CONFIRMED); - } - - /** @type {boolean} */ - get isStreamOpenAllowed() { - return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_SESSION_STREAM_OPEN_ALLOWED); - } - - /** @type {boolean} */ - get isPrioritySupported() { - return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_SESSION_PRIORITY_SUPPORTED); - } - - /** @type {boolean} */ - get isWrapped() { - return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_SESSION_WRAPPED); - } - - /** @type {bigint} */ - get lastDatagramId() { - return DataViewPrototypeGetBigUint64(this.#handle, IDX_STATE_SESSION_LAST_DATAGRAM_ID); - } - - toJSON() { - return { - __proto__: null, - hasPathValidationListener: this.hasPathValidationListener, - hasVersionNegotiationListener: this.hasVersionNegotiationListener, - hasDatagramListener: this.hasDatagramListener, - hasSessionTicketListener: this.hasSessionTicketListener, - isClosing: this.isClosing, - isGracefulClose: this.isGracefulClose, - isSilentClose: this.isSilentClose, - isStatelessReset: this.isStatelessReset, - isDestroyed: this.isDestroyed, - isHandshakeCompleted: this.isHandshakeCompleted, - isHandshakeConfirmed: this.isHandshakeConfirmed, - isStreamOpenAllowed: this.isStreamOpenAllowed, - isPrioritySupported: this.isPrioritySupported, - isWrapped: this.isWrapped, - lastDatagramId: `${this.lastDatagramId}`, - }; - } - - [kInspect](depth, options) { - if (depth < 0) - return this; - - const opts = { - ...options, - depth: options.depth == null ? null : options.depth - 1, - }; - - return `SessionState ${inspect({ - hasPathValidationListener: this.hasPathValidationListener, - hasVersionNegotiationListener: this.hasVersionNegotiationListener, - hasDatagramListener: this.hasDatagramListener, - hasSessionTicketListener: this.hasSessionTicketListener, - isClosing: this.isClosing, - isGracefulClose: this.isGracefulClose, - isSilentClose: this.isSilentClose, - isStatelessReset: this.isStatelessReset, - isDestroyed: this.isDestroyed, - isHandshakeCompleted: this.isHandshakeCompleted, - isHandshakeConfirmed: this.isHandshakeConfirmed, - isStreamOpenAllowed: this.isStreamOpenAllowed, - isPrioritySupported: this.isPrioritySupported, - isWrapped: this.isWrapped, - lastDatagramId: this.lastDatagramId, - }, opts)}`; - } - - [kFinishClose]() { - // Snapshot the state into a new DataView since the underlying - // buffer will be destroyed. - this.#handle = new DataView(new ArrayBuffer(0)); - } -} - -class Session { - /** @type {Endpoint} */ - #endpoint = undefined; - /** @type {boolean} */ - #isPendingClose = false; - /** @type {object|undefined} */ - #handle; - /** @type {PromiseWithResolvers} */ - #pendingClose; - /** @type {SocketAddress|undefined} */ - #remoteAddress = undefined; - /** @type {SessionState} */ - #state; - /** @type {SessionStats} */ - #stats; - /** @type {QuicStream[]} */ - #streams = []; - /** @type {OnStreamCallback} */ - #onstream; - /** @type {OnDatagramCallback|undefined} */ - #ondatagram; - /** @type {OnDatagramStatusCallback|undefined} */ - #ondatagramstatus; - /** @type {OnPathValidationCallback|undefined} */ - #onpathvalidation; - /** @type {OnSessionTicketCallback|undefined} */ - #onsessionticket; - /** @type {OnVersionNegotiationCallback|undefined} */ - #onversionnegotiation; - /** @type {OnHandshakeCallback} */ - #onhandshake; - /** @type {StreamCallbackConfiguration} */ - #streamConfig; - - /** - * @param {SessionCallbackConfiguration} config - * @param {StreamCallbackConfiguration} streamConfig - * @param {object} [handle] - * @param {Endpoint} [endpoint] - */ - constructor(config, streamConfig, handle, endpoint) { - validateObject(config, 'config'); - this.#stats = new SessionStats(handle.stats); - this.#state = new SessionState(handle.state); + // The config should have already been validated by the QuicEndpoing const { ondatagram, ondatagramstatus, @@ -1402,37 +793,47 @@ class Session { onsessionticket, onstream, onversionnegotiation, + stream, } = config; + if (ondatagram !== undefined) { - validateFunction(ondatagram, 'config.ondatagram'); - validateFunction(ondatagramstatus, 'config.ondatagramstatus'); - this.#state.hasDatagramListener = true; - this.#ondatagram = ondatagram; - this.#ondatagramstatus = ondatagramstatus; + this.#ondatagram = ondatagram.bind(this); + } + if (ondatagramstatus !== undefined) { + this.#ondatagramstatus = ondatagramstatus.bind(this); } - validateFunction(onhandshake, 'config.onhandshake'); if (onpathvalidation !== undefined) { - validateFunction(onpathvalidation, 'config.onpathvalidation'); - this.#state.hasPathValidationListener = true; - this.#onpathvalidation = onpathvalidation; + this.#onpathvalidation = onpathvalidation.bind(this); } if (onsessionticket !== undefined) { - validateFunction(onsessionticket, 'config.onsessionticket'); - this.#state.hasSessionTicketListener = true; - this.#onsessionticket = onsessionticket; + this.#onsessionticket = onsessionticket.bind(this); } - validateFunction(onstream, 'config.onstream'); if (onversionnegotiation !== undefined) { - validateFunction(onversionnegotiation, 'config.onversionnegotiation'); - this.#state.hasVersionNegotiationListener = true; - this.#onversionnegotiation = onversionnegotiation; + this.#onversionnegotiation = onversionnegotiation.bind(this); + } + if (onhandshake !== undefined) { + this.#onhandshake = onhandshake.bind(this); + } + + // It is ok for onstream to be undefined if the session is not expecting + // or wanting to receive incoming streams. If a stream is received and + // no onstream callback is specified, a warning will be emitted and the + // stream will just be immediately destroyed. + if (onstream !== undefined) { + this.#onstream = onstream.bind(this); } - this.#onhandshake = onhandshake; - this.#onstream = onstream; - this.#handle = handle; this.#endpoint = endpoint; - this.#pendingClose = Promise.withResolvers(); // eslint-disable-line node-core/prefer-primordials + this.#streamConfig = stream; + + this.#handle = handle; this.#handle[kOwner] = this; + this.#stats = new QuicSessionStats(kPrivateConstructor, handle.stats); + + this.#state = new QuicSessionState(kPrivateConstructor, handle.state); + this.#state.hasDatagramListener = !!ondatagram; + this.#state.hasPathValidationListener = !!onpathvalidation; + this.#state.hasSessionTicketListener = !!onsessionticket; + this.#state.hasVersionNegotiationListener = !!onversionnegotiation; } /** @type {boolean} */ @@ -1440,18 +841,21 @@ class Session { return this.#handle === undefined || this.#isPendingClose; } - /** @type {SessionStats} */ + /** @type {QuicSessionStats} */ get stats() { return this.#stats; } - /** @type {SessionState} */ + /** @type {QuicSessionState} */ get state() { return this.#state; } - /** @type {Endpoint} */ + /** @type {QuicEndpoint} */ get endpoint() { return this.#endpoint; } - /** @type {Path} */ + /** + * The path is the local and remote addresses of the session. + * @type {Path} + */ get path() { - if (this.#isClosedOrClosing) return undefined; + if (this.destroyed) return undefined; if (this.#remoteAddress === undefined) { const addr = this.#handle.getRemoteAddress(); if (addr !== undefined) { @@ -1478,28 +882,85 @@ class Session { if (handle === undefined) { throw new ERR_QUIC_OPEN_STREAM_FAILED(); } - const stream = new QuicStream(this.#streamConfig, handle, this, 0); - ArrayPrototypePush(this.#streams, stream); + const stream = new QuicStream(kPrivateConstructor, this.#streamConfig, handle, + this, 0 /* Bidirectional */); + this.#streams.add(stream); + + if (onSessionOpenStreamChannel.hasSubscribers) { + onSessionOpenStreamChannel.publish({ + stream, + session: this, + }); + } + return stream; + } + + /** + * @returns {QuicStream} + */ + openUnidirectionalStream() { + if (this.#isClosedOrClosing) { + throw new ERR_INVALID_STATE('Session is closed'); + } + if (!this.state.isStreamOpenAllowed) { + throw new ERR_QUIC_OPEN_STREAM_FAILED(); + } + const handle = this.#handle.openStream(STREAM_DIRECTION_UNIDIRECTIONAL); + if (handle === undefined) { + throw new ERR_QUIC_OPEN_STREAM_FAILED(); + } + const stream = new QuicStream(kPrivateConstructor, this.#streamConfig, handle, + this, 1 /* Unidirectional */); + this.#streams.add(stream); + + if (onSessionOpenStreamChannel.hasSubscribers) { + onSessionOpenStreamChannel.publish({ + stream, + session: this, + }); + } + return stream; } /** - * @returns {QuicStream} + * Send a datagram. The id of the sent datagram will be returned. The status + * of the sent datagram will be reported via the datagram-status event if + * possible. + * + * If a string is given it will be encoded as UTF-8. + * + * If an ArrayBufferView is given, the view will be copied. + * @param {ArrayBufferView|string} datagram The datagram payload + * @returns {bigint} The datagram ID */ - openUnidirectionalStream() { + sendDatagram(datagram) { if (this.#isClosedOrClosing) { throw new ERR_INVALID_STATE('Session is closed'); } - if (!this.state.isStreamOpenAllowed) { - throw new ERR_QUIC_OPEN_STREAM_FAILED(); + if (typeof datagram === 'string') { + datagram = Buffer.from(datagram, 'utf8'); + } else { + if (!isArrayBufferView(datagram)) { + throw new ERR_INVALID_ARG_TYPE('datagram', + ['ArrayBufferView', 'string'], + datagram); + } + datagram = new Uint8Array(ArrayBufferPrototypeTransfer(datagram.buffer), + datagram.byteOffset, + datagram.byteLength); } - const handle = this.#handle.openStream(STREAM_DIRECTION_UNIDIRECTIONAL); - if (handle === undefined) { - throw new ERR_QUIC_OPEN_STREAM_FAILED(); + const id = this.#handle.sendDatagram(datagram); + + if (onSessionSendDatagramChannel.hasSubscribers) { + onSessionSendDatagramChannel.publish({ + id, + length: datagram.byteLength, + session: this, + }); } - const stream = new QuicStream(this.#streamConfig, handle, this, 1); - ArrayPrototypePush(this.#streams, stream); - return stream; + + return id; } /** @@ -1510,6 +971,11 @@ class Session { throw new ERR_INVALID_STATE('Session is closed'); } this.#handle.updateKey(); + if (onSessionUpdateKeyChannel.hasSubscribers) { + onSessionUpdateKeyChannel.publish({ + session: this, + }); + } } /** @@ -1526,6 +992,11 @@ class Session { if (!this.#isClosedOrClosing) { this.#isPendingClose = true; this.#handle?.gracefulClose(); + if (onSessionClosingChannel.hasSubscribers) { + onSessionClosingChannel.publish({ + session: this, + }); + } } return this.closed; } @@ -1547,39 +1018,98 @@ class Session { * the closed promise will be rejected with that error. If no error is given, * the closed promise will be resolved. * @param {any} error + * @return {Promise} Returns this.closed */ destroy(error) { - // TODO(@jasnell): Implement. + if (this.destroyed) return; + // First, forcefully and immediately destroy all open streams, if any. + for (const stream of this.#streams) { + stream.destroy(error); + } + // The streams should remove themselves when they are destroyed but let's + // be doubly sure. + if (this.#streams.size) { + process.emitWarning( + `The session is destroyed with ${this.#streams.size} active streams. ` + + 'This should not happen and indicates a bug in Node.js. Please open an ' + + 'issue in the Node.js GitHub repository at https://github.com/nodejs/node ' + + 'to report the problem.', + ); + } + this.#streams.clear(); + + // Remove this session immediately from the endpoint + this.#endpoint[kRemoveSession](this); + this.#endpoint = undefined; + this.#isPendingClose = false; + + if (error) { + // If the session is still waiting to be closed, and error + // is specified, reject the closed promise. + this.#pendingClose.reject?.(error); + } else { + this.#pendingClose.resolve?.(); + } + this.#pendingClose.reject = undefined; + this.#pendingClose.resolve = undefined; + + this.#remoteAddress = undefined; + this.#state[kFinishClose](); + this.#stats[kFinishClose](); + + this.#onstream = undefined; + this.#ondatagram = undefined; + this.#ondatagramstatus = undefined; + this.#onpathvalidation = undefined; + this.#onsessionticket = undefined; + this.#onversionnegotiation = undefined; + this.#onhandshake = undefined; + this.#streamConfig = undefined; + + // Destroy the underlying C++ handle + this.#handle.destroy(); + this.#handle = undefined; + + if (onSessionClosedChannel.hasSubscribers) { + onSessionClosedChannel.publish({ + session: this, + }); + } + + return this.closed; } /** - * Send a datagram. The id of the sent datagram will be returned. The status - * of the sent datagram will be reported via the datagram-status event if - * possible. - * - * If a string is given it will be encoded as UTF-8. - * - * If an ArrayBufferView is given, the view will be copied. - * @param {ArrayBufferView|string} datagram The datagram payload - * @returns {bigint} The datagram ID + * @param {number} errorType + * @param {number} code + * @param {string} [reason] */ - sendDatagram(datagram) { - if (this.#isClosedOrClosing) { - throw new ERR_INVALID_STATE('Session is closed'); + [kFinishClose](errorType, code, reason) { + // If code is zero, then we closed without an error. Yay! We can destroy + // safely without specifying an error. + if (code === 0) { + this.destroy(); + return; } - if (typeof datagram === 'string') { - datagram = Buffer.from(datagram, 'utf8'); - } else { - if (!isArrayBufferView(datagram)) { - throw new ERR_INVALID_ARG_TYPE('datagram', - ['ArrayBufferView', 'string'], - datagram); + + // Otherwise, errorType indicates the type of error that occurred, code indicates + // the specific error, and reason is an optional string describing the error. + switch (errorType) { + case 0: /* Transport Error */ + this.destroy(new ERR_QUIC_TRANSPORT_ERROR(code, reason)); + break; + case 1: /* Application Error */ + this.destroy(new ERR_QUIC_APPLICATION_ERROR(code, reason)); + break; + case 2: /* Version Negotiation Error */ + this.destroy(new ERR_QUIC_VERSION_NEGOTIATION_ERROR()); + break; + case 3: /* Idle close */ { + // An idle close is not really an error. We can just destroy. + this.destroy(); + break; } - datagram = new Uint8Array(datagram.buffer.transfer(), - datagram.byteOffset, - datagram.byteLength); } - return this.#handle.sendDatagram(datagram); } /** @@ -1587,8 +1117,19 @@ class Session { * @param {boolean} early */ [kDatagram](u8, early) { + // The datagram event should only be called if the session was created with + // an ondatagram callback. The callback should always exist here. + assert(this.#ondatagram, 'Unexpected datagram event'); if (this.destroyed) return; - this.#ondatagram(u8, this, early); + this.#ondatagram(u8, early); + + if (onSessionReceiveDatagramChannel.hasSubscribers) { + onSessionReceiveDatagramChannel.publish({ + length: u8.byteLength, + early, + session: this, + }); + } } /** @@ -1597,7 +1138,17 @@ class Session { */ [kDatagramStatus](id, status) { if (this.destroyed) return; - this.#ondatagramstatus(id, status, this); + // The ondatagramstatus callback may not have been specified. That's ok. + // We'll just ignore the event in that case. + this.#ondatagramstatus?.(id, status); + + if (onSessionReceiveDatagramStatusChannel.hasSubscribers) { + onSessionReceiveDatagramStatusChannel.publish({ + id, + status, + session: this, + }); + } } /** @@ -1610,18 +1161,41 @@ class Session { */ [kPathValidation](result, newLocalAddress, newRemoteAddress, oldLocalAddress, oldRemoteAddress, preferredAddress) { + // The path validation event should only be called if the session was created + // with an onpathvalidation callback. The callback should always exist here. + assert(this.#onpathvalidation, 'Unexpected path validation event'); if (this.destroyed) return; this.#onpathvalidation(result, newLocalAddress, newRemoteAddress, - oldLocalAddress, oldRemoteAddress, preferredAddress, - this); + oldLocalAddress, oldRemoteAddress, preferredAddress); + + if (onSessionPathValidationChannel.hasSubscribers) { + onSessionPathValidationChannel.publish({ + result, + newLocalAddress, + newRemoteAddress, + oldLocalAddress, + oldRemoteAddress, + preferredAddress, + session: this, + }); + } } /** * @param {object} ticket */ [kSessionTicket](ticket) { + // The session ticket event should only be called if the session was created + // with an onsessionticket callback. The callback should always exist here. + assert(this.#onsessionticket, 'Unexpected session ticket event'); if (this.destroyed) return; - this.#onsessionticket(ticket, this); + this.#onsessionticket(ticket); + if (onSessionTicketChannel.hasSubscribers) { + onSessionTicketChannel.publish({ + ticket, + session: this, + }); + } } /** @@ -1630,8 +1204,21 @@ class Session { * @param {number[]} supportedVersions */ [kVersionNegotiation](version, requestedVersions, supportedVersions) { + // The version negotiation event should only be called if the session was + // created with an onversionnegotiation callback. The callback should always + // exist here. if (this.destroyed) return; - this.#onversionnegotiation(version, requestedVersions, supportedVersions, this); + this.#onversionnegotiation(version, requestedVersions, supportedVersions); + this.destroy(new ERR_QUIC_VERSION_NEGOTIATION_ERROR()); + + if (onSessionVersionNegotiationChannel.hasSubscribers) { + onSessionVersionNegotiationChannel.publish({ + version, + requestedVersions, + supportedVersions, + session: this, + }); + } } /** @@ -1646,8 +1233,23 @@ class Session { [kHandshake](sni, alpn, cipher, cipherVersion, validationErrorReason, validationErrorCode, earlyDataAccepted) { if (this.destroyed) return; - this.#onhandshake(sni, alpn, cipher, cipherVersion, validationErrorReason, - validationErrorCode, earlyDataAccepted, this); + // The onhandshake callback may not have been specified. That's ok. + // We'll just ignore the event in that case. + this.#onhandshake?.(sni, alpn, cipher, cipherVersion, validationErrorReason, + validationErrorCode, earlyDataAccepted); + + if (onSessionHandshakeChannel.hasSubscribers) { + onSessionHandshakeChannel.publish({ + sni, + alpn, + cipher, + cipherVersion, + validationErrorReason, + validationErrorCode, + earlyDataAccepted, + session: this, + }); + } } /** @@ -1655,9 +1257,30 @@ class Session { * @param {number} direction */ [kNewStream](handle, direction) { - const stream = new QuicStream(this.#streamConfig, handle, this, direction); - ArrayPrototypePush(this.#streams, stream); - this.#onstream(stream, this); + const stream = new QuicStream(kPrivateConstructor, this.#streamConfig, handle, + this, direction); + + // A new stream was received. If we don't have an onstream callback, then + // there's nothing we can do about it. Destroy the stream in this case. + if (this.#onstream === undefined) { + process.emitWarning('A new stream was received but no onstream callback was provided'); + stream.destroy(); + return; + } + this.#streams.add(stream); + + this.#onstream(stream); + + if (onSessionReceivedStreamChannel.hasSubscribers) { + onSessionReceivedStreamChannel.publish({ + stream, + session: this, + }); + } + } + + [kRemoveStream](stream) { + this.#streams.delete(stream); } [kInspect](depth, options) { @@ -1669,7 +1292,7 @@ class Session { depth: options.depth == null ? null : options.depth - 1, }; - return `Session ${inspect({ + return `QuicSession ${inspect({ closed: this.closed, closing: this.#isPendingClose, destroyed: this.destroyed, @@ -1681,331 +1304,189 @@ class Session { }, opts)}`; } - [kFinishClose](errorType, code, reason) { - // TODO(@jasnell): Finish the implementation - } - async [SymbolAsyncDispose]() { await this.close(); } } -class EndpointStats { - /** @type {BigUint64Array} */ +class QuicEndpoint { + /** + * The local socket address on which the endpoint is listening (lazily created) + * @type {SocketAddress|undefined} + */ + #address = undefined; + /** + * When true, the endpoint has been marked busy and is temporarily not accepting + * new sessions (only used when the Endpoint is acting as a server) + * @type {boolean} + */ + #busy = false; + /** + * The underlying C++ handle for the endpoint. When undefined the endpoint is + * considered to be closed. + * @type {object} + */ #handle; - /** - * @param {ArrayBuffer} buffer + * True if endpoint.close() has been called and the [kFinishClose] method has + * not yet been called. + * @type {boolean} */ - constructor(buffer) { - if (!isArrayBuffer(buffer)) { - throw new ERR_INVALID_ARG_TYPE('buffer', ['ArrayBuffer'], buffer); - } - this.#handle = new BigUint64Array(buffer); - } - - /** @type {bigint} */ - get createdAt() { - return this.#handle[IDX_STATS_ENDPOINT_CREATED_AT]; - } - - /** @type {bigint} */ - get destroyedAt() { - return this.#handle[IDX_STATS_ENDPOINT_DESTROYED_AT]; - } - - /** @type {bigint} */ - get bytesReceived() { - return this.#handle[IDX_STATS_ENDPOINT_BYTES_RECEIVED]; - } - - /** @type {bigint} */ - get bytesSent() { - return this.#handle[IDX_STATS_ENDPOINT_BYTES_SENT]; - } - - /** @type {bigint} */ - get packetsReceived() { - return this.#handle[IDX_STATS_ENDPOINT_PACKETS_RECEIVED]; - } - - /** @type {bigint} */ - get packetsSent() { - return this.#handle[IDX_STATS_ENDPOINT_PACKETS_SENT]; - } - - /** @type {bigint} */ - get serverSessions() { - return this.#handle[IDX_STATS_ENDPOINT_SERVER_SESSIONS]; - } - - /** @type {bigint} */ - get clientSessions() { - return this.#handle[IDX_STATS_ENDPOINT_CLIENT_SESSIONS]; - } - - /** @type {bigint} */ - get serverBusyCount() { - return this.#handle[IDX_STATS_ENDPOINT_SERVER_BUSY_COUNT]; - } - - /** @type {bigint} */ - get retryCount() { - return this.#handle[IDX_STATS_ENDPOINT_RETRY_COUNT]; - } - - /** @type {bigint} */ - get versionNegotiationCount() { - return this.#handle[IDX_STATS_ENDPOINT_VERSION_NEGOTIATION_COUNT]; - } + #isPendingClose = false; + /** + * True if the endpoint is acting as a server and actively listening for connections. + * @type {boolean} + */ + #listening = false; + /** + * A promise that is resolved when the endpoint has been closed (or rejected if + * the endpoint closes abruptly due to an error). + * @type {PromiseWithResolvers} + */ + #pendingClose = Promise.withResolvers(); // eslint-disable-line node-core/prefer-primordials + /** + * If destroy() is called with an error, the error is stored here and used to reject + * the pendingClose promise when [kFinishClose] is called. + * @type {any} + */ + #pendingError = undefined; + /** + * The collection of active sessions. + * @type {Set} + */ + #sessions = new SafeSet(); + /** + * The internal state of the endpoint. Used to efficiently track and update the + * state of the underlying c++ endpoint handle. + * @type {QuicEndpointState} + */ + #state; + /** + * The collected statistics for the endpoint. + * @type {QuicEndpointStats} + */ + #stats; + /** + * The user provided callback that is invoked when a new session is received. + * (used only when the endpoint is acting as a server) + * @type {OnSessionCallback} + */ + #onsession; + /** + * The callback configuration used for new sessions (client or server) + * @type {ProcessedSessionCallbackConfiguration} + */ + #sessionConfig; - /** @type {bigint} */ - get statelessResetCount() { - return this.#handle[IDX_STATS_ENDPOINT_STATELESS_RESET_COUNT]; - } + /** + * @param {EndpointCallbackConfiguration} config + * @returns {StreamCallbackConfiguration} + */ + #processStreamConfig(config) { + validateObject(config, 'config'); + const { + onblocked, + onreset, + onheaders, + ontrailers, + } = config; - /** @type {bigint} */ - get immediateCloseCount() { - return this.#handle[IDX_STATS_ENDPOINT_IMMEDIATE_CLOSE_COUNT]; - } + if (onblocked !== undefined) { + validateFunction(onblocked, 'config.onblocked'); + } + if (onreset !== undefined) { + validateFunction(onreset, 'config.onreset'); + } + if (onheaders !== undefined) { + validateFunction(onheaders, 'config.onheaders'); + } + if (ontrailers !== undefined) { + validateFunction(ontrailers, 'ontrailers'); + } - toJSON() { return { __proto__: null, - createdAt: `${this.createdAt}`, - destroyedAt: `${this.destroyedAt}`, - bytesReceived: `${this.bytesReceived}`, - bytesSent: `${this.bytesSent}`, - packetsReceived: `${this.packetsReceived}`, - packetsSent: `${this.packetsSent}`, - serverSessions: `${this.serverSessions}`, - clientSessions: `${this.clientSessions}`, - serverBusyCount: `${this.serverBusyCount}`, - retryCount: `${this.retryCount}`, - versionNegotiationCount: `${this.versionNegotiationCount}`, - statelessResetCount: `${this.statelessResetCount}`, - immediateCloseCount: `${this.immediateCloseCount}`, - }; - } - - [kInspect](depth, options) { - if (depth < 0) - return this; - - const opts = { - ...options, - depth: options.depth == null ? null : options.depth - 1, + onblocked, + onreset, + onheaders, + ontrailers, }; - - return `EndpointStats ${inspect({ - createdAt: this.createdAt, - destroyedAt: this.destroyedAt, - bytesReceived: this.bytesReceived, - bytesSent: this.bytesSent, - packetsReceived: this.packetsReceived, - packetsSent: this.packetsSent, - serverSessions: this.serverSessions, - clientSessions: this.clientSessions, - serverBusyCount: this.serverBusyCount, - retryCount: this.retryCount, - versionNegotiationCount: this.versionNegotiationCount, - statelessResetCount: this.statelessResetCount, - immediateCloseCount: this.immediateCloseCount, - }, opts)}`; - } - - [kFinishClose]() { - // Snapshot the stats into a new BigUint64Array since the underlying - // buffer will be destroyed. - this.#handle = new BigUint64Array(this.#handle); } -} - -class EndpointState { - /** @type {DataView} */ - #handle; /** - * @param {ArrayBuffer} buffer + * + * @param {EndpointCallbackConfiguration} config + * @returns {ProcessedSessionCallbackConfiguration} */ - constructor(buffer) { - if (!isArrayBuffer(buffer)) { - throw new ERR_INVALID_ARG_TYPE('buffer', ['ArrayBuffer'], buffer); + #processSessionConfig(config) { + validateObject(config, 'config'); + const { + onstream, + ondatagram, + ondatagramstatus, + onpathvalidation, + onsessionticket, + onversionnegotiation, + onhandshake, + } = config; + if (onstream !== undefined) { + validateFunction(onstream, 'config.onstream'); } - this.#handle = new DataView(buffer); - } - - #assertNotClosed() { - if (this.#handle.byteLength === 0) { - throw new ERR_INVALID_STATE('Endpoint is closed'); + if (ondatagram !== undefined) { + validateFunction(ondatagram, 'config.ondatagram'); + } + if (ondatagramstatus !== undefined) { + validateFunction(ondatagramstatus, 'config.ondatagramstatus'); + } + if (onpathvalidation !== undefined) { + validateFunction(onpathvalidation, 'config.onpathvalidation'); + } + if (onsessionticket !== undefined) { + validateFunction(onsessionticket, 'config.onsessionticket'); + } + if (onversionnegotiation !== undefined) { + validateFunction(onversionnegotiation, 'config.onversionnegotiation'); + } + if (onhandshake !== undefined) { + validateFunction(onhandshake, 'config.onhandshake'); } - } - - /** @type {boolean} */ - get isBound() { - this.#assertNotClosed(); - return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_ENDPOINT_BOUND); - } - - /** @type {boolean} */ - get isReceiving() { - this.#assertNotClosed(); - return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_ENDPOINT_RECEIVING); - } - - /** @type {boolean} */ - get isListening() { - this.#assertNotClosed(); - return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_ENDPOINT_LISTENING); - } - - /** @type {boolean} */ - get isClosing() { - this.#assertNotClosed(); - return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_ENDPOINT_CLOSING); - } - - /** @type {boolean} */ - get isBusy() { - this.#assertNotClosed(); - return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_ENDPOINT_BUSY); - } - - /** - * The number of underlying callbacks that are pending. If the session - * is closing, these are the number of callbacks that the session is - * waiting on before it can be closed. - * @type {bigint} - */ - get pendingCallbacks() { - this.#assertNotClosed(); - return DataViewPrototypeGetBigUint64(this.#handle, IDX_STATE_ENDPOINT_PENDING_CALLBACKS); - } - - toJSON() { - if (this.#handle.byteLength === 0) return {}; return { __proto__: null, - isBound: this.isBound, - isReceiving: this.isReceiving, - isListening: this.isListening, - isClosing: this.isClosing, - isBusy: this.isBusy, - pendingCallbacks: `${this.pendingCallbacks}`, + onstream, + ondatagram, + ondatagramstatus, + onpathvalidation, + onsessionticket, + onversionnegotiation, + onhandshake, + stream: this.#processStreamConfig(config), }; } - [kInspect](depth, options) { - if (depth < 0) - return this; + /** + * @param {EndpointCallbackConfiguration} config + * @returns {ProcessedEndpointCallbackConfiguration} + */ + #processEndpointConfig(config) { + validateObject(config, 'config'); + const { + onsession, + } = config; - if (this.#handle.byteLength === 0) { - return 'EndpointState { }'; + if (onsession !== undefined) { + validateFunction(config.onsession, 'config.onsession'); } - const opts = { - ...options, - depth: options.depth == null ? null : options.depth - 1, + return { + __proto__: null, + onsession, + session: this.#processSessionConfig(config), }; - - return `EndpointState ${inspect({ - isBound: this.isBound, - isReceiving: this.isReceiving, - isListening: this.isListening, - isClosing: this.isClosing, - isBusy: this.isBusy, - pendingCallbacks: this.pendingCallbacks, - }, opts)}`; - } - - [kFinishClose]() { - // Snapshot the state into a new DataView since the underlying - // buffer will be destroyed. - if (this.#handle.byteLength === 0) return; - this.#handle = new DataView(new ArrayBuffer(0)); } -} - -function validateStreamConfig(config, name = 'config') { - validateObject(config, name); - if (config.onerror !== undefined) - validateFunction(config.onerror, `${name}.onerror`); - if (config.onblocked !== undefined) - validateFunction(config.onblocked, `${name}.onblocked`); - if (config.onreset !== undefined) - validateFunction(config.onreset, `${name}.onreset`); - if (config.onheaders !== undefined) - validateFunction(config.onheaders, `${name}.onheaders`); - if (config.ontrailers !== undefined) - validateFunction(config.ontrailers, `${name}.ontrailers`); - return config; -} - -function validateSessionConfig(config, name = 'config') { - validateObject(config, name); - if (config.onstream !== undefined) - validateFunction(config.onstream, `${name}.onstream`); - if (config.ondatagram !== undefined) - validateFunction(config.ondatagram, `${name}.ondatagram`); - if (config.ondatagramstatus !== undefined) - validateFunction(config.ondatagramstatus, `${name}.ondatagramstatus`); - if (config.onpathvalidation !== undefined) - validateFunction(config.onpathvalidation, `${name}.onpathvalidation`); - if (config.onsessionticket !== undefined) - validateFunction(config.onsessionticket, `${name}.onsessionticket`); - if (config.onversionnegotiation !== undefined) - validateFunction(config.onversionnegotiation, `${name}.onversionnegotiation`); - if (config.onhandshake !== undefined) - validateFunction(config.onhandshake, `${name}.onhandshake`); - return config; -} - -function validateEndpointConfig(config) { - validateObject(config, 'config'); - validateFunction(config.onsession, 'config.onsession'); - if (config.session !== undefined) - validateSessionConfig(config.session, 'config.session'); - if (config.stream !== undefined) - validateStreamConfig(config.stream, 'config.stream'); - return config; -} - -class Endpoint { - /** @type {SocketAddress|undefined} */ - #address = undefined; - /** @type {boolean} */ - #busy = false; - /** @type {object} */ - #handle; - /** @type {boolean} */ - #isPendingClose = false; - /** @type {boolean} */ - #listening = false; - /** @type {PromiseWithResolvers} */ - #pendingClose; - /** @type {any} */ - #pendingError = undefined; - /** @type {Session[]} */ - #sessions = []; - /** @type {EndpointState} */ - #state; - /** @type {EndpointStats} */ - #stats; - /** @type {OnSessionCallback} */ - #onsession; - /** @type {SessionCallbackConfiguration} */ - #sessionConfig; - /** @type {StreamCallbackConfiguration */ - #streamConfig; /** - * @param {EndpointCallbackConfiguration} config - * @param {EndpointOptions} [options] + * @param {EndpointCallbackConfiguration} options + * @returns {EndpointOptions} */ - constructor(config, options = kEmptyObject) { - validateEndpointConfig(config); - this.#onsession = config.onsession; - this.#sessionConfig = config.session; - this.#streamConfig = config.stream; - + #processEndpointOptions(options) { validateObject(options, 'options'); let { address } = options; const { @@ -2044,8 +1525,7 @@ class Endpoint { } } - this.#pendingClose = Promise.withResolvers(); // eslint-disable-line node-core/prefer-primordials - this.#handle = new Endpoint_({ + return { __proto__: null, address: address?.[kSocketAddressHandle], retryTokenExpiration, @@ -2072,16 +1552,49 @@ class Endpoint { cc, resetTokenSecret, tokenSecret, - }); + }; + } + + #newSession(handle) { + const session = new QuicSession(kPrivateConstructor, this.#sessionConfig, handle, this); + this.#sessions.add(session); + return session; + } + + /** + * @param {EndpointCallbackConfiguration} config + */ + constructor(config = kEmptyObject) { + const { + onsession, + session, + } = this.#processEndpointConfig(config); + + // Note that the onsession callback is only used for server sessions. + // If the callback is not specified, calling listen() will fail but + // connect() can still be called. + if (onsession !== undefined) { + this.#onsession = onsession.bind(this); + } + this.#sessionConfig = session; + + this.#handle = new Endpoint_(this.#processEndpointOptions(config)); this.#handle[kOwner] = this; - this.#stats = new EndpointStats(this.#handle.stats); - this.#state = new EndpointState(this.#handle.state); + this.#stats = new QuicEndpointStats(kPrivateConstructor, this.#handle.stats); + this.#state = new QuicEndpointState(kPrivateConstructor, this.#handle.state); + + if (onEndpointCreatedChannel.hasSubscribers) { + onEndpointCreatedChannel.publish({ + endpoint: this, + config, + }); + } } - /** @type {EndpointStats} */ + /** @type {QuicEndpointStats} */ get stats() { return this.#stats; } - /** @type {EndpointState} */ + /** @type {QuicEndpointState} */ get state() { return this.#state; } get #isClosedOrClosing() { @@ -2103,11 +1616,16 @@ class Endpoint { throw new ERR_INVALID_STATE('Endpoint is closed'); } // The val is allowed to be any truthy value - val = !!val; // Non-op if there is no change - if (val !== this.#busy) { - this.#busy = val; + if (!!val !== this.#busy) { + this.#busy = !this.#busy; this.#handle.markBusy(this.#busy); + if (onEndpointBusyChangeChannel.hasSubscribers) { + onEndpointBusyChangeChannel.publish({ + endpoint: this, + busy: this.#busy, + }); + } } } @@ -2125,19 +1643,127 @@ class Endpoint { } /** - * Configures the endpoint to listen for incoming connections. - * @param {SessionOptions} [options] + * @param {TlsOptions} tls */ - listen(options = kEmptyObject) { - if (this.#isClosedOrClosing) { - throw new ERR_INVALID_STATE('Endpoint is closed'); + #processTlsOptions(tls) { + validateObject(tls, 'options.tls'); + const { + sni, + alpn, + ciphers = DEFAULT_CIPHERS, + groups = DEFAULT_GROUPS, + keylog = false, + verifyClient = false, + tlsTrace = false, + verifyPrivateKey = false, + keys, + certs, + ca, + crl, + } = tls; + + if (sni !== undefined) { + validateString(sni, 'options.tls.sni'); } - if (this.#listening) { - throw new ERR_INVALID_STATE('Endpoint is already listening'); + if (alpn !== undefined) { + validateString(alpn, 'options.tls.alpn'); + } + if (ciphers !== undefined) { + validateString(ciphers, 'options.tls.ciphers'); + } + if (groups !== undefined) { + validateString(groups, 'options.tls.groups'); + } + validateBoolean(keylog, 'options.tls.keylog'); + validateBoolean(verifyClient, 'options.tls.verifyClient'); + validateBoolean(tlsTrace, 'options.tls.tlsTrace'); + validateBoolean(verifyPrivateKey, 'options.tls.verifyPrivateKey'); + + if (certs !== undefined) { + const certInputs = ArrayIsArray(certs) ? certs : [certs]; + for (const cert of certInputs) { + if (!isArrayBufferView(cert) && !isArrayBuffer(cert)) { + throw new ERR_INVALID_ARG_TYPE('options.tls.certs', + ['ArrayBufferView', 'ArrayBuffer'], cert); + } + } } - validateObject(options, 'options'); + if (ca !== undefined) { + const caInputs = ArrayIsArray(ca) ? ca : [ca]; + for (const caCert of caInputs) { + if (!isArrayBufferView(caCert) && !isArrayBuffer(caCert)) { + throw new ERR_INVALID_ARG_TYPE('options.tls.ca', + ['ArrayBufferView', 'ArrayBuffer'], caCert); + } + } + } + + if (crl !== undefined) { + const crlInputs = ArrayIsArray(crl) ? crl : [crl]; + for (const crlCert of crlInputs) { + if (!isArrayBufferView(crlCert) && !isArrayBuffer(crlCert)) { + throw new ERR_INVALID_ARG_TYPE('options.tls.crl', + ['ArrayBufferView', 'ArrayBuffer'], crlCert); + } + } + } + const keyHandles = []; + if (keys !== undefined) { + const keyInputs = ArrayIsArray(keys) ? keys : [keys]; + for (const key of keyInputs) { + if (isKeyObject(key)) { + if (key.type !== 'private') { + throw new ERR_INVALID_ARG_VALUE('options.tls.keys', key, 'must be a private key'); + } + ArrayPrototypePush(keyHandles, key[kKeyObjectHandle]); + } else if (isCryptoKey(key)) { + if (key.type !== 'private') { + throw new ERR_INVALID_ARG_VALUE('options.tls.keys', key, 'must be a private key'); + } + ArrayPrototypePush(keyHandles, key[kKeyObjectInner][kKeyObjectHandle]); + } else { + throw new ERR_INVALID_ARG_TYPE('options.tls.keys', ['KeyObject', 'CryptoKey'], key); + } + } + } + + return { + __proto__: null, + sni, + alpn, + ciphers, + groups, + keylog, + verifyClient, + tlsTrace, + verifyPrivateKey, + keys: keyHandles, + certs, + ca, + crl, + }; + } + + /** + * @param {'use'|'ignore'|'default'} policy + * @returns {number} + */ + #getPreferredAddressPolicy(policy = 'default') { + switch (policy) { + case 'use': return PREFERRED_ADDRESS_USE; + case 'ignore': return PREFERRED_ADDRESS_IGNORE; + case 'default': return DEFAULT_PREFERRED_ADDRESS_POLICY; + } + throw new ERR_INVALID_ARG_VALUE('options.preferredAddressPolicy', policy); + } + + /** + * @param {SessionOptions} options + */ + #processSessionOptions(options) { + validateObject(options, 'options'); const { version, minVersion, @@ -2146,69 +1772,88 @@ class Endpoint { transportParams = kEmptyObject, tls = kEmptyObject, qlog = false, + sessionTicket, } = options; - this.#handle.listen({ + return { + __proto__: null, version, minVersion, - preferredAddressPolicy: getPreferredAddressPolicy(preferredAddressPolicy), + preferredAddressPolicy: this.#getPreferredAddressPolicy(preferredAddressPolicy), application, transportParams, - tls: processTlsOptions(tls), + tls: this.#processTlsOptions(tls), qlog, - }); + sessionTicket, + }; + } + + /** + * Configures the endpoint to listen for incoming connections. + * @param {SessionOptions} [options] + */ + listen(options = kEmptyObject) { + if (this.#isClosedOrClosing) { + throw new ERR_INVALID_STATE('Endpoint is closed'); + } + if (this.#onsession === undefined) { + throw new ERR_INVALID_STATE( + 'Endpoint is not configured to accept sessions. Specify an onsession ' + + 'callback when creating the endpoint', + ); + } + if (this.#listening) { + throw new ERR_INVALID_STATE('Endpoint is already listening'); + } + this.#handle.listen(this.#processSessionOptions(options)); this.#listening = true; + + if (onEndpointListeningChannel.hasSubscribers) { + onEndpointListeningChannel.publish({ + endpoint: this, + options, + }); + } } /** * Initiates a session with a remote endpoint. * @param {SocketAddress} address * @param {SessionOptions} [options] - * @returns {Session} + * @returns {QuicSession} */ connect(address, options = kEmptyObject) { if (this.#isClosedOrClosing) { throw new ERR_INVALID_STATE('Endpoint is closed'); } - if (this.#busy) { - throw new ERR_INVALID_STATE('Endpoint is busy'); - } - if (address === undefined || !SocketAddress.isSocketAddress(address)) { - if (typeof address === 'object' && address !== null) { - address = new SocketAddress(address); - } else { + if (!SocketAddress.isSocketAddress(address)) { + if (address == null || typeof address !== 'object') { throw new ERR_INVALID_ARG_TYPE('address', 'SocketAddress', address); } + address = new SocketAddress(address); } - validateObject(options, 'options'); - const { - version, - minVersion, - preferredAddressPolicy = 'default', - application = kEmptyObject, - transportParams = kEmptyObject, - tls = kEmptyObject, - qlog = false, - sessionTicket, - } = options; + const processedOptions = this.#processSessionOptions(options); + const { sessionTicket } = processedOptions; - const handle = this.#handle.connect(address[kSocketAddressHandle], { - version, - minVersion, - preferredAddressPolicy: getPreferredAddressPolicy(preferredAddressPolicy), - application, - transportParams, - tls: processTlsOptions(tls), - qlog, - }, sessionTicket); + const handle = this.#handle.connect(address[kSocketAddressHandle], + processedOptions, sessionTicket); if (handle === undefined) { throw new ERR_QUIC_CONNECTION_FAILED(); } - const session = new Session(this.#sessionConfig, this.#streamConfig, handle, this); - ArrayPrototypePush(this.#sessions, session); + const session = this.#newSession(handle); + + if (onEndpointClientSessionChannel.hasSubscribers) { + onEndpointClientSessionChannel.publish({ + endpoint: this, + session, + address, + options, + }); + } + return session; } @@ -2218,10 +1863,16 @@ class Endpoint { * not be accepted or created. The returned promise will be resolved when * closing is complete, or will be rejected if the endpoint is closed abruptly * due to an error. - * @returns {Promise} + * @returns {Promise} Returns this.closed */ close() { if (!this.#isClosedOrClosing) { + if (onEndpointClosingChannel.hasSubscribers) { + onEndpointClosingChannel.publish({ + endpoint: this, + hasPendingError: this.#pendingError !== undefined, + }); + } this.#isPendingClose = true; this.#handle?.closeGracefully(); } @@ -2239,12 +1890,22 @@ class Endpoint { /** @type {boolean} */ get destroyed() { return this.#handle === undefined; } + /** + * Return an iterator over all currently active sessions associated + * with this endpoint. + * @type {SetIterator} + */ + get sessions() { + return this.#sessions[SymbolIterator](); + } + /** * Forcefully terminates the endpoint by immediately destroying all sessions * after calling close. If an error is given, the closed promise will be * rejected with that error. If no error is given, the closed promise will * be resolved. - * @param {any} error + * @param {any} [error] + * @returns {Promise} Returns this.closed */ destroy(error) { if (!this.#isClosedOrClosing) { @@ -2258,6 +1919,7 @@ class Endpoint { for (const session of this.#sessions) { session.destroy(error); } + return this.closed; } ref() { @@ -2268,63 +1930,100 @@ class Endpoint { if (this.#handle !== undefined) this.#handle.ref(false); } - [kFinishClose](context, status) { - if (this.#handle === undefined) return; - this.#isPendingClose = false; - this.#address = undefined; - this.#busy = false; - this.#listening = false; - this.#isPendingClose = false; - this.#stats[kFinishClose](); - this.#state[kFinishClose](); - this.#sessions = []; - + #maybeGetCloseError(context, status) { switch (context) { case kCloseContextClose: { - if (this.#pendingError !== undefined) { - this.#pendingClose.reject(this.#pendingError); - } else { - this.#pendingClose.resolve(); - } - break; + return this.#pendingError; } case kCloseContextBindFailure: { - this.#pendingClose.reject( - new ERR_QUIC_ENDPOINT_CLOSED('Bind failure', status)); - break; + return new ERR_QUIC_ENDPOINT_CLOSED('Bind failure', status); } case kCloseContextListenFailure: { - this.#pendingClose.reject( - new ERR_QUIC_ENDPOINT_CLOSED('Listen failure', status)); - break; + return new ERR_QUIC_ENDPOINT_CLOSED('Listen failure', status); } case kCloseContextReceiveFailure: { - this.#pendingClose.reject( - new ERR_QUIC_ENDPOINT_CLOSED('Receive failure', status)); - break; + return new ERR_QUIC_ENDPOINT_CLOSED('Receive failure', status); } case kCloseContextSendFailure: { - this.#pendingClose.reject( - new ERR_QUIC_ENDPOINT_CLOSED('Send failure', status)); - break; + return new ERR_QUIC_ENDPOINT_CLOSED('Send failure', status); } case kCloseContextStartFailure: { - this.#pendingClose.reject( - new ERR_QUIC_ENDPOINT_CLOSED('Start failure', status)); - break; + return new ERR_QUIC_ENDPOINT_CLOSED('Start failure', status); } } + // Otherwise return undefined. + } - this.#pendingError = undefined; + [kFinishClose](context, status) { + if (this.#handle === undefined) return; + this.#handle = undefined; + this.#stats[kFinishClose](); + this.#state[kFinishClose](); + this.#address = undefined; + this.#busy = false; + this.#listening = false; + this.#isPendingClose = false; + + // As QuicSessions are closed they are expected to remove themselves + // from the sessions collection. Just in case they don't, let's force + // it by resetting the set so we don't leak memory. Let's emit a warning, + // tho, if the set is not empty at this point as that would indicate a + // bug in Node.js that should be fixed. + if (this.#sessions.size > 0) { + process.emitWarning( + `The endpoint is closed with ${this.#sessions.size} active sessions. ` + + 'This should not happen and indicates a bug in Node.js. Please open an ' + + 'issue in the Node.js GitHub repository at https://github.com/nodejs/node ' + + 'to report the problem.', + ); + } + this.#sessions.clear(); + + // If destroy was called with an error, then the this.#pendingError will be + // set. Or, if context indicates an error condition that caused the endpoint + // to be closed, the status will indicate the error code. In either case, + // we will reject the pending close promise at this point. + const maybeCloseError = this.#maybeGetCloseError(context, status); + if (maybeCloseError !== undefined) { + if (onEndpointErrorChannel.hasSubscribers) { + onEndpointErrorChannel.publish({ + endpoint: this, + error: maybeCloseError, + }); + } + this.#pendingClose.reject(maybeCloseError); + } else { + // Otherwise we are good to resolve the pending close promise! + this.#pendingClose.resolve(); + } + if (onEndpointClosedChannel.hasSubscribers) { + onEndpointClosedChannel.publish({ + endpoint: this, + }); + } + + // Note that we are intentionally not clearing the + // this.#pendingClose.promise here. this.#pendingClose.resolve = undefined; this.#pendingClose.reject = undefined; - this.#handle = undefined; + this.#pendingError = undefined; } [kNewSession](handle) { - const session = new Session(this.#sessionConfig, this.#streamConfig, handle, this); - ArrayPrototypePush(this.#sessions, session); - this.#onsession(session, this); + const session = this.#newSession(handle); + if (onEndpointServerSessionChannel.hasSubscribers) { + onEndpointServerSessionChannel.publish({ + endpoint: this, + session, + }); + } + this.#onsession(session); + } + + // Called by the QuicSession when it closes to remove itself from + // the active sessions tracked by the QuicEndpoint. + [kRemoveSession](session) { + this.#sessions.delete(session); } async [SymbolAsyncDispose]() { await this.close(); } @@ -2338,7 +2037,7 @@ class Endpoint { depth: options.depth == null ? null : options.depth - 1, }; - return `Endpoint ${inspect({ + return `QuicEndpoint ${inspect({ address: this.address, busy: this.busy, closed: this.closed, @@ -2352,197 +2051,39 @@ class Endpoint { } }; -ObjectDefineProperties(QuicStreamStats.prototype, { - createdAt: kEnumerable, - receivedAt: kEnumerable, - ackedAt: kEnumerable, - closingAt: kEnumerable, - destroyedAt: kEnumerable, - bytesReceived: kEnumerable, - bytesSent: kEnumerable, - maxOffset: kEnumerable, - maxOffsetAcknowledged: kEnumerable, - maxOffsetReceived: kEnumerable, - finalSize: kEnumerable, -}); -ObjectDefineProperties(QuicStreamState.prototype, { - id: kEnumerable, - finSent: kEnumerable, - finReceived: kEnumerable, - readEnded: kEnumerable, - writeEnded: kEnumerable, - destroyed: kEnumerable, - paused: kEnumerable, - reset: kEnumerable, - hasReader: kEnumerable, - wantsBlock: kEnumerable, - wantsHeaders: kEnumerable, - wantsReset: kEnumerable, - wantsTrailers: kEnumerable, -}); -ObjectDefineProperties(QuicStream.prototype, { - stats: kEnumerable, - state: kEnumerable, - session: kEnumerable, - id: kEnumerable, -}); -ObjectDefineProperties(SessionStats.prototype, { - createdAt: kEnumerable, - closingAt: kEnumerable, - destroyedAt: kEnumerable, - handshakeCompletedAt: kEnumerable, - handshakeConfirmedAt: kEnumerable, - gracefulClosingAt: kEnumerable, - bytesReceived: kEnumerable, - bytesSent: kEnumerable, - bidiInStreamCount: kEnumerable, - bidiOutStreamCount: kEnumerable, - uniInStreamCount: kEnumerable, - uniOutStreamCount: kEnumerable, - lossRetransmitCount: kEnumerable, - maxBytesInFlights: kEnumerable, - bytesInFlight: kEnumerable, - blockCount: kEnumerable, - cwnd: kEnumerable, - latestRtt: kEnumerable, - minRtt: kEnumerable, - rttVar: kEnumerable, - smoothedRtt: kEnumerable, - ssthresh: kEnumerable, - datagramsReceived: kEnumerable, - datagramsSent: kEnumerable, - datagramsAcknowledged: kEnumerable, - datagramsLost: kEnumerable, -}); -ObjectDefineProperties(SessionState.prototype, { - hasPathValidationListener: kEnumerable, - hasVersionNegotiationListener: kEnumerable, - hasDatagramListener: kEnumerable, - hasSessionTicketListener: kEnumerable, - isClosing: kEnumerable, - isGracefulClose: kEnumerable, - isSilentClose: kEnumerable, - isStatelessReset: kEnumerable, - isDestroyed: kEnumerable, - isHandshakeCompleted: kEnumerable, - isHandshakeConfirmed: kEnumerable, - isStreamOpenAllowed: kEnumerable, - isPrioritySupported: kEnumerable, - isWrapped: kEnumerable, - lastDatagramId: kEnumerable, -}); -ObjectDefineProperties(Session.prototype, { - closed: kEnumerable, - destroyed: kEnumerable, - endpoint: kEnumerable, - path: kEnumerable, - state: kEnumerable, - stats: kEnumerable, -}); -ObjectDefineProperties(EndpointStats.prototype, { - createdAt: kEnumerable, - destroyedAt: kEnumerable, - bytesReceived: kEnumerable, - bytesSent: kEnumerable, - packetsReceived: kEnumerable, - packetsSent: kEnumerable, - serverSessions: kEnumerable, - clientSessions: kEnumerable, - serverBusyCount: kEnumerable, - retryCount: kEnumerable, - versionNegotiationCount: kEnumerable, - statelessResetCount: kEnumerable, - immediateCloseCount: kEnumerable, -}); -ObjectDefineProperties(EndpointState.prototype, { - isBound: kEnumerable, - isReceiving: kEnumerable, - isListening: kEnumerable, - isClosing: kEnumerable, - isBusy: kEnumerable, - pendingCallbacks: kEnumerable, -}); -ObjectDefineProperties(Endpoint.prototype, { - address: kEnumerable, - busy: kEnumerable, - closed: kEnumerable, - destroyed: kEnumerable, - state: kEnumerable, - stats: kEnumerable, -}); -ObjectDefineProperties(Endpoint, { - CC_ALGO_RENO: { - __proto__: null, - value: CC_ALGO_RENO, - writable: false, - configurable: false, - enumerable: true, - }, - CC_ALGO_CUBIC: { - __proto__: null, - value: CC_ALGO_CUBIC, - writable: false, - configurable: false, - enumerable: true, - }, - CC_ALGO_BBR: { - __proto__: null, - value: CC_ALGO_BBR, - writable: false, - configurable: false, - enumerable: true, - }, - CC_ALGO_RENO_STR: { - __proto__: null, - value: CC_ALGO_RENO_STR, - writable: false, - configurable: false, - enumerable: true, - }, - CC_ALGO_CUBIC_STR: { - __proto__: null, - value: CC_ALGO_CUBIC_STR, - writable: false, - configurable: false, - enumerable: true, - }, - CC_ALGO_BBR_STR: { +function readOnlyConstant(value) { + return { __proto__: null, - value: CC_ALGO_BBR_STR, + value, writable: false, configurable: false, enumerable: true, - }, + }; +} + +ObjectDefineProperties(QuicEndpoint, { + CC_ALGO_RENO: readOnlyConstant(CC_ALGO_RENO), + CC_ALGO_CUBIC: readOnlyConstant(CC_ALGO_CUBIC), + CC_ALGO_BBR: readOnlyConstant(CC_ALGO_BBR), + CC_ALGP_RENO_STR: readOnlyConstant(CC_ALGO_RENO_STR), + CC_ALGO_CUBIC_STR: readOnlyConstant(CC_ALGO_CUBIC_STR), + CC_ALGO_BBR_STR: readOnlyConstant(CC_ALGO_BBR_STR), }); -ObjectDefineProperties(Session, { - DEFAULT_CIPHERS: { - __proto__: null, - value: DEFAULT_CIPHERS, - writable: false, - configurable: false, - enumerable: true, - }, - DEFAULT_GROUPS: { - __proto__: null, - value: DEFAULT_GROUPS, - writable: false, - configurable: false, - enumerable: true, - }, +ObjectDefineProperties(QuicSession, { + DEFAULT_CIPHERS: readOnlyConstant(DEFAULT_CIPHERS), + DEFAULT_GROUPS: readOnlyConstant(DEFAULT_GROUPS), }); module.exports = { - Endpoint, - Session, + QuicEndpoint, + QuicSession, QuicStream, - // Exported for testing - kFinishClose, - SessionState, - SessionStats, + QuicSessionState, + QuicSessionStats, QuicStreamState, QuicStreamStats, - EndpointState, - EndpointStats, + QuicEndpointState, + QuicEndpointStats, }; /* c8 ignore stop */ diff --git a/lib/internal/quic/state.js b/lib/internal/quic/state.js new file mode 100644 index 00000000000000..8bfb2ac83302fb --- /dev/null +++ b/lib/internal/quic/state.js @@ -0,0 +1,566 @@ +'use strict'; + +const { + ArrayBuffer, + DataView, + DataViewPrototypeGetBigInt64, + DataViewPrototypeGetBigUint64, + DataViewPrototypeGetUint8, + DataViewPrototypeSetUint8, + JSONStringify, +} = primordials; + +const { + codes: { + ERR_ILLEGAL_CONSTRUCTOR, + ERR_INVALID_ARG_TYPE, + ERR_INVALID_STATE, + }, +} = require('internal/errors'); + +const { + isArrayBuffer, +} = require('util/types'); + +const { inspect } = require('internal/util/inspect'); + +const { + kFinishClose, + kInspect, + kPrivateConstructor, +} = require('internal/quic/symbols'); + +// This file defines the helper objects for accessing state for +// various QUIC objects. Each of these wraps a DataView. +// Some of the state properties are read only, others are mutable. +// An ArrayBuffer is shared with the C++ level to allow for more +// efficient communication of state across the C++/JS boundary. +// When the state object is no longer needed, it is closed to +// prevent further updates to the buffer. + +const { + IDX_STATE_SESSION_PATH_VALIDATION, + IDX_STATE_SESSION_VERSION_NEGOTIATION, + IDX_STATE_SESSION_DATAGRAM, + IDX_STATE_SESSION_SESSION_TICKET, + IDX_STATE_SESSION_CLOSING, + IDX_STATE_SESSION_GRACEFUL_CLOSE, + IDX_STATE_SESSION_SILENT_CLOSE, + IDX_STATE_SESSION_STATELESS_RESET, + IDX_STATE_SESSION_DESTROYED, + IDX_STATE_SESSION_HANDSHAKE_COMPLETED, + IDX_STATE_SESSION_HANDSHAKE_CONFIRMED, + IDX_STATE_SESSION_STREAM_OPEN_ALLOWED, + IDX_STATE_SESSION_PRIORITY_SUPPORTED, + IDX_STATE_SESSION_WRAPPED, + IDX_STATE_SESSION_LAST_DATAGRAM_ID, + + IDX_STATE_ENDPOINT_BOUND, + IDX_STATE_ENDPOINT_RECEIVING, + IDX_STATE_ENDPOINT_LISTENING, + IDX_STATE_ENDPOINT_CLOSING, + IDX_STATE_ENDPOINT_BUSY, + IDX_STATE_ENDPOINT_PENDING_CALLBACKS, + + IDX_STATE_STREAM_ID, + IDX_STATE_STREAM_FIN_SENT, + IDX_STATE_STREAM_FIN_RECEIVED, + IDX_STATE_STREAM_READ_ENDED, + IDX_STATE_STREAM_WRITE_ENDED, + IDX_STATE_STREAM_DESTROYED, + IDX_STATE_STREAM_PAUSED, + IDX_STATE_STREAM_RESET, + IDX_STATE_STREAM_HAS_READER, + IDX_STATE_STREAM_WANTS_BLOCK, + IDX_STATE_STREAM_WANTS_HEADERS, + IDX_STATE_STREAM_WANTS_RESET, + IDX_STATE_STREAM_WANTS_TRAILERS, +} = internalBinding('quic'); + +class QuicEndpointState { + /** @type {DataView} */ + #handle; + + /** + * @param {symbol} privateSymbol + * @param {ArrayBuffer} buffer + */ + constructor(privateSymbol, buffer) { + if (privateSymbol !== kPrivateConstructor) { + throw new ERR_ILLEGAL_CONSTRUCTOR(); + } + if (!isArrayBuffer(buffer)) { + throw new ERR_INVALID_ARG_TYPE('buffer', ['ArrayBuffer'], buffer); + } + this.#handle = new DataView(buffer); + } + + #assertNotClosed() { + if (this.#handle.byteLength === 0) { + throw new ERR_INVALID_STATE('Endpoint is closed'); + } + } + + /** @type {boolean} */ + get isBound() { + this.#assertNotClosed(); + return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_ENDPOINT_BOUND); + } + + /** @type {boolean} */ + get isReceiving() { + this.#assertNotClosed(); + return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_ENDPOINT_RECEIVING); + } + + /** @type {boolean} */ + get isListening() { + this.#assertNotClosed(); + return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_ENDPOINT_LISTENING); + } + + /** @type {boolean} */ + get isClosing() { + this.#assertNotClosed(); + return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_ENDPOINT_CLOSING); + } + + /** @type {boolean} */ + get isBusy() { + this.#assertNotClosed(); + return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_ENDPOINT_BUSY); + } + + /** + * The number of underlying callbacks that are pending. If the session + * is closing, these are the number of callbacks that the session is + * waiting on before it can be closed. + * @type {bigint} + */ + get pendingCallbacks() { + this.#assertNotClosed(); + return DataViewPrototypeGetBigUint64(this.#handle, IDX_STATE_ENDPOINT_PENDING_CALLBACKS); + } + + toString() { + return JSONStringify(this.toJSON()); + } + + toJSON() { + if (this.#handle.byteLength === 0) return {}; + return { + __proto__: null, + isBound: this.isBound, + isReceiving: this.isReceiving, + isListening: this.isListening, + isClosing: this.isClosing, + isBusy: this.isBusy, + pendingCallbacks: `${this.pendingCallbacks}`, + }; + } + + [kInspect](depth, options) { + if (depth < 0) + return this; + + if (this.#handle.byteLength === 0) { + return 'QuicEndpointState { }'; + } + + const opts = { + ...options, + depth: options.depth == null ? null : options.depth - 1, + }; + + return `QuicEndpointState ${inspect({ + isBound: this.isBound, + isReceiving: this.isReceiving, + isListening: this.isListening, + isClosing: this.isClosing, + isBusy: this.isBusy, + pendingCallbacks: this.pendingCallbacks, + }, opts)}`; + } + + [kFinishClose]() { + // Snapshot the state into a new DataView since the underlying + // buffer will be destroyed. + if (this.#handle.byteLength === 0) return; + this.#handle = new DataView(new ArrayBuffer(0)); + } +} + +class QuicSessionState { + /** @type {DataView} */ + #handle; + + /** + * @param {symbol} privateSymbol + * @param {ArrayBuffer} buffer + */ + constructor(privateSymbol, buffer) { + if (privateSymbol !== kPrivateConstructor) { + throw new ERR_ILLEGAL_CONSTRUCTOR(); + } + if (!isArrayBuffer(buffer)) { + throw new ERR_INVALID_ARG_TYPE('buffer', ['ArrayBuffer'], buffer); + } + this.#handle = new DataView(buffer); + } + + #assertNotClosed() { + if (this.#handle.byteLength === 0) { + throw new ERR_INVALID_STATE('Session is closed'); + } + } + + /** @type {boolean} */ + get hasPathValidationListener() { + this.#assertNotClosed(); + return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_SESSION_PATH_VALIDATION); + } + + /** @type {boolean} */ + set hasPathValidationListener(val) { + this.#assertNotClosed(); + DataViewPrototypeSetUint8(this.#handle, IDX_STATE_SESSION_PATH_VALIDATION, val ? 1 : 0); + } + + /** @type {boolean} */ + get hasVersionNegotiationListener() { + this.#assertNotClosed(); + return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_SESSION_VERSION_NEGOTIATION); + } + + /** @type {boolean} */ + set hasVersionNegotiationListener(val) { + this.#assertNotClosed(); + DataViewPrototypeSetUint8(this.#handle, IDX_STATE_SESSION_VERSION_NEGOTIATION, val ? 1 : 0); + } + + /** @type {boolean} */ + get hasDatagramListener() { + this.#assertNotClosed(); + return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_SESSION_DATAGRAM); + } + + /** @type {boolean} */ + set hasDatagramListener(val) { + this.#assertNotClosed(); + DataViewPrototypeSetUint8(this.#handle, IDX_STATE_SESSION_DATAGRAM, val ? 1 : 0); + } + + /** @type {boolean} */ + get hasSessionTicketListener() { + this.#assertNotClosed(); + return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_SESSION_SESSION_TICKET); + } + + /** @type {boolean} */ + set hasSessionTicketListener(val) { + this.#assertNotClosed(); + DataViewPrototypeSetUint8(this.#handle, IDX_STATE_SESSION_SESSION_TICKET, val ? 1 : 0); + } + + /** @type {boolean} */ + get isClosing() { + this.#assertNotClosed(); + return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_SESSION_CLOSING); + } + + /** @type {boolean} */ + get isGracefulClose() { + this.#assertNotClosed(); + return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_SESSION_GRACEFUL_CLOSE); + } + + /** @type {boolean} */ + get isSilentClose() { + this.#assertNotClosed(); + return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_SESSION_SILENT_CLOSE); + } + + /** @type {boolean} */ + get isStatelessReset() { + this.#assertNotClosed(); + return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_SESSION_STATELESS_RESET); + } + + /** @type {boolean} */ + get isDestroyed() { + this.#assertNotClosed(); + return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_SESSION_DESTROYED); + } + + /** @type {boolean} */ + get isHandshakeCompleted() { + this.#assertNotClosed(); + return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_SESSION_HANDSHAKE_COMPLETED); + } + + /** @type {boolean} */ + get isHandshakeConfirmed() { + this.#assertNotClosed(); + return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_SESSION_HANDSHAKE_CONFIRMED); + } + + /** @type {boolean} */ + get isStreamOpenAllowed() { + this.#assertNotClosed(); + return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_SESSION_STREAM_OPEN_ALLOWED); + } + + /** @type {boolean} */ + get isPrioritySupported() { + this.#assertNotClosed(); + return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_SESSION_PRIORITY_SUPPORTED); + } + + /** @type {boolean} */ + get isWrapped() { + this.#assertNotClosed(); + return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_SESSION_WRAPPED); + } + + /** @type {bigint} */ + get lastDatagramId() { + this.#assertNotClosed(); + return DataViewPrototypeGetBigUint64(this.#handle, IDX_STATE_SESSION_LAST_DATAGRAM_ID); + } + + toString() { + return JSONStringify(this.toJSON()); + } + + toJSON() { + if (this.#handle.byteLength === 0) return {}; + return { + __proto__: null, + hasPathValidationListener: this.hasPathValidationListener, + hasVersionNegotiationListener: this.hasVersionNegotiationListener, + hasDatagramListener: this.hasDatagramListener, + hasSessionTicketListener: this.hasSessionTicketListener, + isClosing: this.isClosing, + isGracefulClose: this.isGracefulClose, + isSilentClose: this.isSilentClose, + isStatelessReset: this.isStatelessReset, + isDestroyed: this.isDestroyed, + isHandshakeCompleted: this.isHandshakeCompleted, + isHandshakeConfirmed: this.isHandshakeConfirmed, + isStreamOpenAllowed: this.isStreamOpenAllowed, + isPrioritySupported: this.isPrioritySupported, + isWrapped: this.isWrapped, + lastDatagramId: `${this.lastDatagramId}`, + }; + } + + [kInspect](depth, options) { + if (depth < 0) + return this; + + if (this.#handle.byteLength === 0) { + return 'QuicSessionState { }'; + } + + const opts = { + ...options, + depth: options.depth == null ? null : options.depth - 1, + }; + + return `QuicSessionState ${inspect({ + hasPathValidationListener: this.hasPathValidationListener, + hasVersionNegotiationListener: this.hasVersionNegotiationListener, + hasDatagramListener: this.hasDatagramListener, + hasSessionTicketListener: this.hasSessionTicketListener, + isClosing: this.isClosing, + isGracefulClose: this.isGracefulClose, + isSilentClose: this.isSilentClose, + isStatelessReset: this.isStatelessReset, + isDestroyed: this.isDestroyed, + isHandshakeCompleted: this.isHandshakeCompleted, + isHandshakeConfirmed: this.isHandshakeConfirmed, + isStreamOpenAllowed: this.isStreamOpenAllowed, + isPrioritySupported: this.isPrioritySupported, + isWrapped: this.isWrapped, + lastDatagramId: this.lastDatagramId, + }, opts)}`; + } + + [kFinishClose]() { + // Snapshot the state into a new DataView since the underlying + // buffer will be destroyed. + if (this.#handle.byteLength === 0) return; + this.#handle = new DataView(new ArrayBuffer(0)); + } +} + +class QuicStreamState { + /** @type {DataView} */ + #handle; + + /** + * @param {symbol} privateSymbol + * @param {ArrayBuffer} buffer + */ + constructor(privateSymbol, buffer) { + if (privateSymbol !== kPrivateConstructor) { + throw new ERR_ILLEGAL_CONSTRUCTOR(); + } + if (!isArrayBuffer(buffer)) { + throw new ERR_INVALID_ARG_TYPE('buffer', ['ArrayBuffer'], buffer); + } + this.#handle = new DataView(buffer); + } + + /** @type {bigint} */ + get id() { + return DataViewPrototypeGetBigInt64(this.#handle, IDX_STATE_STREAM_ID); + } + + /** @type {boolean} */ + get finSent() { + return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_STREAM_FIN_SENT); + } + + /** @type {boolean} */ + get finReceived() { + return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_STREAM_FIN_RECEIVED); + } + + /** @type {boolean} */ + get readEnded() { + return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_STREAM_READ_ENDED); + } + + /** @type {boolean} */ + get writeEnded() { + return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_STREAM_WRITE_ENDED); + } + + /** @type {boolean} */ + get destroyed() { + return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_STREAM_DESTROYED); + } + + /** @type {boolean} */ + get paused() { + return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_STREAM_PAUSED); + } + + /** @type {boolean} */ + get reset() { + return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_STREAM_RESET); + } + + /** @type {boolean} */ + get hasReader() { + return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_STREAM_HAS_READER); + } + + /** @type {boolean} */ + get wantsBlock() { + return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_STREAM_WANTS_BLOCK); + } + + /** @type {boolean} */ + set wantsBlock(val) { + DataViewPrototypeSetUint8(this.#handle, IDX_STATE_STREAM_WANTS_BLOCK, val ? 1 : 0); + } + + /** @type {boolean} */ + get wantsHeaders() { + return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_STREAM_WANTS_HEADERS); + } + + /** @type {boolean} */ + set wantsHeaders(val) { + DataViewPrototypeSetUint8(this.#handle, IDX_STATE_STREAM_WANTS_HEADERS, val ? 1 : 0); + } + + /** @type {boolean} */ + get wantsReset() { + return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_STREAM_WANTS_RESET); + } + + /** @type {boolean} */ + set wantsReset(val) { + DataViewPrototypeSetUint8(this.#handle, IDX_STATE_STREAM_WANTS_RESET, val ? 1 : 0); + } + + /** @type {boolean} */ + get wantsTrailers() { + return !!DataViewPrototypeGetUint8(this.#handle, IDX_STATE_STREAM_WANTS_TRAILERS); + } + + /** @type {boolean} */ + set wantsTrailers(val) { + DataViewPrototypeSetUint8(this.#handle, IDX_STATE_STREAM_WANTS_TRAILERS, val ? 1 : 0); + } + + toString() { + return JSONStringify(this.toJSON()); + } + + toJSON() { + if (this.#handle.byteLength === 0) return {}; + return { + __proto__: null, + id: `${this.id}`, + finSent: this.finSent, + finReceived: this.finReceived, + readEnded: this.readEnded, + writeEnded: this.writeEnded, + destroyed: this.destroyed, + paused: this.paused, + reset: this.reset, + hasReader: this.hasReader, + wantsBlock: this.wantsBlock, + wantsHeaders: this.wantsHeaders, + wantsReset: this.wantsReset, + wantsTrailers: this.wantsTrailers, + }; + } + + [kInspect](depth, options) { + if (depth < 0) + return this; + + if (this.#handle.byteLength === 0) { + return 'QuicStreamState { }'; + } + + const opts = { + ...options, + depth: options.depth == null ? null : options.depth - 1, + }; + + return `QuicStreamState ${inspect({ + id: this.id, + finSent: this.finSent, + finReceived: this.finReceived, + readEnded: this.readEnded, + writeEnded: this.writeEnded, + destroyed: this.destroyed, + paused: this.paused, + reset: this.reset, + hasReader: this.hasReader, + wantsBlock: this.wantsBlock, + wantsHeaders: this.wantsHeaders, + wantsReset: this.wantsReset, + wantsTrailers: this.wantsTrailers, + }, opts)}`; + } + + [kFinishClose]() { + // Snapshot the state into a new DataView since the underlying + // buffer will be destroyed. + if (this.#handle.byteLength === 0) return; + this.#handle = new DataView(new ArrayBuffer(0)); + } +} + +module.exports = { + QuicEndpointState, + QuicSessionState, + QuicStreamState, +}; diff --git a/lib/internal/quic/stats.js b/lib/internal/quic/stats.js new file mode 100644 index 00000000000000..3ac9523d9aeca4 --- /dev/null +++ b/lib/internal/quic/stats.js @@ -0,0 +1,646 @@ +'use strict'; + +const { + BigUint64Array, + JSONStringify, +} = primordials; + +const { + isArrayBuffer, +} = require('util/types'); + +const { + codes: { + ERR_ILLEGAL_CONSTRUCTOR, + ERR_INVALID_ARG_TYPE, + }, +} = require('internal/errors'); + +const { inspect } = require('internal/util/inspect'); + +const { + kFinishClose, + kInspect, + kPrivateConstructor, +} = require('internal/quic/symbols'); + +// This file defines the helper objects for accessing statistics collected +// by various QUIC objects. Each of these wraps a BigUint64Array. Every +// stats object is read-only via the API, and the underlying buffer is +// only updated by the QUIC internals. When the stats object is no longer +// needed, it is closed to prevent further updates to the buffer. + +const { + // All of the IDX_STATS_* constants are the index positions of the stats + // fields in the relevant BigUint64Array's that underlie the *Stats objects. + // These are not exposed to end users. + IDX_STATS_ENDPOINT_CREATED_AT, + IDX_STATS_ENDPOINT_DESTROYED_AT, + IDX_STATS_ENDPOINT_BYTES_RECEIVED, + IDX_STATS_ENDPOINT_BYTES_SENT, + IDX_STATS_ENDPOINT_PACKETS_RECEIVED, + IDX_STATS_ENDPOINT_PACKETS_SENT, + IDX_STATS_ENDPOINT_SERVER_SESSIONS, + IDX_STATS_ENDPOINT_CLIENT_SESSIONS, + IDX_STATS_ENDPOINT_SERVER_BUSY_COUNT, + IDX_STATS_ENDPOINT_RETRY_COUNT, + IDX_STATS_ENDPOINT_VERSION_NEGOTIATION_COUNT, + IDX_STATS_ENDPOINT_STATELESS_RESET_COUNT, + IDX_STATS_ENDPOINT_IMMEDIATE_CLOSE_COUNT, + + IDX_STATS_SESSION_CREATED_AT, + IDX_STATS_SESSION_CLOSING_AT, + IDX_STATS_SESSION_DESTROYED_AT, + IDX_STATS_SESSION_HANDSHAKE_COMPLETED_AT, + IDX_STATS_SESSION_HANDSHAKE_CONFIRMED_AT, + IDX_STATS_SESSION_GRACEFUL_CLOSING_AT, + IDX_STATS_SESSION_BYTES_RECEIVED, + IDX_STATS_SESSION_BYTES_SENT, + IDX_STATS_SESSION_BIDI_IN_STREAM_COUNT, + IDX_STATS_SESSION_BIDI_OUT_STREAM_COUNT, + IDX_STATS_SESSION_UNI_IN_STREAM_COUNT, + IDX_STATS_SESSION_UNI_OUT_STREAM_COUNT, + IDX_STATS_SESSION_LOSS_RETRANSMIT_COUNT, + IDX_STATS_SESSION_MAX_BYTES_IN_FLIGHT, + IDX_STATS_SESSION_BYTES_IN_FLIGHT, + IDX_STATS_SESSION_BLOCK_COUNT, + IDX_STATS_SESSION_CWND, + IDX_STATS_SESSION_LATEST_RTT, + IDX_STATS_SESSION_MIN_RTT, + IDX_STATS_SESSION_RTTVAR, + IDX_STATS_SESSION_SMOOTHED_RTT, + IDX_STATS_SESSION_SSTHRESH, + IDX_STATS_SESSION_DATAGRAMS_RECEIVED, + IDX_STATS_SESSION_DATAGRAMS_SENT, + IDX_STATS_SESSION_DATAGRAMS_ACKNOWLEDGED, + IDX_STATS_SESSION_DATAGRAMS_LOST, + + IDX_STATS_STREAM_CREATED_AT, + IDX_STATS_STREAM_RECEIVED_AT, + IDX_STATS_STREAM_ACKED_AT, + IDX_STATS_STREAM_CLOSING_AT, + IDX_STATS_STREAM_DESTROYED_AT, + IDX_STATS_STREAM_BYTES_RECEIVED, + IDX_STATS_STREAM_BYTES_SENT, + IDX_STATS_STREAM_MAX_OFFSET, + IDX_STATS_STREAM_MAX_OFFSET_ACK, + IDX_STATS_STREAM_MAX_OFFSET_RECV, + IDX_STATS_STREAM_FINAL_SIZE, +} = internalBinding('quic'); + +class QuicEndpointStats { + /** @type {BigUint64Array} */ + #handle; + /** @type {boolean} */ + #disconnected = false; + + /** + * @param {symbol} privateSymbol + * @param {ArrayBuffer} buffer + */ + constructor(privateSymbol, buffer) { + // We use the kPrivateConstructor symbol to restrict the ability to + // create new instances of QuicEndpointStats to internal code. + if (privateSymbol !== kPrivateConstructor) { + throw new ERR_ILLEGAL_CONSTRUCTOR(); + } + if (!isArrayBuffer(buffer)) { + throw new ERR_INVALID_ARG_TYPE('buffer', ['ArrayBuffer'], buffer); + } + this.#handle = new BigUint64Array(buffer); + } + + /** @type {bigint} */ + get createdAt() { + return this.#handle[IDX_STATS_ENDPOINT_CREATED_AT]; + } + + /** @type {bigint} */ + get destroyedAt() { + return this.#handle[IDX_STATS_ENDPOINT_DESTROYED_AT]; + } + + /** @type {bigint} */ + get bytesReceived() { + return this.#handle[IDX_STATS_ENDPOINT_BYTES_RECEIVED]; + } + + /** @type {bigint} */ + get bytesSent() { + return this.#handle[IDX_STATS_ENDPOINT_BYTES_SENT]; + } + + /** @type {bigint} */ + get packetsReceived() { + return this.#handle[IDX_STATS_ENDPOINT_PACKETS_RECEIVED]; + } + + /** @type {bigint} */ + get packetsSent() { + return this.#handle[IDX_STATS_ENDPOINT_PACKETS_SENT]; + } + + /** @type {bigint} */ + get serverSessions() { + return this.#handle[IDX_STATS_ENDPOINT_SERVER_SESSIONS]; + } + + /** @type {bigint} */ + get clientSessions() { + return this.#handle[IDX_STATS_ENDPOINT_CLIENT_SESSIONS]; + } + + /** @type {bigint} */ + get serverBusyCount() { + return this.#handle[IDX_STATS_ENDPOINT_SERVER_BUSY_COUNT]; + } + + /** @type {bigint} */ + get retryCount() { + return this.#handle[IDX_STATS_ENDPOINT_RETRY_COUNT]; + } + + /** @type {bigint} */ + get versionNegotiationCount() { + return this.#handle[IDX_STATS_ENDPOINT_VERSION_NEGOTIATION_COUNT]; + } + + /** @type {bigint} */ + get statelessResetCount() { + return this.#handle[IDX_STATS_ENDPOINT_STATELESS_RESET_COUNT]; + } + + /** @type {bigint} */ + get immediateCloseCount() { + return this.#handle[IDX_STATS_ENDPOINT_IMMEDIATE_CLOSE_COUNT]; + } + + toString() { + return JSONStringify(this.toJSON()); + } + + toJSON() { + return { + __proto__: null, + connected: this.isConnected, + // We need to convert the values to strings because JSON does not + // support BigInts. + createdAt: `${this.createdAt}`, + destroyedAt: `${this.destroyedAt}`, + bytesReceived: `${this.bytesReceived}`, + bytesSent: `${this.bytesSent}`, + packetsReceived: `${this.packetsReceived}`, + packetsSent: `${this.packetsSent}`, + serverSessions: `${this.serverSessions}`, + clientSessions: `${this.clientSessions}`, + serverBusyCount: `${this.serverBusyCount}`, + retryCount: `${this.retryCount}`, + versionNegotiationCount: `${this.versionNegotiationCount}`, + statelessResetCount: `${this.statelessResetCount}`, + immediateCloseCount: `${this.immediateCloseCount}`, + }; + } + + [kInspect](depth, options) { + if (depth < 0) + return this; + + const opts = { + ...options, + depth: options.depth == null ? null : options.depth - 1, + }; + + return `QuicEndpointStats ${inspect({ + connected: this.isConnected, + createdAt: this.createdAt, + destroyedAt: this.destroyedAt, + bytesReceived: this.bytesReceived, + bytesSent: this.bytesSent, + packetsReceived: this.packetsReceived, + packetsSent: this.packetsSent, + serverSessions: this.serverSessions, + clientSessions: this.clientSessions, + serverBusyCount: this.serverBusyCount, + retryCount: this.retryCount, + versionNegotiationCount: this.versionNegotiationCount, + statelessResetCount: this.statelessResetCount, + immediateCloseCount: this.immediateCloseCount, + }, opts)}`; + } + + /** + * True if this QuicEndpointStats object is still connected to the underlying + * Endpoint stats source. If this returns false, then the stats object is + * no longer being updated and should be considered stale. + * @returns {boolean} + */ + get isConnected() { + return !this.#disconnected; + } + + [kFinishClose]() { + // Snapshot the stats into a new BigUint64Array since the underlying + // buffer will be destroyed. + this.#handle = new BigUint64Array(this.#handle); + this.#disconnected = true; + } +} + +class QuicSessionStats { + /** @type {BigUint64Array} */ + #handle; + /** @type {boolean} */ + #disconnected = false; + + /** + * @param {symbol} privateSynbol + * @param {BigUint64Array} buffer + */ + constructor(privateSynbol, buffer) { + // We use the kPrivateConstructor symbol to restrict the ability to + // create new instances of QuicSessionStats to internal code. + if (privateSynbol !== kPrivateConstructor) { + throw new ERR_ILLEGAL_CONSTRUCTOR(); + } + if (!isArrayBuffer(buffer)) { + throw new ERR_INVALID_ARG_TYPE('buffer', ['ArrayBuffer'], buffer); + } + this.#handle = new BigUint64Array(buffer); + } + + /** @type {bigint} */ + get createdAt() { + return this.#handle[IDX_STATS_SESSION_CREATED_AT]; + } + + /** @type {bigint} */ + get closingAt() { + return this.#handle[IDX_STATS_SESSION_CLOSING_AT]; + } + + /** @type {bigint} */ + get destroyedAt() { + return this.#handle[IDX_STATS_SESSION_DESTROYED_AT]; + } + + /** @type {bigint} */ + get handshakeCompletedAt() { + return this.#handle[IDX_STATS_SESSION_HANDSHAKE_COMPLETED_AT]; + } + + /** @type {bigint} */ + get handshakeConfirmedAt() { + return this.#handle[IDX_STATS_SESSION_HANDSHAKE_CONFIRMED_AT]; + } + + /** @type {bigint} */ + get gracefulClosingAt() { + return this.#handle[IDX_STATS_SESSION_GRACEFUL_CLOSING_AT]; + } + + /** @type {bigint} */ + get bytesReceived() { + return this.#handle[IDX_STATS_SESSION_BYTES_RECEIVED]; + } + + /** @type {bigint} */ + get bytesSent() { + return this.#handle[IDX_STATS_SESSION_BYTES_SENT]; + } + + /** @type {bigint} */ + get bidiInStreamCount() { + return this.#handle[IDX_STATS_SESSION_BIDI_IN_STREAM_COUNT]; + } + + /** @type {bigint} */ + get bidiOutStreamCount() { + return this.#handle[IDX_STATS_SESSION_BIDI_OUT_STREAM_COUNT]; + } + + /** @type {bigint} */ + get uniInStreamCount() { + return this.#handle[IDX_STATS_SESSION_UNI_IN_STREAM_COUNT]; + } + + /** @type {bigint} */ + get uniOutStreamCount() { + return this.#handle[IDX_STATS_SESSION_UNI_OUT_STREAM_COUNT]; + } + + /** @type {bigint} */ + get lossRetransmitCount() { + return this.#handle[IDX_STATS_SESSION_LOSS_RETRANSMIT_COUNT]; + } + + /** @type {bigint} */ + get maxBytesInFlights() { + return this.#handle[IDX_STATS_SESSION_MAX_BYTES_IN_FLIGHT]; + } + + /** @type {bigint} */ + get bytesInFlight() { + return this.#handle[IDX_STATS_SESSION_BYTES_IN_FLIGHT]; + } + + /** @type {bigint} */ + get blockCount() { + return this.#handle[IDX_STATS_SESSION_BLOCK_COUNT]; + } + + /** @type {bigint} */ + get cwnd() { + return this.#handle[IDX_STATS_SESSION_CWND]; + } + + /** @type {bigint} */ + get latestRtt() { + return this.#handle[IDX_STATS_SESSION_LATEST_RTT]; + } + + /** @type {bigint} */ + get minRtt() { + return this.#handle[IDX_STATS_SESSION_MIN_RTT]; + } + + /** @type {bigint} */ + get rttVar() { + return this.#handle[IDX_STATS_SESSION_RTTVAR]; + } + + /** @type {bigint} */ + get smoothedRtt() { + return this.#handle[IDX_STATS_SESSION_SMOOTHED_RTT]; + } + + /** @type {bigint} */ + get ssthresh() { + return this.#handle[IDX_STATS_SESSION_SSTHRESH]; + } + + /** @type {bigint} */ + get datagramsReceived() { + return this.#handle[IDX_STATS_SESSION_DATAGRAMS_RECEIVED]; + } + + /** @type {bigint} */ + get datagramsSent() { + return this.#handle[IDX_STATS_SESSION_DATAGRAMS_SENT]; + } + + /** @type {bigint} */ + get datagramsAcknowledged() { + return this.#handle[IDX_STATS_SESSION_DATAGRAMS_ACKNOWLEDGED]; + } + + /** @type {bigint} */ + get datagramsLost() { + return this.#handle[IDX_STATS_SESSION_DATAGRAMS_LOST]; + } + + toString() { + return JSONStringify(this.toJSON()); + } + + toJSON() { + return { + __proto__: null, + connected: this.isConnected, + // We need to convert the values to strings because JSON does not + // support BigInts. + createdAt: `${this.createdAt}`, + closingAt: `${this.closingAt}`, + destroyedAt: `${this.destroyedAt}`, + handshakeCompletedAt: `${this.handshakeCompletedAt}`, + handshakeConfirmedAt: `${this.handshakeConfirmedAt}`, + gracefulClosingAt: `${this.gracefulClosingAt}`, + bytesReceived: `${this.bytesReceived}`, + bytesSent: `${this.bytesSent}`, + bidiInStreamCount: `${this.bidiInStreamCount}`, + bidiOutStreamCount: `${this.bidiOutStreamCount}`, + uniInStreamCount: `${this.uniInStreamCount}`, + uniOutStreamCount: `${this.uniOutStreamCount}`, + lossRetransmitCount: `${this.lossRetransmitCount}`, + maxBytesInFlights: `${this.maxBytesInFlights}`, + bytesInFlight: `${this.bytesInFlight}`, + blockCount: `${this.blockCount}`, + cwnd: `${this.cwnd}`, + latestRtt: `${this.latestRtt}`, + minRtt: `${this.minRtt}`, + rttVar: `${this.rttVar}`, + smoothedRtt: `${this.smoothedRtt}`, + ssthresh: `${this.ssthresh}`, + datagramsReceived: `${this.datagramsReceived}`, + datagramsSent: `${this.datagramsSent}`, + datagramsAcknowledged: `${this.datagramsAcknowledged}`, + datagramsLost: `${this.datagramsLost}`, + }; + } + + [kInspect](depth, options) { + if (depth < 0) + return this; + + const opts = { + ...options, + depth: options.depth == null ? null : options.depth - 1, + }; + + return `QuicSessionStats ${inspect({ + connected: this.isConnected, + createdAt: this.createdAt, + closingAt: this.closingAt, + destroyedAt: this.destroyedAt, + handshakeCompletedAt: this.handshakeCompletedAt, + handshakeConfirmedAt: this.handshakeConfirmedAt, + gracefulClosingAt: this.gracefulClosingAt, + bytesReceived: this.bytesReceived, + bytesSent: this.bytesSent, + bidiInStreamCount: this.bidiInStreamCount, + bidiOutStreamCount: this.bidiOutStreamCount, + uniInStreamCount: this.uniInStreamCount, + uniOutStreamCount: this.uniOutStreamCount, + lossRetransmitCount: this.lossRetransmitCount, + maxBytesInFlights: this.maxBytesInFlights, + bytesInFlight: this.bytesInFlight, + blockCount: this.blockCount, + cwnd: this.cwnd, + latestRtt: this.latestRtt, + minRtt: this.minRtt, + rttVar: this.rttVar, + smoothedRtt: this.smoothedRtt, + ssthresh: this.ssthresh, + datagramsReceived: this.datagramsReceived, + datagramsSent: this.datagramsSent, + datagramsAcknowledged: this.datagramsAcknowledged, + datagramsLost: this.datagramsLost, + }, opts)}`; + } + + /** + * True if this QuicSessionStats object is still connected to the underlying + * Session stats source. If this returns false, then the stats object is + * no longer being updated and should be considered stale. + * @returns {boolean} + */ + get isConnected() { + return !this.#disconnected; + } + + [kFinishClose]() { + // Snapshot the stats into a new BigUint64Array since the underlying + // buffer will be destroyed. + this.#handle = new BigUint64Array(this.#handle); + this.#disconnected = true; + } +} + +class QuicStreamStats { + /** @type {BigUint64Array} */ + #handle; + /** type {boolean} */ + #disconnected = false; + + /** + * @param {symbol} privateSymbol + * @param {ArrayBuffer} buffer + */ + constructor(privateSymbol, buffer) { + // We use the kPrivateConstructor symbol to restrict the ability to + // create new instances of QuicStreamStats to internal code. + if (privateSymbol !== kPrivateConstructor) { + throw new ERR_ILLEGAL_CONSTRUCTOR(); + } + if (!isArrayBuffer(buffer)) { + throw new ERR_INVALID_ARG_TYPE('buffer', ['ArrayBuffer'], buffer); + } + this.#handle = new BigUint64Array(buffer); + } + + /** @type {bigint} */ + get createdAt() { + return this.#handle[IDX_STATS_STREAM_CREATED_AT]; + } + + /** @type {bigint} */ + get receivedAt() { + return this.#handle[IDX_STATS_STREAM_RECEIVED_AT]; + } + + /** @type {bigint} */ + get ackedAt() { + return this.#handle[IDX_STATS_STREAM_ACKED_AT]; + } + + /** @type {bigint} */ + get closingAt() { + return this.#handle[IDX_STATS_STREAM_CLOSING_AT]; + } + + /** @type {bigint} */ + get destroyedAt() { + return this.#handle[IDX_STATS_STREAM_DESTROYED_AT]; + } + + /** @type {bigint} */ + get bytesReceived() { + return this.#handle[IDX_STATS_STREAM_BYTES_RECEIVED]; + } + + /** @type {bigint} */ + get bytesSent() { + return this.#handle[IDX_STATS_STREAM_BYTES_SENT]; + } + + /** @type {bigint} */ + get maxOffset() { + return this.#handle[IDX_STATS_STREAM_MAX_OFFSET]; + } + + /** @type {bigint} */ + get maxOffsetAcknowledged() { + return this.#handle[IDX_STATS_STREAM_MAX_OFFSET_ACK]; + } + + /** @type {bigint} */ + get maxOffsetReceived() { + return this.#handle[IDX_STATS_STREAM_MAX_OFFSET_RECV]; + } + + /** @type {bigint} */ + get finalSize() { + return this.#handle[IDX_STATS_STREAM_FINAL_SIZE]; + } + + toString() { + return JSONStringify(this.toJSON()); + } + + toJSON() { + return { + __proto__: null, + connected: this.isConnected, + // We need to convert the values to strings because JSON does not + // support BigInts. + createdAt: `${this.createdAt}`, + receivedAt: `${this.receivedAt}`, + ackedAt: `${this.ackedAt}`, + closingAt: `${this.closingAt}`, + destroyedAt: `${this.destroyedAt}`, + bytesReceived: `${this.bytesReceived}`, + bytesSent: `${this.bytesSent}`, + maxOffset: `${this.maxOffset}`, + maxOffsetAcknowledged: `${this.maxOffsetAcknowledged}`, + maxOffsetReceived: `${this.maxOffsetReceived}`, + finalSize: `${this.finalSize}`, + }; + } + + [kInspect](depth, options) { + if (depth < 0) + return this; + + const opts = { + ...options, + depth: options.depth == null ? null : options.depth - 1, + }; + + return `StreamStats ${inspect({ + connected: this.isConnected, + createdAt: this.createdAt, + receivedAt: this.receivedAt, + ackedAt: this.ackedAt, + closingAt: this.closingAt, + destroyedAt: this.destroyedAt, + bytesReceived: this.bytesReceived, + bytesSent: this.bytesSent, + maxOffset: this.maxOffset, + maxOffsetAcknowledged: this.maxOffsetAcknowledged, + maxOffsetReceived: this.maxOffsetReceived, + finalSize: this.finalSize, + }, opts)}`; + } + + /** + * True if this QuicStreamStats object is still connected to the underlying + * Stream stats source. If this returns false, then the stats object is + * no longer being updated and should be considered stale. + * @returns {boolean} + */ + get isConnected() { + return !this.#disconnected; + } + + [kFinishClose]() { + // Snapshot the stats into a new BigUint64Array since the underlying + // buffer will be destroyed. + this.#handle = new BigUint64Array(this.#handle); + this.#disconnected = true; + } +} + +module.exports = { + QuicEndpointStats, + QuicSessionStats, + QuicStreamStats, +}; diff --git a/lib/internal/quic/symbols.js b/lib/internal/quic/symbols.js new file mode 100644 index 00000000000000..c436b5c4b787ff --- /dev/null +++ b/lib/internal/quic/symbols.js @@ -0,0 +1,60 @@ +'use strict'; + +const { + Symbol, +} = primordials; + +const { + customInspectSymbol: kInspect, +} = require('internal/util'); + +const { + kHandle: kKeyObjectHandle, + kKeyObject: kKeyObjectInner, +} = require('internal/crypto/util'); + +// Symbols used to hide various private properties and methods from the +// public API. + +const kBlocked = Symbol('kBlocked'); +const kDatagram = Symbol('kDatagram'); +const kDatagramStatus = Symbol('kDatagramStatus'); +const kError = Symbol('kError'); +const kFinishClose = Symbol('kFinishClose'); +const kHandshake = Symbol('kHandshake'); +const kHeaders = Symbol('kHeaders'); +const kOwner = Symbol('kOwner'); +const kRemoveSession = Symbol('kRemoveSession'); +const kNewSession = Symbol('kNewSession'); +const kRemoveStream = Symbol('kRemoveStream'); +const kNewStream = Symbol('kNewStream'); +const kPathValidation = Symbol('kPathValidation'); +const kReset = Symbol('kReset'); +const kSessionTicket = Symbol('kSessionTicket'); +const kTrailers = Symbol('kTrailers'); +const kVersionNegotiation = Symbol('kVersionNegotiation'); +const kPrivateConstructor = Symbol('kPrivateConstructor'); + +module.exports = { + kBlocked, + kDatagram, + kDatagramStatus, + kError, + kFinishClose, + kHandshake, + kHeaders, + kOwner, + kRemoveSession, + kNewSession, + kRemoveStream, + kNewStream, + kPathValidation, + kReset, + kSessionTicket, + kTrailers, + kVersionNegotiation, + kInspect, + kKeyObjectHandle, + kKeyObjectInner, + kPrivateConstructor, +}; diff --git a/lib/internal/socketaddress.js b/lib/internal/socketaddress.js index e432c8a7d7593a..7fbe63980a0226 100644 --- a/lib/internal/socketaddress.js +++ b/lib/internal/socketaddress.js @@ -37,6 +37,8 @@ const { kDeserialize, } = require('internal/worker/js_transferable'); +const { URL } = require('internal/url'); + const kHandle = Symbol('kHandle'); const kDetail = Symbol('kDetail'); @@ -74,7 +76,7 @@ class SocketAddress { validatePort(port, 'options.port'); validateUint32(flowlabel, 'options.flowlabel', false); - this[kHandle] = new _SocketAddress(address, port, type, flowlabel); + this[kHandle] = new _SocketAddress(address, port | 0, type, flowlabel | 0); this[kDetail] = this[kHandle].detail({ address: undefined, port: undefined, @@ -138,6 +140,36 @@ class SocketAddress { flowlabel: this.flowlabel, }; } + + /** + * Parse an "${ip}:${port}" formatted string into a SocketAddress. + * Returns undefined if the input cannot be successfully parsed. + * @param {string} input + * @returns {SocketAddress|undefined} + */ + static parse(input) { + validateString(input, 'input'); + // While URL.parse is not expected to throw, there are several + // other pieces here that do... the destucturing, the SocketAddress + // constructor, etc. So we wrap this in a try/catch to be safe. + try { + const { + hostname: address, + port, + } = URL.parse(`http://${input}`); + if (address.startsWith('[') && address.endsWith(']')) { + return new SocketAddress({ + address: address.slice(1, -1), + port: port | 0, + family: 'ipv6', + }); + } + return new SocketAddress({ address, port: port | 0 }); + } catch { + // Ignore errors here. Return undefined if the input cannot + // be successfully parsed or is not a proper socket address. + } + } } class InternalSocketAddress { diff --git a/lib/internal/source_map/prepare_stack_trace.js b/lib/internal/source_map/prepare_stack_trace.js index 60c9d1ed3316ff..3e4b0825e7b3a5 100644 --- a/lib/internal/source_map/prepare_stack_trace.js +++ b/lib/internal/source_map/prepare_stack_trace.js @@ -53,9 +53,15 @@ function prepareStackTraceWithSourceMaps(error, trace) { const sm = fileName === lastFileName ? lastSourceMap : findSourceMap(fileName); - lastSourceMap = sm; - lastFileName = fileName; + // Only when a source map is found, cache it for the next iteration. + // This is a performance optimization to avoid interleaving with JS builtin function + // invalidating the cache. + // - at myFunc (file:///path/to/file.js:1:2) + // - at Array.map () + // - at myFunc (file:///path/to/file.js:3:4) if (sm) { + lastSourceMap = sm; + lastFileName = fileName; return `${kStackLineAt}${serializeJSStackFrame(sm, callSite, trace[i + 1])}`; } } catch (err) { diff --git a/lib/internal/source_map/source_map_cache.js b/lib/internal/source_map/source_map_cache.js index dfb42f83f6f1b1..aaca27136e66a0 100644 --- a/lib/internal/source_map/source_map_cache.js +++ b/lib/internal/source_map/source_map_cache.js @@ -155,6 +155,9 @@ function maybeCacheSourceMap(filename, content, moduleInstance, isGeneratedSourc } const data = dataFromUrl(filename, sourceMapURL); + // `data` could be null if the source map is invalid. + // In this case, create a cache entry with null data with source url for test coverage. + const entry = { __proto__: null, lineLengths: lineLengths(content), @@ -277,6 +280,8 @@ function sourceMapFromDataUrl(sourceURL, url) { const parsedData = JSONParse(decodedData); return sourcesToAbsolute(sourceURL, parsedData); } catch (err) { + // TODO(legendecas): warn about invalid source map JSON string. + // But it could be verbose. debug(err); return null; } @@ -331,24 +336,43 @@ function sourceMapCacheToObject() { /** * Find a source map for a given actual source URL or path. + * + * This function may be invoked from user code or test runner, this must not throw + * any exceptions. * @param {string} sourceURL - actual source URL or path * @returns {import('internal/source_map/source_map').SourceMap | undefined} a source map or undefined if not found */ function findSourceMap(sourceURL) { - if (RegExpPrototypeExec(kLeadingProtocol, sourceURL) === null) { - sourceURL = pathToFileURL(sourceURL).href; + if (typeof sourceURL !== 'string') { + return undefined; } - SourceMap ??= require('internal/source_map/source_map').SourceMap; - const entry = getModuleSourceMapCache().get(sourceURL) ?? generatedSourceMapCache.get(sourceURL); - if (entry === undefined) { + + // No source maps for builtin modules. + if (sourceURL.startsWith('node:')) { return undefined; } - let sourceMap = entry.sourceMap; - if (sourceMap === undefined) { - sourceMap = new SourceMap(entry.data, { lineLengths: entry.lineLengths }); - entry.sourceMap = sourceMap; + + SourceMap ??= require('internal/source_map/source_map').SourceMap; + try { + if (RegExpPrototypeExec(kLeadingProtocol, sourceURL) === null) { + // If the sourceURL is an invalid path, this will throw an error. + sourceURL = pathToFileURL(sourceURL).href; + } + const entry = getModuleSourceMapCache().get(sourceURL) ?? generatedSourceMapCache.get(sourceURL); + if (entry?.data == null) { + return undefined; + } + + let sourceMap = entry.sourceMap; + if (sourceMap === undefined) { + sourceMap = new SourceMap(entry.data, { lineLengths: entry.lineLengths }); + entry.sourceMap = sourceMap; + } + return sourceMap; + } catch (err) { + debug(err); + return undefined; } - return sourceMap; } module.exports = { diff --git a/lib/internal/streams/readable.js b/lib/internal/streams/readable.js index 26ff5ec17c6f0c..ca8b4bcc851684 100644 --- a/lib/internal/streams/readable.js +++ b/lib/internal/streams/readable.js @@ -1004,10 +1004,15 @@ Readable.prototype.pipe = function(dest, pipeOpts) { src.on('data', ondata); function ondata(chunk) { debug('ondata'); - const ret = dest.write(chunk); - debug('dest.write', ret); - if (ret === false) { - pause(); + try { + const ret = dest.write(chunk); + debug('dest.write', ret); + + if (ret === false) { + pause(); + } + } catch (error) { + dest.destroy(error); } } diff --git a/lib/internal/test_runner/assert.js b/lib/internal/test_runner/assert.js new file mode 100644 index 00000000000000..776c1e25cbfb61 --- /dev/null +++ b/lib/internal/test_runner/assert.js @@ -0,0 +1,50 @@ +'use strict'; +const { + SafeMap, +} = primordials; +const { + validateFunction, + validateString, +} = require('internal/validators'); +const assert = require('assert'); +const methodsToCopy = [ + 'deepEqual', + 'deepStrictEqual', + 'doesNotMatch', + 'doesNotReject', + 'doesNotThrow', + 'equal', + 'fail', + 'ifError', + 'match', + 'notDeepEqual', + 'notDeepStrictEqual', + 'notEqual', + 'notStrictEqual', + 'partialDeepStrictEqual', + 'rejects', + 'strictEqual', + 'throws', +]; +let assertMap; + +function getAssertionMap() { + if (assertMap === undefined) { + assertMap = new SafeMap(); + + for (let i = 0; i < methodsToCopy.length; i++) { + assertMap.set(methodsToCopy[i], assert[methodsToCopy[i]]); + } + } + + return assertMap; +} + +function register(name, fn) { + validateString(name, 'name'); + validateFunction(fn, 'fn'); + const map = getAssertionMap(); + map.set(name, fn); +} + +module.exports = { getAssertionMap, register }; diff --git a/lib/internal/test_runner/coverage.js b/lib/internal/test_runner/coverage.js index c27b34b9c762c4..42fa2b87b778f1 100644 --- a/lib/internal/test_runner/coverage.js +++ b/lib/internal/test_runner/coverage.js @@ -27,7 +27,7 @@ const { } = require('fs'); const { setupCoverageHooks } = require('internal/util'); const { tmpdir } = require('os'); -const { join, resolve, relative, matchesGlob } = require('path'); +const { join, resolve, relative } = require('path'); const { fileURLToPath } = require('internal/url'); const { kMappings, SourceMap } = require('internal/source_map/source_map'); const { @@ -36,6 +36,8 @@ const { ERR_SOURCE_MAP_MISSING_SOURCE, }, } = require('internal/errors'); +const { matchGlobPattern } = require('internal/fs/glob'); + const kCoverageFileRegex = /^coverage-(\d+)-(\d{13})-(\d+)\.json$/; const kIgnoreRegex = /\/\* node:coverage ignore next (?\d+ )?\*\//; const kLineEndingRegex = /\r?\n$/u; @@ -464,19 +466,24 @@ class TestCoverage { coverageExcludeGlobs: excludeGlobs, coverageIncludeGlobs: includeGlobs, } = this.options; + // This check filters out files that match the exclude globs. if (excludeGlobs?.length > 0) { for (let i = 0; i < excludeGlobs.length; ++i) { - if (matchesGlob(relativePath, excludeGlobs[i]) || - matchesGlob(absolutePath, excludeGlobs[i])) return true; + if ( + matchGlobPattern(relativePath, excludeGlobs[i]) || + matchGlobPattern(absolutePath, excludeGlobs[i]) + ) return true; } } // This check filters out files that do not match the include globs. if (includeGlobs?.length > 0) { for (let i = 0; i < includeGlobs.length; ++i) { - if (matchesGlob(relativePath, includeGlobs[i]) || - matchesGlob(absolutePath, includeGlobs[i])) return false; + if ( + matchGlobPattern(relativePath, includeGlobs[i]) || + matchGlobPattern(absolutePath, includeGlobs[i]) + ) return false; } return true; } diff --git a/lib/internal/test_runner/runner.js b/lib/internal/test_runner/runner.js index 0ba40d7ba7f71f..43a62b5b4307e4 100644 --- a/lib/internal/test_runner/runner.js +++ b/lib/internal/test_runner/runner.js @@ -17,7 +17,6 @@ const { ArrayPrototypeSort, ObjectAssign, PromisePrototypeThen, - PromiseResolve, PromiseWithResolvers, SafeMap, SafePromiseAll, @@ -801,9 +800,17 @@ function run(options = kEmptyObject) { } } - const setupPromise = PromiseResolve(setup?.(root.reporter)); - PromisePrototypeThen(PromisePrototypeThen(PromisePrototypeThen(setupPromise, runFiles), postRun), teardown); + const runChain = async () => { + if (typeof setup === 'function') { + await setup(root.reporter); + } + + await runFiles(); + postRun?.(); + teardown?.(); + }; + runChain(); return root.reporter; } diff --git a/lib/internal/test_runner/snapshot.js b/lib/internal/test_runner/snapshot.js index 7e41a0bf76f0cd..e6fcd71552c939 100644 --- a/lib/internal/test_runner/snapshot.js +++ b/lib/internal/test_runner/snapshot.js @@ -15,7 +15,7 @@ const { ERR_INVALID_STATE, }, } = require('internal/errors'); -const { emitExperimentalWarning, kEmptyObject } = require('internal/util'); +const { kEmptyObject } = require('internal/util'); let debug = require('internal/util/debuglog').debuglog('test_runner', (fn) => { debug = fn; }); @@ -28,7 +28,6 @@ const { strictEqual } = require('assert'); const { mkdirSync, readFileSync, writeFileSync } = require('fs'); const { dirname } = require('path'); const { createContext, runInContext } = require('vm'); -const kExperimentalWarning = 'Snapshot testing'; const kMissingSnapshotTip = 'Missing snapshots can be generated by rerunning ' + 'the command with the --test-update-snapshots flag.'; const defaultSerializers = [ @@ -47,13 +46,11 @@ let resolveSnapshotPathFn = defaultResolveSnapshotPath; let serializerFns = defaultSerializers; function setResolveSnapshotPath(fn) { - emitExperimentalWarning(kExperimentalWarning); validateFunction(fn, 'fn'); resolveSnapshotPathFn = fn; } function setDefaultSnapshotSerializers(serializers) { - emitExperimentalWarning(kExperimentalWarning); validateFunctionArray(serializers, 'serializers'); serializerFns = ArrayPrototypeSlice(serializers); } @@ -207,7 +204,6 @@ class SnapshotManager { const manager = this; return function snapshotAssertion(actual, options = kEmptyObject) { - emitExperimentalWarning(kExperimentalWarning); validateObject(options, 'options'); const { serializers = serializerFns, diff --git a/lib/internal/test_runner/test.js b/lib/internal/test_runner/test.js index b679410c5561e5..fdf875ceae81b7 100644 --- a/lib/internal/test_runner/test.js +++ b/lib/internal/test_runner/test.js @@ -2,7 +2,6 @@ const { ArrayPrototypePush, ArrayPrototypePushApply, - ArrayPrototypeReduce, ArrayPrototypeShift, ArrayPrototypeSlice, ArrayPrototypeSome, @@ -24,7 +23,6 @@ const { SafeMap, SafePromiseAll, SafePromiseAllReturnVoid, - SafePromisePrototypeFinally, SafePromiseRace, SafeSet, StringPrototypeStartsWith, @@ -102,33 +100,12 @@ function lazyFindSourceMap(file) { function lazyAssertObject(harness) { if (assertObj === undefined) { - assertObj = new SafeMap(); - const assert = require('assert'); - const methodsToCopy = [ - 'deepEqual', - 'deepStrictEqual', - 'doesNotMatch', - 'doesNotReject', - 'doesNotThrow', - 'equal', - 'fail', - 'ifError', - 'match', - 'notDeepEqual', - 'notDeepStrictEqual', - 'notEqual', - 'notStrictEqual', - 'rejects', - 'strictEqual', - 'throws', - ]; - for (let i = 0; i < methodsToCopy.length; i++) { - assertObj.set(methodsToCopy[i], assert[methodsToCopy[i]]); - } + const { getAssertionMap } = require('internal/test_runner/assert'); - const { getOptionValue } = require('internal/options'); - if (getOptionValue('--experimental-test-snapshots')) { + assertObj = getAssertionMap(); + if (!assertObj.has('snapshot')) { const { SnapshotManager } = require('internal/test_runner/snapshot'); + harness.snapshotManager = new SnapshotManager(harness.config.updateSnapshots); assertObj.set('snapshot', harness.snapshotManager.createAssert()); } @@ -268,15 +245,18 @@ class TestContext { }; }); - // This is a hack. It allows the innerOk function to collect the stacktrace from the correct starting point. - function ok(...args) { - if (plan !== null) { - plan.actual++; + if (!map.has('ok')) { + // This is a hack. It allows the innerOk function to collect the + // stacktrace from the correct starting point. + function ok(...args) { + if (plan !== null) { + plan.actual++; + } + innerOk(ok, args.length, ...args); } - innerOk(ok, args.length, ...args); - } - assert.ok = ok; + assert.ok = ok; + } } return this.#assert; } @@ -383,6 +363,7 @@ class SuiteContext { } class Test extends AsyncResource { + reportedType = 'test'; abortController; outerSignal; #reportedSubtest; @@ -629,7 +610,7 @@ class Test extends AsyncResource { while (this.pendingSubtests.length > 0 && this.hasConcurrency()) { const deferred = ArrayPrototypeShift(this.pendingSubtests); const test = deferred.test; - test.reporter.dequeue(test.nesting, test.loc, test.name); + test.reporter.dequeue(test.nesting, test.loc, test.name, this.reportedType); await test.run(); deferred.resolve(); } @@ -820,7 +801,7 @@ class Test extends AsyncResource { // If there is enough available concurrency to run the test now, then do // it. Otherwise, return a Promise to the caller and mark the test as // pending for later execution. - this.reporter.enqueue(this.nesting, this.loc, this.name); + this.reporter.enqueue(this.nesting, this.loc, this.name, this.reportedType); if (this.root.harness.buildPromise || !this.parent.hasConcurrency()) { const deferred = PromiseWithResolvers(); @@ -829,7 +810,7 @@ class Test extends AsyncResource { return deferred.promise; } - this.reporter.dequeue(this.nesting, this.loc, this.name); + this.reporter.dequeue(this.nesting, this.loc, this.name, this.reportedType); return this.run(); } @@ -848,13 +829,14 @@ class Test extends AsyncResource { async runHook(hook, args) { validateOneOf(hook, 'hook name', kHookNames); try { - await ArrayPrototypeReduce(this.hooks[hook], async (prev, hook) => { - await prev; + const hooks = this.hooks[hook]; + for (let i = 0; i < hooks.length; ++i) { + const hook = hooks[i]; await hook.run(args); if (hook.error) { throw hook.error; } - }, PromiseResolve()); + } } catch (err) { const error = new ERR_TEST_FAILURE(`failed running ${hook} hook`, kHookFailure); error.cause = isTestFailureError(err) ? err.cause : err; @@ -1198,6 +1180,7 @@ class Test extends AsyncResource { } class TestHook extends Test { + reportedType = 'hook'; #args; constructor(fn, options) { const { hookType, loc, parent, timeout, signal } = options; @@ -1261,27 +1244,20 @@ class Suite extends Test { this.skipped = false; } + this.buildSuite = this.createBuild(); + this.fn = noop; + } + + async createBuild() { try { const { ctx, args } = this.getRunArgs(); const runArgs = [this.fn, ctx]; ArrayPrototypePushApply(runArgs, args); - this.buildSuite = SafePromisePrototypeFinally( - PromisePrototypeThen( - PromiseResolve(ReflectApply(this.runInAsyncScope, this, runArgs)), - undefined, - (err) => { - this.fail(new ERR_TEST_FAILURE(err, kTestCodeFailure)); - }), - () => this.postBuild(), - ); + await ReflectApply(this.runInAsyncScope, this, runArgs); } catch (err) { this.fail(new ERR_TEST_FAILURE(err, kTestCodeFailure)); - this.postBuild(); } - this.fn = noop; - } - postBuild() { this.buildPhaseFinished = true; } diff --git a/lib/internal/test_runner/tests_stream.js b/lib/internal/test_runner/tests_stream.js index ecbc407e01f318..2fda1e68069c19 100644 --- a/lib/internal/test_runner/tests_stream.js +++ b/lib/internal/test_runner/tests_stream.js @@ -87,20 +87,22 @@ class TestsStream extends Readable { return { __proto__: null, todo: reason ?? true }; } - enqueue(nesting, loc, name) { + enqueue(nesting, loc, name, type) { this[kEmitMessage]('test:enqueue', { __proto__: null, nesting, name, + type, ...loc, }); } - dequeue(nesting, loc, name) { + dequeue(nesting, loc, name, type) { this[kEmitMessage]('test:dequeue', { __proto__: null, nesting, name, + type, ...loc, }); } diff --git a/lib/internal/test_runner/utils.js b/lib/internal/test_runner/utils.js index 243b648795a7ef..8e0a920ea7756f 100644 --- a/lib/internal/test_runner/utils.js +++ b/lib/internal/test_runner/utils.js @@ -241,7 +241,7 @@ function parseCommandLine() { } if (isTestRunner) { - isolation = getOptionValue('--experimental-test-isolation'); + isolation = getOptionValue('--test-isolation'); timeout = getOptionValue('--test-timeout') || Infinity; if (isolation === 'none') { @@ -287,6 +287,11 @@ function parseCommandLine() { if (coverage) { coverageExcludeGlobs = getOptionValue('--test-coverage-exclude'); + if (!coverageExcludeGlobs || coverageExcludeGlobs.length === 0) { + // TODO(pmarchini): this default should follow something similar to c8 defaults + // Default exclusions should be also exported to be used by other tools / users + coverageExcludeGlobs = [kDefaultPattern]; + } coverageIncludeGlobs = getOptionValue('--test-coverage-include'); branchCoverage = getOptionValue('--test-coverage-branches'); diff --git a/lib/internal/url.js b/lib/internal/url.js index 14b0ef61d2f91c..f6e58e196860fc 100644 --- a/lib/internal/url.js +++ b/lib/internal/url.js @@ -1512,32 +1512,35 @@ function fileURLToPath(path, options = kEmptyObject) { function pathToFileURL(filepath, options = kEmptyObject) { const windows = options?.windows ?? isWindows; - if (windows && StringPrototypeStartsWith(filepath, '\\\\')) { + const isUNC = windows && StringPrototypeStartsWith(filepath, '\\\\'); + let resolved = isUNC ? + filepath : + (windows ? path.win32.resolve(filepath) : path.posix.resolve(filepath)); + if (isUNC || (windows && StringPrototypeStartsWith(resolved, '\\\\'))) { // UNC path format: \\server\share\resource // Handle extended UNC path and standard UNC path // "\\?\UNC\" path prefix should be ignored. // Ref: https://learn.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation - const isExtendedUNC = StringPrototypeStartsWith(filepath, '\\\\?\\UNC\\'); + const isExtendedUNC = StringPrototypeStartsWith(resolved, '\\\\?\\UNC\\'); const prefixLength = isExtendedUNC ? 8 : 2; - const hostnameEndIndex = StringPrototypeIndexOf(filepath, '\\', prefixLength); + const hostnameEndIndex = StringPrototypeIndexOf(resolved, '\\', prefixLength); if (hostnameEndIndex === -1) { throw new ERR_INVALID_ARG_VALUE( 'path', - filepath, + resolved, 'Missing UNC resource path', ); } if (hostnameEndIndex === 2) { throw new ERR_INVALID_ARG_VALUE( 'path', - filepath, + resolved, 'Empty UNC servername', ); } - const hostname = StringPrototypeSlice(filepath, prefixLength, hostnameEndIndex); - return new URL(StringPrototypeSlice(filepath, hostnameEndIndex), hostname, kCreateURLFromWindowsPathSymbol); + const hostname = StringPrototypeSlice(resolved, prefixLength, hostnameEndIndex); + return new URL(StringPrototypeSlice(resolved, hostnameEndIndex), hostname, kCreateURLFromWindowsPathSymbol); } - let resolved = windows ? path.win32.resolve(filepath) : path.posix.resolve(filepath); // path.resolve strips trailing slashes so we must add them back const filePathLast = StringPrototypeCharCodeAt(filepath, filepath.length - 1); diff --git a/lib/internal/util/colors.js b/lib/internal/util/colors.js index 812048c923bee7..0b37694b513fb0 100644 --- a/lib/internal/util/colors.js +++ b/lib/internal/util/colors.js @@ -24,16 +24,27 @@ module.exports = { stream.getColorDepth() > 2 : true); }, refresh() { - const hasColors = module.exports.shouldColorize(process.stderr); - module.exports.blue = hasColors ? '\u001b[34m' : ''; - module.exports.green = hasColors ? '\u001b[32m' : ''; - module.exports.white = hasColors ? '\u001b[39m' : ''; - module.exports.yellow = hasColors ? '\u001b[33m' : ''; - module.exports.red = hasColors ? '\u001b[31m' : ''; - module.exports.gray = hasColors ? '\u001b[90m' : ''; - module.exports.clear = hasColors ? '\u001bc' : ''; - module.exports.reset = hasColors ? '\u001b[0m' : ''; - module.exports.hasColors = hasColors; + if (module.exports.shouldColorize(process.stderr)) { + module.exports.blue = '\u001b[34m'; + module.exports.green = '\u001b[32m'; + module.exports.white = '\u001b[39m'; + module.exports.yellow = '\u001b[33m'; + module.exports.red = '\u001b[31m'; + module.exports.gray = '\u001b[90m'; + module.exports.clear = '\u001bc'; + module.exports.reset = '\u001b[0m'; + module.exports.hasColors = true; + } else { + module.exports.blue = ''; + module.exports.green = ''; + module.exports.white = ''; + module.exports.yellow = ''; + module.exports.red = ''; + module.exports.gray = ''; + module.exports.clear = ''; + module.exports.reset = ''; + module.exports.hasColors = false; + } }, }; diff --git a/lib/internal/util/debuglog.js b/lib/internal/util/debuglog.js index 271c9d1497d88f..96b10c4bbac767 100644 --- a/lib/internal/util/debuglog.js +++ b/lib/internal/util/debuglog.js @@ -173,7 +173,7 @@ function formatTime(ms) { } function safeTraceLabel(label) { - return label.replace(/\\/g, '\\\\').replaceAll('"', '\\"'); + return label.replaceAll('\\', '\\\\').replaceAll('"', '\\"'); } /** diff --git a/lib/internal/util/inspect.js b/lib/internal/util/inspect.js index c1eac52336f18e..cc76bbeed9bc11 100644 --- a/lib/internal/util/inspect.js +++ b/lib/internal/util/inspect.js @@ -2,7 +2,10 @@ const { Array, + ArrayBuffer, + ArrayBufferPrototype, ArrayIsArray, + ArrayPrototype, ArrayPrototypeFilter, ArrayPrototypeForEach, ArrayPrototypeIncludes, @@ -22,10 +25,15 @@ const { DatePrototypeToISOString, DatePrototypeToString, ErrorPrototypeToString, + Function, + FunctionPrototype, FunctionPrototypeBind, FunctionPrototypeCall, + FunctionPrototypeSymbolHasInstance, FunctionPrototypeToString, JSONStringify, + Map, + MapPrototype, MapPrototypeEntries, MapPrototypeGetSize, MathFloor, @@ -50,6 +58,7 @@ const { ObjectGetPrototypeOf, ObjectIs, ObjectKeys, + ObjectPrototype, ObjectPrototypeHasOwnProperty, ObjectPrototypePropertyIsEnumerable, ObjectSeal, @@ -64,6 +73,8 @@ const { SafeMap, SafeSet, SafeStringIterator, + Set, + SetPrototype, SetPrototypeGetSize, SetPrototypeValues, String, @@ -89,6 +100,8 @@ const { SymbolPrototypeValueOf, SymbolToPrimitive, SymbolToStringTag, + TypedArray, + TypedArrayPrototype, TypedArrayPrototypeGetLength, TypedArrayPrototypeGetSymbolToStringTag, Uint8Array, @@ -593,10 +606,31 @@ function isInstanceof(object, proto) { } } +// Special-case for some builtin prototypes in case their `constructor` property has been tampered. +const wellKnownPrototypes = new SafeMap(); +wellKnownPrototypes.set(ArrayPrototype, { name: 'Array', constructor: Array }); +wellKnownPrototypes.set(ArrayBufferPrototype, { name: 'ArrayBuffer', constructor: ArrayBuffer }); +wellKnownPrototypes.set(FunctionPrototype, { name: 'Function', constructor: Function }); +wellKnownPrototypes.set(MapPrototype, { name: 'Map', constructor: Map }); +wellKnownPrototypes.set(ObjectPrototype, { name: 'Object', constructor: Object }); +wellKnownPrototypes.set(SetPrototype, { name: 'Set', constructor: Set }); +wellKnownPrototypes.set(TypedArrayPrototype, { name: 'TypedArray', constructor: TypedArray }); + function getConstructorName(obj, ctx, recurseTimes, protoProps) { let firstProto; const tmp = obj; while (obj || isUndetectableObject(obj)) { + const wellKnownPrototypeNameAndConstructor = wellKnownPrototypes.get(obj); + if (wellKnownPrototypeNameAndConstructor != null) { + const { name, constructor } = wellKnownPrototypeNameAndConstructor; + if (FunctionPrototypeSymbolHasInstance(constructor, tmp)) { + if (protoProps !== undefined && firstProto !== obj) { + addPrototypeProperties( + ctx, tmp, firstProto || tmp, recurseTimes, protoProps); + } + return name; + } + } const descriptor = ObjectGetOwnPropertyDescriptor(obj, 'constructor'); if (descriptor !== undefined && typeof descriptor.value === 'function' && @@ -805,12 +839,12 @@ function formatValue(ctx, value, recurseTimes, typedArray) { // Filter out the util module, its inspect function is special. maybeCustom !== inspect && // Also filter out any prototype objects using the circular check. - !(value.constructor && value.constructor.prototype === value)) { + ObjectGetOwnPropertyDescriptor(value, 'constructor')?.value?.prototype !== value) { // This makes sure the recurseTimes are reported as before while using // a counter internally. const depth = ctx.depth === null ? null : ctx.depth - recurseTimes; const isCrossContext = - proxy !== undefined || !(context instanceof Object); + proxy !== undefined || !FunctionPrototypeSymbolHasInstance(Object, context); const ret = FunctionPrototypeCall( maybeCustom, context, @@ -954,7 +988,11 @@ function formatRaw(ctx, value, recurseTimes, typedArray) { if (noIterator) { keys = getKeys(value, ctx.showHidden); braces = ['{', '}']; - if (constructor === 'Object') { + if (typeof value === 'function') { + base = getFunctionBase(value, constructor, tag); + if (keys.length === 0 && protoProps === undefined) + return ctx.stylize(base, 'special'); + } else if (constructor === 'Object') { if (isArgumentsObject(value)) { braces[0] = '[Arguments] {'; } else if (tag !== '') { @@ -963,10 +1001,6 @@ function formatRaw(ctx, value, recurseTimes, typedArray) { if (keys.length === 0 && protoProps === undefined) { return `${braces[0]}}`; } - } else if (typeof value === 'function') { - base = getFunctionBase(value, constructor, tag); - if (keys.length === 0 && protoProps === undefined) - return ctx.stylize(base, 'special'); } else if (isRegExp(value)) { // Make RegExps say that they are RegExps base = RegExpPrototypeToString( diff --git a/lib/internal/webstreams/readablestream.js b/lib/internal/webstreams/readablestream.js index 2369175733c115..8d884c43c2f9c3 100644 --- a/lib/internal/webstreams/readablestream.js +++ b/lib/internal/webstreams/readablestream.js @@ -94,6 +94,7 @@ const { ArrayBufferViewGetByteLength, ArrayBufferViewGetByteOffset, AsyncIterator, + canCopyArrayBuffer, cloneAsUint8Array, copyArrayBuffer, createPromiseCallback, @@ -2552,6 +2553,15 @@ function readableByteStreamControllerCommitPullIntoDescriptor(stream, desc) { } } +function readableByteStreamControllerCommitPullIntoDescriptors(stream, descriptors) { + for (let i = 0; i < descriptors.length; ++i) { + readableByteStreamControllerCommitPullIntoDescriptor( + stream, + descriptors[i], + ); + } +} + function readableByteStreamControllerInvalidateBYOBRequest(controller) { if (controller[kState].byobRequest === null) return; @@ -2758,11 +2768,11 @@ function readableByteStreamControllerRespondInClosedState(controller, desc) { stream, } = controller[kState]; if (readableStreamHasBYOBReader(stream)) { - while (readableStreamGetNumReadIntoRequests(stream) > 0) { - readableByteStreamControllerCommitPullIntoDescriptor( - stream, - readableByteStreamControllerShiftPendingPullInto(controller)); + const filledPullIntos = []; + for (let i = 0; i < readableStreamGetNumReadIntoRequests(stream); ++i) { + ArrayPrototypePush(filledPullIntos, readableByteStreamControllerShiftPendingPullInto(controller)); } + readableByteStreamControllerCommitPullIntoDescriptors(stream, filledPullIntos); } } @@ -2843,8 +2853,9 @@ function readableByteStreamControllerEnqueue(controller, chunk) { transferredBuffer, byteOffset, byteLength); - readableByteStreamControllerProcessPullIntoDescriptorsUsingQueue( + const filledPullIntos = readableByteStreamControllerProcessPullIntoDescriptorsUsingQueue( controller); + readableByteStreamControllerCommitPullIntoDescriptors(stream, filledPullIntos); } else { assert(!isReadableStreamLocked(stream)); readableByteStreamControllerEnqueueChunkToQueue( @@ -2937,6 +2948,7 @@ function readableByteStreamControllerFillPullIntoDescriptorFromQueue( const maxAlignedBytes = maxBytesFilled - (maxBytesFilled % elementSize); let totalBytesToCopyRemaining = maxBytesToCopy; let ready = false; + assert(!ArrayBufferPrototypeGetDetached(buffer)); assert(bytesFilled < minimumFill); if (maxAlignedBytes >= minimumFill) { totalBytesToCopyRemaining = maxAlignedBytes - bytesFilled; @@ -2952,12 +2964,12 @@ function readableByteStreamControllerFillPullIntoDescriptorFromQueue( totalBytesToCopyRemaining, headOfQueue.byteLength); const destStart = byteOffset + desc.bytesFilled; - const arrayBufferByteLength = ArrayBufferPrototypeGetByteLength(buffer); - if (arrayBufferByteLength - destStart < bytesToCopy) { - throw new ERR_INVALID_STATE.RangeError( - 'view ArrayBuffer size is invalid'); - } - assert(arrayBufferByteLength - destStart >= bytesToCopy); + assert(canCopyArrayBuffer( + buffer, + destStart, + headOfQueue.buffer, + headOfQueue.byteOffset, + bytesToCopy)); copyArrayBuffer( buffer, destStart, @@ -2991,26 +3003,30 @@ function readableByteStreamControllerProcessPullIntoDescriptorsUsingQueue( const { closeRequested, pendingPullIntos, - stream, } = controller[kState]; assert(!closeRequested); + const filledPullIntos = []; while (pendingPullIntos.length) { if (!controller[kState].queueTotalSize) - return; + break; const desc = pendingPullIntos[0]; if (readableByteStreamControllerFillPullIntoDescriptorFromQueue( controller, desc)) { readableByteStreamControllerShiftPendingPullInto(controller); - readableByteStreamControllerCommitPullIntoDescriptor(stream, desc); + ArrayPrototypePush(filledPullIntos, desc); } } + return filledPullIntos; } function readableByteStreamControllerRespondInReadableState( controller, bytesWritten, desc) { + const { + stream, + } = controller[kState]; const { buffer, bytesFilled, @@ -3031,9 +3047,10 @@ function readableByteStreamControllerRespondInReadableState( controller, desc, ); - readableByteStreamControllerProcessPullIntoDescriptorsUsingQueue( + const filledPullIntos = readableByteStreamControllerProcessPullIntoDescriptorsUsingQueue( controller, ); + readableByteStreamControllerCommitPullIntoDescriptors(stream, filledPullIntos); return; } @@ -3059,10 +3076,10 @@ function readableByteStreamControllerRespondInReadableState( ArrayBufferPrototypeGetByteLength(remainder)); } desc.bytesFilled -= remainderSize; - readableByteStreamControllerCommitPullIntoDescriptor( - controller[kState].stream, - desc); - readableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller); + const filledPullIntos = readableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller); + + readableByteStreamControllerCommitPullIntoDescriptor(stream, desc); + readableByteStreamControllerCommitPullIntoDescriptors(stream, filledPullIntos); } function readableByteStreamControllerRespondWithNewView(controller, view) { diff --git a/lib/internal/webstreams/util.js b/lib/internal/webstreams/util.js index 2c70ef7acdfe66..5bf016f73b7af5 100644 --- a/lib/internal/webstreams/util.js +++ b/lib/internal/webstreams/util.js @@ -1,6 +1,8 @@ 'use strict'; const { + ArrayBufferPrototypeGetByteLength, + ArrayBufferPrototypeGetDetached, ArrayBufferPrototypeSlice, ArrayPrototypePush, ArrayPrototypeShift, @@ -107,6 +109,14 @@ function cloneAsUint8Array(view) { ); } +function canCopyArrayBuffer(toBuffer, toIndex, fromBuffer, fromIndex, count) { + return toBuffer !== fromBuffer && + !ArrayBufferPrototypeGetDetached(toBuffer) && + !ArrayBufferPrototypeGetDetached(fromBuffer) && + toIndex + count <= ArrayBufferPrototypeGetByteLength(toBuffer) && + fromIndex + count <= ArrayBufferPrototypeGetByteLength(fromBuffer); +} + function isBrandCheck(brand) { return (value) => { return value != null && @@ -261,6 +271,7 @@ module.exports = { ArrayBufferViewGetByteLength, ArrayBufferViewGetByteOffset, AsyncIterator, + canCopyArrayBuffer, createPromiseCallback, cloneAsUint8Array, copyArrayBuffer, diff --git a/lib/internal/webstreams/writablestream.js b/lib/internal/webstreams/writablestream.js index 5baaf20c30ba26..03b48dd043bc41 100644 --- a/lib/internal/webstreams/writablestream.js +++ b/lib/internal/webstreams/writablestream.js @@ -1176,9 +1176,18 @@ function writableStreamDefaultControllerGetDesiredSize(controller) { } function writableStreamDefaultControllerGetChunkSize(controller, chunk) { + const { + stream, + sizeAlgorithm, + } = controller[kState]; + if (sizeAlgorithm === undefined) { + assert(stream[kState].state === 'errored' || stream[kState].state === 'erroring'); + return 1; + } + try { return FunctionPrototypeCall( - controller[kState].sizeAlgorithm, + sizeAlgorithm, undefined, chunk); } catch (error) { diff --git a/lib/net.js b/lib/net.js index 52085df6ba0574..b8c0057bfd1a6c 100644 --- a/lib/net.js +++ b/lib/net.js @@ -105,6 +105,7 @@ const { ERR_INVALID_FD_TYPE, ERR_INVALID_HANDLE_TYPE, ERR_INVALID_IP_ADDRESS, + ERR_IP_BLOCKED, ERR_MISSING_ARGS, ERR_SERVER_ALREADY_LISTEN, ERR_SERVER_NOT_RUNNING, @@ -510,6 +511,12 @@ function Socket(options) { // Used after `.destroy()` this[kBytesRead] = 0; this[kBytesWritten] = 0; + if (options.blockList) { + if (!module.exports.BlockList.isBlockList(options.blockList)) { + throw new ERR_INVALID_ARG_TYPE('options.blockList', 'net.BlockList', options.blockList); + } + this.blockList = options.blockList; + } } ObjectSetPrototypeOf(Socket.prototype, stream.Duplex.prototype); ObjectSetPrototypeOf(Socket, stream.Duplex); @@ -1073,6 +1080,10 @@ function internalConnect( self.emit('connectionAttempt', address, port, addressType); if (addressType === 6 || addressType === 4) { + if (self.blockList?.check(address, `ipv${addressType}`)) { + self.destroy(new ERR_IP_BLOCKED(address)); + return; + } const req = new TCPConnectWrap(); req.oncomplete = afterConnect; req.address = address; @@ -1162,6 +1173,14 @@ function internalConnectMultiple(context, canceled) { } } + if (self.blockList?.check(address, `ipv${addressType}`)) { + const ex = new ERR_IP_BLOCKED(address); + ArrayPrototypePush(context.errors, ex); + self.emit('connectionAttemptFailed', address, port, addressType, ex); + internalConnectMultiple(context); + return; + } + debug('connect/multiple: attempting to connect to %s:%d (addressType: %d)', address, port, addressType); self.emit('connectionAttempt', address, port, addressType); @@ -1791,6 +1810,12 @@ function Server(options, connectionListener) { this.keepAlive = Boolean(options.keepAlive); this.keepAliveInitialDelay = ~~(options.keepAliveInitialDelay / 1000); this.highWaterMark = options.highWaterMark ?? getDefaultHighWaterMark(); + if (options.blockList) { + if (!module.exports.BlockList.isBlockList(options.blockList)) { + throw new ERR_INVALID_ARG_TYPE('options.blockList', 'net.BlockList', options.blockList); + } + this.blockList = options.blockList; + } } ObjectSetPrototypeOf(Server.prototype, EventEmitter.prototype); ObjectSetPrototypeOf(Server, EventEmitter); @@ -2239,7 +2264,15 @@ function onconnection(err, clientHandle) { clientHandle.close(); return; } - + if (self.blockList && typeof clientHandle.getpeername === 'function') { + const remoteInfo = { __proto__: null }; + clientHandle.getpeername(remoteInfo); + const addressType = isIP(remoteInfo.address); + if (addressType && self.blockList.check(remoteInfo.address, `ipv${addressType}`)) { + clientHandle.close(); + return; + } + } const socket = new Socket({ handle: clientHandle, allowHalfOpen: self.allowHalfOpen, diff --git a/lib/path.js b/lib/path.js index 40161c45e2a911..8b9d6d0b6b9621 100644 --- a/lib/path.js +++ b/lib/path.js @@ -52,13 +52,12 @@ const { } = require('internal/validators'); const { - getLazy, emitExperimentalWarning, isWindows, - isMacOS, + getLazy, } = require('internal/util'); -const lazyMinimatch = getLazy(() => require('internal/deps/minimatch/index')); +const lazyMatchGlobPattern = getLazy(() => require('internal/fs/glob').matchGlobPattern); function isPathSeparator(code) { return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH; @@ -164,22 +163,6 @@ function _format(sep, pathObject) { return dir === pathObject.root ? `${dir}${base}` : `${dir}${sep}${base}`; } -function glob(path, pattern, windows) { - emitExperimentalWarning('glob'); - validateString(path, 'path'); - validateString(pattern, 'pattern'); - return lazyMinimatch().minimatch(path, pattern, { - __proto__: null, - nocase: isMacOS || isWindows, - windowsPathsNoEscape: true, - nonegate: true, - nocomment: true, - optimizationLevel: 2, - platform: windows ? 'win32' : 'posix', - nocaseMagicOnly: true, - }); -} - const win32 = { /** * path.resolve([from ...], to) @@ -1140,7 +1123,8 @@ const win32 = { }, matchesGlob(path, pattern) { - return glob(path, pattern, true); + emitExperimentalWarning('glob'); + return lazyMatchGlobPattern()(path, pattern, true); }, sep: '\\', @@ -1616,7 +1600,8 @@ const posix = { }, matchesGlob(path, pattern) { - return glob(path, pattern, false); + emitExperimentalWarning('glob'); + return lazyMatchGlobPattern()(path, pattern, false); }, sep: '/', diff --git a/lib/repl.js b/lib/repl.js index c195ba428ce6c2..fd8b51b9547e8a 100644 --- a/lib/repl.js +++ b/lib/repl.js @@ -131,7 +131,7 @@ const { shouldColorize } = require('internal/util/colors'); const CJSModule = require('internal/modules/cjs/loader').Module; let _builtinLibs = ArrayPrototypeFilter( CJSModule.builtinModules, - (e) => e[0] !== '_', + (e) => e[0] !== '_' && !StringPrototypeStartsWith(e, 'node:'), ); const nodeSchemeBuiltinLibs = ArrayPrototypeMap( _builtinLibs, (lib) => `node:${lib}`); diff --git a/lib/test.js b/lib/test.js index ba72d6e4ecbdbf..d6a313cd0763eb 100644 --- a/lib/test.js +++ b/lib/test.js @@ -7,7 +7,6 @@ const { const { test, suite, before, after, beforeEach, afterEach } = require('internal/test_runner/harness'); const { run } = require('internal/test_runner/runner'); -const { getOptionValue } = require('internal/options'); module.exports = test; ObjectAssign(module.exports, { @@ -39,28 +38,38 @@ ObjectDefineProperty(module.exports, 'mock', { }, }); -if (getOptionValue('--experimental-test-snapshots')) { - let lazySnapshot; +let lazySnapshot; - ObjectDefineProperty(module.exports, 'snapshot', { - __proto__: null, - configurable: true, - enumerable: true, - get() { - if (lazySnapshot === undefined) { - const { - setDefaultSnapshotSerializers, - setResolveSnapshotPath, - } = require('internal/test_runner/snapshot'); +ObjectDefineProperty(module.exports, 'snapshot', { + __proto__: null, + configurable: true, + enumerable: true, + get() { + if (lazySnapshot === undefined) { + const { + setDefaultSnapshotSerializers, + setResolveSnapshotPath, + } = require('internal/test_runner/snapshot'); - lazySnapshot = { - __proto__: null, - setDefaultSnapshotSerializers, - setResolveSnapshotPath, - }; - } + lazySnapshot = { + __proto__: null, + setDefaultSnapshotSerializers, + setResolveSnapshotPath, + }; + } + + return lazySnapshot; + }, +}); - return lazySnapshot; - }, - }); -} +ObjectDefineProperty(module.exports, 'assert', { + __proto__: null, + configurable: true, + enumerable: true, + get() { + const { register } = require('internal/test_runner/assert'); + const assert = { __proto__: null, register }; + ObjectDefineProperty(module.exports, 'assert', assert); + return assert; + }, +}); diff --git a/lib/url.js b/lib/url.js index f4117a89e507e0..31299653610002 100644 --- a/lib/url.js +++ b/lib/url.js @@ -704,7 +704,7 @@ Url.prototype.format = function format() { } } - search = search.replace(/#/g, '%23'); + search = search.replaceAll('#', '%23'); if (hash && hash.charCodeAt(0) !== CHAR_HASH) hash = '#' + hash; diff --git a/lib/v8.js b/lib/v8.js index 7a8979887bab49..e379233ea49e0d 100644 --- a/lib/v8.js +++ b/lib/v8.js @@ -31,6 +31,9 @@ const { Uint32Array, Uint8Array, Uint8ClampedArray, + globalThis: { + Float16Array, + }, } = primordials; const { Buffer } = require('buffer'); @@ -63,6 +66,7 @@ const { } = require('internal/heap_utils'); const promiseHooks = require('internal/promise_hooks'); const { getOptionValue } = require('internal/options'); + /** * Generates a snapshot of the current V8 heap * and writes it to a JSON file. @@ -289,6 +293,7 @@ function arrayBufferViewTypeToIndex(abView) { // Index 10 is FastBuffer. if (type === '[object BigInt64Array]') return 11; if (type === '[object BigUint64Array]') return 12; + if (type === '[object Float16Array]') return 13; return -1; } @@ -306,6 +311,7 @@ function arrayBufferViewIndexToType(index) { if (index === 10) return FastBuffer; if (index === 11) return BigInt64Array; if (index === 12) return BigUint64Array; + if (index === 13) return Float16Array; return undefined; } diff --git a/lib/vm.js b/lib/vm.js index 3eea66b3f07437..ae710806201893 100644 --- a/lib/vm.js +++ b/lib/vm.js @@ -319,6 +319,7 @@ function runInThisContext(code, options) { function compileFunction(code, params, options = kEmptyObject) { validateString(code, 'code'); + validateObject(options, 'options'); if (params !== undefined) { validateStringArray(params, 'params'); } diff --git a/lib/zlib.js b/lib/zlib.js index d79781de481b76..22675651b37105 100644 --- a/lib/zlib.js +++ b/lib/zlib.js @@ -46,6 +46,9 @@ const { genericNodeError, } = require('internal/errors'); const { Transform, finished } = require('stream'); +const { + deprecateInstantiation, +} = require('internal/util'); const { isArrayBufferView, isAnyArrayBuffer, @@ -686,32 +689,36 @@ Zlib.prototype.params = function params(level, strategy, callback) { // generic zlib // minimal 2-byte header function Deflate(opts) { - if (!(this instanceof Deflate)) - return new Deflate(opts); + if (!(this instanceof Deflate)) { + return deprecateInstantiation(Deflate, 'DEP0184', opts); + } ReflectApply(Zlib, this, [opts, DEFLATE]); } ObjectSetPrototypeOf(Deflate.prototype, Zlib.prototype); ObjectSetPrototypeOf(Deflate, Zlib); function Inflate(opts) { - if (!(this instanceof Inflate)) - return new Inflate(opts); + if (!(this instanceof Inflate)) { + return deprecateInstantiation(Inflate, 'DEP0184', opts); + } ReflectApply(Zlib, this, [opts, INFLATE]); } ObjectSetPrototypeOf(Inflate.prototype, Zlib.prototype); ObjectSetPrototypeOf(Inflate, Zlib); function Gzip(opts) { - if (!(this instanceof Gzip)) - return new Gzip(opts); + if (!(this instanceof Gzip)) { + return deprecateInstantiation(Gzip, 'DEP0184', opts); + } ReflectApply(Zlib, this, [opts, GZIP]); } ObjectSetPrototypeOf(Gzip.prototype, Zlib.prototype); ObjectSetPrototypeOf(Gzip, Zlib); function Gunzip(opts) { - if (!(this instanceof Gunzip)) - return new Gunzip(opts); + if (!(this instanceof Gunzip)) { + return deprecateInstantiation(Gunzip, 'DEP0184', opts); + } ReflectApply(Zlib, this, [opts, GUNZIP]); } ObjectSetPrototypeOf(Gunzip.prototype, Zlib.prototype); @@ -719,24 +726,27 @@ ObjectSetPrototypeOf(Gunzip, Zlib); function DeflateRaw(opts) { if (opts && opts.windowBits === 8) opts.windowBits = 9; - if (!(this instanceof DeflateRaw)) - return new DeflateRaw(opts); + if (!(this instanceof DeflateRaw)) { + return deprecateInstantiation(DeflateRaw, 'DEP0184', opts); + } ReflectApply(Zlib, this, [opts, DEFLATERAW]); } ObjectSetPrototypeOf(DeflateRaw.prototype, Zlib.prototype); ObjectSetPrototypeOf(DeflateRaw, Zlib); function InflateRaw(opts) { - if (!(this instanceof InflateRaw)) - return new InflateRaw(opts); + if (!(this instanceof InflateRaw)) { + return deprecateInstantiation(InflateRaw, 'DEP0184', opts); + } ReflectApply(Zlib, this, [opts, INFLATERAW]); } ObjectSetPrototypeOf(InflateRaw.prototype, Zlib.prototype); ObjectSetPrototypeOf(InflateRaw, Zlib); function Unzip(opts) { - if (!(this instanceof Unzip)) - return new Unzip(opts); + if (!(this instanceof Unzip)) { + return deprecateInstantiation(Unzip, 'DEP0184', opts); + } ReflectApply(Zlib, this, [opts, UNZIP]); } ObjectSetPrototypeOf(Unzip.prototype, Zlib.prototype); @@ -801,16 +811,18 @@ ObjectSetPrototypeOf(Brotli.prototype, Zlib.prototype); ObjectSetPrototypeOf(Brotli, Zlib); function BrotliCompress(opts) { - if (!(this instanceof BrotliCompress)) - return new BrotliCompress(opts); + if (!(this instanceof BrotliCompress)) { + return deprecateInstantiation(BrotliCompress, 'DEP0184', opts); + } ReflectApply(Brotli, this, [opts, BROTLI_ENCODE]); } ObjectSetPrototypeOf(BrotliCompress.prototype, Brotli.prototype); ObjectSetPrototypeOf(BrotliCompress, Brotli); function BrotliDecompress(opts) { - if (!(this instanceof BrotliDecompress)) - return new BrotliDecompress(opts); + if (!(this instanceof BrotliDecompress)) { + return deprecateInstantiation(BrotliDecompress, 'DEP0184', opts); + } ReflectApply(Brotli, this, [opts, BROTLI_DECODE]); } ObjectSetPrototypeOf(BrotliDecompress.prototype, Brotli.prototype); diff --git a/node.gni b/node.gni index 057686f0046e5e..a2123cc6c6d21c 100644 --- a/node.gni +++ b/node.gni @@ -7,9 +7,15 @@ declare_args() { # The location of Node.js in source code tree. node_path = "//node" - # The location of V8, use the one from node's deps by default. + # The location of V8 - use the one from node's deps by default. node_v8_path = "$node_path/deps/v8" + # The location of OpenSSL - use the one from node's deps by default. + node_openssl_path = "$node_path/deps/openssl" + + # The location of simdutf - use the one from node's deps by default. + node_simdutf_path = "$node_path/deps/simdutf" + # The NODE_MODULE_VERSION defined in node_version.h. node_module_version = exec_script("$node_path/tools/getmoduleversion.py", [], "value") diff --git a/node.gyp b/node.gyp index f018e0a34d5782..1633ed2d832fc5 100644 --- a/node.gyp +++ b/node.gyp @@ -482,6 +482,7 @@ '-Wno-unused-parameter', '-Werror=undefined-inline', '-Werror=extra-semi', + '-Werror=ctad-maybe-unsupported', ], }, @@ -849,9 +850,6 @@ 'dependencies': [ 'deps/googletest/googletest.gyp:gtest_prod', 'deps/histogram/histogram.gyp:histogram', - 'deps/simdjson/simdjson.gyp:simdjson', - 'deps/simdutf/simdutf.gyp:simdutf', - 'deps/ada/ada.gyp:ada', 'deps/nbytes/nbytes.gyp:nbytes', 'node_js2c#host', ], @@ -1126,7 +1124,6 @@ 'deps/googletest/googletest.gyp:gtest_prod', 'deps/histogram/histogram.gyp:histogram', 'deps/uvwasi/uvwasi.gyp:uvwasi', - 'deps/ada/ada.gyp:ada', 'deps/nbytes/nbytes.gyp:nbytes', ], 'includes': [ @@ -1173,9 +1170,6 @@ 'deps/googletest/googletest.gyp:gtest', 'deps/googletest/googletest.gyp:gtest_main', 'deps/histogram/histogram.gyp:histogram', - 'deps/simdjson/simdjson.gyp:simdjson', - 'deps/simdutf/simdutf.gyp:simdutf', - 'deps/ada/ada.gyp:ada', 'deps/nbytes/nbytes.gyp:nbytes', ], @@ -1253,7 +1247,6 @@ 'dependencies': [ '<(node_lib_target_name)', 'deps/histogram/histogram.gyp:histogram', - 'deps/ada/ada.gyp:ada', 'deps/nbytes/nbytes.gyp:nbytes', ], @@ -1328,9 +1321,6 @@ 'target_name': 'node_js2c', 'type': 'executable', 'toolsets': ['host'], - 'dependencies': [ - 'deps/simdutf/simdutf.gyp:simdutf#host', - ], 'include_dirs': [ 'tools', 'src', @@ -1342,6 +1332,9 @@ 'src/embedded_data.cc', ], 'conditions': [ + [ 'node_shared_simdutf=="false"', { + 'dependencies': [ 'deps/simdutf/simdutf.gyp:simdutf#host' ], + }], [ 'node_shared_libuv=="false"', { 'dependencies': [ 'deps/uv/uv.gyp:libuv#host' ], }], @@ -1367,10 +1360,7 @@ 'dependencies': [ '<(node_lib_target_name)', 'deps/histogram/histogram.gyp:histogram', - 'deps/ada/ada.gyp:ada', 'deps/nbytes/nbytes.gyp:nbytes', - 'deps/simdjson/simdjson.gyp:simdjson', - 'deps/simdutf/simdutf.gyp:simdutf', ], 'includes': [ diff --git a/node.gypi b/node.gypi index 9c989022a9ad36..7ae62bd7e7134a 100644 --- a/node.gypi +++ b/node.gypi @@ -27,7 +27,11 @@ 'conditions': [ [ 'clang==1', { - 'cflags': [ '-Werror=undefined-inline', '-Werror=extra-semi'] + 'cflags': [ + '-Werror=undefined-inline', + '-Werror=extra-semi', + '-Werror=ctad-maybe-unsupported', + ], }], [ '"<(_type)"=="executable"', { 'msvs_settings': { @@ -212,6 +216,18 @@ 'dependencies': [ 'deps/nghttp2/nghttp2.gyp:nghttp2' ], }], + [ 'node_shared_ada=="false"', { + 'dependencies': [ 'deps/ada/ada.gyp:ada' ], + }], + + [ 'node_shared_simdjson=="false"', { + 'dependencies': [ 'deps/simdjson/simdjson.gyp:simdjson' ], + }], + + [ 'node_shared_simdutf=="false"', { + 'dependencies': [ 'deps/simdutf/simdutf.gyp:simdutf' ], + }], + [ 'node_shared_brotli=="false"', { 'dependencies': [ 'deps/brotli/brotli.gyp:brotli' ], }], diff --git a/pyproject.toml b/pyproject.toml index 8e97e3b4446293..03f53aa6bed6bf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,9 +33,7 @@ ignore = [ "E401", "E402", "E7", - "PLC1901", "RUF005", - "RUF100", ] [tool.ruff.lint.mccabe] diff --git a/src/amaro_version.h b/src/amaro_version.h index 0f080e671c120e..b620c6658b1fe2 100644 --- a/src/amaro_version.h +++ b/src/amaro_version.h @@ -2,5 +2,5 @@ // Refer to tools/dep_updaters/update-amaro.sh #ifndef SRC_AMARO_VERSION_H_ #define SRC_AMARO_VERSION_H_ -#define AMARO_VERSION "0.2.0" +#define AMARO_VERSION "0.2.1" #endif // SRC_AMARO_VERSION_H_ diff --git a/src/api/async_resource.cc b/src/api/async_resource.cc index 2ea5d1269875eb..38d53a9aec0e58 100644 --- a/src/api/async_resource.cc +++ b/src/api/async_resource.cc @@ -17,28 +17,23 @@ AsyncResource::AsyncResource(Isolate* isolate, const char* name, async_id trigger_async_id) : env_(Environment::GetCurrent(isolate)), - resource_(isolate, resource) { + resource_(isolate, resource), + context_frame_(isolate, async_context_frame::current(isolate)) { CHECK_NOT_NULL(env_); - env_->SetAsyncResourceContextFrame( - reinterpret_cast(this), - {isolate, async_context_frame::current(isolate)}); async_context_ = EmitAsyncInit(isolate, resource, name, trigger_async_id); } AsyncResource::~AsyncResource() { CHECK_NOT_NULL(env_); EmitAsyncDestroy(env_, async_context_); - env_->RemoveAsyncResourceContextFrame(reinterpret_cast(this)); } MaybeLocal AsyncResource::MakeCallback(Local callback, int argc, Local* argv) { auto isolate = env_->isolate(); - auto context_frame = - env_->GetAsyncResourceContextFrame(reinterpret_cast(this)) - .Get(isolate); - async_context_frame::Scope async_context_frame_scope(isolate, context_frame); + async_context_frame::Scope async_context_frame_scope( + isolate, context_frame_.Get(isolate)); return node::MakeCallback( isolate, get_resource(), callback, argc, argv, async_context_); @@ -48,10 +43,8 @@ MaybeLocal AsyncResource::MakeCallback(const char* method, int argc, Local* argv) { auto isolate = env_->isolate(); - auto context_frame = - env_->GetAsyncResourceContextFrame(reinterpret_cast(this)) - .Get(isolate); - async_context_frame::Scope async_context_frame_scope(isolate, context_frame); + async_context_frame::Scope async_context_frame_scope( + isolate, context_frame_.Get(isolate)); return node::MakeCallback( isolate, get_resource(), method, argc, argv, async_context_); @@ -61,10 +54,8 @@ MaybeLocal AsyncResource::MakeCallback(Local symbol, int argc, Local* argv) { auto isolate = env_->isolate(); - auto context_frame = - env_->GetAsyncResourceContextFrame(reinterpret_cast(this)) - .Get(isolate); - async_context_frame::Scope async_context_frame_scope(isolate, context_frame); + async_context_frame::Scope async_context_frame_scope( + isolate, context_frame_.Get(isolate)); return node::MakeCallback( isolate, get_resource(), symbol, argc, argv, async_context_); diff --git a/src/async_wrap.cc b/src/async_wrap.cc index 8868245403d658..30490b90e77b64 100644 --- a/src/async_wrap.cc +++ b/src/async_wrap.cc @@ -488,31 +488,15 @@ AsyncWrap::AsyncWrap(Environment* env, Local object, ProviderType provider, double execution_async_id) - : AsyncWrap(env, object, provider, execution_async_id, false) {} - -AsyncWrap::AsyncWrap(Environment* env, - Local object, - ProviderType provider, - double execution_async_id, - bool silent) : AsyncWrap(env, object) { CHECK_NE(provider, PROVIDER_NONE); provider_type_ = provider; // Use AsyncReset() call to execute the init() callbacks. - AsyncReset(object, execution_async_id, silent); + AsyncReset(object, execution_async_id); init_hook_ran_ = true; } -AsyncWrap::AsyncWrap(Environment* env, - Local object, - ProviderType provider, - double execution_async_id, - double trigger_async_id) - : AsyncWrap(env, object, provider, execution_async_id, true) { - trigger_async_id_ = trigger_async_id; -} - AsyncWrap::AsyncWrap(Environment* env, Local object) : BaseObject(env, object), context_frame_(env->isolate(), @@ -592,8 +576,7 @@ void AsyncWrap::EmitDestroy(Environment* env, double async_id) { // Generalized call for both the constructor and for handles that are pooled // and reused over their lifetime. This way a new uid can be assigned when // the resource is pulled out of the pool and put back into use. -void AsyncWrap::AsyncReset(Local resource, double execution_async_id, - bool silent) { +void AsyncWrap::AsyncReset(Local resource, double execution_async_id) { CHECK_NE(provider_type(), PROVIDER_NONE); if (async_id_ != kInvalidAsyncId) { @@ -642,8 +625,6 @@ void AsyncWrap::AsyncReset(Local resource, double execution_async_id, context_frame_.Reset(isolate, async_context_frame::current(isolate)); - if (silent) return; - EmitAsyncInit(env(), resource, env()->async_hooks()->provider_string(provider_type()), async_id_, trigger_async_id_); diff --git a/src/async_wrap.h b/src/async_wrap.h index d656f72fdabd62..5b33290b4bb2d0 100644 --- a/src/async_wrap.h +++ b/src/async_wrap.h @@ -190,8 +190,7 @@ class AsyncWrap : public BaseObject { inline v8::Local context_frame() const; void AsyncReset(v8::Local resource, - double execution_async_id = kInvalidAsyncId, - bool silent = false); + double execution_async_id = kInvalidAsyncId); // Only call these within a valid HandleScope. v8::MaybeLocal MakeCallback(const v8::Local cb, @@ -224,18 +223,6 @@ class AsyncWrap : public BaseObject { bool IsDoneInitializing() const override; private: - friend class PromiseWrap; - - AsyncWrap(Environment* env, - v8::Local promise, - ProviderType provider, - double execution_async_id, - bool silent); - AsyncWrap(Environment* env, - v8::Local promise, - ProviderType provider, - double execution_async_id, - double trigger_async_id); ProviderType provider_type_ = PROVIDER_NONE; bool init_hook_ran_ = false; // Because the values may be Reset(), cannot be made const. diff --git a/src/cares_wrap.cc b/src/cares_wrap.cc index 00fe28d746d61c..a19e8221f34eba 100644 --- a/src/cares_wrap.cc +++ b/src/cares_wrap.cc @@ -59,6 +59,7 @@ namespace cares_wrap { using v8::Array; using v8::Context; using v8::EscapableHandleScope; +using v8::Exception; using v8::FunctionCallbackInfo; using v8::FunctionTemplate; using v8::HandleScope; @@ -68,6 +69,7 @@ using v8::Isolate; using v8::Just; using v8::JustVoid; using v8::Local; +using v8::LocalVector; using v8::Maybe; using v8::Nothing; using v8::Null; @@ -159,7 +161,7 @@ void ares_sockstate_cb(void* data, ares_socket_t sock, int read, int write) { Local HostentToNames(Environment* env, struct hostent* host) { EscapableHandleScope scope(env->isolate()); - std::vector> names; + LocalVector names(env->isolate()); for (uint32_t i = 0; host->h_aliases[i] != nullptr; ++i) names.emplace_back(OneByteString(env->isolate(), host->h_aliases[i])); @@ -1577,7 +1579,7 @@ void ConvertIpv6StringToBuffer(const FunctionCallbackInfo& args) { unsigned char dst[16]; // IPv6 addresses are 128 bits (16 bytes) if (uv_inet_pton(AF_INET6, *ip, dst) != 0) { - isolate->ThrowException(v8::Exception::Error( + isolate->ThrowException(Exception::Error( String::NewFromUtf8(isolate, "Invalid IPv6 address").ToLocalChecked())); return; } diff --git a/src/crypto/crypto_cipher.cc b/src/crypto/crypto_cipher.cc index 51e311be705393..21e34333609880 100644 --- a/src/crypto/crypto_cipher.cc +++ b/src/crypto/crypto_cipher.cc @@ -20,6 +20,7 @@ using v8::HandleScope; using v8::Int32; using v8::Isolate; using v8::Local; +using v8::LocalVector; using v8::Object; using v8::Uint32; using v8::Value; @@ -222,7 +223,7 @@ void CipherBase::GetSSLCiphers(const FunctionCallbackInfo& args) { }; const int n = sk_SSL_CIPHER_num(ciphers); - std::vector> arr(n + arraysize(TLS13_CIPHERS)); + LocalVector arr(env->isolate(), n + arraysize(TLS13_CIPHERS)); for (int i = 0; i < n; ++i) { const SSL_CIPHER* cipher = sk_SSL_CIPHER_value(ciphers, i); diff --git a/src/crypto/crypto_ec.cc b/src/crypto/crypto_ec.cc index a42a336baedf09..78df3ae14407e3 100644 --- a/src/crypto/crypto_ec.cc +++ b/src/crypto/crypto_ec.cc @@ -28,6 +28,7 @@ using v8::Int32; using v8::Isolate; using v8::JustVoid; using v8::Local; +using v8::LocalVector; using v8::Maybe; using v8::MaybeLocal; using v8::Nothing; @@ -95,7 +96,7 @@ void ECDH::GetCurves(const FunctionCallbackInfo& args) { std::vector curves(num_curves); CHECK_EQ(EC_get_builtin_curves(curves.data(), num_curves), num_curves); - std::vector> arr(num_curves); + LocalVector arr(env->isolate(), num_curves); std::transform(curves.begin(), curves.end(), arr.begin(), [env](auto& curve) { return OneByteString(env->isolate(), OBJ_nid2sn(curve.nid)); }); diff --git a/src/crypto/crypto_hash.cc b/src/crypto/crypto_hash.cc index 23e5fea262f2a6..5fd20c2fd3968f 100644 --- a/src/crypto/crypto_hash.cc +++ b/src/crypto/crypto_hash.cc @@ -19,6 +19,7 @@ using v8::Isolate; using v8::Just; using v8::JustVoid; using v8::Local; +using v8::LocalVector; using v8::Maybe; using v8::MaybeLocal; using v8::Name; @@ -144,9 +145,9 @@ void Hash::GetCachedAliases(const FunctionCallbackInfo& args) { Isolate* isolate = args.GetIsolate(); Local context = args.GetIsolate()->GetCurrentContext(); Environment* env = Environment::GetCurrent(context); - std::vector> names; - std::vector> values; size_t size = env->alias_to_md_id_map.size(); + LocalVector names(isolate); + LocalVector values(isolate); #if OPENSSL_VERSION_MAJOR >= 3 names.reserve(size); values.reserve(size); diff --git a/src/crypto/crypto_util.cc b/src/crypto/crypto_util.cc index d4832d77be555d..9f5f8e6f03e4ab 100644 --- a/src/crypto/crypto_util.cc +++ b/src/crypto/crypto_util.cc @@ -36,6 +36,7 @@ using v8::HandleScope; using v8::Isolate; using v8::JustVoid; using v8::Local; +using v8::LocalVector; using v8::Maybe; using v8::MaybeLocal; using v8::NewStringType; @@ -236,7 +237,7 @@ MaybeLocal cryptoErrorListToException( if (errors.size() > 1) { CHECK(exception->IsObject()); Local exception_obj = exception.As(); - std::vector> stack(errors.size() - 1); + LocalVector stack(env->isolate(), errors.size() - 1); // Iterate over all but the last error in the list. auto current = errors.begin(); @@ -252,7 +253,7 @@ MaybeLocal cryptoErrorListToException( } Local stackArray = - v8::Array::New(env->isolate(), &stack[0], stack.size()); + v8::Array::New(env->isolate(), stack.data(), stack.size()); if (!exception_obj ->Set(env->context(), env->openssl_error_stack(), stackArray) diff --git a/src/crypto/crypto_util.h b/src/crypto/crypto_util.h index 5c717c6fdb0fc4..a72c0a2a908294 100644 --- a/src/crypto/crypto_util.h +++ b/src/crypto/crypto_util.h @@ -547,7 +547,8 @@ void ThrowCryptoError(Environment* env, class CipherPushContext { public: - inline explicit CipherPushContext(Environment* env) : env_(env) {} + inline explicit CipherPushContext(Environment* env) + : list_(env->isolate()), env_(env) {} inline void push_back(const char* str) { list_.emplace_back(OneByteString(env_->isolate(), str)); @@ -558,7 +559,7 @@ class CipherPushContext { } private: - std::vector> list_; + v8::LocalVector list_; Environment* env_; }; diff --git a/src/debug_utils.cc b/src/debug_utils.cc index 9d36082db672ce..c8b3b11ee34d7a 100644 --- a/src/debug_utils.cc +++ b/src/debug_utils.cc @@ -62,9 +62,9 @@ EnabledDebugList enabled_debug_list; using v8::Local; using v8::StackTrace; -void EnabledDebugList::Parse(std::shared_ptr env_vars) { +void EnabledDebugList::Parse(Environment* env) { std::string cats; - credentials::SafeGetenv("NODE_DEBUG_NATIVE", &cats, env_vars); + credentials::SafeGetenv("NODE_DEBUG_NATIVE", &cats, env); Parse(cats); } diff --git a/src/debug_utils.h b/src/debug_utils.h index 359b8d6b421020..d4391ac987ba5b 100644 --- a/src/debug_utils.h +++ b/src/debug_utils.h @@ -74,10 +74,10 @@ class NODE_EXTERN_PRIVATE EnabledDebugList { return enabled_[static_cast(category)]; } - // Uses NODE_DEBUG_NATIVE to initialize the categories. The env_vars variable + // Uses NODE_DEBUG_NATIVE to initialize the categories. env->env_vars() // is parsed if it is not a nullptr, otherwise the system environment // variables are parsed. - void Parse(std::shared_ptr env_vars); + void Parse(Environment* env); private: // Enable all categories matching cats. diff --git a/src/encoding_binding.cc b/src/encoding_binding.cc index 97ddd59fb661c8..885a0d072312e9 100644 --- a/src/encoding_binding.cc +++ b/src/encoding_binding.cc @@ -1,6 +1,7 @@ #include "encoding_binding.h" #include "ada.h" #include "env-inl.h" +#include "node_buffer.h" #include "node_errors.h" #include "node_external_reference.h" #include "simdutf.h" @@ -226,6 +227,7 @@ void BindingData::CreatePerIsolateProperties(IsolateData* isolate_data, SetMethodNoSideEffect(isolate, target, "decodeUTF8", DecodeUTF8); SetMethodNoSideEffect(isolate, target, "toASCII", ToASCII); SetMethodNoSideEffect(isolate, target, "toUnicode", ToUnicode); + SetMethodNoSideEffect(isolate, target, "decodeLatin1", DecodeLatin1); } void BindingData::CreatePerContextProperties(Local target, @@ -243,6 +245,52 @@ void BindingData::RegisterTimerExternalReferences( registry->Register(DecodeUTF8); registry->Register(ToASCII); registry->Register(ToUnicode); + registry->Register(DecodeLatin1); +} + +void BindingData::DecodeLatin1(const FunctionCallbackInfo& args) { + Environment* env = Environment::GetCurrent(args); + + CHECK_GE(args.Length(), 1); + if (!(args[0]->IsArrayBuffer() || args[0]->IsSharedArrayBuffer() || + args[0]->IsArrayBufferView())) { + return node::THROW_ERR_INVALID_ARG_TYPE( + env->isolate(), + "The \"input\" argument must be an instance of ArrayBuffer, " + "SharedArrayBuffer, or ArrayBufferView."); + } + + bool ignore_bom = args[1]->IsTrue(); + bool has_fatal = args[2]->IsTrue(); + + ArrayBufferViewContents buffer(args[0]); + const uint8_t* data = buffer.data(); + size_t length = buffer.length(); + + if (ignore_bom && length > 0 && data[0] == 0xFF) { + data++; + length--; + } + + if (length == 0) { + return args.GetReturnValue().SetEmptyString(); + } + + std::string result(length * 2, '\0'); + + size_t written = simdutf::convert_latin1_to_utf8( + reinterpret_cast(data), length, result.data()); + + if (has_fatal && written == 0) { + return node::THROW_ERR_ENCODING_INVALID_ENCODED_DATA( + env->isolate(), "The encoded data was not valid for encoding latin1"); + } + + Local output = + String::NewFromUtf8( + env->isolate(), result.c_str(), v8::NewStringType::kNormal, written) + .ToLocalChecked(); + args.GetReturnValue().Set(output); } } // namespace encoding_binding diff --git a/src/encoding_binding.h b/src/encoding_binding.h index 2690cb74f8a05b..97f55394d27641 100644 --- a/src/encoding_binding.h +++ b/src/encoding_binding.h @@ -31,6 +31,7 @@ class BindingData : public SnapshotableObject { static void EncodeInto(const v8::FunctionCallbackInfo& args); static void EncodeUtf8String(const v8::FunctionCallbackInfo& args); static void DecodeUTF8(const v8::FunctionCallbackInfo& args); + static void DecodeLatin1(const v8::FunctionCallbackInfo& args); static void ToASCII(const v8::FunctionCallbackInfo& args); static void ToUnicode(const v8::FunctionCallbackInfo& args); diff --git a/src/env-inl.h b/src/env-inl.h index d266eca6fc3300..79496fab1a7528 100644 --- a/src/env-inl.h +++ b/src/env-inl.h @@ -908,26 +908,6 @@ inline void Environment::RemoveHeapSnapshotNearHeapLimitCallback( heap_limit); } -inline void Environment::SetAsyncResourceContextFrame( - std::uintptr_t async_resource_handle, - v8::Global&& context_frame) { - async_resource_context_frames_.emplace( - std::make_pair(async_resource_handle, std::move(context_frame))); -} - -inline const v8::Global& Environment::GetAsyncResourceContextFrame( - std::uintptr_t async_resource_handle) { - auto&& async_resource_context_frame = - async_resource_context_frames_.find(async_resource_handle); - CHECK_NE(async_resource_context_frame, async_resource_context_frames_.end()); - - return async_resource_context_frame->second; -} - -inline void Environment::RemoveAsyncResourceContextFrame( - std::uintptr_t async_resource_handle) { - async_resource_context_frames_.erase(async_resource_handle); -} } // namespace node // These two files depend on each other. Including base_object-inl.h after this diff --git a/src/env.cc b/src/env.cc index 458fd3b5611c47..f0f97244fdef63 100644 --- a/src/env.cc +++ b/src/env.cc @@ -87,13 +87,13 @@ void AsyncHooks::ResetPromiseHooks(Local init, js_promise_hooks_[3].Reset(env()->isolate(), resolve); } -Local AsyncHooks::GetPromiseHooks(Isolate* isolate) { - std::vector> values; +Local AsyncHooks::GetPromiseHooks(Isolate* isolate) const { + v8::LocalVector values(isolate, js_promise_hooks_.size()); for (size_t i = 0; i < js_promise_hooks_.size(); ++i) { if (js_promise_hooks_[i].IsEmpty()) { - values.push_back(Undefined(isolate)); + values[i] = Undefined(isolate); } else { - values.push_back(js_promise_hooks_[i].Get(isolate)); + values[i] = js_promise_hooks_[i].Get(isolate); } } return Array::New(isolate, values.data(), values.size()); @@ -176,11 +176,7 @@ bool AsyncHooks::pop_async_context(double async_id) { } #endif native_execution_async_resources_.resize(offset); - if (native_execution_async_resources_.size() < - native_execution_async_resources_.capacity() / 2 && - native_execution_async_resources_.size() > 16) { - native_execution_async_resources_.shrink_to_fit(); - } + native_execution_async_resources_.shrink_to_fit(); } if (js_execution_async_resources()->Length() > offset) [[unlikely]] { @@ -236,13 +232,10 @@ void Environment::TrackContext(Local context) { void Environment::UntrackContext(Local context) { HandleScope handle_scope(isolate_); - contexts_.erase(std::remove_if(contexts_.begin(), - contexts_.end(), - [&](auto&& el) { return el.IsEmpty(); }), - contexts_.end()); + std::erase_if(contexts_, [&](auto&& el) { return el.IsEmpty(); }); for (auto it = contexts_.begin(); it != contexts_.end(); it++) { - Local saved_context = PersistentToLocal::Weak(isolate_, *it); - if (saved_context == context) { + if (Local saved_context = PersistentToLocal::Weak(isolate_, *it); + saved_context == context) { it->Reset(); contexts_.erase(it); break; @@ -351,9 +344,11 @@ IsolateDataSerializeInfo IsolateData::Serialize(SnapshotCreator* creator) { #undef VS #undef VP - for (size_t i = 0; i < AsyncWrap::PROVIDERS_LENGTH; i++) + info.primitive_values.reserve(info.primitive_values.size() + + AsyncWrap::PROVIDERS_LENGTH); + for (size_t i = 0; i < AsyncWrap::PROVIDERS_LENGTH; i++) { info.primitive_values.push_back(creator->AddData(async_wrap_provider(i))); - + } uint32_t id = 0; #define VM(PropertyName) V(PropertyName##_binding_template, ObjectTemplate) #define V(PropertyName, TypeName) \ @@ -375,7 +370,7 @@ IsolateDataSerializeInfo IsolateData::Serialize(SnapshotCreator* creator) { void IsolateData::DeserializeProperties(const IsolateDataSerializeInfo* info) { size_t i = 0; - v8::Isolate::Scope isolate_scope(isolate_); + Isolate::Scope isolate_scope(isolate_); HandleScope handle_scope(isolate_); if (per_process::enabled_debug_list.enabled(DebugCategory::MKSNAPSHOT)) { @@ -721,9 +716,8 @@ void Environment::TryLoadAddon( std::string Environment::GetCwd(const std::string& exec_path) { char cwd[PATH_MAX_BYTES]; size_t size = PATH_MAX_BYTES; - const int err = uv_cwd(cwd, &size); - if (err == 0) { + if (uv_cwd(cwd, &size) == 0) { CHECK_GT(size, 0); return cwd; } @@ -769,7 +763,7 @@ std::string Environment::GetExecPath(const std::vector& argv) { std::string exec_path; if (uv_exepath(exec_path_buf, &exec_path_len) == 0) { exec_path = std::string(exec_path_buf, exec_path_len); - } else if (argv.size() > 0) { + } else if (!argv.empty()) { exec_path = argv[0]; } @@ -864,9 +858,6 @@ Environment::Environment(IsolateData* isolate_data, EnvironmentFlags::kOwnsInspector; } - set_env_vars(per_process::system_environment); - enabled_debug_list_.Parse(env_vars()); - // We create new copies of the per-Environment option sets, so that it is // easier to modify them after Environment creation. The defaults are // part of the per-Isolate option set, for which in turn the defaults are @@ -876,6 +867,13 @@ Environment::Environment(IsolateData* isolate_data, inspector_host_port_ = std::make_shared>( options_->debug_options().host_port); + set_env_vars(per_process::system_environment); + // This should be done after options is created, so that --trace-env can be + // checked when parsing NODE_DEBUG_NATIVE. It should also be done after + // env_vars() is set so that the parser uses values from env->env_vars() + // which may or may not be the system environment variable store. + enabled_debug_list_.Parse(this); + heap_snapshot_near_heap_limit_ = static_cast(options_->heap_snapshot_near_heap_limit); @@ -918,7 +916,7 @@ Environment::Environment(IsolateData* isolate_data, std::move(traced_value)); } - if (options_->experimental_permission) { + if (options_->permission) { permission()->EnablePermissions(); // The process shouldn't be able to neither // spawn/worker nor use addons or enable inspector @@ -1104,8 +1102,7 @@ void Environment::InitializeLibuv() { void Environment::InitializeCompileCache() { std::string dir_from_env; - if (!credentials::SafeGetenv( - "NODE_COMPILE_CACHE", &dir_from_env, env_vars()) || + if (!credentials::SafeGetenv("NODE_COMPILE_CACHE", &dir_from_env, this) || dir_from_env.empty()) { return; } @@ -1117,7 +1114,7 @@ CompileCacheEnableResult Environment::EnableCompileCache( CompileCacheEnableResult result; std::string disable_env; if (credentials::SafeGetenv( - "NODE_DISABLE_COMPILE_CACHE", &disable_env, env_vars())) { + "NODE_DISABLE_COMPILE_CACHE", &disable_env, this)) { result.status = CompileCacheEnableStatus::DISABLED; result.message = "Disabled by NODE_DISABLE_COMPILE_CACHE"; Debug(this, @@ -1236,7 +1233,8 @@ void Environment::StartProfilerIdleNotifier() { } void Environment::PrintSyncTrace() const { - if (!trace_sync_io_) return; + if (!trace_sync_io_) [[likely]] + return; HandleScope handle_scope(isolate()); @@ -1311,7 +1309,7 @@ void Environment::AtExit(void (*cb)(void* arg), void* arg) { at_exit_functions_.push_front(ExitCallback{cb, arg}); } -Maybe Environment::CheckUnsettledTopLevelAwait() { +Maybe Environment::CheckUnsettledTopLevelAwait() const { HandleScope scope(isolate_); Local ctx = context(); Local value; @@ -1513,7 +1511,7 @@ void Environment::RunTimers(uv_timer_t* handle) { int64_t expiry_ms = ret.ToLocalChecked()->IntegerValue(env->context()).FromJust(); - uv_handle_t* h = reinterpret_cast(handle); + auto* h = reinterpret_cast(handle); if (expiry_ms != 0) { int64_t duration_ms = @@ -1579,8 +1577,7 @@ Local Environment::GetNow() { uint64_t now = GetNowUint64(); if (now <= 0xffffffff) return Integer::NewFromUnsigned(isolate(), static_cast(now)); - else - return Number::New(isolate(), static_cast(now)); + return Number::New(isolate(), static_cast(now)); } void CollectExceptionInfo(Environment* env, @@ -1639,8 +1636,8 @@ void Environment::CollectUVExceptionInfo(Local object, message = uv_strerror(errorno); } - node::CollectExceptionInfo(this, obj, errorno, err_string, - syscall, message, path, dest); + CollectExceptionInfo( + this, obj, errorno, err_string, syscall, message, path, dest); } ImmediateInfo::ImmediateInfo(Isolate* isolate, const SerializeInfo* info) @@ -1693,6 +1690,7 @@ AsyncHooks::AsyncHooks(Isolate* isolate, const SerializeInfo* info) fields_(isolate, kFieldsCount, MAYBE_FIELD_PTR(info, fields)), async_id_fields_( isolate, kUidFieldsCount, MAYBE_FIELD_PTR(info, async_id_fields)), + native_execution_async_resources_(isolate), info_(info) { HandleScope handle_scope(isolate); if (info == nullptr) { @@ -1970,7 +1968,7 @@ void Environment::BuildEmbedderGraph(Isolate* isolate, EmbedderGraph* graph, void* data) { MemoryTracker tracker(isolate, graph); - Environment* env = static_cast(data); + auto* env = static_cast(data); // Start traversing embedder objects from the root Environment object. tracker.Track(env); } @@ -2032,7 +2030,7 @@ void Environment::TracePromises(PromiseHookType type, size_t Environment::NearHeapLimitCallback(void* data, size_t current_heap_limit, size_t initial_heap_limit) { - Environment* env = static_cast(data); + auto* env = static_cast(data); Debug(env, DebugCategory::DIAGNOSTICS, @@ -2078,8 +2076,8 @@ size_t Environment::NearHeapLimitCallback(void* data, DebugCategory::DIAGNOSTICS, "Estimated available memory=%" PRIu64 ", " "estimated overhead=%" PRIu64 "\n", - static_cast(available), - static_cast(estimated_overhead)); + available, + estimated_overhead); // This might be hit when the snapshot is being taken in another // NearHeapLimitCallback invocation. diff --git a/src/env.h b/src/env.h index 11d956710b8969..ec5b608cede6a1 100644 --- a/src/env.h +++ b/src/env.h @@ -329,7 +329,7 @@ class AsyncHooks : public MemoryRetainer { v8::Local resolve); // Used for testing since V8 doesn't provide API for retrieving configured // JS promise hooks. - v8::Local GetPromiseHooks(v8::Isolate* isolate); + v8::Local GetPromiseHooks(v8::Isolate* isolate) const; inline v8::Local provider_string(int idx); inline void no_force_checks(); @@ -401,7 +401,16 @@ class AsyncHooks : public MemoryRetainer { void grow_async_ids_stack(); v8::Global js_execution_async_resources_; - std::vector> native_execution_async_resources_; + + // TODO(@jasnell): Note that this is technically illegal use of + // v8::Locals which should be kept on the stack. Here, the entries + // in this object grows and shrinks with the C stack, and entries + // will be in the right handle scopes, but v8::Locals are supposed + // to remain on the stack and not the heap. For general purposes + // this *should* be ok but may need to be looked at further should + // v8 become stricter in the future about v8::Locals being held in + // the stack. + v8::LocalVector native_execution_async_resources_; // Non-empty during deserialization const SerializeInfo* info_ = nullptr; @@ -848,7 +857,7 @@ class Environment final : public MemoryRetainer { void AtExit(void (*cb)(void* arg), void* arg); void RunAtExitCallbacks(); - v8::Maybe CheckUnsettledTopLevelAwait(); + v8::Maybe CheckUnsettledTopLevelAwait() const; void RunWeakRefCleanup(); v8::MaybeLocal RunSnapshotSerializeCallback() const; @@ -1070,14 +1079,6 @@ class Environment final : public MemoryRetainer { v8::Global temporary_required_module_facade_original; - void SetAsyncResourceContextFrame(std::uintptr_t async_resource_handle, - v8::Global&&); - - const v8::Global& GetAsyncResourceContextFrame( - std::uintptr_t async_resource_handle); - - void RemoveAsyncResourceContextFrame(std::uintptr_t async_resource_handle); - private: inline void ThrowError(v8::Local (*fun)(v8::Local, v8::Local), @@ -1252,9 +1253,6 @@ class Environment final : public MemoryRetainer { // track of the BackingStore for a given pointer. std::unordered_map> released_allocated_buffers_; - - std::unordered_map> - async_resource_context_frames_; }; } // namespace node diff --git a/src/env_properties.h b/src/env_properties.h index 84bb1d492b512b..d9e18cbc4515ac 100644 --- a/src/env_properties.h +++ b/src/env_properties.h @@ -144,10 +144,13 @@ V(entry_type_string, "entryType") \ V(env_pairs_string, "envPairs") \ V(env_var_settings_string, "envVarSettings") \ + V(err_sqlite_error_string, "ERR_SQLITE_ERROR") \ + V(errcode_string, "errcode") \ V(errno_string, "errno") \ V(error_string, "error") \ - V(events, "events") \ + V(errstr_string, "errstr") \ V(events_waiting, "eventsWaiting") \ + V(events, "events") \ V(exchange_string, "exchange") \ V(expire_string, "expire") \ V(exponent_string, "exponent") \ @@ -194,8 +197,10 @@ V(ipv4_string, "IPv4") \ V(ipv6_string, "IPv6") \ V(isclosing_string, "isClosing") \ + V(isfinished_string, "isFinished") \ V(issuer_string, "issuer") \ V(issuercert_string, "issuerCertificate") \ + V(iterator_string, "Iterator") \ V(jwk_crv_string, "crv") \ V(jwk_d_string, "d") \ V(jwk_dp_string, "dp") \ @@ -241,6 +246,7 @@ V(nistcurve_string, "nistCurve") \ V(node_string, "node") \ V(nsname_string, "nsname") \ + V(num_cols_string, "num_cols") \ V(object_string, "Object") \ V(ocsp_request_string, "OCSPRequest") \ V(oncertcb_string, "oncertcb") \ @@ -288,6 +294,7 @@ V(priority_string, "priority") \ V(process_string, "process") \ V(promise_string, "promise") \ + V(prototype_string, "prototype") \ V(psk_string, "psk") \ V(pubkey_string, "pubkey") \ V(public_exponent_string, "publicExponent") \ @@ -309,6 +316,7 @@ V(require_string, "require") \ V(resource_string, "resource") \ V(retry_string, "retry") \ + V(return_string, "return") \ V(salt_length_string, "saltLength") \ V(scheme_string, "scheme") \ V(scopeid_string, "scopeid") \ @@ -332,6 +340,7 @@ V(standard_name_string, "standardName") \ V(start_time_string, "startTime") \ V(state_string, "state") \ + V(statement_string, "statement") \ V(stats_string, "stats") \ V(status_string, "status") \ V(stdio_string, "stdio") \ diff --git a/src/internal_only_v8.cc b/src/internal_only_v8.cc index 17b0c7aba6e1f0..6a3c4e6952a8f3 100644 --- a/src/internal_only_v8.cc +++ b/src/internal_only_v8.cc @@ -10,6 +10,7 @@ using v8::FunctionCallbackInfo; using v8::Global; using v8::Isolate; using v8::Local; +using v8::LocalVector; using v8::Object; using v8::Value; @@ -56,7 +57,7 @@ void QueryObjects(const FunctionCallbackInfo& args) { PrototypeChainHas prototype_chain_has(context, proto.As()); std::vector> out; isolate->GetHeapProfiler()->QueryObjects(context, &prototype_chain_has, &out); - std::vector> result; + LocalVector result(isolate); result.reserve(out.size()); for (size_t i = 0; i < out.size(); ++i) { result.push_back(out[i].Get(isolate)); diff --git a/src/js_native_api.h b/src/js_native_api.h index 07e3df13407030..8ef079b5158249 100644 --- a/src/js_native_api.h +++ b/src/js_native_api.h @@ -92,8 +92,7 @@ NAPI_EXTERN napi_status NAPI_CDECL napi_create_string_utf16(napi_env env, const char16_t* str, size_t length, napi_value* result); -#ifdef NAPI_EXPERIMENTAL -#define NODE_API_EXPERIMENTAL_HAS_EXTERNAL_STRINGS +#if NAPI_VERSION >= 10 NAPI_EXTERN napi_status NAPI_CDECL node_api_create_external_string_latin1( napi_env env, char* str, @@ -110,17 +109,14 @@ node_api_create_external_string_utf16(napi_env env, void* finalize_hint, napi_value* result, bool* copied); -#endif // NAPI_EXPERIMENTAL -#ifdef NAPI_EXPERIMENTAL -#define NODE_API_EXPERIMENTAL_HAS_PROPERTY_KEYS NAPI_EXTERN napi_status NAPI_CDECL node_api_create_property_key_latin1( napi_env env, const char* str, size_t length, napi_value* result); NAPI_EXTERN napi_status NAPI_CDECL node_api_create_property_key_utf8( napi_env env, const char* str, size_t length, napi_value* result); NAPI_EXTERN napi_status NAPI_CDECL node_api_create_property_key_utf16( napi_env env, const char16_t* str, size_t length, napi_value* result); -#endif // NAPI_EXPERIMENTAL +#endif // NAPI_VERSION >= 10 NAPI_EXTERN napi_status NAPI_CDECL napi_create_symbol(napi_env env, napi_value description, diff --git a/src/js_native_api_v8.cc b/src/js_native_api_v8.cc index d2334f65023161..6e1680a74e2124 100644 --- a/src/js_native_api_v8.cc +++ b/src/js_native_api_v8.cc @@ -2753,7 +2753,7 @@ napi_status NAPI_CDECL napi_create_reference(napi_env env, CHECK_ARG(env, result); v8::Local v8_value = v8impl::V8LocalValueFromJsValue(value); - if (env->module_api_version != NAPI_VERSION_EXPERIMENTAL) { + if (env->module_api_version < 10) { if (!(v8_value->IsObject() || v8_value->IsFunction() || v8_value->IsSymbol())) { return napi_set_last_error(env, napi_invalid_arg); @@ -2769,10 +2769,12 @@ napi_status NAPI_CDECL napi_create_reference(napi_env env, // Deletes a reference. The referenced value is released, and may be GC'd unless // there are other references to it. +// For a napi_reference returned from `napi_wrap`, this must be called in the +// finalizer. napi_status NAPI_CDECL napi_delete_reference(napi_env env, napi_ref ref) { // Omit NAPI_PREAMBLE and GET_RETURN_STATUS because V8 calls here cannot throw // JS exceptions. - CHECK_ENV_NOT_IN_GC(env); + CHECK_ENV(env); CHECK_ARG(env, ref); delete reinterpret_cast(ref); diff --git a/src/js_native_api_v8.h b/src/js_native_api_v8.h index 99bb30cfbe9a9d..27aeac589b19cd 100644 --- a/src/js_native_api_v8.h +++ b/src/js_native_api_v8.h @@ -234,11 +234,11 @@ inline napi_status napi_set_last_error(node_api_basic_env basic_env, CHECK_ENV_NOT_IN_GC((env)); \ RETURN_STATUS_IF_FALSE( \ (env), (env)->last_exception.IsEmpty(), napi_pending_exception); \ - RETURN_STATUS_IF_FALSE((env), \ - (env)->can_call_into_js(), \ - (env->module_api_version == NAPI_VERSION_EXPERIMENTAL \ - ? napi_cannot_run_js \ - : napi_pending_exception)); \ + RETURN_STATUS_IF_FALSE( \ + (env), \ + (env)->can_call_into_js(), \ + (env->module_api_version >= 10 ? napi_cannot_run_js \ + : napi_pending_exception)); \ napi_clear_last_error((env)); \ v8impl::TryCatch try_catch((env)) diff --git a/src/module_wrap.cc b/src/module_wrap.cc index 6f8c9d10955b88..649ec428e2dd6f 100644 --- a/src/module_wrap.cc +++ b/src/module_wrap.cc @@ -23,25 +23,35 @@ using node::contextify::ContextifyContext; using v8::Array; using v8::ArrayBufferView; using v8::Context; +using v8::Data; using v8::EscapableHandleScope; +using v8::Exception; using v8::FixedArray; using v8::Function; using v8::FunctionCallbackInfo; using v8::FunctionTemplate; +using v8::Global; using v8::HandleScope; using v8::Int32; using v8::Integer; using v8::Isolate; +using v8::Just; using v8::Local; +using v8::LocalVector; +using v8::Maybe; using v8::MaybeLocal; using v8::MemorySpan; +using v8::Message; using v8::MicrotaskQueue; using v8::Module; using v8::ModuleRequest; +using v8::Name; +using v8::Null; using v8::Object; using v8::ObjectTemplate; using v8::PrimitiveArray; using v8::Promise; +using v8::PromiseRejectEvent; using v8::ScriptCompiler; using v8::ScriptOrigin; using v8::String; @@ -103,7 +113,7 @@ ModuleWrap* ModuleWrap::GetFromModule(Environment* env, return nullptr; } -v8::Maybe ModuleWrap::CheckUnsettledTopLevelAwait() { +Maybe ModuleWrap::CheckUnsettledTopLevelAwait() { Isolate* isolate = env()->isolate(); Local context = env()->context(); @@ -115,17 +125,17 @@ v8::Maybe ModuleWrap::CheckUnsettledTopLevelAwait() { Local module = module_.Get(isolate); // It's a synthetic module, likely a facade wrapping CJS. if (!module->IsSourceTextModule()) { - return v8::Just(true); + return Just(true); } if (!module->IsGraphAsync()) { // There is no TLA, no need to check. - return v8::Just(true); + return Just(true); } auto stalled_messages = std::get<1>(module->GetStalledTopLevelAwaitMessages(isolate)); if (stalled_messages.empty()) { - return v8::Just(true); + return Just(true); } if (env()->options()->warnings) { @@ -138,7 +148,7 @@ v8::Maybe ModuleWrap::CheckUnsettledTopLevelAwait() { } } - return v8::Just(false); + return Just(false); } Local ModuleWrap::GetHostDefinedOptions( @@ -229,7 +239,7 @@ void ModuleWrap::New(const FunctionCallbackInfo& args) { Local export_names_arr = args[2].As(); uint32_t len = export_names_arr->Length(); - std::vector> export_names(len); + LocalVector export_names(realm->isolate(), len); for (uint32_t i = 0; i < len; i++) { Local export_name_val = export_names_arr->Get(context, i).ToLocalChecked(); @@ -245,7 +255,7 @@ void ModuleWrap::New(const FunctionCallbackInfo& args) { // When we are compiling for the default loader, this will be // std::nullopt, and CompileSourceTextModule() should use // on-disk cache. - std::optional user_cached_data; + std::optional user_cached_data; if (id_symbol != realm->isolate_data()->source_text_module_default_hdo()) { user_cached_data = nullptr; @@ -324,7 +334,7 @@ void ModuleWrap::New(const FunctionCallbackInfo& args) { // be stored in an internal field. Local context_object = context->GetExtrasBindingObject(); Local synthetic_evaluation_step = - synthetic ? args[3] : Undefined(realm->isolate()).As(); + synthetic ? args[3] : Undefined(realm->isolate()).As(); ModuleWrap* obj = new ModuleWrap( realm, that, module, url, context_object, synthetic_evaluation_step); @@ -405,22 +415,22 @@ static Local createImportAttributesContainer( const int elements_per_attribute) { CHECK_EQ(raw_attributes->Length() % elements_per_attribute, 0); size_t num_attributes = raw_attributes->Length() / elements_per_attribute; - std::vector> names(num_attributes); - std::vector> values(num_attributes); + LocalVector names(isolate, num_attributes); + LocalVector values(isolate, num_attributes); for (int i = 0; i < raw_attributes->Length(); i += elements_per_attribute) { int idx = i / elements_per_attribute; - names[idx] = raw_attributes->Get(realm->context(), i).As(); + names[idx] = raw_attributes->Get(realm->context(), i).As(); values[idx] = raw_attributes->Get(realm->context(), i + 1).As(); } return Object::New( - isolate, v8::Null(isolate), names.data(), values.data(), num_attributes); + isolate, Null(isolate), names.data(), values.data(), num_attributes); } static Local createModuleRequestsContainer( Realm* realm, Isolate* isolate, Local raw_requests) { - std::vector> requests(raw_requests->Length()); + LocalVector requests(isolate, raw_requests->Length()); for (int i = 0; i < raw_requests->Length(); i++) { Local module_request = @@ -434,7 +444,7 @@ static Local createModuleRequestsContainer( Local attributes = createImportAttributesContainer(realm, isolate, raw_attributes, 3); - Local names[] = { + Local names[] = { realm->isolate_data()->specifier_string(), realm->isolate_data()->attributes_string(), }; @@ -444,8 +454,8 @@ static Local createModuleRequestsContainer( }; DCHECK_EQ(arraysize(names), arraysize(values)); - Local request = Object::New( - isolate, v8::Null(isolate), names, values, arraysize(names)); + Local request = + Object::New(isolate, Null(isolate), names, values, arraysize(names)); requests[i] = request; } @@ -481,11 +491,11 @@ void ModuleWrap::Link(const FunctionCallbackInfo& args) { Local modules = args[1].As(); CHECK_EQ(specifiers->Length(), modules->Length()); - std::vector> specifiers_buffer; + std::vector> specifiers_buffer; if (FromV8Array(context, specifiers, &specifiers_buffer).IsNothing()) { return; } - std::vector> modules_buffer; + std::vector> modules_buffer; if (FromV8Array(context, modules, &modules_buffer).IsNothing()) { return; } @@ -663,9 +673,24 @@ void ModuleWrap::EvaluateSync(const FunctionCallbackInfo& args) { CHECK(result->IsPromise()); Local promise = result.As(); if (promise->State() == Promise::PromiseState::kRejected) { + // The rejected promise is created by V8, so we don't get a chance to mark + // it as resolved before the rejection happens from evaluation. But we can + // tell the promise rejection callback to treat it as a promise rejected + // before handler was added which would remove it from the unhandled + // rejection handling, since we are converting it into an error and throw + // from here directly. + Local type = + Integer::New(isolate, + static_cast( + PromiseRejectEvent::kPromiseHandlerAddedAfterReject)); + Local args[] = {type, promise, Undefined(isolate)}; + if (env->promise_reject_callback() + ->Call(context, Undefined(isolate), arraysize(args), args) + .IsEmpty()) { + return; + } Local exception = promise->Result(); - Local message = - v8::Exception::CreateMessage(isolate, exception); + Local message = Exception::CreateMessage(isolate, exception); AppendExceptionLine( env, exception, message, ErrorHandlingMode::MODULE_ERROR); isolate->ThrowException(exception); @@ -702,15 +727,15 @@ void ModuleWrap::GetNamespaceSync(const FunctionCallbackInfo& args) { Local module = obj->module_.Get(isolate); switch (module->GetStatus()) { - case v8::Module::Status::kUninstantiated: - case v8::Module::Status::kInstantiating: + case Module::Status::kUninstantiated: + case Module::Status::kInstantiating: return realm->env()->ThrowError( "Cannot get namespace, module has not been instantiated"); - case v8::Module::Status::kInstantiated: - case v8::Module::Status::kEvaluated: - case v8::Module::Status::kErrored: + case Module::Status::kInstantiated: + case Module::Status::kEvaluated: + case Module::Status::kErrored: break; - case v8::Module::Status::kEvaluating: + case Module::Status::kEvaluating: UNREACHABLE(); } @@ -730,14 +755,14 @@ void ModuleWrap::GetNamespace(const FunctionCallbackInfo& args) { Local module = obj->module_.Get(isolate); switch (module->GetStatus()) { - case v8::Module::Status::kUninstantiated: - case v8::Module::Status::kInstantiating: + case Module::Status::kUninstantiated: + case Module::Status::kInstantiating: return realm->env()->ThrowError( "cannot get namespace, module has not been instantiated"); - case v8::Module::Status::kInstantiated: - case v8::Module::Status::kEvaluating: - case v8::Module::Status::kEvaluated: - case v8::Module::Status::kErrored: + case Module::Status::kInstantiated: + case Module::Status::kEvaluating: + case Module::Status::kEvaluated: + case Module::Status::kErrored: break; default: UNREACHABLE(); @@ -809,7 +834,7 @@ MaybeLocal ModuleWrap::ResolveModuleCallback( static MaybeLocal ImportModuleDynamically( Local context, - Local host_defined_options, + Local host_defined_options, Local resource_name, Local specifier, Local import_attributes) { @@ -995,7 +1020,7 @@ void ModuleWrap::CreateCachedData(const FunctionCallbackInfo& args) { Local module = obj->module_.Get(isolate); - CHECK_LT(module->GetStatus(), v8::Module::Status::kEvaluating); + CHECK_LT(module->GetStatus(), Module::Status::kEvaluating); Local unbound_module_script = module->GetUnboundModuleScript(); diff --git a/src/node.cc b/src/node.cc index 26f94be94bae70..480681d0b02ff8 100644 --- a/src/node.cc +++ b/src/node.cc @@ -320,7 +320,8 @@ MaybeLocal StartExecution(Environment* env, StartExecutionCallback cb) { CHECK(!env->isolate_data()->is_building_snapshot()); #ifndef DISABLE_SINGLE_EXECUTABLE_APPLICATION - if (sea::IsSingleExecutable()) { + // Snapshot in SEA is only loaded for the main thread. + if (sea::IsSingleExecutable() && env->is_main_thread()) { sea::SeaResource sea = sea::FindSingleExecutableResource(); // The SEA preparation blob building process should already enforce this, // this check is just here to guard against the unlikely case where @@ -342,6 +343,9 @@ MaybeLocal StartExecution(Environment* env, StartExecutionCallback cb) { // move the pre-execution part into a different file that can be // reused when dealing with user-defined main functions. if (!env->snapshot_deserialize_main().IsEmpty()) { + // Custom worker snapshot is not supported yet, + // so workers can't have deserialize main functions. + CHECK(env->is_main_thread()); return env->RunSnapshotDeserializeMain(); } @@ -993,7 +997,7 @@ InitializeOncePerProcessInternal(const std::vector& args, if (!(flags & ProcessInitializationFlags::kNoParseGlobalDebugVariables)) { // Initialized the enabled list for Debug() calls with system // environment variables. - per_process::enabled_debug_list.Parse(per_process::system_environment); + per_process::enabled_debug_list.Parse(nullptr); } PlatformInit(flags); diff --git a/src/node.h b/src/node.h index 643f964115b0ae..06304fbdda9c32 100644 --- a/src/node.h +++ b/src/node.h @@ -1524,6 +1524,7 @@ class NODE_EXTERN AsyncResource { private: Environment* env_; v8::Global resource_; + v8::Global context_frame_; async_context async_context_; }; diff --git a/src/node_api.cc b/src/node_api.cc index cccb2fd0a17f3a..1638d096969826 100644 --- a/src/node_api.cc +++ b/src/node_api.cc @@ -93,11 +93,11 @@ void node_napi_env__::CallbackIntoModule(T&& call) { return; } node::Environment* node_env = env->node_env(); - // If the module api version is less than NAPI_VERSION_EXPERIMENTAL, - // and the option --force-node-api-uncaught-exceptions-policy is not - // specified, emit a warning about the uncaught exception instead of - // triggering uncaught exception event. - if (env->module_api_version < NAPI_VERSION_EXPERIMENTAL && + // If the module api version is less than 10, and the option + // --force-node-api-uncaught-exceptions-policy is not specified, emit a + // warning about the uncaught exception instead of triggering the uncaught + // exception event. + if (env->module_api_version < 10 && !node_env->options()->force_node_api_uncaught_exceptions_policy && !enforceUncaughtExceptionPolicy) { ProcessEmitDeprecationWarning( @@ -678,11 +678,13 @@ node::addon_context_register_func get_node_api_context_register_func( const char* module_name, int32_t module_api_version) { static_assert( - NODE_API_SUPPORTED_VERSION_MAX == 9, + NODE_API_SUPPORTED_VERSION_MAX == 10, "New version of Node-API requires adding another else-if statement below " "for the new version and updating this assert condition."); if (module_api_version == 9) { return node_api_context_register_func<9>; + } else if (module_api_version == 10) { + return node_api_context_register_func<10>; } else if (module_api_version == NAPI_VERSION_EXPERIMENTAL) { return node_api_context_register_func; } else if (module_api_version >= NODE_API_SUPPORTED_VERSION_MIN && diff --git a/src/node_api.h b/src/node_api.h index 718f7541002eb9..35e5c3e49dd426 100644 --- a/src/node_api.h +++ b/src/node_api.h @@ -90,9 +90,6 @@ EXTERN_C_START // Deprecated. Replaced by symbol-based registration defined by NAPI_MODULE // and NAPI_MODULE_INIT macros. -#if defined(__cplusplus) && __cplusplus >= 201402L -[[deprecated]] -#endif NAPI_EXTERN void NAPI_CDECL napi_module_register(napi_module* mod); @@ -136,8 +133,7 @@ napi_create_external_buffer(napi_env env, napi_value* result); #endif // NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED -#ifdef NAPI_EXPERIMENTAL -#define NODE_API_EXPERIMENTAL_HAS_CREATE_BUFFER_FROM_ARRAYBUFFER +#if NAPI_VERSION >= 10 NAPI_EXTERN napi_status NAPI_CDECL node_api_create_buffer_from_arraybuffer(napi_env env, @@ -145,7 +141,7 @@ node_api_create_buffer_from_arraybuffer(napi_env env, size_t byte_offset, size_t byte_length, napi_value* result); -#endif // NAPI_EXPERIMENTAL +#endif // NAPI_VERSION >= 10 NAPI_EXTERN napi_status NAPI_CDECL napi_create_buffer_copy(napi_env env, size_t length, diff --git a/src/node_builtins.cc b/src/node_builtins.cc index 1bec44f6f29b0b..791c16ce3942d7 100644 --- a/src/node_builtins.cc +++ b/src/node_builtins.cc @@ -119,6 +119,8 @@ BuiltinLoader::BuiltinCategories BuiltinLoader::GetBuiltinCategories() const { builtin_categories.cannot_be_required = std::set { #if !HAVE_INSPECTOR "inspector", "inspector/promises", "internal/util/inspector", + "internal/inspector/network", "internal/inspector/network_http", + "internal/inspector_async_hook", "internal/inspector_network_tracking", #endif // !HAVE_INSPECTOR #if !NODE_USE_V8_PLATFORM || !defined(NODE_HAVE_I18N_SUPPORT) @@ -133,7 +135,8 @@ BuiltinLoader::BuiltinCategories BuiltinLoader::GetBuiltinCategories() const { "internal/streams/lazy_transform", #endif // !HAVE_OPENSSL #if !NODE_OPENSSL_HAS_QUIC - "internal/quic/quic", + "internal/quic/quic", "internal/quic/symbols", "internal/quic/stats", + "internal/quic/state", #endif // !NODE_OPENSSL_HAS_QUIC "sqlite", // Experimental. "sys", // Deprecated. @@ -440,9 +443,6 @@ MaybeLocal BuiltinLoader::CompileAndCall(Local context, const char* id, Realm* realm) { Isolate* isolate = context->GetIsolate(); - // Arguments must match the parameters specified in - // BuiltinLoader::LookupAndCompile(). - std::vector> arguments; // Detects parameters of the scripts based on module ids. // internal/bootstrap/realm: process, getLinkedBinding, // getInternalBinding, primordials @@ -457,30 +457,33 @@ MaybeLocal BuiltinLoader::CompileAndCall(Local context, .ToLocal(&get_internal_binding)) { return MaybeLocal(); } - arguments = {realm->process_object(), - get_linked_binding, - get_internal_binding, - realm->primordials()}; + Local arguments[] = {realm->process_object(), + get_linked_binding, + get_internal_binding, + realm->primordials()}; + return CompileAndCall( + context, id, arraysize(arguments), &arguments[0], realm); } else if (strncmp(id, "internal/main/", strlen("internal/main/")) == 0 || strncmp(id, "internal/bootstrap/", strlen("internal/bootstrap/")) == 0) { // internal/main/*, internal/bootstrap/*: process, require, // internalBinding, primordials - arguments = {realm->process_object(), - realm->builtin_module_require(), - realm->internal_binding_loader(), - realm->primordials()}; - } else { - // This should be invoked with the other CompileAndCall() methods, as - // we are unable to generate the arguments. - // Currently there are two cases: - // internal/per_context/*: the arguments are generated in - // InitializePrimordials() - // all the other cases: the arguments are generated in the JS-land loader. - UNREACHABLE(); - } - return CompileAndCall(context, id, arguments.size(), arguments.data(), realm); + Local arguments[] = {realm->process_object(), + realm->builtin_module_require(), + realm->internal_binding_loader(), + realm->primordials()}; + return CompileAndCall( + context, id, arraysize(arguments), &arguments[0], realm); + } + + // This should be invoked with the other CompileAndCall() methods, as + // we are unable to generate the arguments. + // Currently there are two cases: + // internal/per_context/*: the arguments are generated in + // InitializePrimordials() + // all the other cases: the arguments are generated in the JS-land loader. + UNREACHABLE(); } MaybeLocal BuiltinLoader::CompileAndCall(Local context, diff --git a/src/node_builtins.h b/src/node_builtins.h index 1cb85b9058d065..a73de23a1debfd 100644 --- a/src/node_builtins.h +++ b/src/node_builtins.h @@ -71,7 +71,7 @@ using BuiltinSourceMap = std::map; using BuiltinCodeCacheMap = std::unordered_map; -// Generated by tools/js2c.py as node_javascript.cc +// Generated by tools/js2c.cc as node_javascript.cc void RegisterExternalReferencesForInternalizedBuiltinCode( ExternalReferenceRegistry* registry); @@ -134,7 +134,7 @@ class NODE_EXTERN_PRIVATE BuiltinLoader { // Only allow access from friends. friend class CodeCacheBuilder; - // Generated by tools/js2c.py as node_javascript.cc + // Generated by tools/js2c.cc as node_javascript.cc void LoadJavaScriptSource(); // Loads data into source_ UnionBytes GetConfig(); // Return data for config.gypi diff --git a/src/node_contextify.cc b/src/node_contextify.cc index 3aa7986bf17e26..77d35675827c67 100644 --- a/src/node_contextify.cc +++ b/src/node_contextify.cc @@ -59,6 +59,7 @@ using v8::Isolate; using v8::JustVoid; using v8::KeyCollectionMode; using v8::Local; +using v8::LocalVector; using v8::Maybe; using v8::MaybeLocal; using v8::MeasureMemoryExecution; @@ -831,7 +832,7 @@ void ContextifyContext::IndexedPropertyEnumeratorCallback( } // Filter out non-number property names. - std::vector> indices; + LocalVector indices(isolate); for (uint32_t i = 0; i < properties->Length(); i++) { Local prop = properties_vec[i].Get(isolate); if (!prop->IsNumber()) { @@ -1790,20 +1791,20 @@ static void CompileFunctionForCJSLoader( } Local undefined = v8::Undefined(isolate); - std::vector> names = { + Local names[] = { env->cached_data_rejected_string(), env->source_map_url_string(), env->function_string(), FIXED_ONE_BYTE_STRING(isolate, "canParseAsESM"), }; - std::vector> values = { + Local values[] = { Boolean::New(isolate, cache_rejected), fn.IsEmpty() ? undefined : fn->GetScriptOrigin().SourceMapUrl(), fn.IsEmpty() ? undefined : fn.As(), Boolean::New(isolate, can_parse_as_esm), }; Local result = Object::New( - isolate, v8::Null(isolate), names.data(), values.data(), names.size()); + isolate, v8::Null(isolate), &names[0], &values[0], arraysize(names)); args.GetReturnValue().Set(result); } diff --git a/src/node_credentials.cc b/src/node_credentials.cc index 2a7f2e878bc953..0152f6269c83ef 100644 --- a/src/node_credentials.cc +++ b/src/node_credentials.cc @@ -72,9 +72,7 @@ static bool HasOnly(int capability) { // process only has the capability CAP_NET_BIND_SERVICE set. If the current // process does not have any capabilities set and the process is running as // setuid root then lookup will not be allowed. -bool SafeGetenv(const char* key, - std::string* text, - std::shared_ptr env_vars) { +bool SafeGetenv(const char* key, std::string* text, Environment* env) { #if !defined(__CloudABI__) && !defined(_WIN32) #if defined(__linux__) if ((!HasOnly(CAP_NET_BIND_SERVICE) && linux_at_secure()) || @@ -87,14 +85,31 @@ bool SafeGetenv(const char* key, // Fallback to system environment which reads the real environment variable // through uv_os_getenv. - if (env_vars == nullptr) { + std::shared_ptr env_vars; + if (env == nullptr) { env_vars = per_process::system_environment; + } else { + env_vars = env->env_vars(); } std::optional value = env_vars->Get(key); - if (!value.has_value()) return false; - *text = value.value(); - return true; + + bool has_env = value.has_value(); + if (has_env) { + *text = value.value(); + } + + auto options = + (env != nullptr ? env->options() + : per_process::cli_options->per_isolate->per_env); + + if (options->trace_env) { + fprintf(stderr, "[--trace-env] get environment variable \"%s\"\n", key); + + PrintTraceEnvStack(options); + } + + return has_env; } static void SafeGetenv(const FunctionCallbackInfo& args) { @@ -103,7 +118,7 @@ static void SafeGetenv(const FunctionCallbackInfo& args) { Isolate* isolate = env->isolate(); Utf8Value strenvtag(isolate, args[0]); std::string text; - if (!SafeGetenv(*strenvtag, &text, env->env_vars())) return; + if (!SafeGetenv(*strenvtag, &text, env)) return; Local result = ToV8Value(isolate->GetCurrentContext(), text).ToLocalChecked(); args.GetReturnValue().Set(result); @@ -117,7 +132,7 @@ static void GetTempDir(const FunctionCallbackInfo& args) { // Let's wrap SafeGetEnv since it returns true for empty string. auto get_env = [&dir, &env](std::string_view key) { - USE(SafeGetenv(key.data(), &dir, env->env_vars())); + USE(SafeGetenv(key.data(), &dir, env)); return !dir.empty(); }; diff --git a/src/node_debug.cc b/src/node_debug.cc index d87cdf61d2d92d..0f254b1fbfe820 100644 --- a/src/node_debug.cc +++ b/src/node_debug.cc @@ -12,8 +12,7 @@ #include #endif // DEBUG -namespace node { -namespace debug { +namespace node::debug { #ifdef DEBUG using v8::Context; @@ -41,7 +40,7 @@ void GetV8FastApiCallCount(const FunctionCallbackInfo& args) { return; } Utf8Value utf8_key(env->isolate(), args[0]); - args.GetReturnValue().Set(GetV8FastApiCallCount(utf8_key.ToString())); + args.GetReturnValue().Set(GetV8FastApiCallCount(utf8_key.ToStringView())); } void SlowIsEven(const FunctionCallbackInfo& args) { @@ -93,8 +92,7 @@ void Initialize(Local target, } #endif // DEBUG -} // namespace debug -} // namespace node +} // namespace node::debug #ifdef DEBUG NODE_BINDING_CONTEXT_AWARE_INTERNAL(debug, node::debug::Initialize) diff --git a/src/node_dotenv.cc b/src/node_dotenv.cc index f594df875d7a0c..049f5cfcb77b9c 100644 --- a/src/node_dotenv.cc +++ b/src/node_dotenv.cc @@ -182,7 +182,10 @@ void Dotenv::ParseContent(const std::string_view input) { } store_.insert_or_assign(std::string(key), multi_line_value); - content.remove_prefix(content.find('\n', closing_quote + 1)); + auto newline = content.find('\n', closing_quote + 1); + if (newline != std::string_view::npos) { + content.remove_prefix(newline); + } continue; } } @@ -210,7 +213,10 @@ void Dotenv::ParseContent(const std::string_view input) { store_.insert_or_assign(std::string(key), value); // Select the first newline after the closing quotation mark // since there could be newline characters inside the value. - content.remove_prefix(content.find('\n', closing_quote + 1)); + auto newline = content.find('\n', closing_quote + 1); + if (newline != std::string_view::npos) { + content.remove_prefix(newline); + } } } else { // Regular key value pair. diff --git a/src/node_env_var.cc b/src/node_env_var.cc index d19d11dc714e08..93dff5f1a9c649 100644 --- a/src/node_env_var.cc +++ b/src/node_env_var.cc @@ -21,6 +21,7 @@ using v8::Intercepted; using v8::Isolate; using v8::JustVoid; using v8::Local; +using v8::LocalVector; using v8::Maybe; using v8::MaybeLocal; using v8::Name; @@ -273,7 +274,7 @@ void MapKVStore::Delete(Isolate* isolate, Local key) { Local MapKVStore::Enumerate(Isolate* isolate) const { Mutex::ScopedLock lock(mutex_); - std::vector> values; + LocalVector values(isolate); values.reserve(map_.size()); for (const auto& pair : map_) { values.emplace_back( @@ -337,6 +338,19 @@ Maybe KVStore::AssignToObject(v8::Isolate* isolate, return JustVoid(); } +void PrintTraceEnvStack(Environment* env) { + PrintTraceEnvStack(env->options()); +} + +void PrintTraceEnvStack(std::shared_ptr options) { + if (options->trace_env_native_stack) { + DumpNativeBacktrace(stderr); + } + if (options->trace_env_js_stack) { + DumpJavaScriptBacktrace(stderr); + } +} + static Intercepted EnvGetter(Local property, const PropertyCallbackInfo& info) { Environment* env = Environment::GetCurrent(info); @@ -348,7 +362,18 @@ static Intercepted EnvGetter(Local property, CHECK(property->IsString()); MaybeLocal value_string = env->env_vars()->Get(env->isolate(), property.As()); - if (!value_string.IsEmpty()) { + + bool has_env = !value_string.IsEmpty(); + if (env->options()->trace_env) { + Utf8Value key(env->isolate(), property.As()); + fprintf(stderr, + "[--trace-env] get environment variable \"%.*s\"\n", + static_cast(key.length()), + key.out()); + PrintTraceEnvStack(env); + } + + if (has_env) { info.GetReturnValue().Set(value_string.ToLocalChecked()); return Intercepted::kYes; } @@ -386,6 +411,14 @@ static Intercepted EnvSetter(Local property, } env->env_vars()->Set(env->isolate(), key, value_string); + if (env->options()->trace_env) { + Utf8Value key_utf8(env->isolate(), key); + fprintf(stderr, + "[--trace-env] set environment variable \"%.*s\"\n", + static_cast(key_utf8.length()), + key_utf8.out()); + PrintTraceEnvStack(env); + } return Intercepted::kYes; } @@ -396,7 +429,18 @@ static Intercepted EnvQuery(Local property, CHECK(env->has_run_bootstrapping_code()); if (property->IsString()) { int32_t rc = env->env_vars()->Query(env->isolate(), property.As()); - if (rc != -1) { + bool has_env = (rc != -1); + + if (env->options()->trace_env) { + Utf8Value key_utf8(env->isolate(), property.As()); + fprintf(stderr, + "[--trace-env] query environment variable \"%.*s\": %s\n", + static_cast(key_utf8.length()), + key_utf8.out(), + has_env ? "is set" : "is not set"); + PrintTraceEnvStack(env); + } + if (has_env) { // Return attributes for the property. info.GetReturnValue().Set(v8::None); return Intercepted::kYes; @@ -411,6 +455,15 @@ static Intercepted EnvDeleter(Local property, CHECK(env->has_run_bootstrapping_code()); if (property->IsString()) { env->env_vars()->Delete(env->isolate(), property.As()); + + if (env->options()->trace_env) { + Utf8Value key_utf8(env->isolate(), property.As()); + fprintf(stderr, + "[--trace-env] delete environment variable \"%.*s\"\n", + static_cast(key_utf8.length()), + key_utf8.out()); + PrintTraceEnvStack(env); + } } // process.env never has non-configurable properties, so always @@ -423,6 +476,12 @@ static void EnvEnumerator(const PropertyCallbackInfo& info) { Environment* env = Environment::GetCurrent(info); CHECK(env->has_run_bootstrapping_code()); + if (env->options()->trace_env) { + fprintf(stderr, "[--trace-env] enumerate environment variables\n"); + + PrintTraceEnvStack(env); + } + info.GetReturnValue().Set( env->env_vars()->Enumerate(env->isolate())); } diff --git a/src/node_errors.h b/src/node_errors.h index d18e9439a2970a..a33177a5d8e7e6 100644 --- a/src/node_errors.h +++ b/src/node_errors.h @@ -91,6 +91,7 @@ void OOMErrorHandler(const char* location, const v8::OOMDetails& details); V(ERR_INVALID_THIS, TypeError) \ V(ERR_INVALID_URL, TypeError) \ V(ERR_INVALID_URL_SCHEME, TypeError) \ + V(ERR_LOAD_SQLITE_EXTENSION, Error) \ V(ERR_MEMORY_ALLOCATION_FAILED, Error) \ V(ERR_MESSAGE_TARGET_CONTEXT_UNAVAILABLE, Error) \ V(ERR_MISSING_ARGS, TypeError) \ @@ -191,6 +192,7 @@ ERRORS_WITH_CODE(V) V(ERR_INVALID_STATE, "Invalid state") \ V(ERR_INVALID_THIS, "Value of \"this\" is the wrong type") \ V(ERR_INVALID_URL_SCHEME, "The URL must be of scheme file:") \ + V(ERR_LOAD_SQLITE_EXTENSION, "Failed to load SQLite extension") \ V(ERR_MEMORY_ALLOCATION_FAILED, "Failed to allocate memory") \ V(ERR_OSSL_EVP_INVALID_DIGEST, "Invalid digest used") \ V(ERR_MESSAGE_TARGET_CONTEXT_UNAVAILABLE, \ diff --git a/src/node_file.cc b/src/node_file.cc index 5a50aacb1b939d..6d097904f67b89 100644 --- a/src/node_file.cc +++ b/src/node_file.cc @@ -73,6 +73,7 @@ using v8::Integer; using v8::Isolate; using v8::JustVoid; using v8::Local; +using v8::LocalVector; using v8::Maybe; using v8::MaybeLocal; using v8::Nothing; @@ -902,8 +903,8 @@ void AfterScanDir(uv_fs_t* req) { Local error; int r; - std::vector> name_v; - std::vector> type_v; + LocalVector name_v(isolate); + LocalVector type_v(isolate); const bool with_file_types = req_wrap->with_file_types(); @@ -1986,8 +1987,29 @@ static void ReadDir(const FunctionCallbackInfo& args) { BufferValue path(isolate, args[0]); CHECK_NOT_NULL(*path); +#ifdef _WIN32 + // On Windows, some API functions accept paths with trailing slashes, + // while others do not. This code checks if the input path ends with + // a slash (either '/' or '\\') and, if so, ensures that the processed + // path also ends with a trailing backslash ('\\'). + bool slashCheck = false; + if (path.ToStringView().ends_with("/") || + path.ToStringView().ends_with("\\")) { + slashCheck = true; + } +#endif + ToNamespacedPath(env, &path); +#ifdef _WIN32 + if (slashCheck) { + size_t new_length = path.length() + 1; + path.AllocateSufficientStorage(new_length + 1); + path.SetLengthAndZeroTerminate(new_length); + path.out()[new_length - 1] = '\\'; + } +#endif + const enum encoding encoding = ParseEncoding(isolate, args[1], UTF8); bool with_types = args[2]->IsTrue(); @@ -2024,8 +2046,8 @@ static void ReadDir(const FunctionCallbackInfo& args) { } int r; - std::vector> name_v; - std::vector> type_v; + LocalVector name_v(isolate); + LocalVector type_v(isolate); for (;;) { uv_dirent_t ent; diff --git a/src/node_http2.cc b/src/node_http2.cc index 593c8b5f07a2a4..91e9011cd91c6a 100644 --- a/src/node_http2.cc +++ b/src/node_http2.cc @@ -37,6 +37,7 @@ using v8::HandleScope; using v8::Integer; using v8::Isolate; using v8::Local; +using v8::LocalVector; using v8::MaybeLocal; using v8::NewStringType; using v8::Number; @@ -803,13 +804,15 @@ void Http2Session::Close(uint32_t code, bool socket_closed) { CHECK_EQ(nghttp2_session_terminate_session(session_.get(), code), 0); SendPendingData(); } else if (stream_ != nullptr) { + // so that the previous listener of the socket, typically, JS code of a + // (tls) socket will be notified of any activity later stream_->RemoveStreamListener(this); } set_destroyed(); // If we are writing we will get to make the callback in OnStreamAfterWrite. - if (!is_write_in_progress()) { + if (!is_write_in_progress() || !stream_) { Debug(this, "make done session callback"); HandleScope scope(env()->isolate()); MakeCallback(env()->ondone_string(), 0, nullptr); @@ -1314,11 +1317,7 @@ int Http2Session::OnDataChunkReceived(nghttp2_session* handle, } else { memcpy(buf.base, data, avail); } - if (buf.base == nullptr) [[likely]] { - buf.base = reinterpret_cast(const_cast(data)); - } else { - memcpy(buf.base, data, avail); - } + data += avail; len -= avail; stream->EmitRead(avail, buf); @@ -1608,7 +1607,7 @@ void Http2Session::HandleOriginFrame(const nghttp2_frame* frame) { nghttp2_ext_origin* origin = static_cast(ext.payload); size_t nov = origin->nov; - std::vector> origin_v(nov); + LocalVector origin_v(isolate, nov); for (size_t i = 0; i < nov; ++i) { const nghttp2_origin_entry& entry = origin->ov[i]; diff --git a/src/node_http_parser.cc b/src/node_http_parser.cc index dfb278151c9566..6ea4aa826e1c30 100644 --- a/src/node_http_parser.cc +++ b/src/node_http_parser.cc @@ -63,6 +63,7 @@ using v8::Int32; using v8::Integer; using v8::Isolate; using v8::Local; +using v8::LocalVector; using v8::MaybeLocal; using v8::Number; using v8::Object; @@ -1091,7 +1092,7 @@ void ConnectionsList::All(const FunctionCallbackInfo& args) { ASSIGN_OR_RETURN_UNWRAP(&list, args.This()); - std::vector> result; + LocalVector result(isolate); result.reserve(list->all_connections_.size()); for (auto parser : list->all_connections_) { result.emplace_back(parser->object()); @@ -1108,7 +1109,7 @@ void ConnectionsList::Idle(const FunctionCallbackInfo& args) { ASSIGN_OR_RETURN_UNWRAP(&list, args.This()); - std::vector> result; + LocalVector result(isolate); result.reserve(list->all_connections_.size()); for (auto parser : list->all_connections_) { if (parser->last_message_start_ == 0) { @@ -1127,7 +1128,7 @@ void ConnectionsList::Active(const FunctionCallbackInfo& args) { ASSIGN_OR_RETURN_UNWRAP(&list, args.This()); - std::vector> result; + LocalVector result(isolate); result.reserve(list->active_connections_.size()); for (auto parser : list->active_connections_) { result.emplace_back(parser->object()); @@ -1176,7 +1177,7 @@ void ConnectionsList::Expired(const FunctionCallbackInfo& args) { auto iter = list->active_connections_.begin(); auto end = list->active_connections_.end(); - std::vector> result; + LocalVector result(isolate); result.reserve(list->active_connections_.size()); while (iter != end) { Parser* parser = *iter; @@ -1335,8 +1336,8 @@ void CreatePerContextProperties(Local target, BindingData* const binding_data = realm->AddBindingData(target); if (binding_data == nullptr) return; - std::vector> methods_val; - std::vector> all_methods_val; + LocalVector methods_val(isolate); + LocalVector all_methods_val(isolate); #define V(num, name, string) \ methods_val.push_back(FIXED_ONE_BYTE_STRING(isolate, #string)); diff --git a/src/node_internals.h b/src/node_internals.h index 85b666e11f5654..000ba16303740d 100644 --- a/src/node_internals.h +++ b/src/node_internals.h @@ -321,11 +321,12 @@ class ThreadPoolWork { #endif // defined(__POSIX__) && !defined(__ANDROID__) && !defined(__CloudABI__) namespace credentials { -bool SafeGetenv(const char* key, - std::string* text, - std::shared_ptr env_vars = nullptr); +bool SafeGetenv(const char* key, std::string* text, Environment* env = nullptr); } // namespace credentials +void PrintTraceEnvStack(Environment* env); +void PrintTraceEnvStack(std::shared_ptr options); + void DefineZlibConstants(v8::Local target); v8::Isolate* NewIsolate(v8::Isolate::CreateParams* params, uv_loop_t* event_loop, diff --git a/src/node_modules.cc b/src/node_modules.cc index 94ed9bc4b3c157..4b522a91323c9f 100644 --- a/src/node_modules.cc +++ b/src/node_modules.cc @@ -25,6 +25,7 @@ using v8::FunctionCallbackInfo; using v8::HandleScope; using v8::Isolate; using v8::Local; +using v8::LocalVector; using v8::NewStringType; using v8::Object; using v8::ObjectTemplate; @@ -477,11 +478,11 @@ void EnableCompileCache(const FunctionCallbackInfo& args) { } Utf8Value value(isolate, args[0]); CompileCacheEnableResult result = env->EnableCompileCache(*value); - std::vector> values = { + Local values[] = { v8::Integer::New(isolate, static_cast(result.status)), ToV8Value(context, result.message).ToLocalChecked(), ToV8Value(context, result.cache_directory).ToLocalChecked()}; - args.GetReturnValue().Set(Array::New(isolate, values.data(), values.size())); + args.GetReturnValue().Set(Array::New(isolate, &values[0], arraysize(values))); } void GetCompileCacheDir(const FunctionCallbackInfo& args) { @@ -522,8 +523,8 @@ void BindingData::CreatePerContextProperties(Local target, Realm* realm = Realm::GetCurrent(context); realm->AddBindingData(target); - std::vector> compile_cache_status_values; Isolate* isolate = context->GetIsolate(); + LocalVector compile_cache_status_values(isolate); #define V(status) \ compile_cache_status_values.push_back( \ diff --git a/src/node_options.cc b/src/node_options.cc index 4b36a516c80121..eb04af9dabb4d8 100644 --- a/src/node_options.cc +++ b/src/node_options.cc @@ -23,6 +23,7 @@ using v8::FunctionCallbackInfo; using v8::Integer; using v8::Isolate; using v8::Local; +using v8::LocalVector; using v8::Map; using v8::Name; using v8::Null; @@ -108,15 +109,12 @@ void PerIsolateOptions::CheckOptions(std::vector* errors, void EnvironmentOptions::CheckOptions(std::vector* errors, std::vector* argv) { if (!input_type.empty()) { - if (input_type != "commonjs" && input_type != "module") { - errors->push_back("--input-type must be \"module\" or \"commonjs\""); - } - } - - if (!type.empty()) { - if (type != "commonjs" && type != "module") { - errors->push_back("--experimental-default-type must be " - "\"module\" or \"commonjs\""); + if (input_type != "commonjs" && input_type != "module" && + input_type != "commonjs-typescript" && + input_type != "module-typescript") { + errors->push_back( + "--input-type must be \"module\"," + "\"commonjs\", \"module-typescript\" or \"commonjs-typescript\""); } } @@ -142,12 +140,17 @@ void EnvironmentOptions::CheckOptions(std::vector* errors, errors->push_back("--heapsnapshot-near-heap-limit must not be negative"); } + if (!trace_require_module.empty() && trace_require_module != "all" && + trace_require_module != "no-node-modules") { + errors->push_back("invalid value for --trace-require-module"); + } + if (test_runner) { if (test_isolation == "none") { debug_options_.allow_attaching_debugger = true; } else { if (test_isolation != "process") { - errors->push_back("invalid value for --experimental-test-isolation"); + errors->push_back("invalid value for --test-isolation"); } #ifndef ALLOW_ATTACHING_DEBUGGER_IN_TEST_RUNNER @@ -411,6 +414,10 @@ EnvironmentOptionsParser::EnvironmentOptionsParser() { "Treat the entrypoint as a URL", &EnvironmentOptions::entry_is_url, kAllowedInEnvvar); + AddOption("--experimental-addon-modules", + "experimental import support for addons", + &EnvironmentOptions::experimental_addon_modules, + kAllowedInEnvvar); AddOption("--experimental-abortcontroller", "", NoOp{}, kAllowedInEnvvar); AddOption("--experimental-eventsource", "experimental EventSource API", @@ -427,7 +434,8 @@ EnvironmentOptionsParser::EnvironmentOptionsParser() { AddOption("--experimental-sqlite", "experimental node:sqlite module", &EnvironmentOptions::experimental_sqlite, - kAllowedInEnvvar); + kAllowedInEnvvar, + true); AddOption("--experimental-webstorage", "experimental Web Storage API", &EnvironmentOptions::experimental_webstorage, @@ -457,9 +465,9 @@ EnvironmentOptionsParser::EnvironmentOptionsParser() { "experimental ES Module import.meta.resolve() parentURL support", &EnvironmentOptions::experimental_import_meta_resolve, kAllowedInEnvvar); - AddOption("--experimental-permission", + AddOption("--permission", "enable the permission system", - &EnvironmentOptions::experimental_permission, + &EnvironmentOptions::permission, kAllowedInEnvvar, false); AddOption("--allow-fs-read", @@ -684,16 +692,16 @@ EnvironmentOptionsParser::EnvironmentOptionsParser() { "the line coverage minimum threshold", &EnvironmentOptions::test_coverage_lines, kAllowedInEnvvar); - - AddOption("--experimental-test-isolation", + AddOption("--test-isolation", "configures the type of test isolation used in the test runner", - &EnvironmentOptions::test_isolation); + &EnvironmentOptions::test_isolation, + kAllowedInEnvvar); + // TODO(cjihrig): Remove this alias in a semver major. + AddAlias("--experimental-test-isolation", "--test-isolation"); AddOption("--experimental-test-module-mocks", "enable module mocking in the test runner", &EnvironmentOptions::test_runner_module_mocks); - AddOption("--experimental-test-snapshots", - "enable snapshot testing in the test runner", - &EnvironmentOptions::test_runner_snapshots); + AddOption("--experimental-test-snapshots", "", NoOp{}); AddOption("--test-name-pattern", "run tests whose name matches this regular expression", &EnvironmentOptions::test_name_pattern, @@ -761,10 +769,31 @@ EnvironmentOptionsParser::EnvironmentOptionsParser() { "show stack traces on promise initialization and resolution", &EnvironmentOptions::trace_promises, kAllowedInEnvvar); - AddOption("--experimental-default-type", - "set module system to use by default", - &EnvironmentOptions::type, + + AddOption("--trace-env", + "Print accesses to the environment variables", + &EnvironmentOptions::trace_env, + kAllowedInEnvvar); + Implies("--trace-env-js-stack", "--trace-env"); + Implies("--trace-env-native-stack", "--trace-env"); + AddOption("--trace-env-js-stack", + "Print accesses to the environment variables and the JavaScript " + "stack trace", + &EnvironmentOptions::trace_env_js_stack, kAllowedInEnvvar); + AddOption( + "--trace-env-native-stack", + "Print accesses to the environment variables and the native stack trace", + &EnvironmentOptions::trace_env_native_stack, + kAllowedInEnvvar); + + AddOption( + "--trace-require-module", + "Print access to require(esm). Options are 'all' (print all usage) and " + "'no-node-modules' (excluding usage from the node_modules folder)", + &EnvironmentOptions::trace_require_module, + kAllowedInEnvvar); + AddOption("--extra-info-on-fatal-exception", "hide extra information on fatal exception that causes exit", &EnvironmentOptions::extra_info_on_fatal_exception, @@ -828,7 +857,8 @@ EnvironmentOptionsParser::EnvironmentOptionsParser() { AddOption("--experimental-strip-types", "Experimental type-stripping for TypeScript files.", &EnvironmentOptions::experimental_strip_types, - kAllowedInEnvvar); + kAllowedInEnvvar, + true); AddOption("--experimental-transform-types", "enable transformation of TypeScript-only" "syntax into JavaScript code", @@ -1282,8 +1312,8 @@ void GetCLIOptionsValues(const FunctionCallbackInfo& args) { Mutex::ScopedLock lock(per_process::cli_options_mutex); IterateCLIOptionsScope s(env); - std::vector> option_names; - std::vector> option_values; + LocalVector option_names(isolate); + LocalVector option_values(isolate); option_names.reserve(_ppop_instance.options_.size() * 2); option_values.reserve(_ppop_instance.options_.size() * 2); diff --git a/src/node_options.h b/src/node_options.h index a3521e9aea88b1..8b9f8a825e61c4 100644 --- a/src/node_options.h +++ b/src/node_options.h @@ -120,10 +120,11 @@ class EnvironmentOptions : public Options { bool require_module = true; std::string dns_result_order; bool enable_source_maps = false; + bool experimental_addon_modules = false; bool experimental_eventsource = false; bool experimental_fetch = true; bool experimental_websocket = true; - bool experimental_sqlite = false; + bool experimental_sqlite = true; bool experimental_webstorage = false; std::string localstorage_file; bool experimental_global_navigator = true; @@ -131,9 +132,8 @@ class EnvironmentOptions : public Options { bool experimental_wasm_modules = false; bool experimental_import_meta_resolve = false; std::string input_type; // Value of --input-type - std::string type; // Value of --experimental-default-type bool entry_is_url = false; - bool experimental_permission = false; + bool permission = false; std::vector allow_fs_read; std::vector allow_fs_write; bool allow_addons = false; @@ -189,7 +189,6 @@ class EnvironmentOptions : public Options { uint64_t test_coverage_functions = 0; uint64_t test_coverage_lines = 0; bool test_runner_module_mocks = false; - bool test_runner_snapshots = false; bool test_runner_update_snapshots = false; std::vector test_name_pattern; std::vector test_reporter; @@ -209,6 +208,10 @@ class EnvironmentOptions : public Options { bool trace_uncaught = false; bool trace_warnings = false; bool trace_promises = false; + bool trace_env = false; + bool trace_env_js_stack = false; + bool trace_env_native_stack = false; + std::string trace_require_module; bool extra_info_on_fatal_exception = true; std::string unhandled_rejections; std::vector userland_loaders; @@ -244,7 +247,7 @@ class EnvironmentOptions : public Options { std::vector preload_esm_modules; - bool experimental_strip_types = false; + bool experimental_strip_types = true; bool experimental_transform_types = false; std::vector user_argv; diff --git a/src/node_os.cc b/src/node_os.cc index ce2af8d83b7443..edfe34f330f73c 100644 --- a/src/node_os.cc +++ b/src/node_os.cc @@ -48,6 +48,7 @@ using v8::Int32; using v8::Integer; using v8::Isolate; using v8::Local; +using v8::LocalVector; using v8::MaybeLocal; using v8::NewStringType; using v8::Null; @@ -112,7 +113,7 @@ static void GetCPUInfo(const FunctionCallbackInfo& args) { // assemble them into objects in JS than to call Object::Set() repeatedly // The array is in the format // [model, speed, (5 entries of cpu_times), model2, speed2, ...] - std::vector> result; + LocalVector result(isolate); result.reserve(count * 7); for (int i = 0; i < count; i++) { uv_cpu_info_t* ci = cpu_infos + i; @@ -193,7 +194,7 @@ static void GetInterfaceAddresses(const FunctionCallbackInfo& args) { } Local no_scope_id = Integer::New(isolate, -1); - std::vector> result; + LocalVector result(isolate); result.reserve(count * 7); for (i = 0; i < count; i++) { const char* const raw_name = interfaces[i].name; diff --git a/src/node_process.h b/src/node_process.h index d4f1c0d45dec50..461a92161ab2e5 100644 --- a/src/node_process.h +++ b/src/node_process.h @@ -24,25 +24,27 @@ void CreateEnvProxyTemplate(IsolateData* isolate_data); void RawDebug(const v8::FunctionCallbackInfo& args); v8::MaybeLocal ProcessEmit(Environment* env, - const char* event, + std::string_view event, v8::Local message); v8::Maybe ProcessEmitWarningGeneric(Environment* env, - const char* warning, - const char* type = nullptr, - const char* code = nullptr); + std::string_view warning, + std::string_view type = "", + std::string_view code = ""); template inline v8::Maybe ProcessEmitWarning(Environment* env, const char* fmt, Args&&... args); -v8::Maybe ProcessEmitWarningSync(Environment* env, const char* message); +v8::Maybe ProcessEmitWarningSync(Environment* env, + std::string_view message); v8::Maybe ProcessEmitExperimentalWarning(Environment* env, - const char* warning); -v8::Maybe ProcessEmitDeprecationWarning(Environment* env, - const char* warning, - const char* deprecation_code); + const std::string& warning); +v8::Maybe ProcessEmitDeprecationWarning( + Environment* env, + const std::string& warning, + std::string_view deprecation_code); v8::MaybeLocal CreateProcessObject(Realm* env); void PatchProcessObject(const v8::FunctionCallbackInfo& args); diff --git a/src/node_process_events.cc b/src/node_process_events.cc index 19774607830a93..128ad9fbb1f257 100644 --- a/src/node_process_events.cc +++ b/src/node_process_events.cc @@ -18,10 +18,11 @@ using v8::Object; using v8::String; using v8::Value; -Maybe ProcessEmitWarningSync(Environment* env, const char* message) { +Maybe ProcessEmitWarningSync(Environment* env, std::string_view message) { Isolate* isolate = env->isolate(); Local context = env->context(); - Local message_string = OneByteString(isolate, message); + Local message_string = + OneByteString(isolate, message.data(), message.size()); Local argv[] = {message_string}; Local emit_function = env->process_emit_warning_sync(); @@ -37,13 +38,14 @@ Maybe ProcessEmitWarningSync(Environment* env, const char* message) { } MaybeLocal ProcessEmit(Environment* env, - const char* event, + std::string_view event, Local message) { Isolate* isolate = env->isolate(); - Local event_string; - if (!String::NewFromOneByte(isolate, reinterpret_cast(event)) - .ToLocal(&event_string)) return MaybeLocal(); + Local event_string; + if (!ToV8Value(env->context(), event).ToLocal(&event_string)) { + return MaybeLocal(); + } Local process = env->process_object(); Local argv[] = {event_string, message}; @@ -51,10 +53,12 @@ MaybeLocal ProcessEmit(Environment* env, } Maybe ProcessEmitWarningGeneric(Environment* env, - const char* warning, - const char* type, - const char* code) { - if (!env->can_call_into_js()) return Just(false); + std::string_view warning, + std::string_view type, + std::string_view code) { + if (!env->can_call_into_js()) { + return Just(false); + } HandleScope handle_scope(env->isolate()); Context::Scope context_scope(env->context()); @@ -73,19 +77,16 @@ Maybe ProcessEmitWarningGeneric(Environment* env, // The caller has to be able to handle a failure anyway, so we might as well // do proper error checking for string creation. - if (!String::NewFromUtf8(env->isolate(), warning).ToLocal(&args[argc++])) + if (!ToV8Value(env->context(), warning).ToLocal(&args[argc++])) { return Nothing(); + } - if (type != nullptr) { - if (!String::NewFromOneByte(env->isolate(), - reinterpret_cast(type)) - .ToLocal(&args[argc++])) { + if (!type.empty()) { + if (!ToV8Value(env->context(), type).ToLocal(&args[argc++])) { return Nothing(); } - if (code != nullptr && - !String::NewFromOneByte(env->isolate(), - reinterpret_cast(code)) - .ToLocal(&args[argc++])) { + if (!code.empty() && + !ToV8Value(env->context(), code).ToLocal(&args[argc++])) { return Nothing(); } } @@ -100,13 +101,11 @@ Maybe ProcessEmitWarningGeneric(Environment* env, return Just(true); } - std::set experimental_warnings; Maybe ProcessEmitExperimentalWarning(Environment* env, - const char* warning) { - if (experimental_warnings.find(warning) != experimental_warnings.end()) - return Nothing(); + const std::string& warning) { + if (experimental_warnings.contains(warning)) return Nothing(); experimental_warnings.insert(warning); std::string message(warning); @@ -115,8 +114,8 @@ Maybe ProcessEmitExperimentalWarning(Environment* env, } Maybe ProcessEmitDeprecationWarning(Environment* env, - const char* warning, - const char* deprecation_code) { + const std::string& warning, + std::string_view deprecation_code) { return ProcessEmitWarningGeneric( env, warning, "DeprecationWarning", deprecation_code); } diff --git a/src/node_report.cc b/src/node_report.cc index 4f430ee28218c3..9ab66162ec32a6 100644 --- a/src/node_report.cc +++ b/src/node_report.cc @@ -23,7 +23,7 @@ #include #include -constexpr int NODE_REPORT_VERSION = 4; +constexpr int NODE_REPORT_VERSION = 5; constexpr int NANOS_PER_SEC = 1000 * 1000 * 1000; constexpr double SEC_PER_MICROS = 1e-6; constexpr int MAX_FRAME_COUNT = node::kMaxFrameCountForLogging; @@ -732,13 +732,13 @@ static void PrintSystemInformation(JSONWriter* writer) { int id; } rlimit_strings[] = { {"core_file_size_blocks", RLIMIT_CORE}, - {"data_seg_size_kbytes", RLIMIT_DATA}, + {"data_seg_size_bytes", RLIMIT_DATA}, {"file_size_blocks", RLIMIT_FSIZE}, #if !(defined(_AIX) || defined(__sun)) {"max_locked_memory_bytes", RLIMIT_MEMLOCK}, #endif #ifndef __sun - {"max_memory_size_kbytes", RLIMIT_RSS}, + {"max_memory_size_bytes", RLIMIT_RSS}, #endif {"open_files", RLIMIT_NOFILE}, {"stack_size_bytes", RLIMIT_STACK}, @@ -747,7 +747,7 @@ static void PrintSystemInformation(JSONWriter* writer) { {"max_user_processes", RLIMIT_NPROC}, #endif #ifndef __OpenBSD__ - {"virtual_memory_kbytes", RLIMIT_AS} + {"virtual_memory_bytes", RLIMIT_AS} #endif }; diff --git a/src/node_sockaddr-inl.h b/src/node_sockaddr-inl.h index e16a09b04c7d6f..87ff9b62268657 100644 --- a/src/node_sockaddr-inl.h +++ b/src/node_sockaddr-inl.h @@ -172,22 +172,9 @@ bool SocketAddress::operator!=(const SocketAddress& other) const { return !(*this == other); } -bool SocketAddress::operator<(const SocketAddress& other) const { - return compare(other) == CompareResult::LESS_THAN; -} - -bool SocketAddress::operator>(const SocketAddress& other) const { - return compare(other) == CompareResult::GREATER_THAN; -} - -bool SocketAddress::operator<=(const SocketAddress& other) const { - CompareResult c = compare(other); - return c == CompareResult::NOT_COMPARABLE ? false : - c <= CompareResult::SAME; -} - -bool SocketAddress::operator>=(const SocketAddress& other) const { - return compare(other) >= CompareResult::SAME; +std::partial_ordering SocketAddress::operator<=>( + const SocketAddress& other) const { + return compare(other); } template diff --git a/src/node_sockaddr.cc b/src/node_sockaddr.cc index e1572187437f1b..8cfef3726def8c 100644 --- a/src/node_sockaddr.cc +++ b/src/node_sockaddr.cc @@ -20,6 +20,7 @@ using v8::FunctionTemplate; using v8::Int32; using v8::Isolate; using v8::Local; +using v8::LocalVector; using v8::MaybeLocal; using v8::Object; using v8::Uint32; @@ -154,9 +155,8 @@ bool is_match_ipv4_ipv6( sizeof(uint32_t)) == 0; } -SocketAddress::CompareResult compare_ipv4( - const SocketAddress& one, - const SocketAddress& two) { +std::partial_ordering compare_ipv4(const SocketAddress& one, + const SocketAddress& two) { const sockaddr_in* one_in = reinterpret_cast(one.data()); const sockaddr_in* two_in = @@ -165,31 +165,29 @@ SocketAddress::CompareResult compare_ipv4( const uint32_t s_addr_two = ntohl(two_in->sin_addr.s_addr); if (s_addr_one < s_addr_two) - return SocketAddress::CompareResult::LESS_THAN; + return std::partial_ordering::less; else if (s_addr_one == s_addr_two) - return SocketAddress::CompareResult::SAME; + return std::partial_ordering::equivalent; else - return SocketAddress::CompareResult::GREATER_THAN; + return std::partial_ordering::greater; } -SocketAddress::CompareResult compare_ipv6( - const SocketAddress& one, - const SocketAddress& two) { +std::partial_ordering compare_ipv6(const SocketAddress& one, + const SocketAddress& two) { const sockaddr_in6* one_in = reinterpret_cast(one.data()); const sockaddr_in6* two_in = reinterpret_cast(two.data()); int ret = memcmp(&one_in->sin6_addr, &two_in->sin6_addr, 16); if (ret < 0) - return SocketAddress::CompareResult::LESS_THAN; + return std::partial_ordering::less; else if (ret > 0) - return SocketAddress::CompareResult::GREATER_THAN; - return SocketAddress::CompareResult::SAME; + return std::partial_ordering::greater; + return std::partial_ordering::equivalent; } -SocketAddress::CompareResult compare_ipv4_ipv6( - const SocketAddress& ipv4, - const SocketAddress& ipv6) { +std::partial_ordering compare_ipv4_ipv6(const SocketAddress& ipv4, + const SocketAddress& ipv6) { const sockaddr_in* ipv4_in = reinterpret_cast(ipv4.data()); const sockaddr_in6 * ipv6_in = @@ -199,7 +197,7 @@ SocketAddress::CompareResult compare_ipv4_ipv6( reinterpret_cast(&ipv6_in->sin6_addr); if (memcmp(ptr, mask, sizeof(mask)) != 0) - return SocketAddress::CompareResult::NOT_COMPARABLE; + return std::partial_ordering::unordered; int ret = memcmp( &ipv4_in->sin_addr, @@ -207,10 +205,10 @@ SocketAddress::CompareResult compare_ipv4_ipv6( sizeof(uint32_t)); if (ret < 0) - return SocketAddress::CompareResult::LESS_THAN; + return std::partial_ordering::less; else if (ret > 0) - return SocketAddress::CompareResult::GREATER_THAN; - return SocketAddress::CompareResult::SAME; + return std::partial_ordering::greater; + return std::partial_ordering::equivalent; } bool in_network_ipv4( @@ -235,7 +233,7 @@ bool in_network_ipv6( // Special case, if prefix == 128, then just do a // straight comparison. if (prefix == 128) - return compare_ipv6(ip, net) == SocketAddress::CompareResult::SAME; + return compare_ipv6(ip, net) == std::partial_ordering::equivalent; uint8_t r = prefix % 8; int len = (prefix - r) / 8; @@ -263,7 +261,7 @@ bool in_network_ipv4_ipv6( int prefix) { if (prefix == 128) - return compare_ipv4_ipv6(ip, net) == SocketAddress::CompareResult::SAME; + return compare_ipv4_ipv6(ip, net) == std::partial_ordering::equivalent; uint8_t r = prefix % 8; int len = (prefix - r) / 8; @@ -293,7 +291,7 @@ bool in_network_ipv6_ipv4( const SocketAddress& net, int prefix) { if (prefix == 32) - return compare_ipv4_ipv6(net, ip) == SocketAddress::CompareResult::SAME; + return compare_ipv4_ipv6(net, ip) == std::partial_ordering::equivalent; uint32_t m = ((1ull << prefix) - 1) << (32 - prefix); @@ -337,8 +335,7 @@ bool SocketAddress::is_match(const SocketAddress& other) const { return false; } -SocketAddress::CompareResult SocketAddress::compare( - const SocketAddress& other) const { +std::partial_ordering SocketAddress::compare(const SocketAddress& other) const { switch (family()) { case AF_INET: switch (other.family()) { @@ -349,16 +346,15 @@ SocketAddress::CompareResult SocketAddress::compare( case AF_INET6: switch (other.family()) { case AF_INET: { - CompareResult c = compare_ipv4_ipv6(other, *this); - switch (c) { - case SocketAddress::CompareResult::NOT_COMPARABLE: - // Fall through - case SocketAddress::CompareResult::SAME: - return c; - case SocketAddress::CompareResult::GREATER_THAN: - return SocketAddress::CompareResult::LESS_THAN; - case SocketAddress::CompareResult::LESS_THAN: - return SocketAddress::CompareResult::GREATER_THAN; + auto c = compare_ipv4_ipv6(other, *this); + if (c == std::partial_ordering::unordered) { + return std::partial_ordering::unordered; + } else if (c == std::partial_ordering::equivalent) { + return std::partial_ordering::equivalent; + } else if (c == std::partial_ordering::less) { + return std::partial_ordering::greater; + } else if (c == std::partial_ordering::greater) { + return std::partial_ordering::less; } break; } @@ -366,7 +362,7 @@ SocketAddress::CompareResult SocketAddress::compare( } break; } - return SocketAddress::CompareResult::NOT_COMPARABLE; + return std::partial_ordering::unordered; } bool SocketAddress::is_in_network( @@ -503,15 +499,14 @@ std::string SocketAddressBlockList::SocketAddressMaskRule::ToString() { MaybeLocal SocketAddressBlockList::ListRules(Environment* env) { Mutex::ScopedLock lock(mutex_); - std::vector> rules; + LocalVector rules(env->isolate()); if (!ListRules(env, &rules)) return MaybeLocal(); return Array::New(env->isolate(), rules.data(), rules.size()); } -bool SocketAddressBlockList::ListRules( - Environment* env, - std::vector>* rules) { +bool SocketAddressBlockList::ListRules(Environment* env, + LocalVector* rules) { if (parent_ && !parent_->ListRules(env, rules)) return false; for (const auto& rule : rules_) { diff --git a/src/node_sockaddr.h b/src/node_sockaddr.h index 84aa3adf5fc72a..a522505949a263 100644 --- a/src/node_sockaddr.h +++ b/src/node_sockaddr.h @@ -11,9 +11,10 @@ #include "uv.h" #include "v8.h" +#include +#include #include #include -#include #include namespace node { @@ -22,13 +23,6 @@ class Environment; class SocketAddress : public MemoryRetainer { public: - enum class CompareResult { - NOT_COMPARABLE = -2, - LESS_THAN, - SAME, - GREATER_THAN - }; - struct Hash { size_t operator()(const SocketAddress& addr) const; }; @@ -36,10 +30,7 @@ class SocketAddress : public MemoryRetainer { inline bool operator==(const SocketAddress& other) const; inline bool operator!=(const SocketAddress& other) const; - inline bool operator<(const SocketAddress& other) const; - inline bool operator>(const SocketAddress& other) const; - inline bool operator<=(const SocketAddress& other) const; - inline bool operator>=(const SocketAddress& other) const; + inline std::partial_ordering operator<=>(const SocketAddress& other) const; inline static bool is_numeric_host(const char* hostname); inline static bool is_numeric_host(const char* hostname, int family); @@ -102,7 +93,7 @@ class SocketAddress : public MemoryRetainer { bool is_match(const SocketAddress& other) const; // Compares this SocketAddress to the given other SocketAddress. - CompareResult compare(const SocketAddress& other) const; + std::partial_ordering compare(const SocketAddress& other) const; // Returns true if this SocketAddress is within the subnet // identified by the given network address and CIDR prefix. @@ -324,9 +315,7 @@ class SocketAddressBlockList : public MemoryRetainer { SET_SELF_SIZE(SocketAddressBlockList) private: - bool ListRules( - Environment* env, - std::vector>* vec); + bool ListRules(Environment* env, v8::LocalVector* vec); std::shared_ptr parent_; std::list> rules_; diff --git a/src/node_sqlite.cc b/src/node_sqlite.cc index e138d120197e33..373931a76a54de 100644 --- a/src/node_sqlite.cc +++ b/src/node_sqlite.cc @@ -1,4 +1,5 @@ #include "node_sqlite.h" +#include #include "base_object-inl.h" #include "debug_utils-inl.h" #include "env-inl.h" @@ -22,10 +23,13 @@ using v8::ConstructorBehavior; using v8::Context; using v8::DontDelete; using v8::Exception; +using v8::External; using v8::Function; using v8::FunctionCallback; using v8::FunctionCallbackInfo; using v8::FunctionTemplate; +using v8::Global; +using v8::Int32; using v8::Integer; using v8::Isolate; using v8::Local; @@ -38,6 +42,7 @@ using v8::Number; using v8::Object; using v8::SideEffectType; using v8::String; +using v8::TryCatch; using v8::Uint8Array; using v8::Value; @@ -62,13 +67,14 @@ inline MaybeLocal CreateSQLiteError(Isolate* isolate, const char* message) { Local js_msg; Local e; + Environment* env = Environment::GetCurrent(isolate); if (!String::NewFromUtf8(isolate, message).ToLocal(&js_msg) || !Exception::Error(js_msg) ->ToObject(isolate->GetCurrentContext()) .ToLocal(&e) || e->Set(isolate->GetCurrentContext(), - OneByteString(isolate, "code"), - OneByteString(isolate, "ERR_SQLITE_ERROR")) + env->code_string(), + env->err_sqlite_error_string()) .IsNothing()) { return MaybeLocal(); } @@ -81,15 +87,14 @@ inline MaybeLocal CreateSQLiteError(Isolate* isolate, sqlite3* db) { const char* errmsg = sqlite3_errmsg(db); Local js_errmsg; Local e; + Environment* env = Environment::GetCurrent(isolate); if (!String::NewFromUtf8(isolate, errstr).ToLocal(&js_errmsg) || !CreateSQLiteError(isolate, errmsg).ToLocal(&e) || e->Set(isolate->GetCurrentContext(), - OneByteString(isolate, "errcode"), + env->errcode_string(), Integer::New(isolate, errcode)) .IsNothing() || - e->Set(isolate->GetCurrentContext(), - OneByteString(isolate, "errstr"), - js_errmsg) + e->Set(isolate->GetCurrentContext(), env->errstr_string(), js_errmsg) .IsNothing()) { return MaybeLocal(); } @@ -110,13 +115,146 @@ inline void THROW_ERR_SQLITE_ERROR(Isolate* isolate, const char* message) { } } +inline void THROW_ERR_SQLITE_ERROR(Isolate* isolate, int errcode) { + const char* errstr = sqlite3_errstr(errcode); + + Environment* env = Environment::GetCurrent(isolate); + auto error = CreateSQLiteError(isolate, errstr).ToLocalChecked(); + error + ->Set(isolate->GetCurrentContext(), + env->errcode_string(), + Integer::New(isolate, errcode)) + .ToChecked(); + isolate->ThrowException(error); +} + +class UserDefinedFunction { + public: + explicit UserDefinedFunction(Environment* env, + Local fn, + bool use_bigint_args) + : env_(env), fn_(env->isolate(), fn), use_bigint_args_(use_bigint_args) {} + virtual ~UserDefinedFunction() {} + + static void xFunc(sqlite3_context* ctx, int argc, sqlite3_value** argv) { + UserDefinedFunction* self = + static_cast(sqlite3_user_data(ctx)); + Environment* env = self->env_; + Isolate* isolate = env->isolate(); + auto recv = Undefined(isolate); + auto fn = self->fn_.Get(isolate); + LocalVector js_argv(isolate); + + for (int i = 0; i < argc; ++i) { + sqlite3_value* value = argv[i]; + MaybeLocal js_val; + + switch (sqlite3_value_type(value)) { + case SQLITE_INTEGER: { + sqlite3_int64 val = sqlite3_value_int64(value); + if (self->use_bigint_args_) { + js_val = BigInt::New(isolate, val); + } else if (std::abs(val) <= kMaxSafeJsInteger) { + js_val = Number::New(isolate, val); + } else { + THROW_ERR_OUT_OF_RANGE(isolate, + "Value is too large to be represented as a " + "JavaScript number: %" PRId64, + val); + return; + } + break; + } + case SQLITE_FLOAT: + js_val = Number::New(isolate, sqlite3_value_double(value)); + break; + case SQLITE_TEXT: { + const char* v = + reinterpret_cast(sqlite3_value_text(value)); + js_val = String::NewFromUtf8(isolate, v).As(); + break; + } + case SQLITE_NULL: + js_val = Null(isolate); + break; + case SQLITE_BLOB: { + size_t size = static_cast(sqlite3_value_bytes(value)); + auto data = + reinterpret_cast(sqlite3_value_blob(value)); + auto store = ArrayBuffer::NewBackingStore(isolate, size); + memcpy(store->Data(), data, size); + auto ab = ArrayBuffer::New(isolate, std::move(store)); + js_val = Uint8Array::New(ab, 0, size); + break; + } + default: + UNREACHABLE("Bad SQLite value"); + } + + Local local; + if (!js_val.ToLocal(&local)) { + return; + } + + js_argv.emplace_back(local); + } + + MaybeLocal retval = + fn->Call(env->context(), recv, argc, js_argv.data()); + Local result; + if (!retval.ToLocal(&result)) { + return; + } + + if (result->IsUndefined() || result->IsNull()) { + sqlite3_result_null(ctx); + } else if (result->IsNumber()) { + sqlite3_result_double(ctx, result.As()->Value()); + } else if (result->IsString()) { + Utf8Value val(isolate, result.As()); + sqlite3_result_text(ctx, *val, val.length(), SQLITE_TRANSIENT); + } else if (result->IsUint8Array()) { + ArrayBufferViewContents buf(result); + sqlite3_result_blob(ctx, buf.data(), buf.length(), SQLITE_TRANSIENT); + } else if (result->IsBigInt()) { + bool lossless; + int64_t as_int = result.As()->Int64Value(&lossless); + if (!lossless) { + sqlite3_result_error(ctx, "BigInt value is too large for SQLite", -1); + return; + } + sqlite3_result_int64(ctx, as_int); + } else if (result->IsPromise()) { + sqlite3_result_error( + ctx, "Asynchronous user-defined functions are not supported", -1); + } else { + sqlite3_result_error( + ctx, + "Returned JavaScript value cannot be converted to a SQLite value", + -1); + } + } + + static void xDestroy(void* self) { + delete static_cast(self); + } + + private: + Environment* env_; + Global fn_; + bool use_bigint_args_; +}; + DatabaseSync::DatabaseSync(Environment* env, Local object, DatabaseOpenConfiguration&& open_config, - bool open) + bool open, + bool allow_load_extension) : BaseObject(env, object), open_config_(std::move(open_config)) { MakeWeak(); connection_ = nullptr; + allow_load_extension_ = allow_load_extension; + enable_load_extension_ = allow_load_extension; if (open) { Open(); @@ -181,6 +319,19 @@ bool DatabaseSync::Open() { CHECK_ERROR_OR_THROW(env()->isolate(), connection_, r, SQLITE_OK, false); CHECK_EQ(foreign_keys_enabled, open_config_.get_enable_foreign_keys()); + if (allow_load_extension_) { + if (env()->permission()->enabled()) [[unlikely]] { + THROW_ERR_LOAD_SQLITE_EXTENSION(env(), + "Cannot load SQLite extensions when the " + "permission model is enabled."); + return false; + } + const int load_extension_ret = sqlite3_db_config( + connection_, SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION, 1, nullptr); + CHECK_ERROR_OR_THROW( + env()->isolate(), connection_, load_extension_ret, SQLITE_OK, false); + } + return true; } @@ -226,6 +377,7 @@ void DatabaseSync::New(const FunctionCallbackInfo& args) { DatabaseOpenConfiguration open_config(std::move(location)); bool open = true; + bool allow_load_extension = false; if (args.Length() > 1) { if (!args[1]->IsObject()) { @@ -301,9 +453,28 @@ void DatabaseSync::New(const FunctionCallbackInfo& args) { } open_config.set_enable_dqs(enable_dqs_v.As()->Value()); } + + Local allow_extension_string = + FIXED_ONE_BYTE_STRING(env->isolate(), "allowExtension"); + Local allow_extension_v; + if (!options->Get(env->context(), allow_extension_string) + .ToLocal(&allow_extension_v)) { + return; + } + + if (!allow_extension_v->IsUndefined()) { + if (!allow_extension_v->IsBoolean()) { + THROW_ERR_INVALID_ARG_TYPE( + env->isolate(), + "The \"options.allowExtension\" argument must be a boolean."); + return; + } + allow_load_extension = allow_extension_v.As()->Value(); + } } - new DatabaseSync(env, args.This(), std::move(open_config), open); + new DatabaseSync( + env, args.This(), std::move(open_config), open, allow_load_extension); } void DatabaseSync::Open(const FunctionCallbackInfo& args) { @@ -362,6 +533,151 @@ void DatabaseSync::Exec(const FunctionCallbackInfo& args) { CHECK_ERROR_OR_THROW(env->isolate(), db->connection_, r, SQLITE_OK, void()); } +void DatabaseSync::CustomFunction(const FunctionCallbackInfo& args) { + DatabaseSync* db; + ASSIGN_OR_RETURN_UNWRAP(&db, args.This()); + Environment* env = Environment::GetCurrent(args); + THROW_AND_RETURN_ON_BAD_STATE(env, !db->IsOpen(), "database is not open"); + + if (!args[0]->IsString()) { + THROW_ERR_INVALID_ARG_TYPE(env->isolate(), + "The \"name\" argument must be a string."); + return; + } + + int fn_index = args.Length() < 3 ? 1 : 2; + bool use_bigint_args = false; + bool varargs = false; + bool deterministic = false; + bool direct_only = false; + + if (fn_index > 1) { + if (!args[1]->IsObject()) { + THROW_ERR_INVALID_ARG_TYPE(env->isolate(), + "The \"options\" argument must be an object."); + return; + } + + Local options = args[1].As(); + Local use_bigint_args_v; + if (!options + ->Get(env->context(), + FIXED_ONE_BYTE_STRING(env->isolate(), "useBigIntArguments")) + .ToLocal(&use_bigint_args_v)) { + return; + } + + if (!use_bigint_args_v->IsUndefined()) { + if (!use_bigint_args_v->IsBoolean()) { + THROW_ERR_INVALID_ARG_TYPE( + env->isolate(), + "The \"options.useBigIntArguments\" argument must be a boolean."); + return; + } + use_bigint_args = use_bigint_args_v.As()->Value(); + } + + Local varargs_v; + if (!options + ->Get(env->context(), + FIXED_ONE_BYTE_STRING(env->isolate(), "varargs")) + .ToLocal(&varargs_v)) { + return; + } + + if (!varargs_v->IsUndefined()) { + if (!varargs_v->IsBoolean()) { + THROW_ERR_INVALID_ARG_TYPE( + env->isolate(), + "The \"options.varargs\" argument must be a boolean."); + return; + } + varargs = varargs_v.As()->Value(); + } + + Local deterministic_v; + if (!options + ->Get(env->context(), + FIXED_ONE_BYTE_STRING(env->isolate(), "deterministic")) + .ToLocal(&deterministic_v)) { + return; + } + + if (!deterministic_v->IsUndefined()) { + if (!deterministic_v->IsBoolean()) { + THROW_ERR_INVALID_ARG_TYPE( + env->isolate(), + "The \"options.deterministic\" argument must be a boolean."); + return; + } + deterministic = deterministic_v.As()->Value(); + } + + Local direct_only_v; + if (!options + ->Get(env->context(), + FIXED_ONE_BYTE_STRING(env->isolate(), "directOnly")) + .ToLocal(&direct_only_v)) { + return; + } + + if (!direct_only_v->IsUndefined()) { + if (!direct_only_v->IsBoolean()) { + THROW_ERR_INVALID_ARG_TYPE( + env->isolate(), + "The \"options.directOnly\" argument must be a boolean."); + return; + } + direct_only = direct_only_v.As()->Value(); + } + } + + if (!args[fn_index]->IsFunction()) { + THROW_ERR_INVALID_ARG_TYPE(env->isolate(), + "The \"function\" argument must be a function."); + return; + } + + Utf8Value name(env->isolate(), args[0].As()); + Local fn = args[fn_index].As(); + + int argc = 0; + if (varargs) { + argc = -1; + } else { + Local js_len; + if (!fn->Get(env->context(), + FIXED_ONE_BYTE_STRING(env->isolate(), "length")) + .ToLocal(&js_len)) { + return; + } + argc = js_len.As()->Value(); + } + + UserDefinedFunction* user_data = + new UserDefinedFunction(env, fn, use_bigint_args); + int text_rep = SQLITE_UTF8; + + if (deterministic) { + text_rep |= SQLITE_DETERMINISTIC; + } + + if (direct_only) { + text_rep |= SQLITE_DIRECTONLY; + } + + int r = sqlite3_create_function_v2(db->connection_, + *name, + argc, + text_rep, + user_data, + UserDefinedFunction::xFunc, + nullptr, + nullptr, + UserDefinedFunction::xDestroy); + CHECK_ERROR_OR_THROW(env->isolate(), db->connection_, r, SQLITE_OK, void()); +} + void DatabaseSync::CreateSession(const FunctionCallbackInfo& args) { std::string table; std::string db_name = "main"; @@ -429,11 +745,11 @@ void DatabaseSync::CreateSession(const FunctionCallbackInfo& args) { // the reason for using static functions here is that SQLite needs a // function pointer -static std::function conflictCallback; +static std::function conflictCallback; static int xConflict(void* pCtx, int eConflict, sqlite3_changeset_iter* pIter) { if (!conflictCallback) return SQLITE_CHANGESET_ABORT; - return conflictCallback(); + return conflictCallback(eConflict); } static std::function filterCallback; @@ -471,15 +787,27 @@ void DatabaseSync::ApplyChangeset(const FunctionCallbackInfo& args) { options->Get(env->context(), env->onconflict_string()).ToLocalChecked(); if (!conflictValue->IsUndefined()) { - if (!conflictValue->IsNumber()) { + if (!conflictValue->IsFunction()) { THROW_ERR_INVALID_ARG_TYPE( env->isolate(), - "The \"options.onConflict\" argument must be a number."); + "The \"options.onConflict\" argument must be a function."); return; } - - int conflictInt = conflictValue->Int32Value(env->context()).FromJust(); - conflictCallback = [conflictInt]() -> int { return conflictInt; }; + Local conflictFunc = conflictValue.As(); + conflictCallback = [env, conflictFunc](int conflictType) -> int { + Local argv[] = {Integer::New(env->isolate(), conflictType)}; + TryCatch try_catch(env->isolate()); + Local result = + conflictFunc->Call(env->context(), Null(env->isolate()), 1, argv) + .FromMaybe(Local()); + if (try_catch.HasCaught()) { + try_catch.ReThrow(); + return SQLITE_CHANGESET_ABORT; + } + constexpr auto invalid_value = -1; + if (!result->IsInt32()) return invalid_value; + return result->Int32Value(env->context()).FromJust(); + }; } if (options->HasOwnProperty(env->context(), env->filter_string()) @@ -517,12 +845,80 @@ void DatabaseSync::ApplyChangeset(const FunctionCallbackInfo& args) { xFilter, xConflict, nullptr); + if (r == SQLITE_OK) { + args.GetReturnValue().Set(true); + return; + } if (r == SQLITE_ABORT) { + // this is not an error, return false args.GetReturnValue().Set(false); return; } - CHECK_ERROR_OR_THROW(env->isolate(), db->connection_, r, SQLITE_OK, void()); - args.GetReturnValue().Set(true); + THROW_ERR_SQLITE_ERROR(env->isolate(), r); +} + +void DatabaseSync::EnableLoadExtension( + const FunctionCallbackInfo& args) { + DatabaseSync* db; + ASSIGN_OR_RETURN_UNWRAP(&db, args.This()); + Environment* env = Environment::GetCurrent(args); + if (!args[0]->IsBoolean()) { + THROW_ERR_INVALID_ARG_TYPE(env->isolate(), + "The \"allow\" argument must be a boolean."); + return; + } + + const int enable = args[0].As()->Value(); + auto isolate = env->isolate(); + + if (db->allow_load_extension_ == false && enable == true) { + THROW_ERR_INVALID_STATE( + isolate, + "Cannot enable extension loading because it was disabled at database " + "creation."); + return; + } + db->enable_load_extension_ = enable; + const int load_extension_ret = sqlite3_db_config( + db->connection_, SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION, enable, nullptr); + CHECK_ERROR_OR_THROW( + isolate, db->connection_, load_extension_ret, SQLITE_OK, void()); +} + +void DatabaseSync::LoadExtension(const FunctionCallbackInfo& args) { + DatabaseSync* db; + ASSIGN_OR_RETURN_UNWRAP(&db, args.This()); + Environment* env = Environment::GetCurrent(args); + THROW_AND_RETURN_ON_BAD_STATE( + env, db->connection_ == nullptr, "database is not open"); + THROW_AND_RETURN_ON_BAD_STATE( + env, !db->allow_load_extension_, "extension loading is not allowed"); + THROW_AND_RETURN_ON_BAD_STATE( + env, !db->enable_load_extension_, "extension loading is not allowed"); + + if (!args[0]->IsString()) { + THROW_ERR_INVALID_ARG_TYPE(env->isolate(), + "The \"path\" argument must be a string."); + return; + } + + auto isolate = env->isolate(); + + BufferValue path(isolate, args[0]); + BufferValue entryPoint(isolate, args[1]); + CHECK_NOT_NULL(*path); + ToNamespacedPath(env, &path); + if (*entryPoint == nullptr) { + ToNamespacedPath(env, &entryPoint); + } + THROW_IF_INSUFFICIENT_PERMISSIONS( + env, permission::PermissionScope::kFileSystemRead, path.ToStringView()); + char* errmsg = nullptr; + const int r = + sqlite3_load_extension(db->connection_, *path, *entryPoint, &errmsg); + if (r != SQLITE_OK) { + isolate->ThrowException(ERR_LOAD_SQLITE_EXTENSION(isolate, errmsg)); + } } StatementSync::StatementSync(Environment* env, @@ -564,7 +960,7 @@ bool StatementSync::BindParams(const FunctionCallbackInfo& args) { int anon_idx = 1; int anon_start = 0; - if (args[0]->IsObject() && !args[0]->IsUint8Array()) { + if (args[0]->IsObject() && !args[0]->IsArrayBufferView()) { Local obj = args[0].As(); Local context = obj->GetIsolate()->GetCurrentContext(); Local keys; @@ -669,7 +1065,7 @@ bool StatementSync::BindValue(const Local& value, const int index) { statement_, index, *val, val.length(), SQLITE_TRANSIENT); } else if (value->IsNull()) { r = sqlite3_bind_null(statement_, index); - } else if (value->IsUint8Array()) { + } else if (value->IsArrayBufferView()) { ArrayBufferViewContents buf(value); r = sqlite3_bind_blob( statement_, index, buf.data(), buf.length(), SQLITE_TRANSIENT); @@ -790,6 +1186,180 @@ void StatementSync::All(const FunctionCallbackInfo& args) { args.GetReturnValue().Set(Array::New(isolate, rows.data(), rows.size())); } +void StatementSync::IterateReturnCallback( + const FunctionCallbackInfo& args) { + Environment* env = Environment::GetCurrent(args); + auto isolate = env->isolate(); + auto context = isolate->GetCurrentContext(); + + auto self = args.This(); + // iterator has fetch all result or break, prevent next func to return result + self->Set(context, env->isfinished_string(), Boolean::New(isolate, true)) + .ToChecked(); + + auto external_stmt = Local::Cast( + self->Get(context, env->statement_string()).ToLocalChecked()); + auto stmt = static_cast(external_stmt->Value()); + if (!stmt->IsFinalized()) { + sqlite3_reset(stmt->statement_); + } + + LocalVector keys(isolate, {env->done_string(), env->value_string()}); + LocalVector values(isolate, + {Boolean::New(isolate, true), Null(isolate)}); + + DCHECK_EQ(keys.size(), values.size()); + Local result = Object::New( + isolate, Null(isolate), keys.data(), values.data(), keys.size()); + args.GetReturnValue().Set(result); +} + +void StatementSync::IterateNextCallback( + const FunctionCallbackInfo& args) { + Environment* env = Environment::GetCurrent(args); + auto isolate = env->isolate(); + auto context = isolate->GetCurrentContext(); + + auto self = args.This(); + + // skip iteration if is_finished + auto is_finished = Local::Cast( + self->Get(context, env->isfinished_string()).ToLocalChecked()); + if (is_finished->Value()) { + LocalVector keys(isolate, {env->done_string(), env->value_string()}); + LocalVector values(isolate, + {Boolean::New(isolate, true), Null(isolate)}); + + DCHECK_EQ(keys.size(), values.size()); + Local result = Object::New( + isolate, Null(isolate), keys.data(), values.data(), keys.size()); + args.GetReturnValue().Set(result); + return; + } + + auto external_stmt = Local::Cast( + self->Get(context, env->statement_string()).ToLocalChecked()); + auto stmt = static_cast(external_stmt->Value()); + auto num_cols = + Local::Cast( + self->Get(context, env->num_cols_string()).ToLocalChecked()) + ->Value(); + + THROW_AND_RETURN_ON_BAD_STATE( + env, stmt->IsFinalized(), "statement has been finalized"); + + int r = sqlite3_step(stmt->statement_); + if (r != SQLITE_ROW) { + CHECK_ERROR_OR_THROW( + env->isolate(), stmt->db_->Connection(), r, SQLITE_DONE, void()); + + // cleanup when no more rows to fetch + sqlite3_reset(stmt->statement_); + self->Set(context, env->isfinished_string(), Boolean::New(isolate, true)) + .ToChecked(); + + LocalVector keys(isolate, {env->done_string(), env->value_string()}); + LocalVector values(isolate, + {Boolean::New(isolate, true), Null(isolate)}); + + DCHECK_EQ(keys.size(), values.size()); + Local result = Object::New( + isolate, Null(isolate), keys.data(), values.data(), keys.size()); + args.GetReturnValue().Set(result); + return; + } + + LocalVector row_keys(isolate); + row_keys.reserve(num_cols); + LocalVector row_values(isolate); + row_values.reserve(num_cols); + for (int i = 0; i < num_cols; ++i) { + Local key; + if (!stmt->ColumnNameToName(i).ToLocal(&key)) return; + Local val; + if (!stmt->ColumnToValue(i).ToLocal(&val)) return; + row_keys.emplace_back(key); + row_values.emplace_back(val); + } + + Local row = Object::New( + isolate, Null(isolate), row_keys.data(), row_values.data(), num_cols); + + LocalVector keys(isolate, {env->done_string(), env->value_string()}); + LocalVector values(isolate, {Boolean::New(isolate, false), row}); + + DCHECK_EQ(keys.size(), values.size()); + Local result = Object::New( + isolate, Null(isolate), keys.data(), values.data(), keys.size()); + args.GetReturnValue().Set(result); +} + +void StatementSync::Iterate(const FunctionCallbackInfo& args) { + StatementSync* stmt; + ASSIGN_OR_RETURN_UNWRAP(&stmt, args.This()); + Environment* env = Environment::GetCurrent(args); + THROW_AND_RETURN_ON_BAD_STATE( + env, stmt->IsFinalized(), "statement has been finalized"); + auto isolate = env->isolate(); + auto context = env->context(); + int r = sqlite3_reset(stmt->statement_); + CHECK_ERROR_OR_THROW( + env->isolate(), stmt->db_->Connection(), r, SQLITE_OK, void()); + + if (!stmt->BindParams(args)) { + return; + } + + Local next_func = + Function::New(context, StatementSync::IterateNextCallback) + .ToLocalChecked(); + Local return_func = + Function::New(context, StatementSync::IterateReturnCallback) + .ToLocalChecked(); + + LocalVector keys(isolate, {env->next_string(), env->return_string()}); + LocalVector values(isolate, {next_func, return_func}); + + Local global = context->Global(); + Local js_iterator; + Local js_iterator_prototype; + if (!global->Get(context, env->iterator_string()).ToLocal(&js_iterator)) + return; + if (!js_iterator.As() + ->Get(context, env->prototype_string()) + .ToLocal(&js_iterator_prototype)) + return; + + DCHECK_EQ(keys.size(), values.size()); + Local iterable_iterator = Object::New( + isolate, js_iterator_prototype, keys.data(), values.data(), keys.size()); + + auto num_cols_pd = v8::PropertyDescriptor( + v8::Integer::New(isolate, sqlite3_column_count(stmt->statement_)), false); + num_cols_pd.set_enumerable(false); + num_cols_pd.set_configurable(false); + iterable_iterator + ->DefineProperty(context, env->num_cols_string(), num_cols_pd) + .ToChecked(); + + auto stmt_pd = + v8::PropertyDescriptor(v8::External::New(isolate, stmt), false); + stmt_pd.set_enumerable(false); + stmt_pd.set_configurable(false); + iterable_iterator->DefineProperty(context, env->statement_string(), stmt_pd) + .ToChecked(); + + auto is_finished_pd = + v8::PropertyDescriptor(v8::Boolean::New(isolate, false), true); + stmt_pd.set_enumerable(false); + stmt_pd.set_configurable(false); + iterable_iterator + ->DefineProperty(context, env->isfinished_string(), is_finished_pd) + .ToChecked(); + + args.GetReturnValue().Set(iterable_iterator); +} + void StatementSync::Get(const FunctionCallbackInfo& args) { StatementSync* stmt; ASSIGN_OR_RETURN_UNWRAP(&stmt, args.This()); @@ -987,6 +1557,7 @@ Local StatementSync::GetConstructorTemplate( tmpl->SetClassName(FIXED_ONE_BYTE_STRING(isolate, "StatementSync")); tmpl->InstanceTemplate()->SetInternalFieldCount( StatementSync::kInternalFieldCount); + SetProtoMethod(isolate, tmpl, "iterate", StatementSync::Iterate); SetProtoMethod(isolate, tmpl, "all", StatementSync::All); SetProtoMethod(isolate, tmpl, "get", StatementSync::Get); SetProtoMethod(isolate, tmpl, "run", StatementSync::Run); @@ -1117,6 +1688,18 @@ void Session::Delete() { session_ = nullptr; } +void DefineConstants(Local target) { + NODE_DEFINE_CONSTANT(target, SQLITE_CHANGESET_OMIT); + NODE_DEFINE_CONSTANT(target, SQLITE_CHANGESET_REPLACE); + NODE_DEFINE_CONSTANT(target, SQLITE_CHANGESET_ABORT); + + NODE_DEFINE_CONSTANT(target, SQLITE_CHANGESET_DATA); + NODE_DEFINE_CONSTANT(target, SQLITE_CHANGESET_NOTFOUND); + NODE_DEFINE_CONSTANT(target, SQLITE_CHANGESET_CONFLICT); + NODE_DEFINE_CONSTANT(target, SQLITE_CHANGESET_CONSTRAINT); + NODE_DEFINE_CONSTANT(target, SQLITE_CHANGESET_FOREIGN_KEY); +} + static void Initialize(Local target, Local unused, Local context, @@ -1127,24 +1710,32 @@ static void Initialize(Local target, NewFunctionTemplate(isolate, DatabaseSync::New); db_tmpl->InstanceTemplate()->SetInternalFieldCount( DatabaseSync::kInternalFieldCount); + Local constants = Object::New(isolate); + + DefineConstants(constants); SetProtoMethod(isolate, db_tmpl, "open", DatabaseSync::Open); SetProtoMethod(isolate, db_tmpl, "close", DatabaseSync::Close); SetProtoMethod(isolate, db_tmpl, "prepare", DatabaseSync::Prepare); SetProtoMethod(isolate, db_tmpl, "exec", DatabaseSync::Exec); + SetProtoMethod(isolate, db_tmpl, "function", DatabaseSync::CustomFunction); SetProtoMethod( isolate, db_tmpl, "createSession", DatabaseSync::CreateSession); SetProtoMethod( isolate, db_tmpl, "applyChangeset", DatabaseSync::ApplyChangeset); + SetProtoMethod(isolate, + db_tmpl, + "enableLoadExtension", + DatabaseSync::EnableLoadExtension); + SetProtoMethod( + isolate, db_tmpl, "loadExtension", DatabaseSync::LoadExtension); SetConstructorFunction(context, target, "DatabaseSync", db_tmpl); SetConstructorFunction(context, target, "StatementSync", StatementSync::GetConstructorTemplate(env)); - NODE_DEFINE_CONSTANT(target, SQLITE_CHANGESET_OMIT); - NODE_DEFINE_CONSTANT(target, SQLITE_CHANGESET_REPLACE); - NODE_DEFINE_CONSTANT(target, SQLITE_CHANGESET_ABORT); + target->Set(context, OneByteString(isolate, "constants"), constants).Check(); } } // namespace sqlite diff --git a/src/node_sqlite.h b/src/node_sqlite.h index d778d28e9ac289..e78aa39abb3ba5 100644 --- a/src/node_sqlite.h +++ b/src/node_sqlite.h @@ -49,15 +49,20 @@ class DatabaseSync : public BaseObject { DatabaseSync(Environment* env, v8::Local object, DatabaseOpenConfiguration&& open_config, - bool open); + bool open, + bool allow_load_extension); void MemoryInfo(MemoryTracker* tracker) const override; static void New(const v8::FunctionCallbackInfo& args); static void Open(const v8::FunctionCallbackInfo& args); static void Close(const v8::FunctionCallbackInfo& args); static void Prepare(const v8::FunctionCallbackInfo& args); static void Exec(const v8::FunctionCallbackInfo& args); + static void CustomFunction(const v8::FunctionCallbackInfo& args); static void CreateSession(const v8::FunctionCallbackInfo& args); static void ApplyChangeset(const v8::FunctionCallbackInfo& args); + static void EnableLoadExtension( + const v8::FunctionCallbackInfo& args); + static void LoadExtension(const v8::FunctionCallbackInfo& args); void FinalizeStatements(); void UntrackStatement(StatementSync* statement); bool IsOpen(); @@ -72,6 +77,8 @@ class DatabaseSync : public BaseObject { ~DatabaseSync() override; DatabaseOpenConfiguration open_config_; + bool allow_load_extension_; + bool enable_load_extension_; sqlite3* connection_; std::set sessions_; @@ -93,6 +100,7 @@ class StatementSync : public BaseObject { DatabaseSync* db, sqlite3_stmt* stmt); static void All(const v8::FunctionCallbackInfo& args); + static void Iterate(const v8::FunctionCallbackInfo& args); static void Get(const v8::FunctionCallbackInfo& args); static void Run(const v8::FunctionCallbackInfo& args); static void SourceSQLGetter(const v8::FunctionCallbackInfo& args); @@ -118,6 +126,11 @@ class StatementSync : public BaseObject { bool BindValue(const v8::Local& value, const int index); v8::MaybeLocal ColumnToValue(const int column); v8::MaybeLocal ColumnNameToName(const int column); + + static void IterateNextCallback( + const v8::FunctionCallbackInfo& args); + static void IterateReturnCallback( + const v8::FunctionCallbackInfo& args); }; using Sqlite3ChangesetGenFunc = int (*)(sqlite3_session*, int*, void**); diff --git a/src/node_version.h b/src/node_version.h index dc4c9f3b07f47c..81808db0fa349e 100644 --- a/src/node_version.h +++ b/src/node_version.h @@ -100,7 +100,7 @@ // The NAPI_VERSION supported by the runtime. This is the inclusive range of // versions which the Node.js binary being built supports. -#define NODE_API_SUPPORTED_VERSION_MAX 9 +#define NODE_API_SUPPORTED_VERSION_MAX 10 #define NODE_API_SUPPORTED_VERSION_MIN 1 // Node API modules use NAPI_VERSION 8 by default if it is not explicitly diff --git a/src/node_webstorage.cc b/src/node_webstorage.cc index 3d71ab33c5b41c..4d796e6df90c58 100644 --- a/src/node_webstorage.cc +++ b/src/node_webstorage.cc @@ -26,6 +26,7 @@ using v8::Intercepted; using v8::Isolate; using v8::JustVoid; using v8::Local; +using v8::LocalVector; using v8::Map; using v8::Maybe; using v8::MaybeLocal; @@ -255,7 +256,7 @@ MaybeLocal Storage::Enumerate() { int r = sqlite3_prepare_v2(db_.get(), sql.data(), sql.size(), &s, 0); CHECK_ERROR_OR_THROW(env(), r, SQLITE_OK, Local()); auto stmt = stmt_unique_ptr(s); - std::vector> values; + LocalVector values(env()->isolate()); Local value; while ((r = sqlite3_step(stmt.get())) == SQLITE_ROW) { CHECK(sqlite3_column_type(stmt.get(), 0) == SQLITE_BLOB); diff --git a/src/node_worker.cc b/src/node_worker.cc index e8026fe24c7021..f64609cf045441 100644 --- a/src/node_worker.cc +++ b/src/node_worker.cc @@ -449,6 +449,9 @@ void Worker::JoinThread() { env()->remove_sub_worker_context(this); + // Join may happen after the worker exits and disposes the isolate + if (!env()->can_call_into_js()) return; + { HandleScope handle_scope(env()->isolate()); Context::Scope context_scope(env()->context()); diff --git a/src/path.cc b/src/path.cc index 47ddba31443644..1f88e38a857171 100644 --- a/src/path.cc +++ b/src/path.cc @@ -114,7 +114,7 @@ std::string PathResolve(Environment* env, // a UNC path at this points, because UNC paths are always absolute. std::string resolvedDevicePath; const std::string envvar = "=" + resolvedDevice; - credentials::SafeGetenv(envvar.c_str(), &resolvedDevicePath); + credentials::SafeGetenv(envvar.c_str(), &resolvedDevicePath, env); path = resolvedDevicePath.empty() ? cwd : resolvedDevicePath; // Verify that a cwd was found and that it actually points diff --git a/src/permission/fs_permission.cc b/src/permission/fs_permission.cc index ba5a78df18217d..b4d6ee58efc7d6 100644 --- a/src/permission/fs_permission.cc +++ b/src/permission/fs_permission.cc @@ -58,16 +58,16 @@ bool is_tree_granted( std::string resolved_param = node::PathResolve(env, {param}); #ifdef _WIN32 // Remove leading "\\?\" from UNC path - if (resolved_param.substr(0, 4) == "\\\\?\\") { + if (resolved_param.starts_with("\\\\?\\")) { resolved_param.erase(0, 4); } // Remove leading "UNC\" from UNC path - if (resolved_param.substr(0, 4) == "UNC\\") { + if (resolved_param.starts_with("UNC\\")) { resolved_param.erase(0, 4); } // Remove leading "//" from UNC path - if (resolved_param.substr(0, 2) == "//") { + if (resolved_param.starts_with("//")) { resolved_param.erase(0, 2); } #endif diff --git a/src/process_wrap.cc b/src/process_wrap.cc index 14c9e99934e27b..27a294eb384960 100644 --- a/src/process_wrap.cc +++ b/src/process_wrap.cc @@ -314,6 +314,12 @@ class ProcessWrap : public HandleWrap { ProcessWrap* wrap; ASSIGN_OR_RETURN_UNWRAP(&wrap, args.This()); int signal = args[0]->Int32Value(env->context()).FromJust(); +#ifdef _WIN32 + if (signal != SIGKILL && signal != SIGTERM && signal != SIGINT && + signal != SIGQUIT) { + signal = SIGKILL; + } +#endif int err = uv_process_kill(&wrap->process_, signal); args.GetReturnValue().Set(err); } diff --git a/src/quic/session.cc b/src/quic/session.cc index b98ce4a132af60..4323c9268fdac2 100644 --- a/src/quic/session.cc +++ b/src/quic/session.cc @@ -1531,7 +1531,7 @@ void Session::EmitDatagram(Store&& datagram, DatagramReceivedFlags flag) { DCHECK(!is_destroyed()); if (!env()->can_call_into_js()) return; - CallbackScope cbv_scope(this); + CallbackScope cbv_scope(this); Local argv[] = {datagram.ToUint8Array(env()), v8::Boolean::New(env()->isolate(), flag.early)}; diff --git a/src/undici_version.h b/src/undici_version.h index 7acbc1f986cc58..91bc8aabba1cce 100644 --- a/src/undici_version.h +++ b/src/undici_version.h @@ -2,5 +2,5 @@ // Refer to tools/dep_updaters/update-undici.sh #ifndef SRC_UNDICI_VERSION_H_ #define SRC_UNDICI_VERSION_H_ -#define UNDICI_VERSION "6.21.0" +#define UNDICI_VERSION "7.2.0" #endif // SRC_UNDICI_VERSION_H_ diff --git a/src/util.cc b/src/util.cc index a372eb4d88ca1d..8bf239db6e47d4 100644 --- a/src/util.cc +++ b/src/util.cc @@ -782,6 +782,16 @@ std::string DetermineSpecificErrorType(Environment* env, input.As()->GetConstructorName(); Utf8Value name(env->isolate(), constructor_name); return SPrintF("an instance of %s", name.out()); + } else if (input->IsSymbol()) { + v8::MaybeLocal str = + input.As()->ToDetailString(env->context()); + v8::Local js_str; + if (!str.ToLocal(&js_str)) { + return "Symbol"; + } + Utf8Value name(env->isolate(), js_str); + // Symbol(xxx) + return name.out(); } Utf8Value utf8_value(env->isolate(), diff --git a/src/zlib_version.h b/src/zlib_version.h index f9db56d4f51d37..3b53884aae2206 100644 --- a/src/zlib_version.h +++ b/src/zlib_version.h @@ -2,5 +2,5 @@ // Refer to tools/dep_updaters/update-zlib.sh #ifndef SRC_ZLIB_VERSION_H_ #define SRC_ZLIB_VERSION_H_ -#define ZLIB_VERSION "1.3.0.1-motley-71660e1" +#define ZLIB_VERSION "1.3.0.1-motley-82a5fec" #endif // SRC_ZLIB_VERSION_H_ diff --git a/test/addons/.gitignore b/test/addons/.gitignore index bde1cf3ab9662b..b7bca943e58717 100644 --- a/test/addons/.gitignore +++ b/test/addons/.gitignore @@ -5,3 +5,4 @@ Makefile *.mk gyp-mac-tool /*/build +/esm/node_modules/*/build diff --git a/test/addons/esm/binding-export-default.cc b/test/addons/esm/binding-export-default.cc new file mode 100644 index 00000000000000..d3bb03ea3e4acb --- /dev/null +++ b/test/addons/esm/binding-export-default.cc @@ -0,0 +1,17 @@ +#include +#include +#include + +static void Method(const v8::FunctionCallbackInfo& args) { + v8::Isolate* isolate = args.GetIsolate(); + args.GetReturnValue().Set( + v8::String::NewFromUtf8(isolate, "hello world").ToLocalChecked()); +} + +static void InitModule(v8::Local exports, + v8::Local module, + v8::Local context) { + NODE_SET_METHOD(exports, "default", Method); +} + +NODE_MODULE_CONTEXT_AWARE(Binding, InitModule) diff --git a/test/addons/esm/binding-export-primitive.cc b/test/addons/esm/binding-export-primitive.cc new file mode 100644 index 00000000000000..b4dd1ddeda993a --- /dev/null +++ b/test/addons/esm/binding-export-primitive.cc @@ -0,0 +1,17 @@ +#include +#include +#include + +static void InitModule(v8::Local exports, + v8::Local module_val, + v8::Local context) { + v8::Isolate* isolate = context->GetIsolate(); + v8::Local module = module_val.As(); + module + ->Set(context, + v8::String::NewFromUtf8(isolate, "exports").ToLocalChecked(), + v8::String::NewFromUtf8(isolate, "hello world").ToLocalChecked()) + .FromJust(); +} + +NODE_MODULE_CONTEXT_AWARE(Binding, InitModule) diff --git a/test/addons/esm/binding.cc b/test/addons/esm/binding.cc new file mode 100644 index 00000000000000..a3f0bf76d3a988 --- /dev/null +++ b/test/addons/esm/binding.cc @@ -0,0 +1,17 @@ +#include +#include +#include + +static void Method(const v8::FunctionCallbackInfo& args) { + v8::Isolate* isolate = args.GetIsolate(); + args.GetReturnValue().Set( + v8::String::NewFromUtf8(isolate, "world").ToLocalChecked()); +} + +static void InitModule(v8::Local exports, + v8::Local module, + v8::Local context) { + NODE_SET_METHOD(exports, "hello", Method); +} + +NODE_MODULE_CONTEXT_AWARE(Binding, InitModule) diff --git a/test/addons/esm/binding.gyp b/test/addons/esm/binding.gyp new file mode 100644 index 00000000000000..f94ca7392eabff --- /dev/null +++ b/test/addons/esm/binding.gyp @@ -0,0 +1,40 @@ +{ + 'variables': { + 'source_dir': ' { + assert.strictEqual(mod.default.hello(), 'world'); + }) + .then(common.mustCall()); diff --git a/test/addons/esm/test-import.js b/test/addons/esm/test-import.js new file mode 100644 index 00000000000000..6ff6bee660c6e9 --- /dev/null +++ b/test/addons/esm/test-import.js @@ -0,0 +1,7 @@ +// Flags: --experimental-addon-modules +'use strict'; +const common = require('../../common'); + +import('./test-esm.mjs') + .then((mod) => mod.run()) + .then(common.mustCall()); diff --git a/test/addons/esm/test-require-package.js b/test/addons/esm/test-require-package.js new file mode 100644 index 00000000000000..93eadb8f09f5bc --- /dev/null +++ b/test/addons/esm/test-require-package.js @@ -0,0 +1,12 @@ +// Flags: --experimental-addon-modules +'use strict'; +require('../../common'); +const assert = require('node:assert'); + +/** + * Test that the export condition `node-addons` can be used + * with `*.node` files with the CJS loader. + */ + +const mod = require('esm-package/binding'); +assert.strictEqual(mod.hello(), 'world'); diff --git a/test/addons/esm/test-require.js b/test/addons/esm/test-require.js new file mode 100644 index 00000000000000..79a0904ebd1377 --- /dev/null +++ b/test/addons/esm/test-require.js @@ -0,0 +1,6 @@ +// Flags: --experimental-addon-modules +'use strict'; +const common = require('../../common'); + +require('./test-esm.mjs') + .run().then(common.mustCall()); diff --git a/test/addons/no-addons/permission.js b/test/addons/no-addons/permission.js index 0fbcd2bb1ee782..1d1bbf6e95468e 100644 --- a/test/addons/no-addons/permission.js +++ b/test/addons/no-addons/permission.js @@ -1,4 +1,4 @@ -// Flags: --experimental-permission --allow-fs-read=* +// Flags: --permission --allow-fs-read=* 'use strict'; diff --git a/test/async-hooks/async-hooks.status b/test/async-hooks/async-hooks.status index 5dca3cb04f240c..673883e4fe3d4d 100644 --- a/test/async-hooks/async-hooks.status +++ b/test/async-hooks/async-hooks.status @@ -9,8 +9,6 @@ prefix async-hooks [$system==win32] [$system==linux] -# https://github.com/nodejs/node/issues/54809 -test-writewrap: PASS, FLAKY [$system==macos] diff --git a/test/cctest/test_encoding_binding.cc b/test/cctest/test_encoding_binding.cc new file mode 100644 index 00000000000000..d5d14c60fedf7e --- /dev/null +++ b/test/cctest/test_encoding_binding.cc @@ -0,0 +1,176 @@ +#include "encoding_binding.h" +#include "env-inl.h" +#include "gtest/gtest.h" +#include "node_test_fixture.h" +#include "v8.h" + +namespace node { +namespace encoding_binding { + +bool RunDecodeLatin1(Environment* env, + Local args[], + bool ignore_bom, + bool has_fatal, + Local* result) { + Isolate* isolate = env->isolate(); + TryCatch try_catch(isolate); + + Local ignoreBOMValue = Boolean::New(isolate, ignore_bom); + Local fatalValue = Boolean::New(isolate, has_fatal); + + Local updatedArgs[] = {args[0], ignoreBOMValue, fatalValue}; + + BindingData::DecodeLatin1(FunctionCallbackInfo(updatedArgs)); + + if (try_catch.HasCaught()) { + return false; + } + + *result = args[0]; + return true; +} + +class EncodingBindingTest : public NodeTestFixture {}; + +TEST_F(EncodingBindingTest, DecodeLatin1_ValidInput) { + Environment* env = CreateEnvironment(); + Isolate* isolate = env->isolate(); + HandleScope handle_scope(isolate); + + const uint8_t latin1_data[] = {0xC1, 0xE9, 0xF3}; + Local ab = ArrayBuffer::New(isolate, sizeof(latin1_data)); + memcpy(ab->GetBackingStore()->Data(), latin1_data, sizeof(latin1_data)); + + Local array = Uint8Array::New(ab, 0, sizeof(latin1_data)); + Local args[] = {array}; + + Local result; + EXPECT_TRUE(RunDecodeLatin1(env, args, false, false, &result)); + + String::Utf8Value utf8_result(isolate, result); + EXPECT_STREQ(*utf8_result, "Áéó"); +} + +TEST_F(EncodingBindingTest, DecodeLatin1_EmptyInput) { + Environment* env = CreateEnvironment(); + Isolate* isolate = env->isolate(); + HandleScope handle_scope(isolate); + + Local ab = ArrayBuffer::New(isolate, 0); + Local array = Uint8Array::New(ab, 0, 0); + Local args[] = {array}; + + Local result; + EXPECT_TRUE(RunDecodeLatin1(env, args, false, false, &result)); + + String::Utf8Value utf8_result(isolate, result); + EXPECT_STREQ(*utf8_result, ""); +} + +TEST_F(EncodingBindingTest, DecodeLatin1_InvalidInput) { + Environment* env = CreateEnvironment(); + Isolate* isolate = env->isolate(); + HandleScope handle_scope(isolate); + + Local args[] = {String::NewFromUtf8Literal(isolate, "Invalid input")}; + + Local result; + EXPECT_FALSE(RunDecodeLatin1(env, args, false, false, &result)); +} + +TEST_F(EncodingBindingTest, DecodeLatin1_IgnoreBOM) { + Environment* env = CreateEnvironment(); + Isolate* isolate = env->isolate(); + HandleScope handle_scope(isolate); + + const uint8_t latin1_data[] = {0xFE, 0xFF, 0xC1, 0xE9, 0xF3}; + Local ab = ArrayBuffer::New(isolate, sizeof(latin1_data)); + memcpy(ab->GetBackingStore()->Data(), latin1_data, sizeof(latin1_data)); + + Local array = Uint8Array::New(ab, 0, sizeof(latin1_data)); + Local args[] = {array}; + + Local result; + EXPECT_TRUE(RunDecodeLatin1(env, args, true, false, &result)); + + String::Utf8Value utf8_result(isolate, result); + EXPECT_STREQ(*utf8_result, "Áéó"); +} + +TEST_F(EncodingBindingTest, DecodeLatin1_FatalInvalidInput) { + Environment* env = CreateEnvironment(); + Isolate* isolate = env->isolate(); + HandleScope handle_scope(isolate); + + const uint8_t invalid_data[] = {0xFF, 0xFF, 0xFF}; + Local ab = ArrayBuffer::New(isolate, sizeof(invalid_data)); + memcpy(ab->GetBackingStore()->Data(), invalid_data, sizeof(invalid_data)); + + Local array = Uint8Array::New(ab, 0, sizeof(invalid_data)); + Local args[] = {array}; + + Local result; + EXPECT_FALSE(RunDecodeLatin1(env, args, false, true, &result)); +} + +TEST_F(EncodingBindingTest, DecodeLatin1_IgnoreBOMAndFatal) { + Environment* env = CreateEnvironment(); + Isolate* isolate = env->isolate(); + HandleScope handle_scope(isolate); + + const uint8_t latin1_data[] = {0xFE, 0xFF, 0xC1, 0xE9, 0xF3}; + Local ab = ArrayBuffer::New(isolate, sizeof(latin1_data)); + memcpy(ab->GetBackingStore()->Data(), latin1_data, sizeof(latin1_data)); + + Local array = Uint8Array::New(ab, 0, sizeof(latin1_data)); + Local args[] = {array}; + + Local result; + EXPECT_TRUE(RunDecodeLatin1(env, args, true, true, &result)); + + String::Utf8Value utf8_result(isolate, result); + EXPECT_STREQ(*utf8_result, "Áéó"); +} + +TEST_F(EncodingBindingTest, DecodeLatin1_BOMPresent) { + Environment* env = CreateEnvironment(); + Isolate* isolate = env->isolate(); + HandleScope handle_scope(isolate); + + const uint8_t latin1_data[] = {0xFF, 0xC1, 0xE9, 0xF3}; + Local ab = ArrayBuffer::New(isolate, sizeof(latin1_data)); + memcpy(ab->GetBackingStore()->Data(), latin1_data, sizeof(latin1_data)); + + Local array = Uint8Array::New(ab, 0, sizeof(latin1_data)); + Local args[] = {array}; + + Local result; + EXPECT_TRUE(RunDecodeLatin1(env, args, true, false, &result)); + + String::Utf8Value utf8_result(isolate, result); + EXPECT_STREQ(*utf8_result, "Áéó"); +} + +TEST_F(EncodingBindingTest, DecodeLatin1_ReturnsString) { + Environment* env = CreateEnvironment(); + Isolate* isolate = env->isolate(); + HandleScope handle_scope(isolate); + + const uint8_t latin1_data[] = {0xC1, 0xE9, 0xF3}; + Local ab = ArrayBuffer::New(isolate, sizeof(latin1_data)); + memcpy(ab->GetBackingStore()->Data(), latin1_data, sizeof(latin1_data)); + + Local array = Uint8Array::New(ab, 0, sizeof(latin1_data)); + Local args[] = {array}; + + Local result; + ASSERT_TRUE(RunDecodeLatin1(env, args, false, false, &result)); + + ASSERT_TRUE(result->IsString()); + + String::Utf8Value utf8_result(isolate, result); + EXPECT_STREQ(*utf8_result, "Áéó"); +} + +} // namespace encoding_binding +} // namespace node diff --git a/test/cctest/test_sockaddr.cc b/test/cctest/test_sockaddr.cc index bd80d59f821e5d..68b8739f97e1fc 100644 --- a/test/cctest/test_sockaddr.cc +++ b/test/cctest/test_sockaddr.cc @@ -145,9 +145,9 @@ TEST(SocketAddress, Comparison) { SocketAddress addr5(reinterpret_cast(&storage[4])); SocketAddress addr6(reinterpret_cast(&storage[5])); - CHECK_EQ(addr1.compare(addr1), SocketAddress::CompareResult::SAME); - CHECK_EQ(addr1.compare(addr2), SocketAddress::CompareResult::LESS_THAN); - CHECK_EQ(addr2.compare(addr1), SocketAddress::CompareResult::GREATER_THAN); + CHECK_EQ(addr1.compare(addr1), std::partial_ordering::equivalent); + CHECK_EQ(addr1.compare(addr2), std::partial_ordering::less); + CHECK_EQ(addr2.compare(addr1), std::partial_ordering::greater); CHECK(addr1 <= addr1); CHECK(addr1 < addr2); CHECK(addr1 <= addr2); @@ -155,9 +155,9 @@ TEST(SocketAddress, Comparison) { CHECK(addr2 > addr1); CHECK(addr2 >= addr1); - CHECK_EQ(addr3.compare(addr3), SocketAddress::CompareResult::SAME); - CHECK_EQ(addr3.compare(addr4), SocketAddress::CompareResult::LESS_THAN); - CHECK_EQ(addr4.compare(addr3), SocketAddress::CompareResult::GREATER_THAN); + CHECK_EQ(addr3.compare(addr3), std::partial_ordering::equivalent); + CHECK_EQ(addr3.compare(addr4), std::partial_ordering::less); + CHECK_EQ(addr4.compare(addr3), std::partial_ordering::greater); CHECK(addr3 <= addr3); CHECK(addr3 < addr4); CHECK(addr3 <= addr4); @@ -166,8 +166,8 @@ TEST(SocketAddress, Comparison) { CHECK(addr4 >= addr3); // Not comparable - CHECK_EQ(addr1.compare(addr3), SocketAddress::CompareResult::NOT_COMPARABLE); - CHECK_EQ(addr3.compare(addr1), SocketAddress::CompareResult::NOT_COMPARABLE); + CHECK_EQ(addr1.compare(addr3), std::partial_ordering::unordered); + CHECK_EQ(addr3.compare(addr1), std::partial_ordering::unordered); CHECK(!(addr1 < addr3)); CHECK(!(addr1 > addr3)); CHECK(!(addr1 >= addr3)); @@ -178,10 +178,10 @@ TEST(SocketAddress, Comparison) { CHECK(!(addr3 <= addr1)); // Comparable - CHECK_EQ(addr1.compare(addr5), SocketAddress::CompareResult::SAME); - CHECK_EQ(addr2.compare(addr6), SocketAddress::CompareResult::SAME); - CHECK_EQ(addr1.compare(addr6), SocketAddress::CompareResult::LESS_THAN); - CHECK_EQ(addr6.compare(addr1), SocketAddress::CompareResult::GREATER_THAN); + CHECK_EQ(addr1.compare(addr5), std::partial_ordering::equivalent); + CHECK_EQ(addr2.compare(addr6), std::partial_ordering::equivalent); + CHECK_EQ(addr1.compare(addr6), std::partial_ordering::less); + CHECK_EQ(addr6.compare(addr1), std::partial_ordering::greater); CHECK(addr1 <= addr5); CHECK(addr1 <= addr6); CHECK(addr1 < addr6); diff --git a/test/common/index.js b/test/common/index.js index 50595945b193f4..b5592a66a081c3 100644 --- a/test/common/index.js +++ b/test/common/index.js @@ -1051,14 +1051,6 @@ const common = { return hasOpenSSL(3); }, - get hasOpenSSL31() { - return hasOpenSSL(3, 1); - }, - - get hasOpenSSL32() { - return hasOpenSSL(3, 2); - }, - get inFreeBSDJail() { if (inFreeBSDJail !== null) return inFreeBSDJail; @@ -1143,6 +1135,15 @@ const common = { get checkoutEOL() { return fs.readFileSync(__filename).includes('\r\n') ? '\r\n' : '\n'; }, + + get isInsideDirWithUnusualChars() { + return __dirname.includes('%') || + (!isWindows && __dirname.includes('\\')) || + __dirname.includes('$') || + __dirname.includes('\n') || + __dirname.includes('\r') || + __dirname.includes('\t'); + }, }; const validProperties = new Set(Object.keys(common)); diff --git a/test/common/index.mjs b/test/common/index.mjs index 748977b85f8012..b252f2dc4aac5e 100644 --- a/test/common/index.mjs +++ b/test/common/index.mjs @@ -26,6 +26,7 @@ const { isDumbTerminal, isFreeBSD, isIBMi, + isInsideDirWithUnusualChars, isLinux, isLinuxPPCBE, isMainThread, @@ -81,6 +82,7 @@ export { isDumbTerminal, isFreeBSD, isIBMi, + isInsideDirWithUnusualChars, isLinux, isLinuxPPCBE, isMainThread, diff --git a/test/common/report.js b/test/common/report.js index 3280116feb83d9..ade0f9aa94a023 100644 --- a/test/common/report.js +++ b/test/common/report.js @@ -110,7 +110,7 @@ function _validateContent(report, fields = []) { 'glibcVersionRuntime', 'glibcVersionCompiler', 'cwd', 'reportVersion', 'networkInterfaces', 'threadId']; checkForUnknownFields(header, headerFields); - assert.strictEqual(header.reportVersion, 4); // Increment as needed. + assert.strictEqual(header.reportVersion, 5); // Increment as needed. assert.strictEqual(typeof header.event, 'string'); assert.strictEqual(typeof header.trigger, 'string'); assert(typeof header.filename === 'string' || header.filename === null); @@ -309,11 +309,11 @@ function _validateContent(report, fields = []) { // Verify the format of the userLimits section on non-Windows platforms. if (!isWindows) { - const userLimitsFields = ['core_file_size_blocks', 'data_seg_size_kbytes', + const userLimitsFields = ['core_file_size_blocks', 'data_seg_size_bytes', 'file_size_blocks', 'max_locked_memory_bytes', - 'max_memory_size_kbytes', 'open_files', + 'max_memory_size_bytes', 'open_files', 'stack_size_bytes', 'cpu_time_seconds', - 'max_user_processes', 'virtual_memory_kbytes']; + 'max_user_processes', 'virtual_memory_bytes']; checkForUnknownFields(report.userLimits, userLimitsFields); for (const [type, limits] of Object.entries(report.userLimits)) { assert.strictEqual(typeof type, 'string'); diff --git a/test/es-module/test-cjs-legacyMainResolve-permission.js b/test/es-module/test-cjs-legacyMainResolve-permission.js index 392bfb753d7764..fcebc22ccf2929 100644 --- a/test/es-module/test-cjs-legacyMainResolve-permission.js +++ b/test/es-module/test-cjs-legacyMainResolve-permission.js @@ -1,6 +1,6 @@ 'use strict'; -// Flags: --expose-internals --experimental-permission --allow-fs-read=* --allow-child-process +// Flags: --expose-internals --permission --allow-fs-read=* --allow-child-process require('../common'); @@ -40,7 +40,7 @@ describe('legacyMainResolve', () => { process.execPath, [ '--expose-internals', - '--experimental-permission', + '--permission', ...allowReadFiles, '-e', ` @@ -98,7 +98,7 @@ describe('legacyMainResolve', () => { process.execPath, [ '--expose-internals', - '--experimental-permission', + '--permission', ...allowReadFiles, '-e', ` diff --git a/test/es-module/test-esm-detect-ambiguous.mjs b/test/es-module/test-esm-detect-ambiguous.mjs index 8da2fea8022a63..8b630b8cff6314 100644 --- a/test/es-module/test-esm-detect-ambiguous.mjs +++ b/test/es-module/test-esm-detect-ambiguous.mjs @@ -52,19 +52,6 @@ describe('Module syntax detection', { concurrency: !process.env.TEST_PARALLEL }, strictEqual(signal, null); }); - it('should be overridden by --experimental-default-type', async () => { - const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ - '--experimental-default-type=commonjs', - '--eval', - 'import.meta.url', - ]); - - match(stderr, /SyntaxError: Cannot use 'import\.meta' outside a module/); - strictEqual(stdout, ''); - strictEqual(code, 1); - strictEqual(signal, null); - }); - it('does not trigger detection via source code `eval()`', async () => { const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ '--eval', diff --git a/test/es-module/test-esm-extensionless-esm-and-wasm.mjs b/test/es-module/test-esm-extensionless-esm-and-wasm.mjs index 17786b61291ab6..41fda57cfa4e30 100644 --- a/test/es-module/test-esm-extensionless-esm-and-wasm.mjs +++ b/test/es-module/test-esm-extensionless-esm-and-wasm.mjs @@ -77,7 +77,6 @@ describe('extensionless ES modules within no package scope', { concurrency: !pro }); describe('extensionless Wasm within no package scope', { concurrency: !process.env.TEST_PARALLEL }, () => { - // This succeeds with `--experimental-default-type=module` it('should error as the entry point', async () => { const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ '--experimental-wasm-modules', diff --git a/test/es-module/test-esm-invalid-pjson.js b/test/es-module/test-esm-invalid-pjson.js index 8eb417eec3a1a5..2235aa00e90653 100644 --- a/test/es-module/test-esm-invalid-pjson.js +++ b/test/es-module/test-esm-invalid-pjson.js @@ -19,6 +19,8 @@ describe('ESM: Package.json', { concurrency: !process.env.TEST_PARALLEL }, () => assert.ok( stderr.includes( `Invalid package config ${path.toNamespacedPath(invalidJson)} while importing "invalid-pjson" from ${entry}.` + ) || stderr.includes( + `Invalid package config ${path.toNamespacedPath(invalidJson)} while importing "invalid-pjson" from ${path.toNamespacedPath(entry)}.` ), stderr ); diff --git a/test/es-module/test-esm-loader-entry-url.mjs b/test/es-module/test-esm-loader-entry-url.mjs index e0b931693654a0..f6be7bcf7eebea 100644 --- a/test/es-module/test-esm-loader-entry-url.mjs +++ b/test/es-module/test-esm-loader-entry-url.mjs @@ -84,7 +84,7 @@ describe('--entry-url', { concurrency: true }, () => { for (const url of typescriptUrls) { await assertSpawnedProcess( - ['--entry-url', '--experimental-strip-types', fixtures.fileURL(url)], + ['--entry-url', fixtures.fileURL(url)], {}, { ...experimentalFeatureWarning, diff --git a/test/es-module/test-esm-loader-hooks.mjs b/test/es-module/test-esm-loader-hooks.mjs index 4a4d15648a79b5..ed5c27cbc4b84f 100644 --- a/test/es-module/test-esm-loader-hooks.mjs +++ b/test/es-module/test-esm-loader-hooks.mjs @@ -182,7 +182,7 @@ describe('Loader hooks', { concurrency: !process.env.TEST_PARALLEL }, () => { it('should work without worker permission', async () => { const { code, signal, stdout, stderr } = await spawnPromisified(execPath, [ '--no-warnings', - '--experimental-permission', + '--permission', '--allow-fs-read', '*', '--experimental-loader', @@ -199,7 +199,7 @@ describe('Loader hooks', { concurrency: !process.env.TEST_PARALLEL }, () => { it('should allow loader hooks to spawn workers when allowed by the CLI flags', async () => { const { code, signal, stdout, stderr } = await spawnPromisified(execPath, [ '--no-warnings', - '--experimental-permission', + '--permission', '--allow-worker', '--allow-fs-read', '*', @@ -217,7 +217,7 @@ describe('Loader hooks', { concurrency: !process.env.TEST_PARALLEL }, () => { it('should not allow loader hooks to spawn workers if restricted by the CLI flags', async () => { const { code, signal, stdout, stderr } = await spawnPromisified(execPath, [ '--no-warnings', - '--experimental-permission', + '--permission', '--allow-fs-read', '*', '--experimental-loader', diff --git a/test/es-module/test-esm-loader-spawn-promisified.mjs b/test/es-module/test-esm-loader-spawn-promisified.mjs index 628ff3f0d423e5..2f27f7850f646e 100644 --- a/test/es-module/test-esm-loader-spawn-promisified.mjs +++ b/test/es-module/test-esm-loader-spawn-promisified.mjs @@ -285,4 +285,20 @@ describe('Loader hooks parsing modules', { concurrency: !process.env.TEST_PARALL assert.strictEqual(code, 0); assert.strictEqual(signal, null); }); + + it('throw maximum call stack error on the loader', async () => { + const { code, signal, stdout, stderr } = await spawnPromisified(execPath, [ + '--no-warnings', + '--experimental-loader', + fixtures.fileURL('/es-module-loaders/hooks-custom.mjs'), + '--input-type=module', + '--eval', + 'await import("esmHook/maximumCallStack.mjs")', + ]); + + assert(stderr.includes('Maximum call stack size exceeded')); + assert.strictEqual(stdout, ''); + assert.strictEqual(code, 1); + assert.strictEqual(signal, null); + }); }); diff --git a/test/es-module/test-esm-resolve-type.mjs b/test/es-module/test-esm-resolve-type.mjs index 7ba1fcbf1437ce..22163bbd5defb8 100644 --- a/test/es-module/test-esm-resolve-type.mjs +++ b/test/es-module/test-esm-resolve-type.mjs @@ -186,7 +186,7 @@ try { [ 'qmod', 'index.js', 'imp.js', 'commonjs', 'module', 'module', '?k=v'], [ 'hmod', 'index.js', 'imp.js', 'commonjs', 'module', 'module', '#Key'], [ 'qhmod', 'index.js', 'imp.js', 'commonjs', 'module', 'module', '?k=v#h'], - [ 'ts-mod-com', 'index.js', 'imp.ts', 'module', 'commonjs', undefined], + [ 'ts-mod-com', 'index.js', 'imp.ts', 'module', 'commonjs', 'commonjs-typescript'], ].forEach((testVariant) => { const [ moduleName, diff --git a/test/es-module/test-esm-type-flag-cli-entry.mjs b/test/es-module/test-esm-type-flag-cli-entry.mjs deleted file mode 100644 index 673a5f2da15ae0..00000000000000 --- a/test/es-module/test-esm-type-flag-cli-entry.mjs +++ /dev/null @@ -1,96 +0,0 @@ -import { spawnPromisified } from '../common/index.mjs'; -import * as fixtures from '../common/fixtures.mjs'; -import { describe, it } from 'node:test'; -import { match, strictEqual } from 'node:assert'; - -describe('--experimental-default-type=module should not support extension searching', { - concurrency: !process.env.TEST_PARALLEL, -}, () => { - it('should support extension searching under --experimental-default-type=commonjs', async () => { - const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ - '--experimental-default-type=commonjs', - 'index', - ], { - cwd: fixtures.path('es-modules/package-without-type'), - }); - - strictEqual(stdout, 'package-without-type\n'); - strictEqual(stderr, ''); - strictEqual(code, 0); - strictEqual(signal, null); - }); - - it('should error with implicit extension under --experimental-default-type=module', async () => { - const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ - '--experimental-default-type=module', - 'index', - ], { - cwd: fixtures.path('es-modules/package-without-type'), - }); - - match(stderr, /ENOENT.*Did you mean to import .*index\.js"\?/s); - strictEqual(stdout, ''); - strictEqual(code, 1); - strictEqual(signal, null); - }); -}); - -describe('--experimental-default-type=module should not parse paths as URLs', { - concurrency: !process.env.TEST_PARALLEL, -}, () => { - it('should not parse a `?` in a filename as starting a query string', async () => { - const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ - '--experimental-default-type=module', - 'file#1.js', - ], { - cwd: fixtures.path('es-modules/package-without-type'), - }); - - strictEqual(stderr, ''); - strictEqual(stdout, 'file#1\n'); - strictEqual(code, 0); - strictEqual(signal, null); - }); - - it('should resolve `..`', async () => { - const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ - '--experimental-default-type=module', - '../package-without-type/file#1.js', - ], { - cwd: fixtures.path('es-modules/package-without-type'), - }); - - strictEqual(stderr, ''); - strictEqual(stdout, 'file#1\n'); - strictEqual(code, 0); - strictEqual(signal, null); - }); - - it('should allow a leading `./`', async () => { - const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ - '--experimental-default-type=module', - './file#1.js', - ], { - cwd: fixtures.path('es-modules/package-without-type'), - }); - - strictEqual(stderr, ''); - strictEqual(stdout, 'file#1\n'); - strictEqual(code, 0); - strictEqual(signal, null); - }); - - it('should not require a leading `./`', async () => { - const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ - '--experimental-default-type=module', - 'file#1.js', - ], { - cwd: fixtures.path('es-modules/package-without-type'), - }); - - strictEqual(stderr, ''); - strictEqual(stdout, 'file#1\n'); - strictEqual(code, 0); - strictEqual(signal, null); - }); -}); diff --git a/test/es-module/test-esm-type-flag-errors.mjs b/test/es-module/test-esm-type-flag-errors.mjs deleted file mode 100644 index 2f7a1db35d2423..00000000000000 --- a/test/es-module/test-esm-type-flag-errors.mjs +++ /dev/null @@ -1,103 +0,0 @@ -import { spawnPromisified } from '../common/index.mjs'; -import * as fixtures from '../common/fixtures.mjs'; -import { describe, it } from 'node:test'; -import { deepStrictEqual, match, strictEqual } from 'node:assert'; - -describe('--experimental-default-type=module', { concurrency: !process.env.TEST_PARALLEL }, () => { - describe('should not affect the interpretation of files with unknown extensions', { - concurrency: !process.env.TEST_PARALLEL, - }, () => { - it('should error on an entry point with an unknown extension', async () => { - const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ - '--experimental-default-type=module', - fixtures.path('es-modules/package-type-module/extension.unknown'), - ]); - - match(stderr, /ERR_UNKNOWN_FILE_EXTENSION/); - strictEqual(stdout, ''); - strictEqual(code, 1); - strictEqual(signal, null); - }); - - it('should error on an import with an unknown extension', async () => { - const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ - '--experimental-default-type=module', - fixtures.path('es-modules/package-type-module/imports-unknownext.mjs'), - ]); - - match(stderr, /ERR_UNKNOWN_FILE_EXTENSION/); - strictEqual(stdout, ''); - strictEqual(code, 1); - strictEqual(signal, null); - }); - }); - - it('should affect CJS .js files (imported, required, entry points)', async () => { - const result = await spawnPromisified(process.execPath, [ - '--experimental-default-type=module', - fixtures.path('es-modules/package-type-commonjs/echo-require-cache.js'), - ]); - - deepStrictEqual(result, { - code: 0, - stderr: '', - stdout: 'undefined\n', - signal: null, - }); - }); - - it('should affect .cjs files that are imported', async () => { - const result = await spawnPromisified(process.execPath, [ - '--experimental-default-type=module', - '-e', - `import ${JSON.stringify(fixtures.fileURL('es-module-require-cache/echo.cjs'))}`, - ]); - - deepStrictEqual(result, { - code: 0, - stderr: '', - stdout: 'undefined\n', - signal: null, - }); - }); - - it('should affect entry point .cjs files (with no hooks)', async () => { - const { stderr, stdout, code } = await spawnPromisified(process.execPath, [ - '--experimental-default-type=module', - fixtures.path('es-module-require-cache/echo.cjs'), - ]); - - strictEqual(stderr, ''); - match(stdout, /^undefined\n$/); - strictEqual(code, 0); - }); - - it('should affect entry point .cjs files (when any hooks is registered)', async () => { - const result = await spawnPromisified(process.execPath, [ - '--experimental-default-type=module', - '--import', - 'data:text/javascript,import{register}from"node:module";register("data:text/javascript,");', - fixtures.path('es-module-require-cache/echo.cjs'), - ]); - - deepStrictEqual(result, { - code: 0, - stderr: '', - stdout: 'undefined\n', - signal: null, - }); - }); - - it('should not affect CJS from input-type', async () => { - const { stderr, stdout, code } = await spawnPromisified(process.execPath, [ - '--experimental-default-type=module', - '--input-type=commonjs', - '-p', - 'require.cache', - ]); - - strictEqual(stderr, ''); - match(stdout, /^\[Object: null prototype\] \{\}\n$/); - strictEqual(code, 0); - }); -}); diff --git a/test/es-module/test-esm-type-flag-loose-files.mjs b/test/es-module/test-esm-type-flag-loose-files.mjs deleted file mode 100644 index afa306099d5e6a..00000000000000 --- a/test/es-module/test-esm-type-flag-loose-files.mjs +++ /dev/null @@ -1,75 +0,0 @@ -// Flags: --experimental-default-type=module --experimental-wasm-modules -import { spawnPromisified } from '../common/index.mjs'; -import * as fixtures from '../common/fixtures.mjs'; -import { describe, it } from 'node:test'; -import { strictEqual } from 'node:assert'; - -describe('the type flag should change the interpretation of certain files outside of any package scope', - { concurrency: !process.env.TEST_PARALLEL }, () => { - it('should run as ESM a .js file that is outside of any package scope', async () => { - const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ - '--experimental-default-type=module', - fixtures.path('es-modules/loose.js'), - ]); - - strictEqual(stderr, ''); - strictEqual(stdout, 'executed\n'); - strictEqual(code, 0); - strictEqual(signal, null); - }); - - it('should run as ESM an extensionless JavaScript file that is outside of any package scope', async () => { - const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ - '--experimental-default-type=module', - fixtures.path('es-modules/noext-esm'), - ]); - - strictEqual(stderr, ''); - strictEqual(stdout, 'executed\n'); - strictEqual(code, 0); - strictEqual(signal, null); - }); - - it('should run as Wasm an extensionless Wasm file that is outside of any package scope', async () => { - const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ - '--experimental-default-type=module', - '--experimental-wasm-modules', - '--no-warnings', - fixtures.path('es-modules/noext-wasm'), - ]); - - strictEqual(stderr, ''); - strictEqual(stdout, ''); - strictEqual(code, 0); - strictEqual(signal, null); - }); - - it('should import as ESM a .js file that is outside of any package scope', async () => { - const { default: defaultExport } = await import(fixtures.fileURL('es-modules/loose.js')); - strictEqual(defaultExport, 'module'); - }); - - it('should import as ESM an extensionless JavaScript file that is outside of any package scope', - async () => { - const { default: defaultExport } = await import(fixtures.fileURL('es-modules/noext-esm')); - strictEqual(defaultExport, 'module'); - }); - - it('should import as Wasm an extensionless Wasm file that is outside of any package scope', async () => { - const { add } = await import(fixtures.fileURL('es-modules/noext-wasm')); - strictEqual(add(1, 2), 3); - }); - - it('should check as ESM input passed via --check', async () => { - const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ - '--experimental-default-type=module', - '--check', - fixtures.path('es-modules/loose.js'), - ]); - - strictEqual(stderr, ''); - strictEqual(stdout, ''); - strictEqual(code, 0); - strictEqual(signal, null); - }); - }); diff --git a/test/es-module/test-esm-type-flag-package-scopes.mjs b/test/es-module/test-esm-type-flag-package-scopes.mjs deleted file mode 100644 index 18d7d04f53a25b..00000000000000 --- a/test/es-module/test-esm-type-flag-package-scopes.mjs +++ /dev/null @@ -1,167 +0,0 @@ -// Flags: --experimental-default-type=module --experimental-wasm-modules -import { spawnPromisified } from '../common/index.mjs'; -import * as fixtures from '../common/fixtures.mjs'; -import { describe, it } from 'node:test'; -import { strictEqual } from 'node:assert'; - -describe('the type flag should change the interpretation of certain files within a "type": "module" package scope', - { concurrency: !process.env.TEST_PARALLEL }, () => { - it('should run as ESM an extensionless JavaScript file within a "type": "module" scope', async () => { - const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ - '--experimental-default-type=module', - fixtures.path('es-modules/package-type-module/noext-esm'), - ]); - - strictEqual(stderr, ''); - strictEqual(stdout, 'executed\n'); - strictEqual(code, 0); - strictEqual(signal, null); - }); - - it('should import an extensionless JavaScript file within a "type": "module" scope', async () => { - const { default: defaultExport } = - await import(fixtures.fileURL('es-modules/package-type-module/noext-esm')); - strictEqual(defaultExport, 'module'); - }); - - it('should import an extensionless JavaScript file within a "type": "module" scope under node_modules', - async () => { - const { default: defaultExport } = - await import(fixtures.fileURL( - 'es-modules/package-type-module/node_modules/dep-with-package-json-type-module/noext-esm')); - strictEqual(defaultExport, 'module'); - }); - - it('should run as Wasm an extensionless Wasm file within a "type": "module" scope', async () => { - const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ - '--experimental-default-type=module', - '--experimental-wasm-modules', - '--no-warnings', - fixtures.path('es-modules/package-type-module/noext-wasm'), - ]); - - strictEqual(stderr, ''); - strictEqual(stdout, 'executed\n'); - strictEqual(code, 0); - strictEqual(signal, null); - }); - - it('should import as Wasm an extensionless Wasm file within a "type": "module" scope', async () => { - const { add } = await import(fixtures.fileURL('es-modules/package-type-module/noext-wasm')); - strictEqual(add(1, 2), 3); - }); - - it('should import an extensionless Wasm file within a "type": "module" scope under node_modules', - async () => { - const { add } = await import(fixtures.fileURL( - 'es-modules/package-type-module/node_modules/dep-with-package-json-type-module/noext-wasm')); - strictEqual(add(1, 2), 3); - }); - }); - -describe(`the type flag should change the interpretation of certain files within a package scope that lacks a -"type" field and is not under node_modules`, { concurrency: !process.env.TEST_PARALLEL }, () => { - it('should run as ESM a .js file within package scope that has no defined "type" and is not under node_modules', - async () => { - const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ - '--experimental-default-type=module', - fixtures.path('es-modules/package-without-type/module.js'), - ]); - - strictEqual(stderr, ''); - strictEqual(stdout, 'executed\n'); - strictEqual(code, 0); - strictEqual(signal, null); - }); - - it(`should run as ESM an extensionless JavaScript file within a package scope that has no defined "type" and is not -under node_modules`, async () => { - const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ - '--experimental-default-type=module', - fixtures.path('es-modules/package-without-type/noext-esm'), - ]); - - strictEqual(stderr, ''); - strictEqual(stdout, 'executed\n'); - strictEqual(code, 0); - strictEqual(signal, null); - }); - - it(`should run as Wasm an extensionless Wasm file within a package scope that has no defined "type" and is not under - node_modules`, async () => { - const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ - '--experimental-default-type=module', - '--experimental-wasm-modules', - '--no-warnings', - fixtures.path('es-modules/noext-wasm'), - ]); - - strictEqual(stderr, ''); - strictEqual(stdout, ''); - strictEqual(code, 0); - strictEqual(signal, null); - }); - - it('should import as ESM a .js file within package scope that has no defined "type" and is not under node_modules', - async () => { - const { default: defaultExport } = await import(fixtures.fileURL('es-modules/package-without-type/module.js')); - strictEqual(defaultExport, 'module'); - }); - - it(`should import as ESM an extensionless JavaScript file within a package scope that has no defined "type" and is - not under node_modules`, async () => { - const { default: defaultExport } = await import(fixtures.fileURL('es-modules/package-without-type/noext-esm')); - strictEqual(defaultExport, 'module'); - }); - - it(`should import as Wasm an extensionless Wasm file within a package scope that has no defined "type" and is not - under node_modules`, async () => { - const { add } = await import(fixtures.fileURL('es-modules/noext-wasm')); - strictEqual(add(1, 2), 3); - }); -}); - -describe(`the type flag should NOT change the interpretation of certain files within a package scope that lacks a -"type" field and is under node_modules`, { concurrency: !process.env.TEST_PARALLEL }, () => { - it('should run as CommonJS a .js file within package scope that has no defined "type" and is under node_modules', - async () => { - const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ - '--experimental-default-type=module', - fixtures.path('es-modules/package-type-module/node_modules/dep-with-package-json-without-type/run.js'), - ]); - - strictEqual(stderr, ''); - strictEqual(stdout, 'executed\n'); - strictEqual(code, 0); - strictEqual(signal, null); - }); - - it(`should import as CommonJS a .js file within a package scope that has no defined "type" and is under - node_modules`, async () => { - const { default: defaultExport } = - await import(fixtures.fileURL( - 'es-modules/package-type-module/node_modules/dep-with-package-json-without-type/run.js')); - strictEqual(defaultExport, 42); - }); - - it(`should run as CommonJS an extensionless JavaScript file within a package scope that has no defined "type" and is - under node_modules`, async () => { - const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ - '--experimental-default-type=module', - fixtures.path('es-modules/package-type-module/node_modules/dep-with-package-json-without-type/noext-cjs'), - ]); - - strictEqual(stderr, ''); - strictEqual(stdout, 'executed\n'); - strictEqual(code, 0); - strictEqual(signal, null); - }); - - it(`should import as CommonJS an extensionless JavaScript file within a package scope that has no defined "type" and - is under node_modules`, async () => { - const { default: defaultExport } = - await import(fixtures.fileURL( - 'es-modules/package-type-module/node_modules/dep-with-package-json-without-type/noext-cjs')); - strictEqual(defaultExport, 42); - }); -}); diff --git a/test/es-module/test-esm-type-flag-string-input.mjs b/test/es-module/test-esm-type-flag-string-input.mjs deleted file mode 100644 index 5581aaa426b56f..00000000000000 --- a/test/es-module/test-esm-type-flag-string-input.mjs +++ /dev/null @@ -1,46 +0,0 @@ -import { spawnPromisified } from '../common/index.mjs'; -import { spawn } from 'node:child_process'; -import { describe, it } from 'node:test'; -import { strictEqual, match } from 'node:assert'; - -describe('the type flag should change the interpretation of string input', { - concurrency: !process.env.TEST_PARALLEL, -}, () => { - it('should run as ESM input passed via --eval', async () => { - const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ - '--experimental-default-type=module', - '--eval', - 'import "data:text/javascript,console.log(42)"', - ]); - - strictEqual(stderr, ''); - strictEqual(stdout, '42\n'); - strictEqual(code, 0); - strictEqual(signal, null); - }); - - // ESM is unsupported for --print via --input-type=module - - it('should run as ESM input passed via STDIN', async () => { - const child = spawn(process.execPath, [ - '--experimental-default-type=module', - ]); - child.stdin.end('console.log(typeof import.meta.resolve)'); - - match((await child.stdout.toArray()).toString(), /^function\r?\n$/); - }); - - it('should be overridden by --input-type', async () => { - const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [ - '--experimental-default-type=module', - '--input-type=commonjs', - '--eval', - 'console.log(require("process").version)', - ]); - - strictEqual(stderr, ''); - strictEqual(stdout, `${process.version}\n`); - strictEqual(code, 0); - strictEqual(signal, null); - }); -}); diff --git a/test/es-module/test-require-module-error-catching.js b/test/es-module/test-require-module-error-catching.js new file mode 100644 index 00000000000000..c314513d9bbf04 --- /dev/null +++ b/test/es-module/test-require-module-error-catching.js @@ -0,0 +1,21 @@ +// This tests synchronous errors in ESM from require(esm) can be caught. + +'use strict'; + +require('../common'); +const assert = require('assert'); + +// Runtime errors from throw should be caught. +assert.throws(() => { + require('../fixtures/es-modules/runtime-error-esm.js'); +}, { + message: 'hello' +}); + +// References errors should be caught too. +assert.throws(() => { + require('../fixtures/es-modules/reference-error-esm.js'); +}, { + name: 'ReferenceError', + message: 'exports is not defined' +}); diff --git a/test/es-module/test-require-module-preload.js b/test/es-module/test-require-module-preload.js index 7a8a09486b43d7..0b8b79118ee8e6 100644 --- a/test/es-module/test-require-module-preload.js +++ b/test/es-module/test-require-module-preload.js @@ -5,8 +5,6 @@ const { spawnSyncAndAssert } = require('../common/child_process'); const { fixturesDir } = require('../common/fixtures'); function testPreload(preloadFlag) { - // The warning is only emitted when ESM is loaded by --require. - const isRequire = preloadFlag === '--require'; // Test named exports. { spawnSyncAndAssert( @@ -22,8 +20,6 @@ function testPreload(preloadFlag) { }, { stdout: 'A', - stderr: isRequire ? - /ExperimentalWarning: --require is loading ES Module .*module-named-exports\.mjs using require/ : undefined, trim: true, } ); @@ -43,8 +39,6 @@ function testPreload(preloadFlag) { cwd: fixturesDir }, { - stderr: isRequire ? - /ExperimentalWarning: --require is loading ES Module .*import-esm\.mjs using require/ : undefined, stdout: /^world\s+A$/, trim: true, } @@ -66,8 +60,6 @@ function testPreload(preloadFlag) { }, { stdout: /^ok\s+A$/, - stderr: isRequire ? - /ExperimentalWarning: --require is loading ES Module .*cjs-exports\.mjs using require/ : undefined, trim: true, } ); @@ -90,8 +82,6 @@ function testPreload(preloadFlag) { }, { stdout: /^world\s+A$/, - stderr: isRequire ? - /ExperimentalWarning: --require is loading ES Module .*require-cjs\.mjs using require/ : undefined, trim: true, } ); @@ -117,7 +107,6 @@ testPreload('--import'); }, { stdout: /^package-type-module\s+A$/, - stderr: /ExperimentalWarning: --require is loading ES Module .*package-type-module[\\/]index\.js using require/, trim: true, } ); diff --git a/test/es-module/test-require-module-synchronous-rejection-handling.js b/test/es-module/test-require-module-synchronous-rejection-handling.js new file mode 100644 index 00000000000000..76a25e742bb900 --- /dev/null +++ b/test/es-module/test-require-module-synchronous-rejection-handling.js @@ -0,0 +1,13 @@ +// This synchronous rejections from require(esm) still go to the unhandled rejection +// handler. + +'use strict'; + +const common = require('../common'); +const assert = require('assert'); + +process.on('unhandledRejection', common.mustCall((reason, promise) => { + assert.strictEqual(reason, 'reject!'); +})); + +require('../fixtures/es-modules/synchronous-rejection-esm.js'); diff --git a/test/es-module/test-require-module-warning.js b/test/es-module/test-require-module-warning.js index d5be2fc6da8755..4c651efd5c0cc7 100644 --- a/test/es-module/test-require-module-warning.js +++ b/test/es-module/test-require-module-warning.js @@ -1,8 +1,6 @@ 'use strict'; -// This checks the warning and the stack trace emitted by the require(esm) -// experimental warning. It can get removed when `require(esm)` becomes stable. - +// This checks the warning and the stack trace emitted by --trace-require-module=all. require('../common'); const { spawnSyncAndAssert } = require('../common/child_process'); const fixtures = require('../common/fixtures'); @@ -10,6 +8,7 @@ const assert = require('assert'); spawnSyncAndAssert(process.execPath, [ '--trace-warnings', + '--trace-require-module=all', fixtures.path('es-modules', 'require-module.js'), ], { trim: true, @@ -33,3 +32,12 @@ spawnSyncAndAssert(process.execPath, [ ); } }); + +spawnSyncAndAssert(process.execPath, [ + '--trace-require-module=1', + fixtures.path('es-modules', 'require-module.js'), +], { + status: 9, + trim: true, + stderr: /invalid value for --trace-require-module/ +}); diff --git a/test/es-module/test-require-module.js b/test/es-module/test-require-module.js index 4987fbf7b07d43..7e05fbd4a5bf88 100644 --- a/test/es-module/test-require-module.js +++ b/test/es-module/test-require-module.js @@ -3,16 +3,6 @@ const common = require('../common'); const assert = require('assert'); -const path = require('path'); - -// Only the first load will trigger the warning. -common.expectWarning( - 'ExperimentalWarning', - `CommonJS module ${__filename} is loading ES Module ` + - `${path.resolve(__dirname, '../fixtures/es-module-loaders/module-named-exports.mjs')} using require().\n` + - 'Support for loading ES Module in require() is an experimental feature ' + - 'and might change at any time' -); // Test named exports. { diff --git a/test/es-module/test-require-node-modules-warning.js b/test/es-module/test-require-node-modules-warning.js new file mode 100644 index 00000000000000..bb3e38b7d92071 --- /dev/null +++ b/test/es-module/test-require-node-modules-warning.js @@ -0,0 +1,71 @@ +'use strict'; + +// This checks the warning and the stack trace emitted by +// --trace-require-module=no-node-modules. +require('../common'); +const { spawnSyncAndAssert } = require('../common/child_process'); +const fixtures = require('../common/fixtures'); + +const warningRE = /Support for loading ES Module in require\(\)/; + +// The fixtures are placed in a directory that includes "node_modules" in its name +// to check false negatives. + +// require() in non-node_modules -> esm in node_modules should warn. +spawnSyncAndAssert( + process.execPath, + [ + '--trace-require-module=no-node-modules', + fixtures.path('es-modules', 'test_node_modules', 'require-esm.js'), + ], + { + trim: true, + stderr: warningRE, + stdout: 'world', + } +); + +// require() in non-node_modules -> require() in node_modules -> esm in node_modules +// should not warn. +spawnSyncAndAssert( + process.execPath, + [ + '--trace-require-module=no-node-modules', + fixtures.path('es-modules', 'test_node_modules', 'require-require-esm.js'), + ], + { + trim: true, + stderr: '', + stdout: 'world', + } +); + +// Import in non-node_modules -> require() in node_modules -> esm in node_modules +// should not warn. +spawnSyncAndAssert( + process.execPath, + [ + '--trace-require-module=no-node-modules', + fixtures.path('es-modules', 'test_node_modules', 'import-require-esm.mjs'), + ], + { + trim: true, + stderr: '', + stdout: 'world', + } +); + +// Import in non-node_modules -> import in node_modules -> +// require() in node_modules -> esm in node_modules should not warn. +spawnSyncAndAssert( + process.execPath, + [ + '--trace-require-module=no-node-modules', + fixtures.path('es-modules', 'test_node_modules', 'import-import-require-esm.mjs'), + ], + { + trim: true, + stderr: '', + stdout: 'world', + } +); diff --git a/test/es-module/test-typescript-commonjs.mjs b/test/es-module/test-typescript-commonjs.mjs index c24576c4a0c392..5b15860ab32796 100644 --- a/test/es-module/test-typescript-commonjs.mjs +++ b/test/es-module/test-typescript-commonjs.mjs @@ -7,7 +7,6 @@ if (!process.config.variables.node_use_amaro) skip('Requires Amaro'); test('require a .ts file with explicit extension succeeds', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', '--eval', 'require("./test-typescript.ts")', '--no-warnings', @@ -22,7 +21,6 @@ test('require a .ts file with explicit extension succeeds', async () => { test('eval require a .ts file with implicit extension fails', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', '--eval', 'require("./test-typescript")', '--no-warnings', @@ -37,7 +35,6 @@ test('eval require a .ts file with implicit extension fails', async () => { test('eval require a .cts file with implicit extension fails', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', '--eval', 'require("./test-cts-typescript")', '--no-warnings', @@ -52,7 +49,6 @@ test('eval require a .cts file with implicit extension fails', async () => { test('require a .ts file with implicit extension fails', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', '--no-warnings', fixtures.path('typescript/cts/test-extensionless-require.ts'), ]); @@ -64,7 +60,6 @@ test('require a .ts file with implicit extension fails', async () => { test('expect failure of an .mts file with CommonJS syntax', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', fixtures.path('typescript/cts/test-cts-but-module-syntax.cts'), ]); @@ -75,7 +70,6 @@ test('expect failure of an .mts file with CommonJS syntax', async () => { test('execute a .cts file importing a .cts file', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', '--no-warnings', fixtures.path('typescript/cts/test-require-commonjs.cts'), ]); @@ -87,7 +81,6 @@ test('execute a .cts file importing a .cts file', async () => { test('execute a .cts file importing a .ts file export', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', '--no-warnings', fixtures.path('typescript/cts/test-require-ts-file.cts'), ]); @@ -99,7 +92,6 @@ test('execute a .cts file importing a .ts file export', async () => { test('execute a .cts file importing a .mts file export', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', '--no-experimental-require-module', fixtures.path('typescript/cts/test-require-mts-module.cts'), ]); @@ -111,32 +103,16 @@ test('execute a .cts file importing a .mts file export', async () => { test('execute a .cts file importing a .mts file export', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', '--experimental-require-module', fixtures.path('typescript/cts/test-require-mts-module.cts'), ]); - match(result.stderr, /Support for loading ES Module in require\(\) is an experimental feature and might change at any time/); - match(result.stdout, /Hello, TypeScript!/); - strictEqual(result.code, 0); -}); - -test('execute a .cts file with default type module', async () => { - const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', - '--experimental-default-type=module', // Keeps working with commonjs - '--no-warnings', - fixtures.path('typescript/cts/test-require-commonjs.cts'), - ]); - - strictEqual(result.stderr, ''); match(result.stdout, /Hello, TypeScript!/); strictEqual(result.code, 0); }); test('expect failure of a .cts file in node_modules', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', fixtures.path('typescript/cts/test-cts-node_modules.cts'), ]); @@ -147,7 +123,6 @@ test('expect failure of a .cts file in node_modules', async () => { test('expect failure of a .ts file in node_modules', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', fixtures.path('typescript/cts/test-ts-node_modules.cts'), ]); @@ -158,7 +133,6 @@ test('expect failure of a .ts file in node_modules', async () => { test('expect failure of a .cts requiring esm without default type module', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', '--no-experimental-require-module', fixtures.path('typescript/cts/test-mts-node_modules.cts'), ]); @@ -170,7 +144,6 @@ test('expect failure of a .cts requiring esm without default type module', async test('expect failure of a .cts file requiring esm in node_modules', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', '--experimental-require-module', fixtures.path('typescript/cts/test-mts-node_modules.cts'), ]); diff --git a/test/es-module/test-typescript-eval.mjs b/test/es-module/test-typescript-eval.mjs index e6d841ffa07f7e..5c6f25bec4df7d 100644 --- a/test/es-module/test-typescript-eval.mjs +++ b/test/es-module/test-typescript-eval.mjs @@ -1,12 +1,11 @@ import { skip, spawnPromisified } from '../common/index.mjs'; -import { match, strictEqual } from 'node:assert'; +import { doesNotMatch, match, strictEqual } from 'node:assert'; import { test } from 'node:test'; if (!process.config.variables.node_use_amaro) skip('Requires Amaro'); test('eval TypeScript ESM syntax', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', '--eval', `import util from 'node:util' const text: string = 'Hello, TypeScript!' @@ -19,8 +18,7 @@ test('eval TypeScript ESM syntax', async () => { test('eval TypeScript ESM syntax with input-type module', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', - '--input-type=module', + '--input-type=module-typescript', '--eval', `import util from 'node:util' const text: string = 'Hello, TypeScript!' @@ -33,21 +31,18 @@ test('eval TypeScript ESM syntax with input-type module', async () => { test('eval TypeScript CommonJS syntax', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', '--eval', `const util = require('node:util'); const text: string = 'Hello, TypeScript!' - console.log(util.styleText('red', text));`, - '--no-warnings']); + console.log(util.styleText('red', text));`]); match(result.stdout, /Hello, TypeScript!/); - strictEqual(result.stderr, ''); + match(result.stderr, /ExperimentalWarning: Type Stripping is an experimental/); strictEqual(result.code, 0); }); -test('eval TypeScript CommonJS syntax with input-type commonjs', async () => { +test('eval TypeScript CommonJS syntax with input-type commonjs-typescript', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', - '--input-type=commonjs', + '--input-type=commonjs-typescript', '--eval', `const util = require('node:util'); const text: string = 'Hello, TypeScript!' @@ -60,7 +55,6 @@ test('eval TypeScript CommonJS syntax with input-type commonjs', async () => { test('eval TypeScript CommonJS syntax by default', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', '--eval', `const util = require('node:util'); const text: string = 'Hello, TypeScript!' @@ -74,7 +68,6 @@ test('eval TypeScript CommonJS syntax by default', async () => { test('TypeScript ESM syntax not specified', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', '--eval', `import util from 'node:util' const text: string = 'Hello, TypeScript!' @@ -84,10 +77,9 @@ test('TypeScript ESM syntax not specified', async () => { strictEqual(result.code, 0); }); -test('expect fail eval TypeScript CommonJS syntax with input-type module', async () => { +test('expect fail eval TypeScript CommonJS syntax with input-type module-typescript', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', - '--input-type=module', + '--input-type=module-typescript', '--eval', `const util = require('node:util'); const text: string = 'Hello, TypeScript!' @@ -98,10 +90,9 @@ test('expect fail eval TypeScript CommonJS syntax with input-type module', async strictEqual(result.code, 1); }); -test('expect fail eval TypeScript ESM syntax with input-type commonjs', async () => { +test('expect fail eval TypeScript ESM syntax with input-type commonjs-typescript', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', - '--input-type=commonjs', + '--input-type=commonjs-typescript', '--eval', `import util from 'node:util' const text: string = 'Hello, TypeScript!' @@ -113,10 +104,121 @@ test('expect fail eval TypeScript ESM syntax with input-type commonjs', async () test('check syntax error is thrown when passing invalid syntax', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', + '--eval', + 'enum Foo { A, B, C }']); + strictEqual(result.stdout, ''); + match(result.stderr, /SyntaxError/); + doesNotMatch(result.stderr, /ERR_INVALID_TYPESCRIPT_SYNTAX/); + strictEqual(result.code, 1); +}); + +test('check syntax error is thrown when passing invalid syntax with --input-type=module-typescript', async () => { + const result = await spawnPromisified(process.execPath, [ + '--input-type=module-typescript', '--eval', 'enum Foo { A, B, C }']); strictEqual(result.stdout, ''); match(result.stderr, /ERR_INVALID_TYPESCRIPT_SYNTAX/); strictEqual(result.code, 1); }); + +test('check syntax error is thrown when passing invalid syntax with --input-type=commonjs-typescript', async () => { + const result = await spawnPromisified(process.execPath, [ + '--input-type=commonjs-typescript', + '--eval', + 'enum Foo { A, B, C }']); + strictEqual(result.stdout, ''); + match(result.stderr, /ERR_INVALID_TYPESCRIPT_SYNTAX/); + strictEqual(result.code, 1); +}); + +test('should not parse TypeScript with --type-module=commonjs', async () => { + const result = await spawnPromisified(process.execPath, [ + '--input-type=commonjs', + '--eval', + `enum Foo {}`]); + + strictEqual(result.stdout, ''); + match(result.stderr, /SyntaxError/); + doesNotMatch(result.stderr, /ERR_INVALID_TYPESCRIPT_SYNTAX/); + strictEqual(result.code, 1); +}); + +test('should not parse TypeScript with --type-module=module', async () => { + const result = await spawnPromisified(process.execPath, [ + '--input-type=module', + '--eval', + `enum Foo {}`]); + + strictEqual(result.stdout, ''); + match(result.stderr, /SyntaxError/); + doesNotMatch(result.stderr, /ERR_INVALID_TYPESCRIPT_SYNTAX/); + strictEqual(result.code, 1); +}); + +test('check warning is emitted when eval TypeScript CommonJS syntax', async () => { + const result = await spawnPromisified(process.execPath, [ + '--eval', + `const util = require('node:util'); + const text: string = 'Hello, TypeScript!' + console.log(util.styleText('red', text));`]); + match(result.stderr, /ExperimentalWarning: Type Stripping is an experimental/); + match(result.stdout, /Hello, TypeScript!/); + strictEqual(result.code, 0); +}); + +test('code is throwing a non Error is rethrown', async () => { + const result = await spawnPromisified(process.execPath, [ + '--eval', + `throw null;`]); + doesNotMatch(result.stderr, /node:internal\/process\/execution/); + strictEqual(result.stdout, ''); + strictEqual(result.code, 1); +}); + +test('code is throwing an error with customized accessors', async () => { + const result = await spawnPromisified(process.execPath, [ + '--eval', + `throw Object.defineProperty(new Error, "stack", { set() {throw this} });`]); + + match(result.stderr, /Error/); + match(result.stderr, /at \[eval\]:1:29/); + strictEqual(result.stdout, ''); + strictEqual(result.code, 1); +}); + +test('typescript code is throwing an error', async () => { + const result = await spawnPromisified(process.execPath, [ + '--eval', + `const foo: string = 'Hello, TypeScript!'; throw new Error(foo);`]); + + match(result.stderr, /Hello, TypeScript!/); + strictEqual(result.stdout, ''); + strictEqual(result.code, 1); +}); + +test('typescript ESM code is throwing a syntax error at runtime', async () => { + const result = await spawnPromisified(process.execPath, [ + '--eval', + 'import util from "node:util"; function foo(){}; throw new SyntaxError(foo(1));']); + // Trick by passing ambiguous syntax to see if evaluated in TypeScript or JavaScript + // If evaluated in JavaScript `foo(1)` is evaluated as `foo < Number > (1)` + // result in false + // If evaluated in TypeScript `foo(1)` is evaluated as `foo(1)` + match(result.stderr, /SyntaxError: false/); + strictEqual(result.stdout, ''); + strictEqual(result.code, 1); +}); + +test('typescript CJS code is throwing a syntax error at runtime', async () => { + const result = await spawnPromisified(process.execPath, [ + '--eval', + 'const util = require("node:util"); function foo(){}; throw new SyntaxError(foo(1));']); + // Trick by passing ambiguous syntax to see if evaluated in TypeScript or JavaScript + // If evaluated in JavaScript `foo(1)` is evaluated as `foo < Number > (1)` + // result in false + // If evaluated in TypeScript `foo(1)` is evaluated as `foo(1)` + match(result.stderr, /SyntaxError: false/); + strictEqual(result.stdout, ''); + strictEqual(result.code, 1); +}); diff --git a/test/es-module/test-typescript-module.mjs b/test/es-module/test-typescript-module.mjs index 6b6b0e68f251f6..27e3e3567391ca 100644 --- a/test/es-module/test-typescript-module.mjs +++ b/test/es-module/test-typescript-module.mjs @@ -7,7 +7,6 @@ if (!process.config.variables.node_use_amaro) skip('Requires Amaro'); test('expect failure of a .mts file with CommonJS syntax', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', fixtures.path('typescript/mts/test-mts-but-commonjs-syntax.mts'), ]); @@ -18,7 +17,6 @@ test('expect failure of a .mts file with CommonJS syntax', async () => { test('execute an .mts file importing an .mts file', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', fixtures.path('typescript/mts/test-import-module.mts'), ]); @@ -29,20 +27,6 @@ test('execute an .mts file importing an .mts file', async () => { test('execute an .mts file importing a .ts file', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', - '--no-warnings', - fixtures.path('typescript/mts/test-import-ts-file.mts'), - ]); - - strictEqual(result.stderr, ''); - match(result.stdout, /Hello, TypeScript!/); - strictEqual(result.code, 0); -}); - -test('execute an .mts file importing a .ts file with default-type module', async () => { - const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', - '--experimental-default-type=module', '--no-warnings', fixtures.path('typescript/mts/test-import-ts-file.mts'), ]); @@ -54,7 +38,6 @@ test('execute an .mts file importing a .ts file with default-type module', async test('execute an .mts file importing a .cts file', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', '--no-warnings', fixtures.path('typescript/mts/test-import-commonjs.mts'), ]); @@ -64,34 +47,8 @@ test('execute an .mts file importing a .cts file', async () => { strictEqual(result.code, 0); }); -test('execute an .mts file with wrong default module', async () => { - const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', - '--no-experimental-require-module', - '--experimental-default-type=commonjs', - fixtures.path('typescript/mts/test-import-module.mts'), - ]); - - strictEqual(result.stdout, ''); - match(result.stderr, /Error \[ERR_REQUIRE_ESM\]: require\(\) of ES Module/); - strictEqual(result.code, 1); -}); - -test('execute an .mts file with wrong default module', async () => { - const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', - '--experimental-require-module', - '--experimental-default-type=commonjs', - fixtures.path('typescript/mts/test-import-module.mts'), - ]); - - match(result.stdout, /Hello, TypeScript!/); - strictEqual(result.code, 0); -}); - test('execute an .mts file from node_modules', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', fixtures.path('typescript/mts/test-mts-node_modules.mts'), ]); @@ -102,7 +59,6 @@ test('execute an .mts file from node_modules', async () => { test('execute a .cts file from node_modules', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', fixtures.path('typescript/mts/test-cts-node_modules.mts'), ]); @@ -113,7 +69,6 @@ test('execute a .cts file from node_modules', async () => { test('execute a .ts file from node_modules', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', fixtures.path('typescript/mts/test-ts-node_modules.mts'), ]); @@ -124,7 +79,6 @@ test('execute a .ts file from node_modules', async () => { test('execute an empty .ts file', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', '--no-warnings', fixtures.path('typescript/ts/test-empty-file.ts'), ]); @@ -136,7 +90,6 @@ test('execute an empty .ts file', async () => { test('execute .ts file importing a module', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', '--no-warnings', fixtures.path('typescript/ts/test-import-fs.ts'), ]); diff --git a/test/es-module/test-typescript.mjs b/test/es-module/test-typescript.mjs index a7ca6d70dd5e10..81aed880bdcf51 100644 --- a/test/es-module/test-typescript.mjs +++ b/test/es-module/test-typescript.mjs @@ -1,17 +1,17 @@ -import { skip, spawnPromisified, isWindows } from '../common/index.mjs'; +import { skip, spawnPromisified } from '../common/index.mjs'; import * as fixtures from '../common/fixtures.mjs'; import { match, strictEqual } from 'node:assert'; import { test } from 'node:test'; -test('expect process.features.typescript to be \'strip\' when --experimental-strip-types', async () => { +test('expect process.features.typescript to be false when --no-experimental-strip-types ', async () => { const result = await spawnPromisified(process.execPath, [ '--no-warnings', - '--experimental-strip-types', + '--no-experimental-strip-types', fixtures.path('typescript/echo-process-features-typescript.cjs'), ]); strictEqual(result.stderr, ''); - strictEqual(result.stdout, process.config.variables.node_use_amaro ? 'strip\n' : 'false\n'); + strictEqual(result.stdout, 'false\n'); strictEqual(result.code, 0); }); @@ -32,7 +32,6 @@ if (!process.config.variables.node_use_amaro) skip('Requires Amaro'); test('execute a TypeScript file', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', fixtures.path('typescript/ts/test-typescript.ts'), ]); @@ -43,7 +42,6 @@ test('execute a TypeScript file', async () => { test('execute a TypeScript file with imports', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', '--no-warnings', fixtures.path('typescript/ts/test-import-foo.ts'), ]); @@ -65,35 +63,8 @@ test('execute a TypeScript file with imports', async () => { strictEqual(result.code, 0); }); -test('execute a TypeScript file with imports with default-type module', async () => { - const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', - '--experimental-default-type=module', - '--no-warnings', - fixtures.path('typescript/ts/test-import-foo.ts'), - ]); - - strictEqual(result.stderr, ''); - match(result.stdout, /Hello, TypeScript!/); - strictEqual(result.code, 0); -}); - test('execute a TypeScript file with node_modules', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', - '--no-warnings', - fixtures.path('typescript/ts/test-typescript-node-modules.ts'), - ]); - - strictEqual(result.stderr, ''); - match(result.stdout, /Hello, TypeScript!/); - strictEqual(result.code, 0); -}); - -test('execute a TypeScript file with node_modules with default-type module', async () => { - const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', - '--experimental-default-type=module', '--no-warnings', fixtures.path('typescript/ts/test-typescript-node-modules.ts'), ]); @@ -105,7 +76,6 @@ test('execute a TypeScript file with node_modules with default-type module', asy test('expect error when executing a TypeScript file with imports with no extensions', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', fixtures.path('typescript/ts/test-import-no-extension.ts'), ]); @@ -114,22 +84,8 @@ test('expect error when executing a TypeScript file with imports with no extensi strictEqual(result.code, 1); }); -test('expect error when executing a TypeScript file with imports with no extensions with default-type module', - async () => { - const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', - '--experimental-default-type=module', - fixtures.path('typescript/ts/test-import-no-extension.ts'), - ]); - - match(result.stderr, /Error \[ERR_MODULE_NOT_FOUND\]:/); - strictEqual(result.stdout, ''); - strictEqual(result.code, 1); - }); - test('expect error when executing a TypeScript file with enum', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', fixtures.path('typescript/ts/test-enums.ts'), ]); @@ -141,7 +97,6 @@ test('expect error when executing a TypeScript file with enum', async () => { test('expect error when executing a TypeScript file with experimental decorators', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', fixtures.path('typescript/ts/test-experimental-decorators.ts'), ]); // This error should be thrown at runtime @@ -152,7 +107,6 @@ test('expect error when executing a TypeScript file with experimental decorators test('expect error when executing a TypeScript file with namespaces', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', fixtures.path('typescript/ts/test-namespaces.ts'), ]); // This error should be thrown during transformation @@ -163,7 +117,6 @@ test('expect error when executing a TypeScript file with namespaces', async () = test('execute a TypeScript file with type definition', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', '--no-warnings', fixtures.path('typescript/ts/test-import-types.ts'), ]); @@ -175,19 +128,6 @@ test('execute a TypeScript file with type definition', async () => { test('execute a TypeScript file with type definition but no type keyword', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', - fixtures.path('typescript/ts/test-import-no-type-keyword.ts'), - ]); - - match(result.stderr, /does not provide an export named 'MyType'/); - strictEqual(result.stdout, ''); - strictEqual(result.code, 1); -}); - -test('execute a TypeScript file with type definition but no type keyword with default-type modue', async () => { - const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', - '--experimental-default-type=module', fixtures.path('typescript/ts/test-import-no-type-keyword.ts'), ]); @@ -198,7 +138,6 @@ test('execute a TypeScript file with type definition but no type keyword with de test('execute a TypeScript file with CommonJS syntax', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', '--no-warnings', fixtures.path('typescript/ts/test-commonjs-parsing.ts'), ]); @@ -209,20 +148,6 @@ test('execute a TypeScript file with CommonJS syntax', async () => { test('execute a TypeScript file with ES module syntax', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', - '--no-warnings', - fixtures.path('typescript/ts/test-module-typescript.ts'), - ]); - - strictEqual(result.stderr, ''); - match(result.stdout, /Hello, TypeScript!/); - strictEqual(result.code, 0); -}); - -test('execute a TypeScript file with ES module syntax with default-type module', async () => { - const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', - '--experimental-default-type=module', '--no-warnings', fixtures.path('typescript/ts/test-module-typescript.ts'), ]); @@ -234,19 +159,16 @@ test('execute a TypeScript file with ES module syntax with default-type module', test('expect failure of a TypeScript file requiring ES module syntax', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', '--experimental-require-module', fixtures.path('typescript/ts/test-require-module.ts'), ]); - match(result.stderr, /Support for loading ES Module in require\(\) is an experimental feature and might change at any time/); match(result.stdout, /Hello, TypeScript!/); strictEqual(result.code, 0); }); test('expect stack trace of a TypeScript file to be correct', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', fixtures.path('typescript/ts/test-whitespacing.ts'), ]); @@ -257,7 +179,6 @@ test('expect stack trace of a TypeScript file to be correct', async () => { test('execute CommonJS TypeScript file from node_modules with require-module', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', fixtures.path('typescript/ts/test-import-ts-node-modules.ts'), ]); @@ -266,33 +187,8 @@ test('execute CommonJS TypeScript file from node_modules with require-module', a strictEqual(result.code, 1); }); -test('execute CommonJS TypeScript file from node_modules with require-module and default-type module', - async () => { - const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', - '--experimental-default-type=module', - fixtures.path('typescript/ts/test-import-ts-node-modules.ts'), - ]); - - match(result.stderr, /ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING/); - strictEqual(result.stdout, ''); - strictEqual(result.code, 1); - }); - -test('execute a TypeScript file with CommonJS syntax but default type module', async () => { - const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', - '--experimental-default-type=module', - fixtures.path('typescript/ts/test-commonjs-parsing.ts'), - ]); - strictEqual(result.stdout, ''); - match(result.stderr, /require is not defined in ES module scope, you can use import instead/); - strictEqual(result.code, 1); -}); - test('execute a TypeScript file with CommonJS syntax requiring .cts', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', '--no-warnings', fixtures.path('typescript/ts/test-require-cts.ts'), ]); @@ -304,7 +200,6 @@ test('execute a TypeScript file with CommonJS syntax requiring .cts', async () = test('execute a TypeScript file with CommonJS syntax requiring .mts', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', fixtures.path('typescript/ts/test-require-mts.ts'), ]); @@ -314,19 +209,16 @@ test('execute a TypeScript file with CommonJS syntax requiring .mts', async () = test('execute a TypeScript file with CommonJS syntax requiring .mts using require-module', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', '--experimental-require-module', fixtures.path('typescript/ts/test-require-mts.ts'), ]); - match(result.stderr, /Support for loading ES Module in require\(\) is an experimental feature and might change at any time/); match(result.stdout, /Hello, TypeScript!/); strictEqual(result.code, 0); }); test('execute a TypeScript file with CommonJS syntax requiring .cts using commonjs', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', '--no-warnings', fixtures.path('typescript/ts/test-require-cts.ts'), ]); @@ -336,11 +228,9 @@ test('execute a TypeScript file with CommonJS syntax requiring .cts using common strictEqual(result.code, 0); }); -test('execute a TypeScript file with CommonJS syntax requiring .mts with require-module with default-type commonjs', +test('execute a TypeScript file with CommonJS syntax requiring .mts with require-module', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', - '--experimental-default-type=commonjs', '--no-warnings', fixtures.path('typescript/ts/test-require-cts.ts'), ]); @@ -352,7 +242,6 @@ test('execute a TypeScript file with CommonJS syntax requiring .mts with require test('execute a JavaScript file importing a cjs TypeScript file', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', '--no-warnings', fixtures.path('typescript/ts/issue-54457.mjs'), ]); @@ -361,14 +250,10 @@ test('execute a JavaScript file importing a cjs TypeScript file', async () => { strictEqual(result.code, 0); }); -// TODO(marco-ippolito) Due to a bug in SWC, the TypeScript loader -// does not work on Windows arm64. This test should be re-enabled -// when https://github.com/nodejs/node/issues/54645 is fixed -test('execute a TypeScript test mocking module', { skip: isWindows && process.arch === 'arm64' }, async () => { +test('execute a TypeScript test mocking module', async () => { const result = await spawnPromisified(process.execPath, [ '--test', '--experimental-test-module-mocks', - '--experimental-strip-types', '--no-warnings', fixtures.path('typescript/ts/test-mock-module.ts'), ]); @@ -378,13 +263,12 @@ test('execute a TypeScript test mocking module', { skip: isWindows && process.ar strictEqual(result.code, 0); }); -test('expect process.features.typescript to be false without type-stripping', async () => { - strictEqual(process.features.typescript, false); +test('expect process.features.typescript to be strip', async () => { + strictEqual(process.features.typescript, 'strip'); }); test('execute a TypeScript file with union types', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', '--no-warnings', fixtures.path('typescript/ts/test-union-types.ts'), ]); @@ -402,7 +286,6 @@ test('execute a TypeScript file with union types', async () => { test('expect error when executing a TypeScript file with generics', async () => { const result = await spawnPromisified(process.execPath, [ - '--experimental-strip-types', fixtures.path('typescript/ts/test-parameter-properties.ts'), ]); @@ -414,3 +297,27 @@ test('expect error when executing a TypeScript file with generics', async () => strictEqual(result.stdout, ''); strictEqual(result.code, 1); }); + +test('execute a TypeScript loader and a .ts file', async () => { + const result = await spawnPromisified(process.execPath, [ + '--no-warnings', + '--import', + fixtures.fileURL('typescript/ts/test-loader.ts'), + fixtures.path('typescript/ts/test-typescript.ts'), + ]); + strictEqual(result.stderr, ''); + match(result.stdout, /Hello, TypeScript!/); + strictEqual(result.code, 0); +}); + +test('execute a TypeScript loader and a .js file', async () => { + const result = await spawnPromisified(process.execPath, [ + '--no-warnings', + '--import', + fixtures.fileURL('typescript/ts/test-loader.ts'), + fixtures.path('typescript/ts/test-simple.js'), + ]); + strictEqual(result.stderr, ''); + match(result.stdout, /Hello, TypeScript!/); + strictEqual(result.code, 0); +}); diff --git a/test/fixtures/dotenv/no-final-newline-single-quotes.env b/test/fixtures/dotenv/no-final-newline-single-quotes.env new file mode 100644 index 00000000000000..4f1b37d7741e29 --- /dev/null +++ b/test/fixtures/dotenv/no-final-newline-single-quotes.env @@ -0,0 +1 @@ +BASIC='basic' \ No newline at end of file diff --git a/test/fixtures/dotenv/no-final-newline.env b/test/fixtures/dotenv/no-final-newline.env new file mode 100644 index 00000000000000..ef996552bd9c90 --- /dev/null +++ b/test/fixtures/dotenv/no-final-newline.env @@ -0,0 +1 @@ +BASIC="basic" \ No newline at end of file diff --git a/test/fixtures/dotenv/node-options.env b/test/fixtures/dotenv/node-options.env index f74ac01bc28de7..bd3be820f64e2b 100644 --- a/test/fixtures/dotenv/node-options.env +++ b/test/fixtures/dotenv/node-options.env @@ -1,6 +1,6 @@ CUSTOM_VARIABLE=hello-world NODE_NO_WARNINGS=1 -NODE_OPTIONS="--experimental-permission --allow-fs-read=*" +NODE_OPTIONS="--permission --allow-fs-read=*" TZ=Pacific/Honolulu UV_THREADPOOL_SIZE=5 BASIC=overridden diff --git a/test/fixtures/es-module-loaders/hooks-custom.mjs b/test/fixtures/es-module-loaders/hooks-custom.mjs index 3c38649a88794f..5109d20f4d3711 100644 --- a/test/fixtures/es-module-loaders/hooks-custom.mjs +++ b/test/fixtures/es-module-loaders/hooks-custom.mjs @@ -105,5 +105,12 @@ export function load(url, context, next) { }; } + if (url.endsWith('esmHook/maximumCallStack.mjs')) { + function recurse() { + recurse(); + } + recurse(); + } + return next(url); } diff --git a/test/fixtures/es-modules/loose.js b/test/fixtures/es-modules/loose.js index c0d85f7eab9a2b..251d6e538a1fcf 100644 --- a/test/fixtures/es-modules/loose.js +++ b/test/fixtures/es-modules/loose.js @@ -1,5 +1,2 @@ -// This file can be run or imported only if `--experimental-default-type=module` is set -// or `--experimental-detect-module` is not disabled. If it's loaded by -// require(), then `--experimental-require-module` must not be disabled. export default 'module'; console.log('executed'); diff --git a/test/fixtures/es-modules/package-without-type/noext-esm b/test/fixtures/es-modules/package-without-type/noext-esm index 69147a3b8ca027..251d6e538a1fcf 100644 --- a/test/fixtures/es-modules/package-without-type/noext-esm +++ b/test/fixtures/es-modules/package-without-type/noext-esm @@ -1,3 +1,2 @@ -// This file can be run or imported only if `--experimental-default-type=module` is set. export default 'module'; console.log('executed'); diff --git a/test/fixtures/es-modules/reference-error-esm.js b/test/fixtures/es-modules/reference-error-esm.js new file mode 100644 index 00000000000000..baf773c78970ad --- /dev/null +++ b/test/fixtures/es-modules/reference-error-esm.js @@ -0,0 +1,5 @@ +// This module is invalid in both ESM and CJS, because +// 'exports' are not defined in ESM, while require cannot be +// redeclared in CJS. +Object.defineProperty(exports, "__esModule", { value: true }); +const require = () => {}; diff --git a/test/fixtures/es-modules/runtime-error-esm.js b/test/fixtures/es-modules/runtime-error-esm.js new file mode 100644 index 00000000000000..1df3cc469adbfc --- /dev/null +++ b/test/fixtures/es-modules/runtime-error-esm.js @@ -0,0 +1,2 @@ +import 'node:fs'; // Forces it to be recognized as ESM. +throw new Error('hello'); diff --git a/test/fixtures/es-modules/synchronous-rejection-esm.js b/test/fixtures/es-modules/synchronous-rejection-esm.js new file mode 100644 index 00000000000000..34d066037e2140 --- /dev/null +++ b/test/fixtures/es-modules/synchronous-rejection-esm.js @@ -0,0 +1,2 @@ +import 'node:fs'; // Forces it to be recognized as ESM. +Promise.reject('reject!'); diff --git a/test/fixtures/es-modules/test_node_modules/import-import-require-esm.mjs b/test/fixtures/es-modules/test_node_modules/import-import-require-esm.mjs new file mode 100644 index 00000000000000..d470088c38caee --- /dev/null +++ b/test/fixtures/es-modules/test_node_modules/import-import-require-esm.mjs @@ -0,0 +1,2 @@ +import mod from 'import-require-esm'; +console.log(mod.hello); diff --git a/test/fixtures/es-modules/test_node_modules/import-require-esm.mjs b/test/fixtures/es-modules/test_node_modules/import-require-esm.mjs new file mode 100644 index 00000000000000..2ad346de9e841c --- /dev/null +++ b/test/fixtures/es-modules/test_node_modules/import-require-esm.mjs @@ -0,0 +1,2 @@ +import mod from 'require-esm'; +console.log(mod.hello); diff --git a/test/fixtures/es-modules/test_node_modules/node_modules/esm/index.js b/test/fixtures/es-modules/test_node_modules/node_modules/esm/index.js new file mode 100644 index 00000000000000..35f468bf4856d8 --- /dev/null +++ b/test/fixtures/es-modules/test_node_modules/node_modules/esm/index.js @@ -0,0 +1 @@ +export const hello = 'world'; diff --git a/test/fixtures/es-modules/test_node_modules/node_modules/esm/package.json b/test/fixtures/es-modules/test_node_modules/node_modules/esm/package.json new file mode 100644 index 00000000000000..07aec65d5a4f31 --- /dev/null +++ b/test/fixtures/es-modules/test_node_modules/node_modules/esm/package.json @@ -0,0 +1,4 @@ +{ + "type": "module", + "main": "index.js" +} diff --git a/test/fixtures/es-modules/test_node_modules/node_modules/import-require-esm/index.js b/test/fixtures/es-modules/test_node_modules/node_modules/import-require-esm/index.js new file mode 100644 index 00000000000000..918bb5d5597e34 --- /dev/null +++ b/test/fixtures/es-modules/test_node_modules/node_modules/import-require-esm/index.js @@ -0,0 +1,2 @@ +import mod from 'require-esm'; +export default mod; diff --git a/test/fixtures/es-modules/test_node_modules/node_modules/import-require-esm/package.json b/test/fixtures/es-modules/test_node_modules/node_modules/import-require-esm/package.json new file mode 100644 index 00000000000000..07aec65d5a4f31 --- /dev/null +++ b/test/fixtures/es-modules/test_node_modules/node_modules/import-require-esm/package.json @@ -0,0 +1,4 @@ +{ + "type": "module", + "main": "index.js" +} diff --git a/test/fixtures/es-modules/test_node_modules/node_modules/require-esm/index.js b/test/fixtures/es-modules/test_node_modules/node_modules/require-esm/index.js new file mode 100644 index 00000000000000..ca6f0c264ad1fc --- /dev/null +++ b/test/fixtures/es-modules/test_node_modules/node_modules/require-esm/index.js @@ -0,0 +1,2 @@ +module.exports = require('esm'); + diff --git a/test/fixtures/es-modules/test_node_modules/require-esm.js b/test/fixtures/es-modules/test_node_modules/require-esm.js new file mode 100644 index 00000000000000..60ad3f7fff60c6 --- /dev/null +++ b/test/fixtures/es-modules/test_node_modules/require-esm.js @@ -0,0 +1,2 @@ +const { hello } = require('esm'); +console.log(hello); diff --git a/test/fixtures/es-modules/test_node_modules/require-require-esm.js b/test/fixtures/es-modules/test_node_modules/require-require-esm.js new file mode 100644 index 00000000000000..9fe255dce258a6 --- /dev/null +++ b/test/fixtures/es-modules/test_node_modules/require-require-esm.js @@ -0,0 +1,2 @@ +const { hello } = require('require-esm'); +console.log(hello); diff --git a/test/message/eval_messages.js b/test/fixtures/eval/eval_messages.js similarity index 98% rename from test/message/eval_messages.js rename to test/fixtures/eval/eval_messages.js index 69dcbd6efa23a7..171bff06b8d6e9 100644 --- a/test/message/eval_messages.js +++ b/test/fixtures/eval/eval_messages.js @@ -21,7 +21,7 @@ 'use strict'; -require('../common'); +require('../../common'); const spawn = require('child_process').spawn; diff --git a/test/fixtures/eval/eval_messages.snapshot b/test/fixtures/eval/eval_messages.snapshot new file mode 100644 index 00000000000000..4a29e96f9c0973 --- /dev/null +++ b/test/fixtures/eval/eval_messages.snapshot @@ -0,0 +1,57 @@ +[eval] +[eval]:1 +with(this){__filename} +^^^^ + x The 'with' statement is not supported. All symbols in a 'with' block will have type 'any'. + ,---- + 1 | with(this){__filename} + : ^^^^ + `---- + +Caused by: + failed to parse + +SyntaxError: Strict mode code may not include a with statement + +Node.js * +42 +42 +[eval]:1 +throw new Error("hello") +^ + +Error: hello + +Node.js * +[eval]:1 +throw new Error("hello") +^ + +Error: hello + +Node.js * +100 +[eval]:1 +var x = 100; y = x; + ^ + +ReferenceError: y is not defined + +Node.js * + +[eval]:1 +var ______________________________________________; throw 10 + ^ +10 +(Use `node --trace-uncaught ...` to show where the exception was thrown) + +Node.js * + +[eval]:1 +var ______________________________________________; throw 10 + ^ +10 +(Use `node --trace-uncaught ...` to show where the exception was thrown) + +Node.js * +done diff --git a/test/fixtures/eval/eval_typescript.js b/test/fixtures/eval/eval_typescript.js new file mode 100644 index 00000000000000..2c96b66f70dde1 --- /dev/null +++ b/test/fixtures/eval/eval_typescript.js @@ -0,0 +1,25 @@ +'use strict'; + +require('../../common'); + +const spawnSync = require('child_process').spawnSync; + +const queue = [ + 'enum Foo{};', + 'throw new SyntaxError("hello")', + 'const foo;', + 'let x: number = 100;x;', + 'const foo: string = 10;', + 'function foo(){};foo(1);', + 'interface Foo{};const foo;', + 'function foo(){ await Promise.resolve(1)};', +]; + +for (const cmd of queue) { + const args = ['--disable-warning=ExperimentalWarning', '-p', cmd]; + const result = spawnSync(process.execPath, args, { + stdio: 'pipe' + }); + process.stdout.write(result.stdout); + process.stdout.write(result.stderr); +} diff --git a/test/fixtures/eval/eval_typescript.snapshot b/test/fixtures/eval/eval_typescript.snapshot new file mode 100644 index 00000000000000..b10f8d6a910e4f --- /dev/null +++ b/test/fixtures/eval/eval_typescript.snapshot @@ -0,0 +1,51 @@ +[eval]:1 +enum Foo{}; +^^^^ + x TypeScript enum is not supported in strip-only mode + ,---- + 1 | enum Foo{}; + : ^^^^^^^^^^ + `---- + +SyntaxError: Unexpected reserved word + +Node.js * +[eval]:1 +throw new SyntaxError("hello") +^ + +SyntaxError: hello + +Node.js * +[eval]:1 +const foo; + ^^^ + +SyntaxError: Missing initializer in const declaration + +Node.js * +100 +undefined +false +[eval]:1 + ;const foo; + ^^^ + +SyntaxError: Missing initializer in const declaration + +Node.js * +[eval]:1 +function foo(){ await Promise.resolve(1)}; + ^^^^^ + x await isn't allowed in non-async function + ,---- + 1 | function foo(){ await Promise.resolve(1)}; + : ^^^^^^^ + `---- + +Caused by: + failed to parse + +SyntaxError: await is only valid in async functions and the top level bodies of modules + +Node.js * diff --git a/test/message/stdin_messages.js b/test/fixtures/eval/stdin_messages.js similarity index 98% rename from test/message/stdin_messages.js rename to test/fixtures/eval/stdin_messages.js index 79475bd4d217b6..874b473be38e00 100644 --- a/test/message/stdin_messages.js +++ b/test/fixtures/eval/stdin_messages.js @@ -21,7 +21,7 @@ 'use strict'; -require('../common'); +require('../../common'); const spawn = require('child_process').spawn; diff --git a/test/fixtures/eval/stdin_messages.snapshot b/test/fixtures/eval/stdin_messages.snapshot new file mode 100644 index 00000000000000..c2f33ba8475d07 --- /dev/null +++ b/test/fixtures/eval/stdin_messages.snapshot @@ -0,0 +1,57 @@ +[stdin] +[stdin]:1 +with(this){__filename} +^^^^ + x The 'with' statement is not supported. All symbols in a 'with' block will have type 'any'. + ,---- + 1 | with(this){__filename} + : ^^^^ + `---- + +Caused by: + failed to parse + +SyntaxError: Strict mode code may not include a with statement + +Node.js * +42 +42 +[stdin]:1 +throw new Error("hello") +^ + +Error: hello + +Node.js * +[stdin]:1 +throw new Error("hello") +^ + +Error: hello + +Node.js * +100 +[stdin]:1 +let x = 100; y = x; + ^ + +ReferenceError: y is not defined + +Node.js * + +[stdin]:1 +let ______________________________________________; throw 10 + ^ +10 +(Use `node --trace-uncaught ...` to show where the exception was thrown) + +Node.js * + +[stdin]:1 +let ______________________________________________; throw 10 + ^ +10 +(Use `node --trace-uncaught ...` to show where the exception was thrown) + +Node.js * +done diff --git a/test/fixtures/eval/stdin_typescript.js b/test/fixtures/eval/stdin_typescript.js new file mode 100644 index 00000000000000..d47c495f861fba --- /dev/null +++ b/test/fixtures/eval/stdin_typescript.js @@ -0,0 +1,38 @@ +'use strict'; + +require('../../common'); + +const spawn = require('child_process').spawn; + +function run(cmd, strict, cb) { + const args = ['--disable-warning=ExperimentalWarning']; + if (strict) args.push('--use_strict'); + args.push('-p'); + const child = spawn(process.execPath, args); + child.stdout.pipe(process.stdout); + child.stderr.pipe(process.stdout); + child.stdin.end(cmd); + child.on('close', cb); +} + +const queue = + [ + 'enum Foo{};', + 'throw new SyntaxError("hello")', + 'const foo;', + 'let x: number = 100;x;', + 'const foo: string = 10;', + 'function foo(){};foo(1);', + 'interface Foo{};const foo;', + 'function foo(){ await Promise.resolve(1)};', + ]; + +function go() { + const c = queue.shift(); + if (!c) return console.log('done'); + run(c, false, function () { + run(c, true, go); + }); +} + +go(); diff --git a/test/fixtures/eval/stdin_typescript.snapshot b/test/fixtures/eval/stdin_typescript.snapshot new file mode 100644 index 00000000000000..ccae9c38ee75e0 --- /dev/null +++ b/test/fixtures/eval/stdin_typescript.snapshot @@ -0,0 +1,103 @@ +[stdin]:1 +enum Foo{}; +^^^^ + x TypeScript enum is not supported in strip-only mode + ,---- + 1 | enum Foo{}; + : ^^^^^^^^^^ + `---- + +SyntaxError: Unexpected reserved word + +Node.js * +[stdin]:1 +enum Foo{}; +^^^^ + x TypeScript enum is not supported in strip-only mode + ,---- + 1 | enum Foo{}; + : ^^^^^^^^^^ + `---- + +SyntaxError: Unexpected reserved word + +Node.js * +[stdin]:1 +throw new SyntaxError("hello") +^ + +SyntaxError: hello + +Node.js * +[stdin]:1 +throw new SyntaxError("hello") +^ + +SyntaxError: hello + +Node.js * +[stdin]:1 +const foo; + ^^^ + +SyntaxError: Missing initializer in const declaration + +Node.js * +[stdin]:1 +const foo; + ^^^ + +SyntaxError: Missing initializer in const declaration + +Node.js * +100 +100 +undefined +undefined +false +false +[stdin]:1 + ;const foo; + ^^^ + +SyntaxError: Missing initializer in const declaration + +Node.js * +[stdin]:1 + ;const foo; + ^^^ + +SyntaxError: Missing initializer in const declaration + +Node.js * +[stdin]:1 +function foo(){ await Promise.resolve(1)}; + ^^^^^ + x await isn't allowed in non-async function + ,---- + 1 | function foo(){ await Promise.resolve(1)}; + : ^^^^^^^ + `---- + +Caused by: + failed to parse + +SyntaxError: await is only valid in async functions and the top level bodies of modules + +Node.js * +[stdin]:1 +function foo(){ await Promise.resolve(1)}; + ^^^^^ + x await isn't allowed in non-async function + ,---- + 1 | function foo(){ await Promise.resolve(1)}; + : ^^^^^^^ + `---- + +Caused by: + failed to parse + +SyntaxError: await is only valid in async functions and the top level bodies of modules + +Node.js * +done diff --git a/test/fixtures/icu/localizationData-v74.2.json b/test/fixtures/icu/localizationData-v74.2.json new file mode 100644 index 00000000000000..65671ba5acb299 --- /dev/null +++ b/test/fixtures/icu/localizationData-v74.2.json @@ -0,0 +1,128 @@ +{ + "dateStrings": { + "en": "Fri Jul 25 1980 01:35:33 GMT+0100 (Central European Standard Time)", + "zh": "Fri Jul 25 1980 01:35:33 GMT+0100 (中欧标准时间)", + "hi": "Fri Jul 25 1980 01:35:33 GMT+0100 (मध्य यूरोपीय मानक समय)", + "es": "Fri Jul 25 1980 01:35:33 GMT+0100 (hora estándar de Europa central)", + "fr": "Fri Jul 25 1980 01:35:33 GMT+0100 (heure normale d’Europe centrale)", + "ar": "Fri Jul 25 1980 01:35:33 GMT+0100 (توقيت وسط أوروبا الرسمي)", + "bn": "Fri Jul 25 1980 01:35:33 GMT+0100 (মধ্য ইউরোপীয় মানক সময়)", + "ru": "Fri Jul 25 1980 01:35:33 GMT+0100 (Центральная Европа, стандартное время)", + "pt": "Fri Jul 25 1980 01:35:33 GMT+0100 (Horário Padrão da Europa Central)", + "ur": "Fri Jul 25 1980 01:35:33 GMT+0100 (وسطی یورپ کا معیاری وقت)", + "id": "Fri Jul 25 1980 01:35:33 GMT+0100 (Waktu Standar Eropa Tengah)", + "de": "Fri Jul 25 1980 01:35:33 GMT+0100 (Mitteleuropäische Normalzeit)", + "ja": "Fri Jul 25 1980 01:35:33 GMT+0100 (中央ヨーロッパ標準時)", + "pcm": "Fri Jul 25 1980 01:35:33 GMT+0100 (Mídúl Yúrop Fíksd Taim)", + "mr": "Fri Jul 25 1980 01:35:33 GMT+0100 (मध्‍य युरोपियन प्रमाण वेळ)", + "te": "Fri Jul 25 1980 01:35:33 GMT+0100 (సెంట్రల్ యూరోపియన్ ప్రామాణిక సమయం)" + }, + "dateTimeFormats": { + "en": "7/25/1980, 1:35:33 AM", + "zh": "1980/7/25 01:35:33", + "hi": "25/7/1980, 1:35:33 am", + "es": "25/7/1980, 1:35:33", + "fr": "25/07/1980 01:35:33", + "ar": "٢٥‏/٧‏/١٩٨٠، ١:٣٥:٣٣ ص", + "bn": "২৫/৭/১৯৮০, ১:৩৫:৩৩ AM", + "ru": "25.07.1980, 01:35:33", + "pt": "25/07/1980, 01:35:33", + "ur": "25/7/1980، 1:35:33 AM", + "id": "25/7/1980, 01.35.33", + "de": "25.7.1980, 01:35:33", + "ja": "1980/7/25 1:35:33", + "pcm": "25/7/1980 01:35:33", + "mr": "२५/७/१९८०, १:३५:३३ AM", + "te": "25/7/1980 1:35:33 AM" + }, + "dateFormats": { + "en": "7/25/1980", + "zh": "1980/7/25", + "hi": "25/7/1980", + "es": "25/7/1980", + "fr": "25/07/1980", + "ar": "٢٥‏/٧‏/١٩٨٠", + "bn": "২৫/৭/১৯৮০", + "ru": "25.07.1980", + "pt": "25/07/1980", + "ur": "25/7/1980", + "id": "25/7/1980", + "de": "25.7.1980", + "ja": "1980/7/25", + "pcm": "25/7/1980", + "mr": "२५/७/१९८०", + "te": "25/7/1980" + }, + "displayNames": { + "en": "Switzerland", + "zh": "瑞士", + "hi": "स्विट्ज़रलैंड", + "es": "Suiza", + "fr": "Suisse", + "ar": "سويسرا", + "bn": "সুইজারল্যান্ড", + "ru": "Швейцария", + "pt": "Suíça", + "ur": "سوئٹزر لینڈ", + "id": "Swiss", + "de": "Schweiz", + "ja": "スイス", + "pcm": "Swítsaland", + "mr": "स्वित्झर्लंड", + "te": "స్విట్జర్లాండ్" + }, + "numberFormats": { + "en": "275,760.913", + "zh": "275,760.913", + "hi": "2,75,760.913", + "es": "275.760,913", + "fr": "275 760,913", + "ar": "٢٧٥٬٧٦٠٫٩١٣", + "bn": "২,৭৫,৭৬০.৯১৩", + "ru": "275 760,913", + "pt": "275.760,913", + "ur": "275,760.913", + "id": "275.760,913", + "de": "275.760,913", + "ja": "275,760.913", + "pcm": "275,760.913", + "mr": "२,७५,७६०.९१३", + "te": "2,75,760.913" + }, + "pluralRules": { + "en": "other", + "zh": "other", + "hi": "one", + "es": "other", + "fr": "one", + "ar": "zero", + "bn": "one", + "ru": "many", + "pt": "one", + "ur": "other", + "id": "other", + "de": "other", + "ja": "other", + "pcm": "one", + "mr": "other", + "te": "other" + }, + "relativeTime": { + "en": "586,920.617 hours ago", + "zh": "586,920.617小时前", + "hi": "5,86,920.617 घंटे पहले", + "es": "hace 586.920,617 horas", + "fr": "il y a 586 920,617 heures", + "ar": "قبل ٥٨٦٬٩٢٠٫٦١٧ ساعة", + "bn": "৫,৮৬,৯২০.৬১৭ ঘন্টা আগে", + "ru": "586 920,617 часа назад", + "pt": "há 586.920,617 horas", + "ur": "586,920.617 گھنٹے پہلے", + "id": "586.920,617 jam yang lalu", + "de": "vor 586.920,617 Stunden", + "ja": "586,920.617 時間前", + "pcm": "586,920.617 áwa wé dọ́n pas", + "mr": "५,८६,९२०.६१७ तासांपूर्वी", + "te": "5,86,920.617 గంటల క్రితం" + } +} diff --git a/test/fixtures/icu/localizationData-v75.1.json b/test/fixtures/icu/localizationData-v75.1.json new file mode 100644 index 00000000000000..65671ba5acb299 --- /dev/null +++ b/test/fixtures/icu/localizationData-v75.1.json @@ -0,0 +1,128 @@ +{ + "dateStrings": { + "en": "Fri Jul 25 1980 01:35:33 GMT+0100 (Central European Standard Time)", + "zh": "Fri Jul 25 1980 01:35:33 GMT+0100 (中欧标准时间)", + "hi": "Fri Jul 25 1980 01:35:33 GMT+0100 (मध्य यूरोपीय मानक समय)", + "es": "Fri Jul 25 1980 01:35:33 GMT+0100 (hora estándar de Europa central)", + "fr": "Fri Jul 25 1980 01:35:33 GMT+0100 (heure normale d’Europe centrale)", + "ar": "Fri Jul 25 1980 01:35:33 GMT+0100 (توقيت وسط أوروبا الرسمي)", + "bn": "Fri Jul 25 1980 01:35:33 GMT+0100 (মধ্য ইউরোপীয় মানক সময়)", + "ru": "Fri Jul 25 1980 01:35:33 GMT+0100 (Центральная Европа, стандартное время)", + "pt": "Fri Jul 25 1980 01:35:33 GMT+0100 (Horário Padrão da Europa Central)", + "ur": "Fri Jul 25 1980 01:35:33 GMT+0100 (وسطی یورپ کا معیاری وقت)", + "id": "Fri Jul 25 1980 01:35:33 GMT+0100 (Waktu Standar Eropa Tengah)", + "de": "Fri Jul 25 1980 01:35:33 GMT+0100 (Mitteleuropäische Normalzeit)", + "ja": "Fri Jul 25 1980 01:35:33 GMT+0100 (中央ヨーロッパ標準時)", + "pcm": "Fri Jul 25 1980 01:35:33 GMT+0100 (Mídúl Yúrop Fíksd Taim)", + "mr": "Fri Jul 25 1980 01:35:33 GMT+0100 (मध्‍य युरोपियन प्रमाण वेळ)", + "te": "Fri Jul 25 1980 01:35:33 GMT+0100 (సెంట్రల్ యూరోపియన్ ప్రామాణిక సమయం)" + }, + "dateTimeFormats": { + "en": "7/25/1980, 1:35:33 AM", + "zh": "1980/7/25 01:35:33", + "hi": "25/7/1980, 1:35:33 am", + "es": "25/7/1980, 1:35:33", + "fr": "25/07/1980 01:35:33", + "ar": "٢٥‏/٧‏/١٩٨٠، ١:٣٥:٣٣ ص", + "bn": "২৫/৭/১৯৮০, ১:৩৫:৩৩ AM", + "ru": "25.07.1980, 01:35:33", + "pt": "25/07/1980, 01:35:33", + "ur": "25/7/1980، 1:35:33 AM", + "id": "25/7/1980, 01.35.33", + "de": "25.7.1980, 01:35:33", + "ja": "1980/7/25 1:35:33", + "pcm": "25/7/1980 01:35:33", + "mr": "२५/७/१९८०, १:३५:३३ AM", + "te": "25/7/1980 1:35:33 AM" + }, + "dateFormats": { + "en": "7/25/1980", + "zh": "1980/7/25", + "hi": "25/7/1980", + "es": "25/7/1980", + "fr": "25/07/1980", + "ar": "٢٥‏/٧‏/١٩٨٠", + "bn": "২৫/৭/১৯৮০", + "ru": "25.07.1980", + "pt": "25/07/1980", + "ur": "25/7/1980", + "id": "25/7/1980", + "de": "25.7.1980", + "ja": "1980/7/25", + "pcm": "25/7/1980", + "mr": "२५/७/१९८०", + "te": "25/7/1980" + }, + "displayNames": { + "en": "Switzerland", + "zh": "瑞士", + "hi": "स्विट्ज़रलैंड", + "es": "Suiza", + "fr": "Suisse", + "ar": "سويسرا", + "bn": "সুইজারল্যান্ড", + "ru": "Швейцария", + "pt": "Suíça", + "ur": "سوئٹزر لینڈ", + "id": "Swiss", + "de": "Schweiz", + "ja": "スイス", + "pcm": "Swítsaland", + "mr": "स्वित्झर्लंड", + "te": "స్విట్జర్లాండ్" + }, + "numberFormats": { + "en": "275,760.913", + "zh": "275,760.913", + "hi": "2,75,760.913", + "es": "275.760,913", + "fr": "275 760,913", + "ar": "٢٧٥٬٧٦٠٫٩١٣", + "bn": "২,৭৫,৭৬০.৯১৩", + "ru": "275 760,913", + "pt": "275.760,913", + "ur": "275,760.913", + "id": "275.760,913", + "de": "275.760,913", + "ja": "275,760.913", + "pcm": "275,760.913", + "mr": "२,७५,७६०.९१३", + "te": "2,75,760.913" + }, + "pluralRules": { + "en": "other", + "zh": "other", + "hi": "one", + "es": "other", + "fr": "one", + "ar": "zero", + "bn": "one", + "ru": "many", + "pt": "one", + "ur": "other", + "id": "other", + "de": "other", + "ja": "other", + "pcm": "one", + "mr": "other", + "te": "other" + }, + "relativeTime": { + "en": "586,920.617 hours ago", + "zh": "586,920.617小时前", + "hi": "5,86,920.617 घंटे पहले", + "es": "hace 586.920,617 horas", + "fr": "il y a 586 920,617 heures", + "ar": "قبل ٥٨٦٬٩٢٠٫٦١٧ ساعة", + "bn": "৫,৮৬,৯২০.৬১৭ ঘন্টা আগে", + "ru": "586 920,617 часа назад", + "pt": "há 586.920,617 horas", + "ur": "586,920.617 گھنٹے پہلے", + "id": "586.920,617 jam yang lalu", + "de": "vor 586.920,617 Stunden", + "ja": "586,920.617 時間前", + "pcm": "586,920.617 áwa wé dọ́n pas", + "mr": "५,८६,९२०.६१७ तासांपूर्वी", + "te": "5,86,920.617 గంటల క్రితం" + } +} diff --git a/test/fixtures/icu/localizationData-v76.1.json b/test/fixtures/icu/localizationData-v76.1.json new file mode 100644 index 00000000000000..cb519d2bea2faa --- /dev/null +++ b/test/fixtures/icu/localizationData-v76.1.json @@ -0,0 +1,128 @@ +{ + "dateStrings": { + "en": "Fri Jul 25 1980 01:35:33 GMT+0100 (Central European Standard Time)", + "zh": "Fri Jul 25 1980 01:35:33 GMT+0100 (中欧标准时间)", + "hi": "Fri Jul 25 1980 01:35:33 GMT+0100 (मध्य यूरोपीय मानक समय)", + "es": "Fri Jul 25 1980 01:35:33 GMT+0100 (hora estándar de Europa central)", + "fr": "Fri Jul 25 1980 01:35:33 GMT+0100 (heure normale d’Europe centrale)", + "ar": "Fri Jul 25 1980 01:35:33 GMT+0100 (توقيت وسط أوروبا الرسمي)", + "bn": "Fri Jul 25 1980 01:35:33 GMT+0100 (মধ্য ইউরোপীয় মানক সময়)", + "ru": "Fri Jul 25 1980 01:35:33 GMT+0100 (Центральная Европа, стандартное время)", + "pt": "Fri Jul 25 1980 01:35:33 GMT+0100 (Horário Padrão da Europa Central)", + "ur": "Fri Jul 25 1980 01:35:33 GMT+0100 (وسطی یورپ کا معیاری وقت)", + "id": "Fri Jul 25 1980 01:35:33 GMT+0100 (Waktu Standar Eropa Tengah)", + "de": "Fri Jul 25 1980 01:35:33 GMT+0100 (Mitteleuropäische Normalzeit)", + "ja": "Fri Jul 25 1980 01:35:33 GMT+0100 (中央ヨーロッパ標準時)", + "pcm": "Fri Jul 25 1980 01:35:33 GMT+0100 (Mídúl Yúrop Fíksd Taim)", + "mr": "Fri Jul 25 1980 01:35:33 GMT+0100 (मध्‍य युरोपियन प्रमाण वेळ)", + "te": "Fri Jul 25 1980 01:35:33 GMT+0100 (సెంట్రల్ యూరోపియన్ ప్రామాణిక సమయం)" + }, + "dateTimeFormats": { + "en": "7/25/1980, 1:35:33 AM", + "zh": "1980/7/25 01:35:33", + "hi": "25/7/1980, 1:35:33 am", + "es": "25/7/1980, 1:35:33", + "fr": "25/07/1980 01:35:33", + "ar": "25‏/7‏/1980، 1:35:33 ص", + "bn": "২৫/৭/১৯৮০, ১:৩৫:৩৩ AM", + "ru": "25.07.1980, 01:35:33", + "pt": "25/07/1980, 01:35:33", + "ur": "25/7/1980، 1:35:33 AM", + "id": "25/7/1980, 01.35.33", + "de": "25.7.1980, 01:35:33", + "ja": "1980/7/25 1:35:33", + "pcm": "25/7/1980 01:35:33", + "mr": "२५/७/१९८०, १:३५:३३ AM", + "te": "25/7/1980 1:35:33 AM" + }, + "dateFormats": { + "en": "7/25/1980", + "zh": "1980/7/25", + "hi": "25/7/1980", + "es": "25/7/1980", + "fr": "25/07/1980", + "ar": "25‏/7‏/1980", + "bn": "২৫/৭/১৯৮০", + "ru": "25.07.1980", + "pt": "25/07/1980", + "ur": "25/7/1980", + "id": "25/7/1980", + "de": "25.7.1980", + "ja": "1980/7/25", + "pcm": "25/7/1980", + "mr": "२५/७/१९८०", + "te": "25/7/1980" + }, + "displayNames": { + "en": "Switzerland", + "zh": "瑞士", + "hi": "स्विट्ज़रलैंड", + "es": "Suiza", + "fr": "Suisse", + "ar": "سويسرا", + "bn": "সুইজারল্যান্ড", + "ru": "Швейцария", + "pt": "Suíça", + "ur": "سوئٹزر لینڈ", + "id": "Swiss", + "de": "Schweiz", + "ja": "スイス", + "pcm": "Swítsaland", + "mr": "स्वित्झर्लंड", + "te": "స్విట్జర్లాండ్" + }, + "numberFormats": { + "en": "275,760.913", + "zh": "275,760.913", + "hi": "2,75,760.913", + "es": "275.760,913", + "fr": "275 760,913", + "ar": "275,760.913", + "bn": "২,৭৫,৭৬০.৯১৩", + "ru": "275 760,913", + "pt": "275.760,913", + "ur": "275,760.913", + "id": "275.760,913", + "de": "275.760,913", + "ja": "275,760.913", + "pcm": "275,760.913", + "mr": "२,७५,७६०.९१३", + "te": "2,75,760.913" + }, + "pluralRules": { + "en": "other", + "zh": "other", + "hi": "one", + "es": "other", + "fr": "one", + "ar": "zero", + "bn": "one", + "ru": "many", + "pt": "one", + "ur": "other", + "id": "other", + "de": "other", + "ja": "other", + "pcm": "one", + "mr": "other", + "te": "other" + }, + "relativeTime": { + "en": "586,920.617 hours ago", + "zh": "586,920.617小时前", + "hi": "5,86,920.617 घंटे पहले", + "es": "hace 586.920,617 horas", + "fr": "il y a 586 920,617 heures", + "ar": "قبل 586,920.617 ساعة", + "bn": "৫,৮৬,৯২০.৬১৭ ঘন্টা আগে", + "ru": "586 920,617 часа назад", + "pt": "há 586.920,617 horas", + "ur": "586,920.617 گھنٹے پہلے", + "id": "586.920,617 jam yang lalu", + "de": "vor 586.920,617 Stunden", + "ja": "586,920.617 時間前", + "pcm": "586,920.617 áwa wé dọ́n pas", + "mr": "५,८६,९२०.६१७ तासांपूर्वी", + "te": "5,86,920.617 గంటల క్రితం" + } +} diff --git a/test/fixtures/module-hooks/add-hook.js b/test/fixtures/module-hooks/add-hook.js new file mode 100644 index 00000000000000..807a73953c3d6b --- /dev/null +++ b/test/fixtures/module-hooks/add-hook.js @@ -0,0 +1,30 @@ +'use strict'; +const { fileURLToPath } = require('url'); +const { registerHooks } = require('module'); + +// This is a simplified version of the pirates package API to +// check that a similar API can be built on top of the public +// hooks. +function addHook(hook, options) { + function load(url, context, nextLoad) { + const result = nextLoad(url, context); + const index = url.lastIndexOf('.'); + const ext = url.slice(index); + if (!options.exts.includes(ext)) { + return result; + } + const filename = fileURLToPath(url); + if (!options.matcher(filename)) { + return result; + } + return { ...result, source: hook(result.source.toString(), filename) } + } + + const registered = registerHooks({ load }); + + return function revert() { + registered.deregister(); + }; +} + +module.exports = { addHook }; diff --git a/test/fixtures/module-hooks/get-stats.js b/test/fixtures/module-hooks/get-stats.js new file mode 100644 index 00000000000000..fa5869a455cea1 --- /dev/null +++ b/test/fixtures/module-hooks/get-stats.js @@ -0,0 +1,20 @@ +'use strict'; + +const path = require('path'); + +// Adapted from https://github.com/watson/module-details-from-path/blob/master/index.js +// used by require-in-the-middle to check the logic is still compatible with our new hooks. +exports.getStats = function getStats(filepath) { + const segments = filepath.split(path.sep); + const index = segments.lastIndexOf('node_modules'); + if (index === -1) return {}; + if (!segments[index + 1]) return {}; + const scoped = segments[index + 1][0] === '@'; + const name = scoped ? segments[index + 1] + '/' + segments[index + 2] : segments[index + 1]; + const offset = scoped ? 3 : 2; + return { + name: name, + basedir: segments.slice(0, index + offset).join(path.sep), + path: segments.slice(index + offset).join(path.sep) + } +}; diff --git a/test/fixtures/module-hooks/load-from-this-dir.js b/test/fixtures/module-hooks/load-from-this-dir.js new file mode 100644 index 00000000000000..e1c51d2f43db32 --- /dev/null +++ b/test/fixtures/module-hooks/load-from-this-dir.js @@ -0,0 +1,4 @@ +'use strict'; + +exports.require = require; +exports.import = (id) => import(id); diff --git a/test/fixtures/module-hooks/log-user.cts b/test/fixtures/module-hooks/log-user.cts new file mode 100644 index 00000000000000..2b2754f48c4c74 --- /dev/null +++ b/test/fixtures/module-hooks/log-user.cts @@ -0,0 +1,3 @@ +const { UserAccount, UserType } = require('./user.ts'); +const account: typeof UserAccount = new UserAccount('john', 100, UserType.Admin); +console.log(account); diff --git a/test/fixtures/module-hooks/log-user.mts b/test/fixtures/module-hooks/log-user.mts new file mode 100644 index 00000000000000..9e2c3bfe1a3bb8 --- /dev/null +++ b/test/fixtures/module-hooks/log-user.mts @@ -0,0 +1,4 @@ +import { UserAccount, UserType } from './user.ts'; +import { log } from 'node:console'; +const account: UserAccount = new UserAccount('john', 100, UserType.Admin); +log(account); diff --git a/test/fixtures/module-hooks/node_modules/bar-esm/bar-esm.js b/test/fixtures/module-hooks/node_modules/bar-esm/bar-esm.js new file mode 100644 index 00000000000000..2130577ddf4b51 --- /dev/null +++ b/test/fixtures/module-hooks/node_modules/bar-esm/bar-esm.js @@ -0,0 +1 @@ +export const $key = 'bar-esm'; diff --git a/test/fixtures/module-hooks/node_modules/bar-esm/package.json b/test/fixtures/module-hooks/node_modules/bar-esm/package.json new file mode 100644 index 00000000000000..3c3282814fb87c --- /dev/null +++ b/test/fixtures/module-hooks/node_modules/bar-esm/package.json @@ -0,0 +1,6 @@ +{ + "name": "bar-esm", + "main": "bar-esm.js", + "type": "module", + "version": "1.0.0" +} diff --git a/test/fixtures/module-hooks/node_modules/bar/bar.js b/test/fixtures/module-hooks/node_modules/bar/bar.js new file mode 100644 index 00000000000000..4d1a1e6dc010fd --- /dev/null +++ b/test/fixtures/module-hooks/node_modules/bar/bar.js @@ -0,0 +1,3 @@ +module.exports = { + $key: 'bar' +}; diff --git a/test/fixtures/module-hooks/node_modules/bar/package.json b/test/fixtures/module-hooks/node_modules/bar/package.json new file mode 100644 index 00000000000000..0a2e2f7d1dad6b --- /dev/null +++ b/test/fixtures/module-hooks/node_modules/bar/package.json @@ -0,0 +1,6 @@ +{ + "name": "bar", + "main": "bar.js", + "version": "1.0.0" +} + diff --git a/test/fixtures/module-hooks/node_modules/foo-esm/foo-esm.js b/test/fixtures/module-hooks/node_modules/foo-esm/foo-esm.js new file mode 100644 index 00000000000000..caf20f7cf2b78e --- /dev/null +++ b/test/fixtures/module-hooks/node_modules/foo-esm/foo-esm.js @@ -0,0 +1 @@ +export const $key = 'foo-esm'; \ No newline at end of file diff --git a/test/fixtures/module-hooks/node_modules/foo-esm/package.json b/test/fixtures/module-hooks/node_modules/foo-esm/package.json new file mode 100644 index 00000000000000..2a98229ba262a3 --- /dev/null +++ b/test/fixtures/module-hooks/node_modules/foo-esm/package.json @@ -0,0 +1,7 @@ +{ + "name": "foo-esm", + "type": "module", + "main": "foo-esm.js", + "version": "1.0.0" +} + diff --git a/test/fixtures/module-hooks/node_modules/foo/foo.js b/test/fixtures/module-hooks/node_modules/foo/foo.js new file mode 100644 index 00000000000000..91592faf7ce0a6 --- /dev/null +++ b/test/fixtures/module-hooks/node_modules/foo/foo.js @@ -0,0 +1,3 @@ +module.exports = { + $key: 'foo' +}; diff --git a/test/fixtures/module-hooks/node_modules/foo/package.json b/test/fixtures/module-hooks/node_modules/foo/package.json new file mode 100644 index 00000000000000..53416530e84f2f --- /dev/null +++ b/test/fixtures/module-hooks/node_modules/foo/package.json @@ -0,0 +1,6 @@ +{ + "name": "foo", + "main": "foo.js", + "version": "1.0.0" +} + diff --git a/test/fixtures/module-hooks/redirected-assert.js b/test/fixtures/module-hooks/redirected-assert.js new file mode 100644 index 00000000000000..9855afd7ee3a3c --- /dev/null +++ b/test/fixtures/module-hooks/redirected-assert.js @@ -0,0 +1 @@ +exports.exports_for_test = 'redirected assert' diff --git a/test/fixtures/module-hooks/redirected-fs.js b/test/fixtures/module-hooks/redirected-fs.js new file mode 100644 index 00000000000000..84631b34c3539a --- /dev/null +++ b/test/fixtures/module-hooks/redirected-fs.js @@ -0,0 +1 @@ +export const exports_for_test = 'redirected fs'; diff --git a/test/fixtures/module-hooks/redirected-zlib.js b/test/fixtures/module-hooks/redirected-zlib.js new file mode 100644 index 00000000000000..9c2fcd5ac75b40 --- /dev/null +++ b/test/fixtures/module-hooks/redirected-zlib.js @@ -0,0 +1 @@ +exports.exports_for_test = 'redirected zlib'; diff --git a/test/fixtures/module-hooks/register-typescript-hooks.js b/test/fixtures/module-hooks/register-typescript-hooks.js new file mode 100644 index 00000000000000..2f9177124ab304 --- /dev/null +++ b/test/fixtures/module-hooks/register-typescript-hooks.js @@ -0,0 +1,4 @@ +'use strict'; + +const { registerHooks } = require('node:module'); +registerHooks(require('./typescript-transpiler')); diff --git a/test/fixtures/module-hooks/typescript-transpiler.js b/test/fixtures/module-hooks/typescript-transpiler.js new file mode 100644 index 00000000000000..b8cb638332ce85 --- /dev/null +++ b/test/fixtures/module-hooks/typescript-transpiler.js @@ -0,0 +1,71 @@ +'use strict'; + +const ts = require('../snapshot/typescript'); +const extensions = { + '.cts': 'commonjs-typescript', + '.mts': 'module-typescript', + '.ts': 'typescript', +}; + +const output = { + 'commonjs-typescript': { + options: { module: ts.ModuleKind.CommonJS }, + format: 'commonjs', + }, + 'module-typescript': { + options: { module: ts.ModuleKind.ESNext }, + format: 'module', + }, + 'typescript': { + options: { module: ts.ModuleKind.NodeNext }, + format: 'commonjs', + }, +}; + +function resolve(specifier, context, nextResolve) { + const resolved = nextResolve(specifier, context); + const index = resolved.url.lastIndexOf('.'); + if (index === -1) { + return resolved; + } + const ext = resolved.url.slice(index); + const supportedFormat = extensions[ext]; + if (!supportedFormat) { + return resolved; + } + const result = { + ...resolved, + format: supportedFormat, + }; + return result; +} + +let decoder; +function load(url, context, nextLoad) { + const loadResult = nextLoad(url, context); + const { source, format } = loadResult; + + if (!format || !format.includes('typescript')) { + return { format, source }; + } + + let str = source; + if (typeof str !== 'string') { + decoder ??= new TextDecoder(); + str = decoder.decode(source); + } + const transpiled = ts.transpileModule(str, { + compilerOptions: output[format].options + }); + + const result = { + ...loadResult, + format: output[format].format, + source: transpiled.outputText, + }; + + return result; +} + +exports.load = load; +exports.resolve = resolve; diff --git a/test/fixtures/module-hooks/user.ts b/test/fixtures/module-hooks/user.ts new file mode 100644 index 00000000000000..f4e064b2739345 --- /dev/null +++ b/test/fixtures/module-hooks/user.ts @@ -0,0 +1,18 @@ +enum UserType { + Staff, + Admin, +}; + +class UserAccount { + name: string; + id: number; + type: UserType; + + constructor(name: string, id: number, type: UserType) { + this.name = name; + this.id = id; + this.type = type; + } +} + +export { UserAccount, UserType }; diff --git a/test/fixtures/permission/fs-read.js b/test/fixtures/permission/fs-read.js index 186117a6b768dd..fa4ea1207f50bd 100644 --- a/test/fixtures/permission/fs-read.js +++ b/test/fixtures/permission/fs-read.js @@ -289,6 +289,11 @@ const regularFile = __filename; permission: 'FileSystemRead', resource: path.toNamespacedPath(blockedFolder), })); + fs.readdir(blockedFolder, { recursive: true }, common.expectsError({ + code: 'ERR_ACCESS_DENIED', + permission: 'FileSystemRead', + resource: path.toNamespacedPath(blockedFolder), + })); assert.throws(() => { fs.readdirSync(blockedFolder); }, common.expectsError({ diff --git a/test/fixtures/process-env/define.js b/test/fixtures/process-env/define.js new file mode 100644 index 00000000000000..59d5744157696a --- /dev/null +++ b/test/fixtures/process-env/define.js @@ -0,0 +1,6 @@ +Object.defineProperty(process.env, 'FOO', { + configurable: true, + enumerable: true, + writable: true, + value: 'FOO', +}); diff --git a/test/fixtures/process-env/delete.js b/test/fixtures/process-env/delete.js new file mode 100644 index 00000000000000..19ea5160513f08 --- /dev/null +++ b/test/fixtures/process-env/delete.js @@ -0,0 +1 @@ +delete process.env.FOO; diff --git a/test/fixtures/process-env/enumerate.js b/test/fixtures/process-env/enumerate.js new file mode 100644 index 00000000000000..ea6f3972bf9470 --- /dev/null +++ b/test/fixtures/process-env/enumerate.js @@ -0,0 +1,3 @@ +Object.keys(process.env); + +const env = { ...process.env }; diff --git a/test/fixtures/process-env/get.js b/test/fixtures/process-env/get.js new file mode 100644 index 00000000000000..e0257a022be4eb --- /dev/null +++ b/test/fixtures/process-env/get.js @@ -0,0 +1,2 @@ +const foo = process.env.FOO; +const bar = process.env.BAR; diff --git a/test/fixtures/process-env/query.js b/test/fixtures/process-env/query.js new file mode 100644 index 00000000000000..1e3fc9b79c3d04 --- /dev/null +++ b/test/fixtures/process-env/query.js @@ -0,0 +1,3 @@ +const foo = 'FOO' in process.env; +const bar = Object.hasOwn(process.env, 'BAR'); +const baz = process.env.hasOwnProperty('BAZ'); diff --git a/test/fixtures/process-env/set.js b/test/fixtures/process-env/set.js new file mode 100644 index 00000000000000..a9863742d187e2 --- /dev/null +++ b/test/fixtures/process-env/set.js @@ -0,0 +1 @@ +process.env.FOO = "FOO"; diff --git a/test/fixtures/snapshot/child-process-sync.js b/test/fixtures/snapshot/child-process-sync.js index 5ffacb05357df6..956b027d387192 100644 --- a/test/fixtures/snapshot/child-process-sync.js +++ b/test/fixtures/snapshot/child-process-sync.js @@ -8,7 +8,8 @@ const { function spawn() { const { spawnSync, execFileSync, execSync } = require('child_process'); spawnSync(process.execPath, [ __filename, 'spawnSync' ], { stdio: 'inherit' }); - execSync(`"${process.execPath}" "${__filename}" "execSync"`, { stdio: 'inherit' }); + if (!process.env.DIRNAME_CONTAINS_SHELL_UNSAFE_CHARS) + execSync(`"${process.execPath}" "${__filename}" "execSync"`, { stdio: 'inherit' }); execFileSync(process.execPath, [ __filename, 'execFileSync' ], { stdio: 'inherit' }); } diff --git a/test/fixtures/test-runner/coverage-default-exclusion/file-test.js b/test/fixtures/test-runner/coverage-default-exclusion/file-test.js new file mode 100644 index 00000000000000..ff1e8a2be02fcf --- /dev/null +++ b/test/fixtures/test-runner/coverage-default-exclusion/file-test.js @@ -0,0 +1,7 @@ +const test = require('node:test'); +const assert = require('node:assert'); +const { foo } = require('./logic-file'); + +test('foo returns 1', () => { + assert.strictEqual(foo(), 1); +}); diff --git a/test/fixtures/test-runner/coverage-default-exclusion/file.test.mjs b/test/fixtures/test-runner/coverage-default-exclusion/file.test.mjs new file mode 100644 index 00000000000000..5b25d4c85d6b6e --- /dev/null +++ b/test/fixtures/test-runner/coverage-default-exclusion/file.test.mjs @@ -0,0 +1,7 @@ +import test from 'node:test'; +import assert from 'node:assert'; +import { foo } from './logic-file.js'; + +test('foo returns 1', () => { + assert.strictEqual(foo(), 1); +}); diff --git a/test/fixtures/test-runner/coverage-default-exclusion/file.test.ts b/test/fixtures/test-runner/coverage-default-exclusion/file.test.ts new file mode 100644 index 00000000000000..5b25d4c85d6b6e --- /dev/null +++ b/test/fixtures/test-runner/coverage-default-exclusion/file.test.ts @@ -0,0 +1,7 @@ +import test from 'node:test'; +import assert from 'node:assert'; +import { foo } from './logic-file.js'; + +test('foo returns 1', () => { + assert.strictEqual(foo(), 1); +}); diff --git a/test/fixtures/test-runner/coverage-default-exclusion/logic-file.js b/test/fixtures/test-runner/coverage-default-exclusion/logic-file.js new file mode 100644 index 00000000000000..cc2ca8284abe7d --- /dev/null +++ b/test/fixtures/test-runner/coverage-default-exclusion/logic-file.js @@ -0,0 +1,9 @@ +function foo() { + return 1; +} + +function bar() { + return 'bar'; +} + +module.exports = { foo, bar }; diff --git a/test/fixtures/test-runner/coverage-default-exclusion/test.cjs b/test/fixtures/test-runner/coverage-default-exclusion/test.cjs new file mode 100644 index 00000000000000..641bad44ed4f33 --- /dev/null +++ b/test/fixtures/test-runner/coverage-default-exclusion/test.cjs @@ -0,0 +1,7 @@ +const test = require('node:test'); +const assert = require('node:assert'); +const { foo } = require('./logic-file.js'); + +test('foo returns 1', () => { + assert.strictEqual(foo(), 1); +}); diff --git a/test/fixtures/test-runner/coverage-default-exclusion/test/not-matching-test-name.js b/test/fixtures/test-runner/coverage-default-exclusion/test/not-matching-test-name.js new file mode 100644 index 00000000000000..8d01a2b260657f --- /dev/null +++ b/test/fixtures/test-runner/coverage-default-exclusion/test/not-matching-test-name.js @@ -0,0 +1,7 @@ +const test = require('node:test'); +const assert = require('node:assert'); +const { foo } = require('../logic-file.js'); + +test('foo returns 1', () => { + assert.strictEqual(foo(), 1); +}); diff --git a/test/fixtures/test-runner/default-behavior/test/suite_and_test.cjs b/test/fixtures/test-runner/default-behavior/test/suite_and_test.cjs new file mode 100644 index 00000000000000..0418d4676b2cd3 --- /dev/null +++ b/test/fixtures/test-runner/default-behavior/test/suite_and_test.cjs @@ -0,0 +1,5 @@ +'use strict'; +const {test, suite} = require('node:test'); + +suite('this is a suite'); +test('this is a test'); diff --git a/test/fixtures/test-runner/output/abort-runs-after-hook.snapshot b/test/fixtures/test-runner/output/abort-runs-after-hook.snapshot index c734a264b0f07f..86191e55ddc3dc 100644 --- a/test/fixtures/test-runner/output/abort-runs-after-hook.snapshot +++ b/test/fixtures/test-runner/output/abort-runs-after-hook.snapshot @@ -4,6 +4,7 @@ AFTER not ok 1 - test that aborts --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/abort-runs-after-hook.js:(LINE):1' failureType: 'uncaughtException' error: 'boom' diff --git a/test/fixtures/test-runner/output/abort.snapshot b/test/fixtures/test-runner/output/abort.snapshot index be0936bd763fbb..efe24771221956 100644 --- a/test/fixtures/test-runner/output/abort.snapshot +++ b/test/fixtures/test-runner/output/abort.snapshot @@ -4,26 +4,31 @@ TAP version 13 ok 1 - ok 1 --- duration_ms: * + type: 'test' ... # Subtest: ok 2 ok 2 - ok 2 --- duration_ms: * + type: 'test' ... # Subtest: ok 3 ok 3 - ok 3 --- duration_ms: * + type: 'test' ... # Subtest: ok 4 ok 4 - ok 4 --- duration_ms: * + type: 'test' ... # Subtest: not ok 1 not ok 5 - not ok 1 --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/abort.js:(LINE):7' failureType: 'cancelledByParent' error: 'test did not finish before its parent and was cancelled' @@ -33,6 +38,7 @@ TAP version 13 not ok 6 - not ok 2 --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/abort.js:(LINE):7' failureType: 'cancelledByParent' error: 'test did not finish before its parent and was cancelled' @@ -42,6 +48,7 @@ TAP version 13 not ok 7 - not ok 3 --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/abort.js:(LINE):7' failureType: 'testAborted' error: 'This operation was aborted' @@ -63,6 +70,7 @@ TAP version 13 not ok 8 - not ok 4 --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/abort.js:(LINE):7' failureType: 'testAborted' error: 'This operation was aborted' @@ -84,6 +92,7 @@ TAP version 13 not ok 9 - not ok 5 --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/abort.js:(LINE):7' failureType: 'testAborted' error: 'This operation was aborted' @@ -105,6 +114,7 @@ TAP version 13 not ok 1 - promise timeout signal --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/abort.js:(LINE):1' failureType: 'testAborted' error: 'The operation was aborted due to timeout' @@ -120,6 +130,7 @@ not ok 1 - promise timeout signal not ok 2 - promise abort signal --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/abort.js:(LINE):1' failureType: 'testAborted' error: 'This operation was aborted' @@ -142,26 +153,31 @@ not ok 2 - promise abort signal ok 1 - ok 1 --- duration_ms: * + type: 'test' ... # Subtest: ok 2 ok 2 - ok 2 --- duration_ms: * + type: 'test' ... # Subtest: ok 3 ok 3 - ok 3 --- duration_ms: * + type: 'test' ... # Subtest: ok 4 ok 4 - ok 4 --- duration_ms: * + type: 'test' ... # Subtest: not ok 1 not ok 5 - not ok 1 --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/abort.js:(LINE):5' failureType: 'cancelledByParent' error: 'test did not finish before its parent and was cancelled' @@ -171,6 +187,7 @@ not ok 2 - promise abort signal not ok 6 - not ok 2 --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/abort.js:(LINE):5' failureType: 'cancelledByParent' error: 'test did not finish before its parent and was cancelled' @@ -180,6 +197,7 @@ not ok 2 - promise abort signal not ok 7 - not ok 3 --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/abort.js:(LINE):5' failureType: 'testAborted' error: 'This operation was aborted' @@ -201,6 +219,7 @@ not ok 2 - promise abort signal not ok 8 - not ok 4 --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/abort.js:(LINE):5' failureType: 'testAborted' error: 'This operation was aborted' @@ -222,6 +241,7 @@ not ok 2 - promise abort signal not ok 9 - not ok 5 --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/abort.js:(LINE):5' failureType: 'testAborted' error: 'This operation was aborted' @@ -243,6 +263,7 @@ not ok 2 - promise abort signal not ok 3 - callback timeout signal --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/abort.js:(LINE):1' failureType: 'testAborted' error: 'The operation was aborted due to timeout' @@ -258,6 +279,7 @@ not ok 3 - callback timeout signal not ok 4 - callback abort signal --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/abort.js:(LINE):1' failureType: 'testAborted' error: 'This operation was aborted' diff --git a/test/fixtures/test-runner/output/abort_hooks.snapshot b/test/fixtures/test-runner/output/abort_hooks.snapshot index 278b5e5fd36ca5..a1d389d98b5610 100644 --- a/test/fixtures/test-runner/output/abort_hooks.snapshot +++ b/test/fixtures/test-runner/output/abort_hooks.snapshot @@ -12,6 +12,7 @@ TAP version 13 not ok 1 - test 1 --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/abort_hooks.js:(LINE):3' failureType: 'cancelledByParent' error: 'test did not finish before its parent and was cancelled' @@ -21,6 +22,7 @@ TAP version 13 not ok 2 - test 2 --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/abort_hooks.js:(LINE):3' failureType: 'cancelledByParent' error: 'test did not finish before its parent and was cancelled' @@ -53,11 +55,13 @@ not ok 1 - 1 before describe ok 1 - test 1 --- duration_ms: * + type: 'test' ... # Subtest: test 2 ok 2 - test 2 --- duration_ms: * + type: 'test' ... 1..2 not ok 2 - 2 after describe @@ -86,6 +90,7 @@ not ok 2 - 2 after describe not ok 1 - test 1 --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/abort_hooks.js:(LINE):3' failureType: 'hookFailed' error: 'This operation was aborted' @@ -101,12 +106,13 @@ not ok 2 - 2 after describe * * * - async Promise.all (index 0) + * ... # Subtest: test 2 not ok 2 - test 2 --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/abort_hooks.js:(LINE):3' failureType: 'hookFailed' error: 'This operation was aborted' @@ -122,7 +128,7 @@ not ok 2 - 2 after describe * * * - async Promise.all (index 0) + * ... 1..2 not ok 3 - 3 beforeEach describe @@ -139,6 +145,7 @@ not ok 3 - 3 beforeEach describe not ok 1 - test 1 --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/abort_hooks.js:(LINE):3' failureType: 'hookFailed' error: 'This operation was aborted' @@ -160,6 +167,7 @@ not ok 3 - 3 beforeEach describe not ok 2 - test 2 --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/abort_hooks.js:(LINE):3' failureType: 'hookFailed' error: 'This operation was aborted' diff --git a/test/fixtures/test-runner/output/abort_suite.snapshot b/test/fixtures/test-runner/output/abort_suite.snapshot index b3eb5d9126db26..bdb52ad1ffcc72 100644 --- a/test/fixtures/test-runner/output/abort_suite.snapshot +++ b/test/fixtures/test-runner/output/abort_suite.snapshot @@ -4,26 +4,31 @@ TAP version 13 ok 1 - ok 1 --- duration_ms: * + type: 'test' ... # Subtest: ok 2 ok 2 - ok 2 --- duration_ms: * + type: 'test' ... # Subtest: ok 3 ok 3 - ok 3 --- duration_ms: * + type: 'test' ... # Subtest: ok 4 ok 4 - ok 4 --- duration_ms: * + type: 'test' ... # Subtest: not ok 1 not ok 5 - not ok 1 --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/abort_suite.js:(LINE):3' failureType: 'cancelledByParent' error: 'test did not finish before its parent and was cancelled' @@ -33,6 +38,7 @@ TAP version 13 not ok 6 - not ok 2 --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/abort_suite.js:(LINE):3' failureType: 'cancelledByParent' error: 'test did not finish before its parent and was cancelled' @@ -42,6 +48,7 @@ TAP version 13 not ok 7 - not ok 3 --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/abort_suite.js:(LINE):3' failureType: 'testAborted' error: 'This operation was aborted' @@ -63,6 +70,7 @@ TAP version 13 not ok 8 - not ok 4 --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/abort_suite.js:(LINE):3' failureType: 'testAborted' error: 'This operation was aborted' @@ -84,6 +92,7 @@ TAP version 13 not ok 9 - not ok 5 --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/abort_suite.js:(LINE):3' failureType: 'testAborted' error: 'This operation was aborted' diff --git a/test/fixtures/test-runner/output/arbitrary-output-colored.snapshot b/test/fixtures/test-runner/output/arbitrary-output-colored.snapshot index 34b5c0479857ff..b3d8c16100b1e5 100644 --- a/test/fixtures/test-runner/output/arbitrary-output-colored.snapshot +++ b/test/fixtures/test-runner/output/arbitrary-output-colored.snapshot @@ -16,6 +16,7 @@ TAP version 13 ok 1 - passing test --- duration_ms: * + type: 'test' ... 1..1 # tests 1 diff --git a/test/fixtures/test-runner/output/async-test-scheduling.snapshot b/test/fixtures/test-runner/output/async-test-scheduling.snapshot index 64c3004d26881d..a444480c02bcc1 100644 --- a/test/fixtures/test-runner/output/async-test-scheduling.snapshot +++ b/test/fixtures/test-runner/output/async-test-scheduling.snapshot @@ -3,17 +3,20 @@ TAP version 13 ok 1 - test --- duration_ms: * + type: 'test' ... # Subtest: suite # Subtest: test ok 1 - test --- duration_ms: * + type: 'test' ... # Subtest: scheduled async ok 2 - scheduled async --- duration_ms: * + type: 'test' ... 1..2 ok 2 - suite @@ -25,6 +28,7 @@ ok 2 - suite ok 3 - scheduled async --- duration_ms: * + type: 'test' ... 1..3 # tests 4 diff --git a/test/fixtures/test-runner/output/before-and-after-each-too-many-listeners.snapshot b/test/fixtures/test-runner/output/before-and-after-each-too-many-listeners.snapshot index 4300e21a26403f..f9698bad2f839d 100644 --- a/test/fixtures/test-runner/output/before-and-after-each-too-many-listeners.snapshot +++ b/test/fixtures/test-runner/output/before-and-after-each-too-many-listeners.snapshot @@ -3,56 +3,67 @@ TAP version 13 ok 1 - 1 --- duration_ms: * + type: 'test' ... # Subtest: 2 ok 2 - 2 --- duration_ms: * + type: 'test' ... # Subtest: 3 ok 3 - 3 --- duration_ms: * + type: 'test' ... # Subtest: 4 ok 4 - 4 --- duration_ms: * + type: 'test' ... # Subtest: 5 ok 5 - 5 --- duration_ms: * + type: 'test' ... # Subtest: 6 ok 6 - 6 --- duration_ms: * + type: 'test' ... # Subtest: 7 ok 7 - 7 --- duration_ms: * + type: 'test' ... # Subtest: 8 ok 8 - 8 --- duration_ms: * + type: 'test' ... # Subtest: 9 ok 9 - 9 --- duration_ms: * + type: 'test' ... # Subtest: 10 ok 10 - 10 --- duration_ms: * + type: 'test' ... # Subtest: 11 ok 11 - 11 --- duration_ms: * + type: 'test' ... 1..11 # tests 11 diff --git a/test/fixtures/test-runner/output/before-and-after-each-with-timeout-too-many-listeners.snapshot b/test/fixtures/test-runner/output/before-and-after-each-with-timeout-too-many-listeners.snapshot index 4300e21a26403f..f9698bad2f839d 100644 --- a/test/fixtures/test-runner/output/before-and-after-each-with-timeout-too-many-listeners.snapshot +++ b/test/fixtures/test-runner/output/before-and-after-each-with-timeout-too-many-listeners.snapshot @@ -3,56 +3,67 @@ TAP version 13 ok 1 - 1 --- duration_ms: * + type: 'test' ... # Subtest: 2 ok 2 - 2 --- duration_ms: * + type: 'test' ... # Subtest: 3 ok 3 - 3 --- duration_ms: * + type: 'test' ... # Subtest: 4 ok 4 - 4 --- duration_ms: * + type: 'test' ... # Subtest: 5 ok 5 - 5 --- duration_ms: * + type: 'test' ... # Subtest: 6 ok 6 - 6 --- duration_ms: * + type: 'test' ... # Subtest: 7 ok 7 - 7 --- duration_ms: * + type: 'test' ... # Subtest: 8 ok 8 - 8 --- duration_ms: * + type: 'test' ... # Subtest: 9 ok 9 - 9 --- duration_ms: * + type: 'test' ... # Subtest: 10 ok 10 - 10 --- duration_ms: * + type: 'test' ... # Subtest: 11 ok 11 - 11 --- duration_ms: * + type: 'test' ... 1..11 # tests 11 diff --git a/test/fixtures/test-runner/output/coverage-width-100-uncovered-lines.snapshot b/test/fixtures/test-runner/output/coverage-width-100-uncovered-lines.snapshot index c410c42fb7eeb9..82741f8a4ff70a 100644 --- a/test/fixtures/test-runner/output/coverage-width-100-uncovered-lines.snapshot +++ b/test/fixtures/test-runner/output/coverage-width-100-uncovered-lines.snapshot @@ -3,6 +3,7 @@ TAP version 13 ok 1 - Coverage Print Fixed Width 100 --- duration_ms: * + type: 'test' ... 1..1 # tests 1 diff --git a/test/fixtures/test-runner/output/coverage-width-100.snapshot b/test/fixtures/test-runner/output/coverage-width-100.snapshot index dfb48005c48eaf..f93f4bd574894f 100644 --- a/test/fixtures/test-runner/output/coverage-width-100.snapshot +++ b/test/fixtures/test-runner/output/coverage-width-100.snapshot @@ -3,6 +3,7 @@ TAP version 13 ok 1 - Coverage Print Fixed Width 100 --- duration_ms: * + type: 'test' ... 1..1 # tests 1 diff --git a/test/fixtures/test-runner/output/coverage-width-150-uncovered-lines.snapshot b/test/fixtures/test-runner/output/coverage-width-150-uncovered-lines.snapshot index 423dac3291bf74..00207346ec3fdd 100644 --- a/test/fixtures/test-runner/output/coverage-width-150-uncovered-lines.snapshot +++ b/test/fixtures/test-runner/output/coverage-width-150-uncovered-lines.snapshot @@ -3,6 +3,7 @@ TAP version 13 ok 1 - Coverage Print Fixed Width 150 --- duration_ms: * + type: 'test' ... 1..1 # tests 1 diff --git a/test/fixtures/test-runner/output/coverage-width-150.snapshot b/test/fixtures/test-runner/output/coverage-width-150.snapshot index c4aa8109955a12..eb2015fbf42b94 100644 --- a/test/fixtures/test-runner/output/coverage-width-150.snapshot +++ b/test/fixtures/test-runner/output/coverage-width-150.snapshot @@ -3,6 +3,7 @@ TAP version 13 ok 1 - Coverage Print Fixed Width 150 --- duration_ms: * + type: 'test' ... 1..1 # tests 1 diff --git a/test/fixtures/test-runner/output/coverage-width-40.snapshot b/test/fixtures/test-runner/output/coverage-width-40.snapshot index 09d236b8bea413..17c7cacbf930ef 100644 --- a/test/fixtures/test-runner/output/coverage-width-40.snapshot +++ b/test/fixtures/test-runner/output/coverage-width-40.snapshot @@ -3,6 +3,7 @@ TAP version 13 ok 1 - Coverage Print Fixed Width 40 --- duration_ms: * + type: 'test' ... 1..1 # tests 1 diff --git a/test/fixtures/test-runner/output/coverage-width-80-uncovered-lines.snapshot b/test/fixtures/test-runner/output/coverage-width-80-uncovered-lines.snapshot index 6564d7942d8cd9..4c12575387dde1 100644 --- a/test/fixtures/test-runner/output/coverage-width-80-uncovered-lines.snapshot +++ b/test/fixtures/test-runner/output/coverage-width-80-uncovered-lines.snapshot @@ -3,6 +3,7 @@ TAP version 13 ok 1 - Coverage Print Fixed Width 100 --- duration_ms: * + type: 'test' ... 1..1 # tests 1 diff --git a/test/fixtures/test-runner/output/coverage-width-80.snapshot b/test/fixtures/test-runner/output/coverage-width-80.snapshot index de071277e1f98d..906b9456f4308f 100644 --- a/test/fixtures/test-runner/output/coverage-width-80.snapshot +++ b/test/fixtures/test-runner/output/coverage-width-80.snapshot @@ -3,6 +3,7 @@ TAP version 13 ok 1 - Coverage Print Fixed Width 80 --- duration_ms: * + type: 'test' ... 1..1 # tests 1 diff --git a/test/fixtures/test-runner/output/coverage-width-infinity-uncovered-lines.snapshot b/test/fixtures/test-runner/output/coverage-width-infinity-uncovered-lines.snapshot index 7440b7772a1925..c6c3228f72dd55 100644 --- a/test/fixtures/test-runner/output/coverage-width-infinity-uncovered-lines.snapshot +++ b/test/fixtures/test-runner/output/coverage-width-infinity-uncovered-lines.snapshot @@ -3,6 +3,7 @@ TAP version 13 ok 1 - Coverage Print Fixed Width Infinity --- duration_ms: * + type: 'test' ... 1..1 # tests 1 diff --git a/test/fixtures/test-runner/output/coverage-width-infinity.snapshot b/test/fixtures/test-runner/output/coverage-width-infinity.snapshot index 2b9916a5b08217..c581e96f98b984 100644 --- a/test/fixtures/test-runner/output/coverage-width-infinity.snapshot +++ b/test/fixtures/test-runner/output/coverage-width-infinity.snapshot @@ -3,6 +3,7 @@ TAP version 13 ok 1 - Coverage Print Fixed Width Infinity --- duration_ms: * + type: 'test' ... 1..1 # tests 1 diff --git a/test/fixtures/test-runner/output/coverage_failure.snapshot b/test/fixtures/test-runner/output/coverage_failure.snapshot index 62f39ebede943a..1e74561798018d 100644 --- a/test/fixtures/test-runner/output/coverage_failure.snapshot +++ b/test/fixtures/test-runner/output/coverage_failure.snapshot @@ -3,6 +3,7 @@ TAP version 13 ok 1 - ok --- duration_ms: * + type: 'test' ... 1..1 # Warning: Could not report code coverage. Error: Failed to collect coverage diff --git a/test/fixtures/test-runner/output/describe_it.snapshot b/test/fixtures/test-runner/output/describe_it.snapshot index d7994e888fe36a..67d4af7f1b9f45 100644 --- a/test/fixtures/test-runner/output/describe_it.snapshot +++ b/test/fixtures/test-runner/output/describe_it.snapshot @@ -3,16 +3,19 @@ TAP version 13 ok 1 - sync pass todo # TODO --- duration_ms: * + type: 'test' ... # Subtest: sync pass todo with message ok 2 - sync pass todo with message # TODO this is a passing todo --- duration_ms: * + type: 'test' ... # Subtest: sync todo not ok 3 - sync todo # TODO --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/describe_it.js:(LINE):4' failureType: 'testCodeFailure' error: 'should not count as a failure' @@ -30,6 +33,7 @@ not ok 3 - sync todo # TODO not ok 4 - sync todo with message # TODO this is a failing todo --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/describe_it.js:(LINE):1' failureType: 'testCodeFailure' error: 'should not count as a failure' @@ -47,21 +51,25 @@ not ok 4 - sync todo with message # TODO this is a failing todo ok 5 - sync skip pass # SKIP --- duration_ms: * + type: 'test' ... # Subtest: sync skip pass with message ok 6 - sync skip pass with message # SKIP this is skipped --- duration_ms: * + type: 'test' ... # Subtest: sync pass ok 7 - sync pass --- duration_ms: * + type: 'test' ... # Subtest: sync throw fail not ok 8 - sync throw fail --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/describe_it.js:(LINE):1' failureType: 'testCodeFailure' error: 'thrown from sync throw fail' @@ -79,21 +87,25 @@ not ok 8 - sync throw fail ok 9 - async skip pass # SKIP --- duration_ms: * + type: 'test' ... # Subtest: async pass ok 10 - async pass --- duration_ms: * + type: 'test' ... # Subtest: mixing describe/it and test should work ok 11 - mixing describe/it and test should work --- duration_ms: * + type: 'test' ... # Subtest: async throw fail not ok 12 - async throw fail --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/describe_it.js:(LINE):1' failureType: 'testCodeFailure' error: 'thrown from async throw fail' @@ -111,6 +123,7 @@ not ok 12 - async throw fail not ok 13 - async skip fail # SKIP --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/describe_it.js:(LINE):1' failureType: 'callbackAndPromisePresent' error: 'passed a callback but also returned a Promise' @@ -120,6 +133,7 @@ not ok 13 - async skip fail # SKIP not ok 14 - async assertion fail --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/describe_it.js:(LINE):1' failureType: 'testCodeFailure' error: |- @@ -145,11 +159,13 @@ not ok 14 - async assertion fail ok 15 - resolve pass --- duration_ms: * + type: 'test' ... # Subtest: reject fail not ok 16 - reject fail --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/describe_it.js:(LINE):1' failureType: 'testCodeFailure' error: 'rejected from reject fail' @@ -167,32 +183,38 @@ not ok 16 - reject fail ok 17 - unhandled rejection - passes but warns --- duration_ms: * + type: 'test' ... # Subtest: async unhandled rejection - passes but warns ok 18 - async unhandled rejection - passes but warns --- duration_ms: * + type: 'test' ... # Subtest: immediate throw - passes but warns ok 19 - immediate throw - passes but warns --- duration_ms: * + type: 'test' ... # Subtest: immediate reject - passes but warns ok 20 - immediate reject - passes but warns --- duration_ms: * + type: 'test' ... # Subtest: immediate resolve pass ok 21 - immediate resolve pass --- duration_ms: * + type: 'test' ... # Subtest: subtest sync throw fail # Subtest: +sync throw fail not ok 1 - +sync throw fail --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/describe_it.js:(LINE):3' failureType: 'testCodeFailure' error: 'thrown from subtest sync throw fail' @@ -213,6 +235,7 @@ ok 21 - immediate resolve pass ok 2 - mixing describe/it and test should work --- duration_ms: * + type: 'test' ... 1..2 not ok 22 - subtest sync throw fail @@ -228,6 +251,7 @@ not ok 22 - subtest sync throw fail not ok 23 - sync throw non-error fail --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/describe_it.js:(LINE):1' failureType: 'testCodeFailure' error: 'Symbol(thrown symbol from sync throw non-error fail)' @@ -238,21 +262,25 @@ not ok 23 - sync throw non-error fail ok 1 - level 1a --- duration_ms: * + type: 'test' ... # Subtest: level 1b ok 2 - level 1b --- duration_ms: * + type: 'test' ... # Subtest: level 1c ok 3 - level 1c --- duration_ms: * + type: 'test' ... # Subtest: level 1d ok 4 - level 1d --- duration_ms: * + type: 'test' ... 1..4 ok 24 - level 0a @@ -270,16 +298,19 @@ ok 25 - invalid subtest - pass but subtest fails ok 26 - sync skip option # SKIP --- duration_ms: * + type: 'test' ... # Subtest: sync skip option with message ok 27 - sync skip option with message # SKIP this is skipped --- duration_ms: * + type: 'test' ... # Subtest: sync skip option is false fail not ok 28 - sync skip option is false fail --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/describe_it.js:(LINE):1' failureType: 'testCodeFailure' error: 'this should be executed' @@ -297,51 +328,61 @@ not ok 28 - sync skip option is false fail ok 29 - --- duration_ms: * + type: 'test' ... # Subtest: functionOnly ok 30 - functionOnly --- duration_ms: * + type: 'test' ... # Subtest: ok 31 - --- duration_ms: * + type: 'test' ... # Subtest: test with only a name provided ok 32 - test with only a name provided --- duration_ms: * + type: 'test' ... # Subtest: ok 33 - --- duration_ms: * + type: 'test' ... # Subtest: ok 34 - # SKIP --- duration_ms: * + type: 'test' ... # Subtest: test with a name and options provided ok 35 - test with a name and options provided # SKIP --- duration_ms: * + type: 'test' ... # Subtest: functionAndOptions ok 36 - functionAndOptions # SKIP --- duration_ms: * + type: 'test' ... # Subtest: callback pass ok 37 - callback pass --- duration_ms: * + type: 'test' ... # Subtest: callback fail not ok 38 - callback fail --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/describe_it.js:(LINE):1' failureType: 'testCodeFailure' error: 'callback failure' @@ -354,21 +395,25 @@ not ok 38 - callback fail ok 39 - sync t is this in test --- duration_ms: * + type: 'test' ... # Subtest: async t is this in test ok 40 - async t is this in test --- duration_ms: * + type: 'test' ... # Subtest: callback t is this in test ok 41 - callback t is this in test --- duration_ms: * + type: 'test' ... # Subtest: callback also returns a Promise not ok 42 - callback also returns a Promise --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/describe_it.js:(LINE):1' failureType: 'callbackAndPromisePresent' error: 'passed a callback but also returned a Promise' @@ -378,6 +423,7 @@ not ok 42 - callback also returns a Promise not ok 43 - callback throw --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/describe_it.js:(LINE):1' failureType: 'testCodeFailure' error: 'thrown from callback throw' @@ -395,6 +441,7 @@ not ok 43 - callback throw not ok 44 - callback called twice --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/describe_it.js:(LINE):1' failureType: 'multipleCallbackInvocations' error: 'callback invoked multiple times' @@ -407,11 +454,13 @@ not ok 44 - callback called twice ok 45 - callback called twice in different ticks --- duration_ms: * + type: 'test' ... # Subtest: callback called twice in future tick not ok 46 - callback called twice in future tick --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/describe_it.js:(LINE):1' failureType: 'uncaughtException' error: 'callback invoked multiple times' @@ -423,6 +472,7 @@ not ok 46 - callback called twice in future tick not ok 47 - callback async throw --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/describe_it.js:(LINE):1' failureType: 'uncaughtException' error: 'thrown from callback async throw' @@ -435,11 +485,13 @@ not ok 47 - callback async throw ok 48 - callback async throw after done --- duration_ms: * + type: 'test' ... # Subtest: custom inspect symbol fail not ok 49 - custom inspect symbol fail --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/describe_it.js:(LINE):1' failureType: 'testCodeFailure' error: 'customized' @@ -449,6 +501,7 @@ not ok 49 - custom inspect symbol fail not ok 50 - custom inspect symbol that throws fail --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/describe_it.js:(LINE):1' failureType: 'testCodeFailure' error: |- @@ -463,6 +516,7 @@ not ok 50 - custom inspect symbol that throws fail not ok 1 - sync throw fails at first --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/describe_it.js:(LINE):3' failureType: 'testCodeFailure' error: 'thrown from subtest sync throw fails at first' @@ -483,6 +537,7 @@ not ok 50 - custom inspect symbol that throws fail not ok 2 - sync throw fails at second --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/describe_it.js:(LINE):3' failureType: 'testCodeFailure' error: 'thrown from subtest sync throw fails at second' @@ -513,6 +568,7 @@ not ok 51 - subtest sync throw fails not ok 1 - should not run --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/describe_it.js:(LINE):3' failureType: 'cancelledByParent' error: 'test did not finish before its parent and was cancelled' @@ -544,6 +600,7 @@ not ok 52 - describe sync throw fails not ok 1 - should not run --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/describe_it.js:(LINE):3' failureType: 'cancelledByParent' error: 'test did not finish before its parent and was cancelled' @@ -575,6 +632,7 @@ not ok 53 - describe async throw fails not ok 1 - timed out async test --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/describe_it.js:(LINE):3' failureType: 'testTimeoutFailure' error: 'test timed out after 5ms' @@ -586,6 +644,7 @@ not ok 53 - describe async throw fails not ok 2 - timed out callback test --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/describe_it.js:(LINE):3' failureType: 'testTimeoutFailure' error: 'test timed out after 5ms' @@ -595,11 +654,13 @@ not ok 53 - describe async throw fails ok 3 - large timeout async test is ok --- duration_ms: * + type: 'test' ... # Subtest: large timeout callback test is ok ok 4 - large timeout callback test is ok --- duration_ms: * + type: 'test' ... 1..4 not ok 54 - timeouts @@ -616,11 +677,13 @@ not ok 54 - timeouts ok 1 - successful thenable --- duration_ms: * + type: 'test' ... # Subtest: rejected thenable not ok 2 - rejected thenable --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/describe_it.js:(LINE):3' failureType: 'testCodeFailure' error: 'custom error' @@ -655,17 +718,20 @@ not ok 56 - rejected thenable ok 1 - it inside describe 1 --- duration_ms: * + type: 'test' ... # Subtest: it inside describe 2 ok 2 - it inside describe 2 --- duration_ms: * + type: 'test' ... # Subtest: inner describe # Subtest: it inside inner describe ok 1 - it inside inner describe --- duration_ms: * + type: 'test' ... 1..1 ok 3 - inner describe @@ -683,6 +749,7 @@ ok 57 - async describe function not ok 58 - invalid subtest fail --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/describe_it.js:(LINE):5' failureType: 'parentAlreadyFinished' error: 'test could not be started because its parent finished' diff --git a/test/fixtures/test-runner/output/describe_nested.snapshot b/test/fixtures/test-runner/output/describe_nested.snapshot index fe96d2a9560b7b..4a59973b16fee6 100644 --- a/test/fixtures/test-runner/output/describe_nested.snapshot +++ b/test/fixtures/test-runner/output/describe_nested.snapshot @@ -5,6 +5,7 @@ TAP version 13 ok 1 - nested --- duration_ms: * + type: 'test' ... 1..1 ok 1 - nested diff --git a/test/fixtures/test-runner/output/eval_tap.snapshot b/test/fixtures/test-runner/output/eval_tap.snapshot index 4f67b5d7d04863..50457b013633f4 100644 --- a/test/fixtures/test-runner/output/eval_tap.snapshot +++ b/test/fixtures/test-runner/output/eval_tap.snapshot @@ -3,11 +3,13 @@ TAP version 13 ok 1 - passes --- duration_ms: * + type: 'test' ... # Subtest: fails not ok 2 - fails --- duration_ms: * + type: 'test' failureType: 'testCodeFailure' error: 'fail' code: 'ERR_TEST_FAILURE' diff --git a/test/fixtures/test-runner/output/filtered-suite-delayed-build.snapshot b/test/fixtures/test-runner/output/filtered-suite-delayed-build.snapshot index dbe3048dffdf12..f9ac5db199e5fd 100644 --- a/test/fixtures/test-runner/output/filtered-suite-delayed-build.snapshot +++ b/test/fixtures/test-runner/output/filtered-suite-delayed-build.snapshot @@ -4,6 +4,7 @@ TAP version 13 ok 1 - enabled 1 --- duration_ms: * + type: 'test' ... 1..1 ok 1 - async suite @@ -16,6 +17,7 @@ ok 1 - async suite ok 1 - enabled 2 --- duration_ms: * + type: 'test' ... 1..1 ok 2 - sync suite diff --git a/test/fixtures/test-runner/output/filtered-suite-order.snapshot b/test/fixtures/test-runner/output/filtered-suite-order.snapshot index 7a18df8c7d0aea..035a25b085b9a5 100644 --- a/test/fixtures/test-runner/output/filtered-suite-order.snapshot +++ b/test/fixtures/test-runner/output/filtered-suite-order.snapshot @@ -20,12 +20,14 @@ TAP version 13 ok 1 - A --- duration_ms: * + type: 'test' ... # Subtest: C # Subtest: A ok 1 - A --- duration_ms: * + type: 'test' ... 1..1 ok 2 - C @@ -38,6 +40,7 @@ TAP version 13 ok 1 - A --- duration_ms: * + type: 'test' ... 1..1 ok 3 - D @@ -56,17 +59,20 @@ ok 1 - A ok 1 - A --- duration_ms: * + type: 'test' ... # Subtest: B ok 2 - B --- duration_ms: * + type: 'test' ... # Subtest: C # Subtest: A ok 1 - A --- duration_ms: * + type: 'test' ... 1..1 ok 3 - C @@ -85,17 +91,20 @@ ok 2 - B ok 1 - A --- duration_ms: * + type: 'test' ... # Subtest: C # Subtest: A ok 1 - A --- duration_ms: * + type: 'test' ... # Subtest: B ok 2 - B --- duration_ms: * + type: 'test' ... 1..2 ok 2 - C @@ -108,6 +117,7 @@ ok 2 - B ok 1 - B --- duration_ms: * + type: 'test' ... 1..1 ok 3 - D @@ -126,6 +136,7 @@ ok 3 - C ok 1 - B --- duration_ms: * + type: 'test' ... 1..1 ok 4 - D @@ -138,11 +149,13 @@ ok 4 - D ok 1 - A --- duration_ms: * + type: 'test' ... # Subtest: B ok 2 - B --- duration_ms: * + type: 'test' ... 1..2 ok 5 - E @@ -154,6 +167,7 @@ ok 5 - E ok 6 - F --- duration_ms: * + type: 'test' ... 1..6 # tests 14 diff --git a/test/fixtures/test-runner/output/filtered-suite-throws.snapshot b/test/fixtures/test-runner/output/filtered-suite-throws.snapshot index 6242e345891c42..8befa83c004c28 100644 --- a/test/fixtures/test-runner/output/filtered-suite-throws.snapshot +++ b/test/fixtures/test-runner/output/filtered-suite-throws.snapshot @@ -25,6 +25,7 @@ not ok 1 - suite 1 not ok 1 - enabled - should get cancelled --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/filtered-suite-throws.js:(LINE):3' failureType: 'cancelledByParent' error: 'test did not finish before its parent and was cancelled' diff --git a/test/fixtures/test-runner/output/global_after_should_fail_the_test.snapshot b/test/fixtures/test-runner/output/global_after_should_fail_the_test.snapshot index 3196f377b3d4bf..7d4e5923f75740 100644 --- a/test/fixtures/test-runner/output/global_after_should_fail_the_test.snapshot +++ b/test/fixtures/test-runner/output/global_after_should_fail_the_test.snapshot @@ -4,6 +4,7 @@ TAP version 13 ok 1 - this is a test --- duration_ms: * + type: 'test' ... not ok 2 - /test/fixtures/test-runner/output/global_after_should_fail_the_test.js --- @@ -21,7 +22,6 @@ not ok 2 - /test/fixtures/test-runner/output/global_after_should_fail_the_test.j * * * - * ... 1..1 # tests 1 diff --git a/test/fixtures/test-runner/output/hooks-with-no-global-test.snapshot b/test/fixtures/test-runner/output/hooks-with-no-global-test.snapshot index 722a3a4ca2ceac..152501d9c0054c 100644 --- a/test/fixtures/test-runner/output/hooks-with-no-global-test.snapshot +++ b/test/fixtures/test-runner/output/hooks-with-no-global-test.snapshot @@ -4,22 +4,26 @@ TAP version 13 ok 1 - 1 --- duration_ms: * + type: 'test' ... # Subtest: 2 ok 2 - 2 --- duration_ms: * + type: 'test' ... # Subtest: nested # Subtest: nested 1 ok 1 - nested 1 --- duration_ms: * + type: 'test' ... # Subtest: nested 2 ok 2 - nested 2 --- duration_ms: * + type: 'test' ... 1..2 ok 3 - nested diff --git a/test/fixtures/test-runner/output/hooks.snapshot b/test/fixtures/test-runner/output/hooks.snapshot index 6b9d6d26a90e39..4ba957d539ce70 100644 --- a/test/fixtures/test-runner/output/hooks.snapshot +++ b/test/fixtures/test-runner/output/hooks.snapshot @@ -5,22 +5,26 @@ TAP version 13 ok 1 - 1 --- duration_ms: * + type: 'test' ... # Subtest: 2 ok 2 - 2 --- duration_ms: * + type: 'test' ... # Subtest: nested # Subtest: nested 1 ok 1 - nested 1 --- duration_ms: * + type: 'test' ... # Subtest: nested 2 ok 2 - nested 2 --- duration_ms: * + type: 'test' ... 1..2 ok 3 - nested @@ -45,6 +49,7 @@ ok 2 - describe hooks - no subtests not ok 1 - 1 --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/hooks.js:(LINE):3' failureType: 'cancelledByParent' error: 'test did not finish before its parent and was cancelled' @@ -54,6 +59,7 @@ ok 2 - describe hooks - no subtests not ok 2 - 2 --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/hooks.js:(LINE):3' failureType: 'cancelledByParent' error: 'test did not finish before its parent and was cancelled' @@ -77,7 +83,6 @@ not ok 3 - before throws * * * - * ... # Subtest: before throws - no subtests not ok 4 - before throws - no subtests @@ -97,18 +102,19 @@ not ok 4 - before throws - no subtests * * * - * ... # Subtest: after throws # Subtest: 1 ok 1 - 1 --- duration_ms: * + type: 'test' ... # Subtest: 2 ok 2 - 2 --- duration_ms: * + type: 'test' ... 1..2 not ok 5 - after throws @@ -129,6 +135,7 @@ not ok 5 - after throws * * * + * ... # Subtest: after throws - no subtests not ok 6 - after throws - no subtests @@ -149,12 +156,14 @@ not ok 6 - after throws - no subtests * * * + * ... # Subtest: beforeEach throws # Subtest: 1 not ok 1 - 1 --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/hooks.js:(LINE):3' failureType: 'hookFailed' error: 'beforeEach' @@ -167,14 +176,15 @@ not ok 6 - after throws - no subtests * * * - async Promise.all (index 0) * * + new Promise () ... # Subtest: 2 not ok 2 - 2 --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/hooks.js:(LINE):3' failureType: 'hookFailed' error: 'beforeEach' @@ -188,6 +198,8 @@ not ok 6 - after throws - no subtests * * * + * + async Promise.all (index 0) ... 1..2 not ok 7 - beforeEach throws @@ -204,6 +216,7 @@ not ok 7 - beforeEach throws not ok 1 - 1 --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/hooks.js:(LINE):3' failureType: 'hookFailed' error: 'afterEach' @@ -224,6 +237,7 @@ not ok 7 - beforeEach throws not ok 2 - 2 --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/hooks.js:(LINE):3' failureType: 'hookFailed' error: 'afterEach' @@ -254,6 +268,7 @@ not ok 8 - afterEach throws not ok 1 - 1 --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/hooks.js:(LINE):3' failureType: 'testCodeFailure' error: 'test' @@ -274,6 +289,7 @@ not ok 8 - afterEach throws ok 2 - 2 --- duration_ms: * + type: 'test' ... 1..2 not ok 9 - afterEach when test fails @@ -290,6 +306,7 @@ not ok 9 - afterEach when test fails not ok 1 - 1 --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/hooks.js:(LINE):3' failureType: 'testCodeFailure' error: 'test' @@ -310,6 +327,7 @@ not ok 9 - afterEach when test fails not ok 2 - 2 --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/hooks.js:(LINE):3' failureType: 'hookFailed' error: 'afterEach' @@ -340,43 +358,51 @@ not ok 10 - afterEach throws and test fails ok 1 - 1 --- duration_ms: * + type: 'test' ... # Subtest: 2 ok 2 - 2 --- duration_ms: * + type: 'test' ... # Subtest: nested # Subtest: nested 1 ok 1 - nested 1 --- duration_ms: * + type: 'test' ... # Subtest: nested 2 ok 2 - nested 2 --- duration_ms: * + type: 'test' ... 1..2 ok 3 - nested --- duration_ms: * + type: 'test' ... 1..3 ok 11 - test hooks --- duration_ms: * + type: 'test' ... # Subtest: test hooks - no subtests ok 12 - test hooks - no subtests --- duration_ms: * + type: 'test' ... # Subtest: t.before throws # Subtest: 1 not ok 1 - 1 --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/hooks.js:(LINE):11' failureType: 'hookFailed' error: 'before' @@ -397,6 +423,7 @@ ok 12 - test hooks - no subtests not ok 2 - 2 --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/hooks.js:(LINE):11' failureType: 'hookFailed' error: 'before' @@ -417,6 +444,7 @@ ok 12 - test hooks - no subtests not ok 13 - t.before throws --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/hooks.js:(LINE):1' failureType: 'testCodeFailure' error: 'before' @@ -437,6 +465,7 @@ not ok 13 - t.before throws not ok 14 - t.before throws - no subtests --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/hooks.js:(LINE):1' failureType: 'testCodeFailure' error: 'before' @@ -458,16 +487,19 @@ not ok 14 - t.before throws - no subtests ok 1 - 1 --- duration_ms: * + type: 'test' ... # Subtest: 2 ok 2 - 2 --- duration_ms: * + type: 'test' ... 1..2 not ok 15 - t.after throws --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/hooks.js:(LINE):1' failureType: 'hookFailed' error: 'after' @@ -482,12 +514,12 @@ not ok 15 - t.after throws * * * - * ... # Subtest: t.after throws - no subtests not ok 16 - t.after throws - no subtests --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/hooks.js:(LINE):1' failureType: 'hookFailed' error: 'after' @@ -502,13 +534,13 @@ not ok 16 - t.after throws - no subtests * * * - * ... # Subtest: t.beforeEach throws # Subtest: 1 not ok 1 - 1 --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/hooks.js:(LINE):11' failureType: 'hookFailed' error: 'beforeEach' @@ -529,6 +561,7 @@ not ok 16 - t.after throws - no subtests not ok 2 - 2 --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/hooks.js:(LINE):11' failureType: 'hookFailed' error: 'beforeEach' @@ -549,6 +582,7 @@ not ok 16 - t.after throws - no subtests not ok 17 - t.beforeEach throws --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/hooks.js:(LINE):1' failureType: 'subtestsFailed' error: '2 subtests failed' @@ -559,6 +593,7 @@ not ok 17 - t.beforeEach throws not ok 1 - 1 --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/hooks.js:(LINE):11' failureType: 'hookFailed' error: 'afterEach' @@ -579,6 +614,7 @@ not ok 17 - t.beforeEach throws not ok 2 - 2 --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/hooks.js:(LINE):11' failureType: 'hookFailed' error: 'afterEach' @@ -599,6 +635,7 @@ not ok 17 - t.beforeEach throws not ok 18 - t.afterEach throws --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/hooks.js:(LINE):1' failureType: 'subtestsFailed' error: '2 subtests failed' @@ -609,6 +646,7 @@ not ok 18 - t.afterEach throws not ok 1 - 1 --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/hooks.js:(LINE):11' failureType: 'testCodeFailure' error: 'test' @@ -628,11 +666,13 @@ not ok 18 - t.afterEach throws ok 2 - 2 --- duration_ms: * + type: 'test' ... 1..2 not ok 19 - afterEach when test fails --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/hooks.js:(LINE):1' failureType: 'subtestsFailed' error: '1 subtest failed' @@ -643,17 +683,20 @@ not ok 19 - afterEach when test fails ok 1 - 1 --- duration_ms: * + type: 'test' ... 1..1 ok 20 - afterEach context when test passes --- duration_ms: * + type: 'test' ... # Subtest: afterEach context when test fails # Subtest: 1 not ok 1 - 1 --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/hooks.js:(LINE):11' failureType: 'testCodeFailure' error: 'test' @@ -668,6 +711,7 @@ ok 20 - afterEach context when test passes not ok 21 - afterEach context when test fails --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/hooks.js:(LINE):1' failureType: 'subtestsFailed' error: '1 subtest failed' @@ -678,6 +722,7 @@ not ok 21 - afterEach context when test fails not ok 1 - 1 --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/hooks.js:(LINE):11' failureType: 'testCodeFailure' error: 'test' @@ -697,6 +742,7 @@ not ok 21 - afterEach context when test fails not ok 2 - 2 --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/hooks.js:(LINE):11' failureType: 'hookFailed' error: 'afterEach' @@ -717,6 +763,7 @@ not ok 21 - afterEach context when test fails not ok 22 - afterEach throws and test fails --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/hooks.js:(LINE):1' failureType: 'subtestsFailed' error: '2 subtests failed' @@ -726,6 +773,7 @@ not ok 22 - afterEach throws and test fails not ok 23 - t.after() is called if test body throws --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/hooks.js:(LINE):1' failureType: 'testCodeFailure' error: 'bye' @@ -742,6 +790,7 @@ not ok 23 - t.after() is called if test body throws not ok 1 - 1 --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/hooks.js:(LINE):3' failureType: 'cancelledByParent' error: 'test did not finish before its parent and was cancelled' @@ -765,23 +814,25 @@ not ok 24 - run after when before throws * * * - * ... # Subtest: test hooks - async # Subtest: 1 ok 1 - 1 --- duration_ms: * + type: 'test' ... # Subtest: 2 ok 2 - 2 --- duration_ms: * + type: 'test' ... 1..2 ok 25 - test hooks - async --- duration_ms: * + type: 'test' ... 1..25 # before 1 called diff --git a/test/fixtures/test-runner/output/hooks_spec_reporter.snapshot b/test/fixtures/test-runner/output/hooks_spec_reporter.snapshot index b5c5ab7d1965e5..ea916c2ee754c4 100644 --- a/test/fixtures/test-runner/output/hooks_spec_reporter.snapshot +++ b/test/fixtures/test-runner/output/hooks_spec_reporter.snapshot @@ -26,7 +26,6 @@ * * * - * before throws - no subtests (*ms) Error: before @@ -38,7 +37,6 @@ * * * - * after throws 1 (*ms) @@ -55,6 +53,7 @@ * * * + * after throws - no subtests (*ms) Error: after @@ -67,6 +66,7 @@ * * * + * beforeEach throws 1 (*ms) @@ -78,9 +78,9 @@ * * * - at async Promise.all (index 0) * * + at new Promise () 2 (*ms) Error: beforeEach @@ -92,6 +92,8 @@ * * * + * + at async Promise.all (index 0) beforeEach throws (*ms) afterEach throws @@ -242,7 +244,6 @@ * * * - * t.after throws - no subtests (*ms) Error: after @@ -255,7 +256,6 @@ * * * - * t.beforeEach throws 1 (*ms) @@ -390,7 +390,6 @@ * * * - * test hooks - async 1 (*ms) @@ -430,7 +429,6 @@ * * * - * * before throws - no subtests (*ms) @@ -443,7 +441,6 @@ * * * - * * after throws (*ms) @@ -457,6 +454,7 @@ * * * + * * after throws - no subtests (*ms) @@ -470,6 +468,7 @@ * * * + * * 1 (*ms) @@ -481,9 +480,9 @@ * * * - at async Promise.all (index 0) * * + at new Promise () * 2 (*ms) @@ -496,6 +495,8 @@ * * * + * + at async Promise.all (index 0) * 1 (*ms) @@ -633,7 +634,6 @@ * * * - * * t.after throws - no subtests (*ms) @@ -647,7 +647,6 @@ * * * - * * 1 (*ms) @@ -776,4 +775,3 @@ * * * - * diff --git a/test/fixtures/test-runner/output/lcov_reporter.js b/test/fixtures/test-runner/output/lcov_reporter.js index a6d17432d18c23..9c6709c3933761 100644 --- a/test/fixtures/test-runner/output/lcov_reporter.js +++ b/test/fixtures/test-runner/output/lcov_reporter.js @@ -4,4 +4,13 @@ const fixtures = require('../../../common/fixtures'); const spawn = require('node:child_process').spawn; spawn(process.execPath, - ['--no-warnings', '--experimental-test-coverage', '--test-reporter', 'lcov', fixtures.path('test-runner/output/output.js')], { stdio: 'inherit' }); + [ + '--no-warnings', + '--experimental-test-coverage', + '--test-coverage-exclude=!test/**', + '--test-reporter', + 'lcov', + fixtures.path('test-runner/output/output.js') + ], + { stdio: 'inherit' } +); diff --git a/test/fixtures/test-runner/output/name_and_skip_patterns.snapshot b/test/fixtures/test-runner/output/name_and_skip_patterns.snapshot index d5fd874fb4bf39..d6e7e36e5a8efa 100644 --- a/test/fixtures/test-runner/output/name_and_skip_patterns.snapshot +++ b/test/fixtures/test-runner/output/name_and_skip_patterns.snapshot @@ -3,6 +3,7 @@ TAP version 13 ok 1 - enabled --- duration_ms: * + type: 'test' ... 1..1 # tests 1 diff --git a/test/fixtures/test-runner/output/name_pattern.snapshot b/test/fixtures/test-runner/output/name_pattern.snapshot index 0b13848bf4450b..e965b470730488 100644 --- a/test/fixtures/test-runner/output/name_pattern.snapshot +++ b/test/fixtures/test-runner/output/name_pattern.snapshot @@ -3,16 +3,19 @@ TAP version 13 ok 1 - top level skipped test enabled # SKIP --- duration_ms: * + type: 'test' ... # Subtest: top level it enabled ok 2 - top level it enabled --- duration_ms: * + type: 'test' ... # Subtest: top level skipped it enabled ok 3 - top level skipped it enabled # SKIP --- duration_ms: * + type: 'test' ... # Subtest: top level skipped describe enabled ok 4 - top level skipped describe enabled # SKIP @@ -24,28 +27,33 @@ ok 4 - top level skipped describe enabled # SKIP ok 5 - top level runs because name includes PaTtErN --- duration_ms: * + type: 'test' ... # Subtest: top level test enabled # Subtest: nested test runs because name includes PATTERN ok 1 - nested test runs because name includes PATTERN --- duration_ms: * + type: 'test' ... 1..1 ok 6 - top level test enabled --- duration_ms: * + type: 'test' ... # Subtest: top level describe enabled # Subtest: nested it not disabled ok 1 - nested it not disabled --- duration_ms: * + type: 'test' ... # Subtest: nested it enabled ok 2 - nested it enabled --- duration_ms: * + type: 'test' ... # Subtest: nested describe not disabled ok 3 - nested describe not disabled @@ -58,6 +66,7 @@ ok 6 - top level test enabled ok 1 - is enabled --- duration_ms: * + type: 'test' ... 1..1 ok 4 - nested describe enabled @@ -76,22 +85,26 @@ ok 7 - top level describe enabled ok 1 - no --- duration_ms: * + type: 'test' ... # Subtest: yes ok 2 - yes --- duration_ms: * + type: 'test' ... # Subtest: maybe # Subtest: no ok 1 - no --- duration_ms: * + type: 'test' ... # Subtest: yes ok 2 - yes --- duration_ms: * + type: 'test' ... 1..2 ok 3 - maybe @@ -110,12 +123,14 @@ ok 8 - yes ok 1 - yes --- duration_ms: * + type: 'test' ... # Subtest: maybe # Subtest: yes ok 1 - yes --- duration_ms: * + type: 'test' ... 1..1 ok 2 - maybe @@ -134,12 +149,14 @@ ok 9 - no ok 1 - yes --- duration_ms: * + type: 'test' ... # Subtest: maybe # Subtest: yes ok 1 - yes --- duration_ms: * + type: 'test' ... 1..1 ok 2 - maybe @@ -159,6 +176,7 @@ ok 10 - no with todo # TODO ok 1 - NestedTest --- duration_ms: * + type: 'test' ... 1..1 ok 1 - NestedDescribeForMatchWithAncestors diff --git a/test/fixtures/test-runner/output/name_pattern_with_only.snapshot b/test/fixtures/test-runner/output/name_pattern_with_only.snapshot index 64a390dec4c257..f6df9e421c0ff1 100644 --- a/test/fixtures/test-runner/output/name_pattern_with_only.snapshot +++ b/test/fixtures/test-runner/output/name_pattern_with_only.snapshot @@ -4,16 +4,19 @@ TAP version 13 ok 1 - enabled --- duration_ms: * + type: 'test' ... # Subtest: disabled but parent not ok 2 - disabled but parent not --- duration_ms: * + type: 'test' ... 1..2 ok 1 - enabled and only --- duration_ms: * + type: 'test' ... 1..1 # tests 3 diff --git a/test/fixtures/test-runner/output/no_refs.snapshot b/test/fixtures/test-runner/output/no_refs.snapshot index 5756f5ebf87a0a..310094947f9f96 100644 --- a/test/fixtures/test-runner/output/no_refs.snapshot +++ b/test/fixtures/test-runner/output/no_refs.snapshot @@ -4,6 +4,7 @@ TAP version 13 not ok 1 - +does not keep event loop alive --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/no_refs.js:(LINE):11' failureType: 'cancelledByParent' error: 'Promise resolution is still pending but the event loop has already resolved' @@ -15,6 +16,7 @@ TAP version 13 not ok 1 - does not keep event loop alive --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/no_refs.js:(LINE):1' failureType: 'cancelledByParent' error: 'Promise resolution is still pending but the event loop has already resolved' diff --git a/test/fixtures/test-runner/output/only_tests.snapshot b/test/fixtures/test-runner/output/only_tests.snapshot index 25e2e9b65cdca2..b7f9ea71702aef 100644 --- a/test/fixtures/test-runner/output/only_tests.snapshot +++ b/test/fixtures/test-runner/output/only_tests.snapshot @@ -3,59 +3,70 @@ TAP version 13 ok 1 - only = true, skip = string # SKIP skip message --- duration_ms: * + type: 'test' ... # Subtest: only = true, skip = true ok 2 - only = true, skip = true # SKIP --- duration_ms: * + type: 'test' ... # Subtest: only = true, with subtests # Subtest: running subtest 1 ok 1 - running subtest 1 --- duration_ms: * + type: 'test' ... # Subtest: running subtest 2 ok 2 - running subtest 2 --- duration_ms: * + type: 'test' ... # Subtest: running subtest 3 ok 3 - running subtest 3 --- duration_ms: * + type: 'test' ... # Subtest: running subtest 4 # Subtest: running sub-subtest 1 ok 1 - running sub-subtest 1 --- duration_ms: * + type: 'test' ... # Subtest: running sub-subtest 2 ok 2 - running sub-subtest 2 --- duration_ms: * + type: 'test' ... 1..2 ok 4 - running subtest 4 --- duration_ms: * + type: 'test' ... # Subtest: skipped subtest 4 ok 5 - skipped subtest 4 # SKIP --- duration_ms: * + type: 'test' ... 1..5 ok 3 - only = true, with subtests --- duration_ms: * + type: 'test' ... # Subtest: describe only = true, with subtests # Subtest: `it` subtest 1 should run ok 1 - `it` subtest 1 should run --- duration_ms: * + type: 'test' ... 1..1 ok 4 - describe only = true, with subtests @@ -68,31 +79,37 @@ ok 4 - describe only = true, with subtests ok 1 - `it` subtest 1 --- duration_ms: * + type: 'test' ... # Subtest: `it` async subtest 1 ok 2 - `it` async subtest 1 --- duration_ms: * + type: 'test' ... # Subtest: `it` subtest 2 only=true ok 3 - `it` subtest 2 only=true --- duration_ms: * + type: 'test' ... # Subtest: `test` subtest 1 ok 4 - `test` subtest 1 --- duration_ms: * + type: 'test' ... # Subtest: `test` async subtest 1 ok 5 - `test` async subtest 1 --- duration_ms: * + type: 'test' ... # Subtest: `test` subtest 2 only=true ok 6 - `test` subtest 2 only=true --- duration_ms: * + type: 'test' ... 1..6 ok 5 - describe only = true, with a mixture of subtests @@ -105,6 +122,7 @@ ok 5 - describe only = true, with a mixture of subtests ok 1 - subtest should run --- duration_ms: * + type: 'test' ... 1..1 ok 6 - describe only = true, with subtests @@ -118,6 +136,7 @@ ok 6 - describe only = true, with subtests ok 1 - nested test should run --- duration_ms: * + type: 'test' ... 1..1 ok 1 - nested describe @@ -136,12 +155,14 @@ ok 7 - describe only = undefined, with nested only subtest ok 1 - async subtest should run --- duration_ms: * + type: 'test' ... # Subtest: nested describe # Subtest: nested test should run ok 1 - nested test should run --- duration_ms: * + type: 'test' ... 1..1 ok 2 - nested describe @@ -160,37 +181,44 @@ ok 8 - describe only = true, with nested subtests ok 1 - running subtest - 1 --- duration_ms: * + type: 'test' ... # Subtest: this subtest is run - 3 # Subtest: this subtest is run - 4 ok 1 - this subtest is run - 4 --- duration_ms: * + type: 'test' ... # Subtest: this subtest is run - 5 ok 2 - this subtest is run - 5 --- duration_ms: * + type: 'test' ... 1..2 ok 2 - this subtest is run - 3 --- duration_ms: * + type: 'test' ... # Subtest: this subtest is now run - 6 ok 3 - this subtest is now run - 6 --- duration_ms: * + type: 'test' ... # Subtest: skipped subtest - 8 ok 4 - skipped subtest - 8 # SKIP --- duration_ms: * + type: 'test' ... 1..4 ok 9 - nested tests with run only --- duration_ms: * + type: 'test' ... 1..9 # tests 28 diff --git a/test/fixtures/test-runner/output/output.snapshot b/test/fixtures/test-runner/output/output.snapshot index 95fa8329dbe5cc..36d9c289fa1615 100644 --- a/test/fixtures/test-runner/output/output.snapshot +++ b/test/fixtures/test-runner/output/output.snapshot @@ -3,16 +3,19 @@ TAP version 13 ok 1 - sync pass todo # TODO --- duration_ms: * + type: 'test' ... # Subtest: sync pass todo with message ok 2 - sync pass todo with message # TODO this is a passing todo --- duration_ms: * + type: 'test' ... # Subtest: sync fail todo not ok 3 - sync fail todo # TODO --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'testCodeFailure' error: 'thrown from sync fail todo' @@ -30,6 +33,7 @@ not ok 3 - sync fail todo # TODO not ok 4 - sync fail todo with message # TODO this is a failing todo --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'testCodeFailure' error: 'thrown from sync fail todo with message' @@ -47,22 +51,26 @@ not ok 4 - sync fail todo with message # TODO this is a failing todo ok 5 - sync skip pass # SKIP --- duration_ms: * + type: 'test' ... # Subtest: sync skip pass with message ok 6 - sync skip pass with message # SKIP this is skipped --- duration_ms: * + type: 'test' ... # Subtest: sync pass ok 7 - sync pass --- duration_ms: * + type: 'test' ... # this test should pass # Subtest: sync throw fail not ok 8 - sync throw fail --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'testCodeFailure' error: 'thrown from sync throw fail' @@ -80,16 +88,19 @@ not ok 8 - sync throw fail ok 9 - async skip pass # SKIP --- duration_ms: * + type: 'test' ... # Subtest: async pass ok 10 - async pass --- duration_ms: * + type: 'test' ... # Subtest: async throw fail not ok 11 - async throw fail --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'testCodeFailure' error: 'thrown from async throw fail' @@ -107,6 +118,7 @@ not ok 11 - async throw fail not ok 12 - async skip fail # SKIP --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'testCodeFailure' error: 'thrown from async throw fail' @@ -124,6 +136,7 @@ not ok 12 - async skip fail # SKIP not ok 13 - async assertion fail --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'testCodeFailure' error: |- @@ -149,11 +162,13 @@ not ok 13 - async assertion fail ok 14 - resolve pass --- duration_ms: * + type: 'test' ... # Subtest: reject fail not ok 15 - reject fail --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'testCodeFailure' error: 'rejected from reject fail' @@ -171,32 +186,38 @@ not ok 15 - reject fail ok 16 - unhandled rejection - passes but warns --- duration_ms: * + type: 'test' ... # Subtest: async unhandled rejection - passes but warns ok 17 - async unhandled rejection - passes but warns --- duration_ms: * + type: 'test' ... # Subtest: immediate throw - passes but warns ok 18 - immediate throw - passes but warns --- duration_ms: * + type: 'test' ... # Subtest: immediate reject - passes but warns ok 19 - immediate reject - passes but warns --- duration_ms: * + type: 'test' ... # Subtest: immediate resolve pass ok 20 - immediate resolve pass --- duration_ms: * + type: 'test' ... # Subtest: subtest sync throw fail # Subtest: +sync throw fail not ok 1 - +sync throw fail --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):11' failureType: 'testCodeFailure' error: 'thrown from subtest sync throw fail' @@ -218,6 +239,7 @@ ok 20 - immediate resolve pass not ok 21 - subtest sync throw fail --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'subtestsFailed' error: '1 subtest failed' @@ -227,6 +249,7 @@ not ok 21 - subtest sync throw fail not ok 22 - sync throw non-error fail --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'testCodeFailure' error: 'Symbol(thrown symbol from sync throw non-error fail)' @@ -237,32 +260,38 @@ not ok 22 - sync throw non-error fail ok 1 - level 1a --- duration_ms: * + type: 'test' ... # Subtest: level 1b ok 2 - level 1b --- duration_ms: * + type: 'test' ... # Subtest: level 1c ok 3 - level 1c --- duration_ms: * + type: 'test' ... # Subtest: level 1d ok 4 - level 1d --- duration_ms: * + type: 'test' ... 1..4 ok 23 - level 0a --- duration_ms: * + type: 'test' ... # Subtest: top level # Subtest: +long running not ok 1 - +long running --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):5' failureType: 'cancelledByParent' error: 'test did not finish before its parent and was cancelled' @@ -273,16 +302,19 @@ ok 23 - level 0a ok 1 - ++short running --- duration_ms: * + type: 'test' ... 1..1 ok 2 - +short running --- duration_ms: * + type: 'test' ... 1..2 not ok 24 - top level --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'subtestsFailed' error: '1 subtest failed' @@ -292,21 +324,25 @@ not ok 24 - top level ok 25 - invalid subtest - pass but subtest fails --- duration_ms: * + type: 'test' ... # Subtest: sync skip option ok 26 - sync skip option # SKIP --- duration_ms: * + type: 'test' ... # Subtest: sync skip option with message ok 27 - sync skip option with message # SKIP this is skipped --- duration_ms: * + type: 'test' ... # Subtest: sync skip option is false fail not ok 28 - sync skip option is false fail --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'testCodeFailure' error: 'this should be executed' @@ -324,51 +360,61 @@ not ok 28 - sync skip option is false fail ok 29 - --- duration_ms: * + type: 'test' ... # Subtest: functionOnly ok 30 - functionOnly --- duration_ms: * + type: 'test' ... # Subtest: ok 31 - --- duration_ms: * + type: 'test' ... # Subtest: test with only a name provided ok 32 - test with only a name provided --- duration_ms: * + type: 'test' ... # Subtest: ok 33 - --- duration_ms: * + type: 'test' ... # Subtest: ok 34 - # SKIP --- duration_ms: * + type: 'test' ... # Subtest: test with a name and options provided ok 35 - test with a name and options provided # SKIP --- duration_ms: * + type: 'test' ... # Subtest: functionAndOptions ok 36 - functionAndOptions # SKIP --- duration_ms: * + type: 'test' ... # Subtest: callback pass ok 37 - callback pass --- duration_ms: * + type: 'test' ... # Subtest: callback fail not ok 38 - callback fail --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'testCodeFailure' error: 'callback failure' @@ -381,21 +427,25 @@ not ok 38 - callback fail ok 39 - sync t is this in test --- duration_ms: * + type: 'test' ... # Subtest: async t is this in test ok 40 - async t is this in test --- duration_ms: * + type: 'test' ... # Subtest: callback t is this in test ok 41 - callback t is this in test --- duration_ms: * + type: 'test' ... # Subtest: callback also returns a Promise not ok 42 - callback also returns a Promise --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'callbackAndPromisePresent' error: 'passed a callback but also returned a Promise' @@ -405,6 +455,7 @@ not ok 42 - callback also returns a Promise not ok 43 - callback throw --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'testCodeFailure' error: 'thrown from callback throw' @@ -422,6 +473,7 @@ not ok 43 - callback throw not ok 44 - callback called twice --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'multipleCallbackInvocations' error: 'callback invoked multiple times' @@ -434,11 +486,13 @@ not ok 44 - callback called twice ok 45 - callback called twice in different ticks --- duration_ms: * + type: 'test' ... # Subtest: callback called twice in future tick not ok 46 - callback called twice in future tick --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'uncaughtException' error: 'callback invoked multiple times' @@ -450,6 +504,7 @@ not ok 46 - callback called twice in future tick not ok 47 - callback async throw --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'uncaughtException' error: 'thrown from callback async throw' @@ -462,32 +517,38 @@ not ok 47 - callback async throw ok 48 - callback async throw after done --- duration_ms: * + type: 'test' ... # Subtest: only is set on subtests but not in only mode # Subtest: running subtest 1 ok 1 - running subtest 1 --- duration_ms: * + type: 'test' ... # Subtest: running subtest 3 ok 2 - running subtest 3 --- duration_ms: * + type: 'test' ... # Subtest: running subtest 4 ok 3 - running subtest 4 --- duration_ms: * + type: 'test' ... 1..3 ok 49 - only is set on subtests but not in only mode --- duration_ms: * + type: 'test' ... # Subtest: custom inspect symbol fail not ok 50 - custom inspect symbol fail --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'testCodeFailure' error: 'customized' @@ -497,6 +558,7 @@ not ok 50 - custom inspect symbol fail not ok 51 - custom inspect symbol that throws fail --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'testCodeFailure' error: |- @@ -511,6 +573,7 @@ not ok 51 - custom inspect symbol that throws fail not ok 1 - sync throw fails at first --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):11' failureType: 'testCodeFailure' error: 'thrown from subtest sync throw fails at first' @@ -531,6 +594,7 @@ not ok 51 - custom inspect symbol that throws fail not ok 2 - sync throw fails at second --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):11' failureType: 'testCodeFailure' error: 'thrown from subtest sync throw fails at second' @@ -549,6 +613,7 @@ not ok 51 - custom inspect symbol that throws fail not ok 52 - subtest sync throw fails --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'subtestsFailed' error: '2 subtests failed' @@ -558,6 +623,7 @@ not ok 52 - subtest sync throw fails not ok 53 - timed out async test --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'testTimeoutFailure' error: 'test timed out after 5ms' @@ -567,6 +633,7 @@ not ok 53 - timed out async test not ok 54 - timed out callback test --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'testTimeoutFailure' error: 'test timed out after 5ms' @@ -576,21 +643,25 @@ not ok 54 - timed out callback test ok 55 - large timeout async test is ok --- duration_ms: * + type: 'test' ... # Subtest: large timeout callback test is ok ok 56 - large timeout callback test is ok --- duration_ms: * + type: 'test' ... # Subtest: successful thenable ok 57 - successful thenable --- duration_ms: * + type: 'test' ... # Subtest: rejected thenable not ok 58 - rejected thenable --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'testCodeFailure' error: 'custom error' @@ -600,6 +671,7 @@ not ok 58 - rejected thenable not ok 59 - unfinished test with uncaughtException --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'uncaughtException' error: 'foo' @@ -613,6 +685,7 @@ not ok 59 - unfinished test with uncaughtException not ok 60 - unfinished test with unhandledRejection --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'unhandledRejection' error: 'bar' @@ -626,6 +699,7 @@ not ok 60 - unfinished test with unhandledRejection not ok 61 - assertion errors display actual and expected properly --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'testCodeFailure' error: |- @@ -695,6 +769,7 @@ not ok 61 - assertion errors display actual and expected properly not ok 62 - invalid subtest fail --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):7' failureType: 'parentAlreadyFinished' error: 'test could not be started because its parent finished' diff --git a/test/fixtures/test-runner/output/output_cli.snapshot b/test/fixtures/test-runner/output/output_cli.snapshot index c3ead36caecf3f..4546269836e9ca 100644 --- a/test/fixtures/test-runner/output/output_cli.snapshot +++ b/test/fixtures/test-runner/output/output_cli.snapshot @@ -3,16 +3,19 @@ TAP version 13 ok 1 - sync pass todo # TODO --- duration_ms: * + type: 'test' ... # Subtest: sync pass todo with message ok 2 - sync pass todo with message # TODO this is a passing todo --- duration_ms: * + type: 'test' ... # Subtest: sync fail todo not ok 3 - sync fail todo # TODO --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'testCodeFailure' error: 'thrown from sync fail todo' @@ -30,6 +33,7 @@ not ok 3 - sync fail todo # TODO not ok 4 - sync fail todo with message # TODO this is a failing todo --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'testCodeFailure' error: 'thrown from sync fail todo with message' @@ -47,22 +51,26 @@ not ok 4 - sync fail todo with message # TODO this is a failing todo ok 5 - sync skip pass # SKIP --- duration_ms: * + type: 'test' ... # Subtest: sync skip pass with message ok 6 - sync skip pass with message # SKIP this is skipped --- duration_ms: * + type: 'test' ... # Subtest: sync pass ok 7 - sync pass --- duration_ms: * + type: 'test' ... # this test should pass # Subtest: sync throw fail not ok 8 - sync throw fail --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'testCodeFailure' error: 'thrown from sync throw fail' @@ -80,16 +88,19 @@ not ok 8 - sync throw fail ok 9 - async skip pass # SKIP --- duration_ms: * + type: 'test' ... # Subtest: async pass ok 10 - async pass --- duration_ms: * + type: 'test' ... # Subtest: async throw fail not ok 11 - async throw fail --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'testCodeFailure' error: 'thrown from async throw fail' @@ -107,6 +118,7 @@ not ok 11 - async throw fail not ok 12 - async skip fail # SKIP --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'testCodeFailure' error: 'thrown from async throw fail' @@ -124,6 +136,7 @@ not ok 12 - async skip fail # SKIP not ok 13 - async assertion fail --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'testCodeFailure' error: |- @@ -149,11 +162,13 @@ not ok 13 - async assertion fail ok 14 - resolve pass --- duration_ms: * + type: 'test' ... # Subtest: reject fail not ok 15 - reject fail --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'testCodeFailure' error: 'rejected from reject fail' @@ -171,32 +186,38 @@ not ok 15 - reject fail ok 16 - unhandled rejection - passes but warns --- duration_ms: * + type: 'test' ... # Subtest: async unhandled rejection - passes but warns ok 17 - async unhandled rejection - passes but warns --- duration_ms: * + type: 'test' ... # Subtest: immediate throw - passes but warns ok 18 - immediate throw - passes but warns --- duration_ms: * + type: 'test' ... # Subtest: immediate reject - passes but warns ok 19 - immediate reject - passes but warns --- duration_ms: * + type: 'test' ... # Subtest: immediate resolve pass ok 20 - immediate resolve pass --- duration_ms: * + type: 'test' ... # Subtest: subtest sync throw fail # Subtest: +sync throw fail not ok 1 - +sync throw fail --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):11' failureType: 'testCodeFailure' error: 'thrown from subtest sync throw fail' @@ -218,6 +239,7 @@ ok 20 - immediate resolve pass not ok 21 - subtest sync throw fail --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'subtestsFailed' error: '1 subtest failed' @@ -227,6 +249,7 @@ not ok 21 - subtest sync throw fail not ok 22 - sync throw non-error fail --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'testCodeFailure' error: 'Symbol(thrown symbol from sync throw non-error fail)' @@ -237,32 +260,38 @@ not ok 22 - sync throw non-error fail ok 1 - level 1a --- duration_ms: * + type: 'test' ... # Subtest: level 1b ok 2 - level 1b --- duration_ms: * + type: 'test' ... # Subtest: level 1c ok 3 - level 1c --- duration_ms: * + type: 'test' ... # Subtest: level 1d ok 4 - level 1d --- duration_ms: * + type: 'test' ... 1..4 ok 23 - level 0a --- duration_ms: * + type: 'test' ... # Subtest: top level # Subtest: +long running not ok 1 - +long running --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):5' failureType: 'cancelledByParent' error: 'test did not finish before its parent and was cancelled' @@ -273,16 +302,19 @@ ok 23 - level 0a ok 1 - ++short running --- duration_ms: * + type: 'test' ... 1..1 ok 2 - +short running --- duration_ms: * + type: 'test' ... 1..2 not ok 24 - top level --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'subtestsFailed' error: '1 subtest failed' @@ -292,21 +324,25 @@ not ok 24 - top level ok 25 - invalid subtest - pass but subtest fails --- duration_ms: * + type: 'test' ... # Subtest: sync skip option ok 26 - sync skip option # SKIP --- duration_ms: * + type: 'test' ... # Subtest: sync skip option with message ok 27 - sync skip option with message # SKIP this is skipped --- duration_ms: * + type: 'test' ... # Subtest: sync skip option is false fail not ok 28 - sync skip option is false fail --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'testCodeFailure' error: 'this should be executed' @@ -324,51 +360,61 @@ not ok 28 - sync skip option is false fail ok 29 - --- duration_ms: * + type: 'test' ... # Subtest: functionOnly ok 30 - functionOnly --- duration_ms: * + type: 'test' ... # Subtest: ok 31 - --- duration_ms: * + type: 'test' ... # Subtest: test with only a name provided ok 32 - test with only a name provided --- duration_ms: * + type: 'test' ... # Subtest: ok 33 - --- duration_ms: * + type: 'test' ... # Subtest: ok 34 - # SKIP --- duration_ms: * + type: 'test' ... # Subtest: test with a name and options provided ok 35 - test with a name and options provided # SKIP --- duration_ms: * + type: 'test' ... # Subtest: functionAndOptions ok 36 - functionAndOptions # SKIP --- duration_ms: * + type: 'test' ... # Subtest: callback pass ok 37 - callback pass --- duration_ms: * + type: 'test' ... # Subtest: callback fail not ok 38 - callback fail --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'testCodeFailure' error: 'callback failure' @@ -381,21 +427,25 @@ not ok 38 - callback fail ok 39 - sync t is this in test --- duration_ms: * + type: 'test' ... # Subtest: async t is this in test ok 40 - async t is this in test --- duration_ms: * + type: 'test' ... # Subtest: callback t is this in test ok 41 - callback t is this in test --- duration_ms: * + type: 'test' ... # Subtest: callback also returns a Promise not ok 42 - callback also returns a Promise --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'callbackAndPromisePresent' error: 'passed a callback but also returned a Promise' @@ -405,6 +455,7 @@ not ok 42 - callback also returns a Promise not ok 43 - callback throw --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'testCodeFailure' error: 'thrown from callback throw' @@ -422,6 +473,7 @@ not ok 43 - callback throw not ok 44 - callback called twice --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'multipleCallbackInvocations' error: 'callback invoked multiple times' @@ -434,11 +486,13 @@ not ok 44 - callback called twice ok 45 - callback called twice in different ticks --- duration_ms: * + type: 'test' ... # Subtest: callback called twice in future tick not ok 46 - callback called twice in future tick --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'uncaughtException' error: 'callback invoked multiple times' @@ -450,6 +504,7 @@ not ok 46 - callback called twice in future tick not ok 47 - callback async throw --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'uncaughtException' error: 'thrown from callback async throw' @@ -462,39 +517,46 @@ not ok 47 - callback async throw ok 48 - callback async throw after done --- duration_ms: * + type: 'test' ... # Subtest: only is set on subtests but not in only mode # Subtest: running subtest 1 ok 1 - running subtest 1 --- duration_ms: * + type: 'test' ... # Subtest: running subtest 2 ok 2 - running subtest 2 --- duration_ms: * + type: 'test' ... # 'only' and 'runOnly' require the --test-only command-line option. # Subtest: running subtest 3 ok 3 - running subtest 3 --- duration_ms: * + type: 'test' ... # 'only' and 'runOnly' require the --test-only command-line option. # Subtest: running subtest 4 ok 4 - running subtest 4 --- duration_ms: * + type: 'test' ... 1..4 ok 49 - only is set on subtests but not in only mode --- duration_ms: * + type: 'test' ... # Subtest: custom inspect symbol fail not ok 50 - custom inspect symbol fail --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'testCodeFailure' error: 'customized' @@ -504,6 +566,7 @@ not ok 50 - custom inspect symbol fail not ok 51 - custom inspect symbol that throws fail --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'testCodeFailure' error: |- @@ -518,6 +581,7 @@ not ok 51 - custom inspect symbol that throws fail not ok 1 - sync throw fails at first --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):11' failureType: 'testCodeFailure' error: 'thrown from subtest sync throw fails at first' @@ -538,6 +602,7 @@ not ok 51 - custom inspect symbol that throws fail not ok 2 - sync throw fails at second --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):11' failureType: 'testCodeFailure' error: 'thrown from subtest sync throw fails at second' @@ -556,6 +621,7 @@ not ok 51 - custom inspect symbol that throws fail not ok 52 - subtest sync throw fails --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'subtestsFailed' error: '2 subtests failed' @@ -565,6 +631,7 @@ not ok 52 - subtest sync throw fails not ok 53 - timed out async test --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'testTimeoutFailure' error: 'test timed out after 5ms' @@ -574,6 +641,7 @@ not ok 53 - timed out async test not ok 54 - timed out callback test --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'testTimeoutFailure' error: 'test timed out after 5ms' @@ -583,21 +651,25 @@ not ok 54 - timed out callback test ok 55 - large timeout async test is ok --- duration_ms: * + type: 'test' ... # Subtest: large timeout callback test is ok ok 56 - large timeout callback test is ok --- duration_ms: * + type: 'test' ... # Subtest: successful thenable ok 57 - successful thenable --- duration_ms: * + type: 'test' ... # Subtest: rejected thenable not ok 58 - rejected thenable --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'testCodeFailure' error: 'custom error' @@ -607,6 +679,7 @@ not ok 58 - rejected thenable not ok 59 - unfinished test with uncaughtException --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'uncaughtException' error: 'foo' @@ -620,6 +693,7 @@ not ok 59 - unfinished test with uncaughtException not ok 60 - unfinished test with unhandledRejection --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'unhandledRejection' error: 'bar' @@ -633,6 +707,7 @@ not ok 60 - unfinished test with unhandledRejection not ok 61 - assertion errors display actual and expected properly --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):1' failureType: 'testCodeFailure' error: |- @@ -702,6 +777,7 @@ not ok 61 - assertion errors display actual and expected properly not ok 62 - invalid subtest fail --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/output.js:(LINE):7' failureType: 'parentAlreadyFinished' error: 'test could not be started because its parent finished' @@ -720,6 +796,7 @@ not ok 62 - invalid subtest fail ok 63 - last test --- duration_ms: * + type: 'test' ... 1..63 # tests 77 diff --git a/test/fixtures/test-runner/output/skip_pattern.snapshot b/test/fixtures/test-runner/output/skip_pattern.snapshot index fd8fcf15a1f0e9..f591c5e4c9a67a 100644 --- a/test/fixtures/test-runner/output/skip_pattern.snapshot +++ b/test/fixtures/test-runner/output/skip_pattern.snapshot @@ -3,16 +3,19 @@ TAP version 13 ok 1 - top level skipped test enabled # SKIP --- duration_ms: * + type: 'test' ... # Subtest: top level it enabled ok 2 - top level it enabled --- duration_ms: * + type: 'test' ... # Subtest: top level skipped it enabled ok 3 - top level skipped it enabled # SKIP --- duration_ms: * + type: 'test' ... # Subtest: top level describe ok 4 - top level describe diff --git a/test/fixtures/test-runner/output/source_mapped_locations.snapshot b/test/fixtures/test-runner/output/source_mapped_locations.snapshot index 24c3ee8d113446..8cf210da817aae 100644 --- a/test/fixtures/test-runner/output/source_mapped_locations.snapshot +++ b/test/fixtures/test-runner/output/source_mapped_locations.snapshot @@ -3,6 +3,7 @@ TAP version 13 not ok 1 - fails --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/source_mapped_locations.ts:5:1' failureType: 'testCodeFailure' error: |- diff --git a/test/fixtures/test-runner/output/tap_escape.snapshot b/test/fixtures/test-runner/output/tap_escape.snapshot index 722cd0ca427ec7..7c6489b88c7132 100644 --- a/test/fixtures/test-runner/output/tap_escape.snapshot +++ b/test/fixtures/test-runner/output/tap_escape.snapshot @@ -3,21 +3,25 @@ TAP version 13 ok 1 - escaped description \\ \# \\\#\\ \\n \\t \\f \\v \\b \\r --- duration_ms: * + type: 'test' ... # Subtest: escaped skip message ok 2 - escaped skip message # SKIP \#skip --- duration_ms: * + type: 'test' ... # Subtest: escaped todo message ok 3 - escaped todo message # TODO \#todo --- duration_ms: * + type: 'test' ... # Subtest: escaped diagnostic ok 4 - escaped diagnostic --- duration_ms: * + type: 'test' ... # \#diagnostic 1..4 diff --git a/test/fixtures/test-runner/output/test-diagnostic-warning-without-test-only-flag.snapshot b/test/fixtures/test-runner/output/test-diagnostic-warning-without-test-only-flag.snapshot index c64caa87a279e8..bb934731e9cc7c 100644 --- a/test/fixtures/test-runner/output/test-diagnostic-warning-without-test-only-flag.snapshot +++ b/test/fixtures/test-runner/output/test-diagnostic-warning-without-test-only-flag.snapshot @@ -4,6 +4,7 @@ TAP version 13 ok 1 - only false in describe --- duration_ms: * + type: 'test' ... 1..1 ok 1 - should NOT print --test-only diagnostic warning - describe-only-false @@ -16,6 +17,7 @@ ok 1 - should NOT print --test-only diagnostic warning - describe-only-false ok 1 - only false in the subtest --- duration_ms: * + type: 'test' ... 1..1 ok 2 - should NOT print --test-only diagnostic warning - it-only-false @@ -28,6 +30,7 @@ ok 2 - should NOT print --test-only diagnostic warning - it-only-false ok 1 - no only --- duration_ms: * + type: 'test' ... 1..1 ok 3 - should NOT print --test-only diagnostic warning - no-only @@ -40,44 +43,52 @@ ok 3 - should NOT print --test-only diagnostic warning - no-only ok 1 - only false in parent test --- duration_ms: * + type: 'test' ... 1..1 ok 4 - should NOT print --test-only diagnostic warning - test-only-false --- duration_ms: * + type: 'test' ... # Subtest: should NOT print --test-only diagnostic warning - t.test-only-false # Subtest: only false in subtest ok 1 - only false in subtest --- duration_ms: * + type: 'test' ... 1..1 ok 5 - should NOT print --test-only diagnostic warning - t.test-only-false --- duration_ms: * + type: 'test' ... # Subtest: should NOT print --test-only diagnostic warning - no-only # Subtest: no only ok 1 - no only --- duration_ms: * + type: 'test' ... 1..1 ok 6 - should NOT print --test-only diagnostic warning - no-only --- duration_ms: * + type: 'test' ... # Subtest: should print --test-only diagnostic warning - test-only-true # Subtest: only true in parent test ok 1 - only true in parent test --- duration_ms: * + type: 'test' ... 1..1 ok 7 - should print --test-only diagnostic warning - test-only-true --- duration_ms: * + type: 'test' ... # 'only' and 'runOnly' require the --test-only command-line option. # Subtest: should print --test-only diagnostic warning - t.test-only-true @@ -85,12 +96,14 @@ ok 7 - should print --test-only diagnostic warning - test-only-true ok 1 - only true in subtest --- duration_ms: * + type: 'test' ... # 'only' and 'runOnly' require the --test-only command-line option. 1..1 ok 8 - should print --test-only diagnostic warning - t.test-only-true --- duration_ms: * + type: 'test' ... # Subtest: should print --test-only diagnostic warning - 2 levels of only # Subtest: only true in parent test @@ -98,17 +111,20 @@ ok 8 - should print --test-only diagnostic warning - t.test-only-true ok 1 - only true in subtest --- duration_ms: * + type: 'test' ... # 'only' and 'runOnly' require the --test-only command-line option. 1..1 ok 1 - only true in parent test --- duration_ms: * + type: 'test' ... 1..1 ok 9 - should print --test-only diagnostic warning - 2 levels of only --- duration_ms: * + type: 'test' ... 1..9 # tests 16 diff --git a/test/fixtures/test-runner/output/test-runner-plan.snapshot b/test/fixtures/test-runner/output/test-runner-plan.snapshot index b172c2da05a884..bbd718663f2438 100644 --- a/test/fixtures/test-runner/output/test-runner-plan.snapshot +++ b/test/fixtures/test-runner/output/test-runner-plan.snapshot @@ -3,11 +3,13 @@ TAP version 13 ok 1 - test planning basic --- duration_ms: * + type: 'test' ... # Subtest: less assertions than planned not ok 2 - less assertions than planned --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/test-runner-plan.js:(LINE):1' failureType: 'testCodeFailure' error: 'plan expected 1 assertions but received 0' @@ -17,6 +19,7 @@ not ok 2 - less assertions than planned not ok 3 - more assertions than planned --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/test-runner-plan.js:(LINE):1' failureType: 'testCodeFailure' error: 'plan expected 1 assertions but received 2' @@ -27,38 +30,45 @@ not ok 3 - more assertions than planned ok 1 - subtest --- duration_ms: * + type: 'test' ... 1..1 ok 4 - subtesting --- duration_ms: * + type: 'test' ... # Subtest: subtesting correctly # Subtest: subtest ok 1 - subtest --- duration_ms: * + type: 'test' ... 1..1 ok 5 - subtesting correctly --- duration_ms: * + type: 'test' ... # Subtest: correctly ignoring subtesting plan # Subtest: subtest ok 1 - subtest --- duration_ms: * + type: 'test' ... 1..1 ok 6 - correctly ignoring subtesting plan --- duration_ms: * + type: 'test' ... # Subtest: failing planning by options not ok 7 - failing planning by options --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/test-runner-plan.js:(LINE):1' failureType: 'testCodeFailure' error: 'plan expected 1 assertions but received 0' @@ -68,22 +78,26 @@ not ok 7 - failing planning by options ok 8 - not failing planning by options --- duration_ms: * + type: 'test' ... # Subtest: subtest planning by options # Subtest: subtest ok 1 - subtest --- duration_ms: * + type: 'test' ... 1..1 ok 9 - subtest planning by options --- duration_ms: * + type: 'test' ... # Subtest: failing more assertions than planned not ok 10 - failing more assertions than planned --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/test-runner-plan.js:(LINE):1' failureType: 'testCodeFailure' error: 'plan expected 2 assertions but received 3' @@ -93,6 +107,7 @@ not ok 10 - failing more assertions than planned ok 11 - planning with streams --- duration_ms: * + type: 'test' ... 1..11 # tests 15 diff --git a/test/fixtures/test-runner/output/timeout_in_before_each_should_not_affect_further_tests.snapshot b/test/fixtures/test-runner/output/timeout_in_before_each_should_not_affect_further_tests.snapshot index b3579da789470b..76dd789a3a008c 100644 --- a/test/fixtures/test-runner/output/timeout_in_before_each_should_not_affect_further_tests.snapshot +++ b/test/fixtures/test-runner/output/timeout_in_before_each_should_not_affect_further_tests.snapshot @@ -9,6 +9,7 @@ gonna timeout not ok 1 - first describe first test --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/timeout_in_before_each_should_not_affect_further_tests.js:(LINE):3' failureType: 'hookFailed' error: 'failed running beforeEach hook' @@ -20,6 +21,7 @@ gonna timeout ok 2 - first describe second test --- duration_ms: * + type: 'test' ... 1..2 not ok 1 - before each timeout @@ -38,6 +40,7 @@ not gonna timeout not ok 1 - second describe first test --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/timeout_in_before_each_should_not_affect_further_tests.js:(LINE):3' failureType: 'hookFailed' error: 'failed running afterEach hook' @@ -49,6 +52,7 @@ not gonna timeout ok 2 - second describe second test --- duration_ms: * + type: 'test' ... 1..2 not ok 2 - after each timeout diff --git a/test/fixtures/test-runner/output/unfinished-suite-async-error.snapshot b/test/fixtures/test-runner/output/unfinished-suite-async-error.snapshot index 593e46d45e779a..1d4df7b3d0514a 100644 --- a/test/fixtures/test-runner/output/unfinished-suite-async-error.snapshot +++ b/test/fixtures/test-runner/output/unfinished-suite-async-error.snapshot @@ -4,6 +4,7 @@ TAP version 13 not ok 1 - uses callback --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/unfinished-suite-async-error.js:(LINE):3' failureType: 'uncaughtException' error: 'callback test does not complete' @@ -16,6 +17,7 @@ TAP version 13 ok 2 - should pass 1 --- duration_ms: * + type: 'test' ... 1..2 not ok 1 - unfinished suite with asynchronous error @@ -31,6 +33,7 @@ not ok 1 - unfinished suite with asynchronous error ok 2 - should pass 2 --- duration_ms: * + type: 'test' ... 1..2 # tests 3 diff --git a/test/fixtures/test-runner/output/unresolved_promise.snapshot b/test/fixtures/test-runner/output/unresolved_promise.snapshot index 0090885468c338..2fc7eb8a1a1d03 100644 --- a/test/fixtures/test-runner/output/unresolved_promise.snapshot +++ b/test/fixtures/test-runner/output/unresolved_promise.snapshot @@ -3,11 +3,13 @@ TAP version 13 ok 1 - pass --- duration_ms: * + type: 'test' ... # Subtest: never resolving promise not ok 2 - never resolving promise --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/unresolved_promise.js:(LINE):1' failureType: 'cancelledByParent' error: 'Promise resolution is still pending but the event loop has already resolved' @@ -19,6 +21,7 @@ not ok 2 - never resolving promise not ok 3 - fail --- duration_ms: * + type: 'test' location: '/test/fixtures/test-runner/output/unresolved_promise.js:(LINE):1' failureType: 'cancelledByParent' error: 'Promise resolution is still pending but the event loop has already resolved' diff --git a/test/fixtures/test426/LICENSE.md b/test/fixtures/test426/LICENSE.md new file mode 100644 index 00000000000000..39501a3b7c70dd --- /dev/null +++ b/test/fixtures/test426/LICENSE.md @@ -0,0 +1,14 @@ +The Source Map Tests suite ("Software") is protected by copyright and is being made available under the "BSD License", included below. This Software may be subject to third party rights (rights from parties other than Ecma International), including patent rights, and no licenses under such third party rights are granted under this license even if the third party concerned is a member of Ecma International. SEE THE ECMA CODE OF CONDUCT IN PATENT MATTERS AVAILABLE AT https://www.ecma-international.org/ipr FOR INFORMATION REGARDING THE LICENSING OF PATENT CLAIMS THAT ARE REQUIRED TO IMPLEMENT ECMA INTERNATIONAL STANDARDS*. + +Copyright (c) 2024, Ecma International +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. + +* Ecma International Standards hereafter means Ecma International Standards as well as Ecma Technical Reports diff --git a/test/fixtures/test426/README.md b/test/fixtures/test426/README.md new file mode 100644 index 00000000000000..e3e353fd500458 --- /dev/null +++ b/test/fixtures/test426/README.md @@ -0,0 +1,55 @@ +# Source Map Tests + +This repository holds testing discussions and tests for the the Source Map debugging format. Specifically, we're looking to encourage discussion around: + +- Manual and automated testing strategies for Source Maps +- Gathering a list of Soure Map generators and consumers +- General discussion around deviations between source maps + +Open discussion happens in the [GitHub issues](https://github.com/source-map/source-map-tests/issues). + +Source Map spec: + * Repo: https://github.com/tc39/source-map + * Rendered spec: https://tc39.es/source-map/ + +## Test cases + +This repo also contains cross-implementation test cases that can be run in test +suites for source map implementations, including browser devtool and library test +suites. + +### Running the tests + +#### Tools + +[Source map validator](https://github.com/jkup/source-map-validator): + * The tests are included in the validator test suite [here](https://github.com/jkup/source-map-validator/blob/main/src/spec-tests.test.ts). You can run them with `npm test`. + +#### Browsers + +The tests for Firefox are in the Mozilla [source-map](https://github.com/mozilla/source-map) library: + * The upstream repo has a [test file](https://github.com/mozilla/source-map/blob/master/test/test-spec-tests.js) for running the spec tests from this repo. They can be run with `npm test`. + +How to run in WebKit: + * Check out [WebKit](https://github.com/WebKit/WebKit/) + * `cd` to the checked out WebKit directory. + * Run `git am /webkit/0001-Add-harness-for-source-maps-spec-tests.patch` + * Run `Tools/Scripts/build-webkit` (depending on the platform you may need to pass `--gtk` or other flags) + * Run `Tools/Scripts/run-webkit-tests LayoutTests/inspector/model/source-map-spec.html` (again, you may need `--gtk` on Linux) + +How to run in Chrome Devtools: +1. Setup: + * Install depot_tools following this [depot_tools guide](https://commondatastorage.googleapis.com/chrome-infra-docs/flat/depot_tools/docs/html/depot_tools_tutorial.html#_setting_up) + * Check out [Chrome Devtools](https://chromium.googlesource.com/devtools/devtools-frontend): + * Run `gclient config https://chromium.googlesource.com/devtools/devtools-frontend --unmanaged` + * Run `cd devtools-frontend` + * Run `gclient sync` + * Run `gn gen out/Default` +2. Build: + * Run `autoninja -C out/Default` +3. Test: + * Run `npm run auto-unittest` +4. Apply patches from this repo: + * Run `git apply ` in `devtools-frontend` repo + +More information about running Chrome Devtools without building Chromium can be found [here](https://chromium.googlesource.com/devtools/devtools-frontend/+/refs/heads/chromium/3965/README.md) diff --git a/test/fixtures/test426/chrome/0001-Add-source-map-specification-tests.patch b/test/fixtures/test426/chrome/0001-Add-source-map-specification-tests.patch new file mode 100644 index 00000000000000..995bcf246c839d --- /dev/null +++ b/test/fixtures/test426/chrome/0001-Add-source-map-specification-tests.patch @@ -0,0 +1,3867 @@ +From afa11641db357e524c8f4d5f573945dd15c1f2e9 Mon Sep 17 00:00:00 2001 +From: Agata Belkius +Date: Fri, 19 Apr 2024 15:30:48 +0100 +Subject: [PATCH 1/2] Add source map specification tests + +--- + front_end/BUILD.gn | 1 + + front_end/core/sdk/BUILD.gn | 1 + + front_end/core/sdk/SourceMapSpec.test.ts | 206 +++ + .../core/sdk/fixtures/sourcemaps/BUILD.gn | 202 +++ + .../sourcemaps/basic-mapping-as-index-map.js | 2 + + .../basic-mapping-as-index-map.js.map | 15 + + .../sourcemaps/basic-mapping-original.js | 8 + + .../sdk/fixtures/sourcemaps/basic-mapping.js | 2 + + .../fixtures/sourcemaps/basic-mapping.js.map | 6 + + .../fixtures/sourcemaps/ignore-list-empty.js | 1 + + .../sourcemaps/ignore-list-empty.js.map | 8 + + .../sourcemaps/ignore-list-out-of-bounds.js | 1 + + .../ignore-list-out-of-bounds.js.map | 8 + + .../sourcemaps/ignore-list-valid-1.js | 1 + + .../sourcemaps/ignore-list-valid-1.js.map | 8 + + .../sourcemaps/ignore-list-wrong-type-1.js | 1 + + .../ignore-list-wrong-type-1.js.map | 8 + + .../sourcemaps/ignore-list-wrong-type-2.js | 1 + + .../ignore-list-wrong-type-2.js.map | 8 + + .../sourcemaps/ignore-list-wrong-type-3.js | 1 + + .../ignore-list-wrong-type-3.js.map | 8 + + .../index-map-invalid-base-mappings.js | 1 + + .../index-map-invalid-base-mappings.js.map | 15 + + .../sourcemaps/index-map-invalid-order.js | 1 + + .../sourcemaps/index-map-invalid-order.js.map | 23 + + .../sourcemaps/index-map-invalid-overlap.js | 1 + + .../index-map-invalid-overlap.js.map | 23 + + .../sourcemaps/index-map-missing-map.js | 1 + + .../sourcemaps/index-map-missing-map.js.map | 8 + + .../index-map-missing-offset-column.js | 1 + + .../index-map-missing-offset-column.js.map | 14 + + .../index-map-missing-offset-line.js | 1 + + .../index-map-missing-offset-line.js.map | 14 + + .../sourcemaps/index-map-missing-offset.js | 1 + + .../index-map-missing-offset.js.map | 13 + + .../index-map-offset-column-wrong-type.js | 1 + + .../index-map-offset-column-wrong-type.js.map | 14 + + .../index-map-offset-line-wrong-type.js | 1 + + .../index-map-offset-line-wrong-type.js.map | 14 + + .../index-map-two-concatenated-sources.js | 2 + + .../index-map-two-concatenated-sources.js.map | 24 + + .../sourcemaps/index-map-wrong-type-map.js | 1 + + .../index-map-wrong-type-map.js.map | 9 + + .../sourcemaps/index-map-wrong-type-offset.js | 1 + + .../index-map-wrong-type-offset.js.map | 14 + + .../index-map-wrong-type-sections.js | 1 + + .../index-map-wrong-type-sections.js.map | 4 + + .../invalid-mapping-bad-separator.js | 2 + + .../invalid-mapping-bad-separator.js.map | 6 + + .../invalid-mapping-not-a-string-1.js | 1 + + .../invalid-mapping-not-a-string-1.js.map | 7 + + .../invalid-mapping-not-a-string-2.js | 1 + + .../invalid-mapping-not-a-string-2.js.map | 7 + + ...nvalid-mapping-segment-column-too-large.js | 1 + + ...id-mapping-segment-column-too-large.js.map | 7 + + ...apping-segment-name-index-out-of-bounds.js | 1 + + ...ng-segment-name-index-out-of-bounds.js.map | 7 + + ...id-mapping-segment-name-index-too-large.js | 1 + + ...apping-segment-name-index-too-large.js.map | 7 + + ...invalid-mapping-segment-negative-column.js | 1 + + ...lid-mapping-segment-negative-column.js.map | 7 + + ...lid-mapping-segment-negative-name-index.js | 1 + + ...mapping-segment-negative-name-index.js.map | 7 + + ...apping-segment-negative-original-column.js | 1 + + ...ng-segment-negative-original-column.js.map | 7 + + ...-mapping-segment-negative-original-line.js | 1 + + ...ping-segment-negative-original-line.js.map | 7 + + ...apping-segment-negative-relative-column.js | 1 + + ...ng-segment-negative-relative-column.js.map | 8 + + ...ng-segment-negative-relative-name-index.js | 1 + + ...egment-negative-relative-name-index.js.map | 8 + + ...gment-negative-relative-original-column.js | 1 + + ...t-negative-relative-original-column.js.map | 8 + + ...segment-negative-relative-original-line.js | 1 + + ...ent-negative-relative-original-line.js.map | 8 + + ...-segment-negative-relative-source-index.js | 1 + + ...ment-negative-relative-source-index.js.map | 8 + + ...d-mapping-segment-negative-source-index.js | 1 + + ...pping-segment-negative-source-index.js.map | 7 + + ...pping-segment-original-column-too-large.js | 1 + + ...g-segment-original-column-too-large.js.map | 7 + + ...mapping-segment-original-line-too-large.js | 1 + + ...ing-segment-original-line-too-large.js.map | 7 + + ...ping-segment-source-index-out-of-bounds.js | 1 + + ...-segment-source-index-out-of-bounds.js.map | 7 + + ...-mapping-segment-source-index-too-large.js | 1 + + ...ping-segment-source-index-too-large.js.map | 7 + + ...valid-mapping-segment-with-three-fields.js | 2 + + ...d-mapping-segment-with-three-fields.js.map | 6 + + ...invalid-mapping-segment-with-two-fields.js | 2 + + ...lid-mapping-segment-with-two-fields.js.map | 6 + + ...nvalid-mapping-segment-with-zero-fields.js | 1 + + ...id-mapping-segment-with-zero-fields.js.map | 7 + + .../invalid-vlq-missing-continuation.js | 1 + + .../invalid-vlq-missing-continuation.js.map | 6 + + .../sourcemaps/invalid-vlq-non-base64-char.js | 1 + + .../invalid-vlq-non-base64-char.js.map | 6 + + .../sdk/fixtures/sourcemaps/names-missing.js | 1 + + .../fixtures/sourcemaps/names-missing.js.map | 5 + + .../fixtures/sourcemaps/names-not-a-list-1.js | 1 + + .../sourcemaps/names-not-a-list-1.js.map | 6 + + .../fixtures/sourcemaps/names-not-a-list-2.js | 1 + + .../sourcemaps/names-not-a-list-2.js.map | 6 + + .../fixtures/sourcemaps/names-not-string.js | 1 + + .../sourcemaps/names-not-string.js.map | 6 + + .../sourcemaps/second-source-original.js | 4 + + .../sourcemaps/source-map-spec-tests.json | 1540 +++++++++++++++++ + .../sources-and-sources-content-both-null.js | 1 + + ...urces-and-sources-content-both-null.js.map | 7 + + .../fixtures/sourcemaps/sources-missing.js | 1 + + .../sourcemaps/sources-missing.js.map | 5 + + .../sources-non-null-sources-content-null.js | 2 + + ...urces-non-null-sources-content-null.js.map | 7 + + .../sourcemaps/sources-not-a-list-1.js | 1 + + .../sourcemaps/sources-not-a-list-1.js.map | 6 + + .../sourcemaps/sources-not-a-list-2.js | 1 + + .../sourcemaps/sources-not-a-list-2.js.map | 6 + + .../sourcemaps/sources-not-string-or-null.js | 1 + + .../sources-not-string-or-null.js.map | 6 + + .../sources-null-sources-content-non-null.js | 2 + + ...urces-null-sources-content-non-null.js.map | 7 + + .../sourcemaps/transitive-mapping-original.js | 5 + + .../transitive-mapping-original.js.map | 8 + + .../transitive-mapping-three-steps.js | 6 + + .../transitive-mapping-three-steps.js.map | 7 + + .../fixtures/sourcemaps/transitive-mapping.js | 2 + + .../sourcemaps/transitive-mapping.js.map | 6 + + .../sourcemaps/typescript-original.ts | 5 + + .../sourcemaps/unrecognized-property.js | 1 + + .../sourcemaps/unrecognized-property.js.map | 8 + + .../valid-mapping-boundary-values.js | 1 + + .../valid-mapping-boundary-values.js.map | 7 + + .../sourcemaps/valid-mapping-empty-groups.js | 1 + + .../valid-mapping-empty-groups.js.map | 8 + + .../sourcemaps/valid-mapping-large-vlq.js | 1 + + .../sourcemaps/valid-mapping-large-vlq.js.map | 6 + + .../sourcemaps/valid-mapping-null-sources.js | 2 + + .../valid-mapping-null-sources.js.map | 6 + + .../fixtures/sourcemaps/version-missing.js | 1 + + .../sourcemaps/version-missing.js.map | 5 + + .../sourcemaps/version-not-a-number.js | 1 + + .../sourcemaps/version-not-a-number.js.map | 6 + + .../sourcemaps/version-numeric-string.js | 1 + + .../sourcemaps/version-numeric-string.js.map | 6 + + .../fixtures/sourcemaps/version-too-high.js | 1 + + .../sourcemaps/version-too-high.js.map | 6 + + .../fixtures/sourcemaps/version-too-low.js | 1 + + .../sourcemaps/version-too-low.js.map | 6 + + .../sdk/fixtures/sourcemaps/version-valid.js | 1 + + .../fixtures/sourcemaps/version-valid.js.map | 6 + + 150 files changed, 2648 insertions(+) + create mode 100644 front_end/core/sdk/SourceMapSpec.test.ts + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/BUILD.gn + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/basic-mapping-as-index-map.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/basic-mapping-as-index-map.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/basic-mapping-original.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/basic-mapping.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/basic-mapping.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/ignore-list-empty.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/ignore-list-empty.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/ignore-list-out-of-bounds.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/ignore-list-out-of-bounds.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/ignore-list-valid-1.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/ignore-list-valid-1.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-1.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-1.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-2.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-2.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-3.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-3.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-base-mappings.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-base-mappings.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-order.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-order.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-overlap.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-overlap.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-missing-map.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-missing-map.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset-column.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset-column.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset-line.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset-line.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-offset-column-wrong-type.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-offset-column-wrong-type.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-offset-line-wrong-type.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-offset-line-wrong-type.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-two-concatenated-sources.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-two-concatenated-sources.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-map.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-map.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-offset.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-offset.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-sections.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-sections.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-bad-separator.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-bad-separator.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-not-a-string-1.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-not-a-string-1.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-not-a-string-2.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-not-a-string-2.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-column-too-large.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-column-too-large.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-name-index-out-of-bounds.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-name-index-out-of-bounds.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-name-index-too-large.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-name-index-too-large.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-column.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-column.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-name-index.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-name-index.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-original-column.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-original-column.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-original-line.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-original-line.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-column.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-column.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-name-index.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-name-index.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-original-column.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-original-column.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-original-line.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-original-line.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-source-index.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-source-index.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-source-index.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-source-index.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-original-column-too-large.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-original-column-too-large.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-original-line-too-large.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-original-line-too-large.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-source-index-out-of-bounds.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-source-index-out-of-bounds.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-source-index-too-large.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-source-index-too-large.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-three-fields.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-three-fields.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-two-fields.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-two-fields.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-zero-fields.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-zero-fields.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-vlq-missing-continuation.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-vlq-missing-continuation.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-vlq-non-base64-char.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-vlq-non-base64-char.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/names-missing.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/names-missing.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/names-not-a-list-1.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/names-not-a-list-1.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/names-not-a-list-2.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/names-not-a-list-2.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/names-not-string.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/names-not-string.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/second-source-original.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/source-map-spec-tests.json + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/sources-and-sources-content-both-null.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/sources-and-sources-content-both-null.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/sources-missing.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/sources-missing.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/sources-non-null-sources-content-null.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/sources-non-null-sources-content-null.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/sources-not-a-list-1.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/sources-not-a-list-1.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/sources-not-a-list-2.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/sources-not-a-list-2.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/sources-not-string-or-null.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/sources-not-string-or-null.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/sources-null-sources-content-non-null.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/sources-null-sources-content-non-null.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/transitive-mapping-original.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/transitive-mapping-original.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/transitive-mapping-three-steps.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/transitive-mapping-three-steps.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/transitive-mapping.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/transitive-mapping.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/typescript-original.ts + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/unrecognized-property.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/unrecognized-property.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/valid-mapping-boundary-values.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/valid-mapping-boundary-values.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/valid-mapping-empty-groups.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/valid-mapping-empty-groups.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/valid-mapping-large-vlq.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/valid-mapping-large-vlq.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/valid-mapping-null-sources.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/valid-mapping-null-sources.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/version-missing.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/version-missing.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/version-not-a-number.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/version-not-a-number.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/version-numeric-string.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/version-numeric-string.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/version-too-high.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/version-too-high.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/version-too-low.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/version-too-low.js.map + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/version-valid.js + create mode 100644 front_end/core/sdk/fixtures/sourcemaps/version-valid.js.map + +diff --git a/front_end/BUILD.gn b/front_end/BUILD.gn +index 863a434cea..125b34ba73 100644 +--- a/front_end/BUILD.gn ++++ b/front_end/BUILD.gn +@@ -106,6 +106,7 @@ group("unittests") { + "core/protocol_client:unittests", + "core/root:unittests", + "core/sdk:unittests", ++ "core/sdk/fixtures/sourcemaps", + "entrypoints/formatter_worker:unittests", + "entrypoints/heap_snapshot_worker:unittests", + "entrypoints/inspector_main:unittests", +diff --git a/front_end/core/sdk/BUILD.gn b/front_end/core/sdk/BUILD.gn +index 8d1cf0fa92..f8879365f4 100644 +--- a/front_end/core/sdk/BUILD.gn ++++ b/front_end/core/sdk/BUILD.gn +@@ -165,6 +165,7 @@ ts_library("unittests") { + "SourceMapManager.test.ts", + "SourceMapScopes.test.ts", + "SourceMapScopesInfo.test.ts", ++ "SourceMapSpec.test.ts", + "StorageBucketsModel.test.ts", + "StorageKeyManager.test.ts", + "Target.test.ts", +diff --git a/front_end/core/sdk/SourceMapSpec.test.ts b/front_end/core/sdk/SourceMapSpec.test.ts +new file mode 100644 +index 0000000000..93b26a2e13 +--- /dev/null ++++ b/front_end/core/sdk/SourceMapSpec.test.ts +@@ -0,0 +1,206 @@ ++// Copyright 2024 The Chromium Authors. All rights reserved. ++// Use of this source code is governed by a BSD-style license that can be ++// found in the LICENSE file. ++ ++ ++/** ++ This file tests if devtools sourcemaps implementation is matching the sourcemaps spec. ++ Sourcemap Spec tests are using test data coming from: https://github.com/tc39/source-map-tests ++ ++ There is a lot of warnings of invalid source maps passing the validation - this is up to the authors ++ which ones of these could be actually checked in the SourceMaps implementetion and which ones are ok to ignore. ++ ++ **/ ++ ++const {assert} = chai; ++import type * as Platform from '../platform/platform.js'; ++import {assertNotNullOrUndefined} from '../platform/platform.js'; ++import { SourceMapV3, parseSourceMap } from './SourceMap.js'; ++import * as SDK from './sdk.js'; ++import {describeWithEnvironment} from '../../testing/EnvironmentHelpers.js'; ++ ++interface TestSpec { ++ name: string; ++ description: string; ++ baseFile: string; ++ sourceMapFile: string; ++ sourceMapIsValid: boolean; ++ testActions?: TestAction[]; ++} ++ ++interface TestAction { ++ actionType: string; ++ generatedLine: number; ++ generatedColumn: number; ++ originalSource: string; ++ originalLine: number; ++ originalColumn: number; ++ mappedName: null | string; ++ intermediateMaps?: string[] ++} ++ ++// Accept "null", null, or undefined for tests specifying a missing value. ++function nullish(arg : any) { ++ if (arg === "null" || arg === undefined) { ++ return null; ++ } ++ return arg; ++} ++ ++describeWithEnvironment('SourceMapSpec', () => { ++ let testCases : TestSpec[] | undefined; ++ let sourceMapContents : SourceMapV3[] = []; ++ ++ before(async () => { ++ testCases = await loadTestCasesFromFixture('source-map-spec-tests.json'); ++ sourceMapContents = await Promise.all( ++ testCases!.map( ++ async (testCase) => { ++ const { sourceMapFile } = testCase; ++ return loadSourceMapFromFixture(sourceMapFile); ++ } ++ ) ++ ); ++ }); ++ ++ it('Spec tests', () => { ++ const consoleErrorSpy = sinon.spy(console, 'error'); ++ testCases!.forEach(({ ++ baseFile, ++ sourceMapFile, ++ testActions, ++ sourceMapIsValid, ++ name ++ }, index) => { ++ const sourceMapContent = sourceMapContents[index]; ++ ++ // These test cases are ignored because certain validity checks are ++ // not implemented, such as checking the version number is `3`. ++ const ignoredCasesForBasicValidity = [ ++ "fileNotAString1", ++ "fileNotAString2", ++ "versionMissing", ++ "versionNotANumber", ++ "versionNumericString", ++ "versionTooHigh", ++ "versionTooLow", ++ "sourcesNotAList1", ++ "sourcesNotAList2", ++ "sourcesNotStringOrNull", ++ // FIXME: this test should be revised after recent spec changes ++ "namesMissing", ++ "namesNotAList1", ++ "namesNotAList2", ++ "namesNotString", ++ "ignoreListWrongType1", ++ "ignoreListWrongType2", ++ "ignoreListOutOfBounds", ++ "indexMapWrongTypeSections", ++ "indexMapWrongTypeMap", ++ "indexMapMissingOffset", ++ "invalidVLQDueToNonBase64Character", ++ ]; ++ ++ // 1) check if an invalid sourcemap throws on SourceMap instance creation, or ++ // 2) check if an invalid sourcemap throws on mapping creation ++ if (!sourceMapIsValid) { ++ if (ignoredCasesForBasicValidity.includes(name)) ++ return; ++ ++ let thrownDuringParse = false; ++ try { ++ const sourceMap = new SDK.SourceMap.SourceMap( ++ baseFile as Platform.DevToolsPath.UrlString, ++ sourceMapFile as Platform.DevToolsPath.UrlString, ++ sourceMapContent); ++ sourceMap.mappings(); ++ } catch { ++ thrownDuringParse = true; ++ } ++ assert.equal( ++ thrownDuringParse || consoleErrorSpy.calledWith("Failed to parse source map"), ++ true, ++ `${name}: expected invalid source map to fail to load` ++ ); ++ ++ return; ++ } ++ ++ // 3) check if a valid sourcemap can be parsed and a SourceMap instance created ++ const baseFileUrl = baseFile as Platform.DevToolsPath.UrlString; ++ const sourceMapFileUrl = sourceMapFile as Platform.DevToolsPath.UrlString; ++ ++ assert.doesNotThrow( ++ () => parseSourceMap(JSON.stringify(sourceMapContent)), ++ undefined, ++ undefined, ++ `${name}: expected valid source map to parse` ++ ); ++ assert.doesNotThrow(() => new SDK.SourceMap.SourceMap( ++ baseFileUrl, ++ sourceMapFileUrl, ++ sourceMapContent ++ ), undefined, undefined, `${name}: expected valid source map to parse`); ++ ++ // 4) check if the mappings are valid ++ const sourceMap = new SDK.SourceMap.SourceMap( ++ baseFileUrl, ++ sourceMapFileUrl, ++ sourceMapContent); ++ ++ assert.doesNotThrow(() => sourceMap.findEntry(1, 1)); ++ ++ if (testActions !== undefined) { ++ testActions.forEach(({ ++ actionType, ++ originalSource, ++ originalLine, ++ originalColumn, ++ generatedLine, ++ generatedColumn, ++ intermediateMaps ++ }) => { ++ ++ if (actionType === "checkMapping" && sourceMapIsValid) { ++ // 4a) check if the mappings are valid for regular sourcemaps ++ // extract to separate function ++ let actual = sourceMap.findEntry(generatedLine, generatedColumn); ++ assertNotNullOrUndefined(actual); ++ ++ assert.strictEqual(nullish(actual.sourceURL), originalSource, 'unexpected source URL'); ++ assert.strictEqual(nullish(actual.sourceLineNumber), originalLine, 'unexpected source line number'); ++ assert.strictEqual(nullish(actual.sourceColumnNumber), originalColumn, 'unexpected source column number'); ++ } ++ }); ++ } ++ }); ++ }); ++}); ++ ++async function loadTestCasesFromFixture(filename: string): Promise { ++ const testSpec = await getFixtureFileContents<{ tests: TestSpec[] }>(filename); ++ return testSpec?.tests ?? []; ++}; ++ ++async function loadSourceMapFromFixture(filename: string): Promise { ++ return getFixtureFileContents(filename); ++}; ++ ++async function getFixtureFileContents(filename: string): ++ Promise { ++ const url = new URL(`/front_end/core/sdk/fixtures/sourcemaps/${filename}`, window.location.origin); ++ ++ const response = await fetch(url); ++ ++ if (response.status !== 200) { ++ throw new Error(`Unable to load ${url}`); ++ } ++ ++ const contentType = response.headers.get('content-type'); ++ const isGzipEncoded = contentType !== null && contentType.includes('gzip'); ++ let buffer = await response.arrayBuffer(); ++ ++ const decoder = new TextDecoder('utf-8'); ++ const contents = JSON.parse(decoder.decode(buffer)) as T; ++ return contents; ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/BUILD.gn b/front_end/core/sdk/fixtures/sourcemaps/BUILD.gn +new file mode 100644 +index 0000000000..a82b09a02d +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/BUILD.gn +@@ -0,0 +1,202 @@ ++# Copyright 2022 The Chromium Authors. All rights reserved. ++# Use of this source code is governed by a BSD-style license that can be ++# found in the LICENSE file. ++ ++import("../../../../../scripts/build/ninja/copy.gni") ++ ++copy_to_gen("sourcemaps") { ++ sources = [ ++ "basic-mapping-as-index-map.js", ++ "basic-mapping-as-index-map.js.map", ++ "basic-mapping-original.js", ++ "basic-mapping.js", ++ "basic-mapping.js.map", ++ "file-not-a-string-1.js", ++ "file-not-a-string-1.js.map", ++ "file-not-a-string-2.js", ++ "file-not-a-string-2.js.map", ++ "ignore-list-empty.js", ++ "ignore-list-empty.js.map", ++ "ignore-list-out-of-bounds.js", ++ "ignore-list-out-of-bounds.js.map", ++ "ignore-list-valid-1.js", ++ "ignore-list-valid-1.js.map", ++ "ignore-list-wrong-type-1.js", ++ "ignore-list-wrong-type-1.js.map", ++ "ignore-list-wrong-type-2.js", ++ "ignore-list-wrong-type-2.js.map", ++ "ignore-list-wrong-type-3.js", ++ "ignore-list-wrong-type-3.js.map", ++ "index-map-empty-sections.js", ++ "index-map-empty-sections.js.map", ++ "index-map-file-wrong-type-1.js", ++ "index-map-file-wrong-type-1.js.map", ++ "index-map-file-wrong-type-2.js", ++ "index-map-file-wrong-type-2.js.map", ++ "index-map-invalid-base-mappings.js", ++ "index-map-invalid-base-mappings.js.map", ++ "index-map-invalid-order.js", ++ "index-map-invalid-order.js.map", ++ "index-map-invalid-overlap.js", ++ "index-map-invalid-overlap.js.map", ++ "index-map-invalid-sub-map.js", ++ "index-map-invalid-sub-map.js.map", ++ "index-map-missing-file.js", ++ "index-map-missing-file.js.map", ++ "index-map-missing-map.js", ++ "index-map-missing-map.js.map", ++ "index-map-missing-offset-column.js", ++ "index-map-missing-offset-column.js.map", ++ "index-map-missing-offset-line.js", ++ "index-map-missing-offset-line.js.map", ++ "index-map-missing-offset.js", ++ "index-map-missing-offset.js.map", ++ "index-map-offset-column-wrong-type.js", ++ "index-map-offset-column-wrong-type.js.map", ++ "index-map-offset-line-wrong-type.js", ++ "index-map-offset-line-wrong-type.js.map", ++ "index-map-two-concatenated-sources.js", ++ "index-map-two-concatenated-sources.js.map", ++ "index-map-wrong-type-map.js", ++ "index-map-wrong-type-map.js.map", ++ "index-map-wrong-type-offset.js", ++ "index-map-wrong-type-offset.js.map", ++ "index-map-wrong-type-sections.js", ++ "index-map-wrong-type-sections.js.map", ++ "invalid-mapping-bad-separator.js", ++ "invalid-mapping-bad-separator.js.map", ++ "invalid-mapping-not-a-string-1.js", ++ "invalid-mapping-not-a-string-1.js.map", ++ "invalid-mapping-not-a-string-2.js", ++ "invalid-mapping-not-a-string-2.js.map", ++ "invalid-mapping-segment-column-too-large.js", ++ "invalid-mapping-segment-column-too-large.js.map", ++ "invalid-mapping-segment-name-index-out-of-bounds.js", ++ "invalid-mapping-segment-name-index-out-of-bounds.js.map", ++ "invalid-mapping-segment-name-index-too-large.js", ++ "invalid-mapping-segment-name-index-too-large.js.map", ++ "invalid-mapping-segment-negative-column.js", ++ "invalid-mapping-segment-negative-column.js.map", ++ "invalid-mapping-segment-negative-name-index.js", ++ "invalid-mapping-segment-negative-name-index.js.map", ++ "invalid-mapping-segment-negative-original-column.js", ++ "invalid-mapping-segment-negative-original-column.js.map", ++ "invalid-mapping-segment-negative-original-line.js", ++ "invalid-mapping-segment-negative-original-line.js.map", ++ "invalid-mapping-segment-negative-relative-column.js", ++ "invalid-mapping-segment-negative-relative-column.js.map", ++ "invalid-mapping-segment-negative-relative-name-index.js", ++ "invalid-mapping-segment-negative-relative-name-index.js.map", ++ "invalid-mapping-segment-negative-relative-original-column.js", ++ "invalid-mapping-segment-negative-relative-original-column.js.map", ++ "invalid-mapping-segment-negative-relative-original-line.js", ++ "invalid-mapping-segment-negative-relative-original-line.js.map", ++ "invalid-mapping-segment-negative-relative-source-index.js", ++ "invalid-mapping-segment-negative-relative-source-index.js.map", ++ "invalid-mapping-segment-negative-source-index.js", ++ "invalid-mapping-segment-negative-source-index.js.map", ++ "invalid-mapping-segment-original-column-too-large.js", ++ "invalid-mapping-segment-original-column-too-large.js.map", ++ "invalid-mapping-segment-original-line-too-large.js", ++ "invalid-mapping-segment-original-line-too-large.js.map", ++ "invalid-mapping-segment-source-index-out-of-bounds.js", ++ "invalid-mapping-segment-source-index-out-of-bounds.js.map", ++ "invalid-mapping-segment-source-index-too-large.js", ++ "invalid-mapping-segment-source-index-too-large.js.map", ++ "invalid-mapping-segment-with-three-fields.js", ++ "invalid-mapping-segment-with-three-fields.js.map", ++ "invalid-mapping-segment-with-two-fields.js", ++ "invalid-mapping-segment-with-two-fields.js.map", ++ "invalid-mapping-segment-with-zero-fields.js", ++ "invalid-mapping-segment-with-zero-fields.js.map", ++ "invalid-vlq-missing-continuation.js", ++ "invalid-vlq-missing-continuation.js.map", ++ "invalid-vlq-non-base64-char.js", ++ "invalid-vlq-non-base64-char.js.map", ++ "mapping-semantics-column-reset.js", ++ "mapping-semantics-column-reset.js.map", ++ "mapping-semantics-five-field-segment.js", ++ "mapping-semantics-five-field-segment.js.map", ++ "mapping-semantics-four-field-segment.js", ++ "mapping-semantics-four-field-segment.js.map", ++ "mapping-semantics-relative-1.js", ++ "mapping-semantics-relative-1.js.map", ++ "mapping-semantics-relative-2.js", ++ "mapping-semantics-relative-2.js.map", ++ "mapping-semantics-single-field-segment.js", ++ "mapping-semantics-single-field-segment.js.map", ++ "names-missing.js", ++ "names-missing.js.map", ++ "names-not-a-list-1.js", ++ "names-not-a-list-1.js.map", ++ "names-not-a-list-2.js", ++ "names-not-a-list-2.js.map", ++ "names-not-string.js", ++ "names-not-string.js.map", ++ "second-source-original.js", ++ "source-map-spec-tests.json", ++ "source-resolution-absolute-url.js", ++ "source-resolution-absolute-url.js.map", ++ "source-resolution-relative-url.js", ++ "source-resolution-relative-url.js.map", ++ "source-root-not-a-string-1.js", ++ "source-root-not-a-string-1.js.map", ++ "source-root-not-a-string-2.js", ++ "source-root-not-a-string-2.js.map", ++ "source-root-resolution.js", ++ "source-root-resolution.js.map", ++ "sources-and-sources-content-both-null.js", ++ "sources-and-sources-content-both-null.js.map", ++ "sources-missing.js", ++ "sources-missing.js.map", ++ "sources-non-null-sources-content-null.js", ++ "sources-non-null-sources-content-null.js.map", ++ "sources-not-a-list-1.js", ++ "sources-not-a-list-1.js.map", ++ "sources-not-a-list-2.js", ++ "sources-not-a-list-2.js.map", ++ "sources-not-string-or-null.js", ++ "sources-not-string-or-null.js.map", ++ "sources-null-sources-content-non-null.js", ++ "sources-null-sources-content-non-null.js.map", ++ "transitive-mapping-original.js", ++ "transitive-mapping-original.js.map", ++ "transitive-mapping-three-steps.js", ++ "transitive-mapping-three-steps.js.map", ++ "transitive-mapping.js", ++ "transitive-mapping.js.map", ++ "typescript-original.ts", ++ "unrecognized-property.js", ++ "unrecognized-property.js.map", ++ "valid-mapping-boundary-values.js", ++ "valid-mapping-boundary-values.js.map", ++ "valid-mapping-empty-groups.js", ++ "valid-mapping-empty-groups.js.map", ++ "valid-mapping-empty-string.js", ++ "valid-mapping-empty-string.js.map", ++ "valid-mapping-large-vlq.js", ++ "valid-mapping-large-vlq.js.map", ++ "valid-mapping-null-sources.js", ++ "valid-mapping-null-sources.js.map", ++ "version-missing.js", ++ "version-missing.js.map", ++ "version-not-a-number.js", ++ "version-not-a-number.js.map", ++ "version-numeric-string.js", ++ "version-numeric-string.js.map", ++ "version-too-high.js", ++ "version-too-high.js.map", ++ "version-too-low.js", ++ "version-too-low.js.map", ++ "version-valid.js", ++ "version-valid.js.map", ++ "vlq-valid-continuation-bit-present-1.js", ++ "vlq-valid-continuation-bit-present-1.js.map", ++ "vlq-valid-continuation-bit-present-2.js", ++ "vlq-valid-continuation-bit-present-2.js.map", ++ "vlq-valid-negative-digit.js", ++ "vlq-valid-negative-digit.js.map", ++ "vlq-valid-single-digit.js", ++ "vlq-valid-single-digit.js.map", ++ ] ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/basic-mapping-as-index-map.js b/front_end/core/sdk/fixtures/sourcemaps/basic-mapping-as-index-map.js +new file mode 100644 +index 0000000000..b9fae38043 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/basic-mapping-as-index-map.js +@@ -0,0 +1,2 @@ ++function foo(){return 42}function bar(){return 24}foo();bar(); ++//# sourceMappingURL=basic-mapping-as-index-map.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/basic-mapping-as-index-map.js.map b/front_end/core/sdk/fixtures/sourcemaps/basic-mapping-as-index-map.js.map +new file mode 100644 +index 0000000000..c0ad870ed2 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/basic-mapping-as-index-map.js.map +@@ -0,0 +1,15 @@ ++{ ++ "version": 3, ++ "file": "basic-mapping-as-index-map.js", ++ "sections": [ ++ { ++ "offset": { "line": 0, "column": 0 }, ++ "map": { ++ "version": 3, ++ "names": ["foo","bar"], ++ "sources": ["basic-mapping-original.js"], ++ "mappings": "AAAA,SAASA,MACP,OAAO,EACT,CACA,SAASC,MACP,OAAO,EACT,CACAD,MACAC" ++ } ++ } ++ ] ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/basic-mapping-original.js b/front_end/core/sdk/fixtures/sourcemaps/basic-mapping-original.js +new file mode 100644 +index 0000000000..301b186cb1 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/basic-mapping-original.js +@@ -0,0 +1,8 @@ ++function foo() { ++ return 42; ++} ++function bar() { ++ return 24; ++} ++foo(); ++bar(); +diff --git a/front_end/core/sdk/fixtures/sourcemaps/basic-mapping.js b/front_end/core/sdk/fixtures/sourcemaps/basic-mapping.js +new file mode 100644 +index 0000000000..2e479a4175 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/basic-mapping.js +@@ -0,0 +1,2 @@ ++function foo(){return 42}function bar(){return 24}foo();bar(); ++//# sourceMappingURL=basic-mapping.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/basic-mapping.js.map b/front_end/core/sdk/fixtures/sourcemaps/basic-mapping.js.map +new file mode 100644 +index 0000000000..12dc9679a4 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/basic-mapping.js.map +@@ -0,0 +1,6 @@ ++{ ++ "version":3, ++ "names": ["foo","bar"], ++ "sources": ["basic-mapping-original.js"], ++ "mappings":"AAAA,SAASA,MACP,OAAO,EACT,CACA,SAASC,MACP,OAAO,EACT,CACAD,MACAC" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/ignore-list-empty.js b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-empty.js +new file mode 100644 +index 0000000000..385a5c3501 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-empty.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=ignore-list-empty.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/ignore-list-empty.js.map b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-empty.js.map +new file mode 100644 +index 0000000000..7297863a9b +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-empty.js.map +@@ -0,0 +1,8 @@ ++{ ++ "version" : 3, ++ "sources": ["empty-original.js"], ++ "sourcesContent": [""], ++ "mappings": "", ++ "names": [], ++ "ignoreList": [] ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/ignore-list-out-of-bounds.js b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-out-of-bounds.js +new file mode 100644 +index 0000000000..7a0fbb8833 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-out-of-bounds.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=ignore-list-out-of-bounds.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/ignore-list-out-of-bounds.js.map b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-out-of-bounds.js.map +new file mode 100644 +index 0000000000..fb2566bb41 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-out-of-bounds.js.map +@@ -0,0 +1,8 @@ ++{ ++ "version" : 3, ++ "sources": ["empty-original.js"], ++ "sourcesContent": [""], ++ "mappings": "", ++ "names": [], ++ "ignoreList": [1] ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/ignore-list-valid-1.js b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-valid-1.js +new file mode 100644 +index 0000000000..ea64a5565a +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-valid-1.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=ignore-list-valid-1.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/ignore-list-valid-1.js.map b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-valid-1.js.map +new file mode 100644 +index 0000000000..98eebdf7f6 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-valid-1.js.map +@@ -0,0 +1,8 @@ ++{ ++ "version" : 3, ++ "sources": ["empty-original.js"], ++ "sourcesContent": [""], ++ "mappings": "", ++ "names": [], ++ "ignoreList": [0] ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-1.js b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-1.js +new file mode 100644 +index 0000000000..8b40bd3847 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-1.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=ignore-list-wrong-type-1.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-1.js.map b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-1.js.map +new file mode 100644 +index 0000000000..688740aba8 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-1.js.map +@@ -0,0 +1,8 @@ ++{ ++ "version" : 3, ++ "sources": ["empty-original.js"], ++ "sourcesContent": [""], ++ "mappings": "", ++ "names": [], ++ "ignoreList": ["not a number"] ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-2.js b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-2.js +new file mode 100644 +index 0000000000..35c7791164 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-2.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=ignore-list-wrong-type-2.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-2.js.map b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-2.js.map +new file mode 100644 +index 0000000000..ca1d30de2d +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-2.js.map +@@ -0,0 +1,8 @@ ++{ ++ "version" : 3, ++ "sources": ["empty-original.js"], ++ "sourcesContent": [""], ++ "mappings": "", ++ "names": [], ++ "ignoreList": ["0"] ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-3.js b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-3.js +new file mode 100644 +index 0000000000..8735d41758 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-3.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=ignore-list-wrong-type-3.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-3.js.map b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-3.js.map +new file mode 100644 +index 0000000000..1ac167d56c +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-3.js.map +@@ -0,0 +1,8 @@ ++{ ++ "version" : 3, ++ "sources": ["empty-original.js"], ++ "sourcesContent": [""], ++ "mappings": "", ++ "names": [], ++ "ignoreList": 0 ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-base-mappings.js b/front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-base-mappings.js +new file mode 100644 +index 0000000000..e90bef083c +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-base-mappings.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=index-map-invalid-base-mappings.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-base-mappings.js.map b/front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-base-mappings.js.map +new file mode 100644 +index 0000000000..b489c1f080 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-base-mappings.js.map +@@ -0,0 +1,15 @@ ++{ ++ "version": 3, ++ "mappings": "AAAA", ++ "sections": [ ++ { ++ "offset": { "line": 0, "column": 0 }, ++ "map": { ++ "version": 3, ++ "names": [], ++ "sources": ["empty-original.js"], ++ "mappings": "AAAA" ++ } ++ } ++ ] ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-order.js b/front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-order.js +new file mode 100644 +index 0000000000..263fa3c6e0 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-order.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=index-map-invalid-order.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-order.js.map b/front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-order.js.map +new file mode 100644 +index 0000000000..82da69df72 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-order.js.map +@@ -0,0 +1,23 @@ ++{ ++ "version": 3, ++ "sections": [ ++ { ++ "offset": { "line": 1, "column": 4 }, ++ "map": { ++ "version": 3, ++ "names": [], ++ "sources": ["empty-original.js"], ++ "mappings": "AAAA" ++ } ++ }, ++ { ++ "offset": { "line": 0, "column": 0 }, ++ "map": { ++ "version": 3, ++ "names": [], ++ "sources": ["empty-original.js"], ++ "mappings": "AAAA" ++ } ++ } ++ ] ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-overlap.js b/front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-overlap.js +new file mode 100644 +index 0000000000..9aff8dc620 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-overlap.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=index-map-invalid-overlap.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-overlap.js.map b/front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-overlap.js.map +new file mode 100644 +index 0000000000..8d42546fd8 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-overlap.js.map +@@ -0,0 +1,23 @@ ++{ ++ "version": 3, ++ "sections": [ ++ { ++ "offset": { "line": 0, "column": 0 }, ++ "map": { ++ "version": 3, ++ "names": [], ++ "sources": ["empty-original.js"], ++ "mappings": "AAAA" ++ } ++ }, ++ { ++ "offset": { "line": 0, "column": 0 }, ++ "map": { ++ "version": 3, ++ "names": [], ++ "sources": ["empty-original.js"], ++ "mappings": "AAAA" ++ } ++ } ++ ] ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-map.js b/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-map.js +new file mode 100644 +index 0000000000..86c8e9a253 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-map.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=index-map-missing-map.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-map.js.map b/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-map.js.map +new file mode 100644 +index 0000000000..3bce47e852 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-map.js.map +@@ -0,0 +1,8 @@ ++{ ++ "version": 3, ++ "sections": [ ++ { ++ "offset": { "line": 0, "column": 0 } ++ } ++ ] ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset-column.js b/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset-column.js +new file mode 100644 +index 0000000000..fe6917403f +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset-column.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=index-map-missing-offset-column.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset-column.js.map b/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset-column.js.map +new file mode 100644 +index 0000000000..aa48bbb993 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset-column.js.map +@@ -0,0 +1,14 @@ ++{ ++ "version": 3, ++ "sections": [ ++ { ++ "offset": { "line": 0 }, ++ "map": { ++ "version": 3, ++ "names": [], ++ "sources": ["empty-original.js"], ++ "mappings": "AAAA" ++ } ++ } ++ ] ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset-line.js b/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset-line.js +new file mode 100644 +index 0000000000..ba8614e412 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset-line.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=index-map-missing-offset-line.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset-line.js.map b/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset-line.js.map +new file mode 100644 +index 0000000000..3d60444ea7 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset-line.js.map +@@ -0,0 +1,14 @@ ++{ ++ "version": 3, ++ "sections": [ ++ { ++ "offset": { "column": 0 }, ++ "map": { ++ "version": 3, ++ "names": [], ++ "sources": ["empty-original.js"], ++ "mappings": "AAAA" ++ } ++ } ++ ] ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset.js b/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset.js +new file mode 100644 +index 0000000000..9ca2cf3fb5 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=index-map-missing-offset.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset.js.map b/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset.js.map +new file mode 100644 +index 0000000000..7285138bf5 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset.js.map +@@ -0,0 +1,13 @@ ++{ ++ "version": 3, ++ "sections": [ ++ { ++ "map": { ++ "version": 3, ++ "names": [], ++ "sources": ["empty-original.js"], ++ "mappings": "AAAA" ++ } ++ } ++ ] ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-offset-column-wrong-type.js b/front_end/core/sdk/fixtures/sourcemaps/index-map-offset-column-wrong-type.js +new file mode 100644 +index 0000000000..ed1e9ec5d5 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-offset-column-wrong-type.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=index-map-offset-column-wrong-type.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-offset-column-wrong-type.js.map b/front_end/core/sdk/fixtures/sourcemaps/index-map-offset-column-wrong-type.js.map +new file mode 100644 +index 0000000000..b43e79a9dd +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-offset-column-wrong-type.js.map +@@ -0,0 +1,14 @@ ++{ ++ "version": 3, ++ "sections": [ ++ { ++ "offset": { "line": 0, "column": true }, ++ "map": { ++ "version": 3, ++ "names": [], ++ "sources": ["empty-original.js"], ++ "mappings": "AAAA" ++ } ++ } ++ ] ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-offset-line-wrong-type.js b/front_end/core/sdk/fixtures/sourcemaps/index-map-offset-line-wrong-type.js +new file mode 100644 +index 0000000000..d58f2aff99 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-offset-line-wrong-type.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=index-map-offset-line-wrong-type.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-offset-line-wrong-type.js.map b/front_end/core/sdk/fixtures/sourcemaps/index-map-offset-line-wrong-type.js.map +new file mode 100644 +index 0000000000..81dbcd6ec4 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-offset-line-wrong-type.js.map +@@ -0,0 +1,14 @@ ++{ ++ "version": 3, ++ "sections": [ ++ { ++ "offset": { "line": true, "column": 0 }, ++ "map": { ++ "version": 3, ++ "names": [], ++ "sources": ["empty-original.js"], ++ "mappings": "AAAA" ++ } ++ } ++ ] ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-two-concatenated-sources.js b/front_end/core/sdk/fixtures/sourcemaps/index-map-two-concatenated-sources.js +new file mode 100644 +index 0000000000..b8702d7187 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-two-concatenated-sources.js +@@ -0,0 +1,2 @@ ++function foo(){return 42}function bar(){return 24}foo();bar();function baz(){return"baz"}baz(); ++//# sourceMappingURL=index-map-two-concatenated-sources.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-two-concatenated-sources.js.map b/front_end/core/sdk/fixtures/sourcemaps/index-map-two-concatenated-sources.js.map +new file mode 100644 +index 0000000000..f67f5de3c5 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-two-concatenated-sources.js.map +@@ -0,0 +1,24 @@ ++{ ++ "version": 3, ++ "file": "index-map-two-concatenated-sources.js", ++ "sections": [ ++ { ++ "offset": { "line": 0, "column": 0 }, ++ "map": { ++ "version": 3, ++ "names": ["foo","bar"], ++ "sources": ["basic-mapping-original.js"], ++ "mappings": "AAAA,SAASA,MACP,OAAO,EACT,CACA,SAASC,MACP,OAAO,EACT,CACAD,MACAC" ++ } ++ }, ++ { ++ "offset": { "line": 0, "column": 62 }, ++ "map": { ++ "version": 3, ++ "names": ["baz"], ++ "sources": ["second-source-original.js"], ++ "mappings":"AAAA,SAASA,MACP,MAAO,KACT,CACAA" ++ } ++ } ++ ] ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-map.js b/front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-map.js +new file mode 100644 +index 0000000000..d31d6d6358 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-map.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=index-map-wrong-type-map.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-map.js.map b/front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-map.js.map +new file mode 100644 +index 0000000000..0963f623d7 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-map.js.map +@@ -0,0 +1,9 @@ ++{ ++ "version": 3, ++ "sections": [ ++ { ++ "offset": { "line": 0, "column": 0 }, ++ "map": "not a map" ++ } ++ ] ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-offset.js b/front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-offset.js +new file mode 100644 +index 0000000000..048e1246f8 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-offset.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=index-map-wrong-type-offset.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-offset.js.map b/front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-offset.js.map +new file mode 100644 +index 0000000000..fbc6e4e678 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-offset.js.map +@@ -0,0 +1,14 @@ ++{ ++ "version": 3, ++ "sections": [ ++ { ++ "offset": "not an offset", ++ "map": { ++ "version": 3, ++ "names": [], ++ "sources": ["empty-original.js"], ++ "mappings": "AAAA" ++ } ++ } ++ ] ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-sections.js b/front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-sections.js +new file mode 100644 +index 0000000000..011eca806e +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-sections.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=index-map-wrong-type-sections.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-sections.js.map b/front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-sections.js.map +new file mode 100644 +index 0000000000..dbfb4ead30 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-sections.js.map +@@ -0,0 +1,4 @@ ++{ ++ "version": 3, ++ "sections": "not a sections list" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-bad-separator.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-bad-separator.js +new file mode 100644 +index 0000000000..25338aca30 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-bad-separator.js +@@ -0,0 +1,2 @@ ++function foo(){return 42}function bar(){return 24}foo();bar(); ++//# sourceMappingURL=invalid-mapping-bad-separator.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-bad-separator.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-bad-separator.js.map +new file mode 100644 +index 0000000000..5f4f5b9233 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-bad-separator.js.map +@@ -0,0 +1,6 @@ ++{ ++ "version": 3, ++ "names": ["foo","bar"], ++ "sources": ["basic-mapping-original.js"], ++ "mappings": "AAAA.SAASA:MACP" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-not-a-string-1.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-not-a-string-1.js +new file mode 100644 +index 0000000000..cb38e2fe9d +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-not-a-string-1.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=invalid-mapping-not-a-string-1.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-not-a-string-1.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-not-a-string-1.js.map +new file mode 100644 +index 0000000000..5bf3e2a9d8 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-not-a-string-1.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "names": [], ++ "file": "invalid-mapping-not-a-string-1.js", ++ "sources": ["empty-original.js"], ++ "mappings": 5 ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-not-a-string-2.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-not-a-string-2.js +new file mode 100644 +index 0000000000..3d84abd6c6 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-not-a-string-2.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=invalid-mapping-not-a-string-2.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-not-a-string-2.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-not-a-string-2.js.map +new file mode 100644 +index 0000000000..4527e7f764 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-not-a-string-2.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "names": [], ++ "file": "invalid-mapping-not-a-string-2.js", ++ "sources": ["empty-original.js"], ++ "mappings": [1, 2, 3, 4] ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-column-too-large.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-column-too-large.js +new file mode 100644 +index 0000000000..55591f874b +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-column-too-large.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=invalid-mapping-segment-column-too-large.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-column-too-large.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-column-too-large.js.map +new file mode 100644 +index 0000000000..b4c059e015 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-column-too-large.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "names": [], ++ "file": "invalid-mapping-segment-column-too-large.js", ++ "sources": ["empty-original.js"], ++ "mappings": "ggggggE" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-name-index-out-of-bounds.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-name-index-out-of-bounds.js +new file mode 100644 +index 0000000000..2a6b434eff +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-name-index-out-of-bounds.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=invalid-mapping-segment-name-index-out-of-bounds.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-name-index-out-of-bounds.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-name-index-out-of-bounds.js.map +new file mode 100644 +index 0000000000..8dd2ea6c2d +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-name-index-out-of-bounds.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "names": ["foo"], ++ "file": "invalid-mapping-segment-name-index-out-of-bounds.js", ++ "sources": ["empty-original.js"], ++ "mappings": "AAAAC" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-name-index-too-large.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-name-index-too-large.js +new file mode 100644 +index 0000000000..709e34dbd3 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-name-index-too-large.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=invalid-mapping-segment-name-index-too-large.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-name-index-too-large.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-name-index-too-large.js.map +new file mode 100644 +index 0000000000..c7bf5b98d1 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-name-index-too-large.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "names": [], ++ "file": "invalid-mapping-segment-name-index-too-large.js", ++ "sources": ["empty-original.js"], ++ "mappings": "AAAAggggggE" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-column.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-column.js +new file mode 100644 +index 0000000000..a202152d6f +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-column.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=invalid-mapping-segment-negative-column.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-column.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-column.js.map +new file mode 100644 +index 0000000000..403878bfa4 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-column.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "names": [], ++ "file": "invalid-mapping-segment-negative-column.js", ++ "sources": ["empty-original.js"], ++ "mappings": "F" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-name-index.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-name-index.js +new file mode 100644 +index 0000000000..3e3f634204 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-name-index.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=invalid-mapping-segment-negative-name-index.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-name-index.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-name-index.js.map +new file mode 100644 +index 0000000000..b94f63646e +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-name-index.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "names": [], ++ "file": "invalid-mapping-segment-negative-name-index.js", ++ "sources": ["empty-original.js"], ++ "mappings": "AAAAF" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-original-column.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-original-column.js +new file mode 100644 +index 0000000000..f21d5342b3 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-original-column.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=invalid-mapping-segment-negative-original-column.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-original-column.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-original-column.js.map +new file mode 100644 +index 0000000000..011c639d3f +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-original-column.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "names": [], ++ "file": "invalid-mapping-segment-negative-original-column.js", ++ "sources": ["empty-original.js"], ++ "mappings": "AAAF" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-original-line.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-original-line.js +new file mode 100644 +index 0000000000..b37309601c +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-original-line.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=invalid-mapping-segment-negative-original-line.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-original-line.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-original-line.js.map +new file mode 100644 +index 0000000000..e7ec993eeb +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-original-line.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "names": [], ++ "file": "invalid-mapping-segment-negative-original-line.js", ++ "sources": ["empty-original.js"], ++ "mappings": "AAFA" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-column.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-column.js +new file mode 100644 +index 0000000000..94b835d687 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-column.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=invalid-mapping-segment-negative-relative-column.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-column.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-column.js.map +new file mode 100644 +index 0000000000..414884072b +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-column.js.map +@@ -0,0 +1,8 @@ ++{ ++ "version": 3, ++ "names": [], ++ "file": "invalid-mapping-segment-negative-relative-column.js", ++ "sources": ["empty-original.js"], ++ "sourcesContent": [""], ++ "mappings": "C,F" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-name-index.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-name-index.js +new file mode 100644 +index 0000000000..c965c5f011 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-name-index.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=invalid-mapping-segment-negative-relative-name-index.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-name-index.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-name-index.js.map +new file mode 100644 +index 0000000000..1fbbcfcd32 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-name-index.js.map +@@ -0,0 +1,8 @@ ++{ ++ "version": 3, ++ "names": [], ++ "file": "invalid-mapping-segment-negative-relative-name-index.js", ++ "sources": ["empty-original.js"], ++ "sourcesContent": [""], ++ "mappings": "AAAAC,AAAAF" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-original-column.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-original-column.js +new file mode 100644 +index 0000000000..493a6ec88a +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-original-column.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=invalid-mapping-segment-negative-relative-original-column.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-original-column.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-original-column.js.map +new file mode 100644 +index 0000000000..7e62895651 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-original-column.js.map +@@ -0,0 +1,8 @@ ++{ ++ "version": 3, ++ "names": [], ++ "file": "invalid-mapping-segment-negative-relative-original-column.js", ++ "sources": ["empty-original.js"], ++ "sourcesContent": [""], ++ "mappings": "AAAC,AAAF" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-original-line.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-original-line.js +new file mode 100644 +index 0000000000..ca8329fb98 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-original-line.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=invalid-mapping-segment-negative-relative-original-line.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-original-line.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-original-line.js.map +new file mode 100644 +index 0000000000..86b0fb3a04 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-original-line.js.map +@@ -0,0 +1,8 @@ ++{ ++ "version": 3, ++ "names": [], ++ "file": "invalid-mapping-segment-negative-relative-original-line.js", ++ "sources": ["empty-original.js"], ++ "sourcesContent": [""], ++ "mappings": "AACA,AAFA" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-source-index.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-source-index.js +new file mode 100644 +index 0000000000..fa92225b09 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-source-index.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=invalid-mapping-segment-negative-relative-source-index.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-source-index.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-source-index.js.map +new file mode 100644 +index 0000000000..2efeb047db +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-source-index.js.map +@@ -0,0 +1,8 @@ ++{ ++ "version": 3, ++ "names": [], ++ "file": "invalid-mapping-segment-negative-relative-source-index.js", ++ "sources": ["empty-original.js"], ++ "sourcesContent": [""], ++ "mappings": "ACAA,AFAA" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-source-index.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-source-index.js +new file mode 100644 +index 0000000000..6e05849b6a +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-source-index.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=invalid-mapping-segment-negative-source-index.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-source-index.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-source-index.js.map +new file mode 100644 +index 0000000000..596c2f298b +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-source-index.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "names": [], ++ "file": "invalid-mapping-segment-negative-source-index.js", ++ "sources": ["empty-original.js"], ++ "mappings": "AFAA" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-original-column-too-large.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-original-column-too-large.js +new file mode 100644 +index 0000000000..0936ed7ea8 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-original-column-too-large.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=invalid-mapping-segment-original-column-too-large.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-original-column-too-large.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-original-column-too-large.js.map +new file mode 100644 +index 0000000000..ff2103fe24 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-original-column-too-large.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "names": [], ++ "file": "invalid-mapping-segment-original-column-too-large.js", ++ "sources": ["empty-original.js"], ++ "mappings": "AAAggggggE" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-original-line-too-large.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-original-line-too-large.js +new file mode 100644 +index 0000000000..9b3aa5a361 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-original-line-too-large.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=invalid-mapping-segment-original-line-too-large.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-original-line-too-large.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-original-line-too-large.js.map +new file mode 100644 +index 0000000000..890f1c71fc +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-original-line-too-large.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "names": [], ++ "file": "invalid-mapping-segment-original-line-too-large.js", ++ "sources": ["empty-original.js"], ++ "mappings": "AAggggggEA" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-source-index-out-of-bounds.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-source-index-out-of-bounds.js +new file mode 100644 +index 0000000000..2e5fbca268 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-source-index-out-of-bounds.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=invalid-mapping-segment-source-index-out-of-bounds.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-source-index-out-of-bounds.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-source-index-out-of-bounds.js.map +new file mode 100644 +index 0000000000..86dedb114f +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-source-index-out-of-bounds.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "names": [], ++ "file": "invalid-mapping-segment-source-index-out-of-bounds.js", ++ "sources": ["empty-original.js"], ++ "mappings": "ACAA" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-source-index-too-large.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-source-index-too-large.js +new file mode 100644 +index 0000000000..3f4943e127 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-source-index-too-large.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=invalid-mapping-segment-source-index-too-large.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-source-index-too-large.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-source-index-too-large.js.map +new file mode 100644 +index 0000000000..e9f858c6e1 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-source-index-too-large.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "names": [], ++ "file": "invalid-mapping-segment-source-index-too-large.js", ++ "sources": ["empty-original.js"], ++ "mappings": "AggggggEAA" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-three-fields.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-three-fields.js +new file mode 100644 +index 0000000000..4b868fac9c +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-three-fields.js +@@ -0,0 +1,2 @@ ++function foo(){return 42}function bar(){return 24}foo();bar(); ++//# sourceMappingURL=invalid-mapping-segment-with-three-fields.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-three-fields.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-three-fields.js.map +new file mode 100644 +index 0000000000..c2af1165ad +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-three-fields.js.map +@@ -0,0 +1,6 @@ ++{ ++ "version": 3, ++ "names": ["foo","bar"], ++ "sources": ["basic-mapping-original.js"], ++ "mappings": "AAA" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-two-fields.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-two-fields.js +new file mode 100644 +index 0000000000..96045a7a11 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-two-fields.js +@@ -0,0 +1,2 @@ ++function foo(){return 42}function bar(){return 24}foo();bar(); ++//# sourceMappingURL=invalid-mapping-segment-with-two-fields.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-two-fields.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-two-fields.js.map +new file mode 100644 +index 0000000000..73cf00fa1c +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-two-fields.js.map +@@ -0,0 +1,6 @@ ++{ ++ "version": 3, ++ "names": ["foo","bar"], ++ "sources": ["basic-mapping-original.js"], ++ "mappings": "AA" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-zero-fields.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-zero-fields.js +new file mode 100644 +index 0000000000..9d5332a56c +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-zero-fields.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=invalid-mapping-segment-with-zero-fields.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-zero-fields.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-zero-fields.js.map +new file mode 100644 +index 0000000000..5a34d25b64 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-zero-fields.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "names": [], ++ "file": "invalid-mapping-segment-with-zero-fields.js", ++ "sources": ["empty-original.js"], ++ "mappings": ",,,," ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-vlq-missing-continuation.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-vlq-missing-continuation.js +new file mode 100644 +index 0000000000..2c2a0090ac +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-vlq-missing-continuation.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=invalid-vlq-missing-continuation.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-vlq-missing-continuation.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-vlq-missing-continuation.js.map +new file mode 100644 +index 0000000000..dd0e363ff4 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-vlq-missing-continuation.js.map +@@ -0,0 +1,6 @@ ++{ ++ "version" : 3, ++ "sources": [], ++ "names": [], ++ "mappings": "g" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-vlq-non-base64-char.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-vlq-non-base64-char.js +new file mode 100644 +index 0000000000..d1b20b41a2 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-vlq-non-base64-char.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=invalid-vlq-non-base64-char.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-vlq-non-base64-char.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-vlq-non-base64-char.js.map +new file mode 100644 +index 0000000000..4fa1ac5768 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-vlq-non-base64-char.js.map +@@ -0,0 +1,6 @@ ++{ ++ "version" : 3, ++ "sources": [], ++ "names": [], ++ "mappings": "A$%?!" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/names-missing.js b/front_end/core/sdk/fixtures/sourcemaps/names-missing.js +new file mode 100644 +index 0000000000..58781fd887 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/names-missing.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=names-missing.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/names-missing.js.map b/front_end/core/sdk/fixtures/sourcemaps/names-missing.js.map +new file mode 100644 +index 0000000000..82170bf784 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/names-missing.js.map +@@ -0,0 +1,5 @@ ++{ ++ "version" : 3, ++ "sources": ["empty-original.js"], ++ "mappings": "" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/names-not-a-list-1.js b/front_end/core/sdk/fixtures/sourcemaps/names-not-a-list-1.js +new file mode 100644 +index 0000000000..dc65f1972b +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/names-not-a-list-1.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=names-not-a-list-1.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/names-not-a-list-1.js.map b/front_end/core/sdk/fixtures/sourcemaps/names-not-a-list-1.js.map +new file mode 100644 +index 0000000000..fe1edaeb96 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/names-not-a-list-1.js.map +@@ -0,0 +1,6 @@ ++{ ++ "version" : 3, ++ "sources": ["source.js"], ++ "names": "not a list", ++ "mappings": "AAAAA" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/names-not-a-list-2.js b/front_end/core/sdk/fixtures/sourcemaps/names-not-a-list-2.js +new file mode 100644 +index 0000000000..d7251f78da +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/names-not-a-list-2.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=names-not-a-list-2.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/names-not-a-list-2.js.map b/front_end/core/sdk/fixtures/sourcemaps/names-not-a-list-2.js.map +new file mode 100644 +index 0000000000..3388d2bb71 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/names-not-a-list-2.js.map +@@ -0,0 +1,6 @@ ++{ ++ "version" : 3, ++ "sources": ["source.js"], ++ "names": { "foo": 3 }, ++ "mappings": "AAAAA" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/names-not-string.js b/front_end/core/sdk/fixtures/sourcemaps/names-not-string.js +new file mode 100644 +index 0000000000..8dc7b4811a +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/names-not-string.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=names-not-string.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/names-not-string.js.map b/front_end/core/sdk/fixtures/sourcemaps/names-not-string.js.map +new file mode 100644 +index 0000000000..c0feb0739a +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/names-not-string.js.map +@@ -0,0 +1,6 @@ ++{ ++ "version" : 3, ++ "sources": ["source.js"], ++ "names": [null, 3, true, false, {}, []], ++ "mappings": "AAAAA" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/second-source-original.js b/front_end/core/sdk/fixtures/sourcemaps/second-source-original.js +new file mode 100644 +index 0000000000..c339bc9d15 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/second-source-original.js +@@ -0,0 +1,4 @@ ++function baz() { ++ return "baz"; ++} ++baz(); +diff --git a/front_end/core/sdk/fixtures/sourcemaps/source-map-spec-tests.json b/front_end/core/sdk/fixtures/sourcemaps/source-map-spec-tests.json +new file mode 100644 +index 0000000000..0f7a3c1cb1 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/source-map-spec-tests.json +@@ -0,0 +1,1540 @@ ++{ ++ "tests": [ ++ { ++ "name": "versionValid", ++ "description": "Test a simple source map with a valid version number", ++ "baseFile": "version-valid.js", ++ "sourceMapFile": "version-valid.js.map", ++ "sourceMapIsValid": true ++ }, ++ { ++ "name": "versionMissing", ++ "description": "Test a source map that is missing a version field", ++ "baseFile": "version-missing.js", ++ "sourceMapFile": "version-missing.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "versionNotANumber", ++ "description": "Test a source map with a version field that is not a number", ++ "baseFile": "version-not-a-number.js", ++ "sourceMapFile": "version-not-a-number.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "versionNumericString", ++ "description": "Test a source map with a version field that is a number as a string", ++ "baseFile": "version-numeric-string.js", ++ "sourceMapFile": "version-numeric-string.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "versionTooHigh", ++ "description": "Test a source map with an integer version field that is too high", ++ "baseFile": "version-too-high.js", ++ "sourceMapFile": "version-too-high.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "versionTooLow", ++ "description": "Test a source map with an integer version field that is too low", ++ "baseFile": "version-too-low.js", ++ "sourceMapFile": "version-too-low.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "sourcesMissing", ++ "description": "Test a source map that is missing a necessary sources field", ++ "baseFile": "sources-missing.js", ++ "sourceMapFile": "sources-missing.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "sourcesNotAList1", ++ "description": "Test a source map with a sources field that is not a valid list (string)", ++ "baseFile": "sources-not-a-list-1.js", ++ "sourceMapFile": "sources-not-a-list-1.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "sourcesNotAList2", ++ "description": "Test a source map with a sources field that is not a valid list (object)", ++ "baseFile": "sources-not-a-list-2.js", ++ "sourceMapFile": "sources-not-a-list-2.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "sourcesNotStringOrNull", ++ "description": "Test a source map with a sources list that has non-string and non-null items", ++ "baseFile": "sources-not-string-or-null.js", ++ "sourceMapFile": "sources-not-string-or-null.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "sourcesAndSourcesContentBothNull", ++ "description": "Test a source map that has both null sources and sourcesContent entries", ++ "baseFile": "sources-and-sources-content-both-null.js", ++ "sourceMapFile": "sources-and-sources-content-both-null.js.map", ++ "sourceMapIsValid": true ++ }, ++ { ++ "name": "fileNotAString1", ++ "description": "Test a source map with a file field that is not a valid string", ++ "baseFile": "file-not-a-string-1.js", ++ "sourceMapFile": "file-not-a-string-1.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "fileNotAString2", ++ "description": "Test a source map with a file field that is not a valid string", ++ "baseFile": "file-not-a-string-2.js", ++ "sourceMapFile": "file-not-a-string-2.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "sourceRootNotAString1", ++ "description": "Test a source map with a sourceRoot field that is not a valid string", ++ "baseFile": "source-root-not-a-string-1.js", ++ "sourceMapFile": "source-root-not-a-string-1.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "sourceRootNotAString2", ++ "description": "Test a source map with a sourceRoot field that is not a valid string", ++ "baseFile": "source-root-not-a-string-2.js", ++ "sourceMapFile": "source-root-not-a-string-2.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "namesMissing", ++ "description": "Test a source map that is missing a necessary names field", ++ "baseFile": "names-missing.js", ++ "sourceMapFile": "names-missing.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "namesNotAList1", ++ "description": "Test a source map with a names field that is not a valid list (string)", ++ "baseFile": "names-not-a-list-1.js", ++ "sourceMapFile": "names-not-a-list-1.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "namesNotAList2", ++ "description": "Test a source map with a names field that is not a valid list (object)", ++ "baseFile": "names-not-a-list-2.js", ++ "sourceMapFile": "names-not-a-list-2.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "namesNotString", ++ "description": "Test a source map with a names list that has non-string items", ++ "baseFile": "names-not-string.js", ++ "sourceMapFile": "names-not-string.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "ignoreListEmpty", ++ "description": "Test a source map with an ignore list that has no items", ++ "baseFile": "ignore-list-empty.js", ++ "sourceMapFile": "ignore-list-empty.js.map", ++ "sourceMapIsValid": true ++ }, ++ { ++ "name": "ignoreListValid1", ++ "description": "Test a source map with a simple valid ignore list", ++ "baseFile": "ignore-list-valid-1.js", ++ "sourceMapFile": "ignore-list-valid-1.js.map", ++ "sourceMapIsValid": true, ++ "testActions": [ ++ { ++ "actionType": "checkIgnoreList", ++ "present": ["empty-original.js"] ++ } ++ ] ++ }, ++ { ++ "name": "ignoreListWrongType1", ++ "description": "Test a source map with an ignore list with the wrong type of items", ++ "baseFile": "ignore-list-wrong-type-1.js", ++ "sourceMapFile": "ignore-list-wrong-type-1.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "ignoreListWrongType2", ++ "description": "Test a source map with an ignore list with the wrong type of items", ++ "baseFile": "ignore-list-wrong-type-2.js", ++ "sourceMapFile": "ignore-list-wrong-type-2.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "ignoreListWrongType3", ++ "description": "Test a source map with an ignore list that is not a list", ++ "baseFile": "ignore-list-wrong-type-3.js", ++ "sourceMapFile": "ignore-list-wrong-type-3.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "ignoreListOutOfBounds", ++ "description": "Test a source map with an ignore list with an item with an out-of-bounds index", ++ "baseFile": "ignore-list-out-of-bounds.js", ++ "sourceMapFile": "ignore-list-out-of-bounds.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "unrecognizedProperty", ++ "description": "Test a source map that has an extra field not explicitly encoded in the spec", ++ "baseFile": "unrecognized-property.js", ++ "sourceMapFile": "unrecognized-property.js.map", ++ "sourceMapIsValid": true ++ }, ++ { ++ "name": "invalidVLQDueToNonBase64Character", ++ "description": "Test a source map that has a mapping with an invalid non-base64 character", ++ "baseFile": "invalid-vlq-non-base64-char.js", ++ "sourceMapFile": "invalid-vlq-non-base64-char.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidVLQDueToMissingContinuationDigits", ++ "description": "Test a source map that has a mapping with an invalid VLQ that has a continuation bit but no continuing digits", ++ "baseFile": "invalid-vlq-missing-continuation.js", ++ "sourceMapFile": "invalid-vlq-missing-continuation.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidMappingNotAString1", ++ "description": "Test a source map that has an invalid mapping that is not a string (number)", ++ "baseFile": "invalid-mapping-not-a-string-1.js", ++ "sourceMapFile": "invalid-mapping-not-a-string-1.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidMappingNotAString2", ++ "description": "Test a source map that has an invalid mapping that is not a string (array)", ++ "baseFile": "invalid-mapping-not-a-string-2.js", ++ "sourceMapFile": "invalid-mapping-not-a-string-2.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidMappingSegmentBadSeparator", ++ "description": "Test a source map that uses separator characters not recognized in the spec", ++ "baseFile": "invalid-mapping-bad-separator.js", ++ "sourceMapFile": "invalid-mapping-bad-separator.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidMappingSegmentWithZeroFields", ++ "description": "Test a source map that has the wrong number (zero) of segments fields", ++ "baseFile": "invalid-mapping-segment-with-zero-fields.js", ++ "sourceMapFile": "invalid-mapping-segment-with-zero-fields.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidMappingSegmentWithTwoFields", ++ "description": "Test a source map that has the wrong number (two) of segments fields", ++ "baseFile": "invalid-mapping-segment-with-two-fields.js", ++ "sourceMapFile": "invalid-mapping-segment-with-two-fields.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidMappingSegmentWithThreeFields", ++ "description": "Test a source map that has the wrong number (three) of segments fields", ++ "baseFile": "invalid-mapping-segment-with-three-fields.js", ++ "sourceMapFile": "invalid-mapping-segment-with-three-fields.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidMappingSegmentWithSourceIndexOutOfBounds", ++ "description": "Test a source map that has a source index field that is out of bounds of the sources field", ++ "baseFile": "invalid-mapping-segment-source-index-out-of-bounds.js", ++ "sourceMapFile": "invalid-mapping-segment-source-index-out-of-bounds.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidMappingSegmentWithNameIndexOutOfBounds", ++ "description": "Test a source map that has a name index field that is out of bounds of the names field", ++ "baseFile": "invalid-mapping-segment-name-index-out-of-bounds.js", ++ "sourceMapFile": "invalid-mapping-segment-name-index-out-of-bounds.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidMappingSegmentWithNegativeColumn", ++ "description": "Test a source map that has an invalid negative non-relative column field", ++ "baseFile": "invalid-mapping-segment-negative-column.js", ++ "sourceMapFile": "invalid-mapping-segment-negative-column.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidMappingSegmentWithNegativeSourceIndex", ++ "description": "Test a source map that has an invalid negative non-relative source index field", ++ "baseFile": "invalid-mapping-segment-negative-source-index.js", ++ "sourceMapFile": "invalid-mapping-segment-negative-source-index.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidMappingSegmentWithNegativeOriginalLine", ++ "description": "Test a source map that has an invalid negative non-relative original line field", ++ "baseFile": "invalid-mapping-segment-negative-original-line.js", ++ "sourceMapFile": "invalid-mapping-segment-negative-original-line.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidMappingSegmentWithNegativeOriginalColumn", ++ "description": "Test a source map that has an invalid negative non-relative original column field", ++ "baseFile": "invalid-mapping-segment-negative-original-column.js", ++ "sourceMapFile": "invalid-mapping-segment-negative-original-column.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidMappingSegmentWithNegativeNameIndex", ++ "description": "Test a source map that has an invalid negative non-relative name index field", ++ "baseFile": "invalid-mapping-segment-negative-name-index.js", ++ "sourceMapFile": "invalid-mapping-segment-negative-name-index.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidMappingSegmentWithNegativeRelativeColumn", ++ "description": "Test a source map that has an invalid negative relative column field", ++ "baseFile": "invalid-mapping-segment-negative-relative-column.js", ++ "sourceMapFile": "invalid-mapping-segment-negative-relative-column.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidMappingSegmentWithNegativeRelativeSourceIndex", ++ "description": "Test a source map that has an invalid negative relative source index field", ++ "baseFile": "invalid-mapping-segment-negative-relative-source-index.js", ++ "sourceMapFile": "invalid-mapping-segment-negative-relative-source-index.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidMappingSegmentWithNegativeRelativeOriginalLine", ++ "description": "Test a source map that has an invalid negative relative original line field", ++ "baseFile": "invalid-mapping-segment-negative-relative-original-line.js", ++ "sourceMapFile": "invalid-mapping-segment-negative-relative-original-line.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidMappingSegmentWithNegativeRelativeOriginalColumn", ++ "description": "Test a source map that has an invalid negative relative original column field", ++ "baseFile": "invalid-mapping-segment-negative-relative-original-column.js", ++ "sourceMapFile": "invalid-mapping-segment-negative-relative-original-column.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidMappingSegmentWithNegativeRelativeNameIndex", ++ "description": "Test a source map that has an invalid negative relative name index field", ++ "baseFile": "invalid-mapping-segment-negative-relative-name-index.js", ++ "sourceMapFile": "invalid-mapping-segment-negative-relative-name-index.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidMappingSegmentWithColumnExceeding32Bits", ++ "description": "Test a source map that has a column field that exceeds 32 bits", ++ "baseFile": "invalid-mapping-segment-column-too-large.js", ++ "sourceMapFile": "invalid-mapping-segment-column-too-large.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidMappingSegmentWithSourceIndexExceeding32Bits", ++ "description": "Test a source map that has a source index field that exceeds 32 bits", ++ "baseFile": "invalid-mapping-segment-source-index-too-large.js", ++ "sourceMapFile": "invalid-mapping-segment-source-index-too-large.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidMappingSegmentWithOriginalLineExceeding32Bits", ++ "description": "Test a source map that has a original line field that exceeds 32 bits", ++ "baseFile": "invalid-mapping-segment-original-line-too-large.js", ++ "sourceMapFile": "invalid-mapping-segment-original-line-too-large.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidMappingSegmentWithOriginalColumnExceeding32Bits", ++ "description": "Test a source map that has an original column field that exceeds 32 bits", ++ "baseFile": "invalid-mapping-segment-original-column-too-large.js", ++ "sourceMapFile": "invalid-mapping-segment-original-column-too-large.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidMappingSegmentWithNameIndexExceeding32Bits", ++ "description": "Test a source map that has a name index field that exceeds 32 bits", ++ "baseFile": "invalid-mapping-segment-name-index-too-large.js", ++ "sourceMapFile": "invalid-mapping-segment-name-index-too-large.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "validMappingFieldsWith32BitMaxValues", ++ "description": "Test a source map that has segment fields with max values representable in 32 bits", ++ "baseFile": "valid-mapping-boundary-values.js", ++ "sourceMapFile": "valid-mapping-boundary-values.js.map", ++ "sourceMapIsValid": true ++ }, ++ { ++ "name": "validMappingLargeVLQ", ++ "description": "Test a source map that has a segment field VLQ that is very long but within 32-bits", ++ "baseFile": "valid-mapping-large-vlq.js", ++ "sourceMapFile": "valid-mapping-large-vlq.js.map", ++ "sourceMapIsValid": true ++ }, ++ { ++ "name": "validMappingEmptyGroups", ++ "description": "Test a source map with a mapping that has many empty groups", ++ "baseFile": "valid-mapping-empty-groups.js", ++ "sourceMapFile": "valid-mapping-empty-groups.js.map", ++ "sourceMapIsValid": true ++ }, ++ { ++ "name": "validMappingEmptyString", ++ "description": "Test a source map with an empty string mapping", ++ "baseFile": "valid-mapping-empty-string.js", ++ "sourceMapFile": "valid-mapping-empty-string.js.map", ++ "sourceMapIsValid": true ++ }, ++ { ++ "name": "indexMapWrongTypeSections", ++ "description": "Test an index map with a sections field with the wrong type", ++ "baseFile": "index-map-wrong-type-sections.js", ++ "sourceMapFile": "index-map-wrong-type-sections.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "indexMapWrongTypeOffset", ++ "description": "Test an index map with an offset field with the wrong type", ++ "baseFile": "index-map-wrong-type-offset.js", ++ "sourceMapFile": "index-map-wrong-type-offset.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "indexMapWrongTypeMap", ++ "description": "Test an index map with a map field with the wrong type", ++ "baseFile": "index-map-wrong-type-map.js", ++ "sourceMapFile": "index-map-wrong-type-map.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "indexMapInvalidBaseMappings", ++ "description": "Test that an index map cannot also have a regular mappings field", ++ "baseFile": "index-map-invalid-base-mappings.js", ++ "sourceMapFile": "index-map-invalid-base-mappings.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "indexMapInvalidOverlap", ++ "description": "Test that an invalid index map with multiple sections that overlap", ++ "baseFile": "index-map-invalid-overlap.js", ++ "sourceMapFile": "index-map-invalid-overlap.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "indexMapInvalidOrder", ++ "description": "Test that an invalid index map with multiple sections in the wrong order", ++ "baseFile": "index-map-invalid-order.js", ++ "sourceMapFile": "index-map-invalid-order.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "indexMapMissingMap", ++ "description": "Test that an index map that is missing a section map", ++ "baseFile": "index-map-missing-map.js", ++ "sourceMapFile": "index-map-missing-map.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "indexMapInvalidSubMap", ++ "description": "Test that an index map that has an invalid section map", ++ "baseFile": "index-map-invalid-sub-map.js", ++ "sourceMapFile": "index-map-invalid-sub-map.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "indexMapMissingOffset", ++ "description": "Test that an index map that is missing a section offset", ++ "baseFile": "index-map-missing-offset.js", ++ "sourceMapFile": "index-map-missing-offset.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "indexMapMissingOffsetLine", ++ "description": "Test that an index map that is missing a section offset's line field", ++ "baseFile": "index-map-missing-offset-line.js", ++ "sourceMapFile": "index-map-missing-offset-line.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "indexMapMissingOffsetColumn", ++ "description": "Test that an index map that is missing a section offset's column field", ++ "baseFile": "index-map-missing-offset-column.js", ++ "sourceMapFile": "index-map-missing-offset-column.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "indexMapOffsetLineWrongType", ++ "description": "Test that an index map that has an offset line field with the wrong type of value", ++ "baseFile": "index-map-offset-line-wrong-type.js", ++ "sourceMapFile": "index-map-offset-line-wrong-type.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "indexMapOffsetColumnWrongType", ++ "description": "Test that an index map that has an offset column field with the wrong type of value", ++ "baseFile": "index-map-offset-column-wrong-type.js", ++ "sourceMapFile": "index-map-offset-column-wrong-type.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "indexMapEmptySections", ++ "description": "Test a trivial index map with no sections", ++ "baseFile": "index-map-empty-sections.js", ++ "sourceMapFile": "index-map-empty-sections.js.map", ++ "sourceMapIsValid": true ++ }, ++ { ++ "name": "indexMapFileWrongType1", ++ "description": "Test an index map with a file field with the wrong type", ++ "baseFile": "index-map-file-wrong-type-1.js", ++ "sourceMapFile": "index-map-file-wrong-type-1.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "indexMapFileWrongType2", ++ "description": "Test an index map with a file field with the wrong type", ++ "baseFile": "index-map-file-wrong-type-2.js", ++ "sourceMapFile": "index-map-file-wrong-type-2.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "basicMapping", ++ "description": "Test a simple source map that has several valid mappings", ++ "baseFile": "basic-mapping.js", ++ "sourceMapFile": "basic-mapping.js.map", ++ "sourceMapIsValid": true, ++ "testActions": [ ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 0, ++ "originalSource": "basic-mapping-original.js", ++ "originalLine": 0, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 9, ++ "originalSource": "basic-mapping-original.js", ++ "originalLine": 0, ++ "originalColumn": 9, ++ "mappedName": "foo" ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 15, ++ "originalLine": 1, ++ "originalColumn": 2, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 22, ++ "originalLine": 1, ++ "originalColumn": 9, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 24, ++ "originalLine": 2, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 25, ++ "originalLine": 3, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 34, ++ "originalSource": "basic-mapping-original.js", ++ "originalLine": 3, ++ "originalColumn": 9, ++ "mappedName": "bar" ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 40, ++ "originalLine": 4, ++ "originalColumn": 2, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 47, ++ "originalLine": 4, ++ "originalColumn": 9, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 49, ++ "originalLine": 5, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 50, ++ "originalLine": 6, ++ "originalColumn": 0, ++ "mappedName": "foo" ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 56, ++ "originalLine": 7, ++ "originalColumn": 0, ++ "mappedName": "bar" ++ } ++ ] ++ }, ++ { ++ "name": "sourceRootResolution", ++ "description": "Similar to basic mapping test, but test resoultion of sources with a sourceRoot field", ++ "baseFile": "source-root-resolution.js", ++ "sourceMapFile": "source-root-resolution.js.map", ++ "sourceMapIsValid": true, ++ "testActions": [ ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 0, ++ "originalSource": "theroot/basic-mapping-original.js", ++ "originalLine": 0, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 9, ++ "originalSource": "theroot/basic-mapping-original.js", ++ "originalLine": 0, ++ "originalColumn": 9, ++ "mappedName": "foo" ++ } ++ ] ++ }, ++ { ++ "name": "sourceResolutionAbsoluteURL", ++ "description": "Test resoultion of sources with absolute URLs", ++ "baseFile": "source-resolution-absolute-url.js", ++ "sourceMapFile": "source-resolution-absolute-url.js.map", ++ "sourceMapIsValid": true, ++ "testActions": [ ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 0, ++ "originalSource": "/baz/quux/basic-mapping-original.js", ++ "originalLine": 0, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 9, ++ "originalSource": "/baz/quux/basic-mapping-original.js", ++ "originalLine": 0, ++ "originalColumn": 9, ++ "mappedName": "foo" ++ } ++ ] ++ }, ++ { ++ "name": "basicMappingWithIndexMap", ++ "description": "Test a version of basic-mapping.js.map that is split into sections with an index map", ++ "baseFile": "basic-mapping-as-index-map.js", ++ "sourceMapFile": "basic-mapping-as-index-map.js.map", ++ "sourceMapIsValid": true, ++ "testActions": [ ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 0, ++ "originalSource": "basic-mapping-original.js", ++ "originalLine": 0, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 9, ++ "originalSource": "basic-mapping-original.js", ++ "originalLine": 0, ++ "originalColumn": 9, ++ "mappedName": "foo" ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 15, ++ "originalLine": 1, ++ "originalColumn": 2, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 22, ++ "originalLine": 1, ++ "originalColumn": 9, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 24, ++ "originalLine": 2, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 25, ++ "originalLine": 3, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 34, ++ "originalSource": "basic-mapping-original.js", ++ "originalLine": 3, ++ "originalColumn": 9, ++ "mappedName": "bar" ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 40, ++ "originalLine": 4, ++ "originalColumn": 2, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 47, ++ "originalLine": 4, ++ "originalColumn": 9, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 49, ++ "originalLine": 5, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 50, ++ "originalLine": 6, ++ "originalColumn": 0, ++ "mappedName": "foo" ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 56, ++ "originalLine": 7, ++ "originalColumn": 0, ++ "mappedName": "bar" ++ } ++ ] ++ }, ++ { ++ "name": "indexMapWithMissingFile", ++ "description": "Same as the basic mapping index map test but without the optional file field", ++ "baseFile": "index-map-missing-file.js", ++ "sourceMapFile": "index-map-missing-file.js.map", ++ "sourceMapIsValid": true, ++ "testActions": [ ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 0, ++ "originalSource": "basic-mapping-original.js", ++ "originalLine": 0, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 9, ++ "originalSource": "basic-mapping-original.js", ++ "originalLine": 0, ++ "originalColumn": 9, ++ "mappedName": "foo" ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 15, ++ "originalLine": 1, ++ "originalColumn": 2, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 22, ++ "originalLine": 1, ++ "originalColumn": 9, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 24, ++ "originalLine": 2, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 25, ++ "originalLine": 3, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 34, ++ "originalSource": "basic-mapping-original.js", ++ "originalLine": 3, ++ "originalColumn": 9, ++ "mappedName": "bar" ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 40, ++ "originalLine": 4, ++ "originalColumn": 2, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 47, ++ "originalLine": 4, ++ "originalColumn": 9, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 49, ++ "originalLine": 5, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 50, ++ "originalLine": 6, ++ "originalColumn": 0, ++ "mappedName": "foo" ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 56, ++ "originalLine": 7, ++ "originalColumn": 0, ++ "mappedName": "bar" ++ } ++ ] ++ }, ++ { ++ "name": "indexMapWithTwoConcatenatedSources", ++ "description": "Test an index map that has two sub-maps for concatenated sources", ++ "baseFile": "index-map-two-concatenated-sources.js", ++ "sourceMapFile": "index-map-two-concatenated-sources.js.map", ++ "sourceMapIsValid": true, ++ "testActions": [ ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 0, ++ "originalSource": "basic-mapping-original.js", ++ "originalLine": 0, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 9, ++ "originalSource": "basic-mapping-original.js", ++ "originalLine": 0, ++ "originalColumn": 9, ++ "mappedName": "foo" ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 15, ++ "originalLine": 1, ++ "originalColumn": 2, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 22, ++ "originalLine": 1, ++ "originalColumn": 9, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 24, ++ "originalLine": 2, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 25, ++ "originalLine": 3, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 34, ++ "originalSource": "basic-mapping-original.js", ++ "originalLine": 3, ++ "originalColumn": 9, ++ "mappedName": "bar" ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 40, ++ "originalLine": 4, ++ "originalColumn": 2, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 47, ++ "originalLine": 4, ++ "originalColumn": 9, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 49, ++ "originalLine": 5, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 50, ++ "originalLine": 6, ++ "originalColumn": 0, ++ "mappedName": "foo" ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 56, ++ "originalLine": 7, ++ "originalColumn": 0, ++ "mappedName": "bar" ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "second-source-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 62, ++ "originalLine": 0, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "second-source-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 71, ++ "originalLine": 0, ++ "originalColumn": 9, ++ "mappedName": "baz" ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "second-source-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 77, ++ "originalLine": 1, ++ "originalColumn": 2, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "second-source-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 83, ++ "originalLine": 1, ++ "originalColumn": 9, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "second-source-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 88, ++ "originalLine": 2, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "second-source-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 89, ++ "originalLine": 3, ++ "originalColumn": 0, ++ "mappedName": "baz" ++ } ++ ] ++ }, ++ { ++ "name": "sourcesNullSourcesContentNonNull", ++ "description": "Test a source map that has a null source but has a sourcesContent", ++ "baseFile": "sources-null-sources-content-non-null.js", ++ "sourceMapFile": "sources-null-sources-content-non-null.js.map", ++ "sourceMapIsValid": true, ++ "testActions": [ ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 0, ++ "originalSource": null, ++ "originalLine": 0, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 9, ++ "originalSource": null, ++ "originalLine": 0, ++ "originalColumn": 9, ++ "mappedName": "foo" ++ } ++ ] ++ }, ++ { ++ "name": "sourcesNonNullSourcesContentNull", ++ "description": "Test a source map that has a non-null source but has a null sourcesContent", ++ "baseFile": "sources-non-null-sources-content-null.js", ++ "sourceMapFile": "sources-non-null-sources-content-null.js.map", ++ "sourceMapIsValid": true, ++ "testActions": [ ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 0, ++ "originalSource": "basic-mapping-original.js", ++ "originalLine": 0, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 9, ++ "originalSource": "basic-mapping-original.js", ++ "originalLine": 0, ++ "originalColumn": 9, ++ "mappedName": "foo" ++ } ++ ] ++ }, ++ { ++ "name": "transitiveMapping", ++ "description": "Test a simple two-stage transitive mapping from a minified JS to a TypeScript source", ++ "baseFile": "transitive-mapping.js", ++ "sourceMapFile": "transitive-mapping.js.map", ++ "sourceMapIsValid": true, ++ "testActions": [ ++ { ++ "actionType": "checkMappingTransitive", ++ "generatedLine": 0, ++ "generatedColumn": 0, ++ "originalSource": "typescript-original.ts", ++ "intermediateMaps": ["transitive-mapping-original.js.map"], ++ "originalLine": 1, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMappingTransitive", ++ "generatedLine": 0, ++ "generatedColumn": 9, ++ "originalSource": "typescript-original.ts", ++ "intermediateMaps": ["transitive-mapping-original.js.map"], ++ "originalLine": 1, ++ "originalColumn": 9, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMappingTransitive", ++ "generatedLine": 0, ++ "generatedColumn": 13, ++ "originalSource": "typescript-original.ts", ++ "intermediateMaps": ["transitive-mapping-original.js.map"], ++ "originalLine": 1, ++ "originalColumn": 13, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMappingTransitive", ++ "generatedLine": 0, ++ "generatedColumn": 16, ++ "originalSource": "typescript-original.ts", ++ "intermediateMaps": ["transitive-mapping-original.js.map"], ++ "originalLine": 2, ++ "originalColumn": 2, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMappingTransitive", ++ "generatedLine": 0, ++ "generatedColumn": 23, ++ "originalSource": "typescript-original.ts", ++ "intermediateMaps": ["transitive-mapping-original.js.map"], ++ "originalLine": 2, ++ "originalColumn": 9, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMappingTransitive", ++ "generatedLine": 0, ++ "generatedColumn": 24, ++ "originalSource": "typescript-original.ts", ++ "intermediateMaps": ["transitive-mapping-original.js.map"], ++ "originalLine": 3, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMappingTransitive", ++ "generatedLine": 0, ++ "generatedColumn": 25, ++ "originalSource": "typescript-original.ts", ++ "intermediateMaps": ["transitive-mapping-original.js.map"], ++ "originalLine": 4, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMappingTransitive", ++ "generatedLine": 0, ++ "generatedColumn": 29, ++ "originalSource": "typescript-original.ts", ++ "intermediateMaps": ["transitive-mapping-original.js.map"], ++ "originalLine": 4, ++ "originalColumn": 4, ++ "mappedName": null ++ } ++ ] ++ }, ++ { ++ "name": "transitiveMappingWithThreeSteps", ++ "description": "Test a three-stage transitive mapping from an un-minified JS to minified JS to a TypeScript source", ++ "baseFile": "transitive-mapping-three-steps.js", ++ "sourceMapFile": "transitive-mapping-three-steps.js.map", ++ "sourceMapIsValid": true, ++ "testActions": [ ++ { ++ "actionType": "checkMappingTransitive", ++ "generatedLine": 0, ++ "generatedColumn": 0, ++ "originalSource": "typescript-original.ts", ++ "intermediateMaps": ["transitive-mapping.js.map", "transitive-mapping-original.js.map"], ++ "originalLine": 1, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMappingTransitive", ++ "generatedLine": 0, ++ "generatedColumn": 9, ++ "originalSource": "typescript-original.ts", ++ "intermediateMaps": ["transitive-mapping.js.map", "transitive-mapping-original.js.map"], ++ "originalLine": 1, ++ "originalColumn": 9, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMappingTransitive", ++ "generatedLine": 0, ++ "generatedColumn": 13, ++ "originalSource": "typescript-original.ts", ++ "intermediateMaps": ["transitive-mapping.js.map", "transitive-mapping-original.js.map"], ++ "originalLine": 1, ++ "originalColumn": 13, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMappingTransitive", ++ "generatedLine": 1, ++ "generatedColumn": 4, ++ "originalSource": "typescript-original.ts", ++ "intermediateMaps": ["transitive-mapping.js.map", "transitive-mapping-original.js.map"], ++ "originalLine": 2, ++ "originalColumn": 2, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMappingTransitive", ++ "generatedLine": 1, ++ "generatedColumn": 11, ++ "originalSource": "typescript-original.ts", ++ "intermediateMaps": ["transitive-mapping.js.map", "transitive-mapping-original.js.map"], ++ "originalLine": 2, ++ "originalColumn": 9, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMappingTransitive", ++ "generatedLine": 2, ++ "generatedColumn": 0, ++ "originalSource": "typescript-original.ts", ++ "intermediateMaps": ["transitive-mapping.js.map", "transitive-mapping-original.js.map"], ++ "originalLine": 3, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMappingTransitive", ++ "generatedLine": 4, ++ "generatedColumn": 0, ++ "originalSource": "typescript-original.ts", ++ "intermediateMaps": ["transitive-mapping.js.map", "transitive-mapping-original.js.map"], ++ "originalLine": 4, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMappingTransitive", ++ "generatedLine": 4, ++ "generatedColumn": 4, ++ "originalSource": "typescript-original.ts", ++ "intermediateMaps": ["transitive-mapping.js.map", "transitive-mapping-original.js.map"], ++ "originalLine": 4, ++ "originalColumn": 4, ++ "mappedName": null ++ } ++ ] ++ }, ++ { ++ "name": "vlqValidSingleDigit", ++ "description": "Test VLQ decoding for a single digit, no continuation VLQ", ++ "baseFile": "vlq-valid-single-digit.js", ++ "sourceMapFile": "vlq-valid-single-digit.js.map", ++ "sourceMapIsValid": true, ++ "testActions": [ ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 15, ++ "originalSource": "vlq-valid-single-digit-original.js", ++ "originalLine": 0, ++ "originalColumn": 0, ++ "mappedName": null ++ } ++ ] ++ }, ++ { ++ "name": "vlqValidNegativeDigit", ++ "description": "Test VLQ decoding where there's a negative digit, no continuation bit", ++ "baseFile": "vlq-valid-negative-digit.js", ++ "sourceMapFile": "vlq-valid-negative-digit.js.map", ++ "sourceMapIsValid": true, ++ "testActions": [ ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 2, ++ "generatedColumn": 15, ++ "originalSource": "vlq-valid-negative-digit-original.js", ++ "originalLine": 1, ++ "originalColumn": 2, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 2, ++ "generatedColumn": 2, ++ "originalSource": "vlq-valid-negative-digit-original.js", ++ "originalLine": 1, ++ "originalColumn": 1, ++ "mappedName": null ++ } ++ ] ++ }, ++ { ++ "name": "vlqValidContinuationBitPresent1", ++ "description": "Test VLQ decoding where continuation bits are present (continuations are leading zero)", ++ "baseFile": "vlq-valid-continuation-bit-present-1.js", ++ "sourceMapFile": "vlq-valid-continuation-bit-present-1.js.map", ++ "sourceMapIsValid": true, ++ "testActions": [ ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 15, ++ "originalSource": "vlq-valid-continuation-bit-present-1-original.js", ++ "originalLine": 0, ++ "originalColumn": 1, ++ "mappedName": null ++ } ++ ] ++ }, ++ { ++ "name": "vlqValidContinuationBitPresent2", ++ "description": "Test VLQ decoding where continuation bits are present (continuations have non-zero bits)", ++ "baseFile": "vlq-valid-continuation-bit-present-2.js", ++ "sourceMapFile": "vlq-valid-continuation-bit-present-2.js.map", ++ "sourceMapIsValid": true, ++ "testActions": [ ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 2, ++ "generatedColumn": 16, ++ "originalSource": "vlq-valid-continuation-bit-present-2-original.js", ++ "originalLine": 1, ++ "originalColumn": 1, ++ "mappedName": null ++ } ++ ] ++ }, ++ { ++ "name": "mappingSemanticsSingleFieldSegment", ++ "description": "Test mapping semantics for a single field segment mapping", ++ "baseFile": "mapping-semantics-single-field-segment.js", ++ "sourceMapFile": "mapping-semantics-single-field-segment.js.map", ++ "sourceMapIsValid": true, ++ "testActions": [ ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 0, ++ "originalSource": "mapping-semantics-single-field-segment-original.js", ++ "originalLine": 0, ++ "originalColumn": 1, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 2, ++ "originalSource": null, ++ "originalLine": null, ++ "originalColumn": null, ++ "mappedName": null ++ } ++ ] ++ }, ++ { ++ "name": "mappingSemanticsFourFieldSegment", ++ "description": "Test mapping semantics for a four field segment mapping", ++ "baseFile": "mapping-semantics-four-field-segment.js", ++ "sourceMapFile": "mapping-semantics-four-field-segment.js.map", ++ "sourceMapIsValid": true, ++ "testActions": [ ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 1, ++ "originalSource": "mapping-semantics-four-field-segment-original.js", ++ "originalLine": 2, ++ "originalColumn": 2, ++ "mappedName": null ++ } ++ ] ++ }, ++ { ++ "name": "mappingSemanticsFiveFieldSegment", ++ "description": "Test mapping semantics for a five field segment mapping", ++ "baseFile": "mapping-semantics-five-field-segment.js", ++ "sourceMapFile": "mapping-semantics-five-field-segment.js.map", ++ "sourceMapIsValid": true, ++ "testActions": [ ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 1, ++ "originalSource": "mapping-semantics-five-field-segment-original.js", ++ "originalLine": 2, ++ "originalColumn": 2, ++ "mappedName": "foo" ++ } ++ ] ++ }, ++ { ++ "name": "mappingSemanticsColumnReset", ++ "description": "Test that the generated column field resets to zero on new lines", ++ "baseFile": "mapping-semantics-column-reset.js", ++ "sourceMapFile": "mapping-semantics-column-reset.js.map", ++ "sourceMapIsValid": true, ++ "testActions": [ ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 1, ++ "originalSource": "mapping-semantics-column-reset-original.js", ++ "originalLine": 0, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 1, ++ "generatedColumn": 1, ++ "originalSource": "mapping-semantics-column-reset-original.js", ++ "originalLine": 1, ++ "originalColumn": 0, ++ "mappedName": null ++ } ++ ] ++ }, ++ { ++ "name": "mappingSemanticsRelative1", ++ "description": "Test that fields are calculated relative to previous ones", ++ "baseFile": "mapping-semantics-relative-1.js", ++ "sourceMapFile": "mapping-semantics-relative-1.js.map", ++ "sourceMapIsValid": true, ++ "testActions": [ ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 1, ++ "originalSource": "mapping-semantics-relative-1-original.js", ++ "originalLine": 0, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 5, ++ "originalSource": "mapping-semantics-relative-1-original.js", ++ "originalLine": 0, ++ "originalColumn": 4, ++ "mappedName": null ++ } ++ ] ++ }, ++ { ++ "name": "mappingSemanticsRelative2", ++ "description": "Test that fields are calculated relative to previous ones, across lines", ++ "baseFile": "mapping-semantics-relative-2.js", ++ "sourceMapFile": "mapping-semantics-relative-2.js.map", ++ "sourceMapIsValid": true, ++ "testActions": [ ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 1, ++ "originalSource": "mapping-semantics-relative-2-original.js", ++ "originalLine": 0, ++ "originalColumn": 2, ++ "mappedName": "foo" ++ }, ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 1, ++ "generatedColumn": 2, ++ "originalSource": "mapping-semantics-relative-2-original.js", ++ "originalLine": 1, ++ "originalColumn": 2, ++ "mappedName": "bar" ++ } ++ ] ++ } ++ ] ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/sources-and-sources-content-both-null.js b/front_end/core/sdk/fixtures/sourcemaps/sources-and-sources-content-both-null.js +new file mode 100644 +index 0000000000..9263eba549 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/sources-and-sources-content-both-null.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=sources-and-sources-content-both-null.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/sources-and-sources-content-both-null.js.map b/front_end/core/sdk/fixtures/sourcemaps/sources-and-sources-content-both-null.js.map +new file mode 100644 +index 0000000000..09a7c1f369 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/sources-and-sources-content-both-null.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "names": ["foo"], ++ "sources": [null], ++ "sourcesContent": [null], ++ "mappings":"AAAA,SAASA" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/sources-missing.js b/front_end/core/sdk/fixtures/sourcemaps/sources-missing.js +new file mode 100644 +index 0000000000..779b865e27 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/sources-missing.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=sources-missing.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/sources-missing.js.map b/front_end/core/sdk/fixtures/sourcemaps/sources-missing.js.map +new file mode 100644 +index 0000000000..92aff4fb0e +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/sources-missing.js.map +@@ -0,0 +1,5 @@ ++{ ++ "version" : 3, ++ "names": ["foo"], ++ "mappings": "" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/sources-non-null-sources-content-null.js b/front_end/core/sdk/fixtures/sourcemaps/sources-non-null-sources-content-null.js +new file mode 100644 +index 0000000000..939b568ba1 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/sources-non-null-sources-content-null.js +@@ -0,0 +1,2 @@ ++function foo(){return 42}function bar(){return 24}foo();bar(); ++//# sourceMappingURL=sources-non-null-sources-content-null.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/sources-non-null-sources-content-null.js.map b/front_end/core/sdk/fixtures/sourcemaps/sources-non-null-sources-content-null.js.map +new file mode 100644 +index 0000000000..e573906b2d +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/sources-non-null-sources-content-null.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "names": ["foo"], ++ "sources": ["basic-mapping-original.js"], ++ "sourcesContent": [null], ++ "mappings":"AAAA,SAASA" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/sources-not-a-list-1.js b/front_end/core/sdk/fixtures/sourcemaps/sources-not-a-list-1.js +new file mode 100644 +index 0000000000..7e33b7e867 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/sources-not-a-list-1.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=sources-not-a-list-1.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/sources-not-a-list-1.js.map b/front_end/core/sdk/fixtures/sourcemaps/sources-not-a-list-1.js.map +new file mode 100644 +index 0000000000..26330517b9 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/sources-not-a-list-1.js.map +@@ -0,0 +1,6 @@ ++{ ++ "version" : 3, ++ "sources": "not a list", ++ "names": ["foo"], ++ "mappings": "AAAAA" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/sources-not-a-list-2.js b/front_end/core/sdk/fixtures/sourcemaps/sources-not-a-list-2.js +new file mode 100644 +index 0000000000..4021f763fc +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/sources-not-a-list-2.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=sources-not-a-list-2.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/sources-not-a-list-2.js.map b/front_end/core/sdk/fixtures/sourcemaps/sources-not-a-list-2.js.map +new file mode 100644 +index 0000000000..2ed85962fd +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/sources-not-a-list-2.js.map +@@ -0,0 +1,6 @@ ++{ ++ "version" : 3, ++ "sources": { "source.js": 3 }, ++ "names": ["foo"], ++ "mappings": "AAAAA" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/sources-not-string-or-null.js b/front_end/core/sdk/fixtures/sourcemaps/sources-not-string-or-null.js +new file mode 100644 +index 0000000000..7dca97a1da +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/sources-not-string-or-null.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=sources-not-string-or-null.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/sources-not-string-or-null.js.map b/front_end/core/sdk/fixtures/sourcemaps/sources-not-string-or-null.js.map +new file mode 100644 +index 0000000000..db25561966 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/sources-not-string-or-null.js.map +@@ -0,0 +1,6 @@ ++{ ++ "version" : 3, ++ "sources": [3, {}, true, false, []], ++ "names": ["foo"], ++ "mappings": "AAAAA" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/sources-null-sources-content-non-null.js b/front_end/core/sdk/fixtures/sourcemaps/sources-null-sources-content-non-null.js +new file mode 100644 +index 0000000000..a760594ee9 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/sources-null-sources-content-non-null.js +@@ -0,0 +1,2 @@ ++function foo(){return 42}function bar(){return 24}foo();bar(); ++//# sourceMappingURL=sources-null-sources-content-non-null.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/sources-null-sources-content-non-null.js.map b/front_end/core/sdk/fixtures/sourcemaps/sources-null-sources-content-non-null.js.map +new file mode 100644 +index 0000000000..43af03903f +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/sources-null-sources-content-non-null.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version":3, ++ "names": ["foo"], ++ "sources": [null], ++ "sourcesContent": ["function foo()\n{ return 42; }\nfunction bar()\n { return 24; }\nfoo();\nbar();"], ++ "mappings":"AAAA,SAASA" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/transitive-mapping-original.js b/front_end/core/sdk/fixtures/sourcemaps/transitive-mapping-original.js +new file mode 100644 +index 0000000000..0a96699d6e +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/transitive-mapping-original.js +@@ -0,0 +1,5 @@ ++function foo(x) { ++ return x; ++} ++foo("foo"); ++//# sourceMappingURL=transitive-mapping-original.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/transitive-mapping-original.js.map b/front_end/core/sdk/fixtures/sourcemaps/transitive-mapping-original.js.map +new file mode 100644 +index 0000000000..65af25c1eb +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/transitive-mapping-original.js.map +@@ -0,0 +1,8 @@ ++{ ++ "version": 3, ++ "file" : "transitive-mapping-original.js", ++ "sourceRoot": "", ++ "sources": ["typescript-original.ts"], ++ "names": [], ++ "mappings": "AACA,SAAS,GAAG,CAAC,CAAU;IACrB,OAAO,CAAC,CAAC;AACX,CAAC;AACD,GAAG,CAAC,KAAK,CAAC,CAAC" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/transitive-mapping-three-steps.js b/front_end/core/sdk/fixtures/sourcemaps/transitive-mapping-three-steps.js +new file mode 100644 +index 0000000000..fd956164d3 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/transitive-mapping-three-steps.js +@@ -0,0 +1,6 @@ ++function foo(x) { ++ return x; ++} ++ ++foo("foo"); ++//# sourceMappingURL=transitive-mapping-three-steps.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/transitive-mapping-three-steps.js.map b/front_end/core/sdk/fixtures/sourcemaps/transitive-mapping-three-steps.js.map +new file mode 100644 +index 0000000000..90459d90f6 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/transitive-mapping-three-steps.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "file": "transitive-mapping-three-steps.js", ++ "sources": ["transitive-mapping.js"], ++ "names": ["foo", "x"], ++ "mappings": "AAAA,SAASA,IAAIC;IAAG,OAAOA;AAAC;;AAACD,IAAI,KAAK" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/transitive-mapping.js b/front_end/core/sdk/fixtures/sourcemaps/transitive-mapping.js +new file mode 100644 +index 0000000000..183c027f1b +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/transitive-mapping.js +@@ -0,0 +1,2 @@ ++function foo(x){return x}foo("foo"); ++//# sourceMappingURL=transitive-mapping.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/transitive-mapping.js.map b/front_end/core/sdk/fixtures/sourcemaps/transitive-mapping.js.map +new file mode 100644 +index 0000000000..d6a6fa6672 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/transitive-mapping.js.map +@@ -0,0 +1,6 @@ ++{ ++ "version": 3, ++ "names": ["foo","x"], ++ "sources": ["transitive-mapping-original.js"], ++ "mappings":"AAAA,SAASA,IAAIC,GACT,OAAOA,CACX,CACAD,IAAI" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/typescript-original.ts b/front_end/core/sdk/fixtures/sourcemaps/typescript-original.ts +new file mode 100644 +index 0000000000..cd51c01ba1 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/typescript-original.ts +@@ -0,0 +1,5 @@ ++type FooArg = string | number; ++function foo(x : FooArg) { ++ return x; ++} ++foo("foo"); +diff --git a/front_end/core/sdk/fixtures/sourcemaps/unrecognized-property.js b/front_end/core/sdk/fixtures/sourcemaps/unrecognized-property.js +new file mode 100644 +index 0000000000..19dfb0e2e6 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/unrecognized-property.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=unrecognized-property.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/unrecognized-property.js.map b/front_end/core/sdk/fixtures/sourcemaps/unrecognized-property.js.map +new file mode 100644 +index 0000000000..40bee558a4 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/unrecognized-property.js.map +@@ -0,0 +1,8 @@ ++{ ++ "version" : 3, ++ "sources": [], ++ "names": [], ++ "mappings": "", ++ "foobar": 42, ++ "unusedProperty": [1, 2, 3, 4] ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-boundary-values.js b/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-boundary-values.js +new file mode 100644 +index 0000000000..3c49709e05 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-boundary-values.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=valid-mapping-boundary-values.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-boundary-values.js.map b/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-boundary-values.js.map +new file mode 100644 +index 0000000000..4dd836e63d +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-boundary-values.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "names": ["foo"], ++ "file": "valid-mapping-boundary-values.js", ++ "sources": ["empty-original.js"], ++ "mappings": "+/////DA+/////D+/////DA" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-empty-groups.js b/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-empty-groups.js +new file mode 100644 +index 0000000000..a2b767b619 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-empty-groups.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=valid-mapping-empty-groups.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-empty-groups.js.map b/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-empty-groups.js.map +new file mode 100644 +index 0000000000..643c9ae784 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-empty-groups.js.map +@@ -0,0 +1,8 @@ ++{ ++ "version": 3, ++ "names": [], ++ "file": "valid-mapping-empty-groups.js", ++ "sources": ["empty-original.js"], ++ "sourcesContent": [""], ++ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-large-vlq.js b/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-large-vlq.js +new file mode 100644 +index 0000000000..b0cd897813 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-large-vlq.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=valid-mapping-large-vlq.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-large-vlq.js.map b/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-large-vlq.js.map +new file mode 100644 +index 0000000000..76e18704c4 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-large-vlq.js.map +@@ -0,0 +1,6 @@ ++{ ++ "version": 3, ++ "names": [], ++ "sources": ["valid-mapping-large-vlq.js"], ++ "mappings": "igggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggA" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-null-sources.js b/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-null-sources.js +new file mode 100644 +index 0000000000..ee2acf0f5b +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-null-sources.js +@@ -0,0 +1,2 @@ ++function foo(){return 42}function bar(){return 24}foo();bar(); ++//# sourceMappingURL=valid-mapping-null-sources.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-null-sources.js.map b/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-null-sources.js.map +new file mode 100644 +index 0000000000..199cda9369 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-null-sources.js.map +@@ -0,0 +1,6 @@ ++{ ++ "version":3, ++ "names": ["foo"], ++ "sources": [null], ++ "mappings":"AAAA,SAASA" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/version-missing.js b/front_end/core/sdk/fixtures/sourcemaps/version-missing.js +new file mode 100644 +index 0000000000..c32d1f1a1c +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/version-missing.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=version-missing.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/version-missing.js.map b/front_end/core/sdk/fixtures/sourcemaps/version-missing.js.map +new file mode 100644 +index 0000000000..49d8ce766e +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/version-missing.js.map +@@ -0,0 +1,5 @@ ++{ ++ "sources": [], ++ "names": [], ++ "mappings": "" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/version-not-a-number.js b/front_end/core/sdk/fixtures/sourcemaps/version-not-a-number.js +new file mode 100644 +index 0000000000..ae2342e2ff +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/version-not-a-number.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=version-not-a-number.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/version-not-a-number.js.map b/front_end/core/sdk/fixtures/sourcemaps/version-not-a-number.js.map +new file mode 100644 +index 0000000000..a584d6e695 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/version-not-a-number.js.map +@@ -0,0 +1,6 @@ ++{ ++ "version" : "3foo", ++ "sources": [], ++ "names": [], ++ "mappings": "" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/version-numeric-string.js b/front_end/core/sdk/fixtures/sourcemaps/version-numeric-string.js +new file mode 100644 +index 0000000000..a55170885d +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/version-numeric-string.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=version-numeric-string.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/version-numeric-string.js.map b/front_end/core/sdk/fixtures/sourcemaps/version-numeric-string.js.map +new file mode 100644 +index 0000000000..dbe52a7d0d +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/version-numeric-string.js.map +@@ -0,0 +1,6 @@ ++{ ++ "version" : "3", ++ "sources": [], ++ "names": [], ++ "mappings": "" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/version-too-high.js b/front_end/core/sdk/fixtures/sourcemaps/version-too-high.js +new file mode 100644 +index 0000000000..55f4e1a298 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/version-too-high.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=version-too-high.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/version-too-high.js.map b/front_end/core/sdk/fixtures/sourcemaps/version-too-high.js.map +new file mode 100644 +index 0000000000..ee23be32ff +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/version-too-high.js.map +@@ -0,0 +1,6 @@ ++{ ++ "version" : 4, ++ "sources": [], ++ "names": [], ++ "mappings": "" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/version-too-low.js b/front_end/core/sdk/fixtures/sourcemaps/version-too-low.js +new file mode 100644 +index 0000000000..d9642920b3 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/version-too-low.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=version-too-low.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/version-too-low.js.map b/front_end/core/sdk/fixtures/sourcemaps/version-too-low.js.map +new file mode 100644 +index 0000000000..64ca7a6e2e +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/version-too-low.js.map +@@ -0,0 +1,6 @@ ++{ ++ "version" : 2, ++ "sources": [], ++ "names": [], ++ "mappings": "" ++} +diff --git a/front_end/core/sdk/fixtures/sourcemaps/version-valid.js b/front_end/core/sdk/fixtures/sourcemaps/version-valid.js +new file mode 100644 +index 0000000000..82d0bfa1eb +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/version-valid.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=version-valid.js.map +diff --git a/front_end/core/sdk/fixtures/sourcemaps/version-valid.js.map b/front_end/core/sdk/fixtures/sourcemaps/version-valid.js.map +new file mode 100644 +index 0000000000..1a163052d8 +--- /dev/null ++++ b/front_end/core/sdk/fixtures/sourcemaps/version-valid.js.map +@@ -0,0 +1,6 @@ ++{ ++ "version" : 3, ++ "sources": [], ++ "names": [], ++ "mappings": "" ++} +-- +2.39.2 + diff --git a/test/fixtures/test426/chrome/0002-Add-reverse-mapping-code-to-test.patch b/test/fixtures/test426/chrome/0002-Add-reverse-mapping-code-to-test.patch new file mode 100644 index 00000000000000..dc08ba5fadb482 --- /dev/null +++ b/test/fixtures/test426/chrome/0002-Add-reverse-mapping-code-to-test.patch @@ -0,0 +1,46 @@ +From bebeda0b8133fc8f44382e59edda9203c980e8f3 Mon Sep 17 00:00:00 2001 +From: Asumu Takikawa +Date: Thu, 11 Jul 2024 16:44:29 -0700 +Subject: [PATCH 2/2] Add reverse mapping code to test + +--- + front_end/core/sdk/SourceMapSpec.test.ts | 16 +++++++++++++++- + 1 file changed, 15 insertions(+), 1 deletion(-) + +diff --git a/front_end/core/sdk/SourceMapSpec.test.ts b/front_end/core/sdk/SourceMapSpec.test.ts +index 93b26a2e13..402b82e4c0 100644 +--- a/front_end/core/sdk/SourceMapSpec.test.ts ++++ b/front_end/core/sdk/SourceMapSpec.test.ts +@@ -12,7 +12,6 @@ + + **/ + +-const {assert} = chai; + import type * as Platform from '../platform/platform.js'; + import {assertNotNullOrUndefined} from '../platform/platform.js'; + import { SourceMapV3, parseSourceMap } from './SourceMap.js'; +@@ -170,6 +169,21 @@ describeWithEnvironment('SourceMapSpec', () => { + assert.strictEqual(nullish(actual.sourceURL), originalSource, 'unexpected source URL'); + assert.strictEqual(nullish(actual.sourceLineNumber), originalLine, 'unexpected source line number'); + assert.strictEqual(nullish(actual.sourceColumnNumber), originalColumn, 'unexpected source column number'); ++ ++ if (originalSource != null) { ++ let reverseEntries = sourceMap.findReverseEntries( ++ originalSource as Platform.DevToolsPath.UrlString, ++ originalLine, ++ originalColumn ++ ); ++ ++ const anyEntryMatched = reverseEntries.some((entry) => { ++ return entry.sourceURL === originalSource && ++ entry.sourceLineNumber === originalLine && ++ entry.sourceColumnNumber === originalColumn; ++ }); ++ assert.isTrue(anyEntryMatched, `expected any matching reverse lookup entry, got none`); ++ } + } + }); + } +-- +2.39.2 + diff --git a/test/fixtures/test426/resources/basic-mapping-as-index-map.js b/test/fixtures/test426/resources/basic-mapping-as-index-map.js new file mode 100644 index 00000000000000..b9fae380437d95 --- /dev/null +++ b/test/fixtures/test426/resources/basic-mapping-as-index-map.js @@ -0,0 +1,2 @@ +function foo(){return 42}function bar(){return 24}foo();bar(); +//# sourceMappingURL=basic-mapping-as-index-map.js.map diff --git a/test/fixtures/test426/resources/basic-mapping-as-index-map.js.map b/test/fixtures/test426/resources/basic-mapping-as-index-map.js.map new file mode 100644 index 00000000000000..c0ad870ed2baec --- /dev/null +++ b/test/fixtures/test426/resources/basic-mapping-as-index-map.js.map @@ -0,0 +1,15 @@ +{ + "version": 3, + "file": "basic-mapping-as-index-map.js", + "sections": [ + { + "offset": { "line": 0, "column": 0 }, + "map": { + "version": 3, + "names": ["foo","bar"], + "sources": ["basic-mapping-original.js"], + "mappings": "AAAA,SAASA,MACP,OAAO,EACT,CACA,SAASC,MACP,OAAO,EACT,CACAD,MACAC" + } + } + ] +} diff --git a/test/fixtures/test426/resources/basic-mapping-original.js b/test/fixtures/test426/resources/basic-mapping-original.js new file mode 100644 index 00000000000000..301b186cb15e6d --- /dev/null +++ b/test/fixtures/test426/resources/basic-mapping-original.js @@ -0,0 +1,8 @@ +function foo() { + return 42; +} +function bar() { + return 24; +} +foo(); +bar(); diff --git a/test/fixtures/test426/resources/basic-mapping.js b/test/fixtures/test426/resources/basic-mapping.js new file mode 100644 index 00000000000000..2e479a4175b861 --- /dev/null +++ b/test/fixtures/test426/resources/basic-mapping.js @@ -0,0 +1,2 @@ +function foo(){return 42}function bar(){return 24}foo();bar(); +//# sourceMappingURL=basic-mapping.js.map diff --git a/test/fixtures/test426/resources/basic-mapping.js.map b/test/fixtures/test426/resources/basic-mapping.js.map new file mode 100644 index 00000000000000..12dc9679a4b1db --- /dev/null +++ b/test/fixtures/test426/resources/basic-mapping.js.map @@ -0,0 +1,6 @@ +{ + "version":3, + "names": ["foo","bar"], + "sources": ["basic-mapping-original.js"], + "mappings":"AAAA,SAASA,MACP,OAAO,EACT,CACA,SAASC,MACP,OAAO,EACT,CACAD,MACAC" +} diff --git a/test/fixtures/test426/resources/file-not-a-string-1.js b/test/fixtures/test426/resources/file-not-a-string-1.js new file mode 100644 index 00000000000000..d049f870450a55 --- /dev/null +++ b/test/fixtures/test426/resources/file-not-a-string-1.js @@ -0,0 +1 @@ +//# sourceMappingURL=file-not-a-string-1.js.map diff --git a/test/fixtures/test426/resources/file-not-a-string-1.js.map b/test/fixtures/test426/resources/file-not-a-string-1.js.map new file mode 100644 index 00000000000000..85e973d881dfbf --- /dev/null +++ b/test/fixtures/test426/resources/file-not-a-string-1.js.map @@ -0,0 +1,8 @@ +{ + "version" : 3, + "file": [], + "sources": ["empty-original.js"], + "sourcesContent": [""], + "names": [], + "mappings": "" +} diff --git a/test/fixtures/test426/resources/file-not-a-string-2.js b/test/fixtures/test426/resources/file-not-a-string-2.js new file mode 100644 index 00000000000000..07b8152c0c6cd1 --- /dev/null +++ b/test/fixtures/test426/resources/file-not-a-string-2.js @@ -0,0 +1 @@ +//# sourceMappingURL=file-not-a-string-2.js.map diff --git a/test/fixtures/test426/resources/file-not-a-string-2.js.map b/test/fixtures/test426/resources/file-not-a-string-2.js.map new file mode 100644 index 00000000000000..a5b6b1f9d94fc3 --- /dev/null +++ b/test/fixtures/test426/resources/file-not-a-string-2.js.map @@ -0,0 +1,8 @@ +{ + "version" : 3, + "file": 235324, + "sources": ["empty-original.js"], + "sourcesContent": [""], + "names": [], + "mappings": "" +} diff --git a/test/fixtures/test426/resources/ignore-list-empty.js b/test/fixtures/test426/resources/ignore-list-empty.js new file mode 100644 index 00000000000000..385a5c3501b22c --- /dev/null +++ b/test/fixtures/test426/resources/ignore-list-empty.js @@ -0,0 +1 @@ +//# sourceMappingURL=ignore-list-empty.js.map diff --git a/test/fixtures/test426/resources/ignore-list-empty.js.map b/test/fixtures/test426/resources/ignore-list-empty.js.map new file mode 100644 index 00000000000000..7297863a9be8ef --- /dev/null +++ b/test/fixtures/test426/resources/ignore-list-empty.js.map @@ -0,0 +1,8 @@ +{ + "version" : 3, + "sources": ["empty-original.js"], + "sourcesContent": [""], + "mappings": "", + "names": [], + "ignoreList": [] +} diff --git a/test/fixtures/test426/resources/ignore-list-out-of-bounds-1.js b/test/fixtures/test426/resources/ignore-list-out-of-bounds-1.js new file mode 100644 index 00000000000000..567174a707ef49 --- /dev/null +++ b/test/fixtures/test426/resources/ignore-list-out-of-bounds-1.js @@ -0,0 +1 @@ +//# sourceMappingURL=ignore-list-out-of-bounds-1.js.map diff --git a/test/fixtures/test426/resources/ignore-list-out-of-bounds-1.js.map b/test/fixtures/test426/resources/ignore-list-out-of-bounds-1.js.map new file mode 100644 index 00000000000000..fb2566bb419b98 --- /dev/null +++ b/test/fixtures/test426/resources/ignore-list-out-of-bounds-1.js.map @@ -0,0 +1,8 @@ +{ + "version" : 3, + "sources": ["empty-original.js"], + "sourcesContent": [""], + "mappings": "", + "names": [], + "ignoreList": [1] +} diff --git a/test/fixtures/test426/resources/ignore-list-out-of-bounds-2.js b/test/fixtures/test426/resources/ignore-list-out-of-bounds-2.js new file mode 100644 index 00000000000000..4216d9a67315a9 --- /dev/null +++ b/test/fixtures/test426/resources/ignore-list-out-of-bounds-2.js @@ -0,0 +1 @@ +//# sourceMappingURL=ignore-list-out-of-bounds-2.js.map diff --git a/test/fixtures/test426/resources/ignore-list-out-of-bounds-2.js.map b/test/fixtures/test426/resources/ignore-list-out-of-bounds-2.js.map new file mode 100644 index 00000000000000..41371a76a89663 --- /dev/null +++ b/test/fixtures/test426/resources/ignore-list-out-of-bounds-2.js.map @@ -0,0 +1,8 @@ +{ + "version" : 3, + "sources": ["empty-original.js"], + "sourcesContent": [""], + "mappings": "", + "names": [], + "ignoreList": [-1] +} diff --git a/test/fixtures/test426/resources/ignore-list-valid-1.js b/test/fixtures/test426/resources/ignore-list-valid-1.js new file mode 100644 index 00000000000000..ea64a5565a6325 --- /dev/null +++ b/test/fixtures/test426/resources/ignore-list-valid-1.js @@ -0,0 +1 @@ +//# sourceMappingURL=ignore-list-valid-1.js.map diff --git a/test/fixtures/test426/resources/ignore-list-valid-1.js.map b/test/fixtures/test426/resources/ignore-list-valid-1.js.map new file mode 100644 index 00000000000000..98eebdf7f65598 --- /dev/null +++ b/test/fixtures/test426/resources/ignore-list-valid-1.js.map @@ -0,0 +1,8 @@ +{ + "version" : 3, + "sources": ["empty-original.js"], + "sourcesContent": [""], + "mappings": "", + "names": [], + "ignoreList": [0] +} diff --git a/test/fixtures/test426/resources/ignore-list-wrong-type-1.js b/test/fixtures/test426/resources/ignore-list-wrong-type-1.js new file mode 100644 index 00000000000000..8b40bd38476724 --- /dev/null +++ b/test/fixtures/test426/resources/ignore-list-wrong-type-1.js @@ -0,0 +1 @@ +//# sourceMappingURL=ignore-list-wrong-type-1.js.map diff --git a/test/fixtures/test426/resources/ignore-list-wrong-type-1.js.map b/test/fixtures/test426/resources/ignore-list-wrong-type-1.js.map new file mode 100644 index 00000000000000..688740aba843fc --- /dev/null +++ b/test/fixtures/test426/resources/ignore-list-wrong-type-1.js.map @@ -0,0 +1,8 @@ +{ + "version" : 3, + "sources": ["empty-original.js"], + "sourcesContent": [""], + "mappings": "", + "names": [], + "ignoreList": ["not a number"] +} diff --git a/test/fixtures/test426/resources/ignore-list-wrong-type-2.js b/test/fixtures/test426/resources/ignore-list-wrong-type-2.js new file mode 100644 index 00000000000000..35c77911648ef6 --- /dev/null +++ b/test/fixtures/test426/resources/ignore-list-wrong-type-2.js @@ -0,0 +1 @@ +//# sourceMappingURL=ignore-list-wrong-type-2.js.map diff --git a/test/fixtures/test426/resources/ignore-list-wrong-type-2.js.map b/test/fixtures/test426/resources/ignore-list-wrong-type-2.js.map new file mode 100644 index 00000000000000..ca1d30de2d3626 --- /dev/null +++ b/test/fixtures/test426/resources/ignore-list-wrong-type-2.js.map @@ -0,0 +1,8 @@ +{ + "version" : 3, + "sources": ["empty-original.js"], + "sourcesContent": [""], + "mappings": "", + "names": [], + "ignoreList": ["0"] +} diff --git a/test/fixtures/test426/resources/ignore-list-wrong-type-3.js b/test/fixtures/test426/resources/ignore-list-wrong-type-3.js new file mode 100644 index 00000000000000..8735d4175804bf --- /dev/null +++ b/test/fixtures/test426/resources/ignore-list-wrong-type-3.js @@ -0,0 +1 @@ +//# sourceMappingURL=ignore-list-wrong-type-3.js.map diff --git a/test/fixtures/test426/resources/ignore-list-wrong-type-3.js.map b/test/fixtures/test426/resources/ignore-list-wrong-type-3.js.map new file mode 100644 index 00000000000000..1ac167d56c4e74 --- /dev/null +++ b/test/fixtures/test426/resources/ignore-list-wrong-type-3.js.map @@ -0,0 +1,8 @@ +{ + "version" : 3, + "sources": ["empty-original.js"], + "sourcesContent": [""], + "mappings": "", + "names": [], + "ignoreList": 0 +} diff --git a/test/fixtures/test426/resources/ignore-list-wrong-type-4.js b/test/fixtures/test426/resources/ignore-list-wrong-type-4.js new file mode 100644 index 00000000000000..e42f4698a3ec0e --- /dev/null +++ b/test/fixtures/test426/resources/ignore-list-wrong-type-4.js @@ -0,0 +1 @@ +//# sourceMappingURL=ignore-list-wrong-type-4.js.map diff --git a/test/fixtures/test426/resources/ignore-list-wrong-type-4.js.map b/test/fixtures/test426/resources/ignore-list-wrong-type-4.js.map new file mode 100644 index 00000000000000..c1a27efe980dd4 --- /dev/null +++ b/test/fixtures/test426/resources/ignore-list-wrong-type-4.js.map @@ -0,0 +1,8 @@ +{ + "version" : 3, + "sources": ["empty-original.js"], + "sourcesContent": [""], + "mappings": "", + "names": [], + "ignoreList": [0.5] +} diff --git a/test/fixtures/test426/resources/index-map-empty-sections.js b/test/fixtures/test426/resources/index-map-empty-sections.js new file mode 100644 index 00000000000000..abe9f7f30816c6 --- /dev/null +++ b/test/fixtures/test426/resources/index-map-empty-sections.js @@ -0,0 +1 @@ +//# sourceMappingURL=index-map-empty-sections.js.map diff --git a/test/fixtures/test426/resources/index-map-empty-sections.js.map b/test/fixtures/test426/resources/index-map-empty-sections.js.map new file mode 100644 index 00000000000000..f3efabbe00c395 --- /dev/null +++ b/test/fixtures/test426/resources/index-map-empty-sections.js.map @@ -0,0 +1,4 @@ +{ + "version": 3, + "sections": [] +} diff --git a/test/fixtures/test426/resources/index-map-file-wrong-type-1.js b/test/fixtures/test426/resources/index-map-file-wrong-type-1.js new file mode 100644 index 00000000000000..48bb12855bf5c4 --- /dev/null +++ b/test/fixtures/test426/resources/index-map-file-wrong-type-1.js @@ -0,0 +1,2 @@ +function foo(){return 42}function bar(){return 24}foo();bar(); +//# sourceMappingURL=index-map-file-wrong-type-1.js.map diff --git a/test/fixtures/test426/resources/index-map-file-wrong-type-1.js.map b/test/fixtures/test426/resources/index-map-file-wrong-type-1.js.map new file mode 100644 index 00000000000000..dd39b5a2b13c19 --- /dev/null +++ b/test/fixtures/test426/resources/index-map-file-wrong-type-1.js.map @@ -0,0 +1,15 @@ +{ + "version": 3, + "file": [], + "sections": [ + { + "offset": { "line": 0, "column": 0 }, + "map": { + "version": 3, + "names": ["foo","bar"], + "sources": ["basic-mapping-original.js"], + "mappings": "AAAA,SAASA,MACP,OAAO,EACT,CACA,SAASC,MACP,OAAO,EACT,CACAD,MACAC" + } + } + ] +} diff --git a/test/fixtures/test426/resources/index-map-file-wrong-type-2.js b/test/fixtures/test426/resources/index-map-file-wrong-type-2.js new file mode 100644 index 00000000000000..c002ba726a51bf --- /dev/null +++ b/test/fixtures/test426/resources/index-map-file-wrong-type-2.js @@ -0,0 +1,2 @@ +function foo(){return 42}function bar(){return 24}foo();bar(); +//# sourceMappingURL=index-map-file-wrong-type-2.js.map diff --git a/test/fixtures/test426/resources/index-map-file-wrong-type-2.js.map b/test/fixtures/test426/resources/index-map-file-wrong-type-2.js.map new file mode 100644 index 00000000000000..0ee0a406be8d60 --- /dev/null +++ b/test/fixtures/test426/resources/index-map-file-wrong-type-2.js.map @@ -0,0 +1,15 @@ +{ + "version": 3, + "file": 2345234234, + "sections": [ + { + "offset": { "line": 0, "column": 0 }, + "map": { + "version": 3, + "names": ["foo","bar"], + "sources": ["basic-mapping-original.js"], + "mappings": "AAAA,SAASA,MACP,OAAO,EACT,CACA,SAASC,MACP,OAAO,EACT,CACAD,MACAC" + } + } + ] +} diff --git a/test/fixtures/test426/resources/index-map-invalid-base-mappings.js b/test/fixtures/test426/resources/index-map-invalid-base-mappings.js new file mode 100644 index 00000000000000..e90bef083c4925 --- /dev/null +++ b/test/fixtures/test426/resources/index-map-invalid-base-mappings.js @@ -0,0 +1 @@ +//# sourceMappingURL=index-map-invalid-base-mappings.js.map diff --git a/test/fixtures/test426/resources/index-map-invalid-base-mappings.js.map b/test/fixtures/test426/resources/index-map-invalid-base-mappings.js.map new file mode 100644 index 00000000000000..4ad1fefe65097b --- /dev/null +++ b/test/fixtures/test426/resources/index-map-invalid-base-mappings.js.map @@ -0,0 +1,16 @@ +{ + "version": 3, + "mappings": "AAAA", + "sections": [ + { + "offset": { "line": 0, "column": 0 }, + "map": { + "version": 3, + "names": [], + "sources": ["empty-original.js"], + "sourcesContnet": [""], + "mappings": "AAAA" + } + } + ] +} diff --git a/test/fixtures/test426/resources/index-map-invalid-order.js b/test/fixtures/test426/resources/index-map-invalid-order.js new file mode 100644 index 00000000000000..263fa3c6e0b92e --- /dev/null +++ b/test/fixtures/test426/resources/index-map-invalid-order.js @@ -0,0 +1 @@ +//# sourceMappingURL=index-map-invalid-order.js.map diff --git a/test/fixtures/test426/resources/index-map-invalid-order.js.map b/test/fixtures/test426/resources/index-map-invalid-order.js.map new file mode 100644 index 00000000000000..74e0c1d052c4bc --- /dev/null +++ b/test/fixtures/test426/resources/index-map-invalid-order.js.map @@ -0,0 +1,25 @@ +{ + "version": 3, + "sections": [ + { + "offset": { "line": 1, "column": 4 }, + "map": { + "version": 3, + "names": [], + "sources": ["empty-original-1.js"], + "sourcesContent": [""], + "mappings": "AAAA" + } + }, + { + "offset": { "line": 0, "column": 0 }, + "map": { + "version": 3, + "names": [], + "sources": ["empty-original-2.js"], + "sourcesContent": [""], + "mappings": "AAAA" + } + } + ] +} diff --git a/test/fixtures/test426/resources/index-map-invalid-overlap.js b/test/fixtures/test426/resources/index-map-invalid-overlap.js new file mode 100644 index 00000000000000..9aff8dc6203abc --- /dev/null +++ b/test/fixtures/test426/resources/index-map-invalid-overlap.js @@ -0,0 +1 @@ +//# sourceMappingURL=index-map-invalid-overlap.js.map diff --git a/test/fixtures/test426/resources/index-map-invalid-overlap.js.map b/test/fixtures/test426/resources/index-map-invalid-overlap.js.map new file mode 100644 index 00000000000000..3c08cb7beb59d9 --- /dev/null +++ b/test/fixtures/test426/resources/index-map-invalid-overlap.js.map @@ -0,0 +1,25 @@ +{ + "version": 3, + "sections": [ + { + "offset": { "line": 0, "column": 0 }, + "map": { + "version": 3, + "names": [], + "sources": ["empty-original-1.js"], + "sourcesContent": [""], + "mappings": "AAAA" + } + }, + { + "offset": { "line": 0, "column": 0 }, + "map": { + "version": 3, + "names": [], + "sources": ["empty-original-2.js"], + "sourcesContent": [""], + "mappings": "AAAA" + } + } + ] +} diff --git a/test/fixtures/test426/resources/index-map-invalid-sub-map.js b/test/fixtures/test426/resources/index-map-invalid-sub-map.js new file mode 100644 index 00000000000000..284e8d77e6591e --- /dev/null +++ b/test/fixtures/test426/resources/index-map-invalid-sub-map.js @@ -0,0 +1 @@ +//# sourceMappingURL=index-map-invalid-sub-map.js.map diff --git a/test/fixtures/test426/resources/index-map-invalid-sub-map.js.map b/test/fixtures/test426/resources/index-map-invalid-sub-map.js.map new file mode 100644 index 00000000000000..4020ae30c5765b --- /dev/null +++ b/test/fixtures/test426/resources/index-map-invalid-sub-map.js.map @@ -0,0 +1,13 @@ +{ + "version": 3, + "file": "index-map-invalid-sub-map.js", + "sections": [ + { + "offset": { "line": 0, "column": 0 }, + "map": { + "version": "3", + "mappings": 7 + } + } + ] +} diff --git a/test/fixtures/test426/resources/index-map-missing-file.js b/test/fixtures/test426/resources/index-map-missing-file.js new file mode 100644 index 00000000000000..be2a93cb77cdee --- /dev/null +++ b/test/fixtures/test426/resources/index-map-missing-file.js @@ -0,0 +1,2 @@ +function foo(){return 42}function bar(){return 24}foo();bar(); +//# sourceMappingURL=index-map-missing-file.js.map diff --git a/test/fixtures/test426/resources/index-map-missing-file.js.map b/test/fixtures/test426/resources/index-map-missing-file.js.map new file mode 100644 index 00000000000000..8a6d4b5dc78800 --- /dev/null +++ b/test/fixtures/test426/resources/index-map-missing-file.js.map @@ -0,0 +1,14 @@ +{ + "version": 3, + "sections": [ + { + "offset": { "line": 0, "column": 0 }, + "map": { + "version": 3, + "names": ["foo","bar"], + "sources": ["basic-mapping-original.js"], + "mappings": "AAAA,SAASA,MACP,OAAO,EACT,CACA,SAASC,MACP,OAAO,EACT,CACAD,MACAC" + } + } + ] +} diff --git a/test/fixtures/test426/resources/index-map-missing-map.js b/test/fixtures/test426/resources/index-map-missing-map.js new file mode 100644 index 00000000000000..86c8e9a2535ad9 --- /dev/null +++ b/test/fixtures/test426/resources/index-map-missing-map.js @@ -0,0 +1 @@ +//# sourceMappingURL=index-map-missing-map.js.map diff --git a/test/fixtures/test426/resources/index-map-missing-map.js.map b/test/fixtures/test426/resources/index-map-missing-map.js.map new file mode 100644 index 00000000000000..3bce47e852cfec --- /dev/null +++ b/test/fixtures/test426/resources/index-map-missing-map.js.map @@ -0,0 +1,8 @@ +{ + "version": 3, + "sections": [ + { + "offset": { "line": 0, "column": 0 } + } + ] +} diff --git a/test/fixtures/test426/resources/index-map-missing-offset-column.js b/test/fixtures/test426/resources/index-map-missing-offset-column.js new file mode 100644 index 00000000000000..fe6917403f1804 --- /dev/null +++ b/test/fixtures/test426/resources/index-map-missing-offset-column.js @@ -0,0 +1 @@ +//# sourceMappingURL=index-map-missing-offset-column.js.map diff --git a/test/fixtures/test426/resources/index-map-missing-offset-column.js.map b/test/fixtures/test426/resources/index-map-missing-offset-column.js.map new file mode 100644 index 00000000000000..ae27aa5e62c72d --- /dev/null +++ b/test/fixtures/test426/resources/index-map-missing-offset-column.js.map @@ -0,0 +1,15 @@ +{ + "version": 3, + "sections": [ + { + "offset": { "line": 0 }, + "map": { + "version": 3, + "names": [], + "sources": ["empty-original.js"], + "sourcesContent": [""], + "mappings": "AAAA" + } + } + ] +} diff --git a/test/fixtures/test426/resources/index-map-missing-offset-line.js b/test/fixtures/test426/resources/index-map-missing-offset-line.js new file mode 100644 index 00000000000000..ba8614e412cef8 --- /dev/null +++ b/test/fixtures/test426/resources/index-map-missing-offset-line.js @@ -0,0 +1 @@ +//# sourceMappingURL=index-map-missing-offset-line.js.map diff --git a/test/fixtures/test426/resources/index-map-missing-offset-line.js.map b/test/fixtures/test426/resources/index-map-missing-offset-line.js.map new file mode 100644 index 00000000000000..7b128e96b0b7cb --- /dev/null +++ b/test/fixtures/test426/resources/index-map-missing-offset-line.js.map @@ -0,0 +1,15 @@ +{ + "version": 3, + "sections": [ + { + "offset": { "column": 0 }, + "map": { + "version": 3, + "names": [], + "sources": ["empty-original.js"], + "sourcesContent": [""], + "mappings": "AAAA" + } + } + ] +} diff --git a/test/fixtures/test426/resources/index-map-missing-offset.js b/test/fixtures/test426/resources/index-map-missing-offset.js new file mode 100644 index 00000000000000..9ca2cf3fb5159d --- /dev/null +++ b/test/fixtures/test426/resources/index-map-missing-offset.js @@ -0,0 +1 @@ +//# sourceMappingURL=index-map-missing-offset.js.map diff --git a/test/fixtures/test426/resources/index-map-missing-offset.js.map b/test/fixtures/test426/resources/index-map-missing-offset.js.map new file mode 100644 index 00000000000000..7737595d848cd6 --- /dev/null +++ b/test/fixtures/test426/resources/index-map-missing-offset.js.map @@ -0,0 +1,14 @@ +{ + "version": 3, + "sections": [ + { + "map": { + "version": 3, + "names": [], + "sources": ["empty-original.js"], + "sourcesContent": [""], + "mappings": "AAAA" + } + } + ] +} diff --git a/test/fixtures/test426/resources/index-map-offset-column-wrong-type.js b/test/fixtures/test426/resources/index-map-offset-column-wrong-type.js new file mode 100644 index 00000000000000..ed1e9ec5d5b8a6 --- /dev/null +++ b/test/fixtures/test426/resources/index-map-offset-column-wrong-type.js @@ -0,0 +1 @@ +//# sourceMappingURL=index-map-offset-column-wrong-type.js.map diff --git a/test/fixtures/test426/resources/index-map-offset-column-wrong-type.js.map b/test/fixtures/test426/resources/index-map-offset-column-wrong-type.js.map new file mode 100644 index 00000000000000..6ea11758c1e448 --- /dev/null +++ b/test/fixtures/test426/resources/index-map-offset-column-wrong-type.js.map @@ -0,0 +1,15 @@ +{ + "version": 3, + "sections": [ + { + "offset": { "line": 0, "column": true }, + "map": { + "version": 3, + "names": [], + "sources": ["empty-original.js"], + "sourcesContent": [""], + "mappings": "AAAA" + } + } + ] +} diff --git a/test/fixtures/test426/resources/index-map-offset-line-wrong-type.js b/test/fixtures/test426/resources/index-map-offset-line-wrong-type.js new file mode 100644 index 00000000000000..d58f2aff993e6e --- /dev/null +++ b/test/fixtures/test426/resources/index-map-offset-line-wrong-type.js @@ -0,0 +1 @@ +//# sourceMappingURL=index-map-offset-line-wrong-type.js.map diff --git a/test/fixtures/test426/resources/index-map-offset-line-wrong-type.js.map b/test/fixtures/test426/resources/index-map-offset-line-wrong-type.js.map new file mode 100644 index 00000000000000..d48b2f43f16b21 --- /dev/null +++ b/test/fixtures/test426/resources/index-map-offset-line-wrong-type.js.map @@ -0,0 +1,15 @@ +{ + "version": 3, + "sections": [ + { + "offset": { "line": true, "column": 0 }, + "map": { + "version": 3, + "names": [], + "sources": ["empty-original.js"], + "sourcesContent": [""], + "mappings": "AAAA" + } + } + ] +} diff --git a/test/fixtures/test426/resources/index-map-two-concatenated-sources.js b/test/fixtures/test426/resources/index-map-two-concatenated-sources.js new file mode 100644 index 00000000000000..b8702d7187c925 --- /dev/null +++ b/test/fixtures/test426/resources/index-map-two-concatenated-sources.js @@ -0,0 +1,2 @@ +function foo(){return 42}function bar(){return 24}foo();bar();function baz(){return"baz"}baz(); +//# sourceMappingURL=index-map-two-concatenated-sources.js.map diff --git a/test/fixtures/test426/resources/index-map-two-concatenated-sources.js.map b/test/fixtures/test426/resources/index-map-two-concatenated-sources.js.map new file mode 100644 index 00000000000000..f67f5de3c5d8c3 --- /dev/null +++ b/test/fixtures/test426/resources/index-map-two-concatenated-sources.js.map @@ -0,0 +1,24 @@ +{ + "version": 3, + "file": "index-map-two-concatenated-sources.js", + "sections": [ + { + "offset": { "line": 0, "column": 0 }, + "map": { + "version": 3, + "names": ["foo","bar"], + "sources": ["basic-mapping-original.js"], + "mappings": "AAAA,SAASA,MACP,OAAO,EACT,CACA,SAASC,MACP,OAAO,EACT,CACAD,MACAC" + } + }, + { + "offset": { "line": 0, "column": 62 }, + "map": { + "version": 3, + "names": ["baz"], + "sources": ["second-source-original.js"], + "mappings":"AAAA,SAASA,MACP,MAAO,KACT,CACAA" + } + } + ] +} diff --git a/test/fixtures/test426/resources/index-map-wrong-type-map.js b/test/fixtures/test426/resources/index-map-wrong-type-map.js new file mode 100644 index 00000000000000..d31d6d6358b493 --- /dev/null +++ b/test/fixtures/test426/resources/index-map-wrong-type-map.js @@ -0,0 +1 @@ +//# sourceMappingURL=index-map-wrong-type-map.js.map diff --git a/test/fixtures/test426/resources/index-map-wrong-type-map.js.map b/test/fixtures/test426/resources/index-map-wrong-type-map.js.map new file mode 100644 index 00000000000000..0963f623d761a9 --- /dev/null +++ b/test/fixtures/test426/resources/index-map-wrong-type-map.js.map @@ -0,0 +1,9 @@ +{ + "version": 3, + "sections": [ + { + "offset": { "line": 0, "column": 0 }, + "map": "not a map" + } + ] +} diff --git a/test/fixtures/test426/resources/index-map-wrong-type-offset.js b/test/fixtures/test426/resources/index-map-wrong-type-offset.js new file mode 100644 index 00000000000000..048e1246f8b01b --- /dev/null +++ b/test/fixtures/test426/resources/index-map-wrong-type-offset.js @@ -0,0 +1 @@ +//# sourceMappingURL=index-map-wrong-type-offset.js.map diff --git a/test/fixtures/test426/resources/index-map-wrong-type-offset.js.map b/test/fixtures/test426/resources/index-map-wrong-type-offset.js.map new file mode 100644 index 00000000000000..645278c3b4755a --- /dev/null +++ b/test/fixtures/test426/resources/index-map-wrong-type-offset.js.map @@ -0,0 +1,15 @@ +{ + "version": 3, + "sections": [ + { + "offset": "not an offset", + "map": { + "version": 3, + "names": [], + "sources": ["empty-original.js"], + "sourcesContent": [""], + "mappings": "AAAA" + } + } + ] +} diff --git a/test/fixtures/test426/resources/index-map-wrong-type-sections.js b/test/fixtures/test426/resources/index-map-wrong-type-sections.js new file mode 100644 index 00000000000000..011eca806ed600 --- /dev/null +++ b/test/fixtures/test426/resources/index-map-wrong-type-sections.js @@ -0,0 +1 @@ +//# sourceMappingURL=index-map-wrong-type-sections.js.map diff --git a/test/fixtures/test426/resources/index-map-wrong-type-sections.js.map b/test/fixtures/test426/resources/index-map-wrong-type-sections.js.map new file mode 100644 index 00000000000000..dbfb4ead3001fb --- /dev/null +++ b/test/fixtures/test426/resources/index-map-wrong-type-sections.js.map @@ -0,0 +1,4 @@ +{ + "version": 3, + "sections": "not a sections list" +} diff --git a/test/fixtures/test426/resources/invalid-mapping-bad-separator.js b/test/fixtures/test426/resources/invalid-mapping-bad-separator.js new file mode 100644 index 00000000000000..25338aca30cefd --- /dev/null +++ b/test/fixtures/test426/resources/invalid-mapping-bad-separator.js @@ -0,0 +1,2 @@ +function foo(){return 42}function bar(){return 24}foo();bar(); +//# sourceMappingURL=invalid-mapping-bad-separator.js.map diff --git a/test/fixtures/test426/resources/invalid-mapping-bad-separator.js.map b/test/fixtures/test426/resources/invalid-mapping-bad-separator.js.map new file mode 100644 index 00000000000000..5f4f5b92330a6b --- /dev/null +++ b/test/fixtures/test426/resources/invalid-mapping-bad-separator.js.map @@ -0,0 +1,6 @@ +{ + "version": 3, + "names": ["foo","bar"], + "sources": ["basic-mapping-original.js"], + "mappings": "AAAA.SAASA:MACP" +} diff --git a/test/fixtures/test426/resources/invalid-mapping-not-a-string-1.js b/test/fixtures/test426/resources/invalid-mapping-not-a-string-1.js new file mode 100644 index 00000000000000..cb38e2fe9d7b1d --- /dev/null +++ b/test/fixtures/test426/resources/invalid-mapping-not-a-string-1.js @@ -0,0 +1 @@ +//# sourceMappingURL=invalid-mapping-not-a-string-1.js.map diff --git a/test/fixtures/test426/resources/invalid-mapping-not-a-string-1.js.map b/test/fixtures/test426/resources/invalid-mapping-not-a-string-1.js.map new file mode 100644 index 00000000000000..73d74bef42e202 --- /dev/null +++ b/test/fixtures/test426/resources/invalid-mapping-not-a-string-1.js.map @@ -0,0 +1,8 @@ +{ + "version": 3, + "names": [], + "file": "invalid-mapping-not-a-string-1.js", + "sources": ["empty-original.js"], + "sourcesContent": [""], + "mappings": 5 +} diff --git a/test/fixtures/test426/resources/invalid-mapping-not-a-string-2.js b/test/fixtures/test426/resources/invalid-mapping-not-a-string-2.js new file mode 100644 index 00000000000000..3d84abd6c6b480 --- /dev/null +++ b/test/fixtures/test426/resources/invalid-mapping-not-a-string-2.js @@ -0,0 +1 @@ +//# sourceMappingURL=invalid-mapping-not-a-string-2.js.map diff --git a/test/fixtures/test426/resources/invalid-mapping-not-a-string-2.js.map b/test/fixtures/test426/resources/invalid-mapping-not-a-string-2.js.map new file mode 100644 index 00000000000000..3143cbce170b9e --- /dev/null +++ b/test/fixtures/test426/resources/invalid-mapping-not-a-string-2.js.map @@ -0,0 +1,8 @@ +{ + "version": 3, + "names": [], + "file": "invalid-mapping-not-a-string-2.js", + "sources": ["empty-original.js"], + "sourcesContent": [""], + "mappings": [1, 2, 3, 4] +} diff --git a/test/fixtures/test426/resources/invalid-mapping-segment-column-too-large.js b/test/fixtures/test426/resources/invalid-mapping-segment-column-too-large.js new file mode 100644 index 00000000000000..55591f874b1b9e --- /dev/null +++ b/test/fixtures/test426/resources/invalid-mapping-segment-column-too-large.js @@ -0,0 +1 @@ +//# sourceMappingURL=invalid-mapping-segment-column-too-large.js.map diff --git a/test/fixtures/test426/resources/invalid-mapping-segment-column-too-large.js.map b/test/fixtures/test426/resources/invalid-mapping-segment-column-too-large.js.map new file mode 100644 index 00000000000000..96b3ce97dcb271 --- /dev/null +++ b/test/fixtures/test426/resources/invalid-mapping-segment-column-too-large.js.map @@ -0,0 +1,8 @@ +{ + "version": 3, + "names": [], + "file": "invalid-mapping-segment-column-too-large.js", + "sources": ["empty-original.js"], + "sourcesContent": [""], + "mappings": "ggggggE" +} diff --git a/test/fixtures/test426/resources/invalid-mapping-segment-name-index-out-of-bounds.js b/test/fixtures/test426/resources/invalid-mapping-segment-name-index-out-of-bounds.js new file mode 100644 index 00000000000000..2a6b434eff5819 --- /dev/null +++ b/test/fixtures/test426/resources/invalid-mapping-segment-name-index-out-of-bounds.js @@ -0,0 +1 @@ +//# sourceMappingURL=invalid-mapping-segment-name-index-out-of-bounds.js.map diff --git a/test/fixtures/test426/resources/invalid-mapping-segment-name-index-out-of-bounds.js.map b/test/fixtures/test426/resources/invalid-mapping-segment-name-index-out-of-bounds.js.map new file mode 100644 index 00000000000000..3efb8da9abbaa6 --- /dev/null +++ b/test/fixtures/test426/resources/invalid-mapping-segment-name-index-out-of-bounds.js.map @@ -0,0 +1,8 @@ +{ + "version": 3, + "names": ["foo"], + "file": "invalid-mapping-segment-name-index-out-of-bounds.js", + "sources": ["empty-original.js"], + "sourcesContent": [""], + "mappings": "AAAAC" +} diff --git a/test/fixtures/test426/resources/invalid-mapping-segment-name-index-too-large.js b/test/fixtures/test426/resources/invalid-mapping-segment-name-index-too-large.js new file mode 100644 index 00000000000000..709e34dbd326a0 --- /dev/null +++ b/test/fixtures/test426/resources/invalid-mapping-segment-name-index-too-large.js @@ -0,0 +1 @@ +//# sourceMappingURL=invalid-mapping-segment-name-index-too-large.js.map diff --git a/test/fixtures/test426/resources/invalid-mapping-segment-name-index-too-large.js.map b/test/fixtures/test426/resources/invalid-mapping-segment-name-index-too-large.js.map new file mode 100644 index 00000000000000..1d44bb8300f7c0 --- /dev/null +++ b/test/fixtures/test426/resources/invalid-mapping-segment-name-index-too-large.js.map @@ -0,0 +1,8 @@ +{ + "version": 3, + "names": [], + "file": "invalid-mapping-segment-name-index-too-large.js", + "sources": ["empty-original.js"], + "sourcesContent": [""], + "mappings": "AAAAggggggE" +} diff --git a/test/fixtures/test426/resources/invalid-mapping-segment-negative-column.js b/test/fixtures/test426/resources/invalid-mapping-segment-negative-column.js new file mode 100644 index 00000000000000..a202152d6fdf29 --- /dev/null +++ b/test/fixtures/test426/resources/invalid-mapping-segment-negative-column.js @@ -0,0 +1 @@ +//# sourceMappingURL=invalid-mapping-segment-negative-column.js.map diff --git a/test/fixtures/test426/resources/invalid-mapping-segment-negative-column.js.map b/test/fixtures/test426/resources/invalid-mapping-segment-negative-column.js.map new file mode 100644 index 00000000000000..bb7e887dc05f4a --- /dev/null +++ b/test/fixtures/test426/resources/invalid-mapping-segment-negative-column.js.map @@ -0,0 +1,8 @@ +{ + "version": 3, + "names": [], + "file": "invalid-mapping-segment-negative-column.js", + "sources": ["empty-original.js"], + "sourcesContent": [""], + "mappings": "F" +} diff --git a/test/fixtures/test426/resources/invalid-mapping-segment-negative-name-index.js b/test/fixtures/test426/resources/invalid-mapping-segment-negative-name-index.js new file mode 100644 index 00000000000000..3e3f6342046785 --- /dev/null +++ b/test/fixtures/test426/resources/invalid-mapping-segment-negative-name-index.js @@ -0,0 +1 @@ +//# sourceMappingURL=invalid-mapping-segment-negative-name-index.js.map diff --git a/test/fixtures/test426/resources/invalid-mapping-segment-negative-name-index.js.map b/test/fixtures/test426/resources/invalid-mapping-segment-negative-name-index.js.map new file mode 100644 index 00000000000000..5197ab23b1d2cd --- /dev/null +++ b/test/fixtures/test426/resources/invalid-mapping-segment-negative-name-index.js.map @@ -0,0 +1,8 @@ +{ + "version": 3, + "names": [], + "file": "invalid-mapping-segment-negative-name-index.js", + "sources": ["empty-original.js"], + "sourcesContent": [""], + "mappings": "AAAAF" +} diff --git a/test/fixtures/test426/resources/invalid-mapping-segment-negative-original-column.js b/test/fixtures/test426/resources/invalid-mapping-segment-negative-original-column.js new file mode 100644 index 00000000000000..f21d5342b395a8 --- /dev/null +++ b/test/fixtures/test426/resources/invalid-mapping-segment-negative-original-column.js @@ -0,0 +1 @@ +//# sourceMappingURL=invalid-mapping-segment-negative-original-column.js.map diff --git a/test/fixtures/test426/resources/invalid-mapping-segment-negative-original-column.js.map b/test/fixtures/test426/resources/invalid-mapping-segment-negative-original-column.js.map new file mode 100644 index 00000000000000..4a76cb3e390636 --- /dev/null +++ b/test/fixtures/test426/resources/invalid-mapping-segment-negative-original-column.js.map @@ -0,0 +1,8 @@ +{ + "version": 3, + "names": [], + "file": "invalid-mapping-segment-negative-original-column.js", + "sources": ["empty-original.js"], + "sourcesContent": [""], + "mappings": "AAAF" +} diff --git a/test/fixtures/test426/resources/invalid-mapping-segment-negative-original-line.js b/test/fixtures/test426/resources/invalid-mapping-segment-negative-original-line.js new file mode 100644 index 00000000000000..b37309601ce013 --- /dev/null +++ b/test/fixtures/test426/resources/invalid-mapping-segment-negative-original-line.js @@ -0,0 +1 @@ +//# sourceMappingURL=invalid-mapping-segment-negative-original-line.js.map diff --git a/test/fixtures/test426/resources/invalid-mapping-segment-negative-original-line.js.map b/test/fixtures/test426/resources/invalid-mapping-segment-negative-original-line.js.map new file mode 100644 index 00000000000000..40170361b5ddf8 --- /dev/null +++ b/test/fixtures/test426/resources/invalid-mapping-segment-negative-original-line.js.map @@ -0,0 +1,8 @@ +{ + "version": 3, + "names": [], + "file": "invalid-mapping-segment-negative-original-line.js", + "sources": ["empty-original.js"], + "sourcesContent": [""], + "mappings": "AAFA" +} diff --git a/test/fixtures/test426/resources/invalid-mapping-segment-negative-relative-column.js b/test/fixtures/test426/resources/invalid-mapping-segment-negative-relative-column.js new file mode 100644 index 00000000000000..94b835d6877c07 --- /dev/null +++ b/test/fixtures/test426/resources/invalid-mapping-segment-negative-relative-column.js @@ -0,0 +1 @@ +//# sourceMappingURL=invalid-mapping-segment-negative-relative-column.js.map diff --git a/test/fixtures/test426/resources/invalid-mapping-segment-negative-relative-column.js.map b/test/fixtures/test426/resources/invalid-mapping-segment-negative-relative-column.js.map new file mode 100644 index 00000000000000..414884072b55a5 --- /dev/null +++ b/test/fixtures/test426/resources/invalid-mapping-segment-negative-relative-column.js.map @@ -0,0 +1,8 @@ +{ + "version": 3, + "names": [], + "file": "invalid-mapping-segment-negative-relative-column.js", + "sources": ["empty-original.js"], + "sourcesContent": [""], + "mappings": "C,F" +} diff --git a/test/fixtures/test426/resources/invalid-mapping-segment-negative-relative-name-index.js b/test/fixtures/test426/resources/invalid-mapping-segment-negative-relative-name-index.js new file mode 100644 index 00000000000000..c965c5f011f584 --- /dev/null +++ b/test/fixtures/test426/resources/invalid-mapping-segment-negative-relative-name-index.js @@ -0,0 +1 @@ +//# sourceMappingURL=invalid-mapping-segment-negative-relative-name-index.js.map diff --git a/test/fixtures/test426/resources/invalid-mapping-segment-negative-relative-name-index.js.map b/test/fixtures/test426/resources/invalid-mapping-segment-negative-relative-name-index.js.map new file mode 100644 index 00000000000000..1fbbcfcd323e5f --- /dev/null +++ b/test/fixtures/test426/resources/invalid-mapping-segment-negative-relative-name-index.js.map @@ -0,0 +1,8 @@ +{ + "version": 3, + "names": [], + "file": "invalid-mapping-segment-negative-relative-name-index.js", + "sources": ["empty-original.js"], + "sourcesContent": [""], + "mappings": "AAAAC,AAAAF" +} diff --git a/test/fixtures/test426/resources/invalid-mapping-segment-negative-relative-original-column.js b/test/fixtures/test426/resources/invalid-mapping-segment-negative-relative-original-column.js new file mode 100644 index 00000000000000..493a6ec88a391a --- /dev/null +++ b/test/fixtures/test426/resources/invalid-mapping-segment-negative-relative-original-column.js @@ -0,0 +1 @@ +//# sourceMappingURL=invalid-mapping-segment-negative-relative-original-column.js.map diff --git a/test/fixtures/test426/resources/invalid-mapping-segment-negative-relative-original-column.js.map b/test/fixtures/test426/resources/invalid-mapping-segment-negative-relative-original-column.js.map new file mode 100644 index 00000000000000..7e62895651fa30 --- /dev/null +++ b/test/fixtures/test426/resources/invalid-mapping-segment-negative-relative-original-column.js.map @@ -0,0 +1,8 @@ +{ + "version": 3, + "names": [], + "file": "invalid-mapping-segment-negative-relative-original-column.js", + "sources": ["empty-original.js"], + "sourcesContent": [""], + "mappings": "AAAC,AAAF" +} diff --git a/test/fixtures/test426/resources/invalid-mapping-segment-negative-relative-original-line.js b/test/fixtures/test426/resources/invalid-mapping-segment-negative-relative-original-line.js new file mode 100644 index 00000000000000..ca8329fb98f02a --- /dev/null +++ b/test/fixtures/test426/resources/invalid-mapping-segment-negative-relative-original-line.js @@ -0,0 +1 @@ +//# sourceMappingURL=invalid-mapping-segment-negative-relative-original-line.js.map diff --git a/test/fixtures/test426/resources/invalid-mapping-segment-negative-relative-original-line.js.map b/test/fixtures/test426/resources/invalid-mapping-segment-negative-relative-original-line.js.map new file mode 100644 index 00000000000000..86b0fb3a04cc3d --- /dev/null +++ b/test/fixtures/test426/resources/invalid-mapping-segment-negative-relative-original-line.js.map @@ -0,0 +1,8 @@ +{ + "version": 3, + "names": [], + "file": "invalid-mapping-segment-negative-relative-original-line.js", + "sources": ["empty-original.js"], + "sourcesContent": [""], + "mappings": "AACA,AAFA" +} diff --git a/test/fixtures/test426/resources/invalid-mapping-segment-negative-relative-source-index.js b/test/fixtures/test426/resources/invalid-mapping-segment-negative-relative-source-index.js new file mode 100644 index 00000000000000..fa92225b096325 --- /dev/null +++ b/test/fixtures/test426/resources/invalid-mapping-segment-negative-relative-source-index.js @@ -0,0 +1 @@ +//# sourceMappingURL=invalid-mapping-segment-negative-relative-source-index.js.map diff --git a/test/fixtures/test426/resources/invalid-mapping-segment-negative-relative-source-index.js.map b/test/fixtures/test426/resources/invalid-mapping-segment-negative-relative-source-index.js.map new file mode 100644 index 00000000000000..2efeb047db618e --- /dev/null +++ b/test/fixtures/test426/resources/invalid-mapping-segment-negative-relative-source-index.js.map @@ -0,0 +1,8 @@ +{ + "version": 3, + "names": [], + "file": "invalid-mapping-segment-negative-relative-source-index.js", + "sources": ["empty-original.js"], + "sourcesContent": [""], + "mappings": "ACAA,AFAA" +} diff --git a/test/fixtures/test426/resources/invalid-mapping-segment-negative-source-index.js b/test/fixtures/test426/resources/invalid-mapping-segment-negative-source-index.js new file mode 100644 index 00000000000000..6e05849b6a0354 --- /dev/null +++ b/test/fixtures/test426/resources/invalid-mapping-segment-negative-source-index.js @@ -0,0 +1 @@ +//# sourceMappingURL=invalid-mapping-segment-negative-source-index.js.map diff --git a/test/fixtures/test426/resources/invalid-mapping-segment-negative-source-index.js.map b/test/fixtures/test426/resources/invalid-mapping-segment-negative-source-index.js.map new file mode 100644 index 00000000000000..ed835d8007ca68 --- /dev/null +++ b/test/fixtures/test426/resources/invalid-mapping-segment-negative-source-index.js.map @@ -0,0 +1,8 @@ +{ + "version": 3, + "names": [], + "file": "invalid-mapping-segment-negative-source-index.js", + "sources": ["empty-original.js"], + "sourcesContent": [""], + "mappings": "AFAA" +} diff --git a/test/fixtures/test426/resources/invalid-mapping-segment-original-column-too-large.js b/test/fixtures/test426/resources/invalid-mapping-segment-original-column-too-large.js new file mode 100644 index 00000000000000..0936ed7ea8fdd4 --- /dev/null +++ b/test/fixtures/test426/resources/invalid-mapping-segment-original-column-too-large.js @@ -0,0 +1 @@ +//# sourceMappingURL=invalid-mapping-segment-original-column-too-large.js.map diff --git a/test/fixtures/test426/resources/invalid-mapping-segment-original-column-too-large.js.map b/test/fixtures/test426/resources/invalid-mapping-segment-original-column-too-large.js.map new file mode 100644 index 00000000000000..8dee1df731c241 --- /dev/null +++ b/test/fixtures/test426/resources/invalid-mapping-segment-original-column-too-large.js.map @@ -0,0 +1,8 @@ +{ + "version": 3, + "names": [], + "file": "invalid-mapping-segment-original-column-too-large.js", + "sources": ["empty-original.js"], + "sourcesContent": [""], + "mappings": "AAAggggggE" +} diff --git a/test/fixtures/test426/resources/invalid-mapping-segment-original-line-too-large.js b/test/fixtures/test426/resources/invalid-mapping-segment-original-line-too-large.js new file mode 100644 index 00000000000000..9b3aa5a361ae96 --- /dev/null +++ b/test/fixtures/test426/resources/invalid-mapping-segment-original-line-too-large.js @@ -0,0 +1 @@ +//# sourceMappingURL=invalid-mapping-segment-original-line-too-large.js.map diff --git a/test/fixtures/test426/resources/invalid-mapping-segment-original-line-too-large.js.map b/test/fixtures/test426/resources/invalid-mapping-segment-original-line-too-large.js.map new file mode 100644 index 00000000000000..8ee6fea9c8350a --- /dev/null +++ b/test/fixtures/test426/resources/invalid-mapping-segment-original-line-too-large.js.map @@ -0,0 +1,8 @@ +{ + "version": 3, + "names": [], + "file": "invalid-mapping-segment-original-line-too-large.js", + "sources": ["empty-original.js"], + "sourcesContent": [""], + "mappings": "AAggggggEA" +} diff --git a/test/fixtures/test426/resources/invalid-mapping-segment-source-index-out-of-bounds.js b/test/fixtures/test426/resources/invalid-mapping-segment-source-index-out-of-bounds.js new file mode 100644 index 00000000000000..2e5fbca26825ae --- /dev/null +++ b/test/fixtures/test426/resources/invalid-mapping-segment-source-index-out-of-bounds.js @@ -0,0 +1 @@ +//# sourceMappingURL=invalid-mapping-segment-source-index-out-of-bounds.js.map diff --git a/test/fixtures/test426/resources/invalid-mapping-segment-source-index-out-of-bounds.js.map b/test/fixtures/test426/resources/invalid-mapping-segment-source-index-out-of-bounds.js.map new file mode 100644 index 00000000000000..fec001a67329e8 --- /dev/null +++ b/test/fixtures/test426/resources/invalid-mapping-segment-source-index-out-of-bounds.js.map @@ -0,0 +1,8 @@ +{ + "version": 3, + "names": [], + "file": "invalid-mapping-segment-source-index-out-of-bounds.js", + "sources": ["empty-original.js"], + "sourcesContent": [""], + "mappings": "ACAA" +} diff --git a/test/fixtures/test426/resources/invalid-mapping-segment-source-index-too-large.js b/test/fixtures/test426/resources/invalid-mapping-segment-source-index-too-large.js new file mode 100644 index 00000000000000..3f4943e1272d01 --- /dev/null +++ b/test/fixtures/test426/resources/invalid-mapping-segment-source-index-too-large.js @@ -0,0 +1 @@ +//# sourceMappingURL=invalid-mapping-segment-source-index-too-large.js.map diff --git a/test/fixtures/test426/resources/invalid-mapping-segment-source-index-too-large.js.map b/test/fixtures/test426/resources/invalid-mapping-segment-source-index-too-large.js.map new file mode 100644 index 00000000000000..555489fa65701f --- /dev/null +++ b/test/fixtures/test426/resources/invalid-mapping-segment-source-index-too-large.js.map @@ -0,0 +1,8 @@ +{ + "version": 3, + "names": [], + "file": "invalid-mapping-segment-source-index-too-large.js", + "sources": ["empty-original.js"], + "sourcesContent": [""], + "mappings": "AggggggEAA" +} diff --git a/test/fixtures/test426/resources/invalid-mapping-segment-with-three-fields.js b/test/fixtures/test426/resources/invalid-mapping-segment-with-three-fields.js new file mode 100644 index 00000000000000..ad452d96af8286 --- /dev/null +++ b/test/fixtures/test426/resources/invalid-mapping-segment-with-three-fields.js @@ -0,0 +1,2 @@ +function foo(){return 42}function bar(){return 24}foo();bar(); +//# sourceMappingURL=invalid-mapping-segment-with-three-fields.js.map diff --git a/test/fixtures/test426/resources/invalid-mapping-segment-with-three-fields.js.map b/test/fixtures/test426/resources/invalid-mapping-segment-with-three-fields.js.map new file mode 100644 index 00000000000000..c2af1165ad8f1f --- /dev/null +++ b/test/fixtures/test426/resources/invalid-mapping-segment-with-three-fields.js.map @@ -0,0 +1,6 @@ +{ + "version": 3, + "names": ["foo","bar"], + "sources": ["basic-mapping-original.js"], + "mappings": "AAA" +} diff --git a/test/fixtures/test426/resources/invalid-mapping-segment-with-two-fields.js b/test/fixtures/test426/resources/invalid-mapping-segment-with-two-fields.js new file mode 100644 index 00000000000000..04c520b47877a1 --- /dev/null +++ b/test/fixtures/test426/resources/invalid-mapping-segment-with-two-fields.js @@ -0,0 +1,2 @@ +function foo(){return 42}function bar(){return 24}foo();bar(); +//# sourceMappingURL=invalid-mapping-segment-with-two-fields.js.map diff --git a/test/fixtures/test426/resources/invalid-mapping-segment-with-two-fields.js.map b/test/fixtures/test426/resources/invalid-mapping-segment-with-two-fields.js.map new file mode 100644 index 00000000000000..73cf00fa1c9606 --- /dev/null +++ b/test/fixtures/test426/resources/invalid-mapping-segment-with-two-fields.js.map @@ -0,0 +1,6 @@ +{ + "version": 3, + "names": ["foo","bar"], + "sources": ["basic-mapping-original.js"], + "mappings": "AA" +} diff --git a/test/fixtures/test426/resources/invalid-mapping-segment-with-zero-fields.js b/test/fixtures/test426/resources/invalid-mapping-segment-with-zero-fields.js new file mode 100644 index 00000000000000..cf627825a581f0 --- /dev/null +++ b/test/fixtures/test426/resources/invalid-mapping-segment-with-zero-fields.js @@ -0,0 +1 @@ +//# sourceMappingURL=invalid-mapping-segment-with-zero-fields.js.map diff --git a/test/fixtures/test426/resources/invalid-mapping-segment-with-zero-fields.js.map b/test/fixtures/test426/resources/invalid-mapping-segment-with-zero-fields.js.map new file mode 100644 index 00000000000000..fb8e7cff64c376 --- /dev/null +++ b/test/fixtures/test426/resources/invalid-mapping-segment-with-zero-fields.js.map @@ -0,0 +1,8 @@ +{ + "version": 3, + "names": [], + "file": "invalid-mapping-segment-with-zero-fields.js", + "sources": ["empty-original.js"], + "sourcesContent": [""], + "mappings": ",,,," +} diff --git a/test/fixtures/test426/resources/invalid-vlq-missing-continuation.js b/test/fixtures/test426/resources/invalid-vlq-missing-continuation.js new file mode 100644 index 00000000000000..2c2a0090aca613 --- /dev/null +++ b/test/fixtures/test426/resources/invalid-vlq-missing-continuation.js @@ -0,0 +1 @@ +//# sourceMappingURL=invalid-vlq-missing-continuation.js.map diff --git a/test/fixtures/test426/resources/invalid-vlq-missing-continuation.js.map b/test/fixtures/test426/resources/invalid-vlq-missing-continuation.js.map new file mode 100644 index 00000000000000..dd0e363ff47354 --- /dev/null +++ b/test/fixtures/test426/resources/invalid-vlq-missing-continuation.js.map @@ -0,0 +1,6 @@ +{ + "version" : 3, + "sources": [], + "names": [], + "mappings": "g" +} diff --git a/test/fixtures/test426/resources/invalid-vlq-non-base64-char-padding.js b/test/fixtures/test426/resources/invalid-vlq-non-base64-char-padding.js new file mode 100644 index 00000000000000..557cb6aed3b262 --- /dev/null +++ b/test/fixtures/test426/resources/invalid-vlq-non-base64-char-padding.js @@ -0,0 +1 @@ +//# sourceMappingURL=invalid-vlq-non-base64-char-padding.js.map diff --git a/test/fixtures/test426/resources/invalid-vlq-non-base64-char-padding.js.map b/test/fixtures/test426/resources/invalid-vlq-non-base64-char-padding.js.map new file mode 100644 index 00000000000000..b439caabc88143 --- /dev/null +++ b/test/fixtures/test426/resources/invalid-vlq-non-base64-char-padding.js.map @@ -0,0 +1,7 @@ +{ + "version" : 3, + "sources": ["foo.js"], + "sourcesContent": ["hello world"], + "names": [], + "mappings": ";;A=" +} diff --git a/test/fixtures/test426/resources/invalid-vlq-non-base64-char.js b/test/fixtures/test426/resources/invalid-vlq-non-base64-char.js new file mode 100644 index 00000000000000..d1b20b41a29fc5 --- /dev/null +++ b/test/fixtures/test426/resources/invalid-vlq-non-base64-char.js @@ -0,0 +1 @@ +//# sourceMappingURL=invalid-vlq-non-base64-char.js.map diff --git a/test/fixtures/test426/resources/invalid-vlq-non-base64-char.js.map b/test/fixtures/test426/resources/invalid-vlq-non-base64-char.js.map new file mode 100644 index 00000000000000..4fa1ac5768853e --- /dev/null +++ b/test/fixtures/test426/resources/invalid-vlq-non-base64-char.js.map @@ -0,0 +1,6 @@ +{ + "version" : 3, + "sources": [], + "names": [], + "mappings": "A$%?!" +} diff --git a/test/fixtures/test426/resources/mapping-semantics-column-reset.js b/test/fixtures/test426/resources/mapping-semantics-column-reset.js new file mode 100644 index 00000000000000..b64482d0984324 --- /dev/null +++ b/test/fixtures/test426/resources/mapping-semantics-column-reset.js @@ -0,0 +1,3 @@ + foo + bar +//# sourceMappingURL=mapping-semantics-column-reset.js.map diff --git a/test/fixtures/test426/resources/mapping-semantics-column-reset.js.map b/test/fixtures/test426/resources/mapping-semantics-column-reset.js.map new file mode 100644 index 00000000000000..97bc9b91a43d51 --- /dev/null +++ b/test/fixtures/test426/resources/mapping-semantics-column-reset.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "names": [], + "sources": ["mapping-semantics-column-reset-original.js"], + "sourcesContent": ["foo\nbar"], + "mappings": "CAAA;CACA" +} diff --git a/test/fixtures/test426/resources/mapping-semantics-five-field-segment.js b/test/fixtures/test426/resources/mapping-semantics-five-field-segment.js new file mode 100644 index 00000000000000..0f6602d61503c5 --- /dev/null +++ b/test/fixtures/test426/resources/mapping-semantics-five-field-segment.js @@ -0,0 +1,2 @@ +foo +//# sourceMappingURL=mapping-semantics-five-field-segment.js.map diff --git a/test/fixtures/test426/resources/mapping-semantics-five-field-segment.js.map b/test/fixtures/test426/resources/mapping-semantics-five-field-segment.js.map new file mode 100644 index 00000000000000..d0504f511dad2d --- /dev/null +++ b/test/fixtures/test426/resources/mapping-semantics-five-field-segment.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "names": ["foo"], + "sources": ["unused", "mapping-semantics-five-field-segment-original.js"], + "sourcesContent": ["", "\n\n foo"], + "mappings": "CCEEA" +} diff --git a/test/fixtures/test426/resources/mapping-semantics-four-field-segment.js b/test/fixtures/test426/resources/mapping-semantics-four-field-segment.js new file mode 100644 index 00000000000000..3dcbee9294c0b4 --- /dev/null +++ b/test/fixtures/test426/resources/mapping-semantics-four-field-segment.js @@ -0,0 +1,2 @@ +foo +//# sourceMappingURL=mapping-semantics-four-field-segment.js.map diff --git a/test/fixtures/test426/resources/mapping-semantics-four-field-segment.js.map b/test/fixtures/test426/resources/mapping-semantics-four-field-segment.js.map new file mode 100644 index 00000000000000..9e01ac4b6c58f8 --- /dev/null +++ b/test/fixtures/test426/resources/mapping-semantics-four-field-segment.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "names": [], + "sources": ["unused", "mapping-semantics-four-field-segment-original.js"], + "sourcesContent": ["", "\n\n foo"], + "mappings": "CCEE" +} diff --git a/test/fixtures/test426/resources/mapping-semantics-relative-1.js b/test/fixtures/test426/resources/mapping-semantics-relative-1.js new file mode 100644 index 00000000000000..281870cc50e772 --- /dev/null +++ b/test/fixtures/test426/resources/mapping-semantics-relative-1.js @@ -0,0 +1,2 @@ + 42; 24; +//# sourceMappingURL=mapping-semantics-relative-1.js.map diff --git a/test/fixtures/test426/resources/mapping-semantics-relative-1.js.map b/test/fixtures/test426/resources/mapping-semantics-relative-1.js.map new file mode 100644 index 00000000000000..6570031f8983f4 --- /dev/null +++ b/test/fixtures/test426/resources/mapping-semantics-relative-1.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "names": [], + "sources": ["unused", "mapping-semantics-relative-1-original.js"], + "sourcesContent": ["", "42; 24;"], + "mappings": "CCAA,IAAI" +} diff --git a/test/fixtures/test426/resources/mapping-semantics-relative-2.js b/test/fixtures/test426/resources/mapping-semantics-relative-2.js new file mode 100644 index 00000000000000..f4bff1c75bccef --- /dev/null +++ b/test/fixtures/test426/resources/mapping-semantics-relative-2.js @@ -0,0 +1,3 @@ + foo + bar +//# sourceMappingURL=mapping-semantics-relative-2.js.map diff --git a/test/fixtures/test426/resources/mapping-semantics-relative-2.js.map b/test/fixtures/test426/resources/mapping-semantics-relative-2.js.map new file mode 100644 index 00000000000000..d6845233f91207 --- /dev/null +++ b/test/fixtures/test426/resources/mapping-semantics-relative-2.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "names": ["foo", "bar"], + "sources": ["unused", "mapping-semantics-relative-2-original.js"], + "sourcesContent": ["", " foo\n bar"], + "mappings": "CCAEA;EACAC" +} diff --git a/test/fixtures/test426/resources/mapping-semantics-single-field-segment.js b/test/fixtures/test426/resources/mapping-semantics-single-field-segment.js new file mode 100644 index 00000000000000..ca06b7c58d8847 --- /dev/null +++ b/test/fixtures/test426/resources/mapping-semantics-single-field-segment.js @@ -0,0 +1,2 @@ + 3 +//# sourceMappingURL=mapping-semantics-single-field-segment.js.map diff --git a/test/fixtures/test426/resources/mapping-semantics-single-field-segment.js.map b/test/fixtures/test426/resources/mapping-semantics-single-field-segment.js.map new file mode 100644 index 00000000000000..8260d63085d79b --- /dev/null +++ b/test/fixtures/test426/resources/mapping-semantics-single-field-segment.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "names": [], + "sources": ["mapping-semantics-single-field-segment-original.js"], + "sourcesContent": ["3 3"], + "mappings": "AAAC,E" +} diff --git a/test/fixtures/test426/resources/mappings-missing.js b/test/fixtures/test426/resources/mappings-missing.js new file mode 100644 index 00000000000000..07a8361e8fcae9 --- /dev/null +++ b/test/fixtures/test426/resources/mappings-missing.js @@ -0,0 +1 @@ +//# sourceMappingURL=mappings-missing.js.map diff --git a/test/fixtures/test426/resources/mappings-missing.js.map b/test/fixtures/test426/resources/mappings-missing.js.map new file mode 100644 index 00000000000000..7a60084729612d --- /dev/null +++ b/test/fixtures/test426/resources/mappings-missing.js.map @@ -0,0 +1,6 @@ +{ + "version" : 3, + "names": ["foo"], + "sources": ["1.js"], + "sourcesContent": ["hello world"] +} diff --git a/test/fixtures/test426/resources/names-missing.js b/test/fixtures/test426/resources/names-missing.js new file mode 100644 index 00000000000000..58781fd88705d3 --- /dev/null +++ b/test/fixtures/test426/resources/names-missing.js @@ -0,0 +1 @@ +//# sourceMappingURL=names-missing.js.map diff --git a/test/fixtures/test426/resources/names-missing.js.map b/test/fixtures/test426/resources/names-missing.js.map new file mode 100644 index 00000000000000..475f4e309b2641 --- /dev/null +++ b/test/fixtures/test426/resources/names-missing.js.map @@ -0,0 +1,6 @@ +{ + "version" : 3, + "sources": ["empty-original.js"], + "sourcesContent" : [""], + "mappings": "" +} diff --git a/test/fixtures/test426/resources/names-not-a-list-1.js b/test/fixtures/test426/resources/names-not-a-list-1.js new file mode 100644 index 00000000000000..dc65f1972b5a87 --- /dev/null +++ b/test/fixtures/test426/resources/names-not-a-list-1.js @@ -0,0 +1 @@ +//# sourceMappingURL=names-not-a-list-1.js.map diff --git a/test/fixtures/test426/resources/names-not-a-list-1.js.map b/test/fixtures/test426/resources/names-not-a-list-1.js.map new file mode 100644 index 00000000000000..fe1edaeb96ad90 --- /dev/null +++ b/test/fixtures/test426/resources/names-not-a-list-1.js.map @@ -0,0 +1,6 @@ +{ + "version" : 3, + "sources": ["source.js"], + "names": "not a list", + "mappings": "AAAAA" +} diff --git a/test/fixtures/test426/resources/names-not-a-list-2.js b/test/fixtures/test426/resources/names-not-a-list-2.js new file mode 100644 index 00000000000000..d7251f78da8457 --- /dev/null +++ b/test/fixtures/test426/resources/names-not-a-list-2.js @@ -0,0 +1 @@ +//# sourceMappingURL=names-not-a-list-2.js.map diff --git a/test/fixtures/test426/resources/names-not-a-list-2.js.map b/test/fixtures/test426/resources/names-not-a-list-2.js.map new file mode 100644 index 00000000000000..3388d2bb7109d0 --- /dev/null +++ b/test/fixtures/test426/resources/names-not-a-list-2.js.map @@ -0,0 +1,6 @@ +{ + "version" : 3, + "sources": ["source.js"], + "names": { "foo": 3 }, + "mappings": "AAAAA" +} diff --git a/test/fixtures/test426/resources/names-not-string.js b/test/fixtures/test426/resources/names-not-string.js new file mode 100644 index 00000000000000..8dc7b4811a3e91 --- /dev/null +++ b/test/fixtures/test426/resources/names-not-string.js @@ -0,0 +1 @@ +//# sourceMappingURL=names-not-string.js.map diff --git a/test/fixtures/test426/resources/names-not-string.js.map b/test/fixtures/test426/resources/names-not-string.js.map new file mode 100644 index 00000000000000..c0feb0739aecff --- /dev/null +++ b/test/fixtures/test426/resources/names-not-string.js.map @@ -0,0 +1,6 @@ +{ + "version" : 3, + "sources": ["source.js"], + "names": [null, 3, true, false, {}, []], + "mappings": "AAAAA" +} diff --git a/test/fixtures/test426/resources/second-source-original.js b/test/fixtures/test426/resources/second-source-original.js new file mode 100644 index 00000000000000..c339bc9d15daa0 --- /dev/null +++ b/test/fixtures/test426/resources/second-source-original.js @@ -0,0 +1,4 @@ +function baz() { + return "baz"; +} +baz(); diff --git a/test/fixtures/test426/resources/source-resolution-absolute-url.js b/test/fixtures/test426/resources/source-resolution-absolute-url.js new file mode 100644 index 00000000000000..7ab34b6bd0fac9 --- /dev/null +++ b/test/fixtures/test426/resources/source-resolution-absolute-url.js @@ -0,0 +1,2 @@ +function foo(){return 42}function bar(){return 24}foo();bar(); +//# sourceMappingURL=source-resolution-absolute-url.js.map diff --git a/test/fixtures/test426/resources/source-resolution-absolute-url.js.map b/test/fixtures/test426/resources/source-resolution-absolute-url.js.map new file mode 100644 index 00000000000000..195dc42ecea399 --- /dev/null +++ b/test/fixtures/test426/resources/source-resolution-absolute-url.js.map @@ -0,0 +1,8 @@ +{ + "version": 3, + "file": "source-root-resolution.js", + "names": ["foo", "bar"], + "sources": ["/baz/quux/basic-mapping-original.js"], + "sourcesContent": ["function foo() {\nreturn 42;\n }\n function bar() {\n return 24;\n }\n foo();\n bar();"], + "mappings": "AAAA,SAASA" +} diff --git a/test/fixtures/test426/resources/source-root-not-a-string-1.js b/test/fixtures/test426/resources/source-root-not-a-string-1.js new file mode 100644 index 00000000000000..f176f3143a4adf --- /dev/null +++ b/test/fixtures/test426/resources/source-root-not-a-string-1.js @@ -0,0 +1 @@ +//# sourceMappingURL=source-root-not-a-string-1.js.map diff --git a/test/fixtures/test426/resources/source-root-not-a-string-1.js.map b/test/fixtures/test426/resources/source-root-not-a-string-1.js.map new file mode 100644 index 00000000000000..e297f5c03e5096 --- /dev/null +++ b/test/fixtures/test426/resources/source-root-not-a-string-1.js.map @@ -0,0 +1,8 @@ +{ + "version" : 3, + "sourceRoot": [], + "sources": ["empty-original.js"], + "sourcesContent": [""], + "names": [], + "mappings": "" +} diff --git a/test/fixtures/test426/resources/source-root-not-a-string-2.js b/test/fixtures/test426/resources/source-root-not-a-string-2.js new file mode 100644 index 00000000000000..e7e6d9547825e6 --- /dev/null +++ b/test/fixtures/test426/resources/source-root-not-a-string-2.js @@ -0,0 +1 @@ +//# sourceMappingURL=source-root-not-a-string-2.js.map diff --git a/test/fixtures/test426/resources/source-root-not-a-string-2.js.map b/test/fixtures/test426/resources/source-root-not-a-string-2.js.map new file mode 100644 index 00000000000000..d5705ebfb8e982 --- /dev/null +++ b/test/fixtures/test426/resources/source-root-not-a-string-2.js.map @@ -0,0 +1,8 @@ +{ + "version" : 3, + "sourceRoot": -10923409, + "sources": ["empty-original.js"], + "sourcesContent": [""], + "names": [], + "mappings": "" +} diff --git a/test/fixtures/test426/resources/source-root-resolution.js b/test/fixtures/test426/resources/source-root-resolution.js new file mode 100644 index 00000000000000..15a1a4c95026b0 --- /dev/null +++ b/test/fixtures/test426/resources/source-root-resolution.js @@ -0,0 +1,2 @@ +function foo(){return 42}function bar(){return 24}foo();bar(); +//# sourceMappingURL=source-root-resolution.js.map diff --git a/test/fixtures/test426/resources/source-root-resolution.js.map b/test/fixtures/test426/resources/source-root-resolution.js.map new file mode 100644 index 00000000000000..52fc9a23793f7c --- /dev/null +++ b/test/fixtures/test426/resources/source-root-resolution.js.map @@ -0,0 +1,9 @@ +{ + "version": 3, + "sourceRoot": "theroot", + "file": "source-root-resolution.js", + "names": ["foo", "bar"], + "sources": ["basic-mapping-original.js"], + "sourcesContent": ["function foo() {\n return 42;\n }\n function bar() {\n return 24;\n }\n foo();\n bar();"], + "mappings": "AAAA,SAASA" +} diff --git a/test/fixtures/test426/resources/sources-and-sources-content-both-null.js b/test/fixtures/test426/resources/sources-and-sources-content-both-null.js new file mode 100644 index 00000000000000..9263eba549f5b6 --- /dev/null +++ b/test/fixtures/test426/resources/sources-and-sources-content-both-null.js @@ -0,0 +1 @@ +//# sourceMappingURL=sources-and-sources-content-both-null.js.map diff --git a/test/fixtures/test426/resources/sources-and-sources-content-both-null.js.map b/test/fixtures/test426/resources/sources-and-sources-content-both-null.js.map new file mode 100644 index 00000000000000..09a7c1f3698ce6 --- /dev/null +++ b/test/fixtures/test426/resources/sources-and-sources-content-both-null.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "names": ["foo"], + "sources": [null], + "sourcesContent": [null], + "mappings":"AAAA,SAASA" +} diff --git a/test/fixtures/test426/resources/sources-content-missing.js b/test/fixtures/test426/resources/sources-content-missing.js new file mode 100644 index 00000000000000..c97d9f133a590d --- /dev/null +++ b/test/fixtures/test426/resources/sources-content-missing.js @@ -0,0 +1 @@ +//# sourceMappingURL=sources-content-missing.js.map diff --git a/test/fixtures/test426/resources/sources-content-missing.js.map b/test/fixtures/test426/resources/sources-content-missing.js.map new file mode 100644 index 00000000000000..fa7922f5c783fe --- /dev/null +++ b/test/fixtures/test426/resources/sources-content-missing.js.map @@ -0,0 +1,6 @@ +{ + "version" : 3, + "names": ["foo"], + "sources": ["basic-mapping-original.js"], + "mappings": "" +} diff --git a/test/fixtures/test426/resources/sources-content-not-a-list-1.js b/test/fixtures/test426/resources/sources-content-not-a-list-1.js new file mode 100644 index 00000000000000..5395f8b6fbe655 --- /dev/null +++ b/test/fixtures/test426/resources/sources-content-not-a-list-1.js @@ -0,0 +1 @@ +//# sourceMappingURL=sources-content-not-a-list-1.js.map diff --git a/test/fixtures/test426/resources/sources-content-not-a-list-1.js.map b/test/fixtures/test426/resources/sources-content-not-a-list-1.js.map new file mode 100644 index 00000000000000..3710f95111b755 --- /dev/null +++ b/test/fixtures/test426/resources/sources-content-not-a-list-1.js.map @@ -0,0 +1,7 @@ +{ + "version" : 3, + "sources": ["first.js"], + "sourcesContent": "not a list", + "names": ["foo"], + "mappings": "AAAAA" +} diff --git a/test/fixtures/test426/resources/sources-content-not-a-list-2.js b/test/fixtures/test426/resources/sources-content-not-a-list-2.js new file mode 100644 index 00000000000000..0ccc4aa460af30 --- /dev/null +++ b/test/fixtures/test426/resources/sources-content-not-a-list-2.js @@ -0,0 +1 @@ +//# sourceMappingURL=sources-content-not-a-list-2.js.map diff --git a/test/fixtures/test426/resources/sources-content-not-a-list-2.js.map b/test/fixtures/test426/resources/sources-content-not-a-list-2.js.map new file mode 100644 index 00000000000000..ab9ae257c1f9e4 --- /dev/null +++ b/test/fixtures/test426/resources/sources-content-not-a-list-2.js.map @@ -0,0 +1,7 @@ +{ + "version" : 3, + "sources": ["first.js"], + "sourcesContent": { "foobar baz": 3 }, + "names": ["foo"], + "mappings": "AAAAA" +} diff --git a/test/fixtures/test426/resources/sources-content-not-string-or-null.js b/test/fixtures/test426/resources/sources-content-not-string-or-null.js new file mode 100644 index 00000000000000..480b4ba7403f88 --- /dev/null +++ b/test/fixtures/test426/resources/sources-content-not-string-or-null.js @@ -0,0 +1 @@ +//# sourceMappingURL=sources-content-not-string-or-null.js.map diff --git a/test/fixtures/test426/resources/sources-content-not-string-or-null.js.map b/test/fixtures/test426/resources/sources-content-not-string-or-null.js.map new file mode 100644 index 00000000000000..6e6c2517150b96 --- /dev/null +++ b/test/fixtures/test426/resources/sources-content-not-string-or-null.js.map @@ -0,0 +1,7 @@ +{ + "version" : 3, + "sources": ["1.js", "2.js", "3.js", "4.js", "5.js"], + "sourcesContent": [3, {}, true, false, []], + "names": ["foo"], + "mappings": "AAAAA" +} diff --git a/test/fixtures/test426/resources/sources-missing.js b/test/fixtures/test426/resources/sources-missing.js new file mode 100644 index 00000000000000..779b865e2769ad --- /dev/null +++ b/test/fixtures/test426/resources/sources-missing.js @@ -0,0 +1 @@ +//# sourceMappingURL=sources-missing.js.map diff --git a/test/fixtures/test426/resources/sources-missing.js.map b/test/fixtures/test426/resources/sources-missing.js.map new file mode 100644 index 00000000000000..92aff4fb0e74b1 --- /dev/null +++ b/test/fixtures/test426/resources/sources-missing.js.map @@ -0,0 +1,5 @@ +{ + "version" : 3, + "names": ["foo"], + "mappings": "" +} diff --git a/test/fixtures/test426/resources/sources-non-null-sources-content-null.js b/test/fixtures/test426/resources/sources-non-null-sources-content-null.js new file mode 100644 index 00000000000000..939b568ba14251 --- /dev/null +++ b/test/fixtures/test426/resources/sources-non-null-sources-content-null.js @@ -0,0 +1,2 @@ +function foo(){return 42}function bar(){return 24}foo();bar(); +//# sourceMappingURL=sources-non-null-sources-content-null.js.map diff --git a/test/fixtures/test426/resources/sources-non-null-sources-content-null.js.map b/test/fixtures/test426/resources/sources-non-null-sources-content-null.js.map new file mode 100644 index 00000000000000..e573906b2d7144 --- /dev/null +++ b/test/fixtures/test426/resources/sources-non-null-sources-content-null.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "names": ["foo"], + "sources": ["basic-mapping-original.js"], + "sourcesContent": [null], + "mappings":"AAAA,SAASA" +} diff --git a/test/fixtures/test426/resources/sources-not-a-list-1.js b/test/fixtures/test426/resources/sources-not-a-list-1.js new file mode 100644 index 00000000000000..7e33b7e8672535 --- /dev/null +++ b/test/fixtures/test426/resources/sources-not-a-list-1.js @@ -0,0 +1 @@ +//# sourceMappingURL=sources-not-a-list-1.js.map diff --git a/test/fixtures/test426/resources/sources-not-a-list-1.js.map b/test/fixtures/test426/resources/sources-not-a-list-1.js.map new file mode 100644 index 00000000000000..26330517b9884f --- /dev/null +++ b/test/fixtures/test426/resources/sources-not-a-list-1.js.map @@ -0,0 +1,6 @@ +{ + "version" : 3, + "sources": "not a list", + "names": ["foo"], + "mappings": "AAAAA" +} diff --git a/test/fixtures/test426/resources/sources-not-a-list-2.js b/test/fixtures/test426/resources/sources-not-a-list-2.js new file mode 100644 index 00000000000000..4021f763fc880b --- /dev/null +++ b/test/fixtures/test426/resources/sources-not-a-list-2.js @@ -0,0 +1 @@ +//# sourceMappingURL=sources-not-a-list-2.js.map diff --git a/test/fixtures/test426/resources/sources-not-a-list-2.js.map b/test/fixtures/test426/resources/sources-not-a-list-2.js.map new file mode 100644 index 00000000000000..2ed85962fddf31 --- /dev/null +++ b/test/fixtures/test426/resources/sources-not-a-list-2.js.map @@ -0,0 +1,6 @@ +{ + "version" : 3, + "sources": { "source.js": 3 }, + "names": ["foo"], + "mappings": "AAAAA" +} diff --git a/test/fixtures/test426/resources/sources-not-string-or-null.js b/test/fixtures/test426/resources/sources-not-string-or-null.js new file mode 100644 index 00000000000000..7dca97a1dab557 --- /dev/null +++ b/test/fixtures/test426/resources/sources-not-string-or-null.js @@ -0,0 +1 @@ +//# sourceMappingURL=sources-not-string-or-null.js.map diff --git a/test/fixtures/test426/resources/sources-not-string-or-null.js.map b/test/fixtures/test426/resources/sources-not-string-or-null.js.map new file mode 100644 index 00000000000000..db25561966056d --- /dev/null +++ b/test/fixtures/test426/resources/sources-not-string-or-null.js.map @@ -0,0 +1,6 @@ +{ + "version" : 3, + "sources": [3, {}, true, false, []], + "names": ["foo"], + "mappings": "AAAAA" +} diff --git a/test/fixtures/test426/resources/sources-null-sources-content-non-null.js b/test/fixtures/test426/resources/sources-null-sources-content-non-null.js new file mode 100644 index 00000000000000..a760594ee9bd13 --- /dev/null +++ b/test/fixtures/test426/resources/sources-null-sources-content-non-null.js @@ -0,0 +1,2 @@ +function foo(){return 42}function bar(){return 24}foo();bar(); +//# sourceMappingURL=sources-null-sources-content-non-null.js.map diff --git a/test/fixtures/test426/resources/sources-null-sources-content-non-null.js.map b/test/fixtures/test426/resources/sources-null-sources-content-non-null.js.map new file mode 100644 index 00000000000000..43af03903f64f8 --- /dev/null +++ b/test/fixtures/test426/resources/sources-null-sources-content-non-null.js.map @@ -0,0 +1,7 @@ +{ + "version":3, + "names": ["foo"], + "sources": [null], + "sourcesContent": ["function foo()\n{ return 42; }\nfunction bar()\n { return 24; }\nfoo();\nbar();"], + "mappings":"AAAA,SAASA" +} diff --git a/test/fixtures/test426/resources/transitive-mapping-original.js b/test/fixtures/test426/resources/transitive-mapping-original.js new file mode 100644 index 00000000000000..0a96699d6e2540 --- /dev/null +++ b/test/fixtures/test426/resources/transitive-mapping-original.js @@ -0,0 +1,5 @@ +function foo(x) { + return x; +} +foo("foo"); +//# sourceMappingURL=transitive-mapping-original.js.map diff --git a/test/fixtures/test426/resources/transitive-mapping-original.js.map b/test/fixtures/test426/resources/transitive-mapping-original.js.map new file mode 100644 index 00000000000000..65af25c1ebbe4c --- /dev/null +++ b/test/fixtures/test426/resources/transitive-mapping-original.js.map @@ -0,0 +1,8 @@ +{ + "version": 3, + "file" : "transitive-mapping-original.js", + "sourceRoot": "", + "sources": ["typescript-original.ts"], + "names": [], + "mappings": "AACA,SAAS,GAAG,CAAC,CAAU;IACrB,OAAO,CAAC,CAAC;AACX,CAAC;AACD,GAAG,CAAC,KAAK,CAAC,CAAC" +} diff --git a/test/fixtures/test426/resources/transitive-mapping-three-steps.js b/test/fixtures/test426/resources/transitive-mapping-three-steps.js new file mode 100644 index 00000000000000..fd956164d34906 --- /dev/null +++ b/test/fixtures/test426/resources/transitive-mapping-three-steps.js @@ -0,0 +1,6 @@ +function foo(x) { + return x; +} + +foo("foo"); +//# sourceMappingURL=transitive-mapping-three-steps.js.map diff --git a/test/fixtures/test426/resources/transitive-mapping-three-steps.js.map b/test/fixtures/test426/resources/transitive-mapping-three-steps.js.map new file mode 100644 index 00000000000000..90459d90f6a0ea --- /dev/null +++ b/test/fixtures/test426/resources/transitive-mapping-three-steps.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "file": "transitive-mapping-three-steps.js", + "sources": ["transitive-mapping.js"], + "names": ["foo", "x"], + "mappings": "AAAA,SAASA,IAAIC;IAAG,OAAOA;AAAC;;AAACD,IAAI,KAAK" +} diff --git a/test/fixtures/test426/resources/transitive-mapping.js b/test/fixtures/test426/resources/transitive-mapping.js new file mode 100644 index 00000000000000..183c027f1bb81e --- /dev/null +++ b/test/fixtures/test426/resources/transitive-mapping.js @@ -0,0 +1,2 @@ +function foo(x){return x}foo("foo"); +//# sourceMappingURL=transitive-mapping.js.map diff --git a/test/fixtures/test426/resources/transitive-mapping.js.map b/test/fixtures/test426/resources/transitive-mapping.js.map new file mode 100644 index 00000000000000..d6a6fa6672d483 --- /dev/null +++ b/test/fixtures/test426/resources/transitive-mapping.js.map @@ -0,0 +1,6 @@ +{ + "version": 3, + "names": ["foo","x"], + "sources": ["transitive-mapping-original.js"], + "mappings":"AAAA,SAASA,IAAIC,GACT,OAAOA,CACX,CACAD,IAAI" +} diff --git a/test/fixtures/test426/resources/typescript-original.ts b/test/fixtures/test426/resources/typescript-original.ts new file mode 100644 index 00000000000000..cd51c01ba1297e --- /dev/null +++ b/test/fixtures/test426/resources/typescript-original.ts @@ -0,0 +1,5 @@ +type FooArg = string | number; +function foo(x : FooArg) { + return x; +} +foo("foo"); diff --git a/test/fixtures/test426/resources/unrecognized-property.js b/test/fixtures/test426/resources/unrecognized-property.js new file mode 100644 index 00000000000000..19dfb0e2e6c7c1 --- /dev/null +++ b/test/fixtures/test426/resources/unrecognized-property.js @@ -0,0 +1 @@ +//# sourceMappingURL=unrecognized-property.js.map diff --git a/test/fixtures/test426/resources/unrecognized-property.js.map b/test/fixtures/test426/resources/unrecognized-property.js.map new file mode 100644 index 00000000000000..40bee558a4ff92 --- /dev/null +++ b/test/fixtures/test426/resources/unrecognized-property.js.map @@ -0,0 +1,8 @@ +{ + "version" : 3, + "sources": [], + "names": [], + "mappings": "", + "foobar": 42, + "unusedProperty": [1, 2, 3, 4] +} diff --git a/test/fixtures/test426/resources/valid-mapping-boundary-values.js b/test/fixtures/test426/resources/valid-mapping-boundary-values.js new file mode 100644 index 00000000000000..3c49709e05ac02 --- /dev/null +++ b/test/fixtures/test426/resources/valid-mapping-boundary-values.js @@ -0,0 +1 @@ +//# sourceMappingURL=valid-mapping-boundary-values.js.map diff --git a/test/fixtures/test426/resources/valid-mapping-boundary-values.js.map b/test/fixtures/test426/resources/valid-mapping-boundary-values.js.map new file mode 100644 index 00000000000000..39943bc891655e --- /dev/null +++ b/test/fixtures/test426/resources/valid-mapping-boundary-values.js.map @@ -0,0 +1,8 @@ +{ + "version": 3, + "names": ["foo"], + "file": "valid-mapping-boundary-values.js", + "sources": ["empty-original.js"], + "sourcesContent": [""], + "mappings": "+/////DA+/////D+/////DA" +} diff --git a/test/fixtures/test426/resources/valid-mapping-empty-groups.js b/test/fixtures/test426/resources/valid-mapping-empty-groups.js new file mode 100644 index 00000000000000..a2b767b619a03c --- /dev/null +++ b/test/fixtures/test426/resources/valid-mapping-empty-groups.js @@ -0,0 +1 @@ +//# sourceMappingURL=valid-mapping-empty-groups.js.map diff --git a/test/fixtures/test426/resources/valid-mapping-empty-groups.js.map b/test/fixtures/test426/resources/valid-mapping-empty-groups.js.map new file mode 100644 index 00000000000000..643c9ae78481a9 --- /dev/null +++ b/test/fixtures/test426/resources/valid-mapping-empty-groups.js.map @@ -0,0 +1,8 @@ +{ + "version": 3, + "names": [], + "file": "valid-mapping-empty-groups.js", + "sources": ["empty-original.js"], + "sourcesContent": [""], + "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;" +} diff --git a/test/fixtures/test426/resources/valid-mapping-empty-string.js b/test/fixtures/test426/resources/valid-mapping-empty-string.js new file mode 100644 index 00000000000000..83fc1bf3ac7314 --- /dev/null +++ b/test/fixtures/test426/resources/valid-mapping-empty-string.js @@ -0,0 +1 @@ +//# sourceMappingURL=valid-mapping-empty-string.js.map diff --git a/test/fixtures/test426/resources/valid-mapping-empty-string.js.map b/test/fixtures/test426/resources/valid-mapping-empty-string.js.map new file mode 100644 index 00000000000000..a35268d8f5b88b --- /dev/null +++ b/test/fixtures/test426/resources/valid-mapping-empty-string.js.map @@ -0,0 +1,8 @@ +{ + "version": 3, + "names": [], + "file": "valid-mapping-empty-string.js", + "sources": ["empty-original.js"], + "sourcesContent": [""], + "mappings": "" +} diff --git a/test/fixtures/test426/resources/valid-mapping-large-vlq.js b/test/fixtures/test426/resources/valid-mapping-large-vlq.js new file mode 100644 index 00000000000000..b0cd8978132af3 --- /dev/null +++ b/test/fixtures/test426/resources/valid-mapping-large-vlq.js @@ -0,0 +1 @@ +//# sourceMappingURL=valid-mapping-large-vlq.js.map diff --git a/test/fixtures/test426/resources/valid-mapping-large-vlq.js.map b/test/fixtures/test426/resources/valid-mapping-large-vlq.js.map new file mode 100644 index 00000000000000..76e18704c4b1a2 --- /dev/null +++ b/test/fixtures/test426/resources/valid-mapping-large-vlq.js.map @@ -0,0 +1,6 @@ +{ + "version": 3, + "names": [], + "sources": ["valid-mapping-large-vlq.js"], + "mappings": "igggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggA" +} diff --git a/test/fixtures/test426/resources/version-missing.js b/test/fixtures/test426/resources/version-missing.js new file mode 100644 index 00000000000000..c32d1f1a1cc682 --- /dev/null +++ b/test/fixtures/test426/resources/version-missing.js @@ -0,0 +1 @@ +//# sourceMappingURL=version-missing.js.map diff --git a/test/fixtures/test426/resources/version-missing.js.map b/test/fixtures/test426/resources/version-missing.js.map new file mode 100644 index 00000000000000..49d8ce766edb9f --- /dev/null +++ b/test/fixtures/test426/resources/version-missing.js.map @@ -0,0 +1,5 @@ +{ + "sources": [], + "names": [], + "mappings": "" +} diff --git a/test/fixtures/test426/resources/version-not-a-number.js b/test/fixtures/test426/resources/version-not-a-number.js new file mode 100644 index 00000000000000..ae2342e2ffe510 --- /dev/null +++ b/test/fixtures/test426/resources/version-not-a-number.js @@ -0,0 +1 @@ +//# sourceMappingURL=version-not-a-number.js.map diff --git a/test/fixtures/test426/resources/version-not-a-number.js.map b/test/fixtures/test426/resources/version-not-a-number.js.map new file mode 100644 index 00000000000000..a584d6e6951171 --- /dev/null +++ b/test/fixtures/test426/resources/version-not-a-number.js.map @@ -0,0 +1,6 @@ +{ + "version" : "3foo", + "sources": [], + "names": [], + "mappings": "" +} diff --git a/test/fixtures/test426/resources/version-numeric-string.js b/test/fixtures/test426/resources/version-numeric-string.js new file mode 100644 index 00000000000000..a55170885da6dc --- /dev/null +++ b/test/fixtures/test426/resources/version-numeric-string.js @@ -0,0 +1 @@ +//# sourceMappingURL=version-numeric-string.js.map diff --git a/test/fixtures/test426/resources/version-numeric-string.js.map b/test/fixtures/test426/resources/version-numeric-string.js.map new file mode 100644 index 00000000000000..dbe52a7d0df69a --- /dev/null +++ b/test/fixtures/test426/resources/version-numeric-string.js.map @@ -0,0 +1,6 @@ +{ + "version" : "3", + "sources": [], + "names": [], + "mappings": "" +} diff --git a/test/fixtures/test426/resources/version-too-high.js b/test/fixtures/test426/resources/version-too-high.js new file mode 100644 index 00000000000000..55f4e1a298fad7 --- /dev/null +++ b/test/fixtures/test426/resources/version-too-high.js @@ -0,0 +1 @@ +//# sourceMappingURL=version-too-high.js.map diff --git a/test/fixtures/test426/resources/version-too-high.js.map b/test/fixtures/test426/resources/version-too-high.js.map new file mode 100644 index 00000000000000..ee23be32ff278f --- /dev/null +++ b/test/fixtures/test426/resources/version-too-high.js.map @@ -0,0 +1,6 @@ +{ + "version" : 4, + "sources": [], + "names": [], + "mappings": "" +} diff --git a/test/fixtures/test426/resources/version-too-low.js b/test/fixtures/test426/resources/version-too-low.js new file mode 100644 index 00000000000000..d9642920b31345 --- /dev/null +++ b/test/fixtures/test426/resources/version-too-low.js @@ -0,0 +1 @@ +//# sourceMappingURL=version-too-low.js.map diff --git a/test/fixtures/test426/resources/version-too-low.js.map b/test/fixtures/test426/resources/version-too-low.js.map new file mode 100644 index 00000000000000..64ca7a6e2e9282 --- /dev/null +++ b/test/fixtures/test426/resources/version-too-low.js.map @@ -0,0 +1,6 @@ +{ + "version" : 2, + "sources": [], + "names": [], + "mappings": "" +} diff --git a/test/fixtures/test426/resources/version-valid.js b/test/fixtures/test426/resources/version-valid.js new file mode 100644 index 00000000000000..82d0bfa1eb2a17 --- /dev/null +++ b/test/fixtures/test426/resources/version-valid.js @@ -0,0 +1 @@ +//# sourceMappingURL=version-valid.js.map diff --git a/test/fixtures/test426/resources/version-valid.js.map b/test/fixtures/test426/resources/version-valid.js.map new file mode 100644 index 00000000000000..1a163052d8fc86 --- /dev/null +++ b/test/fixtures/test426/resources/version-valid.js.map @@ -0,0 +1,6 @@ +{ + "version" : 3, + "sources": [], + "names": [], + "mappings": "" +} diff --git a/test/fixtures/test426/resources/vlq-valid-continuation-bit-present-1.js b/test/fixtures/test426/resources/vlq-valid-continuation-bit-present-1.js new file mode 100644 index 00000000000000..511e7be18ae5ba --- /dev/null +++ b/test/fixtures/test426/resources/vlq-valid-continuation-bit-present-1.js @@ -0,0 +1,2 @@ + 3 +//# sourceMappingURL=vlq-valid-continuation-bit-present-1.js.map diff --git a/test/fixtures/test426/resources/vlq-valid-continuation-bit-present-1.js.map b/test/fixtures/test426/resources/vlq-valid-continuation-bit-present-1.js.map new file mode 100644 index 00000000000000..f4acb4b4183754 --- /dev/null +++ b/test/fixtures/test426/resources/vlq-valid-continuation-bit-present-1.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "names": [], + "sources": ["vlq-valid-continuation-bit-present-1-original.js"], + "sourcesContent": [" 3"], + "mappings": "+gAgAgAigA" +} diff --git a/test/fixtures/test426/resources/vlq-valid-continuation-bit-present-2.js b/test/fixtures/test426/resources/vlq-valid-continuation-bit-present-2.js new file mode 100644 index 00000000000000..0c879ce052ad95 --- /dev/null +++ b/test/fixtures/test426/resources/vlq-valid-continuation-bit-present-2.js @@ -0,0 +1,4 @@ + + + 3 +//# sourceMappingURL=vlq-valid-continuation-bit-present-2.js.map diff --git a/test/fixtures/test426/resources/vlq-valid-continuation-bit-present-2.js.map b/test/fixtures/test426/resources/vlq-valid-continuation-bit-present-2.js.map new file mode 100644 index 00000000000000..a975cf8591ff6d --- /dev/null +++ b/test/fixtures/test426/resources/vlq-valid-continuation-bit-present-2.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "names": [], + "sources": ["vlq-valid-continuation-bit-present-2-original.js"], + "sourcesContent": ["\n 3"], + "mappings": ";;gBACC" +} diff --git a/test/fixtures/test426/resources/vlq-valid-negative-digit.js b/test/fixtures/test426/resources/vlq-valid-negative-digit.js new file mode 100644 index 00000000000000..d8e795090effae --- /dev/null +++ b/test/fixtures/test426/resources/vlq-valid-negative-digit.js @@ -0,0 +1,4 @@ + + + 4; 3 +//# sourceMappingURL=vlq-valid-negative-digit.js.map diff --git a/test/fixtures/test426/resources/vlq-valid-negative-digit.js.map b/test/fixtures/test426/resources/vlq-valid-negative-digit.js.map new file mode 100644 index 00000000000000..71dec0d65a1aa9 --- /dev/null +++ b/test/fixtures/test426/resources/vlq-valid-negative-digit.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "names": [], + "sources": ["vlq-valid-negative-digit-original.js"], + "sourcesContent": ["\n 4;3"], + "mappings": ";;eACG,bAAF" +} diff --git a/test/fixtures/test426/resources/vlq-valid-single-digit.js b/test/fixtures/test426/resources/vlq-valid-single-digit.js new file mode 100644 index 00000000000000..54c59aae1fcb44 --- /dev/null +++ b/test/fixtures/test426/resources/vlq-valid-single-digit.js @@ -0,0 +1,2 @@ + 3 +//# sourceMappingURL=vlq-valid-single-digit.js.map diff --git a/test/fixtures/test426/resources/vlq-valid-single-digit.js.map b/test/fixtures/test426/resources/vlq-valid-single-digit.js.map new file mode 100644 index 00000000000000..9e35a7a0a6a591 --- /dev/null +++ b/test/fixtures/test426/resources/vlq-valid-single-digit.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "names": [], + "sources": ["vlq-valid-single-digit-original.js"], + "sourcesContent": ["3"], + "mappings": "eAAA" +} diff --git a/test/fixtures/test426/source-map-spec-tests.json b/test/fixtures/test426/source-map-spec-tests.json new file mode 100644 index 00000000000000..bf3dc64ba5b9c9 --- /dev/null +++ b/test/fixtures/test426/source-map-spec-tests.json @@ -0,0 +1,1596 @@ +{ + "tests": [ + { + "name": "versionValid", + "description": "Test a simple source map with a valid version number", + "baseFile": "version-valid.js", + "sourceMapFile": "version-valid.js.map", + "sourceMapIsValid": true + }, + { + "name": "versionMissing", + "description": "Test a source map that is missing a version field", + "baseFile": "version-missing.js", + "sourceMapFile": "version-missing.js.map", + "sourceMapIsValid": false + }, + { + "name": "versionNotANumber", + "description": "Test a source map with a version field that is not a number", + "baseFile": "version-not-a-number.js", + "sourceMapFile": "version-not-a-number.js.map", + "sourceMapIsValid": false + }, + { + "name": "versionNumericString", + "description": "Test a source map with a version field that is a number as a string", + "baseFile": "version-numeric-string.js", + "sourceMapFile": "version-numeric-string.js.map", + "sourceMapIsValid": false + }, + { + "name": "versionTooHigh", + "description": "Test a source map with an integer version field that is too high", + "baseFile": "version-too-high.js", + "sourceMapFile": "version-too-high.js.map", + "sourceMapIsValid": false + }, + { + "name": "versionTooLow", + "description": "Test a source map with an integer version field that is too low", + "baseFile": "version-too-low.js", + "sourceMapFile": "version-too-low.js.map", + "sourceMapIsValid": false + }, + { + "name": "mappingsMissing", + "description": "Test a source map that is missing a necessary mappings field", + "baseFile": "mappings-missing.js", + "sourceMapFile": "mappings-missing.js.map", + "sourceMapIsValid": false + }, + { + "name": "sourcesMissing", + "description": "Test a source map that is missing a necessary sources field", + "baseFile": "sources-missing.js", + "sourceMapFile": "sources-missing.js.map", + "sourceMapIsValid": false + }, + { + "name": "sourcesNotAList1", + "description": "Test a source map with a sources field that is not a valid list (string)", + "baseFile": "sources-not-a-list-1.js", + "sourceMapFile": "sources-not-a-list-1.js.map", + "sourceMapIsValid": false + }, + { + "name": "sourcesNotAList2", + "description": "Test a source map with a sources field that is not a valid list (object)", + "baseFile": "sources-not-a-list-2.js", + "sourceMapFile": "sources-not-a-list-2.js.map", + "sourceMapIsValid": false + }, + { + "name": "sourcesNotStringOrNull", + "description": "Test a source map with a sources list that has non-string and non-null items", + "baseFile": "sources-not-string-or-null.js", + "sourceMapFile": "sources-not-string-or-null.js.map", + "sourceMapIsValid": false + }, + { + "name": "sourcesContentMissing", + "description": "Test a source map that is missing an optional sourcesContent field", + "baseFile": "sources-content-missing.js", + "sourceMapFile": "sources-content-missing.js.map", + "sourceMapIsValid": true + }, + { + "name": "sourcesContentNotAList1", + "description": "Test a source map with a sourcesContent field that is not a valid list (string)", + "baseFile": "sources-content-not-a-list-1.js", + "sourceMapFile": "sources-content-not-a-list-1.js.map", + "sourceMapIsValid": false + }, + { + "name": "sourcesContentNotAList2", + "description": "Test a source map with a sourcesContent field that is not a valid list (object)", + "baseFile": "sources-content-not-a-list-2.js", + "sourceMapFile": "sources-content-not-a-list-2.js.map", + "sourceMapIsValid": false + }, + { + "name": "sourcesContentNotStringOrNull", + "description": "Test a source map with a sourcesContent list that has non-string and non-null items", + "baseFile": "sources-not-string-or-null.js", + "sourceMapFile": "sources-content-not-string-or-null.js.map", + "sourceMapIsValid": false + }, + { + "name": "sourcesAndSourcesContentBothNull", + "description": "Test a source map that has both null sources and sourcesContent entries", + "baseFile": "sources-and-sources-content-both-null.js", + "sourceMapFile": "sources-and-sources-content-both-null.js.map", + "sourceMapIsValid": true + }, + { + "name": "fileNotAString1", + "description": "Test a source map with a file field that is not a valid string", + "baseFile": "file-not-a-string-1.js", + "sourceMapFile": "file-not-a-string-1.js.map", + "sourceMapIsValid": false + }, + { + "name": "fileNotAString2", + "description": "Test a source map with a file field that is not a valid string", + "baseFile": "file-not-a-string-2.js", + "sourceMapFile": "file-not-a-string-2.js.map", + "sourceMapIsValid": false + }, + { + "name": "sourceRootNotAString1", + "description": "Test a source map with a sourceRoot field that is not a valid string", + "baseFile": "source-root-not-a-string-1.js", + "sourceMapFile": "source-root-not-a-string-1.js.map", + "sourceMapIsValid": false + }, + { + "name": "sourceRootNotAString2", + "description": "Test a source map with a sourceRoot field that is not a valid string", + "baseFile": "source-root-not-a-string-2.js", + "sourceMapFile": "source-root-not-a-string-2.js.map", + "sourceMapIsValid": false + }, + { + "name": "namesMissing", + "description": "Test a source map that is missing the optional names field", + "baseFile": "names-missing.js", + "sourceMapFile": "names-missing.js.map", + "sourceMapIsValid": true + }, + { + "name": "namesNotAList1", + "description": "Test a source map with a names field that is not a valid list (string)", + "baseFile": "names-not-a-list-1.js", + "sourceMapFile": "names-not-a-list-1.js.map", + "sourceMapIsValid": false + }, + { + "name": "namesNotAList2", + "description": "Test a source map with a names field that is not a valid list (object)", + "baseFile": "names-not-a-list-2.js", + "sourceMapFile": "names-not-a-list-2.js.map", + "sourceMapIsValid": false + }, + { + "name": "namesNotString", + "description": "Test a source map with a names list that has non-string items", + "baseFile": "names-not-string.js", + "sourceMapFile": "names-not-string.js.map", + "sourceMapIsValid": false + }, + { + "name": "ignoreListEmpty", + "description": "Test a source map with an ignore list that has no items", + "baseFile": "ignore-list-empty.js", + "sourceMapFile": "ignore-list-empty.js.map", + "sourceMapIsValid": true + }, + { + "name": "ignoreListValid1", + "description": "Test a source map with a simple valid ignore list", + "baseFile": "ignore-list-valid-1.js", + "sourceMapFile": "ignore-list-valid-1.js.map", + "sourceMapIsValid": true, + "testActions": [ + { + "actionType": "checkIgnoreList", + "present": ["empty-original.js"] + } + ] + }, + { + "name": "ignoreListWrongType1", + "description": "Test a source map with an ignore list with the wrong type of items", + "baseFile": "ignore-list-wrong-type-1.js", + "sourceMapFile": "ignore-list-wrong-type-1.js.map", + "sourceMapIsValid": false + }, + { + "name": "ignoreListWrongType2", + "description": "Test a source map with an ignore list with the wrong type of items", + "baseFile": "ignore-list-wrong-type-2.js", + "sourceMapFile": "ignore-list-wrong-type-2.js.map", + "sourceMapIsValid": false + }, + { + "name": "ignoreListWrongType3", + "description": "Test a source map with an ignore list that is not a list", + "baseFile": "ignore-list-wrong-type-3.js", + "sourceMapFile": "ignore-list-wrong-type-3.js.map", + "sourceMapIsValid": false + }, + { + "name": "ignoreListWrongType4", + "description": "Test a source map with an ignore list with a negative index", + "baseFile": "ignore-list-wrong-type-4.js", + "sourceMapFile": "ignore-list-wrong-type-4.js.map", + "sourceMapIsValid": false + }, + { + "name": "ignoreListOutOfBounds1", + "description": "Test a source map with an ignore list with an item with an out-of-bounds index (too big)", + "baseFile": "ignore-list-out-of-bounds-1.js", + "sourceMapFile": "ignore-list-out-of-bounds-1.js.map", + "sourceMapIsValid": false + }, + { + "name": "ignoreListOutOfBounds2", + "description": "Test a source map with an ignore list with an item with an out-of-bounds index (too low)", + "baseFile": "ignore-list-out-of-bounds-2.js", + "sourceMapFile": "ignore-list-out-of-bounds-2.js.map", + "sourceMapIsValid": false + }, + { + "name": "unrecognizedProperty", + "description": "Test a source map that has an extra field not explicitly encoded in the spec", + "baseFile": "unrecognized-property.js", + "sourceMapFile": "unrecognized-property.js.map", + "sourceMapIsValid": true + }, + { + "name": "invalidVLQDueToNonBase64Character", + "description": "Test a source map that has a mapping with an invalid non-base64 character", + "baseFile": "invalid-vlq-non-base64-char.js", + "sourceMapFile": "invalid-vlq-non-base64-char.js.map", + "sourceMapIsValid": false + }, + { + "name": "invalidVLQDueToNonBase64CharacterPadding", + "description": "Test a source map that has a mapping with an invalid padding character =", + "baseFile": "invalid-vlq-non-base64-char-padding.js", + "sourceMapFile": "invalid-vlq-non-base64-char-padding.js.map", + "sourceMapIsValid": false + }, + { + "name": "invalidVLQDueToMissingContinuationDigits", + "description": "Test a source map that has a mapping with an invalid VLQ that has a continuation bit but no continuing digits", + "baseFile": "invalid-vlq-missing-continuation.js", + "sourceMapFile": "invalid-vlq-missing-continuation.js.map", + "sourceMapIsValid": false + }, + { + "name": "invalidMappingNotAString1", + "description": "Test a source map that has an invalid mapping that is not a string (number)", + "baseFile": "invalid-mapping-not-a-string-1.js", + "sourceMapFile": "invalid-mapping-not-a-string-1.js.map", + "sourceMapIsValid": false + }, + { + "name": "invalidMappingNotAString2", + "description": "Test a source map that has an invalid mapping that is not a string (array)", + "baseFile": "invalid-mapping-not-a-string-2.js", + "sourceMapFile": "invalid-mapping-not-a-string-2.js.map", + "sourceMapIsValid": false + }, + { + "name": "invalidMappingSegmentBadSeparator", + "description": "Test a source map that uses separator characters not recognized in the spec", + "baseFile": "invalid-mapping-bad-separator.js", + "sourceMapFile": "invalid-mapping-bad-separator.js.map", + "sourceMapIsValid": false + }, + { + "name": "invalidMappingSegmentWithZeroFields", + "description": "Test a source map that has the wrong number (zero) of segments fields", + "baseFile": "invalid-mapping-segment-with-zero-fields.js", + "sourceMapFile": "invalid-mapping-segment-with-zero-fields.js.map", + "sourceMapIsValid": false + }, + { + "name": "invalidMappingSegmentWithTwoFields", + "description": "Test a source map that has the wrong number (two) of segments fields", + "baseFile": "invalid-mapping-segment-with-two-fields.js", + "sourceMapFile": "invalid-mapping-segment-with-two-fields.js.map", + "sourceMapIsValid": false + }, + { + "name": "invalidMappingSegmentWithThreeFields", + "description": "Test a source map that has the wrong number (three) of segments fields", + "baseFile": "invalid-mapping-segment-with-three-fields.js", + "sourceMapFile": "invalid-mapping-segment-with-three-fields.js.map", + "sourceMapIsValid": false + }, + { + "name": "invalidMappingSegmentWithSourceIndexOutOfBounds", + "description": "Test a source map that has a source index field that is out of bounds of the sources field", + "baseFile": "invalid-mapping-segment-source-index-out-of-bounds.js", + "sourceMapFile": "invalid-mapping-segment-source-index-out-of-bounds.js.map", + "sourceMapIsValid": false + }, + { + "name": "invalidMappingSegmentWithNameIndexOutOfBounds", + "description": "Test a source map that has a name index field that is out of bounds of the names field", + "baseFile": "invalid-mapping-segment-name-index-out-of-bounds.js", + "sourceMapFile": "invalid-mapping-segment-name-index-out-of-bounds.js.map", + "sourceMapIsValid": false + }, + { + "name": "invalidMappingSegmentWithNegativeColumn", + "description": "Test a source map that has an invalid negative non-relative column field", + "baseFile": "invalid-mapping-segment-negative-column.js", + "sourceMapFile": "invalid-mapping-segment-negative-column.js.map", + "sourceMapIsValid": false + }, + { + "name": "invalidMappingSegmentWithNegativeSourceIndex", + "description": "Test a source map that has an invalid negative non-relative source index field", + "baseFile": "invalid-mapping-segment-negative-source-index.js", + "sourceMapFile": "invalid-mapping-segment-negative-source-index.js.map", + "sourceMapIsValid": false + }, + { + "name": "invalidMappingSegmentWithNegativeOriginalLine", + "description": "Test a source map that has an invalid negative non-relative original line field", + "baseFile": "invalid-mapping-segment-negative-original-line.js", + "sourceMapFile": "invalid-mapping-segment-negative-original-line.js.map", + "sourceMapIsValid": false + }, + { + "name": "invalidMappingSegmentWithNegativeOriginalColumn", + "description": "Test a source map that has an invalid negative non-relative original column field", + "baseFile": "invalid-mapping-segment-negative-original-column.js", + "sourceMapFile": "invalid-mapping-segment-negative-original-column.js.map", + "sourceMapIsValid": false + }, + { + "name": "invalidMappingSegmentWithNegativeNameIndex", + "description": "Test a source map that has an invalid negative non-relative name index field", + "baseFile": "invalid-mapping-segment-negative-name-index.js", + "sourceMapFile": "invalid-mapping-segment-negative-name-index.js.map", + "sourceMapIsValid": false + }, + { + "name": "invalidMappingSegmentWithNegativeRelativeColumn", + "description": "Test a source map that has an invalid negative relative column field", + "baseFile": "invalid-mapping-segment-negative-relative-column.js", + "sourceMapFile": "invalid-mapping-segment-negative-relative-column.js.map", + "sourceMapIsValid": false + }, + { + "name": "invalidMappingSegmentWithNegativeRelativeSourceIndex", + "description": "Test a source map that has an invalid negative relative source index field", + "baseFile": "invalid-mapping-segment-negative-relative-source-index.js", + "sourceMapFile": "invalid-mapping-segment-negative-relative-source-index.js.map", + "sourceMapIsValid": false + }, + { + "name": "invalidMappingSegmentWithNegativeRelativeOriginalLine", + "description": "Test a source map that has an invalid negative relative original line field", + "baseFile": "invalid-mapping-segment-negative-relative-original-line.js", + "sourceMapFile": "invalid-mapping-segment-negative-relative-original-line.js.map", + "sourceMapIsValid": false + }, + { + "name": "invalidMappingSegmentWithNegativeRelativeOriginalColumn", + "description": "Test a source map that has an invalid negative relative original column field", + "baseFile": "invalid-mapping-segment-negative-relative-original-column.js", + "sourceMapFile": "invalid-mapping-segment-negative-relative-original-column.js.map", + "sourceMapIsValid": false + }, + { + "name": "invalidMappingSegmentWithNegativeRelativeNameIndex", + "description": "Test a source map that has an invalid negative relative name index field", + "baseFile": "invalid-mapping-segment-negative-relative-name-index.js", + "sourceMapFile": "invalid-mapping-segment-negative-relative-name-index.js.map", + "sourceMapIsValid": false + }, + { + "name": "invalidMappingSegmentWithColumnExceeding32Bits", + "description": "Test a source map that has a column field that exceeds 32 bits", + "baseFile": "invalid-mapping-segment-column-too-large.js", + "sourceMapFile": "invalid-mapping-segment-column-too-large.js.map", + "sourceMapIsValid": false + }, + { + "name": "invalidMappingSegmentWithSourceIndexExceeding32Bits", + "description": "Test a source map that has a source index field that exceeds 32 bits", + "baseFile": "invalid-mapping-segment-source-index-too-large.js", + "sourceMapFile": "invalid-mapping-segment-source-index-too-large.js.map", + "sourceMapIsValid": false + }, + { + "name": "invalidMappingSegmentWithOriginalLineExceeding32Bits", + "description": "Test a source map that has a original line field that exceeds 32 bits", + "baseFile": "invalid-mapping-segment-original-line-too-large.js", + "sourceMapFile": "invalid-mapping-segment-original-line-too-large.js.map", + "sourceMapIsValid": false + }, + { + "name": "invalidMappingSegmentWithOriginalColumnExceeding32Bits", + "description": "Test a source map that has an original column field that exceeds 32 bits", + "baseFile": "invalid-mapping-segment-original-column-too-large.js", + "sourceMapFile": "invalid-mapping-segment-original-column-too-large.js.map", + "sourceMapIsValid": false + }, + { + "name": "invalidMappingSegmentWithNameIndexExceeding32Bits", + "description": "Test a source map that has a name index field that exceeds 32 bits", + "baseFile": "invalid-mapping-segment-name-index-too-large.js", + "sourceMapFile": "invalid-mapping-segment-name-index-too-large.js.map", + "sourceMapIsValid": false + }, + { + "name": "validMappingFieldsWith32BitMaxValues", + "description": "Test a source map that has segment fields with max values representable in 32 bits", + "baseFile": "valid-mapping-boundary-values.js", + "sourceMapFile": "valid-mapping-boundary-values.js.map", + "sourceMapIsValid": true + }, + { + "name": "validMappingLargeVLQ", + "description": "Test a source map that has a segment field VLQ that is very long but within 32-bits", + "baseFile": "valid-mapping-large-vlq.js", + "sourceMapFile": "valid-mapping-large-vlq.js.map", + "sourceMapIsValid": true + }, + { + "name": "validMappingEmptyGroups", + "description": "Test a source map with a mapping that has many empty groups", + "baseFile": "valid-mapping-empty-groups.js", + "sourceMapFile": "valid-mapping-empty-groups.js.map", + "sourceMapIsValid": true + }, + { + "name": "validMappingEmptyString", + "description": "Test a source map with an empty string mapping", + "baseFile": "valid-mapping-empty-string.js", + "sourceMapFile": "valid-mapping-empty-string.js.map", + "sourceMapIsValid": true + }, + { + "name": "indexMapWrongTypeSections", + "description": "Test an index map with a sections field with the wrong type", + "baseFile": "index-map-wrong-type-sections.js", + "sourceMapFile": "index-map-wrong-type-sections.js.map", + "sourceMapIsValid": false + }, + { + "name": "indexMapWrongTypeOffset", + "description": "Test an index map with an offset field with the wrong type", + "baseFile": "index-map-wrong-type-offset.js", + "sourceMapFile": "index-map-wrong-type-offset.js.map", + "sourceMapIsValid": false + }, + { + "name": "indexMapWrongTypeMap", + "description": "Test an index map with a map field with the wrong type", + "baseFile": "index-map-wrong-type-map.js", + "sourceMapFile": "index-map-wrong-type-map.js.map", + "sourceMapIsValid": false + }, + { + "name": "indexMapInvalidBaseMappings", + "description": "Test that an index map cannot also have a regular mappings field", + "baseFile": "index-map-invalid-base-mappings.js", + "sourceMapFile": "index-map-invalid-base-mappings.js.map", + "sourceMapIsValid": false + }, + { + "name": "indexMapInvalidOverlap", + "description": "Test that an invalid index map with multiple sections that overlap", + "baseFile": "index-map-invalid-overlap.js", + "sourceMapFile": "index-map-invalid-overlap.js.map", + "sourceMapIsValid": false + }, + { + "name": "indexMapInvalidOrder", + "description": "Test that an invalid index map with multiple sections in the wrong order", + "baseFile": "index-map-invalid-order.js", + "sourceMapFile": "index-map-invalid-order.js.map", + "sourceMapIsValid": false + }, + { + "name": "indexMapMissingMap", + "description": "Test that an index map that is missing a section map", + "baseFile": "index-map-missing-map.js", + "sourceMapFile": "index-map-missing-map.js.map", + "sourceMapIsValid": false + }, + { + "name": "indexMapInvalidSubMap", + "description": "Test that an index map that has an invalid section map", + "baseFile": "index-map-invalid-sub-map.js", + "sourceMapFile": "index-map-invalid-sub-map.js.map", + "sourceMapIsValid": false + }, + { + "name": "indexMapMissingOffset", + "description": "Test that an index map that is missing a section offset", + "baseFile": "index-map-missing-offset.js", + "sourceMapFile": "index-map-missing-offset.js.map", + "sourceMapIsValid": false + }, + { + "name": "indexMapMissingOffsetLine", + "description": "Test that an index map that is missing a section offset's line field", + "baseFile": "index-map-missing-offset-line.js", + "sourceMapFile": "index-map-missing-offset-line.js.map", + "sourceMapIsValid": false + }, + { + "name": "indexMapMissingOffsetColumn", + "description": "Test that an index map that is missing a section offset's column field", + "baseFile": "index-map-missing-offset-column.js", + "sourceMapFile": "index-map-missing-offset-column.js.map", + "sourceMapIsValid": false + }, + { + "name": "indexMapOffsetLineWrongType", + "description": "Test that an index map that has an offset line field with the wrong type of value", + "baseFile": "index-map-offset-line-wrong-type.js", + "sourceMapFile": "index-map-offset-line-wrong-type.js.map", + "sourceMapIsValid": false + }, + { + "name": "indexMapOffsetColumnWrongType", + "description": "Test that an index map that has an offset column field with the wrong type of value", + "baseFile": "index-map-offset-column-wrong-type.js", + "sourceMapFile": "index-map-offset-column-wrong-type.js.map", + "sourceMapIsValid": false + }, + { + "name": "indexMapEmptySections", + "description": "Test a trivial index map with no sections", + "baseFile": "index-map-empty-sections.js", + "sourceMapFile": "index-map-empty-sections.js.map", + "sourceMapIsValid": true + }, + { + "name": "indexMapFileWrongType1", + "description": "Test an index map with a file field with the wrong type", + "baseFile": "index-map-file-wrong-type-1.js", + "sourceMapFile": "index-map-file-wrong-type-1.js.map", + "sourceMapIsValid": false + }, + { + "name": "indexMapFileWrongType2", + "description": "Test an index map with a file field with the wrong type", + "baseFile": "index-map-file-wrong-type-2.js", + "sourceMapFile": "index-map-file-wrong-type-2.js.map", + "sourceMapIsValid": false + }, + { + "name": "basicMapping", + "description": "Test a simple source map that has several valid mappings", + "baseFile": "basic-mapping.js", + "sourceMapFile": "basic-mapping.js.map", + "sourceMapIsValid": true, + "testActions": [ + { + "actionType": "checkMapping", + "generatedLine": 0, + "generatedColumn": 0, + "originalSource": "basic-mapping-original.js", + "originalLine": 0, + "originalColumn": 0, + "mappedName": null + }, + { + "actionType": "checkMapping", + "generatedLine": 0, + "generatedColumn": 9, + "originalSource": "basic-mapping-original.js", + "originalLine": 0, + "originalColumn": 9, + "mappedName": "foo" + }, + { + "actionType": "checkMapping", + "originalSource": "basic-mapping-original.js", + "generatedLine": 0, + "generatedColumn": 15, + "originalLine": 1, + "originalColumn": 2, + "mappedName": null + }, + { + "actionType": "checkMapping", + "originalSource": "basic-mapping-original.js", + "generatedLine": 0, + "generatedColumn": 22, + "originalLine": 1, + "originalColumn": 9, + "mappedName": null + }, + { + "actionType": "checkMapping", + "originalSource": "basic-mapping-original.js", + "generatedLine": 0, + "generatedColumn": 24, + "originalLine": 2, + "originalColumn": 0, + "mappedName": null + }, + { + "actionType": "checkMapping", + "originalSource": "basic-mapping-original.js", + "generatedLine": 0, + "generatedColumn": 25, + "originalLine": 3, + "originalColumn": 0, + "mappedName": null + }, + { + "actionType": "checkMapping", + "generatedLine": 0, + "generatedColumn": 34, + "originalSource": "basic-mapping-original.js", + "originalLine": 3, + "originalColumn": 9, + "mappedName": "bar" + }, + { + "actionType": "checkMapping", + "originalSource": "basic-mapping-original.js", + "generatedLine": 0, + "generatedColumn": 40, + "originalLine": 4, + "originalColumn": 2, + "mappedName": null + }, + { + "actionType": "checkMapping", + "originalSource": "basic-mapping-original.js", + "generatedLine": 0, + "generatedColumn": 47, + "originalLine": 4, + "originalColumn": 9, + "mappedName": null + }, + { + "actionType": "checkMapping", + "originalSource": "basic-mapping-original.js", + "generatedLine": 0, + "generatedColumn": 49, + "originalLine": 5, + "originalColumn": 0, + "mappedName": null + }, + { + "actionType": "checkMapping", + "originalSource": "basic-mapping-original.js", + "generatedLine": 0, + "generatedColumn": 50, + "originalLine": 6, + "originalColumn": 0, + "mappedName": "foo" + }, + { + "actionType": "checkMapping", + "originalSource": "basic-mapping-original.js", + "generatedLine": 0, + "generatedColumn": 56, + "originalLine": 7, + "originalColumn": 0, + "mappedName": "bar" + } + ] + }, + { + "name": "sourceRootResolution", + "description": "Similar to basic mapping test, but test resoultion of sources with a sourceRoot field", + "baseFile": "source-root-resolution.js", + "sourceMapFile": "source-root-resolution.js.map", + "sourceMapIsValid": true, + "testActions": [ + { + "actionType": "checkMapping", + "generatedLine": 0, + "generatedColumn": 0, + "originalSource": "theroot/basic-mapping-original.js", + "originalLine": 0, + "originalColumn": 0, + "mappedName": null + }, + { + "actionType": "checkMapping", + "generatedLine": 0, + "generatedColumn": 9, + "originalSource": "theroot/basic-mapping-original.js", + "originalLine": 0, + "originalColumn": 9, + "mappedName": "foo" + } + ] + }, + { + "name": "sourceResolutionAbsoluteURL", + "description": "Test resoultion of sources with absolute URLs", + "baseFile": "source-resolution-absolute-url.js", + "sourceMapFile": "source-resolution-absolute-url.js.map", + "sourceMapIsValid": true, + "testActions": [ + { + "actionType": "checkMapping", + "generatedLine": 0, + "generatedColumn": 0, + "originalSource": "/baz/quux/basic-mapping-original.js", + "originalLine": 0, + "originalColumn": 0, + "mappedName": null + }, + { + "actionType": "checkMapping", + "generatedLine": 0, + "generatedColumn": 9, + "originalSource": "/baz/quux/basic-mapping-original.js", + "originalLine": 0, + "originalColumn": 9, + "mappedName": "foo" + } + ] + }, + { + "name": "basicMappingWithIndexMap", + "description": "Test a version of basic-mapping.js.map that is split into sections with an index map", + "baseFile": "basic-mapping-as-index-map.js", + "sourceMapFile": "basic-mapping-as-index-map.js.map", + "sourceMapIsValid": true, + "testActions": [ + { + "actionType": "checkMapping", + "generatedLine": 0, + "generatedColumn": 0, + "originalSource": "basic-mapping-original.js", + "originalLine": 0, + "originalColumn": 0, + "mappedName": null + }, + { + "actionType": "checkMapping", + "generatedLine": 0, + "generatedColumn": 9, + "originalSource": "basic-mapping-original.js", + "originalLine": 0, + "originalColumn": 9, + "mappedName": "foo" + }, + { + "actionType": "checkMapping", + "originalSource": "basic-mapping-original.js", + "generatedLine": 0, + "generatedColumn": 15, + "originalLine": 1, + "originalColumn": 2, + "mappedName": null + }, + { + "actionType": "checkMapping", + "originalSource": "basic-mapping-original.js", + "generatedLine": 0, + "generatedColumn": 22, + "originalLine": 1, + "originalColumn": 9, + "mappedName": null + }, + { + "actionType": "checkMapping", + "originalSource": "basic-mapping-original.js", + "generatedLine": 0, + "generatedColumn": 24, + "originalLine": 2, + "originalColumn": 0, + "mappedName": null + }, + { + "actionType": "checkMapping", + "originalSource": "basic-mapping-original.js", + "generatedLine": 0, + "generatedColumn": 25, + "originalLine": 3, + "originalColumn": 0, + "mappedName": null + }, + { + "actionType": "checkMapping", + "generatedLine": 0, + "generatedColumn": 34, + "originalSource": "basic-mapping-original.js", + "originalLine": 3, + "originalColumn": 9, + "mappedName": "bar" + }, + { + "actionType": "checkMapping", + "originalSource": "basic-mapping-original.js", + "generatedLine": 0, + "generatedColumn": 40, + "originalLine": 4, + "originalColumn": 2, + "mappedName": null + }, + { + "actionType": "checkMapping", + "originalSource": "basic-mapping-original.js", + "generatedLine": 0, + "generatedColumn": 47, + "originalLine": 4, + "originalColumn": 9, + "mappedName": null + }, + { + "actionType": "checkMapping", + "originalSource": "basic-mapping-original.js", + "generatedLine": 0, + "generatedColumn": 49, + "originalLine": 5, + "originalColumn": 0, + "mappedName": null + }, + { + "actionType": "checkMapping", + "originalSource": "basic-mapping-original.js", + "generatedLine": 0, + "generatedColumn": 50, + "originalLine": 6, + "originalColumn": 0, + "mappedName": "foo" + }, + { + "actionType": "checkMapping", + "originalSource": "basic-mapping-original.js", + "generatedLine": 0, + "generatedColumn": 56, + "originalLine": 7, + "originalColumn": 0, + "mappedName": "bar" + } + ] + }, + { + "name": "indexMapWithMissingFile", + "description": "Same as the basic mapping index map test but without the optional file field", + "baseFile": "index-map-missing-file.js", + "sourceMapFile": "index-map-missing-file.js.map", + "sourceMapIsValid": true, + "testActions": [ + { + "actionType": "checkMapping", + "generatedLine": 0, + "generatedColumn": 0, + "originalSource": "basic-mapping-original.js", + "originalLine": 0, + "originalColumn": 0, + "mappedName": null + }, + { + "actionType": "checkMapping", + "generatedLine": 0, + "generatedColumn": 9, + "originalSource": "basic-mapping-original.js", + "originalLine": 0, + "originalColumn": 9, + "mappedName": "foo" + }, + { + "actionType": "checkMapping", + "originalSource": "basic-mapping-original.js", + "generatedLine": 0, + "generatedColumn": 15, + "originalLine": 1, + "originalColumn": 2, + "mappedName": null + }, + { + "actionType": "checkMapping", + "originalSource": "basic-mapping-original.js", + "generatedLine": 0, + "generatedColumn": 22, + "originalLine": 1, + "originalColumn": 9, + "mappedName": null + }, + { + "actionType": "checkMapping", + "originalSource": "basic-mapping-original.js", + "generatedLine": 0, + "generatedColumn": 24, + "originalLine": 2, + "originalColumn": 0, + "mappedName": null + }, + { + "actionType": "checkMapping", + "originalSource": "basic-mapping-original.js", + "generatedLine": 0, + "generatedColumn": 25, + "originalLine": 3, + "originalColumn": 0, + "mappedName": null + }, + { + "actionType": "checkMapping", + "generatedLine": 0, + "generatedColumn": 34, + "originalSource": "basic-mapping-original.js", + "originalLine": 3, + "originalColumn": 9, + "mappedName": "bar" + }, + { + "actionType": "checkMapping", + "originalSource": "basic-mapping-original.js", + "generatedLine": 0, + "generatedColumn": 40, + "originalLine": 4, + "originalColumn": 2, + "mappedName": null + }, + { + "actionType": "checkMapping", + "originalSource": "basic-mapping-original.js", + "generatedLine": 0, + "generatedColumn": 47, + "originalLine": 4, + "originalColumn": 9, + "mappedName": null + }, + { + "actionType": "checkMapping", + "originalSource": "basic-mapping-original.js", + "generatedLine": 0, + "generatedColumn": 49, + "originalLine": 5, + "originalColumn": 0, + "mappedName": null + }, + { + "actionType": "checkMapping", + "originalSource": "basic-mapping-original.js", + "generatedLine": 0, + "generatedColumn": 50, + "originalLine": 6, + "originalColumn": 0, + "mappedName": "foo" + }, + { + "actionType": "checkMapping", + "originalSource": "basic-mapping-original.js", + "generatedLine": 0, + "generatedColumn": 56, + "originalLine": 7, + "originalColumn": 0, + "mappedName": "bar" + } + ] + }, + { + "name": "indexMapWithTwoConcatenatedSources", + "description": "Test an index map that has two sub-maps for concatenated sources", + "baseFile": "index-map-two-concatenated-sources.js", + "sourceMapFile": "index-map-two-concatenated-sources.js.map", + "sourceMapIsValid": true, + "testActions": [ + { + "actionType": "checkMapping", + "generatedLine": 0, + "generatedColumn": 0, + "originalSource": "basic-mapping-original.js", + "originalLine": 0, + "originalColumn": 0, + "mappedName": null + }, + { + "actionType": "checkMapping", + "generatedLine": 0, + "generatedColumn": 9, + "originalSource": "basic-mapping-original.js", + "originalLine": 0, + "originalColumn": 9, + "mappedName": "foo" + }, + { + "actionType": "checkMapping", + "originalSource": "basic-mapping-original.js", + "generatedLine": 0, + "generatedColumn": 15, + "originalLine": 1, + "originalColumn": 2, + "mappedName": null + }, + { + "actionType": "checkMapping", + "originalSource": "basic-mapping-original.js", + "generatedLine": 0, + "generatedColumn": 22, + "originalLine": 1, + "originalColumn": 9, + "mappedName": null + }, + { + "actionType": "checkMapping", + "originalSource": "basic-mapping-original.js", + "generatedLine": 0, + "generatedColumn": 24, + "originalLine": 2, + "originalColumn": 0, + "mappedName": null + }, + { + "actionType": "checkMapping", + "originalSource": "basic-mapping-original.js", + "generatedLine": 0, + "generatedColumn": 25, + "originalLine": 3, + "originalColumn": 0, + "mappedName": null + }, + { + "actionType": "checkMapping", + "generatedLine": 0, + "generatedColumn": 34, + "originalSource": "basic-mapping-original.js", + "originalLine": 3, + "originalColumn": 9, + "mappedName": "bar" + }, + { + "actionType": "checkMapping", + "originalSource": "basic-mapping-original.js", + "generatedLine": 0, + "generatedColumn": 40, + "originalLine": 4, + "originalColumn": 2, + "mappedName": null + }, + { + "actionType": "checkMapping", + "originalSource": "basic-mapping-original.js", + "generatedLine": 0, + "generatedColumn": 47, + "originalLine": 4, + "originalColumn": 9, + "mappedName": null + }, + { + "actionType": "checkMapping", + "originalSource": "basic-mapping-original.js", + "generatedLine": 0, + "generatedColumn": 49, + "originalLine": 5, + "originalColumn": 0, + "mappedName": null + }, + { + "actionType": "checkMapping", + "originalSource": "basic-mapping-original.js", + "generatedLine": 0, + "generatedColumn": 50, + "originalLine": 6, + "originalColumn": 0, + "mappedName": "foo" + }, + { + "actionType": "checkMapping", + "originalSource": "basic-mapping-original.js", + "generatedLine": 0, + "generatedColumn": 56, + "originalLine": 7, + "originalColumn": 0, + "mappedName": "bar" + }, + { + "actionType": "checkMapping", + "originalSource": "second-source-original.js", + "generatedLine": 0, + "generatedColumn": 62, + "originalLine": 0, + "originalColumn": 0, + "mappedName": null + }, + { + "actionType": "checkMapping", + "originalSource": "second-source-original.js", + "generatedLine": 0, + "generatedColumn": 71, + "originalLine": 0, + "originalColumn": 9, + "mappedName": "baz" + }, + { + "actionType": "checkMapping", + "originalSource": "second-source-original.js", + "generatedLine": 0, + "generatedColumn": 77, + "originalLine": 1, + "originalColumn": 2, + "mappedName": null + }, + { + "actionType": "checkMapping", + "originalSource": "second-source-original.js", + "generatedLine": 0, + "generatedColumn": 83, + "originalLine": 1, + "originalColumn": 9, + "mappedName": null + }, + { + "actionType": "checkMapping", + "originalSource": "second-source-original.js", + "generatedLine": 0, + "generatedColumn": 88, + "originalLine": 2, + "originalColumn": 0, + "mappedName": null + }, + { + "actionType": "checkMapping", + "originalSource": "second-source-original.js", + "generatedLine": 0, + "generatedColumn": 89, + "originalLine": 3, + "originalColumn": 0, + "mappedName": "baz" + } + ] + }, + { + "name": "sourcesNullSourcesContentNonNull", + "description": "Test a source map that has a null source but has a sourcesContent", + "baseFile": "sources-null-sources-content-non-null.js", + "sourceMapFile": "sources-null-sources-content-non-null.js.map", + "sourceMapIsValid": true, + "testActions": [ + { + "actionType": "checkMapping", + "generatedLine": 0, + "generatedColumn": 0, + "originalSource": null, + "originalLine": 0, + "originalColumn": 0, + "mappedName": null + }, + { + "actionType": "checkMapping", + "generatedLine": 0, + "generatedColumn": 9, + "originalSource": null, + "originalLine": 0, + "originalColumn": 9, + "mappedName": "foo" + } + ] + }, + { + "name": "sourcesNonNullSourcesContentNull", + "description": "Test a source map that has a non-null source but has a null sourcesContent", + "baseFile": "sources-non-null-sources-content-null.js", + "sourceMapFile": "sources-non-null-sources-content-null.js.map", + "sourceMapIsValid": true, + "testActions": [ + { + "actionType": "checkMapping", + "generatedLine": 0, + "generatedColumn": 0, + "originalSource": "basic-mapping-original.js", + "originalLine": 0, + "originalColumn": 0, + "mappedName": null + }, + { + "actionType": "checkMapping", + "generatedLine": 0, + "generatedColumn": 9, + "originalSource": "basic-mapping-original.js", + "originalLine": 0, + "originalColumn": 9, + "mappedName": "foo" + } + ] + }, + { + "name": "transitiveMapping", + "description": "Test a simple two-stage transitive mapping from a minified JS to a TypeScript source", + "baseFile": "transitive-mapping.js", + "sourceMapFile": "transitive-mapping.js.map", + "sourceMapIsValid": true, + "testActions": [ + { + "actionType": "checkMappingTransitive", + "generatedLine": 0, + "generatedColumn": 0, + "originalSource": "typescript-original.ts", + "intermediateMaps": ["transitive-mapping-original.js.map"], + "originalLine": 1, + "originalColumn": 0, + "mappedName": null + }, + { + "actionType": "checkMappingTransitive", + "generatedLine": 0, + "generatedColumn": 9, + "originalSource": "typescript-original.ts", + "intermediateMaps": ["transitive-mapping-original.js.map"], + "originalLine": 1, + "originalColumn": 9, + "mappedName": null + }, + { + "actionType": "checkMappingTransitive", + "generatedLine": 0, + "generatedColumn": 13, + "originalSource": "typescript-original.ts", + "intermediateMaps": ["transitive-mapping-original.js.map"], + "originalLine": 1, + "originalColumn": 13, + "mappedName": null + }, + { + "actionType": "checkMappingTransitive", + "generatedLine": 0, + "generatedColumn": 16, + "originalSource": "typescript-original.ts", + "intermediateMaps": ["transitive-mapping-original.js.map"], + "originalLine": 2, + "originalColumn": 2, + "mappedName": null + }, + { + "actionType": "checkMappingTransitive", + "generatedLine": 0, + "generatedColumn": 23, + "originalSource": "typescript-original.ts", + "intermediateMaps": ["transitive-mapping-original.js.map"], + "originalLine": 2, + "originalColumn": 9, + "mappedName": null + }, + { + "actionType": "checkMappingTransitive", + "generatedLine": 0, + "generatedColumn": 24, + "originalSource": "typescript-original.ts", + "intermediateMaps": ["transitive-mapping-original.js.map"], + "originalLine": 3, + "originalColumn": 0, + "mappedName": null + }, + { + "actionType": "checkMappingTransitive", + "generatedLine": 0, + "generatedColumn": 25, + "originalSource": "typescript-original.ts", + "intermediateMaps": ["transitive-mapping-original.js.map"], + "originalLine": 4, + "originalColumn": 0, + "mappedName": null + }, + { + "actionType": "checkMappingTransitive", + "generatedLine": 0, + "generatedColumn": 29, + "originalSource": "typescript-original.ts", + "intermediateMaps": ["transitive-mapping-original.js.map"], + "originalLine": 4, + "originalColumn": 4, + "mappedName": null + } + ] + }, + { + "name": "transitiveMappingWithThreeSteps", + "description": "Test a three-stage transitive mapping from an un-minified JS to minified JS to a TypeScript source", + "baseFile": "transitive-mapping-three-steps.js", + "sourceMapFile": "transitive-mapping-three-steps.js.map", + "sourceMapIsValid": true, + "testActions": [ + { + "actionType": "checkMappingTransitive", + "generatedLine": 0, + "generatedColumn": 0, + "originalSource": "typescript-original.ts", + "intermediateMaps": ["transitive-mapping.js.map", "transitive-mapping-original.js.map"], + "originalLine": 1, + "originalColumn": 0, + "mappedName": null + }, + { + "actionType": "checkMappingTransitive", + "generatedLine": 0, + "generatedColumn": 9, + "originalSource": "typescript-original.ts", + "intermediateMaps": ["transitive-mapping.js.map", "transitive-mapping-original.js.map"], + "originalLine": 1, + "originalColumn": 9, + "mappedName": null + }, + { + "actionType": "checkMappingTransitive", + "generatedLine": 0, + "generatedColumn": 13, + "originalSource": "typescript-original.ts", + "intermediateMaps": ["transitive-mapping.js.map", "transitive-mapping-original.js.map"], + "originalLine": 1, + "originalColumn": 13, + "mappedName": null + }, + { + "actionType": "checkMappingTransitive", + "generatedLine": 1, + "generatedColumn": 4, + "originalSource": "typescript-original.ts", + "intermediateMaps": ["transitive-mapping.js.map", "transitive-mapping-original.js.map"], + "originalLine": 2, + "originalColumn": 2, + "mappedName": null + }, + { + "actionType": "checkMappingTransitive", + "generatedLine": 1, + "generatedColumn": 11, + "originalSource": "typescript-original.ts", + "intermediateMaps": ["transitive-mapping.js.map", "transitive-mapping-original.js.map"], + "originalLine": 2, + "originalColumn": 9, + "mappedName": null + }, + { + "actionType": "checkMappingTransitive", + "generatedLine": 2, + "generatedColumn": 0, + "originalSource": "typescript-original.ts", + "intermediateMaps": ["transitive-mapping.js.map", "transitive-mapping-original.js.map"], + "originalLine": 3, + "originalColumn": 0, + "mappedName": null + }, + { + "actionType": "checkMappingTransitive", + "generatedLine": 4, + "generatedColumn": 0, + "originalSource": "typescript-original.ts", + "intermediateMaps": ["transitive-mapping.js.map", "transitive-mapping-original.js.map"], + "originalLine": 4, + "originalColumn": 0, + "mappedName": null + }, + { + "actionType": "checkMappingTransitive", + "generatedLine": 4, + "generatedColumn": 4, + "originalSource": "typescript-original.ts", + "intermediateMaps": ["transitive-mapping.js.map", "transitive-mapping-original.js.map"], + "originalLine": 4, + "originalColumn": 4, + "mappedName": null + } + ] + }, + { + "name": "vlqValidSingleDigit", + "description": "Test VLQ decoding for a single digit, no continuation VLQ", + "baseFile": "vlq-valid-single-digit.js", + "sourceMapFile": "vlq-valid-single-digit.js.map", + "sourceMapIsValid": true, + "testActions": [ + { + "actionType": "checkMapping", + "generatedLine": 0, + "generatedColumn": 15, + "originalSource": "vlq-valid-single-digit-original.js", + "originalLine": 0, + "originalColumn": 0, + "mappedName": null + } + ] + }, + { + "name": "vlqValidNegativeDigit", + "description": "Test VLQ decoding where there's a negative digit, no continuation bit", + "baseFile": "vlq-valid-negative-digit.js", + "sourceMapFile": "vlq-valid-negative-digit.js.map", + "sourceMapIsValid": true, + "testActions": [ + { + "actionType": "checkMapping", + "generatedLine": 2, + "generatedColumn": 15, + "originalSource": "vlq-valid-negative-digit-original.js", + "originalLine": 1, + "originalColumn": 3, + "mappedName": null + }, + { + "actionType": "checkMapping", + "generatedLine": 2, + "generatedColumn": 2, + "originalSource": "vlq-valid-negative-digit-original.js", + "originalLine": 1, + "originalColumn": 1, + "mappedName": null + } + ] + }, + { + "name": "vlqValidContinuationBitPresent1", + "description": "Test VLQ decoding where continuation bits are present (continuations are leading zero)", + "baseFile": "vlq-valid-continuation-bit-present-1.js", + "sourceMapFile": "vlq-valid-continuation-bit-present-1.js.map", + "sourceMapIsValid": true, + "testActions": [ + { + "actionType": "checkMapping", + "generatedLine": 0, + "generatedColumn": 15, + "originalSource": "vlq-valid-continuation-bit-present-1-original.js", + "originalLine": 0, + "originalColumn": 1, + "mappedName": null + } + ] + }, + { + "name": "vlqValidContinuationBitPresent2", + "description": "Test VLQ decoding where continuation bits are present (continuations have non-zero bits)", + "baseFile": "vlq-valid-continuation-bit-present-2.js", + "sourceMapFile": "vlq-valid-continuation-bit-present-2.js.map", + "sourceMapIsValid": true, + "testActions": [ + { + "actionType": "checkMapping", + "generatedLine": 2, + "generatedColumn": 16, + "originalSource": "vlq-valid-continuation-bit-present-2-original.js", + "originalLine": 1, + "originalColumn": 1, + "mappedName": null + } + ] + }, + { + "name": "mappingSemanticsSingleFieldSegment", + "description": "Test mapping semantics for a single field segment mapping", + "baseFile": "mapping-semantics-single-field-segment.js", + "sourceMapFile": "mapping-semantics-single-field-segment.js.map", + "sourceMapIsValid": true, + "testActions": [ + { + "actionType": "checkMapping", + "generatedLine": 0, + "generatedColumn": 0, + "originalSource": "mapping-semantics-single-field-segment-original.js", + "originalLine": 0, + "originalColumn": 1, + "mappedName": null + }, + { + "actionType": "checkMapping", + "generatedLine": 0, + "generatedColumn": 2, + "originalSource": null, + "originalLine": null, + "originalColumn": null, + "mappedName": null + } + ] + }, + { + "name": "mappingSemanticsFourFieldSegment", + "description": "Test mapping semantics for a four field segment mapping", + "baseFile": "mapping-semantics-four-field-segment.js", + "sourceMapFile": "mapping-semantics-four-field-segment.js.map", + "sourceMapIsValid": true, + "testActions": [ + { + "actionType": "checkMapping", + "generatedLine": 0, + "generatedColumn": 1, + "originalSource": "mapping-semantics-four-field-segment-original.js", + "originalLine": 2, + "originalColumn": 2, + "mappedName": null + } + ] + }, + { + "name": "mappingSemanticsFiveFieldSegment", + "description": "Test mapping semantics for a five field segment mapping", + "baseFile": "mapping-semantics-five-field-segment.js", + "sourceMapFile": "mapping-semantics-five-field-segment.js.map", + "sourceMapIsValid": true, + "testActions": [ + { + "actionType": "checkMapping", + "generatedLine": 0, + "generatedColumn": 1, + "originalSource": "mapping-semantics-five-field-segment-original.js", + "originalLine": 2, + "originalColumn": 2, + "mappedName": "foo" + } + ] + }, + { + "name": "mappingSemanticsColumnReset", + "description": "Test that the generated column field resets to zero on new lines", + "baseFile": "mapping-semantics-column-reset.js", + "sourceMapFile": "mapping-semantics-column-reset.js.map", + "sourceMapIsValid": true, + "testActions": [ + { + "actionType": "checkMapping", + "generatedLine": 0, + "generatedColumn": 1, + "originalSource": "mapping-semantics-column-reset-original.js", + "originalLine": 0, + "originalColumn": 0, + "mappedName": null + }, + { + "actionType": "checkMapping", + "generatedLine": 1, + "generatedColumn": 1, + "originalSource": "mapping-semantics-column-reset-original.js", + "originalLine": 1, + "originalColumn": 0, + "mappedName": null + } + ] + }, + { + "name": "mappingSemanticsRelative1", + "description": "Test that fields are calculated relative to previous ones", + "baseFile": "mapping-semantics-relative-1.js", + "sourceMapFile": "mapping-semantics-relative-1.js.map", + "sourceMapIsValid": true, + "testActions": [ + { + "actionType": "checkMapping", + "generatedLine": 0, + "generatedColumn": 1, + "originalSource": "mapping-semantics-relative-1-original.js", + "originalLine": 0, + "originalColumn": 0, + "mappedName": null + }, + { + "actionType": "checkMapping", + "generatedLine": 0, + "generatedColumn": 5, + "originalSource": "mapping-semantics-relative-1-original.js", + "originalLine": 0, + "originalColumn": 4, + "mappedName": null + } + ] + }, + { + "name": "mappingSemanticsRelative2", + "description": "Test that fields are calculated relative to previous ones, across lines", + "baseFile": "mapping-semantics-relative-2.js", + "sourceMapFile": "mapping-semantics-relative-2.js.map", + "sourceMapIsValid": true, + "testActions": [ + { + "actionType": "checkMapping", + "generatedLine": 0, + "generatedColumn": 1, + "originalSource": "mapping-semantics-relative-2-original.js", + "originalLine": 0, + "originalColumn": 2, + "mappedName": "foo" + }, + { + "actionType": "checkMapping", + "generatedLine": 1, + "generatedColumn": 2, + "originalSource": "mapping-semantics-relative-2-original.js", + "originalLine": 1, + "originalColumn": 2, + "mappedName": "bar" + } + ] + } + ] +} diff --git a/test/fixtures/test426/webkit/0001-Add-test-runner-for-the-source-map-spec-tests.patch b/test/fixtures/test426/webkit/0001-Add-test-runner-for-the-source-map-spec-tests.patch new file mode 100644 index 00000000000000..9ba9f695a7b180 --- /dev/null +++ b/test/fixtures/test426/webkit/0001-Add-test-runner-for-the-source-map-spec-tests.patch @@ -0,0 +1,11542 @@ +From bcb0accac37b7fe585a01cd7de7f6c91e5704426 Mon Sep 17 00:00:00 2001 +From: Asumu Takikawa +Date: Mon, 11 Mar 2024 13:41:31 -0700 +Subject: [PATCH] Add test runner for the source map spec tests + +Need the bug URL (OOPS!). + +Reviewed by NOBODY (OOPS!). + +This patch adds a layout test for the inspector using the imported spec +tests from TG4 for the current Source Map specification: + + https://github.com/tc39/source-map + https://github.com/tc39/source-map-tests + +It also adds the tests themselves as imported tests under +`LayoutTests/imported`. + +* LayoutTests/imported/tg4/source-map-tests/LICENSE.md: Added. +* LayoutTests/imported/tg4/source-map-tests/README.WebKit: Added. +* LayoutTests/imported/tg4/source-map-tests/README.md: Added. +* LayoutTests/imported/tg4/source-map-tests/chrome/0001-Add-source-map-specification-tests.patch: Added. +* LayoutTests/imported/tg4/source-map-tests/chrome/0002-Add-reverse-mapping-code-to-test.patch: Added. +* LayoutTests/imported/tg4/source-map-tests/firefox/0001-WIP-Firefox-source-map-spec-tests.patch: Added. +* LayoutTests/imported/tg4/source-map-tests/firefox/browser_spec-source-map.js: Added. +(async checkValidity): +(async checkMapping): +(const.testCase.of.testDescriptions.tests.const.testFunction.async const): +(const.testCase.of.testDescriptions.tests.const.testFunction.testCase.name): +(read): +* LayoutTests/imported/tg4/source-map-tests/resources/basic-mapping-as-index-map.js: Added. +(foo): +(bar): +* LayoutTests/imported/tg4/source-map-tests/resources/basic-mapping-as-index-map.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/basic-mapping-original.js: Added. +(foo): +(bar): +* LayoutTests/imported/tg4/source-map-tests/resources/basic-mapping.js: Added. +(foo): +(bar): +* LayoutTests/imported/tg4/source-map-tests/resources/basic-mapping.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/file-not-a-string-1.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/file-not-a-string-1.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/file-not-a-string-2.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/file-not-a-string-2.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-empty.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-empty.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-out-of-bounds-1.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-out-of-bounds-1.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-out-of-bounds-2.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-out-of-bounds-2.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-valid-1.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-valid-1.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-wrong-type-1.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-wrong-type-1.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-wrong-type-2.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-wrong-type-2.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-wrong-type-3.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-wrong-type-3.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-wrong-type-4.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-wrong-type-4.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/index-map-empty-sections.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/index-map-empty-sections.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/index-map-file-wrong-type-1.js: Added. +(foo): +(bar): +* LayoutTests/imported/tg4/source-map-tests/resources/index-map-file-wrong-type-1.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/index-map-file-wrong-type-2.js: Added. +(foo): +(bar): +* LayoutTests/imported/tg4/source-map-tests/resources/index-map-file-wrong-type-2.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/index-map-invalid-base-mappings.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/index-map-invalid-base-mappings.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/index-map-invalid-order.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/index-map-invalid-order.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/index-map-invalid-overlap.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/index-map-invalid-overlap.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/index-map-invalid-sub-map.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/index-map-invalid-sub-map.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-file.js: Added. +(foo): +(bar): +* LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-file.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-map.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-map.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-offset-column.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-offset-column.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-offset-line.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-offset-line.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-offset.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-offset.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/index-map-offset-column-wrong-type.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/index-map-offset-column-wrong-type.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/index-map-offset-line-wrong-type.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/index-map-offset-line-wrong-type.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/index-map-two-concatenated-sources.js: Added. +(foo): +(bar): +(baz): +* LayoutTests/imported/tg4/source-map-tests/resources/index-map-two-concatenated-sources.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/index-map-wrong-type-map.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/index-map-wrong-type-map.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/index-map-wrong-type-offset.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/index-map-wrong-type-offset.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/index-map-wrong-type-sections.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/index-map-wrong-type-sections.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-bad-separator.js: Added. +(foo): +(bar): +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-bad-separator.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-not-a-string-1.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-not-a-string-1.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-not-a-string-2.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-not-a-string-2.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-column-too-large.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-column-too-large.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-name-index-out-of-bounds.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-name-index-out-of-bounds.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-name-index-too-large.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-name-index-too-large.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-column.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-column.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-name-index.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-name-index.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-original-column.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-original-column.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-original-line.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-original-line.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-column.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-column.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-name-index.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-name-index.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-original-column.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-original-column.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-original-line.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-original-line.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-source-index.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-source-index.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-source-index.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-source-index.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-original-column-too-large.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-original-column-too-large.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-original-line-too-large.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-original-line-too-large.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-source-index-out-of-bounds.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-source-index-out-of-bounds.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-source-index-too-large.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-source-index-too-large.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-with-three-fields.js: Added. +(foo): +(bar): +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-with-three-fields.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-with-two-fields.js: Added. +(foo): +(bar): +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-with-two-fields.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-with-zero-fields.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-with-zero-fields.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-vlq-missing-continuation.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-vlq-missing-continuation.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-vlq-non-base64-char.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/invalid-vlq-non-base64-char.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-column-reset.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-column-reset.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-five-field-segment.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-five-field-segment.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-four-field-segment.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-four-field-segment.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-relative-1.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-relative-1.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-relative-2.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-relative-2.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-single-field-segment.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-single-field-segment.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/names-missing.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/names-missing.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/names-not-a-list-1.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/names-not-a-list-1.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/names-not-a-list-2.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/names-not-a-list-2.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/names-not-string.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/names-not-string.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/second-source-original.js: Added. +(baz): +* LayoutTests/imported/tg4/source-map-tests/resources/source-resolution-absolute-url.js: Added. +(foo): +(bar): +* LayoutTests/imported/tg4/source-map-tests/resources/source-resolution-absolute-url.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/source-root-not-a-string-1.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/source-root-not-a-string-1.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/source-root-not-a-string-2.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/source-root-not-a-string-2.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/source-root-resolution.js: Added. +(foo): +(bar): +* LayoutTests/imported/tg4/source-map-tests/resources/source-root-resolution.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/sources-and-sources-content-both-null.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/sources-and-sources-content-both-null.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/sources-missing.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/sources-missing.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/sources-non-null-sources-content-null.js: Added. +(foo): +(bar): +* LayoutTests/imported/tg4/source-map-tests/resources/sources-non-null-sources-content-null.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/sources-not-a-list-1.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/sources-not-a-list-1.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/sources-not-a-list-2.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/sources-not-a-list-2.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/sources-not-string-or-null.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/sources-not-string-or-null.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/sources-null-sources-content-non-null.js: Added. +(foo): +(bar): +* LayoutTests/imported/tg4/source-map-tests/resources/sources-null-sources-content-non-null.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/transitive-mapping-original.js: Added. +(foo): +* LayoutTests/imported/tg4/source-map-tests/resources/transitive-mapping-original.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/transitive-mapping-three-steps.js: Added. +(foo): +* LayoutTests/imported/tg4/source-map-tests/resources/transitive-mapping-three-steps.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/transitive-mapping.js: Added. +(foo): +* LayoutTests/imported/tg4/source-map-tests/resources/transitive-mapping.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/typescript-original.ts: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/unrecognized-property.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/unrecognized-property.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/valid-mapping-boundary-values.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/valid-mapping-boundary-values.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/valid-mapping-empty-groups.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/valid-mapping-empty-groups.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/valid-mapping-empty-string.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/valid-mapping-empty-string.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/valid-mapping-large-vlq.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/valid-mapping-large-vlq.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/version-missing.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/version-missing.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/version-not-a-number.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/version-not-a-number.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/version-numeric-string.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/version-numeric-string.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/version-too-high.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/version-too-high.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/version-too-low.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/version-too-low.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/version-valid.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/version-valid.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/vlq-valid-continuation-bit-present-1.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/vlq-valid-continuation-bit-present-1.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/vlq-valid-continuation-bit-present-2.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/vlq-valid-continuation-bit-present-2.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/vlq-valid-negative-digit.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/vlq-valid-negative-digit.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/vlq-valid-single-digit.js: Added. +* LayoutTests/imported/tg4/source-map-tests/resources/vlq-valid-single-digit.js.map: Added. +* LayoutTests/imported/tg4/source-map-tests/source-map-spec-tests.json: Added. +* LayoutTests/imported/tg4/source-map-tests/webkit/0001-Add-harness-for-source-maps-spec-tests.patch: Added. +* LayoutTests/imported/tg4/source-map-tests/webkit/source-map-spec.html: Added. +* LayoutTests/inspector/model/source-map-spec-expected.txt: Added. +* LayoutTests/inspector/model/source-map-spec.html: Added. +--- + .../imported/tg4/source-map-tests/LICENSE.md | 14 + + .../tg4/source-map-tests/README.WebKit | 1 + + .../imported/tg4/source-map-tests/README.md | 176 + + ...1-Add-source-map-specification-tests.patch | 3867 +++++++++++++++++ + ...002-Add-reverse-mapping-code-to-test.patch | 46 + + ...01-WIP-Firefox-source-map-spec-tests.patch | 337 ++ + .../firefox/browser_spec-source-map.js | 71 + + .../resources/basic-mapping-as-index-map.js | 2 + + .../basic-mapping-as-index-map.js.map | 15 + + .../resources/basic-mapping-original.js | 8 + + .../resources/basic-mapping.js | 2 + + .../resources/basic-mapping.js.map | 6 + + .../resources/file-not-a-string-1.js | 1 + + .../resources/file-not-a-string-1.js.map | 8 + + .../resources/file-not-a-string-2.js | 1 + + .../resources/file-not-a-string-2.js.map | 8 + + .../resources/ignore-list-empty.js | 1 + + .../resources/ignore-list-empty.js.map | 8 + + .../resources/ignore-list-out-of-bounds-1.js | 1 + + .../ignore-list-out-of-bounds-1.js.map | 8 + + .../resources/ignore-list-out-of-bounds-2.js | 1 + + .../ignore-list-out-of-bounds-2.js.map | 8 + + .../resources/ignore-list-valid-1.js | 1 + + .../resources/ignore-list-valid-1.js.map | 8 + + .../resources/ignore-list-wrong-type-1.js | 1 + + .../resources/ignore-list-wrong-type-1.js.map | 8 + + .../resources/ignore-list-wrong-type-2.js | 1 + + .../resources/ignore-list-wrong-type-2.js.map | 8 + + .../resources/ignore-list-wrong-type-3.js | 1 + + .../resources/ignore-list-wrong-type-3.js.map | 8 + + .../resources/ignore-list-wrong-type-4.js | 1 + + .../resources/ignore-list-wrong-type-4.js.map | 8 + + .../resources/index-map-empty-sections.js | 1 + + .../resources/index-map-empty-sections.js.map | 4 + + .../resources/index-map-file-wrong-type-1.js | 2 + + .../index-map-file-wrong-type-1.js.map | 15 + + .../resources/index-map-file-wrong-type-2.js | 2 + + .../index-map-file-wrong-type-2.js.map | 15 + + .../index-map-invalid-base-mappings.js | 1 + + .../index-map-invalid-base-mappings.js.map | 15 + + .../resources/index-map-invalid-order.js | 1 + + .../resources/index-map-invalid-order.js.map | 23 + + .../resources/index-map-invalid-overlap.js | 1 + + .../index-map-invalid-overlap.js.map | 23 + + .../resources/index-map-invalid-sub-map.js | 1 + + .../index-map-invalid-sub-map.js.map | 13 + + .../resources/index-map-missing-file.js | 2 + + .../resources/index-map-missing-file.js.map | 14 + + .../resources/index-map-missing-map.js | 1 + + .../resources/index-map-missing-map.js.map | 8 + + .../index-map-missing-offset-column.js | 1 + + .../index-map-missing-offset-column.js.map | 14 + + .../index-map-missing-offset-line.js | 1 + + .../index-map-missing-offset-line.js.map | 14 + + .../resources/index-map-missing-offset.js | 1 + + .../resources/index-map-missing-offset.js.map | 13 + + .../index-map-offset-column-wrong-type.js | 1 + + .../index-map-offset-column-wrong-type.js.map | 14 + + .../index-map-offset-line-wrong-type.js | 1 + + .../index-map-offset-line-wrong-type.js.map | 14 + + .../index-map-two-concatenated-sources.js | 2 + + .../index-map-two-concatenated-sources.js.map | 24 + + .../resources/index-map-wrong-type-map.js | 1 + + .../resources/index-map-wrong-type-map.js.map | 9 + + .../resources/index-map-wrong-type-offset.js | 1 + + .../index-map-wrong-type-offset.js.map | 14 + + .../index-map-wrong-type-sections.js | 1 + + .../index-map-wrong-type-sections.js.map | 4 + + .../invalid-mapping-bad-separator.js | 2 + + .../invalid-mapping-bad-separator.js.map | 6 + + .../invalid-mapping-not-a-string-1.js | 1 + + .../invalid-mapping-not-a-string-1.js.map | 7 + + .../invalid-mapping-not-a-string-2.js | 1 + + .../invalid-mapping-not-a-string-2.js.map | 7 + + ...nvalid-mapping-segment-column-too-large.js | 1 + + ...id-mapping-segment-column-too-large.js.map | 7 + + ...apping-segment-name-index-out-of-bounds.js | 1 + + ...ng-segment-name-index-out-of-bounds.js.map | 7 + + ...id-mapping-segment-name-index-too-large.js | 1 + + ...apping-segment-name-index-too-large.js.map | 7 + + ...invalid-mapping-segment-negative-column.js | 1 + + ...lid-mapping-segment-negative-column.js.map | 7 + + ...lid-mapping-segment-negative-name-index.js | 1 + + ...mapping-segment-negative-name-index.js.map | 7 + + ...apping-segment-negative-original-column.js | 1 + + ...ng-segment-negative-original-column.js.map | 7 + + ...-mapping-segment-negative-original-line.js | 1 + + ...ping-segment-negative-original-line.js.map | 7 + + ...apping-segment-negative-relative-column.js | 1 + + ...ng-segment-negative-relative-column.js.map | 8 + + ...ng-segment-negative-relative-name-index.js | 1 + + ...egment-negative-relative-name-index.js.map | 8 + + ...gment-negative-relative-original-column.js | 1 + + ...t-negative-relative-original-column.js.map | 8 + + ...segment-negative-relative-original-line.js | 1 + + ...ent-negative-relative-original-line.js.map | 8 + + ...-segment-negative-relative-source-index.js | 1 + + ...ment-negative-relative-source-index.js.map | 8 + + ...d-mapping-segment-negative-source-index.js | 1 + + ...pping-segment-negative-source-index.js.map | 7 + + ...pping-segment-original-column-too-large.js | 1 + + ...g-segment-original-column-too-large.js.map | 7 + + ...mapping-segment-original-line-too-large.js | 1 + + ...ing-segment-original-line-too-large.js.map | 7 + + ...ping-segment-source-index-out-of-bounds.js | 1 + + ...-segment-source-index-out-of-bounds.js.map | 7 + + ...-mapping-segment-source-index-too-large.js | 1 + + ...ping-segment-source-index-too-large.js.map | 7 + + ...valid-mapping-segment-with-three-fields.js | 2 + + ...d-mapping-segment-with-three-fields.js.map | 6 + + ...invalid-mapping-segment-with-two-fields.js | 2 + + ...lid-mapping-segment-with-two-fields.js.map | 6 + + ...nvalid-mapping-segment-with-zero-fields.js | 1 + + ...id-mapping-segment-with-zero-fields.js.map | 7 + + .../invalid-vlq-missing-continuation.js | 1 + + .../invalid-vlq-missing-continuation.js.map | 6 + + .../resources/invalid-vlq-non-base64-char.js | 1 + + .../invalid-vlq-non-base64-char.js.map | 6 + + .../mapping-semantics-column-reset.js | 3 + + .../mapping-semantics-column-reset.js.map | 7 + + .../mapping-semantics-five-field-segment.js | 2 + + ...apping-semantics-five-field-segment.js.map | 7 + + .../mapping-semantics-four-field-segment.js | 2 + + ...apping-semantics-four-field-segment.js.map | 7 + + .../resources/mapping-semantics-relative-1.js | 2 + + .../mapping-semantics-relative-1.js.map | 7 + + .../resources/mapping-semantics-relative-2.js | 3 + + .../mapping-semantics-relative-2.js.map | 7 + + .../mapping-semantics-single-field-segment.js | 2 + + ...ping-semantics-single-field-segment.js.map | 7 + + .../resources/names-missing.js | 1 + + .../resources/names-missing.js.map | 6 + + .../resources/names-not-a-list-1.js | 1 + + .../resources/names-not-a-list-1.js.map | 6 + + .../resources/names-not-a-list-2.js | 1 + + .../resources/names-not-a-list-2.js.map | 6 + + .../resources/names-not-string.js | 1 + + .../resources/names-not-string.js.map | 6 + + .../resources/second-source-original.js | 4 + + .../source-resolution-absolute-url.js | 2 + + .../source-resolution-absolute-url.js.map | 8 + + .../resources/source-root-not-a-string-1.js | 1 + + .../source-root-not-a-string-1.js.map | 8 + + .../resources/source-root-not-a-string-2.js | 1 + + .../source-root-not-a-string-2.js.map | 8 + + .../resources/source-root-resolution.js | 2 + + .../resources/source-root-resolution.js.map | 9 + + .../sources-and-sources-content-both-null.js | 1 + + ...urces-and-sources-content-both-null.js.map | 7 + + .../resources/sources-missing.js | 1 + + .../resources/sources-missing.js.map | 5 + + .../sources-non-null-sources-content-null.js | 2 + + ...urces-non-null-sources-content-null.js.map | 7 + + .../resources/sources-not-a-list-1.js | 1 + + .../resources/sources-not-a-list-1.js.map | 6 + + .../resources/sources-not-a-list-2.js | 1 + + .../resources/sources-not-a-list-2.js.map | 6 + + .../resources/sources-not-string-or-null.js | 1 + + .../sources-not-string-or-null.js.map | 6 + + .../sources-null-sources-content-non-null.js | 2 + + ...urces-null-sources-content-non-null.js.map | 7 + + .../resources/transitive-mapping-original.js | 5 + + .../transitive-mapping-original.js.map | 8 + + .../transitive-mapping-three-steps.js | 6 + + .../transitive-mapping-three-steps.js.map | 7 + + .../resources/transitive-mapping.js | 2 + + .../resources/transitive-mapping.js.map | 6 + + .../resources/typescript-original.ts | 5 + + .../resources/unrecognized-property.js | 1 + + .../resources/unrecognized-property.js.map | 8 + + .../valid-mapping-boundary-values.js | 1 + + .../valid-mapping-boundary-values.js.map | 7 + + .../resources/valid-mapping-empty-groups.js | 1 + + .../valid-mapping-empty-groups.js.map | 8 + + .../resources/valid-mapping-empty-string.js | 1 + + .../valid-mapping-empty-string.js.map | 8 + + .../resources/valid-mapping-large-vlq.js | 1 + + .../resources/valid-mapping-large-vlq.js.map | 6 + + .../resources/version-missing.js | 1 + + .../resources/version-missing.js.map | 5 + + .../resources/version-not-a-number.js | 1 + + .../resources/version-not-a-number.js.map | 6 + + .../resources/version-numeric-string.js | 1 + + .../resources/version-numeric-string.js.map | 6 + + .../resources/version-too-high.js | 1 + + .../resources/version-too-high.js.map | 6 + + .../resources/version-too-low.js | 1 + + .../resources/version-too-low.js.map | 6 + + .../resources/version-valid.js | 1 + + .../resources/version-valid.js.map | 6 + + .../vlq-valid-continuation-bit-present-1.js | 2 + + ...lq-valid-continuation-bit-present-1.js.map | 7 + + .../vlq-valid-continuation-bit-present-2.js | 4 + + ...lq-valid-continuation-bit-present-2.js.map | 7 + + .../resources/vlq-valid-negative-digit.js | 4 + + .../resources/vlq-valid-negative-digit.js.map | 7 + + .../resources/vlq-valid-single-digit.js | 2 + + .../resources/vlq-valid-single-digit.js.map | 7 + + .../source-map-spec-tests.json | 1554 +++++++ + ...d-harness-for-source-maps-spec-tests.patch | 1649 +++++++ + .../webkit/source-map-spec.html | 83 + + .../model/source-map-spec-expected.txt | 828 ++++ + .../inspector/model/source-map-spec.html | 87 + + 203 files changed, 9653 insertions(+) + create mode 100644 LayoutTests/imported/tg4/source-map-tests/LICENSE.md + create mode 100644 LayoutTests/imported/tg4/source-map-tests/README.WebKit + create mode 100644 LayoutTests/imported/tg4/source-map-tests/README.md + create mode 100644 LayoutTests/imported/tg4/source-map-tests/chrome/0001-Add-source-map-specification-tests.patch + create mode 100644 LayoutTests/imported/tg4/source-map-tests/chrome/0002-Add-reverse-mapping-code-to-test.patch + create mode 100644 LayoutTests/imported/tg4/source-map-tests/firefox/0001-WIP-Firefox-source-map-spec-tests.patch + create mode 100644 LayoutTests/imported/tg4/source-map-tests/firefox/browser_spec-source-map.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/basic-mapping-as-index-map.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/basic-mapping-as-index-map.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/basic-mapping-original.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/basic-mapping.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/basic-mapping.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/file-not-a-string-1.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/file-not-a-string-1.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/file-not-a-string-2.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/file-not-a-string-2.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-empty.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-empty.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-out-of-bounds-1.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-out-of-bounds-1.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-out-of-bounds-2.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-out-of-bounds-2.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-valid-1.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-valid-1.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-wrong-type-1.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-wrong-type-1.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-wrong-type-2.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-wrong-type-2.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-wrong-type-3.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-wrong-type-3.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-wrong-type-4.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-wrong-type-4.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/index-map-empty-sections.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/index-map-empty-sections.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/index-map-file-wrong-type-1.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/index-map-file-wrong-type-1.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/index-map-file-wrong-type-2.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/index-map-file-wrong-type-2.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/index-map-invalid-base-mappings.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/index-map-invalid-base-mappings.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/index-map-invalid-order.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/index-map-invalid-order.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/index-map-invalid-overlap.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/index-map-invalid-overlap.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/index-map-invalid-sub-map.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/index-map-invalid-sub-map.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-file.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-file.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-map.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-map.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-offset-column.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-offset-column.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-offset-line.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-offset-line.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-offset.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-offset.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/index-map-offset-column-wrong-type.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/index-map-offset-column-wrong-type.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/index-map-offset-line-wrong-type.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/index-map-offset-line-wrong-type.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/index-map-two-concatenated-sources.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/index-map-two-concatenated-sources.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/index-map-wrong-type-map.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/index-map-wrong-type-map.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/index-map-wrong-type-offset.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/index-map-wrong-type-offset.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/index-map-wrong-type-sections.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/index-map-wrong-type-sections.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-bad-separator.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-bad-separator.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-not-a-string-1.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-not-a-string-1.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-not-a-string-2.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-not-a-string-2.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-column-too-large.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-column-too-large.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-name-index-out-of-bounds.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-name-index-out-of-bounds.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-name-index-too-large.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-name-index-too-large.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-column.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-column.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-name-index.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-name-index.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-original-column.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-original-column.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-original-line.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-original-line.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-column.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-column.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-name-index.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-name-index.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-original-column.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-original-column.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-original-line.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-original-line.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-source-index.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-source-index.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-source-index.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-source-index.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-original-column-too-large.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-original-column-too-large.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-original-line-too-large.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-original-line-too-large.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-source-index-out-of-bounds.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-source-index-out-of-bounds.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-source-index-too-large.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-source-index-too-large.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-with-three-fields.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-with-three-fields.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-with-two-fields.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-with-two-fields.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-with-zero-fields.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-with-zero-fields.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-vlq-missing-continuation.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-vlq-missing-continuation.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-vlq-non-base64-char.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/invalid-vlq-non-base64-char.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-column-reset.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-column-reset.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-five-field-segment.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-five-field-segment.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-four-field-segment.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-four-field-segment.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-relative-1.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-relative-1.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-relative-2.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-relative-2.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-single-field-segment.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-single-field-segment.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/names-missing.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/names-missing.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/names-not-a-list-1.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/names-not-a-list-1.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/names-not-a-list-2.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/names-not-a-list-2.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/names-not-string.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/names-not-string.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/second-source-original.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/source-resolution-absolute-url.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/source-resolution-absolute-url.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/source-root-not-a-string-1.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/source-root-not-a-string-1.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/source-root-not-a-string-2.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/source-root-not-a-string-2.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/source-root-resolution.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/source-root-resolution.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/sources-and-sources-content-both-null.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/sources-and-sources-content-both-null.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/sources-missing.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/sources-missing.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/sources-non-null-sources-content-null.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/sources-non-null-sources-content-null.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/sources-not-a-list-1.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/sources-not-a-list-1.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/sources-not-a-list-2.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/sources-not-a-list-2.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/sources-not-string-or-null.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/sources-not-string-or-null.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/sources-null-sources-content-non-null.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/sources-null-sources-content-non-null.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/transitive-mapping-original.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/transitive-mapping-original.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/transitive-mapping-three-steps.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/transitive-mapping-three-steps.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/transitive-mapping.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/transitive-mapping.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/typescript-original.ts + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/unrecognized-property.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/unrecognized-property.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/valid-mapping-boundary-values.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/valid-mapping-boundary-values.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/valid-mapping-empty-groups.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/valid-mapping-empty-groups.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/valid-mapping-empty-string.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/valid-mapping-empty-string.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/valid-mapping-large-vlq.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/valid-mapping-large-vlq.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/version-missing.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/version-missing.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/version-not-a-number.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/version-not-a-number.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/version-numeric-string.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/version-numeric-string.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/version-too-high.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/version-too-high.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/version-too-low.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/version-too-low.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/version-valid.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/version-valid.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/vlq-valid-continuation-bit-present-1.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/vlq-valid-continuation-bit-present-1.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/vlq-valid-continuation-bit-present-2.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/vlq-valid-continuation-bit-present-2.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/vlq-valid-negative-digit.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/vlq-valid-negative-digit.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/vlq-valid-single-digit.js + create mode 100644 LayoutTests/imported/tg4/source-map-tests/resources/vlq-valid-single-digit.js.map + create mode 100644 LayoutTests/imported/tg4/source-map-tests/source-map-spec-tests.json + create mode 100644 LayoutTests/imported/tg4/source-map-tests/webkit/0001-Add-harness-for-source-maps-spec-tests.patch + create mode 100644 LayoutTests/imported/tg4/source-map-tests/webkit/source-map-spec.html + create mode 100644 LayoutTests/inspector/model/source-map-spec-expected.txt + create mode 100644 LayoutTests/inspector/model/source-map-spec.html + +diff --git a/LayoutTests/imported/tg4/source-map-tests/LICENSE.md b/LayoutTests/imported/tg4/source-map-tests/LICENSE.md +new file mode 100644 +index 000000000000..39501a3b7c70 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/LICENSE.md +@@ -0,0 +1,14 @@ ++The Source Map Tests suite ("Software") is protected by copyright and is being made available under the "BSD License", included below. This Software may be subject to third party rights (rights from parties other than Ecma International), including patent rights, and no licenses under such third party rights are granted under this license even if the third party concerned is a member of Ecma International. SEE THE ECMA CODE OF CONDUCT IN PATENT MATTERS AVAILABLE AT https://www.ecma-international.org/ipr FOR INFORMATION REGARDING THE LICENSING OF PATENT CLAIMS THAT ARE REQUIRED TO IMPLEMENT ECMA INTERNATIONAL STANDARDS*. ++ ++Copyright (c) 2024, Ecma International ++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. ++ ++* Ecma International Standards hereafter means Ecma International Standards as well as Ecma Technical Reports +diff --git a/LayoutTests/imported/tg4/source-map-tests/README.WebKit b/LayoutTests/imported/tg4/source-map-tests/README.WebKit +new file mode 100644 +index 000000000000..9d6cf4b7fb68 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/README.WebKit +@@ -0,0 +1 @@ ++FIXME +diff --git a/LayoutTests/imported/tg4/source-map-tests/README.md b/LayoutTests/imported/tg4/source-map-tests/README.md +new file mode 100644 +index 000000000000..a8bb3947c435 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/README.md +@@ -0,0 +1,176 @@ ++# Source Map Tests ++ ++This repository holds testing discussions and tests for the the Source Map debugging format. Specifically, we're looking to encourage discussion around: ++ ++- Manual and automated testing strategies for Source Maps ++- Gathering a list of Soure Map generators and consumers ++- General discussion around deviations between source maps ++ ++Open discussion happens in the [GitHub issues](https://github.com/source-map/source-map-tests/issues). ++ ++Source Map spec: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1# ++ ++## Test cases ++ ++These test cases are still a work-in-progress 🚧. ++ ++#### Running the tests ++ ++How to run in WebKit: ++ * Check out [WebKit](https://github.com/WebKit/WebKit/) ++ * `cd` to the checked out WebKit directory. ++ * Run `git am /webkit/0001-Add-harness-for-source-maps-spec-tests.patch` ++ * Run `Tools/Scripts/build-webkit` (depending on the platform you may need to pass `--gtk` or other flags) ++ * Run `Tools/Scripts/run-webkit-tests LayoutTests/inspector/model/source-map-spec.html` (again, you may need `--gtk` on Linux) ++ ++For Firefox, see the Mozilla [source-map](https://github.com/mozilla/source-map) library: ++ * There is a [branch](https://github.com/takikawa/source-map/tree/add-spec-tests) for adding the spec tests to the package. ++ ++How to run in Chrome Devtools: ++1. Setup: ++ * Install depot_tools following this [depot_tools guide](https://commondatastorage.googleapis.com/chrome-infra-docs/flat/depot_tools/docs/html/depot_tools_tutorial.html#_setting_up) ++ * Check out [Chrome Devtools](https://chromium.googlesource.com/devtools/devtools-frontend): ++ * Run `gclient config https://chromium.googlesource.com/devtools/devtools-frontend --unmanaged` ++ * Run `cd devtools-frontend` ++ * Run `gclient sync` ++ * Run `gn gen out/Default` ++2. Build: ++ * Run `autoninja -C out/Default` ++3. Test: ++ * Run `npm run auto-unittest` ++4. Apply patches from this repo: ++ * Run `git apply ` in `devtools-frontend` repo ++ ++More information about running Chrome Devtools without building Chromium can be found [here](https://chromium.googlesource.com/devtools/devtools-frontend/+/refs/heads/chromium/3965/README.md) ++ ++### Goals of tests ++ ++* Thoroughly test all aspects of the source maps spec that can be tested. ++* Strictly follow the spec when determining test behavior. ++ ++### Test coverage ++ ++#### Core spec ++ ++* Encoding ++ - [ ] Source map must be a valid JSON document. ++ - Base64 VLQ ++ * VLQs should decode correctly ++ - [X] A VLQ with a non-base64 character will fail to decode. ++ - [ ] A VLQ with one digit and no continuation digits should decode. ++ - [ ] A negative VLQ with the sign bit set to 1 should decode. ++ - [ ] A VLQ with non-zero continuation bits (and more than one digit) should decode. ++ - [X] A VLQ with a non-zero continuation bit with no further digits should fail to decode. ++ - [ ] A VLQ should decode with the correct order of digits (least to most significant). ++ - [x] A long VLQ with many trailing zero digits will decode. ++ * [x] A VLQ exceeding the 32-bit size limit is invalid (note: the spec is unclear on the details of this limit) ++ * [x] A VLQ at exactly the 32-bit size limit should be decoded (positive and negative). ++* Basic format ++ - `version` field ++ * [X] Must be present ++ * [X] Must be a number ++ * [X] Must be 3 ++ - `file` field ++ * [ ] Optional, allow missing ++ * [ ] Must be a string? (spec is not clear) ++ - `sourceRoot` field ++ * [ ] Optional, allow missing ++ * [ ] Must be a string? (spec is not clear) ++ - `sources` field ++ * [X] Must be present ++ * [X] Must be an array ++ * [X] Array elements must be `null` or a string ++ - `sourcesContent` field ++ * [X] Must be present ++ * [X] Must be an array ++ * [X] Array elements must be `null` or a string ++ - `names` field ++ * [X] Must be present (note: the spec implies this but implementations may not agree) ++ * [X] Must be an array ++ * [X] Array elements must be strings ++ - `mappings` field ++ * [X] Must be present ++ * [X] Must be a string ++ * [ ] Empty string is valid ++ - `ignoreList` field ++ * [ ] Optional, allow missing ++ * [ ] Must be an array ++ * [ ] Array elements must be numbers ++ * [ ] Elements must not be out of bounds for the `sources` list ++ - [X] Extra unrecognized fields are allowed ++* Index maps ++ - ? Must be mutually exclusive with non-index map? ++ - `file` field ++ * [ ] Optional, allow missing ++ * [ ] Must be a string? (spec is not clear) ++ - `sections` field ++ * [X] Must be present ++ * [X] Must be an array ++ * [ ] An empty sections array is valid ++ * [X] Array elements are valid section objects ++ - `offset` field ++ * [X] Must be present ++ * `line` field ++ - [X] Must be present ++ - [X] Must be a number ++ * `column` field ++ - [X] Must be present ++ - [X] Must be a number ++ - `map` field ++ * [X] Must be present ++ * [X] Must be an object ++ * [ ] Must be a valid source map ++ - [X] Sections are in order (the spec is not 100% clear, but assumption is increasing numeric order, may need subtests) ++ - [X] Sections are non-overlapping (the definition of overlap is not clear, may need subtests) ++* Mappings format ++ - [X] Each line is separated by ";" ++ - [X] A line may consist of zero segments (e.g., ";;") ++ - [X] Each line consists only of segments separated by "," ++ - [X] Must have greater than zero fields (note: many implementations don't check) ++ - [X] Must have 1, 4, or 5 fields ++ - [X] The source index must not be out of bounds of the sources array ++ - [X] The name index must not be out of bounds of the names array ++ - Absolute VLQ values must be non-negative ++ * [X] The column must be non-negative ++ * [X] The source index must be non-negative ++ * [X] The original line must be non-negative ++ * [X] The original column must be non-negative ++ * [X] The name index must be non-negative ++ - Relative VLQ values must be non-negative after adding to previous value ++ * [X] The column must be non-negative ++ * [X] The source index must be non-negative ++ * [X] The original line must be non-negative ++ * [X] The original column must be non-negative ++ * [X] The name index must be non-negative ++* Ignore list ++ - [X] An ignore list is optional, may be missing ++ - [X] An ignore list can't be a non-array value ++ * [X] An ignore list can be empty ++ * [X] An ignore list entry must be a number ++ * [X] An ignore list entry cannot be out-of-bounds of the sources array ++ - [X] Ignore list entries are detected and are present ++ - [X] Items not specified in the ignore list don't show up as ignored ++* Mappings semantics ++ - [ ] A source map with no mappings does not map any position. ++ - [ ] A single field segment gets mapped to the correct line and column. ++ - [X] A four field segment gets mapped to the correct line and column. ++ - [X] A five field segment gets mapped to the correct line and column. ++ - [X] When a name is present in a segment, it is correctly mapped. ++ - [X] When a source is present in a segment, it is correctly mapped. ++ - [ ] The second occurence of a field segment in a line is mapped relative to the previous one. ++ - [ ] When a new line starts, the generated column field resets to zero rather than being relative to the previous line. ++ - [ ] For fields other than the generated column, a segment field that has occured once in a previous line is mapped relatively when it occurs in the next line. ++ - [ ] Ensure that a transitive source map mapping works as expected ++ - Index maps are correctly used in mappings ++ * [ ] An index map with one sub-map will map correctly. ++ * [X] An index map with multiple sub-maps will map correctly, with appropriate offsets for the second and later sub-maps. ++* Resolution of sources ++ - [ ] When `sourceRoot` is provided, it is prepended to any `sources` entries and will be mapped with the full URL. ++ - [ ] If the source URL is an absolute URL, it is resolved as an absolute URL. ++ - [ ] If the source URL is a relative URL, it is resolved relative to the source map path. ++* Wasm support ++ - [ ] Create versions of the tests that use a Wasm source. ++ ++### Scopes Proposal ++ ++TODO +diff --git a/LayoutTests/imported/tg4/source-map-tests/chrome/0001-Add-source-map-specification-tests.patch b/LayoutTests/imported/tg4/source-map-tests/chrome/0001-Add-source-map-specification-tests.patch +new file mode 100644 +index 000000000000..c5fbd4baa8b0 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/chrome/0001-Add-source-map-specification-tests.patch +@@ -0,0 +1,3867 @@ ++From afa11641db357e524c8f4d5f573945dd15c1f2e9 Mon Sep 17 00:00:00 2001 ++From: Agata Belkius ++Date: Fri, 19 Apr 2024 15:30:48 +0100 ++Subject: [PATCH 1/2] Add source map specification tests ++ ++--- ++ front_end/BUILD.gn | 1 + ++ front_end/core/sdk/BUILD.gn | 1 + ++ front_end/core/sdk/SourceMapSpec.test.ts | 206 +++ ++ .../core/sdk/fixtures/sourcemaps/BUILD.gn | 202 +++ ++ .../sourcemaps/basic-mapping-as-index-map.js | 2 + ++ .../basic-mapping-as-index-map.js.map | 15 + ++ .../sourcemaps/basic-mapping-original.js | 8 + ++ .../sdk/fixtures/sourcemaps/basic-mapping.js | 2 + ++ .../fixtures/sourcemaps/basic-mapping.js.map | 6 + ++ .../fixtures/sourcemaps/ignore-list-empty.js | 1 + ++ .../sourcemaps/ignore-list-empty.js.map | 8 + ++ .../sourcemaps/ignore-list-out-of-bounds.js | 1 + ++ .../ignore-list-out-of-bounds.js.map | 8 + ++ .../sourcemaps/ignore-list-valid-1.js | 1 + ++ .../sourcemaps/ignore-list-valid-1.js.map | 8 + ++ .../sourcemaps/ignore-list-wrong-type-1.js | 1 + ++ .../ignore-list-wrong-type-1.js.map | 8 + ++ .../sourcemaps/ignore-list-wrong-type-2.js | 1 + ++ .../ignore-list-wrong-type-2.js.map | 8 + ++ .../sourcemaps/ignore-list-wrong-type-3.js | 1 + ++ .../ignore-list-wrong-type-3.js.map | 8 + ++ .../index-map-invalid-base-mappings.js | 1 + ++ .../index-map-invalid-base-mappings.js.map | 15 + ++ .../sourcemaps/index-map-invalid-order.js | 1 + ++ .../sourcemaps/index-map-invalid-order.js.map | 23 + ++ .../sourcemaps/index-map-invalid-overlap.js | 1 + ++ .../index-map-invalid-overlap.js.map | 23 + ++ .../sourcemaps/index-map-missing-map.js | 1 + ++ .../sourcemaps/index-map-missing-map.js.map | 8 + ++ .../index-map-missing-offset-column.js | 1 + ++ .../index-map-missing-offset-column.js.map | 14 + ++ .../index-map-missing-offset-line.js | 1 + ++ .../index-map-missing-offset-line.js.map | 14 + ++ .../sourcemaps/index-map-missing-offset.js | 1 + ++ .../index-map-missing-offset.js.map | 13 + ++ .../index-map-offset-column-wrong-type.js | 1 + ++ .../index-map-offset-column-wrong-type.js.map | 14 + ++ .../index-map-offset-line-wrong-type.js | 1 + ++ .../index-map-offset-line-wrong-type.js.map | 14 + ++ .../index-map-two-concatenated-sources.js | 2 + ++ .../index-map-two-concatenated-sources.js.map | 24 + ++ .../sourcemaps/index-map-wrong-type-map.js | 1 + ++ .../index-map-wrong-type-map.js.map | 9 + ++ .../sourcemaps/index-map-wrong-type-offset.js | 1 + ++ .../index-map-wrong-type-offset.js.map | 14 + ++ .../index-map-wrong-type-sections.js | 1 + ++ .../index-map-wrong-type-sections.js.map | 4 + ++ .../invalid-mapping-bad-separator.js | 2 + ++ .../invalid-mapping-bad-separator.js.map | 6 + ++ .../invalid-mapping-not-a-string-1.js | 1 + ++ .../invalid-mapping-not-a-string-1.js.map | 7 + ++ .../invalid-mapping-not-a-string-2.js | 1 + ++ .../invalid-mapping-not-a-string-2.js.map | 7 + ++ ...nvalid-mapping-segment-column-too-large.js | 1 + ++ ...id-mapping-segment-column-too-large.js.map | 7 + ++ ...apping-segment-name-index-out-of-bounds.js | 1 + ++ ...ng-segment-name-index-out-of-bounds.js.map | 7 + ++ ...id-mapping-segment-name-index-too-large.js | 1 + ++ ...apping-segment-name-index-too-large.js.map | 7 + ++ ...invalid-mapping-segment-negative-column.js | 1 + ++ ...lid-mapping-segment-negative-column.js.map | 7 + ++ ...lid-mapping-segment-negative-name-index.js | 1 + ++ ...mapping-segment-negative-name-index.js.map | 7 + ++ ...apping-segment-negative-original-column.js | 1 + ++ ...ng-segment-negative-original-column.js.map | 7 + ++ ...-mapping-segment-negative-original-line.js | 1 + ++ ...ping-segment-negative-original-line.js.map | 7 + ++ ...apping-segment-negative-relative-column.js | 1 + ++ ...ng-segment-negative-relative-column.js.map | 8 + ++ ...ng-segment-negative-relative-name-index.js | 1 + ++ ...egment-negative-relative-name-index.js.map | 8 + ++ ...gment-negative-relative-original-column.js | 1 + ++ ...t-negative-relative-original-column.js.map | 8 + ++ ...segment-negative-relative-original-line.js | 1 + ++ ...ent-negative-relative-original-line.js.map | 8 + ++ ...-segment-negative-relative-source-index.js | 1 + ++ ...ment-negative-relative-source-index.js.map | 8 + ++ ...d-mapping-segment-negative-source-index.js | 1 + ++ ...pping-segment-negative-source-index.js.map | 7 + ++ ...pping-segment-original-column-too-large.js | 1 + ++ ...g-segment-original-column-too-large.js.map | 7 + ++ ...mapping-segment-original-line-too-large.js | 1 + ++ ...ing-segment-original-line-too-large.js.map | 7 + ++ ...ping-segment-source-index-out-of-bounds.js | 1 + ++ ...-segment-source-index-out-of-bounds.js.map | 7 + ++ ...-mapping-segment-source-index-too-large.js | 1 + ++ ...ping-segment-source-index-too-large.js.map | 7 + ++ ...valid-mapping-segment-with-three-fields.js | 2 + ++ ...d-mapping-segment-with-three-fields.js.map | 6 + ++ ...invalid-mapping-segment-with-two-fields.js | 2 + ++ ...lid-mapping-segment-with-two-fields.js.map | 6 + ++ ...nvalid-mapping-segment-with-zero-fields.js | 1 + ++ ...id-mapping-segment-with-zero-fields.js.map | 7 + ++ .../invalid-vlq-missing-continuation.js | 1 + ++ .../invalid-vlq-missing-continuation.js.map | 6 + ++ .../sourcemaps/invalid-vlq-non-base64-char.js | 1 + ++ .../invalid-vlq-non-base64-char.js.map | 6 + ++ .../sdk/fixtures/sourcemaps/names-missing.js | 1 + ++ .../fixtures/sourcemaps/names-missing.js.map | 5 + ++ .../fixtures/sourcemaps/names-not-a-list-1.js | 1 + ++ .../sourcemaps/names-not-a-list-1.js.map | 6 + ++ .../fixtures/sourcemaps/names-not-a-list-2.js | 1 + ++ .../sourcemaps/names-not-a-list-2.js.map | 6 + ++ .../fixtures/sourcemaps/names-not-string.js | 1 + ++ .../sourcemaps/names-not-string.js.map | 6 + ++ .../sourcemaps/second-source-original.js | 4 + ++ .../sourcemaps/source-map-spec-tests.json | 1540 +++++++++++++++++ ++ .../sources-and-sources-content-both-null.js | 1 + ++ ...urces-and-sources-content-both-null.js.map | 7 + ++ .../fixtures/sourcemaps/sources-missing.js | 1 + ++ .../sourcemaps/sources-missing.js.map | 5 + ++ .../sources-non-null-sources-content-null.js | 2 + ++ ...urces-non-null-sources-content-null.js.map | 7 + ++ .../sourcemaps/sources-not-a-list-1.js | 1 + ++ .../sourcemaps/sources-not-a-list-1.js.map | 6 + ++ .../sourcemaps/sources-not-a-list-2.js | 1 + ++ .../sourcemaps/sources-not-a-list-2.js.map | 6 + ++ .../sourcemaps/sources-not-string-or-null.js | 1 + ++ .../sources-not-string-or-null.js.map | 6 + ++ .../sources-null-sources-content-non-null.js | 2 + ++ ...urces-null-sources-content-non-null.js.map | 7 + ++ .../sourcemaps/transitive-mapping-original.js | 5 + ++ .../transitive-mapping-original.js.map | 8 + ++ .../transitive-mapping-three-steps.js | 6 + ++ .../transitive-mapping-three-steps.js.map | 7 + ++ .../fixtures/sourcemaps/transitive-mapping.js | 2 + ++ .../sourcemaps/transitive-mapping.js.map | 6 + ++ .../sourcemaps/typescript-original.ts | 5 + ++ .../sourcemaps/unrecognized-property.js | 1 + ++ .../sourcemaps/unrecognized-property.js.map | 8 + ++ .../valid-mapping-boundary-values.js | 1 + ++ .../valid-mapping-boundary-values.js.map | 7 + ++ .../sourcemaps/valid-mapping-empty-groups.js | 1 + ++ .../valid-mapping-empty-groups.js.map | 8 + ++ .../sourcemaps/valid-mapping-large-vlq.js | 1 + ++ .../sourcemaps/valid-mapping-large-vlq.js.map | 6 + ++ .../sourcemaps/valid-mapping-null-sources.js | 2 + ++ .../valid-mapping-null-sources.js.map | 6 + ++ .../fixtures/sourcemaps/version-missing.js | 1 + ++ .../sourcemaps/version-missing.js.map | 5 + ++ .../sourcemaps/version-not-a-number.js | 1 + ++ .../sourcemaps/version-not-a-number.js.map | 6 + ++ .../sourcemaps/version-numeric-string.js | 1 + ++ .../sourcemaps/version-numeric-string.js.map | 6 + ++ .../fixtures/sourcemaps/version-too-high.js | 1 + ++ .../sourcemaps/version-too-high.js.map | 6 + ++ .../fixtures/sourcemaps/version-too-low.js | 1 + ++ .../sourcemaps/version-too-low.js.map | 6 + ++ .../sdk/fixtures/sourcemaps/version-valid.js | 1 + ++ .../fixtures/sourcemaps/version-valid.js.map | 6 + ++ 150 files changed, 2648 insertions(+) ++ create mode 100644 front_end/core/sdk/SourceMapSpec.test.ts ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/BUILD.gn ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/basic-mapping-as-index-map.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/basic-mapping-as-index-map.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/basic-mapping-original.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/basic-mapping.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/basic-mapping.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/ignore-list-empty.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/ignore-list-empty.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/ignore-list-out-of-bounds.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/ignore-list-out-of-bounds.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/ignore-list-valid-1.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/ignore-list-valid-1.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-1.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-1.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-2.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-2.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-3.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-3.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-base-mappings.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-base-mappings.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-order.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-order.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-overlap.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-overlap.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-missing-map.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-missing-map.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset-column.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset-column.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset-line.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset-line.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-offset-column-wrong-type.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-offset-column-wrong-type.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-offset-line-wrong-type.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-offset-line-wrong-type.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-two-concatenated-sources.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-two-concatenated-sources.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-map.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-map.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-offset.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-offset.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-sections.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-sections.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-bad-separator.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-bad-separator.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-not-a-string-1.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-not-a-string-1.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-not-a-string-2.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-not-a-string-2.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-column-too-large.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-column-too-large.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-name-index-out-of-bounds.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-name-index-out-of-bounds.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-name-index-too-large.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-name-index-too-large.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-column.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-column.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-name-index.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-name-index.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-original-column.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-original-column.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-original-line.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-original-line.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-column.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-column.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-name-index.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-name-index.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-original-column.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-original-column.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-original-line.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-original-line.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-source-index.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-source-index.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-source-index.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-source-index.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-original-column-too-large.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-original-column-too-large.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-original-line-too-large.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-original-line-too-large.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-source-index-out-of-bounds.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-source-index-out-of-bounds.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-source-index-too-large.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-source-index-too-large.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-three-fields.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-three-fields.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-two-fields.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-two-fields.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-zero-fields.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-zero-fields.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-vlq-missing-continuation.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-vlq-missing-continuation.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-vlq-non-base64-char.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/invalid-vlq-non-base64-char.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/names-missing.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/names-missing.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/names-not-a-list-1.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/names-not-a-list-1.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/names-not-a-list-2.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/names-not-a-list-2.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/names-not-string.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/names-not-string.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/second-source-original.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/source-map-spec-tests.json ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/sources-and-sources-content-both-null.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/sources-and-sources-content-both-null.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/sources-missing.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/sources-missing.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/sources-non-null-sources-content-null.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/sources-non-null-sources-content-null.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/sources-not-a-list-1.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/sources-not-a-list-1.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/sources-not-a-list-2.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/sources-not-a-list-2.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/sources-not-string-or-null.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/sources-not-string-or-null.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/sources-null-sources-content-non-null.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/sources-null-sources-content-non-null.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/transitive-mapping-original.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/transitive-mapping-original.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/transitive-mapping-three-steps.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/transitive-mapping-three-steps.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/transitive-mapping.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/transitive-mapping.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/typescript-original.ts ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/unrecognized-property.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/unrecognized-property.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/valid-mapping-boundary-values.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/valid-mapping-boundary-values.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/valid-mapping-empty-groups.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/valid-mapping-empty-groups.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/valid-mapping-large-vlq.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/valid-mapping-large-vlq.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/valid-mapping-null-sources.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/valid-mapping-null-sources.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/version-missing.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/version-missing.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/version-not-a-number.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/version-not-a-number.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/version-numeric-string.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/version-numeric-string.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/version-too-high.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/version-too-high.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/version-too-low.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/version-too-low.js.map ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/version-valid.js ++ create mode 100644 front_end/core/sdk/fixtures/sourcemaps/version-valid.js.map ++ ++diff --git a/front_end/BUILD.gn b/front_end/BUILD.gn ++index 863a434cea..125b34ba73 100644 ++--- a/front_end/BUILD.gn +++++ b/front_end/BUILD.gn ++@@ -106,6 +106,7 @@ group("unittests") { ++ "core/protocol_client:unittests", ++ "core/root:unittests", ++ "core/sdk:unittests", +++ "core/sdk/fixtures/sourcemaps", ++ "entrypoints/formatter_worker:unittests", ++ "entrypoints/heap_snapshot_worker:unittests", ++ "entrypoints/inspector_main:unittests", ++diff --git a/front_end/core/sdk/BUILD.gn b/front_end/core/sdk/BUILD.gn ++index 8d1cf0fa92..f8879365f4 100644 ++--- a/front_end/core/sdk/BUILD.gn +++++ b/front_end/core/sdk/BUILD.gn ++@@ -165,6 +165,7 @@ ts_library("unittests") { ++ "SourceMapManager.test.ts", ++ "SourceMapScopes.test.ts", ++ "SourceMapScopesInfo.test.ts", +++ "SourceMapSpec.test.ts", ++ "StorageBucketsModel.test.ts", ++ "StorageKeyManager.test.ts", ++ "Target.test.ts", ++diff --git a/front_end/core/sdk/SourceMapSpec.test.ts b/front_end/core/sdk/SourceMapSpec.test.ts ++new file mode 100644 ++index 0000000000..93b26a2e13 ++--- /dev/null +++++ b/front_end/core/sdk/SourceMapSpec.test.ts ++@@ -0,0 +1,206 @@ +++// Copyright 2024 The Chromium Authors. All rights reserved. +++// Use of this source code is governed by a BSD-style license that can be +++// found in the LICENSE file. +++ +++ +++/** +++ This file tests if devtools sourcemaps implementation is matching the sourcemaps spec. +++ Sourcemap Spec tests are using test data coming from: https://github.com/tc39/source-map-tests +++ +++ There is a lot of warnings of invalid source maps passing the validation - this is up to the authors +++ which ones of these could be actually checked in the SourceMaps implementetion and which ones are ok to ignore. +++ +++ **/ +++ +++const {assert} = chai; +++import type * as Platform from '../platform/platform.js'; +++import {assertNotNullOrUndefined} from '../platform/platform.js'; +++import { SourceMapV3, parseSourceMap } from './SourceMap.js'; +++import * as SDK from './sdk.js'; +++import {describeWithEnvironment} from '../../testing/EnvironmentHelpers.js'; +++ +++interface TestSpec { +++ name: string; +++ description: string; +++ baseFile: string; +++ sourceMapFile: string; +++ sourceMapIsValid: boolean; +++ testActions?: TestAction[]; +++} +++ +++interface TestAction { +++ actionType: string; +++ generatedLine: number; +++ generatedColumn: number; +++ originalSource: string; +++ originalLine: number; +++ originalColumn: number; +++ mappedName: null | string; +++ intermediateMaps?: string[] +++} +++ +++// Accept "null", null, or undefined for tests specifying a missing value. +++function nullish(arg : any) { +++ if (arg === "null" || arg === undefined) { +++ return null; +++ } +++ return arg; +++} +++ +++describeWithEnvironment('SourceMapSpec', () => { +++ let testCases : TestSpec[] | undefined; +++ let sourceMapContents : SourceMapV3[] = []; +++ +++ before(async () => { +++ testCases = await loadTestCasesFromFixture('source-map-spec-tests.json'); +++ sourceMapContents = await Promise.all( +++ testCases!.map( +++ async (testCase) => { +++ const { sourceMapFile } = testCase; +++ return loadSourceMapFromFixture(sourceMapFile); +++ } +++ ) +++ ); +++ }); +++ +++ it('Spec tests', () => { +++ const consoleErrorSpy = sinon.spy(console, 'error'); +++ testCases!.forEach(({ +++ baseFile, +++ sourceMapFile, +++ testActions, +++ sourceMapIsValid, +++ name +++ }, index) => { +++ const sourceMapContent = sourceMapContents[index]; +++ +++ // These test cases are ignored because certain validity checks are +++ // not implemented, such as checking the version number is `3`. +++ const ignoredCasesForBasicValidity = [ +++ "fileNotAString1", +++ "fileNotAString2", +++ "versionMissing", +++ "versionNotANumber", +++ "versionNumericString", +++ "versionTooHigh", +++ "versionTooLow", +++ "sourcesNotAList1", +++ "sourcesNotAList2", +++ "sourcesNotStringOrNull", +++ // FIXME: this test should be revised after recent spec changes +++ "namesMissing", +++ "namesNotAList1", +++ "namesNotAList2", +++ "namesNotString", +++ "ignoreListWrongType1", +++ "ignoreListWrongType2", +++ "ignoreListOutOfBounds", +++ "indexMapWrongTypeSections", +++ "indexMapWrongTypeMap", +++ "indexMapMissingOffset", +++ "invalidVLQDueToNonBase64Character", +++ ]; +++ +++ // 1) check if an invalid sourcemap throws on SourceMap instance creation, or +++ // 2) check if an invalid sourcemap throws on mapping creation +++ if (!sourceMapIsValid) { +++ if (ignoredCasesForBasicValidity.includes(name)) +++ return; +++ +++ let thrownDuringParse = false; +++ try { +++ const sourceMap = new SDK.SourceMap.SourceMap( +++ baseFile as Platform.DevToolsPath.UrlString, +++ sourceMapFile as Platform.DevToolsPath.UrlString, +++ sourceMapContent); +++ sourceMap.mappings(); +++ } catch { +++ thrownDuringParse = true; +++ } +++ assert.equal( +++ thrownDuringParse || consoleErrorSpy.calledWith("Failed to parse source map"), +++ true, +++ `${name}: expected invalid source map to fail to load` +++ ); +++ +++ return; +++ } +++ +++ // 3) check if a valid sourcemap can be parsed and a SourceMap instance created +++ const baseFileUrl = baseFile as Platform.DevToolsPath.UrlString; +++ const sourceMapFileUrl = sourceMapFile as Platform.DevToolsPath.UrlString; +++ +++ assert.doesNotThrow( +++ () => parseSourceMap(JSON.stringify(sourceMapContent)), +++ undefined, +++ undefined, +++ `${name}: expected valid source map to parse` +++ ); +++ assert.doesNotThrow(() => new SDK.SourceMap.SourceMap( +++ baseFileUrl, +++ sourceMapFileUrl, +++ sourceMapContent +++ ), undefined, undefined, `${name}: expected valid source map to parse`); +++ +++ // 4) check if the mappings are valid +++ const sourceMap = new SDK.SourceMap.SourceMap( +++ baseFileUrl, +++ sourceMapFileUrl, +++ sourceMapContent); +++ +++ assert.doesNotThrow(() => sourceMap.findEntry(1, 1)); +++ +++ if (testActions !== undefined) { +++ testActions.forEach(({ +++ actionType, +++ originalSource, +++ originalLine, +++ originalColumn, +++ generatedLine, +++ generatedColumn, +++ intermediateMaps +++ }) => { +++ +++ if (actionType === "checkMapping" && sourceMapIsValid) { +++ // 4a) check if the mappings are valid for regular sourcemaps +++ // extract to separate function +++ let actual = sourceMap.findEntry(generatedLine, generatedColumn); +++ assertNotNullOrUndefined(actual); +++ +++ assert.strictEqual(nullish(actual.sourceURL), originalSource, 'unexpected source URL'); +++ assert.strictEqual(nullish(actual.sourceLineNumber), originalLine, 'unexpected source line number'); +++ assert.strictEqual(nullish(actual.sourceColumnNumber), originalColumn, 'unexpected source column number'); +++ } +++ }); +++ } +++ }); +++ }); +++}); +++ +++async function loadTestCasesFromFixture(filename: string): Promise { +++ const testSpec = await getFixtureFileContents<{ tests: TestSpec[] }>(filename); +++ return testSpec?.tests ?? []; +++}; +++ +++async function loadSourceMapFromFixture(filename: string): Promise { +++ return getFixtureFileContents(filename); +++}; +++ +++async function getFixtureFileContents(filename: string): +++ Promise { +++ const url = new URL(`/front_end/core/sdk/fixtures/sourcemaps/${filename}`, window.location.origin); +++ +++ const response = await fetch(url); +++ +++ if (response.status !== 200) { +++ throw new Error(`Unable to load ${url}`); +++ } +++ +++ const contentType = response.headers.get('content-type'); +++ const isGzipEncoded = contentType !== null && contentType.includes('gzip'); +++ let buffer = await response.arrayBuffer(); +++ +++ const decoder = new TextDecoder('utf-8'); +++ const contents = JSON.parse(decoder.decode(buffer)) as T; +++ return contents; +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/BUILD.gn b/front_end/core/sdk/fixtures/sourcemaps/BUILD.gn ++new file mode 100644 ++index 0000000000..a82b09a02d ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/BUILD.gn ++@@ -0,0 +1,202 @@ +++# Copyright 2022 The Chromium Authors. All rights reserved. +++# Use of this source code is governed by a BSD-style license that can be +++# found in the LICENSE file. +++ +++import("../../../../../scripts/build/ninja/copy.gni") +++ +++copy_to_gen("sourcemaps") { +++ sources = [ +++ "basic-mapping-as-index-map.js", +++ "basic-mapping-as-index-map.js.map", +++ "basic-mapping-original.js", +++ "basic-mapping.js", +++ "basic-mapping.js.map", +++ "file-not-a-string-1.js", +++ "file-not-a-string-1.js.map", +++ "file-not-a-string-2.js", +++ "file-not-a-string-2.js.map", +++ "ignore-list-empty.js", +++ "ignore-list-empty.js.map", +++ "ignore-list-out-of-bounds.js", +++ "ignore-list-out-of-bounds.js.map", +++ "ignore-list-valid-1.js", +++ "ignore-list-valid-1.js.map", +++ "ignore-list-wrong-type-1.js", +++ "ignore-list-wrong-type-1.js.map", +++ "ignore-list-wrong-type-2.js", +++ "ignore-list-wrong-type-2.js.map", +++ "ignore-list-wrong-type-3.js", +++ "ignore-list-wrong-type-3.js.map", +++ "index-map-empty-sections.js", +++ "index-map-empty-sections.js.map", +++ "index-map-file-wrong-type-1.js", +++ "index-map-file-wrong-type-1.js.map", +++ "index-map-file-wrong-type-2.js", +++ "index-map-file-wrong-type-2.js.map", +++ "index-map-invalid-base-mappings.js", +++ "index-map-invalid-base-mappings.js.map", +++ "index-map-invalid-order.js", +++ "index-map-invalid-order.js.map", +++ "index-map-invalid-overlap.js", +++ "index-map-invalid-overlap.js.map", +++ "index-map-invalid-sub-map.js", +++ "index-map-invalid-sub-map.js.map", +++ "index-map-missing-file.js", +++ "index-map-missing-file.js.map", +++ "index-map-missing-map.js", +++ "index-map-missing-map.js.map", +++ "index-map-missing-offset-column.js", +++ "index-map-missing-offset-column.js.map", +++ "index-map-missing-offset-line.js", +++ "index-map-missing-offset-line.js.map", +++ "index-map-missing-offset.js", +++ "index-map-missing-offset.js.map", +++ "index-map-offset-column-wrong-type.js", +++ "index-map-offset-column-wrong-type.js.map", +++ "index-map-offset-line-wrong-type.js", +++ "index-map-offset-line-wrong-type.js.map", +++ "index-map-two-concatenated-sources.js", +++ "index-map-two-concatenated-sources.js.map", +++ "index-map-wrong-type-map.js", +++ "index-map-wrong-type-map.js.map", +++ "index-map-wrong-type-offset.js", +++ "index-map-wrong-type-offset.js.map", +++ "index-map-wrong-type-sections.js", +++ "index-map-wrong-type-sections.js.map", +++ "invalid-mapping-bad-separator.js", +++ "invalid-mapping-bad-separator.js.map", +++ "invalid-mapping-not-a-string-1.js", +++ "invalid-mapping-not-a-string-1.js.map", +++ "invalid-mapping-not-a-string-2.js", +++ "invalid-mapping-not-a-string-2.js.map", +++ "invalid-mapping-segment-column-too-large.js", +++ "invalid-mapping-segment-column-too-large.js.map", +++ "invalid-mapping-segment-name-index-out-of-bounds.js", +++ "invalid-mapping-segment-name-index-out-of-bounds.js.map", +++ "invalid-mapping-segment-name-index-too-large.js", +++ "invalid-mapping-segment-name-index-too-large.js.map", +++ "invalid-mapping-segment-negative-column.js", +++ "invalid-mapping-segment-negative-column.js.map", +++ "invalid-mapping-segment-negative-name-index.js", +++ "invalid-mapping-segment-negative-name-index.js.map", +++ "invalid-mapping-segment-negative-original-column.js", +++ "invalid-mapping-segment-negative-original-column.js.map", +++ "invalid-mapping-segment-negative-original-line.js", +++ "invalid-mapping-segment-negative-original-line.js.map", +++ "invalid-mapping-segment-negative-relative-column.js", +++ "invalid-mapping-segment-negative-relative-column.js.map", +++ "invalid-mapping-segment-negative-relative-name-index.js", +++ "invalid-mapping-segment-negative-relative-name-index.js.map", +++ "invalid-mapping-segment-negative-relative-original-column.js", +++ "invalid-mapping-segment-negative-relative-original-column.js.map", +++ "invalid-mapping-segment-negative-relative-original-line.js", +++ "invalid-mapping-segment-negative-relative-original-line.js.map", +++ "invalid-mapping-segment-negative-relative-source-index.js", +++ "invalid-mapping-segment-negative-relative-source-index.js.map", +++ "invalid-mapping-segment-negative-source-index.js", +++ "invalid-mapping-segment-negative-source-index.js.map", +++ "invalid-mapping-segment-original-column-too-large.js", +++ "invalid-mapping-segment-original-column-too-large.js.map", +++ "invalid-mapping-segment-original-line-too-large.js", +++ "invalid-mapping-segment-original-line-too-large.js.map", +++ "invalid-mapping-segment-source-index-out-of-bounds.js", +++ "invalid-mapping-segment-source-index-out-of-bounds.js.map", +++ "invalid-mapping-segment-source-index-too-large.js", +++ "invalid-mapping-segment-source-index-too-large.js.map", +++ "invalid-mapping-segment-with-three-fields.js", +++ "invalid-mapping-segment-with-three-fields.js.map", +++ "invalid-mapping-segment-with-two-fields.js", +++ "invalid-mapping-segment-with-two-fields.js.map", +++ "invalid-mapping-segment-with-zero-fields.js", +++ "invalid-mapping-segment-with-zero-fields.js.map", +++ "invalid-vlq-missing-continuation.js", +++ "invalid-vlq-missing-continuation.js.map", +++ "invalid-vlq-non-base64-char.js", +++ "invalid-vlq-non-base64-char.js.map", +++ "mapping-semantics-column-reset.js", +++ "mapping-semantics-column-reset.js.map", +++ "mapping-semantics-five-field-segment.js", +++ "mapping-semantics-five-field-segment.js.map", +++ "mapping-semantics-four-field-segment.js", +++ "mapping-semantics-four-field-segment.js.map", +++ "mapping-semantics-relative-1.js", +++ "mapping-semantics-relative-1.js.map", +++ "mapping-semantics-relative-2.js", +++ "mapping-semantics-relative-2.js.map", +++ "mapping-semantics-single-field-segment.js", +++ "mapping-semantics-single-field-segment.js.map", +++ "names-missing.js", +++ "names-missing.js.map", +++ "names-not-a-list-1.js", +++ "names-not-a-list-1.js.map", +++ "names-not-a-list-2.js", +++ "names-not-a-list-2.js.map", +++ "names-not-string.js", +++ "names-not-string.js.map", +++ "second-source-original.js", +++ "source-map-spec-tests.json", +++ "source-resolution-absolute-url.js", +++ "source-resolution-absolute-url.js.map", +++ "source-resolution-relative-url.js", +++ "source-resolution-relative-url.js.map", +++ "source-root-not-a-string-1.js", +++ "source-root-not-a-string-1.js.map", +++ "source-root-not-a-string-2.js", +++ "source-root-not-a-string-2.js.map", +++ "source-root-resolution.js", +++ "source-root-resolution.js.map", +++ "sources-and-sources-content-both-null.js", +++ "sources-and-sources-content-both-null.js.map", +++ "sources-missing.js", +++ "sources-missing.js.map", +++ "sources-non-null-sources-content-null.js", +++ "sources-non-null-sources-content-null.js.map", +++ "sources-not-a-list-1.js", +++ "sources-not-a-list-1.js.map", +++ "sources-not-a-list-2.js", +++ "sources-not-a-list-2.js.map", +++ "sources-not-string-or-null.js", +++ "sources-not-string-or-null.js.map", +++ "sources-null-sources-content-non-null.js", +++ "sources-null-sources-content-non-null.js.map", +++ "transitive-mapping-original.js", +++ "transitive-mapping-original.js.map", +++ "transitive-mapping-three-steps.js", +++ "transitive-mapping-three-steps.js.map", +++ "transitive-mapping.js", +++ "transitive-mapping.js.map", +++ "typescript-original.ts", +++ "unrecognized-property.js", +++ "unrecognized-property.js.map", +++ "valid-mapping-boundary-values.js", +++ "valid-mapping-boundary-values.js.map", +++ "valid-mapping-empty-groups.js", +++ "valid-mapping-empty-groups.js.map", +++ "valid-mapping-empty-string.js", +++ "valid-mapping-empty-string.js.map", +++ "valid-mapping-large-vlq.js", +++ "valid-mapping-large-vlq.js.map", +++ "valid-mapping-null-sources.js", +++ "valid-mapping-null-sources.js.map", +++ "version-missing.js", +++ "version-missing.js.map", +++ "version-not-a-number.js", +++ "version-not-a-number.js.map", +++ "version-numeric-string.js", +++ "version-numeric-string.js.map", +++ "version-too-high.js", +++ "version-too-high.js.map", +++ "version-too-low.js", +++ "version-too-low.js.map", +++ "version-valid.js", +++ "version-valid.js.map", +++ "vlq-valid-continuation-bit-present-1.js", +++ "vlq-valid-continuation-bit-present-1.js.map", +++ "vlq-valid-continuation-bit-present-2.js", +++ "vlq-valid-continuation-bit-present-2.js.map", +++ "vlq-valid-negative-digit.js", +++ "vlq-valid-negative-digit.js.map", +++ "vlq-valid-single-digit.js", +++ "vlq-valid-single-digit.js.map", +++ ] +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/basic-mapping-as-index-map.js b/front_end/core/sdk/fixtures/sourcemaps/basic-mapping-as-index-map.js ++new file mode 100644 ++index 0000000000..b9fae38043 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/basic-mapping-as-index-map.js ++@@ -0,0 +1,2 @@ +++function foo(){return 42}function bar(){return 24}foo();bar(); +++//# sourceMappingURL=basic-mapping-as-index-map.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/basic-mapping-as-index-map.js.map b/front_end/core/sdk/fixtures/sourcemaps/basic-mapping-as-index-map.js.map ++new file mode 100644 ++index 0000000000..c0ad870ed2 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/basic-mapping-as-index-map.js.map ++@@ -0,0 +1,15 @@ +++{ +++ "version": 3, +++ "file": "basic-mapping-as-index-map.js", +++ "sections": [ +++ { +++ "offset": { "line": 0, "column": 0 }, +++ "map": { +++ "version": 3, +++ "names": ["foo","bar"], +++ "sources": ["basic-mapping-original.js"], +++ "mappings": "AAAA,SAASA,MACP,OAAO,EACT,CACA,SAASC,MACP,OAAO,EACT,CACAD,MACAC" +++ } +++ } +++ ] +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/basic-mapping-original.js b/front_end/core/sdk/fixtures/sourcemaps/basic-mapping-original.js ++new file mode 100644 ++index 0000000000..301b186cb1 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/basic-mapping-original.js ++@@ -0,0 +1,8 @@ +++function foo() { +++ return 42; +++} +++function bar() { +++ return 24; +++} +++foo(); +++bar(); ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/basic-mapping.js b/front_end/core/sdk/fixtures/sourcemaps/basic-mapping.js ++new file mode 100644 ++index 0000000000..2e479a4175 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/basic-mapping.js ++@@ -0,0 +1,2 @@ +++function foo(){return 42}function bar(){return 24}foo();bar(); +++//# sourceMappingURL=basic-mapping.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/basic-mapping.js.map b/front_end/core/sdk/fixtures/sourcemaps/basic-mapping.js.map ++new file mode 100644 ++index 0000000000..12dc9679a4 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/basic-mapping.js.map ++@@ -0,0 +1,6 @@ +++{ +++ "version":3, +++ "names": ["foo","bar"], +++ "sources": ["basic-mapping-original.js"], +++ "mappings":"AAAA,SAASA,MACP,OAAO,EACT,CACA,SAASC,MACP,OAAO,EACT,CACAD,MACAC" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/ignore-list-empty.js b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-empty.js ++new file mode 100644 ++index 0000000000..385a5c3501 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-empty.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=ignore-list-empty.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/ignore-list-empty.js.map b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-empty.js.map ++new file mode 100644 ++index 0000000000..7297863a9b ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-empty.js.map ++@@ -0,0 +1,8 @@ +++{ +++ "version" : 3, +++ "sources": ["empty-original.js"], +++ "sourcesContent": [""], +++ "mappings": "", +++ "names": [], +++ "ignoreList": [] +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/ignore-list-out-of-bounds.js b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-out-of-bounds.js ++new file mode 100644 ++index 0000000000..7a0fbb8833 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-out-of-bounds.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=ignore-list-out-of-bounds.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/ignore-list-out-of-bounds.js.map b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-out-of-bounds.js.map ++new file mode 100644 ++index 0000000000..fb2566bb41 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-out-of-bounds.js.map ++@@ -0,0 +1,8 @@ +++{ +++ "version" : 3, +++ "sources": ["empty-original.js"], +++ "sourcesContent": [""], +++ "mappings": "", +++ "names": [], +++ "ignoreList": [1] +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/ignore-list-valid-1.js b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-valid-1.js ++new file mode 100644 ++index 0000000000..ea64a5565a ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-valid-1.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=ignore-list-valid-1.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/ignore-list-valid-1.js.map b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-valid-1.js.map ++new file mode 100644 ++index 0000000000..98eebdf7f6 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-valid-1.js.map ++@@ -0,0 +1,8 @@ +++{ +++ "version" : 3, +++ "sources": ["empty-original.js"], +++ "sourcesContent": [""], +++ "mappings": "", +++ "names": [], +++ "ignoreList": [0] +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-1.js b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-1.js ++new file mode 100644 ++index 0000000000..8b40bd3847 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-1.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=ignore-list-wrong-type-1.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-1.js.map b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-1.js.map ++new file mode 100644 ++index 0000000000..688740aba8 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-1.js.map ++@@ -0,0 +1,8 @@ +++{ +++ "version" : 3, +++ "sources": ["empty-original.js"], +++ "sourcesContent": [""], +++ "mappings": "", +++ "names": [], +++ "ignoreList": ["not a number"] +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-2.js b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-2.js ++new file mode 100644 ++index 0000000000..35c7791164 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-2.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=ignore-list-wrong-type-2.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-2.js.map b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-2.js.map ++new file mode 100644 ++index 0000000000..ca1d30de2d ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-2.js.map ++@@ -0,0 +1,8 @@ +++{ +++ "version" : 3, +++ "sources": ["empty-original.js"], +++ "sourcesContent": [""], +++ "mappings": "", +++ "names": [], +++ "ignoreList": ["0"] +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-3.js b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-3.js ++new file mode 100644 ++index 0000000000..8735d41758 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-3.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=ignore-list-wrong-type-3.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-3.js.map b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-3.js.map ++new file mode 100644 ++index 0000000000..1ac167d56c ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/ignore-list-wrong-type-3.js.map ++@@ -0,0 +1,8 @@ +++{ +++ "version" : 3, +++ "sources": ["empty-original.js"], +++ "sourcesContent": [""], +++ "mappings": "", +++ "names": [], +++ "ignoreList": 0 +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-base-mappings.js b/front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-base-mappings.js ++new file mode 100644 ++index 0000000000..e90bef083c ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-base-mappings.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=index-map-invalid-base-mappings.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-base-mappings.js.map b/front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-base-mappings.js.map ++new file mode 100644 ++index 0000000000..b489c1f080 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-base-mappings.js.map ++@@ -0,0 +1,15 @@ +++{ +++ "version": 3, +++ "mappings": "AAAA", +++ "sections": [ +++ { +++ "offset": { "line": 0, "column": 0 }, +++ "map": { +++ "version": 3, +++ "names": [], +++ "sources": ["empty-original.js"], +++ "mappings": "AAAA" +++ } +++ } +++ ] +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-order.js b/front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-order.js ++new file mode 100644 ++index 0000000000..263fa3c6e0 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-order.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=index-map-invalid-order.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-order.js.map b/front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-order.js.map ++new file mode 100644 ++index 0000000000..82da69df72 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-order.js.map ++@@ -0,0 +1,23 @@ +++{ +++ "version": 3, +++ "sections": [ +++ { +++ "offset": { "line": 1, "column": 4 }, +++ "map": { +++ "version": 3, +++ "names": [], +++ "sources": ["empty-original.js"], +++ "mappings": "AAAA" +++ } +++ }, +++ { +++ "offset": { "line": 0, "column": 0 }, +++ "map": { +++ "version": 3, +++ "names": [], +++ "sources": ["empty-original.js"], +++ "mappings": "AAAA" +++ } +++ } +++ ] +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-overlap.js b/front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-overlap.js ++new file mode 100644 ++index 0000000000..9aff8dc620 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-overlap.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=index-map-invalid-overlap.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-overlap.js.map b/front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-overlap.js.map ++new file mode 100644 ++index 0000000000..8d42546fd8 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-invalid-overlap.js.map ++@@ -0,0 +1,23 @@ +++{ +++ "version": 3, +++ "sections": [ +++ { +++ "offset": { "line": 0, "column": 0 }, +++ "map": { +++ "version": 3, +++ "names": [], +++ "sources": ["empty-original.js"], +++ "mappings": "AAAA" +++ } +++ }, +++ { +++ "offset": { "line": 0, "column": 0 }, +++ "map": { +++ "version": 3, +++ "names": [], +++ "sources": ["empty-original.js"], +++ "mappings": "AAAA" +++ } +++ } +++ ] +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-map.js b/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-map.js ++new file mode 100644 ++index 0000000000..86c8e9a253 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-map.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=index-map-missing-map.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-map.js.map b/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-map.js.map ++new file mode 100644 ++index 0000000000..3bce47e852 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-map.js.map ++@@ -0,0 +1,8 @@ +++{ +++ "version": 3, +++ "sections": [ +++ { +++ "offset": { "line": 0, "column": 0 } +++ } +++ ] +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset-column.js b/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset-column.js ++new file mode 100644 ++index 0000000000..fe6917403f ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset-column.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=index-map-missing-offset-column.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset-column.js.map b/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset-column.js.map ++new file mode 100644 ++index 0000000000..aa48bbb993 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset-column.js.map ++@@ -0,0 +1,14 @@ +++{ +++ "version": 3, +++ "sections": [ +++ { +++ "offset": { "line": 0 }, +++ "map": { +++ "version": 3, +++ "names": [], +++ "sources": ["empty-original.js"], +++ "mappings": "AAAA" +++ } +++ } +++ ] +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset-line.js b/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset-line.js ++new file mode 100644 ++index 0000000000..ba8614e412 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset-line.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=index-map-missing-offset-line.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset-line.js.map b/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset-line.js.map ++new file mode 100644 ++index 0000000000..3d60444ea7 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset-line.js.map ++@@ -0,0 +1,14 @@ +++{ +++ "version": 3, +++ "sections": [ +++ { +++ "offset": { "column": 0 }, +++ "map": { +++ "version": 3, +++ "names": [], +++ "sources": ["empty-original.js"], +++ "mappings": "AAAA" +++ } +++ } +++ ] +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset.js b/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset.js ++new file mode 100644 ++index 0000000000..9ca2cf3fb5 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=index-map-missing-offset.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset.js.map b/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset.js.map ++new file mode 100644 ++index 0000000000..7285138bf5 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-missing-offset.js.map ++@@ -0,0 +1,13 @@ +++{ +++ "version": 3, +++ "sections": [ +++ { +++ "map": { +++ "version": 3, +++ "names": [], +++ "sources": ["empty-original.js"], +++ "mappings": "AAAA" +++ } +++ } +++ ] +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-offset-column-wrong-type.js b/front_end/core/sdk/fixtures/sourcemaps/index-map-offset-column-wrong-type.js ++new file mode 100644 ++index 0000000000..ed1e9ec5d5 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-offset-column-wrong-type.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=index-map-offset-column-wrong-type.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-offset-column-wrong-type.js.map b/front_end/core/sdk/fixtures/sourcemaps/index-map-offset-column-wrong-type.js.map ++new file mode 100644 ++index 0000000000..b43e79a9dd ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-offset-column-wrong-type.js.map ++@@ -0,0 +1,14 @@ +++{ +++ "version": 3, +++ "sections": [ +++ { +++ "offset": { "line": 0, "column": true }, +++ "map": { +++ "version": 3, +++ "names": [], +++ "sources": ["empty-original.js"], +++ "mappings": "AAAA" +++ } +++ } +++ ] +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-offset-line-wrong-type.js b/front_end/core/sdk/fixtures/sourcemaps/index-map-offset-line-wrong-type.js ++new file mode 100644 ++index 0000000000..d58f2aff99 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-offset-line-wrong-type.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=index-map-offset-line-wrong-type.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-offset-line-wrong-type.js.map b/front_end/core/sdk/fixtures/sourcemaps/index-map-offset-line-wrong-type.js.map ++new file mode 100644 ++index 0000000000..81dbcd6ec4 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-offset-line-wrong-type.js.map ++@@ -0,0 +1,14 @@ +++{ +++ "version": 3, +++ "sections": [ +++ { +++ "offset": { "line": true, "column": 0 }, +++ "map": { +++ "version": 3, +++ "names": [], +++ "sources": ["empty-original.js"], +++ "mappings": "AAAA" +++ } +++ } +++ ] +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-two-concatenated-sources.js b/front_end/core/sdk/fixtures/sourcemaps/index-map-two-concatenated-sources.js ++new file mode 100644 ++index 0000000000..b8702d7187 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-two-concatenated-sources.js ++@@ -0,0 +1,2 @@ +++function foo(){return 42}function bar(){return 24}foo();bar();function baz(){return"baz"}baz(); +++//# sourceMappingURL=index-map-two-concatenated-sources.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-two-concatenated-sources.js.map b/front_end/core/sdk/fixtures/sourcemaps/index-map-two-concatenated-sources.js.map ++new file mode 100644 ++index 0000000000..f67f5de3c5 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-two-concatenated-sources.js.map ++@@ -0,0 +1,24 @@ +++{ +++ "version": 3, +++ "file": "index-map-two-concatenated-sources.js", +++ "sections": [ +++ { +++ "offset": { "line": 0, "column": 0 }, +++ "map": { +++ "version": 3, +++ "names": ["foo","bar"], +++ "sources": ["basic-mapping-original.js"], +++ "mappings": "AAAA,SAASA,MACP,OAAO,EACT,CACA,SAASC,MACP,OAAO,EACT,CACAD,MACAC" +++ } +++ }, +++ { +++ "offset": { "line": 0, "column": 62 }, +++ "map": { +++ "version": 3, +++ "names": ["baz"], +++ "sources": ["second-source-original.js"], +++ "mappings":"AAAA,SAASA,MACP,MAAO,KACT,CACAA" +++ } +++ } +++ ] +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-map.js b/front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-map.js ++new file mode 100644 ++index 0000000000..d31d6d6358 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-map.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=index-map-wrong-type-map.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-map.js.map b/front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-map.js.map ++new file mode 100644 ++index 0000000000..0963f623d7 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-map.js.map ++@@ -0,0 +1,9 @@ +++{ +++ "version": 3, +++ "sections": [ +++ { +++ "offset": { "line": 0, "column": 0 }, +++ "map": "not a map" +++ } +++ ] +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-offset.js b/front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-offset.js ++new file mode 100644 ++index 0000000000..048e1246f8 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-offset.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=index-map-wrong-type-offset.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-offset.js.map b/front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-offset.js.map ++new file mode 100644 ++index 0000000000..fbc6e4e678 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-offset.js.map ++@@ -0,0 +1,14 @@ +++{ +++ "version": 3, +++ "sections": [ +++ { +++ "offset": "not an offset", +++ "map": { +++ "version": 3, +++ "names": [], +++ "sources": ["empty-original.js"], +++ "mappings": "AAAA" +++ } +++ } +++ ] +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-sections.js b/front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-sections.js ++new file mode 100644 ++index 0000000000..011eca806e ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-sections.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=index-map-wrong-type-sections.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-sections.js.map b/front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-sections.js.map ++new file mode 100644 ++index 0000000000..dbfb4ead30 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/index-map-wrong-type-sections.js.map ++@@ -0,0 +1,4 @@ +++{ +++ "version": 3, +++ "sections": "not a sections list" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-bad-separator.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-bad-separator.js ++new file mode 100644 ++index 0000000000..25338aca30 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-bad-separator.js ++@@ -0,0 +1,2 @@ +++function foo(){return 42}function bar(){return 24}foo();bar(); +++//# sourceMappingURL=invalid-mapping-bad-separator.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-bad-separator.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-bad-separator.js.map ++new file mode 100644 ++index 0000000000..5f4f5b9233 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-bad-separator.js.map ++@@ -0,0 +1,6 @@ +++{ +++ "version": 3, +++ "names": ["foo","bar"], +++ "sources": ["basic-mapping-original.js"], +++ "mappings": "AAAA.SAASA:MACP" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-not-a-string-1.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-not-a-string-1.js ++new file mode 100644 ++index 0000000000..cb38e2fe9d ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-not-a-string-1.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=invalid-mapping-not-a-string-1.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-not-a-string-1.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-not-a-string-1.js.map ++new file mode 100644 ++index 0000000000..5bf3e2a9d8 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-not-a-string-1.js.map ++@@ -0,0 +1,7 @@ +++{ +++ "version": 3, +++ "names": [], +++ "file": "invalid-mapping-not-a-string-1.js", +++ "sources": ["empty-original.js"], +++ "mappings": 5 +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-not-a-string-2.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-not-a-string-2.js ++new file mode 100644 ++index 0000000000..3d84abd6c6 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-not-a-string-2.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=invalid-mapping-not-a-string-2.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-not-a-string-2.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-not-a-string-2.js.map ++new file mode 100644 ++index 0000000000..4527e7f764 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-not-a-string-2.js.map ++@@ -0,0 +1,7 @@ +++{ +++ "version": 3, +++ "names": [], +++ "file": "invalid-mapping-not-a-string-2.js", +++ "sources": ["empty-original.js"], +++ "mappings": [1, 2, 3, 4] +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-column-too-large.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-column-too-large.js ++new file mode 100644 ++index 0000000000..55591f874b ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-column-too-large.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=invalid-mapping-segment-column-too-large.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-column-too-large.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-column-too-large.js.map ++new file mode 100644 ++index 0000000000..b4c059e015 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-column-too-large.js.map ++@@ -0,0 +1,7 @@ +++{ +++ "version": 3, +++ "names": [], +++ "file": "invalid-mapping-segment-column-too-large.js", +++ "sources": ["empty-original.js"], +++ "mappings": "ggggggE" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-name-index-out-of-bounds.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-name-index-out-of-bounds.js ++new file mode 100644 ++index 0000000000..2a6b434eff ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-name-index-out-of-bounds.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=invalid-mapping-segment-name-index-out-of-bounds.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-name-index-out-of-bounds.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-name-index-out-of-bounds.js.map ++new file mode 100644 ++index 0000000000..8dd2ea6c2d ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-name-index-out-of-bounds.js.map ++@@ -0,0 +1,7 @@ +++{ +++ "version": 3, +++ "names": ["foo"], +++ "file": "invalid-mapping-segment-name-index-out-of-bounds.js", +++ "sources": ["empty-original.js"], +++ "mappings": "AAAAC" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-name-index-too-large.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-name-index-too-large.js ++new file mode 100644 ++index 0000000000..709e34dbd3 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-name-index-too-large.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=invalid-mapping-segment-name-index-too-large.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-name-index-too-large.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-name-index-too-large.js.map ++new file mode 100644 ++index 0000000000..c7bf5b98d1 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-name-index-too-large.js.map ++@@ -0,0 +1,7 @@ +++{ +++ "version": 3, +++ "names": [], +++ "file": "invalid-mapping-segment-name-index-too-large.js", +++ "sources": ["empty-original.js"], +++ "mappings": "AAAAggggggE" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-column.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-column.js ++new file mode 100644 ++index 0000000000..a202152d6f ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-column.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=invalid-mapping-segment-negative-column.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-column.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-column.js.map ++new file mode 100644 ++index 0000000000..403878bfa4 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-column.js.map ++@@ -0,0 +1,7 @@ +++{ +++ "version": 3, +++ "names": [], +++ "file": "invalid-mapping-segment-negative-column.js", +++ "sources": ["empty-original.js"], +++ "mappings": "F" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-name-index.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-name-index.js ++new file mode 100644 ++index 0000000000..3e3f634204 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-name-index.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=invalid-mapping-segment-negative-name-index.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-name-index.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-name-index.js.map ++new file mode 100644 ++index 0000000000..b94f63646e ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-name-index.js.map ++@@ -0,0 +1,7 @@ +++{ +++ "version": 3, +++ "names": [], +++ "file": "invalid-mapping-segment-negative-name-index.js", +++ "sources": ["empty-original.js"], +++ "mappings": "AAAAF" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-original-column.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-original-column.js ++new file mode 100644 ++index 0000000000..f21d5342b3 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-original-column.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=invalid-mapping-segment-negative-original-column.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-original-column.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-original-column.js.map ++new file mode 100644 ++index 0000000000..011c639d3f ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-original-column.js.map ++@@ -0,0 +1,7 @@ +++{ +++ "version": 3, +++ "names": [], +++ "file": "invalid-mapping-segment-negative-original-column.js", +++ "sources": ["empty-original.js"], +++ "mappings": "AAAF" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-original-line.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-original-line.js ++new file mode 100644 ++index 0000000000..b37309601c ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-original-line.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=invalid-mapping-segment-negative-original-line.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-original-line.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-original-line.js.map ++new file mode 100644 ++index 0000000000..e7ec993eeb ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-original-line.js.map ++@@ -0,0 +1,7 @@ +++{ +++ "version": 3, +++ "names": [], +++ "file": "invalid-mapping-segment-negative-original-line.js", +++ "sources": ["empty-original.js"], +++ "mappings": "AAFA" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-column.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-column.js ++new file mode 100644 ++index 0000000000..94b835d687 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-column.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=invalid-mapping-segment-negative-relative-column.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-column.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-column.js.map ++new file mode 100644 ++index 0000000000..414884072b ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-column.js.map ++@@ -0,0 +1,8 @@ +++{ +++ "version": 3, +++ "names": [], +++ "file": "invalid-mapping-segment-negative-relative-column.js", +++ "sources": ["empty-original.js"], +++ "sourcesContent": [""], +++ "mappings": "C,F" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-name-index.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-name-index.js ++new file mode 100644 ++index 0000000000..c965c5f011 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-name-index.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=invalid-mapping-segment-negative-relative-name-index.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-name-index.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-name-index.js.map ++new file mode 100644 ++index 0000000000..1fbbcfcd32 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-name-index.js.map ++@@ -0,0 +1,8 @@ +++{ +++ "version": 3, +++ "names": [], +++ "file": "invalid-mapping-segment-negative-relative-name-index.js", +++ "sources": ["empty-original.js"], +++ "sourcesContent": [""], +++ "mappings": "AAAAC,AAAAF" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-original-column.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-original-column.js ++new file mode 100644 ++index 0000000000..493a6ec88a ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-original-column.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=invalid-mapping-segment-negative-relative-original-column.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-original-column.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-original-column.js.map ++new file mode 100644 ++index 0000000000..7e62895651 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-original-column.js.map ++@@ -0,0 +1,8 @@ +++{ +++ "version": 3, +++ "names": [], +++ "file": "invalid-mapping-segment-negative-relative-original-column.js", +++ "sources": ["empty-original.js"], +++ "sourcesContent": [""], +++ "mappings": "AAAC,AAAF" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-original-line.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-original-line.js ++new file mode 100644 ++index 0000000000..ca8329fb98 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-original-line.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=invalid-mapping-segment-negative-relative-original-line.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-original-line.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-original-line.js.map ++new file mode 100644 ++index 0000000000..86b0fb3a04 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-original-line.js.map ++@@ -0,0 +1,8 @@ +++{ +++ "version": 3, +++ "names": [], +++ "file": "invalid-mapping-segment-negative-relative-original-line.js", +++ "sources": ["empty-original.js"], +++ "sourcesContent": [""], +++ "mappings": "AACA,AAFA" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-source-index.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-source-index.js ++new file mode 100644 ++index 0000000000..fa92225b09 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-source-index.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=invalid-mapping-segment-negative-relative-source-index.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-source-index.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-source-index.js.map ++new file mode 100644 ++index 0000000000..2efeb047db ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-relative-source-index.js.map ++@@ -0,0 +1,8 @@ +++{ +++ "version": 3, +++ "names": [], +++ "file": "invalid-mapping-segment-negative-relative-source-index.js", +++ "sources": ["empty-original.js"], +++ "sourcesContent": [""], +++ "mappings": "ACAA,AFAA" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-source-index.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-source-index.js ++new file mode 100644 ++index 0000000000..6e05849b6a ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-source-index.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=invalid-mapping-segment-negative-source-index.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-source-index.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-source-index.js.map ++new file mode 100644 ++index 0000000000..596c2f298b ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-negative-source-index.js.map ++@@ -0,0 +1,7 @@ +++{ +++ "version": 3, +++ "names": [], +++ "file": "invalid-mapping-segment-negative-source-index.js", +++ "sources": ["empty-original.js"], +++ "mappings": "AFAA" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-original-column-too-large.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-original-column-too-large.js ++new file mode 100644 ++index 0000000000..0936ed7ea8 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-original-column-too-large.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=invalid-mapping-segment-original-column-too-large.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-original-column-too-large.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-original-column-too-large.js.map ++new file mode 100644 ++index 0000000000..ff2103fe24 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-original-column-too-large.js.map ++@@ -0,0 +1,7 @@ +++{ +++ "version": 3, +++ "names": [], +++ "file": "invalid-mapping-segment-original-column-too-large.js", +++ "sources": ["empty-original.js"], +++ "mappings": "AAAggggggE" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-original-line-too-large.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-original-line-too-large.js ++new file mode 100644 ++index 0000000000..9b3aa5a361 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-original-line-too-large.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=invalid-mapping-segment-original-line-too-large.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-original-line-too-large.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-original-line-too-large.js.map ++new file mode 100644 ++index 0000000000..890f1c71fc ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-original-line-too-large.js.map ++@@ -0,0 +1,7 @@ +++{ +++ "version": 3, +++ "names": [], +++ "file": "invalid-mapping-segment-original-line-too-large.js", +++ "sources": ["empty-original.js"], +++ "mappings": "AAggggggEA" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-source-index-out-of-bounds.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-source-index-out-of-bounds.js ++new file mode 100644 ++index 0000000000..2e5fbca268 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-source-index-out-of-bounds.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=invalid-mapping-segment-source-index-out-of-bounds.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-source-index-out-of-bounds.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-source-index-out-of-bounds.js.map ++new file mode 100644 ++index 0000000000..86dedb114f ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-source-index-out-of-bounds.js.map ++@@ -0,0 +1,7 @@ +++{ +++ "version": 3, +++ "names": [], +++ "file": "invalid-mapping-segment-source-index-out-of-bounds.js", +++ "sources": ["empty-original.js"], +++ "mappings": "ACAA" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-source-index-too-large.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-source-index-too-large.js ++new file mode 100644 ++index 0000000000..3f4943e127 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-source-index-too-large.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=invalid-mapping-segment-source-index-too-large.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-source-index-too-large.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-source-index-too-large.js.map ++new file mode 100644 ++index 0000000000..e9f858c6e1 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-source-index-too-large.js.map ++@@ -0,0 +1,7 @@ +++{ +++ "version": 3, +++ "names": [], +++ "file": "invalid-mapping-segment-source-index-too-large.js", +++ "sources": ["empty-original.js"], +++ "mappings": "AggggggEAA" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-three-fields.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-three-fields.js ++new file mode 100644 ++index 0000000000..4b868fac9c ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-three-fields.js ++@@ -0,0 +1,2 @@ +++function foo(){return 42}function bar(){return 24}foo();bar(); +++//# sourceMappingURL=invalid-mapping-segment-with-three-fields.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-three-fields.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-three-fields.js.map ++new file mode 100644 ++index 0000000000..c2af1165ad ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-three-fields.js.map ++@@ -0,0 +1,6 @@ +++{ +++ "version": 3, +++ "names": ["foo","bar"], +++ "sources": ["basic-mapping-original.js"], +++ "mappings": "AAA" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-two-fields.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-two-fields.js ++new file mode 100644 ++index 0000000000..96045a7a11 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-two-fields.js ++@@ -0,0 +1,2 @@ +++function foo(){return 42}function bar(){return 24}foo();bar(); +++//# sourceMappingURL=invalid-mapping-segment-with-two-fields.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-two-fields.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-two-fields.js.map ++new file mode 100644 ++index 0000000000..73cf00fa1c ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-two-fields.js.map ++@@ -0,0 +1,6 @@ +++{ +++ "version": 3, +++ "names": ["foo","bar"], +++ "sources": ["basic-mapping-original.js"], +++ "mappings": "AA" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-zero-fields.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-zero-fields.js ++new file mode 100644 ++index 0000000000..9d5332a56c ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-zero-fields.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=invalid-mapping-segment-with-zero-fields.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-zero-fields.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-zero-fields.js.map ++new file mode 100644 ++index 0000000000..5a34d25b64 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-mapping-segment-with-zero-fields.js.map ++@@ -0,0 +1,7 @@ +++{ +++ "version": 3, +++ "names": [], +++ "file": "invalid-mapping-segment-with-zero-fields.js", +++ "sources": ["empty-original.js"], +++ "mappings": ",,,," +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-vlq-missing-continuation.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-vlq-missing-continuation.js ++new file mode 100644 ++index 0000000000..2c2a0090ac ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-vlq-missing-continuation.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=invalid-vlq-missing-continuation.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-vlq-missing-continuation.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-vlq-missing-continuation.js.map ++new file mode 100644 ++index 0000000000..dd0e363ff4 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-vlq-missing-continuation.js.map ++@@ -0,0 +1,6 @@ +++{ +++ "version" : 3, +++ "sources": [], +++ "names": [], +++ "mappings": "g" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-vlq-non-base64-char.js b/front_end/core/sdk/fixtures/sourcemaps/invalid-vlq-non-base64-char.js ++new file mode 100644 ++index 0000000000..d1b20b41a2 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-vlq-non-base64-char.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=invalid-vlq-non-base64-char.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/invalid-vlq-non-base64-char.js.map b/front_end/core/sdk/fixtures/sourcemaps/invalid-vlq-non-base64-char.js.map ++new file mode 100644 ++index 0000000000..4fa1ac5768 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/invalid-vlq-non-base64-char.js.map ++@@ -0,0 +1,6 @@ +++{ +++ "version" : 3, +++ "sources": [], +++ "names": [], +++ "mappings": "A$%?!" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/names-missing.js b/front_end/core/sdk/fixtures/sourcemaps/names-missing.js ++new file mode 100644 ++index 0000000000..58781fd887 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/names-missing.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=names-missing.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/names-missing.js.map b/front_end/core/sdk/fixtures/sourcemaps/names-missing.js.map ++new file mode 100644 ++index 0000000000..82170bf784 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/names-missing.js.map ++@@ -0,0 +1,5 @@ +++{ +++ "version" : 3, +++ "sources": ["empty-original.js"], +++ "mappings": "" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/names-not-a-list-1.js b/front_end/core/sdk/fixtures/sourcemaps/names-not-a-list-1.js ++new file mode 100644 ++index 0000000000..dc65f1972b ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/names-not-a-list-1.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=names-not-a-list-1.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/names-not-a-list-1.js.map b/front_end/core/sdk/fixtures/sourcemaps/names-not-a-list-1.js.map ++new file mode 100644 ++index 0000000000..fe1edaeb96 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/names-not-a-list-1.js.map ++@@ -0,0 +1,6 @@ +++{ +++ "version" : 3, +++ "sources": ["source.js"], +++ "names": "not a list", +++ "mappings": "AAAAA" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/names-not-a-list-2.js b/front_end/core/sdk/fixtures/sourcemaps/names-not-a-list-2.js ++new file mode 100644 ++index 0000000000..d7251f78da ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/names-not-a-list-2.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=names-not-a-list-2.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/names-not-a-list-2.js.map b/front_end/core/sdk/fixtures/sourcemaps/names-not-a-list-2.js.map ++new file mode 100644 ++index 0000000000..3388d2bb71 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/names-not-a-list-2.js.map ++@@ -0,0 +1,6 @@ +++{ +++ "version" : 3, +++ "sources": ["source.js"], +++ "names": { "foo": 3 }, +++ "mappings": "AAAAA" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/names-not-string.js b/front_end/core/sdk/fixtures/sourcemaps/names-not-string.js ++new file mode 100644 ++index 0000000000..8dc7b4811a ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/names-not-string.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=names-not-string.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/names-not-string.js.map b/front_end/core/sdk/fixtures/sourcemaps/names-not-string.js.map ++new file mode 100644 ++index 0000000000..c0feb0739a ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/names-not-string.js.map ++@@ -0,0 +1,6 @@ +++{ +++ "version" : 3, +++ "sources": ["source.js"], +++ "names": [null, 3, true, false, {}, []], +++ "mappings": "AAAAA" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/second-source-original.js b/front_end/core/sdk/fixtures/sourcemaps/second-source-original.js ++new file mode 100644 ++index 0000000000..c339bc9d15 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/second-source-original.js ++@@ -0,0 +1,4 @@ +++function baz() { +++ return "baz"; +++} +++baz(); ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/source-map-spec-tests.json b/front_end/core/sdk/fixtures/sourcemaps/source-map-spec-tests.json ++new file mode 100644 ++index 0000000000..0f7a3c1cb1 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/source-map-spec-tests.json ++@@ -0,0 +1,1540 @@ +++{ +++ "tests": [ +++ { +++ "name": "versionValid", +++ "description": "Test a simple source map with a valid version number", +++ "baseFile": "version-valid.js", +++ "sourceMapFile": "version-valid.js.map", +++ "sourceMapIsValid": true +++ }, +++ { +++ "name": "versionMissing", +++ "description": "Test a source map that is missing a version field", +++ "baseFile": "version-missing.js", +++ "sourceMapFile": "version-missing.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "versionNotANumber", +++ "description": "Test a source map with a version field that is not a number", +++ "baseFile": "version-not-a-number.js", +++ "sourceMapFile": "version-not-a-number.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "versionNumericString", +++ "description": "Test a source map with a version field that is a number as a string", +++ "baseFile": "version-numeric-string.js", +++ "sourceMapFile": "version-numeric-string.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "versionTooHigh", +++ "description": "Test a source map with an integer version field that is too high", +++ "baseFile": "version-too-high.js", +++ "sourceMapFile": "version-too-high.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "versionTooLow", +++ "description": "Test a source map with an integer version field that is too low", +++ "baseFile": "version-too-low.js", +++ "sourceMapFile": "version-too-low.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "sourcesMissing", +++ "description": "Test a source map that is missing a necessary sources field", +++ "baseFile": "sources-missing.js", +++ "sourceMapFile": "sources-missing.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "sourcesNotAList1", +++ "description": "Test a source map with a sources field that is not a valid list (string)", +++ "baseFile": "sources-not-a-list-1.js", +++ "sourceMapFile": "sources-not-a-list-1.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "sourcesNotAList2", +++ "description": "Test a source map with a sources field that is not a valid list (object)", +++ "baseFile": "sources-not-a-list-2.js", +++ "sourceMapFile": "sources-not-a-list-2.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "sourcesNotStringOrNull", +++ "description": "Test a source map with a sources list that has non-string and non-null items", +++ "baseFile": "sources-not-string-or-null.js", +++ "sourceMapFile": "sources-not-string-or-null.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "sourcesAndSourcesContentBothNull", +++ "description": "Test a source map that has both null sources and sourcesContent entries", +++ "baseFile": "sources-and-sources-content-both-null.js", +++ "sourceMapFile": "sources-and-sources-content-both-null.js.map", +++ "sourceMapIsValid": true +++ }, +++ { +++ "name": "fileNotAString1", +++ "description": "Test a source map with a file field that is not a valid string", +++ "baseFile": "file-not-a-string-1.js", +++ "sourceMapFile": "file-not-a-string-1.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "fileNotAString2", +++ "description": "Test a source map with a file field that is not a valid string", +++ "baseFile": "file-not-a-string-2.js", +++ "sourceMapFile": "file-not-a-string-2.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "sourceRootNotAString1", +++ "description": "Test a source map with a sourceRoot field that is not a valid string", +++ "baseFile": "source-root-not-a-string-1.js", +++ "sourceMapFile": "source-root-not-a-string-1.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "sourceRootNotAString2", +++ "description": "Test a source map with a sourceRoot field that is not a valid string", +++ "baseFile": "source-root-not-a-string-2.js", +++ "sourceMapFile": "source-root-not-a-string-2.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "namesMissing", +++ "description": "Test a source map that is missing a necessary names field", +++ "baseFile": "names-missing.js", +++ "sourceMapFile": "names-missing.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "namesNotAList1", +++ "description": "Test a source map with a names field that is not a valid list (string)", +++ "baseFile": "names-not-a-list-1.js", +++ "sourceMapFile": "names-not-a-list-1.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "namesNotAList2", +++ "description": "Test a source map with a names field that is not a valid list (object)", +++ "baseFile": "names-not-a-list-2.js", +++ "sourceMapFile": "names-not-a-list-2.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "namesNotString", +++ "description": "Test a source map with a names list that has non-string items", +++ "baseFile": "names-not-string.js", +++ "sourceMapFile": "names-not-string.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "ignoreListEmpty", +++ "description": "Test a source map with an ignore list that has no items", +++ "baseFile": "ignore-list-empty.js", +++ "sourceMapFile": "ignore-list-empty.js.map", +++ "sourceMapIsValid": true +++ }, +++ { +++ "name": "ignoreListValid1", +++ "description": "Test a source map with a simple valid ignore list", +++ "baseFile": "ignore-list-valid-1.js", +++ "sourceMapFile": "ignore-list-valid-1.js.map", +++ "sourceMapIsValid": true, +++ "testActions": [ +++ { +++ "actionType": "checkIgnoreList", +++ "present": ["empty-original.js"] +++ } +++ ] +++ }, +++ { +++ "name": "ignoreListWrongType1", +++ "description": "Test a source map with an ignore list with the wrong type of items", +++ "baseFile": "ignore-list-wrong-type-1.js", +++ "sourceMapFile": "ignore-list-wrong-type-1.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "ignoreListWrongType2", +++ "description": "Test a source map with an ignore list with the wrong type of items", +++ "baseFile": "ignore-list-wrong-type-2.js", +++ "sourceMapFile": "ignore-list-wrong-type-2.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "ignoreListWrongType3", +++ "description": "Test a source map with an ignore list that is not a list", +++ "baseFile": "ignore-list-wrong-type-3.js", +++ "sourceMapFile": "ignore-list-wrong-type-3.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "ignoreListOutOfBounds", +++ "description": "Test a source map with an ignore list with an item with an out-of-bounds index", +++ "baseFile": "ignore-list-out-of-bounds.js", +++ "sourceMapFile": "ignore-list-out-of-bounds.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "unrecognizedProperty", +++ "description": "Test a source map that has an extra field not explicitly encoded in the spec", +++ "baseFile": "unrecognized-property.js", +++ "sourceMapFile": "unrecognized-property.js.map", +++ "sourceMapIsValid": true +++ }, +++ { +++ "name": "invalidVLQDueToNonBase64Character", +++ "description": "Test a source map that has a mapping with an invalid non-base64 character", +++ "baseFile": "invalid-vlq-non-base64-char.js", +++ "sourceMapFile": "invalid-vlq-non-base64-char.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "invalidVLQDueToMissingContinuationDigits", +++ "description": "Test a source map that has a mapping with an invalid VLQ that has a continuation bit but no continuing digits", +++ "baseFile": "invalid-vlq-missing-continuation.js", +++ "sourceMapFile": "invalid-vlq-missing-continuation.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "invalidMappingNotAString1", +++ "description": "Test a source map that has an invalid mapping that is not a string (number)", +++ "baseFile": "invalid-mapping-not-a-string-1.js", +++ "sourceMapFile": "invalid-mapping-not-a-string-1.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "invalidMappingNotAString2", +++ "description": "Test a source map that has an invalid mapping that is not a string (array)", +++ "baseFile": "invalid-mapping-not-a-string-2.js", +++ "sourceMapFile": "invalid-mapping-not-a-string-2.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "invalidMappingSegmentBadSeparator", +++ "description": "Test a source map that uses separator characters not recognized in the spec", +++ "baseFile": "invalid-mapping-bad-separator.js", +++ "sourceMapFile": "invalid-mapping-bad-separator.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "invalidMappingSegmentWithZeroFields", +++ "description": "Test a source map that has the wrong number (zero) of segments fields", +++ "baseFile": "invalid-mapping-segment-with-zero-fields.js", +++ "sourceMapFile": "invalid-mapping-segment-with-zero-fields.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "invalidMappingSegmentWithTwoFields", +++ "description": "Test a source map that has the wrong number (two) of segments fields", +++ "baseFile": "invalid-mapping-segment-with-two-fields.js", +++ "sourceMapFile": "invalid-mapping-segment-with-two-fields.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "invalidMappingSegmentWithThreeFields", +++ "description": "Test a source map that has the wrong number (three) of segments fields", +++ "baseFile": "invalid-mapping-segment-with-three-fields.js", +++ "sourceMapFile": "invalid-mapping-segment-with-three-fields.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "invalidMappingSegmentWithSourceIndexOutOfBounds", +++ "description": "Test a source map that has a source index field that is out of bounds of the sources field", +++ "baseFile": "invalid-mapping-segment-source-index-out-of-bounds.js", +++ "sourceMapFile": "invalid-mapping-segment-source-index-out-of-bounds.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "invalidMappingSegmentWithNameIndexOutOfBounds", +++ "description": "Test a source map that has a name index field that is out of bounds of the names field", +++ "baseFile": "invalid-mapping-segment-name-index-out-of-bounds.js", +++ "sourceMapFile": "invalid-mapping-segment-name-index-out-of-bounds.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "invalidMappingSegmentWithNegativeColumn", +++ "description": "Test a source map that has an invalid negative non-relative column field", +++ "baseFile": "invalid-mapping-segment-negative-column.js", +++ "sourceMapFile": "invalid-mapping-segment-negative-column.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "invalidMappingSegmentWithNegativeSourceIndex", +++ "description": "Test a source map that has an invalid negative non-relative source index field", +++ "baseFile": "invalid-mapping-segment-negative-source-index.js", +++ "sourceMapFile": "invalid-mapping-segment-negative-source-index.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "invalidMappingSegmentWithNegativeOriginalLine", +++ "description": "Test a source map that has an invalid negative non-relative original line field", +++ "baseFile": "invalid-mapping-segment-negative-original-line.js", +++ "sourceMapFile": "invalid-mapping-segment-negative-original-line.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "invalidMappingSegmentWithNegativeOriginalColumn", +++ "description": "Test a source map that has an invalid negative non-relative original column field", +++ "baseFile": "invalid-mapping-segment-negative-original-column.js", +++ "sourceMapFile": "invalid-mapping-segment-negative-original-column.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "invalidMappingSegmentWithNegativeNameIndex", +++ "description": "Test a source map that has an invalid negative non-relative name index field", +++ "baseFile": "invalid-mapping-segment-negative-name-index.js", +++ "sourceMapFile": "invalid-mapping-segment-negative-name-index.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "invalidMappingSegmentWithNegativeRelativeColumn", +++ "description": "Test a source map that has an invalid negative relative column field", +++ "baseFile": "invalid-mapping-segment-negative-relative-column.js", +++ "sourceMapFile": "invalid-mapping-segment-negative-relative-column.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "invalidMappingSegmentWithNegativeRelativeSourceIndex", +++ "description": "Test a source map that has an invalid negative relative source index field", +++ "baseFile": "invalid-mapping-segment-negative-relative-source-index.js", +++ "sourceMapFile": "invalid-mapping-segment-negative-relative-source-index.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "invalidMappingSegmentWithNegativeRelativeOriginalLine", +++ "description": "Test a source map that has an invalid negative relative original line field", +++ "baseFile": "invalid-mapping-segment-negative-relative-original-line.js", +++ "sourceMapFile": "invalid-mapping-segment-negative-relative-original-line.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "invalidMappingSegmentWithNegativeRelativeOriginalColumn", +++ "description": "Test a source map that has an invalid negative relative original column field", +++ "baseFile": "invalid-mapping-segment-negative-relative-original-column.js", +++ "sourceMapFile": "invalid-mapping-segment-negative-relative-original-column.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "invalidMappingSegmentWithNegativeRelativeNameIndex", +++ "description": "Test a source map that has an invalid negative relative name index field", +++ "baseFile": "invalid-mapping-segment-negative-relative-name-index.js", +++ "sourceMapFile": "invalid-mapping-segment-negative-relative-name-index.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "invalidMappingSegmentWithColumnExceeding32Bits", +++ "description": "Test a source map that has a column field that exceeds 32 bits", +++ "baseFile": "invalid-mapping-segment-column-too-large.js", +++ "sourceMapFile": "invalid-mapping-segment-column-too-large.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "invalidMappingSegmentWithSourceIndexExceeding32Bits", +++ "description": "Test a source map that has a source index field that exceeds 32 bits", +++ "baseFile": "invalid-mapping-segment-source-index-too-large.js", +++ "sourceMapFile": "invalid-mapping-segment-source-index-too-large.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "invalidMappingSegmentWithOriginalLineExceeding32Bits", +++ "description": "Test a source map that has a original line field that exceeds 32 bits", +++ "baseFile": "invalid-mapping-segment-original-line-too-large.js", +++ "sourceMapFile": "invalid-mapping-segment-original-line-too-large.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "invalidMappingSegmentWithOriginalColumnExceeding32Bits", +++ "description": "Test a source map that has an original column field that exceeds 32 bits", +++ "baseFile": "invalid-mapping-segment-original-column-too-large.js", +++ "sourceMapFile": "invalid-mapping-segment-original-column-too-large.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "invalidMappingSegmentWithNameIndexExceeding32Bits", +++ "description": "Test a source map that has a name index field that exceeds 32 bits", +++ "baseFile": "invalid-mapping-segment-name-index-too-large.js", +++ "sourceMapFile": "invalid-mapping-segment-name-index-too-large.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "validMappingFieldsWith32BitMaxValues", +++ "description": "Test a source map that has segment fields with max values representable in 32 bits", +++ "baseFile": "valid-mapping-boundary-values.js", +++ "sourceMapFile": "valid-mapping-boundary-values.js.map", +++ "sourceMapIsValid": true +++ }, +++ { +++ "name": "validMappingLargeVLQ", +++ "description": "Test a source map that has a segment field VLQ that is very long but within 32-bits", +++ "baseFile": "valid-mapping-large-vlq.js", +++ "sourceMapFile": "valid-mapping-large-vlq.js.map", +++ "sourceMapIsValid": true +++ }, +++ { +++ "name": "validMappingEmptyGroups", +++ "description": "Test a source map with a mapping that has many empty groups", +++ "baseFile": "valid-mapping-empty-groups.js", +++ "sourceMapFile": "valid-mapping-empty-groups.js.map", +++ "sourceMapIsValid": true +++ }, +++ { +++ "name": "validMappingEmptyString", +++ "description": "Test a source map with an empty string mapping", +++ "baseFile": "valid-mapping-empty-string.js", +++ "sourceMapFile": "valid-mapping-empty-string.js.map", +++ "sourceMapIsValid": true +++ }, +++ { +++ "name": "indexMapWrongTypeSections", +++ "description": "Test an index map with a sections field with the wrong type", +++ "baseFile": "index-map-wrong-type-sections.js", +++ "sourceMapFile": "index-map-wrong-type-sections.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "indexMapWrongTypeOffset", +++ "description": "Test an index map with an offset field with the wrong type", +++ "baseFile": "index-map-wrong-type-offset.js", +++ "sourceMapFile": "index-map-wrong-type-offset.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "indexMapWrongTypeMap", +++ "description": "Test an index map with a map field with the wrong type", +++ "baseFile": "index-map-wrong-type-map.js", +++ "sourceMapFile": "index-map-wrong-type-map.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "indexMapInvalidBaseMappings", +++ "description": "Test that an index map cannot also have a regular mappings field", +++ "baseFile": "index-map-invalid-base-mappings.js", +++ "sourceMapFile": "index-map-invalid-base-mappings.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "indexMapInvalidOverlap", +++ "description": "Test that an invalid index map with multiple sections that overlap", +++ "baseFile": "index-map-invalid-overlap.js", +++ "sourceMapFile": "index-map-invalid-overlap.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "indexMapInvalidOrder", +++ "description": "Test that an invalid index map with multiple sections in the wrong order", +++ "baseFile": "index-map-invalid-order.js", +++ "sourceMapFile": "index-map-invalid-order.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "indexMapMissingMap", +++ "description": "Test that an index map that is missing a section map", +++ "baseFile": "index-map-missing-map.js", +++ "sourceMapFile": "index-map-missing-map.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "indexMapInvalidSubMap", +++ "description": "Test that an index map that has an invalid section map", +++ "baseFile": "index-map-invalid-sub-map.js", +++ "sourceMapFile": "index-map-invalid-sub-map.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "indexMapMissingOffset", +++ "description": "Test that an index map that is missing a section offset", +++ "baseFile": "index-map-missing-offset.js", +++ "sourceMapFile": "index-map-missing-offset.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "indexMapMissingOffsetLine", +++ "description": "Test that an index map that is missing a section offset's line field", +++ "baseFile": "index-map-missing-offset-line.js", +++ "sourceMapFile": "index-map-missing-offset-line.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "indexMapMissingOffsetColumn", +++ "description": "Test that an index map that is missing a section offset's column field", +++ "baseFile": "index-map-missing-offset-column.js", +++ "sourceMapFile": "index-map-missing-offset-column.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "indexMapOffsetLineWrongType", +++ "description": "Test that an index map that has an offset line field with the wrong type of value", +++ "baseFile": "index-map-offset-line-wrong-type.js", +++ "sourceMapFile": "index-map-offset-line-wrong-type.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "indexMapOffsetColumnWrongType", +++ "description": "Test that an index map that has an offset column field with the wrong type of value", +++ "baseFile": "index-map-offset-column-wrong-type.js", +++ "sourceMapFile": "index-map-offset-column-wrong-type.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "indexMapEmptySections", +++ "description": "Test a trivial index map with no sections", +++ "baseFile": "index-map-empty-sections.js", +++ "sourceMapFile": "index-map-empty-sections.js.map", +++ "sourceMapIsValid": true +++ }, +++ { +++ "name": "indexMapFileWrongType1", +++ "description": "Test an index map with a file field with the wrong type", +++ "baseFile": "index-map-file-wrong-type-1.js", +++ "sourceMapFile": "index-map-file-wrong-type-1.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "indexMapFileWrongType2", +++ "description": "Test an index map with a file field with the wrong type", +++ "baseFile": "index-map-file-wrong-type-2.js", +++ "sourceMapFile": "index-map-file-wrong-type-2.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "basicMapping", +++ "description": "Test a simple source map that has several valid mappings", +++ "baseFile": "basic-mapping.js", +++ "sourceMapFile": "basic-mapping.js.map", +++ "sourceMapIsValid": true, +++ "testActions": [ +++ { +++ "actionType": "checkMapping", +++ "generatedLine": 0, +++ "generatedColumn": 0, +++ "originalSource": "basic-mapping-original.js", +++ "originalLine": 0, +++ "originalColumn": 0, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "generatedLine": 0, +++ "generatedColumn": 9, +++ "originalSource": "basic-mapping-original.js", +++ "originalLine": 0, +++ "originalColumn": 9, +++ "mappedName": "foo" +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 15, +++ "originalLine": 1, +++ "originalColumn": 2, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 22, +++ "originalLine": 1, +++ "originalColumn": 9, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 24, +++ "originalLine": 2, +++ "originalColumn": 0, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 25, +++ "originalLine": 3, +++ "originalColumn": 0, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "generatedLine": 0, +++ "generatedColumn": 34, +++ "originalSource": "basic-mapping-original.js", +++ "originalLine": 3, +++ "originalColumn": 9, +++ "mappedName": "bar" +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 40, +++ "originalLine": 4, +++ "originalColumn": 2, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 47, +++ "originalLine": 4, +++ "originalColumn": 9, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 49, +++ "originalLine": 5, +++ "originalColumn": 0, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 50, +++ "originalLine": 6, +++ "originalColumn": 0, +++ "mappedName": "foo" +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 56, +++ "originalLine": 7, +++ "originalColumn": 0, +++ "mappedName": "bar" +++ } +++ ] +++ }, +++ { +++ "name": "sourceRootResolution", +++ "description": "Similar to basic mapping test, but test resoultion of sources with a sourceRoot field", +++ "baseFile": "source-root-resolution.js", +++ "sourceMapFile": "source-root-resolution.js.map", +++ "sourceMapIsValid": true, +++ "testActions": [ +++ { +++ "actionType": "checkMapping", +++ "generatedLine": 0, +++ "generatedColumn": 0, +++ "originalSource": "theroot/basic-mapping-original.js", +++ "originalLine": 0, +++ "originalColumn": 0, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "generatedLine": 0, +++ "generatedColumn": 9, +++ "originalSource": "theroot/basic-mapping-original.js", +++ "originalLine": 0, +++ "originalColumn": 9, +++ "mappedName": "foo" +++ } +++ ] +++ }, +++ { +++ "name": "sourceResolutionAbsoluteURL", +++ "description": "Test resoultion of sources with absolute URLs", +++ "baseFile": "source-resolution-absolute-url.js", +++ "sourceMapFile": "source-resolution-absolute-url.js.map", +++ "sourceMapIsValid": true, +++ "testActions": [ +++ { +++ "actionType": "checkMapping", +++ "generatedLine": 0, +++ "generatedColumn": 0, +++ "originalSource": "/baz/quux/basic-mapping-original.js", +++ "originalLine": 0, +++ "originalColumn": 0, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "generatedLine": 0, +++ "generatedColumn": 9, +++ "originalSource": "/baz/quux/basic-mapping-original.js", +++ "originalLine": 0, +++ "originalColumn": 9, +++ "mappedName": "foo" +++ } +++ ] +++ }, +++ { +++ "name": "basicMappingWithIndexMap", +++ "description": "Test a version of basic-mapping.js.map that is split into sections with an index map", +++ "baseFile": "basic-mapping-as-index-map.js", +++ "sourceMapFile": "basic-mapping-as-index-map.js.map", +++ "sourceMapIsValid": true, +++ "testActions": [ +++ { +++ "actionType": "checkMapping", +++ "generatedLine": 0, +++ "generatedColumn": 0, +++ "originalSource": "basic-mapping-original.js", +++ "originalLine": 0, +++ "originalColumn": 0, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "generatedLine": 0, +++ "generatedColumn": 9, +++ "originalSource": "basic-mapping-original.js", +++ "originalLine": 0, +++ "originalColumn": 9, +++ "mappedName": "foo" +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 15, +++ "originalLine": 1, +++ "originalColumn": 2, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 22, +++ "originalLine": 1, +++ "originalColumn": 9, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 24, +++ "originalLine": 2, +++ "originalColumn": 0, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 25, +++ "originalLine": 3, +++ "originalColumn": 0, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "generatedLine": 0, +++ "generatedColumn": 34, +++ "originalSource": "basic-mapping-original.js", +++ "originalLine": 3, +++ "originalColumn": 9, +++ "mappedName": "bar" +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 40, +++ "originalLine": 4, +++ "originalColumn": 2, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 47, +++ "originalLine": 4, +++ "originalColumn": 9, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 49, +++ "originalLine": 5, +++ "originalColumn": 0, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 50, +++ "originalLine": 6, +++ "originalColumn": 0, +++ "mappedName": "foo" +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 56, +++ "originalLine": 7, +++ "originalColumn": 0, +++ "mappedName": "bar" +++ } +++ ] +++ }, +++ { +++ "name": "indexMapWithMissingFile", +++ "description": "Same as the basic mapping index map test but without the optional file field", +++ "baseFile": "index-map-missing-file.js", +++ "sourceMapFile": "index-map-missing-file.js.map", +++ "sourceMapIsValid": true, +++ "testActions": [ +++ { +++ "actionType": "checkMapping", +++ "generatedLine": 0, +++ "generatedColumn": 0, +++ "originalSource": "basic-mapping-original.js", +++ "originalLine": 0, +++ "originalColumn": 0, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "generatedLine": 0, +++ "generatedColumn": 9, +++ "originalSource": "basic-mapping-original.js", +++ "originalLine": 0, +++ "originalColumn": 9, +++ "mappedName": "foo" +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 15, +++ "originalLine": 1, +++ "originalColumn": 2, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 22, +++ "originalLine": 1, +++ "originalColumn": 9, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 24, +++ "originalLine": 2, +++ "originalColumn": 0, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 25, +++ "originalLine": 3, +++ "originalColumn": 0, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "generatedLine": 0, +++ "generatedColumn": 34, +++ "originalSource": "basic-mapping-original.js", +++ "originalLine": 3, +++ "originalColumn": 9, +++ "mappedName": "bar" +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 40, +++ "originalLine": 4, +++ "originalColumn": 2, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 47, +++ "originalLine": 4, +++ "originalColumn": 9, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 49, +++ "originalLine": 5, +++ "originalColumn": 0, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 50, +++ "originalLine": 6, +++ "originalColumn": 0, +++ "mappedName": "foo" +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 56, +++ "originalLine": 7, +++ "originalColumn": 0, +++ "mappedName": "bar" +++ } +++ ] +++ }, +++ { +++ "name": "indexMapWithTwoConcatenatedSources", +++ "description": "Test an index map that has two sub-maps for concatenated sources", +++ "baseFile": "index-map-two-concatenated-sources.js", +++ "sourceMapFile": "index-map-two-concatenated-sources.js.map", +++ "sourceMapIsValid": true, +++ "testActions": [ +++ { +++ "actionType": "checkMapping", +++ "generatedLine": 0, +++ "generatedColumn": 0, +++ "originalSource": "basic-mapping-original.js", +++ "originalLine": 0, +++ "originalColumn": 0, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "generatedLine": 0, +++ "generatedColumn": 9, +++ "originalSource": "basic-mapping-original.js", +++ "originalLine": 0, +++ "originalColumn": 9, +++ "mappedName": "foo" +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 15, +++ "originalLine": 1, +++ "originalColumn": 2, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 22, +++ "originalLine": 1, +++ "originalColumn": 9, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 24, +++ "originalLine": 2, +++ "originalColumn": 0, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 25, +++ "originalLine": 3, +++ "originalColumn": 0, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "generatedLine": 0, +++ "generatedColumn": 34, +++ "originalSource": "basic-mapping-original.js", +++ "originalLine": 3, +++ "originalColumn": 9, +++ "mappedName": "bar" +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 40, +++ "originalLine": 4, +++ "originalColumn": 2, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 47, +++ "originalLine": 4, +++ "originalColumn": 9, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 49, +++ "originalLine": 5, +++ "originalColumn": 0, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 50, +++ "originalLine": 6, +++ "originalColumn": 0, +++ "mappedName": "foo" +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 56, +++ "originalLine": 7, +++ "originalColumn": 0, +++ "mappedName": "bar" +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "second-source-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 62, +++ "originalLine": 0, +++ "originalColumn": 0, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "second-source-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 71, +++ "originalLine": 0, +++ "originalColumn": 9, +++ "mappedName": "baz" +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "second-source-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 77, +++ "originalLine": 1, +++ "originalColumn": 2, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "second-source-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 83, +++ "originalLine": 1, +++ "originalColumn": 9, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "second-source-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 88, +++ "originalLine": 2, +++ "originalColumn": 0, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "second-source-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 89, +++ "originalLine": 3, +++ "originalColumn": 0, +++ "mappedName": "baz" +++ } +++ ] +++ }, +++ { +++ "name": "sourcesNullSourcesContentNonNull", +++ "description": "Test a source map that has a null source but has a sourcesContent", +++ "baseFile": "sources-null-sources-content-non-null.js", +++ "sourceMapFile": "sources-null-sources-content-non-null.js.map", +++ "sourceMapIsValid": true, +++ "testActions": [ +++ { +++ "actionType": "checkMapping", +++ "generatedLine": 0, +++ "generatedColumn": 0, +++ "originalSource": null, +++ "originalLine": 0, +++ "originalColumn": 0, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "generatedLine": 0, +++ "generatedColumn": 9, +++ "originalSource": null, +++ "originalLine": 0, +++ "originalColumn": 9, +++ "mappedName": "foo" +++ } +++ ] +++ }, +++ { +++ "name": "sourcesNonNullSourcesContentNull", +++ "description": "Test a source map that has a non-null source but has a null sourcesContent", +++ "baseFile": "sources-non-null-sources-content-null.js", +++ "sourceMapFile": "sources-non-null-sources-content-null.js.map", +++ "sourceMapIsValid": true, +++ "testActions": [ +++ { +++ "actionType": "checkMapping", +++ "generatedLine": 0, +++ "generatedColumn": 0, +++ "originalSource": "basic-mapping-original.js", +++ "originalLine": 0, +++ "originalColumn": 0, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "generatedLine": 0, +++ "generatedColumn": 9, +++ "originalSource": "basic-mapping-original.js", +++ "originalLine": 0, +++ "originalColumn": 9, +++ "mappedName": "foo" +++ } +++ ] +++ }, +++ { +++ "name": "transitiveMapping", +++ "description": "Test a simple two-stage transitive mapping from a minified JS to a TypeScript source", +++ "baseFile": "transitive-mapping.js", +++ "sourceMapFile": "transitive-mapping.js.map", +++ "sourceMapIsValid": true, +++ "testActions": [ +++ { +++ "actionType": "checkMappingTransitive", +++ "generatedLine": 0, +++ "generatedColumn": 0, +++ "originalSource": "typescript-original.ts", +++ "intermediateMaps": ["transitive-mapping-original.js.map"], +++ "originalLine": 1, +++ "originalColumn": 0, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMappingTransitive", +++ "generatedLine": 0, +++ "generatedColumn": 9, +++ "originalSource": "typescript-original.ts", +++ "intermediateMaps": ["transitive-mapping-original.js.map"], +++ "originalLine": 1, +++ "originalColumn": 9, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMappingTransitive", +++ "generatedLine": 0, +++ "generatedColumn": 13, +++ "originalSource": "typescript-original.ts", +++ "intermediateMaps": ["transitive-mapping-original.js.map"], +++ "originalLine": 1, +++ "originalColumn": 13, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMappingTransitive", +++ "generatedLine": 0, +++ "generatedColumn": 16, +++ "originalSource": "typescript-original.ts", +++ "intermediateMaps": ["transitive-mapping-original.js.map"], +++ "originalLine": 2, +++ "originalColumn": 2, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMappingTransitive", +++ "generatedLine": 0, +++ "generatedColumn": 23, +++ "originalSource": "typescript-original.ts", +++ "intermediateMaps": ["transitive-mapping-original.js.map"], +++ "originalLine": 2, +++ "originalColumn": 9, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMappingTransitive", +++ "generatedLine": 0, +++ "generatedColumn": 24, +++ "originalSource": "typescript-original.ts", +++ "intermediateMaps": ["transitive-mapping-original.js.map"], +++ "originalLine": 3, +++ "originalColumn": 0, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMappingTransitive", +++ "generatedLine": 0, +++ "generatedColumn": 25, +++ "originalSource": "typescript-original.ts", +++ "intermediateMaps": ["transitive-mapping-original.js.map"], +++ "originalLine": 4, +++ "originalColumn": 0, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMappingTransitive", +++ "generatedLine": 0, +++ "generatedColumn": 29, +++ "originalSource": "typescript-original.ts", +++ "intermediateMaps": ["transitive-mapping-original.js.map"], +++ "originalLine": 4, +++ "originalColumn": 4, +++ "mappedName": null +++ } +++ ] +++ }, +++ { +++ "name": "transitiveMappingWithThreeSteps", +++ "description": "Test a three-stage transitive mapping from an un-minified JS to minified JS to a TypeScript source", +++ "baseFile": "transitive-mapping-three-steps.js", +++ "sourceMapFile": "transitive-mapping-three-steps.js.map", +++ "sourceMapIsValid": true, +++ "testActions": [ +++ { +++ "actionType": "checkMappingTransitive", +++ "generatedLine": 0, +++ "generatedColumn": 0, +++ "originalSource": "typescript-original.ts", +++ "intermediateMaps": ["transitive-mapping.js.map", "transitive-mapping-original.js.map"], +++ "originalLine": 1, +++ "originalColumn": 0, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMappingTransitive", +++ "generatedLine": 0, +++ "generatedColumn": 9, +++ "originalSource": "typescript-original.ts", +++ "intermediateMaps": ["transitive-mapping.js.map", "transitive-mapping-original.js.map"], +++ "originalLine": 1, +++ "originalColumn": 9, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMappingTransitive", +++ "generatedLine": 0, +++ "generatedColumn": 13, +++ "originalSource": "typescript-original.ts", +++ "intermediateMaps": ["transitive-mapping.js.map", "transitive-mapping-original.js.map"], +++ "originalLine": 1, +++ "originalColumn": 13, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMappingTransitive", +++ "generatedLine": 1, +++ "generatedColumn": 4, +++ "originalSource": "typescript-original.ts", +++ "intermediateMaps": ["transitive-mapping.js.map", "transitive-mapping-original.js.map"], +++ "originalLine": 2, +++ "originalColumn": 2, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMappingTransitive", +++ "generatedLine": 1, +++ "generatedColumn": 11, +++ "originalSource": "typescript-original.ts", +++ "intermediateMaps": ["transitive-mapping.js.map", "transitive-mapping-original.js.map"], +++ "originalLine": 2, +++ "originalColumn": 9, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMappingTransitive", +++ "generatedLine": 2, +++ "generatedColumn": 0, +++ "originalSource": "typescript-original.ts", +++ "intermediateMaps": ["transitive-mapping.js.map", "transitive-mapping-original.js.map"], +++ "originalLine": 3, +++ "originalColumn": 0, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMappingTransitive", +++ "generatedLine": 4, +++ "generatedColumn": 0, +++ "originalSource": "typescript-original.ts", +++ "intermediateMaps": ["transitive-mapping.js.map", "transitive-mapping-original.js.map"], +++ "originalLine": 4, +++ "originalColumn": 0, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMappingTransitive", +++ "generatedLine": 4, +++ "generatedColumn": 4, +++ "originalSource": "typescript-original.ts", +++ "intermediateMaps": ["transitive-mapping.js.map", "transitive-mapping-original.js.map"], +++ "originalLine": 4, +++ "originalColumn": 4, +++ "mappedName": null +++ } +++ ] +++ }, +++ { +++ "name": "vlqValidSingleDigit", +++ "description": "Test VLQ decoding for a single digit, no continuation VLQ", +++ "baseFile": "vlq-valid-single-digit.js", +++ "sourceMapFile": "vlq-valid-single-digit.js.map", +++ "sourceMapIsValid": true, +++ "testActions": [ +++ { +++ "actionType": "checkMapping", +++ "generatedLine": 0, +++ "generatedColumn": 15, +++ "originalSource": "vlq-valid-single-digit-original.js", +++ "originalLine": 0, +++ "originalColumn": 0, +++ "mappedName": null +++ } +++ ] +++ }, +++ { +++ "name": "vlqValidNegativeDigit", +++ "description": "Test VLQ decoding where there's a negative digit, no continuation bit", +++ "baseFile": "vlq-valid-negative-digit.js", +++ "sourceMapFile": "vlq-valid-negative-digit.js.map", +++ "sourceMapIsValid": true, +++ "testActions": [ +++ { +++ "actionType": "checkMapping", +++ "generatedLine": 2, +++ "generatedColumn": 15, +++ "originalSource": "vlq-valid-negative-digit-original.js", +++ "originalLine": 1, +++ "originalColumn": 2, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "generatedLine": 2, +++ "generatedColumn": 2, +++ "originalSource": "vlq-valid-negative-digit-original.js", +++ "originalLine": 1, +++ "originalColumn": 1, +++ "mappedName": null +++ } +++ ] +++ }, +++ { +++ "name": "vlqValidContinuationBitPresent1", +++ "description": "Test VLQ decoding where continuation bits are present (continuations are leading zero)", +++ "baseFile": "vlq-valid-continuation-bit-present-1.js", +++ "sourceMapFile": "vlq-valid-continuation-bit-present-1.js.map", +++ "sourceMapIsValid": true, +++ "testActions": [ +++ { +++ "actionType": "checkMapping", +++ "generatedLine": 0, +++ "generatedColumn": 15, +++ "originalSource": "vlq-valid-continuation-bit-present-1-original.js", +++ "originalLine": 0, +++ "originalColumn": 1, +++ "mappedName": null +++ } +++ ] +++ }, +++ { +++ "name": "vlqValidContinuationBitPresent2", +++ "description": "Test VLQ decoding where continuation bits are present (continuations have non-zero bits)", +++ "baseFile": "vlq-valid-continuation-bit-present-2.js", +++ "sourceMapFile": "vlq-valid-continuation-bit-present-2.js.map", +++ "sourceMapIsValid": true, +++ "testActions": [ +++ { +++ "actionType": "checkMapping", +++ "generatedLine": 2, +++ "generatedColumn": 16, +++ "originalSource": "vlq-valid-continuation-bit-present-2-original.js", +++ "originalLine": 1, +++ "originalColumn": 1, +++ "mappedName": null +++ } +++ ] +++ }, +++ { +++ "name": "mappingSemanticsSingleFieldSegment", +++ "description": "Test mapping semantics for a single field segment mapping", +++ "baseFile": "mapping-semantics-single-field-segment.js", +++ "sourceMapFile": "mapping-semantics-single-field-segment.js.map", +++ "sourceMapIsValid": true, +++ "testActions": [ +++ { +++ "actionType": "checkMapping", +++ "generatedLine": 0, +++ "generatedColumn": 0, +++ "originalSource": "mapping-semantics-single-field-segment-original.js", +++ "originalLine": 0, +++ "originalColumn": 1, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "generatedLine": 0, +++ "generatedColumn": 2, +++ "originalSource": null, +++ "originalLine": null, +++ "originalColumn": null, +++ "mappedName": null +++ } +++ ] +++ }, +++ { +++ "name": "mappingSemanticsFourFieldSegment", +++ "description": "Test mapping semantics for a four field segment mapping", +++ "baseFile": "mapping-semantics-four-field-segment.js", +++ "sourceMapFile": "mapping-semantics-four-field-segment.js.map", +++ "sourceMapIsValid": true, +++ "testActions": [ +++ { +++ "actionType": "checkMapping", +++ "generatedLine": 0, +++ "generatedColumn": 1, +++ "originalSource": "mapping-semantics-four-field-segment-original.js", +++ "originalLine": 2, +++ "originalColumn": 2, +++ "mappedName": null +++ } +++ ] +++ }, +++ { +++ "name": "mappingSemanticsFiveFieldSegment", +++ "description": "Test mapping semantics for a five field segment mapping", +++ "baseFile": "mapping-semantics-five-field-segment.js", +++ "sourceMapFile": "mapping-semantics-five-field-segment.js.map", +++ "sourceMapIsValid": true, +++ "testActions": [ +++ { +++ "actionType": "checkMapping", +++ "generatedLine": 0, +++ "generatedColumn": 1, +++ "originalSource": "mapping-semantics-five-field-segment-original.js", +++ "originalLine": 2, +++ "originalColumn": 2, +++ "mappedName": "foo" +++ } +++ ] +++ }, +++ { +++ "name": "mappingSemanticsColumnReset", +++ "description": "Test that the generated column field resets to zero on new lines", +++ "baseFile": "mapping-semantics-column-reset.js", +++ "sourceMapFile": "mapping-semantics-column-reset.js.map", +++ "sourceMapIsValid": true, +++ "testActions": [ +++ { +++ "actionType": "checkMapping", +++ "generatedLine": 0, +++ "generatedColumn": 1, +++ "originalSource": "mapping-semantics-column-reset-original.js", +++ "originalLine": 0, +++ "originalColumn": 0, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "generatedLine": 1, +++ "generatedColumn": 1, +++ "originalSource": "mapping-semantics-column-reset-original.js", +++ "originalLine": 1, +++ "originalColumn": 0, +++ "mappedName": null +++ } +++ ] +++ }, +++ { +++ "name": "mappingSemanticsRelative1", +++ "description": "Test that fields are calculated relative to previous ones", +++ "baseFile": "mapping-semantics-relative-1.js", +++ "sourceMapFile": "mapping-semantics-relative-1.js.map", +++ "sourceMapIsValid": true, +++ "testActions": [ +++ { +++ "actionType": "checkMapping", +++ "generatedLine": 0, +++ "generatedColumn": 1, +++ "originalSource": "mapping-semantics-relative-1-original.js", +++ "originalLine": 0, +++ "originalColumn": 0, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "generatedLine": 0, +++ "generatedColumn": 5, +++ "originalSource": "mapping-semantics-relative-1-original.js", +++ "originalLine": 0, +++ "originalColumn": 4, +++ "mappedName": null +++ } +++ ] +++ }, +++ { +++ "name": "mappingSemanticsRelative2", +++ "description": "Test that fields are calculated relative to previous ones, across lines", +++ "baseFile": "mapping-semantics-relative-2.js", +++ "sourceMapFile": "mapping-semantics-relative-2.js.map", +++ "sourceMapIsValid": true, +++ "testActions": [ +++ { +++ "actionType": "checkMapping", +++ "generatedLine": 0, +++ "generatedColumn": 1, +++ "originalSource": "mapping-semantics-relative-2-original.js", +++ "originalLine": 0, +++ "originalColumn": 2, +++ "mappedName": "foo" +++ }, +++ { +++ "actionType": "checkMapping", +++ "generatedLine": 1, +++ "generatedColumn": 2, +++ "originalSource": "mapping-semantics-relative-2-original.js", +++ "originalLine": 1, +++ "originalColumn": 2, +++ "mappedName": "bar" +++ } +++ ] +++ } +++ ] +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/sources-and-sources-content-both-null.js b/front_end/core/sdk/fixtures/sourcemaps/sources-and-sources-content-both-null.js ++new file mode 100644 ++index 0000000000..9263eba549 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/sources-and-sources-content-both-null.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=sources-and-sources-content-both-null.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/sources-and-sources-content-both-null.js.map b/front_end/core/sdk/fixtures/sourcemaps/sources-and-sources-content-both-null.js.map ++new file mode 100644 ++index 0000000000..09a7c1f369 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/sources-and-sources-content-both-null.js.map ++@@ -0,0 +1,7 @@ +++{ +++ "version": 3, +++ "names": ["foo"], +++ "sources": [null], +++ "sourcesContent": [null], +++ "mappings":"AAAA,SAASA" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/sources-missing.js b/front_end/core/sdk/fixtures/sourcemaps/sources-missing.js ++new file mode 100644 ++index 0000000000..779b865e27 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/sources-missing.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=sources-missing.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/sources-missing.js.map b/front_end/core/sdk/fixtures/sourcemaps/sources-missing.js.map ++new file mode 100644 ++index 0000000000..92aff4fb0e ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/sources-missing.js.map ++@@ -0,0 +1,5 @@ +++{ +++ "version" : 3, +++ "names": ["foo"], +++ "mappings": "" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/sources-non-null-sources-content-null.js b/front_end/core/sdk/fixtures/sourcemaps/sources-non-null-sources-content-null.js ++new file mode 100644 ++index 0000000000..939b568ba1 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/sources-non-null-sources-content-null.js ++@@ -0,0 +1,2 @@ +++function foo(){return 42}function bar(){return 24}foo();bar(); +++//# sourceMappingURL=sources-non-null-sources-content-null.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/sources-non-null-sources-content-null.js.map b/front_end/core/sdk/fixtures/sourcemaps/sources-non-null-sources-content-null.js.map ++new file mode 100644 ++index 0000000000..e573906b2d ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/sources-non-null-sources-content-null.js.map ++@@ -0,0 +1,7 @@ +++{ +++ "version": 3, +++ "names": ["foo"], +++ "sources": ["basic-mapping-original.js"], +++ "sourcesContent": [null], +++ "mappings":"AAAA,SAASA" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/sources-not-a-list-1.js b/front_end/core/sdk/fixtures/sourcemaps/sources-not-a-list-1.js ++new file mode 100644 ++index 0000000000..7e33b7e867 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/sources-not-a-list-1.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=sources-not-a-list-1.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/sources-not-a-list-1.js.map b/front_end/core/sdk/fixtures/sourcemaps/sources-not-a-list-1.js.map ++new file mode 100644 ++index 0000000000..26330517b9 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/sources-not-a-list-1.js.map ++@@ -0,0 +1,6 @@ +++{ +++ "version" : 3, +++ "sources": "not a list", +++ "names": ["foo"], +++ "mappings": "AAAAA" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/sources-not-a-list-2.js b/front_end/core/sdk/fixtures/sourcemaps/sources-not-a-list-2.js ++new file mode 100644 ++index 0000000000..4021f763fc ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/sources-not-a-list-2.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=sources-not-a-list-2.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/sources-not-a-list-2.js.map b/front_end/core/sdk/fixtures/sourcemaps/sources-not-a-list-2.js.map ++new file mode 100644 ++index 0000000000..2ed85962fd ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/sources-not-a-list-2.js.map ++@@ -0,0 +1,6 @@ +++{ +++ "version" : 3, +++ "sources": { "source.js": 3 }, +++ "names": ["foo"], +++ "mappings": "AAAAA" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/sources-not-string-or-null.js b/front_end/core/sdk/fixtures/sourcemaps/sources-not-string-or-null.js ++new file mode 100644 ++index 0000000000..7dca97a1da ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/sources-not-string-or-null.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=sources-not-string-or-null.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/sources-not-string-or-null.js.map b/front_end/core/sdk/fixtures/sourcemaps/sources-not-string-or-null.js.map ++new file mode 100644 ++index 0000000000..db25561966 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/sources-not-string-or-null.js.map ++@@ -0,0 +1,6 @@ +++{ +++ "version" : 3, +++ "sources": [3, {}, true, false, []], +++ "names": ["foo"], +++ "mappings": "AAAAA" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/sources-null-sources-content-non-null.js b/front_end/core/sdk/fixtures/sourcemaps/sources-null-sources-content-non-null.js ++new file mode 100644 ++index 0000000000..a760594ee9 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/sources-null-sources-content-non-null.js ++@@ -0,0 +1,2 @@ +++function foo(){return 42}function bar(){return 24}foo();bar(); +++//# sourceMappingURL=sources-null-sources-content-non-null.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/sources-null-sources-content-non-null.js.map b/front_end/core/sdk/fixtures/sourcemaps/sources-null-sources-content-non-null.js.map ++new file mode 100644 ++index 0000000000..43af03903f ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/sources-null-sources-content-non-null.js.map ++@@ -0,0 +1,7 @@ +++{ +++ "version":3, +++ "names": ["foo"], +++ "sources": [null], +++ "sourcesContent": ["function foo()\n{ return 42; }\nfunction bar()\n { return 24; }\nfoo();\nbar();"], +++ "mappings":"AAAA,SAASA" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/transitive-mapping-original.js b/front_end/core/sdk/fixtures/sourcemaps/transitive-mapping-original.js ++new file mode 100644 ++index 0000000000..0a96699d6e ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/transitive-mapping-original.js ++@@ -0,0 +1,5 @@ +++function foo(x) { +++ return x; +++} +++foo("foo"); +++//# sourceMappingURL=transitive-mapping-original.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/transitive-mapping-original.js.map b/front_end/core/sdk/fixtures/sourcemaps/transitive-mapping-original.js.map ++new file mode 100644 ++index 0000000000..65af25c1eb ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/transitive-mapping-original.js.map ++@@ -0,0 +1,8 @@ +++{ +++ "version": 3, +++ "file" : "transitive-mapping-original.js", +++ "sourceRoot": "", +++ "sources": ["typescript-original.ts"], +++ "names": [], +++ "mappings": "AACA,SAAS,GAAG,CAAC,CAAU;IACrB,OAAO,CAAC,CAAC;AACX,CAAC;AACD,GAAG,CAAC,KAAK,CAAC,CAAC" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/transitive-mapping-three-steps.js b/front_end/core/sdk/fixtures/sourcemaps/transitive-mapping-three-steps.js ++new file mode 100644 ++index 0000000000..fd956164d3 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/transitive-mapping-three-steps.js ++@@ -0,0 +1,6 @@ +++function foo(x) { +++ return x; +++} +++ +++foo("foo"); +++//# sourceMappingURL=transitive-mapping-three-steps.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/transitive-mapping-three-steps.js.map b/front_end/core/sdk/fixtures/sourcemaps/transitive-mapping-three-steps.js.map ++new file mode 100644 ++index 0000000000..90459d90f6 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/transitive-mapping-three-steps.js.map ++@@ -0,0 +1,7 @@ +++{ +++ "version": 3, +++ "file": "transitive-mapping-three-steps.js", +++ "sources": ["transitive-mapping.js"], +++ "names": ["foo", "x"], +++ "mappings": "AAAA,SAASA,IAAIC;IAAG,OAAOA;AAAC;;AAACD,IAAI,KAAK" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/transitive-mapping.js b/front_end/core/sdk/fixtures/sourcemaps/transitive-mapping.js ++new file mode 100644 ++index 0000000000..183c027f1b ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/transitive-mapping.js ++@@ -0,0 +1,2 @@ +++function foo(x){return x}foo("foo"); +++//# sourceMappingURL=transitive-mapping.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/transitive-mapping.js.map b/front_end/core/sdk/fixtures/sourcemaps/transitive-mapping.js.map ++new file mode 100644 ++index 0000000000..d6a6fa6672 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/transitive-mapping.js.map ++@@ -0,0 +1,6 @@ +++{ +++ "version": 3, +++ "names": ["foo","x"], +++ "sources": ["transitive-mapping-original.js"], +++ "mappings":"AAAA,SAASA,IAAIC,GACT,OAAOA,CACX,CACAD,IAAI" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/typescript-original.ts b/front_end/core/sdk/fixtures/sourcemaps/typescript-original.ts ++new file mode 100644 ++index 0000000000..cd51c01ba1 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/typescript-original.ts ++@@ -0,0 +1,5 @@ +++type FooArg = string | number; +++function foo(x : FooArg) { +++ return x; +++} +++foo("foo"); ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/unrecognized-property.js b/front_end/core/sdk/fixtures/sourcemaps/unrecognized-property.js ++new file mode 100644 ++index 0000000000..19dfb0e2e6 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/unrecognized-property.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=unrecognized-property.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/unrecognized-property.js.map b/front_end/core/sdk/fixtures/sourcemaps/unrecognized-property.js.map ++new file mode 100644 ++index 0000000000..40bee558a4 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/unrecognized-property.js.map ++@@ -0,0 +1,8 @@ +++{ +++ "version" : 3, +++ "sources": [], +++ "names": [], +++ "mappings": "", +++ "foobar": 42, +++ "unusedProperty": [1, 2, 3, 4] +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-boundary-values.js b/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-boundary-values.js ++new file mode 100644 ++index 0000000000..3c49709e05 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-boundary-values.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=valid-mapping-boundary-values.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-boundary-values.js.map b/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-boundary-values.js.map ++new file mode 100644 ++index 0000000000..4dd836e63d ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-boundary-values.js.map ++@@ -0,0 +1,7 @@ +++{ +++ "version": 3, +++ "names": ["foo"], +++ "file": "valid-mapping-boundary-values.js", +++ "sources": ["empty-original.js"], +++ "mappings": "+/////DA+/////D+/////DA" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-empty-groups.js b/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-empty-groups.js ++new file mode 100644 ++index 0000000000..a2b767b619 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-empty-groups.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=valid-mapping-empty-groups.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-empty-groups.js.map b/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-empty-groups.js.map ++new file mode 100644 ++index 0000000000..643c9ae784 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-empty-groups.js.map ++@@ -0,0 +1,8 @@ +++{ +++ "version": 3, +++ "names": [], +++ "file": "valid-mapping-empty-groups.js", +++ "sources": ["empty-original.js"], +++ "sourcesContent": [""], +++ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-large-vlq.js b/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-large-vlq.js ++new file mode 100644 ++index 0000000000..b0cd897813 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-large-vlq.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=valid-mapping-large-vlq.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-large-vlq.js.map b/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-large-vlq.js.map ++new file mode 100644 ++index 0000000000..76e18704c4 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-large-vlq.js.map ++@@ -0,0 +1,6 @@ +++{ +++ "version": 3, +++ "names": [], +++ "sources": ["valid-mapping-large-vlq.js"], +++ "mappings": "igggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggA" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-null-sources.js b/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-null-sources.js ++new file mode 100644 ++index 0000000000..ee2acf0f5b ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-null-sources.js ++@@ -0,0 +1,2 @@ +++function foo(){return 42}function bar(){return 24}foo();bar(); +++//# sourceMappingURL=valid-mapping-null-sources.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-null-sources.js.map b/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-null-sources.js.map ++new file mode 100644 ++index 0000000000..199cda9369 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/valid-mapping-null-sources.js.map ++@@ -0,0 +1,6 @@ +++{ +++ "version":3, +++ "names": ["foo"], +++ "sources": [null], +++ "mappings":"AAAA,SAASA" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/version-missing.js b/front_end/core/sdk/fixtures/sourcemaps/version-missing.js ++new file mode 100644 ++index 0000000000..c32d1f1a1c ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/version-missing.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=version-missing.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/version-missing.js.map b/front_end/core/sdk/fixtures/sourcemaps/version-missing.js.map ++new file mode 100644 ++index 0000000000..49d8ce766e ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/version-missing.js.map ++@@ -0,0 +1,5 @@ +++{ +++ "sources": [], +++ "names": [], +++ "mappings": "" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/version-not-a-number.js b/front_end/core/sdk/fixtures/sourcemaps/version-not-a-number.js ++new file mode 100644 ++index 0000000000..ae2342e2ff ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/version-not-a-number.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=version-not-a-number.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/version-not-a-number.js.map b/front_end/core/sdk/fixtures/sourcemaps/version-not-a-number.js.map ++new file mode 100644 ++index 0000000000..a584d6e695 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/version-not-a-number.js.map ++@@ -0,0 +1,6 @@ +++{ +++ "version" : "3foo", +++ "sources": [], +++ "names": [], +++ "mappings": "" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/version-numeric-string.js b/front_end/core/sdk/fixtures/sourcemaps/version-numeric-string.js ++new file mode 100644 ++index 0000000000..a55170885d ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/version-numeric-string.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=version-numeric-string.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/version-numeric-string.js.map b/front_end/core/sdk/fixtures/sourcemaps/version-numeric-string.js.map ++new file mode 100644 ++index 0000000000..dbe52a7d0d ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/version-numeric-string.js.map ++@@ -0,0 +1,6 @@ +++{ +++ "version" : "3", +++ "sources": [], +++ "names": [], +++ "mappings": "" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/version-too-high.js b/front_end/core/sdk/fixtures/sourcemaps/version-too-high.js ++new file mode 100644 ++index 0000000000..55f4e1a298 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/version-too-high.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=version-too-high.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/version-too-high.js.map b/front_end/core/sdk/fixtures/sourcemaps/version-too-high.js.map ++new file mode 100644 ++index 0000000000..ee23be32ff ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/version-too-high.js.map ++@@ -0,0 +1,6 @@ +++{ +++ "version" : 4, +++ "sources": [], +++ "names": [], +++ "mappings": "" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/version-too-low.js b/front_end/core/sdk/fixtures/sourcemaps/version-too-low.js ++new file mode 100644 ++index 0000000000..d9642920b3 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/version-too-low.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=version-too-low.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/version-too-low.js.map b/front_end/core/sdk/fixtures/sourcemaps/version-too-low.js.map ++new file mode 100644 ++index 0000000000..64ca7a6e2e ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/version-too-low.js.map ++@@ -0,0 +1,6 @@ +++{ +++ "version" : 2, +++ "sources": [], +++ "names": [], +++ "mappings": "" +++} ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/version-valid.js b/front_end/core/sdk/fixtures/sourcemaps/version-valid.js ++new file mode 100644 ++index 0000000000..82d0bfa1eb ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/version-valid.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=version-valid.js.map ++diff --git a/front_end/core/sdk/fixtures/sourcemaps/version-valid.js.map b/front_end/core/sdk/fixtures/sourcemaps/version-valid.js.map ++new file mode 100644 ++index 0000000000..1a163052d8 ++--- /dev/null +++++ b/front_end/core/sdk/fixtures/sourcemaps/version-valid.js.map ++@@ -0,0 +1,6 @@ +++{ +++ "version" : 3, +++ "sources": [], +++ "names": [], +++ "mappings": "" +++} ++-- ++2.39.2 ++ +diff --git a/LayoutTests/imported/tg4/source-map-tests/chrome/0002-Add-reverse-mapping-code-to-test.patch b/LayoutTests/imported/tg4/source-map-tests/chrome/0002-Add-reverse-mapping-code-to-test.patch +new file mode 100644 +index 000000000000..dc08ba5fadb4 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/chrome/0002-Add-reverse-mapping-code-to-test.patch +@@ -0,0 +1,46 @@ ++From bebeda0b8133fc8f44382e59edda9203c980e8f3 Mon Sep 17 00:00:00 2001 ++From: Asumu Takikawa ++Date: Thu, 11 Jul 2024 16:44:29 -0700 ++Subject: [PATCH 2/2] Add reverse mapping code to test ++ ++--- ++ front_end/core/sdk/SourceMapSpec.test.ts | 16 +++++++++++++++- ++ 1 file changed, 15 insertions(+), 1 deletion(-) ++ ++diff --git a/front_end/core/sdk/SourceMapSpec.test.ts b/front_end/core/sdk/SourceMapSpec.test.ts ++index 93b26a2e13..402b82e4c0 100644 ++--- a/front_end/core/sdk/SourceMapSpec.test.ts +++++ b/front_end/core/sdk/SourceMapSpec.test.ts ++@@ -12,7 +12,6 @@ ++ ++ **/ ++ ++-const {assert} = chai; ++ import type * as Platform from '../platform/platform.js'; ++ import {assertNotNullOrUndefined} from '../platform/platform.js'; ++ import { SourceMapV3, parseSourceMap } from './SourceMap.js'; ++@@ -170,6 +169,21 @@ describeWithEnvironment('SourceMapSpec', () => { ++ assert.strictEqual(nullish(actual.sourceURL), originalSource, 'unexpected source URL'); ++ assert.strictEqual(nullish(actual.sourceLineNumber), originalLine, 'unexpected source line number'); ++ assert.strictEqual(nullish(actual.sourceColumnNumber), originalColumn, 'unexpected source column number'); +++ +++ if (originalSource != null) { +++ let reverseEntries = sourceMap.findReverseEntries( +++ originalSource as Platform.DevToolsPath.UrlString, +++ originalLine, +++ originalColumn +++ ); +++ +++ const anyEntryMatched = reverseEntries.some((entry) => { +++ return entry.sourceURL === originalSource && +++ entry.sourceLineNumber === originalLine && +++ entry.sourceColumnNumber === originalColumn; +++ }); +++ assert.isTrue(anyEntryMatched, `expected any matching reverse lookup entry, got none`); +++ } ++ } ++ }); ++ } ++-- ++2.39.2 ++ +diff --git a/LayoutTests/imported/tg4/source-map-tests/firefox/0001-WIP-Firefox-source-map-spec-tests.patch b/LayoutTests/imported/tg4/source-map-tests/firefox/0001-WIP-Firefox-source-map-spec-tests.patch +new file mode 100644 +index 000000000000..a9e256e02f8a +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/firefox/0001-WIP-Firefox-source-map-spec-tests.patch +@@ -0,0 +1,337 @@ ++From 8327515870d595ab04a111f6c37b84eab8a5010c Mon Sep 17 00:00:00 2001 ++From: Asumu Takikawa ++Date: Tue, 27 Feb 2024 18:22:45 -0800 ++Subject: [PATCH] WIP Firefox source map spec tests ++ ++--- ++ .../test/browser/browser.toml | 2 + ++ .../test/browser/browser_spec-source-map.js | 68 +++++++++++++++++++ ++ .../fixtures/basic-mapping-original.js | 8 +++ ++ .../test/browser/fixtures/basic-mapping.js | 1 + ++ .../browser/fixtures/basic-mapping.js.map | 6 ++ ++ .../fixtures/source-map-spec-tests.json | 60 ++++++++++++++++ ++ .../browser/fixtures/unrecognized-property.js | 1 + ++ .../fixtures/unrecognized-property.js.map | 8 +++ ++ .../browser/fixtures/version-not-a-number.js | 1 + ++ .../fixtures/version-not-a-number.js.map | 6 ++ ++ .../test/browser/fixtures/version-numbers.js | 6 ++ ++ .../test/browser/fixtures/version-too-high.js | 1 + ++ .../browser/fixtures/version-too-high.js.map | 6 ++ ++ .../test/browser/fixtures/version-too-low.js | 1 + ++ .../browser/fixtures/version-too-low.js.map | 6 ++ ++ .../test/browser/fixtures/version-valid.js | 1 + ++ .../browser/fixtures/version-valid.js.map | 6 ++ ++ 17 files changed, 188 insertions(+) ++ create mode 100644 devtools/client/shared/source-map-loader/test/browser/browser_spec-source-map.js ++ create mode 100644 devtools/client/shared/source-map-loader/test/browser/fixtures/basic-mapping-original.js ++ create mode 100644 devtools/client/shared/source-map-loader/test/browser/fixtures/basic-mapping.js ++ create mode 100644 devtools/client/shared/source-map-loader/test/browser/fixtures/basic-mapping.js.map ++ create mode 100644 devtools/client/shared/source-map-loader/test/browser/fixtures/source-map-spec-tests.json ++ create mode 100644 devtools/client/shared/source-map-loader/test/browser/fixtures/unrecognized-property.js ++ create mode 100644 devtools/client/shared/source-map-loader/test/browser/fixtures/unrecognized-property.js.map ++ create mode 100644 devtools/client/shared/source-map-loader/test/browser/fixtures/version-not-a-number.js ++ create mode 100644 devtools/client/shared/source-map-loader/test/browser/fixtures/version-not-a-number.js.map ++ create mode 100644 devtools/client/shared/source-map-loader/test/browser/fixtures/version-numbers.js ++ create mode 100644 devtools/client/shared/source-map-loader/test/browser/fixtures/version-too-high.js ++ create mode 100644 devtools/client/shared/source-map-loader/test/browser/fixtures/version-too-high.js.map ++ create mode 100644 devtools/client/shared/source-map-loader/test/browser/fixtures/version-too-low.js ++ create mode 100644 devtools/client/shared/source-map-loader/test/browser/fixtures/version-too-low.js.map ++ create mode 100644 devtools/client/shared/source-map-loader/test/browser/fixtures/version-valid.js ++ create mode 100644 devtools/client/shared/source-map-loader/test/browser/fixtures/version-valid.js.map ++ ++diff --git a/devtools/client/shared/source-map-loader/test/browser/browser.toml b/devtools/client/shared/source-map-loader/test/browser/browser.toml ++index 5a602e9eeb893..a670ab0acee89 100644 ++--- a/devtools/client/shared/source-map-loader/test/browser/browser.toml +++++ b/devtools/client/shared/source-map-loader/test/browser/browser.toml ++@@ -19,3 +19,5 @@ skip-if = [ ++ "http3", # Bug 1829298 ++ "http2", ++ ] +++ +++["browser_spec-source-map.js"] ++diff --git a/devtools/client/shared/source-map-loader/test/browser/browser_spec-source-map.js b/devtools/client/shared/source-map-loader/test/browser/browser_spec-source-map.js ++new file mode 100644 ++index 0000000000000..34695d6bd395b ++--- /dev/null +++++ b/devtools/client/shared/source-map-loader/test/browser/browser_spec-source-map.js ++@@ -0,0 +1,68 @@ +++"use strict"; +++ +++const { +++ generatedToOriginalId, +++} = require("resource://devtools/client/shared/source-map-loader/utils/index.js"); +++ +++async function isValidSourceMap(base) { +++ try { +++ await fetchFixtureSourceMap(base); +++ } catch (exn) { +++ return false; +++ } +++ return true; +++} +++ +++async function checkMapping(testCase, action) { +++ const originalId = generatedToOriginalId(testCase.baseFile, `${URL_ROOT_SSL}fixtures/${action.originalSource}`); +++ const generatedLoc = await gSourceMapLoader.getGeneratedLocation({ +++ sourceId: originalId, +++ line: action.originalLine + 1, +++ column: action.originalColumn, +++ }); +++ Assert.ok(generatedLoc !== null, "Location lookup should not return null"); +++ Assert.equal(testCase.baseFile, generatedLoc.sourceId); +++ Assert.equal(action.generatedLine + 1, generatedLoc.line); +++ Assert.equal(action.generatedColumn, generatedLoc.column); +++} +++ +++const SPEC_TESTS_URI = `${URL_ROOT_SSL}fixtures/source-map-spec-tests.json` +++const testDescriptions = JSON.parse(read(SPEC_TESTS_URI)); +++ +++for (const testCase of testDescriptions.tests) { +++ async function testFunction() { +++ const baseName = testCase.baseFile.substring(0, testCase.baseFile.indexOf(".js")); +++ Assert.equal(testCase.sourceMapIsValid, await isValidSourceMap(baseName)); +++ +++ if (testCase.testActions) { +++ for (const action of testCase.testActions) { +++ if (action.actionType === "checkMapping") +++ await checkMapping(testCase, action); +++ } +++ } +++ }; +++ Object.defineProperty(testFunction, "name", { value: testCase.name }); +++ add_task(testFunction); +++} +++ +++function read(srcChromeURL) { +++ const scriptableStream = Cc[ +++ "@mozilla.org/scriptableinputstream;1" +++ ].getService(Ci.nsIScriptableInputStream); +++ +++ const channel = NetUtil.newChannel({ +++ uri: srcChromeURL, +++ loadUsingSystemPrincipal: true, +++ }); +++ const input = channel.open(); +++ scriptableStream.init(input); +++ +++ let data = ""; +++ while (input.available()) { +++ data = data.concat(scriptableStream.read(input.available())); +++ } +++ scriptableStream.close(); +++ input.close(); +++ +++ return data; +++} ++diff --git a/devtools/client/shared/source-map-loader/test/browser/fixtures/basic-mapping-original.js b/devtools/client/shared/source-map-loader/test/browser/fixtures/basic-mapping-original.js ++new file mode 100644 ++index 0000000000000..301b186cb15e6 ++--- /dev/null +++++ b/devtools/client/shared/source-map-loader/test/browser/fixtures/basic-mapping-original.js ++@@ -0,0 +1,8 @@ +++function foo() { +++ return 42; +++} +++function bar() { +++ return 24; +++} +++foo(); +++bar(); ++diff --git a/devtools/client/shared/source-map-loader/test/browser/fixtures/basic-mapping.js b/devtools/client/shared/source-map-loader/test/browser/fixtures/basic-mapping.js ++new file mode 100644 ++index 0000000000000..9df72406be544 ++--- /dev/null +++++ b/devtools/client/shared/source-map-loader/test/browser/fixtures/basic-mapping.js ++@@ -0,0 +1 @@ +++function foo(){return 42}function bar(){return 24}foo();bar(); ++\ No newline at end of file ++diff --git a/devtools/client/shared/source-map-loader/test/browser/fixtures/basic-mapping.js.map b/devtools/client/shared/source-map-loader/test/browser/fixtures/basic-mapping.js.map ++new file mode 100644 ++index 0000000000000..12dc9679a4b1d ++--- /dev/null +++++ b/devtools/client/shared/source-map-loader/test/browser/fixtures/basic-mapping.js.map ++@@ -0,0 +1,6 @@ +++{ +++ "version":3, +++ "names": ["foo","bar"], +++ "sources": ["basic-mapping-original.js"], +++ "mappings":"AAAA,SAASA,MACP,OAAO,EACT,CACA,SAASC,MACP,OAAO,EACT,CACAD,MACAC" +++} ++diff --git a/devtools/client/shared/source-map-loader/test/browser/fixtures/source-map-spec-tests.json b/devtools/client/shared/source-map-loader/test/browser/fixtures/source-map-spec-tests.json ++new file mode 100644 ++index 0000000000000..16d8442811655 ++--- /dev/null +++++ b/devtools/client/shared/source-map-loader/test/browser/fixtures/source-map-spec-tests.json ++@@ -0,0 +1,60 @@ +++{ +++ "tests": [ +++ { +++ "name": "versionValid", +++ "baseFile": "version-valid.js", +++ "sourceMapFile": "version-valid.js.map", +++ "sourceMapIsValid": true +++ }, +++ { +++ "name": "versionNotANumber", +++ "baseFile": "version-not-a-number.js", +++ "sourceMapFile": "version-not-a-number.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "versionTooHigh", +++ "baseFile": "version-too-high.js", +++ "sourceMapFile": "version-too-high.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "versionTooLow", +++ "baseFile": "version-too-low.js", +++ "sourceMapFile": "version-too-low.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "unrecognizedProperty", +++ "baseFile": "unrecognized-property.js", +++ "sourceMapFile": "unrecognized-property.js.map", +++ "sourceMapIsValid": true +++ }, +++ { +++ "name": "basicMapping", +++ "baseFile": "basic-mapping.js", +++ "sourceMapFile": "basic-mapping.js.map", +++ "sourceMapIsValid": true, +++ "testActions": [ +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "originalLine": 0, +++ "originalColumn": 9, +++ "generatedLine": 0, +++ "generatedColumn": 9, +++ "mappedName": "foo" +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "originalLine": 3, +++ "originalColumn": 9, +++ "generatedLine": 0, +++ "generatedColumn": 34, +++ "mappedName": "bar" +++ } +++ ] +++ } +++ ] +++} ++diff --git a/devtools/client/shared/source-map-loader/test/browser/fixtures/unrecognized-property.js b/devtools/client/shared/source-map-loader/test/browser/fixtures/unrecognized-property.js ++new file mode 100644 ++index 0000000000000..47303d1fcf302 ++--- /dev/null +++++ b/devtools/client/shared/source-map-loader/test/browser/fixtures/unrecognized-property.js ++@@ -0,0 +1 @@ +++// # sourceMappingURL=unrecognized-property.js.map ++diff --git a/devtools/client/shared/source-map-loader/test/browser/fixtures/unrecognized-property.js.map b/devtools/client/shared/source-map-loader/test/browser/fixtures/unrecognized-property.js.map ++new file mode 100644 ++index 0000000000000..40bee558a4ff9 ++--- /dev/null +++++ b/devtools/client/shared/source-map-loader/test/browser/fixtures/unrecognized-property.js.map ++@@ -0,0 +1,8 @@ +++{ +++ "version" : 3, +++ "sources": [], +++ "names": [], +++ "mappings": "", +++ "foobar": 42, +++ "unusedProperty": [1, 2, 3, 4] +++} ++diff --git a/devtools/client/shared/source-map-loader/test/browser/fixtures/version-not-a-number.js b/devtools/client/shared/source-map-loader/test/browser/fixtures/version-not-a-number.js ++new file mode 100644 ++index 0000000000000..5382a716e3a21 ++--- /dev/null +++++ b/devtools/client/shared/source-map-loader/test/browser/fixtures/version-not-a-number.js ++@@ -0,0 +1 @@ +++// # sourceMappingURL=version-not-a-number.js.map ++diff --git a/devtools/client/shared/source-map-loader/test/browser/fixtures/version-not-a-number.js.map b/devtools/client/shared/source-map-loader/test/browser/fixtures/version-not-a-number.js.map ++new file mode 100644 ++index 0000000000000..a584d6e695117 ++--- /dev/null +++++ b/devtools/client/shared/source-map-loader/test/browser/fixtures/version-not-a-number.js.map ++@@ -0,0 +1,6 @@ +++{ +++ "version" : "3foo", +++ "sources": [], +++ "names": [], +++ "mappings": "" +++} ++diff --git a/devtools/client/shared/source-map-loader/test/browser/fixtures/version-numbers.js b/devtools/client/shared/source-map-loader/test/browser/fixtures/version-numbers.js ++new file mode 100644 ++index 0000000000000..e79993b659db6 ++--- /dev/null +++++ b/devtools/client/shared/source-map-loader/test/browser/fixtures/version-numbers.js ++@@ -0,0 +1,6 @@ +++// Test that invalid version numbers are rejected. +++ +++assert(isValidSourceMap("./version-valid.map")); +++assert(!isValidSourceMap("./version-not-a-number.map")); +++assert(!isValidSourceMap("./version-too-low.map")); +++assert(!isValidSourceMap("./version-too-high.map")); ++diff --git a/devtools/client/shared/source-map-loader/test/browser/fixtures/version-too-high.js b/devtools/client/shared/source-map-loader/test/browser/fixtures/version-too-high.js ++new file mode 100644 ++index 0000000000000..04bfe7f62b7b9 ++--- /dev/null +++++ b/devtools/client/shared/source-map-loader/test/browser/fixtures/version-too-high.js ++@@ -0,0 +1 @@ +++// # sourceMappingURL=version-too-high.js.map ++diff --git a/devtools/client/shared/source-map-loader/test/browser/fixtures/version-too-high.js.map b/devtools/client/shared/source-map-loader/test/browser/fixtures/version-too-high.js.map ++new file mode 100644 ++index 0000000000000..ee23be32ff278 ++--- /dev/null +++++ b/devtools/client/shared/source-map-loader/test/browser/fixtures/version-too-high.js.map ++@@ -0,0 +1,6 @@ +++{ +++ "version" : 4, +++ "sources": [], +++ "names": [], +++ "mappings": "" +++} ++diff --git a/devtools/client/shared/source-map-loader/test/browser/fixtures/version-too-low.js b/devtools/client/shared/source-map-loader/test/browser/fixtures/version-too-low.js ++new file mode 100644 ++index 0000000000000..54b3526c6b5e2 ++--- /dev/null +++++ b/devtools/client/shared/source-map-loader/test/browser/fixtures/version-too-low.js ++@@ -0,0 +1 @@ +++// # sourceMappingURL=version-too-low.js.map ++diff --git a/devtools/client/shared/source-map-loader/test/browser/fixtures/version-too-low.js.map b/devtools/client/shared/source-map-loader/test/browser/fixtures/version-too-low.js.map ++new file mode 100644 ++index 0000000000000..64ca7a6e2e928 ++--- /dev/null +++++ b/devtools/client/shared/source-map-loader/test/browser/fixtures/version-too-low.js.map ++@@ -0,0 +1,6 @@ +++{ +++ "version" : 2, +++ "sources": [], +++ "names": [], +++ "mappings": "" +++} ++diff --git a/devtools/client/shared/source-map-loader/test/browser/fixtures/version-valid.js b/devtools/client/shared/source-map-loader/test/browser/fixtures/version-valid.js ++new file mode 100644 ++index 0000000000000..f8541f9efdc71 ++--- /dev/null +++++ b/devtools/client/shared/source-map-loader/test/browser/fixtures/version-valid.js ++@@ -0,0 +1 @@ +++// # sourceMappingURL=version-valid.js.map ++diff --git a/devtools/client/shared/source-map-loader/test/browser/fixtures/version-valid.js.map b/devtools/client/shared/source-map-loader/test/browser/fixtures/version-valid.js.map ++new file mode 100644 ++index 0000000000000..1a163052d8fc8 ++--- /dev/null +++++ b/devtools/client/shared/source-map-loader/test/browser/fixtures/version-valid.js.map ++@@ -0,0 +1,6 @@ +++{ +++ "version" : 3, +++ "sources": [], +++ "names": [], +++ "mappings": "" +++} ++-- ++2.39.2 ++ +diff --git a/LayoutTests/imported/tg4/source-map-tests/firefox/browser_spec-source-map.js b/LayoutTests/imported/tg4/source-map-tests/firefox/browser_spec-source-map.js +new file mode 100644 +index 000000000000..af18e9bca51d +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/firefox/browser_spec-source-map.js +@@ -0,0 +1,71 @@ ++"use strict"; ++ ++const { ++ generatedToOriginalId, ++} = require("resource://devtools/client/shared/source-map-loader/utils/index.js"); ++ ++async function checkValidity(isValid, base, testCase) { ++ try { ++ await fetchFixtureSourceMap(base); ++ const originalId = generatedToOriginalId(testCase.baseFile, "unused"); ++ await gSourceMapLoader.getOriginalRanges(originalId); ++ } catch (exn) { ++ Assert.ok(!isValid, "Source map loading failed with " + exn.message); ++ return; ++ } ++ Assert.ok(isValid, "Source map loading should have failed but did not"); ++} ++ ++async function checkMapping(testCase, action) { ++ const originalId = generatedToOriginalId(testCase.baseFile, `${URL_ROOT_SSL}fixtures/${action.originalSource}`); ++ const generatedLoc = await gSourceMapLoader.getGeneratedLocation({ ++ sourceId: originalId, ++ line: action.originalLine + 1, ++ column: action.originalColumn, ++ }); ++ Assert.ok(generatedLoc !== null, "Location lookup should not return null"); ++ Assert.equal(testCase.baseFile, generatedLoc.sourceId); ++ Assert.equal(action.generatedLine + 1, generatedLoc.line); ++ Assert.equal(action.generatedColumn, generatedLoc.column); ++} ++ ++const SPEC_TESTS_URI = `${URL_ROOT_SSL}fixtures/source-map-spec-tests.json` ++const testDescriptions = JSON.parse(read(SPEC_TESTS_URI)); ++ ++for (const testCase of testDescriptions.tests) { ++ // The following uses a hack to ensure the test case name is used in stack traces. ++ const testFunction = {[testCase.name]: async function() { ++ const baseName = testCase.baseFile.substring(0, testCase.baseFile.indexOf(".js")); ++ await checkValidity(testCase.sourceMapIsValid, baseName, testCase); ++ ++ if (testCase.testActions) { ++ for (const action of testCase.testActions) { ++ if (action.actionType === "checkMapping") ++ await checkMapping(testCase, action); ++ } ++ } ++ }}[testCase.name]; ++ add_task(testFunction); ++} ++ ++function read(srcChromeURL) { ++ const scriptableStream = Cc[ ++ "@mozilla.org/scriptableinputstream;1" ++ ].getService(Ci.nsIScriptableInputStream); ++ ++ const channel = NetUtil.newChannel({ ++ uri: srcChromeURL, ++ loadUsingSystemPrincipal: true, ++ }); ++ const input = channel.open(); ++ scriptableStream.init(input); ++ ++ let data = ""; ++ while (input.available()) { ++ data = data.concat(scriptableStream.read(input.available())); ++ } ++ scriptableStream.close(); ++ input.close(); ++ ++ return data; ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/basic-mapping-as-index-map.js b/LayoutTests/imported/tg4/source-map-tests/resources/basic-mapping-as-index-map.js +new file mode 100644 +index 000000000000..b9fae380437d +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/basic-mapping-as-index-map.js +@@ -0,0 +1,2 @@ ++function foo(){return 42}function bar(){return 24}foo();bar(); ++//# sourceMappingURL=basic-mapping-as-index-map.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/basic-mapping-as-index-map.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/basic-mapping-as-index-map.js.map +new file mode 100644 +index 000000000000..c0ad870ed2ba +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/basic-mapping-as-index-map.js.map +@@ -0,0 +1,15 @@ ++{ ++ "version": 3, ++ "file": "basic-mapping-as-index-map.js", ++ "sections": [ ++ { ++ "offset": { "line": 0, "column": 0 }, ++ "map": { ++ "version": 3, ++ "names": ["foo","bar"], ++ "sources": ["basic-mapping-original.js"], ++ "mappings": "AAAA,SAASA,MACP,OAAO,EACT,CACA,SAASC,MACP,OAAO,EACT,CACAD,MACAC" ++ } ++ } ++ ] ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/basic-mapping-original.js b/LayoutTests/imported/tg4/source-map-tests/resources/basic-mapping-original.js +new file mode 100644 +index 000000000000..301b186cb15e +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/basic-mapping-original.js +@@ -0,0 +1,8 @@ ++function foo() { ++ return 42; ++} ++function bar() { ++ return 24; ++} ++foo(); ++bar(); +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/basic-mapping.js b/LayoutTests/imported/tg4/source-map-tests/resources/basic-mapping.js +new file mode 100644 +index 000000000000..2e479a4175b8 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/basic-mapping.js +@@ -0,0 +1,2 @@ ++function foo(){return 42}function bar(){return 24}foo();bar(); ++//# sourceMappingURL=basic-mapping.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/basic-mapping.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/basic-mapping.js.map +new file mode 100644 +index 000000000000..12dc9679a4b1 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/basic-mapping.js.map +@@ -0,0 +1,6 @@ ++{ ++ "version":3, ++ "names": ["foo","bar"], ++ "sources": ["basic-mapping-original.js"], ++ "mappings":"AAAA,SAASA,MACP,OAAO,EACT,CACA,SAASC,MACP,OAAO,EACT,CACAD,MACAC" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/file-not-a-string-1.js b/LayoutTests/imported/tg4/source-map-tests/resources/file-not-a-string-1.js +new file mode 100644 +index 000000000000..d049f870450a +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/file-not-a-string-1.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=file-not-a-string-1.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/file-not-a-string-1.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/file-not-a-string-1.js.map +new file mode 100644 +index 000000000000..85e973d881df +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/file-not-a-string-1.js.map +@@ -0,0 +1,8 @@ ++{ ++ "version" : 3, ++ "file": [], ++ "sources": ["empty-original.js"], ++ "sourcesContent": [""], ++ "names": [], ++ "mappings": "" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/file-not-a-string-2.js b/LayoutTests/imported/tg4/source-map-tests/resources/file-not-a-string-2.js +new file mode 100644 +index 000000000000..07b8152c0c6c +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/file-not-a-string-2.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=file-not-a-string-2.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/file-not-a-string-2.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/file-not-a-string-2.js.map +new file mode 100644 +index 000000000000..a5b6b1f9d94f +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/file-not-a-string-2.js.map +@@ -0,0 +1,8 @@ ++{ ++ "version" : 3, ++ "file": 235324, ++ "sources": ["empty-original.js"], ++ "sourcesContent": [""], ++ "names": [], ++ "mappings": "" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-empty.js b/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-empty.js +new file mode 100644 +index 000000000000..385a5c3501b2 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-empty.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=ignore-list-empty.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-empty.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-empty.js.map +new file mode 100644 +index 000000000000..7297863a9be8 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-empty.js.map +@@ -0,0 +1,8 @@ ++{ ++ "version" : 3, ++ "sources": ["empty-original.js"], ++ "sourcesContent": [""], ++ "mappings": "", ++ "names": [], ++ "ignoreList": [] ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-out-of-bounds-1.js b/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-out-of-bounds-1.js +new file mode 100644 +index 000000000000..567174a707ef +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-out-of-bounds-1.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=ignore-list-out-of-bounds-1.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-out-of-bounds-1.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-out-of-bounds-1.js.map +new file mode 100644 +index 000000000000..fb2566bb419b +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-out-of-bounds-1.js.map +@@ -0,0 +1,8 @@ ++{ ++ "version" : 3, ++ "sources": ["empty-original.js"], ++ "sourcesContent": [""], ++ "mappings": "", ++ "names": [], ++ "ignoreList": [1] ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-out-of-bounds-2.js b/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-out-of-bounds-2.js +new file mode 100644 +index 000000000000..4216d9a67315 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-out-of-bounds-2.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=ignore-list-out-of-bounds-2.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-out-of-bounds-2.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-out-of-bounds-2.js.map +new file mode 100644 +index 000000000000..41371a76a896 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-out-of-bounds-2.js.map +@@ -0,0 +1,8 @@ ++{ ++ "version" : 3, ++ "sources": ["empty-original.js"], ++ "sourcesContent": [""], ++ "mappings": "", ++ "names": [], ++ "ignoreList": [-1] ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-valid-1.js b/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-valid-1.js +new file mode 100644 +index 000000000000..ea64a5565a63 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-valid-1.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=ignore-list-valid-1.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-valid-1.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-valid-1.js.map +new file mode 100644 +index 000000000000..98eebdf7f655 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-valid-1.js.map +@@ -0,0 +1,8 @@ ++{ ++ "version" : 3, ++ "sources": ["empty-original.js"], ++ "sourcesContent": [""], ++ "mappings": "", ++ "names": [], ++ "ignoreList": [0] ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-wrong-type-1.js b/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-wrong-type-1.js +new file mode 100644 +index 000000000000..8b40bd384767 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-wrong-type-1.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=ignore-list-wrong-type-1.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-wrong-type-1.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-wrong-type-1.js.map +new file mode 100644 +index 000000000000..688740aba843 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-wrong-type-1.js.map +@@ -0,0 +1,8 @@ ++{ ++ "version" : 3, ++ "sources": ["empty-original.js"], ++ "sourcesContent": [""], ++ "mappings": "", ++ "names": [], ++ "ignoreList": ["not a number"] ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-wrong-type-2.js b/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-wrong-type-2.js +new file mode 100644 +index 000000000000..35c77911648e +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-wrong-type-2.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=ignore-list-wrong-type-2.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-wrong-type-2.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-wrong-type-2.js.map +new file mode 100644 +index 000000000000..ca1d30de2d36 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-wrong-type-2.js.map +@@ -0,0 +1,8 @@ ++{ ++ "version" : 3, ++ "sources": ["empty-original.js"], ++ "sourcesContent": [""], ++ "mappings": "", ++ "names": [], ++ "ignoreList": ["0"] ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-wrong-type-3.js b/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-wrong-type-3.js +new file mode 100644 +index 000000000000..8735d4175804 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-wrong-type-3.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=ignore-list-wrong-type-3.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-wrong-type-3.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-wrong-type-3.js.map +new file mode 100644 +index 000000000000..1ac167d56c4e +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-wrong-type-3.js.map +@@ -0,0 +1,8 @@ ++{ ++ "version" : 3, ++ "sources": ["empty-original.js"], ++ "sourcesContent": [""], ++ "mappings": "", ++ "names": [], ++ "ignoreList": 0 ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-wrong-type-4.js b/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-wrong-type-4.js +new file mode 100644 +index 000000000000..35db5acc432b +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-wrong-type-4.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=ignore-list-wrong-type-4.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-wrong-type-4.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-wrong-type-4.js.map +new file mode 100644 +index 000000000000..c1a27efe980d +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/ignore-list-wrong-type-4.js.map +@@ -0,0 +1,8 @@ ++{ ++ "version" : 3, ++ "sources": ["empty-original.js"], ++ "sourcesContent": [""], ++ "mappings": "", ++ "names": [], ++ "ignoreList": [0.5] ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/index-map-empty-sections.js b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-empty-sections.js +new file mode 100644 +index 000000000000..abe9f7f30816 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-empty-sections.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=index-map-empty-sections.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/index-map-empty-sections.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-empty-sections.js.map +new file mode 100644 +index 000000000000..f3efabbe00c3 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-empty-sections.js.map +@@ -0,0 +1,4 @@ ++{ ++ "version": 3, ++ "sections": [] ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/index-map-file-wrong-type-1.js b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-file-wrong-type-1.js +new file mode 100644 +index 000000000000..48bb12855bf5 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-file-wrong-type-1.js +@@ -0,0 +1,2 @@ ++function foo(){return 42}function bar(){return 24}foo();bar(); ++//# sourceMappingURL=index-map-file-wrong-type-1.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/index-map-file-wrong-type-1.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-file-wrong-type-1.js.map +new file mode 100644 +index 000000000000..dd39b5a2b13c +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-file-wrong-type-1.js.map +@@ -0,0 +1,15 @@ ++{ ++ "version": 3, ++ "file": [], ++ "sections": [ ++ { ++ "offset": { "line": 0, "column": 0 }, ++ "map": { ++ "version": 3, ++ "names": ["foo","bar"], ++ "sources": ["basic-mapping-original.js"], ++ "mappings": "AAAA,SAASA,MACP,OAAO,EACT,CACA,SAASC,MACP,OAAO,EACT,CACAD,MACAC" ++ } ++ } ++ ] ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/index-map-file-wrong-type-2.js b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-file-wrong-type-2.js +new file mode 100644 +index 000000000000..c002ba726a51 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-file-wrong-type-2.js +@@ -0,0 +1,2 @@ ++function foo(){return 42}function bar(){return 24}foo();bar(); ++//# sourceMappingURL=index-map-file-wrong-type-2.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/index-map-file-wrong-type-2.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-file-wrong-type-2.js.map +new file mode 100644 +index 000000000000..0ee0a406be8d +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-file-wrong-type-2.js.map +@@ -0,0 +1,15 @@ ++{ ++ "version": 3, ++ "file": 2345234234, ++ "sections": [ ++ { ++ "offset": { "line": 0, "column": 0 }, ++ "map": { ++ "version": 3, ++ "names": ["foo","bar"], ++ "sources": ["basic-mapping-original.js"], ++ "mappings": "AAAA,SAASA,MACP,OAAO,EACT,CACA,SAASC,MACP,OAAO,EACT,CACAD,MACAC" ++ } ++ } ++ ] ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/index-map-invalid-base-mappings.js b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-invalid-base-mappings.js +new file mode 100644 +index 000000000000..e90bef083c49 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-invalid-base-mappings.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=index-map-invalid-base-mappings.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/index-map-invalid-base-mappings.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-invalid-base-mappings.js.map +new file mode 100644 +index 000000000000..b489c1f080b1 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-invalid-base-mappings.js.map +@@ -0,0 +1,15 @@ ++{ ++ "version": 3, ++ "mappings": "AAAA", ++ "sections": [ ++ { ++ "offset": { "line": 0, "column": 0 }, ++ "map": { ++ "version": 3, ++ "names": [], ++ "sources": ["empty-original.js"], ++ "mappings": "AAAA" ++ } ++ } ++ ] ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/index-map-invalid-order.js b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-invalid-order.js +new file mode 100644 +index 000000000000..263fa3c6e0b9 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-invalid-order.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=index-map-invalid-order.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/index-map-invalid-order.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-invalid-order.js.map +new file mode 100644 +index 000000000000..82da69df720e +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-invalid-order.js.map +@@ -0,0 +1,23 @@ ++{ ++ "version": 3, ++ "sections": [ ++ { ++ "offset": { "line": 1, "column": 4 }, ++ "map": { ++ "version": 3, ++ "names": [], ++ "sources": ["empty-original.js"], ++ "mappings": "AAAA" ++ } ++ }, ++ { ++ "offset": { "line": 0, "column": 0 }, ++ "map": { ++ "version": 3, ++ "names": [], ++ "sources": ["empty-original.js"], ++ "mappings": "AAAA" ++ } ++ } ++ ] ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/index-map-invalid-overlap.js b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-invalid-overlap.js +new file mode 100644 +index 000000000000..9aff8dc6203a +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-invalid-overlap.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=index-map-invalid-overlap.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/index-map-invalid-overlap.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-invalid-overlap.js.map +new file mode 100644 +index 000000000000..8d42546fd899 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-invalid-overlap.js.map +@@ -0,0 +1,23 @@ ++{ ++ "version": 3, ++ "sections": [ ++ { ++ "offset": { "line": 0, "column": 0 }, ++ "map": { ++ "version": 3, ++ "names": [], ++ "sources": ["empty-original.js"], ++ "mappings": "AAAA" ++ } ++ }, ++ { ++ "offset": { "line": 0, "column": 0 }, ++ "map": { ++ "version": 3, ++ "names": [], ++ "sources": ["empty-original.js"], ++ "mappings": "AAAA" ++ } ++ } ++ ] ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/index-map-invalid-sub-map.js b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-invalid-sub-map.js +new file mode 100644 +index 000000000000..284e8d77e659 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-invalid-sub-map.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=index-map-invalid-sub-map.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/index-map-invalid-sub-map.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-invalid-sub-map.js.map +new file mode 100644 +index 000000000000..4020ae30c576 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-invalid-sub-map.js.map +@@ -0,0 +1,13 @@ ++{ ++ "version": 3, ++ "file": "index-map-invalid-sub-map.js", ++ "sections": [ ++ { ++ "offset": { "line": 0, "column": 0 }, ++ "map": { ++ "version": "3", ++ "mappings": 7 ++ } ++ } ++ ] ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-file.js b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-file.js +new file mode 100644 +index 000000000000..be2a93cb77cd +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-file.js +@@ -0,0 +1,2 @@ ++function foo(){return 42}function bar(){return 24}foo();bar(); ++//# sourceMappingURL=index-map-missing-file.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-file.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-file.js.map +new file mode 100644 +index 000000000000..8a6d4b5dc788 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-file.js.map +@@ -0,0 +1,14 @@ ++{ ++ "version": 3, ++ "sections": [ ++ { ++ "offset": { "line": 0, "column": 0 }, ++ "map": { ++ "version": 3, ++ "names": ["foo","bar"], ++ "sources": ["basic-mapping-original.js"], ++ "mappings": "AAAA,SAASA,MACP,OAAO,EACT,CACA,SAASC,MACP,OAAO,EACT,CACAD,MACAC" ++ } ++ } ++ ] ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-map.js b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-map.js +new file mode 100644 +index 000000000000..86c8e9a2535a +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-map.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=index-map-missing-map.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-map.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-map.js.map +new file mode 100644 +index 000000000000..3bce47e852cf +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-map.js.map +@@ -0,0 +1,8 @@ ++{ ++ "version": 3, ++ "sections": [ ++ { ++ "offset": { "line": 0, "column": 0 } ++ } ++ ] ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-offset-column.js b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-offset-column.js +new file mode 100644 +index 000000000000..fe6917403f18 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-offset-column.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=index-map-missing-offset-column.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-offset-column.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-offset-column.js.map +new file mode 100644 +index 000000000000..aa48bbb99317 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-offset-column.js.map +@@ -0,0 +1,14 @@ ++{ ++ "version": 3, ++ "sections": [ ++ { ++ "offset": { "line": 0 }, ++ "map": { ++ "version": 3, ++ "names": [], ++ "sources": ["empty-original.js"], ++ "mappings": "AAAA" ++ } ++ } ++ ] ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-offset-line.js b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-offset-line.js +new file mode 100644 +index 000000000000..ba8614e412ce +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-offset-line.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=index-map-missing-offset-line.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-offset-line.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-offset-line.js.map +new file mode 100644 +index 000000000000..3d60444ea74f +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-offset-line.js.map +@@ -0,0 +1,14 @@ ++{ ++ "version": 3, ++ "sections": [ ++ { ++ "offset": { "column": 0 }, ++ "map": { ++ "version": 3, ++ "names": [], ++ "sources": ["empty-original.js"], ++ "mappings": "AAAA" ++ } ++ } ++ ] ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-offset.js b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-offset.js +new file mode 100644 +index 000000000000..9ca2cf3fb515 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-offset.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=index-map-missing-offset.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-offset.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-offset.js.map +new file mode 100644 +index 000000000000..7285138bf51e +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-missing-offset.js.map +@@ -0,0 +1,13 @@ ++{ ++ "version": 3, ++ "sections": [ ++ { ++ "map": { ++ "version": 3, ++ "names": [], ++ "sources": ["empty-original.js"], ++ "mappings": "AAAA" ++ } ++ } ++ ] ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/index-map-offset-column-wrong-type.js b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-offset-column-wrong-type.js +new file mode 100644 +index 000000000000..ed1e9ec5d5b8 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-offset-column-wrong-type.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=index-map-offset-column-wrong-type.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/index-map-offset-column-wrong-type.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-offset-column-wrong-type.js.map +new file mode 100644 +index 000000000000..b43e79a9dd85 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-offset-column-wrong-type.js.map +@@ -0,0 +1,14 @@ ++{ ++ "version": 3, ++ "sections": [ ++ { ++ "offset": { "line": 0, "column": true }, ++ "map": { ++ "version": 3, ++ "names": [], ++ "sources": ["empty-original.js"], ++ "mappings": "AAAA" ++ } ++ } ++ ] ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/index-map-offset-line-wrong-type.js b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-offset-line-wrong-type.js +new file mode 100644 +index 000000000000..d58f2aff993e +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-offset-line-wrong-type.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=index-map-offset-line-wrong-type.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/index-map-offset-line-wrong-type.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-offset-line-wrong-type.js.map +new file mode 100644 +index 000000000000..81dbcd6ec434 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-offset-line-wrong-type.js.map +@@ -0,0 +1,14 @@ ++{ ++ "version": 3, ++ "sections": [ ++ { ++ "offset": { "line": true, "column": 0 }, ++ "map": { ++ "version": 3, ++ "names": [], ++ "sources": ["empty-original.js"], ++ "mappings": "AAAA" ++ } ++ } ++ ] ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/index-map-two-concatenated-sources.js b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-two-concatenated-sources.js +new file mode 100644 +index 000000000000..b8702d7187c9 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-two-concatenated-sources.js +@@ -0,0 +1,2 @@ ++function foo(){return 42}function bar(){return 24}foo();bar();function baz(){return"baz"}baz(); ++//# sourceMappingURL=index-map-two-concatenated-sources.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/index-map-two-concatenated-sources.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-two-concatenated-sources.js.map +new file mode 100644 +index 000000000000..f67f5de3c5d8 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-two-concatenated-sources.js.map +@@ -0,0 +1,24 @@ ++{ ++ "version": 3, ++ "file": "index-map-two-concatenated-sources.js", ++ "sections": [ ++ { ++ "offset": { "line": 0, "column": 0 }, ++ "map": { ++ "version": 3, ++ "names": ["foo","bar"], ++ "sources": ["basic-mapping-original.js"], ++ "mappings": "AAAA,SAASA,MACP,OAAO,EACT,CACA,SAASC,MACP,OAAO,EACT,CACAD,MACAC" ++ } ++ }, ++ { ++ "offset": { "line": 0, "column": 62 }, ++ "map": { ++ "version": 3, ++ "names": ["baz"], ++ "sources": ["second-source-original.js"], ++ "mappings":"AAAA,SAASA,MACP,MAAO,KACT,CACAA" ++ } ++ } ++ ] ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/index-map-wrong-type-map.js b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-wrong-type-map.js +new file mode 100644 +index 000000000000..d31d6d6358b4 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-wrong-type-map.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=index-map-wrong-type-map.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/index-map-wrong-type-map.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-wrong-type-map.js.map +new file mode 100644 +index 000000000000..0963f623d761 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-wrong-type-map.js.map +@@ -0,0 +1,9 @@ ++{ ++ "version": 3, ++ "sections": [ ++ { ++ "offset": { "line": 0, "column": 0 }, ++ "map": "not a map" ++ } ++ ] ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/index-map-wrong-type-offset.js b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-wrong-type-offset.js +new file mode 100644 +index 000000000000..048e1246f8b0 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-wrong-type-offset.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=index-map-wrong-type-offset.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/index-map-wrong-type-offset.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-wrong-type-offset.js.map +new file mode 100644 +index 000000000000..fbc6e4e67887 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-wrong-type-offset.js.map +@@ -0,0 +1,14 @@ ++{ ++ "version": 3, ++ "sections": [ ++ { ++ "offset": "not an offset", ++ "map": { ++ "version": 3, ++ "names": [], ++ "sources": ["empty-original.js"], ++ "mappings": "AAAA" ++ } ++ } ++ ] ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/index-map-wrong-type-sections.js b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-wrong-type-sections.js +new file mode 100644 +index 000000000000..011eca806ed6 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-wrong-type-sections.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=index-map-wrong-type-sections.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/index-map-wrong-type-sections.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-wrong-type-sections.js.map +new file mode 100644 +index 000000000000..dbfb4ead3001 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/index-map-wrong-type-sections.js.map +@@ -0,0 +1,4 @@ ++{ ++ "version": 3, ++ "sections": "not a sections list" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-bad-separator.js b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-bad-separator.js +new file mode 100644 +index 000000000000..25338aca30ce +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-bad-separator.js +@@ -0,0 +1,2 @@ ++function foo(){return 42}function bar(){return 24}foo();bar(); ++//# sourceMappingURL=invalid-mapping-bad-separator.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-bad-separator.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-bad-separator.js.map +new file mode 100644 +index 000000000000..5f4f5b92330a +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-bad-separator.js.map +@@ -0,0 +1,6 @@ ++{ ++ "version": 3, ++ "names": ["foo","bar"], ++ "sources": ["basic-mapping-original.js"], ++ "mappings": "AAAA.SAASA:MACP" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-not-a-string-1.js b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-not-a-string-1.js +new file mode 100644 +index 000000000000..cb38e2fe9d7b +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-not-a-string-1.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=invalid-mapping-not-a-string-1.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-not-a-string-1.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-not-a-string-1.js.map +new file mode 100644 +index 000000000000..5bf3e2a9d85b +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-not-a-string-1.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "names": [], ++ "file": "invalid-mapping-not-a-string-1.js", ++ "sources": ["empty-original.js"], ++ "mappings": 5 ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-not-a-string-2.js b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-not-a-string-2.js +new file mode 100644 +index 000000000000..3d84abd6c6b4 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-not-a-string-2.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=invalid-mapping-not-a-string-2.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-not-a-string-2.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-not-a-string-2.js.map +new file mode 100644 +index 000000000000..4527e7f7641c +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-not-a-string-2.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "names": [], ++ "file": "invalid-mapping-not-a-string-2.js", ++ "sources": ["empty-original.js"], ++ "mappings": [1, 2, 3, 4] ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-column-too-large.js b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-column-too-large.js +new file mode 100644 +index 000000000000..55591f874b1b +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-column-too-large.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=invalid-mapping-segment-column-too-large.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-column-too-large.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-column-too-large.js.map +new file mode 100644 +index 000000000000..b4c059e0151b +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-column-too-large.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "names": [], ++ "file": "invalid-mapping-segment-column-too-large.js", ++ "sources": ["empty-original.js"], ++ "mappings": "ggggggE" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-name-index-out-of-bounds.js b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-name-index-out-of-bounds.js +new file mode 100644 +index 000000000000..2a6b434eff58 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-name-index-out-of-bounds.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=invalid-mapping-segment-name-index-out-of-bounds.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-name-index-out-of-bounds.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-name-index-out-of-bounds.js.map +new file mode 100644 +index 000000000000..8dd2ea6c2da0 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-name-index-out-of-bounds.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "names": ["foo"], ++ "file": "invalid-mapping-segment-name-index-out-of-bounds.js", ++ "sources": ["empty-original.js"], ++ "mappings": "AAAAC" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-name-index-too-large.js b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-name-index-too-large.js +new file mode 100644 +index 000000000000..709e34dbd326 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-name-index-too-large.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=invalid-mapping-segment-name-index-too-large.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-name-index-too-large.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-name-index-too-large.js.map +new file mode 100644 +index 000000000000..c7bf5b98d120 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-name-index-too-large.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "names": [], ++ "file": "invalid-mapping-segment-name-index-too-large.js", ++ "sources": ["empty-original.js"], ++ "mappings": "AAAAggggggE" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-column.js b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-column.js +new file mode 100644 +index 000000000000..a202152d6fdf +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-column.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=invalid-mapping-segment-negative-column.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-column.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-column.js.map +new file mode 100644 +index 000000000000..403878bfa47a +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-column.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "names": [], ++ "file": "invalid-mapping-segment-negative-column.js", ++ "sources": ["empty-original.js"], ++ "mappings": "F" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-name-index.js b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-name-index.js +new file mode 100644 +index 000000000000..3e3f63420467 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-name-index.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=invalid-mapping-segment-negative-name-index.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-name-index.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-name-index.js.map +new file mode 100644 +index 000000000000..b94f63646e46 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-name-index.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "names": [], ++ "file": "invalid-mapping-segment-negative-name-index.js", ++ "sources": ["empty-original.js"], ++ "mappings": "AAAAF" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-original-column.js b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-original-column.js +new file mode 100644 +index 000000000000..f21d5342b395 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-original-column.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=invalid-mapping-segment-negative-original-column.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-original-column.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-original-column.js.map +new file mode 100644 +index 000000000000..011c639d3f91 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-original-column.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "names": [], ++ "file": "invalid-mapping-segment-negative-original-column.js", ++ "sources": ["empty-original.js"], ++ "mappings": "AAAF" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-original-line.js b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-original-line.js +new file mode 100644 +index 000000000000..b37309601ce0 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-original-line.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=invalid-mapping-segment-negative-original-line.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-original-line.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-original-line.js.map +new file mode 100644 +index 000000000000..e7ec993eebda +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-original-line.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "names": [], ++ "file": "invalid-mapping-segment-negative-original-line.js", ++ "sources": ["empty-original.js"], ++ "mappings": "AAFA" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-column.js b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-column.js +new file mode 100644 +index 000000000000..94b835d6877c +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-column.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=invalid-mapping-segment-negative-relative-column.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-column.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-column.js.map +new file mode 100644 +index 000000000000..414884072b55 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-column.js.map +@@ -0,0 +1,8 @@ ++{ ++ "version": 3, ++ "names": [], ++ "file": "invalid-mapping-segment-negative-relative-column.js", ++ "sources": ["empty-original.js"], ++ "sourcesContent": [""], ++ "mappings": "C,F" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-name-index.js b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-name-index.js +new file mode 100644 +index 000000000000..c965c5f011f5 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-name-index.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=invalid-mapping-segment-negative-relative-name-index.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-name-index.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-name-index.js.map +new file mode 100644 +index 000000000000..1fbbcfcd323e +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-name-index.js.map +@@ -0,0 +1,8 @@ ++{ ++ "version": 3, ++ "names": [], ++ "file": "invalid-mapping-segment-negative-relative-name-index.js", ++ "sources": ["empty-original.js"], ++ "sourcesContent": [""], ++ "mappings": "AAAAC,AAAAF" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-original-column.js b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-original-column.js +new file mode 100644 +index 000000000000..493a6ec88a39 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-original-column.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=invalid-mapping-segment-negative-relative-original-column.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-original-column.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-original-column.js.map +new file mode 100644 +index 000000000000..7e62895651fa +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-original-column.js.map +@@ -0,0 +1,8 @@ ++{ ++ "version": 3, ++ "names": [], ++ "file": "invalid-mapping-segment-negative-relative-original-column.js", ++ "sources": ["empty-original.js"], ++ "sourcesContent": [""], ++ "mappings": "AAAC,AAAF" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-original-line.js b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-original-line.js +new file mode 100644 +index 000000000000..ca8329fb98f0 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-original-line.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=invalid-mapping-segment-negative-relative-original-line.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-original-line.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-original-line.js.map +new file mode 100644 +index 000000000000..86b0fb3a04cc +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-original-line.js.map +@@ -0,0 +1,8 @@ ++{ ++ "version": 3, ++ "names": [], ++ "file": "invalid-mapping-segment-negative-relative-original-line.js", ++ "sources": ["empty-original.js"], ++ "sourcesContent": [""], ++ "mappings": "AACA,AAFA" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-source-index.js b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-source-index.js +new file mode 100644 +index 000000000000..fa92225b0963 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-source-index.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=invalid-mapping-segment-negative-relative-source-index.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-source-index.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-source-index.js.map +new file mode 100644 +index 000000000000..2efeb047db61 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-relative-source-index.js.map +@@ -0,0 +1,8 @@ ++{ ++ "version": 3, ++ "names": [], ++ "file": "invalid-mapping-segment-negative-relative-source-index.js", ++ "sources": ["empty-original.js"], ++ "sourcesContent": [""], ++ "mappings": "ACAA,AFAA" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-source-index.js b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-source-index.js +new file mode 100644 +index 000000000000..6e05849b6a03 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-source-index.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=invalid-mapping-segment-negative-source-index.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-source-index.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-source-index.js.map +new file mode 100644 +index 000000000000..596c2f298bbe +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-negative-source-index.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "names": [], ++ "file": "invalid-mapping-segment-negative-source-index.js", ++ "sources": ["empty-original.js"], ++ "mappings": "AFAA" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-original-column-too-large.js b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-original-column-too-large.js +new file mode 100644 +index 000000000000..0936ed7ea8fd +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-original-column-too-large.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=invalid-mapping-segment-original-column-too-large.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-original-column-too-large.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-original-column-too-large.js.map +new file mode 100644 +index 000000000000..ff2103fe24fe +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-original-column-too-large.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "names": [], ++ "file": "invalid-mapping-segment-original-column-too-large.js", ++ "sources": ["empty-original.js"], ++ "mappings": "AAAggggggE" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-original-line-too-large.js b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-original-line-too-large.js +new file mode 100644 +index 000000000000..9b3aa5a361ae +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-original-line-too-large.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=invalid-mapping-segment-original-line-too-large.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-original-line-too-large.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-original-line-too-large.js.map +new file mode 100644 +index 000000000000..890f1c71fc5b +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-original-line-too-large.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "names": [], ++ "file": "invalid-mapping-segment-original-line-too-large.js", ++ "sources": ["empty-original.js"], ++ "mappings": "AAggggggEA" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-source-index-out-of-bounds.js b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-source-index-out-of-bounds.js +new file mode 100644 +index 000000000000..2e5fbca26825 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-source-index-out-of-bounds.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=invalid-mapping-segment-source-index-out-of-bounds.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-source-index-out-of-bounds.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-source-index-out-of-bounds.js.map +new file mode 100644 +index 000000000000..86dedb114fa9 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-source-index-out-of-bounds.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "names": [], ++ "file": "invalid-mapping-segment-source-index-out-of-bounds.js", ++ "sources": ["empty-original.js"], ++ "mappings": "ACAA" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-source-index-too-large.js b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-source-index-too-large.js +new file mode 100644 +index 000000000000..3f4943e1272d +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-source-index-too-large.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=invalid-mapping-segment-source-index-too-large.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-source-index-too-large.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-source-index-too-large.js.map +new file mode 100644 +index 000000000000..e9f858c6e15d +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-source-index-too-large.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "names": [], ++ "file": "invalid-mapping-segment-source-index-too-large.js", ++ "sources": ["empty-original.js"], ++ "mappings": "AggggggEAA" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-with-three-fields.js b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-with-three-fields.js +new file mode 100644 +index 000000000000..4b868fac9c5e +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-with-three-fields.js +@@ -0,0 +1,2 @@ ++function foo(){return 42}function bar(){return 24}foo();bar(); ++//# sourceMappingURL=invalid-mapping-segment-with-three-fields.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-with-three-fields.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-with-three-fields.js.map +new file mode 100644 +index 000000000000..c2af1165ad8f +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-with-three-fields.js.map +@@ -0,0 +1,6 @@ ++{ ++ "version": 3, ++ "names": ["foo","bar"], ++ "sources": ["basic-mapping-original.js"], ++ "mappings": "AAA" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-with-two-fields.js b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-with-two-fields.js +new file mode 100644 +index 000000000000..96045a7a11dd +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-with-two-fields.js +@@ -0,0 +1,2 @@ ++function foo(){return 42}function bar(){return 24}foo();bar(); ++//# sourceMappingURL=invalid-mapping-segment-with-two-fields.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-with-two-fields.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-with-two-fields.js.map +new file mode 100644 +index 000000000000..73cf00fa1c96 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-with-two-fields.js.map +@@ -0,0 +1,6 @@ ++{ ++ "version": 3, ++ "names": ["foo","bar"], ++ "sources": ["basic-mapping-original.js"], ++ "mappings": "AA" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-with-zero-fields.js b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-with-zero-fields.js +new file mode 100644 +index 000000000000..9d5332a56ca5 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-with-zero-fields.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=invalid-mapping-segment-with-zero-fields.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-with-zero-fields.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-with-zero-fields.js.map +new file mode 100644 +index 000000000000..5a34d25b645e +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-mapping-segment-with-zero-fields.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "names": [], ++ "file": "invalid-mapping-segment-with-zero-fields.js", ++ "sources": ["empty-original.js"], ++ "mappings": ",,,," ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-vlq-missing-continuation.js b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-vlq-missing-continuation.js +new file mode 100644 +index 000000000000..2c2a0090aca6 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-vlq-missing-continuation.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=invalid-vlq-missing-continuation.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-vlq-missing-continuation.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-vlq-missing-continuation.js.map +new file mode 100644 +index 000000000000..dd0e363ff473 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-vlq-missing-continuation.js.map +@@ -0,0 +1,6 @@ ++{ ++ "version" : 3, ++ "sources": [], ++ "names": [], ++ "mappings": "g" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-vlq-non-base64-char.js b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-vlq-non-base64-char.js +new file mode 100644 +index 000000000000..d1b20b41a29f +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-vlq-non-base64-char.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=invalid-vlq-non-base64-char.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/invalid-vlq-non-base64-char.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-vlq-non-base64-char.js.map +new file mode 100644 +index 000000000000..4fa1ac576885 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/invalid-vlq-non-base64-char.js.map +@@ -0,0 +1,6 @@ ++{ ++ "version" : 3, ++ "sources": [], ++ "names": [], ++ "mappings": "A$%?!" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-column-reset.js b/LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-column-reset.js +new file mode 100644 +index 000000000000..b64482d09843 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-column-reset.js +@@ -0,0 +1,3 @@ ++ foo ++ bar ++//# sourceMappingURL=mapping-semantics-column-reset.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-column-reset.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-column-reset.js.map +new file mode 100644 +index 000000000000..97bc9b91a43d +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-column-reset.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "names": [], ++ "sources": ["mapping-semantics-column-reset-original.js"], ++ "sourcesContent": ["foo\nbar"], ++ "mappings": "CAAA;CACA" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-five-field-segment.js b/LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-five-field-segment.js +new file mode 100644 +index 000000000000..0f6602d61503 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-five-field-segment.js +@@ -0,0 +1,2 @@ ++foo ++//# sourceMappingURL=mapping-semantics-five-field-segment.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-five-field-segment.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-five-field-segment.js.map +new file mode 100644 +index 000000000000..d0504f511dad +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-five-field-segment.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "names": ["foo"], ++ "sources": ["unused", "mapping-semantics-five-field-segment-original.js"], ++ "sourcesContent": ["", "\n\n foo"], ++ "mappings": "CCEEA" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-four-field-segment.js b/LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-four-field-segment.js +new file mode 100644 +index 000000000000..3dcbee9294c0 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-four-field-segment.js +@@ -0,0 +1,2 @@ ++foo ++//# sourceMappingURL=mapping-semantics-four-field-segment.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-four-field-segment.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-four-field-segment.js.map +new file mode 100644 +index 000000000000..9e01ac4b6c58 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-four-field-segment.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "names": [], ++ "sources": ["unused", "mapping-semantics-four-field-segment-original.js"], ++ "sourcesContent": ["", "\n\n foo"], ++ "mappings": "CCEE" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-relative-1.js b/LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-relative-1.js +new file mode 100644 +index 000000000000..281870cc50e7 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-relative-1.js +@@ -0,0 +1,2 @@ ++ 42; 24; ++//# sourceMappingURL=mapping-semantics-relative-1.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-relative-1.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-relative-1.js.map +new file mode 100644 +index 000000000000..6570031f8983 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-relative-1.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "names": [], ++ "sources": ["unused", "mapping-semantics-relative-1-original.js"], ++ "sourcesContent": ["", "42; 24;"], ++ "mappings": "CCAA,IAAI" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-relative-2.js b/LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-relative-2.js +new file mode 100644 +index 000000000000..f4bff1c75bcc +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-relative-2.js +@@ -0,0 +1,3 @@ ++ foo ++ bar ++//# sourceMappingURL=mapping-semantics-relative-2.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-relative-2.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-relative-2.js.map +new file mode 100644 +index 000000000000..d6845233f912 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-relative-2.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "names": ["foo", "bar"], ++ "sources": ["unused", "mapping-semantics-relative-2-original.js"], ++ "sourcesContent": ["", " foo\n bar"], ++ "mappings": "CCAEA;EACAC" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-single-field-segment.js b/LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-single-field-segment.js +new file mode 100644 +index 000000000000..ca06b7c58d88 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-single-field-segment.js +@@ -0,0 +1,2 @@ ++ 3 ++//# sourceMappingURL=mapping-semantics-single-field-segment.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-single-field-segment.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-single-field-segment.js.map +new file mode 100644 +index 000000000000..8260d63085d7 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/mapping-semantics-single-field-segment.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "names": [], ++ "sources": ["mapping-semantics-single-field-segment-original.js"], ++ "sourcesContent": ["3 3"], ++ "mappings": "AAAC,E" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/names-missing.js b/LayoutTests/imported/tg4/source-map-tests/resources/names-missing.js +new file mode 100644 +index 000000000000..58781fd88705 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/names-missing.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=names-missing.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/names-missing.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/names-missing.js.map +new file mode 100644 +index 000000000000..475f4e309b26 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/names-missing.js.map +@@ -0,0 +1,6 @@ ++{ ++ "version" : 3, ++ "sources": ["empty-original.js"], ++ "sourcesContent" : [""], ++ "mappings": "" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/names-not-a-list-1.js b/LayoutTests/imported/tg4/source-map-tests/resources/names-not-a-list-1.js +new file mode 100644 +index 000000000000..dc65f1972b5a +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/names-not-a-list-1.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=names-not-a-list-1.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/names-not-a-list-1.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/names-not-a-list-1.js.map +new file mode 100644 +index 000000000000..fe1edaeb96ad +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/names-not-a-list-1.js.map +@@ -0,0 +1,6 @@ ++{ ++ "version" : 3, ++ "sources": ["source.js"], ++ "names": "not a list", ++ "mappings": "AAAAA" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/names-not-a-list-2.js b/LayoutTests/imported/tg4/source-map-tests/resources/names-not-a-list-2.js +new file mode 100644 +index 000000000000..d7251f78da84 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/names-not-a-list-2.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=names-not-a-list-2.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/names-not-a-list-2.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/names-not-a-list-2.js.map +new file mode 100644 +index 000000000000..3388d2bb7109 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/names-not-a-list-2.js.map +@@ -0,0 +1,6 @@ ++{ ++ "version" : 3, ++ "sources": ["source.js"], ++ "names": { "foo": 3 }, ++ "mappings": "AAAAA" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/names-not-string.js b/LayoutTests/imported/tg4/source-map-tests/resources/names-not-string.js +new file mode 100644 +index 000000000000..8dc7b4811a3e +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/names-not-string.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=names-not-string.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/names-not-string.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/names-not-string.js.map +new file mode 100644 +index 000000000000..c0feb0739aec +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/names-not-string.js.map +@@ -0,0 +1,6 @@ ++{ ++ "version" : 3, ++ "sources": ["source.js"], ++ "names": [null, 3, true, false, {}, []], ++ "mappings": "AAAAA" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/second-source-original.js b/LayoutTests/imported/tg4/source-map-tests/resources/second-source-original.js +new file mode 100644 +index 000000000000..c339bc9d15da +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/second-source-original.js +@@ -0,0 +1,4 @@ ++function baz() { ++ return "baz"; ++} ++baz(); +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/source-resolution-absolute-url.js b/LayoutTests/imported/tg4/source-map-tests/resources/source-resolution-absolute-url.js +new file mode 100644 +index 000000000000..7ab34b6bd0fa +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/source-resolution-absolute-url.js +@@ -0,0 +1,2 @@ ++function foo(){return 42}function bar(){return 24}foo();bar(); ++//# sourceMappingURL=source-resolution-absolute-url.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/source-resolution-absolute-url.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/source-resolution-absolute-url.js.map +new file mode 100644 +index 000000000000..195dc42ecea3 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/source-resolution-absolute-url.js.map +@@ -0,0 +1,8 @@ ++{ ++ "version": 3, ++ "file": "source-root-resolution.js", ++ "names": ["foo", "bar"], ++ "sources": ["/baz/quux/basic-mapping-original.js"], ++ "sourcesContent": ["function foo() {\nreturn 42;\n }\n function bar() {\n return 24;\n }\n foo();\n bar();"], ++ "mappings": "AAAA,SAASA" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/source-root-not-a-string-1.js b/LayoutTests/imported/tg4/source-map-tests/resources/source-root-not-a-string-1.js +new file mode 100644 +index 000000000000..f176f3143a4a +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/source-root-not-a-string-1.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=source-root-not-a-string-1.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/source-root-not-a-string-1.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/source-root-not-a-string-1.js.map +new file mode 100644 +index 000000000000..e297f5c03e50 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/source-root-not-a-string-1.js.map +@@ -0,0 +1,8 @@ ++{ ++ "version" : 3, ++ "sourceRoot": [], ++ "sources": ["empty-original.js"], ++ "sourcesContent": [""], ++ "names": [], ++ "mappings": "" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/source-root-not-a-string-2.js b/LayoutTests/imported/tg4/source-map-tests/resources/source-root-not-a-string-2.js +new file mode 100644 +index 000000000000..f176f3143a4a +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/source-root-not-a-string-2.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=source-root-not-a-string-2.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/source-root-not-a-string-2.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/source-root-not-a-string-2.js.map +new file mode 100644 +index 000000000000..d5705ebfb8e9 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/source-root-not-a-string-2.js.map +@@ -0,0 +1,8 @@ ++{ ++ "version" : 3, ++ "sourceRoot": -10923409, ++ "sources": ["empty-original.js"], ++ "sourcesContent": [""], ++ "names": [], ++ "mappings": "" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/source-root-resolution.js b/LayoutTests/imported/tg4/source-map-tests/resources/source-root-resolution.js +new file mode 100644 +index 000000000000..15a1a4c95026 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/source-root-resolution.js +@@ -0,0 +1,2 @@ ++function foo(){return 42}function bar(){return 24}foo();bar(); ++//# sourceMappingURL=source-root-resolution.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/source-root-resolution.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/source-root-resolution.js.map +new file mode 100644 +index 000000000000..b2067265c02e +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/source-root-resolution.js.map +@@ -0,0 +1,9 @@ ++{ ++ "version": 3, ++ "sourceRoot": "theroot", ++ "file": "source-root-resolution.js", ++ "names": ["foo", "bar"], ++ "sources": ["basic-mapping-original.js"], ++ "sourcesContent": ["function foo() {\n return 42;\n }\n function bar() {\n return 24;\n }\n foo();\n bar();"], ++ "mappings": "AAAA,SAASA" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/sources-and-sources-content-both-null.js b/LayoutTests/imported/tg4/source-map-tests/resources/sources-and-sources-content-both-null.js +new file mode 100644 +index 000000000000..9263eba549f5 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/sources-and-sources-content-both-null.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=sources-and-sources-content-both-null.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/sources-and-sources-content-both-null.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/sources-and-sources-content-both-null.js.map +new file mode 100644 +index 000000000000..09a7c1f3698c +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/sources-and-sources-content-both-null.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "names": ["foo"], ++ "sources": [null], ++ "sourcesContent": [null], ++ "mappings":"AAAA,SAASA" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/sources-missing.js b/LayoutTests/imported/tg4/source-map-tests/resources/sources-missing.js +new file mode 100644 +index 000000000000..779b865e2769 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/sources-missing.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=sources-missing.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/sources-missing.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/sources-missing.js.map +new file mode 100644 +index 000000000000..92aff4fb0e74 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/sources-missing.js.map +@@ -0,0 +1,5 @@ ++{ ++ "version" : 3, ++ "names": ["foo"], ++ "mappings": "" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/sources-non-null-sources-content-null.js b/LayoutTests/imported/tg4/source-map-tests/resources/sources-non-null-sources-content-null.js +new file mode 100644 +index 000000000000..939b568ba142 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/sources-non-null-sources-content-null.js +@@ -0,0 +1,2 @@ ++function foo(){return 42}function bar(){return 24}foo();bar(); ++//# sourceMappingURL=sources-non-null-sources-content-null.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/sources-non-null-sources-content-null.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/sources-non-null-sources-content-null.js.map +new file mode 100644 +index 000000000000..e573906b2d71 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/sources-non-null-sources-content-null.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "names": ["foo"], ++ "sources": ["basic-mapping-original.js"], ++ "sourcesContent": [null], ++ "mappings":"AAAA,SAASA" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/sources-not-a-list-1.js b/LayoutTests/imported/tg4/source-map-tests/resources/sources-not-a-list-1.js +new file mode 100644 +index 000000000000..7e33b7e86725 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/sources-not-a-list-1.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=sources-not-a-list-1.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/sources-not-a-list-1.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/sources-not-a-list-1.js.map +new file mode 100644 +index 000000000000..26330517b988 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/sources-not-a-list-1.js.map +@@ -0,0 +1,6 @@ ++{ ++ "version" : 3, ++ "sources": "not a list", ++ "names": ["foo"], ++ "mappings": "AAAAA" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/sources-not-a-list-2.js b/LayoutTests/imported/tg4/source-map-tests/resources/sources-not-a-list-2.js +new file mode 100644 +index 000000000000..4021f763fc88 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/sources-not-a-list-2.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=sources-not-a-list-2.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/sources-not-a-list-2.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/sources-not-a-list-2.js.map +new file mode 100644 +index 000000000000..2ed85962fddf +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/sources-not-a-list-2.js.map +@@ -0,0 +1,6 @@ ++{ ++ "version" : 3, ++ "sources": { "source.js": 3 }, ++ "names": ["foo"], ++ "mappings": "AAAAA" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/sources-not-string-or-null.js b/LayoutTests/imported/tg4/source-map-tests/resources/sources-not-string-or-null.js +new file mode 100644 +index 000000000000..7dca97a1dab5 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/sources-not-string-or-null.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=sources-not-string-or-null.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/sources-not-string-or-null.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/sources-not-string-or-null.js.map +new file mode 100644 +index 000000000000..db2556196605 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/sources-not-string-or-null.js.map +@@ -0,0 +1,6 @@ ++{ ++ "version" : 3, ++ "sources": [3, {}, true, false, []], ++ "names": ["foo"], ++ "mappings": "AAAAA" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/sources-null-sources-content-non-null.js b/LayoutTests/imported/tg4/source-map-tests/resources/sources-null-sources-content-non-null.js +new file mode 100644 +index 000000000000..a760594ee9bd +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/sources-null-sources-content-non-null.js +@@ -0,0 +1,2 @@ ++function foo(){return 42}function bar(){return 24}foo();bar(); ++//# sourceMappingURL=sources-null-sources-content-non-null.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/sources-null-sources-content-non-null.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/sources-null-sources-content-non-null.js.map +new file mode 100644 +index 000000000000..43af03903f64 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/sources-null-sources-content-non-null.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version":3, ++ "names": ["foo"], ++ "sources": [null], ++ "sourcesContent": ["function foo()\n{ return 42; }\nfunction bar()\n { return 24; }\nfoo();\nbar();"], ++ "mappings":"AAAA,SAASA" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/transitive-mapping-original.js b/LayoutTests/imported/tg4/source-map-tests/resources/transitive-mapping-original.js +new file mode 100644 +index 000000000000..0a96699d6e25 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/transitive-mapping-original.js +@@ -0,0 +1,5 @@ ++function foo(x) { ++ return x; ++} ++foo("foo"); ++//# sourceMappingURL=transitive-mapping-original.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/transitive-mapping-original.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/transitive-mapping-original.js.map +new file mode 100644 +index 000000000000..65af25c1ebbe +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/transitive-mapping-original.js.map +@@ -0,0 +1,8 @@ ++{ ++ "version": 3, ++ "file" : "transitive-mapping-original.js", ++ "sourceRoot": "", ++ "sources": ["typescript-original.ts"], ++ "names": [], ++ "mappings": "AACA,SAAS,GAAG,CAAC,CAAU;IACrB,OAAO,CAAC,CAAC;AACX,CAAC;AACD,GAAG,CAAC,KAAK,CAAC,CAAC" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/transitive-mapping-three-steps.js b/LayoutTests/imported/tg4/source-map-tests/resources/transitive-mapping-three-steps.js +new file mode 100644 +index 000000000000..fd956164d349 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/transitive-mapping-three-steps.js +@@ -0,0 +1,6 @@ ++function foo(x) { ++ return x; ++} ++ ++foo("foo"); ++//# sourceMappingURL=transitive-mapping-three-steps.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/transitive-mapping-three-steps.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/transitive-mapping-three-steps.js.map +new file mode 100644 +index 000000000000..90459d90f6a0 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/transitive-mapping-three-steps.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "file": "transitive-mapping-three-steps.js", ++ "sources": ["transitive-mapping.js"], ++ "names": ["foo", "x"], ++ "mappings": "AAAA,SAASA,IAAIC;IAAG,OAAOA;AAAC;;AAACD,IAAI,KAAK" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/transitive-mapping.js b/LayoutTests/imported/tg4/source-map-tests/resources/transitive-mapping.js +new file mode 100644 +index 000000000000..183c027f1bb8 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/transitive-mapping.js +@@ -0,0 +1,2 @@ ++function foo(x){return x}foo("foo"); ++//# sourceMappingURL=transitive-mapping.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/transitive-mapping.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/transitive-mapping.js.map +new file mode 100644 +index 000000000000..d6a6fa6672d4 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/transitive-mapping.js.map +@@ -0,0 +1,6 @@ ++{ ++ "version": 3, ++ "names": ["foo","x"], ++ "sources": ["transitive-mapping-original.js"], ++ "mappings":"AAAA,SAASA,IAAIC,GACT,OAAOA,CACX,CACAD,IAAI" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/typescript-original.ts b/LayoutTests/imported/tg4/source-map-tests/resources/typescript-original.ts +new file mode 100644 +index 000000000000..cd51c01ba129 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/typescript-original.ts +@@ -0,0 +1,5 @@ ++type FooArg = string | number; ++function foo(x : FooArg) { ++ return x; ++} ++foo("foo"); +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/unrecognized-property.js b/LayoutTests/imported/tg4/source-map-tests/resources/unrecognized-property.js +new file mode 100644 +index 000000000000..19dfb0e2e6c7 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/unrecognized-property.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=unrecognized-property.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/unrecognized-property.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/unrecognized-property.js.map +new file mode 100644 +index 000000000000..40bee558a4ff +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/unrecognized-property.js.map +@@ -0,0 +1,8 @@ ++{ ++ "version" : 3, ++ "sources": [], ++ "names": [], ++ "mappings": "", ++ "foobar": 42, ++ "unusedProperty": [1, 2, 3, 4] ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/valid-mapping-boundary-values.js b/LayoutTests/imported/tg4/source-map-tests/resources/valid-mapping-boundary-values.js +new file mode 100644 +index 000000000000..3c49709e05ac +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/valid-mapping-boundary-values.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=valid-mapping-boundary-values.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/valid-mapping-boundary-values.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/valid-mapping-boundary-values.js.map +new file mode 100644 +index 000000000000..4dd836e63d8f +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/valid-mapping-boundary-values.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "names": ["foo"], ++ "file": "valid-mapping-boundary-values.js", ++ "sources": ["empty-original.js"], ++ "mappings": "+/////DA+/////D+/////DA" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/valid-mapping-empty-groups.js b/LayoutTests/imported/tg4/source-map-tests/resources/valid-mapping-empty-groups.js +new file mode 100644 +index 000000000000..a2b767b619a0 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/valid-mapping-empty-groups.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=valid-mapping-empty-groups.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/valid-mapping-empty-groups.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/valid-mapping-empty-groups.js.map +new file mode 100644 +index 000000000000..643c9ae78481 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/valid-mapping-empty-groups.js.map +@@ -0,0 +1,8 @@ ++{ ++ "version": 3, ++ "names": [], ++ "file": "valid-mapping-empty-groups.js", ++ "sources": ["empty-original.js"], ++ "sourcesContent": [""], ++ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/valid-mapping-empty-string.js b/LayoutTests/imported/tg4/source-map-tests/resources/valid-mapping-empty-string.js +new file mode 100644 +index 000000000000..83fc1bf3ac73 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/valid-mapping-empty-string.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=valid-mapping-empty-string.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/valid-mapping-empty-string.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/valid-mapping-empty-string.js.map +new file mode 100644 +index 000000000000..a35268d8f5b8 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/valid-mapping-empty-string.js.map +@@ -0,0 +1,8 @@ ++{ ++ "version": 3, ++ "names": [], ++ "file": "valid-mapping-empty-string.js", ++ "sources": ["empty-original.js"], ++ "sourcesContent": [""], ++ "mappings": "" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/valid-mapping-large-vlq.js b/LayoutTests/imported/tg4/source-map-tests/resources/valid-mapping-large-vlq.js +new file mode 100644 +index 000000000000..b0cd8978132a +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/valid-mapping-large-vlq.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=valid-mapping-large-vlq.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/valid-mapping-large-vlq.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/valid-mapping-large-vlq.js.map +new file mode 100644 +index 000000000000..76e18704c4b1 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/valid-mapping-large-vlq.js.map +@@ -0,0 +1,6 @@ ++{ ++ "version": 3, ++ "names": [], ++ "sources": ["valid-mapping-large-vlq.js"], ++ "mappings": "igggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggA" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/version-missing.js b/LayoutTests/imported/tg4/source-map-tests/resources/version-missing.js +new file mode 100644 +index 000000000000..c32d1f1a1cc6 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/version-missing.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=version-missing.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/version-missing.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/version-missing.js.map +new file mode 100644 +index 000000000000..49d8ce766edb +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/version-missing.js.map +@@ -0,0 +1,5 @@ ++{ ++ "sources": [], ++ "names": [], ++ "mappings": "" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/version-not-a-number.js b/LayoutTests/imported/tg4/source-map-tests/resources/version-not-a-number.js +new file mode 100644 +index 000000000000..ae2342e2ffe5 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/version-not-a-number.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=version-not-a-number.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/version-not-a-number.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/version-not-a-number.js.map +new file mode 100644 +index 000000000000..a584d6e69511 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/version-not-a-number.js.map +@@ -0,0 +1,6 @@ ++{ ++ "version" : "3foo", ++ "sources": [], ++ "names": [], ++ "mappings": "" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/version-numeric-string.js b/LayoutTests/imported/tg4/source-map-tests/resources/version-numeric-string.js +new file mode 100644 +index 000000000000..a55170885da6 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/version-numeric-string.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=version-numeric-string.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/version-numeric-string.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/version-numeric-string.js.map +new file mode 100644 +index 000000000000..dbe52a7d0df6 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/version-numeric-string.js.map +@@ -0,0 +1,6 @@ ++{ ++ "version" : "3", ++ "sources": [], ++ "names": [], ++ "mappings": "" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/version-too-high.js b/LayoutTests/imported/tg4/source-map-tests/resources/version-too-high.js +new file mode 100644 +index 000000000000..55f4e1a298fa +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/version-too-high.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=version-too-high.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/version-too-high.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/version-too-high.js.map +new file mode 100644 +index 000000000000..ee23be32ff27 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/version-too-high.js.map +@@ -0,0 +1,6 @@ ++{ ++ "version" : 4, ++ "sources": [], ++ "names": [], ++ "mappings": "" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/version-too-low.js b/LayoutTests/imported/tg4/source-map-tests/resources/version-too-low.js +new file mode 100644 +index 000000000000..d9642920b313 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/version-too-low.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=version-too-low.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/version-too-low.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/version-too-low.js.map +new file mode 100644 +index 000000000000..64ca7a6e2e92 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/version-too-low.js.map +@@ -0,0 +1,6 @@ ++{ ++ "version" : 2, ++ "sources": [], ++ "names": [], ++ "mappings": "" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/version-valid.js b/LayoutTests/imported/tg4/source-map-tests/resources/version-valid.js +new file mode 100644 +index 000000000000..82d0bfa1eb2a +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/version-valid.js +@@ -0,0 +1 @@ ++//# sourceMappingURL=version-valid.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/version-valid.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/version-valid.js.map +new file mode 100644 +index 000000000000..1a163052d8fc +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/version-valid.js.map +@@ -0,0 +1,6 @@ ++{ ++ "version" : 3, ++ "sources": [], ++ "names": [], ++ "mappings": "" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/vlq-valid-continuation-bit-present-1.js b/LayoutTests/imported/tg4/source-map-tests/resources/vlq-valid-continuation-bit-present-1.js +new file mode 100644 +index 000000000000..511e7be18ae5 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/vlq-valid-continuation-bit-present-1.js +@@ -0,0 +1,2 @@ ++ 3 ++//# sourceMappingURL=vlq-valid-continuation-bit-present-1.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/vlq-valid-continuation-bit-present-1.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/vlq-valid-continuation-bit-present-1.js.map +new file mode 100644 +index 000000000000..f4acb4b41837 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/vlq-valid-continuation-bit-present-1.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "names": [], ++ "sources": ["vlq-valid-continuation-bit-present-1-original.js"], ++ "sourcesContent": [" 3"], ++ "mappings": "+gAgAgAigA" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/vlq-valid-continuation-bit-present-2.js b/LayoutTests/imported/tg4/source-map-tests/resources/vlq-valid-continuation-bit-present-2.js +new file mode 100644 +index 000000000000..0c879ce052ad +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/vlq-valid-continuation-bit-present-2.js +@@ -0,0 +1,4 @@ ++ ++ ++ 3 ++//# sourceMappingURL=vlq-valid-continuation-bit-present-2.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/vlq-valid-continuation-bit-present-2.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/vlq-valid-continuation-bit-present-2.js.map +new file mode 100644 +index 000000000000..a975cf8591ff +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/vlq-valid-continuation-bit-present-2.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "names": [], ++ "sources": ["vlq-valid-continuation-bit-present-2-original.js"], ++ "sourcesContent": ["\n 3"], ++ "mappings": ";;gBACC" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/vlq-valid-negative-digit.js b/LayoutTests/imported/tg4/source-map-tests/resources/vlq-valid-negative-digit.js +new file mode 100644 +index 000000000000..d8e795090eff +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/vlq-valid-negative-digit.js +@@ -0,0 +1,4 @@ ++ ++ ++ 4; 3 ++//# sourceMappingURL=vlq-valid-negative-digit.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/vlq-valid-negative-digit.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/vlq-valid-negative-digit.js.map +new file mode 100644 +index 000000000000..71dec0d65a1a +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/vlq-valid-negative-digit.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "names": [], ++ "sources": ["vlq-valid-negative-digit-original.js"], ++ "sourcesContent": ["\n 4;3"], ++ "mappings": ";;eACG,bAAF" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/vlq-valid-single-digit.js b/LayoutTests/imported/tg4/source-map-tests/resources/vlq-valid-single-digit.js +new file mode 100644 +index 000000000000..54c59aae1fcb +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/vlq-valid-single-digit.js +@@ -0,0 +1,2 @@ ++ 3 ++//# sourceMappingURL=vlq-valid-single-digit.js.map +diff --git a/LayoutTests/imported/tg4/source-map-tests/resources/vlq-valid-single-digit.js.map b/LayoutTests/imported/tg4/source-map-tests/resources/vlq-valid-single-digit.js.map +new file mode 100644 +index 000000000000..9e35a7a0a6a5 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/resources/vlq-valid-single-digit.js.map +@@ -0,0 +1,7 @@ ++{ ++ "version": 3, ++ "names": [], ++ "sources": ["vlq-valid-single-digit-original.js"], ++ "sourcesContent": ["3"], ++ "mappings": "eAAA" ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/source-map-spec-tests.json b/LayoutTests/imported/tg4/source-map-tests/source-map-spec-tests.json +new file mode 100644 +index 000000000000..4601502fffd6 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/source-map-spec-tests.json +@@ -0,0 +1,1554 @@ ++{ ++ "tests": [ ++ { ++ "name": "versionValid", ++ "description": "Test a simple source map with a valid version number", ++ "baseFile": "version-valid.js", ++ "sourceMapFile": "version-valid.js.map", ++ "sourceMapIsValid": true ++ }, ++ { ++ "name": "versionMissing", ++ "description": "Test a source map that is missing a version field", ++ "baseFile": "version-missing.js", ++ "sourceMapFile": "version-missing.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "versionNotANumber", ++ "description": "Test a source map with a version field that is not a number", ++ "baseFile": "version-not-a-number.js", ++ "sourceMapFile": "version-not-a-number.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "versionNumericString", ++ "description": "Test a source map with a version field that is a number as a string", ++ "baseFile": "version-numeric-string.js", ++ "sourceMapFile": "version-numeric-string.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "versionTooHigh", ++ "description": "Test a source map with an integer version field that is too high", ++ "baseFile": "version-too-high.js", ++ "sourceMapFile": "version-too-high.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "versionTooLow", ++ "description": "Test a source map with an integer version field that is too low", ++ "baseFile": "version-too-low.js", ++ "sourceMapFile": "version-too-low.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "sourcesMissing", ++ "description": "Test a source map that is missing a necessary sources field", ++ "baseFile": "sources-missing.js", ++ "sourceMapFile": "sources-missing.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "sourcesNotAList1", ++ "description": "Test a source map with a sources field that is not a valid list (string)", ++ "baseFile": "sources-not-a-list-1.js", ++ "sourceMapFile": "sources-not-a-list-1.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "sourcesNotAList2", ++ "description": "Test a source map with a sources field that is not a valid list (object)", ++ "baseFile": "sources-not-a-list-2.js", ++ "sourceMapFile": "sources-not-a-list-2.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "sourcesNotStringOrNull", ++ "description": "Test a source map with a sources list that has non-string and non-null items", ++ "baseFile": "sources-not-string-or-null.js", ++ "sourceMapFile": "sources-not-string-or-null.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "sourcesAndSourcesContentBothNull", ++ "description": "Test a source map that has both null sources and sourcesContent entries", ++ "baseFile": "sources-and-sources-content-both-null.js", ++ "sourceMapFile": "sources-and-sources-content-both-null.js.map", ++ "sourceMapIsValid": true ++ }, ++ { ++ "name": "fileNotAString1", ++ "description": "Test a source map with a file field that is not a valid string", ++ "baseFile": "file-not-a-string-1.js", ++ "sourceMapFile": "file-not-a-string-1.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "fileNotAString2", ++ "description": "Test a source map with a file field that is not a valid string", ++ "baseFile": "file-not-a-string-2.js", ++ "sourceMapFile": "file-not-a-string-2.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "sourceRootNotAString1", ++ "description": "Test a source map with a sourceRoot field that is not a valid string", ++ "baseFile": "source-root-not-a-string-1.js", ++ "sourceMapFile": "source-root-not-a-string-1.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "sourceRootNotAString2", ++ "description": "Test a source map with a sourceRoot field that is not a valid string", ++ "baseFile": "source-root-not-a-string-2.js", ++ "sourceMapFile": "source-root-not-a-string-2.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "namesMissing", ++ "description": "Test a source map that is missing the optional names field", ++ "baseFile": "names-missing.js", ++ "sourceMapFile": "names-missing.js.map", ++ "sourceMapIsValid": true ++ }, ++ { ++ "name": "namesNotAList1", ++ "description": "Test a source map with a names field that is not a valid list (string)", ++ "baseFile": "names-not-a-list-1.js", ++ "sourceMapFile": "names-not-a-list-1.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "namesNotAList2", ++ "description": "Test a source map with a names field that is not a valid list (object)", ++ "baseFile": "names-not-a-list-2.js", ++ "sourceMapFile": "names-not-a-list-2.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "namesNotString", ++ "description": "Test a source map with a names list that has non-string items", ++ "baseFile": "names-not-string.js", ++ "sourceMapFile": "names-not-string.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "ignoreListEmpty", ++ "description": "Test a source map with an ignore list that has no items", ++ "baseFile": "ignore-list-empty.js", ++ "sourceMapFile": "ignore-list-empty.js.map", ++ "sourceMapIsValid": true ++ }, ++ { ++ "name": "ignoreListValid1", ++ "description": "Test a source map with a simple valid ignore list", ++ "baseFile": "ignore-list-valid-1.js", ++ "sourceMapFile": "ignore-list-valid-1.js.map", ++ "sourceMapIsValid": true, ++ "testActions": [ ++ { ++ "actionType": "checkIgnoreList", ++ "present": ["empty-original.js"] ++ } ++ ] ++ }, ++ { ++ "name": "ignoreListWrongType1", ++ "description": "Test a source map with an ignore list with the wrong type of items", ++ "baseFile": "ignore-list-wrong-type-1.js", ++ "sourceMapFile": "ignore-list-wrong-type-1.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "ignoreListWrongType2", ++ "description": "Test a source map with an ignore list with the wrong type of items", ++ "baseFile": "ignore-list-wrong-type-2.js", ++ "sourceMapFile": "ignore-list-wrong-type-2.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "ignoreListWrongType3", ++ "description": "Test a source map with an ignore list that is not a list", ++ "baseFile": "ignore-list-wrong-type-3.js", ++ "sourceMapFile": "ignore-list-wrong-type-3.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "ignoreListWrongType4", ++ "description": "Test a source map with an ignore list with a negative index", ++ "baseFile": "ignore-list-wrong-type-4.js", ++ "sourceMapFile": "ignore-list-wrong-type-4.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "ignoreListOutOfBounds1", ++ "description": "Test a source map with an ignore list with an item with an out-of-bounds index (too big)", ++ "baseFile": "ignore-list-out-of-bounds-1.js", ++ "sourceMapFile": "ignore-list-out-of-bounds-1.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "ignoreListOutOfBounds2", ++ "description": "Test a source map with an ignore list with an item with an out-of-bounds index (too low)", ++ "baseFile": "ignore-list-out-of-bounds-2.js", ++ "sourceMapFile": "ignore-list-out-of-bounds-2.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "unrecognizedProperty", ++ "description": "Test a source map that has an extra field not explicitly encoded in the spec", ++ "baseFile": "unrecognized-property.js", ++ "sourceMapFile": "unrecognized-property.js.map", ++ "sourceMapIsValid": true ++ }, ++ { ++ "name": "invalidVLQDueToNonBase64Character", ++ "description": "Test a source map that has a mapping with an invalid non-base64 character", ++ "baseFile": "invalid-vlq-non-base64-char.js", ++ "sourceMapFile": "invalid-vlq-non-base64-char.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidVLQDueToMissingContinuationDigits", ++ "description": "Test a source map that has a mapping with an invalid VLQ that has a continuation bit but no continuing digits", ++ "baseFile": "invalid-vlq-missing-continuation.js", ++ "sourceMapFile": "invalid-vlq-missing-continuation.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidMappingNotAString1", ++ "description": "Test a source map that has an invalid mapping that is not a string (number)", ++ "baseFile": "invalid-mapping-not-a-string-1.js", ++ "sourceMapFile": "invalid-mapping-not-a-string-1.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidMappingNotAString2", ++ "description": "Test a source map that has an invalid mapping that is not a string (array)", ++ "baseFile": "invalid-mapping-not-a-string-2.js", ++ "sourceMapFile": "invalid-mapping-not-a-string-2.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidMappingSegmentBadSeparator", ++ "description": "Test a source map that uses separator characters not recognized in the spec", ++ "baseFile": "invalid-mapping-bad-separator.js", ++ "sourceMapFile": "invalid-mapping-bad-separator.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidMappingSegmentWithZeroFields", ++ "description": "Test a source map that has the wrong number (zero) of segments fields", ++ "baseFile": "invalid-mapping-segment-with-zero-fields.js", ++ "sourceMapFile": "invalid-mapping-segment-with-zero-fields.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidMappingSegmentWithTwoFields", ++ "description": "Test a source map that has the wrong number (two) of segments fields", ++ "baseFile": "invalid-mapping-segment-with-two-fields.js", ++ "sourceMapFile": "invalid-mapping-segment-with-two-fields.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidMappingSegmentWithThreeFields", ++ "description": "Test a source map that has the wrong number (three) of segments fields", ++ "baseFile": "invalid-mapping-segment-with-three-fields.js", ++ "sourceMapFile": "invalid-mapping-segment-with-three-fields.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidMappingSegmentWithSourceIndexOutOfBounds", ++ "description": "Test a source map that has a source index field that is out of bounds of the sources field", ++ "baseFile": "invalid-mapping-segment-source-index-out-of-bounds.js", ++ "sourceMapFile": "invalid-mapping-segment-source-index-out-of-bounds.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidMappingSegmentWithNameIndexOutOfBounds", ++ "description": "Test a source map that has a name index field that is out of bounds of the names field", ++ "baseFile": "invalid-mapping-segment-name-index-out-of-bounds.js", ++ "sourceMapFile": "invalid-mapping-segment-name-index-out-of-bounds.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidMappingSegmentWithNegativeColumn", ++ "description": "Test a source map that has an invalid negative non-relative column field", ++ "baseFile": "invalid-mapping-segment-negative-column.js", ++ "sourceMapFile": "invalid-mapping-segment-negative-column.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidMappingSegmentWithNegativeSourceIndex", ++ "description": "Test a source map that has an invalid negative non-relative source index field", ++ "baseFile": "invalid-mapping-segment-negative-source-index.js", ++ "sourceMapFile": "invalid-mapping-segment-negative-source-index.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidMappingSegmentWithNegativeOriginalLine", ++ "description": "Test a source map that has an invalid negative non-relative original line field", ++ "baseFile": "invalid-mapping-segment-negative-original-line.js", ++ "sourceMapFile": "invalid-mapping-segment-negative-original-line.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidMappingSegmentWithNegativeOriginalColumn", ++ "description": "Test a source map that has an invalid negative non-relative original column field", ++ "baseFile": "invalid-mapping-segment-negative-original-column.js", ++ "sourceMapFile": "invalid-mapping-segment-negative-original-column.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidMappingSegmentWithNegativeNameIndex", ++ "description": "Test a source map that has an invalid negative non-relative name index field", ++ "baseFile": "invalid-mapping-segment-negative-name-index.js", ++ "sourceMapFile": "invalid-mapping-segment-negative-name-index.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidMappingSegmentWithNegativeRelativeColumn", ++ "description": "Test a source map that has an invalid negative relative column field", ++ "baseFile": "invalid-mapping-segment-negative-relative-column.js", ++ "sourceMapFile": "invalid-mapping-segment-negative-relative-column.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidMappingSegmentWithNegativeRelativeSourceIndex", ++ "description": "Test a source map that has an invalid negative relative source index field", ++ "baseFile": "invalid-mapping-segment-negative-relative-source-index.js", ++ "sourceMapFile": "invalid-mapping-segment-negative-relative-source-index.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidMappingSegmentWithNegativeRelativeOriginalLine", ++ "description": "Test a source map that has an invalid negative relative original line field", ++ "baseFile": "invalid-mapping-segment-negative-relative-original-line.js", ++ "sourceMapFile": "invalid-mapping-segment-negative-relative-original-line.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidMappingSegmentWithNegativeRelativeOriginalColumn", ++ "description": "Test a source map that has an invalid negative relative original column field", ++ "baseFile": "invalid-mapping-segment-negative-relative-original-column.js", ++ "sourceMapFile": "invalid-mapping-segment-negative-relative-original-column.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidMappingSegmentWithNegativeRelativeNameIndex", ++ "description": "Test a source map that has an invalid negative relative name index field", ++ "baseFile": "invalid-mapping-segment-negative-relative-name-index.js", ++ "sourceMapFile": "invalid-mapping-segment-negative-relative-name-index.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidMappingSegmentWithColumnExceeding32Bits", ++ "description": "Test a source map that has a column field that exceeds 32 bits", ++ "baseFile": "invalid-mapping-segment-column-too-large.js", ++ "sourceMapFile": "invalid-mapping-segment-column-too-large.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidMappingSegmentWithSourceIndexExceeding32Bits", ++ "description": "Test a source map that has a source index field that exceeds 32 bits", ++ "baseFile": "invalid-mapping-segment-source-index-too-large.js", ++ "sourceMapFile": "invalid-mapping-segment-source-index-too-large.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidMappingSegmentWithOriginalLineExceeding32Bits", ++ "description": "Test a source map that has a original line field that exceeds 32 bits", ++ "baseFile": "invalid-mapping-segment-original-line-too-large.js", ++ "sourceMapFile": "invalid-mapping-segment-original-line-too-large.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidMappingSegmentWithOriginalColumnExceeding32Bits", ++ "description": "Test a source map that has an original column field that exceeds 32 bits", ++ "baseFile": "invalid-mapping-segment-original-column-too-large.js", ++ "sourceMapFile": "invalid-mapping-segment-original-column-too-large.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "invalidMappingSegmentWithNameIndexExceeding32Bits", ++ "description": "Test a source map that has a name index field that exceeds 32 bits", ++ "baseFile": "invalid-mapping-segment-name-index-too-large.js", ++ "sourceMapFile": "invalid-mapping-segment-name-index-too-large.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "validMappingFieldsWith32BitMaxValues", ++ "description": "Test a source map that has segment fields with max values representable in 32 bits", ++ "baseFile": "valid-mapping-boundary-values.js", ++ "sourceMapFile": "valid-mapping-boundary-values.js.map", ++ "sourceMapIsValid": true ++ }, ++ { ++ "name": "validMappingLargeVLQ", ++ "description": "Test a source map that has a segment field VLQ that is very long but within 32-bits", ++ "baseFile": "valid-mapping-large-vlq.js", ++ "sourceMapFile": "valid-mapping-large-vlq.js.map", ++ "sourceMapIsValid": true ++ }, ++ { ++ "name": "validMappingEmptyGroups", ++ "description": "Test a source map with a mapping that has many empty groups", ++ "baseFile": "valid-mapping-empty-groups.js", ++ "sourceMapFile": "valid-mapping-empty-groups.js.map", ++ "sourceMapIsValid": true ++ }, ++ { ++ "name": "validMappingEmptyString", ++ "description": "Test a source map with an empty string mapping", ++ "baseFile": "valid-mapping-empty-string.js", ++ "sourceMapFile": "valid-mapping-empty-string.js.map", ++ "sourceMapIsValid": true ++ }, ++ { ++ "name": "indexMapWrongTypeSections", ++ "description": "Test an index map with a sections field with the wrong type", ++ "baseFile": "index-map-wrong-type-sections.js", ++ "sourceMapFile": "index-map-wrong-type-sections.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "indexMapWrongTypeOffset", ++ "description": "Test an index map with an offset field with the wrong type", ++ "baseFile": "index-map-wrong-type-offset.js", ++ "sourceMapFile": "index-map-wrong-type-offset.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "indexMapWrongTypeMap", ++ "description": "Test an index map with a map field with the wrong type", ++ "baseFile": "index-map-wrong-type-map.js", ++ "sourceMapFile": "index-map-wrong-type-map.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "indexMapInvalidBaseMappings", ++ "description": "Test that an index map cannot also have a regular mappings field", ++ "baseFile": "index-map-invalid-base-mappings.js", ++ "sourceMapFile": "index-map-invalid-base-mappings.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "indexMapInvalidOverlap", ++ "description": "Test that an invalid index map with multiple sections that overlap", ++ "baseFile": "index-map-invalid-overlap.js", ++ "sourceMapFile": "index-map-invalid-overlap.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "indexMapInvalidOrder", ++ "description": "Test that an invalid index map with multiple sections in the wrong order", ++ "baseFile": "index-map-invalid-order.js", ++ "sourceMapFile": "index-map-invalid-order.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "indexMapMissingMap", ++ "description": "Test that an index map that is missing a section map", ++ "baseFile": "index-map-missing-map.js", ++ "sourceMapFile": "index-map-missing-map.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "indexMapInvalidSubMap", ++ "description": "Test that an index map that has an invalid section map", ++ "baseFile": "index-map-invalid-sub-map.js", ++ "sourceMapFile": "index-map-invalid-sub-map.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "indexMapMissingOffset", ++ "description": "Test that an index map that is missing a section offset", ++ "baseFile": "index-map-missing-offset.js", ++ "sourceMapFile": "index-map-missing-offset.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "indexMapMissingOffsetLine", ++ "description": "Test that an index map that is missing a section offset's line field", ++ "baseFile": "index-map-missing-offset-line.js", ++ "sourceMapFile": "index-map-missing-offset-line.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "indexMapMissingOffsetColumn", ++ "description": "Test that an index map that is missing a section offset's column field", ++ "baseFile": "index-map-missing-offset-column.js", ++ "sourceMapFile": "index-map-missing-offset-column.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "indexMapOffsetLineWrongType", ++ "description": "Test that an index map that has an offset line field with the wrong type of value", ++ "baseFile": "index-map-offset-line-wrong-type.js", ++ "sourceMapFile": "index-map-offset-line-wrong-type.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "indexMapOffsetColumnWrongType", ++ "description": "Test that an index map that has an offset column field with the wrong type of value", ++ "baseFile": "index-map-offset-column-wrong-type.js", ++ "sourceMapFile": "index-map-offset-column-wrong-type.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "indexMapEmptySections", ++ "description": "Test a trivial index map with no sections", ++ "baseFile": "index-map-empty-sections.js", ++ "sourceMapFile": "index-map-empty-sections.js.map", ++ "sourceMapIsValid": true ++ }, ++ { ++ "name": "indexMapFileWrongType1", ++ "description": "Test an index map with a file field with the wrong type", ++ "baseFile": "index-map-file-wrong-type-1.js", ++ "sourceMapFile": "index-map-file-wrong-type-1.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "indexMapFileWrongType2", ++ "description": "Test an index map with a file field with the wrong type", ++ "baseFile": "index-map-file-wrong-type-2.js", ++ "sourceMapFile": "index-map-file-wrong-type-2.js.map", ++ "sourceMapIsValid": false ++ }, ++ { ++ "name": "basicMapping", ++ "description": "Test a simple source map that has several valid mappings", ++ "baseFile": "basic-mapping.js", ++ "sourceMapFile": "basic-mapping.js.map", ++ "sourceMapIsValid": true, ++ "testActions": [ ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 0, ++ "originalSource": "basic-mapping-original.js", ++ "originalLine": 0, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 9, ++ "originalSource": "basic-mapping-original.js", ++ "originalLine": 0, ++ "originalColumn": 9, ++ "mappedName": "foo" ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 15, ++ "originalLine": 1, ++ "originalColumn": 2, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 22, ++ "originalLine": 1, ++ "originalColumn": 9, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 24, ++ "originalLine": 2, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 25, ++ "originalLine": 3, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 34, ++ "originalSource": "basic-mapping-original.js", ++ "originalLine": 3, ++ "originalColumn": 9, ++ "mappedName": "bar" ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 40, ++ "originalLine": 4, ++ "originalColumn": 2, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 47, ++ "originalLine": 4, ++ "originalColumn": 9, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 49, ++ "originalLine": 5, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 50, ++ "originalLine": 6, ++ "originalColumn": 0, ++ "mappedName": "foo" ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 56, ++ "originalLine": 7, ++ "originalColumn": 0, ++ "mappedName": "bar" ++ } ++ ] ++ }, ++ { ++ "name": "sourceRootResolution", ++ "description": "Similar to basic mapping test, but test resoultion of sources with a sourceRoot field", ++ "baseFile": "source-root-resolution.js", ++ "sourceMapFile": "source-root-resolution.js.map", ++ "sourceMapIsValid": true, ++ "testActions": [ ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 0, ++ "originalSource": "theroot/basic-mapping-original.js", ++ "originalLine": 0, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 9, ++ "originalSource": "theroot/basic-mapping-original.js", ++ "originalLine": 0, ++ "originalColumn": 9, ++ "mappedName": "foo" ++ } ++ ] ++ }, ++ { ++ "name": "sourceResolutionAbsoluteURL", ++ "description": "Test resoultion of sources with absolute URLs", ++ "baseFile": "source-resolution-absolute-url.js", ++ "sourceMapFile": "source-resolution-absolute-url.js.map", ++ "sourceMapIsValid": true, ++ "testActions": [ ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 0, ++ "originalSource": "/baz/quux/basic-mapping-original.js", ++ "originalLine": 0, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 9, ++ "originalSource": "/baz/quux/basic-mapping-original.js", ++ "originalLine": 0, ++ "originalColumn": 9, ++ "mappedName": "foo" ++ } ++ ] ++ }, ++ { ++ "name": "basicMappingWithIndexMap", ++ "description": "Test a version of basic-mapping.js.map that is split into sections with an index map", ++ "baseFile": "basic-mapping-as-index-map.js", ++ "sourceMapFile": "basic-mapping-as-index-map.js.map", ++ "sourceMapIsValid": true, ++ "testActions": [ ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 0, ++ "originalSource": "basic-mapping-original.js", ++ "originalLine": 0, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 9, ++ "originalSource": "basic-mapping-original.js", ++ "originalLine": 0, ++ "originalColumn": 9, ++ "mappedName": "foo" ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 15, ++ "originalLine": 1, ++ "originalColumn": 2, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 22, ++ "originalLine": 1, ++ "originalColumn": 9, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 24, ++ "originalLine": 2, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 25, ++ "originalLine": 3, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 34, ++ "originalSource": "basic-mapping-original.js", ++ "originalLine": 3, ++ "originalColumn": 9, ++ "mappedName": "bar" ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 40, ++ "originalLine": 4, ++ "originalColumn": 2, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 47, ++ "originalLine": 4, ++ "originalColumn": 9, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 49, ++ "originalLine": 5, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 50, ++ "originalLine": 6, ++ "originalColumn": 0, ++ "mappedName": "foo" ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 56, ++ "originalLine": 7, ++ "originalColumn": 0, ++ "mappedName": "bar" ++ } ++ ] ++ }, ++ { ++ "name": "indexMapWithMissingFile", ++ "description": "Same as the basic mapping index map test but without the optional file field", ++ "baseFile": "index-map-missing-file.js", ++ "sourceMapFile": "index-map-missing-file.js.map", ++ "sourceMapIsValid": true, ++ "testActions": [ ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 0, ++ "originalSource": "basic-mapping-original.js", ++ "originalLine": 0, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 9, ++ "originalSource": "basic-mapping-original.js", ++ "originalLine": 0, ++ "originalColumn": 9, ++ "mappedName": "foo" ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 15, ++ "originalLine": 1, ++ "originalColumn": 2, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 22, ++ "originalLine": 1, ++ "originalColumn": 9, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 24, ++ "originalLine": 2, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 25, ++ "originalLine": 3, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 34, ++ "originalSource": "basic-mapping-original.js", ++ "originalLine": 3, ++ "originalColumn": 9, ++ "mappedName": "bar" ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 40, ++ "originalLine": 4, ++ "originalColumn": 2, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 47, ++ "originalLine": 4, ++ "originalColumn": 9, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 49, ++ "originalLine": 5, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 50, ++ "originalLine": 6, ++ "originalColumn": 0, ++ "mappedName": "foo" ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 56, ++ "originalLine": 7, ++ "originalColumn": 0, ++ "mappedName": "bar" ++ } ++ ] ++ }, ++ { ++ "name": "indexMapWithTwoConcatenatedSources", ++ "description": "Test an index map that has two sub-maps for concatenated sources", ++ "baseFile": "index-map-two-concatenated-sources.js", ++ "sourceMapFile": "index-map-two-concatenated-sources.js.map", ++ "sourceMapIsValid": true, ++ "testActions": [ ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 0, ++ "originalSource": "basic-mapping-original.js", ++ "originalLine": 0, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 9, ++ "originalSource": "basic-mapping-original.js", ++ "originalLine": 0, ++ "originalColumn": 9, ++ "mappedName": "foo" ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 15, ++ "originalLine": 1, ++ "originalColumn": 2, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 22, ++ "originalLine": 1, ++ "originalColumn": 9, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 24, ++ "originalLine": 2, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 25, ++ "originalLine": 3, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 34, ++ "originalSource": "basic-mapping-original.js", ++ "originalLine": 3, ++ "originalColumn": 9, ++ "mappedName": "bar" ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 40, ++ "originalLine": 4, ++ "originalColumn": 2, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 47, ++ "originalLine": 4, ++ "originalColumn": 9, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 49, ++ "originalLine": 5, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 50, ++ "originalLine": 6, ++ "originalColumn": 0, ++ "mappedName": "foo" ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "basic-mapping-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 56, ++ "originalLine": 7, ++ "originalColumn": 0, ++ "mappedName": "bar" ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "second-source-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 62, ++ "originalLine": 0, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "second-source-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 71, ++ "originalLine": 0, ++ "originalColumn": 9, ++ "mappedName": "baz" ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "second-source-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 77, ++ "originalLine": 1, ++ "originalColumn": 2, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "second-source-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 83, ++ "originalLine": 1, ++ "originalColumn": 9, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "second-source-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 88, ++ "originalLine": 2, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "originalSource": "second-source-original.js", ++ "generatedLine": 0, ++ "generatedColumn": 89, ++ "originalLine": 3, ++ "originalColumn": 0, ++ "mappedName": "baz" ++ } ++ ] ++ }, ++ { ++ "name": "sourcesNullSourcesContentNonNull", ++ "description": "Test a source map that has a null source but has a sourcesContent", ++ "baseFile": "sources-null-sources-content-non-null.js", ++ "sourceMapFile": "sources-null-sources-content-non-null.js.map", ++ "sourceMapIsValid": true, ++ "testActions": [ ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 0, ++ "originalSource": null, ++ "originalLine": 0, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 9, ++ "originalSource": null, ++ "originalLine": 0, ++ "originalColumn": 9, ++ "mappedName": "foo" ++ } ++ ] ++ }, ++ { ++ "name": "sourcesNonNullSourcesContentNull", ++ "description": "Test a source map that has a non-null source but has a null sourcesContent", ++ "baseFile": "sources-non-null-sources-content-null.js", ++ "sourceMapFile": "sources-non-null-sources-content-null.js.map", ++ "sourceMapIsValid": true, ++ "testActions": [ ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 0, ++ "originalSource": "basic-mapping-original.js", ++ "originalLine": 0, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 9, ++ "originalSource": "basic-mapping-original.js", ++ "originalLine": 0, ++ "originalColumn": 9, ++ "mappedName": "foo" ++ } ++ ] ++ }, ++ { ++ "name": "transitiveMapping", ++ "description": "Test a simple two-stage transitive mapping from a minified JS to a TypeScript source", ++ "baseFile": "transitive-mapping.js", ++ "sourceMapFile": "transitive-mapping.js.map", ++ "sourceMapIsValid": true, ++ "testActions": [ ++ { ++ "actionType": "checkMappingTransitive", ++ "generatedLine": 0, ++ "generatedColumn": 0, ++ "originalSource": "typescript-original.ts", ++ "intermediateMaps": ["transitive-mapping-original.js.map"], ++ "originalLine": 1, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMappingTransitive", ++ "generatedLine": 0, ++ "generatedColumn": 9, ++ "originalSource": "typescript-original.ts", ++ "intermediateMaps": ["transitive-mapping-original.js.map"], ++ "originalLine": 1, ++ "originalColumn": 9, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMappingTransitive", ++ "generatedLine": 0, ++ "generatedColumn": 13, ++ "originalSource": "typescript-original.ts", ++ "intermediateMaps": ["transitive-mapping-original.js.map"], ++ "originalLine": 1, ++ "originalColumn": 13, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMappingTransitive", ++ "generatedLine": 0, ++ "generatedColumn": 16, ++ "originalSource": "typescript-original.ts", ++ "intermediateMaps": ["transitive-mapping-original.js.map"], ++ "originalLine": 2, ++ "originalColumn": 2, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMappingTransitive", ++ "generatedLine": 0, ++ "generatedColumn": 23, ++ "originalSource": "typescript-original.ts", ++ "intermediateMaps": ["transitive-mapping-original.js.map"], ++ "originalLine": 2, ++ "originalColumn": 9, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMappingTransitive", ++ "generatedLine": 0, ++ "generatedColumn": 24, ++ "originalSource": "typescript-original.ts", ++ "intermediateMaps": ["transitive-mapping-original.js.map"], ++ "originalLine": 3, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMappingTransitive", ++ "generatedLine": 0, ++ "generatedColumn": 25, ++ "originalSource": "typescript-original.ts", ++ "intermediateMaps": ["transitive-mapping-original.js.map"], ++ "originalLine": 4, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMappingTransitive", ++ "generatedLine": 0, ++ "generatedColumn": 29, ++ "originalSource": "typescript-original.ts", ++ "intermediateMaps": ["transitive-mapping-original.js.map"], ++ "originalLine": 4, ++ "originalColumn": 4, ++ "mappedName": null ++ } ++ ] ++ }, ++ { ++ "name": "transitiveMappingWithThreeSteps", ++ "description": "Test a three-stage transitive mapping from an un-minified JS to minified JS to a TypeScript source", ++ "baseFile": "transitive-mapping-three-steps.js", ++ "sourceMapFile": "transitive-mapping-three-steps.js.map", ++ "sourceMapIsValid": true, ++ "testActions": [ ++ { ++ "actionType": "checkMappingTransitive", ++ "generatedLine": 0, ++ "generatedColumn": 0, ++ "originalSource": "typescript-original.ts", ++ "intermediateMaps": ["transitive-mapping.js.map", "transitive-mapping-original.js.map"], ++ "originalLine": 1, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMappingTransitive", ++ "generatedLine": 0, ++ "generatedColumn": 9, ++ "originalSource": "typescript-original.ts", ++ "intermediateMaps": ["transitive-mapping.js.map", "transitive-mapping-original.js.map"], ++ "originalLine": 1, ++ "originalColumn": 9, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMappingTransitive", ++ "generatedLine": 0, ++ "generatedColumn": 13, ++ "originalSource": "typescript-original.ts", ++ "intermediateMaps": ["transitive-mapping.js.map", "transitive-mapping-original.js.map"], ++ "originalLine": 1, ++ "originalColumn": 13, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMappingTransitive", ++ "generatedLine": 1, ++ "generatedColumn": 4, ++ "originalSource": "typescript-original.ts", ++ "intermediateMaps": ["transitive-mapping.js.map", "transitive-mapping-original.js.map"], ++ "originalLine": 2, ++ "originalColumn": 2, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMappingTransitive", ++ "generatedLine": 1, ++ "generatedColumn": 11, ++ "originalSource": "typescript-original.ts", ++ "intermediateMaps": ["transitive-mapping.js.map", "transitive-mapping-original.js.map"], ++ "originalLine": 2, ++ "originalColumn": 9, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMappingTransitive", ++ "generatedLine": 2, ++ "generatedColumn": 0, ++ "originalSource": "typescript-original.ts", ++ "intermediateMaps": ["transitive-mapping.js.map", "transitive-mapping-original.js.map"], ++ "originalLine": 3, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMappingTransitive", ++ "generatedLine": 4, ++ "generatedColumn": 0, ++ "originalSource": "typescript-original.ts", ++ "intermediateMaps": ["transitive-mapping.js.map", "transitive-mapping-original.js.map"], ++ "originalLine": 4, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMappingTransitive", ++ "generatedLine": 4, ++ "generatedColumn": 4, ++ "originalSource": "typescript-original.ts", ++ "intermediateMaps": ["transitive-mapping.js.map", "transitive-mapping-original.js.map"], ++ "originalLine": 4, ++ "originalColumn": 4, ++ "mappedName": null ++ } ++ ] ++ }, ++ { ++ "name": "vlqValidSingleDigit", ++ "description": "Test VLQ decoding for a single digit, no continuation VLQ", ++ "baseFile": "vlq-valid-single-digit.js", ++ "sourceMapFile": "vlq-valid-single-digit.js.map", ++ "sourceMapIsValid": true, ++ "testActions": [ ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 15, ++ "originalSource": "vlq-valid-single-digit-original.js", ++ "originalLine": 0, ++ "originalColumn": 0, ++ "mappedName": null ++ } ++ ] ++ }, ++ { ++ "name": "vlqValidNegativeDigit", ++ "description": "Test VLQ decoding where there's a negative digit, no continuation bit", ++ "baseFile": "vlq-valid-negative-digit.js", ++ "sourceMapFile": "vlq-valid-negative-digit.js.map", ++ "sourceMapIsValid": true, ++ "testActions": [ ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 2, ++ "generatedColumn": 15, ++ "originalSource": "vlq-valid-negative-digit-original.js", ++ "originalLine": 1, ++ "originalColumn": 3, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 2, ++ "generatedColumn": 2, ++ "originalSource": "vlq-valid-negative-digit-original.js", ++ "originalLine": 1, ++ "originalColumn": 1, ++ "mappedName": null ++ } ++ ] ++ }, ++ { ++ "name": "vlqValidContinuationBitPresent1", ++ "description": "Test VLQ decoding where continuation bits are present (continuations are leading zero)", ++ "baseFile": "vlq-valid-continuation-bit-present-1.js", ++ "sourceMapFile": "vlq-valid-continuation-bit-present-1.js.map", ++ "sourceMapIsValid": true, ++ "testActions": [ ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 15, ++ "originalSource": "vlq-valid-continuation-bit-present-1-original.js", ++ "originalLine": 0, ++ "originalColumn": 1, ++ "mappedName": null ++ } ++ ] ++ }, ++ { ++ "name": "vlqValidContinuationBitPresent2", ++ "description": "Test VLQ decoding where continuation bits are present (continuations have non-zero bits)", ++ "baseFile": "vlq-valid-continuation-bit-present-2.js", ++ "sourceMapFile": "vlq-valid-continuation-bit-present-2.js.map", ++ "sourceMapIsValid": true, ++ "testActions": [ ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 2, ++ "generatedColumn": 16, ++ "originalSource": "vlq-valid-continuation-bit-present-2-original.js", ++ "originalLine": 1, ++ "originalColumn": 1, ++ "mappedName": null ++ } ++ ] ++ }, ++ { ++ "name": "mappingSemanticsSingleFieldSegment", ++ "description": "Test mapping semantics for a single field segment mapping", ++ "baseFile": "mapping-semantics-single-field-segment.js", ++ "sourceMapFile": "mapping-semantics-single-field-segment.js.map", ++ "sourceMapIsValid": true, ++ "testActions": [ ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 0, ++ "originalSource": "mapping-semantics-single-field-segment-original.js", ++ "originalLine": 0, ++ "originalColumn": 1, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 2, ++ "originalSource": null, ++ "originalLine": null, ++ "originalColumn": null, ++ "mappedName": null ++ } ++ ] ++ }, ++ { ++ "name": "mappingSemanticsFourFieldSegment", ++ "description": "Test mapping semantics for a four field segment mapping", ++ "baseFile": "mapping-semantics-four-field-segment.js", ++ "sourceMapFile": "mapping-semantics-four-field-segment.js.map", ++ "sourceMapIsValid": true, ++ "testActions": [ ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 1, ++ "originalSource": "mapping-semantics-four-field-segment-original.js", ++ "originalLine": 2, ++ "originalColumn": 2, ++ "mappedName": null ++ } ++ ] ++ }, ++ { ++ "name": "mappingSemanticsFiveFieldSegment", ++ "description": "Test mapping semantics for a five field segment mapping", ++ "baseFile": "mapping-semantics-five-field-segment.js", ++ "sourceMapFile": "mapping-semantics-five-field-segment.js.map", ++ "sourceMapIsValid": true, ++ "testActions": [ ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 1, ++ "originalSource": "mapping-semantics-five-field-segment-original.js", ++ "originalLine": 2, ++ "originalColumn": 2, ++ "mappedName": "foo" ++ } ++ ] ++ }, ++ { ++ "name": "mappingSemanticsColumnReset", ++ "description": "Test that the generated column field resets to zero on new lines", ++ "baseFile": "mapping-semantics-column-reset.js", ++ "sourceMapFile": "mapping-semantics-column-reset.js.map", ++ "sourceMapIsValid": true, ++ "testActions": [ ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 1, ++ "originalSource": "mapping-semantics-column-reset-original.js", ++ "originalLine": 0, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 1, ++ "generatedColumn": 1, ++ "originalSource": "mapping-semantics-column-reset-original.js", ++ "originalLine": 1, ++ "originalColumn": 0, ++ "mappedName": null ++ } ++ ] ++ }, ++ { ++ "name": "mappingSemanticsRelative1", ++ "description": "Test that fields are calculated relative to previous ones", ++ "baseFile": "mapping-semantics-relative-1.js", ++ "sourceMapFile": "mapping-semantics-relative-1.js.map", ++ "sourceMapIsValid": true, ++ "testActions": [ ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 1, ++ "originalSource": "mapping-semantics-relative-1-original.js", ++ "originalLine": 0, ++ "originalColumn": 0, ++ "mappedName": null ++ }, ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 5, ++ "originalSource": "mapping-semantics-relative-1-original.js", ++ "originalLine": 0, ++ "originalColumn": 4, ++ "mappedName": null ++ } ++ ] ++ }, ++ { ++ "name": "mappingSemanticsRelative2", ++ "description": "Test that fields are calculated relative to previous ones, across lines", ++ "baseFile": "mapping-semantics-relative-2.js", ++ "sourceMapFile": "mapping-semantics-relative-2.js.map", ++ "sourceMapIsValid": true, ++ "testActions": [ ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 0, ++ "generatedColumn": 1, ++ "originalSource": "mapping-semantics-relative-2-original.js", ++ "originalLine": 0, ++ "originalColumn": 2, ++ "mappedName": "foo" ++ }, ++ { ++ "actionType": "checkMapping", ++ "generatedLine": 1, ++ "generatedColumn": 2, ++ "originalSource": "mapping-semantics-relative-2-original.js", ++ "originalLine": 1, ++ "originalColumn": 2, ++ "mappedName": "bar" ++ } ++ ] ++ } ++ ] ++} +diff --git a/LayoutTests/imported/tg4/source-map-tests/webkit/0001-Add-harness-for-source-maps-spec-tests.patch b/LayoutTests/imported/tg4/source-map-tests/webkit/0001-Add-harness-for-source-maps-spec-tests.patch +new file mode 100644 +index 000000000000..050bf042bac6 +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/webkit/0001-Add-harness-for-source-maps-spec-tests.patch +@@ -0,0 +1,1649 @@ ++From d2ac7108de0b2a76e072ba8d7d4a9e733d3782ef Mon Sep 17 00:00:00 2001 ++From: Asumu Takikawa ++Date: Mon, 11 Mar 2024 13:41:31 -0700 ++Subject: [PATCH] Add harness for source maps spec tests ++ ++Need a short description (OOPS!). ++Need the bug URL (OOPS!). ++ ++Reviewed by NOBODY (OOPS!). ++ ++Explanation of why this fixes the bug (OOPS!). ++ ++* LayoutTests/inspector/model/resources/basic-mapping-as-index-map.js: Added. ++(foo): ++(bar): ++* LayoutTests/inspector/model/resources/basic-mapping-as-index-map.js.map: Added. ++* LayoutTests/inspector/model/resources/basic-mapping-original.js: Added. ++(foo): ++(bar): ++* LayoutTests/inspector/model/resources/basic-mapping.js: Added. ++(foo): ++(bar): ++* LayoutTests/inspector/model/resources/basic-mapping.js.map: Added. ++* LayoutTests/inspector/model/resources/invalid-mapping-bad-separator.js: Added. ++(foo): ++(bar): ++* LayoutTests/inspector/model/resources/invalid-mapping-bad-separator.js.map: Added. ++* LayoutTests/inspector/model/resources/invalid-mapping-not-a-string-1.js: Added. ++* LayoutTests/inspector/model/resources/invalid-mapping-not-a-string-1.js.map: Added. ++* LayoutTests/inspector/model/resources/invalid-mapping-not-a-string-2.js: Added. ++* LayoutTests/inspector/model/resources/invalid-mapping-not-a-string-2.js.map: Added. ++* LayoutTests/inspector/model/resources/invalid-mapping-segment-column-too-large.js: Added. ++* LayoutTests/inspector/model/resources/invalid-mapping-segment-column-too-large.js.map: Added. ++* LayoutTests/inspector/model/resources/invalid-mapping-segment-name-index-out-of-bounds.js: Added. ++* LayoutTests/inspector/model/resources/invalid-mapping-segment-name-index-out-of-bounds.js.map: Added. ++* LayoutTests/inspector/model/resources/invalid-mapping-segment-name-index-too-large.js: Added. ++* LayoutTests/inspector/model/resources/invalid-mapping-segment-name-index-too-large.js.map: Added. ++* LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-column.js: Added. ++* LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-column.js.map: Added. ++* LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-name-index.js: Added. ++* LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-name-index.js.map: Added. ++* LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-original-column.js: Added. ++* LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-original-column.js.map: Added. ++* LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-original-line.js: Added. ++* LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-original-line.js.map: Added. ++* LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-source-index.js: Added. ++* LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-source-index.js.map: Added. ++* LayoutTests/inspector/model/resources/invalid-mapping-segment-original-column-too-large.js: Added. ++* LayoutTests/inspector/model/resources/invalid-mapping-segment-original-column-too-large.js.map: Added. ++* LayoutTests/inspector/model/resources/invalid-mapping-segment-original-line-too-large.js: Added. ++* LayoutTests/inspector/model/resources/invalid-mapping-segment-original-line-too-large.js.map: Added. ++* LayoutTests/inspector/model/resources/invalid-mapping-segment-source-index-out-of-bounds.js: Added. ++* LayoutTests/inspector/model/resources/invalid-mapping-segment-source-index-out-of-bounds.js.map: Added. ++* LayoutTests/inspector/model/resources/invalid-mapping-segment-source-index-too-large.js: Added. ++* LayoutTests/inspector/model/resources/invalid-mapping-segment-source-index-too-large.js.map: Added. ++* LayoutTests/inspector/model/resources/invalid-mapping-segment-with-three-fields.js: Added. ++(foo): ++(bar): ++* LayoutTests/inspector/model/resources/invalid-mapping-segment-with-three-fields.js.map: Added. ++* LayoutTests/inspector/model/resources/invalid-mapping-segment-with-two-fields.js: Added. ++(foo): ++(bar): ++* LayoutTests/inspector/model/resources/invalid-mapping-segment-with-two-fields.js.map: Added. ++* LayoutTests/inspector/model/resources/invalid-mapping-segment-with-zero-fields.js: Added. ++* LayoutTests/inspector/model/resources/invalid-mapping-segment-with-zero-fields.js.map: Added. ++* LayoutTests/inspector/model/resources/invalid-vlq-non-base64-char.js: Added. ++* LayoutTests/inspector/model/resources/invalid-vlq-non-base64-char.js.map: Added. ++* LayoutTests/inspector/model/resources/names-missing.js: Added. ++* LayoutTests/inspector/model/resources/names-missing.js.map: Added. ++* LayoutTests/inspector/model/resources/names-not-a-list-1.js: Added. ++* LayoutTests/inspector/model/resources/names-not-a-list-1.js.map: Added. ++* LayoutTests/inspector/model/resources/names-not-a-list-2.js: Added. ++* LayoutTests/inspector/model/resources/names-not-a-list-2.js.map: Added. ++* LayoutTests/inspector/model/resources/source-map-spec-tests.json: Added. ++* LayoutTests/inspector/model/resources/sources-missing.js: Added. ++* LayoutTests/inspector/model/resources/sources-missing.js.map: Added. ++* LayoutTests/inspector/model/resources/sources-not-a-list-1.js: Added. ++* LayoutTests/inspector/model/resources/sources-not-a-list-1.js.map: Added. ++* LayoutTests/inspector/model/resources/sources-not-a-list-2.js: Added. ++* LayoutTests/inspector/model/resources/sources-not-a-list-2.js.map: Added. ++* LayoutTests/inspector/model/resources/unrecognized-property.js: Added. ++* LayoutTests/inspector/model/resources/unrecognized-property.js.map: Added. ++* LayoutTests/inspector/model/resources/valid-mapping-boundary-values.js: Added. ++* LayoutTests/inspector/model/resources/valid-mapping-boundary-values.js.map: Added. ++* LayoutTests/inspector/model/resources/valid-mapping-empty-groups.js: Added. ++* LayoutTests/inspector/model/resources/valid-mapping-empty-groups.js.map: Added. ++* LayoutTests/inspector/model/resources/valid-mapping-large-vlq.js: Added. ++* LayoutTests/inspector/model/resources/valid-mapping-large-vlq.js.map: Added. ++* LayoutTests/inspector/model/resources/valid-mapping-null-sources.js: Added. ++(foo): ++(bar): ++* LayoutTests/inspector/model/resources/valid-mapping-null-sources.js.map: Added. ++* LayoutTests/inspector/model/resources/version-not-a-number.js: Added. ++* LayoutTests/inspector/model/resources/version-not-a-number.js.map: Added. ++* LayoutTests/inspector/model/resources/version-numeric-string.js: Added. ++* LayoutTests/inspector/model/resources/version-numeric-string.js.map: Added. ++* LayoutTests/inspector/model/resources/version-too-high.js: Added. ++* LayoutTests/inspector/model/resources/version-too-high.js.map: Added. ++* LayoutTests/inspector/model/resources/version-too-low.js: Added. ++* LayoutTests/inspector/model/resources/version-too-low.js.map: Added. ++* LayoutTests/inspector/model/resources/version-valid.js: Added. ++* LayoutTests/inspector/model/resources/version-valid.js.map: Added. ++* LayoutTests/inspector/model/source-map-spec-expected.txt: Added. ++* LayoutTests/inspector/model/source-map-spec.html: Added. ++--- ++ .../resources/basic-mapping-as-index-map.js | 2 + ++ .../basic-mapping-as-index-map.js.map | 23 + ++ .../model/resources/basic-mapping-original.js | 8 + ++ .../model/resources/basic-mapping.js | 2 + ++ .../model/resources/basic-mapping.js.map | 6 + ++ .../invalid-mapping-bad-separator.js | 2 + ++ .../invalid-mapping-bad-separator.js.map | 6 + ++ .../invalid-mapping-not-a-string-1.js | 1 + ++ .../invalid-mapping-not-a-string-1.js.map | 7 + ++ .../invalid-mapping-not-a-string-2.js | 1 + ++ .../invalid-mapping-not-a-string-2.js.map | 7 + ++ ...nvalid-mapping-segment-column-too-large.js | 1 + ++ ...id-mapping-segment-column-too-large.js.map | 7 + ++ ...apping-segment-name-index-out-of-bounds.js | 1 + ++ ...ng-segment-name-index-out-of-bounds.js.map | 7 + ++ ...id-mapping-segment-name-index-too-large.js | 1 + ++ ...apping-segment-name-index-too-large.js.map | 7 + ++ ...invalid-mapping-segment-negative-column.js | 1 + ++ ...lid-mapping-segment-negative-column.js.map | 7 + ++ ...lid-mapping-segment-negative-name-index.js | 1 + ++ ...mapping-segment-negative-name-index.js.map | 7 + ++ ...apping-segment-negative-original-column.js | 1 + ++ ...ng-segment-negative-original-column.js.map | 7 + ++ ...-mapping-segment-negative-original-line.js | 1 + ++ ...ping-segment-negative-original-line.js.map | 7 + ++ ...d-mapping-segment-negative-source-index.js | 1 + ++ ...pping-segment-negative-source-index.js.map | 7 + ++ ...pping-segment-original-column-too-large.js | 1 + ++ ...g-segment-original-column-too-large.js.map | 7 + ++ ...mapping-segment-original-line-too-large.js | 1 + ++ ...ing-segment-original-line-too-large.js.map | 7 + ++ ...ping-segment-source-index-out-of-bounds.js | 1 + ++ ...-segment-source-index-out-of-bounds.js.map | 7 + ++ ...-mapping-segment-source-index-too-large.js | 1 + ++ ...ping-segment-source-index-too-large.js.map | 7 + ++ ...valid-mapping-segment-with-three-fields.js | 2 + ++ ...d-mapping-segment-with-three-fields.js.map | 6 + ++ ...invalid-mapping-segment-with-two-fields.js | 2 + ++ ...lid-mapping-segment-with-two-fields.js.map | 6 + ++ ...nvalid-mapping-segment-with-zero-fields.js | 1 + ++ ...id-mapping-segment-with-zero-fields.js.map | 7 + ++ .../resources/invalid-vlq-non-base64-char.js | 1 + ++ .../invalid-vlq-non-base64-char.js.map | 6 + ++ .../model/resources/names-missing.js | 1 + ++ .../model/resources/names-missing.js.map | 5 + ++ .../model/resources/names-not-a-list-1.js | 1 + ++ .../model/resources/names-not-a-list-1.js.map | 6 + ++ .../model/resources/names-not-a-list-2.js | 1 + ++ .../model/resources/names-not-a-list-2.js.map | 6 + ++ .../resources/source-map-spec-tests.json | 503 ++++++++++++++++++ ++ .../model/resources/sources-missing.js | 1 + ++ .../model/resources/sources-missing.js.map | 5 + ++ .../model/resources/sources-not-a-list-1.js | 1 + ++ .../resources/sources-not-a-list-1.js.map | 6 + ++ .../model/resources/sources-not-a-list-2.js | 1 + ++ .../resources/sources-not-a-list-2.js.map | 6 + ++ .../model/resources/unrecognized-property.js | 1 + ++ .../resources/unrecognized-property.js.map | 8 + ++ .../valid-mapping-boundary-values.js | 1 + ++ .../valid-mapping-boundary-values.js.map | 7 + ++ .../resources/valid-mapping-empty-groups.js | 1 + ++ .../valid-mapping-empty-groups.js.map | 7 + ++ .../resources/valid-mapping-large-vlq.js | 1 + ++ .../resources/valid-mapping-large-vlq.js.map | 6 + ++ .../resources/valid-mapping-null-sources.js | 2 + ++ .../valid-mapping-null-sources.js.map | 6 + ++ .../model/resources/version-not-a-number.js | 1 + ++ .../resources/version-not-a-number.js.map | 6 + ++ .../model/resources/version-numeric-string.js | 1 + ++ .../resources/version-numeric-string.js.map | 6 + ++ .../model/resources/version-too-high.js | 1 + ++ .../model/resources/version-too-high.js.map | 6 + ++ .../model/resources/version-too-low.js | 1 + ++ .../model/resources/version-too-low.js.map | 6 + ++ .../model/resources/version-valid.js | 1 + ++ .../model/resources/version-valid.js.map | 6 + ++ .../model/source-map-spec-expected.txt | 22 + ++ .../inspector/model/source-map-spec.html | 83 +++ ++ 78 files changed, 915 insertions(+) ++ create mode 100644 LayoutTests/inspector/model/resources/basic-mapping-as-index-map.js ++ create mode 100644 LayoutTests/inspector/model/resources/basic-mapping-as-index-map.js.map ++ create mode 100644 LayoutTests/inspector/model/resources/basic-mapping-original.js ++ create mode 100644 LayoutTests/inspector/model/resources/basic-mapping.js ++ create mode 100644 LayoutTests/inspector/model/resources/basic-mapping.js.map ++ create mode 100644 LayoutTests/inspector/model/resources/invalid-mapping-bad-separator.js ++ create mode 100644 LayoutTests/inspector/model/resources/invalid-mapping-bad-separator.js.map ++ create mode 100644 LayoutTests/inspector/model/resources/invalid-mapping-not-a-string-1.js ++ create mode 100644 LayoutTests/inspector/model/resources/invalid-mapping-not-a-string-1.js.map ++ create mode 100644 LayoutTests/inspector/model/resources/invalid-mapping-not-a-string-2.js ++ create mode 100644 LayoutTests/inspector/model/resources/invalid-mapping-not-a-string-2.js.map ++ create mode 100644 LayoutTests/inspector/model/resources/invalid-mapping-segment-column-too-large.js ++ create mode 100644 LayoutTests/inspector/model/resources/invalid-mapping-segment-column-too-large.js.map ++ create mode 100644 LayoutTests/inspector/model/resources/invalid-mapping-segment-name-index-out-of-bounds.js ++ create mode 100644 LayoutTests/inspector/model/resources/invalid-mapping-segment-name-index-out-of-bounds.js.map ++ create mode 100644 LayoutTests/inspector/model/resources/invalid-mapping-segment-name-index-too-large.js ++ create mode 100644 LayoutTests/inspector/model/resources/invalid-mapping-segment-name-index-too-large.js.map ++ create mode 100644 LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-column.js ++ create mode 100644 LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-column.js.map ++ create mode 100644 LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-name-index.js ++ create mode 100644 LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-name-index.js.map ++ create mode 100644 LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-original-column.js ++ create mode 100644 LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-original-column.js.map ++ create mode 100644 LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-original-line.js ++ create mode 100644 LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-original-line.js.map ++ create mode 100644 LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-source-index.js ++ create mode 100644 LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-source-index.js.map ++ create mode 100644 LayoutTests/inspector/model/resources/invalid-mapping-segment-original-column-too-large.js ++ create mode 100644 LayoutTests/inspector/model/resources/invalid-mapping-segment-original-column-too-large.js.map ++ create mode 100644 LayoutTests/inspector/model/resources/invalid-mapping-segment-original-line-too-large.js ++ create mode 100644 LayoutTests/inspector/model/resources/invalid-mapping-segment-original-line-too-large.js.map ++ create mode 100644 LayoutTests/inspector/model/resources/invalid-mapping-segment-source-index-out-of-bounds.js ++ create mode 100644 LayoutTests/inspector/model/resources/invalid-mapping-segment-source-index-out-of-bounds.js.map ++ create mode 100644 LayoutTests/inspector/model/resources/invalid-mapping-segment-source-index-too-large.js ++ create mode 100644 LayoutTests/inspector/model/resources/invalid-mapping-segment-source-index-too-large.js.map ++ create mode 100644 LayoutTests/inspector/model/resources/invalid-mapping-segment-with-three-fields.js ++ create mode 100644 LayoutTests/inspector/model/resources/invalid-mapping-segment-with-three-fields.js.map ++ create mode 100644 LayoutTests/inspector/model/resources/invalid-mapping-segment-with-two-fields.js ++ create mode 100644 LayoutTests/inspector/model/resources/invalid-mapping-segment-with-two-fields.js.map ++ create mode 100644 LayoutTests/inspector/model/resources/invalid-mapping-segment-with-zero-fields.js ++ create mode 100644 LayoutTests/inspector/model/resources/invalid-mapping-segment-with-zero-fields.js.map ++ create mode 100644 LayoutTests/inspector/model/resources/invalid-vlq-non-base64-char.js ++ create mode 100644 LayoutTests/inspector/model/resources/invalid-vlq-non-base64-char.js.map ++ create mode 100644 LayoutTests/inspector/model/resources/names-missing.js ++ create mode 100644 LayoutTests/inspector/model/resources/names-missing.js.map ++ create mode 100644 LayoutTests/inspector/model/resources/names-not-a-list-1.js ++ create mode 100644 LayoutTests/inspector/model/resources/names-not-a-list-1.js.map ++ create mode 100644 LayoutTests/inspector/model/resources/names-not-a-list-2.js ++ create mode 100644 LayoutTests/inspector/model/resources/names-not-a-list-2.js.map ++ create mode 100644 LayoutTests/inspector/model/resources/source-map-spec-tests.json ++ create mode 100644 LayoutTests/inspector/model/resources/sources-missing.js ++ create mode 100644 LayoutTests/inspector/model/resources/sources-missing.js.map ++ create mode 100644 LayoutTests/inspector/model/resources/sources-not-a-list-1.js ++ create mode 100644 LayoutTests/inspector/model/resources/sources-not-a-list-1.js.map ++ create mode 100644 LayoutTests/inspector/model/resources/sources-not-a-list-2.js ++ create mode 100644 LayoutTests/inspector/model/resources/sources-not-a-list-2.js.map ++ create mode 100644 LayoutTests/inspector/model/resources/unrecognized-property.js ++ create mode 100644 LayoutTests/inspector/model/resources/unrecognized-property.js.map ++ create mode 100644 LayoutTests/inspector/model/resources/valid-mapping-boundary-values.js ++ create mode 100644 LayoutTests/inspector/model/resources/valid-mapping-boundary-values.js.map ++ create mode 100644 LayoutTests/inspector/model/resources/valid-mapping-empty-groups.js ++ create mode 100644 LayoutTests/inspector/model/resources/valid-mapping-empty-groups.js.map ++ create mode 100644 LayoutTests/inspector/model/resources/valid-mapping-large-vlq.js ++ create mode 100644 LayoutTests/inspector/model/resources/valid-mapping-large-vlq.js.map ++ create mode 100644 LayoutTests/inspector/model/resources/valid-mapping-null-sources.js ++ create mode 100644 LayoutTests/inspector/model/resources/valid-mapping-null-sources.js.map ++ create mode 100644 LayoutTests/inspector/model/resources/version-not-a-number.js ++ create mode 100644 LayoutTests/inspector/model/resources/version-not-a-number.js.map ++ create mode 100644 LayoutTests/inspector/model/resources/version-numeric-string.js ++ create mode 100644 LayoutTests/inspector/model/resources/version-numeric-string.js.map ++ create mode 100644 LayoutTests/inspector/model/resources/version-too-high.js ++ create mode 100644 LayoutTests/inspector/model/resources/version-too-high.js.map ++ create mode 100644 LayoutTests/inspector/model/resources/version-too-low.js ++ create mode 100644 LayoutTests/inspector/model/resources/version-too-low.js.map ++ create mode 100644 LayoutTests/inspector/model/resources/version-valid.js ++ create mode 100644 LayoutTests/inspector/model/resources/version-valid.js.map ++ create mode 100644 LayoutTests/inspector/model/source-map-spec-expected.txt ++ create mode 100644 LayoutTests/inspector/model/source-map-spec.html ++ ++diff --git a/LayoutTests/inspector/model/resources/basic-mapping-as-index-map.js b/LayoutTests/inspector/model/resources/basic-mapping-as-index-map.js ++new file mode 100644 ++index 000000000000..b9fae380437d ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/basic-mapping-as-index-map.js ++@@ -0,0 +1,2 @@ +++function foo(){return 42}function bar(){return 24}foo();bar(); +++//# sourceMappingURL=basic-mapping-as-index-map.js.map ++diff --git a/LayoutTests/inspector/model/resources/basic-mapping-as-index-map.js.map b/LayoutTests/inspector/model/resources/basic-mapping-as-index-map.js.map ++new file mode 100644 ++index 000000000000..12053a5698a6 ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/basic-mapping-as-index-map.js.map ++@@ -0,0 +1,23 @@ +++{ +++ "version": "3", +++ "sections": [ +++ { +++ "offset": { "line": 0, "column": 0 }, +++ "map": { +++ "version": "3", +++ "names": ["foo","bar"], +++ "sources": ["basic-mapping-original.js"], +++ "mappings": "AAAA,SAASA,MACP,OAAO,EACT,CACA" +++ } +++ }, +++ { +++ "offset": { "line": 0, "column": 34 }, +++ "map": { +++ "version": "3", +++ "names": ["foo","bar"], +++ "sources": ["basic-mapping-original.js"], +++ "mappings": "AAGSC,MACP,OAAO,EACT,CACAD,MACAC" +++ } +++ } +++ ] +++} ++diff --git a/LayoutTests/inspector/model/resources/basic-mapping-original.js b/LayoutTests/inspector/model/resources/basic-mapping-original.js ++new file mode 100644 ++index 000000000000..301b186cb15e ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/basic-mapping-original.js ++@@ -0,0 +1,8 @@ +++function foo() { +++ return 42; +++} +++function bar() { +++ return 24; +++} +++foo(); +++bar(); ++diff --git a/LayoutTests/inspector/model/resources/basic-mapping.js b/LayoutTests/inspector/model/resources/basic-mapping.js ++new file mode 100644 ++index 000000000000..2e479a4175b8 ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/basic-mapping.js ++@@ -0,0 +1,2 @@ +++function foo(){return 42}function bar(){return 24}foo();bar(); +++//# sourceMappingURL=basic-mapping.js.map ++diff --git a/LayoutTests/inspector/model/resources/basic-mapping.js.map b/LayoutTests/inspector/model/resources/basic-mapping.js.map ++new file mode 100644 ++index 000000000000..12dc9679a4b1 ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/basic-mapping.js.map ++@@ -0,0 +1,6 @@ +++{ +++ "version":3, +++ "names": ["foo","bar"], +++ "sources": ["basic-mapping-original.js"], +++ "mappings":"AAAA,SAASA,MACP,OAAO,EACT,CACA,SAASC,MACP,OAAO,EACT,CACAD,MACAC" +++} ++diff --git a/LayoutTests/inspector/model/resources/invalid-mapping-bad-separator.js b/LayoutTests/inspector/model/resources/invalid-mapping-bad-separator.js ++new file mode 100644 ++index 000000000000..25338aca30ce ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/invalid-mapping-bad-separator.js ++@@ -0,0 +1,2 @@ +++function foo(){return 42}function bar(){return 24}foo();bar(); +++//# sourceMappingURL=invalid-mapping-bad-separator.js.map ++diff --git a/LayoutTests/inspector/model/resources/invalid-mapping-bad-separator.js.map b/LayoutTests/inspector/model/resources/invalid-mapping-bad-separator.js.map ++new file mode 100644 ++index 000000000000..5f4f5b92330a ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/invalid-mapping-bad-separator.js.map ++@@ -0,0 +1,6 @@ +++{ +++ "version": 3, +++ "names": ["foo","bar"], +++ "sources": ["basic-mapping-original.js"], +++ "mappings": "AAAA.SAASA:MACP" +++} ++diff --git a/LayoutTests/inspector/model/resources/invalid-mapping-not-a-string-1.js b/LayoutTests/inspector/model/resources/invalid-mapping-not-a-string-1.js ++new file mode 100644 ++index 000000000000..cb38e2fe9d7b ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/invalid-mapping-not-a-string-1.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=invalid-mapping-not-a-string-1.js.map ++diff --git a/LayoutTests/inspector/model/resources/invalid-mapping-not-a-string-1.js.map b/LayoutTests/inspector/model/resources/invalid-mapping-not-a-string-1.js.map ++new file mode 100644 ++index 000000000000..5bf3e2a9d85b ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/invalid-mapping-not-a-string-1.js.map ++@@ -0,0 +1,7 @@ +++{ +++ "version": 3, +++ "names": [], +++ "file": "invalid-mapping-not-a-string-1.js", +++ "sources": ["empty-original.js"], +++ "mappings": 5 +++} ++diff --git a/LayoutTests/inspector/model/resources/invalid-mapping-not-a-string-2.js b/LayoutTests/inspector/model/resources/invalid-mapping-not-a-string-2.js ++new file mode 100644 ++index 000000000000..3d84abd6c6b4 ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/invalid-mapping-not-a-string-2.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=invalid-mapping-not-a-string-2.js.map ++diff --git a/LayoutTests/inspector/model/resources/invalid-mapping-not-a-string-2.js.map b/LayoutTests/inspector/model/resources/invalid-mapping-not-a-string-2.js.map ++new file mode 100644 ++index 000000000000..4527e7f7641c ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/invalid-mapping-not-a-string-2.js.map ++@@ -0,0 +1,7 @@ +++{ +++ "version": 3, +++ "names": [], +++ "file": "invalid-mapping-not-a-string-2.js", +++ "sources": ["empty-original.js"], +++ "mappings": [1, 2, 3, 4] +++} ++diff --git a/LayoutTests/inspector/model/resources/invalid-mapping-segment-column-too-large.js b/LayoutTests/inspector/model/resources/invalid-mapping-segment-column-too-large.js ++new file mode 100644 ++index 000000000000..55591f874b1b ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/invalid-mapping-segment-column-too-large.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=invalid-mapping-segment-column-too-large.js.map ++diff --git a/LayoutTests/inspector/model/resources/invalid-mapping-segment-column-too-large.js.map b/LayoutTests/inspector/model/resources/invalid-mapping-segment-column-too-large.js.map ++new file mode 100644 ++index 000000000000..b4c059e0151b ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/invalid-mapping-segment-column-too-large.js.map ++@@ -0,0 +1,7 @@ +++{ +++ "version": 3, +++ "names": [], +++ "file": "invalid-mapping-segment-column-too-large.js", +++ "sources": ["empty-original.js"], +++ "mappings": "ggggggE" +++} ++diff --git a/LayoutTests/inspector/model/resources/invalid-mapping-segment-name-index-out-of-bounds.js b/LayoutTests/inspector/model/resources/invalid-mapping-segment-name-index-out-of-bounds.js ++new file mode 100644 ++index 000000000000..2a6b434eff58 ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/invalid-mapping-segment-name-index-out-of-bounds.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=invalid-mapping-segment-name-index-out-of-bounds.js.map ++diff --git a/LayoutTests/inspector/model/resources/invalid-mapping-segment-name-index-out-of-bounds.js.map b/LayoutTests/inspector/model/resources/invalid-mapping-segment-name-index-out-of-bounds.js.map ++new file mode 100644 ++index 000000000000..8dd2ea6c2da0 ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/invalid-mapping-segment-name-index-out-of-bounds.js.map ++@@ -0,0 +1,7 @@ +++{ +++ "version": 3, +++ "names": ["foo"], +++ "file": "invalid-mapping-segment-name-index-out-of-bounds.js", +++ "sources": ["empty-original.js"], +++ "mappings": "AAAAC" +++} ++diff --git a/LayoutTests/inspector/model/resources/invalid-mapping-segment-name-index-too-large.js b/LayoutTests/inspector/model/resources/invalid-mapping-segment-name-index-too-large.js ++new file mode 100644 ++index 000000000000..709e34dbd326 ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/invalid-mapping-segment-name-index-too-large.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=invalid-mapping-segment-name-index-too-large.js.map ++diff --git a/LayoutTests/inspector/model/resources/invalid-mapping-segment-name-index-too-large.js.map b/LayoutTests/inspector/model/resources/invalid-mapping-segment-name-index-too-large.js.map ++new file mode 100644 ++index 000000000000..c7bf5b98d120 ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/invalid-mapping-segment-name-index-too-large.js.map ++@@ -0,0 +1,7 @@ +++{ +++ "version": 3, +++ "names": [], +++ "file": "invalid-mapping-segment-name-index-too-large.js", +++ "sources": ["empty-original.js"], +++ "mappings": "AAAAggggggE" +++} ++diff --git a/LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-column.js b/LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-column.js ++new file mode 100644 ++index 000000000000..a202152d6fdf ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-column.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=invalid-mapping-segment-negative-column.js.map ++diff --git a/LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-column.js.map b/LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-column.js.map ++new file mode 100644 ++index 000000000000..403878bfa47a ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-column.js.map ++@@ -0,0 +1,7 @@ +++{ +++ "version": 3, +++ "names": [], +++ "file": "invalid-mapping-segment-negative-column.js", +++ "sources": ["empty-original.js"], +++ "mappings": "F" +++} ++diff --git a/LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-name-index.js b/LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-name-index.js ++new file mode 100644 ++index 000000000000..3e3f63420467 ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-name-index.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=invalid-mapping-segment-negative-name-index.js.map ++diff --git a/LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-name-index.js.map b/LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-name-index.js.map ++new file mode 100644 ++index 000000000000..b94f63646e46 ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-name-index.js.map ++@@ -0,0 +1,7 @@ +++{ +++ "version": 3, +++ "names": [], +++ "file": "invalid-mapping-segment-negative-name-index.js", +++ "sources": ["empty-original.js"], +++ "mappings": "AAAAF" +++} ++diff --git a/LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-original-column.js b/LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-original-column.js ++new file mode 100644 ++index 000000000000..f21d5342b395 ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-original-column.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=invalid-mapping-segment-negative-original-column.js.map ++diff --git a/LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-original-column.js.map b/LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-original-column.js.map ++new file mode 100644 ++index 000000000000..011c639d3f91 ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-original-column.js.map ++@@ -0,0 +1,7 @@ +++{ +++ "version": 3, +++ "names": [], +++ "file": "invalid-mapping-segment-negative-original-column.js", +++ "sources": ["empty-original.js"], +++ "mappings": "AAAF" +++} ++diff --git a/LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-original-line.js b/LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-original-line.js ++new file mode 100644 ++index 000000000000..b37309601ce0 ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-original-line.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=invalid-mapping-segment-negative-original-line.js.map ++diff --git a/LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-original-line.js.map b/LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-original-line.js.map ++new file mode 100644 ++index 000000000000..e7ec993eebda ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-original-line.js.map ++@@ -0,0 +1,7 @@ +++{ +++ "version": 3, +++ "names": [], +++ "file": "invalid-mapping-segment-negative-original-line.js", +++ "sources": ["empty-original.js"], +++ "mappings": "AAFA" +++} ++diff --git a/LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-source-index.js b/LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-source-index.js ++new file mode 100644 ++index 000000000000..6e05849b6a03 ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-source-index.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=invalid-mapping-segment-negative-source-index.js.map ++diff --git a/LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-source-index.js.map b/LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-source-index.js.map ++new file mode 100644 ++index 000000000000..596c2f298bbe ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/invalid-mapping-segment-negative-source-index.js.map ++@@ -0,0 +1,7 @@ +++{ +++ "version": 3, +++ "names": [], +++ "file": "invalid-mapping-segment-negative-source-index.js", +++ "sources": ["empty-original.js"], +++ "mappings": "AFAA" +++} ++diff --git a/LayoutTests/inspector/model/resources/invalid-mapping-segment-original-column-too-large.js b/LayoutTests/inspector/model/resources/invalid-mapping-segment-original-column-too-large.js ++new file mode 100644 ++index 000000000000..0936ed7ea8fd ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/invalid-mapping-segment-original-column-too-large.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=invalid-mapping-segment-original-column-too-large.js.map ++diff --git a/LayoutTests/inspector/model/resources/invalid-mapping-segment-original-column-too-large.js.map b/LayoutTests/inspector/model/resources/invalid-mapping-segment-original-column-too-large.js.map ++new file mode 100644 ++index 000000000000..ff2103fe24fe ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/invalid-mapping-segment-original-column-too-large.js.map ++@@ -0,0 +1,7 @@ +++{ +++ "version": 3, +++ "names": [], +++ "file": "invalid-mapping-segment-original-column-too-large.js", +++ "sources": ["empty-original.js"], +++ "mappings": "AAAggggggE" +++} ++diff --git a/LayoutTests/inspector/model/resources/invalid-mapping-segment-original-line-too-large.js b/LayoutTests/inspector/model/resources/invalid-mapping-segment-original-line-too-large.js ++new file mode 100644 ++index 000000000000..9b3aa5a361ae ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/invalid-mapping-segment-original-line-too-large.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=invalid-mapping-segment-original-line-too-large.js.map ++diff --git a/LayoutTests/inspector/model/resources/invalid-mapping-segment-original-line-too-large.js.map b/LayoutTests/inspector/model/resources/invalid-mapping-segment-original-line-too-large.js.map ++new file mode 100644 ++index 000000000000..890f1c71fc5b ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/invalid-mapping-segment-original-line-too-large.js.map ++@@ -0,0 +1,7 @@ +++{ +++ "version": 3, +++ "names": [], +++ "file": "invalid-mapping-segment-original-line-too-large.js", +++ "sources": ["empty-original.js"], +++ "mappings": "AAggggggEA" +++} ++diff --git a/LayoutTests/inspector/model/resources/invalid-mapping-segment-source-index-out-of-bounds.js b/LayoutTests/inspector/model/resources/invalid-mapping-segment-source-index-out-of-bounds.js ++new file mode 100644 ++index 000000000000..2e5fbca26825 ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/invalid-mapping-segment-source-index-out-of-bounds.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=invalid-mapping-segment-source-index-out-of-bounds.js.map ++diff --git a/LayoutTests/inspector/model/resources/invalid-mapping-segment-source-index-out-of-bounds.js.map b/LayoutTests/inspector/model/resources/invalid-mapping-segment-source-index-out-of-bounds.js.map ++new file mode 100644 ++index 000000000000..86dedb114fa9 ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/invalid-mapping-segment-source-index-out-of-bounds.js.map ++@@ -0,0 +1,7 @@ +++{ +++ "version": 3, +++ "names": [], +++ "file": "invalid-mapping-segment-source-index-out-of-bounds.js", +++ "sources": ["empty-original.js"], +++ "mappings": "ACAA" +++} ++diff --git a/LayoutTests/inspector/model/resources/invalid-mapping-segment-source-index-too-large.js b/LayoutTests/inspector/model/resources/invalid-mapping-segment-source-index-too-large.js ++new file mode 100644 ++index 000000000000..3f4943e1272d ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/invalid-mapping-segment-source-index-too-large.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=invalid-mapping-segment-source-index-too-large.js.map ++diff --git a/LayoutTests/inspector/model/resources/invalid-mapping-segment-source-index-too-large.js.map b/LayoutTests/inspector/model/resources/invalid-mapping-segment-source-index-too-large.js.map ++new file mode 100644 ++index 000000000000..e9f858c6e15d ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/invalid-mapping-segment-source-index-too-large.js.map ++@@ -0,0 +1,7 @@ +++{ +++ "version": 3, +++ "names": [], +++ "file": "invalid-mapping-segment-source-index-too-large.js", +++ "sources": ["empty-original.js"], +++ "mappings": "AggggggEAA" +++} ++diff --git a/LayoutTests/inspector/model/resources/invalid-mapping-segment-with-three-fields.js b/LayoutTests/inspector/model/resources/invalid-mapping-segment-with-three-fields.js ++new file mode 100644 ++index 000000000000..4b868fac9c5e ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/invalid-mapping-segment-with-three-fields.js ++@@ -0,0 +1,2 @@ +++function foo(){return 42}function bar(){return 24}foo();bar(); +++//# sourceMappingURL=invalid-mapping-segment-with-three-fields.js.map ++diff --git a/LayoutTests/inspector/model/resources/invalid-mapping-segment-with-three-fields.js.map b/LayoutTests/inspector/model/resources/invalid-mapping-segment-with-three-fields.js.map ++new file mode 100644 ++index 000000000000..c2af1165ad8f ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/invalid-mapping-segment-with-three-fields.js.map ++@@ -0,0 +1,6 @@ +++{ +++ "version": 3, +++ "names": ["foo","bar"], +++ "sources": ["basic-mapping-original.js"], +++ "mappings": "AAA" +++} ++diff --git a/LayoutTests/inspector/model/resources/invalid-mapping-segment-with-two-fields.js b/LayoutTests/inspector/model/resources/invalid-mapping-segment-with-two-fields.js ++new file mode 100644 ++index 000000000000..96045a7a11dd ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/invalid-mapping-segment-with-two-fields.js ++@@ -0,0 +1,2 @@ +++function foo(){return 42}function bar(){return 24}foo();bar(); +++//# sourceMappingURL=invalid-mapping-segment-with-two-fields.js.map ++diff --git a/LayoutTests/inspector/model/resources/invalid-mapping-segment-with-two-fields.js.map b/LayoutTests/inspector/model/resources/invalid-mapping-segment-with-two-fields.js.map ++new file mode 100644 ++index 000000000000..73cf00fa1c96 ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/invalid-mapping-segment-with-two-fields.js.map ++@@ -0,0 +1,6 @@ +++{ +++ "version": 3, +++ "names": ["foo","bar"], +++ "sources": ["basic-mapping-original.js"], +++ "mappings": "AA" +++} ++diff --git a/LayoutTests/inspector/model/resources/invalid-mapping-segment-with-zero-fields.js b/LayoutTests/inspector/model/resources/invalid-mapping-segment-with-zero-fields.js ++new file mode 100644 ++index 000000000000..9d5332a56ca5 ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/invalid-mapping-segment-with-zero-fields.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=invalid-mapping-segment-with-zero-fields.js.map ++diff --git a/LayoutTests/inspector/model/resources/invalid-mapping-segment-with-zero-fields.js.map b/LayoutTests/inspector/model/resources/invalid-mapping-segment-with-zero-fields.js.map ++new file mode 100644 ++index 000000000000..5a34d25b645e ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/invalid-mapping-segment-with-zero-fields.js.map ++@@ -0,0 +1,7 @@ +++{ +++ "version": 3, +++ "names": [], +++ "file": "invalid-mapping-segment-with-zero-fields.js", +++ "sources": ["empty-original.js"], +++ "mappings": ",,,," +++} ++diff --git a/LayoutTests/inspector/model/resources/invalid-vlq-non-base64-char.js b/LayoutTests/inspector/model/resources/invalid-vlq-non-base64-char.js ++new file mode 100644 ++index 000000000000..d1b20b41a29f ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/invalid-vlq-non-base64-char.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=invalid-vlq-non-base64-char.js.map ++diff --git a/LayoutTests/inspector/model/resources/invalid-vlq-non-base64-char.js.map b/LayoutTests/inspector/model/resources/invalid-vlq-non-base64-char.js.map ++new file mode 100644 ++index 000000000000..4fa1ac576885 ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/invalid-vlq-non-base64-char.js.map ++@@ -0,0 +1,6 @@ +++{ +++ "version" : 3, +++ "sources": [], +++ "names": [], +++ "mappings": "A$%?!" +++} ++diff --git a/LayoutTests/inspector/model/resources/names-missing.js b/LayoutTests/inspector/model/resources/names-missing.js ++new file mode 100644 ++index 000000000000..58781fd88705 ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/names-missing.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=names-missing.js.map ++diff --git a/LayoutTests/inspector/model/resources/names-missing.js.map b/LayoutTests/inspector/model/resources/names-missing.js.map ++new file mode 100644 ++index 000000000000..7dc1b929e485 ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/names-missing.js.map ++@@ -0,0 +1,5 @@ +++{ +++ "version" : "3", +++ "sources": ["empty-original.js"], +++ "mappings": "" +++} ++diff --git a/LayoutTests/inspector/model/resources/names-not-a-list-1.js b/LayoutTests/inspector/model/resources/names-not-a-list-1.js ++new file mode 100644 ++index 000000000000..dc65f1972b5a ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/names-not-a-list-1.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=names-not-a-list-1.js.map ++diff --git a/LayoutTests/inspector/model/resources/names-not-a-list-1.js.map b/LayoutTests/inspector/model/resources/names-not-a-list-1.js.map ++new file mode 100644 ++index 000000000000..843f7cc2e6fd ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/names-not-a-list-1.js.map ++@@ -0,0 +1,6 @@ +++{ +++ "version" : "3", +++ "sources": ["source.js"], +++ "names": "not a list", +++ "mappings": "AAAAA" +++} ++diff --git a/LayoutTests/inspector/model/resources/names-not-a-list-2.js b/LayoutTests/inspector/model/resources/names-not-a-list-2.js ++new file mode 100644 ++index 000000000000..d7251f78da84 ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/names-not-a-list-2.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=names-not-a-list-2.js.map ++diff --git a/LayoutTests/inspector/model/resources/names-not-a-list-2.js.map b/LayoutTests/inspector/model/resources/names-not-a-list-2.js.map ++new file mode 100644 ++index 000000000000..cd7a42a74c4f ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/names-not-a-list-2.js.map ++@@ -0,0 +1,6 @@ +++{ +++ "version" : "3", +++ "sources": ["source.js"], +++ "names": { "foo": 3 }, +++ "mappings": "AAAAA" +++} ++diff --git a/LayoutTests/inspector/model/resources/source-map-spec-tests.json b/LayoutTests/inspector/model/resources/source-map-spec-tests.json ++new file mode 100644 ++index 000000000000..3091a3c93273 ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/source-map-spec-tests.json ++@@ -0,0 +1,503 @@ +++{ +++ "tests": [ +++ { +++ "name": "versionValid", +++ "description": "Test a simple source map with a valid version number", +++ "baseFile": "version-valid.js", +++ "sourceMapFile": "version-valid.js.map", +++ "sourceMapIsValid": true +++ }, +++ { +++ "name": "versionNotANumber", +++ "description": "Test a source map with a version field that is not a number", +++ "baseFile": "version-not-a-number.js", +++ "sourceMapFile": "version-not-a-number.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "versionNumericString", +++ "description": "Test a source map with a version field that is a number as a string", +++ "baseFile": "version-numeric-string.js", +++ "sourceMapFile": "version-numeric-string.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "versionTooHigh", +++ "description": "Test a source map with an integer version field that is too high", +++ "baseFile": "version-too-high.js", +++ "sourceMapFile": "version-too-high.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "versionTooLow", +++ "description": "Test a source map with an integer version field that is too low", +++ "baseFile": "version-too-low.js", +++ "sourceMapFile": "version-too-low.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "sourcesMissing", +++ "description": "Test a source map that is missing a necessary sources field", +++ "baseFile": "sources-missing.js", +++ "sourceMapFile": "sources-missing.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "sourcesNotAList1", +++ "description": "Test a source map with a sources field that is not a valid list (string)", +++ "baseFile": "sources-not-a-list-1.js", +++ "sourceMapFile": "sources-not-a-list-1.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "sourcesNotAList2", +++ "description": "Test a source map with a sources field that is not a valid list (object)", +++ "baseFile": "sources-not-a-list-2.js", +++ "sourceMapFile": "sources-not-a-list-2.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "namesMissing", +++ "description": "Test a source map that is missing a necessary names field", +++ "baseFile": "names-missing.js", +++ "sourceMapFile": "names-missing.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "namesNotAList1", +++ "description": "Test a source map with a names field that is not a valid list (string)", +++ "baseFile": "names-not-a-list-1.js", +++ "sourceMapFile": "names-not-a-list-1.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "namesNotAList2", +++ "description": "Test a source map with a names field that is not a valid list (object)", +++ "baseFile": "names-not-a-list-2.js", +++ "sourceMapFile": "names-not-a-list-2.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "unrecognizedProperty", +++ "description": "Test a source map that has an extra field not explicitly encoded in the spec", +++ "baseFile": "unrecognized-property.js", +++ "sourceMapFile": "unrecognized-property.js.map", +++ "sourceMapIsValid": true +++ }, +++ { +++ "name": "invalidVLQDueToNonBase64Character", +++ "description": "Test a source map that has a mapping with an invalid non-base64 character", +++ "baseFile": "invalid-vlq-non-base64-char.js", +++ "sourceMapFile": "invalid-vlq-non-base64-char.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "invalidMappingNotAString1", +++ "description": "Test a source map that has an invalid mapping that is not a string (number)", +++ "baseFile": "invalid-mapping-not-a-string-1.js", +++ "sourceMapFile": "invalid-mapping-not-a-string-1.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "invalidMappingNotAString2", +++ "description": "Test a source map that has an invalid mapping that is not a string (array)", +++ "baseFile": "invalid-mapping-not-a-string-2.js", +++ "sourceMapFile": "invalid-mapping-not-a-string-2.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "invalidMappingSegmentBadSeparator", +++ "description": "Test a source map that uses separator characters not recognized in the spec", +++ "baseFile": "invalid-mapping-bad-separator.js", +++ "sourceMapFile": "invalid-mapping-bad-separator.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "invalidMappingSegmentWithZeroFields", +++ "description": "Test a source map that has the wrong number (zero) of segments fields", +++ "baseFile": "invalid-mapping-segment-with-zero-fields.js", +++ "sourceMapFile": "invalid-mapping-segment-with-zero-fields.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "invalidMappingSegmentWithTwoFields", +++ "description": "Test a source map that has the wrong number (two) of segments fields", +++ "baseFile": "invalid-mapping-segment-with-two-fields.js", +++ "sourceMapFile": "invalid-mapping-segment-with-two-fields.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "invalidMappingSegmentWithThreeFields", +++ "description": "Test a source map that has the wrong number (three) of segments fields", +++ "baseFile": "invalid-mapping-segment-with-three-fields.js", +++ "sourceMapFile": "invalid-mapping-segment-with-three-fields.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "invalidMappingSegmentWithSourceIndexOutOfBounds", +++ "description": "Test a source map that has a source index field that is out of bounds of the sources field", +++ "baseFile": "invalid-mapping-segment-source-index-out-of-bounds.js", +++ "sourceMapFile": "invalid-mapping-segment-source-index-out-of-bounds.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "invalidMappingSegmentWithNameIndexOutOfBounds", +++ "description": "Test a source map that has a name index field that is out of bounds of the names field", +++ "baseFile": "invalid-mapping-segment-name-index-out-of-bounds.js", +++ "sourceMapFile": "invalid-mapping-segment-name-index-out-of-bounds.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "invalidMappingSegmentWithNegativeColumn", +++ "description": "Test a source map that has an invalid negative non-relative column field", +++ "baseFile": "invalid-mapping-segment-negative-column.js", +++ "sourceMapFile": "invalid-mapping-segment-negative-column.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "invalidMappingSegmentWithNegativeSourceIndex", +++ "description": "Test a source map that has an invalid negative non-relative source index field", +++ "baseFile": "invalid-mapping-segment-negative-source-index.js", +++ "sourceMapFile": "invalid-mapping-segment-negative-source-index.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "invalidMappingSegmentWithNegativeOriginalLine", +++ "description": "Test a source map that has an invalid negative non-relative original line field", +++ "baseFile": "invalid-mapping-segment-negative-original-line.js", +++ "sourceMapFile": "invalid-mapping-segment-negative-original-line.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "invalidMappingSegmentWithNegativeOriginalColumn", +++ "description": "Test a source map that has an invalid negative non-relative original column field", +++ "baseFile": "invalid-mapping-segment-negative-original-column.js", +++ "sourceMapFile": "invalid-mapping-segment-negative-original-column.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "invalidMappingSegmentWithNegativeNameIndex", +++ "description": "Test a source map that has an invalid negative non-relative name index field", +++ "baseFile": "invalid-mapping-segment-negative-name-index.js", +++ "sourceMapFile": "invalid-mapping-segment-negative-name-index.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "invalidMappingSegmentWithColumnExceeding32Bits", +++ "description": "Test a source map that has a column field that exceeds 32 bits", +++ "baseFile": "invalid-mapping-segment-column-too-large.js", +++ "sourceMapFile": "invalid-mapping-segment-column-too-large.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "invalidMappingSegmentWithSourceIndexExceeding32Bits", +++ "description": "Test a source map that has a source index field that exceeds 32 bits", +++ "baseFile": "invalid-mapping-segment-source-index-too-large.js", +++ "sourceMapFile": "invalid-mapping-segment-source-index-too-large.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "invalidMappingSegmentWithOriginalLineExceeding32Bits", +++ "description": "Test a source map that has a original line field that exceeds 32 bits", +++ "baseFile": "invalid-mapping-segment-original-line-too-large.js", +++ "sourceMapFile": "invalid-mapping-segment-original-line-too-large.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "invalidMappingSegmentWithOriginalColumnExceeding32Bits", +++ "description": "Test a source map that has an original column field that exceeds 32 bits", +++ "baseFile": "invalid-mapping-segment-original-column-too-large.js", +++ "sourceMapFile": "invalid-mapping-segment-original-column-too-large.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "invalidMappingSegmentWithNameIndexExceeding32Bits", +++ "description": "Test a source map that has a name index field that exceeds 32 bits", +++ "baseFile": "invalid-mapping-segment-name-index-too-large.js", +++ "sourceMapFile": "invalid-mapping-segment-name-index-too-large.js.map", +++ "sourceMapIsValid": false +++ }, +++ { +++ "name": "validMappingFieldsWith32BitMaxValues", +++ "description": "Test a source map that has segment fields with max values representable in 32 bits", +++ "baseFile": "valid-mapping-boundary-values.js", +++ "sourceMapFile": "valid-mapping-boundary-values.js.map", +++ "sourceMapIsValid": true +++ }, +++ { +++ "name": "validMappingLargeVLQ", +++ "description": "Test a source map that has a segment field VLQ that is very long but within 32-bits", +++ "baseFile": "valid-mapping-large-vlq.js", +++ "sourceMapFile": "valid-mapping-large-vlq.js.map", +++ "sourceMapIsValid": true +++ }, +++ { +++ "name": "validMappingEmptyGroups", +++ "description": "Test a source map with a mapping that has many empty groups", +++ "baseFile": "valid-mapping-empty-groups.js", +++ "sourceMapFile": "valid-mapping-empty-groups.js.map", +++ "sourceMapIsValid": true +++ }, +++ { +++ "name": "basicMapping", +++ "description": "Test a simple source map that has several valid mappings", +++ "baseFile": "basic-mapping.js", +++ "sourceMapFile": "basic-mapping.js.map", +++ "sourceMapIsValid": true, +++ "testActions": [ +++ { +++ "actionType": "checkMapping", +++ "generatedLine": 0, +++ "generatedColumn": 0, +++ "originalSource": "basic-mapping-original.js", +++ "originalLine": 0, +++ "originalColumn": 0, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "generatedLine": 0, +++ "generatedColumn": 9, +++ "originalSource": "basic-mapping-original.js", +++ "originalLine": 0, +++ "originalColumn": 9, +++ "mappedName": "foo" +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 15, +++ "originalLine": 1, +++ "originalColumn": 2, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 22, +++ "originalLine": 1, +++ "originalColumn": 9, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 24, +++ "originalLine": 2, +++ "originalColumn": 0, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 25, +++ "originalLine": 3, +++ "originalColumn": 0, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "generatedLine": 0, +++ "generatedColumn": 34, +++ "originalSource": "basic-mapping-original.js", +++ "originalLine": 3, +++ "originalColumn": 9, +++ "mappedName": "bar" +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 40, +++ "originalLine": 4, +++ "originalColumn": 2, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 47, +++ "originalLine": 4, +++ "originalColumn": 9, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 49, +++ "originalLine": 5, +++ "originalColumn": 0, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 50, +++ "originalLine": 6, +++ "originalColumn": 0, +++ "mappedName": "foo" +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 56, +++ "originalLine": 7, +++ "originalColumn": 0, +++ "mappedName": "bar" +++ } +++ ] +++ }, +++ { +++ "name": "basicMappingWithIndexMap", +++ "description": "Test a version of basic-mapping.js.map that is split into sections with an index map", +++ "baseFile": "basic-mapping-as-index-map.js", +++ "sourceMapFile": "basic-mapping-as-index-map.js.map", +++ "sourceMapIsValid": true, +++ "testActions": [ +++ { +++ "actionType": "checkMapping", +++ "generatedLine": 0, +++ "generatedColumn": 0, +++ "originalSource": "basic-mapping-original.js", +++ "originalLine": 0, +++ "originalColumn": 0, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "generatedLine": 0, +++ "generatedColumn": 9, +++ "originalSource": "basic-mapping-original.js", +++ "originalLine": 0, +++ "originalColumn": 9, +++ "mappedName": "foo" +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 15, +++ "originalLine": 1, +++ "originalColumn": 2, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 22, +++ "originalLine": 1, +++ "originalColumn": 9, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 24, +++ "originalLine": 2, +++ "originalColumn": 0, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 25, +++ "originalLine": 3, +++ "originalColumn": 0, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "generatedLine": 0, +++ "generatedColumn": 34, +++ "originalSource": "basic-mapping-original.js", +++ "originalLine": 3, +++ "originalColumn": 9, +++ "mappedName": "bar" +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 40, +++ "originalLine": 4, +++ "originalColumn": 2, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 47, +++ "originalLine": 4, +++ "originalColumn": 9, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 49, +++ "originalLine": 5, +++ "originalColumn": 0, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 50, +++ "originalLine": 6, +++ "originalColumn": 0, +++ "mappedName": "foo" +++ }, +++ { +++ "actionType": "checkMapping", +++ "originalSource": "basic-mapping-original.js", +++ "generatedLine": 0, +++ "generatedColumn": 56, +++ "originalLine": 7, +++ "originalColumn": 0, +++ "mappedName": "bar" +++ } +++ ] +++ }, +++ { +++ "name": "validMappingNullSources", +++ "description": "Test a source map that has null sources", +++ "baseFile": "valid-mapping-null-sources.js", +++ "sourceMapFile": "valid-mapping-null-sources.js.map", +++ "sourceMapIsValid": true, +++ "testActions": [ +++ { +++ "actionType": "checkMapping", +++ "generatedLine": 0, +++ "generatedColumn": 0, +++ "originalSource": null, +++ "originalLine": 0, +++ "originalColumn": 0, +++ "mappedName": null +++ }, +++ { +++ "actionType": "checkMapping", +++ "generatedLine": 0, +++ "generatedColumn": 9, +++ "originalSource": null, +++ "originalLine": 0, +++ "originalColumn": 9, +++ "mappedName": "foo" +++ } +++ ] +++ } +++ ] +++} ++diff --git a/LayoutTests/inspector/model/resources/sources-missing.js b/LayoutTests/inspector/model/resources/sources-missing.js ++new file mode 100644 ++index 000000000000..779b865e2769 ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/sources-missing.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=sources-missing.js.map ++diff --git a/LayoutTests/inspector/model/resources/sources-missing.js.map b/LayoutTests/inspector/model/resources/sources-missing.js.map ++new file mode 100644 ++index 000000000000..61122fcb3f25 ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/sources-missing.js.map ++@@ -0,0 +1,5 @@ +++{ +++ "version" : "3", +++ "names": ["foo"], +++ "mappings": "" +++} ++diff --git a/LayoutTests/inspector/model/resources/sources-not-a-list-1.js b/LayoutTests/inspector/model/resources/sources-not-a-list-1.js ++new file mode 100644 ++index 000000000000..7e33b7e86725 ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/sources-not-a-list-1.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=sources-not-a-list-1.js.map ++diff --git a/LayoutTests/inspector/model/resources/sources-not-a-list-1.js.map b/LayoutTests/inspector/model/resources/sources-not-a-list-1.js.map ++new file mode 100644 ++index 000000000000..b2e24787bc16 ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/sources-not-a-list-1.js.map ++@@ -0,0 +1,6 @@ +++{ +++ "version" : "3", +++ "sources": "not a list", +++ "names": ["foo"], +++ "mappings": "AAAAA" +++} ++diff --git a/LayoutTests/inspector/model/resources/sources-not-a-list-2.js b/LayoutTests/inspector/model/resources/sources-not-a-list-2.js ++new file mode 100644 ++index 000000000000..4021f763fc88 ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/sources-not-a-list-2.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=sources-not-a-list-2.js.map ++diff --git a/LayoutTests/inspector/model/resources/sources-not-a-list-2.js.map b/LayoutTests/inspector/model/resources/sources-not-a-list-2.js.map ++new file mode 100644 ++index 000000000000..6a6a8635729c ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/sources-not-a-list-2.js.map ++@@ -0,0 +1,6 @@ +++{ +++ "version" : "3", +++ "sources": { "source.js": 3 }, +++ "names": ["foo"], +++ "mappings": "AAAAA" +++} ++diff --git a/LayoutTests/inspector/model/resources/unrecognized-property.js b/LayoutTests/inspector/model/resources/unrecognized-property.js ++new file mode 100644 ++index 000000000000..19dfb0e2e6c7 ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/unrecognized-property.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=unrecognized-property.js.map ++diff --git a/LayoutTests/inspector/model/resources/unrecognized-property.js.map b/LayoutTests/inspector/model/resources/unrecognized-property.js.map ++new file mode 100644 ++index 000000000000..40bee558a4ff ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/unrecognized-property.js.map ++@@ -0,0 +1,8 @@ +++{ +++ "version" : 3, +++ "sources": [], +++ "names": [], +++ "mappings": "", +++ "foobar": 42, +++ "unusedProperty": [1, 2, 3, 4] +++} ++diff --git a/LayoutTests/inspector/model/resources/valid-mapping-boundary-values.js b/LayoutTests/inspector/model/resources/valid-mapping-boundary-values.js ++new file mode 100644 ++index 000000000000..3c49709e05ac ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/valid-mapping-boundary-values.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=valid-mapping-boundary-values.js.map ++diff --git a/LayoutTests/inspector/model/resources/valid-mapping-boundary-values.js.map b/LayoutTests/inspector/model/resources/valid-mapping-boundary-values.js.map ++new file mode 100644 ++index 000000000000..4dd836e63d8f ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/valid-mapping-boundary-values.js.map ++@@ -0,0 +1,7 @@ +++{ +++ "version": 3, +++ "names": ["foo"], +++ "file": "valid-mapping-boundary-values.js", +++ "sources": ["empty-original.js"], +++ "mappings": "+/////DA+/////D+/////DA" +++} ++diff --git a/LayoutTests/inspector/model/resources/valid-mapping-empty-groups.js b/LayoutTests/inspector/model/resources/valid-mapping-empty-groups.js ++new file mode 100644 ++index 000000000000..a2b767b619a0 ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/valid-mapping-empty-groups.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=valid-mapping-empty-groups.js.map ++diff --git a/LayoutTests/inspector/model/resources/valid-mapping-empty-groups.js.map b/LayoutTests/inspector/model/resources/valid-mapping-empty-groups.js.map ++new file mode 100644 ++index 000000000000..53be4ae4ae91 ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/valid-mapping-empty-groups.js.map ++@@ -0,0 +1,7 @@ +++{ +++ "version": 3, +++ "names": [], +++ "file": "valid-mapping-empty-groups.js", +++ "sources": ["empty-original.js"], +++ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;" +++} ++diff --git a/LayoutTests/inspector/model/resources/valid-mapping-large-vlq.js b/LayoutTests/inspector/model/resources/valid-mapping-large-vlq.js ++new file mode 100644 ++index 000000000000..b0cd8978132a ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/valid-mapping-large-vlq.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=valid-mapping-large-vlq.js.map ++diff --git a/LayoutTests/inspector/model/resources/valid-mapping-large-vlq.js.map b/LayoutTests/inspector/model/resources/valid-mapping-large-vlq.js.map ++new file mode 100644 ++index 000000000000..76e18704c4b1 ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/valid-mapping-large-vlq.js.map ++@@ -0,0 +1,6 @@ +++{ +++ "version": 3, +++ "names": [], +++ "sources": ["valid-mapping-large-vlq.js"], +++ "mappings": "igggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggA" +++} ++diff --git a/LayoutTests/inspector/model/resources/valid-mapping-null-sources.js b/LayoutTests/inspector/model/resources/valid-mapping-null-sources.js ++new file mode 100644 ++index 000000000000..ee2acf0f5b2f ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/valid-mapping-null-sources.js ++@@ -0,0 +1,2 @@ +++function foo(){return 42}function bar(){return 24}foo();bar(); +++//# sourceMappingURL=valid-mapping-null-sources.js.map ++diff --git a/LayoutTests/inspector/model/resources/valid-mapping-null-sources.js.map b/LayoutTests/inspector/model/resources/valid-mapping-null-sources.js.map ++new file mode 100644 ++index 000000000000..199cda936955 ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/valid-mapping-null-sources.js.map ++@@ -0,0 +1,6 @@ +++{ +++ "version":3, +++ "names": ["foo"], +++ "sources": [null], +++ "mappings":"AAAA,SAASA" +++} ++diff --git a/LayoutTests/inspector/model/resources/version-not-a-number.js b/LayoutTests/inspector/model/resources/version-not-a-number.js ++new file mode 100644 ++index 000000000000..ae2342e2ffe5 ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/version-not-a-number.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=version-not-a-number.js.map ++diff --git a/LayoutTests/inspector/model/resources/version-not-a-number.js.map b/LayoutTests/inspector/model/resources/version-not-a-number.js.map ++new file mode 100644 ++index 000000000000..a584d6e69511 ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/version-not-a-number.js.map ++@@ -0,0 +1,6 @@ +++{ +++ "version" : "3foo", +++ "sources": [], +++ "names": [], +++ "mappings": "" +++} ++diff --git a/LayoutTests/inspector/model/resources/version-numeric-string.js b/LayoutTests/inspector/model/resources/version-numeric-string.js ++new file mode 100644 ++index 000000000000..a55170885da6 ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/version-numeric-string.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=version-numeric-string.js.map ++diff --git a/LayoutTests/inspector/model/resources/version-numeric-string.js.map b/LayoutTests/inspector/model/resources/version-numeric-string.js.map ++new file mode 100644 ++index 000000000000..dbe52a7d0df6 ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/version-numeric-string.js.map ++@@ -0,0 +1,6 @@ +++{ +++ "version" : "3", +++ "sources": [], +++ "names": [], +++ "mappings": "" +++} ++diff --git a/LayoutTests/inspector/model/resources/version-too-high.js b/LayoutTests/inspector/model/resources/version-too-high.js ++new file mode 100644 ++index 000000000000..55f4e1a298fa ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/version-too-high.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=version-too-high.js.map ++diff --git a/LayoutTests/inspector/model/resources/version-too-high.js.map b/LayoutTests/inspector/model/resources/version-too-high.js.map ++new file mode 100644 ++index 000000000000..ee23be32ff27 ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/version-too-high.js.map ++@@ -0,0 +1,6 @@ +++{ +++ "version" : 4, +++ "sources": [], +++ "names": [], +++ "mappings": "" +++} ++diff --git a/LayoutTests/inspector/model/resources/version-too-low.js b/LayoutTests/inspector/model/resources/version-too-low.js ++new file mode 100644 ++index 000000000000..d9642920b313 ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/version-too-low.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=version-too-low.js.map ++diff --git a/LayoutTests/inspector/model/resources/version-too-low.js.map b/LayoutTests/inspector/model/resources/version-too-low.js.map ++new file mode 100644 ++index 000000000000..64ca7a6e2e92 ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/version-too-low.js.map ++@@ -0,0 +1,6 @@ +++{ +++ "version" : 2, +++ "sources": [], +++ "names": [], +++ "mappings": "" +++} ++diff --git a/LayoutTests/inspector/model/resources/version-valid.js b/LayoutTests/inspector/model/resources/version-valid.js ++new file mode 100644 ++index 000000000000..82d0bfa1eb2a ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/version-valid.js ++@@ -0,0 +1 @@ +++//# sourceMappingURL=version-valid.js.map ++diff --git a/LayoutTests/inspector/model/resources/version-valid.js.map b/LayoutTests/inspector/model/resources/version-valid.js.map ++new file mode 100644 ++index 000000000000..1a163052d8fc ++--- /dev/null +++++ b/LayoutTests/inspector/model/resources/version-valid.js.map ++@@ -0,0 +1,6 @@ +++{ +++ "version" : 3, +++ "sources": [], +++ "names": [], +++ "mappings": "" +++} ++diff --git a/LayoutTests/inspector/model/source-map-spec-expected.txt b/LayoutTests/inspector/model/source-map-spec-expected.txt ++new file mode 100644 ++index 000000000000..c74ab5bcfb32 ++--- /dev/null +++++ b/LayoutTests/inspector/model/source-map-spec-expected.txt ++@@ -0,0 +1,22 @@ +++Ensure a source map loads for resources with sourceMappingURLs. +++ +++ +++== Running test suite: SourceMapSpec +++-- Running test case: SourceMapSpec +++PASS: Resource should have loaded 1 SourceMap. +++PASS: SourceMap should be a WI.SourceMap instance. +++PASS: Resource may or may not load a SourceMap. +++PASS: Resource may or may not load a SourceMap. +++PASS: Resource may or may not load a SourceMap. +++PASS: Resource may or may not load a SourceMap. +++PASS: Resource should have loaded 1 SourceMap. +++PASS: SourceMap should be a WI.SourceMap instance. +++PASS: Resource should have loaded 1 SourceMap. +++PASS: SourceMap should be a WI.SourceMap instance. +++PASS: expectEqual(0, 0) +++PASS: expectEqual(9, 9) +++PASS: expectEqual("basic-mapping-original.js", "basic-mapping-original.js") +++PASS: expectEqual(3, 3) +++PASS: expectEqual(9, 9) +++PASS: expectEqual("basic-mapping-original.js", "basic-mapping-original.js") +++ ++diff --git a/LayoutTests/inspector/model/source-map-spec.html b/LayoutTests/inspector/model/source-map-spec.html ++new file mode 100644 ++index 000000000000..b30b1dd526fc ++--- /dev/null +++++ b/LayoutTests/inspector/model/source-map-spec.html ++@@ -0,0 +1,83 @@ +++ +++ +++ +++ +++ +++ +++ +++

    Ensure a source map loads for resources with sourceMappingURLs.

    +++ +++ ++-- ++2.39.2 ++ +diff --git a/LayoutTests/imported/tg4/source-map-tests/webkit/source-map-spec.html b/LayoutTests/imported/tg4/source-map-tests/webkit/source-map-spec.html +new file mode 100644 +index 000000000000..b30b1dd526fc +--- /dev/null ++++ b/LayoutTests/imported/tg4/source-map-tests/webkit/source-map-spec.html +@@ -0,0 +1,83 @@ ++ ++ ++ ++ ++ ++ ++ ++

    Ensure a source map loads for resources with sourceMappingURLs.

    ++ ++ +diff --git a/LayoutTests/inspector/model/source-map-spec-expected.txt b/LayoutTests/inspector/model/source-map-spec-expected.txt +new file mode 100644 +index 000000000000..fd0094a8ac46 +--- /dev/null ++++ b/LayoutTests/inspector/model/source-map-spec-expected.txt +@@ -0,0 +1,828 @@ ++Run source map specification consumer test cases. ++ ++ ++== Running test suite: SourceMapSpec ++-- Running test case: SourceMapSpec ++versionValid ++PASS: Resource should have loaded 1 SourceMap. ++PASS: SourceMap should be a WI.SourceMap instance. ++versionMissing ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++versionNotANumber ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++versionNumericString ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++versionTooHigh ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++versionTooLow ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++sourcesMissing ++PASS: Expected that there is an associated failed source map URL ++PASS: Expected no source map resource loaded ++sourcesNotAList1 ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++sourcesNotAList2 ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++sourcesNotStringOrNull ++PASS: Expected that there is an associated failed source map URL ++PASS: Expected no source map resource loaded ++sourcesAndSourcesContentBothNull ++PASS: Resource should have loaded 1 SourceMap. ++PASS: SourceMap should be a WI.SourceMap instance. ++fileNotAString1 ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++fileNotAString2 ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++sourceRootNotAString1 ++PASS: Expected that there is an associated failed source map URL ++PASS: Expected no source map resource loaded ++sourceRootNotAString2 ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++PASS: Expected no source map resource loaded ++namesMissing ++PASS: Resource should have loaded 1 SourceMap. ++PASS: SourceMap should be a WI.SourceMap instance. ++namesNotAList1 ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++namesNotAList2 ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++namesNotString ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++ignoreListEmpty ++PASS: Resource should have loaded 1 SourceMap. ++PASS: SourceMap should be a WI.SourceMap instance. ++ignoreListValid1 ++PASS: Resource should have loaded 1 SourceMap. ++PASS: SourceMap should be a WI.SourceMap instance. ++Ignore list test ignored (unsupported) ++ignoreListWrongType1 ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++ignoreListWrongType2 ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++ignoreListWrongType3 ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++ignoreListWrongType4 ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++PASS: Expected no source map resource loaded ++ignoreListOutOfBounds1 ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++ignoreListOutOfBounds2 ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++unrecognizedProperty ++PASS: Resource should have loaded 1 SourceMap. ++PASS: SourceMap should be a WI.SourceMap instance. ++invalidVLQDueToNonBase64Character ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++invalidVLQDueToMissingContinuationDigits ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++invalidMappingNotAString1 ++PASS: Expected that there is an associated failed source map URL ++PASS: Expected no source map resource loaded ++invalidMappingNotAString2 ++PASS: Expected that there is an associated failed source map URL ++PASS: Expected no source map resource loaded ++invalidMappingSegmentBadSeparator ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++invalidMappingSegmentWithZeroFields ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++PASS: Expected no source map resource loaded ++invalidMappingSegmentWithTwoFields ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++PASS: Expected no source map resource loaded ++invalidMappingSegmentWithThreeFields ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++PASS: Expected no source map resource loaded ++invalidMappingSegmentWithSourceIndexOutOfBounds ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++invalidMappingSegmentWithNameIndexOutOfBounds ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++invalidMappingSegmentWithNegativeColumn ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++invalidMappingSegmentWithNegativeSourceIndex ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++invalidMappingSegmentWithNegativeOriginalLine ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++invalidMappingSegmentWithNegativeOriginalColumn ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++invalidMappingSegmentWithNegativeNameIndex ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++invalidMappingSegmentWithNegativeRelativeColumn ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++invalidMappingSegmentWithNegativeRelativeSourceIndex ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++invalidMappingSegmentWithNegativeRelativeOriginalLine ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++invalidMappingSegmentWithNegativeRelativeOriginalColumn ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++invalidMappingSegmentWithNegativeRelativeNameIndex ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++invalidMappingSegmentWithColumnExceeding32Bits ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++invalidMappingSegmentWithSourceIndexExceeding32Bits ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++invalidMappingSegmentWithOriginalLineExceeding32Bits ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++invalidMappingSegmentWithOriginalColumnExceeding32Bits ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++invalidMappingSegmentWithNameIndexExceeding32Bits ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++validMappingFieldsWith32BitMaxValues ++PASS: Resource should have loaded 1 SourceMap. ++PASS: SourceMap should be a WI.SourceMap instance. ++validMappingLargeVLQ ++PASS: Resource should have loaded 1 SourceMap. ++PASS: SourceMap should be a WI.SourceMap instance. ++validMappingEmptyGroups ++PASS: Resource should have loaded 1 SourceMap. ++PASS: SourceMap should be a WI.SourceMap instance. ++validMappingEmptyString ++PASS: Resource should have loaded 1 SourceMap. ++PASS: SourceMap should be a WI.SourceMap instance. ++indexMapWrongTypeSections ++PASS: Expected that there is an associated failed source map URL ++PASS: Expected no source map resource loaded ++indexMapWrongTypeOffset ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++indexMapWrongTypeMap ++PASS: Expected that there is an associated failed source map URL ++PASS: Expected no source map resource loaded ++indexMapInvalidBaseMappings ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++indexMapInvalidOverlap ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++indexMapInvalidOrder ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++indexMapMissingMap ++PASS: Expected that there is an associated failed source map URL ++PASS: Expected no source map resource loaded ++indexMapInvalidSubMap ++PASS: Expected that there is an associated failed source map URL ++PASS: Expected no source map resource loaded ++indexMapMissingOffset ++PASS: Expected that there is an associated failed source map URL ++PASS: Expected no source map resource loaded ++indexMapMissingOffsetLine ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++indexMapMissingOffsetColumn ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++indexMapOffsetLineWrongType ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++indexMapOffsetColumnWrongType ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++indexMapEmptySections ++PASS: Resource should have loaded 1 SourceMap. ++PASS: SourceMap should be a WI.SourceMap instance. ++indexMapFileWrongType1 ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++indexMapFileWrongType2 ++FAIL: Expected that there is an associated failed source map URL ++ Expected: truthy ++ Actual: false ++FAIL: Expected no source map resource loaded ++ Expected: 0 ++ Actual: 1 ++basicMapping ++PASS: Resource should have loaded 1 SourceMap. ++PASS: SourceMap should be a WI.SourceMap instance. ++PASS: Test location (0, 0) should be mapped ++PASS: Original line: 0, expected: 0 ++PASS: Original column: 0, expected: 0 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++PASS: Test location (0, 9) should be mapped ++PASS: Original line: 0, expected: 0 ++PASS: Original column: 9, expected: 9 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++PASS: Test location (0, 15) should be mapped ++PASS: Original line: 1, expected: 1 ++PASS: Original column: 2, expected: 2 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++PASS: Test location (0, 22) should be mapped ++PASS: Original line: 1, expected: 1 ++PASS: Original column: 9, expected: 9 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++PASS: Test location (0, 24) should be mapped ++PASS: Original line: 2, expected: 2 ++PASS: Original column: 0, expected: 0 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++PASS: Test location (0, 25) should be mapped ++PASS: Original line: 3, expected: 3 ++PASS: Original column: 0, expected: 0 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++PASS: Test location (0, 34) should be mapped ++PASS: Original line: 3, expected: 3 ++PASS: Original column: 9, expected: 9 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++PASS: Test location (0, 40) should be mapped ++PASS: Original line: 4, expected: 4 ++PASS: Original column: 2, expected: 2 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++PASS: Test location (0, 47) should be mapped ++PASS: Original line: 4, expected: 4 ++PASS: Original column: 9, expected: 9 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++PASS: Test location (0, 49) should be mapped ++PASS: Original line: 5, expected: 5 ++PASS: Original column: 0, expected: 0 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++PASS: Test location (0, 50) should be mapped ++PASS: Original line: 6, expected: 6 ++PASS: Original column: 0, expected: 0 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++PASS: Test location (0, 56) should be mapped ++PASS: Original line: 7, expected: 7 ++PASS: Original column: 0, expected: 0 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++sourceRootResolution ++PASS: Resource should have loaded 1 SourceMap. ++PASS: SourceMap should be a WI.SourceMap instance. ++PASS: Test location (0, 0) should be mapped ++PASS: Original line: 0, expected: 0 ++PASS: Original column: 0, expected: 0 ++FAIL: Original source: basic-mapping-original.js, expected: theroot/basic-mapping-original.js ++ Expected: "theroot/basic-mapping-original.js" ++ Actual: "basic-mapping-original.js" ++PASS: Test location (0, 9) should be mapped ++PASS: Original line: 0, expected: 0 ++PASS: Original column: 9, expected: 9 ++FAIL: Original source: basic-mapping-original.js, expected: theroot/basic-mapping-original.js ++ Expected: "theroot/basic-mapping-original.js" ++ Actual: "basic-mapping-original.js" ++sourceResolutionAbsoluteURL ++PASS: Resource should have loaded 1 SourceMap. ++PASS: SourceMap should be a WI.SourceMap instance. ++PASS: Test location (0, 0) should be mapped ++PASS: Original line: 0, expected: 0 ++PASS: Original column: 0, expected: 0 ++FAIL: Original source: basic-mapping-original.js, expected: /baz/quux/basic-mapping-original.js ++ Expected: "/baz/quux/basic-mapping-original.js" ++ Actual: "basic-mapping-original.js" ++PASS: Test location (0, 9) should be mapped ++PASS: Original line: 0, expected: 0 ++PASS: Original column: 9, expected: 9 ++FAIL: Original source: basic-mapping-original.js, expected: /baz/quux/basic-mapping-original.js ++ Expected: "/baz/quux/basic-mapping-original.js" ++ Actual: "basic-mapping-original.js" ++basicMappingWithIndexMap ++PASS: Resource should have loaded 1 SourceMap. ++PASS: SourceMap should be a WI.SourceMap instance. ++PASS: Test location (0, 0) should be mapped ++PASS: Original line: 0, expected: 0 ++PASS: Original column: 0, expected: 0 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++PASS: Test location (0, 9) should be mapped ++PASS: Original line: 0, expected: 0 ++PASS: Original column: 9, expected: 9 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++PASS: Test location (0, 15) should be mapped ++PASS: Original line: 1, expected: 1 ++PASS: Original column: 2, expected: 2 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++PASS: Test location (0, 22) should be mapped ++PASS: Original line: 1, expected: 1 ++PASS: Original column: 9, expected: 9 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++PASS: Test location (0, 24) should be mapped ++PASS: Original line: 2, expected: 2 ++PASS: Original column: 0, expected: 0 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++PASS: Test location (0, 25) should be mapped ++PASS: Original line: 3, expected: 3 ++PASS: Original column: 0, expected: 0 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++PASS: Test location (0, 34) should be mapped ++PASS: Original line: 3, expected: 3 ++PASS: Original column: 9, expected: 9 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++PASS: Test location (0, 40) should be mapped ++PASS: Original line: 4, expected: 4 ++PASS: Original column: 2, expected: 2 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++PASS: Test location (0, 47) should be mapped ++PASS: Original line: 4, expected: 4 ++PASS: Original column: 9, expected: 9 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++PASS: Test location (0, 49) should be mapped ++PASS: Original line: 5, expected: 5 ++PASS: Original column: 0, expected: 0 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++PASS: Test location (0, 50) should be mapped ++PASS: Original line: 6, expected: 6 ++PASS: Original column: 0, expected: 0 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++PASS: Test location (0, 56) should be mapped ++PASS: Original line: 7, expected: 7 ++PASS: Original column: 0, expected: 0 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++indexMapWithMissingFile ++PASS: Resource should have loaded 1 SourceMap. ++PASS: SourceMap should be a WI.SourceMap instance. ++PASS: Test location (0, 0) should be mapped ++PASS: Original line: 0, expected: 0 ++PASS: Original column: 0, expected: 0 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++PASS: Test location (0, 9) should be mapped ++PASS: Original line: 0, expected: 0 ++PASS: Original column: 9, expected: 9 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++PASS: Test location (0, 15) should be mapped ++PASS: Original line: 1, expected: 1 ++PASS: Original column: 2, expected: 2 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++PASS: Test location (0, 22) should be mapped ++PASS: Original line: 1, expected: 1 ++PASS: Original column: 9, expected: 9 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++PASS: Test location (0, 24) should be mapped ++PASS: Original line: 2, expected: 2 ++PASS: Original column: 0, expected: 0 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++PASS: Test location (0, 25) should be mapped ++PASS: Original line: 3, expected: 3 ++PASS: Original column: 0, expected: 0 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++PASS: Test location (0, 34) should be mapped ++PASS: Original line: 3, expected: 3 ++PASS: Original column: 9, expected: 9 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++PASS: Test location (0, 40) should be mapped ++PASS: Original line: 4, expected: 4 ++PASS: Original column: 2, expected: 2 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++PASS: Test location (0, 47) should be mapped ++PASS: Original line: 4, expected: 4 ++PASS: Original column: 9, expected: 9 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++PASS: Test location (0, 49) should be mapped ++PASS: Original line: 5, expected: 5 ++PASS: Original column: 0, expected: 0 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++PASS: Test location (0, 50) should be mapped ++PASS: Original line: 6, expected: 6 ++PASS: Original column: 0, expected: 0 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++PASS: Test location (0, 56) should be mapped ++PASS: Original line: 7, expected: 7 ++PASS: Original column: 0, expected: 0 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++indexMapWithTwoConcatenatedSources ++PASS: Resource should have loaded 1 SourceMap. ++PASS: SourceMap should be a WI.SourceMap instance. ++PASS: Test location (0, 0) should be mapped ++PASS: Original line: 0, expected: 0 ++PASS: Original column: 0, expected: 0 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++PASS: Test location (0, 9) should be mapped ++PASS: Original line: 0, expected: 0 ++PASS: Original column: 9, expected: 9 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++PASS: Test location (0, 15) should be mapped ++PASS: Original line: 1, expected: 1 ++PASS: Original column: 2, expected: 2 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++PASS: Test location (0, 22) should be mapped ++PASS: Original line: 1, expected: 1 ++PASS: Original column: 9, expected: 9 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++PASS: Test location (0, 24) should be mapped ++PASS: Original line: 2, expected: 2 ++PASS: Original column: 0, expected: 0 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++PASS: Test location (0, 25) should be mapped ++PASS: Original line: 3, expected: 3 ++PASS: Original column: 0, expected: 0 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++PASS: Test location (0, 34) should be mapped ++PASS: Original line: 3, expected: 3 ++PASS: Original column: 9, expected: 9 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++PASS: Test location (0, 40) should be mapped ++PASS: Original line: 4, expected: 4 ++PASS: Original column: 2, expected: 2 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++PASS: Test location (0, 47) should be mapped ++PASS: Original line: 4, expected: 4 ++PASS: Original column: 9, expected: 9 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++PASS: Test location (0, 49) should be mapped ++PASS: Original line: 5, expected: 5 ++PASS: Original column: 0, expected: 0 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++PASS: Test location (0, 50) should be mapped ++PASS: Original line: 6, expected: 6 ++PASS: Original column: 0, expected: 0 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++PASS: Test location (0, 56) should be mapped ++PASS: Original line: 7, expected: 7 ++PASS: Original column: 0, expected: 0 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++PASS: Test location (0, 62) should be mapped ++PASS: Original line: 0, expected: 0 ++PASS: Original column: 0, expected: 0 ++PASS: Original source: second-source-original.js, expected: second-source-original.js ++PASS: Test location (0, 71) should be mapped ++PASS: Original line: 0, expected: 0 ++PASS: Original column: 9, expected: 9 ++PASS: Original source: second-source-original.js, expected: second-source-original.js ++PASS: Test location (0, 77) should be mapped ++PASS: Original line: 1, expected: 1 ++PASS: Original column: 2, expected: 2 ++PASS: Original source: second-source-original.js, expected: second-source-original.js ++PASS: Test location (0, 83) should be mapped ++PASS: Original line: 1, expected: 1 ++PASS: Original column: 9, expected: 9 ++PASS: Original source: second-source-original.js, expected: second-source-original.js ++PASS: Test location (0, 88) should be mapped ++PASS: Original line: 2, expected: 2 ++PASS: Original column: 0, expected: 0 ++PASS: Original source: second-source-original.js, expected: second-source-original.js ++PASS: Test location (0, 89) should be mapped ++PASS: Original line: 3, expected: 3 ++PASS: Original column: 0, expected: 0 ++PASS: Original source: second-source-original.js, expected: second-source-original.js ++sourcesNullSourcesContentNonNull ++PASS: Resource should have loaded 1 SourceMap. ++PASS: SourceMap should be a WI.SourceMap instance. ++PASS: Test location (0, 0) should be mapped ++PASS: Original line: 0, expected: 0 ++PASS: Original column: 0, expected: 0 ++FAIL: Original source: sources-null-sources-content-non-null.js.map, expected: null ++ Expected: null ++ Actual: "sources-null-sources-content-non-null.js.map" ++PASS: Test location (0, 9) should be mapped ++PASS: Original line: 0, expected: 0 ++PASS: Original column: 9, expected: 9 ++FAIL: Original source: sources-null-sources-content-non-null.js.map, expected: null ++ Expected: null ++ Actual: "sources-null-sources-content-non-null.js.map" ++sourcesNonNullSourcesContentNull ++PASS: Resource should have loaded 1 SourceMap. ++PASS: SourceMap should be a WI.SourceMap instance. ++PASS: Test location (0, 0) should be mapped ++PASS: Original line: 0, expected: 0 ++PASS: Original column: 0, expected: 0 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++PASS: Test location (0, 9) should be mapped ++PASS: Original line: 0, expected: 0 ++PASS: Original column: 9, expected: 9 ++PASS: Original source: basic-mapping-original.js, expected: basic-mapping-original.js ++transitiveMapping ++PASS: Resource should have loaded 1 SourceMap. ++PASS: SourceMap should be a WI.SourceMap instance. ++Transitive mapping test ignored ++Transitive mapping test ignored ++Transitive mapping test ignored ++Transitive mapping test ignored ++Transitive mapping test ignored ++Transitive mapping test ignored ++Transitive mapping test ignored ++Transitive mapping test ignored ++transitiveMappingWithThreeSteps ++PASS: Resource should have loaded 1 SourceMap. ++PASS: SourceMap should be a WI.SourceMap instance. ++Transitive mapping test ignored ++Transitive mapping test ignored ++Transitive mapping test ignored ++Transitive mapping test ignored ++Transitive mapping test ignored ++Transitive mapping test ignored ++Transitive mapping test ignored ++Transitive mapping test ignored ++vlqValidSingleDigit ++PASS: Resource should have loaded 1 SourceMap. ++PASS: SourceMap should be a WI.SourceMap instance. ++PASS: Test location (0, 15) should be mapped ++PASS: Original line: 0, expected: 0 ++PASS: Original column: 0, expected: 0 ++PASS: Original source: vlq-valid-single-digit-original.js, expected: vlq-valid-single-digit-original.js ++vlqValidNegativeDigit ++PASS: Resource should have loaded 1 SourceMap. ++PASS: SourceMap should be a WI.SourceMap instance. ++PASS: Test location (2, 15) should be mapped ++PASS: Original line: 1, expected: 1 ++FAIL: Original column: 1, expected: 3 ++ Expected: 3 ++ Actual: 1 ++PASS: Original source: vlq-valid-negative-digit-original.js, expected: vlq-valid-negative-digit-original.js ++PASS: Test location (2, 2) should be mapped ++PASS: Original line: 1, expected: 1 ++PASS: Original column: 1, expected: 1 ++PASS: Original source: vlq-valid-negative-digit-original.js, expected: vlq-valid-negative-digit-original.js ++vlqValidContinuationBitPresent1 ++PASS: Resource should have loaded 1 SourceMap. ++PASS: SourceMap should be a WI.SourceMap instance. ++PASS: Test location (0, 15) should be mapped ++PASS: Original line: 0, expected: 0 ++PASS: Original column: 1, expected: 1 ++PASS: Original source: vlq-valid-continuation-bit-present-1-original.js, expected: vlq-valid-continuation-bit-present-1-original.js ++vlqValidContinuationBitPresent2 ++PASS: Resource should have loaded 1 SourceMap. ++PASS: SourceMap should be a WI.SourceMap instance. ++PASS: Test location (2, 16) should be mapped ++PASS: Original line: 1, expected: 1 ++PASS: Original column: 1, expected: 1 ++PASS: Original source: vlq-valid-continuation-bit-present-2-original.js, expected: vlq-valid-continuation-bit-present-2-original.js ++mappingSemanticsSingleFieldSegment ++PASS: Resource should have loaded 1 SourceMap. ++PASS: SourceMap should be a WI.SourceMap instance. ++PASS: Test location (0, 0) should be mapped ++PASS: Original line: 0, expected: 0 ++PASS: Original column: 1, expected: 1 ++PASS: Original source: mapping-semantics-single-field-segment-original.js, expected: mapping-semantics-single-field-segment-original.js ++PASS: Test location (0, 2) should be mapped ++FAIL: Original line: 0, expected: null ++ Expected: null ++ Actual: 0 ++FAIL: Original column: 1, expected: null ++ Expected: null ++ Actual: 1 ++FAIL: Original source: mapping-semantics-single-field-segment-original.js, expected: null ++ Expected: null ++ Actual: "mapping-semantics-single-field-segment-original.js" ++mappingSemanticsFourFieldSegment ++PASS: Resource should have loaded 1 SourceMap. ++PASS: SourceMap should be a WI.SourceMap instance. ++PASS: Test location (0, 1) should be mapped ++PASS: Original line: 2, expected: 2 ++PASS: Original column: 2, expected: 2 ++PASS: Original source: mapping-semantics-four-field-segment-original.js, expected: mapping-semantics-four-field-segment-original.js ++mappingSemanticsFiveFieldSegment ++PASS: Resource should have loaded 1 SourceMap. ++PASS: SourceMap should be a WI.SourceMap instance. ++PASS: Test location (0, 1) should be mapped ++PASS: Original line: 2, expected: 2 ++PASS: Original column: 2, expected: 2 ++PASS: Original source: mapping-semantics-five-field-segment-original.js, expected: mapping-semantics-five-field-segment-original.js ++mappingSemanticsColumnReset ++PASS: Resource should have loaded 1 SourceMap. ++PASS: SourceMap should be a WI.SourceMap instance. ++PASS: Test location (0, 1) should be mapped ++PASS: Original line: 0, expected: 0 ++PASS: Original column: 0, expected: 0 ++PASS: Original source: mapping-semantics-column-reset-original.js, expected: mapping-semantics-column-reset-original.js ++PASS: Test location (1, 1) should be mapped ++PASS: Original line: 1, expected: 1 ++PASS: Original column: 0, expected: 0 ++PASS: Original source: mapping-semantics-column-reset-original.js, expected: mapping-semantics-column-reset-original.js ++mappingSemanticsRelative1 ++PASS: Resource should have loaded 1 SourceMap. ++PASS: SourceMap should be a WI.SourceMap instance. ++PASS: Test location (0, 1) should be mapped ++PASS: Original line: 0, expected: 0 ++PASS: Original column: 0, expected: 0 ++PASS: Original source: mapping-semantics-relative-1-original.js, expected: mapping-semantics-relative-1-original.js ++PASS: Test location (0, 5) should be mapped ++PASS: Original line: 0, expected: 0 ++PASS: Original column: 4, expected: 4 ++PASS: Original source: mapping-semantics-relative-1-original.js, expected: mapping-semantics-relative-1-original.js ++mappingSemanticsRelative2 ++PASS: Resource should have loaded 1 SourceMap. ++PASS: SourceMap should be a WI.SourceMap instance. ++PASS: Test location (0, 1) should be mapped ++PASS: Original line: 0, expected: 0 ++PASS: Original column: 2, expected: 2 ++PASS: Original source: mapping-semantics-relative-2-original.js, expected: mapping-semantics-relative-2-original.js ++PASS: Test location (1, 2) should be mapped ++PASS: Original line: 1, expected: 1 ++PASS: Original column: 2, expected: 2 ++PASS: Original source: mapping-semantics-relative-2-original.js, expected: mapping-semantics-relative-2-original.js ++ +diff --git a/LayoutTests/inspector/model/source-map-spec.html b/LayoutTests/inspector/model/source-map-spec.html +new file mode 100644 +index 000000000000..08979e569710 +--- /dev/null ++++ b/LayoutTests/inspector/model/source-map-spec.html +@@ -0,0 +1,87 @@ ++ ++ ++ ++ ++ ++ ++ ++

    Run source map specification consumer test cases.

    ++ ++ +-- +2.39.2 + diff --git a/test/fixtures/typescript/ts/hook.ts b/test/fixtures/typescript/ts/hook.ts new file mode 100644 index 00000000000000..e0dd46448b837e --- /dev/null +++ b/test/fixtures/typescript/ts/hook.ts @@ -0,0 +1,11 @@ +import type { ResolveHook } from 'node:module'; + +// Pass through +export const resolve: ResolveHook = async function resolve(specifier, context, nextResolve) { + if(false){ + // https://github.com/nodejs/node/issues/54645 + // A bug in the typescript parsers swc causes + // the next line to not be parsed correctly + } + return nextResolve(specifier, context); +}; diff --git a/test/fixtures/typescript/ts/test-loader.ts b/test/fixtures/typescript/ts/test-loader.ts new file mode 100644 index 00000000000000..8b957bf72f0aa0 --- /dev/null +++ b/test/fixtures/typescript/ts/test-loader.ts @@ -0,0 +1,4 @@ +import { register } from 'node:module'; +import * as fixtures from '../../../common/fixtures.mjs'; + +register(fixtures.fileURL('typescript/ts/hook.ts')); diff --git a/test/fixtures/typescript/ts/test-simple.js b/test/fixtures/typescript/ts/test-simple.js new file mode 100644 index 00000000000000..f738e60f7d61db --- /dev/null +++ b/test/fixtures/typescript/ts/test-simple.js @@ -0,0 +1,2 @@ +const str = "Hello, TypeScript!"; +console.log(str); diff --git a/test/fixtures/wpt/README.md b/test/fixtures/wpt/README.md index 3f684bf1b32c5e..cc97c8787a2c98 100644 --- a/test/fixtures/wpt/README.md +++ b/test/fixtures/wpt/README.md @@ -27,12 +27,12 @@ Last update: - performance-timeline: https://github.com/web-platform-tests/wpt/tree/94caab7038/performance-timeline - resource-timing: https://github.com/web-platform-tests/wpt/tree/22d38586d0/resource-timing - resources: https://github.com/web-platform-tests/wpt/tree/1e140d63ec/resources -- streams: https://github.com/web-platform-tests/wpt/tree/2bd26e124c/streams -- url: https://github.com/web-platform-tests/wpt/tree/6a39784534/url +- streams: https://github.com/web-platform-tests/wpt/tree/bc9dcbbf1a/streams +- url: https://github.com/web-platform-tests/wpt/tree/6fa3fe8a92/url - user-timing: https://github.com/web-platform-tests/wpt/tree/5ae85bf826/user-timing - wasm/jsapi: https://github.com/web-platform-tests/wpt/tree/cde25e7e3c/wasm/jsapi - wasm/webapi: https://github.com/web-platform-tests/wpt/tree/fd1b23eeaa/wasm/webapi -- WebCryptoAPI: https://github.com/web-platform-tests/wpt/tree/b81831169b/WebCryptoAPI +- WebCryptoAPI: https://github.com/web-platform-tests/wpt/tree/3e3374efde/WebCryptoAPI - webidl/ecmascript-binding/es-exceptions: https://github.com/web-platform-tests/wpt/tree/a370aad338/webidl/ecmascript-binding/es-exceptions - webmessaging/broadcastchannel: https://github.com/web-platform-tests/wpt/tree/6495c91853/webmessaging/broadcastchannel - webstorage: https://github.com/web-platform-tests/wpt/tree/9dafa89214/webstorage diff --git a/test/fixtures/wpt/WebCryptoAPI/crypto_key_cached_slots.https.any.js b/test/fixtures/wpt/WebCryptoAPI/crypto_key_cached_slots.https.any.js new file mode 100644 index 00000000000000..f573fac1c96606 --- /dev/null +++ b/test/fixtures/wpt/WebCryptoAPI/crypto_key_cached_slots.https.any.js @@ -0,0 +1,44 @@ +// META: title=WebCryptoAPI: CryptoKey cached ECMAScript objects + +// https://w3c.github.io/webcrypto/#dom-cryptokey-algorithm +// https://github.com/servo/servo/issues/33908 + +promise_test(function() { + return self.crypto.subtle.generateKey( + { + name: "AES-CTR", + length: 256, + }, + true, + ["encrypt"], + ).then( + function(key) { + let a = key.algorithm; + let b = key.algorithm; + assert_true(a === b); + }, + function(err) { + assert_unreached("generateKey threw an unexpected error: " + err.toString()); + } + ); +}, "CryptoKey.algorithm getter returns cached object"); + +promise_test(function() { + return self.crypto.subtle.generateKey( + { + name: "AES-CTR", + length: 256, + }, + true, + ["encrypt"], + ).then( + function(key) { + let a = key.usages; + let b = key.usages; + assert_true(a === b); + }, + function(err) { + assert_unreached("generateKey threw an unexpected error: " + err.toString()); + } + ); +}, "CryptoKey.usages getter returns cached object"); diff --git a/test/fixtures/wpt/WebCryptoAPI/cryptokey_algorithm_returns_cached_object.https.any.js b/test/fixtures/wpt/WebCryptoAPI/cryptokey_algorithm_returns_cached_object.https.any.js deleted file mode 100644 index b2d73fbab78d64..00000000000000 --- a/test/fixtures/wpt/WebCryptoAPI/cryptokey_algorithm_returns_cached_object.https.any.js +++ /dev/null @@ -1,24 +0,0 @@ -// META: title=WebCryptoAPI: CryptoKey.algorithm getter returns cached object - -// https://w3c.github.io/webcrypto/#dom-cryptokey-algorithm -// https://github.com/servo/servo/issues/33908 - -promise_test(function() { - return self.crypto.subtle.generateKey( - { - name: "AES-CTR", - length: 256, - }, - true, - ["encrypt"], - ).then( - function(key) { - let a = key.algorithm; - let b = key.algorithm; - assert_true(a === b); - }, - function(err) { - assert_unreached("generateKey threw an unexpected error: " + err.toString()); - } - ); -}, "CryptoKey.algorithm getter returns cached object"); \ No newline at end of file diff --git a/test/fixtures/wpt/WebCryptoAPI/digest/digest.https.any.js b/test/fixtures/wpt/WebCryptoAPI/digest/digest.https.any.js index 379d9311f30247..3b0972b1f2bf7d 100644 --- a/test/fixtures/wpt/WebCryptoAPI/digest/digest.https.any.js +++ b/test/fixtures/wpt/WebCryptoAPI/digest/digest.https.any.js @@ -118,6 +118,20 @@ }); }); + // Call digest() with empty algorithm object + Object.keys(sourceData).forEach(function(size) { + promise_test(function(test) { + var promise = subtle.digest({}, sourceData[size]) + .then(function(result) { + assert_unreached("digest() with missing algorithm name should have thrown a TypeError"); + }, function(err) { + assert_equals(err.name, "TypeError", "Missing algorithm name should cause TypeError") + }); + + return promise; + }, "empty algorithm object with " + size); + }); + done(); diff --git a/test/fixtures/wpt/WebCryptoAPI/generateKey/failures.js b/test/fixtures/wpt/WebCryptoAPI/generateKey/failures.js index e0f0279a69bb88..deaac636a99be5 100644 --- a/test/fixtures/wpt/WebCryptoAPI/generateKey/failures.js +++ b/test/fixtures/wpt/WebCryptoAPI/generateKey/failures.js @@ -166,6 +166,14 @@ function run_test(algorithmNames) { }); }); + // Empty algorithm should fail with TypeError + allValidUsages(["decrypt", "sign", "deriveBits"], true, []) // Small search space, shouldn't matter because should fail before used + .forEach(function(usages) { + [false, true, "RED", 7].forEach(function(extractable){ + testError({}, extractable, usages, "TypeError", "Empty algorithm"); + }); + }); + // Algorithms normalize okay, but usages bad (though not empty). // It shouldn't matter what other extractable is. Should fail diff --git a/test/fixtures/wpt/WebCryptoAPI/import_export/ec_importKey_failures_fixtures.js b/test/fixtures/wpt/WebCryptoAPI/import_export/ec_importKey_failures_fixtures.js index 796db364c2e2dc..a2d25e816cbd73 100644 --- a/test/fixtures/wpt/WebCryptoAPI/import_export/ec_importKey_failures_fixtures.js +++ b/test/fixtures/wpt/WebCryptoAPI/import_export/ec_importKey_failures_fixtures.js @@ -19,6 +19,14 @@ function getMismatchedJWKKeyData(algorithm) { return []; } +function getMismatchedKtyField(algorithm) { + return mismatchedKtyField[algorithm.name]; +} + +function getMismatchedCrvField(algorithm) { + return mismatchedCrvField[algorithm.name]; +} + var validKeyData = { "P-521": [ { @@ -201,3 +209,17 @@ var missingJWKFieldKeyData = { } ] }; + +// The 'kty' field doesn't match the key algorithm. +var mismatchedKtyField = { + "P-521": "OKP", + "P-256": "OKP", + "P-384": "OKP", +} + +// The 'kty' field doesn't match the key algorithm. +var mismatchedCrvField = { + "P-521": "P-256", + "P-256": "P-384", + "P-384": "P-521", +} diff --git a/test/fixtures/wpt/WebCryptoAPI/import_export/importKey_failures.js b/test/fixtures/wpt/WebCryptoAPI/import_export/importKey_failures.js index bba48401e616a5..453461a8771f51 100644 --- a/test/fixtures/wpt/WebCryptoAPI/import_export/importKey_failures.js +++ b/test/fixtures/wpt/WebCryptoAPI/import_export/importKey_failures.js @@ -192,4 +192,79 @@ function run_test(algorithmNames) { }); }); }); + + // Missing mandatory "name" field on algorithm + testVectors.forEach(function(vector) { + var name = vector.name; + // We just need *some* valid keydata, so pick the first available algorithm. + var algorithm = allAlgorithmSpecifiersFor(name)[0]; + getValidKeyData(algorithm).forEach(function(test) { + validUsages(vector, test.format, test.data).forEach(function(usages) { + [true, false].forEach(function(extractable) { + testError(test.format, {}, test.data, name, usages, extractable, "TypeError", "Missing algorithm name"); + }); + }); + }); + }); + + // The 'kty' field is not correct. + testVectors.forEach(function(vector) { + var name = vector.name; + allAlgorithmSpecifiersFor(name).forEach(function(algorithm) { + getValidKeyData(algorithm).forEach(function(test) { + if (test.format === "jwk") { + var data = {crv: test.data.crv, kty: test.data.kty, d: test.data.d, x: test.data.x, d: test.data.d}; + data.kty = getMismatchedKtyField(algorithm); + var usages = validUsages(vector, 'jwk', test.data); + testError('jwk', algorithm, data, name, usages, true, "DataError", "Invalid 'kty' field"); + } + }); + }); + }); + + // The 'ext' field is not correct. + testVectors.forEach(function(vector) { + var name = vector.name; + allAlgorithmSpecifiersFor(name).forEach(function(algorithm) { + getValidKeyData(algorithm).forEach(function(test) { + if (test.format === "jwk") { + var data = {crv: test.data.crv, kty: test.data.kty, d: test.data.d, x: test.data.x, d: test.data.d}; + data.ext = false; + var usages = validUsages(vector, 'jwk', test.data); + testError('jwk', algorithm, data, name, usages, true, "DataError", "Import from a non-extractable"); + } + }); + }); + }); + + // The 'use' field is incorrect. + testVectors.forEach(function(vector) { + var name = vector.name; + allAlgorithmSpecifiersFor(name).forEach(function(algorithm) { + getValidKeyData(algorithm).forEach(function(test) { + if (test.format === "jwk") { + var data = {crv: test.data.crv, kty: test.data.kty, d: test.data.d, x: test.data.x, d: test.data.d}; + data.use = "invalid"; + var usages = validUsages(vector, 'jwk', test.data); + if (usages.length !== 0) + testError('jwk', algorithm, data, name, usages, true, "DataError", "Invalid 'use' field"); + } + }); + }); + }); + + // The 'crv' field is incorrect. + testVectors.forEach(function(vector) { + var name = vector.name; + allAlgorithmSpecifiersFor(name).forEach(function(algorithm) { + getValidKeyData(algorithm).forEach(function(test) { + if (test.format === "jwk") { + var data = {crv: test.data.crv, kty: test.data.kty, d: test.data.d, x: test.data.x, d: test.data.d}; + data.crv = getMismatchedCrvField(algorithm) + var usages = validUsages(vector, 'jwk', test.data); + testError('jwk', algorithm, data, name, usages, true, "DataError", "Invalid 'crv' field"); + } + }); + }); + }); } diff --git a/test/fixtures/wpt/WebCryptoAPI/import_export/okp_importKey_failures_fixtures.js b/test/fixtures/wpt/WebCryptoAPI/import_export/okp_importKey_failures_fixtures.js index 88f552291cdf6b..9bedddc5c5944a 100644 --- a/test/fixtures/wpt/WebCryptoAPI/import_export/okp_importKey_failures_fixtures.js +++ b/test/fixtures/wpt/WebCryptoAPI/import_export/okp_importKey_failures_fixtures.js @@ -17,6 +17,14 @@ function getMismatchedJWKKeyData(algorithm) { return mismatchedJWKKeyData[algorithm.name]; } +function getMismatchedKtyField(algorithm) { + return mismatchedKtyField[algorithm.name]; +} + +function getMismatchedCrvField(algorithm) { + return mismatchedCrvField[algorithm.name]; +} + var validKeyData = { "Ed25519": [ { @@ -412,3 +420,19 @@ var mismatchedJWKKeyData = { }, ], } + +// The 'kty' field doesn't match the key algorithm. +var mismatchedKtyField = { + "Ed25519": "EC", + "X25519": "EC", + "Ed448": "EC", + "X448": "EC", +} + +// The 'kty' field doesn't match the key algorithm. +var mismatchedCrvField = { + "Ed25519": "X25519", + "X25519": "Ed448", + "Ed448": "X25519", + "X448": "Ed25519", +} diff --git a/test/fixtures/wpt/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.https.any.js b/test/fixtures/wpt/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.https.any.js index edb67d9e30fdba..9dd837b3bf60a9 100644 --- a/test/fixtures/wpt/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.https.any.js +++ b/test/fixtures/wpt/WebCryptoAPI/wrapKey_unwrapKey/wrapKey_unwrapKey.https.any.js @@ -1,238 +1,256 @@ // META: title=WebCryptoAPI: wrapKey() and unwrapKey() // META: timeout=long // META: script=../util/helpers.js +// META: script=wrapKey_unwrapKey_vectors.js // Tests for wrapKey and unwrapKey round tripping var subtle = self.crypto.subtle; - var wrappers = []; // Things we wrap (and upwrap) keys with - var keys = []; // Things to wrap and unwrap - - // Generate all the keys needed, then iterate over all combinations + var wrappers = {}; // Things we wrap (and upwrap) keys with + var keys = {}; // Things to wrap and unwrap + + // There are five algorithms that can be used for wrapKey/unwrapKey. + // Generate one key with typical parameters for each kind. + // + // Note: we don't need cryptographically strong parameters for things + // like IV - just any legal value will do. + var wrappingKeysParameters = [ + { + name: "RSA-OAEP", + importParameters: {name: "RSA-OAEP", hash: "SHA-256"}, + wrapParameters: {name: "RSA-OAEP", label: new Uint8Array(8)} + }, + { + name: "AES-CTR", + importParameters: {name: "AES-CTR", length: 128}, + wrapParameters: {name: "AES-CTR", counter: new Uint8Array(16), length: 64} + }, + { + name: "AES-CBC", + importParameters: {name: "AES-CBC", length: 128}, + wrapParameters: {name: "AES-CBC", iv: new Uint8Array(16)} + }, + { + name: "AES-GCM", + importParameters: {name: "AES-GCM", length: 128}, + wrapParameters: {name: "AES-GCM", iv: new Uint8Array(16), additionalData: new Uint8Array(16), tagLength: 128} + }, + { + name: "AES-KW", + importParameters: {name: "AES-KW", length: 128}, + wrapParameters: {name: "AES-KW"} + } + ]; + + var keysToWrapParameters = [ + {algorithm: {name: "RSASSA-PKCS1-v1_5", hash: "SHA-256"}, privateUsages: ["sign"], publicUsages: ["verify"]}, + {algorithm: {name: "RSA-PSS", hash: "SHA-256"}, privateUsages: ["sign"], publicUsages: ["verify"]}, + {algorithm: {name: "RSA-OAEP", hash: "SHA-256"}, privateUsages: ["decrypt"], publicUsages: ["encrypt"]}, + {algorithm: {name: "ECDSA", namedCurve: "P-256"}, privateUsages: ["sign"], publicUsages: ["verify"]}, + {algorithm: {name: "ECDH", namedCurve: "P-256"}, privateUsages: ["deriveBits"], publicUsages: []}, + {algorithm: {name: "Ed25519" }, privateUsages: ["sign"], publicUsages: ["verify"]}, + {algorithm: {name: "Ed448" }, privateUsages: ["sign"], publicUsages: ["verify"]}, + {algorithm: {name: "X25519" }, privateUsages: ["deriveBits"], publicUsages: []}, + {algorithm: {name: "X448" }, privateUsages: ["deriveBits"], publicUsages: []}, + {algorithm: {name: "AES-CTR", length: 128}, usages: ["encrypt", "decrypt"]}, + {algorithm: {name: "AES-CBC", length: 128}, usages: ["encrypt", "decrypt"]}, + {algorithm: {name: "AES-GCM", length: 128}, usages: ["encrypt", "decrypt"]}, + {algorithm: {name: "AES-KW", length: 128}, usages: ["wrapKey", "unwrapKey"]}, + {algorithm: {name: "HMAC", length: 128, hash: "SHA-256"}, usages: ["sign", "verify"]} + ]; + + // Import all the keys needed, then iterate over all combinations // to test wrapping and unwrapping. promise_test(function() { - return Promise.all([generateWrappingKeys(), generateKeysToWrap()]) + return Promise.all([importWrappingKeys(), importKeysToWrap()]) .then(function(results) { - var promises = []; - wrappers.forEach(function(wrapper) { - keys.forEach(function(key) { - promises.push(testWrapping(wrapper, key)); - }) + wrappingKeysParameters.filter((param) => Object.keys(wrappers).includes(param.name)).forEach(function(wrapperParam) { + var wrapper = wrappers[wrapperParam.name]; + keysToWrapParameters.filter((param) => Object.keys(keys).includes(param.algorithm.name)).forEach(function(toWrapParam) { + var keyData = keys[toWrapParam.algorithm.name]; + ["raw", "spki", "pkcs8"].filter((fmt) => Object.keys(keyData).includes(fmt)).forEach(function(keyDataFormat) { + var toWrap = keyData[keyDataFormat]; + [keyDataFormat, "jwk"].forEach(function(format) { + if (wrappingIsPossible(toWrap.originalExport[format], wrapper.parameters.name)) { + testWrapping(wrapper, toWrap, format); + if (canCompareNonExtractableKeys(toWrap.key)) { + testWrappingNonExtractable(wrapper, toWrap, format); + if (format === "jwk") { + testWrappingNonExtractableAsExtractable(wrapper, toWrap); + } + } + } + }); + }); + }); }); - return Promise.allSettled(promises); + return Promise.resolve("setup done"); + }, function(err) { + return Promise.reject("setup failed: " + err.name + ': "' + err.message + '"'); }); }, "setup"); - function generateWrappingKeys() { - // There are five algorithms that can be used for wrapKey/unwrapKey. - // Generate one key with typical parameters for each kind. - // - // Note: we don't need cryptographically strong parameters for things - // like IV - just any legal value will do. - var parameters = [ - { - name: "RSA-OAEP", - generateParameters: {name: "RSA-OAEP", modulusLength: 4096, publicExponent: new Uint8Array([1,0,1]), hash: "SHA-256"}, - wrapParameters: {name: "RSA-OAEP", label: new Uint8Array(8)} - }, - { - name: "AES-CTR", - generateParameters: {name: "AES-CTR", length: 128}, - wrapParameters: {name: "AES-CTR", counter: new Uint8Array(16), length: 64} - }, - { - name: "AES-CBC", - generateParameters: {name: "AES-CBC", length: 128}, - wrapParameters: {name: "AES-CBC", iv: new Uint8Array(16)} - }, - { - name: "AES-GCM", - generateParameters: {name: "AES-GCM", length: 128}, - wrapParameters: {name: "AES-GCM", iv: new Uint8Array(16), additionalData: new Uint8Array(16), tagLength: 128} - }, - { - name: "AES-KW", - generateParameters: {name: "AES-KW", length: 128}, - wrapParameters: {name: "AES-KW"} + function importWrappingKeys() { + // Using allSettled to skip unsupported test cases. + var promises = []; + wrappingKeysParameters.forEach(function(params) { + if (params.name === "RSA-OAEP") { // we have a key pair, not just a key + var algorithm = {name: "RSA-OAEP", hash: "SHA-256"}; + wrappers[params.name] = {wrappingKey: undefined, unwrappingKey: undefined, parameters: params}; + promises.push(subtle.importKey("spki", wrappingKeyData["RSA"].spki, algorithm, true, ["wrapKey"]) + .then(function(key) { + wrappers["RSA-OAEP"].wrappingKey = key; + })); + promises.push(subtle.importKey("pkcs8", wrappingKeyData["RSA"].pkcs8, algorithm, true, ["unwrapKey"]) + .then(function(key) { + wrappers["RSA-OAEP"].unwrappingKey = key; + })); + } else { + var algorithm = {name: params.name}; + promises.push(subtle.importKey("raw", wrappingKeyData["SYMMETRIC"].raw, algorithm, true, ["wrapKey", "unwrapKey"]) + .then(function(key) { + wrappers[params.name] = {wrappingKey: key, unwrappingKey: key, parameters: params}; + })); } - ]; - + }); // Using allSettled to skip unsupported test cases. - return Promise.allSettled(parameters.map(function(params) { - return subtle.generateKey(params.generateParameters, true, ["wrapKey", "unwrapKey"]) - .then(function(key) { - var wrapper; - if (params.name === "RSA-OAEP") { // we have a key pair, not just a key - wrapper = {wrappingKey: key.publicKey, unwrappingKey: key.privateKey, parameters: params}; - } else { - wrapper = {wrappingKey: key, unwrappingKey: key, parameters: params}; - } - wrappers.push(wrapper); - return true; - }) - })); + return Promise.allSettled(promises); } + async function importAndExport(format, keyData, algorithm, keyUsages, keyType) { + var importedKey; + try { + importedKey = await subtle.importKey(format, keyData, algorithm, true, keyUsages); + keys[algorithm.name][format] = { name: algorithm.name + " " + keyType, algorithm: algorithm, usages: keyUsages, key: importedKey, originalExport: {} }; + } catch (err) { + delete keys[algorithm.name][format]; + throw("Error importing " + algorithm.name + " " + keyType + " key in '" + format + "' -" + err.name + ': "' + err.message + '"'); + }; + try { + var exportedKey = await subtle.exportKey(format, importedKey); + keys[algorithm.name][format].originalExport[format] = exportedKey; + } catch (err) { + delete keys[algorithm.name][format]; + throw("Error exporting " + algorithm.name + " '" + format + "' key -" + err.name + ': "' + err.message + '"'); + }; + try { + var jwkExportedKey = await subtle.exportKey("jwk", importedKey); + keys[algorithm.name][format].originalExport["jwk"] = jwkExportedKey; + } catch (err) { + delete keys[algorithm.name][format]; + throw("Error exporting " + algorithm.name + " '" + format + "' key to 'jwk' -" + err.name + ': "' + err.message + '"'); + }; + } - function generateKeysToWrap() { - var parameters = [ - {algorithm: {name: "RSASSA-PKCS1-v1_5", modulusLength: 1024, publicExponent: new Uint8Array([1,0,1]), hash: "SHA-256"}, privateUsages: ["sign"], publicUsages: ["verify"]}, - {algorithm: {name: "RSA-PSS", modulusLength: 1024, publicExponent: new Uint8Array([1,0,1]), hash: "SHA-256"}, privateUsages: ["sign"], publicUsages: ["verify"]}, - {algorithm: {name: "RSA-OAEP", modulusLength: 1024, publicExponent: new Uint8Array([1,0,1]), hash: "SHA-256"}, privateUsages: ["decrypt"], publicUsages: ["encrypt"]}, - {algorithm: {name: "ECDSA", namedCurve: "P-256"}, privateUsages: ["sign"], publicUsages: ["verify"]}, - {algorithm: {name: "ECDH", namedCurve: "P-256"}, privateUsages: ["deriveBits"], publicUsages: []}, - {algorithm: {name: "Ed25519" }, privateUsages: ["sign"], publicUsages: ["verify"]}, - {algorithm: {name: "Ed448" }, privateUsages: ["sign"], publicUsages: ["verify"]}, - {algorithm: {name: "X25519" }, privateUsages: ["deriveBits"], publicUsages: []}, - {algorithm: {name: "X448" }, privateUsages: ["deriveBits"], publicUsages: []}, - {algorithm: {name: "AES-CTR", length: 128}, usages: ["encrypt", "decrypt"]}, - {algorithm: {name: "AES-CBC", length: 128}, usages: ["encrypt", "decrypt"]}, - {algorithm: {name: "AES-GCM", length: 128}, usages: ["encrypt", "decrypt"]}, - {algorithm: {name: "AES-KW", length: 128}, usages: ["wrapKey", "unwrapKey"]}, - {algorithm: {name: "HMAC", length: 128, hash: "SHA-256"}, usages: ["sign", "verify"]} - ]; - - // Using allSettled to skip unsupported test cases. - return Promise.allSettled(parameters.map(function(params) { - var usages; - if ("usages" in params) { - usages = params.usages; + function importKeysToWrap() { + var promises = []; + keysToWrapParameters.forEach(function(params) { + if ("publicUsages" in params) { + keys[params.algorithm.name] = {}; + var keyData = toWrapKeyDataFromAlg(params.algorithm.name); + promises.push(importAndExport("spki", keyData.spki, params.algorithm, params.publicUsages, "public key ")); + promises.push(importAndExport("pkcs8", keyData.pkcs8, params.algorithm, params.privateUsages, "private key ")); } else { - usages = params.publicUsages.concat(params.privateUsages); + keys[params.algorithm.name] = {}; + promises.push(importAndExport("raw", toWrapKeyData["SYMMETRIC"].raw, params.algorithm, params.usages, "")); } - - return subtle.generateKey(params.algorithm, true, usages) - .then(function(result) { - if (result.constructor === CryptoKey) { - keys.push({name: params.algorithm.name, algorithm: params.algorithm, usages: params.usages, key: result}); - } else { - keys.push({name: params.algorithm.name + " public key", algorithm: params.algorithm, usages: params.publicUsages, key: result.publicKey}); - keys.push({name: params.algorithm.name + " private key", algorithm: params.algorithm, usages: params.privateUsages, key: result.privateKey}); - } - return true; - }); - })); + }); + // Using allSettled to skip unsupported test cases. + return Promise.allSettled(promises); } // Can we successfully "round-trip" (wrap, then unwrap, a key)? - function testWrapping(wrapper, toWrap) { - var formats; + function testWrapping(wrapper, toWrap, fmt) { + promise_test(async() => { + try { + var wrappedResult = await subtle.wrapKey(fmt, toWrap.key, wrapper.wrappingKey, wrapper.parameters.wrapParameters); + var unwrappedResult = await subtle.unwrapKey(fmt, wrappedResult, wrapper.unwrappingKey, wrapper.parameters.wrapParameters, toWrap.algorithm, true, toWrap.usages); + assert_goodCryptoKey(unwrappedResult, toWrap.algorithm, true, toWrap.usages, toWrap.key.type); + var roundTripExport = await subtle.exportKey(fmt, unwrappedResult); + assert_true(equalExport(toWrap.originalExport[fmt], roundTripExport), "Post-wrap export matches original export"); + } catch (err) { + if (err instanceof AssertionError) { + throw err; + } + assert_unreached("Round trip for extractable key threw an error - " + err.name + ': "' + err.message + '"'); + } + }, "Can wrap and unwrap " + toWrap.name + "keys using " + fmt + " and " + wrapper.parameters.name); + } - if (toWrap.name.includes("private")) { - formats = ["pkcs8", "jwk"]; - } else if (toWrap.name.includes("public")) { - formats = ["spki", "jwk"] - } else { - formats = ["raw", "jwk"] - } + function testWrappingNonExtractable(wrapper, toWrap, fmt) { + promise_test(async() => { + try { + var wrappedResult = await subtle.wrapKey(fmt, toWrap.key, wrapper.wrappingKey, wrapper.parameters.wrapParameters); + var unwrappedResult = await subtle.unwrapKey(fmt, wrappedResult, wrapper.unwrappingKey, wrapper.parameters.wrapParameters, toWrap.algorithm, false, toWrap.usages); + assert_goodCryptoKey(unwrappedResult, toWrap.algorithm, false, toWrap.usages, toWrap.key.type); + var result = await equalKeys(toWrap.key, unwrappedResult); + assert_true(result, "Unwrapped key matches original"); + } catch (err) { + if (err instanceof AssertionError) { + throw err; + } + assert_unreached("Round trip for key unwrapped non-extractable threw an error - " + err.name + ': "' + err.message + '"'); + }; + }, "Can wrap and unwrap " + toWrap.name + "keys as non-extractable using " + fmt + " and " + wrapper.parameters.name); + } - return Promise.all(formats.map(function(fmt) { - var originalExport; - return subtle.exportKey(fmt, toWrap.key).then(function(exportedKey) { - originalExport = exportedKey; - const isPossible = wrappingIsPossible(originalExport, wrapper.parameters.name); - promise_test(function(test) { - if (!isPossible) { - return Promise.resolve().then(() => { - assert_false(false, "Wrapping is not possible"); - }) - } - return subtle.wrapKey(fmt, toWrap.key, wrapper.wrappingKey, wrapper.parameters.wrapParameters) - .then(function(wrappedResult) { - return subtle.unwrapKey(fmt, wrappedResult, wrapper.unwrappingKey, wrapper.parameters.wrapParameters, toWrap.algorithm, true, toWrap.usages); - }).then(function(unwrappedResult) { - assert_goodCryptoKey(unwrappedResult, toWrap.algorithm, true, toWrap.usages, toWrap.key.type); - return subtle.exportKey(fmt, unwrappedResult) - }).then(function(roundTripExport) { - assert_true(equalExport(originalExport, roundTripExport), "Post-wrap export matches original export"); - }, function(err) { - assert_unreached("Round trip for extractable key threw an error - " + err.name + ': "' + err.message + '"'); - }); - }, "Can wrap and unwrap " + toWrap.name + " keys using " + fmt + " and " + wrapper.parameters.name); - - if (canCompareNonExtractableKeys(toWrap.key)) { - promise_test(function(test){ - if (!isPossible) { - return Promise.resolve().then(() => { - assert_false(false, "Wrapping is not possible"); - }) - } - return subtle.wrapKey(fmt, toWrap.key, wrapper.wrappingKey, wrapper.parameters.wrapParameters) - .then(function(wrappedResult) { - return subtle.unwrapKey(fmt, wrappedResult, wrapper.unwrappingKey, wrapper.parameters.wrapParameters, toWrap.algorithm, false, toWrap.usages); - }).then(function(unwrappedResult){ - assert_goodCryptoKey(unwrappedResult, toWrap.algorithm, false, toWrap.usages, toWrap.key.type); - return equalKeys(toWrap.key, unwrappedResult); - }).then(function(result){ - assert_true(result, "Unwrapped key matches original"); - }).catch(function(err){ - assert_unreached("Round trip for key unwrapped non-extractable threw an error - " + err.name + ': "' + err.message + '"'); - }); - }, "Can wrap and unwrap " + toWrap.name + " keys as non-extractable using " + fmt + " and " + wrapper.parameters.name); - - if (fmt === "jwk") { - promise_test(function(test){ - if (!isPossible) { - return Promise.resolve().then(() => { - assert_false(false, "Wrapping is not possible"); - }) - } - var wrappedKey; - return wrapAsNonExtractableJwk(toWrap.key,wrapper).then(function(wrappedResult){ - wrappedKey = wrappedResult; - return subtle.unwrapKey("jwk", wrappedKey, wrapper.unwrappingKey, wrapper.parameters.wrapParameters, toWrap.algorithm, false, toWrap.usages); - }).then(function(unwrappedResult){ - assert_false(unwrappedResult.extractable, "Unwrapped key is non-extractable"); - return equalKeys(toWrap.key,unwrappedResult); - }).then(function(result){ - assert_true(result, "Unwrapped key matches original"); - }).catch(function(err){ - assert_unreached("Round trip for non-extractable key threw an error - " + err.name + ': "' + err.message + '"'); - }).then(function(){ - return subtle.unwrapKey("jwk", wrappedKey, wrapper.unwrappingKey, wrapper.parameters.wrapParameters, toWrap.algorithm, true, toWrap.usages); - }).then(function(unwrappedResult){ - assert_unreached("Unwrapping a non-extractable JWK as extractable should fail"); - }).catch(function(err){ - assert_equals(err.name, "DataError", "Unwrapping a non-extractable JWK as extractable fails with DataError"); - }); - }, "Can unwrap " + toWrap.name + " non-extractable keys using jwk and " + wrapper.parameters.name); - } + function testWrappingNonExtractableAsExtractable(wrapper, toWrap) { + promise_test(async() => { + var wrappedKey; + try { + var wrappedResult = await wrapAsNonExtractableJwk(toWrap.key,wrapper); + wrappedKey = wrappedResult; + var unwrappedResult = await subtle.unwrapKey("jwk", wrappedKey, wrapper.unwrappingKey, wrapper.parameters.wrapParameters, toWrap.algorithm, false, toWrap.usages); + assert_false(unwrappedResult.extractable, "Unwrapped key is non-extractable"); + var result = await equalKeys(toWrap.key,unwrappedResult); + assert_true(result, "Unwrapped key matches original"); + } catch (err) { + if (err instanceof AssertionError) { + throw err; } - }); - })); + assert_unreached("Round trip for non-extractable key threw an error - " + err.name + ': "' + err.message + '"'); + }; + try { + var unwrappedResult = await subtle.unwrapKey("jwk", wrappedKey, wrapper.unwrappingKey, wrapper.parameters.wrapParameters, toWrap.algorithm, true, toWrap.usages); + assert_unreached("Unwrapping a non-extractable JWK as extractable should fail"); + } catch (err) { + if (err instanceof AssertionError) { + throw err; + } + assert_equals(err.name, "DataError", "Unwrapping a non-extractable JWK as extractable fails with DataError"); + } + }, "Can unwrap " + toWrap.name + "non-extractable keys using jwk and " + wrapper.parameters.name); } // Implement key wrapping by hand to wrap a key as non-extractable JWK - function wrapAsNonExtractableJwk(key, wrapper){ + async function wrapAsNonExtractableJwk(key, wrapper) { var wrappingKey = wrapper.wrappingKey, encryptKey; - return subtle.exportKey("jwk",wrappingKey) - .then(function(jwkWrappingKey){ - // Update the key generation parameters to work as key import parameters - var params = Object.create(wrapper.parameters.generateParameters); - if(params.name === "AES-KW") { - params.name = "AES-CBC"; - jwkWrappingKey.alg = "A"+params.length+"CBC"; - } else if (params.name === "RSA-OAEP") { - params.modulusLength = undefined; - params.publicExponent = undefined; - } - jwkWrappingKey.key_ops = ["encrypt"]; - return subtle.importKey("jwk", jwkWrappingKey, params, true, ["encrypt"]); - }).then(function(importedWrappingKey){ - encryptKey = importedWrappingKey; - return subtle.exportKey("jwk",key); - }).then(function(exportedKey){ - exportedKey.ext = false; - var jwk = JSON.stringify(exportedKey) - if (wrappingKey.algorithm.name === "AES-KW") { - return aeskw(encryptKey, str2ab(jwk.slice(0,-1) + " ".repeat(jwk.length%8 ? 8-jwk.length%8 : 0) + "}")); - } else { - return subtle.encrypt(wrapper.parameters.wrapParameters,encryptKey,str2ab(jwk)); - } - }); + var jwkWrappingKey = await subtle.exportKey("jwk",wrappingKey); + // Update the key generation parameters to work as key import parameters + var params = Object.create(wrapper.parameters.importParameters); + if(params.name === "AES-KW") { + params.name = "AES-CBC"; + jwkWrappingKey.alg = "A"+params.length+"CBC"; + } else if (params.name === "RSA-OAEP") { + params.modulusLength = undefined; + params.publicExponent = undefined; + } + jwkWrappingKey.key_ops = ["encrypt"]; + var importedWrappingKey = await subtle.importKey("jwk", jwkWrappingKey, params, true, ["encrypt"]); + encryptKey = importedWrappingKey; + var exportedKey = await subtle.exportKey("jwk",key); + exportedKey.ext = false; + var jwk = JSON.stringify(exportedKey) + var result; + if (wrappingKey.algorithm.name === "AES-KW") { + result = await aeskw(encryptKey, str2ab(jwk.slice(0,-1) + " ".repeat(jwk.length%8 ? 8-jwk.length%8 : 0) + "}")); + } else { + result = await subtle.encrypt(wrapper.parameters.wrapParameters,encryptKey,str2ab(jwk)); + } + return result; } @@ -365,9 +383,9 @@ } // Compare two keys by using them (works for non-extractable keys) - function equalKeys(expected, got){ + async function equalKeys(expected, got){ if ( expected.algorithm.name !== got.algorithm.name ) { - return Promise.resolve(false); + return false; } var cryptParams, signParams, wrapParams, deriveParams; @@ -419,75 +437,60 @@ } if (cryptParams) { - return subtle.exportKey("jwk",expected) - .then(function(jwkExpectedKey){ - if (expected.algorithm.name === "RSA-OAEP") { - ["d","p","q","dp","dq","qi","oth"].forEach(function(field){ delete jwkExpectedKey[field]; }); - } - jwkExpectedKey.key_ops = ["encrypt"]; - return subtle.importKey("jwk", jwkExpectedKey, expected.algorithm, true, ["encrypt"]); - }).then(function(expectedEncryptKey){ - return subtle.encrypt(cryptParams, expectedEncryptKey, new Uint8Array(32)); - }).then(function(encryptedData){ - return subtle.decrypt(cryptParams, got, encryptedData); - }).then(function(decryptedData){ - var result = new Uint8Array(decryptedData); - return !result.some(x => x); - }); + var jwkExpectedKey = await subtle.exportKey("jwk", expected); + if (expected.algorithm.name === "RSA-OAEP") { + ["d","p","q","dp","dq","qi","oth"].forEach(function(field){ delete jwkExpectedKey[field]; }); + } + jwkExpectedKey.key_ops = ["encrypt"]; + var expectedEncryptKey = await subtle.importKey("jwk", jwkExpectedKey, expected.algorithm, true, ["encrypt"]); + var encryptedData = await subtle.encrypt(cryptParams, expectedEncryptKey, new Uint8Array(32)); + var decryptedData = await subtle.decrypt(cryptParams, got, encryptedData); + var result = new Uint8Array(decryptedData); + return !result.some(x => x); } else if (signParams) { var verifyKey; - return subtle.exportKey("jwk",expected) - .then(function(jwkExpectedKey){ - if (expected.algorithm.name === "RSA-PSS" || expected.algorithm.name === "RSASSA-PKCS1-v1_5") { - ["d","p","q","dp","dq","qi","oth"].forEach(function(field){ delete jwkExpectedKey[field]; }); - } - if (expected.algorithm.name === "ECDSA" || expected.algorithm.name.startsWith("Ed")) { - delete jwkExpectedKey["d"]; - } - jwkExpectedKey.key_ops = ["verify"]; - return subtle.importKey("jwk", jwkExpectedKey, expected.algorithm, true, ["verify"]); - }).then(function(expectedVerifyKey){ - verifyKey = expectedVerifyKey; - return subtle.sign(signParams, got, new Uint8Array(32)); - }).then(function(signature){ - return subtle.verify(signParams, verifyKey, signature, new Uint8Array(32)); - }); + var jwkExpectedKey = await subtle.exportKey("jwk",expected); + if (expected.algorithm.name === "RSA-PSS" || expected.algorithm.name === "RSASSA-PKCS1-v1_5") { + ["d","p","q","dp","dq","qi","oth"].forEach(function(field){ delete jwkExpectedKey[field]; }); + } + if (expected.algorithm.name === "ECDSA" || expected.algorithm.name.startsWith("Ed")) { + delete jwkExpectedKey["d"]; + } + jwkExpectedKey.key_ops = ["verify"]; + var expectedVerifyKey = await subtle.importKey("jwk", jwkExpectedKey, expected.algorithm, true, ["verify"]); + verifyKey = expectedVerifyKey; + var signature = await subtle.sign(signParams, got, new Uint8Array(32)); + var result = await subtle.verify(signParams, verifyKey, signature, new Uint8Array(32)); + return result; } else if (wrapParams) { var aKeyToWrap, wrappedWithExpected; - return subtle.importKey("raw", new Uint8Array(16), "AES-CBC", true, ["encrypt"]) - .then(function(key){ - aKeyToWrap = key; - return subtle.wrapKey("raw", aKeyToWrap, expected, wrapParams); - }).then(function(wrapResult){ - wrappedWithExpected = Array.from((new Uint8Array(wrapResult)).values()); - return subtle.wrapKey("raw", aKeyToWrap, got, wrapParams); - }).then(function(wrapResult){ - var wrappedWithGot = Array.from((new Uint8Array(wrapResult)).values()); - return wrappedWithGot.every((x,i) => x === wrappedWithExpected[i]); - }); + var key = await subtle.importKey("raw",new Uint8Array(16), "AES-CBC", true, ["encrypt"]) + aKeyToWrap = key; + var wrapResult = await subtle.wrapKey("raw", aKeyToWrap, expected, wrapParams); + wrappedWithExpected = Array.from((new Uint8Array(wrapResult)).values()); + wrapResult = await subtle.wrapKey("raw", aKeyToWrap, got, wrapParams); + var wrappedWithGot = Array.from((new Uint8Array(wrapResult)).values()); + return wrappedWithGot.every((x,i) => x === wrappedWithExpected[i]); } else if (deriveParams) { var expectedDerivedBits; - return subtle.generateKey(expected.algorithm, true, ['deriveBits']).then(({ publicKey }) => { - deriveParams.public = publicKey; - return subtle.deriveBits(deriveParams, expected, 128) - }) - .then(function(result){ - expectedDerivedBits = Array.from((new Uint8Array(result)).values()); - return subtle.deriveBits(deriveParams, got, 128); - }).then(function(result){ - var gotDerivedBits = Array.from((new Uint8Array(result)).values()); - return gotDerivedBits.every((x,i) => x === expectedDerivedBits[i]); - }); + var key = await subtle.generateKey(expected.algorithm, true, ['deriveBits']); + deriveParams.public = key.publicKey; + var result = await subtle.deriveBits(deriveParams, expected, 128); + expectedDerivedBits = Array.from((new Uint8Array(result)).values()); + result = await subtle.deriveBits(deriveParams, got, 128); + var gotDerivedBits = Array.from((new Uint8Array(result)).values()); + return gotDerivedBits.every((x,i) => x === expectedDerivedBits[i]); } } // Raw AES encryption - function aes( k, p ) { - return subtle.encrypt({name: "AES-CBC", iv: new Uint8Array(16) }, k, p).then(function(ciphertext){return ciphertext.slice(0,16);}); + async function aes(k, p) { + const ciphertext = await subtle.encrypt({ name: "AES-CBC", iv: new Uint8Array(16) }, k, p); + return ciphertext.slice(0, 16); } // AES Key Wrap - function aeskw(key, data) { + async function aeskw(key, data) { if (data.byteLength % 8 !== 0) { throw new Error("AES Key Wrap data must be a multiple of 8 bytes in length"); } @@ -501,7 +504,7 @@ R.push(new Uint8Array(data.slice(i,i+8))); } - function aeskw_step(j, i, final, B) { + async function aeskw_step(j, i, final, B) { A.set(new Uint8Array(B.slice(0,8))); Av.setUint32(4,Av.getUint32(4) ^ (n*j+i+1)); R[i] = new Uint8Array(B.slice(8,16)); @@ -516,18 +519,16 @@ } } - var p = new Promise(function(resolve){ - A.set(R[0],8); - resolve(aes(key,A)); - }); + A.set(R[0], 8); + let B = await aes(key, A); for(var j=0;j<6;++j) { for(var i=0;i { start(c) { controller = c; }, - async pull() { + pull() { byobRequestDefined.push(controller.byobRequest !== null); const initialByobRequest = controller.byobRequest; - const transferredView = await transferArrayBufferView(controller.byobRequest.view); + const transferredView = transferArrayBufferView(controller.byobRequest.view); transferredView[0] = 0x01; controller.byobRequest.respondWithNewView(transferredView); @@ -2288,7 +2288,7 @@ promise_test(async t => { await pullCalledPromise; // Transfer the original BYOB request's buffer, and respond with a new view on that buffer - const transferredView = await transferArrayBufferView(controller.byobRequest.view); + const transferredView = transferArrayBufferView(controller.byobRequest.view); const newView = transferredView.subarray(0, 1); newView[0] = 42; @@ -2328,7 +2328,7 @@ promise_test(async t => { await pullCalledPromise; // Transfer the original BYOB request's buffer, and respond with an empty view on that buffer - const transferredView = await transferArrayBufferView(controller.byobRequest.view); + const transferredView = transferArrayBufferView(controller.byobRequest.view); const newView = transferredView.subarray(0, 0); controller.close(); diff --git a/test/fixtures/wpt/streams/readable-byte-streams/patched-global.any.js b/test/fixtures/wpt/streams/readable-byte-streams/patched-global.any.js new file mode 100644 index 00000000000000..ce2e9e9993ae57 --- /dev/null +++ b/test/fixtures/wpt/streams/readable-byte-streams/patched-global.any.js @@ -0,0 +1,54 @@ +// META: global=window,worker,shadowrealm +// META: script=../resources/test-utils.js +'use strict'; + +// Tests which patch the global environment are kept separate to avoid +// interfering with other tests. + +promise_test(async (t) => { + let controller; + const rs = new ReadableStream({ + type: 'bytes', + start(c) { + controller = c; + } + }); + const reader = rs.getReader({mode: 'byob'}); + + const length = 0x4000; + const buffer = new ArrayBuffer(length); + const bigArray = new BigUint64Array(buffer, length - 8, 1); + + const read1 = reader.read(new Uint8Array(new ArrayBuffer(0x100))); + const read2 = reader.read(bigArray); + + let flag = false; + Object.defineProperty(Object.prototype, 'then', { + get: t.step_func(() => { + if (!flag) { + flag = true; + assert_equals(controller.byobRequest, null, 'byobRequest should be null after filling both views'); + } + }), + configurable: true + }); + t.add_cleanup(() => { + delete Object.prototype.then; + }); + + controller.enqueue(new Uint8Array(0x110).fill(0x42)); + assert_true(flag, 'patched then() should be called'); + + // The first read() is filled entirely with 0x100 bytes + const result1 = await read1; + assert_false(result1.done, 'result1.done'); + assert_typed_array_equals(result1.value, new Uint8Array(0x100).fill(0x42), 'result1.value'); + + // The second read() is filled with the remaining 0x10 bytes + const result2 = await read2; + assert_false(result2.done, 'result2.done'); + assert_equals(result2.value.constructor, BigUint64Array, 'result2.value constructor'); + assert_equals(result2.value.byteOffset, length - 8, 'result2.value byteOffset'); + assert_equals(result2.value.length, 1, 'result2.value length'); + assert_array_equals([...result2.value], [0x42424242_42424242n], 'result2.value contents'); +}, 'Patched then() sees byobRequest after filling all pending pull-into descriptors'); diff --git a/test/fixtures/wpt/streams/readable-byte-streams/tee.any.js b/test/fixtures/wpt/streams/readable-byte-streams/tee.any.js index 7dd5ba3f3fb013..60d82b9cf6a1fd 100644 --- a/test/fixtures/wpt/streams/readable-byte-streams/tee.any.js +++ b/test/fixtures/wpt/streams/readable-byte-streams/tee.any.js @@ -934,3 +934,36 @@ promise_test(async () => { assert_typed_array_equals(result4.value, new Uint8Array([0]).subarray(0, 0), 'second chunk from branch2 should be correct'); }, 'ReadableStream teeing with byte source: respond() and close() while both branches are pulling'); + +promise_test(async t => { + let pullCount = 0; + const arrayBuffer = new Uint8Array([0x01, 0x02, 0x03]).buffer; + const enqueuedChunk = new Uint8Array(arrayBuffer, 2); + assert_equals(enqueuedChunk.length, 1); + assert_equals(enqueuedChunk.byteOffset, 2); + const rs = new ReadableStream({ + type: 'bytes', + pull(c) { + ++pullCount; + if (pullCount === 1) { + c.enqueue(enqueuedChunk); + } + } + }); + + const [branch1, branch2] = rs.tee(); + const reader1 = branch1.getReader(); + const reader2 = branch2.getReader(); + + const [result1, result2] = await Promise.all([reader1.read(), reader2.read()]); + assert_equals(result1.done, false, 'reader1 done'); + assert_equals(result2.done, false, 'reader2 done'); + + const view1 = result1.value; + const view2 = result2.value; + // The first stream has the transferred buffer, but the second stream has the + // cloned buffer. + const underlying = new Uint8Array([0x01, 0x02, 0x03]).buffer; + assert_typed_array_equals(view1, new Uint8Array(underlying, 2), 'reader1 value'); + assert_typed_array_equals(view2, new Uint8Array([0x03]), 'reader2 value'); +}, 'ReadableStream teeing with byte source: reading an array with a byte offset should clone correctly'); diff --git a/test/fixtures/wpt/streams/readable-streams/crashtests/from-cross-realm.https.html b/test/fixtures/wpt/streams/readable-streams/crashtests/from-cross-realm.https.html new file mode 100644 index 00000000000000..58a4371186ece7 --- /dev/null +++ b/test/fixtures/wpt/streams/readable-streams/crashtests/from-cross-realm.https.html @@ -0,0 +1,18 @@ + + + diff --git a/test/fixtures/wpt/streams/readable-streams/owning-type-video-frame.any.js b/test/fixtures/wpt/streams/readable-streams/owning-type-video-frame.any.js index b652f9c5fcb4b6..ec01fda0b3c737 100644 --- a/test/fixtures/wpt/streams/readable-streams/owning-type-video-frame.any.js +++ b/test/fixtures/wpt/streams/readable-streams/owning-type-video-frame.any.js @@ -1,4 +1,4 @@ -// META: global=window,worker,shadowrealm +// META: global=window,worker // META: script=../resources/test-utils.js // META: script=../resources/rs-utils.js 'use strict'; diff --git a/test/fixtures/wpt/streams/resources/rs-utils.js b/test/fixtures/wpt/streams/resources/rs-utils.js index f1a014275a2fbc..0f7742a5b3b190 100644 --- a/test/fixtures/wpt/streams/resources/rs-utils.js +++ b/test/fixtures/wpt/streams/resources/rs-utils.js @@ -1,5 +1,42 @@ 'use strict'; (function () { + // Fake setInterval-like functionality in environments that don't have it + class IntervalHandle { + constructor(callback, delayMs) { + this.callback = callback; + this.delayMs = delayMs; + this.cancelled = false; + Promise.resolve().then(() => this.check()); + } + + async check() { + while (true) { + await new Promise(resolve => step_timeout(resolve, this.delayMs)); + if (this.cancelled) { + return; + } + this.callback(); + } + } + + cancel() { + this.cancelled = true; + } + } + + let localSetInterval, localClearInterval; + if (typeof globalThis.setInterval !== "undefined" && + typeof globalThis.clearInterval !== "undefined") { + localSetInterval = globalThis.setInterval; + localClearInterval = globalThis.clearInterval; + } else { + localSetInterval = function setInterval(callback, delayMs) { + return new IntervalHandle(callback, delayMs); + } + localClearInterval = function clearInterval(handle) { + handle.cancel(); + } + } class RandomPushSource { constructor(toPush) { @@ -18,12 +55,12 @@ } if (!this.started) { - this._intervalHandle = setInterval(writeChunk, 2); + this._intervalHandle = localSetInterval(writeChunk, 2); this.started = true; } if (this.paused) { - this._intervalHandle = setInterval(writeChunk, 2); + this._intervalHandle = localSetInterval(writeChunk, 2); this.paused = false; } @@ -37,7 +74,7 @@ if (source.toPush > 0 && source.pushed > source.toPush) { if (source._intervalHandle) { - clearInterval(source._intervalHandle); + localClearInterval(source._intervalHandle); source._intervalHandle = undefined; } source.closed = true; @@ -55,7 +92,7 @@ if (this.started) { this.paused = true; - clearInterval(this._intervalHandle); + localClearInterval(this._intervalHandle); this._intervalHandle = undefined; } else { throw new Error('Can\'t pause reading an unstarted source.'); @@ -178,15 +215,7 @@ } function transferArrayBufferView(view) { - const noopByteStream = new ReadableStream({ - type: 'bytes', - pull(c) { - c.byobRequest.respond(c.byobRequest.view.byteLength); - c.close(); - } - }); - const reader = noopByteStream.getReader({ mode: 'byob' }); - return reader.read(view).then((result) => result.value); + return structuredClone(view, { transfer: [view.buffer] }); } self.RandomPushSource = RandomPushSource; diff --git a/test/fixtures/wpt/streams/transferable/transfer-with-messageport.window.js b/test/fixtures/wpt/streams/transferable/transfer-with-messageport.window.js index 37f8c9df169607..3bfe634a6e153d 100644 --- a/test/fixtures/wpt/streams/transferable/transfer-with-messageport.window.js +++ b/test/fixtures/wpt/streams/transferable/transfer-with-messageport.window.js @@ -105,7 +105,7 @@ async function transferMessagePortWith(constructor) { await transferMessagePortWithOrder3(new constructor()); } -async function advancedTransferMesagePortWith(constructor) { +async function advancedTransferMessagePortWith(constructor) { await transferMessagePortWithOrder4(new constructor()); await transferMessagePortWithOrder5(new constructor()); await transferMessagePortWithOrder6(new constructor()); @@ -166,7 +166,7 @@ async function mixedTransferMessagePortWithOrder3() { ); } -async function mixedTransferMesagePortWith() { +async function mixedTransferMessagePortWith() { await mixedTransferMessagePortWithOrder1(); await mixedTransferMessagePortWithOrder2(); await mixedTransferMessagePortWithOrder3(); @@ -185,19 +185,19 @@ promise_test(async t => { }, "Transferring a MessagePort with a TransformStream should set `.ports`"); promise_test(async t => { - await transferMessagePortWith(ReadableStream); + await advancedTransferMessagePortWith(ReadableStream); }, "Transferring a MessagePort with a ReadableStream should set `.ports`, advanced"); promise_test(async t => { - await transferMessagePortWith(WritableStream); + await advancedTransferMessagePortWith(WritableStream); }, "Transferring a MessagePort with a WritableStream should set `.ports`, advanced"); promise_test(async t => { - await transferMessagePortWith(TransformStream); + await advancedTransferMessagePortWith(TransformStream); }, "Transferring a MessagePort with a TransformStream should set `.ports`, advanced"); promise_test(async t => { - await mixedTransferMesagePortWith(); + await mixedTransferMessagePortWith(); }, "Transferring a MessagePort with multiple streams should set `.ports`"); test(() => { diff --git a/test/fixtures/wpt/url/META.yml b/test/fixtures/wpt/url/META.yml index 094b266b64b61b..415bd0f094c6b9 100644 --- a/test/fixtures/wpt/url/META.yml +++ b/test/fixtures/wpt/url/META.yml @@ -3,5 +3,4 @@ suggested_reviewers: - mikewest - domenic - annevk - - GPHemsley - TimothyGu diff --git a/test/fixtures/wpt/url/README.md b/test/fixtures/wpt/url/README.md index fa5e3b0dc72385..50227bc4b330ef 100644 --- a/test/fixtures/wpt/url/README.md +++ b/test/fixtures/wpt/url/README.md @@ -1,11 +1,13 @@ -## urltestdata.json +## urltestdata.json / urltestdata-javascript-only.json -`resources/urltestdata.json` contains URL parsing tests suitable for any URL parser implementation. +[`resources/urltestdata.json`](resources/urltestdata.json) contains URL parsing tests suitable for any URL parser implementation. +[`resources/urltestdata-javascript-only.json`](resources/urltestdata-javascript-only.json) contains URL parsing tests specifically meant +for JavaScript's `URL()` class as well as other languages accepting non-scalar-value strings. -It's used as a source of tests by `a-element.html`, `failure.html`, `url-constructor.any.js`, and -other test files in this directory. +These files are used as a source of tests by `a-element.html`, `failure.html`, `url-constructor.any.js`, +and other test files in this directory. -The format of `resources/urltestdata.json` is a JSON array of comments as strings and test cases as +Both files share the same format. They consist of a JSON array of comments as strings and test cases as objects. The keys for each test case are: * `input`: a string to be parsed as URL. diff --git a/test/fixtures/wpt/url/a-element-origin-xhtml.xhtml b/test/fixtures/wpt/url/a-element-origin-xhtml.xhtml index effcf04bee3fb0..e68e68dda2ad6c 100644 --- a/test/fixtures/wpt/url/a-element-origin-xhtml.xhtml +++ b/test/fixtures/wpt/url/a-element-origin-xhtml.xhtml @@ -12,4 +12,8 @@ - + diff --git a/test/fixtures/wpt/url/a-element-origin.html b/test/fixtures/wpt/url/a-element-origin.html index 9cc8e94cbed060..7015f853f01a1d 100644 --- a/test/fixtures/wpt/url/a-element-origin.html +++ b/test/fixtures/wpt/url/a-element-origin.html @@ -5,4 +5,8 @@
    - + diff --git a/test/fixtures/wpt/url/a-element-xhtml.xhtml b/test/fixtures/wpt/url/a-element-xhtml.xhtml index 05bec4ce4b2f1e..610481a7819d62 100644 --- a/test/fixtures/wpt/url/a-element-xhtml.xhtml +++ b/test/fixtures/wpt/url/a-element-xhtml.xhtml @@ -17,4 +17,8 @@ - + diff --git a/test/fixtures/wpt/url/a-element.html b/test/fixtures/wpt/url/a-element.html index 3428fa00574c4d..a7621d2ded76c4 100644 --- a/test/fixtures/wpt/url/a-element.html +++ b/test/fixtures/wpt/url/a-element.html @@ -10,7 +10,11 @@
    - + Link with embedded \n is parsed correctly diff --git a/test/fixtures/wpt/url/failure.html b/test/fixtures/wpt/url/failure.html index e61f462f97456f..d95b1d52d67237 100644 --- a/test/fixtures/wpt/url/failure.html +++ b/test/fixtures/wpt/url/failure.html @@ -6,7 +6,10 @@